commit 608e361e57ed7ac9430c089798bcbc4c93a1a319 Author: AnonymousRandomPerson Date: Wed Jun 28 23:35:19 2023 -0400 Initialized base repo diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..006bc2fc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +end_of_line = lf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..9a558ac7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +charmap.txt text eol=crlf + +*.sh text eol=lf +*.s text eol=lf +Makefile text eol=lf +*.mk text eol=lf +*.c text eol=lf +*.h text eol=lf +*.inc text eol=lf +*.sha1 text eol=lf +*.json text eol=lf +*.cpp text eol=lf +*.hpp text eol=lf +.gitattributes text eol=lf +.gitignore text eol=lf +*.md text eol=lf +*.lsf text eol=lf +*.yml text eol=lf + +*.bin binary + +*.h linguist-language=C +*.inc linguist-language=Assembly diff --git a/.github/calcrom/.gitattributes b/.github/calcrom/.gitattributes new file mode 100644 index 00000000..70f1c267 --- /dev/null +++ b/.github/calcrom/.gitattributes @@ -0,0 +1 @@ +webhook.sh text eol=lf diff --git a/.github/calcrom/.gitignore b/.github/calcrom/.gitignore new file mode 100644 index 00000000..e4016dbe --- /dev/null +++ b/.github/calcrom/.gitignore @@ -0,0 +1,2 @@ +calcrom +*.exe diff --git a/.github/calcrom/BuildAnalyzer.cpp b/.github/calcrom/BuildAnalyzer.cpp new file mode 100644 index 00000000..b9344eb0 --- /dev/null +++ b/.github/calcrom/BuildAnalyzer.cpp @@ -0,0 +1,155 @@ +#include +#include +#include +#include "BuildAnalyzer.h" +#include "Glob.h" + +string default_version; + +void BuildAnalyzer::AnalyzeObject(path fname_s) { + string ext = fname_s.extension(); + SourceType sourceType = ext == ".s" ? SOURCE_ASM : SOURCE_C; + fname_s = builddir / relative(fname_s, srcbase); + fname_s = fname_s.replace_extension(".o"); + if (!exists(fname_s)) { + throw runtime_error("No such file: " + fname_s.string()); + } + + Elf32File elf(fname_s); + + path fname_b = fname_s.filename(); + + // Analyze sections + for (Elf32_Shdr & hdr : elf.GetSectionHeaders()) { + string shname = elf.GetSectionName(hdr); + SectionType sectionType = GetSectionType(shname); + if (sectionType != SECTION_OTHER) { + sizes[sectionType][sourceType] += (hdr.sh_size + 3) & ~3; + auto data = elf.ReadSectionData(hdr); + for (const auto & word : data) { + if (word == 0) { + continue; // might be a relocation + } + if (find_if(program.GetProgramHeaders().cbegin(), program.GetProgramHeaders().cend(), [&word](const auto & phdr) { + return phdr.p_vaddr <= word && word < phdr.p_vaddr + phdr.p_memsz; + }) != program.GetProgramHeaders().cend()) { +#ifndef NDEBUG + try { + unsigned addr = (&word - &*data.cbegin()) * 4 + xmap.at({fname_b.string(), shname}); + fprintf(stderr, "%s\t%08X\t%08X\n", fname_b.c_str(), addr, word); + } catch (const out_of_range &e) { + fprintf(stderr, "Error: missing xmap reference to %s:%s\n", fname_b.c_str(), shname.c_str()); + throw e; + } +#endif + n_hardcoded++; + } + } + } else if (hdr.sh_type == SHT_RELA) { + n_relocations += elf.GetSectionElementCount(hdr); + } else if (hdr.sh_type == SHT_REL) { + n_relocations += elf.GetSectionElementCount(hdr); + } + } +} + +void BuildAnalyzer::reset() { + memset(sizes, 0, sizeof(sizes)); + if (!version.empty()) { + sizes[SECTION_TEXT][SOURCE_ASM] = 0x800; // libsyscall.a + } + n_hardcoded = 0; + n_relocations = 0; +} + +void BuildAnalyzer::LoadProgramElf() { + string elfpat = builddir + "/*.elf"; + Glob globber(elfpat, GLOB_TILDE | GLOB_BRACE | GLOB_NOSORT); + if (globber.empty()) { + throw runtime_error("unable to find an ELF file with section data"); + } + program.open(globber[0], Elf32File::sections | Elf32File::programs); +} + +#ifndef NDEBUG +void BuildAnalyzer::LoadProgramXmap() { + string xmappat = builddir + "/*.xMAP"; + Glob globber(xmappat, GLOB_TILDE | GLOB_BRACE | GLOB_NOSORT); + if (globber.empty()) { + throw runtime_error("unable to find an xMAP file with object load info"); + } + xmap.open(globber[0]); +} +#endif + +BuildAnalyzer::BuildAnalyzer(path &_basedir, path &_subdir, string &_version) : + basedir(_basedir), + subdir(_subdir), + version(_version) +{ + reset(); + srcbase = basedir / subdir; + builddir = srcbase / "build" / version; + if (!exists(srcbase)) { + throw runtime_error("No such directory: " + srcbase.string()); + } + + LoadProgramElf(); +#ifndef NDEBUG + LoadProgramXmap(); +#endif +} + +BuildAnalyzer &BuildAnalyzer::operator()() { + if (analyzed) { + reset(); + } + string pattern = srcbase.string() + "/{src,asm,lib/{src,asm},lib/{NitroSDK,NitroDWC}/{src,asm}}/{,*/,*/*/}*.{c,s,cpp}"; + for (char const * & fname : Glob(pattern, GLOB_TILDE | GLOB_BRACE | GLOB_NOSORT)) { + AnalyzeObject(fname); + } + analyzed = true; + return *this; +} + +ostream &operator<<(ostream &strm, BuildAnalyzer &_this) { + if (!_this.analyzed) { + strm << "Haven't analyzed this ROM, please call the BuildAnalyzer instance" << endl; + return strm; + } + + strm << "Analysis of " << (_this.version.empty() ? _this.subdir.string() : _this.version) << " binary:" << endl; + // Report code + unsigned total_text = _this.sizes[SECTION_TEXT][SOURCE_C] + _this.sizes[SECTION_TEXT][SOURCE_ASM]; + if (total_text != 0) { + double total_text_d = total_text; + double src_text_d = _this.sizes[SECTION_TEXT][SOURCE_C]; + double asm_text_d = _this.sizes[SECTION_TEXT][SOURCE_ASM]; + strm << " " << total_text << " total bytes of code" << endl; + strm << " " << _this.sizes[SECTION_TEXT][SOURCE_C] << " bytes of code in src (" << (src_text_d / total_text_d * 100.0) << "%)" << endl; + strm << " " << _this.sizes[SECTION_TEXT][SOURCE_ASM] << " bytes of code in asm (" << (asm_text_d / total_text_d * 100.0) << "%)" << endl; + } + strm << endl; + // Report data + unsigned total_data = _this.sizes[SECTION_DATA][SOURCE_C] + _this.sizes[SECTION_DATA][SOURCE_ASM]; + if (total_data != 0) { + double total_data_d = total_data; + double src_data_d = _this.sizes[SECTION_DATA][SOURCE_C]; + double asm_data_d = _this.sizes[SECTION_DATA][SOURCE_ASM]; + strm << " " << total_data << " total bytes of data" << endl; + strm << " " << _this.sizes[SECTION_DATA][SOURCE_C] << " bytes of data in src (" << (src_data_d / total_data_d * 100.0) << "%)" << endl; + strm << " " << _this.sizes[SECTION_DATA][SOURCE_ASM] << " bytes of data in asm (" << (asm_data_d / total_data_d * 100.0) << "%)" << endl; + } + strm << endl; + // Report hardcoded pointers + unsigned total_pointers = _this.n_hardcoded + _this.n_relocations; + if (total_pointers != 0) { + double total_pointers_d = total_pointers; + double hardcoded_pointers_d = _this.n_hardcoded; + double relocated_pointers_d = _this.n_relocations; + strm << " " << total_pointers << " total pointers" << endl; + strm << " " << _this.n_relocations << " properly-linked pointers (" << (relocated_pointers_d / total_pointers_d * 100.0) << "%)" << endl; + strm << " " << _this.n_hardcoded << " hard-coded pointers (" << (hardcoded_pointers_d / total_pointers_d * 100.0) << "%)" << endl; + } + return strm; +} diff --git a/.github/calcrom/BuildAnalyzer.h b/.github/calcrom/BuildAnalyzer.h new file mode 100644 index 00000000..1026f3e3 --- /dev/null +++ b/.github/calcrom/BuildAnalyzer.h @@ -0,0 +1,76 @@ +#ifndef CALCROM_BUILDANALYZER_H +#define CALCROM_BUILDANALYZER_H + +#include "find_filesystem.h" +#include +#include +#include +#include "ElfFile.h" +#ifndef NDEBUG +#include "MwerksXmapFile.h" +#endif + +using namespace std; +using namespace fs; + +extern string default_version; + +enum SectionType { + SECTION_DATA, + SECTION_TEXT, + SECTION_MAX, + SECTION_OTHER = -1 +}; + +enum SourceType { + SOURCE_C, + SOURCE_ASM, + SOURCE_MAX +}; + +static enum SourceType GetSourceType(const path &fname) { + string ext = fname.extension(); + return ext == ".s" ? SOURCE_ASM : SOURCE_C; +} + +static enum SectionType GetSectionType(const string &shname) { + if (shname == ".text" || shname == ".init" || shname == ".itcm") { + return SECTION_TEXT; + } else if (shname == ".data" || shname == ".rodata" || shname == ".sdata" || shname == ".dtcm") { + return SECTION_DATA; + } else { + return SECTION_OTHER; + } +} + +class BuildAnalyzer { + bool analyzed = false; + path basedir; + path subdir; + string version; + path srcbase; + string builddir; + Elf32File program; +#ifndef NDEBUG + MwerksXmapFile xmap; +#endif + + // Accumulate sizes + // src asm + // data _____|_____ + // text | + unsigned sizes[SECTION_MAX][SOURCE_MAX] = {{0, 0}, {0, 0}}; + unsigned n_hardcoded = 0; + unsigned n_relocations = 0; + + void reset(); + void AnalyzeObject(path fname_s); + void LoadProgramElf(); + void LoadProgramXmap(); +public: + BuildAnalyzer(path &_basedir, path &_subdir, string &_version = default_version); + BuildAnalyzer &operator()(); + friend ostream &operator<<(ostream &strm, BuildAnalyzer &_this); +}; + +#endif //CALCROM_BUILDANALYZER_H diff --git a/.github/calcrom/ElfFile.cpp b/.github/calcrom/ElfFile.cpp new file mode 100644 index 00000000..bd950ad4 --- /dev/null +++ b/.github/calcrom/ElfFile.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include "ElfFile.h" + +void Elf32File::ReadElfHeaderAndVerify() { + handle.seekg(0); + handle.read((char *)ehdr.e_ident, EI_NIDENT); + assert(memcmp(ehdr.e_ident, ELFMAG, SELFMAG) == 0); + assert(ehdr.e_ident[EI_CLASS] == ELFCLASS32); + assert(ehdr.e_ident[EI_DATA] == ELFDATA2LSB); + assert(ehdr.e_ident[EI_VERSION] == EV_CURRENT); + handle.read((char*)&ehdr + EI_NIDENT, sizeof(ehdr) - EI_NIDENT); + assert(ehdr.e_shentsize == sizeof(Elf32_Shdr)); +} + +void Elf32File::ReadSectionHeaders() { + assert(shdr.empty()); + shdr.resize(ehdr.e_shnum); + handle.seekg(ehdr.e_shoff); + handle.read((char*)shdr.data(), ehdr.e_shnum * ehdr.e_shentsize); +} + +void Elf32File::ReadProgramHeaders() { + assert(phdr.empty()); + phdr.resize(ehdr.e_phnum); + handle.seekg(ehdr.e_phoff); + handle.read((char*)phdr.data(), ehdr.e_phnum * ehdr.e_phentsize); +} + +void Elf32File::ReadShstrtab() { + assert(shstrtab.empty()); + shstrtab.resize(shdr[ehdr.e_shstrndx].sh_size); + handle.seekg(shdr[ehdr.e_shstrndx].sh_offset); + handle.read((char*)shstrtab.data(), shdr[ehdr.e_shstrndx].sh_size); +} + +void Elf32File::ReadStrtab() { + assert(strtab.empty()); + int i; + for (i = 1; i < ehdr.e_shnum; i++) { + if (i == ehdr.e_shstrndx) continue; + if (shdr[i].sh_type == SHT_STRTAB) break; + } + assert(i != ehdr.e_shnum); + strtab.resize(shdr[i].sh_size); + handle.seekg(shdr[i].sh_offset); + handle.read((char*)strtab.data(), shdr[i].sh_size); +} + +void Elf32File::ReadSymtab() { + assert(symtab.empty()); + auto sec = find_if(shdr.begin(), shdr.end(), [](Elf32_Shdr const& candidate) { return candidate.sh_type == SHT_SYMTAB; }); + assert(sec != shdr.end()); + symtab.resize(sec->sh_size); + handle.seekg(sec->sh_offset); + handle.read((char*)symtab.data(), sec->sh_size); +} + +Elf32File::Elf32File(path const& filename, elfload load) { + open(filename, load); +} + +void Elf32File::open(path const& filename, elfload load) { + assert(!is_open()); + handle.open(filename, ios::binary); + assert(handle.good()); + ReadElfHeaderAndVerify(); + if (load & sections) { + ReadSectionHeaders(); + ReadShstrtab(); + } + if (load & programs) { + ReadProgramHeaders(); + } + if (load & symbols) { + assert(load & sections); + ReadStrtab(); + ReadSymtab(); + } +} + +void Elf32File::close() { + if (is_open()) { + handle.close(); + } + memset(&ehdr, 0, sizeof(ehdr)); + shdr.clear(); + symtab.clear(); + phdr.clear(); + shstrtab.clear(); + strtab.clear(); +} + +bool Elf32File::is_open() const { + return handle.is_open(); +} + +Elf32File::~Elf32File() { + close(); +} + +vector &Elf32File::GetSectionHeaders() { + return shdr; +} + +vector &Elf32File::GetProgramHeaders() { + return phdr; +} + +string Elf32File::GetSectionName(const Elf32_Shdr §ion) const { + return {shstrtab.data() + section.sh_name}; +} + +string Elf32File::GetSymbolName(const Elf32_Sym &symbol) const { + return {strtab.data() + symbol.st_name}; +} + +Elf32_Sym &Elf32File::operator[](const string &name) { + return *find_if(symtab.begin(), symtab.end(), [&](Elf32_Sym const &sym) { return name == GetSymbolName(sym); }); +} + +Elf32_Sym &Elf32File::at(const string &name) { + auto ret = find_if(symtab.begin(), symtab.end(), [&](Elf32_Sym const &sym) { return name == GetSymbolName(sym); }); + if (ret == symtab.end()) { + throw runtime_error("no symbol named " + name); + } + return *ret; +} diff --git a/.github/calcrom/ElfFile.h b/.github/calcrom/ElfFile.h new file mode 100644 index 00000000..b0b5d3e2 --- /dev/null +++ b/.github/calcrom/ElfFile.h @@ -0,0 +1,64 @@ +#ifndef CALCROM_ELFFILE_H +#define CALCROM_ELFFILE_H + +#include +#include +#include "find_filesystem.h" +#ifdef __APPLE__ +#include +#else +#include +#endif //__APPLE__ + +using namespace std; +using namespace fs; + +class Elf32File { + ifstream handle; + Elf32_Ehdr ehdr {}; + vector shdr; + vector symtab; + vector phdr; + vector shstrtab; + vector strtab; + +private: + void ReadElfHeaderAndVerify(); + void ReadSectionHeaders(); + void ReadProgramHeaders(); + void ReadShstrtab(); + void ReadStrtab(); + void ReadSymtab(); +public: + typedef unsigned int elfload; + static const elfload sections = 1; + static const elfload programs = 2; + static const elfload symbols = 4; + + Elf32File() = default; + explicit Elf32File(path const& filename, elfload load = sections); + ~Elf32File(); + void open(path const& filename, elfload load = sections); + void close(); + bool is_open() const; + template + vector ReadSectionData(const Elf32_Shdr &_shdr) { + vector ret; + ret.resize(GetSectionElementCount(_shdr)); + handle.seekg(_shdr.sh_offset); + handle.read((char *)ret.data(), _shdr.sh_size); + return ret; + } + template + size_t GetSectionElementCount(const Elf32_Shdr &_shdr) { + return (_shdr.sh_size + sizeof(V) - 1) / sizeof(V); + } + vector& GetSectionHeaders(); + vector& GetProgramHeaders(); + string GetSectionName(const Elf32_Shdr §ion) const; + string GetSymbolName(const Elf32_Sym &symbol) const; + Elf32_Sym &operator[](const string &name); + Elf32_Sym &at(const string &name); +}; + +#endif //CALCROM_ELFFILE_H diff --git a/.github/calcrom/Glob.cpp b/.github/calcrom/Glob.cpp new file mode 100644 index 00000000..cb519233 --- /dev/null +++ b/.github/calcrom/Glob.cpp @@ -0,0 +1,16 @@ +#include +#include "Glob.h" + +Glob::Glob(const char *pattern, int _glob_flags) : glob_flags(_glob_flags) { + int result = glob(pattern, glob_flags, nullptr, &glob_result); + if (result) { + throw runtime_error(string("Glob(") + pattern + ") failed with error " + to_string(result)); + } + assign(glob_result.gl_pathv, glob_result.gl_pathv + glob_result.gl_pathc); +} + +Glob::Glob(const string& pattern, int _glob_flags) : Glob(pattern.c_str(), _glob_flags) {} + +Glob::~Glob() { + globfree(&glob_result); +} diff --git a/.github/calcrom/Glob.h b/.github/calcrom/Glob.h new file mode 100644 index 00000000..f92e08ea --- /dev/null +++ b/.github/calcrom/Glob.h @@ -0,0 +1,20 @@ +#ifndef CALCROM_GLOB_H +#define CALCROM_GLOB_H + +#include +#include +#include + +using namespace std; + +class Glob : public vector { + glob_t glob_result {}; + int glob_flags; +public: + // Call glob with the supplied pattern + Glob(const char * pattern, int _glob_flags); + Glob(const string& pattern, int _glob_flags); + ~Glob(); +}; + +#endif //CALCROM_GLOB_H diff --git a/.github/calcrom/Makefile b/.github/calcrom/Makefile new file mode 100644 index 00000000..a6d394ac --- /dev/null +++ b/.github/calcrom/Makefile @@ -0,0 +1,42 @@ +CXX ?= g++ +CXXFLAGS := -g -O2 -std=c++17 +ifeq ($(DEBUG),) +CXXFLAGS += -DNDEBUG +else +CXXFLAGS := $(patsubst -O2,-Og,$(CXXFLAGS)) +endif + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +CXXSRCS := calcrom.cpp BuildAnalyzer.cpp ElfFile.cpp Glob.cpp MwerksXmapFile.cpp +CXXOBJS := $(CXXSRCS:%.cpp=%.o) + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +TARGET := calcrom$(EXE) + +.PHONY: all clean + +all: $(TARGET) + +clean: + $(RM) -r $(TARGET) $(CXXOBJS) $(DEPDIR) + +$(TARGET): $(CXXOBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +%.o: %.cpp +%.o: %.cpp $(DEPDIR)/%.d | $(DEPDIR) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(CXXSRCS:%.cpp=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/.github/calcrom/MwerksXmapFile.cpp b/.github/calcrom/MwerksXmapFile.cpp new file mode 100644 index 00000000..bd3f4ffb --- /dev/null +++ b/.github/calcrom/MwerksXmapFile.cpp @@ -0,0 +1,35 @@ +#ifndef NDEBUG + +#include "MwerksXmapFile.h" +#include +#include + +MwerksXmapFile::MwerksXmapFile(path const &filename) { + open(filename); +} + +void MwerksXmapFile::open(path const &filename) { + ifstream infile(filename); + string line; + while (getline(infile, line)) { + // Search for declaration of section begin + try { + unsigned addr = stoi(line.substr(2, 8), nullptr, 16); + stoi(line.substr(11, 8), nullptr, 16); + line = line.substr(20); + size_t space_pos = line.find(' '); + string secname = line.substr(0, space_pos); + line = line.substr(line.find('(') + 1, line.find(')') - line.find('(') - 1); + size_t &pos = _section_addrs[{line, secname}]; + if (pos == 0 || pos > addr) { + pos = addr; + } + } catch (const invalid_argument &e) { + continue; + } catch (const out_of_range &e) { + continue; + } + } +} + +#endif diff --git a/.github/calcrom/MwerksXmapFile.h b/.github/calcrom/MwerksXmapFile.h new file mode 100644 index 00000000..66a48f64 --- /dev/null +++ b/.github/calcrom/MwerksXmapFile.h @@ -0,0 +1,30 @@ +#ifndef GUARD_MWERKSXMAPFILE_H +#define GUARD_MWERKSXMAPFILE_H + +#ifndef NDEBUG + +#include +#include "find_filesystem.h" +#include +#include + +using namespace std; +using namespace fs; + +class MwerksXmapFile { + map, size_t> _section_addrs; +public: + MwerksXmapFile() = default; + explicit MwerksXmapFile(path const &filename); + void open(path const &filename); + size_t &at(pair const &key) { + return _section_addrs.at(key); + } + size_t &operator[](pair const &key) { + return _section_addrs[key]; + } +}; + +#endif + +#endif //GUARD_MWERKSXMAPFILE_H diff --git a/.github/calcrom/calcrom.cpp b/.github/calcrom/calcrom.cpp new file mode 100644 index 00000000..aa54b34a --- /dev/null +++ b/.github/calcrom/calcrom.cpp @@ -0,0 +1,103 @@ +/* + * CALCROM.CPP + * © PikalaxALT 2020-2021 + * + * Permission is granted to copy and/or modify this code under GPL 3.0. + * + * Simple C++ executable to measure the completion rate of Nintendo DS + * reverse engineering (decompilation). + * Similar in scope to calcrom.pl from pret-agb projects, but designed + * to cope with restrictions imposed by the DS toolchain. + * + * Requirements: + * - Must have C++11 compliant compiler. + * - Mac OS X: Must provide elf.h on the include (-I) path. + * - Must be placed in ".github/calcrom/". + * + * Changelog: + * - 0.1.0 (26 May 2020): + * Initial implementation + * - 0.1.1 (26 May 2020): + * Allow program to be run from wherever + * - 0.1.2 (27 May 2020): + * Extra security on ELF header + * - 0.1.3 (30 Jun 2020): + * Account for diamond/pearl split + * - 0.2.0 (30 Aug 2021): + * Support hgss + * - 0.2.1 (31 Aug 2021): + * Make calcrom more generic and configurable via command line + * - 0.2.2 (18 Sep 2021): + * Handle errors when paths are missing + * - 0.2.3 (10 Nov 2021): + * Refactor classes into separate objects to improve future maintainability + * Report hardcoded pointers + */ + +#include +#include +#include +#include +#include "find_filesystem.h" +#include "BuildAnalyzer.h" + +using namespace std; +using namespace fs; + +class missing_option : public invalid_argument { +public: + explicit missing_option(string& error) : invalid_argument{error.c_str()} {} +}; + +struct Options { + path arm9subdir = ""; + path arm7subdir = "sub"; + path projectdir = "."; + vector romnames; + Options(int argc, char ** argv) { + for (int i = 1; i < argc; i++) { + string arg = argv[i]; + if (arg == "-9") { + if (++i == argc) throw missing_option(arg); + arm9subdir = argv[i]; + } else if (arg == "-7") { + if (++i == argc) throw missing_option(arg); + arm7subdir = argv[i]; + } else if (arg == "-d") { + if (++i == argc) throw missing_option(arg); + projectdir = argv[i]; + } else if (arg[0] != '-') { + romnames.push_back(arg); + } else { + throw invalid_argument(arg); + } + } + } + int main() { + for (string &romname: romnames) { + cout << BuildAnalyzer(projectdir, arm9subdir, romname)() << endl; + } + cout << BuildAnalyzer(projectdir, arm7subdir)(); + return 0; + } +}; + +int main(int argc, char ** argv) +{ + try { + Options options(argc, argv); + return options.main(); + } catch (missing_option& e) { + cerr << "Missing value for option " << e.what() << endl; + return 1; + } catch (invalid_argument& e) { + cerr << "Unrecognized option flag: " << e.what() << endl; + return 1; + } catch (runtime_error& e) { + cerr << e.what() << endl; + return 1; + } catch (exception& e) { + cerr << "Unhandled exception: " << e.what() << endl; + return 1; + } +} diff --git a/.github/calcrom/find_filesystem.h b/.github/calcrom/find_filesystem.h new file mode 100644 index 00000000..472e54a9 --- /dev/null +++ b/.github/calcrom/find_filesystem.h @@ -0,0 +1,12 @@ +#ifndef GUARD_FIND_FILESYSTEM_H +#define GUARD_FIND_FILESYSTEM_H + +#if __cplusplus >= 201703L +#include +namespace fs = std::filesystem; +#else +#include +namespace fs = std::experimental::filesystem; +#endif //__cplusplus + +#endif //GUARD_FIND_FILESYSTEM_H diff --git a/.github/calcrom/webhook.sh b/.github/calcrom/webhook.sh new file mode 100644 index 00000000..3e13b8b6 --- /dev/null +++ b/.github/calcrom/webhook.sh @@ -0,0 +1,20 @@ +#!/bin/bash -ex + +# Only run this script if it's the master branch build. +if [[ "$GITHUB_REF" != "refs/heads/master" || "$GITHUB_EVENT_NAME" != "push" ]]; then + exit 0 +fi + +build_name=$1 +url=$2 +build_subdir=${1//poke/}.us +arm9name=${arm9name:-main.nef} +map_file=$(dirname "$0")/../../build/${build_subdir}/${arm9name}.xMAP +if [ ! -f $map_file ]; then + echo "$map_file does not exist!" + exit 1 +fi + +make -C ${GITHUB_WORKSPACE}/.github/calcrom +output=$(${GITHUB_WORKSPACE}/.github/calcrom/calcrom -d ${GITHUB_WORKSPACE} -9 "" -7 sub pmdsky.us | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g') +curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`$build_name progress:\\n$output\`\`\`\"}" -H "Content-Type: application/json" -X POST $url diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..0f27f56d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,102 @@ +name: build + +on: + push: + branches: [ master ] + pull_request: + workflow_dispatch: + +env: + LM_LICENSE_FILE: "$GITHUB_WORKSPACE/tools/mwccarm/license.dat" + CC: gcc-10 + CXX: g++-10 + CALCROM_DISCORD_WEBHOOK_AVATAR_URL: "https://i.imgur.com/38BQHdd.png" + CALCROM_DISCORD_WEBHOOK_USERNAME: OK + CALCROM_WEBHOOK_URL: ${{ secrets.WEBHOOKURL }} + COMPARE: 1 + +jobs: + build: + runs-on: ubuntu-22.04 + + steps: + - name: Update and Install Software + run: | + sudo apt update + sudo ACCEPT_EULA=Y apt -y --fix-missing --allow-downgrades upgrade + sudo apt -y --allow-downgrades install g++-10-multilib linux-libc-dev binutils-arm-none-eabi p7zip-full pkg-config libpugixml-dev ppa-purge + sudo ppa-purge -y ppa:ubuntu-toolchain-r/test + sudo dpkg --add-architecture i386 + sudo mkdir -pm755 /etc/apt/keyrings + sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key + sudo add-apt-repository ppa:cybermax-dexter/sdl2-backport + sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/$(lsb_release -cs)/winehq-$(lsb_release -cs).sources + sudo apt update + sudo apt -y --allow-downgrades install --install-recommends winehq-stable + + - name: Checkout Repo + uses: actions/checkout@v3 + + - name: Setup Repo + run: | + mkdir -p ~/download + cd ~/download + wget https://cdn.discordapp.com/attachments/698589325620936736/845499146982129684/mwccarm.zip + wget https://cdn.discordapp.com/attachments/698589325620936736/722822401963851797/NitroSDK-3_2-060901.7z + unzip mwccarm.zip + mv mwccarm $GITHUB_WORKSPACE/tools + 7z x NitroSDK-3_2-060901.7z + mv NitroSDK-3_2-060901/tools/bin $GITHUB_WORKSPACE/tools + mv NitroSDK-3_2-060901/include/nitro/specfiles/ARM7-TS.lcf.template $GITHUB_WORKSPACE/sub/ + mv NitroSDK-3_2-060901/include/nitro/specfiles/ARM9-TS.lcf.template $GITHUB_WORKSPACE/ + mv NitroSDK-3_2-060901/include/nitro/specfiles/mwldarm.response.template $GITHUB_WORKSPACE/ + working-directory: ~ + + - name: Build + env: + GAME_LANGUAGE: ENGLISH + GAME_REVISION: 0 + run: make -j${nproc} + + - name: Webhook + if: ${{ github.event_name == 'push' }} + run: | + sudo chmod 755 $GITHUB_WORKSPACE/.github/calcrom/webhook.sh + $GITHUB_WORKSPACE/.github/calcrom/webhook.sh pmdsky "$CALCROM_WEBHOOK_URL" + continue-on-error: true + + - name: Post error archive + if: failure() + continue-on-error: true + run: find . -maxdepth 2 -type d \( -name build -or -name files \) -exec tar -czvhf failure.tar.gz {} + + + - name: Post error upload + if: failure() + uses: actions/upload-artifact@v2 + with: + name: pmdsky-failure-${{ github.run_id }} + path: failure.tar.gz + retention-days: 1 + + - name: Checkout xMAP + if: ${{ github.event_name == 'push' }} + uses: actions/checkout@master + with: + path: 'xmap' + ref: 'xmap' + + - name: Move xMAP + if: ${{ github.event_name == 'push' }} + run: | + mkdir -p xmap + cp build/pmdsky.us/*.xMAP xmap/pmdskyus.xMAP + echo "XMAP_COMMIT_MSG=$( git log --format=%s ${GITHUB_SHA} )" >> $GITHUB_ENV + + - name: Update xMAP + if: ${{ github.event_name == 'push' }} + uses: EndBug/add-and-commit@v7 + with: + branch: xmap + cwd: "./xmap" + add: "*.xMAP" + message: ${{ env.XMAP_COMMIT_MSG }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..292488be --- /dev/null +++ b/.gitignore @@ -0,0 +1,81 @@ +# Object files +*.nds + +# Compilers +tools/mwccarm/** + +# SDK +tools/bin/** + +# Build folder +build/** +sub/build/** + +# CLion folders +.idea/ + +# ROM +*.srl + +# Tool executables +*.exe + +# Generated files +*.4bpp +*.lz +*.gbapal + +# For asmdiff +*/baserom.* +*.dump + +# For decomp.me +ctx.c + +*.lcf.template +*.lcf +*.response.template +*.response + +# Working files +overlays/*/module_*.s +overlays/*/module_*.sbin +overlays/*/module_*.cfg + +*.sbin +*.bnr +*.nbfp +*.nbfc + +# Dism scripts +dism.sh +asmdiff.sh + +# Symbols CSV +symbols.csv + +# NARCs +*.narc +*.arc +files/**/*.c +*.o +*.naix +*.a + +# Utilities +ntruncompbw +*.elf +*.sbin_LZ +*.diff + +*.dSYM + +# MacOS garbage +.DS_Store + +# Depfiles +*.d + +diff.txt + +.vscode/ diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 00000000..b6364711 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,123 @@ +This doc details the steps necessary to build a copy of _Pokémon Mystery Dungeon: Explorers of Sky_ (EN-US) from the sources contained in this repository. + +### 0. Clone the repository + +Using a terminal or git client, clone this repository to your local device. All the steps that followed should be performed in the directory to which you cloned this repository. + +### 1. Install MWCC compiler + +The build system requires the use of the Metrowerks C Compiler versions 2.0/sp2p2 to compile matching files. We cannot distribute the correct compiler here so join the PRET discord and download the pinned mwccarm.zip zip in #pokediamond and extract it to tools/. At the end of this operation, you should have i.e. the file `tools/mwccarm/2.0/sp2p2/mwccarm.exe`. Run each of the executables so they ask for a license.dat and provide the one in the rar (it may also ask for it when compiling). This only needs to be done once. + +In the future, a GCC option will be available so MWCC is not required to build, however it is required for a matching ROM. + +### 2. Install Nitro SDK + +As with the compiler, the Nitro SDK is proprietary and cannot be distributed here. Download the "NitroSDK-4_2-071210-jp.7z" file pinned in the PRET discord. Extract and copy the folder `tools/bin` from the Nitro SDK into the folder `tools` in your pmd-sky clone. At the end of this operation, you should have i.e. the file `tools/bin/makelcf.exe` inside your pmd-sky clone. Finally, copy include/nitro/specfiles/ARM7-TS.lcf.template into the subdirectory `sub`, and include/nitro/specfiles/ARM9-TS.lcf.template and include/nitro/specfiles/mwldarm.response.template into the project root. + +### 3. Dependencies + +#### Linux + +Building the ROM requires the following packages. If you cannot find one or more of these using your package distribution, it may be under a different name. + +* make +* git +* build-essentials (build-essential on Ubuntu) +* binutils-arm-none-eabi +* wine (to run the mwcc executables) +* python3 (for asm preprocessor) +* libpng-devel (libpng-dev on Ubuntu) +* pkg-config +* pugixml (libpugixml-dev on Ubuntu) + +NOTE: If you are using Arch/Manjaro or Void you will only need base-devel instead of build-essentials or make or git. You will still need wine. + +Currently WSL2 has an issue with mwldarm not being able to locate it's executable. Please use WSL1 or another build environment to mitigate this issue until a solution is found. + +#### Windows + +Before following the respective guides, please install devkitARM and ensure the DEVKITPRO and DEVKITARM variables are added to bashrc such that: + +Msys2: +```console +export DEVKITPRO=C:/devkitPro +export DEVKITARM=${DEVKITPRO}/devkitARM +``` + +Cygwin: +```console +export DEVKITPRO=/cygdrive/c/devkitPro +export DEVKITARM=${DEVKITPRO}/devkitARM +``` + +You will still require the following packages: + +* make +* git +* build-essentials +* libpng-devel +* pugixml +* pkg-config + +Install them using either the Cygwin package manager or using pacman on Msys2. + +**NOTE FOR MSYS2:** You will need to compile and install [libpng](https://www.libpng.org/pub/png/libpng.html) from source. + +#### macOS + +macOS 10.15 Catalina and later is supported on Intel and ARM64 hardware configurations. On ARM64, Rosetta 2 must be installed, as well as the following dependencies: + +* GNU coreutils +* GNU make +* GNU sed +* LLVM clang compiler +* arm-gcc-bin +* git +* libpng +* pkg-config +* pugixml +* wine-crossover (includes wine32on64, required on Catalina and later to run 32-bit x86 EXEs) + +They can be installed with the following commands: + +```console +$ brew tap osx-cross/homebrew-arm +$ brew tap gcenx/wine +$ brew install coreutils make gnu-sed llvm arm-gcc-bin libpng git pkg-config +$ brew install wine-crossover +``` + +### 4. Build ROM + +Run `make` to build the ROM. The ROM will be output as `build/pmdsky.us/pmdsky.us.nds` + +There are targets for building and testing changes to individual components without repackaging the ROM. For the ARM9 modules, run `make main`. For the ARM7 module, run `make sub`. For the filesystem, run `make filesystem`. + +At the end of building each of these, there is a checksum verification step. This makes sure that the final product is byte-for-byte equivalent to the retail ROM. To disable this, append `COMPARE=0` to your command. + +#### Windows + +If you get an error in saving configuration settings when specifying the license file, you need to add a system environment variable called LM_LICENSE_FILE and point it to the license.dat file. Alternatively, run mwccarm.exe from an Administrator command prompt, PowerShell, or WSL session. + +#### Docker + +If you find issues building the ROMs with the above methods, you can try the Docker-specific build script. It will build an Alpine-based Docker image with the system requirements above, and run the `make` scripts (any specified parameter will be passed to the `make` command): + +```console +$ make clean +$ ./contrib/docker/build_docker.sh +``` + +Note: Docker may not run at a full performance if its underlying Linux kernel is being virtualized (mainly Windows and macOS hosts). + +#### After updating from upstream + +This repository is still in a volatile state, and several files may be moved around or renamed. If you pull from upstream and experience errors rebuilding, try the following troubleshooting steps, **one line at a time** until you get the non_npc_msg `build/pmdsky.us/pmdsky.us.nds: OK`: + +```shell +make tidy && make compare +make clean && make compare +git clean -fdx && make compare +``` + +If, after the third step, you're still getting errors, please ask for help in the Discord. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..31816f0a --- /dev/null +++ b/Makefile @@ -0,0 +1,91 @@ +MWCCVER := 2.0/sp2p2 +PROC := arm946e +PROC_S := arm5te +PROC_LD := v5te +LCF_TEMPLATE := ARM9-TS.lcf.template +LIBS := -Llib -lsyscall -nostdlib +OPTFLAGS := -O4,p + +include config.mk + +ALL_BUILDDIRS := $(BUILD_DIR)/lib +include common.mk +include filesystem.mk + +$(ASM_OBJS): MWASFLAGS += -DPM_ASM -include config.h + +$(BUILD_DIR)/asm/nitrocrypto.o: MWCCVER := 1.2/sp2p3 +$(BUILD_DIR)/lib/msl/src/*.o: EXCCFLAGS := -Cpp_exceptions on + +$(ASM_OBJS): $(WORK_DIR)/include/config.h +$(C_OBJS): $(WORK_DIR)/include/global.h + +ROM := $(BUILD_DIR)/poke$(buildname).nds +BANNER := $(ROM:%.nds=%.bnr) +BANNER_SPEC := $(buildname)/banner.bsf +ICON_PNG := $(buildname)/icon.png +HEADER_TEMPLATE := $(buildname)/rom_header_template.sbin + +.PHONY: main sub libsyscall sdk sdk9 sdk7 +.PRECIOUS: $(ROM) + +MAKEFLAGS += --no-print-directory + +all: $(ROM) + +tidy: + @$(MAKE) -C sub tidy + $(RM) -r $(BUILD_DIR) + $(RM) -r $(PROJECT_CLEAN_TARGETS) + $(RM) $(ROM) + +clean: tidy clean-filesystem clean-tools + @$(MAKE) -C lib/syscall clean + @$(MAKE) -C sub clean + +SBIN_LZ := $(SBIN)_LZ +.PHONY: main_lz + +sdk9 sdk7: sdk +main filesystem: | sdk9 +sub: | sdk7 + +main: $(SBIN) $(ELF) +main_lz: $(SBIN_LZ) +sub: ; @$(MAKE) -C sub + +ROMSPEC := rom.rsf +MAKEROM_FLAGS := $(DEFINES) + +$(NEF): libsyscall + +libsyscall: + $(MAKE) -C lib/syscall all install INSTALL_PREFIX=$(abspath $(WORK_DIR)/$(BUILD_DIR)) GAME_CODE=$(GAME_CODE) + +$(SBIN_LZ): $(BUILD_DIR)/component.files + $(COMPSTATIC) -9 -c -f $< + +$(BUILD_DIR)/component.files: main ; + +$(HEADER_TEMPLATE): ; + +$(ROM): $(ROMSPEC) tools filesystem main_lz sub $(BANNER) + $(WINE) $(MAKEROM) $(MAKEROM_FLAGS) -DBUILD_DIR=$(BUILD_DIR) -DNITROFS_FILES="$(NITROFS_FILES:files/%=%)" -DTITLE_NAME="$(TITLE_NAME)" -DBNR="$(BANNER)" -DHEADER_TEMPLATE="$(HEADER_TEMPLATE)" $< $@ + $(FIXROM) $@ --secure-crc $(SECURE_CRC) --game-code $(GAME_CODE) +ifeq ($(COMPARE),1) + $(SHA1SUM) -c $(buildname)/rom.sha1 +endif + +$(BANNER): $(BANNER_SPEC) $(ICON_PNG:%.png=%.nbfp) $(ICON_PNG:%.png=%.nbfc) + $(WINE) $(MAKEBNR) $< $@ + +FX_CONST_H := $(WORK_DIR)/lib/include/nitro/fx/fx_const.h +PROJECT_CLEAN_TARGETS += $(FX_CONST_H) +$(FX_CONST_H): $(TOOLSDIR)/gen_fx_consts/fx_const.csv + $(MKFXCONST) $@ +sdk: $(FX_CONST_H) +$(WORK_DIR)/include/global.h: $(FX_CONST_H) ; + +compare: @$(MAKE) COMPARE=1 + +.PHONY: compare diff --git a/README.md b/README.md new file mode 100644 index 00000000..744e9520 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Pokémon Mystery Dungeon: Explorers of Sky + +This is a WIP disassembly of Pokémon Mystery Dungeon: Explorers of Sky. For instructions on how to set up the repository, please read [INSTALL.md](INSTALL.md). + +This repository builds the following ROM: + +* [**pmdsky.us.nds**](https://datomatic.no-intro.org/index.php?page=show_record&s=28&n=4273) `sha1: 5fa96ca8d8dd6405d6cd2bad73ed68bc73a9d152` + +Other disassembly and/or decompilation projects: +* [**Pokémon Red and Blue**](https://github.com/pret/pokered) +* [**Pokémon Gold and Silver (Space World '97 demo)**](https://github.com/pret/pokegold-spaceworld) +* [**Pokémon Yellow**](https://github.com/pret/pokeyellow) +* [**Pokémon Trading Card Game**](https://github.com/pret/poketcg) +* [**Pokémon Pinball**](https://github.com/pret/pokepinball) +* [**Pokémon Stadium**](https://github.com/pret/pokestadium) +* [**Pokémon Gold and Silver**](https://github.com/pret/pokegold) +* [**Pokémon Crystal**](https://github.com/pret/pokecrystal) +* [**Pokémon Ruby and Sapphire**](https://github.com/pret/pokeruby) +* [**Pokémon Pinball: Ruby & Sapphire**](https://github.com/pret/pokepinballrs) +* [**Pokémon FireRed and LeafGreen**](https://github.com/pret/pokefirered) +* [**Pokémon Emerald**](https://github.com/pret/pokeemerald) +* [**Pokémon Mystery Dungeon: Red Rescue Team**](https://github.com/pret/pmd-red) + +Gen 4 decompilation projects: +* [**Pokémon Diamond and Pearl (pret)**](https://github.com/pret/pokediamond) +* [**Pokémon Platinum (pret)**](https://github.com/pret/pokeplatinum) +* [**Pokémon Platinum (JimB16)**](https://github.com/JimB16/PokePlat) +* [**Pokémon Platinum (Ganix)**](https://github.com/KernelEquinox/PokePlatinum) +* [**Pokémon HeartGold and SoulSilver**](https://github.com/pret/pokeheartgold) + +## Contacts + +You can find us on: + +* [Discord (PRET, #pmd-sky)](https://discord.gg/d5dubZ3) diff --git a/asm/macros.inc b/asm/macros.inc new file mode 100644 index 00000000..21402681 --- /dev/null +++ b/asm/macros.inc @@ -0,0 +1,4 @@ +#pragma once + + .include "asm/macros/function.inc" + .include "asm/macros/cw.inc" diff --git a/asm/macros/cw.inc b/asm/macros/cw.inc new file mode 100644 index 00000000..61c24fd9 --- /dev/null +++ b/asm/macros/cw.inc @@ -0,0 +1,12 @@ + .macro exception what, size, data + .section .exceptix,4,1,2 + .balign 4, 0 + .type ?exc$\what, @object + .global ?exc$\what + .size ?exc$\what, 12 +?exc$\what: + .word \what + .short \size + .word \data + .previous + .endm diff --git a/asm/macros/function.inc b/asm/macros/function.inc new file mode 100644 index 00000000..44b92544 --- /dev/null +++ b/asm/macros/function.inc @@ -0,0 +1,29 @@ +#pragma once + + .macro arm_func_start name + .balign 4, 0 + .global \name + .type \name, @function + .arm + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .balign 4, 0 + .global \name + .type \name, @function + .thumb + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .type \name, @function + .thumb + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/asm/macros/script.inc b/asm/macros/script.inc new file mode 100644 index 00000000..d020e222 --- /dev/null +++ b/asm/macros/script.inc @@ -0,0 +1,4946 @@ + .ifndef ASM_SCRIPT_INC + .set ASM_SCRIPT_INC, 1 +#pragma once +#include "constants/scrcmd.h" + .option alignment off + + .macro scrdef offset + .word \offset - . - 4 + .endm + + .macro scrdef_end + .short SCRDEF_END + .endm + + ; Dummy command + .macro snop + .short 0 + .endm + + ; Dummy command + .macro dummy + .short 1 + .endm + + ; Exits script execution and returns control to the player + .macro end + .short 2 + .endm + + ; Pauses for some frames, tracks the timer in a script variable + .macro wait frames, var + .short 3 + .short \frames + .short \var + .endm + + ; Loads 8-bit value into the specified script register + .macro loadbyte reg, val + .short 4 + .byte \reg + .byte \val + .endm + + ; Loads 32-bit value into the specified script register + .macro loadword reg, val + .short 5 + .byte \reg + .word \val + .endm + + ; Reads byte at a specific memory address into a script register + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro loadbytefromaddr reg, addr + .short 6 + .byte \reg + .word \addr + .endm + + ; Writes byte to a specific memory address from a script register + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro writebytetoaddr addr, reg + .short 7 + .word \addr + .byte \reg + .endm + + ; Writes byte literal to a specific memory address + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro setptrbyte addr, val + .short 8 + .word \addr + .byte \val + .endm + + ; Copies a byte between script registers + .macro copylocal to, from + .short 9 + .byte \to + .byte \from + .endm + + ; Copies a byte between two memory addresses + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro copybyte to, from + .short 10 + .word \to + .word \from + .endm + + ; Compares values between script reg and script reg + .macro compare_local_to_local a, b + .short 11 + .byte \a + .byte \b + .endm + + ; Compares script reg to byte literal + .macro compare_local_to_value reg, val + .short 12 + .byte \reg + .byte \val + .endm + + ; Compares script reg to memory address + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro compare_local_to_addr reg, addr + .short 13 + .byte \reg + .word \addr + .endm + + ; Compares memory address to script reg + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro compare_addr_to_local addr, reg + .short 14 + .word \addr + .byte \reg + .endm + + ; Compares memory address to byte literal + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro compare_addr_to_value addr, val + .short 15 + .word \addr + .byte \val + .endm + + ; Compares bytes at two memory addresses + ; Because scripts are compiled in a code-agnostic fashion, + ; this command can never be assembled. + .macro compare_addr_to_addr a, b + .short 16 + .word \a + .word \b + .endm + + ; Compares variable to 16-bit literal + .macro compare_var_to_value var, val + .short 17 + .short \var + .short \val + .endm + + ; Compares two variables + .macro compare_var_to_var a, b + .short 18 + .short \a + .short \b + .endm + + ; Creates a new script context to run the indicated script asynchronously + .macro runscript id + .short 19 + .short \id + .endm + + ; Creates a new script context to run the indicated script and wait + .macro callstd id + .short 20 + .short \id + .endm + + ; Yield to parent context + .macro endstd + .short 21 + .endm + + ; Absolute branch to offset in script + .macro goto dest + .short 22 + .word \dest-.-4 + .endm + + ; Branch to offset in script if interacting with a specific object + .macro objectgoto object, dest + .short 23 + .byte \object + .word \dest-.-4 + .endm + + ; Branch to offset in script if interacting with a specific bg event + .macro bggoto bg, dest + .short 24 + .byte \bg + .word \dest-.-4 + .endm + + ; Branch to offset in script if facing a specific direction + .macro directiongoto dir, dest + .short 25 + .byte \dir + .word \dest-.-4 + .endm + + ; Call script as a subroutine + .macro call sub + .short 26 + .word \sub-.-4 + .endm + + ; Return from subroutine + .macro return + .short 27 + .endm + + ; Conditional branch to offset in script + .macro goto_if condition, dest + .short 28 + .byte \condition + .word \dest-.-4 + .endm + + ; Conditional call subroutine + .macro call_if condition, sub + .short 29 + .byte \condition + .word \sub-.-4 + .endm + + ; Set event flag + .macro setflag flag + .short 30 + .short \flag + .endm + + ; Clear event flag + .macro clearflag flag + .short 31 + .short \flag + .endm + + ; Check event flag, store result on context + .macro checkflag flag + .short 32 + .short \flag + .endm + + ; Set event flag referenced in var + .macro setflagvar var + .short 33 + .short \var + .endm + + ; Clear event flag referenced in var + .macro clearflagvar var + .short 34 + .short \var + .endm + + ; Check event flag referenced in var, store result in other var + .macro checkflagvar var_flag, var_dest + .short 35 + .short \var_flag + .short \var_dest + .endm + + ; Set trainer defeated flag + .macro settrainerflag var_or_trno + .short 36 + .short \var_or_trno + .endm + + ; Clear trainer defeated flag + .macro cleartrainerflag var_or_trno + .short 37 + .short \var_or_trno + .endm + + ; Check trainer defeated flag, store result on context + .macro checktrainerflag var_or_trno + .short 38 + .short \var_or_trno + .endm + + ; Increment var value by value + .macro addvar var, var_or_addend + .short 39 + .short \var + .short \var_or_addend + .endm + + ; Decrement var value by value + .macro subvar var, var_or_addend + .short 40 + .short \var + .short \var_or_addend + .endm + + ; Set var to short literal + .macro setvar var, val + .short 41 + .short \var + .short \val + .endm + + ; Set var from other var + .macro copyvar dst, src + .short 42 + .short \dst + .short \src + .endm + + ; Set var from other var or short literal + .macro setorcopyvar dst, src + .short 43 + .short \dst + .short \src + .endm + + ; Print non_npc_msg in field window from current map message bank + .macro non_npc_msg msg_id + .short 44 + .byte \msg_id + .endm + + ; NPC dialogue window + .macro npc_msg msg_id + .short 45 + .byte \msg_id + .endm + + ; Not sure what to call this but it + ; is also a message printer + .macro non_npc_msg_var msg_id + .short 46 + .short \msg_id + .endm + + .macro npc_msg_var arg0 + .short 47 + .short \arg0 + .endm + + .macro scrcmd_048 arg0 + .short 48 + .byte \arg0 + .endm + + ; Waits for A or B button + .macro wait_button + .short 49 + .endm + + ; Waits for A, B, or dpad. On pressing dpad, does a turn frame. + .macro wait_button_or_walk_away + .short 50 + .endm + + ; Waits for A, B, or dpad. No turn frame. + .macro wait_button_or_dpad + .short 51 + .endm + + .macro openmsg + .short 52 + .endm + + .macro closemsg + .short 53 + .endm + + ; Like closemsg but does not clear the graphics. + .macro holdmsg + .short 54 + .endm + + .macro direction_signpost message, arg1, arrow, arg3 + .short 55 + .byte \message + .byte \arg1 + .short \arrow + .short \arg3 + .endm + + .macro scrcmd_055 message, arg1 + .short 56 + .byte \message + .short \arg1 + .endm + + .macro scrcmd_057 arg0 + .short 57 + .byte \arg0 + .endm + + .macro scrcmd_058 + .short 58 + .endm + + .macro trainer_tips arg0, arg1 + .short 59 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_060 arg0 + .short 60 + .short \arg0 + .endm + + .macro scrcmd_061 + .short 61 + .endm + + .macro scrcmd_062 arg0, arg1, arg2, arg3, arg4, arg5 + .short 62 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .byte \arg4 + .byte \arg5 + .endm + + .macro yesno arg0 + .short 63 + .short \arg0 + .endm + + .macro scrcmd_064 arg0, arg1, arg2, arg3, arg4 + .short 64 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro scrcmd_065 arg0, arg1, arg2, arg3, arg4 + .short 65 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro scrcmd_066 arg0, arg1 + .short 66 + .byte \arg0 + .byte \arg1 + .endm + + .macro scrcmd_067 + .short 67 + .endm + + .macro scrcmd_068 arg0, arg1, arg2, arg3, arg4 + .short 68 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro scrcmd_069 arg0, arg1, arg2, arg3, arg4 + .short 69 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro scrcmd_070 arg0, arg1, arg2 + .short 70 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_071 + .short 71 + .endm + + .macro scrcmd_072 arg0 + .short 72 + .byte \arg0 + .endm + + .macro play_se arg0 + .short 73 + .short \arg0 + .endm + + .macro stop_se arg0 + .short 74 + .short \arg0 + .endm + + .macro wait_se arg0 + .short 75 + .short \arg0 + .endm + + .macro play_cry arg0, arg1 + .short 76 + .short \arg0 + .short \arg1 + .endm + + .macro wait_cry + .short 77 + .endm + + .macro play_fanfare fanfare + .short 78 + .short \fanfare + .endm + + .macro wait_fanfare + .short 79 + .endm + + .macro play_bgm bgm + .short 80 + .short \bgm + .endm + + .macro stop_bgm arg0 + .short 81 + .short \arg0 + .endm + + .macro reset_bgm + .short 82 + .endm + + .macro scrcmd_083 arg0 + .short 83 + .short \arg0 + .endm + + ; Fade out the music to the target level + ; in the designated number of frames + .macro fade_out_bgm target, frames + .short 84 + .short \target + .short \frames + .endm + + .macro fade_in_bgm arg0 + .short 85 + .short \arg0 + .endm + + .macro scrcmd_086 arg0, arg1 + .short 86 + .byte \arg0 + .byte \arg1 + .endm + + .macro temp_bgm arg0 + .short 87 + .short \arg0 + .endm + + .macro scrcmd_088 arg0 + .short 88 + .byte \arg0 + .endm + + .macro chatot_has_cry arg0 + .short 89 + .short \arg0 + .endm + + .macro chatot_start_recording arg0 + .short 90 + .short \arg0 + .endm + + .macro chatot_stop_recording + .short 91 + .endm + + .macro chatot_save_recording + .short 92 + .endm + + .macro scrcmd_093 + .short 93 + .endm + + .macro apply_movement arg0, arg1 + .short 94 + .short \arg0 + .word \arg1-.-4 + .endm + + .macro wait_movement + .short 95 + .endm + + .macro lockall + .short 96 + .endm + + .macro releaseall + .short 97 + .endm + + .macro lock arg0 + .short 98 + .short \arg0 + .endm + + .macro release arg0 + .short 99 + .short \arg0 + .endm + + .macro show_person arg0 + .short 100 + .short \arg0 + .endm + + .macro hide_person arg0 + .short 101 + .short \arg0 + .endm + + .macro scrcmd_102 arg0, arg1 + .short 102 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_103 + .short 103 + .endm + + .macro faceplayer + .short 104 + .endm + + .macro get_player_coords arg0, arg1 + .short 105 + .short \arg0 + .short \arg1 + .endm + + .macro get_person_coords arg0, arg1, arg2 + .short 106 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_107 arg0, arg1, arg2 + .short 107 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_108 arg0, arg1 + .short 108 + .short \arg0 + .byte \arg1 + .endm + + .macro scrcmd_109 arg0, arg1 + .short 109 + .short \arg0 + .short \arg1 + .endm + + .macro addmoney arg0 + .short 110 + .word \arg0 + .endm + + .macro submoneyimmediate arg0 + .short 111 + .word \arg0 + .endm + + .macro hasenoughmoneyimmediate arg0, arg1 + .short 112 + .short \arg0 + .word \arg1 + .endm + + .macro show_money_box arg0, arg1 + .short 113 + .short \arg0 + .short \arg1 + .endm + + .macro hide_money_box + .short 114 + .endm + + .macro update_money_box + .short 115 + .endm + + .macro scrcmd_116 arg0, arg1, arg2 + .short 116 + .byte \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_117 + .short 117 + .endm + + .macro scrcmd_118 arg0 + .short 118 + .byte \arg0 + .endm + + .macro get_coin_amount arg0 + .short 119 + .short \arg0 + .endm + + .macro give_coins arg0 + .short 120 + .short \arg0 + .endm + + .macro take_coins arg0 + .short 121 + .short \arg0 + .endm + + .macro give_athlete_points arg0 + .short 122 + .short \arg0 + .endm + + .macro take_athlete_points arg0 + .short 123 + .short \arg0 + .endm + + .macro check_athlete_points arg0, arg1 + .short 124 + .short \arg0 + .short \arg1 + .endm + + .macro giveitem arg0, arg1, arg2 + .short 125 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro takeitem arg0, arg1, arg2 + .short 126 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro hasspaceforitem arg0, arg1, arg2 + .short 127 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro hasitem arg0, arg1, arg2 + .short 128 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro itemistmorhm arg0, arg1 + .short 129 + .short \arg0 + .short \arg1 + .endm + + .macro getitempocket arg0, arg1 + .short 130 + .short \arg0 + .short \arg1 + .endm + + .macro set_starter_choice arg0 + .short 131 + .short \arg0 + .endm + + .macro gender_msgbox arg0, arg1 + .short 132 + .byte \arg0 + .byte \arg1 + .endm + + .macro get_seal_quantity arg0, arg1 + .short 133 + .short \arg0 + .short \arg1 + .endm + + .macro give_or_take_seal arg0, arg1 + .short 134 + .short \arg0 + .short \arg1 + .endm + + .macro give_random_seal arg0, arg1, arg2 + .short 135 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_136 arg0, arg1 + .short 136 + .short \arg0 + .short \arg1 + .endm + + .macro give_mon arg0, arg1, arg2, arg3, arg4, arg5 + .short 137 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .short \arg5 + .endm + + .macro give_egg arg0, arg1 + .short 138 + .short \arg0 + .short \arg1 + .endm + + .macro set_mon_move arg0, arg1, arg2 + .short 139 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro mon_has_move arg0, arg1, arg2 + .short 140 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro get_party_slot_with_move arg0, arg1 + .short 141 + .short \arg0 + .short \arg1 + .endm + + .macro get_phone_book_rematch arg0, arg1 + .short 142 + .short \arg0 + .short \arg1 + .endm + + .macro name_rival arg0 + .short 143 + .short \arg0 + .endm + + .macro get_friend_sprite arg0 + .short 144 + .short \arg0 + .endm + + .macro register_pokegear_card arg0 + .short 145 + .byte \arg0 + .endm + + .macro register_gear_number arg0 + .short 146 + .short \arg0 + .endm + + .macro check_registered_phone_number arg0, arg1 + .short 147 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_148 arg0, arg1 + .short 148 + .byte \arg0 + .byte \arg1 + .endm + + .macro scrcmd_149 arg0 + .short 149 + .byte \arg0 + .endm + + .macro scrcmd_150 + .short 150 + .endm + + .macro scrcmd_151 + .short 151 + .endm + + .macro scrcmd_152 + .short 152 + .endm + + .macro scrcmd_153 arg0 + .short 153 + .short \arg0 + .endm + + .macro scrcmd_154 arg0, arg1, arg2 + .short 154 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_155 arg0, arg1 + .short 155 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_156 + .short 156 + .endm + + .macro town_map + .short 157 + .endm + + .macro scrcmd_158 arg0 + .short 158 + .byte \arg0 + .endm + + .macro scrcmd_159 + .short 159 + .endm + + .macro scrcmd_160 + .short 160 + .endm + + .macro scrcmd_161 + .short 161 + .endm + + .macro scrcmd_162 + .short 162 + .endm + + .macro hof_credits arg0 + .short 163 + .short \arg0 + .endm + + .macro scrcmd_164 + .short 164 + .endm + + .macro scrcmd_165 arg0, arg1 + .short 165 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_166 arg0 + .short 166 + .short \arg0 + .endm + + .macro choose_starter + .short 167 + .endm + + .macro get_trainer_path_to_player arg0 + .short 168 + .short \arg0 + .endm + + .macro trainer_step_towards_player arg0, arg1 + .short 169 + .short \arg0 + .short \arg1 + .endm + + .macro get_trainer_eye_type arg0 + .short 170 + .short \arg0 + .endm + + ; For when one or more trainers see you + .macro get_eye_trainer_num arg0, arg1 + .short 171 + .short \arg0 + .short \arg1 + .endm + + .macro name_player arg0 + .short 172 + .short \arg0 + .endm + + .macro nickname_input arg0, arg1 + .short 173 + .short \arg0 + .short \arg1 + .endm + + .macro fade_screen arg0, speed, direction, color + .short 174 + .short \arg0 + .short \speed + .short \direction + .short \color + .endm + + .macro wait_fade + .short 175 + .endm + + .macro warp arg0, arg1=0, arg2, arg3, arg4 + .short 176 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro rock_climb arg0 + .short 177 + .short \arg0 + .endm + + .macro surf arg0 + .short 178 + .short \arg0 + .endm + + .macro waterfall arg0 + .short 179 + .short \arg0 + .endm + + .macro scrcmd_180 arg0, arg1, arg2 + .short 180 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro flash_effect + .short 181 + .endm + + .macro whirlpool arg0 + .short 182 + .short \arg0 + .endm + + .macro scrcmd_183 arg0 + .short 183 + .short \arg0 + .endm + + .macro player_on_bike_check arg0 + .short 184 + .short \arg0 + .endm + + .macro player_on_bike_set arg0 + .short 185 + .byte \arg0 + .endm + + .macro scrcmd_186 arg0 + .short 186 + .byte \arg0 + .endm + + ; Get the player's overworld state. + ; Used in some places to determine whether + ; the player is masquerading as a member + ; of Team Rocket. + .macro get_player_state var + .short 187 + .short \var + .endm + + .macro set_avatar_bits arg0 + .short 188 + .short \arg0 + .endm + + .macro update_avatar_state + .short 189 + .endm + + ; In the buffer_XXX commands, the maximum + ; acceptable value for the slot arg is 7. + ; This sets the message format placeholder + ; to whatever is buffered. + .macro buffer_players_name slot + .short 190 + .byte \slot + .endm + + ; If you use this before naming your rival, + ; this will be an empty string. + .macro buffer_rivals_name slot + .short 191 + .byte \slot + .endm + + .macro buffer_friends_name slot + .short 192 + .byte \slot + .endm + + ; For these commands, the additional argument + ; is a flex arg, meaning it can be a literal + ; or a variable. + .macro buffer_mon_species_name slot, party_pos + .short 193 + .byte \slot + .short \party_pos + .endm + + .macro buffer_item_name slot, item + .short 194 + .byte \slot + .short \item + .endm + + .macro buffer_pocket_name slot, pocket + .short 195 + .byte \slot + .short \pocket + .endm + + .macro buffer_tmhm_move_name slot, tmhm + .short 196 + .byte \slot + .short \tmhm + .endm + + .macro buffer_move_name slot, move + .short 197 + .byte \slot + .short \move + .endm + + .macro buffer_int slot, value + .short 198 + .byte \slot + .short \value + .endm + + .macro bufferpartymonnick slot, party_pos + .short 199 + .byte \slot + .short \party_pos + .endm + + .macro buffer_trainer_class_name slot, trcls + .short 200 + .byte \slot + .short \trcls + .endm + + .macro buffer_player_union_avatar_class_name slot + .short 201 + .byte \slot + .endm + + ; The other two args here are unused + .macro buffer_species_name slot, species, arg2, arg3 + .short 202 + .byte \slot + .short \species + .short \arg2 + .byte \arg3 + .endm + + .macro buffer_starter_species_name slot + .short 203 + .byte \slot + .endm + + ; These two commands are leftover from Platinum. + ; As such, they are configured to check for the + ; Sinnoh starters instead of the Johto starters. + ; Since the player will never start with any of + ; Turtwig, Chimchar, or Piplup, this command + ; will always return TURTWIG, and the following + ; CHIMCHAR. + ; These commands are unused in HGSS. + .macro buffer_dppt_rival_starter_species_name slot + .short 204 + .byte \slot + .endm + + .macro buffer_dppt_friend_starter_species_name slot + .short 205 + .byte \slot + .endm + + ; Gets your starter species into the indicated + ; variable. Used to calculate which rival + ; party to use. + .macro get_starter_choice var + .short 206 + .short \var + .endm + + .macro buffer_decoration_name slot, deco + .short 207 + .byte \slot + .short \deco + .endm + + ; Dummy + .macro scrcmd_208 slot, unk + .short 208 + .byte \slot + .short \unk + .endm + + ; Dummy + .macro scrcmd_209 slot, unk + .short 209 + .byte \slot + .short \unk + .endm + + .macro buffer_map_sec_name slot, location + .short 210 + .byte \slot + .short \location + .endm + + .macro scrcmd_211 arg0, arg1 + .short 211 + .short \arg0 + .short \arg1 + .endm + + ; For when you talk to a trainer + .macro get_trainer_num arg0 + .short 212 + .short \arg0 + .endm + + .macro trainer_battle trainer, arg1, arg2, arg3 + .short 213 + .short \trainer + .short \arg1 + .byte \arg2 + .byte \arg3 + .endm + + .macro trainer_message trainer, param + .short 214 + .short \trainer + .short \param + .endm + + .macro get_trainer_msg_params intro, after, _1poke + .short 215 + .short \intro + .short \after + .short \_1poke + .endm + + .macro get_rematch_msg_params arg0, arg1, arg2 + .short 216 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro trainer_is_double_battle arg0 + .short 217 + .short \arg0 + .endm + + .macro encounter_music arg0 + .short 218 + .short \arg0 + .endm + + .macro white_out + .short 219 + .endm + + ; Is this loss? + .macro check_battle_won var + .short 220 + .short \var + .endm + + .macro scrcmd_221 arg0, arg1 + .short 221 + .short \arg0 + .byte \arg1 + .endm + + .macro party_check_for_double arg0 + .short 222 + .short \arg0 + .endm + + .macro scrcmd_223 + .short 223 + .endm + + .macro scrcmd_224 + .short 224 + .endm + + .macro goto_if_trainer_defeated arg0 + .short 225 + .word \arg0-.-4 + .endm + + .macro scrcmd_226 arg0, arg1, arg2, arg3 + .short 226 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_227 arg0, arg1, arg2, arg3 + .short 227 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_228 arg0 + .short 228 + .short \arg0 + .endm + + .macro scrcmd_229 arg0 + .short 229 + .short \arg0 + .endm + + .macro scrcmd_230 + .short 230 + .endm + + .macro scrcmd_231 + .short 231 + .endm + + .macro scrcmd_232 arg0 + .short 232 + .short \arg0 + .endm + + .macro scrcmd_233 arg0 + .short 233 + .short \arg0 + .endm + + .macro scrcmd_234 arg0, arg1, arg2, arg3 + .short 234 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_235 arg0 + .short 235 + .short \arg0 + .endm + + .macro scrcmd_236 arg0 + .short 236 + .short \arg0 + .endm + + .macro scrcmd_237 + .short 237 + .endm + + .macro party_has_pokerus arg0 + .short 238 + .short \arg0 + .endm + + .macro mon_get_gender arg0, arg1 + .short 239 + .short \arg0 + .short \arg1 + .endm + + .macro set_dynamic_warp arg0, arg1, arg2, arg3, arg4 + .short 240 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro get_dynamic_warp_floor_no arg0 + .short 241 + .short \arg0 + .endm + + .macro elevator_cur_floor_box arg0, arg1, arg2, arg3 + .short 242 + .byte \arg0 + .byte \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro count_johto_dex_seen var + .short 243 + .short \var + .endm + + .macro count_johto_dex_owned var + .short 244 + .short \var + .endm + + .macro count_national_dex_seen var + .short 245 + .short \var + .endm + + .macro count_national_dex_owned var + .short 246 + .short \var + .endm + + ; Dummy + .macro scrcmd_247 + .short 247 + .endm + + ; The actual Pokedex evaluation. + ; national: 0 = Johto dex, 1 = National dex + ; msg: Variable to return the message ID + ; fanfare: Variable to return the fanfare ID + .macro get_dex_eval_result national, msg, fanfare + .short 248 + .byte \national + .short \msg + .short \fanfare + .endm + + .macro rocket_trap_battle arg0, arg1 + .short 249 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_250 arg0, arg1 + .short 250 + .short \arg0 + .short \arg1 + .endm + + .macro catching_tutorial + .short 251 + .endm + + .macro scrcmd_252 + .short 252 + .endm + + .macro get_save_file_state arg0 + .short 253 + .short \arg0 + .endm + + .macro save_game_normal arg0 + .short 254 + .short \arg0 + .endm + + .macro scrcmd_255 arg0, arg1 + .short 255 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_256 arg0 + .short 256 + .short \arg0 + .endm + + .macro scrcmd_257 arg0 + .short 257 + .short \arg0 + .endm + + .macro scrcmd_258 + .short 258 + .endm + + .macro scrcmd_259 arg0 + .short 259 + .short \arg0 + .endm + + .macro scrcmd_260 arg0 + .short 260 + .short \arg0 + .endm + + .macro scrcmd_261 arg0 + .short 261 + .short \arg0 + .endm + + .macro scrcmd_262 + .short 262 + .endm + + .macro scrcmd_263 + .short 263 + .endm + + .macro scrcmd_264 arg0 + .short 264 + .short \arg0 + .endm + + .macro scrcmd_265 + .short 265 + .endm + + .macro scrcmd_266 + .short 266 + .endm + + .macro scrcmd_267 arg0, arg1 + .short 267 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_268 arg0 + .short 268 + .short \arg0 + .endm + + .macro scrcmd_269 arg0 + .short 269 + .short \arg0 + .endm + + .macro scrcmd_270 + .short 270 + .endm + + .macro scrcmd_271 arg0, arg1 + .short 271 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_272 arg0 + .short 272 + .short \arg0 + .endm + + .macro scrcmd_273 arg0 + .short 273 + .short \arg0 + .endm + + .macro scrcmd_274 arg0, arg1 + .short 274 + .short \arg0 + .short \arg1 + .endm + + .macro mart_buy arg0 + .short 275 + .short \arg0 + .endm + + .macro special_mart_buy arg0 + .short 276 + .short \arg0 + .endm + + .macro decoration_mart arg0 + .short 277 + .short \arg0 + .endm + + .macro seal_mart arg0 + .short 278 + .short \arg0 + .endm + + ; Used with poison faint, but due to overworld + ; poison mechanics in gen 4, this is + ; never reached. + .macro overworld_white_out + .short 279 + .endm + + .macro set_spawn arg0 + .short 280 + .short \arg0 + .endm + + ; Are you a boy? Or are you a girl? + .macro get_player_gender var + .short 281 + .short \var + .endm + + .macro heal_party + .short 282 + .endm + + .macro scrcmd_283 + .short 283 + .endm + + .macro scrcmd_284 + .short 284 + .endm + + .macro scrcmd_285 arg0 + .short 285 + .short \arg0 + .endm + + .macro scrcmd_286 + .short 286 + .endm + + .macro scrcmd_287 + .short 287 + .endm + + .macro scrcmd_288 arg0, arg1 + .short 288 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_289 arg0 + .short 289 + .short \arg0 + .endm + + .macro check_pokedex arg0 + .short 290 + .short \arg0 + .endm + + .macro give_pokedex + .short 291 + .endm + + .macro check_running_shoes arg0 + .short 292 + .short \arg0 + .endm + + .macro give_running_shoes + .short 293 + .endm + + .macro check_badge badge, var + .short 294 + .short \badge + .short \var + .endm + + .macro give_badge badge + .short 295 + .short \badge + .endm + + ; This command is never used because it is + ; assumed that you cannot get the 8th badge + ; before the other 7, or the 16th before the + ; other 15. This assumption does not account + ; for tweaking. + .macro count_badges var + .short 296 + .short \var + .endm + + .macro scrcmd_297 arg0 + .short 297 + .short \arg0 + .endm + + .macro scrcmd_298 + .short 298 + .endm + + .macro check_escort_mode arg0 + .short 299 + .short \arg0 + .endm + + .macro set_escort_mode + .short 300 + .endm + + .macro clear_escort_mode + .short 301 + .endm + + .macro scrcmd_302 arg0 + .short 302 + .short \arg0 + .endm + + .macro scrcmd_303 + .short 303 + .endm + + .macro scrcmd_304 + .short 304 + .endm + + .macro scrcmd_305 arg0 + .short 305 + .short \arg0 + .endm + + .macro scrcmd_306 + .short 306 + .endm + + .macro scrcmd_307 arg0, arg1, arg2, arg3, arg4 + .short 307 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .byte \arg4 + .endm + + .macro scrcmd_308 arg0 + .short 308 + .byte \arg0 + .endm + + .macro scrcmd_309 arg0 + .short 309 + .byte \arg0 + .endm + + .macro scrcmd_310 arg0 + .short 310 + .byte \arg0 + .endm + + .macro scrcmd_311 arg0 + .short 311 + .byte \arg0 + .endm + + .macro buffer_day_care_mon_nicks + .short 312 + .endm + + .macro get_day_care_state arg0 + .short 313 + .short \arg0 + .endm + + .macro ecruteak_gym_init + .short 314 + .endm + + .macro scrcmd_315 + .short 315 + .endm + + .macro scrcmd_316 + .short 316 + .endm + + .macro scrcmd_317 arg0 + .short 317 + .byte \arg0 + .endm + + .macro cianwood_gym_init + .short 318 + .endm + + .macro cianwood_gym_turn_winch arg0 + .short 319 + .short \arg0 + .endm + + .macro vermilion_gym_init + .short 320 + .endm + + .macro vermilion_gym_lock_action arg0, arg1 + .short 321 + .byte \arg0 + .byte \arg1 + .endm + + .macro vermilion_gym_can_check arg0, arg1 + .short 322 + .byte \arg0 + .short \arg1 + .endm + + .macro resample_vermilion_gym_cans + .short 323 + .endm + + .macro violet_gym_init + .short 324 + .endm + + .macro violet_gym_elevator + .short 325 + .endm + + .macro azalea_gym_init + .short 326 + .endm + + .macro azalea_gym_spinarak arg0 + .short 327 + .byte \arg0 + .endm + + .macro azalea_gym_switch arg0 + .short 328 + .byte \arg0 + .endm + + .macro blackthorn_gym_init + .short 329 + .endm + + .macro fuchsia_gym_init + .short 330 + .endm + + .macro viridian_gym_init + .short 331 + .endm + + .macro get_party_count var + .short 332 + .short \var + .endm + + .macro scrcmd_333 arg0 + .short 333 + .byte \arg0 + .endm + + .macro scrcmd_334 arg0 + .short 334 + .short \arg0 + .endm + + .macro scrcmd_335 arg0, arg1 + .short 335 + .short \arg0 + .short \arg1 + .endm + + .macro buffer_berry_name slot, item, quantity + .short 336 + .byte \slot + .short \item + .short \quantity + .endm + + .macro buffer_nature_name slot, nature + .short 337 + .byte \slot + .short \nature + .endm + + .macro move_person arg0, arg1, arg2 + .short 338 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro move_person_facing person, x, z, y, facing + .short 339 + .short \person + .short \x + .short \z + .short \y + .short \facing + .endm + + .macro set_object_movement_type arg0, arg1 + .short 340 + .short \arg0 + .short \arg1 + .endm + + .macro set_object_facing arg0, arg1 + .short 341 + .short \arg0 + .short \arg1 + .endm + + .macro move_warp arg0, arg1, arg2 + .short 342 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro move_bg_event arg0, arg1, arg2 + .short 343 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_344 arg0, arg1 + .short 344 + .short \arg0 + .short \arg1 + .endm + + .macro add_waiting_icon + .short 345 + .endm + + .macro remove_waiting_icon + .short 346 + .endm + + .macro scrcmd_347 arg0 + .short 347 + .short \arg0 + .endm + + .macro wait_button_or_delay arg0 + .short 348 + .short \arg0 + .endm + + .macro party_select_ui + .short 349 + .endm + + .macro scrcmd_350 + .short 350 + .endm + + .macro get_party_selection arg0 + .short 351 + .short \arg0 + .endm + + .macro choose_move_ui arg0, arg1, arg2 + .short 352 + .byte \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro get_move_selection arg0, arg1 + .short 353 + .byte \arg0 + .short \arg1 + .endm + + .macro get_partymon_species slot, var + .short 354 + .short \slot + .short \var + .endm + + .macro partymon_is_mine slot, var + .short 355 + .short \slot + .short \var + .endm + + .macro party_count_not_egg var + .short 356 + .short \var + .endm + + ; Count Pokemon that are not fainted. + ; If except is set, exclude that slot + ; from the tally. Use 6 to disable. + .macro count_alive_mons var, except=PARTY_SIZE + .short 357 + .short \var + .short \except + .endm + + .macro count_alive_mons_and_pc arg0 + .short 358 + .short \arg0 + .endm + + .macro party_count_egg arg0 + .short 359 + .short \arg0 + .endm + + .macro submoneyvar var + .short 360 + .short \var + .endm + + .macro retrieve_day_care_mon arg0, arg1 + .short 361 + .short \arg0 + .short \arg1 + .endm + + .macro give_loan_mon arg0, arg1, arg2 + .short 362 + .byte \arg0 + .byte \arg1 + .short \arg2 + .endm + + .macro check_return_loan_mon arg0, arg1, arg2 + .short 363 + .byte \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro return_loan_mon arg0 + .short 364 + .short \arg0 + .endm + + .macro reset_day_care_egg + .short 365 + .endm + + .macro give_day_care_egg + .short 366 + .endm + + .macro buffer_day_care_withdraw_cost arg0, arg1 + .short 367 + .short \arg0 + .short \arg1 + .endm + + .macro hasenoughmoneyvar var, amount + .short 368 + .short \var + .short \amount + .endm + + .macro egg_hatch_anim + .short 369 + .endm + + .macro scrcmd_370 arg0 + .short 370 + .byte \arg0 + .endm + + .macro buffer_day_care_mon_growth arg0, arg1 + .short 371 + .short \arg0 + .short \arg1 + .endm + + .macro get_tail_day_care_mon_species_and_nick arg0 + .short 372 + .short \arg0 + .endm + + .macro put_mon_in_day_care arg0 + .short 373 + .short \arg0 + .endm + + .macro scrcmd_374 arg0 + .short 374 + .short \arg0 + .endm + + .macro scrcmd_375 arg0 + .short 375 + .short \arg0 + .endm + + .macro scrcmd_376 + .short 376 + .endm + + .macro scrcmd_377 arg0 + .short 377 + .short \arg0 + .endm + + .macro scrcmd_378 arg0, arg1 + .short 378 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_379 arg0 + .short 379 + .short \arg0 + .endm + + .macro random arg0, arg1 + .short 380 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_381 arg0, arg1 + .short 381 + .short \arg0 + .short \arg1 + .endm + + .macro mon_get_friendship arg0, arg1 + .short 382 + .short \arg0 + .short \arg1 + .endm + + .macro mon_add_friendship arg0, arg1 + .short 383 + .short \arg0 + .short \arg1 + .endm + + .macro mon_subtract_friendship arg0, arg1 + .short 384 + .short \arg0 + .short \arg1 + .endm + + .macro buffer_day_care_mon_stats arg0, arg1, arg2, arg3 + .short 385 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro get_player_facing arg0 + .short 386 + .short \arg0 + .endm + + .macro get_day_care_compatibility arg0 + .short 387 + .short \arg0 + .endm + + .macro check_day_care_egg arg0 + .short 388 + .short \arg0 + .endm + + .macro player_has_species arg0, arg1 + .short 389 + .short \arg0 + .short \arg1 + .endm + + .macro size_record_compare arg0, arg1 + .short 390 + .short \arg0 + .short \arg1 + .endm + + .macro size_record_update arg0 + .short 391 + .short \arg0 + .endm + + .macro buffer_mon_size arg0, arg1, arg2 + .short 392 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro buffer_record_size arg0, arg1, arg2 + .short 393 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_394 arg0 + .short 394 + .short \arg0 + .endm + + .macro scrcmd_395 arg0 + .short 395 + .short \arg0 + .endm + + .macro count_mon_moves arg0, arg1 + .short 396 + .short \arg0 + .short \arg1 + .endm + + .macro mon_forget_move arg0, arg1 + .short 397 + .short \arg0 + .short \arg1 + .endm + + .macro mon_get_move arg0, arg1, arg2 + .short 398 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro buffer_party_mon_move_name slot, party_pos, move_pos + .short 399 + .byte \slot + .short \party_pos + .short \move_pos + .endm + + ; action = 0: Deactivate strength + ; action = 1: Activate strength + ; action = 2: Check whether strength is active + .macro strength_flag_action action, var=0 + .short 400 + .byte \action + .if \action == 2 + .short \var + .endif + .endm + + .macro flash_action action, var=0 + .short 401 + .byte \action + .if \action == 2 + .short \var + .endif + .endm + + .macro defog_action action, var=0 + .short 402 + .byte \action + .if \action == 2 + .short \var + .endif + .endm + + .macro scrcmd_403 arg0, arg1 + .short 403 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_404 arg0, arg1, arg2 + .short 404 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_405 arg0, arg1, arg2 + .short 405 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_406 arg0 + .short 406 + .short \arg0 + .endm + + .macro scrcmd_407 arg0, arg1 + .short 407 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_408 arg0, arg1 + .short 408 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_409 + .short 409 + .endm + + .macro scrcmd_410 arg0, arg1 + .short 410 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_411 + .short 411 + .endm + + .macro scrcmd_412 arg0, arg1, arg2 + .short 412 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_413 arg0, arg1, arg2, arg3 + .short 413 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_414 arg0 + .short 414 + .short \arg0 + .endm + + .macro scrcmd_415 arg0 + .short 415 + .short \arg0 + .endm + + .macro scrcmd_416 arg0, arg1, arg2 + .short 416 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_417 arg0, arg1 + .short 417 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_418 arg0, arg1 + .short 418 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_419 arg0 + .short 419 + .short \arg0 + .endm + + .macro scrcmd_420 arg0 + .short 420 + .short \arg0 + .endm + + .macro scrcmd_421 arg0, arg1, arg2 + .short 421 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_422 arg0, arg1, arg2, arg3 + .short 422 + .short \arg0 + .short \arg1 + .short \arg2 + .byte \arg3 + .endm + + .macro check_johto_dex_complete arg0 + .short 423 + .short \arg0 + .endm + + .macro check_national_dex_complete arg0 + .short 424 + .short \arg0 + .endm + + .macro scrcmd_425 arg0 + .short 425 + .short \arg0 + .endm + + .macro kenya_check arg0, arg1, arg2 + .short 426 + .short \arg0 + .short \arg1 + .byte \arg2 + .endm + + .macro scrcmd_427 arg0 + .short 427 + .short \arg0 + .endm + + .macro mon_give_mail arg0 + .short 428 + .short \arg0 + .endm + + .macro countfossils arg0 + .short 429 + .short \arg0 + .endm + + .macro set_phone_call arg0, arg1, arg2 + .short 430 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro run_phone_call + .short 431 + .endm + + .macro getfossilpokemon arg0, arg1 + .short 432 + .short \arg0 + .short \arg1 + .endm + + .macro getfossilminimumamount arg0, arg1, arg2 + .short 433 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro party_count_mons_at_or_below_level arg0, arg1 + .short 434 + .short \arg0 + .short \arg1 + .endm + + .macro survive_poisoning arg0, arg1 + .short 435 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_436 + .short 436 + .endm + + .macro debugwatch arg0 + .short 437 + .short \arg0 + .endm + + .macro get_std_msg_naix arg0, arg1 + .short 438 + .short \arg0 + .short \arg1 + .endm + + .macro non_npc_msg_extern arg0, arg1 + .short 439 + .short \arg0 + .short \arg1 + .endm + + .macro msgbox_extern arg0, arg1 + .short 440 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_441 arg0, arg1, arg2, arg3 + .short 441 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_442 arg0, arg1, arg2, arg3 + .short 442 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_443 arg0 + .short 443 + .byte \arg0 + .endm + + .macro scrcmd_444 arg0, arg1, arg2, arg3 + .short 444 + .byte \arg0 + .short \arg1 + .short \arg2 + .byte \arg3 + .endm + + .macro scrcmd_445 arg0 + .short 445 + .short \arg0 + .endm + + .macro scrcmd_446 arg0 + .short 446 + .short \arg0 + .endm + + .macro safari_zone_action arg0, arg1 + .short 447 + .byte \arg0 + .byte \arg1 + .endm + + .macro scrcmd_448 arg0, arg1, arg2, arg3, arg4 + .short 448 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scrcmd_449 + .short 449 + .endm + + .macro scrcmd_450 + .short 450 + .endm + + .macro scrcmd_451 arg0 + .short 451 + .short \arg0 + .endm + + .macro scrcmd_452 arg0, arg1 + .short 452 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_453 + .short 453 + .endm + + .macro scrcmd_454 + .short 454 + .endm + + .macro scrcmd_455 + .short 455 + .endm + + .macro scrcmd_456 arg0 + .short 456 + .byte \arg0 + .endm + + .macro mon_get_nature arg0, arg1 + .short 457 + .short \arg0 + .short \arg1 + .endm + + .macro get_party_slot_with_nature arg0, arg1 + .short 458 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_459 + .short 459 + .endm + + .macro load_phone_dat arg0, arg1 + .short 460 + .short \arg0 + .short \arg1 + .endm + + .macro get_phone_contact_msg_ids arg0, arg1, arg2 + .short 461 + .byte \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_462 arg0 + .short 462 + .short \arg0 + .endm + + .macro enable_mass_outbreaks + .short 463 + .endm + + .macro create_roamer arg0 + .short 464 + .byte \arg0 + .endm + + .macro scrcmd_465 arg0, arg1=0, arg2=0 + .short 465 + .short \arg0 + .if \arg0 <= 3 + .short \arg1 + .short \arg2 + .else + .if \arg0 != 6 + .short \arg1 + .endif + .endif + .endm + + .macro scrcmd_466 arg0, arg1 + .short 466 + .short \arg0 + .short \arg1 + .endm + + .macro move_relearner_init arg0 + .short 467 + .short \arg0 + .endm + + .macro move_tutor_init arg0, arg1 + .short 468 + .short \arg0 + .short \arg1 + .endm + + .macro move_relearner_get_result arg0 + .short 469 + .short \arg0 + .endm + + .macro load_npc_trade arg0 + .short 470 + .byte \arg0 + .endm + + .macro get_offered_species arg0 + .short 471 + .short \arg0 + .endm + + .macro npc_trade_get_req_species arg0 + .short 472 + .short \arg0 + .endm + + .macro npc_trade_exec arg0 + .short 473 + .short \arg0 + .endm + + .macro npc_trade_end + .short 474 + .endm + + .macro scrcmd_475 + .short 475 + .endm + + .macro scrcmd_476 + .short 476 + .endm + + .macro nat_dex_flag_action arg0, arg1 + .short 477 + .byte \arg0 + .short \arg1 + .endm + + .macro mon_get_ribbon_count arg0, arg1 + .short 478 + .short \arg0 + .short \arg1 + .endm + + .macro party_get_ribbon_count arg0 + .short 479 + .short \arg0 + .endm + + .macro mon_has_ribbon arg0, arg1, arg2 + .short 480 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro give_ribbon arg0, arg1 + .short 481 + .short \arg0 + .short \arg1 + .endm + + .macro buffer_ribbon_name arg0, arg1 + .short 482 + .byte \arg0 + .short \arg1 + .endm + + .macro get_ev_total arg0, arg1 + .short 483 + .short \arg0 + .short \arg1 + .endm + + .macro get_weekday arg0 + .short 484 + .short \arg0 + .endm + + .macro scrcmd_485 arg0 + .short 485 + .short \arg0 + .endm + + .macro dummy_486 + .short 486 + .endm + + .macro pokecen_anim arg0 + .short 487 + .short \arg0 + .endm + + .macro elevator_anim direction, distance + .short 488 + .short \direction + .short \distance + .endm + + .macro mystery_gift arg0, arg1=0, arg2=0 + .short 489 + .short \arg0 + .if \arg0 >= 1 && \arg0 <= 3 + .short \arg1 + .else + .if \arg0 == 5 || \arg0 == 6 + .short \arg1 + .short \arg2 + .endif + .endif + .endm + + .macro nop_var_490 arg0 + .short 490 + .short \arg0 + .endm + + .macro scrcmd_491 arg0 + .short 491 + .short \arg0 + .endm + + .macro scrcmd_492 arg0, arg1, arg2 + .short 492 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro prompt_easy_chat arg0, arg1, arg2 + .short 493 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_494 arg0, arg1 + .short 494 + .short \arg0 + .short \arg1 + .endm + + .macro get_game_version arg0 + .short 495 + .short \arg0 + .endm + + .macro get_party_lead arg0 + .short 496 + .short \arg0 + .endm + + .macro get_mon_types arg0, arg1, arg2 + .short 497 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro primo_password_check_1 arg0, arg1, arg2, arg3, arg4 + .short 498 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro primo_password_check_2 arg0, arg1, arg2, arg3, arg4 + .short 499 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scrcmd_500 arg0 + .short 500 + .byte \arg0 + .endm + + .macro scrcmd_501 arg0 + .short 501 + .byte \arg0 + .endm + + .macro scrcmd_502 arg0 + .short 502 + .byte \arg0 + .endm + + .macro loto_id_get arg0 + .short 503 + .short \arg0 + .endm + + .macro loto_id_search arg0, arg1, arg2, arg3 + .short 504 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro loto_id_set + .short 505 + .endm + + .macro bufferboxmonnick arg0, arg1 + .short 506 + .byte \arg0 + .short \arg1 + .endm + + .macro count_pc_empty_space arg0 + .short 507 + .short \arg0 + .endm + + .macro scrcmd_508 arg0 + .short 508 + .short \arg0 + .endm + + .macro scrcmd_509 arg0 + .short 509 + .short \arg0 + .endm + + .macro scrcmd_510 + .short 510 + .endm + + .macro pal_park_score_get arg0, arg1 + .short 511 + .short \arg0 + .short \arg1 + .endm + + .macro player_movement_saving_set + .short 512 + .endm + + .macro player_movement_saving_clear + .short 513 + .endm + + ; Animate placing the balls on the machine + ; for the Hall of Fame + .macro hall_of_fame_anim num + .short 514 + .short \num + .endm + + .macro add_special_game_stat arg0 + .short 515 + .short \arg0 + .endm + + .macro buffer_fashion_name arg0, arg1 + .short 516 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_517 arg0, arg1 + .short 517 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_518 arg0 + .short 518 + .short \arg0 + .endm + + .macro scrcmd_519 arg0 + .short 519 + .short \arg0 + .endm + + .macro scrcmd_520 + .short 520 + .endm + + .macro scrcmd_521 + .short 521 + .endm + + .macro scrcmd_522 arg0 + .short 522 + .short \arg0 + .endm + + .macro scrcmd_523 arg0, arg1, arg2, arg3, arg4 + .short 523 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scrcmd_524 arg0, arg1, arg2 + .short 524 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_525 arg0 + .short 525 + .short \arg0 + .endm + + .macro scrcmd_526 arg0 + .short 526 + .short \arg0 + .endm + + .macro scrcmd_527 arg0 + .short 527 + .short \arg0 + .endm + + .macro scrcmd_528 arg0 + .short 528 + .short \arg0 + .endm + + .macro get_party_lead_alive arg0 + .short 529 + .short \arg0 + .endm + + .macro scrcmd_530 arg0, arg1 + .short 530 + .short \arg0 + .byte \arg1 + .endm + + .macro buffer_background_name arg0, arg1 + .short 531 + .byte \arg0 + .short \arg1 + .endm + + .macro check_coins_immediate arg0, arg1 + .short 532 + .short \arg0 + .word \arg1 + .endm + + .macro checkgivecoins arg0, arg1 + .short 533 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_534 arg0 + .short 534 + .short \arg0 + .endm + + .macro mon_get_level arg0, arg1 + .short 535 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_536 arg0, arg1 + .short 536 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_537 + .short 537 + .endm + + .macro scrcmd_538 arg0, arg1 + .short 538 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_539 arg0 + .short 539 + .short \arg0 + .endm + + .macro scrcmd_540 arg0 + .short 540 + .short \arg0 + .endm + + .macro buffer_int_ex arg0, arg1, arg2, arg3 + .short 541 + .byte \arg0 + .short \arg1 + .byte \arg2 + .byte \arg3 + .endm + + .macro mon_get_contest_value arg0, arg1, arg2 + .short 542 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_543 arg0 + .short 543 + .short \arg0 + .endm + + .macro scrcmd_544 arg0, arg1 + .short 544 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_545 arg0 + .short 545 + .short \arg0 + .endm + + .macro scrcmd_546 arg0, arg1 + .short 546 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_547 arg0 + .short 547 + .short \arg0 + .endm + + .macro scrcmd_548 + .short 548 + .endm + + .macro scrcmd_549 arg0 + .short 549 + .short \arg0 + .endm + + .macro scrcmd_550 arg0 + .short 550 + .short \arg0 + .endm + + .macro scrcmd_551 arg0 + .short 551 + .short \arg0 + .endm + + .macro scrcmd_552 arg0, arg1 + .short 552 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_553 arg0, arg1 + .short 553 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_554 arg0 + .short 554 + .short \arg0 + .endm + + .macro scrcmd_555 arg0 + .short 555 + .short \arg0 + .endm + + .macro scrcmd_556 arg0 + .short 556 + .short \arg0 + .endm + + .macro check_battle_points arg0, arg1 + .short 557 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_558 arg0, arg1 + .short 558 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_559 arg0, arg1 + .short 559 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_560 arg0, arg1 + .short 560 + .short \arg0 + .short \arg1 + .endm + + .macro screen_shake arg0, arg1, arg2, arg3 + .short 561 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro multi_battle arg0, arg1, arg2, arg3 + .short 562 + .short \arg0 + .short \arg1 + .short \arg2 + .byte \arg3 + .endm + + .macro scrcmd_563 arg0, arg1, arg2 + .short 563 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_564 arg0 + .short 564 + .short \arg0 + .endm + + .macro scrcmd_565 arg0 + .short 565 + .short \arg0 + .endm + + .macro scrcmd_566 + .short 566 + .endm + + .macro getdpplprizeitemidandcost arg0, arg1, arg2 + .short 567 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_568 arg0, arg1 + .short 568 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_569 arg0 + .short 569 + .short \arg0 + .endm + + .macro check_coins_var arg0, arg1 + .short 570 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_571 arg0, arg1, arg2, arg3, arg4 + .short 571 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro get_unique_seals_quantity arg0 + .short 572 + .short \arg0 + .endm + + .macro scrcmd_573 + .short 573 + .endm + + .macro scrcmd_574 arg0, arg1 + .short 574 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_575 arg0, arg1 + .short 575 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_576 arg0 + .short 576 + .short \arg0 + .endm + + .macro scrcmd_577 + .short 577 + .endm + + .macro scrcmd_578 + .short 578 + .endm + + .macro scrcmd_579 + .short 579 + .endm + + .macro buffer_seal_name arg0, arg1 + .short 580 + .byte \arg0 + .short \arg1 + .endm + + .macro lock_last_talked + .short 581 + .endm + + .macro scrcmd_582 arg0, arg1, arg2 + .short 582 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_583 arg0, arg1 + .short 583 + .short \arg0 + .byte \arg1 + .endm + + .macro party_legal_check arg0 + .short 584 + .short \arg0 + .endm + + .macro scrcmd_585 + .short 585 + .endm + + .macro scrcmd_586 arg0 + .short 586 + .short \arg0 + .endm + + .macro scrcmd_587 + .short 587 + .endm + + .macro scrcmd_588 arg0 + .short 588 + .short \arg0 + .endm + + .macro wild_battle species, level, shiny=0 + .short 589 + .short \species + .short \level + .byte \shiny + .endm + + .macro get_trcard_stars arg0 + .short 590 + .short \arg0 + .endm + + .macro scrcmd_591 + .short 591 + .endm + + .macro scrcmd_592 arg0 + .short 592 + .short \arg0 + .endm + + .macro show_save_stats + .short 593 + .endm + + .macro hide_save_stats + .short 594 + .endm + + .macro scrcmd_595 arg0 + .short 595 + .byte \arg0 + .endm + + .macro scrcmd_596 arg0 + .short 596 + .short \arg0 + .endm + + .macro scrcmd_597 + .short 597 + .endm + + .macro scrcmd_598 arg0 + .short 598 + .short \arg0 + .endm + + .macro scrcmd_599 + .short 599 + .endm + + .macro scrcmd_600 + .short 600 + .endm + + .macro follow_poke_face_player + .short 601 + .endm + + .macro scrcmd_602 arg0 + .short 602 + .short \arg0 + .endm + + .macro scrcmd_603 + .short 603 + .endm + + .macro scrcmd_604 arg0 + .short 604 + .short \arg0 + .endm + + .macro scrcmd_605 arg0, arg1 + .short 605 + .byte \arg0 + .byte \arg1 + .endm + + .macro scrcmd_606 + .short 606 + .endm + + .macro scrcmd_607 + .short 607 + .endm + + .macro scrcmd_608 + .short 608 + .endm + + .macro scrcmd_609 + .short 609 + .endm + + .macro scrcmd_610 arg0 + .short 610 + .short \arg0 + .endm + + .macro pokeathlon arg0, arg1, arg2, arg3, arg4, arg5, arg6 + .short 611 + .byte \arg0 + .byte \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .short \arg5 + .short \arg6 + .endm + + .macro get_npc_trade_unused_flag arg0 + .short 612 + .short \arg0 + .endm + + .macro get_phone_contact_random_gift_berry arg0 + .short 613 + .short \arg0 + .endm + + .macro get_phone_contact_gift_item arg0 + .short 614 + .short \arg0 + .endm + + .macro cameron_photo arg0 + .short 615 + .short \arg0 + .endm + + .macro scrcmd_616 arg0 + .short 616 + .short \arg0 + .endm + + .macro scrcmd_617 + .short 617 + .endm + + .macro photo_album_is_full arg0 + .short 618 + .short \arg0 + .endm + + .macro rocket_costume_flag_check arg0 + .short 619 + .short \arg0 + .endm + + .macro rocket_costume_flag_action arg0 + .short 620 + .byte \arg0 + .endm + + .macro scrcmd_621 + .short 621 + .endm + + .macro scrcmd_622 arg0, arg1 + .short 622 + .short \arg0 + .short \arg1 + .endm + + .macro anim_apricorn_tree arg0 + .short 623 + .short \arg0 + .endm + + .macro apricorn_tree_get_apricorn arg0 + .short 624 + .short \arg0 + .endm + + .macro give_apricorn_from_tree arg0, arg1, arg2 + .short 625 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro buffer_apricorn_name arg0, arg1 + .short 626 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_627 arg0 + .short 627 + .byte \arg0 + .endm + + .macro scrcmd_628 arg0, arg1 + .short 628 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_629 + .short 629 + .endm + + .macro scrcmd_630 arg0 + .short 630 + .short \arg0 + .endm + + .macro scrcmd_631 arg0, arg1, arg2 + .short 631 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro count_party_mons_of_species arg0, arg1 + .short 632 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_633 arg0, arg1, arg2 + .short 633 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_634 arg0, arg1 + .short 634 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_635 arg0, arg1 + .short 635 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_636 arg0 + .short 636 + .short \arg0 + .endm + + .macro scrcmd_637 arg0, arg1, arg2 + .short 637 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_638 arg0, arg1, arg2 + .short 638 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_639 arg0, arg1, arg2 + .short 639 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_640 arg0 + .short 640 + .short \arg0 + .endm + + .macro save_wipe_extra_chunks + .short 641 + .endm + + .macro scrcmd_642 arg0 + .short 642 + .short \arg0 + .endm + + .macro scrcmd_643 arg0, arg1, arg2 + .short 643 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_644 arg0, arg1, arg2 + .short 644 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_645 arg0, arg1, arg2 + .short 645 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_646 arg0 + .short 646 + .short \arg0 + .endm + + .macro get_party_slot_with_species arg0, arg1 + .short 647 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_648 arg0, arg1, arg2, arg3, arg4 + .short 648 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scratch_off_card + .short 649 + .endm + + .macro scratch_off_card_end + .short 650 + .endm + + .macro get_scratch_off_prize arg0, arg1, arg2 + .short 651 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_652 arg0, arg1, arg2 + .short 652 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro move_tutor_choose_move mon_slot, tutor_no, arg2, arg3 + .short 653 + .short \mon_slot + .short \tutor_no + .short \arg2 + .short \arg3 + .endm + + .macro tutor_move_teach_in_slot party_slot, move_slot, move + .short 654 + .short \party_slot + .short \move_slot + .short \move + .endm + + .macro tutor_move_get_price arg0, arg1 + .short 655 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_656 arg0, arg1 + .short 656 + .short \arg0 + .short \arg1 + .endm + + .macro stat_judge mon_slot, iv_sum, best_stat, best_iv + .short 657 + .short \mon_slot + .short \iv_sum + .short \best_stat + .short \best_iv + .endm + + .macro buffer_stat_name arg0, arg1 + .short 658 + .byte \arg0 + .short \arg1 + .endm + + .macro set_mon_forme arg0, arg1 + .short 659 + .short \arg0 + .short \arg1 + .endm + + .macro buffer_trainer_name arg0, arg1 + .short 660 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_661 arg0, arg1, arg2, arg3 + .short 661 + .byte \arg0 + .word \arg1 + .byte \arg2 + .byte \arg3 + .endm + + .macro scrcmd_662 arg0, arg1, arg2 + .short 662 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_663 arg0 + .short 663 + .short \arg0 + .endm + + .macro scrcmd_664 + .short 664 + .endm + + .macro scrcmd_665 arg0 + .short 665 + .short \arg0 + .endm + + .macro scrcmd_666 arg0 + .short 666 + .short \arg0 + .endm + + .macro scrcmd_667 arg0 + .short 667 + .short \arg0 + .endm + + .macro buffer_type_name arg0, arg1 + .short 668 + .byte \arg0 + .short \arg1 + .endm + + .macro getitemquantity arg0, arg1 + .short 669 + .short \arg0 + .short \arg1 + .endm + + .macro get_hidden_power_type arg0, arg1 + .short 670 + .short \arg0 + .short \arg1 + .endm + + .macro set_favorite_mon + .short 671 + .endm + + .macro get_favorite_mon arg0, arg1, arg2 + .short 672 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro get_owned_rotom_formes arg0, arg1, arg2, arg3, arg4 + .short 673 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro count_transformed_rotoms_in_party arg0, arg1 + .short 674 + .short \arg0 + .short \arg1 + .endm + + .macro update_rotom_forme arg0, arg1, arg2, arg3 + .short 675 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro get_party_mon_forme arg0, arg1 + .short 676 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_677 arg0, arg1 + .short 677 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_678 arg0, arg1 + .short 678 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_679 + .short 679 + .endm + + .macro add_special_game_stat_2 arg0 + .short 680 + .short \arg0 + .endm + + .macro scrcmd_681 arg0 + .short 681 + .short \arg0 + .endm + + .macro scrcmd_682 arg0 + .short 682 + .short \arg0 + .endm + + .macro get_static_encounter_outcome arg0 + .short 683 + .short \arg0 + .endm + + .macro scrcmd_684 arg0 + .short 684 + .short \arg0 + .endm + + .macro get_player_xyz arg0, arg1, arg2 + .short 685 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_686 arg0, arg1 + .short 686 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_687 arg0 + .short 687 + .short \arg0 + .endm + + .macro get_party_slot_with_fateful_encounter arg0, arg1 + .short 688 + .short \arg0 + .short \arg1 + .endm + + ; Attempt to remove all Griseous Orbs and reset Pokemon + ; to formes present in Diamond and Pearl, to avoid + ; problems communicating with those games. + .macro comm_sanitize_party var_result + .short 689 + .short \var_result + .endm + + .macro day_care_sanitize_mon arg0, arg1 + .short 690 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_691 arg0 + .short 691 + .short \arg0 + .endm + + .macro buffer_battle_hall_streak arg0, arg1, arg2, arg3, arg4, arg5 + .short 692 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .short \arg5 + .endm + + .macro battle_hall_count_used_species arg0 + .short 693 + .short \arg0 + .endm + + .macro battle_hall_get_total_streak arg0 + .short 694 + .short \arg0 + .endm + + .macro scrcmd_695 arg0 + .short 695 + .short \arg0 + .endm + + .macro scrcmd_696 arg0 + .short 696 + .short \arg0 + .endm + + .macro scrcmd_697 arg0 + .short 697 + .short \arg0 + .endm + + .macro follower_poke_is_event_trigger arg0, arg1, arg2 + .short 698 + .byte \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_699 + .short 699 + .endm + + .macro scrcmd_700 + .short 700 + .endm + + .macro mon_has_item arg0, arg1 + .short 701 + .short \arg0 + .short \arg1 + .endm + + .macro battle_tower_setup_multi_battle + .short 702 + .endm + + .macro set_player_volume arg0 + .short 703 + .short \arg0 + .endm + + .macro scrcmd_704 arg0, arg1 + .short 704 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_705 arg0, arg1 + .short 705 + .short \arg0 + .word \arg1 + .endm + + .macro scrcmd_706 arg0 + .short 706 + .short \arg0 + .endm + + .macro check_mon_seen arg0, arg1 + .short 707 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_708 arg0 + .short 708 + .short \arg0 + .endm + + .macro scrcmd_709 + .short 709 + .endm + + .macro scrcmd_710 + .short 710 + .endm + + .macro follow_poke_interact + .short 711 + .endm + + .macro scrcmd_712 arg0 + .short 712 + .byte \arg0 + .endm + + .macro alph_puzzle arg0 + .short 713 + .byte \arg0 + .endm + + .macro open_alph_hidden_room arg0 + .short 714 + .byte \arg0 + .endm + + .macro update_day_care_mon_objects + .short 715 + .endm + + .macro scrcmd_716 + .short 716 + .endm + + .macro scrcmd_717 arg0 + .short 717 + .short \arg0 + .endm + + .macro scrcmd_718 arg0, arg1 + .short 718 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_719 arg0, arg1 + .short 719 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_720 arg0 + .short 720 + .short \arg0 + .endm + + .macro scrcmd_721 arg0 + .short 721 + .short \arg0 + .endm + + .macro scrcmd_722 arg0, arg1, arg2, arg3, arg4 + .short 722 + .byte \arg0 + .byte \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scrcmd_723 arg0, arg1, arg2, arg3, arg4 + .short 723 + .byte \arg0 + .byte \arg1 + .short \arg2 + .short \arg3 + .short \arg4 + .endm + + .macro scrcmd_724 arg0, arg1 + .short 724 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_725 arg0, arg1 + .short 725 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_726 + .short 726 + .endm + + .macro scrcmd_727 arg0 + .short 727 + .short \arg0 + .endm + + .macro scrcmd_728 arg0, arg1 + .short 728 + .byte \arg0 + .byte \arg1 + .endm + + .macro scrcmd_729 arg0 + .short 729 + .short \arg0 + .endm + + .macro scrcmd_730 arg0 + .short 730 + .short \arg0 + .endm + + .macro scrcmd_731 + .short 731 + .endm + + .macro scrcmd_732 arg0 + .short 732 + .byte \arg0 + .endm + + .macro scrcmd_733 arg0, arg1 + .short 733 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_734 arg0 + .short 734 + .byte \arg0 + .endm + + .macro scrcmd_735 arg0 + .short 735 + .short \arg0 + .endm + + .macro clear_kurt_apricorn + .short 736 + .endm + + .macro scrcmd_737 arg0 + .short 737 + .short \arg0 + .endm + + .macro get_total_apricorn_count arg0 + .short 738 + .short \arg0 + .endm + + .macro scrcmd_739 + .short 739 + .endm + + .macro scrcmd_740 arg0, arg1 + .short 740 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_741 arg0, arg1, arg2, arg3 + .short 741 + .short \arg0 + .short \arg1 + .short \arg2 + .short \arg3 + .endm + + .macro scrcmd_742 arg0, arg1, arg2 + .short 742 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_743 arg0 + .short 743 + .short \arg0 + .endm + + .macro create_friendship_room_statues + .short 744 + .endm + + .macro buffer_pokeathlon_course_name arg0, arg1 + .short 745 + .byte \arg0 + .short \arg1 + .endm + + .macro touchscreen_menu_hide + .short 746 + .endm + + .macro touchscreen_menu_show + .short 747 + .endm + + .macro getmenuchoice arg0 + .short 748 + .short \arg0 + .endm + + .macro menu_init_std_gmm arg0, arg1, arg2, arg3, arg4 + .short 749 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro menu_init arg0, arg1, arg2, arg3, arg4 + .short 750 + .byte \arg0 + .byte \arg1 + .byte \arg2 + .byte \arg3 + .short \arg4 + .endm + + .macro menu_item_add arg0, arg1, arg2 + .short 751 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro menu_exec + .short 752 + .endm + + .macro scrcmd_rock_smash_item_check arg0, arg1, arg2 + .short 753 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro scrcmd_754 arg0 + .short 754 + .short \arg0 + .endm + + .macro scrcmd_755 + .short 755 + .endm + + .macro scrcmd_756 + .short 756 + .endm + + .macro scrcmd_757 + .short 757 + .endm + + .macro scrcmd_758 arg0 + .short 758 + .short \arg0 + .endm + + .macro scrcmd_759 + .short 759 + .endm + + .macro scrcmd_760 + .short 760 + .endm + + .macro scrcmd_761 arg0 + .short 761 + .short \arg0 + .endm + + .macro scrcmd_762 arg0 + .short 762 + .short \arg0 + .endm + + .macro scrcmd_763 + .short 763 + .endm + + .macro scrcmd_764 + .short 764 + .endm + + .macro scrcmd_765 + .short 765 + .endm + + .macro scrcmd_766 + .short 766 + .endm + + .macro scrcmd_767 + .short 767 + .endm + + .macro scrcmd_768 + .short 768 + .endm + + .macro scrcmd_769 + .short 769 + .endm + + .macro check_seen_all_letter_unown arg0 + .short 770 + .short \arg0 + .endm + + .macro scrcmd_771 + .short 771 + .endm + + .macro scrcmd_772 + .short 772 + .endm + + .macro cinematic arg0 + .short 773 + .short \arg0 + .endm + + .macro show_legendary_wing arg0 + .short 774 + .short \arg0 + .endm + + .macro scrcmd_775 arg0, arg1 + .short 775 + .short \arg0 + .short \arg1 + .endm + + .macro give_togepi_egg + .short 776 + .endm + + .macro scrcmd_777 arg0, arg1 + .short 777 + .short \arg0 + .short \arg1 + .endm + + .macro give_spiky_ear_pichu + .short 778 + .endm + + .macro radio_music_is_playing arg0, arg1 + .short 779 + .short \arg0 + .short \arg1 + .endm + + .macro casino_game arg0, arg1 + .short 780 + .byte \arg0 + .byte \arg1 + .endm + + .macro kenya_check_party_or_mailbox arg0 + .short 781 + .short \arg0 + .endm + + .macro mart_sell + .short 782 + .endm + + .macro set_follow_poke_inhibit_state arg0 + .short 783 + .byte \arg0 + .endm + + .macro script_overlay_cmd arg0, arg1 + .short 784 + .byte \arg0 + .byte \arg1 + .endm + + .macro bug_contest_action arg0, arg1 + .short 785 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_bug_contest_winner arg0 + .short 786 + .byte \arg0 + .endm + + .macro judge_bug_contest arg0, arg1, arg2 + .short 787 + .short \arg0 + .short \arg1 + .short \arg2 + .endm + + .macro buffer_bug_contest_mon_nick arg0, arg1 + .short 788 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_789 arg0 + .short 789 + .byte \arg0 + .endm + + .macro is_npc_bug_contestant_registered arg0, arg1 + .short 790 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_791 arg0, arg1 + .short 791 + .byte \arg0 + .short \arg1 + .endm + + .macro scrcmd_792 + .short 792 + .endm + + .macro bank_transaction arg0, arg1 + .short 793 + .short \arg0 + .short \arg1 + .endm + + .macro check_bank_balance arg0, arg1 + .short 794 + .short \arg0 + .word \arg1 + .endm + + .macro scrcmd_795 arg0, arg1 + .short 795 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_796 + .short 796 + .endm + + .macro scrcmd_797 + .short 797 + .endm + + .macro buffer_ruleset_name arg0 + .short 798 + .short \arg0 + .endm + + .macro scrcmd_799 arg0 + .short 799 + .short \arg0 + .endm + + .macro scrcmd_800 arg0 + .short 800 + .short \arg0 + .endm + + .macro scrcmd_801 arg0 + .short 801 + .short \arg0 + .endm + + .macro scrcmd_802 + .short 802 + .endm + + .macro scrcmd_803 arg0, arg1 + .short 803 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_804 arg0 + .short 804 + .byte \arg0 + .endm + + .macro scrcmd_805 + .short 805 + .endm + + .macro scrcmd_806 + .short 806 + .endm + + .macro scrcmd_807 arg0, arg1 + .short 807 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_808 arg0 + .short 808 + .short \arg0 + .endm + + .macro scrcmd_809 arg0 + .short 809 + .short \arg0 + .endm + + .macro scrcmd_810 + .short 810 + .endm + + .macro scrcmd_811 arg0, arg1 + .short 811 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_812 + .short 812 + .endm + + .macro mom_gift_check arg0 + .short 813 + .short \arg0 + .endm + + .macro scrcmd_814 + .short 814 + .endm + + .macro scrcmd_815 arg0 + .short 815 + .short \arg0 + .endm + + .macro unown_circle + .short 816 + .endm + + .macro scrcmd_817 arg0 + .short 817 + .byte \arg0 + .endm + + .macro mystry_stage_gymmick_init + .short 818 + .endm + + .macro scrcmd_819 + .short 819 + .endm + + .macro scrcmd_820 arg0 + .short 820 + .byte \arg0 + .endm + + .macro get_buenas_password arg0, arg1 + .short 821 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_822 + .short 822 + .endm + + .macro scrcmd_823 arg0 + .short 823 + .short \arg0 + .endm + + .macro scrcmd_824 arg0 + .short 824 + .short \arg0 + .endm + + .macro get_shiny_leaf_count arg0, arg1 + .short 825 + .short \arg0 + .short \arg1 + .endm + + .macro try_give_shiny_leaf_crown arg0 + .short 826 + .short \arg0 + .endm + + .macro get_partymon_forme arg0, arg1 + .short 827 + .short \arg0 + .short \arg1 + .endm + + .macro mon_add_contest_value arg0, arg1, arg2 + .short 828 + .short \arg0 + .byte \arg1 + .short \arg2 + .endm + + .macro scrcmd_829 arg0 + .short 829 + .short \arg0 + .endm + + .macro scrcmd_830 arg0 + .short 830 + .short \arg0 + .endm + + .macro scrcmd_831 arg0 + .short 831 + .short \arg0 + .endm + + .macro scrcmd_832 arg0 + .short 832 + .short \arg0 + .endm + + .macro scrcmd_833 arg0 + .short 833 + .short \arg0 + .endm + + .macro scrcmd_834 arg0 + .short 834 + .short \arg0 + .endm + + .macro scrcmd_835 arg0 + .short 835 + .short \arg0 + .endm + + .macro scrcmd_836 arg0 + .short 836 + .short \arg0 + .endm + + .macro scrcmd_837 arg0 + .short 837 + .short \arg0 + .endm + + .macro bank_or_wallet_is_full arg0, arg1 + .short 838 + .short \arg0 + .short \arg1 + .endm + + .macro sys_set_sleep_flag arg0 + .short 839 + .short \arg0 + .endm + + .macro scrcmd_840 arg0, arg1 + .short 840 + .short \arg0 + .short \arg1 + .endm + + .macro scrcmd_841 arg0 + .short 841 + .byte \arg0 + .endm + + .macro scrcmd_842 arg0 + .short 842 + .byte \arg0 + .endm + + .macro buffer_item_name_indef arg0, arg1 + .short 843 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_item_name_plural arg0, arg1 + .short 844 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_party_mon_species_name_indef arg0, arg1 + .short 845 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_species_name_indef arg0, arg1, arg2, arg3 + .short 846 + .byte \arg0 + .short \arg1 + .short \arg2 + .byte \arg3 + .endm + + .macro buffer_dppt_friend_starter_species_name_indef arg0 + .short 847 + .byte \arg0 + .endm + + .macro buffer_fashion_name_indef arg0, arg1 + .short 848 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_trainer_class_name_indef arg0, arg1 + .short 849 + .byte \arg0 + .short \arg1 + .endm + + .macro buffer_seal_name_plural arg0, arg1 + .short 850 + .byte \arg0 + .short \arg1 + .endm + + .macro capitalize arg0 + .short 851 + .byte \arg0 + .endm + + .macro buffer_dept_store_floor_no arg0, arg1 + .short 852 + .byte \arg0 + .byte \arg1 + .endm + + ; Script headers + + .macro map_script kind, script + .byte \kind + .word \script + .endm + + .macro map_script_2 var, val, script + .short \var, \val, \script + .endm + + ; Convenience macros + + ; Generic compare macro which attempts to deduce argument types based on their values + ; Any values between 0x4000 to 0x40FF and 0x8000 to 0x8015 are considered event variable identifiers + .macro compare var, arg + .if ((\arg >= VARS_START && \arg <= VARS_END) || (\arg >= SPECIAL_VARS_START && \arg <= SPECIAL_VARS_END)) + compare_var_to_var \var, \arg + .else + compare_var_to_value \var, \arg + .endif + .endm + + .macro goto_if_unset flag, dest + checkflag \flag + goto_if FALSE, \dest + .endm + + .macro goto_if_set flag, dest + checkflag \flag + goto_if TRUE, \dest + .endm + + .macro goto_if_lt dest ; LESS THAN + goto_if 0, \dest + .endm + + .macro goto_if_eq dest ; EQUAL + goto_if 1, \dest + .endm + + .macro goto_if_gt dest ; GREATER THAN + goto_if 2, \dest + .endm + + .macro goto_if_le dest ; LESS THAN OR EQUAL + goto_if 3, \dest + .endm + + .macro goto_if_ge dest ; GREATER THAN OR EQUAL + goto_if 4, \dest + .endm + + .macro goto_if_ne dest ; NOT EQUAL + goto_if 5, \dest + .endm + + .macro call_if_unset flag, dest + checkflag \flag + call_if FALSE, \dest + .endm + + .macro call_if_set flag, dest + checkflag \flag + call_if TRUE, \dest + .endm + + .macro call_if_lt dest ; LESS THAN + call_if 0, \dest + .endm + + .macro call_if_eq dest ; EQUAL + call_if 1, \dest + .endm + + .macro call_if_gt dest ; GREATER THAN + call_if 2, \dest + .endm + + .macro call_if_le dest ; LESS THAN OR EQUAL + call_if 3, \dest + .endm + + .macro call_if_ge dest ; GREATER THAN OR EQUAL + call_if 4, \dest + .endm + + .macro call_if_ne dest ; NOT EQUAL + call_if 5, \dest + .endm + + .macro goto_if_defeated trainer, dest + checktrainerflag \trainer + goto_if TRUE, \dest + .endm + + .macro goto_if_not_defeated trainer, dest + checktrainerflag \trainer + goto_if FALSE, \dest + .endm + + .macro call_if_defeated trainer, dest + checktrainerflag \trainer + call_if TRUE, \dest + .endm + + .macro call_if_not_defeated trainer, dest + checktrainerflag \trainer + call_if FALSE, \dest + .endm + + .macro item_vars item, quantity=1 + .if \item < 0x4000 + setvar VAR_SPECIAL_x8004, \item + .else + copyvar VAR_SPECIAL_x8004, \item + .endif + .if \quantity < 0x4000 + setvar VAR_SPECIAL_x8005, \quantity + .else + copyvar VAR_SPECIAL_x8005, \quantity + .endif + .endm + + .macro goto_if_no_item_space item, quantity, target + item_vars \item, \quantity + hasspaceforitem VAR_SPECIAL_x8004, VAR_SPECIAL_x8005, VAR_SPECIAL_RESULT + compare VAR_SPECIAL_RESULT, 0 + goto_if eq, \target + .endm + + .macro goto_if_no_item_space_2 item, quantity, target + item_vars \item, \quantity + hasspaceforitem VAR_SPECIAL_x8004, VAR_SPECIAL_x8005, VAR_SPECIAL_RESULT + compare VAR_SPECIAL_RESULT, 1 + goto_if ne, \target + .endm + + .macro giveitem_no_check item, quantity + item_vars \item, \quantity + callstd std_give_item_verbose + .endm + + .macro takeitem_no_check item, quantity + item_vars \item, \quantity + takeitem VAR_SPECIAL_x8004, VAR_SPECIAL_x8005, VAR_SPECIAL_RESULT + .endm + + .macro switch var + copyvar VAR_SPECIAL_x8008, \var + .endm + + .macro case value, target + compare VAR_SPECIAL_x8008, \value + goto_if eq, \target + .endm + + .macro phone_call who, b, c + setvar VAR_SPECIAL_x8004, \who + setvar VAR_SPECIAL_x8005, \b + setvar VAR_SPECIAL_x8006, \c + callstd std_phone_call + .endm + + .macro simple_npc_msg msgid + play_se SEQ_SE_DP_SELECT + lockall + faceplayer + npc_msg \msgid + wait_button_or_walk_away + closemsg + releaseall + .endm + + ; Movement commands + + .macro step type, length + .short \type + .short \length + .endm + + .macro step_end + .short 254, 0 + .endm + + .endif ; ASM_SCRIPT_INC diff --git a/binutils.mk b/binutils.mk new file mode 100644 index 00000000..2c8dea81 --- /dev/null +++ b/binutils.mk @@ -0,0 +1,14 @@ +# Supply a GNU ARM Embedded toolchain for objcopy, ar, etc. + +ifdef DEVKITARM +TOOLCHAIN := $(DEVKITARM) +endif + +ifdef TOOLCHAIN +export PATH := $(TOOLCHAIN)/bin:$(PATH) +endif + +PREFIX := arm-none-eabi- + +OBJCOPY := $(PREFIX)objcopy +AR := $(PREFIX)ar diff --git a/charmap.txt b/charmap.txt new file mode 100644 index 00000000..e69de29b diff --git a/common.mk b/common.mk new file mode 100644 index 00000000..7a105d61 --- /dev/null +++ b/common.mk @@ -0,0 +1,234 @@ +## Common defines for ARM9 and ARM7 Makefiles ## + +COMPARE ?= 1 + +default: all + +PROJECT_ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +# Because mwldarm expects absolute paths to be WIN32 paths, +# all paths referring up from BUILD_DIR must be relative. +WORK_DIR := $(shell realpath --relative-to $(CURDIR) $(PROJECT_ROOT)) +$(shell mkdir -p $(BUILD_DIR)) +BACK_REL := $(shell realpath --relative-to $(BUILD_DIR) $(CURDIR)) + +# Recursive wildcard function +rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) + +TOOLSDIR := $(WORK_DIR)/tools + +include $(WORK_DIR)/platform.mk +include $(WORK_DIR)/binutils.mk + +# NitroSDK tools +MWCC = $(TOOLSDIR)/mwccarm/$(MWCCVER)/mwccarm.exe +MWAS = $(TOOLSDIR)/mwccarm/$(MWCCVER)/mwasmarm.exe +MWLD = $(BACK_REL)/$(TOOLSDIR)/mwccarm/$(MWCCVER)/mwldarm.exe +MAKEROM := $(TOOLSDIR)/bin/makerom.exe +MAKELCF := $(TOOLSDIR)/bin/makelcf.exe +MAKEBNR := $(TOOLSDIR)/bin/makebanner.exe +NTRCOMP := $(TOOLSDIR)/bin/ntrcomp.exe + +export LM_LICENSE_FILE := $(TOOLSDIR)/mwccarm/license.dat + +# Native tools +JSONPROC := $(TOOLSDIR)/jsonproc/jsonproc$(EXE) +GFX := $(TOOLSDIR)/nitrogfx/nitrogfx$(EXE) +FIXROM := $(TOOLSDIR)/fixrom/fixrom$(EXE) +KNARC := $(TOOLSDIR)/knarc/knarc$(EXE) +O2NARC := $(TOOLSDIR)/o2narc/o2narc$(EXE) +MSGENC := $(TOOLSDIR)/msgenc/msgenc$(EXE) +ASPATCH := $(TOOLSDIR)/mwasmarm_patcher/mwasmarm_patcher$(EXE) +CSV2BIN := $(TOOLSDIR)/csv2bin/csv2bin$(EXE) +MKFXCONST := $(TOOLSDIR)/gen_fx_consts/gen_fx_consts$(EXE) +MOD123ENCRY := $(TOOLSDIR)/mod123encry/mod123encry$(EXE) + +# Decompiled NitroSDK tools +COMPSTATIC := $(TOOLSDIR)/compstatic/compstatic$(EXE) + +NTRMERGE := $(TOOLSDIR)/ntr_merge_elf/ntr_merge_elf.sh +ASM_PROCESSOR := $(TOOLSDIR)/asm_processor/compile.sh + +NATIVE_TOOLS := \ + $(JSONPROC) \ + $(GFX) \ + $(FIXROM) \ + $(KNARC) \ + $(O2NARC) \ + $(MSGENC) \ + $(ASPATCH) \ + $(CSV2BIN) \ + $(MKFXCONST) \ + $(COMPSTATIC) \ + $(MOD123ENCRY) + +TOOLDIRS := $(foreach tool,$(NATIVE_TOOLS),$(dir $(tool))) + +# Directories +NITROSDK_SRC_SUBDIRS := os + +LIB_SUBDIRS := cw NitroSDK NitroSystem NitroDWC NitroWiFi libCPS libVCT +SRC_SUBDIR := src +ASM_SUBDIR := asm +LIB_SRC_SUBDIR := lib/src $(LIB_SUBDIRS:%=lib/%/src) $(NITROSDK_SRC_SUBDIRS:%=lib/NitroSDK/src/%) +LIB_ASM_SUBDIR := lib/asm $(LIB_SUBDIRS:%=lib/%/asm) +ALL_SUBDIRS := $(SRC_SUBDIR) $(ASM_SUBDIR) $(LIB_SRC_SUBDIR) $(LIB_ASM_SUBDIR) + +SRC_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(SRC_SUBDIR)) +ASM_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(ASM_SUBDIR)) +LIB_SRC_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(LIB_SRC_SUBDIR)) +LIB_ASM_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(LIB_ASM_SUBDIR)) + +C_SRCS := $(call rwildcard,src,*.c) +ASM_SRCS := $(foreach dname,$(ASM_SUBDIR),$(wildcard $(dname)/*.s)) +GLOBAL_ASM_SRCS != grep -rl 'GLOBAL_ASM(' $(C_SRCS) +LIB_C_SRCS := $(foreach dname,$(LIB_SRC_SUBDIR),$(wildcard $(dname)/*.c)) +LIB_ASM_SRCS := $(foreach dname,$(LIB_ASM_SUBDIR),$(wildcard $(dname)/*.s)) +ALL_SRCS := $(C_SRCS) $(ASM_SRCS) $(GLOBAL_ASM_SRCS) $(LIB_C_SRCS) $(LIB_ASM_SRCS) + +C_OBJS = $(C_SRCS:%.c=$(BUILD_DIR)/%.o) +ASM_OBJS = $(ASM_SRCS:%.s=$(BUILD_DIR)/%.o) +GLOBAL_ASM_OBJS = $(GLOBAL_ASM_SRCS:%.c=$(BUILD_DIR)/%.o) +LIB_C_OBJS = $(LIB_C_SRCS:%.c=$(BUILD_DIR)/%.o) +LIB_ASM_OBJS = $(LIB_ASM_SRCS:%.s=$(BUILD_DIR)/%.o) +ALL_GAME_OBJS = $(C_OBJS) $(ASM_OBJS) $(GLOBAL_ASM_OBJS) +ALL_LIB_OBJS = $(LIB_C_OBJS) $(LIB_ASM_OBJS) +ALL_OBJS = $(ALL_GAME_OBJS) $(ALL_LIB_OBJS) + +$(ALL_LIB_OBJS): DEFINES = $(GLB_DEFINES) + +ALL_BUILDDIRS := $(sort $(ALL_BUILDDIRS) $(foreach obj,$(ALL_OBJS),$(dir $(obj)))) + +NEF := $(BUILD_DIR)/$(NEFNAME).nef +ELF := $(NEF:%.nef=%.elf) +LCF := $(NEF:%.nef=%.lcf) +RESPONSE := $(NEF:%.nef=%.response) +SBIN := $(NEF:%.nef=%.sbin) +XMAP := $(NEF).xMAP + +EXCCFLAGS := -Cpp_exceptions off + +MWCFLAGS = $(DEFINES) $(OPTFLAGS) -enum int -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -ipa file -interworking -inline on,noauto -char signed -W all -W pedantic -W noimpl_signedunsigned -W noimplicitconv -W nounusedarg -W nomissingreturn -W error + +MWASFLAGS = $(DEFINES) -proc $(PROC_S) -gccinc -i . -i ./include -i $(WORK_DIR)/asm/include -i $(WORK_DIR)/files -i $(WORK_DIR)/lib/asm/include -i $(WORK_DIR)/lib/NitroDWC/asm/include -i $(WORK_DIR)/lib/NitroSDK/asm/include -i $(WORK_DIR)/lib/syscall/asm/include -I$(WORK_DIR)/lib/include -DSDK_ASM +MWLDFLAGS := -proc $(PROC) -nopic -nopid -interworking -map closure,unused -symtab sort -m _start -msgstyle gcc +ARFLAGS := rcS + +$(C_OBJS): MWCFLAGS += -include global.h + +MW_COMPILE = $(WINE) $(MWCC) $(MWCFLAGS) +MW_ASSEMBLE = $(WINE) $(MWAS) $(MWASFLAGS) + +export MWCIncludes := lib/include + +LSF := $(addsuffix .lsf,$(NEFNAME)) +ifneq ($(LSF),) +OVERLAYS := $(shell $(GREP) -o "^Overlay \w+" $(LSF) | cut -d' ' -f2) +else +OVERLAYS := +endif + +# Make sure build directories exist before compiling anything +DUMMY := $(shell mkdir -p $(ALL_BUILDDIRS)) + +.SECONDARY: +.SECONDEXPANSION: +.DELETE_ON_ERROR: +.PHONY: all tidy clean tools clean-tools $(TOOLDIRS) +.PRECIOUS: $(SBIN) +.NOTPARALLEL: + +.PHONY: $(MWAS) +$(MWAS): + $(ASPATCH) -q $@ + +ifeq ($(NODEP),) +ifneq ($(WINPATH),) +PROJECT_ROOT_NT := $(shell $(WINPATH) -w $(PROJECT_ROOT) | $(SED) 's/\\/\//g') +define fixdep +$(SED) -i 's/\r//g; s/\\/\//g; s/\/$$/\\/g; s#$(PROJECT_ROOT_NT)#$(PROJECT_ROOT)#g' $(1) +touch -r $(1:%.d=%.o) $(1) +endef +else +define fixdep +$(SED) -i 's/\r//g; s/\\/\//g; s/\/$$/\\/g' $(1) +touch -r $(1:%.d=%.o) $(1) +endef +endif +DEPFLAGS := -gccdep -MD +DEPFILES := $(ALL_OBJS:%.o=%.d) +MW_COMPILE += $(DEPFLAGS) +$(GLOBAL_ASM_OBJS): BUILD_C := $(ASM_PROCESSOR) "$(MW_COMPILE)" "$(MW_ASSEMBLE)" +BUILD_C ?= $(MW_COMPILE) -c -o + +$(DEPFILES): + +$(BUILD_DIR)/lib/NitroSDK/%.o: MWCCVER := 2.0/sp2p3 + +$(BUILD_DIR)/%.o: %.c +$(BUILD_DIR)/%.o: %.c $(BUILD_DIR)/%.d + $(BUILD_C) $@ $< + @$(call fixdep,$(BUILD_DIR)/$*.d) + +$(BUILD_DIR)/%.o: %.s +$(BUILD_DIR)/%.o: %.s $(BUILD_DIR)/%.d + $(WINE) $(MWAS) $(MWASFLAGS) $(DEPFLAGS) -o $@ $< + @$(call fixdep,$(BUILD_DIR)/$*.d) + +include $(wildcard $(DEPFILES)) +else +$(GLOBAL_ASM_OBJS): BUILD_C := $(ASM_PROCESSOR) "$(MW_COMPILE)" "$(MW_ASSEMBLE)" +BUILD_C ?= $(MW_COMPILE) -c -o + +$(BUILD_DIR)/%.o: %.c + $(BUILD_C) $@ $< + +$(BUILD_DIR)/%.o: %.s + $(WINE) $(MWAS) $(MWASFLAGS) -o $@ $< +endif + +$(NATIVE_TOOLS): tools + +tools: $(TOOLDIRS) $(MWAS) + +$(TOOLDIRS): + @$(MAKE) -C $@ + +clean-tools: + $(foreach tool,$(TOOLDIRS),$(MAKE) -C $(tool) clean;) + +$(LCF): $(LSF) $(LCF_TEMPLATE) + $(WINE) $(MAKELCF) $(MAKELCF_FLAGS) $^ $@ +ifeq ($(PROC),arm946e) + $(SED) -i '1i KEEP_SECTION\n{\n\t.exceptix\n}' $@ +else + $(SED) -i '/\} > check\.WORKRAM/a SDK_SUBPRIV_ARENA_LO = SDK_SUBPRIV_ARENA_LO + SDK_AUTOLOAD.EXT_WRAM.SIZE + SDK_AUTOLOAD.EXT_WRAM.BSS_SIZE;' $@ +endif + +RESPONSE_TEMPLATE := $(PROJECT_ROOT)/mwldarm.response.template +RESPONSE_TEMPLATE_NT := $(PROJECT_ROOT_NT)/mwldarm.response.template + +$(RESPONSE): $(LSF) $(RESPONSE_TEMPLATE) + $(WINE) $(MAKELCF) $(MAKELCF_FLAGS) $< $(RESPONSE_TEMPLATE_NT) $@ + +# Locate crt0.o +CRT0_OBJ := lib/asm/crt0.o + +$(NEF): $(LCF) $(RESPONSE) $(ALL_OBJS) + cd $(BUILD_DIR) && LM_LICENSE_FILE=$(BACK_REL)/$(LM_LICENSE_FILE) $(WINE) $(MWLD) $(MWLDFLAGS) $(LIBS) -o $(BACK_REL)/$(NEF) $(LCF:$(BUILD_DIR)/%=%) @$(RESPONSE:$(BUILD_DIR)/%=%) $(CRT0_OBJ) + +.INTERMEDIATE: $(BUILD_DIR)/obj.list + +$(SBIN): build/%.sbin: build/%.nef +ifeq ($(SBIN),$(BUILD_DIR)/main.sbin) +# Overlay 123 is encrypted in the retail ROM, so we need to reencrypt it after building it + cd $(BUILD_DIR) && ../../$(MOD123ENCRY) encry main OVY_123_enc.sbin 123 && mv OVY_123_enc.sbin OVY_123.sbin +endif +ifeq ($(COMPARE),1) + $(SHA1SUM) --quiet -c $*.sha1 +endif + +$(ELF): %.elf: %.nef + $(NTRMERGE) $* + +print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/config.mk b/config.mk new file mode 100644 index 00000000..361f9672 --- /dev/null +++ b/config.mk @@ -0,0 +1,43 @@ +GAME_REMASTER ?= 0 +GAME_LANGUAGE ?= ENGLISH + +buildname := pmdsky +shortname := sky +TITLE_NAME := POKEDUN SORA +GAME_CODE := C2S + +ifneq ($(GAME_REMASTER),0) +buildname := $(buildname).rev$(GAME_REMASTER) +endif + +ifeq ($(GAME_LANGUAGE),ENGLISH) +buildname := $(buildname).us +GAME_CODE := $(GAME_CODE)E +else +$(error Unsupported game language: $(GAME_LANGUAGE)) +endif + +BUILD_DIR := build/$(buildname) +NEFNAME := main + +GF_DEFINES := -DGAME_REMASTER=$(GAME_REMASTER) -D$(GAME_LANGUAGE) +ifeq ($(NO_GF_ASSERT),) +GF_DEFINES += -DPM_KEEP_ASSERTS +endif +GLB_DEFINES := -DSDK_ARM9 -DSDK_CODE_ARM -DSDK_FINALROM +DEFINES = $(GF_DEFINES) $(GLB_DEFINES) + +# Secure CRC +ifeq ($(buildname),pmdsky.us) +SECURE_CRC := 0xA0FF +endif + +ifndef SECURE_CRC +$(error Unsupported ROM: $(GAME_LANGUAGE)) +endif + +# At present this repository only supports the 1.0 US ROM +SUPPORTED_ROMS := pmdsky.us +ifneq ($(filter $(buildname),$(SUPPORTED_ROMS)),$(buildname)) +$(error $(buildname) is not supported, choose from: $(SUPPORTED_ROMS)) +endif diff --git a/files/.gitattributes b/files/.gitattributes new file mode 100644 index 00000000..86c3366e --- /dev/null +++ b/files/.gitattributes @@ -0,0 +1,4 @@ +* -text +.knarcignore text eol=lf +.knarckeep text eol=lf +.knarcorder text eol=lf diff --git a/filesystem.mk b/filesystem.mk new file mode 100644 index 00000000..2773d62c --- /dev/null +++ b/filesystem.mk @@ -0,0 +1,501 @@ +NITROFS_FILES := \ + files/data/UTF16.dat \ + files/data/area00light.txt \ + files/data/area01light.txt \ + files/data/area02light.txt \ + files/data/arealight.narc \ + files/data/battle_win.NSCR \ + files/data/cell0.NCGR \ + files/data/cell0.NCLR \ + files/data/clact_default.NANR \ + files/data/crystal.nsbmd \ + files/data/demo_climax.narc \ + files/data/dp_areawindow.NCGR \ + files/data/dp_areawindow.NCLR \ + files/data/dun20_01light.txt \ + files/data/dun20_02light.txt \ + files/data/dun_sea.nsbtx \ + files/data/eoo.dat \ + files/data/exdata.dat \ + files/data/farm.dat \ + files/data/field_cutin.narc \ + files/data/fldtanime.narc \ + files/data/fs_kanban.nsbca \ + files/data/ground0.NCGR \ + files/data/ground0.NCLR \ + files/data/ground0.NSCR \ + files/data/gsbr.dat \ + files/data/guru2.narc \ + files/data/kemu_itpconv.dat \ + files/data/kowaza.narc \ + files/data/lake_anim.nsbtx \ + files/data/miniasahamabe.nsbtx \ + files/data/miniasasea.nsbtx \ + files/data/minihamabe.nsbtx \ + files/data/minimum.nsbtx \ + files/data/minirhana.nsbtx \ + files/data/nfont.NCGR \ + files/data/nfont.NCLR \ + files/data/pc.nsbca \ + files/data/pl_wifi.ncgr \ + files/data/pl_wm.ncgr \ + files/data/pl_wm.nclr \ + files/data/slot.narc \ + files/data/smptm_koori.NANR \ + files/data/smptm_koori.NCER \ + files/data/smptm_koori.NCGR \ + files/data/smptm_koori.NCLR \ + files/data/smptm_nemuri.NANR \ + files/data/smptm_nemuri.NCER \ + files/data/smptm_nemuri.NCGR \ + files/data/smptm_nemuri.NCLR \ + files/data/str2uni.bin \ + files/data/t3_fl_b.nsbtx \ + files/data/t3_fl_p.nsbtx \ + files/data/t3_fl_r.nsbtx \ + files/data/t3_fl_y.nsbtx \ + files/data/test.atr \ + files/data/tmap_block.dat \ + files/data/tmap_flags.dat \ + files/data/tradelist.narc \ + files/data/trapmark.narc \ + files/data/ug_anim.narc \ + files/data/ug_base_cur.nsbmd \ + files/data/ug_boygirl.NCGR \ + files/data/ug_boygirl.NCLR \ + files/data/ug_fossil.narc \ + files/data/ug_hero.NANR \ + files/data/ug_hero.NCER \ + files/data/ug_hole.NANR \ + files/data/ug_hole.NCER \ + files/data/ug_hole.NCGR \ + files/data/ug_parts.narc \ + files/data/ug_radar.narc \ + files/data/ug_trap.narc \ + files/data/ugeffect_obj_graphic.narc \ + files/data/underg_radar.narc \ + files/data/utility.bin \ + files/data/weather_sys.narc \ + files/data/wifi.ncgr \ + files/data/wifinote.narc \ + files/data/wifip2pmatch.narc \ + files/data/wm.ncgr \ + files/data/wm.nclr \ + files/data/wm256k.ncgr \ + files/data/sound/gs_sound_data.sdat \ + files/msgdata/scenario/scr_msg.narc \ + files/fielddata/build_model/bm_field.narc \ + files/fielddata/build_model/bm_room.narc \ + files/fielddata/build_model/bm_field_matshp.dat \ + files/fielddata/build_model/bm_room_matshp.dat \ + files/poketool/personal/pms.narc \ + files/fielddata/maptable/mapname.bin \ + files/tel/pmtel_book.dat \ + files/data/mushi/mushi_trainer.bin \ + files/data/mushi/mushi_encount.bin \ + files/fielddata/wazaoshie/waza_oshie.bin \ + files/a/0/0/0 \ + files/a/0/0/1 \ + files/a/0/0/2 \ + files/a/0/0/3 \ + files/a/0/0/4 \ + files/a/0/0/5 \ + files/a/0/0/6 \ + files/a/0/0/7 \ + files/a/0/0/8 \ + files/a/0/0/9 \ + files/a/0/1/0 \ + files/a/0/1/1 \ + files/a/0/1/2 \ + files/a/0/1/3 \ + files/a/0/1/4 \ + files/a/0/1/5 \ + files/a/0/1/6 \ + files/a/0/1/7 \ + files/a/0/1/8 \ + files/a/0/1/9 \ + files/a/0/2/0 \ + files/a/0/2/1 \ + files/a/0/2/2 \ + files/a/0/2/3 \ + files/a/0/2/4 \ + files/a/0/2/5 \ + files/a/0/2/6 \ + files/a/0/2/7 \ + files/a/0/2/8 \ + files/a/0/2/9 \ + files/a/0/3/0 \ + files/a/0/3/1 \ + files/a/0/3/2 \ + files/a/0/3/3 \ + files/a/0/3/4 \ + files/a/0/3/5 \ + files/a/0/3/6 \ + files/a/0/3/7 \ + files/a/0/3/8 \ + files/a/0/3/9 \ + files/a/0/4/0 \ + files/a/0/4/1 \ + files/a/0/4/2 \ + files/a/0/4/3 \ + files/a/0/4/4 \ + files/a/0/4/5 \ + files/a/0/4/6 \ + files/a/0/4/7 \ + files/a/0/4/8 \ + files/a/0/4/9 \ + files/a/0/5/0 \ + files/a/0/5/1 \ + files/a/0/5/2 \ + files/a/0/5/3 \ + files/a/0/5/4 \ + files/a/0/5/5 \ + files/a/0/5/6 \ + files/a/0/5/7 \ + files/a/0/5/8 \ + files/a/0/5/9 \ + files/a/0/6/0 \ + files/a/0/6/1 \ + files/a/0/6/2 \ + files/a/0/6/3 \ + files/a/0/6/4 \ + files/a/0/6/5 \ + files/a/0/6/6 \ + files/a/0/6/7 \ + files/a/0/6/8 \ + files/a/0/6/9 \ + files/a/0/7/0 \ + files/a/0/7/1 \ + files/a/0/7/2 \ + files/a/0/7/3 \ + files/a/0/7/4 \ + files/a/0/7/5 \ + files/a/0/7/6 \ + files/a/0/7/7 \ + files/a/0/7/8 \ + files/a/0/7/9 \ + files/a/0/8/0 \ + files/a/0/8/1 \ + files/a/0/8/2 \ + files/a/0/8/3 \ + files/a/0/8/4 \ + files/a/0/8/5 \ + files/a/0/8/6 \ + files/a/0/8/7 \ + files/a/0/8/8 \ + files/a/0/8/9 \ + files/a/0/9/0 \ + files/a/0/9/1 \ + files/a/0/9/2 \ + files/a/0/9/3 \ + files/a/0/9/4 \ + files/a/0/9/5 \ + files/a/0/9/6 \ + files/a/0/9/7 \ + files/a/0/9/8 \ + files/a/0/9/9 \ + files/a/1/0/0 \ + files/a/1/0/1 \ + files/a/1/0/2 \ + files/a/1/0/3 \ + files/a/1/0/4 \ + files/a/1/0/5 \ + files/a/1/0/6 \ + files/a/1/0/7 \ + files/a/1/0/8 \ + files/a/1/0/9 \ + files/a/1/1/0 \ + files/a/1/1/1 \ + files/a/1/1/2 \ + files/a/1/1/3 \ + files/a/1/1/4 \ + files/a/1/1/5 \ + files/a/1/1/6 \ + files/a/1/1/7 \ + files/a/1/1/8 \ + files/a/1/1/9 \ + files/a/1/2/0 \ + files/a/1/2/1 \ + files/a/1/2/2 \ + files/a/1/2/3 \ + files/a/1/2/4 \ + files/a/1/2/5 \ + files/a/1/2/6 \ + files/a/1/2/7 \ + files/a/1/2/8 \ + files/a/1/2/9 \ + files/a/1/3/0 \ + files/a/1/3/1 \ + files/a/1/3/2 \ + files/a/1/3/3 \ + files/a/1/3/4 \ + files/a/1/3/5 \ + files/a/1/3/6 \ + files/a/1/3/7 \ + files/a/1/3/8 \ + files/a/1/3/9 \ + files/a/1/4/0 \ + files/a/1/4/1 \ + files/a/1/4/2 \ + files/a/1/4/3 \ + files/a/1/4/4 \ + files/a/1/4/5 \ + files/a/1/4/6 \ + files/a/1/4/7 \ + files/a/1/4/8 \ + files/a/1/4/9 \ + files/a/1/5/0 \ + files/a/1/5/1 \ + files/a/1/5/2 \ + files/a/1/5/3 \ + files/a/1/5/4 \ + files/a/1/5/5 \ + files/a/1/5/6 \ + files/a/1/5/7 \ + files/a/1/5/8 \ + files/a/1/5/9 \ + files/a/1/6/0 \ + files/a/1/6/1 \ + files/a/1/6/2 \ + files/a/1/6/3 \ + files/a/1/6/4 \ + files/a/1/6/5 \ + files/a/1/6/6 \ + files/a/1/6/7 \ + files/a/1/6/8 \ + files/a/1/6/9 \ + files/a/1/7/0 \ + files/a/1/7/1 \ + files/a/1/7/2 \ + files/a/1/7/3 \ + files/a/1/7/4 \ + files/a/1/7/5 \ + files/a/1/7/6 \ + files/a/1/7/7 \ + files/a/1/7/8 \ + files/a/1/7/9 \ + files/a/1/8/0 \ + files/a/1/8/1 \ + files/a/1/8/2 \ + files/a/1/8/3 \ + files/a/1/8/4 \ + files/a/1/8/5 \ + files/a/1/8/6 \ + files/a/1/8/7 \ + files/a/1/8/8 \ + files/a/1/8/9 \ + files/a/1/9/0 \ + files/a/1/9/1 \ + files/a/1/9/2 \ + files/a/1/9/3 \ + files/pbr/pokegra.narc \ + files/pbr/otherpoke.narc \ + files/a/1/9/4 \ + files/a/1/9/5 \ + files/a/1/9/6 \ + files/a/1/9/7 \ + files/a/1/9/8 \ + files/a/1/9/9 \ + files/a/2/0/0 \ + files/a/2/0/1 \ + files/a/2/0/2 \ + files/a/2/0/3 \ + files/a/2/0/4 \ + files/a/2/0/5 \ + files/a/2/0/6 \ + files/a/2/0/7 \ + files/a/2/0/8 \ + files/a/2/0/9 \ + files/a/2/1/0 \ + files/a/2/1/1 \ + files/a/2/1/2 \ + files/a/2/1/3 \ + files/a/2/1/4 \ + files/a/2/1/5 \ + files/a/2/1/6 \ + files/a/2/1/7 \ + files/a/2/1/8 \ + files/a/2/1/9 \ + files/a/2/2/0 \ + files/a/2/2/1 \ + files/a/2/2/2 \ + files/a/2/2/3 \ + files/a/2/2/4 \ + files/a/2/2/5 \ + files/a/2/2/6 \ + files/a/2/2/7 \ + files/a/2/2/8 \ + files/a/2/2/9 \ + files/a/2/3/0 \ + files/a/2/3/1 \ + files/a/2/3/2 \ + files/a/2/3/3 \ + files/a/2/3/4 \ + files/a/2/3/5 \ + files/a/2/3/6 \ + files/a/2/3/7 \ + files/a/2/3/8 \ + files/a/2/3/9 \ + files/a/2/4/0 \ + files/a/2/4/1 \ + files/a/2/4/2 \ + files/a/2/4/3 \ + files/a/2/4/4 \ + files/a/2/4/5 \ + files/a/2/4/6 \ + files/a/2/4/7 \ + files/a/2/4/8 \ + files/a/2/4/9 \ + files/a/2/5/0 \ + files/a/2/5/1 \ + files/a/2/5/2 \ + files/a/2/5/3 \ + files/a/2/5/4 \ + files/a/2/5/5 \ + files/a/2/5/6 \ + files/a/2/5/7 \ + files/a/2/5/8 \ + files/a/2/5/9 \ + files/a/2/6/0 \ + files/a/2/6/1 \ + files/a/2/6/2 \ + files/a/2/6/3 \ + files/a/2/6/4 \ + files/pbr/b_plist_gra.narc \ + files/pbr/bag_gra.narc \ + files/pbr/batt_bg.narc \ + files/pbr/batt_obj.narc \ + files/pbr/font.narc \ + files/pbr/growtbl.narc \ + files/pbr/item_data.narc \ + files/pbr/msg.narc \ + files/pbr/pbr_file.inc \ + files/pbr/personal.narc \ + files/pbr/plist_gra.narc \ + files/pbr/poke_anm.narc \ + files/pbr/poke_icon.narc \ + files/pbr/pokeanm.narc \ + files/pbr/pokezukan.narc \ + files/pbr/pst_gra.narc \ + files/pbr/sound_data.sdat \ + files/pbr/waza_tbl.narc \ + files/pbr/winframe.narc \ + files/pbr/poketch.narc \ + files/pbr/zukan.narc \ + files/dwc/utility.bin + +# TODO: file rules +# Some filenames are stripped and replaced with a serial number +# such that the XYZth file is mapped to a/X/Y/Z. +# Temporary names for now +define arc_strip_name +$(2): $(1) +SRC_ARCS += $(1) +DIFF_ARCS += $(2) +.PHONY: $(2) +endef + +$(eval $(call arc_strip_name,files/poketool/personal/personal.narc,files/a/0/0/2)) +$(eval $(call arc_strip_name,files/poketool/personal/growtbl.narc,files/a/0/0/3)) +$(eval $(call arc_strip_name,files/poketool/pokegra/pokegra.narc,files/a/0/0/4)) +$(eval $(call arc_strip_name,files/poketool/pokegra/height.narc,files/a/0/0/5)) +$(eval $(call arc_strip_name,files/poketool/waza/waza_tbl.narc,files/a/0/1/1)) +$(eval $(call arc_strip_name,files/fielddata/script/scr_seq.narc,files/a/0/1/2)) +$(eval $(call arc_strip_name,files/graphic/font.narc,files/a/0/1/6)) +$(eval $(call arc_strip_name,files/itemtool/itemdata/item_data.narc,files/a/0/1/7)) +$(eval $(call arc_strip_name,files/itemtool/itemdata/item_icon.narc,files/a/0/1/8)) +$(eval $(call arc_strip_name,files/msgdata/msg.narc,files/a/0/2/7)) +$(eval $(call arc_strip_name,files/fielddata/eventdata/zone_event.narc,files/a/0/3/2)) +$(eval $(call arc_strip_name,files/poketool/personal/wotbl.narc,files/a/0/3/3)) +$(eval $(call arc_strip_name,files/poketool/personal/evo.narc,files/a/0/3/4)) +$(eval $(call arc_strip_name,files/fielddata/encountdata/g_enc_data.narc,files/a/0/3/7)) +$(eval $(call arc_strip_name,files/fielddata/mapmatrix/map_matrix.narc,files/a/0/4/1)) +$(eval $(call arc_strip_name,files/poketool/trainer/trdata.narc,files/a/0/5/5)) +$(eval $(call arc_strip_name,files/poketool/trainer/trpoke.narc,files/a/0/5/6)) +$(eval $(call arc_strip_name,files/poketool/trmsg/trtbl.narc,files/a/0/5/7)) +$(eval $(call arc_strip_name,files/application/zukanlist/zukan_data/zukan_data.narc,files/a/0/7/4)) +$(eval $(call arc_strip_name,files/a/0/7/5.$(buildname),files/a/0/7/5)) +$(eval $(call arc_strip_name,files/data/mmodel/mmodel.narc,files/a/0/8/1)) +$(eval $(call arc_strip_name,files/application/choose_starter/choose_starter_main_res.narc,files/a/0/8/2)) +$(eval $(call arc_strip_name,files/application/choose_starter/choose_starter_sub_res.narc,files/a/0/9/3)) +$(eval $(call arc_strip_name,files/poketool/pokegra/otherpoke.narc,files/a/1/1/4)) +$(eval $(call arc_strip_name,files/poketool/pokegra/height_o.narc,files/a/1/1/7)) +$(eval $(call arc_strip_name,files/poketool/trmsg/trtblofs.narc,files/a/1/3/1)) +$(eval $(call arc_strip_name,files/application/zukanlist/zukan_data/zukan_enc_$(shortname).narc,files/a/1/3/3)) +$(eval $(call arc_strip_name,files/fielddata/encountdata/s_enc_data.narc,files/a/1/3/6)) +$(eval $(call arc_strip_name,files/poketool/johtozukan.narc,files/a/1/3/8)) +$(eval $(call arc_strip_name,files/fielddata/tsurepoke/tp_param.narc,files/a/1/4/1)) +$(eval $(call arc_strip_name,files/data/gs_areawindow.narc,files/a/1/6/3)) +$(eval $(call arc_strip_name,files/poketool/personal/performance.narc,files/a/1/6/9)) +$(eval $(call arc_strip_name,files/application/annon/puzzle_gra.narc,files/a/1/7/2)) +$(eval $(call arc_strip_name,files/application/custom_ball/edit/gs_cb_data.narc,files/a/1/8/5)) +$(eval $(call arc_strip_name,files/pbr/dp_height.narc,files/a/1/9/4)) +$(eval $(call arc_strip_name,files/pbr/dp_height_o.narc,files/a/1/9/5)) +$(eval $(call arc_strip_name,files/resource/eng/pms_aikotoba/pms_aikotoba.narc,files/a/2/1/2)) +$(eval $(call arc_strip_name,files/application/zukanlist/zukan_data/zukan_data_gira.narc,files/a/2/1/4)) +$(eval $(call arc_strip_name,files/fielddata/sodateya/kowaza_list.narc,files/a/2/2/9)) +$(eval $(call arc_strip_name,files/a/2/5/2.$(buildname),files/a/2/5/2)) + +$(DIFF_ARCS): + cp $< $@ + +NARCS := $(filter %.narc,$(NITROFS_FILES) $(SRC_ARCS)) +NAIXS := $(NARCS:%.narc=%.naix) + +CSV2BINFLAGS := -i $(WORK_DIR)/include --naix + +ifeq ($(NODEP),) +%.narc: csvdep = $(addprefix $(WORK_DIR)/include/,$(filter-out bool,$(shell cut -d: -f3 $(MANIFEST) | sort -u))) +else +%.narc: csvdep := +endif + +include files/msgdata/msg.mk +include files/fielddata/script/scr_seq.mk + +# This rule must come after the above includes +# and serves to enforce build order. +$(SCRIPT_BINS): $(FIRST_MSG_H_GEN) + +include files/fielddata/eventdata/zone_event.mk +include files/data/sound/sound_data.mk +include files/data/gs_areawindow.mk +include files/fielddata/encountdata/gs_enc_data.mk +include files/itemtool/itemdata/item_data.mk +include files/poketool/personal/evo.mk +include files/poketool/personal/growtbl.mk +include files/poketool/pokegra/otherpoke.mk +include files/poketool/pokegra/pokegra.mk +include files/poketool/trainer/trainer.mk +include files/fielddata/mapmatrix/map_matrix.mk +include files/resource/eng/pms_aikotoba/pms_aikotoba.mk +include files/data/mmodel/mmodel.mk +include files/fielddata/wazaoshie/waza_oshie.mk +include files/data/mushi/mushi.mk +include files/fielddata/tsurepoke/tp_param.mk +include files/application/choose_starter/choose_starter.mk + +$(filter-out $(DIFF_ARCS) $(FS_RULE_OVERRIDES),$(NITROFS_FILES)): ; + +# This must come after the above includes +include graphics_files_rules.mk + +NTR_FILE_EXT := bin NCGR NCLR NCER NSCR NSBMD NSBCA NSBTA + +%.narc: NARC_DEPS = $(foreach ext,$(NTR_FILE_EXT),$(wildcard $*/*.$ext)) +%.narc: $(NARC_DEPS) + $(KNARC) -d $* -p $@ -i + +%.naix: %.narc ; + +.PHONY: filesystem clean-filesystem clean-fs +filesystem: $(NITROFS_FILES) +ifeq ($(COMPARE),1) + $(SHA1SUM) --quiet -c $(WORK_DIR)/$(buildname)/filesystem.sha1 +endif + +clean-fs: clean-filesystem +clean-filesystem: + $(RM) files/msgdata/msg/*.bin + $(RM) $(DIFF_ARCS) $(NAIXS) + $(RM) -r $(FS_CLEAN_TARGETS) diff --git a/global.inc b/global.inc new file mode 100644 index 00000000..56cc21b8 --- /dev/null +++ b/global.inc @@ -0,0 +1,130 @@ +FS_EXTERN_OVERLAY(OVY_0) +FS_EXTERN_OVERLAY(OVY_10) +FS_EXTERN_OVERLAY(OVY_100) +FS_EXTERN_OVERLAY(OVY_101) +FS_EXTERN_OVERLAY(OVY_102) +FS_EXTERN_OVERLAY(OVY_103) +FS_EXTERN_OVERLAY(OVY_104) +FS_EXTERN_OVERLAY(OVY_105) +FS_EXTERN_OVERLAY(OVY_106) +FS_EXTERN_OVERLAY(OVY_107) +FS_EXTERN_OVERLAY(OVY_108) +FS_EXTERN_OVERLAY(OVY_109) +FS_EXTERN_OVERLAY(OVY_11) +FS_EXTERN_OVERLAY(OVY_110) +FS_EXTERN_OVERLAY(OVY_111) +FS_EXTERN_OVERLAY(OVY_112) +FS_EXTERN_OVERLAY(OVY_113) +FS_EXTERN_OVERLAY(OVY_114) +FS_EXTERN_OVERLAY(OVY_115) +FS_EXTERN_OVERLAY(OVY_116) +FS_EXTERN_OVERLAY(OVY_117) +FS_EXTERN_OVERLAY(OVY_118) +FS_EXTERN_OVERLAY(OVY_119) +FS_EXTERN_OVERLAY(OVY_12) +FS_EXTERN_OVERLAY(OVY_120) +FS_EXTERN_OVERLAY(OVY_121) +FS_EXTERN_OVERLAY(voltorb_flip) +FS_EXTERN_OVERLAY(OVY_123) +FS_EXTERN_OVERLAY(OVY_124) +FS_EXTERN_OVERLAY(OVY_125) +FS_EXTERN_OVERLAY(OVY_126) +FS_EXTERN_OVERLAY(OVY_127) +FS_EXTERN_OVERLAY(OVY_128) +FS_EXTERN_OVERLAY(OVY_13) +FS_EXTERN_OVERLAY(OVY_14) +FS_EXTERN_OVERLAY(OVY_15) +FS_EXTERN_OVERLAY(OVY_16) +FS_EXTERN_OVERLAY(OVY_17) +FS_EXTERN_OVERLAY(OVY_18) +FS_EXTERN_OVERLAY(OVY_19) +FS_EXTERN_OVERLAY(OVY_2) +FS_EXTERN_OVERLAY(OVY_20) +FS_EXTERN_OVERLAY(OVY_21) +FS_EXTERN_OVERLAY(OVY_22) +FS_EXTERN_OVERLAY(OVY_25) +FS_EXTERN_OVERLAY(OVY_26) +FS_EXTERN_OVERLAY(OVY_27) +FS_EXTERN_OVERLAY(OVY_28) +FS_EXTERN_OVERLAY(OVY_29) +FS_EXTERN_OVERLAY(OVY_3) +FS_EXTERN_OVERLAY(OVY_30) +FS_EXTERN_OVERLAY(OVY_31) +FS_EXTERN_OVERLAY(OVY_32) +FS_EXTERN_OVERLAY(OVY_33) +FS_EXTERN_OVERLAY(OVY_34) +FS_EXTERN_OVERLAY(OVY_35) +FS_EXTERN_OVERLAY(OVY_36) +FS_EXTERN_OVERLAY(OVY_37) +FS_EXTERN_OVERLAY(OVY_38) +FS_EXTERN_OVERLAY(OVY_39) +FS_EXTERN_OVERLAY(OVY_4) +FS_EXTERN_OVERLAY(OVY_40) +FS_EXTERN_OVERLAY(OVY_41) +FS_EXTERN_OVERLAY(OVY_42) +FS_EXTERN_OVERLAY(OVY_43) +FS_EXTERN_OVERLAY(OVY_44) +FS_EXTERN_OVERLAY(OVY_45) +FS_EXTERN_OVERLAY(OVY_46) +FS_EXTERN_OVERLAY(OVY_47) +FS_EXTERN_OVERLAY(OVY_48) +FS_EXTERN_OVERLAY(OVY_49) +FS_EXTERN_OVERLAY(OVY_5) +FS_EXTERN_OVERLAY(OVY_53) +FS_EXTERN_OVERLAY(OVY_54) +FS_EXTERN_OVERLAY(OVY_55) +FS_EXTERN_OVERLAY(OVY_56) +FS_EXTERN_OVERLAY(OVY_57) +FS_EXTERN_OVERLAY(OVY_58) +FS_EXTERN_OVERLAY(OVY_59) +FS_EXTERN_OVERLAY(OVY_6) +FS_EXTERN_OVERLAY(OVY_60) +FS_EXTERN_OVERLAY(OVY_61) +FS_EXTERN_OVERLAY(OVY_62) +FS_EXTERN_OVERLAY(OVY_63) +FS_EXTERN_OVERLAY(OVY_64) +FS_EXTERN_OVERLAY(OVY_65) +FS_EXTERN_OVERLAY(OVY_66) +FS_EXTERN_OVERLAY(OVY_67) +FS_EXTERN_OVERLAY(OVY_68) +FS_EXTERN_OVERLAY(OVY_69) +FS_EXTERN_OVERLAY(OVY_7) +FS_EXTERN_OVERLAY(OVY_70) +FS_EXTERN_OVERLAY(OVY_71) +FS_EXTERN_OVERLAY(OVY_72) +FS_EXTERN_OVERLAY(OVY_73) +FS_EXTERN_OVERLAY(OVY_74) +FS_EXTERN_OVERLAY(OVY_75) +FS_EXTERN_OVERLAY(credits) +FS_EXTERN_OVERLAY(OVY_77) +FS_EXTERN_OVERLAY(OVY_78) +FS_EXTERN_OVERLAY(OVY_79) +FS_EXTERN_OVERLAY(OVY_8) +FS_EXTERN_OVERLAY(OVY_80) +FS_EXTERN_OVERLAY(OVY_81) +FS_EXTERN_OVERLAY(OVY_82) +FS_EXTERN_OVERLAY(OVY_83) +FS_EXTERN_OVERLAY(OVY_84) +FS_EXTERN_OVERLAY(OVY_85) +FS_EXTERN_OVERLAY(OVY_86) +FS_EXTERN_OVERLAY(OVY_87) +FS_EXTERN_OVERLAY(OVY_88) +FS_EXTERN_OVERLAY(OVY_89) +FS_EXTERN_OVERLAY(OVY_9) +FS_EXTERN_OVERLAY(OVY_90) +FS_EXTERN_OVERLAY(OVY_91) +FS_EXTERN_OVERLAY(OVY_92) +FS_EXTERN_OVERLAY(OVY_93) +FS_EXTERN_OVERLAY(OVY_94) +FS_EXTERN_OVERLAY(OVY_95) +FS_EXTERN_OVERLAY(OVY_96) +FS_EXTERN_OVERLAY(OVY_97) +FS_EXTERN_OVERLAY(OVY_98) +FS_EXTERN_OVERLAY(OVY_99) +FS_EXTERN_OVERLAY(OV_101) +FS_EXTERN_OVERLAY(bug_contest) +FS_EXTERN_OVERLAY(field) +FS_EXTERN_OVERLAY(npc_trade) +FS_EXTERN_OVERLAY(trainer_card) +FS_EXTERN_OVERLAY(trainer_card_main) +FS_EXTERN_OVERLAY(trainer_card_signature) diff --git a/graphics_files_rules.mk b/graphics_files_rules.mk new file mode 100644 index 00000000..76c1a7a6 --- /dev/null +++ b/graphics_files_rules.mk @@ -0,0 +1,32 @@ +$(CLOBBER_SIZE_NCGR_FILES): GFX_FLAGS = -clobbersize +$(CLOBBER_SIZE_VERSION101_NCGR_FILES): GFX_FLAGS = -clobbersize -version101 +$(VERSION101_SOPC_8BPP_NCGR_FILES): GFX_FLAGS = -version101 -sopc -bitdepth 8 +$(VERSION101_SOPC_NCGR_FILES): GFX_FLAGS = -version101 -sopc +$(SCANNED_NCGR_FILES): GFX_FLAGS = -scanned + +$(IR_NCLR_FILES): GFX_FLAGS = -ir +$(4BPP_NCLR_FILES): GFX_FLAGS = -bitdepth 4 +$(8BPP_NSCR_FILES): GFX_FLAGS = -bitdepth 8 +$(8BPP_COMP10_NOPAD_NCLR_PNG_FILES): GFX_FLAGS = -bitdepth 8 -nopad -comp 10 +$(8BPP_COMP10_NOPAD_NCLR_PAL_FILES): GFX_FLAGS = -bitdepth 8 -nopad -comp 10 + +LZ_FLAGS := -l2 -s +$(PADDED_LZ_FILES): LZ_FLAGS += -A4 + +%.NCGR: %.png + $(GFX) $< $@ $(GFX_FLAGS) + +%.NCLR: %.png + $(GFX) $< $@ $(GFX_FLAGS) + +%.NCLR: %.pal + $(GFX) $< $@ $(GFX_FLAGS) + +%.nbfc: %.png + $(GFX) $< $@ $(GFX_FLAGS) + +%.nbfp: %.png + $(GFX) $< $@ $(GFX_FLAGS) + +%.lz: % + $(NTRCOMP) $(LZ_FLAGS) -o $@ $< diff --git a/lib/NitroDWC/asm/dwcaccount.s b/lib/NitroDWC/asm/dwcaccount.s new file mode 100644 index 00000000..b2c562bb --- /dev/null +++ b/lib/NitroDWC/asm/dwcaccount.s @@ -0,0 +1,1103 @@ + .include "asm/macros.inc" + .include "dwcaccount.inc" + .include "global.inc" + + .text + + arm_func_start DWC_Init +DWC_Init: ; 0x0209FAE4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, _0209FB44 ; =_version_NINTENDO_DWC + mov r5, #0 + bl OSi_ReferSymbol + mov r0, r6 + bl DWC_BM_Init + mov r4, r0 + bl DWC_Auth_CheckPseudoWiFiID + cmp r0, #0 + beq _0209FB1C + mov r0, r6 + bl DWCi_AUTH_MakeWiFiID + mov r5, #1 +_0209FB1C: + cmp r4, #0 + bge _0209FB34 + cmp r5, #0 + movne r0, #2 + moveq r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_0209FB34: + cmp r5, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0209FB44: .word _version_NINTENDO_DWC + arm_func_end DWC_Init + + arm_func_start DWCi_Acc_SetMaskBits +DWCi_Acc_SetMaskBits: ; 0x0209FB48 + mvn ip, r3 + tst r1, ip + movne r0, #0 + bxne lr + mvn r3, r3, lsl r2 + ldr ip, [r0] + and r3, ip, r3 + orr r1, r3, r1, lsl r2 + str r1, [r0] + mov r0, #1 + bx lr + arm_func_end DWCi_Acc_SetMaskBits + + arm_func_start DWCi_Acc_GetUserId +DWCi_Acc_GetUserId: ; 0x0209FB74 + ldr r2, [r0] + ldr r1, _0209FB90 ; =0x000007FF + ldr r0, [r0, #4] + and r1, r2, r1 + orr r1, r1, #0 + orr r0, r0, #0 + bx lr + .align 2, 0 +_0209FB90: .word 0x000007FF + arm_func_end DWCi_Acc_GetUserId + + arm_func_start DWCi_Acc_GetPlayerId +DWCi_Acc_GetPlayerId: ; 0x0209FB94 + ldr r0, [r0, #8] + bx lr + arm_func_end DWCi_Acc_GetPlayerId + + arm_func_start DWCi_Acc_GetFriendKey +DWCi_Acc_GetFriendKey: ; 0x0209FB9C + ldr r1, [r0, #8] + ldr r0, [r0, #4] + orr r1, r1, #0 + orr r0, r0, #0 + bx lr + arm_func_end DWCi_Acc_GetFriendKey + + arm_func_start DWCi_Acc_GetGsProfileId +DWCi_Acc_GetGsProfileId: ; 0x0209FBB0 + ldr r0, [r0, #4] + bx lr + arm_func_end DWCi_Acc_GetGsProfileId + + arm_func_start DWCi_Acc_SetUserId +DWCi_Acc_SetUserId: ; 0x0209FBB8 + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _0209FBDC ; =0x000007FF + mov r4, r1 + mov r1, r2 + mov r2, #0 + mov r5, r0 + bl DWCi_Acc_SetMaskBits + str r4, [r5, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0209FBDC: .word 0x000007FF + arm_func_end DWCi_Acc_SetUserId + + arm_func_start DWCi_Acc_SetPlayerId +DWCi_Acc_SetPlayerId: ; 0x0209FBE0 + str r1, [r0, #8] + bx lr + arm_func_end DWCi_Acc_SetPlayerId + + arm_func_start DWCi_Acc_SetFriendKey +DWCi_Acc_SetFriendKey: ; 0x0209FBE8 + stmib r0, {r1, r2} + bx lr + arm_func_end DWCi_Acc_SetFriendKey + + arm_func_start DWCi_Acc_SetGsProfileId +DWCi_Acc_SetGsProfileId: ; 0x0209FBF0 + str r1, [r0, #4] + bx lr + arm_func_end DWCi_Acc_SetGsProfileId + + arm_func_start DWCi_Acc_GetFlags +DWCi_Acc_GetFlags: ; 0x0209FBF8 + ldr r1, [r0] + ldr r0, _0209FC08 ; =0x001FFFFF + and r0, r0, r1, lsr #11 + bx lr + .align 2, 0 +_0209FC08: .word 0x001FFFFF + arm_func_end DWCi_Acc_GetFlags + + arm_func_start DWCi_Acc_GetFlag_DataType +DWCi_Acc_GetFlag_DataType: ; 0x0209FC0C + stmdb sp!, {r3, lr} + bl DWCi_Acc_GetFlags + and r0, r0, #3 + ldmia sp!, {r3, pc} + arm_func_end DWCi_Acc_GetFlag_DataType + + arm_func_start DWC_IsBuddyFriendData +DWC_IsBuddyFriendData: ; 0x0209FC1C + stmdb sp!, {r4, lr} + mov r4, r0 + bl DWCi_Acc_GetFlag_DataType + cmp r0, #3 + bne _0209FC4C + mov r0, r4 + bl DWCi_Acc_GetFlags + and r0, r0, #4 + cmp r0, #4 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, pc} +_0209FC4C: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end DWC_IsBuddyFriendData + + arm_func_start DWC_GetFriendDataType +DWC_GetFriendDataType: ; 0x0209FC54 + ldr ip, _0209FC5C ; =DWCi_Acc_GetFlag_DataType + bx ip + .align 2, 0 +_0209FC5C: .word DWCi_Acc_GetFlag_DataType + arm_func_end DWC_GetFriendDataType + + arm_func_start DWCi_Acc_SetFlags +DWCi_Acc_SetFlags: ; 0x0209FC60 + ldr ip, _0209FC70 ; =DWCi_Acc_SetMaskBits + ldr r3, _0209FC74 ; =0x001FFFFF + mov r2, #0xb + bx ip + .align 2, 0 +_0209FC70: .word DWCi_Acc_SetMaskBits +_0209FC74: .word 0x001FFFFF + arm_func_end DWCi_Acc_SetFlags + + arm_func_start DWCi_Acc_SetFlag_DataType +DWCi_Acc_SetFlag_DataType: ; 0x0209FC78 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl DWCi_Acc_GetFlags + bic r1, r0, #3 + mov r0, r5 + orr r1, r1, r4 + bl DWCi_Acc_SetFlags + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DWCi_Acc_SetFlag_DataType + + arm_func_start DWCi_SetBuddyFriendData +DWCi_SetBuddyFriendData: ; 0x0209FC9C + stmdb sp!, {r4, lr} + mov r4, r0 + bl DWCi_Acc_GetFlag_DataType + cmp r0, #3 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl DWCi_Acc_GetFlags + orr r1, r0, #4 + mov r0, r4 + bl DWCi_Acc_SetFlags + ldmia sp!, {r4, pc} + arm_func_end DWCi_SetBuddyFriendData + + arm_func_start DWC_Acc_CreateFriendKey +DWC_Acc_CreateFriendKey: ; 0x0209FCC8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x108 + mov r4, r0 + str r1, [sp, #4] + add r0, sp, #8 + mov r1, #7 + str r4, [sp] + bl MATHi_CRC8InitTable + add r0, sp, #8 + add r1, sp, #0 + mov r2, #8 + bl MATH_CalcCRC8 + and r0, r0, #0x7f + orr r1, r0, #0 + orr r0, r4, #0 + add sp, sp, #0x108 + ldmia sp!, {r4, pc} + arm_func_end DWC_Acc_CreateFriendKey + + arm_func_start DWC_CheckFriendKey +DWC_CheckFriendKey: ; 0x0209FD0C + ldr ip, _0209FD24 ; =DWC_Acc_CheckFriendKey + mov r3, r0 + mov r0, r1 + mov r1, r2 + ldr r2, [r3, #0x24] + bx ip + .align 2, 0 +_0209FD24: .word DWC_Acc_CheckFriendKey + arm_func_end DWC_CheckFriendKey + + arm_func_start DWC_Acc_CheckFriendKey +DWC_Acc_CheckFriendKey: ; 0x0209FD28 + stmdb sp!, {r4, lr} + sub sp, sp, #0x108 + mov r4, r1 + and r1, r4, #0 + cmp r1, #0 + and r3, r0, #0x80000000 + cmpeq r3, #0 + mov r1, #0 + addne sp, sp, #0x108 + movne r0, r1 + ldmneia sp!, {r4, pc} + str r0, [sp] + add r0, sp, #8 + mov r1, #7 + str r2, [sp, #4] + bl MATHi_CRC8InitTable + add r0, sp, #8 + add r1, sp, #0 + mov r2, #8 + bl MATH_CalcCRC8 + and r1, r0, #0x7f + mov r0, r1, asr #0x1f + cmp r0, #0 + cmpeq r1, r4 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x108 + ldmia sp!, {r4, pc} + arm_func_end DWC_Acc_CheckFriendKey + + arm_func_start DWC_Acc_FriendKeyToGsProfileId +DWC_Acc_FriendKeyToGsProfileId: ; 0x0209FD98 + stmdb sp!, {r4, lr} + mov r4, r0 + bl DWC_Acc_CheckFriendKey + cmp r0, #0 + mov r0, #0 + subne r0, r0, #1 + andne r0, r4, r0 + ldmia sp!, {r4, pc} + arm_func_end DWC_Acc_FriendKeyToGsProfileId + + arm_func_start DWCi_Acc_U64ToString32 +DWCi_Acc_U64ToString32: ; 0x0209FDB8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr lr, _0209FE20 ; =0x66666667 + add r4, r2, #4 + smull ip, r2, lr, r4 + mov ip, r4, lsr #0x1f + add r2, ip, r2, asr #1 + cmp r2, #0 + ldr r7, _0209FE24 ; =_021105F4 + mov r6, #0 + ble _0209FE14 + add r4, r3, r2 + sub r4, r4, #1 + mov ip, #0x1f +_0209FDEC: + and r5, r0, ip + ldrsb r5, [r7, r5] + mov r0, r0, lsr #5 + mov lr, r1, lsr #5 + strb r5, [r4, -r6] + add r6, r6, #1 + orr r0, r0, r1, lsl #27 + mov r1, lr + cmp r6, r2 + blt _0209FDEC +_0209FE14: + mov r0, #0 + strb r0, [r3, r2] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_0209FE20: .word 0x66666667 +_0209FE24: .word _021105F4 + arm_func_end DWCi_Acc_U64ToString32 + + arm_func_start DWCi_Acc_LoginIdToUserName +DWCi_Acc_LoginIdToUserName: ; 0x0209FE28 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x40 + mov r6, r0 + mov r4, r1 + mov r5, r2 + bl DWCi_Acc_GetUserId + add r3, sp, #0x29 + mov r2, #0x2b + bl DWCi_Acc_U64ToString32 + mov r0, r6 + bl DWCi_Acc_GetPlayerId + mov r1, #0 + mov r2, #0x20 + add r3, sp, #0x14 + bl DWCi_Acc_U64ToString32 + mov r1, r4, lsr #0x18 + and r1, r1, #0xff + str r1, [sp] + mov r1, r4, lsr #0x10 + and r1, r1, #0xff + str r1, [sp, #4] + mov r1, r4, lsr #8 + and r1, r1, #0xff + str r1, [sp, #8] + and r1, r4, #0xff + str r1, [sp, #0xc] + add r2, sp, #0x14 + str r2, [sp, #0x10] + ldr r2, _0209FEB4 ; =_02110618 + mov r0, r5 + mov r1, #0x15 + add r3, sp, #0x29 + bl OS_SNPrintf + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0209FEB4: .word _02110618 + arm_func_end DWCi_Acc_LoginIdToUserName + + arm_func_start DWCi_Acc_CreateUserData +DWCi_Acc_CreateUserData: ; 0x0209FEB8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x400 + mov r4, r1 + mov r1, #0 + mov r2, #0x40 + mov r5, r0 + bl MI_CpuFill8 + mov r0, #0x40 + str r0, [r5] + mov r0, #0 + str r0, [r5, #0x1c] + add r0, r5, #4 + str r4, [r5, #0x24] + bl DWCi_Acc_CreateTempLoginId + add r0, r5, #0x10 + mov r1, #0 + bl DWCi_Acc_SetFlag_DataType + ldr r1, _0209FF30 ; =0xEDB88320 + add r0, sp, #0 + bl MATHi_CRC32InitTableRev + add r0, sp, #0 + mov r1, r5 + mov r2, #0x3c + bl MATH_CalcCRC32 + str r0, [r5, #0x3c] + ldr r0, [r5, #0x20] + orr r0, r0, #1 + str r0, [r5, #0x20] + add sp, sp, #0x400 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0209FF30: .word 0xEDB88320 + arm_func_end DWCi_Acc_CreateUserData + + arm_func_start DWCi_Acc_CreateTempLoginId +DWCi_Acc_CreateTempLoginId: ; 0x0209FF34 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x34 + mov r6, r0 + add r0, sp, #0 + bl OS_GetLowEntropyData + mov r3, #1 + add r2, sp, #0 +_0209FF50: + add r0, r2, r3, lsl #2 + ldr r1, [r2, r3, lsl #2] + ldr r0, [r0, #-4] + eor r0, r1, r0 + str r0, [r2, r3, lsl #2] + add r3, r3, #1 + cmp r3, #8 + blo _0209FF50 + add r0, sp, #0x20 + ldr r5, [sp, #0x1c] + mov r4, #0 + bl DWC_Auth_GetId + ldr r0, [sp, #0x30] + cmp r0, #0 + beq _0209FFA0 + ldr r1, [sp, #0x20] + ldr r2, [sp, #0x24] + mov r0, r6 + bl DWCi_Acc_SetUserId + b _0209FFB0 +_0209FFA0: + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + mov r0, r6 + bl DWCi_Acc_SetUserId +_0209FFB0: + ldr r0, _0209FFEC ; =0x6C078965 + ldr r1, _0209FFF0 ; =0x5D588B65 + umull r3, r2, r5, r0 + mla r2, r5, r1, r2 + ldr r1, _0209FFF4 ; =0x00269EC3 + mla r2, r4, r0, r2 + adds r0, r3, r1 + mov r0, r6 + adc r1, r2, #0 + bl DWCi_Acc_SetPlayerId + mov r0, r6 + mov r1, #1 + bl DWCi_Acc_SetFlag_DataType + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_0209FFEC: .word 0x6C078965 +_0209FFF0: .word 0x5D588B65 +_0209FFF4: .word 0x00269EC3 + arm_func_end DWCi_Acc_CreateTempLoginId + + arm_func_start DWCi_Acc_CheckConsoleUserId +DWCi_Acc_CheckConsoleUserId: ; 0x0209FFF8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r4, r0 + add r0, sp, #0 + bl DWC_Auth_GetId + ldr r0, [sp, #0x10] + cmp r0, #0 + mov r0, r4 + beq _020A0040 + bl DWCi_Acc_GetUserId + ldr r2, [sp, #4] + ldr r3, [sp] + cmp r2, r1 + cmpeq r3, r0 + moveq r0, #1 + add sp, sp, #0x14 + movne r0, #0 + ldmia sp!, {r3, r4, pc} +_020A0040: + bl DWCi_Acc_GetUserId + ldr r2, [sp, #0xc] + ldr r3, [sp, #8] + cmp r2, r1 + cmpeq r3, r0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + arm_func_end DWCi_Acc_CheckConsoleUserId + + arm_func_start DWCi_Acc_IsValidLoginId +DWCi_Acc_IsValidLoginId: ; 0x020A0064 + stmdb sp!, {r3, lr} + bl DWCi_Acc_GetFlag_DataType + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end DWCi_Acc_IsValidLoginId + + arm_func_start DWCi_Acc_IsAuthentic +DWCi_Acc_IsAuthentic: ; 0x020A007C + ldr ip, _020A0088 ; =DWCi_Acc_IsValidLoginId + add r0, r0, #0x10 + bx ip + .align 2, 0 +_020A0088: .word DWCi_Acc_IsValidLoginId + arm_func_end DWCi_Acc_IsAuthentic + + arm_func_start DWC_IsValidFriendData +DWC_IsValidFriendData: ; 0x020A008C + stmdb sp!, {r3, lr} + bl DWCi_Acc_GetFlag_DataType + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + arm_func_end DWC_IsValidFriendData + + arm_func_start DWCi_Acc_IsValidFriendData +DWCi_Acc_IsValidFriendData: ; 0x020A00A4 + ldr ip, _020A00AC ; =DWC_IsValidFriendData + bx ip + .align 2, 0 +_020A00AC: .word DWC_IsValidFriendData + arm_func_end DWCi_Acc_IsValidFriendData + + arm_func_start DWC_CreateUserData +DWC_CreateUserData: ; 0x020A00B0 + ldr ip, _020A00B8 ; =DWCi_Acc_CreateUserData + bx ip + .align 2, 0 +_020A00B8: .word DWCi_Acc_CreateUserData + arm_func_end DWC_CreateUserData + + arm_func_start DWC_CheckUserData +DWC_CheckUserData: ; 0x020A00BC + stmdb sp!, {r4, lr} + sub sp, sp, #0x400 + ldr r1, _020A00FC ; =0xEDB88320 + mov r4, r0 + add r0, sp, #0 + bl MATHi_CRC32InitTableRev + add r0, sp, #0 + mov r1, r4 + mov r2, #0x3c + bl MATH_CalcCRC32 + ldr r1, [r4, #0x3c] + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x400 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A00FC: .word 0xEDB88320 + arm_func_end DWC_CheckUserData + + arm_func_start DWC_CheckHasProfile +DWC_CheckHasProfile: ; 0x020A0100 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x10 + bl DWCi_Acc_IsValidLoginId + cmp r0, #0 + beq _020A0128 + ldr r0, [r4, #0x1c] + cmp r0, #0 + movgt r0, #1 + ldmgtia sp!, {r4, pc} +_020A0128: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end DWC_CheckHasProfile + + arm_func_start DWC_CheckValidConsole +DWC_CheckValidConsole: ; 0x020A0130 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r4, r0 + add r0, r4, #0x10 + bl DWCi_Acc_GetFlag_DataType + cmp r0, #0 + addeq sp, sp, #0x14 + moveq r0, #1 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #0 + bl DWC_Auth_GetId + ldr r0, [sp, #0x10] + cmp r0, #0 + addeq sp, sp, #0x14 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, r4, #0x10 + bl DWCi_Acc_GetUserId + ldr r2, [sp, #4] + ldr r3, [sp] + cmp r2, r1 + cmpeq r3, r0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + arm_func_end DWC_CheckValidConsole + + arm_func_start DWCi_Acc_SetLoginIdToUserData +DWCi_Acc_SetLoginIdToUserData: ; 0x020A0198 + stmdb sp!, {r4, lr} + sub sp, sp, #0x400 + mov r4, r0 + add r3, r4, #0x10 + mov ip, r2 + ldmia r1, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r1, _020A01EC ; =0xEDB88320 + add r0, sp, #0 + str ip, [r4, #0x1c] + bl MATHi_CRC32InitTableRev + add r0, sp, #0 + mov r1, r4 + mov r2, #0x3c + bl MATH_CalcCRC32 + str r0, [r4, #0x3c] + ldr r0, [r4, #0x20] + orr r0, r0, #1 + str r0, [r4, #0x20] + add sp, sp, #0x400 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A01EC: .word 0xEDB88320 + arm_func_end DWCi_Acc_SetLoginIdToUserData + + arm_func_start DWC_CheckDirtyFlag +DWC_CheckDirtyFlag: ; 0x020A01F0 + ldr ip, _020A01F8 ; =DWCi_Acc_IsDirty + bx ip + .align 2, 0 +_020A01F8: .word DWCi_Acc_IsDirty + arm_func_end DWC_CheckDirtyFlag + + arm_func_start DWCi_Acc_IsDirty +DWCi_Acc_IsDirty: ; 0x020A01FC + ldr r0, [r0, #0x20] + and r0, r0, #1 + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end DWCi_Acc_IsDirty + + arm_func_start DWC_ClearDirtyFlag +DWC_ClearDirtyFlag: ; 0x020A0214 + ldr ip, _020A021C ; =DWCi_Acc_ClearDirty + bx ip + .align 2, 0 +_020A021C: .word DWCi_Acc_ClearDirty + arm_func_end DWC_ClearDirtyFlag + + arm_func_start DWCi_Acc_ClearDirty +DWCi_Acc_ClearDirty: ; 0x020A0220 + stmdb sp!, {r4, lr} + sub sp, sp, #0x400 + mov r4, r0 + ldr r1, [r4, #0x20] + add r0, sp, #0 + bic r2, r1, #1 + ldr r1, _020A0260 ; =0xEDB88320 + str r2, [r4, #0x20] + bl MATHi_CRC32InitTableRev + add r0, sp, #0 + mov r1, r4 + mov r2, #0x3c + bl MATH_CalcCRC32 + str r0, [r4, #0x3c] + add sp, sp, #0x400 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A0260: .word 0xEDB88320 + arm_func_end DWCi_Acc_ClearDirty + + arm_func_start DWC_GetFriendKey +DWC_GetFriendKey: ; 0x020A0264 + stmdb sp!, {r4, lr} + mov r4, r0 + bl DWCi_Acc_GetFlag_DataType + cmp r0, #2 + movne r0, #0 + movne r1, r0 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl DWCi_Acc_GetFriendKey + ldmia sp!, {r4, pc} + arm_func_end DWC_GetFriendKey + + arm_func_start DWC_GetGsProfileId +DWC_GetGsProfileId: ; 0x020A028C + stmdb sp!, {r4, r5, r6, lr} + mov r4, r1 + mov r6, r0 + mov r0, r4 + bl DWCi_Acc_GetFlag_DataType + cmp r0, #1 + beq _020A0300 + cmp r0, #2 + beq _020A02BC + cmp r0, #3 + beq _020A02F4 + b _020A0308 +_020A02BC: + mov r0, r4 + bl DWCi_Acc_GetFriendKey + ldr r2, [r6, #0x24] + mov r4, r0 + mov r5, r1 + bl DWC_Acc_CheckFriendKey + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r2, [r6, #0x24] + mov r0, r4 + mov r1, r5 + bl DWC_Acc_FriendKeyToGsProfileId + ldmia sp!, {r4, r5, r6, pc} +_020A02F4: + mov r0, r4 + bl DWCi_Acc_GetGsProfileId + ldmia sp!, {r4, r5, r6, pc} +_020A0300: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020A0308: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DWC_GetGsProfileId + + arm_func_start DWC_CreateFriendKey +DWC_CreateFriendKey: ; 0x020A0310 + stmdb sp!, {r3, lr} + mov r3, r0 + ldr r0, [r3, #0x1c] + mov r2, #0 + mov r1, r2 + cmp r0, #0 + beq _020A0338 + ldr r1, [r3, #0x24] + bl DWC_Acc_CreateFriendKey + mov r2, r0 +_020A0338: + mov r0, r2 + ldmia sp!, {r3, pc} + arm_func_end DWC_CreateFriendKey + + arm_func_start DWC_CreateFriendKeyToken +DWC_CreateFriendKeyToken: ; 0x020A0340 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r4, r2 + mov r6, r0 + mov r1, #0 + mov r2, #0xc + bl MI_CpuFill8 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl DWCi_Acc_SetFriendKey + mov r0, r6 + mov r1, #2 + bl DWCi_Acc_SetFlag_DataType + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DWC_CreateFriendKeyToken + + arm_func_start DWC_CreateExchangeToken +DWC_CreateExchangeToken: ; 0x020A037C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + mov r1, #0 + mov r2, #0xc + bl MI_CpuFill8 + mov r0, r5 + bl DWCi_Acc_IsAuthentic + cmp r0, #0 + addeq r0, r5, #4 + ldmeqia r0, {r0, r1, r2} + stmeqia r4, {r0, r1, r2} + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #0x1c] + mov r0, r4 + bl DWCi_Acc_SetGsProfileId + mov r0, r4 + mov r1, #3 + bl DWCi_Acc_SetFlag_DataType + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DWC_CreateExchangeToken + + arm_func_start DWC_SetGsProfileId +DWC_SetGsProfileId: ; 0x020A03D0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r1, #0 + mov r2, #0xc + bl MI_CpuFill8 + mov r0, r5 + mov r1, r4 + bl DWCi_Acc_SetGsProfileId + mov r0, r5 + mov r1, #3 + bl DWCi_Acc_SetFlag_DataType + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DWC_SetGsProfileId + + arm_func_start DWC_LoginIdToUserName +DWC_LoginIdToUserName: ; 0x020A0404 + ldr ip, _020A0418 ; =DWCi_Acc_LoginIdToUserName + mov r3, r0 + mov r0, r1 + ldr r1, [r3, #0x24] + bx ip + .align 2, 0 +_020A0418: .word DWCi_Acc_LoginIdToUserName + arm_func_end DWC_LoginIdToUserName + + arm_func_start DWC_IsEqualFriendData +DWC_IsEqualFriendData: ; 0x020A041C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + mov r7, r0 + bl DWCi_Acc_GetFlag_DataType + mov r5, r0 + mov r0, r4 + bl DWCi_Acc_GetFlag_DataType + cmp r5, r0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #3 + bne _020A0470 + mov r0, r7 + bl DWCi_Acc_GetGsProfileId + mov r5, r0 + mov r0, r4 + bl DWCi_Acc_GetGsProfileId + cmp r5, r0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A0470: + cmp r5, #1 + bne _020A04C4 + mov r0, r7 + bl DWCi_Acc_GetUserId + mov r5, r0 + mov r6, r1 + mov r0, r4 + bl DWCi_Acc_GetUserId + cmp r6, r1 + cmpeq r5, r0 + bne _020A04BC + mov r0, r7 + bl DWCi_Acc_GetPlayerId + mov r5, r0 + mov r0, r4 + bl DWCi_Acc_GetPlayerId + cmp r5, r0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020A04BC: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A04C4: + cmp r5, #2 + bne _020A04F8 + mov r0, r7 + bl DWCi_Acc_GetFriendKey + mov r5, r0 + mov r6, r1 + mov r0, r4 + bl DWCi_Acc_GetFriendKey + cmp r6, r1 + cmpeq r5, r0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A04F8: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end DWC_IsEqualFriendData + + ; libcrypto.a:rc4.o + + arm_func_start CRYPTO_RC4FastInit +CRYPTO_RC4FastInit: ; 0x020A0500 + stmdb sp!, {r4, r5, r6, lr} + mov r3, #0 + str r3, [r0] + cmp r2, #0x10 + str r3, [r0, #4] + movhi r2, #0x10 + add r0, r0, #8 +_020A051C: + str r3, [r0, r3, lsl #2] + add r3, r3, #1 + cmp r3, #0x100 + blt _020A051C + mov r5, #0 + mov r6, r5 + mov lr, r5 + mov ip, r5 +_020A053C: + ldrb r3, [r1, r6] + ldr r4, [r0, lr, lsl #2] + add r6, r6, #1 + add r3, r4, r3 + add r3, r5, r3 + and r5, r3, #0xff + ldr r3, [r0, r5, lsl #2] + cmp r6, r2 + str r3, [r0, lr, lsl #2] + add lr, lr, #1 + moveq r6, ip + str r4, [r0, r5, lsl #2] + cmp lr, #0x100 + blt _020A053C + mov r2, #0 +_020A0578: + ldr r1, [r0, r2, lsl #2] + mov r1, r1, lsl #0x18 + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #0x100 + blt _020A0578 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end CRYPTO_RC4FastInit + + arm_func_start CRYPTO_RC4Init +CRYPTO_RC4Init: ; 0x020A0598 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r3, #0 + strb r3, [r0] + cmp r2, #0x10 + strb r3, [r0, #1] + movhi r2, #0x10 + add r0, r0, #4 +_020A05B8: + strb r3, [r0, r3] + add r3, r3, #1 + cmp r3, #0x100 + blt _020A05B8 + mov r6, #0 + mov r7, r6 + mov r4, r6 + mov r3, r6 + and ip, r2, #0xff +_020A05DC: + ldrb r5, [r0, r4] + ldrb lr, [r1, r7] + add r2, r7, #1 + and r7, r2, #0xff + add r2, r5, lr + add r2, r6, r2 + and r6, r2, #0xff + ldrb r2, [r0, r6] + add lr, r0, r4 + add r4, r4, #1 + strb r2, [lr] + cmp r7, ip + moveq r7, r3 + cmp r4, #0x100 + strb r5, [r0, r6] + blt _020A05DC + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + arm_func_end CRYPTO_RC4Init + + arm_func_start CRYPTO_RC4FastEncrypt +CRYPTO_RC4FastEncrypt: ; 0x020A0628 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + ldr r7, [r0] + ldr r6, [r0, #4] + add r0, r0, #8 + mov lr, #0x1000000 + add r7, r7, lr + subs r2, r2, #8 + ldr sb, [r0, r7, lsr #22] + bmi _020A07B4 +_020A064C: + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + add r6, r6, sb + subs r2, r2, #8 + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + bpl _020A064C +_020A07B4: + adds r2, r2, #8 + ble _020A07F0 +_020A07BC: + add r6, r6, sb + subs r2, r2, #1 + ldr r8, [r0, r6, lsr #22] + ldrb r5, [r1], #1 + str r8, [r0, r7, lsr #22] + str sb, [r0, r6, lsr #22] + add r4, sb, r8 + add r7, r7, lr + ldr r4, [r0, r4, lsr #22] + ldr sb, [r0, r7, lsr #22] + eor r5, r5, r4, lsr #24 + strb r5, [r3], #1 + bgt _020A07BC +_020A07F0: + sub r7, r7, lr + and r7, r7, #0xff000000 + str r6, [r0, #-4] + str r7, [r0, #-8] + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end CRYPTO_RC4FastEncrypt + + .data + +_021105F4: + .asciz "0123456789abcdefghijklmnopqrstuv" + .balign 4, 0 +_02110618: + .asciz "%s%c%c%c%c%s" diff --git a/lib/NitroDWC/asm/dwcbm.s b/lib/NitroDWC/asm/dwcbm.s new file mode 100644 index 00000000..768ad71f --- /dev/null +++ b/lib/NitroDWC/asm/dwcbm.s @@ -0,0 +1,1713 @@ + .include "asm/macros.inc" + .include "dwcbm.inc" + .include "global.inc" + + .bss + +_021D43C8: + .space 0xC + +Wifi: ; 0x021D43D4 + .space 0x2C + +Work: ; 0x021D4400 + .space 0x20 + + .text + + arm_func_start DWCi_BM_GetApInfo +DWCi_BM_GetApInfo: ; 0x0209E404 + stmdb sp!, {r3, lr} + ldr r1, _0209E42C ; =_021D43C8 + mov r2, r0 + ldr r0, [r1, #8] + mov r1, #0x300 + bl readNvram + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_0209E42C: .word _021D43C8 + arm_func_end DWCi_BM_GetApInfo + + arm_func_start DWCi_BM_GetWiFiInfo +DWCi_BM_GetWiFiInfo: ; 0x0209E430 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _0209E4F0 ; =Wifi + mov r1, r4 + mov r2, #6 + bl MI_CpuCopy8 + ldr r1, _0209E4F4 ; =0x000007FF + ldr r3, [r4] + sub r0, r1, #0x800 + ldr r2, [r4, #4] + and r0, r3, r0 + str r0, [r4] + and r1, r2, r1 + str r1, [r4, #4] + ldr r0, _0209E4F8 ; =Wifi + 5 + add r1, r4, #8 + mov r2, #6 + bl MI_CpuCopy8 + ldr r1, [r4, #8] + ldr r0, [r4, #0xc] + mov r1, r1, lsr #3 + orr r1, r1, r0, lsl #29 + str r1, [r4, #8] + mov r3, r0, lsr #3 + str r3, [r4, #0xc] + ldr r1, _0209E4F4 ; =0x000007FF + ldr r2, [r4, #8] + sub r0, r1, #0x800 + and r0, r2, r0 + str r0, [r4, #8] + and r1, r1, r3 + str r1, [r4, #0xc] + ldr r0, _0209E4FC ; =Wifi + 10 + add r1, r4, #0x10 + mov r2, #2 + bl MI_CpuCopy8 + ldrh r1, [r4, #0x10] + ldr r3, _0209E500 ; =0x000003FF + ldr r0, _0209E504 ; =Wifi + 12 + mov r1, r1, asr #6 + strh r1, [r4, #0x10] + ldrh ip, [r4, #0x10] + add r1, r4, #0x12 + mov r2, #2 + and r3, ip, r3 + strh r3, [r4, #0x10] + bl MI_CpuCopy8 + ldmia sp!, {r4, pc} + .align 2, 0 +_0209E4F0: .word Wifi +_0209E4F4: .word 0x000007FF +_0209E4F8: .word Wifi + 5 +_0209E4FC: .word Wifi + 10 +_0209E500: .word 0x000003FF +_0209E504: .word Wifi + 12 + arm_func_end DWCi_BM_GetWiFiInfo + + arm_func_start DWCi_BM_SetWiFiInfo +DWCi_BM_SetWiFiInfo: ; 0x0209E508 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r2, _0209E5D8 ; =_021D43C8 + mov sl, r1 + ldr sb, [r2, #8] + bl DWCi_BACKUPlConvWifiInfo + ldr r1, _0209E5DC ; =0x0000A001 + add r0, sl, #0x200 + bl MATHi_CRC16InitTableRev + mov r5, #0x100 + ldr r6, _0209E5E0 ; =Wifi + mov r8, #0 + mov r4, r5 + mov fp, #0xe + mov r7, r5 +_0209E540: + mov r0, sb + mov r1, r7 + mov r2, sl + bl readNvram + cmp r0, #0 + bne _0209E564 + bl OS_Terminate + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0209E564: + mov r0, r6 + mov r2, fp + add r1, sl, #0xf0 + bl MI_CpuCopy8 + mov r1, sl + mov r2, #0xfe + add r0, sl, #0x200 + bl MATH_CalcCRC16 + strh r0, [sl, #0xfe] +_0209E588: + mov r0, sb + mov r1, r5 + mov r2, sl + bl writeNvram + mov r0, sl + mov r1, sb + mov r2, r4 + add r3, sl, #0x100 + bl verify + cmp r0, #0 + beq _0209E588 + add r8, r8, #1 + cmp r8, #2 + add sb, sb, #0x100 + blt _0209E540 + bl writeDisable + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0209E5D8: .word _021D43C8 +_0209E5DC: .word 0x0000A001 +_0209E5E0: .word Wifi + arm_func_end DWCi_BM_SetWiFiInfo + + arm_func_start DWCi_BACKUPlInit +DWCi_BACKUPlInit: ; 0x0209E5E4 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x20 + mov r1, r0 + mov r2, r4 + bl readNvram + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldrh r2, [r4] + ldr r1, _0209E624 ; =_021D43C8 + mov r0, #1 + mov r2, r2, lsl #3 + sub r2, r2, #0x400 + str r2, [r1, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_0209E624: .word _021D43C8 + arm_func_end DWCi_BACKUPlInit + + arm_func_start DWCi_BACKUPlRead +DWCi_BACKUPlRead: ; 0x0209E628 + stmdb sp!, {r3, lr} + ldr r1, _0209E650 ; =_021D43C8 + mov r2, r0 + ldr r0, [r1, #8] + mov r1, #0x400 + bl readNvram + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_0209E650: .word _021D43C8 + arm_func_end DWCi_BACKUPlRead + + arm_func_start DWCi_BACKUPlWritePage +DWCi_BACKUPlWritePage: ; 0x0209E654 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r3, _0209E6D8 ; =_021D43C8 + mov sl, #0x100 + ldr r5, [r3, #8] + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r4, #0 + mov sb, sl +_0209E678: + ldr r0, [r7, r4, lsl #2] + cmp r0, #0 + beq _0209E6B0 +_0209E684: + mov r0, r5 + mov r1, sl + mov r2, r8 + bl writeNvram + mov r0, r8 + mov r1, r5 + mov r2, sb + mov r3, r6 + bl verify + cmp r0, #0 + beq _0209E684 +_0209E6B0: + add r4, r4, #1 + cmp r4, #4 + add r8, r8, #0x100 + add r5, r5, #0x100 + blt _0209E678 + bl writeDisable + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_0209E6D8: .word _021D43C8 + arm_func_end DWCi_BACKUPlWritePage + + arm_func_start DWCi_BACKUPlWriteAll +DWCi_BACKUPlWriteAll: ; 0x0209E6DC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _0209E76C ; =_021D43C8 + mov r8, r0 + mov sl, #0x100 + ldr r6, [r1, #8] + mov r7, r8 + mov r5, #0 + mov sb, sl + mov r4, #0xfe +_0209E700: + mov r1, r7 + mov r2, r4 + add r0, r8, #0x500 + bl MATH_CalcCRC16 + add r1, r8, r5, lsl #8 + strh r0, [r1, #0xfe] +_0209E718: + mov r0, r6 + mov r1, sl + mov r2, r7 + bl writeNvram + mov r0, r7 + mov r1, r6 + mov r2, sb + add r3, r8, #0x400 + bl verify + cmp r0, #0 + beq _0209E718 + add r5, r5, #1 + cmp r5, #4 + add r7, r7, #0x100 + add r6, r6, #0x100 + blt _0209E700 + bl writeDisable + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_0209E76C: .word _021D43C8 + arm_func_end DWCi_BACKUPlWriteAll + + arm_func_start DWCi_BACKUPlSetWiFi +DWCi_BACKUPlSetWiFi: ; 0x0209E770 + ldr ip, _0209E780 ; =MI_CpuCopy8 + ldr r1, _0209E784 ; =Wifi + mov r2, #0xe + bx ip + .align 2, 0 +_0209E780: .word MI_CpuCopy8 +_0209E784: .word Wifi + arm_func_end DWCi_BACKUPlSetWiFi + + arm_func_start DWCi_BACKUPlConvMaskCidr +DWCi_BACKUPlConvMaskCidr: ; 0x0209E788 + stmdb sp!, {r4, lr} + mov ip, #0 + mov r3, ip + mov r2, ip +_0209E798: + ldrb r4, [r0, ip] + mov lr, r2 +_0209E7A0: + mov r1, r4, asr lr + tst r1, #1 + add lr, lr, #1 + addne r3, r3, #1 + cmp lr, #8 + blt _0209E7A0 + add ip, ip, #1 + cmp ip, #4 + blt _0209E798 + and r0, r3, #0xff + ldmia sp!, {r4, pc} + arm_func_end DWCi_BACKUPlConvMaskCidr + + arm_func_start DWCi_BACKUPlConvMaskAddr +DWCi_BACKUPlConvMaskAddr: ; 0x0209E7CC + mvn r2, #0 + mov r3, #0 + eor r2, r2, r2, lsr r0 + mov ip, r3 +_0209E7DC: + rsb r0, ip, #0x18 + mov r0, r2, lsr r0 + strb r0, [r1, r3] + add r3, r3, #1 + cmp r3, #4 + add ip, ip, #8 + blt _0209E7DC + bx lr + arm_func_end DWCi_BACKUPlConvMaskAddr + + arm_func_start DWC_BACKUPlCheckSsid +DWC_BACKUPlCheckSsid: ; 0x0209E7FC + mov r2, #0 +_0209E800: + ldrb r1, [r0, r2] + cmp r1, #0 + movne r0, #1 + bxne lr + add r2, r2, #1 + cmp r2, #0x20 + blt _0209E800 + mov r0, #0 + bx lr + arm_func_end DWC_BACKUPlCheckSsid + + arm_func_start DWC_BACKUPlCheckIp +DWC_BACKUPlCheckIp: ; 0x0209E824 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + add r1, sp, #4 + mov r0, r5 + mov r2, #4 + bl MI_CpuCopy8 + add r1, sp, #0 + mov r0, r4 + mov r2, #4 + bl MI_CpuCopy8 + ldr r3, [sp] + ldr r2, [sp, #4] + mvn r0, #1 + orr r1, r2, r3 + cmp r1, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mvn r0, r3 + tst r2, r0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DWC_BACKUPlCheckIp + + arm_func_start DWC_BACKUPlCheckAddress +DWC_BACKUPlCheckAddress: ; 0x0209E8A0 + ldrb r0, [r0] + cmp r0, #0x7f + moveq r0, #0 + bxeq lr + cmp r0, #1 + movlo r0, #0 + bxlo lr + cmp r0, #0xdf + movls r0, #1 + movhi r0, #0 + bx lr + arm_func_end DWC_BACKUPlCheckAddress + + arm_func_start NVRAMm_ExecuteCommand +NVRAMm_ExecuteCommand: ; 0x0209E8CC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + ldr sl, _0209ED20 ; =Work + mov r8, r1, lsr #0x10 + mov r4, sl, lsl #8 + mov sb, r4 + and r4, r4, #0xff00 + mov r1, r1, lsl #0x10 + orr r4, r4, #0x20000 + mov r5, r3, lsr #0x10 + mov r7, r0 + ldr ip, _0209ED24 ; =0x01020000 + mov r1, r1, lsr #0x10 + str r4, [sp, #0x30] + orr r4, r1, #0x10000 + mov r3, r3, lsl #0x10 + add r1, ip, #0x30000 + orr r1, r1, r3, lsr #16 + str r1, [sp, #0x10] + mov r1, r3, lsr #0x10 + orr r1, r1, #0x1040000 + ldr r0, _0209ED28 ; =0x02002200 + str r1, [sp, #0x24] + orr r1, r0, sl, lsr #24 + str r1, [sp, #0x28] + ldr r1, [sp, #0x30] + mov sb, sb, lsr #0x10 + orr r1, r1, #0x1000000 + str r1, [sp, #0x30] + add r1, r0, #0x300 + and r8, r8, #0xff + add r0, r0, #0x100 + orr r0, r8, r0 + orr r1, r8, r1 + str r0, [sp] + orr r0, r2, #0x20000 + str r0, [sp, #0x1c] + orr r0, r5, #0x30000 + str r0, [sp, #0x20] + orr r0, r5, #0x40000 + str r0, [sp, #0xc] + ldr r0, _0209ED2C ; =0x03002100 + mov r6, #0 + sub r0, r0, #0x100 + str r0, [sp, #0x14] + mov r0, r2, lsr #0x10 + orr r0, r0, #0x20000 + str r0, [sp, #4] + mov r0, r2, lsl #0x10 + mov r0, r0, lsr #0x10 + orr sb, sb, #0x10000 + orr r0, r0, #0x30000 + str sb, [sp, #0x2c] + str r1, [sp, #0x18] + str r0, [sp, #8] + mov r5, r6 + mov r8, #0xfa0 +_0209E9B0: + cmp r6, #0 + bne _0209EBF0 + ldr r0, _0209ED30 ; =_021D43C8 + cmp r7, #7 + str r5, [r0, #4] + addls pc, pc, r7, lsl #2 + b _0209E9B0 +_0209E9CC: ; jump table + b _0209E9B0 ; case 0 + b _0209E9EC ; case 1 + b _0209EA98 ; case 2 + b _0209EAB8 ; case 3 + b _0209EB54 ; case 4 + b _0209EB54 ; case 5 + b _0209EBAC ; case 6 + b _0209EBD0 ; case 7 +_0209E9EC: + ldr r1, [sp] + mov r0, #4 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + mov r0, #4 + mov r1, r4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #4] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #8] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #0xc] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #0x10] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 + b _0209E9B0 +_0209EA98: + ldr r1, [sp, #0x14] + mov r0, #4 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 + b _0209E9B0 +_0209EAB8: + ldr r1, [sp, #0x18] + mov r0, #4 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209EB44 + mov r0, #4 + mov r1, r4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209EB44 + ldr r1, [sp, #0x1c] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209EB44 + ldr r1, [sp, #0x20] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209EB44 + ldr r1, [sp, #0x24] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 +_0209EB44: + bl OS_GetTick + str r0, [sp, #0x34] + mov fp, r1 + b _0209E9B0 +_0209EB54: + ldr r1, [sp, #0x28] + mov r0, #4 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #0x2c] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + blt _0209E9B0 + ldr r1, [sp, #0x30] + mov r0, #4 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 + b _0209E9B0 +_0209EBAC: + ldr r1, _0209ED2C ; =0x03002100 + mov r0, #4 + add r1, r1, #0xc00 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 + b _0209E9B0 +_0209EBD0: + ldr r1, _0209ED2C ; =0x03002100 + mov r0, #4 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r6, #0 + movge r6, #1 + b _0209E9B0 +_0209EBF0: + ldr r0, _0209ED30 ; =_021D43C8 + ldr r0, [r0, #4] + cmp r0, #1 + bne _0209E9B0 + ldr r0, _0209ED30 ; =_021D43C8 + mov r6, #0 + ldrh r0, [r0] + cmp r0, #0 + bne _0209ED14 + cmp r7, #7 + addls pc, pc, r7, lsl #2 + b _0209E9B0 +_0209EC20: ; jump table + b _0209E9B0 ; case 0 + b _0209EC40 ; case 1 + b _0209EC4C ; case 2 + b _0209EC54 ; case 3 + b _0209EC5C ; case 4 + b _0209EC5C ; case 5 + b _0209ECFC ; case 6 + b _0209ED08 ; case 7 +_0209EC40: + add sp, sp, #0x3c + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0209EC4C: + mov r7, #4 + b _0209E9B0 +_0209EC54: + mov r7, #5 + b _0209E9B0 +_0209EC5C: + mov r0, sl + mov r1, #1 + bl DC_InvalidateRange + cmp r7, #4 + ldrb r0, [sl] + bne _0209EC8C + tst r0, #2 + movne r7, #3 + bne _0209E9B0 + add sp, sp, #0x3c + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0209EC8C: + tst r0, #1 + addeq sp, sp, #0x3c + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + tst r0, #0x20 + bne _0209ECE8 + bl OS_GetTick + ldr r2, [sp, #0x34] + mov ip, r6 + subs sb, r0, r2 + mov r0, #0x40 + sbc lr, r1, fp + umull r0, r1, sb, r0 + mla r1, sb, ip, r1 + mov sb, #0x40 + mla r1, lr, sb, r1 + ldr r2, _0209ED34 ; =0x000082EA + mov r3, r6 + bl _ll_udiv + mov r2, r6 + cmp r1, r2 + cmpeq r0, r8 + bls _0209ECF0 +_0209ECE8: + mov r7, #6 + b _0209E9B0 +_0209ECF0: + mov r0, #0x4000 + bl SVC_WaitByLoop + b _0209E9B0 +_0209ECFC: + add sp, sp, #0x3c + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0209ED08: + add sp, sp, #0x3c + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0209ED14: + mov r0, r6 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0209ED20: .word Work +_0209ED24: .word 0x01020000 +_0209ED28: .word 0x02002200 +_0209ED2C: .word 0x03002100 +_0209ED30: .word _021D43C8 +_0209ED34: .word 0x000082EA + arm_func_end NVRAMm_ExecuteCommand + + arm_func_start readNvram +readNvram: ; 0x0209ED38 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r4, r2 + mov r6, r0 + mov r0, r4 + mov r5, r1 + bl DC_InvalidateRange + mov r8, #4 + mov r7, #1 +_0209ED58: + mov r0, r8 + mov r1, r7 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _0209ED58 + ldr r1, _0209EDC4 ; =Callback_NVRAM + mov r0, #4 + bl PXI_SetFifoRecvCallback + mov r0, r5, lsl #0x10 + mov r8, r0, lsr #0x10 + mov r7, #0x40000 + mov sb, #1 +_0209ED88: + mov r0, sb + mov r1, r6 + mov r2, r8 + mov r3, r4 + bl NVRAMm_ExecuteCommand + cmp r0, #1 + beq _0209EDB0 + mov r0, r7 + bl SVC_WaitByLoop + b _0209ED88 +_0209EDB0: + mov r0, r4 + mov r1, r5 + bl DC_InvalidateRange + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_0209EDC4: .word Callback_NVRAM + arm_func_end readNvram + + arm_func_start writeNvram +writeNvram: ; 0x0209EDC8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, #4 + mov r4, #1 +_0209EDE0: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _0209EDE0 + ldr r1, _0209EE40 ; =Callback_NVRAM + mov r0, #4 + bl PXI_SetFifoRecvCallback + mov r0, r6 + mov r1, r7 + bl DC_StoreRange + mov r4, #0x40000 + mov r5, #2 +_0209EE14: + mov r0, r5 + mov r1, r8 + mov r2, r7 + mov r3, r6 + bl NVRAMm_ExecuteCommand + cmp r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + bl SVC_WaitByLoop + b _0209EE14 +_0209EE3C: ; 0x0209EE3C + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_0209EE40: .word Callback_NVRAM + arm_func_end writeNvram + + arm_func_start verify +verify: ; 0x0209EE44 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r2 + mov r4, r3 + mov r6, r0 + mov r0, r1 + mov r1, r5 + mov r2, r4 + bl readNvram + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end verify + + arm_func_start writeDisable +writeDisable: ; 0x0209EE90 + stmdb sp!, {r4, r5, r6, lr} + mov r5, #4 + mov r4, #1 +_0209EE9C: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _0209EE9C + ldr r1, _0209EEF8 ; =Callback_NVRAM + mov r0, #4 + bl PXI_SetFifoRecvCallback + mov r4, #0x40000 + mov r6, #7 + mov r5, #0 +_0209EEC8: + mov r0, r6 + mov r1, r5 + mov r2, r5 + mov r3, r5 + bl NVRAMm_ExecuteCommand + cmp r0, #1 + beq _0209EEF0 + mov r0, r4 + bl SVC_WaitByLoop + b _0209EEC8 +_0209EEF0: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0209EEF8: .word Callback_NVRAM + arm_func_end writeDisable + + arm_func_start Callback_NVRAM +Callback_NVRAM: ; 0x0209EEFC + ldr r0, _0209EF28 ; =_021D43C8 + and r1, r1, #0xff + strh r1, [r0] + mov r1, #1 + str r1, [r0, #4] + cmp r2, #0 + movne r1, #0xff + strneh r1, [r0] + ldr r0, _0209EF28 ; =_021D43C8 + ldrh r0, [r0] + bx lr + .align 2, 0 +_0209EF28: .word _021D43C8 + arm_func_end Callback_NVRAM + + arm_func_start DWCi_BACKUPlConvWifiInfo +DWCi_BACKUPlConvWifiInfo: ; 0x0209EF2C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + ldr r3, [r4, #8] + ldr r2, [r4, #0xc] + ldr r1, _0209EFE0 ; =Wifi + str r2, [sp, #4] + str r3, [sp] + mov r2, #5 + bl MI_CpuCopy8 + ldr r2, [sp] + ldr r1, [sp, #4] + mov ip, r2, lsr #5 + ldr lr, [r4, #4] + mov r3, r1, lsr #5 + orr ip, ip, r1, lsl #27 + mov r0, #7 + and r1, r0, lr, lsr #8 + and r0, r2, #0x1f + orr lr, r1, r0, lsl #3 + ldr r2, _0209EFE0 ; =Wifi + ldr r1, _0209EFE4 ; =Wifi + 6 + strb lr, [r2, #5] + add r0, sp, #0 + str ip, [sp] + str r3, [sp, #4] + mov r2, #4 + bl MI_CpuCopy8 + ldrh r0, [r4, #0x10] + ldr r1, [sp, #4] + ldr r3, _0209EFE0 ; =Wifi + and r1, r1, #0x3f + mov r0, r0, lsl #0x1e + orr r0, r1, r0, lsr #24 + strb r0, [r3, #0xa] + ldrh r2, [r4, #0x10] + add r0, r4, #0x12 + ldr r1, _0209EFE8 ; =Wifi + 12 + mov r4, r2, asr #2 + mov r2, #2 + strb r4, [r3, #0xb] + bl MI_CpuCopy8 + ldr r0, _0209EFE0 ; =Wifi + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_0209EFE0: .word Wifi +_0209EFE4: .word Wifi + 6 +_0209EFE8: .word Wifi + 12 + arm_func_end DWCi_BACKUPlConvWifiInfo + + arm_func_start DWCi_BACKUPlGetWifi +DWCi_BACKUPlGetWifi: ; 0x0209EFEC + ldr r0, _0209EFF4 ; =Wifi + bx lr + .align 2, 0 +_0209EFF4: .word Wifi + arm_func_end DWCi_BACKUPlGetWifi + + arm_func_start DWC_BM_Init +DWC_BM_Init: ; 0x0209EFF8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x10 + mov r8, r0 + mov r1, #0 + mov r2, #0x700 + bl MI_CpuFill8 + mov r0, r8 + bl DWCi_BACKUPlInit + cmp r0, #0 + addeq sp, sp, #0x10 + ldreq r0, _0209F2EC ; =0xFFFFD8EF + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _0209F2F0 ; =0x0000A001 + add r0, r8, #0x500 + bl MATHi_CRC16InitTableRev + mov r0, r8 + bl DWCi_BACKUPlRead + cmp r0, #0 + addeq sp, sp, #0x10 + ldreq r0, _0209F2EC ; =0xFFFFD8EF + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r0, sp, #0 + mov r1, #0 + mov r2, #0x10 + bl MI_CpuFill8 + mov r6, r8 + mov r7, r8 + mov r5, #0 + mov sl, #1 + add sb, sp, #0 + mov r4, #0xfe +_0209F074: + mov r1, r6 + mov r2, r4 + add r0, r8, #0x500 + bl MATH_CalcCRC16 + add r1, r8, r5, lsl #8 + ldrh r1, [r1, #0xfe] + cmp r0, r1 + bne _0209F0A4 + mov r0, r7 + bl checkAp + cmp r0, #0 + strne sl, [sb, r5, lsl #2] +_0209F0A4: + add r5, r5, #1 + cmp r5, #3 + add r6, r6, #0x100 + add r7, r7, #0x100 + blt _0209F074 + add r0, r8, #0x500 + add r1, r8, #0x300 + mov r2, #0xfe + bl MATH_CalcCRC16 + add r1, r8, #0x300 + ldrh r1, [r1, #0xfe] + cmp r0, r1 + moveq r0, #1 + ldr r1, [sp] + streq r0, [sp, #0xc] + cmp r1, #0 + ldrne r0, [sp, #4] + cmpne r0, #0 + ldrne r0, [sp, #8] + cmpne r0, #0 + ldrne r0, [sp, #0xc] + cmpne r0, #0 + beq _0209F114 + add r0, r8, #0xf0 + bl DWCi_BACKUPlSetWiFi + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0209F114: + cmp r1, #0 + ldreq r0, [sp, #4] + cmpeq r0, #0 + ldreq r0, [sp, #8] + cmpeq r0, #0 + ldreq r0, [sp, #0xc] + cmpeq r0, #0 + bne _0209F158 + mov r0, r8 + bl init + mov r0, r8 + bl DWCi_BACKUPlWriteAll + cmp r0, #0 + movne r0, #0 + add sp, sp, #0x10 + ldreq r0, _0209F2F4 ; =0xFFFFD8F0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0209F158: + cmp r1, #0 + ldrne r0, [sp, #4] + cmpne r0, #0 + bne _0209F1A0 + ldr r0, [sp, #8] + cmp r0, #0 + ldrne r0, [sp, #0xc] + cmpne r0, #0 + bne _0209F1A0 + mov r0, r8 + bl init + mov r0, r8 + bl DWCi_BACKUPlWriteAll + cmp r0, #0 + movne r0, #0 + add sp, sp, #0x10 + ldreq r0, _0209F2F4 ; =0xFFFFD8F0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0209F1A0: + cmp r1, #0 + ldreq r0, [sp, #4] + cmpeq r0, #0 + bne _0209F1D4 + mov r0, r8 + bl init + mov r0, r8 + bl DWCi_BACKUPlWriteAll + cmp r0, #0 + ldrne r0, _0209F2F8 ; =0xFFFFD8ED + add sp, sp, #0x10 + ldreq r0, _0209F2F4 ; =0xFFFFD8F0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0209F1D4: + cmp r1, #0 + bne _0209F204 + mov r0, r8 + mov r1, #0 + bl initPage + add r0, r8, #0x1f0 + add r1, r8, #0xf0 + mov r2, #0xe + bl MI_CpuCopy8 + ldrb r0, [r8, #0x1ef] + strb r0, [r8, #0xef] + b _0209F234 +_0209F204: + ldr r0, [sp, #4] + cmp r0, #0 + bne _0209F234 + mov r0, r8 + mov r1, #1 + bl initPage + add r0, r8, #0xf0 + add r1, r8, #0x1f0 + mov r2, #0xe + bl MI_CpuCopy8 + ldrb r0, [r8, #0xef] + strb r0, [r8, #0x1ef] +_0209F234: + add r0, r8, #0xf0 + bl DWCi_BACKUPlSetWiFi + ldr r0, [sp, #8] + cmp r0, #0 + bne _0209F254 + mov r0, r8 + mov r1, #2 + bl initPage +_0209F254: + ldr r0, [sp, #0xc] + cmp r0, #0 + bne _0209F270 + add r1, r8, #0x300 + mov r0, #0 + mov r2, #0x100 + bl MIi_CpuClear16 +_0209F270: + mov r4, #0 + mov r5, r4 + mov r2, #1 + add r3, sp, #0 +_0209F280: + ldr r0, [r3, r5, lsl #2] + cmp r0, #0 + bne _0209F2B4 + ldrb r0, [r8, #0xef] + tst r0, r2, lsl r5 + beq _0209F2B4 + mov r1, r0 + mvn r0, r2, lsl r5 + and r0, r1, r0 + strb r0, [r8, #0xef] + and r0, r0, #0xff + mov r4, r2 + strb r0, [r8, #0x1ef] +_0209F2B4: + add r5, r5, #1 + cmp r5, #3 + blt _0209F280 + mov r0, r8 + bl DWCi_BACKUPlWriteAll + cmp r0, #0 + addeq sp, sp, #0x10 + ldreq r0, _0209F2F4 ; =0xFFFFD8F0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp r4, #0 + ldrne r0, _0209F2FC ; =0xFFFFD8EE + moveq r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_0209F2EC: .word 0xFFFFD8EF +_0209F2F0: .word 0x0000A001 +_0209F2F4: .word 0xFFFFD8F0 +_0209F2F8: .word 0xFFFFD8ED +_0209F2FC: .word 0xFFFFD8EE + arm_func_end DWC_BM_Init + + arm_func_start checkAp +checkAp: ; 0x0209F300 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldrb r0, [r4, #0xe7] + cmp r0, #0xff + addeq sp, sp, #4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, pc} + cmp r0, #2 + addhi sp, sp, #4 + movhi r0, #0 + ldmhiia sp!, {r3, r4, pc} + add r0, r4, #0x40 + bl DWC_BACKUPlCheckSsid + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r1, _0209F3FC ; =DWCi_SETTING_NONE + add r0, r4, #0xc0 + mov r2, #4 + bl memcmp + cmp r0, #0 + beq _0209F3B0 + add r0, r4, #0xc4 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldrb r0, [r4, #0xd0] + cmp r0, #0x20 + addhi sp, sp, #4 + movhi r0, #0 + ldmhiia sp!, {r3, r4, pc} + add r1, sp, #0 + bl DWCi_BACKUPlConvMaskAddr + add r1, sp, #0 + add r0, r4, #0xc0 + bl DWC_BACKUPlCheckIp + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} +_0209F3B0: + ldr r1, _0209F3FC ; =DWCi_SETTING_NONE + add r0, r4, #0xc8 + mov r2, #4 + bl memcmp + cmp r0, #0 + beq _0209F3F0 + add r0, r4, #0xc8 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + bne _0209F3F0 + add r0, r4, #0xcc + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} +_0209F3F0: + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_0209F3FC: .word DWCi_SETTING_NONE + arm_func_end checkAp + + arm_func_start init +init: ; 0x0209F400 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + mov r7, r0 + mov r1, r7 + mov r0, #0 + mov r2, #0x400 + bl MIi_CpuClear16 + mov r2, #0 + mov r1, #0xff +_0209F424: + add r0, r7, r2, lsl #8 + add r2, r2, #1 + strb r1, [r0, #0xe7] + cmp r2, #3 + blt _0209F424 + add r0, sp, #0 + bl DWCi_AUTH_GetNewWiFiInfo + add r0, sp, #0 + bl DWCi_BACKUPlConvWifiInfo + mov r5, r0 + mov r6, #0 + mov r4, #0xe +_0209F454: + mov r0, r5 + mov r2, r4 + add r1, r7, #0xf0 + bl MI_CpuCopy8 + add r6, r6, #1 + cmp r6, #2 + add r7, r7, #0x100 + blt _0209F454 + mov r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end init + + arm_func_start initPage +initPage: ; 0x0209F480 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + add r1, r5, r4, lsl #8 + mov r0, #0 + mov r2, #0x100 + bl MIi_CpuClear16 + add r0, r5, r4, lsl #8 + mov r1, #0xff + strb r1, [r0, #0xe7] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end initPage + + arm_func_start DWCi_Util_WiFiId_scrambleUid +DWCi_Util_WiFiId_scrambleUid: ; 0x0209F4AC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + ldr r4, _0209F624 ; =0x0000FFFF + mov lr, #0 + and ip, lr, #0 + add r5, r4, #0xff0000 + and r2, r2, #1 + mov r6, ip, lsl #2 + and r3, r3, #3 + and r5, r1, r5 + orr r1, r3, r2, lsl #2 + orr r6, r6, r2, lsr #30 + mov r7, ip, lsl #3 + and r2, r0, r4 + orr r0, r1, r5, lsl #3 + orr r1, r0, r2, lsl #27 + mov r3, ip, lsl #0x1b + orr r3, r3, r2, lsr #5 + orr r7, r7, r5, lsr #29 + orr r0, ip, r6 + orr r0, r7, r0 + orr r0, r3, r0 + add r2, sp, #8 + str r1, [sp, #8] + str r0, [sp, #0xc] +_0209F510: + ldrb r0, [r2] + add lr, lr, #1 + cmp lr, #6 + eor r0, r0, #0xd6 + strb r0, [r2], #1 + blt _0209F510 + ldr r2, _0209F628 ; =DWCi_util_wifiid_ttable + add r4, sp, #8 + mov r5, #0 +_0209F534: + ldrb r3, [r4] + add r5, r5, #1 + cmp r5, #5 + mov r0, r3, asr #4 + and r1, r0, #0xf + and r0, r3, #0xf + ldrb r1, [r2, r1] + ldrb r0, [r2, r0] + orr r0, r0, r1, lsl #4 + strb r0, [r4], #1 + blt _0209F534 + add r0, sp, #8 + add r1, sp, #0 + mov r2, #8 + bl MI_CpuCopy8 + ldr r4, _0209F62C ; =DWCi_util_wifiid_exctable + add r3, sp, #0 + mov r5, #0 + add r0, sp, #8 +_0209F580: + ldrb r2, [r3], #1 + ldrb r1, [r4], #1 + add r5, r5, #1 + cmp r5, #5 + strb r2, [r0, r1] + blt _0209F580 + ldrb r2, [sp, #0xd] + mov r1, #0 + ldr r3, [sp, #8] + and r2, r2, #7 + strb r1, [sp, #0xf] + strb r1, [sp, #0xe] + strb r2, [sp, #0xd] + ldr r2, [sp, #0xc] + mov r4, r3, lsl #1 + mov r2, r2, lsl #1 + orr r2, r2, r3, lsr #31 + str r2, [sp, #0xc] + ldrb r2, [sp, #0xd] + str r4, [sp, #8] + ldrb r3, [sp, #8] + mov r2, r2, asr #3 + and r2, r2, #1 + orr r2, r3, r2 + strb r2, [sp, #8] +_0209F5E4: + ldrb r2, [r0] + add r1, r1, #1 + cmp r1, #6 + eor r2, r2, #0x67 + strb r2, [r0], #1 + blt _0209F5E4 + ldrb r0, [sp, #0xd] + mov r1, #0 + strb r1, [sp, #0xf] + and r0, r0, #7 + strb r1, [sp, #0xe] + strb r0, [sp, #0xd] + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_0209F624: .word 0x0000FFFF +_0209F628: .word DWCi_util_wifiid_ttable +_0209F62C: .word DWCi_util_wifiid_exctable + arm_func_end DWCi_Util_WiFiId_scrambleUid + + arm_func_start DWCi_AUTH_GetNewWiFiInfo +DWCi_AUTH_GetNewWiFiInfo: ; 0x0209F630 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov sl, r0 + bl DWCi_BM_GetWiFiInfo + bl RTC_Init + add r0, sp, #0x14 + bl RTC_GetDate + cmp r0, #0 + addne sp, sp, #0x24 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #8 + bl RTC_GetTime + cmp r0, #0 + addne sp, sp, #0x24 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #0x14 + add r1, sp, #8 + bl RTC_ConvertDateTimeToSecond + mov r4, r0 + mov r0, #0 + subs r2, r4, r0 + sbcs r2, r1, r0 + addlt sp, sp, #0x24 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl OS_IsTickAvailable + cmp r0, #0 + beq _0209F6AC + ldr r0, _0209F7FC ; =OS_GetTick + adds r4, r4, r0 +_0209F6AC: + add r0, sp, #0 + bl OS_GetMacAddress + ldrb r0, [sp, #1] + ldr r5, _0209F800 ; =0x5D588B65 + ldr r6, _0209F804 ; =0x00269EC3 + ldrb r1, [sp] + mla sb, r4, r5, r6 + mov r0, r0, lsl #8 + orr r1, r0, r1, lsl #16 + ldrb r2, [sp, #2] + ldr r0, _0209F808 ; =0x000009BF + ldrb r7, [sp, #4] + orr r1, r2, r1 + cmp r1, r0 + mov r2, sb, lsr #0x10 + mov r0, #0x3e8 + mul r3, r2, r0 + mov r2, r3, lsr #0x10 + movne r1, #1 + ldrb r0, [sp, #5] + ldrb r4, [sp, #3] + mov r3, r7, lsl #8 + moveq r1, #0 + orr r4, r3, r4, lsl #16 + strh r2, [sl, #0x10] + mov r3, #0 + str r3, [sl] + str r3, [sl, #4] + ldrh r2, [sl, #0x12] + and r7, r1, #0xff + orr r8, r0, r4 + str r3, [sl, #8] + cmp r2, #0 + str r3, [sl, #0xc] + bne _0209F79C + ldr r0, [sl, #8] + cmp r3, r3 + cmpeq r0, r3 + bne _0209F7F0 + mov fp, r3 + mov r4, r3 +_0209F750: + mul r0, sb, r5 + adds sb, r0, r6 + bne _0209F768 +_0209F75C: + mul r0, sb, r5 + adds sb, r0, r6 + beq _0209F75C +_0209F768: + strh sb, [sl, #0x12] + ldrh r0, [sl, #0x12] + mov r1, r8 + mov r2, r7 + mov r3, #0 + bl DWCi_Util_WiFiId_scrambleUid + str r0, [sl, #8] + str r1, [sl, #0xc] + ldr r0, [sl, #8] + cmp r1, fp + cmpeq r0, r4 + beq _0209F750 + b _0209F7F0 +_0209F79C: + ldr r0, [sl, #8] + cmp r3, r3 + cmpeq r0, r3 + bne _0209F7F0 + mov r6, r3 + mov r5, r3 + mov r4, r3 +_0209F7B8: + ldrh r0, [sl, #0x12] + mov r1, r8 + mov r2, r7 + add r0, r0, #1 + strh r0, [sl, #0x12] + ldrh r0, [sl, #0x12] + mov r3, r6 + bl DWCi_Util_WiFiId_scrambleUid + str r0, [sl, #8] + str r1, [sl, #0xc] + ldr r0, [sl, #8] + cmp r1, r5 + cmpeq r0, r4 + beq _0209F7B8 +_0209F7F0: + mov r0, #1 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0209F7FC: .word OS_GetTick +_0209F800: .word 0x5D588B65 +_0209F804: .word 0x00269EC3 +_0209F808: .word 0x000009BF + arm_func_end DWCi_AUTH_GetNewWiFiInfo + + arm_func_start DWCi_AUTH_MakeWiFiID +DWCi_AUTH_MakeWiFiID: ; 0x0209F80C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r4, r0 + add r0, sp, #0 + bl DWCi_AUTH_GetNewWiFiInfo + cmp r0, #0 + addeq sp, sp, #0x14 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #0 + mov r1, r4 + bl DWCi_BM_SetWiFiInfo + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + arm_func_end DWCi_AUTH_MakeWiFiID + + arm_func_start DWCi_AUTH_UpDateWiFiID +DWCi_AUTH_UpDateWiFiID: ; 0x0209F850 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + mov r5, r0 + add r0, sp, #0 + mov r4, r1 + bl DWCi_BM_GetWiFiInfo + add ip, r5, #8 + ldmia ip, {r2, r3} + stmia r5, {r2, r3} + add r1, sp, #8 + ldmia r1, {r2, r3} + mov r0, r5 + mov r1, r4 + stmia ip, {r2, r3} + bl DWCi_BM_SetWiFiInfo + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} + arm_func_end DWCi_AUTH_UpDateWiFiID + + arm_func_start DWCi_AUTH_RemakeWiFiID +DWCi_AUTH_RemakeWiFiID: ; 0x0209F8A0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + add r2, sp, #0 + mov r1, #0 + mov sl, r0 + strb r1, [r2] + strb r1, [r2, #1] + strb r1, [r2, #2] + strb r1, [r2, #3] + strb r1, [r2, #4] + strb r1, [r2, #5] + bl DWCi_BM_GetWiFiInfo + bl RTC_Init + add r0, sp, #0x14 + bl RTC_GetDate + cmp r0, #0 + addne sp, sp, #0x24 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #8 + bl RTC_GetTime + cmp r0, #0 + addne sp, sp, #0x24 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #0x14 + add r1, sp, #8 + bl RTC_ConvertDateTimeToSecond + mov r4, r0 + mov r0, #0 + subs r2, r4, r0 + sbcs r2, r1, r0 + addlt sp, sp, #0x24 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl OS_IsTickAvailable + cmp r0, #0 + beq _0209F93C + ldr r0, _0209FA30 ; =OS_GetTick + adds r4, r4, r0 +_0209F93C: + add r0, sp, #0 + bl OS_GetMacAddress + ldrb r0, [sp, #1] + ldr r5, _0209FA34 ; =0x5D588B65 + ldr r6, _0209FA38 ; =0x00269EC3 + ldrb r1, [sp] + mov r0, r0, lsl #8 + mla sb, r4, r5, r6 + orr r1, r0, r1, lsl #16 + ldrb r2, [sp, #2] + ldr r0, _0209FA3C ; =0x000009BF + ldrb r7, [sp, #4] + orr r1, r2, r1 + cmp r1, r0 + movne r1, #1 + mov r2, sb, lsr #0x10 + mov r0, #0x3e8 + mul r4, r2, r0 + mov r2, r4, lsr #0x10 + ldrb r0, [sp, #5] + ldrb r8, [sp, #3] + mov r4, r7, lsl #8 + moveq r1, #0 + mov r3, #0 + strh r2, [sl, #0x10] + str r3, [sl, #8] + str r3, [sl, #0xc] + orr r4, r4, r8, lsl #16 + ldr r2, [sl, #8] + cmp r3, #0 + cmpeq r2, #0 + and r7, r1, #0xff + orr r8, r0, r4 + bne _0209FA24 + mov fp, r3 + mov r4, r3 +_0209F9CC: + mla sb, r5, sb, r6 + b _0209F9D8 +_0209F9D4: + mla sb, r5, sb, r6 +_0209F9D8: + cmp sb, #0 + beq _0209F9D4 + ldrh r2, [sl, #0x12] + mov r0, sb, lsl #0x10 + mov r1, r0, lsr #0x10 + cmp r2, r0, lsr #16 + beq _0209F9D4 + strh r1, [sl, #0x12] + ldrh r0, [sl, #0x12] + mov r1, r8 + mov r2, r7 + mov r3, #0 + bl DWCi_Util_WiFiId_scrambleUid + str r0, [sl, #8] + str r1, [sl, #0xc] + ldr r0, [sl, #8] + cmp r1, fp + cmpeq r0, r4 + beq _0209F9CC +_0209FA24: + mov r0, #1 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0209FA30: .word OS_GetTick +_0209FA34: .word 0x5D588B65 +_0209FA38: .word 0x00269EC3 +_0209FA3C: .word 0x000009BF + arm_func_end DWCi_AUTH_RemakeWiFiID + + arm_func_start DWC_Auth_GetId +DWC_Auth_GetId: ; 0x0209FA40 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r4, r0 + add r0, sp, #0 + bl DWCi_BM_GetWiFiInfo + add r0, sp, #0 + ldmia r0, {r2, r3} + stmia r4, {r2, r3} + add r1, sp, #8 + add r0, r4, #8 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r0, [sp, #4] + ldr r1, [sp] + cmp r0, #0 + mov r0, #0 + cmpeq r1, #0 + movne r0, #1 + str r0, [r4, #0x10] + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + arm_func_end DWC_Auth_GetId + + arm_func_start DWC_Auth_CheckPseudoWiFiID +DWC_Auth_CheckPseudoWiFiID: ; 0x0209FA94 + stmdb sp!, {lr} + sub sp, sp, #0x14 + add r0, sp, #0 + bl DWCi_BM_GetWiFiInfo + ldr r0, [sp, #0xc] + ldr r1, [sp, #8] + cmp r0, #0 + cmpeq r1, #0 + mov r0, #0 + bne _0209FAD8 + ldr r1, [sp, #4] + ldr r2, [sp] + cmp r1, r0 + cmpeq r2, r0 + addeq sp, sp, #0x14 + moveq r0, #1 + ldmeqia sp!, {pc} +_0209FAD8: + mov r0, #0 + add sp, sp, #0x14 + ldmia sp!, {pc} + arm_func_end DWC_Auth_CheckPseudoWiFiID + + .rodata + +DWCi_SETTING_NONE: + .byte 0x00, 0x00, 0x00, 0x00 +DWCi_util_wifiid_exctable: + .byte 0x01, 0x02, 0x00, 0x04, 0x03, 0x05, 0x06, 0x07 +DWCi_util_wifiid_ttable: + .byte 0x05, 0x09, 0x01, 0x0E, 0x0C, 0x02, 0x0A, 0x00 + .byte 0x0B, 0x0D, 0x03, 0x04, 0x08, 0x06, 0x0F, 0x07 diff --git a/lib/NitroDWC/asm/include/dwcaccount.inc b/lib/NitroDWC/asm/include/dwcaccount.inc new file mode 100644 index 00000000..dfb5a657 --- /dev/null +++ b/lib/NitroDWC/asm/include/dwcaccount.inc @@ -0,0 +1,46 @@ +#include +#pragma once +.public OSi_ReferSymbol +.public _version_NINTENDO_DWC +.public DWC_BM_Init +.public DWCi_AUTH_MakeWiFiID +.public DWC_Auth_GetId +.public DWC_Auth_CheckPseudoWiFiID +.public DWC_Init +.public DWCi_Acc_SetPlayerId +.public DWC_IsBuddyFriendData +.public DWC_GetFriendDataType +.public DWCi_SetBuddyFriendData +.public DWC_CheckFriendKey +.public DWCi_Acc_LoginIdToUserName +.public DWCi_Acc_CreateTempLoginId +.public DWCi_Acc_CheckConsoleUserId +.public DWCi_Acc_IsValidLoginId +.public DWCi_Acc_IsAuthentic +.public DWC_IsValidFriendData +.public DWCi_Acc_IsValidFriendData +.public DWC_CreateUserData +.public DWC_CheckUserData +.public DWC_CheckHasProfile +.public DWC_CheckValidConsole +.public DWCi_Acc_SetLoginIdToUserData +.public DWC_CheckDirtyFlag +.public DWC_ClearDirtyFlag +.public DWC_GetFriendKey +.public DWC_GetGsProfileId +.public DWC_CreateFriendKey +.public DWC_CreateFriendKeyToken +.public DWC_CreateExchangeToken +.public DWC_SetGsProfileId +.public DWC_LoginIdToUserName +.public DWC_IsEqualFriendData +.public CRYPTO_RC4FastInit +.public CRYPTO_RC4Init +.public CRYPTO_RC4FastEncrypt +.public OS_SNPrintf +.public OS_GetLowEntropyData +.public MI_CpuFill8 +.public MATHi_CRC8InitTable +.public MATHi_CRC32InitTableRev +.public MATH_CalcCRC8 +.public MATH_CalcCRC32 diff --git a/lib/NitroDWC/asm/include/dwcbm.inc b/lib/NitroDWC/asm/include/dwcbm.inc new file mode 100644 index 00000000..d07305e9 --- /dev/null +++ b/lib/NitroDWC/asm/include/dwcbm.inc @@ -0,0 +1,41 @@ +#include +#pragma once +.public SVC_WaitByLoop +.public DWCi_BM_GetApInfo +.public DWCi_BM_GetWiFiInfo +.public DWCi_BACKUPlRead +.public DWCi_BACKUPlWritePage +.public DWCi_BACKUPlConvMaskCidr +.public DWCi_BACKUPlConvMaskAddr +.public DWC_BACKUPlCheckIp +.public DWC_BACKUPlCheckAddress +.public DWCi_BACKUPlConvWifiInfo +.public DWCi_BACKUPlGetWifi +.public DWC_BM_Init +.public init +.public DWCi_AUTH_GetNewWiFiInfo +.public DWCi_AUTH_MakeWiFiID +.public DWCi_AUTH_UpDateWiFiID +.public DWCi_AUTH_RemakeWiFiID +.public DWC_Auth_GetId +.public DWC_Auth_CheckPseudoWiFiID +.public DC_InvalidateRange +.public DC_StoreRange +.public OS_IsTickAvailable +.public OS_GetTick +.public OS_GetMacAddress +.public OS_Terminate +.public MIi_CpuClear16 +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public PXI_SetFifoRecvCallback +.public PXI_IsCallbackReady +.public PXI_SendWordByFifo +.public RTC_Init +.public RTC_GetDate +.public RTC_GetTime +.public RTC_ConvertDateTimeToSecond +.public MATHi_CRC16InitTableRev +.public MATH_CalcCRC16 +.public memcmp +.public _ll_udiv diff --git a/lib/NitroDWC/asm/include/overlay_00_arm.inc b/lib/NitroDWC/asm/include/overlay_00_arm.inc new file mode 100644 index 00000000..a31e90b8 --- /dev/null +++ b/lib/NitroDWC/asm/include/overlay_00_arm.inc @@ -0,0 +1,294 @@ +#include +#pragma once +.public DWCi_BM_GetApInfo +.public DWCi_BM_GetWiFiInfo +.public DWCi_AUTH_MakeWiFiID +.public DWCi_AUTH_UpDateWiFiID +.public DWCi_AUTH_RemakeWiFiID +.public DWCi_Acc_SetPlayerId +.public DWC_IsBuddyFriendData +.public DWC_GetFriendDataType +.public DWCi_SetBuddyFriendData +.public DWCi_Acc_LoginIdToUserName +.public DWCi_Acc_CreateTempLoginId +.public DWCi_Acc_CheckConsoleUserId +.public DWCi_Acc_IsValidLoginId +.public DWCi_Acc_IsAuthentic +.public DWCi_Acc_IsValidFriendData +.public DWCi_Acc_SetLoginIdToUserData +.public DWC_GetGsProfileId +.public DWC_SetGsProfileId +.public DWC_LoginIdToUserName +.public CRYPTO_RC4FastInit +.public CRYPTO_RC4FastEncrypt +.public SOCL_CalmDown +.public SOCL_GetHostID +.public SOC_Socket +.public SOC_Bind +.public SOC_Connect +.public SOC_Recv +.public SOC_RecvFrom +.public SOC_Send +.public SOC_SendTo +.public SOC_Shutdown +.public SOC_Close +.public SOC_GetHostByName +.public SOC_GetSockName +.public SOC_GetHostID +.public SOC_SetResolver +.public SOC_Listen +.public SOC_Accept +.public SOC_Fcntl +.public SOC_Startup +.public SOC_Cleanup +.public SOC_InetNtoA +.public SOC_InetAtoN +.public SOC_U32to4U8 +.public SOC_Poll +.public CPS_SocRegister +.public CPS_SocUnRegister +.public CPS_SocBind +.public CPS_SocUse +.public CPS_SocRelease +.public CPS_TcpConnect +.public CPS_TcpShutdown +.public CPS_TcpClose +.public CPS_SocRead +.public CPS_SocConsume +.public CPS_SocWrite +.public CPS_SocGetLength +.public CPS_SocFlush +.public CPS_Resolve +.public CPS_GetSslHandshakePriority +.public CPS_SetSslHandshakePriority +.public CPS_SetRootCa +.public CPS_SslAddRandomSeed +.public CPS_SetSsl +.public WCM_Init +.public WCM_Finish +.public WCM_StartupAsync +.public WCM_CleanupAsync +.public WCM_SearchAsync +.public WCM_EndSearchAsync +.public WCM_ConnectAsync +.public WCM_DisconnectAsync +.public WCM_TerminateAsync +.public WCM_GetPhase +.public WCM_GetApMacAddress +.public WCM_GetApEssid +.public WCM_GetLinkLevel +.public MD5Init +.public MD5Update +.public MD5Final +.public OS_SPrintf +.public OS_SNPrintf +.public OS_CreateThread +.public OS_JoinThread +.public OS_IsThreadTerminated +.public OS_WakeupThreadDirect +.public OS_GetThreadPriority +.public OS_Sleep +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public DC_InvalidateRange +.public OS_IsTickAvailable +.public OS_GetTick +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_GetMacAddress +.public OS_GetOwnerInfo +.public OS_GetLowEntropyData +.public OS_Terminate +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public DGT_Hash1Reset +.public DGT_Hash1SetSource +.public DGT_Hash1GetDigest_R +.public RTC_GetDateTime +.public RTC_ConvertDateTimeToSecond +.public RTC_ConvertSecondToDateTime +.public WM_GetAllowedChannel +.public WM_GetDispersionScanPeriod +.public WM_Initialize +.public WM_End +.public WM_StartScanEx +.public WM_EndScan +.public MATHi_CRC16InitTableRev +.public MATHi_CRC16UpdateRev +.public MATH_CalcCRC16 +.public abs +.public __msl_assertion_failed +.public memcpy +.public memmove +.public memset +.public memcmp +.public snprintf +.public sprintf +.public qsort +.public rand +.public srand +.public sscanf +.public strlen +.public strcpy +.public strncpy +.public strcat +.public strcmp +.public strncmp +.public strchr +.public strstr +.public atof +.public strtoul +.public strtol +.public atoi +.public wcslen +.public strnicmp +.public _dadd +.public _d2f +.public _dflt +.public _dmul +.public _dsub +.public _fgr +.public _fls +.public _ll_udiv +.public _s32_div_f +.public _u32_div_f +.public _ddiv +.public _02108FC0 +.public _02108FC8 +.public _0210E404 +.public _0210E484 +.public _0210E504 +.public _021D4420 +.public _021D4670 +.public OSi_ThreadInfo +.public _021E58C0 +.public ov00_021EC0FC +.public ov00_021EC11C +.public ov00_021EC210 +.public ov00_021EC230 +.public ov00_021EC24C +.public ov00_021EC294 +.public ov00_021EC2A8 +.public ov00_021EC2EC +.public ov00_021EC3A8 +.public ov00_021EC3BC +.public ov00_021EC3D8 +.public ov00_021EC3F0 +.public ov00_021EC454 +.public ov00_021EC4A4 +.public ov00_021EC5B4 +.public ov00_021EC60C +.public ov00_021EC724 +.public ov00_021EC8D8 +.public ov00_021EC938 +.public ov00_021EC9D4 +.public ov00_021EC9E0 +.public ov00_021ECB40 +.public ov00_021ECB94 +.public ov00_021ECC6C +.public ov00_021ECCE0 +.public ov00_021ECD04 +.public ov00_021ECDC8 +.public ov00_021ECEC0 +.public ov00_021ED1F0 +.public ov00_021ED308 +.public ov00_021ED354 +.public ov00_021ED388 +.public ov00_021ED3AC +.public ov00_021ED3F4 +.public ov00_021ED428 +.public ov00_021ED444 +.public ov00_021ED730 +.public ov00_021ED9B4 +.public ov00_021EDB1C +.public ov00_021EDD6C +.public ov00_021EDE74 +.public ov00_021EDF1C +.public ov00_021EDFBC +.public ov00_021EE054 +.public ov00_021EE24C +.public ov00_021EE278 +.public ov00_021EE384 +.public ov00_021EE448 +.public ov00_021EE490 +.public ov00_021EE4FC +.public ov00_021EE530 +.public ov00_021EFDCC +.public ov00_021EFE78 +.public ov00_021EFF04 +.public ov00_021EFF30 +.public ov00_021EFF3C +.public ov00_021F1284 +.public ov00_021F12F0 +.public ov00_021F13A4 +.public ov00_021F14D4 +.public ov00_021F9580 +.public DWC_SendReliable +.public ov00_021F9750 +.public DWC_SendUnreliable +.public ov00_021F9850 +.public ov00_021F989C +.public ov00_021F98BC +.public ov00_021F98DC +.public ov00_021F9988 +.public ov00_021FA0B4 +.public ov00_021FA0D8 +.public ov00_021FA118 +.public ov00_021FA21C +.public ov00_021FA488 +.public ov00_021FA75C +.public ov00_021FA904 +.public ov00_021FA9D4 +.public ov00_021FAAC8 +.public ov00_021FAC20 +.public ov00_021FE5B4 +.public ov00_021FE678 +.public ArrayLength +.public ov00_021FE6EC +.public ov00_021FE754 +.public ov00_021FE8D8 +.public ov00_021FE968 +.public ov00_021FEA40 +.public ov00_021FED4C +.public ov00_021FEE8C +.public ov00_021FEF00 +.public ov00_021FEF74 +.public ov00_021FF01C +.public ov00_021FF0C0 +.public ov00_021FF160 +.public ov00_021FF31C +.public ov00_021FF368 +.public ov00_021FF3C0 +.public ov00_021FF3CC +.public ov00_021FF3D0 +.public ov00_021FF3D4 +.public ov00_021FF44C +.public ov00_021FF48C +.public ov00_021FF59C +.public ov00_021FF804 +.public ov00_021FF818 +.public ov00_021FF82C +.public ov00_021FF8A0 +.public ov00_021FF92C +.public ov00_021FF970 +.public ov00_021FFA44 +.public ov00_021FFA60 +.public ov00_021FFC18 +.public ov38_0221D7B4 +.public ov38_0221D808 +.public ov38_0221D864 +.public ghttpGetExA +.public ov38_0221DAEC +.public ov38_02220090 +.public ov38_02220434 +.public ov38_02220620 +.public ov38_02220648 +.public ov38_02220F18 +.public ov38_02220F8C +.public ov38_0222124C +.public ov38_02221408 diff --git a/lib/NitroDWC/asm/include/overlay_13_arm_2.inc b/lib/NitroDWC/asm/include/overlay_13_arm_2.inc new file mode 100644 index 00000000..fa251e63 --- /dev/null +++ b/lib/NitroDWC/asm/include/overlay_13_arm_2.inc @@ -0,0 +1,221 @@ +#include +#pragma once +.public DWCi_BM_GetWiFiInfo +.public DWCi_BACKUPlRead +.public DWCi_BACKUPlWritePage +.public DWCi_BACKUPlConvMaskCidr +.public DWCi_BACKUPlConvMaskAddr +.public DWC_BACKUPlCheckIp +.public DWC_BACKUPlCheckAddress +.public DWCi_BACKUPlConvWifiInfo +.public DWCi_BACKUPlGetWifi +.public DWC_BM_Init +.public DWCi_AUTH_GetNewWiFiInfo +.public NNS_FndCreateExpHeapEx +.public NNS_FndDestroyExpHeap +.public NNS_FndAllocFromExpHeapEx +.public NNS_FndFreeToExpHeap +.public NNS_G2dFontInitUTF16 +.public NNS_G2dFontFindGlyphIndex +.public NNS_G2dFontGetCharWidthsFromIndex +.public NNS_G2dCharCanvasDrawChar +.public NNS_G2dCharCanvasInitForBG +.public NNS_G2dCharCanvasInitForOBJ1D +.public NNS_G2dMapScrToCharText +.public NNSi_G2dCalcRequiredOBJ +.public NNS_G2dArrangeOBJ1D +.public NNSi_G2dTextCanvasDrawText +.public NNSi_G2dTextCanvasDrawTextRect +.public NNS_SndInit +.public NNS_SndMain +.public NNS_SndPlayerStopSeq +.public NNS_SndHandleInit +.public NNS_SndPlayerSetVolume +.public NNS_SndPlayerSetTrackPitch +.public NNS_SndArcInitOnMemory +.public NNS_SndArcPlayerSetup +.public NNS_SndArcPlayerStartSeqArc +.public FX_DivS32 +.public FX_ModS32 +.public FX_Init +.public GX_VBlankIntr +.public GX_DispOff +.public GX_DispOn +.public GX_SetGraphicsMode +.public GXS_SetGraphicsMode +.public GXx_SetMasterBrightness_ +.public GX_SetBankForBG +.public GX_SetBankForOBJ +.public GX_SetBankForBGExtPltt +.public GX_SetBankForOBJExtPltt +.public GX_SetBankForTex +.public GX_SetBankForTexPltt +.public GX_SetBankForClearImage +.public GX_SetBankForARM7 +.public GX_SetBankForLCDC +.public GX_SetBankForSubBG +.public GX_SetBankForSubOBJ +.public GX_SetBankForSubBGExtPltt +.public GX_SetBankForSubOBJExtPltt +.public GX_DisableBankForBG +.public GX_DisableBankForOBJ +.public GX_DisableBankForBGExtPltt +.public GX_DisableBankForOBJExtPltt +.public GX_DisableBankForTex +.public GX_DisableBankForTexPltt +.public GX_DisableBankForClearImage +.public GX_DisableBankForARM7 +.public GX_DisableBankForLCDC +.public GX_DisableBankForSubBG +.public GX_DisableBankForSubOBJ +.public GX_DisableBankForSubBGExtPltt +.public GX_DisableBankForSubOBJExtPltt +.public G2_GetBG0ScrPtr +.public G2S_GetBG0ScrPtr +.public G2_GetBG0CharPtr +.public G2x_SetBlendBrightness_ +.public G2x_ChangeBlendBrightness_ +.public GX_LoadBGPltt +.public GXS_LoadBGPltt +.public GX_LoadOBJPltt +.public GXS_LoadOBJPltt +.public GX_LoadOAM +.public GXS_LoadOAM +.public GX_LoadOBJ +.public GXS_LoadOBJ +.public GXS_LoadBG0Scr +.public GX_LoadBG1Scr +.public GXS_LoadBG1Scr +.public GX_LoadBG2Scr +.public GX_LoadBG3Scr +.public GX_LoadBG0Char +.public GXS_LoadBG0Char +.public GX_LoadBG1Char +.public GXS_LoadBG1Char +.public GX_LoadBG2Char +.public GX_LoadBG3Char +.public OS_SetIrqFunction +.public OS_GetIrqFunction +.public OS_SetIrqMask +.public OS_EnableIrqMask +.public OS_DisableIrqMask +.public OS_ResetRequestIrqMask +.public OS_GetLockID +.public OS_ReleaseLockID +.public OS_SPrintf +.public OS_Sleep +.public DC_InvalidateRange +.public DC_FlushRange +.public OS_IsTickAvailable +.public OS_GetTick +.public OS_IsAlarmAvailable +.public OS_EnableInterrupts +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_SpinWait +.public OS_WaitVBlankIntr +.public OS_GetMacAddress +.public OS_GetOwnerInfo +.public OS_Terminate +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MIi_CpuClearFast +.public MIi_CpuCopyFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public MI_UncompressLZ8 +.public FS_InitArchive +.public FS_RegisterArchiveName +.public FS_ReleaseArchiveName +.public FS_LoadArchive +.public FS_UnloadArchive +.public FS_LoadArchiveTables +.public FS_UnloadArchiveTables +.public FS_SetArchiveProc +.public FS_NotifyArchiveAsyncEnd +.public FS_Init +.public FS_InitFile +.public FS_OpenFile +.public FS_CloseFile +.public FS_ReadFile +.public FS_ChangeDir +.public TP_Init +.public TP_GetUserInfo +.public TP_SetCalibrateParam +.public TP_RequestAutoSamplingStartAsync +.public TP_RequestAutoSamplingStopAsync +.public TP_GetLatestIndexInAuto +.public TP_GetCalibratedPoint +.public TP_WaitBusy +.public TP_CheckBusy +.public PM_ForceToPowerOff +.public PM_SetLCDPower +.public PMi_SendLEDPatternCommand +.public PM_GetLEDPattern +.public RTC_Init +.public CARD_LockRom +.public CARD_UnlockRom +.public CARDi_ReadRom +.public WM_SetIndCallback +.public WM_ReadStatus +.public WM_GetAllowedChannel +.public WM_GetLinkLevel +.public WM_GetDispersionBeaconPeriod +.public WM_GetDispersionScanPeriod +.public WM_GetOtherElements +.public WM_GetNextTgid +.public WM_Initialize +.public WM_Reset +.public WM_End +.public WM_SetParentParameter +.public WM_StartParent +.public WM_EndParent +.public WM_StartScanEx +.public WM_Disconnect +.public WM_StartMP +.public WM_EndMP +.public WM_StartDataSharing +.public WM_StepDataSharing +.public WM_GetSharedDataAddress +.public WM_StartKeySharing +.public WM_EndKeySharing +.public WM_SetWEPKey +.public WM_MeasureChannel +.public MATHi_CRC16InitTableRev +.public MATH_CalcCRC16 +.public memset +.public memcmp +.public strlen +.public strncpy +.public atoi +.public swprintf +.public _ll_udiv +.public _ull_mod +.public ov00_021FA75C +.public ov00_021FA904 +.public ov00_021FA9D4 +.public ov00_021FAAC8 +.public ov00_021FAC20 +.public MB_CommSetParentStateCallback +.public MB_CommGetChildUser +.public MB_CommIsBootable +.public MB_CommResponseRequest +.public MB_GetSegmentLength +.public MB_ReadSegment +.public MB_RegisterFile +.public MB_Init +.public MB_SetParentCommParam +.public MB_StartParentFromIdle +.public MB_End +.public MB_DisconnectChild +.public ov13_02220908 +.public ov13_02222C1C +.public ov13_02222CE0 +.public ov13_02226D74 +.public ov13_02226E5C +.public ov13_02226F28 +.public ov13_0222B430 +.public _0223DC20 +.public _0223F900 diff --git a/lib/NitroDWC/asm/include/overlay_38_arm.inc b/lib/NitroDWC/asm/include/overlay_38_arm.inc new file mode 100644 index 00000000..bfafc74f --- /dev/null +++ b/lib/NitroDWC/asm/include/overlay_38_arm.inc @@ -0,0 +1,91 @@ +#include +#pragma once +.public DWCi_BM_GetWiFiInfo +.public SOCL_Resolve +.public SOC_Socket +.public SOC_Connect +.public SOC_Recv +.public SOC_Send +.public SOC_Shutdown +.public SOC_Close +.public SOC_GetHostByName +.public SOC_InetAtoN +.public SOC_Poll +.public SOCL_EnableSsl +.public CPS_SslAddRandomSeed +.public OS_SNPrintf +.public OS_IsThreadAvailable +.public OS_CreateThread +.public OS_JoinThread +.public OS_WakeupThreadDirect +.public OS_Sleep +.public OS_InitMessageQueue +.public OS_SendMessage +.public OS_ReceiveMessage +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public OS_GetMacAddress +.public OS_GetLowEntropyData +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public STD_GetStringLength +.public STD_CompareString +.public STD_CompareNString +.public __msl_assertion_failed +.public fread +.public fclose +.public ftell +.public fseek +.public rewind +.public memcpy +.public memmove +.public memset +.public sprintf +.public sscanf +.public strlen +.public strncmp +.public strchr +.public strspn +.public strstr +.public atoi +.public _ll_udiv +.public _u32_div_f +.public _0210E504 +.public ov00_021EC3A8 +.public ov00_021EC3BC +.public ov00_021EC3D8 +.public ov00_021EC9E0 +.public ov00_021FE5B4 +.public ov00_021FE678 +.public ArrayLength +.public ov00_021FE6EC +.public ov00_021FE754 +.public ov00_021FF368 +.public ov00_021FF3C0 +.public ov00_021FF3CC +.public ov00_021FF3D4 +.public ov00_021FF44C +.public ov00_021FF48C +.public ov00_021FF59C +.public ov00_021FF804 +.public ov00_021FF818 +.public ov00_021FF82C +.public ov00_021FF8A0 +.public ov00_021FF92C +.public ov00_021FF970 +.public ov00_021FFA44 +.public ov00_021FFA60 +.public ov38_0221D7B4 +.public ov38_0221D808 +.public ov38_0221D864 +.public ghttpGetExA +.public ov38_0221DAEC +.public ov38_02220090 +.public ov38_02220434 +.public ov38_02220620 +.public ov38_02220648 +.public ov38_02220F18 +.public ov38_02220F8C +.public ov38_0222124C +.public ov38_02221408 diff --git a/lib/NitroDWC/asm/include/overlay_39_arm.inc b/lib/NitroDWC/asm/include/overlay_39_arm.inc new file mode 100644 index 00000000..37e6a91f --- /dev/null +++ b/lib/NitroDWC/asm/include/overlay_39_arm.inc @@ -0,0 +1,48 @@ +#include +#pragma once +.public SOC_Socket +.public SOC_Connect +.public SOC_Recv +.public SOC_Send +.public SOC_Shutdown +.public SOC_Close +.public SOC_GetHostByName +.public SOC_Fcntl +.public SOC_InetNtoA +.public OS_CreateThread +.public OS_WakeupThreadDirect +.public OS_Sleep +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public OS_InitTick +.public OS_IsTickAvailable +.public OS_GetTick +.public memcpy +.public strcpy +.public _ll_udiv +.public ov00_021EC11C +.public ov00_021EC2A8 +.public ov00_021EC2EC +.public ov00_021ECC6C +.public ov00_021ECCE0 +.public ov00_021FFA44 +.public ov39_0222A110 +.public ov39_0222A130 +.public ov39_0222A13C +.public ov39_0222A158 +.public ov39_0222A164 +.public ov39_0222A1C0 +.public ov39_0222A200 +.public ov39_0222A268 +.public ov39_0222A2A8 +.public ov39_0222A2B4 +.public ov39_0222A2C0 +.public ov39_0222A2CC +.public ov39_0222A2EC +.public ov39_0222A33C +.public ov39_0222A394 +.public ov39_0222A3DC +.public ov39_0222A434 +.public ov39_0222A48C +.public ov39_0222A4C0 diff --git a/lib/NitroDWC/asm/include/overlay_45_arm.inc b/lib/NitroDWC/asm/include/overlay_45_arm.inc new file mode 100644 index 00000000..fcacd110 --- /dev/null +++ b/lib/NitroDWC/asm/include/overlay_45_arm.inc @@ -0,0 +1,109 @@ +#include +#pragma once +.public OSi_ReferSymbol +.public _version_NINTENDO_DWC_LOBBY +.public DWC_CheckUserData +.public DWC_CheckHasProfile +.public SOC_GetHostByName +.public R +.public OS_VSNPrintf +.public OS_GetMacAddress +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public RTC_ConvertDateTimeToSecond +.public MATH_CalcSHA1 +.public abort +.public __msl_assertion_failed +.public memcpy +.public memmove +.public memset +.public memcmp +.public printf +.public vsprintf +.public snprintf +.public sprintf +.public strlen +.public strcpy +.public strncpy +.public strcmp +.public strncmp +.public strchr +.public strtok +.public strstr +.public strtoul +.public strtol +.public atoi +.public strnicmp +.public _s32_div_f +.public _u32_div_f +.public _0210E404 +.public ov00_021EC210 +.public ov00_021EC230 +.public ov00_021EC24C +.public ov00_021EC2A8 +.public ov00_021EC2EC +.public ov00_021EC3A8 +.public ov00_021EC3BC +.public ov00_021EC3D8 +.public ov00_021ECB94 +.public ov00_021EFF30 +.public ov00_021EFF3C +.public ov00_021FA0B4 +.public ov00_021FA0D8 +.public ov00_021FA118 +.public ov00_021FA488 +.public ov00_021FE5B4 +.public ov00_021FE678 +.public ArrayLength +.public ov00_021FE6EC +.public ov00_021FE754 +.public ov00_021FE8D8 +.public ov00_021FE968 +.public ov00_021FEA40 +.public ov00_021FED4C +.public ov00_021FEE8C +.public ov00_021FEF00 +.public ov00_021FEF74 +.public ov00_021FF01C +.public ov00_021FF0C0 +.public ov00_021FF160 +.public ov00_021FF31C +.public ov00_021FF368 +.public ov00_021FF3C0 +.public ov00_021FF3CC +.public ov00_021FF3D0 +.public ov00_021FF3D4 +.public ov00_021FF59C +.public ov00_021FF804 +.public ov00_021FF818 +.public ov00_021FF82C +.public ov00_021FF8A0 +.public ov00_021FF92C +.public ov00_021FF970 +.public ov00_021FFA44 +.public ov00_021FFC18 +.public ov45_022310C0 +.public ov45_02231490 +.public ov45_02231514 +.public ov45_02231C8C +.public ov45_02231EC0 +.public ov45_022320C4 +.public ov45_02232170 +.public ov45_022321E0 +.public ov45_022322A4 +.public ov45_02232304 +.public ov45_0223247C +.public ov45_02232500 +.public ov45_02232580 +.public ov45_022325B0 +.public ov45_0223285C +.public ov45_02232BB0 +.public ov45_02232CA4 +.public ov45_02232E60 +.public ov45_022331E8 +.public ov45_02233204 +.public ov45_02233220 +.public _ZNSt15__vector_commonILb1EE18throw_length_errorEv +.public _ZSt7nothrow +.public _ZdaPv +.public _ZnamRKSt9nothrow_t diff --git a/lib/NitroDWC/asm/overlay_00_arm.s b/lib/NitroDWC/asm/overlay_00_arm.s new file mode 100644 index 00000000..82a82c8a --- /dev/null +++ b/lib/NitroDWC/asm/overlay_00_arm.s @@ -0,0 +1,57900 @@ + .include "asm/macros.inc" + .include "overlay_00_arm.inc" + .include "global.inc" + + .text + + arm_func_start ov00_021E7B60 +ov00_021E7B60: ; 0x021E7B60 + ldr r1, _021E7B6C ; =ov00_02216420 + str r0, [r1] + bx lr + .balign 4, 0 +_021E7B6C: .word ov00_02216420 + arm_func_end ov00_021E7B60 + + arm_func_start ov00_021E7B70 +ov00_021E7B70: ; 0x021E7B70 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021E7C84 ; =ov00_0221A694 + mov r5, r0 + ldr r0, [r2, #8] + mov r4, r1 + cmp r0, #0 + ldr r2, [r5, #0x40] + movne r0, #2 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021E7C88 ; =ov00_02216464 + ldr r1, _021E7C8C ; =0x000013F4 + blx r2 + ldr r1, _021E7C84 ; =ov00_0221A694 + cmp r0, #0 + str r0, [r1, #8] + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, _021E7C8C ; =0x000013F4 + mov r1, #0 + bl MI_CpuFill8 + ldr r3, _021E7C84 ; =ov00_0221A694 + mov r1, #0 + ldr r0, [r3, #8] + mov r2, #0x1c4 + add r0, r0, #0x1000 + str r4, [r0, #0x314] + str r1, [r3] + ldr r0, [r3, #8] + add r0, r0, #8 + add r0, r0, #0x1000 + bl MI_CpuFill8 + ldr r1, _021E7C84 ; =ov00_0221A694 + ldr r2, _021E7C90 ; =0x00004E84 + ldr r0, [r1, #8] + mov r4, #4 + add r0, r0, #0x1000 + str r2, [r0, #8] + ldr lr, [r1, #8] + add r0, lr, #0x1cc + add ip, r0, #0x1000 +_021E7C10: + ldmia r5!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _021E7C10 + ldmia r5, {r0, r1} + stmia ip, {r0, r1} + add r0, lr, #0x1100 + mov r2, #0 + strh r2, [r0, #0xfe] + ldr r1, _021E7C84 ; =ov00_0221A694 + mov r0, #1 + ldr r1, [r1, #8] + add r1, r1, #0x1000 + strb r2, [r1, #0x20b] + bl ov00_021E7F38 + ldr r2, _021E7C84 ; =ov00_0221A694 + ldr r1, [r2, #8] + add r1, r1, #0x1000 + str r0, [r1, #4] + ldr r0, [r2, #8] + add r0, r0, #0x1000 + ldr r0, [r0, #4] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0 + str r0, [r2, #4] + bl ov00_021E7C94 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E7C84: .word ov00_0221A694 +_021E7C88: .word ov00_02216464 +_021E7C8C: .word 0x000013F4 +_021E7C90: .word 0x00004E84 + arm_func_end ov00_021E7B70 + + arm_func_start ov00_021E7C94 +ov00_021E7C94: ; 0x021E7C94 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _021E7D3C ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_InitMutex + ldr r1, _021E7D3C ; =ov00_0221A694 + mov r2, #0 + ldr r0, [r1, #8] + add r0, r0, #0x1000 + str r2, [r0, #0x3f0] + ldr r1, [r1, #8] + add r0, r1, #0x1000 + ldr r0, [r0, #0x384] + cmp r0, #0 + beq _021E7CF0 + add r0, r1, #0x318 + add r0, r0, #0x1000 + bl OS_IsThreadTerminated + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, pc} +_021E7CF0: + ldr r0, _021E7D3C ; =ov00_0221A694 + mov r3, #0x1000 + ldr lr, [r0, #8] + ldr r1, _021E7D40 ; =ov00_021E8048 + add r0, lr, #0x318 + ldr r2, _021E7D44 ; =ov00_0221A69C + str r3, [sp] + mov ip, #0x10 + add r0, r0, #0x1000 + add r3, lr, #0x1000 + str ip, [sp, #4] + bl OS_CreateThread + ldr r0, _021E7D3C ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x318 + add r0, r0, #0x1000 + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021E7D3C: .word ov00_0221A694 +_021E7D40: .word ov00_021E8048 +_021E7D44: .word ov00_0221A69C + arm_func_end ov00_021E7C94 + + arm_func_start ov00_021E7D48 +ov00_021E7D48: ; 0x021E7D48 + stmdb sp!, {r3, lr} + ldr r0, _021E7DD0 ; =ov00_0221A694 + ldr r0, [r0, #8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r1, _021E7DD0 ; =ov00_0221A694 + mov r2, #1 + ldr r0, [r1, #8] + add r0, r0, #0x1000 + str r2, [r0, #0x3f0] + ldr r0, [r1, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + ldr r0, _021E7DD0 ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x1000 + ldr r0, [r0, #0x314] + cmp r0, #0 + beq _021E7DA8 + bl ov00_021E9210 +_021E7DA8: + ldr r0, _021E7DD0 ; =ov00_0221A694 + ldr r1, [r0, #8] + add r0, r1, #0x1000 + ldr r0, [r0, #0x384] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x318 + add r0, r0, #0x1000 + bl OS_JoinThread + ldmia sp!, {r3, pc} + .balign 4, 0 +_021E7DD0: .word ov00_0221A694 + arm_func_end ov00_021E7D48 + + arm_func_start ov00_021E7DD4 +ov00_021E7DD4: ; 0x021E7DD4 + stmdb sp!, {r4, lr} + ldr r0, _021E7E24 ; =ov00_0221A694 + ldr r0, [r0, #8] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r1, r0, #0x1000 + ldr r0, [r1, #0x314] + ldr r4, [r1, #0x210] + cmp r0, #0 + beq _021E7E00 + bl ov00_021E9754 +_021E7E00: + ldr r1, _021E7E24 ; =ov00_0221A694 + ldr r0, _021E7E28 ; =ov00_02216474 + ldr r1, [r1, #8] + mov r2, #0 + blx r4 + ldr r0, _021E7E24 ; =ov00_0221A694 + mov r1, #0 + str r1, [r0, #8] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E7E24: .word ov00_0221A694 +_021E7E28: .word ov00_02216474 + arm_func_end ov00_021E7DD4 + + arm_func_start ov00_021E7E2C +ov00_021E7E2C: ; 0x021E7E2C + stmdb sp!, {r3, lr} + ldr r0, _021E7E58 ; =ov00_0221A694 + ldr r1, [r0, #8] + add r0, r1, #0x1000 + ldr r0, [r0, #0x384] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x318 + add r0, r0, #0x1000 + bl OS_JoinThread + ldmia sp!, {r3, pc} + .balign 4, 0 +_021E7E58: .word ov00_0221A694 + arm_func_end ov00_021E7E2C + + arm_func_start ov00_021E7E5C +ov00_021E7E5C: ; 0x021E7E5C + stmdb sp!, {r4, lr} + ldr r0, _021E7EA4 ; =ov00_0221A694 + ldr r0, [r0, #8] + cmp r0, #0 + moveq r0, #0x16 + ldmeqia sp!, {r4, pc} + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r0, _021E7EA4 ; =ov00_0221A694 + ldr r1, [r0, #8] + add r0, r1, #0x3d8 + add r1, r1, #0x1000 + add r0, r0, #0x1000 + ldr r4, [r1, #4] + bl OS_UnlockMutex + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E7EA4: .word ov00_0221A694 + arm_func_end ov00_021E7E5C + + arm_func_start ov00_021E7EA8 +ov00_021E7EA8: ; 0x021E7EA8 + stmdb sp!, {r4, lr} + ldr r1, _021E7F24 ; =ov00_0221A694 + mov r4, r0 + ldr r1, [r1, #8] + cmp r1, #0 + bne _021E7ECC + mov r1, #0 + mov r2, #0x1c4 + bl MI_CpuFill8 +_021E7ECC: + ldr r0, _021E7F24 ; =ov00_0221A694 + mov r1, r4 + ldr r0, [r0, #8] + mov r2, #0x1c4 + add r0, r0, #8 + add r0, r0, #0x1000 + bl MI_CpuCopy8 + ldr r1, [r4] + ldr r0, _021E7F28 ; =0x00004E20 + cmp r1, r0 + blt _021E7F04 + ldr r0, _021E7F2C ; =0x00007530 + cmp r1, r0 + blt _021E7F0C +_021E7F04: + ldr r0, _021E7F30 ; =0x00005206 + str r0, [r4] +_021E7F0C: + ldr r1, [r4] + ldr r0, _021E7F34 ; =0x00004E84 + cmp r1, r0 + rsbge r0, r1, #0 + strge r0, [r4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E7F24: .word ov00_0221A694 +_021E7F28: .word 0x00004E20 +_021E7F2C: .word 0x00007530 +_021E7F30: .word 0x00005206 +_021E7F34: .word 0x00004E84 + arm_func_end ov00_021E7EA8 + + arm_func_start ov00_021E7F38 +ov00_021E7F38: ; 0x021E7F38 + stmdb sp!, {r4, lr} + ldr r1, _021E8030 ; =ov00_02216420 + mov r4, r0 + ldr r0, [r1] + ldr r1, _021E8034 ; =ov00_02216484 + bl strcmp + cmp r0, #0 + ldrne r0, _021E8030 ; =ov00_02216420 + movne r1, #1 + strne r1, [r0, #0x14] + ldr r0, _021E8038 ; =ov00_0221A694 + ldr r2, _021E8030 ; =ov00_02216420 + ldr r0, [r0, #8] + ldr r1, _021E803C ; =ov00_02216420 + add r0, r0, #0x1000 + ldr r3, [r0, #0x20c] + str r3, [r2, #0xc] + ldr r3, [r0, #0x210] + str r3, [r2, #0x10] + ldr r0, [r0, #0x314] + bl ov00_021E8FA0 + cmp r0, #0 + movne r0, #4 + ldmneia sp!, {r4, pc} + cmp r4, #1 + bne _021E7FA8 + ldr r0, _021E8040 ; =ov00_0221A6A0 + bl DWCi_BM_GetWiFiInfo +_021E7FA8: + ldr r0, _021E8038 ; =ov00_0221A694 + ldr r1, [r0, #8] + add r0, r1, #0x1000 + add r2, r1, #0x1cc + ldr r0, [r0, #0x314] + add r1, r1, #0x1200 + add r2, r2, #0x1000 + bl ov00_021E879C + ldr r2, _021E8038 ; =ov00_0221A694 + ldr r1, [r2, #8] + add r1, r1, #0x1000 + str r0, [r1, #4] + ldr r0, [r2, #8] + add r0, r0, #0x1000 + ldr r1, [r0, #4] + cmp r1, #0 + movne r0, #4 + ldmneia sp!, {r4, pc} + ldr r0, [r0, #0x314] + bl ov00_021E90BC + cmp r0, #0 + movne r0, #4 + ldmneia sp!, {r4, pc} + ldr r0, _021E8044 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + ldr r1, _021E8038 ; =ov00_0221A694 + ldr r2, [r1, #8] + sub r1, r0, #1 + add r0, r2, #0x1000 + ldr r0, [r0, #0x314] + bl ov00_021E9154 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E8030: .word ov00_02216420 +_021E8034: .word ov00_02216484 +_021E8038: .word ov00_0221A694 +_021E803C: .word ov00_02216420 +_021E8040: .word ov00_0221A6A0 +_021E8044: .word OSi_ThreadInfo + arm_func_end ov00_021E7F38 + + arm_func_start ov00_021E8048 +ov00_021E8048: ; 0x021E8048 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r8, #0 +_021E8050: + ldr r0, _021E82EC ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x1000 + ldr r1, [r0, #0x314] + add r0, r1, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021E807C + add r0, r1, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread +_021E807C: + ldr r2, _021E82EC ; =ov00_0221A694 + ldr r0, [r2, #8] + add r0, r0, #0x1000 + ldr r1, [r0, #0x314] + add r1, r1, #0x1000 + ldr r1, [r1, #0x20] + cmp r1, #8 + beq _021E8118 + ldr r1, _021E82F0 ; =0x00004E84 + str r1, [r0, #8] + ldr r0, [r2, #8] + add r0, r0, #0x1000 + ldr r0, [r0, #0x314] + add r0, r0, #0x1000 + ldr r0, [r0, #0x20] + cmp r0, #7 + bne _021E80CC + mov r0, #0x14 + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E80CC: + cmp r8, #2 + ble _021E8108 + cmp r0, #2 + bne _021E80E8 + mov r0, #9 + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E80E8: + cmp r0, #3 + bne _021E80FC + mov r0, #0xb + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E80FC: + mov r0, #0xd + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E8108: + mov r0, #1 + add r8, r8, #1 + str r0, [sp] + b _021E8188 +_021E8118: + bl ov00_021E82FC + cmp r0, #0x10 + beq _021E8140 + cmp r0, #0x11 + beq _021E8164 + cmp r0, #0x15 + bne _021E816C + mov r0, #0x15 + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E8140: + cmp r8, #2 + ble _021E8154 + mov r0, #0x10 + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E8154: + mov r0, #0 + add r8, r8, #1 + str r0, [sp] + b _021E8188 +_021E8164: + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E816C: + cmp r8, #2 + blt _021E817C + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E817C: + mov r0, #1 + add r8, r8, #1 + str r0, [sp] +_021E8188: + bl OS_GetTick + mov sb, r0 + mov sl, r1 + bl OS_GetTick + subs r2, r0, sb + sbc r0, r1, sl + mov r1, r0, lsl #6 + orr r1, r1, r2, lsr #26 + mov r0, r2, lsl #6 + ldr r2, _021E82F4 ; =0x000082EA + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + ldr r7, _021E82F8 ; =0x00001388 + cmpeq r0, r7 + bhs _021E8268 + mov fp, #0 + ldr r6, _021E82F4 ; =0x000082EA + ldr r5, _021E82EC ; =ov00_0221A694 + mov r4, fp +_021E81D8: + ldr r0, [r5, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r2, [r5, #8] + add r0, r2, #0x1000 + ldr r1, [r0, #0x3f0] + cmp r1, #1 + bne _021E8224 + ldr r2, _021E82F0 ; =0x00004E84 + ldr r1, _021E82EC ; =ov00_0221A694 + str r2, [r0, #8] + ldr r0, [r1, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + mov r0, #0x14 + bl ov00_021E8940 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E8224: + add r0, r2, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + mov r0, r7 + bl OS_Sleep + bl OS_GetTick + subs r2, r0, sb + sbc r0, r1, sl + mov r1, r0, lsl #6 + orr r1, r1, r2, lsr #26 + mov r0, r2, lsl #6 + mov r2, r6 + mov r3, fp + bl _ll_udiv + cmp r1, r4 + cmpeq r0, r7 + blo _021E81D8 +_021E8268: + ldr r0, _021E82EC ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x1000 + ldr r0, [r0, #0x314] + bl ov00_021E9754 + ldr r0, _021E82EC ; =ov00_0221A694 + ldr r0, [r0, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r0, [sp] + bl ov00_021E7F38 + ldr r2, _021E82EC ; =ov00_0221A694 + ldr r1, [r2, #8] + add r1, r1, #0x1000 + str r0, [r1, #4] + ldr r3, [r2, #8] + add r0, r3, #0x1000 + ldr r1, [r0, #4] + cmp r1, #0 + beq _021E82D8 + ldr r1, _021E82F0 ; =0x00004E84 + str r1, [r0, #8] + ldr r0, [r2, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E82D8: + add r0, r3, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + b _021E8050 + arm_func_end ov00_021E8048 + + arm_func_start ov00_021E82E8 +ov00_021E82E8: ; 0x021E82E8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021E82EC: .word ov00_0221A694 +_021E82F0: .word 0x00004E84 +_021E82F4: .word 0x000082EA +_021E82F8: .word 0x00001388 + arm_func_end ov00_021E82E8 + + arm_func_start ov00_021E82FC +ov00_021E82FC: ; 0x021E82FC + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _021E84B4 ; =ov00_0221A694 + mov r1, #0 + ldr r0, [r0, #8] + add r2, r0, #0x1000 + ldr r0, [r2, #0x314] + ldr r4, [r2, #0x20c] + ldr r5, [r2, #0x210] + bl ov00_021E9F2C + cmp r0, #1 + beq _021E8344 + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84B8 ; =0x00004E84 + ldr r1, [r0, #8] + mov r0, #0xe + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E8344: + bl ov00_021E84D4 + cmp r0, #0 + movne r0, #0xe + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r1, _021E84B8 ; =0x00004E84 + ldr r0, [r0, #8] + add r0, r0, #0x1000 + ldr r2, [r0, #8] + cmp r2, r1 + bge _021E8404 + sub r0, r1, #0x62 + cmp r2, r0 + bne _021E83FC + ldr r0, _021E84BC ; =ov00_022164A4 + ldr r1, _021E84C0 ; =0x0000071F + blx r4 + movs r4, r0 + bne _021E83AC + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84B8 ; =0x00004E84 + ldr r1, [r0, #8] + mov r0, #2 + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E83AC: + add r1, r4, #0x1f + ldr r0, _021E84C4 ; =ov00_0221A6A0 + bic r1, r1, #0x1f + bl DWCi_AUTH_UpDateWiFiID + cmp r0, #1 + mov r2, #0 + beq _021E83F0 + ldr r0, _021E84C8 ; =ov00_022164B4 + mov r1, r4 + blx r5 + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84B8 ; =0x00004E84 + ldr r1, [r0, #8] + mov r0, #0xf + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E83F0: + ldr r0, _021E84C8 ; =ov00_022164B4 + mov r1, r4 + blx r5 +_021E83FC: + mov r0, #0x15 + ldmia sp!, {r3, r4, r5, pc} +_021E8404: + add r0, r1, #4 + cmp r2, r0 + beq _021E8420 + add r0, r1, #8 + cmp r2, r0 + beq _021E8444 + b _021E84AC +_021E8420: + ldr r0, _021E84C4 ; =ov00_0221A6A0 + bl DWCi_AUTH_RemakeWiFiID + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84CC ; =0x00004E88 + ldr r1, [r0, #8] + mov r0, #0x10 + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E8444: + ldr r0, _021E84BC ; =ov00_022164A4 + mov r1, #0x700 + blx r4 + movs r4, r0 + bne _021E8474 + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84D0 ; =0x00004E8C + ldr r1, [r0, #8] + mov r0, #0x11 + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E8474: + add r0, r4, #0x1f + bic r0, r0, #0x1f + bl DWCi_AUTH_MakeWiFiID + ldr r0, _021E84C8 ; =ov00_022164B4 + mov r1, r4 + mov r2, #0 + blx r5 + ldr r0, _021E84B4 ; =ov00_0221A694 + ldr r2, _021E84D0 ; =0x00004E8C + ldr r1, [r0, #8] + mov r0, #0x11 + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E84AC: + mov r0, #0x12 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E84B4: .word ov00_0221A694 +_021E84B8: .word 0x00004E84 +_021E84BC: .word ov00_022164A4 +_021E84C0: .word 0x0000071F +_021E84C4: .word ov00_0221A6A0 +_021E84C8: .word ov00_022164B4 +_021E84CC: .word 0x00004E88 +_021E84D0: .word 0x00004E8C + arm_func_end ov00_021E82FC + + arm_func_start ov00_021E84D4 +ov00_021E84D4: ; 0x021E84D4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _021E876C ; =ov00_0221A694 + mov r1, #0 + ldr r0, [r0, #8] + str r1, [sp] + add r0, r0, #0x1000 + ldr r0, [r0, #0x314] + ldr r1, _021E8770 ; =ov00_022164C0 + bl ov00_021EA1CC + str r0, [sp] + cmp r0, #0 + beq _021E8508 + bl ov00_021EB5B0 +_021E8508: + ldr r0, _021E876C ; =ov00_0221A694 + mov r2, #0 + ldr r1, [r0, #8] + ldr r0, _021E8774 ; =_021E58C0 + str r2, [sp] + str r2, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0x314] + ldr r1, _021E8778 ; =ov00_022164C8 + bl ov00_021EA1CC + bl atoi + ldr r1, _021E8774 ; =_021E58C0 + ldr r1, [r1] + cmp r1, #0x22 + bne _021E8560 + ldr r0, _021E876C ; =ov00_0221A694 + ldr r2, _021E877C ; =0x00004E85 + ldr r1, [r0, #8] + mov r0, #0xc + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E8560: + cmp r0, #0xc8 + beq _021E8588 + ldr r1, _021E876C ; =ov00_0221A694 + add r0, r0, #0x1d8 + ldr r1, [r1, #8] + add r2, r0, #0x5800 + add r0, r1, #0x1000 + str r2, [r0, #8] + mov r0, #0x12 + ldmia sp!, {r3, r4, r5, pc} +_021E8588: + ldr r0, _021E876C ; =ov00_0221A694 + ldr r1, _021E8780 ; =ov00_022164D4 + ldr r2, [r0, #8] + mov r3, #4 + add r0, r2, #0x1000 + add r2, r2, #0xc + ldr r0, [r0, #0x314] + add r2, r2, #0x1000 + bl ov00_021EA224 + cmp r0, #0 + bgt _021E85D0 + ldr r0, _021E876C ; =ov00_0221A694 + ldr r2, _021E877C ; =0x00004E85 + ldr r1, [r0, #8] + mov r0, #0xe + add r1, r1, #0x1000 + str r2, [r1, #8] + ldmia sp!, {r3, r4, r5, pc} +_021E85D0: + ldr r0, _021E876C ; =ov00_0221A694 + add r1, sp, #0 + ldr r0, [r0, #8] + mov r2, #0xa + add r0, r0, #0xc + add r0, r0, #0x1000 + bl strtol + ldr r1, _021E876C ; =ov00_0221A694 + mov r4, r0 + ldr r5, [r1, #8] + add r0, r5, #0xc + add r0, r0, #0x1000 + bl strlen + add r1, r5, #0xc + add r1, r1, #0x1000 + ldr r2, [sp] + add r0, r1, r0 + cmp r2, r0 + beq _021E8630 + ldr r1, _021E877C ; =0x00004E85 + add r0, r5, #0x1000 + str r1, [r0, #8] + mov r0, #0xc + ldmia sp!, {r3, r4, r5, pc} +_021E8630: + add r0, r4, #0xe20 + add r1, r0, #0x4000 + add r0, r5, #0x1000 + str r1, [r0, #8] + cmp r4, #0x64 + bge _021E8764 + ldr r5, _021E876C ; =ov00_0221A694 + mov r0, #0 + ldr r2, [r5, #8] + ldr r1, _021E8784 ; =ov00_022164E0 + add r2, r2, #0x1000 + strb r0, [r2, #0x52] + ldr r2, [r5, #8] + ldr r3, _021E8788 ; =0x0000012D + add r2, r2, #0x1000 + strb r0, [r2, #0x1f] + ldr r2, [r5, #8] + add r2, r2, #0x1000 + strb r0, [r2, #0x17f] + ldr r2, [r5, #8] + add r2, r2, #0x1000 + strb r0, [r2, #0x10] + ldr r2, [r5, #8] + add r2, r2, #0x1000 + strb r0, [r2, #0x188] + ldr r2, [r5, #8] + add r0, r2, #0x1000 + add r2, r2, #0x52 + ldr r0, [r0, #0x314] + add r2, r2, #0x1000 + bl ov00_021EA224 + mov r0, r5 + ldr r2, [r0, #8] + ldr r1, _021E878C ; =ov00_022164E8 + add r0, r2, #0x1000 + add r2, r2, #0x1f + ldr r0, [r0, #0x314] + mov r3, #0x33 + add r2, r2, #0x1000 + bl ov00_021EA224 + mov r0, r5 + ldr r2, [r0, #8] + ldr r1, _021E8790 ; =ov00_022164F0 + add r0, r2, #0x1000 + add r2, r2, #0x7f + ldr r0, [r0, #0x314] + mov r3, #9 + add r2, r2, #0x1100 + bl ov00_021EA224 + mov r0, r5 + ldr r2, [r0, #8] + ldr r1, _021E8794 ; =ov00_022164FC + add r0, r2, #0x1000 + add r2, r2, #0x10 + ldr r0, [r0, #0x314] + mov r3, #0xf + add r2, r2, #0x1000 + bl ov00_021EA224 + mov r0, r5 + ldr r2, [r0, #8] + ldr r1, _021E8798 ; =ov00_02216508 + add r0, r2, #0x1000 + add r2, r2, #0x188 + ldr r0, [r0, #0x314] + mov r3, #0x41 + add r2, r2, #0x1000 + bl ov00_021EA278 + mov r1, r5 + ldr r0, [r1, #8] + mov r2, #0 + add r0, r0, #0x1000 + cmp r4, #0x28 + strb r2, [r0, #0x1b3] + movne r0, #1 + strne r0, [r1] + moveq r0, #2 + streq r0, [r1] +_021E8764: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E876C: .word ov00_0221A694 +_021E8770: .word ov00_022164C0 +_021E8774: .word _021E58C0 +_021E8778: .word ov00_022164C8 +_021E877C: .word 0x00004E85 +_021E8780: .word ov00_022164D4 +_021E8784: .word ov00_022164E0 +_021E8788: .word 0x0000012D +_021E878C: .word ov00_022164E8 +_021E8790: .word ov00_022164F0 +_021E8794: .word ov00_022164FC +_021E8798: .word ov00_02216508 + arm_func_end ov00_021E84D4 + + arm_func_start ov00_021E879C +ov00_021E879C: ; 0x021E879C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x94 + ldr r3, _021E8918 ; =ov00_0221A694 + mov r4, r0 + ldr r0, [r3, #0x10] + ldr r3, [r3, #0xc] + cmp r0, #0 + mov r6, r1 + mov r5, r2 + cmpeq r3, #0 + bne _021E87F8 + ldr r0, _021E891C ; =ov00_02216514 + bl strlen + mov r3, r0 + ldr r1, _021E8920 ; =ov00_02216520 + ldr r2, _021E891C ; =ov00_02216514 + mov r0, r4 + bl ov00_021E99A4 + cmp r0, #0 + beq _021E8850 + add sp, sp, #0x94 + mov r0, #8 + ldmia sp!, {r3, r4, r5, r6, pc} +_021E87F8: + ldr r0, _021E8924 ; =ov00_02216528 + bl strlen + mov r3, r0 + ldr r1, _021E8920 ; =ov00_02216520 + ldr r2, _021E8924 ; =ov00_02216528 + mov r0, r4 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x94 + movne r0, #8 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r0, r6 + bl strlen + mov r3, r0 + ldr r1, _021E8928 ; =ov00_02216530 + mov r0, r4 + mov r2, r6 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x94 + movne r0, #8 + ldmneia sp!, {r3, r4, r5, r6, pc} +_021E8850: + ldr r1, _021E892C ; =ov00_0221A6A0 + add r0, sp, #0 + bl ov00_021E89AC + cmp r0, #0 + addeq sp, sp, #0x94 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, _021E8930 ; =ov00_0221A6BC + add r1, sp, #0 + ldr r2, [r0] + mov r0, r4 + bl ov00_021E8C5C + cmp r0, #0 + addeq sp, sp, #0x94 + moveq r0, #8 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, _021E8918 ; =ov00_0221A694 + ldr r0, [r0, #4] + cmp r0, #1 + bne _021E88CC + ldr r0, _021E8934 ; =ov00_02216538 + bl strlen + mov r3, r0 + ldr r1, _021E8938 ; =ov00_0221653C + ldr r2, _021E8934 ; =ov00_02216538 + mov r0, r4 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x94 + movne r0, #8 + ldmneia sp!, {r3, r4, r5, r6, pc} +_021E88CC: + mov r0, r5 + bl wcslen + cmp r0, #0 + beq _021E890C + mov r0, r5 + bl wcslen + mov r3, r0 + ldr r1, _021E893C ; =ov00_02216544 + mov r0, r4 + mov r2, r5 + mov r3, r3, lsl #1 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x94 + movne r0, #8 + ldmneia sp!, {r3, r4, r5, r6, pc} +_021E890C: + mov r0, #0 + add sp, sp, #0x94 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021E8918: .word ov00_0221A694 +_021E891C: .word ov00_02216514 +_021E8920: .word ov00_02216520 +_021E8924: .word ov00_02216528 +_021E8928: .word ov00_02216530 +_021E892C: .word ov00_0221A6A0 +_021E8930: .word ov00_0221A6BC +_021E8934: .word ov00_02216538 +_021E8938: .word ov00_0221653C +_021E893C: .word ov00_02216544 + arm_func_end ov00_021E879C + + arm_func_start ov00_021E8940 +ov00_021E8940: ; 0x021E8940 + stmdb sp!, {r4, lr} + ldr r1, _021E8980 ; =ov00_0221A694 + mov r4, r0 + ldr r0, [r1, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r1, _021E8980 ; =ov00_0221A694 + ldr r0, [r1, #8] + add r0, r0, #0x1000 + str r4, [r0, #4] + ldr r0, [r1, #8] + add r0, r0, #0x3d8 + add r0, r0, #0x1000 + bl OS_UnlockMutex + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E8980: .word ov00_0221A694 + arm_func_end ov00_021E8940 + + arm_func_start ov00_021E8984 +ov00_021E8984: ; 0x021E8984 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r4, r0 + add r0, sp, #0 + bl DWCi_BM_GetWiFiInfo + add r1, sp, #0 + mov r0, r4 + bl ov00_021E89AC + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_021E8984 + + arm_func_start ov00_021E89AC +ov00_021E89AC: ; 0x021E89AC + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x8c + mov r6, r1 + mov r1, #0 + mov r2, #0x94 + mov r4, r0 + bl MI_CpuFill8 + ldmia r6, {r3, r5} + cmp r5, #0 + cmpeq r3, #0 + mov r1, #0xe + beq _021E89F0 + ldr r2, _021E8C3C ; =ov00_02216550 + mov r0, r4 + str r5, [sp] + bl OS_SNPrintf + b _021E8A08 +_021E89F0: + ldr r3, [r6, #8] + ldr r5, [r6, #0xc] + ldr r2, _021E8C3C ; =ov00_02216550 + mov r0, r4 + str r5, [sp] + bl OS_SNPrintf +_021E8A08: + ldrh r3, [r6, #0x10] + ldr r2, _021E8C40 ; =ov00_02216558 + add r0, r4, #0xe + mov r1, #7 + bl OS_SNPrintf + ldr r0, _021E8C44 ; =0x027FFE0C + ldrb r0, [r0] + cmp r0, #0 + bne _021E8A30 + bl OS_Terminate +_021E8A30: + ldr r0, _021E8C44 ; =0x027FFE0C + add r1, r4, #0x15 + mov r2, #4 + bl MI_CpuCopy8 + ldr r0, _021E8C48 ; =0x027FFE10 + ldrb r0, [r0] + cmp r0, #0 + bne _021E8A54 + bl OS_Terminate +_021E8A54: + ldr r0, _021E8C48 ; =0x027FFE10 + add r1, r4, #0x1a + mov r2, #2 + bl MI_CpuCopy8 + mov r1, #0x30 + add r0, sp, #0x16 + strb r1, [r4, #0x1d] + bl OS_GetMacAddress + ldr r5, _021E8C4C ; =ov00_02216560 + add r7, sp, #0x16 + add r8, r4, #0x1f + mov r6, #0 +_021E8A84: + ldrb r2, [r7], #1 + mov r0, r8 + mov r1, r5 + bl OS_SPrintf + add r6, r6, #1 + cmp r6, #6 + add r8, r8, #2 + blt _021E8A84 + add r0, sp, #0x38 + bl OS_GetOwnerInfo + ldrb r0, [sp, #0x38] + ldr r2, _021E8C4C ; =ov00_02216560 + mov r1, #3 + cmp r0, #8 + movhs r0, #1 + strhsb r0, [sp, #0x38] + ldrb r3, [sp, #0x38] + add r0, r4, #0x2c + bl OS_SNPrintf + add r0, sp, #0x3c + add r1, r4, #0x7e + mov r2, #0x14 + bl MI_CpuCopy8 + ldrb r1, [sp, #0x3b] + ldr r2, _021E8C50 ; =ov00_02216568 + add r0, r4, #0x2f + str r1, [sp] + ldrb r3, [sp, #0x3a] + mov r1, #5 + bl OS_SNPrintf + add r0, sp, #0x28 + add r1, sp, #0x1c + bl RTC_GetDateTime + cmp r0, #0 + addne sp, sp, #0x8c + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sp, #0x2c] + ldr r2, _021E8C54 ; =ov00_02216574 + str r0, [sp] + ldr r1, [sp, #0x30] + add r0, r4, #0x34 + str r1, [sp, #4] + ldr r3, [sp, #0x1c] + mov r1, #0xd + str r3, [sp, #8] + ldr r3, [sp, #0x20] + str r3, [sp, #0xc] + ldr r3, [sp, #0x24] + str r3, [sp, #0x10] + ldr r3, [sp, #0x28] + bl OS_SNPrintf + bl OS_DisableInterrupts + mov r6, r0 + bl WCM_GetApMacAddress + mov r7, r0 + mov r1, #6 + bl DC_InvalidateRange + cmp r7, #0 + bne _021E8B88 + mov r0, r6 + bl OS_RestoreInterrupts + add sp, sp, #0x8c + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_021E8B88: + ldr r5, _021E8C4C ; =ov00_02216560 + add r8, r4, #0x41 + mov sb, #0 +_021E8B94: + ldrb r2, [r7, sb] + mov r0, r8 + mov r1, r5 + bl OS_SPrintf + add sb, sb, #1 + cmp sb, #6 + add r8, r8, #2 + blt _021E8B94 + bl ov00_021FAA40 + mov r3, r0 + cmp r3, #0xff + beq _021E8BCC + cmp r3, #0x63 + bls _021E8BD0 +_021E8BCC: + mov r3, #0x63 +_021E8BD0: + ldr r2, _021E8C58 ; =ov00_02216590 + add r0, r4, #0x6f + mov r1, #0xe + bl OS_SNPrintf + add r0, sp, #0x14 + bl WCM_GetApEssid + mov r5, r0 + mov r1, #0x20 + bl DC_InvalidateRange + cmp r5, #0 + bne _021E8C10 + mov r0, r6 + bl OS_RestoreInterrupts + add sp, sp, #0x8c + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_021E8C10: + mov r0, r5 + add r1, r4, #0x4e + mov r2, #0x20 + bl MI_CpuCopy8 + add r0, r4, #0x72 + bl ov00_021FAA70 + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, #1 + add sp, sp, #0x8c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021E8C3C: .word ov00_02216550 +_021E8C40: .word ov00_02216558 +_021E8C44: .word 0x027FFE0C +_021E8C48: .word 0x027FFE10 +_021E8C4C: .word ov00_02216560 +_021E8C50: .word ov00_02216568 +_021E8C54: .word ov00_02216574 +_021E8C58: .word ov00_02216590 + arm_func_end ov00_021E89AC + + arm_func_start ov00_021E8C5C +ov00_021E8C5C: ; 0x021E8C5C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x28 + mov r4, r2 + mov r6, r0 + mov r5, r1 + mov r3, #2 + ldr r2, _021E8F58 ; =ov00_022165A0 + add r0, sp, #4 + mov r1, #0x21 + str r3, [sp] + bl OS_SNPrintf + add r0, sp, #4 + bl strlen + mov r3, r0 + ldr r1, _021E8F5C ; =ov00_022165AC + mov r0, r6 + add r2, sp, #4 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl strlen + mov r3, r0 + ldr r1, _021E8F60 ; =ov00_022165B4 + mov r0, r6 + mov r2, r5 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0xe + bl strlen + mov r3, r0 + ldr r1, _021E8F64 ; =ov00_022165BC + mov r0, r6 + add r2, r5, #0xe + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x41 + bl strlen + mov r3, r0 + ldr r1, _021E8F68 ; =ov00_022165C4 + mov r0, r6 + add r2, r5, #0x41 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x6f + bl strlen + mov r3, r0 + ldr r1, _021E8F6C ; =ov00_022165CC + mov r0, r6 + add r2, r5, #0x6f + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x15 + bl strlen + mov r3, r0 + ldr r1, _021E8F70 ; =ov00_022165D4 + mov r0, r6 + add r2, r5, #0x15 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x1a + bl strlen + mov r3, r0 + ldr r1, _021E8F74 ; =ov00_022165DC + mov r0, r6 + add r2, r5, #0x1a + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x1d + bl strlen + mov r3, r0 + ldr r1, _021E8F78 ; =ov00_022165E4 + mov r0, r6 + add r2, r5, #0x1d + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x1f + bl strlen + mov r3, r0 + ldr r1, _021E8F7C ; =ov00_022165EC + mov r0, r6 + add r2, r5, #0x1f + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x2c + bl strlen + mov r3, r0 + ldr r1, _021E8F80 ; =ov00_022165F4 + mov r0, r6 + add r2, r5, #0x2c + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x2f + bl strlen + mov r3, r0 + ldr r1, _021E8F84 ; =ov00_022165FC + mov r0, r6 + add r2, r5, #0x2f + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x34 + bl strlen + mov r3, r0 + ldr r1, _021E8F88 ; =ov00_02216604 + mov r0, r6 + add r2, r5, #0x34 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x7e + bl wcslen + mov r3, r0 + ldr r1, _021E8F8C ; =ov00_0221660C + mov r0, r6 + add r2, r5, #0x7e + mov r3, r3, lsl #1 + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + cmp r4, #1 + bne _021E8EFC + add r0, r5, #0x4e + bl strlen + mov r3, r0 + ldr r1, _021E8F90 ; =ov00_02216614 + mov r0, r6 + add r2, r5, #0x4e + bl ov00_021E99A4 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} +_021E8EFC: + ldr r2, _021E8F94 ; =ov00_0221661C + mov r3, #2 + add r0, sp, #4 + mov r1, #0x21 + str r3, [sp] + bl OS_SNPrintf + ldr r1, _021E8F98 ; =ov00_02216634 + add r2, sp, #4 + mov r0, r6 + bl ov00_021E98C8 + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _021E8F9C ; =ov00_02216640 + mov r0, r6 + add r2, r5, #0x15 + bl ov00_021E98C8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021E8F58: .word ov00_022165A0 +_021E8F5C: .word ov00_022165AC +_021E8F60: .word ov00_022165B4 +_021E8F64: .word ov00_022165BC +_021E8F68: .word ov00_022165C4 +_021E8F6C: .word ov00_022165CC +_021E8F70: .word ov00_022165D4 +_021E8F74: .word ov00_022165DC +_021E8F78: .word ov00_022165E4 +_021E8F7C: .word ov00_022165EC +_021E8F80: .word ov00_022165F4 +_021E8F84: .word ov00_022165FC +_021E8F88: .word ov00_02216604 +_021E8F8C: .word ov00_0221660C +_021E8F90: .word ov00_02216614 +_021E8F94: .word ov00_0221661C +_021E8F98: .word ov00_02216634 +_021E8F9C: .word ov00_02216640 + arm_func_end ov00_021E8C5C + + arm_func_start ov00_021E8FA0 +ov00_021E8FA0: ; 0x021E8FA0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r2, _021E90A8 ; =0x00001C14 + mov r6, r0 + ldr r4, [r5, #0xc] + mov r1, #0 + bl MI_CpuFill8 + add r1, r6, #4 + add r0, r6, #0x1000 + mvn r2, #0 + str r2, [r0, #0xa30] + mov lr, r5 + str r2, [r0, #0xa34] + add ip, r1, #0x1000 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2} + stmia ip, {r0, r1, r2} + ldr r0, _021E90AC ; =ov00_02216680 + ldr r1, _021E90B0 ; =0x00000B68 + blx r4 + add r1, r6, #0x1000 + str r0, [r1, #0x9cc] + cmp r0, #0 + moveq r0, #1 + streq r0, [r1, #0x20] + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _021E90B4 ; =ov00_02216698 + ldr r1, _021E90B8 ; =0x000005EA + blx r4 + add r2, r6, #0x1000 + str r0, [r2, #0x9d0] + cmp r0, #0 + moveq r0, #1 + streq r0, [r2, #0x20] + ldmeqia sp!, {r4, r5, r6, pc} + add r1, r6, #0x208 + ldr r2, [r2, #0xc] + mov r0, r6 + add r1, r1, #0x1800 + bl ov00_021E9B44 + cmp r0, #0 + bne _021E905C + add r1, r6, #0x1000 + mov r0, #1 + str r0, [r1, #0x20] + ldmia sp!, {r4, r5, r6, pc} +_021E905C: + ldr r1, [r5] + mov r0, r6 + bl ov00_021E9C84 + cmp r0, #0 + bne _021E9080 + add r1, r6, #0x1000 + mov r0, #1 + str r0, [r1, #0x20] + ldmia sp!, {r4, r5, r6, pc} +_021E9080: + mov r0, r6 + bl ov00_021E9808 + add r1, r6, #0x1000 + str r0, [r1, #0x20] + cmp r0, #0 + moveq r0, #0xff + streqb r0, [r1] + add r0, r6, #0x1000 + ldr r0, [r0, #0x20] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021E90A8: .word 0x00001C14 +_021E90AC: .word ov00_02216680 +_021E90B0: .word 0x00000B68 +_021E90B4: .word ov00_02216698 +_021E90B8: .word 0x000005EA + arm_func_end ov00_021E8FA0 + + arm_func_start ov00_021E90BC +ov00_021E90BC: ; 0x021E90BC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _021E9140 ; =ov00_022166B0 + ldr r2, _021E9144 ; =ov00_022166BC + mov r4, r0 + bl ov00_021E98C8 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r4, pc} + add r0, r4, #0x1000 + ldr r0, [r0, #0x9f8] + ldr r1, _021E9148 ; =ov00_022166C4 + bl strstr + add r0, r0, #4 + bl strlen + movs r3, r0 + beq _021E9134 + ldr r2, _021E914C ; =ov00_022166CC + add r0, sp, #0 + mov r1, #7 + bl OS_SNPrintf + ldr r1, _021E9150 ; =ov00_022166D0 + add r2, sp, #0 + mov r0, r4 + bl ov00_021E98C8 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r4, pc} +_021E9134: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E9140: .word ov00_022166B0 +_021E9144: .word ov00_022166BC +_021E9148: .word ov00_022166C4 +_021E914C: .word ov00_022166CC +_021E9150: .word ov00_022166D0 + arm_func_end ov00_021E90BC + + arm_func_start ov00_021E9154 +ov00_021E9154: ; 0x021E9154 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + add r0, r5, #0x3f8 + add r2, r5, #0x1000 + mov r3, #0 + add r0, r0, #0x1800 + mov r4, r1 + str r3, [r2, #0xc10] + bl OS_InitMutex + add r0, r5, #0x218 + add r0, r0, #0x1800 + bl OS_InitMutex + add r0, r5, #0x1000 + ldr r0, [r0, #0x18] + cmp r0, #1 + ldreq r0, _021E9208 ; =ov00_0221A6B4 + moveq r1, #1 + ldrne r0, _021E9208 ; =ov00_0221A6B4 + movne r1, #0 + str r1, [r0] + add r0, r5, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021E91D0 + add r0, r5, #0x338 + add r0, r0, #0x1800 + bl OS_IsThreadTerminated + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, pc} +_021E91D0: + add r0, r5, #0x338 + mov r1, #0x1000 + str r1, [sp] + ldr r1, _021E920C ; =ov00_021E9438 + mov r2, r5 + add r0, r0, #0x1800 + add r3, r5, #0x1000 + str r4, [sp, #4] + bl OS_CreateThread + add r0, r5, #0x338 + add r0, r0, #0x1800 + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E9208: .word ov00_0221A6B4 +_021E920C: .word ov00_021E9438 + arm_func_end ov00_021E9154 + + arm_func_start ov00_021E9210 +ov00_021E9210: ; 0x021E9210 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x1000 + ldrb r0, [r0] + cmp r0, #0xff + ldmneia sp!, {r4, pc} + add r0, r4, #0x3f8 + add r0, r0, #0x1800 + bl OS_LockMutex + add r0, r4, #0x3f8 + add r1, r4, #0x1000 + mov r2, #1 + add r0, r0, #0x1800 + str r2, [r1, #0xc10] + bl OS_UnlockMutex + add r0, r4, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread + ldmia sp!, {r4, pc} + arm_func_end ov00_021E9210 + + arm_func_start ov00_021E926C +ov00_021E926C: ; 0x021E926C + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x1000 + ldr r0, [r0, #0x130] + cmp r0, #1 + bne _021E92A0 + add r0, r4, #0x1d4 + add r0, r0, #0x1800 + bl OS_GetLowEntropyData + add r0, r4, #0x1d4 + add r0, r0, #0x1800 + mov r1, #0x20 + bl CPS_SslAddRandomSeed +_021E92A0: + add r0, r4, #0x3f8 + add r0, r0, #0x1800 + bl OS_LockMutex + add r0, r4, #0x1000 + ldr r0, [r0, #0xc10] + cmp r0, #1 + add r0, r4, #0x3f8 + add r0, r0, #0x1800 + bne _021E92D0 + bl OS_UnlockMutex + mov r0, #0 + ldmia sp!, {r4, pc} +_021E92D0: + bl OS_UnlockMutex + mov r0, #0xa + bl OS_Sleep + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov00_021E926C + + arm_func_start ov00_021E92E4 +ov00_021E92E4: ; 0x021E92E4 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x138 + add r0, r0, #0x1000 + mov r1, #0 + mov r2, #0x64 + bl MI_CpuFill8 + ldr r0, _021E9334 ; =0x00000B68 + add r1, r4, #0x1000 + str r0, [r1, #0x174] + ldr r3, [r1, #0x9cc] + add r0, r4, #0x138 + ldr r2, _021E9338 ; =0x000005EA + str r3, [r1, #0x178] + str r2, [r1, #0x180] + ldr r2, [r1, #0x9d0] + add r0, r0, #0x1000 + str r2, [r1, #0x184] + bl CPS_SocRegister + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E9334: .word 0x00000B68 +_021E9338: .word 0x000005EA + arm_func_end ov00_021E92E4 + + arm_func_start ov00_021E933C +ov00_021E933C: ; 0x021E933C + ldr ip, _021E934C ; =CPS_Resolve + add r0, r0, #0x1000 + ldr r0, [r0, #0x124] + bx ip + .balign 4, 0 +_021E934C: .word CPS_Resolve + arm_func_end ov00_021E933C + + arm_func_start ov00_021E9350 +ov00_021E9350: ; 0x021E9350 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r0 + add r0, r5, #0x1000 + ldr r6, [r0, #0xa08] + add r2, r5, #0x208 + ldr r1, _021E942C ; =ov00_022166C4 + mov r0, r6 + add r4, r2, #0x1800 + bl strstr + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, _021E942C ; =ov00_022166C4 + mov r0, r6 + bl strstr + add r1, r5, #0x218 + add r6, r0, #4 + add r0, r1, #0x1800 + bl OS_LockMutex + ldr r0, [r4, #4] + add r1, r5, #0x218 + sub r2, r0, r6 + add r0, r5, #0x1000 + str r2, [r0, #0xa34] + add r0, r1, #0x1800 + bl OS_UnlockMutex + ldr r0, [r4] + ldr r1, _021E9430 ; =ov00_022166E0 + bl strstr + movs r8, r0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _021E9430 ; =ov00_022166E0 + bl strlen + mov r7, r0 + ldr r1, _021E9434 ; =ov00_022166F4 + add r0, r8, r7 + bl strstr + mov r6, r0 + add r0, r5, #0x218 + ldrsb r4, [r6] + mov r1, #0 + add r0, r0, #0x1800 + strb r1, [r6] + bl OS_LockMutex + add r0, r8, r7 + bl atoi + add r1, r5, #0x1000 + add r2, r5, #0x218 + str r0, [r1, #0xa30] + add r0, r2, #0x1800 + bl OS_UnlockMutex + strb r4, [r6] + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021E942C: .word ov00_022166C4 +_021E9430: .word ov00_022166E0 +_021E9434: .word ov00_022166F4 + arm_func_end ov00_021E9350 + + arm_func_start ov00_021E9438 +ov00_021E9438: ; 0x021E9438 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov sl, r0 + add r0, sl, #0x1000 + ldr r8, [r0, #0x1c] + add r0, sl, #0x138 + add r1, sl, #0x19c + add r2, sl, #0x208 + add r4, r0, #0x1000 + cmp r8, #0 + mov r0, sl + add r5, r1, #0x1000 + add r7, r2, #0x1800 + mov fp, #0 + ldrle r8, _021E9740 ; =0x0000EA60 + bl ov00_021E92E4 + mov r0, sl + bl ov00_021E933C + movs r6, r0 + add r0, sl, #0x1000 + moveq r1, #2 + streq r1, [r0, #0x20] + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str r6, [r0, #0x12c] + bl CPS_SocUse + add r0, sl, #0x1000 + ldr r0, [r0, #0x130] + cmp r0, #1 + bne _021E94EC + mov r0, r5 + mov r1, #0 + mov r2, #0x830 + bl MI_CpuFill8 + ldr r1, _021E9744 ; =ov00_021E9B38 + add r0, sl, #0x1000 + str r1, [r5, #0x810] + ldr r1, [r0, #0x124] + ldr r0, _021E9748 ; =ov00_02216650 + str r1, [r5, #0x800] + mov r1, #0xc + str r5, [r4, #0xc] + bl CPS_SetRootCa + mov r0, #1 + bl CPS_SetSsl +_021E94EC: + add r0, sl, #0x1100 + ldrh r1, [r0, #0x34] + mov r2, r6 + mov r0, #0 + bl CPS_SocBind + bl CPS_TcpConnect + cmp r0, #0 + add r0, sl, #0x1000 + beq _021E9528 + mov r1, #3 + str r1, [r0, #0x20] + bl CPS_SocRelease + bl CPS_SocUnRegister + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E9528: + ldr r4, [r0, #0x9f8] + mov r0, r4 + bl strlen + mov r1, r0 + mov r0, r4 + bl CPS_SocWrite + str r0, [sp, #0x10] + cmp r0, #0 + bgt _021E955C + add r0, sl, #0x1000 + mov r1, #5 + str r1, [r0, #0x20] + b _021E9728 +_021E955C: + bl CPS_SocFlush + mov r0, sl + bl ov00_021E926C + cmp r0, #0 + bne _021E9580 + add r0, sl, #0x1000 + mov r1, #7 + str r1, [r0, #0x20] + b _021E9728 +_021E9580: + ldr r0, [r7] + str r0, [r7, #4] + ldr r1, [r7] + ldr r0, [r7, #0xc] + add r0, r1, r0 + str r0, [r7, #8] + bl OS_GetTick + str r0, [sp, #8] + add r0, sl, #0x234 + str r1, [sp, #4] + add r5, sl, #0x218 + add r6, r0, #0x1800 + add r4, sl, #0x1000 +_021E95B4: + ldr r0, _021E974C ; =_021D4670 + ldr r0, [r0] + cmp r0, #0 + bne _021E95D4 + add r0, sl, #0x1000 + mov r1, #5 + str r1, [r0, #0x20] + b _021E9728 +_021E95D4: + bl CPS_SocGetLength + str r0, [sp, #0x10] + cmp r0, #0 + blt _021E9704 + ble _021E9688 + bl OS_GetTick + str r0, [sp, #8] + add r0, sp, #0x10 + str r1, [sp, #4] + bl CPS_SocRead + cmp r0, #0 + beq _021E9704 + ldmib r7, {r1, r2} + sub r2, r2, #1 + ldr sb, [sp, #0x10] + sub r2, r2, r1 + cmp sb, r2 + movge sb, r2 + mov r2, sb + bl MI_CpuCopy8 + ldr r0, [r7, #4] + cmp fp, #1 + add r1, r0, sb + str r1, [r7, #4] + mov r0, #0 + strb r0, [r1] + bne _021E9660 + add r0, r5, #0x1800 + bl OS_LockMutex + ldr r1, [r6] + add r0, r5, #0x1800 + add r1, r1, sb + str r1, [r6] + bl OS_UnlockMutex + b _021E966C +_021E9660: + mov r0, sl + bl ov00_021E9350 + mov fp, r0 +_021E966C: + ldr r0, [sp, #0x10] + cmp r0, sb + bls _021E9680 + bl CPS_SocConsume + b _021E9704 +_021E9680: + mov r0, sb + bl CPS_SocConsume +_021E9688: + ldr r1, [r4, #0xa30] + cmp r1, #0 + ldrge r0, [r4, #0xa34] + cmpge r0, r1 + bge _021E9704 + bl OS_GetTick + ldr r2, [sp, #8] + mov r3, #0 + subs r2, r0, r2 + ldr r0, [sp, #4] + sbc r0, r1, r0 + mov r1, r0, lsl #6 + orr r1, r1, r2, lsr #26 + mov r0, r2, lsl #6 + ldr r2, _021E9750 ; =0x000082EA + bl _ll_udiv + cmp r1, r8, asr #31 + cmpeq r0, r8 + bls _021E96E4 + add r0, sl, #0x1000 + mov r1, #6 + str r1, [r0, #0x20] + b _021E9728 +_021E96E4: + mov r0, sl + bl ov00_021E926C + cmp r0, #0 + bne _021E95B4 + add r0, sl, #0x1000 + mov r1, #7 + str r1, [r0, #0x20] + b _021E9728 +_021E9704: + bl CPS_TcpShutdown + bl CPS_TcpClose + bl CPS_SocRelease + bl CPS_SocUnRegister + add r0, sl, #0x1000 + mov r1, #8 + str r1, [r0, #0x20] + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021E9728: + bl CPS_TcpShutdown + bl CPS_TcpClose + bl CPS_SocRelease + bl CPS_SocUnRegister + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021E9740: .word 0x0000EA60 +_021E9744: .word ov00_021E9B38 +_021E9748: .word ov00_02216650 +_021E974C: .word _021D4670 +_021E9750: .word 0x000082EA + arm_func_end ov00_021E9438 + + arm_func_start ov00_021E9754 +ov00_021E9754: ; 0x021E9754 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + add r1, r5, #0x1000 + ldr r4, [r1, #0x14] + ldmeqia sp!, {r3, r4, r5, pc} + add r1, r5, #0x238 + add r1, r1, #0x1800 + mov r2, #0x20 + bl ov00_021EA2B8 + add r1, r5, #0x208 + mov r0, r5 + add r1, r1, #0x1800 + bl ov00_021E9B9C + add r1, r5, #0x1f8 + mov r0, r5 + add r1, r1, #0x1800 + bl ov00_021E9B9C + add r0, r5, #0x1000 + ldr r1, [r0, #0x9cc] + cmp r1, #0 + beq _021E97C0 + ldr r0, _021E97FC ; =ov00_022166F8 + mov r2, #0 + blx r4 + add r0, r5, #0x1000 + mov r1, #0 + str r1, [r0, #0x9cc] +_021E97C0: + add r0, r5, #0x1000 + ldr r1, [r0, #0x9d0] + cmp r1, #0 + beq _021E97E8 + ldr r0, _021E9800 ; =ov00_02216710 + mov r2, #0 + blx r4 + add r0, r5, #0x1000 + mov r1, #0 + str r1, [r0, #0x9d0] +_021E97E8: + ldr r2, _021E9804 ; =0x00001C14 + mov r0, r5 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E97FC: .word ov00_022166F8 +_021E9800: .word ov00_02216710 +_021E9804: .word 0x00001C14 + arm_func_end ov00_021E9754 + + arm_func_start ov00_021E9808 +ov00_021E9808: ; 0x021E9808 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r7, r0 + add r0, r7, #0x1000 + ldr r1, [r0, #8] + add r0, r7, #0x1f8 + cmp r1, #0 + ldreq r6, _021E98C0 ; =ov00_02216728 + add r5, r0, #0x1800 + add r0, r7, #0x1000 + ldrne r6, _021E98C4 ; =ov00_0221677C + ldr r0, [r0, #0x124] + bl strlen + mov r4, r0 + mov r0, r6 + bl strlen + add r1, r7, #0x1000 + mov r8, r0 + ldr r0, [r1, #0x128] + bl strlen + sub r1, r8, #4 + add r0, r1, r0 + add r2, r4, r0 + add r0, r7, #0x1f8 + add r1, r0, #0x1800 + add r2, r2, #0x400 + mov r0, r7 + bl ov00_021E9B44 + cmp r0, #1 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r3, r7, #0x1000 + ldr r0, [r3, #0x124] + mov r2, r6 + str r0, [sp] + ldr r0, [r5, #4] + ldr r1, [r5, #0xc] + ldr r3, [r3, #0x128] + bl OS_SNPrintf + ldr r1, [r5, #4] + add r0, r1, r0 + str r0, [r5, #4] + mov r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021E98C0: .word ov00_02216728 +_021E98C4: .word ov00_0221677C + arm_func_end ov00_021E9808 + + arm_func_start ov00_021E98C8 +ov00_021E98C8: ; 0x021E98C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r0 + mov r6, r2 + add r2, r8, #0x1f8 + mov r0, r6 + mov r7, r1 + add r5, r2, #0x1800 + bl strlen + mov r4, r0 + ldr r0, _021E999C ; =ov00_0221679C + bl strlen + mov sb, r0 + mov r0, r7 + bl strlen + sub r1, sb, #4 + add r0, r1, r0 + add r4, r4, r0 + ldmib r5, {r1, r2} + add r0, r4, #1 + sub r1, r2, r1 + cmp r0, r1 + ble _021E9940 + sub r2, r4, r1 + mov r0, r8 + mov r1, r5 + add r2, r2, #1 + bl ov00_021E9BDC + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021E9940: + ldr r0, [r5] + ldr r1, _021E99A0 ; =ov00_022166C4 + bl strstr + add sb, r0, #2 + ldrsb r8, [r0, #2] + mov r0, sb + bl strlen + add r2, r0, #1 + add r0, sb, r4 + mov r1, sb + bl memmove + ldr r2, _021E999C ; =ov00_0221679C + str r6, [sp] + mov r3, r7 + mov r0, sb + add r1, r4, #1 + bl OS_SNPrintf + strb r8, [sb, r0] + ldr r1, [r5, #4] + mov r0, #0 + add r1, r1, r4 + str r1, [r5, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021E999C: .word ov00_0221679C +_021E99A0: .word ov00_022166C4 + arm_func_end ov00_021E98C8 + + arm_func_start ov00_021E99A4 +ov00_021E99A4: ; 0x021E99A4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + add r0, sl, #0x1000 + ldr r4, [r0, #0x9f4] + add r0, sl, #0x1f8 + cmp r4, #0 + ldreq r7, _021E9AA8 ; =ov00_022167A8 + mov r8, r2 + add r4, sl, #0x1000 + add r6, r0, #0x1800 + ldr r0, [r4, #0x9f4] + mov fp, r3 + add r5, r0, #1 + mov r2, #0 + mov sb, r1 + ldrne r7, _021E9AAC ; =ov00_022167AC + mov r0, r8 + mov r1, fp + mov r3, r2 + str r5, [r4, #0x9f4] + bl ov00_021EBE08 + mov r5, r0 + mov r0, r7 + bl strlen + mov r4, r0 + mov r0, sb + bl strlen + sub r1, r4, #2 + add r2, r1, r0 + ldmib r6, {r0, r1} + add r2, r5, r2 + sub r1, r1, r0 + cmp r2, r1 + ble _021E9A54 + sub r2, r2, r1 + mov r0, sl + mov r1, r6 + add r2, r2, #1 + bl ov00_021E9BDC + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldmib r6, {r0, r1} + sub r1, r1, r0 +_021E9A54: + mov r2, r7 + mov r3, sb + bl OS_SNPrintf + ldr r2, [r6, #4] + mov r1, fp + add r2, r2, r0 + str r2, [r6, #4] + ldr r0, [r6, #8] + sub r3, r0, r2 + mov r0, r8 + sub r3, r3, #1 + bl ov00_021EBE08 + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r6, #4] + mov r0, #0 + add r1, r1, r5 + str r1, [r6, #4] + strb r0, [r1] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021E9AA8: .word ov00_022167A8 +_021E9AAC: .word ov00_022167AC + arm_func_end ov00_021E99A4 + + arm_func_start ov00_021E9AB0 +ov00_021E9AB0: ; 0x021E9AB0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + add r1, r7, #0x1f8 + mov r0, r6 + add r5, r1, #0x1800 + bl strlen + mov r4, r0 + ldmib r5, {r0, r1} + sub r1, r1, r0 + cmp r4, r1 + ble _021E9B08 + sub r2, r4, r1 + mov r0, r7 + mov r1, r5 + add r2, r2, #1 + bl ov00_021E9BDC + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldmib r5, {r0, r1} + sub r1, r1, r0 +_021E9B08: + ldr r2, _021E9B34 ; =ov00_022167B4 + mov r3, r6 + bl OS_SNPrintf + cmp r0, r4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r5, #4] + add r0, r1, r0 + str r0, [r5, #4] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021E9B34: .word ov00_022167B4 + arm_func_end ov00_021E9AB0 + + arm_func_start ov00_021E9B38 +ov00_021E9B38: ; 0x021E9B38 + tst r0, #0x8000 + bicne r0, r0, #0x8000 + bx lr + arm_func_end ov00_021E9B38 + + arm_func_start ov00_021E9B44 +ov00_021E9B44: ; 0x021E9B44 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r2 + add r0, r0, #0x1000 + ldr r2, [r0, #0x10] + mov r5, r1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _021E9B98 ; =ov00_022167B8 + mov r1, r4 + blx r2 + str r0, [r5] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + str r0, [r5, #4] + str r4, [r5, #0xc] + ldr r0, [r5] + add r0, r0, r4 + str r0, [r5, #8] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021E9B98: .word ov00_022167B8 + arm_func_end ov00_021E9B44 + + arm_func_start ov00_021E9B9C +ov00_021E9B9C: ; 0x021E9B9C + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, [r4] + add r0, r0, #0x1000 + cmp r1, #0 + ldr r3, [r0, #0x14] + beq _021E9BC4 + ldr r0, _021E9BD8 ; =ov00_022167CC + mov r2, #0 + blx r3 +_021E9BC4: + mov r0, r4 + mov r1, #0 + mov r2, #0x10 + bl MI_CpuFill8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021E9BD8: .word ov00_022167CC + arm_func_end ov00_021E9B9C + + arm_func_start ov00_021E9BDC +ov00_021E9BDC: ; 0x021E9BDC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + add r0, r0, #0x1000 + ldr r7, [r0, #0x14] + mov r5, r2 + mov r6, r1 + cmp r5, #0 + ldr r2, [r0, #0x10] + movle r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r6, #0xc] + ldr r0, _021E9C7C ; =ov00_022167E0 + add r1, r1, r5 + blx r2 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6] + ldr r2, [r6, #0xc] + mov r1, r4 + bl MI_CpuCopy8 + ldr r1, [r6] + ldr r0, _021E9C80 ; =ov00_022167CC + mov r2, #0 + blx r7 + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldmia r6, {r0, r1} + sub r0, r4, r0 + add r0, r1, r0 + str r0, [r6, #4] + ldr r1, [r6, #0xc] + mov r0, #1 + add r1, r1, r5 + str r1, [r6, #0xc] + str r4, [r6] + ldr r1, [r6, #0xc] + add r1, r4, r1 + str r1, [r6, #8] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021E9C7C: .word ov00_022167E0 +_021E9C80: .word ov00_022167CC + arm_func_end ov00_021E9BDC + + arm_func_start ov00_021E9C84 +ov00_021E9C84: ; 0x021E9C84 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r0 + mov r0, r6 + mov r4, #0 + bl strlen + cmp r0, #0x100 + movhs r0, r4 + ldmhsia sp!, {r4, r5, r6, pc} + add r0, r5, #0x24 + mov r1, r6 + add r0, r0, #0x1000 + mov r2, #0x100 + bl strncpy + mov r0, r6 + bl strlen + add r1, r5, #0x24 + mov r6, r0 + add r0, r1, #0x1000 + bl strlen + cmp r6, r0 + movne r0, r4 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, #0x24 + ldr r1, _021E9DC8 ; =ov00_022167F0 + add r0, r0, #0x1000 + bl strstr + cmp r0, #0 + beq _021E9D20 + add r0, r5, #0x2b + add r1, r0, #0x1000 + add r0, r5, #0x1000 + str r1, [r0, #0x124] + mov r1, r4 + str r1, [r0, #0x130] + add r0, r5, #0x1100 + mov r1, #0x50 + strh r1, [r0, #0x34] + b _021E9D5C +_021E9D20: + add r0, r5, #0x24 + ldr r1, _021E9DCC ; =ov00_022167F8 + add r0, r0, #0x1000 + bl strstr + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, pc} + add r2, r0, #8 + add r0, r5, #0x1000 + mov r1, #1 + str r2, [r0, #0x124] + str r1, [r0, #0x130] + rsb r1, r1, #0x1bc + add r0, r5, #0x1100 + strh r1, [r0, #0x34] +_021E9D5C: + add r0, r5, #0x1000 + ldr r0, [r0, #0x124] + ldr r1, _021E9DD0 ; =ov00_02216804 + bl strstr + cmp r0, #0 + movne r1, #0 + strneb r1, [r0] + addne r4, r0, #1 + add r0, r5, #0x1000 + ldr r0, [r0, #0x124] + ldr r1, _021E9DD4 ; =ov00_02216808 + bl strstr + cmp r0, #0 + mov r1, #0 + addeq r0, r5, #0x1000 + strneb r1, [r0] + addne r1, r0, #1 + addne r0, r5, #0x1000 + str r1, [r0, #0x128] + cmp r4, #0 + beq _021E9DC0 + mov r0, r4 + bl atoi + add r1, r5, #0x1100 + strh r0, [r1, #0x34] +_021E9DC0: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021E9DC8: .word ov00_022167F0 +_021E9DCC: .word ov00_022167F8 +_021E9DD0: .word ov00_02216804 +_021E9DD4: .word ov00_02216808 + arm_func_end ov00_021E9C84 + + arm_func_start ov00_021E9DD8 +ov00_021E9DD8: ; 0x021E9DD8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r1 + add r0, r0, #0x1000 + ldmib r8, {r1, r4} + cmp r4, r1 + ldr r4, [r0, #0x10] + ldr r5, [r0, #0x14] + mov r7, r2 + mov r6, r3 + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + bl strlen + mov r1, r0 + ldr r0, _021E9F1C ; =ov00_0221680C + add r1, r1, #1 + blx r4 + ldr r2, [r8] + ldr r1, [r8, #8] + str r0, [r2, r1, lsl #3] + ldr r1, [r8, #8] + ldr r2, [r8] + ldr r0, [r2, r1, lsl #3] + cmp r0, #0 + beq _021E9EB4 + mov r0, r6 + bl strlen + mov r1, r0 + ldr r0, _021E9F20 ; =ov00_0221682C + add r1, r1, #1 + blx r4 + ldr r2, [r8] + ldr r1, [r8, #8] + add r1, r2, r1, lsl #3 + str r0, [r1, #4] + ldr r1, [r8, #8] + ldr r2, [r8] + add r0, r2, r1, lsl #3 + ldr r0, [r0, #4] + cmp r0, #0 + beq _021E9EB4 + ldr r0, [r2, r1, lsl #3] + mov r1, r7 + bl strcpy + ldr r2, [r8] + ldr r0, [r8, #8] + mov r1, r6 + add r0, r2, r0, lsl #3 + ldr r0, [r0, #4] + bl strcpy + ldr r1, [r8, #8] + mov r0, #1 + add r1, r1, #1 + str r1, [r8, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_021E9EB4: + ldr r1, [r2, r1, lsl #3] + cmp r1, #0 + beq _021E9EDC + ldr r0, _021E9F24 ; =ov00_0221684C + mov r2, #0 + blx r5 + ldr r1, [r8] + ldr r0, [r8, #8] + mov r2, #0 + str r2, [r1, r0, lsl #3] +_021E9EDC: + ldr r1, [r8] + ldr r0, [r8, #8] + add r0, r1, r0, lsl #3 + ldr r1, [r0, #4] + cmp r1, #0 + beq _021E9F14 + ldr r0, _021E9F28 ; =ov00_02216868 + mov r2, #0 + blx r5 + ldr r1, [r8] + ldr r0, [r8, #8] + mov r2, #0 + add r0, r1, r0, lsl #3 + str r2, [r0, #4] +_021E9F14: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021E9F1C: .word ov00_0221680C +_021E9F20: .word ov00_0221682C +_021E9F24: .word ov00_0221684C +_021E9F28: .word ov00_02216868 + arm_func_end ov00_021E9DD8 + + arm_func_start ov00_021E9F2C +ov00_021E9F2C: ; 0x021E9F2C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + mov r4, r0 + add r0, r4, #0x238 + mov r6, r1 + add r0, r0, #0x1800 + mov r3, #0x20 + mov r1, #0 + mov r2, #0x100 + str r0, [sp, #4] + str r3, [sp, #8] + str r1, [sp, #0xc] + bl MI_CpuFill8 + add r0, r4, #0x1000 + ldr r5, [r0, #0xa08] + ldr r1, _021EA1AC ; =ov00_022166C4 + mov r0, r5 + bl strstr + str r0, [sp] + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, r0, #4 + bl strlen + ldr r1, [sp] + add r1, r1, #4 + add fp, r1, r0 + ldr r1, _021EA1B0 ; =ov00_02216884 + mov r0, r5 + bl strstr + movs r7, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrsb sb, [r7, #4] + ldr r2, _021EA1B4 ; =ov00_02216888 + mov r5, #0 + add r1, sp, #4 + mov r0, r4 + add r3, r7, #1 + strb r5, [r7, #4] + bl ov00_021E9DD8 + cmp r0, #1 + addne sp, sp, #0x10 + strb sb, [r7, #4] + movne r0, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r6, #1 + beq _021EA00C + ldr r1, _021EA1B8 ; =ov00_02216894 + add r0, r7, #1 + mov r2, #3 + bl strncmp + cmp r0, #0 + beq _021EA018 +_021EA00C: + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021EA018: + ldr r1, _021EA1BC ; =ov00_022166F4 + add r0, r7, #5 + bl strstr + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, r5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add sb, r0, #2 + b _021EA0CC +_021EA03C: + ldr r1, _021EA1C0 ; =ov00_02216898 + mov r0, sb + bl strstr + movs r6, r0 + beq _021EA0E0 + ldrsb r7, [r6] + mov r1, #0 + add sl, r6, #2 + strb r1, [r6] + ldr r1, _021EA1BC ; =ov00_022166F4 + mov r0, sl + bl strstr + movs r5, r0 + streqb r7, [r6] + beq _021EA0E0 + ldrsb r8, [r5] + mov r1, #0 + mov r2, sb + strb r1, [r5] + mov r0, r4 + add r1, sp, #4 + mov r3, sl + bl ov00_021E9DD8 + cmp r0, #1 + beq _021EA0B4 + strb r7, [r6] + add sp, sp, #0x10 + strb r8, [r5] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021EA0B4: + mov r0, sl + bl strlen + strb r7, [r6] + add r0, sl, r0 + strb r8, [r5] + add sb, r0, #2 +_021EA0CC: + ldrsb r0, [sb] + cmp r0, #0xd + ldrnesb r0, [sb, #1] + cmpne r0, #0xa + bne _021EA03C +_021EA0E0: + ldr r0, [sp] + add r7, r0, #4 + cmp r7, fp + bhs _021EA1A0 +_021EA0F0: + ldr r1, _021EA1C4 ; =ov00_0221689C + mov r0, r7 + bl strstr + movs r5, r0 + beq _021EA1A0 + ldrsb sb, [r5] + mov r1, #0 + add r6, r5, #1 + strb r1, [r5] + ldr r1, _021EA1C8 ; =ov00_022168A0 + mov r0, r6 + bl strstr + movs sl, r0 + bne _021EA138 + ldr r1, _021EA1BC ; =ov00_022166F4 + mov r0, r6 + bl strstr + mov sl, r0 +_021EA138: + cmp sl, #0 + ldrnesb r8, [sl] + movne r0, #0 + mov r2, r7 + strneb r0, [sl] + mov r0, r4 + add r1, sp, #4 + mov r3, r6 + bl ov00_021E9DD8 + cmp r0, #1 + beq _021EA17C + strb sb, [r5] + cmp sl, #0 + add sp, sp, #0x10 + strneb r8, [sl] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021EA17C: + mov r0, r6 + bl strlen + add r0, r6, r0 + strb sb, [r5] + cmp sl, #0 + add r7, r0, #1 + strneb r8, [sl] + cmp r7, fp + blo _021EA0F0 +_021EA1A0: + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021EA1AC: .word ov00_022166C4 +_021EA1B0: .word ov00_02216884 +_021EA1B4: .word ov00_02216888 +_021EA1B8: .word ov00_02216894 +_021EA1BC: .word ov00_022166F4 +_021EA1C0: .word ov00_02216898 +_021EA1C4: .word ov00_0221689C +_021EA1C8: .word ov00_022168A0 + arm_func_end ov00_021E9F2C + + arm_func_start ov00_021EA1CC +ov00_021EA1CC: ; 0x021EA1CC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, #0 +_021EA1DC: + add r0, r6, r4, lsl #3 + add r0, r0, #0x1000 + ldr r1, [r0, #0xa38] + cmp r1, #0 + beq _021EA21C + mov r0, r5 + bl strcmp + cmp r0, #0 + bne _021EA210 + add r0, r6, r4, lsl #3 + add r0, r0, #0x1000 + ldr r0, [r0, #0xa3c] + ldmia sp!, {r4, r5, r6, pc} +_021EA210: + add r4, r4, #1 + cmp r4, #0x20 + blt _021EA1DC +_021EA21C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021EA1CC + + arm_func_start ov00_021EA224 +ov00_021EA224: ; 0x021EA224 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r2 + mov r5, r3 + bl ov00_021EA1CC + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl strlen + mov r1, r0 + mov r0, r4 + mov r2, r6 + mov r3, r5 + bl ov00_021EBF90 + mvn r1, #0 + cmp r0, r1 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r0, r5 + ldmhsia sp!, {r4, r5, r6, pc} + mov r1, #0 + strb r1, [r6, r0] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021EA224 + + arm_func_start ov00_021EA278 +ov00_021EA278: ; 0x021EA278 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r2 + mov r5, r3 + bl ov00_021EA1CC + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl strlen + cmp r0, r5 + movge r0, #0 + ldmgeia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r4 + bl strcpy + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021EA278 + + arm_func_start ov00_021EA2B8 +ov00_021EA2B8: ; 0x021EA2B8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add r0, r0, #0x1000 + ldr r6, [r0, #0x14] + mov sb, r2 + mov sl, r1 + mov r8, #0 + cmp sb, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr fp, _021EA338 ; =ov00_022168A4 + ldr r7, _021EA33C ; =ov00_022168C0 + mov r5, r8 + mov r4, r8 +_021EA2E8: + ldr r1, [sl, r8, lsl #3] + cmp r1, #0 + beq _021EA304 + mov r0, fp + mov r2, #0 + blx r6 + str r5, [sl, r8, lsl #3] +_021EA304: + add r0, sl, r8, lsl #3 + ldr r1, [r0, #4] + cmp r1, #0 + beq _021EA328 + mov r0, r7 + mov r2, #0 + blx r6 + add r0, sl, r8, lsl #3 + str r4, [r0, #4] +_021EA328: + add r8, r8, #1 + cmp r8, sb + blt _021EA2E8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021EA338: .word ov00_022168A4 +_021EA33C: .word ov00_022168C0 + arm_func_end ov00_021EA2B8 + + arm_func_start ov00_021EA340 +ov00_021EA340: ; 0x021EA340 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _021EA408 ; =ov00_0221A6B8 + mov r5, r0 + ldr r0, [r1] + ldr r4, [r5] + cmp r0, #0 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021EA40C ; =ov00_02216904 + ldr r1, _021EA410 ; =0x000011F4 + blx r4 + ldr r1, _021EA408 ; =ov00_0221A6B8 + cmp r0, #0 + str r0, [r1] + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, _021EA410 ; =0x000011F4 + mov r1, #0 + bl MI_CpuFill8 + ldr ip, _021EA408 ; =ov00_0221A6B8 + ldr r1, _021EA414 ; =0xFFFE7961 + ldr r0, [ip] + add r0, r0, #0x1000 + str r1, [r0, #4] + ldr r3, [ip] + ldmia r5, {r0, r1, r2} + add r3, r3, #0x108 + add r3, r3, #0x1000 + stmia r3, {r0, r1, r2} + ldr r0, [ip, #0x14] + cmp r0, #0 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021EA418 ; =ov00_02216918 + ldr r1, _021EA41C ; =0x00001C14 + blx r4 + ldr r1, _021EA408 ; =ov00_0221A6B8 + cmp r0, #0 + str r0, [r1, #0x14] + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + str r0, [r1, #4] + ldr r0, [r1] + add r0, r0, #0x1dc + add r0, r0, #0x1000 + bl OS_InitMutex + bl ov00_021EA5D8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EA408: .word ov00_0221A6B8 +_021EA40C: .word ov00_02216904 +_021EA410: .word 0x000011F4 +_021EA414: .word 0xFFFE7961 +_021EA418: .word ov00_02216918 +_021EA41C: .word 0x00001C14 + arm_func_end ov00_021EA340 + + arm_func_start ov00_021EA420 +ov00_021EA420: ; 0x021EA420 + stmdb sp!, {r4, lr} + ldr r0, _021EA504 ; =ov00_0221A6B8 + ldr r1, [r0] + ldr r0, [r0, #0x14] + add r1, r1, #0x1000 + cmp r0, #0 + ldr r4, [r1, #0x10c] + beq _021EA464 + bl ov00_021E9754 + ldr r1, _021EA504 ; =ov00_0221A6B8 + ldr r0, _021EA508 ; =ov00_02216928 + ldr r1, [r1, #0x14] + mov r2, #0 + blx r4 + ldr r0, _021EA504 ; =ov00_0221A6B8 + mov r1, #0 + str r1, [r0, #0x14] +_021EA464: + bl ov00_021E7DD4 + ldr r0, _021EA504 ; =ov00_0221A6B8 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r0, #0x1000 + ldr r1, [r0, #0x114] + cmp r1, #0 + beq _021EA4A8 + ldr r0, _021EA50C ; =ov00_02216938 + mov r2, #0 + blx r4 + ldr r0, _021EA504 ; =ov00_0221A6B8 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #0x114] +_021EA4A8: + ldr r0, _021EA504 ; =ov00_0221A6B8 + ldr r0, [r0] + add r0, r0, #0x1000 + ldr r1, [r0, #0x118] + cmp r1, #0 + beq _021EA4E0 + ldr r0, _021EA510 ; =ov00_02216954 + mov r2, #0 + blx r4 + ldr r0, _021EA504 ; =ov00_0221A6B8 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #0x118] +_021EA4E0: + ldr r1, _021EA504 ; =ov00_0221A6B8 + ldr r0, _021EA514 ; =ov00_02216974 + ldr r1, [r1] + mov r2, #0 + blx r4 + ldr r0, _021EA504 ; =ov00_0221A6B8 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EA504: .word ov00_0221A6B8 +_021EA508: .word ov00_02216928 +_021EA50C: .word ov00_02216938 +_021EA510: .word ov00_02216954 +_021EA514: .word ov00_02216974 + arm_func_end ov00_021EA420 + + arm_func_start ov00_021EA518 +ov00_021EA518: ; 0x021EA518 + stmdb sp!, {r3, lr} + ldr r0, _021EA57C ; =ov00_0221A6B8 + ldr r1, [r0] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x14] + cmp r0, #0 + beq _021EA53C + bl ov00_021E9210 +_021EA53C: + bl ov00_021E7D48 + ldr r0, _021EA57C ; =ov00_0221A6B8 + ldr r1, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0x188] + cmp r0, #0 + beq _021EA564 + add r0, r1, #0x11c + add r0, r0, #0x1000 + bl OS_JoinThread +_021EA564: + ldr r0, _021EA57C ; =ov00_0221A6B8 + mvn r1, #6 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EA57C: .word ov00_0221A6B8 + arm_func_end ov00_021EA518 + + arm_func_start ov00_021EA580 +ov00_021EA580: ; 0x021EA580 + stmdb sp!, {r4, lr} + ldr r0, _021EA5BC ; =ov00_0221A6B8 + ldr r0, [r0] + add r0, r0, #0x1dc + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r0, _021EA5BC ; =ov00_0221A6B8 + ldr r1, [r0] + add r0, r1, #0x1dc + add r1, r1, #0x1000 + add r0, r0, #0x1000 + ldr r4, [r1] + bl OS_UnlockMutex + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EA5BC: .word ov00_0221A6B8 + arm_func_end ov00_021EA580 + + arm_func_start ov00_021EA5C0 +ov00_021EA5C0: ; 0x021EA5C0 + ldr r0, _021EA5D4 ; =ov00_0221A6B8 + ldr r0, [r0] + add r0, r0, #0x1000 + ldr r0, [r0, #4] + bx lr + .balign 4, 0 +_021EA5D4: .word ov00_0221A6B8 + arm_func_end ov00_021EA5C0 + + arm_func_start ov00_021EA5D8 +ov00_021EA5D8: ; 0x021EA5D8 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _021EA658 ; =ov00_0221A6B8 + ldr r1, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0x188] + cmp r0, #0 + beq _021EA610 + add r0, r1, #0x11c + add r0, r0, #0x1000 + bl OS_IsThreadTerminated + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, pc} +_021EA610: + ldr r0, _021EA658 ; =ov00_0221A6B8 + mov r3, #0x1000 + ldr r2, [r0] + ldr r1, _021EA65C ; =ov00_021EA660 + add r0, r2, #0x11c + str r3, [sp] + mov ip, #0x10 + add r0, r0, #0x1000 + add r3, r2, #0x1000 + str ip, [sp, #4] + bl OS_CreateThread + ldr r0, _021EA658 ; =ov00_0221A6B8 + ldr r0, [r0] + add r0, r0, #0x11c + add r0, r0, #0x1000 + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EA658: .word ov00_0221A6B8 +_021EA65C: .word ov00_021EA660 + arm_func_end ov00_021EA5D8 + + arm_func_start ov00_021EA660 +ov00_021EA660: ; 0x021EA660 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x29c + ldr r5, _021EB4E4 ; =ov00_0221A6B8 + mov sb, #0 + ldr r0, [r5] + mov fp, sb + add r0, r0, #0x1000 + ldr r7, [r0, #0x108] + ldr r8, [r0, #0x10c] + mvn r0, #2 + str r0, [sp, #0x20] + sub r0, r0, #1 + str r0, [sp, #0x24] + ldr r0, [sp, #0x20] + mov sl, sb + sub r0, r0, #2 + str r0, [sp, #0x28] + ldr r0, _021EB4E8 ; =0x00009C40 + mov r4, sb + mov r0, r0, lsr #1 + str r0, [sp, #0x18] + ldr r0, [sp, #0x20] + add r0, r0, #1 + str r0, [sp, #0x1c] +_021EA6C0: + ldr r0, _021EB4EC ; =ov00_022168DC + ldr r1, _021EB4F0 ; =ov00_0221A6D0 + ldr r0, [r0] + str r0, [r5, #0x18] + mov r0, #1 + str r0, [r5, #0x1c] + mov r0, #0x1000 + str r0, [r5, #0x20] + str r7, [r5, #0x24] + ldr r0, [sp, #0x18] + str r8, [r5, #0x28] + str r0, [r5, #0x30] + ldr r0, [r5] + add r2, r0, #0x1000 + ldr r0, [sp, #0x1c] + str r0, [r2, #4] + ldr r0, [r5, #0x14] + bl ov00_021E8FA0 + cmp r0, #0 + beq _021EA728 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EA728: + ldr r0, [r5, #0x14] + bl ov00_021E90BC + cmp r0, #0 + beq _021EA750 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EA750: + ldr r0, _021EB4F4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + sub r1, r0, #1 + ldr r0, [r5, #0x14] + bl ov00_021E9154 + ldr r1, [r5, #0x14] + add r0, r1, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021EA788 + add r0, r1, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread +_021EA788: + ldr r0, [r5, #0x14] + add r1, r0, #0x1000 + ldr r1, [r1, #0x20] + cmp r1, #2 + beq _021EA7A8 + cmp r1, #8 + beq _021EA7D4 + b _021EA7BC +_021EA7A8: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mvn r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] +_021EA7BC: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #3 + bl ov00_021EB56C + b _021EB490 +_021EA7D4: + mov r1, #0 + bl ov00_021E9F2C + cmp r0, #1 + beq _021EA7FC + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EA7FC: + ldr r0, [r5, #0x14] + ldr r1, _021EB4F8 ; =ov00_022169F0 + bl ov00_021EA1CC + bl atoi + mov r6, r0 + ldr r0, _021EB4FC ; =_021E58C0 + ldr r0, [r0] + cmp r0, #0x22 + bne _021EA82C + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EA82C: + cmp r6, #0xc8 + beq _021EA844 + ldr r0, _021EB500 ; =0x0000012E + cmp r6, r0 + beq _021EA858 + b _021EAB40 +_021EA844: + ldr r0, [r5, #0x14] + add r0, r0, #0x1000 + ldr r0, [r0, #0x12c] + str r0, [r5, #8] + b _021EAB58 +_021EA858: + mov r0, #1 + str r0, [r5, #4] + ldr r0, [r5] + add r0, r0, #0x1000 + ldr r1, [r0, #0x118] + cmp r1, #0 + beq _021EAAA8 + ldr r1, _021EB4E4 ; =ov00_0221A6B8 + mvn r2, #5 + str r2, [r0, #4] + ldr r0, [r1, #0x14] + bl ov00_021E9754 + ldr r0, _021EB504 ; =ov00_02216420 + ldr r2, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0] + mov r1, #0 + str r0, [r2, #0x18] + str r1, [r2, #0x1c] + mov r1, #0x200 + str r1, [r2, #0x20] + str r7, [r2, #0x24] + ldr r3, _021EB508 ; =0x00004E20 + str r8, [r2, #0x28] + ldr r1, _021EB50C ; =ov00_022169FC + str r3, [r2, #0x30] + bl strcmp + cmp r0, #0 + ldrne r0, _021EB4E4 ; =ov00_0221A6B8 + movne r1, #1 + strne r1, [r0, #0x2c] + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r1, _021EB4F0 ; =ov00_0221A6D0 + ldr r0, [r0, #0x14] + bl ov00_021E8FA0 + cmp r0, #0 + beq _021EA900 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EA900: + add r0, sp, #0x44 + bl ov00_021E8984 + cmp r0, #0 + beq _021EA92C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + add r1, sp, #0x44 + ldr r0, [r0, #0x14] + mov r2, #1 + bl ov00_021E8C5C + cmp r0, #0 + bne _021EA944 +_021EA92C: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #8 + bl ov00_021EB56C + b _021EB490 +_021EA944: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r1, _021EB510 ; =ov00_02216A1C + ldr r0, [r0, #0x14] + ldr r2, _021EB514 ; =ov00_02216A24 + mov r3, #7 + bl ov00_021E99A4 + cmp r0, #0 + bne _021EA99C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0] + add r0, r0, #0x1000 + ldr r4, [r0, #0x118] + mov r0, r4 + bl strlen + ldr r1, _021EB4E4 ; =ov00_0221A6B8 + mov r3, r0 + ldr r0, [r1, #0x14] + ldr r1, _021EB518 ; =ov00_02216A2C + mov r2, r4 + bl ov00_021E99A4 + cmp r0, #0 + beq _021EA9B4 +_021EA99C: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #8 + bl ov00_021EB56C + b _021EB490 +_021EA9B4: + ldr r1, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, _021EB51C ; =ov00_02216954 + ldr r1, [r1] + mov r2, #0 + add r1, r1, #0x1000 + ldr r1, [r1, #0x118] + blx r8 + ldr r1, _021EB4E4 ; =ov00_0221A6B8 + mov r2, #0 + ldr r0, [r1] + add r0, r0, #0x1000 + str r2, [r0, #0x118] + ldr r0, [r1, #0x14] + bl ov00_021E90BC + cmp r0, #0 + beq _021EAA0C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EAA0C: + ldr r0, _021EB4F4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + ldr r2, _021EB4E4 ; =ov00_0221A6B8 + sub r1, r0, #1 + ldr r0, [r2, #0x14] + bl ov00_021E9154 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r1, [r0, #0x14] + add r0, r1, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021EAA4C + add r0, r1, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread +_021EAA4C: + ldr r2, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r2, #0x14] + add r1, r0, #0x1000 + ldr r1, [r1, #0x20] + cmp r1, #2 + beq _021EAA70 + cmp r1, #8 + beq _021EAA98 + b _021EAA80 +_021EAA70: + ldr r0, [r2] + mvn r1, #0 + add r0, r0, #0x1000 + str r1, [r0, #4] +_021EAA80: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #3 + bl ov00_021EB56C + b _021EB490 +_021EAA98: + bl ov00_021E9754 + mov r0, #7 + bl ov00_021EB56C + b _021EB490 +_021EAAA8: + ldr r0, [r5, #0x14] + add r1, r0, #0x1000 + ldr r1, [r1, #0xa08] + str r1, [sp, #0x14] + cmp r1, #0 + bne _021EAAD0 + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EAAD0: + mov r0, r1 + bl strlen + add r1, r0, #1 + ldr r0, _021EB520 ; =ov00_02216988 + blx r7 + ldr r1, [r5] + add r1, r1, #0x1000 + str r0, [r1, #0x114] + ldr r0, [r5] + add r0, r0, #0x1000 + ldr r0, [r0, #0x114] + str r0, [sp, #4] + cmp r0, #0 + bne _021EAB20 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #4 + bl ov00_021EB56C + b _021EB490 +_021EAB20: + ldr r0, [sp, #0x14] + bl strlen + mov r2, r0 + ldr r1, [sp, #0x14] + ldr r0, [sp, #4] + add r2, r2, #1 + bl strncpy + b _021EAB58 +_021EAB40: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #0xa + bl ov00_021EB56C + b _021EB490 +_021EAB58: + ldr r0, [r5, #0x14] + bl ov00_021E9754 + add r0, sp, #0x30 + bl DWCi_BM_GetWiFiInfo + ldr r2, [sp, #0x30] + ldr r1, [sp, #0x34] + mov r0, #0 + cmp r1, r0 + cmpeq r2, r4 + bne _021EAC88 + ldr r1, [r5] + ldr r0, _021EB524 ; =ov00_0221A6EC + add r2, r1, #0x1000 + ldr r1, [sp, #0x20] + str r1, [r2, #4] + mov r1, #0 + strh r1, [r5, #0x34] + strb r1, [r5, #0x68] + ldr r1, [r5] + add r1, r1, #0x1000 + ldr r2, [r1, #0x108] + str r2, [r5, #0x74] + ldr r1, [r1, #0x10c] + str r1, [r5, #0x78] + ldr r1, [r5, #0x14] + bl ov00_021E7B70 + cmp r0, #0 + beq _021EABD4 + mov r0, #5 + bl ov00_021EB56C + b _021EB490 +_021EABD4: + bl ov00_021E7E2C + bl ov00_021E7E5C + cmp r0, #0x15 + beq _021EAC84 + bl ov00_021E7E5C + cmp r0, #9 + bne _021EAC08 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mvn r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] + b _021EAC74 +_021EAC08: + add r0, sp, #0xd8 + bl ov00_021E7EA8 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0xc] + cmp r0, #1 + bne _021EAC60 + ldr r1, [sp, #0xd8] + ldr r0, _021EB528 ; =0xFFFFA4FA + cmp r1, r0 + beq _021EAC3C + bl ov00_021E7E5C + cmp r0, #0xb + bne _021EAC60 +_021EAC3C: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] + bl ov00_021E7DD4 + mov r0, #0xb + bl ov00_021EB56C + b _021EB490 +_021EAC60: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r1, [sp, #0xd8] + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] +_021EAC74: + bl ov00_021E7DD4 + mov r0, #6 + bl ov00_021EB56C + b _021EB490 +_021EAC84: + bl ov00_021E7DD4 +_021EAC88: + cmp r6, #0xc8 + bne _021EACB0 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mov r2, #0 + ldr r1, [r0] + mov r0, #0xb + add r1, r1, #0x1000 + str r2, [r1, #4] + bl ov00_021EB56C + b _021EB490 +_021EACB0: + ldr r0, [r5] + ldr r1, _021EB50C ; =ov00_022169FC + add r2, r0, #0x1000 + ldr r0, [sp, #0x24] + str r0, [r2, #4] + ldr r0, _021EB504 ; =ov00_02216420 + mov r2, #0 + ldr r0, [r0] + str r0, [r5, #0x18] + str r2, [r5, #0x1c] + mov r2, #0x1000 + str r2, [r5, #0x20] + str r7, [r5, #0x24] + ldr r2, _021EB4E8 ; =0x00009C40 + str r8, [r5, #0x28] + str r2, [r5, #0x30] + bl strcmp + cmp r0, #0 + movne r0, #1 + strne r0, [r5, #0x2c] + ldr r0, [r5, #0x14] + ldr r1, _021EB4F0 ; =ov00_0221A6D0 + bl ov00_021E8FA0 + cmp r0, #0 + beq _021EAD2C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EAD2C: + add r0, sp, #0x44 + bl ov00_021E8984 + cmp r0, #0 + beq _021EAD54 + ldr r0, [r5, #0x14] + add r1, sp, #0x44 + mov r2, #1 + bl ov00_021E8C5C + cmp r0, #0 + bne _021EAD6C +_021EAD54: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #8 + bl ov00_021EB56C + b _021EB490 +_021EAD6C: + ldr r0, [r5, #0x14] + ldr r1, _021EB510 ; =ov00_02216A1C + ldr r2, _021EB52C ; =ov00_02216A3C + mov r3, #5 + bl ov00_021E99A4 + cmp r0, #0 + bne _021EADB8 + ldr r0, [r5] + add r0, r0, #0x1000 + ldr r6, [r0, #0x114] + mov r0, r6 + bl strlen + mov r3, r0 + ldr r0, [r5, #0x14] + ldr r1, _021EB530 ; =ov00_02216A44 + mov r2, r6 + bl ov00_021E99A4 + cmp r0, #0 + beq _021EADD0 +_021EADB8: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #8 + bl ov00_021EB56C + b _021EB490 +_021EADD0: + ldr r1, [r5] + ldr r0, _021EB534 ; =ov00_02216938 + add r1, r1, #0x1000 + ldr r1, [r1, #0x114] + mov r2, #0 + blx r8 + ldr r0, [r5] + add r1, r0, #0x1000 + mov r0, #0 + str r0, [r1, #0x114] + ldr r0, [r5, #0x14] + bl ov00_021E90BC + cmp r0, #0 + beq _021EAE20 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EAE20: + ldr r0, _021EB4F4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + sub r1, r0, #1 + ldr r0, [r5, #0x14] + bl ov00_021E9154 + ldr r1, [r5, #0x14] + add r0, r1, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021EAE58 + add r0, r1, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread +_021EAE58: + ldr r0, [r5, #0x14] + add r1, r0, #0x1000 + ldr r1, [r1, #0x20] + cmp r1, #2 + beq _021EAEBC + cmp r1, #3 + beq _021EAE80 + cmp r1, #8 + beq _021EAEE8 + b _021EAED0 +_021EAE80: + bl ov00_021E9754 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r1, [r0, #0xc] + cmp r1, #1 + bne _021EAEB0 + ldr r0, [r0] + mov r2, #0 + add r1, r0, #0x1000 + mov r0, #0xb + str r2, [r1, #4] + bl ov00_021EB56C + b _021EB490 +_021EAEB0: + mov r0, #3 + bl ov00_021EB56C + b _021EB490 +_021EAEBC: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mvn r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] +_021EAED0: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #3 + bl ov00_021EB56C + b _021EB490 +_021EAEE8: + mov r1, #0 + bl ov00_021E9F2C + cmp r0, #1 + beq _021EAF10 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EAF10: + ldr r0, [r5, #0x14] + ldr r1, _021EB4F8 ; =ov00_022169F0 + bl ov00_021EA1CC + bl atoi + mov r6, r0 + ldr r0, _021EB4FC ; =_021E58C0 + ldr r0, [r0] + cmp r0, #0x22 + bne _021EAF4C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EAF4C: + cmp r6, #0xc8 + beq _021EAFA0 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + ldr r1, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r1, #0xc] + cmp r0, #1 + ldreq r0, _021EB500 ; =0x0000012E + cmpeq r6, r0 + bne _021EAF94 + ldr r0, [r1] + mov r2, #0 + add r1, r0, #0x1000 + mov r0, #0xb + str r2, [r1, #4] + bl ov00_021EB56C + b _021EB490 +_021EAF94: + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EAFA0: + ldr r0, [r5, #0x14] + ldr r1, _021EB538 ; =ov00_02216A4C + add r2, sp, #0x2c + mov r3, #4 + bl ov00_021EA224 + cmp r0, #0 + bgt _021EAFD4 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EAFD4: + add r0, sp, #0x2c + bl atoi + ldr r1, _021EB4FC ; =_021E58C0 + ldr r1, [r1] + cmp r1, #0x22 + bne _021EB004 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB004: + ldr r1, [r5, #0xc] + cmp r1, #1 + cmpeq r0, #0x72 + bne _021EB034 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mov r2, #0 + ldr r1, [r0] + mov r0, #0xb + add r1, r1, #0x1000 + str r2, [r1, #4] + bl ov00_021EB56C + b _021EB490 +_021EB034: + cmp r0, #0x64 + blt _021EB054 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #6 + bl ov00_021EB56C + b _021EB490 +_021EB054: + mov r2, #0 + ldr r0, [r5, #0x14] + ldr r1, _021EB53C ; =ov00_02216A58 + mov r3, r2 + bl ov00_021EA224 + str r0, [sp, #0x10] + cmp r0, #0 + bgt _021EB08C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB08C: + mov r2, #0 + ldr r0, [r5, #0x14] + ldr r1, _021EB540 ; =ov00_02216A5C + mov r3, r2 + bl ov00_021EA224 + str r0, [sp, #0xc] + cmp r0, #0 + bgt _021EB0C4 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB0C4: + mov r2, #0 + ldr r0, [r5, #0x14] + ldr r1, _021EB544 ; =ov00_02216A64 + mov r3, r2 + bl ov00_021EA224 + ldr r1, [sp, #0x10] + mov r6, r0 + ldr r0, _021EB548 ; =ov00_022169A4 + add r1, r1, #1 + blx r7 + movs sb, r0 + bne _021EB10C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #4 + bl ov00_021EB56C + b _021EB490 +_021EB10C: + ldr r1, [sp, #0xc] + ldr r0, _021EB54C ; =ov00_022169B0 + add r1, r1, #1 + blx r7 + movs fp, r0 + bne _021EB13C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #4 + bl ov00_021EB56C + b _021EB490 +_021EB13C: + cmp r6, #0 + ble _021EB170 + ldr r0, _021EB550 ; =ov00_022169C0 + add r1, r6, #1 + blx r7 + movs sl, r0 + bne _021EB170 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #4 + bl ov00_021EB56C + b _021EB490 +_021EB170: + ldr r0, [sp, #0x10] + ldr r1, _021EB53C ; =ov00_02216A58 + add r3, r0, #1 + ldr r0, [r5, #0x14] + mov r2, sb + bl ov00_021EA224 + cmp r0, #0 + bge _021EB1A8 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB1A8: + ldr r1, [sp, #0xc] + mov r2, fp + add r3, r1, #1 + mov r1, #0 + strb r1, [sb, r0] + ldr r0, [r5, #0x14] + ldr r1, _021EB540 ; =ov00_02216A5C + bl ov00_021EA224 + cmp r0, #0 + bge _021EB1E8 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB1E8: + mov r1, #0 + strb r1, [fp, r0] + mov r0, r1 + cmp r6, #0 + str r0, [sp, #8] + ble _021EB284 + ldr r0, [r5, #0x14] + ldr r1, _021EB544 ; =ov00_02216A64 + add r3, r6, #1 + mov r2, sl + bl ov00_021EA224 + cmp r0, #0 + bge _021EB234 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB234: + mov r1, #0 + strb r1, [sl, r0] + mov r0, sl + bl atoi + ldr r1, _021EB4FC ; =_021E58C0 + ldr r1, [r1] + cmp r1, #0x22 + bne _021EB26C + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #9 + bl ov00_021EB56C + b _021EB490 +_021EB26C: + mov r1, #0x3e8 + mul r1, r0, r1 + ldr r0, _021EB554 ; =0x0002BF20 + str r1, [sp, #8] + cmp r1, r0 + strgt r0, [sp, #8] +_021EB284: + ldr r0, [r5, #0x14] + bl ov00_021E9754 + ldr r0, [r5] + ldr r1, _021EB4F0 ; =ov00_0221A6D0 + add r2, r0, #0x1000 + ldr r0, [sp, #0x28] + str r0, [r2, #4] + str sb, [r5, #0x18] + mov r0, #0 + str r0, [r5, #0x1c] + mov r0, #0x1000 + str r0, [r5, #0x20] + str r7, [r5, #0x24] + ldr r0, _021EB558 ; =0x0001D4C0 + str r8, [r5, #0x28] + str r0, [r5, #0x30] + ldr r0, [r5, #0x14] + bl ov00_021E8FA0 + cmp r0, #0 + beq _021EB2EC + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EB2EC: + ldr r0, [r5, #0x14] + mov r1, fp + bl ov00_021E9AB0 + cmp r0, #0 + beq _021EB318 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #8 + bl ov00_021EB56C + b _021EB490 +_021EB318: + ldr r0, [r5, #0x14] + bl ov00_021E90BC + cmp r0, #0 + beq _021EB340 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #1 + bl ov00_021EB56C + b _021EB490 +_021EB340: + ldr r0, _021EB4F4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + sub r1, r0, #1 + ldr r0, [r5, #0x14] + bl ov00_021E9154 + ldr r1, [r5, #0x14] + add r0, r1, #0x1000 + ldr r0, [r0, #0xba4] + cmp r0, #0 + beq _021EB378 + add r0, r1, #0x338 + add r0, r0, #0x1800 + bl OS_JoinThread +_021EB378: + ldr r0, [r5, #0x14] + add r1, r0, #0x1000 + ldr r1, [r1, #0x20] + cmp r1, #2 + beq _021EB398 + cmp r1, #8 + beq _021EB3C4 + b _021EB3AC +_021EB398: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + mvn r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + str r1, [r0, #4] +_021EB3AC: + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #3 + bl ov00_021EB56C + b _021EB490 +_021EB3C4: + mov r1, #1 + bl ov00_021E9F2C + cmp r0, #1 + beq _021EB3EC + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EB3EC: + ldr r0, [r5, #0x14] + add r1, r0, #0x1000 + ldr r6, [r1, #0xa08] + cmp r6, #0 + bne _021EB410 + bl ov00_021E9754 + mov r0, #2 + bl ov00_021EB56C + b _021EB490 +_021EB410: + mov r0, r6 + bl strlen + add r1, r0, #1 + ldr r0, _021EB55C ; =ov00_022169D0 + blx r7 + ldr r1, [r5] + add r1, r1, #0x1000 + str r0, [r1, #0x118] + ldr r0, [r5] + add r0, r0, #0x1000 + ldr r0, [r0, #0x118] + str r0, [sp] + cmp r0, #0 + bne _021EB460 + ldr r0, _021EB4E4 ; =ov00_0221A6B8 + ldr r0, [r0, #0x14] + bl ov00_021E9754 + mov r0, #4 + bl ov00_021EB56C + b _021EB490 +_021EB460: + mov r0, r6 + bl strlen + mov r2, r0 + ldr r0, [sp] + mov r1, r6 + add r2, r2, #1 + bl strncpy + ldr r0, [r5, #0x14] + bl ov00_021E9754 + ldr r0, [sp, #8] + bl OS_Sleep + b _021EA6C0 +_021EB490: + cmp sb, #0 + beq _021EB4A8 + ldr r0, _021EB560 ; =ov00_02216A6C + mov r1, sb + mov r2, #0 + blx r8 +_021EB4A8: + cmp fp, #0 + beq _021EB4C0 + ldr r0, _021EB564 ; =ov00_02216A78 + mov r1, fp + mov r2, #0 + blx r8 +_021EB4C0: + cmp sl, #0 + addeq sp, sp, #0x29c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _021EB568 ; =ov00_02216A84 + mov r1, sl + mov r2, #0 + blx r8 + add sp, sp, #0x29c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021EB4E4: .word ov00_0221A6B8 +_021EB4E8: .word 0x00009C40 +_021EB4EC: .word ov00_022168DC +_021EB4F0: .word ov00_0221A6D0 +_021EB4F4: .word OSi_ThreadInfo +_021EB4F8: .word ov00_022169F0 +_021EB4FC: .word _021E58C0 +_021EB500: .word 0x0000012E +_021EB504: .word ov00_02216420 +_021EB508: .word 0x00004E20 +_021EB50C: .word ov00_022169FC +_021EB510: .word ov00_02216A1C +_021EB514: .word ov00_02216A24 +_021EB518: .word ov00_02216A2C +_021EB51C: .word ov00_02216954 +_021EB520: .word ov00_02216988 +_021EB524: .word ov00_0221A6EC +_021EB528: .word 0xFFFFA4FA +_021EB52C: .word ov00_02216A3C +_021EB530: .word ov00_02216A44 +_021EB534: .word ov00_02216938 +_021EB538: .word ov00_02216A4C +_021EB53C: .word ov00_02216A58 +_021EB540: .word ov00_02216A5C +_021EB544: .word ov00_02216A64 +_021EB548: .word ov00_022169A4 +_021EB54C: .word ov00_022169B0 +_021EB550: .word ov00_022169C0 +_021EB554: .word 0x0002BF20 +_021EB558: .word 0x0001D4C0 +_021EB55C: .word ov00_022169D0 +_021EB560: .word ov00_02216A6C +_021EB564: .word ov00_02216A78 +_021EB568: .word ov00_02216A84 + arm_func_end ov00_021EA660 + + arm_func_start ov00_021EB56C +ov00_021EB56C: ; 0x021EB56C + stmdb sp!, {r4, lr} + ldr r1, _021EB5AC ; =ov00_0221A6B8 + mov r4, r0 + ldr r0, [r1] + add r0, r0, #0x1dc + add r0, r0, #0x1000 + bl OS_LockMutex + ldr r1, _021EB5AC ; =ov00_0221A6B8 + ldr r0, [r1] + add r0, r0, #0x1000 + str r4, [r0] + ldr r0, [r1] + add r0, r0, #0x1dc + add r0, r0, #0x1000 + bl OS_UnlockMutex + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EB5AC: .word ov00_0221A6B8 + arm_func_end ov00_021EB56C + + arm_func_start ov00_021EB5B0 +ov00_021EB5B0: ; 0x021EB5B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x3c + mov r6, r0 + bl strlen + mov r4, r0 + ldr r0, _021EB7BC ; =ov00_02216AF0 + bl strlen + cmp r4, r0 + ldreqsb r0, [r6, #7] + cmpeq r0, #0x20 + ldreqsb r0, [r6, #0xb] + cmpeq r0, #0x20 + ldreqsb r0, [r6, #0x10] + cmpeq r0, #0x20 + ldreqsb r0, [r6, #0x13] + cmpeq r0, #0x3a + ldreqsb r0, [r6, #0x16] + cmpeq r0, #0x3a + ldreqsb r0, [r6, #0x19] + cmpeq r0, #0x20 + bne _021EB7B0 + add r0, sp, #0x2c + add r1, sp, #0x20 + bl RTC_GetDateTime + cmp r0, #0 + bne _021EB7B0 + add r0, sp, #0x2c + add r1, sp, #0x20 + bl RTC_ConvertDateTimeToSecond + mov r4, r0 + mov r5, r1 + mvn r0, #0 + cmp r5, r0 + cmpeq r4, r0 + beq _021EB7B0 + add r0, sp, #0 + mov r1, r6 + bl strcpy + mov r2, #0 + ldr r1, _021EB7C0 ; =_021E58C0 + add r0, sp, #0xc + strb r2, [sp, #7] + strb r2, [sp, #0xb] + strb r2, [sp, #0x10] + strb r2, [sp, #0x13] + strb r2, [sp, #0x16] + strb r2, [sp, #0x19] + str r2, [r1] + bl atoi + ldr r1, _021EB7C0 ; =_021E58C0 + str r0, [sp, #0x2c] + ldr r1, [r1] + cmp r1, #0x22 + beq _021EB7B0 + sub r1, r0, #0x7d0 + mov r0, #0xd + ldr r7, _021EB7C4 ; =ov00_02216AC0 + str r1, [sp, #0x2c] + str r0, [sp, #0x30] + mov r8, #0 + add r6, sp, #8 +_021EB6A4: + ldr r0, [r7, r8, lsl #2] + mov r1, r6 + bl strcmp + cmp r0, #0 + addeq r0, r8, #1 + streq r0, [sp, #0x30] + beq _021EB6CC + add r8, r8, #1 + cmp r8, #0xc + blt _021EB6A4 +_021EB6CC: + ldr r0, [sp, #0x30] + cmp r0, #0xc + bhi _021EB7B0 + ldr r1, _021EB7C0 ; =_021E58C0 + mov r2, #0 + add r0, sp, #5 + str r2, [r1] + bl atoi + ldr r1, _021EB7C0 ; =_021E58C0 + str r0, [sp, #0x34] + ldr r0, [r1] + cmp r0, #0x22 + beq _021EB7B0 + mov r2, #0 + add r0, sp, #0x11 + str r2, [r1] + bl atoi + ldr r1, _021EB7C0 ; =_021E58C0 + str r0, [sp, #0x20] + ldr r0, [r1] + cmp r0, #0x22 + beq _021EB7B0 + mov r2, #0 + add r0, sp, #0x14 + str r2, [r1] + bl atoi + ldr r1, _021EB7C0 ; =_021E58C0 + str r0, [sp, #0x24] + ldr r0, [r1] + cmp r0, #0x22 + beq _021EB7B0 + mov r2, #0 + add r0, sp, #0x17 + str r2, [r1] + bl atoi + ldr r1, _021EB7C0 ; =_021E58C0 + str r0, [sp, #0x28] + ldr r0, [r1] + cmp r0, #0x22 + beq _021EB7B0 + add r0, sp, #0x2c + add r1, sp, #0x20 + bl RTC_ConvertDateTimeToSecond + mvn r2, #0 + cmp r1, r2 + cmpeq r0, r2 + beq _021EB7B0 + ldr r2, _021EB7C8 ; =ov00_0221A734 + subs r0, r4, r0 + str r0, [r2, #0xc] + sbc r0, r5, r1 + str r0, [r2, #0x10] + stmib r2, {r4, r5} + mov r0, #1 + str r0, [r2] + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_021EB7B0: + mov r0, #0 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021EB7BC: .word ov00_02216AF0 +_021EB7C0: .word _021E58C0 +_021EB7C4: .word ov00_02216AC0 +_021EB7C8: .word ov00_0221A734 + arm_func_end ov00_021EB5B0 + + arm_func_start ov00_021EB7CC +ov00_021EB7CC: ; 0x021EB7CC + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021EB854 ; =ov00_0221A748 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + cmp r0, #0 + beq _021EB7FC + ldr r1, _021EB858 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EB7FC: + ldr r0, _021EB85C ; =ov00_02216B10 + ldr r1, _021EB860 ; =0x00001C20 + blx r5 + ldr r1, _021EB854 ; =ov00_0221A748 + cmp r0, #0 + str r0, [r1] + bne _021EB82C + ldr r1, _021EB858 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EB82C: + ldr r2, _021EB860 ; =0x00001C20 + mov r1, #0 + bl MI_CpuFill8 + ldr r1, _021EB854 ; =ov00_0221A748 + mov r0, #1 + ldr r2, [r1] + str r5, [r2] + ldr r1, [r1] + str r4, [r1, #4] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EB854: .word ov00_0221A748 +_021EB858: .word 0xFFFFA1DC +_021EB85C: .word ov00_02216B10 +_021EB860: .word 0x00001C20 + arm_func_end ov00_021EB7CC + + arm_func_start ov00_021EB864 +ov00_021EB864: ; 0x021EB864 + stmdb sp!, {r3, lr} + ldr r0, _021EB8A8 ; =ov00_0221A748 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r0, #8 + bl ov00_021E9754 + ldr r1, _021EB8A8 ; =ov00_0221A748 + ldr r0, _021EB8AC ; =ov00_02216B20 + ldr r1, [r1] + mov r2, #0 + ldr r3, [r1, #4] + blx r3 + ldr r0, _021EB8A8 ; =ov00_0221A748 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EB8A8: .word ov00_0221A748 +_021EB8AC: .word ov00_02216B20 + arm_func_end ov00_021EB864 + + arm_func_start ov00_021EB8B0 +ov00_021EB8B0: ; 0x021EB8B0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0xb0 + ldr r2, _021EBAF4 ; =ov00_0221A748 + mov r5, r0 + ldr r2, [r2] + mov r0, r1 + add r2, r2, #0x1000 + str r1, [r2, #0xc1c] + mov r1, #0 + mov r2, #0x174 + bl MI_CpuFill8 + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r1, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0xbac] + cmp r0, #0 + beq _021EB908 + add r0, r1, #0x1b40 + bl OS_IsThreadTerminated + cmp r0, #0 + bne _021EB908 + bl OS_Terminate +_021EB908: + ldr r0, _021EBAF8 ; =ov00_02216420 + ldr r1, _021EBAF4 ; =ov00_0221A748 + ldr r0, [r0] + mov r3, #0 + ldr r4, [r1] + mov r2, #0x1000 + str r0, [sp] + str r3, [sp, #4] + str r2, [sp, #8] + ldr r2, [r4] + ldr r1, _021EBAFC ; =ov00_02216B30 + str r2, [sp, #0xc] + ldr r2, [r4, #4] + str r2, [sp, #0x10] + bl strcmp + cmp r0, #0 + movne r0, #1 + strne r0, [sp, #0x14] + moveq r0, #0 + ldr r2, _021EBB00 ; =0x00004E20 + streq r0, [sp, #0x14] + add r1, sp, #0 + add r0, r4, #8 + str r2, [sp, #0x18] + bl ov00_021E8FA0 + cmp r0, #0 + beq _021EB98C + ldr r1, _021EBB04 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xb0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EB98C: + add r0, sp, #0x1c + bl ov00_021E8984 + cmp r0, #0 + beq _021EB9BC + ldr r0, _021EBAF4 ; =ov00_0221A748 + add r1, sp, #0x1c + ldr r0, [r0] + mov r2, #0 + add r0, r0, #8 + bl ov00_021E8C5C + cmp r0, #0 + bne _021EB9E4 +_021EB9BC: + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E9754 + ldr r1, _021EBB04 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xb0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EB9E4: + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r1, _021EBB08 ; =ov00_02216B50 + ldr r0, [r0] + ldr r2, _021EBB0C ; =ov00_02216B58 + add r0, r0, #8 + mov r3, #6 + bl ov00_021E99A4 + cmp r0, #0 + bne _021EBA2C + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r1, _021EBB10 ; =ov00_02216B60 + ldr r0, [r0] + mov r2, r5 + add r0, r0, #8 + mov r3, #4 + bl ov00_021E99A4 + cmp r0, #0 + beq _021EBA54 +_021EBA2C: + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E9754 + ldr r1, _021EBB04 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xb0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EBA54: + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E90BC + cmp r0, #0 + beq _021EBA94 + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E9754 + ldr r1, _021EBB04 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xb0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EBA94: + ldr r0, _021EBB14 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_GetThreadPriority + ldr r1, _021EBAF4 ; =ov00_0221A748 + ldr r2, [r1] + sub r1, r0, #1 + add r0, r2, #8 + bl ov00_021E9154 + ldr r0, _021EBAF4 ; =ov00_0221A748 + ldr r1, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0xbac] + cmp r0, #0 + addne sp, sp, #0xb0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + add r0, r1, #8 + bl ov00_021E9754 + ldr r1, _021EBB04 ; =0xFFFFA1DC + mov r0, #9 + bl ov00_021EC24C + mov r0, #0 + add sp, sp, #0xb0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EBAF4: .word ov00_0221A748 +_021EBAF8: .word ov00_02216420 +_021EBAFC: .word ov00_02216B30 +_021EBB00: .word 0x00004E20 +_021EBB04: .word 0xFFFFA1DC +_021EBB08: .word ov00_02216B50 +_021EBB0C: .word ov00_02216B58 +_021EBB10: .word ov00_02216B60 +_021EBB14: .word OSi_ThreadInfo + arm_func_end ov00_021EB8B0 + + arm_func_start ov00_021EBB18 +ov00_021EBB18: ; 0x021EBB18 + stmdb sp!, {r3, lr} + ldr r0, _021EBBE4 ; =ov00_0221A748 + ldr r1, [r0] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x1000 + ldr r0, [r0, #0xbac] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x1b40 + bl OS_IsThreadTerminated + cmp r0, #1 + bne _021EBBDC + ldr r0, _021EBBE4 ; =ov00_0221A748 + ldr r1, [r0] + add r0, r1, #0x1000 + ldr r0, [r0, #0x28] + cmp r0, #7 + beq _021EBBB0 + cmp r0, #8 + bne _021EBBC0 + bl ov00_021EBBEC + cmp r0, #0 + bne _021EBB98 + ldr r0, _021EBBE4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E9754 + mov r0, #4 + ldmia sp!, {r3, pc} +_021EBB98: + ldr r0, _021EBBE4 ; =ov00_0221A748 + ldr r0, [r0] + add r0, r0, #8 + bl ov00_021E9754 + mov r0, #3 + ldmia sp!, {r3, pc} +_021EBBB0: + add r0, r1, #8 + bl ov00_021E9754 + mov r0, #5 + ldmia sp!, {r3, pc} +_021EBBC0: + add r0, r1, #8 + bl ov00_021E9754 + ldr r1, _021EBBE8 ; =0xFFFFA1DB + mov r0, #0x11 + bl ov00_021EC24C + mov r0, #4 + ldmia sp!, {r3, pc} +_021EBBDC: + mov r0, #2 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EBBE4: .word ov00_0221A748 +_021EBBE8: .word 0xFFFFA1DB + arm_func_end ov00_021EBB18 + + arm_func_start ov00_021EBBEC +ov00_021EBBEC: ; 0x021EBBEC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _021EBDDC ; =ov00_0221A748 + mov r1, #0 + ldr r4, [r0] + add r0, r4, #8 + bl ov00_021E9F2C + cmp r0, #0 + bne _021EBC28 + ldr r1, _021EBDE0 ; =0xFFFF9DF3 + mov r0, #0x10 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBC28: + ldr r1, _021EBDE4 ; =ov00_02216B64 + add r0, r4, #8 + bl ov00_021EA1CC + cmp r0, #0 + beq _021EBC40 + bl ov00_021EB5B0 +_021EBC40: + ldr r1, _021EBDE8 ; =ov00_02216B6C + add r0, r4, #8 + bl ov00_021EA1CC + cmp r0, #0 + bne _021EBC6C + ldr r1, _021EBDE0 ; =0xFFFF9DF3 + mov r0, #0x10 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBC6C: + bl atoi + ldr r1, _021EBDEC ; =_021E58C0 + mov r2, r0 + ldr r0, [r1] + cmp r0, #0x22 + bne _021EBC9C + ldr r1, _021EBDE0 ; =0xFFFF9DF3 + mov r0, #0x10 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBC9C: + cmp r2, #0xc8 + beq _021EBCC0 + ldr r1, _021EBDF0 ; =0xFFFF9E58 + mov r0, #0x10 + sub r1, r1, r2 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBCC0: + ldr r1, _021EBDF4 ; =ov00_02216B78 + add r2, sp, #0 + add r0, r4, #8 + mov r3, #4 + bl ov00_021EA224 + cmp r0, #0 + bgt _021EBCF4 + ldr r1, _021EBDE0 ; =0xFFFF9DF3 + mov r0, #0x10 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBCF4: + add r0, sp, #0 + bl atoi + ldr r1, _021EBDEC ; =_021E58C0 + mov r2, r0 + ldr r0, [r1] + cmp r0, #0x22 + bne _021EBD28 + ldr r1, _021EBDE0 ; =0xFFFF9DF3 + mov r0, #0x10 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBD28: + cmp r2, #0x64 + blt _021EBD4C + ldr r1, _021EBDF8 ; =0xFFFFA240 + mov r0, #0x10 + sub r1, r1, r2 + bl ov00_021EC24C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021EBD4C: + ldr r0, _021EBDDC ; =ov00_0221A748 + ldr r1, _021EBDFC ; =ov00_02216B84 + ldr r2, [r0] + add r0, r4, #8 + add r2, r2, #0x1000 + ldr r2, [r2, #0xc1c] + mov r3, #0x40 + add r2, r2, #4 + bl ov00_021EA224 + ldr r0, _021EBDDC ; =ov00_0221A748 + ldr r1, _021EBE00 ; =ov00_02216B8C + ldr r2, [r0] + add r0, r4, #8 + add r2, r2, #0x1000 + ldr r2, [r2, #0xc1c] + mov r3, #0x12c + add r2, r2, #0x45 + bl ov00_021EA224 + ldr r1, _021EBE04 ; =ov00_02216B9C + add r2, sp, #0 + add r0, r4, #8 + mov r3, #1 + bl ov00_021EA224 + ldrsb r0, [sp] + cmp r0, #0x59 + ldreq r0, _021EBDDC ; =ov00_0221A748 + moveq r1, #1 + ldrne r0, _021EBDDC ; =ov00_0221A748 + movne r1, #0 + ldr r0, [r0] + add r0, r0, #0x1000 + ldr r0, [r0, #0xc1c] + str r1, [r0] + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_021EBDDC: .word ov00_0221A748 +_021EBDE0: .word 0xFFFF9DF3 +_021EBDE4: .word ov00_02216B64 +_021EBDE8: .word ov00_02216B6C +_021EBDEC: .word _021E58C0 +_021EBDF0: .word 0xFFFF9E58 +_021EBDF4: .word ov00_02216B78 +_021EBDF8: .word 0xFFFFA240 +_021EBDFC: .word ov00_02216B84 +_021EBE00: .word ov00_02216B8C +_021EBE04: .word ov00_02216B9C + arm_func_end ov00_021EBBEC + + arm_func_start ov00_021EBE08 +ov00_021EBE08: ; 0x021EBE08 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r4, _021EBF88 ; =0xAAAAAAAB + str r2, [sp] + umull r4, r5, r1, r4 + mov r6, #3 + mov r5, r5, lsr #1 + umull r4, r5, r6, r5 + mov sl, r0 + subs r5, r1, r4 + movne r5, #4 + ldr r2, _021EBF88 ; =0xAAAAAAAB + ldr r0, [sp] + moveq r5, #0 + cmp r0, #0 + umull r0, r4, r1, r2 + mov r4, r4, lsr #1 + addeq sp, sp, #8 + add r0, r5, r4, lsl #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r3, r0 + addlo sp, sp, #8 + mvnlo r0, #0 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r7, sl, r1 + ldr r8, [sp] + cmp sl, r7 + beq _021EBF78 + sub fp, r2, #-0x80000000 + ldr r5, _021EBF8C ; =ov00_02216BA8 + mov r4, fp +_021EBE84: + sub sb, r7, sl + mov r0, sb, lsl #3 + smull r1, r2, r4, r0 + add r2, r2, r0, lsr #31 + mov r1, #6 + smull r2, r3, r1, r2 + subs r2, r0, r2 + smull r1, r2, fp, r0 + movne r3, #1 + moveq r3, #0 + add r2, r2, r0, lsr #31 + cmp sb, #3 + add r6, r2, r3 + movge sb, #3 + add r0, sp, #4 + mov r1, #0 + mov r2, #3 + bl MI_CpuFill8 + mov r0, sl + add r1, sp, #4 + mov r2, sb + bl MI_CpuCopy8 + ldrb r0, [sp, #4] + ldr r1, [r5] + cmp r6, #2 + mov r0, r0, asr #2 + ldrsb r0, [r1, r0] + strb r0, [r8] + movlt r0, #0x2a + blt _021EBF18 + ldrb r2, [sp, #4] + ldrb r1, [sp, #5] + ldr r0, [r5] + mov r2, r2, lsl #4 + and r2, r2, #0x3f + orr r1, r2, r1, asr #4 + ldrsb r0, [r0, r1] +_021EBF18: + strb r0, [r8, #1] + cmp r6, #3 + movlt r0, #0x2a + blt _021EBF44 + ldrb r2, [sp, #5] + ldrb r1, [sp, #6] + ldr r0, [r5] + mov r2, r2, lsl #2 + and r2, r2, #0x3f + orr r1, r2, r1, asr #6 + ldrsb r0, [r0, r1] +_021EBF44: + strb r0, [r8, #2] + cmp r6, #4 + movlt r0, #0x2a + blt _021EBF64 + ldrb r0, [sp, #6] + ldr r1, [r5] + and r0, r0, #0x3f + ldrsb r0, [r1, r0] +_021EBF64: + add sl, sl, sb + strb r0, [r8, #3] + cmp sl, r7 + add r8, r8, #4 + bne _021EBE84 +_021EBF78: + ldr r0, [sp] + sub r0, r8, r0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021EBF88: .word 0xAAAAAAAB +_021EBF8C: .word ov00_02216BA8 + arm_func_end ov00_021EBE08 + + arm_func_start ov00_021EBF90 +ov00_021EBF90: ; 0x021EBF90 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + tst r1, #3 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r5, #0 + mov ip, r5 + cmp r1, #0 + bls _021EBFC8 +_021EBFB0: + ldrsb r4, [r0, ip] + add ip, ip, #1 + cmp r4, #0x2a + addne r5, r5, #6 + cmp ip, r1 + blo _021EBFB0 +_021EBFC8: + mov ip, r5, asr #2 + add ip, r5, ip, lsr #29 + mov ip, ip, asr #3 + cmp r2, #0 + moveq r0, ip + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r3, ip + mvnlo r0, #0 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0 + moveq r0, #0 + streqb r0, [r2] + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r2 +_021EC000: + mov r7, #0 + add r6, sp, #0 + mov r3, r7 + mov r4, #0x3f + mov lr, #0x3e +_021EC014: + ldrsb r5, [r0, r7] + cmp r5, #0x41 + blt _021EC030 + cmp r5, #0x5a + suble r5, r5, #0x41 + strleb r5, [r6] + ble _021EC078 +_021EC030: + cmp r5, #0x61 + blt _021EC048 + cmp r5, #0x7a + suble r5, r5, #0x47 + strleb r5, [r6] + ble _021EC078 +_021EC048: + cmp r5, #0x30 + blt _021EC060 + cmp r5, #0x39 + addle r5, r5, #4 + strleb r5, [r6] + ble _021EC078 +_021EC060: + cmp r5, #0x2e + streqb lr, [r6] + beq _021EC078 + cmp r5, #0x2d + streqb r4, [r6] + strneb r3, [r6] +_021EC078: + add r7, r7, #1 + cmp r7, #4 + add r6, r6, #1 + blt _021EC014 + ldrsb r4, [sp, #1] + ldrsb lr, [sp] + add r3, r1, #1 + mov r4, r4, asr #4 + orr r4, r4, lr, lsl #2 + sub r3, r3, r2 + strb r4, [r1] + cmp r3, ip + add r0, r0, #4 + bge _021EC0F4 + ldrsb lr, [sp, #2] + ldrsb r4, [sp, #1] + add r3, r1, #2 + mov lr, lr, asr #2 + orr r4, lr, r4, lsl #4 + sub r3, r3, r2 + strb r4, [r1, #1] + cmp r3, ip + bge _021EC0F4 + ldrsb lr, [sp, #2] + ldrsb r3, [sp, #3] + orr r3, r3, lr, lsl #6 + strb r3, [r1, #2] + add r1, r1, #3 + sub r3, r1, r2 + cmp r3, ip + blt _021EC000 +_021EC0F4: + mov r0, r3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021EBF90 + + arm_func_start ov00_021EC0FC +ov00_021EC0FC: ; 0x021EC0FC + cmp r0, #0 + ldrne r1, _021EC118 ; =ov00_0221A74C + ldrne r1, [r1, #4] + strne r1, [r0] + ldr r0, _021EC118 ; =ov00_0221A74C + ldr r0, [r0] + bx lr + .balign 4, 0 +_021EC118: .word ov00_0221A74C + arm_func_end ov00_021EC0FC + + arm_func_start ov00_021EC11C +ov00_021EC11C: ; 0x021EC11C + cmp r0, #0 + ldrne r2, _021EC20C ; =ov00_0221A74C + ldrne r2, [r2, #4] + strne r2, [r0] + cmp r1, #0 + beq _021EC200 + ldr r0, _021EC20C ; =ov00_0221A74C + ldr r0, [r0] + cmp r0, #0x13 + addls pc, pc, r0, lsl #2 + b _021EC1F8 +_021EC148: ; jump table + b _021EC1F8 ; case 0 + b _021EC1C8 ; case 1 + b _021EC198 ; case 2 + b _021EC198 ; case 3 + b _021EC198 ; case 4 + b _021EC198 ; case 5 + b _021EC1A4 ; case 6 + b _021EC1B0 ; case 7 + b _021EC198 ; case 8 + b _021EC1C8 ; case 9 + b _021EC1BC ; case 10 + b _021EC1BC ; case 11 + b _021EC1BC ; case 12 + b _021EC1BC ; case 13 + b _021EC1D4 ; case 14 + b _021EC1E0 ; case 15 + b _021EC1EC ; case 16 + b _021EC1E0 ; case 17 + b _021EC1EC ; case 18 + b _021EC1E0 ; case 19 +_021EC198: + mov r0, #6 + str r0, [r1] + b _021EC200 +_021EC1A4: + mov r0, #3 + str r0, [r1] + b _021EC200 +_021EC1B0: + mov r0, #4 + str r0, [r1] + b _021EC200 +_021EC1BC: + mov r0, #1 + str r0, [r1] + b _021EC200 +_021EC1C8: + mov r0, #7 + str r0, [r1] + b _021EC200 +_021EC1D4: + mov r0, #5 + str r0, [r1] + b _021EC200 +_021EC1E0: + mov r0, #6 + str r0, [r1] + b _021EC200 +_021EC1EC: + mov r0, #2 + str r0, [r1] + b _021EC200 +_021EC1F8: + mov r0, #0 + str r0, [r1] +_021EC200: + ldr r0, _021EC20C ; =ov00_0221A74C + ldr r0, [r0] + bx lr + .balign 4, 0 +_021EC20C: .word ov00_0221A74C + arm_func_end ov00_021EC11C + + arm_func_start ov00_021EC210 +ov00_021EC210: ; 0x021EC210 + ldr r0, _021EC22C ; =ov00_0221A74C + ldr r1, [r0] + cmp r1, #9 + movne r1, #0 + strne r1, [r0] + strne r1, [r0, #4] + bx lr + .balign 4, 0 +_021EC22C: .word ov00_0221A74C + arm_func_end ov00_021EC210 + + arm_func_start ov00_021EC230 +ov00_021EC230: ; 0x021EC230 + ldr r0, _021EC248 ; =ov00_0221A74C + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_021EC248: .word ov00_0221A74C + arm_func_end ov00_021EC230 + + arm_func_start ov00_021EC24C +ov00_021EC24C: ; 0x021EC24C + ldr r2, _021EC260 ; =ov00_0221A74C + ldr r3, [r2] + cmp r3, #9 + stmneia r2, {r0, r1} + bx lr + .balign 4, 0 +_021EC260: .word ov00_0221A74C + arm_func_end ov00_021EC24C + + arm_func_start ov00_021EC264 +ov00_021EC264: ; 0x021EC264 + sub r0, r0, #0x20 + bx lr + arm_func_end ov00_021EC264 + + arm_func_start ov00_021EC26C +ov00_021EC26C: ; 0x021EC26C + ldr r2, _021EC280 ; =0x4457434D + str r2, [r0] + str r1, [r0, #4] + add r0, r0, #0x20 + bx lr + .balign 4, 0 +_021EC280: .word 0x4457434D + arm_func_end ov00_021EC26C + + arm_func_start ov00_021EC284 +ov00_021EC284: ; 0x021EC284 + stmdb sp!, {r3, lr} + bl ov00_021EC264 + ldr r0, [r0, #4] + ldmia sp!, {r3, pc} + arm_func_end ov00_021EC284 + + arm_func_start ov00_021EC294 +ov00_021EC294: ; 0x021EC294 + ldr r2, _021EC2A4 ; =ov00_0221A754 + str r0, [r2, #4] + str r1, [r2] + bx lr + .balign 4, 0 +_021EC2A4: .word ov00_0221A754 + arm_func_end ov00_021EC294 + + arm_func_start ov00_021EC2A8 +ov00_021EC2A8: ; 0x021EC2A8 + ldr ip, _021EC2B4 ; =ov00_021EC2B8 + mov r2, #0x20 + bx ip + .balign 4, 0 +_021EC2B4: .word ov00_021EC2B8 + arm_func_end ov00_021EC2A8 + + arm_func_start ov00_021EC2B8 +ov00_021EC2B8: ; 0x021EC2B8 + stmdb sp!, {r4, lr} + ldr r3, _021EC2E8 ; =ov00_0221A754 + mov r4, r1 + ldr r3, [r3, #4] + add r1, r4, #0x20 + blx r3 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, r4 + bl ov00_021EC26C + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EC2E8: .word ov00_0221A754 + arm_func_end ov00_021EC2B8 + + arm_func_start ov00_021EC2EC +ov00_021EC2EC: ; 0x021EC2EC + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r1, #0 + ldmeqia sp!, {r4, pc} + mov r0, r1 + bl ov00_021EC264 + mov r1, r0 + ldr r0, _021EC324 ; =ov00_0221A754 + ldr r2, [r1, #4] + ldr r3, [r0] + mov r0, r4 + add r2, r2, #0x20 + blx r3 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EC324: .word ov00_0221A754 + arm_func_end ov00_021EC2EC + + arm_func_start ov00_021EC328 +ov00_021EC328: ; 0x021EC328 + stmdb sp!, {r3, lr} + mov ip, #0x20 + str ip, [sp] + bl ov00_021EC33C + ldmia sp!, {r3, pc} + arm_func_end ov00_021EC328 + + arm_func_start ov00_021EC33C +ov00_021EC33C: ; 0x021EC33C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r3 + mov r7, r1 + ldr r2, [sp, #0x18] + mov r1, r5 + mov r8, r0 + bl ov00_021EC2B8 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r7, #0 + beq _021EC3A0 + mov r0, r7 + bl ov00_021EC284 + mov r6, r0 + cmp r6, r5 + movls r5, r6 + mov r0, r7 + mov r1, r4 + mov r2, r5 + bl MI_CpuCopy8 + mov r0, r8 + mov r1, r7 + mov r2, r6 + bl ov00_021EC2EC +_021EC3A0: + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov00_021EC33C + + arm_func_start ov00_021EC3A8 +ov00_021EC3A8: ; 0x021EC3A8 + ldr ip, _021EC3B8 ; =ov00_021EC2A8 + mov r1, r0 + mov r0, #5 + bx ip + .balign 4, 0 +_021EC3B8: .word ov00_021EC2A8 + arm_func_end ov00_021EC3A8 + + arm_func_start ov00_021EC3BC +ov00_021EC3BC: ; 0x021EC3BC + ldr ip, _021EC3D4 ; =ov00_021EC328 + mov r2, r1 + mov r1, r0 + mov r3, r2 + mov r0, #5 + bx ip + .balign 4, 0 +_021EC3D4: .word ov00_021EC328 + arm_func_end ov00_021EC3BC + + arm_func_start ov00_021EC3D8 +ov00_021EC3D8: ; 0x021EC3D8 + ldr ip, _021EC3EC ; =ov00_021EC2EC + mov r1, r0 + mov r0, #5 + mov r2, #0 + bx ip + .balign 4, 0 +_021EC3EC: .word ov00_021EC2EC + arm_func_end ov00_021EC3D8 + + arm_func_start ov00_021EC3F0 +ov00_021EC3F0: ; 0x021EC3F0 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _021EC450 ; =ov00_0221A75C + mov r4, r0 + ldr r2, [r2, #4] + mov r6, r1 + mov r5, r3 + cmp r2, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r1, #0 + mov r2, #0x64 + bl MI_CpuFill8 + strh r6, [r4, #8] + mov r0, #1 + strh r0, [r4, #0xa] + strh r0, [r4, #4] + mov r0, #0 + strh r0, [r4, #6] + strb r0, [r4, #0xc] + ldr r1, _021EC450 ; =ov00_0221A75C + str r0, [r4, #0x10] + mov r0, r5 + str r4, [r1, #4] + bl CPS_SetSslHandshakePriority + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EC450: .word ov00_0221A75C + arm_func_end ov00_021EC3F0 + + arm_func_start ov00_021EC454 +ov00_021EC454: ; 0x021EC454 + stmdb sp!, {r3, lr} + cmp r0, #0 + beq _021EC474 + cmp r0, #1 + beq _021EC480 + cmp r0, #2 + beq _021EC48C + ldmia sp!, {r3, pc} +_021EC474: + ldr r0, _021EC498 ; =ov00_02217938 + bl ov00_021E7B60 + ldmia sp!, {r3, pc} +_021EC480: + ldr r0, _021EC49C ; =ov00_02217960 + bl ov00_021E7B60 + ldmia sp!, {r3, pc} +_021EC48C: + ldr r0, _021EC4A0 ; =ov00_02217984 + bl ov00_021E7B60 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EC498: .word ov00_02217938 +_021EC49C: .word ov00_02217960 +_021EC4A0: .word ov00_02217984 + arm_func_end ov00_021EC454 + + arm_func_start ov00_021EC4A4 +ov00_021EC4A4: ; 0x021EC4A4 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _021EC548 ; =ov00_0221A75C + ldr r0, [r0, #4] + cmp r0, #0 + beq _021EC534 + ldrh r0, [r0, #4] + cmp r0, #1 + addne sp, sp, #0xc + ldmneia sp!, {pc} + add r0, sp, #0 + mov r1, #0 + mov r2, #0xc + bl MI_CpuFill8 + ldr r0, _021EC548 ; =ov00_0221A75C + ldr r3, _021EC54C ; =ov00_021EC2A8 + ldr lr, [r0, #4] + ldr r2, _021EC550 ; =ov00_021EC2EC + ldrh ip, [lr, #8] + add r0, sp, #0 + mov r1, #2 + strb ip, [sp, #8] + ldrh ip, [lr, #0xa] + strb ip, [sp, #9] + str r3, [sp] + str r2, [sp, #4] + strh r1, [lr, #4] + bl ov00_021FA75C + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {pc} + ldr r1, _021EC554 ; =0xFFFF3BE9 + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xc + ldmia sp!, {pc} +_021EC534: + ldr r1, _021EC554 ; =0xFFFF3BE9 + mov r0, #9 + bl ov00_021EC24C + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_021EC548: .word ov00_0221A75C +_021EC54C: .word ov00_021EC2A8 +_021EC550: .word ov00_021EC2EC +_021EC554: .word 0xFFFF3BE9 + arm_func_end ov00_021EC4A4 + + arm_func_start ov00_021EC558 +ov00_021EC558: ; 0x021EC558 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC4A4 + ldr r0, _021EC5B0 ; =ov00_0221A75C + ldr r1, [r0, #4] + cmp r1, #0 + movne r0, #1 + strneb r0, [r1, #0xc] + bl ov00_021EC724 + cmp r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr ip, [sp, #0x18] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + str ip, [sp] + bl ov00_021FAB04 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EC5B0: .word ov00_0221A75C + arm_func_end ov00_021EC558 + + arm_func_start ov00_021EC5B4 +ov00_021EC5B4: ; 0x021EC5B4 + stmdb sp!, {r3, lr} + ldr r0, _021EC608 ; =ov00_0221A75C + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r1] + cmp r0, #0 + beq _021EC600 + mov r0, #3 + strh r0, [r1, #4] + bl ov00_021EC724 + ldr r0, _021EC608 ; =ov00_0221A75C + ldr r0, [r0, #4] + ldrb r0, [r0, #0xc] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} +_021EC600: + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EC608: .word ov00_0221A75C + arm_func_end ov00_021EC5B4 + + arm_func_start ov00_021EC60C +ov00_021EC60C: ; 0x021EC60C + stmdb sp!, {r3, lr} + ldr r0, _021EC720 ; =ov00_0221A75C + ldr r1, [r0, #4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r1, #0x10] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _021EC6C0 +_021EC630: ; jump table + b _021EC6C0 ; case 0 + b _021EC644 ; case 1 + b _021EC660 ; case 2 + b _021EC69C ; case 3 + b _021EC6BC ; case 4 +_021EC644: + mov r0, #0 + str r0, [r1] + bl ov00_021FDD3C + ldr r1, _021EC720 ; =ov00_0221A75C + ldr r1, [r1, #4] + str r0, [r1, #0x10] + ldmia sp!, {r3, pc} +_021EC660: + bl ov00_021FE070 + ldr r0, _021EC720 ; =ov00_0221A75C + mov r1, #8 + ldr r3, [r0, #4] + str r1, [sp] + ldr r2, [r3, #0x54] + add r0, r3, #0x14 + add r1, r3, #0x34 + add r3, r3, #0x58 + bl ov00_021EC558 + ldr r0, _021EC720 ; =ov00_0221A75C + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x10] + ldmia sp!, {r3, pc} +_021EC69C: + bl ov00_021FE070 + ldr r0, _021EC720 ; =ov00_0221A75C + mvn r3, #0 + ldr r2, [r0, #4] + mov r1, #1 + str r3, [r2] + ldr r0, [r0, #4] + strb r1, [r0, #0xc] +_021EC6BC: + ldmia sp!, {r3, pc} +_021EC6C0: + ldrh r0, [r1, #4] + cmp r0, #2 + bne _021EC6E0 + bl ov00_021FA904 + ldr r1, _021EC720 ; =ov00_0221A75C + ldr r1, [r1, #4] + str r0, [r1] + ldmia sp!, {r3, pc} +_021EC6E0: + cmp r0, #4 + ldmneia sp!, {r3, pc} + ldrh r0, [r1, #6] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl WCM_GetPhase + cmp r0, #9 + ldmeqia sp!, {r3, pc} + ldr r0, _021EC720 ; =ov00_0221A75C + mov r3, #0 + ldr r2, [r0, #4] + mov r1, #6 + strh r3, [r2, #6] + ldr r0, [r0, #4] + strh r1, [r0, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EC720: .word ov00_0221A75C + arm_func_end ov00_021EC60C + + arm_func_start ov00_021EC724 +ov00_021EC724: ; 0x021EC724 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _021EC8D0 ; =ov00_0221A75C + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r1, #0x10] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _021EC7AC +_021EC74C: ; jump table + b _021EC7AC ; case 0 + b _021EC760 ; case 1 + b _021EC768 ; case 2 + b _021EC770 ; case 3 + b _021EC7A4 ; case 4 +_021EC760: + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC768: + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC770: + bl ov00_021EC60C + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r0, #5 + ldr r1, [r1] + bl ov00_021EC24C + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r0, #7 + ldr r3, [r1, #4] + mov r2, #4 + strh r0, [r3, #4] + ldr r1, [r1, #4] + str r2, [r1, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC7A4: + mov r0, #7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC7AC: + ldrh r0, [r1, #4] + cmp r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021FA9D4 + mov r4, r0 + cmp r4, #5 + bne _021EC7F0 + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r0, #4 + ldr r2, [r1, #4] + mov r3, #1 + strh r0, [r2, #4] + ldr r2, [r1, #4] + strh r3, [r2, #6] + ldr r1, [r1, #4] + strb r3, [r1, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC7F0: + cmp r4, #0 + bge _021EC8C8 + mvn r0, #9 + cmp r4, r0 + blt _021EC824 + ldr r1, _021EC8D4 ; =0xFFFF3BE9 + mov r0, #9 + bl ov00_021EC24C + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r0, #8 + ldr r1, [r1, #4] + strh r0, [r1, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC824: + ldr r0, _021EC8D0 ; =ov00_0221A75C + ldr r5, [r0, #4] + ldrb r1, [r5, #0xc] + cmp r1, #0 + bne _021EC89C + ldrh r7, [r5, #8] + bl CPS_GetSslHandshakePriority + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r6, r0 + str r4, [r1] + bl ov00_021EC8D8 + mov r2, r6, lsl #0x10 + mov r3, r2, lsr #0x10 + mov r0, r5 + mov r1, r7 + mov r2, #1 + bl ov00_021EC3F0 + ldr r0, _021EC8D0 ; =ov00_0221A75C + ldr r0, [r0, #4] + add r0, r0, #0x14 + bl ov00_021FDCDC + ldr r0, _021EC8D0 ; =ov00_0221A75C + mov r3, #1 + ldr r1, [r0, #4] + mov r2, #0 + str r3, [r1, #0x10] + ldr r1, [r0, #4] + mov r0, #2 + str r2, [r1] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC89C: + ldr r0, [r0] + cmp r0, r4 + movlt r4, r0 + mov r1, r4 + mov r0, #5 + bl ov00_021EC24C + ldr r1, _021EC8D0 ; =ov00_0221A75C + mov r0, #7 + ldr r1, [r1, #4] + strh r0, [r1, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EC8C8: + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EC8D0: .word ov00_0221A75C +_021EC8D4: .word 0xFFFF3BE9 + arm_func_end ov00_021EC724 + + arm_func_start ov00_021EC8D8 +ov00_021EC8D8: ; 0x021EC8D8 + stmdb sp!, {r4, lr} + ldr r0, _021EC934 ; =ov00_0221A75C + ldr r1, [r0, #4] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + ldrh r1, [r1, #4] + cmp r1, #1 + moveq r1, #0 + streq r1, [r0, #4] + ldmeqia sp!, {r4, pc} + bl ov00_021FAAC8 + cmp r0, #0 + bne _021EC924 + mov r4, #0xa +_021EC910: + mov r0, r4 + bl OS_Sleep + bl ov00_021FAAC8 + cmp r0, #0 + beq _021EC910 +_021EC924: + ldr r0, _021EC934 ; =ov00_0221A75C + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EC934: .word ov00_0221A75C + arm_func_end ov00_021EC8D8 + + arm_func_start ov00_021EC938 +ov00_021EC938: ; 0x021EC938 + stmdb sp!, {r3, lr} + ldr r0, _021EC9A4 ; =ov00_0221A75C + ldr r2, [r0, #4] + cmp r2, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + ldrh r1, [r2, #4] + cmp r1, #8 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + cmp r1, #1 + bne _021EC978 + mov r1, #0 + str r1, [r0, #4] + mov r0, #1 + ldmia sp!, {r3, pc} +_021EC978: + mov r0, #5 + strh r0, [r2, #4] + bl ov00_021FAAC8 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _021EC9A4 ; =ov00_0221A75C + mov r1, #0 + str r1, [r0, #4] + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EC9A4: .word ov00_0221A75C + arm_func_end ov00_021EC938 + + arm_func_start ov00_021EC9A8 +ov00_021EC9A8: ; 0x021EC9A8 + ldr r0, _021EC9D0 ; =ov00_0221A75C + ldr r0, [r0, #4] + cmp r0, #0 + beq _021EC9C8 + ldrh r0, [r0, #4] + cmp r0, #6 + moveq r0, #1 + bxeq lr +_021EC9C8: + mov r0, #0 + bx lr + .balign 4, 0 +_021EC9D0: .word ov00_0221A75C + arm_func_end ov00_021EC9A8 + + arm_func_start ov00_021EC9D4 +ov00_021EC9D4: ; 0x021EC9D4 + ldr ip, _021EC9DC ; =WCM_GetLinkLevel + bx ip + .balign 4, 0 +_021EC9DC: .word WCM_GetLinkLevel + arm_func_end ov00_021EC9D4 + + arm_func_start ov00_021EC9E0 +ov00_021EC9E0: ; 0x021EC9E0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r1, #0 + mov r2, #0x3c + mov r4, r0 + bl MI_CpuFill8 + mov r0, #0xff + str r0, [r4, #4] + bl ov00_021EC724 + cmp r0, #4 + addne sp, sp, #0xc + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + bl ov00_021FAA40 + str r0, [r4] + cmp r0, #0xff + beq _021ECA2C + cmp r0, #0x63 + ble _021ECA40 +_021ECA2C: + mov r0, #0x63 + str r0, [r4] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021ECA40: + bl OS_DisableInterrupts + mov r6, r0 + bl WCM_GetApMacAddress + mov r5, r0 + mov r1, #6 + bl DC_InvalidateRange + cmp r5, #0 + bne _021ECA74 + mov r0, r6 + bl OS_RestoreInterrupts + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021ECA74: + mov r0, r5 + add r1, r4, #0x33 + mov r2, #6 + bl MI_CpuCopy8 + ldr r0, [r4] + cmp r0, #0 + blt _021ECAD8 + cmp r0, #3 + bge _021ECAD8 + add r0, sp, #0 + bl WCM_GetApEssid + mov r5, r0 + mov r1, #0x20 + bl DC_InvalidateRange + cmp r5, #0 + bne _021ECAC8 + mov r0, r6 + bl OS_RestoreInterrupts + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021ECAC8: + ldrh r2, [sp] + mov r0, r5 + add r1, r4, #0x12 + bl MI_CpuCopy8 +_021ECAD8: + mov r0, r6 + bl OS_RestoreInterrupts + add r0, sp, #2 + bl ov00_021FAA70 + cmp r0, #0 + beq _021ECB2C + ldrb r1, [sp, #2] + mov r0, #0 + cmp r1, #0x30 + blo _021ECB08 + cmp r1, #0x39 + movls r0, #1 +_021ECB08: + cmp r0, #0 + subne r3, r1, #0x30 + moveq r3, #0xff + add r0, sp, #3 + add r1, r4, #8 + mov r2, #9 + str r3, [r4, #4] + bl MI_CpuCopy8 + b _021ECB34 +_021ECB2C: + mov r0, #0xff + str r0, [r4, #4] +_021ECB34: + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_021EC9E0 + + arm_func_start ov00_021ECB40 +ov00_021ECB40: ; 0x021ECB40 + stmdb sp!, {r3, lr} + bl ov00_021EC60C + bl ov00_021EC9A8 + cmp r0, #0 + beq _021ECB88 + bl ov00_021FAA40 + mov r2, r0 + cmp r2, #0xff + beq _021ECB6C + cmp r2, #0x63 + bls _021ECB70 +_021ECB6C: + mov r2, #0x63 +_021ECB70: + ldr r1, _021ECB90 ; =0xFFFF2D10 + mov r0, #8 + sub r1, r1, r2 + bl ov00_021EC24C + mov r0, #1 + ldmia sp!, {r3, pc} +_021ECB88: + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021ECB90: .word 0xFFFF2D10 + arm_func_end ov00_021ECB40 + + arm_func_start ov00_021ECB94 +ov00_021ECB94: ; 0x021ECB94 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021ECC58 ; =ov00_0221A734 + mov r5, r0 + ldr r2, [r2] + mov r4, r1 + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl RTC_GetDateTime + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl RTC_ConvertDateTimeToSecond + mvn r2, #0 + cmp r1, r2 + cmpeq r0, r2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, _021ECC5C ; =ov00_0221A738 + ldr ip, [r2] + ldr r3, [r2, #4] + subs r2, r0, ip + sbcs r2, r1, r3 + bge _021ECC08 + ldr r2, _021ECC60 ; =0xBC191380 + adds r0, r0, r2 + adc r1, r1, #0 +_021ECC08: + ldr r2, _021ECC64 ; =ov00_0221A740 + mov ip, #0 + ldr lr, [r2] + ldr r3, [r2, #4] + subs r2, r0, lr + sbc r3, r1, r3 + subs r0, r2, #0 + sbcs r0, r3, #0 + blt _021ECC3C + ldr r0, _021ECC68 ; =0xBC19137F + subs r0, r0, r2 + sbcs r0, ip, r3 + bge _021ECC44 +_021ECC3C: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021ECC44: + mov r0, r5 + mov r1, r4 + bl RTC_ConvertSecondToDateTime + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021ECC58: .word ov00_0221A734 +_021ECC5C: .word ov00_0221A738 +_021ECC60: .word 0xBC191380 +_021ECC64: .word ov00_0221A740 +_021ECC68: .word 0xBC19137F + arm_func_end ov00_021ECB94 + + arm_func_start ov00_021ECC6C +ov00_021ECC6C: ; 0x021ECC6C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr r0, _021ECCD4 ; =ov00_021EC2A8 + ldr r1, _021ECCD8 ; =ov00_021EC2EC + bl ov00_021EB7CC + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl strlen + cmp r0, #0 + bne _021ECCB0 + ldr r0, _021ECCDC ; =ov00_022179A4 + mov r1, r4 + bl ov00_021EB8B0 + b _021ECCBC +_021ECCB0: + mov r0, r5 + mov r1, r4 + bl ov00_021EB8B0 +_021ECCBC: + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + bl ov00_021EB864 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021ECCD4: .word ov00_021EC2A8 +_021ECCD8: .word ov00_021EC2EC +_021ECCDC: .word ov00_022179A4 + arm_func_end ov00_021ECC6C + + arm_func_start ov00_021ECCE0 +ov00_021ECCE0: ; 0x021ECCE0 + stmdb sp!, {r4, lr} + bl ov00_021EBB18 + mov r4, r0 + sub r0, r4, #3 + cmp r0, #2 + bhi _021ECCFC + bl ov00_021EB864 +_021ECCFC: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov00_021ECCE0 + + arm_func_start ov00_021ECD04 +ov00_021ECD04: ; 0x021ECD04 + stmdb sp!, {r3, lr} + ldr r0, _021ECDB0 ; =ov00_0221A764 + ldr r0, [r0] + cmp r0, #0 + beq _021ECD1C + bl OS_Terminate +_021ECD1C: + ldr r1, _021ECDB4 ; =0x00001E20 + mov r0, #4 + bl ov00_021EC2A8 + ldr r1, _021ECDB0 ; =ov00_0221A764 + cmp r0, #0 + str r0, [r1] + bne _021ECD4C + ldr r1, _021ECDB8 ; =0xFFFFB17C + mov r0, #9 + bl ov00_021EC24C + mov r0, #0 + ldmia sp!, {r3, pc} +_021ECD4C: + ldr r2, _021ECDB4 ; =0x00001E20 + mov r1, #0 + bl MI_CpuFill8 + ldr r1, _021ECDB0 ; =ov00_0221A764 + ldr r0, _021ECDBC ; =ov00_022179AC + ldr r1, [r1] + mov r2, #9 + add r1, r1, #0x48 + add r1, r1, #0x1c00 + bl MI_CpuCopy8 + ldr r1, _021ECDB0 ; =ov00_0221A764 + ldr r3, _021ECDC0 ; =ov00_021EC2A8 + ldr r0, [r1] + ldr r2, _021ECDC4 ; =ov00_021EC2EC + add r0, r0, #0x1000 + str r3, [r0, #0xc54] + ldr r0, [r1] + add r0, r0, #0x1000 + str r2, [r0, #0xc58] + ldr r1, [r1] + add r0, r1, #0x14 + add r0, r0, #0x1c00 + bl ov00_021E7B70 + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021ECDB0: .word ov00_0221A764 +_021ECDB4: .word 0x00001E20 +_021ECDB8: .word 0xFFFFB17C +_021ECDBC: .word ov00_022179AC +_021ECDC0: .word ov00_021EC2A8 +_021ECDC4: .word ov00_021EC2EC + arm_func_end ov00_021ECD04 + + arm_func_start ov00_021ECDC8 +ov00_021ECDC8: ; 0x021ECDC8 + stmdb sp!, {lr} + sub sp, sp, #0x1c4 + ldr r0, _021ECEB8 ; =ov00_0221A764 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0x1c4 + moveq r0, #0 + ldmeqia sp!, {pc} + bl ov00_021E7E5C + cmp r0, #0 + beq _021ECE08 + cmp r0, #0x14 + beq _021ECE44 + cmp r0, #0x15 + beq _021ECE14 + b _021ECE74 +_021ECE08: + add sp, sp, #0x1c4 + mov r0, #2 + ldmia sp!, {pc} +_021ECE14: + bl ov00_021E7DD4 + ldr r0, _021ECEB8 ; =ov00_0221A764 + ldr r2, _021ECEBC ; =0x00001E20 + ldr r1, [r0] + mov r0, #4 + bl ov00_021EC2EC + ldr r0, _021ECEB8 ; =ov00_0221A764 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x1c4 + mov r0, #3 + ldmia sp!, {pc} +_021ECE44: + bl ov00_021E7DD4 + ldr r0, _021ECEB8 ; =ov00_0221A764 + ldr r2, _021ECEBC ; =0x00001E20 + ldr r1, [r0] + mov r0, #4 + bl ov00_021EC2EC + ldr r0, _021ECEB8 ; =ov00_0221A764 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x1c4 + mov r0, #5 + ldmia sp!, {pc} +_021ECE74: + add r0, sp, #0 + bl ov00_021E7EA8 + bl ov00_021E7DD4 + ldr r0, _021ECEB8 ; =ov00_0221A764 + ldr r2, _021ECEBC ; =0x00001E20 + ldr r1, [r0] + mov r0, #4 + bl ov00_021EC2EC + ldr r1, [sp] + ldr r2, _021ECEB8 ; =ov00_0221A764 + mov r3, #0 + mov r0, #2 + str r3, [r2] + bl ov00_021EC24C + mov r0, #4 + add sp, sp, #0x1c4 + ldmia sp!, {pc} + .balign 4, 0 +_021ECEB8: .word ov00_0221A764 +_021ECEBC: .word 0x00001E20 + arm_func_end ov00_021ECDC8 + + arm_func_start ov00_021ECEC0 +ov00_021ECEC0: ; 0x021ECEC0 + ldr ip, _021ECEC8 ; =ov00_021E7D48 + bx ip + .balign 4, 0 +_021ECEC8: .word ov00_021E7D48 + arm_func_end ov00_021ECEC0 + + arm_func_start ov00_021ECECC +ov00_021ECECC: ; 0x021ECECC + ldr ip, _021ECEE0 ; =ov00_021EC2B8 + mov r2, r1 + mov r1, r0 + mov r0, #6 + bx ip + .balign 4, 0 +_021ECEE0: .word ov00_021EC2B8 + arm_func_end ov00_021ECECC + + arm_func_start ov00_021ECEE4 +ov00_021ECEE4: ; 0x021ECEE4 + ldr ip, _021ECEF8 ; =ov00_021EC2EC + mov r1, r0 + mov r0, #6 + mov r2, #0 + bx ip + .balign 4, 0 +_021ECEF8: .word ov00_021EC2EC + arm_func_end ov00_021ECEE4 + + arm_func_start ov00_021ECEFC +ov00_021ECEFC: ; 0x021ECEFC + stmdb sp!, {r4, r5, r6, lr} + movs r5, r1 + mov r6, r0 + mov r4, r2 + bne _021ECF24 + ldr r3, _021ECFDC ; =ov00_0221A768 + ldr r3, [r3] + ldr r3, [r3] + blx r3 + ldmia sp!, {r4, r5, r6, pc} +_021ECF24: + cmp r5, #8 + addls pc, pc, r5, lsl #2 + b _021ECFB8 +_021ECF30: ; jump table + b _021ECFB8 ; case 0 + b _021ECF54 ; case 1 + b _021ECF64 ; case 2 + b _021ECF6C ; case 3 + b _021ECF7C ; case 4 + b _021ECF8C ; case 5 + b _021ECFBC ; case 6 + b _021ECFA0 ; case 7 + b _021ECFA8 ; case 8 +_021ECF54: + ldr r1, _021ECFE0 ; =0xFFFF86E7 + mov r0, #9 + bl ov00_021EC24C + b _021ECFBC +_021ECF64: + bl OS_Terminate + b _021ECFBC +_021ECF6C: + ldr r1, _021ECFE4 ; =0xFFFF86D4 + mov r0, #0xf + bl ov00_021EC24C + b _021ECFBC +_021ECF7C: + ldr r1, _021ECFE8 ; =0xFFFF86CA + mov r0, #0xe + bl ov00_021EC24C + b _021ECFBC +_021ECF8C: + ldr r1, _021ECFEC ; =0xFFFF86E8 + mov r0, #0xe + sub r1, r1, r4 + bl ov00_021EC24C + b _021ECFBC +_021ECFA0: + bl OS_Terminate + b _021ECFBC +_021ECFA8: + ldr r1, _021ECFF0 ; =0xFFFF86DF + mov r0, #9 + bl ov00_021EC24C + b _021ECFBC +_021ECFB8: + bl OS_Terminate +_021ECFBC: + ldr r1, _021ECFDC ; =ov00_0221A768 + mov r0, r6 + ldr r2, [r1] + mov r1, r5 + ldr r3, [r2] + mov r2, r4 + blx r3 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021ECFDC: .word ov00_0221A768 +_021ECFE0: .word 0xFFFF86E7 +_021ECFE4: .word 0xFFFF86D4 +_021ECFE8: .word 0xFFFF86CA +_021ECFEC: .word 0xFFFF86E8 +_021ECFF0: .word 0xFFFF86DF + arm_func_end ov00_021ECEFC + + arm_func_start ov00_021ECFF4 +ov00_021ECFF4: ; 0x021ECFF4 + stmdb sp!, {r4, lr} + ldr r0, _021ED034 ; =ov00_0221A768 + ldr r0, [r0] + add r0, r0, #0x9c0 + bl OS_JoinThread + ldr r0, _021ED034 ; =ov00_0221A768 + ldr r0, [r0] + ldr r4, [r0, #4] + bl ov00_021ECEE4 + ldr r0, _021ED034 ; =ov00_0221A768 + mov r1, #0 + str r1, [r0] + cmp r4, #0 + ldmeqia sp!, {r4, pc} + blx r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021ED034: .word ov00_0221A768 + arm_func_end ov00_021ECFF4 + + arm_func_start ov00_021ED038 +ov00_021ED038: ; 0x021ED038 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x2a0 + mov r7, #0 + mov r6, #6 + mvn r5, #0 + mov r4, #0x64 +_021ED050: + bl ov00_021ECCE0 + cmp r0, #3 + bne _021ED16C + ldr r0, _021ED1D8 ; =ov00_0221A768 + ldr r5, [r0] + add r0, r5, #0x50 + bl strlen + mov r4, r0 + ldr r0, _021ED1DC ; =ov00_022179B0 + bl strlen + add r0, r4, r0 + cmp r0, #0xff + bls _021ED09C + mov r1, #8 + sub r2, r1, #9 + mov r0, #0 + bl ov00_021ECEFC + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED09C: + ldr r2, _021ED1E0 ; =ov00_022179C4 + add r0, sp, #0x1a0 + add r3, r5, #0x50 + mov r1, #0x100 + bl OS_SNPrintf + ldr r0, _021ED1D8 ; =ov00_0221A768 + ldr r4, [r0] + add r0, r4, #0x91 + bl strlen + mov r1, r0 + add r2, sp, #0x10 + add r0, r4, #0x91 + mov r3, #0x190 + bl ov00_021EBE08 + cmp r0, #0 + bge _021ED0F4 + mov r1, #8 + sub r2, r1, #9 + mov r0, #0 + bl ov00_021ECEFC + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED0F4: + ldr r0, _021ED1D8 ; =ov00_0221A768 + ldr r4, _021ED1E4 ; =ov00_021ECEFC + ldr r2, [r0] + ldr r0, _021ED1E8 ; =ov00_021ECECC + add r1, r2, #8 + str r1, [sp] + add r1, r2, #0x28 + str r1, [sp, #4] + ldr r1, _021ED1EC ; =ov00_021ECEE4 + add r2, sp, #0x1a0 + add r3, sp, #0x10 + str r4, [sp, #8] + bl ov38_02220434 + cmp r0, #0 + mov r0, #0 + bne _021ED148 + mov r1, #8 + sub r2, r1, #9 + bl ov00_021ECEFC + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED148: + ldr r1, _021ED1D8 ; =ov00_0221A768 + mov r4, #1 + ldr r3, [r1] + mov r1, r0 + sub r2, r0, #1 + str r4, [r3, #0x48] + bl ov00_021ECEFC + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED16C: + cmp r0, #4 + bne _021ED1AC + add r0, sp, #0xc + bl ov00_021EC0FC + ldr r1, [sp, #0xc] + mov r0, #0xe + bl ov00_021EC24C + ldr r0, _021ED1D8 ; =ov00_0221A768 + mov r1, #3 + ldr r0, [r0] + sub r2, r1, #4 + ldr r3, [r0] + mov r0, #0 + blx r3 + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED1AC: + cmp r0, #5 + bne _021ED1C4 + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov00_021ECEFC +_021ED1C4: + mov r0, r4 + bl OS_Sleep + b _021ED050 + arm_func_end ov00_021ED038 + + arm_func_start ov00_021ED1D0 +ov00_021ED1D0: ; 0x021ED1D0 + add sp, sp, #0x2a0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021ED1D8: .word ov00_0221A768 +_021ED1DC: .word ov00_022179B0 +_021ED1E0: .word ov00_022179C4 +_021ED1E4: .word ov00_021ECEFC +_021ED1E8: .word ov00_021ECECC +_021ED1EC: .word ov00_021ECEE4 + arm_func_end ov00_021ED1D0 + + arm_func_start ov00_021ED1F0 +ov00_021ED1F0: ; 0x021ED1F0 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021EC230 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, #0xa80 + mov r1, #0x20 + bl ov00_021ECECC + ldr r2, _021ED2FC ; =ov00_0221A768 + mov r1, #0 + str r0, [r2] + str r1, [r0, #0x48] + ldr r0, [r2] + mov r2, #0xa80 + bl MI_CpuFill8 + ldr r0, _021ED2FC ; =ov00_0221A768 + mov r1, r5 + ldr r3, [r0] + mov r2, #0x1f + str r6, [r3] + ldr r0, [r0] + add r0, r0, #8 + bl strncpy + ldr r0, _021ED2FC ; =ov00_0221A768 + mov r1, r4 + ldr r0, [r0] + mov r2, #0x1f + add r0, r0, #0x28 + bl strncpy + ldr r1, _021ED2FC ; =ov00_0221A768 + ldr r0, _021ED300 ; =ov00_022179D8 + ldr r1, [r1] + add r1, r1, #0x4c + bl ov00_021ECC6C + cmp r0, #0 + bne _021ED2B4 + ldr r0, _021ED2FC ; =ov00_0221A768 + ldr r0, [r0] + bl ov00_021ECEE4 + ldr r1, _021ED2FC ; =ov00_0221A768 + mov r0, #0 + str r0, [r1] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_021ED2B4: + ldr r0, _021ED2FC ; =ov00_0221A768 + mov r2, #0x800 + ldr r3, [r0] + ldr r1, _021ED304 ; =ov00_021ED038 + str r2, [sp] + mov ip, #0x10 + add r0, r3, #0x9c0 + add r3, r3, #0x9c0 + mov r2, #0 + str ip, [sp, #4] + bl OS_CreateThread + ldr r0, _021ED2FC ; =ov00_0221A768 + ldr r0, [r0] + add r0, r0, #0x9c0 + bl OS_WakeupThreadDirect + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021ED2FC: .word ov00_0221A768 +_021ED300: .word ov00_022179D8 +_021ED304: .word ov00_021ED038 + arm_func_end ov00_021ED1F0 + + arm_func_start ov00_021ED308 +ov00_021ED308: ; 0x021ED308 + stmdb sp!, {r3, lr} + ldr r1, _021ED34C ; =ov00_0221A768 + ldr r2, [r1] + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + str r0, [r2, #4] + ldr r0, [r1] + ldr r0, [r0, #0x48] + cmp r0, #0 + bne _021ED33C + bl ov00_021ECFF4 + b _021ED344 +_021ED33C: + ldr r0, _021ED350 ; =ov00_021ECFF4 + bl ov38_02220620 +_021ED344: + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021ED34C: .word ov00_0221A768 +_021ED350: .word ov00_021ECFF4 + arm_func_end ov00_021ED308 + + arm_func_start ov00_021ED354 +ov00_021ED354: ; 0x021ED354 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov38_02220090 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021ED354 + + arm_func_start ov00_021ED388 +ov00_021ED388: ; 0x021ED388 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl ov38_02220F18 + ldmia sp!, {r4, pc} + arm_func_end ov00_021ED388 + + arm_func_start ov00_021ED3AC +ov00_021ED3AC: ; 0x021ED3AC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, #0xb0 + mul r2, r4, r0 + mov r0, r6 + mov r1, #0 + bl MI_CpuFill8 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov38_02220F8C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021ED3AC + + arm_func_start ov00_021ED3F4 +ov00_021ED3F4: ; 0x021ED3F4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov38_0222124C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021ED3F4 + + arm_func_start ov00_021ED428 +ov00_021ED428: ; 0x021ED428 + stmdb sp!, {r3, lr} + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + bl ov38_02220648 + ldmia sp!, {r3, pc} + arm_func_end ov00_021ED428 + + arm_func_start ov00_021ED444 +ov00_021ED444: ; 0x021ED444 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov38_02221408 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021ED444 + + arm_func_start ov00_021ED470 +ov00_021ED470: ; 0x021ED470 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + stmia sp, {r0, r3} + mov r4, r2 + str r1, [sp, #8] + ldr r2, _021ED4A4 ; =ov00_022179E0 + mov r0, r4 + mov r1, #0x1000 + bl OS_SNPrintf + mov r0, r4 + bl strlen + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_021ED4A4: .word ov00_022179E0 + arm_func_end ov00_021ED470 + + arm_func_start ov00_021ED4A8 +ov00_021ED4A8: ; 0x021ED4A8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r2 + mov r7, r0 + mov r6, r1 + mov r4, r3 + mov r0, r5 + mov r1, #0 + bl strchr + mov r2, r0 + mov r0, r7 + mov r1, r6 + mov r3, r4 + bl ov00_021ED470 + mov r0, r5 + bl strlen + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021ED4A8 + + arm_func_start ov00_021ED4E8 +ov00_021ED4E8: ; 0x021ED4E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r4, r1 + mov r7, r0 + mov r6, r3 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r2 + mov r1, r6 + bl strchr + movs r5, r0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_021ED518: + mov r0, r7 + bl strlen + mov r2, r0 + mov r1, r7 + add r0, r5, #1 + bl strncmp + cmp r0, #0 + bne _021ED550 + mov r0, r7 + bl strlen + add r0, r0, r5 + ldrsb r0, [r0, #1] + cmp r6, r0 + beq _021ED584 +_021ED550: + mov r1, r6 + add r0, r5, #1 + bl strchr + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r6 + add r0, r0, #1 + bl strchr + movs r5, r0 + bne _021ED518 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021ED584: + mov r1, r6 + add r0, r5, #1 + bl strchr + movs r5, r0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r6 + add r0, r5, #1 + bl strchr + cmp r0, #0 + addne r1, r5, #1 + subne r6, r0, r1 + bne _021ED5C4 + add r0, r5, #1 + bl strlen + mov r6, r0 +_021ED5C4: + mov r0, r4 + mov r2, r6 + add r1, r5, #1 + bl strncpy + mov r1, #0 + mov r0, r6 + strb r1, [r4, r6] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021ED4E8 + + arm_func_start ov00_021ED5E4 +ov00_021ED5E4: ; 0x021ED5E4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _021ED6F0 ; =ov00_0221A76C + mov r4, r0 + ldr r0, [r1, #4] + ldr r2, [r1] + cmp r0, #0 + cmpeq r2, #0 + mov r0, #0 + bne _021ED6A8 + ldr r2, [r1, #0xc] + ldr r3, [r1, #8] + cmp r2, r0 + cmpeq r3, r0 + bne _021ED6A8 + ldr r2, [r1, #0x14] + ldr r1, [r1, #0x10] + cmp r2, r0 + cmpeq r1, r0 + bne _021ED6A8 + add r0, sp, #0 + bl OS_GetMacAddress + bl OS_GetTick + mov r2, r1, lsl #0x18 + ldr ip, [sp] + ldr r3, [sp, #4] + mov lr, ip, lsr #0x18 + orr lr, lr, r3, lsl #8 + mvn r1, #0xff000000 + and r1, lr, r1 + orr lr, r1, r0, lsl #24 + mov ip, #0 + orr r2, r2, r0, lsr #8 + and r1, ip, r3, lsr #24 + orr r2, r1, r2 + ldr r0, _021ED6F4 ; =ov00_0221A76C + add r1, sp, #0 + str lr, [sp] + str r2, [sp, #4] + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, _021ED6F8 ; =0x6C078965 + ldr r0, _021ED6F0 ; =ov00_0221A76C + ldr r2, _021ED6FC ; =0x5D588B65 + str r1, [r0, #8] + ldr r1, _021ED700 ; =0x00269EC3 + str r2, [r0, #0xc] + str r1, [r0, #0x10] + str ip, [r0, #0x14] +_021ED6A8: + ldr r1, _021ED6F0 ; =ov00_0221A76C + ldr r2, [r1] + ldmib r1, {r0, r3} + umull lr, ip, r3, r2 + mla ip, r3, r0, ip + ldr r0, [r1, #0xc] + ldr r3, [r1, #0x10] + mla ip, r0, r2, ip + ldr r0, [r1, #0x14] + adds r2, r3, lr + adc r0, r0, ip + str r2, [r1] + str r0, [r1, #4] + cmp r4, #0 + umullne r2, r1, r0, r4 + movne r0, r1 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021ED6F0: .word ov00_0221A76C +_021ED6F4: .word ov00_0221A76C +_021ED6F8: .word 0x6C078965 +_021ED6FC: .word 0x5D588B65 +_021ED700: .word 0x00269EC3 + arm_func_end ov00_021ED5E4 + + arm_func_start ov00_021ED704 +ov00_021ED704: ; 0x021ED704 + ldrh r1, [r0] + mov r2, #0 + cmp r1, #0 + beq _021ED728 +_021ED714: + add r2, r2, #1 + mov r1, r2, lsl #1 + ldrh r1, [r0, r1] + cmp r1, #0 + bne _021ED714 +_021ED728: + mov r0, r2 + bx lr + arm_func_end ov00_021ED704 + + arm_func_start ov00_021ED730 +ov00_021ED730: ; 0x021ED730 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + ldr ip, _021ED994 ; =ov00_0221A784 + mov r6, r1 + mov r5, r2 + mov r4, r3 + str r0, [ip] + bl ov00_021EC210 + ldr r0, _021ED994 ; =ov00_0221A784 + mov r2, #0 + ldr r1, [r0] + ldr r3, _021ED998 ; =ov00_021F2BBC + str r2, [r1] + ldr r1, [r0] + ldr r2, _021ED99C ; =ov00_021EEE34 + str r3, [r1, #4] + ldr r1, [r0] + ldr ip, [sp, #0x24] + str r2, [r1, #8] + cmp ip, #0 + ldr r2, [r0] + ldr r3, _021ED9A0 ; =ov00_021EEE40 + ldr r1, _021ED9A4 ; =ov00_021EF1A8 + str r3, [r2, #0xc] + ldr r0, [r0] + ldr r3, [sp, #0x28] + str r1, [r0, #0x10] + ldr r0, _021ED994 ; =ov00_0221A784 + moveq ip, #0x2000 + ldr r0, [r0] + cmp r3, #0 + str ip, [r0, #0x14] + moveq r3, #0x2000 + ldr r1, _021ED994 ; =ov00_0221A784 + mov r0, #0 + ldr r2, [r1] + ldr ip, _021ED9A8 ; =ov00_0221B430 + str r3, [r2, #0x18] + ldr r2, [r1] + ldr r3, _021ED9AC ; =ov00_0221B530 + str r0, [r2, #0x1c] + ldr r2, [r1] + str r6, [r2, #0x20] + ldr r2, [r1] + str r0, [r2, #0x24] + ldr r2, [r1] + str r0, [r2, #0x28] + ldr r2, [r1] + strb r0, [r2, #0x2c] + ldr r2, [r1] + strb r0, [r2, #0x2d] + ldr r2, [r1] + str r0, [r2, #0x64] + ldr r2, [r1] + str ip, [r2, #0x68] + ldr r2, [r1] + str r3, [r2, #0x6c] + ldr r2, [r1] + str r0, [r2, #0x70] + ldr r2, [r1] + str r0, [r2, #0x74] + ldr r2, [r1] + str r0, [r2, #0x78] + ldr r2, [r1] + str r0, [r2, #0x7c] + ldr r2, [r1] + str r0, [r2, #0x80] + ldr r2, [r1] + str r0, [r2, #0x84] + ldr r2, [r1] + str r0, [r2, #0x88] + ldr r2, [r1] + str r0, [r2, #0x8c] + ldr r2, [r1] + str r0, [r2, #0x90] + ldr r1, [r1] + str r0, [r1, #0x94] + bl ov00_021EE6FC + ldr r0, _021ED994 ; =ov00_0221A784 + ldr r1, [r6, #0x24] + ldr r2, [r0] + ldr r0, _021ED9B0 ; =ov00_021EEA74 + str r1, [sp] + add r1, r2, #0x2e + str r1, [sp, #4] + mov r1, r6 + mov r3, r5 + str r0, [sp, #8] + mov r5, #0 + add r0, r2, #0x98 + add r2, r2, #0x1c + str r5, [sp, #0xc] + bl ov00_021EF1F0 + ldr r0, _021ED994 ; =ov00_0221A784 + ldr r2, [sp, #0x30] + ldr r5, [r0] + ldr r3, [sp, #0x2c] + add r0, r5, #0x318 + add r1, r5, #0x1c + str r2, [sp] + add r2, r5, #0x2e + bl ov00_021EFF48 + ldr r0, _021ED994 ; =ov00_0221A784 + ldr r1, _021ED9A8 ; =ov00_0221B430 + ldr r2, [r0] + ldr r0, _021ED9AC ; =ov00_0221B530 + str r1, [sp] + str r0, [sp, #4] + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x30] + str r1, [sp, #8] + str r0, [sp, #0xc] + add r0, r2, #0x374 + add r1, r2, #0x1c + add r3, r2, #4 + bl ov00_021F1620 + ldr r0, _021ED994 ; =ov00_0221A784 + ldr r0, [r0] + add r0, r0, #0x3f8 + add r0, r0, #0x400 + bl ov00_021F99D4 + mov r0, r4 + bl strlen + cmp r0, #0x100 + movhs r5, #0xff + bhs _021ED934 + mov r0, r4 + bl strlen + mov r5, r0 +_021ED934: + ldr r1, _021ED9A8 ; =ov00_0221B430 + mov r0, r4 + mov r2, r5 + bl MI_CpuCopy8 + ldr r0, [sp, #0x20] + ldr r1, _021ED9A8 ; =ov00_0221B430 + mov r2, #0 + strb r2, [r1, r5] + bl strlen + cmp r0, #0x100 + movhs r4, #0xff + bhs _021ED970 + ldr r0, [sp, #0x20] + bl strlen + mov r4, r0 +_021ED970: + ldr r0, [sp, #0x20] + ldr r1, _021ED9AC ; =ov00_0221B530 + mov r2, r4 + bl MI_CpuCopy8 + ldr r0, _021ED9AC ; =ov00_0221B530 + mov r1, #0 + strb r1, [r0, r4] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021ED994: .word ov00_0221A784 +_021ED998: .word ov00_021F2BBC +_021ED99C: .word ov00_021EEE34 +_021ED9A0: .word ov00_021EEE40 +_021ED9A4: .word ov00_021EF1A8 +_021ED9A8: .word ov00_0221B430 +_021ED9AC: .word ov00_0221B530 +_021ED9B0: .word ov00_021EEA74 + arm_func_end ov00_021ED730 + + arm_func_start ov00_021ED9B4 +ov00_021ED9B4: ; 0x021ED9B4 + stmdb sp!, {r3, lr} + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x384] + cmp r0, #0 + beq _021ED9E8 + bl ov00_02210D18 + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + str r1, [r0, #0x384] +_021ED9E8: + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r2, #0 + ldr r1, [r0] + strb r2, [r1, #0x38c] + ldr r0, [r0] + ldr r0, [r0, #0x458] + cmp r0, #0 + beq _021EDA1C + bl ov00_022136E4 + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + str r1, [r0, #0x458] +_021EDA1C: + bl ov00_021F125C + bl ov00_0220AE60 + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr ip, [r0] + ldr r0, [ip, #0x1c] + cmp r0, #0 + beq _021EDAD0 + mov r1, #0 + mov r2, r1 + mov r3, r1 + add r0, ip, #0x1c + bl ov00_021FFDD0 + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r2, #0 + ldr r0, [r0] + mov r3, r2 + add r0, r0, #0x1c + mov r1, #3 + bl ov00_021FFDD0 + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r2, #0 + ldr r0, [r0] + mov r3, r2 + add r0, r0, #0x1c + mov r1, #1 + bl ov00_021FFDD0 + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r2, #0 + ldr r0, [r0] + mov r1, #2 + add r0, r0, #0x1c + mov r3, r2 + bl ov00_021FFDD0 + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr r0, [r0] + add r0, r0, #0x1c + bl ov00_021FFD9C + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr r0, [r0] + add r0, r0, #0x1c + bl ov00_021FFD80 + mov r1, #0 + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr r0, [r0] + str r1, [r0, #0x1c] +_021EDAD0: + bl ov00_021EF410 + bl ov00_021F05D8 + bl ov00_021F378C + bl ov00_021F9CA8 + ldr r0, _021EDB18 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #0 + beq _021EDB08 + bl ov00_0220CFAC + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + str r1, [r0] +_021EDB08: + ldr r0, _021EDB18 ; =ov00_0221A784 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EDB18: .word ov00_0221A784 + arm_func_end ov00_021ED9B4 + + arm_func_start ov00_021EDB1C +ov00_021EDB1C: ; 0x021EDB1C + stmdb sp!, {r3, lr} + bl ov00_021ECB40 + cmp r0, #0 + beq _021EDB30 + bl ov00_021EE7FC +_021EDB30: + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #0x24] + cmpne r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021EC230 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _021EDD08 +_021EDB6C: ; jump table + b _021EDD08 ; case 0 + b _021EDB88 ; case 1 + b _021EDC9C ; case 2 + b _021EDCA4 ; case 3 + b _021EDCA4 ; case 4 + b _021EDCB4 ; case 5 + b _021EDCC4 ; case 6 +_021EDB88: + bl ov00_021FE3D8 + cmp r0, #1 + beq _021EDBA8 + cmp r0, #2 + beq _021EDC7C + cmp r0, #3 + beq _021EDC8C + b _021EDD08 +_021EDBA8: + ldr r0, _021EDD50 ; =ov00_0221A784 + mov r2, #0 + ldr r0, [r0] + ldr r1, [r0, #0xa0] + add r0, r0, #0x1c + bl ov00_021FFD50 + bl ov00_021EE8B4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EDD50 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + ldr r2, _021EDD54 ; =ov00_021EEC94 + mov r3, r1 + add r0, r0, #0x1c + bl ov00_021FFDD0 + bl ov00_021EE8B4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r2, _021EDD58 ; =ov00_021EECCC + ldr r0, [r0] + mov r1, #3 + add r0, r0, #0x1c + mov r3, #0 + bl ov00_021FFDD0 + bl ov00_021EE8B4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r2, _021EDD5C ; =ov00_021F0290 + ldr r0, [r0] + mov r1, #1 + add r0, r0, #0x1c + mov r3, #0 + bl ov00_021FFDD0 + bl ov00_021EE8B4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r2, _021EDD60 ; =ov00_021F0338 + ldr r0, [r0] + mov r1, #2 + add r0, r0, #0x1c + mov r3, #0 + bl ov00_021FFDD0 + bl ov00_021EE8B4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #2 + bl ov00_021EE800 + bl ov00_021EF274 + b _021EDD08 +_021EDC7C: + ldr r1, _021EDD64 ; =0xFFFFB172 + mov r0, #3 + bl ov00_021EF3C0 + ldmia sp!, {r3, pc} +_021EDC8C: + ldr r1, _021EDD68 ; =0xFFFFB17B + mov r0, #4 + bl ov00_021EF3C0 + ldmia sp!, {r3, pc} +_021EDC9C: + bl ov00_021EF2AC + b _021EDD08 +_021EDCA4: + bl ov00_021F0028 + mov r0, #0 + bl ov00_021F1DE4 + b _021EDD08 +_021EDCB4: + mov r0, #1 + bl ov00_021F1DE4 + bl ov00_021F0028 + b _021EDD08 +_021EDCC4: + bl ov00_021F9A8C + bl ov00_021F0028 + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x389] + cmp r0, #2 + ldrneb r0, [r1, #0x389] + cmpne r0, #3 + bne _021EDCF4 + mov r0, #1 + bl ov00_021F1DE4 + b _021EDD08 +_021EDCF4: + ldr r0, [r1] + cmp r0, #0 + beq _021EDD08 + mov r0, #0 + bl ov00_021F1DE4 +_021EDD08: + ldr r0, _021EDD50 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x38c] + cmp r0, #1 + ldmneia sp!, {r3, pc} + ldr r0, [r1, #0x384] + cmp r0, #0 + beq _021EDD3C + bl ov00_02210D18 + ldr r0, _021EDD50 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + str r1, [r0, #0x384] +_021EDD3C: + ldr r0, _021EDD50 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x38c] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EDD50: .word ov00_0221A784 +_021EDD54: .word ov00_021EEC94 +_021EDD58: .word ov00_021EECCC +_021EDD5C: .word ov00_021F0290 +_021EDD60: .word ov00_021F0338 +_021EDD64: .word 0xFFFFB172 +_021EDD68: .word 0xFFFFB17B + arm_func_end ov00_021EDB1C + + arm_func_start ov00_021EDD6C +ov00_021EDD6C: ; 0x021EDD6C + stmdb sp!, {r4, r5, r6, lr} + movs r4, r0 + mov r6, r2 + mov r5, r3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl ov00_021EC230 + cmp r0, #0 + bne _021EDDA4 + ldr r0, _021EDE6C ; =ov00_0221A784 + ldr r2, [r0] + ldr r1, [r2, #0x24] + cmp r1, #0 + beq _021EDDAC +_021EDDA4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021EDDAC: + str r6, [r2, #0x70] + ldr r1, [r0] + cmp r4, #0 + str r5, [r1, #0x74] + ldrneh r1, [r4] + cmpne r1, #0 + moveq r5, #0 + beq _021EDE18 + ldr r1, [r0] + mov r0, #0 + add r1, r1, #0x2e + mov r2, #0x34 + bl MIi_CpuClear16 + mov r0, r4 + bl ov00_021ED704 + cmp r0, #0x19 + movhi r5, #0x19 + bhi _021EDE00 + mov r0, r4 + bl ov00_021ED704 + mov r5, r0 +_021EDE00: + ldr r1, _021EDE6C ; =ov00_0221A784 + mov r0, r4 + ldr r1, [r1] + mov r2, r5, lsl #1 + add r1, r1, #0x2e + bl MIi_CpuCopy16 +_021EDE18: + ldr r0, _021EDE6C ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + add r0, r0, r5, lsl #1 + strh r1, [r0, #0x2e] + bl ov00_021EC724 + cmp r0, #4 + beq _021EDE4C + ldr r1, _021EDE70 ; =0xFFFF1596 + mov r0, #2 + bl ov00_021EF3C0 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_021EDE4C: + mov r0, #1 + bl ov00_021EE800 + ldr r0, _021EDE6C ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x68] + bl ov00_021FE228 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EDE6C: .word ov00_0221A784 +_021EDE70: .word 0xFFFF1596 + arm_func_end ov00_021EDD6C + + arm_func_start ov00_021EDE74 +ov00_021EDE74: ; 0x021EDE74 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC230 + cmp r0, #0 + bne _021EDEB0 + ldr r0, _021EDF14 ; =ov00_0221A784 + ldr r2, [r0] + ldr r1, [r2, #0x24] + cmp r1, #3 + blt _021EDEB0 + cmp r1, #4 + bne _021EDEBC +_021EDEB0: + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021EDEBC: + str r6, [r2, #0x78] + ldr r1, [r0] + mov r0, #4 + str r5, [r1, #0x7c] + bl ov00_021EE800 + ldr r0, _021EDF14 ; =ov00_0221A784 + ldr r1, [sp, #0x20] + ldr r3, [r0] + ldr r0, [sp, #0x24] + str r4, [sp] + str r1, [sp, #4] + ldr r4, [sp, #0x28] + str r0, [sp, #8] + ldr r2, _021EDF18 ; =ov00_021EEAD4 + add r0, r3, #0xe0 + add r1, r3, #0x1e0 + mov r3, #0 + str r4, [sp, #0xc] + bl ov00_021F018C + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EDF14: .word ov00_0221A784 +_021EDF18: .word ov00_021EEAD4 + arm_func_end ov00_021EDE74 + + arm_func_start ov00_021EDF1C +ov00_021EDF1C: ; 0x021EDF1C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC230 + cmp r0, #0 + bne _021EDF54 + ldr r0, _021EDFB4 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #3 + beq _021EDF60 +_021EDF54: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EDF60: + bl ov00_021EE6FC + ldr r1, _021EDFB4 ; =ov00_0221A784 + mov r0, #5 + ldr r2, [r1] + str r5, [r2, #0x80] + ldr r1, [r1] + str r4, [r1, #0x84] + bl ov00_021EE800 + ldr r1, [sp, #0x20] + sub r0, r7, #1 + ldr r4, [sp, #0x24] + str r1, [sp] + ldr r2, _021EDFB8 ; =ov00_021EEB1C + mov r1, r6 + and r0, r0, #0xff + mov r3, #0 + str r4, [sp, #4] + bl ov00_021F1938 + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EDFB4: .word ov00_0221A784 +_021EDFB8: .word ov00_021EEB1C + arm_func_end ov00_021EDF1C + + arm_func_start ov00_021EDFBC +ov00_021EDFBC: ; 0x021EDFBC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC230 + cmp r0, #0 + bne _021EDFF0 + ldr r0, _021EE04C ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #3 + beq _021EDFF8 +_021EDFF0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EDFF8: + bl ov00_021EE6FC + ldr r1, _021EE04C ; =ov00_0221A784 + mov r2, #0 + ldr r3, [r1] + mov r0, #5 + str r6, [r3, #0x88] + ldr r3, [r1] + str r5, [r3, #0x8c] + ldr r1, [r1] + strb r2, [r1, #0x2c] + bl ov00_021EE800 + sub r0, r7, #1 + ldr r5, [sp, #0x18] + ldr r1, _021EE050 ; =ov00_021EEB1C + mov r3, r4 + and r0, r0, #0xff + mov r2, #0 + str r5, [sp] + bl ov00_021F1B24 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EE04C: .word ov00_0221A784 +_021EE050: .word ov00_021EEB1C + arm_func_end ov00_021EDFBC + + arm_func_start ov00_021EE054 +ov00_021EE054: ; 0x021EE054 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x220 + mvn ip, #0 + mov r7, r0 + mov r6, r1 + mov r4, r2 + mov r5, r3 + str ip, [sp, #0xc] + bl ov00_021EC230 + cmp r0, #0 + bne _021EE094 + ldr r0, _021EE238 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #3 + beq _021EE0A0 +_021EE094: + add sp, sp, #0x220 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EE0A0: + bl ov00_021EE6FC + ldr r1, _021EE238 ; =ov00_0221A784 + mov r0, #5 + ldr r2, [r1] + str r6, [r2, #0x88] + ldr r1, [r1] + str r4, [r1, #0x8c] + bl ov00_021EE800 + mov r0, r7 + bl ov00_021F03BC + movs r4, r0 + beq _021EE0EC + ldr r0, _021EE238 ; =ov00_0221A784 + mov r1, r4 + ldr r0, [r0] + add r0, r0, #0x1c + bl ov00_022005B0 + cmp r0, #0 + bne _021EE0F4 +_021EE0EC: + mov r5, #0xb + b _021EE1C0 +_021EE0F4: + ldr r0, _021EE238 ; =ov00_0221A784 + add r2, sp, #0xc + ldr r0, [r0] + mov r1, r4 + add r0, r0, #0x1c + bl ov00_02200540 + ldr r0, _021EE238 ; =ov00_0221A784 + ldr r1, [sp, #0xc] + ldr r0, [r0] + add r2, sp, #0x10 + add r0, r0, #0x1c + bl ov00_02200400 + ldr r0, [sp, #0x14] + cmp r0, #6 + movne r5, #0xb + bne _021EE1C0 + ldr r0, _021EE23C ; =ov00_022179EC + mov r6, #0x30 + add r1, sp, #8 + add r2, sp, #0x18 + mov r3, #0x2f + strb r6, [sp, #8] + bl ov00_021ED4E8 + add r0, sp, #8 + mov r1, #0 + mov r2, #0xa + bl strtoul + and r6, r0, #0xff + ldr r0, _021EE240 ; =ov00_022179F0 + add r1, sp, #8 + add r2, sp, #0x18 + mov r3, #0x2f + bl ov00_021ED4E8 + add r0, sp, #8 + mov r1, #0 + mov r2, #0xa + bl strtoul + and r0, r0, #0xff + cmp r0, r6 + moveq r5, #0xd + beq _021EE1C0 + ldr r6, [sp, #0x238] + ldr r1, _021EE244 ; =ov00_021EEB1C + mov r0, r4 + mov r3, r5 + mov r2, #0 + str r6, [sp] + bl ov00_021F1BCC + add sp, sp, #0x220 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EE1C0: + mov r0, r5 + mov r1, #0 + bl ov00_021EC24C + ldr r0, _021EE238 ; =ov00_0221A784 + mov r1, #0 + ldr r4, [r0] + mov r0, r5 + str r1, [sp] + ldr r2, [r4, #0x8c] + mov r3, r1 + str r2, [sp, #4] + ldr r4, [r4, #0x88] + mov r2, #1 + blx r4 + ldr r0, _021EE238 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + beq _021EE22C + ldr r0, [r0, #0x24] + cmp r0, #5 + bne _021EE22C + mov r0, #3 + bl ov00_021EE800 + ldr r1, _021EE248 ; =ov00_022179F4 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 +_021EE22C: + mov r0, #1 + add sp, sp, #0x220 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EE238: .word ov00_0221A784 +_021EE23C: .word ov00_022179EC +_021EE240: .word ov00_022179F0 +_021EE244: .word ov00_021EEB1C +_021EE248: .word ov00_022179F4 + arm_func_end ov00_021EE054 + + arm_func_start ov00_021EE24C +ov00_021EE24C: ; 0x021EE24C + ldr r2, _021EE274 ; =ov00_0221A784 + ldr r3, [r2] + cmp r3, #0 + moveq r0, #0 + bxeq lr + str r0, [r3, #0x90] + ldr r2, [r2] + mov r0, #1 + str r1, [r2, #0x94] + bx lr + .balign 4, 0 +_021EE274: .word ov00_0221A784 + arm_func_end ov00_021EE24C + + arm_func_start ov00_021EE278 +ov00_021EE278: ; 0x021EE278 + stmdb sp!, {r3, lr} + ldr r0, _021EE314 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + beq _021EE2B0 + bl ov00_021EC230 + cmp r0, #0 + bne _021EE2B0 + ldr r0, _021EE314 ; =ov00_0221A784 + ldr r2, [r0] + ldr r0, [r2, #0x24] + cmp r0, #5 + cmpne r0, #6 + beq _021EE2B8 +_021EE2B0: + mvn r0, #0 + ldmia sp!, {r3, pc} +_021EE2B8: + ldrb r0, [r2, #0x381] + cmp r0, #0 + bne _021EE2E8 + ldr r1, _021EE318 ; =ov00_022179F4 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 + bl ov00_021F125C + mov r0, #3 + bl ov00_021EE800 + mov r0, #1 + ldmia sp!, {r3, pc} +_021EE2E8: + mov r1, #1 + ldr r0, _021EE314 ; =ov00_0221A784 + strb r1, [r2, #0x2d] + ldr r0, [r0] + ldr r0, [r0] + bl ov00_0220D238 + ldr r1, _021EE314 ; =ov00_0221A784 + mov r0, #0 + ldr r1, [r1] + strb r0, [r1, #0x2d] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE314: .word ov00_0221A784 +_021EE318: .word ov00_022179F4 + arm_func_end ov00_021EE278 + + arm_func_start ov00_021EE31C +ov00_021EE31C: ; 0x021EE31C + stmdb sp!, {r4, lr} + ldr r1, _021EE380 ; =ov00_0221A784 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + beq _021EE358 + bl ov00_021EC230 + cmp r0, #0 + bne _021EE358 + ldr r0, _021EE380 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #5 + cmpne r0, #6 + beq _021EE360 +_021EE358: + mvn r0, #0 + ldmia sp!, {r4, pc} +_021EE360: + mov r0, r4 + bl ov00_021EE64C + cmp r0, #0 + mvneq r0, #1 + ldmeqia sp!, {r4, pc} + bl ov00_0220D218 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EE380: .word ov00_0221A784 + arm_func_end ov00_021EE31C + + arm_func_start ov00_021EE384 +ov00_021EE384: ; 0x021EE384 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _021EE444 ; =ov00_0221A784 + mov r6, r0 + ldr r0, [r1] + cmp r0, #0 + cmpne r6, #0 + beq _021EE3C4 + bl ov00_021EC230 + cmp r0, #0 + bne _021EE3C4 + ldr r0, _021EE444 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x24] + cmp r0, #5 + cmpne r0, #6 + beq _021EE3CC +_021EE3C4: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021EE3CC: + mov r5, #0 + mov r4, #1 +_021EE3D4: + ldr r0, [r6] + tst r0, r4, lsl r5 + beq _021EE420 + bl ov00_021EE490 + cmp r5, r0 + bne _021EE400 + mvn r0, r4, lsl r5 + ldr r1, [r6] + and r0, r1, r0 + str r0, [r6] + b _021EE420 +_021EE400: + mov r0, r5 + bl ov00_021EE31C + cmp r0, #0 + beq _021EE420 + mvn r0, r4, lsl r5 + ldr r1, [r6] + and r0, r1, r0 + str r0, [r6] +_021EE420: + add r0, r5, #1 + and r5, r0, #0xff + cmp r5, #0x20 + blo _021EE3D4 + ldr r0, [r6] + cmp r0, #0 + movne r0, #0 + mvneq r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EE444: .word ov00_0221A784 + arm_func_end ov00_021EE384 + + arm_func_start ov00_021EE448 +ov00_021EE448: ; 0x021EE448 + stmdb sp!, {r3, lr} + ldr r0, _021EE48C ; =ov00_0221A784 + ldr r1, [r0] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldrb r0, [r1, #0x389] + cmp r0, #2 + ldrneb r0, [r1, #0x389] + cmpne r0, #3 + bne _021EE480 + bl ov00_021F3570 + add r0, r0, #1 + ldmia sp!, {r3, pc} +_021EE480: + bl ov00_021F3550 + add r0, r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE48C: .word ov00_0221A784 + arm_func_end ov00_021EE448 + + arm_func_start ov00_021EE490 +ov00_021EE490: ; 0x021EE490 + ldr r0, _021EE4A8 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + ldrneb r0, [r0, #0x2c] + moveq r0, #0 + bx lr + .balign 4, 0 +_021EE4A8: .word ov00_0221A784 + arm_func_end ov00_021EE490 + + arm_func_start ov00_021EE4AC +ov00_021EE4AC: ; 0x021EE4AC + stmdb sp!, {r3, lr} + ldr r2, _021EE4F8 ; =ov00_0221A784 + ldr r1, [r2] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r1, r1, #0x244 + add r1, r1, #0x400 + str r1, [r0] + ldr r2, [r2] + ldrb r1, [r2, #0x389] + cmp r1, #2 + ldrneb r1, [r2, #0x389] + cmpne r1, #3 + bne _021EE4F0 + bl ov00_021F3618 + ldmia sp!, {r3, pc} +_021EE4F0: + bl ov00_021F35E4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE4F8: .word ov00_0221A784 + arm_func_end ov00_021EE4AC + + arm_func_start ov00_021EE4FC +ov00_021EE4FC: ; 0x021EE4FC + stmdb sp!, {r3, lr} + ldr r0, _021EE52C ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r0, sp, #0 + bl ov00_021EE4AC + mov r1, r0 + ldr r0, [sp] + bl ov00_021EE880 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE52C: .word ov00_0221A784 + arm_func_end ov00_021EE4FC + + arm_func_start ov00_021EE530 +ov00_021EE530: ; 0x021EE530 + stmdb sp!, {r3, lr} + ldr r1, _021EE564 ; =ov00_0221A784 + ldr r1, [r1] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r2, [r1, #0x664] + mov r1, #1 + tst r2, r1, lsl r0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021EE7B4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE564: .word ov00_0221A784 + arm_func_end ov00_021EE530 + + arm_func_start ov00_021EE568 +ov00_021EE568: ; 0x021EE568 + ldr r0, _021EE580 ; =ov00_0221A784 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #0x24] + moveq r0, #0 + bx lr + .balign 4, 0 +_021EE580: .word ov00_0221A784 + arm_func_end ov00_021EE568 + + arm_func_start ov00_021EE584 +ov00_021EE584: ; 0x021EE584 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _021EE63C ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, pc} + mov r0, #0x4000 + bl ov00_021ED5E4 + add r0, r0, #0xc000 + mov r1, r0, lsl #0x10 + ldr r3, _021EE63C ; =ov00_0221A784 + mov r0, #0 + mov r2, r0 + mov r1, r1, lsr #0x10 + ldr r4, [r3] + bl ov00_0220F724 + ldr r1, _021EE640 ; =ov00_021EF1B4 + ldr r2, _021EE63C ; =ov00_0221A784 + str r1, [sp] + mov r1, r0 + ldr r0, [r2] + ldr r2, [r4, #0x14] + ldr r3, [r4, #0x18] + bl ov00_0220CF98 + mov r4, r0 + bl ov00_021EE9D0 + cmp r0, #0 + addne sp, sp, #4 + movne r0, r4 + ldmneia sp!, {r3, r4, pc} + ldr r0, _021EE63C ; =ov00_0221A784 + ldr r1, _021EE644 ; =ov00_021F2974 + ldr r0, [r0] + ldr r0, [r0] + bl ov00_0220CFF4 + ldr r0, _021EE63C ; =ov00_0221A784 + ldr r1, _021EE648 ; =ov00_021F2880 + ldr r0, [r0] + ldr r0, [r0] + bl ov00_0220D29C + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_021EE63C: .word ov00_0221A784 +_021EE640: .word ov00_021EF1B4 +_021EE644: .word ov00_021F2974 +_021EE648: .word ov00_021F2880 + arm_func_end ov00_021EE584 + + arm_func_start ov00_021EE64C +ov00_021EE64C: ; 0x021EE64C + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _021EE6A8 ; =ov00_0221A784 + mov r6, r0 + ldr r0, [r1] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r4, _021EE6AC ; =ov00_0221A78C + mov r5, #0 +_021EE670: + ldr r0, [r4, r5, lsl #2] + cmp r0, #0 + beq _021EE694 + bl ov00_0220D2E0 + ldrb r0, [r0, #1] + cmp r6, r0 + ldreq r0, _021EE6AC ; =ov00_0221A78C + ldreq r0, [r0, r5, lsl #2] + ldmeqia sp!, {r4, r5, r6, pc} +_021EE694: + add r5, r5, #1 + cmp r5, #0x20 + blt _021EE670 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EE6A8: .word ov00_0221A784 +_021EE6AC: .word ov00_0221A78C + arm_func_end ov00_021EE64C + + arm_func_start ov00_021EE6B0 +ov00_021EE6B0: ; 0x021EE6B0 + stmdb sp!, {r3, lr} + bl ov00_0220D2E0 + ldrb r0, [r0, #1] + ldmia sp!, {r3, pc} + arm_func_end ov00_021EE6B0 + + arm_func_start ov00_021EE6C0 +ov00_021EE6C0: ; 0x021EE6C0 + stmdb sp!, {r3, lr} + bl ov00_0220D2E0 + ldrb r0, [r0] + ldmia sp!, {r3, pc} + arm_func_end ov00_021EE6C0 + + arm_func_start ov00_021EE6D0 +ov00_021EE6D0: ; 0x021EE6D0 + ldr r2, _021EE6F8 ; =ov00_0221A78C + mov r0, #0 +_021EE6D8: + ldr r1, [r2, r0, lsl #2] + cmp r1, #0 + bxeq lr + add r0, r0, #1 + cmp r0, #0x20 + blt _021EE6D8 + mvn r0, #0 + bx lr + .balign 4, 0 +_021EE6F8: .word ov00_0221A78C + arm_func_end ov00_021EE6D0 + + arm_func_start ov00_021EE6FC +ov00_021EE6FC: ; 0x021EE6FC + stmdb sp!, {r3, lr} + ldr r1, _021EE724 ; =ov00_0221A78C + mov r0, #0 + mov r2, #0x80 + bl MIi_CpuClear32 + ldr r1, _021EE728 ; =ov00_0221A80C + mov r0, #0 + mov r2, #0x100 + bl MIi_CpuClear32 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE724: .word ov00_0221A78C +_021EE728: .word ov00_0221A80C + arm_func_end ov00_021EE6FC + + arm_func_start ov00_021EE72C +ov00_021EE72C: ; 0x021EE72C + ldr r1, _021EE738 ; =ov00_0221A78C + add r0, r1, r0, lsl #2 + bx lr + .balign 4, 0 +_021EE738: .word ov00_0221A78C + arm_func_end ov00_021EE72C + + arm_func_start ov00_021EE73C +ov00_021EE73C: ; 0x021EE73C + stmdb sp!, {r3, lr} + cmp r1, #0 + mov r3, #0 + ble _021EE774 + ldr r2, _021EE7A0 ; =ov00_0221A784 + ldr ip, [r2] +_021EE754: + add r2, ip, r3, lsl #2 + ldr r2, [r2, #0x468] + cmp r0, r2 + beq _021EE774 + add r2, r3, #1 + and r3, r2, #0xff + cmp r3, r1 + blt _021EE754 +_021EE774: + cmp r3, r1 + movge r0, #0 + ldmgeia sp!, {r3, pc} + ldr r0, _021EE7A0 ; =ov00_0221A784 + ldr r0, [r0] + add r0, r0, r3 + ldrb r0, [r0, #0x644] + bl ov00_021EE64C + bl ov00_021EE6C0 + bl ov00_021EE72C + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EE7A0: .word ov00_0221A784 + arm_func_end ov00_021EE73C + + arm_func_start ov00_021EE7A4 +ov00_021EE7A4: ; 0x021EE7A4 + ldr r1, _021EE7B0 ; =ov00_0221A80C + add r0, r1, r0, lsl #3 + bx lr + .balign 4, 0 +_021EE7B0: .word ov00_0221A80C + arm_func_end ov00_021EE7A4 + + arm_func_start ov00_021EE7B4 +ov00_021EE7B4: ; 0x021EE7B4 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _021EE7F8 ; =ov00_0221A78C + mov r6, r0 + mov r5, #0 +_021EE7C4: + ldr r0, [r4, r5, lsl #2] + cmp r0, #0 + beq _021EE7E4 + bl ov00_0220D2E0 + ldrb r0, [r0, #1] + cmp r6, r0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} +_021EE7E4: + add r5, r5, #1 + cmp r5, #0x20 + blt _021EE7C4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EE7F8: .word ov00_0221A78C + arm_func_end ov00_021EE7B4 + + arm_func_start ov00_021EE7FC +ov00_021EE7FC: ; 0x021EE7FC + bx lr + arm_func_end ov00_021EE7FC + + arm_func_start ov00_021EE800 +ov00_021EE800: ; 0x021EE800 + ldr r1, _021EE81C ; =ov00_0221A784 + ldr r3, [r1] + ldr r2, [r3, #0x24] + str r2, [r3, #0x28] + ldr r1, [r1] + str r0, [r1, #0x24] + bx lr + .balign 4, 0 +_021EE81C: .word ov00_0221A784 + arm_func_end ov00_021EE800 + + arm_func_start ov00_021EE820 +ov00_021EE820: ; 0x021EE820 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + add r0, sp, #0 + bl ov00_021F35E4 + mov r1, r0 + cmp r1, #0 + mov r0, #0 + ble _021EE864 + ldr r3, [sp] +_021EE848: + ldrb r2, [r3] + cmp r4, r2 + beq _021EE864 + add r0, r0, #1 + cmp r0, r1 + add r3, r3, #1 + blt _021EE848 +_021EE864: + cmp r0, r1 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + bl ov00_021F3398 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_021EE820 + + arm_func_start ov00_021EE880 +ov00_021EE880: ; 0x021EE880 + stmdb sp!, {r3, lr} + mov ip, #0 + mov lr, ip + cmp r1, #0 + ble _021EE8AC + mov r3, #1 +_021EE898: + ldrb r2, [r0, lr] + add lr, lr, #1 + cmp lr, r1 + orr ip, ip, r3, lsl r2 + blt _021EE898 +_021EE8AC: + mov r0, ip + ldmia sp!, {r3, pc} + arm_func_end ov00_021EE880 + + arm_func_start ov00_021EE8B4 +ov00_021EE8B4: ; 0x021EE8B4 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r6, #4 + addls pc, pc, r6, lsl #2 + b _021EE910 +_021EE8D0: ; jump table + b _021EE910 ; case 0 + b _021EE8E4 ; case 1 + b _021EE8F0 ; case 2 + b _021EE8FC ; case 3 + b _021EE908 ; case 4 +_021EE8E4: + mov r5, #9 + sub r4, r5, #0xa + b _021EE910 +_021EE8F0: + mov r5, #9 + sub r4, r5, #0xb + b _021EE910 +_021EE8FC: + mov r5, #6 + sub r4, r5, #0x10 + b _021EE910 +_021EE908: + mov r5, #6 + sub r4, r5, #0x1a +_021EE910: + ldr r0, _021EE9BC ; =ov00_0221A784 + ldr r1, [r0] + ldr r0, [r1, #0x24] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _021EE9A0 +_021EE928: ; jump table + b _021EE9A0 ; case 0 + b _021EE940 ; case 1 + b _021EE958 ; case 2 + b _021EE9A0 ; case 3 + b _021EE994 ; case 4 + b _021EE97C ; case 5 +_021EE940: + ldr r1, _021EE9C0 ; =0xFFFF11B8 + mov r0, r5 + add r4, r4, r1 + mov r1, r4 + bl ov00_021EF3C0 + b _021EE9A8 +_021EE958: + ldr r1, [r1, #0x9c] + ldr r0, _021EE9C0 ; =0xFFFF11B8 + cmp r1, #1 + add r4, r4, r0 + bge _021EE9A8 + mov r0, r5 + mov r1, r4 + bl ov00_021EF3C0 + b _021EE9A8 +_021EE97C: + ldr r1, _021EE9C4 ; =0xFFFEC398 + mov r0, r5 + add r4, r4, r1 + mov r1, r4 + bl ov00_021F2EE4 + b _021EE9A8 +_021EE994: + ldr r0, _021EE9C8 ; =0xFFFEEAA8 + add r4, r4, r0 + b _021EE9A8 +_021EE9A0: + ldr r0, _021EE9CC ; =0xFFFE9C88 + add r4, r4, r0 +_021EE9A8: + mov r0, r5 + mov r1, r4 + bl ov00_021F0238 + mov r0, r6 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EE9BC: .word ov00_0221A784 +_021EE9C0: .word 0xFFFF11B8 +_021EE9C4: .word 0xFFFEC398 +_021EE9C8: .word 0xFFFEEAA8 +_021EE9CC: .word 0xFFFE9C88 + arm_func_end ov00_021EE8B4 + + arm_func_start ov00_021EE9D0 +ov00_021EE9D0: ; 0x021EE9D0 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #7 + addls pc, pc, r4, lsl #2 + b _021EEA54 +_021EE9EC: ; jump table + b _021EEA54 ; case 0 + b _021EEA0C ; case 1 + b _021EEA18 ; case 2 + b _021EEA28 ; case 3 + b _021EEA34 ; case 4 + b _021EEA18 ; case 5 + b _021EEA40 ; case 6 + b _021EEA4C ; case 7 +_021EEA0C: + mov r0, #9 + sub r2, r0, #0xa + b _021EEA54 +_021EEA18: + mov r0, #0 + mov r2, r0 + mov r4, r0 + b _021EEA54 +_021EEA28: + mov r0, #6 + sub r2, r0, #0x10 + b _021EEA54 +_021EEA34: + mov r0, #6 + sub r2, r0, #0x24 + b _021EEA54 +_021EEA40: + mov r0, #6 + sub r2, r0, #0x4c + b _021EEA54 +_021EEA4C: + mov r0, #6 + sub r2, r0, #0x56 +_021EEA54: + cmp r0, #0 + beq _021EEA68 + ldr r1, _021EEA70 ; =0xFFFEFA48 + add r1, r2, r1 + bl ov00_021EF3C0 +_021EEA68: + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EEA70: .word 0xFFFEFA48 + arm_func_end ov00_021EE9D0 + + arm_func_start ov00_021EEA74 +ov00_021EEA74: ; 0x021EEA74 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _021EEAA0 + ldr r1, _021EEAD0 ; =ov00_0221A784 + mov r0, #3 + ldr r1, [r1] + str r4, [r1, #0x64] + bl ov00_021EE800 + bl ov00_021F0468 + b _021EEAA8 +_021EEAA0: + mov r0, #0 + bl ov00_021EE800 +_021EEAA8: + ldr r0, _021EEAD0 ; =ov00_0221A784 + ldr r0, [r0] + ldr r3, [r0, #0x70] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r0, #0x74] + mov r0, r5 + mov r1, r4 + blx r3 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EEAD0: .word ov00_0221A784 + arm_func_end ov00_021EEA74 + + arm_func_start ov00_021EEAD4 +ov00_021EEAD4: ; 0x021EEAD4 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021EEB18 ; =ov00_0221A784 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + ldr r0, [r0, #0x28] + cmp r0, #4 + beq _021EEAF8 + bl ov00_021EE800 +_021EEAF8: + ldr r1, _021EEB18 ; =ov00_0221A784 + mov r0, r5 + ldr r3, [r1] + mov r1, r4 + ldr r2, [r3, #0x7c] + ldr r3, [r3, #0x78] + blx r3 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EEB18: .word ov00_0221A784 + arm_func_end ov00_021EEAD4 + + arm_func_start ov00_021EEB1C +ov00_021EEB1C: ; 0x021EEB1C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _021EEB64 + cmp r6, #0 + beq _021EEB64 + ldr r0, _021EEC90 ; =ov00_0221A784 + ldr r0, [r0] + ldr r0, [r0, #0x514] + cmp r0, #0 + bne _021EEBC8 + bl ov00_021F2FA0 + mov r0, #3 + bl ov00_021EE800 + b _021EEBC8 +_021EEB64: + cmp r7, #0 + bne _021EEBC8 + mov r0, #6 + bl ov00_021EE800 + ldr r0, _021EEC90 ; =ov00_0221A784 + mov r2, #0 + ldr r3, [r0] + ldrb r0, [r3, #0x381] + cmp r0, #0 + blt _021EEBC8 + ldr r1, [r3, #0x64] +_021EEB90: + add r0, r3, r2, lsl #2 + ldr r0, [r0, #0x468] + cmp r1, r0 + bne _021EEBB8 + ldr r0, _021EEC90 ; =ov00_0221A784 + ldr r1, [r0] + add r0, r1, r2 + ldrb r0, [r0, #0x644] + strb r0, [r1, #0x2c] + b _021EEBC8 +_021EEBB8: + ldrb r0, [r3, #0x381] + add r2, r2, #1 + cmp r2, r0 + ble _021EEB90 +_021EEBC8: + ldr r0, _021EEC90 ; =ov00_0221A784 + ldr r0, [r0] + ldrb r1, [r0, #0x381] + add r0, r0, #0x244 + add r0, r0, #0x400 + add r1, r1, #1 + bl ov00_021EE880 + ldr r1, _021EEC90 ; =ov00_0221A784 + ldr r1, [r1] + str r0, [r1, #0x664] + bl ov00_021F3590 + ldr r0, _021EEC90 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x389] + cmp r0, #2 + ldrneb r0, [r1, #0x389] + cmpne r0, #3 + bne _021EEC44 + ldr r0, _021EEC90 ; =ov00_0221A784 + ldr r1, [sp, #0x20] + ldr r3, [r0] + mov r0, r7 + str r1, [sp] + ldr r2, [r3, #0x8c] + mov r1, r6 + str r2, [sp, #4] + ldr r6, [r3, #0x88] + mov r2, r5 + mov r3, r4 + blx r6 + b _021EEC58 +_021EEC44: + ldr r2, [r1, #0x84] + ldr r3, [r1, #0x80] + mov r0, r7 + mov r1, r6 + blx r3 +_021EEC58: + cmp r7, #0 + ldrne r0, _021EEC90 ; =ov00_0221A784 + ldrne r0, [r0] + cmpne r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r0, #0x24] + cmp r0, #5 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #3 + bl ov00_021EE800 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EEC90: .word ov00_0221A784 + arm_func_end ov00_021EEB1C + + arm_func_start ov00_021EEC94 +ov00_021EEC94: ; 0x021EEC94 + stmdb sp!, {r3, lr} + ldr r1, [r1, #4] + ldr r0, _021EECC4 ; =0x00000603 + cmp r1, r0 + ldrne r0, _021EECC8 ; =0x00000901 + cmpne r1, r0 + addne r0, r0, #0x200 + cmpne r1, r0 + ldmeqia sp!, {r3, pc} + mov r0, #3 + bl ov00_021EE8B4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EECC4: .word 0x00000603 +_021EECC8: .word 0x00000901 + arm_func_end ov00_021EEC94 + + arm_func_start ov00_021EECCC +ov00_021EECCC: ; 0x021EECCC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + add r4, sp, #0 + mov r3, #0 + mov r5, r1 + strb r3, [r4] + strb r3, [r4, #1] + strb r3, [r4, #2] + strb r3, [r4, #3] + strb r3, [r4, #4] + strb r3, [r4, #5] + strb r3, [r4, #6] + strb r3, [r4, #7] + strb r3, [r4, #8] + strb r3, [r4, #9] + strb r3, [r4, #0xa] + strb r3, [r4, #0xb] + ldr r4, [r5, #8] + mov r6, r0 + bl ov00_021F02DC + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, _021EEE28 ; =ov00_022179F8 + bl strlen + mov r2, r0 + ldr r1, _021EEE28 ; =ov00_022179F8 + mov r0, r4 + bl memcmp + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, _021EEE28 ; =ov00_022179F8 + bl strlen + add r4, r4, r0 + mov r0, r4 + mov r1, #0x76 + bl strchr + sub r7, r0, r4 + add r0, sp, #0 + mov r1, r4 + mov r2, r7 + bl strncpy + cmp r7, #0xa + addhi sp, sp, #0xc + ldmhiia sp!, {r4, r5, r6, r7, pc} + add r0, sp, #0 + mov r1, #0 + mov r2, #0xa + bl strtoul + cmp r0, #3 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, _021EEE2C ; =ov00_02217A00 + add r1, r7, #1 + add r4, r4, r1 + bl strlen + mov r2, r0 + ldr r1, _021EEE2C ; =ov00_02217A00 + mov r0, r4 + bl memcmp + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, _021EEE30 ; =ov00_0221A784 + ldr r1, [r0] + ldr r0, [r1, #0x24] + cmp r0, #5 + beq _021EEE04 + cmp r0, #6 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldrb r0, [r1, #0x389] + cmp r0, #2 + ldrneb r0, [r1, #0x389] + cmpne r0, #3 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} +_021EEE04: + ldr r0, _021EEE2C ; =ov00_02217A00 + bl strlen + mov r2, r0 + ldr r1, [r5] + mov r0, r6 + add r2, r4, r2 + bl ov00_021F2E40 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_021EEE28: .word ov00_022179F8 +_021EEE2C: .word ov00_02217A00 +_021EEE30: .word ov00_0221A784 + arm_func_end ov00_021EECCC + + arm_func_start ov00_021EEE34 +ov00_021EEE34: ; 0x021EEE34 + ldr ip, _021EEE3C ; =ov00_021F9A10 + bx ip + .balign 4, 0 +_021EEE3C: .word ov00_021F9A10 + arm_func_end ov00_021EEE34 + + arm_func_start ov00_021EEE40 +ov00_021EEE40: ; 0x021EEE40 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r5, #0 + mov fp, r0 + mov sb, r1 + mov sl, r5 + bl ov00_021F3804 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #4 + addls pc, pc, sb, lsl #2 + b _021EEEA4 +_021EEE74: ; jump table + b _021EEE88 ; case 0 + b _021EEE88 ; case 1 + b _021EEE90 ; case 2 + b _021EEE90 ; case 3 + b _021EEE9C ; case 4 +_021EEE88: + mov r8, r5 + b _021EEEA4 +_021EEE90: + mov r8, #6 + ldr r6, _021EF190 ; =0xFFFFE250 + b _021EEEA4 +_021EEE9C: + ldr r6, _021EF194 ; =0xFFFFE24F + mov r8, #9 +_021EEEA4: + cmp r8, #0 + bne _021EEF60 + mov r0, fp + bl ov00_0220D2E0 + movs r5, r0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _021EF198 ; =ov00_0221A784 + ldrb r4, [r5, #1] + ldr r0, [r0] + mov r7, #1 + ldr r0, [r0, #0x664] + tst r0, r7, lsl r4 + mov r0, r4 + moveq r7, #0 + bl ov00_021F9C20 + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x389] + cmp r0, #2 + cmpeq sb, #0 + beq _021EEF0C + ldrb r0, [r1, #0x389] + cmp r0, #3 + cmpeq r4, #0 + bne _021EEF10 +_021EEF0C: + mov sl, #1 +_021EEF10: + mov r0, r4 + bl ov00_021EE820 + ldr r1, _021EF198 ; =ov00_0221A784 + ldrb r5, [r5] + ldr r3, _021EF19C ; =ov00_0221A78C + mov fp, #0 + str fp, [r3, r5, lsl #2] + ldr r2, [r1] + mov r5, r0 + ldrb r1, [r2, #0x381] + cmp r1, #0 + subne r0, r1, #1 + strneb r0, [r2, #0x381] + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x388] + cmp r0, #0 + ldrneb r0, [r1, #0x388] + subne r0, r0, #1 + strneb r0, [r1, #0x388] +_021EEF60: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x2d] + cmp r0, #0 + ldreq r0, [r1, #0x24] + cmpeq r0, #6 + cmpeq r7, #0 + bne _021EEFA8 + ldrb r0, [r1, #0x389] + cmp r0, #2 + cmpeq r8, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov00_021F36BC + mov r0, r5 + bl ov00_021F3310 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021EEFA8: + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov00_021F3194 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r8, #0 + beq _021EEFE4 + ldr r1, _021EF1A0 ; =0xFFFEC780 + mov r0, r8 + add r1, r6, r1 + bl ov00_021EC24C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021EEFE4: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x2d] + cmp r0, #0 + bne _021EF054 + ldrb r0, [r1, #0x389] + cmp r0, #2 + ldrneb r0, [r1, #0x389] + cmpne r0, #3 + bne _021EF054 + ldr r2, _021EF198 ; =ov00_0221A784 + ldr r1, [r2] + ldrb r0, [r1, #0x381] + add r6, r0, #2 + add r3, r1, r6, lsl #2 + ldr r3, [r3, #0x468] + cmp r3, #0 + beq _021EF054 + add r3, r1, r6 + ldrb r3, [r3, #0x644] + add r0, r0, #1 + add r0, r1, r0 + strb r3, [r0, #0x644] + ldr r0, [r2] + ldrb r1, [r0, #0x381] + add r0, r1, #1 + add r1, r1, #3 + bl ov00_021F3398 +_021EF054: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x389] + cmp r0, #2 + bne _021EF09C + ldrb r0, [r1, #0x2d] + cmp r0, #0 + bne _021EF07C + bl ov00_021F36BC + b _021EF0B8 +_021EF07C: + ldrb r0, [r1, #0x381] + cmp r0, #0 + bne _021EF0B8 + ldr r1, _021EF1A4 ; =ov00_022179F4 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 + b _021EF0B8 +_021EF09C: + ldrb r0, [r1, #0x381] + cmp r0, #0 + bne _021EF0B8 + ldr r1, _021EF1A4 ; =ov00_022179F4 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 +_021EF0B8: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x389] + cmp r0, #0 + ldrneb r0, [r1, #0x389] + cmpne r0, #1 + bne _021EF0F0 + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r2, [r0] + ldrb r1, [r2, #0x388] + strb r1, [r2, #0x38a] + ldr r0, [r0] + ldr r0, [r0, #0x384] + bl ov00_02210CBC +_021EF0F0: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r6, [r0] + ldr r0, [r6, #0x90] + cmp r0, #0 + cmpne r7, #0 + beq _021EF148 + cmp sb, #0 + moveq r7, #1 + mov r0, r5 + movne r7, #0 + bl ov00_021F0404 + str r0, [sp] + ldr r1, [r6, #0x94] + ldr r0, _021EF198 ; =ov00_0221A784 + str r1, [sp, #4] + ldr r1, [r0] + mov r0, r8 + ldr r5, [r1, #0x90] + mov r1, r7 + mov r2, sl + mov r3, r4 + blx r5 +_021EF148: + ldr r0, _021EF198 ; =ov00_0221A784 + ldr r1, [r0] + ldrb r0, [r1, #0x2d] + cmp r0, #0 + ldreqb r0, [r1, #0x389] + cmpeq r0, #2 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [r1, #0x381] + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov00_021F125C + bl ov00_021F2FA0 + mov r0, #3 + bl ov00_021EE800 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021EF190: .word 0xFFFFE250 +_021EF194: .word 0xFFFFE24F +_021EF198: .word ov00_0221A784 +_021EF19C: .word ov00_0221A78C +_021EF1A0: .word 0xFFFEC780 +_021EF1A4: .word ov00_022179F4 + arm_func_end ov00_021EEE40 + + arm_func_start ov00_021EF1A8 +ov00_021EF1A8: ; 0x021EF1A8 + ldr ip, _021EF1B0 ; =ov00_021F9A4C + bx ip + .balign 4, 0 +_021EF1B0: .word ov00_021F9A4C + arm_func_end ov00_021EF1A8 + + arm_func_start ov00_021EF1B4 +ov00_021EF1B4: ; 0x021EF1B4 + stmdb sp!, {r3, lr} + bl ov00_0220D294 + bl ov00_021FFA60 + ldr r2, _021EF1E8 ; =ov00_0221A784 + ldr r1, _021EF1EC ; =0xFFFE8515 + str r0, [r2, #4] + mov r0, #9 + bl ov00_021EC24C + ldr r0, _021EF1E8 ; =ov00_0221A784 + mov r1, #0 + ldr r0, [r0] + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EF1E8: .word ov00_0221A784 +_021EF1EC: .word 0xFFFE8515 + arm_func_end ov00_021EF1B4 + + arm_func_start ov00_021EF1F0 +ov00_021EF1F0: ; 0x021EF1F0 + stmdb sp!, {r4, r5, r6, lr} + ldr ip, _021EF270 ; =ov00_0221A90C + mov r6, r1 + mov r5, r2 + mov r1, #0 + mov r2, #0x280 + mov r4, r3 + str r0, [ip, #4] + bl MI_CpuFill8 + ldr r0, _021EF270 ; =ov00_0221A90C + mov r2, #0 + ldr r1, [r0, #4] + ldr ip, [sp, #0x10] + str r5, [r1] + ldr r1, [r0, #4] + ldr r5, [sp, #0x14] + str r2, [r1, #4] + ldr r1, [r0, #4] + ldr r3, [sp, #0x18] + str r4, [r1, #8] + ldr r1, [r0, #4] + ldr r2, [sp, #0x1c] + str ip, [r1, #0xc] + ldr r1, [r0, #4] + str r5, [r1, #0x10] + ldr r1, [r0, #4] + str r3, [r1, #0x14] + ldr r1, [r0, #4] + str r2, [r1, #0x18] + ldr r0, [r0, #4] + str r6, [r0, #0x1c] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021EF270: .word ov00_0221A90C + arm_func_end ov00_021EF1F0 + + arm_func_start ov00_021EF274 +ov00_021EF274: ; 0x021EF274 + stmdb sp!, {r3, lr} + ldr r0, _021EF2A4 ; =ov00_021EF640 + mov r1, #0 + bl ov00_021EF6F4 + ldr r0, _021EF2A8 ; =ov00_0221A90C + mov r3, #1 + ldr r2, [r0, #4] + mov r1, #0 + str r3, [r2, #4] + ldr r0, [r0, #4] + str r1, [r0, #0x30] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EF2A4: .word ov00_021EF640 +_021EF2A8: .word ov00_0221A90C + arm_func_end ov00_021EF274 + + arm_func_start ov00_021EF2AC +ov00_021EF2AC: ; 0x021EF2AC + stmdb sp!, {r3, lr} + ldr r0, _021EF394 ; =ov00_0221A90C + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021EC230 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021EF394 ; =ov00_0221A90C + ldr r1, [r0, #4] + ldr r0, [r1, #4] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_021EF2E4: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _021EF2FC ; case 1 + b _021EF304 ; case 2 + b _021EF304 ; case 3 + b _021EF304 ; case 4 + ldmia sp!, {r3, pc} ; case 5 +_021EF2FC: + bl ov00_021EF8C0 + ldmia sp!, {r3, pc} +_021EF304: + ldr r0, [r1] + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + beq _021EF31C + bl ov00_021FFD9C +_021EF31C: + ldr r0, _021EF394 ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r0, [r0, #0x30] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl OS_GetTick + ldr r3, _021EF394 ; =ov00_0221A90C + ldr r2, _021EF398 ; =0x000082EA + ldr ip, [r3, #4] + mov r3, #0 + ldr lr, [ip, #0x34] + ldr ip, [ip, #0x38] + subs lr, r0, lr + sbc r0, r1, ip + mov r1, r0, lsl #6 + orr r1, r1, lr, lsr #26 + mov r0, lr, lsl #6 + bl _ll_udiv + ldr r2, _021EF39C ; =0x0000EA60 + cmp r1, #0 + cmpeq r0, r2 + ldmlsia sp!, {r3, pc} + ldr r1, _021EF3A0 ; =0xFFFF1172 + mov r0, #6 + bl ov00_021EF3C0 + ldr r0, _021EF394 ; =ov00_0221A90C + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x30] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EF394: .word ov00_0221A90C +_021EF398: .word 0x000082EA +_021EF39C: .word 0x0000EA60 +_021EF3A0: .word 0xFFFF1172 + arm_func_end ov00_021EF2AC + + arm_func_start ov00_021EF3A4 +ov00_021EF3A4: ; 0x021EF3A4 + ldr r0, _021EF3BC ; =ov00_0221A90C + ldr r0, [r0, #4] + cmp r0, #0 + ldrne r0, [r0, #0x1c] + moveq r0, #0 + bx lr + .balign 4, 0 +_021EF3BC: .word ov00_0221A90C + arm_func_end ov00_021EF3A4 + + arm_func_start ov00_021EF3C0 +ov00_021EF3C0: ; 0x021EF3C0 + stmdb sp!, {r4, lr} + ldr r2, _021EF40C ; =ov00_0221A90C + mov r4, r0 + ldr r2, [r2, #4] + cmp r2, #0 + cmpne r4, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021EC24C + ldr r0, _021EF40C ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r3, [r0, #0x14] + cmp r3, #0 + beq _021EF404 + ldr r2, [r0, #0x18] + mov r0, r4 + mov r1, #0 + blx r3 +_021EF404: + bl ov00_021EF46C + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EF40C: .word ov00_0221A90C + arm_func_end ov00_021EF3C0 + + arm_func_start ov00_021EF410 +ov00_021EF410: ; 0x021EF410 + stmdb sp!, {r3, lr} + ldr r0, _021EF468 ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r0, [r0, #0x24] + cmp r0, #0 + beq _021EF458 + bl ov00_021E7D48 + bl ov00_021E7DD4 + ldr r1, _021EF468 ; =ov00_0221A90C + mov r0, #0 + ldr r1, [r1, #4] + mov r2, r0 + ldr r1, [r1, #0x24] + bl ov00_021EC2EC + ldr r0, _021EF468 ; =ov00_0221A90C + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x24] +_021EF458: + ldr r0, _021EF468 ; =ov00_0221A90C + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EF468: .word ov00_0221A90C + arm_func_end ov00_021EF410 + + arm_func_start ov00_021EF46C +ov00_021EF46C: ; 0x021EF46C + ldr r0, _021EF490 ; =ov00_0221A90C + ldr r2, [r0, #4] + cmp r2, #0 + bxeq lr + mov r1, #0 + str r1, [r2, #4] + ldr r0, [r0, #4] + str r1, [r0, #0x30] + bx lr + .balign 4, 0 +_021EF490: .word ov00_0221A90C + arm_func_end ov00_021EF46C + + arm_func_start ov00_021EF494 +ov00_021EF494: ; 0x021EF494 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #4 + addls pc, pc, r4, lsl #2 + b _021EF4F0 +_021EF4B0: ; jump table + b _021EF4F0 ; case 0 + b _021EF4C4 ; case 1 + b _021EF4D0 ; case 2 + b _021EF4DC ; case 3 + b _021EF4E8 ; case 4 +_021EF4C4: + mov r0, #9 + sub r2, r0, #0xa + b _021EF4F0 +_021EF4D0: + mov r0, #9 + sub r2, r0, #0xb + b _021EF4F0 +_021EF4DC: + mov r0, #6 + sub r2, r0, #0x10 + b _021EF4F0 +_021EF4E8: + mov r0, #6 + sub r2, r0, #0x1a +_021EF4F0: + ldr r1, _021EF504 ; =0xFFFF11B8 + add r1, r2, r1 + bl ov00_021EF3C0 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021EF504: .word 0xFFFF11B8 + arm_func_end ov00_021EF494 + + arm_func_start ov00_021EF508 +ov00_021EF508: ; 0x021EF508 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r2, _021EF630 ; =ov00_0221A90C + mov lr, #0 + ldr r3, [r2, #4] + mov r4, r1 + str lr, [r3, #0x30] + mov r7, r0 + ldr r0, [r4] + cmp r0, #0 + bne _021EF624 + ldr ip, [r2, #4] + mov r6, r4 + add r5, ip, #0x260 + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r0, [ip, #4] + cmp r0, #2 + bne _021EF5EC + ldr r1, [ip, #0x1c] + ldr r0, [r4, #4] + ldr r1, [r1, #0x1c] + cmp r1, r0 + bne _021EF5D8 + ldr r1, _021EF634 ; =ov00_02217A04 + mov r3, #5 + mov r2, lr + mov r0, #1 + str r3, [ip, #4] + bl ov00_021F04A0 + bl ov00_021EF494 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _021EF630 ; =ov00_0221A90C + ldr r1, [r4, #4] + ldr r3, [r0, #4] + mov r0, #0 + ldr r2, [r3, #0x18] + ldr r3, [r3, #0x14] + blx r3 + bl ov00_021EE584 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #4] + bl ov00_021F179C + add sp, sp, #8 + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EF5D8: + ldr r1, _021EF638 ; =0xFFFF15A0 + mov r0, #6 + bl ov00_021EF3C0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EF5EC: + cmp r0, #3 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _021EF63C ; =ov00_021EFAC8 + mov r0, r7 + stmia sp, {r1, lr} + ldr r1, [r4, #4] + mov r2, lr + mov r3, lr + bl ov00_02200020 + bl ov00_021EF494 + add sp, sp, #8 + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021EF624: + bl ov00_021EF494 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021EF630: .word ov00_0221A90C +_021EF634: .word ov00_02217A04 +_021EF638: .word 0xFFFF15A0 +_021EF63C: .word ov00_021EFAC8 + arm_func_end ov00_021EF508 + + arm_func_start ov00_021EF640 +ov00_021EF640: ; 0x021EF640 + ldr ip, _021EF650 ; =ov00_021EF658 + ldr r2, _021EF654 ; =ov00_021EF508 + mov r3, #2 + bx ip + .balign 4, 0 +_021EF650: .word ov00_021EF658 +_021EF654: .word ov00_021EF508 + arm_func_end ov00_021EF640 + + arm_func_start ov00_021EF658 +ov00_021EF658: ; 0x021EF658 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr r4, _021EF6F0 ; =ov00_0221A90C + mov r6, r1 + ldr r4, [r4, #4] + mov r1, r0 + add r0, r4, #0x48 + mov r5, r2 + mov r4, r3 + bl strcpy + ldr r0, _021EF6F0 ; =ov00_0221A90C + mov r1, r6 + ldr r0, [r0, #4] + add r0, r0, #0x148 + bl strcpy + ldr r0, _021EF6F0 ; =ov00_0221A90C + ldr r6, [r0, #4] + bl OS_GetTick + str r0, [r6, #0x34] + str r1, [r6, #0x38] + mov r3, #1 + ldr r0, _021EF6F0 ; =ov00_0221A90C + str r3, [r6, #0x30] + ldr r2, [r0, #4] + mov r1, #0 + stmia sp, {r1, r5} + str r1, [sp, #8] + ldr r0, [r2] + add r1, r2, #0x48 + add r2, r2, #0x148 + bl ov00_021FFE20 + bl ov00_021EF494 + cmp r0, #0 + ldreq r0, _021EF6F0 ; =ov00_0221A90C + ldreq r0, [r0, #4] + streq r4, [r0, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021EF6F0: .word ov00_0221A90C + arm_func_end ov00_021EF658 + + arm_func_start ov00_021EF6F4 +ov00_021EF6F4: ; 0x021EF6F4 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x48 + mov r5, r0 + mov r4, r1 + add r0, sp, #0 + mov r1, #0 + mov r2, #0x48 + bl MI_CpuFill8 + ldr r0, _021EF8A4 ; =ov00_0221A90C + str r5, [r0, #8] + str r4, [r0] + ldr r0, [r0, #4] + ldr r0, [r0, #0x1c] + bl DWCi_Acc_IsAuthentic + cmp r0, #0 + beq _021EF754 + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r1, [r0, #4] + ldr r0, [r1, #0x1c] + add r2, r1, #0x248 + ldr r1, [r0, #0x24] + add r0, r0, #0x10 + bl DWCi_Acc_LoginIdToUserName + b _021EF808 +_021EF754: + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r0, [r0, #4] + add r0, r0, #0x3c + bl DWCi_Acc_IsValidLoginId + cmp r0, #0 + bne _021EF7BC + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r0, [r0, #0x1c] + add r0, r0, #4 + bl DWCi_Acc_CheckConsoleUserId + cmp r0, #0 + beq _021EF7A8 + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r1, [r0, #4] + ldr r0, [r1, #0x1c] + add r3, r1, #0x3c + add r0, r0, #4 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + b _021EF7F0 +_021EF7A8: + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r0, [r0, #4] + add r0, r0, #0x3c + bl DWCi_Acc_CreateTempLoginId + b _021EF7F0 +_021EF7BC: + bl OS_GetTick + ldr r2, _021EF8A8 ; =0x6C078965 + ldr r3, _021EF8AC ; =0x5D588B65 + umull ip, r4, r0, r2 + mla r4, r0, r3, r4 + ldr r3, _021EF8A4 ; =ov00_0221A90C + ldr r0, _021EF8B0 ; =0x00269EC3 + mla r4, r1, r2, r4 + adds r0, ip, r0 + ldr r3, [r3, #4] + adc r1, r4, #0 + add r0, r3, #0x3c + bl DWCi_Acc_SetPlayerId +_021EF7F0: + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r2, [r0, #4] + ldr r1, [r2, #0xc] + add r0, r2, #0x3c + add r2, r2, #0x248 + bl DWCi_Acc_LoginIdToUserName +_021EF808: + ldr r0, _021EF8A4 ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r0, [r0, #0x10] + bl ov00_021ED704 + ldr r1, _021EF8A4 ; =ov00_0221A90C + mov r2, r0, lsl #1 + ldr r1, [r1, #4] + add r2, r2, #2 + ldr r0, [r1, #0x10] + add r1, sp, #0 + bl MI_CpuCopy8 + ldr r1, _021EF8A4 ; =ov00_0221A90C + add r0, sp, #0x34 + ldr r1, [r1, #4] + add r1, r1, #0x51 + add r1, r1, #0x200 + bl strcpy + ldr r4, _021EF8B4 ; =ov00_021EC2A8 + ldr r3, _021EF8B8 ; =ov00_021EC2EC + ldr r1, _021EF8BC ; =0x00001C14 + mov r0, #0 + mov r2, #4 + str r4, [sp, #0x40] + str r3, [sp, #0x44] + bl ov00_021EC2B8 + ldr r1, _021EF8A4 ; =ov00_0221A90C + mov r4, r0 + ldr r0, [r1, #4] + str r4, [r0, #0x24] + bl OS_GetTick + ldr r2, _021EF8A4 ; =ov00_0221A90C + ldr r2, [r2, #4] + str r0, [r2, #0x28] + str r1, [r2, #0x2c] + mov r1, r4 + add r0, sp, #0 + bl ov00_021E7B70 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EF8A4: .word ov00_0221A90C +_021EF8A8: .word 0x6C078965 +_021EF8AC: .word 0x5D588B65 +_021EF8B0: .word 0x00269EC3 +_021EF8B4: .word ov00_021EC2A8 +_021EF8B8: .word ov00_021EC2EC +_021EF8BC: .word 0x00001C14 + arm_func_end ov00_021EF6F4 + + arm_func_start ov00_021EF8C0 +ov00_021EF8C0: ; 0x021EF8C0 + stmdb sp!, {r3, lr} + sub sp, sp, #0x3d0 + bl ov00_021E7E5C + cmp r0, #0x15 + bne _021EF990 + add r0, sp, #0x20c + bl ov00_021E7EA8 + ldr r0, _021EFAB0 ; =ov00_0221A90C + add r1, sp, #0x200 + ldr r0, [r0, #4] + add r1, r1, #0x56 + add r0, r0, #0x48 + bl strcpy + ldr r0, _021EFAB0 ; =ov00_0221A90C + add r1, sp, #0x300 + ldr r0, [r0, #4] + add r1, r1, #0x83 + add r0, r0, #0x148 + bl strcpy + bl ov00_021E7DD4 + ldr r1, _021EFAB0 ; =ov00_0221A90C + mov r0, #0 + ldr r1, [r1, #4] + mov r2, r0 + ldr r1, [r1, #0x24] + bl ov00_021EC2EC + ldr r0, _021EFAB0 ; =ov00_0221A90C + mov r2, #0 + ldr r1, [r0, #4] + str r2, [r1, #0x24] + ldr r0, [r0, #4] + ldr r0, [r0, #0x1c] + bl DWCi_Acc_IsAuthentic + cmp r0, #0 + beq _021EF96C + ldr r0, _021EFAB0 ; =ov00_0221A90C + ldr r2, [r0] + ldmib r0, {r1, r3} + add r0, r1, #0x48 + add r1, r1, #0x148 + blx r3 + add sp, sp, #0x3d0 + ldmia sp!, {r3, pc} +_021EF96C: + ldr r0, _021EFAB0 ; =ov00_0221A90C + ldr r2, _021EFAB4 ; =ov00_021EF508 + ldr r1, [r0, #4] + mov r3, #3 + add r0, r1, #0x48 + add r1, r1, #0x148 + bl ov00_021EF658 + add sp, sp, #0x3d0 + ldmia sp!, {r3, pc} +_021EF990: + bl ov00_021E7E5C + cmp r0, #0 + addeq sp, sp, #0x3d0 + ldmeqia sp!, {r3, pc} + bl OS_GetTick + ldr r3, _021EFAB0 ; =ov00_0221A90C + ldr r2, _021EFAB8 ; =0x000082EA + ldr ip, [r3, #4] + mov r3, #0 + ldr lr, [ip, #0x28] + ldr ip, [ip, #0x2c] + subs lr, r0, lr + sbc r0, r1, ip + mov r1, r0, lsl #6 + orr r1, r1, lr, lsr #26 + mov r0, lr, lsl #6 + bl _ll_udiv + ldr r2, _021EFABC ; =0x00002710 + cmp r1, #0 + cmpeq r0, r2 + bls _021EFA2C + add r0, sp, #0x48 + bl ov00_021E7EA8 + bl ov00_021E7DD4 + ldr r1, _021EFAB0 ; =ov00_0221A90C + mov r0, #0 + ldr r1, [r1, #4] + mov r2, r0 + ldr r1, [r1, #0x24] + bl ov00_021EC2EC + ldr r0, _021EFAB0 ; =ov00_0221A90C + mov r2, #0 + ldr r1, [r0, #4] + mov r0, #2 + str r2, [r1, #0x24] + ldr r1, [sp, #0x48] + bl ov00_021EF3C0 + add sp, sp, #0x3d0 + ldmia sp!, {r3, pc} +_021EFA2C: + bl ov00_021E7DD4 + add r0, sp, #0 + mov r1, #0 + mov r2, #0x48 + bl MI_CpuFill8 + ldr r0, _021EFAB0 ; =ov00_0221A90C + ldr r0, [r0, #4] + ldr r0, [r0, #0x10] + bl ov00_021ED704 + ldr r1, _021EFAB0 ; =ov00_0221A90C + mov r2, r0, lsl #1 + ldr r1, [r1, #4] + add r2, r2, #2 + ldr r0, [r1, #0x10] + add r1, sp, #0 + bl MI_CpuCopy8 + ldr r1, _021EFAB0 ; =ov00_0221A90C + add r0, sp, #0x34 + ldr r1, [r1, #4] + add r1, r1, #0x51 + add r1, r1, #0x200 + bl strcpy + ldr r2, _021EFAC0 ; =ov00_021EC2A8 + ldr r0, _021EFAB0 ; =ov00_0221A90C + str r2, [sp, #0x40] + ldr r2, _021EFAC4 ; =ov00_021EC2EC + ldr r1, [r0, #4] + str r2, [sp, #0x44] + ldr r1, [r1, #0x24] + add r0, sp, #0 + bl ov00_021E7B70 + add sp, sp, #0x3d0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021EFAB0: .word ov00_0221A90C +_021EFAB4: .word ov00_021EF508 +_021EFAB8: .word 0x000082EA +_021EFABC: .word 0x00002710 +_021EFAC0: .word ov00_021EC2A8 +_021EFAC4: .word ov00_021EC2EC + arm_func_end ov00_021EF8C0 + + arm_func_start ov00_021EFAC8 +ov00_021EFAC8: ; 0x021EFAC8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x48 + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + addne sp, sp, #0x48 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, _021EFC5C ; =ov00_0221A90C + ldr r2, [r1, #4] + ldr r1, [r2, #4] + cmp r1, #3 + bne _021EFBA0 + ldrsb r1, [r4, #0x8e] + cmp r1, #0 + bne _021EFB78 + ldr r0, [r2, #0x1c] + ldr r1, [r2, #0xc] + add r2, sp, #0x32 + add r0, r0, #4 + bl DWCi_Acc_LoginIdToUserName + ldr r1, _021EFC60 ; =0x00000705 + add r2, sp, #0x32 + mov r0, r5 + bl ov00_022000FC + bl ov00_021EF494 + cmp r0, #0 + addne sp, sp, #0x48 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021EFC5C ; =ov00_0221A90C + mov r3, #4 + ldr r1, [r0, #4] + ldr r0, _021EFC64 ; =ov00_021EFAC8 + mov r2, #0 + str r3, [r1, #4] + stmia sp, {r0, r2} + ldr r1, [r4, #4] + mov r0, r5 + mov r3, r2 + bl ov00_02200020 + bl ov00_021EF494 + add sp, sp, #0x48 + cmp r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EFB78: + bl ov00_021FFF24 + ldr r0, _021EFC68 ; =ov00_021EF640 + mov r1, #0 + bl ov00_021EF6F4 + ldr r0, _021EFC5C ; =ov00_0221A90C + mov r1, #1 + ldr r0, [r0, #4] + add sp, sp, #0x48 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} +_021EFBA0: + cmp r1, #4 + addne sp, sp, #0x48 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r2, #0x1c] + ldr r1, [r2, #0xc] + add r2, sp, #0x1d + add r0, r0, #4 + bl DWCi_Acc_LoginIdToUserName + add r1, sp, #0x1d + add r0, r4, #0x8e + bl strcmp + cmp r0, #0 + bne _021EFC30 + ldr r0, _021EFC5C ; =ov00_0221A90C + add r2, sp, #8 + ldr r0, [r0, #4] + ldr r1, [r0, #0xc] + add r0, r0, #0x3c + bl DWCi_Acc_LoginIdToUserName + ldr r0, _021EFC5C ; =ov00_0221A90C + ldr r2, [r4, #4] + ldr r1, [r0, #4] + ldr r0, [r1, #0x1c] + add r1, r1, #0x3c + bl DWCi_Acc_SetLoginIdToUserData + ldr r1, _021EFC5C ; =ov00_0221A90C + mov r3, #2 + ldr r2, [r1, #4] + mov r0, r5 + str r3, [r2, #4] + ldr r1, [r1, #4] + mov r2, #0 + add r1, r1, #0x260 + bl ov00_021EF508 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_021EFC30: + ldr r0, _021EFC64 ; =ov00_021EFAC8 + mov r2, #0 + stmia sp, {r0, r2} + ldr r1, [r4, #4] + mov r0, r5 + mov r3, r2 + bl ov00_02200020 + bl ov00_021EF494 + cmp r0, #0 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EFC5C: .word ov00_0221A90C +_021EFC60: .word 0x00000705 +_021EFC64: .word ov00_021EFAC8 +_021EFC68: .word ov00_021EF640 + arm_func_end ov00_021EFAC8 + + arm_func_start ov00_021EFC6C +ov00_021EFC6C: ; 0x021EFC6C + ldr r0, _021EFC94 ; =ov00_0221A90C + ldr r0, [r0, #4] + cmp r0, #0 + beq _021EFC8C + ldr r0, [r0, #4] + cmp r0, #5 + moveq r0, #1 + bxeq lr +_021EFC8C: + mov r0, #0 + bx lr + .balign 4, 0 +_021EFC94: .word ov00_0221A90C + arm_func_end ov00_021EFC6C + + arm_func_start ov00_021EFC98 +ov00_021EFC98: ; 0x021EFC98 + ldr ip, _021EFCAC ; =ov00_021EFCB0 + mov r3, r1 + mov r1, #0 + mov r2, r1 + bx ip + .balign 4, 0 +_021EFCAC: .word ov00_021EFCB0 + arm_func_end ov00_021EFC98 + + arm_func_start ov00_021EFCB0 +ov00_021EFCB0: ; 0x021EFCB0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x214 + mov r6, r1 + add r1, sp, #4 + mov r4, r2 + mov r5, r3 + bl ov00_021F0B8C + cmp r0, #0 + beq _021EFDA0 + ldr r0, [sp, #8] + cmp r0, #6 + bne _021EFD64 + cmp r6, #0 + beq _021EFD20 + ldr r0, _021EFDC4 ; =ov00_02217A08 + add r1, sp, #0 + add r2, sp, #0xc + mov r3, #0x2f + bl ov00_021ED4E8 + cmp r0, #0 + movle r0, #0 + strleb r0, [r6] + ble _021EFD20 + add r0, sp, #0 + mov r1, #0 + mov r2, #0xa + bl strtoul + strb r0, [r6] +_021EFD20: + cmp r4, #0 + beq _021EFD7C + ldr r0, _021EFDC8 ; =ov00_02217A0C + add r1, sp, #0 + add r2, sp, #0xc + mov r3, #0x2f + bl ov00_021ED4E8 + cmp r0, #0 + movle r0, #0 + strleb r0, [r4] + ble _021EFD7C + add r0, sp, #0 + mov r1, #0 + mov r2, #0xa + bl strtoul + strb r0, [r4] + b _021EFD7C +_021EFD64: + cmp r6, #0 + movne r0, #0 + strneb r0, [r6] + cmp r4, #0 + movne r0, #0 + strneb r0, [r4] +_021EFD7C: + cmp r5, #0 + beq _021EFD90 + add r1, sp, #0x10c + mov r0, r5 + bl strcpy +_021EFD90: + ldr r0, [sp, #8] + add sp, sp, #0x214 + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, pc} +_021EFDA0: + cmp r6, #0 + movne r0, #0 + strneb r0, [r6] + cmp r4, #0 + movne r0, #0 + strneb r0, [r4] + mov r0, #0 + add sp, sp, #0x214 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021EFDC4: .word ov00_02217A08 +_021EFDC8: .word ov00_02217A0C + arm_func_end ov00_021EFCB0 + + arm_func_start ov00_021EFDCC +ov00_021EFDCC: ; 0x021EFDCC + stmdb sp!, {r3, lr} + mov r3, r1 + mov r1, #0 + str r2, [sp] + mov r2, r1 + bl ov00_021EFDE8 + ldmia sp!, {r3, pc} + arm_func_end ov00_021EFDCC + + arm_func_start ov00_021EFDE8 +ov00_021EFDE8: ; 0x021EFDE8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x100 + mov r6, r3 + add r3, sp, #0 + ldr r5, [sp, #0x110] + bl ov00_021EFCB0 + movs r4, r0 + mvneq r1, #0 + addeq sp, sp, #0x100 + streq r1, [r5] + ldmeqia sp!, {r4, r5, r6, pc} + add r0, sp, #0 + bl strlen + mov r2, #0 + mov r1, r0 + add r0, sp, #0 + mov r3, r2 + bl ov00_021EBF90 + str r0, [r5] + cmp r6, #0 + ldrne r5, [r5] + mvnne r0, #0 + cmpne r5, r0 + addeq sp, sp, #0x100 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, sp, #0 + bl strlen + mov r1, r0 + add r0, sp, #0 + mov r2, r6 + mov r3, r5 + bl ov00_021EBF90 + mov r0, r4 + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021EFDE8 + + arm_func_start ov00_021EFE78 +ov00_021EFE78: ; 0x021EFE78 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x100 + ldr r2, _021EFF00 ; =ov00_0221A918 + mov r5, r0 + ldr r0, [r2, #8] + mov r4, r1 + cmp r0, #0 + beq _021EFEA4 + bl ov00_021EFC6C + cmp r0, #0 + bne _021EFEB0 +_021EFEA4: + add sp, sp, #0x100 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021EFEB0: + add r2, sp, #0 + mov r0, r5 + mov r1, r4 + mov r3, #0xff + bl ov00_021EBE08 + mvn r3, #0 + cmp r0, r3 + addeq sp, sp, #0x100 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + add r2, sp, #0 + mov r1, #0 + strb r1, [r2, r0] + mov r0, r3 + bl ov00_021F04A0 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x100 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021EFF00: .word ov00_0221A918 + arm_func_end ov00_021EFE78 + + arm_func_start ov00_021EFF04 +ov00_021EFF04: ; 0x021EFF04 + ldr r2, _021EFF2C ; =ov00_0221A918 + ldr r3, [r2, #8] + cmp r3, #0 + moveq r0, #0 + bxeq lr + str r0, [r3, #0x44] + ldr r2, [r2, #8] + mov r0, #1 + str r1, [r2, #0x48] + bx lr + .balign 4, 0 +_021EFF2C: .word ov00_0221A918 + arm_func_end ov00_021EFF04 + + arm_func_start ov00_021EFF30 +ov00_021EFF30: ; 0x021EFF30 + ldr ip, _021EFF38 ; =ov00_021EBE08 + bx ip + .balign 4, 0 +_021EFF38: .word ov00_021EBE08 + arm_func_end ov00_021EFF30 + + arm_func_start ov00_021EFF3C +ov00_021EFF3C: ; 0x021EFF3C + ldr ip, _021EFF44 ; =ov00_021EBF90 + bx ip + .balign 4, 0 +_021EFF44: .word ov00_021EBF90 + arm_func_end ov00_021EFF3C + + arm_func_start ov00_021EFF48 +ov00_021EFF48: ; 0x021EFF48 + stmdb sp!, {r4, lr} + ldr lr, _021F0024 ; =ov00_0221A918 + mov ip, #0 + str r0, [lr, #8] + str ip, [r0] + ldr r4, [lr, #8] + ldr r0, [sp, #8] + str r1, [r4, #4] + ldr r1, [lr, #8] + str ip, [r1, #8] + ldr r1, [lr, #8] + str ip, [r1, #0xc] + str ip, [r1, #0x10] + str r0, [r1, #0x14] + ldr r0, [lr, #8] + str r3, [r0, #0x18] + ldr r0, [lr, #8] + strb ip, [r0, #0x1c] + ldr r0, [lr, #8] + strb ip, [r0, #0x1d] + ldr r0, [lr, #8] + strb ip, [r0, #0x1e] + ldr r0, [lr, #8] + strb ip, [r0, #0x1f] + ldr r0, [lr, #8] + str ip, [r0, #0x20] + ldr r0, [lr, #8] + str ip, [r0, #0x24] + ldr r0, [lr, #8] + str r2, [r0, #0x28] + ldr r0, [lr, #8] + str ip, [r0, #0x2c] + ldr r0, [lr, #8] + str ip, [r0, #0x30] + ldr r0, [lr, #8] + str ip, [r0, #0x34] + ldr r0, [lr, #8] + str ip, [r0, #0x38] + ldr r0, [lr, #8] + str ip, [r0, #0x3c] + ldr r0, [lr, #8] + str ip, [r0, #0x40] + ldr r0, [lr, #8] + str ip, [r0, #0x44] + ldr r0, [lr, #8] + str ip, [r0, #0x48] + ldr r0, [lr, #8] + str ip, [r0, #0x4c] + ldr r0, [lr, #8] + str ip, [r0, #0x50] + ldr r0, [lr, #8] + str ip, [r0, #0x54] + ldr r0, [lr, #8] + str ip, [r0, #0x58] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F0024: .word ov00_0221A918 + arm_func_end ov00_021EFF48 + + arm_func_start ov00_021F0028 +ov00_021F0028: ; 0x021F0028 + stmdb sp!, {r3, lr} + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r0, [r0, #8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021EC230 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r1, [r0, #8] + ldr r0, [r1, #0x18] + cmp r0, #0 + bne _021F0078 + ldr r0, [r1, #4] + cmp r0, #0 + ldrne r0, [r0] + cmpne r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021F05EC + ldmia sp!, {r3, pc} +_021F0078: + bl ov00_021F1248 + cmp r0, #0 + bne _021F0090 + bl ov00_0220AED0 + cmp r0, #0 + beq _021F00C8 +_021F0090: + ldr r0, _021F0188 ; =ov00_0221A918 + mov r1, #1 + str r1, [r0] + mov r1, #0 + str r1, [r0, #0xc] + bl ov00_0220AEF0 + ldr r0, _021F0188 ; =ov00_0221A918 + mov r2, #0 + str r2, [r0] + ldr r1, [r0, #0xc] + cmp r1, #1 + bne _021F00C8 + str r2, [r0, #0xc] + bl ov00_0220AE60 +_021F00C8: + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #4] + cmp r0, #0 + ldrne r0, [r0] + cmpne r0, #0 + beq _021F0164 + bl ov00_021F05EC + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r3, [r0, #8] + ldr r0, [r3] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r3, #0x18] + cmp r0, #0 + ldrneb r2, [r3, #0x1e] + cmpne r2, #3 + beq _021F0164 + ldr r1, [r3, #8] + cmp r1, #7 + bls _021F0164 + cmp r2, #1 + bhi _021F0134 + ldr r1, [r3, #0x14] + bl ov00_021F06A8 +_021F0134: + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r3, [r0, #8] + ldrb r2, [r3, #0x1c] + ldr r1, [r3, #0x14] + cmp r2, r1 + blt _021F0164 + mov r1, #3 + strb r1, [r3, #0x1e] + ldr r1, [r0, #8] + ldrb r0, [r1, #0x1f] + add r0, r0, #1 + strb r0, [r1, #0x1f] +_021F0164: + ldr r0, _021F0188 ; =ov00_0221A918 + ldr r1, [r0, #8] + ldrb r0, [r1, #0x1f] + cmp r0, #2 + ldmloia sp!, {r3, pc} + mov r0, #0 + strb r0, [r1, #0x1f] + bl ov00_021F0914 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F0188: .word ov00_0221A918 + arm_func_end ov00_021F0028 + + arm_func_start ov00_021F018C +ov00_021F018C: ; 0x021F018C + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _021F0234 ; =ov00_0221A918 + ldr r5, [sp, #0x10] + ldr r1, [r0, #8] + ldr r4, [sp, #0x14] + str r2, [r1, #0x2c] + ldr r1, [r0, #8] + ldr lr, [sp, #0x18] + str r3, [r1, #0x30] + ldr r1, [r0, #8] + ldr ip, [sp, #0x1c] + str r5, [r1, #0x34] + ldr r1, [r0, #8] + mov r3, #0 + str r4, [r1, #0x38] + ldr r1, [r0, #8] + mov r2, #1 + str lr, [r1, #0x3c] + ldr r1, [r0, #8] + str ip, [r1, #0x40] + ldr r1, [r0, #8] + strb r3, [r1, #0x1d] + ldr r1, [r0, #8] + strb r3, [r1, #0x1e] + ldr r1, [r0, #8] + strb r3, [r1, #0x1f] + ldr r1, [r0, #8] + strb r3, [r1, #0x1c] + ldr r1, [r0, #8] + str r2, [r1] + ldr r1, [r0, #8] + ldr r0, [r1, #0x18] + cmp r0, #0 + ldreqb r0, [r1, #0x1f] + addeq r0, r0, #1 + streqb r0, [r1, #0x1f] + ldr r0, _021F0234 ; =ov00_0221A918 + ldr r1, [r0, #8] + ldrb r0, [r1, #0x1f] + add r0, r0, #1 + strb r0, [r1, #0x1f] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F0234: .word ov00_0221A918 + arm_func_end ov00_021F018C + + arm_func_start ov00_021F0238 +ov00_021F0238: ; 0x021F0238 + stmdb sp!, {r4, lr} + ldr r2, _021F028C ; =ov00_0221A918 + mov r4, r0 + ldr r2, [r2, #8] + cmp r2, #0 + cmpne r4, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021EC24C + ldr r0, _021F028C ; =ov00_0221A918 + ldr r3, [r0, #8] + ldr r0, [r3] + cmp r0, #0 + cmpne r0, #2 + beq _021F0284 + ldrb r1, [r3, #0x1d] + ldr r2, [r3, #0x30] + ldr r3, [r3, #0x2c] + mov r0, r4 + blx r3 +_021F0284: + bl ov00_021F0678 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F028C: .word ov00_0221A918 + arm_func_end ov00_021F0238 + + arm_func_start ov00_021F0290 +ov00_021F0290: ; 0x021F0290 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _021F02D4 ; =ov00_0221A918 + ldr r2, [r2, #8] + ldr r2, [r2, #0x18] + cmp r2, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, pc} + ldr r3, _021F02D8 ; =ov00_021F0EF8 + mov r2, #0 + str r3, [sp] + str r2, [sp, #4] + ldr r1, [r1] + mov r3, r2 + bl ov00_02200020 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F02D4: .word ov00_0221A918 +_021F02D8: .word ov00_021F0EF8 + arm_func_end ov00_021F0290 + + arm_func_start ov00_021F02DC +ov00_021F02DC: ; 0x021F02DC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r4, r1 + mov r5, r0 + ldr r0, [r4, #8] + ldr r1, _021F0330 ; =ov00_02217A10 + bl strcmp + cmp r0, #0 + addne sp, sp, #8 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _021F0334 ; =ov00_021F10A8 + mov r2, #0 + stmia sp, {r0, r2} + ldr r1, [r4] + mov r0, r5 + mov r3, r2 + bl ov00_02200020 + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F0330: .word ov00_02217A10 +_021F0334: .word ov00_021F10A8 + arm_func_end ov00_021F02DC + + arm_func_start ov00_021F0338 +ov00_021F0338: ; 0x021F0338 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x210 + ldr r2, _021F03B8 ; =ov00_0221A918 + mov r6, r0 + ldr r0, [r2, #8] + mov r5, r1 + ldr r0, [r0, #0x34] + cmp r0, #0 + addeq sp, sp, #0x210 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r5] + bl ov00_021F0404 + mov r4, r0 + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #0x210 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, [r5, #8] + add r2, sp, #0 + mov r0, r6 + bl ov00_02200400 + ldr r0, _021F03B8 ; =ov00_0221A918 + ldr r1, [sp, #4] + ldr r0, [r0, #8] + add r2, sp, #0x108 + ldr r3, [r0, #0x38] + ldr ip, [r0, #0x34] + mov r0, r4 + and r1, r1, #0xff + blx ip + add sp, sp, #0x210 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F03B8: .word ov00_0221A918 + arm_func_end ov00_021F0338 + + arm_func_start ov00_021F03BC +ov00_021F03BC: ; 0x021F03BC + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _021F0400 ; =ov00_0221A918 + mov r5, r0 + ldr r0, [r1, #8] + ldr r4, [r0, #0x18] + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl ov00_021EF3A4 + mov r1, #0xc + mla r1, r5, r1, r4 + bl DWC_GetGsProfileId + cmp r0, #0 + mvnne r1, #0 + cmpne r0, r1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F0400: .word ov00_0221A918 + arm_func_end ov00_021F03BC + + arm_func_start ov00_021F0404 +ov00_021F0404: ; 0x021F0404 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _021F0464 ; =ov00_0221A918 + mov r6, r0 + ldr r0, [r4, #8] + cmp r0, #0 + cmpne r6, #0 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r0, #0x14] + mov r5, #0 + cmp r0, #0 + ble _021F045C +_021F0434: + mov r0, r5 + bl ov00_021F03BC + cmp r6, r0 + moveq r0, r5 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #8] + add r5, r5, #1 + ldr r0, [r0, #0x14] + cmp r5, r0 + blt _021F0434 +_021F045C: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F0464: .word ov00_0221A918 + arm_func_end ov00_021F0404 + + arm_func_start ov00_021F0468 +ov00_021F0468: ; 0x021F0468 + stmdb sp!, {r3, lr} + ldr r0, _021F049C ; =ov00_0221A918 + ldr r1, [r0, #8] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + str r0, [r1, #8] + bl OS_GetTick + ldr r2, _021F049C ; =ov00_0221A918 + ldr r2, [r2, #8] + str r0, [r2, #0xc] + str r1, [r2, #0x10] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F049C: .word ov00_0221A918 + arm_func_end ov00_021F0468 + + arm_func_start ov00_021F04A0 +ov00_021F04A0: ; 0x021F04A0 + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _021F054C ; =ov00_0221A918 + mov r6, r0 + ldr r0, [r3, #8] + mov r5, r1 + mov r4, r2 + cmp r0, #0 + beq _021F04CC + bl ov00_021EFC6C + cmp r0, #0 + bne _021F04D4 +_021F04CC: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F04D4: + mvn r0, #0 + cmp r6, r0 + bne _021F04F4 + ldr r0, _021F054C ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #4] + ldr r0, [r0] + ldr r6, [r0, #0x214] +_021F04F4: + cmp r5, #0 + bne _021F0510 + ldr r0, _021F054C ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #4] + ldr r0, [r0] + add r5, r0, #0x218 +_021F0510: + cmp r4, #0 + bne _021F052C + ldr r0, _021F054C ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #4] + ldr r0, [r0] + add r4, r0, #0x318 +_021F052C: + ldr r0, _021F054C ; =ov00_0221A918 + mov r1, r6 + ldr r0, [r0, #8] + mov r2, r5 + ldr r0, [r0, #4] + mov r3, r4 + bl ov00_02200654 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F054C: .word ov00_0221A918 + arm_func_end ov00_021F04A0 + + arm_func_start ov00_021F0550 +ov00_021F0550: ; 0x021F0550 + stmdb sp!, {r4, lr} + sub sp, sp, #0x210 + ldr r1, _021F05D4 ; =ov00_0221A918 + mov r4, r0 + ldr r3, [r1, #8] + ldr r2, [r3, #0x44] + cmp r2, #0 + ldrne r1, [r3] + cmpne r1, #1 + beq _021F0580 + ldr r1, [r3, #0x48] + blx r2 +_021F0580: + ldr r0, _021F05D4 ; =ov00_0221A918 + ldr r1, [r0, #8] + ldr r0, [r1, #0x34] + cmp r0, #0 + addeq sp, sp, #0x210 + ldmeqia sp!, {r4, pc} + ldr r1, [r1, #0x18] + mov r0, #0xc + mla r0, r4, r0, r1 + add r1, sp, #0x108 + bl ov00_021EFC98 + ldr r2, _021F05D4 ; =ov00_0221A918 + mov r1, r0 + ldr r0, [r2, #8] + add r2, sp, #0x108 + ldr r3, [r0, #0x38] + ldr ip, [r0, #0x34] + mov r0, r4 + blx ip + add sp, sp, #0x210 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F05D4: .word ov00_0221A918 + arm_func_end ov00_021F0550 + + arm_func_start ov00_021F05D8 +ov00_021F05D8: ; 0x021F05D8 + ldr r0, _021F05E8 ; =ov00_0221A918 + mov r1, #0 + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021F05E8: .word ov00_0221A918 + arm_func_end ov00_021F05D8 + + arm_func_start ov00_021F05EC +ov00_021F05EC: ; 0x021F05EC + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _021F0670 ; =ov00_0221A918 + mov r4, #0 + ldr r5, [r0, #8] + bl OS_GetTick + ldr r3, [r5, #0xc] + ldr r2, [r5, #0x10] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021F0674 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, r4 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, #0x12c + blo _021F0668 + ldr r1, [r5, #8] + ldr r0, _021F0670 ; =ov00_0221A918 + add r1, r1, #1 + str r1, [r5, #8] + ldr r0, [r0, #8] + ldr r0, [r0, #4] + bl ov00_021FFD9C + mov r4, r0 + bl OS_GetTick + ldr r2, _021F0670 ; =ov00_0221A918 + ldr r2, [r2, #8] + str r0, [r2, #0xc] + str r1, [r2, #0x10] +_021F0668: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F0670: .word ov00_0221A918 +_021F0674: .word 0x000082EA + arm_func_end ov00_021F05EC + + arm_func_start ov00_021F0678 +ov00_021F0678: ; 0x021F0678 + ldr r0, _021F06A4 ; =ov00_0221A918 + ldr r1, [r0, #8] + cmp r1, #0 + bxeq lr + mov r2, #0 + str r2, [r1] + ldr r1, [r0, #8] + strb r2, [r1, #0x1e] + ldr r0, [r0, #8] + strb r2, [r0, #0x1f] + bx lr + .balign 4, 0 +_021F06A4: .word ov00_0221A918 + arm_func_end ov00_021F0678 + + arm_func_start ov00_021F06A8 +ov00_021F06A8: ; 0x021F06A8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x248 + ldr r2, _021F090C ; =ov00_0221A918 + mov r7, r0 + ldr r2, [r2, #8] + mov r6, r1 + ldrb r0, [r2, #0x1e] + cmp r0, #0 + bne _021F07D8 + ldr r0, [r2, #4] + add r1, sp, #0x1c + bl ov00_022003D0 + bl ov00_021F0C48 + ldr r0, [sp, #0x1c] + mov r1, #0 + str r1, [sp, #0x18] + cmp r0, #0 + ble _021F07C8 +_021F06F0: + ldr r0, _021F090C ; =ov00_0221A918 + ldr r1, [sp, #0x18] + ldr r0, [r0, #8] + add r2, sp, #0x38 + ldr r0, [r0, #4] + bl ov00_02200400 + bl ov00_021F0C48 + cmp r6, #0 + mov r4, #0 + ble _021F0778 +_021F0718: + mov r0, r4 + bl ov00_021F03BC + ldr r1, [sp, #0x38] + cmp r1, r0 + bne _021F076C + mov r0, #0xc + mul r5, r4, r0 + add r0, r7, r5 + bl DWC_IsBuddyFriendData + cmp r0, #0 + bne _021F0778 + ldr r1, [sp, #0x38] + add r0, r7, r5 + bl DWC_SetGsProfileId + add r0, r7, r5 + bl DWCi_SetBuddyFriendData + ldr r0, _021F090C ; =ov00_0221A918 + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x1d] + b _021F0778 +_021F076C: + add r4, r4, #1 + cmp r4, r6 + blt _021F0718 +_021F0778: + cmp r4, r6 + bne _021F07B0 + ldr r0, _021F090C ; =ov00_0221A918 + ldr r1, [sp, #0x38] + ldr r0, [r0, #8] + ldr r0, [r0, #4] + bl ov00_022005FC + bl ov00_021F0C48 + ldr r1, [sp, #0x1c] + ldr r0, [sp, #0x18] + sub r1, r1, #1 + sub r0, r0, #1 + str r1, [sp, #0x1c] + str r0, [sp, #0x18] +_021F07B0: + ldr r1, [sp, #0x18] + ldr r0, [sp, #0x1c] + add r1, r1, #1 + str r1, [sp, #0x18] + cmp r1, r0 + blt _021F06F0 +_021F07C8: + ldr r0, _021F090C ; =ov00_0221A918 + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x1e] +_021F07D8: + ldr sl, _021F090C ; =ov00_0221A918 + ldr r0, [sl, #8] + ldrb r0, [r0, #0x1c] + cmp r0, r6 + addge sp, sp, #0x248 + ldmgeia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r4, sp, #0x18 + mov r8, #0xc + mvn sb, #0 +_021F07FC: + bl ov00_021F03BC + movs r5, r0 + beq _021F0854 + ldr r1, [sl, #8] + mov r0, r7 + ldrb r1, [r1, #0x1c] + mov r2, r5 + bl ov00_021F09A4 + cmp r0, #0 + bne _021F08E4 + ldr r0, [sl, #8] + mov r1, r5 + ldr r0, [r0, #4] + mov r2, r4 + bl ov00_02200540 + bl ov00_021F0C48 + ldr r0, [sp, #0x18] + cmp r0, sb + bne _021F08E4 + mov r0, r5 + bl ov00_021F0B58 + b _021F08E4 +_021F0854: + bl ov00_021EF3A4 + ldr r1, [sl, #8] + ldrb r2, [r1, #0x1c] + mla r1, r2, r8, r7 + bl DWC_GetGsProfileId + cmp r0, sb + bne _021F08E4 + bl ov00_021EF3A4 + ldr r2, _021F090C ; =ov00_0221A918 + mov r1, #0xc + ldr r3, [r2, #8] + add r2, sp, #0x20 + ldrb r3, [r3, #0x1c] + mla r1, r3, r1, r7 + bl DWC_LoginIdToUserName + ldr r0, _021F090C ; =ov00_0221A918 + mov r1, #0 + ldr r4, [r0, #8] + add r2, sp, #0x20 + stmia sp, {r1, r2} + str r1, [sp, #8] + ldr r0, _021F0910 ; =ov00_021F0CBC + str r1, [sp, #0xc] + str r0, [sp, #0x10] + ldrb r0, [r4, #0x1c] + mov r2, r1 + mov r3, r1 + str r0, [sp, #0x14] + ldr r0, [r4, #4] + bl ov00_021FFF58 + ldr r0, _021F090C ; =ov00_0221A918 + mov r1, #2 + ldr r0, [r0, #8] + add sp, sp, #0x248 + strb r1, [r0, #0x1e] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F08E4: + ldr r1, [sl, #8] + ldrb r0, [r1, #0x1c] + add r0, r0, #1 + strb r0, [r1, #0x1c] + ldr r0, [sl, #8] + ldrb r0, [r0, #0x1c] + cmp r0, r6 + blt _021F07FC + add sp, sp, #0x248 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021F090C: .word ov00_0221A918 +_021F0910: .word ov00_021F0CBC + arm_func_end ov00_021F06A8 + + arm_func_start ov00_021F0914 +ov00_021F0914: ; 0x021F0914 + stmdb sp!, {r3, lr} + ldr r1, _021F0948 ; =ov00_0221A918 + mov r0, #0 + ldr r3, [r1, #8] + ldrb r1, [r3, #0x1d] + ldr r2, [r3, #0x30] + ldr r3, [r3, #0x2c] + blx r3 + ldr r0, _021F0948 ; =ov00_0221A918 + mov r1, #2 + ldr r0, [r0, #8] + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F0948: .word ov00_0221A918 + arm_func_end ov00_021F0914 + + arm_func_start ov00_021F094C +ov00_021F094C: ; 0x021F094C + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _021F09A0 ; =ov00_0221A918 + mov r5, r1 + ldr r1, [r3, #8] + mov r4, r2 + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r2, #0xc + mla r0, r5, r2, r0 + mov r1, #0 + bl MI_CpuFill8 + ldr r0, _021F09A0 ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r3, [r0, #0x3c] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r0, #0x40] + mov r0, r5 + mov r1, r4 + blx r3 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F09A0: .word ov00_0221A918 + arm_func_end ov00_021F094C + + arm_func_start ov00_021F09A4 +ov00_021F09A4: ; 0x021F09A4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r5, r2 + cmp r6, #0 + mov r4, #0 + ble _021F0A44 +_021F09C0: + mov r0, r4 + bl ov00_021F03BC + cmp r0, #0 + beq _021F0A38 + cmp r0, r5 + bne _021F0A38 + mov r0, #0xc + mla r0, r6, r0, r7 + bl DWC_IsBuddyFriendData + cmp r0, #0 + beq _021F0A14 + mov r0, #0xc + mla r0, r4, r0, r7 + bl DWC_IsBuddyFriendData + cmp r0, #0 + bne _021F0A14 + mov r0, r7 + mov r1, r4 + mov r2, r6 + bl ov00_021F094C + b _021F0A24 +_021F0A14: + mov r0, r7 + mov r1, r6 + mov r2, r4 + bl ov00_021F094C +_021F0A24: + ldr r1, _021F0A4C ; =ov00_0221A918 + mov r0, #1 + ldr r1, [r1, #8] + strb r0, [r1, #0x1d] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F0A38: + add r4, r4, #1 + cmp r4, r6 + blt _021F09C0 +_021F0A44: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F0A4C: .word ov00_0221A918 + arm_func_end ov00_021F09A4 + + arm_func_start ov00_021F0A50 +ov00_021F0A50: ; 0x021F0A50 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r1 + mov fp, r0 + mvn r0, #0 + str r2, [sp] + cmp sl, #0 + str r0, [sp, #4] + mov r5, #0 + ble _021F0B48 + mov r7, fp + mov r8, fp +_021F0A80: + mov r0, r5 + bl ov00_021F03BC + movs r4, r0 + beq _021F0B34 + ldr r0, [sp] + add r6, r5, #1 + cmp r4, r0 + streq r5, [sp, #4] + cmp r6, sl + bge _021F0B34 + mov r0, #0xc + mla sb, r6, r0, fp +_021F0AB0: + mov r0, r6 + bl ov00_021F03BC + cmp r4, r0 + bne _021F0B24 + mov r0, r7 + bl DWC_GetFriendDataType + cmp r0, #2 + bne _021F0AEC + mov r0, sb + bl DWC_GetFriendDataType + cmp r0, #3 + bne _021F0AEC + mov r0, r8 + mov r1, r4 + bl DWC_SetGsProfileId +_021F0AEC: + mov r0, sb + bl DWC_IsBuddyFriendData + cmp r0, #0 + beq _021F0B04 + mov r0, r8 + bl DWCi_SetBuddyFriendData +_021F0B04: + mov r0, fp + mov r1, r6 + mov r2, r5 + bl ov00_021F094C + ldr r0, _021F0B54 ; =ov00_0221A918 + ldr r1, [r0, #8] + mov r0, #1 + strb r0, [r1, #0x1d] +_021F0B24: + add r6, r6, #1 + cmp r6, sl + add sb, sb, #0xc + blt _021F0AB0 +_021F0B34: + add r5, r5, #1 + cmp r5, sl + add r7, r7, #0xc + add r8, r8, #0xc + blt _021F0A80 +_021F0B48: + ldr r0, [sp, #4] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F0B54: .word ov00_0221A918 + arm_func_end ov00_021F0A50 + + arm_func_start ov00_021F0B58 +ov00_021F0B58: ; 0x021F0B58 + stmdb sp!, {r4, lr} + ldr r2, _021F0B84 ; =ov00_0221A918 + mov r1, r0 + ldr r0, [r2, #8] + ldr r2, _021F0B88 ; =ov00_02217A48 + ldr r0, [r0, #4] + bl ov00_0220014C + mov r4, r0 + bl ov00_021F0C48 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F0B84: .word ov00_0221A918 +_021F0B88: .word ov00_02217A48 + arm_func_end ov00_021F0B58 + + arm_func_start ov00_021F0B8C +ov00_021F0B8C: ; 0x021F0B8C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021F0C44 ; =ov00_0221A918 + mov r3, #0 + ldr r2, [r2, #8] + mov r5, r0 + mov r4, r1 + str r3, [sp] + cmp r2, #0 + beq _021F0BBC + bl ov00_021EFC6C + cmp r0, #0 + bne _021F0BC4 +_021F0BBC: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F0BC4: + bl ov00_021EF3A4 + mov r1, r5 + bl DWC_GetGsProfileId + mov r5, r0 + cmp r5, #0 + ble _021F0C00 + ldr r0, _021F0C44 ; =ov00_0221A918 + add r2, sp, #0 + ldr r0, [r0, #8] + mov r1, r5 + ldr r0, [r0, #4] + bl ov00_02200540 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} +_021F0C00: + cmp r5, #0 + ble _021F0C18 + ldr r1, [sp] + mvn r0, #0 + cmp r1, r0 + bne _021F0C20 +_021F0C18: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F0C20: + ldr r0, _021F0C44 ; =ov00_0221A918 + mov r2, r4 + ldr r0, [r0, #8] + ldr r0, [r0, #4] + bl ov00_02200400 + cmp r0, #0 + movne r0, #0 + moveq r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F0C44: .word ov00_0221A918 + arm_func_end ov00_021F0B8C + + arm_func_start ov00_021F0C48 +ov00_021F0C48: ; 0x021F0C48 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #4 + addls pc, pc, r4, lsl #2 + b _021F0CA4 +_021F0C64: ; jump table + b _021F0CA4 ; case 0 + b _021F0C78 ; case 1 + b _021F0C84 ; case 2 + b _021F0C90 ; case 3 + b _021F0C9C ; case 4 +_021F0C78: + mov r0, #9 + sub r2, r0, #0xa + b _021F0CA4 +_021F0C84: + mov r0, #9 + sub r2, r0, #0xb + b _021F0CA4 +_021F0C90: + mov r0, #6 + sub r2, r0, #0x10 + b _021F0CA4 +_021F0C9C: + mov r0, #6 + sub r2, r0, #0x1a +_021F0CA4: + ldr r1, _021F0CB8 ; =0xFFFEEAA8 + add r1, r2, r1 + bl ov00_021F0238 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F0CB8: .word 0xFFFEEAA8 + arm_func_end ov00_021F0C48 + + arm_func_start ov00_021F0CBC +ov00_021F0CBC: ; 0x021F0CBC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldr r1, [sb] + mov sl, r0 + mov r8, r2 + cmp r1, #0 + bne _021F0E8C + ldr r0, [sb, #4] + cmp r0, #0 + beq _021F0E8C + mov r0, #0xc + ldr r1, _021F0EF4 ; =ov00_0221A918 + mul r6, r8, r0 + ldr r0, [r1, #8] + ldr r0, [r0, #0x18] + add r0, r0, r6 + bl DWC_GetFriendDataType + cmp r0, #0 + beq _021F0E8C + ldr r7, _021F0EF4 ; =ov00_0221A918 + ldr r0, [r7, #8] + ldr r0, [r0] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sb, #4] + mov r4, #0 + cmp r0, #0 + ble _021F0D90 + mov r5, r4 +_021F0D30: + ldr r0, [r7, #8] + ldr r1, [sb, #0xc] + ldr r0, [r0, #0x18] + ldr r2, [r1, r5] + mov r1, r8 + bl ov00_021F09A4 + cmp r0, #0 + beq _021F0D7C + ldr r0, _021F0EF4 ; =ov00_0221A918 + mov r2, #1 + ldr r4, [r0, #8] + add r1, r2, #0x600 + ldrb r3, [r4, #0x1c] + add r3, r3, #1 + strb r3, [r4, #0x1c] + ldr r0, [r0, #8] + strb r2, [r0, #0x1e] + str r1, [sb, #8] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F0D7C: + ldr r0, [sb, #4] + add r4, r4, #1 + cmp r4, r0 + add r5, r5, #0xac + blt _021F0D30 +_021F0D90: + cmp r0, #0 + mov r7, #0 + ble _021F0E5C + mov r5, r7 + add fp, sp, #0 + mvn r4, #0 +_021F0DA8: + ldr r1, [sb, #0xc] + mov r0, sl + ldr r1, [r1, r5] + mov r2, fp + bl ov00_02200540 + bl ov00_021F0C48 + ldr r0, [sp] + cmp r0, r4 + bne _021F0DDC + ldr r0, [sb, #0xc] + ldr r0, [r0, r5] + bl ov00_021F0B58 + b _021F0E48 +_021F0DDC: + ldr r0, _021F0EF4 ; =ov00_0221A918 + ldr r1, [sb, #0xc] + ldr r0, [r0, #8] + ldr r1, [r1] + ldr r0, [r0, #0x18] + add r0, r0, r6 + bl DWC_SetGsProfileId + ldr r0, _021F0EF4 ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #0x18] + add r0, r0, r6 + bl DWCi_SetBuddyFriendData + mov r0, r8 + bl ov00_021F0550 + ldr r0, _021F0EF4 ; =ov00_0221A918 + mov r3, #1 + ldr r4, [r0, #8] + add r1, r3, #0x600 + ldrb r2, [r4, #0x1c] + add r2, r2, #1 + strb r2, [r4, #0x1c] + ldr r2, [r0, #8] + strb r3, [r2, #0x1e] + str r1, [sb, #8] + ldr r0, [r0, #8] + strb r3, [r0, #0x1d] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F0E48: + ldr r0, [sb, #4] + add r7, r7, #1 + cmp r7, r0 + add r5, r5, #0xac + blt _021F0DA8 +_021F0E5C: + ldr r0, [sb, #8] + cmp r0, #0x600 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _021F0EF4 ; =ov00_0221A918 + mov r1, #1 + ldr r3, [r0, #8] + ldrb r2, [r3, #0x1c] + add r2, r2, #1 + strb r2, [r3, #0x1c] + ldr r0, [r0, #8] + strb r1, [r0, #0x1e] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F0E8C: + ldr r0, [sb] + cmp r0, #0 + beq _021F0EA4 + bl ov00_021F0C48 + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F0EA4: + ldr r0, _021F0EF4 ; =ov00_0221A918 + ldr r1, [r0, #8] + ldr r0, [r1] + cmp r0, #1 + beq _021F0ED0 + ldr r1, [r1, #0x18] + mov r0, #0xc + mla r0, r8, r0, r1 + bl DWC_GetFriendDataType + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F0ED0: + ldr r0, _021F0EF4 ; =ov00_0221A918 + mov r1, #1 + ldr r3, [r0, #8] + ldrb r2, [r3, #0x1c] + add r2, r2, #1 + strb r2, [r3, #0x1c] + ldr r0, [r0, #8] + strb r1, [r0, #0x1e] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F0EF4: .word ov00_0221A918 + arm_func_end ov00_021F0CBC + + arm_func_start ov00_021F0EF8 +ov00_021F0EF8: ; 0x021F0EF8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + mov sb, r1 + ldr r1, [sb] + mov sl, r0 + cmp r1, #0 + mov r6, #0 + addne sp, sp, #0x28 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _021F10A0 ; =ov00_0221A918 + mov r5, r6 + ldr r1, [r4, #8] + ldr r0, [r1, #0x14] + cmp r0, #0 + ble _021F1074 + mov r7, r6 + add fp, sp, #0x11 +_021F0F3C: + ldr r0, [r1, #0x18] + add r0, r0, r7 + bl DWC_GetFriendDataType + cmp r0, #1 + bne _021F0FA4 + bl ov00_021EF3A4 + ldr r1, [r4, #8] + mov r2, fp + ldr r1, [r1, #0x18] + add r1, r1, r7 + bl DWC_LoginIdToUserName + mov r0, fp + add r1, sb, #0x8e + bl strcmp + cmp r0, #0 + bne _021F105C + ldr r1, [sb, #4] + mov r0, sl + bl ov00_022002C0 + ldr r0, [r4, #8] + ldr r1, [sb, #4] + ldr r0, [r0, #0x18] + add r0, r0, r7 + bl DWC_SetGsProfileId + mov r6, #1 + b _021F105C +_021F0FA4: + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, r7 + bl DWC_GetFriendDataType + cmp r0, #3 + beq _021F0FD4 + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, r7 + bl DWC_GetFriendDataType + cmp r0, #2 + bne _021F105C +_021F0FD4: + bl ov00_021EF3A4 + ldr r1, [r0, #0x24] + add r0, sp, #0xc + mov r2, r1, lsr #0x10 + and r2, r2, #0xff + str r2, [sp] + mov r2, r1, lsr #8 + and r2, r2, #0xff + str r2, [sp, #4] + and r2, r1, #0xff + str r2, [sp, #8] + mov r1, r1, lsr #0x18 + and r3, r1, #0xff + ldr r2, _021F10A4 ; =ov00_02217A4C + mov r1, #5 + bl OS_SNPrintf + ldr r8, [sb, #4] + bl ov00_021EF3A4 + ldr r1, [r4, #8] + ldr r1, [r1, #0x18] + add r1, r1, r7 + bl DWC_GetGsProfileId + cmp r8, r0 + bne _021F105C + add r0, sp, #0xc + add r1, sb, #0x97 + mov r2, #4 + bl memcmp + cmp r0, #0 + bne _021F105C + mov r0, sl + mov r1, r8 + bl ov00_022002C0 + mov r6, #1 +_021F105C: + ldr r1, [r4, #8] + add r7, r7, #0xc + add r5, r5, #1 + ldr r0, [r1, #0x14] + cmp r5, r0 + blt _021F0F3C +_021F1074: + cmp r6, #0 + beq _021F108C + ldr r0, [sb, #4] + bl ov00_021F0B58 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F108C: + ldr r1, [sb, #4] + mov r0, sl + bl ov00_02200310 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F10A0: .word ov00_0221A918 +_021F10A4: .word ov00_02217A4C + arm_func_end ov00_021F0EF8 + + arm_func_start ov00_021F10A8 +ov00_021F10A8: ; 0x021F10A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sl, r1 + ldr r0, [sl] + mov r7, #0 + cmp r0, #0 + mov r8, r7 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _021F1244 ; =ov00_0221A918 + mov r6, r7 + ldr r0, [r4, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + ble _021F1208 + mov sb, r7 + mov fp, #1 + add r5, sp, #0 +_021F10F0: + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_GetFriendDataType + cmp r0, #1 + bne _021F115C + bl ov00_021EF3A4 + ldr r1, [r4, #8] + mov r2, r5 + ldr r1, [r1, #0x18] + add r1, r1, sb + bl DWC_LoginIdToUserName + mov r0, r5 + add r1, sl, #0x8e + bl strcmp + cmp r0, #0 + bne _021F11F0 + ldr r0, [r4, #8] + ldr r1, [sl, #4] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_SetGsProfileId + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWCi_SetBuddyFriendData + mov r7, fp + b _021F11F0 +_021F115C: + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_GetFriendDataType + cmp r0, #3 + beq _021F118C + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_GetFriendDataType + cmp r0, #2 + bne _021F11F0 +_021F118C: + bl ov00_021EF3A4 + ldr r1, [r4, #8] + ldr r1, [r1, #0x18] + add r1, r1, sb + bl DWC_GetGsProfileId + ldr r1, [sl, #4] + cmp r1, r0 + bne _021F11F0 + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_IsBuddyFriendData + cmp r0, #1 + moveq r8, #1 + beq _021F11F0 + ldr r0, [r4, #8] + ldr r1, [sl, #4] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWC_SetGsProfileId + ldr r0, [r4, #8] + ldr r0, [r0, #0x18] + add r0, r0, sb + bl DWCi_SetBuddyFriendData + mov r7, #1 +_021F11F0: + ldr r0, [r4, #8] + add r6, r6, #1 + ldr r1, [r0, #0x14] + add sb, sb, #0xc + cmp r6, r1 + blt _021F10F0 +_021F1208: + cmp r7, #0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r0, #0x18] + ldr r2, [sl, #4] + bl ov00_021F0A50 + cmp r8, #0 + bne _021F122C + bl ov00_021F0550 +_021F122C: + ldr r0, _021F1244 ; =ov00_0221A918 + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x1d] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F1244: .word ov00_0221A918 + arm_func_end ov00_021F10A8 + + arm_func_start ov00_021F1248 +ov00_021F1248: ; 0x021F1248 + ldr r0, _021F1258 ; =ov00_0221A918 + ldr r0, [r0, #8] + ldr r0, [r0, #0x20] + bx lr + .balign 4, 0 +_021F1258: .word ov00_0221A918 + arm_func_end ov00_021F1248 + + arm_func_start ov00_021F125C +ov00_021F125C: ; 0x021F125C + stmdb sp!, {r3, lr} + ldr r0, _021F1280 ; =ov00_0221A928 + ldr r1, [r0, #0x10] + cmp r1, #0 + movne r1, #1 + strne r1, [r0, #0xc] + ldmneia sp!, {r3, pc} + bl ov00_0220FB40 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F1280: .word ov00_0221A928 + arm_func_end ov00_021F125C + + arm_func_start ov00_021F1284 +ov00_021F1284: ; 0x021F1284 + stmdb sp!, {r3, lr} + bl ov00_021F12A4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021F6BA8 + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_021F1284 + + arm_func_start ov00_021F12A4 +ov00_021F12A4: ; 0x021F12A4 + stmdb sp!, {r3, lr} + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + bl ov00_021F955C + cmp r0, #0 + beq _021F12E0 + bl ov00_021EE568 + cmp r0, #5 + bne _021F12E0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a9] + cmp r0, #0 + beq _021F12E8 +_021F12E0: + mov r0, #0 + ldmia sp!, {r3, pc} +_021F12E8: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_021F12A4 + + arm_func_start ov00_021F12F0 +ov00_021F12F0: ; 0x021F12F0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl ov00_021EC230 + cmp r0, #0 + bne _021F133C + bl ov00_021F955C + cmp r0, #0 + beq _021F133C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F133C + bl ov00_021EE568 + cmp r0, #5 + beq _021F1344 + bl ov00_021EE568 + cmp r0, #6 + beq _021F1344 +_021F133C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F1344: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xa + bne _021F1380 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r4, #0x16] + bl ov00_021F36BC + cmp r6, #0 + beq _021F139C + mov r0, r5 + blx r6 + b _021F139C +_021F1380: + bl ov00_021F955C + str r6, [r0, #0x47c] + bl ov00_021F955C + str r5, [r0, #0x480] + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x1ae] +_021F139C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F12F0 + + arm_func_start ov00_021F13A4 +ov00_021F13A4: ; 0x021F13A4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r6, r1 + mov r5, r2 + mov r7, r0 + cmpne r5, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r7, #0x64 + blo _021F1408 + sub r2, r7, #0x64 + mov r0, #0xc + mul r3, r2, r0 + ldr r0, _021F14BC ; =ov00_0221A948 + ldrb r0, [r0, r3] + cmp r0, #0 + beq _021F1408 + ldr r0, _021F14C0 ; =ov00_0221A94C + ldr r0, [r0, r3] + cmp r0, #0 + beq _021F1418 + bl strcmp + cmp r0, #0 + beq _021F1418 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_021F1408: + bl ov00_021F7A98 + movs r7, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_021F1418: + sub r1, r7, #0x64 + mov r0, #0xc + mul r4, r1, r0 + ldr r1, _021F14BC ; =ov00_0221A948 + ldr r0, _021F14C4 ; =ov00_0221A949 + strb r7, [r1, r4] + mov r2, #1 + ldr r1, _021F14C8 ; =ov00_0221A94A + strb r2, [r0, r4] + mov r2, #0 + ldr r0, _021F14C0 ; =ov00_0221A94C + strh r2, [r1, r4] + ldr r1, [r0, r4] + cmp r1, #0 + beq _021F145C + mov r0, #4 + bl ov00_021EC2EC +_021F145C: + mov r0, r6 + ldr r8, _021F14C0 ; =ov00_0221A94C + bl strlen + add r1, r0, #1 + mov r0, #4 + bl ov00_021EC2A8 + str r0, [r8, r4] + cmp r0, #0 + bne _021F1494 + ldr r1, _021F14CC ; =0xFFFEC77F + mov r0, #9 + bl ov00_021F2EE4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_021F1494: + mov r1, r6 + bl strcpy + ldr r1, _021F14D0 ; =ov00_0221A950 + mov r0, r8 + str r5, [r1, r4] + ldr r1, [r0, r4] + mov r0, r7 + bl ov00_02212008 + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021F14BC: .word ov00_0221A948 +_021F14C0: .word ov00_0221A94C +_021F14C4: .word ov00_0221A949 +_021F14C8: .word ov00_0221A94A +_021F14CC: .word 0xFFFEC77F +_021F14D0: .word ov00_0221A950 + arm_func_end ov00_021F13A4 + + arm_func_start ov00_021F14D4 +ov00_021F14D4: ; 0x021F14D4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021F955C + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r5, #0 + beq _021F1510 + cmp r5, #1 + beq _021F15E8 + b _021F1614 +_021F1510: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x13 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r4] + cmp r0, #0 + beq _021F1540 + ldrb r0, [r4, #1] + cmp r0, #1 + movls r0, #3 + ldmlsia sp!, {r3, r4, r5, pc} +_021F1540: + ldr r0, _021F161C ; =ov00_0221A928 + ldr r0, [r0] + cmp r0, #0 + bne _021F1570 + mov r0, #4 + mov r1, #0x20 + bl ov00_021EC2A8 + ldr r1, _021F161C ; =ov00_0221A928 + cmp r0, #0 + str r0, [r1] + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, pc} +_021F1570: + ldrb r2, [r4] + ldr r1, _021F161C ; =ov00_0221A928 + mov r3, #0 + strb r2, [r0] + ldrb r2, [r4, #1] + ldr r0, [r1] + strb r2, [r0, #1] + ldr r0, [r1] + strb r3, [r0, #2] + ldr r0, [r1] + strb r3, [r0, #3] + ldr r2, [r4, #4] + ldr r0, [r1] + str r2, [r0, #4] + ldr r0, [r1] + str r3, [r0, #8] + ldr r0, [r1] + str r3, [r0, #0xc] + bl OS_GetTick + ldr r2, _021F161C ; =ov00_0221A928 + ldr r2, [r2] + str r0, [r2, #0x10] + str r1, [r2, #0x14] + bl OS_GetTick + ldr r2, _021F161C ; =ov00_0221A928 + ldr r2, [r2] + str r0, [r2, #0x18] + str r1, [r2, #0x1c] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F15E8: + ldr r0, [r4] + cmp r0, #0 + ldrne r0, _021F161C ; =ov00_0221A928 + movne r1, #1 + ldreq r0, _021F161C ; =ov00_0221A928 + moveq r1, #0 + strb r1, [r0, #0x1c] + ldr r1, _021F161C ; =ov00_0221A928 + mov r0, #0 + strb r0, [r1, #0x1d] + ldmia sp!, {r3, r4, r5, pc} +_021F1614: + mov r0, #2 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F161C: .word ov00_0221A928 + arm_func_end ov00_021F14D4 + + arm_func_start ov00_021F1620 +ov00_021F1620: ; 0x021F1620 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021F954C + bl ov00_021F955C + str r6, [r0] + bl ov00_021F955C + str r5, [r0, #4] + bl ov00_021F955C + str r4, [r0, #8] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x10] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c] + bl ov00_021F955C + mov r1, #0 + strh r1, [r0, #0x1a] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe4] + mov r0, r1 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xf] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x19] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1af] + bl ov00_021F955C + mov r1, #0 + add r0, r0, #0x100 + strh r1, [r0, #0xb6] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1dc] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x200] + bl ov00_021F955C + ldr r1, [sp, #0x10] + str r1, [r0, #0x2f4] + bl ov00_021F955C + ldr r1, [sp, #0x14] + str r1, [r0, #0x2f8] + bl ov00_021F955C + ldr r1, [sp, #0x18] + str r1, [r0, #0x2fc] + bl ov00_021F955C + ldr r1, [sp, #0x1c] + str r1, [r0, #0x300] + bl ov00_021F955C + add r0, r0, #0x304 + mov r1, #0 + mov r2, #0x40 + bl MI_CpuFill8 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x344] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x464] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x468] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x474] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x478] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x47c] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x480] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x174] + str r1, [r0, #0x178] + bl ov00_021F7AD8 + ldr r1, _021F1798 ; =ov00_0221A928 + mov r0, #0 + strb r0, [r1, #0x1c] + strb r0, [r1, #0x1d] + strh r0, [r1, #0x1e] + bl ov00_021F381C + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F1798: .word ov00_0221A928 + arm_func_end ov00_021F1620 + + arm_func_start ov00_021F179C +ov00_021F179C: ; 0x021F179C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + addne sp, sp, #0x28 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov00_021F955C + str r4, [r0, #0x200] + ldr r4, _021F1914 ; =ov00_021F8D18 + ldr fp, _021F1918 ; =ov00_021F8E60 + mov sl, #0 + mov r5, #1 +_021F17D8: + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D294 + mov r8, r0 + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D27C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldr r3, [r0, #0x2f8] + mov r1, r8 + stmia sp, {r3, r5} + str r5, [sp, #8] + str r4, [sp, #0xc] + ldr r3, _021F191C ; =ov00_021F8E64 + str fp, [sp, #0x10] + str r3, [sp, #0x14] + ldr r3, _021F1920 ; =ov00_021F8E68 + mov r2, r7 + str r3, [sp, #0x18] + ldr r3, _021F1924 ; =ov00_021F8F0C + add r0, sb, #0x10 + str r3, [sp, #0x1c] + ldr r3, _021F1928 ; =ov00_021F8F14 + str r3, [sp, #0x20] + mov r3, #0 + str r3, [sp, #0x24] + ldr r3, [r6, #0x2f4] + bl ov00_022108BC + movs r6, r0 + beq _021F18B4 + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210D18 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x10] + cmp r6, #3 + bne _021F1894 + cmp sl, #4 + bne _021F18A8 +_021F1894: + mov r0, r6 + bl ov00_021F8380 + add sp, sp, #0x28 + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F18A8: + add sl, sl, #1 + cmp sl, #5 + blt _021F17D8 +_021F18B4: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c] + bl ov00_021F955C + mov r1, #0 + strh r1, [r0, #0x1a] + bl ov00_021F955C + ldr r0, [r0, #0x10] + ldr r1, _021F192C ; =ov00_021F8F20 + bl ov00_02210AB0 + bl ov00_021F955C + ldr r0, [r0, #0x10] + ldr r1, _021F1930 ; =ov00_021F8F40 + bl ov00_02210A80 + bl ov00_021F955C + ldr r0, [r0, #0x10] + ldr r1, _021F1934 ; =ov00_021F8FF4 + bl ov00_02210A98 + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + mov r0, r6 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F1914: .word ov00_021F8D18 +_021F1918: .word ov00_021F8E60 +_021F191C: .word ov00_021F8E64 +_021F1920: .word ov00_021F8E68 +_021F1924: .word ov00_021F8F0C +_021F1928: .word ov00_021F8F14 +_021F192C: .word ov00_021F8F20 +_021F1930: .word ov00_021F8F40 +_021F1934: .word ov00_021F8FF4 + arm_func_end ov00_021F179C + + arm_func_start ov00_021F1938 +ov00_021F1938: ; 0x021F1938 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x114 + ldr r4, _021F1B10 ; =ov00_0221A928 + mov r7, r1 + ldr r1, [r4, #8] + mov r8, r0 + mov r6, r2 + mov r5, r3 + cmp r1, #0 + beq _021F1978 + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC + mov r0, r4 + mov r1, #0 + str r1, [r0, #8] +_021F1978: + cmp r7, #0 + beq _021F19F8 + add r0, sp, #0x14 + mvn r1, #0 + mov r2, #0x20 + mov r3, #3 + bl ov00_021F3EF4 + mov r4, r0 + ldr r0, _021F1B14 ; =ov00_02217A58 + bl strlen + rsb r1, r4, #0x100 + sub r4, r1, r0 + mov r1, r4 + mov r0, #4 + bl ov00_021EC2A8 + movs r1, r0 + ldr r0, _021F1B10 ; =ov00_0221A928 + str r1, [r0, #8] + bne _021F19D8 + ldr r1, _021F1B18 ; =0xFFFEC77F + mov r0, #9 + bl ov00_021F2EE4 + add sp, sp, #0x114 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_021F19D8: + mov r0, r7 + mov r2, r4 + bl MI_CpuCopy8 + ldr r0, _021F1B10 ; =ov00_0221A928 + mov r1, #0 + ldr r0, [r0, #8] + add r0, r0, r4 + strb r1, [r0, #-1] +_021F19F8: + mov r1, r8 + mov r2, r6 + mov r3, r5 + mov r0, #0 + bl ov00_021F3BB4 + bl ov00_021F955C + ldr r1, [sp, #0x130] + str r1, [r0, #0x474] + bl ov00_021F955C + ldr r1, [sp, #0x134] + str r1, [r0, #0x478] + mov r0, #2 + bl ov00_021F956C + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + bne _021F1A94 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r2, r0 + mov r0, #0x14 + str r0, [sp] + mov r0, #1 + str r0, [sp, #4] + mov r3, #0 + str r3, [sp, #8] + ldr r0, _021F1B1C ; =ov00_021F85B8 + str r0, [sp, #0xc] + str r3, [sp, #0x10] + ldr r0, [r5, #0x2f4] + ldr r1, [r4, #0x2f4] + ldr r2, [r2, #0x2f8] + bl ov00_02213610 + str r0, [r6, #0xe4] +_021F1A94: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + bne _021F1AB8 + mov r0, #5 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #0x114 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} +_021F1AB8: + ldr r1, _021F1B20 ; =ov00_02217A60 + mov r0, #3 + mov r2, #0 + bl ov00_021F04A0 + bl ov00_021F955C + ldr r0, [r0, #0x200] + bl ov00_021F3CF8 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #0x114 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + bne _021F1B00 + bl ov00_021F955C + ldr r0, [r0, #0x200] + bl ov00_021F179C +_021F1B00: + mov r0, #0 + bl ov00_021F7DDC + add sp, sp, #0x114 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021F1B10: .word ov00_0221A928 +_021F1B14: .word ov00_02217A58 +_021F1B18: .word 0xFFFEC77F +_021F1B1C: .word ov00_021F85B8 +_021F1B20: .word ov00_02217A60 + arm_func_end ov00_021F1938 + + arm_func_start ov00_021F1B24 +ov00_021F1B24: ; 0x021F1B24 + stmdb sp!, {r4, lr} + mov lr, r1 + mov ip, r2 + mov r4, r3 + mov r1, r0 + mov r2, lr + mov r3, ip + mov r0, #2 + bl ov00_021F3BB4 + bl ov00_021F955C + str r4, [r0, #0x46c] + bl ov00_021F955C + ldr r1, [sp, #8] + str r1, [r0, #0x470] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x200] + str r0, [r4, #0xf4] + bl ov00_021F955C + mov r1, #1 + str r1, [r0, #0x2f0] + bl ov00_021F955C + mov r2, #0 + strb r2, [r0, #0xe] + ldr r1, _021F1BC8 ; =ov00_0221A928 + mov r0, #0xa + strb r2, [r1, #0x1d] + bl ov00_021F956C + bl ov00_021F36BC + bl ov00_021F8278 + cmp r0, #0 + ldmneia sp!, {r4, pc} + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + ldmneia sp!, {r4, pc} + bl ov00_021F955C + ldr r0, [r0, #0x200] + bl ov00_021F179C + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F1BC8: .word ov00_0221A928 + arm_func_end ov00_021F1B24 + + arm_func_start ov00_021F1BCC +ov00_021F1BCC: ; 0x021F1BCC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + mov r5, r2 + mov r6, r0 + mov r4, r3 + mov r2, r1 + mov r3, r5 + mov r0, #3 + mov r1, #0 + bl ov00_021F3BB4 + bl ov00_021F955C + str r4, [r0, #0x46c] + bl ov00_021F955C + ldr r1, [sp, #0x28] + str r1, [r0, #0x470] + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x200] + str r0, [r4, #0x20] + bl ov00_021F955C + str r6, [r0, #0xf4] + mov r0, #4 + bl ov00_021F956C + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + bne _021F1CA0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r2, r0 + mov r0, #0x14 + str r0, [sp] + mov r0, #1 + str r0, [sp, #4] + mov r3, #0 + str r3, [sp, #8] + ldr r0, _021F1D2C ; =ov00_021F85B8 + str r0, [sp, #0xc] + str r3, [sp, #0x10] + ldr r0, [r5, #0x2f4] + ldr r1, [r4, #0x2f4] + ldr r2, [r2, #0x2f8] + bl ov00_02213610 + str r0, [r6, #0xe4] +_021F1CA0: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + bne _021F1CC4 + mov r0, #5 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r3, r4, r5, r6, pc} +_021F1CC4: + ldr r1, _021F1D30 ; =ov00_02217A60 + mov r0, #5 + mov r2, #0 + bl ov00_021F04A0 + bl ov00_021F8278 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r3, r4, r5, r6, pc} + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + bne _021F1D0C + bl ov00_021F955C + ldr r0, [r0, #0x200] + bl ov00_021F179C + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r3, r4, r5, r6, pc} +_021F1D0C: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + mov r1, #0 + bl ov00_021F5B5C + bl ov00_021F5B30 + cmp r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021F1D2C: .word ov00_021F85B8 +_021F1D30: .word ov00_02217A60 + arm_func_end ov00_021F1BCC + + arm_func_start ov00_021F1D34 +ov00_021F1D34: ; 0x021F1D34 + stmdb sp!, {r4, lr} + movs r4, r0 + ldmeqia sp!, {r4, pc} + bl ov00_02210AC8 + ldr r0, [r4, #0xb4] + cmp r0, #0 + ldmneia sp!, {r4, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + cmpne r0, #1 + beq _021F1D70 + cmp r0, #2 + beq _021F1DC4 + ldmia sp!, {r4, pc} +_021F1D70: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + addls pc, pc, r0, lsl #2 + ldmia sp!, {r4, pc} +_021F1D84: ; jump table + ldmia sp!, {r4, pc} ; case 0 + b _021F1DB4 ; case 1 + b _021F1DB4 ; case 2 + b _021F1DB4 ; case 3 + b _021F1DB4 ; case 4 + ldmia sp!, {r4, pc} ; case 5 + b _021F1DB4 ; case 6 + ldmia sp!, {r4, pc} ; case 7 + ldmia sp!, {r4, pc} ; case 8 + ldmia sp!, {r4, pc} ; case 9 + ldmia sp!, {r4, pc} ; case 10 + b _021F1DB4 ; case 11 +_021F1DB4: + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + ldmia sp!, {r4, pc} +_021F1DC4: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + ldmneia sp!, {r4, pc} + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + ldmia sp!, {r4, pc} + arm_func_end ov00_021F1D34 + + arm_func_start ov00_021F1DE4 +ov00_021F1DE4: ; 0x021F1DE4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r4, r0 + bl ov00_021F955C + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021EC230 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + bne _021F1E60 + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + beq _021F1E34 + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210AC8 +_021F1E34: + bl ov00_021F955C + ldr r0, [r0, #4] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220CFC4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F1E60: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xd + addls pc, pc, r0, lsl #2 + b _021F258C +_021F1E88: ; jump table + b _021F258C ; case 0 + b _021F2494 ; case 1 + b _021F203C ; case 2 + b _021F203C ; case 3 + b _021F1EC0 ; case 4 + b _021F203C ; case 5 + b _021F258C ; case 6 + b _021F20FC ; case 7 + b _021F258C ; case 8 + b _021F258C ; case 9 + b _021F258C ; case 10 + b _021F2280 ; case 11 + b _021F258C ; case 12 + b _021F2374 ; case 13 +_021F1EC0: + bl ov00_021F955C + ldr r0, [r0, #0x1c8] + cmp r0, #0 + beq _021F1FAC + bl OS_GetTick + mov r6, r0 + mov r7, r1 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + ldr r1, [r5, #0x1cc] + ldr r0, [r5, #0x1d0] + subs r2, r6, r1 + sbc r0, r7, r0 + mov r1, r0, lsl #6 + orr r1, r1, r2, lsr #26 + mov r0, r2, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + ldr r1, [r4, #0x1c8] + cmpeq r0, r1 + bls _021F1FAC + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c8] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F1F98 + bl ov00_021F955C + ldrb r1, [r0, #0x1aa] + add r1, r1, #1 + strb r1, [r0, #0x1aa] + bl ov00_021F955C + ldrb r0, [r0, #0x1aa] + cmp r0, #5 + bls _021F1F74 + ldr r1, _021F2858 ; =0xFFFEC5D2 + mov r0, #6 + bl ov00_021F2EE4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F1F74: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + mov r1, #0 + bl ov00_021F5B5C + bl ov00_021F5B30 + cmp r0, #0 + beq _021F1FAC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F1F98: + mov r0, #0 + bl ov00_021F5FD4 + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_021F1FAC: + bl ov00_021F955C + ldr r0, [r0, #0x1bc] + cmp r0, #0 + beq _021F258C + bl ov00_021F955C + ldrb r1, [r0, #0xd] + ldr r0, _021F285C ; =0x00000BB8 + mul r0, r1, r0 + add r0, r0, #0x3b8 + add r5, r0, #0x800 + bl OS_GetTick + mov r4, r0 + mov r6, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1c0] + ldr r0, [r0, #0x1c4] + subs r2, r4, r1 + sbc r0, r6, r0 + mov r1, r0, lsl #6 + orr r1, r1, r2, lsr #26 + mov r0, r2, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, r5 + blo _021F258C + bl ov00_021F955C + ldr r0, [r0, #0xf4] + mov r1, #0 + bl ov00_021F5B5C + bl ov00_021F5B30 + cmp r0, #0 + beq _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F203C: + bl ov00_021F955C + ldr r0, [r0, #0xe8] + cmp r0, #0 + ble _021F258C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #3 + bne _021F2078 + bl ov00_021F955C + ldrb r1, [r0, #0xd] + ldr r0, _021F285C ; =0x00000BB8 + mul r0, r1, r0 + add r0, r0, #0x3b8 + add r5, r0, #0x800 + b _021F208C +_021F2078: + bl ov00_021F955C + ldr r0, [r0, #0xe8] + cmp r0, #1 + moveq r5, #0x3e8 + ldrne r5, _021F285C ; =0x00000BB8 +_021F208C: + bl OS_GetTick + mov r4, r0 + mov r6, r1 + bl ov00_021F955C + ldr r1, [r0, #0xec] + ldr r0, [r0, #0xf0] + subs r3, r4, r1 + sbc r0, r6, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, r5 + bls _021F258C + bl ov00_021F955C + ldr r0, [r0, #0x204] + bl ov00_021F3CF8 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe8] + b _021F258C +_021F20FC: + bl ov00_021F955C + ldr r1, [r0, #0x190] + ldr r0, [r0, #0x18c] + cmp r1, #0 + cmpeq r0, #0 + beq _021F2188 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x18c] + ldr r0, [r0, #0x190] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F2860 ; =0x000061A8 + cmp r1, #0 + cmpeq r0, r2 + bls _021F258C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x18c] + str r1, [r0, #0x190] + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F631C + cmp r0, #0 + bne _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2188: + bl ov00_021F955C + ldrb r0, [r0, #0x3cc] + cmp r0, #6 + bne _021F258C + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x45c] + ldr r0, [r0, #0x460] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F2864 ; =0x00001770 + cmp r1, #0 + cmpeq r0, r2 + bls _021F258C + bl ov00_021F955C + ldrb r1, [r0, #0x3cd] + add r1, r1, #1 + strb r1, [r0, #0x3cd] + bl ov00_021F955C + ldrb r0, [r0, #0x3cd] + cmp r0, #5 + bls _021F2220 + bl ov00_021F2EC4 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F631C + cmp r0, #0 + bne _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2220: + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + add r1, r4, #0x3d4 + str r1, [sp] + add r3, r5, #0x300 + ldr r1, [r0, #0x458] + mov r0, #6 + str r1, [sp, #4] + ldr r1, [r7, #0x454] + ldr r2, [r6, #0x3d0] + ldrh r3, [r3, #0xce] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2280: + bl ov00_021F955C + ldrb r0, [r0, #0x3cc] + cmp r0, #2 + bne _021F258C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F22E8 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x45c] + ldr r0, [r0, #0x460] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F2864 ; =0x00001770 + cmp r1, #0 + cmpeq r0, r2 + bhi _021F2340 +_021F22E8: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F258C + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x45c] + ldr r0, [r0, #0x460] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F2868 ; =0x00004A38 + cmp r1, #0 + cmpeq r0, r2 + bls _021F258C +_021F2340: + bl ov00_021F2EC4 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + cmp r0, #0 + bne _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2374: + bl ov00_021F955C + ldrb r0, [r0, #0x3cc] + cmp r0, #8 + bne _021F258C + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x45c] + ldr r0, [r0, #0x460] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F286C ; =0x00007530 + cmp r1, #0 + cmpeq r0, r2 + bls _021F258C + bl ov00_021F955C + ldrb r1, [r0, #0x3cd] + add r1, r1, #1 + strb r1, [r0, #0x3cd] + bl ov00_021F955C + ldrb r0, [r0, #0x3cd] + cmp r0, #0 + beq _021F2434 + bl ov00_021F2EC4 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F242C + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + cmp r0, #0 + bne _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F242C: + bl ov00_021F6FC4 + b _021F258C +_021F2434: + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + add r1, r4, #0x3d4 + str r1, [sp] + add r3, r5, #0x300 + ldr r1, [r0, #0x458] + mov r0, #8 + str r1, [sp, #4] + ldr r1, [r7, #0x454] + ldr r2, [r6, #0x3d0] + ldrh r3, [r3, #0xce] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2494: + bl ov00_021EE568 + cmp r0, #5 + bne _021F258C + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1f8] + ldr r0, [r0, #0x1fc] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F286C ; =0x00007530 + cmp r1, #0 + cmpeq r0, r2 + bls _021F258C + bl ov00_021F955C + ldrb r0, [r0, #0x1ad] + cmp r0, #5 + blo _021F2514 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F631C + cmp r0, #0 + bne _021F258C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F2514: + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + str r1, [sp] + str r1, [sp, #4] + ldrh r3, [r0, #0xa4] + ldr r1, [r5, #0xf4] + ldr r2, [r4, #0x24] + mov r0, #0x40 + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldrb r1, [r0, #0x1ad] + add r1, r1, #1 + strb r1, [r0, #0x1ad] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + ldr r2, _021F2870 ; =0xFF403B3A + mvn r3, #0 + adds r0, r0, r2 + str r0, [r4, #0x1f8] + adc r0, r1, r3 + str r0, [r4, #0x1fc] +_021F258C: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + beq _021F25AC + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #6 + bne _021F2624 +_021F25AC: + bl ov00_021F955C + ldr r1, [r0, #0x188] + ldr r0, [r0, #0x184] + cmp r1, #0 + cmpeq r0, #0 + beq _021F2624 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x184] + ldr r0, [r0, #0x188] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F2874 ; =0x00002710 + cmp r1, #0 + cmpeq r0, r2 + bls _021F2624 + bl ov00_021F955C + mov r1, #0 + add r3, r0, #0x194 + mov r2, r1 + mov r0, #1 + bl ov00_021F9104 +_021F2624: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + beq _021F26E4 + ldr r0, _021F2878 ; =ov00_0221A928 + mov r1, #0 + str r1, [r0, #0x18] + str r1, [r0, #0x14] + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_02213938 + ldr r0, _021F2878 ; =ov00_0221A928 + ldr r0, [r0, #0x14] + cmp r0, #0 + beq _021F2678 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022136E4 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe4] +_021F2678: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + beq _021F26E4 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_02213984 + cmp r0, #0 + beq _021F26E4 + bl ov00_021F955C + ldr r1, [r0, #0x178] + ldr r0, [r0, #0x174] + cmp r1, #0 + cmpeq r0, #0 + beq _021F26E4 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x178] + ldr r0, [r0, #0x174] + cmp r5, r1 + cmpeq r4, r0 + bls _021F26E4 + ldr r1, _021F287C ; =0xFFFEB3EE + mov r0, #6 + bl ov00_021F2EE4 +_021F26E4: + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_021F1D34 + ldr r0, _021F2878 ; =ov00_0221A928 + mov r1, #0 + str r1, [r0, #0xc] + mov r1, #1 + str r1, [r0, #0x10] + bl ov00_022103C4 + ldr r0, _021F2878 ; =ov00_0221A928 + mov r2, #0 + str r2, [r0, #0x10] + ldr r1, [r0, #0xc] + cmp r1, #1 + bne _021F2728 + str r2, [r0, #0xc] + bl ov00_0220FB40 +_021F2728: + bl ov00_021F955C + ldr r0, [r0, #4] + cmp r0, #0 + beq _021F2748 + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220CFC4 +_021F2748: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x12 + bne _021F27B0 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1f0] + ldr r0, [r0, #0x1f4] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F2854 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F285C ; =0x00000BB8 + cmp r1, #0 + cmpeq r0, r2 + bls _021F27B0 + bl ov00_021F6FF8 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_021F27B0: + bl ov00_021F7384 + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F7898 + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F7E4C + bl ov00_021F955C + ldrb r0, [r0, #0x1ae] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xa + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r4, #0x16] + bl ov00_021F36BC + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ae] + bl ov00_021F955C + ldr r0, [r0, #0x47c] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x480] + ldr r1, [r4, #0x47c] + blx r1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F2854: .word 0x000082EA +_021F2858: .word 0xFFFEC5D2 +_021F285C: .word 0x00000BB8 +_021F2860: .word 0x000061A8 +_021F2864: .word 0x00001770 +_021F2868: .word 0x00004A38 +_021F286C: .word 0x00007530 +_021F2870: .word 0xFF403B3A +_021F2874: .word 0x00002710 +_021F2878: .word ov00_0221A928 +_021F287C: .word 0xFFFEB3EE + arm_func_end ov00_021F1DE4 + + arm_func_start ov00_021F2880 +ov00_021F2880: ; 0x021F2880 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r0, [sp, #0x18] + mov r4, r3 + cmp r0, #0 + cmpne r4, #0 + mov r5, r1 + mov r6, r2 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r1, sp, #0 + mov r0, #0 + mov r2, #8 + bl MIi_CpuClear32 + mov r1, r6, asr #8 + mov r0, r6, lsl #8 + mov r2, #2 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strb r2, [sp, #1] + strh r0, [sp, #2] + str r5, [sp, #4] + ldrb r5, [r4] + cmp r5, #0xfe + ldreqb r0, [r4, #1] + cmpeq r0, #0xfd + beq _021F28FC + cmp r5, #0x5c + bne _021F2928 +_021F28FC: + bl ov00_021F955C + ldr r0, [r0, #0x10] + cmp r0, #0 + beq _021F2964 + bl ov00_021F955C + ldr r0, [r0, #0x10] + ldr r2, [sp, #0x18] + add r3, sp, #0 + mov r1, r4 + bl ov00_02211A88 + b _021F2964 +_021F2928: + ldr r1, _021F2970 ; =ov00_02219D28 + mov r0, r4 + mov r2, #6 + bl memcmp + cmp r0, #0 + bne _021F2954 + ldr r1, [sp, #0x18] + add r2, sp, #0 + mov r0, r4 + bl ov00_0221075C + b _021F2964 +_021F2954: + add sp, sp, #8 + cmp r5, #0xfe + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F2964: + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F2970: .word ov00_02219D28 + arm_func_end ov00_021F2880 + + arm_func_start ov00_021F2974 +ov00_021F2974: ; 0x021F2974 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl ov00_021F955C + cmp r0, #0 + beq _021F29B0 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #7 + bne _021F29B0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a9] + cmp r0, #0 + beq _021F29C4 +_021F29B0: + ldr r1, _021F2BA4 ; =ov00_02217A74 + mov r0, r8 + mvn r2, #0 + bl ov00_0220D00C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021F29C4: + bl ov00_021EE6D0 + mov r5, r0 + mvn r2, #0 + cmp r5, r2 + bne _021F29F4 + ldr r1, _021F2BA8 ; =ov00_02217A80 + mov r0, r8 + bl ov00_0220D00C + ldr r1, _021F2BAC ; =0xFFFEABC4 + mov r0, #6 + bl ov00_021F2EE4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021F29F4: + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0x210] + cmp r7, r0 + bne _021F2A38 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #1 + add r0, r0, #0x200 + ldrh r0, [r0, #0x90] + cmp r6, r0 + beq _021F2AC4 +_021F2A38: + ldr r0, [sp, #0x24] + ldrb r1, [r0] + cmp r1, #0 + beq _021F2AB0 + mov r1, #0 + mov r2, #0xa + bl strtoul + mov r4, r0 + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0xf4] + cmp r4, r0 + bne _021F2AB0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #2 + str r7, [r0, #0x210] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #1 + add r0, r0, #0x200 + strh r6, [r0, #0x90] + b _021F2AC4 +_021F2AB0: + ldr r1, _021F2BB0 ; =ov00_02217A8C + mov r0, r8 + mvn r2, #0 + bl ov00_0220D00C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021F2AC4: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x18c] + str r1, [r0, #0x190] + bl ov00_021F955C + ldr r1, [r0, #8] + mov r0, r8 + bl ov00_0220D000 + cmp r0, #0 + bne _021F2AFC + ldr r1, _021F2BB4 ; =0xFFFEC5E6 + mov r0, #6 + bl ov00_021F2EE4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021F2AFC: + bl ov00_021F2EC4 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + bne _021F2B30 + ldr r1, [sp, #0x20] + ldr r0, _021F2BB8 ; =0x0000FFFF + mov r4, r1, asr #1 + cmp r0, r1, asr #1 + movle r4, r0 + bl ov00_021F955C + add r0, r0, #0x100 + strh r4, [r0, #0xb0] +_021F2B30: + mov r0, r5 + bl ov00_021EE72C + mov r4, r0 + mov r0, r5 + bl ov00_021EE7A4 + str r8, [r4] + mov r4, r0 + bl ov00_021F955C + ldrb r1, [r0, #0xd] + add r1, r1, #1 + strb r1, [r0, #0xd] + strb r5, [r4] + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r1, [r0, #0xd] + mov r0, r8 + mov r2, #0 + sub r1, r1, #1 + add r1, r5, r1 + ldrb r3, [r1, #0x2d0] + mov r1, r4 + strb r3, [r4, #1] + strh r2, [r4, #2] + str r2, [r4, #4] + bl ov00_0220D2A4 + mov r0, #2 + bl ov00_021F64C0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021F2BA4: .word ov00_02217A74 +_021F2BA8: .word ov00_02217A80 +_021F2BAC: .word 0xFFFEABC4 +_021F2BB0: .word ov00_02217A8C +_021F2BB4: .word 0xFFFEC5E6 +_021F2BB8: .word 0x0000FFFF + arm_func_end ov00_021F2974 + + arm_func_start ov00_021F2BBC +ov00_021F2BBC: ; 0x021F2BBC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + mov r6, r0 + mov r4, r1 + bl ov00_021F955C + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, pc} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #7 + beq _021F2C00 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xc + addne sp, sp, #0x1c + ldmneia sp!, {r4, r5, r6, r7, pc} +_021F2C00: + cmp r4, #0 + beq _021F2D7C + cmp r4, #5 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, pc} + cmp r4, #6 + bne _021F2D50 + bl ov00_021F955C + ldrb r1, [r0, #0xc] + add r1, r1, #1 + strb r1, [r0, #0xc] + bl ov00_021F955C + ldrb r0, [r0, #0xc] + cmp r0, #5 + bls _021F2C6C + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xc] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2C6C: + bl ov00_021F955C + ldr r3, [r0, #0x200] + ldr r2, _021F2E34 ; =ov00_02217A64 + add r0, sp, #0x10 + mov r1, #0xc + bl OS_SNPrintf + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r2, [r6, #0x14] + ldrb r1, [r0, #0x14] + add r0, r7, r2, lsl #2 + add r1, r5, r1, lsl #1 + add r1, r1, #0x200 + ldrh r1, [r1, #0x90] + ldr r0, [r0, #0x210] + mov r2, #0 + bl ov00_0220F724 + mov r5, r0 + bl ov00_021F955C + mvn r1, #0 + str r1, [sp] + ldr r3, _021F2E38 ; =0x00001388 + mov r1, #0 + str r3, [sp, #4] + ldr r0, [r0, #8] + mov r2, r5 + str r0, [sp, #8] + str r1, [sp, #0xc] + ldr r0, [r4, #4] + add r3, sp, #0x10 + ldr r0, [r0] + bl ov00_0220D018 + cmp r0, #1 + bne _021F2D1C + bl ov00_021F8514 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2D1C: + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, pc} + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + add sp, sp, #0x1c + cmp r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2D50: + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + add sp, sp, #0x1c + cmp r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2D7C: + bl ov00_021EE6D0 + mov r5, r0 + mvn r1, #0 + cmp r5, r1 + bne _021F2DA4 + ldr r1, _021F2E3C ; =0xFFFEABC4 + mov r0, #6 + bl ov00_021F2EE4 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2DA4: + bl ov00_021EE72C + mov r4, r0 + mov r0, r5 + bl ov00_021EE7A4 + str r6, [r4] + mov r4, r0 + bl ov00_021F955C + ldrb r2, [r0, #0xd] + mov r1, #0 + add r2, r2, #1 + strb r2, [r0, #0xd] + strb r5, [r4] + strh r1, [r4, #2] + str r1, [r4, #4] + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r2, [r0, #0xd] + mov r0, r6 + mov r1, r4 + add r2, r5, r2 + ldrb r2, [r2, #0x2d0] + strb r2, [r4, #1] + bl ov00_0220D2A4 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xc + bne _021F2E24 + mov r0, #0 + bl ov00_021F64C0 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} +_021F2E24: + mov r0, #1 + bl ov00_021F64C0 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_021F2E34: .word ov00_02217A64 +_021F2E38: .word 0x00001388 +_021F2E3C: .word 0xFFFEABC4 + arm_func_end ov00_021F2BBC + + arm_func_start ov00_021F2E40 +ov00_021F2E40: ; 0x021F2E40 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x218 + mov sb, #0 + mov fp, r1 + mov sl, r2 + add r8, sp, #8 + mov r7, sb + mov r6, #0xa + add r5, sp, #0x18 + mvn r4, #0 +_021F2E68: + mov r0, r8 + mov r2, sb + add r1, sl, #1 + bl ov00_021F46A4 + cmp r0, r4 + beq _021F2EA0 + mov r0, r8 + mov r1, r7 + mov r2, r6 + bl strtoul + str r0, [r5, sb, lsl #2] + add sb, sb, #1 + cmp sb, #0x80 + blt _021F2E68 +_021F2EA0: + add r0, sp, #0x18 + stmia sp, {r0, sb} + mov r2, #0 + ldrb r0, [sl] + mov r1, fp + mov r3, r2 + bl ov00_021F4740 + add sp, sp, #0x218 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021F2E40 + + arm_func_start ov00_021F2EC4 +ov00_021F2EC4: ; 0x021F2EC4 + stmdb sp!, {r3, lr} + bl ov00_021F955C + mov r1, #0xff + strb r1, [r0, #0x3cc] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x3cd] + ldmia sp!, {r3, pc} + arm_func_end ov00_021F2EC4 + + arm_func_start ov00_021F2EE4 +ov00_021F2EE4: ; 0x021F2EE4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + cmp r0, #0 + cmpne r4, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + bl ov00_021F7128 + mov r0, r4 + mov r1, r5 + bl ov00_021EC24C + ldr r1, _021F2F9C ; =ov00_02217A60 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + moveq r7, #1 + movne r7, #0 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + cmp r0, #0 + moveq r8, #1 + movne r8, #0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + bl ov00_021F0404 + mov r5, r0 + bl ov00_021F955C + str r5, [sp] + ldr r1, [r0, #0x468] + mov r0, r4 + str r1, [sp, #4] + ldr r4, [r6, #0x464] + mov r2, r8 + mov r3, r7 + mov r1, #0 + blx r4 + bl ov00_021F3C5C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021F2F9C: .word ov00_02217A60 + arm_func_end ov00_021F2EE4 + + arm_func_start ov00_021F2FA0 +ov00_021F2FA0: ; 0x021F2FA0 + stmdb sp!, {r3, lr} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + ldmeqia sp!, {r3, pc} + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x14] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x16] + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + ldmia sp!, {r3, pc} + arm_func_end ov00_021F2FA0 + + arm_func_start ov00_021F2FDC +ov00_021F2FDC: ; 0x021F2FDC + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r2 + cmp r1, #2 + beq _021F3004 + cmp r1, #3 + beq _021F30B0 + cmp r1, #4 + beq _021F3178 + ldmia sp!, {r4, r5, r6, pc} +_021F3004: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F30A0 + ldrb r0, [r4] + cmp r0, #1 + bne _021F302C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20c] +_021F302C: + ldrb r6, [r4, #1] + bl ov00_021F955C + ldrb r1, [r4, #2] + add r0, r0, r6 + strb r1, [r0, #0x2d0] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r1, [r0, #0x200] + add r0, r4, r6, lsl #2 + str r1, [r0, #0xf4] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F3078 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F308C +_021F3078: + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r4, #0x16] +_021F308C: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ad] + mov r0, #9 + bl ov00_021F956C +_021F30A0: + mov r0, r5 + mov r1, #3 + bl ov00_021F7294 + ldmia sp!, {r4, r5, r6, pc} +_021F30B0: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x10 + bne _021F3168 + bl ov00_021F955C + ldr r2, [r0, #0x1d4] + mov r1, #1 + orr r1, r2, r1, lsl r5 + str r1, [r0, #0x1d4] + ldrb r1, [r4] + ldrb r0, [r4, #1] + orr r4, r1, r0, lsl #8 + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb0] + cmp r4, r0 + ble _021F3100 + bl ov00_021F955C + add r0, r0, #0x100 + strh r4, [r0, #0xb0] +_021F3100: + mov r0, #0 + bl ov00_021F7D50 + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x1d4] + cmp r4, r0 + ldmneia sp!, {r4, r5, r6, pc} + mov r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F315C + mov r4, #4 +_021F3134: + bl ov00_021F955C + add r0, r0, r5 + ldrb r0, [r0, #0x2d0] + mov r1, r4 + bl ov00_021F7294 + add r5, r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r5, r0 + ble _021F3134 +_021F315C: + mov r0, #0x11 + bl ov00_021F956C + ldmia sp!, {r4, r5, r6, pc} +_021F3168: + mov r0, r5 + mov r1, #4 + bl ov00_021F7294 + ldmia sp!, {r4, r5, r6, pc} +_021F3178: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #9 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, #4 + bl ov00_021F64C0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F2FDC + + arm_func_start ov00_021F3194 +ov00_021F3194: ; 0x021F3194 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021EE568 + cmp r0, #5 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r5, #0 + beq _021F31E4 + ldr r1, _021F3308 ; =0xFFFEC780 + mov r0, r5 + add r1, r4, r1 + bl ov00_021F2EE4 + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_021F31E4: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x2d0] + bl ov00_021F955C + ldrb r0, [r0, #0x1a9] + cmp r0, #1 + beq _021F3220 + bl ov00_021F955C + ldrb r0, [r0, #0x1a8] + cmp r0, #1 + beq _021F3220 + bl ov00_021F955C + ldrb r0, [r0, #0x1a8] + cmp r0, #2 + bne _021F3228 +_021F3220: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_021F3228: + bl ov00_021F955C + ldr r0, [r0, #0x19c] + cmp r0, #0 + beq _021F3250 + bl ov00_021F955C + ldr r0, [r0, #0x19c] + bl ov00_0221019C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F3250: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F3290 + bl ov00_021F955C + ldrb r0, [r0, #0x1a8] + cmp r0, #0 + bne _021F3300 + bl ov00_021F955C + mov r1, #3 + strb r1, [r0, #0x1a8] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 + b _021F3300 +_021F3290: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F32B0 + ldr r1, _021F330C ; =0xFFFEC5D2 + mov r0, #6 + bl ov00_021F2EE4 + b _021F3300 +_021F32B0: + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + beq _021F32C8 + bl ov00_021F6FF8 + b _021F3300 +_021F32C8: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F32F8 + mov r0, #0x12 + bl ov00_021F956C + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1f0] + str r1, [r4, #0x1f4] + b _021F3300 +_021F32F8: + mov r0, #1 + bl ov00_021F6EC4 +_021F3300: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F3308: .word 0xFFFEC780 +_021F330C: .word 0xFFFEC5D2 + arm_func_end ov00_021F3194 + + arm_func_start ov00_021F3310 +ov00_021F3310: ; 0x021F3310 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a8] + cmp r0, #2 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_021F6100 + ldmia sp!, {r4, pc} + arm_func_end ov00_021F3310 + + arm_func_start ov00_021F3334 +ov00_021F3334: ; 0x021F3334 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r5, #0 + mov r4, #0 + ble _021F3390 +_021F335C: + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + cmp r6, r0 + bne _021F3384 + mov r0, r4 + mov r1, r5 + bl ov00_021F3398 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_021F3384: + add r4, r4, #1 + cmp r4, r5 + blt _021F335C +_021F3390: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F3334 + + arm_func_start ov00_021F3398 +ov00_021F3398: ; 0x021F3398 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r0 + mov r8, r1 + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov00_021F955C + add r0, r0, sb, lsl #2 + ldr fp, [r0, #0xf4] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + add r0, r0, sb + ldrb r0, [r0, #0x2d0] + mov r1, #1 + ldr r2, [r4, #0x2f0] + mvn r0, r1, lsl r0 + and r0, r2, r0 + str r0, [r4, #0x2f0] + bl ov00_021F3590 + sub r0, r8, #1 + cmp sb, r0 + bge _021F34D8 + sub r0, r8, sb + sub r5, r0, #1 + cmp r5, #0 + mov r4, #0 + ble _021F34D8 +_021F340C: + add r7, sb, r4 + add r6, r7, #1 + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x24] + add r0, sl, r7, lsl #2 + str r1, [r0, #0x24] + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + add r0, r0, r6, lsl #1 + ldrh r1, [r0, #0xa4] + add r0, sl, r7, lsl #1 + strh r1, [r0, #0xa4] + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + add r1, sl, r7, lsl #2 + add r0, r0, r6, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r1, #0xf4] + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + add r1, sl, r7, lsl #2 + add r0, r0, r6, lsl #2 + ldr r0, [r0, #0x210] + str r0, [r1, #0x210] + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + add r1, sl, r7, lsl #1 + add r0, r0, r6, lsl #1 + add r0, r0, #0x200 + ldrh r2, [r0, #0x90] + add r0, r1, #0x200 + strh r2, [r0, #0x90] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + add r0, sb, r0 + add r0, r4, r0 + ldrb r1, [r0, #0x2d1] + add r0, sb, r6 + add r0, r4, r0 + strb r1, [r0, #0x2d0] + add r4, r4, #1 + cmp r4, r5 + blt _021F340C +_021F34D8: + cmp r8, #0 + ble _021F3548 + sub r4, r8, #1 + bl ov00_021F955C + add r0, r0, r4, lsl #2 + mov r1, #0 + str r1, [r0, #0x24] + bl ov00_021F955C + add r0, r0, r4, lsl #1 + mov r1, #0 + strh r1, [r0, #0xa4] + bl ov00_021F955C + add r0, r0, r4, lsl #2 + mov r1, #0 + str r1, [r0, #0xf4] + bl ov00_021F955C + add r0, r0, r4, lsl #2 + mov r1, #0 + str r1, [r0, #0x210] + bl ov00_021F955C + add r0, r0, r4, lsl #1 + add r0, r0, #0x200 + mov r1, #0 + strh r1, [r0, #0x90] + bl ov00_021F955C + add r0, r0, r4 + mov r1, #0 + strb r1, [r0, #0x2d0] +_021F3548: + mov r0, fp + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021F3398 + + arm_func_start ov00_021F3550 +ov00_021F3550: ; 0x021F3550 + stmdb sp!, {r3, lr} + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021F955C + ldrb r0, [r0, #0xd] + ldmia sp!, {r3, pc} + arm_func_end ov00_021F3550 + + arm_func_start ov00_021F3570 +ov00_021F3570: ; 0x021F3570 + stmdb sp!, {r3, lr} + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021F955C + ldrb r0, [r0, #0xe] + ldmia sp!, {r3, pc} + arm_func_end ov00_021F3570 + + arm_func_start ov00_021F3590 +ov00_021F3590: ; 0x021F3590 + stmdb sp!, {r4, r5, r6, lr} + mvn r5, #0 + mov r6, #0 + mov r4, #1 +_021F35A0: + bl ov00_021F955C + ldr r0, [r0, #0x2f0] + tst r0, r4, lsl r6 + add r6, r6, #1 + addne r5, r5, #1 + cmp r6, #0x20 + blt _021F35A0 + mvn r0, #0 + cmp r5, r0 + bne _021F35D8 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xe] + ldmia sp!, {r4, r5, r6, pc} +_021F35D8: + bl ov00_021F955C + strb r5, [r0, #0xe] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F3590 + + arm_func_start ov00_021F35E4 +ov00_021F35E4: ; 0x021F35E4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021F955C + add r0, r0, #0x2d0 + str r0, [r4] + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov00_021F35E4 + + arm_func_start ov00_021F3618 +ov00_021F3618: ; 0x021F3618 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + bl ov00_021F955C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _021F36B8 ; =ov00_0221B080 + mov r1, #0 + mov r2, #0x20 + bl MI_CpuFill8 + mov r5, #0 + bl ov00_021F955C + ldrb r0, [r0, #0xe] + cmp r0, #0 + blt _021F36A0 + ldr r6, _021F36B8 ; =ov00_0221B080 + mov r4, #1 +_021F365C: + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + add r0, r0, r5 + ldrb r0, [r0, #0x2d0] + ldr r1, [r8, #0x2f0] + tst r1, r4, lsl r0 + beq _021F36A0 + bl ov00_021F955C + add r0, r0, r5 + ldrb r0, [r0, #0x2d0] + add r5, r5, #1 + strb r0, [r6], #1 + bl ov00_021F955C + ldrb r0, [r0, #0xe] + cmp r5, r0 + ble _021F365C +_021F36A0: + ldr r0, _021F36B8 ; =ov00_0221B080 + str r0, [r7] + bl ov00_021F955C + ldrb r0, [r0, #0xe] + add r0, r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021F36B8: .word ov00_0221B080 + arm_func_end ov00_021F3618 + + arm_func_start ov00_021F36BC +ov00_021F36BC: ; 0x021F36BC + stmdb sp!, {lr} + sub sp, sp, #0x2c + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + addne sp, sp, #0x2c + movne r0, #0 + ldmneia sp!, {pc} + bl ov00_021F955C + ldrb r1, [r0, #0x16] + ldr r2, _021F377C ; =ov00_02217A64 + add r0, sp, #0x20 + add r3, r1, #1 + mov r1, #0xc + bl OS_SNPrintf + ldr r0, _021F3780 ; =ov00_02217AA4 + add r1, sp, #0x20 + add r2, sp, #0 + mov r3, #0x2f + bl ov00_021ED470 + bl ov00_021F955C + ldrb r2, [r0, #0xd] + add r0, sp, #0x20 + mov r1, #0xc + add r3, r2, #1 + ldr r2, _021F377C ; =ov00_02217A64 + bl OS_SNPrintf + ldr r0, _021F3784 ; =ov00_02217AA8 + add r1, sp, #0x20 + add r2, sp, #0 + mov r3, #0x2f + bl ov00_021ED4A8 + ldr r2, _021F377C ; =ov00_02217A64 + add r0, sp, #0x20 + mov r1, #0xc + mov r3, #3 + bl OS_SNPrintf + ldr r0, _021F3788 ; =ov00_02217A70 + add r1, sp, #0x20 + add r2, sp, #0 + mov r3, #0x2f + bl ov00_021ED4A8 + mov r0, #6 + add r1, sp, #0 + mov r2, #0 + bl ov00_021F04A0 + add sp, sp, #0x2c + ldmia sp!, {pc} + .balign 4, 0 +_021F377C: .word ov00_02217A64 +_021F3780: .word ov00_02217AA4 +_021F3784: .word ov00_02217AA8 +_021F3788: .word ov00_02217A70 + arm_func_end ov00_021F36BC + + arm_func_start ov00_021F378C +ov00_021F378C: ; 0x021F378C + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov00_021F954C + ldr r0, _021F3800 ; =ov00_0221A928 + ldr r1, [r0, #8] + cmp r1, #0 + beq _021F37C0 + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _021F3800 ; =ov00_0221A928 + mov r1, #0 + str r1, [r0, #8] +_021F37C0: + bl ov00_021F7AD8 + ldr r0, _021F3800 ; =ov00_0221A928 + ldr r1, [r0] + cmp r1, #0 + beq _021F37EC + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _021F3800 ; =ov00_0221A928 + mov r1, #0 + str r1, [r0] +_021F37EC: + ldr r0, _021F3800 ; =ov00_0221A928 + mov r1, #0 + strb r1, [r0, #0x1c] + strb r1, [r0, #0x1d] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F3800: .word ov00_0221A928 + arm_func_end ov00_021F378C + + arm_func_start ov00_021F3804 +ov00_021F3804: ; 0x021F3804 + stmdb sp!, {r3, lr} + bl ov00_021F955C + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021F3804 + + arm_func_start ov00_021F381C +ov00_021F381C: ; 0x021F381C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xc] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17c] + bl ov00_021F955C + mov r5, r0 + mov r0, #0x10000 + bl ov00_021ED5E4 + add r1, r5, #0x100 + strh r0, [r1, #0x7e] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x180] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x184] + str r1, [r0, #0x188] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x18c] + str r1, [r0, #0x190] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a4] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a9] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1aa] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ab] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ac] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a7] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + bl ov00_021F955C + mov r1, #0 + add r0, r0, #0x100 + strh r1, [r0, #0xb2] + bl ov00_021F955C + mov r1, #0 + add r0, r0, #0x100 + strh r1, [r0, #0xb4] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1b8] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1e0] + str r1, [r0, #0x1e4] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1f0] + str r1, [r0, #0x1f4] + bl ov00_021F955C + add r1, r0, #0x3cc + mov r0, #0 + mov r2, #0x98 + bl MIi_CpuClear32 + cmp r4, #2 + bne _021F3988 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r4, #0x14] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F396C + mov r0, #1 + bl ov00_021F956C + ldmia sp!, {r3, r4, r5, pc} +_021F396C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0xa + bl ov00_021F956C + ldmia sp!, {r3, r4, r5, pc} +_021F3988: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xd] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xe] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x14] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a5] + bl ov00_021F955C + mov r1, #0 + add r0, r0, #0x100 + strh r1, [r0, #0xb0] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c0] + str r1, [r0, #0x1c4] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c8] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1cc] + str r1, [r0, #0x1d0] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1d4] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x2f0] + bl ov00_021F955C + add r1, r0, #0x24 + mov r0, #0 + mov r2, #0x80 + bl MIi_CpuClear32 + bl ov00_021F955C + add r1, r0, #0xa4 + mov r0, #0 + mov r2, #0x40 + bl MIi_CpuClear16 + bl ov00_021F955C + add r1, r0, #0xf4 + mov r0, #0 + mov r2, #0x80 + bl MIi_CpuClear32 + bl ov00_021F955C + add r1, r0, #0x194 + mov r0, #0 + mov r2, #0xc + bl MIi_CpuClear32 + bl ov00_021F955C + add r1, r0, #0x210 + mov r0, #0 + mov r2, #0x80 + bl MIi_CpuClear32 + bl ov00_021F955C + add r1, r0, #0x290 + mov r0, #0 + mov r2, #0x40 + bl MIi_CpuClear16 + bl ov00_021F955C + add r0, r0, #0x2d0 + mov r1, #0 + mov r2, #0x20 + bl MI_CpuFill8 + bl ov00_021F955C + add r1, r0, #0x348 + mov r0, #0 + mov r2, #0x84 + bl MIi_CpuClear32 + cmp r4, #1 + bne _021F3B34 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F3B18 + mov r0, #3 + bl ov00_021F956C + ldmia sp!, {r3, r4, r5, pc} +_021F3B18: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #4 + bl ov00_021F956C + ldmia sp!, {r3, r4, r5, pc} +_021F3B34: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x15] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x16] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x18] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20c] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a6] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ae] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ad] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1f8] + str r1, [r0, #0x1fc] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x46c] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x470] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F381C + + arm_func_start ov00_021F3BB4 +ov00_021F3BB4: ; 0x021F3BB4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021F381C + bl ov00_021F955C + strb r7, [r0, #0x15] + bl ov00_021F955C + strb r6, [r0, #0x16] + bl ov00_021F955C + str r5, [r0, #0x464] + bl ov00_021F955C + str r4, [r0, #0x468] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17d] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x2d0] + mov r0, #0x32 + ldr r1, _021F3C48 ; =ov00_02217AAC + bl ov00_02212008 + mov r0, #0x33 + ldr r1, _021F3C4C ; =ov00_02217AB4 + bl ov00_02212008 + mov r0, #0x34 + ldr r1, _021F3C50 ; =ov00_02217AC0 + bl ov00_02212008 + mov r0, #0x35 + ldr r1, _021F3C54 ; =ov00_02217ACC + bl ov00_02212008 + mov r0, #0x36 + ldr r1, _021F3C58 ; =ov00_02217AD8 + bl ov00_02212008 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F3C48: .word ov00_02217AAC +_021F3C4C: .word ov00_02217AB4 +_021F3C50: .word ov00_02217AC0 +_021F3C54: .word ov00_02217ACC +_021F3C58: .word ov00_02217AD8 + arm_func_end ov00_021F3BB4 + + arm_func_start ov00_021F3C5C +ov00_021F3C5C: ; 0x021F3C5C + stmdb sp!, {r3, lr} + bl ov00_021F955C + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + beq _021F3CAC + ldr r0, _021F3CF4 ; =ov00_0221A928 + ldr r1, [r0, #0x18] + cmp r1, #0 + movne r1, #1 + strne r1, [r0, #0x14] + bne _021F3CAC + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022136E4 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe4] +_021F3CAC: + bl ov00_021F125C + mov r0, #0 + bl ov00_021F956C + ldr r0, _021F3CF4 ; =ov00_0221A928 + ldr r1, [r0, #8] + cmp r1, #0 + beq _021F3CE0 + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _021F3CF4 ; =ov00_0221A928 + mov r1, #0 + str r1, [r0, #8] +_021F3CE0: + bl ov00_021F7AD8 + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x18] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F3CF4: .word ov00_0221A928 + arm_func_end ov00_021F3C5C + + arm_func_start ov00_021F3CF8 +ov00_021F3CF8: ; 0x021F3CF8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1b0 + mov r7, #8 + mov r6, #0xa + mov r5, #0x32 + mov r4, #0x33 + mov r3, #0x34 + mov r2, #0x35 + mov r1, #0x36 + strb r7, [sp, #0xc] + strb r6, [sp, #0xd] + strb r5, [sp, #0xe] + strb r4, [sp, #0xf] + strb r3, [sp, #0x10] + strb r2, [sp, #0x11] + strb r1, [sp, #0x12] + mov r4, r0 + mov r8, #7 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F3D60 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F3D8C +_021F3D60: + ldr r2, _021F3EDC ; =ov00_0221A948 + add r3, sp, #0x13 + mov r1, #0 +_021F3D6C: + ldrb r0, [r2] + add r1, r1, #1 + add r2, r2, #0xc + cmp r0, #0 + strneb r0, [r3], #1 + addne r8, r8, #1 + cmp r1, #0x9a + blt _021F3D6C +_021F3D8C: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _021F3E44 +_021F3DA0: ; jump table + b _021F3E44 ; case 0 + b _021F3E44 ; case 1 + b _021F3E24 ; case 2 + b _021F3DB8 ; case 3 + b _021F3E24 ; case 4 + b _021F3E24 ; case 5 +_021F3DB8: + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + bne _021F3E1C + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r1, [r5, #0x200] + ldrb r2, [r4, #0x16] + ldrb r3, [r0, #0x15] + add r0, sp, #0xad + bl ov00_021F3EF4 + mov r1, r0 + ldr r0, _021F3EE0 ; =ov00_0221A928 + ldr r3, [r0, #8] + cmp r3, #0 + beq _021F3E44 + add r0, sp, #0xad + add r0, r0, r1 + ldr r2, _021F3EE4 ; =ov00_02217AE4 + rsb r1, r1, #0x100 + bl OS_SNPrintf + b _021F3E44 +_021F3E1C: + bl ov00_021F955C + ldr r4, [r0, #0x208] +_021F3E24: + ldr r2, _021F3EE8 ; =ov00_02217AF0 + ldr r3, _021F3EEC ; =ov00_02217AAC + add r0, sp, #0xad + mov r1, #0x100 + str r4, [sp] + bl OS_SNPrintf + bl ov00_021F955C + str r4, [r0, #0x204] +_021F3E44: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_0221396C + mov sl, #0 + add r7, sp, #0xad + mov r6, #6 + mov r5, #1 + mov r4, sl + add fp, sp, #0xc +_021F3E68: + bl ov00_021F955C + str r8, [sp] + str r7, [sp, #4] + str r6, [sp, #8] + ldr r0, [r0, #0xe4] + mov r1, r5 + mov r2, r4 + mov r3, fp + bl ov00_02213838 + movs sb, r0 + beq _021F3EA8 + cmp sb, #2 + bne _021F3EA8 + add sl, sl, #1 + cmp sl, #5 + blt _021F3E68 +_021F3EA8: + cmp sb, #0 + bne _021F3ED0 + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + ldr r2, _021F3EF0 ; =0x00EFB5F7 + adds r0, r0, r2 + str r0, [r4, #0x174] + adc r0, r1, #0 + str r0, [r4, #0x178] +_021F3ED0: + mov r0, sb + add sp, sp, #0x1b0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F3EDC: .word ov00_0221A948 +_021F3EE0: .word ov00_0221A928 +_021F3EE4: .word ov00_02217AE4 +_021F3EE8: .word ov00_02217AF0 +_021F3EEC: .word ov00_02217AAC +_021F3EF0: .word 0x00EFB5F7 + arm_func_end ov00_021F3CF8 + + arm_func_start ov00_021F3EF4 +ov00_021F3EF4: ; 0x021F3EF4 + stmdb sp!, {lr} + sub sp, sp, #0x24 + mov lr, #3 + ldr ip, _021F3F48 ; =ov00_02217AAC + str lr, [sp] + str ip, [sp, #4] + str r1, [sp, #8] + str r2, [sp, #0xc] + str r2, [sp, #0x10] + ldr r2, _021F3F4C ; =ov00_02217AB4 + ldr r1, _021F3F50 ; =ov00_02217AC0 + str r2, [sp, #0x14] + str r3, [sp, #0x18] + str r1, [sp, #0x1c] + ldr r2, _021F3F54 ; =ov00_02217AF8 + ldr r3, _021F3F58 ; =ov00_02217ACC + mov r1, #0x100 + str ip, [sp, #0x20] + bl OS_SNPrintf + add sp, sp, #0x24 + ldmia sp!, {pc} + .balign 4, 0 +_021F3F48: .word ov00_02217AAC +_021F3F4C: .word ov00_02217AB4 +_021F3F50: .word ov00_02217AC0 +_021F3F54: .word ov00_02217AF8 +_021F3F58: .word ov00_02217ACC + arm_func_end ov00_021F3EF4 + + arm_func_start ov00_021F3F5C +ov00_021F3F5C: ; 0x021F3F5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + mov r4, r0 + mov r8, r1 + mov r7, r2 + bl ov00_021F955C + cmp r4, #0 + ldrb r4, [r0, #0x14] + mov r6, #0 + bne _021F41A0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r2, [r0, #0x7e] + ldr r1, [r5, #0x200] + mov r0, r7 + mov r1, r1, lsl #0x10 + mov r2, r2, lsl #0x10 + orr r8, r2, r1, lsr #16 + bl ov00_02212EAC + cmp r0, #0 + beq _021F4018 + mov r0, r7 + bl ov00_02212E78 + mov r5, r0 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139E8 + cmp r5, r0 + movne r5, #1 + bne _021F40A0 + bl ov00_021F955C + mov r5, r0 + mov r0, r7 + bl ov00_02212EC4 + add r1, r5, r4, lsl #2 + str r0, [r1, #0x210] + bl ov00_021F955C + mov r5, r0 + mov r0, r7 + bl ov00_02212ECC + add r1, r5, r4, lsl #1 + add r1, r1, #0x200 + strh r0, [r1, #0x90] + mov r5, r6 + b _021F40A0 +_021F4018: + bl SOC_GetHostID + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r2, lsl #0x10 + ldr r1, _021F4244 ; =0x0000A8C0 + mov r0, r0, lsr #0x10 + cmp r0, r1 + beq _021F4060 + and r1, r2, #0xff + cmp r1, #0xac + bne _021F4058 + and r0, r2, #0xff00 + cmp r0, #0x1000 + blo _021F4058 + cmp r0, #0x1f00 + bls _021F4060 +_021F4058: + cmp r1, #0xa + bne _021F4068 +_021F4060: + mov r5, #1 + b _021F40A0 +_021F4068: + bl ov00_021F955C + mov r5, r0 + mov r0, r7 + bl ov00_02212E78 + add r1, r5, r4, lsl #2 + str r0, [r1, #0x210] + bl ov00_021F955C + mov r5, r0 + mov r0, r7 + bl ov00_02212E80 + add r1, r5, r4, lsl #1 + add r1, r1, #0x200 + strh r0, [r1, #0x90] + mov r5, #0 +_021F40A0: + cmp r5, #0 + beq _021F40CC + bl ov00_021F955C + mov r4, r0 + mov r0, #0x10000 + bl ov00_021ED5E4 + add r1, r4, #0x100 + strh r0, [r1, #0x7e] + bl ov00_021F955C + str r8, [r0, #0x19c] + b _021F4158 +_021F40CC: + bl SOC_GetHostID + str r0, [sp, #8] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D27C + str r0, [sp, #0xc] + bl ov00_021F955C + mov sb, r0 + mov r0, r7 + bl ov00_02212E78 + mov r8, r0 + mov r0, r7 + bl ov00_02212E80 + add r1, sb, r4, lsl #2 + add r4, sp, #8 + mov r3, r0 + mov r0, #2 + str r4, [sp] + str r0, [sp, #4] + ldr r1, [r1, #0xf4] + mov r2, r8 + mov r0, #6 + bl ov00_021F4304 + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + cmp r4, #0 + strb r1, [r0, #0x3cd] + addne sp, sp, #0x10 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F4158: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x194] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x195] + bl ov00_021F955C + mov r4, r0 + mov r0, r7 + bl ov00_02212E80 + add r1, r4, #0x100 + strh r0, [r1, #0x96] + bl ov00_021F955C + mov r4, r0 + mov r0, r7 + bl ov00_02212E78 + str r0, [r4, #0x198] + b _021F41E0 +_021F41A0: + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x194] + bl ov00_021F955C + mov r1, r6 + strb r1, [r0, #0x195] + bl ov00_021F955C + add r0, r0, #0x100 + mov r1, r6 + strh r1, [r0, #0x96] + bl ov00_021F955C + mov r1, r6 + str r1, [r0, #0x198] + bl ov00_021F955C + str r8, [r0, #0x19c] + mov r5, #1 +_021F41E0: + cmp r5, #0 + beq _021F41FC + bl ov00_021F955C + add r0, r0, #0x194 + bl ov00_021F4248 + mov r6, r0 + b _021F4238 +_021F41FC: + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D294 + mov r4, r0 + bl ov00_021F955C + add r3, r0, #0x194 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021F9104 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x18c] + str r1, [r0, #0x190] +_021F4238: + mov r0, r6 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021F4244: .word 0x0000A8C0 + arm_func_end ov00_021F3F5C + + arm_func_start ov00_021F4248 +ov00_021F4248: ; 0x021F4248 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + ldrb r0, [r7] + cmp r0, #0 + bne _021F42A0 + bl ov00_021F955C + mov r4, r0 + mov r1, #0 + ldr r0, [r7, #4] + mov r2, r1 + bl ov00_0220F724 + mov r1, r0 + ldrh r2, [r7, #2] + ldr r0, [r4, #0xe4] + ldr r3, [r7, #8] + bl ov00_022138C4 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #8 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_021F42A0: + ldr r5, _021F42FC ; =ov00_021F9104 + ldr r4, _021F4300 ; =ov00_021F9100 + mov r6, #0 +_021F42AC: + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D294 + stmia sp, {r5, r7} + ldrb r2, [r7] + ldr r1, [r7, #8] + mov r3, r4 + bl ov00_022100D4 + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #3 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r6, r6, #1 + cmp r6, #5 + blt _021F42AC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F42FC: .word ov00_021F9104 +_021F4300: .word ov00_021F9100 + arm_func_end ov00_021F4248 + + arm_func_start ov00_021F4304 +ov00_021F4304: ; 0x021F4304 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x220 + str r3, [sp, #0xc] + mov sl, r0 + str r1, [sp, #4] + str r2, [sp, #8] + ldr sb, [sp, #0x248] + ldr r8, [sp, #0x24c] + mov r6, #0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F4360 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F4358 + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + beq _021F4380 +_021F4358: + cmp sl, #6 + bne _021F4380 +_021F4360: + ldr r2, [sp, #0xc] + ldr r1, [sp, #8] + mov r0, sl + mov r3, sb + str r8, [sp] + bl ov00_021F44C8 + mov r4, r0 + b _021F4428 +_021F4380: + cmp sb, #0 + cmpne r8, #0 + beq _021F4400 + ldr r3, [sb] + ldr r2, _021F44C0 ; =ov00_02217A64 + add r0, sp, #0x20 + mov r1, #0x200 + bl OS_SNPrintf + mov r6, r0 + cmp r8, #1 + mov r7, #1 + ble _021F4400 + add r5, sp, #0x10 + add fp, sp, #0x20 +_021F43B8: + ldr r3, [sb, r7, lsl #2] + ldr r2, _021F44C4 ; =ov00_02217B50 + mov r0, r5 + mov r1, #0x10 + bl OS_SNPrintf + mov r4, r0 + add r0, r6, r4 + add r0, r0, #1 + cmp r0, #0x200 + bhi _021F4400 + mov r0, r5 + add r1, fp, r6 + mov r2, r4 + bl MI_CpuCopy8 + add r7, r7, #1 + add r6, r6, r4 + cmp r7, r8 + blt _021F43B8 +_021F4400: + add r0, sp, #0x20 + mov r1, #0 + strb r1, [r0, r6] + bl ov00_021F955C + ldr r0, [r0] + ldr r2, [sp, #4] + add r3, sp, #0x20 + mov r1, sl + bl ov00_021F45E0 + mov r4, r0 +_021F4428: + cmp sl, #2 + cmpne sl, #6 + beq _021F4444 + add r0, sl, #0xf8 + and r0, r0, #0xff + cmp r0, #1 + bhi _021F44B4 +_021F4444: + bl ov00_021F955C + strb sl, [r0, #0x3cc] + bl ov00_021F955C + add r1, r0, #0x300 + ldr r0, [sp, #0xc] + strh r0, [r1, #0xce] + bl ov00_021F955C + ldr r1, [sp, #8] + str r1, [r0, #0x3d0] + bl ov00_021F955C + ldr r1, [sp, #4] + str r1, [r0, #0x454] + bl ov00_021F955C + str r8, [r0, #0x458] + bl ov00_021F955C + mov r5, r0 + bl OS_GetTick + str r0, [r5, #0x45c] + cmp sb, #0 + str r1, [r5, #0x460] + cmpne r8, #0 + beq _021F44B4 + bl ov00_021F955C + mov r1, r0 + mov r0, sb + add r1, r1, #0x3d4 + mov r2, r8, lsl #2 + bl MIi_CpuCopy32 +_021F44B4: + mov r0, r4 + add sp, sp, #0x220 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F44C0: .word ov00_02217A64 +_021F44C4: .word ov00_02217B50 + arm_func_end ov00_021F4304 + + arm_func_start ov00_021F44C8 +ov00_021F44C8: ; 0x021F44C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x98 + ldr r5, [sp, #0xb8] + mov r4, r0 + cmp r5, #0x20 + movhi r5, #0x20 + cmp r3, #0 + cmpne r5, #0 + mov r8, r1 + mov r7, r2 + moveq r5, #0 + beq _021F4508 + add r1, sp, #0x18 + mov r0, r3 + mov r2, r5, lsl #2 + bl MIi_CpuCopy32 +_021F4508: + ldr r2, _021F45DC ; =ov00_02217B54 + mov r0, r5, lsl #2 + ldrb r1, [r2, #4] + ldrb r6, [r2] + add sb, sp, #4 + ldrb r5, [r2, #1] + ldrb r3, [r2, #2] + ldrb r2, [r2, #3] + strb r1, [sb, #4] + mov r1, #3 + strb r6, [sb] + strb r5, [sb, #1] + strb r3, [sb, #2] + strb r2, [sb, #3] + str r1, [sp, #8] + strb r4, [sp, #0xc] + strb r0, [sp, #0xd] + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + strh r0, [sp, #0xe] + bl ov00_021F955C + ldr r0, [r0, #0x1c] + str r0, [sp, #0x10] + bl ov00_021F955C + ldr r0, [r0, #0x200] + mov r6, #0 + str r0, [sp, #0x14] + mov r4, r6 +_021F4578: + bl ov00_021F955C + mov r5, r0 + mov r0, r8 + mov r1, r4 + mov r2, r4 + bl ov00_0220F724 + mov r1, r0 + ldrb r0, [sp, #0xd] + mov r2, r7 + mov r3, sb + add r0, r0, #0x14 + str r0, [sp] + ldr r0, [r5, #0xe4] + bl ov00_0221386C + cmp r0, #0 + addeq sp, sp, #0x98 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r0, #2 + addne sp, sp, #0x98 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r6, r6, #1 + cmp r6, #5 + blt _021F4578 + add sp, sp, #0x98 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021F45DC: .word ov00_02217B54 + arm_func_end ov00_021F44C8 + + arm_func_start ov00_021F45E0 +ov00_021F45E0: ; 0x021F45E0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x208 + mov sb, r0 + mov r8, r2 + mov r7, r3 + mov r0, #3 + mov r5, r1 + str r0, [sp] + ldr r4, _021F4694 ; =ov00_02217B6C + ldr r2, _021F4698 ; =ov00_02217B5C + ldr r3, _021F469C ; =ov00_02217B64 + add r0, sp, #8 + mov r1, #0x200 + str r4, [sp, #4] + bl OS_SNPrintf + mov r4, r0 + add r2, sp, #8 + add r1, sp, #9 + strb r5, [r2, r4] + mov r0, #0 + strb r0, [r1, r4] + cmp r7, #0 + add r6, r1, r4 + beq _021F467C + mov r0, r7 + bl strlen + mov r5, r0 + add r0, r4, #2 + add r0, r0, r5 + cmp r0, #0x200 + ldrhi r0, _021F46A0 ; =0x000001FF + addhi r1, r4, #1 + subhi r5, r0, r1 + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl MI_CpuCopy8 + mov r0, #0 + strb r0, [r6, r5] +_021F467C: + add r2, sp, #8 + mov r0, sb + mov r1, r8 + bl ov00_02200880 + add sp, sp, #0x208 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021F4694: .word ov00_02217B6C +_021F4698: .word ov00_02217B5C +_021F469C: .word ov00_02217B64 +_021F46A0: .word 0x000001FF + arm_func_end ov00_021F45E0 + + arm_func_start ov00_021F46A4 +ov00_021F46A4: ; 0x021F46A4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r1 + mov r4, r0 + mov r8, r2 + mov r0, sb + mov r1, #0 + bl strchr + mov r6, r0 + cmp r8, #0 + mov r7, #0 + ble _021F46FC + mov r5, #0x2f +_021F46D4: + mov r0, sb + mov r1, r5 + bl strchr + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r7, r7, #1 + cmp r7, r8 + add sb, r0, #1 + blt _021F46D4 +_021F46FC: + mov r0, sb + mov r1, #0x2f + bl strchr + cmp r0, #0 + moveq r0, r6 + cmp sb, r0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + sub r5, r0, sb + mov r0, sb + mov r1, r4 + mov r2, r5 + bl MI_CpuCopy8 + mov r1, #0 + mov r0, r5 + strb r1, [r4, r5] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_021F46A4 + + arm_func_start ov00_021F4740 +ov00_021F4740: ; 0x021F4740 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x118 + mov sb, r0 + mov r8, r1 + mov r7, r2 + mov sl, r3 + ldr r6, [sp, #0x138] + ldr r5, [sp, #0x13c] + mov r4, #0 + bl ov00_021F955C + cmp r0, #0 + beq _021F4780 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0 + bne _021F478C +_021F4780: + add sp, sp, #0x118 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F478C: + bl ov00_021EE568 + cmp r0, #5 + bne _021F47BC + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F47BC + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F47BC + bl ov00_021F7DB4 +_021F47BC: + cmp sb, #0x40 + bgt _021F4858 + bge _021F559C + cmp sb, #0x20 + addls pc, pc, sb, lsl #2 + b _021F5610 +_021F47D4: ; jump table + b _021F5610 ; case 0 + b _021F4860 ; case 1 + b _021F4A30 ; case 2 + b _021F4C04 ; case 3 + b _021F4C64 ; case 4 + b _021F4D84 ; case 5 + b _021F4E00 ; case 6 + b _021F4F10 ; case 7 + b _021F5028 ; case 8 + b _021F51A8 ; case 9 + b _021F51FC ; case 10 + b _021F4860 ; case 11 + b _021F52A4 ; case 12 + b _021F5318 ; case 13 + b _021F5318 ; case 14 + b _021F5318 ; case 15 + b _021F533C ; case 16 + b _021F538C ; case 17 + b _021F542C ; case 18 + b _021F5488 ; case 19 + b _021F5610 ; case 20 + b _021F5610 ; case 21 + b _021F5610 ; case 22 + b _021F5610 ; case 23 + b _021F5610 ; case 24 + b _021F5610 ; case 25 + b _021F5610 ; case 26 + b _021F5610 ; case 27 + b _021F5610 ; case 28 + b _021F5610 ; case 29 + b _021F5610 ; case 30 + b _021F5610 ; case 31 + b _021F54A0 ; case 32 +_021F4858: + cmp sb, #0x41 + b _021F5610 +_021F4860: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F4880 + ldr r0, [r6, #8] + ldr r7, [r6, #4] + mov r0, r0, lsl #0x10 + mov sl, r0, lsr #0x10 +_021F4880: + cmp sb, #0xb + moveq r0, #1 + movne r0, #0 + str r0, [sp] + ldr r3, [r6] + mov r0, r8 + mov r1, r7 + mov r2, sl + bl ov00_021F5624 + mov r5, r0 + cmp r5, #2 + bne _021F49A4 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1dc] + mov r0, r8 + mov r1, r7 + mov r2, sl + bl ov00_021F5920 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x118 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F4928 + bl ov00_021F955C + ldr r0, [r0, #0x46c] + cmp r0, #0 + beq _021F4928 + bl ov00_021F955C + mov r6, r0 + mov r0, r8 + bl ov00_021F0404 + mov r4, r0 + bl ov00_021F955C + ldr r1, [r0, #0x470] + ldr r2, [r6, #0x46c] + mov r0, r4 + blx r2 +_021F4928: + bl ov00_021F955C + ldrb r0, [r0, #0x14] + mov r4, #1 + str r0, [sp, #0x14] + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r0, #1 + blt _021F4970 + add r6, sp, #0x14 +_021F494C: + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r6, r4, lsl #2] + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r4, r0 + ble _021F494C +_021F4970: + bl ov00_021F955C + ldr r1, [r0, #0x1c] + add r0, sp, #0x14 + str r1, [r0, r4, lsl #2] + bl ov00_021F955C + ldrh r2, [r0, #0x1a] + add r3, r4, #1 + add r1, sp, #0x14 + mov r0, #0xb + str r2, [r1, r3, lsl #2] + add r4, r4, #2 + bl ov00_021F956C + b _021F49F0 +_021F49A4: + cmp r5, #3 + bne _021F49F0 + bl ov00_021F955C + ldrb r0, [r0, #0x16] + cmp r0, #0 + beq _021F49F0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r1, [r6, #0x14] + ldrb r0, [r0, #0x16] + cmp r1, r0 + bne _021F49F0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + moveq r0, #0x10 + streq r0, [sp, #0x14] + moveq r4, #1 +_021F49F0: + cmp r5, #0xff + beq _021F5610 + add r1, sp, #0x14 + str r1, [sp] + mov r0, r5 + mov r1, r8 + mov r2, r7 + mov r3, sl + str r4, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4A30: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + bne _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r8, r0 + bne _021F5610 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a7] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c8] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + bl ov00_021F955C + ldr r1, [r6] + add r1, r6, r1, lsl #2 + ldr r1, [r1, #4] + str r1, [r0, #0x24] + bl ov00_021F955C + ldr r1, [r6] + add r1, r6, r1, lsl #2 + ldr r1, [r1, #8] + strh r1, [r0, #0xa4] + bl ov00_021F955C + ldr r1, [r6] + add r1, r6, r1, lsl #2 + ldr r1, [r1, #4] + str r1, [r0, #0x1b8] + bl ov00_021F955C + ldr r1, [r6] + add r0, r0, #0x100 + add r1, r6, r1, lsl #2 + ldr r1, [r1, #8] + strh r1, [r0, #0xb4] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F4B58 + ldr r1, [r6] + add r0, r6, #4 + bl ov00_021F6B20 + cmp r0, #0 + beq _021F4B18 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F4B58 + mov r0, r8 + mov r1, r6 + bl ov00_021F5AE0 + b _021F4B58 +_021F4B18: + mov r0, r8 + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x118 + mov r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, r0 + mov r2, r8 + bl ov00_021F5D0C + bl ov00_021F5B30 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4B58: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F4BDC + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F4B9C + mov r0, r8 + mov r1, r6 + bl ov00_021F5AE0 + bl ov00_021F63DC + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x118 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4B9C: + mov r0, #6 + bl ov00_021F956C + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, #0 + bl ov00_022139B8 + mov r2, r0 + mov r0, #0 + mov r1, r0 + bl ov00_021F3F5C + bl ov00_021F8468 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4BDC: + mov r0, #5 + bl ov00_021F956C + mov r0, r8 + bl ov00_021F3CF8 + bl ov00_021F82EC + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4C04: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + bne _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r8, r0 + bne _021F5610 + cmp r5, #0 + ble _021F4C50 + ldr r0, [r6] + cmp r0, #0x10 + bne _021F4C50 + mov r0, #0xd + mov r1, #0 + bl ov00_021F2EE4 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4C50: + bl ov00_021F955C + ldr r0, [r0, #0x204] + bl ov00_021F5FD4 + add sp, sp, #0x118 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4C64: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + bne _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r8, r0 + bne _021F5610 + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1cc] + str r1, [r4, #0x1d0] + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + beq _021F4CB8 + bl ov00_021F955C + ldrb r0, [r0, #0x1a7] + cmp r0, #0x10 + blo _021F4CC8 +_021F4CB8: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F4D0C +_021F4CC8: + bl ov00_021F955C + mov r1, #1 + str r1, [r0, #0x1bc] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1c0] + str r1, [r4, #0x1c4] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F5610 + bl ov00_021F955C + ldrb r1, [r0, #0x1a7] + add r1, r1, #1 + strb r1, [r0, #0x1a7] + b _021F5610 +_021F4D0C: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a7] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F4D60 + mov r0, #3 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #1 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + str r1, [r4, #0xf0] + b _021F5610 +_021F4D60: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F5610 + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl ov00_021F5D0C + b _021F5610 +_021F4D84: + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0x20] + cmp r8, r0 + bne _021F5610 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F4DE4 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + bne _021F4DE4 + bl ov00_021F955C + ldr r0, [r0, #0xf8] + cmp r8, r0 + bne _021F4DE4 + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 +_021F4DE4: + mov r0, r8 + bl ov00_021F6100 + cmp r0, #0 + bne _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4E00: + ldr r0, [r6, #4] + ldr r5, [r6] + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F4E2C + mov r0, #6 + bl ov00_021F956C + b _021F4E5C +_021F4E2C: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #6 + beq _021F4E4C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + bne _021F5610 +_021F4E4C: + bl ov00_021F955C + ldr r0, [r0, #0x20] + cmp r8, r0 + bne _021F5610 +_021F4E5C: + bl ov00_021F955C + mov r1, #0xff + strb r1, [r0, #0x3cc] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + add r0, r6, r0, lsl #2 + ldr r0, [r0, #0xf4] + cmp r8, r0 + beq _021F4EA8 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + add r0, r6, r0, lsl #2 + str r8, [r0, #0xf4] +_021F4EA8: + mov r1, r4, asr #8 + mov r0, r4, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + str r5, [sp, #0xc] + strh r0, [sp, #0xa] + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x194] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D294 + mov r4, r0 + bl ov00_021F955C + add r3, r0, #0x194 + mov r1, r4 + mov r0, #0 + add r2, sp, #8 + bl ov00_021F9104 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x18c] + str r1, [r0, #0x190] + b _021F5610 +_021F4F10: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F5610 + ldr r0, [r6] + str r0, [sp, #0x10] + ldr r0, [r6, #4] + and r4, r0, #0xff + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F4FA4 + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + bne _021F4FA4 + ldr r0, [sp, #0x10] + bl ov00_021F7BA0 + str r0, [sp, #0x14] + add r0, sp, #0x14 + str r0, [sp] + mov r5, #1 + mov r1, r8 + mov r2, r7 + mov r3, sl + mov r0, #0x20 + str r5, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x118 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F4FA4: + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + ldr r1, [sp, #0x10] + add r0, r0, #1 + add r0, r5, r0, lsl #2 + str r1, [r0, #0xf4] + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r0, #1 + add r0, r5, r0 + strb r4, [r0, #0x2d0] + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + bl ov00_021F955C + ldr r0, [r0, #0x46c] + cmp r0, #0 + beq _021F5610 + bl ov00_021F955C + mov r5, r0 + ldr r0, [sp, #0x10] + bl ov00_021F0404 + mov r4, r0 + bl ov00_021F955C + ldr r1, [r0, #0x470] + ldr r2, [r5, #0x46c] + mov r0, r4 + blx r2 + b _021F5610 +_021F5028: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F5610 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F5610 + ldr r0, [r6] + str r0, [sp, #0x10] + cmp r0, #0 + bne _021F5090 + ldr r5, [r6, #4] + ldr r4, [r6, #8] + bl ov00_021F955C + add r0, r5, r0 + strb r4, [r0, #0x2d0] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r2, [r0, #0x200] + add r1, r4, r5, lsl #2 + mov r0, #3 + str r2, [r1, #0xf4] + bl ov00_021F64C0 + b _021F5610 +_021F5090: + ldr r0, [r6, #8] + ldr r5, [r6, #4] + and r4, r0, #0xff + bl ov00_021F955C + add r0, r0, r5, lsl #2 + ldr r1, [sp, #0x10] + ldr r0, [r0, #0xf4] + cmp r1, r0 + bne _021F5110 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + sub r0, r0, #1 + cmp r5, r0 + bne _021F5110 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + add r1, sp, #0x10 + str r1, [sp] + mov r1, #1 + str r1, [sp, #4] + ldrh r3, [r0, #0xa4] + ldr r2, [r4, #0x24] + mov r1, r8 + mov r0, #9 + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F5110: + bl ov00_021F955C + ldr r1, [sp, #0x10] + add r0, r0, r5, lsl #2 + str r1, [r0, #0xf4] + bl ov00_021F955C + add r0, r5, r0 + strb r4, [r0, #0x2d0] + bl ov00_021F955C + ldr r1, [r6, #0xc] + add r0, r0, r5, lsl #2 + str r1, [r0, #0x24] + bl ov00_021F955C + ldr r1, [r6, #0x10] + add r0, r0, r5, lsl #1 + strh r1, [r0, #0xa4] + bl ov00_021F955C + ldr r1, [r6, #0xc] + str r1, [r0, #0x1b8] + bl ov00_021F955C + add r1, r0, #0x100 + ldr r2, [r6, #0x10] + mov r0, #5 + strh r2, [r1, #0xb4] + bl ov00_021F956C + ldr r0, [sp, #0x10] + bl ov00_021F3CF8 + bl ov00_021F82EC + cmp r0, #0 + addne sp, sp, #0x118 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c8] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + b _021F5610 +_021F51A8: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xd + bne _021F5610 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + ldr r1, [r6] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + cmp r1, r0 + bne _021F5610 + bl ov00_021F955C + ldrb r1, [r0, #0x1a4] + add r1, r1, #1 + strb r1, [r0, #0x1a4] + mov r0, #0 + bl ov00_021F64C0 + b _021F5610 +_021F51FC: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + beq _021F521C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x12 + bne _021F5610 +_021F521C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F5240 + ldr r1, [r6] + add r0, r6, #4 + bl ov00_021F6B20 + cmp r0, #0 + beq _021F525C +_021F5240: + bl ov00_021F955C + ldr r1, [r6, #4] + str r1, [r0, #0x208] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a7] + b _021F5268 +_021F525C: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] +_021F5268: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F528C + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 + b _021F5610 +_021F528C: + bl ov00_021F6FF8 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F52A4: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F5610 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F52D4 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F52F0 +_021F52D4: + mov r0, r8 + bl ov00_021F631C + cmp r0, #0 + bne _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F52F0: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F5610 + bl ov00_021F955C + str r8, [r0, #0x20c] + bl ov00_021F7128 + mov r0, #0 + bl ov00_021F6EC4 + b _021F5610 +_021F5318: + ldr r2, [r6] + mov r0, r8 + mov r1, sb + bl ov00_021F7674 + cmp r0, #0 + bne _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F533C: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r8, r0 + addne sp, sp, #0x118 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp r5, #0 + mov r7, #0 + ble _021F5610 + mov r4, r7 +_021F5364: + ldr r0, [r6, r7, lsl #2] + mov r1, r4 + bl ov00_021F7CEC + cmp r0, #0xff + beq _021F537C + bl ov00_021EE31C +_021F537C: + add r7, r7, #1 + cmp r7, r5 + blt _021F5364 + b _021F5610 +_021F538C: + ldr r0, _021F561C ; =ov00_0221A928 + ldr r4, [r0] + cmp r4, #0 + ldrneb r0, [r4] + cmpne r0, #0 + beq _021F53E8 + bl OS_GetTick + ldr r3, [r4, #0x10] + ldr r2, [r4, #0x14] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021F5620 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, [r4, #4] + cmp r1, #0 + cmpeq r0, r2 + movhs r0, #1 + strhs r0, [sp, #0x14] + bhs _021F53F0 +_021F53E8: + mov r0, #0 + str r0, [sp, #0x14] +_021F53F0: + add r0, sp, #0x14 + str r0, [sp] + mov r4, #1 + mov r1, r8 + mov r2, r7 + mov r3, sl + mov r0, #0x12 + str r4, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F542C: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x13 + bne _021F5610 + mov r0, r8 + mov r1, #0 + bl ov00_021F7CEC + cmp r0, #0xff + beq _021F5610 + ldr r1, _021F561C ; =ov00_0221A928 + mov r4, #1 + ldr r3, [r1] + ldr r2, [r3, #8] + orr r2, r2, r4, lsl r0 + str r2, [r3, #8] + ldr r2, [r6] + cmp r2, #0 + beq _021F5610 + ldr r2, [r1] + ldr r1, [r2, #0xc] + orr r0, r1, r4, lsl r0 + str r0, [r2, #0xc] + b _021F5610 +_021F5488: + mov r0, #0xc + mov r1, #0 + bl ov00_021F2EE4 + add sp, sp, #0x118 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F54A0: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F5610 + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + bne _021F5610 + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F5610 +_021F54D4: + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F5584 + ldr r0, [r6] + cmp r0, #0 + bne _021F555C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + beq _021F5514 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xc + bne _021F552C +_021F5514: + bl ov00_021F6DF0 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x118 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F552C: + bl ov00_021F955C + ldr r0, [r0, #0x19c] + cmp r0, #0 + beq _021F5554 + bl ov00_021F955C + ldr r0, [r0, #0x19c] + bl ov00_0221019C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F5554: + bl ov00_021F6FC4 + b _021F5610 +_021F555C: + bl ov00_021F955C + mov r4, r0 + mov r0, r8 + mov r1, #0 + bl ov00_021F7CEC + ldr r2, [r4, #0x1dc] + mov r1, #1 + orr r0, r2, r1, lsl r0 + str r0, [r4, #0x1dc] + b _021F5610 +_021F5584: + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F54D4 + b _021F5610 +_021F559C: + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F5610 +_021F55B0: + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + cmp r8, r0 + bne _021F55FC + mov r4, #0 + str r4, [sp] + mov r1, r8 + mov r2, r7 + mov r3, sl + mov r0, #0x41 + str r4, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F5610 + add sp, sp, #0x118 + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F55FC: + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F55B0 +_021F5610: + mov r0, #1 + add sp, sp, #0x118 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021F561C: .word ov00_0221A928 +_021F5620: .word 0x000082EA + arm_func_end ov00_021F4740 + + arm_func_start ov00_021F5624 +ov00_021F5624: ; 0x021F5624 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r8, r3 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F568C + cmp r0, #1 + beq _021F565C + cmp r0, #2 + beq _021F5868 + b _021F5914 +_021F565C: + bl ov00_021F955C + ldr r0, [r0] + mov r1, r7 + bl ov00_022005B0 + cmp r0, #0 + moveq r4, #0xff + beq _021F5914 + mov r0, r7 + bl ov00_021F7BA0 + cmp r0, #0 + moveq r4, #3 + beq _021F5914 +_021F568C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r8, r0 + bne _021F56F4 + bl ov00_021F955C + ldrb r0, [r0, #0x1a9] + cmp r0, #0 + bne _021F56F4 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r1, [r4, #0x14] + ldrb r0, [r0, #0x16] + cmp r1, r0 + beq _021F56F4 + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F5758 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r1, [r4, #0x20] + ldr r0, [r0, #0x200] + cmp r1, r0 + bne _021F5758 +_021F56F4: + mov r4, #3 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F5914 + bl ov00_021F955C + ldr r0, [r0, #0x10] + ldr r0, [r0, #0xb4] + cmp r0, #0 + bne _021F5914 + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F5914 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r1, [r5, #0x20] + ldr r0, [r0, #0x200] + cmp r1, r0 + bne _021F5914 + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + b _021F5914 +_021F5758: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #3 + beq _021F5778 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + bne _021F57A4 +_021F5778: + bl ov00_021F955C + ldr r0, [r0, #0x1c] + cmp r0, #0 + bne _021F5798 + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + cmp r0, #0 + beq _021F57A4 +_021F5798: + cmp r6, #0 + cmpeq r5, #0 + bne _021F57AC +_021F57A4: + mov r4, #4 + b _021F5914 +_021F57AC: + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r0, #0 + beq _021F5860 + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r7, r0 + bne _021F5808 + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _021F57F8 + bl ov00_021F955C + ldr r0, [r0, #0x200] + cmp r0, r7 + bge _021F5800 + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r7, r0 + beq _021F5800 +_021F57F8: + mov r4, #2 + b _021F5914 +_021F5800: + mov r4, #0xff + b _021F5914 +_021F5808: + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _021F5834 + bl ov00_021F955C + ldr r0, [r0, #0x200] + cmp r0, r7 + bge _021F5858 + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + bne _021F5858 +_021F5834: + bl ov00_021F955C + ldr r0, [r0, #0x204] + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + movne r0, #0xff + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r4, #2 + b _021F5914 +_021F5858: + mov r4, #3 + b _021F5914 +_021F5860: + mov r4, #2 + b _021F5914 +_021F5868: + bl ov00_021F955C + ldr r0, [r0] + mov r1, r7 + bl ov00_022005B0 + cmp r0, #0 + moveq r4, #0xff + beq _021F5914 + cmp r8, #3 + bne _021F58A8 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r1, [r4, #0x14] + ldrb r0, [r0, #0x16] + cmp r1, r0 + bne _021F58B0 +_021F58A8: + mov r4, #3 + b _021F5914 +_021F58B0: + ldr r0, _021F591C ; =ov00_0221A928 + ldrb r1, [r0, #0x1c] + cmp r1, #1 + ldreqb r0, [r0, #0x1d] + cmpeq r0, #1 + moveq r4, #0x13 + beq _021F5914 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xa + bne _021F5908 + bl ov00_021F955C + ldr r0, [r0, #0x1c] + cmp r0, #0 + bne _021F58FC + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + cmp r0, #0 + beq _021F5908 +_021F58FC: + cmp r6, #0 + cmpeq r5, #0 + bne _021F5910 +_021F5908: + mov r4, #4 + b _021F5914 +_021F5910: + mov r4, #2 +_021F5914: + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021F591C: .word ov00_0221A928 + arm_func_end ov00_021F5624 + + arm_func_start ov00_021F5920 +ov00_021F5920: ; 0x021F5920 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F595C + bl ov00_021F955C + ldr r0, [r0, #0x20] + cmp r6, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021F595C: + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x17] + bl ov00_021F955C + str r6, [r0, #0x20] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1c8] + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r0, #1 + add r0, r7, r0, lsl #2 + str r6, [r0, #0xf4] + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r0, #1 + add r0, r7, r0, lsl #2 + str r5, [r0, #0x24] + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + add r0, r0, #1 + add r0, r7, r0, lsl #1 + strh r4, [r0, #0xa4] + bl ov00_021F955C + str r5, [r0, #0x1b8] + bl ov00_021F955C + add r0, r0, #0x100 + strh r4, [r0, #0xb4] + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F7B30 + ldrb r1, [r4, #0x14] + add r1, r1, #1 + add r1, r5, r1 + strb r0, [r1, #0x2d0] + str r6, [sp, #8] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + mov r7, #1 + add r0, r0, #1 + add r0, r4, r0 + ldrb r0, [r0, #0x2d0] + str r0, [sp, #0xc] + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r0, #1 + blt _021F5ACC + add r6, sp, #8 + mov r5, #2 + mov r4, #7 +_021F5A70: + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + str r6, [sp] + str r5, [sp, #4] + add r0, r0, r7, lsl #1 + add r1, sb, r7, lsl #2 + add r2, r8, r7, lsl #2 + ldrh r3, [r0, #0xa4] + ldr r1, [r1, #0xf4] + ldr r2, [r2, #0x24] + mov r0, r4 + bl ov00_021F4304 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r7, r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r7, r0 + ble _021F5A70 +_021F5ACC: + mov r0, #1 + bl ov00_021F7DDC + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_021F5920 + + arm_func_start ov00_021F5AE0 +ov00_021F5AE0: ; 0x021F5AE0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r1, [r5] + mov r6, r0 + add r4, r1, #2 + cmp r4, #2 + bls _021F5B18 + bl ov00_021F955C + mov r1, r0 + sub r2, r4, #2 + add r0, r5, #4 + add r1, r1, #0x350 + mov r2, r2, lsl #2 + bl MIi_CpuCopy32 +_021F5B18: + bl ov00_021F955C + sub r1, r4, #1 + str r1, [r0, #0x348] + bl ov00_021F955C + str r6, [r0, #0x34c] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F5AE0 + + arm_func_start ov00_021F5B30 +ov00_021F5B30: ; 0x021F5B30 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + mov r0, r4 + bne _021F5B54 + bl ov00_021F82EC + ldmia sp!, {r4, pc} +_021F5B54: + bl ov00_021F8278 + ldmia sp!, {r4, pc} + arm_func_end ov00_021F5B30 + + arm_func_start ov00_021F5B5C +ov00_021F5B5C: ; 0x021F5B5C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + mov r5, r0 + cmp r1, #0 + bne _021F5B90 + bl ov00_021F955C + ldr r0, [r0, #0x1c] + cmp r0, #0 + bne _021F5BC4 + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + cmp r0, #0 + bne _021F5BC4 +_021F5B90: + bl ov00_021F955C + mov r1, #1 + str r1, [r0, #0x1bc] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1c0] + str r1, [r4, #0x1c4] + bl ov00_021F955C + str r5, [r0, #0xf4] + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_021F5BC4: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F5C48 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, #0 + bl ov00_022139B8 + mov r6, r0 + bl ov00_021F955C + mov r4, r0 + ldr r1, _021F5D04 ; =ov00_02217AAC + mov r0, r6 + mov r2, #0 + bl ov00_02212DB4 + str r0, [r4, #0xf4] + bl ov00_021F955C + mov r4, r0 + mov r0, r6 + bl ov00_02212E78 + str r0, [r4, #0x24] + bl ov00_021F955C + mov r4, r0 + mov r0, r6 + bl ov00_02212E80 + strh r0, [r4, #0xa4] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + mov r4, #1 + str r0, [r6, #0x204] + b _021F5C84 +_021F5C48: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F5C60 + bl ov00_021F955C + str r5, [r0, #0xf4] +_021F5C60: + bl ov00_021F955C + str r5, [r0, #0x204] + bl ov00_021F955C + ldr r0, [r0, #0x1c] + str r0, [sp, #0xc] + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + mov r4, #3 + str r0, [sp, #0x10] +_021F5C84: + bl ov00_021F955C + ldr r1, _021F5D08 ; =0x00001770 + str r1, [r0, #0x1c8] + bl ov00_021F955C + mov r6, r0 + bl OS_GetTick + str r0, [r6, #0x1cc] + str r1, [r6, #0x1d0] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + movne r7, #0xb + moveq r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + str r0, [sp, #8] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + add r2, sp, #8 + stmia sp, {r2, r4} + mov r3, r0 + ldrh r3, [r3, #0xa4] + ldr r2, [r6, #0x24] + mov r1, r5 + mov r0, r7 + bl ov00_021F4304 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_021F5D04: .word ov00_02217AAC +_021F5D08: .word 0x00001770 + arm_func_end ov00_021F5B5C + + arm_func_start ov00_021F5D0C +ov00_021F5D0C: ; 0x021F5D0C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x228 + movs r4, r1 + mov r8, r0 + mov fp, r2 + beq _021F5D30 + bl ov00_021F955C + ldrb r6, [r0, #0x1a5] + b _021F5D60 +_021F5D30: + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r0, [r0, #0x344] + ldrb r1, [r5, #0x1a5] + sub r0, r0, #1 + cmp r1, r0 + movge r6, #0 + bge _021F5D60 + bl ov00_021F955C + ldrb r0, [r0, #0x1a5] + add r6, r0, #1 +_021F5D60: + cmp r4, #0 + mov r5, #0 + moveq r7, #1 + movne r7, r5 +_021F5D70: + cmp r7, #0 + cmpeq r5, #0 + beq _021F5DB4 + bl ov00_021F955C + ldrb r1, [r0, #0x1a5] + add r1, r1, #1 + strb r1, [r0, #0x1a5] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r1, [r4, #0x1a5] + ldr r0, [r0, #0x344] + cmp r1, r0 + blt _021F5DB4 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a5] +_021F5DB4: + cmp r5, #0 + beq _021F5E04 + bl ov00_021F955C + ldrb r0, [r0, #0x1a5] + cmp r6, r0 + bne _021F5E04 + bl ov00_021F955C + ldr r1, _021F5FC4 ; =0x00000BB8 + str r1, [r0, #0x1c8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1cc] + str r1, [r4, #0x1d0] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1bc] + add sp, sp, #0x228 + mov r0, r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F5E04: + mov r5, #1 + bl ov00_021EF3A4 + mov sl, r0 + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r1, r0 + ldrb r2, [r1, #0x1a5] + ldr r3, [sb, #0x2fc] + mov r1, #0xc + add r2, r4, r2 + ldrb r2, [r2, #0x304] + mov r0, sl + mla r1, r2, r1, r3 + bl DWC_GetGsProfileId + movs r4, r0 + mvnne r0, #0 + cmpne r4, r0 + beq _021F5D70 + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + ldrb r1, [r0, #0x1a5] + ldr r2, [sl, #0x2fc] + mov r0, #0xc + add r1, sb, r1 + ldrb r1, [r1, #0x304] + mla r0, r1, r0, r2 + bl DWCi_Acc_IsValidFriendData + cmp r0, #0 + beq _021F5D70 + mov sb, r5 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F5ECC +_021F5EA4: + bl ov00_021F955C + add r0, r0, sb, lsl #2 + ldr r0, [r0, #0xf4] + cmp r4, r0 + beq _021F5ECC + add sb, sb, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp sb, r0 + ble _021F5EA4 +_021F5ECC: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp sb, r0 + ble _021F5D70 + bl ov00_021F955C + ldr r0, [r0] + add r2, sp, #4 + mov r1, r4 + bl ov00_02200540 + mov sb, r0 + bl ov00_021F955C + ldr r0, [r0] + ldr r1, [sp, #4] + add r2, sp, #0x18 + bl ov00_02200400 + orrs r0, sb, r0 + ldreq r0, [sp, #0x1c] + cmpeq r0, #4 + bne _021F5D70 + ldr r0, _021F5FC8 ; =ov00_02217A70 + add r1, sp, #0xc + add r2, sp, #0x20 + mov r3, #0x2f + bl ov00_021ED4E8 + mov sl, r0 + ldr r0, _021F5FCC ; =ov00_02217A68 + add r1, sp, #8 + add r2, sp, #0x20 + mov r3, #0x2f + bl ov00_021ED4E8 + mov sb, r0 + ldr r0, _021F5FD0 ; =ov00_02217A6C + add r1, sp, #0 + add r2, sp, #0x20 + mov r3, #0x2f + bl ov00_021ED4E8 + cmp sl, #0 + cmpgt sb, #0 + cmpgt r0, #0 + ble _021F5D70 + add r0, sp, #0xc + mov r1, #0 + mov r2, #0xa + bl strtoul + cmp r0, #3 + bne _021F5D70 + add r0, sp, #8 + mov r1, #0 + mov r2, #0xa + bl strtoul + mov sb, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x16] + cmp sb, r0 + bne _021F5D70 + cmp r4, fp + moveq r8, #1 + mov r0, r4 + mov r1, r8 + bl ov00_021F5B5C + add sp, sp, #0x228 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F5FC4: .word 0x00000BB8 +_021F5FC8: .word ov00_02217A70 +_021F5FCC: .word ov00_02217A68 +_021F5FD0: .word ov00_02217A6C + arm_func_end ov00_021F5D0C + + arm_func_start ov00_021F5FD4 +ov00_021F5FD4: ; 0x021F5FD4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a7] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1cc] + str r1, [r4, #0x1d0] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F6048 + mov r0, #3 + bl ov00_021F956C + mov r0, #0 + bl ov00_021F3CF8 + bl ov00_021F82EC + cmp r0, #0 + beq _021F60A0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F6048: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F607C + mov r0, #0 + mov r1, r0 + mov r2, r5 + bl ov00_021F5D0C + bl ov00_021F5B30 + cmp r0, #0 + beq _021F60A0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F607C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F60A0 + ldr r1, _021F60A8 ; =0xFFFEC5E6 + mov r0, #6 + bl ov00_021F2EE4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F60A0: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F60A8: .word 0xFFFEC5E6 + arm_func_end ov00_021F5FD4 + + arm_func_start ov00_021F60AC +ov00_021F60AC: ; 0x021F60AC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + str r1, [sp] + str r1, [sp, #4] + ldrh r3, [r0, #0xa4] + ldr r2, [r4, #0x24] + mov r1, r5 + mov r0, #5 + bl ov00_021F4304 + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + mov r0, r4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F60AC + + arm_func_start ov00_021F6100 +ov00_021F6100: ; 0x021F6100 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F6138 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r1, [r4, #0x20] + ldr r0, [r0, #0x200] + cmp r1, r0 + moveq r4, #0 + beq _021F613C +_021F6138: + mov r4, #1 +_021F613C: + cmp r4, #0 + beq _021F6168 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20] + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC +_021F6168: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0x1f + bhs _021F6198 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + mov r1, #0 + add r0, r0, #1 + add r0, r6, r0, lsl #2 + str r1, [r0, #0xf4] +_021F6198: + bl ov00_021F955C + mov r1, #0xff + strb r1, [r0, #0x3cc] + bl ov00_021F955C + ldr r0, [r0, #0x19c] + cmp r0, #0 + beq _021F61CC + bl ov00_021F955C + ldr r0, [r0, #0x19c] + bl ov00_0221019C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F61CC: + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r6, #0x14] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + cmp r4, #0 + bne _021F620C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F6314 + bl ov00_021F6FC4 + b _021F6314 +_021F620C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F6248 + mov r0, #3 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + str r1, [r4, #0xf0] + b _021F6314 +_021F6248: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F6274 + mov r0, #4 + bl ov00_021F956C + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl ov00_021F5D0C + b _021F6314 +_021F6274: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F6314 + mov r0, #0xe + bl ov00_021F956C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1d8] + bl ov00_021F955C + add r1, r0, #0x100 + mov r2, #0 + mov r0, r5 + strh r2, [r1, #0xb2] + bl ov00_021F70B8 + mov r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F62FC + mov r4, #0xd +_021F62C8: + bl ov00_021F955C + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xf4] + mov r1, r4 + bl ov00_021F75F4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r5, r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r5, r0 + ble _021F62C8 +_021F62FC: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + bne _021F6314 + mov r0, #2 + bl ov00_021F6EC4 +_021F6314: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F6100 + + arm_func_start ov00_021F631C +ov00_021F631C: ; 0x021F631C + stmdb sp!, {r3, r4, r5, lr} + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F635C + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F6348 + bl ov00_021F7128 +_021F6348: + ldr r1, _021F63D8 ; =0xFFFEC5D2 + mov r0, #6 + bl ov00_021F2EE4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F635C: + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r5, #0x14] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x208] + bl ov00_021F955C + ldr r0, [r0, #0x19c] + cmp r0, #0 + beq _021F63A4 + bl ov00_021F955C + ldr r0, [r0, #0x19c] + bl ov00_0221019C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F63A4: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F63BC + bl ov00_021F6FC4 + b _021F63D0 +_021F63BC: + mov r0, #4 + bl ov00_021F956C + mov r0, #0 + bl ov00_021F5FD4 + mov r4, r0 +_021F63D0: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021F63D8: .word 0xFFFEC5D2 + arm_func_end ov00_021F631C + + arm_func_start ov00_021F63DC +ov00_021F63DC: ; 0x021F63DC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F6474 + mov r5, #0xa +_021F63FC: + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + add r1, r6, #0x348 + str r1, [sp] + ldr ip, [r0, #0x348] + add r3, r7, r4, lsl #1 + add ip, ip, #1 + str ip, [sp, #4] + add r1, sb, r4, lsl #2 + add r2, r8, r4, lsl #2 + ldrh r3, [r3, #0xa4] + ldr r1, [r1, #0xf4] + ldr r2, [r2, #0x24] + mov r0, r5 + bl ov00_021F4304 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F63FC +_021F6474: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20] + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x1a8] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + mov r0, r1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_021F63DC + + arm_func_start ov00_021F64C0 +ov00_021F64C0: ; 0x021F64C0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x1c + cmp r0, #4 + mov r4, #3 + mov r5, #0 + addls pc, pc, r0, lsl #2 + b _021F6AE4 +_021F64DC: ; jump table + b _021F64F0 ; case 0 + b _021F6890 ; case 1 + b _021F68D4 ; case 2 + b _021F6998 ; case 3 + b _021F69B8 ; case 4 +_021F64F0: + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + ldrb r1, [r6, #0x1a4] + sub r0, r0, #1 + cmp r1, r0 + bge _021F65B0 + mov r0, #0xd + bl ov00_021F956C + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [sp, #8] + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + add r0, r0, #1 + str r0, [sp, #0xc] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + add r0, r0, #1 + add r0, r4, r0 + ldrb r0, [r0, #0x2d0] + str r0, [sp, #0x10] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0x24] + str r0, [sp, #0x14] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x1a4] + mov r4, #5 + add r0, r0, #1 + add r0, r6, r0, lsl #1 + ldrh r0, [r0, #0xa4] + str r0, [sp, #0x18] + b _021F67FC +_021F65B0: + bl ov00_021F955C + mov r1, r5 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, r5 + str r1, [r0, #0x20] + bl ov00_021F955C + ldr r0, [r0, #0x10] + bl ov00_02210CBC + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F65F0 + mov r0, r4 + bl ov00_021F956C + b _021F6614 +_021F65F0: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F660C + mov r0, #4 + bl ov00_021F956C + b _021F6614 +_021F660C: + mov r0, #0xa + bl ov00_021F956C +_021F6614: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a4] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + beq _021F664C + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r1, [r6, #0xd] + ldrb r0, [r0, #0x16] + cmp r1, r0 + bne _021F66FC +_021F664C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F6684 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r6, r0, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r7, #0x20c] + b _021F66A4 +_021F6684: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20c] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldr r0, [r0, #0x200] + str r0, [r6, #0xf4] +_021F66A4: + mov r0, #0x10 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x1d4] + mov r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F67EC + mov r6, #2 +_021F66D0: + bl ov00_021F955C + add r0, r0, r7 + ldrb r0, [r0, #0x2d0] + mov r1, r6 + bl ov00_021F7294 + add r7, r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r7, r0 + ble _021F66D0 + b _021F67EC +_021F66FC: + mov r0, #0 + str r0, [sp, #8] + bl ov00_021F955C + ldrb r0, [r0, #0xd] + str r0, [sp, #0xc] + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r6, r0 + ldrb r0, [r0, #0x2d0] + str r0, [sp, #0x10] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F6760 + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r6, r0 + bl OS_GetTick + str r0, [r6, #0xec] + str r1, [r6, #0xf0] + b _021F67EC +_021F6760: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F67EC + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl ov00_021F5D0C + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + bne _021F67EC + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #2 + blo _021F67EC + bl ov00_021F955C + mov r8, r0 + mov r0, #0 + bl ov00_021F7D50 + mov r6, r0 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + mov r1, #1 + ldr r2, [r8, #0x1dc] + add r0, r7, r0 + ldrb r0, [r0, #0x2d0] + mvn r0, r1, lsl r0 + and r0, r6, r0 + cmp r2, r0 + beq _021F67EC + bl ov00_021F6FC4 + b _021F6AE4 +_021F67EC: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + movne r5, #1 +_021F67FC: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x10 + beq _021F6AE4 + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + add r1, sp, #8 + stmia sp, {r1, r4} + mov ip, r0 + ldrb r3, [sb, #0xd] + ldrb r2, [r7, #0xd] + ldrb r1, [ip, #0xd] + add r4, sl, r3, lsl #2 + add r2, r8, r2, lsl #2 + add r3, r6, r1, lsl #1 + ldrh r3, [r3, #0xa4] + ldr r1, [r4, #0xf4] + ldr r2, [r2, #0x24] + mov r0, #8 + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x3cd] + b _021F6AE4 +_021F6890: + mov r0, #1 + bl ov00_021F956C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F68CC + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r5, #0x20c] +_021F68CC: + mov r5, #1 + b _021F6AE4 +_021F68D4: + mov r0, #1 + bl ov00_021F956C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F68FC + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F691C +_021F68FC: + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x200] + str r0, [r4, #0x20] +_021F691C: + bl ov00_021F7DB4 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + bls _021F6AE4 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + add r3, r8, #0xf4 + ldrb r2, [r0, #0xd] + mov r1, #1 + mov r0, #9 + sub r2, r2, #1 + add r2, r3, r2, lsl #2 + str r2, [sp] + str r1, [sp, #4] + ldr r1, [r7, #0xf4] + ldr r2, [r6, #0x24] + ldrh r3, [r4, #0xa4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F6AE4 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_021F6998: + mov r0, #1 + bl ov00_021F956C + bl ov00_021F7DB4 + bl ov00_021F955C + mov r1, r5 + str r1, [r0, #0x20c] + mov r5, #1 + b _021F6AE4 +_021F69B8: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + beq _021F69D8 + ldr r1, _021F6B18 ; =ov00_02217A60 + mov r0, #2 + mov r2, r5 + bl ov00_021F04A0 +_021F69D8: + bl ov00_021F955C + ldr r0, [r0, #0x20c] + cmp r0, #0 + moveq r7, #1 + movne r7, #0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + bl ov00_021F0404 + mov r4, r0 + bl ov00_021F955C + str r4, [sp] + ldr r1, [r0, #0x468] + mov r0, #0 + str r1, [sp, #4] + ldr r4, [r6, #0x464] + mov r2, r7 + mov r1, r0 + mov r3, r0 + blx r4 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F6A4C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F6A54 +_021F6A4C: + bl ov00_021F3C5C + b _021F6AD8 +_021F6A54: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + cmp r0, #0 + beq _021F6A7C + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022136E4 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe4] +_021F6A7C: + bl ov00_021F125C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F6AC4 + bl ov00_021F36BC + bl ov00_021F8278 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, _021F6B1C ; =ov00_0221A928 + ldrb r1, [r0, #0x1c] + cmp r1, #1 + moveq r1, #1 + streqb r1, [r0, #0x1d] + mov r0, #0xa + bl ov00_021F956C + b _021F6ACC +_021F6AC4: + mov r0, #1 + bl ov00_021F956C +_021F6ACC: + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20c] +_021F6AD8: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a9] +_021F6AE4: + cmp r5, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_0221396C + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021F6B18: .word ov00_02217A60 +_021F6B1C: .word ov00_0221A928 + arm_func_end ov00_021F64C0 + + arm_func_start ov00_021F6B20 +ov00_021F6B20: ; 0x021F6B20 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + beq _021F6B50 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} +_021F6B50: + cmp r5, #0 + mov r4, #0 + bls _021F6BA0 +_021F6B5C: + ldr r0, [r6, r4, lsl #2] + bl ov00_021F7BA0 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x1a6] + cmp r0, #0 + beq _021F6B94 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} +_021F6B94: + add r4, r4, #1 + cmp r4, r5 + blo _021F6B5C +_021F6BA0: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F6B20 + + arm_func_start ov00_021F6BA8 +ov00_021F6BA8: ; 0x021F6BA8 + stmdb sp!, {r3, lr} + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20c] + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #2 + bne _021F6BD0 + bl ov00_021F6D30 + ldmia sp!, {r3, pc} +_021F6BD0: + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x1a9] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F6C3C + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x1a9] + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F6C1C + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 + b _021F6C34 +_021F6C1C: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_021F6C34: + bl ov00_021F6D30 + ldmia sp!, {r3, pc} +_021F6C3C: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + beq _021F6C9C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #5 + beq _021F6C9C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #6 + beq _021F6C9C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #7 + beq _021F6C9C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + beq _021F6C9C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xc + bne _021F6CD4 +_021F6C9C: + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r0, #0 + beq _021F6CC4 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_021F6CC4: + bl ov00_021F6DF0 + bl ov00_021F5B30 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_021F6CD4: + bl ov00_021F955C + ldr r0, [r0, #0x19c] + cmp r0, #0 + beq _021F6CFC + bl ov00_021F955C + ldr r0, [r0, #0x19c] + bl ov00_0221019C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x19c] +_021F6CFC: + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F6D28 + bl ov00_021F955C + mov r1, #1 + strb r1, [r0, #0x1a9] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 +_021F6D28: + bl ov00_021F6D30 + ldmia sp!, {r3, pc} + arm_func_end ov00_021F6BA8 + + arm_func_start ov00_021F6D30 +ov00_021F6D30: ; 0x021F6D30 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r1, _021F6DEC ; =ov00_02217A60 + mov r0, #1 + mov r2, #0 + bl ov00_021F04A0 + bl ov00_021F8278 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F3C5C + bl ov00_021F955C + ldr r0, [r0, #0x20c] + cmp r0, #0 + movne r6, #1 + bne _021F6D84 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + moveq r6, #1 + movne r6, #0 +_021F6D84: + bl ov00_021F955C + ldr r0, [r0, #0x20c] + cmp r0, #0 + moveq r7, #1 + movne r7, #0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + bl ov00_021F0404 + mov r4, r0 + bl ov00_021F955C + str r4, [sp] + ldr r1, [r0, #0x468] + mov r2, r7 + str r1, [sp, #4] + ldr ip, [r5, #0x464] + mov r3, r6 + mov r0, #0 + mov r1, #1 + blx ip + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a9] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F6DEC: .word ov00_02217A60 + arm_func_end ov00_021F6D30 + + arm_func_start ov00_021F6DF0 +ov00_021F6DF0: ; 0x021F6DF0 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r4, #0 + str r4, [sp, #8] + bl ov00_021F955C + ldrb r0, [r0, #0x17] + cmp r0, #0 + beq _021F6EB8 + bl ov00_021F955C + ldr r0, [r0, #0x20] + cmp r0, #0 + beq _021F6EB8 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r1, [r5, #0x20] + ldr r0, [r0, #0x200] + cmp r1, r0 + beq _021F6EB8 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + add r2, sp, #8 + mov r1, #1 + str r2, [sp] + str r1, [sp, #4] + ldrb r3, [r0, #0xd] + ldrb r2, [r6, #0xd] + ldr r1, [r7, #0x20] + add r3, r3, #1 + add r2, r2, #1 + add r3, r4, r3, lsl #1 + add r2, r5, r2, lsl #2 + ldrh r3, [r3, #0xa4] + ldr r2, [r2, #0x24] + mov r0, #0xc + bl ov00_021F4304 + mov r4, r0 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20] +_021F6EB8: + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov00_021F6DF0 + + arm_func_start ov00_021F6EC4 +ov00_021F6EC4: ; 0x021F6EC4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + movs r4, r0 + bne _021F6EE0 + bl ov00_021F6D30 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_021F6EE0: + bl ov00_021F381C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + beq _021F6F04 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + bne _021F6F60 +_021F6F04: + bl ov00_021F955C + ldr r0, [r0, #0x20c] + cmp r0, #0 + moveq r6, #1 + movne r6, #0 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + bl ov00_021F0404 + mov r4, r0 + bl ov00_021F955C + str r4, [sp] + ldr r1, [r0, #0x468] + mov r0, #0 + str r1, [sp, #4] + ldr ip, [r5, #0x464] + mov r2, r6 + mov r1, #1 + mov r3, r0 + blx ip + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_021F6F60: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F6F94 + cmp r4, #1 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, #0 + bl ov00_021F3CF8 + bl ov00_021F82EC + add sp, sp, #8 + cmp r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F6F94: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + cmpeq r4, #1 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, #0 + mov r1, r0 + mov r2, r0 + bl ov00_021F5D0C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F6EC4 + + arm_func_start ov00_021F6FC4 +ov00_021F6FC4: ; 0x021F6FC4 + stmdb sp!, {r3, lr} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + ldmeqia sp!, {r3, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + ldmeqia sp!, {r3, pc} + bl ov00_021F7128 + mov r0, #1 + bl ov00_021F6EC4 + ldmia sp!, {r3, pc} + arm_func_end ov00_021F6FC4 + + arm_func_start ov00_021F6FF8 +ov00_021F6FF8: ; 0x021F6FF8 + stmdb sp!, {r4, lr} + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x20] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + bl ov00_021F955C + ldr r0, [r0, #0x208] + cmp r0, #0 + beq _021F70A8 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F7068 + mov r0, #3 + bl ov00_021F956C + mov r0, #0 + bl ov00_021F3CF8 + mov r4, r0 + bl ov00_021F82EC + cmp r0, #0 + beq _021F70B0 + mov r0, r4 + ldmia sp!, {r4, pc} +_021F7068: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F70B0 + mov r0, #4 + bl ov00_021F956C + bl ov00_021F955C + ldr r0, [r0, #0x208] + mov r1, #0 + bl ov00_021F5B5C + mov r4, r0 + bl ov00_021F5B30 + cmp r0, #0 + beq _021F70B0 + mov r0, r4 + ldmia sp!, {r4, pc} +_021F70A8: + mov r0, #1 + bl ov00_021F6EC4 +_021F70B0: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_021F6FF8 + + arm_func_start ov00_021F70B8 +ov00_021F70B8: ; 0x021F70B8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov00_021F955C + str r5, [r0, #0x20c] + bl ov00_021F955C + ldrb r1, [r0, #0xd] + mov r0, r5 + add r1, r1, #1 + bl ov00_021EE73C + movs r4, r0 + beq _021F710C + bl ov00_021F955C + mov r1, #2 + strb r1, [r0, #0x1a8] + ldr r0, [r4] + bl ov00_0220D218 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_021F710C: + bl ov00_021F955C + ldrb r1, [r0, #0xd] + mov r0, r5 + add r1, r1, #1 + bl ov00_021F3334 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F70B8 + + arm_func_start ov00_021F7128 +ov00_021F7128: ; 0x021F7128 + stmdb sp!, {r3, lr} + bl ov00_021F955C + mov r1, #2 + strb r1, [r0, #0x1a8] + bl ov00_021F955C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov00_0220D238 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + ldmia sp!, {r3, pc} + arm_func_end ov00_021F7128 + + arm_func_start ov00_021F7158 +ov00_021F7158: ; 0x021F7158 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x108 + mov r7, #0 + mov sl, r0 + mov r8, r7 + mov sb, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F71E0 + add r4, sp, #0x88 + add r5, sp, #8 + mov r6, sb +_021F718C: + bl ov00_021F955C + add r0, r0, sb + ldrb r0, [r0, #0x2d0] + tst sl, r6, lsl r0 + beq _021F71B8 + bl ov00_021F955C + add r0, r0, sb, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r5, r8, lsl #2] + add r8, r8, #1 + b _021F71CC +_021F71B8: + bl ov00_021F955C + add r0, r0, sb, lsl #2 + ldr r0, [r0, #0xf4] + str r0, [r4, r7, lsl #2] + add r7, r7, #1 +_021F71CC: + add sb, sb, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp sb, r0 + ble _021F718C +_021F71E0: + cmp r8, #0 + mov sl, #0 + ble _021F7238 + add sb, sp, #0x88 + mov r6, #0x10 + add r5, sp, #8 + mov r4, sl +_021F71FC: + ldr r1, [r5, sl, lsl #2] + str sb, [sp] + mov r0, r6 + mov r2, r4 + mov r3, r4 + str r7, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0x108 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add sl, sl, #1 + cmp sl, r8 + blt _021F71FC +_021F7238: + bl ov00_021F955C + mov r1, #2 + strb r1, [r0, #0x1a8] + cmp r7, #0 + mov r6, #0 + ble _021F727C + add r5, sp, #0x88 + mov r4, r6 +_021F7258: + ldr r0, [r5, r6, lsl #2] + mov r1, r4 + bl ov00_021F7CEC + cmp r0, #0xff + beq _021F7270 + bl ov00_021EE31C +_021F7270: + add r6, r6, #1 + cmp r6, r7 + blt _021F7258 +_021F727C: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1a8] + mov r0, #1 + add sp, sp, #0x108 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_021F7158 + + arm_func_start ov00_021F7294 +ov00_021F7294: ; 0x021F7294 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r4, r1 + mov r5, r0 + cmp r4, #2 + beq _021F72B8 + cmp r4, #3 + beq _021F7330 + b _021F7354 +_021F72B8: + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r6, r0 + ldrb r0, [r0, #0x2d0] + mov r6, #1 + cmp r5, r0 + moveq r0, #1 + streqb r0, [sp] + movne r0, #0 + strneb r0, [sp] + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blo _021F7354 +_021F72F8: + bl ov00_021F955C + add r0, r0, r6 + ldrb r0, [r0, #0x2d0] + cmp r5, r0 + streqb r6, [sp, #1] + streqb r5, [sp, #2] + beq _021F7354 + add r0, r6, #1 + and r6, r0, #0xff + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r6, r0 + bls _021F72F8 + b _021F7354 +_021F7330: + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb0] + strb r0, [sp] + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb0] + mov r0, r0, asr #8 + strb r0, [sp, #1] +_021F7354: + add r2, sp, #0 + mov r0, r4 + mov r1, r5 + mov r3, #4 + bl ov00_021F9630 + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1e0] + str r1, [r4, #0x1e4] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_021F7294 + + arm_func_start ov00_021F7384 +ov00_021F7384: ; 0x021F7384 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #9 + beq _021F73B8 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x10 + beq _021F73B8 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x11 + bne _021F73FC +_021F73B8: + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1e0] + ldr r0, [r0, #0x1e4] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F75EC ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + mov r4, r0 + mov r5, r1 + b _021F7404 +_021F73FC: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F7404: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #9 + beq _021F7428 + cmp r0, #0x10 + beq _021F7494 + cmp r0, #0x11 + beq _021F75C4 + b _021F75E4 +_021F7428: + ldr r0, _021F75F0 ; =0x00001770 + cmp r5, #0 + cmpeq r4, r0 + bls _021F75E4 + bl ov00_021EE568 + cmp r0, #5 + bne _021F7470 + bl ov00_021F955C + ldrb r0, [r0, #0x1ad] + cmp r0, #5 + blo _021F7470 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F631C + cmp r0, #0 + bne _021F75E4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F7470: + bl ov00_021F955C + ldrb r1, [r0, #0x1ad] + add r1, r1, #1 + strb r1, [r0, #0x1ad] + bl ov00_021F955C + ldrb r0, [r0, #0x2d0] + mov r1, #3 + bl ov00_021F7294 + b _021F75E4 +_021F7494: + ldr r0, _021F75F0 ; =0x00001770 + cmp r5, #0 + cmpeq r4, r0 + bls _021F75E4 + bl ov00_021F955C + ldrb r1, [r0, #0x1ab] + add r1, r1, #1 + strb r1, [r0, #0x1ab] + bl ov00_021F955C + ldrb r0, [r0, #0x1ab] + cmp r0, #5 + bls _021F755C + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _021F74E4 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F74F4 +_021F74E4: + bl ov00_021F7128 + mov r0, #1 + bl ov00_021F6EC4 + b _021F75E4 +_021F74F4: + bl ov00_021F955C + ldr r0, [r0, #0x1d4] + bl ov00_021F7158 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F7540 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ab] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1e0] + str r1, [r4, #0x1e4] + b _021F75E4 +_021F7540: + bl ov00_021F955C + ldr r0, [r0, #0x20c] + bl ov00_021F6100 + cmp r0, #0 + bne _021F75E4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F755C: + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F75E4 + mov r5, #2 + mov r6, r4 +_021F7578: + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + add r0, r0, r4 + ldrb r0, [r0, #0x2d0] + ldr r1, [r7, #0x1d4] + tst r1, r6, lsl r0 + bne _021F75AC + bl ov00_021F955C + add r0, r0, r4 + ldrb r0, [r0, #0x2d0] + mov r1, r5 + bl ov00_021F7294 +_021F75AC: + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F7578 + b _021F75E4 +_021F75C4: + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb0] + cmp r5, r0, asr #31 + cmpeq r4, r0 + bls _021F75E4 + mov r0, #4 + bl ov00_021F64C0 +_021F75E4: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F75EC: .word 0x000082EA +_021F75F0: .word 0x00001770 + arm_func_end ov00_021F7384 + + arm_func_start ov00_021F75F4 +ov00_021F75F4: ; 0x021F75F4 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r5, r1 + cmp r5, #0xd + mov r6, r0 + movne r4, #0 + bne _021F7620 + bl ov00_021F955C + ldr r0, [r0, #0x20c] + mov r4, #1 + str r0, [sp, #8] +_021F7620: + add r0, sp, #8 + str r0, [sp] + mov r2, #0 + mov r0, r5 + mov r1, r6 + mov r3, r2 + str r4, [sp, #4] + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #0xc + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1e8] + str r1, [r4, #0x1ec] + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_021F75F4 + + arm_func_start ov00_021F7674 +ov00_021F7674: ; 0x021F7674 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov00_021EE568 + cmp r0, #6 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + cmp r5, #0xd + beq _021F76B0 + cmp r5, #0xe + beq _021F76EC + cmp r5, #0xf + beq _021F7874 + b _021F788C +_021F76B0: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #8 + beq _021F76D0 + mov r0, #8 + bl ov00_021F956C + mov r0, r4 + bl ov00_021F70B8 +_021F76D0: + mov r0, r6 + mov r1, #0xe + bl ov00_021F75F4 + cmp r0, #0 + bne _021F788C + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F76EC: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xe + bne _021F7858 + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1e8] + ldr r0, [r0, #0x1ec] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F7894 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + mov r2, r0, lsr #1 + mov r0, r1, lsr #1 + cmp r0, #0 + orr r2, r2, r1, lsl #31 + cmpeq r2, #0x12c + bls _021F77B8 + bl ov00_021F955C + ldr r1, [r0, #0x1e8] + ldr r0, [r0, #0x1ec] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F7894 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + mov r3, r0, lsr #1 + mov r0, #0x12c + orr r3, r3, r1, lsl #31 + rsb r0, r0, #0 + mvn r2, #0 + adds r5, r3, r0 + adc r4, r2, r1, lsr #1 + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb2] + cmp r4, r0, asr #31 + cmpeq r5, r0 + bls _021F77B8 + bl ov00_021F955C + add r0, r0, #0x100 + strh r5, [r0, #0xb2] +_021F77B8: + mov r0, r6 + mov r1, #0 + bl ov00_021F7CEC + mov r4, r0 + cmp r4, #0xff + beq _021F77E4 + bl ov00_021F955C + ldr r2, [r0, #0x1d8] + mov r1, #1 + orr r1, r2, r1, lsl r4 + str r1, [r0, #0x1d8] +_021F77E4: + mov r0, #1 + bl ov00_021F7D50 + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x1d8] + cmp r4, r0 + bne _021F788C + mov r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F784C + mov r4, #0xf +_021F7818: + bl ov00_021F955C + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xf4] + mov r1, r4 + bl ov00_021F75F4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r5, r5, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r5, r0 + ble _021F7818 +_021F784C: + mov r0, #0xf + bl ov00_021F956C + b _021F788C +_021F7858: + mov r0, r6 + mov r1, #0xf + bl ov00_021F75F4 + cmp r0, #0 + bne _021F788C + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_021F7874: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #8 + bne _021F788C + mov r0, #2 + bl ov00_021F6EC4 +_021F788C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F7894: .word 0x000082EA + arm_func_end ov00_021F7674 + + arm_func_start ov00_021F7898 +ov00_021F7898: ; 0x021F7898 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #8 + beq _021F78CC + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xe + beq _021F78CC + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xf + bne _021F7910 +_021F78CC: + bl OS_GetTick + mov r4, r0 + mov r5, r1 + bl ov00_021F955C + ldr r1, [r0, #0x1e8] + ldr r0, [r0, #0x1ec] + subs r3, r4, r1 + sbc r0, r5, r0 + mov r1, r0, lsl #6 + ldr r2, _021F7A90 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + mov r4, r0 + mov r5, r1 + b _021F7918 +_021F7910: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F7918: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #8 + beq _021F793C + cmp r0, #0xe + beq _021F796C + cmp r0, #0xf + beq _021F7A68 + b _021F7A88 +_021F793C: + ldr r0, _021F7A94 ; =0x00001770 + cmp r5, #0 + cmpeq r4, r0 + bls _021F7A88 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + mov r1, #0xe + bl ov00_021F75F4 + cmp r0, #0 + bne _021F7A88 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F796C: + ldr r0, _021F7A94 ; =0x00001770 + cmp r5, #0 + cmpeq r4, r0 + bls _021F7A88 + bl ov00_021F955C + ldrb r1, [r0, #0x1ac] + add r1, r1, #1 + strb r1, [r0, #0x1ac] + bl ov00_021F955C + ldrb r0, [r0, #0x1ac] + cmp r0, #5 + bls _021F79F4 + bl ov00_021F955C + ldr r0, [r0, #0x1d8] + bl ov00_021F7158 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F79E8 + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ac] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1e8] + str r1, [r4, #0x1ec] + b _021F7A88 +_021F79E8: + mov r0, #2 + bl ov00_021F6EC4 + b _021F7A88 +_021F79F4: + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F7A88 + mov r5, #0xd + mov r6, r4 +_021F7A10: + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + add r0, r0, r4 + ldrb r0, [r0, #0x2d0] + ldr r1, [r7, #0x1d8] + tst r1, r6, lsl r0 + bne _021F7A50 + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + mov r1, r5 + bl ov00_021F75F4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_021F7A50: + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F7A10 + b _021F7A88 +_021F7A68: + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb2] + cmp r5, r0, asr #31 + cmpeq r4, r0 + bls _021F7A88 + mov r0, #2 + bl ov00_021F6EC4 +_021F7A88: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F7A90: .word 0x000082EA +_021F7A94: .word 0x00001770 + arm_func_end ov00_021F7898 + + arm_func_start ov00_021F7A98 +ov00_021F7A98: ; 0x021F7A98 + ldr r2, _021F7AD4 ; =ov00_0221A948 + mov r3, #0 + mov r0, #0xc +_021F7AA4: + mul r1, r3, r0 + ldrb r1, [r2, r1] + cmp r1, #0 + addeq r0, r3, #0x64 + andeq r0, r0, #0xff + bxeq lr + add r1, r3, #1 + and r3, r1, #0xff + cmp r3, #0x9a + blo _021F7AA4 + mov r0, #0 + bx lr + .balign 4, 0 +_021F7AD4: .word ov00_0221A948 + arm_func_end ov00_021F7A98 + + arm_func_start ov00_021F7AD8 +ov00_021F7AD8: ; 0x021F7AD8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, #0 + ldr r7, _021F7B28 ; =ov00_0221A948 + mov r5, #4 + mov r4, r6 +_021F7AEC: + ldr r1, [r7, #4] + cmp r1, #0 + beq _021F7B04 + mov r0, r5 + mov r2, r4 + bl ov00_021EC2EC +_021F7B04: + add r6, r6, #1 + cmp r6, #0x9a + add r7, r7, #0xc + blt _021F7AEC + ldr r1, _021F7B28 ; =ov00_0221A948 + ldr r2, _021F7B2C ; =0x00000738 + mov r0, #0 + bl MIi_CpuClear32 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F7B28: .word ov00_0221A948 +_021F7B2C: .word 0x00000738 + arm_func_end ov00_021F7AD8 + + arm_func_start ov00_021F7B30 +ov00_021F7B30: ; 0x021F7B30 + stmdb sp!, {r4, r5, r6, lr} + mov r5, #0 + mov r4, r5 +_021F7B3C: + mov r6, r4 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r0, #0 + blt _021F7B78 +_021F7B50: + bl ov00_021F955C + add r0, r0, r6 + ldrb r0, [r0, #0x2d0] + cmp r5, r0 + beq _021F7B78 + add r6, r6, #1 + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r6, r0 + ble _021F7B50 +_021F7B78: + bl ov00_021F955C + ldrb r0, [r0, #0x14] + cmp r6, r0 + bgt _021F7B98 + add r0, r5, #1 + and r5, r0, #0xff + cmp r5, #0x20 + blo _021F7B3C +_021F7B98: + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F7B30 + + arm_func_start ov00_021F7BA0 +ov00_021F7BA0: ; 0x021F7BA0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov00_021F955C + ldr r0, [r0, #0x2fc] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r4, #0 + bl ov00_021F955C + ldr r0, [r0, #0x344] + cmp r0, #0 + ble _021F7C08 +_021F7BD0: + bl ov00_021F955C + add r0, r0, r4 + ldrb r0, [r0, #0x304] + bl ov00_021F03BC + cmp r0, #0 + ble _021F7BF4 + cmp r0, r5 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} +_021F7BF4: + add r4, r4, #1 + bl ov00_021F955C + ldr r0, [r0, #0x344] + cmp r4, r0 + blt _021F7BD0 +_021F7C08: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F7BA0 + + arm_func_start ov00_021F7C10 +ov00_021F7C10: ; 0x021F7C10 + stmdb sp!, {r4, lr} + ldr r1, _021F7CD4 ; =ov00_02217B70 + mvn r2, #0 + mov r4, r0 + bl ov00_02212DB4 + mvn r2, #0 + cmp r0, r2 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _021F7CD8 ; =ov00_02217B7C + mov r0, r4 + bl ov00_02212DB4 + mvn r2, #0 + cmp r0, r2 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _021F7CDC ; =ov00_02217AB4 + mov r0, r4 + bl ov00_02212DB4 + mvn r2, #0 + cmp r0, r2 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _021F7CE0 ; =ov00_02217AC0 + mov r0, r4 + bl ov00_02212DB4 + mvn r1, #0 + cmp r0, r1 + bne _021F7CA0 + ldr r1, _021F7CE0 ; =ov00_02217AC0 + mov r0, r4 + mov r2, #0 + bl ov00_02212DB4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_021F7CA0: + ldr r1, _021F7CE4 ; =ov00_02217ACC + mov r0, r4 + mvn r2, #0 + bl ov00_02212DB4 + mvn r1, #0 + cmp r0, r1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _021F7CE8 ; =ov00_02217AAC + mov r0, r4 + mov r2, #0 + bl ov00_02212DB4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F7CD4: .word ov00_02217B70 +_021F7CD8: .word ov00_02217B7C +_021F7CDC: .word ov00_02217AB4 +_021F7CE0: .word ov00_02217AC0 +_021F7CE4: .word ov00_02217ACC +_021F7CE8: .word ov00_02217AAC + arm_func_end ov00_021F7C10 + + arm_func_start ov00_021F7CEC +ov00_021F7CEC: ; 0x021F7CEC + stmdb sp!, {r3, r4, r5, lr} + cmp r1, #0 + moveq r4, #1 + mov r5, r0 + movne r4, #0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + bgt _021F7D48 +_021F7D10: + bl ov00_021F955C + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0xf4] + cmp r5, r0 + bne _021F7D34 + bl ov00_021F955C + add r0, r0, r4 + ldrb r0, [r0, #0x2d0] + ldmia sp!, {r3, r4, r5, pc} +_021F7D34: + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F7D10 +_021F7D48: + mov r0, #0xff + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F7CEC + + arm_func_start ov00_021F7D50 +ov00_021F7D50: ; 0x021F7D50 + stmdb sp!, {r4, r5, r6, lr} + cmp r0, #0 + mov r5, #0 + beq _021F7D70 + bl ov00_021F955C + ldr r0, [r0, #0x2f0] + bic r0, r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_021F7D70: + mov r6, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F7DAC + mov r4, r6 +_021F7D88: + bl ov00_021F955C + add r0, r0, r6 + ldrb r0, [r0, #0x2d0] + add r6, r6, #1 + orr r5, r5, r4, lsl r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r6, r0 + ble _021F7D88 +_021F7DAC: + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F7D50 + + arm_func_start ov00_021F7DB4 +ov00_021F7DB4: ; 0x021F7DB4 + stmdb sp!, {r4, lr} + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x1ad] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x1f8] + str r1, [r4, #0x1fc] + ldmia sp!, {r4, pc} + arm_func_end ov00_021F7DB4 + + arm_func_start ov00_021F7DDC +ov00_021F7DDC: ; 0x021F7DDC + stmdb sp!, {r4, lr} + ldr r1, _021F7E48 ; =ov00_0221A928 + mov r4, r0 + ldr r3, [r1] + cmp r3, #0 + ldrneb r0, [r3] + cmpne r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0 + str r2, [r3, #8] + ldr r0, [r1] + str r2, [r0, #0xc] + ldr r0, [r1] + strb r2, [r0, #2] + bl OS_GetTick + ldr r2, _021F7E48 ; =ov00_0221A928 + cmp r4, #0 + ldr r2, [r2] + str r0, [r2, #0x18] + str r1, [r2, #0x1c] + ldmneia sp!, {r4, pc} + bl OS_GetTick + ldr r2, _021F7E48 ; =ov00_0221A928 + ldr r2, [r2] + str r0, [r2, #0x10] + str r1, [r2, #0x14] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F7E48: .word ov00_0221A928 + arm_func_end ov00_021F7DDC + + arm_func_start ov00_021F7E4C +ov00_021F7E4C: ; 0x021F7E4C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + ldr r0, _021F826C ; =ov00_0221A928 + ldr r0, [r0] + cmp r0, #0 + ldrneb r0, [r0] + cmpne r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0x13 + bne _021F80A8 + mov r0, #0 + bl ov00_021F7D50 + ldr r1, _021F826C ; =ov00_0221A928 + ldr r5, [r1] + ldr r1, [r5, #8] + cmp r1, r0 + bne _021F7F80 + ldr r1, [r5, #0xc] + cmp r1, r0 + bne _021F7F0C + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + strb r0, [r4, #0x16] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r1, [r0, #0xd] + mov r0, #0 + sub r1, r1, #1 + strb r1, [r4, #0x1a4] + bl ov00_021F64C0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F7F0C: + bl OS_GetTick + str r0, [r5, #0x18] + str r1, [r5, #0x1c] + mov r0, #0 + str r0, [r5, #8] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F7F60 + mov r0, #3 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + add sp, sp, #8 + str r1, [r4, #0xf0] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F7F60: + mov r0, #4 + bl ov00_021F956C + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl ov00_021F5D0C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F7F80: + ldrb r4, [r5, #2] + bl OS_GetTick + ldr r3, [r5, #0x18] + ldr r2, [r5, #0x1c] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021F8270 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _021F8274 ; =0x00001770 + mul r2, r4, r2 + cmp r1, r2, asr #31 + cmpeq r0, r2 + addlo sp, sp, #8 + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp r4, #5 + bls _021F7FEC + mov r0, #1 + bl ov00_021F7DDC + bl ov00_021F7128 + mov r0, #1 + bl ov00_021F6EC4 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F7FEC: + mov r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F808C + ldr r8, _021F826C ; =ov00_0221A928 + mov r5, #0 + mov r4, #0x11 + mov r6, r7 +_021F8010: + bl ov00_021F955C + add r0, r0, r7 + ldr r1, [r8] + ldrb r0, [r0, #0x2d0] + ldr r1, [r1, #8] + tst r1, r6, lsl r0 + bne _021F8078 + bl ov00_021F955C + mov sl, r0 + bl ov00_021F955C + mov sb, r0 + bl ov00_021F955C + str r5, [sp] + str r5, [sp, #4] + add r0, r0, r7, lsl #1 + add r1, sl, r7, lsl #2 + add r2, sb, r7, lsl #2 + ldrh r3, [r0, #0xa4] + ldr r1, [r1, #0xf4] + ldr r2, [r2, #0x24] + mov r0, r4 + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F8078: + add r7, r7, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r7, r0 + ble _021F8010 +_021F808C: + ldr r0, _021F826C ; =ov00_0221A928 + add sp, sp, #8 + ldr r1, [r0] + ldrb r0, [r1, #2] + add r0, r0, #1 + strb r0, [r1, #2] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F80A8: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #4 + beq _021F80CC + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #3 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F80CC: + ldr r0, _021F826C ; =ov00_0221A928 + ldr r4, [r0] + bl ov00_021F955C + ldrb r1, [r4, #1] + ldrb r2, [r0, #0xd] + sub r0, r1, #1 + cmp r2, r0 + addlt sp, sp, #8 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldrb r0, [r4, #2] + cmp r0, #0 + bne _021F8140 + ldr r0, _021F826C ; =ov00_0221A928 + ldr r4, [r0] + bl OS_GetTick + ldr r3, [r4, #0x10] + ldr r2, [r4, #0x14] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021F8270 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, [r4, #4] + cmp r1, #0 + cmpeq r0, r2 + bhs _021F8198 +_021F8140: + ldrb r0, [r4, #2] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, _021F826C ; =ov00_0221A928 + ldr r4, [r0] + bl OS_GetTick + ldr r3, [r4, #0x18] + ldr r2, [r4, #0x1c] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021F8270 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, [r4, #4] + cmp r1, #0 + cmpeq r0, r2, lsr #2 + addlo sp, sp, #8 + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F8198: + bl ov00_021F955C + ldr r0, [r0, #0x204] + cmp r0, #0 + beq _021F81C4 + bl ov00_021F955C + ldr r0, [r0, #0x204] + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F81C4: + mov r0, #0x13 + bl ov00_021F956C + mov r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F8248 + mov r6, #0 + mov r5, #0x11 +_021F81E8: + bl ov00_021F955C + mov r8, r0 + bl ov00_021F955C + mov r7, r0 + bl ov00_021F955C + str r6, [sp] + str r6, [sp, #4] + add r0, r0, r4, lsl #1 + add r1, r8, r4, lsl #2 + add r2, r7, r4, lsl #2 + ldrh r3, [r0, #0xa4] + ldr r1, [r1, #0xf4] + ldr r2, [r2, #0x24] + mov r0, r5 + bl ov00_021F4304 + bl ov00_021F5B30 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r4, r4, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r4, r0 + ble _021F81E8 +_021F8248: + ldr r0, _021F826C ; =ov00_0221A928 + ldr r4, [r0] + bl OS_GetTick + str r0, [r4, #0x18] + str r1, [r4, #0x1c] + mov r0, #1 + strb r0, [r4, #2] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021F826C: .word ov00_0221A928 +_021F8270: .word 0x000082EA +_021F8274: .word 0x00001770 + arm_func_end ov00_021F7E4C + + arm_func_start ov00_021F8278 +ov00_021F8278: ; 0x021F8278 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #4 + addls pc, pc, r4, lsl #2 + b _021F82D4 +_021F8294: ; jump table + b _021F82D4 ; case 0 + b _021F82A8 ; case 1 + b _021F82B4 ; case 2 + b _021F82C0 ; case 3 + b _021F82CC ; case 4 +_021F82A8: + mov r0, #9 + sub r2, r0, #0xa + b _021F82D4 +_021F82B4: + mov r0, #9 + sub r2, r0, #0xb + b _021F82D4 +_021F82C0: + mov r0, #6 + sub r2, r0, #0x10 + b _021F82D4 +_021F82CC: + mov r0, #6 + sub r2, r0, #0x1a +_021F82D4: + ldr r1, _021F82E8 ; =0xFFFEC398 + add r1, r2, r1 + bl ov00_021F2EE4 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F82E8: .word 0xFFFEC398 + arm_func_end ov00_021F8278 + + arm_func_start ov00_021F82EC +ov00_021F82EC: ; 0x021F82EC + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #6 + addls pc, pc, r4, lsl #2 + b _021F8368 +_021F8308: ; jump table + b _021F8368 ; case 0 + b _021F8324 ; case 1 + b _021F8330 ; case 2 + b _021F833C ; case 3 + b _021F8348 ; case 4 + b _021F8354 ; case 5 + b _021F8360 ; case 6 +_021F8324: + mov r0, #6 + sub r2, r0, #0x38 + b _021F8368 +_021F8330: + mov r0, #6 + sub r2, r0, #0x24 + b _021F8368 +_021F833C: + mov r0, #6 + sub r2, r0, #0x1a + b _021F8368 +_021F8348: + mov r0, #6 + sub r2, r0, #0x2e + b _021F8368 +_021F8354: + mov r0, #9 + sub r2, r0, #0xa + b _021F8368 +_021F8360: + mov r0, #9 + sub r2, r0, #0xb +_021F8368: + ldr r1, _021F837C ; =0xFFFEB3F8 + add r1, r2, r1 + bl ov00_021F2EE4 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F837C: .word 0xFFFEB3F8 + arm_func_end ov00_021F82EC + + arm_func_start ov00_021F8380 +ov00_021F8380: ; 0x021F8380 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r6, #5 + addls pc, pc, r6, lsl #2 + b _021F83EC +_021F839C: ; jump table + b _021F83EC ; case 0 + b _021F83B4 ; case 1 + b _021F83C0 ; case 2 + b _021F83CC ; case 3 + b _021F83D8 ; case 4 + b _021F83E4 ; case 5 +_021F83B4: + mov r5, #6 + sub r4, r5, #0x38 + b _021F83EC +_021F83C0: + mov r5, #6 + sub r4, r5, #0x42 + b _021F83EC +_021F83CC: + mov r5, #6 + sub r4, r5, #0x24 + b _021F83EC +_021F83D8: + mov r5, #6 + sub r4, r5, #0x56 + b _021F83EC +_021F83E4: + mov r5, #6 + sub r4, r5, #0x1a +_021F83EC: + bl ov00_021EE568 + cmp r0, #2 + beq _021F840C + cmp r0, #4 + beq _021F841C + cmp r0, #5 + beq _021F8430 + b _021F8444 +_021F840C: + mov r0, r5 + sub r1, r4, #0xfa00 + bl ov00_021EF3C0 + b _021F8454 +_021F841C: + ldr r1, _021F845C ; =0xFFFEDEF0 + mov r0, r5 + add r1, r4, r1 + bl ov00_021F0238 + b _021F8454 +_021F8430: + ldr r1, _021F8460 ; =0xFFFEB7E0 + mov r0, r5 + add r1, r4, r1 + bl ov00_021F2EE4 + b _021F8454 +_021F8444: + ldr r1, _021F8464 ; =0xFFFE90D0 + mov r0, r5 + add r1, r4, r1 + bl ov00_021EC24C +_021F8454: + mov r0, r6 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F845C: .word 0xFFFEDEF0 +_021F8460: .word 0xFFFEB7E0 +_021F8464: .word 0xFFFE90D0 + arm_func_end ov00_021F8380 + + arm_func_start ov00_021F8468 +ov00_021F8468: ; 0x021F8468 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #1 + beq _021F8498 + cmp r4, #2 + beq _021F84A4 + cmp r4, #3 + moveq r0, #6 + subeq r2, r0, #0x24 + b _021F84AC +_021F8498: + mov r0, #9 + sub r2, r0, #0xa + b _021F84AC +_021F84A4: + mov r0, #6 + sub r2, r0, #0x38 +_021F84AC: + ldr r1, _021F84C0 ; =0xFFFEB010 + add r1, r2, r1 + bl ov00_021F2EE4 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F84C0: .word 0xFFFEB010 + arm_func_end ov00_021F8468 + + arm_func_start ov00_021F84C4 +ov00_021F84C4: ; 0x021F84C4 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #1 + beq _021F84E8 + cmp r4, #2 + beq _021F84F0 + b _021F84F8 +_021F84E8: + mov r0, #1 + ldmia sp!, {r4, pc} +_021F84F0: + mov r0, #2 + ldmia sp!, {r4, pc} +_021F84F8: + movs r0, #6 + beq _021F8508 + ldr r1, _021F8510 ; =0xFFFEB007 + bl ov00_021F2EE4 +_021F8508: + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F8510: .word 0xFFFEB007 + arm_func_end ov00_021F84C4 + + arm_func_start ov00_021F8514 +ov00_021F8514: ; 0x021F8514 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r4, #7 + addls pc, pc, r4, lsl #2 + b _021F8598 +_021F8530: ; jump table + b _021F8598 ; case 0 + b _021F8550 ; case 1 + b _021F855C ; case 2 + b _021F856C ; case 3 + b _021F8578 ; case 4 + b _021F855C ; case 5 + b _021F8584 ; case 6 + b _021F8590 ; case 7 +_021F8550: + mov r0, #9 + sub r2, r0, #0xa + b _021F8598 +_021F855C: + mov r0, #0 + mov r2, r0 + mov r4, r0 + b _021F8598 +_021F856C: + mov r0, #6 + sub r2, r0, #0x10 + b _021F8598 +_021F8578: + mov r0, #6 + sub r2, r0, #0x24 + b _021F8598 +_021F8584: + mov r0, #6 + sub r2, r0, #0x4c + b _021F8598 +_021F8590: + mov r0, #6 + sub r2, r0, #0x56 +_021F8598: + cmp r0, #0 + beq _021F85AC + ldr r1, _021F85B4 ; =0xFFFEAC28 + add r1, r2, r1 + bl ov00_021F2EE4 +_021F85AC: + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F85B4: .word 0xFFFEAC28 + arm_func_end ov00_021F8514 + + arm_func_start ov00_021F85B8 +ov00_021F85B8: ; 0x021F85B8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _021F89C0 ; =ov00_0221A928 + mov r6, r0 + ldr r0, [r3, #0x18] + mov r5, r1 + add r0, r0, #1 + str r0, [r3, #0x18] + mov r4, r2 + bl ov00_021F955C + ldr r1, [r0, #0x178] + ldr r0, [r0, #0x174] + cmp r1, #0 + cmpeq r0, #0 + beq _021F8630 + sub r0, r5, #4 + cmp r0, #1 + bhi _021F8610 + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x174] + str r1, [r0, #0x178] + b _021F8630 +_021F8610: + bl ov00_021F955C + mov r7, r0 + bl OS_GetTick + ldr r2, _021F89C4 ; =0x00EFB5F7 + adds r0, r0, r2 + str r0, [r7, #0x174] + adc r0, r1, #0 + str r0, [r7, #0x178] +_021F8630: + cmp r5, #0 + beq _021F8648 + cmp r5, #4 + beq _021F8654 + cmp r5, #5 + b _021F89AC +_021F8648: + mov r0, r4 + bl ov00_021F89CC + b _021F89AC +_021F8654: + mov r0, r6 + mov r5, #0 + bl ov00_022139C8 + cmp r0, #0 + ble _021F86A8 +_021F8668: + mov r0, r6 + mov r1, r5 + bl ov00_022139B8 + mov r4, r0 + bl ov00_021F7C10 + cmp r0, #0 + bne _021F8694 + mov r0, r6 + mov r1, r4 + bl ov00_0221390C + sub r5, r5, #1 +_021F8694: + mov r0, r6 + add r5, r5, #1 + bl ov00_022139C8 + cmp r5, r0 + blt _021F8668 +_021F86A8: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #2 + beq _021F86CC + cmp r0, #3 + beq _021F87B8 + cmp r0, #5 + beq _021F8828 + b _021F89AC +_021F86CC: + mov r0, r6 + mov r5, #0 + bl ov00_022139C8 + cmp r0, #0 + ble _021F875C +_021F86E0: + mov r0, r6 + mov r1, r5 + bl ov00_022139B8 + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x1c] + cmp r0, #0 + beq _021F8748 + bl ov00_021F955C + mov r7, r0 + mov r0, r4 + bl ov00_02212E78 + ldr r1, [r7, #0x1c] + cmp r1, r0 + bne _021F8748 + bl ov00_021F955C + ldrh r0, [r0, #0x1a] + cmp r0, #0 + beq _021F8748 + bl ov00_021F955C + mov r7, r0 + mov r0, r4 + bl ov00_02212E80 + ldrh r1, [r7, #0x1a] + cmp r1, r0 + beq _021F875C +_021F8748: + mov r0, r6 + add r5, r5, #1 + bl ov00_022139C8 + cmp r5, r0 + blt _021F86E0 +_021F875C: + mov r0, r6 + bl ov00_022139C8 + cmp r5, r0 + bge _021F8794 + mov r0, #3 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x204] + bl ov00_021F955C + ldr r0, [r0, #0x204] + bl ov00_021F3CF8 + bl ov00_021F82EC + b _021F89AC +_021F8794: + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + str r1, [r4, #0xf0] + b _021F89AC +_021F87B8: + mov r0, #1 + bl ov00_021F89D0 + bl ov00_021F8BA8 + mov r0, r6 + bl ov00_022139C8 + cmp r0, #0 + beq _021F8804 + mov r0, #0 + mov r1, r0 + bl ov00_021F5B5C + bl ov00_021F5B30 + cmp r0, #0 + bne _021F89AC + mov r0, #4 + bl ov00_021F956C + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0xe8] + b _021F89AC +_021F8804: + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + str r1, [r4, #0xf0] + b _021F89AC +_021F8828: + mov r0, r6 + bl ov00_022139C8 + cmp r0, #0 + beq _021F88A0 + mov r4, #0 +_021F883C: + mov r0, r6 + mov r1, r4 + bl ov00_022139B8 + mov r5, r0 + bl ov00_02212E78 + mov r7, r0 + bl ov00_021F955C + ldr r0, [r0, #0x1b8] + cmp r7, r0 + bne _021F8884 + mov r0, r5 + bl ov00_02212E80 + mov r7, r0 + bl ov00_021F955C + add r0, r0, #0x100 + ldrh r0, [r0, #0xb4] + cmp r7, r0 + beq _021F88A0 +_021F8884: + mov r0, r6 + mov r1, r5 + bl ov00_0221390C + mov r0, r6 + bl ov00_022139C8 + cmp r0, #0 + bne _021F883C +_021F88A0: + mov r0, r6 + bl ov00_022139C8 + cmp r0, #0 + beq _021F898C + mov r0, r6 + mov r1, #0 + bl ov00_022139B8 + ldr r1, _021F89C8 ; =ov00_02217AAC + mov r2, #0 + bl ov00_02212DB4 + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #1 + bne _021F8960 + bl ov00_021F955C + ldr r0, [r0, #0xf4] + cmp r4, r0 + bne _021F8960 + mov r0, #0 + bl ov00_021F89D0 + cmp r0, #0 + beq _021F8920 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #0 + beq _021F8960 + bl ov00_021F63DC + bl ov00_021F5B30 + cmp r0, #0 + bne _021F89AC + b _021F8960 +_021F8920: + bl ov00_021F955C + ldr r0, [r0, #0xf4] + bl ov00_021F60AC + bl ov00_021F5B30 + cmp r0, #0 + bne _021F89AC + mov r0, #4 + bl ov00_021F956C + bl ov00_021F955C + mov r1, r0 + mov r0, #0 + ldr r2, [r1, #0xf4] + mov r1, r0 + bl ov00_021F5D0C + bl ov00_021F5B30 + b _021F89AC +_021F8960: + mov r0, #6 + bl ov00_021F956C + mov r0, r6 + mov r1, #0 + bl ov00_022139B8 + mov r2, r0 + mov r0, #0 + mov r1, r0 + bl ov00_021F3F5C + bl ov00_021F8468 + b _021F89AC +_021F898C: + bl ov00_021F955C + mov r1, #2 + str r1, [r0, #0xe8] + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xec] + str r1, [r4, #0xf0] +_021F89AC: + ldr r0, _021F89C0 ; =ov00_0221A928 + ldr r1, [r0, #0x18] + sub r1, r1, #1 + str r1, [r0, #0x18] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F89C0: .word ov00_0221A928 +_021F89C4: .word 0x00EFB5F7 +_021F89C8: .word ov00_02217AAC + arm_func_end ov00_021F85B8 + + arm_func_start ov00_021F89CC +ov00_021F89CC: ; 0x021F89CC + bx lr + arm_func_end ov00_021F89CC + + arm_func_start ov00_021F89D0 +ov00_021F89D0: ; 0x021F89D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sl, r0 + mov r7, r4 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #0 + ble _021F8B40 +_021F89F4: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, r7 + bl ov00_022139B8 + mov sb, r0 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _021F8A90 + ldr r1, _021F8B9C ; =ov00_02217AAC + mov r0, sb + mov r2, #0 + bl ov00_02212DB4 + mov r6, r0 + mov r5, #0 + mov r8, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r0, #1 + blt _021F8A88 +_021F8A44: + bl ov00_021F955C + add r0, r0, r8, lsl #2 + ldr r0, [r0, #0xf4] + cmp r6, r0 + bne _021F8A74 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, sb + bl ov00_0221390C + sub r7, r7, #1 + mov r5, #1 + b _021F8A88 +_021F8A74: + add r8, r8, #1 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + cmp r8, r0 + ble _021F8A44 +_021F8A88: + cmp r5, #0 + bne _021F8B28 +_021F8A90: + bl ov00_021F955C + ldr r0, [r0, #0x474] + cmp r0, #0 + beq _021F8B10 + bl ov00_021F955C + mov r5, r0 + bl ov00_021F955C + ldr r1, [r0, #0x478] + ldr r2, [r5, #0x474] + mov r0, r7 + blx r2 + mov r5, r0 + cmp r5, #0 + ble _021F8AF4 + ldr r0, _021F8BA0 ; =0x007FFFFF + cmp r5, r0 + movgt r5, r0 + mov r0, #0x100 + bl ov00_021ED5E4 + mov r2, r0 + ldr r1, _021F8BA4 ; =ov00_02217AD8 + mov r0, sb + orr r2, r2, r5, lsl #8 + bl ov00_02212D10 + b _021F8B28 +_021F8AF4: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, sb + bl ov00_0221390C + sub r7, r7, #1 + mov r4, #1 + b _021F8B28 +_021F8B10: + mov r0, #0x80 + bl ov00_021ED5E4 + mov r2, r0 + ldr r1, _021F8BA4 ; =ov00_02217AD8 + mov r0, sb + bl ov00_02212D10 +_021F8B28: + add r7, r7, #1 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r7, r0 + blt _021F89F4 +_021F8B40: + cmp sl, #0 + beq _021F8B74 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #0 + beq _021F8B74 + bl ov00_021F955C + mov r1, #0 + ldr r0, [r0, #0xe4] + ldr r2, _021F8BA4 ; =ov00_02217AD8 + mov r3, r1 + bl ov00_022139D8 +_021F8B74: + cmp r4, #0 + beq _021F8B94 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021F8B94: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021F8B9C: .word ov00_02217AAC +_021F8BA0: .word 0x007FFFFF +_021F8BA4: .word ov00_02217AD8 + arm_func_end ov00_021F89D0 + + arm_func_start ov00_021F8BA8 +ov00_021F8BA8: ; 0x021F8BA8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov r7, #0 + mov r8, r7 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #1 + addle sp, sp, #0x18 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov sb, r7 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #0 + ble _021F8C38 + ldr r4, _021F8D10 ; =ov00_02216040 + ldr r6, _021F8D14 ; =ov00_02217AD8 + mvn r5, #0 +_021F8BF4: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, sb + bl ov00_022139B8 + mov r1, r6 + mov r2, r5 + bl ov00_02212DB4 + cmp r0, r7 + movgt r7, r0 + ldr r0, [r4, sb, lsl #2] + add sb, sb, #1 + add r8, r8, r0 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp sb, r0 + blt _021F8BF4 +_021F8C38: + mov r0, #0x64 + bl ov00_021ED5E4 + mov r6, r0 + mov sb, #0 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp r0, #0 + ble _021F8CC8 + ldr r4, _021F8D10 ; =ov00_02216040 + add r5, sp, #0 + mov fp, #0x64 +_021F8C68: + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + sub r0, r0, #1 + cmp sb, r0 + beq _021F8CC8 + ldr r2, [r4, sb, lsl #2] + cmp sb, #0 + addgt r0, r5, sb, lsl #2 + ldrgt sl, [r0, #-4] + mul r0, r2, fp + movle sl, #0 + mov r1, r8 + bl _s32_div_f + add r0, r0, sl + str r0, [r5, sb, lsl #2] + cmp r6, r0 + blo _021F8CC8 + add sb, sb, #1 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + bl ov00_022139C8 + cmp sb, r0 + blt _021F8C68 +_021F8CC8: + mvn r0, #0x80000000 + cmp r7, r0 + addlt r7, r7, #1 + bl ov00_021F955C + ldr r0, [r0, #0xe4] + mov r1, sb + bl ov00_022139B8 + ldr r1, _021F8D14 ; =ov00_02217AD8 + mov r2, r7 + bl ov00_02212D10 + bl ov00_021F955C + mov r1, #0 + ldr r0, [r0, #0xe4] + ldr r2, _021F8D14 ; =ov00_02217AD8 + mov r3, r1 + bl ov00_022139D8 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F8D10: .word ov00_02216040 +_021F8D14: .word ov00_02217AD8 + arm_func_end ov00_021F8BA8 + + arm_func_start ov00_021F8D18 +ov00_021F8D18: ; 0x021F8D18 + stmdb sp!, {r4, lr} + mov r4, r1 + cmp r0, #0x32 + bgt _021F8D4C + bge _021F8D94 + cmp r0, #0xa + bgt _021F8DF0 + cmp r0, #8 + blt _021F8DF0 + beq _021F8D6C + cmp r0, #0xa + beq _021F8D80 + b _021F8DF0 +_021F8D4C: + sub r1, r0, #0x33 + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _021F8DF0 +_021F8D5C: ; jump table + b _021F8DA8 ; case 0 + b _021F8DBC ; case 1 + b _021F8DD0 ; case 2 + b _021F8DE0 ; case 3 +_021F8D6C: + bl ov00_021F955C + ldrb r1, [r0, #0x14] + mov r0, r4 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8D80: + bl ov00_021F955C + ldrb r1, [r0, #0x16] + mov r0, r4 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8D94: + bl ov00_021F955C + ldr r1, [r0, #0x200] + mov r0, r4 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8DA8: + bl ov00_021F955C + ldrb r1, [r0, #0x15] + mov r0, r4 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8DBC: + bl ov00_021F955C + ldr r1, [r0, #0x20] + mov r0, r4 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8DD0: + mov r0, r4 + mov r1, #3 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8DE0: + mov r0, r4 + mov r1, #1 + bl ov00_02210DC8 + ldmia sp!, {r4, pc} +_021F8DF0: + subs r1, r0, #0x64 + ldmmiia sp!, {r4, pc} + cmp r1, #0x9a + ldmgeia sp!, {r4, pc} + mov r0, #0xc + mul r2, r1, r0 + ldr r0, _021F8E54 ; =ov00_0221A948 + ldrb r0, [r0, r2] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _021F8E58 ; =ov00_0221A949 + ldrb r0, [r0, r2] + cmp r0, #0 + beq _021F8E3C + ldr r1, _021F8E5C ; =ov00_0221A950 + mov r0, r4 + ldr r1, [r1, r2] + bl ov00_02210DFC + ldmia sp!, {r4, pc} +_021F8E3C: + ldr r1, _021F8E5C ; =ov00_0221A950 + mov r0, r4 + ldr r1, [r1, r2] + ldr r1, [r1] + bl ov00_02210DC8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F8E54: .word ov00_0221A948 +_021F8E58: .word ov00_0221A949 +_021F8E5C: .word ov00_0221A950 + arm_func_end ov00_021F8D18 + + arm_func_start ov00_021F8E60 +ov00_021F8E60: ; 0x021F8E60 + bx lr + arm_func_end ov00_021F8E60 + + arm_func_start ov00_021F8E64 +ov00_021F8E64: ; 0x021F8E64 + bx lr + arm_func_end ov00_021F8E64 + + arm_func_start ov00_021F8E68 +ov00_021F8E68: ; 0x021F8E68 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + cmp r0, #0 + beq _021F8E84 + cmp r0, #1 + cmpne r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_021F8E84: + mov r0, r6 + mov r1, #8 + bl ov00_02210D9C + mov r0, r6 + mov r1, #0xa + bl ov00_02210D9C + mov r0, r6 + mov r1, #0x32 + bl ov00_02210D9C + mov r0, r6 + mov r1, #0x33 + bl ov00_02210D9C + mov r0, r6 + mov r1, #0x34 + bl ov00_02210D9C + mov r0, r6 + mov r1, #0x35 + bl ov00_02210D9C + mov r0, r6 + mov r1, #0x36 + bl ov00_02210D9C + ldr r5, _021F8F08 ; =ov00_0221A948 + mov r4, #0 +_021F8EE0: + ldrb r1, [r5] + cmp r1, #0 + beq _021F8EF4 + mov r0, r6 + bl ov00_02210D9C +_021F8EF4: + add r4, r4, #1 + cmp r4, #0x9a + add r5, r5, #0xc + blt _021F8EE0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F8F08: .word ov00_0221A948 + arm_func_end ov00_021F8E68 + + arm_func_start ov00_021F8F0C +ov00_021F8F0C: ; 0x021F8F0C + mov r0, #0 + bx lr + arm_func_end ov00_021F8F0C + + arm_func_start ov00_021F8F14 +ov00_021F8F14: ; 0x021F8F14 + ldr ip, _021F8F1C ; =ov00_021F8380 + bx ip + .balign 4, 0 +_021F8F1C: .word ov00_021F8380 + arm_func_end ov00_021F8F14 + + arm_func_start ov00_021F8F20 +ov00_021F8F20: ; 0x021F8F20 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021F955C + str r5, [r0, #0x1c] + bl ov00_021F955C + strh r4, [r0, #0x1a] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F8F20 + + arm_func_start ov00_021F8F40 +ov00_021F8F40: ; 0x021F8F40 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #1 + bne _021F8F64 + mov r0, #6 + bl ov00_021F956C + b _021F8F84 +_021F8F64: + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #6 + beq _021F8F84 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + ldmneia sp!, {r4, pc} +_021F8F84: + bl ov00_021F955C + ldr r0, [r0, #0x180] + cmp r4, r0 + bne _021F8FA8 + bl ov00_021F955C + ldrb r1, [r0, #0x17c] + add r1, r1, #1 + strb r1, [r0, #0x17c] + b _021F8FBC +_021F8FA8: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17c] + bl ov00_021F955C + str r4, [r0, #0x180] +_021F8FBC: + bl ov00_021F955C + mov r2, #0 + str r2, [r0, #0x184] + str r2, [r0, #0x188] + mov r1, r4 + mov r0, #1 + bl ov00_021F3F5C + bl ov00_021F8468 + cmp r0, #0 + ldmneia sp!, {r4, pc} + bl ov00_021F955C + mov r1, #0xff + strb r1, [r0, #0x3cc] + ldmia sp!, {r4, pc} + arm_func_end ov00_021F8F40 + + arm_func_start ov00_021F8FF4 +ov00_021F8FF4: ; 0x021F8FF4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x9c + mov sl, r0 + mov sb, r1 + mov r8, #0 + bl ov00_021EE568 + cmp r0, #5 + beq _021F9048 + bl ov00_021EE568 + cmp r0, #6 + addne sp, sp, #0x9c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + beq _021F9048 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + addne sp, sp, #0x9c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021F9048: + cmp sb, #0x14 + addlo sp, sp, #0x9c + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, _021F90FC ; =ov00_02217B54 + add r4, sp, #0x1c + add r7, sp, #8 + mov r6, #0x14 + mov fp, #4 +_021F9068: + mov r0, sl + mov r1, r7 + mov r2, r6 + bl MI_CpuCopy8 + mov r0, r7 + mov r1, r5 + mov r2, fp + bl strncmp + cmp r0, #0 + ldreq r0, [sp, #0xc] + cmpeq r0, #3 + addne sp, sp, #0x9c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r2, [sp, #0x11] + mov r1, r4 + add r0, sl, #0x14 + bl MI_CpuCopy8 + str r4, [sp] + ldrb r0, [sp, #0x11] + mov r0, r0, asr #2 + str r0, [sp, #4] + ldrb r0, [sp, #0x10] + ldrh r3, [sp, #0x12] + ldr r1, [sp, #0x18] + ldr r2, [sp, #0x14] + bl ov00_021F4740 + cmp r0, #0 + addeq sp, sp, #0x9c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [sp, #0x11] + add r0, r0, #0x14 + add r8, r8, r0 + add r0, r8, #0x14 + cmp r0, sb + bls _021F9068 + add sp, sp, #0x9c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F90FC: .word ov00_02217B54 + arm_func_end ov00_021F8FF4 + + arm_func_start ov00_021F9100 +ov00_021F9100: ; 0x021F9100 + bx lr + arm_func_end ov00_021F9100 + + arm_func_start ov00_021F9104 +ov00_021F9104: ; 0x021F9104 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + mov r5, r0 + mov r6, r2 + mov r4, r3 + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #6 + beq _021F913C + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, pc} +_021F913C: + cmp r4, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} + cmp r5, #0 + bne _021F9338 + mov r0, #0 + str r0, [r4, #8] + bl ov00_021F955C + ldrb r1, [r0, #0x14] + add r1, r1, #1 + strb r1, [r0, #0x14] + bl ov00_021F955C + ldrb r1, [r4] + ldrb r5, [r0, #0x14] + cmp r1, #0 + beq _021F92D0 + bl ov00_021F955C + ldr r1, [r6, #4] + add r0, r0, r5, lsl #2 + str r1, [r0, #0x210] + ldrh r4, [r6, #2] + bl ov00_021F955C + mov r2, r4, asr #8 + mov r1, r4, lsl #8 + add r0, r0, r5, lsl #1 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + add r0, r0, #0x200 + strh r1, [r0, #0x90] + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17c] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x180] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x184] + str r1, [r0, #0x188] + bl ov00_021F955C + ldr r0, [r0, #0x1a0] + cmp r0, #0xb + bne _021F91F8 + mov r0, #0xc + bl ov00_021F956C + b _021F9200 +_021F91F8: + mov r0, #7 + bl ov00_021F956C +_021F9200: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0xc] + bl ov00_021F955C + ldr r3, [r0, #0x200] + ldr r2, _021F94D4 ; =ov00_02217A64 + add r0, sp, #0x10 + mov r1, #0xc + bl OS_SNPrintf + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + mov r6, r0 + bl ov00_021F955C + add r1, r6, r5, lsl #2 + mov r2, r0 + ldr r0, [r1, #0x210] + add r1, r2, r5, lsl #1 + add r1, r1, #0x200 + ldrh r1, [r1, #0x90] + mov r2, #0 + bl ov00_0220F724 + mov r6, r0 + bl ov00_021F955C + mvn r1, #0 + str r1, [sp] + ldr r3, _021F94D8 ; =0x00001388 + mov r1, #0 + str r3, [sp, #4] + ldr r0, [r0, #8] + mov r2, r6 + str r0, [sp, #8] + str r1, [sp, #0xc] + ldr r0, [r4, #4] + add r3, sp, #0x10 + ldr r0, [r0] + bl ov00_0220D018 + cmp r0, #1 + bne _021F92A8 + bl ov00_021F8514 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} +_021F92A8: + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} + bl ov00_021F955C + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + add sp, sp, #0x1c + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021F92D0: + cmp r6, #0 + beq _021F9314 + sub r5, r5, #1 + bl ov00_021F955C + ldr r1, [r6, #4] + add r0, r0, r5, lsl #2 + str r1, [r0, #0x210] + ldrh r4, [r6, #2] + bl ov00_021F955C + mov r2, r4, asr #8 + mov r1, r4, lsl #8 + add r0, r0, r5, lsl #1 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + add r0, r0, #0x200 + strh r1, [r0, #0x90] +_021F9314: + bl ov00_021F955C + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0x18c] + mov r0, #7 + str r1, [r4, #0x190] + bl ov00_021F956C + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} +_021F9338: + ldr r0, [r4, #8] + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r0, r5 + bl ov00_021F84C4 + mov r6, r0 + cmp r6, #2 + cmpne r6, #1 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, pc} + ldrb r0, [r4] + cmp r0, #0 + bne _021F93F0 + cmp r6, #1 + beq _021F938C + cmp r6, #2 + bne _021F93CC + ldrb r0, [r4, #1] + cmp r0, #1 + blo _021F93CC +_021F938C: + mov r0, #0 + str r0, [r4, #8] + bl ov00_021F94DC + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F631C + add sp, sp, #0x1c + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021F93CC: + ldrb r1, [r4, #1] + mov r0, r4 + add r1, r1, #1 + strb r1, [r4, #1] + bl ov00_021F4248 + bl ov00_021F8468 + add sp, sp, #0x1c + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_021F93F0: + bl ov00_021F955C + mov r5, r0 + bl OS_GetTick + str r0, [r5, #0x184] + str r1, [r5, #0x188] + cmp r6, #1 + beq _021F942C + cmp r6, #2 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x17c] + cmp r0, #1 + addlo sp, sp, #0x1c + ldmloia sp!, {r3, r4, r5, r6, pc} +_021F942C: + mov r0, #0 + str r0, [r4, #8] + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F9454 + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #2 + bne _021F946C +_021F9454: + mov r0, #1 + bl ov00_021F94DC + cmp r0, #0 + bne _021F9480 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} +_021F946C: + mov r0, #0 + bl ov00_021F94DC + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} +_021F9480: + bl ov00_021F955C + mov r1, #0 + strb r1, [r0, #0x17c] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x180] + bl ov00_021F955C + mov r1, #0 + str r1, [r0, #0x184] + str r1, [r0, #0x188] + bl ov00_021F955C + mov r4, r0 + bl ov00_021F955C + ldrb r0, [r0, #0xd] + add r0, r0, #1 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0xf4] + bl ov00_021F6100 + cmp r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021F94D4: .word ov00_02217A64 +_021F94D8: .word 0x00001388 + arm_func_end ov00_021F9104 + + arm_func_start ov00_021F94DC +ov00_021F94DC: ; 0x021F94DC + stmdb sp!, {r3, lr} + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, pc} + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F950C + bl ov00_021F955C + ldrb r1, [r0, #0x17d] + add r1, r1, #1 + strb r1, [r0, #0x17d] +_021F950C: + bl ov00_021F955C + ldrb r0, [r0, #0x15] + cmp r0, #3 + beq _021F952C + bl ov00_021F955C + ldrb r0, [r0, #0x17d] + cmp r0, #5 + blo _021F9540 +_021F952C: + ldr r1, _021F9548 ; =0xFFFEAE6C + mov r0, #6 + bl ov00_021F2EE4 + mov r0, #0 + ldmia sp!, {r3, pc} +_021F9540: + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F9548: .word 0xFFFEAE6C + arm_func_end ov00_021F94DC + + arm_func_start ov00_021F954C +ov00_021F954C: ; 0x021F954C + ldr r1, _021F9558 ; =ov00_0221A928 + str r0, [r1, #4] + bx lr + .balign 4, 0 +_021F9558: .word ov00_0221A928 + arm_func_end ov00_021F954C + + arm_func_start ov00_021F955C +ov00_021F955C: ; 0x021F955C + ldr r0, _021F9568 ; =ov00_0221A928 + ldr r0, [r0, #4] + bx lr + .balign 4, 0 +_021F9568: .word ov00_0221A928 + arm_func_end ov00_021F955C + + arm_func_start ov00_021F956C +ov00_021F956C: ; 0x021F956C + ldr r1, _021F957C ; =ov00_0221A928 + ldr r1, [r1, #4] + str r0, [r1, #0x1a0] + bx lr + .balign 4, 0 +_021F957C: .word ov00_0221A928 + arm_func_end ov00_021F956C + + arm_func_start ov00_021F9580 +ov00_021F9580: ; 0x021F9580 + ldr ip, _021F958C ; =ov00_021F9590 + mov r1, #1 + bx ip + .balign 4, 0 +_021F958C: .word ov00_021F9590 + arm_func_end ov00_021F9580 + + arm_func_start ov00_021F9590 +ov00_021F9590: ; 0x021F9590 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, r1 + bl ov00_021EC230 + cmp r0, #0 + bne _021F95D0 + cmp r5, #1 + bne _021F95C0 + mov r0, r4 + bl ov00_021EE530 + cmp r0, #0 + beq _021F95D0 +_021F95C0: + mov r0, r4 + bl ov00_021EE7B4 + cmp r0, #0 + bne _021F95D8 +_021F95D0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021F95D8: + mov r0, r4 + bl ov00_021F9CD4 + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r4 + bl ov00_021FA090 + mov r4, r0 + mov r0, r5 + bl ov00_021F9968 + cmp r4, r0 + movge r0, #1 + movlt r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021F9590 + + arm_func_start DWC_SendReliable +DWC_SendReliable: ; 0x021F9610 + stmdb sp!, {r3, lr} + mov ip, r1 + mov r3, r2 + mov r1, r0 + mov r2, ip + mov r0, #1 + bl ov00_021F9630 + ldmia sp!, {r3, pc} + arm_func_end DWC_SendReliable + + arm_func_start ov00_021F9630 +ov00_021F9630: ; 0x021F9630 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r7, r1 + mov r8, r0 + mov r0, r7 + mov r6, r2 + mov r5, r3 + bl ov00_021F9CBC + mov r4, r0 + mov r0, r7 + mov r1, r8 + bl ov00_021F9590 + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, #1 + strb r0, [r4, #0x1c] + str r6, [r4] + mov r0, #0 + str r0, [r4, #0xc] + add r0, sp, #0 + mov r1, r8 + mov r2, r5 + str r5, [r4, #0x14] + bl ov00_021F98FC + add r1, sp, #0 + mov r0, r7 + mov r2, #8 + mov r3, #1 + bl ov00_021F9D0C + ldr r0, _021F974C ; =ov00_0221B0A0 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh sb, [r0, #0x10] + mov r0, r7 + cmp r5, sb + movle sb, r5 + bl ov00_021FA090 + cmp sb, r0 + addgt sp, sp, #8 + movgt r0, #1 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r7 + mov r1, r6 + mov r2, sb + mov r3, #1 + bl ov00_021F9D0C + ldr r0, [r4, #0xc] + add r1, r0, sb + str r1, [r4, #0xc] + ldr r0, [r4, #0x14] + cmp r1, r0 + bne _021F9740 + mov r2, #0 + strb r2, [r4, #0x1c] + str r2, [r4] + str r2, [r4, #0xc] + ldr r1, _021F974C ; =ov00_0221B0A0 + str r2, [r4, #0x14] + ldr r1, [r1] + ldr r2, [r1, #0x600] + cmp r2, #0 + beq _021F9740 + cmp r8, #1 + bne _021F9740 + mov r1, r7 + blx r2 +_021F9740: + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021F974C: .word ov00_0221B0A0 + arm_func_end ov00_021F9630 + + arm_func_start ov00_021F9750 +ov00_021F9750: ; 0x021F9750 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r7, #1 + mov r6, r0 + mov r5, r1 + mov r4, r2 + mov sb, #0 + mov r8, r7 +_021F976C: + cmp sb, #0 + movne sl, r8, lsl sb + moveq sl, r7 + tst r6, sl + beq _021F97A8 + bl ov00_021EE490 + cmp sb, r0 + beq _021F97A8 + mov r0, sb + mov r1, r5 + mov r2, r4 + bl DWC_SendReliable + cmp r0, #0 + mvneq r0, sl + andeq r6, r6, r0 +_021F97A8: + add r0, sb, #1 + and sb, r0, #0xff + cmp sb, #0x20 + blo _021F976C + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_021F9750 + + arm_func_start DWC_SendUnreliable +DWC_SendUnreliable: ; 0x021F97C0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r6, r1 + mov r4, r2 + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl ov00_021EE530 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _021F984C ; =ov00_0221B0A0 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x10] + cmp r4, r0 + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, pc} + mov r0, r5 + mov r1, r6 + mov r2, r4 + mov r3, #0 + bl ov00_021F9D0C + ldr r0, _021F984C ; =ov00_0221B0A0 + ldr r0, [r0] + ldr r2, [r0, #0x600] + cmp r2, #0 + beq _021F9844 + mov r0, r4 + mov r1, r5 + blx r2 +_021F9844: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F984C: .word ov00_0221B0A0 + arm_func_end DWC_SendUnreliable + + arm_func_start ov00_021F9850 +ov00_021F9850: ; 0x021F9850 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl ov00_021F9CBC + mov r4, r0 + mov r0, r7 + bl ov00_021F9CF0 + cmp r0, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + str r6, [r4, #4] + str r5, [r4, #8] + mov r0, #1 + strb r0, [r4, #0x1d] + mov r1, #0 + str r1, [r4, #0x10] + str r1, [r4, #0x18] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021F9850 + + arm_func_start ov00_021F989C +ov00_021F989C: ; 0x021F989C + ldr r1, _021F98B8 ; =ov00_0221B0A0 + ldr r1, [r1] + cmp r1, #0 + moveq r0, #0 + strne r0, [r1, #0x600] + movne r0, #1 + bx lr + .balign 4, 0 +_021F98B8: .word ov00_0221B0A0 + arm_func_end ov00_021F989C + + arm_func_start ov00_021F98BC +ov00_021F98BC: ; 0x021F98BC + ldr r1, _021F98D8 ; =ov00_0221B0A0 + ldr r1, [r1] + cmp r1, #0 + moveq r0, #0 + strne r0, [r1, #0x604] + movne r0, #1 + bx lr + .balign 4, 0 +_021F98D8: .word ov00_0221B0A0 + arm_func_end ov00_021F98BC + + arm_func_start ov00_021F98DC +ov00_021F98DC: ; 0x021F98DC + ldr r1, _021F98F8 ; =ov00_0221B0A0 + ldr r1, [r1] + cmp r1, #0 + moveq r0, #0 + strne r0, [r1, #0x608] + movne r0, #1 + bx lr + .balign 4, 0 +_021F98F8: .word ov00_0221B0A0 + arm_func_end ov00_021F98DC + + arm_func_start ov00_021F98FC +ov00_021F98FC: ; 0x021F98FC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + ldr r1, _021F9928 ; =ov00_02217B88 + add r0, r6, #6 + mov r2, #2 + bl strncpy + strh r5, [r6, #4] + str r4, [r6] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F9928: .word ov00_02217B88 + arm_func_end ov00_021F98FC + + arm_func_start ov00_021F992C +ov00_021F992C: ; 0x021F992C + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r1, sp, #0 + mov r2, #8 + bl MI_CpuCopy8 + ldr r1, _021F9964 ; =ov00_02217B88 + add r0, sp, #6 + mov r2, #2 + bl memcmp + cmp r0, #0 + ldreqh r0, [sp, #4] + movne r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F9964: .word ov00_02217B88 + arm_func_end ov00_021F992C + + arm_func_start ov00_021F9968 +ov00_021F9968: ; 0x021F9968 + cmp r0, #2 + cmpne r0, #3 + cmpne r0, #4 + bne _021F9980 + mov r0, #0xc + bx lr +_021F9980: + mov r0, #8 + bx lr + arm_func_end ov00_021F9968 + + arm_func_start ov00_021F9988 +ov00_021F9988: ; 0x021F9988 + stmdb sp!, {r4, lr} + ldr r2, _021F99D0 ; =ov00_0221B0A0 + ldr r3, [r2] + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0x30 + mul r4, r0, r2 + add r0, r3, r4 + str r1, [r0, #0x2c] + bl OS_GetTick + ldr r2, _021F99D0 ; =ov00_0221B0A0 + ldr r2, [r2] + add r2, r2, r4 + str r0, [r2, #0x24] + str r1, [r2, #0x28] + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F99D0: .word ov00_0221B0A0 + arm_func_end ov00_021F9988 + + arm_func_start ov00_021F99D4 +ov00_021F99D4: ; 0x021F99D4 + stmdb sp!, {r3, lr} + ldr r3, _021F9A04 ; =ov00_0221B0A0 + ldr r2, _021F9A08 ; =0x00000614 + mov r1, #0 + str r0, [r3] + bl MI_CpuFill8 + ldr r0, _021F9A04 ; =ov00_0221B0A0 + ldr r1, _021F9A0C ; =0x000005B9 + ldr r0, [r0] + add r0, r0, #0x600 + strh r1, [r0, #0x10] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F9A04: .word ov00_0221B0A0 +_021F9A08: .word 0x00000614 +_021F9A0C: .word 0x000005B9 + arm_func_end ov00_021F99D4 + + arm_func_start ov00_021F9A10 +ov00_021F9A10: ; 0x021F9A10 + stmdb sp!, {r3, lr} + ldr ip, _021F9A48 ; =ov00_0221B0A0 + ldr ip, [ip] + cmp ip, #0 + ldmeqia sp!, {r3, pc} + cmp r1, #0 + cmpne r2, #0 + ldmeqia sp!, {r3, pc} + cmp r3, #0 + beq _021F9A40 + bl ov00_021F9D34 + ldmia sp!, {r3, pc} +_021F9A40: + bl ov00_021F9E28 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021F9A48: .word ov00_0221B0A0 + arm_func_end ov00_021F9A10 + + arm_func_start ov00_021F9A4C +ov00_021F9A4C: ; 0x021F9A4C + stmdb sp!, {r4, lr} + ldr r2, _021F9A88 ; =ov00_0221B0A0 + mov r4, r1 + ldr r1, [r2] + ldr r1, [r1, #0x60c] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021EE6B0 + ldr r2, _021F9A88 ; =ov00_0221B0A0 + mov r1, r0 + ldr r2, [r2] + mov r0, r4 + ldr r2, [r2, #0x60c] + blx r2 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021F9A88: .word ov00_0221B0A0 + arm_func_end ov00_021F9A4C + + arm_func_start ov00_021F9A8C +ov00_021F9A8C: ; 0x021F9A8C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r0, _021F9C18 ; =ov00_0221B0A0 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #0 + bl ov00_021EE4AC + mov r7, r0 + mov r8, #0 + cmp r7, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _021F9C18 ; =ov00_0221B0A0 + mov fp, r8 +_021F9AC0: + ldr r0, [sp] + ldrb sb, [r0, r8] + mov r0, sb + bl ov00_021EE530 + cmp r0, #0 + beq _021F9B54 + mov r0, sb + bl ov00_021F9CBC + ldr r1, [r4] + mov r6, r0 + ldr r0, [r1, #0x608] + cmp r0, #0 + ldrne r0, [r6, #0x2c] + cmpne r0, #0 + beq _021F9B54 + bl OS_GetTick + mov sl, r1 + ldr r2, [r6, #0x24] + mov r5, r0 + subs r2, r5, r2 + ldr r1, [r6, #0x28] + mov r0, r2, lsl #6 + sbc r1, sl, r1 + mov r1, r1, lsl #6 + orr r1, r1, r2, lsr #26 + ldr r2, _021F9C1C ; =0x000082EA + mov r3, #0 + bl _ll_udiv + ldr r1, [r6, #0x2c] + cmp r0, r1 + bls _021F9B54 + ldr r1, [r4] + mov r0, sb + ldr r1, [r1, #0x608] + blx r1 + str r5, [r6, #0x24] + str sl, [r6, #0x28] +_021F9B54: + bl ov00_021EE490 + cmp sb, r0 + beq _021F9C08 + mov r0, sb + bl ov00_021F9CD4 + cmp r0, #1 + bne _021F9C08 + mov r0, sb + bl ov00_021F9CBC + mov r5, r0 + ldr r0, [r4] + ldr r2, [r5, #0x14] + add r0, r0, #0x600 + ldr r1, [r5, #0xc] + ldrh r6, [r0, #0x10] + sub r0, r2, r1 + cmp r0, r6 + movle r6, r0 + mov r0, sb + bl ov00_021FA090 + cmp r0, r6 + blt _021F9C08 + ldr r3, [r5] + ldr r1, [r5, #0xc] + mov r0, sb + add r1, r3, r1 + mov r2, r6 + mov r3, #1 + bl ov00_021F9D0C + ldr r0, [r5, #0xc] + add r1, r0, r6 + str r1, [r5, #0xc] + ldr r0, [r5, #0x14] + cmp r1, r0 + bne _021F9C08 + strb fp, [r5, #0x1c] + str fp, [r5] + str fp, [r5, #0xc] + str fp, [r5, #0x14] + ldr r1, [r4] + ldr r2, [r1, #0x600] + cmp r2, #0 + beq _021F9C08 + mov r1, sb + blx r2 +_021F9C08: + add r8, r8, #1 + cmp r8, r7 + blt _021F9AC0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_021F9C18: .word ov00_0221B0A0 +_021F9C1C: .word 0x000082EA + arm_func_end ov00_021F9A8C + + arm_func_start ov00_021F9C20 +ov00_021F9C20: ; 0x021F9C20 + ldr r2, _021F9CA4 ; =ov00_0221B0A0 + ldr r3, [r2] + cmp r3, #0 + bxeq lr + mov r1, #0x30 + mul r1, r0, r1 + add r0, r3, r1 + mov r3, #0 + str r3, [r0, #0xc] + ldr r0, [r2] + add r0, r0, r1 + str r3, [r0, #0x10] + ldr r0, [r2] + add r0, r0, r1 + str r3, [r0, #0x14] + ldr r0, [r2] + add r0, r0, r1 + str r3, [r0, #0x18] + ldr r0, [r2] + add r0, r0, r1 + strb r3, [r0, #0x1c] + ldr r0, [r2] + add r2, r0, #0x1d + ldrb r0, [r2, r1] + cmp r0, #0 + movne r0, #1 + strneb r0, [r2, r1] + ldr r0, _021F9CA4 ; =ov00_0221B0A0 + mov r2, #0 + ldr r0, [r0] + add r0, r0, r1 + strh r2, [r0, #0x22] + bx lr + .balign 4, 0 +_021F9CA4: .word ov00_0221B0A0 + arm_func_end ov00_021F9C20 + + arm_func_start ov00_021F9CA8 +ov00_021F9CA8: ; 0x021F9CA8 + ldr r0, _021F9CB8 ; =ov00_0221B0A0 + mov r1, #0 + str r1, [r0] + bx lr + .balign 4, 0 +_021F9CB8: .word ov00_0221B0A0 + arm_func_end ov00_021F9CA8 + + arm_func_start ov00_021F9CBC +ov00_021F9CBC: ; 0x021F9CBC + ldr r2, _021F9CD0 ; =ov00_0221B0A0 + mov r1, #0x30 + ldr r2, [r2] + mla r0, r1, r0, r2 + bx lr + .balign 4, 0 +_021F9CD0: .word ov00_0221B0A0 + arm_func_end ov00_021F9CBC + + arm_func_start ov00_021F9CD4 +ov00_021F9CD4: ; 0x021F9CD4 + ldr r2, _021F9CEC ; =ov00_0221B0A0 + mov r1, #0x30 + ldr r2, [r2] + mla r1, r0, r1, r2 + ldrb r0, [r1, #0x1c] + bx lr + .balign 4, 0 +_021F9CEC: .word ov00_0221B0A0 + arm_func_end ov00_021F9CD4 + + arm_func_start ov00_021F9CF0 +ov00_021F9CF0: ; 0x021F9CF0 + ldr r2, _021F9D08 ; =ov00_0221B0A0 + mov r1, #0x30 + ldr r2, [r2] + mla r1, r0, r1, r2 + ldrb r0, [r1, #0x1d] + bx lr + .balign 4, 0 +_021F9D08: .word ov00_0221B0A0 + arm_func_end ov00_021F9CF0 + + arm_func_start ov00_021F9D0C +ov00_021F9D0C: ; 0x021F9D0C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EE64C + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov00_0220D194 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021F9D0C + + arm_func_start ov00_021F9D34 +ov00_021F9D34: ; 0x021F9D34 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + bl ov00_021EE6B0 + mov r4, r0 + bl ov00_021F9CF0 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _021F9E10 +_021F9D58: ; jump table + b _021F9D6C ; case 0 + b _021F9D98 ; case 1 + b _021F9DAC ; case 2 + b _021F9DC0 ; case 3 + b _021F9DD4 ; case 4 +_021F9D6C: + mov r0, r6 + bl ov00_021F992C + cmp r0, #2 + ldmloia sp!, {r4, r5, r6, pc} + cmp r0, #4 + ldmhiia sp!, {r4, r5, r6, pc} + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov00_021F9EA8 + ldmia sp!, {r4, r5, r6, pc} +_021F9D98: + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov00_021F9EA8 + ldmia sp!, {r4, r5, r6, pc} +_021F9DAC: + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov00_021F9F70 + ldmia sp!, {r4, r5, r6, pc} +_021F9DC0: + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov00_021FA054 + ldmia sp!, {r4, r5, r6, pc} +_021F9DD4: + mov r0, #0x30 + mul ip, r4, r0 + ldr r0, _021F9E20 ; =ov00_0221B0A0 + mov r3, #1 + ldr r1, [r0] + mov r2, #0 + add r1, r1, ip + strb r3, [r1, #0x1d] + ldr r1, [r0] + add r1, r1, ip + str r2, [r1, #0x10] + ldr r0, [r0] + add r0, r0, ip + str r2, [r0, #0x18] + ldmia sp!, {r4, r5, r6, pc} +_021F9E10: + ldr r1, _021F9E24 ; =0xFFFE82B6 + mov r0, #6 + bl ov00_021EC24C + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F9E20: .word ov00_0221B0A0 +_021F9E24: .word 0xFFFE82B6 + arm_func_end ov00_021F9D34 + + arm_func_start ov00_021F9E28 +ov00_021F9E28: ; 0x021F9E28 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + bl ov00_021EE6B0 + ldr r2, _021F9EA4 ; =ov00_0221B0A0 + mov r1, #0x30 + ldr r2, [r2] + mla r4, r0, r1, r2 + ldr r1, [r4, #4] + cmp r1, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, [r4, #8] + cmp r1, r5 + ldmltia sp!, {r4, r5, r6, pc} + ldr r3, [r2, #0x604] + cmp r3, #0 + beq _021F9E78 + mov r1, r6 + mov r2, r5 + blx r3 +_021F9E78: + ldr r0, _021F9EA4 ; =ov00_0221B0A0 + ldr r0, [r0] + ldr r0, [r0, #0x608] + cmp r0, #0 + ldrne r0, [r4, #0x2c] + cmpne r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl OS_GetTick + str r0, [r4, #0x24] + str r1, [r4, #0x28] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021F9EA4: .word ov00_0221B0A0 + arm_func_end ov00_021F9E28 + + arm_func_start ov00_021F9EA8 +ov00_021F9EA8: ; 0x021F9EA8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r4, _021F9F6C ; =ov00_0221B0A0 + mov r3, #0x30 + ldr r4, [r4] + mov r7, r1 + mla r4, r0, r3, r4 + mov r6, r2 + bl ov00_021F9CF0 + strb r0, [r4, #0x1e] + mov r0, r7 + bl ov00_021F992C + mov r5, r0 + cmp r5, #4 + addls pc, pc, r5, lsl #2 + b _021F9F60 +_021F9EE8: ; jump table + b _021F9F60 ; case 0 + b _021F9EFC ; case 1 + b _021F9F58 ; case 2 + b _021F9F58 ; case 3 + b _021F9F58 ; case 4 +_021F9EFC: + cmp r6, #8 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r1, sp, #0 + mov r0, r7 + mov r2, #8 + bl MI_CpuCopy8 + ldr r1, [sp] + mov r0, #0 + str r1, [r4, #0x18] + str r0, [r4, #0x10] + ldr r0, [r4, #4] + cmp r0, #0 + beq _021F9F4C + ldr r1, [r4, #8] + ldr r0, [r4, #0x18] + cmp r1, r0 + movge r0, #2 + strgeb r0, [r4, #0x1d] + bge _021F9F60 +_021F9F4C: + mov r0, #4 + strb r0, [r4, #0x1d] + b _021F9F60 +_021F9F58: + mov r0, #3 + strb r0, [r4, #0x1d] +_021F9F60: + strh r5, [r4, #0x22] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021F9F6C: .word ov00_0221B0A0 + arm_func_end ov00_021F9EA8 + + arm_func_start ov00_021F9F70 +ov00_021F9F70: ; 0x021F9F70 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _021FA04C ; =ov00_0221B0A0 + mov r7, r0 + ldr r4, [r3] + mov r3, #0x30 + mla r4, r7, r3, r4 + mov r6, r1 + mov r5, r2 + bl ov00_021F9CF0 + cmp r0, #2 + bne _021F9FD4 + ldr r3, [r4, #0x10] + ldr r0, [r4, #8] + add r1, r3, r5 + cmp r1, r0 + ble _021F9FC0 + ldr r1, _021FA050 ; =0xFFFE82AC + mov r0, #6 + bl ov00_021EC24C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021F9FC0: + ldr r1, [r4, #4] + mov r0, r6 + mov r2, r5 + add r1, r1, r3 + bl MI_CpuCopy8 +_021F9FD4: + ldr r0, [r4, #0x10] + add r0, r0, r5 + str r0, [r4, #0x10] + ldr r2, [r4, #0x18] + cmp r0, r2 + bne _021FA020 + mov r0, #1 + strb r0, [r4, #0x1d] + mov r1, #0 + str r1, [r4, #0x10] + ldr r0, _021FA04C ; =ov00_0221B0A0 + str r1, [r4, #0x18] + ldr r0, [r0] + ldr r3, [r0, #0x604] + cmp r3, #0 + beq _021FA020 + ldr r1, [r4, #4] + mov r0, r7 + blx r3 +_021FA020: + ldr r0, _021FA04C ; =ov00_0221B0A0 + ldr r0, [r0] + ldr r0, [r0, #0x608] + cmp r0, #0 + ldrne r0, [r4, #0x2c] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl OS_GetTick + str r0, [r4, #0x24] + str r1, [r4, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FA04C: .word ov00_0221B0A0 +_021FA050: .word 0xFFFE82AC + arm_func_end ov00_021F9F70 + + arm_func_start ov00_021FA054 +ov00_021FA054: ; 0x021FA054 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021F9CBC + ldrb r1, [r0, #0x1e] + strb r1, [r0, #0x1d] + ldrh r1, [r0, #0x22] + cmp r1, #2 + cmpne r1, #3 + cmpne r1, #4 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r2, r4 + bl ov00_021F2FDC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FA054 + + arm_func_start ov00_021FA090 +ov00_021FA090: ; 0x021FA090 + stmdb sp!, {r3, lr} + bl ov00_021EE64C + bl ov00_0220D284 + ldr r1, _021FA0B0 ; =0xFFFFFDF9 + add r0, r0, r1 + cmp r0, #0 + movle r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FA0B0: .word 0xFFFFFDF9 + arm_func_end ov00_021FA090 + + arm_func_start ov00_021FA0B4 +ov00_021FA0B4: ; 0x021FA0B4 + stmdb sp!, {r3, lr} + bl ov38_0221D7B4 + ldr r1, _021FA0D4 ; =ov00_0221B0A4 + mov r0, #1 + ldr r2, [r1, #4] + add r2, r2, #1 + str r2, [r1, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FA0D4: .word ov00_0221B0A4 + arm_func_end ov00_021FA0B4 + + arm_func_start ov00_021FA0D8 +ov00_021FA0D8: ; 0x021FA0D8 + stmdb sp!, {r3, lr} + ldr r0, _021FA114 ; =ov00_0221B0A4 + ldr r0, [r0, #4] + cmp r0, #0 + movle r0, #1 + ldmleia sp!, {r3, pc} + bl ov38_0221D808 + ldr r0, _021FA114 ; =ov00_0221B0A4 + ldr r1, [r0, #4] + subs r1, r1, #1 + str r1, [r0, #4] + bne _021FA10C + bl ov00_021FA6EC +_021FA10C: + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FA114: .word ov00_0221B0A4 + arm_func_end ov00_021FA0D8 + + arm_func_start ov00_021FA118 +ov00_021FA118: ; 0x021FA118 + stmdb sp!, {r3, lr} + bl ov00_021EC230 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + bl ov38_0221DAEC + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FA118 + + arm_func_start ov00_021FA138 +ov00_021FA138: ; 0x021FA138 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, [sp, #0x18] + mov r7, r1 + ldr r5, [r4, #4] + ldr r6, [r4, #0xc] + cmp r5, #0 + beq _021FA190 + cmp r7, #0 + bne _021FA174 + mov r1, r3 + mov r0, r2 + ldr r3, [r4] + mov r2, r7 + blx r5 + b _021FA190 +_021FA174: + mov r0, r7 + bl ov00_021FA4B0 + mov r0, #0 + ldr r3, [r4] + mov r1, r0 + mov r2, r7 + blx r5 +_021FA190: + cmp r7, #0 + bne _021FA1A0 + cmp r6, #1 + bne _021FA1BC +_021FA1A0: + ldr r1, [r4, #0x10] + cmp r1, #0 + moveq r6, #1 + beq _021FA1BC + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC +_021FA1BC: + mov r0, r4 + bl ov00_021FA668 + cmp r6, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021FA138 + + arm_func_start ov00_021FA1D4 +ov00_021FA1D4: ; 0x021FA1D4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [sp, #0x18] + ldr lr, [r4, #8] + cmp lr, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, pc} + ldr ip, [sp, #0x14] + mov r0, r1 + str ip, [sp] + mov r1, r2 + mov r2, r3 + ldr ip, [r4] + ldr r3, [sp, #0x10] + str ip, [sp, #4] + blx lr + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FA1D4 + + arm_func_start ov00_021FA21C +ov00_021FA21C: ; 0x021FA21C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r4, r0 + mov r7, r1 + mov r6, r2 + bl ov00_021EC230 + cmp r0, #0 + addne sp, sp, #0x10 + mvnne r0, #7 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r2, #0 + mov r1, #1 + add r0, sp, #0 + str r6, [sp] + str r7, [sp, #4] + str r2, [sp, #8] + str r1, [sp, #0xc] + bl ov00_021FA60C + movs r5, r0 + bne _021FA294 + mvn r0, #4 + bl ov00_021FA4B0 + mov r0, #0 + mov r1, r0 + mov r3, r6 + sub r2, r0, #5 + blx r7 + add sp, sp, #0x10 + mvn r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FA294: + ldr r2, _021FA2E0 ; =ov00_021FA138 + mov r0, r4 + mov r3, r5 + mov r1, #0 + bl ov38_0221D864 + movs r4, r0 + bpl _021FA2D0 + bl ov00_021FA4B0 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r6 + blx r7 + mov r0, r5 + bl ov00_021FA668 +_021FA2D0: + mov r0, r4 + str r4, [r5, #0x14] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FA2E0: .word ov00_021FA138 + arm_func_end ov00_021FA21C + + arm_func_start ov00_021FA2E4 +ov00_021FA2E4: ; 0x021FA2E4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x28 + ldr sb, [sp, #0x4c] + ldr r8, [sp, #0x50] + mov r5, r0 + mov r4, r1 + mov r7, r2 + mov sl, r3 + mov r6, #0 + bl ov00_021EC230 + cmp r0, #0 + addne sp, sp, #0x28 + mvnne r0, #7 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, [sp, #0x48] + add r0, sp, #0x18 + str r8, [sp, #0x18] + str sb, [sp, #0x1c] + str r1, [sp, #0x20] + str r7, [sp, #0x24] + bl ov00_021FA60C + movs r7, r0 + bne _021FA368 + mvn r0, #4 + bl ov00_021FA4B0 + mov r0, r6 + mov r1, r0 + mov r3, r8 + sub r2, r0, #5 + blx sb + add sp, sp, #0x28 + mvn r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FA368: + cmp r4, #0 + ble _021FA3B8 + mov r1, r4 + mov r0, #4 + bl ov00_021EC2A8 + movs r6, r0 + bne _021FA3B4 + mvn r0, #4 + bl ov00_021FA4B0 + mov r0, #0 + mov r1, r0 + mov r3, r8 + sub r2, r0, #5 + blx sb + mov r0, r7 + bl ov00_021FA668 + add sp, sp, #0x28 + mvn r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FA3B4: + str r6, [r7, #0x10] +_021FA3B8: + cmp sl, #0 + mov r1, #0 + beq _021FA3F8 + ldr r0, [sl] + ldr r2, _021FA480 ; =ov00_021FA1D4 + stmia sp, {r0, r1} + str r1, [sp, #8] + str r2, [sp, #0xc] + ldr r0, _021FA484 ; =ov00_021FA138 + mov r2, r6 + str r0, [sp, #0x10] + mov r0, r5 + mov r3, r4 + str r7, [sp, #0x14] + bl ghttpGetExA + b _021FA428 +_021FA3F8: + str r1, [sp] + str r1, [sp, #4] + ldr r2, _021FA480 ; =ov00_021FA1D4 + str r1, [sp, #8] + str r2, [sp, #0xc] + ldr r0, _021FA484 ; =ov00_021FA138 + mov r2, r6 + str r0, [sp, #0x10] + mov r0, r5 + mov r3, r4 + str r7, [sp, #0x14] + bl ghttpGetExA +_021FA428: + mov r4, r0 + cmp r4, #0 + bge _021FA470 + mov r0, r4 + bl ov00_021FA4B0 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r8 + blx sb + ldr r1, [r7, #0x10] + cmp r1, #0 + beq _021FA468 + mov r0, #4 + mov r2, #0 + bl ov00_021EC2EC +_021FA468: + mov r0, r7 + bl ov00_021FA668 +_021FA470: + mov r0, r4 + str r4, [r7, #0x14] + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021FA480: .word ov00_021FA1D4 +_021FA484: .word ov00_021FA138 + arm_func_end ov00_021FA2E4 + + arm_func_start ov00_021FA488 +ov00_021FA488: ; 0x021FA488 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr lr, [sp, #0x10] + ldr ip, [sp, #0x14] + stmia sp, {r3, lr} + mov r3, #0 + str ip, [sp, #8] + bl ov00_021FA2E4 + add sp, sp, #0xc + ldmia sp!, {pc} + arm_func_end ov00_021FA488 + + arm_func_start ov00_021FA4B0 +ov00_021FA4B0: ; 0x021FA4B0 + stmdb sp!, {r4, lr} + movs r4, r0 + mov r0, #7 + ldr r1, _021FA5F0 ; =0xFFFE8130 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r2, r4, #7 + cmp r2, #0x1a + addls pc, pc, r2, lsl #2 + b _021FA5E4 +_021FA4D8: ; jump table + b _021FA544 ; case 0 + b _021FA54C ; case 1 + b _021FA558 ; case 2 + b _021FA560 ; case 3 + b _021FA560 ; case 4 + b _021FA560 ; case 5 + b _021FA568 ; case 6 + b _021FA5E4 ; case 7 + b _021FA574 ; case 8 + b _021FA580 ; case 9 + b _021FA588 ; case 10 + b _021FA594 ; case 11 + b _021FA59C ; case 12 + b _021FA5A4 ; case 13 + b _021FA5AC ; case 14 + b _021FA5B4 ; case 15 + b _021FA5B4 ; case 16 + b _021FA5B4 ; case 17 + b _021FA5A4 ; case 18 + b _021FA5A4 ; case 19 + b _021FA5C0 ; case 20 + b _021FA5C0 ; case 21 + b _021FA5C8 ; case 22 + b _021FA5D4 ; case 23 + b _021FA5DC ; case 24 + b _021FA5E4 ; case 25 + b _021FA574 ; case 26 +_021FA544: + sub r1, r1, #0x320 + b _021FA5E4 +_021FA54C: + ldr r2, _021FA5F4 ; =0xFFFFFCD6 + add r1, r1, r2 + b _021FA5E4 +_021FA558: + sub r1, r1, #0x348 + b _021FA5E4 +_021FA560: + sub r1, r1, #0x334 + b _021FA5E4 +_021FA568: + ldr r2, _021FA5F8 ; =0xFFFFFCC2 + add r1, r1, r2 + b _021FA5E4 +_021FA574: + sub r1, r1, #1 + mov r0, #9 + b _021FA5E4 +_021FA580: + sub r1, r1, #0x348 + b _021FA5E4 +_021FA588: + ldr r2, _021FA5FC ; =0xFFFFFCAE + add r1, r1, r2 + b _021FA5E4 +_021FA594: + sub r1, r1, #0x1e + b _021FA5E4 +_021FA59C: + sub r1, r1, #0x32 + b _021FA5E4 +_021FA5A4: + sub r1, r1, #0x14 + b _021FA5E4 +_021FA5AC: + sub r1, r1, #0x35c + b _021FA5E4 +_021FA5B4: + ldr r2, _021FA600 ; =0xFFFFFC9A + add r1, r1, r2 + b _021FA5E4 +_021FA5C0: + sub r1, r1, #0x370 + b _021FA5E4 +_021FA5C8: + ldr r2, _021FA604 ; =0xFFFFFC86 + add r1, r1, r2 + b _021FA5E4 +_021FA5D4: + sub r1, r1, #0x384 + b _021FA5E4 +_021FA5DC: + ldr r2, _021FA608 ; =0xFFFFFC72 + add r1, r1, r2 +_021FA5E4: + bl ov00_021EC24C + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FA5F0: .word 0xFFFE8130 +_021FA5F4: .word 0xFFFFFCD6 +_021FA5F8: .word 0xFFFFFCC2 +_021FA5FC: .word 0xFFFFFCAE +_021FA600: .word 0xFFFFFC9A +_021FA604: .word 0xFFFFFC86 +_021FA608: .word 0xFFFFFC72 + arm_func_end ov00_021FA4B0 + + arm_func_start ov00_021FA60C +ov00_021FA60C: ; 0x021FA60C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #4 + mov r1, #0x1c + bl ov00_021EC2A8 + movs ip, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldmia r4, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + mov r0, #0 + str r0, [ip, #0x18] + ldr r1, _021FA664 ; =ov00_0221B0A4 + str r0, [ip, #0x10] + ldr r0, [r1] + cmp r0, #0 + moveq r0, ip + streq ip, [r1] + strne r0, [ip, #0x18] + movne r0, ip + strne ip, [r1] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FA664: .word ov00_0221B0A4 + arm_func_end ov00_021FA60C + + arm_func_start ov00_021FA668 +ov00_021FA668: ; 0x021FA668 + stmdb sp!, {r4, lr} + ldr r1, _021FA6E8 ; =ov00_0221B0A4 + ldr r1, [r1] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + cmp r1, r0 + bne _021FA6A0 + mov r0, #4 + mov r2, #0 + ldr r4, [r1, #0x18] + bl ov00_021EC2EC + ldr r0, _021FA6E8 ; =ov00_0221B0A4 + str r4, [r0] + ldmia sp!, {r4, pc} +_021FA6A0: + ldr r2, [r1, #0x18] + cmp r2, #0 + ldmeqia sp!, {r4, pc} +_021FA6AC: + cmp r2, r0 + movne r1, r2 + bne _021FA6D8 + ldr ip, [r1, #0x18] + mov r0, #4 + ldr r3, [ip, #0x18] + mov r2, #0 + str r3, [r1, #0x18] + mov r1, ip + bl ov00_021EC2EC + ldmia sp!, {r4, pc} +_021FA6D8: + ldr r2, [r2, #0x18] + cmp r2, #0 + bne _021FA6AC + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FA6E8: .word ov00_0221B0A4 + arm_func_end ov00_021FA668 + + arm_func_start ov00_021FA6EC +ov00_021FA6EC: ; 0x021FA6EC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r0, _021FA758 ; =ov00_0221B0A4 + ldr r8, [r0] + cmp r8, #0 + beq _021FA748 + mov r7, #4 + mov r6, #0 + mov r5, r7 + mov r4, r6 +_021FA710: + mov sb, r8 + ldr r1, [sb, #0x10] + ldr r8, [r8, #0x18] + cmp r1, #0 + beq _021FA730 + mov r0, r7 + mov r2, r6 + bl ov00_021EC2EC +_021FA730: + mov r0, r5 + mov r1, sb + mov r2, r4 + bl ov00_021EC2EC + cmp r8, #0 + bne _021FA710 +_021FA748: + ldr r0, _021FA758 ; =ov00_0221B0A4 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_021FA758: .word ov00_0221B0A4 + arm_func_end ov00_021FA6EC + + arm_func_start ov00_021FA75C +ov00_021FA75C: ; 0x021FA75C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, [r4] + mov r0, #1 + mov r1, #0x24 + blx r2 + mov r1, r0 + ldr r3, _021FA8FC ; =ov00_0221B0AC + mov r0, #0 + mov r2, #0x24 + str r1, [r3, #0xc] + bl MIi_CpuClear32 + ldr r0, _021FA8FC ; =ov00_0221B0AC + ldr r1, [r4] + ldr r3, [r0, #0xc] + mov r2, #1 + str r1, [r3] + ldr r0, [r4, #4] + ldr r1, _021FA900 ; =0x00000D18 + str r0, [r3, #4] + strb r2, [r3, #9] + strb r2, [r3, #0x16] + mov r0, #0x10 + strb r2, [r3, #8] + bl ov00_021FAC4C + ldr r2, _021FA8FC ; =ov00_0221B0AC + mov r1, #0x2300 + str r0, [r2, #0x10] + mov r0, #2 + bl ov00_021FAC4C + ldr r2, _021FA8FC ; =ov00_0221B0AC + mov r1, #0x58 + str r0, [r2] + mov r0, #4 + bl ov00_021FAC4C + ldr r2, _021FA8FC ; =ov00_0221B0AC + mov r1, #0xc + str r0, [r2, #4] + mov r0, #8 + bl ov00_021FAC4C + ldr r1, _021FA8FC ; =ov00_0221B0AC + ldr r2, _021FA900 ; =0x00000D18 + str r0, [r1, #8] + ldr r1, [r1, #0x10] + mov r0, #0 + bl MIi_CpuClear32 + mov r0, #0 + ldr r1, _021FA8FC ; =ov00_0221B0AC + mov r2, #0x2300 + ldr r1, [r1] + bl MIi_CpuClear32 + mov r0, #0 + ldr r1, _021FA8FC ; =ov00_0221B0AC + mov r2, #0x58 + ldr r1, [r1, #4] + bl MIi_CpuClear32 + mov r0, #0 + ldr r1, _021FA8FC ; =ov00_0221B0AC + mov r2, #0xc + ldr r1, [r1, #8] + bl MIi_CpuClear32 + ldr r1, _021FA8FC ; =ov00_0221B0AC + ldrb r2, [r4, #8] + ldr r0, [r1, #0x10] + strb r2, [r0, #0xd0a] + ldrb r3, [r0, #0xd0b] + ldrb r2, [r4, #9] + bic r3, r3, #3 + and r2, r2, #3 + orr r2, r3, r2 + strb r2, [r0, #0xd0b] + ldr r3, [r1, #8] + ldr r2, [r4] + mov r1, #0 + str r2, [r3] + ldr r2, [r4, #4] + str r2, [r3, #4] + str r1, [r3, #8] + ldrb r2, [r0, #0xd0c] + ldrb r1, [r4, #0xa] + bic r2, r2, #0xf + and r1, r1, #0xf + orr r2, r2, r1 + strb r2, [r0, #0xd0c] + ldrb r1, [r4, #0xb] + and r2, r2, #0xff + bic r2, r2, #0x30 + mov r1, r1, lsl #0x1e + orr r1, r2, r1, lsr #26 + strb r1, [r0, #0xd0c] + bl DWCi_BM_GetApInfo + ldr r0, _021FA8FC ; =ov00_0221B0AC + mov r1, #0x2300 + ldr r0, [r0] + bl WCM_Init + cmp r0, #1 + beq _021FA8E8 + cmp r0, #4 + ble _021FA8F4 +_021FA8E8: + bl ov00_021FACF0 + mov r0, #0 + ldmia sp!, {r4, pc} +_021FA8F4: + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FA8FC: .word ov00_0221B0AC +_021FA900: .word 0x00000D18 + arm_func_end ov00_021FA75C + + arm_func_start ov00_021FA904 +ov00_021FA904: ; 0x021FA904 + stmdb sp!, {r3, r4, r5, lr} + bl ov00_021FAECC + mov r5, r0 + cmp r5, #1 + bne _021FA924 + bl ov00_021FCBD8 + mov r5, r0 + b _021FA998 +_021FA924: + cmp r5, #7 + bhs _021FA94C + bl OS_DisableInterrupts + mov r4, r0 + bl ov00_021FC408 + mov r5, r0 + bl ov00_021FAE6C + mov r0, r4 + bl OS_RestoreInterrupts + b _021FA998 +_021FA94C: + cmp r5, #9 + bhs _021FA960 + bl ov00_021FB6B8 + mov r5, r0 + b _021FA998 +_021FA960: + cmp r5, #0xa + bhs _021FA974 + bl ov00_021FC32C + mov r5, r0 + b _021FA998 +_021FA974: + cmp r5, #0x10 + bhs _021FA988 + bl ov00_021FCC60 + mov r5, r0 + b _021FA998 +_021FA988: + cmp r5, #0x11 + bne _021FA998 + bl ov00_021FBD38 + mov r5, r0 +_021FA998: + mov r0, r5 + bl ov00_021FAE6C + cmp r5, #0x10 + bne _021FA9BC + bl ov00_021FB010 + mov r4, r0 + bl ov00_021FAFD8 + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} +_021FA9BC: + cmp r5, #0x12 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov00_021FAFD8 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FA904 + + arm_func_start ov00_021FA9D4 +ov00_021FA9D4: ; 0x021FA9D4 + stmdb sp!, {r3, lr} + bl ov00_021FAECC + cmp r0, #1 + movls r0, #0 + ldmlsia sp!, {r3, pc} + cmp r0, #7 + movlo r0, #1 + ldmloia sp!, {r3, pc} + cmp r0, #9 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + cmp r0, #0xa + movlo r0, #2 + ldmloia sp!, {r3, pc} + cmp r0, #0xb + moveq r0, #4 + ldmeqia sp!, {r3, pc} + cmp r0, #0x10 + movlo r0, #3 + ldmloia sp!, {r3, pc} + moveq r0, #5 + ldmeqia sp!, {r3, pc} + cmp r0, #0x11 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + bl ov00_021FBD5C + ldmia sp!, {r3, pc} + arm_func_end ov00_021FA9D4 + + arm_func_start ov00_021FAA40 +ov00_021FAA40: ; 0x021FAA40 + stmdb sp!, {r4, lr} + mov r4, #0xff + bl ov00_021FAECC + cmp r0, #0xa + blo _021FAA64 + cmp r0, #0x10 + ldrls r0, _021FAA6C ; =ov00_0221B0AC + ldrls r0, [r0, #0xc] + ldrlsb r4, [r0, #0x17] +_021FAA64: + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FAA6C: .word ov00_0221B0AC + arm_func_end ov00_021FAA40 + + arm_func_start ov00_021FAA70 +ov00_021FAA70: ; 0x021FAA70 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, #0 + bl ov00_021FAECC + cmp r0, #0xa + blo _021FAABC + cmp r0, #0x10 + bhi _021FAABC + ldr r0, _021FAAC4 ; =ov00_0221B0AC + ldr r2, [r0, #0xc] + ldrb r0, [r2, #0x17] + cmp r0, #4 + cmpne r0, #8 + bne _021FAABC + mov r1, r5 + add r0, r2, #0x18 + mov r2, #0xa + bl MI_CpuCopy8 + mov r4, #1 +_021FAABC: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FAAC4: .word ov00_0221B0AC + arm_func_end ov00_021FAA70 + + arm_func_start ov00_021FAAC8 +ov00_021FAAC8: ; 0x021FAAC8 + stmdb sp!, {r3, lr} + bl ov00_021FAECC + strb r0, [sp] + ands r0, r0, #0xff + cmpne r0, #0x12 + bne _021FAAEC + bl ov00_021FACF0 + mov r0, #1 + ldmia sp!, {r3, pc} +_021FAAEC: + add r0, sp, #0 + bl ov00_021FBBF0 + ldrb r0, [sp] + bl ov00_021FAE6C + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FAAC8 + + arm_func_start ov00_021FAB04 +ov00_021FAB04: ; 0x021FAB04 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r5, r3 + mov r0, #1 + mov r7, r1 + mov r6, r2 + bl ov00_021FAE14 + mov r4, r0 + cmp r5, #0 + mov r2, #0xa + beq _021FAB40 + mov r0, r5 + add r1, r4, #0x18 + bl MI_CpuCopy8 + b _021FAB4C +_021FAB40: + add r0, r4, #0x18 + mov r1, #0 + bl MI_CpuFill8 +_021FAB4C: + ldr r3, [sp, #0x18] + mov r0, r8 + mov r1, r7 + mov r2, r6 + strb r3, [r4, #0x22] + bl ov00_021FAB68 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov00_021FAB04 + + arm_func_start ov00_021FAB68 +ov00_021FAB68: ; 0x021FAB68 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0x10 + mov r6, r1 + mov r5, r2 + bl ov00_021FAE14 + mov r4, r0 + ldrb r3, [r4, #0xd0c] + mov r1, #0 + mov r2, #0xf0 + bic r3, r3, #0xf + orr r3, r3, #1 + strb r3, [r4, #0xd0c] + bl MI_CpuFill8 + mov r2, #0 +_021FABA4: + ldrb r1, [r7, r2] + cmp r1, #0 + beq _021FABC4 + add r0, r4, r2 + add r2, r2, #1 + strb r1, [r0, #0x40] + cmp r2, #0x20 + blt _021FABA4 +_021FABC4: + cmp r6, #0 + cmpne r5, #0 + bne _021FABE0 + ldrb r0, [r4, #0xe6] + bic r0, r0, #3 + strb r0, [r4, #0xe6] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FABE0: + cmp r5, #1 + moveq r2, #5 + beq _021FABF8 + cmp r5, #2 + moveq r2, #0xd + movne r2, #0x10 +_021FABF8: + mov r0, r6 + add r1, r4, #0x80 + bl MI_CpuCopy8 + ldrb r1, [r4, #0xe6] + and r0, r5, #0xff + and r0, r0, #3 + bic r1, r1, #3 + orr r0, r1, r0 + strb r0, [r4, #0xe6] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021FAB68 + + arm_func_start ov00_021FAC20 +ov00_021FAC20: ; 0x021FAC20 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0x10 + mov r4, r1 + bl ov00_021FAE14 + mov r1, r0 + mov r0, r4 + add r1, r1, r5, lsl #8 + mov r2, #0xf0 + bl MIi_CpuCopy32 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FAC20 + + arm_func_start ov00_021FAC4C +ov00_021FAC4C: ; 0x021FAC4C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #1 + mov r4, r1 + bl ov00_021FAE14 + ldrb r1, [r0, #8] + tst r1, r5 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + orr r1, r1, r5 + strb r1, [r0, #8] + ldr r2, [r0] + mov r0, r5 + mov r1, r4 + blx r2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FAC4C + + arm_func_start ov00_021FAC8C +ov00_021FAC8C: ; 0x021FAC8C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + mov r5, r1 + mov r4, r2 + bl ov00_021FAE14 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldrb r2, [r0, #8] + tst r2, r6 + ldmeqia sp!, {r4, r5, r6, pc} + mvn r1, r6 + and r1, r2, r1 + strb r1, [r0, #8] + ldr r3, [r0, #4] + mov r0, r6 + mov r1, r5 + mov r2, r4 + blx r3 + cmp r6, #1 + ldreq r0, _021FACEC ; =ov00_0221B0AC + moveq r1, #0 + streq r1, [r0, #0xc] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FACEC: .word ov00_0221B0AC + arm_func_end ov00_021FAC8C + + arm_func_start ov00_021FACF0 +ov00_021FACF0: ; 0x021FACF0 + stmdb sp!, {r4, lr} + mov r0, #1 + bl ov00_021FAE14 + movs r4, r0 + ldmeqia sp!, {r4, pc} + ldrb r0, [r4, #8] + tst r0, #0x10 + beq _021FAD38 + mov r0, #0x10 + bl ov00_021FAE14 + ldrb r3, [r4, #8] + mov r1, r0 + ldr r2, _021FAE0C ; =0x00000D18 + bic r0, r3, #0x10 + strb r0, [r4, #8] + ldr r3, [r4, #4] + mov r0, #0x10 + blx r3 +_021FAD38: + ldrb r0, [r4, #8] + tst r0, #8 + beq _021FAD6C + mov r0, #8 + bl ov00_021FAE14 + ldrb r2, [r4, #8] + mov r1, r0 + mov r0, #8 + bic r2, r2, #8 + strb r2, [r4, #8] + ldr r3, [r4, #4] + mov r2, #0xc + blx r3 +_021FAD6C: + ldrb r0, [r4, #8] + tst r0, #4 + beq _021FADA0 + mov r0, #4 + bl ov00_021FAE14 + ldrb r2, [r4, #8] + mov r1, r0 + mov r0, #4 + bic r2, r2, #4 + strb r2, [r4, #8] + ldr r3, [r4, #4] + mov r2, #0x58 + blx r3 +_021FADA0: + ldrb r0, [r4, #8] + tst r0, #2 + beq _021FADD4 + mov r0, #2 + bl ov00_021FAE14 + ldrb r2, [r4, #8] + mov r1, r0 + mov r0, #2 + bic r2, r2, #2 + strb r2, [r4, #8] + ldr r3, [r4, #4] + mov r2, #0x2300 + blx r3 +_021FADD4: + ldrb r0, [r4, #8] + tst r0, #1 + ldmeqia sp!, {r4, pc} + bic r0, r0, #1 + strb r0, [r4, #8] + ldr r3, [r4, #4] + mov r1, r4 + mov r0, #1 + mov r2, #0x24 + blx r3 + ldr r0, _021FAE10 ; =ov00_0221B0AC + mov r1, #0 + str r1, [r0, #0xc] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FAE0C: .word 0x00000D18 +_021FAE10: .word ov00_0221B0AC + arm_func_end ov00_021FACF0 + + arm_func_start ov00_021FAE14 +ov00_021FAE14: ; 0x021FAE14 + tst r0, #1 + ldrne r0, _021FAE68 ; =ov00_0221B0AC + ldrne r0, [r0, #0xc] + bxne lr + tst r0, #2 + ldrne r0, _021FAE68 ; =ov00_0221B0AC + ldrne r0, [r0] + bxne lr + tst r0, #4 + ldrne r0, _021FAE68 ; =ov00_0221B0AC + ldrne r0, [r0, #4] + bxne lr + tst r0, #8 + ldrne r0, _021FAE68 ; =ov00_0221B0AC + ldrne r0, [r0, #8] + bxne lr + tst r0, #0x10 + ldrne r0, _021FAE68 ; =ov00_0221B0AC + ldrne r0, [r0, #0x10] + moveq r0, #0 + bx lr + .balign 4, 0 +_021FAE68: .word ov00_0221B0AC + arm_func_end ov00_021FAE14 + + arm_func_start ov00_021FAE6C +ov00_021FAE6C: ; 0x021FAE6C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + bl ov00_021FAE14 + mov r5, r0 + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + strb r6, [r5, #9] + cmp r6, #0x10 + ldmhsia sp!, {r4, r5, r6, pc} + ldrb r0, [r5, #0x16] + cmp r6, r0 + strhib r6, [r5, #0x16] + cmphi r6, #7 + ldmlsia sp!, {r4, r5, r6, pc} + ldrb r0, [r4, #0xd0d] + bl ov00_021FAFC8 + strb r0, [r5, #0x15] + ldrb r0, [r4, #0xd13] + add r0, r4, r0, lsl #2 + ldrb r0, [r0, #0x444] + strb r0, [r5, #0x14] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021FAE6C + + arm_func_start ov00_021FAECC +ov00_021FAECC: ; 0x021FAECC + ldr r0, _021FAEE4 ; =ov00_0221B0AC + ldr r0, [r0, #0xc] + cmp r0, #0 + ldrneb r0, [r0, #9] + moveq r0, #0 + bx lr + .balign 4, 0 +_021FAEE4: .word ov00_0221B0AC + arm_func_end ov00_021FAECC + + arm_func_start ov00_021FAEE8 +ov00_021FAEE8: ; 0x021FAEE8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #1 + bl ov00_021FAE14 + mov r4, r0 + str r5, [r4, #0xc] + bl ov00_021FAECC + strb r0, [r4, #0xa] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FAEE8 + + arm_func_start ov00_021FAF0C +ov00_021FAF0C: ; 0x021FAF0C + ldr r0, _021FAF1C ; =ov00_0221B0AC + ldr r0, [r0, #0xc] + ldr r0, [r0, #0xc] + bx lr + .balign 4, 0 +_021FAF1C: .word ov00_0221B0AC + arm_func_end ov00_021FAF0C + + arm_func_start ov00_021FAF20 +ov00_021FAF20: ; 0x021FAF20 + stmdb sp!, {r4, lr} + ldr r1, _021FAFC4 ; =ov00_0221B0AC + ldr r1, [r1, #0xc] + ldrb r2, [r1, #0x22] + cmp r2, #0 + bne _021FAF40 + bl ov00_021FAFC8 + mov r2, r0 +_021FAF40: + ldr r1, _021FAFC4 ; =ov00_0221B0AC + mov r0, #0 + ldr r1, [r1, #0xc] + strb r2, [r1, #0x17] + bl WCM_GetApEssid + movs r4, r0 + beq _021FAF78 + mov r1, #0x20 + bl DC_InvalidateRange + ldr r1, _021FAFC4 ; =ov00_0221B0AC + mov r0, r4 + ldr r1, [r1, #0xc] + add r1, r1, #0x18 + bl ov00_021FD17C +_021FAF78: + ldr r0, _021FAFC4 ; =ov00_0221B0AC + mov r1, #0 + ldr r3, [r0, #0xc] + mov r2, r3 +_021FAF88: + ldrsb r0, [r2, #0x18] + cmp r0, #0x20 + blt _021FAF9C + cmp r0, #0x7e + ble _021FAFB0 +_021FAF9C: + add r0, r3, #0x18 + mov r1, #0 + mov r2, #0xa + bl MI_CpuFill8 + ldmia sp!, {r4, pc} +_021FAFB0: + add r1, r1, #1 + cmp r1, #0xa + add r2, r2, #1 + blt _021FAF88 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FAFC4: .word ov00_0221B0AC + arm_func_end ov00_021FAF20 + + arm_func_start ov00_021FAFC8 +ov00_021FAFC8: ; 0x021FAFC8 + cmp r0, #2 + subhi r0, r0, #3 + andhi r0, r0, #0xff + bx lr + arm_func_end ov00_021FAFC8 + + arm_func_start ov00_021FAFD8 +ov00_021FAFD8: ; 0x021FAFD8 + stmdb sp!, {r3, lr} + ldr r1, _021FB008 ; =ov00_0221B0AC + mov r0, #8 + ldr r1, [r1, #8] + mov r2, #0xc + bl ov00_021FAC8C + ldr r0, _021FB008 ; =ov00_0221B0AC + ldr r2, _021FB00C ; =0x00000D18 + ldr r1, [r0, #0x10] + mov r0, #0x10 + bl ov00_021FAC8C + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FB008: .word ov00_0221B0AC +_021FB00C: .word 0x00000D18 + arm_func_end ov00_021FAFD8 + + arm_func_start ov00_021FB010 +ov00_021FB010: ; 0x021FB010 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _021FB0AC ; =ov00_0221B0AC + mov r1, #0xc0 + ldr r8, [r0, #0x10] + ldrb r7, [r8, #0xd13] + ldrb r2, [r8, #0xd0d] + add r0, r8, #0x74 + smulbb r4, r7, r1 + add r5, r0, #0x400 + cmp r2, #6 + movhs r0, #1 + ldmhsia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldrb sb, [r8, #0xd12] + mov r6, #0 + cmp sb, #0 + bls _021FB0A4 + mov sl, r1 +_021FB054: + cmp r6, r7 + beq _021FB094 + add r0, r8, r6, lsl #2 + ldrb r0, [r0, #0x445] + cmp r0, #6 + bhs _021FB094 + mul r1, r6, sl + add r0, r8, r1 + add r0, r0, #0x400 + ldrh r2, [r0, #0x7a] + add r0, r5, r4 + add r1, r5, r1 + bl strncmp + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FB094: + add r0, r6, #1 + and r6, r0, #0xff + cmp r6, sb + blo _021FB054 +_021FB0A4: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021FB0AC: .word ov00_0221B0AC + arm_func_end ov00_021FB010 + + arm_func_start ov00_021FB0B0 +ov00_021FB0B0: ; 0x021FB0B0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0x10 + mvn r4, #0 + bl ov00_021FAE14 + mov r6, r0 + mov r0, #1 + bl ov00_021FAE14 + mov r1, #1 + strb r1, [r0, #0xb] + bl ov00_021FAECC + cmp r0, #3 + beq _021FB0F8 + cmp r0, #4 + beq _021FB160 + cmp r0, #5 + beq _021FB1AC + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FB0F8: + ldrh r1, [r7, #0xa] + ldrb r5, [r6, #0xd11] + cmp r1, #0 + ldrneb r0, [r7, #0xc] + cmpne r0, #0 + bne _021FB11C + ldrh r0, [r7, #0x36] + bl ov00_021FC4CC + b _021FB1F4 +_021FB11C: + cmp r1, #1 + cmpeq r0, #0x20 + bne _021FB148 + ldrh r0, [r7, #0x36] + bl ov00_021FC4CC + ldrb r1, [r6, #0xd10] + mov r0, r7 + add r2, r6, #0x300 + bl ov00_021FB2B0 + mov r4, r0 + b _021FB1F4 +_021FB148: + ldrb r1, [r6, #0xd10] + mov r0, r7 + add r2, r6, #0x300 + bl ov00_021FB2B0 + mov r4, r0 + b _021FB1F4 +_021FB160: + ldrb r2, [r6, #0xd0f] + mov r1, #0xc0 + mov r0, r7 + mla r1, r2, r1, r6 + add r1, r1, #0x400 + ldrh r2, [r1, #0xa6] + mov r1, r6 + sub r2, r2, #1 + and r5, r2, #0xff + bl ov00_021FB32C + movs r4, r0 + bmi _021FB1F4 + ldrb r1, [r6, #0xd0f] + add r0, r6, #0x47 + add r2, r0, #0x400 + ldrb r0, [r2, r1, lsl #2] + orr r0, r0, #0x80 + strb r0, [r2, r1, lsl #2] + b _021FB1F4 +_021FB1AC: + ldrb r1, [r6, #0xd0f] + add r2, r6, #0x300 + mov r0, #0x24 + mla r2, r1, r0, r2 + mov r0, r7 + mov r1, #1 + ldrb r5, [r6, #0xd11] + bl ov00_021FB2B0 + movs r4, r0 + bmi _021FB1F4 + ldrb r1, [r6, #0xd0f] + mov r0, #0x24 + add r2, r6, #0x300 + smulbb r1, r1, r0 + ldrb r0, [r2, r1] + bic r0, r0, #0xf + orr r0, r0, #1 + strb r0, [r2, r1] +_021FB1F4: + cmp r4, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + mov r1, r7 + mov r2, r5 + mov r3, r6 + bl ov00_021FB3BC + mov r1, r6 + bl ov00_021FB53C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021FB0B0 + + arm_func_start ov00_021FB21C +ov00_021FB21C: ; 0x021FB21C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + ldrb r0, [r4, #0xd0c] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + cmpne r0, #4 + bne _021FB26C + ldrh r0, [r5, #0x2c] + mov r0, r0, asr #4 + and r0, r0, #1 + cmp r0, #1 + bne _021FB26C + add r0, r5, #0xc + bl ov00_021FD1C8 + cmp r0, #1 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} +_021FB26C: + ldrb r0, [r4, #0xd0c] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + cmpne r0, #5 + bne _021FB2A8 + ldrh r0, [r5, #0x2c] + mov r0, r0, asr #4 + and r0, r0, #1 + cmp r0, #1 + bne _021FB2A8 + add r0, r5, #0xc + bl ov00_021FD11C + cmp r0, #1 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, pc} +_021FB2A8: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FB21C + + arm_func_start ov00_021FB2B0 +ov00_021FB2B0: ; 0x021FB2B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r6, r0 + ldrh r3, [r6, #0xa] + mov r5, r1 + mov r4, r2 + cmp r3, #0x20 + bne _021FB2D8 + bl ov00_021FB21C + cmp r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021FB2D8: + cmp r5, #0 + mov r8, #0 + ble _021FB324 + ldrh sb, [r6, #0xa] + and r7, sb, #0xff +_021FB2EC: + ldrb r0, [r4, #3] + cmp r7, r0 + bne _021FB314 + mov r2, sb + add r0, r6, #0xc + add r1, r4, #4 + bl strncmp + cmp r0, #0 + ldreqb r0, [r4, #1] + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_021FB314: + add r8, r8, #1 + cmp r8, r5 + add r4, r4, #0x24 + blt _021FB2EC +_021FB324: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_021FB2B0 + + arm_func_start ov00_021FB32C +ov00_021FB32C: ; 0x021FB32C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + ldrh r2, [sl, #0xa] + mov sb, r1 + cmp r2, #0x20 + bne _021FB350 + bl ov00_021FB21C + cmp r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FB350: + ldrb r8, [sb, #0xd12] + mov r4, #0 + cmp r8, #0 + ble _021FB3B4 + ldrh r7, [sl, #0xa] + add r0, sb, #0x7c + mov r5, sb + add r6, r0, #0x400 +_021FB370: + add r0, r5, #0x400 + ldrh r0, [r0, #0x7a] + cmp r7, r0 + bne _021FB3A0 + mov r1, r6 + mov r2, r7 + add r0, sl, #0xc + bl strncmp + cmp r0, #0 + addeq r0, sb, r4, lsl #2 + ldreqb r0, [r0, #0x445] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FB3A0: + add r4, r4, #1 + cmp r4, r8 + add r5, r5, #0xc0 + add r6, r6, #0xc0 + blt _021FB370 +_021FB3B4: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_021FB32C + + arm_func_start ov00_021FB3BC +ov00_021FB3BC: ; 0x021FB3BC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r3 + ldrb r5, [r6, #0xd12] + mvn r4, #0 + mov r3, #0 + cmp r5, #0 + ble _021FB440 + ldrb lr, [r1, #4] + add ip, r6, #0x74 + add ip, ip, #0x400 +_021FB3E4: + ldrb r7, [ip] + cmp lr, r7 + ldreqb r8, [r1, #5] + ldreqb r7, [ip, #1] + cmpeq r8, r7 + ldreqb r8, [r1, #6] + ldreqb r7, [ip, #2] + cmpeq r8, r7 + ldreqb r8, [r1, #7] + ldreqb r7, [ip, #3] + cmpeq r8, r7 + ldreqb r8, [r1, #8] + ldreqb r7, [ip, #4] + cmpeq r8, r7 + ldreqb r8, [r1, #9] + ldreqb r7, [ip, #5] + cmpeq r8, r7 + moveq r4, r3 + beq _021FB440 + add r3, r3, #1 + cmp r3, r5 + add ip, ip, #0xc0 + blt _021FB3E4 +_021FB440: + mvn r3, #0 + cmp r4, r3 + bne _021FB470 + mov r3, r6 + and r0, r0, #0xff + bl ov00_021FB484 + ldrb r0, [r6, #0xd12] + mov r4, #0xa + cmp r0, #0xa + addlo r0, r0, #1 + strlob r0, [r6, #0xd12] + b _021FB47C +_021FB470: + mov r0, r4 + mov r3, r6 + bl ov00_021FB4D0 +_021FB47C: + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov00_021FB3BC + + arm_func_start ov00_021FB484 +ov00_021FB484: ; 0x021FB484 + stmdb sp!, {r3, lr} + add ip, r3, #0x6c + strb r0, [ip, #0x401] + ldrh r0, [r1, #2] + and r2, r2, #0x7f + tst r0, #2 + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + and r0, r0, #0xff + strb r0, [ip, #0x402] + ldrb lr, [ip, #0x403] + mov r0, r1 + bic r1, lr, #0x7f + orr lr, r1, r2 + add r1, r3, #0xbf0 + mov r2, #0xc0 + strb lr, [ip, #0x403] + bl MIi_CpuCopy32 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FB484 + + arm_func_start ov00_021FB4D0 +ov00_021FB4D0: ; 0x021FB4D0 + stmdb sp!, {r3, r4, r5, lr} + ldrh r4, [r1, #2] + add ip, r3, #0x44 + mov lr, #0xc0 + add r5, ip, #0x400 + mul ip, r0, lr + tst r4, #2 + add r0, r5, r0, lsl #2 + mov r4, r4, asr #2 + addeq r4, r4, #0x19 + and r4, r4, #0xff + ldrb lr, [r0, #2] + and r4, r4, #0xff + add r3, r3, #0x470 + cmp r4, lr + bls _021FB528 + strb r4, [r0, #2] + ldrb lr, [r0, #3] + and r2, r2, #0x7f + bic lr, lr, #0x7f + orr r2, lr, r2 + strb r2, [r0, #3] +_021FB528: + mov r0, r1 + add r1, r3, ip + mov r2, #0xc0 + bl MIi_CpuCopy32 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FB4D0 + + arm_func_start ov00_021FB53C +ov00_021FB53C: ; 0x021FB53C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc4 + mov r4, r0 + add r0, r1, #0x44 + add r7, r0, #0x400 + add r8, r1, #0x470 + subs r6, r4, #1 + bmi _021FB604 + mov r0, #0xc0 + mla sl, r6, r0, r8 + add sb, r7, r6, lsl #2 + add fp, sp, #0 +_021FB56C: + add r0, r7, r4, lsl #2 + ldrb r1, [r0, #2] + add r0, r7, r6, lsl #2 + ldrb r0, [r0, #2] + cmp r1, r0 + blo _021FB604 + mov r0, sb + mov r1, fp + mov r2, #4 + bl MIi_CpuCopy32 + add r5, r7, r4, lsl #2 + mov r0, r5 + mov r1, sb + mov r2, #4 + bl MIi_CpuCopy32 + mov r1, r5 + mov r0, fp + mov r2, #4 + bl MIi_CpuCopy32 + mov r0, sl + add r1, sp, #4 + mov r2, #0xc0 + bl MIi_CpuCopy32 + mov r0, #0xc0 + mul r5, r4, r0 + add r0, r8, r5 + mov r1, sl + mov r2, #0xc0 + bl MIi_CpuCopy32 + add r1, r8, r5 + add r0, sp, #4 + mov r2, #0xc0 + bl MIi_CpuCopy32 + mov r4, r6 + sub sb, sb, #4 + sub sl, sl, #0xc0 + subs r6, r6, #1 + bpl _021FB56C +_021FB604: + add r1, r7, #0x28 + mov r0, #0 + mov r2, #4 + bl MIi_CpuClear32 + add r1, r8, #0x780 + mov r0, #0 + mov r2, #0xc0 + bl MIi_CpuClear32 + add sp, sp, #0xc4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021FB53C + + arm_func_start ov00_021FB62C +ov00_021FB62C: ; 0x021FB62C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + ldrsh r1, [r4] + cmp r1, #5 + bne _021FB6A4 + ldrsh r1, [r4, #2] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #8] + cmp r1, #0xd + beq _021FB674 + cmp r1, #0xf + beq _021FB680 + cmp r1, #0x11 + beq _021FB68C + b _021FB698 +_021FB674: + mov r1, #1 + strb r1, [r0, #0xd14] + ldmia sp!, {r4, pc} +_021FB680: + mov r1, #2 + strb r1, [r0, #0xd14] + ldmia sp!, {r4, pc} +_021FB68C: + mov r1, #3 + strb r1, [r0, #0xd14] + ldmia sp!, {r4, pc} +_021FB698: + mov r1, #4 + strb r1, [r0, #0xd14] + ldmia sp!, {r4, pc} +_021FB6A4: + cmp r1, #7 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #4] + bl ov00_021FB0B0 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FB62C + + arm_func_start ov00_021FB6B8 +ov00_021FB6B8: ; 0x021FB6B8 + stmdb sp!, {r4, lr} + bl ov00_021FAECC + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + cmp r4, #7 + beq _021FB6E0 + cmp r4, #8 + beq _021FB6EC + b _021FB6F4 +_021FB6E0: + bl ov00_021FB6FC + mov r4, r0 + b _021FB6F4 +_021FB6EC: + bl ov00_021FB7F4 + mov r4, r0 +_021FB6F4: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FB6B8 + + arm_func_start ov00_021FB6FC +ov00_021FB6FC: ; 0x021FB6FC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r2, [r5, #0xd13] + add r3, r5, #0x470 + mov r1, #0xc0 + mla r4, r2, r1, r3 + bl ov00_021FB930 + add r1, r5, #0xb8 + strb r0, [r5, #0xd0d] + add r0, r1, #0xc00 + mov r1, #0 + mov r2, #0x52 + bl MI_CpuFill8 + add r2, r5, #0xb8 + ldrb r1, [r5, #0xd0d] + mov r0, r5 + add r2, r2, #0xc00 + bl ov00_021FBB04 + cmp r0, #0 + ldrb r0, [r5, #0xd0b] + bic r0, r0, #0xc + beq _021FB7B0 + orr r0, r0, #4 + strb r0, [r5, #0xd0b] + ldrh r0, [r4, #0x2c] + mov r0, r0, asr #4 + tst r0, #1 + bne _021FB784 + ldrb r1, [r5, #0xd13] + mov r2, #3 + mov r0, #9 + add r1, r5, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, pc} +_021FB784: + ldrb r0, [r5, #0xd0d] + cmp r0, #6 + ldreqb r0, [r4, #0x15] + cmpeq r0, #0 + bne _021FB7E0 + ldrb r1, [r5, #0xd13] + mov r2, #3 + mov r0, #9 + add r1, r5, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, pc} +_021FB7B0: + strb r0, [r5, #0xd0b] + ldrh r0, [r4, #0x2c] + mov r0, r0, asr #4 + and r0, r0, #1 + cmp r0, #1 + bne _021FB7E0 + ldrb r1, [r5, #0xd13] + mov r2, #3 + mov r0, #9 + add r1, r5, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, pc} +_021FB7E0: + mov r0, #0 + strb r0, [r5, #0xd15] + strb r0, [r5, #0xd14] + mov r0, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FB6FC + + arm_func_start ov00_021FB7F4 +ov00_021FB7F4: ; 0x021FB7F4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + bl WCM_GetPhase + ldrb r2, [r7, #0xd13] + mov r1, #0xc0 + cmp r0, #3 + add r5, r7, #0x470 + smulbb r4, r2, r1 + bne _021FB904 + mov r0, r7 + bl ov00_021FBACC + ldrb r1, [r7, #0xd15] + mov r6, r0 + add r0, r1, #1 + and r1, r0, #0xff + strb r0, [r7, #0xd15] + cmp r1, #3 + bls _021FB85C + mov r0, #0 + strb r0, [r7, #0xd15] + ldrb r1, [r7, #0xd13] + mov r2, #1 + mov r0, #9 + add r1, r7, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FB85C: + cmp r1, #1 + beq _021FB8E0 + ldrb r0, [r7, #0xd14] + cmp r0, #1 + bne _021FB880 + ldrb r0, [r7, #0xd0b] + bic r0, r0, #0xc + strb r0, [r7, #0xd0b] + b _021FB8E0 +_021FB880: + cmp r0, #2 + bne _021FB8A8 + mov r0, #0 + strb r0, [r7, #0xd15] + ldrb r1, [r7, #0xd13] + mov r2, #3 + mov r0, #9 + add r1, r7, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FB8A8: + cmp r0, #3 + bne _021FB8D0 + mov r0, #0 + strb r0, [r7, #0xd15] + ldrb r1, [r7, #0xd13] + mov r2, #4 + mov r0, #9 + add r1, r7, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FB8D0: + cmp r1, #3 + ldreqb r0, [r7, #0xd0b] + biceq r0, r0, #0xc + streqb r0, [r7, #0xd0b] +_021FB8E0: + mov r0, r7 + bl ov00_021FBAE8 + mov r2, r0 + add r1, r7, #0xb8 + add r0, r5, r4 + add r1, r1, #0xc00 + orr r2, r6, r2 + bl WCM_ConnectAsync + b _021FB928 +_021FB904: + cmp r0, #9 + bne _021FB928 + mov r0, #0 + strb r0, [r7, #0xd15] + bl OS_GetTick + str r0, [r7, #0xcb0] + str r1, [r7, #0xcb4] + mov r0, #0xa + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_021FB928: + mov r0, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_021FB7F4 + + arm_func_start ov00_021FB930 +ov00_021FB930: ; 0x021FB930 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldrb r2, [sl, #0xd13] + ldrb r1, [sl, #0xd0c] + add r3, sl, #0x470 + mov r0, #0xc0 + mla r4, r2, r0, r3 + mov r0, r1, lsl #0x18 + movs r0, r0, lsr #0x1e + mov r0, #0 + str r0, [sp] + bne _021FBA4C + ldrh r0, [r4, #0xa] + ldr r6, [sp] + cmp r0, #0x20 + bne _021FB990 + mov r0, r4 + bl ov00_021FB21C + cmp r0, #0 + str r0, [sp] + movle r0, #0 + addgt r6, r6, #1 + strle r0, [sp] + b _021FB9B4 +_021FB990: + cmp r0, #8 + bne _021FB9B4 + mov r0, r4 + bl ov00_021FBFB8 + cmp r0, #0 + str r0, [sp] + moveq r0, #0 + addne r6, r6, #1 + streq r0, [sp] +_021FB9B4: + ldrb r0, [sl, #0xd10] + mov r5, #0 + cmp r0, #0 + ble _021FBAC0 + mov r7, sl + add r8, sl, #0x304 + add sb, sl, #0x300 + add fp, sl, #0x10c +_021FB9D4: + ldrh r2, [r4, #0xa] + ldrb r0, [r7, #0x303] + cmp r2, r0 + bne _021FBA2C + mov r1, r8 + add r0, r4, #0xc + bl strncmp + cmp r0, #0 + bne _021FBA2C + cmp r6, #0 + ldreqb r0, [r7, #0x301] + streq r0, [sp] + beq _021FBA28 + ldrb r0, [sb] + bic r0, r0, #0xf0 + orr r0, r0, #0x10 + strb r0, [sb] + ldrb r0, [fp, #0xc00] + bic r0, r0, #0xc0 + orr r0, r0, #0x40 + strb r0, [fp, #0xc00] +_021FBA28: + add r6, r6, #1 +_021FBA2C: + ldrb r0, [sl, #0xd10] + add r5, r5, #1 + add r7, r7, #0x24 + cmp r5, r0 + add r8, r8, #0x24 + add sb, sb, #0x24 + blt _021FB9D4 + b _021FBAC0 +_021FBA4C: + ldrb r0, [sl, #0xd10] + ldr r5, [sp] + mov r4, r5 + cmp r0, #0 + ble _021FBAB0 + mov r3, sl + add r2, sl, #0x300 +_021FBA68: + ldrb r0, [r2] + mov r1, r0, lsl #0x18 + mov r1, r1, lsr #0x1c + cmp r1, #1 + bne _021FBA98 + cmp r4, #0 + bne _021FBA94 + bic r0, r0, #0xf0 + strb r0, [r2] + ldrb r0, [r3, #0x301] + str r0, [sp] +_021FBA94: + add r4, r4, #1 +_021FBA98: + ldrb r0, [sl, #0xd10] + add r5, r5, #1 + add r2, r2, #0x24 + cmp r5, r0 + add r3, r3, #0x24 + blt _021FBA68 +_021FBAB0: + cmp r4, #1 + ldreqb r0, [sl, #0xd0c] + biceq r0, r0, #0xc0 + streqb r0, [sl, #0xd0c] +_021FBAC0: + ldr r0, [sp] + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021FB930 + + arm_func_start ov00_021FBACC +ov00_021FBACC: ; 0x021FBACC + ldrb r0, [r0, #0xd0b] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1e + cmp r0, #1 + moveq r0, #0x30000 + movne r0, #0x20000 + bx lr + arm_func_end ov00_021FBACC + + arm_func_start ov00_021FBAE8 +ov00_021FBAE8: ; 0x021FBAE8 + ldrb r0, [r0, #0xd0b] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1e + cmp r0, #1 + moveq r0, #0xc0000 + movne r0, #0x80000 + bx lr + arm_func_end ov00_021FBAE8 + + arm_func_start ov00_021FBB04 +ov00_021FBB04: ; 0x021FBB04 + stmdb sp!, {r4, lr} + mov r4, r2 + cmp r1, #9 + addls pc, pc, r1, lsl #2 + b _021FBBDC +_021FBB18: ; jump table + b _021FBB48 ; case 0 + b _021FBB44 ; case 1 + b _021FBB40 ; case 2 + b _021FBB74 ; case 3 + b _021FBB70 ; case 4 + b _021FBB6C ; case 5 + b _021FBB90 ; case 6 + b _021FBBB8 ; case 7 + b _021FBBDC ; case 8 + b _021FBBDC ; case 9 +_021FBB40: + add r0, r0, #0x100 +_021FBB44: + add r0, r0, #0x100 +_021FBB48: + ldrb r2, [r0, #0xe6] + add r0, r0, #0x80 + add r1, r4, #2 + mov r2, r2, lsl #0x1e + mov r3, r2, lsr #0x1e + mov r2, #0x10 + strb r3, [r4] + bl MI_CpuCopy8 + b _021FBBDC +_021FBB6C: + add r0, r0, #0x100 +_021FBB70: + add r0, r0, #0x100 +_021FBB74: + mov r3, #1 + add r0, r0, #0xd1 + add r1, r4, #2 + mov r2, #5 + strb r3, [r4] + bl MI_CpuCopy8 + b _021FBBDC +_021FBB90: + mov r1, #2 + strb r1, [r4] + ldrb r1, [r0, #0xd13] + add r0, r0, #0x7c + add r2, r0, #0x400 + mov r0, #0xc0 + mla r0, r1, r0, r2 + add r1, r4, #2 + bl ov00_021FD1EC + b _021FBBDC +_021FBBB8: + mov r1, #2 + strb r1, [r4] + ldrb r1, [r0, #0xd13] + add r0, r0, #0x7c + add r2, r0, #0x400 + mov r0, #0xc0 + mla r0, r1, r0, r2 + add r1, r4, #2 + bl ov00_021FD154 +_021FBBDC: + ldrb r0, [r4] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FBB04 + + arm_func_start ov00_021FBBF0 +ov00_021FBBF0: ; 0x021FBBF0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrb r0, [r4] + cmp r0, #0xa + bhi _021FBC3C + bl ov00_021FBC78 + cmp r0, #1 + bne _021FBC20 + mov r0, #0 + strb r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} +_021FBC20: + mvn r1, #0 + cmp r0, r1 + bne _021FBC70 + mov r0, #0x12 + strb r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} +_021FBC3C: + cmp r0, #0xe + bne _021FBC58 + bl ov00_021EA518 + bl ov00_021EA420 + mov r0, #0xc + strb r0, [r4] + b _021FBC70 +_021FBC58: + cmp r0, #0x12 + bhs _021FBC70 + bl ov00_021FBD08 + cmp r0, #1 + moveq r0, #0xa + streqb r0, [r4] +_021FBC70: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FBBF0 + + arm_func_start ov00_021FBC78 +ov00_021FBC78: ; 0x021FBC78 + stmdb sp!, {r3, lr} + bl WCM_GetPhase + cmp r0, #0xc + addls pc, pc, r0, lsl #2 + b _021FBD00 +_021FBC8C: ; jump table + b _021FBCC0 ; case 0 + b _021FBCC8 ; case 1 + b _021FBD00 ; case 2 + b _021FBCD0 ; case 3 + b _021FBD00 ; case 4 + b _021FBD00 ; case 5 + b _021FBCD8 ; case 6 + b _021FBD00 ; case 7 + b _021FBD00 ; case 8 + b _021FBCE0 ; case 9 + b _021FBD00 ; case 10 + b _021FBCF0 ; case 11 + b _021FBCE8 ; case 12 +_021FBCC0: + mov r0, #1 + ldmia sp!, {r3, pc} +_021FBCC8: + bl WCM_Finish + b _021FBD00 +_021FBCD0: + bl WCM_CleanupAsync + b _021FBD00 +_021FBCD8: + bl WCM_EndSearchAsync + b _021FBD00 +_021FBCE0: + bl WCM_DisconnectAsync + b _021FBD00 +_021FBCE8: + bl WCM_TerminateAsync + b _021FBD00 +_021FBCF0: + mov r0, #0 + bl ov00_021FAEE8 + mvn r0, #0 + ldmia sp!, {r3, pc} +_021FBD00: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FBC78 + + arm_func_start ov00_021FBD08 +ov00_021FBD08: ; 0x021FBD08 + stmdb sp!, {r3, lr} + bl SOCL_CalmDown + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + bl SOC_Cleanup + cmp r0, #0 + mvnne r1, #0x26 + cmpne r0, r1 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FBD08 + + arm_func_start ov00_021FBD38 +ov00_021FBD38: ; 0x021FBD38 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov00_021FAE14 + add r0, r0, #0xa + bl ov00_021FBBF0 + cmp r0, #1 + moveq r0, #0x12 + movne r0, #0x11 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FBD38 + + arm_func_start ov00_021FBD5C +ov00_021FBD5C: ; 0x021FBD5C + stmdb sp!, {r4, lr} + mov r0, #1 + bl ov00_021FAE14 + mov r4, r0 + bl ov00_021FAF0C + cmp r0, #4 + bge _021FBD80 + bl ov00_021FBDAC + ldmia sp!, {r4, pc} +_021FBD80: + cmp r0, #5 + bge _021FBD90 + bl ov00_021FBDF0 + ldmia sp!, {r4, pc} +_021FBD90: + cmp r0, #5 + mov r0, r4 + bne _021FBDA4 + bl ov00_021FBDF8 + ldmia sp!, {r4, pc} +_021FBDA4: + bl ov00_021FBE14 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FBD5C + + arm_func_start ov00_021FBDAC +ov00_021FBDAC: ; 0x021FBDAC + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _021FBDE8 +_021FBDB8: ; jump table + b _021FBDD0 ; case 0 + b _021FBDC8 ; case 1 + b _021FBDD8 ; case 2 + b _021FBDE0 ; case 3 +_021FBDC8: + mvn r0, #8 + bx lr +_021FBDD0: + mvn r0, #9 + bx lr +_021FBDD8: + mvn r0, #7 + bx lr +_021FBDE0: + mvn r0, #6 + bx lr +_021FBDE8: + mov r0, #0 + bx lr + arm_func_end ov00_021FBDAC + + arm_func_start ov00_021FBDF0 +ov00_021FBDF0: ; 0x021FBDF0 + mvn r0, #5 + bx lr + arm_func_end ov00_021FBDF0 + + arm_func_start ov00_021FBDF8 +ov00_021FBDF8: ; 0x021FBDF8 + ldrb r0, [r0, #0xb] + cmp r0, #0 + ldreq r0, _021FBE0C ; =0xFFFF3C4D + ldrne r0, _021FBE10 ; =0xFFFF3865 + bx lr + .balign 4, 0 +_021FBE0C: .word 0xFFFF3C4D +_021FBE10: .word 0xFFFF3865 + arm_func_end ov00_021FBDF8 + + arm_func_start ov00_021FBE14 +ov00_021FBE14: ; 0x021FBE14 + ldrb r1, [r0, #0x22] + ldrb r2, [r0, #0x16] + cmp r1, #0 + ldreqb r1, [r0, #0x15] + cmp r2, #0xa + bhs _021FBE60 + ldrb r0, [r0, #0x14] + cmp r0, #3 + ldreq r0, _021FBEFC ; =0xFFFF3864 + subeq r0, r0, r1 + bxeq lr + cmp r0, #4 + ldrne r0, _021FBF00 ; =0xFFFF379C + subne r0, r0, r1 + bxne lr + mov r0, #0xc800 + rsb r0, r0, #0 + sub r0, r0, r1 + bx lr +_021FBE60: + cmp r2, #0xd + ldrlo r0, _021FBF04 ; =0xFFFF34E0 + sublo r0, r0, r1 + bxlo lr + ldr r0, [r0, #0x10] + cmp r0, #0 + ldreq r0, _021FBF08 ; =0xFFFF3CB0 + subeq r0, r0, r1 + bxeq lr + mvn r3, #0 + cmp r0, r3 + ldreq r0, _021FBF0C ; =0xFFFF347C + subeq r0, r0, r1 + bxeq lr + sub r2, r3, #1 + cmp r0, r2 + ldreq r0, _021FBF10 ; =0xFFFF3418 + subeq r0, r0, r1 + bxeq lr + sub r2, r3, #2 + cmp r0, r2 + ldreq r0, _021FBF14 ; =0xFFFF33B4 + subeq r0, r0, r1 + bxeq lr + sub r2, r3, #3 + cmp r0, r2 + ldreq r0, _021FBF18 ; =0xFFFF30F8 + subeq r0, r0, r1 + bxeq lr + sub r2, r3, #4 + cmp r0, r2 + ldreq r0, _021FBF1C ; =0xFFFF3094 + subeq r0, r0, r1 + bxeq lr + sub r2, r3, #5 + cmp r0, r2 + ldreq r0, _021FBF20 ; =0xFFFF3030 + subeq r0, r0, r1 + bx lr + .balign 4, 0 +_021FBEFC: .word 0xFFFF3864 +_021FBF00: .word 0xFFFF379C +_021FBF04: .word 0xFFFF34E0 +_021FBF08: .word 0xFFFF3CB0 +_021FBF0C: .word 0xFFFF347C +_021FBF10: .word 0xFFFF3418 +_021FBF14: .word 0xFFFF33B4 +_021FBF18: .word 0xFFFF30F8 +_021FBF1C: .word 0xFFFF3094 +_021FBF20: .word 0xFFFF3030 + arm_func_end ov00_021FBE14 + + arm_func_start ov00_021FBF24 +ov00_021FBF24: ; 0x021FBF24 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + cmp r5, #0 + beq _021FBF54 + cmp r5, #1 + beq _021FBF74 + cmp r5, #2 + beq _021FBF8C + b _021FBFB0 +_021FBF54: + add r1, r4, #0x300 + mov r0, #0 + mov r2, #0x144 + bl MIi_CpuClear32 + mov r0, r4 + bl ov00_021FC004 + strb r0, [r4, #0xd10] + b _021FBFB0 +_021FBF74: + bl ov00_021FC258 + strb r0, [r4, #0xd10] + mov r0, r4 + bl ov00_021FC2E8 + strb r0, [r4, #0xd0f] + b _021FBFB0 +_021FBF8C: + add r1, r4, #0x300 + mov r0, #0 + mov r2, #0x144 + bl MIi_CpuClear32 + mov r1, #0 + mov r0, r4 + strb r1, [r4, #0xd0f] + bl ov00_021FC064 + strb r0, [r4, #0xd10] +_021FBFB0: + ldrb r0, [r4, #0xd10] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FBF24 + + arm_func_start ov00_021FBFB8 +ov00_021FBFB8: ; 0x021FBFB8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + ldrb r0, [r0, #0xd0c] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + cmpne r0, #6 + bne _021FBFF8 + ldr r1, _021FC000 ; =ov00_02216060 + add r0, r4, #0xc + mov r2, #8 + bl strncmp + cmp r0, #0 + moveq r0, #8 + ldmeqia sp!, {r4, pc} +_021FBFF8: + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FC000: .word ov00_02216060 + arm_func_end ov00_021FBFB8 + + arm_func_start ov00_021FC004 +ov00_021FC004: ; 0x021FC004 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + add r4, r5, #0x300 + bl ov00_021FC150 + ldrb r1, [r5, #0xd0c] + mov r5, r0 + mov r0, #0x24 + mla r4, r5, r0, r4 + mov r1, r1, lsl #0x1c + movs r0, r1, lsr #0x1c + cmpne r0, #6 + bne _021FC058 + ldr r0, _021FC060 ; =ov00_02216060 + add r1, r4, #4 + mov r2, #8 + bl MI_CpuCopy8 + mov r1, #8 + strb r1, [r4, #3] + add r0, r5, #1 + strb r1, [r4, #1] + and r5, r0, #0xff +_021FC058: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FC060: .word ov00_02216060 + arm_func_end ov00_021FC004 + + arm_func_start ov00_021FC064 +ov00_021FC064: ; 0x021FC064 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + add r5, r6, #0x300 + bl ov00_021FC150 + ldrb r1, [r6, #0xd0c] + mov r4, r0 + mov r0, #0x24 + mla r5, r4, r0, r5 + mov r1, r1, lsl #0x1c + movs r0, r1, lsr #0x1c + cmpne r0, #4 + bne _021FC0C0 + ldr r0, _021FC144 ; =ov00_02217B8C + add r1, r5, #4 + mov r2, #8 + bl MI_CpuCopy8 + mov r1, #8 + add r0, r4, #1 + strb r1, [r5, #3] + mov r1, #6 + strb r1, [r5, #1] + and r4, r0, #0xff + add r5, r5, #0x24 +_021FC0C0: + ldrb r0, [r6, #0xd0c] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + cmpne r0, #7 + bne _021FC100 + ldr r0, _021FC148 ; =ov00_02216058 + add r1, r5, #4 + mov r2, #8 + bl MI_CpuCopy8 + mov r1, #8 + add r0, r4, #1 + strb r1, [r5, #3] + mov r1, #9 + strb r1, [r5, #1] + and r4, r0, #0xff + add r5, r5, #0x24 +_021FC100: + ldrb r0, [r6, #0xd0c] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + cmpne r0, #8 + bne _021FC13C + ldr r0, _021FC14C ; =ov00_02216068 + add r1, r5, #4 + mov r2, #0xb + bl MI_CpuCopy8 + mov r1, #0xb + add r0, r4, #1 + strb r1, [r5, #3] + mov r1, #0xa + strb r1, [r5, #1] + and r4, r0, #0xff +_021FC13C: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FC144: .word ov00_02217B8C +_021FC148: .word ov00_02216058 +_021FC14C: .word ov00_02216068 + arm_func_end ov00_021FC064 + + arm_func_start ov00_021FC150 +ov00_021FC150: ; 0x021FC150 + stmdb sp!, {r4, r5, r6, lr} + mov r2, #0 + mov r3, r0 + mov r1, r2 + add ip, r0, #0x300 +_021FC164: + ldrb r4, [r0, #0xd0c] + mov r4, r4, lsl #0x1c + movs r5, r4, lsr #0x1c + addne r4, r1, #1 + cmpne r5, r4 + bne _021FC240 + ldrb r4, [r3, #0xe7] + cmp r4, #0xff + beq _021FC240 + mov r6, #0 +_021FC18C: + add r4, r3, r6 + ldrb lr, [r4, #0x40] + cmp lr, #0 + beq _021FC1B4 + add r4, r6, #1 + add r5, ip, r6 + and r6, r4, #0xff + strb lr, [r5, #4] + cmp r6, #0x20 + blo _021FC18C +_021FC1B4: + cmp r6, #0 + moveq r4, #0 + beq _021FC1CC + strb r6, [ip, #3] + strb r1, [ip, #1] + mov r4, #1 +_021FC1CC: + cmp r4, #0 + ldrb r4, [r3, #0xe7] + addne r2, r2, #1 + andne r2, r2, #0xff + addne ip, ip, #0x24 + cmp r4, #1 + bne _021FC240 + mov r6, #0 +_021FC1EC: + add r4, r3, r6 + ldrb r5, [r4, #0x60] + cmp r5, #0 + beq _021FC214 + add lr, r6, #1 + add r4, ip, r6 + and r6, lr, #0xff + strb r5, [r4, #4] + cmp r6, #0x20 + blo _021FC1EC +_021FC214: + cmp r6, #0 + moveq r4, #0 + beq _021FC230 + strb r6, [ip, #3] + add lr, r1, #3 + strb lr, [ip, #1] + mov r4, #1 +_021FC230: + cmp r4, #0 + addne r2, r2, #1 + andne r2, r2, #0xff + addne ip, ip, #0x24 +_021FC240: + add r1, r1, #1 + cmp r1, #3 + add r3, r3, #0x100 + blt _021FC164 + mov r0, r2 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021FC150 + + arm_func_start ov00_021FC258 +ov00_021FC258: ; 0x021FC258 + stmdb sp!, {r3, r4, r5, lr} + ldrb r3, [r0, #0xd12] + mov r2, #0 + mov r1, r2 + cmp r3, #0 + ble _021FC2E0 + add r3, r0, #0x47 + mov ip, r0 + add r3, r3, #0x400 +_021FC27C: + add r4, r0, r1, lsl #2 + ldrb r4, [r4, #0x444] + cmp r4, #0 + bne _021FC2BC + add lr, ip, #0x400 + ldrh r4, [lr, #0xa6] + ldrb lr, [r3] + sub r5, r4, #1 + mov r4, lr, lsl #0x19 + cmp r5, r4, lsr #25 + beq _021FC2BC + bic lr, lr, #0x80 + add r2, r2, #1 + strb lr, [r3] + and r2, r2, #0xff + b _021FC2C8 +_021FC2BC: + ldrb lr, [r3] + orr lr, lr, #0x80 + strb lr, [r3] +_021FC2C8: + ldrb lr, [r0, #0xd12] + add r1, r1, #1 + add r3, r3, #4 + cmp r1, lr + add ip, ip, #0xc0 + blt _021FC27C +_021FC2E0: + mov r0, r2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FC258 + + arm_func_start ov00_021FC2E8 +ov00_021FC2E8: ; 0x021FC2E8 + ldrb ip, [r0, #0xd12] + mov r3, #0 + mov r2, r3 + cmp ip, #0 + bls _021FC324 +_021FC2FC: + add r1, r0, r2, lsl #2 + ldrb r1, [r1, #0x447] + mov r1, r1, lsl #0x18 + movs r1, r1, lsr #0x1f + moveq r3, r2 + beq _021FC324 + add r1, r2, #1 + and r2, r1, #0xff + cmp r2, ip + blo _021FC2FC +_021FC324: + mov r0, r3 + bx lr + arm_func_end ov00_021FC2E8 + + arm_func_start ov00_021FC32C +ov00_021FC32C: ; 0x021FC32C + stmdb sp!, {r3, r4, r5, lr} + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + mov r5, #9 + bl WCM_GetPhase + cmp r0, #0xc + addls pc, pc, r0, lsl #2 + b _021FC400 +_021FC350: ; jump table + b _021FC400 ; case 0 + b _021FC400 ; case 1 + b _021FC400 ; case 2 + b _021FC384 ; case 3 + b _021FC400 ; case 4 + b _021FC400 ; case 5 + b _021FC3D0 ; case 6 + b _021FC400 ; case 7 + b _021FC400 ; case 8 + b _021FC3D8 ; case 9 + b _021FC400 ; case 10 + b _021FC3F4 ; case 11 + b _021FC3E0 ; case 12 +_021FC384: + ldrb r0, [r4, #0xd0c] + ldrb r5, [r4, #0xd0e] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1e + cmp r0, #1 + bne _021FC3B4 + ldrb r0, [r4, #0xd13] + mov r1, #0 + mov r5, #7 + add r0, r4, r0, lsl #2 + strb r1, [r0, #0x444] + b _021FC400 +_021FC3B4: + cmp r5, #3 + blo _021FC400 + cmp r5, #5 + bhi _021FC400 + mov r0, r5 + bl ov00_021FC568 + b _021FC400 +_021FC3D0: + bl WCM_EndSearchAsync + b _021FC400 +_021FC3D8: + bl WCM_DisconnectAsync + b _021FC400 +_021FC3E0: + bl WCM_TerminateAsync + mov r0, #4 + bl ov00_021FAEE8 + mov r5, #0x11 + b _021FC400 +_021FC3F4: + mov r0, #0 + bl ov00_021FAEE8 + mov r5, #0x11 +_021FC400: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FC32C + + arm_func_start ov00_021FC408 +ov00_021FC408: ; 0x021FC408 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + bl ov00_021FAECC + mov r5, r0 + bl WCM_GetPhase + cmp r5, #2 + cmpeq r0, #3 + bne _021FC440 + mov r0, r4 + bl ov00_021FC648 + mov r5, r0 + b _021FC4C4 +_021FC440: + cmp r5, #6 + bne _021FC45C + mov r0, r4 + mov r1, r5 + bl ov00_021FCA90 + mov r5, r0 + b _021FC4C4 +_021FC45C: + cmp r0, #3 + cmpne r0, #6 + bne _021FC4C4 + mov r0, r4 + mov r1, r5 + bl ov00_021FCA90 + mov r5, r0 + cmp r5, #7 + beq _021FC4C4 + cmp r5, #3 + bne _021FC498 + mov r0, r4 + bl ov00_021FC698 + mov r5, r0 + b _021FC4C4 +_021FC498: + cmp r5, #4 + bne _021FC4B0 + mov r0, r4 + bl ov00_021FC784 + mov r5, r0 + b _021FC4C4 +_021FC4B0: + cmp r5, #5 + bne _021FC4C4 + mov r0, r4 + bl ov00_021FC8AC + mov r5, r0 +_021FC4C4: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FC408 + + arm_func_start ov00_021FC4CC +ov00_021FC4CC: ; 0x021FC4CC + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + add r0, r0, #0xd00 + cmp r4, #0xd + movhi r4, #0xd + ldrh r3, [r0, #0x16] + sub r1, r4, #1 + mov r2, #1 + orr r1, r3, r2, lsl r1 + strh r1, [r0, #0x16] + ldmia sp!, {r4, pc} + arm_func_end ov00_021FC4CC + + arm_func_start ov00_021FC500 +ov00_021FC500: ; 0x021FC500 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + add r0, r0, #0xd00 + ldrh ip, [r0, #0x16] + cmp ip, #0 + mvneq r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0 + mov r3, r2 + mov r1, #1 +_021FC530: + tst ip, r1, lsl r2 + beq _021FC550 + cmp r3, r4 + moveq r0, r2, lsl #0x18 + moveq r0, r0, asr #0x18 + ldmeqia sp!, {r4, pc} + add r0, r3, #1 + and r3, r0, #0xff +_021FC550: + add r0, r2, #1 + and r2, r0, #0xff + cmp r2, #0xd + blo _021FC530 + mvn r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FC500 + + arm_func_start ov00_021FC568 +ov00_021FC568: ; 0x021FC568 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0x10 + bl ov00_021FAE14 + mov r4, r0 + cmp r5, #3 + beq _021FC598 + cmp r5, #4 + beq _021FC5C0 + cmp r5, #5 + beq _021FC60C + ldmia sp!, {r3, r4, r5, pc} +_021FC598: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + add r0, r4, #0xd00 + ldrsb r2, [r0, #0x11] + ldr r0, _021FC640 ; =_02108FC0 + ldr r1, _021FC644 ; =_02108FC8 + mov r3, #0x200000 + bl ov00_021FCBB4 + ldmia sp!, {r3, r4, r5, pc} +_021FC5C0: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + ldrb r2, [r4, #0xd0f] + mov r0, #0xc0 + add r1, r4, #0x74 + smulbb ip, r2, r0 + add r0, r4, ip + add r0, r0, #0x400 + ldrh r2, [r0, #0xa6] + add r0, r4, #0x7c + add r3, r1, #0x400 + add r1, r0, #0x400 + add r0, r3, ip + add r1, r1, ip + sub r2, r2, #1 + mov r3, #0x300000 + bl ov00_021FCBB4 + ldmia sp!, {r3, r4, r5, pc} +_021FC60C: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + ldrb r3, [r4, #0xd0f] + add r1, r4, #0x304 + mov r0, #0x24 + add r2, r4, #0xd00 + mla r1, r3, r0, r1 + ldrsb r2, [r2, #0x11] + ldr r0, _021FC640 ; =_02108FC0 + mov r3, #0x300000 + bl ov00_021FCBB4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FC640: .word _02108FC0 +_021FC644: .word _02108FC8 + arm_func_end ov00_021FC568 + + arm_func_start ov00_021FC648 +ov00_021FC648: ; 0x021FC648 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + mov r0, #0 + strb r0, [r4, #0xd11] + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + add r0, r4, #0xd00 + ldrsb r2, [r0, #0x11] + ldr r0, _021FC690 ; =_02108FC0 + ldr r1, _021FC694 ; =_02108FC8 + mov r3, #0x200000 + bl ov00_021FCBB4 + mov r0, #3 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FC690: .word _02108FC0 +_021FC694: .word _02108FC8 + arm_func_end ov00_021FC648 + + arm_func_start ov00_021FC698 +ov00_021FC698: ; 0x021FC698 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_GetTick + ldr r3, [r4, #0xcb0] + ldr r2, [r4, #0xcb4] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021FC730 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, #0x12c + blo _021FC728 + add r0, r4, #0xd00 + ldrsb r1, [r0, #0x11] + add r1, r1, #2 + strb r1, [r4, #0xd11] + ldrsb r0, [r0, #0x11] + cmp r0, #0xd + blt _021FC704 + mov r0, r4 + mov r1, #3 + bl ov00_021FC9CC + ldmia sp!, {r4, pc} +_021FC704: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + add r0, r4, #0xd00 + ldrsb r2, [r0, #0x11] + ldr r0, _021FC734 ; =_02108FC0 + ldr r1, _021FC738 ; =_02108FC8 + mov r3, #0x200000 + bl ov00_021FCBB4 +_021FC728: + mov r0, #3 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FC730: .word 0x000082EA +_021FC734: .word _02108FC0 +_021FC738: .word _02108FC8 + arm_func_end ov00_021FC698 + + arm_func_start ov00_021FC73C +ov00_021FC73C: ; 0x021FC73C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + strb r0, [r4, #0xd15] + ldrb r2, [r4, #0xd0b] + mov r1, r2, lsl #0x18 + mov r1, r1, lsr #0x1c + add r1, r1, #1 + and r1, r1, #0xff + bic r2, r2, #0xf0 + mov r1, r1, lsl #0x1c + orr r1, r2, r1, lsr #24 + strb r1, [r4, #0xd0b] + bl ov00_021FBF24 + mov r0, #1 + strb r0, [r4, #0xd11] + mov r0, #3 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FC73C + + arm_func_start ov00_021FC784 +ov00_021FC784: ; 0x021FC784 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_GetTick + ldr r3, [r4, #0xcb0] + ldr r2, [r4, #0xcb4] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021FC8A8 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, #0x96 + bhs _021FC7E0 + ldrb r0, [r4, #0xd0f] + add r0, r4, r0, lsl #2 + ldrb r0, [r0, #0x447] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1f + cmp r0, #1 + bne _021FC8A0 +_021FC7E0: + ldrb r1, [r4, #0xd0f] + add r0, r4, #0x47 + add r2, r0, #0x400 + ldrb r0, [r2, r1, lsl #2] + orr r0, r0, #0x80 + strb r0, [r2, r1, lsl #2] + ldrb r2, [r4, #0xd12] + ldrb r1, [r4, #0xd0f] + cmp r1, r2 + bhs _021FC838 +_021FC808: + add r0, r4, r1, lsl #2 + ldrb r0, [r0, #0x447] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1f + beq _021FC838 + ldrb r0, [r4, #0xd0f] + add r0, r0, #1 + strb r0, [r4, #0xd0f] + ldrb r2, [r4, #0xd12] + and r1, r0, #0xff + cmp r1, r2 + blo _021FC808 +_021FC838: + cmp r2, r1 + bhi _021FC858 + mov r2, #0 + mov r0, r4 + mov r1, #4 + strb r2, [r4, #0xd0f] + bl ov00_021FC9CC + ldmia sp!, {r4, pc} +_021FC858: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + ldrb r2, [r4, #0xd0f] + mov r0, #0xc0 + add r1, r4, #0x74 + smulbb ip, r2, r0 + add r0, r4, ip + add r0, r0, #0x400 + ldrh r2, [r0, #0xa6] + add r0, r4, #0x7c + add r3, r1, #0x400 + add r1, r0, #0x400 + add r0, r3, ip + add r1, r1, ip + sub r2, r2, #1 + mov r3, #0x300000 + bl ov00_021FCBB4 +_021FC8A0: + mov r0, #4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FC8A8: .word 0x000082EA + arm_func_end ov00_021FC784 + + arm_func_start ov00_021FC8AC +ov00_021FC8AC: ; 0x021FC8AC + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_GetTick + ldr r3, [r4, #0xcb0] + ldr r2, [r4, #0xcb4] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021FC9C4 ; =0x000082EA + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, #0x96 + bhs _021FC90C + ldrb r1, [r4, #0xd0f] + mov r0, #0x24 + mla r0, r1, r0, r4 + ldrb r0, [r0, #0x300] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #1 + bne _021FC9BC +_021FC90C: + ldrb r1, [r4, #0xd0f] + mov r0, #0x24 + add r2, r4, #0x300 + smulbb r1, r1, r0 + ldrb r0, [r2, r1] + bic r0, r0, #0xf + strb r0, [r2, r1] + ldrb r0, [r4, #0xd0f] + add r0, r0, #1 + strb r0, [r4, #0xd0f] + ldrb r1, [r4, #0xd10] + and r0, r0, #0xff + cmp r1, r0 + bhi _021FC964 + ldrb r1, [r4, #0xd15] + mov r0, #0 + add r1, r1, #1 + strb r1, [r4, #0xd15] + strb r0, [r4, #0xd0f] + ldrb r0, [r4, #0xd15] + bl ov00_021FC500 + strb r0, [r4, #0xd11] +_021FC964: + add r0, r4, #0xd00 + ldrsb r0, [r0, #0x11] + cmp r0, #0 + bge _021FC98C + mov r2, #0 + mov r0, r4 + mov r1, #5 + strb r2, [r4, #0xd15] + bl ov00_021FC9CC + ldmia sp!, {r4, pc} +_021FC98C: + bl OS_GetTick + str r0, [r4, #0xcb0] + str r1, [r4, #0xcb4] + ldrb r3, [r4, #0xd0f] + add r1, r4, #0x304 + mov r0, #0x24 + add r2, r4, #0xd00 + mla r1, r3, r0, r1 + ldrsb r2, [r2, #0x11] + ldr r0, _021FC9C8 ; =_02108FC0 + mov r3, #0x300000 + bl ov00_021FCBB4 +_021FC9BC: + mov r0, #5 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FC9C4: .word 0x000082EA +_021FC9C8: .word _02108FC0 + arm_func_end ov00_021FC8AC + + arm_func_start ov00_021FC9CC +ov00_021FC9CC: ; 0x021FC9CC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + cmp r4, #3 + beq _021FC9F4 + cmp r4, #4 + beq _021FCA54 + cmp r4, #5 + beq _021FCA60 + b _021FCA80 +_021FC9F4: + ldrb r1, [r5, #0xd12] + cmp r1, #0 + addeq r1, r5, #0xd00 + ldreqh r1, [r1, #0x16] + cmpeq r1, #0 + beq _021FCA30 + mov r0, #1 + bl ov00_021FBF24 + cmp r0, #0 + movne r4, #4 + bne _021FCA80 + mov r0, r5 + bl ov00_021FCB54 + mov r4, r0 + b _021FCA80 +_021FCA30: + ldrb r1, [r5, #0xd0b] + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x1c + cmp r1, #1 + movhs r4, #6 + bhs _021FCA80 + bl ov00_021FC73C + mov r4, r0 + b _021FCA80 +_021FCA54: + bl ov00_021FCB54 + mov r4, r0 + b _021FCA80 +_021FCA60: + ldrb r1, [r5, #0xd0b] + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x1c + cmp r1, #1 + movhs r4, #6 + bhs _021FCA80 + bl ov00_021FC73C + mov r4, r0 +_021FCA80: + mov r0, r4 + bl ov00_021FC568 + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FC9CC + + arm_func_start ov00_021FCA90 +ov00_021FCA90: ; 0x021FCA90 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + cmp r4, #0x11 + moveq r0, r4 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r2, [r5, #0xd12] + mov r1, #0 + cmp r2, #0 + bls _021FCAD8 +_021FCAB8: + add r0, r5, r1, lsl #2 + ldrb r0, [r0, #0x444] + cmp r0, #0 + beq _021FCAD8 + add r0, r1, #1 + and r1, r0, #0xff + cmp r1, r2 + blo _021FCAB8 +_021FCAD8: + cmp r4, #6 + bne _021FCB0C + cmp r2, r1 + bne _021FCB38 + cmp r1, #0 + bne _021FCAFC + mov r0, #5 + bl ov00_021FAEE8 + b _021FCB04 +_021FCAFC: + mov r0, #6 + bl ov00_021FAEE8 +_021FCB04: + mov r0, #0x11 + ldmia sp!, {r3, r4, r5, pc} +_021FCB0C: + cmp r2, #0 + moveq r0, r4 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r2, r1 + moveq r0, r4 + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r5, r1, lsl #2 + ldrb r0, [r0, #0x446] + cmp r0, #0x14 + movlo r0, r4 + ldmloia sp!, {r3, r4, r5, pc} +_021FCB38: + strb r1, [r5, #0xd13] + bl WCM_EndSearchAsync + cmp r0, #1 + strneb r4, [r5, #0xd0e] + movne r4, #7 + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FCA90 + + arm_func_start ov00_021FCB54 +ov00_021FCB54: ; 0x021FCB54 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0xd00 + ldrh r0, [r0, #0x16] + cmp r0, #0 + beq _021FCB90 + mov r0, #2 + bl ov00_021FBF24 + cmp r0, #0 + beq _021FCB90 + mov r0, #0 + bl ov00_021FC500 + strb r0, [r4, #0xd11] + mov r0, #5 + ldmia sp!, {r4, pc} +_021FCB90: + ldrb r0, [r4, #0xd0b] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1c + cmp r0, #1 + movhs r0, #6 + ldmhsia sp!, {r4, pc} + mov r0, r4 + bl ov00_021FC73C + ldmia sp!, {r4, pc} + arm_func_end ov00_021FCB54 + + arm_func_start ov00_021FCBB4 +ov00_021FCBB4: ; 0x021FCBB4 + stmdb sp!, {r3, lr} + ldr ip, _021FCBD4 ; =ov00_02216074 + cmp r2, #0xc + movgt r2, #0xc + ldr r2, [ip, r2, lsl #2] + orr r2, r3, r2 + bl WCM_SearchAsync + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FCBD4: .word ov00_02216074 + arm_func_end ov00_021FCBB4 + + arm_func_start ov00_021FCBD8 +ov00_021FCBD8: ; 0x021FCBD8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + bl WCM_GetPhase + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + cmp r4, #1 + bne _021FCC44 + ldrb r1, [r0, #0xd0a] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + str r0, [sp, #0xc] + bl ov00_021FBF24 + ldr r1, _021FCC5C ; =ov00_021FB62C + add r0, sp, #0 + bl WCM_StartupAsync + cmp r0, #1 + beq _021FCC30 + cmp r0, #4 + blt _021FCC50 +_021FCC30: + mov r0, #1 + bl ov00_021FAEE8 + add sp, sp, #0x10 + mov r0, #0x11 + ldmia sp!, {r4, pc} +_021FCC44: + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r4, pc} +_021FCC50: + mov r0, #2 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FCC5C: .word ov00_021FB62C + arm_func_end ov00_021FCBD8 + + arm_func_start ov00_021FCC60 +ov00_021FCC60: ; 0x021FCC60 + stmdb sp!, {r3, r4, r5, lr} + bl ov00_021FAECC + mov r4, r0 + mov r0, #0x10 + bl ov00_021FAE14 + mov r5, r0 + bl WCM_GetPhase + cmp r0, #9 + bne _021FCD04 + sub r0, r4, #0xa + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _021FCD54 +_021FCC94: ; jump table + b _021FCCAC ; case 0 + b _021FCCF8 ; case 1 + b _021FCCBC ; case 2 + b _021FCCCC ; case 3 + b _021FCCD8 ; case 4 + b _021FCCE8 ; case 5 +_021FCCAC: + mov r0, r5 + bl ov00_021FCD5C + mov r4, r0 + b _021FCD54 +_021FCCBC: + mov r0, r5 + bl ov00_021FCDC0 + mov r4, r0 + b _021FCD54 +_021FCCCC: + bl ov00_021FCE50 + mov r4, r0 + b _021FCD54 +_021FCCD8: + mov r0, r5 + bl ov00_021FCE7C + mov r4, r0 + b _021FCD54 +_021FCCE8: + mov r0, r5 + bl ov00_021FCEE8 + mov r4, r0 + b _021FCD54 +_021FCCF8: + bl ov00_021FCEFC + mov r4, r0 + b _021FCD54 +_021FCD04: + cmp r4, #0xb + beq _021FCD2C + cmp r4, #0xe + beq _021FCD38 + cmp r4, #0xf + bne _021FCD40 + mov r0, r5 + bl ov00_021FCEE8 + mov r4, r0 + b _021FCD54 +_021FCD2C: + bl ov00_021FCEFC + mov r4, r0 + b _021FCD54 +_021FCD38: + bl ov00_021EA518 + bl ov00_021EA420 +_021FCD40: + ldrb r0, [r5, #0xd13] + mov r1, #2 + mov r4, #0xb + add r0, r5, r0, lsl #2 + strb r1, [r0, #0x444] +_021FCD54: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FCC60 + + arm_func_start ov00_021FCD5C +ov00_021FCD5C: ; 0x021FCD5C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + bl ov00_021FAE14 + mov r5, r0 + mov r0, #4 + bl ov00_021FAE14 + mov r4, r0 + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl ov00_021FCF2C + ldr r1, _021FCDBC ; =_021D4420 + mov r2, #4 + mov r0, r4 + str r2, [r1] + bl SOC_Startup + cmp r0, #0 + moveq r0, #0xc + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #2 + bl ov00_021FAEE8 + mov r0, #0x11 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FCDBC: .word _021D4420 + arm_func_end ov00_021FCD5C + + arm_func_start ov00_021FCDC0 +ov00_021FCDC0: ; 0x021FCDC0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl SOC_GetHostID + cmp r0, #0 + beq _021FCDF8 + mov r0, r4 + bl ov00_021FD094 + ldrb r0, [r4, #0xd0c] + mov r0, r0, lsl #0x1a + mov r0, r0, lsr #0x1e + cmp r0, #1 + moveq r0, #0xf + movne r0, #0xd + ldmia sp!, {r4, pc} +_021FCDF8: + bl OS_GetTick + ldr r3, [r4, #0xcb0] + ldr r2, [r4, #0xcb4] + subs r3, r0, r3 + sbc r0, r1, r2 + mov r1, r0, lsl #6 + ldr r2, _021FCE4C ; =0x01FF6210 + orr r1, r1, r3, lsr #26 + mov r0, r3, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r1, #0 + cmpeq r0, #0xa + movlo r0, #0xc + ldmloia sp!, {r4, pc} + ldrb r1, [r4, #0xd13] + mov r2, #1 + mov r0, #0xb + add r1, r4, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FCE4C: .word 0x01FF6210 + arm_func_end ov00_021FCDC0 + + arm_func_start ov00_021FCE50 +ov00_021FCE50: ; 0x021FCE50 + stmdb sp!, {r3, lr} + mov r0, #8 + bl ov00_021FAE14 + bl ov00_021EA340 + cmp r0, #0 + moveq r0, #0xe + ldmeqia sp!, {r3, pc} + mov r0, #3 + bl ov00_021FAEE8 + mov r0, #0x11 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FCE50 + + arm_func_start ov00_021FCE7C +ov00_021FCE7C: ; 0x021FCE7C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + bl ov00_021FAE14 + mov r4, r0 + bl ov00_021EA580 + movs r5, r0 + beq _021FCEE0 + ldrb r0, [r6, #0xd0d] + bl ov00_021FAFC8 + ldrb r1, [r4, #0x15] + cmp r1, r0 + bne _021FCEB8 + bl ov00_021EA5C0 + str r0, [r4, #0x10] +_021FCEB8: + bl ov00_021EA420 + cmp r5, #0xb + moveq r0, #0xf + ldmeqia sp!, {r4, r5, r6, pc} + ldrb r1, [r6, #0xd13] + mov r2, #1 + mov r0, #0xb + add r1, r6, r1, lsl #2 + strb r2, [r1, #0x444] + ldmia sp!, {r4, r5, r6, pc} +_021FCEE0: + mov r0, #0xe + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021FCE7C + + arm_func_start ov00_021FCEE8 +ov00_021FCEE8: ; 0x021FCEE8 + stmdb sp!, {r3, lr} + ldrb r0, [r0, #0xd0d] + bl ov00_021FAF20 + mov r0, #0x10 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FCEE8 + + arm_func_start ov00_021FCEFC +ov00_021FCEFC: ; 0x021FCEFC + stmdb sp!, {r3, lr} + bl SOCL_CalmDown + cmp r0, #0 + movne r0, #0xb + ldmneia sp!, {r3, pc} + bl SOC_Cleanup + cmp r0, #0 + mvnne r1, #0x26 + cmpne r0, r1 + moveq r0, #9 + movne r0, #0xb + ldmia sp!, {r3, pc} + arm_func_end ov00_021FCEFC + + arm_func_start ov00_021FCF2C +ov00_021FCF2C: ; 0x021FCF2C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r4, r2 + mov r5, r1 + ldr r0, _021FCFE8 ; =ov00_022160A8 + mov r1, r4 + mov r2, #0x58 + bl MI_CpuCopy8 + ldr r0, [r6] + str r0, [r4, #4] + ldr r0, [r6, #4] + str r0, [r4, #8] + ldrb r0, [r5, #0xd0d] + cmp r0, #6 + ldmhsia sp!, {r4, r5, r6, pc} + bl ov00_021FAFC8 + add r5, r5, r0, lsl #8 + ldrb r0, [r5, #0xc0] + cmp r0, #0 + beq _021FCFC4 + mov r0, #0 + str r0, [r4, #0xc] + add r0, r5, #0xc0 + bl ov00_021FCFEC + str r0, [r4, #0x10] + ldrb r0, [r5, #0xd0] + bl ov00_021FD040 + str r0, [r4, #0x14] + add r0, r5, #0xc4 + bl ov00_021FCFEC + str r0, [r4, #0x18] + add r0, r5, #0xc8 + bl ov00_021FCFEC + str r0, [r4, #0x1c] + add r0, r5, #0xcc + bl ov00_021FCFEC + str r0, [r4, #0x20] + ldmia sp!, {r4, r5, r6, pc} +_021FCFC4: + mov r0, #1 + str r0, [r4, #0xc] + mov r0, #0 + str r0, [r4, #0x10] + str r0, [r4, #0x14] + str r0, [r4, #0x18] + str r0, [r4, #0x1c] + str r0, [r4, #0x20] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FCFE8: .word ov00_022160A8 + arm_func_end ov00_021FCF2C + + arm_func_start ov00_021FCFEC +ov00_021FCFEC: ; 0x021FCFEC + ldrb r1, [r0] + ldrb r2, [r0, #1] + mov r3, #0 + orr r3, r3, r1, lsl #24 + ldrb r1, [r0, #2] + orr r2, r3, r2, lsl #16 + ldrb r0, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r3, r1, r0 + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + mov r3, r3, lsl #0x18 + and r1, r1, #0xff + and r0, r0, #0xff00 + and r2, r2, #0xff0000 + orr r0, r1, r0 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + bx lr + arm_func_end ov00_021FCFEC + + arm_func_start ov00_021FD040 +ov00_021FD040: ; 0x021FD040 + rsb r1, r0, #0x20 + cmp r1, #0 + mvn r3, #0 + mov r0, #0 + ble _021FD064 +_021FD054: + add r0, r0, #1 + cmp r0, r1 + mov r3, r3, lsl #1 + blt _021FD054 +_021FD064: + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + mov r3, r3, lsl #0x18 + and r1, r1, #0xff + and r0, r0, #0xff00 + and r2, r2, #0xff0000 + orr r0, r1, r0 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + bx lr + arm_func_end ov00_021FD040 + + arm_func_start ov00_021FD094 +ov00_021FD094: ; 0x021FD094 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + ldrb r0, [r4, #0xd0d] + cmp r0, #6 + addhs sp, sp, #8 + ldmhsia sp!, {r4, pc} + bl ov00_021FAFC8 + add r4, r4, r0, lsl #8 + ldrb r0, [r4, #0xc0] + ldrb r2, [r4, #0xc8] + ldrb r1, [r4, #0xc9] + cmp r0, #0 + ldrb r3, [r4, #0xca] + add r1, r2, r1 + ldrb r2, [r4, #0xcb] + add r1, r3, r1 + addne sp, sp, #8 + add r0, r2, r1 + ldmneia sp!, {r4, pc} + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, pc} + add r0, r4, #0xc8 + bl ov00_021FCFEC + str r0, [sp, #4] + add r0, r4, #0xcc + bl ov00_021FCFEC + str r0, [sp] + add r0, sp, #4 + add r1, sp, #0 + bl SOC_SetResolver + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FD094 + + arm_func_start ov00_021FD11C +ov00_021FD11C: ; 0x021FD11C + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + add r1, sp, #0 + bl ov00_021FD1FC + ldr r1, _021FD150 ; =ov00_02217C0C + add r0, sp, #0 + mov r2, #8 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FD150: .word ov00_02217C0C + arm_func_end ov00_021FD11C + + arm_func_start ov00_021FD154 +ov00_021FD154: ; 0x021FD154 + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + mov r4, r1 + add r1, sp, #0 + bl ov00_021FD1FC + add r0, sp, #0 + mov r1, r4 + bl ov00_021FD300 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FD154 + + arm_func_start ov00_021FD17C +ov00_021FD17C: ; 0x021FD17C + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + mov r4, r1 + add r1, sp, #0 + bl ov00_021FD1FC + ldr r1, _021FD1C4 ; =ov00_02217C0C + add r0, sp, #0 + mov r2, #8 + bl memcmp + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, pc} + add r0, sp, #8 + mov r1, r4 + mov r2, #0xa + bl MI_CpuCopy8 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FD1C4: .word ov00_02217C0C + arm_func_end ov00_021FD17C + + arm_func_start ov00_021FD1C8 +ov00_021FD1C8: ; 0x021FD1C8 + stmdb sp!, {r3, lr} + ldr r1, _021FD1E8 ; =ov00_02217C18 + mov r2, #8 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FD1E8: .word ov00_02217C18 + arm_func_end ov00_021FD1C8 + + arm_func_start ov00_021FD1EC +ov00_021FD1EC: ; 0x021FD1EC + ldr ip, _021FD1F8 ; =ov00_021FD34C + add r0, r0, #0xc + bx ip + .balign 4, 0 +_021FD1F8: .word ov00_021FD34C + arm_func_end ov00_021FD1EC + + arm_func_start ov00_021FD1FC +ov00_021FD1FC: ; 0x021FD1FC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + ldr lr, _021FD2F8 ; =ov00_02216103 + add ip, sp, #0 + mov r4, r1 + mov r3, #0xc +_021FD214: + ldrb r2, [lr] + ldrb r1, [lr, #1] + add lr, lr, #2 + strb r2, [ip] + strb r1, [ip, #1] + add ip, ip, #2 + subs r3, r3, #1 + bne _021FD214 + mov r1, r4 + mov r2, #0x20 + mov r3, #0x18 + bl ov00_021FD568 + ldr r0, _021FD2FC ; =ov00_02217BA4 + mov r3, #0 +_021FD24C: + ldr r1, [r0, #8] + ldrb r2, [r4, r3] + ldrsb r1, [r1, r3] + eor r1, r2, r1 + strb r1, [r4, r3] + add r3, r3, #1 + cmp r3, #0x18 + blt _021FD24C + mov r7, #0 + add ip, sp, #0 + mov r1, #0xff +_021FD278: + and lr, r7, #0xff + ldrb r0, [ip, lr] + mov r5, lr + ldrb r6, [r4, r7] + cmp r0, #0xff + beq _021FD2BC +_021FD290: + add r3, ip, r5 + ldrb r5, [ip, r5] + ldrb r0, [ip, lr] + ldrb r2, [r4, r5] + mov lr, r5 + strb r6, [r4, r0] + strb r1, [r3] + ldrb r0, [ip, r5] + mov r6, r2 + cmp r0, #0xff + bne _021FD290 +_021FD2BC: + add r7, r7, #1 + cmp r7, #0x18 + blt _021FD278 + ldr r0, _021FD2FC ; =ov00_02217BA4 + mov r3, #0 +_021FD2D0: + ldr r1, [r0] + ldrb r2, [r4, r3] + ldrsb r1, [r1, r3] + eor r1, r2, r1 + strb r1, [r4, r3] + add r3, r3, #1 + cmp r3, #0x18 + blt _021FD2D0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FD2F8: .word ov00_02216103 +_021FD2FC: .word ov00_02217BA4 + arm_func_end ov00_021FD1FC + + arm_func_start ov00_021FD300 +ov00_021FD300: ; 0x021FD300 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x6c + mov r5, r0 + add r0, sp, #0x14 + mov r4, r1 + bl DGT_Hash1Reset + add r0, sp, #0x14 + mov r1, r5 + mov r2, #0x18 + bl DGT_Hash1SetSource + add r0, sp, #0 + add r1, sp, #0x14 + bl DGT_Hash1GetDigest_R + add r0, sp, #3 + mov r1, r4 + mov r2, #0xd + bl MI_CpuCopy8 + add sp, sp, #0x6c + ldmia sp!, {r4, r5, pc} + arm_func_end ov00_021FD300 + + arm_func_start ov00_021FD34C +ov00_021FD34C: ; 0x021FD34C + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr lr, _021FD4E8 ; =0x92492493 + mov r4, r1 + mov r1, #0 + mov ip, #7 +_021FD364: + smull r2, r3, lr, r1 + add r3, r1, r3 + mov r2, r1, lsr #0x1f + add r3, r2, r3, asr #2 + smull r2, r3, ip, r3 + sub r3, r1, r2 + add r2, r0, r3 + ldrb r3, [r0, r1] + ldrb r2, [r2, #0xd] + eor r2, r3, r2 + strb r2, [r4, r1] + add r1, r1, #1 + cmp r1, #0xd + blt _021FD364 + mov ip, #0 +_021FD3A0: + add r3, r4, ip + add r1, r0, ip + ldrb r2, [r3, #3] + ldrb r1, [r1, #0xd] + add ip, ip, #1 + cmp ip, #7 + eor r1, r2, r1 + strb r1, [r3, #3] + blt _021FD3A0 + ldr r0, _021FD4EC ; =ov00_02217BA4 + mov r3, #0 +_021FD3CC: + ldr r1, [r0, #4] + ldrb r2, [r4, r3] + ldrsb r1, [r1, r3] + eor r1, r2, r1 + strb r1, [r4, r3] + add r3, r3, #1 + cmp r3, #0xd + blt _021FD3CC + add r1, sp, #0 + mov r0, r4 + mov r2, #0xd + bl MI_CpuCopy8 + ldr r3, _021FD4F0 ; =ov00_0221611C + add r2, sp, #0 + mov ip, #0 +_021FD408: + ldrb r1, [r2], #1 + ldrb r0, [r3], #1 + add ip, ip, #1 + cmp ip, #0xd + strb r1, [r4, r0] + blt _021FD408 + ldr r0, _021FD4EC ; =ov00_02217BA4 + mov r3, #0 +_021FD428: + ldr r1, [r0, #0xc] + ldrb r2, [r4, r3] + ldrsb r1, [r1, r3] + eor r1, r2, r1 + strb r1, [r4, r3] + add r3, r3, #1 + cmp r3, #0xd + blt _021FD428 + ldr r2, _021FD4F4 ; =ov00_0221612C + mov ip, #0 +_021FD450: + ldrb r3, [r4, ip] + mov r0, r3, asr #4 + and r1, r0, #0xf + and r0, r3, #0xf + ldrb r1, [r2, r1] + ldrb r0, [r2, r0] + orr r0, r0, r1, lsl #4 + strb r0, [r4, ip] + add ip, ip, #1 + cmp ip, #0xd + blt _021FD450 + mov r1, #0 +_021FD480: + add r0, r4, r1 + ldrb r3, [r4, r1] + ldrb r2, [r0, #6] + eor r2, r3, r2 + strb r2, [r4, r1] + ldrb r3, [r0, #3] + ldrb r2, [r0, #9] + eor r2, r3, r2 + strb r2, [r0, #3] + ldrb r3, [r0, #6] + and r2, r2, #0xff + eor r2, r3, r2 + strb r2, [r0, #6] + ldrb r3, [r0, #9] + ldrb r2, [r4, r1] + eor r2, r3, r2 + strb r2, [r0, #9] + ldrb r0, [r4, r1] + ldrb r2, [r4, #0xc] + add r1, r1, #1 + cmp r1, #3 + eor r0, r2, r0 + strb r0, [r4, #0xc] + blt _021FD480 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FD4E8: .word 0x92492493 +_021FD4EC: .word ov00_02217BA4 +_021FD4F0: .word ov00_0221611C +_021FD4F4: .word ov00_0221612C + arm_func_end ov00_021FD34C + + arm_func_start ov00_021FD4F8 +ov00_021FD4F8: ; 0x021FD4F8 + cmp r0, #0x41 + blo _021FD50C + cmp r0, #0x5a + subls r0, r0, #0x41 + bxls lr +_021FD50C: + cmp r0, #0x61 + blo _021FD524 + cmp r0, #0x7a + subls r0, r0, #0x61 + addls r0, r0, #0x1a + bxls lr +_021FD524: + cmp r0, #0x30 + blo _021FD53C + cmp r0, #0x39 + subls r0, r0, #0x30 + addls r0, r0, #0x34 + bxls lr +_021FD53C: + cmp r0, #0x2b + moveq r0, #0x3e + bxeq lr + cmp r0, #0x2f + moveq r0, #0x3f + bxeq lr + cmp r0, #0x3d + movne r0, #1 + moveq r0, #0 + rsb r0, r0, #0 + bx lr + arm_func_end ov00_021FD4F8 + + arm_func_start ov00_021FD568 +ov00_021FD568: ; 0x021FD568 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + add r4, r2, r2, lsl #1 + str r0, [sp] + mov r0, r4, lsr #2 + str r1, [sp, #4] + cmp r3, r4, lsr #2 + str r0, [sp, #8] + blo _021FD59C + and fp, r2, #3 + sub r0, r2, fp + str r0, [sp, #0xc] + b _021FD5A8 +_021FD59C: + add sp, sp, #0x18 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_021FD5A8: + cmp r0, #0 + mov r7, #0 + ble _021FD630 + mov sb, r7 + add r5, sp, #0x14 + mov r4, #6 +_021FD5C0: + ldr r0, [sp] + mov r6, #0 + mov r8, r6 + add sl, r0, r7 +_021FD5D0: + ldrb r0, [sl], #1 + bl ov00_021FD4F8 + rsb r1, r8, #3 + mul r2, r1, r4 + orr r6, r6, r0, lsl r2 + add r8, r8, #1 + cmp r8, #4 + blt _021FD5D0 + ldr r0, [sp, #4] + add r1, sb, sb, lsl #1 + mov r2, #0 + str r6, [sp, #0x14] + add r1, r0, r1 +_021FD604: + rsb r0, r2, #2 + ldrb r0, [r5, r0] + add r2, r2, #1 + cmp r2, #3 + strb r0, [r1], #1 + blt _021FD604 + ldr r0, [sp, #0xc] + add r7, r7, #4 + cmp r7, r0 + add sb, sb, #1 + blt _021FD5C0 +_021FD630: + cmp fp, #0 + beq _021FD6C4 + mov r5, #0 + mov r6, r5 + str r5, [sp, #0x10] + ble _021FD684 + ldr r1, [sp] + ldr r0, [sp, #0xc] + mov r8, r5 + add r4, r1, r0 + mov r7, #6 +_021FD65C: + ldrb r0, [r4], #1 + bl ov00_021FD4F8 + rsb r1, r6, #3 + mul r2, r1, r7 + orr r5, r5, r0, lsl r2 + add r6, r6, #1 + cmp r6, fp + orr r8, r8, r5 + blt _021FD65C + str r8, [sp, #0x10] +_021FD684: + cmp fp, #0 + mov r3, #0 + ble _021FD6C4 + ldr r0, [sp, #0xc] + add r1, r0, r0, lsl #1 + mov r0, r1, asr #1 + add r1, r1, r0, lsr #30 + ldr r0, [sp, #4] + add r2, r0, r1, asr #2 + add r1, sp, #0x10 +_021FD6AC: + rsb r0, r3, #2 + ldrb r0, [r1, r0] + add r3, r3, #1 + cmp r3, fp + strb r0, [r2], #1 + blt _021FD6AC +_021FD6C4: + ldr r0, [sp, #8] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021FD568 + + arm_func_start ov00_021FD6D0 +ov00_021FD6D0: ; 0x021FD6D0 + tst r0, #2 + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + and r0, r0, #0xff + bx lr + arm_func_end ov00_021FD6D0 + + arm_func_start ov00_021FD6E4 +ov00_021FD6E4: ; 0x021FD6E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x410 + ldr r1, _021FD9B4 ; =ov00_0221B0C0 + mov r6, r0 + ldr r0, [r1] + mov r1, #0x400 + add r0, r0, #0xf00 + bl DC_InvalidateRange + ldrh r0, [r6, #2] + cmp r0, #0 + ldreqh r0, [r6, #8] + cmpeq r0, #5 + bne _021FD978 + ldrh r0, [r6, #0xe] + mov r5, #0 + cmp r0, #0 + bls _021FD978 +_021FD728: + add r0, r6, r5, lsl #2 + ldr r0, [r0, #0x10] + ldrh r1, [r0, #0x40] + cmp r1, #1 + ldreq r2, [r0, #0x44] + ldreq r1, _021FD9B8 ; =0x00000857 + cmpeq r2, r1 + bne _021FD968 + ldr r1, _021FD9B4 ; =ov00_0221B0C0 + mov r4, #0 + ldr ip, [r1] + mov r3, r4 + add r2, ip, #0x1000 + ldr r1, [r2, #0xa88] + cmp r1, #0 + bls _021FD794 + ldrh r7, [r0, #0x48] +_021FD76C: + add r1, ip, r3, lsl #1 + add r1, r1, #0x1a00 + ldrh r1, [r1, #0x68] + cmp r1, r7 + moveq r4, #1 + beq _021FD794 + ldr r1, [r2, #0xa88] + add r3, r3, #1 + cmp r3, r1 + blo _021FD76C +_021FD794: + cmp r4, #1 + beq _021FD968 + ldr r1, _021FD9B4 ; =ov00_0221B0C0 + mov r2, #0x70 + ldr r1, [r1] + add r0, r0, #0x50 + add r3, r1, #0x1000 + add r1, r1, #0x348 + ldr r3, [r3, #0xa8c] + add r1, r1, #0x1000 + mla r1, r3, r2, r1 + bl MI_CpuCopy8 + ldr r0, _021FD9BC ; =ov00_0221613C + add r1, sp, #0 + mov r2, #4 + bl MI_CpuCopy8 + add r0, r6, r5, lsl #2 + ldr r0, [r0, #0x10] + add r1, sp, #4 + add r0, r0, #6 + mov r2, #4 + bl MI_CpuCopy8 + add r0, sp, #8 + add r1, sp, #0 + mov r2, #8 + bl CRYPTO_RC4FastInit + ldr r0, _021FD9B4 ; =ov00_0221B0C0 + mov r2, #0x70 + ldr r3, [r0] + add r0, sp, #8 + add r1, r3, #0x348 + add r4, r1, #0x1000 + add r1, r3, #0x1000 + ldr r1, [r1, #0xa8c] + mul r3, r1, r2 + add r1, r4, r3 + add r3, r4, r3 + bl CRYPTO_RC4FastEncrypt + ldr r0, _021FD9B4 ; =ov00_0221B0C0 + mov r1, #0x70 + ldr ip, [r0] + mov r3, #0x6e + add r0, ip, #0x348 + add r4, r0, #0x1000 + add r0, ip, #0x1000 + ldr r2, [r0, #0xa8c] + add r0, ip, #0x96 + mul r7, r2, r1 + add r1, ip, #0x294 + add r0, r0, #0x1a00 + add r1, r1, #0x1800 + add r2, r4, r7 + bl MATHi_CRC16UpdateRev + ldr r0, _021FD9B4 ; =ov00_0221B0C0 + add r1, r4, r7 + ldr r0, [r0] + mov r2, #0x6e + add r0, r0, #0x96 + add r0, r0, #0x1a00 + bl MATH_CalcCRC16 + ldr r1, _021FD9B4 ; =ov00_0221B0C0 + mov r2, #0x70 + ldr r4, [r1] + add r1, r4, #0x1000 + ldr r1, [r1, #0xa8c] + mul r3, r1, r2 + add r1, r4, r3 + add r1, r1, #0x1300 + ldrh r1, [r1, #0xb6] + cmp r0, r1 + cmpne r1, #0 + beq _021FD8CC + add r0, r4, #0x348 + add r0, r0, #0x1000 + add r0, r0, r3 + mov r1, #0 + bl MI_CpuFill8 + b _021FD968 +_021FD8CC: + add r0, r6, r5, lsl #2 + ldr r0, [r0, #0x10] + ldrh r0, [r0, #2] + and r0, r0, #0xff + bl ov00_021FD6D0 + add r1, r4, #0x1000 + ldr r1, [r1, #0xa8c] + ldr r3, _021FD9B4 ; =ov00_0221B0C0 + add r1, r4, r1, lsl #1 + add r1, r1, #0x1a00 + strh r0, [r1, #0x48] + ldr r2, [r3] + add r1, r6, r5, lsl #2 + add r0, r2, #0x1000 + ldr r1, [r1, #0x10] + ldr r0, [r0, #0xa8c] + ldrh r1, [r1, #0x48] + add r0, r2, r0, lsl #1 + add r0, r0, #0x1a00 + strh r1, [r0, #0x68] + ldr r0, [r3] + add r2, r0, #0x1000 + ldr r0, [r2, #0xa8c] + add r0, r0, #1 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #28 + add r0, r1, r0, ror #28 + str r0, [r2, #0xa8c] + ldr r0, [r3] + add r0, r0, #0x1000 + ldr r1, [r0, #0xa88] + add r1, r1, #1 + str r1, [r0, #0xa88] + ldr r0, [r3] + add r0, r0, #0x1000 + ldr r1, [r0, #0xa88] + cmp r1, #0x10 + movgt r1, #0x10 + strgt r1, [r0, #0xa88] +_021FD968: + ldrh r0, [r6, #0xe] + add r5, r5, #1 + cmp r5, r0 + blo _021FD728 +_021FD978: + ldr r1, _021FD9B4 ; =ov00_0221B0C0 + mov r2, #2 + ldr r0, [r1] + add r0, r0, #0x1000 + str r2, [r0, #0xa90] + ldr r0, [r1] + add r0, r0, #0x1000 + ldr r1, [r0, #0x344] + cmp r1, #0 + addeq sp, sp, #0x410 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + blx r1 + add sp, sp, #0x410 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FD9B4: .word ov00_0221B0C0 +_021FD9B8: .word 0x00000857 +_021FD9BC: .word ov00_0221613C + arm_func_end ov00_021FD6E4 + + arm_func_start ov00_021FD9C0 +ov00_021FD9C0: ; 0x021FD9C0 + ldr r0, _021FD9C8 ; =0x00001CA0 + bx lr + .balign 4, 0 +_021FD9C8: .word 0x00001CA0 + arm_func_end ov00_021FD9C0 + + arm_func_start ov00_021FD9CC +ov00_021FD9CC: ; 0x021FD9CC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r1 + mov r4, r2 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _021FDA54 ; =ov00_0221B0C0 + str r0, [r1] + bl ov00_021FD9C0 + ldr r1, _021FDA54 ; =ov00_0221B0C0 + mov r2, r0 + ldr r0, [r1] + mov r1, #0 + bl MI_CpuFill8 + ldr r2, _021FDA54 ; =ov00_0221B0C0 + mov r3, #0 + ldr r0, [r2] + ldr r1, _021FDA58 ; =0x0000A001 + add r0, r0, #0x1000 + str r3, [r0, #0xa90] + ldr r0, [r2] + add r0, r0, #0x1a00 + strh r3, [r0, #0x94] + ldr r0, [r2] + add r0, r0, #0x96 + add r0, r0, #0x1a00 + bl MATHi_CRC16InitTableRev + ldr r0, _021FDA54 ; =ov00_0221B0C0 + mov r1, r5 + ldr r0, [r0] + mov r2, r4 + bl WM_Initialize + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FDA54: .word ov00_0221B0C0 +_021FDA58: .word 0x0000A001 + arm_func_end ov00_021FD9CC + + arm_func_start ov00_021FDA5C +ov00_021FDA5C: ; 0x021FDA5C + stmdb sp!, {r3, lr} + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _021FDA98 ; =ov00_0221B0C0 + mov ip, #3 + ldr r1, [r2] + mov r3, #0 + add r1, r1, #0x1000 + str ip, [r1, #0xa90] + str r3, [r2] + bl WM_End + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FDA98: .word ov00_0221B0C0 + arm_func_end ov00_021FDA5C + + arm_func_start ov00_021FDA9C +ov00_021FDA9C: ; 0x021FDA9C + stmdb sp!, {r4, lr} + movs r4, r0 + mvneq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _021FDB5C ; =ov00_0221B0C0 + mov r2, #0x400 + ldr r0, [r1] + add r3, r0, #0xf00 + add r0, r0, #0x1000 + str r3, [r0, #0x300] + ldr r0, [r1] + add r0, r0, #0x1300 + strh r2, [r0, #4] + bl WM_GetAllowedChannel + ldr r1, _021FDB5C ; =ov00_0221B0C0 + ldr r1, [r1] + add r1, r1, #0x1300 + strh r0, [r1, #6] + bl WM_GetDispersionScanPeriod + ldr r3, _021FDB5C ; =ov00_0221B0C0 + mov ip, #1 + ldr r2, [r3] + mov r1, #0xff + add r2, r2, #0x1300 + strh r0, [r2, #8] + ldr r0, [r3] + mov r2, #6 + add r0, r0, #0x1300 + strh ip, [r0, #0x10] + ldr r0, [r3] + add r0, r0, #0xa + add r0, r0, #0x1300 + bl MI_CpuFill8 + ldr r2, _021FDB5C ; =ov00_0221B0C0 + mov r3, #1 + ldr r1, [r2] + ldr r0, _021FDB60 ; =ov00_021FD6E4 + add r1, r1, #0x1000 + str r4, [r1, #0x344] + ldr r1, [r2] + add r1, r1, #0x1000 + str r3, [r1, #0xa90] + ldr r1, [r2] + add r1, r1, #0x1300 + bl WM_StartScanEx + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FDB5C: .word ov00_0221B0C0 +_021FDB60: .word ov00_021FD6E4 + arm_func_end ov00_021FDA9C + + arm_func_start ov00_021FDB64 +ov00_021FDB64: ; 0x021FDB64 + stmdb sp!, {r3, lr} + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r1, _021FDB98 ; =ov00_0221B0C0 + mov r2, #2 + ldr r1, [r1] + add r1, r1, #0x1000 + str r2, [r1, #0xa90] + bl WM_EndScan + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FDB98: .word ov00_0221B0C0 + arm_func_end ov00_021FDB64 + + arm_func_start ov00_021FDB9C +ov00_021FDB9C: ; 0x021FDB9C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _021FDC34 ; =ov00_0221B0C0 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + add r0, r0, #0x1000 + ldr r1, [r0, #0xa90] + cmp r1, #2 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r5, #0 + blt _021FDBD8 + ldr r0, [r0, #0xa88] + cmp r5, r0 + blt _021FDBE0 +_021FDBD8: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021FDBE0: + mov r0, r4 + mov r1, #0 + mov r2, #0x78 + bl MI_CpuFill8 + mov r0, #1 + ldr r3, _021FDC34 ; =ov00_0221B0C0 + str r0, [r4] + ldr r0, [r3] + mov r2, #0x70 + add r0, r0, r5, lsl #1 + add r0, r0, #0x1a00 + ldrh r0, [r0, #0x48] + add r1, r4, #6 + strh r0, [r4, #4] + ldr r0, [r3] + add r0, r0, #0x348 + add r0, r0, #0x1000 + mla r0, r5, r2, r0 + bl MI_CpuCopy8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FDC34: .word ov00_0221B0C0 + arm_func_end ov00_021FDB9C + + arm_func_start ov00_021FDC38 +ov00_021FDC38: ; 0x021FDC38 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _021FDCD8 ; =ov00_0221B0C0 + mov r5, r0 + ldr r1, [r1] + add r1, r1, #0x1000 + ldr r1, [r1, #0xa90] + cmp r1, #2 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, #0 + mov r2, #0x780 + bl MI_CpuFill8 + mov r0, #0 + mov r1, r5 + mov r4, r0 +_021FDC74: + add r0, r0, #1 + cmp r0, #0x10 + str r4, [r1], #0x78 + blt _021FDC74 + ldr r7, _021FDCD8 ; =ov00_0221B0C0 + ldr r0, [r7] + add r0, r0, #0x1000 + ldr r0, [r0, #0xa88] + cmp r0, #0 + ble _021FDCD0 + mvn r6, #0 +_021FDCA0: + mov r0, r4 + mov r1, r5 + bl ov00_021FDB9C + cmp r0, r6 + beq _021FDCD0 + ldr r0, [r7] + add r4, r4, #1 + add r0, r0, #0x1000 + ldr r0, [r0, #0xa88] + add r5, r5, #0x78 + cmp r4, r0 + blt _021FDCA0 +_021FDCD0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FDCD8: .word ov00_0221B0C0 + arm_func_end ov00_021FDC38 + + arm_func_start ov00_021FDCDC +ov00_021FDCDC: ; 0x021FDCDC + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021FD9C0 + mov r1, r0 + mov r0, #1 + bl ov00_021EC2A8 + ldr r2, _021FDD38 ; =ov00_0221B0C4 + mov r1, #0x790 + str r0, [r2, #4] + mov r0, #1 + bl ov00_021EC2A8 + ldr r3, _021FDD38 ; =ov00_0221B0C4 + mov r1, #0 + mov r2, #0x790 + str r0, [r3] + bl MI_CpuFill8 + ldr r1, _021FDD38 ; =ov00_0221B0C4 + mov r2, #0 + ldr r3, [r1] + mov r0, #1 + str r4, [r3] + str r2, [r1, #8] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FDD38: .word ov00_0221B0C4 + arm_func_end ov00_021FDCDC + + arm_func_start ov00_021FDD3C +ov00_021FDD3C: ; 0x021FDD3C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, _021FE050 ; =ov00_0221B0C4 + ldr r0, [r3, #4] + cmp r0, #0 + ldrne r4, [r3] + cmpne r4, #0 + moveq r0, #3 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, [r3, #8] + mov r6, #1 + cmp r1, #0xb + addls pc, pc, r1, lsl #2 + b _021FE048 +_021FDD70: ; jump table + b _021FDDA0 ; case 0 + b _021FE048 ; case 1 + b _021FDDC8 ; case 2 + b _021FE048 ; case 3 + b _021FDE20 ; case 4 + b _021FDE84 ; case 5 + b _021FE048 ; case 6 + b _021FDEAC ; case 7 + b _021FE048 ; case 8 + b _021FDF80 ; case 9 + b _021FE01C ; case 10 + b _021FE044 ; case 11 +_021FDDA0: + ldr r1, _021FE054 ; =ov00_021FE100 + mov r2, #0 + str r6, [r3, #8] + bl ov00_021FD9CC + cmp r0, #0 + beq _021FE048 + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #0xb + str r1, [r0, #8] + b _021FE048 +_021FDDC8: + ldr r0, _021FE058 ; =ov00_021FE114 + mov r1, #3 + str r1, [r3, #8] + bl ov00_021FDA9C + cmp r0, #0 + bne _021FDE10 + ldr r0, _021FE050 ; =ov00_0221B0C4 + ldr r1, [r0] + ldr r0, [r1, #8] + ldr r1, [r1, #4] + cmp r0, #0 + cmpeq r1, #0 + bne _021FE048 + bl OS_GetTick + ldr r2, _021FE050 ; =ov00_0221B0C4 + ldr r2, [r2] + stmib r2, {r0, r1} + b _021FE048 +_021FDE10: + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #0xa + str r1, [r0, #8] + b _021FE048 +_021FDE20: + bl OS_GetTick + ldr r3, _021FE050 ; =ov00_0221B0C4 + ldr r2, _021FE05C ; =0x000082EA + ldr r4, [r3] + mov r3, #0 + ldr r5, [r4, #4] + ldr r4, [r4, #8] + subs r5, r0, r5 + sbc r0, r1, r4 + mov r1, r0, lsl #6 + orr r1, r1, r5, lsr #26 + mov r0, r5, lsl #6 + bl _ll_udiv + ldr r2, _021FE060 ; =0x00000BB8 + cmp r1, #0 + cmpeq r0, r2 + bhs _021FDE74 + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #2 + str r1, [r0, #8] + b _021FE048 +_021FDE74: + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #5 + str r1, [r0, #8] + b _021FE048 +_021FDE84: + ldr r0, _021FE064 ; =ov00_021FE128 + mov r1, #6 + str r1, [r3, #8] + bl ov00_021FDB64 + cmp r0, #0 + beq _021FE048 + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #0xa + str r1, [r0, #8] + b _021FE048 +_021FDEAC: + add r0, r4, #0xc + bl ov00_021FDC38 + cmp r0, #0 + mov r4, #0 + ldrne r0, _021FE050 ; =ov00_0221B0C4 + movne r1, #0xa + strne r1, [r0, #8] + ldr r8, _021FE050 ; =ov00_0221B0C4 + sub r1, r4, #1 + ldr r0, [r8] + mov r5, r4 + mov r7, r4 + str r1, [r0, #0x78c] +_021FDEE0: + ldr r2, [r8] + add r1, r2, r7 + ldr r0, [r1, #0xc] + cmp r0, #0 + beq _021FDF44 + ldrb r0, [r1, #0x78] + tst r0, #2 + beq _021FDF44 + ldrb r0, [r1, #0x77] + cmp r0, #3 + bhi _021FDF44 + add r0, r2, #0x32 + add r0, r0, r7 + bl ov00_021FE0CC + cmp r0, #0 + beq _021FDF44 + ldr r1, [r8] + add r0, r1, r7 + ldrh r0, [r0, #0x10] + cmp r0, r5 + blo _021FDF44 + str r4, [r1, #0x78c] + ldr r0, [r8] + add r0, r0, r7 + ldrh r5, [r0, #0x10] +_021FDF44: + add r4, r4, #1 + cmp r4, #0x10 + add r7, r7, #0x78 + blt _021FDEE0 + ldr r1, _021FE050 ; =ov00_0221B0C4 + mov r2, #8 + ldr r0, _021FE068 ; =ov00_021FE13C + str r2, [r1, #8] + bl ov00_021FDA5C + cmp r0, #0 + beq _021FE048 + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #0xb + str r1, [r0, #8] + b _021FE048 +_021FDF80: + ldr r2, [r4, #0x78c] + cmp r2, #0 + movlt r0, #0xb + strlt r0, [r3, #8] + blt _021FE048 + add r1, r4, #0x12 + mov r0, #0x78 + mla r0, r2, r0, r1 + ldr r1, [r4] + mov r2, #0x20 + bl MI_CpuCopy8 + ldr r1, _021FE050 ; =ov00_0221B0C4 + mov r0, #0x78 + ldr r4, [r1] + mov r2, #0x20 + ldr r1, [r4] + ldr r3, [r4, #0x78c] + add r4, r4, #0x56 + mla r0, r3, r0, r4 + add r1, r1, #0x20 + bl MI_CpuCopy8 + ldr r1, _021FE050 ; =ov00_0221B0C4 + mov r0, #0x78 + ldr r4, [r1] + mov r2, #0xa + ldr r5, [r4, #0x78c] + ldr r3, [r4] + mla r4, r5, r0, r4 + ldrb r4, [r4, #0x77] + str r4, [r3, #0x40] + ldr r4, [r1] + ldr r1, [r4] + ldr r3, [r4, #0x78c] + add r4, r4, #0x32 + mla r0, r3, r0, r4 + add r1, r1, #0x44 + bl MI_CpuCopy8 + mov r6, #2 + b _021FE048 +_021FE01C: + ldr r0, _021FE06C ; =ov00_021FE150 + mov r1, #8 + str r1, [r3, #8] + bl ov00_021FDA5C + cmp r0, #0 + beq _021FE048 + ldr r0, _021FE050 ; =ov00_0221B0C4 + mov r1, #0xb + str r1, [r0, #8] + b _021FE048 +_021FE044: + mov r6, #3 +_021FE048: + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021FE050: .word ov00_0221B0C4 +_021FE054: .word ov00_021FE100 +_021FE058: .word ov00_021FE114 +_021FE05C: .word 0x000082EA +_021FE060: .word 0x00000BB8 +_021FE064: .word ov00_021FE128 +_021FE068: .word ov00_021FE13C +_021FE06C: .word ov00_021FE150 + arm_func_end ov00_021FDD3C + + arm_func_start ov00_021FE070 +ov00_021FE070: ; 0x021FE070 + stmdb sp!, {r3, lr} + ldr r0, _021FE0C8 ; =ov00_0221B0C4 + ldr r1, [r0, #4] + cmp r1, #0 + beq _021FE09C + mov r0, #1 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _021FE0C8 ; =ov00_0221B0C4 + mov r1, #0 + str r1, [r0, #4] +_021FE09C: + ldr r0, _021FE0C8 ; =ov00_0221B0C4 + ldr r1, [r0] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #1 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _021FE0C8 ; =ov00_0221B0C4 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FE0C8: .word ov00_0221B0C4 + arm_func_end ov00_021FE070 + + arm_func_start ov00_021FE0CC +ov00_021FE0CC: ; 0x021FE0CC + mov r2, #0 +_021FE0D0: + ldrb r1, [r0, r2] + cmp r1, #0x20 + blo _021FE0E4 + cmp r1, #0x7e + bls _021FE0EC +_021FE0E4: + mov r0, #0 + bx lr +_021FE0EC: + add r2, r2, #1 + cmp r2, #0xa + blt _021FE0D0 + mov r0, #1 + bx lr + arm_func_end ov00_021FE0CC + + arm_func_start ov00_021FE100 +ov00_021FE100: ; 0x021FE100 + ldr r0, _021FE110 ; =ov00_0221B0C4 + mov r1, #2 + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021FE110: .word ov00_0221B0C4 + arm_func_end ov00_021FE100 + + arm_func_start ov00_021FE114 +ov00_021FE114: ; 0x021FE114 + ldr r0, _021FE124 ; =ov00_0221B0C4 + mov r1, #4 + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021FE124: .word ov00_0221B0C4 + arm_func_end ov00_021FE114 + + arm_func_start ov00_021FE128 +ov00_021FE128: ; 0x021FE128 + ldr r0, _021FE138 ; =ov00_0221B0C4 + mov r1, #7 + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021FE138: .word ov00_0221B0C4 + arm_func_end ov00_021FE128 + + arm_func_start ov00_021FE13C +ov00_021FE13C: ; 0x021FE13C + ldr r0, _021FE14C ; =ov00_0221B0C4 + mov r1, #9 + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021FE14C: .word ov00_0221B0C4 + arm_func_end ov00_021FE13C + + arm_func_start ov00_021FE150 +ov00_021FE150: ; 0x021FE150 + ldr r0, _021FE160 ; =ov00_0221B0C4 + mov r1, #0xb + str r1, [r0, #8] + bx lr + .balign 4, 0 +_021FE160: .word ov00_0221B0C4 + arm_func_end ov00_021FE150 + + arm_func_start ov00_021FE164 +ov00_021FE164: ; 0x021FE164 + stmdb sp!, {r3, r4, r5, lr} + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r3, r1, asr #8 + mov r1, r1, lsl #8 + mov r4, r2 + mov ip, #2 + and r2, r3, #0xff + and r1, r1, #0xff00 + strb ip, [r4, #1] + orr r1, r2, r1 + mov r5, r0 + strh r1, [r4, #2] + bl ov00_021FFA44 + mvn r1, #0 + str r0, [r4, #4] + cmp r0, r1 + bne _021FE1D0 + mov r0, r5 + bl SOC_GetHostByName + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [r4, #4] +_021FE1D0: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FE164 + + arm_func_start ov00_021FE1D8 +ov00_021FE1D8: ; 0x021FE1D8 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r1, _021FE21C ; =ov00_0221B0D8 + mov r0, #8 + str r1, [sp] + ldr r1, _021FE220 ; =ov00_0221B0D0 + str r0, [sp, #4] + ldr r0, [r1, #4] + ldr r2, [r1, #0x50] + ldr r1, _021FE224 ; =ov00_0221B0E0 + mov r3, #0 + bl ov00_021FF984 + bl ov00_021FF368 + ldr r1, _021FE220 ; =ov00_0221B0D0 + str r0, [r1, #0x54] + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FE21C: .word ov00_0221B0D8 +_021FE220: .word ov00_0221B0D0 +_021FE224: .word ov00_0221B0E0 + arm_func_end ov00_021FE1D8 + + arm_func_start ov00_021FE228 +ov00_021FE228: ; 0x021FE228 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x40 + mov r4, r0 + ldr r0, _021FE304 ; =ov00_0221B16C + mov r1, r4 + bl strcpy + ldr r0, _021FE308 ; =ov00_0221B0D0 + mvn r1, #0 + str r1, [r0, #4] + bl ov00_021FF3CC + ldr r0, _021FE30C ; =ov00_0221B12C + ldrsb r5, [r0] + cmp r5, #0 + bne _021FE270 + ldr r1, _021FE310 ; =ov00_02217C24 + add r0, sp, #0 + mov r2, r4 + bl sprintf +_021FE270: + cmp r5, #0 + ldrne r0, _021FE30C ; =ov00_0221B12C + ldr r1, _021FE314 ; =0x00006CFC + ldr r2, _021FE318 ; =ov00_0221B0D8 + addeq r0, sp, #0 + bl ov00_021FE164 + cmp r0, #0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #2 + mov r1, r0 + mov r2, #0 + bl ov00_021FF804 + ldr r2, _021FE308 ; =ov00_0221B0D0 + mvn r1, #0 + cmp r0, r1 + str r0, [r2, #4] + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, #9 + mov r0, r4 + strb r1, [r2, #0x10] + bl strlen + mov r5, r0 + ldr r0, _021FE31C ; =ov00_0221B0E5 + mov r1, r4 + add r2, r5, #1 + bl memcpy + ldr r0, _021FE308 ; =ov00_0221B0D0 + add r1, r5, #6 + str r1, [r0, #0x50] + bl ov00_021FE1D8 + ldr r0, _021FE308 ; =ov00_0221B0D0 + mov r1, #0 + str r1, [r0, #0x58] + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FE304: .word ov00_0221B16C +_021FE308: .word ov00_0221B0D0 +_021FE30C: .word ov00_0221B12C +_021FE310: .word ov00_02217C24 +_021FE314: .word 0x00006CFC +_021FE318: .word ov00_0221B0D8 +_021FE31C: .word ov00_0221B0E5 + arm_func_end ov00_021FE228 + + arm_func_start ov00_021FE320 +ov00_021FE320: ; 0x021FE320 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + cmp r1, #7 + mov r6, r2 + mov r4, r3 + movlt r0, #1 + ldmltia sp!, {r4, r5, r6, pc} + ldr r1, _021FE3CC ; =ov00_0221B0DC + add r0, r6, #4 + mov r2, #4 + bl memcmp + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, _021FE3D0 ; =ov00_0221B0D0 + ldrh r1, [r6, #2] + ldrh r0, [r0, #0xa] + cmp r1, r0 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _021FE3D4 ; =ov00_02217C48 + mov r0, r5 + mov r2, #3 + bl memcmp + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + ldrsb r2, [r5, #3] + ldrsb r1, [r5, #4] + ldrsb r0, [r5, #5] + mov r3, r2, lsl #0x18 + mov r2, r1, lsl #0x10 + mov r1, r0, lsl #8 + and r3, r3, #0xff000000 + and r2, r2, #0xff0000 + ldrb r0, [r5, #6] + orr r2, r3, r2 + and r1, r1, #0xff00 + orr r1, r2, r1 + orr r0, r1, r0 + str r0, [r4] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FE3CC: .word ov00_0221B0DC +_021FE3D0: .word ov00_0221B0D0 +_021FE3D4: .word ov00_02217C48 + arm_func_end ov00_021FE320 + + arm_func_start ov00_021FE3D8 +ov00_021FE3D8: ; 0x021FE3D8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x58 + ldr r2, _021FE510 ; =ov00_0221B0D0 + mov r3, #8 + ldr r0, [r2, #4] + sub r1, r3, #9 + cmp r0, r1 + str r3, [sp, #0xc] + moveq r0, #1 + streq r0, [r2] + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, pc} + bl ov00_021FF694 + cmp r0, #0 + beq _021FE4B0 + add r0, sp, #0x10 + str r0, [sp] + add r1, sp, #0xc + str r1, [sp, #4] + ldr r0, _021FE510 ; =ov00_0221B0D0 + add r1, sp, #0x18 + ldr r0, [r0, #4] + mov r2, #0x40 + mov r3, #0 + bl ov00_021FF940 + mov r1, r0 + add r0, sp, #0x18 + add r2, sp, #0x10 + add r3, sp, #8 + bl ov00_021FE320 + cmp r0, #0 + bne _021FE4B0 + ldr r0, _021FE510 ; =ov00_0221B0D0 + ldr r0, [r0, #4] + bl ov00_021FF818 + ldr r0, [sp, #8] + tst r0, #1 + beq _021FE480 + ldr r0, _021FE510 ; =ov00_0221B0D0 + mov r1, #2 + str r1, [r0] + b _021FE4A0 +_021FE480: + tst r0, #2 + ldreq r0, _021FE510 ; =ov00_0221B0D0 + moveq r1, #1 + streq r1, [r0] + beq _021FE4A0 + ldr r0, _021FE510 ; =ov00_0221B0D0 + mov r1, #3 + str r1, [r0] +_021FE4A0: + ldr r0, _021FE510 ; =ov00_0221B0D0 + add sp, sp, #0x58 + ldr r0, [r0] + ldmia sp!, {r3, pc} +_021FE4B0: + bl ov00_021FF368 + ldr r1, _021FE510 ; =ov00_0221B0D0 + ldr r2, [r1, #0x54] + add r2, r2, #0x7d0 + cmp r0, r2 + bls _021FE504 + ldr r0, [r1, #0x58] + cmp r0, #1 + bne _021FE4F0 + ldr r0, [r1, #4] + bl ov00_021FF818 + ldr r1, _021FE510 ; =ov00_0221B0D0 + mov r0, #1 + str r0, [r1] + add sp, sp, #0x58 + ldmia sp!, {r3, pc} +_021FE4F0: + bl ov00_021FE1D8 + ldr r0, _021FE510 ; =ov00_0221B0D0 + ldr r1, [r0, #0x58] + add r1, r1, #1 + str r1, [r0, #0x58] +_021FE504: + mov r0, #0 + add sp, sp, #0x58 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FE510: .word ov00_0221B0D0 + arm_func_end ov00_021FE3D8 + + arm_func_start ov00_021FE514 +ov00_021FE514: ; 0x021FE514 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, [r4, #0x10] + cmp r2, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021FE6EC + ldr r1, [r4, #0x10] + blx r1 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FE514 + + arm_func_start ov00_021FE538 +ov00_021FE538: ; 0x021FE538 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + ldr r0, [r4, #0xc] + add r2, r1, r0 + str r2, [r4, #4] + ldr r0, [r4, #8] + mul r1, r2, r0 + ldr r0, [r4, #0x14] + bl ov00_021EC3BC + str r0, [r4, #0x14] + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, _021FE584 ; =ov00_02217D10 + ldr r1, _021FE588 ; =ov00_02217D1C + ldr r2, _021FE58C ; =ov00_02217C7C + mov r3, #0x41 + bl __msl_assertion_failed + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FE584: .word ov00_02217D10 +_021FE588: .word ov00_02217D1C +_021FE58C: .word ov00_02217C7C + arm_func_end ov00_021FE538 + + arm_func_start ov00_021FE590 +ov00_021FE590: ; 0x021FE590 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r1, r2 + bl ov00_021FE6EC + ldr r2, [r5, #8] + mov r1, r4 + bl memcpy + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FE590 + + arm_func_start ov00_021FE5B4 +ov00_021FE5B4: ; 0x021FE5B4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0x18 + mov r6, r1 + mov r5, r2 + bl ov00_021EC3A8 + movs r4, r0 + bne _021FE5E8 + ldr r0, _021FE664 ; =ov00_02217D28 + ldr r1, _021FE668 ; =ov00_02217D1C + ldr r2, _021FE66C ; =ov00_02217C64 + mov r3, #0x52 + bl __msl_assertion_failed +_021FE5E8: + cmp r7, #0 + bne _021FE604 + ldr r0, _021FE670 ; =ov00_02217D30 + ldr r1, _021FE668 ; =ov00_02217D1C + ldr r2, _021FE66C ; =ov00_02217C64 + mov r3, #0x53 + bl __msl_assertion_failed +_021FE604: + cmp r6, #0 + moveq r6, #8 + mov r0, #0 + stmia r4, {r0, r6, r7} + str r6, [r4, #0xc] + str r5, [r4, #0x10] + ldr r1, [r4, #4] + cmp r1, #0 + beq _021FE658 + ldr r0, [r4, #8] + mul r0, r1, r0 + bl ov00_021EC3A8 + str r0, [r4, #0x14] + cmp r0, #0 + bne _021FE65C + ldr r0, _021FE674 ; =ov00_02217D10 + ldr r1, _021FE668 ; =ov00_02217D1C + ldr r2, _021FE66C ; =ov00_02217C64 + mov r3, #0x5e + bl __msl_assertion_failed + b _021FE65C +_021FE658: + str r0, [r4, #0x14] +_021FE65C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FE664: .word ov00_02217D28 +_021FE668: .word ov00_02217D1C +_021FE66C: .word ov00_02217C64 +_021FE670: .word ov00_02217D30 +_021FE674: .word ov00_02217D10 + arm_func_end ov00_021FE5B4 + + arm_func_start ov00_021FE678 +ov00_021FE678: ; 0x021FE678 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + bne _021FE698 + ldr r0, _021FE6D8 ; =ov00_02217D28 + ldr r1, _021FE6DC ; =ov00_02217D1C + ldr r2, _021FE6E0 ; =ov00_02217C70 + mov r3, #0x69 + bl __msl_assertion_failed +_021FE698: + ldr r0, [r5] + mov r4, #0 + cmp r0, #0 + ble _021FE6C4 +_021FE6A8: + mov r0, r5 + mov r1, r4 + bl ov00_021FE514 + ldr r0, [r5] + add r4, r4, #1 + cmp r4, r0 + blt _021FE6A8 +_021FE6C4: + ldr r0, [r5, #0x14] + bl ov00_021EC3D8 + mov r0, r5 + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FE6D8: .word ov00_02217D28 +_021FE6DC: .word ov00_02217D1C +_021FE6E0: .word ov00_02217C70 + arm_func_end ov00_021FE678 + + arm_func_start ArrayLength +ArrayLength: ; 0x021FE6E4 + ldr r0, [r0] + bx lr + arm_func_end ArrayLength + + arm_func_start ov00_021FE6EC +ov00_021FE6EC: ; 0x021FE6EC + stmdb sp!, {r3, r4, r5, lr} + movs r4, r1 + mov r5, r0 + bmi _021FE708 + ldr r0, [r5] + cmp r4, r0 + blt _021FE71C +_021FE708: + ldr r0, _021FE748 ; =ov00_02217D3C + ldr r1, _021FE74C ; =ov00_02217D1C + ldr r2, _021FE750 ; =ov00_02217C58 + mov r3, #0x94 + bl __msl_assertion_failed +_021FE71C: + cmp r4, #0 + blt _021FE730 + ldr r0, [r5] + cmp r4, r0 + blt _021FE738 +_021FE730: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_021FE738: + ldr r0, [r5, #0x14] + ldr r1, [r5, #8] + mla r0, r1, r4, r0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FE748: .word ov00_02217D3C +_021FE74C: .word ov00_02217D1C +_021FE750: .word ov00_02217C58 + arm_func_end ov00_021FE6EC + + arm_func_start ov00_021FE754 +ov00_021FE754: ; 0x021FE754 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _021FE778 + ldr r0, _021FE794 ; =ov00_02217D28 + ldr r1, _021FE798 ; =ov00_02217D1C + ldr r2, _021FE79C ; =ov00_02217C88 + mov r3, #0xa0 + bl __msl_assertion_failed +_021FE778: + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r5] + mov r0, r5 + mov r1, r4 + bl ov00_021FE7A0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FE794: .word ov00_02217D28 +_021FE798: .word ov00_02217D1C +_021FE79C: .word ov00_02217C88 + arm_func_end ov00_021FE754 + + arm_func_start ov00_021FE7A0 +ov00_021FE7A0: ; 0x021FE7A0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r4, r2 + mov r6, r0 + mov r5, r1 + bmi _021FE7C0 + ldr r0, [r6] + cmp r4, r0 + ble _021FE7D4 +_021FE7C0: + ldr r0, _021FE84C ; =ov00_02217D5C + ldr r1, _021FE850 ; =ov00_02217D1C + ldr r2, _021FE854 ; =ov00_02217CB4 + mov r3, #0xa7 + bl __msl_assertion_failed +_021FE7D4: + ldr r1, [r6] + ldr r0, [r6, #4] + cmp r1, r0 + bne _021FE7EC + mov r0, r6 + bl ov00_021FE538 +_021FE7EC: + ldr r0, [r6] + add r0, r0, #1 + sub r8, r0, #1 + str r0, [r6] + cmp r4, r8 + bge _021FE838 + mov r0, r6 + add r1, r4, #1 + bl ov00_021FE6EC + mov r7, r0 + mov r0, r6 + mov r1, r4 + bl ov00_021FE6EC + mov r1, r0 + ldr r3, [r6, #8] + sub r0, r8, r4 + mul r2, r3, r0 + mov r0, r7 + bl memmove +_021FE838: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_021FE590 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021FE84C: .word ov00_02217D5C +_021FE850: .word ov00_02217D1C +_021FE854: .word ov00_02217CB4 + arm_func_end ov00_021FE7A0 + + arm_func_start ov00_021FE858 +ov00_021FE858: ; 0x021FE858 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + movs r4, r2 + mov r6, r0 + mov r5, r1 + bne _021FE884 + ldr r0, _021FE8CC ; =ov00_02217D7C + ldr r1, _021FE8D0 ; =ov00_02217D1C + ldr r2, _021FE8D4 ; =ov00_02217CE8 + mov r3, #0xb7 + bl __msl_assertion_failed +_021FE884: + add r0, sp, #8 + str r4, [sp] + str r0, [sp, #4] + ldr r1, [r6, #0x14] + ldr r2, [r6] + ldr r3, [r6, #8] + mov r0, r5 + bl ov00_021FECC0 + ldr r2, [r6, #0x14] + ldr r1, [r6, #8] + sub r0, r0, r2 + bl _s32_div_f + mov r2, r0 + mov r0, r6 + mov r1, r5 + bl ov00_021FE7A0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021FE8CC: .word ov00_02217D7C +_021FE8D0: .word ov00_02217D1C +_021FE8D4: .word ov00_02217CE8 + arm_func_end ov00_021FE858 + + arm_func_start ov00_021FE8D8 +ov00_021FE8D8: ; 0x021FE8D8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r1 + mov r4, r0 + bmi _021FE8F4 + ldr r0, [r4] + cmp r7, r0 + blt _021FE908 +_021FE8F4: + ldr r0, _021FE95C ; =ov00_02217D3C + ldr r1, _021FE960 ; =ov00_02217D1C + ldr r2, _021FE964 ; =ov00_02217C94 + mov r3, #0xc0 + bl __msl_assertion_failed +_021FE908: + ldr r0, [r4] + sub r6, r0, #1 + cmp r7, r6 + bge _021FE94C + mov r0, r4 + mov r1, r7 + bl ov00_021FE6EC + mov r5, r0 + mov r0, r4 + add r1, r7, #1 + bl ov00_021FE6EC + mov r1, r0 + ldr r3, [r4, #8] + sub r0, r6, r7 + mul r2, r3, r0 + mov r0, r5 + bl memmove +_021FE94C: + ldr r0, [r4] + sub r0, r0, #1 + str r0, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FE95C: .word ov00_02217D3C +_021FE960: .word ov00_02217D1C +_021FE964: .word ov00_02217C94 + arm_func_end ov00_021FE8D8 + + arm_func_start ov00_021FE968 +ov00_021FE968: ; 0x021FE968 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r1 + mov r5, r0 + bmi _021FE984 + ldr r0, [r5] + cmp r4, r0 + blt _021FE998 +_021FE984: + ldr r0, _021FE9B4 ; =ov00_02217D3C + ldr r1, _021FE9B8 ; =ov00_02217D1C + ldr r2, _021FE9BC ; =ov00_02217CA4 + mov r3, #0xca + bl __msl_assertion_failed +_021FE998: + mov r0, r5 + mov r1, r4 + bl ov00_021FE514 + mov r0, r5 + mov r1, r4 + bl ov00_021FE8D8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FE9B4: .word ov00_02217D3C +_021FE9B8: .word ov00_02217D1C +_021FE9BC: .word ov00_02217CA4 + arm_func_end ov00_021FE968 + + arm_func_start ov00_021FE9C0 +ov00_021FE9C0: ; 0x021FE9C0 + stmdb sp!, {r4, r5, r6, lr} + movs r4, r2 + mov r6, r0 + mov r5, r1 + bmi _021FE9E0 + ldr r0, [r6] + cmp r4, r0 + blt _021FE9F4 +_021FE9E0: + ldr r0, _021FEA14 ; =ov00_02217D3C + ldr r1, _021FEA18 ; =ov00_02217D1C + ldr r2, _021FEA1C ; =ov00_02217CC4 + mov r3, #0xd3 + bl __msl_assertion_failed +_021FE9F4: + mov r0, r6 + mov r1, r4 + bl ov00_021FE514 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_021FE590 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FEA14: .word ov00_02217D3C +_021FEA18: .word ov00_02217D1C +_021FEA1C: .word ov00_02217CC4 + arm_func_end ov00_021FE9C0 + + arm_func_start ov00_021FEA20 +ov00_021FEA20: ; 0x021FEA20 + ldr ip, _021FEA3C ; =qsort + mov r2, r0 + mov r3, r1 + ldr r0, [r2, #0x14] + ldr r1, [r2] + ldr r2, [r2, #8] + bx ip + .balign 4, 0 +_021FEA3C: .word qsort + arm_func_end ov00_021FEA20 + + arm_func_start ov00_021FEA40 +ov00_021FEA40: ; 0x021FEA40 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov ip, #1 + movs r7, r0 + str ip, [sp, #8] + ldrne r8, [r7] + mov r6, r1 + cmpne r8, #0 + mov r5, r2 + mov r4, r3 + addeq sp, sp, #0xc + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0x28] + cmp r1, #0 + mov r1, r4 + beq _021FEAAC + bl ov00_021FE6EC + add r1, sp, #8 + str r5, [sp] + str r1, [sp, #4] + mov r1, r0 + ldr r3, [r7, #8] + mov r0, r6 + sub r2, r8, r4 + bl ov00_021FECC0 + b _021FEAC8 +_021FEAAC: + bl ov00_021FE6EC + str r5, [sp] + mov r1, r0 + ldr r3, [r7, #8] + mov r0, r6 + sub r2, r8, r4 + bl ov00_021FEC68 +_021FEAC8: + cmp r0, #0 + ldrne r1, [sp, #8] + cmpne r1, #0 + addeq sp, sp, #0xc + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r2, [r7, #0x14] + ldr r1, [r7, #8] + sub r0, r0, r2 + bl _s32_div_f + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov00_021FEA40 + + arm_func_start ov00_021FEAF8 +ov00_021FEAF8: ; 0x021FEAF8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r6, r1 + mov r7, r0 + mov r5, r2 + bne _021FEB20 + ldr r0, _021FEB58 ; =ov00_02217D88 + ldr r1, _021FEB5C ; =ov00_02217D1C + ldr r2, _021FEB60 ; =ov00_02217C4C + mov r3, #0xf9 + bl __msl_assertion_failed +_021FEB20: + ldr r0, [r7] + mov r4, #0 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} +_021FEB30: + mov r0, r7 + mov r1, r4 + bl ov00_021FE6EC + mov r1, r5 + blx r6 + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _021FEB30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FEB58: .word ov00_02217D88 +_021FEB5C: .word ov00_02217D1C +_021FEB60: .word ov00_02217C4C + arm_func_end ov00_021FEAF8 + + arm_func_start ov00_021FEB64 +ov00_021FEB64: ; 0x021FEB64 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r6, r1 + mov r7, r0 + mov r5, r2 + bne _021FEB8C + ldr r0, _021FEBB8 ; =ov00_02217D88 + ldr r1, _021FEBBC ; =ov00_02217D1C + ldr r2, _021FEBC0 ; =ov00_02217CD4 + mov r3, #0x104 + bl __msl_assertion_failed +_021FEB8C: + ldr r0, [r7] + subs r4, r0, #1 + ldmmiia sp!, {r3, r4, r5, r6, r7, pc} +_021FEB98: + mov r0, r7 + mov r1, r4 + bl ov00_021FE6EC + mov r1, r5 + blx r6 + subs r4, r4, #1 + bpl _021FEB98 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FEBB8: .word ov00_02217D88 +_021FEBBC: .word ov00_02217D1C +_021FEBC0: .word ov00_02217CD4 + arm_func_end ov00_021FEB64 + + arm_func_start ov00_021FEBC4 +ov00_021FEBC4: ; 0x021FEBC4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r7, r1 + mov r8, r0 + mov r6, r2 + bne _021FEBEC + ldr r0, _021FEC2C ; =ov00_02217D88 + ldr r1, _021FEC30 ; =ov00_02217D1C + ldr r2, _021FEC34 ; =ov00_02217CFC + ldr r3, _021FEC38 ; =0x00000121 + bl __msl_assertion_failed +_021FEBEC: + ldr r0, [r8] + subs r5, r0, #1 + bmi _021FEC24 +_021FEBF8: + mov r0, r8 + mov r1, r5 + bl ov00_021FE6EC + mov r1, r6 + mov r4, r0 + blx r7 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + subs r5, r5, #1 + bpl _021FEBF8 +_021FEC24: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021FEC2C: .word ov00_02217D88 +_021FEC30: .word ov00_02217D1C +_021FEC34: .word ov00_02217CFC +_021FEC38: .word 0x00000121 + arm_func_end ov00_021FEBC4 + + arm_func_start ov00_021FEC3C +ov00_021FEC3C: ; 0x021FEC3C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ArrayLength + subs r4, r0, #1 + ldmmiia sp!, {r3, r4, r5, pc} +_021FEC50: + mov r0, r5 + mov r1, r4 + bl ov00_021FE968 + subs r4, r4, #1 + bpl _021FEC50 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FEC3C + + arm_func_start ov00_021FEC68 +ov00_021FEC68: ; 0x021FEC68 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r2 + mov sl, r0 + mov sb, r1 + mov r7, r3 + cmp r8, #0 + ldr r6, [sp, #0x20] + mov r4, #0 + ble _021FECB8 + mov r5, r4 +_021FEC90: + mov r0, sl + add r1, sb, r5 + blx r6 + cmp r0, #0 + mlaeq r0, r7, r4, sb + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r4, r4, #1 + cmp r4, r8 + add r5, r5, r7 + blt _021FEC90 +_021FECB8: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_021FEC68 + + arm_func_start ov00_021FECC0 +ov00_021FECC0: ; 0x021FECC0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r7, [sp, #0x2c] + mov r4, #0 + mov fp, r0 + mov sl, r1 + mov sb, r3 + str r4, [r7] + subs r5, r2, #1 + ldr r8, [sp, #0x28] + bmi _021FED1C +_021FECE8: + add r0, r4, r5 + mov r6, r0, asr #1 + mla r0, r6, sb, sl + mov r1, fp + blx r8 + cmp r0, #0 + moveq r1, #1 + streq r1, [r7] + cmp r0, #0 + addlt r4, r6, #1 + subge r5, r6, #1 + cmp r4, r5 + ble _021FECE8 +_021FED1C: + mla r0, r4, sb, sl + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_021FECC0 + + arm_func_start ov00_021FED24 +ov00_021FED24: ; 0x021FED24 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr ip, [sp, #0x10] + str r3, [sp] + mov r3, r2 + mov r2, #4 + str ip, [sp, #4] + bl ov00_021FED4C + add sp, sp, #8 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FED24 + + arm_func_start ov00_021FED4C +ov00_021FED4C: ; 0x021FED4C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + movs r7, r3 + mov sl, r0 + mov sb, r1 + mov r8, r2 + ldr r6, [sp, #0x24] + bne _021FED7C + ldr r0, _021FEE6C ; =ov00_02217E00 + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x38 + bl __msl_assertion_failed +_021FED7C: + ldr r0, [sp, #0x20] + cmp r0, #0 + bne _021FED9C + ldr r0, _021FEE78 ; =ov00_02217E14 + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x39 + bl __msl_assertion_failed +_021FED9C: + cmp sl, #0 + bne _021FEDB8 + ldr r0, _021FEE7C ; =ov00_02217E1C + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x3a + bl __msl_assertion_failed +_021FEDB8: + cmp sb, #0 + bne _021FEDD4 + ldr r0, _021FEE80 ; =ov00_02217E28 + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x3b + bl __msl_assertion_failed +_021FEDD4: + mov r0, #0x14 + bl ov00_021EC3A8 + movs r4, r0 + bne _021FEDF8 + ldr r0, _021FEE84 ; =ov00_02217E34 + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x3e + bl __msl_assertion_failed +_021FEDF8: + mov r0, sb, lsl #2 + bl ov00_021EC3A8 + str r0, [r4] + cmp r0, #0 + bne _021FEE20 + ldr r0, _021FEE88 ; =ov00_02217E3C + ldr r1, _021FEE70 ; =ov00_02217E08 + ldr r2, _021FEE74 ; =ov00_02217D98 + mov r3, #0x41 + bl __msl_assertion_failed +_021FEE20: + cmp sb, #0 + mov r5, #0 + ble _021FEE50 +_021FEE2C: + mov r0, sl + mov r1, r8 + mov r2, r6 + bl ov00_021FE5B4 + ldr r1, [r4] + str r0, [r1, r5, lsl #2] + add r5, r5, #1 + cmp r5, sb + blt _021FEE2C +_021FEE50: + str sb, [r4, #4] + ldr r0, [sp, #0x20] + str r6, [r4, #8] + str r0, [r4, #0x10] + mov r0, r4 + str r7, [r4, #0xc] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021FEE6C: .word ov00_02217E00 +_021FEE70: .word ov00_02217E08 +_021FEE74: .word ov00_02217D98 +_021FEE78: .word ov00_02217E14 +_021FEE7C: .word ov00_02217E1C +_021FEE80: .word ov00_02217E28 +_021FEE84: .word ov00_02217E34 +_021FEE88: .word ov00_02217E3C + arm_func_end ov00_021FED4C + + arm_func_start ov00_021FEE8C +ov00_021FEE8C: ; 0x021FEE8C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + bne _021FEEAC + ldr r0, _021FEEF4 ; =ov00_02217E34 + ldr r1, _021FEEF8 ; =ov00_02217E08 + ldr r2, _021FEEFC ; =ov00_02217DA4 + mov r3, #0x51 + bl __msl_assertion_failed +_021FEEAC: + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #4] + mov r4, #0 + cmp r0, #0 + ble _021FEEE0 +_021FEEC4: + ldr r0, [r5] + ldr r0, [r0, r4, lsl #2] + bl ov00_021FE678 + ldr r0, [r5, #4] + add r4, r4, #1 + cmp r4, r0 + blt _021FEEC4 +_021FEEE0: + ldr r0, [r5] + bl ov00_021EC3D8 + mov r0, r5 + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_021FEEF4: .word ov00_02217E34 +_021FEEF8: .word ov00_02217E08 +_021FEEFC: .word ov00_02217DA4 + arm_func_end ov00_021FEE8C + + arm_func_start ov00_021FEF00 +ov00_021FEF00: ; 0x021FEF00 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, #0 + bne _021FEF24 + ldr r0, _021FEF68 ; =ov00_02217E34 + ldr r1, _021FEF6C ; =ov00_02217E08 + ldr r2, _021FEF70 ; =ov00_02217DBC + mov r3, #0x61 + bl __msl_assertion_failed +_021FEF24: + cmp r6, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r6, #4] + mov r4, #0 + cmp r0, #0 + ble _021FEF60 +_021FEF40: + ldr r0, [r6] + ldr r0, [r0, r4, lsl #2] + bl ArrayLength + ldr r1, [r6, #4] + add r4, r4, #1 + cmp r4, r1 + add r5, r5, r0 + blt _021FEF40 +_021FEF60: + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_021FEF68: .word ov00_02217E34 +_021FEF6C: .word ov00_02217E08 +_021FEF70: .word ov00_02217DBC + arm_func_end ov00_021FEF00 + + arm_func_start ov00_021FEF74 +ov00_021FEF74: ; 0x021FEF74 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + movs r6, r0 + mov r5, r1 + bne _021FEF9C + ldr r0, _021FF010 ; =ov00_02217E34 + ldr r1, _021FF014 ; =ov00_02217E08 + ldr r2, _021FF018 ; =ov00_02217DB0 + mov r3, #0x71 + bl __msl_assertion_failed +_021FEF9C: + cmp r6, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r6, #4] + ldr r2, [r6, #0xc] + mov r0, r5 + blx r2 + mov r3, #0 + str r3, [sp] + ldr r1, [r6] + mov r4, r0 + ldr r0, [r1, r4, lsl #2] + ldr r2, [r6, #0x10] + mov r1, r5 + bl ov00_021FEA40 + mov r2, r0 + mvn r0, #0 + cmp r2, r0 + ldr r0, [r6] + mov r1, r5 + bne _021FF000 + ldr r0, [r0, r4, lsl #2] + bl ov00_021FE754 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} +_021FF000: + ldr r0, [r0, r4, lsl #2] + bl ov00_021FE9C0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021FF010: .word ov00_02217E34 +_021FF014: .word ov00_02217E08 +_021FF018: .word ov00_02217DB0 + arm_func_end ov00_021FEF74 + + arm_func_start ov00_021FF01C +ov00_021FF01C: ; 0x021FF01C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + movs r6, r0 + mov r5, r1 + bne _021FF044 + ldr r0, _021FF0B4 ; =ov00_02217E34 + ldr r1, _021FF0B8 ; =ov00_02217E08 + ldr r2, _021FF0BC ; =ov00_02217DC8 + mov r3, #0x82 + bl __msl_assertion_failed +_021FF044: + cmp r6, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r6, #4] + ldr r2, [r6, #0xc] + mov r0, r5 + blx r2 + mov r3, #0 + str r3, [sp] + ldr r1, [r6] + mov r4, r0 + ldr r0, [r1, r4, lsl #2] + ldr r2, [r6, #0x10] + mov r1, r5 + bl ov00_021FEA40 + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r6] + ldr r0, [r0, r4, lsl #2] + bl ov00_021FE968 + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021FF0B4: .word ov00_02217E34 +_021FF0B8: .word ov00_02217E08 +_021FF0BC: .word ov00_02217DC8 + arm_func_end ov00_021FF01C + + arm_func_start ov00_021FF0C0 +ov00_021FF0C0: ; 0x021FF0C0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + movs r6, r0 + mov r5, r1 + bne _021FF0E8 + ldr r0, _021FF154 ; =ov00_02217E34 + ldr r1, _021FF158 ; =ov00_02217E08 + ldr r2, _021FF15C ; =ov00_02217DD4 + mov r3, #0x94 + bl __msl_assertion_failed +_021FF0E8: + cmp r6, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r6, #4] + ldr r2, [r6, #0xc] + mov r0, r5 + blx r2 + mov r3, #0 + str r3, [sp] + ldr r1, [r6] + mov r4, r0 + ldr r0, [r1, r4, lsl #2] + ldr r2, [r6, #0x10] + mov r1, r5 + bl ov00_021FEA40 + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r6] + ldr r0, [r0, r4, lsl #2] + bl ov00_021FE6EC + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_021FF154: .word ov00_02217E34 +_021FF158: .word ov00_02217E08 +_021FF15C: .word ov00_02217DD4 + arm_func_end ov00_021FF0C0 + + arm_func_start ov00_021FF160 +ov00_021FF160: ; 0x021FF160 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + bne _021FF188 + ldr r0, _021FF1E8 ; =ov00_02217E34 + ldr r1, _021FF1EC ; =ov00_02217E08 + ldr r2, _021FF1F0 ; =ov00_02217D8C + mov r3, #0xa7 + bl __msl_assertion_failed +_021FF188: + cmp r6, #0 + bne _021FF1A4 + ldr r0, _021FF1F4 ; =ov00_02217E4C + ldr r1, _021FF1EC ; =ov00_02217E08 + ldr r2, _021FF1F0 ; =ov00_02217D8C + mov r3, #0xa8 + bl __msl_assertion_failed +_021FF1A4: + cmp r7, #0 + cmpne r6, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} +_021FF1C0: + ldr r0, [r7] + mov r1, r6 + ldr r0, [r0, r4, lsl #2] + mov r2, r5 + bl ov00_021FEAF8 + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _021FF1C0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FF1E8: .word ov00_02217E34 +_021FF1EC: .word ov00_02217E08 +_021FF1F0: .word ov00_02217D8C +_021FF1F4: .word ov00_02217E4C + arm_func_end ov00_021FF160 + + arm_func_start ov00_021FF1F8 +ov00_021FF1F8: ; 0x021FF1F8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r6, r1 + mov r7, r0 + mov r5, r2 + bne _021FF220 + ldr r0, _021FF258 ; =ov00_02217E4C + ldr r1, _021FF25C ; =ov00_02217E08 + ldr r2, _021FF260 ; =ov00_02217DE0 + mov r3, #0xb6 + bl __msl_assertion_failed +_021FF220: + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} +_021FF230: + ldr r0, [r7] + mov r1, r6 + ldr r0, [r0, r4, lsl #2] + mov r2, r5 + bl ov00_021FEB64 + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _021FF230 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FF258: .word ov00_02217E4C +_021FF25C: .word ov00_02217E08 +_021FF260: .word ov00_02217DE0 + arm_func_end ov00_021FF1F8 + + arm_func_start ov00_021FF264 +ov00_021FF264: ; 0x021FF264 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r6, r1 + mov r7, r0 + mov r5, r2 + bne _021FF28C + ldr r0, _021FF2D0 ; =ov00_02217E4C + ldr r1, _021FF2D4 ; =ov00_02217E08 + ldr r2, _021FF2D8 ; =ov00_02217DF0 + mov r3, #0xd3 + bl __msl_assertion_failed +_021FF28C: + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ble _021FF2C8 +_021FF29C: + ldr r0, [r7] + mov r1, r6 + ldr r0, [r0, r4, lsl #2] + mov r2, r5 + bl ov00_021FEBC4 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _021FF29C +_021FF2C8: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_021FF2D0: .word ov00_02217E4C +_021FF2D4: .word ov00_02217E08 +_021FF2D8: .word ov00_02217DF0 + arm_func_end ov00_021FF264 + + arm_func_start ov00_021FF2DC +ov00_021FF2DC: ; 0x021FF2DC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, #0 + ldr r4, _021FF318 ; =ov00_02217E50 + mov r8, r0 + mov r7, r1 + mov r6, r5 +_021FF2F4: + ldrb r2, [r8, r5] + mov r1, r4 + add r0, r7, r6 + bl sprintf + add r5, r5, #1 + cmp r5, #0x10 + add r6, r6, #2 + blo _021FF2F4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_021FF318: .word ov00_02217E50 + arm_func_end ov00_021FF2DC + + arm_func_start ov00_021FF31C +ov00_021FF31C: ; 0x021FF31C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x68 + mov r6, r0 + add r0, sp, #0x10 + mov r5, r1 + mov r4, r2 + bl MD5Init + add r0, sp, #0x10 + mov r1, r6 + mov r2, r5 + bl MD5Update + add r0, sp, #0 + add r1, sp, #0x10 + bl MD5Final + add r0, sp, #0 + mov r1, r4 + bl ov00_021FF2DC + add sp, sp, #0x68 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021FF31C + + arm_func_start ov00_021FF368 +ov00_021FF368: ; 0x021FF368 + stmdb sp!, {r3, lr} + bl OS_IsTickAvailable + cmp r0, #1 + beq _021FF38C + ldr r0, _021FF3AC ; =ov00_02217E74 + ldr r1, _021FF3B0 ; =ov00_02217E94 + ldr r2, _021FF3B4 ; =ov00_02217E64 + ldr r3, _021FF3B8 ; =0x00000109 + bl __msl_assertion_failed +_021FF38C: + bl OS_GetTick + mov r1, r1, lsl #6 + orr r1, r1, r0, lsr #26 + ldr r2, _021FF3BC ; =0x000082EA + mov r0, r0, lsl #6 + mov r3, #0 + bl _ll_udiv + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FF3AC: .word ov00_02217E74 +_021FF3B0: .word ov00_02217E94 +_021FF3B4: .word ov00_02217E64 +_021FF3B8: .word 0x00000109 +_021FF3BC: .word 0x000082EA + arm_func_end ov00_021FF368 + + arm_func_start ov00_021FF3C0 +ov00_021FF3C0: ; 0x021FF3C0 + ldr ip, _021FF3C8 ; =OS_Sleep + bx ip + .balign 4, 0 +_021FF3C8: .word OS_Sleep + arm_func_end ov00_021FF3C0 + + arm_func_start ov00_021FF3CC +ov00_021FF3CC: ; 0x021FF3CC + bx lr + arm_func_end ov00_021FF3CC + + arm_func_start ov00_021FF3D0 +ov00_021FF3D0: ; 0x021FF3D0 + bx lr + arm_func_end ov00_021FF3D0 + + arm_func_start ov00_021FF3D4 +ov00_021FF3D4: ; 0x021FF3D4 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl strlen + add r0, r0, #1 + bl ov00_021EC3A8 + movs r4, r0 + beq _021FF400 + mov r1, r5 + bl strcpy +_021FF400: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FF3D4 + + arm_func_start ov00_021FF408 +ov00_021FF408: ; 0x021FF408 + ldrsb r3, [r0] + mov r2, r0 + cmp r3, #0 + beq _021FF440 + ldr r1, _021FF448 ; =_0210E404 +_021FF41C: + cmp r3, #0 + blt _021FF430 + cmp r3, #0x80 + bge _021FF430 + ldrb r3, [r1, r3] +_021FF430: + strb r3, [r0] + ldrsb r3, [r0, #1]! + cmp r3, #0 + bne _021FF41C +_021FF440: + mov r0, r2 + bx lr + .balign 4, 0 +_021FF448: .word _0210E404 + arm_func_end ov00_021FF408 + + arm_func_start ov00_021FF44C +ov00_021FF44C: ; 0x021FF44C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, #3 + mov r2, #0 + mov r5, r0 + bl SOC_Fcntl + cmp r4, #0 + bicne r2, r0, #4 + orreq r2, r0, #4 + mov r0, r5 + mov r1, #4 + bl SOC_Fcntl + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FF44C + + arm_func_start ov00_021FF48C +ov00_021FF48C: ; 0x021FF48C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + ldr r1, _021FF4C8 ; =0x0000FFFF + mov ip, #4 + ldr r2, _021FF4CC ; =0x00001002 + add r3, sp, #0xc + str ip, [sp] + bl ov00_021FFA04 + mvn r1, #0 + cmp r0, r1 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_021FF4C8: .word 0x0000FFFF +_021FF4CC: .word 0x00001002 + arm_func_end ov00_021FF48C + + arm_func_start ov00_021FF4D0 +ov00_021FF4D0: ; 0x021FF4D0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + ldr r1, _021FF50C ; =0x0000FFFF + mov ip, #4 + add r3, sp, #0xc + rsb r2, r1, #0x11000 + str ip, [sp] + bl ov00_021FFA04 + mvn r1, #0 + cmp r0, r1 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_021FF50C: .word 0x0000FFFF + arm_func_end ov00_021FF4D0 + + arm_func_start ov00_021FF510 +ov00_021FF510: ; 0x021FF510 + stmdb sp!, {lr} + sub sp, sp, #0xc + mov r1, #4 + str r1, [sp, #4] + add ip, sp, #4 + ldr r1, _021FF550 ; =0x0000FFFF + ldr r2, _021FF554 ; =0x00001002 + add r3, sp, #8 + str ip, [sp] + bl ov00_021FF9DC + mvn r1, #0 + cmp r0, r1 + ldrne r1, [sp, #8] + mov r0, r1 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_021FF550: .word 0x0000FFFF +_021FF554: .word 0x00001002 + arm_func_end ov00_021FF510 + + arm_func_start ov00_021FF558 +ov00_021FF558: ; 0x021FF558 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r1, _021FF598 ; =0x0000FFFF + mov r2, #4 + str r2, [sp, #4] + add ip, sp, #4 + add r3, sp, #8 + rsb r2, r1, #0x11000 + str ip, [sp] + bl ov00_021FF9DC + mvn r1, #0 + cmp r0, r1 + ldrne r1, [sp, #8] + mov r0, r1 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_021FF598: .word 0x0000FFFF + arm_func_end ov00_021FF558 + + arm_func_start ov00_021FF59C +ov00_021FF59C: ; 0x021FF59C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + movs r6, r1 + mov r1, #0 + strh r1, [sp, #4] + str r0, [sp] + ldrnesh r0, [sp, #4] + mov r5, r2 + mov r2, #0 + orrne r0, r0, #1 + strneh r0, [sp, #4] + cmp r5, #0 + ldrnesh r0, [sp, #4] + mov r4, r3 + mov r3, r2 + orrne r0, r0, #8 + strneh r0, [sp, #4] + add r0, sp, #0 + mov r1, #1 + strh r2, [sp, #6] + bl SOC_Poll + cmp r0, #0 + addlt sp, sp, #8 + mvnlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + cmp r6, #0 + beq _021FF62C + cmp r0, #0 + ble _021FF624 + ldrsh r1, [sp, #6] + tst r1, #0x41 + movne r1, #1 + strne r1, [r6] + bne _021FF62C +_021FF624: + mov r1, #0 + str r1, [r6] +_021FF62C: + cmp r5, #0 + beq _021FF658 + cmp r0, #0 + ble _021FF650 + ldrsh r1, [sp, #6] + tst r1, #8 + movne r1, #1 + strne r1, [r5] + bne _021FF658 +_021FF650: + mov r1, #0 + str r1, [r5] +_021FF658: + cmp r4, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r0, #0 + ble _021FF684 + ldrsh r1, [sp, #6] + tst r1, #0x20 + movne r1, #1 + addne sp, sp, #8 + strne r1, [r4] + ldmneia sp!, {r4, r5, r6, pc} +_021FF684: + mov r1, #0 + str r1, [r4] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_021FF59C + + arm_func_start ov00_021FF694 +ov00_021FF694: ; 0x021FF694 + stmdb sp!, {r3, lr} + mov r2, #0 + add r1, sp, #0 + mov r3, r2 + str r2, [sp] + bl ov00_021FF59C + cmp r0, #1 + ldreq r0, [sp] + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF694 + + arm_func_start ov00_021FF6BC +ov00_021FF6BC: ; 0x021FF6BC + stmdb sp!, {r3, lr} + mov r1, #0 + add r2, sp, #0 + mov r3, r1 + str r1, [sp] + bl ov00_021FF59C + cmp r0, #1 + ldreq r0, [sp] + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF6BC + + arm_func_start ov00_021FF6E4 +ov00_021FF6E4: ; 0x021FF6E4 + stmdb sp!, {r3, lr} + ldr r2, _021FF758 ; =ov00_02217EA0 + ldr r0, _021FF75C ; =ov00_0221B1AC + ldr r1, _021FF760 ; =ov00_0221B1AC + str r2, [r0, #8] + str r1, [r0, #0xc] + mov r1, #2 + strh r1, [r0, #0x10] + mov r2, #0 + ldr r1, _021FF764 ; =ov00_0221B1D8 + strh r2, [r0, #0x12] + str r1, [r0, #0x14] + str r2, [r0, #0x18] + bl SOCL_GetHostID + ldr r1, _021FF768 ; =ov00_0221B1C4 + bl SOC_U32to4U8 + ldr r1, _021FF75C ; =ov00_0221B1AC + ldr r0, [r1, #0x18] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _021FF768 ; =ov00_0221B1C4 + mov r0, #4 + str r2, [r1, #0x2c] + strh r0, [r1, #0x12] + mov r2, #0 + ldr r0, _021FF76C ; =ov00_0221B1B4 + str r2, [r1, #0x30] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FF758: .word ov00_02217EA0 +_021FF75C: .word ov00_0221B1AC +_021FF760: .word ov00_0221B1AC +_021FF764: .word ov00_0221B1D8 +_021FF768: .word ov00_0221B1C4 +_021FF76C: .word ov00_0221B1B4 + arm_func_end ov00_021FF6E4 + + arm_func_start ov00_021FF770 +ov00_021FF770: ; 0x021FF770 + ldr r3, [r0] + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r3, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r1, r1, r0 + mov r0, r1, lsr #0x18 + and r2, r0, #0xff + mov r0, r1, lsr #0x10 + and r0, r0, #0xff + cmp r2, #0xa + moveq r0, #1 + bxeq lr + cmp r2, #0xac + bne _021FF7D8 + cmp r0, #0x10 + blt _021FF7D8 + cmp r0, #0x1f + movle r0, #1 + bxle lr +_021FF7D8: + cmp r2, #0xc0 + cmpeq r0, #0xa8 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end ov00_021FF770 + + arm_func_start ov00_021FF7EC +ov00_021FF7EC: ; 0x021FF7EC + cmp r0, #0 + ldrlt r2, _021FF800 ; =ov00_0221B1AC + strlt r0, [r2, #4] + movlt r0, r1 + bx lr + .balign 4, 0 +_021FF800: .word ov00_0221B1AC + arm_func_end ov00_021FF7EC + + arm_func_start ov00_021FF804 +ov00_021FF804: ; 0x021FF804 + stmdb sp!, {r3, lr} + bl SOC_Socket + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF804 + + arm_func_start ov00_021FF818 +ov00_021FF818: ; 0x021FF818 + stmdb sp!, {r3, lr} + bl SOC_Close + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF818 + + arm_func_start ov00_021FF82C +ov00_021FF82C: ; 0x021FF82C + stmdb sp!, {r3, lr} + bl SOC_Shutdown + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF82C + + arm_func_start ov00_021FF840 +ov00_021FF840: ; 0x021FF840 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldrh r3, [r1, #2] + cmp r3, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r4, sp, #0 + mov lr, #4 +_021FF864: + ldrb ip, [r1] + ldrb r3, [r1, #1] + add r1, r1, #2 + subs lr, lr, #1 + strb ip, [r4] + strb r3, [r4, #1] + add r4, r4, #2 + bne _021FF864 + add r1, sp, #0 + strb r2, [sp] + bl SOC_Bind + mvn r1, #0 + bl ov00_021FF7EC + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FF840 + + arm_func_start ov00_021FF8A0 +ov00_021FF8A0: ; 0x021FF8A0 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + add r4, sp, #0 + mov lr, #4 +_021FF8B0: + ldrb ip, [r1] + ldrb r3, [r1, #1] + add r1, r1, #2 + subs lr, lr, #1 + strb ip, [r4] + strb r3, [r4, #1] + add r4, r4, #2 + bne _021FF8B0 + add r1, sp, #0 + strb r2, [sp] + bl SOC_Connect + mvn r1, #0 + bl ov00_021FF7EC + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FF8A0 + + arm_func_start ov00_021FF8EC +ov00_021FF8EC: ; 0x021FF8EC + stmdb sp!, {r3, lr} + bl SOC_Listen + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF8EC + + arm_func_start ov00_021FF900 +ov00_021FF900: ; 0x021FF900 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r2 + ldr r2, [r4] + mov r5, r1 + strb r2, [r5] + bl SOC_Accept + ldrb r2, [r5] + mvn r1, #0 + str r2, [r4] + bl ov00_021FF7EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FF900 + + arm_func_start ov00_021FF92C +ov00_021FF92C: ; 0x021FF92C + stmdb sp!, {r3, lr} + bl SOC_Recv + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF92C + + arm_func_start ov00_021FF940 +ov00_021FF940: ; 0x021FF940 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [sp, #0x14] + ldr r5, [sp, #0x10] + ldr ip, [r4] + strb ip, [r5] + str r5, [sp] + bl SOC_RecvFrom + ldrb r2, [r5] + mvn r1, #0 + str r2, [r4] + bl ov00_021FF7EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FF940 + + arm_func_start ov00_021FF970 +ov00_021FF970: ; 0x021FF970 + stmdb sp!, {r3, lr} + bl SOC_Send + mvn r1, #0 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF970 + + arm_func_start ov00_021FF984 +ov00_021FF984: ; 0x021FF984 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr r5, [sp, #0x20] + add r6, sp, #4 + mov r4, #4 +_021FF998: + ldrb lr, [r5] + ldrb ip, [r5, #1] + add r5, r5, #2 + subs r4, r4, #1 + strb lr, [r6] + strb ip, [r6, #1] + add r6, r6, #2 + bne _021FF998 + ldr lr, [sp, #0x24] + add ip, sp, #4 + strb lr, [sp, #4] + str ip, [sp] + bl SOC_SendTo + mvn r1, #0 + bl ov00_021FF7EC + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_021FF984 + + arm_func_start ov00_021FF9DC +ov00_021FF9DC: ; 0x021FF9DC + stmdb sp!, {r3, lr} + ldr r1, [sp, #8] + mov r0, r3 + ldr r2, [r1] + mov r1, #0 + bl MI_CpuFill8 + mov r0, #0 + sub r1, r0, #1 + bl ov00_021FF7EC + ldmia sp!, {r3, pc} + arm_func_end ov00_021FF9DC + + arm_func_start ov00_021FFA04 +ov00_021FFA04: ; 0x021FFA04 + ldr ip, _021FFA14 ; =ov00_021FF7EC + mov r0, #0 + sub r1, r0, #1 + bx ip + .balign 4, 0 +_021FFA14: .word ov00_021FF7EC + arm_func_end ov00_021FFA04 + + arm_func_start ov00_021FFA18 +ov00_021FFA18: ; 0x021FFA18 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r2 + ldr r2, [r4] + mov r5, r1 + strb r2, [r5] + bl SOC_GetSockName + ldrb r2, [r5] + mvn r1, #0 + str r2, [r4] + bl ov00_021FF7EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FFA18 + + arm_func_start ov00_021FFA44 +ov00_021FFA44: ; 0x021FFA44 + stmdb sp!, {r3, lr} + add r1, sp, #0 + bl SOC_InetAtoN + cmp r0, #0 + mvneq r0, #0 + ldrne r0, [sp] + ldmia sp!, {r3, pc} + arm_func_end ov00_021FFA44 + + arm_func_start ov00_021FFA60 +ov00_021FFA60: ; 0x021FFA60 + ldr r0, _021FFA6C ; =ov00_0221B1AC + ldr r0, [r0, #4] + bx lr + .balign 4, 0 +_021FFA6C: .word ov00_0221B1AC + arm_func_end ov00_021FFA60 + + arm_func_start ov00_021FFA70 +ov00_021FFA70: ; 0x021FFA70 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_IsTickAvailable + cmp r0, #1 + beq _021FFA98 + ldr r0, _021FFAC0 ; =ov00_02217E74 + ldr r1, _021FFAC4 ; =ov00_02217E94 + ldr r2, _021FFAC8 ; =ov00_02217E5C + ldr r3, _021FFACC ; =0x00000667 + bl __msl_assertion_failed +_021FFA98: + bl OS_GetTick + mov r1, r1, lsl #6 + orr r1, r1, r0, lsr #26 + ldr r2, _021FFAD0 ; =0x01FF6210 + mov r0, r0, lsl #6 + mov r3, #0 + bl _ll_udiv + cmp r4, #0 + strne r0, [r4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_021FFAC0: .word ov00_02217E74 +_021FFAC4: .word ov00_02217E94 +_021FFAC8: .word ov00_02217E5C +_021FFACC: .word 0x00000667 +_021FFAD0: .word 0x01FF6210 + arm_func_end ov00_021FFA70 + + arm_func_start ov00_021FFAD4 +ov00_021FFAD4: ; 0x021FFAD4 + ldr r2, _021FFB1C ; =0x000041A7 + mov r1, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mul r3, r0, r2 + mov r1, r1, lsr #0x10 + mul r2, r1, r2 + mov r0, r3, lsl #0x11 + add r0, r2, r0, lsr #1 + mvn r1, #0x80000000 + cmp r0, r1 + bichi r0, r0, #0x80000000 + addhi r0, r0, #1 + add r0, r0, r3, lsr #15 + mvn r1, #0x80000000 + cmp r0, r1 + bichi r0, r0, #0x80000000 + addhi r0, r0, #1 + bx lr + .balign 4, 0 +_021FFB1C: .word 0x000041A7 + arm_func_end ov00_021FFAD4 + + arm_func_start ov00_021FFB20 +ov00_021FFB20: ; 0x021FFB20 + stmdb sp!, {r3, lr} + ldr r0, _021FFB3C ; =ov00_02217E58 + ldr r0, [r0] + bl ov00_021FFAD4 + ldr r1, _021FFB3C ; =ov00_02217E58 + str r0, [r1] + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FFB3C: .word ov00_02217E58 + arm_func_end ov00_021FFB20 + + arm_func_start ov00_021FFB40 +ov00_021FFB40: ; 0x021FFB40 + cmp r0, #0 + bicne r1, r0, #0x80000000 + ldr r0, _021FFB58 ; =ov00_02217E58 + moveq r1, #1 + str r1, [r0] + bx lr + .balign 4, 0 +_021FFB58: .word ov00_02217E58 + arm_func_end ov00_021FFB40 + + arm_func_start ov00_021FFB5C +ov00_021FFB5C: ; 0x021FFB5C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + subs r4, r1, r5 + ldmeqia sp!, {r3, r4, r5, pc} + bl ov00_021FFB20 + mov r1, r4 + bl _s32_div_f + add r0, r1, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_021FFB5C + + arm_func_start ov00_021FFB80 +ov00_021FFB80: ; 0x021FFB80 + stmdb sp!, {r3, lr} + cmp r2, #0 + mov ip, #0 + ble _021FFBA8 + add lr, sp, #0 +_021FFB94: + ldrsb r3, [r0, ip] + add ip, ip, #1 + cmp ip, r2 + strb r3, [lr], #1 + blt _021FFB94 +_021FFBA8: + cmp ip, #3 + bge _021FFBCC + add r0, sp, #0 + add r2, r0, ip + mov r0, #0 +_021FFBBC: + add ip, ip, #1 + cmp ip, #3 + strb r0, [r2], #1 + blt _021FFBBC +_021FFBCC: + ldrb r0, [sp] + mov r0, r0, asr #2 + strb r0, [r1] + ldrb r2, [sp] + ldrb r0, [sp, #1] + mov r2, r2, lsl #0x1e + mov r0, r0, asr #4 + orr r0, r0, r2, lsr #26 + strb r0, [r1, #1] + ldrb r2, [sp, #1] + ldrb r0, [sp, #2] + mov r2, r2, lsl #0x1c + mov r0, r0, asr #6 + orr r0, r0, r2, lsr #26 + strb r0, [r1, #2] + ldrb r0, [sp, #2] + and r0, r0, #0x3f + strb r0, [r1, #3] + ldmia sp!, {r3, pc} + arm_func_end ov00_021FFB80 + + arm_func_start ov00_021FFC18 +ov00_021FFC18: ; 0x021FFC18 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r7, r1 + mov r6, r2 + mov sl, r0 + mov r5, r7 + mov sb, r6 + cmp r3, #1 + beq _021FFC44 + cmp r3, #2 + beq _021FFC4C + b _021FFC54 +_021FFC44: + ldr r4, _021FFD40 ; =ov00_02216140 + b _021FFC58 +_021FFC4C: + ldr r4, _021FFD44 ; =ov00_02216144 + b _021FFC58 +_021FFC54: + ldr r4, _021FFD48 ; =ov00_02216148 +_021FFC58: + cmp r6, #0 + ble _021FFC90 + mov r8, #3 +_021FFC64: + cmp sb, #3 + movlt r2, sb + movge r2, r8 + mov r0, sl + mov r1, r7 + bl ov00_021FFB80 + sub sb, sb, #3 + cmp sb, #0 + add r7, r7, #4 + add sl, sl, #3 + bgt _021FFC64 +_021FFC90: + ldr r1, _021FFD4C ; =0x55555556 + mov r2, #3 + smull r0, r3, r1, r6 + add r3, r3, r6, lsr #31 + smull r0, r1, r2, r3 + sub r3, r6, r0 + mov r1, r7 + cmp r3, #1 + subeq r1, r7, #2 + beq _021FFCC0 + cmp r3, #2 + subeq r1, r7, #1 +_021FFCC0: + mov r0, #0 + strb r0, [r7] + cmp r7, r5 + ldmlsia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_021FFCD0: + sub r7, r7, #1 + cmp r7, r1 + ldrhssb r0, [r4, #2] + strhsb r0, [r7] + bhs _021FFD34 + ldrsb r0, [r7] + cmp r0, #0x19 + addle r0, r0, #0x41 + strleb r0, [r7] + ble _021FFD34 + cmp r0, #0x33 + addle r0, r0, #0x47 + strleb r0, [r7] + ble _021FFD34 + cmp r0, #0x3d + suble r0, r0, #4 + strleb r0, [r7] + ble _021FFD34 + cmp r0, #0x3e + ldreqsb r0, [r4] + streqb r0, [r7] + beq _021FFD34 + cmp r0, #0x3f + ldreqsb r0, [r4, #1] + streqb r0, [r7] +_021FFD34: + cmp r7, r5 + bhi _021FFCD0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_021FFD40: .word ov00_02216140 +_021FFD44: .word ov00_02216144 +_021FFD48: .word ov00_02216148 +_021FFD4C: .word 0x55555556 + arm_func_end ov00_021FFC18 + + arm_func_start ov00_021FFD50 +ov00_021FFD50: ; 0x021FFD50 + stmdb sp!, {r3, lr} + ldr r3, _021FFD7C ; =ov00_0221B0D0 + ldr r3, [r3] + cmp r3, #1 + movne r0, #2 + ldmneia sp!, {r3, pc} + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + bl ov00_022008F4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FFD7C: .word ov00_0221B0D0 + arm_func_end ov00_021FFD50 + + arm_func_start ov00_021FFD80 +ov00_021FFD80: ; 0x021FFD80 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + ldmeqia sp!, {r3, pc} + bl ov00_02200A3C + ldmia sp!, {r3, pc} + arm_func_end ov00_021FFD80 + + arm_func_start ov00_021FFD9C +ov00_021FFD9C: ; 0x021FFD9C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + ldr r1, [r1, #0x108] + cmp r1, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + mov r1, #0 + bl ov00_02200ED8 + ldmia sp!, {r3, pc} + arm_func_end ov00_021FFD9C + + arm_func_start ov00_021FFDD0 +ov00_021FFDD0: ; 0x021FFDD0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne ip, [r0] + cmpne ip, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + cmp r1, #0 + blt _021FFDF8 + cmp r1, #6 + blt _021FFE08 +_021FFDF8: + ldr r1, _021FFE1C ; =ov00_02217EC0 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_021FFE08: + add r0, ip, r1, lsl #3 + str r2, [r0, #0x1a4] + str r3, [r0, #0x1a8] + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_021FFE1C: .word ov00_02217EC0 + arm_func_end ov00_021FFDD0 + + arm_func_start ov00_021FFE20 +ov00_021FFE20: ; 0x021FFE20 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x44 + movs lr, r0 + ldrne ip, [lr] + cmpne ip, #0 + addeq sp, sp, #0x44 + moveq r0, #2 + ldmeqia sp!, {r3, r4, pc} + cmp r1, #0 + ldrnesb r4, [r1] + cmpne r4, #0 + addeq sp, sp, #0x44 + moveq r0, #2 + ldmeqia sp!, {r3, r4, pc} + cmp r2, #0 + ldrnesb r4, [r2] + cmpne r4, #0 + addeq sp, sp, #0x44 + moveq r0, #2 + ldmeqia sp!, {r3, r4, pc} + ldr r4, [sp, #0x54] + cmp r4, #0 + bne _021FFE90 + ldr r1, _021FFF1C ; =ov00_02217ED0 + bl ov00_0220A890 + add sp, sp, #0x44 + mov r0, #2 + ldmia sp!, {r3, r4, pc} +_021FFE90: + ldr ip, [ip, #0x108] + cmp ip, #0 + beq _021FFED8 + add r3, sp, #0x24 + mov r0, #0 + mov r2, r3 + mov r1, r0 + stmia r2!, {r0, r1} + stmia r2!, {r0, r1} + stmia r2!, {r0, r1} + stmia r2, {r0, r1} + ldr r2, [sp, #0x58] + mov r0, lr + mov r1, r3 + blx r4 + add sp, sp, #0x44 + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_021FFED8: + ldr lr, _021FFF20 ; =ov00_02217EE0 + mov ip, #0 + str lr, [sp] + stmib sp, {r1, r2, ip} + str r3, [sp, #0x10] + str ip, [sp, #0x14] + ldr r1, [sp, #0x50] + ldr ip, [sp, #0x58] + str r1, [sp, #0x18] + str r4, [sp, #0x1c] + mov r1, lr + mov r2, lr + mov r3, lr + str ip, [sp, #0x20] + bl ov00_022031E4 + add sp, sp, #0x44 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_021FFF1C: .word ov00_02217ED0 +_021FFF20: .word ov00_02217EE0 + arm_func_end ov00_021FFE20 + + arm_func_start ov00_021FFF24 +ov00_021FFF24: ; 0x021FFF24 + stmdb sp!, {r4, lr} + movs r4, r0 + ldrne r1, [r4] + cmpne r1, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r1, #0x108] + cmp r1, #0 + ldmneia sp!, {r4, pc} + mov r1, #1 + bl ov00_02204284 + mov r0, r4 + bl ov00_02200A98 + ldmia sp!, {r4, pc} + arm_func_end ov00_021FFF24 + + arm_func_start ov00_021FFF58 +ov00_021FFF58: ; 0x021FFF58 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x2c + cmp r0, #0 + ldrne r4, [r0] + cmpne r4, #0 + addeq sp, sp, #0x2c + moveq r0, #2 + ldmeqia sp!, {r3, r4, pc} + ldr ip, [sp, #0x48] + cmp ip, #0 + bne _021FFF98 + ldr r1, _02200018 ; =ov00_02217ED0 + bl ov00_0220A890 + add sp, sp, #0x2c + mov r0, #2 + ldmia sp!, {r3, r4, pc} +_021FFF98: + ldr r4, [r4, #0x108] + cmp r4, #0 + beq _021FFFD8 + add r1, sp, #0x1c + mov r4, #0 + ldr r2, [sp, #0x4c] + ldr r3, _0220001C ; =0x00000601 + str r4, [r1, #8] + str r4, [r1] + str r4, [r1, #4] + str r4, [r1, #0xc] + str r3, [sp, #0x24] + blx ip + add sp, sp, #0x2c + mov r0, r4 + ldmia sp!, {r3, r4, pc} +_021FFFD8: + ldr r4, [sp, #0x38] + ldr lr, [sp, #0x3c] + str r4, [sp] + ldr r4, [sp, #0x40] + str lr, [sp, #4] + str r4, [sp, #8] + mov r4, #0 + ldr lr, [sp, #0x44] + str r4, [sp, #0xc] + str lr, [sp, #0x10] + ldr lr, [sp, #0x4c] + str ip, [sp, #0x14] + str lr, [sp, #0x18] + bl ov00_02208330 + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02200018: .word ov00_02217ED0 +_0220001C: .word 0x00000601 + arm_func_end ov00_021FFF58 + + arm_func_start ov00_02200020 +ov00_02200020: ; 0x02200020 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x20c + movs r5, r0 + ldrne r4, [r5] + cmpne r4, #0 + cmpne r1, #0 + addeq sp, sp, #0x20c + moveq r0, #2 + ldmeqia sp!, {r4, r5, pc} + ldr lr, [sp, #0x218] + cmp lr, #0 + bne _02200064 + ldr r1, _022000F4 ; =ov00_02217ED0 + bl ov00_0220A890 + add sp, sp, #0x20c + mov r0, #2 + ldmia sp!, {r4, r5, pc} +_02200064: + ldr ip, [r4, #0x108] + cmp ip, #0 + beq _022000BC + mov r0, #0 + add lr, sp, #8 + mov r1, r0 + mov r2, r0 + mov r3, r0 + mov ip, #0x10 +_02200088: + stmia lr!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _02200088 + ldr r2, [sp, #0x21c] + str r0, [lr] + ldr r3, [sp, #0x218] + add r1, sp, #8 + mov r0, r5 + blx r3 + add sp, sp, #0x20c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_022000BC: + ldr ip, [r4, #0x1d8] + cmp ip, #4 + bne _022000DC + ldr r1, _022000F8 ; =ov00_02217EE4 + bl ov00_0220A890 + add sp, sp, #0x20c + mov r0, #2 + ldmia sp!, {r4, r5, pc} +_022000DC: + ldr ip, [sp, #0x21c] + str lr, [sp] + str ip, [sp, #4] + bl ov00_02205EE8 + add sp, sp, #0x20c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_022000F4: .word ov00_02217ED0 +_022000F8: .word ov00_02217EE4 + arm_func_end ov00_02200020 + + arm_func_start ov00_022000FC +ov00_022000FC: ; 0x022000FC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne ip, [r0] + cmpne ip, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + ldr r3, [ip, #0x108] + cmp r3, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldr r3, [ip, #0x1d8] + cmp r3, #4 + bne _02200140 + ldr r1, _02200148 ; =ov00_02217EE4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_02200140: + bl ov00_02205678 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02200148: .word ov00_02217EE4 + arm_func_end ov00_022000FC + + arm_func_start ov00_0220014C +ov00_0220014C: ; 0x0220014C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + sub sp, sp, #0x400 + movs r6, r0 + ldrne r4, [r6] + mov r5, r1 + cmpne r4, #0 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r4, #0x108] + cmp r1, #0 + addne sp, sp, #4 + addne sp, sp, #0x400 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r4, #0x1d8] + cmp r1, #4 + bne _022001B4 + ldr r1, _022002A0 ; =ov00_02217EE4 + bl ov00_0220A890 + add sp, sp, #4 + add sp, sp, #0x400 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, pc} +_022001B4: + cmp r2, #0 + bne _022001D4 + ldr r1, _022002A4 ; =ov00_02217F14 + bl ov00_0220A890 + add sp, sp, #4 + add sp, sp, #0x400 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, pc} +_022001D4: + mov r1, r2 + ldr r2, _022002A8 ; =0x00000401 + add r0, sp, #0 + bl ov00_0220A348 + ldrsb r0, [sp] + cmp r0, #0 + beq _02200210 + add r2, sp, #0 + mov r1, #0x2f +_022001F8: + ldrsb r0, [r2] + cmp r0, #0x5c + streqb r1, [r2] + ldrsb r0, [r2, #1]! + cmp r0, #0 + bne _022001F8 +_02200210: + ldr r2, _022002AC ; =ov00_02217F24 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, _022002B0 ; =ov00_02217F30 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _022002B4 ; =ov00_02217F3C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r2, r5 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _022002B8 ; =ov00_02217F4C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + add r2, sp, #0 + bl ov00_022020EC + ldr r2, _022002BC ; =ov00_02217F58 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, #0 + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_022002A0: .word ov00_02217EE4 +_022002A4: .word ov00_02217F14 +_022002A8: .word 0x00000401 +_022002AC: .word ov00_02217F24 +_022002B0: .word ov00_02217F30 +_022002B4: .word ov00_02217F3C +_022002B8: .word ov00_02217F4C +_022002BC: .word ov00_02217F58 + arm_func_end ov00_0220014C + + arm_func_start ov00_022002C0 +ov00_022002C0: ; 0x022002C0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0] + cmpne r3, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + ldr r2, [r3, #0x108] + cmp r2, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldr r2, [r3, #0x1d8] + cmp r2, #4 + bne _02200304 + ldr r1, _0220030C ; =ov00_02217EE4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_02200304: + bl ov00_02201CAC + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220030C: .word ov00_02217EE4 + arm_func_end ov00_022002C0 + + arm_func_start ov00_02200310 +ov00_02200310: ; 0x02200310 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + ldrne r5, [r4] + cmpne r5, #0 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r5, #0x108] + cmp r2, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r2, [r5, #0x1d8] + cmp r2, #4 + bne _02200354 + ldr r1, _022003CC ; =ov00_02217EE4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, r4, r5, pc} +_02200354: + add r2, sp, #0 + bl ov00_02207DD0 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [sp] + ldr r0, [r1, #0x14] + sub r0, r0, #1 + str r0, [r1, #0x14] + ldr r0, [r5, #0x100] + cmp r0, #0 + bne _022003C4 + ldr r1, [sp] + ldr r0, [r1, #0x14] + cmp r0, #0 + bgt _022003C4 + ldr r0, [r1, #0x10] + bl ov00_021EC3D8 + ldr r0, [sp] + mov r1, #0 + str r1, [r0, #0x10] + ldr r0, [sp] + bl ov00_02207FB8 + cmp r0, #0 + beq _022003C4 + ldr r1, [sp] + mov r0, r4 + bl ov00_02207E40 +_022003C4: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022003CC: .word ov00_02217EE4 + arm_func_end ov00_02200310 + + arm_func_start ov00_022003D0 +ov00_022003D0: ; 0x022003D0 + cmp r0, #0 + ldrne r2, [r0] + cmpne r2, #0 + moveq r0, #2 + bxeq lr + ldr r0, [r2, #0x108] + cmp r0, #0 + mov r0, #0 + strne r0, [r1] + ldreq r2, [r2, #0x430] + streq r2, [r1] + bx lr + arm_func_end ov00_022003D0 + + arm_func_start ov00_02200400 +ov00_02200400: ; 0x02200400 + stmdb sp!, {r4, r5, r6, lr} + movs r4, r0 + ldrne r3, [r4] + mov r5, r2 + cmpne r3, #0 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r2, [r3, #0x108] + cmp r2, #0 + beq _02200440 + mov r0, r5 + mov r1, #0 + mov r2, #0x210 + bl memset + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_02200440: + cmp r5, #0 + bne _02200458 + ldr r1, _02200528 ; =ov00_02217F60 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_02200458: + cmp r1, #0 + ldr r2, [r3, #0x430] + blt _0220046C + cmp r1, r2 + blt _02200480 +_0220046C: + ldr r1, _0220052C ; =ov00_02217F70 + mov r0, r4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_02200480: + bl ov00_02207F88 + movs r6, r0 + bne _022004A0 + ldr r1, _0220052C ; =ov00_02217F70 + mov r0, r4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_022004A0: + ldr r4, [r6, #8] + cmp r4, #0 + bne _022004C0 + ldr r0, _02200530 ; =ov00_02217F80 + ldr r1, _02200534 ; =ov00_02217F8C + ldr r2, _02200538 ; =ov00_02217EAC + ldr r3, _0220053C ; =0x000005CF + bl __msl_assertion_failed +_022004C0: + ldr r0, [r6] + str r0, [r5] + ldr r0, [r4, #4] + str r0, [r5, #4] + ldr r1, [r4, #8] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r1] + beq _022004F0 + add r0, r5, #8 + mov r2, #0x100 + bl ov00_0220A348 +_022004F0: + ldr r1, [r4, #0xc] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r1] + beq _02200510 + add r0, r5, #0x108 + mov r2, #0x100 + bl ov00_0220A348 +_02200510: + ldr r1, [r4, #0x10] + mov r0, #0 + str r1, [r5, #0x208] + ldr r1, [r4, #0x14] + str r1, [r5, #0x20c] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02200528: .word ov00_02217F60 +_0220052C: .word ov00_02217F70 +_02200530: .word ov00_02217F80 +_02200534: .word ov00_02217F8C +_02200538: .word ov00_02217EAC +_0220053C: .word 0x000005CF + arm_func_end ov00_02200400 + + arm_func_start ov00_02200540 +ov00_02200540: ; 0x02200540 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r2 + cmp r0, #0 + ldrne r2, [r0] + cmpne r2, #0 + addeq sp, sp, #4 + moveq r0, #2 + ldmeqia sp!, {r3, r4, pc} + ldr r2, [r2, #0x108] + cmp r2, #0 + movne r0, #0 + addne sp, sp, #4 + strne r0, [r4] + ldmneia sp!, {r3, r4, pc} + add r2, sp, #0 + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp] + ldrne r0, [r0, #8] + cmpne r0, #0 + ldrne r0, [r0] + strne r0, [r4] + mvneq r0, #0 + streq r0, [r4] + mov r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_02200540 + + arm_func_start ov00_022005B0 +ov00_022005B0: ; 0x022005B0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r2, [r0] + cmpne r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r2, [r2, #0x108] + cmp r2, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + add r2, sp, #0 + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp] + ldrne r0, [r0, #8] + cmpne r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_022005B0 + + arm_func_start ov00_022005FC +ov00_022005FC: ; 0x022005FC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0] + cmpne r3, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + ldr r2, [r3, #0x108] + cmp r2, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldr r2, [r3, #0x1d8] + cmp r2, #4 + bne _02200640 + ldr r1, _02200650 ; =ov00_02217EE4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_02200640: + bl ov00_02201D9C + cmp r0, #0 + moveq r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02200650: .word ov00_02217EE4 + arm_func_end ov00_022005FC + + arm_func_start ov00_02200654 +ov00_02200654: ; 0x02200654 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x200 + movs r7, r0 + ldrne r4, [r7] + mov r6, r1 + cmpne r4, #0 + mov r5, r3 + addeq sp, sp, #0x200 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #0x108] + cmp r1, #0 + addne sp, sp, #0x200 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #0x1d8] + cmp r1, #4 + bne _022006B0 + ldr r1, _02200860 ; =ov00_02217EE4 + bl ov00_0220A890 + add sp, sp, #0x200 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022006B0: + cmp r2, #0 + bne _022006CC + ldr r1, _02200864 ; =ov00_02217F94 + bl ov00_0220A890 + add sp, sp, #0x200 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022006CC: + cmp r5, #0 + bne _022006E8 + ldr r1, _02200868 ; =ov00_02217FAC + bl ov00_0220A890 + add sp, sp, #0x200 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022006E8: + mov r1, r2 + add r0, sp, #0x100 + mov r2, #0x100 + bl ov00_0220A348 + add r0, sp, #0x100 + ldrsb r0, [r0] + cmp r0, #0 + beq _02200728 + add r2, sp, #0x100 + mov r1, #0x2f +_02200710: + ldrsb r0, [r2] + cmp r0, #0x5c + streqb r1, [r2] + ldrsb r0, [r2, #1]! + cmp r0, #0 + bne _02200710 +_02200728: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldrsb r0, [sp] + cmp r0, #0 + beq _02200764 + add r2, sp, #0 + mov r1, #0x2f +_0220074C: + ldrsb r0, [r2] + cmp r0, #0x5c + streqb r1, [r2] + ldrsb r0, [r2, #1]! + cmp r0, #0 + bne _0220074C +_02200764: + ldr r0, [r4, #0x214] + cmp r6, r0 + bne _022007A0 + add r0, sp, #0x100 + add r1, r4, #0x218 + bl strcmp + cmp r0, #0 + bne _022007A0 + add r0, sp, #0 + add r1, r4, #0x318 + bl strcmp + cmp r0, #0 + addeq sp, sp, #0x200 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_022007A0: + add r1, sp, #0x100 + add r0, r4, #0x218 + mov r2, #0x100 + str r6, [r4, #0x214] + bl ov00_0220A348 + add r1, sp, #0 + add r0, r4, #0x318 + mov r2, #0x100 + bl ov00_0220A348 + ldr r2, _0220086C ; =ov00_02217FC4 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r7 + mov r2, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02200870 ; =ov00_02217F30 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02200874 ; =ov00_02217FD0 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r7 + add r1, r4, #0x1f4 + add r2, sp, #0x100 + bl ov00_022020EC + ldr r2, _02200878 ; =ov00_02217FE0 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r7 + add r1, r4, #0x1f4 + add r2, sp, #0 + bl ov00_022020EC + ldr r2, _0220087C ; =ov00_02217F58 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, #0 + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02200860: .word ov00_02217EE4 +_02200864: .word ov00_02217F94 +_02200868: .word ov00_02217FAC +_0220086C: .word ov00_02217FC4 +_02200870: .word ov00_02217F30 +_02200874: .word ov00_02217FD0 +_02200878: .word ov00_02217FE0 +_0220087C: .word ov00_02217F58 + arm_func_end ov00_02200654 + + arm_func_start ov00_02200880 +ov00_02200880: ; 0x02200880 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne ip, [r0] + mov r3, r2 + cmpne ip, #0 + moveq r0, #2 + ldmeqia sp!, {r3, pc} + ldr r2, [ip, #0x108] + cmp r2, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldr r2, [ip, #0x1d8] + cmp r2, #4 + bne _022008C8 + ldr r1, _022008EC ; =ov00_02217EE4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_022008C8: + cmp r3, #0 + bne _022008E0 + ldr r1, _022008F0 ; =ov00_02217FEC + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, pc} +_022008E0: + mov r2, #1 + bl ov00_02201BC4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022008EC: .word ov00_02217EE4 +_022008F0: .word ov00_02217FEC + arm_func_end ov00_02200880 + + arm_func_start ov00_022008F4 +ov00_022008F4: ; 0x022008F4 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + mov r0, #0 + str r0, [r6] + mov r0, #0x490 + mov r5, r1 + mov r4, r2 + bl ov00_021EC3A8 + str r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r1, #0 + mov r2, #0x490 + bl memset + ldr r0, [sp] + mov r3, #0 + strb r3, [r0] + ldr r0, [sp] + mov r2, #1 + str r3, [r0, #0x418] + ldr r1, [sp] + add r0, sp, #0 + str r2, [r1, #0x100] + ldr r1, [sp] + str r3, [r1, #0x104] + ldr r1, [sp] + str r3, [r1, #0x108] + ldr r1, [sp] + str r3, [r1, #0x10c] + ldr r1, [sp] + str r5, [r1, #0x46c] + ldr r1, [sp] + str r4, [r1, #0x470] + bl ov00_02207B34 + cmp r0, #0 + bne _022009AC + ldr r0, [sp] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sp] + add sp, sp, #4 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, pc} +_022009AC: + ldr r0, [sp] + mov r1, #0 + str r1, [r0, #0x420] + mov r3, r1 +_022009BC: + ldr r0, [sp] + add r0, r0, r1, lsl #3 + str r3, [r0, #0x1a4] + ldr r0, [sp] + add r0, r0, r1, lsl #3 + add r1, r1, #1 + str r3, [r0, #0x1a8] + cmp r1, #6 + blt _022009BC + ldr r2, [sp] + ldr r1, _02200A38 ; =ov00_0221800C + add r0, sp, #0 + str r3, [r2, #0x460] + bl ov00_0220A3BC + add r0, sp, #0 + bl ov00_02200A98 + movs r4, r0 + beq _02200A18 + add r0, sp, #0 + bl ov00_02200A3C + add sp, sp, #4 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, pc} +_02200A18: + bl ov00_021FF3CC + bl ov00_021FF368 + bl srand + ldr r1, [sp] + mov r0, #0 + str r1, [r6] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02200A38: .word ov00_0221800C + arm_func_end ov00_022008F4 + + arm_func_start ov00_02200A3C +ov00_02200A3C: ; 0x02200A3C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5] + mov r1, #1 + bl ov00_02204284 + ldr r0, [r4, #0x460] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x460] + ldr r0, [r4, #0x428] + bl ov00_021FEE8C + mov r0, r4 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02200A3C + + arm_func_start ov00_02200A7C +ov00_02200A7C: ; 0x02200A7C + mov r0, #0 + str r0, [r1, #8] + str r0, [r1, #0x10] + str r0, [r1, #0x14] + str r0, [r1, #0x18] + mov r0, #1 + bx lr + arm_func_end ov00_02200A7C + + arm_func_start ov00_02200A98 +ov00_02200A98: ; 0x02200A98 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5] + mov r1, #0 + strb r1, [r4, #0x110] + strb r1, [r4, #0x12f] + strb r1, [r4, #0x144] + sub r0, r1, #1 + str r0, [r4, #0x1d4] + str r1, [r4, #0x1d8] + str r1, [r4, #0x1e4] + str r1, [r4, #0x1e8] + str r1, [r4, #0x1e0] + ldr r0, [r4, #0x1dc] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1dc] + str r0, [r4, #0x1f0] + ldr r0, [r4, #0x1ec] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1ec] + str r0, [r4, #0x1fc] + str r0, [r4, #0x200] + str r0, [r4, #0x1f8] + ldr r0, [r4, #0x1f4] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1f4] + str r0, [r4, #0x448] + str r0, [r4, #0x44c] + str r0, [r4, #0x444] + ldr r0, [r4, #0x440] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x440] + str r0, [r4, #0x458] + str r0, [r4, #0x45c] + str r0, [r4, #0x454] + ldr r0, [r4, #0x450] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x450] + sub r0, r0, #1 + str r0, [r4, #0x204] + mov r0, #2 + str r0, [r4, #0x20c] + ldr r1, [r4, #0x424] + cmp r1, #0 + beq _02200B74 +_02200B60: + mov r0, r5 + bl ov00_022066D0 + ldr r1, [r4, #0x424] + cmp r1, #0 + bne _02200B60 +_02200B74: + mov r2, #0 + str r2, [r4, #0x424] + ldr r1, _02200BBC ; =ov00_02200A7C + mov r0, r5 + str r2, [r4, #0x430] + bl ov00_02207F1C + mov r0, #0 + str r0, [r4, #0x19c] + str r0, [r4, #0x1a0] + str r0, [r4, #0x198] + str r0, [r4, #0x210] + str r0, [r4, #0x41c] + str r0, [r4, #0x434] + sub r1, r0, #1 + str r1, [r4, #0x214] + strb r0, [r4, #0x218] + strb r0, [r4, #0x318] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02200BBC: .word ov00_02200A7C + arm_func_end ov00_02200A98 + + arm_func_start ov00_02200BC0 +ov00_02200BC0: ; 0x02200BC0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov r1, #0 + mov r4, r0 + str r1, [sp, #8] + ldr sl, [r4] +_02200BD8: + mov r0, r4 + add r1, sl, #0x1f4 + bl ov00_02205064 + mov r1, #1 + ldr r0, _02200EAC ; =ov00_02218030 + str r1, [sp] + str r0, [sp, #4] + ldr r1, [sl, #0x1d4] + add r3, sp, #8 + mov r0, r4 + add r2, sl, #0x1f4 + bl ov00_0220267C + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r1, sp, #8 + ldr r0, _02200EAC ; =ov00_02218030 + str r1, [sp] + str r0, [sp, #4] + ldr r1, [sl, #0x1d4] + add r3, sp, #0xc + mov r0, r4 + add r2, sl, #0x1dc + bl ov00_02202454 + cmp r0, #0 + beq _02200C78 + cmp r0, #3 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, _02200EB0 ; =ov00_02218034 + mov r0, r4 + mov r1, #5 + bl ov00_0220A86C + mov r0, r4 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x14 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02200C78: + ldr r0, [sl, #0x1dc] + ldr r1, _02200EB4 ; =ov00_02218060 + bl strstr + movs r5, r0 + beq _02200E48 + ldr r6, _02200EB8 ; =ov00_02218084 + ldr r8, _02200EBC ; =ov00_02218068 + add fp, sp, #0x10 + mov r7, #0x800 + mov sb, #0 +_02200CA0: + strb sb, [r5] + mov r0, r4 + mov r1, r8 + ldr r2, [sl, #0x1dc] + bl ov00_0220A3BC + ldr r0, [sl, #0x1dc] + sub r1, r5, r0 + str r1, [sp, #0xc] + ldr r0, [sl, #0x1f0] + cmp r1, r0 + ble _02200D10 + ldr r0, [sl, #0x1f0] + cmp r1, #0x800 + movlt r1, r7 + add r0, r0, r1 + str r0, [sl, #0x1f0] + add r1, r0, #1 + ldr r0, [sl, #0x1ec] + bl ov00_021EC3BC + cmp r0, #0 + bne _02200D0C + ldr r1, _02200EC0 ; =ov00_02218074 + mov r0, r4 + bl ov00_0220A890 + add sp, sp, #0x14 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02200D0C: + str r0, [sl, #0x1ec] +_02200D10: + ldr r2, [sp, #0xc] + ldr r0, [sl, #0x1ec] + ldr r1, [sl, #0x1dc] + add r2, r2, #1 + bl memcpy + ldr r0, [sl, #0x1dc] + add r1, r5, #7 + ldr r2, [sl, #0x1e4] + sub r0, r1, r0 + sub r0, r2, r0 + str r0, [sl, #0x1e4] + add r2, r0, #1 + ldr r0, [sl, #0x1dc] + bl memmove + ldr r5, [sl, #0x1ec] + mov r1, r6 + mov r0, r5 + bl strstr + cmp r0, #0 + beq _02200DB8 + add r0, r0, #4 + bl atoi + mov r5, r0 + mov r0, r4 + mov r1, fp + mov r2, r5 + bl ov00_02206720 + cmp r0, #0 + bne _02200D98 + ldr r1, _02200EC4 ; =ov00_0221808C + mov r2, r5 + mov r0, r4 + bl ov00_0220A3BC + b _02200E34 +_02200D98: + mov r0, r4 + ldr r1, [sp, #0x10] + ldr r2, [sl, #0x1ec] + bl ov00_022067A8 + cmp r0, #0 + beq _02200E34 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02200DB8: + mov r1, r5 + mov r0, r4 + mov r2, #1 + bl ov00_0220A3C8 + cmp r0, #0 + addne sp, sp, #0x14 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, [sl, #0x1ec] + ldr r1, _02200EC8 ; =ov00_022180B4 + mov r0, r5 + mov r2, #4 + bl strncmp + cmp r0, #0 + bne _02200E10 + mov r1, r5 + mov r0, r4 + bl ov00_02201134 + cmp r0, #0 + beq _02200E34 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02200E10: + ldr r1, _02200ECC ; =ov00_022180BC + mov r0, r5 + mov r2, #0xa + bl strncmp + cmp r0, #0 + beq _02200E34 + ldr r1, _02200ED0 ; =ov00_022180C4 + mov r0, r4 + bl ov00_0220A3BC +_02200E34: + ldr r0, [sl, #0x1dc] + ldr r1, _02200EB4 ; =ov00_02218060 + bl strstr + movs r5, r0 + bne _02200CA0 +_02200E48: + ldr r0, [sp, #8] + cmp r0, #0 + beq _02200E80 + ldr r2, _02200ED4 ; =ov00_022180F4 + mov r0, r4 + mov r1, #7 + bl ov00_0220A86C + mov r0, r4 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02200E80: + mov r0, r4 + bl ov00_0220676C + movs r5, r0 + beq _02200E98 + mov r0, #0xa + bl ov00_021FF3C0 +_02200E98: + cmp r5, #0 + bne _02200BD8 + mov r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02200EAC: .word ov00_02218030 +_02200EB0: .word ov00_02218034 +_02200EB4: .word ov00_02218060 +_02200EB8: .word ov00_02218084 +_02200EBC: .word ov00_02218068 +_02200EC0: .word ov00_02218074 +_02200EC4: .word ov00_0221808C +_02200EC8: .word ov00_022180B4 +_02200ECC: .word ov00_022180BC +_02200ED0: .word ov00_022180C4 +_02200ED4: .word ov00_022180F4 + arm_func_end ov00_02200BC0 + + arm_func_start ov00_02200ED8 +ov00_02200ED8: ; 0x02200ED8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r6, [sl] + mov sb, r1 + ldr r0, [r6, #0x1d8] + mov r7, #0 + cmp r0, #4 + bls _02200F0C + ldr r0, _02201078 ; =ov00_0221811C + ldr r1, _0220107C ; =ov00_02218214 + ldr r2, _02201080 ; =ov00_02218000 + ldr r3, _02201084 ; =0x000001B6 + bl __msl_assertion_failed +_02200F0C: + ldr r0, [r6, #0x1d8] + cmp r0, #1 + bne _02200FAC + mov r4, #0 + mov r5, #1 + mov fp, #0xa +_02200F24: + mov r0, sl + bl ov00_0220411C + movs r7, r0 + bne _02200F4C + cmp sb, #0 + beq _02200F4C + ldr r0, [r6, #0x1d8] + cmp r0, #1 + moveq r8, r5 + beq _02200F50 +_02200F4C: + mov r8, r4 +_02200F50: + cmp r8, #0 + beq _02200F60 + mov r0, fp + bl ov00_021FF3C0 +_02200F60: + cmp r8, #0 + bne _02200F24 + cmp r7, #0 + beq _02200FAC + add r1, sp, #0 + mov r0, sl + mov r2, #1 + bl ov00_02206720 + cmp r0, #0 + beq _02200F98 + ldr r0, [sp] + mov r1, #4 + str r1, [r0, #0x1c] + b _02200FAC +_02200F98: + ldr r0, _02201088 ; =ov00_0221821C + ldr r1, _0220107C ; =ov00_02218214 + ldr r2, _02201080 ; =ov00_02218000 + mov r3, #0x1dc + bl __msl_assertion_failed +_02200FAC: + ldr r0, [r6, #0x1d8] + sub r0, r0, #2 + cmp r0, #1 + bhi _02200FE4 + cmp r7, #0 + bne _02200FD0 + mov r0, sl + bl ov00_02200BC0 + mov r7, r0 +_02200FD0: + cmp r7, #0 + bne _02200FE4 + mov r0, sl + bl ov00_022073E8 + mov r7, r0 +_02200FE4: + cmp r7, #0 + bne _02200FF8 + mov r0, sl + bl ov00_02209FCC + mov r7, r0 +_02200FF8: + ldr r1, [r6, #0x424] + str r1, [sp] + cmp r1, #0 + beq _02201044 +_02201008: + ldr r0, [r1, #0x1c] + cmp r0, #0 + ldreq r0, [r1, #0x20] + streq r0, [sp] + beq _02201038 + mov r0, sl + bl ov00_02206230 + ldr r1, [sp] + mov r0, sl + ldr r2, [r1, #0x20] + str r2, [sp] + bl ov00_022066D0 +_02201038: + ldr r1, [sp] + cmp r1, #0 + bne _02201008 +_02201044: + mov r0, sl + mov r1, sb + bl ov00_02202D20 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r6, #0x41c] + cmp r0, #0 + beq _02201070 + mov r0, sl + mov r1, #0 + bl ov00_02204284 +_02201070: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02201078: .word ov00_0221811C +_0220107C: .word ov00_02218214 +_02201080: .word ov00_02218000 +_02201084: .word 0x000001B6 +_02201088: .word ov00_0221821C + arm_func_end ov00_02200ED8 + + arm_func_start ov00_0220108C +ov00_0220108C: ; 0x0220108C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6] + ldr r2, _02201120 ; =ov00_02218230 + mov r5, r1 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, _02201124 ; =ov00_0221823C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02201128 ; =ov00_02218248 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, [r5] + bl ov00_0220211C + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _0220112C ; =ov00_02218258 + bl ov00_022020EC + ldr r2, [r5, #0x10] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _02201130 ; =ov00_02218260 + bl ov00_022020EC + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02201120: .word ov00_02218230 +_02201124: .word ov00_0221823C +_02201128: .word ov00_02218248 +_0220112C: .word ov00_02218258 +_02201130: .word ov00_02218260 + arm_func_end ov00_0220108C + + arm_func_start ov00_02201134 +ov00_02201134: ; 0x02201134 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x138 + sub sp, sp, #0x1000 + mov r7, r1 + mov sl, r0 + ldr r1, _02201AA8 ; =ov00_02218268 + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + ldr r8, [sl] + bl ov00_0220A4A0 + cmp r0, #0 + bne _02201198 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201198: + add r0, sp, #0x138 + bl atoi + mov r4, r0 + ldr r1, _02201AB0 ; =ov00_022182A0 + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + bne _022011F0 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022011F0: + add r0, sp, #0x138 + bl atoi + mov r6, r0 + ldr r1, _02201AB4 ; =ov00_022182A4 + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + beq _02201224 + add r0, sp, #0x138 + bl atoi + b _0220122C +_02201224: + mov r0, #0 + bl ov00_021FFA70 +_0220122C: + mov sb, r0 + cmp r4, #0x64 + bgt _0220125C + bge _02201548 + cmp r4, #2 + bgt _02201A98 + cmp r4, #1 + blt _02201A98 + beq _0220127C + cmp r4, #2 + beq _02201388 + b _02201A98 +_0220125C: + cmp r4, #0x66 + bgt _02201A98 + cmp r4, #0x65 + blt _02201A98 + beq _022018A8 + cmp r4, #0x66 + beq _02201A38 + b _02201A98 +_0220127C: + ldr r1, [r8, #0x1bc] + ldr r0, [r8, #0x1c0] + str r1, [sp, #0x20] + str r0, [sp, #0x24] + cmp r1, #0 + beq _02201A98 + mov r0, #0xc + bl ov00_021EC3A8 + movs r4, r0 + bne _022012C0 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022012C0: + ldr r1, _02201ABC ; =ov00_022182BC + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + bne _0220130C + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220130C: + add r0, sp, #0x138 + bl strlen + add r0, r0, #1 + bl ov00_021EC3A8 + str r0, [r4, #8] + cmp r0, #0 + bne _02201344 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201344: + add r1, sp, #0x138 + bl strcpy + stmia r4, {r6, sb} + mov r2, #0 + str r2, [sp] + mov r2, #2 + add r1, sp, #0x20 + str r2, [sp, #4] + mov r0, sl + mov r3, r4 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02201A98 + add sp, sp, #0x138 + add sp, sp, #0x1000 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201388: + mov r0, sl + mov r1, r6 + bl ov00_02207CEC + movs r5, r0 + bne _022013B8 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022013B8: + ldr r1, _02201ABC ; =ov00_022182BC + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02201404 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201404: + ldr r1, _02201AC0 ; =ov00_022182C4 + add r0, sp, #0x138 + bl strstr + movs r4, r0 + bne _02201448 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201448: + mov r1, #0 + add r0, r4, #8 + strb r1, [r4] + bl strlen + cmp r0, #0x20 + beq _02201490 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201490: + ldr r0, [r5, #0x10] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #0x10] + add r0, r4, #8 + bl ov00_021FF3D4 + str r0, [r5, #0x10] + ldr r0, [r5, #0x14] + add r0, r0, #1 + str r0, [r5, #0x14] + ldr r1, [r8, #0x1ac] + ldr r0, [r8, #0x1b0] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + beq _02201A98 + ldr r0, _02201AC4 ; =0x0000040C + bl ov00_021EC3A8 + movs r4, r0 + bne _022014FC + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022014FC: + ldr r2, _02201AC8 ; =0x00000401 + add r1, sp, #0x138 + add r0, r4, #8 + bl ov00_0220A348 + stmia r4, {r6, sb} + mov r2, #0 + str r2, [sp] + mov r2, #6 + add r1, sp, #8 + str r2, [sp, #4] + mov r0, sl + mov r3, r4 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02201A98 + add sp, sp, #0x138 + add sp, sp, #0x1000 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201548: + mov r0, sl + mov r1, r6 + bl ov00_02207CEC + movs r4, r0 + bne _02201578 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201578: + ldr r0, [r4, #8] + cmp r0, #0 + bne _022015EC + mov r0, #0x18 + bl ov00_021EC3A8 + str r0, [r4, #8] + cmp r0, #0 + bne _022015B4 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022015B4: + mov r2, #6 + mov r1, #0 +_022015BC: + strb r1, [r0] + strb r1, [r0, #1] + strb r1, [r0, #2] + strb r1, [r0, #3] + add r0, r0, #4 + subs r2, r2, #1 + bne _022015BC + ldr r1, [r8, #0x430] + add r0, r1, #1 + str r0, [r8, #0x430] + ldr r0, [r4, #8] + str r1, [r0] +_022015EC: + ldr r1, _02201ABC ; =ov00_022182BC + mov r0, r7 + add r2, sp, #0x138 + mov r3, #0x1000 + ldr r7, [r4, #8] + bl ov00_0220A4A0 + cmp r0, #0 + bne _0220163C + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220163C: + ldr r1, _02201ACC ; =ov00_022182D0 + add r0, sp, #0x138 + add r2, sp, #0x28 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02201688 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201688: + add r0, sp, #0x28 + bl atoi + str r0, [r7, #4] + ldr r0, [r7, #8] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r7, #8] + ldr r1, _02201AD0 ; =ov00_022182D4 + add r0, sp, #0x138 + add r2, sp, #0x38 + mov r3, #0x100 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streqb r0, [sp, #0x38] + add r0, sp, #0x38 + bl ov00_021FF3D4 + str r0, [r7, #8] + cmp r0, #0 + bne _022016F4 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022016F4: + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + mov r4, #0 + ldr r1, _02201AD4 ; =ov00_022182DC + add r0, sp, #0x138 + add r2, sp, #0x38 + mov r3, #0x100 + str r4, [r7, #0xc] + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, r4 + streqb r0, [sp, #0x38] + add r0, sp, #0x38 + bl ov00_021FF3D4 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02201754 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201754: + ldr r1, _02201AD8 ; =ov00_022182E4 + add r0, sp, #0x138 + add r2, sp, #0x28 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + beq _022017CC + add r0, sp, #0x28 + bl atoi + mov r5, r0 + add r0, sp, #0x28 + bl atoi + mov fp, r0 + add r0, sp, #0x28 + bl atoi + mov r4, r0 + add r0, sp, #0x28 + bl atoi + mov r1, r4, lsr #0x18 + mov r0, r0, lsr #8 + mov r2, fp, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r5, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 +_022017CC: + ldr r1, _02201ADC ; =ov00_022182EC + str r0, [r7, #0x10] + add r0, sp, #0x138 + add r2, sp, #0x28 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + beq _0220181C + add r0, sp, #0x28 + bl atoi + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 +_0220181C: + str r0, [r7, #0x14] + ldr r1, [r8, #0x1b4] + ldr r0, [r8, #0x1b8] + str r1, [sp, #0x10] + str r0, [sp, #0x14] + cmp r1, #0 + beq _02201A98 + mov r0, #0xc + bl ov00_021EC3A8 + movs r3, r0 + bne _02201864 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201864: + str r6, [r3] + ldr r0, [r7] + mov r2, #0 + str r0, [r3, #8] + str sb, [r3, #4] + str r2, [sp] + mov r2, #5 + add r1, sp, #0x10 + str r2, [sp, #4] + mov r0, sl + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02201A98 + add sp, sp, #0x138 + add sp, sp, #0x1000 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022018A8: + ldr r1, _02201ABC ; =ov00_022182BC + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + bne _022018F4 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022018F4: + ldr r1, _02201ADC ; =ov00_022182EC + add r0, sp, #0x138 + bl strstr + cmp r0, #0 + bne _02201938 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201938: + ldrsb r1, [r0, #3] + cmp r1, #0 + bne _02201974 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201974: + add r0, r0, #3 + bl atoi + mov r4, r0 + ldr r1, _02201AE0 ; =ov00_022182F0 + add r0, sp, #0x138 + bl strstr + movs r1, r0 + moveq r0, #0 + streqb r0, [sp, #0x38] + beq _022019AC + add r0, sp, #0x38 + add r1, r1, #3 + mov r2, #0x100 + bl ov00_0220A348 +_022019AC: + ldr r1, [r8, #0x1c4] + ldr r0, [r8, #0x1c8] + str r1, [sp, #0x18] + str r0, [sp, #0x1c] + cmp r1, #0 + beq _02201A98 + mov r0, #0x108 + bl ov00_021EC3A8 + movs r5, r0 + bne _022019F0 + ldr r1, _02201AB8 ; =ov00_022182AC + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022019F0: + str r6, [r5] + add r1, sp, #0x38 + add r0, r5, #8 + str r4, [r5, #4] + bl strcpy + mov r2, #0 + str r2, [sp] + add r1, sp, #0x18 + str r2, [sp, #4] + mov r0, sl + mov r3, r5 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02201A98 + add sp, sp, #0x138 + add sp, sp, #0x1000 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201A38: + ldr r1, _02201ABC ; =ov00_022182BC + add r2, sp, #0x138 + mov r0, r7 + mov r3, #0x1000 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02201A84 + ldr r2, _02201AAC ; =ov00_02218270 + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x138 + add sp, sp, #0x1000 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02201A84: + ldr r3, _02201AE4 ; =ov00_022182F4 + mov r0, sl + mov r1, r6 + mov r2, #0x67 + bl ov00_02201BC4 +_02201A98: + mov r0, #0 + add sp, sp, #0x138 + add sp, sp, #0x1000 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02201AA8: .word ov00_02218268 +_02201AAC: .word ov00_02218270 +_02201AB0: .word ov00_022182A0 +_02201AB4: .word ov00_022182A4 +_02201AB8: .word ov00_022182AC +_02201ABC: .word ov00_022182BC +_02201AC0: .word ov00_022182C4 +_02201AC4: .word 0x0000040C +_02201AC8: .word 0x00000401 +_02201ACC: .word ov00_022182D0 +_02201AD0: .word ov00_022182D4 +_02201AD4: .word ov00_022182DC +_02201AD8: .word ov00_022182E4 +_02201ADC: .word ov00_022182EC +_02201AE0: .word ov00_022182F0 +_02201AE4: .word ov00_022182F4 + arm_func_end ov00_02201134 + + arm_func_start ov00_02201AE8 +ov00_02201AE8: ; 0x02201AE8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0xdb0 + mov r7, r0 + mov r5, r2 + mov r6, r1 + ldr r2, _02201BAC ; =0x00000DAD + add r0, sp, #0 + mov r1, r3 + ldr r4, [r7] + bl ov00_0220A348 + ldr r2, _02201BB0 ; =ov00_02218268 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r7 + mov r2, r5 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02201BB4 ; =ov00_0221823C + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02201BB8 ; =ov00_022182F8 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r2, r6 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02201BBC ; =ov00_022182BC + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r7 + add r1, r4, #0x1f4 + add r2, sp, #0 + bl ov00_022020EC + ldr r2, _02201BC0 ; =ov00_02218260 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, #0 + add sp, sp, #0xdb0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02201BAC: .word 0x00000DAD +_02201BB0: .word ov00_02218268 +_02201BB4: .word ov00_0221823C +_02201BB8: .word ov00_022182F8 +_02201BBC: .word ov00_022182BC +_02201BC0: .word ov00_02218260 + arm_func_end ov00_02201AE8 + + arm_func_start ov00_02201BC4 +ov00_02201BC4: ; 0x02201BC4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_022074D8 + movs r8, r0 + bne _02201C88 + add r2, sp, #0 + mov r0, r7 + mov r1, r6 + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp] + ldrne r0, [r0, #8] + cmpne r0, #0 + ldrne r0, [r0, #0x14] + cmpne r0, #0 + mov r0, r7 + bne _02201C30 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov00_02201AE8 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02201C30: + mov r1, r6 + mov r2, #1 + bl ov00_0220752C + movs r8, r0 + addeq sp, sp, #4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [sp] + mov r1, r8 + ldr r0, [r0, #0x18] + cmp r0, #0 + mov r0, r7 + bne _02201C78 + bl ov00_022075AC + cmp r0, #0 + beq _02201C88 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02201C78: + bl ov00_02207610 + cmp r0, #0 + addne sp, sp, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02201C88: + mov r0, r7 + mov r1, r8 + mov r2, r5 + mov r3, r4 + bl ov00_0220779C + cmp r0, #0 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov00_02201BC4 + + arm_func_start ov00_02201CAC +ov00_02201CAC: ; 0x02201CAC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + add r2, sp, #0 + ldr r5, [r4] + bl ov00_02207DD0 + cmp r0, #0 + bne _02201CDC + ldr r1, _02201D74 ; =ov00_022182FC + mov r0, r4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, r4, r5, pc} +_02201CDC: + ldr r1, [sp] + ldr r0, [r1, #0x10] + cmp r0, #0 + bne _02201D00 + ldr r1, _02201D74 ; =ov00_022182FC + mov r0, r4 + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, r4, r5, pc} +_02201D00: + mov r0, r4 + bl ov00_0220108C + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [sp] + ldr r0, [r1, #0x14] + sub r0, r0, #1 + str r0, [r1, #0x14] + ldr r0, [r5, #0x100] + cmp r0, #0 + bne _02201D6C + ldr r1, [sp] + ldr r0, [r1, #0x14] + cmp r0, #0 + bgt _02201D6C + ldr r0, [r1, #0x10] + bl ov00_021EC3D8 + ldr r0, [sp] + mov r1, #0 + str r1, [r0, #0x10] + ldr r0, [sp] + bl ov00_02207FB8 + cmp r0, #0 + beq _02201D6C + ldr r1, [sp] + mov r0, r4 + bl ov00_02207E40 +_02201D6C: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02201D74: .word ov00_022182FC + arm_func_end ov00_02201CAC + + arm_func_start ov00_02201D78 +ov00_02201D78: ; 0x02201D78 + ldr r1, [r1, #8] + cmp r1, #0 + beq _02201D94 + ldr r0, [r1] + cmp r0, r2 + subgt r0, r0, #1 + strgt r0, [r1] +_02201D94: + mov r0, #1 + bx lr + arm_func_end ov00_02201D78 + + arm_func_start ov00_02201D9C +ov00_02201D9C: ; 0x02201D9C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + add r2, sp, #0 + ldr r4, [r6] + bl ov00_02207DD0 + cmp r0, #0 + bne _02201DD4 + ldr r1, _02201F1C ; =ov00_022182FC + mov r0, r6 + bl ov00_0220A890 + add sp, sp, #4 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, pc} +_02201DD4: + ldr r2, _02201F20 ; =ov00_02218310 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, _02201F24 ; =ov00_0221823C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02201F28 ; =ov00_0221831C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, [sp] + ldr r2, [r2] + bl ov00_0220211C + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _02201F2C ; =ov00_02218260 + bl ov00_022020EC + ldr r0, [sp] + ldr r0, [r0, #8] + cmp r0, #0 + beq _02201F10 + ldr r5, [r0] + cmp r5, #0 + bge _02201E68 + ldr r0, _02201F30 ; =ov00_0221832C + ldr r1, _02201F34 ; =ov00_02218338 + ldr r2, _02201F38 ; =ov00_02218220 + ldr r3, _02201F3C ; =0x000001FD + bl __msl_assertion_failed +_02201E68: + ldr r0, [sp] + ldr r0, [r0, #8] + ldr r0, [r0, #8] + bl ov00_021EC3D8 + ldr r0, [sp] + mov r1, #0 + ldr r0, [r0, #8] + str r1, [r0, #8] + ldr r0, [sp] + ldr r0, [r0, #8] + ldr r0, [r0, #0xc] + bl ov00_021EC3D8 + ldr r0, [sp] + mov r1, #0 + ldr r0, [r0, #8] + str r1, [r0, #0xc] + ldr r0, [sp] + ldr r0, [r0, #8] + bl ov00_021EC3D8 + ldr r0, [sp] + mov r1, #0 + str r1, [r0, #8] + ldr r0, [sp] + bl ov00_02207FB8 + cmp r0, #0 + beq _02201EDC + ldr r1, [sp] + mov r0, r6 + bl ov00_02207E40 +_02201EDC: + ldr r0, [r4, #0x430] + subs r0, r0, #1 + str r0, [r4, #0x430] + bpl _02201F00 + ldr r0, _02201F40 ; =ov00_02218344 + ldr r1, _02201F34 ; =ov00_02218338 + ldr r2, _02201F38 ; =ov00_02218220 + mov r3, #0x204 + bl __msl_assertion_failed +_02201F00: + ldr r1, _02201F44 ; =ov00_02201D78 + mov r0, r6 + mov r2, r5 + bl ov00_02207F1C +_02201F10: + mov r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02201F1C: .word ov00_022182FC +_02201F20: .word ov00_02218310 +_02201F24: .word ov00_0221823C +_02201F28: .word ov00_0221831C +_02201F2C: .word ov00_02218260 +_02201F30: .word ov00_0221832C +_02201F34: .word ov00_02218338 +_02201F38: .word ov00_02218220 +_02201F3C: .word 0x000001FD +_02201F40: .word ov00_02218344 +_02201F44: .word ov00_02201D78 + arm_func_end ov00_02201D9C + + arm_func_start ov00_02201F48 +ov00_02201F48: ; 0x02201F48 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r4, r1 + mov r8, r0 + mov r7, r2 + bne _02201F70 + ldr r0, _02201FD0 ; =ov00_022183F8 + ldr r1, _02201FD4 ; =ov00_02218410 + ldr r2, _02201FD8 ; =ov00_022183A8 + mov r3, #0x25 + bl __msl_assertion_failed +_02201F70: + ldr r5, [r4, #8] + ldmia r4, {r0, r6} + cmp r6, r5 + bne _02201FA8 + add r6, r6, #0x800 + add r1, r6, #1 + bl ov00_021EC3BC + cmp r0, #0 + bne _02201FA8 + ldr r1, _02201FDC ; =ov00_0221841C + mov r0, r8 + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02201FA8: + strb r7, [r0, r5] + add r1, r5, #1 + mov r2, #0 + strb r2, [r0, r1] + ldr r1, [r4, #8] + add r1, r1, #1 + str r1, [r4, #8] + stmia r4, {r0, r6} + mov r0, r2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02201FD0: .word ov00_022183F8 +_02201FD4: .word ov00_02218410 +_02201FD8: .word ov00_022183A8 +_02201FDC: .word ov00_0221841C + arm_func_end ov00_02201F48 + + arm_func_start ov00_02201FE0 +ov00_02201FE0: ; 0x02201FE0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + movs r8, r2 + mov sl, r0 + mov sb, r1 + mov r7, r3 + bne _0220200C + ldr r0, _022020D4 ; =ov00_0221842C + ldr r1, _022020D8 ; =ov00_02218410 + ldr r2, _022020DC ; =ov00_022183DC + mov r3, #0x51 + bl __msl_assertion_failed +_0220200C: + cmp r7, #0 + bge _02202028 + ldr r0, _022020E0 ; =ov00_0221843C + ldr r1, _022020D8 ; =ov00_02218410 + ldr r2, _022020DC ; =ov00_022183DC + mov r3, #0x52 + bl __msl_assertion_failed +_02202028: + cmp sb, #0 + bne _02202044 + ldr r0, _022020E4 ; =ov00_022183F8 + ldr r1, _022020D8 ; =ov00_02218410 + ldr r2, _022020DC ; =ov00_022183DC + mov r3, #0x53 + bl __msl_assertion_failed +_02202044: + cmp r8, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r4, [sb, #8] + ldr r5, [sb, #4] + ldr r6, [sb] + sub r0, r5, r4 + cmp r0, r7 + bge _022020A0 + cmp r7, #0x800 + movlt r0, #0x800 + movge r0, r7 + add r5, r5, r0 + mov r0, r6 + add r1, r5, #1 + bl ov00_021EC3BC + movs r6, r0 + bne _022020A0 + ldr r1, _022020E8 ; =ov00_0221841C + mov r0, sl + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_022020A0: + mov r1, r8 + mov r2, r7 + add r0, r6, r4 + bl memcpy + add r1, r4, r7 + mov r0, #0 + strb r0, [r6, r1] + ldr r1, [sb, #8] + add r1, r1, r7 + str r1, [sb, #8] + str r5, [sb, #4] + str r6, [sb] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_022020D4: .word ov00_0221842C +_022020D8: .word ov00_02218410 +_022020DC: .word ov00_022183DC +_022020E0: .word ov00_0221843C +_022020E4: .word ov00_022183F8 +_022020E8: .word ov00_0221841C + arm_func_end ov00_02201FE0 + + arm_func_start ov00_022020EC +ov00_022020EC: ; 0x022020EC + stmdb sp!, {r4, r5, r6, lr} + mov r4, r2 + mov r6, r0 + mov r5, r1 + mov r0, r4 + bl strlen + mov r3, r0 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_02201FE0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_022020EC + + arm_func_start ov00_0220211C +ov00_0220211C: ; 0x0220211C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r4, r1 + mov r5, r0 + ldr r1, _02202150 ; =ov00_0221844C + add r0, sp, #0 + bl sprintf + add r2, sp, #0 + mov r0, r5 + mov r1, r4 + bl ov00_022020EC + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02202150: .word ov00_0221844C + arm_func_end ov00_0220211C + + arm_func_start ov00_02202154 +ov00_02202154: ; 0x02202154 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r1 + mov r7, r0 + mov r1, r2 + mov r2, r3 + mov r0, r8 + mov r3, #0 + ldr r6, [sp, #0x18] + ldr r5, [sp, #0x1c] + ldr r4, [sp, #0x20] + bl ov00_021FF970 + mvn r1, #0 + cmp r0, r1 + bne _02202200 + mov r0, r8 + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + beq _022021F0 + ldrsb r0, [r4] + cmp r0, #0x50 + ldreqsb r0, [r4, #1] + cmpeq r0, #0x52 + moveq r0, #3 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _0220223C ; =ov00_02218450 + mov r0, r7 + mov r1, #5 + bl ov00_0220A86C + mov r0, r7 + mov r1, #3 + mov r2, #0 + bl ov00_02202990 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022021F0: + mov r0, #0 + str r0, [r5] + str r0, [r6] + b _02202234 +_02202200: + cmp r0, #0 + strne r0, [r5] + movne r0, #0 + strne r0, [r6] + bne _02202234 + ldr r1, _02202240 ; =ov00_02218478 + mov r0, r7 + mov r2, r4 + bl ov00_0220A3BC + mov r0, #0 + str r0, [r5] + mov r0, #1 + str r0, [r6] +_02202234: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220223C: .word ov00_02218450 +_02202240: .word ov00_02218478 + arm_func_end ov00_02202154 + + arm_func_start ov00_02202244 +ov00_02202244: ; 0x02202244 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + mov r4, r1 + ldr r1, [r4, #0x28] + mov r5, r0 + cmp r1, #0 + bne _02202278 + ldr r0, _02202314 ; =ov00_0221849C + ldr r1, _02202318 ; =ov00_02218410 + ldr r2, _0220231C ; =ov00_02218394 + mov r3, #0xde + bl __msl_assertion_failed +_02202278: + ldr r1, [r4, #0x30] + ldr r0, [r4, #0x34] + subs r0, r1, r0 + bne _022022F4 + ldr r0, [r4, #0x38] + bl ArrayLength + cmp r0, #0 + bne _022022F4 + add r0, sp, #0x10 + str r0, [sp] + add r1, sp, #0xc + ldr r0, _02202320 ; =ov00_022184C0 + str r1, [sp, #4] + str r0, [sp, #8] + ldr r1, [r4, #8] + add r2, sp, #0x28 + mov r0, r5 + mov r3, #1 + bl ov00_02202154 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, lr} + addne sp, sp, #0x10 + bxne lr + ldr r0, [sp, #0xc] + cmp r0, #0 + addne sp, sp, #0x14 + movne r0, #0 + ldmneia sp!, {r4, r5, lr} + addne sp, sp, #0x10 + bxne lr +_022022F4: + ldrsb r2, [sp, #0x28] + mov r0, r5 + add r1, r4, #0x28 + bl ov00_02201F48 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02202314: .word ov00_0221849C +_02202318: .word ov00_02218410 +_0220231C: .word ov00_02218394 +_02202320: .word ov00_022184C0 + arm_func_end ov00_02202244 + + arm_func_start ov00_02202324 +ov00_02202324: ; 0x02202324 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov sb, r1 + ldr r1, [sb, #0x28] + mov sl, r0 + mov r8, r2 + mov r7, r3 + cmp r1, #0 + bne _0220235C + ldr r0, _02202414 ; =ov00_0221849C + ldr r1, _02202418 ; =ov00_02218410 + ldr r2, _0220241C ; =ov00_022183C0 + mov r3, #0xfb + bl __msl_assertion_failed +_0220235C: + cmp r7, #0 + mov r6, #0 + addeq sp, sp, #0x14 + moveq r0, r6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sb, #0x30] + ldr r0, [sb, #0x34] + subs r0, r1, r0 + bne _022023E0 + ldr r0, [sb, #0x38] + bl ArrayLength + cmp r0, #0 + bne _022023E0 + ldr fp, _02202420 ; =ov00_022184C0 + add r5, sp, #0x10 + add r4, sp, #0xc +_0220239C: + str r5, [sp] + stmib sp, {r4, fp} + ldr r1, [sb, #8] + mov r0, sl + mov r3, r7 + add r2, r8, r6 + bl ov00_02202154 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0xc] + cmp r0, #0 + subne r7, r7, r0 + addne r6, r6, r0 + cmp r0, #0 + cmpne r7, #0 + bne _0220239C +_022023E0: + cmp r7, #0 + beq _02202408 + mov r0, sl + mov r3, r7 + add r1, sb, #0x28 + add r2, r8, r6 + bl ov00_02201FE0 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02202408: + mov r0, #0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02202414: .word ov00_0221849C +_02202418: .word ov00_02218410 +_0220241C: .word ov00_022183C0 +_02202420: .word ov00_022184C0 + arm_func_end ov00_02202324 + + arm_func_start ov00_02202424 +ov00_02202424: ; 0x02202424 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r2 + mov r6, r0 + mov r5, r1 + mov r0, r4 + bl strlen + mov r3, r0 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_02202324 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02202424 + + arm_func_start ov00_02202454 +ov00_02202454: ; 0x02202454 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + str r0, [sp] + ldr r0, [sp, #0x44] + mov sl, r1 + mvn r1, #0 + str r2, [sp, #4] + str r3, [sp, #8] + cmp sl, r1 + str r0, [sp, #0x44] + bne _02202494 + ldr r0, _02202648 ; =ov00_022184C4 + ldr r1, _0220264C ; =ov00_02218410 + ldr r2, _02202650 ; =ov00_02218370 + mov r3, #0x150 + bl __msl_assertion_failed +_02202494: + ldr r0, [sp, #4] + cmp r0, #0 + bne _022024B4 + ldr r0, _02202654 ; =ov00_022184DC + ldr r1, _0220264C ; =ov00_02218410 + ldr r2, _02202650 ; =ov00_02218370 + ldr r3, _02202658 ; =0x00000151 + bl __msl_assertion_failed +_022024B4: + ldr r0, [sp, #8] + cmp r0, #0 + bne _022024D4 + ldr r0, _0220265C ; =ov00_022184F0 + ldr r1, _0220264C ; =ov00_02218410 + ldr r2, _02202650 ; =ov00_02218370 + ldr r3, _02202660 ; =0x00000152 + bl __msl_assertion_failed +_022024D4: + ldr r0, [sp, #0x40] + cmp r0, #0 + bne _022024F4 + ldr r0, _02202664 ; =ov00_02218504 + ldr r1, _0220264C ; =ov00_02218410 + ldr r2, _02202650 ; =ov00_02218370 + ldr r3, _02202668 ; =0x00000153 + bl __msl_assertion_failed +_022024F4: + ldr r0, [sp, #4] + mvn r4, #0 + ldr r6, [r0, #8] + ldmia r0, {r5, r7} + sub r0, r4, #0x4b + str r0, [sp, #0x14] + sub r0, r4, #0x19 + mov sb, #0 + str r0, [sp, #0x10] + sub r0, r4, #5 + mov fp, sb + str r0, [sp, #0xc] +_02202524: + add r0, r6, #0x800 + cmp r0, r7 + ble _02202560 + mov r7, r0 + add r1, r0, #1 + mov r0, r5 + bl ov00_021EC3BC + movs r5, r0 + bne _02202560 + ldr r1, _0220266C ; =ov00_0221841C + ldr r0, [sp] + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02202560: + mov r0, sl + add r1, r5, r6 + sub r2, r7, r6 + mov r3, #0 + bl ov00_021FF92C + mov r8, r0 + cmp r8, r4 + bne _022025BC + mov r0, sl + bl ov00_021FFA60 + ldr r1, [sp, #0xc] + cmp r0, r1 + ldrne r1, [sp, #0x10] + cmpne r0, r1 + ldrne r1, [sp, #0x14] + cmpne r0, r1 + beq _022025E0 + ldr r1, _02202670 ; =ov00_02218518 + ldr r0, [sp] + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022025BC: + cmp r8, #0 + addne r6, r6, r8 + addne sb, sb, r8 + bne _022025E0 + ldr r0, [sp] + ldr r1, _02202674 ; =ov00_02218544 + ldr r2, [sp, #0x44] + mov fp, #1 + bl ov00_0220A3BC +_022025E0: + mov r0, #0 + cmp r8, r4 + strb r0, [r5, r6] + beq _02202600 + cmp fp, #0 + bne _02202600 + cmp sb, #0x20000 + blt _02202524 +_02202600: + cmp sb, #0 + beq _0220261C + ldr r1, _02202678 ; =ov00_02218568 + ldr r0, [sp] + ldr r2, [sp, #0x44] + mov r3, sb + bl ov00_0220A3BC +_0220261C: + ldr r0, [sp, #4] + ldr r1, [sp, #0x40] + str r5, [r0] + str r6, [r0, #8] + str r7, [r0, #4] + ldr r0, [sp, #8] + str sb, [r0] + str fp, [r1] + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02202648: .word ov00_022184C4 +_0220264C: .word ov00_02218410 +_02202650: .word ov00_02218370 +_02202654: .word ov00_022184DC +_02202658: .word 0x00000151 +_0220265C: .word ov00_022184F0 +_02202660: .word 0x00000152 +_02202664: .word ov00_02218504 +_02202668: .word 0x00000153 +_0220266C: .word ov00_0221841C +_02202670: .word ov00_02218518 +_02202674: .word ov00_02218544 +_02202678: .word ov00_02218568 + arm_func_end ov00_02202454 + + arm_func_start ov00_0220267C +ov00_0220267C: ; 0x0220267C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + mov sl, r0 + str r2, [sp, #0xc] + mov sb, r1 + str r3, [sp, #0x10] + movs r0, r2 + ldr r8, [sp, #0x44] + bne _022026B4 + ldr r0, _022027D8 ; =ov00_022183F8 + ldr r1, _022027DC ; =ov00_02218410 + ldr r2, _022027E0 ; =ov00_02218380 + ldr r3, _022027E4 ; =0x000001B9 + bl __msl_assertion_failed +_022026B4: + ldr r0, [sp, #0xc] + mov r4, #0 + ldr fp, [r0, #8] + ldr r7, [r0, #0xc] + ldr r6, [r0] + subs r5, fp, r7 + addeq sp, sp, #0x1c + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022026D8: + add r0, sp, #0x18 + str r0, [sp] + add r1, r7, r4 + add r0, sp, #0x14 + str r0, [sp, #4] + add r2, r6, r1 + mov r0, sl + mov r1, sb + mov r3, r5 + str r8, [sp, #8] + bl ov00_02202154 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x14] + cmp r0, #0 + subne r5, r5, r0 + addne r4, r4, r0 + cmp r0, #0 + cmpne r5, #0 + bne _022026D8 + ldr r0, [sp, #0x40] + cmp r0, #0 + beq _02202758 + cmp r4, #0 + ble _0220275C + mov r0, r6 + add r1, r6, r4 + add r2, r5, #1 + bl memmove + sub fp, fp, r4 + b _0220275C +_02202758: + add r7, r7, r4 +_0220275C: + cmp fp, #0 + bge _02202778 + ldr r0, _022027E8 ; =ov00_0221857C + ldr r1, _022027DC ; =ov00_02218410 + ldr r2, _022027E0 ; =ov00_02218380 + ldr r3, _022027EC ; =0x000001DE + bl __msl_assertion_failed +_02202778: + cmp r7, #0 + bge _02202794 + ldr r0, _022027F0 ; =ov00_02218588 + ldr r1, _022027DC ; =ov00_02218410 + ldr r2, _022027E0 ; =ov00_02218380 + ldr r3, _022027F4 ; =0x000001DF + bl __msl_assertion_failed +_02202794: + cmp r7, fp + ble _022027B0 + ldr r0, _022027F8 ; =ov00_02218594 + ldr r1, _022027DC ; =ov00_02218410 + ldr r2, _022027E0 ; =ov00_02218380 + mov r3, #0x1e0 + bl __msl_assertion_failed +_022027B0: + ldr r0, [sp, #0xc] + str fp, [r0, #8] + str r7, [r0, #0xc] + ldr r0, [sp, #0x10] + cmp r0, #0 + ldrne r1, [sp, #0x18] + strne r1, [r0] + mov r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022027D8: .word ov00_022183F8 +_022027DC: .word ov00_02218410 +_022027E0: .word ov00_02218380 +_022027E4: .word 0x000001B9 +_022027E8: .word ov00_0221857C +_022027EC: .word 0x000001DE +_022027F0: .word ov00_02218588 +_022027F4: .word 0x000001DF +_022027F8: .word ov00_02218594 + arm_func_end ov00_0220267C + + arm_func_start ov00_022027FC +ov00_022027FC: ; 0x022027FC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r5, r2 + mov r0, #0 + mov r6, r1 + str r0, [r5] + ldr r1, [r6, #8] + mov r7, r3 + cmp r1, #5 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6] + mov r1, #0xa + bl strchr + movs r4, r0 + beq _02202920 + ldr r1, _0220292C ; =ov00_022185A0 + sub r0, r4, #5 + mov r2, #5 + bl strncmp + cmp r0, #0 + addne sp, sp, #0x10 + movne r0, #3 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + strb r0, [r4] + ldr r0, [r6] + ldr r1, _02202930 ; =ov00_022185A8 + add r2, sp, #0 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0 + bl atoi + str r0, [r7] + ldr r0, [r6] + ldr r1, _02202934 ; =ov00_022185AC + add r2, sp, #0 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0 + bl atoi + ldr r2, [r6] + add r1, r0, #1 + sub r2, r4, r2 + ldr r3, [r6, #8] + add r2, r1, r2 + cmp r3, r2 + ble _02202918 + ldrsb r2, [r4, r1] + cmp r2, #0 + addne sp, sp, #0x10 + movne r0, #3 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r3, r4, #1 + ldr r2, [sp, #0x28] + str r3, [r5] + str r0, [r2] + ldr r0, [r6] + sub r0, r4, r0 + add r0, r1, r0 + add r0, r0, #1 + str r0, [r6, #0xc] + b _02202920 +_02202918: + mov r0, #0xa + strb r0, [r4] +_02202920: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220292C: .word ov00_022185A0 +_02202930: .word ov00_022185A8 +_02202934: .word ov00_022185AC + arm_func_end ov00_022027FC + + arm_func_start ov00_02202938 +ov00_02202938: ; 0x02202938 + stmdb sp!, {r4, lr} + movs r4, r1 + ldrne r0, [r4] + cmpne r0, #0 + ldrne r1, [r4, #0xc] + cmpne r1, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #8] + subs r2, r0, r1 + str r2, [r4, #8] + beq _02202978 + ldr r0, [r4] + ldr r1, [r4, #0xc] + add r1, r0, r1 + bl memmove +_02202978: + ldr r2, [r4] + ldr r1, [r4, #8] + mov r0, #0 + strb r0, [r2, r1] + str r0, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end ov00_02202938 + + arm_func_start ov00_02202990 +ov00_02202990: ; 0x02202990 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r4, r0 + ldr r5, [r4] + mov r7, r1 + mov r6, r2 + cmp r5, #0 + bne _022029C4 + ldr r0, _02202A70 ; =ov00_022185DC + ldr r1, _02202A74 ; =ov00_022185F0 + ldr r2, _02202A78 ; =ov00_022185C4 + mov r3, #0x23 + bl __msl_assertion_failed +_022029C4: + cmp r7, #0 + bne _022029E0 + ldr r0, _02202A7C ; =ov00_02218600 + ldr r1, _02202A74 ; =ov00_022185F0 + ldr r2, _02202A78 ; =ov00_022185C4 + mov r3, #0x24 + bl __msl_assertion_failed +_022029E0: + cmp r6, #1 + cmpne r6, #0 + beq _02202A00 + ldr r0, _02202A80 ; =ov00_02218618 + ldr r1, _02202A74 ; =ov00_022185F0 + ldr r2, _02202A78 ; =ov00_022185C4 + mov r3, #0x25 + bl __msl_assertion_failed +_02202A00: + cmp r6, #1 + moveq r0, #1 + streq r0, [r5, #0x41c] + ldr r1, [r5, #0x1a4] + ldr r0, [r5, #0x1a8] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0x10 + bl ov00_021EC3A8 + movs r3, r0 + beq _02202A48 + str r7, [r3] + str r6, [r3, #0xc] + ldr r0, [r5, #0x418] + stmib r3, {r0, r5} +_02202A48: + mov r2, #0 + str r2, [sp] + mov r2, #1 + add r1, sp, #8 + str r2, [sp, #4] + mov r0, r4 + ldmia r1, {r1, r2} + bl ov00_02202A84 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02202A70: .word ov00_022185DC +_02202A74: .word ov00_022185F0 +_02202A78: .word ov00_022185C4 +_02202A7C: .word ov00_02218600 +_02202A80: .word ov00_02218618 + arm_func_end ov00_02202990 + + arm_func_start ov00_02202A84 +ov00_02202A84: ; 0x02202A84 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #0x18 + mov r5, r3 + ldr r4, [r6] + bl ov00_021EC3A8 + cmp r0, #0 + bne _02202AC4 + ldr r1, _02202B24 ; =ov00_02218648 + mov r0, r6 + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_02202AC4: + ldr r1, [sp, #0x14] + ldr r2, [sp, #0x18] + str r1, [r0] + ldr r1, [sp, #0x20] + stmib r0, {r2, r5} + cmp r1, #0 + ldrne r1, [r1, #0x18] + ldr r2, [sp, #0x24] + moveq r1, #0 + str r1, [r0, #0x10] + mov r1, #0 + str r2, [r0, #0xc] + str r1, [r0, #0x14] + ldr r1, [r4, #0x438] + cmp r1, #0 + streq r0, [r4, #0x438] + ldr r1, [r4, #0x43c] + cmp r1, #0 + strne r0, [r1, #0x14] + str r0, [r4, #0x43c] + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02202B24: .word ov00_02218648 + arm_func_end ov00_02202A84 + + arm_func_start ov00_02202B28 +ov00_02202B28: ; 0x02202B28 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + ldr r1, [r7] + mov r4, r0 + cmp r1, #0 + bne _02202B54 + ldr r0, _02202D10 ; =ov00_02218658 + ldr r1, _02202D14 ; =ov00_022185F0 + ldr r2, _02202D18 ; =ov00_022185B4 + mov r3, #0x6e + bl __msl_assertion_failed +_02202B54: + ldr r0, [r7, #8] + cmp r0, #0 + bne _02202B74 + ldr r0, _02202D1C ; =ov00_02218678 + ldr r1, _02202D14 ; =ov00_022185F0 + ldr r2, _02202D18 ; =ov00_022185B4 + mov r3, #0x6f + bl __msl_assertion_failed +_02202B74: + ldr r1, [r7, #8] + ldr r2, [r7, #4] + ldr r3, [r7] + mov r0, r4 + blx r3 + ldr r0, [r7, #0xc] + cmp r0, #2 + bne _02202BB0 + ldr r0, [r7, #8] + ldr r0, [r0, #8] + bl ov00_021EC3D8 + ldr r0, [r7, #8] + mov r1, #0 + str r1, [r0, #8] + b _02202CF4 +_02202BB0: + cmp r0, #3 + bne _02202C30 + ldr r6, [r7, #8] + mov r5, #0 + ldr r0, [r6, #0x38] + cmp r0, #0 + ble _02202C0C + mov r4, r5 + mov r8, r5 +_02202BD4: + ldr r0, [r6, #0x3c] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0x3c] + str r4, [r0, r5, lsl #2] + ldr r0, [r6, #0x40] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0x40] + str r8, [r0, r5, lsl #2] + ldr r0, [r6, #0x38] + add r5, r5, #1 + cmp r5, r0 + blt _02202BD4 +_02202C0C: + ldr r0, [r6, #0x3c] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r6, #0x3c] + ldr r0, [r6, #0x40] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r6, #0x40] + b _02202CF4 +_02202C30: + cmp r0, #4 + bne _02202C50 + ldr r4, [r7, #8] + ldr r0, [r4, #0xc] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0xc] + b _02202CF4 +_02202C50: + cmp r0, #7 + bne _02202C78 + ldr r4, [r7, #8] + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02202CF4 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x10] + b _02202CF4 +_02202C78: + cmp r0, #8 + bne _02202CA0 + ldr r4, [r7, #8] + ldr r0, [r4, #8] + cmp r0, #0 + beq _02202CF4 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #8] + b _02202CF4 +_02202CA0: + cmp r0, #9 + bne _02202CF4 + ldr r5, [r7, #8] + mov r4, #0 + ldr r0, [r5, #4] + cmp r0, #0 + ble _02202CE4 + mov r6, r4 +_02202CC0: + ldr r0, [r5, #8] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + str r6, [r0, r4, lsl #2] + ldr r0, [r5, #4] + add r4, r4, #1 + cmp r4, r0 + blt _02202CC0 +_02202CE4: + ldr r0, [r5, #8] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #8] +_02202CF4: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + mov r1, #0 + mov r0, r7 + str r1, [r7, #8] + bl ov00_021EC3D8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02202D10: .word ov00_02218658 +_02202D14: .word ov00_022185F0 +_02202D18: .word ov00_022185B4 +_02202D1C: .word ov00_02218678 + arm_func_end ov00_02202B28 + + arm_func_start ov00_02202D20 +ov00_02202D20: ; 0x02202D20 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + movs sb, r1 + ldr r4, [sl] + beq _02202DBC + ldr r5, [r4, #0x438] + ldr r6, [r4, #0x43c] + mov r7, #0 + str r7, [r4, #0x438] + mov r1, r5 + str r7, [r4, #0x43c] + cmp r5, #0 + beq _02202D9C +_02202D54: + ldr r0, [r1, #0x10] + ldr r8, [r1, #0x14] + cmp r0, sb + ldrne r0, [r1, #0xc] + cmpne r0, #1 + bne _02202D8C + mov r0, sl + cmp r7, #0 + strne r8, [r7, #0x14] + moveq r5, r8 + cmp r6, r1 + moveq r6, r7 + bl ov00_02202B28 + b _02202D90 +_02202D8C: + mov r7, r1 +_02202D90: + mov r1, r8 + cmp r8, #0 + bne _02202D54 +_02202D9C: + ldr r0, [r4, #0x438] + cmp r0, #0 + ldrne r0, [r4, #0x43c] + strne r5, [r0, #0x14] + streq r5, [r4, #0x438] + str r6, [r4, #0x43c] + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02202DBC: + ldr r1, [r4, #0x438] + cmp r1, #0 + beq _02202E00 + mov r5, #0 +_02202DCC: + str r5, [r4, #0x438] + str r5, [r4, #0x43c] + cmp r1, #0 + beq _02202DF4 +_02202DDC: + ldr r6, [r1, #0x14] + mov r0, sl + bl ov00_02202B28 + mov r1, r6 + cmp r6, #0 + bne _02202DDC +_02202DF4: + ldr r1, [r4, #0x438] + cmp r1, #0 + bne _02202DCC +_02202E00: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_02202D20 + + arm_func_start ov00_02202E08 +ov00_02202E08: ; 0x02202E08 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r1 + mov sb, r0 + cmp r8, #0 + mov r7, #0 + ble _02202E5C + ldr r6, _02202E68 ; =ov00_022186EC + ldr r5, _02202E6C ; =0x08421085 + mov r4, #0x3e +_02202E2C: + bl rand + umull r1, r2, r0, r5 + sub r1, r0, r2 + add r2, r2, r1, lsr #1 + mov r2, r2, lsr #5 + umull r1, r2, r4, r2 + sub r2, r0, r1 + ldrsb r0, [r6, r2] + strb r0, [sb, r7] + add r7, r7, #1 + cmp r7, r8 + blt _02202E2C +_02202E5C: + mov r0, #0 + strb r0, [sb, r7] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02202E68: .word ov00_022186EC +_02202E6C: .word 0x08421085 + arm_func_end ov00_02202E08 + + arm_func_start ov00_02202E70 +ov00_02202E70: ; 0x02202E70 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r6, r0 + ldr r4, [r6] + mov r5, r1 + ldr r0, [r4, #0x10c] + cmp r0, #0 + bne _02203010 + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4, #0x204] + cmp r0, r1 + bne _02202EDC + ldr r2, _022031B4 ; =ov00_0221872C + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02202EDC: + mov r1, #0 + bl ov00_021FF44C + cmp r0, #0 + bne _02202F18 + ldr r2, _022031B8 ; =ov00_02218754 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02202F18: + add r1, sp, #4 + mov r2, #0 + str r2, [r1] + mov r0, #2 + str r2, [r1, #4] + strb r0, [sp, #5] + ldr r0, [r4, #0x204] + mov r2, #8 + bl ov00_021FF840 + mvn r1, #0 + cmp r0, r1 + mov r1, #5 + bne _02202F74 + ldr r2, _022031BC ; =ov00_02218788 + mov r0, r6 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02202F74: + ldr r0, [r4, #0x204] + bl ov00_021FF8EC + mvn r1, #0 + cmp r0, r1 + bne _02202FB4 + ldr r2, _022031C0 ; =ov00_022187B0 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02202FB4: + mov r0, #8 + str r0, [sp] + ldr r0, [r4, #0x204] + add r1, sp, #4 + add r2, sp, #0 + bl ov00_021FFA18 + mvn r1, #0 + cmp r0, r1 + bne _02203004 + ldr r2, _022031C4 ; =ov00_022187DC + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02203004: + ldrh r0, [sp, #6] + str r0, [r4, #0x208] + b _02203020 +_02203010: + mvn r0, #0 + str r0, [r4, #0x204] + mov r0, #0 + str r0, [r4, #0x208] +_02203020: + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4, #0x1d4] + cmp r0, r1 + bne _0220306C + ldr r2, _022031B4 ; =ov00_0221872C + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220306C: + mov r1, #0 + bl ov00_021FF44C + cmp r0, #0 + bne _022030A8 + ldr r2, _022031B8 ; =ov00_02218754 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_022030A8: + ldr r0, _022031C8 ; =ov00_022186AC + bl SOC_GetHostByName + cmp r0, #0 + bne _022030E4 + ldr r2, _022031CC ; =ov00_0221880C + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_022030E4: + add r3, sp, #4 + mov r2, #0 + str r2, [r3] + mov r1, #2 + str r2, [r3, #4] + strb r1, [sp, #5] + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [sp, #8] + cmp r0, #0 + bne _02203128 + ldr r0, _022031D0 ; =ov00_02218840 + ldr r1, _022031D4 ; =ov00_02218860 + ldr r2, _022031D8 ; =ov00_0221868C + mov r3, #0x90 + bl __msl_assertion_failed +_02203128: + ldr r0, _022031DC ; =0x0000CC74 + add r1, sp, #4 + strh r0, [sp, #6] + ldr r0, [r4, #0x1d4] + mov r2, #8 + bl ov00_021FF8A0 + mvn r1, #0 + cmp r0, r1 + bne _0220319C + ldr r0, [r4, #0x1d4] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + beq _0220319C + ldr r2, _022031E0 ; =ov00_02218870 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220319C: + mov r0, #1 + str r0, [r5, #0x14] + str r0, [r4, #0x1d8] + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_022031B4: .word ov00_0221872C +_022031B8: .word ov00_02218754 +_022031BC: .word ov00_02218788 +_022031C0: .word ov00_022187B0 +_022031C4: .word ov00_022187DC +_022031C8: .word ov00_022186AC +_022031CC: .word ov00_0221880C +_022031D0: .word ov00_02218840 +_022031D4: .word ov00_02218860 +_022031D8: .word ov00_0221868C +_022031DC: .word 0x0000CC74 +_022031E0: .word ov00_02218870 + arm_func_end ov00_02202E70 + + arm_func_start ov00_022031E4 +ov00_022031E4: ; 0x022031E4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r8, r0 + ldr r4, [r8] + mov r7, r1 + ldr r1, [r4, #0x1d8] + mov r6, r2 + mov r5, r3 + cmp r1, #4 + bne _0220321C + bl ov00_02200A98 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_0220321C: + ldr r0, [r4, #0x1d8] + cmp r0, #0 + beq _02203240 + ldr r1, _0220341C ; =ov00_02218898 + mov r0, r8 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203240: + ldr r0, [sp, #0x38] + cmp r0, #0 + beq _02203260 + cmp r0, #1 + bne _0220326C + mov r0, #1 + str r0, [r4, #0x10c] + b _02203284 +_02203260: + mov r0, #0 + str r0, [r4, #0x10c] + b _02203284 +_0220326C: + ldr r1, _02203420 ; =ov00_022188AC + mov r0, r8 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203284: + mov r3, #1 + mov r1, r7 + add r0, r4, #0x110 + mov r2, #0x1f + str r3, [r4, #0x10c] + bl ov00_0220A348 + add r0, r4, #0x2f + mov r1, r6 + add r0, r0, #0x100 + mov r2, #0x15 + bl ov00_0220A348 + mov r1, r5 + add r0, r4, #0x144 + mov r2, #0x33 + bl ov00_0220A348 + add r0, r4, #0x77 + ldr r1, [sp, #0x28] + add r0, r0, #0x100 + mov r2, #0x1f + bl ov00_0220A348 + add r0, r4, #0x144 + bl ov00_021FF408 + mov r0, #0x308 + bl ov00_021EC3A8 + movs r4, r0 + bne _02203304 + ldr r1, _02203424 ; =ov00_022188C0 + mov r0, r8 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203304: + mov r1, #0 + mov r2, #0x308 + bl memset + ldr r0, [sp, #0x3c] + ldr r1, [sp, #0x2c] + str r0, [r4, #0x304] + ldrsb r0, [r1] + cmp r0, #0 + ldrne r0, [sp, #0x30] + ldrnesb r0, [r0] + cmpne r0, #0 + beq _02203354 + add r0, r4, #0xc2 + mov r2, #0x100 + bl ov00_0220A348 + add r0, r4, #0xc2 + ldr r1, [sp, #0x30] + add r0, r0, #0x100 + mov r2, #0x100 + bl ov00_0220A348 +_02203354: + ldr r1, [sp, #0x34] + cmp r1, #0 + beq _02203370 + add r0, r4, #0xc2 + add r0, r0, #0x200 + mov r2, #0x41 + bl ov00_0220A348 +_02203370: + ldr r1, [sp, #0x40] + ldr r0, [sp, #0x44] + str r1, [sp] + str r0, [sp, #4] + ldr r5, [sp, #0x48] + add r3, sp, #0xc + mov r0, r8 + mov r2, r4 + mov r1, #0 + str r5, [sp, #8] + bl ov00_0220657C + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0xc] + mov r0, r8 + bl ov00_02202E70 + movs r4, r0 + beq _022033E8 + ldr r1, [sp, #0xc] + mov r0, r8 + str r4, [r1, #0x1c] + ldr r1, [sp, #0xc] + bl ov00_02206230 + mov r0, r8 + mov r1, #0 + bl ov00_02204284 + add sp, sp, #0x10 + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022033E8: + ldr r1, [sp, #0xc] + ldr r0, [r1, #8] + cmp r0, #0 + beq _02203410 + ldr r1, [r1, #0x18] + mov r0, r8 + bl ov00_02200ED8 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_02203410: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220341C: .word ov00_02218898 +_02203420: .word ov00_022188AC +_02203424: .word ov00_022188C0 + arm_func_end ov00_022031E4 + + arm_func_start ov00_02203428 +ov00_02203428: ; 0x02203428 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x288 + mov r5, r1 + mov r6, r0 + add r0, r5, #0x80 + mov r1, #0x20 + ldr r4, [r6] + bl ov00_02202E08 + add r0, r5, #0x100 + ldrsb r0, [r0, #0xc2] + cmp r0, #0 + addne r0, r5, #0xc2 + addeq r0, r4, #0x77 + add r7, r0, #0x100 + mov r0, r7 + bl strlen + mov r1, r0 + mov r0, r7 + add r2, r5, #0xa1 + bl ov00_021FF31C + ldrsb r0, [r5, #0xc2] + cmp r0, #0 + addne r0, r5, #0xc2 + bne _022034B8 + add r0, r4, #0x100 + ldrsb r0, [r0, #0x2f] + cmp r0, #0 + addne r0, r4, #0x2f + addne r0, r0, #0x100 + bne _022034B8 + ldr r1, _0220377C ; =ov00_022188D0 + add r0, sp, #0x35 + add r2, r4, #0x110 + add r3, r4, #0x144 + bl sprintf + add r0, sp, #0x35 +_022034B8: + str r0, [sp] + add r0, r5, #0x80 + str r0, [sp, #4] + ldr r1, _02203780 ; =ov00_022188D8 + ldr r3, _02203784 ; =ov00_022188E8 + add r0, sp, #0x87 + str r5, [sp, #8] + add r2, r5, #0xa1 + str r2, [sp, #0xc] + bl sprintf + add r0, sp, #0x87 + bl strlen + mov r1, r0 + add r0, sp, #0x87 + add r2, sp, #0x14 + bl ov00_021FF31C + ldr r0, [r4, #0x100] + cmp r0, #0 + beq _02203538 + add r3, sp, #0x10 + mov r0, r6 + add r1, r4, #0x110 + add r2, r4, #0x144 + bl ov00_02207EB4 + ldr r0, [sp, #0x10] + cmp r0, #0 + beq _02203538 + ldr r0, [r0, #4] + str r0, [r4, #0x19c] + ldr r0, [sp, #0x10] + ldr r0, [r0] + str r0, [r4, #0x1a0] +_02203538: + ldr r2, _02203788 ; =ov00_0221891C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, _0220378C ; =ov00_02218924 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + add r2, r5, #0x80 + bl ov00_022020EC + ldrsb r0, [r5, #0xc2] + cmp r0, #0 + beq _02203598 + ldr r2, _02203790 ; =ov00_02218930 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + add r2, r5, #0xc2 + bl ov00_022020EC + b _02203610 +_02203598: + add r0, r4, #0x100 + ldrsb r0, [r0, #0x2f] + cmp r0, #0 + beq _022035D0 + ldr r2, _02203794 ; =ov00_0221893C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + add r2, r4, #0x2f + mov r0, r6 + add r1, r4, #0x1f4 + add r2, r2, #0x100 + bl ov00_022020EC + b _02203610 +_022035D0: + ldr r2, _02203798 ; =ov00_0221894C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + add r2, r4, #0x110 + bl ov00_022020EC + ldr r2, _0220379C ; =ov00_02218954 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + add r2, r4, #0x144 + bl ov00_022020EC +_02203610: + ldr r0, [r4, #0x19c] + cmp r0, #0 + beq _0220363C + ldr r2, _022037A0 ; =ov00_02218958 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x19c] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C +_0220363C: + ldr r0, [r4, #0x1a0] + cmp r0, #0 + beq _02203668 + ldr r2, _022037A4 ; =ov00_02218964 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x1a0] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C +_02203668: + ldr r2, _022037A8 ; =ov00_02218970 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + add r2, sp, #0x14 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r0, [r4, #0x10c] + cmp r0, #1 + bne _022036A4 + ldr r2, _022037AC ; =ov00_0221897C + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC +_022036A4: + ldr r2, _022037B0 ; =ov00_02218988 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r1, [r4, #0x208] + mov r0, r6 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r2, r1, asr #8 + mov r1, r1, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r2, r1, lsl #0x10 + add r1, r4, #0x1f4 + mov r2, r2, asr #0x10 + bl ov00_0220211C + ldr r2, _022037B4 ; =ov00_02218990 + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x46c] + mov r0, r6 + add r1, r4, #0x1f4 + bl ov00_0220211C + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _022037B8 ; =ov00_0221899C + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _022037BC ; =ov00_0221B16C + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _022037C0 ; =ov00_022189A8 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, [r4, #0x470] + bl ov00_0220211C + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _022037C4 ; =ov00_022189B8 + bl ov00_022020EC + mov r0, r6 + add r1, r4, #0x1f4 + ldr r2, _022037C8 ; =ov00_022189C0 + bl ov00_022020EC + mov r0, #0 + add sp, sp, #0x288 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220377C: .word ov00_022188D0 +_02203780: .word ov00_022188D8 +_02203784: .word ov00_022188E8 +_02203788: .word ov00_0221891C +_0220378C: .word ov00_02218924 +_02203790: .word ov00_02218930 +_02203794: .word ov00_0221893C +_02203798: .word ov00_0221894C +_0220379C: .word ov00_02218954 +_022037A0: .word ov00_02218958 +_022037A4: .word ov00_02218964 +_022037A8: .word ov00_02218970 +_022037AC: .word ov00_0221897C +_022037B0: .word ov00_02218988 +_022037B4: .word ov00_02218990 +_022037B8: .word ov00_0221899C +_022037BC: .word ov00_0221B16C +_022037C0: .word ov00_022189A8 +_022037C4: .word ov00_022189B8 +_022037C8: .word ov00_022189C0 + arm_func_end ov00_02203428 + + arm_func_start ov00_022037CC +ov00_022037CC: ; 0x022037CC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xe8 + mov sl, r0 + ldr r5, [sl] + mov sb, r1 + add r0, r5, #0x77 + add r0, r0, #0x100 + bl strlen + mov r7, r0 + ldr r0, _02203A24 ; =0x79707367 + bl ov00_021FFB40 + cmp r7, #0 + mov r6, #0 + bls _02203840 + add r8, sp, #0x2d + mov r4, r6 + mov fp, #0xff +_02203810: + mov r0, r4 + mov r1, fp + bl ov00_021FFB5C + add r1, r5, r6 + add r1, r1, #0x100 + add r6, r6, #1 + ldrsb r1, [r1, #0x77] + mov r0, r0, lsl #0x18 + cmp r6, r7 + eor r0, r1, r0, asr #24 + strb r0, [r8], #1 + blo _02203810 +_02203840: + add r0, sp, #0x2d + mov r4, #0 + add r1, sp, #0 + mov r2, r7 + mov r3, #1 + strb r4, [r0, r6] + bl ov00_021FFC18 + ldr r2, _02203A28 ; =ov00_022189C8 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, _02203A2C ; =ov00_022189D4 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + mov r0, sl + add r1, r5, #0x1f4 + add r2, r5, #0x144 + bl ov00_022020EC + ldr r2, _02203A30 ; =ov00_022189DC + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + mov r0, sl + add r1, r5, #0x1f4 + add r2, r5, #0x110 + bl ov00_022020EC + ldr r2, _02203A34 ; =ov00_022189E4 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + mov r0, sl + add r1, r5, #0x1f4 + add r2, sp, #0 + bl ov00_022020EC + ldr r2, _02203A38 ; =ov00_02218990 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, [r5, #0x46c] + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_0220211C + ldr r2, _02203A3C ; =ov00_0221899C + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, _02203A40 ; =ov00_0221B16C + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, _02203A44 ; =ov00_022189A8 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, [r5, #0x470] + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_0220211C + ldr r2, _02203A48 ; =ov00_0221893C + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + add r2, r5, #0x2f + mov r0, sl + add r1, r5, #0x1f4 + add r2, r2, #0x100 + bl ov00_022020EC + add r0, sb, #0x200 + ldrsb r0, [r0, #0xc2] + cmp r0, #0 + beq _022039F8 + add r0, sb, #0xc2 + add r0, r0, #0x200 + bl strlen + mov r6, r0 + ldr r0, _02203A24 ; =0x79707367 + bl ov00_021FFB40 + cmp r6, #0 + mov r8, r4 + bls _022039BC + add r7, sp, #0xa6 + mov fp, #0xff +_0220398C: + mov r0, r4 + mov r1, fp + bl ov00_021FFB5C + add r1, sb, r8 + add r1, r1, #0x200 + add r8, r8, #1 + ldrsb r1, [r1, #0xc2] + mov r0, r0, lsl #0x18 + cmp r8, r6 + eor r0, r1, r0, asr #24 + strb r0, [r7], #1 + blo _0220398C +_022039BC: + add r0, sp, #0xa6 + mov r4, #0 + add r1, sp, #0x4c + mov r2, r6 + mov r3, #1 + strb r4, [r0, r8] + bl ov00_021FFC18 + ldr r2, _02203A4C ; =ov00_022189F4 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + add r2, sp, #0x4c + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC +_022039F8: + ldr r2, _02203A50 ; =ov00_022189B8 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + ldr r2, _02203A54 ; =ov00_022189C0 + mov r0, sl + add r1, r5, #0x1f4 + bl ov00_022020EC + mov r0, #0 + add sp, sp, #0xe8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02203A24: .word 0x79707367 +_02203A28: .word ov00_022189C8 +_02203A2C: .word ov00_022189D4 +_02203A30: .word ov00_022189DC +_02203A34: .word ov00_022189E4 +_02203A38: .word ov00_02218990 +_02203A3C: .word ov00_0221899C +_02203A40: .word ov00_0221B16C +_02203A44: .word ov00_022189A8 +_02203A48: .word ov00_0221893C +_02203A4C: .word ov00_022189F4 +_02203A50: .word ov00_022189B8 +_02203A54: .word ov00_022189C0 + arm_func_end ov00_022037CC + + arm_func_start ov00_02203A58 +ov00_02203A58: ; 0x02203A58 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x2a0 + mov r6, r2 + mov r8, r0 + mov r7, r1 + mov r1, r6 + mov r2, #0 + ldr r5, [r8] + bl ov00_0220A3C8 + cmp r0, #0 + beq _02203B50 + ldr r2, [r5, #0x418] + ldr r0, _022040C8 ; =0x00000106 + cmp r2, r0 + bne _02203AB8 + ldr r1, [r5, #0x1a0] + cmp r1, #0 + beq _02203AB8 + mov r0, r8 + bl ov00_02207E0C + mov r0, #0 + str r0, [r5, #0x19c] + str r0, [r5, #0x1a0] + b _02203AEC +_02203AB8: + ldr r0, _022040CC ; =0x00000201 + cmp r2, r0 + bne _02203AEC + ldr r1, _022040D0 ; =ov00_02218A00 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + beq _02203AEC + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x1a0] +_02203AEC: + ldr r1, _022040D4 ; =ov00_02218A08 + mov r0, r6 + bl strstr + cmp r0, #0 + ldr r1, [r5, #0x418] + mov r0, r8 + beq _02203B2C + mov r2, r5 + bl ov00_0220A86C + mov r0, r8 + mov r1, #4 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203B2C: + mov r2, r5 + bl ov00_0220A86C + mov r0, r8 + mov r1, #4 + mov r2, #0 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203B50: + ldr r0, [r7, #0x14] + ldr r4, [r7, #4] + cmp r0, #1 + beq _02203B74 + cmp r0, #2 + beq _02203D5C + cmp r0, #3 + beq _02203C4C + b _022040BC +_02203B74: + ldr r1, _022040D8 ; =ov00_02218A10 + mov r0, r6 + mov r2, #5 + bl strncmp + cmp r0, #0 + beq _02203BB8 + ldr r2, _022040DC ; =ov00_02218A18 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203BB8: + ldr r1, _022040E0 ; =ov00_02218924 + mov r0, r6 + mov r2, r4 + mov r3, #0x80 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203C00 + ldr r2, _022040DC ; =ov00_02218A18 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203C00: + ldr r0, [r4, #0x304] + mov r1, r4 + cmp r0, #0 + mov r0, r8 + beq _02203C30 + bl ov00_022037CC + cmp r0, #0 + addne sp, sp, #0x2a0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #3 + str r0, [r7, #0x14] + b _022040BC +_02203C30: + bl ov00_02203428 + cmp r0, #0 + addne sp, sp, #0x2a0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #2 + str r0, [r7, #0x14] + b _022040BC +_02203C4C: + ldr r1, _022040E4 ; =ov00_02218A48 + mov r0, r6 + mov r2, #5 + bl strncmp + cmp r0, #0 + beq _02203C90 + ldr r2, _022040DC ; =ov00_02218A18 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203C90: + ldr r1, _022040E8 ; =ov00_02218958 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203CD8 + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203CD8: + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x19c] + ldr r1, _022040F0 ; =ov00_02218964 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203D2C + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203D2C: + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x1a0] + mov r0, r8 + mov r1, r4 + bl ov00_02203428 + cmp r0, #0 + addne sp, sp, #0x2a0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #2 + str r0, [r7, #0x14] + b _022040BC +_02203D5C: + ldr r1, _022040F4 ; =ov00_02218A80 + mov r0, r6 + mov r2, #5 + bl strncmp + cmp r0, #0 + beq _02203DA0 + ldr r2, _022040DC ; =ov00_02218A18 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203DA0: + ldr r1, _022040F8 ; =ov00_02218A88 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203DE8 + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203DE8: + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x198] + ldr r1, _022040E8 ; =ov00_02218958 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203E3C + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203E3C: + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x19c] + ldr r1, _022040F0 ; =ov00_02218964 + add r2, sp, #0xa0 + mov r0, r6 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203E90 + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203E90: + add r0, sp, #0xa0 + bl atoi + str r0, [r5, #0x1a0] + ldr r1, _022040FC ; =ov00_0221893C + add r2, sp, #0x18 + mov r0, r6 + mov r3, #0x15 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + add r2, r5, #0x74 + streqb r0, [sp, #0x18] + ldr r1, _02204100 ; =ov00_02218A94 + mov r0, r6 + add r2, r2, #0x400 + mov r3, #0x19 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streqb r0, [r5, #0x474] + ldrsb r0, [r4, #0xc2] + cmp r0, #0 + addne r0, r4, #0xc2 + bne _02203F20 + add r0, r5, #0x100 + ldrsb r0, [r0, #0x2f] + cmp r0, #0 + addne r0, r5, #0x2f + addne r0, r0, #0x100 + bne _02203F20 + ldr r1, _02204104 ; =ov00_022188D0 + add r0, sp, #0x4e + add r2, r5, #0x110 + add r3, r5, #0x144 + bl sprintf + add r0, sp, #0x4e +_02203F20: + stmia sp, {r0, r4} + add r2, r4, #0x80 + str r2, [sp, #8] + add r2, r4, #0xa1 + ldr r1, _02204108 ; =ov00_022188D8 + ldr r3, _0220410C ; =ov00_022188E8 + add r0, sp, #0xa0 + str r2, [sp, #0xc] + bl sprintf + add r0, sp, #0xa0 + bl strlen + mov r1, r0 + add r0, sp, #0xa0 + add r2, sp, #0x2d + bl ov00_021FF31C + ldr r1, _02204110 ; =ov00_02218A9C + mov r0, r6 + add r2, sp, #0xa0 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02203FA4 + ldr r2, _022040EC ; =ov00_02218A50 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203FA4: + add r0, sp, #0x2d + add r1, sp, #0xa0 + mov r2, #0x20 + bl memcmp + cmp r0, #0 + beq _02203FE8 + ldr r2, _02204114 ; =ov00_02218AA4 + mov r0, r8 + mov r1, #0x108 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x2a0 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02203FE8: + ldr r0, [r5, #0x100] + cmp r0, #0 + beq _02204010 + ldr r1, [r5, #0x1a0] + mov r0, r8 + bl ov00_02207CEC + ldr r1, [r5, #0x1a0] + str r1, [r0] + ldr r1, [r5, #0x19c] + str r1, [r0, #4] +_02204010: + mov r0, #3 + str r0, [r5, #0x1d8] + ldr r1, [r7, #0xc] + ldr r0, [r7, #0x10] + str r1, [sp, #0x10] + str r0, [sp, #0x14] + cmp r1, #0 + beq _022040B0 + mov r0, #0x20 + bl ov00_021EC3A8 + movs r4, r0 + bne _02204058 + ldr r1, _02204118 ; =ov00_022188C0 + mov r0, r8 + bl ov00_0220A890 + add sp, sp, #0x2a0 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02204058: + mov r1, #0 + mov r2, #0x20 + bl memset + ldr r0, [r5, #0x1a0] + mov r3, #0 + str r0, [r4, #4] + add r1, sp, #0x18 + add r0, r4, #8 + mov r2, #0x15 + str r3, [r4] + bl ov00_0220A348 + add r1, sp, #0x10 + mov r0, r8 + mov r3, r4 + str r7, [sp] + mov r2, #0 + str r2, [sp, #4] + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + addne sp, sp, #0x2a0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_022040B0: + mov r0, r8 + mov r1, r7 + bl ov00_022066D0 +_022040BC: + mov r0, #0 + add sp, sp, #0x2a0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022040C8: .word 0x00000106 +_022040CC: .word 0x00000201 +_022040D0: .word ov00_02218A00 +_022040D4: .word ov00_02218A08 +_022040D8: .word ov00_02218A10 +_022040DC: .word ov00_02218A18 +_022040E0: .word ov00_02218924 +_022040E4: .word ov00_02218A48 +_022040E8: .word ov00_02218958 +_022040EC: .word ov00_02218A50 +_022040F0: .word ov00_02218964 +_022040F4: .word ov00_02218A80 +_022040F8: .word ov00_02218A88 +_022040FC: .word ov00_0221893C +_02204100: .word ov00_02218A94 +_02204104: .word ov00_022188D0 +_02204108: .word ov00_022188D8 +_0220410C: .word ov00_022188E8 +_02204110: .word ov00_02218A9C +_02204114: .word ov00_02218AA4 +_02204118: .word ov00_022188C0 + arm_func_end ov00_02203A58 + + arm_func_start ov00_0220411C +ov00_0220411C: ; 0x0220411C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5] + add r2, sp, #0 + ldr r1, [r4, #0x1d4] + bl ov00_0220A5A8 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [sp] + cmp r0, #4 + bne _02204170 + ldr r1, _022041A8 ; =0x00000107 + ldr r2, _022041AC ; =ov00_02218AC4 + mov r0, r5 + bl ov00_0220A86C + mov r0, r5 + mov r1, #4 + mov r2, #1 + bl ov00_02202990 + mov r0, #4 + ldmia sp!, {r3, r4, r5, pc} +_02204170: + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #3 + beq _02204198 + ldr r0, _022041B0 ; =ov00_02218AEC + ldr r1, _022041B4 ; =ov00_02218860 + ldr r2, _022041B8 ; =ov00_0221869C + ldr r3, _022041BC ; =0x000002EF + bl __msl_assertion_failed +_02204198: + mov r0, #2 + str r0, [r4, #0x1d8] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022041A8: .word 0x00000107 +_022041AC: .word ov00_02218AC4 +_022041B0: .word ov00_02218AEC +_022041B4: .word ov00_02218860 +_022041B8: .word ov00_0221869C +_022041BC: .word 0x000002EF + arm_func_end ov00_0220411C + + arm_func_start ov00_022041C0 +ov00_022041C0: ; 0x022041C0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r1, [r5, #8] + mov r6, r0 + cmp r1, #0 + ldr r4, [r6] + beq _02204224 + ldr r0, [r4, #0x104] + cmp r0, #0 + bne _02204224 + ldr r0, [r1, #8] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + mov r1, #0 + str r1, [r0, #8] + ldr r0, [r5, #8] + ldr r0, [r0, #0xc] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + mov r1, #0 + str r1, [r0, #0xc] + ldr r0, [r5, #8] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #8] +_02204224: + ldr r0, [r5, #0x10] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #0x10] + ldr r0, [r5, #0x18] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #0x18] + str r0, [r5, #0x14] + ldr r0, [r5, #0xc] + cmp r0, #0 + beq _02204268 + ldr r0, [r4, #0x104] + cmp r0, #1 + ldreq r0, [r5, #8] + cmpeq r0, #0 + bne _0220427C +_02204268: + mov r0, r6 + mov r1, r5 + bl ov00_02207E40 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0220427C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_022041C0 + + arm_func_start ov00_02204284 +ov00_02204284: ; 0x02204284 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r5, r0 + ldr r4, [r5] + ldr r2, [r4, #0x1d8] + cmp r2, #4 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, pc} + cmp r2, #0 + beq _02204370 + cmp r1, #0 + beq _022042E8 + cmp r2, #3 + bne _022042E8 + ldr r2, _0220443C ; =ov00_02218B04 + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r5 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02204440 ; =ov00_022189C0 + mov r0, r5 + add r1, r4, #0x1f4 + bl ov00_022020EC +_022042E8: + mov r1, #1 + ldr r0, _02204444 ; =ov00_02218B18 + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r4, #0x1d4] + add r3, sp, #8 + mov r0, r5 + add r2, r4, #0x1f4 + bl ov00_0220267C + ldr r0, [r4, #0x1d4] + mvn r1, #0 + cmp r0, r1 + beq _02204334 + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4, #0x1d4] + bl ov00_021FF818 + mvn r0, #0 + str r0, [r4, #0x1d4] +_02204334: + ldr r0, [r4, #0x204] + mvn r1, #0 + cmp r0, r1 + beq _0220435C + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4, #0x204] + bl ov00_021FF818 + mvn r0, #0 + str r0, [r4, #0x204] +_0220435C: + mov r0, #4 + str r0, [r4, #0x1d8] + mov r0, #0 + str r0, [r4, #0x19c] + str r0, [r4, #0x1a0] +_02204370: + ldr r0, [r4, #0x1dc] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1dc] + ldr r0, [r4, #0x1ec] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1ec] + ldr r0, [r4, #0x1f4] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x1f4] + ldr r0, [r4, #0x440] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x440] + ldr r0, [r4, #0x450] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x450] + ldr r1, [r4, #0x424] + cmp r1, #0 + beq _022043E0 +_022043CC: + mov r0, r5 + bl ov00_022066D0 + ldr r1, [r4, #0x424] + cmp r1, #0 + bne _022043CC +_022043E0: + mov r0, #0 + str r0, [r4, #0x424] + ldr r6, [r4, #0x434] + cmp r6, #0 + beq _0220440C +_022043F4: + mov r1, r6 + ldr r6, [r6, #0x3c] + mov r0, r5 + bl ov00_022071F4 + cmp r6, #0 + bne _022043F4 +_0220440C: + mov r0, #0 + str r0, [r4, #0x434] + ldr r6, _02204448 ; =ov00_022041C0 + mov r4, r0 +_0220441C: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl ov00_02207F1C + cmp r0, #0 + beq _0220441C + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0220443C: .word ov00_02218B04 +_02204440: .word ov00_022189C0 +_02204444: .word ov00_02218B18 +_02204448: .word ov00_022041C0 + arm_func_end ov00_02204284 + + arm_func_start ov00_0220444C +ov00_0220444C: ; 0x0220444C + stmdb sp!, {r3, r4, r5, lr} + cmp r0, #0 + cmpeq r1, #0 + cmpeq r2, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #0 + cmpge r1, #0 + cmpge r2, #0 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + cmp r1, #0xc + addls pc, pc, r1, lsl #2 + b _02204554 +_02204484: ; jump table + b _022044B8 ; case 0 + b _022044C8 ; case 1 + b _022044E8 ; case 2 + b _022044C8 ; case 3 + b _022044D8 ; case 4 + b _022044C8 ; case 5 + b _022044D8 ; case 6 + b _022044C8 ; case 7 + b _022044C8 ; case 8 + b _022044D8 ; case 9 + b _022044C8 ; case 10 + b _022044D8 ; case 11 + b _022044C8 ; case 12 +_022044B8: + cmp r0, #0 + beq _0220455C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_022044C8: + cmp r0, #0x1f + ble _0220455C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_022044D8: + cmp r0, #0x1e + ble _0220455C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_022044E8: + mov r4, r2, lsr #0x1f + rsb r3, r4, r2, lsl #30 + adds r3, r4, r3, ror #30 + bne _02204514 + ldr ip, _022045A4 ; =0x51EB851F + mov lr, #0x64 + smull r3, r5, ip, r2 + add r5, r4, r5, asr #5 + smull r3, ip, lr, r5 + subs r5, r2, r3 + bne _02204534 +_02204514: + ldr lr, _022045A4 ; =0x51EB851F + mov r3, r2, lsr #0x1f + smull ip, r4, lr, r2 + add r4, r3, r4, asr #7 + mov lr, #0x190 + smull r3, ip, lr, r4 + subs r4, r2, r3 + bne _02204544 +_02204534: + cmp r0, #0x1d + ble _0220455C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02204544: + cmp r0, #0x1c + ble _0220455C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02204554: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220455C: + ldr ip, _022045A8 ; =0x0000076C + cmp r2, ip + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + add r3, ip, #0xb3 + cmp r2, r3 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, pc} + bne _0220459C + cmp r1, #6 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, pc} + bne _0220459C + cmp r0, #6 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, pc} +_0220459C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022045A4: .word 0x51EB851F +_022045A8: .word 0x0000076C + arm_func_end ov00_0220444C + + arm_func_start ov00_022045AC +ov00_022045AC: ; 0x022045AC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov lr, r1, asr #0x18 + mov ip, r1, asr #0x10 + mov r1, r1, lsl #0x10 + and r5, ip, #0xff + and r4, lr, #0xff + mov sb, r0 + mov r6, r1, lsr #0x10 + mov r8, r2 + mov r0, r4 + mov r1, r5 + mov r2, r6 + mov r7, r3 + bl ov00_0220444C + cmp r0, #0 + bne _02204600 + ldr r0, _02204644 ; =ov00_02218B5C + ldr r1, _02204648 ; =ov00_02218B40 + ldr r2, _0220464C ; =ov00_02218B1C + mov r3, #0xb7 + bl __msl_assertion_failed +_02204600: + mov r0, r4 + mov r1, r5 + mov r2, r6 + bl ov00_0220444C + cmp r0, #0 + bne _0220462C + ldr r1, _02204650 ; =ov00_02218B4C + mov r0, sb + bl ov00_0220A890 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220462C: + str r4, [r8] + ldr r0, [sp, #0x20] + str r5, [r7] + str r6, [r0] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02204644: .word ov00_02218B5C +_02204648: .word ov00_02218B40 +_0220464C: .word ov00_02218B1C +_02204650: .word ov00_02218B4C + arm_func_end ov00_022045AC + + arm_func_start ov00_02204654 +ov00_02204654: ; 0x02204654 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr r1, [r5] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #8] + beq _02204680 + add r0, r4, #8 + mov r2, #0x1f + bl ov00_0220A348 +_02204680: + ldr r1, [r5, #4] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0x27] + beq _022046A0 + add r0, r4, #0x27 + mov r2, #0x15 + bl ov00_0220A348 +_022046A0: + ldr r1, [r5, #8] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0x3c] + beq _022046C0 + add r0, r4, #0x3c + mov r2, #0x33 + bl ov00_0220A348 +_022046C0: + ldr r1, [r5, #0xc] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0x6f] + beq _022046E0 + add r0, r4, #0x6f + mov r2, #0x1f + bl ov00_0220A348 +_022046E0: + ldr r1, [r5, #0x10] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0x8e] + beq _02204700 + add r0, r4, #0x8e + mov r2, #0x1f + bl ov00_0220A348 +_02204700: + ldr r1, [r5, #0x14] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0xad] + beq _02204720 + add r0, r4, #0xad + mov r2, #0x4c + bl ov00_0220A348 +_02204720: + ldr r3, [r5, #0x18] + add r0, r4, #0x100 + add r1, r5, #0x1c + mov r2, #0xb + str r3, [r4, #0xfc] + bl ov00_0220A348 + add r0, r4, #0xb + add r0, r0, #0x100 + add r1, r5, #0x27 + mov r2, #3 + bl ov00_0220A348 + ldr r0, [r5, #0x2c] + adds r1, r5, #0x34 + str r0, [r4, #0x110] + ldr r0, [r5, #0x30] + str r0, [r4, #0x114] + moveq r0, #0 + streqb r0, [r4, #0x118] + beq _02204778 + add r0, r4, #0x118 + mov r2, #0x80 + bl ov00_0220A348 +_02204778: + ldr r0, [r5, #0xb4] + str r0, [r4, #0x198] + ldr r0, [r5, #0xb8] + str r0, [r4, #0x19c] + ldr r0, [r5, #0xbc] + str r0, [r4, #0x1a0] + ldr r0, [r5, #0xc0] + str r0, [r4, #0x1a4] + ldr r0, [r5, #0xc4] + str r0, [r4, #0x1a8] + ldr r1, [r5, #0xc8] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, #0x1ac] + beq _022047C0 + add r0, r4, #0x1ac + mov r2, #0x33 + bl ov00_0220A348 +_022047C0: + ldr r0, [r5, #0x18] + str r0, [r4, #0xfc] + ldr r0, [r5, #0x2c] + str r0, [r4, #0x110] + ldr r0, [r5, #0x30] + str r0, [r4, #0x114] + ldr r0, [r5, #0xb4] + str r0, [r4, #0x198] + ldr r0, [r5, #0xb8] + str r0, [r4, #0x19c] + ldr r0, [r5, #0xbc] + str r0, [r4, #0x1a0] + ldr r0, [r5, #0xc0] + str r0, [r4, #0x1a4] + ldr r0, [r5, #0xc4] + str r0, [r4, #0x1a8] + ldr r0, [r5, #0xcc] + str r0, [r4, #0x1e0] + ldr r0, [r5, #0xd0] + str r0, [r4, #0x1e4] + ldr r0, [r5, #0xd4] + str r0, [r4, #0x1e8] + ldr r0, [r5, #0xd8] + str r0, [r4, #0x1ec] + ldr r0, [r5, #0xdc] + str r0, [r4, #0x1f0] + ldr r0, [r5, #0xe0] + str r0, [r4, #0x1f4] + ldr r0, [r5, #0xe4] + str r0, [r4, #0x1f8] + ldr r0, [r5, #0xe8] + str r0, [r4, #0x1fc] + ldr r0, [r5, #0xec] + str r0, [r4, #0x200] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02204654 + + arm_func_start ov00_0220484C +ov00_0220484C: ; 0x0220484C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x268 + mov r4, r2 + mov sl, r0 + mov fp, r1 + mov r1, r4 + mov r2, #1 + ldr r6, [sl] + bl ov00_0220A3C8 + cmp r0, #0 + addne sp, sp, #0x268 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02204FD4 ; =ov00_02218B74 + mov r0, r4 + mov r2, #4 + bl strncmp + cmp r0, #0 + beq _022048C4 + ldr r2, _02204FD8 ; =ov00_02218B7C + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x268 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022048C4: + ldr r1, _02204FDC ; =ov00_02218BAC + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + bne _0220490C + ldr r2, _02204FD8 ; =ov00_02218B7C + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x268 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220490C: + add r0, sp, #0xec + bl atoi + mov sb, r0 + cmp sb, #0 + bgt _02204934 + ldr r0, _02204FE0 ; =ov00_02218BB8 + ldr r1, _02204FE4 ; =ov00_02218B40 + ldr r2, _02204FE8 ; =ov00_02218B2C + ldr r3, _02204FEC ; =0x0000015A + bl __msl_assertion_failed +_02204934: + add r2, sp, #0x10 + mov r0, sl + mov r1, sb + bl ov00_02207DD0 + mov r0, #0 + add r7, sp, #0x178 + mov r1, r0 + mov r2, r0 + mov r3, r0 + mov r5, #7 +_0220495C: + stmia r7!, {r0, r1, r2, r3} + stmia r7!, {r0, r1, r2, r3} + subs r5, r5, #1 + bne _0220495C + stmia r7!, {r0, r1, r2, r3} + add r3, sp, #0xb8 + add r1, sp, #0x66 + add r2, sp, #0xcd + add r5, sp, #0x85 + add r0, sp, #0x47 + str r3, [sp, #0x17c] + add r3, sp, #0x12c + str r1, [sp, #0x184] + str r5, [sp, #0x180] + add r5, sp, #0x14 + str r0, [sp, #0x188] + str r3, [sp, #0x18c] + ldr r1, _02204FF0 ; =ov00_02218BC8 + mov r0, r4 + mov r3, #0x1f + str r2, [sp, #0x178] + str r5, [sp, #0x240] + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x178] + moveq r1, #0 + streqb r1, [r0] + ldr r2, [sp, #0x17c] + ldr r1, _02204FF4 ; =ov00_02218BD0 + mov r0, r4 + mov r3, #0x15 + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x17c] + moveq r1, #0 + streqb r1, [r0] + ldr r2, [sp, #0x180] + ldr r1, _02204FF8 ; =ov00_02218BE0 + mov r0, r4 + mov r3, #0x33 + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x180] + moveq r1, #0 + streqb r1, [r0] + ldr r2, [sp, #0x184] + ldr r1, _02204FFC ; =ov00_02218BE8 + mov r0, r4 + mov r3, #0x1f + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x184] + moveq r1, #0 + streqb r1, [r0] + ldr r2, [sp, #0x188] + ldr r1, _02205000 ; =ov00_02218BF4 + mov r0, r4 + mov r3, #0x1f + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x188] + moveq r1, #0 + streqb r1, [r0] + ldr r1, _02205004 ; =ov00_02218C00 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + mvneq r0, #0 + streq r0, [sp, #0x190] + beq _02204A88 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x190] +_02204A88: + ldr r2, [sp, #0x18c] + ldr r1, _02205008 ; =ov00_02218C0C + mov r0, r4 + mov r3, #0x4c + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x18c] + moveq r1, #0 + streqb r1, [r0] + ldr r1, _0220500C ; =ov00_02218C18 + add r2, sp, #0x194 + mov r0, r4 + mov r3, #0xb + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + add r2, sp, #0x100 + streqb r0, [sp, #0x194] + ldr r1, _02205010 ; =ov00_02218C24 + add r2, r2, #0x9f + mov r0, r4 + mov r3, #3 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streqb r0, [sp, #0x19f] + ldr r1, _02205014 ; =ov00_02218C34 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x1a4] + beq _02204B24 + add r0, sp, #0xec + bl atof + bl _d2f + str r0, [sp, #0x1a4] +_02204B24: + ldr r1, _02205018 ; =ov00_02218C3C + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x1a8] + beq _02204B58 + add r0, sp, #0xec + bl atof + bl _d2f + str r0, [sp, #0x1a8] +_02204B58: + ldr r1, _0220501C ; =ov00_02218C44 + add r2, sp, #0x1ac + mov r0, r4 + mov r3, #0x80 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streqb r0, [sp, #0x1ac] + ldr r1, _02205020 ; =ov00_02218C4C + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02204BA8 + mov r0, #0 + str r0, [sp, #0x22c] + str r0, [sp, #0x230] + str r0, [sp, #0x234] + b _02204BD8 +_02204BA8: + add r0, sp, #0xec + bl atoi + add r5, sp, #0x234 + mov r1, r0 + add r2, sp, #0x22c + add r3, sp, #0x230 + mov r0, sl + str r5, [sp] + bl ov00_022045AC + cmp r0, #0 + addne sp, sp, #0x268 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02204BD8: + ldr r1, _02205024 ; =ov00_02218C58 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, _02205028 ; =0x00000502 + streq r0, [sp, #0x238] + beq _02204C24 + ldrsb r0, [sp, #0xec] + cmp r0, #0x30 + moveq r0, #0x500 + streq r0, [sp, #0x238] + beq _02204C24 + cmp r0, #0x31 + ldreq r0, _0220502C ; =0x00000501 + streq r0, [sp, #0x238] + ldrne r0, _02205028 ; =0x00000502 + strne r0, [sp, #0x238] +_02204C24: + ldr r1, _02205030 ; =ov00_02218C60 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + mvneq r0, #0 + streq r0, [sp, #0x23c] + beq _02204C54 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x23c] +_02204C54: + ldr r2, [sp, #0x240] + ldr r1, _02205034 ; =ov00_02218C68 + mov r0, r4 + mov r3, #0x33 + bl ov00_0220A4A0 + cmp r0, #0 + ldreq r0, [sp, #0x240] + moveq r1, #0 + streqb r1, [r0] + ldr r1, _02205038 ; =ov00_02218C70 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x244] + beq _02204CA8 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x244] +_02204CA8: + ldr r1, _0220503C ; =ov00_02218C78 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x248] + beq _02204CD8 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x248] +_02204CD8: + ldr r1, _02205040 ; =ov00_02218C80 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x24c] + beq _02204D08 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x24c] +_02204D08: + ldr r1, _02205044 ; =ov00_02218C88 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x250] + beq _02204D38 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x250] +_02204D38: + ldr r1, _02205048 ; =ov00_02218C90 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x254] + beq _02204D68 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x254] +_02204D68: + ldr r1, _0220504C ; =ov00_02218C98 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x258] + beq _02204D98 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x258] +_02204D98: + ldr r1, _02205050 ; =ov00_02218CA0 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x25c] + beq _02204DC8 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x25c] +_02204DC8: + ldr r1, _02205054 ; =ov00_02218CA8 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x260] + beq _02204DF8 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x260] +_02204DF8: + ldr r1, _02205058 ; =ov00_02218CB0 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streq r0, [sp, #0x264] + beq _02204E28 + add r0, sp, #0xec + bl atoi + str r0, [sp, #0x264] +_02204E28: + ldr r1, _0220505C ; =ov00_02218CB8 + add r2, sp, #0xec + mov r0, r4 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02204E70 + ldr r2, _02204FD8 ; =ov00_02218B7C + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x268 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02204E70: + ldr r7, [r6, #0x434] + ldr r8, [r6, #0x100] + cmp r7, #0 + beq _02204ECC + mov r5, #0x66 + mov r4, #1 +_02204E88: + ldr r0, [r7, #0xc] + cmp r0, sb + ldreq r0, [r7] + cmpeq r0, #0x65 + bne _02204EC0 + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _02204EB8 + mov r0, sl + mov r1, sb + bl ov00_02207CEC + str r0, [sp, #0x10] +_02204EB8: + mov r8, r4 + str r5, [r7] +_02204EC0: + ldr r7, [r7, #0x3c] + cmp r7, #0 + bne _02204E88 +_02204ECC: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _02204EF4 + ldr r0, [r6, #0x100] + cmp r0, #0 + beq _02204EF4 + mov r0, sl + mov r1, sb + bl ov00_02207CEC + str r0, [sp, #0x10] +_02204EF4: + cmp r8, #0 + beq _02204F24 + ldr r0, [sp, #0x10] + ldr r0, [r0, #0x18] + bl ov00_021EC3D8 + ldr r1, [sp, #0x10] + mov r2, #0 + add r0, sp, #0xec + str r2, [r1, #0x18] + bl ov00_021FF3D4 + ldr r1, [sp, #0x10] + str r0, [r1, #0x18] +_02204F24: + ldr r0, [r6, #0x100] + cmp r0, #0 + beq _02204F40 + ldr r1, [sp, #0x10] + add r2, sp, #0x178 + mov r0, sl + bl ov00_0220608C +_02204F40: + ldr r1, [fp, #0xc] + ldr r0, [fp, #0x10] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + beq _02204FBC + mov r0, #0x204 + bl ov00_021EC3A8 + movs r4, r0 + bne _02204F80 + ldr r1, _02205060 ; =ov00_02218CC0 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x268 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02204F80: + add r0, sp, #0x178 + mov r1, r4 + bl ov00_02204654 + mov r2, #0 + stmia r4, {r2, sb} + str fp, [sp] + add r1, sp, #8 + str r2, [sp, #4] + mov r0, sl + mov r3, r4 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + addne sp, sp, #0x268 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02204FBC: + mov r0, sl + mov r1, fp + bl ov00_022066D0 + mov r0, #0 + add sp, sp, #0x268 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02204FD4: .word ov00_02218B74 +_02204FD8: .word ov00_02218B7C +_02204FDC: .word ov00_02218BAC +_02204FE0: .word ov00_02218BB8 +_02204FE4: .word ov00_02218B40 +_02204FE8: .word ov00_02218B2C +_02204FEC: .word 0x0000015A +_02204FF0: .word ov00_02218BC8 +_02204FF4: .word ov00_02218BD0 +_02204FF8: .word ov00_02218BE0 +_02204FFC: .word ov00_02218BE8 +_02205000: .word ov00_02218BF4 +_02205004: .word ov00_02218C00 +_02205008: .word ov00_02218C0C +_0220500C: .word ov00_02218C18 +_02205010: .word ov00_02218C24 +_02205014: .word ov00_02218C34 +_02205018: .word ov00_02218C3C +_0220501C: .word ov00_02218C44 +_02205020: .word ov00_02218C4C +_02205024: .word ov00_02218C58 +_02205028: .word 0x00000502 +_0220502C: .word 0x00000501 +_02205030: .word ov00_02218C60 +_02205034: .word ov00_02218C68 +_02205038: .word ov00_02218C70 +_0220503C: .word ov00_02218C78 +_02205040: .word ov00_02218C80 +_02205044: .word ov00_02218C88 +_02205048: .word ov00_02218C90 +_0220504C: .word ov00_02218C98 +_02205050: .word ov00_02218CA0 +_02205054: .word ov00_02218CA8 +_02205058: .word ov00_02218CB0 +_0220505C: .word ov00_02218CB8 +_02205060: .word ov00_02218CC0 + arm_func_end ov00_0220484C + + arm_func_start ov00_02205064 +ov00_02205064: ; 0x02205064 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6] + mov r5, r1 + ldr r2, [r4, #0x448] + cmp r2, #0 + ble _022050C0 + ldr r2, _0220511C ; =ov00_02218CD0 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r6 + mov r1, r5 + bl ov00_0220211C + ldr r2, [r4, #0x440] + mov r0, r6 + mov r1, r5 + bl ov00_022020EC + ldr r2, _02205120 ; =ov00_02218CE8 + mov r0, r6 + mov r1, r5 + bl ov00_022020EC + mov r0, #0 + str r0, [r4, #0x448] +_022050C0: + ldr r0, [r4, #0x458] + cmp r0, #0 + ble _02205114 + ldr r2, _02205124 ; =ov00_02218CF0 + mov r0, r6 + mov r1, r5 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r6 + mov r1, r5 + bl ov00_0220211C + ldr r2, [r4, #0x450] + mov r0, r6 + mov r1, r5 + bl ov00_022020EC + ldr r2, _02205120 ; =ov00_02218CE8 + mov r0, r6 + mov r1, r5 + bl ov00_022020EC + mov r0, #0 + str r0, [r4, #0x458] +_02205114: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220511C: .word ov00_02218CD0 +_02205120: .word ov00_02218CE8 +_02205124: .word ov00_02218CF0 + arm_func_end ov00_02205064 + + arm_func_start ov00_02205128 +ov00_02205128: ; 0x02205128 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6] + mov r5, r2 + mov r2, r1 + add r1, r4, #0x440 + bl ov00_022020EC + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r2, r5 + add r1, r4, #0x440 + bl ov00_022020EC + cmp r0, #0 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02205128 + + arm_func_start ov00_02205168 +ov00_02205168: ; 0x02205168 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6] + mov r5, r2 + mov r2, r1 + add r1, r4, #0x450 + bl ov00_022020EC + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r2, r5 + add r1, r4, #0x450 + bl ov00_022020EC + cmp r0, #0 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02205168 + + arm_func_start ov00_022051A8 +ov00_022051A8: ; 0x022051A8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + sub r1, r1, #6 + sub r1, r1, #0x700 + mov r4, r0 + cmp r1, #0x18 + addls pc, pc, r1, lsl #2 + b _022055EC +_022051C8: ; jump table + b _02205300 ; case 0 + b _022055EC ; case 1 + b _0220522C ; case 2 + b _022055EC ; case 3 + b _022055EC ; case 4 + b _02205274 ; case 5 + b _0220532C ; case 6 + b _02205358 ; case 7 + b _02205384 ; case 8 + b _022055EC ; case 9 + b _022053BC ; case 10 + b _022055EC ; case 11 + b _022053F4 ; case 12 + b _0220542C ; case 13 + b _02205458 ; case 14 + b _02205484 ; case 15 + b _022055EC ; case 16 + b _022055EC ; case 17 + b _022054B8 ; case 18 + b _022054E4 ; case 19 + b _02205510 ; case 20 + b _0220553C ; case 21 + b _02205568 ; case 22 + b _02205594 ; case 23 + b _022055C0 ; case 24 +_0220522C: + cmp r2, #0 + bge _02205248 + ldr r1, _02205610 ; =ov00_02218D04 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #2 + ldmia sp!, {r4, pc} +_02205248: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205618 ; =ov00_02218C18 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205274: + cmp r2, #0x500 + beq _02205298 + ldr r1, _0220561C ; =0x00000501 + cmp r2, r1 + beq _022052B4 + add r1, r1, #1 + cmp r2, r1 + beq _022052D0 + b _022052EC +_02205298: + ldr r1, _02205620 ; =ov00_02218C58 + ldr r2, _02205624 ; =ov00_02218D1C + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022052B4: + ldr r1, _02205620 ; =ov00_02218C58 + ldr r2, _02205628 ; =ov00_02218D20 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022052D0: + ldr r1, _02205620 ; =ov00_02218C58 + ldr r2, _0220562C ; =ov00_02218D24 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022052EC: + ldr r1, _02205630 ; =ov00_02218D28 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #2 + ldmia sp!, {r4, pc} +_02205300: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205634 ; =ov00_02218C00 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_0220532C: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205638 ; =ov00_02218D38 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205358: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _0220563C ; =ov00_02218D48 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205384: + mov r0, r2, asr #3 + add r2, r2, r0, lsr #28 + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + mov r2, r2, asr #4 + bl sprintf + ldr r1, _02205640 ; =ov00_02218D54 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022053BC: + mov r0, r2, asr #1 + add r2, r2, r0, lsr #30 + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + mov r2, r2, asr #2 + bl sprintf + ldr r1, _02205644 ; =ov00_02218D60 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022053F4: + mov r0, r2, asr #1 + add r2, r2, r0, lsr #30 + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + mov r2, r2, asr #2 + bl sprintf + ldr r1, _02205648 ; =ov00_02218D70 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_0220542C: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _0220564C ; =ov00_02218D80 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205458: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205650 ; =ov00_02218D90 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205484: + ldr r1, _02205614 ; =ov00_02218D18 + cmp r2, #0 + movne r2, #1 + add r0, sp, #0 + bl sprintf + ldr r1, _02205654 ; =ov00_02218DA4 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205168 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022054B8: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205658 ; =ov00_02218C70 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022054E4: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _0220565C ; =ov00_02218C78 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205510: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205660 ; =ov00_02218C80 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_0220553C: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205664 ; =ov00_02218C88 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205568: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205668 ; =ov00_02218C90 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_02205594: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _0220566C ; =ov00_02218C98 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022055C0: + ldr r1, _02205614 ; =ov00_02218D18 + add r0, sp, #0 + bl sprintf + ldr r1, _02205670 ; =ov00_02218CA0 + add r2, sp, #0 + mov r0, r4 + bl ov00_02205128 + cmp r0, #0 + beq _02205604 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_022055EC: + ldr r1, _02205674 ; =ov00_02218DB4 + mov r0, r4 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #2 + ldmia sp!, {r4, pc} +_02205604: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02205610: .word ov00_02218D04 +_02205614: .word ov00_02218D18 +_02205618: .word ov00_02218C18 +_0220561C: .word 0x00000501 +_02205620: .word ov00_02218C58 +_02205624: .word ov00_02218D1C +_02205628: .word ov00_02218D20 +_0220562C: .word ov00_02218D24 +_02205630: .word ov00_02218D28 +_02205634: .word ov00_02218C00 +_02205638: .word ov00_02218D38 +_0220563C: .word ov00_02218D48 +_02205640: .word ov00_02218D54 +_02205644: .word ov00_02218D60 +_02205648: .word ov00_02218D70 +_0220564C: .word ov00_02218D80 +_02205650: .word ov00_02218D90 +_02205654: .word ov00_02218DA4 +_02205658: .word ov00_02218C70 +_0220565C: .word ov00_02218C78 +_02205660: .word ov00_02218C80 +_02205664: .word ov00_02218C88 +_02205668: .word ov00_02218C90 +_0220566C: .word ov00_02218C98 +_02205670: .word ov00_02218CA0 +_02205674: .word ov00_02218DB4 + arm_func_end ov00_022051A8 + + arm_func_start ov00_02205678 +ov00_02205678: ; 0x02205678 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x100 + mov r6, r0 + movs r5, r2 + ldr r4, [r6] + bne _022056A4 + ldr r1, _02205DC8 ; =ov00_02218DC4 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_022056A4: + sub r1, r1, #0x700 + cmp r1, #0x1e + addls pc, pc, r1, lsl #2 + b _02205DA4 +_022056B4: ; jump table + b _02205730 ; case 0 + b _02205790 ; case 1 + b _022057F4 ; case 2 + b _0220585C ; case 3 + b _022058C0 ; case 4 + b _022058F0 ; case 5 + b _02205A74 ; case 6 + b _02205920 ; case 7 + b _02205950 ; case 8 + b _02205980 ; case 9 + b _02205DA4 ; case 10 + b _022059D8 ; case 11 + b _02205DA4 ; case 12 + b _02205AA4 ; case 13 + b _02205ACC ; case 14 + b _02205AF4 ; case 15 + b _02205B24 ; case 16 + b _02205B4C ; case 17 + b _02205B7C ; case 18 + b _02205DA4 ; case 19 + b _02205BA4 ; case 20 + b _02205BCC ; case 21 + b _02205BF4 ; case 22 + b _02205C24 ; case 23 + b _02205C54 ; case 24 + b _02205C84 ; case 25 + b _02205CB4 ; case 26 + b _02205CE4 ; case 27 + b _02205D14 ; case 28 + b _02205D44 ; case 29 + b _02205D74 ; case 30 +_02205730: + ldrsb r1, [r5] + cmp r1, #0 + bne _02205750 + ldr r1, _02205DC8 ; =ov00_02218DC4 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_02205750: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + add r1, sp, #0 + add r0, r4, #0x110 + mov r2, #0x1f + bl ov00_0220A348 + ldr r1, _02205DCC ; =ov00_02218BC8 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205790: + ldrsb r1, [r5] + cmp r1, #0 + bne _022057B0 + ldr r1, _02205DC8 ; =ov00_02218DC4 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_022057B0: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x15 + bl ov00_0220A348 + add r0, r4, #0x2f + add r1, sp, #0 + add r0, r0, #0x100 + mov r2, #0x15 + bl ov00_0220A348 + ldr r1, _02205DD0 ; =ov00_02218BD0 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_022057F4: + ldrsb r1, [r5] + cmp r1, #0 + bne _02205814 + ldr r1, _02205DC8 ; =ov00_02218DC4 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_02205814: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x33 + bl ov00_0220A348 + add r0, sp, #0 + bl ov00_021FF408 + add r1, sp, #0 + add r0, r4, #0x144 + mov r2, #0x33 + bl ov00_0220A348 + ldr r1, _02205DD4 ; =ov00_02218BE0 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205168 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_0220585C: + ldrsb r1, [r5] + cmp r1, #0 + bne _0220587C + ldr r1, _02205DC8 ; =ov00_02218DC4 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_0220587C: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + add r0, r4, #0x77 + add r1, sp, #0 + add r0, r0, #0x100 + mov r2, #0x1f + bl ov00_0220A348 + ldr r1, _02205DD8 ; =ov00_02218DD4 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205168 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_022058C0: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + ldr r1, _02205DDC ; =ov00_02218BE8 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_022058F0: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + ldr r1, _02205DE0 ; =ov00_02218BF4 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205920: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x4c + bl ov00_0220A348 + ldr r1, _02205DE4 ; =ov00_02218C0C + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205950: + add r0, sp, #0 + mov r1, r5 + mov r2, #0xb + bl ov00_0220A348 + ldr r1, _02205DE8 ; =ov00_02218C18 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205980: + mov r0, r5 + bl strlen + cmp r0, #2 + beq _022059A8 + ldr r1, _02205DEC ; =ov00_02218DE0 + mov r0, r6 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_022059A8: + add r0, sp, #0 + mov r1, r5 + mov r2, #3 + bl ov00_0220A348 + ldr r1, _02205DF0 ; =ov00_02218C24 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_022059D8: + ldrsb r1, [r5] + cmp r1, #0 + blt _022059F4 + cmp r1, #0x80 + bge _022059F4 + ldr r0, _02205DF4 ; =_0210E484 + ldrb r1, [r0, r1] +_022059F4: + mov r0, r1, lsl #0x18 + mov r0, r0, asr #0x18 + cmp r0, #0x4d + add r2, sp, #0 + bne _02205A20 + ldr r0, _02205DF8 ; =ov00_02218D1C + ldrb r1, [r0] + ldrb r0, [r0, #1] + strb r1, [r2] + strb r0, [r2, #1] + b _02205A54 +_02205A20: + cmp r0, #0x46 + bne _02205A40 + ldr r0, _02205DFC ; =ov00_02218D20 + ldrb r1, [r0] + ldrb r0, [r0, #1] + strb r1, [r2] + strb r0, [r2, #1] + b _02205A54 +_02205A40: + ldr r0, _02205E00 ; =ov00_02218D24 + ldrb r1, [r0] + ldrb r0, [r0, #1] + strb r1, [r2] + strb r0, [r2, #1] +_02205A54: + ldr r1, _02205E04 ; =ov00_02218C58 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205A74: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E08 ; =ov00_02218C00 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205AA4: + mov r0, r5 + bl atoi + mov r2, r0 + ldr r1, _02205E0C ; =0x0000070D + mov r0, r6 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205ACC: + mov r0, r5 + bl atoi + mov r2, r0 + ldr r1, _02205E10 ; =0x0000070E + mov r0, r6 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205AF4: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E14 ; =ov00_02218DF8 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205B24: + mov r0, r5 + bl atoi + mov r2, r0 + mov r0, r6 + mov r1, #0x710 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205B4C: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E18 ; =ov00_02218E0C + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205B7C: + mov r0, r5 + bl atoi + mov r2, r0 + ldr r1, _02205E1C ; =0x00000712 + mov r0, r6 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205BA4: + mov r0, r5 + bl atoi + mov r2, r0 + ldr r1, _02205E20 ; =0x00000714 + mov r0, r6 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205BCC: + mov r0, r5 + bl atoi + mov r2, r0 + ldr r1, _02205E24 ; =0x00000715 + mov r0, r6 + bl ov00_022051A8 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205BF4: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E28 ; =ov00_02218E20 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205C24: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x33 + bl ov00_0220A348 + ldr r1, _02205E2C ; =ov00_02218C68 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205C54: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E30 ; =ov00_02218C70 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205C84: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E34 ; =ov00_02218C78 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205CB4: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E38 ; =ov00_02218C80 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205CE4: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E3C ; =ov00_02218C88 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205D14: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E40 ; =ov00_02218C90 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205D44: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E44 ; =ov00_02218C98 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205D74: + add r0, sp, #0 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + ldr r1, _02205E48 ; =ov00_02218CA0 + add r2, sp, #0 + mov r0, r6 + bl ov00_02205128 + cmp r0, #0 + beq _02205DBC + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} +_02205DA4: + ldr r1, _02205E4C ; =ov00_02218DB4 + mov r0, r6 + bl ov00_0220A890 + add sp, sp, #0x100 + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_02205DBC: + mov r0, #0 + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02205DC8: .word ov00_02218DC4 +_02205DCC: .word ov00_02218BC8 +_02205DD0: .word ov00_02218BD0 +_02205DD4: .word ov00_02218BE0 +_02205DD8: .word ov00_02218DD4 +_02205DDC: .word ov00_02218BE8 +_02205DE0: .word ov00_02218BF4 +_02205DE4: .word ov00_02218C0C +_02205DE8: .word ov00_02218C18 +_02205DEC: .word ov00_02218DE0 +_02205DF0: .word ov00_02218C24 +_02205DF4: .word _0210E484 +_02205DF8: .word ov00_02218D1C +_02205DFC: .word ov00_02218D20 +_02205E00: .word ov00_02218D24 +_02205E04: .word ov00_02218C58 +_02205E08: .word ov00_02218C00 +_02205E0C: .word 0x0000070D +_02205E10: .word 0x0000070E +_02205E14: .word ov00_02218DF8 +_02205E18: .word ov00_02218E0C +_02205E1C: .word 0x00000712 +_02205E20: .word 0x00000714 +_02205E24: .word 0x00000715 +_02205E28: .word ov00_02218E20 +_02205E2C: .word ov00_02218C68 +_02205E30: .word ov00_02218C70 +_02205E34: .word ov00_02218C78 +_02205E38: .word ov00_02218C80 +_02205E3C: .word ov00_02218C88 +_02205E40: .word ov00_02218C90 +_02205E44: .word ov00_02218C98 +_02205E48: .word ov00_02218CA0 +_02205E4C: .word ov00_02218DB4 + arm_func_end ov00_02205678 + + arm_func_start ov00_02205E50 +ov00_02205E50: ; 0x02205E50 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r4, [r7] + mov r5, r2 + mov r6, r1 + ldr r2, _02205ED8 ; =ov00_02218E2C + add r1, r4, #0x1f4 + bl ov00_022020EC + ldr r2, [r4, #0x198] + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + ldr r2, _02205EDC ; =ov00_02218BAC + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_022020EC + mov r2, r6 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + mov r0, r7 + add r1, r4, #0x1f4 + ldr r2, _02205EE0 ; =ov00_02218E44 + bl ov00_022020EC + mov r2, r5 + mov r0, r7 + add r1, r4, #0x1f4 + bl ov00_0220211C + mov r0, r7 + add r1, r4, #0x1f4 + ldr r2, _02205EE4 ; =ov00_02218CE8 + bl ov00_022020EC + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02205ED8: .word ov00_02218E2C +_02205EDC: .word ov00_02218BAC +_02205EE0: .word ov00_02218E44 +_02205EE4: .word ov00_02218CE8 + arm_func_end ov00_02205E50 + + arm_func_start ov00_02205EE8 +ov00_02205EE8: ; 0x02205EE8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x1c + mov r8, r0 + ldr r0, [r8] + mov r4, #0 + str r4, [sp, #0x14] + ldr r0, [r0, #0x100] + cmp r2, #1 + moveq r4, #1 + cmp r0, #0 + ldr r5, [sp, #0x38] + moveq r4, #0 + cmp r5, #0 + mov r7, r1 + mov r6, r3 + cmpne r4, #0 + beq _02206008 + add r2, sp, #0x18 + mov r0, r8 + mov r1, r7 + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp, #0x18] + ldrne r0, [r0, #0xc] + cmpne r0, #0 + beq _02206008 + mov r0, #0x204 + bl ov00_021EC3A8 + movs r4, r0 + bne _02205F78 + ldr r1, _02206088 ; =ov00_02218CC0 + mov r0, r8 + bl ov00_0220A890 + add sp, sp, #0x1c + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02205F78: + ldr r0, [sp, #0x18] + mov r1, r4 + ldr r0, [r0, #0xc] + bl ov00_02204654 + mov r2, #0 + ldr ip, [sp, #0x3c] + stmia r4, {r2, r7} + mov r0, #1 + stmia sp, {r0, r5} + add r3, sp, #0x14 + mov r0, r8 + mov r1, #2 + str r5, [sp, #0xc] + str ip, [sp, #0x10] + str ip, [sp, #8] + bl ov00_0220657C + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r2, [sp, #0x14] + add r1, sp, #0xc + ldr r5, [r2, #0x18] + mov r0, r8 + str r2, [sp] + mov r2, #0 + str r2, [sp, #4] + mov r3, r4 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0x14] + mov r0, r8 + bl ov00_022066D0 + b _0220605C +_02206008: + str r6, [sp] + ldr r4, [sp, #0x3c] + str r5, [sp, #4] + add r3, sp, #0x14 + mov r0, r8 + mov r1, #2 + mov r2, #0 + str r4, [sp, #8] + bl ov00_0220657C + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0x14] + mov r0, r8 + ldr r5, [r1, #0x18] + mov r1, r7 + mov r2, r5 + bl ov00_02205E50 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220605C: + cmp r6, #0 + beq _0220607C + mov r0, r8 + mov r1, r5 + bl ov00_02200ED8 + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220607C: + mov r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02206088: .word ov00_02218CC0 + arm_func_end ov00_02205EE8 + + arm_func_start ov00_0220608C +ov00_0220608C: ; 0x0220608C + stmdb sp!, {r4, r5, r6, lr} + ldr r0, [r0] + mov r5, r1 + ldr r0, [r0, #0x100] + mov r4, r2 + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl ov00_02206164 + mov r0, #0xf0 + bl ov00_021EC3A8 + movs r6, r0 + str r0, [r5, #0xc] + beq _02206150 + mov lr, r4 + mov ip, #0xf +_022060D0: + ldmia lr!, {r0, r1, r2, r3} + stmia r6!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _022060D0 + ldr r0, [r4] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1] + ldr r0, [r4, #4] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #4] + ldr r0, [r4, #8] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #8] + ldr r0, [r4, #0xc] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #0xc] + ldr r0, [r4, #0x10] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #0x10] + ldr r0, [r4, #0x14] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #0x14] + ldr r0, [r4, #0xc8] + bl ov00_021FF3D4 + ldr r1, [r5, #0xc] + str r0, [r1, #0xc8] +_02206150: + ldr r0, [r5, #0xc] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_0220608C + + arm_func_start ov00_02206164 +ov00_02206164: ; 0x02206164 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0xc] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r0] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0] + ldr r0, [r4, #0xc] + ldr r0, [r0, #4] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #4] + ldr r0, [r4, #0xc] + ldr r0, [r0, #8] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #8] + ldr r0, [r4, #0xc] + ldr r0, [r0, #0xc] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #0xc] + ldr r0, [r4, #0xc] + ldr r0, [r0, #0x10] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #0x10] + ldr r0, [r4, #0xc] + ldr r0, [r0, #0x14] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #0x14] + ldr r0, [r4, #0xc] + ldr r0, [r0, #0xc8] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + mov r1, #0 + str r1, [r0, #0xc8] + ldr r0, [r4, #0xc] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end ov00_02206164 + + arm_func_start ov00_02206230 +ov00_02206230: ; 0x02206230 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + movs r7, r0 + mov r6, r1 + ldr r4, [r7] + bne _0220625C + ldr r0, _0220655C ; =ov00_02218E88 + ldr r1, _02206560 ; =ov00_02218E9C + ldr r2, _02206564 ; =ov00_02218E60 + mov r3, #0x22 + bl __msl_assertion_failed +_0220625C: + ldr r0, [r7] + cmp r0, #0 + bne _0220627C + ldr r0, _02206568 ; =ov00_02218EAC + ldr r1, _02206560 ; =ov00_02218E9C + ldr r2, _02206564 ; =ov00_02218E60 + mov r3, #0x23 + bl __msl_assertion_failed +_0220627C: + cmp r6, #0 + bne _02206298 + ldr r0, _0220656C ; =ov00_02218EC0 + ldr r1, _02206560 ; =ov00_02218E9C + ldr r2, _02206564 ; =ov00_02218E60 + mov r3, #0x24 + bl __msl_assertion_failed +_02206298: + ldr r1, [r6, #0xc] + ldr r0, [r6, #0x10] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + beq _02206550 + ldr r0, [r6] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _0220653C +_022062C0: ; jump table + b _022062D4 ; case 0 + b _02206360 ; case 1 + b _022063DC ; case 2 + b _02206448 ; case 3 + b _022064D0 ; case 4 +_022062D4: + mov r0, #0x20 + bl ov00_021EC3A8 + movs r5, r0 + bne _022062FC + ldr r1, _02206570 ; =ov00_02218ED4 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022062FC: + mov r1, #0 + mov r2, #0x20 + bl memset + ldr r1, [r6, #0x1c] + ldr r0, _02206574 ; =0x00000201 + str r1, [r5] + ldr r1, [r4, #0x418] + cmp r1, r0 + bne _02206330 + ldr r1, [r4, #0x1a0] + mov r0, #0 + str r1, [r5, #4] + str r0, [r4, #0x1a0] +_02206330: + add r1, sp, #8 + mov r0, r7 + mov r3, r5 + str r6, [sp] + mov r2, #0 + str r2, [sp, #4] + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02206550 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206360: + mov r0, #8 + bl ov00_021EC3A8 + movs r3, r0 + bne _02206388 + ldr r1, _02206570 ; =ov00_02218ED4 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206388: + mov r2, #0 + strb r2, [r3] + strb r2, [r3, #1] + strb r2, [r3, #2] + strb r2, [r3, #3] + strb r2, [r3, #4] + strb r2, [r3, #5] + strb r2, [r3, #6] + strb r2, [r3, #7] + ldr r0, [r6, #0x1c] + add r1, sp, #8 + str r0, [r3] + str r6, [sp] + str r2, [sp, #4] + mov r0, r7 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02206550 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022063DC: + mov r0, #0x204 + bl ov00_021EC3A8 + movs r4, r0 + bne _02206404 + ldr r1, _02206570 ; =ov00_02218ED4 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206404: + mov r1, #0 + mov r2, #0x204 + bl memset + ldr r0, [r6, #0x1c] + add r1, sp, #8 + str r0, [r4] + mov r0, r7 + mov r3, r4 + str r6, [sp] + mov r2, #0 + str r2, [sp, #4] + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02206550 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206448: + mov r0, #0x10 + bl ov00_021EC3A8 + movs r3, r0 + bne _02206470 + ldr r1, _02206570 ; =ov00_02218ED4 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206470: + mov r2, r3 + mov r1, #4 + mov r0, #0 +_0220647C: + strb r0, [r2] + strb r0, [r2, #1] + strb r0, [r2, #2] + strb r0, [r2, #3] + add r2, r2, #4 + subs r1, r1, #1 + bne _0220647C + ldr r0, [r6, #0x1c] + mov r2, #0 + str r0, [r3] + str r2, [r3, #0xc] + str r6, [sp] + add r1, sp, #8 + str r2, [sp, #4] + mov r0, r7 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02206550 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022064D0: + mov r0, #4 + bl ov00_021EC3A8 + movs r3, r0 + bne _022064F8 + ldr r1, _02206570 ; =ov00_02218ED4 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022064F8: + mov r2, #0 + strb r2, [r3] + strb r2, [r3, #1] + strb r2, [r3, #2] + strb r2, [r3, #3] + ldr r0, [r6, #0x1c] + add r1, sp, #8 + str r0, [r3] + str r6, [sp] + str r2, [sp, #4] + mov r0, r7 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02206550 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220653C: + ldr r0, _02206578 ; =ov00_02218EE4 + ldr r1, _02206560 ; =ov00_02218E9C + ldr r2, _02206564 ; =ov00_02218E60 + mov r3, #0x6b + bl __msl_assertion_failed +_02206550: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220655C: .word ov00_02218E88 +_02206560: .word ov00_02218E9C +_02206564: .word ov00_02218E60 +_02206568: .word ov00_02218EAC +_0220656C: .word ov00_02218EC0 +_02206570: .word ov00_02218ED4 +_02206574: .word 0x00000201 +_02206578: .word ov00_02218EE4 + arm_func_end ov00_02206230 + + arm_func_start ov00_0220657C +ov00_0220657C: ; 0x0220657C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r0, #0x24 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldr r4, [r8] + bl ov00_021EC3A8 + cmp r0, #0 + bne _022065B8 + ldr r1, _02206630 ; =ov00_02218ED4 + mov r0, r8 + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022065B8: + str r7, [r0] + ldr r1, [sp, #0x18] + str r6, [r0, #4] + str r1, [r0, #8] + mov r1, #0 + str r1, [r0, #0x14] + cmp r7, #0 + moveq r1, #1 + streq r1, [r0, #0x18] + beq _02206600 + ldr r2, [r4, #0x20c] + add r1, r2, #1 + str r1, [r4, #0x20c] + str r2, [r0, #0x18] + ldr r1, [r4, #0x20c] + cmp r1, #2 + movlt r1, #2 + strlt r1, [r4, #0x20c] +_02206600: + mov r3, #0 + ldr r2, [sp, #0x1c] + str r3, [r0, #0x1c] + ldr r1, [sp, #0x20] + str r2, [r0, #0xc] + str r1, [r0, #0x10] + ldr r1, [r4, #0x424] + str r1, [r0, #0x20] + str r0, [r4, #0x424] + str r0, [r5] + mov r0, r3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02206630: .word ov00_02218ED4 + arm_func_end ov00_0220657C + + arm_func_start ov00_02206634 +ov00_02206634: ; 0x02206634 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + ldr r2, [r0] + cmp r1, #3 + bne _022066A8 + ldr r0, [r2, #0x210] + ldr r5, [r4, #4] + subs r0, r0, #1 + str r0, [r2, #0x210] + bpl _02206674 + ldr r0, _022066C4 ; =ov00_02218EE8 + ldr r1, _022066C8 ; =ov00_02218E9C + ldr r2, _022066CC ; =ov00_02218E4C + mov r3, #0xb6 + bl __msl_assertion_failed +_02206674: + ldr r0, [r5, #4] + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r5, #4] + bl ov00_021FF818 + ldr r0, [r5, #0x18] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #0x18] + ldr r0, [r5, #8] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #8] +_022066A8: + ldr r0, [r4, #4] + bl ov00_021EC3D8 + mov r1, #0 + mov r0, r4 + str r1, [r4, #4] + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022066C4: .word ov00_02218EE8 +_022066C8: .word ov00_02218E9C +_022066CC: .word ov00_02218E4C + arm_func_end ov00_02206634 + + arm_func_start ov00_022066D0 +ov00_022066D0: ; 0x022066D0 + stmdb sp!, {r3, lr} + ldr r3, [r0] + mov ip, #0 + ldr r2, [r3, #0x424] + cmp r2, #0 + ldmeqia sp!, {r3, pc} +_022066E8: + cmp r2, r1 + bne _0220670C + cmp ip, #0 + ldreq r2, [r2, #0x20] + streq r2, [r3, #0x424] + ldrne r2, [r1, #0x20] + strne r2, [ip, #0x20] + bl ov00_02206634 + ldmia sp!, {r3, pc} +_0220670C: + mov ip, r2 + ldr r2, [r2, #0x20] + cmp r2, #0 + bne _022066E8 + ldmia sp!, {r3, pc} + arm_func_end ov00_022066D0 + + arm_func_start ov00_02206720 +ov00_02206720: ; 0x02206720 + ldr r0, [r0] + ldr r3, [r0, #0x424] + cmp r3, #0 + beq _02206758 +_02206730: + ldr r0, [r3, #0x18] + cmp r0, r2 + bne _0220674C + cmp r1, #0 + strne r3, [r1] + mov r0, #1 + bx lr +_0220674C: + ldr r3, [r3, #0x20] + cmp r3, #0 + bne _02206730 +_02206758: + cmp r1, #0 + movne r0, #0 + strne r0, [r1] + mov r0, #0 + bx lr + arm_func_end ov00_02206720 + + arm_func_start ov00_0220676C +ov00_0220676C: ; 0x0220676C + ldr r0, [r0] + ldr r1, [r0, #0x424] + cmp r1, #0 + beq _022067A0 +_0220677C: + ldr r0, [r1, #8] + cmp r0, #0 + ldrne r0, [r1] + cmpne r0, #3 + movne r0, #1 + bxne lr + ldr r1, [r1, #0x20] + cmp r1, #0 + bne _0220677C +_022067A0: + mov r0, #0 + bx lr + arm_func_end ov00_0220676C + + arm_func_start ov00_022067A8 +ov00_022067A8: ; 0x022067A8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r3, [r5] + mov r4, #0 + cmp r3, #4 + addls pc, pc, r3, lsl #2 + b _02206808 +_022067C4: ; jump table + b _022067D8 ; case 0 + b _022067E4 ; case 1 + b _022067F0 ; case 2 + b _02206808 ; case 3 + b _022067FC ; case 4 +_022067D8: + bl ov00_02203A58 + mov r4, r0 + b _02206828 +_022067E4: + bl ov00_02207B8C + mov r4, r0 + b _02206828 +_022067F0: + bl ov00_0220484C + mov r4, r0 + b _02206828 +_022067FC: + bl ov00_0220A244 + mov r4, r0 + b _02206828 +_02206808: + ldr r1, _02206838 ; =ov00_02218F08 + mov r2, r3 + bl ov00_0220A3BC + ldr r0, _0220683C ; =ov00_02218EE4 + ldr r1, _02206840 ; =ov00_02218E9C + ldr r2, _02206844 ; =ov00_02218E74 + ldr r3, _02206848 ; =0x00000146 + bl __msl_assertion_failed +_02206828: + cmp r4, #0 + strne r4, [r5, #0x1c] + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02206838: .word ov00_02218F08 +_0220683C: .word ov00_02218EE4 +_02206840: .word ov00_02218E9C +_02206844: .word ov00_02218E74 +_02206848: .word 0x00000146 + arm_func_end ov00_022067A8 + + arm_func_start ov00_0220684C +ov00_0220684C: ; 0x0220684C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + mov r6, r1 + ldr r2, [r6] + mov r7, r0 + sub r2, r2, #0x65 + ldr r4, [r7] + cmp r2, #3 + addls pc, pc, r2, lsl #2 + b _02206B0C +_02206874: ; jump table + b _02206B20 ; case 0 + b _02206884 ; case 1 + b _02206898 ; case 2 + b _02206A1C ; case 3 +_02206884: + bl ov00_02207610 + cmp r0, #0 + beq _02206B20 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206898: + ldr r1, [r6, #8] + add r2, sp, #0x14 + bl ov00_0220A5A8 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [sp, #0x14] + cmp r0, #4 + bne _022068D4 + ldr r1, _02206B70 ; =ov00_02219008 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022068D4: + cmp r0, #3 + bne _02206B20 + ldr r1, [r6, #0xc] + add r2, sp, #8 + mov r0, r7 + mov r5, #1 + bl ov00_02207DD0 + cmp r0, #0 + bne _02206910 + ldr r1, _02206B70 ; =ov00_02219008 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206910: + ldr r2, _02206B74 ; =ov00_02219024 + mov r0, r7 + add r1, r6, #0x28 + bl ov00_022020EC + ldr r2, _02206B78 ; =ov00_0221902C + mov r0, r7 + add r1, r6, #0x28 + bl ov00_022020EC + ldr r2, [r4, #0x1a0] + mov r0, r7 + add r1, r6, #0x28 + bl ov00_0220211C + ldr r2, _02206B7C ; =ov00_02219034 + mov r0, r7 + add r1, r6, #0x28 + bl ov00_022020EC + mov r0, r7 + add r1, r6, #0x28 + add r2, r4, #0x110 + bl ov00_022020EC + mov r0, r7 + add r1, r6, #0x28 + ldr r2, _02206B80 ; =ov00_0221903C + bl ov00_022020EC + mov r0, r7 + add r1, r6, #0x28 + ldr r2, [sp, #8] + ldr r2, [r2, #0x18] + bl ov00_022020EC + mov r0, r7 + add r1, r6, #0x28 + ldr r2, _02206B84 ; =ov00_02219044 + bl ov00_022020EC + ldr r2, [r4, #0x434] + cmp r2, #0 + beq _022069D4 + ldr r3, [r6, #0xc] + mov r0, #0 +_022069A8: + ldr r1, [r2, #0xc] + cmp r1, r3 + bne _022069C8 + cmp r2, r6 + beq _022069C8 + ldr r1, [r2] + cmp r1, #0x67 + movle r5, r0 +_022069C8: + ldr r2, [r2, #0x3c] + cmp r2, #0 + bne _022069A8 +_022069D4: + cmp r5, #0 + beq _02206A10 + ldr r0, [sp, #8] + ldr r0, [r0, #0x18] + bl ov00_021EC3D8 + ldr r0, [sp, #8] + mov r1, #0 + str r1, [r0, #0x18] + ldr r0, [sp, #8] + bl ov00_02207FB8 + cmp r0, #0 + beq _02206A10 + ldr r1, [sp, #8] + mov r0, r7 + bl ov00_02207E40 +_02206A10: + mov r0, #0x68 + str r0, [r6] + b _02206B20 +_02206A1C: + add r2, sp, #0xc + str r2, [sp] + ldr r1, _02206B88 ; =ov00_0221904C + add r3, sp, #0x10 + str r1, [sp, #4] + ldr r1, [r6, #8] + add r2, r6, #0x18 + bl ov00_02202454 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #0x18] + ldr r1, _02206B84 ; =ov00_02219044 + bl strstr + cmp r0, #0 + beq _02206B20 + mov r1, #0 + strb r1, [r0] + ldr r4, [r6, #0x18] + ldr r1, _02206B8C ; =ov00_02219050 + mov r0, r4 + mov r2, #7 + bl strncmp + cmp r0, #0 + bne _02206AC8 + ldr r0, [r6, #0x14] + add r0, r0, #1 + str r0, [r6, #0x14] + cmp r0, #1 + ble _02206AAC + ldr r1, _02206B90 ; =ov00_02219058 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206AAC: + mov r0, r7 + mov r1, r6 + bl ov00_022075AC + cmp r0, #0 + beq _02206AF8 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206AC8: + ldr r1, _02206B94 ; =ov00_0221907C + mov r0, r4 + mov r2, #6 + bl strncmp + cmp r0, #0 + beq _02206AF8 + ldr r1, _02206B98 ; =ov00_02219084 + mov r0, r7 + bl ov00_0220A890 + add sp, sp, #0x18 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02206AF8: + mov r0, #0x69 + str r0, [r6] + mov r0, #0 + str r0, [r6, #0x20] + b _02206B20 +_02206B0C: + ldr r0, _02206B9C ; =ov00_022190A4 + ldr r1, _02206BA0 ; =ov00_022190A8 + ldr r2, _02206BA4 ; =ov00_02218FE4 + mov r3, #0x9f + bl __msl_assertion_failed +_02206B20: + ldr r0, [r6, #0x30] + cmp r0, #0 + ble _02206B64 + mov r1, #1 + ldr r0, _02206B88 ; =ov00_0221904C + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r6, #8] + add r3, sp, #0xc + mov r0, r7 + add r2, r6, #0x28 + bl ov00_0220267C + ldr r1, [sp, #0xc] + cmp r1, #0 + cmpeq r0, #0 + movne r0, #0x6a + strne r0, [r6] +_02206B64: + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02206B70: .word ov00_02219008 +_02206B74: .word ov00_02219024 +_02206B78: .word ov00_0221902C +_02206B7C: .word ov00_02219034 +_02206B80: .word ov00_0221903C +_02206B84: .word ov00_02219044 +_02206B88: .word ov00_0221904C +_02206B8C: .word ov00_02219050 +_02206B90: .word ov00_02219058 +_02206B94: .word ov00_0221907C +_02206B98: .word ov00_02219084 +_02206B9C: .word ov00_022190A4 +_02206BA0: .word ov00_022190A8 +_02206BA4: .word ov00_02218FE4 + arm_func_end ov00_0220684C + + arm_func_start ov00_02206BA8 +ov00_02206BA8: ; 0x02206BA8 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x184 + mov r5, r1 + ldr r1, [r5] + mov r6, r0 + cmp r1, #0x68 + ldr r4, [r6] + beq _02206BDC + ldr r0, _02206DD4 ; =ov00_022190B4 + ldr r1, _02206DD8 ; =ov00_022190A8 + ldr r2, _02206DDC ; =ov00_02218FC0 + mov r3, #0xc1 + bl __msl_assertion_failed +_02206BDC: + add r1, sp, #8 + ldr r0, _02206DE0 ; =ov00_0221904C + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r5, #8] + add r3, sp, #0xc + mov r0, r6 + add r2, r5, #0x18 + bl ov00_02202454 + cmp r0, #0 + addne sp, sp, #0x184 + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, [sp, #8] + cmp r0, #0 + beq _02206C2C + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206C2C: + ldr r0, [r5, #0x18] + ldr r1, _02206DE4 ; =ov00_02219044 + bl strstr + cmp r0, #0 + beq _02206DC8 + mov r1, #0 + strb r1, [r0] + ldr r7, [r5, #0x18] + ldr r1, _02206DE8 ; =ov00_02219024 + mov r0, r7 + mov r2, #6 + bl strncmp + cmp r0, #0 + bne _02206DAC + ldr r1, _02206DEC ; =ov00_0221902C + add r2, sp, #0x71 + mov r0, r7 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02206C94 + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206C94: + add r0, sp, #0x71 + bl atoi + mov r7, r0 + ldr r0, [r5, #0x18] + ldr r1, _02206DF0 ; =ov00_02219034 + add r2, sp, #0x52 + mov r3, #0x1f + bl ov00_0220A4A0 + cmp r0, #0 + bne _02206CD0 + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206CD0: + ldr r0, [r5, #0x18] + ldr r1, _02206DF4 ; =ov00_0221903C + add r2, sp, #0x31 + mov r3, #0x21 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02206D00 + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206D00: + str r7, [sp] + add r2, r4, #0x77 + ldr r3, [r4, #0x1a0] + ldr r1, _02206DF8 ; =ov00_022190D4 + add r0, sp, #0x81 + add r2, r2, #0x100 + bl sprintf + add r0, sp, #0x81 + bl strlen + mov r1, r0 + add r0, sp, #0x81 + add r2, sp, #0x10 + bl ov00_021FF31C + add r0, sp, #0x31 + add r1, sp, #0x10 + bl strcmp + cmp r0, #0 + beq _02206D7C + ldr r2, _02206DFC ; =ov00_02219050 + mov r0, r6 + add r1, r5, #0x28 + bl ov00_022020EC + ldr r2, _02206DE4 ; =ov00_02219044 + mov r0, r6 + add r1, r5, #0x28 + bl ov00_022020EC + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206D7C: + ldr r2, _02206E00 ; =ov00_0221907C + mov r0, r6 + add r1, r5, #0x28 + bl ov00_022020EC + ldr r2, _02206DE4 ; =ov00_02219044 + mov r0, r6 + add r1, r5, #0x28 + bl ov00_022020EC + mov r0, #0x69 + str r0, [r5] + str r7, [r5, #0xc] + b _02206DC0 +_02206DAC: + mov r0, #0x6a + str r0, [r5] + add sp, sp, #0x184 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_02206DC0: + mov r0, #0 + str r0, [r5, #0x20] +_02206DC8: + mov r0, #0 + add sp, sp, #0x184 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02206DD4: .word ov00_022190B4 +_02206DD8: .word ov00_022190A8 +_02206DDC: .word ov00_02218FC0 +_02206DE0: .word ov00_0221904C +_02206DE4: .word ov00_02219044 +_02206DE8: .word ov00_02219024 +_02206DEC: .word ov00_0221902C +_02206DF0: .word ov00_02219034 +_02206DF4: .word ov00_0221903C +_02206DF8: .word ov00_022190D4 +_02206DFC: .word ov00_02219050 +_02206E00: .word ov00_0221907C + arm_func_end ov00_02206BA8 + + arm_func_start ov00_02206E04 +ov00_02206E04: ; 0x02206E04 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sb, r1 + ldr r1, [sb, #0x30] + mov sl, r0 + cmp r1, #0 + addne sp, sp, #0xc + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sb, #0x38] + bl ArrayLength + cmp r0, #0 + beq _02206EC8 + mov fp, #0 + ldr r5, _02206ED4 ; =ov00_0221904C + mov r8, fp + mov r6, fp + add r4, sp, #8 +_02206E4C: + ldr r0, [sb, #0x38] + mov r1, r8 + bl ov00_021FE6EC + mov r7, r0 + str r6, [sp] + str r5, [sp, #4] + ldr r1, [sb, #8] + mov r0, sl + mov r2, r7 + mov r3, r4 + bl ov00_0220267C + ldr r1, [sp, #8] + cmp r1, #0 + cmpeq r0, #0 + beq _02206E9C + mov r0, #0x6a + str r0, [sb] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02206E9C: + ldr r1, [r7, #0xc] + ldr r0, [r7, #8] + cmp r1, r0 + bne _02206EC8 + ldr r0, [sb, #0x38] + mov r1, fp + bl ov00_021FE968 + ldr r0, [sb, #0x38] + bl ArrayLength + cmp r0, #0 + bne _02206E4C +_02206EC8: + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02206ED4: .word ov00_0221904C + arm_func_end ov00_02206E04 + + arm_func_start ov00_02206ED8 +ov00_02206ED8: ; 0x02206ED8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov r8, r1 + ldr r1, [r8, #0x30] + mov sb, r0 + cmp r1, #0 + ldr r7, [sb] + beq _02206F3C + mov r2, #1 + str r2, [sp] + ldr r1, _0220714C ; =ov00_0221904C + add r3, sp, #0x1c + str r1, [sp, #4] + ldr r1, [r8, #8] + add r2, r8, #0x28 + bl ov00_0220267C + ldr r1, [sp, #0x1c] + cmp r1, #0 + cmpeq r0, #0 + beq _02206F3C + mov r0, #0x6a + str r0, [r8] + add sp, sp, #0x24 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02206F3C: + ldr r0, [r8, #0x30] + cmp r0, #0 + bne _02206F74 + mov r0, sb + mov r1, r8 + bl ov00_02206E04 + cmp r0, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r8] + cmp r0, #0x6a + addeq sp, sp, #0x24 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02206F74: + add r1, sp, #0x1c + ldr r0, _0220714C ; =ov00_0221904C + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r8, #8] + add r3, sp, #0x20 + mov r0, sb + add r2, r8, #0x18 + bl ov00_02202454 + cmp r0, #0 + beq _02206FB4 + mov r0, #0x6a + str r0, [r8] + add sp, sp, #0x24 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02206FB4: + ldr r0, [sp, #0x20] + cmp r0, #0 + ble _02206FD0 + mov r0, #0 + bl ov00_021FFA70 + add r0, r0, #0x12c + str r0, [r8, #0x10] +_02206FD0: + mov r4, #0 + mov sl, #2 + add fp, sp, #0x14 + add r6, sp, #8 +_02206FE0: + mov r0, sb + add r1, r8, #0x18 + add r2, sp, #0x10 + add r3, sp, #0xc + str r6, [sp] + bl ov00_022027FC + cmp r0, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #0x10] + cmp r1, #0 + beq _02207124 + ldr r2, [sp, #0xc] + cmp r2, #0x66 + bgt _0220702C + bge _022070E4 + cmp r2, #1 + beq _02207060 + b _02207118 +_0220702C: + sub r0, r2, #0xc8 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _02207118 +_0220703C: ; jump table + b _022070FC ; case 0 + b _022070FC ; case 1 + b _022070FC ; case 2 + b _022070FC ; case 3 + b _022070FC ; case 4 + b _022070FC ; case 5 + b _022070FC ; case 6 + b _022070FC ; case 7 + b _022070FC ; case 8 +_02207060: + ldr r1, [r7, #0x1bc] + ldr r0, [r7, #0x1c0] + str r1, [sp, #0x14] + str r0, [sp, #0x18] + cmp r1, #0 + beq _02207118 + mov r0, #0xc + bl ov00_021EC3A8 + movs r5, r0 + bne _022070A0 + ldr r1, _02207150 ; =ov00_022190DC + mov r0, sb + bl ov00_0220A890 + add sp, sp, #0x24 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022070A0: + ldr r0, [r8, #0xc] + str r0, [r5] + ldr r0, [sp, #0x10] + bl ov00_021FF3D4 + str r0, [r5, #8] + mov r0, #0 + bl ov00_021FFA70 + str r0, [r5, #4] + mov r3, r5 + mov r0, sb + stmia sp, {r4, sl} + ldmia fp, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02207118 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022070E4: + ldr r1, [r8, #0xc] + ldr r3, _02207154 ; =ov00_022190EC + mov r0, sb + mov r2, #0x67 + bl ov00_02201BC4 + b _02207118 +_022070FC: + str r1, [sp] + ldr r1, [sp, #8] + mov r0, sb + str r1, [sp, #4] + mov r1, r8 + ldr r3, [r8, #0x18] + bl ov00_0220A1C0 +_02207118: + mov r0, sb + add r1, r8, #0x18 + bl ov00_02202938 +_02207124: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _02206FE0 + ldr r0, [sp, #0x1c] + cmp r0, #0 + movne r0, #0x6a + strne r0, [r8] + mov r0, #0 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0220714C: .word ov00_0221904C +_02207150: .word ov00_022190DC +_02207154: .word ov00_022190EC + arm_func_end ov00_02206ED8 + + arm_func_start ov00_02207158 +ov00_02207158: ; 0x02207158 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r1, [r5] + mov r6, r0 + cmp r1, #0x64 + mov r4, #0 + bne _02207188 + ldr r0, _022071E4 ; =ov00_022190F0 + ldr r1, _022071E8 ; =ov00_022190A8 + ldr r2, _022071EC ; =ov00_02218F60 + ldr r3, _022071F0 ; =0x000001D9 + bl __msl_assertion_failed +_02207188: + ldr r0, [r5] + cmp r0, #0x69 + beq _022071BC + ldr r0, [r5, #4] + mov r1, r5 + cmp r0, #0 + mov r0, r6 + beq _022071B4 + bl ov00_0220684C + mov r4, r0 + b _022071BC +_022071B4: + bl ov00_02206BA8 + mov r4, r0 +_022071BC: + cmp r4, #0 + ldreq r0, [r5] + cmpeq r0, #0x69 + bne _022071DC + mov r0, r6 + mov r1, r5 + bl ov00_02206ED8 + mov r4, r0 +_022071DC: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022071E4: .word ov00_022190F0 +_022071E8: .word ov00_022190A8 +_022071EC: .word ov00_02218F60 +_022071F0: .word 0x000001D9 + arm_func_end ov00_02207158 + + arm_func_start ov00_022071F4 +ov00_022071F4: ; 0x022071F4 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r0, [r4, #8] + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4, #8] + bl ov00_021FF818 + ldr r0, [r4, #0x18] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x18] + ldr r0, [r4, #0x28] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x28] + ldr r0, [r4, #0x38] + cmp r0, #0 + beq _02207248 + bl ov00_021FE678 + mov r0, #0 + str r0, [r4, #0x38] +_02207248: + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + arm_func_end ov00_022071F4 + + arm_func_start ov00_02207254 +ov00_02207254: ; 0x02207254 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + movs r4, r1 + ldr r6, [r5] + bne _0220727C + ldr r0, _02207354 ; =ov00_02219118 + ldr r1, _02207358 ; =ov00_022190A8 + ldr r2, _0220735C ; =ov00_02218F50 + ldr r3, _02207360 ; =0x00000213 + bl __msl_assertion_failed +_0220727C: + ldr r1, [r6, #0x434] + cmp r1, r4 + ldreq r0, [r4, #0x3c] + streq r0, [r6, #0x434] + beq _022072E0 + ldr r0, [r1, #0x3c] + cmp r0, r4 + beq _022072D8 +_0220729C: + cmp r0, #0 + bne _022072C8 + ldr r0, _02207364 ; =ov00_022190A4 + ldr r1, _02207358 ; =ov00_022190A8 + ldr r2, _0220735C ; =ov00_02218F50 + ldr r3, _02207368 ; =0x00000225 + bl __msl_assertion_failed + ldr r1, _0220736C ; =ov00_02219128 + mov r0, r5 + bl ov00_0220A3BC + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022072C8: + mov r1, r0 + ldr r0, [r0, #0x3c] + cmp r0, r4 + bne _0220729C +_022072D8: + ldr r0, [r4, #0x3c] + str r0, [r1, #0x3c] +_022072E0: + ldr r0, [r4, #0x38] + bl ArrayLength + cmp r0, #0 + beq _02207344 + mov r6, #0 + mov r7, r6 +_022072F8: + ldr r0, [r4, #0x38] + mov r1, r7 + bl ov00_021FE6EC + ldr r2, [r0, #0x10] + cmp r2, #0x64 + bge _02207328 + ldr ip, [r0] + ldr r3, [r0, #0x14] + ldr r1, [r4, #0xc] + mov r0, r5 + add r3, ip, r3 + bl ov00_02201AE8 +_02207328: + ldr r0, [r4, #0x38] + mov r1, r6 + bl ov00_021FE968 + ldr r0, [r4, #0x38] + bl ArrayLength + cmp r0, #0 + bne _022072F8 +_02207344: + mov r0, r5 + mov r1, r4 + bl ov00_022071F4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02207354: .word ov00_02219118 +_02207358: .word ov00_022190A8 +_0220735C: .word ov00_02218F50 +_02207360: .word 0x00000213 +_02207364: .word ov00_022190A4 +_02207368: .word 0x00000225 +_0220736C: .word ov00_02219128 + arm_func_end ov00_02207254 + + arm_func_start ov00_02207370 +ov00_02207370: ; 0x02207370 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, #0x4000 + bl ov00_021FF48C + mov r0, r4 + mov r1, #0x8000 + bl ov00_021FF48C + mov r0, r4 + mov r1, #0x10000 + bl ov00_021FF48C + mov r0, r4 + mov r1, #0x20000 + bl ov00_021FF48C + mov r0, r4 + mov r1, #0x40000 + bl ov00_021FF48C + mov r0, r4 + mov r1, #0x4000 + bl ov00_021FF4D0 + mov r0, r4 + mov r1, #0x8000 + bl ov00_021FF4D0 + mov r0, r4 + mov r1, #0x10000 + bl ov00_021FF4D0 + mov r0, r4 + bl ov00_021FF510 + mov r0, r4 + bl ov00_021FF558 + ldmia sp!, {r4, pc} + arm_func_end ov00_02207370 + + arm_func_start ov00_022073E8 +ov00_022073E8: ; 0x022073E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldr r7, [r4] + mvn r1, #0 + ldr r0, [r7, #0x204] + cmp r0, r1 + beq _02207470 + bl ov00_021FF694 + cmp r0, #0 + beq _02207470 + mov r1, #0 + ldr r0, [r7, #0x204] + mov r2, r1 + bl ov00_021FF900 + mov r6, r0 + mvn r1, #0 + cmp r6, r1 + beq _02207470 + mov r0, r4 + mov r2, #0 + bl ov00_0220752C + movs r5, r0 + beq _02207468 + mov r0, #0x68 + str r0, [r5] + mov r0, r6 + str r6, [r5, #8] + mov r1, #0 + bl ov00_021FF44C + ldr r0, [r5, #8] + bl ov00_02207370 + b _02207470 +_02207468: + mov r0, r6 + bl ov00_021FF818 +_02207470: + ldr r7, [r7, #0x434] + cmp r7, #0 + beq _022074D0 + mov r5, #0 +_02207480: + mov r0, r4 + mov r1, r7 + ldr r6, [r7, #0x3c] + bl ov00_02207158 + ldr r1, [r7] + cmp r1, #0x6a + beq _022074B8 + cmp r0, #0 + bne _022074B8 + mov r0, r5 + bl ov00_021FFA70 + ldr r1, [r7, #0x10] + cmp r0, r1 + ble _022074C4 +_022074B8: + mov r0, r4 + mov r1, r7 + bl ov00_02207254 +_022074C4: + mov r7, r6 + cmp r6, #0 + bne _02207480 +_022074D0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_022073E8 + + arm_func_start ov00_022074D8 +ov00_022074D8: ; 0x022074D8 + ldr r0, [r0] + ldr r0, [r0, #0x434] + cmp r0, #0 + beq _02207508 +_022074E8: + ldr r2, [r0, #0xc] + cmp r2, r1 + ldreq r2, [r0] + cmpeq r2, #0x69 + bxeq lr + ldr r0, [r0, #0x3c] + cmp r0, #0 + bne _022074E8 +_02207508: + mov r0, #0 + bx lr + arm_func_end ov00_022074D8 + + arm_func_start ov00_02207510 +ov00_02207510: ; 0x02207510 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4] + ldmia sp!, {r4, pc} + arm_func_end ov00_02207510 + + arm_func_start ov00_0220752C +ov00_0220752C: ; 0x0220752C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, [r0] + mov r0, #0x40 + mov r7, r1 + mov r6, r2 + bl ov00_021EC3A8 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, #0 + mov r2, #0x40 + bl memset + mov r0, #0x64 + stmia r4, {r0, r6} + sub r0, r0, #0x65 + str r0, [r4, #8] + mov r0, #0 + str r7, [r4, #0xc] + bl ov00_021FFA70 + add r0, r0, #0x12c + str r0, [r4, #0x10] + ldr r3, [r5, #0x434] + ldr r2, _022075A8 ; =ov00_02207510 + mov r0, #0x18 + mov r1, #0 + str r3, [r4, #0x3c] + bl ov00_021FE5B4 + str r0, [r4, #0x38] + mov r0, r4 + str r4, [r5, #0x434] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022075A8: .word ov00_02207510 + arm_func_end ov00_0220752C + + arm_func_start ov00_022075AC +ov00_022075AC: ; 0x022075AC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r2, #0 + str r2, [sp] + mov r4, r1 + str r2, [sp, #4] + add r3, sp, #0xc + mov r1, #2 + mov r5, r0 + str r2, [sp, #8] + bl ov00_0220657C + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [sp, #0xc] + ldr r1, [r4, #0xc] + ldr r2, [r0, #0x18] + mov r0, r5 + bl ov00_02205E50 + cmp r0, #0 + moveq r0, #0x65 + streq r0, [r4] + moveq r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_022075AC + + arm_func_start ov00_02207610 +ov00_02207610: ; 0x02207610 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r4, r1 + ldr r1, [r4, #0xc] + add r2, sp, #0 + mov r5, r0 + bl ov00_02207DD0 + cmp r0, #0 + bne _0220764C + ldr r1, _0220778C ; =ov00_02219008 + mov r0, r5 + bl ov00_0220A890 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r4, r5, pc} +_0220764C: + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4, #8] + cmp r0, r1 + bne _02207698 + ldr r2, _02207790 ; =ov00_0221914C + mov r0, r5 + mov r1, #5 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #0 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r4, r5, pc} +_02207698: + mov r1, #0 + bl ov00_021FF44C + cmp r0, #0 + bne _022076D4 + ldr r2, _02207794 ; =ov00_02219174 + mov r0, r5 + mov r1, #5 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #0 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r4, r5, pc} +_022076D4: + ldr r0, [r4, #8] + bl ov00_02207370 + add r1, sp, #4 + mov r2, #0 + ldr r3, [sp] + str r2, [r1] + mov r0, #2 + str r2, [r1, #4] + strb r0, [sp, #5] + ldr r0, [r3, #8] + mov r2, #8 + ldr r0, [r0, #0x10] + str r0, [sp, #8] + ldr r0, [r3, #8] + ldr r0, [r0, #0x14] + strh r0, [sp, #6] + ldr r0, [r4, #8] + bl ov00_021FF8A0 + mvn r1, #0 + cmp r0, r1 + bne _02207778 + ldr r0, [r4, #8] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + beq _02207778 + ldr r2, _02207798 ; =ov00_022191A8 + mov r0, r5 + mov r1, #5 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r4, r5, pc} +_02207778: + mov r0, #0x67 + str r0, [r4] + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0220778C: .word ov00_02219008 +_02207790: .word ov00_0221914C +_02207794: .word ov00_02219174 +_02207798: .word ov00_022191A8 + arm_func_end ov00_02207610 + + arm_func_start ov00_0220779C +ov00_0220779C: ; 0x0220779C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x18 + movs r7, r1 + mov r8, r0 + mov r6, r2 + mov r5, r3 + bne _022077CC + ldr r0, _0220790C ; =ov00_02219118 + ldr r1, _02207910 ; =ov00_022190A8 + ldr r2, _02207914 ; =ov00_02218F70 + mov r3, #0x340 + bl __msl_assertion_failed +_022077CC: + cmp r5, #0 + bne _022077E8 + ldr r0, _02207918 ; =ov00_022191D0 + ldr r1, _02207910 ; =ov00_022190A8 + ldr r2, _02207914 ; =ov00_02218F70 + ldr r3, _0220791C ; =0x00000341 + bl __msl_assertion_failed +_022077E8: + mov r0, r5 + bl strlen + mov r4, r0 + add r1, sp, #0 + mov r3, #0 + str r3, [r1, #0x10] + ldr r2, _02207920 ; =ov00_022191E0 + mov r0, r8 + str r3, [r1] + str r3, [r1, #4] + str r3, [r1, #8] + str r3, [r1, #0xc] + str r3, [r1, #0x14] + str r6, [sp, #0x10] + bl ov00_022020EC + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + add r1, sp, #0 + mov r0, r8 + mov r2, r6 + bl ov00_0220211C + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _02207924 ; =ov00_022191E4 + add r1, sp, #0 + mov r0, r8 + bl ov00_022020EC + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + add r1, sp, #0 + mov r0, r8 + mov r2, r4 + bl ov00_0220211C + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _02207928 ; =ov00_022191EC + add r1, sp, #0 + mov r0, r8 + bl ov00_022020EC + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr ip, [sp, #8] + add r1, sp, #0 + mov r0, r8 + mov r2, r5 + mov r3, r4 + str ip, [sp, #0x14] + bl ov00_02201FE0 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + add r1, sp, #0 + mov r0, r8 + mov r2, #0 + bl ov00_02201F48 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r7, #0x38] + add r1, sp, #0 + bl ov00_021FE754 + mov r0, #0 + bl ov00_021FFA70 + add r0, r0, #0x12c + str r0, [r7, #0x10] + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220790C: .word ov00_02219118 +_02207910: .word ov00_022190A8 +_02207914: .word ov00_02218F70 +_02207918: .word ov00_022191D0 +_0220791C: .word 0x00000341 +_02207920: .word ov00_022191E0 +_02207924: .word ov00_022191E4 +_02207928: .word ov00_022191EC + arm_func_end ov00_0220779C + + arm_func_start ov00_0220792C +ov00_0220792C: ; 0x0220792C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x48 + mov sb, r0 + mov r8, r1 + mov r7, r2 + cmp r3, #0 + ldr r5, [r3] + ldmib r3, {r4, r6} + bne _02207964 + ldr r0, _02207994 ; =ov00_022191F4 + ldr r1, _02207998 ; =ov00_022190A8 + ldr r2, _0220799C ; =ov00_02218F84 + ldr r3, _022079A0 ; =0x00000376 + bl __msl_assertion_failed +_02207964: + ldr r1, _022079A4 ; =ov00_02219200 + add r0, sp, #8 + mov r2, r7 + mov r3, r5 + stmia sp, {r4, r6} + bl sprintf + add r2, sp, #8 + mov r0, sb + mov r1, r8 + bl ov00_02202424 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02207994: .word ov00_022191F4 +_02207998: .word ov00_022190A8 +_0220799C: .word ov00_02218F84 +_022079A0: .word 0x00000376 +_022079A4: .word ov00_02219200 + arm_func_end ov00_0220792C + + arm_func_start ov00_022079A8 +ov00_022079A8: ; 0x022079A8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x20 + movs r6, r1 + mov r7, r0 + mov r5, r2 + mov r4, r3 + bne _022079D8 + ldr r0, _02207A7C ; =ov00_02219118 + ldr r1, _02207A80 ; =ov00_022190A8 + ldr r2, _02207A84 ; =ov00_02218FA0 + ldr r3, _02207A88 ; =0x00000389 + bl __msl_assertion_failed +_022079D8: + mvn r0, #0 + cmp r5, #0 + ldreq r5, _02207A8C ; =ov00_02219214 + cmp r4, r0 + bne _022079F8 + mov r0, r5 + bl strlen + mov r4, r0 +_022079F8: + ldr r1, _02207A90 ; =ov00_02219218 + add r0, sp, #0 + mov r2, r4 + bl sprintf + add r2, sp, #0 + mov r0, r7 + mov r1, r6 + bl ov00_02202424 + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov00_02202324 + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + mov r1, r6 + mov r2, #0 + bl ov00_02202244 + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + bl ov00_021FFA70 + add r0, r0, #0x12c + str r0, [r6, #0x10] + mov r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02207A7C: .word ov00_02219118 +_02207A80: .word ov00_022190A8 +_02207A84: .word ov00_02218FA0 +_02207A88: .word 0x00000389 +_02207A8C: .word ov00_02219214 +_02207A90: .word ov00_02219218 + arm_func_end ov00_022079A8 + + arm_func_start ov00_02207A94 +ov00_02207A94: ; 0x02207A94 + stmdb sp!, {r3, lr} + ldr r0, [r0] + bl _s32_div_f + mov r0, r1 + ldmia sp!, {r3, pc} + arm_func_end ov00_02207A94 + + arm_func_start ov00_02207AA8 +ov00_02207AA8: ; 0x02207AA8 + ldr r2, [r0] + ldr r0, [r1] + sub r0, r2, r0 + bx lr + arm_func_end ov00_02207AA8 + + arm_func_start ov00_02207AB8 +ov00_02207AB8: ; 0x02207AB8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + cmp r0, #0 + beq _02207B08 + ldr r0, [r0, #8] + bl ov00_021EC3D8 + ldr r0, [r4, #8] + mov r1, #0 + str r1, [r0, #8] + ldr r0, [r4, #8] + ldr r0, [r0, #0xc] + bl ov00_021EC3D8 + ldr r0, [r4, #8] + mov r1, #0 + str r1, [r0, #0xc] + ldr r0, [r4, #8] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #8] +_02207B08: + mov r0, r4 + bl ov00_02206164 + ldr r0, [r4, #0x10] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x10] + ldr r0, [r4, #0x18] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x18] + ldmia sp!, {r4, pc} + arm_func_end ov00_02207AB8 + + arm_func_start ov00_02207B34 +ov00_02207B34: ; 0x02207B34 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r4, [r0] + mov r0, #0 + str r0, [r4, #0x430] + str r0, [r4, #0x42c] + ldr ip, _02207B80 ; =ov00_02207AB8 + ldr r2, _02207B84 ; =ov00_02207A94 + ldr r3, _02207B88 ; =ov00_02207AA8 + mov r0, #0x1c + mov r1, #4 + str ip, [sp] + bl ov00_021FED24 + str r0, [r4, #0x428] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02207B80: .word ov00_02207AB8 +_02207B84: .word ov00_02207A94 +_02207B88: .word ov00_02207AA8 + arm_func_end ov00_02207B34 + + arm_func_start ov00_02207B8C +ov00_02207B8C: ; 0x02207B8C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x20 + mov r6, r2 + mov r4, r1 + mov r1, r6 + mov r2, #1 + mov r5, r0 + bl ov00_0220A3C8 + cmp r0, #0 + addne sp, sp, #0x20 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _02207CDC ; =ov00_0221923C + mov r0, r6 + mov r2, #5 + bl strncmp + cmp r0, #0 + beq _02207C00 + ldr r2, _02207CE0 ; =ov00_02219244 + mov r0, r5 + mov r1, #1 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x20 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_02207C00: + ldr r1, _02207CE4 ; =ov00_02219274 + add r2, sp, #0x10 + mov r0, r6 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + bne _02207C48 + ldr r2, _02207CE0 ; =ov00_02219244 + mov r0, r5 + mov r1, #1 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x20 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_02207C48: + add r0, sp, #0x10 + bl atoi + ldr r2, [r4, #0xc] + ldr r1, [r4, #0x10] + mov r6, r0 + str r2, [sp, #8] + str r1, [sp, #0xc] + cmp r2, #0 + beq _02207CC4 + mov r0, #8 + bl ov00_021EC3A8 + movs r3, r0 + bne _02207C94 + ldr r1, _02207CE8 ; =ov00_02219280 + mov r0, r5 + bl ov00_0220A890 + add sp, sp, #0x20 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_02207C94: + str r6, [r3, #4] + mov r2, #0 + str r2, [r3] + str r4, [sp] + add r1, sp, #8 + str r2, [sp, #4] + mov r0, r5 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r4, r5, r6, pc} +_02207CC4: + mov r0, r5 + mov r1, r4 + bl ov00_022066D0 + mov r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02207CDC: .word ov00_0221923C +_02207CE0: .word ov00_02219244 +_02207CE4: .word ov00_02219274 +_02207CE8: .word ov00_02219280 + arm_func_end ov00_02207B8C + + arm_func_start ov00_02207CEC +ov00_02207CEC: ; 0x02207CEC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x20 + mov r6, r0 + mov r5, r1 + cmp r5, #0 + ldr r4, [r6] + bgt _02207D1C + ldr r0, _02207DC0 ; =ov00_02219290 + ldr r1, _02207DC4 ; =ov00_02219298 + ldr r2, _02207DC8 ; =ov00_02219228 + ldr r3, _02207DCC ; =0x000002B5 + bl __msl_assertion_failed +_02207D1C: + cmp r5, #0 + addle sp, sp, #0x20 + movle r0, #0 + ldmleia sp!, {r4, r5, r6, pc} + add r2, sp, #0 + mov r0, r6 + mov r1, r5 + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp] + addne sp, sp, #0x20 + ldmneia sp!, {r4, r5, r6, pc} + add r1, sp, #4 + mov r0, #0 + str r0, [r1] + str r0, [r1, #4] + str r0, [r1, #0xc] + str r0, [r1, #0x10] + str r0, [r1, #0x14] + str r0, [r1, #0x18] + str r5, [sp, #4] + str r0, [r1, #8] + str r0, [sp, #8] + str r0, [sp, #0x10] + str r0, [sp, #0x14] + str r0, [sp, #0x1c] + str r0, [sp, #0x18] + ldr r0, [r4, #0x428] + bl ov00_021FEF74 + ldr r0, [r4, #0x42c] + add r2, sp, #0 + add r3, r0, #1 + mov r0, r6 + mov r1, r5 + str r3, [r4, #0x42c] + bl ov00_02207DD0 + cmp r0, #0 + ldrne r0, [sp] + moveq r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02207DC0: .word ov00_02219290 +_02207DC4: .word ov00_02219298 +_02207DC8: .word ov00_02219228 +_02207DCC: .word 0x000002B5 + arm_func_end ov00_02207CEC + + arm_func_start ov00_02207DD0 +ov00_02207DD0: ; 0x02207DD0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + ldr r0, [r0] + mov r4, r2 + str r1, [sp] + ldr r0, [r0, #0x428] + add r1, sp, #0 + bl ov00_021FF0C0 + cmp r4, #0 + strne r0, [r4] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_02207DD0 + + arm_func_start ov00_02207E0C +ov00_02207E0C: ; 0x02207E0C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + add r2, sp, #0 + ldr r4, [r0] + bl ov00_02207DD0 + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [r4, #0x428] + ldr r1, [sp] + bl ov00_021FF01C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_02207E0C + + arm_func_start ov00_02207E40 +ov00_02207E40: ; 0x02207E40 + ldr r0, [r0] + ldr ip, _02207E50 ; =ov00_021FF01C + ldr r0, [r0, #0x428] + bx ip + .balign 4, 0 +_02207E50: .word ov00_021FF01C + arm_func_end ov00_02207E40 + + arm_func_start ov00_02207E54 +ov00_02207E54: ; 0x02207E54 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + ldr r4, [r6, #0xc] + mov r5, r2 + cmp r4, #0 + beq _02207EAC + ldr r0, [r5] + ldr r1, [r4] + bl strcmp + cmp r0, #0 + bne _02207EAC + ldr r0, [r5, #4] + ldr r1, [r4, #8] + bl strcmp + cmp r0, #0 + bne _02207EAC + ldr r1, [r5, #8] + mov r0, #1 + str r6, [r1] + str r0, [r5, #0xc] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_02207EAC: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02207E54 + + arm_func_start ov00_02207EB4 +ov00_02207EB4: ; 0x02207EB4 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + str r1, [sp] + mov ip, #0 + str r2, [sp, #4] + mov r4, r3 + ldr r1, _02207EFC ; =ov00_02207E54 + add r2, sp, #0 + str ip, [sp, #0xc] + str r4, [sp, #8] + bl ov00_02207F1C + ldr r0, [sp, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r4] + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02207EFC: .word ov00_02207E54 + arm_func_end ov00_02207EB4 + + arm_func_start ov00_02207F00 +ov00_02207F00: ; 0x02207F00 + stmdb sp!, {r3, lr} + mov ip, r0 + ldr r2, [r1, #8] + ldmia r1, {r0, r3} + mov r1, ip + blx r3 + ldmia sp!, {r3, pc} + arm_func_end ov00_02207F00 + + arm_func_start ov00_02207F1C +ov00_02207F1C: ; 0x02207F1C + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r3, [r0] + str r1, [sp, #4] + str r2, [sp, #8] + str r0, [sp] + ldr r0, [r3, #0x428] + ldr r1, _02207F58 ; =ov00_02207F00 + add r2, sp, #0 + bl ov00_021FF264 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_02207F58: .word ov00_02207F00 + arm_func_end ov00_02207F1C + + arm_func_start ov00_02207F5C +ov00_02207F5C: ; 0x02207F5C + ldr r0, [r1, #8] + cmp r0, #0 + beq _02207F80 + ldr r3, [r2] + ldr r0, [r0] + cmp r3, r0 + streq r1, [r2, #4] + moveq r0, #0 + bxeq lr +_02207F80: + mov r0, #1 + bx lr + arm_func_end ov00_02207F5C + + arm_func_start ov00_02207F88 +ov00_02207F88: ; 0x02207F88 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + str r1, [sp] + mov r3, #0 + ldr r1, _02207FB4 ; =ov00_02207F5C + add r2, sp, #0 + str r3, [sp, #4] + bl ov00_02207F1C + ldr r0, [sp, #4] + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02207FB4: .word ov00_02207F5C + arm_func_end ov00_02207F88 + + arm_func_start ov00_02207FB8 +ov00_02207FB8: ; 0x02207FB8 + cmp r0, #0 + beq _02207FE8 + ldr r1, [r0, #0xc] + cmp r1, #0 + ldreq r1, [r0, #8] + cmpeq r1, #0 + ldreq r1, [r0, #0x18] + cmpeq r1, #0 + ldreq r0, [r0, #0x10] + cmpeq r0, #0 + moveq r0, #1 + bxeq lr +_02207FE8: + mov r0, #0 + bx lr + arm_func_end ov00_02207FB8 + + arm_func_start ov00_02207FF0 +ov00_02207FF0: ; 0x02207FF0 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r1 + ldr r4, [r5, #4] + mov r1, #0x1000 + mov r6, r0 + add r0, r1, #1 + str r1, [r4, #0xc] + bl ov00_021EC3A8 + str r0, [r4, #8] + cmp r0, #0 + bne _02208038 + ldr r1, _022081C8 ; =ov00_02219328 + mov r0, r6 + bl ov00_0220A890 + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_02208038: + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4, #4] + cmp r0, r1 + bne _02208084 + ldr r2, _022081CC ; =ov00_02219338 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_02208084: + mov r1, #0 + bl ov00_021FF44C + cmp r0, #0 + bne _022080C0 + ldr r2, _022081D0 ; =ov00_02219360 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_022080C0: + ldr r0, _022081D4 ; =ov00_022192E8 + bl SOC_GetHostByName + cmp r0, #0 + bne _022080FC + ldr r2, _022081D8 ; =ov00_02219394 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_022080FC: + add r3, sp, #0 + mov r2, #0 + str r2, [r3] + mov r1, #2 + str r2, [r3, #4] + strb r1, [sp, #1] + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [sp, #4] + cmp r0, #0 + bne _02208140 + ldr r0, _022081DC ; =ov00_022193C4 + ldr r1, _022081E0 ; =ov00_022193E4 + ldr r2, _022081E4 ; =ov00_022192D0 + mov r3, #0x59 + bl __msl_assertion_failed +_02208140: + ldr r0, _022081E8 ; =0x0000CD74 + add r1, sp, #0 + strh r0, [sp, #2] + ldr r0, [r4, #4] + mov r2, #8 + bl ov00_021FF8A0 + mvn r1, #0 + cmp r0, r1 + bne _022081B4 + ldr r0, [r4, #4] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + beq _022081B4 + ldr r2, _022081EC ; =ov00_022193F0 + mov r0, r6 + mov r1, #5 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_022081B4: + mov r0, #1 + str r0, [r5, #0x14] + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022081C8: .word ov00_02219328 +_022081CC: .word ov00_02219338 +_022081D0: .word ov00_02219360 +_022081D4: .word ov00_022192E8 +_022081D8: .word ov00_02219394 +_022081DC: .word ov00_022193C4 +_022081E0: .word ov00_022193E4 +_022081E4: .word ov00_022192D0 +_022081E8: .word 0x0000CD74 +_022081EC: .word ov00_022193F0 + arm_func_end ov00_02207FF0 + + arm_func_start ov00_022081F0 +ov00_022081F0: ; 0x022081F0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0x144 + mov r6, r1 + mov r5, r2 + bl ov00_021EC3A8 + movs r4, r0 + bne _02208224 + ldr r1, _0220829C ; =ov00_02219328 + mov r0, r7 + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02208224: + mov r1, #0 + mov r2, #0x144 + bl memset + str r5, [r4] + mvn r0, #0 + str r0, [r4, #4] + mov r0, #0 + str r0, [r4, #8] + str r0, [r4, #0x10] + str r0, [r4, #0x14] + str r0, [r4, #0xc] + str r0, [r4, #0x20] + mov r1, #0x1000 + str r0, [r4, #0x24] + add r0, r1, #1 + str r1, [r4, #0x1c] + bl ov00_021EC3A8 + str r0, [r4, #0x18] + cmp r0, #0 + bne _02208288 + ldr r1, _0220829C ; =ov00_02219328 + mov r0, r7 + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02208288: + mov r0, #0 + str r0, [r4, #0x13c] + str r0, [r4, #0x140] + str r4, [r6] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220829C: .word ov00_02219328 + arm_func_end ov00_022081F0 + + arm_func_start ov00_022082A0 +ov00_022082A0: ; 0x022082A0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r5, r0 + ldr r4, [r5] + ldr ip, [sp, #0x20] + ldr lr, [r4, #0x210] + add lr, lr, #1 + str lr, [r4, #0x210] + stmia sp, {r2, r3} + mov r2, r1 + add r3, sp, #0xc + mov r1, #3 + str ip, [sp, #8] + bl ov00_0220657C + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [sp, #0xc] + mov r0, r5 + bl ov00_02207FF0 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [sp, #0xc] + ldr r0, [r1, #8] + cmp r0, #0 + beq _02208324 + ldr r1, [r1, #0x18] + mov r0, r5 + bl ov00_02200ED8 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} +_02208324: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_022082A0 + + arm_func_start ov00_02208330 +ov00_02208330: ; 0x02208330 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + movs r8, r1 + mov sb, r0 + ldrnesb r0, [r8] + mov r7, r2 + mov r6, r3 + ldr r5, [sp, #0x28] + ldr r4, [sp, #0x2c] + cmpne r0, #0 + bne _022083C0 + cmp r6, #0 + ldrnesb r0, [r6] + cmpne r0, #0 + bne _022083C0 + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + bne _022083C0 + cmp r4, #0 + ldrnesb r0, [r4] + cmpne r0, #0 + bne _022083C0 + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _022083C0 + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + bne _022083C0 + ldr r1, _02208518 ; =ov00_02219418 + mov r0, sb + bl ov00_0220A890 + add sp, sp, #8 + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022083C0: + add r1, sp, #4 + mov r0, sb + mov r2, #1 + bl ov00_022081F0 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r8, #0 + bne _022083F4 + ldr r0, [sp, #4] + mov r1, #0 + strb r1, [r0, #0x28] + b _02208408 +_022083F4: + ldr r0, [sp, #4] + mov r1, r8 + add r0, r0, #0x28 + mov r2, #0x1f + bl ov00_0220A348 +_02208408: + cmp r7, #0 + bne _02208420 + ldr r0, [sp, #4] + mov r1, #0 + strb r1, [r0, #0x47] + b _02208434 +_02208420: + ldr r0, [sp, #4] + mov r1, r7 + add r0, r0, #0x47 + mov r2, #0x15 + bl ov00_0220A348 +_02208434: + cmp r6, #0 + bne _0220844C + ldr r0, [sp, #4] + mov r1, #0 + strb r1, [r0, #0x5c] + b _02208460 +_0220844C: + ldr r0, [sp, #4] + mov r1, r6 + add r0, r0, #0x5c + mov r2, #0x33 + bl ov00_0220A348 +_02208460: + ldr r0, [sp, #4] + add r0, r0, #0x5c + bl ov00_021FF408 + cmp r5, #0 + bne _02208484 + ldr r0, [sp, #4] + mov r1, #0 + strb r1, [r0, #0x8f] + b _02208498 +_02208484: + ldr r0, [sp, #4] + mov r1, r5 + add r0, r0, #0x8f + mov r2, #0x1f + bl ov00_0220A348 +_02208498: + cmp r4, #0 + bne _022084B0 + ldr r0, [sp, #4] + mov r1, #0 + strb r1, [r0, #0xae] + b _022084C4 +_022084B0: + ldr r0, [sp, #4] + mov r1, r4 + add r0, r0, #0xae + mov r2, #0x1f + bl ov00_0220A348 +_022084C4: + ldr r0, [sp, #0x34] + ldr r2, [sp, #0x30] + ldr r1, [sp, #4] + cmp r0, #0 + movlt r0, #0 + strlt r0, [sp, #0x34] + str r2, [r1, #0x130] + ldr r2, [sp, #0x34] + ldr r1, [sp, #4] + ldr r0, [sp, #0x40] + str r2, [r1, #0x134] + str r0, [sp] + ldr r1, [sp, #4] + ldr r2, [sp, #0x38] + ldr r3, [sp, #0x3c] + mov r0, sb + bl ov00_022082A0 + cmp r0, #0 + moveq r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02208518: .word ov00_02219418 + arm_func_end ov00_02208330 + + arm_func_start ov00_0220851C +ov00_0220851C: ; 0x0220851C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x490 + mov sl, r0 + ldr r0, [sl] + str r1, [sp, #0x1c] + ldr r1, [r1, #8] + str r0, [sp, #0x28] + ldr r0, [sp, #0x1c] + cmp r1, #0 + movne r4, #1 + ldr r6, [r0, #4] + moveq r4, #0 +_0220854C: + mov r1, #1 + ldr r0, _02209354 ; =ov00_0221942C + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r6, #4] + add r3, sp, #0x68 + mov r0, sl + add r2, r6, #0x18 + bl ov00_0220267C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x1c] + ldr r0, [r0, #0x14] + cmp r0, #1 + bne _02208BB0 + ldr r1, [r6, #4] + add r2, sp, #0x7c + mov r0, sl + bl ov00_0220A5A8 + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x7c] + cmp r0, #4 + bne _022085E0 + ldr r1, _02209358 ; =0x00000D01 + ldr r2, _0220935C ; =ov00_02219430 + mov r0, sl + bl ov00_0220A86C + mov r0, sl + mov r1, #4 + mov r2, #0 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022085E0: + cmp r0, #3 + bne _02209F6C + ldr r0, [r6] + cmp r0, #1 + bne _022087A8 + ldr r2, _02209360 ; =ov00_0221945C + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209364 ; =ov00_02219468 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r0, [sp, #0x28] + add r1, r6, #0x18 + ldr r2, [r0, #0x198] + mov r0, sl + bl ov00_0220211C + ldr r2, _02209368 ; =ov00_02219474 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x1a0] + add r1, r6, #0x18 + bl ov00_0220211C + ldr r2, _0220936C ; =ov00_02219480 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x470] + add r1, r6, #0x18 + bl ov00_0220211C + ldrsb r0, [r6, #0x28] + cmp r0, #0 + beq _0220869C + ldr r2, _02209370 ; =ov00_02219490 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x28 + bl ov00_022020EC +_0220869C: + ldrsb r0, [r6, #0x47] + cmp r0, #0 + beq _022086C8 + ldr r2, _02209374 ; =ov00_02219498 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x47 + bl ov00_022020EC +_022086C8: + ldrsb r0, [r6, #0x5c] + cmp r0, #0 + beq _022086F4 + ldr r2, _02209378 ; =ov00_022194A8 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x5c + bl ov00_022020EC +_022086F4: + ldrsb r0, [r6, #0x8f] + cmp r0, #0 + beq _02208720 + ldr r2, _0220937C ; =ov00_022194B0 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x8f + bl ov00_022020EC +_02208720: + ldrsb r0, [r6, #0xae] + cmp r0, #0 + beq _0220874C + ldr r2, _02209380 ; =ov00_022194BC + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0xae + bl ov00_022020EC +_0220874C: + ldr r0, [r6, #0x130] + cmp r0, #0 + beq _02208778 + ldr r2, _02209384 ; =ov00_022194C8 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [r6, #0x130] + mov r0, sl + add r1, r6, #0x18 + bl ov00_0220211C +_02208778: + ldr r0, [r6, #0x134] + cmp r0, #0 + ble _02208B70 + ldr r2, _02209388 ; =ov00_022194D4 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [r6, #0x134] + mov r0, sl + add r1, r6, #0x18 + bl ov00_0220211C + b _02208B70 +_022087A8: + cmp r0, #2 + bne _022087E4 + ldr r2, _0220938C ; =ov00_022194DC + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209378 ; =ov00_022194A8 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x5c + bl ov00_022020EC + b _02208B70 +_022087E4: + cmp r0, #3 + bne _02208864 + ldr r2, _02209390 ; =ov00_022194E4 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209378 ; =ov00_022194A8 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x5c + bl ov00_022020EC + ldr r2, _02209394 ; =ov00_022194EC + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0xcd + bl ov00_022020EC + ldr r2, _0220936C ; =ov00_02219480 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x470] + add r1, r6, #0x18 + bl ov00_0220211C + b _02208B70 +_02208864: + cmp r0, #4 + bne _022088E8 + ldr r2, _02209398 ; =ov00_022194F4 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209364 ; =ov00_02219468 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r0, [sp, #0x28] + add r1, r6, #0x18 + ldr r2, [r0, #0x198] + mov r0, sl + bl ov00_0220211C + ldr r2, _02209368 ; =ov00_02219474 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x1a0] + add r1, r6, #0x18 + bl ov00_0220211C + ldr r2, _0220939C ; =ov00_02219500 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [r6, #0x138] + mov r0, sl + add r1, r6, #0x18 + bl ov00_0220211C + b _02208B70 +_022088E8: + cmp r0, #5 + bne _02208964 + ldr r2, _022093A0 ; =ov00_0221950C + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209370 ; =ov00_02219490 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x28 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + ldr r2, _02209378 ; =ov00_022194A8 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x5c + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + ldr r2, _02209394 ; =ov00_022194EC + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0xcd + bl ov00_022020EC + b _02208B70 +_02208964: + cmp r0, #6 + bne _02208A74 + ldr r2, _022093A4 ; =ov00_02219514 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209370 ; =ov00_02219490 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x28 + bl ov00_022020EC + ldr r2, _02209378 ; =ov00_022194A8 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x5c + bl ov00_022020EC + ldr r2, _02209394 ; =ov00_022194EC + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0xcd + bl ov00_022020EC + ldr r2, _022093A8 ; =ov00_02219520 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x46c] + add r1, r6, #0x18 + bl ov00_0220211C + ldr r2, _0220936C ; =ov00_02219480 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x470] + add r1, r6, #0x18 + bl ov00_0220211C + ldr r2, _02209374 ; =ov00_02219498 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x47 + bl ov00_022020EC + ldrsb r0, [r6, #0xec] + cmp r0, #0 + beq _02208B70 + ldr r2, _022093AC ; =ov00_0221952C + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0xec + bl ov00_022020EC + b _02208B70 +_02208A74: + cmp r0, #7 + bne _02208AFC + ldr r2, _022093B0 ; =ov00_02219534 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _02209364 ; =ov00_02219468 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r0, [sp, #0x28] + add r1, r6, #0x18 + ldr r2, [r0, #0x198] + mov r0, sl + bl ov00_0220211C + ldr r2, _02209368 ; =ov00_02219474 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x1a0] + add r1, r6, #0x18 + bl ov00_0220211C + ldr r2, _0220936C ; =ov00_02219480 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x470] + add r1, r6, #0x18 + bl ov00_0220211C + b _02208B70 +_02208AFC: + cmp r0, #8 + bne _02208B5C + ldr r2, _022093B4 ; =ov00_02219540 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _022093B8 ; =ov00_02219550 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + mov r0, sl + add r1, r6, #0x18 + add r2, r6, #0x47 + bl ov00_022020EC + ldr r2, _0220936C ; =ov00_02219480 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, [sp, #0x28] + mov r0, sl + ldr r2, [r2, #0x470] + add r1, r6, #0x18 + bl ov00_0220211C + b _02208B70 +_02208B5C: + ldr r0, _022093BC ; =ov00_02219560 + ldr r1, _022093C0 ; =ov00_022193E4 + ldr r2, _022093C4 ; =ov00_022192A8 + ldr r3, _022093C8 ; =0x00000275 + bl __msl_assertion_failed +_02208B70: + ldr r2, _022093CC ; =ov00_02219564 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _022093D0 ; =ov00_0221B16C + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r2, _022093D4 ; =ov00_02219570 + mov r0, sl + add r1, r6, #0x18 + bl ov00_022020EC + ldr r0, [sp, #0x1c] + mov r1, #4 + str r1, [r0, #0x14] + b _02209F6C +_02208BB0: + cmp r0, #4 + bne _02209F6C + add r1, sp, #0x68 + ldr r0, _02209354 ; =ov00_0221942C + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r6, #4] + add r3, sp, #0x6c + mov r0, sl + add r2, r6, #8 + bl ov00_02202454 + cmp r0, #0 + beq _02208C1C + cmp r0, #3 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209358 ; =0x00000D01 + ldr r2, _022093D8 ; =ov00_02219578 + mov r0, sl + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #0 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02208C1C: + ldr r0, [r6, #8] + ldr r1, _022093D4 ; =ov00_02219570 + bl strstr + cmp r0, #0 + beq _02209F6C + mov r0, #0 + str r0, [sp, #0x78] + ldr r0, [sp, #0x1c] + mov r1, #5 + str r1, [r0, #0x14] + ldr r1, [r6, #8] + mov r0, sl + mov r2, #1 + bl ov00_0220A3C8 + cmp r0, #0 + beq _02208C70 + mov r0, #1 + str r0, [r6, #0x140] + add sp, sp, #0x490 + mov r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02208C70: + ldr r0, [r6] + cmp r0, #1 + bne _02208FE0 + ldr r1, _022093DC ; =0x00000601 + mov r0, #0 + str r0, [sp, #0x2c] + str r0, [sp, #0x80] + str r0, [sp, #0x84] + str r0, [sp, #0x8c] + str r1, [sp, #0x88] + add r4, sp, #0x290 + add r5, sp, #0x90 + add fp, sp, #0x78 +_02208CA4: + str r5, [sp] + ldr r1, [r6, #8] + mov r0, sl + mov r2, fp + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _022093E0 ; =ov00_022195A4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208D38 + str r5, [sp] + ldr r1, [r6, #8] + mov r0, sl + mov r2, fp + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _022093E4 ; =ov00_022195AC + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208D2C + ldr r1, _022093BC ; =ov00_02219560 + mov r0, r5 + bl strcmp + cmp r0, #0 + movne r0, #0x600 + strne r0, [sp, #0x88] +_02208D2C: + mov r0, #1 + str r0, [sp, #0x2c] + b _02208F18 +_02208D38: + ldr r1, _022093E8 ; =ov00_022195B4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208EEC + ldr r1, [sp, #0x84] + ldr r0, [sp, #0x8c] + add r2, r1, #1 + mov r1, #0xac + mul r1, r2, r1 + str r2, [sp, #0x84] + bl ov00_021EC3BC + movs r7, r0 + str r7, [sp, #0x8c] + bne _02208D8C + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02208D8C: + ldr r0, [sp, #0x84] + mov r1, #0 + sub r2, r0, #1 + mov r0, #0xac + mul r8, r2, r0 + add sb, r7, r8 + mov r0, sb + mov r2, #0xac + bl memset + mov r0, r5 + bl atoi + str r0, [r7, r8] + mov r8, #0 +_02208DC0: + ldr r7, [sp, #0x78] + mov r0, sl + str r5, [sp] + ldr r1, [r6, #8] + mov r2, fp + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _022093F0 ; =ov00_022195B8 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208E10 + add r0, sb, #4 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02208EE0 +_02208E10: + ldr r1, _022093F4 ; =ov00_022195C0 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208E38 + add r0, sb, #0x23 + mov r1, r5 + mov r2, #0x15 + bl ov00_0220A348 + b _02208EE0 +_02208E38: + ldr r1, _022093F8 ; =ov00_022195CC + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208E60 + add r0, sb, #0x38 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02208EE0 +_02208E60: + ldr r1, _022093FC ; =ov00_022195D8 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208E88 + add r0, sb, #0x57 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02208EE0 +_02208E88: + ldr r1, _02209400 ; =ov00_022195E4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208EB0 + add r0, sb, #0x76 + mov r1, r5 + mov r2, #0x33 + bl ov00_0220A348 + b _02208EE0 +_02208EB0: + ldr r1, _022093E8 ; =ov00_022195B4 + mov r0, r4 + bl strcmp + cmp r0, #0 + beq _02208ED8 + ldr r1, _022093E0 ; =ov00_022195A4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02208EE0 +_02208ED8: + str r7, [sp, #0x78] + mov r8, #1 +_02208EE0: + cmp r8, #0 + beq _02208DC0 + b _02208F18 +_02208EEC: + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02208F18: + ldr r0, [sp, #0x2c] + cmp r0, #0 + beq _02208CA4 + ldr r0, [sp, #0x1c] + ldr r4, [sp, #0x88] + ldr r3, [r0, #0xc] + ldr r2, [r0, #0x10] + str r3, [sp, #0x70] + str r2, [sp, #0x74] + cmp r3, #0 + beq _02208F50 + add r1, sp, #0x80 + mov r0, sl + blx r3 +_02208F50: + cmp r4, #0x600 + ldreq r0, [sp, #0x88] + cmpeq r0, #0x600 + bne _02208FCC + add r0, r6, #0x8f + str r0, [sp] + add r0, r6, #0xae + str r0, [sp, #4] + ldr r1, [r6, #0x130] + mov r0, sl + str r1, [sp, #8] + ldr r3, [sp, #0x84] + ldr r2, [r6, #0x134] + add r1, r6, #0x28 + add r2, r3, r2 + str r2, [sp, #0xc] + ldr r2, [sp, #0x1c] + ldr r3, [r2, #8] + add r2, r6, #0x47 + str r3, [sp, #0x10] + ldr r3, [sp, #0x1c] + ldr r4, [r3, #0xc] + add r3, r6, #0x5c + str r4, [sp, #0x14] + ldr r4, [sp, #0x1c] + ldr r4, [r4, #0x10] + str r4, [sp, #0x18] + bl ov00_02208330 + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02208FCC: + ldr r0, [sp, #0x8c] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sp, #0x8c] + b _02209F60 +_02208FE0: + cmp r0, #2 + bne _022090F4 + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x30] + str r0, [sp, #0x34] + cmp r1, #0 + beq _02209F60 + add r0, sp, #0x90 + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209408 ; =ov00_02219614 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _0220906C + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220906C: + mov r0, #0x3c + bl ov00_021EC3A8 + movs r4, r0 + bne _02209094 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209094: + mov r0, #0 + str r0, [r4] + add r0, r4, #4 + add r1, r6, #0x5c + mov r2, #0x33 + bl ov00_0220A348 + ldrsb r0, [sp, #0x90] + ldr r1, [sp, #0x1c] + add r2, sp, #0x30 + cmp r0, #0x30 + moveq r0, #0 + movne r0, #1 + str r0, [r4, #0x38] + str r1, [sp] + mov r1, #0 + str r1, [sp, #4] + mov r0, sl + mov r3, r4 + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022090F4: + cmp r0, #3 + bne _0220949C + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x38] + str r0, [sp, #0x3c] + cmp r1, #0 + beq _02209F60 + mov r0, #0x44 + bl ov00_021EC3A8 + movs r8, r0 + bne _02209140 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209140: + mov r2, #0 + add r0, r8, #4 + add r1, r6, #0x5c + str r2, [r8] + bl strcpy + mov r1, #0 + str r1, [r8, #0x38] + str r1, [r8, #0x3c] + add r0, sp, #0x90 + str r1, [r8, #0x40] + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _0220940C ; =ov00_02219618 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _022091CC + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022091CC: + ldr fp, _022093F0 ; =ov00_022195B8 + mov sb, #0 + add r4, sp, #0x290 + add r7, sp, #0x90 + add r5, sp, #0x78 +_022091E0: + str r7, [sp] + ldr r1, [r6, #8] + mov r0, sl + mov r2, r5 + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, r4 + mov r1, fp + bl strcmp + cmp r0, #0 + bne _022092AC + ldr r0, [r8, #0x3c] + ldr r1, [r8, #0x38] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0220924C + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220924C: + str r0, [r8, #0x3c] + mov r0, #0x1f + bl ov00_021EC3A8 + cmp r0, #0 + bne _02209278 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209278: + ldr r3, [r8, #0x3c] + ldr r2, [r8, #0x38] + mov r1, r7 + str r0, [r3, r2, lsl #2] + ldr r3, [r8, #0x3c] + ldr r0, [r8, #0x38] + mov r2, #0x1f + ldr r0, [r3, r0, lsl #2] + bl ov00_0220A348 + ldr r0, [r8, #0x38] + add r0, r0, #1 + str r0, [r8, #0x38] + b _02209460 +_022092AC: + ldr r1, _022093F4 ; =ov00_022195C0 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _0220941C + ldr r0, [r8, #0x38] + cmp r0, #0 + ble _02209460 + mov r1, r0, lsl #2 + ldr r0, [r8, #0x40] + bl ov00_021EC3BC + cmp r0, #0 + bne _022092F8 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022092F8: + str r0, [r8, #0x40] + mov r0, #0x15 + bl ov00_021EC3A8 + cmp r0, #0 + bne _02209324 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209324: + ldr r3, [r8, #0x40] + ldr r2, [r8, #0x38] + mov r1, r7 + add r2, r3, r2, lsl #2 + str r0, [r2, #-4] + ldr r3, [r8, #0x40] + ldr r0, [r8, #0x38] + mov r2, #0x15 + add r0, r3, r0, lsl #2 + ldr r0, [r0, #-4] + bl ov00_0220A348 + b _02209460 + .balign 4, 0 +_02209354: .word ov00_0221942C +_02209358: .word 0x00000D01 +_0220935C: .word ov00_02219430 +_02209360: .word ov00_0221945C +_02209364: .word ov00_02219468 +_02209368: .word ov00_02219474 +_0220936C: .word ov00_02219480 +_02209370: .word ov00_02219490 +_02209374: .word ov00_02219498 +_02209378: .word ov00_022194A8 +_0220937C: .word ov00_022194B0 +_02209380: .word ov00_022194BC +_02209384: .word ov00_022194C8 +_02209388: .word ov00_022194D4 +_0220938C: .word ov00_022194DC +_02209390: .word ov00_022194E4 +_02209394: .word ov00_022194EC +_02209398: .word ov00_022194F4 +_0220939C: .word ov00_02219500 +_022093A0: .word ov00_0221950C +_022093A4: .word ov00_02219514 +_022093A8: .word ov00_02219520 +_022093AC: .word ov00_0221952C +_022093B0: .word ov00_02219534 +_022093B4: .word ov00_02219540 +_022093B8: .word ov00_02219550 +_022093BC: .word ov00_02219560 +_022093C0: .word ov00_022193E4 +_022093C4: .word ov00_022192A8 +_022093C8: .word 0x00000275 +_022093CC: .word ov00_02219564 +_022093D0: .word ov00_0221B16C +_022093D4: .word ov00_02219570 +_022093D8: .word ov00_02219578 +_022093DC: .word 0x00000601 +_022093E0: .word ov00_022195A4 +_022093E4: .word ov00_022195AC +_022093E8: .word ov00_022195B4 +_022093EC: .word ov00_02219328 +_022093F0: .word ov00_022195B8 +_022093F4: .word ov00_022195C0 +_022093F8: .word ov00_022195CC +_022093FC: .word ov00_022195D8 +_02209400: .word ov00_022195E4 +_02209404: .word ov00_022195EC +_02209408: .word ov00_02219614 +_0220940C: .word ov00_02219618 +_02209410: .word ov00_0221961C +_02209414: .word ov00_02219624 +_02209418: .word ov00_0221962C +_0220941C: + ldr r1, _02209410 ; =ov00_0221961C + mov r0, r4 + bl strcmp + cmp r0, #0 + moveq sb, #1 + beq _02209460 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209460: + cmp sb, #0 + beq _022091E0 + ldr r1, [sp, #0x1c] + add r2, sp, #0x38 + str r1, [sp] + mov r1, #3 + str r1, [sp, #4] + mov r0, sl + mov r3, r8 + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220949C: + cmp r0, #4 + bne _02209718 + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x40] + str r0, [sp, #0x44] + cmp r1, #0 + beq _02209F60 + mov r0, #0x10 + bl ov00_021EC3A8 + movs fp, r0 + bne _022094E8 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022094E8: + ldr r1, [r6, #0x138] + mov r0, #0 + stmia fp, {r0, r1} + str r0, [fp, #8] + str r0, [sp, #0x20] + str r0, [fp, #0xc] + add r4, sp, #0x290 + add r5, sp, #0x90 +_02209508: + str r5, [sp] + ldr r1, [r6, #8] + mov r0, sl + add r2, sp, #0x78 + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209414 ; =ov00_02219624 + mov r0, r4 + bl strcmp + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0x20] + beq _022096D8 + ldr r1, _02209418 ; =ov00_0221962C + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _022096AC + ldr r0, [fp, #8] + add r2, r0, #1 + mov r0, #0x128 + mul r1, r2, r0 + str r2, [fp, #8] + ldr r0, [fp, #0xc] + bl ov00_021EC3BC + str r0, [fp, #0xc] + movs r8, r0 + bne _0220959C + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220959C: + ldr r0, [fp, #8] + mov r1, #0 + sub r2, r0, #1 + mov r0, #0x128 + mul sb, r2, r0 + add r7, r8, sb + mov r0, r7 + mov r2, #0x128 + bl memset + mov r0, #1 + str r0, [r7, #0x24] + mov r0, r5 + bl atoi + str r0, [r8, sb] + mov r8, #0 +_022095D8: + ldr sb, [sp, #0x78] + mov r0, sl + str r5, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209F90 ; =ov00_02219630 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209628 + add r0, r7, #0x28 + mov r1, r5 + mov r2, #0x100 + bl ov00_0220A348 + b _0220964C +_02209628: + ldr r1, _022093F0 ; =ov00_022195B8 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _0220964C + add r0, r7, #4 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 +_0220964C: + ldr r1, _02209F94 ; =ov00_02219638 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209670 + mov r0, r5 + bl atoi + str r0, [r7, #0x24] + b _022096A0 +_02209670: + ldr r1, _02209418 ; =ov00_0221962C + mov r0, r4 + bl strcmp + cmp r0, #0 + beq _02209698 + ldr r1, _02209414 ; =ov00_02219624 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _022096A0 +_02209698: + str sb, [sp, #0x78] + mov r8, #1 +_022096A0: + cmp r8, #0 + beq _022095D8 + b _022096D8 +_022096AC: + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022096D8: + ldr r0, [sp, #0x20] + cmp r0, #0 + beq _02209508 + ldr r1, [sp, #0x1c] + add r2, sp, #0x40 + str r1, [sp] + mov r1, #4 + str r1, [sp, #4] + mov r0, sl + mov r3, fp + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209718: + cmp r0, #5 + bne _02209874 + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x48] + str r0, [sp, #0x4c] + cmp r1, #0 + beq _02209F60 + add r0, sp, #0x90 + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209F98 ; =ov00_02219644 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _022097A4 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022097A4: + add r0, sp, #0x90 + bl atoi + movs r4, r0 + beq _022097C4 + ldr r0, [sp, #0x28] + mov r5, #0 + str r4, [r0, #0x418] + b _02209818 +_022097C4: + ldr r0, [r6, #8] + ldr r1, _02209F9C ; =ov00_02219648 + add r2, sp, #0x90 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _0220980C + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220980C: + add r0, sp, #0x90 + bl atoi + mov r5, r0 +_02209818: + mov r0, #8 + bl ov00_021EC3A8 + movs r3, r0 + bne _02209840 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209840: + stmia r3, {r4, r5} + ldr r1, [sp, #0x1c] + add r2, sp, #0x48 + str r1, [sp] + mov r1, #0 + str r1, [sp, #4] + mov r0, sl + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209874: + cmp r0, #6 + bne _022099D4 + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x50] + str r0, [sp, #0x54] + cmp r1, #0 + beq _02209F60 + add r0, sp, #0x90 + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209FA0 ; =ov00_02219650 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _02209900 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209900: + add r0, sp, #0x90 + bl atoi + movs r4, r0 + ldrne r0, [sp, #0x28] + ldr r1, _02209F9C ; =ov00_02219648 + strne r4, [r0, #0x418] + ldr r0, [r6, #8] + add r2, sp, #0x90 + mov r3, #0x200 + bl ov00_0220A4A0 + cmp r0, #0 + bne _0220996C + cmp r4, #0 + bne _02209964 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209964: + mov r5, #0 + b _02209978 +_0220996C: + add r0, sp, #0x90 + bl atoi + mov r5, r0 +_02209978: + mov r0, #8 + bl ov00_021EC3A8 + movs r3, r0 + bne _022099A0 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022099A0: + stmia r3, {r4, r5} + ldr r1, [sp, #0x1c] + add r2, sp, #0x50 + str r1, [sp] + mov r1, #0 + str r1, [sp, #4] + mov r0, sl + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022099D4: + cmp r0, #7 + bne _02209D10 + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x58] + str r0, [sp, #0x5c] + cmp r1, #0 + beq _02209F60 + mov r0, #0xc + bl ov00_021EC3A8 + movs fp, r0 + bne _02209A20 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209A20: + mov r1, #0 + str r1, [fp] + str r1, [fp, #4] + add r0, sp, #0x90 + str r1, [fp, #8] + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209FA4 ; =ov00_02219654 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _02209A98 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209A98: + mov r0, #0 + str r0, [sp, #0x24] + add r4, sp, #0x290 + add r5, sp, #0x90 +_02209AA8: + str r5, [sp] + ldr r1, [r6, #8] + mov r0, sl + add r2, sp, #0x78 + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209FA8 ; =ov00_0221965C + mov r0, r4 + bl strcmp + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0x24] + beq _02209CD0 + ldr r1, _02209FAC ; =ov00_02219664 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209CA4 + ldr r1, [fp, #4] + ldr r0, [fp, #8] + add r2, r1, #1 + mov r1, #0xac + mul r1, r2, r1 + bl ov00_021EC3BC + cmp r0, #0 + bne _02209B34 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209B34: + str r0, [fp, #8] + ldr r2, [fp, #4] + mov r8, r0 + mov r0, #0xac + mul sb, r2, r0 + add r7, r8, sb + mov r1, #0 + mov r0, r7 + mov r2, #0xac + bl memset + ldr r1, [fp, #4] + mov r0, r5 + add r1, r1, #1 + str r1, [fp, #4] + bl atoi + str r0, [r8, sb] + mov r8, #0 +_02209B78: + ldr sb, [sp, #0x78] + mov r0, sl + str r5, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _022093F0 ; =ov00_022195B8 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209BC8 + add r0, r7, #4 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02209C98 +_02209BC8: + ldr r1, _022093F4 ; =ov00_022195C0 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209BF0 + add r0, r7, #0x23 + mov r1, r5 + mov r2, #0x15 + bl ov00_0220A348 + b _02209C98 +_02209BF0: + ldr r1, _02209FB0 ; =ov00_02219668 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209C18 + add r0, r7, #0x38 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02209C98 +_02209C18: + ldr r1, _02209FB4 ; =ov00_02219670 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209C40 + add r0, r7, #0x57 + mov r1, r5 + mov r2, #0x1f + bl ov00_0220A348 + b _02209C98 +_02209C40: + ldr r1, _02209400 ; =ov00_022195E4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209C68 + add r0, r7, #0x76 + mov r1, r5 + mov r2, #0x33 + bl ov00_0220A348 + b _02209C98 +_02209C68: + ldr r1, _02209FAC ; =ov00_02219664 + mov r0, r4 + bl strcmp + cmp r0, #0 + beq _02209C90 + ldr r1, _02209FA8 ; =ov00_0221965C + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209C98 +_02209C90: + str sb, [sp, #0x78] + mov r8, #1 +_02209C98: + cmp r8, #0 + beq _02209B78 + b _02209CD0 +_02209CA4: + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209CD0: + ldr r0, [sp, #0x24] + cmp r0, #0 + beq _02209AA8 + ldr r1, [sp, #0x1c] + add r2, sp, #0x58 + str r1, [sp] + mov r1, #8 + str r1, [sp, #4] + mov r0, sl + mov r3, fp + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209D10: + cmp r0, #8 + bne _02209F4C + ldr r0, [sp, #0x1c] + ldr r1, [r0, #0xc] + ldr r0, [r0, #0x10] + str r1, [sp, #0x60] + str r0, [sp, #0x64] + cmp r1, #0 + beq _02209F60 + mov r0, #0xc + mov r7, #0 + bl ov00_021EC3A8 + movs r8, r0 + bne _02209D60 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209D60: + mov r1, r7 + str r1, [r8] + str r1, [r8, #4] + add r0, sp, #0x90 + str r1, [r8, #8] + str r0, [sp] + ldr r1, [r6, #8] + add r2, sp, #0x78 + add r3, sp, #0x290 + mov r0, sl + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02209FB8 ; =ov00_02219678 + add r0, sp, #0x290 + bl strcmp + cmp r0, #0 + beq _02209DD8 + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209DD8: + add r0, sp, #0x90 + bl atoi + str r0, [r8, #4] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r8, #8] + cmp r0, #0 + bne _02209E10 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209E10: + mov sb, r7 + add r4, sp, #0x290 + add r5, sp, #0x90 + add fp, sp, #0x78 +_02209E20: + str r5, [sp] + ldr r1, [r6, #8] + mov r0, sl + mov r2, fp + mov r3, r4 + bl ov00_0220A69C + cmp r0, #0 + addne sp, sp, #0x490 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _022093F0 ; =ov00_022195B8 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209EA4 + mov r0, #0x15 + bl ov00_021EC3A8 + ldr r1, [r8, #8] + str r0, [r1, r7, lsl #2] + ldr r0, [r8, #8] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + bne _02209E90 + ldr r1, _022093EC ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + add sp, sp, #0x490 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209E90: + mov r1, r5 + mov r2, #0x15 + bl ov00_0220A348 + add r7, r7, #1 + b _02209F10 +_02209EA4: + ldr r1, _02209FBC ; =ov00_0221967C + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02209EE4 + ldr r0, [r8, #4] + cmp r7, r0 + beq _02209ED8 + ldr r0, _02209FC0 ; =ov00_02219684 + ldr r1, _022093C0 ; =ov00_022193E4 + ldr r2, _022093C4 ; =ov00_022192A8 + ldr r3, _02209FC4 ; =0x00000515 + bl __msl_assertion_failed +_02209ED8: + str r7, [r8, #4] + mov sb, #1 + b _02209F10 +_02209EE4: + ldr r2, _02209404 ; =ov00_022195EC + mov r0, sl + mov r1, #1 + bl ov00_0220A86C + mov r0, sl + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x490 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209F10: + cmp sb, #0 + beq _02209E20 + ldr r1, [sp, #0x1c] + add r2, sp, #0x60 + str r1, [sp] + mov r1, #9 + str r1, [sp, #4] + mov r0, sl + mov r3, r8 + ldmia r2, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + beq _02209F60 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02209F4C: + ldr r0, _022093BC ; =ov00_02219560 + ldr r1, _022093C0 ; =ov00_022193E4 + ldr r2, _022093C4 ; =ov00_022192A8 + ldr r3, _02209FC8 ; =0x0000052A + bl __msl_assertion_failed +_02209F60: + mov r0, #1 + str r0, [r6, #0x140] + mov r4, #0 +_02209F6C: + cmp r4, #0 + beq _02209F7C + mov r0, #0xa + bl ov00_021FF3C0 +_02209F7C: + cmp r4, #0 + bne _0220854C + mov r0, #0 + add sp, sp, #0x490 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02209F90: .word ov00_02219630 +_02209F94: .word ov00_02219638 +_02209F98: .word ov00_02219644 +_02209F9C: .word ov00_02219648 +_02209FA0: .word ov00_02219650 +_02209FA4: .word ov00_02219654 +_02209FA8: .word ov00_0221965C +_02209FAC: .word ov00_02219664 +_02209FB0: .word ov00_02219668 +_02209FB4: .word ov00_02219670 +_02209FB8: .word ov00_02219678 +_02209FBC: .word ov00_0221967C +_02209FC0: .word ov00_02219684 +_02209FC4: .word 0x00000515 +_02209FC8: .word 0x0000052A + arm_func_end ov00_0220851C + + arm_func_start ov00_02209FCC +ov00_02209FCC: ; 0x02209FCC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r6, [sl] + mov sb, #0 + ldr r0, [r6, #0x210] + cmp r0, #0 + ble _0220A100 + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + movs r7, r0 + bne _0220A00C + ldr r1, _0220A108 ; =ov00_02219328 + mov r0, sl + bl ov00_0220A890 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220A00C: + ldr r8, [r6, #0x424] + cmp r8, #0 + beq _0220A088 + ldr r5, _0220A10C ; =ov00_022196A4 + ldr fp, _0220A110 ; =ov00_022193E4 + mov r4, #1 +_0220A024: + ldr r0, [r8] + cmp r0, #3 + bne _0220A07C + ldr r0, [r8, #0x14] + cmp r0, #5 + beq _0220A07C + ldr r0, [r8, #4] + ldr r0, [r0, #0x13c] + cmp r0, #0 + bne _0220A07C + ldr r0, [r6, #0x210] + cmp sb, r0 + blt _0220A06C + ldr r2, _0220A114 ; =ov00_022192BC + ldr r3, _0220A118 ; =0x00000563 + mov r0, r5 + mov r1, fp + bl __msl_assertion_failed +_0220A06C: + str r8, [r7, sb, lsl #2] + ldr r0, [r8, #4] + add sb, sb, #1 + str r4, [r0, #0x13c] +_0220A07C: + ldr r8, [r8, #0x20] + cmp r8, #0 + bne _0220A024 +_0220A088: + cmp sb, #0 + mov r4, #0 + ble _0220A0B8 +_0220A094: + ldr r1, [r7, r4, lsl #2] + mov r0, sl + bl ov00_0220851C + cmp r0, #0 + ldrne r1, [r7, r4, lsl #2] + add r4, r4, #1 + strne r0, [r1, #0x1c] + cmp r4, sb + blt _0220A094 +_0220A0B8: + cmp sb, #0 + mov r4, #0 + ble _0220A0F8 + mov r5, r4 +_0220A0C8: + ldr r0, [r7, r4, lsl #2] + ldr r0, [r0, #4] + str r5, [r0, #0x13c] + ldr r0, [r0, #0x140] + cmp r0, #0 + beq _0220A0EC + ldr r1, [r7, r4, lsl #2] + mov r0, sl + bl ov00_022066D0 +_0220A0EC: + add r4, r4, #1 + cmp r4, sb + blt _0220A0C8 +_0220A0F8: + mov r0, r7 + bl ov00_021EC3D8 +_0220A100: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0220A108: .word ov00_02219328 +_0220A10C: .word ov00_022196A4 +_0220A110: .word ov00_022193E4 +_0220A114: .word ov00_022192BC +_0220A118: .word 0x00000563 + arm_func_end ov00_02209FCC + + arm_func_start ov00_0220A11C +ov00_0220A11C: ; 0x0220A11C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x20 + ldr ip, [sp, #0x30] + mov r5, r2 + mov r6, r0 + cmp ip, #0 + ldreq r0, _0220A1B8 ; =ov00_022196C4 + mov lr, r1 + mov r4, r3 + streq r0, [sp, #0x30] + mov r0, r6 + mov r1, r5 + mov r3, lr + mov r2, #0xc9 + bl ov00_0220792C + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _0220A1BC ; =ov00_022196C8 + add r0, sp, #0 + mov r3, r4 + mov r2, #1 + bl sprintf + add r2, sp, #0 + mov r0, r6 + mov r1, r5 + bl ov00_02202424 + cmp r0, #0 + addne sp, sp, #0x20 + ldmneia sp!, {r4, r5, r6, pc} + ldr r2, [sp, #0x30] + mov r0, r6 + mov r1, r5 + mvn r3, #0 + bl ov00_022079A8 + cmp r0, #0 + moveq r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220A1B8: .word ov00_022196C4 +_0220A1BC: .word ov00_022196C8 + arm_func_end ov00_0220A11C + + arm_func_start ov00_0220A1C0 +ov00_0220A1C0: ; 0x0220A1C0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x50 + mov r4, r1 + mov r5, r0 + mov r0, r3 + ldr r1, _0220A23C ; =ov00_022196E0 + add r2, sp, #0x10 + mov r3, #0x40 + bl ov00_0220A4A0 + cmp r0, #0 + addeq sp, sp, #0x50 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _0220A240 ; =ov00_022196E8 + add ip, sp, #0xc + add r0, sp, #0x10 + add r2, sp, #4 + add r3, sp, #8 + str ip, [sp] + bl sscanf + cmp r0, #3 + addne sp, sp, #0x50 + ldmneia sp!, {r3, r4, r5, pc} + mov ip, #0 + add r1, sp, #4 + mov r0, r5 + mov r2, r4 + mov r3, #2 + str ip, [sp] + bl ov00_0220A11C + add sp, sp, #0x50 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220A23C: .word ov00_022196E0 +_0220A240: .word ov00_022196E8 + arm_func_end ov00_0220A1C0 + + arm_func_start ov00_0220A244 +ov00_0220A244: ; 0x0220A244 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + mov r4, r2 + mov r5, r1 + mov r1, r4 + mov r2, #1 + mov r6, r0 + bl ov00_0220A3C8 + cmp r0, #0 + addne sp, sp, #0x10 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _0220A33C ; =ov00_022196F4 + mov r0, r4 + mov r2, #4 + bl strncmp + cmp r0, #0 + beq _0220A2B8 + ldr r2, _0220A340 ; =ov00_022196FC + mov r0, r6 + mov r1, #1 + bl ov00_0220A86C + mov r0, r6 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #0x10 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_0220A2B8: + ldr r1, [r5, #0xc] + ldr r0, [r5, #0x10] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + beq _0220A324 + mov r0, #4 + bl ov00_021EC3A8 + movs r3, r0 + bne _0220A2F8 + ldr r1, _0220A344 ; =ov00_0221972C + mov r0, r6 + bl ov00_0220A890 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_0220A2F8: + mov r2, #0 + str r2, [r3] + str r5, [sp] + add r1, sp, #8 + str r2, [sp, #4] + mov r0, r6 + ldmia r1, {r1, r2} + bl ov00_02202A84 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, r5, r6, pc} +_0220A324: + mov r0, r6 + mov r1, r5 + bl ov00_022066D0 + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220A33C: .word ov00_022196F4 +_0220A340: .word ov00_022196FC +_0220A344: .word ov00_0221972C + arm_func_end ov00_0220A244 + + arm_func_start ov00_0220A348 +ov00_0220A348: ; 0x0220A348 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _0220A370 + ldr r0, _0220A3AC ; =ov00_02219768 + ldr r1, _0220A3B0 ; =ov00_02219778 + ldr r2, _0220A3B4 ; =ov00_0221973C + mov r3, #0x2f + bl __msl_assertion_failed +_0220A370: + cmp r5, #0 + bne _0220A38C + ldr r0, _0220A3B8 ; =ov00_02219788 + ldr r1, _0220A3B0 ; =ov00_02219778 + ldr r2, _0220A3B4 ; =ov00_0221973C + mov r3, #0x30 + bl __msl_assertion_failed +_0220A38C: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl strncpy + add r0, r6, r4 + mov r1, #0 + strb r1, [r0, #-1] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220A3AC: .word ov00_02219768 +_0220A3B0: .word ov00_02219778 +_0220A3B4: .word ov00_0221973C +_0220A3B8: .word ov00_02219788 + arm_func_end ov00_0220A348 + + arm_func_start ov00_0220A3BC +ov00_0220A3BC: ; 0x0220A3BC + stmdb sp!, {r0, r1, r2, r3} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220A3BC + + arm_func_start ov00_0220A3C8 +ov00_0220A3C8: ; 0x0220A3C8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r6, r1 + mov r7, r0 + mov r5, r2 + ldr r1, _0220A490 ; =ov00_02219794 + mov r0, r6 + mov r2, #7 + ldr r4, [r7] + bl strncmp + cmp r0, #0 + bne _0220A484 + ldr r1, _0220A494 ; =ov00_0221979C + add r2, sp, #0 + mov r0, r6 + mov r3, #0x10 + bl ov00_0220A4A0 + cmp r0, #0 + beq _0220A420 + add r0, sp, #0 + bl atoi + str r0, [r4, #0x418] +_0220A420: + ldr r1, _0220A498 ; =ov00_022197A4 + mov r0, r6 + mov r2, r4 + mov r3, #0x100 + bl ov00_0220A4A0 + cmp r0, #0 + moveq r0, #0 + streqb r0, [r4] + cmp r5, #0 + beq _0220A478 + ldr r1, _0220A49C ; =ov00_022197B0 + mov r0, r6 + bl strstr + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + movne r2, #1 + moveq r2, #0 + mov r0, r7 + mov r1, #4 + bl ov00_02202990 +_0220A478: + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220A484: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220A490: .word ov00_02219794 +_0220A494: .word ov00_0221979C +_0220A498: .word ov00_022197A4 +_0220A49C: .word ov00_022197B0 + arm_func_end ov00_0220A3C8 + + arm_func_start ov00_0220A4A0 +ov00_0220A4A0: ; 0x0220A4A0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r5, r0 + mov r8, r1 + mov r4, r2 + mov r7, r3 + bne _0220A4CC + ldr r0, _0220A584 ; =ov00_022197B8 + ldr r1, _0220A588 ; =ov00_02219778 + ldr r2, _0220A58C ; =ov00_02219744 + ldr r3, _0220A590 ; =0x0000010D + bl __msl_assertion_failed +_0220A4CC: + cmp r8, #0 + bne _0220A4E8 + ldr r0, _0220A594 ; =ov00_022197C8 + ldr r1, _0220A588 ; =ov00_02219778 + ldr r2, _0220A58C ; =ov00_02219744 + ldr r3, _0220A598 ; =0x0000010E + bl __msl_assertion_failed +_0220A4E8: + cmp r4, #0 + bne _0220A504 + ldr r0, _0220A59C ; =ov00_022197D4 + ldr r1, _0220A588 ; =ov00_02219778 + ldr r2, _0220A58C ; =ov00_02219744 + ldr r3, _0220A5A0 ; =0x0000010F + bl __msl_assertion_failed +_0220A504: + cmp r7, #0 + bgt _0220A520 + ldr r0, _0220A5A4 ; =ov00_022197E4 + ldr r1, _0220A588 ; =ov00_02219778 + ldr r2, _0220A58C ; =ov00_02219744 + mov r3, #0x110 + bl __msl_assertion_failed +_0220A520: + ldrsb r6, [r8] + mov r0, r5 + mov r1, r8 + bl strstr + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r8 + bl strlen + add r1, r5, r0 + mov r3, #0 + sub r0, r7, #1 + b _0220A55C +_0220A554: + strb r2, [r4, r3] + add r3, r3, #1 +_0220A55C: + cmp r3, r0 + bge _0220A574 + ldrsb r2, [r1, r3] + cmp r2, #0 + cmpne r2, r6 + bne _0220A554 +_0220A574: + mov r0, #0 + strb r0, [r4, r3] + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220A584: .word ov00_022197B8 +_0220A588: .word ov00_02219778 +_0220A58C: .word ov00_02219744 +_0220A590: .word 0x0000010D +_0220A594: .word ov00_022197C8 +_0220A598: .word 0x0000010E +_0220A59C: .word ov00_022197D4 +_0220A5A0: .word 0x0000010F +_0220A5A4: .word ov00_022197E4 + arm_func_end ov00_0220A4A0 + + arm_func_start ov00_0220A5A8 +ov00_0220A5A8: ; 0x0220A5A8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov ip, #0 + mov r4, r2 + mov r5, r0 + mov r0, r1 + add r2, sp, #4 + add r3, sp, #0 + mov r1, ip + str ip, [sp, #4] + str ip, [sp] + bl ov00_021FF59C + mvn r1, #0 + cmp r0, r1 + bne _0220A61C + ldr r1, _0220A68C ; =ov00_022197EC + mov r0, r5 + bl ov00_0220A3BC + ldr r2, _0220A690 ; =ov00_02219800 + mov r0, r5 + mov r1, #5 + bl ov00_0220A86C + mov r0, r5 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r3, r4, r5, pc} +_0220A61C: + cmp r0, #0 + ble _0220A67C + ldr r0, [sp] + cmp r0, #0 + beq _0220A650 + ldr r1, _0220A694 ; =ov00_02219838 + mov r0, r5 + bl ov00_0220A3BC + mov r0, #4 + str r0, [r4] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220A650: + ldr r0, [sp, #4] + cmp r0, #0 + beq _0220A67C + ldr r1, _0220A698 ; =ov00_02219850 + mov r0, r5 + bl ov00_0220A3BC + mov r0, #3 + str r0, [r4] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220A67C: + mov r0, #0 + str r0, [r4] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220A68C: .word ov00_022197EC +_0220A690: .word ov00_02219800 +_0220A694: .word ov00_02219838 +_0220A698: .word ov00_02219850 + arm_func_end ov00_0220A5A8 + + arm_func_start ov00_0220A69C +ov00_0220A69C: ; 0x0220A69C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r7, r1 + mov r8, r0 + mov r6, r2 + mov r5, r3 + ldr r4, [sp, #0x18] + bne _0220A6CC + ldr r0, _0220A844 ; =ov00_02219868 + ldr r1, _0220A848 ; =ov00_02219778 + ldr r2, _0220A84C ; =ov00_02219754 + ldr r3, _0220A850 ; =0x00000199 + bl __msl_assertion_failed +_0220A6CC: + cmp r5, #0 + bne _0220A6E8 + ldr r0, _0220A854 ; =ov00_022197C8 + ldr r1, _0220A848 ; =ov00_02219778 + ldr r2, _0220A84C ; =ov00_02219754 + ldr r3, _0220A858 ; =0x0000019A + bl __msl_assertion_failed +_0220A6E8: + cmp r4, #0 + bne _0220A704 + ldr r0, _0220A85C ; =ov00_022197D4 + ldr r1, _0220A848 ; =ov00_02219778 + ldr r2, _0220A84C ; =ov00_02219754 + ldr r3, _0220A860 ; =0x0000019B + bl __msl_assertion_failed +_0220A704: + ldr r1, [r6] + ldrsb r0, [r7, r1] + add r3, r7, r1 + cmp r0, #0x5c + beq _0220A740 + ldr r2, _0220A864 ; =ov00_02219878 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0220A740: + ldrsb r1, [r3, #1] + add r7, r3, #2 + mov r2, #0 + cmp r1, #0x5c + beq _0220A7CC + ldr r0, _0220A868 ; =0x000001FF +_0220A758: + cmp r1, #0 + bne _0220A788 + ldr r2, _0220A864 ; =ov00_02219878 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0220A788: + cmp r2, r0 + bne _0220A7B8 + ldr r2, _0220A864 ; =ov00_02219878 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0220A7B8: + strb r1, [r5], #1 + ldrsb r1, [r7], #1 + add r2, r2, #1 + cmp r1, #0x5c + bne _0220A758 +_0220A7CC: + mov r1, #0 + strb r1, [r5] + ldr r0, _0220A868 ; =0x000001FF + b _0220A814 +_0220A7DC: + cmp r1, r0 + bne _0220A80C + ldr r2, _0220A864 ; =ov00_02219878 + mov r0, r8 + mov r1, #1 + bl ov00_0220A86C + mov r0, r8 + mov r1, #3 + mov r2, #1 + bl ov00_02202990 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0220A80C: + strb r2, [r4], #1 + add r1, r1, #1 +_0220A814: + ldrsb r2, [r7], #1 + cmp r2, #0x5c + cmpne r2, #0 + bne _0220A7DC + mov r0, #0 + strb r0, [r4] + sub r1, r7, r3 + ldr r2, [r6] + sub r1, r1, #1 + add r1, r2, r1 + str r1, [r6] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220A844: .word ov00_02219868 +_0220A848: .word ov00_02219778 +_0220A84C: .word ov00_02219754 +_0220A850: .word 0x00000199 +_0220A854: .word ov00_022197C8 +_0220A858: .word 0x0000019A +_0220A85C: .word ov00_022197D4 +_0220A860: .word 0x0000019B +_0220A864: .word ov00_02219878 +_0220A868: .word 0x000001FF + arm_func_end ov00_0220A69C + + arm_func_start ov00_0220A86C +ov00_0220A86C: ; 0x0220A86C + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [r0] + mov r5, r1 + mov r1, r2 + mov r0, r4 + mov r2, #0x100 + bl ov00_0220A348 + str r5, [r4, #0x418] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220A86C + + arm_func_start ov00_0220A890 +ov00_0220A890: ; 0x0220A890 + ldr ip, _0220A8A0 ; =ov00_0220A348 + ldr r0, [r0] + mov r2, #0x100 + bx ip + .balign 4, 0 +_0220A8A0: .word ov00_0220A348 + arm_func_end ov00_0220A890 + + arm_func_start ov00_0220A8A4 +ov00_0220A8A4: ; 0x0220A8A4 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + movs r7, r0 + ldreq r0, _0220A930 ; =ov00_0221B1F0 + mov r6, r1 + ldreq r7, [r0, #4] + mov r5, r2 + mov r4, r3 + cmp r7, #0 + bne _0220A8E0 + ldr r0, _0220A934 ; =ov00_022198AC + ldr r1, _0220A938 ; =ov00_022198B0 + ldr r2, _0220A93C ; =ov00_02219890 + mov r3, #0x78 + bl __msl_assertion_failed +_0220A8E0: + mov r0, r6 + bl ov00_021FF3D4 + mov r3, #0 + mov r2, #1 + str r0, [sp] + add r0, sp, #0 + mov r1, r4 + str r5, [sp, #4] + str r3, [sp, #0xc] + str r2, [sp, #8] + bl ov00_0220AD64 + ldr r0, [r7] + add r1, sp, #0 + bl ov00_021FEF74 + mov r0, r7 + mov r1, r6 + bl ov00_0220AE00 + bl ov00_0220ADE0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220A930: .word ov00_0221B1F0 +_0220A934: .word ov00_022198AC +_0220A938: .word ov00_022198B0 +_0220A93C: .word ov00_02219890 + arm_func_end ov00_0220A8A4 + + arm_func_start ov00_0220A940 +ov00_0220A940: ; 0x0220A940 + stmdb sp!, {r4, lr} + mov r4, r2 + bl ov00_0220AE00 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0 + mov r1, r4 + str r2, [r0, #8] + bl ov00_0220AD64 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220A940 + + arm_func_start ov00_0220A96C +ov00_0220A96C: ; 0x0220A96C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl ov00_0220AE00 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #4] + cmp r1, #0 + bne _0220A9BC + bl ov00_0220ADE0 + ldr r1, [r5] + ldr r0, [r0] + add r0, r1, r0 + bl ov00_0220AD00 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220A9BC: + cmp r1, #1 + bne _0220A9EC + bl ov00_0220ADE0 + mov r3, r0 + ldmia r5, {r0, r1} + ldmia r3, {r2, r3} + bl _dadd + bl ov00_0220AD18 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220A9EC: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov00_0220AB88 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220A96C + + arm_func_start ov00_0220AA00 +ov00_0220AA00: ; 0x0220AA00 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + bl ov00_0220AE00 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #4] + cmp r1, #0 + bne _0220AA48 + bl ov00_0220ADE0 + ldr r1, [r0] + ldr r0, [r5] + sub r0, r1, r0 + bl ov00_0220AD00 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AA48: + cmp r1, #1 + bne _0220AA7C + bl ov00_0220ADE0 + ldr ip, [r0] + ldr r1, [r0, #4] + mov r0, ip + ldmia r5, {r2, r3} + bl _dsub + bl ov00_0220AD18 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AA7C: + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220AA00 + + arm_func_start ov00_0220AA84 +ov00_0220AA84: ; 0x0220AA84 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + bl ov00_0220AE00 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #4] + cmp r1, #0 + bne _0220AACC + bl ov00_0220ADE0 + ldr r1, [r5] + ldr r0, [r0] + mul r0, r1, r0 + bl ov00_0220AD00 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AACC: + cmp r1, #1 + bne _0220AAFC + bl ov00_0220ADE0 + mov r3, r0 + ldmia r5, {r0, r1} + ldmia r3, {r2, r3} + bl _dmul + bl ov00_0220AD18 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AAFC: + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220AA84 + + arm_func_start ov00_0220AB04 +ov00_0220AB04: ; 0x0220AB04 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + bl ov00_0220AE00 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #4] + cmp r1, #0 + bne _0220AB4C + bl ov00_0220ADE0 + ldr r0, [r0] + ldr r1, [r5] + bl _s32_div_f + bl ov00_0220AD00 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AB4C: + cmp r1, #1 + bne _0220AB80 + bl ov00_0220ADE0 + ldr ip, [r0] + ldr r1, [r0, #4] + mov r0, ip + ldmia r5, {r2, r3} + bl _ddiv + bl ov00_0220AD18 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, pc} +_0220AB80: + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220AB04 + + arm_func_start ov00_0220AB88 +ov00_0220AB88: ; 0x0220AB88 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r2 + bl ov00_0220AE00 + movs r6, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #4] + cmp r0, #2 + beq _0220ABC0 + ldr r0, _0220AC20 ; =ov00_022198BC + ldr r1, _0220AC24 ; =ov00_022198B0 + ldr r2, _0220AC28 ; =ov00_0221989C + mov r3, #0xd1 + bl __msl_assertion_failed +_0220ABC0: + mov r0, r6 + bl ov00_0220ADE0 + mov r5, r0 + bl strlen + mov r4, r0 + mov r0, r7 + bl strlen + add r0, r4, r0 + add r0, r0, #1 + bl ov00_021EC3A8 + mov r4, r0 + mov r1, r5 + bl strcpy + mov r0, r4 + mov r1, r7 + bl strcat + mov r0, r6 + mov r1, r4 + bl ov00_0220AD64 + mov r0, r4 + bl ov00_021EC3D8 + mov r0, r6 + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220AC20: .word ov00_022198BC +_0220AC24: .word ov00_022198B0 +_0220AC28: .word ov00_0221989C + arm_func_end ov00_0220AB88 + + arm_func_start ov00_0220AC2C +ov00_0220AC2C: ; 0x0220AC2C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r2 + bl ov00_0220AE00 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #4] + cmp r1, #0 + bne _0220AC84 + bl ov00_0220ADE0 + ldr r1, [r4, #8] + add r1, r1, #1 + str r1, [r4, #8] + ldr r2, [r7] + ldr r0, [r0] + mla r0, r1, r0, r2 + bl _s32_div_f + bl ov00_0220AD00 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220AC84: + cmp r1, #1 + bne _0220ACF8 + bl ov00_0220ADE0 + ldr r1, [r4, #8] + mov r5, r0 + add r6, r1, #1 + mov r0, r6 + str r6, [r4, #8] + bl _dflt + ldmia r5, {r2, r3} + bl _dmul + mov r2, r0 + mov r3, r1 + ldmia r7, {r0, r1} + bl _dadd + mov r5, r0 + mov r0, r6 + mov r6, r1 + bl _dflt + mov r2, r0 + mov r3, r1 + mov r0, r5 + mov r1, r6 + bl _ddiv + bl ov00_0220AD18 + mov r1, r0 + mov r0, r4 + bl ov00_0220AD64 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220ACF8: + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220AC2C + + arm_func_start ov00_0220AD00 +ov00_0220AD00: ; 0x0220AD00 + ldr r1, _0220AD10 ; =ov00_0221B1F0 + str r0, [r1] + ldr r0, _0220AD14 ; =ov00_0221B1F0 + bx lr + .balign 4, 0 +_0220AD10: .word ov00_0221B1F0 +_0220AD14: .word ov00_0221B1F0 + arm_func_end ov00_0220AD00 + + arm_func_start ov00_0220AD18 +ov00_0220AD18: ; 0x0220AD18 + ldr r2, _0220AD2C ; =ov00_0221B1F0 + str r0, [r2, #8] + ldr r0, _0220AD30 ; =ov00_0221B1F8 + str r1, [r2, #0xc] + bx lr + .balign 4, 0 +_0220AD2C: .word ov00_0221B1F0 +_0220AD30: .word ov00_0221B1F8 + arm_func_end ov00_0220AD18 + + arm_func_start ov00_0220AD34 +ov00_0220AD34: ; 0x0220AD34 + ldrsb r3, [r0] + mov r2, r0 + cmp r3, #0 + beq _0220AD5C + mov r1, #0x2f +_0220AD48: + cmp r3, #0x5c + streqb r1, [r0] + ldrsb r3, [r0, #1]! + cmp r3, #0 + bne _0220AD48 +_0220AD5C: + mov r0, r2 + bx lr + arm_func_end ov00_0220AD34 + + arm_func_start ov00_0220AD64 +ov00_0220AD64: ; 0x0220AD64 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #4] + mov r4, r1 + cmp r0, #0 + ldreq r0, [r4] + streq r0, [r5, #0xc] + beq _0220ADD4 + cmp r0, #1 + bne _0220ADA0 + ldr r1, [r4] + ldr r0, [r4, #4] + str r1, [r5, #0xc] + str r0, [r5, #0x10] + b _0220ADD4 +_0220ADA0: + cmp r0, #2 + bne _0220ADD4 + ldr r0, [r5, #0xc] + cmp r0, #0 + beq _0220ADB8 + bl ov00_021EC3D8 +_0220ADB8: + cmp r4, #0 + moveq r0, #0 + beq _0220ADD0 + mov r0, r4 + bl ov00_021FF3D4 + bl ov00_0220AD34 +_0220ADD0: + str r0, [r5, #0xc] +_0220ADD4: + mov r0, r5 + bl ov00_0220ADE0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220AD64 + + arm_func_start ov00_0220ADE0 +ov00_0220ADE0: ; 0x0220ADE0 + cmp r0, #0 + moveq r0, #0 + bxeq lr + ldr r1, [r0, #4] + cmp r1, #2 + ldreq r0, [r0, #0xc] + addne r0, r0, #0xc + bx lr + arm_func_end ov00_0220ADE0 + + arm_func_start ov00_0220AE00 +ov00_0220AE00: ; 0x0220AE00 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + movs r5, r0 + ldreq r0, _0220AE4C ; =ov00_0221B1F0 + mov r4, r1 + ldreq r5, [r0, #4] + cmp r5, #0 + bne _0220AE34 + ldr r0, _0220AE50 ; =ov00_022198AC + ldr r1, _0220AE54 ; =ov00_022198B0 + ldr r2, _0220AE58 ; =ov00_02219888 + ldr r3, _0220AE5C ; =0x00000153 + bl __msl_assertion_failed +_0220AE34: + str r4, [sp] + ldr r0, [r5] + add r1, sp, #0 + bl ov00_021FF0C0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0220AE4C: .word ov00_0221B1F0 +_0220AE50: .word ov00_022198AC +_0220AE54: .word ov00_022198B0 +_0220AE58: .word ov00_02219888 +_0220AE5C: .word 0x00000153 + arm_func_end ov00_0220AE00 + + arm_func_start ov00_0220AE60 +ov00_0220AE60: ; 0x0220AE60 + stmdb sp!, {r3, lr} + ldr r0, _0220AEC8 ; =ov00_022198D8 + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _0220AE8C + mov r1, #2 + bl ov00_021FF82C + ldr r0, _0220AEC8 ; =ov00_022198D8 + ldr r0, [r0] + bl ov00_021FF818 +_0220AE8C: + ldr r0, _0220AEC8 ; =ov00_022198D8 + mvn r1, #0 + str r1, [r0] + bl ov00_0220B798 + ldr r0, _0220AECC ; =ov00_0221B200 + ldr r0, [r0, #0xc] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021EC3D8 + ldr r0, _0220AECC ; =ov00_0221B200 + mov r1, #0 + str r1, [r0, #0xc] + str r1, [r0, #0x2c] + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220AEC8: .word ov00_022198D8 +_0220AECC: .word ov00_0221B200 + arm_func_end ov00_0220AE60 + + arm_func_start ov00_0220AED0 +ov00_0220AED0: ; 0x0220AED0 + ldr r1, _0220AEEC ; =ov00_022198D8 + mvn r0, #0 + ldr r1, [r1] + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0220AEEC: .word ov00_022198D8 + arm_func_end ov00_0220AED0 + + arm_func_start ov00_0220AEF0 +ov00_0220AEF0: ; 0x0220AEF0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _0220B038 ; =ov00_022198D8 + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _0220B03C ; =ov00_0221B200 + ldr r1, [r1, #0x10] + cmp r1, #5 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_0220B174 + cmp r0, #0 + beq _0220B01C + mov r7, #0 + ldr sl, _0220B03C ; =ov00_0221B200 + ldr sb, _0220B038 ; =ov00_022198D8 + mov r8, #0x100 + mov r6, r7 + mov r4, r7 +_0220AF44: + ldr r1, [sl, #0x2c] + ldr r0, [sl] + sub r0, r1, r0 + cmp r0, #0x80 + bge _0220AF88 + cmp r1, #0x100 + strlt r8, [sl, #0x2c] + movge r0, r1, lsl #1 + strge r0, [sl, #0x2c] + ldr r1, [sl, #0x2c] + ldr r0, [sl, #0xc] + add r1, r1, #1 + bl ov00_021EC3BC + str r0, [sl, #0xc] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220AF88: + ldr r5, [sl] + ldr r1, [sl, #0xc] + ldr r2, [sl, #0x2c] + ldr r0, [sb] + mov r3, r7 + add r1, r1, r5 + sub r2, r2, r5 + bl ov00_021FF92C + cmp r0, #0 + bgt _0220AFBC + bl ov00_0220AE60 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220AFBC: + ldr r1, [sl] + add r1, r1, r0 + str r1, [sl] + ldr r0, [sl, #0xc] + strb r6, [r0, r1] + ldr r0, [sl, #0xc] + ldr r1, [sl] + bl ov00_0220B60C + ldr r1, [sl] + mov r5, r0 + cmp r5, r1 + streq r4, [sl] + beq _0220B00C + ldr r0, [sl, #0xc] + sub r2, r1, r5 + add r1, r0, r5 + bl memmove + ldr r0, [sl] + sub r0, r0, r5 + str r0, [sl] +_0220B00C: + ldr r0, [sb] + bl ov00_0220B174 + cmp r0, #0 + bne _0220AF44 +_0220B01C: + ldr r1, _0220B038 ; =ov00_022198D8 + mvn r0, #0 + ldr r1, [r1] + cmp r1, r0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0220B038: .word ov00_022198D8 +_0220B03C: .word ov00_0221B200 + arm_func_end ov00_0220AEF0 + + arm_func_start ov00_0220B040 +ov00_0220B040: ; 0x0220B040 + stmdb sp!, {r4, lr} + ldr r2, _0220B084 ; =ov00_022198D8 + cmp r1, #0 + ldr r4, [r2, #8] + mov lr, #0 + ldmleia sp!, {r4, pc} +_0220B058: + ldrsb ip, [r0, lr] + ldrsb r3, [r4] + eor r3, ip, r3 + strb r3, [r0, lr] + ldrsb r3, [r4, #1]! + add lr, lr, #1 + cmp r3, #0 + ldreq r4, [r2, #8] + cmp lr, r1 + blt _0220B058 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220B084: .word ov00_022198D8 + arm_func_end ov00_0220B040 + + arm_func_start ov00_0220B088 +ov00_0220B088: ; 0x0220B088 + stmdb sp!, {r4, lr} + sub sp, sp, #0x100 + ldr lr, _0220B14C ; =ov00_022162E7 + add ip, sp, #0 + mov r4, r0 + mov r3, #0x80 +_0220B0A0: + ldrb r2, [lr] + ldrb r0, [lr, #1] + add lr, lr, #2 + strb r2, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r3, r3, #1 + bne _0220B0A0 + ldr r2, _0220B150 ; =ov00_0221B200 + add r0, sp, #0 + ldr r3, [r2, #0x24] + eor r3, r3, #1 + str r3, [r2, #0x24] + bl strcat + ldr r1, _0220B154 ; =ov00_02219948 + add r0, sp, #0 + bl strcat + add r1, sp, #0 + mov r0, r4 + bl strstr + movs r4, r0 + addeq sp, sp, #0x100 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, sp, #0 + bl strlen + ldr r1, _0220B150 ; =ov00_0221B200 + ldr r2, _0220B158 ; =ov00_0221B230 + ldr r1, [r1, #0x24] + add r3, r4, r0 + add r0, r2, r1, lsl #8 + mov r2, r0 + b _0220B12C +_0220B124: + ldrsb r1, [r3], #1 + strb r1, [r2], #1 +_0220B12C: + ldrsb r1, [r3] + cmp r1, #0 + cmpne r1, #0x5c + bne _0220B124 + mov r1, #0 + strb r1, [r2] + add sp, sp, #0x100 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220B14C: .word ov00_022162E7 +_0220B150: .word ov00_0221B200 +_0220B154: .word ov00_02219948 +_0220B158: .word ov00_0221B230 + arm_func_end ov00_0220B088 + + arm_func_start ov00_0220B15C +ov00_0220B15C: ; 0x0220B15C + stmdb sp!, {r3, lr} + bl ov00_0220B088 + cmp r0, #0 + ldreq r0, _0220B170 ; =ov00_02219944 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220B170: .word ov00_02219944 + arm_func_end ov00_0220B15C + + arm_func_start ov00_0220B174 +ov00_0220B174: ; 0x0220B174 + ldr ip, _0220B17C ; =ov00_021FF694 + bx ip + .balign 4, 0 +_0220B17C: .word ov00_021FF694 + arm_func_end ov00_0220B174 + + arm_func_start ov00_0220B180 +ov00_0220B180: ; 0x0220B180 + sub r3, r1, #6 + mov r2, r0 + cmp r3, #0 + ble _0220B1E0 +_0220B190: + ldrsb r1, [r2] + cmp r1, #0x5c + ldreqsb r1, [r2, #1] + cmpeq r1, #0x66 + ldreqsb r1, [r2, #2] + cmpeq r1, #0x69 + ldreqsb r1, [r2, #3] + cmpeq r1, #0x6e + ldreqsb r1, [r2, #4] + cmpeq r1, #0x61 + ldreqsb r1, [r2, #5] + cmpeq r1, #0x6c + ldreqsb r1, [r2, #6] + cmpeq r1, #0x5c + moveq r0, r2 + bxeq lr + add r2, r2, #1 + sub r1, r2, r0 + cmp r1, r3 + blt _0220B190 +_0220B1E0: + mov r0, #0 + bx lr + arm_func_end ov00_0220B180 + + arm_func_start ov00_0220B1E8 +ov00_0220B1E8: ; 0x0220B1E8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, _0220B268 ; =ov00_0221B200 + mov r7, r0 + ldr r0, [r3, #4] + mov r6, r1 + cmp r0, #0 + mov r5, r2 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r4, #0 + bl ArrayLength + cmp r0, #0 + ble _0220B260 + ldr r8, _0220B268 ; =ov00_0221B200 +_0220B220: + ldr r0, [r8, #4] + mov r1, r4 + bl ov00_021FE6EC + ldr r1, [r0] + cmp r1, r7 + ldreq r1, [r0, #4] + cmpeq r1, r6 + ldreq r0, [r0, #8] + cmpeq r0, r5 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r8, #4] + add r4, r4, #1 + bl ArrayLength + cmp r4, r0 + blt _0220B220 +_0220B260: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220B268: .word ov00_0221B200 + arm_func_end ov00_0220B1E8 + + arm_func_start ov00_0220B26C +ov00_0220B26C: ; 0x0220B26C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r1, _0220B30C ; =ov00_0221994C + mov r6, r0 + bl ov00_0220B15C + bl atoi + mov r5, r0 + ldr r1, _0220B310 ; =ov00_02219954 + mov r0, r6 + bl ov00_0220B15C + bl atoi + mov r4, r0 + ldr r1, _0220B314 ; =ov00_02219958 + mov r0, r6 + bl ov00_0220B15C + mov r6, r0 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_0220B1E8 + mov r4, r0 + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, _0220B318 ; =ov00_0221B200 + mov r1, r4 + ldr r0, [r0, #4] + bl ov00_021FE6EC + cmp r5, #0 + movgt r1, #1 + str r5, [r0, #8] + mov r2, #0 + movle r1, #0 + mov r0, r4 + mov r3, r6 + str r2, [sp] + bl ov00_0220B694 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0220B30C: .word ov00_0221994C +_0220B310: .word ov00_02219954 +_0220B314: .word ov00_02219958 +_0220B318: .word ov00_0221B200 + arm_func_end ov00_0220B26C + + arm_func_start ov00_0220B31C +ov00_0220B31C: ; 0x0220B31C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0220B39C ; =ov00_02219960 + mov r5, r0 + bl ov00_0220B15C + bl atoi + mov r4, r0 + ldr r1, _0220B3A0 ; =ov00_02219954 + mov r0, r5 + bl ov00_0220B15C + bl atoi + mov r1, r0 + mov r0, #3 + mov r2, #0 + bl ov00_0220B1E8 + mov r5, r0 + mvn r0, #0 + cmp r5, r0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _0220B3A4 ; =ov00_0221B200 + mov r1, r5 + ldr r0, [r0, #4] + bl ov00_021FE6EC + cmp r4, #0 + movgt r1, #1 + mov r2, #0 + str r4, [r0, #8] + movle r1, #0 + mov r0, r5 + mov r3, r2 + str r2, [sp] + bl ov00_0220B694 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220B39C: .word ov00_02219960 +_0220B3A0: .word ov00_02219954 +_0220B3A4: .word ov00_0221B200 + arm_func_end ov00_0220B31C + + arm_func_start ov00_0220B3A8 +ov00_0220B3A8: ; 0x0220B3A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + ldr r1, _0220B470 ; =ov00_02219968 + mov r4, r0 + bl ov00_0220B15C + bl atoi + mov r7, r0 + ldr r1, _0220B474 ; =ov00_02219954 + mov r0, r4 + bl ov00_0220B15C + bl atoi + mov r6, r0 + ldr r1, _0220B478 ; =ov00_02219970 + mov r0, r4 + bl ov00_0220B15C + bl atoi + mov r5, r0 + ldr r1, _0220B47C ; =ov00_02219974 + mov r0, r4 + bl ov00_0220B15C + bl atoi + mov r8, r0 + mov r1, r6 + mov r2, r5 + mov r0, #1 + bl ov00_0220B1E8 + mov r5, r0 + mvn r0, #0 + cmp r5, r0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, _0220B480 ; =ov00_02219978 + mov r0, r4 + bl ov00_0220B15C + bl atoi + mov r6, r0 + ldr r1, _0220B484 ; =ov00_02219980 + mov r0, r4 + bl strstr + cmp r0, #0 + ldreq r3, _0220B488 ; =ov00_02219944 + moveq r6, #0 + addne r3, r0, #6 + mov r0, r5 + mov r1, r7 + mov r2, r8 + str r6, [sp] + bl ov00_0220B694 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220B470: .word ov00_02219968 +_0220B474: .word ov00_02219954 +_0220B478: .word ov00_02219970 +_0220B47C: .word ov00_02219974 +_0220B480: .word ov00_02219978 +_0220B484: .word ov00_02219980 +_0220B488: .word ov00_02219944 + arm_func_end ov00_0220B3A8 + + arm_func_start ov00_0220B48C +ov00_0220B48C: ; 0x0220B48C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _0220B514 ; =ov00_02219988 + mov r7, r0 + bl ov00_0220B15C + bl atoi + mov r6, r0 + ldr r1, _0220B518 ; =ov00_02219970 + mov r0, r7 + bl ov00_0220B15C + bl atoi + mov r5, r0 + ldr r1, _0220B51C ; =ov00_02219954 + mov r0, r7 + bl ov00_0220B15C + bl atoi + mov r4, r0 + ldr r1, _0220B520 ; =ov00_02219974 + mov r0, r7 + bl ov00_0220B15C + bl atoi + mov r1, r4 + mov r4, r0 + mov r2, r5 + mov r0, #2 + bl ov00_0220B1E8 + mvn r1, #0 + cmp r0, r1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r3, #0 + mov r1, r6 + mov r2, r4 + str r3, [sp] + bl ov00_0220B694 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220B514: .word ov00_02219988 +_0220B518: .word ov00_02219970 +_0220B51C: .word ov00_02219954 +_0220B520: .word ov00_02219974 + arm_func_end ov00_0220B48C + + arm_func_start ov00_0220B524 +ov00_0220B524: ; 0x0220B524 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, _0220B5FC ; =ov00_02219990 + mov r5, r0 + mov r3, #0 + mov r2, #8 + strb r3, [r5, r4] + bl strncmp + cmp r0, #0 + bne _0220B55C + mov r0, r5 + mov r1, r4 + bl ov00_0220B26C + ldmia sp!, {r3, r4, r5, pc} +_0220B55C: + ldr r1, _0220B600 ; =ov00_0221999C + mov r0, r5 + mov r2, #9 + bl strncmp + cmp r0, #0 + bne _0220B584 + mov r0, r5 + mov r1, r4 + bl ov00_0220B31C + ldmia sp!, {r3, r4, r5, pc} +_0220B584: + ldr r1, _0220B600 ; =ov00_0221999C + mov r0, r5 + mov r2, #9 + bl strncmp + cmp r0, #0 + bne _0220B5AC + mov r0, r5 + mov r1, r4 + bl ov00_0220B31C + ldmia sp!, {r3, r4, r5, pc} +_0220B5AC: + ldr r1, _0220B604 ; =ov00_022199A8 + mov r0, r5 + mov r2, #8 + bl strncmp + cmp r0, #0 + bne _0220B5D4 + mov r0, r5 + mov r1, r4 + bl ov00_0220B3A8 + ldmia sp!, {r3, r4, r5, pc} +_0220B5D4: + ldr r1, _0220B608 ; =ov00_022199B4 + mov r0, r5 + mov r2, #8 + bl strncmp + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov00_0220B48C + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220B5FC: .word ov00_02219990 +_0220B600: .word ov00_0221999C +_0220B604: .word ov00_022199A8 +_0220B608: .word ov00_022199B4 + arm_func_end ov00_0220B524 + + arm_func_start ov00_0220B60C +ov00_0220B60C: ; 0x0220B60C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sb, r1 + mov sl, r0 + mov r7, sb + bl ov00_0220B180 + mov r6, r0 + ldr r5, _0220B68C ; =ov00_02219924 + ldr r4, _0220B690 ; =ov00_022198D8 + b _0220B674 +_0220B630: + sub r8, r6, sl + mov r0, sl + mov r1, r8 + str r5, [r4, #8] + bl ov00_0220B040 + mov r0, sl + mov r1, r8 + bl ov00_0220B524 + add r0, r8, #7 + sub sb, sb, r0 + cmp sb, #0 + add sl, r6, #7 + ble _0220B674 + mov r0, sl + mov r1, sb + bl ov00_0220B180 + mov r6, r0 +_0220B674: + cmp sb, #0 + ble _0220B684 + cmp r6, #0 + bne _0220B630 +_0220B684: + sub r0, r7, sb + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0220B68C: .word ov00_02219924 +_0220B690: .word ov00_022198D8 + arm_func_end ov00_0220B60C + + arm_func_start ov00_0220B694 +ov00_0220B694: ; 0x0220B694 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + addmi sp, sp, #0x14 + ldmmiia sp!, {r4, r5, r6, r7, pc} + ldr r0, _0220B794 ; =ov00_0221B200 + ldr r0, [r0, #4] + bl ArrayLength + cmp r7, r0 + addge sp, sp, #0x14 + ldmgeia sp!, {r4, r5, r6, r7, pc} + ldr r0, _0220B794 ; =ov00_0221B200 + mov r1, r7 + ldr r0, [r0, #4] + bl ov00_021FE6EC + mov r3, r0 + ldr ip, [r3, #0x18] + cmp ip, #0 + beq _0220B77C + ldr r0, [r3] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0220B77C +_0220B6FC: ; jump table + b _0220B70C ; case 0 + b _0220B728 ; case 1 + b _0220B750 ; case 2 + b _0220B76C ; case 3 +_0220B70C: + ldr r0, [r3, #0x14] + mov r2, r6 + str r0, [sp] + ldmib r3, {r0, r1} + mov r3, r4 + blx ip + b _0220B77C +_0220B728: + str r6, [sp] + str r5, [sp, #4] + ldr r0, [sp, #0x28] + str r4, [sp, #8] + str r0, [sp, #0xc] + ldr r0, [r3, #0x14] + str r0, [sp, #0x10] + ldmib r3, {r0, r1, r2, r3} + blx ip + b _0220B77C +_0220B750: + str r6, [sp] + str r5, [sp, #4] + ldr r0, [r3, #0x14] + str r0, [sp, #8] + ldmib r3, {r0, r1, r2, r3} + blx ip + b _0220B77C +_0220B76C: + ldmib r3, {r0, r1} + ldr r3, [r3, #0x14] + mov r2, r6 + blx ip +_0220B77C: + ldr r0, _0220B794 ; =ov00_0221B200 + mov r1, r7 + ldr r0, [r0, #4] + bl ov00_021FE968 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220B794: .word ov00_0221B200 + arm_func_end ov00_0220B694 + + arm_func_start ov00_0220B798 +ov00_0220B798: ; 0x0220B798 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x24 + ldr r0, _0220B87C ; =ov00_0221B200 + ldr r0, [r0, #4] + cmp r0, #0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + bl ArrayLength + subs r4, r0, #1 + bmi _0220B85C + ldr r5, _0220B880 ; =ov00_02216164 + add r3, sp, #4 + mov r2, #8 +_0220B7CC: + ldrb r1, [r5] + ldrb r0, [r5, #1] + add r5, r5, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0220B7CC + ldr sb, _0220B884 ; =ov00_02219934 + ldr r5, _0220B888 ; =ov00_022198D8 + add r8, sp, #0x14 + mov r7, #0xf + mov r6, #0 +_0220B800: + add ip, sp, #4 + add r3, sp, #0x14 + mov r2, #8 +_0220B80C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0220B80C + mov r0, r8 + mov r1, r7 + str sb, [r5, #8] + bl ov00_0220B040 + mov r0, r4 + mov r1, r6 + mov r2, r6 + mov r3, r8 + str r6, [sp] + bl ov00_0220B694 + subs r4, r4, #1 + bpl _0220B800 +_0220B85C: + ldr r0, _0220B87C ; =ov00_0221B200 + ldr r0, [r0, #4] + bl ov00_021FE678 + ldr r0, _0220B87C ; =ov00_0221B200 + mov r1, #0 + str r1, [r0, #4] + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0220B87C: .word ov00_0221B200 +_0220B880: .word ov00_02216164 +_0220B884: .word ov00_02219934 +_0220B888: .word ov00_022198D8 + arm_func_end ov00_0220B798 + + arm_func_start ov00_0220B88C +ov00_0220B88C: ; 0x0220B88C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldreq r0, _0220B8B8 ; =ov00_0221B200 + ldreq r0, [r0, #0x28] + cmp r0, #0 + moveq r0, r1 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x20] + bl ov00_021FE6EC + ldr r0, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220B8B8: .word ov00_0221B200 + arm_func_end ov00_0220B88C + + arm_func_start ov00_0220B8BC +ov00_0220B8BC: ; 0x0220B8BC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldreq r0, _0220B8E8 ; =ov00_0221B200 + ldreq r0, [r0, #0x28] + cmp r0, #0 + moveq r0, r1 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x1c] + bl ov00_021FE6EC + ldr r0, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220B8E8: .word ov00_0221B200 + arm_func_end ov00_0220B8BC + + arm_func_start ov00_0220B8EC +ov00_0220B8EC: ; 0x0220B8EC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + ldreq r0, _0220B950 ; =ov00_0221B200 + mov r4, r1 + ldreq r5, [r0, #0x28] + mov r3, r2 + cmp r5, #0 + addeq r0, sp, #0x1c + beq _0220B940 + ldr r0, [r5, #0xc] + add r2, sp, #0x1c + mov r1, r4 + blx r3 + cmp r0, #0 + bne _0220B940 + ldr r0, [r5, #0xc] + add r3, sp, #0x1c + mov r1, r4 + mov r2, #0 + bl ov00_0220A8A4 +_0220B940: + ldr r0, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0220B950: .word ov00_0221B200 + arm_func_end ov00_0220B8EC + + arm_func_start ov00_0220B954 +ov00_0220B954: ; 0x0220B954 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + ldreq r0, _0220B9C0 ; =ov00_0221B200 + mov r4, r1 + ldreq r5, [r0, #0x28] + mov r3, r2 + cmp r5, #0 + addeq r0, sp, #0x1c + beq _0220B9A8 + ldr r0, [r5, #0xc] + add r2, sp, #0x1c + mov r1, r4 + blx r3 + cmp r0, #0 + bne _0220B9A8 + ldr r0, [r5, #0xc] + add r3, sp, #0x1c + mov r1, r4 + mov r2, #1 + bl ov00_0220A8A4 +_0220B9A8: + ldr r2, [r0] + ldr r1, [r0, #4] + mov r0, r2 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0220B9C0: .word ov00_0221B200 + arm_func_end ov00_0220B954 + + arm_func_start ov00_0220B9C4 +ov00_0220B9C4: ; 0x0220B9C4 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + ldreq r0, _0220BA1C ; =ov00_0221B200 + mov r5, r1 + ldreq r6, [r0, #0x28] + mov r4, r3 + cmp r6, #0 + mov ip, r2 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r6, #0xc] + mov r1, r5 + mov r2, r4 + blx ip + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r6, #0xc] + mov r1, r5 + mov r3, r4 + mov r2, #2 + bl ov00_0220A8A4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220BA1C: .word ov00_0221B200 + arm_func_end ov00_0220B9C4 + + arm_func_start ov00_0220BA20 +ov00_0220BA20: ; 0x0220BA20 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r6, r1 + ldr r1, [sp, #0x58] + mov r7, r0 + mov r5, r2 + mov r4, r3 + bl ov00_0220B88C + mov r3, r0 + ldr r1, _0220BA78 ; =ov00_022199C0 + add r0, sp, #4 + mov r2, r6 + bl sprintf + ldr ip, [sp, #0x58] + mov r0, r7 + mov r2, r5 + mov r3, r4 + add r1, sp, #4 + str ip, [sp] + bl ov00_0220B8EC + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220BA78: .word ov00_022199C0 + arm_func_end ov00_0220BA20 + + arm_func_start ov00_0220BA7C +ov00_0220BA7C: ; 0x0220BA7C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x48 + mov r7, r1 + ldr r1, [sp, #0x64] + mov r8, r0 + mov r6, r2 + mov r5, r3 + ldr r4, [sp, #0x60] + bl ov00_0220B88C + mov r3, r0 + ldr r1, _0220BAD8 ; =ov00_022199C0 + add r0, sp, #8 + mov r2, r7 + bl sprintf + ldr ip, [sp, #0x64] + mov r3, r5 + mov r0, r8 + mov r2, r6 + add r1, sp, #8 + stmia sp, {r4, ip} + bl ov00_0220B954 + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220BAD8: .word ov00_022199C0 + arm_func_end ov00_0220BA7C + + arm_func_start ov00_0220BADC +ov00_0220BADC: ; 0x0220BADC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r6, r1 + ldr r1, [sp, #0x58] + mov r7, r0 + mov r5, r2 + mov r4, r3 + bl ov00_0220B88C + mov r3, r0 + ldr r1, _0220BB34 ; =ov00_022199C0 + add r0, sp, #4 + mov r2, r6 + bl sprintf + ldr ip, [sp, #0x58] + mov r0, r7 + mov r2, r5 + mov r3, r4 + add r1, sp, #4 + str ip, [sp] + bl ov00_0220B9C4 + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220BB34: .word ov00_022199C0 + arm_func_end ov00_0220BADC + + arm_func_start ov00_0220BB38 +ov00_0220BB38: ; 0x0220BB38 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r6, r1 + ldr r1, [sp, #0x58] + mov r7, r0 + mov r5, r2 + mov r4, r3 + bl ov00_0220B8BC + mov r3, r0 + ldr r1, _0220BB90 ; =ov00_022199C8 + add r0, sp, #4 + mov r2, r6 + bl sprintf + ldr ip, [sp, #0x58] + mov r0, r7 + mov r2, r5 + mov r3, r4 + add r1, sp, #4 + str ip, [sp] + bl ov00_0220B8EC + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220BB90: .word ov00_022199C8 + arm_func_end ov00_0220BB38 + + arm_func_start ov00_0220BB94 +ov00_0220BB94: ; 0x0220BB94 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x48 + mov r7, r1 + ldr r1, [sp, #0x64] + mov r8, r0 + mov r6, r2 + mov r5, r3 + ldr r4, [sp, #0x60] + bl ov00_0220B8BC + mov r3, r0 + ldr r1, _0220BBF0 ; =ov00_022199C8 + add r0, sp, #8 + mov r2, r7 + bl sprintf + ldr ip, [sp, #0x64] + mov r3, r5 + mov r0, r8 + mov r2, r6 + add r1, sp, #8 + stmia sp, {r4, ip} + bl ov00_0220B954 + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220BBF0: .word ov00_022199C8 + arm_func_end ov00_0220BB94 + + arm_func_start ov00_0220BBF4 +ov00_0220BBF4: ; 0x0220BBF4 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r6, r1 + ldr r1, [sp, #0x58] + mov r7, r0 + mov r5, r2 + mov r4, r3 + bl ov00_0220B8BC + mov r3, r0 + ldr r1, _0220BC4C ; =ov00_022199C8 + add r0, sp, #4 + mov r2, r6 + bl sprintf + ldr ip, [sp, #0x58] + mov r0, r7 + mov r2, r5 + mov r3, r4 + add r1, sp, #4 + str ip, [sp] + bl ov00_0220B9C4 + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220BC4C: .word ov00_022199C8 + arm_func_end ov00_0220BBF4 + + arm_func_start ov00_0220BC50 +ov00_0220BC50: ; 0x0220BC50 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldrb r5, [r0] + mov lr, #0 + mov r4, #1 + and r6, r5, #1 + mov r3, lr + mov ip, r4 + mov r1, lr + mov r2, r4 +_0220BC74: + add r7, r0, r4 + ldrb sl, [r7, #-1] + cmp sl, r5 + eor sl, r4, sl + movlo r8, ip + and sl, sl, #1 + movhs r8, r3 + cmp r5, #0x4f + movlo sb, r2 + eor sl, lr, sl + movhs sb, r1 + eor sl, r6, sl + eor sb, sl, sb + eors lr, sb, r8 + beq _0220BCBC + ldrb r8, [r7] + tst r8, #1 + beq _0220BCD0 +_0220BCBC: + cmp lr, #0 + ldreqb r7, [r7] + andeq r7, r7, #1 + cmpeq r7, #1 + bne _0220BCD8 +_0220BCD0: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220BCD8: + add r4, r4, #1 + cmp r4, #0x20 + blt _0220BC74 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov00_0220BC50 + + arm_func_start ov00_0220BCEC +ov00_0220BCEC: ; 0x0220BCEC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + bne _0220BD0C + ldr r0, _0220BDF8 ; =ov00_02219A08 + ldr r1, _0220BDFC ; =ov00_02219A10 + ldr r2, _0220BE00 ; =ov00_022199D0 + mov r3, #0x2b + bl __msl_assertion_failed +_0220BD0C: + bl ov00_021FF368 + bl srand + bl rand + ldr r5, _0220BE04 ; =0x2C0B02C1 + mov r1, r0, lsr #0x1f + smull r2, r4, r5, r0 + mov r8, #0 + mov r7, #1 + add r4, r1, r4, asr #4 + mov r3, #0x5d + smull r1, r2, r3, r4 + sub r4, r0, r1 + add r0, r4, #0x21 + strb r0, [sl] + mov fp, r8 + mov r6, r7 + mov r4, r3 +_0220BD50: + add sb, sl, r7 + ldrb r3, [sb, #-1] + ldrb r0, [sl] + cmp r3, r0 + eor r3, r7, r3 + movlo r1, r6 + and r3, r3, #1 + movhs r1, fp + cmp r0, #0x4f + movlo r2, #1 + and r0, r0, #1 + eor r3, r8, r3 + movhs r2, #0 + eor r0, r0, r3 + eor r0, r0, r2 + eor r8, r0, r1 + bl rand + smull r2, r3, r5, r0 + mov r1, r0, lsr #0x1f + add r3, r1, r3, asr #4 + smull r1, r2, r4, r3 + sub r3, r0, r1 + add r0, r3, #0x21 + cmp r8, #0 + strb r0, [sb] + beq _0220BDC4 + ldrb r0, [sb] + tst r0, #1 + beq _0220BDD8 +_0220BDC4: + cmp r8, #0 + ldreqb r0, [sb] + andeq r0, r0, #1 + cmpeq r0, #1 + bne _0220BDE4 +_0220BDD8: + ldrb r0, [sb] + add r0, r0, #1 + strb r0, [sb] +_0220BDE4: + add r7, r7, #1 + cmp r7, #0x20 + blt _0220BD50 + mov r0, sl + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0220BDF8: .word ov00_02219A08 +_0220BDFC: .word ov00_02219A10 +_0220BE00: .word ov00_022199D0 +_0220BE04: .word 0x2C0B02C1 + arm_func_end ov00_0220BCEC + + arm_func_start ov00_0220BE08 +ov00_0220BE08: ; 0x0220BE08 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r5, r0 + ldr r0, _0220BF08 ; =ov00_022199E4 + mov r4, r1 + bl strlen + mov r7, r0 + mov r0, r4 + bl ov00_0220BC50 + mov sl, #0 + mov fp, r0 + mov r8, sl +_0220BE34: + cmp fp, #0 + cmpne sl, #0 + cmpne sl, #0xd + bne _0220BE6C + bl rand + ldr r1, _0220BF0C ; =0x2C0B02C1 + mov r2, r0, lsr #0x1f + smull r3, r6, r1, r0 + add r6, r2, r6, asr #4 + mov r1, #0x5d + smull r2, r3, r1, r6 + sub r6, r0, r2 + add r0, r6, #0x21 + b _0220BEE8 +_0220BE6C: + cmp sl, #1 + cmpne sl, #0xe + ldreqsb r6, [r4, sl] + addne r0, r4, sl + ldrb sb, [r4, sl] + ldrnesb r6, [r0, #-1] + mov r1, r7 + add r0, sl, sb + bl _s32_div_f + mul r0, r6, r8 + mov r6, r1 + mov r1, r7 + bl _s32_div_f + ldr r0, _0220BF08 ; =ov00_022199E4 + ldrsb r3, [r0, r6] + ldrsb r2, [r0, r1] + mla r0, sl, sb, r3 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #27 + add r0, r1, r0, ror #27 + ldrb r0, [r4, r0] + eor r0, r0, r2 + bl abs + ldr r1, _0220BF0C ; =0x2C0B02C1 + smull r2, r3, r1, r0 + mov r1, r0, lsr #0x1f + add r3, r1, r3, asr #4 + mov r1, #0x5d + smull r2, r3, r1, r3 + sub r3, r0, r2 + add r0, r3, #0x21 +_0220BEE8: + strb r0, [r5, sl] + add r0, r8, #0x47 + add sl, sl, #1 + cmp sl, #0x20 + add r8, r0, #0x4600 + blt _0220BE34 + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0220BF08: .word ov00_022199E4 +_0220BF0C: .word 0x2C0B02C1 + arm_func_end ov00_0220BE08 + + arm_func_start ov00_0220BF10 +ov00_0220BF10: ; 0x0220BF10 + mov ip, #0 +_0220BF14: + cmp ip, #0 + cmpne ip, #0xd + ldrneb r3, [r0, ip] + ldrneb r2, [r1, ip] + cmpne r3, r2 + movne r0, #0 + bxne lr + add ip, ip, #1 + cmp ip, #0x20 + blt _0220BF14 + mov r0, #1 + bx lr + arm_func_end ov00_0220BF10 + + arm_func_start ov00_0220BF44 +ov00_0220BF44: ; 0x0220BF44 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl ov00_021EC3A8 + str r0, [r5] + cmp r0, #0 + moveq r0, #0 + strne r4, [r5, #4] + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220BF44 + + arm_func_start ov00_0220BF70 +ov00_0220BF70: ; 0x0220BF70 + ldr r1, [r0, #4] + ldr r0, [r0, #8] + sub r0, r1, r0 + bx lr + arm_func_end ov00_0220BF70 + + arm_func_start ov00_0220BF80 +ov00_0220BF80: ; 0x0220BF80 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldmib r5, {r0, r2} + mov r4, r1 + cmp r2, r0 + blt _0220BFAC + ldr r0, _0220BFC4 ; =ov00_02219A70 + ldr r1, _0220BFC8 ; =ov00_02219A8C + ldr r2, _0220BFCC ; =ov00_02219A44 + mov r3, #0x23 + bl __msl_assertion_failed +_0220BFAC: + ldr r1, [r5, #8] + add r0, r1, #1 + str r0, [r5, #8] + ldr r0, [r5] + strb r4, [r0, r1] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220BFC4: .word ov00_02219A70 +_0220BFC8: .word ov00_02219A8C +_0220BFCC: .word ov00_02219A44 + arm_func_end ov00_0220BF80 + + arm_func_start ov00_0220BFD0 +ov00_0220BFD0: ; 0x0220BFD0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldmib r5, {r0, r2} + add r2, r2, #2 + mov r4, r1 + cmp r2, r0 + ble _0220C000 + ldr r0, _0220C030 ; =ov00_02219A98 + ldr r1, _0220C034 ; =ov00_02219A8C + ldr r2, _0220C038 ; =ov00_02219A58 + mov r3, #0x2e + bl __msl_assertion_failed +_0220C000: + ldr r2, [r5, #8] + mov r1, r4, asr #8 + add r0, r2, #1 + str r0, [r5, #8] + ldr r0, [r5] + strb r1, [r0, r2] + ldr r1, [r5, #8] + add r0, r1, #1 + str r0, [r5, #8] + ldr r0, [r5] + strb r4, [r0, r1] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220C030: .word ov00_02219A98 +_0220C034: .word ov00_02219A8C +_0220C038: .word ov00_02219A58 + arm_func_end ov00_0220BFD0 + + arm_func_start ov00_0220C03C +ov00_0220C03C: ; 0x0220C03C + stmdb sp!, {r4, r5, r6, lr} + movs r5, r1 + mov r4, r2 + mov r6, r0 + cmpne r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mvn r0, #0 + cmp r4, r0 + bne _0220C06C + mov r0, r5 + bl strlen + mov r4, r0 +_0220C06C: + ldmib r6, {r0, r1} + add r1, r1, r4 + cmp r1, r0 + ble _0220C090 + ldr r0, _0220C0B8 ; =ov00_02219ABC + ldr r1, _0220C0BC ; =ov00_02219A8C + ldr r2, _0220C0C0 ; =ov00_02219A30 + mov r3, #0x40 + bl __msl_assertion_failed +_0220C090: + ldr r3, [r6] + ldr r0, [r6, #8] + mov r1, r5 + mov r2, r4 + add r0, r3, r0 + bl memcpy + ldr r0, [r6, #8] + add r0, r0, r4 + str r0, [r6, #8] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220C0B8: .word ov00_02219ABC +_0220C0BC: .word ov00_02219A8C +_0220C0C0: .word ov00_02219A30 + arm_func_end ov00_0220C03C + + arm_func_start ov00_0220C0C4 +ov00_0220C0C4: ; 0x0220C0C4 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mvn r1, #0 + mov r6, r0 + cmp r5, r1 + ldreq r0, [r6, #8] + mov r4, r2 + subeq r5, r0, r4 + ldr r0, [r6, #8] + cmp r5, r0 + ble _0220C104 + ldr r0, _0220C154 ; =ov00_02219AE0 + ldr r1, _0220C158 ; =ov00_02219A8C + ldr r2, _0220C15C ; =ov00_02219A1C + mov r3, #0x4f + bl __msl_assertion_failed +_0220C104: + ldr r0, [r6, #8] + sub r0, r0, r5 + cmp r4, r0 + ble _0220C128 + ldr r0, _0220C160 ; =ov00_02219AF8 + ldr r1, _0220C158 ; =ov00_02219A8C + ldr r2, _0220C15C ; =ov00_02219A1C + mov r3, #0x50 + bl __msl_assertion_failed +_0220C128: + ldr r0, [r6] + ldr r1, [r6, #8] + add r0, r0, r5 + sub r2, r1, r5 + add r1, r0, r4 + sub r2, r2, r4 + bl memmove + ldr r0, [r6, #8] + sub r0, r0, r4 + str r0, [r6, #8] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220C154: .word ov00_02219AE0 +_0220C158: .word ov00_02219A8C +_0220C15C: .word ov00_02219A1C +_0220C160: .word ov00_02219AF8 + arm_func_end ov00_0220C0C4 + + arm_func_start ov00_0220C164 +ov00_0220C164: ; 0x0220C164 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0220C184 + ldr r0, _0220C1F4 ; =ov00_02219C10 + ldr r1, _0220C1F8 ; =ov00_02219C18 + ldr r2, _0220C1FC ; =ov00_02219BA0 + mov r3, #0x1b + bl __msl_assertion_failed +_0220C184: + cmp r4, #0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0x24] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #0x1c] + mov r0, r4 + add r1, r1, #1 + str r1, [r4, #0x1c] + ldr r1, [r4, #0x24] + blx r1 + ldr r0, [r4, #0x1c] + sub r0, r0, #1 + str r0, [r4, #0x1c] + ldr r0, [r4, #0x14] + cmp r0, #0 + beq _0220C1EC + ldr r0, [r4, #0x1c] + cmp r0, #0 + bne _0220C1EC + mov r0, r4 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r4, pc} +_0220C1EC: + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220C1F4: .word ov00_02219C10 +_0220C1F8: .word ov00_02219C18 +_0220C1FC: .word ov00_02219BA0 + arm_func_end ov00_0220C164 + + arm_func_start ov00_0220C200 +ov00_0220C200: ; 0x0220C200 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r6, r1 + movs r7, r0 + mov r5, r2 + mov r4, r3 + cmpne r6, #0 + bne _0220C234 + ldr r0, _0220C310 ; =ov00_02219C28 + ldr r1, _0220C314 ; =ov00_02219C18 + ldr r2, _0220C318 ; =ov00_02219BD4 + mov r3, #0x3d + bl __msl_assertion_failed +_0220C234: + cmp r7, #0 + cmpne r6, #0 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r7, #0x20] + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r1, [r7, #0x1c] + ldr r0, [sp, #0x28] + add r1, r1, #1 + cmp r0, #0 + ldrne r0, [sp, #0x24] + str r1, [r7, #0x1c] + ldr r2, [r6, #0x24] + cmpne r0, #0 + moveq r0, #0 + streq r0, [sp, #0x24] + streq r0, [sp, #0x28] + add r2, r2, #1 + str r2, [r6, #0x24] + ldr r0, [sp, #0x20] + ldr r1, [sp, #0x24] + str r0, [sp] + str r1, [sp, #4] + ldr r0, [sp, #0x28] + mov r1, r6 + str r0, [sp, #8] + ldr ip, [r7, #0x20] + mov r0, r7 + mov r2, r5 + mov r3, r4 + blx ip + ldr r0, [r7, #0x1c] + sub r0, r0, #1 + str r0, [r7, #0x1c] + ldr r0, [r6, #0x24] + sub r0, r0, #1 + str r0, [r6, #0x24] + ldr r0, [r7, #0x14] + cmp r0, #0 + beq _0220C304 + ldr r0, [r7, #0x1c] + cmp r0, #0 + bne _0220C304 + mov r0, r7 + bl ov00_0220F144 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220C304: + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C310: .word ov00_02219C28 +_0220C314: .word ov00_02219C18 +_0220C318: .word ov00_02219BD4 + arm_func_end ov00_0220C200 + + arm_func_start ov00_0220C31C +ov00_0220C31C: ; 0x0220C31C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0220C348 + ldr r0, _0220C3F8 ; =ov00_02219C40 + ldr r1, _0220C3FC ; =ov00_02219C18 + ldr r2, _0220C400 ; =ov00_02219B70 + mov r3, #0x69 + bl __msl_assertion_failed +_0220C348: + cmp r7, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + str r6, [r7, #0x18] + ldr r0, [r7, #0x28] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r7, #0x24] + cmp r4, #0 + add r1, r1, #1 + str r1, [r7, #0x24] + ldr ip, [r7, #8] + cmpne r5, #0 + ldr r3, [ip, #0x1c] + moveq r5, #0 + add r3, r3, #1 + str r3, [ip, #0x1c] + moveq r4, r5 + mov r2, r5 + ldr r5, [r7, #0x28] + mov r0, r7 + mov r1, r6 + mov r3, r4 + blx r5 + ldr r0, [r7, #0x24] + sub r0, r0, #1 + str r0, [r7, #0x24] + ldr r1, [r7, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r7, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C3F0 + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C3F0 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220C3F0: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C3F8: .word ov00_02219C40 +_0220C3FC: .word ov00_02219C18 +_0220C400: .word ov00_02219B70 + arm_func_end ov00_0220C31C + + arm_func_start ov00_0220C404 +ov00_0220C404: ; 0x0220C404 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0220C430 + ldr r0, _0220C4DC ; =ov00_02219C40 + ldr r1, _0220C4E0 ; =ov00_02219C18 + ldr r2, _0220C4E4 ; =ov00_02219B58 + mov r3, #0x94 + bl __msl_assertion_failed +_0220C430: + cmp r7, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x2c] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r7, #0x24] + cmp r5, #0 + add r1, r1, #1 + str r1, [r7, #0x24] + ldr ip, [r7, #8] + cmpne r6, #0 + ldr r3, [ip, #0x1c] + moveq r6, #0 + add r3, r3, #1 + moveq r5, r6 + str r3, [ip, #0x1c] + mov r2, r5 + ldr r5, [r7, #0x2c] + mov r0, r7 + mov r1, r6 + mov r3, r4 + blx r5 + ldr r0, [r7, #0x24] + sub r0, r0, #1 + str r0, [r7, #0x24] + ldr r1, [r7, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r7, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C4D4 + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C4D4 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220C4D4: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C4DC: .word ov00_02219C40 +_0220C4E0: .word ov00_02219C18 +_0220C4E4: .word ov00_02219B58 + arm_func_end ov00_0220C404 + + arm_func_start ov00_0220C4E8 +ov00_0220C4E8: ; 0x0220C4E8 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _0220C50C + ldr r0, _0220C5A0 ; =ov00_02219C40 + ldr r1, _0220C5A4 ; =ov00_02219C18 + ldr r2, _0220C5A8 ; =ov00_02219B44 + mov r3, #0xba + bl __msl_assertion_failed +_0220C50C: + cmp r4, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x30] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #0x24] + mov r0, r4 + add r1, r1, #1 + str r1, [r4, #0x24] + ldr r3, [r4, #8] + mov r1, r5 + ldr r2, [r3, #0x1c] + add r2, r2, #1 + str r2, [r3, #0x1c] + ldr r2, [r4, #0x30] + blx r2 + ldr r0, [r4, #0x24] + sub r0, r0, #1 + str r0, [r4, #0x24] + ldr r1, [r4, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r4, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C598 + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C598 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220C598: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220C5A0: .word ov00_02219C40 +_0220C5A4: .word ov00_02219C18 +_0220C5A8: .word ov00_02219B44 + arm_func_end ov00_0220C4E8 + + arm_func_start ov00_0220C5AC +ov00_0220C5AC: ; 0x0220C5AC + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _0220C5D0 + ldr r0, _0220C664 ; =ov00_02219C40 + ldr r1, _0220C668 ; =ov00_02219C18 + ldr r2, _0220C66C ; =ov00_02219B30 + mov r3, #0xd9 + bl __msl_assertion_failed +_0220C5D0: + cmp r4, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x34] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #0x24] + mov r0, r4 + add r1, r1, #1 + str r1, [r4, #0x24] + ldr r3, [r4, #8] + mov r1, r5 + ldr r2, [r3, #0x1c] + add r2, r2, #1 + str r2, [r3, #0x1c] + ldr r2, [r4, #0x34] + blx r2 + ldr r0, [r4, #0x24] + sub r0, r0, #1 + str r0, [r4, #0x24] + ldr r1, [r4, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r4, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C65C + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C65C + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220C65C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220C664: .word ov00_02219C40 +_0220C668: .word ov00_02219C18 +_0220C66C: .word ov00_02219B30 + arm_func_end ov00_0220C5AC + + arm_func_start ov00_0220C670 +ov00_0220C670: ; 0x0220C670 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0220C69C + ldr r0, _0220C758 ; =ov00_02219C40 + ldr r1, _0220C75C ; =ov00_02219C18 + ldr r2, _0220C760 ; =ov00_02219B88 + ldr r3, _0220C764 ; =0x00000101 + bl __msl_assertion_failed +_0220C69C: + cmp r7, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x98] + mov r1, r6 + bl ov00_021FE6EC + movs lr, r0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x24] + cmp r4, #0 + add r0, r0, #1 + str r0, [r7, #0x24] + ldr ip, [r7, #8] + cmpne r5, #0 + ldr r3, [ip, #0x1c] + moveq r5, #0 + add r3, r3, #1 + ldr r2, [sp, #0x18] + str r3, [ip, #0x1c] + str r2, [sp] + moveq r4, r5 + mov r1, r6 + ldr r6, [lr] + mov r0, r7 + mov r2, r5 + mov r3, r4 + blx r6 + ldr r0, [r7, #0x24] + sub r0, r0, #1 + str r0, [r7, #0x24] + ldr r1, [r7, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r7, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C750 + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C750 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220C750: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C758: .word ov00_02219C40 +_0220C75C: .word ov00_02219C18 +_0220C760: .word ov00_02219B88 +_0220C764: .word 0x00000101 + arm_func_end ov00_0220C670 + + arm_func_start ov00_0220C768 +ov00_0220C768: ; 0x0220C768 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0220C794 + ldr r0, _0220C850 ; =ov00_02219C40 + ldr r1, _0220C854 ; =ov00_02219C18 + ldr r2, _0220C858 ; =ov00_02219BB8 + ldr r3, _0220C85C ; =0x0000012D + bl __msl_assertion_failed +_0220C794: + cmp r7, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x9c] + mov r1, r6 + bl ov00_021FE6EC + movs lr, r0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x24] + cmp r4, #0 + add r0, r0, #1 + str r0, [r7, #0x24] + ldr ip, [r7, #8] + cmpne r5, #0 + ldr r3, [ip, #0x1c] + moveq r5, #0 + add r3, r3, #1 + ldr r2, [sp, #0x18] + str r3, [ip, #0x1c] + str r2, [sp] + moveq r4, r5 + mov r1, r6 + ldr r6, [lr] + mov r0, r7 + mov r2, r5 + mov r3, r4 + blx r6 + ldr r0, [r7, #0x24] + sub r0, r0, #1 + str r0, [r7, #0x24] + ldr r1, [r7, #8] + ldr r0, [r1, #0x1c] + sub r0, r0, #1 + str r0, [r1, #0x1c] + ldr r0, [r7, #8] + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _0220C848 + ldr r1, [r0, #0x1c] + cmp r1, #0 + bne _0220C848 + bl ov00_0220F144 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220C848: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C850: .word ov00_02219C40 +_0220C854: .word ov00_02219C18 +_0220C858: .word ov00_02219BB8 +_0220C85C: .word 0x0000012D + arm_func_end ov00_0220C768 + + arm_func_start ov00_0220C860 +ov00_0220C860: ; 0x0220C860 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0220C890 + ldr r0, _0220C978 ; =ov00_02219C10 + ldr r1, _0220C97C ; =ov00_02219C18 + ldr r2, _0220C980 ; =ov00_02219B1C + mov r3, #0x160 + bl __msl_assertion_failed +_0220C890: + cmp r7, #0 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [sp, #0x2c] + cmp r0, #0 + ldrne ip, [r7, #0x28] + ldreq ip, [r7, #0x2c] + cmp ip, #0 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [sp, #0x28] + ldr r1, [sp, #0x20] + cmp r0, #0 + ldrne r0, [sp, #0x24] + mov r2, r5 + cmpne r0, #0 + moveq r0, #0 + streq r0, [sp, #0x28] + streq r0, [sp, #0x24] + ldr r0, [r7, #0x1c] + cmp r6, #0 + add r0, r0, #1 + str r0, [r7, #0x1c] + ldrne r0, [r6, #0x24] + ldr lr, [sp, #0x28] + addne r0, r0, #1 + strne r0, [r6, #0x24] + str r1, [sp] + ldr r0, [sp, #0x24] + mov r1, r6 + str r0, [sp, #4] + mov r0, r7 + mov r3, r4 + str lr, [sp, #8] + blx ip + ldr r0, [r7, #0x1c] + cmp r6, #0 + sub r0, r0, #1 + str r0, [r7, #0x1c] + ldrne r0, [r6, #0x24] + subne r0, r0, #1 + strne r0, [r6, #0x24] + ldr r0, [r7, #0x14] + cmp r0, #0 + beq _0220C96C + ldr r0, [r7, #0x1c] + cmp r0, #0 + bne _0220C96C + mov r0, r7 + bl ov00_0220F144 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220C96C: + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220C978: .word ov00_02219C10 +_0220C97C: .word ov00_02219C18 +_0220C980: .word ov00_02219B1C + arm_func_end ov00_0220C860 + + arm_func_start ov00_0220C984 +ov00_0220C984: ; 0x0220C984 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + ldr r4, [sp, #0x24] + movs r8, r0 + mov r0, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + str r0, [r4] + bne _0220C9C0 + ldr r0, _0220CA6C ; =ov00_02219C10 + ldr r1, _0220CA70 ; =ov00_02219C18 + ldr r2, _0220CA74 ; =ov00_02219BF0 + ldr r3, _0220CA78 ; =0x00000197 + bl __msl_assertion_failed +_0220C9C0: + cmp r8, #0 + addeq sp, sp, #4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [r8, #0x30] + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #0x20] + ldr r1, [r8, #0x1c] + cmp r0, #0 + cmpne r5, #0 + moveq r5, #0 + streq r5, [sp, #0x20] + add r1, r1, #1 + str r1, [r8, #0x1c] + ldr r0, [sp, #0x20] + mov r1, r7 + str r0, [sp] + ldr ip, [r8, #0x30] + mov r0, r8 + mov r2, r6 + mov r3, r5 + blx ip + str r0, [r4] + ldr r0, [r8, #0x1c] + sub r0, r0, #1 + str r0, [r8, #0x1c] + ldr r0, [r8, #0x14] + cmp r0, #0 + beq _0220CA60 + ldr r0, [r8, #0x1c] + cmp r0, #0 + bne _0220CA60 + mov r0, r8 + bl ov00_0220F144 + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220CA60: + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220CA6C: .word ov00_02219C10 +_0220CA70: .word ov00_02219C18 +_0220CA74: .word ov00_02219BF0 +_0220CA78: .word 0x00000197 + arm_func_end ov00_0220C984 + + arm_func_start ov00_0220CA7C +ov00_0220CA7C: ; 0x0220CA7C + stmdb sp!, {r4, lr} + mov r4, r1 + bl ov00_0220F1A0 + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r1, [r4] + mov r0, #0 + str r0, [r1, #0xc] + ldr r1, [r4] + mov r2, #1 + str r2, [r1, #0x10] + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CA7C + + arm_func_start ov00_0220CAAC +ov00_0220CAAC: ; 0x0220CAAC + stmdb sp!, {r4, lr} + mov r4, r1 + bl ov00_0220F1A0 + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, [r4] + mov r1, #2 + str r1, [r0, #0xc] + ldr r1, [r4] + mov r0, #0 + str r0, [r1, #0x10] + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CAAC + + arm_func_start ov00_0220CADC +ov00_0220CADC: ; 0x0220CADC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r5, r0 + add r0, sp, #0x34 + add r1, sp, #0x38 + mov r4, r3 + bl ov00_0220F958 + ldr r0, [sp, #0x38] + cmp r0, #0 + ble _0220CB3C + bl ov00_021EC3A8 + cmp r0, #0 + str r0, [r5, #0x38] + addeq sp, sp, #0x20 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r1, [sp, #0x34] + ldr r2, [sp, #0x38] + bl memcpy + ldr r0, [sp, #0x38] + str r0, [r5, #0x3c] +_0220CB3C: + cmp r4, #0 + addne ip, r5, #0x28 + ldmneia r4, {r0, r1, r2, r3} + stmneia ip, {r0, r1, r2, r3} + add r0, sp, #0 + bl ov00_0220BCEC + add r1, sp, #0 + add r0, r5, #0x68 + bl ov00_0220BE08 + add r1, sp, #0 + mov r0, r5 + bl ov00_0220E8E0 + mov r0, #0 + str r0, [r5, #0xc] + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220CADC + + arm_func_start ov00_0220CB84 +ov00_0220CB84: ; 0x0220CB84 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r2, [r5, #0x14] + mov r4, r1 + cmp r2, #0 + movne r0, #0 + strne r0, [r5, #0x14] + ldmneia sp!, {r3, r4, r5, pc} + mov r2, #0 + str r2, [r5, #0x14] + ldr r1, [r5, #0xc] + cmp r1, #4 + movne r0, r2 + ldmneia sp!, {r3, r4, r5, pc} + bl ov00_0220EA44 + mov r0, #5 + cmp r4, #0 + str r0, [r5, #0xc] + addne ip, r5, #0x28 + ldmneia r4, {r0, r1, r2, r3} + stmneia ip, {r0, r1, r2, r3} + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220CB84 + + arm_func_start ov00_0220CBE0 +ov00_0220CBE0: ; 0x0220CBE0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + str r0, [r4, #0x14] + ldr r0, [r4, #0xc] + cmp r0, #4 + ldmneia sp!, {r4, lr} + addne sp, sp, #0x10 + bxne lr + add r0, sp, #0xc + add r1, sp, #0x10 + bl ov00_0220F958 + ldr r1, [sp, #0xc] + ldr r2, [sp, #0x10] + mov r0, r4 + bl ov00_0220EAA0 + mov r0, #6 + str r0, [r4, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220CBE0 + + arm_func_start ov00_0220CC38 +ov00_0220CC38: ; 0x0220CC38 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + str r2, [sp] + mov r3, r1 + ldrh r2, [r4, #4] + ldr r0, [r4, #8] + ldr r1, [r4] + bl ov00_0220F474 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + bl ov00_021FF368 + str r0, [r4, #0x88] + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_0220CC38 + + arm_func_start ov00_0220CC80 +ov00_0220CC80: ; 0x0220CC80 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, [r4, #0xc] + cmp r2, #5 + bge _0220CD18 + ldr r0, [r4, #0x10] + mov r3, #0 + cmp r0, #0 + beq _0220CCC4 + ldr r2, [r4, #0x20] + cmp r2, #0 + beq _0220CCE0 + ldr r0, [r4, #0x1c] + sub r0, r1, r0 + cmp r0, r2 + movhi r3, #1 + b _0220CCE0 +_0220CCC4: + cmp r2, #4 + bge _0220CCE0 + ldr r2, [r4, #0x1c] + ldr r0, _0220CD20 ; =0x0000EA60 + sub r1, r1, r2 + cmp r1, r0 + movhi r3, #1 +_0220CCE0: + cmp r3, #0 + beq _0220CD18 + mov r0, r4 + bl ov00_0220ED98 + mov r0, r4 + bl ov00_0220CEB8 + mov r2, #0 + mov r0, r4 + mov r3, r2 + mov r1, #6 + bl ov00_0220C31C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_0220CD18: + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220CD20: .word 0x0000EA60 + arm_func_end ov00_0220CC80 + + arm_func_start ov00_0220CD24 +ov00_0220CD24: ; 0x0220CD24 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r0, [r7, #0x60] + mov r6, r1 + bl ArrayLength + mov r5, r0 + cmp r5, #0 + mov r4, #0 + ble _0220CD88 +_0220CD48: + ldr r0, [r7, #0x60] + mov r1, r4 + bl ov00_021FE6EC + mov r1, r0 + ldr r0, [r1, #0xc] + sub r0, r6, r0 + cmp r0, #0x3e8 + bls _0220CD7C + mov r0, r7 + bl ov00_0220EE00 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0220CD7C: + add r4, r4, #1 + cmp r4, r5 + blt _0220CD48 +_0220CD88: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220CD24 + + arm_func_start ov00_0220CD90 +ov00_0220CD90: ; 0x0220CD90 + stmdb sp!, {r3, lr} + ldr r2, [r0, #0x90] + cmp r2, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + ldr r2, [r0, #0x94] + sub r1, r1, r2 + cmp r1, #0x64 + bls _0220CDC4 + bl ov00_0220EC94 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_0220CDC4: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220CD90 + + arm_func_start ov00_0220CDCC +ov00_0220CDCC: ; 0x0220CDCC + stmdb sp!, {r3, lr} + ldr r3, [r0, #0x88] + ldr r2, _0220CDFC ; =0x00007530 + sub r1, r1, r3 + cmp r1, r2 + bls _0220CDF4 + bl ov00_0220EB70 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_0220CDF4: + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220CDFC: .word 0x00007530 + arm_func_end ov00_0220CDCC + + arm_func_start ov00_0220CE00 +ov00_0220CE00: ; 0x0220CE00 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_0220CC80 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov00_0220CDCC + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov00_0220CD24 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov00_0220CD90 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220CE00 + + arm_func_start ov00_0220CE68 +ov00_0220CE68: ; 0x0220CE68 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r1, #0 + beq _0220CEA8 + ldr r1, [r4, #0xc] + cmp r1, #7 + ldmgeia sp!, {r4, pc} + bl ov00_0220CEB8 + mov r0, r4 + bl ov00_0220ED98 + mov r0, r4 + mov r1, #0 + bl ov00_0220C4E8 + mov r0, r4 + bl ov00_0220F3B0 + ldmia sp!, {r4, pc} +_0220CEA8: + mov r1, #6 + str r1, [r4, #0xc] + bl ov00_0220EB14 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CE68 + + arm_func_start ov00_0220CEB8 +ov00_0220CEB8: ; 0x0220CEB8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + ldr r1, [sp, #8] + ldr r0, [r1, #0xc] + cmp r0, #7 + ldmeqia sp!, {r3, lr} + addeq sp, sp, #0x10 + bxeq lr + mov r0, #7 + str r0, [r1, #0xc] + ldr r0, [sp, #8] + add r1, sp, #8 + ldr r0, [r0, #8] + ldr r0, [r0, #0xc] + bl ov00_021FF01C + ldr r0, [sp, #8] + add r1, sp, #8 + ldr r0, [r0, #8] + ldr r0, [r0, #0x10] + bl ov00_021FE754 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220CEB8 + + arm_func_start ov00_0220CF14 +ov00_0220CF14: ; 0x0220CF14 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x38] + cmp r0, #0 + beq _0220CF2C + bl ov00_021EC3D8 +_0220CF2C: + ldr r0, [r4, #0x44] + cmp r0, #0 + beq _0220CF3C + bl ov00_021EC3D8 +_0220CF3C: + ldr r0, [r4, #0x50] + cmp r0, #0 + beq _0220CF4C + bl ov00_021EC3D8 +_0220CF4C: + ldr r0, [r4, #0x5c] + cmp r0, #0 + beq _0220CF5C + bl ov00_021FE678 +_0220CF5C: + ldr r0, [r4, #0x60] + cmp r0, #0 + beq _0220CF6C + bl ov00_021FE678 +_0220CF6C: + ldr r0, [r4, #0x98] + cmp r0, #0 + beq _0220CF7C + bl ov00_021FE678 +_0220CF7C: + ldr r0, [r4, #0x9c] + cmp r0, #0 + beq _0220CF8C + bl ov00_021FE678 +_0220CF8C: + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CF14 + + arm_func_start ov00_0220CF98 +ov00_0220CF98: ; 0x0220CF98 + stmdb sp!, {r3, lr} + ldr ip, [sp, #8] + str ip, [sp] + bl ov00_0220EF24 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220CF98 + + arm_func_start ov00_0220CFAC +ov00_0220CFAC: ; 0x0220CFAC + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_0220D238 + mov r0, r4 + bl ov00_0220F144 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CFAC + + arm_func_start ov00_0220CFC4 +ov00_0220CFC4: ; 0x0220CFC4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_0220E590 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_0220F674 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_0220F6B0 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220CFC4 + + arm_func_start ov00_0220CFF4 +ov00_0220CFF4: ; 0x0220CFF4 + ldr ip, _0220CFFC ; =ov00_0220F188 + bx ip + .balign 4, 0 +_0220CFFC: .word ov00_0220F188 + arm_func_end ov00_0220CFF4 + + arm_func_start ov00_0220D000 +ov00_0220D000: ; 0x0220D000 + ldr ip, _0220D008 ; =ov00_0220CB84 + bx ip + .balign 4, 0 +_0220D008: .word ov00_0220CB84 + arm_func_end ov00_0220D000 + + arm_func_start ov00_0220D00C +ov00_0220D00C: ; 0x0220D00C + ldr ip, _0220D014 ; =ov00_0220CBE0 + bx ip + .balign 4, 0 +_0220D014: .word ov00_0220CBE0 + arm_func_end ov00_0220D00C + + arm_func_start ov00_0220D018 +ov00_0220D018: ; 0x0220D018 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + mov r6, r0 + mov r5, r1 + mov r0, r2 + add r1, sp, #4 + add r2, sp, #0 + mov r4, r3 + bl ov00_0220F7D4 + cmp r0, #0 + ldrne r2, [sp, #4] + cmpne r2, #0 + ldrneh r3, [sp] + cmpne r3, #0 + addeq sp, sp, #0xc + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r1, r2, lsr #0x18 + mov r0, r2, lsr #8 + mov r7, r2, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r8, r2, lsl #0x18 + orr r0, r1, r0 + and r7, r7, #0xff0000 + and r1, r8, #0xff000000 + orr r0, r7, r0 + orr r0, r1, r0 + and r0, r0, #0xe0000000 + cmp r0, #-0x20000000 + addeq sp, sp, #0xc + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r1, sp, #8 + mov r0, r6 + bl ov00_0220CA7C + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r1, [sp, #0x2c] + ldr r0, [sp, #8] + ldr r2, [sp, #0x28] + str r1, [r0, #0x20] + ldr r0, [sp, #8] + ldr r3, [sp, #0x30] + mov r1, r4 + bl ov00_0220CADC + movs r4, r0 + beq _0220D0F0 + ldr r0, [sp, #8] + bl ov00_0220F3B0 + add sp, sp, #0xc + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0220D0F0: + ldr r0, [sp, #0x34] + cmp r0, #0 + bne _0220D114 + cmp r5, #0 + ldrne r0, [sp, #8] + add sp, sp, #0xc + strne r0, [r5] + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0220D114: + ldr r1, [sp, #8] + mov r8, #1 + ldr r0, [r1, #0x24] + mov r7, #0 + add r0, r0, #1 + str r0, [r1, #0x24] + mov r4, r8 +_0220D130: + mov r0, r6 + bl ov00_0220CFC4 + ldr r0, [sp, #8] + ldr r0, [r0, #0xc] + cmp r0, #5 + movge sb, r8 + movlt sb, r7 + cmp sb, #0 + bne _0220D15C + mov r0, r4 + bl ov00_021FF3C0 +_0220D15C: + cmp sb, #0 + beq _0220D130 + ldr r1, [sp, #8] + ldr r0, [r1, #0x24] + sub r0, r0, #1 + str r0, [r1, #0x24] + ldr r1, [sp, #8] + ldr r0, [r1, #0xc] + cmp r0, #5 + streq r1, [r5] + ldr r0, [sp, #8] + ldr r0, [r0, #0x18] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_0220D018 + + arm_func_start ov00_0220D194 +ov00_0220D194: ; 0x0220D194 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0xc] + mov r4, r3 + cmp r0, #5 + ldmneia sp!, {r3, r4, r5, lr} + addne sp, sp, #0x10 + bxne lr + add r0, sp, #0x14 + add r1, sp, #0x18 + bl ov00_0220F958 + ldr r0, [r5, #0x98] + bl ArrayLength + cmp r0, #0 + beq _0220D1F8 + str r4, [sp] + ldr r2, [sp, #0x14] + ldr r3, [sp, #0x18] + mov r0, r5 + mov r1, #0 + bl ov00_0220C670 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_0220D1F8: + ldr r1, [sp, #0x14] + ldr r2, [sp, #0x18] + mov r0, r5 + mov r3, r4 + bl ov00_0220EE6C + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220D194 + + arm_func_start ov00_0220D218 +ov00_0220D218: ; 0x0220D218 + ldr ip, _0220D224 ; =ov00_0220CE68 + mov r1, #1 + bx ip + .balign 4, 0 +_0220D224: .word ov00_0220CE68 + arm_func_end ov00_0220D218 + + arm_func_start ov00_0220D228 +ov00_0220D228: ; 0x0220D228 + ldr ip, _0220D234 ; =ov00_0220D218 + ldr r0, [r0] + bx ip + .balign 4, 0 +_0220D234: .word ov00_0220D218 + arm_func_end ov00_0220D228 + + arm_func_start ov00_0220D238 +ov00_0220D238: ; 0x0220D238 + stmdb sp!, {r3, lr} + ldr r1, _0220D274 ; =ov00_0221B630 + ldr r2, [r1] + cmp r2, #1 + ldmeqia sp!, {r3, pc} + mov r2, #1 + str r2, [r1] + ldr r0, [r0, #0xc] + ldr r1, _0220D278 ; =ov00_0220D228 + mov r2, #0 + bl ov00_021FF1F8 + ldr r0, _0220D274 ; =ov00_0221B630 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220D274: .word ov00_0221B630 +_0220D278: .word ov00_0220D228 + arm_func_end ov00_0220D238 + + arm_func_start ov00_0220D27C +ov00_0220D27C: ; 0x0220D27C + ldrh r0, [r0, #8] + bx lr + arm_func_end ov00_0220D27C + + arm_func_start ov00_0220D284 +ov00_0220D284: ; 0x0220D284 + ldr r1, [r0, #0x54] + ldr r0, [r0, #0x58] + sub r0, r1, r0 + bx lr + arm_func_end ov00_0220D284 + + arm_func_start ov00_0220D294 +ov00_0220D294: ; 0x0220D294 + ldr r0, [r0] + bx lr + arm_func_end ov00_0220D294 + + arm_func_start ov00_0220D29C +ov00_0220D29C: ; 0x0220D29C + str r1, [r0, #0x30] + bx lr + arm_func_end ov00_0220D29C + + arm_func_start ov00_0220D2A4 +ov00_0220D2A4: ; 0x0220D2A4 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0220D2C8 + ldr r0, _0220D2D0 ; =ov00_02219C88 + ldr r1, _0220D2D4 ; =ov00_02219C7C + ldr r2, _0220D2D8 ; =ov00_02219C4C + ldr r3, _0220D2DC ; =0x000001A3 + bl __msl_assertion_failed +_0220D2C8: + str r4, [r5, #0x40] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220D2D0: .word ov00_02219C88 +_0220D2D4: .word ov00_02219C7C +_0220D2D8: .word ov00_02219C4C +_0220D2DC: .word 0x000001A3 + arm_func_end ov00_0220D2A4 + + arm_func_start ov00_0220D2E0 +ov00_0220D2E0: ; 0x0220D2E0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0220D300 + ldr r0, _0220D308 ; =ov00_02219C88 + ldr r1, _0220D30C ; =ov00_02219C7C + ldr r2, _0220D310 ; =ov00_02219C64 + ldr r3, _0220D314 ; =0x000001AA + bl __msl_assertion_failed +_0220D300: + ldr r0, [r4, #0x40] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220D308: .word ov00_02219C88 +_0220D30C: .word ov00_02219C7C +_0220D310: .word ov00_02219C64 +_0220D314: .word 0x000001AA + arm_func_end ov00_0220D2E0 + + arm_func_start ov00_0220D318 +ov00_0220D318: ; 0x0220D318 + ldrb r2, [r0, r1] + add r1, r1, #1 + ldrb r1, [r0, r1] + mov r0, r2, lsl #8 + and r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + orr r0, r1, r0, lsr #16 + bx lr + arm_func_end ov00_0220D318 + + arm_func_start ov00_0220D338 +ov00_0220D338: ; 0x0220D338 + mov r3, r2, asr #8 + strb r3, [r0, r1] + add r1, r1, #1 + strb r2, [r0, r1] + bx lr + arm_func_end ov00_0220D338 + + arm_func_start ov00_0220D34C +ov00_0220D34C: ; 0x0220D34C + sub r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + bx lr + arm_func_end ov00_0220D34C + + arm_func_start ov00_0220D35C +ov00_0220D35C: ; 0x0220D35C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r3, [r6, #0xc] + mov r5, r1 + mov r4, r2 + cmp r3, #5 + bge _0220D3C4 + ldr r1, [r6, #0x10] + cmp r1, #0 + beq _0220D3AC + bl ov00_0220CEB8 + mov r2, #0 + mov r0, r6 + mov r1, r5 + mov r3, r2 + bl ov00_0220C31C + cmp r0, #0 + bne _0220D3E8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0220D3AC: + cmp r3, #4 + moveq r0, #1 + streq r0, [r6, #0x14] + mov r0, r6 + bl ov00_0220CEB8 + b _0220D3E8 +_0220D3C4: + cmp r3, #7 + beq _0220D3E8 + bl ov00_0220CEB8 + mov r0, r6 + mov r1, r4 + bl ov00_0220C4E8 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_0220D3E8: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_0220D35C + + arm_func_start ov00_0220D3F0 +ov00_0220D3F0: ; 0x0220D3F0 + ldr ip, _0220D400 ; =ov00_0220D35C + mov r1, #7 + mov r2, #2 + bx ip + .balign 4, 0 +_0220D400: .word ov00_0220D35C + arm_func_end ov00_0220D3F0 + + arm_func_start ov00_0220D404 +ov00_0220D404: ; 0x0220D404 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_0220ED98 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + mov r1, #1 + mov r2, #4 + bl ov00_0220D35C + ldmia sp!, {r4, pc} + arm_func_end ov00_0220D404 + + arm_func_start ov00_0220D430 +ov00_0220D430: ; 0x0220D430 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldr r0, [r4, #0x60] + mov r7, r1 + bl ArrayLength + movs r5, r0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + mov r6, #0 + ble _0220D484 +_0220D45C: + ldr r0, [r4, #0x60] + mov r1, r6 + bl ov00_021FE6EC + ldrh r0, [r0, #8] + mov r1, r7 + bl ov00_0220D34C + cmp r0, #0 + addlt r6, r6, #1 + cmplt r6, r5 + blt _0220D45C +_0220D484: + cmp r6, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + sub r6, r6, #1 + beq _0220D4B4 +_0220D49C: + ldr r0, [r4, #0x60] + mov r1, r6 + bl ov00_021FE968 + cmp r6, #0 + sub r6, r6, #1 + bne _0220D49C +_0220D4B4: + ldr r0, [r4, #0x60] + bl ArrayLength + movs r6, r0 + bne _0220D4D4 + mov r0, #0 + str r0, [r4, #0x58] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220D4D4: + ldr r0, [r4, #0x60] + mov r1, #0 + bl ov00_021FE6EC + cmp r6, #0 + ldr r5, [r0] + mov r7, #0 + ble _0220D514 +_0220D4F0: + ldr r0, [r4, #0x60] + mov r1, r7 + bl ov00_021FE6EC + ldr r1, [r0] + add r7, r7, #1 + sub r1, r1, r5 + str r1, [r0] + cmp r7, r6 + blt _0220D4F0 +_0220D514: + mov r2, r5 + add r0, r4, #0x50 + mov r1, #0 + bl ov00_0220C0C4 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220D430 + + arm_func_start ov00_0220D52C +ov00_0220D52C: ; 0x0220D52C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + ldr r0, [r6, #0xc] + mov r5, r1 + cmp r0, #5 + cmpne r0, #6 + mov r4, r2 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r6, #0x9c] + bl ArrayLength + cmp r0, #0 + beq _0220D594 + mov r1, #0 + mov r0, r6 + mov r2, r5 + mov r3, r4 + str r1, [sp] + bl ov00_0220C768 + cmp r0, #0 + movne r0, #1 + add sp, sp, #4 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D594: + mov r0, r6 + mov r1, r5 + mov r2, r4 + mov r3, #0 + bl ov00_0220C404 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220D52C + + arm_func_start ov00_0220D5BC +ov00_0220D5BC: ; 0x0220D5BC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + ldr r3, [r6, #0xc] + mov r5, r1 + cmp r3, #5 + mov r4, r2 + cmpne r3, #6 + beq _0220D5F8 + bl ov00_0220D3F0 + cmp r0, #0 + bne _0220D65C + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D5F8: + ldr r0, [r6, #0x9c] + bl ArrayLength + cmp r0, #0 + beq _0220D638 + mov ip, #1 + mov r0, r6 + mov r2, r5 + mov r3, r4 + mov r1, #0 + str ip, [sp] + bl ov00_0220C768 + cmp r0, #0 + movne r0, #1 + add sp, sp, #4 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D638: + mov r0, r6 + mov r1, r5 + mov r2, r4 + mov r3, #1 + bl ov00_0220C404 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} +_0220D65C: + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220D5BC + + arm_func_start ov00_0220D668 +ov00_0220D668: ; 0x0220D668 + stmdb sp!, {r4, lr} + sub sp, sp, #0x40 + mov r4, r0 + ldr r3, [r4, #0xc] + cmp r3, #2 + beq _0220D698 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x40 + moveq r0, #0 + ldmia sp!, {r4, pc} +_0220D698: + cmp r2, #0x20 + bge _0220D6B8 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x40 + moveq r0, #0 + ldmia sp!, {r4, pc} +_0220D6B8: + add r0, sp, #0x20 + bl ov00_0220BE08 + add r0, sp, #0 + bl ov00_0220BCEC + add r1, sp, #0 + add r0, r4, #0x68 + bl ov00_0220BE08 + add r1, sp, #0x20 + add r2, sp, #0 + mov r0, r4 + bl ov00_0220E940 + cmp r0, #0 + moveq r0, #0 + movne r0, #3 + strne r0, [r4, #0xc] + movne r0, #1 + add sp, sp, #0x40 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220D668 + + arm_func_start ov00_0220D700 +ov00_0220D700: ; 0x0220D700 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r5, r0 + ldr r3, [r5, #0xc] + mov r4, r1 + cmp r3, #0 + beq _0220D734 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x20 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220D734: + cmp r2, #0x40 + bge _0220D754 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x20 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220D754: + mov r0, r4 + add r1, r5, #0x68 + bl ov00_0220BF10 + cmp r0, #0 + bne _0220D784 + mov r0, r5 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x20 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0220D784: + add r0, sp, #0 + add r1, r4, #0x20 + bl ov00_0220BE08 + ldr r2, [r5, #0x38] + ldr r3, [r5, #0x3c] + add r1, sp, #0 + mov r0, r5 + bl ov00_0220E9CC + cmp r0, #0 + addeq sp, sp, #0x20 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x38] + cmp r0, #0 + beq _0220D7CC + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r5, #0x38] +_0220D7CC: + mov r0, #1 + str r0, [r5, #0xc] + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220D700 + + arm_func_start ov00_0220D7DC +ov00_0220D7DC: ; 0x0220D7DC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r6, r0 + ldr r3, [r6, #0xc] + mov r5, r1 + mov r4, r2 + cmp r3, #3 + beq _0220D814 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0xc + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D814: + cmp r4, #0x20 + bge _0220D834 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0xc + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D834: + mov r0, r5 + add r1, r6, #0x68 + bl ov00_0220BF10 + cmp r0, #0 + bne _0220D864 + mov r0, r6 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0xc + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D864: + ldr r0, [r6, #8] + ldr r0, [r0, #0x20] + cmp r0, #0 + bne _0220D8A0 + mov r0, r6 + bl ov00_0220ED98 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r0, r6 + bl ov00_0220CEB8 + add sp, sp, #0xc + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, pc} +_0220D8A0: + mov r0, #4 + str r0, [r6, #0xc] + bl ov00_021FF368 + ldr r2, [r6, #0x8c] + add r1, r5, #0x20 + sub r0, r0, r2 + stmia sp, {r0, r1} + sub r0, r4, #0x20 + str r0, [sp, #8] + ldrh r3, [r6, #4] + ldr r0, [r6, #8] + ldr r2, [r6] + mov r1, r6 + bl ov00_0220C200 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220D7DC + + arm_func_start ov00_0220D8EC +ov00_0220D8EC: ; 0x0220D8EC + stmdb sp!, {r3, lr} + ldr r1, [r0, #0xc] + cmp r1, #1 + beq _0220D910 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} +_0220D910: + mov r1, #0 + mov ip, #5 + mov r2, r1 + mov r3, r1 + str ip, [r0, #0xc] + bl ov00_0220C31C + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220D8EC + + arm_func_start ov00_0220D938 +ov00_0220D938: ; 0x0220D938 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r3, [r6, #0xc] + mov r5, r1 + mov r4, r2 + cmp r3, #1 + beq _0220D968 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0220D968: + bl ov00_0220CEB8 + mov r0, r6 + bl ov00_0220ED98 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r2, r5 + mov r3, r4 + mov r1, #2 + bl ov00_0220C31C + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_0220D938 + + arm_func_start ov00_0220D9A4 +ov00_0220D9A4: ; 0x0220D9A4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_0220ED98 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0xc] + mov r1, #2 + cmp r0, #6 + moveq r2, #0 + movne r2, #1 + mov r0, r4 + bl ov00_0220D35C + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220D9A4 + + arm_func_start ov00_0220D9E8 +ov00_0220D9E8: ; 0x0220D9E8 + stmdb sp!, {r3, lr} + ldrh ip, [r0, #0x66] + cmp r1, #0 + add ip, ip, #1 + strh ip, [r0, #0x66] + bne _0220DA1C + mov r1, r2 + mov r2, r3 + bl ov00_0220D5BC + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DA1C: + cmp r1, #1 + bne _0220DA40 + mov r1, r2 + mov r2, r3 + bl ov00_0220D668 + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DA40: + cmp r1, #2 + bne _0220DA64 + mov r1, r2 + mov r2, r3 + bl ov00_0220D700 + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DA64: + cmp r1, #3 + bne _0220DA88 + mov r1, r2 + mov r2, r3 + bl ov00_0220D7DC + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DA88: + cmp r1, #4 + bne _0220DAA4 + bl ov00_0220D8EC + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DAA4: + cmp r1, #5 + bne _0220DAC8 + mov r1, r2 + mov r2, r3 + bl ov00_0220D938 + cmp r0, #0 + bne _0220DAE0 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220DAC8: + cmp r1, #6 + bne _0220DAE0 + bl ov00_0220D9A4 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_0220DAE0: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220D9E8 + + arm_func_start ov00_0220DAE8 +ov00_0220DAE8: ; 0x0220DAE8 + ldr ip, _0220DAF8 ; =ov00_0220D34C + ldrh r0, [r0, #0xc] + ldrh r1, [r1, #0xc] + bx ip + .balign 4, 0 +_0220DAF8: .word ov00_0220D34C + arm_func_end ov00_0220DAE8 + + arm_func_start ov00_0220DAFC +ov00_0220DAFC: ; 0x0220DAFC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x10 + mov sb, r0 + ldr r0, [sb, #0x5c] + mov r8, r1 + mov r7, r2 + mov r6, r3 + ldr r5, [sp, #0x34] + bl ArrayLength + mov r4, r0 + cmp r4, #0 + mov sl, #0 + ble _0220DB78 +_0220DB30: + ldr r0, [sb, #0x5c] + mov r1, sl + bl ov00_021FE6EC + ldrh r0, [r0, #0xc] + cmp r0, r7 + bne _0220DB5C + mov r0, #0 + str r0, [r5] + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220DB5C: + mov r1, r7 + bl ov00_0220D34C + cmp r0, #0 + bgt _0220DB78 + add sl, sl, #1 + cmp sl, r4 + blt _0220DB30 +_0220DB78: + add r0, sb, #0x44 + bl ov00_0220BF70 + ldr r2, [sp, #0x30] + cmp r0, r2 + movlt r0, #1 + addlt sp, sp, #0x10 + strlt r0, [r5] + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, [sb, #0x4c] + add r1, sp, #0 + str r2, [sp, #4] + str r8, [sp, #8] + strh r7, [sp, #0xc] + str r0, [sp] + ldr r0, [sb, #0x5c] + ldr r2, _0220DCAC ; =ov00_0220DAE8 + bl ov00_021FE858 + ldr r0, [sb, #0x5c] + bl ArrayLength + add r1, r4, #1 + cmp r1, r0 + movne r0, #1 + addne sp, sp, #0x10 + strne r0, [r5] + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r2, [sp, #0x30] + mov r1, r6 + add r0, sb, #0x44 + bl ov00_0220C03C + cmp r4, #0 + bne _0220DC20 + sub r0, r7, #1 + mov r2, r0, lsl #0x10 + ldrh r1, [sb, #0x66] + mov r0, sb + mov r2, r2, lsr #0x10 + bl ov00_0220ECF8 + cmp r0, #0 + bne _0220DC98 + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220DC20: + ldr r0, [sb, #0x5c] + mov r1, r4 + bl ov00_021FE6EC + ldrh r0, [r0, #0xc] + cmp r0, r7 + bne _0220DC98 + ldr r0, [sb, #0x5c] + sub r1, r4, #1 + bl ov00_021FE6EC + mov r4, r0 + ldrh r1, [r4, #0xc] + mov r0, r7 + bl ov00_0220D34C + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bls _0220DC98 + ldrh r1, [r4, #0xc] + sub r0, r7, #1 + mov r2, r0, lsl #0x10 + add r0, r1, #1 + mov r1, r0, lsl #0x10 + mov r0, sb + mov r1, r1, lsr #0x10 + mov r2, r2, lsr #0x10 + bl ov00_0220ECF8 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0220DC98: + mov r0, #0 + str r0, [r5] + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0220DCAC: .word ov00_0220DAE8 + arm_func_end ov00_0220DAFC + + arm_func_start ov00_0220DCB0 +ov00_0220DCB0: ; 0x0220DCB0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r0, [sb, #0x5c] + ldmia r1, {r4, r5} + mov r1, r2 + mov r8, #0 + bl ov00_021FE968 + ldr r0, [sb, #0x5c] + bl ArrayLength + mov r6, r0 + cmp r6, #0 + mov r7, r8 + ble _0220DD20 +_0220DCE4: + ldr r0, [sb, #0x5c] + mov r1, r7 + bl ov00_021FE6EC + ldr r1, [r0] + cmp r1, r4 + ble _0220DD14 + sub r1, r1, r5 + str r1, [r0] + ldr r0, [r0, #4] + add r0, r1, r0 + cmp r8, r0 + movle r8, r0 +_0220DD14: + add r7, r7, #1 + cmp r7, r6 + blt _0220DCE4 +_0220DD20: + mov r1, r4 + mov r2, r5 + add r0, sb, #0x44 + bl ov00_0220C0C4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_0220DCB0 + + arm_func_start ov00_0220DD34 +ov00_0220DD34: ; 0x0220DD34 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 +_0220DD3C: + ldr r0, [r6, #0x5c] + bl ArrayLength + subs r5, r0, #1 + bmi _0220DDAC +_0220DD4C: + ldr r0, [r6, #0x5c] + mov r1, r5 + bl ov00_021FE6EC + mov r4, r0 + ldrh r1, [r4, #0xc] + ldrh r0, [r6, #0x66] + cmp r1, r0 + bne _0220DDA4 + ldr ip, [r6, #0x44] + ldr r1, [r4, #8] + ldmia r4, {r2, r3} + mov r0, r6 + add r2, ip, r2 + bl ov00_0220D9E8 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl ov00_0220DCB0 + b _0220DD3C +_0220DDA4: + subs r5, r5, #1 + bpl _0220DD4C +_0220DDAC: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_0220DD34 + + arm_func_start ov00_0220DDB4 +ov00_0220DDB4: ; 0x0220DDB4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x90] + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r0, #1 + str r0, [r4, #0x90] + bl ov00_021FF368 + str r0, [r4, #0x94] + ldmia sp!, {r4, pc} + arm_func_end ov00_0220DDB4 + + arm_func_start ov00_0220DDDC +ov00_0220DDDC: ; 0x0220DDDC + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r6, r3 + mov r4, r0 + mov r8, r1 + mov r7, r2 + cmp r6, #7 + bge _0220DE14 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0xc + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220DE14: + mov r0, r7 + mov r1, #3 + bl ov00_0220D318 + mov r5, r0 + mov r0, r7 + mov r1, #5 + bl ov00_0220D318 + mov r1, r0 + mov r0, r4 + bl ov00_0220D430 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldrh r1, [r4, #0x66] + cmp r5, r1 + bne _0220DEA0 + mov r0, r4 + bl ov00_0220DDB4 + mov r0, r4 + mov r1, r8 + add r2, r7, #7 + sub r3, r6, #7 + bl ov00_0220D9E8 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r4 + bl ov00_0220DD34 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0xc + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220DEA0: + mov r0, r5 + bl ov00_0220D34C + cmp r0, #0 + bge _0220DEC4 + mov r0, r4 + bl ov00_0220DDB4 + add sp, sp, #0xc + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220DEC4: + sub r0, r6, #7 + str r0, [sp] + add ip, sp, #8 + mov r0, r4 + mov r1, r8 + mov r2, r5 + add r3, r7, #7 + str ip, [sp, #4] + bl ov00_0220DAFC + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #8] + cmp r0, #0 + beq _0220DF1C + mov r0, r4 + bl ov00_0220D404 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0220DF1C: + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov00_0220DDDC + + arm_func_start ov00_0220DF28 +ov00_0220DF28: ; 0x0220DF28 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r2, #2 + beq _0220DF4C + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, pc} +_0220DF4C: + mov r0, r1 + mov r1, #0 + bl ov00_0220D318 + mov r1, r0 + mov r0, r4 + bl ov00_0220D430 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220DF28 + + arm_func_start ov00_0220DF74 +ov00_0220DF74: ; 0x0220DF74 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r1 + mov r4, r0 + mov r0, r7 + mov r1, #0 + mov r5, r2 + bl ov00_0220D318 + mov r6, r0 + cmp r5, #2 + moveq r7, r6 + beq _0220DFD4 + cmp r5, #4 + bne _0220DFBC + mov r0, r7 + mov r1, #2 + bl ov00_0220D318 + mov r7, r0 + b _0220DFD4 +_0220DFBC: + mov r0, r4 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220DFD4: + ldr r0, [r4, #0x60] + bl ArrayLength + mov r8, r0 + cmp r8, #0 + mov sb, #0 + ble _0220E048 +_0220DFEC: + ldr r0, [r4, #0x60] + mov r1, sb + bl ov00_021FE6EC + mov r5, r0 + ldrh r0, [r5, #8] + mov r1, r6 + bl ov00_0220D34C + cmp r0, #0 + blt _0220E03C + ldrh r0, [r5, #8] + mov r1, r7 + bl ov00_0220D34C + cmp r0, #0 + bgt _0220E03C + mov r0, r4 + mov r1, r5 + bl ov00_0220EE00 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E03C: + add sb, sb, #1 + cmp sb, r8 + blt _0220DFEC +_0220E048: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_0220DF74 + + arm_func_start ov00_0220E050 +ov00_0220E050: ; 0x0220E050 + ldr ip, _0220E058 ; =ov00_0220ED84 + bx ip + .balign 4, 0 +_0220E058: .word ov00_0220ED84 + arm_func_end ov00_0220E050 + + arm_func_start ov00_0220E05C +ov00_0220E05C: ; 0x0220E05C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r0, [r4, #0x34] + mov r5, r1 + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r2, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, _0220E0EC ; =ov00_02219CAC + mov r0, r5 + mov r2, #4 + bl memcmp + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldrb r1, [r5, #4] + ldrb r0, [r5, #5] + add r2, sp, #0 + strb r1, [r2] + strb r0, [r2, #1] + ldrb r1, [r5, #6] + ldrb r0, [r5, #7] + strb r1, [r2, #2] + strb r0, [r2, #3] + bl ov00_021FF368 + mov r2, r0 + ldr r1, [sp] + mov r0, r4 + sub r1, r2, r1 + bl ov00_0220C5AC + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220E0EC: .word ov00_02219CAC + arm_func_end ov00_0220E05C + + arm_func_start ov00_0220E0F0 +ov00_0220E0F0: ; 0x0220E0F0 + stmdb sp!, {r3, lr} + ldr r1, [r0, #0xc] + cmp r1, #7 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + cmp r1, #6 + moveq r2, #0 + movne r2, #1 + mov r1, #2 + bl ov00_0220D35C + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220E0F0 + + arm_func_start ov00_0220E128 +ov00_0220E128: ; 0x0220E128 + stmdb sp!, {r3, lr} + cmp r1, #0x64 + sub ip, r3, #3 + bne _0220E154 + add r1, r2, #3 + mov r2, ip + bl ov00_0220DF28 + cmp r0, #0 + bne _0220E1D8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220E154: + cmp r1, #0x65 + bne _0220E178 + add r1, r2, #3 + mov r2, ip + bl ov00_0220DF74 + cmp r0, #0 + bne _0220E1D8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220E178: + cmp r1, #0x66 + bne _0220E19C + mov r1, r2 + mov r2, r3 + bl ov00_0220E050 + cmp r0, #0 + bne _0220E1D8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220E19C: + cmp r1, #0x67 + bne _0220E1C0 + add r1, r2, #3 + mov r2, ip + bl ov00_0220E05C + cmp r0, #0 + bne _0220E1D8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0220E1C0: + cmp r1, #0x68 + bne _0220E1D8 + bl ov00_0220E0F0 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_0220E1D8: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220E128 + + arm_func_start ov00_0220E1E0 +ov00_0220E1E0: ; 0x0220E1E0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x18 + ldr r5, [sp, #0x38] + mov r6, r3 + mov r8, r1 + mov r7, r2 + mov r1, r6 + mov r2, r5 + mov sb, r0 + bl ov00_0220EEEC + str r0, [sp, #0x14] + ldr r0, [sb, #0x2c] + cmp r0, #0 + beq _0220E24C + mov r0, #0 + stmia sp, {r0, r8} + str r7, [sp, #8] + str r0, [sp, #0xc] + ldr r1, [sp, #0x14] + mov r0, sb + mov r2, r6 + mov r3, r5 + bl ov00_0220C860 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E24C: + cmp r7, #2 + ble _0220E270 + ldr r1, _0220E48C ; =ov00_02219CB4 + mov r0, r8 + mov r2, #2 + bl memcmp + cmp r0, #0 + moveq r4, #1 + beq _0220E274 +_0220E270: + mov r4, #0 +_0220E274: + ldr r0, [sp, #0x14] + cmp r0, #0 + bne _0220E378 + add ip, sp, #0x10 + mov r0, sb + mov r1, r6 + mov r2, r5 + mov r3, r8 + stmia sp, {r7, ip} + bl ov00_0220C984 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sp, #0x10] + cmp r0, #0 + addne sp, sp, #0x18 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r4, #0 + beq _0220E2D4 + ldrb r0, [r8, #2] + cmp r0, #1 + beq _0220E314 +_0220E2D4: + cmp r4, #0 + beq _0220E2E8 + ldrb r0, [r8, #2] + cmp r0, #0x68 + beq _0220E308 +_0220E2E8: + mov r0, sb + mov r1, r6 + mov r2, r5 + bl ov00_0220EDB4 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E308: + add sp, sp, #0x18 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E314: + ldr r0, [sb, #0x20] + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r1, sp, #0x14 + mov r0, sb + mov r2, r6 + mov r3, r5 + bl ov00_0220CAAC + cmp r0, #0 + beq _0220E378 + cmp r0, #5 + beq _0220E36C + mov r0, sb + mov r1, r6 + mov r2, r5 + bl ov00_0220EDB4 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E36C: + add sp, sp, #0x18 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E378: + ldr r5, [sp, #0x14] + ldr r0, [r5, #0xc] + cmp r0, #7 + bne _0220E3C0 + cmp r4, #0 + beq _0220E39C + ldrb r0, [r8, #2] + cmp r0, #0x68 + beq _0220E3B4 +_0220E39C: + mov r0, r5 + bl ov00_0220ED98 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E3B4: + add sp, sp, #0x18 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E3C0: + cmp r4, #0 + beq _0220E3F0 + cmp r7, #4 + blt _0220E3F0 + ldr r1, _0220E48C ; =ov00_02219CB4 + add r0, r8, #2 + mov r2, #2 + bl memcmp + cmp r0, #0 + addeq r8, r8, #2 + subeq r7, r7, #2 + moveq r4, #0 +_0220E3F0: + cmp r4, #0 + bne _0220E41C + mov r0, r5 + mov r1, r8 + mov r2, r7 + bl ov00_0220D52C + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x18 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E41C: + ldrb r1, [r8, #2] + cmp r1, #0 + bge _0220E444 + mov r0, r5 + bl ov00_0220D3F0 + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x18 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E444: + cmp r1, #8 + mov r0, r5 + mov r2, r8 + bge _0220E470 + mov r3, r7 + bl ov00_0220DDDC + cmp r0, #0 + movne r0, #1 + add sp, sp, #0x18 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220E470: + mov r3, r7 + bl ov00_0220E128 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0220E48C: .word ov00_02219CB4 + arm_func_end ov00_0220E1E0 + + arm_func_start ov00_0220E490 +ov00_0220E490: ; 0x0220E490 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl ov00_0220EEEC + ldr r1, [r7, #0x2c] + mov r4, r0 + cmp r1, #0 + beq _0220E4F4 + mov r0, #1 + str r0, [sp] + mov ip, #0 + str ip, [sp, #4] + str ip, [sp, #8] + mov r0, r7 + mov r1, r4 + mov r2, r6 + mov r3, r5 + str ip, [sp, #0xc] + bl ov00_0220C860 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0220E4F4: + cmp r4, #0 + addeq sp, sp, #0x10 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + bne _0220E564 + ldr r0, [r4, #0x20] + cmp r0, #0 + beq _0220E534 + bl ov00_021FF368 + ldr r2, [r4, #0x1c] + ldr r1, [r4, #0x20] + sub r0, r0, r2 + cmp r0, r1 + bhs _0220E540 +_0220E534: + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220E540: + mov r0, r4 + mov r1, #6 + mov r2, #1 + bl ov00_0220D35C + cmp r0, #0 + bne _0220E584 + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220E564: + mov r0, r4 + mov r1, #2 + mov r2, #1 + bl ov00_0220D35C + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0220E584: + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220E490 + + arm_func_start ov00_0220E590 +ov00_0220E590: ; 0x0220E590 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x5f0 + mov sl, r0 + ldr r0, [sl] + bl ov00_021FF694 + cmp r0, #0 + beq _0220E6B0 + mvn r5, #0xe + sub r4, r5, #0x14 + add r6, r5, #0xe + add r7, sp, #0x14 + mov sb, #8 + add r8, sp, #0xc + add fp, sp, #8 +_0220E5C8: + str sb, [sp, #8] + stmia sp, {r8, fp} + ldr r0, [sl] + ldr r2, _0220E6BC ; =0x000005DC + mov r1, r7 + mov r3, #0 + bl ov00_021FF940 + mov r2, r0 + cmp r2, r6 + bne _0220E65C + ldr r0, [sl] + bl ov00_021FFA60 + cmp r0, r5 + bne _0220E640 + ldrh ip, [sp, #0xe] + ldr r1, [sp, #0x10] + mov r0, sl + mov r2, ip, asr #8 + and r3, r2, #0xff + mov r2, ip, lsl #8 + and r2, r2, #0xff00 + orr r2, r3, r2 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + bl ov00_0220E490 + cmp r0, #0 + bne _0220E6A0 + add sp, sp, #0x5f0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220E640: + cmp r0, r4 + beq _0220E6A0 + mov r0, sl + bl ov00_0220F6E8 + add sp, sp, #0x5f0 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220E65C: + ldrh ip, [sp, #0xe] + mov r0, sl + mov r1, r7 + mov r3, ip, asr #8 + mov ip, ip, lsl #8 + and r3, r3, #0xff + and ip, ip, #0xff00 + orr r3, r3, ip + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + str r3, [sp] + ldr r3, [sp, #0x10] + bl ov00_0220E1E0 + cmp r0, #0 + addeq sp, sp, #0x5f0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0220E6A0: + ldr r0, [sl] + bl ov00_021FF694 + cmp r0, #0 + bne _0220E5C8 +_0220E6B0: + mov r0, #1 + add sp, sp, #0x5f0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0220E6BC: .word 0x000005DC + arm_func_end ov00_0220E590 + + arm_func_start ov00_0220E6C0 +ov00_0220E6C0: ; 0x0220E6C0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + add r4, sp, #0 + mov r3, #0 + mov r5, r0 + str r3, [r4] + str r3, [r4, #4] + str r3, [r4, #8] + str r3, [r4, #0xc] + ldr r0, [r5, #0x58] + str r0, [sp] + str r2, [sp, #4] + strh r1, [sp, #8] + bl ov00_021FF368 + str r0, [sp, #0xc] + ldr r0, [r5, #0x60] + bl ArrayLength + mov r4, r0 + ldr r0, [r5, #0x60] + add r1, sp, #0 + bl ov00_021FE754 + ldr r0, [r5, #0x60] + bl ArrayLength + add r1, r4, #1 + cmp r1, r0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220E6C0 + + arm_func_start ov00_0220E734 +ov00_0220E734: ; 0x0220E734 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r5, r2 + add r0, r7, #0x50 + mov r6, r1 + mov r4, r3 + bl ov00_0220BF70 + cmp r0, r5 + bge _0220E774 + mov r0, r7 + bl ov00_0220D404 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + strne r0, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220E774: + ldrh r1, [r7, #0x64] + mov r0, r7 + mov r2, r5 + bl ov00_0220E6C0 + cmp r0, #0 + bne _0220E7A8 + mov r0, r7 + bl ov00_0220D404 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + strne r0, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0220E7A8: + ldr r1, _0220E7F4 ; =ov00_02219CB4 + add r0, r7, #0x50 + mov r2, #2 + bl ov00_0220C03C + add r0, r7, #0x50 + and r1, r6, #0xff + bl ov00_0220BF80 + ldrh r1, [r7, #0x64] + add r0, r7, #0x50 + add r2, r1, #1 + strh r2, [r7, #0x64] + bl ov00_0220BFD0 + ldrh r1, [r7, #0x66] + add r0, r7, #0x50 + bl ov00_0220BFD0 + mov r0, #0 + str r0, [r4] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220E7F4: .word ov00_02219CB4 + arm_func_end ov00_0220E734 + + arm_func_start ov00_0220E7F8 +ov00_0220E7F8: ; 0x0220E7F8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0x60] + bl ArrayLength + mov r4, r0 + cmp r4, #0 + bgt _0220E828 + ldr r0, _0220E85C ; =ov00_02219CB8 + ldr r1, _0220E860 ; =ov00_02219CC0 + ldr r2, _0220E864 ; =ov00_02219C94 + ldr r3, _0220E868 ; =0x00000475 + bl __msl_assertion_failed +_0220E828: + ldr r0, [r5, #0x60] + sub r1, r4, #1 + bl ov00_021FE6EC + ldmia r0, {r1, r2} + ldr r3, [r5, #0x50] + mov r0, r5 + add r1, r3, r1 + bl ov00_0220CC38 + cmp r0, #0 + mov r0, #0 + strne r0, [r5, #0x90] + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220E85C: .word ov00_02219CB8 +_0220E860: .word ov00_02219CC0 +_0220E864: .word ov00_02219C94 +_0220E868: .word 0x00000475 + arm_func_end ov00_0220E7F8 + + arm_func_start ov00_0220E86C +ov00_0220E86C: ; 0x0220E86C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r4, r2 + mov r5, r1 + add r3, sp, #0 + add r2, r4, #7 + mov r1, #0 + mov r6, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + mov r2, r4 + add r0, r6, #0x50 + bl ov00_0220C03C + mov r0, r6 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220E86C + + arm_func_start ov00_0220E8E0 +ov00_0220E8E0: ; 0x0220E8E0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + add r3, sp, #0 + mov r1, #1 + mov r2, #0x27 + mov r5, r0 + bl ov00_0220E734 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [sp] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r4 + add r0, r5, #0x50 + mov r2, #0x20 + bl ov00_0220C03C + mov r0, r5 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220E8E0 + + arm_func_start ov00_0220E940 +ov00_0220E940: ; 0x0220E940 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r1 + mov r4, r2 + add r3, sp, #0 + mov r1, #2 + mov r2, #0x47 + mov r6, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r6, #0x50 + mov r2, #0x20 + bl ov00_0220C03C + mov r1, r4 + add r0, r6, #0x50 + mov r2, #0x20 + bl ov00_0220C03C + mov r0, r6 + bl ov00_0220E7F8 + cmp r0, #0 + ldrne r1, [r6, #0x88] + moveq r0, #0 + movne r0, #1 + strne r1, [r6, #0x8c] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220E940 + + arm_func_start ov00_0220E9CC +ov00_0220E9CC: ; 0x0220E9CC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r3 + mov r6, r1 + mov r5, r2 + add r3, sp, #0 + add r2, r4, #0x27 + mov r1, #3 + mov r7, r0 + bl ov00_0220E734 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [sp] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r6 + add r0, r7, #0x50 + mov r2, #0x20 + bl ov00_0220C03C + mov r1, r5 + mov r2, r4 + add r0, r7, #0x50 + bl ov00_0220C03C + mov r0, r7 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220E9CC + + arm_func_start ov00_0220EA44 +ov00_0220EA44: ; 0x0220EA44 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + add r3, sp, #0 + mov r1, #4 + mov r2, #7 + mov r4, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + mov r0, r4 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_0220EA44 + + arm_func_start ov00_0220EAA0 +ov00_0220EAA0: ; 0x0220EAA0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r4, r2 + mov r5, r1 + add r3, sp, #0 + add r2, r4, #7 + mov r1, #5 + mov r6, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + mov r2, r4 + add r0, r6, #0x50 + bl ov00_0220C03C + mov r0, r6 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0220EAA0 + + arm_func_start ov00_0220EB14 +ov00_0220EB14: ; 0x0220EB14 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + add r3, sp, #0 + mov r1, #6 + mov r2, #7 + mov r4, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + mov r0, r4 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_0220EB14 + + arm_func_start ov00_0220EB70 +ov00_0220EB70: ; 0x0220EB70 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r1, #7 + add r3, sp, #0 + mov r2, r1 + mov r4, r0 + bl ov00_0220E734 + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [sp] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + mov r0, r4 + bl ov00_0220E7F8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_0220EB70 + + arm_func_start ov00_0220EBCC +ov00_0220EBCC: ; 0x0220EBCC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r2 + mov sb, r0 + mov r8, r1 + cmp r7, #2 + blt _0220EBFC + ldr r1, _0220EC90 ; =ov00_02219CB4 + mov r0, r8 + mov r2, #2 + bl memcmp + cmp r0, #0 + beq _0220EC1C +_0220EBFC: + mov r0, sb + mov r1, r8 + mov r2, r7 + bl ov00_0220CC38 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0220EC1C: + add r6, r7, #2 + add r0, sb, #0x50 + bl ov00_0220BF70 + cmp r0, r6 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r1, _0220EC90 ; =ov00_02219CB4 + add r0, sb, #0x50 + ldr r5, [sb, #0x50] + ldr r4, [sb, #0x58] + mov r2, #2 + bl ov00_0220C03C + mov r1, r8 + mov r2, r7 + add r0, sb, #0x50 + bl ov00_0220C03C + mov r0, sb + mov r2, r6 + add r1, r5, r4 + bl ov00_0220CC38 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r2, r6 + add r0, sb, #0x50 + mvn r1, #0 + bl ov00_0220C0C4 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0220EC90: .word ov00_02219CB4 + arm_func_end ov00_0220EBCC + + arm_func_start ov00_0220EC94 +ov00_0220EC94: ; 0x0220EC94 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0220ECF4 ; =ov00_02219CB4 + mov r4, r0 + ldrb r3, [r1] + ldrb r2, [r1, #1] + add r0, sp, #0 + mov r1, #0x64 + strb r1, [sp, #2] + strb r3, [r0] + strb r2, [r0, #1] + ldrh r2, [r4, #0x66] + mov r1, #3 + bl ov00_0220D338 + add r1, sp, #0 + mov r0, r4 + mov r2, #5 + bl ov00_0220CC38 + cmp r0, #0 + mov r0, #0 + strne r0, [r4, #0x90] + movne r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220ECF4: .word ov00_02219CB4 + arm_func_end ov00_0220EC94 + + arm_func_start ov00_0220ECF8 +ov00_0220ECF8: ; 0x0220ECF8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r3, _0220ED80 ; =ov00_02219CB4 + mov r4, r1 + ldrb lr, [r3] + ldrb ip, [r3, #1] + mov r5, r0 + add r0, sp, #0 + mov r7, r2 + mov r3, #0x65 + mov r2, r4 + mov r6, #0 + mov r1, #3 + strb lr, [r0] + strb ip, [r0, #1] + strb r3, [sp, #2] + bl ov00_0220D338 + cmp r4, r7 + add r6, r6, #5 + beq _0220ED5C + add r0, sp, #0 + mov r1, r6 + mov r2, r7 + bl ov00_0220D338 + add r6, r6, #2 +_0220ED5C: + add r1, sp, #0 + mov r0, r5 + mov r2, r6 + bl ov00_0220CC38 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220ED80: .word ov00_02219CB4 + arm_func_end ov00_0220ECF8 + + arm_func_start ov00_0220ED84 +ov00_0220ED84: ; 0x0220ED84 + ldr ip, _0220ED94 ; =ov00_0220CC38 + mov r3, #0x67 + strb r3, [r1, #2] + bx ip + .balign 4, 0 +_0220ED94: .word ov00_0220CC38 + arm_func_end ov00_0220ED84 + + arm_func_start ov00_0220ED98 +ov00_0220ED98: ; 0x0220ED98 + ldr ip, _0220EDB0 ; =ov00_0220EDB4 + mov r1, r0 + ldrh r2, [r1, #4] + ldr r0, [r1, #8] + ldr r1, [r1] + bx ip + .balign 4, 0 +_0220EDB0: .word ov00_0220EDB4 + arm_func_end ov00_0220ED98 + + arm_func_start ov00_0220EDB4 +ov00_0220EDB4: ; 0x0220EDB4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr lr, _0220EDFC ; =ov00_02219CB4 + mov ip, #0x68 + ldrb r4, [lr] + ldrb lr, [lr, #1] + add r3, sp, #4 + strb ip, [sp, #6] + strb r4, [r3] + strb lr, [r3, #1] + mov ip, #3 + str ip, [sp] + bl ov00_0220F474 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220EDFC: .word ov00_02219CB4 + arm_func_end ov00_0220EDB4 + + arm_func_start ov00_0220EE00 +ov00_0220EE00: ; 0x0220EE00 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, r1 + ldr r1, [r5] + ldrh r2, [r4, #0x66] + ldr r0, [r4, #0x50] + add r1, r1, #5 + bl ov00_0220D338 + ldr r3, [r4, #0x50] + ldmia r5, {r1, r2} + mov r0, r4 + add r1, r3, r1 + bl ov00_0220CC38 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x88] + str r0, [r5, #0xc] + ldr r0, [r5] + ldr r1, [r4, #0x50] + add r0, r0, #2 + ldrb r0, [r1, r0] + cmp r0, #2 + ldreq r0, [r4, #0x88] + streq r0, [r4, #0x8c] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220EE00 + + arm_func_start ov00_0220EE6C +ov00_0220EE6C: ; 0x0220EE6C + stmdb sp!, {r3, lr} + cmp r3, #0 + beq _0220EE80 + bl ov00_0220E86C + ldmia sp!, {r3, pc} +_0220EE80: + bl ov00_0220EBCC + ldmia sp!, {r3, pc} + arm_func_end ov00_0220EE6C + + arm_func_start ov00_0220EE88 +ov00_0220EE88: ; 0x0220EE88 + stmdb sp!, {r3, lr} + ldr r2, [r0] + ldrh r0, [r2, #4] + ldr r2, [r2] + mul r0, r2, r0 + bl _u32_div_f + mov r0, r1 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220EE88 + + arm_func_start ov00_0220EEA8 +ov00_0220EEA8: ; 0x0220EEA8 + ldr r3, [r0] + ldr r2, [r1] + ldr r0, [r3] + ldr r1, [r2] + cmp r0, r1 + subne r0, r0, r1 + bxne lr + ldrh r1, [r3, #4] + ldrh r0, [r2, #4] + sub r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + bx lr + arm_func_end ov00_0220EEA8 + + arm_func_start ov00_0220EEDC +ov00_0220EEDC: ; 0x0220EEDC + ldr ip, _0220EEE8 ; =ov00_0220CF14 + ldr r0, [r0] + bx ip + .balign 4, 0 +_0220EEE8: .word ov00_0220CF14 + arm_func_end ov00_0220EEDC + + arm_func_start ov00_0220EEEC +ov00_0220EEEC: ; 0x0220EEEC + stmdb sp!, {lr} + sub sp, sp, #0xa4 + add r3, sp, #4 + str r1, [sp, #4] + strh r2, [sp, #8] + str r3, [sp] + ldr r0, [r0, #0xc] + add r1, sp, #0 + bl ov00_021FF0C0 + cmp r0, #0 + ldrne r0, [r0] + moveq r0, #0 + add sp, sp, #0xa4 + ldmia sp!, {pc} + arm_func_end ov00_0220EEEC + + arm_func_start ov00_0220EF24 +ov00_0220EF24: ; 0x0220EF24 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + mov r4, r1 + mov r6, r3 + mov r5, r0 + mov r7, r2 + bl ov00_021FF3CC + cmp r6, #0 + moveq r6, #0x10000 + cmp r7, #0 + add r1, sp, #0x10 + add r2, sp, #8 + mov r0, r4 + moveq r7, #0x10000 + bl ov00_0220F7D4 + cmp r0, #0 + addeq sp, sp, #0x1c + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r0, #0x44 + bl ov00_021EC3A8 + movs r4, r0 + addeq sp, sp, #0x1c + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r1, #0 + mov r2, #0x44 + bl memset + mvn r0, #0 + str r0, [r4] + str r6, [r4, #0x3c] + ldr r1, [sp, #0x30] + str r7, [r4, #0x38] + str r1, [r4, #0x24] + ldr r0, _0220F138 ; =ov00_0220EEA8 + ldr r3, _0220F13C ; =ov00_0220EE88 + str r0, [sp] + mov ip, #0 + mov r0, #4 + mov r1, #0x20 + mov r2, #2 + str ip, [sp, #4] + bl ov00_021FED4C + str r0, [r4, #0xc] + cmp r0, #0 + bne _0220EFF0 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x1c + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220EFF0: + mov r0, #4 + ldr r2, _0220F140 ; =ov00_0220EEDC + mov r1, r0 + bl ov00_021FE5B4 + str r0, [r4, #0x10] + cmp r0, #0 + bne _0220F028 + ldr r0, [r4, #0xc] + bl ov00_021FEE8C + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x1c + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220F028: + mov r0, #2 + mov r1, r0 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4] + cmp r0, r1 + bne _0220F06C + ldr r0, [r4, #0xc] + bl ov00_021FEE8C + ldr r0, [r4, #0x10] + bl ov00_021FE678 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x1c + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220F06C: + ldrh r0, [sp, #8] + add r1, sp, #0x14 + mov ip, #0 + mov r2, r0, asr #8 + mov r0, r0, lsl #8 + and r2, r2, #0xff + and r0, r0, #0xff00 + orr r0, r2, r0 + str ip, [r1] + mov r2, #2 + strb r2, [sp, #0x15] + ldr r3, [sp, #0x10] + str ip, [r1, #4] + str r3, [sp, #0x18] + strh r0, [sp, #0x16] + ldr r0, [r4] + mov r2, #8 + bl ov00_021FF840 + mvn r1, #0 + cmp r0, r1 + bne _0220F0EC + ldr r0, [r4] + bl ov00_021FF818 + ldr r0, [r4, #0xc] + bl ov00_021FEE8C + ldr r0, [r4, #0x10] + bl ov00_021FE678 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x1c + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, pc} +_0220F0EC: + mov r0, #8 + str r0, [sp, #0xc] + ldr r0, [r4] + add r1, sp, #0x14 + add r2, sp, #0xc + bl ov00_021FFA18 + ldr r1, [sp, #0x18] + mov r0, #0 + str r1, [r4, #4] + ldrh r1, [sp, #0x16] + mov r2, r1, asr #8 + mov r1, r1, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + strh r1, [r4, #8] + str r4, [r5] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0220F138: .word ov00_0220EEA8 +_0220F13C: .word ov00_0220EE88 +_0220F140: .word ov00_0220EEDC + arm_func_end ov00_0220EF24 + + arm_func_start ov00_0220F144 +ov00_0220F144: ; 0x0220F144 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x1c] + cmp r0, #0 + movne r0, #1 + strne r0, [r4, #0x14] + ldmneia sp!, {r4, pc} + ldr r0, [r4] + bl ov00_021FF818 + ldr r0, [r4, #0xc] + bl ov00_021FEE8C + ldr r0, [r4, #0x10] + bl ov00_021FE678 + mov r0, r4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220F144 + + arm_func_start ov00_0220F188 +ov00_0220F188: ; 0x0220F188 + str r1, [r0, #0x20] + bx lr + arm_func_end ov00_0220F188 + + arm_func_start ov00_0220F190 +ov00_0220F190: ; 0x0220F190 + ldr ip, _0220F19C ; =ov00_021EC3A8 + mov r0, #0xa0 + bx ip + .balign 4, 0 +_0220F19C: .word ov00_021EC3A8 + arm_func_end ov00_0220F190 + + arm_func_start ov00_0220F1A0 +ov00_0220F1A0: ; 0x0220F1A0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r3 + mov r5, r2 + mov r3, #0 + mov r6, r1 + mov r1, r5 + mov r2, r4 + mov r7, r0 + str r3, [sp] + bl ov00_0220EEEC + cmp r0, #0 + movne r0, #5 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov00_0220F190 + str r0, [sp] + cmp r0, #0 + beq _0220F330 + mov r1, #0 + mov r2, #0xa0 + bl memset + ldr r0, [sp] + str r5, [r0] + ldr r0, [sp] + strh r4, [r0, #4] + ldr r0, [sp] + str r7, [r0, #8] + bl ov00_021FF368 + ldr r2, [sp] + mov r1, #0 + str r0, [r2, #0x1c] + ldr r2, [sp] + ldr r0, [r2, #0x1c] + str r0, [r2, #0x88] + ldr r0, [sp] + strh r1, [r0, #0x64] + ldr r0, [sp] + strh r1, [r0, #0x66] + ldr r0, [sp] + ldr r1, [r7, #0x3c] + add r0, r0, #0x44 + bl ov00_0220BF44 + cmp r0, #0 + beq _0220F330 + ldr r0, [sp] + ldr r1, [r7, #0x38] + add r0, r0, #0x50 + bl ov00_0220BF44 + cmp r0, #0 + beq _0220F330 + mov r0, #0x10 + mov r1, #0x40 + mov r2, #0 + bl ov00_021FE5B4 + ldr r1, [sp] + str r0, [r1, #0x5c] + ldr r0, [sp] + ldr r0, [r0, #0x5c] + cmp r0, #0 + beq _0220F330 + mov r0, #0x10 + mov r1, #0x40 + mov r2, #0 + bl ov00_021FE5B4 + ldr r1, [sp] + str r0, [r1, #0x60] + ldr r0, [sp] + ldr r0, [r0, #0x60] + cmp r0, #0 + beq _0220F330 + mov r0, #4 + mov r1, #2 + mov r2, #0 + bl ov00_021FE5B4 + ldr r1, [sp] + str r0, [r1, #0x98] + ldr r0, [sp] + ldr r0, [r0, #0x98] + cmp r0, #0 + beq _0220F330 + mov r0, #4 + mov r1, #2 + mov r2, #0 + bl ov00_021FE5B4 + ldr r1, [sp] + str r0, [r1, #0x9c] + ldr r0, [sp] + ldr r0, [r0, #0x9c] + cmp r0, #0 + beq _0220F330 + ldr r0, [r7, #0xc] + add r1, sp, #0 + bl ov00_021FEF74 + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl ov00_0220EEEC + str r0, [r6] + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_0220F330: + ldr r0, [sp] + cmp r0, #0 + beq _0220F3A8 + ldr r0, [r0, #0x44] + bl ov00_021EC3D8 + ldr r0, [sp] + ldr r0, [r0, #0x50] + bl ov00_021EC3D8 + ldr r0, [sp] + ldr r0, [r0, #0x5c] + cmp r0, #0 + beq _0220F364 + bl ov00_021FE678 +_0220F364: + ldr r0, [sp] + ldr r0, [r0, #0x60] + cmp r0, #0 + beq _0220F378 + bl ov00_021FE678 +_0220F378: + ldr r0, [sp] + ldr r0, [r0, #0x98] + cmp r0, #0 + beq _0220F38C + bl ov00_021FE678 +_0220F38C: + ldr r0, [sp] + ldr r0, [r0, #0x9c] + cmp r0, #0 + beq _0220F3A0 + bl ov00_021FE678 +_0220F3A0: + ldr r0, [sp] + bl ov00_021EC3D8 +_0220F3A8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_0220F1A0 + + arm_func_start ov00_0220F3B0 +ov00_0220F3B0: ; 0x0220F3B0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + ldr r1, [sp, #0x10] + ldr r0, [r1, #0x14] + cmp r0, #0 + ldreq r0, [r1, #0x24] + cmpeq r0, #0 + ldmneia sp!, {r4, r5, r6, lr} + addne sp, sp, #0x10 + bxne lr + ldr r0, [r1, #0xc] + cmp r0, #7 + ldr r0, [r1, #8] + bne _0220F45C + ldr r0, [r0, #0x10] + bl ArrayLength + mov r4, r0 + mov r5, #0 + cmp r4, #0 + ldmleia sp!, {r4, r5, r6, lr} + addle sp, sp, #0x10 + bxle lr +_0220F408: + ldr r6, [sp, #0x10] + mov r1, r5 + ldr r0, [r6, #8] + ldr r0, [r0, #0x10] + bl ov00_021FE6EC + ldr r0, [r0] + cmp r6, r0 + bne _0220F444 + ldr r0, [r6, #8] + mov r1, r5 + ldr r0, [r0, #0x10] + bl ov00_021FE968 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_0220F444: + add r5, r5, #1 + cmp r5, r4 + blt _0220F408 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_0220F45C: + ldr r0, [r0, #0xc] + add r1, sp, #0x10 + bl ov00_021FF01C + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220F3B0 + + arm_func_start ov00_0220F474 +ov00_0220F474: ; 0x0220F474 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + mov r6, r0 + mov r5, r1 + add r0, sp, #0x34 + add r1, sp, #0x38 + mov r4, r2 + bl ov00_0220F958 + ldr r0, [r6] + bl ov00_021FF6BC + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr + mov r1, r4, asr #8 + mov r0, r4, lsl #8 + add r2, sp, #0x10 + mov r3, #0 + str r3, [r2, #4] + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + str r3, [r2] + mov r1, #2 + strh r0, [sp, #0x12] + strb r1, [sp, #0x11] + str r5, [sp, #0x14] + str r2, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [r6] + ldr r1, [sp, #0x34] + ldr r2, [sp, #0x38] + bl ov00_021FF984 + mvn r1, #0 + cmp r0, r1 + bne _0220F5A0 + ldr r0, [r6] + bl ov00_021FFA60 + mvn r2, #0xe + cmp r0, r2 + bne _0220F554 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_0220E490 + cmp r0, #0 + bne _0220F608 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_0220F554: + sub r1, r2, #0x1b + cmp r0, r1 + addne r1, r2, #9 + cmpne r0, r1 + addeq sp, sp, #0x18 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr + sub r1, r2, #0x14 + cmp r0, r1 + beq _0220F608 + mov r0, r6 + bl ov00_0220F6E8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_0220F5A0: + ldr r0, [r6, #0x28] + cmp r0, #0 + beq _0220F608 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov00_0220EEEC + mov r1, #0 + str r1, [sp] + ldr r2, [sp, #0x34] + mov r1, r0 + str r2, [sp, #4] + ldr ip, [sp, #0x38] + mov r3, r4 + mov r0, r6 + mov r2, r5 + str ip, [sp, #8] + mov r4, #1 + str r4, [sp, #0xc] + bl ov00_0220C860 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr +_0220F608: + mov r0, #1 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_0220F474 + + arm_func_start ov00_0220F61C +ov00_0220F61C: ; 0x0220F61C + stmdb sp!, {r4, lr} + ldr r4, [r0] + ldr r1, [r1] + ldr r0, [r4, #0xc] + cmp r0, #7 + beq _0220F648 + mov r0, r4 + bl ov00_0220CE00 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_0220F648: + ldr r0, [r4, #0xc] + cmp r0, #7 + ldreq r0, [r4, #0x14] + cmpeq r0, #0 + ldreq r0, [r4, #0x24] + cmpeq r0, #0 + bne _0220F66C + mov r0, r4 + bl ov00_0220F3B0 +_0220F66C: + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220F61C + + arm_func_start ov00_0220F674 +ov00_0220F674: ; 0x0220F674 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + bl ov00_021FF368 + str r0, [sp] + ldr r0, [r4, #0xc] + ldr r1, _0220F6AC ; =ov00_0220F61C + add r2, sp, #0 + bl ov00_021FF264 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0220F6AC: .word ov00_0220F61C + arm_func_end ov00_0220F674 + + arm_func_start ov00_0220F6B0 +ov00_0220F6B0: ; 0x0220F6B0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0x10] + bl ArrayLength + subs r4, r0, #1 + ldmmiia sp!, {r3, r4, r5, pc} +_0220F6C8: + ldr r0, [r5, #0x10] + mov r1, r4 + bl ov00_021FE6EC + ldr r0, [r0] + bl ov00_0220F3B0 + subs r4, r4, #1 + bpl _0220F6C8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_0220F6B0 + + arm_func_start ov00_0220F6E8 +ov00_0220F6E8: ; 0x0220F6E8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x18] + cmp r1, #0 + ldmneia sp!, {r4, pc} + mov r1, #1 + str r1, [r4, #0x18] + bl ov00_0220D238 + mov r0, r4 + bl ov00_0220C164 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_0220F144 + ldmia sp!, {r4, pc} + arm_func_end ov00_0220F6E8 + + arm_func_start ov00_0220F724 +ov00_0220F724: ; 0x0220F724 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r2 + mov r5, r1 + bne _0220F750 + ldr r2, _0220F7C0 ; =ov00_0221B634 + ldr r3, _0220F7C4 ; =ov00_0221B638 + ldr ip, [r2] + mov r1, #0x16 + eor ip, ip, #1 + mla r4, ip, r1, r3 + str ip, [r2] +_0220F750: + cmp r0, #0 + beq _0220F798 + str r0, [sp] + cmp r5, #0 + beq _0220F780 + bl SOC_InetNtoA + mov r2, r0 + ldr r1, _0220F7C8 ; =ov00_02219CE4 + mov r0, r4 + mov r3, r5 + bl sprintf + b _0220F7B8 +_0220F780: + bl SOC_InetNtoA + mov r2, r0 + ldr r1, _0220F7CC ; =ov00_02219CEC + mov r0, r4 + bl sprintf + b _0220F7B8 +_0220F798: + cmp r5, #0 + moveq r0, #0 + streqb r0, [r4] + beq _0220F7B8 + ldr r1, _0220F7D0 ; =ov00_02219CF0 + mov r0, r4 + mov r2, r5 + bl sprintf +_0220F7B8: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0220F7C0: .word ov00_0221B634 +_0220F7C4: .word ov00_0221B638 +_0220F7C8: .word ov00_02219CE4 +_0220F7CC: .word ov00_02219CEC +_0220F7D0: .word ov00_02219CF0 + arm_func_end ov00_0220F724 + + arm_func_start ov00_0220F7D4 +ov00_0220F7D4: ; 0x0220F7D4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x104 + movs r8, r0 + mov r7, r1 + ldrnesb r1, [r8] + mov r6, r2 + cmpne r1, #0 + moveq r4, #0 + moveq r5, r4 + beq _0220F928 + mov r1, #0x3a + bl strchr + movs r5, r0 + moveq r5, #0 + beq _0220F8E4 + cmp r5, r8 + moveq r8, #0 + moveq r4, r8 + beq _0220F85C + sub sb, r5, r8 + cmp sb, #0x100 + blt _0220F840 + ldr r0, _0220F944 ; =ov00_02219CF4 + ldr r1, _0220F948 ; =ov00_02219D14 + ldr r2, _0220F94C ; =ov00_02219CD0 + mov r3, #0x81 + bl __msl_assertion_failed +_0220F840: + add r0, sp, #0 + mov r1, r8 + mov r2, sb + bl memcpy + add r8, sp, #0 + mov r0, #0 + strb r0, [r8, sb] +_0220F85C: + ldrsb r0, [r5, #1] + add r3, r5, #1 + cmp r0, #0 + beq _0220F8B4 + ldr r1, _0220F950 ; =_0210E504 + mov r2, #0 +_0220F874: + cmp r0, #0 + blt _0220F884 + cmp r0, #0x80 + blt _0220F88C +_0220F884: + mov r0, r2 + b _0220F898 +_0220F88C: + mov r0, r0, lsl #1 + ldrh r0, [r1, r0] + and r0, r0, #8 +_0220F898: + cmp r0, #0 + addeq sp, sp, #0x104 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldrsb r0, [r3, #1]! + cmp r0, #0 + bne _0220F874 +_0220F8B4: + add r0, r5, #1 + bl atoi + cmp r0, #0 + blt _0220F8D0 + ldr r1, _0220F954 ; =0x0000FFFF + cmp r0, r1 + ble _0220F8DC +_0220F8D0: + add sp, sp, #0x104 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0220F8DC: + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 +_0220F8E4: + cmp r8, #0 + beq _0220F928 + mov r0, r8 + bl ov00_021FFA44 + mov r4, r0 + mvn r0, #0 + cmp r4, r0 + bne _0220F928 + mov r0, r8 + bl SOC_GetHostByName + cmp r0, #0 + addeq sp, sp, #0x104 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r4, [r0] +_0220F928: + cmp r7, #0 + strne r4, [r7] + cmp r6, #0 + strneh r5, [r6] + mov r0, #1 + add sp, sp, #0x104 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0220F944: .word ov00_02219CF4 +_0220F948: .word ov00_02219D14 +_0220F94C: .word ov00_02219CD0 +_0220F950: .word _0210E504 +_0220F954: .word 0x0000FFFF + arm_func_end ov00_0220F7D4 + + arm_func_start ov00_0220F958 +ov00_0220F958: ; 0x0220F958 + stmdb sp!, {r4, lr} + ldr r2, [r0] + mov r4, r1 + cmp r2, #0 + bne _0220F980 + ldr r2, _0220F9A4 ; =ov00_02219D24 + mov r1, #0 + str r2, [r0] + str r1, [r4] + ldmia sp!, {r4, pc} +_0220F980: + ldr r1, [r4] + mvn r0, #0 + cmp r1, r0 + ldmneia sp!, {r4, pc} + mov r0, r2 + bl strlen + add r0, r0, #1 + str r0, [r4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0220F9A4: .word ov00_02219D24 + arm_func_end ov00_0220F958 + + arm_func_start ov00_0220F9A8 +ov00_0220F9A8: ; 0x0220F9A8 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _0220FA0C ; =ov00_0221B664 + mov r6, r0 + ldr r0, [r1, #0x10] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r5, #0 + bl ArrayLength + cmp r0, #0 + ble _0220FA04 + ldr r4, _0220FA0C ; =ov00_0221B664 +_0220F9D8: + ldr r0, [r4, #0x10] + mov r1, r5 + bl ov00_021FE6EC + ldr r1, [r0, #8] + cmp r1, r6 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #0x10] + add r5, r5, #1 + bl ArrayLength + cmp r5, r0 + blt _0220F9D8 +_0220FA04: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220FA0C: .word ov00_0221B664 + arm_func_end ov00_0220F9A8 + + arm_func_start ov00_0220FA10 +ov00_0220FA10: ; 0x0220FA10 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + mvn r1, #0 + cmp r0, r1 + beq _0220FA2C + bl ov00_021FF818 +_0220FA2C: + mvn r0, #0 + str r0, [r4] + mov r0, #4 + str r0, [r4, #0x10] + ldmia sp!, {r4, pc} + arm_func_end ov00_0220FA10 + + arm_func_start ov00_0220FA40 +ov00_0220FA40: ; 0x0220FA40 + stmdb sp!, {r3, lr} + sub sp, sp, #0x40 + mov r0, #0 + add r3, sp, #0 + mov r1, r0 + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + ldr r2, _0220FAD0 ; =ov00_0221B664 + stmia r3!, {r0, r1} + ldr r2, [r2, #0x10] + stmia r3, {r0, r1} + cmp r2, #0 + bne _0220FA9C + ldr r2, _0220FAD4 ; =ov00_0220FA10 + mov r0, #0x40 + mov r1, #4 + bl ov00_021FE5B4 + ldr r1, _0220FAD0 ; =ov00_0221B664 + str r0, [r1, #0x10] +_0220FA9C: + ldr r0, _0220FAD0 ; =ov00_0221B664 + add r1, sp, #0 + ldr r0, [r0, #0x10] + bl ov00_021FE754 + ldr r0, _0220FAD0 ; =ov00_0221B664 + ldr r0, [r0, #0x10] + bl ArrayLength + ldr r2, _0220FAD0 ; =ov00_0221B664 + sub r1, r0, #1 + ldr r0, [r2, #0x10] + bl ov00_021FE6EC + add sp, sp, #0x40 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220FAD0: .word ov00_0221B664 +_0220FAD4: .word ov00_0220FA10 + arm_func_end ov00_0220FA40 + + arm_func_start ov00_0220FAD8 +ov00_0220FAD8: ; 0x0220FAD8 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _0220FB3C ; =ov00_0221B664 + mov r6, r0 + ldr r0, [r1, #0x10] + mov r5, #0 + bl ArrayLength + cmp r0, #0 + ldmleia sp!, {r4, r5, r6, pc} + ldr r4, _0220FB3C ; =ov00_0221B664 +_0220FAFC: + ldr r0, [r4, #0x10] + mov r1, r5 + bl ov00_021FE6EC + cmp r6, r0 + bne _0220FB24 + ldr r0, _0220FB3C ; =ov00_0221B664 + mov r1, r5 + ldr r0, [r0, #0x10] + bl ov00_021FE8D8 + ldmia sp!, {r4, r5, r6, pc} +_0220FB24: + ldr r0, [r4, #0x10] + add r5, r5, #1 + bl ArrayLength + cmp r5, r0 + blt _0220FAFC + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0220FB3C: .word ov00_0221B664 + arm_func_end ov00_0220FAD8 + + arm_func_start ov00_0220FB40 +ov00_0220FB40: ; 0x0220FB40 + stmdb sp!, {r3, lr} + ldr r0, _0220FB68 ; =ov00_0221B664 + ldr r0, [r0, #0x10] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021FE678 + ldr r0, _0220FB68 ; =ov00_0221B664 + mov r1, #0 + str r1, [r0, #0x10] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220FB68: .word ov00_0221B664 + arm_func_end ov00_0220FB40 + + arm_func_start ov00_0220FB6C +ov00_0220FB6C: ; 0x0220FB6C + stmdb sp!, {r3, lr} + ldr r1, _0220FB8C ; =ov00_02219D28 + mov r2, #6 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0220FB8C: .word ov00_02219D28 + arm_func_end ov00_0220FB6C + + arm_func_start ov00_0220FB90 +ov00_0220FB90: ; 0x0220FB90 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + mov ip, r2, asr #8 + mov r2, r2, lsl #8 + str r1, [sp, #0xc] + mov r1, r3 + and r3, ip, #0xff + and r2, r2, #0xff00 + orr r2, r3, r2 + mov lr, #2 + strh r2, [sp, #0xa] + add r3, sp, #8 + strb lr, [sp, #9] + str r3, [sp] + mov ip, #8 + ldr r2, [sp, #0x18] + mov r3, #0 + str ip, [sp, #4] + bl ov00_021FF984 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + arm_func_end ov00_0220FB90 + + arm_func_start ov00_0220FBE4 +ov00_0220FBE4: ; 0x0220FBE4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, #0 + bl ov00_021FF6E4 + movs r6, r0 + moveq r0, r7 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, _0220FC44 ; =0x0100007F + mov r5, r7 +_0220FC04: + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + cmp r0, #0 + beq _0220FC3C + ldr r1, [r0] + cmp r1, r4 + beq _0220FC34 + mov r7, r1 + bl ov00_021FF770 + cmp r0, #0 + movne r0, r7 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_0220FC34: + add r5, r5, #1 + b _0220FC04 +_0220FC3C: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0220FC44: .word 0x0100007F + arm_func_end ov00_0220FBE4 + + arm_func_start ov00_0220FC48 +ov00_0220FC48: ; 0x0220FC48 + stmdb sp!, {lr} + sub sp, sp, #0xc + mov r3, #8 + add r1, sp, #4 + add r2, sp, #0 + str r3, [sp] + bl ov00_021FFA18 + mvn r1, #0 + cmp r0, r1 + moveq r0, #0 + ldrneh r0, [sp, #6] + add sp, sp, #0xc + ldmia sp!, {pc} + arm_func_end ov00_0220FC48 + + arm_func_start ov00_0220FC7C +ov00_0220FC7C: ; 0x0220FC7C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x5c + ldr r2, _0220FEB4 ; =ov00_02219D28 + mov r1, #0 + ldrb lr, [r2] + ldrb ip, [r2, #1] + add r5, sp, #4 + ldrb r8, [r2, #2] + ldrb r7, [r2, #3] + ldrb r4, [r2, #4] + ldrb r3, [r2, #5] + mov r2, #2 + mov r6, r0 + strb lr, [r5] + strb ip, [r5, #1] + strb r8, [r5, #2] + strb r7, [r5, #3] + strb r4, [r5, #4] + strb r3, [r5, #5] + strb r1, [r5, #7] + strb r2, [r5, #6] + ldr r2, [r6, #0xc] + sub r0, r1, #1 + strb r2, [r5, #0xd] + ldr r7, [r6, #8] + mov r3, r7, lsr #0x18 + mov r2, r7, lsr #8 + mov r4, r7, lsl #8 + and r3, r3, #0xff + and r2, r2, #0xff00 + mov r7, r7, lsl #0x18 + orr r2, r3, r2 + and r4, r4, #0xff0000 + and r3, r7, #0xff000000 + orr r2, r4, r2 + orr r2, r3, r2 + str r2, [r5, #8] + ldr r2, [r6, #4] + cmp r2, r0 + movne r1, #1 + strb r1, [r5, #0xe] + bl ov00_0220FBE4 + mov r7, r0 + bl ov00_0220FBE4 + mov r8, r0 + bl ov00_0220FBE4 + mov r4, r0 + bl ov00_0220FBE4 + mov r2, #0 + mov r1, r7, lsl #0x18 + and r7, r1, #0xff000000 + mov r1, r8, lsl #8 + mov r0, r0, lsr #8 + and r3, r1, #0xff0000 + mov r1, r4, lsr #0x18 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + orr r0, r3, r0 + orr r3, r7, r0 + mov r1, r3, lsr #0x18 + strb r1, [sp, #0x13] + mov r1, r3, lsr #8 + mov r0, r3, lsr #0x10 + strb r1, [sp, #0x15] + strb r0, [sp, #0x14] + ldr r1, _0220FEB8 ; =ov00_0221B16C + add r0, sp, #0x19 + strb r3, [sp, #0x16] + strb r2, [sp, #0x17] + strb r2, [sp, #0x18] + bl strcpy + ldr r0, _0220FEB8 ; =ov00_0221B16C + bl strlen + ldrb r1, [r5, #0xe] + add r4, r0, #0x16 + cmp r1, #0 + beq _0220FDE4 + ldr r0, [r6, #0x14] + cmp r0, #0 + bne _0220FDE4 + mov r0, #0 + strb r0, [r5, #0xc] + str r4, [sp] + ldr r1, _0220FEBC ; =ov00_0221B664 + ldr r0, [r6, #4] + ldr r1, [r1, #0xc] + ldr r2, _0220FEC0 ; =0x00006CFD + mov r3, r5 + bl ov00_0220FB90 +_0220FDE4: + ldr r0, [r6, #0x18] + cmp r0, #0 + bne _0220FE14 + mov r0, #1 + strb r0, [r5, #0xc] + str r4, [sp] + ldr r1, _0220FEBC ; =ov00_0221B664 + ldr r0, [r6] + ldr r1, [r1, #0xc] + ldr r2, _0220FEC0 ; =0x00006CFD + mov r3, r5 + bl ov00_0220FB90 +_0220FE14: + ldrb r0, [r5, #0xe] + cmp r0, #0 + ldrne r8, [r6, #4] + ldreq r8, [r6] + cmp r0, #0 + ldrne r0, [r6, #4] + ldreq r0, [r6] + bl ov00_0220FC48 + mov r7, r0 + mov r0, r8 + bl ov00_0220FC48 + mov r1, r7, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, r1, asr #8 + strb r1, [sp, #0x18] + strb r0, [sp, #0x17] + ldr r0, [r6, #0x1c] + cmp r0, #0 + bne _0220FE98 + mov r0, #2 + strb r0, [r5, #0xc] + str r4, [sp] + ldr r1, _0220FEBC ; =ov00_0221B664 + ldr r0, [r6] + ldr r1, [r1, #8] + ldr r2, _0220FEC0 ; =0x00006CFD + mov r3, r5 + bl ov00_0220FB90 +_0220FE98: + bl ov00_021FF368 + add r0, r0, #0x1f4 + str r0, [r6, #0x28] + mov r0, #0x1e + str r0, [r6, #0x24] + add sp, sp, #0x5c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220FEB4: .word ov00_02219D28 +_0220FEB8: .word ov00_0221B16C +_0220FEBC: .word ov00_0221B664 +_0220FEC0: .word 0x00006CFD + arm_func_end ov00_0220FC7C + + arm_func_start ov00_0220FEC4 +ov00_0220FEC4: ; 0x0220FEC4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x18 + ldr r1, _0220FFE0 ; =ov00_02219D28 + mov r2, #2 + ldrb r7, [r1] + ldrb r6, [r1, #1] + add r8, sp, #4 + ldrb r5, [r1, #2] + ldrb lr, [r1, #3] + ldrb ip, [r1, #4] + ldrb r3, [r1, #5] + mov r1, #7 + mov r4, r0 + strb r7, [r8] + strb r6, [r8, #1] + strb r5, [r8, #2] + strb lr, [r8, #3] + strb ip, [r8, #4] + strb r2, [sp, #0xa] + strb r1, [sp, #0xb] + strb r3, [r8, #5] + ldr r3, [r4, #8] + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r3, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + str r0, [sp, #0xc] + ldr r0, [r4, #0x2c] + add r3, sp, #4 + str r0, [sp, #0x10] + ldrh r0, [r4, #0x30] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #0x14] + ldrb r0, [r4, #0x32] + mvn r1, #0 + strb r0, [sp, #0x16] + ldr r0, [r4, #0x10] + cmp r0, #2 + movne r0, #1 + moveq r0, #0 + strb r0, [sp, #0x17] + ldr r0, [r4, #4] + cmp r0, r1 + ldreq r0, [r4] + mov r1, #0x14 + str r1, [sp] + ldrh r2, [r4, #0x30] + ldr r1, [r4, #0x2c] + bl ov00_0220FB90 + bl ov00_021FF368 + add r0, r0, #0x2bc + str r0, [r4, #0x28] + mov r0, #0xc + str r0, [r4, #0x24] + ldrb r0, [r4, #0x32] + cmp r0, #0 + movne r0, #1 + strneb r0, [r4, #0x33] + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0220FFE0: .word ov00_02219D28 + arm_func_end ov00_0220FEC4 + + arm_func_start ov00_0220FFE4 +ov00_0220FFE4: ; 0x0220FFE4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_021FFA44 + mvn r1, #0 + cmp r0, r1 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl SOC_GetHostByName + cmp r0, #0 + moveq r0, #0 + ldrne r0, [r0, #0xc] + ldrne r0, [r0] + ldrne r0, [r0] + ldmia sp!, {r4, pc} + arm_func_end ov00_0220FFE4 + + arm_func_start ov00_0221001C +ov00_0221001C: ; 0x0221001C + stmdb sp!, {lr} + sub sp, sp, #0x84 + cmp r0, #0 + bne _02210048 + ldr r2, _02210054 ; =ov00_02219D30 + str r1, [sp] + ldr r3, _02210058 ; =ov00_0221B16C + add r0, sp, #4 + mov r1, #0x80 + bl snprintf + add r0, sp, #4 +_02210048: + bl ov00_0220FFE4 + add sp, sp, #0x84 + ldmia sp!, {pc} + .balign 4, 0 +_02210054: .word ov00_02219D30 +_02210058: .word ov00_0221B16C + arm_func_end ov00_0221001C + + arm_func_start ov00_0221005C +ov00_0221005C: ; 0x0221005C + stmdb sp!, {r3, lr} + ldr r0, _022100C8 ; =ov00_0221B664 + ldr r1, [r0, #0xc] + cmp r1, #0 + bne _02210084 + ldr r0, [r0, #4] + ldr r1, _022100CC ; =ov00_02219D38 + bl ov00_0221001C + ldr r1, _022100C8 ; =ov00_0221B664 + str r0, [r1, #0xc] +_02210084: + ldr r0, _022100C8 ; =ov00_0221B664 + ldr r1, [r0, #8] + cmp r1, #0 + bne _022100A8 + ldr r0, [r0] + ldr r1, _022100D0 ; =ov00_02219D54 + bl ov00_0221001C + ldr r1, _022100C8 ; =ov00_0221B664 + str r0, [r1, #8] +_022100A8: + ldr r0, _022100C8 ; =ov00_0221B664 + ldr r1, [r0, #0xc] + cmp r1, #0 + ldrne r0, [r0, #8] + cmpne r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022100C8: .word ov00_0221B664 +_022100CC: .word ov00_02219D38 +_022100D0: .word ov00_02219D54 + arm_func_end ov00_0221005C + + arm_func_start ov00_022100D4 +ov00_022100D4: ; 0x022100D4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr ip, _02210198 ; =ov00_0221B0D0 + mov r8, r0 + ldr r0, [ip] + mov r7, r1 + cmp r0, #1 + mov r6, r2 + mov r5, r3 + movne r0, #2 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + bl ov00_0221005C + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + bl ov00_0220FA40 + movs r4, r0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r8, [r4, #4] + str r6, [r4, #0xc] + str r7, [r4, #8] + ldr r1, [sp, #0x18] + str r5, [r4, #0x34] + ldr r2, [sp, #0x1c] + str r1, [r4, #0x38] + mov r0, #2 + str r2, [r4, #0x3c] + mov r1, r0 + mov r2, #0 + bl ov00_021FF804 + mov r2, #0 + str r0, [r4] + str r2, [r4, #0x20] + strb r2, [r4, #0x32] + strb r2, [r4, #0x33] + str r2, [r4, #0x2c] + strh r2, [r4, #0x30] + str r2, [r4, #0x24] + ldr r1, [r4] + sub r0, r2, #1 + cmp r1, r0 + mov r0, r4 + bne _0221018C + bl ov00_0220FAD8 + mov r0, #2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221018C: + bl ov00_0220FC7C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02210198: .word ov00_0221B0D0 + arm_func_end ov00_022100D4 + + arm_func_start ov00_0221019C +ov00_0221019C: ; 0x0221019C + stmdb sp!, {r4, lr} + bl ov00_0220F9A8 + movs r4, r0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4] + mvn r1, #0 + cmp r0, r1 + beq _022101C0 + bl ov00_021FF818 +_022101C0: + mvn r0, #0 + str r0, [r4] + mov r0, #4 + str r0, [r4, #0x10] + ldmia sp!, {r4, pc} + arm_func_end ov00_0221019C + + arm_func_start ov00_022101D4 +ov00_022101D4: ; 0x022101D4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x1c + mov r2, #8 + mov sb, r0 + str r2, [sp, #0x10] + ldr r1, [sb, #0x10] + cmp r1, #4 + bne _02210200 + bl ov00_0220FAD8 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_02210200: + ldr r0, [sb] + sub r1, r2, #9 + cmp r0, r1 + beq _0221027C + ldr r6, _022103C0 ; =ov00_0221B678 + add r8, sp, #0x14 + add r7, sp, #0x10 + mov r5, #0x200 + mov r4, #0 + mvn sl, #0 +_02210228: + bl ov00_021FF694 + cmp r0, #0 + beq _0221027C + str r8, [sp] + str r7, [sp, #4] + ldr r0, [sb] + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov00_021FF940 + mov r1, r0 + cmp r1, sl + beq _0221027C + mov r0, r6 + mov r2, r8 + bl ov00_0221075C + ldr r0, [sb, #0x10] + cmp r0, #4 + ldrne r0, [sb] + cmpne r0, sl + bne _02210228 +_0221027C: + ldr r0, [sb, #0x10] + cmp r0, #0 + cmpne r0, #2 + bne _022102F4 + bl ov00_021FF368 + ldr r1, [sb, #0x28] + cmp r0, r1 + bls _022102F4 + ldr r1, [sb, #0x20] + ldr r0, [sb, #0x24] + cmp r1, r0 + ble _022102D0 + mov r0, #2 + ldr r3, [sb, #0x3c] + ldr r4, [sb, #0x38] + sub r1, r0, #3 + mov r2, #0 + blx r4 + ldr r0, [sb, #8] + bl ov00_0221019C + b _022102F4 +_022102D0: + add r0, r1, #1 + str r0, [sb, #0x20] + ldr r0, [sb, #0x10] + cmp r0, #0 + mov r0, sb + bne _022102F0 + bl ov00_0220FC7C + b _022102F4 +_022102F0: + bl ov00_0220FEC4 +_022102F4: + ldr r0, [sb, #0x10] + cmp r0, #3 + bne _02210374 + bl ov00_021FF368 + ldr r1, [sb, #0x28] + cmp r0, r1 + bls _02210374 + ldr r1, [sb, #4] + mvn r0, #0 + cmp r1, r0 + bne _0221036C + mov r0, #2 + strb r0, [sp, #9] + ldrh r1, [sb, #0x30] + add r2, sp, #8 + mov r0, #0 + mov r3, r1, asr #8 + mov r1, r1, lsl #8 + and r3, r3, #0xff + and r1, r1, #0xff00 + orr r1, r3, r1 + strh r1, [sp, #0xa] + ldr r1, [sb, #0x2c] + str r1, [sp, #0xc] + ldr r1, [sb] + ldr r3, [sb, #0x3c] + ldr r4, [sb, #0x38] + blx r4 + mvn r0, #0 + str r0, [sb] +_0221036C: + ldr r0, [sb, #8] + bl ov00_0221019C +_02210374: + ldr r0, [sb, #0x10] + cmp r0, #1 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + bl ov00_021FF368 + ldr r1, [sb, #0x28] + cmp r0, r1 + addls sp, sp, #0x1c + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, #1 + ldr r3, [sb, #0x3c] + ldr r4, [sb, #0x38] + sub r1, r0, #2 + mov r2, #0 + blx r4 + ldr r0, [sb, #8] + bl ov00_0221019C + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_022103C0: .word ov00_0221B678 + arm_func_end ov00_022101D4 + + arm_func_start ov00_022103C4 +ov00_022103C4: ; 0x022103C4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _02210404 ; =ov00_0221B664 + ldr r0, [r0, #0x10] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl ArrayLength + subs r5, r0, #1 + ldmmiia sp!, {r3, r4, r5, pc} + ldr r4, _02210404 ; =ov00_0221B664 +_022103E8: + ldr r0, [r4, #0x10] + mov r1, r5 + bl ov00_021FE6EC + bl ov00_022101D4 + subs r5, r5, #1 + bpl _022103E8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02210404: .word ov00_0221B664 + arm_func_end ov00_022103C4 + + arm_func_start ov00_02210408 +ov00_02210408: ; 0x02210408 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x1c + ldr r2, _022104D0 ; =ov00_02219D28 + mov r4, #2 + ldrb r8, [r2] + ldrb r7, [r2, #1] + add r3, sp, #4 + ldrb r6, [r2, #2] + ldrb lr, [r2, #3] + ldrb ip, [r2, #4] + ldrb r5, [r2, #5] + mov r2, #6 + strb r2, [sp, #0xb] + strb r8, [r3] + strb r7, [r3, #1] + strb r6, [r3, #2] + strb lr, [r3, #3] + strb ip, [r3, #4] + strb r5, [r3, #5] + strb r4, [sp, #0xa] + ldr r4, [r0, #0xc] + mov r2, #0x15 + strb r4, [sp, #0x11] + ldr r5, [r0, #8] + mov lr, r5, lsr #0x18 + mov ip, r5, lsr #8 + mov r4, r5, lsl #8 + mov r5, r5, lsl #0x18 + and lr, lr, #0xff + and ip, ip, #0xff00 + and r4, r4, #0xff0000 + orr ip, lr, ip + and r5, r5, #0xff000000 + orr r4, r4, ip + orr r4, r5, r4 + str r4, [sp, #0xc] + ldrh lr, [r1, #2] + str r2, [sp] + mov ip, lr, asr #8 + mov r2, lr, lsl #8 + and ip, ip, #0xff + and r2, r2, #0xff00 + orr r2, ip, r2 + mov r2, r2, lsl #0x10 + ldr r0, [r0] + ldr r1, [r1, #4] + mov r2, r2, lsr #0x10 + bl ov00_0220FB90 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022104D0: .word ov00_02219D28 + arm_func_end ov00_02210408 + + arm_func_start ov00_022104D4 +ov00_022104D4: ; 0x022104D4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldrb r1, [r5, #0x13] + mov r4, r0 + cmp r1, #0 + bne _022104F4 + mov r1, r2 + bl ov00_02210408 +_022104F4: + ldr r0, [r4, #0x10] + cmp r0, #2 + ldmgeia sp!, {r3, r4, r5, pc} + ldrb r1, [r5, #0x13] + cmp r1, #0 + beq _02210544 + mov r0, #3 + cmp r1, #1 + moveq r0, #1 + beq _02210524 + cmp r1, #2 + moveq r0, #2 +_02210524: + ldr r3, [r4, #0x3c] + ldr ip, [r4, #0x38] + mvn r1, #0 + mov r2, #0 + blx ip + ldr r0, [r4, #8] + bl ov00_0221019C + ldmia sp!, {r3, r4, r5, pc} +_02210544: + ldr r1, [r5, #0xc] + mov r0, #2 + str r1, [r4, #0x2c] + ldrh r2, [r5, #0x10] + mov r1, #0 + mov r3, r2, asr #8 + mov r2, r2, lsl #8 + and r3, r3, #0xff + and r2, r2, #0xff00 + orr r2, r3, r2 + strh r2, [r4, #0x30] + str r1, [r4, #0x20] + str r0, [r4, #0x10] + ldr r1, [r4, #0x3c] + ldr r2, [r4, #0x34] + blx r2 + mov r0, r4 + bl ov00_0220FEC4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_022104D4 + + arm_func_start ov00_02210590 +ov00_02210590: ; 0x02210590 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #0x10] + mov r4, r2 + cmp r3, #2 + ldmltia sp!, {r3, r4, r5, pc} + ldr r3, [r4, #4] + mov r2, #1 + str r3, [r5, #0x2c] + ldrh r3, [r4, #2] + mov ip, r3, asr #8 + mov r3, r3, lsl #8 + and ip, ip, #0xff + and r3, r3, #0xff00 + orr r3, ip, r3 + strh r3, [r5, #0x30] + strb r2, [r5, #0x32] + ldrb r2, [r1, #0x12] + cmp r2, #0 + bne _022105E8 + bl ov00_0220FEC4 + ldmia sp!, {r3, r4, r5, pc} +_022105E8: + ldr r2, [r5, #0x10] + cmp r2, #2 + bne _02210644 + ldrb r1, [r5, #0x33] + cmp r1, #0 + bne _02210604 + bl ov00_0220FEC4 +_02210604: + mov r0, #3 + str r0, [r5, #0x10] + bl ov00_021FF368 + add r0, r0, #0x388 + add r0, r0, #0x1000 + str r0, [r5, #0x28] + ldr r1, [r5, #4] + mvn r0, #0 + cmp r1, r0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r5, #0x3c] + ldr r5, [r5, #0x38] + mov r2, r4 + mov r0, #0 + blx r5 + ldmia sp!, {r3, r4, r5, pc} +_02210644: + ldrb r1, [r1, #0x13] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov00_0220FEC4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02210590 + + arm_func_start ov00_02210658 +ov00_02210658: ; 0x02210658 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r3, r1 + ldrb r1, [r3, #7] + mov r4, r0 + cmp r1, #1 + beq _02210684 + cmp r1, #2 + beq _02210718 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02210684: + ldrb r0, [r3, #0xc] + cmp r0, #2 + addhi sp, sp, #4 + ldmhiia sp!, {r3, r4, pc} + add r0, r4, r0, lsl #2 + mov r2, #1 + str r2, [r0, #0x14] + ldr r0, [r4, #0x10] + cmp r0, #0 + addne sp, sp, #4 + ldmneia sp!, {r3, r4, pc} + ldr r0, [r4, #0x18] + cmp r0, #0 + ldrne r0, [r4, #0x1c] + cmpne r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r1, [r4, #4] + sub r0, r2, #2 + cmp r1, r0 + beq _022106E8 + ldr r0, [r4, #0x14] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} +_022106E8: + mov r0, #1 + str r0, [r4, #0x10] + bl ov00_021FF368 + add r0, r0, #0x710 + add r0, r0, #0x2000 + str r0, [r4, #0x28] + ldr r0, [r4, #0x10] + ldr r1, [r4, #0x3c] + ldr r2, [r4, #0x34] + blx r2 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02210718: + mov r0, #3 + strb r0, [r3, #7] + ldrh r0, [r2, #2] + mov ip, #0x15 + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + str ip, [sp] + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + mov ip, r0, lsl #0x10 + ldr r1, [r2, #4] + ldr r0, [r4] + mov r2, ip, lsr #0x10 + bl ov00_0220FB90 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_02210658 + + arm_func_start ov00_0221075C +ov00_0221075C: ; 0x0221075C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + mov r6, r0 + mov r7, r1 + mov r5, r2 + bl ov00_0220FB6C + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldrb r4, [r6, #7] + cmp r4, #5 + cmpne r4, #7 + bne _0221082C + cmp r7, #0x14 + addlt sp, sp, #0x2c + ldmltia sp!, {r4, r5, r6, r7, pc} + add r3, sp, #0x18 + mov r2, #0xa +_022107A4: + ldrb r1, [r6] + ldrb r0, [r6, #1] + add r6, r6, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _022107A4 + ldr r3, [sp, #0x20] + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r3, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + bl ov00_0220F9A8 + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + cmp r4, #5 + add r1, sp, #0x18 + mov r2, r5 + bne _02210820 + bl ov00_022104D4 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} +_02210820: + bl ov00_02210590 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} +_0221082C: + cmp r7, #0x15 + addlt sp, sp, #0x2c + ldmltia sp!, {r4, r5, r6, r7, pc} + add r3, sp, #0 + mov r2, #0xa +_02210840: + ldrb r1, [r6] + ldrb r0, [r6, #1] + add r6, r6, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _02210840 + ldrb r0, [r6] + strb r0, [r3] + ldr r3, [sp, #8] + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r3, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + bl ov00_0220F9A8 + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + add r1, sp, #0 + mov r2, r5 + bl ov00_02210658 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov00_0221075C + + arm_func_start ov00_022108BC +ov00_022108BC: ; 0x022108BC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x40 + movs r5, r0 + mov r8, r1 + mov r4, r2 + mov r7, r3 + ldreq r6, _02210A68 ; =ov00_02219D74 + beq _022108EC + mov r0, #0x110 + bl ov00_021EC3A8 + mov r6, r0 + str r0, [r5] +_022108EC: + bl ov00_021FF368 + bl srand + mov r1, r7 + add r0, r6, #4 + bl strcpy + ldr r1, [sp, #0x58] + add r0, r6, #0x44 + bl strcpy + str r4, [r6, #0xc0] + mov r5, #0 + str r5, [r6, #0xac] + str r5, [r6, #0xb0] + str r8, [r6] + mov r1, #1 + str r1, [r6, #0xb8] + ldr r0, [sp, #0x7c] + ldr r1, [sp, #0x64] + str r0, [r6, #0x10c] + str r1, [r6, #0x88] + ldr r0, [sp, #0x68] + ldr r1, [sp, #0x6c] + str r0, [r6, #0x8c] + str r1, [r6, #0x90] + ldr r0, [sp, #0x70] + ldr r1, [sp, #0x74] + str r0, [r6, #0x94] + ldr r0, [sp, #0x78] + str r1, [r6, #0x98] + str r0, [r6, #0x9c] + str r5, [r6, #0xa0] + str r5, [r6, #0xa4] + ldr r0, [sp, #0x5c] + str r5, [r6, #0xd4] + str r0, [r6, #0xbc] + ldr r0, [sp, #0x60] + str r5, [r6, #0xc4] + str r0, [r6, #0xc8] + str r5, [r6, #0x104] + add r0, r6, #0x100 + strh r5, [r0, #8] + str r5, [r6, #0xa8] + ldr r4, _02210A6C ; =0x80808081 + str r5, [r6, #0xb4] + mov r8, #0xff +_0221099C: + bl rand + smull r1, r2, r4, r0 + add r3, r6, r5 + add r5, r5, #1 + add r2, r0, r2 + mov r1, r0, lsr #0x1f + add r2, r1, r2, asr #7 + smull r1, r2, r8, r2 + sub r2, r0, r1 + strb r2, [r3, #0x84] + cmp r5, #4 + blt _0221099C + mov r2, #0 + mvn r1, #0 +_022109D4: + add r0, r6, r2, lsl #2 + add r2, r2, #1 + str r1, [r0, #0xd8] + cmp r2, #0xa + blt _022109D4 + mov r1, #0 + ldr r0, _02210A70 ; =ov00_0221B878 + str r1, [r6, #0x100] + ldr r0, [r0] + cmp r0, #0 + bne _02210A04 + bl ov00_02210E58 +_02210A04: + ldr r0, [sp, #0x5c] + cmp r0, #0 + beq _02210A50 + ldr r0, _02210A74 ; =ov00_0221B890 + ldrsb r4, [r0] + cmp r4, #0 + bne _02210A30 + ldr r1, _02210A78 ; =ov00_02219E84 + add r0, sp, #0 + mov r2, r7 + bl sprintf +_02210A30: + cmp r4, #0 + ldrne r0, _02210A74 ; =ov00_0221B890 + ldr r1, _02210A7C ; =0x00006CFC + addeq r0, sp, #0 + add r2, r6, #0xcc + mov r3, #0 + bl ov00_02210ECC + b _02210A54 +_02210A50: + mov r0, #1 +_02210A54: + cmp r0, #0 + moveq r0, #3 + movne r0, #0 + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02210A68: .word ov00_02219D74 +_02210A6C: .word 0x80808081 +_02210A70: .word ov00_0221B878 +_02210A74: .word ov00_0221B890 +_02210A78: .word ov00_02219E84 +_02210A7C: .word 0x00006CFC + arm_func_end ov00_022108BC + + arm_func_start ov00_02210A80 +ov00_02210A80: ; 0x02210A80 + cmp r0, #0 + ldreq r0, _02210A94 ; =ov00_02219D70 + ldreq r0, [r0] + str r1, [r0, #0xa0] + bx lr + .balign 4, 0 +_02210A94: .word ov00_02219D70 + arm_func_end ov00_02210A80 + + arm_func_start ov00_02210A98 +ov00_02210A98: ; 0x02210A98 + cmp r0, #0 + ldreq r0, _02210AAC ; =ov00_02219D70 + ldreq r0, [r0] + str r1, [r0, #0xa4] + bx lr + .balign 4, 0 +_02210AAC: .word ov00_02219D70 + arm_func_end ov00_02210A98 + + arm_func_start ov00_02210AB0 +ov00_02210AB0: ; 0x02210AB0 + cmp r0, #0 + ldreq r0, _02210AC4 ; =ov00_02219D70 + ldreq r0, [r0] + str r1, [r0, #0xa8] + bx lr + .balign 4, 0 +_02210AC4: .word ov00_02219D70 + arm_func_end ov00_02210AB0 + + arm_func_start ov00_02210AC8 +ov00_02210AC8: ; 0x02210AC8 + stmdb sp!, {r4, lr} + movs r4, r0 + ldreq r0, _02210AF8 ; =ov00_02219D70 + ldreq r4, [r0] + ldr r0, [r4, #0xbc] + cmp r0, #0 + beq _02210AEC + mov r0, r4 + bl ov00_02210BA8 +_02210AEC: + mov r0, r4 + bl ov00_02210AFC + ldmia sp!, {r4, pc} + .balign 4, 0 +_02210AF8: .word ov00_02219D70 + arm_func_end ov00_02210AC8 + + arm_func_start ov00_02210AFC +ov00_02210AFC: ; 0x02210AFC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov r1, #8 + mov sl, r0 + str r1, [sp, #8] + ldr r0, [sl, #0xc4] + cmp r0, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl] + bl ov00_021FF694 + cmp r0, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r5, #0 + ldr r7, _02210BA4 ; =ov00_0221B8D0 + add sb, sp, #0xc + add r8, sp, #8 + mov r6, #0xff + mov fp, r5 + mvn r4, #0 +_02210B50: + str sb, [sp] + str r8, [sp, #4] + ldr r0, [sl] + mov r1, r7 + mov r2, r6 + mov r3, fp + bl ov00_021FF940 + mov r2, r0 + cmp r2, r4 + beq _02210B8C + mov r0, sl + mov r1, r7 + mov r3, sb + strb r5, [r7, r2] + bl ov00_02211A88 +_02210B8C: + ldr r0, [sl] + bl ov00_021FF694 + cmp r0, #0 + bne _02210B50 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02210BA4: .word ov00_0221B8D0 + arm_func_end ov00_02210AFC + + arm_func_start ov00_02210BA8 +ov00_02210BA8: ; 0x02210BA8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov00_021FF368 + ldr r2, [r5] + mvn r1, #0 + mov r4, r0 + cmp r2, r1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r5, #0xb8] + cmp r2, #0 + ble _02210C2C + ldr r1, [r5, #0xac] + ldr r0, _02210CAC ; =0x00002710 + sub r1, r4, r1 + cmp r1, r0 + bls _02210C2C + cmp r2, #4 + blt _02210C10 + mov r0, #0 + str r0, [r5, #0xb8] + ldr r2, [r5, #0x10c] + ldr r3, [r5, #0x9c] + ldr r1, _02210CB0 ; =ov00_02219EA4 + mov r0, #5 + blx r3 + ldmia sp!, {r3, r4, r5, pc} +_02210C10: + mov r0, r5 + mov r1, #3 + bl ov00_02211DFC + ldr r0, [r5, #0xb8] + add r0, r0, #1 + str r0, [r5, #0xb8] + b _02210C8C +_02210C2C: + ldr r0, [r5, #0xb4] + cmp r0, #0 + beq _02210C5C + ldr r1, [r5, #0xac] + ldr r0, _02210CAC ; =0x00002710 + sub r1, r4, r1 + cmp r1, r0 + bls _02210C5C + mov r0, r5 + mov r1, #1 + bl ov00_02211DFC + b _02210C8C +_02210C5C: + ldr r2, [r5, #0xac] + ldr r0, _02210CB4 ; =0x0000EA60 + sub r1, r4, r2 + cmp r1, r0 + bhi _02210C80 + cmp r2, #0 + beq _02210C80 + cmp r4, r2 + bhs _02210C8C +_02210C80: + mov r0, r5 + mov r1, #0 + bl ov00_02211DFC +_02210C8C: + ldr r1, [r5, #0xb0] + ldr r0, _02210CB8 ; =0x00004E20 + sub r1, r4, r1 + cmp r1, r0 + ldmlsia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl ov00_02211D9C + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02210CAC: .word 0x00002710 +_02210CB0: .word ov00_02219EA4 +_02210CB4: .word 0x0000EA60 +_02210CB8: .word 0x00004E20 + arm_func_end ov00_02210BA8 + + arm_func_start ov00_02210CBC +ov00_02210CBC: ; 0x02210CBC + stmdb sp!, {r4, lr} + movs r4, r0 + ldreq r0, _02210D10 ; =ov00_02219D70 + ldreq r4, [r0] + ldr r0, [r4, #0xbc] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021FF368 + ldr r2, [r4, #0xac] + ldr r1, _02210D14 ; =0x00002710 + sub r0, r0, r2 + cmp r0, r1 + movlo r0, #1 + strlo r0, [r4, #0xb4] + ldmloia sp!, {r4, pc} + mov r0, r4 + mov r1, #1 + bl ov00_02211DFC + mov r0, #0 + str r0, [r4, #0xb4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02210D10: .word ov00_02219D70 +_02210D14: .word 0x00002710 + arm_func_end ov00_02210CBC + + arm_func_start ov00_02210D18 +ov00_02210D18: ; 0x02210D18 + stmdb sp!, {r4, lr} + movs r4, r0 + ldreq r0, _02210D94 ; =ov00_02219D70 + ldreq r4, [r0] + ldr r0, [r4, #0xbc] + cmp r0, #0 + beq _02210D40 + mov r0, r4 + mov r1, #2 + bl ov00_02211DFC +_02210D40: + ldr r0, [r4] + mvn r1, #0 + cmp r0, r1 + ldrne r1, [r4, #0xc4] + cmpne r1, #0 + beq _02210D5C + bl ov00_021FF818 +_02210D5C: + mvn r0, #0 + str r0, [r4] + mov r0, #0 + str r0, [r4, #0xac] + ldr r0, [r4, #0xc4] + cmp r0, #0 + beq _02210D7C + bl ov00_021FF3D0 +_02210D7C: + ldr r0, _02210D98 ; =ov00_02219D74 + cmp r4, r0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02210D94: .word ov00_02219D70 +_02210D98: .word ov00_02219D74 + arm_func_end ov00_02210D18 + + arm_func_start ov00_02210D9C +ov00_02210D9C: ; 0x02210D9C + ldr r3, [r0, #0x100] + cmp r3, #0xfe + bxge lr + cmp r1, #1 + bxlt lr + cmp r1, #0xfe + bxgt lr + add r2, r3, #1 + str r2, [r0, #0x100] + strb r1, [r0, r3] + bx lr + arm_func_end ov00_02210D9C + + arm_func_start ov00_02210DC8 +ov00_02210DC8: ; 0x02210DC8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + mov r2, r1 + mov r4, r0 + ldr r1, _02210DF8 ; =ov00_02219EDC + add r0, sp, #0 + bl sprintf + add r1, sp, #0 + mov r0, r4 + bl ov00_02210DFC + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02210DF8: .word ov00_02219EDC + arm_func_end ov00_02210DC8 + + arm_func_start ov00_02210DFC +ov00_02210DFC: ; 0x02210DFC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r4, r0 + mov r0, r6 + bl strlen + ldr r3, [r4, #0x800] + add r5, r0, #1 + rsb r0, r3, #0x800 + cmp r5, r0 + movgt r5, r0 + cmp r5, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r6 + mov r2, r5 + add r0, r4, r3 + bl memcpy + ldr r0, [r4, #0x800] + mov r1, #0 + add r0, r0, r5 + str r0, [r4, #0x800] + sub r0, r0, #1 + strb r1, [r4, r0] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02210DFC + + arm_func_start ov00_02210E58 +ov00_02210E58: ; 0x02210E58 + stmdb sp!, {r4, r5, r6, lr} + bl ov00_021FF6E4 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, _02210EC4 ; =ov00_0221B878 + mov r6, #0 + ldr ip, _02210EC8 ; =ov00_0221B87C + str r6, [r1] +_02210E78: + ldr r2, [r0, #0xc] + mov r5, r6, lsl #2 + ldr r4, [r2, r6, lsl #2] + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldrb r3, [r4] + ldrb r2, [r4, #1] + add r6, r6, #1 + add lr, ip, r5 + strb r3, [ip, r5] + strb r2, [lr, #1] + ldrb r3, [r4, #2] + ldrb r2, [r4, #3] + cmp r6, #5 + strb r3, [lr, #2] + strb r2, [lr, #3] + str r6, [r1] + blt _02210E78 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02210EC4: .word ov00_0221B878 +_02210EC8: .word ov00_0221B87C + arm_func_end ov00_02210E58 + + arm_func_start ov00_02210ECC +ov00_02210ECC: ; 0x02210ECC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r4, r1, asr #8 + mov r1, r1, lsl #8 + mov r6, r2 + mov r5, #2 + and r2, r4, #0xff + and r1, r1, #0xff00 + strb r5, [r6, #1] + orr r1, r2, r1 + strh r1, [r6, #2] + mov r4, #0 + movs r7, r0 + mov r5, r3 + streq r4, [r6, #4] + beq _02210F18 + bl ov00_021FFA44 + str r0, [r6, #4] +_02210F18: + ldr r1, [r6, #4] + mvn r0, #0 + cmp r1, r0 + bne _02210F60 + ldr r1, _02210F70 ; =ov00_02219EE0 + mov r0, r7 + bl strcmp + cmp r0, #0 + beq _02210F60 + mov r0, r7 + bl SOC_GetHostByName + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [r6, #4] +_02210F60: + cmp r5, #0 + strne r4, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02210F70: .word ov00_02219EE0 + arm_func_end ov00_02210ECC + + arm_func_start ov00_02210F74 +ov00_02210F74: ; 0x02210F74 + ldrb r3, [r0] + ldrb r2, [r1] + strb r2, [r0] + strb r3, [r1] + bx lr + arm_func_end ov00_02210F74 + + arm_func_start ov00_02210F88 +ov00_02210F88: ; 0x02210F88 + cmp r0, #0x1a + addlo r0, r0, #0x41 + andlo r0, r0, #0xff + bxlo lr + cmp r0, #0x34 + addlo r0, r0, #0x47 + andlo r0, r0, #0xff + bxlo lr + cmp r0, #0x3e + sublo r0, r0, #4 + andlo r0, r0, #0xff + bxlo lr + moveq r0, #0x2b + bxeq lr + cmp r0, #0x3f + moveq r0, #0x2f + movne r0, #0 + bx lr + arm_func_end ov00_02210F88 + + arm_func_start ov00_02210FD0 +ov00_02210FD0: ; 0x02210FD0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r7, r1 + mov r8, r0 + mov r6, r2 + cmp r7, #0 + mov r4, #0 + ble _02211084 +_02210FF0: + mov r2, #0 + add r3, sp, #4 + mov r0, r2 +_02210FFC: + cmp r4, r7 + ldrltb r1, [r8], #1 + add r2, r2, #1 + add r4, r4, #1 + strltb r1, [r3] + strgeb r0, [r3] + cmp r2, #2 + add r3, r3, #1 + ble _02210FFC + ldrb r0, [sp, #4] + ldrb r5, [sp, #5] + ldrb r2, [sp, #6] + mov r3, r0, lsl #0x1e + mov r1, r5, asr #4 + add ip, r1, r3, lsr #26 + and r1, r2, #0x3f + mov r3, r5, lsl #0x1c + mov r2, r2, asr #6 + mov r0, r0, asr #2 + add r2, r2, r3, lsr #26 + add r5, sp, #0 + strb r0, [sp] + strb ip, [sp, #1] + strb r2, [sp, #2] + strb r1, [sp, #3] + mov sb, #0 +_02211064: + ldrb r0, [r5], #1 + bl ov00_02210F88 + add sb, sb, #1 + cmp sb, #3 + strb r0, [r6], #1 + ble _02211064 + cmp r4, r7 + blt _02210FF0 +_02211084: + mov r0, #0 + strb r0, [r6] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_02210FD0 + + arm_func_start ov00_02211094 +ov00_02211094: ; 0x02211094 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x104 + str r1, [sp] + add r4, sp, #4 + mov sl, r0 + mov sb, r2 + mov r8, r3 + mov r1, #0 +_022110B4: + add r0, r1, #1 + mov r0, r0, lsl #0x10 + strb r1, [r4], #1 + mov r1, r0, asr #0x10 + cmp r1, #0x100 + blt _022110B4 + mov r4, #0 + add r6, sp, #4 + mov r5, r4 + mov r7, r4 + mov fp, r6 +_022110E0: + ldrb r3, [r6] + ldrb r2, [sl, r4] + ldr r1, [sp] + add r0, r4, #1 + add r2, r3, r2 + add r2, r5, r2 + mov r3, r2, lsr #0x1f + rsb r2, r3, r2, lsl #24 + add r2, r3, r2, ror #24 + and r5, r2, #0xff + bl _s32_div_f + and r4, r1, #0xff + mov r0, r6 + add r1, fp, r5 + bl ov00_02210F74 + add r0, r7, #1 + mov r0, r0, lsl #0x10 + mov r7, r0, asr #0x10 + cmp r7, #0x100 + add r6, r6, #1 + blt _022110E0 + mov r6, #0 + cmp r8, #0 + mov r7, r6 + mov r5, r6 + addle sp, sp, #0x104 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r4, sp, #4 +_02211150: + ldrb r0, [sb, r5] + add r0, r6, r0 + add r0, r0, #1 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #24 + add r0, r1, r0, ror #24 + and r6, r0, #0xff + ldrb r1, [r4, r6] + add r0, r4, r6 + add r1, r1, r7 + mov r2, r1, lsr #0x1f + rsb r1, r2, r1, lsl #24 + add r1, r2, r1, ror #24 + and r7, r1, #0xff + add r1, r4, r7 + bl ov00_02210F74 + ldrb r3, [r4, r6] + ldrb r1, [r4, r7] + add r0, r5, #1 + mov r2, r0, lsl #0x10 + add r0, r3, r1 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #24 + add r0, r1, r0, ror #24 + and r0, r0, #0xff + ldrb r1, [sb, r5] + ldrb r0, [r4, r0] + cmp r8, r2, asr #16 + eor r0, r1, r0 + strb r0, [sb, r5] + mov r5, r2, asr #0x10 + bgt _02211150 + add sp, sp, #0x104 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02211094 + + arm_func_start ov00_022111D8 +ov00_022111D8: ; 0x022111D8 + strb r1, [r0] + ldrb ip, [r2] + ldrb r3, [r2, #1] + mov r1, #5 + strb ip, [r0, #1] + strb r3, [r0, #2] + ldrb r3, [r2, #2] + ldrb r2, [r2, #3] + strb r3, [r0, #3] + strb r2, [r0, #4] + str r1, [r0, #0x800] + bx lr + arm_func_end ov00_022111D8 + + arm_func_start ov00_02211208 +ov00_02211208: ; 0x02211208 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x44 + mov r5, r3 + cmp r5, #1 + mov r6, r0 + mov r4, r1 + addlt sp, sp, #0x44 + ldmltia sp!, {r3, r4, r5, r6, pc} + cmp r5, #0x41 + addgt sp, sp, #0x44 + ldmgtia sp!, {r3, r4, r5, r6, pc} + sub r0, r5, #1 + ldrsb r0, [r2, r0] + cmp r0, #0 + addne sp, sp, #0x44 + ldmneia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #0 + mov r1, r2 + bl strcpy + add r0, r6, #0x44 + bl strlen + mov r1, r0 + add r2, sp, #0 + add r0, r6, #0x44 + sub r3, r5, #1 + bl ov00_02211094 + ldr r2, [r4, #0x800] + sub r1, r5, #1 + add r0, sp, #0 + add r2, r4, r2 + bl ov00_02210FD0 + ldr r0, [r4, #0x800] + add r0, r4, r0 + bl strlen + ldr r1, [r4, #0x800] + add r0, r0, #1 + add r0, r1, r0 + str r0, [r4, #0x800] + add sp, sp, #0x44 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_02211208 + + arm_func_start ov00_022112A8 +ov00_022112A8: ; 0x022112A8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + mov r0, r1 + ldr r1, _02211354 ; =ov00_02219EF0 + add r2, sp, #4 + add r3, sp, #0 + bl sscanf + ldr r0, [sp, #4] + ldr lr, [sp] + mov r2, r0, lsr #0x18 + mov r1, r0, lsr #8 + mov r3, r0, lsl #8 + mov ip, r0, lsl #0x18 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + and r3, r3, #0xff0000 + mov r0, lr, lsl #0x10 + and r2, ip, #0xff000000 + orr r1, r3, r1 + orrs r2, r2, r1 + mov r1, r0, lsr #0x10 + str r2, [sp, #4] + cmpne r1, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0x104] + cmp r0, r2 + addeq r0, r4, #0x100 + ldreqh r0, [r0, #8] + cmpeq r0, r1 + addeq sp, sp, #8 + ldmeqia sp!, {r4, pc} + str r2, [r4, #0x104] + add r0, r4, #0x100 + strh r1, [r0, #8] + ldr r0, [sp, #4] + ldr r2, [r4, #0x10c] + ldr r3, [r4, #0xa8] + blx r3 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02211354: .word ov00_02219EF0 + arm_func_end ov00_022112A8 + + arm_func_start ov00_02211358 +ov00_02211358: ; 0x02211358 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10c + movs fp, r3 + mov r3, #0 + ldr r7, [sp, #0x130] + str r3, [sp, #0x108] + mov sl, r0 + mov sb, r1 + mov r8, r2 + addeq sp, sp, #0x10c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + sub r0, r8, #1 + cmp r0, #1 + bhi _02211404 + ldr r0, [sb, #0x800] + rsb r0, r0, #0x800 + cmp r0, #2 + addlo sp, sp, #0x10c + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sl, #0x10c] + ldr r2, [sl, #0x98] + mov r0, r8 + blx r2 + str r0, [sp] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #4] + add r0, sp, #4 + ldrb r1, [r0] + ldr r2, [sb, #0x800] + ldrb r0, [r0, #1] + add r3, sb, r2 + strb r1, [sb, r2] + strb r0, [r3, #1] + ldr r0, [sb, #0x800] + add r0, r0, #2 + str r0, [sb, #0x800] + b _0221140C +_02211404: + mov r0, #1 + str r0, [sp] +_0221140C: + cmp fp, #0xff + bne _022114E0 + ldr r2, [sl, #0x10c] + ldr r3, [sl, #0x94] + add r1, sp, #8 + mov r0, r8 + blx r3 + ldr r0, [sp, #0x108] + mov r5, #0 + cmp r0, #0 + ble _022114A8 + ldr fp, _022115A4 ; =ov00_02219EFC + ldr r4, _022115A8 ; =ov00_0221A0B8 + add r7, sp, #8 +_02211444: + ldrb r0, [r7] + ldr r1, [r4, r0, lsl #2] + mov r0, sb + cmp r1, #0 + moveq r1, fp + bl ov00_02210DFC + cmp r8, #0 + bne _02211494 + ldrb r0, [r7] + ldr r2, [sl, #0x10c] + ldr r3, [sl, #0x88] + mov r1, sb + ldr r6, [sb, #0x800] + blx r3 + ldr r0, [sb, #0x800] + cmp r6, r0 + bne _02211494 + ldr r1, _022115AC ; =ov00_02219F04 + mov r0, sb + bl ov00_02210DFC +_02211494: + ldr r0, [sp, #0x108] + add r5, r5, #1 + cmp r5, r0 + add r7, r7, #1 + blt _02211444 +_022114A8: + ldr r1, [sb, #0x800] + rsb r0, r1, #0x800 + cmp r0, #1 + addlt sp, sp, #0x10c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, r1, #1 + str r0, [sb, #0x800] + mov r0, #0 + strb r0, [sb, r1] + ldr fp, [sp, #0x108] + cmp r8, #0 + add r7, sp, #8 + addeq sp, sp, #0x10c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022114E0: + ldr r0, [sp] + mov r4, #0 + cmp r0, #0 + addle sp, sp, #0x10c + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022114F4: + mov r5, #0 + cmp fp, #0 + ble _0221158C +_02211500: + cmp r8, #0 + ldr r6, [sb, #0x800] + bne _02211524 + ldrb r0, [r7, r5] + ldr r2, [sl, #0x10c] + ldr r3, [sl, #0x88] + mov r1, sb + blx r3 + b _02211568 +_02211524: + cmp r8, #1 + bne _02211548 + ldrb r0, [r7, r5] + ldr r3, [sl, #0x10c] + ldr ip, [sl, #0x8c] + mov r1, r4 + mov r2, sb + blx ip + b _02211568 +_02211548: + cmp r8, #2 + bne _02211568 + ldrb r0, [r7, r5] + ldr r3, [sl, #0x10c] + ldr ip, [sl, #0x90] + mov r1, r4 + mov r2, sb + blx ip +_02211568: + ldr r0, [sb, #0x800] + cmp r6, r0 + bne _02211580 + ldr r1, _022115AC ; =ov00_02219F04 + mov r0, sb + bl ov00_02210DFC +_02211580: + add r5, r5, #1 + cmp r5, fp + blt _02211500 +_0221158C: + ldr r0, [sp] + add r4, r4, #1 + cmp r4, r0 + blt _022114F4 + add sp, sp, #0x10c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022115A4: .word ov00_02219EFC +_022115A8: .word ov00_0221A0B8 +_022115AC: .word ov00_02219F04 + arm_func_end ov00_02211358 + + arm_func_start ov00_022115B0 +ov00_022115B0: ; 0x022115B0 + stmdb sp!, {r3, r4, r5, lr} + str r3, [sp] + mov r3, r2 + mov r2, #0 + mov r5, r0 + mov r4, r1 + bl ov00_02211358 + ldr ip, [sp, #0x14] + ldr r3, [sp, #0x10] + mov r0, r5 + mov r1, r4 + mov r2, #1 + str ip, [sp] + bl ov00_02211358 + ldr r0, [sp, #0x1c] + ldr r3, [sp, #0x18] + str r0, [sp] + mov r0, r5 + mov r1, r4 + mov r2, #2 + bl ov00_02211358 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_022115B0 + + arm_func_start ov00_02211608 +ov00_02211608: ; 0x02211608 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r5, #0 + cmp r3, #3 + mov r6, r5 + mov r7, r5 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrb ip, [r2], #1 + sub r3, r3, #1 + cmp ip, #0 + cmpne ip, #0xff + movne r5, r2 + subne r3, r3, ip + addne r2, r2, ip + cmp r3, #2 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrb lr, [r2], #1 + sub r3, r3, #1 + cmp lr, #0 + cmpne lr, #0xff + movne r6, r2 + subne r3, r3, lr + addne r2, r2, lr + cmp r3, #1 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r4, [r2] + sub r3, r3, #1 + cmp r4, #0 + cmpne r4, #0xff + subne r3, r3, r4 + addne r7, r2, #1 + cmp r3, #0 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + str lr, [sp] + str r6, [sp, #4] + str r4, [sp, #8] + mov r2, ip + mov r3, r5 + str r7, [sp, #0xc] + bl ov00_022115B0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_02211608 + + arm_func_start ov00_022116C0 +ov00_022116C0: ; 0x022116C0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x188 + mov r8, r2 + sub r2, r8, #1 + mov r3, #0 + cmp r2, #1 + mov sl, r0 + mov sb, r1 + str r3, [sp, #0x104] + movhi fp, #1 + bhi _02211700 + ldr r1, [sl, #0x10c] + ldr r2, [sl, #0x98] + mov r0, r8 + blx r2 + mov fp, r0 +_02211700: + ldr r2, [sl, #0x10c] + ldr r3, [sl, #0x94] + add r1, sp, #4 + mov r0, r8 + blx r3 + ldr r1, [sp, #0x104] + mov r0, #0 + str r0, [sp] + cmp r1, #0 + addle sp, sp, #0x188 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r6, sp, #4 +_02211730: + ldrb r1, [r6] + ldr r0, _02211888 ; =ov00_0221A0B8 + ldr r5, [r0, r1, lsl #2] + cmp r5, #0 + ldreq r5, _0221188C ; =ov00_02219EFC + cmp r8, #0 + bne _022117AC + mov r0, sb + mov r1, r5 + bl ov00_02210DFC + ldr r0, [sb, #0x800] + mov r1, #0x5c + add r0, sb, r0 + strb r1, [r0, #-1] + ldrb r0, [r6] + ldr r2, [sl, #0x10c] + ldr r3, [sl, #0x88] + mov r1, sb + ldr r4, [sb, #0x800] + blx r3 + ldr r0, [sb, #0x800] + cmp r4, r0 + bne _02211798 + ldr r1, _02211890 ; =ov00_02219F04 + mov r0, sb + bl ov00_02210DFC +_02211798: + ldr r0, [sb, #0x800] + mov r1, #0x5c + add r0, sb, r0 + strb r1, [r0, #-1] + b _02211864 +_022117AC: + cmp fp, #0 + mov r4, #0 + ble _02211864 +_022117B8: + ldr r1, _02211894 ; =ov00_02219F08 + add r0, sp, #0x108 + mov r2, r5 + mov r3, r4 + bl sprintf + mov r0, sb + add r1, sp, #0x108 + bl ov00_02210DFC + ldr r0, [sb, #0x800] + cmp r8, #1 + add r1, sb, r0 + mov r0, #0x5c + strb r0, [r1, #-1] + ldr r7, [sb, #0x800] + bne _02211810 + ldrb r0, [r6] + mov r1, r4 + mov r2, sb + ldr r3, [sl, #0x10c] + ldr ip, [sl, #0x8c] + blx ip + b _02211830 +_02211810: + cmp r8, #2 + bne _02211830 + ldrb r0, [r6] + mov r1, r4 + mov r2, sb + ldr r3, [sl, #0x10c] + ldr ip, [sl, #0x90] + blx ip +_02211830: + ldr r0, [sb, #0x800] + cmp r7, r0 + bne _02211848 + ldr r1, _02211890 ; =ov00_02219F04 + mov r0, sb + bl ov00_02210DFC +_02211848: + ldr r0, [sb, #0x800] + add r4, r4, #1 + add r1, sb, r0 + mov r0, #0x5c + strb r0, [r1, #-1] + cmp r4, fp + blt _022117B8 +_02211864: + ldr r0, [sp] + ldr r1, [sp, #0x104] + add r0, r0, #1 + str r0, [sp] + cmp r0, r1 + add r6, r6, #1 + blt _02211730 + add sp, sp, #0x188 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02211888: .word ov00_0221A0B8 +_0221188C: .word ov00_02219EFC +_02211890: .word ov00_02219F04 +_02211894: .word ov00_02219F08 + arm_func_end ov00_022116C0 + + arm_func_start ov00_02211898 +ov00_02211898: ; 0x02211898 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r2, #1 + mov r5, r0 + str r2, [r4, #0x800] + mov r3, #0x5c + mov r2, #0 + strb r3, [r4] + bl ov00_022116C0 + mov r0, r5 + mov r1, r4 + mov r2, #1 + bl ov00_022116C0 + mov r0, r5 + mov r1, r4 + mov r2, #2 + bl ov00_022116C0 + ldr r1, _022118F8 ; =ov00_02219F10 + mov r0, r4 + bl ov00_02210DFC + ldr r0, [r4, #0x800] + sub r0, r0, #1 + str r0, [r4, #0x800] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022118F8: .word ov00_02219F10 + arm_func_end ov00_02211898 + + arm_func_start ov00_022118FC +ov00_022118FC: ; 0x022118FC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr ip, _02211A20 ; =ov00_022163E8 + mov r3, r0 + ldrb r4, [ip] + ldrb r0, [ip, #1] + ldrb lr, [ip, #2] + strb r4, [sp, #4] + strb r0, [sp, #5] + ldrb r0, [ip, #3] + cmp r2, #0xa + add r6, sp, #4 + strb lr, [sp, #6] + strb r0, [sp, #7] + ldrb lr, [ip, #4] + ldrb r0, [ip, #5] + mov r5, #1 + strb lr, [sp, #8] + strb r0, [sp, #9] + blt _02211978 + mov r4, #0 +_02211950: + ldrb ip, [r6] + ldrb r0, [r1, r4] + cmp ip, r0 + movne r5, #0 + bne _0221197C + add r4, r4, #1 + cmp r4, #6 + add r6, r6, #1 + blt _02211950 + b _0221197C +_02211978: + mov r5, #0 +_0221197C: + cmp r5, #0 + beq _022119F8 + ldrb r2, [r1, #6] + ldrb r0, [r1, #7] + add ip, sp, #0 + strb r2, [ip] + strb r0, [ip, #1] + ldrb r2, [r1, #8] + ldrb r0, [r1, #9] + strb r0, [ip, #3] + strb r2, [ip, #2] + ldr r2, [r3, #0xa0] + cmp r2, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr lr, [sp] + ldr r1, [r3, #0x10c] + mov r3, lr, lsr #0x18 + mov r0, lr, lsr #8 + mov ip, lr, lsl #8 + and r3, r3, #0xff + and r0, r0, #0xff00 + mov lr, lr, lsl #0x18 + orr r0, r3, r0 + and ip, ip, #0xff0000 + and r3, lr, #0xff000000 + orr r0, ip, r0 + orr r0, r3, r0 + blx r2 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} +_022119F8: + ldr ip, [r3, #0xa4] + cmp ip, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r0, r1 + mov r1, r2 + ldr r2, [r3, #0x10c] + blx ip + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02211A20: .word ov00_022163E8 + arm_func_end ov00_022118FC + + arm_func_start ov00_02211A24 +ov00_02211A24: ; 0x02211A24 + stmdb sp!, {r4, lr} + mov r3, #0 +_02211A2C: + add r2, r0, r3, lsl #2 + ldr r2, [r2, #0xd8] + cmp r1, r2 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + add r3, r3, #1 + cmp r3, #0xa + blt _02211A2C + ldr r2, [r0, #0x100] + ldr ip, _02211A84 ; =0x66666667 + add lr, r2, #1 + smull r3, r4, ip, lr + mov r2, lr, lsr #0x1f + add r4, r2, r4, asr #2 + mov ip, #0xa + smull r2, r3, ip, r4 + sub r4, lr, r2 + str r4, [r0, #0x100] + add r0, r0, r4, lsl #2 + str r1, [r0, #0xd8] + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02211A84: .word 0x66666667 + arm_func_end ov00_02211A24 + + arm_func_start ov00_02211A88 +ov00_02211A88: ; 0x02211A88 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x810 + movs r8, r0 + mov r0, #0 + str r0, [sp, #0x80c] + ldreq r0, _02211D98 ; =ov00_02219D70 + mov r7, r2 + ldreq r8, [r0] + ldrsb r0, [r1] + mov r6, r3 + cmp r0, #0x3b + bne _02211AE0 + ldr r3, [r8, #0xd4] + cmp r3, #0 + addeq sp, sp, #0x810 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r1 + mov r1, r7 + mov r2, r6 + blx r3 + add sp, sp, #0x810 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02211AE0: + cmp r0, #0x5c + bne _02211B1C + add r1, sp, #0xc + mov r0, r8 + bl ov00_02211898 + str r6, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [r8] + ldr r2, [sp, #0x80c] + add r1, sp, #0xc + mov r3, #0 + bl ov00_021FF984 + add sp, sp, #0x810 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02211B1C: + cmp r7, #7 + addlt sp, sp, #0x810 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + and r0, r0, #0xff + cmp r0, #0xfe + ldreqb r0, [r1, #1] + cmpeq r0, #0xfd + addne sp, sp, #0x810 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r8, #0xb8] + add r4, r1, #3 + cmp r0, #0 + movgt r0, #0 + strgt r0, [r8, #0xb8] + ldrsb sb, [r1, #2] + add r5, r1, #7 + add r0, sp, #0xc + mov r1, sb + mov r2, r4 + sub r7, r7, #7 + bl ov00_022111D8 + cmp sb, #8 + addls pc, pc, sb, lsl #2 + b _02211D68 +_02211B7C: ; jump table + b _02211BA0 ; case 0 + b _02211BB8 ; case 1 + b _02211BF4 ; case 2 + b _02211D68 ; case 3 + b _02211C2C ; case 4 + b _02211D68 ; case 5 + b _02211CA0 ; case 6 + b _02211D68 ; case 7 + b _02211D68 ; case 8 +_02211BA0: + add r1, sp, #0xc + mov r0, r8 + mov r2, r5 + mov r3, r7 + bl ov00_02211608 + b _02211D70 +_02211BB8: + cmp r7, #0xd + blt _02211BDC + ldr r0, [r8, #0xa8] + cmp r0, #0 + beq _02211BDC + add r1, r5, r7 + mov r0, r8 + sub r1, r1, #0xd + bl ov00_022112A8 +_02211BDC: + add r1, sp, #0xc + mov r0, r8 + mov r2, r5 + mov r3, r7 + bl ov00_02211208 + b _02211D70 +_02211BF4: + ldr r0, [sp, #0x80c] + cmp r7, #0x20 + movgt r7, #0x20 + add r3, sp, #0xc + mov r4, #5 + mov r1, r5 + mov r2, r7 + add r0, r3, r0 + strb r4, [sp, #0xc] + bl memcpy + ldr r0, [sp, #0x80c] + add r0, r0, r7 + str r0, [sp, #0x80c] + b _02211D70 +_02211C2C: + ldr r1, [r8, #0xb8] + mvn r0, #0 + cmp r1, r0 + addeq sp, sp, #0x810 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r2, #0 + str r2, [sp, #8] +_02211C48: + add r0, r8, r2 + ldrsb r1, [r4, r2] + ldrsb r0, [r0, #0x84] + cmp r1, r0 + addne sp, sp, #0x810 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r2, r2, #1 + str r2, [sp, #8] + cmp r2, #4 + blt _02211C48 + cmp r7, #2 + addlt sp, sp, #0x810 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mvn r0, #0 + str r0, [r8, #0xb8] + ldrsb r0, [r5] + ldr r2, [r8, #0x10c] + ldr r3, [r8, #0x9c] + add r1, r5, #1 + blx r3 + add sp, sp, #0x810 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02211CA0: + mov r2, #0 + str r2, [sp, #8] +_02211CA8: + add r0, r8, r2 + ldrsb r1, [r4, r2] + ldrsb r0, [r0, #0x84] + cmp r1, r0 + addne sp, sp, #0x810 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r2, r2, #1 + str r2, [sp, #8] + cmp r2, #4 + blt _02211CA8 + cmp r7, #4 + addlt sp, sp, #0x810 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, #7 + strb r0, [sp, #0xc] + ldrb r1, [r5] + ldrb r0, [r5, #1] + ldr r2, [sp, #0x80c] + add r4, sp, #0xc + strb r1, [r4, r2] + add r4, r4, r2 + strb r0, [r4, #1] + ldrb r2, [r5, #2] + ldrb r1, [r5, #3] + add r3, sp, #8 + mov r0, r8 + strb r2, [r4, #2] + strb r1, [r4, #3] + ldr r1, [sp, #0x80c] + add r1, r1, #4 + str r1, [sp, #0x80c] + ldrb r2, [r5] + ldrb r1, [r5, #1] + strb r2, [r3] + strb r1, [r3, #1] + ldrb r2, [r5, #2] + ldrb r1, [r5, #3] + strb r2, [r3, #2] + strb r1, [r3, #3] + ldr r1, [sp, #8] + bl ov00_02211A24 + cmp r0, #0 + bne _02211D70 + mov r0, r8 + add r1, r5, #4 + sub r2, r7, #4 + bl ov00_022118FC + b _02211D70 +_02211D68: + add sp, sp, #0x810 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02211D70: + str r6, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [r8] + ldr r2, [sp, #0x80c] + add r1, sp, #0xc + mov r3, #0 + bl ov00_021FF984 + add sp, sp, #0x810 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02211D98: .word ov00_02219D70 + arm_func_end ov00_02211A88 + + arm_func_start ov00_02211D9C +ov00_02211D9C: ; 0x02211D9C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + sub sp, sp, #0x800 + mov r4, r0 + mov r3, #0 + add r0, sp, #8 + add r2, r4, #0x84 + mov r1, #8 + str r3, [sp, #0x808] + bl ov00_022111D8 + add r0, r4, #0xcc + str r0, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [r4] + ldr r2, [sp, #0x808] + add r1, sp, #8 + mov r3, #0 + bl ov00_021FF984 + bl ov00_021FF368 + str r0, [r4, #0xb0] + add sp, sp, #0xc + add sp, sp, #0x800 + ldmia sp!, {r3, r4, pc} + arm_func_end ov00_02211D9C + + arm_func_start ov00_02211DFC +ov00_02211DFC: ; 0x02211DFC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + sub sp, sp, #0x800 + mov sl, r0 + mov sb, r1 + mov r3, #0 + add r0, sp, #0x24 + add r2, sl, #0x84 + mov r1, #3 + str r3, [sp, #0x824] + bl ov00_022111D8 + ldr r4, _02211FDC ; =ov00_0221B878 + mov r8, #0 + ldr r0, [r4] + cmp r0, #0 + ble _02211E8C + ldr fp, _02211FE0 ; =ov00_02219F24 + ldr r5, _02211FE4 ; =ov00_0221B87C + add r7, sp, #0x10 + add r6, sp, #0x24 +_02211E4C: + mov r0, r7 + mov r1, fp + mov r2, r8 + bl sprintf + mov r0, r6 + mov r1, r7 + bl ov00_02210DFC + ldr r0, [r5, r8, lsl #2] + bl SOC_InetNtoA + mov r1, r0 + mov r0, r6 + bl ov00_02210DFC + add r8, r8, #1 + ldr r0, [r4] + cmp r8, r0 + blt _02211E4C +_02211E8C: + ldr r1, _02211FE8 ; =ov00_02219F30 + add r0, sp, #0x24 + bl ov00_02210DFC + ldr r1, [sl, #0xc0] + add r0, sp, #0x24 + bl ov00_02210DC8 + ldr r1, _02211FEC ; =ov00_02219F3C + add r0, sp, #0x24 + bl ov00_02210DFC + ldr r0, [sl, #0xc8] + cmp r0, #0 + ldrne r1, _02211FF0 ; =ov00_02219F44 + add r0, sp, #0x24 + ldreq r1, _02211FF4 ; =ov00_02219F48 + bl ov00_02210DFC + cmp sb, #0 + beq _02211EE8 + ldr r1, _02211FF8 ; =ov00_02219F4C + add r0, sp, #0x24 + bl ov00_02210DFC + add r0, sp, #0x24 + mov r1, sb + bl ov00_02210DC8 +_02211EE8: + ldr r1, _02211FFC ; =ov00_02219F5C + add r0, sp, #0x24 + bl ov00_02210DFC + add r0, sp, #0x24 + add r1, sl, #4 + bl ov00_02210DFC + ldr r0, [sl, #0xa8] + cmp r0, #0 + beq _02211F40 + ldr r1, _02212000 ; =ov00_02219F68 + add r0, sp, #0x24 + bl ov00_02210DFC + ldr r1, [sl, #0x104] + add r0, sp, #0x24 + bl ov00_02210DC8 + ldr r1, _02212004 ; =ov00_02219F74 + add r0, sp, #0x24 + bl ov00_02210DFC + add r0, sl, #0x100 + ldrh r1, [r0, #8] + add r0, sp, #0x24 + bl ov00_02210DC8 +_02211F40: + cmp sb, #2 + beq _02211F70 + mov r2, #0xff + str r2, [sp] + mov r3, #0 + str r3, [sp, #4] + str r2, [sp, #8] + add r1, sp, #0x24 + mov r0, sl + str r3, [sp, #0xc] + bl ov00_022115B0 + b _02211F94 +_02211F70: + ldr r2, [sp, #0x824] + rsb r0, r2, #0x800 + cmp r0, #1 + blt _02211F94 + add r1, r2, #1 + str r1, [sp, #0x824] + add r0, sp, #0x24 + mov r1, #0 + strb r1, [r0, r2] +_02211F94: + add r0, sl, #0xcc + str r0, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [sl] + ldr r2, [sp, #0x824] + add r1, sp, #0x24 + mov r3, #0 + bl ov00_021FF984 + bl ov00_021FF368 + str r0, [sl, #0xac] + str r0, [sl, #0xb0] + cmp sb, #0 + movne r0, #0 + strne r0, [sl, #0xb4] + add sp, sp, #0x28 + add sp, sp, #0x800 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02211FDC: .word ov00_0221B878 +_02211FE0: .word ov00_02219F24 +_02211FE4: .word ov00_0221B87C +_02211FE8: .word ov00_02219F30 +_02211FEC: .word ov00_02219F3C +_02211FF0: .word ov00_02219F44 +_02211FF4: .word ov00_02219F48 +_02211FF8: .word ov00_02219F4C +_02211FFC: .word ov00_02219F5C +_02212000: .word ov00_02219F68 +_02212004: .word ov00_02219F74 + arm_func_end ov00_02211DFC + + arm_func_start ov00_02212008 +ov00_02212008: ; 0x02212008 + cmp r0, #0x32 + bxlt lr + cmp r0, #0xfe + bxgt lr + ldr r2, _02212024 ; =ov00_0221A0B8 + str r1, [r2, r0, lsl #2] + bx lr + .balign 4, 0 +_02212024: .word ov00_0221A0B8 + arm_func_end ov00_02212008 + + arm_func_start ov00_02212028 +ov00_02212028: ; 0x02212028 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r7, [sp, #0x28] + ldr r6, [sp, #0x2c] + movs sb, r1 + mov sl, r0 + mov fp, r2 + mov r8, r3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #1 + mov r4, #0 + mov r5, #1 + bls _0221206C +_0221205C: + mov r0, r5, lsl #1 + add r5, r0, #1 + cmp r5, sb + blo _0221205C +_0221206C: + ldr r2, [r6] + add r0, r2, #1 + str r0, [r6] + ldrb r1, [r7] + ldrb r0, [fp, r2] + ldrb r1, [sl, r1] + add r0, r1, r0 + strb r0, [r7] + ldr r0, [r6] + cmp r0, r8 + blo _022120AC + mov r0, #0 + str r0, [r6] + ldrb r0, [r7] + add r0, r0, r8 + strb r0, [r7] +_022120AC: + ldrb r0, [r7] + add r4, r4, #1 + cmp r4, #0xb + and r0, r5, r0 + bls _022120CC + mov r1, sb + bl _u32_div_f + mov r0, r1 +_022120CC: + cmp r0, sb + bhi _0221206C + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02212028 + + arm_func_start ov00_022120DC +ov00_022120DC: ; 0x022120DC + mov r1, #1 + strb r1, [r0, #0x100] + mov r1, #3 + strb r1, [r0, #0x101] + mov r1, #5 + strb r1, [r0, #0x102] + mov r1, #7 + strb r1, [r0, #0x103] + mov r1, #0xb + strb r1, [r0, #0x104] + mov r1, #0 + mov r2, #0xff +_0221210C: + strb r2, [r0, r1] + add r1, r1, #1 + cmp r1, #0x100 + sub r2, r2, #1 + blt _0221210C + bx lr + arm_func_end ov00_022120DC + + arm_func_start ov00_02212124 +ov00_02212124: ; 0x02212124 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + mov r7, r2 + mov sb, r0 + mov r8, r1 + cmp r7, #1 + bhs _0221214C + bl ov00_022120DC + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221214C: + mov r0, #0 +_02212150: + strb r0, [sb, r0] + add r0, r0, #1 + cmp r0, #0x100 + blt _02212150 + mov r0, #0 + str r0, [sp, #0xc] + strb r0, [sp, #8] + mov r6, #0xff + add r5, sp, #8 + add r4, sp, #0xc +_02212178: + str r5, [sp] + mov r0, sb + mov r1, r6 + mov r2, r8 + mov r3, r7 + str r4, [sp, #4] + bl ov00_02212028 + ldrb r2, [sb, r6] + ldrb r1, [sb, r0] + strb r1, [sb, r6] + strb r2, [sb, r0] + subs r6, r6, #1 + bpl _02212178 + ldrb r1, [sb, #1] + mov r0, #0 + strb r1, [sb, #0x100] + ldrb r1, [sb, #3] + strb r1, [sb, #0x101] + ldrb r1, [sb, #5] + strb r1, [sb, #0x102] + ldrb r1, [sb, #7] + strb r1, [sb, #0x103] + ldrb r1, [sp, #8] + ldrb r1, [sb, r1] + strb r1, [sb, #0x104] + strb r0, [sp, #8] + str r0, [sp, #0xc] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_02212124 + + arm_func_start ov00_022121EC +ov00_022121EC: ; 0x022121EC + stmdb sp!, {r4, lr} + ldrb r4, [r0, #0x100] + add r2, r4, #1 + strb r2, [r0, #0x100] + ldrb r3, [r0, #0x101] + ldrb r2, [r0, r4] + add r2, r3, r2 + strb r2, [r0, #0x101] + ldrb r3, [r0, #0x104] + and r2, r2, #0xff + ldrb r2, [r0, r2] + ldrb r4, [r0, r3] + strb r2, [r0, r3] + ldrb r3, [r0, #0x103] + ldrb r2, [r0, #0x101] + ldrb r3, [r0, r3] + strb r3, [r0, r2] + ldrb r3, [r0, #0x100] + ldrb r2, [r0, #0x103] + ldrb r3, [r0, r3] + strb r3, [r0, r2] + ldrb r2, [r0, #0x100] + strb r4, [r0, r2] + ldrb r3, [r0, #0x102] + ldrb r2, [r0, r4] + add r4, r3, r2 + strb r4, [r0, #0x102] + ldrb r3, [r0, #0x103] + ldrb r2, [r0, #0x104] + ldrb ip, [r0, #0x101] + ldrb lr, [r0, #0x100] + and r4, r4, #0xff + ldrb r3, [r0, r3] + ldrb r2, [r0, r2] + ldrb ip, [r0, ip] + ldrb r4, [r0, r4] + add r2, r3, r2 + ldrb r3, [r0, lr] + add r2, ip, r2 + and r2, r2, #0xff + add r3, r4, r3 + ldrb r2, [r0, r2] + and r3, r3, #0xff + ldrb r3, [r0, r3] + ldrb r2, [r0, r2] + eor r3, r1, r3 + eor r2, r3, r2 + strb r2, [r0, #0x103] + strb r1, [r0, #0x104] + ldrb r0, [r0, #0x103] + ldmia sp!, {r4, pc} + arm_func_end ov00_022121EC + + arm_func_start ov00_022122B8 +ov00_022122B8: ; 0x022122B8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r2 + mov r7, r0 + mov r6, r1 + mov r4, #0 + cmp r5, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} +_022122D4: + ldrb r1, [r6, r4] + mov r0, r7 + bl ov00_022121EC + strb r0, [r6, r4] + add r4, r4, #1 + cmp r4, r5 + blt _022122D4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_022122B8 + + arm_func_start ov00_022122F4 +ov00_022122F4: ; 0x022122F4 + ldr r2, [r0, #4] + cmp r2, #0 + strne r1, [r2, #0x20] + str r1, [r0, #4] + mov r2, #0 + str r2, [r1, #0x20] + ldr r2, [r0] + cmp r2, #0 + streq r1, [r0] + ldr r1, [r0, #8] + add r1, r1, #1 + str r1, [r0, #8] + bx lr + arm_func_end ov00_022122F4 + + arm_func_start ov00_02212328 +ov00_02212328: ; 0x02212328 + ldr r2, [r0] + str r2, [r1, #0x20] + str r1, [r0] + ldr r2, [r0, #4] + cmp r2, #0 + streq r1, [r0, #4] + ldr r1, [r0, #8] + add r1, r1, #1 + str r1, [r0, #8] + bx lr + arm_func_end ov00_02212328 + + arm_func_start ov00_02212350 +ov00_02212350: ; 0x02212350 + ldr r2, [r0] + cmp r2, #0 + beq _0221237C + ldr r1, [r2, #0x20] + str r1, [r0] + cmp r1, #0 + moveq r1, #0 + streq r1, [r0, #4] + ldr r1, [r0, #8] + sub r1, r1, #1 + str r1, [r0, #8] +_0221237C: + mov r0, r2 + bx lr + arm_func_end ov00_02212350 + + arm_func_start ov00_02212384 +ov00_02212384: ; 0x02212384 + ldr r2, [r0] + mov r3, #0 + cmp r2, #0 + beq _022123E8 +_02212394: + cmp r2, r1 + bne _022123D8 + cmp r3, #0 + ldrne r1, [r2, #0x20] + strne r1, [r3, #0x20] + ldr r1, [r0] + cmp r1, r2 + ldreq r1, [r2, #0x20] + streq r1, [r0] + ldr r1, [r0, #4] + cmp r1, r2 + streq r3, [r0, #4] + ldr r1, [r0, #8] + sub r1, r1, #1 + str r1, [r0, #8] + mov r0, #1 + bx lr +_022123D8: + mov r3, r2 + ldr r2, [r2, #0x20] + cmp r2, #0 + bne _02212394 +_022123E8: + mov r0, #0 + bx lr + arm_func_end ov00_02212384 + + arm_func_start ov00_022123F0 +ov00_022123F0: ; 0x022123F0 + mov r1, #0 + str r1, [r0, #4] + str r1, [r0] + str r1, [r0, #8] + bx lr + arm_func_end ov00_022123F0 + + arm_func_start ov00_02212404 +ov00_02212404: ; 0x02212404 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x110 + mov r5, r0 + mov r4, r1 + add r0, r5, #8 + bl ov00_022122F4 + bl ov00_021FF368 + str r0, [r4, #0x1c] + mov r0, #2 + strb r0, [sp, #9] + ldrb r1, [r4, #0x14] + tst r1, #0x20 + addne sp, sp, #0x110 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5] + cmp r0, #1 + bne _02212508 + mov r2, #0xfe + mov r1, #0xfd + mov r0, #0 + strb r2, [sp, #0x10] + strb r1, [sp, #0x11] + strb r0, [sp, #0x12] + ldrb r2, [r4, #0x1c] + ldrb r1, [r4, #0x1d] + add r3, sp, #0x13 + strb r2, [r3] + strb r1, [r3, #1] + ldrb r2, [r4, #0x1e] + ldrb r1, [r4, #0x1f] + strb r2, [r3, #2] + strb r1, [r3, #3] + ldrb r1, [r4, #0x14] + tst r1, #4 + beq _022124F0 + ldr r1, [r5, #0x40] + strb r1, [sp, #0x17] + ldr r3, [r5, #0x40] + cmp r3, #0 + ble _022124C8 + add r2, sp, #0x10 +_022124A8: + add r1, r5, r0 + ldrb r1, [r1, #0x2c] + add r0, r0, #1 + strb r1, [r2, #8] + ldr r3, [r5, #0x40] + add r2, r2, #1 + cmp r0, r3 + blt _022124A8 +_022124C8: + add r1, sp, #0x10 + add r0, r3, #8 + mov r2, #0 + strb r2, [r1, r0] + ldr r0, [r5, #0x40] + add r0, r0, #9 + strb r2, [r1, r0] + ldr r0, [r5, #0x40] + add r2, r0, #0xa + b _02212578 +_022124F0: + mov r0, #0xff + strb r0, [sp, #0x17] + strb r0, [sp, #0x18] + strb r0, [sp, #0x19] + mov r2, #0xa + b _02212578 +_02212508: + tst r1, #4 + add ip, sp, #0x10 + beq _0221254C + ldr r3, _022125DC ; =ov00_0221A4B0 + mov r2, #6 +_0221251C: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + bne _0221251C + ldrb r0, [r3] + mov r2, #0xd + strb r0, [ip] + b _02212578 +_0221254C: + ldr r3, _022125E0 ; =ov00_0221A4C0 + mov r2, #4 +_02212554: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + bne _02212554 + mov r2, #8 +_02212578: + ldr r1, [r4] + ldr r0, [r5, #0x28] + cmp r1, r0 + bne _022125A8 + ldrb r0, [r4, #0x15] + tst r0, #2 + beq _022125A8 + ldr r0, [r4, #8] + str r0, [sp, #0xc] + ldrh r0, [r4, #0xc] + strh r0, [sp, #0xa] + b _022125B4 +_022125A8: + str r1, [sp, #0xc] + ldrh r0, [r4, #4] + strh r0, [sp, #0xa] +_022125B4: + add r1, sp, #8 + str r1, [sp] + mov r0, #8 + str r0, [sp, #4] + ldr r0, [r5, #0x20] + add r1, sp, #0x10 + mov r3, #0 + bl ov00_021FF984 + add sp, sp, #0x110 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022125DC: .word ov00_0221A4B0 +_022125E0: .word ov00_0221A4C0 + arm_func_end ov00_02212404 + + arm_func_start ov00_022125E4 +ov00_022125E4: ; 0x022125E4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + cmp r3, #0 + bne _0221260C + ldr r0, _02212654 ; =ov00_0221B0D0 + ldr r0, [r0] + cmp r0, #1 + ldmneia sp!, {r4, r5, r6, pc} +_0221260C: + bl ov00_021FF3CC + stmia r6, {r4, r5} + mov r2, #0 + ldr r3, [sp, #0x10] + str r2, [r6, #0x40] + ldr r1, [sp, #0x14] + str r3, [r6, #0x44] + str r1, [r6, #0x48] + mov r0, #2 + mov r1, r0 + str r2, [r6, #0x28] + bl ov00_021FF804 + str r0, [r6, #0x20] + add r0, r6, #0x14 + bl ov00_022123F0 + add r0, r6, #8 + bl ov00_022123F0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02212654: .word ov00_0221B0D0 + arm_func_end ov00_022125E4 + + arm_func_start ov00_02212658 +ov00_02212658: ; 0x02212658 + str r1, [r0, #0x28] + bx lr + arm_func_end ov00_02212658 + + arm_func_start ov00_02212660 +ov00_02212660: ; 0x02212660 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x14 + bl ov00_022123F0 + add r0, r4, #8 + bl ov00_022123F0 + ldmia sp!, {r4, pc} + arm_func_end ov00_02212660 + + arm_func_start ov00_0221267C +ov00_0221267C: ; 0x0221267C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x20] + bl ov00_021FF818 + mvn r1, #0 + add r0, r4, #0x14 + str r1, [r4, #0x20] + bl ov00_022123F0 + add r0, r4, #8 + bl ov00_022123F0 + ldmia sp!, {r4, pc} + arm_func_end ov00_0221267C + + arm_func_start ov00_022126A8 +ov00_022126A8: ; 0x022126A8 + stmdb sp!, {r3, lr} + ldrb ip, [r1, #0x14] + cmp r3, #0 + and ip, ip, #0xc3 + strb ip, [r1, #0x14] + bne _022126D0 + ldrb r3, [r1, #0x14] + orr r3, r3, #4 + strb r3, [r1, #0x14] + b _022126F0 +_022126D0: + cmp r3, #1 + bne _022126E8 + ldrb r3, [r1, #0x14] + orr r3, r3, #8 + strb r3, [r1, #0x14] + b _022126F0 +_022126E8: + cmp r3, #2 + ldmeqia sp!, {r3, pc} +_022126F0: + ldr ip, [r0, #0x10] + ldr r3, [r0, #4] + cmp ip, r3 + bge _02212708 + bl ov00_02212404 + ldmia sp!, {r3, pc} +_02212708: + cmp r2, #0 + add r0, r0, #0x14 + beq _0221271C + bl ov00_02212328 + ldmia sp!, {r3, pc} +_0221271C: + bl ov00_022122F4 + ldmia sp!, {r3, pc} + arm_func_end ov00_022126A8 + + arm_func_start ov00_02212724 +ov00_02212724: ; 0x02212724 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r2 + ldrsb r2, [r8] + mov sl, r0 + mov sb, r1 + mov r7, r3 + cmp r2, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldrb r0, [sb, #0x14] + add r8, r8, #5 + sub r7, r7, #5 + tst r0, #4 + beq _022127C0 + ldr r0, [sl, #0x40] + mov r6, #0 + cmp r0, #0 + ble _022127B0 + ldr r4, _02212820 ; =ov00_0221A0B8 +_0221276C: + mov r0, r8 + mov r1, r7 + bl ov00_02213FD4 + movs r5, r0 + bmi _022127B0 + add r0, sl, r6 + ldrb r1, [r0, #0x2c] + mov r0, sb + mov r2, r8 + ldr r1, [r4, r1, lsl #2] + bl ov00_02212CD0 + ldr r0, [sl, #0x40] + add r6, r6, #1 + cmp r6, r0 + add r8, r8, r5 + sub r7, r7, r5 + blt _0221276C +_022127B0: + ldrb r0, [sb, #0x14] + orr r0, r0, #0x41 + strb r0, [sb, #0x14] + b _022127DC +_022127C0: + mov r0, sb + mov r1, r8 + mov r2, r7 + bl ov00_02213044 + ldrb r0, [sb, #0x14] + orr r0, r0, #0x43 + strb r0, [sb, #0x14] +_022127DC: + ldrb r0, [sb, #0x14] + and r0, r0, #0xf3 + strb r0, [sb, #0x14] + bl ov00_021FF368 + ldr r2, [sb, #0x1c] + mov r1, sb + sub r0, r0, r2 + str r0, [sb, #0x1c] + add r0, sl, #8 + bl ov00_02212384 + ldr r3, [sl, #0x48] + ldr r4, [sl, #0x44] + mov r0, sl + mov r2, sb + mov r1, #0 + blx r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02212820: .word ov00_0221A0B8 + arm_func_end ov00_02212724 + + arm_func_start ov00_02212824 +ov00_02212824: ; 0x02212824 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + mov r7, r2 + mov r5, r0 + ldr r1, _022128B8 ; =ov00_0221A4CC + mov r0, r7 + bl strstr + cmp r0, #0 + movne r6, #1 + moveq r6, #0 + mov r0, r4 + mov r1, r7 + bl ov00_02212FC4 + cmp r6, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r0, [r4, #0x14] + tst r0, #4 + orrne r0, r0, #0x41 + orreq r0, r0, #0x42 + strb r0, [r4, #0x14] + ldrb r0, [r4, #0x14] + and r0, r0, #0xf3 + strb r0, [r4, #0x14] + bl ov00_021FF368 + ldr r2, [r4, #0x1c] + mov r1, r4 + sub r0, r0, r2 + str r0, [r4, #0x1c] + add r0, r5, #8 + bl ov00_02212384 + ldr r3, [r5, #0x48] + ldr ip, [r5, #0x44] + mov r0, r5 + mov r2, r4 + mov r1, #0 + blx ip + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022128B8: .word ov00_0221A4CC + arm_func_end ov00_02212824 + + arm_func_start ov00_022128BC +ov00_022128BC: ; 0x022128BC + mov r0, #1 + bx lr + arm_func_end ov00_022128BC + + arm_func_start ov00_022128C4 +ov00_022128C4: ; 0x022128C4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + sub sp, sp, #0x800 + movs r8, r1 + mov r1, #8 + mov sb, r0 + str r1, [sp, #8] + ldrne r7, [sb, #0x24] + ldreq r7, [sb, #0x20] + mov r0, r7 + bl ov00_021FF694 + cmp r0, #0 + addeq sp, sp, #0x14 + addeq sp, sp, #0x800 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} +_02212900: + add r0, sp, #0xc + str r0, [sp] + add r4, sp, #8 + ldr r2, _02212A54 ; =0x000007FF + add r1, sp, #0x14 + mov r0, r7 + mov r3, #0 + str r4, [sp, #4] + bl ov00_021FF940 + mov r5, r0 + mvn r0, #0 + cmp r5, r0 + addeq sp, sp, #0x14 + addeq sp, sp, #0x800 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r4, sp, #0x14 + mov r0, #0 + strb r0, [r4, r5] + ldr r6, [sb, #8] + cmp r6, #0 + beq _02212A38 +_02212954: + cmp r8, #0 + beq _02212978 + ldrb r0, [r6, #0x15] + tst r0, #8 + beq _02212978 + ldr r1, [r6, #0x10] + ldr r0, [sp, #0x10] + cmp r1, r0 + beq _022129D0 +_02212978: + ldr r3, [sp, #0x10] + ldr r2, [r6] + cmp r2, r3 + bne _022129A0 + ldrh r1, [r6, #4] + ldrh r0, [sp, #0xe] + cmp r1, r0 + beq _022129D0 + cmp r8, #0 + bne _022129D0 +_022129A0: + ldr r0, [sb, #0x28] + cmp r2, r0 + bne _02212A2C + ldrb r0, [r6, #0x15] + tst r0, #2 + beq _02212A2C + ldr r0, [r6, #8] + cmp r0, r3 + ldreqh r1, [r6, #0xc] + ldreqh r0, [sp, #0xe] + cmpeq r1, r0 + bne _02212A2C +_022129D0: + cmp r8, #0 + beq _022129F8 + mov r0, sb + mov r1, r6 + mov r2, r4 + mov r3, r5 + bl ov00_022128BC + cmp r0, #0 + bne _02212A38 + b _02212A2C +_022129F8: + ldr r0, [sb] + add r2, sp, #0x14 + cmp r0, #1 + mov r0, sb + bne _02212A1C + mov r1, r6 + mov r3, r5 + bl ov00_02212724 + b _02212A38 +_02212A1C: + mov r1, r6 + mov r3, r5 + bl ov00_02212824 + b _02212A38 +_02212A2C: + ldr r6, [r6, #0x20] + cmp r6, #0 + bne _02212954 +_02212A38: + mov r0, r7 + bl ov00_021FF694 + cmp r0, #0 + bne _02212900 + add sp, sp, #0x14 + add sp, sp, #0x800 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02212A54: .word 0x000007FF + arm_func_end ov00_022128C4 + + arm_func_start ov00_02212A58 +ov00_02212A58: ; 0x02212A58 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + bl ov00_021FF368 + ldr r3, [r6, #8] + mov r5, r0 + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, _02212AE4 ; =0x000009C4 + mov r7, #1 +_02212A7C: + ldr r0, [r3, #0x1c] + add r0, r0, #0x1c4 + add r0, r0, #0x800 + cmp r5, r0 + ldmlsia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r2, [r3, #0x15] + mov r0, r6 + mov r1, r7 + orr r2, r2, #0x10 + strb r2, [r3, #0x15] + ldr r2, [r6, #8] + str r4, [r2, #0x1c] + ldr r3, [r6, #8] + ldrb r2, [r3, #0x15] + and r2, r2, #0xd3 + strb r2, [r3, #0x15] + ldr r2, [r6, #8] + ldr r3, [r6, #0x48] + ldr ip, [r6, #0x44] + blx ip + add r0, r6, #8 + bl ov00_02212350 + ldr r3, [r6, #8] + cmp r3, #0 + bne _02212A7C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02212AE4: .word 0x000009C4 + arm_func_end ov00_02212A58 + + arm_func_start ov00_02212AE8 +ov00_02212AE8: ; 0x02212AE8 + stmdb sp!, {r4, lr} + mov r4, r0 + b _02212B08 +_02212AF4: + add r0, r4, #0x14 + bl ov00_02212350 + mov r1, r0 + mov r0, r4 + bl ov00_02212404 +_02212B08: + ldr r1, [r4, #0x10] + ldr r0, [r4, #4] + cmp r1, r0 + ldmgeia sp!, {r4, pc} + ldr r0, [r4, #0x1c] + cmp r0, #0 + bgt _02212AF4 + ldmia sp!, {r4, pc} + arm_func_end ov00_02212AE8 + + arm_func_start ov00_02212B28 +ov00_02212B28: ; 0x02212B28 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x10] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + bl ov00_022128C4 + mov r0, r4 + bl ov00_02212A58 + ldr r0, [r4, #0x1c] + cmp r0, #0 + ble _02212B60 + mov r0, r4 + bl ov00_02212AE8 +_02212B60: + ldr r0, [r4, #0x10] + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r3, [r4, #0x48] + ldr ip, [r4, #0x44] + mov r0, r4 + mov r1, #2 + mov r2, #0 + blx ip + ldmia sp!, {r4, pc} + arm_func_end ov00_02212B28 + + arm_func_start ov00_02212B88 +ov00_02212B88: ; 0x02212B88 + ldr r3, [r0, #0x40] + cmp r3, #0x14 + bxge lr + add r2, r3, #1 + str r2, [r0, #0x40] + add r0, r0, r3 + strb r1, [r0, #0x2c] + bx lr + arm_func_end ov00_02212B88 + + arm_func_start ov00_02212BA8 +ov00_02212BA8: ; 0x02212BA8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + add r0, r5, #8 + mov r4, r1 + bl ov00_02212384 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r4 + add r0, r5, #0x14 + bl ov00_02212384 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02212BA8 + + arm_func_start ov00_02212BD4 +ov00_02212BD4: ; 0x02212BD4 + ldr ip, _02212BE0 ; =ov00_0221321C + ldr r0, [r0] + bx ip + .balign 4, 0 +_02212BE0: .word ov00_0221321C + arm_func_end ov00_02212BD4 + + arm_func_start ov00_02212BE4 +ov00_02212BE4: ; 0x02212BE4 + ldr ip, _02212BF4 ; =strnicmp + ldr r0, [r0] + ldr r1, [r1] + bx ip + .balign 4, 0 +_02212BF4: .word strnicmp + arm_func_end ov00_02212BE4 + + arm_func_start ov00_02212BF8 +ov00_02212BF8: ; 0x02212BF8 + ldr ip, _02212C04 ; =ov00_021EC3D8 + ldr r0, [r0] + bx ip + .balign 4, 0 +_02212C04: .word ov00_021EC3D8 + arm_func_end ov00_02212BF8 + + arm_func_start ov00_02212C08 +ov00_02212C08: ; 0x02212C08 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _02212C5C ; =ov00_0221B9D0 + ldr r0, [r0, #8] + cmp r0, #0 + bne _02212C4C + ldr r0, _02212C60 ; =ov00_02212BE4 + ldr ip, _02212C64 ; =ov00_02212BF8 + str r0, [sp] + ldr r3, _02212C68 ; =ov00_02212BD4 + mov r0, #8 + mov r1, #0x64 + mov r2, #2 + str ip, [sp, #4] + bl ov00_021FED4C + ldr r1, _02212C5C ; =ov00_0221B9D0 + str r0, [r1, #8] +_02212C4C: + ldr r0, _02212C5C ; =ov00_0221B9D0 + ldr r0, [r0, #8] + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02212C5C: .word ov00_0221B9D0 +_02212C60: .word ov00_02212BE4 +_02212C64: .word ov00_02212BF8 +_02212C68: .word ov00_02212BD4 + arm_func_end ov00_02212C08 + + arm_func_start ov00_02212C6C +ov00_02212C6C: ; 0x02212C6C + stmdb sp!, {r3, lr} + ldr r0, _02212CA8 ; =ov00_0221B9D0 + ldr r0, [r0, #8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov00_021FEF00 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02212CA8 ; =ov00_0221B9D0 + ldr r0, [r0, #8] + bl ov00_021FEE8C + ldr r0, _02212CA8 ; =ov00_0221B9D0 + mov r1, #0 + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02212CA8: .word ov00_0221B9D0 + arm_func_end ov00_02212C6C + + arm_func_start ov00_02212CAC +ov00_02212CAC: ; 0x02212CAC + stmdb sp!, {r4, lr} + ldr r4, [r0] + ldr r0, [r4, #0x18] + bl ov00_021FEE8C + mov r1, #0 + mov r0, r4 + str r1, [r4, #0x18] + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + arm_func_end ov00_02212CAC + + arm_func_start ov00_02212CD0 +ov00_02212CD0: ; 0x02212CD0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r2 + mov r0, #0 + bl ov00_02213EE8 + str r0, [sp] + mov r1, r4 + mov r0, #0 + bl ov00_02213EE8 + str r0, [sp, #4] + ldr r0, [r5, #0x18] + add r1, sp, #0 + bl ov00_021FEF74 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02212CD0 + + arm_func_start ov00_02212D10 +ov00_02212D10: ; 0x02212D10 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + mov r4, r1 + mov r5, r0 + ldr r1, _02212D44 ; =ov00_0221A4FC + add r0, sp, #0 + bl sprintf + add r2, sp, #0 + mov r0, r5 + mov r1, r4 + bl ov00_02212CD0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_02212D44: .word ov00_0221A4FC + arm_func_end ov00_02212D10 + + arm_func_start ov00_02212D48 +ov00_02212D48: ; 0x02212D48 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02212D74 + ldr r0, _02212DA8 ; =ov00_0221A500 + ldr r1, _02212DAC ; =ov00_0221A508 + ldr r2, _02212DB0 ; =ov00_0221A4E4 + mov r3, #0x97 + bl __msl_assertion_failed +_02212D74: + cmp r6, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + str r5, [sp] + ldr r0, [r6, #0x18] + add r1, sp, #0 + bl ov00_021FF0C0 + cmp r0, #0 + ldrne r4, [r0, #4] + mov r0, r4 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02212DA8: .word ov00_0221A500 +_02212DAC: .word ov00_0221A508 +_02212DB0: .word ov00_0221A4E4 + arm_func_end ov00_02212D48 + + arm_func_start ov00_02212DB4 +ov00_02212DB4: ; 0x02212DB4 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r6, r0 + ldr r1, _02212E3C ; =ov00_0221A514 + mov r0, r5 + mov r4, r2 + bl strcmp + cmp r0, #0 + mov r0, r6 + bne _02212DE4 + bl ov00_022132BC + ldmia sp!, {r4, r5, r6, pc} +_02212DE4: + mov r1, r5 + mov r2, #0 + bl ov00_02212D48 + cmp r0, #0 + beq _02212E2C + ldrb r2, [r0] + cmp r2, #0 + blt _02212E0C + cmp r2, #0x80 + blt _02212E14 +_02212E0C: + mov r1, #0 + b _02212E24 +_02212E14: + ldr r1, _02212E40 ; =_0210E504 + mov r2, r2, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #8 +_02212E24: + cmp r1, #0 + bne _02212E34 +_02212E2C: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} +_02212E34: + bl atoi + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02212E3C: .word ov00_0221A514 +_02212E40: .word _0210E504 + arm_func_end ov00_02212DB4 + + arm_func_start ov00_02212E44 +ov00_02212E44: ; 0x02212E44 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + mov r2, #0 + mov r4, r3 + bl ov00_02212D48 + cmp r0, #0 + beq _02212E6C + bl atof + mov r5, r0 + mov r4, r1 +_02212E6C: + mov r0, r5 + mov r1, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02212E44 + + arm_func_start ov00_02212E78 +ov00_02212E78: ; 0x02212E78 + ldr r0, [r0] + bx lr + arm_func_end ov00_02212E78 + + arm_func_start ov00_02212E80 +ov00_02212E80: ; 0x02212E80 + ldrh r0, [r0, #4] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + arm_func_end ov00_02212E80 + + arm_func_start ov00_02212EA4 +ov00_02212EA4: ; 0x02212EA4 + ldrh r0, [r0, #4] + bx lr + arm_func_end ov00_02212EA4 + + arm_func_start ov00_02212EAC +ov00_02212EAC: ; 0x02212EAC + ldrb r0, [r0, #0x15] + and r0, r0, #2 + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end ov00_02212EAC + + arm_func_start ov00_02212EC4 +ov00_02212EC4: ; 0x02212EC4 + ldr r0, [r0, #8] + bx lr + arm_func_end ov00_02212EC4 + + arm_func_start ov00_02212ECC +ov00_02212ECC: ; 0x02212ECC + ldrh r0, [r0, #0xc] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + arm_func_end ov00_02212ECC + + arm_func_start ov00_02212EF0 +ov00_02212EF0: ; 0x02212EF0 + str r1, [r0, #0x20] + bx lr + arm_func_end ov00_02212EF0 + + arm_func_start ov00_02212EF8 +ov00_02212EF8: ; 0x02212EF8 + ldr r0, [r0, #0x20] + bx lr + arm_func_end ov00_02212EF8 + + arm_func_start ov00_02212F00 +ov00_02212F00: ; 0x02212F00 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r1, _02212F5C ; =ov00_022163F0 + add r4, sp, #0 + ldr r2, [r1] + ldr r1, [r1, #4] + mov r6, r0 + str r2, [sp] + str r1, [sp, #4] + mov r5, #0 +_02212F28: + ldr r1, [r4, r5, lsl #2] + mov r0, r6 + bl strcmp + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r5, r5, #1 + cmp r5, #2 + blo _02212F28 + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02212F5C: .word ov00_022163F0 + arm_func_end ov00_02212F00 + + arm_func_start ov00_02212F60 +ov00_02212F60: ; 0x02212F60 + cmp r0, #0 + ldrne r2, _02212FC0 ; =ov00_0221B9D0 + strne r0, [r2] + ldr r2, _02212FC0 ; =ov00_0221B9D0 + ldr r0, [r2] + mov ip, r0 + b _02212F84 +_02212F7C: + add ip, ip, #1 + str ip, [r2] +_02212F84: + ldrsb r3, [ip] + cmp r3, #0 + cmpne r3, r1 + bne _02212F7C + cmp ip, r0 + moveq r0, #0 + cmp r3, #0 + bxeq lr + ldr r1, _02212FC0 ; =ov00_0221B9D0 + mov r2, #0 + ldr r3, [r1] + strb r2, [ip] + add r2, r3, #1 + str r2, [r1] + bx lr + .balign 4, 0 +_02212FC0: .word ov00_0221B9D0 + arm_func_end ov00_02212F60 + + arm_func_start ov00_02212FC4 +ov00_02212FC4: ; 0x02212FC4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + add r0, r1, #1 + mov r1, #0x5c + bl ov00_02212F60 + movs r8, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0 + mov fp, #0x5c + ldr r5, _02213040 ; =ov00_0221A51C + mov r7, r4 + mov r6, fp +_02212FF4: + mov r0, r7 + mov r1, r6 + bl ov00_02212F60 + movs sb, r0 + mov r0, r8 + moveq sb, r5 + bl ov00_02212F00 + cmp r0, #0 + beq _02213028 + mov r0, sl + mov r1, r8 + mov r2, sb + bl ov00_02212CD0 +_02213028: + mov r0, r4 + mov r1, fp + bl ov00_02212F60 + movs r8, r0 + bne _02212FF4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02213040: .word ov00_0221A51C + arm_func_end ov00_02212FC4 + + arm_func_start ov00_02213044 +ov00_02213044: ; 0x02213044 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x8c + mov sl, r1 + ldrsb r1, [sl] + mov fp, r0 + mov sb, r2 + cmp r1, #0 + beq _022130C4 +_02213064: + mov r0, sl + mov r1, sb + bl ov00_02213FD4 + cmp r0, #0 + addlt sp, sp, #0x8c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, sl + sub sb, sb, r0 + add sl, sl, r0 + mov r0, sl + mov r1, sb + bl ov00_02213FD4 + cmp r0, #0 + addlt sp, sp, #0x8c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r2, sl + mov r1, r4 + add sl, sl, r0 + sub sb, sb, r0 + mov r0, fp + bl ov00_02212CD0 + ldrsb r0, [sl] + cmp r0, #0 + bne _02213064 +_022130C4: + mov r0, #0 + add sl, sl, #1 + sub sb, sb, #1 + str r0, [sp] +_022130D4: + cmp sb, #2 + addlt sp, sp, #0x8c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r1, [sl] + ldrb r0, [sl, #1] + add r2, sp, #8 + add sl, sl, #2 + strb r1, [r2] + strb r0, [r2, #1] + ldrh r0, [sp, #8] + str sl, [sp, #4] + sub sb, sb, #2 + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #8] + ldrsb r0, [sl] + mov r5, #0 + cmp r0, #0 + beq _02213164 +_0221312C: + mov r0, sl + mov r1, sb + bl ov00_02213FD4 + cmp r0, #0 + addlt sp, sp, #0x8c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #0x64 + addgt sp, sp, #0x8c + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrsb r1, [sl, r0]! + add r5, r5, #1 + sub sb, sb, r0 + cmp r1, #0 + bne _0221312C +_02213164: + ldrh r0, [sp, #8] + add sl, sl, #1 + sub sb, sb, #1 + cmp r0, #0 + mov r6, #0 + ble _022131FC +_0221317C: + ldr r8, [sp, #4] + mov r7, #0 + cmp r5, #0 + ble _022131EC +_0221318C: + mov r0, sl + mov r1, sb + bl ov00_02213FD4 + movs r4, r0 + addmi sp, sp, #0x8c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02213218 ; =ov00_0221A520 + add r0, sp, #0xa + mov r2, r8 + mov r3, r6 + bl sprintf + mov r0, fp + add r1, sp, #0xa + mov r2, sl + bl ov00_02212CD0 + mov r0, r8 + add sl, sl, r4 + sub sb, sb, r4 + bl strlen + add r0, r0, #1 + add r7, r7, #1 + add r8, r8, r0 + cmp r7, r5 + blt _0221318C +_022131EC: + ldrh r0, [sp, #8] + add r6, r6, #1 + cmp r6, r0 + blt _0221317C +_022131FC: + ldr r0, [sp] + add r0, r0, #1 + str r0, [sp] + cmp r0, #2 + blt _022130D4 + add sp, sp, #0x8c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02213218: .word ov00_0221A520 + arm_func_end ov00_02213044 + + arm_func_start ov00_0221321C +ov00_0221321C: ; 0x0221321C + stmdb sp!, {r3, lr} + ldrsb lr, [r0] + mov ip, #0 + cmp lr, #0 + beq _0221325C + ldr r3, _0221326C ; =_0210E404 + ldr r2, _02213270 ; =0x9CCF9319 +_02213238: + cmp lr, #0 + blt _0221324C + cmp lr, #0x80 + bge _0221324C + ldrb lr, [r3, lr] +_0221324C: + mla ip, r2, ip, lr + ldrsb lr, [r0, #1]! + cmp lr, #0 + bne _02213238 +_0221325C: + mov r0, ip + bl _u32_div_f + mov r0, r1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221326C: .word _0210E404 +_02213270: .word 0x9CCF9319 + arm_func_end ov00_0221321C + + arm_func_start ov00_02213274 +ov00_02213274: ; 0x02213274 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4] + mov r0, #0 + bl ov00_02213F58 + ldr r1, [r4, #4] + mov r0, #0 + bl ov00_02213F58 + ldmia sp!, {r4, pc} + arm_func_end ov00_02213274 + + arm_func_start ov00_02213298 +ov00_02213298: ; 0x02213298 + ldr ip, _022132A4 ; =ov00_0221321C + ldr r0, [r0] + bx ip + .balign 4, 0 +_022132A4: .word ov00_0221321C + arm_func_end ov00_02213298 + + arm_func_start ov00_022132A8 +ov00_022132A8: ; 0x022132A8 + ldr ip, _022132B8 ; =strnicmp + ldr r0, [r0] + ldr r1, [r1] + bx ip + .balign 4, 0 +_022132B8: .word strnicmp + arm_func_end ov00_022132A8 + + arm_func_start ov00_022132BC +ov00_022132BC: ; 0x022132BC + ldr r0, [r0, #0x1c] + bx lr + arm_func_end ov00_022132BC + + arm_func_start ov00_022132C4 +ov00_022132C4: ; 0x022132C4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r0, #0x24 + mov r6, r1 + mov r5, r2 + bl ov00_021EC3A8 + movs r4, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, _02213364 ; =ov00_022132A8 + ldr ip, _02213368 ; =ov00_02213274 + str r1, [sp] + mov r0, #8 + ldr r3, _0221336C ; =ov00_02213298 + mov r1, r0 + mov r2, #4 + str ip, [sp, #4] + bl ov00_021FED4C + str r0, [r4, #0x18] + cmp r0, #0 + bne _02213330 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_02213330: + mov r1, #0 + strb r1, [r4, #0x14] + strb r1, [r4, #0x15] + str r1, [r4, #0x20] + str r1, [r4, #0x1c] + str r1, [r4, #0x10] + str r6, [r4] + strh r5, [r4, #4] + str r1, [r4, #8] + mov r0, r4 + strh r1, [r4, #0xc] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02213364: .word ov00_022132A8 +_02213368: .word ov00_02213274 +_0221336C: .word ov00_02213298 + arm_func_end ov00_022132C4 + + arm_func_start ov00_02213370 +ov00_02213370: ; 0x02213370 + strb r1, [r0, #0x15] + bx lr + arm_func_end ov00_02213370 + + arm_func_start ov00_02213378 +ov00_02213378: ; 0x02213378 + str r1, [r0, #8] + strh r2, [r0, #0xc] + bx lr + arm_func_end ov00_02213378 + + arm_func_start ov00_02213384 +ov00_02213384: ; 0x02213384 + str r1, [r0, #0x10] + bx lr + arm_func_end ov00_02213384 + + arm_func_start ov00_0221338C +ov00_0221338C: ; 0x0221338C + strb r1, [r0, #0x14] + bx lr + arm_func_end ov00_0221338C + + arm_func_start ov00_02213394 +ov00_02213394: ; 0x02213394 + ldrb r0, [r0, #0x14] + bx lr + arm_func_end ov00_02213394 + + arm_func_start ov00_0221339C +ov00_0221339C: ; 0x0221339C + ldr r1, _022133B4 ; =ov00_0221B9D0 + ldr r1, [r1, #4] + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_022133B4: .word ov00_0221B9D0 + arm_func_end ov00_0221339C + + arm_func_start ov00_022133B8 +ov00_022133B8: ; 0x022133B8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r2 + mov r4, r3 + cmp r1, #6 + addls pc, pc, r1, lsl #2 + b _0221353C +_022133D4: ; jump table + b _022133F0 ; case 0 + b _02213468 ; case 1 + b _0221349C ; case 2 + b _022134D0 ; case 3 + b _0221353C ; case 4 + b _02213514 ; case 5 + b _02213530 ; case 6 +_022133F0: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #0 + blx ip + ldrb r0, [r5, #0x14] + tst r0, #3 + beq _02213418 + tst r0, #0x40 + bne _0221353C +_02213418: + tst r0, #0x2c + ldreq r0, [r4, #0x624] + cmpeq r0, #0 + bne _0221353C + ldrb r0, [r5, #0x15] + tst r0, #1 + beq _02213450 + ldr r0, [r4, #0x4c] + cmp r0, #0 + ldrne r0, [r4, #0x40] + cmpne r0, #0 + moveq r3, #1 + movne r3, #0 + b _02213454 +_02213450: + mov r3, #2 +_02213454: + mov r0, r4 + mov r1, r5 + mov r2, #0 + bl ov00_022126A8 + b _0221353C +_02213468: + ldrb r0, [r5, #0x14] + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + tst r0, #0x43 + bne _0221348C + mov r0, r4 + mov r1, #2 + blx ip + b _0221353C +_0221348C: + mov r0, r4 + mov r1, #1 + blx ip + b _0221353C +_0221349C: + ldrb r0, [r5, #0x14] + tst r0, #0x2c + beq _022134B4 + mov r0, r4 + mov r1, r5 + bl ov00_02212BA8 +_022134B4: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r2, r5 + mov r1, #3 + blx ip + b _0221353C +_022134D0: + ldr r1, [r4, #0x620] + cmp r1, #0 + beq _022134E0 + bl ov00_02214908 +_022134E0: + ldr r0, [r6, #4] + bl ArrayLength + cmp r0, #0 + ldrne r0, [r4, #0x10] + cmpne r0, #0 + bne _0221353C + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #4 + mov r2, #0 + blx ip + b _0221353C +_02213514: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #5 + mov r2, #0 + blx ip + b _0221353C +_02213530: + ldr r1, [r4, #0x4ec] + mov r0, r4 + bl ov00_02212658 +_0221353C: + cmp r5, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, [r5] + ldr r0, [r4, #0x628] + cmp r1, r0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r4, #0x600 + ldrh r1, [r5, #4] + ldrh r0, [r0, #0x2c] + cmp r1, r0 + moveq r0, #0 + streq r0, [r4, #0x628] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_022133B8 + + arm_func_start ov00_02213570 +ov00_02213570: ; 0x02213570 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + mov r4, r3 + cmp r1, #0 + beq _022135B0 + cmp r1, #1 + beq _02213598 + cmp r1, #2 + beq _022135C8 + b _022135DC +_02213598: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #2 + blx ip + b _022135DC +_022135B0: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #1 + blx ip + b _022135DC +_022135C8: + ldr r3, [r4, #0x634] + ldr ip, [r4, #0x630] + mov r0, r4 + mov r1, #4 + blx ip +_022135DC: + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5] + ldr r0, [r4, #0x628] + cmp r1, r0 + ldmneia sp!, {r3, r4, r5, pc} + add r0, r4, #0x600 + ldrh r1, [r5, #4] + ldrh r0, [r0, #0x2c] + cmp r1, r0 + moveq r0, #0 + streq r0, [r4, #0x628] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02213570 + + arm_func_start ov00_02213610 +ov00_02213610: ; 0x02213610 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldr r4, [sp, #0x30] + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp r4, #0 + bne _0221364C + ldr r0, _022136D4 ; =ov00_0221B0D0 + ldr r0, [r0] + cmp r0, #1 + addne sp, sp, #0x10 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_0221364C: + ldr r0, _022136D8 ; =0x00000638 + bl ov00_021EC3A8 + movs r4, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0x34] + ldr r0, [sp, #0x38] + str r1, [r4, #0x630] + str r0, [r4, #0x634] + mov r0, #0 + str r0, [r4, #0x624] + ldr r1, [sp, #0x30] + str r5, [sp] + ldr r0, _022136DC ; =ov00_022133B8 + str r1, [sp, #4] + str r0, [sp, #8] + mov r1, r8 + mov r2, r7 + mov r3, r6 + add r0, r4, #0x4c + str r4, [sp, #0xc] + bl ov00_02214004 + ldr r0, _022136E0 ; =ov00_02213570 + ldr r1, [sp, #0x28] + str r0, [sp] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + mov r0, r4 + str r4, [sp, #4] + bl ov00_022125E4 + mov r0, r4 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022136D4: .word ov00_0221B0D0 +_022136D8: .word 0x00000638 +_022136DC: .word ov00_022133B8 +_022136E0: .word ov00_02213570 + arm_func_end ov00_02213610 + + arm_func_start ov00_022136E4 +ov00_022136E4: ; 0x022136E4 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x4c + bl ov00_0221496C + mov r0, r4 + bl ov00_0221267C + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + arm_func_end ov00_022136E4 + + arm_func_start ov00_02213708 +ov00_02213708: ; 0x02213708 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x108 + ldr r8, [sp, #0x130] + mov sl, r0 + str r1, [sp, #4] + add r4, sp, #8 + mov sb, r3 + mov r1, #0x40 + mov r0, #0 +_0221372C: + strb r0, [r4] + strb r0, [r4, #1] + strb r0, [r4, #2] + strb r0, [r4, #3] + add r4, r4, #4 + subs r1, r1, #1 + bne _0221372C + mov r5, #0 + str r2, [sl, #0x620] + mov r6, r5 + str r5, [sl, #0x40] + cmp r8, #0 + ble _022137B4 + ldr r4, _02213830 ; =ov00_0221A0B8 + add fp, sp, #8 +_02213768: + ldrb r0, [sb, r6] + ldr r7, [r4, r0, lsl #2] + mov r0, r7 + bl strlen + add r0, r5, r0 + add r0, r0, #1 + cmp r0, #0x100 + bge _022137B4 + ldr r1, _02213834 ; =ov00_0221A528 + mov r2, r7 + add r0, fp, r5 + bl sprintf + add r5, r5, r0 + ldrb r1, [sb, r6] + mov r0, sl + bl ov00_02212B88 + add r6, r6, #1 + cmp r6, r8 + blt _02213768 +_022137B4: + ldr r4, [sp, #0x13c] + ldr r2, [sp, #0x134] + ldr r3, [sp, #0x138] + add r1, sp, #8 + add r0, sl, #0x4c + str r4, [sp] + bl ov00_022145F0 + cmp r0, #0 + addne sp, sp, #0x108 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #4] + cmp r1, #0 + addne sp, sp, #0x108 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0xa + b _02213804 +_022137F4: + mov r0, r4 + bl ov00_021FF3C0 + mov r0, sl + bl ov00_02213938 +_02213804: + ldr r1, [sl, #0x4c] + cmp r1, #3 + beq _022137F4 + ldr r1, [sl, #0x10] + cmp r1, #0 + addle sp, sp, #0x108 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #0 + beq _022137F4 + add sp, sp, #0x108 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02213830: .word ov00_0221A0B8 +_02213834: .word ov00_0221A528 + arm_func_end ov00_02213708 + + arm_func_start ov00_02213838 +ov00_02213838: ; 0x02213838 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr lr, [sp, #0x18] + ldr ip, [sp, #0x1c] + str lr, [sp] + str ip, [sp, #4] + mov lr, #0x80 + ldr ip, [sp, #0x20] + str lr, [sp, #8] + str ip, [sp, #0xc] + bl ov00_02213708 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + arm_func_end ov00_02213838 + + arm_func_start ov00_0221386C +ov00_0221386C: ; 0x0221386C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r0 + mov r6, r2 + mov r0, r1 + mov r4, r3 + bl ov00_021FFA44 + mov r3, r6, asr #8 + mov r2, r6, lsl #8 + ldr ip, [sp, #0x18] + mov r1, r0 + str ip, [sp] + and r3, r3, #0xff + and r0, r2, #0xff00 + orr r0, r3, r0 + mov r2, r0, lsl #0x10 + mov r3, r4 + add r0, r5, #0x4c + mov r2, r2, lsr #0x10 + bl ov00_02215CDC + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_0221386C + + arm_func_start ov00_022138C4 +ov00_022138C4: ; 0x022138C4 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r6, r2 + mov r0, r1 + mov r4, r3 + bl ov00_021FFA44 + mov r3, r6, asr #8 + mov r2, r6, lsl #8 + mov r1, r0 + and r3, r3, #0xff + and r0, r2, #0xff00 + orr r0, r3, r0 + mov r2, r0, lsl #0x10 + mov r3, r4 + add r0, r5, #0x4c + mov r2, r2, lsr #0x10 + bl ov00_02215E04 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_022138C4 + + arm_func_start ov00_0221390C +ov00_0221390C: ; 0x0221390C + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x4c + bl ov00_02213CA8 + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0x4c + bl ov00_02213DA0 + ldmia sp!, {r4, pc} + arm_func_end ov00_0221390C + + arm_func_start ov00_02213938 +ov00_02213938: ; 0x02213938 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_02212B28 + add r0, r4, #0x4c + bl ov00_02215FE0 + ldmia sp!, {r4, pc} + arm_func_end ov00_02213938 + + arm_func_start ov00_02213950 +ov00_02213950: ; 0x02213950 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x4c + bl ov00_02214908 + mov r0, r4 + bl ov00_02212660 + ldmia sp!, {r4, pc} + arm_func_end ov00_02213950 + + arm_func_start ov00_0221396C +ov00_0221396C: ; 0x0221396C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_02213950 + add r0, r4, #0x4c + bl ov00_02213E68 + ldmia sp!, {r4, pc} + arm_func_end ov00_0221396C + + arm_func_start ov00_02213984 +ov00_02213984: ; 0x02213984 + ldr r1, [r0, #0x10] + cmp r1, #0 + movgt r0, #2 + bxgt lr + ldr r0, [r0, #0x4c] + cmp r0, #3 + cmpne r0, #0 + moveq r0, #1 + bxeq lr + cmp r0, #1 + moveq r0, #0 + movne r0, #3 + bx lr + arm_func_end ov00_02213984 + + arm_func_start ov00_022139B8 +ov00_022139B8: ; 0x022139B8 + ldr ip, _022139C4 ; =ov00_02213DFC + add r0, r0, #0x4c + bx ip + .balign 4, 0 +_022139C4: .word ov00_02213DFC + arm_func_end ov00_022139B8 + + arm_func_start ov00_022139C8 +ov00_022139C8: ; 0x022139C8 + ldr ip, _022139D4 ; =ov00_02213DEC + add r0, r0, #0x4c + bx ip + .balign 4, 0 +_022139D4: .word ov00_02213DEC + arm_func_end ov00_022139C8 + + arm_func_start ov00_022139D8 +ov00_022139D8: ; 0x022139D8 + ldr ip, _022139E4 ; =ov00_02213BF4 + add r0, r0, #0x4c + bx ip + .balign 4, 0 +_022139E4: .word ov00_02213BF4 + arm_func_end ov00_022139D8 + + arm_func_start ov00_022139E8 +ov00_022139E8: ; 0x022139E8 + ldr r0, [r0, #0x4ec] + bx lr + arm_func_end ov00_022139E8 + + arm_func_start ov00_022139F0 +ov00_022139F0: ; 0x022139F0 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _02213A48 ; =ov00_0221B9DC + ldr r0, [r0] + ldr r2, [r2] + ldr r5, [r1] + ldr r1, [r2, #0x498] + mov r2, #0 + bl ov00_02212DB4 + ldr r1, _02213A48 ; =ov00_0221B9DC + mov r4, r0 + ldr r1, [r1] + mov r0, r5 + ldr r1, [r1, #0x498] + mov r2, #0 + bl ov00_02212DB4 + ldr r1, _02213A48 ; =ov00_0221B9DC + sub r0, r4, r0 + ldr r1, [r1] + ldr r1, [r1, #0x49c] + cmp r1, #0 + rsbeq r0, r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02213A48: .word ov00_0221B9DC + arm_func_end ov00_022139F0 + + arm_func_start ov00_02213A4C +ov00_02213A4C: ; 0x02213A4C + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _02213B20 ; =ov00_0221B9DC + mov r2, #0 + ldr r3, [r3] + ldr r5, [r1] + ldr r0, [r0] + ldr r1, [r3, #0x498] + mov r3, r2 + bl ov00_02212E44 + ldr r3, _02213B20 ; =ov00_0221B9DC + mov r2, #0 + mov r4, r0 + ldr r0, [r3] + mov r6, r1 + ldr r1, [r0, #0x498] + mov r0, r5 + mov r3, r2 + bl ov00_02212E44 + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, r6 + bl _dsub + ldr r2, _02213B20 ; =ov00_0221B9DC + mov r4, r0 + ldr r0, [r2] + mov r5, r1 + ldr r0, [r0, #0x49c] + cmp r0, #0 + bne _02213AE0 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r5 + bl _dsub + mov r4, r0 + mov r5, r1 +_02213AE0: + mov r0, r4 + mov r1, r5 + bl _d2f + mov r1, #0 + bl _fgr + movhi r0, #1 + ldmhiia sp!, {r4, r5, r6, pc} + mov r0, r4 + mov r1, r5 + bl _d2f + mov r1, #0 + bl _fls + movlo r0, #1 + movhs r0, #0 + rsb r0, r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02213B20: .word ov00_0221B9DC + arm_func_end ov00_02213A4C + + arm_func_start ov00_02213B24 +ov00_02213B24: ; 0x02213B24 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _02213B84 ; =ov00_0221B9DC + mov r5, r1 + ldr r1, [r2] + ldr r0, [r0] + ldr r1, [r1, #0x498] + ldr r2, _02213B88 ; =ov00_0221A5B8 + bl ov00_02212D48 + ldr r1, _02213B84 ; =ov00_0221B9DC + mov r4, r0 + ldr r1, [r1] + ldr r0, [r5] + ldr r1, [r1, #0x498] + ldr r2, _02213B88 ; =ov00_0221A5B8 + bl ov00_02212D48 + mov r1, r0 + mov r0, r4 + bl strcmp + ldr r1, _02213B84 ; =ov00_0221B9DC + ldr r1, [r1] + ldr r1, [r1, #0x49c] + cmp r1, #0 + rsbeq r0, r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02213B84: .word ov00_0221B9DC +_02213B88: .word ov00_0221A5B8 + arm_func_end ov00_02213B24 + + arm_func_start ov00_02213B8C +ov00_02213B8C: ; 0x02213B8C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _02213BEC ; =ov00_0221B9DC + mov r5, r1 + ldr r1, [r2] + ldr r0, [r0] + ldr r1, [r1, #0x498] + ldr r2, _02213BF0 ; =ov00_0221A5B8 + bl ov00_02212D48 + ldr r1, _02213BEC ; =ov00_0221B9DC + mov r4, r0 + ldr r1, [r1] + ldr r0, [r5] + ldr r1, [r1, #0x498] + ldr r2, _02213BF0 ; =ov00_0221A5B8 + bl ov00_02212D48 + mov r1, r0 + mov r0, r4 + bl strnicmp + ldr r1, _02213BEC ; =ov00_0221B9DC + ldr r1, [r1] + ldr r1, [r1, #0x49c] + cmp r1, #0 + rsbeq r0, r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02213BEC: .word ov00_0221B9DC +_02213BF0: .word ov00_0221A5B8 + arm_func_end ov00_02213B8C + + arm_func_start ov00_02213BF4 +ov00_02213BF4: ; 0x02213BF4 + cmp r3, #3 + addls pc, pc, r3, lsl #2 + b _02213C30 +_02213C00: ; jump table + b _02213C10 ; case 0 + b _02213C18 ; case 1 + b _02213C20 ; case 2 + b _02213C28 ; case 3 +_02213C10: + ldr r3, _02213C54 ; =ov00_022139F0 + b _02213C34 +_02213C18: + ldr r3, _02213C58 ; =ov00_02213A4C + b _02213C34 +_02213C20: + ldr r3, _02213C5C ; =ov00_02213B24 + b _02213C34 +_02213C28: + ldr r3, _02213C60 ; =ov00_02213B8C + b _02213C34 +_02213C30: + ldr r3, _02213C60 ; =ov00_02213B8C +_02213C34: + str r2, [r0, #0x498] + str r1, [r0, #0x49c] + ldr r2, _02213C64 ; =ov00_0221B9DC + ldr ip, _02213C68 ; =ov00_021FEA20 + str r0, [r2] + mov r1, r3 + ldr r0, [r0, #4] + bx ip + .balign 4, 0 +_02213C54: .word ov00_022139F0 +_02213C58: .word ov00_02213A4C +_02213C5C: .word ov00_02213B24 +_02213C60: .word ov00_02213B8C +_02213C64: .word ov00_0221B9DC +_02213C68: .word ov00_021FEA20 + arm_func_end ov00_02213BF4 + + arm_func_start ov00_02213C6C +ov00_02213C6C: ; 0x02213C6C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #4] + add r1, sp, #0xc + bl ov00_021FE754 + ldr r2, [sp, #0xc] + ldr r3, [r4, #0x494] + ldr ip, [r4, #0x488] + mov r0, r4 + mov r1, #0 + blx ip + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_02213C6C + + arm_func_start ov00_02213CA8 +ov00_02213CA8: ; 0x02213CA8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r0, [r7, #4] + mov r6, r1 + bl ArrayLength + mov r4, r0 + cmp r4, #0 + mov r5, #0 + ble _02213CF4 +_02213CCC: + ldr r0, [r7, #4] + mov r1, r5 + bl ov00_021FE6EC + ldr r0, [r0] + cmp r6, r0 + moveq r0, r5 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r5, r5, #1 + cmp r5, r4 + blt _02213CCC +_02213CF4: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov00_02213CA8 + + arm_func_start ov00_02213CFC +ov00_02213CFC: ; 0x02213CFC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r0, [sb, #4] + mov r8, r1 + mov r7, r2 + bl ArrayLength + mov r4, r0 + cmp r4, #0 + mov r6, #0 + ble _02213D64 +_02213D24: + ldr r0, [sb, #4] + mov r1, r6 + bl ov00_021FE6EC + ldr r5, [r0] + mov r0, r5 + bl ov00_02212E78 + cmp r8, r0 + bne _02213D58 + mov r0, r5 + bl ov00_02212EA4 + cmp r7, r0 + moveq r0, r6 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02213D58: + add r6, r6, #1 + cmp r6, r4 + blt _02213D24 +_02213D64: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_02213CFC + + arm_func_start ov00_02213D6C +ov00_02213D6C: ; 0x02213D6C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr r1, [r5, #0x5d0] + mov r0, r4 + cmp r1, #0 + bne _02213D94 + mov r1, #0 + bl ov00_02212EF0 + b _02213D98 +_02213D94: + bl ov00_02212EF0 +_02213D98: + str r4, [r5, #0x5d0] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02213D6C + + arm_func_start ov00_02213DA0 +ov00_02213DA0: ; 0x02213DA0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6, #4] + mov r5, r1 + bl ov00_021FE6EC + ldr r4, [r0] + ldr r3, [r6, #0x494] + ldr ip, [r6, #0x488] + mov r0, r6 + mov r2, r4 + mov r1, #2 + blx ip + ldr r0, [r6, #4] + mov r1, r5 + bl ov00_021FE968 + mov r0, r6 + mov r1, r4 + bl ov00_02213D6C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02213DA0 + + arm_func_start ov00_02213DEC +ov00_02213DEC: ; 0x02213DEC + ldr ip, _02213DF8 ; =ArrayLength + ldr r0, [r0, #4] + bx ip + .balign 4, 0 +_02213DF8: .word ArrayLength + arm_func_end ov00_02213DEC + + arm_func_start ov00_02213DFC +ov00_02213DFC: ; 0x02213DFC + stmdb sp!, {r3, lr} + ldr r0, [r0, #4] + bl ov00_021FE6EC + ldr r0, [r0] + ldmia sp!, {r3, pc} + arm_func_end ov00_02213DFC + + arm_func_start ov00_02213E10 +ov00_02213E10: ; 0x02213E10 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + ldr r5, [r6, #0x5d0] + cmp r5, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + str r5, [sp] + beq _02213E58 + add r4, sp, #0 +_02213E38: + mov r0, r5 + bl ov00_02212EF8 + mov r5, r0 + mov r0, r4 + bl ov00_02212CAC + str r5, [sp] + cmp r5, #0 + bne _02213E38 +_02213E58: + mov r0, #0 + str r0, [r6, #0x5d0] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov00_02213E10 + + arm_func_start ov00_02213E68 +ov00_02213E68: ; 0x02213E68 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6, #4] + bl ArrayLength + mov r5, r0 + cmp r5, #0 + mov r4, #0 + ble _02213EAC +_02213E88: + ldr r0, [r6, #4] + mov r1, r4 + bl ov00_021FE6EC + ldr r1, [r0] + mov r0, r6 + bl ov00_02213D6C + add r4, r4, #1 + cmp r4, r5 + blt _02213E88 +_02213EAC: + ldr r0, [r6, #4] + bl ov00_021FEC3C + mov r0, r6 + bl ov00_02213E10 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02213E68 + + arm_func_start ov00_02213EC0 +ov00_02213EC0: ; 0x02213EC0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #4 + mov r1, #0x64 + mov r2, #0 + bl ov00_021FE5B4 + str r0, [r4, #4] + mov r0, #0 + str r0, [r4, #0x5d0] + ldmia sp!, {r4, pc} + arm_func_end ov00_02213EC0 + + arm_func_start ov00_02213EE8 +ov00_02213EE8: ; 0x02213EE8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r4, r1 + mov r5, r0 + str r4, [sp] + bl ov00_02212C08 + add r1, sp, #0 + bl ov00_021FF0C0 + cmp r0, #0 + beq _02213F28 + ldr r1, [r0, #4] + add sp, sp, #8 + add r1, r1, #1 + str r1, [r0, #4] + ldr r0, [r0] + ldmia sp!, {r3, r4, r5, pc} +_02213F28: + mov r0, r4 + bl ov00_021FF3D4 + str r0, [sp] + mov r1, #1 + mov r0, r5 + str r1, [sp, #4] + bl ov00_02212C08 + add r1, sp, #0 + bl ov00_021FEF74 + ldr r0, [sp] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02213EE8 + + arm_func_start ov00_02213F58 +ov00_02213F58: ; 0x02213F58 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + str r1, [sp] + bl ov00_02212C08 + add r1, sp, #0 + bl ov00_021FF0C0 + movs r4, r0 + bne _02213F90 + ldr r0, _02213FC8 ; =ov00_0221A5BC + ldr r1, _02213FCC ; =ov00_0221A5C8 + ldr r2, _02213FD0 ; =ov00_0221A530 + mov r3, #0xf4 + bl __msl_assertion_failed +_02213F90: + cmp r4, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + subs r0, r0, #1 + addne sp, sp, #8 + str r0, [r4, #4] + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl ov00_02212C08 + add r1, sp, #0 + bl ov00_021FF01C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02213FC8: .word ov00_0221A5BC +_02213FCC: .word ov00_0221A5C8 +_02213FD0: .word ov00_0221A530 + arm_func_end ov00_02213F58 + + arm_func_start ov00_02213FD4 +ov00_02213FD4: ; 0x02213FD4 + cmp r1, #0 + mov r3, #0 + ble _02213FFC +_02213FE0: + ldrsb r2, [r0, r3] + cmp r2, #0 + addeq r0, r3, #1 + bxeq lr + add r3, r3, #1 + cmp r3, r1 + blt _02213FE0 +_02213FFC: + mvn r0, #0 + bx lr + arm_func_end ov00_02213FD4 + + arm_func_start ov00_02214004 +ov00_02214004: ; 0x02214004 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _02214030 + ldr r0, _02214114 ; =ov00_0221A5D8 + ldr r1, _02214118 ; =ov00_0221A5C8 + ldr r2, _0221411C ; =ov00_0221A560 + mov r3, #0x11c + bl __msl_assertion_failed +_02214030: + ldr r0, [sp, #0x1c] + cmp r0, #0 + bne _0221404C + ldr r0, _02214120 ; =ov00_0221B0D0 + ldr r0, [r0] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_0221404C: + mov r1, #1 + mov r0, r7 + str r1, [r7] + bl ov00_02213EC0 + mov r0, r7 + bl ov00_02212C08 + mov r1, r6 + add r0, r7, #0xc + bl strcpy + mov r1, r5 + add r0, r7, #0x30 + bl strcpy + mov r1, r4 + add r0, r7, #0x54 + bl strcpy + ldr r1, [sp, #0x20] + mov r0, #0 + str r1, [r7, #0x488] + str r0, [r7, #0x48c] + cmp r1, #0 + bne _022140B4 + ldr r0, _02214124 ; =ov00_0221A5E8 + ldr r1, _02214118 ; =ov00_0221A5C8 + ldr r2, _0221411C ; =ov00_0221A560 + ldr r3, _02214128 ; =0x00000132 + bl __msl_assertion_failed +_022140B4: + ldr r0, [sp, #0x24] + ldr r1, _0221412C ; =ov00_0221A5B8 + str r0, [r7, #0x494] + mov r3, #0 + str r1, [r7, #0x498] + str r3, [r7, #0x4a0] + sub r0, r3, #1 + str r0, [r7, #0x4b0] + str r3, [r7, #0x7c] + str r3, [r7, #0x80] + str r3, [r7, #8] + str r0, [r7, #0x484] + str r3, [r7, #0x480] + ldr r2, [sp, #0x18] + str r3, [r7, #0x4a4] + mov r0, r7 + str r2, [r7, #0x4b8] + bl ov00_0221505C + mov r0, #0 + str r0, [r7, #0x5cc] + bl ov00_021FF368 + bl srand + bl ov00_021FF3CC + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02214114: .word ov00_0221A5D8 +_02214118: .word ov00_0221A5C8 +_0221411C: .word ov00_0221A560 +_02214120: .word ov00_0221B0D0 +_02214124: .word ov00_0221A5E8 +_02214128: .word 0x00000132 +_0221412C: .word ov00_0221A5B8 + arm_func_end ov00_02214004 + + arm_func_start ov00_02214130 +ov00_02214130: ; 0x02214130 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldr r5, [r4, #0x80] + cmp r5, #0 + ble _022141BC + ldr r0, _022141E4 ; =ov00_0221A52C + ldr r6, [r0] + mov r0, r6 + bl strlen + cmp r5, r0 + bls _022141BC + ldr r0, _022141E4 ; =ov00_0221A52C + ldr r5, [r4, #0x7c] + ldr r7, [r0] + mov r0, r7 + bl strlen + mov r2, r0 + mov r0, r5 + mov r1, r7 + bl strncmp + cmp r0, #0 + bne _022141BC + mov r0, r6 + bl strlen + mov r1, r0 + mov r0, r4 + add r1, r5, r1 + bl ov00_0221505C + ldr r0, _022141E8 ; =ov00_0221B9D4 + ldr r3, [r4, #0x494] + ldr r2, [r0] + ldr ip, [r4, #0x488] + mov r0, r4 + mov r1, #5 + blx ip +_022141BC: + ldr r0, _022141E8 ; =ov00_0221B9D4 + ldr r3, [r4, #0x494] + ldr r2, [r0] + ldr ip, [r4, #0x488] + mov r0, r4 + mov r1, #4 + blx ip + mov r0, r4 + bl ov00_02214908 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022141E4: .word ov00_0221A52C +_022141E8: .word ov00_0221B9D4 + arm_func_end ov00_02214130 + + arm_func_start ov00_022141EC +ov00_022141EC: ; 0x022141EC + stmdb sp!, {r3, lr} + ldrsb lr, [r0] + mov ip, #0 + cmp lr, #0 + beq _0221422C + ldr r3, _0221423C ; =_0210E404 + ldr r2, _02214240 ; =0x9CCF9319 +_02214208: + cmp lr, #0 + blt _0221421C + cmp lr, #0x80 + bge _0221421C + ldrb lr, [r3, lr] +_0221421C: + mla ip, r2, ip, lr + ldrsb lr, [r0, #1]! + cmp lr, #0 + bne _02214208 +_0221422C: + mov r0, ip + bl _u32_div_f + mov r0, r1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221423C: .word _0210E404 +_02214240: .word 0x9CCF9319 + arm_func_end ov00_022141EC + + arm_func_start ov00_02214244 +ov00_02214244: ; 0x02214244 + stmdb sp!, {r4, lr} + sub sp, sp, #0x88 + mov r4, r0 + add r0, r4, #0xc + mov r1, #0x14 + bl ov00_022141EC + ldr r1, _02214364 ; =ov00_0221B9DC + mov r3, r0 + ldr r1, [r1, #4] + add r0, sp, #8 + cmp r1, #0 + beq _0221427C + bl strcpy + b _02214288 +_0221427C: + ldr r1, _02214368 ; =ov00_0221A5FC + add r2, r4, #0xc + bl sprintf +_02214288: + ldr r1, _0221436C ; =0x0000EE70 + mov r2, #2 + add r0, sp, #8 + strb r2, [sp, #1] + strh r1, [sp, #2] + bl ov00_021FFA44 + mvn r1, #0 + str r0, [sp, #4] + cmp r0, r1 + bne _022142F4 + add r0, sp, #8 + bl SOC_GetHostByName + cmp r0, #0 + addeq sp, sp, #0x88 + moveq r0, #2 + ldmeqia sp!, {r4, pc} + ldr r0, [r0, #0xc] + add r3, sp, #4 + ldr r2, [r0] + ldrb r1, [r2] + ldrb r0, [r2, #1] + strb r1, [r3] + strb r0, [r3, #1] + ldrb r1, [r2, #2] + ldrb r0, [r2, #3] + strb r1, [r3, #2] + strb r0, [r3, #3] +_022142F4: + ldr r0, [r4, #0x4b0] + mvn r1, #0 + cmp r0, r1 + bne _0221432C + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + cmp r0, r1 + str r0, [r4, #0x4b0] + addeq sp, sp, #0x88 + moveq r0, #1 + ldmeqia sp!, {r4, pc} +_0221432C: + add r1, sp, #0 + mov r2, #8 + bl ov00_021FF8A0 + cmp r0, #0 + addeq sp, sp, #0x88 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0x4b0] + bl ov00_021FF818 + mvn r0, #0 + str r0, [r4, #0x4b0] + mov r0, #3 + add sp, sp, #0x88 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02214364: .word ov00_0221B9DC +_02214368: .word ov00_0221A5FC +_0221436C: .word 0x0000EE70 + arm_func_end ov00_02214244 + + arm_func_start ov00_02214370 +ov00_02214370: ; 0x02214370 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r1 + ldreq r7, _022143BC ; =ov00_0221A5B8 + mov r4, r0 + mov r0, r7 + mov r6, r2 + bl strlen + add r5, r0, #1 + ldr r0, [r4] + mov r1, r7 + mov r2, r5 + bl memcpy + ldr r0, [r6] + add r0, r0, r5 + str r0, [r6] + ldr r0, [r4] + add r0, r0, r5 + str r0, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022143BC: .word ov00_0221A5B8 + arm_func_end ov00_02214370 + + arm_func_start ov00_022143C0 +ov00_022143C0: ; 0x022143C0 + ldr r3, [r0] + strb r1, [r3] + ldr r1, [r2] + add r1, r1, #1 + str r1, [r2] + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + bx lr + arm_func_end ov00_022143C0 + + arm_func_start ov00_022143E4 +ov00_022143E4: ; 0x022143E4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add ip, sp, #0xc + ldrb r3, [ip] + ldrb r1, [ip, #1] + ldr lr, [r0] + strb r3, [lr] + strb r1, [lr, #1] + ldrb r3, [ip, #2] + ldrb r1, [ip, #3] + strb r3, [lr, #2] + strb r1, [lr, #3] + ldr r1, [r2] + add r1, r1, #4 + str r1, [r2] + ldr r1, [r0] + add r1, r1, #4 + str r1, [r0] + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_022143E4 + + arm_func_start ov00_02214438 +ov00_02214438: ; 0x02214438 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6] + mov r4, r3 + mov r5, r2 + bl memcpy + ldr r0, [r4] + add r0, r0, r5 + str r0, [r4] + ldr r0, [r6] + add r0, r0, r5 + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02214438 + + arm_func_start ov00_0221446C +ov00_0221446C: ; 0x0221446C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl rand + ldr r5, _02214554 ; =0x2C0B02C1 + mov r8, #0 + smull r2, r4, r5, r0 + mov r1, r0, lsr #0x1f + add r4, r1, r4, asr #4 + mov r3, #0x5d + smull r1, r2, r3, r4 + sub r4, r0, r1 + add r0, r4, #0x21 + mov r7, #1 + strb r0, [sl, #0x74] + mov fp, r8 + mov r6, r7 + mov r4, r3 +_022144B0: + add sb, sl, r7 + ldrsb r3, [sb, #0x73] + ldrsb r0, [sl, #0x74] + cmp r3, r0 + eor r3, r7, r3 + movlt r1, r6 + and r3, r3, #1 + movge r1, fp + cmp r0, #0x4f + movlt r2, #1 + and r0, r0, #1 + eor r3, r8, r3 + movge r2, #0 + eor r0, r0, r3 + eor r0, r0, r2 + eor r8, r0, r1 + bl rand + smull r2, r3, r5, r0 + mov r1, r0, lsr #0x1f + add r3, r1, r3, asr #4 + smull r1, r2, r4, r3 + sub r3, r0, r1 + add r0, r3, #0x21 + cmp r8, #0 + strb r0, [sb, #0x74] + beq _02214524 + ldrsb r0, [sb, #0x74] + tst r0, #1 + beq _02214538 +_02214524: + cmp r8, #0 + ldreqsb r0, [sb, #0x74] + andeq r0, r0, #1 + cmpeq r0, #1 + bne _02214544 +_02214538: + ldrsb r0, [sb, #0x74] + add r0, r0, #1 + strb r0, [sb, #0x74] +_02214544: + add r7, r7, #1 + cmp r7, #8 + blt _022144B0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02214554: .word 0x2C0B02C1 + arm_func_end ov00_0221446C + + arm_func_start ov00_02214558 +ov00_02214558: ; 0x02214558 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r7, #1 + mov fp, #2 + mov r5, #0 +_02214574: + ldr r0, [sl, #0x4b0] + mov r1, sb + mov r2, r8 + mov r3, r5 + sub r7, r7, #1 + bl ov00_021FF970 + mov r6, r0 + cmp r6, #0 + bgt _022145E0 + cmp r7, #0 + blt _022145E0 + mov r0, sl + bl ov00_02214908 + mov r1, #0 + mov r2, r1 + mov r0, sl + mov r3, fp + str r2, [sp] + bl ov00_022145F0 + movs r4, r0 + beq _022145D8 + mov r0, sl + bl ov00_02214130 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022145D8: + cmp r7, #0 + bge _02214574 +_022145E0: + cmp r6, #0 + movle r0, #3 + movgt r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02214558 + + arm_func_start ov00_022145F0 +ov00_022145F0: ; 0x022145F0 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x30c + mov r5, r0 + ldr r0, [r5] + mov r7, r1 + mov r6, r2 + mov r4, r3 + cmp r0, #1 + beq _02214628 + ldr r0, _0221484C ; =ov00_0221A618 + ldr r1, _02214850 ; =ov00_0221A5C8 + ldr r2, _02214854 ; =ov00_0221A59C + ldr r3, _02214858 ; =0x0000020A + bl __msl_assertion_failed +_02214628: + cmp r7, #0 + ldreq r7, _0221485C ; =ov00_0221A5B8 + cmp r6, #0 + ldreq r6, _0221485C ; =ov00_0221A5B8 + mov r0, r7 + bl strlen + cmp r0, #0x100 + addhi sp, sp, #0x30c + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, r7, pc} + mov r0, r6 + bl strlen + cmp r0, #0x100 + addhi sp, sp, #0x30c + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, r7, pc} + mov r0, r5 + bl ov00_02214244 + cmp r0, #0 + addne sp, sp, #0x30c + ldmneia sp!, {r4, r5, r6, r7, pc} + mov r0, r5 + str r4, [r5, #0x5c4] + bl ov00_0221446C + add r3, sp, #0xe + mov ip, #2 + add r0, sp, #4 + add r2, sp, #8 + mov r1, #0 + str ip, [sp, #8] + str r3, [sp, #4] + bl ov00_022143C0 + add r0, sp, #4 + add r2, sp, #8 + mov r1, #1 + bl ov00_022143C0 + add r0, sp, #4 + mov r1, #3 + add r2, sp, #8 + bl ov00_022143C0 + ldr r1, [r5, #0x4b8] + add r0, sp, #4 + add r2, sp, #8 + bl ov00_022143E4 + add r0, sp, #4 + add r1, r5, #0xc + add r2, sp, #8 + bl ov00_02214370 + add r0, sp, #4 + add r1, r5, #0x30 + add r2, sp, #8 + bl ov00_02214370 + add r0, sp, #4 + add r1, r5, #0x74 + mov r2, #8 + add r3, sp, #8 + bl ov00_02214438 + mov r1, r6 + add r0, sp, #4 + add r2, sp, #8 + bl ov00_02214370 + mov r1, r7 + add r0, sp, #4 + add r2, sp, #8 + bl ov00_02214370 + mov r1, r4, lsl #0x18 + and ip, r1, #0xff000000 + mov r1, r4, lsl #8 + and r3, r1, #0xff0000 + mov r1, r4, lsr #0x18 + and r2, r1, #0xff + mov r1, r4, lsr #8 + and r1, r1, #0xff00 + orr r1, r2, r1 + orr r1, r3, r1 + add r0, sp, #4 + orr r1, ip, r1 + add r2, sp, #8 + bl ov00_022143E4 + ldr r0, [r5, #0x5c4] + tst r0, #8 + beq _02214780 + ldr r1, [r5, #0x4a4] + add r0, sp, #4 + add r2, sp, #8 + bl ov00_022143E4 +_02214780: + ldr r0, [r5, #0x5c4] + tst r0, #0x80 + beq _0221479C + ldr r1, [sp, #0x320] + add r0, sp, #4 + add r2, sp, #8 + bl ov00_022143E4 +_0221479C: + ldr r2, [sp, #8] + add r4, sp, #0 + mov r0, r2, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp] + ldrb r3, [r4] + add r1, sp, #0xc + ldrb r0, [r4, #1] + strb r3, [r1] + mov r3, #0 + strb r0, [r1, #1] + ldr r0, [r5, #0x4b0] + bl ov00_021FF970 + cmp r0, #0 + bgt _02214800 + mov r0, r5 + bl ov00_02214908 + add sp, sp, #0x30c + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, pc} +_02214800: + mov r0, #3 + str r0, [r5] + mov r0, #0 + str r0, [r5, #0x5c8] + ldr r0, [r5, #0x7c] + cmp r0, #0 + bne _02214840 + mov r0, #0x1000 + bl ov00_021EC3A8 + cmp r0, #0 + str r0, [r5, #0x7c] + addeq sp, sp, #0x30c + moveq r0, #5 + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r0, #0 + str r0, [r5, #0x80] +_02214840: + mov r0, #0 + add sp, sp, #0x30c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0221484C: .word ov00_0221A618 +_02214850: .word ov00_0221A5C8 +_02214854: .word ov00_0221A59C +_02214858: .word 0x0000020A +_0221485C: .word ov00_0221A5B8 + arm_func_end ov00_022145F0 + + arm_func_start ov00_02214860 +ov00_02214860: ; 0x02214860 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0x480] + mov r4, #0 + cmp r0, #0 + ble _02214898 +_02214878: + add r0, r5, r4, lsl #2 + ldr r1, [r0, #0x84] + mov r0, r5 + bl ov00_02213F58 + ldr r0, [r5, #0x480] + add r4, r4, #1 + cmp r4, r0 + blt _02214878 +_02214898: + mov r0, #0 + str r0, [r5, #0x480] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02214860 + + arm_func_start ov00_022148A4 +ov00_022148A4: ; 0x022148A4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #8] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r4, #0 + bl ArrayLength + cmp r0, #0 + ble _022148F4 +_022148C8: + ldr r0, [r5, #8] + mov r1, r4 + bl ov00_021FE6EC + ldr r1, [r0] + mov r0, r5 + bl ov00_02213F58 + ldr r0, [r5, #8] + add r4, r4, #1 + bl ArrayLength + cmp r4, r0 + blt _022148C8 +_022148F4: + ldr r0, [r5, #8] + bl ov00_021FE678 + mov r0, #0 + str r0, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_022148A4 + + arm_func_start ov00_02214908 +ov00_02214908: ; 0x02214908 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x7c] + cmp r0, #0 + beq _02214920 + bl ov00_021EC3D8 +_02214920: + mov r1, #0 + str r1, [r4, #0x7c] + str r1, [r4, #0x80] + ldr r0, [r4, #0x4b0] + sub r1, r1, #1 + cmp r0, r1 + beq _02214940 + bl ov00_021FF818 +_02214940: + mvn r1, #0 + mov r0, r4 + str r1, [r4, #0x4b0] + mov r1, #1 + str r1, [r4] + bl ov00_022148A4 + mvn r1, #0 + mov r0, r4 + str r1, [r4, #0x484] + bl ov00_02214860 + ldmia sp!, {r4, pc} + arm_func_end ov00_02214908 + + arm_func_start ov00_0221496C +ov00_0221496C: ; 0x0221496C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_02214908 + mov r0, r4 + bl ov00_02213E68 + mov r0, r4 + bl ov00_02212C6C + ldr r0, [r4, #4] + cmp r0, #0 + beq _02214998 + bl ov00_021FE678 +_02214998: + mov r0, #0 + str r0, [r4, #4] + ldmia sp!, {r4, pc} + arm_func_end ov00_0221496C + + arm_func_start ov00_022149A4 +ov00_022149A4: ; 0x022149A4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r7, r2 + add r0, sb, #0x54 + mov r8, r1 + bl strlen + mov r5, r0 + cmp r7, #0 + add r6, sb, #0x54 + mov r4, #0 + ble _02214A2C +_022149D0: + mov r0, r4 + mov r1, r5 + bl _s32_div_f + ldrsb r1, [r6, r1] + mov r2, r4, lsr #0x1f + rsb r0, r2, r4, lsl #29 + mul r3, r4, r1 + mov r1, r3, lsr #0x1f + add r2, r2, r0, ror #29 + rsb r0, r1, r3, lsl #29 + add r2, sb, r2 + add r3, r1, r0, ror #29 + ldrsb r0, [r8, r4] + ldrsb r1, [r2, #0x74] + add r2, sb, r3 + add r4, r4, #1 + eor r0, r1, r0 + ldrsb r1, [r2, #0x74] + mov r0, r0, lsl #0x18 + cmp r4, r7 + eor r0, r1, r0, asr #24 + strb r0, [r2, #0x74] + blt _022149D0 +_02214A2C: + add r0, sb, #0xbc + add r0, r0, #0x400 + add r1, sb, #0x74 + mov r2, #8 + bl ov00_02212124 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov00_022149A4 + + arm_func_start ov00_02214A44 +ov00_02214A44: ; 0x02214A44 + mov r1, #5 + tst r0, #2 + addne r1, r1, #4 + tst r0, #8 + addne r1, r1, #4 + tst r0, #0x10 + addne r1, r1, #2 + tst r0, #0x20 + addne r1, r1, #2 + mov r0, r1 + bx lr + arm_func_end ov00_02214A44 + + arm_func_start ov00_02214A70 +ov00_02214A70: ; 0x02214A70 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + b _02214AC0 +_02214A80: + mov r0, r5 + mov r1, r4 + bl ov00_02213FD4 + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + sub r4, r4, r0 + add r5, r5, r0 + mov r0, r5 + mov r1, r4 + bl ov00_02213FD4 + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + add r5, r5, r0 + sub r4, r4, r0 +_02214AC0: + cmp r4, #0 + ble _02214AD4 + ldrsb r0, [r5] + cmp r0, #0 + bne _02214A80 +_02214AD4: + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsb r0, [r5] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov00_02214A70 + + arm_func_start ov00_02214AF4 +ov00_02214AF4: ; 0x02214AF4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r0 + ldr r0, [r8, #8] + mov r7, r1 + mov r6, r2 + bl ArrayLength + mov r4, r0 + cmp r4, #0 + mov r5, #0 + ble _02214BD8 + mvn sb, #0 +_02214B20: + ldr r0, [r8, #8] + mov r1, r5 + bl ov00_021FE6EC + ldr r0, [r0, #4] + cmp r0, #0 + beq _02214B64 + cmp r0, #1 + beq _02214B4C + cmp r0, #2 + beq _02214B58 + b _02214BA4 +_02214B4C: + add r7, r7, #1 + sub r6, r6, #1 + b _02214BC0 +_02214B58: + add r7, r7, #2 + sub r6, r6, #2 + b _02214BC0 +_02214B64: + cmp r6, #1 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrb r0, [r7], #1 + sub r6, r6, #1 + cmp r0, #0xff + bne _02214BC0 + mov r0, r7 + mov r1, r6 + bl ov00_02213FD4 + cmp r0, sb + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r7, r7, r0 + sub r6, r6, r0 + b _02214BC0 +_02214BA4: + ldr r0, _02214BE0 ; =ov00_0221A638 + ldr r1, _02214BE4 ; =ov00_0221A5C8 + ldr r2, _02214BE8 ; =ov00_0221A550 + ldr r3, _02214BEC ; =0x00000317 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02214BC0: + cmp r6, #0 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r5, r5, #1 + cmp r5, r4 + blt _02214B20 +_02214BD8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02214BE0: .word ov00_0221A638 +_02214BE4: .word ov00_0221A5C8 +_02214BE8: .word ov00_0221A550 +_02214BEC: .word 0x00000317 + arm_func_end ov00_02214AF4 + + arm_func_start ov00_02214BF0 +ov00_02214BF0: ; 0x02214BF0 + stmdb sp!, {r4, lr} + cmp r2, #5 + ldmltia sp!, {r4, pc} + ldrb r4, [r1] + ldrb lr, [r1, #1] + ldrb ip, [r1, #2] + tst r4, #0x10 + strb lr, [r3] + strb ip, [r3, #1] + ldrb lr, [r1, #3] + ldrb ip, [r1, #4] + strb lr, [r3, #2] + strb ip, [r3, #3] + beq _02214C4C + sub r0, r2, #5 + cmp r0, #2 + ldmltia sp!, {r4, pc} + ldrb r2, [r1, #5] + ldrb r0, [r1, #6] + ldr r1, [sp, #8] + strb r2, [r1] + strb r0, [r1, #1] + ldmia sp!, {r4, pc} +_02214C4C: + add r0, r0, #0x400 + ldrh r1, [r0, #0xa8] + ldr r0, [sp, #8] + strh r1, [r0] + ldmia sp!, {r4, pc} + arm_func_end ov00_02214BF0 + + arm_func_start ov00_02214C60 +ov00_02214C60: ; 0x02214C60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + mov r8, r2 + ldrb r2, [r8], #5 + mov sb, r1 + mov sl, r0 + mov r7, r3 + str r2, [sp] + mov r0, sb + mov r1, r2 + str r7, [sp, #4] + ldr r6, [sp, #0x38] + bl ov00_02213370 + ldr r0, [sp] + sub r7, r7, #5 + tst r0, #0x10 + ldr r0, [sp] + addne r8, r8, #2 + subne r7, r7, #2 + tst r0, #2 + moveq r0, #0 + streq r0, [sp, #0xc] + beq _02214CE8 + ldrb r1, [r8] + ldrb r0, [r8, #1] + add r2, sp, #0xc + sub r7, r7, #4 + strb r1, [r2] + strb r0, [r2, #1] + ldrb r1, [r8, #2] + ldrb r0, [r8, #3] + add r8, r8, #4 + strb r1, [r2, #2] + strb r0, [r2, #3] +_02214CE8: + ldr r0, [sp] + tst r0, #0x20 + addeq r0, sl, #0x400 + ldreqh r0, [r0, #0xa8] + streqh r0, [sp, #8] + beq _02214D1C + ldrb r1, [r8] + ldrb r0, [r8, #1] + add r2, sp, #8 + add r8, r8, #2 + strb r1, [r2] + strb r0, [r2, #1] + sub r7, r7, #2 +_02214D1C: + ldrh r2, [sp, #8] + ldr r1, [sp, #0xc] + mov r0, sb + bl ov00_02213378 + ldr r0, [sp] + tst r0, #8 + beq _02214D70 + ldrb r2, [r8] + ldrb r1, [r8, #1] + add r3, sp, #0xc + mov r0, sb + strb r2, [r3] + strb r1, [r3, #1] + ldrb r2, [r8, #2] + ldrb r1, [r8, #3] + add r8, r8, #4 + sub r7, r7, #4 + strb r2, [r3, #2] + strb r1, [r3, #3] + ldr r1, [sp, #0xc] + bl ov00_02213384 +_02214D70: + ldr r0, [sp] + tst r0, #0x40 + beq _02214EA0 + ldr r0, [sl, #8] + bl ArrayLength + mov r4, r0 + cmp r4, #0 + mov r5, #0 + ble _02214E88 + add fp, sp, #0xa +_02214D98: + ldr r0, [sl, #8] + mov r1, r5 + bl ov00_021FE6EC + mov r1, r0 + ldr r0, [r1, #4] + cmp r0, #0 + beq _02214E28 + cmp r0, #1 + beq _02214DC8 + cmp r0, #2 + beq _02214DE0 + b _02214E7C +_02214DC8: + ldrb r2, [r8], #1 + ldr r1, [r1] + mov r0, sb + bl ov00_02212D10 + sub r7, r7, #1 + b _02214E7C +_02214DE0: + ldrb r3, [r8] + ldrb r2, [r8, #1] + mov r0, sb + strb r3, [fp] + strb r2, [fp, #1] + ldrh r3, [sp, #0xa] + ldr r1, [r1] + mov r2, r3, asr #8 + and r2, r2, #0xff + mov r3, r3, lsl #8 + and r3, r3, #0xff00 + orr r2, r2, r3 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + bl ov00_02212D10 + add r8, r8, #2 + sub r7, r7, #2 + b _02214E7C +_02214E28: + cmp r6, #0 + ldrneb r0, [r8], #1 + subne r7, r7, #1 + moveq r0, #0xff + cmp r0, #0xff + bne _02214E68 + ldr r1, [r1] + mov r0, sb + mov r2, r8 + bl ov00_02212CD0 + mov r0, r8 + bl strlen + add r0, r0, #1 + add r8, r8, r0 + sub r7, r7, r0 + b _02214E7C +_02214E68: + add r0, sl, r0, lsl #2 + ldr r1, [r1] + ldr r2, [r0, #0x84] + mov r0, sb + bl ov00_02212CD0 +_02214E7C: + add r5, r5, #1 + cmp r5, r4 + blt _02214D98 +_02214E88: + mov r0, sb + bl ov00_02213394 + orr r1, r0, #1 + mov r0, sb + and r1, r1, #0xff + bl ov00_0221338C +_02214EA0: + ldr r0, [sp] + tst r0, #0x80 + beq _02214F1C + b _02214EEC +_02214EB0: + mov r0, r8 + mov r4, r8 + bl strlen + add r3, r0, #1 + add r8, r8, r3 + mov r0, sb + mov r1, r4 + mov r2, r8 + sub r7, r7, r3 + bl ov00_02212CD0 + mov r0, r8 + bl strlen + add r0, r0, #1 + add r8, r8, r0 + sub r7, r7, r0 +_02214EEC: + ldrsb r0, [r8] + cmp r0, #0 + beq _02214F00 + cmp r7, #0 + bgt _02214EB0 +_02214F00: + mov r0, sb + sub r7, r7, #1 + bl ov00_02213394 + orr r1, r0, #2 + mov r0, sb + and r1, r1, #0xff + bl ov00_0221338C +_02214F1C: + ldr r0, [sp, #4] + sub r0, r0, r7 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02214C60 + + arm_func_start ov00_02214F2C +ov00_02214F2C: ; 0x02214F2C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r4, r2 + cmp r4, #1 + mov r6, r0 + mov r5, r1 + addlt sp, sp, #0xc + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldrb r8, [r5] + mov r0, r8 + bl ov00_02214A44 + mov r7, r0 + cmp r4, r7 + addlt sp, sp, #0xc + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, pc} + tst r8, #0x40 + beq _02214F98 + mov r0, r6 + add r1, r5, r7 + sub r2, r4, r7 + bl ov00_02214AF4 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02214F98: + tst r8, #0x80 + beq _02214FBC + add r0, r5, r7 + sub r1, r4, r7 + bl ov00_02214A70 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02214FBC: + ldr r1, _02215058 ; =ov00_0221A63C + add r0, r5, #1 + mov r2, #4 + bl memcmp + cmp r0, #0 + addeq sp, sp, #0xc + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r7, sp, #4 + add r3, sp, #8 + mov r0, r6 + mov r1, r5 + mov r2, r4 + str r7, [sp] + bl ov00_02214BF0 + ldrh r2, [sp, #4] + ldr r1, [sp, #8] + mov r0, r6 + bl ov00_022132C4 + mov r7, r0 + bl ov00_0221339C + cmp r0, #0 + addne sp, sp, #0xc + mvnne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov ip, #1 + mov r0, r6 + mov r1, r7 + mov r2, r5 + mov r3, r4 + str ip, [sp] + bl ov00_02214C60 + mov r4, r0 + mov r0, r6 + mov r1, r7 + bl ov00_02213C6C + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02215058: .word ov00_0221A63C + arm_func_end ov00_02214F2C + + arm_func_start ov00_0221505C +ov00_0221505C: ; 0x0221505C + str r1, [r0, #0x4ac] + bx lr + arm_func_end ov00_0221505C + + arm_func_start ov00_02215064 +ov00_02215064: ; 0x02215064 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r7, r0 + ldr r1, [r7, #0x5c8] + ldr r5, [r7, #0x7c] + ldr r6, [r7, #0x80] + cmp r1, #4 + addls pc, pc, r1, lsl #2 + b _02215424 +_02215088: ; jump table + b _0221509C ; case 0 + b _022150FC ; case 1 + b _022151FC ; case 2 + b _022152E8 ; case 3 + b _02215394 ; case 4 +_0221509C: + cmp r6, #1 + blt _02215424 + ldrb r1, [r5] + eor r1, r1, #0xec + add r3, r1, #2 + cmp r6, r3 + blt _02215424 + sub r1, r3, #1 + ldrb r1, [r5, r1] + eor r2, r1, #0xea + add r4, r3, r2 + cmp r6, r4 + blt _02215424 + add r1, r5, r3 + bl ov00_022149A4 + add r5, r5, r4 + sub r6, r6, r4 + add r0, r7, #0xbc + mov r3, #1 + mov r1, r5 + mov r2, r6 + add r0, r0, #0x400 + str r3, [r7, #0x5c8] + bl ov00_022122B8 +_022150FC: + cmp r6, #6 + blt _02215424 + ldrb r3, [r5] + ldrb r1, [r5, #1] + ldr r2, _02215478 ; =ov00_0221B9D4 + mov r0, r7 + strb r3, [r7, #0x4a0] + strb r1, [r7, #0x4a1] + ldrb r4, [r5, #2] + ldrb r3, [r5, #3] + mov r1, #6 + strb r4, [r7, #0x4a2] + strb r3, [r7, #0x4a3] + ldr r2, [r2] + ldr r3, [r7, #0x494] + ldr r4, [r7, #0x488] + blx r4 + ldrb r3, [r5, #4] + ldrb r2, [r5, #5] + add r0, r7, #0x400 + ldr r1, _0221547C ; =0x0000FFFF + strb r3, [r7, #0x4a8] + strb r2, [r7, #0x4a9] + ldrh r0, [r0, #0xa8] + cmp r0, r1 + bne _022151B0 + add r0, r5, #6 + sub r1, r6, #6 + bl ov00_02213FD4 + mvn r1, #0 + cmp r0, r1 + beq _02215424 + mov r0, r7 + add r1, r5, #6 + bl ov00_0221505C + ldr r0, _02215478 ; =ov00_0221B9D4 + ldr r3, [r7, #0x494] + ldr r2, [r0] + ldr r4, [r7, #0x488] + mov r0, r7 + mov r1, #5 + blx r4 + ldr r0, [r7, #0x7c] + cmp r0, #0 + beq _02215424 +_022151B0: + ldr r0, [r7, #0x5c4] + add r5, r5, #6 + tst r0, #2 + sub r6, r6, #6 + bne _022151D8 + add r0, r7, #0x400 + ldrh r1, [r0, #0xa8] + ldr r0, _0221547C ; =0x0000FFFF + cmp r1, r0 + bne _022151EC +_022151D8: + mov r0, #5 + str r0, [r7, #0x5c8] + mov r0, #2 + str r0, [r7] + b _02215424 +_022151EC: + mov r0, #2 + str r0, [r7, #0x5c8] + sub r0, r0, #3 + str r0, [r7, #0x484] +_022151FC: + ldr r1, [r7, #0x484] + mvn r0, #0 + cmp r1, r0 + bne _02215244 + cmp r6, #1 + blt _02215424 + ldrb r1, [r5] + mov r0, #8 + mov r2, #0 + str r1, [r7, #0x484] + bl ov00_021FE5B4 + cmp r0, #0 + str r0, [r7, #8] + addeq sp, sp, #8 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r5, r5, #1 + sub r6, r6, #1 +_02215244: + ldr r0, [r7, #8] + bl ArrayLength + ldr r1, [r7, #0x484] + cmp r1, r0 + ble _022152C4 + add r8, sp, #0 + mvn r4, #0 +_02215260: + cmp r6, #2 + blt _022152C4 + add r0, r5, #1 + sub r1, r6, #1 + bl ov00_02213FD4 + mov sb, r0 + cmp sb, r4 + beq _022152C4 + ldrb r2, [r5] + mov r0, r7 + add r1, r5, #1 + str r2, [sp, #4] + bl ov00_02213EE8 + str r0, [sp] + ldr r0, [r7, #8] + mov r1, r8 + bl ov00_021FE754 + add r1, sb, #1 + ldr r0, [r7, #8] + add r5, r5, r1 + sub r6, r6, r1 + bl ArrayLength + ldr r1, [r7, #0x484] + cmp r1, r0 + bgt _02215260 +_022152C4: + ldr r0, [r7, #8] + bl ArrayLength + ldr r1, [r7, #0x484] + cmp r1, r0 + bgt _02215424 + mov r0, #3 + str r0, [r7, #0x5c8] + sub r0, r0, #4 + str r0, [r7, #0x484] +_022152E8: + ldr r1, [r7, #0x484] + mvn r0, #0 + cmp r1, r0 + bne _02215314 + cmp r6, #1 + blt _02215424 + ldrb r1, [r5], #1 + mov r0, #0 + sub r6, r6, #1 + str r1, [r7, #0x484] + str r0, [r7, #0x480] +_02215314: + ldr r1, [r7, #0x484] + ldr r0, [r7, #0x480] + cmp r1, r0 + ble _0221537C + mvn r8, #0 +_02215328: + mov r0, r5 + mov r1, r6 + bl ov00_02213FD4 + mov r4, r0 + cmp r4, r8 + beq _0221537C + mov r0, r7 + mov r1, r5 + bl ov00_02213EE8 + ldr r1, [r7, #0x480] + add r5, r5, r4 + mov r2, r1 + add r1, r1, #1 + str r1, [r7, #0x480] + add r1, r7, r2, lsl #2 + str r0, [r1, #0x84] + ldr r1, [r7, #0x484] + ldr r0, [r7, #0x480] + sub r6, r6, r4 + cmp r1, r0 + bgt _02215328 +_0221537C: + ldr r1, [r7, #0x484] + ldr r0, [r7, #0x480] + cmp r1, r0 + bgt _02215424 + mov r0, #4 + str r0, [r7, #0x5c8] +_02215394: + cmp r6, #5 + blt _02215424 + mvn r4, #0 + sub r8, r4, #1 + mov sb, #0 +_022153A8: + mov r0, r7 + mov r1, r5 + mov r2, r6 + bl ov00_02214F2C + cmp r0, r8 + addeq sp, sp, #8 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r0, r4 + bne _02215408 + mov r0, #5 + str r0, [r7, #0x5c8] + mov r0, #2 + str r0, [r7] + ldr r0, _02215478 ; =ov00_0221B9D4 + ldr r3, [r7, #0x494] + ldr r2, [r0] + ldr r4, [r7, #0x488] + mov r0, r7 + mov r1, #3 + sub r6, r6, #5 + add r5, r5, #5 + blx r4 + b _02215424 +_02215408: + ldr r1, [r7, #0x7c] + add r5, r5, r0 + cmp r1, #0 + sub r6, r6, r0 + moveq r0, sb + cmp r0, #0 + bne _022153A8 +_02215424: + cmp r6, #0 + bge _02215440 + ldr r0, _02215480 ; =ov00_0221A644 + ldr r1, _02215484 ; =ov00_0221A5C8 + ldr r2, _02215488 ; =ov00_0221A588 + ldr r3, _0221548C ; =0x000004AF + bl __msl_assertion_failed +_02215440: + ldr r0, [r7, #0x7c] + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r6, #0 + beq _02215468 + mov r1, r5 + mov r2, r6 + bl memmove +_02215468: + str r6, [r7, #0x80] + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02215478: .word ov00_0221B9D4 +_0221547C: .word 0x0000FFFF +_02215480: .word ov00_0221A644 +_02215484: .word ov00_0221A5C8 +_02215488: .word ov00_0221A588 +_0221548C: .word 0x000004AF + arm_func_end ov00_02215064 + + arm_func_start ov00_02215490 +ov00_02215490: ; 0x02215490 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + ldr r3, [sl, #8] + mov sb, r1 + mov r8, r2 + cmp r3, #0 + sub r8, r8, #1 + ldrb r7, [sb], #1 + beq _022154BC + bl ov00_022148A4 +_022154BC: + mov r1, r7 + mov r0, #8 + mov r2, #0 + bl ov00_021FE5B4 + cmp r0, #0 + str r0, [sl, #8] + addeq sp, sp, #8 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0 + mov r6, #0 + ble _02215560 + add fp, sp, #0 + mvn r4, #0 +_022154F4: + cmp r8, #2 + addlt sp, sp, #8 + movlt r0, #4 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sb, #1 + sub r1, r8, #1 + bl ov00_02213FD4 + mov r5, r0 + cmp r5, r4 + addeq sp, sp, #8 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r2, [sb] + mov r0, sl + add r1, sb, #1 + str r2, [sp, #4] + bl ov00_02213EE8 + str r0, [sp] + ldr r0, [sl, #8] + mov r1, fp + bl ov00_021FE754 + add r0, r5, #1 + add r6, r6, #1 + cmp r6, r7 + add sb, sb, r0 + sub r8, r8, r0 + blt _022154F4 +_02215560: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02215490 + + arm_func_start ov00_0221556C +ov00_0221556C: ; 0x0221556C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov r8, r2 + cmp r8, #2 + mov sl, r0 + mov sb, r1 + addlt sp, sp, #0x24 + movlt r0, #4 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [sb, #1] + sub r8, r8, #2 + mov fp, #0 + str r0, [sp, #0xc] + ldrb r0, [sb], #2 + str r0, [sp, #0x14] + ldr r0, [sp, #0xc] + cmp r0, #0 + ble _022156E8 + add r7, sp, #0x20 + add r6, sp, #0x1c + mvn r4, #0 +_022155C0: + mov r0, sb + mov r1, r8 + str sb, [sp, #0x10] + bl ov00_02213FD4 + cmp r0, r4 + addeq sp, sp, #0x24 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + sub r3, r8, r0 + cmp r3, #0xb + add r2, sb, r0 + addlt sp, sp, #0x24 + movlt r0, #4 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r1, [r2] + ldrb r0, [r2, #1] + sub r8, r3, #0xa + add sb, r2, #0xa + strb r1, [r7] + strb r0, [r7, #1] + ldrb r5, [r2, #2] + ldrb r3, [r2, #3] + mov r0, sb + mov r1, r8 + strb r3, [r7, #3] + strb r5, [r7, #2] + ldrb ip, [r2, #4] + ldrb r5, [r2, #5] + add r3, sp, #0x18 + strb ip, [r3] + strb r5, [r3, #1] + ldrb r5, [r2, #6] + ldrb r3, [r2, #7] + strb r5, [r6] + strb r3, [r6, #1] + ldrb r3, [r2, #8] + ldrb r2, [r2, #9] + strb r3, [r6, #2] + strb r2, [r6, #3] + ldr ip, [sp, #0x1c] + mov r2, ip, lsl #0x18 + and r5, r2, #0xff000000 + mov r2, ip, lsl #8 + and r3, r2, #0xff0000 + mov r2, ip, lsr #0x18 + mov ip, ip, lsr #8 + and r2, r2, #0xff + and ip, ip, #0xff00 + orr r2, r2, ip + orr r2, r3, r2 + orr r2, r5, r2 + str r2, [sp, #0x1c] + bl ov00_02213FD4 + mov r5, r0 + cmp r5, r4 + addeq sp, sp, #0x24 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #0x1c] + mov r0, sl + stmia sp, {r1, sb} + ldr r2, [sl, #0x494] + ldr r1, [sp, #0x10] + str r2, [sp, #8] + ldrh r3, [sp, #0x18] + ldr r2, [sp, #0x20] + ldr ip, [sl, #0x490] + blx ip + ldr r0, [sp, #0xc] + add fp, fp, #1 + cmp fp, r0 + add sb, sb, r5 + sub r8, r8, r5 + blt _022155C0 +_022156E8: + ldr r0, [sp, #0x14] + cmp r0, #0 + beq _0221571C + mov r1, #0 + str r1, [sp] + str r1, [sp, #4] + ldr r2, [sl, #0x494] + mov r0, sl + str r2, [sp, #8] + ldr r4, [sl, #0x490] + mov r2, r1 + mov r3, r1 + blx r4 +_0221571C: + mov r0, #0 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_0221556C + + arm_func_start ov00_02215728 +ov00_02215728: ; 0x02215728 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x54 + mov r8, r2 + cmp r8, #0xb + mov sl, r0 + mov sb, r1 + addlt sp, sp, #0x54 + movlt r0, #4 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r2, [sb] + ldrb r1, [sb, #1] + add r3, sp, #0xc + add r4, sp, #8 + strb r2, [r3] + strb r1, [r3, #1] + ldrb r2, [sb, #2] + ldrb r1, [sb, #3] + strb r1, [r3, #3] + strb r2, [r3, #2] + ldrb r3, [sb, #4] + ldrb r2, [sb, #5] + ldr r1, [sp, #0xc] + strb r3, [r4] + strb r2, [r4, #1] + ldrh r2, [sp, #8] + bl ov00_02213CFC + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + addeq sp, sp, #0x54 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + bl ov00_02213DFC + ldrb r2, [sb, #6] + ldrb r1, [sb, #7] + add r3, sp, #0x10 + mov fp, r0 + strb r2, [r3] + strb r1, [r3, #1] + ldrb r1, [sb, #8] + ldrb r0, [sb, #9] + sub r8, r8, #0xb + mov r7, #0 + strb r1, [r3, #2] + strb r0, [r3, #3] + ldr r3, [sp, #0x10] + add r5, sp, #0x14 + mov r1, r3, lsr #0x18 + mov r0, r3, lsr #8 + mov r2, r3, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + mov r3, r3, lsl #0x18 + orr r0, r1, r0 + and r2, r2, #0xff0000 + and r1, r3, #0xff000000 + orr r0, r2, r0 + orr r0, r1, r0 + str r0, [sp, #0x10] + ldrb r6, [sb, #0xa] + add sb, sb, #0xb + mvn r4, #0 + b _0221585C +_02215828: + cmp r8, #1 + blt _02215868 + mov r0, sb + mov r1, r8 + bl ov00_02213FD4 + cmp r0, r4 + addeq sp, sp, #0x54 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str sb, [r5, r7, lsl #2] + add sb, sb, r0 + sub r8, r8, r0 + add r7, r7, #1 +_0221585C: + cmp r7, r6 + cmplt r7, #0x10 + blt _02215828 +_02215868: + ldr r4, [sl, #0x48c] + cmp r4, #0 + addeq sp, sp, #0x54 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r1, sp, #0x14 + str r1, [sp] + ldr r2, [sl, #0x494] + mov r0, sl + str r2, [sp, #4] + ldr r2, [sp, #0x10] + mov r1, fp + mov r3, r7 + blx r4 + mov r0, #0 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov00_02215728 + + arm_func_start ov00_022158AC +ov00_022158AC: ; 0x022158AC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + cmp r2, #6 + mov r4, r0 + addlt sp, sp, #8 + movlt r0, #4 + ldmltia sp!, {r4, pc} + ldrb r3, [r1] + ldrb r2, [r1, #1] + add lr, sp, #4 + add ip, sp, #0 + strb r3, [lr] + strb r2, [lr, #1] + ldrb r3, [r1, #2] + ldrb r2, [r1, #3] + strb r3, [lr, #2] + strb r2, [lr, #3] + ldrb r3, [r1, #4] + ldrb r2, [r1, #5] + ldr r1, [sp, #4] + strb r3, [ip] + strb r2, [ip, #1] + ldrh r2, [sp] + bl ov00_02213CFC + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov00_02213DA0 + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov00_022158AC + + arm_func_start ov00_02215938 +ov00_02215938: ; 0x02215938 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r6, r2 + cmp r6, #5 + mov r8, r0 + mov r7, r1 + addlt sp, sp, #0xc + movlt r0, #4 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r4, sp, #4 + add r3, sp, #8 + str r4, [sp] + bl ov00_02214BF0 + ldrh r2, [sp, #4] + ldr r1, [sp, #8] + mov r0, r8 + bl ov00_02213CFC + mov r5, r0 + mvn r0, #0 + cmp r5, r0 + bne _022159B8 + ldrh r2, [sp, #4] + ldr r1, [sp, #8] + mov r0, r8 + bl ov00_022132C4 + mov r4, r0 + bl ov00_0221339C + cmp r0, #0 + beq _022159C8 + add sp, sp, #0xc + mov r0, #5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_022159B8: + mov r0, r8 + mov r1, r5 + bl ov00_02213DFC + mov r4, r0 +_022159C8: + mov ip, #0 + mov r0, r8 + mov r1, r4 + mov r2, r7 + mov r3, r6 + str ip, [sp] + bl ov00_02214C60 + cmp r0, #0 + addlt sp, sp, #0xc + movlt r0, #4 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, pc} + mvn r0, #0 + cmp r5, r0 + bne _02215A0C + mov r0, r8 + mov r1, r4 + bl ov00_02213C6C +_02215A0C: + ldr r3, [r8, #0x494] + ldr r5, [r8, #0x488] + mov r0, r8 + mov r2, r4 + mov r1, #1 + blx r5 + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov00_02215938 + + arm_func_start ov00_02215A30 +ov00_02215A30: ; 0x02215A30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r0 + ldr r0, [sb, #0x80] + mov r8, #0 + cmp r0, #3 + blt _02215BCC + ldr r5, _02215BE4 ; =ov00_0221A650 + ldr r4, _02215BE8 ; =ov00_0221A5C8 + ldr sl, _02215BEC ; =ov00_0221A574 + ldr fp, _02215BF0 ; =0x000005B4 + mov r6, r8 + add r7, sp, #0 +_02215A60: + ldr r0, [sb, #0x7c] + ldrb r1, [r0] + ldrb r0, [r0, #1] + strb r1, [r7] + strb r0, [r7, #1] + ldrh r0, [sp] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp] + ldrh r2, [sp] + cmp r2, #0x1000 + movhi r8, #4 + bhi _02215BCC + ldr r0, [sb, #0x80] + cmp r0, r2 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sb, #0x7c] + ldrsb r0, [r1, #2] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _02215B70 +_02215AC4: ; jump table + b _02215B70 ; case 0 + b _02215AE0 ; case 1 + b _02215AF8 ; case 2 + b _02215B10 ; case 3 + b _02215B2C ; case 4 + b _02215B44 ; case 5 + b _02215B5C ; case 6 +_02215AE0: + mov r0, sb + add r1, r1, #3 + sub r2, r2, #3 + bl ov00_02215490 + mov r8, r0 + b _02215B70 +_02215AF8: + mov r0, sb + add r1, r1, #3 + sub r2, r2, #3 + bl ov00_02215938 + mov r8, r0 + b _02215B70 +_02215B10: + ldr r0, [sb, #0x4b0] + mov r3, r6 + bl ov00_021FF970 + cmp r0, #0 + bgt _02215B70 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02215B2C: + mov r0, sb + add r1, r1, #3 + sub r2, r2, #3 + bl ov00_022158AC + mov r8, r0 + b _02215B70 +_02215B44: + mov r0, sb + add r1, r1, #3 + sub r2, r2, #3 + bl ov00_02215728 + mov r8, r0 + b _02215B70 +_02215B5C: + mov r0, sb + add r1, r1, #3 + sub r2, r2, #3 + bl ov00_0221556C + mov r8, r0 +_02215B70: + ldrh r0, [sp] + ldr r1, [sb, #0x80] + subs r0, r1, r0 + str r0, [sb, #0x80] + bpl _02215B98 + mov r0, r5 + mov r1, r4 + mov r2, sl + mov r3, fp + bl __msl_assertion_failed +_02215B98: + ldr r2, [sb, #0x80] + cmp r2, #0 + ldrne r0, [sb, #0x7c] + cmpne r0, #0 + beq _02215BB8 + ldrh r1, [sp] + add r1, r0, r1 + bl memmove +_02215BB8: + cmp r8, #0 + bne _02215BCC + ldr r0, [sb, #0x80] + cmp r0, #3 + bge _02215A60 +_02215BCC: + cmp r8, #0 + beq _02215BDC + mov r0, sb + bl ov00_02214130 +_02215BDC: + mov r0, r8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02215BE4: .word ov00_0221A650 +_02215BE8: .word ov00_0221A5C8 +_02215BEC: .word ov00_0221A574 +_02215BF0: .word 0x000005B4 + arm_func_end ov00_02215A30 + + arm_func_start ov00_02215BF4 +ov00_02215BF4: ; 0x02215BF4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6, #0x4b0] + bl ov00_021FF694 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r5, [r6, #0x80] + ldr r1, [r6, #0x7c] + ldr r0, [r6, #0x4b0] + add r1, r1, r5 + rsb r2, r5, #0x1000 + mov r3, #0 + bl ov00_021FF92C + add r1, r0, #1 + cmp r1, #1 + bhi _02215C48 + mov r0, r6 + bl ov00_02214130 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_02215C48: + ldr r1, [r6, #0x80] + mov r4, #0 + add r0, r1, r0 + str r0, [r6, #0x80] + ldr r0, [r6] + cmp r0, #2 + beq _02215C70 + ldr r0, [r6, #0x5c8] + cmp r0, #0 + ble _02215C8C +_02215C70: + ldr r1, [r6, #0x7c] + ldr r2, [r6, #0x80] + add r0, r6, #0xbc + add r0, r0, #0x400 + add r1, r1, r5 + sub r2, r2, r5 + bl ov00_022122B8 +_02215C8C: + ldr r0, [r6] + cmp r0, #3 + bne _02215CA4 + mov r0, r6 + bl ov00_02215064 + mov r4, r0 +_02215CA4: + cmp r4, #0 + movne r0, r4 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r6] + cmp r0, #2 + bne _02215CD4 + ldr r0, [r6, #0x80] + cmp r0, #0 + ble _02215CD4 + mov r0, r6 + bl ov00_02215A30 + ldmia sp!, {r4, r5, r6, pc} +_02215CD4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov00_02215BF4 + + arm_func_start ov00_02215CDC +ov00_02215CDC: ; 0x02215CDC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov r5, r0 + ldr r1, [r5] + mov r4, r3 + cmp r1, #1 + bne _02215D10 + mov r1, #0 + mov r2, r1 + mov r3, #2 + str r1, [sp] + bl ov00_022145F0 +_02215D10: + ldr r0, [r5] + cmp r0, #1 + addeq sp, sp, #0x18 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x50] + add r6, sp, #0x44 + add r0, r0, #9 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r2, r0, asr #8 + mov r1, r0, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + strh r1, [sp, #4] + add r2, sp, #4 + ldrb r3, [r2] + add r0, sp, #0x48 + add r1, sp, #6 + ldrb r2, [r2, #1] + strb r3, [r1] + mov fp, #2 + strb r2, [r1, #1] + ldrb sb, [r6] + add sl, sp, #9 + ldrb r8, [r6, #1] + ldrb r7, [r6, #2] + ldrb r6, [r6, #3] + ldrb ip, [r0] + ldrb r3, [r0, #1] + add lr, sp, #0xd + mov r0, r5 + mov r2, #9 + strb fp, [sp, #8] + strb sb, [sl] + strb r8, [sl, #1] + strb r7, [sl, #2] + strb r6, [sl, #3] + strb ip, [lr] + strb r3, [lr, #1] + bl ov00_02214558 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addne sp, sp, #0x10 + bxne lr + ldr r0, [r5, #0x4b0] + ldr r2, [sp, #0x50] + mov r1, r4 + mov r3, #0 + bl ov00_021FF970 + cmp r0, #0 + movlt r0, #3 + movge r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_02215CDC + + arm_func_start ov00_02215E04 +ov00_02215E04: ; 0x02215E04 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + ldr r5, [sp, #0x44] + mov r7, #0xfd + mov r4, r5, lsr #0x18 + mov r8, r5, lsl #0x18 + mov r3, r5, lsr #8 + mov r6, r5, lsl #8 + and r5, r4, #0xff + and r4, r3, #0xff00 + orr sb, r5, r4 + and r3, r6, #0xff0000 + mov r6, #0xfc + mov r5, #0x1e + mov r4, #0x66 + mov lr, #0x6a + mov fp, #0xb2 + strb r4, [sp, #7] + and r8, r8, #0xff000000 + orr r3, r3, sb + orr r8, r8, r3 + add r3, sp, #0x44 + str r8, [sp, #0x44] + strb r7, [sp, #4] + ldrb sl, [r3] + add ip, sp, #0xa + ldrb sb, [r3, #1] + ldrb r8, [r3, #2] + ldrb r7, [r3, #3] + add r3, sp, #4 + strb r6, [sp, #5] + strb r5, [sp, #6] + strb lr, [sp, #8] + strb fp, [sp, #9] + strb sl, [ip] + strb sb, [ip, #1] + strb r8, [ip, #2] + strb r7, [ip, #3] + mov r4, #0xa + str r4, [sp] + bl ov00_02215CDC + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov00_02215E04 + + arm_func_start ov00_02215EBC +ov00_02215EBC: ; 0x02215EBC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x5f0 + mov r1, #8 + mov sl, r0 + str r1, [sp, #8] + ldr r0, [sl, #0x4b0] + bl ov00_021FF694 + cmp r0, #0 + beq _02215F84 + ldr r6, _02215FD8 ; =0x000005DB + add sb, sp, #0xc + add r8, sp, #8 + add r7, sp, #0x14 + mov fp, #0 + mvn r4, #0 +_02215EF8: + str sb, [sp] + str r8, [sp, #4] + ldr r0, [sl, #0x4b0] + mov r1, r7 + mov r2, r6 + mov r3, fp + bl ov00_021FF940 + cmp r0, r4 + beq _02215F74 + ldrh r2, [sp, #0xe] + ldr r1, [sp, #0x10] + mov r0, sl + bl ov00_02213CFC + cmp r0, r4 + bne _02215F74 + ldrh r2, [sp, #0xe] + ldr r1, [sp, #0x10] + mov r0, sl + bl ov00_022132C4 + mov r5, r0 + bl ov00_0221339C + cmp r0, #0 + addne sp, sp, #0x5f0 + movne r0, #5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, r5 + mov r1, #0x11 + bl ov00_02213370 + mov r0, sl + mov r1, r5 + bl ov00_02213C6C +_02215F74: + ldr r0, [sl, #0x4b0] + bl ov00_021FF694 + cmp r0, #0 + bne _02215EF8 +_02215F84: + bl ov00_021FF368 + ldr r1, [sl, #0x4b4] + sub r0, r0, r1 + cmp r0, #0x7d0 + bls _02215FCC + ldr r0, [sl, #0x4b0] + bl ov00_021FF818 + mvn r0, #0 + str r0, [sl, #0x4b0] + mov r0, #1 + str r0, [sl] + ldr r0, _02215FDC ; =ov00_0221B9D4 + ldr r3, [sl, #0x494] + ldr r2, [r0] + ldr r4, [sl, #0x488] + mov r0, sl + mov r1, #3 + blx r4 +_02215FCC: + mov r0, #0 + add sp, sp, #0x5f0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02215FD8: .word 0x000005DB +_02215FDC: .word ov00_0221B9D4 + arm_func_end ov00_02215EBC + + arm_func_start ov00_02215FE0 +ov00_02215FE0: ; 0x02215FE0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov00_02213E10 + ldr r0, [r4] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _02216024 +_02215FFC: ; jump table + b _02216018 ; case 0 + b _02216024 ; case 1 + b _0221600C ; case 2 + b _0221600C ; case 3 +_0221600C: + mov r0, r4 + bl ov00_02215BF4 + ldmia sp!, {r4, pc} +_02216018: + mov r0, r4 + bl ov00_02215EBC + ldmia sp!, {r4, pc} +_02216024: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov00_02215FE0 + + .rodata + +ov00_02216040: + .byte 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 +ov00_02216058: + .byte 0x57, 0x61, 0x79, 0x70, 0x6F, 0x72, 0x74, 0x32 +ov00_02216060: + .byte 0x46, 0x52, 0x45, 0x45, 0x53, 0x50, 0x4F, 0x54 +ov00_02216068: + .byte 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F + .byte 0x57, 0x46, 0x43, 0x00 +ov00_02216074: + .byte 0x02, 0x80, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00 + .byte 0x10, 0x80, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00 + .byte 0x00, 0x81, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00 + .byte 0x00, 0x90, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00 +ov00_022160A8: + .byte 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov00_022160F0: + .word ov00_02217B98 + .byte 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x61, 0x61, 0x61 +ov00_02216103: + .byte 0x17, 0x14, 0x11, 0x0D, 0x0B, 0x06, 0x0F, 0x0E, 0x09, 0x15, 0x0C, 0x04, 0x02 + .byte 0x01, 0x12, 0x10, 0x05, 0x03, 0x13, 0x0A, 0x07, 0x08, 0x00, 0x16, 0x00 +ov00_0221611C: + .byte 0x05, 0x01, 0x0C, 0x04 + .byte 0x02, 0x03, 0x0A, 0x00, 0x0B, 0x07, 0x09, 0x08, 0x06, 0x00, 0x00, 0x00 +ov00_0221612C: + .byte 0x0A, 0x0D, 0x0E, 0x08 + .byte 0x09, 0x03, 0x06, 0x00, 0x0C, 0x05, 0x02, 0x07, 0x0B, 0x01, 0x0F, 0x04 +ov00_0221613C: + .byte 0x21, 0x53, 0x44, 0x57 +ov00_02216140: + .byte 0x5B, 0x5D, 0x5F, 0x00 +ov00_02216144: + .byte 0x2D, 0x5F, 0x3D, 0x00 +ov00_02216148: + .byte 0x2B, 0x2F, 0x3D, 0x00, 0x5C, 0x6D, 0x6F, 0x64 + .byte 0x5C, 0x25, 0x64, 0x00, 0x13, 0x1D, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x1F, 0x06, 0x45, 0x34 + .byte 0x3F, 0x01, 0x1B, 0x00 +ov00_02216164: + .byte 0x13, 0x1D, 0x01, 0x04, 0x00, 0x00, 0x00, 0x28, 0x1F, 0x06, 0x45, 0x34 + .byte 0x3F, 0x01, 0x1B, 0x00, 0x0C, 0x13, 0x1A, 0x1E, 0x0D, 0x13, 0x28, 0x1D, 0x00, 0x01, 0x01, 0x24 + .byte 0x75, 0x16, 0x33, 0x18, 0x00, 0x10, 0x04, 0x1D, 0x55, 0x1B, 0x39, 0x14, 0x39, 0x16, 0x33, 0x4F + .byte 0x01, 0x00, 0x0C, 0x1C, 0x0A, 0x1D, 0x02, 0x02, 0x19, 0x24, 0x2C, 0x34, 0x06, 0x17, 0x3E, 0x1C + .byte 0x06, 0x0E, 0x39, 0x46, 0x10, 0x1D, 0x03, 0x0D, 0x16, 0x0B, 0x3B, 0x17, 0x16, 0x36, 0x40, 0x07 + .byte 0x00, 0x0C, 0x15, 0x0A, 0x1E, 0x15, 0x0A, 0x10, 0x1D, 0x2C, 0x06, 0x0C, 0x1B, 0x3B, 0x2E, 0x4A + .byte 0x19, 0x39, 0x08, 0x11, 0x38, 0x18, 0x09, 0x16, 0x10, 0x0C, 0x57, 0x1C, 0x36, 0x09, 0x0A, 0x10 + .byte 0x1D, 0x55, 0x0C, 0x00, 0x0C, 0x13, 0x1A, 0x1E, 0x0D, 0x13, 0x28, 0x1D, 0x11, 0x1D, 0x11, 0x10 + .byte 0x24, 0x1D, 0x04, 0x0F, 0x0B, 0x3F, 0x51, 0x32, 0x2C, 0x1A, 0x00, 0x0B, 0x20, 0x2E, 0x4A, 0x19 + .byte 0x39, 0x0F, 0x1D, 0x25, 0x2C, 0x4D, 0x01, 0x00, 0x0C, 0x07, 0x1F, 0x0E, 0x02, 0x02, 0x19, 0x24 + .byte 0x2C, 0x34, 0x16, 0x1D, 0x23, 0x01, 0x04, 0x0F, 0x1C, 0x3F, 0x51, 0x25, 0x2C, 0x0C, 0x0A, 0x16 + .byte 0x35, 0x2E, 0x4A, 0x0E, 0x39, 0x04, 0x15, 0x2C, 0x15, 0x0C, 0x04, 0x0C, 0x31, 0x2E, 0x4A, 0x19 + .byte 0x00, 0x0C, 0x13, 0x1A, 0x1E, 0x0D, 0x13, 0x28, 0x1D, 0x1E, 0x01, 0x06, 0x13, 0x0C, 0x57, 0x1C + .byte 0x36, 0x0E, 0x06, 0x0D, 0x29, 0x11, 0x1B, 0x0D, 0x24, 0x75, 0x01, 0x33, 0x18, 0x00, 0x10, 0x04 + .byte 0x1D, 0x55, 0x1B, 0x39, 0x14, 0x39, 0x16, 0x33, 0x4F, 0x01, 0x00, 0x0C, 0x13, 0x1A, 0x1E, 0x0D + .byte 0x3F, 0x28, 0x26, 0x11, 0x05, 0x00, 0x16, 0x31, 0x1F, 0x0A, 0x36, 0x40, 0x10, 0x28, 0x33, 0x15 + .byte 0x1B, 0x15, 0x17, 0x3E, 0x01, 0x0A, 0x36, 0x40, 0x10, 0x28, 0x31, 0x1F, 0x1A, 0x11, 0x24, 0x75 + .byte 0x16, 0x33, 0x03, 0x01, 0x3F, 0x45, 0x00, 0x0C, 0x15, 0x0A, 0x1E, 0x15, 0x07, 0x28, 0x1D, 0x00 + .byte 0x01, 0x01, 0x24, 0x75, 0x16, 0x33, 0x1A, 0x11, 0x1A, 0x04, 0x24, 0x2C, 0x4D, 0x01, 0x24, 0x34 + .byte 0x1B, 0x01, 0x0E, 0x00, 0x1B, 0x28, 0x64, 0x14, 0x34, 0x0E, 0x1D, 0x29, 0x01, 0x33, 0x4F, 0x16 + .byte 0x3F, 0x18, 0x28, 0x14, 0x34, 0x40, 0x1C, 0x00, 0x0C, 0x01, 0x0A, 0x1E, 0x15, 0x07, 0x28, 0x1D + .byte 0x00, 0x01, 0x01, 0x24, 0x75, 0x16, 0x33, 0x1A, 0x11, 0x1A, 0x04, 0x24, 0x2C, 0x4D, 0x01, 0x24 + .byte 0x34, 0x1B, 0x01, 0x0E, 0x00, 0x1B, 0x28, 0x64, 0x14, 0x34, 0x0E, 0x0E, 0x0C, 0x57, 0x0B, 0x36 + .byte 0x09, 0x0A, 0x10, 0x1D, 0x55, 0x0C, 0x39, 0x14, 0x35, 0x1C, 0x08, 0x1E, 0x0D, 0x3F, 0x51, 0x25 + .byte 0x2C, 0x0C, 0x04, 0x0C, 0x31, 0x2E, 0x00 +ov00_022162E7: + .byte 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +ov00_022163E8: + .byte 0xFD, 0xFC, 0x1E, 0x66, 0x6A, 0xB2, 0x00, 0x00 +ov00_022163F0: + .word ov00_0221A4DC, ov00_0221A4D4 + + .data + +ov00_02216420: + .word ov00_0221643C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x4E, 0x00, 0x00 + + .balign 4, 0 +ov00_0221643C: + .asciz "https://nas.test.nintendowifi.net/ac" + .balign 4, 0 +ov00_02216464: + .asciz "ALLOC DWCauth" + .balign 4, 0 +ov00_02216474: + .asciz "FREE DWCauth" + .balign 4, 0 +ov00_02216484: + .asciz "https://nas.nintendowifi.net/ac" + .balign 4, 0 +ov00_022164A4: + .asciz "ALLOC bmwork" + .balign 4, 0 +ov00_022164B4: + .asciz "FREE bmwork" + .balign 4, 0 +ov00_022164C0: + .asciz "Date" + .balign 4, 0 +ov00_022164C8: + .asciz "httpresult" + .balign 4, 0 +ov00_022164D4: + .asciz "returncd" + .balign 4, 0 +ov00_022164E0: + .asciz "token" + .balign 4, 0 +ov00_022164E8: + .asciz "locator" + .balign 4, 0 +ov00_022164F0: + .asciz "challenge" + .balign 4, 0 +ov00_022164FC: + .asciz "datetime" + .balign 4, 0 +ov00_02216508: + .asciz "Set-Cookie" + .balign 4, 0 +ov00_02216514: + .asciz "acctcreate" + .balign 4, 0 +ov00_02216520: + .asciz "action" + .balign 4, 0 +ov00_02216528: + .asciz "login" + .balign 4, 0 +ov00_02216530: + .asciz "gsbrcd" + .balign 4, 0 +ov00_02216538: + .asciz "Y" + .balign 4, 0 +ov00_0221653C: + .asciz "iswfc" + .balign 4, 0 +ov00_02216544: + .asciz "ingamesn" + .balign 4, 0 +ov00_02216550: + .asciz "%013llu" + .balign 4, 0 +ov00_02216558: + .asciz "%03u" + .balign 4, 0 +ov00_02216560: + .asciz "%02x" + .balign 4, 0 +ov00_02216568: + .asciz "%02x%02x" + .balign 4, 0 +ov00_02216574: + .asciz "%02d%02d%02d%02d%02d%02d" + .balign 4, 0 +ov00_02216590: + .asciz "%02d:0000000-00" + .balign 4, 0 +ov00_022165A0: + .asciz "%03d%03d" + .balign 4, 0 +ov00_022165AC: + .asciz "sdkver" + .balign 4, 0 +ov00_022165B4: + .asciz "userid" + .balign 4, 0 +ov00_022165BC: + .asciz "passwd" + .balign 4, 0 +ov00_022165C4: + .asciz "bssid" + .balign 4, 0 +ov00_022165CC: + .asciz "apinfo" + .balign 4, 0 +ov00_022165D4: + .asciz "gamecd" + .balign 4, 0 +ov00_022165DC: + .asciz "makercd" + .balign 4, 0 +ov00_022165E4: + .asciz "unitcd" + .balign 4, 0 +ov00_022165EC: + .asciz "macadr" + .balign 4, 0 +ov00_022165F4: + .asciz "lang" + .balign 4, 0 +ov00_022165FC: + .asciz "birth" + .balign 4, 0 +ov00_02216604: + .asciz "devtime" + .balign 4, 0 +ov00_0221660C: + .asciz "devname" + .balign 4, 0 +ov00_02216614: + .asciz "ssid" + .balign 4, 0 +ov00_0221661C: + .asciz "Nitro WiFi SDK/%d.%d" + .balign 4, 0 +ov00_02216634: + .asciz "User-Agent" + .balign 4, 0 +ov00_02216640: + .asciz "HTTP_X_GAMECD" + .balign 4, 0 +ov00_02216650: + .word ov00_02217488 + .word ov00_0221735C + .word ov00_0221763C + .word ov00_02217718 + .word ov00_02216BF4 + .word ov00_02216E90 + .word ov00_02216F78 + .word ov00_02216D40 + .word ov00_02217244 + .word ov00_02217124 + .word ov00_022177F4 + .word ov00_0221703C +ov00_02216680: + .asciz "ALLOC http->lowrecvbuf" + .balign 4, 0 +ov00_02216698: + .asciz "ALLOC http->lowsendbuf" + .balign 4, 0 +ov00_022166B0: + .asciz "Connection" + .balign 4, 0 +ov00_022166BC: + .asciz "close" + .balign 4, 0 +ov00_022166C4: + .asciz "\r\n\r\n" + .balign 4, 0 +ov00_022166CC: + .asciz "%d" + .balign 4, 0 +ov00_022166D0: + .asciz "Content-Length" + .balign 4, 0 +ov00_022166E0: + .asciz "Content-Length: " + .balign 4, 0 +ov00_022166F4: + .asciz "\r\n" + .balign 4, 0 +ov00_022166F8: + .asciz "FREE http->lowrecvbuf" + .balign 4, 0 +ov00_02216710: + .asciz "FREE http->lowsendbuf" + .balign 4, 0 +ov00_02216728: + .asciz "POST /%s HTTP/1.0\r\nContent-type: application/x-www-form-urlencoded\r\nHost: %s\r\n\r\n" + .balign 4, 0 +ov00_0221677C: + .asciz "GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n" + .balign 4, 0 +ov00_0221679C: + .asciz "%s: %s\r\n" + .balign 4, 0 +ov00_022167A8: + .asciz "%s=" + .balign 4, 0 +ov00_022167AC: + .asciz "&%s=" + .balign 4, 0 +ov00_022167B4: + .asciz "%s" + .balign 4, 0 +ov00_022167B8: + .asciz "ALLOC buf->buffer" + .balign 4, 0 +ov00_022167CC: + .asciz "FREE buf->buffer" + .balign 4, 0 +ov00_022167E0: + .asciz "ALLOC newptr" + .balign 4, 0 +ov00_022167F0: + .asciz "http://" + .balign 4, 0 +ov00_022167F8: + .asciz "https://" + .balign 4, 0 +ov00_02216804: + .asciz ":" + .balign 4, 0 +ov00_02216808: + .asciz "/" + .balign 4, 0 +ov00_0221680C: + .asciz "ALLOC result->entry[i].label" + .balign 4, 0 +ov00_0221682C: + .asciz "ALLOC result->entry[i].value" + .balign 4, 0 +ov00_0221684C: + .asciz "FREE result->entry[i].label" + .balign 4, 0 +ov00_02216868: + .asciz "FREE result->entry[i].value" + .balign 4, 0 +ov00_02216884: + .asciz " " + .balign 4, 0 +ov00_02216888: + .asciz "httpresult" + .balign 4, 0 +ov00_02216894: + .asciz "200" + .balign 4, 0 +ov00_02216898: + .asciz ": " + .balign 4, 0 +ov00_0221689C: + .asciz "=" + .balign 4, 0 +ov00_022168A0: + .asciz "&" + .balign 4, 0 +ov00_022168A4: + .asciz "FREE array_entry[i].label" + .balign 4, 0 +ov00_022168C0: + .asciz "FREE array_entry[i].value" + .balign 4, 0 + +ov00_022168DC: + .word ov00_022168E0 +ov00_022168E0: + .asciz "http://conntest.nintendowifi.net/" + .balign 4, 0 +ov00_02216904: + .asciz "ALLOC DWCnetcheck" + .balign 4, 0 +ov00_02216918: + .asciz "ALLOC DWChttp" + .balign 4, 0 +ov00_02216928: + .asciz "FREE DWChttp" + .balign 4, 0 +ov00_02216938: + .asciz "FREE DWCnetcheck->body_302" + .balign 4, 0 +ov00_02216954: + .asciz "FREE DWCnetcheck->body_wayport" + .balign 4, 0 +ov00_02216974: + .asciz "FREE DWCnetcheck" + .balign 4, 0 +ov00_02216988: + .asciz "ALLOC DWCnetcheck->body_302" + .balign 4, 0 +ov00_022169A4: + .asciz "ALLOC url" + .balign 4, 0 +ov00_022169B0: + .asciz "ALLOC data_len" + .balign 4, 0 +ov00_022169C0: + .asciz "ALLOC wait_len" + .balign 4, 0 +ov00_022169D0: + .asciz "ALLOC DWCnetcheck->body_wayport" + .balign 4, 0 +ov00_022169F0: + .asciz "httpresult" + .balign 4, 0 +ov00_022169FC: + .asciz "https://nas.nintendowifi.net/ac" + .balign 4, 0 +ov00_02216A1C: + .asciz "action" + .balign 4, 0 +ov00_02216A24: + .asciz "message" + .balign 4, 0 +ov00_02216A2C: + .asciz "HotSpotResponse" + .balign 4, 0 +ov00_02216A3C: + .asciz "parse" + .balign 4, 0 +ov00_02216A44: + .asciz "HTML" + .balign 4, 0 +ov00_02216A4C: + .asciz "returncd" + .balign 4, 0 +ov00_02216A58: + .asciz "url" + .balign 4, 0 +ov00_02216A5C: + .asciz "data" + .balign 4, 0 +ov00_02216A64: + .asciz "wait" + .balign 4, 0 +ov00_02216A6C: + .asciz "FREE url" + .balign 4, 0 +ov00_02216A78: + .asciz "FREE data" + .balign 4, 0 +ov00_02216A84: + .asciz "FREE wait" + .balign 4, 0 +ov00_02216A90: + .asciz "Jun" + .balign 4, 0 +ov00_02216A94: + .asciz "Jul" + .balign 4, 0 +ov00_02216A98: + .asciz "Dec" + .balign 4, 0 +ov00_02216A9C: + .asciz "Sep" + .balign 4, 0 +ov00_02216AA0: + .asciz "Aug" + .balign 4, 0 +ov00_02216AA4: + .asciz "Nov" + .balign 4, 0 +ov00_02216AA8: + .asciz "Oct" + .balign 4, 0 +ov00_02216AAC: + .asciz "May" + .balign 4, 0 +ov00_02216AB0: + .asciz "Apr" + .balign 4, 0 +ov00_02216AB4: + .asciz "Mar" + .balign 4, 0 +ov00_02216AB8: + .asciz "Feb" + .balign 4, 0 +ov00_02216ABC: + .asciz "Jan" + .balign 4, 0 + +ov00_02216AC0: + .word ov00_02216ABC + .word ov00_02216AB8 + .word ov00_02216AB4 + .word ov00_02216AB0 + .word ov00_02216AAC + .word ov00_02216A90 + .word ov00_02216A94 + .word ov00_02216AA0 + .word ov00_02216A9C + .word ov00_02216AA8 + .word ov00_02216AA4 + .word ov00_02216A98 +ov00_02216AF0: + .asciz "Fri, 03 Mar 2006 01:28:13 GMT" + .balign 4, 0 +ov00_02216B10: + .asciz "ALLOC intwork" + .balign 4, 0 +ov00_02216B20: + .asciz "FREE intwork" + .balign 4, 0 +ov00_02216B30: + .asciz "https://nas.nintendowifi.net/ac" + .balign 4, 0 +ov00_02216B50: + .asciz "action" + .balign 4, 0 +ov00_02216B58: + .asciz "SVCLOC" + .balign 4, 0 +ov00_02216B60: + .asciz "svc" + .balign 4, 0 +ov00_02216B64: + .asciz "Date" + .balign 4, 0 +ov00_02216B6C: + .asciz "httpresult" + .balign 4, 0 +ov00_02216B78: + .asciz "returncd" + .balign 4, 0 +ov00_02216B84: + .asciz "svchost" + .balign 4, 0 +ov00_02216B8C: + .asciz "servicetoken" + .balign 4, 0 +ov00_02216B9C: + .asciz "statusdata" + .balign 4, 0 + +ov00_02216BA8: + .word ov00_02216BAC + +ov00_02216BAC: + .asciz "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-" + .balign 4, 0 + +ov00_02216BF0: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 +ov00_02216BF4: + .word ov00_02216C08 + .word 0x00000100 + .word ov00_02216C3C + .word 0x00000003 + .word ov00_02216BF0 +ov00_02216C08: + .asciz "BE, GlobalSign nv-sa, Root CA, GlobalSign Root CA" + .balign 4, 0 +ov00_02216C3C: + .byte 0xDA, 0x0E, 0xE6, 0x99 + .byte 0x8D, 0xCE, 0xA3, 0xE3, 0x4F, 0x8A, 0x7E, 0xFB, 0xF1, 0x8B, 0x83, 0x25, 0x6B, 0xEA, 0x48, 0x1F + .byte 0xF1, 0x2A, 0xB0, 0xB9, 0x95, 0x11, 0x04, 0xBD, 0xF0, 0x63, 0xD1, 0xE2, 0x67, 0x66, 0xCF, 0x1C + .byte 0xDD, 0xCF, 0x1B, 0x48, 0x2B, 0xEE, 0x8D, 0x89, 0x8E, 0x9A, 0xAF, 0x29, 0x80, 0x65, 0xAB, 0xE9 + .byte 0xC7, 0x2D, 0x12, 0xCB, 0xAB, 0x1C, 0x4C, 0x70, 0x07, 0xA1, 0x3D, 0x0A, 0x30, 0xCD, 0x15, 0x8D + .byte 0x4F, 0xF8, 0xDD, 0xD4, 0x8C, 0x50, 0x15, 0x1C, 0xEF, 0x50, 0xEE, 0xC4, 0x2E, 0xF7, 0xFC, 0xE9 + .byte 0x52, 0xF2, 0x91, 0x7D, 0xE0, 0x6D, 0xD5, 0x35, 0x30, 0x8E, 0x5E, 0x43, 0x73, 0xF2, 0x41, 0xE9 + .byte 0xD5, 0x6A, 0xE3, 0xB2, 0x89, 0x3A, 0x56, 0x39, 0x38, 0x6F, 0x06, 0x3C, 0x88, 0x69, 0x5B, 0x2A + .byte 0x4D, 0xC5, 0xA7, 0x54, 0xB8, 0x6C, 0x89, 0xCC, 0x9B, 0xF9, 0x3C, 0xCA, 0xE5, 0xFD, 0x89, 0xF5 + .byte 0x12, 0x3C, 0x92, 0x78, 0x96, 0xD6, 0xDC, 0x74, 0x6E, 0x93, 0x44, 0x61, 0xD1, 0x8D, 0xC7, 0x46 + .byte 0xB2, 0x75, 0x0E, 0x86, 0xE8, 0x19, 0x8A, 0xD5, 0x6D, 0x6C, 0xD5, 0x78, 0x16, 0x95, 0xA2, 0xE9 + .byte 0xC8, 0x0A, 0x38, 0xEB, 0xF2, 0x24, 0x13, 0x4F, 0x73, 0x54, 0x93, 0x13, 0x85, 0x3A, 0x1B, 0xBC + .byte 0x1E, 0x34, 0xB5, 0x8B, 0x05, 0x8C, 0xB9, 0x77, 0x8B, 0xB1, 0xDB, 0x1F, 0x20, 0x91, 0xAB, 0x09 + .byte 0x53, 0x6E, 0x90, 0xCE, 0x7B, 0x37, 0x74, 0xB9, 0x70, 0x47, 0x91, 0x22, 0x51, 0x63, 0x16, 0x79 + .byte 0xAE, 0xB1, 0xAE, 0x41, 0x26, 0x08, 0xC8, 0x19, 0x2B, 0xD1, 0x46, 0xAA, 0x48, 0xD6, 0x64, 0x2A + .byte 0xD7, 0x83, 0x34, 0xFF, 0x2C, 0x2A, 0xC1, 0x6C, 0x19, 0x43, 0x4A, 0x07, 0x85, 0xE7, 0xD3, 0x7C + .byte 0xF6, 0x21, 0x68, 0xEF, 0xEA, 0xF2, 0x52, 0x9F, 0x7F, 0x93, 0x90, 0xCF + + .balign 4, 0 +ov00_02216D3C: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02216D40: + .word ov00_02216D54 + .word 0x00000100 + .word ov00_02216D8C + .word 0x00000003 + .word ov00_02216D3C + +ov00_02216D54: + .asciz "IE, Baltimore, CyberTrust, Baltimore CyberTrust Root" + .balign 4, 0 +ov00_02216D8C: + .byte 0xA3, 0x04, 0xBB, 0x22 + .byte 0xAB, 0x98, 0x3D, 0x57, 0xE8, 0x26, 0x72, 0x9A, 0xB5, 0x79, 0xD4, 0x29, 0xE2, 0xE1, 0xE8, 0x95 + .byte 0x80, 0xB1, 0xB0, 0xE3, 0x5B, 0x8E, 0x2B, 0x29, 0x9A, 0x64, 0xDF, 0xA1, 0x5D, 0xED, 0xB0, 0x09 + .byte 0x05, 0x6D, 0xDB, 0x28, 0x2E, 0xCE, 0x62, 0xA2, 0x62, 0xFE, 0xB4, 0x88, 0xDA, 0x12, 0xEB, 0x38 + .byte 0xEB, 0x21, 0x9D, 0xC0, 0x41, 0x2B, 0x01, 0x52, 0x7B, 0x88, 0x77, 0xD3, 0x1C, 0x8F, 0xC7, 0xBA + .byte 0xB9, 0x88, 0xB5, 0x6A, 0x09, 0xE7, 0x73, 0xE8, 0x11, 0x40, 0xA7, 0xD1, 0xCC, 0xCA, 0x62, 0x8D + .byte 0x2D, 0xE5, 0x8F, 0x0B, 0xA6, 0x50, 0xD2, 0xA8, 0x50, 0xC3, 0x28, 0xEA, 0xF5, 0xAB, 0x25, 0x87 + .byte 0x8A, 0x9A, 0x96, 0x1C, 0xA9, 0x67, 0xB8, 0x3F, 0x0C, 0xD5, 0xF7, 0xF9, 0x52, 0x13, 0x2F, 0xC2 + .byte 0x1B, 0xD5, 0x70, 0x70, 0xF0, 0x8F, 0xC0, 0x12, 0xCA, 0x06, 0xCB, 0x9A, 0xE1, 0xD9, 0xCA, 0x33 + .byte 0x7A, 0x77, 0xD6, 0xF8, 0xEC, 0xB9, 0xF1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xD2, 0xC0, 0xC2, 0xA4 + .byte 0xAE, 0x5E, 0x60, 0xFE, 0xB6, 0xA6, 0x05, 0xFC, 0xB4, 0xDD, 0x07, 0x59, 0x02, 0xD4, 0x59, 0x18 + .byte 0x98, 0x63, 0xF5, 0xA5, 0x63, 0xE0, 0x90, 0x0C, 0x7D, 0x5D, 0xB2, 0x06, 0x7A, 0xF3, 0x85, 0xEA + .byte 0xEB, 0xD4, 0x03, 0xAE, 0x5E, 0x84, 0x3E, 0x5F, 0xFF, 0x15, 0xED, 0x69, 0xBC, 0xF9, 0x39, 0x36 + .byte 0x72, 0x75, 0xCF, 0x77, 0x52, 0x4D, 0xF3, 0xC9, 0x90, 0x2C, 0xB9, 0x3D, 0xE5, 0xC9, 0x23, 0x53 + .byte 0x3F, 0x1F, 0x24, 0x98, 0x21, 0x5C, 0x07, 0x99, 0x29, 0xBD, 0xC6, 0x3A, 0xEC, 0xE7, 0x6E, 0x86 + .byte 0x3A, 0x6B, 0x97, 0x74, 0x63, 0x33, 0xBD, 0x68, 0x18, 0x31, 0xF0, 0x78, 0x8D, 0x76, 0xBF, 0xFC + .byte 0x9E, 0x8E, 0x5D, 0x2A, 0x86, 0xA7, 0x4D, 0x90, 0xDC, 0x27, 0x1A, 0x39 + + .balign 4, 0 +ov00_02216E8C: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02216E90: + .word ov00_02216EA4 + .word 0x00000080 + .word ov00_02216EF4 + .word 0x00000003 + .word ov00_02216E8C + +ov00_02216EA4: + .asciz "US, GTE Corporation, GTE CyberTrust Solutions, Inc., GTE CyberTrust Global Root" + + .balign 4, 0 +ov00_02216EF4: + .byte 0x95, 0x0F, 0xA0, 0xB6, 0xF0, 0x50, 0x9C, 0xE8, 0x7A, 0xC7, 0x88, 0xCD + .byte 0xDD, 0x17, 0x0E, 0x2E, 0xB0, 0x94, 0xD0, 0x1B, 0x3D, 0x0E, 0xF6, 0x94, 0xC0, 0x8A, 0x94, 0xC7 + .byte 0x06, 0xC8, 0x90, 0x97, 0xC8, 0xB8, 0x64, 0x1A, 0x7A, 0x7E, 0x6C, 0x3C, 0x53, 0xE1, 0x37, 0x28 + .byte 0x73, 0x60, 0x7F, 0xB2, 0x97, 0x53, 0x07, 0x9F, 0x53, 0xF9, 0x6D, 0x58, 0x94, 0xD2, 0xAF, 0x8D + .byte 0x6D, 0x88, 0x67, 0x80, 0xE6, 0xED, 0xB2, 0x95, 0xCF, 0x72, 0x31, 0xCA, 0xA5, 0x1C, 0x72, 0xBA + .byte 0x5C, 0x02, 0xE7, 0x64, 0x42, 0xE7, 0xF9, 0xA9, 0x2C, 0xD6, 0x3A, 0x0D, 0xAC, 0x8D, 0x42, 0xAA + .byte 0x24, 0x01, 0x39, 0xE6, 0x9C, 0x3F, 0x01, 0x85, 0x57, 0x0D, 0x58, 0x87, 0x45, 0xF8, 0xD3, 0x85 + .byte 0xAA, 0x93, 0x69, 0x26, 0x85, 0x70, 0x48, 0x80, 0x3F, 0x12, 0x15, 0xC7, 0x79, 0xB4, 0x1F, 0x05 + .byte 0x2F, 0x3B, 0x62, 0x99 + + .balign 4, 0 +ov00_02216F74: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02216F78: + .word ov00_02216F8C + .word 0x00000080 + .word ov00_02216FB8 + .word 0x00000003 + .word ov00_02216F74 + +ov00_02216F8C: + .asciz "US, GTE Corporation, GTE CyberTrust Root" + .balign 4, 0 + +ov00_02216FB8: + .byte 0xB8, 0xE6, 0x4F, 0xBA, 0xDB, 0x98, 0x7C, 0x71 + .byte 0x7C, 0xAF, 0x44, 0xB7, 0xD3, 0x0F, 0x46, 0xD9, 0x64, 0xE5, 0x93, 0xC1, 0x42, 0x8E, 0xC7, 0xBA + .byte 0x49, 0x8D, 0x35, 0x2D, 0x7A, 0xE7, 0x8B, 0xBD, 0xE5, 0x05, 0x31, 0x59, 0xC6, 0xB1, 0x2F, 0x0A + .byte 0x0C, 0xFB, 0x9F, 0xA7, 0x3F, 0xA2, 0x09, 0x66, 0x84, 0x56, 0x1E, 0x37, 0x29, 0x1B, 0x87, 0xE9 + .byte 0x7E, 0x0C, 0xCA, 0x9A, 0x9F, 0xA5, 0x7F, 0xF5, 0x15, 0x94, 0xA3, 0xD5, 0xA2, 0x46, 0x82, 0xD8 + .byte 0x68, 0x4C, 0xD1, 0x37, 0x15, 0x06, 0x68, 0xAF, 0xBD, 0xF8, 0xB0, 0xB3, 0xF0, 0x29, 0xF5, 0x95 + .byte 0x5A, 0x09, 0x16, 0x61, 0x77, 0x0A, 0x22, 0x25, 0xD4, 0x4F, 0x45, 0xAA, 0xC7, 0xBD, 0xE5, 0x96 + .byte 0xDF, 0xF9, 0xD4, 0xA8, 0x8E, 0x42, 0xCC, 0x24, 0xC0, 0x1E, 0x91, 0x27, 0x4A, 0xB5, 0x6D, 0x06 + .byte 0x80, 0x63, 0x39, 0xC4, 0xA2, 0x5E, 0x38, 0x03 + + .balign 4, 0 +ov00_02217038: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_0221703C: + .word ov00_02217050 + .word 0x00000080 + .word ov00_022170A0 + .word 0x00000003 + .word ov00_02217038 + +ov00_02217050: + .asciz "US, Washington, Nintendo of America Inc, NOA, Nintendo CA, ca@noa.nintendo.com" + .balign 4, 0 + +ov00_022170A0: + .byte 0xB3, 0xCD, 0x79, 0x97, 0x77, 0x5D, 0x8A, 0xAF, 0x86, 0xA8, 0xE8, 0xD7, 0x73, 0x1C, 0x77, 0xDF + .byte 0x10, 0x90, 0x1F, 0x81, 0xF8, 0x41, 0x9E, 0x21, 0x55, 0xDF, 0xBC, 0xFC, 0x63, 0xFB, 0x19, 0x43 + .byte 0xF1, 0xF6, 0xC4, 0x72, 0x42, 0x49, 0xBD, 0xAD, 0x44, 0x68, 0x4E, 0xF3, 0xDA, 0x1D, 0xE6, 0x4D + .byte 0xD8, 0xF9, 0x59, 0x88, 0xDC, 0xAE, 0x3E, 0x9B, 0x38, 0x09, 0xCA, 0x7F, 0xFF, 0xDC, 0x24, 0xA2 + .byte 0x44, 0x78, 0x78, 0x49, 0x93, 0xD4, 0x84, 0x40, 0x10, 0xB8, 0xEC, 0x3E, 0xDB, 0x2D, 0x93, 0xC8 + .byte 0x11, 0xC8, 0xFD, 0x78, 0x2D, 0x61, 0xAD, 0x31, 0xAE, 0x86, 0x26, 0xB0, 0xFD, 0x5A, 0x3F, 0xA1 + .byte 0x3D, 0xBF, 0xE2, 0x4B, 0x49, 0xEC, 0xCE, 0x66, 0x98, 0x58, 0x26, 0x12, 0xC0, 0xFB, 0xF4, 0x77 + .byte 0x65, 0x1B, 0xEA, 0xFB, 0xCB, 0x7F, 0xE0, 0x8C, 0xCB, 0x02, 0xA3, 0x4E, 0x5E, 0x8C, 0xEA, 0x9B + + .balign 4, 0 +ov00_02217120: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02217124: + .word ov00_022171B8 + .word 0x00000080 + .word ov00_02217138 + .word 0x00000003 + .word ov00_02217120 + +ov00_02217138: + .byte 0xD2, 0x36, 0x36, 0x6A, 0x8B, 0xD7, 0xC2, 0x5B + .byte 0x9E, 0xDA, 0x81, 0x41, 0x62, 0x8F, 0x38, 0xEE, 0x49, 0x04, 0x55, 0xD6, 0xD0, 0xEF, 0x1C, 0x1B + .byte 0x95, 0x16, 0x47, 0xEF, 0x18, 0x48, 0x35, 0x3A, 0x52, 0xF4, 0x2B, 0x6A, 0x06, 0x8F, 0x3B, 0x2F + .byte 0xEA, 0x56, 0xE3, 0xAF, 0x86, 0x8D, 0x9E, 0x17, 0xF7, 0x9E, 0xB4, 0x65, 0x75, 0x02, 0x4D, 0xEF + .byte 0xCB, 0x09, 0xA2, 0x21, 0x51, 0xD8, 0x9B, 0xD0, 0x67, 0xD0, 0xBA, 0x0D, 0x92, 0x06, 0x14, 0x73 + .byte 0xD4, 0x93, 0xCB, 0x97, 0x2A, 0x00, 0x9C, 0x5C, 0x4E, 0x0C, 0xBC, 0xFA, 0x15, 0x52, 0xFC, 0xF2 + .byte 0x44, 0x6E, 0xDA, 0x11, 0x4A, 0x6E, 0x08, 0x9F, 0x2F, 0x2D, 0xE3, 0xF9, 0xAA, 0x3A, 0x86, 0x73 + .byte 0xB6, 0x46, 0x53, 0x58, 0xC8, 0x89, 0x05, 0xBD, 0x83, 0x11, 0xB8, 0x73, 0x3F, 0xAA, 0x07, 0x8D + .byte 0xF4, 0x42, 0x4D, 0xE7, 0x40, 0x9D, 0x1C, 0x37 + +ov00_022171B8: + .asciz "ZA, Western Cape, Cape Town, Thawte Consulting cc, Certification Services Division, Thawte Premium Server CA, premium-server@thawte.com" + + .balign 4, 0 +ov00_02217240: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02217244: + .word ov00_02217258 + .word 0x00000080 + .word ov00_022182D8 + .word 0x00000003 + .word ov00_02217240 + +ov00_02217258: + .asciz "ZA, Western Cape, Cape Town, Thawte Consulting cc, Certification Services Division, Thawte Server CA, server-certs@thawte.com" + + .balign 4, 0 +ov00_022182D8: + .byte 0xD3, 0xA4, 0x50, 0x6E, 0xC8, 0xFF, 0x56, 0x6B + .byte 0xE6, 0xCF, 0x5D, 0xB6, 0xEA, 0x0C, 0x68, 0x75, 0x47, 0xA2, 0xAA, 0xC2, 0xDA, 0x84, 0x25, 0xFC + .byte 0xA8, 0xF4, 0x47, 0x51, 0xDA, 0x85, 0xB5, 0x20, 0x74, 0x94, 0x86, 0x1E, 0x0F, 0x75, 0xC9, 0xE9 + .byte 0x08, 0x61, 0xF5, 0x06, 0x6D, 0x30, 0x6E, 0x15, 0x19, 0x02, 0xE9, 0x52, 0xC0, 0x62, 0xDB, 0x4D + .byte 0x99, 0x9E, 0xE2, 0x6A, 0x0C, 0x44, 0x38, 0xCD, 0xFE, 0xBE, 0xE3, 0x64, 0x09, 0x70, 0xC5, 0xFE + .byte 0xB1, 0x6B, 0x29, 0xB6, 0x2F, 0x49, 0xC8, 0x3B, 0xD4, 0x27, 0x04, 0x25, 0x10, 0x97, 0x2F, 0xE7 + .byte 0x90, 0x6D, 0xC0, 0x28, 0x42, 0x99, 0xD7, 0x4C, 0x43, 0xDE, 0xC3, 0xF5, 0x21, 0x6D, 0x54, 0x9F + .byte 0x5D, 0xC3, 0x58, 0xE1, 0xC0, 0xE4, 0xD9, 0x5B, 0xB0, 0xB8, 0xDC, 0xB4, 0x7B, 0xDF, 0x36, 0x3A + .byte 0xC2, 0xB5, 0x66, 0x22, 0x12, 0xD6, 0x87, 0x0D + + .balign 4, 0 +ov00_02217358: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_0221735C: + .word ov00_022173F0 + .word 0x00000080 + .word ov00_02217370 + .word 0x00000003 + .word ov00_02217358 + +ov00_02217370: + .byte 0xCC, 0x5E, 0xD1, 0x11, 0x5D, 0x5C, 0x69, 0xD0, 0xAB, 0xD3, 0xB9, 0x6A, 0x4C, 0x99, 0x1F, 0x59 + .byte 0x98, 0x30, 0x8E, 0x16, 0x85, 0x20, 0x46, 0x6D, 0x47, 0x3F, 0xD4, 0x85, 0x20, 0x84, 0xE1, 0x6D + .byte 0xB3, 0xF8, 0xA4, 0xED, 0x0C, 0xF1, 0x17, 0x0F, 0x3B, 0xF9, 0xA7, 0xF9, 0x25, 0xD7, 0xC1, 0xCF + .byte 0x84, 0x63, 0xF2, 0x7C, 0x63, 0xCF, 0xA2, 0x47, 0xF2, 0xC6, 0x5B, 0x33, 0x8E, 0x64, 0x40, 0x04 + .byte 0x68, 0xC1, 0x80, 0xB9, 0x64, 0x1C, 0x45, 0x77, 0xC7, 0xD8, 0x6E, 0xF5, 0x95, 0x29, 0x3C, 0x50 + .byte 0xE8, 0x34, 0xD7, 0x78, 0x1F, 0xA8, 0xBA, 0x6D, 0x43, 0x91, 0x95, 0x8F, 0x45, 0x57, 0x5E, 0x7E + .byte 0xC5, 0xFB, 0xCA, 0xA4, 0x04, 0xEB, 0xEA, 0x97, 0x37, 0x54, 0x30, 0x6F, 0xBB, 0x01, 0x47, 0x32 + .byte 0x33, 0xCD, 0xDC, 0x57, 0x9B, 0x64, 0x69, 0x61, 0xF8, 0x9B, 0x1D, 0x1C, 0x89, 0x4F, 0x5C, 0x67 + +ov00_022173F0: + .asciz "US, VeriSign, Inc., Class 3 Public Primary Certification Authority - G2, (c) 1998 VeriSign, Inc. - For authorized use only, VeriSign Trust Network" + .balign 4, 0 + + .balign 4, 0 +ov00_02217484: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02217488: + .word ov00_0221749C + .word 0x00000100 + .word ov00_02217538 + .word 0x00000003 + .word ov00_02217484 + +ov00_0221749C: + .asciz "US, VeriSign, Inc., VeriSign Trust Network, (c) 1999 VeriSign, Inc. - For authorized use only, VeriSign Class 3 Public Primary Certification Authority - G3" + .balign 4, 0 + +ov00_02217538: + .byte 0xCB, 0xBA, 0x9C, 0x52, 0xFC, 0x78, 0x1F, 0x1A + .byte 0x1E, 0x6F, 0x1B, 0x37, 0x73, 0xBD, 0xF8, 0xC9, 0x6B, 0x94, 0x12, 0x30, 0x4F, 0xF0, 0x36, 0x47 + .byte 0xF5, 0xD0, 0x91, 0x0A, 0xF5, 0x17, 0xC8, 0xA5, 0x61, 0xC1, 0x16, 0x40, 0x4D, 0xFB, 0x8A, 0x61 + .byte 0x90, 0xE5, 0x76, 0x20, 0xC1, 0x11, 0x06, 0x7D, 0xAB, 0x2C, 0x6E, 0xA6, 0xF5, 0x11, 0x41, 0x8E + .byte 0xFA, 0x2D, 0xAD, 0x2A, 0x61, 0x59, 0xA4, 0x67, 0x26, 0x4C, 0xD0, 0xE8, 0xBC, 0x52, 0x5B, 0x70 + .byte 0x20, 0x04, 0x58, 0xD1, 0x7A, 0xC9, 0xA4, 0x69, 0xBC, 0x83, 0x17, 0x64, 0xAD, 0x05, 0x8B, 0xBC + .byte 0xD0, 0x58, 0xCE, 0x8D, 0x8C, 0xF5, 0xEB, 0xF0, 0x42, 0x49, 0x0B, 0x9D, 0x97, 0x27, 0x67, 0x32 + .byte 0x6E, 0xE1, 0xAE, 0x93, 0x15, 0x1C, 0x70, 0xBC, 0x20, 0x4D, 0x2F, 0x18, 0xDE, 0x92, 0x88, 0xE8 + .byte 0x6C, 0x85, 0x57, 0x11, 0x1A, 0xE9, 0x7E, 0xE3, 0x26, 0x11, 0x54, 0xA2, 0x45, 0x96, 0x55, 0x83 + .byte 0xCA, 0x30, 0x89, 0xE8, 0xDC, 0xD8, 0xA3, 0xED, 0x2A, 0x80, 0x3F, 0x7F, 0x79, 0x65, 0x57, 0x3E + .byte 0x15, 0x20, 0x66, 0x08, 0x2F, 0x95, 0x93, 0xBF, 0xAA, 0x47, 0x2F, 0xA8, 0x46, 0x97, 0xF0, 0x12 + .byte 0xE2, 0xFE, 0xC2, 0x0A, 0x2B, 0x51, 0xE6, 0x76, 0xE6, 0xB7, 0x46, 0xB7, 0xE2, 0x0D, 0xA6, 0xCC + .byte 0xA8, 0xC3, 0x4C, 0x59, 0x55, 0x89, 0xE6, 0xE8, 0x53, 0x5C, 0x1C, 0xEA, 0x9D, 0xF0, 0x62, 0x16 + .byte 0x0B, 0xA7, 0xC9, 0x5F, 0x0C, 0xF0, 0xDE, 0xC2, 0x76, 0xCE, 0xAF, 0xF7, 0x6A, 0xF2, 0xFA, 0x41 + .byte 0xA6, 0xA2, 0x33, 0x14, 0xC9, 0xE5, 0x7A, 0x63, 0xD3, 0x9E, 0x62, 0x37, 0xD5, 0x85, 0x65, 0x9E + .byte 0x0E, 0xE6, 0x53, 0x24, 0x74, 0x1B, 0x5E, 0x1D, 0x12, 0x53, 0x5B, 0xC7, 0x2C, 0xE7, 0x83, 0x49 + .byte 0x3B, 0x15, 0xAE, 0x8A, 0x68, 0xB9, 0x57, 0x97 + + .balign 4, 0 +ov00_02217638: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_0221763C: + .word ov00_02217650 + .word 0x00000080 + .word ov00_02217694 + .word 0x00000003 + .word ov00_02217638 + +ov00_02217650: + .asciz "US, VeriSign, Inc., Class 3 Public Primary Certification Authority" + .balign 4, 0 + +ov00_02217694: + .byte 0xC9, 0x5C, 0x59, 0x9E, 0xF2, 0x1B, 0x8A, 0x01, 0x14, 0xB4, 0x10, 0xDF + .byte 0x04, 0x40, 0xDB, 0xE3, 0x57, 0xAF, 0x6A, 0x45, 0x40, 0x8F, 0x84, 0x0C, 0x0B, 0xD1, 0x33, 0xD9 + .byte 0xD9, 0x11, 0xCF, 0xEE, 0x02, 0x58, 0x1F, 0x25, 0xF7, 0x2A, 0xA8, 0x44, 0x05, 0xAA, 0xEC, 0x03 + .byte 0x1F, 0x78, 0x7F, 0x9E, 0x93, 0xB9, 0x9A, 0x00, 0xAA, 0x23, 0x7D, 0xD6, 0xAC, 0x85, 0xA2, 0x63 + .byte 0x45, 0xC7, 0x72, 0x27, 0xCC, 0xF4, 0x4C, 0xC6, 0x75, 0x71, 0xD2, 0x39, 0xEF, 0x4F, 0x42, 0xF0 + .byte 0x75, 0xDF, 0x0A, 0x90, 0xC6, 0x8E, 0x20, 0x6F, 0x98, 0x0F, 0xF8, 0xAC, 0x23, 0x5F, 0x70, 0x29 + .byte 0x36, 0xA4, 0xC9, 0x86, 0xE7, 0xB1, 0x9A, 0x20, 0xCB, 0x53, 0xA5, 0x85, 0xE7, 0x3D, 0xBE, 0x7D + .byte 0x9A, 0xFE, 0x24, 0x45, 0x33, 0xDC, 0x76, 0x15, 0xED, 0x0F, 0xA2, 0x71, 0x64, 0x4C, 0x65, 0x2E + .byte 0x81, 0x68, 0x45, 0xA7 + + .balign 4, 0 +ov00_02217714: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_02217718: + .word ov00_0221772C + .word 0x0000007D + .word ov00_02217770 + .word 0x00000003 + .word ov00_02217714 + +ov00_0221772C: + .asciz "US, RSA Data Security, Inc., Secure Server Certification Authority" + .balign 4, 0 + +ov00_02217770: + .byte 0x92, 0xCE, 0x7A, 0xC1, 0xAE, 0x83, 0x3E, 0x5A, 0xAA, 0x89, 0x83, 0x57, 0xAC, 0x25, 0x01, 0x76 + .byte 0x0C, 0xAD, 0xAE, 0x8E, 0x2C, 0x37, 0xCE, 0xEB, 0x35, 0x78, 0x64, 0x54, 0x03, 0xE5, 0x84, 0x40 + .byte 0x51, 0xC9, 0xBF, 0x8F, 0x08, 0xE2, 0x8A, 0x82, 0x08, 0xD2, 0x16, 0x86, 0x37, 0x55, 0xE9, 0xB1 + .byte 0x21, 0x02, 0xAD, 0x76, 0x68, 0x81, 0x9A, 0x05, 0xA2, 0x4B, 0xC9, 0x4B, 0x25, 0x66, 0x22, 0x56 + .byte 0x6C, 0x88, 0x07, 0x8F, 0xF7, 0x81, 0x59, 0x6D, 0x84, 0x07, 0x65, 0x70, 0x13, 0x71, 0x76, 0x3E + .byte 0x9B, 0x77, 0x4C, 0xE3, 0x50, 0x89, 0x56, 0x98, 0x48, 0xB9, 0x1D, 0xA7, 0x29, 0x1A, 0x13, 0x2E + .byte 0x4A, 0x11, 0x59, 0x9C, 0x1E, 0x15, 0xD5, 0x49, 0x54, 0x2C, 0x73, 0x3A, 0x69, 0x82, 0xB1, 0x97 + .byte 0x39, 0x9C, 0x6D, 0x70, 0x67, 0x48, 0xE5, 0xDD, 0x2D, 0xD6, 0xC8, 0x1E, 0x7B + + .balign 4, 0 +ov00_022177F0: + .byte 0x01, 0x00, 0x01 + .balign 4, 0 + +ov00_022177F4: + .word ov00_02217808 + .word 0x00000100 + .word ov00_02217838 + .word 0x00000003 + .word ov00_022177F0 + +ov00_02217808: + .asciz "GlobalSign Root CA - R2, GlobalSign, GlobalSign" + .balign 4, 0 + +ov00_02217838: + .byte 0xA6, 0xCF, 0x24, 0x0E, 0xBE, 0x2E, 0x6F, 0x28 + .byte 0x99, 0x45, 0x42, 0xC4, 0xAB, 0x3E, 0x21, 0x54, 0x9B, 0x0B, 0xD3, 0x7F, 0x84, 0x70, 0xFA, 0x12 + .byte 0xB3, 0xCB, 0xBF, 0x87, 0x5F, 0xC6, 0x7F, 0x86, 0xD3, 0xB2, 0x30, 0x5C, 0xD6, 0xFD, 0xAD, 0xF1 + .byte 0x7B, 0xDC, 0xE5, 0xF8, 0x60, 0x96, 0x09, 0x92, 0x10, 0xF5, 0xD0, 0x53, 0xDE, 0xFB, 0x7B, 0x7E + .byte 0x73, 0x88, 0xAC, 0x52, 0x88, 0x7B, 0x4A, 0xA6, 0xCA, 0x49, 0xA6, 0x5E, 0xA8, 0xA7, 0x8C, 0x5A + .byte 0x11, 0xBC, 0x7A, 0x82, 0xEB, 0xBE, 0x8C, 0xE9, 0xB3, 0xAC, 0x96, 0x25, 0x07, 0x97, 0x4A, 0x99 + .byte 0x2A, 0x07, 0x2F, 0xB4, 0x1E, 0x77, 0xBF, 0x8A, 0x0F, 0xB5, 0x02, 0x7C, 0x1B, 0x96, 0xB8, 0xC5 + .byte 0xB9, 0x3A, 0x2C, 0xBC, 0xD6, 0x12, 0xB9, 0xEB, 0x59, 0x7D, 0xE2, 0xD0, 0x06, 0x86, 0x5F, 0x5E + .byte 0x49, 0x6A, 0xB5, 0x39, 0x5E, 0x88, 0x34, 0xEC, 0xBC, 0x78, 0x0C, 0x08, 0x98, 0x84, 0x6C, 0xA8 + .byte 0xCD, 0x4B, 0xB4, 0xA0, 0x7D, 0x0C, 0x79, 0x4D, 0xF0, 0xB8, 0x2D, 0xCB, 0x21, 0xCA, 0xD5, 0x6C + .byte 0x5B, 0x7D, 0xE1, 0xA0, 0x29, 0x84, 0xA1, 0xF9, 0xD3, 0x94, 0x49, 0xCB, 0x24, 0x62, 0x91, 0x20 + .byte 0xBC, 0xDD, 0x0B, 0xD5, 0xD9, 0xCC, 0xF9, 0xEA, 0x27, 0x0A, 0x2B, 0x73, 0x91, 0xC6, 0x9D, 0x1B + .byte 0xAC, 0xC8, 0xCB, 0xE8, 0xE0, 0xA0, 0xF4, 0x2F, 0x90, 0x8B, 0x4D, 0xFB, 0xB0, 0x36, 0x1B, 0xF6 + .byte 0x19, 0x7A, 0x85, 0xE0, 0x6D, 0xF2, 0x61, 0x13, 0x88, 0x5C, 0x9F, 0xE0, 0x93, 0x0A, 0x51, 0x97 + .byte 0x8A, 0x5A, 0xCE, 0xAF, 0xAB, 0xD5, 0xF7, 0xAA, 0x09, 0xAA, 0x60, 0xBD, 0xDC, 0xD9, 0x5F, 0xDF + .byte 0x72, 0xA9, 0x60, 0x13, 0x5E, 0x00, 0x01, 0xC9, 0x4A, 0xFA, 0x3F, 0xA4, 0xEA, 0x07, 0x03, 0x21 + .byte 0x02, 0x8E, 0x82, 0xCA, 0x03, 0xC2, 0x9B, 0x8F + .balign 4, 0 +ov00_02217938: + .asciz "https://nas.test.nintendowifi.net/ac" + .balign 4, 0 +ov00_02217960: + .asciz "https://nas.dev.nintendowifi.net/ac" + .balign 4, 0 +ov00_02217984: + .asciz "https://nas.nintendowifi.net/ac" + .balign 4, 0 +ov00_022179A4: + .asciz "0000" + .balign 4, 0 +ov00_022179AC: + .asciz "" + .balign 4, 0 +ov00_022179B0: + .asciz "https:///download" + .balign 4, 0 +ov00_022179C4: + .asciz "https://%s/download" + .balign 4, 0 +ov00_022179D8: + .asciz "9000" + .balign 4, 0 +ov00_022179E0: + .asciz "%c%s%c%s" + .balign 4, 0 +ov00_022179EC: + .asciz "SCM" + .balign 4, 0 +ov00_022179F0: + .asciz "SCN" + .balign 4, 0 +ov00_022179F4: + .asciz "" + .balign 4, 0 +ov00_022179F8: + .asciz "GPCM" + .balign 4, 0 +ov00_02217A00: + .asciz "MAT" + .balign 4, 0 +ov00_02217A04: + .asciz "" + .balign 4, 0 +ov00_02217A08: + .asciz "SCM" + .balign 4, 0 +ov00_02217A0C: + .asciz "SCN" + .balign 4, 0 +ov00_02217A10: + .asciz "I have authorized your request to add me to your list" + .balign 4, 0 +ov00_02217A48: + .asciz "" + .balign 4, 0 +ov00_02217A4C: + .asciz "%c%c%c%c" + .balign 4, 0 +ov00_02217A58: + .asciz " and ()" + .balign 4, 0 +ov00_02217A60: + .asciz "" + .balign 4, 0 +ov00_02217A64: + .asciz "%u" + .balign 4, 0 +ov00_02217A68: + .asciz "FME" + .balign 4, 0 +ov00_02217A6C: + .asciz "MDF" + .balign 4, 0 +ov00_02217A70: + .asciz "VER" + .balign 4, 0 +ov00_02217A74: + .asciz "Init state" + .balign 4, 0 +ov00_02217A80: + .asciz "Server full" + .balign 4, 0 +ov00_02217A8C: + .asciz "Unknown connect attempt" + .balign 4, 0 +ov00_02217AA4: + .asciz "SCM" + .balign 4, 0 +ov00_02217AA8: + .asciz "SCN" + .balign 4, 0 +ov00_02217AAC: + .asciz "dwc_pid" + .balign 4, 0 +ov00_02217AB4: + .asciz "dwc_mtype" + .balign 4, 0 +ov00_02217AC0: + .asciz "dwc_mresv" + .balign 4, 0 +ov00_02217ACC: + .asciz "dwc_mver" + .balign 4, 0 +ov00_02217AD8: + .asciz "dwc_eval" + .balign 4, 0 +ov00_02217AE4: + .asciz " and (%s)" + .balign 4, 0 +ov00_02217AF0: + .asciz "%s = %u" + .balign 4, 0 +ov00_02217AF8: + .asciz "%s = %d and %s != %u and maxplayers = %d and numplayers < %d and %s = %d and %s != %s" + .balign 4, 0 +ov00_02217B50: + .asciz "/%u" + .balign 4, 0 +ov00_02217B54: + .asciz "SBCM" + .balign 4, 0 +ov00_02217B5C: + .asciz "%s%dv%s" + .balign 4, 0 +ov00_02217B64: + .asciz "GPCM" + .balign 4, 0 +ov00_02217B6C: + .asciz "MAT" + .balign 4, 0 +ov00_02217B70: + .asciz "numplayers" + .balign 4, 0 +ov00_02217B7C: + .asciz "maxplayers" + .balign 4, 0 +ov00_02217B88: + .asciz "DT" + .balign 4, 0 +ov00_02217B8C: + .asciz "NWCUSBAP" + .balign 4, 0 +ov00_02217B98: + .asciz "NINTENDO-DS" + .balign 4, 0 +ov00_02217BA4: + .word ov00_02217BF0 + .word ov00_02217BB4 + .word ov00_02217BD4 + .word ov00_02217BC4 +ov00_02217BB4: + .asciz "gwi'6&fs=0Nf~" + .balign 4, 0 +ov00_02217BC4: + .asciz "%(egEr)ag(s&m" + .balign 4, 0 +ov00_02217BD4: + .asciz "952uybjnpmu903bia@bk5m[-" + .balign 4, 0 +ov00_02217BF0: + .asciz "38g6zxjk20gvmv]6^=j&%vY1" + .balign 4, 0 +ov00_02217C0C: + .asciz "NDWCSHAP" + .balign 4, 0 +ov00_02217C18: + .asciz "NWCUSBAP" + .balign 4, 0 +ov00_02217C24: + .asciz "%s.available.gs.nintendowifi.net" + .balign 4, 0 +ov00_02217C48: + .byte 0xFE, 0xFD, 0x09, 0x00 +ov00_02217C4C: + .asciz "ArrayMap" + .balign 4, 0 +ov00_02217C58: + .asciz "ArrayNth" + .balign 4, 0 +ov00_02217C64: + .asciz "ArrayNew" + .balign 4, 0 +ov00_02217C70: + .asciz "ArrayFree" + .balign 4, 0 +ov00_02217C7C: + .asciz "ArrayGrow" + .balign 4, 0 +ov00_02217C88: + .asciz "ArrayAppend" + .balign 4, 0 +ov00_02217C94: + .asciz "ArrayRemoveAt" + .balign 4, 0 +ov00_02217CA4: + .asciz "ArrayDeleteAt" + .balign 4, 0 +ov00_02217CB4: + .asciz "ArrayInsertAt" + .balign 4, 0 +ov00_02217CC4: + .asciz "ArrayReplaceAt" + .balign 4, 0 +ov00_02217CD4: + .asciz "ArrayMapBackwards" + .balign 4, 0 +ov00_02217CE8: + .asciz "ArrayInsertSorted" + .balign 4, 0 +ov00_02217CFC: + .asciz "ArrayMapBackwards2" + .balign 4, 0 +ov00_02217D10: + .asciz "array->list" + .balign 4, 0 +ov00_02217D1C: + .asciz "darray.c" + .balign 4, 0 +ov00_02217D28: + .asciz "array" + .balign 4, 0 +ov00_02217D30: + .asciz "elemSize" + .balign 4, 0 +ov00_02217D3C: + .asciz "(n >= 0) && (n < array->count)" + .balign 4, 0 +ov00_02217D5C: + .asciz "(n >= 0) && (n <= array->count)" + .balign 4, 0 +ov00_02217D7C: + .asciz "comparator" + .balign 4, 0 +ov00_02217D88: + .asciz "fn" + .balign 4, 0 +ov00_02217D8C: + .asciz "TableMap" + .balign 4, 0 +ov00_02217D98: + .asciz "TableNew2" + .balign 4, 0 +ov00_02217DA4: + .asciz "TableFree" + .balign 4, 0 +ov00_02217DB0: + .asciz "TableEnter" + .balign 4, 0 +ov00_02217DBC: + .asciz "TableCount" + .balign 4, 0 +ov00_02217DC8: + .asciz "TableRemove" + .balign 4, 0 +ov00_02217DD4: + .asciz "TableLookup" + .balign 4, 0 +ov00_02217DE0: + .asciz "TableMapSafe" + .balign 4, 0 +ov00_02217DF0: + .asciz "TableMapSafe2" + .balign 4, 0 +ov00_02217E00: + .asciz "hashFn" + .balign 4, 0 +ov00_02217E08: + .asciz "hashtable.c" + .balign 4, 0 +ov00_02217E14: + .asciz "compFn" + .balign 4, 0 +ov00_02217E1C: + .asciz "elemSize" + .balign 4, 0 +ov00_02217E28: + .asciz "nBuckets" + .balign 4, 0 +ov00_02217E34: + .asciz "table" + .balign 4, 0 +ov00_02217E3C: + .asciz "table->buckets" + .balign 4, 0 +ov00_02217E4C: + .asciz "fn" + .balign 4, 0 +ov00_02217E50: + .asciz "%02x" + .balign 4, 0 +ov00_02217E58: + .asciz "" + .balign 4, 0 +ov00_02217E5C: + .asciz "time" + .balign 4, 0 +ov00_02217E64: + .asciz "current_time" + .balign 4, 0 +ov00_02217E74: + .asciz "OS_IsTickAvailable() == TRUE" + .balign 4, 0 +ov00_02217E94: + .asciz "nonport.c" + .balign 4, 0 +ov00_02217EA0: + .asciz "localhost" + .balign 4, 0 +ov00_02217EAC: + .asciz "gpGetBuddyStatus" + .balign 4, 0 +ov00_02217EC0: + .asciz "Invalid func." + .balign 4, 0 +ov00_02217ED0: + .asciz "No callback." + .balign 4, 0 +ov00_02217EE0: + .asciz "" + .balign 4, 0 +ov00_02217EE4: + .asciz "The connection has already been disconnected." + .balign 4, 0 +ov00_02217F14: + .asciz "Invalid reason." + .balign 4, 0 +ov00_02217F24: + .asciz "\\addbuddy\\" + .balign 4, 0 +ov00_02217F30: + .asciz "\\sesskey\\" + .balign 4, 0 +ov00_02217F3C: + .asciz "\\newprofileid\\" + .balign 4, 0 +ov00_02217F4C: + .asciz "\\reason\\" + .balign 4, 0 +ov00_02217F58: + .asciz "\\final\\" + .balign 4, 0 +ov00_02217F60: + .asciz "Invalid status." + .balign 4, 0 +ov00_02217F70: + .asciz "Invalid index." + .balign 4, 0 +ov00_02217F80: + .asciz "buddyStatus" + .balign 4, 0 +ov00_02217F8C: + .asciz "gp.c" + .balign 4, 0 +ov00_02217F94: + .asciz "Invalid statusString." + .balign 4, 0 +ov00_02217FAC: + .asciz "Invalid locationString." + .balign 4, 0 +ov00_02217FC4: + .asciz "\\status\\" + .balign 4, 0 +ov00_02217FD0: + .asciz "\\statstring\\" + .balign 4, 0 +ov00_02217FE0: + .asciz "\\locstring\\" + .balign 4, 0 +ov00_02217FEC: + .asciz "Invalid message." + .balign 4, 0 +ov00_02218000: + .asciz "gpiProcess" + .balign 4, 0 +ov00_0221800C: + .asciz "\n\n\n\n\n*************\ngpiInitialize\n" + .balign 4, 0 +ov00_02218030: + .asciz "CM" + .balign 4, 0 +ov00_02218034: + .asciz "There was an error reading from the server." + .balign 4, 0 +ov00_02218060: + .asciz "\\final\\" + .balign 4, 0 +ov00_02218068: + .asciz "CMD: %s\n" + .balign 4, 0 +ov00_02218074: + .asciz "Out of memory." + .balign 4, 0 +ov00_02218084: + .asciz "\\id\\" + .balign 4, 0 +ov00_0221808C: + .asciz "No matching operation found for id %d\n" + .balign 4, 0 +ov00_022180B4: + .asciz "\\bm\\" + .balign 4, 0 +ov00_022180BC: + .asciz "\\ka\\" + .balign 4, 0 +ov00_022180C4: + .asciz "Received an unrecognized, unsolicited message.\n" + .balign 4, 0 +ov00_022180F4: + .asciz "The server has closed the connection." + .balign 4, 0 +ov00_0221811C: + .asciz "(iconnection->connectState == GPI_NOT_CONNECTED) || (iconnection->connectState == GPI_CONNECTING) || (iconnection->connectState == GPI_NEGOTIATING) || (iconnection->connectState == GPI_CONNECTED) || (iconnection->connectState == GPI_DISCONNECTED)" + .balign 4, 0 +ov00_02218214: + .asciz "gpi.c" + .balign 4, 0 +ov00_0221821C: + .asciz "0" + .balign 4, 0 +ov00_02218220: + .asciz "gpiDeleteBuddy" + .balign 4, 0 +ov00_02218230: + .asciz "\\authadd\\" + .balign 4, 0 +ov00_0221823C: + .asciz "\\sesskey\\" + .balign 4, 0 +ov00_02218248: + .asciz "\\fromprofileid\\" + .balign 4, 0 +ov00_02218258: + .asciz "\\sig\\" + .balign 4, 0 +ov00_02218260: + .asciz "\\final\\" + .balign 4, 0 +ov00_02218268: + .asciz "\\bm\\" + .balign 4, 0 +ov00_02218270: + .asciz "Unexpected data was received from the server." + .balign 4, 0 +ov00_022182A0: + .asciz "\\f\\" + .balign 4, 0 +ov00_022182A4: + .asciz "\\date\\" + .balign 4, 0 +ov00_022182AC: + .asciz "Out of memory." + .balign 4, 0 +ov00_022182BC: + .asciz "\\msg\\" + .balign 4, 0 +ov00_022182C4: + .asciz "|signed|" + .balign 4, 0 +ov00_022182D0: + .asciz "|s|" + .balign 4, 0 +ov00_022182D4: + .asciz "|ss|" + .balign 4, 0 +ov00_022182DC: + .asciz "|ls|" + .balign 4, 0 +ov00_022182E4: + .asciz "|ip|" + .balign 4, 0 +ov00_022182EC: + .asciz "|p|" + .balign 4, 0 +ov00_022182F0: + .asciz "|l|" + .balign 4, 0 +ov00_022182F4: + .asciz "1" + .balign 4, 0 +ov00_022182F8: + .asciz "\\t\\" + .balign 4, 0 +ov00_022182FC: + .asciz "Invalid profile." + .balign 4, 0 +ov00_02218310: + .asciz "\\delbuddy\\" + .balign 4, 0 +ov00_0221831C: + .asciz "\\delprofileid\\" + .balign 4, 0 +ov00_0221832C: + .asciz "index >= 0" + .balign 4, 0 +ov00_02218338: + .asciz "gpiBuddy.c" + .balign 4, 0 +ov00_02218344: + .asciz "iconnection->profileList.numBuddies >= 0" + .balign 4, 0 +ov00_02218370: + .asciz "gpiRecvToBuffer" + .balign 4, 0 +ov00_02218380: + .asciz "gpiSendFromBuffer" + .balign 4, 0 +ov00_02218394: + .asciz "gpiSendOrBufferChar" + .balign 4, 0 +ov00_022183A8: + .asciz "gpiAppendCharToBuffer" + .balign 4, 0 +ov00_022183C0: + .asciz "gpiSendOrBufferStringLen" + .balign 4, 0 +ov00_022183DC: + .asciz "gpiAppendStringToBufferLen" + .balign 4, 0 +ov00_022183F8: + .asciz "outputBuffer != NULL" + .balign 4, 0 +ov00_02218410: + .asciz "gpiBuffer.c" + .balign 4, 0 +ov00_0221841C: + .asciz "Out of memory." + .balign 4, 0 +ov00_0221842C: + .asciz "string != NULL" + .balign 4, 0 +ov00_0221843C: + .asciz "stringLen >= 0" + .balign 4, 0 +ov00_0221844C: + .asciz "%d" + .balign 4, 0 +ov00_02218450: + .asciz "There was an error sending on a socket." + .balign 4, 0 +ov00_02218478: + .asciz "SENDXXXX(%s): Connection closed\n" + .balign 4, 0 +ov00_0221849C: + .asciz "peer->outputBuffer.buffer != NULL" + .balign 4, 0 +ov00_022184C0: + .asciz "PT" + .balign 4, 0 +ov00_022184C4: + .asciz "sock != INVALID_SOCKET" + .balign 4, 0 +ov00_022184DC: + .asciz "inputBuffer != NULL" + .balign 4, 0 +ov00_022184F0: + .asciz "bytesRead != NULL" + .balign 4, 0 +ov00_02218504: + .asciz "connClosed != NULL" + .balign 4, 0 +ov00_02218518: + .asciz "There was an error reading from a socket." + .balign 4, 0 +ov00_02218544: + .asciz "RECVXXXX(%s): Connection closed\n" + .balign 4, 0 +ov00_02218568: + .asciz "RECVTOTL(%s): %d\n" + .balign 4, 0 +ov00_0221857C: + .asciz "len >= 0" + .balign 4, 0 +ov00_02218588: + .asciz "pos >= 0" + .balign 4, 0 +ov00_02218594: + .asciz "pos <= len" + .balign 4, 0 +ov00_022185A0: + .asciz "\\msg\\" + .balign 4, 0 +ov00_022185A8: + .asciz "\\m\\" + .balign 4, 0 +ov00_022185AC: + .asciz "\\len\\" + .balign 4, 0 +ov00_022185B4: + .asciz "gpiCallCallback" + .balign 4, 0 +ov00_022185C4: + .asciz "gpiCallErrorCallback" + .balign 4, 0 +ov00_022185DC: + .asciz "iconnection != NULL" + .balign 4, 0 +ov00_022185F0: + .asciz "gpiCallback.c" + .balign 4, 0 +ov00_02218600: + .asciz "result != GP_NO_ERROR" + .balign 4, 0 +ov00_02218618: + .asciz "(fatal == GP_FATAL) || (fatal == GP_NON_FATAL)" + .balign 4, 0 +ov00_02218648: + .asciz "Out of memory." + .balign 4, 0 +ov00_02218658: + .asciz "data->callback.callback != NULL" + .balign 4, 0 +ov00_02218678: + .asciz "data->arg != NULL" + .balign 4, 0 +ov00_0221868C: + .asciz "gpiStartConnect" + .balign 4, 0 +ov00_0221869C: + .asciz "gpiCheckConnect" + .balign 4, 0 +ov00_022186AC: + .asciz "gpcm.gs.nintendowifi.net" + .balign 4, 0 + .space 0x40-(.-ov00_022186AC) +ov00_022186EC: + .asciz "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + .balign 4, 0 +ov00_0221872C: + .asciz "There was an error creating a socket." + .balign 4, 0 +ov00_02218754: + .asciz "There was an error making a socket non-blocking." + .balign 4, 0 +ov00_02218788: + .asciz "There was an error binding a socket." + .balign 4, 0 +ov00_022187B0: + .asciz "There was an error listening on a socket." + .balign 4, 0 +ov00_022187DC: + .asciz "There was an error getting a socket's addres." + .balign 4, 0 +ov00_0221880C: + .asciz "Could not resolve connection mananger host name." + .balign 4, 0 +ov00_02218840: + .asciz "address.sin_addr.s_addr != 0" + .balign 4, 0 +ov00_02218860: + .asciz "gpiConnect.c" + .balign 4, 0 +ov00_02218870: + .asciz "There was an error connecting a socket." + .balign 4, 0 +ov00_02218898: + .asciz "Invalid connection." + .balign 4, 0 +ov00_022188AC: + .asciz "Invalid firewall." + .balign 4, 0 +ov00_022188C0: + .asciz "Out of memory." + .balign 4, 0 +ov00_022188D0: + .asciz "%s@%s" + .balign 4, 0 +ov00_022188D8: + .asciz "%s%s%s%s%s%s" + .balign 4, 0 +ov00_022188E8: + .asciz " " + .balign 4, 0 +ov00_0221891C: + .asciz "\\login\\" + .balign 4, 0 +ov00_02218924: + .asciz "\\challenge\\" + .balign 4, 0 +ov00_02218930: + .asciz "\\authtoken\\" + .balign 4, 0 +ov00_0221893C: + .asciz "\\uniquenick\\" + .balign 4, 0 +ov00_0221894C: + .asciz "\\user\\" + .balign 4, 0 +ov00_02218954: + .asciz "@" + .balign 4, 0 +ov00_02218958: + .asciz "\\userid\\" + .balign 4, 0 +ov00_02218964: + .asciz "\\profileid\\" + .balign 4, 0 +ov00_02218970: + .asciz "\\response\\" + .balign 4, 0 +ov00_0221897C: + .asciz "\\firewall\\1" + .balign 4, 0 +ov00_02218988: + .asciz "\\port\\" + .balign 4, 0 +ov00_02218990: + .asciz "\\productid\\" + .balign 4, 0 +ov00_0221899C: + .asciz "\\gamename\\" + .balign 4, 0 +ov00_022189A8: + .asciz "\\namespaceid\\" + .balign 4, 0 +ov00_022189B8: + .asciz "\\id\\1" + .balign 4, 0 +ov00_022189C0: + .asciz "\\final\\" + .balign 4, 0 +ov00_022189C8: + .asciz "\\newuser\\" + .balign 4, 0 +ov00_022189D4: + .asciz "\\email\\" + .balign 4, 0 +ov00_022189DC: + .asciz "\\nick\\" + .balign 4, 0 +ov00_022189E4: + .asciz "\\passwordenc\\" + .balign 4, 0 +ov00_022189F4: + .asciz "\\cdkeyenc\\" + .balign 4, 0 +ov00_02218A00: + .asciz "\\pid\\" + .balign 4, 0 +ov00_02218A08: + .asciz "\\fatal\\" + .balign 4, 0 +ov00_02218A10: + .asciz "\\lc\\1" + .balign 4, 0 +ov00_02218A18: + .asciz "Unexpected data was received from the server." + .balign 4, 0 +ov00_02218A48: + .asciz "\\nur\\" + .balign 4, 0 +ov00_02218A50: + .asciz "Unexepected data was received from the server." + .balign 4, 0 +ov00_02218A80: + .asciz "\\lc\\2" + .balign 4, 0 +ov00_02218A88: + .asciz "\\sesskey\\" + .balign 4, 0 +ov00_02218A94: + .asciz "\\lt\\" + .balign 4, 0 +ov00_02218A9C: + .asciz "\\proof\\" + .balign 4, 0 +ov00_02218AA4: + .asciz "Could not authenticate server." + .balign 4, 0 +ov00_02218AC4: + .asciz "The server has refused the connection." + .balign 4, 0 +ov00_02218AEC: + .asciz "state == GPI_CONNECTED" + .balign 4, 0 +ov00_02218B04: + .asciz "\\logout\\\\sesskey\\" + .balign 4, 0 +ov00_02218B18: + .asciz "CM" + .balign 4, 0 +ov00_02218B1C: + .asciz "gpiIntToDate" + .balign 4, 0 +ov00_02218B2C: + .asciz "gpiProcessGetInfo" + .balign 4, 0 +ov00_02218B40: + .asciz "gpiInfo.c" + .balign 4, 0 +ov00_02218B4C: + .asciz "Invalid date." + .balign 4, 0 +ov00_02218B5C: + .asciz "gpiIsValidDate(d, m, y)" + .balign 4, 0 +ov00_02218B74: + .asciz "\\pi\\" + .balign 4, 0 +ov00_02218B7C: + .asciz "Unexpected data was received from the server." + .balign 4, 0 +ov00_02218BAC: + .asciz "\\profileid\\" + .balign 4, 0 +ov00_02218BB8: + .asciz "profileid > 0" + .balign 4, 0 +ov00_02218BC8: + .asciz "\\nick\\" + .balign 4, 0 +ov00_02218BD0: + .asciz "\\uniquenick\\" + .balign 4, 0 +ov00_02218BE0: + .asciz "\\email\\" + .balign 4, 0 +ov00_02218BE8: + .asciz "\\firstname\\" + .balign 4, 0 +ov00_02218BF4: + .asciz "\\lastname\\" + .balign 4, 0 +ov00_02218C00: + .asciz "\\icquin\\" + .balign 4, 0 +ov00_02218C0C: + .asciz "\\homepage\\" + .balign 4, 0 +ov00_02218C18: + .asciz "\\zipcode\\" + .balign 4, 0 +ov00_02218C24: + .asciz "\\countrycode\\" + .balign 4, 0 +ov00_02218C34: + .asciz "\\lon\\" + .balign 4, 0 +ov00_02218C3C: + .asciz "\\lat\\" + .balign 4, 0 +ov00_02218C44: + .asciz "\\loc\\" + .balign 4, 0 +ov00_02218C4C: + .asciz "\\birthday\\" + .balign 4, 0 +ov00_02218C58: + .asciz "\\sex\\" + .balign 4, 0 +ov00_02218C60: + .asciz "\\pmask\\" + .balign 4, 0 +ov00_02218C68: + .asciz "\\aim\\" + .balign 4, 0 +ov00_02218C70: + .asciz "\\pic\\" + .balign 4, 0 +ov00_02218C78: + .asciz "\\occ\\" + .balign 4, 0 +ov00_02218C80: + .asciz "\\ind\\" + .balign 4, 0 +ov00_02218C88: + .asciz "\\inc\\" + .balign 4, 0 +ov00_02218C90: + .asciz "\\mar\\" + .balign 4, 0 +ov00_02218C98: + .asciz "\\chc\\" + .balign 4, 0 +ov00_02218CA0: + .asciz "\\i1\\" + .balign 4, 0 +ov00_02218CA8: + .asciz "\\o1\\" + .balign 4, 0 +ov00_02218CB0: + .asciz "\\conn\\" + .balign 4, 0 +ov00_02218CB8: + .asciz "\\sig\\" + .balign 4, 0 +ov00_02218CC0: + .asciz "Out of memory." + .balign 4, 0 +ov00_02218CD0: + .asciz "\\updatepro\\\\sesskey\\" + .balign 4, 0 +ov00_02218CE8: + .asciz "\\final\\" + .balign 4, 0 +ov00_02218CF0: + .asciz "\\updateui\\\\sesskey\\" + .balign 4, 0 +ov00_02218D04: + .asciz "Invalid zipcode." + .balign 4, 0 +ov00_02218D18: + .asciz "%d" + .balign 4, 0 +ov00_02218D1C: + .asciz "0" + .balign 4, 0 +ov00_02218D20: + .asciz "1" + .balign 4, 0 +ov00_02218D24: + .asciz "2" + .balign 4, 0 +ov00_02218D28: + .asciz "Invalid sex." + .balign 4, 0 +ov00_02218D38: + .asciz "\\cpubrandid\\" + .balign 4, 0 +ov00_02218D48: + .asciz "\\cpuspeed\\" + .balign 4, 0 +ov00_02218D54: + .asciz "\\memory\\" + .balign 4, 0 +ov00_02218D60: + .asciz "\\videocard1ram\\" + .balign 4, 0 +ov00_02218D70: + .asciz "\\videocard2ram\\" + .balign 4, 0 +ov00_02218D80: + .asciz "\\connectionid\\" + .balign 4, 0 +ov00_02218D90: + .asciz "\\connectionspeed\\" + .balign 4, 0 +ov00_02218DA4: + .asciz "\\hasnetwork\\" + .balign 4, 0 +ov00_02218DB4: + .asciz "Invalid info." + .balign 4, 0 +ov00_02218DC4: + .asciz "Invalid value." + .balign 4, 0 +ov00_02218DD4: + .asciz "\\password\\" + .balign 4, 0 +ov00_02218DE0: + .asciz "Invalid countrycode." + .balign 4, 0 +ov00_02218DF8: + .asciz "\\videocard1string\\" + .balign 4, 0 +ov00_02218E0C: + .asciz "\\videocard2string\\" + .balign 4, 0 +ov00_02218E20: + .asciz "\\osstring\\" + .balign 4, 0 +ov00_02218E2C: + .asciz "\\getprofile\\\\sesskey\\" + .balign 4, 0 +ov00_02218E44: + .asciz "\\id\\" + .balign 4, 0 +ov00_02218E4C: + .asciz "gpiDestroyOperation" + .balign 4, 0 +ov00_02218E60: + .asciz "gpiFailedOpCallback" + .balign 4, 0 +ov00_02218E74: + .asciz "gpiProcessOperation" + .balign 4, 0 +ov00_02218E88: + .asciz "connection != NULL" + .balign 4, 0 +ov00_02218E9C: + .asciz "gpiOperation.c" + .balign 4, 0 +ov00_02218EAC: + .asciz "*connection != NULL" + .balign 4, 0 +ov00_02218EC0: + .asciz "operation != NULL" + .balign 4, 0 +ov00_02218ED4: + .asciz "Out of memory." + .balign 4, 0 +ov00_02218EE4: + .asciz "0" + .balign 4, 0 +ov00_02218EE8: + .asciz "iconnection->numSearches >= 0" + .balign 4, 0 +ov00_02218F08: + .asciz "gpiProcessOperation was passed an operation with an invalid type (%d)\n" + .balign 4, 0 +ov00_02218F50: + .asciz "gpiRemovePeer" + .balign 4, 0 +ov00_02218F60: + .asciz "gpiProcessPeer" + .balign 4, 0 +ov00_02218F70: + .asciz "gpiPeerAddMessage" + .balign 4, 0 +ov00_02218F84: + .asciz "gpiPeerStartTransferMessage" + .balign 4, 0 +ov00_02218FA0: + .asciz "gpiPeerFinishTransferMessage" + .balign 4, 0 +ov00_02218FC0: + .asciz "gpiProcessPeerAcceptingConnection" + .balign 4, 0 +ov00_02218FE4: + .asciz "gpiProcessPeerInitiatingConnection" + .balign 4, 0 +ov00_02219008: + .asciz "Error connecting to a peer." + .balign 4, 0 +ov00_02219024: + .asciz "\\auth\\" + .balign 4, 0 +ov00_0221902C: + .asciz "\\pid\\" + .balign 4, 0 +ov00_02219034: + .asciz "\\nick\\" + .balign 4, 0 +ov00_0221903C: + .asciz "\\sig\\" + .balign 4, 0 +ov00_02219044: + .asciz "\\final\\" + .balign 4, 0 +ov00_0221904C: + .asciz "PR" + .balign 4, 0 +ov00_02219050: + .asciz "\\anack\\" + .balign 4, 0 +ov00_02219058: + .asciz "Error getting buddy authorization." + .balign 4, 0 +ov00_0221907C: + .asciz "\\aack\\" + .balign 4, 0 +ov00_02219084: + .asciz "Error parsing buddy message." + .balign 4, 0 +ov00_022190A4: + .asciz "0" + .balign 4, 0 +ov00_022190A8: + .asciz "gpiPeer.c" + .balign 4, 0 +ov00_022190B4: + .asciz "peer->state == GPI_PEER_WAITING" + .balign 4, 0 +ov00_022190D4: + .asciz "%s%d%d" + .balign 4, 0 +ov00_022190DC: + .asciz "Out of memory." + .balign 4, 0 +ov00_022190EC: + .asciz "1" + .balign 4, 0 +ov00_022190F0: + .asciz "peer->state != GPI_PEER_NOT_CONNECTED" + .balign 4, 0 +ov00_02219118: + .asciz "peer != NULL" + .balign 4, 0 +ov00_02219128: + .asciz "Tried to remove peer not in list." + .balign 4, 0 +ov00_0221914C: + .asciz "There was an error creating a socket." + .balign 4, 0 +ov00_02219174: + .asciz "There was an error making a socket non-blocking." + .balign 4, 0 +ov00_022191A8: + .asciz "There was an error connecting a socket." + .balign 4, 0 +ov00_022191D0: + .asciz "message != NULL" + .balign 4, 0 +ov00_022191E0: + .asciz "\\m\\" + .balign 4, 0 +ov00_022191E4: + .asciz "\\len\\" + .balign 4, 0 +ov00_022191EC: + .asciz "\\msg\\\n" + .balign 4, 0 +ov00_022191F4: + .asciz "transferID" + .balign 4, 0 +ov00_02219200: + .asciz "\\m\\%d\\xfer\\%d %u %u" + .balign 4, 0 +ov00_02219214: + .asciz "" + .balign 4, 0 +ov00_02219218: + .asciz "\\len\\%d\\msg\\\n" + .balign 4, 0 +ov00_02219228: + .asciz "gpiProfileListAdd" + .balign 4, 0 +ov00_0221923C: + .asciz "\\npr\\" + .balign 4, 0 +ov00_02219244: + .asciz "Unexpected data was received from the server." + .balign 4, 0 +ov00_02219274: + .asciz "\\profileid\\" + .balign 4, 0 +ov00_02219280: + .asciz "Out of memory." + .balign 4, 0 +ov00_02219290: + .asciz "id > 0" + .balign 4, 0 +ov00_02219298: + .asciz "gpiProfile.c" + .balign 4, 0 +ov00_022192A8: + .asciz "gpiProcessSearch" + .balign 4, 0 +ov00_022192BC: + .asciz "gpiProcessSearches" + .balign 4, 0 +ov00_022192D0: + .asciz "gpiStartProfileSearch" + .balign 4, 0 +ov00_022192E8: + .asciz "gpsp.gs.nintendowifi.net" + .balign 4, 0 + .space 0x40-(.-ov00_022192E8) +ov00_02219328: + .asciz "Out of memory." + .balign 4, 0 +ov00_02219338: + .asciz "There was an error creating a socket." + .balign 4, 0 +ov00_02219360: + .asciz "There was an error making a socket non-blocking." + .balign 4, 0 +ov00_02219394: + .asciz "Could not resolve search mananger host name." + .balign 4, 0 +ov00_022193C4: + .asciz "address.sin_addr.s_addr != 0" + .balign 4, 0 +ov00_022193E4: + .asciz "gpiSearch.c" + .balign 4, 0 +ov00_022193F0: + .asciz "There was an error connecting a socket." + .balign 4, 0 +ov00_02219418: + .asciz "No search criteria." + .balign 4, 0 +ov00_0221942C: + .asciz "SM" + .balign 4, 0 +ov00_02219430: + .asciz "Could not connect to the search manager." + .balign 4, 0 +ov00_0221945C: + .asciz "\\search\\" + .balign 4, 0 +ov00_02219468: + .asciz "\\sesskey\\" + .balign 4, 0 +ov00_02219474: + .asciz "\\profileid\\" + .balign 4, 0 +ov00_02219480: + .asciz "\\namespaceid\\" + .balign 4, 0 +ov00_02219490: + .asciz "\\nick\\" + .balign 4, 0 +ov00_02219498: + .asciz "\\uniquenick\\" + .balign 4, 0 +ov00_022194A8: + .asciz "\\email\\" + .balign 4, 0 +ov00_022194B0: + .asciz "\\firstname\\" + .balign 4, 0 +ov00_022194BC: + .asciz "\\lastname\\" + .balign 4, 0 +ov00_022194C8: + .asciz "\\icquin\\" + .balign 4, 0 +ov00_022194D4: + .asciz "\\skip\\" + .balign 4, 0 +ov00_022194DC: + .asciz "\\valid\\" + .balign 4, 0 +ov00_022194E4: + .asciz "\\nicks\\" + .balign 4, 0 +ov00_022194EC: + .asciz "\\pass\\" + .balign 4, 0 +ov00_022194F4: + .asciz "\\pmatch\\" + .balign 4, 0 +ov00_02219500: + .asciz "\\productid\\" + .balign 4, 0 +ov00_0221950C: + .asciz "\\check\\" + .balign 4, 0 +ov00_02219514: + .asciz "\\newuser\\" + .balign 4, 0 +ov00_02219520: + .asciz "\\productID\\" + .balign 4, 0 +ov00_0221952C: + .asciz "\\cdkey\\" + .balign 4, 0 +ov00_02219534: + .asciz "\\others\\" + .balign 4, 0 +ov00_02219540: + .asciz "\\uniquesearch\\" + .balign 4, 0 +ov00_02219550: + .asciz "\\preferrednick\\" + .balign 4, 0 +ov00_02219560: + .asciz "0" + .balign 4, 0 +ov00_02219564: + .asciz "\\gamename\\" + .balign 4, 0 +ov00_02219570: + .asciz "\\final\\" + .balign 4, 0 +ov00_02219578: + .asciz "There was an error reading from the server." + .balign 4, 0 +ov00_022195A4: + .asciz "bsrdone" + .balign 4, 0 +ov00_022195AC: + .asciz "more" + .balign 4, 0 +ov00_022195B4: + .asciz "bsr" + .balign 4, 0 +ov00_022195B8: + .asciz "nick" + .balign 4, 0 +ov00_022195C0: + .asciz "uniquenick" + .balign 4, 0 +ov00_022195CC: + .asciz "firstname" + .balign 4, 0 +ov00_022195D8: + .asciz "lastname" + .balign 4, 0 +ov00_022195E4: + .asciz "email" + .balign 4, 0 +ov00_022195EC: + .asciz "Error reading from the search server." + .balign 4, 0 +ov00_02219614: + .asciz "vr" + .balign 4, 0 +ov00_02219618: + .asciz "nr" + .balign 4, 0 +ov00_0221961C: + .asciz "ndone" + .balign 4, 0 +ov00_02219624: + .asciz "psrdone" + .balign 4, 0 +ov00_0221962C: + .asciz "psr" + .balign 4, 0 +ov00_02219630: + .asciz "status" + .balign 4, 0 +ov00_02219638: + .asciz "statuscode" + .balign 4, 0 +ov00_02219644: + .asciz "cur" + .balign 4, 0 +ov00_02219648: + .asciz "\\pid\\" + .balign 4, 0 +ov00_02219650: + .asciz "nur" + .balign 4, 0 +ov00_02219654: + .asciz "others" + .balign 4, 0 +ov00_0221965C: + .asciz "odone" + .balign 4, 0 +ov00_02219664: + .asciz "o" + .balign 4, 0 +ov00_02219668: + .asciz "first" + .balign 4, 0 +ov00_02219670: + .asciz "last" + .balign 4, 0 +ov00_02219678: + .asciz "us" + .balign 4, 0 +ov00_0221967C: + .asciz "usdone" + .balign 4, 0 +ov00_02219684: + .asciz "count == arg->numSuggestedNicks" + .balign 4, 0 +ov00_022196A4: + .asciz "num < iconnection->numSearches" + .balign 4, 0 +ov00_022196C4: + .asciz "" + .balign 4, 0 +ov00_022196C8: + .asciz "\\version\\%d\\result\\%d" + .balign 4, 0 +ov00_022196E0: + .asciz "\\xfer\\" + .balign 4, 0 +ov00_022196E8: + .asciz "%d %u %u" + .balign 4, 0 +ov00_022196F4: + .asciz "\\rn\\" + .balign 4, 0 +ov00_022196FC: + .asciz "Unexpected data was received from the server." + .balign 4, 0 +ov00_0221972C: + .asciz "Out of memory." + .balign 4, 0 +ov00_0221973C: + .asciz "strzcpy" + .balign 4, 0 +ov00_02219744: + .asciz "gpiValueForKey" + .balign 4, 0 +ov00_02219754: + .asciz "gpiReadKeyAndValue" + .balign 4, 0 +ov00_02219768: + .asciz "dest != NULL" + .balign 4, 0 +ov00_02219778: + .asciz "gpiUtility.c" + .balign 4, 0 +ov00_02219788: + .asciz "src != NULL" + .balign 4, 0 +ov00_02219794: + .asciz "\\error\\" + .balign 4, 0 +ov00_0221979C: + .asciz "\\err\\" + .balign 4, 0 +ov00_022197A4: + .asciz "\\errmsg\\" + .balign 4, 0 +ov00_022197B0: + .asciz "\\fatal\\" + .balign 4, 0 +ov00_022197B8: + .asciz "command != NULL" + .balign 4, 0 +ov00_022197C8: + .asciz "key != NULL" + .balign 4, 0 +ov00_022197D4: + .asciz "value != NULL" + .balign 4, 0 +ov00_022197E4: + .asciz "len > 0" + .balign 4, 0 +ov00_022197EC: + .asciz "Error connecting\n" + .balign 4, 0 +ov00_02219800: + .asciz "There was an error checking for a completed connection." + .balign 4, 0 +ov00_02219838: + .asciz "Connection rejected\n" + .balign 4, 0 +ov00_02219850: + .asciz "Connection accepted\n" + .balign 4, 0 +ov00_02219868: + .asciz "buffer != NULL" + .balign 4, 0 +ov00_02219878: + .asciz "Parse Error." + .balign 4, 0 +ov00_02219888: + .asciz "DoFind" + .balign 4, 0 +ov00_02219890: + .asciz "BucketNew" + .balign 4, 0 +ov00_0221989C: + .asciz "BucketConcat" + .balign 4, 0 +ov00_022198AC: + .asciz "set" + .balign 4, 0 +ov00_022198B0: + .asciz "gbucket.c" + .balign 4, 0 +ov00_022198BC: + .asciz "pbucket->type == bt_string" + .balign 4, 0 +ov00_022198D8: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x4E, 0x00, 0x00 + .word ov00_02219924 + .word ov00_0220A940 + .word ov00_0220A96C + .word ov00_0220AA00 + .word ov00_0220AA84 + .word ov00_0220AB04 + .word ov00_0220AB88 + .word ov00_0220AC2C + .word ov00_0220B8EC + .word ov00_0220B954 + .word ov00_0220B9C4 + .word ov00_0220BA20 + .word ov00_0220BA7C + .word ov00_0220BADC + .word ov00_0220BB38 + .word ov00_0220BB94 + .word ov00_0220BBF4 +ov00_02219924: + .asciz "\x00ameSpy3D" + .balign 4, 0 + .space 0x10-(.-ov00_02219924) +ov00_02219934: + .asciz "\x00rojectAphex" + .balign 4, 0 + .space 0x10-(.-ov00_02219934) +ov00_02219944: + .asciz "" + .balign 4, 0 +ov00_02219948: + .asciz "\\" + .balign 4, 0 +ov00_0221994C: + .asciz "pauthr" + .balign 4, 0 +ov00_02219954: + .asciz "lid" + .balign 4, 0 +ov00_02219958: + .asciz "errmsg" + .balign 4, 0 +ov00_02219960: + .asciz "getpidr" + .balign 4, 0 +ov00_02219968: + .asciz "getpdr" + .balign 4, 0 +ov00_02219970: + .asciz "pid" + .balign 4, 0 +ov00_02219974: + .asciz "mod" + .balign 4, 0 +ov00_02219978: + .asciz "length" + .balign 4, 0 +ov00_02219980: + .asciz "\\data\\" + .balign 4, 0 +ov00_02219988: + .asciz "setpdr" + .balign 4, 0 +ov00_02219990: + .asciz "\\pauthr\\" + .balign 4, 0 +ov00_0221999C: + .asciz "\\getpidr\\" + .balign 4, 0 +ov00_022199A8: + .asciz "\\getpdr\\" + .balign 4, 0 +ov00_022199B4: + .asciz "\\setpdr\\" + .balign 4, 0 +ov00_022199C0: + .asciz "%s_t%d" + .balign 4, 0 +ov00_022199C8: + .asciz "%s_%d" + .balign 4, 0 +ov00_022199D0: + .asciz "gti2GetChallenge" + .balign 4, 0 +ov00_022199E4: + .asciz "3b8dd8995f7c40a9a5c5b7dd5b481341" + .balign 4, 0 +ov00_02219A08: + .asciz "buffer" + .balign 4, 0 +ov00_02219A10: + .asciz "gt2Auth.c" + .balign 4, 0 +ov00_02219A1C: + .asciz "gti2BufferShorten" + .balign 4, 0 +ov00_02219A30: + .asciz "gti2BufferWriteData" + .balign 4, 0 +ov00_02219A44: + .asciz "gti2BufferWriteByte" + .balign 4, 0 +ov00_02219A58: + .asciz "gti2BufferWriteUShort" + .balign 4, 0 +ov00_02219A70: + .asciz "buffer->len < buffer->size" + .balign 4, 0 +ov00_02219A8C: + .asciz "gt2Buffer.c" + .balign 4, 0 +ov00_02219A98: + .asciz "(buffer->len + 2) <= buffer->size" + .balign 4, 0 +ov00_02219ABC: + .asciz "(buffer->len + len) <= buffer->size" + .balign 4, 0 +ov00_02219AE0: + .asciz "start <= buffer->len" + .balign 4, 0 +ov00_02219AF8: + .asciz "shortenBy <= (buffer->len - start)" + .balign 4, 0 +ov00_02219B1C: + .asciz "gti2DumpCallback" + .balign 4, 0 +ov00_02219B30: + .asciz "gti2PingCallback" + .balign 4, 0 +ov00_02219B44: + .asciz "gti2ClosedCallback" + .balign 4, 0 +ov00_02219B58: + .asciz "gti2ReceivedCallback" + .balign 4, 0 +ov00_02219B70: + .asciz "gti2ConnectedCallback" + .balign 4, 0 +ov00_02219B88: + .asciz "gti2SendFilterCallback" + .balign 4, 0 +ov00_02219BA0: + .asciz "gti2SocketErrorCallback" + .balign 4, 0 +ov00_02219BB8: + .asciz "gti2ReceiveFilterCallback" + .balign 4, 0 +ov00_02219BD4: + .asciz "gti2ConnectAttemptCallback" + .balign 4, 0 +ov00_02219BF0: + .asciz "gti2UnrecognizedMessageCallback" + .balign 4, 0 +ov00_02219C10: + .asciz "socket" + .balign 4, 0 +ov00_02219C18: + .asciz "gt2Callback.c" + .balign 4, 0 +ov00_02219C28: + .asciz "socket && connection" + .balign 4, 0 +ov00_02219C40: + .asciz "connection" + .balign 4, 0 +ov00_02219C4C: + .asciz "gt2SetConnectionData" + .balign 4, 0 +ov00_02219C64: + .asciz "gt2GetConnectionData" + .balign 4, 0 +ov00_02219C7C: + .asciz "gt2Main.c" + .balign 4, 0 +ov00_02219C88: + .asciz "connection" + .balign 4, 0 +ov00_02219C94: + .asciz "gti2EndReliableMessage" + .balign 4, 0 +ov00_02219CAC: + .asciz "time" + .balign 4, 0 +ov00_02219CB4: + .byte 0xFE, 0xFE, 0x00, 0x00 +ov00_02219CB8: + .asciz "len > 0" + .balign 4, 0 +ov00_02219CC0: + .asciz "gt2Message.c" + .balign 4, 0 +ov00_02219CD0: + .asciz "gt2StringToAddress" + .balign 4, 0 +ov00_02219CE4: + .asciz "%s:%d" + .balign 4, 0 +ov00_02219CEC: + .asciz "%s" + .balign 4, 0 +ov00_02219CF0: + .asciz ":%d" + .balign 4, 0 +ov00_02219CF4: + .asciz "len < GTI2_STACK_HOSTLEN_MAX" + .balign 4, 0 +ov00_02219D14: + .asciz "gt2Utility.c" + .balign 4, 0 +ov00_02219D24: + .asciz "" + .balign 4, 0 +ov00_02219D28: + .byte 0xFD, 0xFC, 0x1E, 0x66, 0x6A, 0xB2, 0x00, 0x00 +ov00_02219D30: + .asciz "%s.%s" + .balign 4, 0 +ov00_02219D38: + .asciz "natneg1.gs.nintendowifi.net" + .balign 4, 0 +ov00_02219D54: + .asciz "natneg2.gs.nintendowifi.net" + .balign 4, 0 +ov00_02219D70: + .word ov00_02219D74 +ov00_02219D74: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 +ov00_02219E84: + .asciz "%s.master.gs.nintendowifi.net" + .balign 4, 0 +ov00_02219EA4: + .asciz "No challenge value was received from the master server." + .balign 4, 0 +ov00_02219EDC: + .asciz "%d" + .balign 4, 0 +ov00_02219EE0: + .asciz "255.255.255.255" + .balign 4, 0 +ov00_02219EF0: + .asciz "%08X%04X" + .balign 4, 0 +ov00_02219EFC: + .asciz "unknown" + .balign 4, 0 +ov00_02219F04: + .asciz "" + .balign 4, 0 +ov00_02219F08: + .asciz "%s%d" + .balign 4, 0 +ov00_02219F10: + .asciz "final\\\\queryid\\1.1" + .balign 4, 0 +ov00_02219F24: + .asciz "localip%d" + .balign 4, 0 +ov00_02219F30: + .asciz "localport" + .balign 4, 0 +ov00_02219F3C: + .asciz "natneg" + .balign 4, 0 +ov00_02219F44: + .asciz "1" + .balign 4, 0 +ov00_02219F48: + .asciz "0" + .balign 4, 0 +ov00_02219F4C: + .asciz "statechanged" + .balign 4, 0 +ov00_02219F5C: + .asciz "gamename" + .balign 4, 0 +ov00_02219F68: + .asciz "publicip" + .balign 4, 0 +ov00_02219F74: + .asciz "publicport" + .balign 4, 0 +ov00_02219F80: + .asciz "" + .balign 4, 0 +ov00_02219F84: + .asciz "pid_" + .balign 4, 0 +ov00_02219F8C: + .asciz "ping_" + .balign 4, 0 +ov00_02219F94: + .asciz "team_" + .balign 4, 0 +ov00_02219F9C: + .asciz "score_" + .balign 4, 0 +ov00_02219FA4: + .asciz "team_t" + .balign 4, 0 +ov00_02219FAC: + .asciz "skill_" + .balign 4, 0 +ov00_02219FB4: + .asciz "groupid" + .balign 4, 0 +ov00_02219FBC: + .asciz "deaths_" + .balign 4, 0 +ov00_02219FC4: + .asciz "gamever" + .balign 4, 0 +ov00_02219FCC: + .asciz "player_" + .balign 4, 0 +ov00_02219FD4: + .asciz "score_t" + .balign 4, 0 +ov00_02219FDC: + .asciz "mapname" + .balign 4, 0 +ov00_02219FE4: + .asciz "gamename" + .balign 4, 0 +ov00_02219FF0: + .asciz "hostport" + .balign 4, 0 +ov00_02219FFC: + .asciz "password" + .balign 4, 0 +ov00_0221A008: + .asciz "gametype" + .balign 4, 0 +ov00_0221A014: + .asciz "numteams" + .balign 4, 0 +ov00_0221A020: + .asciz "gamemode" + .balign 4, 0 +ov00_0221A02C: + .asciz "teamplay" + .balign 4, 0 +ov00_0221A038: + .asciz "hostname" + .balign 4, 0 +ov00_0221A044: + .asciz "fraglimit" + .balign 4, 0 +ov00_0221A050: + .asciz "timelimit" + .balign 4, 0 +ov00_0221A05C: + .asciz "roundtime" + .balign 4, 0 +ov00_0221A068: + .asciz "numplayers" + .balign 4, 0 +ov00_0221A074: + .asciz "maxplayers" + .balign 4, 0 +ov00_0221A080: + .asciz "gamevariant" + .balign 4, 0 +ov00_0221A08C: + .asciz "timeelapsed" + .balign 4, 0 +ov00_0221A098: + .asciz "roundelapsed" + .balign 4, 0 +ov00_0221A0A8: + .asciz "teamfraglimit" + .balign 4, 0 +ov00_0221A0B8: + .word ov00_02219F80 + .word ov00_0221A038 + .word ov00_02219FE4 + .word ov00_02219FC4 + .word ov00_02219FF0 + .word ov00_02219FDC + .word ov00_0221A008 + .word ov00_0221A080 + .word ov00_0221A068 + .word ov00_0221A014 + .word ov00_0221A074 + .word ov00_0221A020 + .word ov00_0221A02C + .word ov00_0221A044 + .word ov00_0221A0A8 + .word ov00_0221A08C + .word ov00_0221A050 + .word ov00_0221A05C + .word ov00_0221A098 + .word ov00_02219FFC + .word ov00_02219FB4 + .word ov00_02219FCC + .word ov00_02219F9C + .word ov00_02219FAC + .word ov00_02219F8C + .word ov00_02219F94 + .word ov00_02219FBC + .word ov00_02219F84 + .word ov00_02219FA4 + .word ov00_02219FD4 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +ov00_0221A4B0: + .asciz "\\basic\\\\info\\" + .balign 4, 0 +ov00_0221A4C0: + .asciz "\\status\\" + .balign 4, 0 +ov00_0221A4CC: + .asciz "\\final\\" + .balign 4, 0 + +ov00_0221A4D4: + .asciz "final" + .balign 4, 0 + +ov00_0221A4DC: + .asciz "queryid" + .balign 4, 0 +ov00_0221A4E4: + .asciz "SBServerGetStringValueA" + .balign 4, 0 +ov00_0221A4FC: + .asciz "%d" + .balign 4, 0 +ov00_0221A500: + .asciz "server" + .balign 4, 0 +ov00_0221A508: + .asciz "sb_server.c" + .balign 4, 0 +ov00_0221A514: + .asciz "ping" + .balign 4, 0 +ov00_0221A51C: + .asciz "" + .balign 4, 0 +ov00_0221A520: + .asciz "%s%d" + .balign 4, 0 +ov00_0221A528: + .asciz "\\%s" + .balign 4, 0 +ov00_0221A52C: + .word ov00_0221A540 +ov00_0221A530: + .asciz "SBReleaseStr" + .balign 4, 0 +ov00_0221A540: + .asciz "Query Error: " + .balign 4, 0 +ov00_0221A550: + .asciz "AllKeysPresent" + .balign 4, 0 +ov00_0221A560: + .asciz "SBServerListInit" + .balign 4, 0 +ov00_0221A574: + .asciz "ProcessAdHocData" + .balign 4, 0 +ov00_0221A588: + .asciz "ProcessMainListData" + .balign 4, 0 +ov00_0221A59C: + .asciz "SBServerListConnectAndQuery" + .balign 4, 0 +ov00_0221A5B8: + .asciz "" + .balign 4, 0 +ov00_0221A5BC: + .asciz "val != NULL" + .balign 4, 0 +ov00_0221A5C8: + .asciz "sb_serverlist.c" + .balign 4, 0 +ov00_0221A5D8: + .asciz "slist != NULL" + .balign 4, 0 +ov00_0221A5E8: + .asciz "callback != NULL" + .balign 4, 0 +ov00_0221A5FC: + .asciz "%s.ms%d.gs.nintendowifi.net" + .balign 4, 0 +ov00_0221A618: + .asciz "slist->state == sl_disconnected" + .balign 4, 0 +ov00_0221A638: + .asciz "0" + .balign 4, 0 +ov00_0221A63C: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 +ov00_0221A644: + .asciz "inlen >= 0" + .balign 4, 0 +ov00_0221A650: + .asciz "slist->inbufferlen >= 0" + .balign 4, 0 + + .bss + +ov00_0221A694: + .space 0x8 + +ov00_0221A69C: + .space 0x4 + +ov00_0221A6A0: + .space 0x14 + +ov00_0221A6B4: + .space 0x4 + +ov00_0221A6B8: + .space 0x4 + +ov00_0221A6BC: + .space 0x14 + +ov00_0221A6D0: + .space 0x1C + +ov00_0221A6EC: + .space 0x48 + +ov00_0221A734: + .space 0x4 + +ov00_0221A738: + .space 0x8 + +ov00_0221A740: + .space 0x8 + +ov00_0221A748: + .space 0x4 + +ov00_0221A74C: + .space 0x8 + +ov00_0221A754: + .space 0x8 + +ov00_0221A75C: + .space 0x8 + +ov00_0221A764: + .space 0x4 + +ov00_0221A768: + .space 0x4 + +ov00_0221A76C: + .space 0x18 + +ov00_0221A784: + .space 0x8 + +ov00_0221A78C: + .space 0x80 + +ov00_0221A80C: + .space 0x100 + +ov00_0221A90C: + .space 0xC + +ov00_0221A918: + .space 0x10 + +ov00_0221A928: + .space 0x20 + +ov00_0221A948: + .space 0x1 + +ov00_0221A949: + .space 0x1 + +ov00_0221A94A: + .space 0x2 + +ov00_0221A94C: + .space 0x4 + +ov00_0221A950: + .space 0x730 + +ov00_0221B080: + .space 0x20 + +ov00_0221B0A0: + .space 0x4 + +ov00_0221B0A4: + .space 0x8 + +ov00_0221B0AC: + .space 0x14 + +ov00_0221B0C0: + .space 0x4 + +ov00_0221B0C4: + .space 0xC + +ov00_0221B0D0: + .space 0x8 + +ov00_0221B0D8: + .space 0x4 + +ov00_0221B0DC: + .space 0x4 + +ov00_0221B0E0: + .space 0x5 + +ov00_0221B0E5: + .space 0x47 + +ov00_0221B12C: + .space 0x40 + +ov00_0221B16C: + .space 0x40 + +ov00_0221B1AC: + .space 0x8 + +ov00_0221B1B4: + .space 0x10 + +ov00_0221B1C4: + .space 0x14 + +ov00_0221B1D8: + .space 0x18 + +ov00_0221B1F0: + .space 0x8 + +ov00_0221B1F8: + .space 0x8 + +ov00_0221B200: + .space 0x30 + +ov00_0221B230: + .space 0x200 + +ov00_0221B430: + .space 0x100 + +ov00_0221B530: + .space 0x100 + +ov00_0221B630: + .space 0x4 + +ov00_0221B634: + .space 0x4 + +ov00_0221B638: + .space 0x2C + +ov00_0221B664: + .space 0x14 + +ov00_0221B678: + .space 0x200 + +ov00_0221B878: + .space 0x4 + +ov00_0221B87C: + .space 0x14 + +ov00_0221B890: + .space 0x40 + +ov00_0221B8D0: + .space 0x100 + +ov00_0221B9D0: + .space 0x4 + +ov00_0221B9D4: + .space 0x8 + +ov00_0221B9DC: + .space 0x8 diff --git a/lib/NitroDWC/asm/overlay_13_arm_2.s b/lib/NitroDWC/asm/overlay_13_arm_2.s new file mode 100644 index 00000000..5280ca34 --- /dev/null +++ b/lib/NitroDWC/asm/overlay_13_arm_2.s @@ -0,0 +1,35626 @@ + .include "asm/macros.inc" + .include "overlay_13_arm_2.inc" + .include "global.inc" + + .text + + arm_func_start ov13_02226F58 +ov13_02226F58: ; 0x02226F58 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r0, #0xc + mov r1, #4 + bl ov13_0224128C + ldr r2, _02227018 ; =ov13_0224F464 + mov r1, #0x47 + str r0, [r2] + strb r4, [r0, #8] + mov r0, #0 + bl ov13_02240184 + ldr lr, _02227018 ; =ov13_0224F464 + ldr r1, _0222701C ; =ov13_02244EB0 + ldr r2, [lr] + ldrb r4, [r1, r4] + str r0, [r2, #4] + ldr r0, [lr] + ldr ip, _02227020 ; =0xFE00FF00 + ldr r5, [r0, #4] + ldr r1, _02227024 ; =ov13_02227064 + ldrh r3, [r5, #4] + mov r0, #1 + mov r2, #0 + bic r3, r3, #0xc00 + orr r3, r3, #0x400 + strh r3, [r5, #4] + ldr r5, [lr] + mov r3, #0x78 + ldr r6, [r5, #4] + ldr r5, [r6] + bic r5, r5, #0xc00 + str r5, [r6] + ldrh r5, [r6, #4] + bic r5, r5, #0xf000 + orr r4, r5, r4, lsl #12 + strh r4, [r6, #4] + ldr r4, [lr] + ldr r4, [r4, #4] + ldr lr, [r4] + and ip, lr, ip + orr ip, ip, #0x8b + orr ip, ip, #0xe60000 + str ip, [r4] + bl ov13_02242528 + ldr r1, _02227018 ; =ov13_0224F464 + ldr r1, [r1] + str r0, [r1] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02227018: .word ov13_0224F464 +_0222701C: .word ov13_02244EB0 +_02227020: .word 0xFE00FF00 +_02227024: .word ov13_02227064 + arm_func_end ov13_02226F58 + + arm_func_start ov13_02227028 +ov13_02227028: ; 0x02227028 + stmdb sp!, {r3, lr} + ldr r1, _0222705C ; =ov13_0224F464 + mov r0, #1 + ldr r1, [r1] + ldr r1, [r1] + bl ov13_022425F0 + ldr r0, _0222705C ; =ov13_0224F464 + ldr r0, [r0] + ldr r0, [r0, #4] + bl ov13_02241D98 + ldr r0, _02227060 ; =ov13_0224F464 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222705C: .word ov13_0224F464 +_02227060: .word ov13_0224F464 + arm_func_end ov13_02227028 + + arm_func_start ov13_02227064 +ov13_02227064: ; 0x02227064 + stmdb sp!, {r3, lr} + ldr r0, _02227124 ; =ov13_0224F464 + mov r1, #0x28 + ldr r0, [r0] + ldrb r0, [r0, #9] + add r0, r0, #1 + bl FX_ModS32 + ldr r2, _02227124 ; =ov13_0224F464 + mov r1, #5 + ldr r3, [r2] + strb r0, [r3, #9] + ldr r0, [r2] + ldrb r0, [r0, #9] + bl FX_DivS32 + ldr r2, _02227124 ; =ov13_0224F464 + add r1, r0, #0x47 + ldr r2, [r2] + mov r0, #0 + ldr r2, [r2, #4] + bl ov13_022400F0 + ldr r1, _02227124 ; =ov13_0224F464 + ldr ip, _02227128 ; =ov13_02244EB0 + ldr r2, [r1] + ldr r0, _0222712C ; =0xFE00FF00 + ldr r3, [r2, #4] + ldrh r2, [r3, #4] + bic r2, r2, #0xc00 + orr r2, r2, #0x400 + strh r2, [r3, #4] + ldr r2, [r1] + ldrb lr, [r2, #8] + ldr r3, [r2, #4] + ldr r2, [r3] + ldrb ip, [ip, lr] + bic r2, r2, #0xc00 + str r2, [r3] + ldrh r2, [r3, #4] + bic r2, r2, #0xf000 + orr r2, r2, ip, lsl #12 + strh r2, [r3, #4] + ldr r1, [r1] + ldr r2, [r1, #4] + ldr r1, [r2] + and r0, r1, r0 + orr r0, r0, #0x8b + orr r0, r0, #0xe60000 + str r0, [r2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227124: .word ov13_0224F464 +_02227128: .word ov13_02244EB0 +_0222712C: .word 0xFE00FF00 + arm_func_end ov13_02227064 + + arm_func_start ov13_02227130 +ov13_02227130: ; 0x02227130 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r2, _02227218 ; =ov13_02244EE0 + mov r5, r0 + mov r0, #0x1c + mov r1, #4 + ldrb r8, [r2, r5] + bl ov13_0224128C + ldr r4, _0222721C ; =ov13_0224F468 + mvn r7, #1 + str r0, [r4] + strb r7, [r0, #0x16] + ldr r0, [r4] + cmp r8, #0 + strb r5, [r0, #0x17] + mov sb, #0 + ble _022271BC + ldr r0, _02227220 ; =ov13_02244EC4 + mov r6, sb + add sl, r0, r5, lsl #1 + mov r5, #1 + mov fp, r5 +_02227184: + ldrb r1, [sl], #1 + mov r0, r6 + mov r2, r5 + bl ov13_022401B0 + ldr r1, [r4] + mov r2, fp + str r0, [r1, sb, lsl #2] + ldr r0, [r4] + add r1, r7, #1 + ldr r0, [r0, sb, lsl #2] + bl ov13_02240008 + add sb, sb, #1 + cmp sb, r8 + blt _02227184 +_022271BC: + mov r1, #1 + mov r2, r1 + mov r0, #0 + bl ov13_022401B0 + ldr r3, _0222721C ; =ov13_0224F468 + mvn r1, #0 + ldr r4, [r3] + mov r2, #1 + str r0, [r4, #8] + ldr r0, [r3] + ldr r0, [r0, #8] + bl ov13_02240008 + mov r0, #0xc0 + bl ov13_022272FC + mov r0, #0 + ldr r1, _02227224 ; =ov13_02227390 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0222721C ; =ov13_0224F468 + ldr r1, [r1] + str r0, [r1, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02227218: .word ov13_02244EE0 +_0222721C: .word ov13_0224F468 +_02227220: .word ov13_02244EC4 +_02227224: .word ov13_02227390 + arm_func_end ov13_02227130 + + arm_func_start ov13_02227228 +ov13_02227228: ; 0x02227228 + ldr r0, _0222724C ; =ov13_0224F468 + mov r3, #1 + ldr r2, [r0] + ldr ip, _02227250 ; =ov13_022425C8 + strb r3, [r2, #0x19] + ldr r0, [r0] + ldr r1, _02227254 ; =ov13_022275D8 + ldr r0, [r0, #0xc] + bx ip + .balign 4, 0 +_0222724C: .word ov13_0224F468 +_02227250: .word ov13_022425C8 +_02227254: .word ov13_022275D8 + arm_func_end ov13_02227228 + + arm_func_start ov13_02227258 +ov13_02227258: ; 0x02227258 + ldr r0, _02227268 ; =ov13_0224F468 + ldr r0, [r0] + ldrsb r0, [r0, #0x16] + bx lr + .balign 4, 0 +_02227268: .word ov13_0224F468 + arm_func_end ov13_02227258 + + arm_func_start ov13_0222726C +ov13_0222726C: ; 0x0222726C + ldr r2, _02227288 ; =ov13_0224F468 + mvn r1, #0 + ldr r3, [r2] + ldrsb r2, [r3, #0x16] + cmp r2, r1 + streqb r0, [r3, #0x16] + bx lr + .balign 4, 0 +_02227288: .word ov13_0224F468 + arm_func_end ov13_0222726C + + arm_func_start ov13_0222728C +ov13_0222728C: ; 0x0222728C + ldr r1, _0222729C ; =ov13_0224F468 + ldr r1, [r1] + strb r0, [r1, #0x16] + bx lr + .balign 4, 0 +_0222729C: .word ov13_0224F468 + arm_func_end ov13_0222728C + + arm_func_start ov13_022272A0 +ov13_022272A0: ; 0x022272A0 + ldr r0, _022272C8 ; =ov13_0224F468 + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + bxeq lr + ldrb r0, [r0, #0x19] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_022272C8: .word ov13_0224F468 + arm_func_end ov13_022272A0 + + arm_func_start ov13_022272CC +ov13_022272CC: ; 0x022272CC + ldr r0, _022272E0 ; =ov13_0224F468 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x18] + bx lr + .balign 4, 0 +_022272E0: .word ov13_0224F468 + arm_func_end ov13_022272CC + + arm_func_start ov13_022272E4 +ov13_022272E4: ; 0x022272E4 + ldr r0, _022272F8 ; =ov13_0224F468 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x18] + bx lr + .balign 4, 0 +_022272F8: .word ov13_0224F468 + arm_func_end ov13_022272E4 + + arm_func_start ov13_022272FC +ov13_022272FC: ; 0x022272FC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _02227380 ; =ov13_0224F468 + mov r8, r0 + ldr r0, [r1] + ldr r1, _02227384 ; =ov13_02244EE0 + ldrb r2, [r0, #0x17] + ldr r0, [r0, #8] + mov r3, r8 + ldrb r6, [r1, r2] + mvn r1, #0 + mov r2, #0 + bl ov13_0223FF18 + mov r7, #0 + cmp r6, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r4, _02227388 ; =ov13_02244ED2 + ldr sl, _0222738C ; =ov13_02244EBC + ldr sb, _02227380 ; =ov13_0224F468 + mvn r5, #0 +_02227348: + ldr r0, [sb] + mov r1, r5 + ldrb r2, [r0, #0x17] + ldr r0, [r0, r7, lsl #2] + add r3, r8, #4 + add r2, r4, r2, lsl #1 + ldrb r2, [r7, r2] + mov r2, r2, lsl #2 + ldrh r2, [sl, r2] + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, r6 + blt _02227348 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02227380: .word ov13_0224F468 +_02227384: .word ov13_02244EE0 +_02227388: .word ov13_02244ED2 +_0222738C: .word ov13_02244EBC + arm_func_end ov13_022272FC + + arm_func_start ov13_02227390 +ov13_02227390: ; 0x02227390 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _022273F4 ; =ov13_0224F468 + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0, #8] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + sub r0, r0, #4 + str r0, [sp] + bl ov13_022272FC + ldr r0, [sp] + cmp r0, #0xa8 + addgt sp, sp, #8 + ldmgtia sp!, {r4, pc} + mov r0, #0xa8 + bl ov13_022272FC + ldr r1, _022273F8 ; =ov13_022273FC + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022273F4: .word ov13_0224F468 +_022273F8: .word ov13_022273FC + arm_func_end ov13_02227390 + + arm_func_start ov13_022273FC +ov13_022273FC: ; 0x022273FC + stmdb sp!, {r3, lr} + ldr r1, _02227444 ; =ov13_0224F468 + mvn r3, #0 + ldr r2, [r1] + strb r3, [r2, #0x16] + ldr r3, [r1] + ldrh r2, [r3, #0x14] + add r2, r2, #1 + strh r2, [r3, #0x14] + ldr r3, [r1] + ldrh r1, [r3, #0x14] + cmp r1, #4 + ldmloia sp!, {r3, pc} + ldr r1, _02227448 ; =ov13_0222744C + mov r2, #0 + strh r2, [r3, #0x14] + bl ov13_022425C8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227444: .word ov13_0224F468 +_02227448: .word ov13_0222744C + arm_func_end ov13_022273FC + + arm_func_start ov13_0222744C +ov13_0222744C: ; 0x0222744C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + ldr r8, _022275B8 ; =ov13_0224F468 + ldr r1, _022275BC ; =ov13_02244EE0 + ldr r3, [r8] + ldrb r2, [r3, #0x17] + ldrb r0, [r3, #0x18] + ldrb r6, [r1, r2] + cmp r0, #0 + bne _022275A0 + ldrsb r1, [r3, #0x16] + mvn r0, #0 + cmp r1, r0 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp r6, #0 + mov r7, #0 + ble _022275A0 + ldr r5, _022275C0 ; =ov13_02244EBC + ldr r4, _022275C4 ; =ov13_02244ED2 + ldr sl, _022275C8 ; =ov13_02244EB8 + add sb, sp, #0 +_022274A4: + ldr r0, [r8] + mov r1, sl + ldrb r0, [r0, #0x17] + mov r2, sb + add r0, r4, r0, lsl #1 + ldrb r0, [r7, r0] + add r0, r5, r0, lsl #2 + bl ov13_02240E74 + mov r0, sb + bl ov13_022417DC + cmp r0, #0 + beq _02227594 + ldr r0, _022275B8 ; =ov13_0224F468 + ldr r3, [r0] + ldr r0, [r3, #0x10] + cmp r0, #0 + bne _022275A0 + ldrb r2, [r3, #0x17] + ldr r1, _022275CC ; =ov13_02244EC4 + ldr r0, [r3, r7, lsl #2] + add r1, r1, r2, lsl #1 + ldrb r4, [r7, r1] + mov r1, #0 + bl ov13_0223FDE0 + mov r2, r0 + add r1, r4, #1 + mov r0, #0 + bl ov13_022400F0 + ldr r0, _022275B8 ; =ov13_0224F468 + ldr r1, _022275C4 ; =ov13_02244ED2 + ldr r0, [r0] + ldr r2, _022275C0 ; =ov13_02244EBC + ldrb r4, [r0, #0x17] + ldr r3, _022275D0 ; =ov13_02244EBE + ldr r0, [r0, r7, lsl #2] + add r1, r1, r4, lsl #1 + ldrb r4, [r7, r1] + mvn r1, #0 + mov r4, r4, lsl #2 + ldrh r2, [r2, r4] + ldrh r3, [r3, r4] + bl ov13_0223FF18 + ldr r0, _022275B8 ; =ov13_0224F468 + mvn r1, #0 + ldr r0, [r0] + mov r2, #1 + ldr r0, [r0, r7, lsl #2] + bl ov13_02240008 + mov r0, #0 + ldr r1, _022275D4 ; =ov13_022276B4 + mov r2, r0 + mov r3, #0x6e + bl ov13_02242528 + ldr r1, _022275B8 ; =ov13_0224F468 + add sp, sp, #8 + ldr r2, [r1] + str r0, [r2, #0x10] + ldr r0, [r1] + strb r7, [r0, #0x16] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02227594: + add r7, r7, #1 + cmp r7, r6 + blt _022274A4 +_022275A0: + ldr r0, _022275B8 ; =ov13_0224F468 + mvn r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x16] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_022275B8: .word ov13_0224F468 +_022275BC: .word ov13_02244EE0 +_022275C0: .word ov13_02244EBC +_022275C4: .word ov13_02244ED2 +_022275C8: .word ov13_02244EB8 +_022275CC: .word ov13_02244EC4 +_022275D0: .word ov13_02244EBE +_022275D4: .word ov13_022276B4 + arm_func_end ov13_0222744C + + arm_func_start ov13_022275D8 +ov13_022275D8: ; 0x022275D8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02227634 ; =ov13_0224F468 + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0, #8] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + add r0, r0, #4 + str r0, [sp] + bl ov13_022272FC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02227638 ; =ov13_0222763C + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02227634: .word ov13_0224F468 +_02227638: .word ov13_0222763C + arm_func_end ov13_022275D8 + + arm_func_start ov13_0222763C +ov13_0222763C: ; 0x0222763C + stmdb sp!, {r3, r4, r5, lr} + mov r1, r0 + mov r0, #0 + bl ov13_022425D0 + ldr r0, _022276AC ; =ov13_0224F468 + ldr r0, [r0] + ldr r1, [r0, #0x10] + cmp r1, #0 + beq _02227668 + mov r0, #0 + bl ov13_022425D0 +_02227668: + ldr r4, _022276AC ; =ov13_0224F468 + mov r5, #0 +_02227670: + ldr r0, [r4] + ldr r0, [r0, r5, lsl #2] + cmp r0, #0 + beq _02227684 + bl ov13_0223FD60 +_02227684: + add r5, r5, #1 + cmp r5, #2 + blt _02227670 + ldr r0, _022276AC ; =ov13_0224F468 + ldr r0, [r0] + ldr r0, [r0, #8] + bl ov13_0223FD60 + ldr r0, _022276B0 ; =ov13_0224F468 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022276AC: .word ov13_0224F468 +_022276B0: .word ov13_0224F468 + arm_func_end ov13_0222763C + + arm_func_start ov13_022276B4 +ov13_022276B4: ; 0x022276B4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _02227798 ; =ov13_0224F468 + str r0, [sp] + ldr r1, [r4] + ldrh r0, [r1, #0x14] + add r0, r0, #1 + strh r0, [r1, #0x14] + ldr r1, [r4] + ldrh r0, [r1, #0x14] + cmp r0, #0x10 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r1, [r1, #0x17] + ldr r0, _0222779C ; =ov13_02244EE0 + mov sb, #0 + ldrb r8, [r0, r1] + cmp r8, #0 + ble _02227754 + ldr r7, _022277A0 ; =ov13_02244EC4 + mov r6, sb + mov fp, sb + mvn r5, #0 +_02227708: + ldr r0, [r4] + mov r1, r6 + ldrb r2, [r0, #0x17] + ldr r0, [r0, sb, lsl #2] + add r2, r7, r2, lsl #1 + ldrb sl, [sb, r2] + bl ov13_0223FDE0 + mov r2, r0 + mov r1, sl + mov r0, fp + bl ov13_022400F0 + ldr r0, [r4] + mov r1, r5 + ldr r0, [r0, sb, lsl #2] + mov r2, #1 + bl ov13_02240008 + add sb, sb, #1 + cmp sb, r8 + blt _02227708 +_02227754: + mov r0, #0xa8 + bl ov13_022272FC + ldr r1, _02227798 ; =ov13_0224F468 + mov r0, #0 + ldr r2, [r1] + sub r3, r0, #1 + strh r0, [r2, #0x14] + ldr r2, [r1] + strb r3, [r2, #0x16] + ldr r2, [r1] + ldr r1, [r2, #0x10] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp] + str r0, [r2, #0x10] + bl ov13_022425D0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02227798: .word ov13_0224F468 +_0222779C: .word ov13_02244EE0 +_022277A0: .word ov13_02244EC4 + arm_func_end ov13_022276B4 + + arm_func_start ov13_022277A4 +ov13_022277A4: ; 0x022277A4 + ldr r0, _022277B4 ; =ov13_0224F46C + mov r1, #0 + strb r1, [r0] + bx lr + .balign 4, 0 +_022277B4: .word ov13_0224F46C + arm_func_end ov13_022277A4 + + arm_func_start ov13_022277B8 +ov13_022277B8: ; 0x022277B8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + ldr r3, _02227874 ; =ov13_0224F46C + mov r7, r0 + ldrb r0, [r3] + mov r6, r1 + mov r5, r2 + cmp r0, #0 + addne sp, sp, #0x10 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02227878 ; =ov13_02245B20 + ldr r1, _0222787C ; =GXS_LoadBG0Scr + bl ov13_02227924 + ldr r3, _02227880 ; =0x01920000 + ldr r2, _02227884 ; =0x04001010 + mov r0, #1 + mov r1, #0 + str r3, [r2] + bl ov13_022408A0 + ldr r1, _02227888 ; =ov13_0224F4F8 + mov r4, r0 + ldr r0, [r1] + mov r1, r7 + mov r2, r6 + mov r3, r5 + bl ov13_0222BAF4 + mov r5, r0 + bl ov13_02227B1C + mov r1, #0x40 + str r1, [sp] + mov r1, #2 + str r1, [sp, #4] + str r0, [sp, #8] + str r5, [sp, #0xc] + mov r0, r4 + mov r1, #0x14 + mov r2, #0 + mov r3, #0xd8 + bl ov13_02240CC0 + mov r0, r4 + bl ov13_02240E2C + mov r0, #1 + ldr r1, _02227874 ; =ov13_0224F46C + strb r0, [r1] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02227874: .word ov13_0224F46C +_02227878: .word ov13_02245B20 +_0222787C: .word GXS_LoadBG0Scr +_02227880: .word 0x01920000 +_02227884: .word 0x04001010 +_02227888: .word ov13_0224F4F8 + arm_func_end ov13_022277B8 + + arm_func_start ov13_0222788C +ov13_0222788C: ; 0x0222788C + stmdb sp!, {r3, lr} + ldr r0, _022278C0 ; =ov13_0224F46C + ldrb r0, [r0] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #1 + bl ov13_02240B04 + ldr r0, _022278C0 ; =ov13_0224F46C + mov r1, #0 + strb r1, [r0] + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022278C0: .word ov13_0224F46C + arm_func_end ov13_0222788C + + arm_func_start ov13_022278C4 +ov13_022278C4: ; 0x022278C4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _0222791C ; =ov13_0224F470 + mov r1, r4 + mov r2, #0x3f + bl strncpy + ldrb r0, [r4, #5] + cmp r0, #0x78 + ldreq r0, _0222791C ; =ov13_0224F470 + ldmeqia sp!, {r4, pc} + bl ov13_0222B970 + ldrb r1, [r4, #5] + cmp r1, #0x79 + bne _02227908 + cmp r0, #0 + ldrne r0, _0222791C ; =ov13_0224F470 + ldmneia sp!, {r4, pc} +_02227908: + ldr r1, _02227920 ; =ov13_02244F30 + ldrb r1, [r1, r0] + ldr r0, _0222791C ; =ov13_0224F470 + strb r1, [r0, #5] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222791C: .word ov13_0224F470 +_02227920: .word ov13_02244F30 + arm_func_end ov13_022278C4 + + arm_func_start ov13_02227924 +ov13_02227924: ; 0x02227924 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + bl ov13_022278C4 + add r1, sp, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, [sp] + mov r4, r0 + bl DC_FlushRange + ldr r2, [sp] + mov r0, r4 + mov r1, #0 + blx r5 + mov r0, r4 + bl ov13_0223FA50 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov13_02227924 + + arm_func_start ov13_02227964 +ov13_02227964: ; 0x02227964 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + add r0, sp, #0 + mov r1, #0 + bl ov13_0222B90C + ldr r0, [sp] + cmp r0, #1 + bne _02227998 + mov r0, r4 + bl ov13_0223AC4C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02227998: + cmp r0, #2 + addne sp, sp, #4 + ldmneia sp!, {r3, r4, pc} + mov r0, r4 + bl ov13_0223B1E0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov13_02227964 + + arm_func_start ov13_022279B4 +ov13_022279B4: ; 0x022279B4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B90C + ldr r0, [sp] + cmp r0, #1 + addne sp, sp, #4 + ldmneia sp!, {r3, r4, pc} + mov r0, r4 + bl ov13_02227130 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov13_022279B4 + + arm_func_start ov13_022279EC +ov13_022279EC: ; 0x022279EC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r4, r0 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + ldr r1, _02227A5C ; =ov13_0224F4F8 + mov r5, r0 + ldr r0, [r1] + mov r1, r4 + bl ov13_0222BADC + mov r4, r0 + bl ov13_02227B1C + mov r1, #0x70 + str r1, [sp] + mov r1, #2 + str r1, [sp, #4] + str r0, [sp, #8] + str r4, [sp, #0xc] + mov r0, r5 + mov r1, #0xd + mov r2, #0x28 + mov r3, #0xe6 + bl ov13_02240CC0 + mov r0, r5 + bl ov13_02240E2C + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02227A5C: .word ov13_0224F4F8 + arm_func_end ov13_022279EC + + arm_func_start ov13_02227A60 +ov13_02227A60: ; 0x02227A60 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + mov r5, r0 + mov r0, #0 + mov r6, r1 + mov r1, r0 + bl ov13_022408A0 + ldr r1, _02227B0C ; =ov13_0224F4F8 + mov r4, r0 + ldr r0, [r1] + mov r1, r6 + bl ov13_0222BADC + mov r6, r0 + bl ov13_02227B1C + mov r1, #0x5e + str r1, [sp] + mov r1, #2 + str r1, [sp, #4] + str r0, [sp, #8] + mov r0, r4 + mov r1, #0xd + mov r2, #0x3c + mov r3, #0xe6 + str r6, [sp, #0xc] + bl ov13_02240CC0 + bl ov13_0222B970 + mov r6, r0 + bl ov13_0222B970 + ldr r1, _02227B10 ; =0x00000209 + mov r3, r0, lsl #2 + stmia sp, {r1, r5} + ldr r2, _02227B14 ; =ov13_02244F16 + ldr r1, _02227B18 ; =ov13_02244F14 + mov ip, r6, lsl #2 + ldrh r2, [r2, r3] + ldrh r1, [r1, ip] + mov r0, r4 + mov r3, #2 + bl ov13_02240B28 + mov r0, r4 + bl ov13_02240E2C + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02227B0C: .word ov13_0224F4F8 +_02227B10: .word 0x00000209 +_02227B14: .word ov13_02244F16 +_02227B18: .word ov13_02244F14 + arm_func_end ov13_02227A60 + + arm_func_start ov13_02227B1C +ov13_02227B1C: ; 0x02227B1C + stmdb sp!, {r3, lr} + bl ov13_0222B970 + ldr r1, _02227B30 ; =ov13_02244EF8 + ldr r0, [r1, r0, lsl #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227B30: .word ov13_02244EF8 + arm_func_end ov13_02227B1C + + arm_func_start ov13_02227B34 +ov13_02227B34: ; 0x02227B34 + stmdb sp!, {r3, lr} + mov r0, #0x10 + mov r1, #4 + bl ov13_0224128C + ldr r1, _02227B50 ; =ov13_0224F4B0 + str r0, [r1] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227B50: .word ov13_0224F4B0 + arm_func_end ov13_02227B34 + + arm_func_start ov13_02227B54 +ov13_02227B54: ; 0x02227B54 + stmdb sp!, {r3, lr} + bl ov13_02227D18 + ldr r0, _02227B68 ; =ov13_0224F4B0 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227B68: .word ov13_0224F4B0 + arm_func_end ov13_02227B54 + + arm_func_start ov13_02227B6C +ov13_02227B6C: ; 0x02227B6C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r4, r0 + str r1, [sp] + str r2, [sp, #4] + mov fp, r3 + bl ov13_02227D18 + ldr r0, _02227C20 ; =ov13_02244F38 + mov sb, #0 + add sl, r0, r4, lsl #1 + mov r7, #1 + ldr r4, _02227C24 ; =ov13_0224F4B0 + mov r8, sb + mvn r6, #0 + mov r5, r7 +_02227BA8: + ldrb r1, [sl], #1 + mov r0, r8 + mov r2, r7 + bl ov13_022401B0 + ldr r2, [r4] + mov r1, r6 + str r0, [r2, sb, lsl #2] + ldr r0, [r4] + mov r2, r5 + ldr r0, [r0, sb, lsl #2] + bl ov13_02240008 + add sb, sb, #1 + cmp sb, #2 + blt _02227BA8 + ldr r0, _02227C24 ; =ov13_0224F4B0 + ldr r2, [sp] + ldr r0, [r0] + mov r3, fp + ldr r0, [r0] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _02227C24 ; =ov13_0224F4B0 + ldr r2, [sp, #4] + ldr r0, [r0] + mov r3, fp + ldr r0, [r0, #4] + mvn r1, #0 + bl ov13_0223FF18 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02227C20: .word ov13_02244F38 +_02227C24: .word ov13_0224F4B0 + arm_func_end ov13_02227B6C + + arm_func_start ov13_02227C28 +ov13_02227C28: ; 0x02227C28 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov fp, r0 + str r1, [sp] + str r2, [sp, #4] + str r3, [sp, #8] + mov sb, #6 + bl ov13_02227D18 + mov sl, #0 + mov r7, #1 + ldr r4, _02227D14 ; =ov13_0224F4B0 + mov r8, sl + mvn r6, #0 + mov r5, r7 +_02227C60: + mov r0, r8 + mov r1, sb + mov r2, r7 + bl ov13_022401B0 + ldr r2, [r4] + mov r1, r6 + str r0, [r2, sl, lsl #2] + ldr r0, [r4] + mov r2, r5 + ldr r0, [r0, sl, lsl #2] + bl ov13_02240008 + add sl, sl, #1 + cmp sl, #4 + add sb, sb, #1 + blt _02227C60 + ldr r0, _02227D14 ; =ov13_0224F4B0 + ldr r3, [sp, #4] + ldr r0, [r0] + mov r2, fp + ldr r0, [r0] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _02227D14 ; =ov13_0224F4B0 + ldr r2, [sp] + ldr r0, [r0] + ldr r3, [sp, #4] + ldr r0, [r0, #4] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _02227D14 ; =ov13_0224F4B0 + ldr r3, [sp, #8] + ldr r0, [r0] + mov r2, fp + ldr r0, [r0, #8] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _02227D14 ; =ov13_0224F4B0 + ldr r2, [sp] + ldr r0, [r0] + ldr r3, [sp, #8] + ldr r0, [r0, #0xc] + mvn r1, #0 + bl ov13_0223FF18 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02227D14: .word ov13_0224F4B0 + arm_func_end ov13_02227C28 + + arm_func_start ov13_02227D18 +ov13_02227D18: ; 0x02227D18 + stmdb sp!, {r4, r5, r6, lr} + mov r6, #0 + ldr r4, _02227D54 ; =ov13_0224F4B0 + mov r5, r6 +_02227D28: + ldr r0, [r4] + ldr r0, [r0, r6, lsl #2] + cmp r0, #0 + beq _02227D44 + bl ov13_0223FD60 + ldr r0, [r4] + str r5, [r0, r6, lsl #2] +_02227D44: + add r6, r6, #1 + cmp r6, #4 + blt _02227D28 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02227D54: .word ov13_0224F4B0 + arm_func_end ov13_02227D18 + + arm_func_start ov13_02227D58 +ov13_02227D58: ; 0x02227D58 + stmdb sp!, {r3, lr} + mov r0, #0xc0 + mov r1, #4 + bl ov13_0224128C + ldr r2, _02227DBC ; =ov13_0224F4B4 + ldr r1, _02227DC0 ; =GX_LoadBG1Char + str r0, [r2] + ldr r0, _02227DC4 ; =ov13_02245D54 + bl ov13_02227924 + bl ov13_0222B980 + cmp r0, #0 + beq _02227D94 + cmp r0, #1 + beq _02227DA8 + ldmia sp!, {r3, pc} +_02227D94: + ldr r0, _02227DC8 ; =ov13_02245D04 + ldr r1, _02227DCC ; =GX_LoadBG1Scr + ldr r0, [r0] + bl ov13_02227924 + ldmia sp!, {r3, pc} +_02227DA8: + ldr r0, _02227DC8 ; =ov13_02245D04 + ldr r1, _02227DCC ; =GX_LoadBG1Scr + ldr r0, [r0, #4] + bl ov13_02227924 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227DBC: .word ov13_0224F4B4 +_02227DC0: .word GX_LoadBG1Char +_02227DC4: .word ov13_02245D54 +_02227DC8: .word ov13_02245D04 +_02227DCC: .word GX_LoadBG1Scr + arm_func_end ov13_02227D58 + + arm_func_start ov13_02227DD0 +ov13_02227DD0: ; 0x02227DD0 + ldr ip, _02227DDC ; =ov13_022412B0 + ldr r0, _02227DE0 ; =ov13_0224F4B4 + bx ip + .balign 4, 0 +_02227DDC: .word ov13_022412B0 +_02227DE0: .word ov13_0224F4B4 + arm_func_end ov13_02227DD0 + + arm_func_start ov13_02227DE4 +ov13_02227DE4: ; 0x02227DE4 + stmdb sp!, {r4, lr} + ldr r1, _02227E34 ; =ov13_02245D04 + ldr r0, [r1, r0, lsl #2] + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _02227E38 ; =ov13_0224F4B4 + mov r4, r0 + ldr r1, [r1] + mov r2, #0xc0 + bl MIi_CpuCopyFast + mov r0, r4 + bl ov13_0223FA50 + mov r0, #1 + ldr r1, _02227E3C ; =ov13_02227E70 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02227E34: .word ov13_02245D04 +_02227E38: .word ov13_0224F4B4 +_02227E3C: .word ov13_02227E70 + arm_func_end ov13_02227DE4 + + arm_func_start ov13_02227E40 +ov13_02227E40: ; 0x02227E40 + stmdb sp!, {r3, lr} + bl ov13_02239FF0 + ldrb r0, [r0, #0xf4] + add r0, r0, #5 + bl ov13_02227DE4 + ldmia sp!, {r3, pc} + arm_func_end ov13_02227E40 + + arm_func_start ov13_02227E58 +ov13_02227E58: ; 0x02227E58 + stmdb sp!, {r3, lr} + bl ov13_02239FF0 + ldrb r0, [r0, #0xf4] + add r0, r0, #2 + bl ov13_02227DE4 + ldmia sp!, {r3, pc} + arm_func_end ov13_02227E58 + + arm_func_start ov13_02227E70 +ov13_02227E70: ; 0x02227E70 + stmdb sp!, {r4, lr} + ldr r1, _02227EAC ; =ov13_0224F4B4 + mov r4, r0 + ldr r0, [r1] + mov r1, #0xc0 + bl DC_FlushRange + ldr r0, _02227EAC ; =ov13_0224F4B4 + mov r1, #0 + ldr r0, [r0] + mov r2, #0xc0 + bl GX_LoadBG1Scr + mov r1, r4 + mov r0, #1 + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02227EAC: .word ov13_0224F4B4 + arm_func_end ov13_02227E70 + + arm_func_start ov13_02227EB0 +ov13_02227EB0: ; 0x02227EB0 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _02227F58 ; =ov13_0224F4B8 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0xc + mov r1, #4 + bl ov13_0224128C + ldr r1, _02227F5C ; =ov13_02244F44 + ldr r2, _02227F58 ; =ov13_0224F4B8 + ldrb r1, [r1, r4, lsl #2] + str r0, [r2] + strb r4, [r0, #8] + mov r0, #0 + bl ov13_02240184 + ldr lr, _02227F58 ; =ov13_0224F4B8 + ldr ip, _02227F60 ; =0xFE00FF00 + ldr r2, [lr] + ldr r1, _02227F64 ; =ov13_02227FAC + str r0, [r2] + ldr r2, [lr] + mov r0, #0 + ldr r5, [r2] + mov r2, r0 + ldr r4, [r5] + mov r3, #0x78 + and r4, r4, ip + orr r4, r4, #0x26 + orr r4, r4, #0xe50000 + str r4, [r5] + ldr ip, [lr] + ldr lr, [ip] + ldrh ip, [lr, #4] + bic ip, ip, #0xc00 + orr ip, ip, #0x800 + strh ip, [lr, #4] + bl ov13_02242528 + ldr r1, _02227F58 ; =ov13_0224F4B8 + ldr r1, [r1] + str r0, [r1, #4] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02227F58: .word ov13_0224F4B8 +_02227F5C: .word ov13_02244F44 +_02227F60: .word 0xFE00FF00 +_02227F64: .word ov13_02227FAC + arm_func_end ov13_02227EB0 + + arm_func_start ov13_02227F68 +ov13_02227F68: ; 0x02227F68 + stmdb sp!, {r3, lr} + ldr r0, _02227FA4 ; =ov13_0224F4B8 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r1, [r0, #4] + mov r0, #0 + bl ov13_022425F0 + ldr r0, _02227FA4 ; =ov13_0224F4B8 + ldr r0, [r0] + ldr r0, [r0] + bl ov13_02241D98 + ldr r0, _02227FA8 ; =ov13_0224F4B8 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02227FA4: .word ov13_0224F4B8 +_02227FA8: .word ov13_0224F4B8 + arm_func_end ov13_02227F68 + + arm_func_start ov13_02227FAC +ov13_02227FAC: ; 0x02227FAC + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _02228044 ; =0x04000208 + mov r4, #0 + ldrh r5, [r0] + strh r4, [r0] + bl WM_GetAllowedChannel + cmp r0, #0x8000 + beq _02227FD4 + bl WM_GetLinkLevel + mov r4, r0 +_02227FD4: + ldr r2, _02228044 ; =0x04000208 + ldr r1, _02228048 ; =ov13_0224F4B8 + ldrh r0, [r2] + ldr r3, _0222804C ; =ov13_02244F44 + mov r0, #0 + strh r5, [r2] + ldr r2, [r1] + ldrsb r1, [r2, #8] + ldr r2, [r2] + add r1, r3, r1, lsl #2 + ldrb r1, [r4, r1] + bl ov13_022400F0 + ldr r1, _02228048 ; =ov13_0224F4B8 + ldr r0, _02228050 ; =0xFE00FF00 + ldr r2, [r1] + ldr r3, [r2] + ldr r2, [r3] + and r0, r2, r0 + orr r0, r0, #0x26 + orr r0, r0, #0xe50000 + str r0, [r3] + ldr r0, [r1] + ldr r1, [r0] + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0x800 + strh r0, [r1, #4] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02228044: .word 0x04000208 +_02228048: .word ov13_0224F4B8 +_0222804C: .word ov13_02244F44 +_02228050: .word 0xFE00FF00 + arm_func_end ov13_02227FAC + + arm_func_start ov13_02228054 +ov13_02228054: ; 0x02228054 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + add r5, sp, #0x1c + mov r4, #0 + strh r4, [r5, #4] + mov r3, #0x11 + strh r4, [r5, #6] + mov r2, #0x12 + mov r0, #0x128 + mov r1, #4 + strh r4, [r5] + strh r4, [r5, #2] + strh r3, [sp, #0x20] + strh r2, [sp, #0x22] + bl ov13_0224128C + ldr r8, _022283A0 ; =ov13_0224F4BC + mov r1, #0xff + str r0, [r8] + strb r1, [r0, #0x11c] + ldr r0, [r8] + mov r6, r4 + strb r6, [r0, #0x121] + mov r5, r4 + ldr r0, [r8] + mov r1, #1 + strb r1, [r0, #0x123] + ldr r0, [r8] + ldr r7, _022283A4 ; =0xC1FFFCFF + strb r1, [r0, #0x124] + mov r4, #0x34 +_022280CC: + mov r0, r5 + mov r1, r4 + bl ov13_02240184 + ldr r1, [r8] + add r1, r1, r6, lsl #2 + str r0, [r1, #0x30] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x30] + ldr r0, [r1] + and r0, r0, r7 + orr r0, r0, #0x200 + str r0, [r1] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x30] + add r6, r6, #1 + ldrh r0, [r1, #4] + cmp r6, #0x2f + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + blt _022280CC + mov r6, #0 + ldr r5, _022283A8 ; =ov13_02244F5C + ldr r8, _022283A0 ; =ov13_0224F4BC + ldr r7, _022283A4 ; =0xC1FFFCFF + mov r4, r6 +_0222813C: + ldrb r1, [r5], #1 + mov r0, r4 + bl ov13_02240184 + ldr r1, [r8] + add r1, r1, r6, lsl #2 + str r0, [r1, #0xec] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0xec] + ldr r0, [r1] + and r0, r0, r7 + orr r0, r0, #0x200 + str r0, [r1] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0xec] + add r6, r6, #1 + ldrh r0, [r1, #4] + cmp r6, #4 + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + blt _0222813C + mov sl, #0 + ldr sb, _022283AC ; =ov13_02244F54 + ldr r4, _022283A0 ; =ov13_0224F4BC + mov r8, sl + mov r7, #1 + mvn r6, #0 + mov r5, #0x200 + mov fp, sl +_022281B8: + ldrb r1, [sb], #1 + mov r0, r8 + mov r2, r7 + bl ov13_022401B0 + ldr r2, [r4] + mov r1, r6 + add r2, r2, sl, lsl #2 + str r0, [r2, #0xfc] + ldr r0, [r4] + mov r2, r5 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #0xfc] + mov r3, fp + bl ov13_0223FDF4 + ldr r0, [r4] + mov r1, r6 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #0xfc] + mov r2, #3 + bl ov13_02240008 + add sl, sl, #1 + cmp sl, #2 + blt _022281B8 + mov sl, #0 + strh sl, [sp, #0x16] +_0222821C: + mov sb, #0 + ldr r6, _022283B0 ; =ov13_02245D74 + ldr r4, _022283A0 ; =ov13_0224F4BC + str sb, [sp, #0x10] + mov fp, #2 +_02228230: + add r0, sp, #0x18 + str r0, [sp] + mov r0, #0 + str r0, [sp, #4] + mov r1, #0x1c + mov r2, #2 + mov r3, r0 + bl ov13_02240798 + ldr r1, [r4] + mov r2, sb, lsl #2 + add r1, r1, sl, lsl #4 + str r0, [r1, sb, lsl #2] + mov r0, #0 + ldr r7, [sp, #0x10] + strh r0, [sp, #0x1c] + mov r8, r0 + add r5, r2, sl, lsl #4 +_02228274: + ldr r1, [r6, sl, lsl #2] + mov r0, r7, lsl #1 + ldrh r1, [r1, r0] + ldrh r0, [sp, #0x22] + strh r1, [sp, #0x14] + stmia sp, {r0, fp} + mov r0, #0x480 + str r0, [sp, #8] + add r0, sp, #0x14 + str r0, [sp, #0xc] + ldr r0, [r4] + ldrh r1, [sp, #0x1c] + ldrh r2, [sp, #0x1e] + ldrh r3, [sp, #0x20] + ldr r0, [r0, r5] + bl ov13_02240CC0 + ldrh r0, [sp, #0x1c] + add r8, r8, #1 + cmp r8, #0xc + add r0, r0, #0x12 + add r7, r7, #1 + strh r0, [sp, #0x1c] + blt _02228274 + cmp sl, #0 + bne _022282F4 + ldr r1, [sp, #0x18] + mov r0, #0 + mov r2, #1 + bl ov13_0223FC04 + ldr r1, [r4] + add r1, r1, sb, lsl #2 + str r0, [r1, #0x104] +_022282F4: + ldr r0, [sp, #0x10] + add sb, sb, #1 + add r0, r0, #0xc + str r0, [sp, #0x10] + cmp sb, #4 + blt _02228230 + add sl, sl, #1 + cmp sl, #3 + blt _0222821C + mov r0, #0 + mov r1, #0x40 + mov r2, #1 + bl ov13_022401B0 + ldr r3, _022283A0 ; =ov13_0224F4BC + mvn r1, #0 + ldr r4, [r3] + mov r2, #0x200 + str r0, [r4, #0x114] + ldr r0, [r3] + mov r3, #0 + ldr r0, [r0, #0x114] + bl ov13_0223FDF4 + ldr r0, _022283A0 ; =ov13_0224F4BC + mvn r1, #0 + ldr r0, [r0] + mov r2, #2 + ldr r0, [r0, #0x114] + bl ov13_02240008 + mov r0, #0 + ldr r1, _022283B4 ; =ov13_02228444 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r3, _022283A0 ; =ov13_0224F4BC + mov r1, #0 + ldr r4, [r3] + mov r2, #0xc0 + str r0, [r4, #0x118] + ldr r0, [r3] + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022283A0: .word ov13_0224F4BC +_022283A4: .word 0xC1FFFCFF +_022283A8: .word ov13_02244F5C +_022283AC: .word ov13_02244F54 +_022283B0: .word ov13_02245D74 +_022283B4: .word ov13_02228444 + arm_func_end ov13_02228054 + + arm_func_start ov13_022283B8 +ov13_022283B8: ; 0x022283B8 + stmdb sp!, {r3, lr} + ldr r0, _022283E4 ; =ov13_0224F4BC + ldr r0, [r0] + ldr r0, [r0, #0x114] + bl ov13_0223FD60 + ldr r0, _022283E4 ; =ov13_0224F4BC + ldr r1, _022283E8 ; =ov13_022299CC + ldr r0, [r0] + ldr r0, [r0, #0x118] + bl ov13_022425C8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022283E4: .word ov13_0224F4BC +_022283E8: .word ov13_022299CC + arm_func_end ov13_022283B8 + + arm_func_start ov13_022283EC +ov13_022283EC: ; 0x022283EC + ldr r0, _022283FC ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x11c] + bx lr + .balign 4, 0 +_022283FC: .word ov13_0224F4BC + arm_func_end ov13_022283EC + + arm_func_start ov13_02228400 +ov13_02228400: ; 0x02228400 + ldr r1, _02228410 ; =ov13_0224F4BC + ldr r1, [r1] + strb r0, [r1, #0x123] + bx lr + .balign 4, 0 +_02228410: .word ov13_0224F4BC + arm_func_end ov13_02228400 + + arm_func_start ov13_02228414 +ov13_02228414: ; 0x02228414 + ldr r1, _02228424 ; =ov13_0224F4BC + ldr r1, [r1] + strb r0, [r1, #0x124] + bx lr + .balign 4, 0 +_02228424: .word ov13_0224F4BC + arm_func_end ov13_02228414 + + arm_func_start ov13_02228428 +ov13_02228428: ; 0x02228428 + ldr r0, _02228440 ; =ov13_0224F4BC + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_02228440: .word ov13_0224F4BC + arm_func_end ov13_02228428 + + arm_func_start ov13_02228444 +ov13_02228444: ; 0x02228444 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _022284CC ; =ov13_0224F4BC + mov r4, r0 + ldr r3, [r2] + ldr r1, _022284D0 ; =0x01FF0000 + ldr r0, [r3, #0x30] + ldr r0, [r0] + and r1, r0, r1 + and r0, r0, #0xff + sub r2, r0, #0xc + mov r0, r1, lsr #0x10 + str r0, [sp, #4] + str r2, [sp] + cmp r2, #0x51 + ldrb r0, [r3, #0x11d] + mov r1, #0 + ble _02228498 + bl ov13_022290F0 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_02228498: + mov r2, #0x51 + bl ov13_022290F0 + ldr r0, _022284CC ; =ov13_0224F4BC + mov r1, #1 + ldr r0, [r0] + mov r2, #0xc0 + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + ldr r1, _022284D4 ; =ov13_022284D8 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022284CC: .word ov13_0224F4BC +_022284D0: .word 0x01FF0000 +_022284D4: .word ov13_022284D8 + arm_func_end ov13_02228444 + + arm_func_start ov13_022284D8 +ov13_022284D8: ; 0x022284D8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _02228560 ; =ov13_0224F4BC + mov r4, r0 + ldr r3, [r2] + ldr r1, _02228564 ; =0x01FF0000 + ldr r0, [r3, #0x60] + ldr r0, [r0] + and r1, r0, r1 + and r0, r0, #0xff + sub r2, r0, #0xc + mov r0, r1, lsr #0x10 + str r0, [sp, #4] + str r2, [sp] + cmp r2, #0x67 + ldrb r0, [r3, #0x11d] + mov r1, #1 + ble _0222852C + bl ov13_022290F0 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222852C: + mov r2, #0x67 + bl ov13_022290F0 + ldr r0, _02228560 ; =ov13_0224F4BC + mov r1, #2 + ldr r0, [r0] + mov r2, #0xc0 + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + ldr r1, _02228568 ; =ov13_0222856C + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02228560: .word ov13_0224F4BC +_02228564: .word 0x01FF0000 +_02228568: .word ov13_0222856C + arm_func_end ov13_022284D8 + + arm_func_start ov13_0222856C +ov13_0222856C: ; 0x0222856C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _022285F4 ; =ov13_0224F4BC + mov r4, r0 + ldr r3, [r2] + ldr r1, _022285F8 ; =0x01FF0000 + ldr r0, [r3, #0x90] + ldr r0, [r0] + and r1, r0, r1 + and r0, r0, #0xff + sub r2, r0, #0xc + mov r0, r1, lsr #0x10 + str r0, [sp, #4] + str r2, [sp] + cmp r2, #0x7d + ldrb r0, [r3, #0x11d] + mov r1, #2 + ble _022285C0 + bl ov13_022290F0 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_022285C0: + mov r2, #0x7d + bl ov13_022290F0 + ldr r0, _022285F4 ; =ov13_0224F4BC + mov r1, #3 + ldr r0, [r0] + mov r2, #0xc0 + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + ldr r1, _022285FC ; =ov13_02228600 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022285F4: .word ov13_0224F4BC +_022285F8: .word 0x01FF0000 +_022285FC: .word ov13_02228600 + arm_func_end ov13_0222856C + + arm_func_start ov13_02228600 +ov13_02228600: ; 0x02228600 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _02228688 ; =ov13_0224F4BC + mov r4, r0 + ldr r3, [r2] + ldr r1, _0222868C ; =0x01FF0000 + ldr r0, [r3, #0xc0] + ldr r0, [r0] + and r1, r0, r1 + and r0, r0, #0xff + sub r2, r0, #0xc + mov r0, r1, lsr #0x10 + str r0, [sp, #4] + str r2, [sp] + cmp r2, #0x93 + ldrb r0, [r3, #0x11d] + mov r1, #3 + ble _02228654 + bl ov13_022290F0 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_02228654: + mov r2, #0x93 + bl ov13_022290F0 + ldr r0, _02228688 ; =ov13_0224F4BC + mov r1, #4 + ldr r0, [r0] + mov r2, #0xc0 + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + ldr r1, _02228690 ; =ov13_02228694 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02228688: .word ov13_0224F4BC +_0222868C: .word 0x01FF0000 +_02228690: .word ov13_02228694 + arm_func_end ov13_02228600 + + arm_func_start ov13_02228694 +ov13_02228694: ; 0x02228694 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02228718 ; =ov13_0224F4BC + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0, #0xfc] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + mov r1, #4 + sub r2, r0, #0xc + str r2, [sp] + cmp r2, #0xaa + ble _022286EC + ldr r0, _02228718 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_022286EC: + ldr r0, _02228718 ; =ov13_0224F4BC + mov r2, #0xaa + ldr r0, [r0] + ldrb r0, [r0, #0x11d] + bl ov13_022290F0 + bl ov13_022294B8 + ldr r1, _0222871C ; =ov13_02228720 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02228718: .word ov13_0224F4BC +_0222871C: .word ov13_02228720 + arm_func_end ov13_02228694 + + arm_func_start ov13_02228720 +ov13_02228720: ; 0x02228720 + stmdb sp!, {r3, lr} + bl ov13_02228738 + bl ov13_02228920 + bl ov13_02228C68 + bl ov13_02228EC0 + ldmia sp!, {r3, pc} + arm_func_end ov13_02228720 + + arm_func_start ov13_02228738 +ov13_02228738: ; 0x02228738 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r0, _022288FC ; =ov13_02245958 + bl ov13_022417DC + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02228900 ; =ov13_0224F4BC + mvn r1, #0 + ldr r0, [r0] + ldr r7, _02228904 ; =ov13_02244FA4 + ldr r6, _02228908 ; =ov13_02244F68 + strb r1, [r0, #0x11e] + mov r4, #0 + add r5, sp, #0 +_02228774: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _022287D4 + ldr r0, _02228900 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x124] + cmp r0, #0 + bne _022287B8 + mov r0, #9 + bl ov13_0223ABB8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022287B8: + mov r0, #0 + bl ov13_0223ABB8 + ldr r0, _02228900 ; =ov13_0224F4BC + add sp, sp, #8 + ldr r0, [r0] + strb r4, [r0, #0x11e] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022287D4: + add r4, r4, #1 + cmp r4, #0x2f + add r7, r7, #4 + blt _02228774 + ldr r6, _0222890C ; =ov13_02244F94 + ldr r7, _02228910 ; =ov13_02244F84 + mov r4, #0 + add r5, sp, #0 +_022287F4: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _02228880 + cmp r4, #3 + bne _02228830 + ldr r0, _02228900 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x123] + cmp r0, #0 + beq _0222884C +_02228830: + cmp r4, #2 + bne _0222885C + ldr r0, _02228900 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x124] + cmp r0, #0 + bne _0222885C +_0222884C: + mov r0, #9 + bl ov13_0223ABB8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222885C: + ldr r0, _02228914 ; =ov13_02245D80 + ldr r0, [r0, r4, lsl #2] + bl ov13_0223ABB8 + ldr r0, _02228900 ; =ov13_0224F4BC + add r1, r4, #0x2f + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x11e] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228880: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #4 + add r7, r7, #4 + blt _022287F4 + ldr r6, _02228918 ; =ov13_02244F7C + ldr r5, _0222891C ; =ov13_02244F64 + mov r7, #0 + add r4, sp, #0 +_022288A4: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_022417DC + cmp r0, #0 + beq _022288E4 + mov r0, #0 + bl ov13_0223ABB8 + ldr r0, _02228900 ; =ov13_0224F4BC + add r1, r7, #0x33 + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x11e] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022288E4: + add r7, r7, #1 + cmp r7, #2 + add r6, r6, #4 + blt _022288A4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022288FC: .word ov13_02245958 +_02228900: .word ov13_0224F4BC +_02228904: .word ov13_02244FA4 +_02228908: .word ov13_02244F68 +_0222890C: .word ov13_02244F94 +_02228910: .word ov13_02244F84 +_02228914: .word ov13_02245D80 +_02228918: .word ov13_02244F7C +_0222891C: .word ov13_02244F64 + arm_func_end ov13_02228738 + + arm_func_start ov13_02228920 +ov13_02228920: ; 0x02228920 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r1, _02228BCC ; =ov13_0224F4BC + ldr r0, _02228BD0 ; =ov13_02245958 + ldr r1, [r1] + mov r2, #0 + strb r2, [r1, #0x11c] + bl ov13_022418EC + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r7, _02228BD4 ; =ov13_02244FA4 + ldr r6, _02228BD8 ; =ov13_02244F68 + mov r4, #0 + add r5, sp, #0 +_0222895C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _022289DC + ldr r1, _02228BCC ; =ov13_0224F4BC + ldr r3, [r1] + add r0, r3, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, r4 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r2, [r3, #0x11d] + ldr r0, _02228BDC ; =ov13_02245D68 + ldr r0, [r0, r2, lsl #2] + ldrb r0, [r0, r4] + strb r0, [r3, #0x11c] + ldr r0, [r1] + ldrb r0, [r0, #0x11d] + cmp r0, #1 + bne _022289C4 + mov r0, #0 + bl ov13_0222936C +_022289C4: + ldr r0, _02228BCC ; =ov13_0224F4BC + ldr r0, [r0] + strb r4, [r0, #0x121] + bl ov13_022294B8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022289DC: + add r4, r4, #1 + cmp r4, #0x2f + add r7, r7, #4 + blt _0222895C + ldr r6, _02228BE0 ; =ov13_02244F9C + ldr r7, _02228BE4 ; =ov13_02244F8C + mov r4, #2 + add r5, sp, #0 +_022289FC: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _02228A7C + ldr r1, _02228BCC ; =ov13_0224F4BC + add r2, r4, #0x2f + ldr r3, [r1] + add r0, r3, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, r2 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02228BE8 ; =ov13_02245208 + ldrb r0, [r0, r4] + strb r0, [r3, #0x11c] + ldr r0, [r1] + ldrb r0, [r0, #0x11d] + cmp r0, #1 + bne _02228A60 + mov r0, #0 + bl ov13_0222936C +_02228A60: + ldr r0, _02228BCC ; =ov13_0224F4BC + add r1, r4, #0x2f + ldr r0, [r0] + strb r1, [r0, #0x121] + bl ov13_022294B8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228A7C: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #4 + add r7, r7, #4 + blt _022289FC + ldr r7, _02228BEC ; =ov13_02244F7C + ldr r6, _02228BF0 ; =ov13_02244F64 + mov r4, #0 + add r5, sp, #0 +_02228AA0: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _02228B00 + ldr r1, _02228BCC ; =ov13_0224F4BC + add r2, r4, #0x33 + ldr r3, [r1] + add r0, r3, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, r2 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02228BF4 ; =ov13_02244F58 + ldrb r0, [r0, r4] + strb r0, [r3, #0x11c] + ldr r0, [r1] + strb r2, [r0, #0x121] + bl ov13_022294B8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228B00: + add r4, r4, #1 + cmp r4, #2 + add r7, r7, #4 + blt _02228AA0 + ldr r0, _02228BF8 ; =ov13_02244F84 + ldr r1, _02228BFC ; =ov13_02244F94 + add r2, sp, #0 + bl ov13_02240E74 + add r0, sp, #0 + bl ov13_022418EC + cmp r0, #0 + beq _02228B6C + ldr r0, _02228BCC ; =ov13_0224F4BC + ldr r0, [r0] + add r0, r0, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, #0x2f + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov13_02228C08 + ldr r0, _02228BCC ; =ov13_0224F4BC + mov r1, #0x2f + ldr r0, [r0] + strb r1, [r0, #0x121] + bl ov13_022294B8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228B6C: + ldr r0, _02228C00 ; =ov13_02244F88 + ldr r1, _02228C04 ; =ov13_02244F98 + add r2, sp, #0 + bl ov13_02240E74 + add r0, sp, #0 + bl ov13_022418EC + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02228BCC ; =ov13_0224F4BC + ldr r0, [r0] + add r0, r0, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, #0x30 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl ov13_02228C38 + ldr r0, _02228BCC ; =ov13_0224F4BC + mov r1, #0x30 + ldr r0, [r0] + strb r1, [r0, #0x121] + bl ov13_022294B8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02228BCC: .word ov13_0224F4BC +_02228BD0: .word ov13_02245958 +_02228BD4: .word ov13_02244FA4 +_02228BD8: .word ov13_02244F68 +_02228BDC: .word ov13_02245D68 +_02228BE0: .word ov13_02244F9C +_02228BE4: .word ov13_02244F8C +_02228BE8: .word ov13_02245208 +_02228BEC: .word ov13_02244F7C +_02228BF0: .word ov13_02244F64 +_02228BF4: .word ov13_02244F58 +_02228BF8: .word ov13_02244F84 +_02228BFC: .word ov13_02244F94 +_02228C00: .word ov13_02244F88 +_02228C04: .word ov13_02244F98 + arm_func_end ov13_02228920 + + arm_func_start ov13_02228C08 +ov13_02228C08: ; 0x02228C08 + stmdb sp!, {r3, lr} + ldr r0, _02228C34 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x11d] + cmp r0, #2 + moveq r0, #0 + movne r0, #2 + bl ov13_0222936C + mov r0, #1 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02228C34: .word ov13_0224F4BC + arm_func_end ov13_02228C08 + + arm_func_start ov13_02228C38 +ov13_02228C38: ; 0x02228C38 + stmdb sp!, {r3, lr} + ldr r0, _02228C64 ; =ov13_0224F4BC + ldr r0, [r0] + ldrb r0, [r0, #0x11d] + cmp r0, #1 + movne r0, #1 + moveq r0, #0 + bl ov13_0222936C + mov r0, #1 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02228C64: .word ov13_0224F4BC + arm_func_end ov13_02228C38 + + arm_func_start ov13_02228C68 +ov13_02228C68: ; 0x02228C68 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r0, _02228E4C ; =ov13_02245958 + bl ov13_02241754 + cmp r0, #0 + beq _02228E2C + ldr r7, _02228E50 ; =ov13_02244FA4 + ldr r5, _02228E54 ; =ov13_02244F68 + mov r6, #0 + add r4, sp, #0 +_02228C90: + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + beq _02228CD4 + ldr r0, _02228E58 ; =ov13_0224F4BC + ldr r0, [r0] + add r0, r0, #0x100 + ldrsb r0, [r0, #0x1e] + cmp r0, r6 + bne _02228E2C + mov r0, r6 + bl ov13_02228E6C + b _02228E34 +_02228CD4: + add r6, r6, #1 + cmp r6, #0x2f + add r7, r7, #4 + blt _02228C90 + ldr r6, _02228E5C ; =ov13_02244F9C + ldr r7, _02228E60 ; =ov13_02244F8C + mov r4, #2 + add r5, sp, #0 +_02228CF4: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_02241754 + cmp r0, #0 + beq _02228DB4 + ldr r1, _02228E58 ; =ov13_0224F4BC + add r0, r4, #0x2f + ldr r1, [r1] + add r1, r1, #0x100 + ldrsb r1, [r1, #0x1e] + cmp r1, r0 + bne _02228E2C + bl ov13_02228E6C + cmp r4, #3 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02228E58 ; =ov13_0224F4BC + ldr r2, [r0] + ldrb r1, [r2, #0x122] + add r1, r1, #1 + strb r1, [r2, #0x122] + ldr r2, [r0] + ldrb r1, [r2, #0x122] + cmp r1, #0x28 + addlo sp, sp, #8 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r2, #0x123] + cmp r1, #0 + bne _02228D94 + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02228E58 ; =ov13_0224F4BC + mvn r1, #0 + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x11e] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228D94: + mov r1, #0x80 + strb r1, [r2, #0x11c] + ldr r1, [r0] + add sp, sp, #8 + ldrb r0, [r1, #0x122] + sub r0, r0, #7 + strb r0, [r1, #0x122] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02228DB4: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #4 + add r7, r7, #4 + blt _02228CF4 + ldr r6, _02228E64 ; =ov13_02244F7C + ldr r5, _02228E68 ; =ov13_02244F64 + mov r7, #0 + add r4, sp, #0 +_02228DD8: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + beq _02228E1C + ldr r1, _02228E58 ; =ov13_0224F4BC + add r0, r7, #0x33 + ldr r1, [r1] + add r1, r1, #0x100 + ldrsb r1, [r1, #0x1e] + cmp r1, r0 + bne _02228E2C + bl ov13_02228E6C + b _02228E34 +_02228E1C: + add r7, r7, #1 + cmp r7, #2 + add r6, r6, #4 + blt _02228DD8 +_02228E2C: + mvn r0, #0 + bl ov13_02228E6C +_02228E34: + ldr r0, _02228E58 ; =ov13_0224F4BC + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x122] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02228E4C: .word ov13_02245958 +_02228E50: .word ov13_02244FA4 +_02228E54: .word ov13_02244F68 +_02228E58: .word ov13_0224F4BC +_02228E5C: .word ov13_02244F9C +_02228E60: .word ov13_02244F8C +_02228E64: .word ov13_02244F7C +_02228E68: .word ov13_02244F64 + arm_func_end ov13_02228C68 + + arm_func_start ov13_02228E6C +ov13_02228E6C: ; 0x02228E6C + stmdb sp!, {r4, lr} + ldr r1, _02228EBC ; =ov13_0224F4BC + mov r4, r0 + ldr r1, [r1] + add r1, r1, #0x100 + ldrsb r1, [r1, #0x1f] + cmp r4, r1 + ldmeqia sp!, {r4, pc} + mov r1, #1 + bl ov13_022293F0 + ldr r0, _02228EBC ; =ov13_0224F4BC + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x100 + ldrsb r0, [r0, #0x1f] + bl ov13_022293F0 + ldr r0, _02228EBC ; =ov13_0224F4BC + ldr r0, [r0] + strb r4, [r0, #0x11f] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02228EBC: .word ov13_0224F4BC + arm_func_end ov13_02228E6C + + arm_func_start ov13_02228EC0 +ov13_02228EC0: ; 0x02228EC0 + stmdb sp!, {r4, lr} + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _02228EDC + mov r0, #0 + bl ov13_02229594 +_02228EDC: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _02228EF4 + mov r0, #1 + bl ov13_02229594 +_02228EF4: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + beq _02228F0C + mov r0, #2 + bl ov13_02229594 +_02228F0C: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _02228F24 + mov r0, #3 + bl ov13_02229594 +_02228F24: + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222903C + ldr r2, _022290E0 ; =ov13_0224F4BC + ldr r0, [r2] + add r1, r0, #0x100 + ldrsb r4, [r1, #0x21] + cmp r4, #0x2f + bge _02228F94 + ldrb r1, [r0, #0x124] + cmp r1, #0 + bne _02228F64 + mov r0, #9 + bl ov13_0223ABB8 + ldmia sp!, {r4, pc} +_02228F64: + ldrb r3, [r0, #0x11d] + ldr r1, _022290E4 ; =ov13_02245D68 + ldr r1, [r1, r3, lsl #2] + ldrb r1, [r1, r4] + strb r1, [r0, #0x11c] + ldr r0, [r2] + ldrb r0, [r0, #0x11d] + cmp r0, #1 + ldmneia sp!, {r4, pc} + mov r0, #0 + bl ov13_0222936C + ldmia sp!, {r4, pc} +_02228F94: + sub r1, r4, #0x2f + cmp r1, #4 + bge _0222902C + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _02228FFC +_02228FAC: ; jump table + b _02228FBC ; case 0 + b _02228FC4 ; case 1 + b _02228FCC ; case 2 + b _02228FE4 ; case 3 +_02228FBC: + bl ov13_02228C08 + ldmia sp!, {r4, pc} +_02228FC4: + bl ov13_02228C38 + ldmia sp!, {r4, pc} +_02228FCC: + ldrb r1, [r0, #0x124] + cmp r1, #0 + bne _02228FFC + mov r0, #9 + bl ov13_0223ABB8 + ldmia sp!, {r4, pc} +_02228FE4: + ldrb r1, [r0, #0x123] + cmp r1, #0 + bne _02228FFC + mov r0, #9 + bl ov13_0223ABB8 + ldmia sp!, {r4, pc} +_02228FFC: + ldrb r0, [r0, #0x11d] + cmp r0, #1 + bne _02229010 + mov r0, #0 + bl ov13_0222936C +_02229010: + ldr r1, _022290E8 ; =ov13_02245208 + sub r2, r4, #0x2f + ldr r0, _022290E0 ; =ov13_0224F4BC + ldrb r1, [r1, r2] + ldr r0, [r0] + strb r1, [r0, #0x11c] + ldmia sp!, {r4, pc} +_0222902C: + ldr r1, _022290EC ; =ov13_02244F58 + sub r2, r4, #0x33 + ldrb r1, [r1, r2] + strb r1, [r0, #0x11c] +_0222903C: + mov r0, #2 + bl ov13_022416D4 + cmp r0, #0 + beq _02229094 + ldr r0, _022290E0 ; =ov13_0224F4BC + ldr r1, [r0] + ldrb r0, [r1, #0x123] + cmp r0, #0 + bne _02229088 + ldrb r0, [r1, #0x125] + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _022290E0 ; =ov13_0224F4BC + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x125] + ldmia sp!, {r4, pc} +_02229088: + mov r0, #0x80 + strb r0, [r1, #0x11c] + b _022290B4 +_02229094: + mov r0, #2 + bl ov13_02241714 + cmp r0, #0 + beq _022290B4 + ldr r0, _022290E0 ; =ov13_0224F4BC + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x125] +_022290B4: + mov r0, #0x400 + bl ov13_02241694 + cmp r0, #0 + beq _022290C8 + bl ov13_02228C08 +_022290C8: + mov r0, #0x800 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl ov13_02228C38 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022290E0: .word ov13_0224F4BC +_022290E4: .word ov13_02245D68 +_022290E8: .word ov13_02245208 +_022290EC: .word ov13_02244F58 + arm_func_end ov13_02228EC0 + + arm_func_start ov13_022290F0 +ov13_022290F0: ; 0x022290F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + ldr r3, _02229350 ; =ov13_02244F60 + mov sl, r1 + ldrb r5, [r3, #0x11] + ldrb r4, [r3, #0x12] + mov r1, #0xc + mul r1, sl, r1 + strb r5, [sp, #0x12] + strb r4, [sp, #0x13] + ldrb r4, [r3, #0x14] + ldrb r5, [r3, #0x13] + str r1, [sp, #4] + strb r4, [sp, #0x15] + strb r5, [sp, #0x14] + ldrb r1, [r3, #0x15] + mov sb, r2 + add r4, sp, #0x12 + strb r1, [sp, #0x16] + ldrb r1, [r4, sl] + ldrb r6, [r3, #0x16] + ldrb r2, [r3, #0x17] + cmp r1, #0 + ldr r5, [sp, #4] + strb r6, [sp, #0xd] + strb r2, [sp, #0xe] + ldrb r7, [r3, #0x18] + ldrb r2, [r3, #0x19] + mov r6, #0 + strb r7, [sp, #0xf] + strb r2, [sp, #0x10] + ldrb r1, [r3, #0x1a] + strb r1, [sp, #0x11] + ldrb r2, [r3, #0xc] + ldrb r1, [r3, #0xd] + strb r2, [sp, #8] + strb r1, [sp, #9] + ldrb r2, [r3, #0xe] + ldrb r1, [r3, #0xf] + strb r2, [sp, #0xa] + strb r1, [sp, #0xb] + ldrb r1, [r3, #0x10] + strb r1, [sp, #0xc] + ble _0222920C + ldr r1, _02229354 ; =ov13_02244FA4 + ldr fp, _02229358 ; =ov13_0224F4BC + ldr lr, _0222935C ; =0xC1FFFCFF + ldr r8, _02229360 ; =0xFE00FF00 + and r7, sb, #0xff +_022291B4: + ldr r2, [fp] + mov r3, r5, lsl #2 + add r2, r2, r5, lsl #2 + ldr r2, [r2, #0x30] + ldrh r3, [r1, r3] + ldr ip, [r2] + add r6, r6, #1 + and ip, ip, lr + str ip, [r2] + mov r2, r3, lsl #0x17 + ldr r3, [fp] + add r3, r3, r5, lsl #2 + ldr r3, [r3, #0x30] + add r5, r5, #1 + ldr ip, [r3] + and ip, ip, r8 + orr ip, ip, r7 + orr r2, ip, r2, lsr #7 + str r2, [r3] + ldrb r2, [r4, sl] + cmp r6, r2 + blt _022291B4 +_0222920C: + cmp sl, #4 + bge _0222924C + ldr r1, _02229358 ; =ov13_0224F4BC + ldr r3, _02229354 ; =ov13_02244FA4 + ldr r4, [r1] + ldr r1, [sp, #4] + mov r2, #2 + mov r1, r1, lsl #2 + str r2, [sp] + add r0, r4, r0, lsl #4 + add r2, r4, sl, lsl #2 + ldrh r1, [r3, r1] + ldr r3, [r2, #0x104] + ldr r0, [r0, sl, lsl #2] + mov r2, sb + bl ov13_02240D94 +_0222924C: + add r0, sl, #3 + mov r1, #4 + bl FX_ModS32 + add r3, sp, #0xd + ldrb r1, [r3, sl] + mov r5, #0 + cmp r1, #0 + ble _022292D4 + ldr r2, _02229364 ; =ov13_02244F84 + mov r1, r0, lsl #2 + ldrh r0, [r2, r1] + ldr r8, _02229358 ; =ov13_0224F4BC + ldr r6, _0222935C ; =0xC1FFFCFF + ldr r7, _02229360 ; =0xFE00FF00 + and r4, sb, #0xff + mov r2, r0, lsl #0x17 +_0222928C: + ldr r0, [r8] + add r5, r5, #1 + add r0, r1, r0 + ldr fp, [r0, #0xec] + ldr r0, [fp] + and r0, r0, r6 + str r0, [fp] + ldr r0, [r8] + add r0, r1, r0 + ldr r0, [r0, #0xec] + ldr fp, [r0] + and fp, fp, r7 + orr fp, fp, r4 + orr fp, fp, r2, lsr #7 + str fp, [r0] + ldrb r0, [r3, sl] + cmp r5, r0 + blt _0222928C +_022292D4: + add r7, sp, #8 + ldrb r0, [r7, sl] + mov r8, #0 + cmp r0, #0 + addle sp, sp, #0x18 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, _02229368 ; =ov13_02244F7C + ldr r4, _02229358 ; =ov13_0224F4BC + mvn r6, #0 + mov fp, r8 +_022292FC: + ldr r0, [r4] + mov r1, r6 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #0xfc] + mov r2, fp + mov r3, fp + bl ov13_0223FDF4 + ldr r0, [r4] + mov r1, r8, lsl #2 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #0xfc] + ldrh r2, [r5, r1] + mov r1, r6 + mov r3, sb + bl ov13_0223FF18 + ldrb r0, [r7, sl] + add r8, r8, #1 + cmp r8, r0 + blt _022292FC + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02229350: .word ov13_02244F60 +_02229354: .word ov13_02244FA4 +_02229358: .word ov13_0224F4BC +_0222935C: .word 0xC1FFFCFF +_02229360: .word 0xFE00FF00 +_02229364: .word ov13_02244F84 +_02229368: .word ov13_02244F7C + arm_func_end ov13_022290F0 + + arm_func_start ov13_0222936C +ov13_0222936C: ; 0x0222936C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r1, _022293E8 ; =ov13_0224F4BC + mov r5, #0 + ldr r1, [r1] + mov r8, r0 + ldr sb, _022293EC ; =ov13_02244FA4 + mov r6, r5 + mov r4, r5 + mov r7, r5 + strb r8, [r1, #0x11d] +_02229394: + add r0, sb, r7, lsl #2 + ldrh r2, [r0, #2] + mov r0, r8 + mov r1, r4 + bl ov13_022290F0 + add r4, r4, #1 + cmp r4, #4 + add r7, r7, #0xc + blt _02229394 + cmp r8, #2 + moveq r5, #1 + beq _022293CC + cmp r8, #1 + moveq r6, #1 +_022293CC: + mov r1, r5 + mov r0, #0x2f + bl ov13_022293F0 + mov r1, r6 + mov r0, #0x30 + bl ov13_022293F0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_022293E8: .word ov13_0224F4BC +_022293EC: .word ov13_02244FA4 + arm_func_end ov13_0222936C + + arm_func_start ov13_022293F0 +ov13_022293F0: ; 0x022293F0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmltia sp!, {r3, pc} + cmp r0, #0x2f + bge _0222943C + ldr r2, _022294AC ; =ov13_0224F4BC + ldr r3, _022294B0 ; =ov13_02244F4C + ldr r2, [r2] + ldrb r1, [r3, r1] + add r0, r2, r0, lsl #2 + ldr r2, [r0, #0x30] + ldr r0, [r2] + bic r0, r0, #0xc00 + str r0, [r2] + ldrh r0, [r2, #4] + bic r0, r0, #0xf000 + orr r0, r0, r1, lsl #12 + strh r0, [r2, #4] + ldmia sp!, {r3, pc} +_0222943C: + sub ip, r0, #0x2f + cmp ip, #4 + bge _02229480 + ldr r0, _022294AC ; =ov13_0224F4BC + ldr r2, _022294B0 ; =ov13_02244F4C + ldr r3, [r0] + ldrb r0, [r2, r1] + add r1, r3, ip, lsl #2 + ldr r2, [r1, #0xec] + ldr r1, [r2] + bic r1, r1, #0xc00 + str r1, [r2] + ldrh r1, [r2, #4] + bic r1, r1, #0xf000 + orr r0, r1, r0, lsl #12 + strh r0, [r2, #4] + ldmia sp!, {r3, pc} +_02229480: + ldr r2, _022294AC ; =ov13_0224F4BC + ldr r3, _022294B4 ; =ov13_02244F50 + ldr r2, [r2] + sub r0, r0, #0x33 + add r0, r2, r0, lsl #2 + ldrb r3, [r3, r1] + ldr r0, [r0, #0xfc] + mvn r1, #0 + mov r2, #0 + bl ov13_0223FE98 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022294AC: .word ov13_0224F4BC +_022294B0: .word ov13_02244F4C +_022294B4: .word ov13_02244F50 + arm_func_end ov13_022293F0 + + arm_func_start ov13_022294B8 +ov13_022294B8: ; 0x022294B8 + stmdb sp!, {r4, lr} + ldr r0, _02229588 ; =ov13_0224F4BC + ldr r1, [r0] + add r0, r1, #0x100 + ldrsb r0, [r0, #0x21] + sub r0, r0, #0x2f + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _0222951C +_022294DC: ; jump table + b _022294F4 ; case 0 + b _022294FC ; case 1 + b _02229504 ; case 2 + b _0222950C ; case 3 + b _02229514 ; case 4 + b _02229514 ; case 5 +_022294F4: + mov r4, #0x42 + b _02229520 +_022294FC: + mov r4, #0x41 + b _02229520 +_02229504: + mov r4, #0x43 + b _02229520 +_0222950C: + mov r4, #0x41 + b _02229520 +_02229514: + mov r4, #0x45 + b _02229520 +_0222951C: + mov r4, #0x40 +_02229520: + ldr r0, [r1, #0x114] + mov r1, #0 + bl ov13_0223FDE0 + mov r2, r0 + mov r1, r4 + mov r0, #0 + bl ov13_022400F0 + ldr r0, _02229588 ; =ov13_0224F4BC + mvn r1, #0 + ldr r0, [r0] + mov r2, #2 + ldr r0, [r0, #0x114] + bl ov13_02240008 + ldr r0, _02229588 ; =ov13_0224F4BC + ldr r2, _0222958C ; =ov13_02245060 + ldr r3, [r0] + mvn r1, #0 + add r0, r3, #0x100 + ldrsb ip, [r0, #0x21] + ldr r0, [r3, #0x114] + ldr r3, _02229590 ; =ov13_02245062 + mov ip, ip, lsl #2 + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + bl ov13_0223FF18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229588: .word ov13_0224F4BC +_0222958C: .word ov13_02245060 +_02229590: .word ov13_02245062 + arm_func_end ov13_022294B8 + + arm_func_start ov13_02229594 +ov13_02229594: ; 0x02229594 + stmdb sp!, {r3, lr} + ldr r2, _022299C4 ; =ov13_0224F4BC + ldr r3, _022299C8 ; =ov13_02245134 + ldr ip, [r2] + add r1, ip, #0x100 + ldrsb lr, [r1, #0x21] + add r1, r3, lr, lsl #2 + ldrsb r1, [r0, r1] + strb r1, [ip, #0x121] + ldr r1, [r2] + add r2, r1, #0x100 + ldrsb r3, [r2, #0x21] + cmp r3, #0x2e + cmpeq r0, #3 + streqb lr, [r1, #0x120] + beq _022299B4 + cmp r3, #0x33 + bne _022295EC + cmp r0, #1 + cmpne r0, #3 + streqb lr, [r1, #0x120] + beq _022299B4 +_022295EC: + cmp r3, #0x34 + bne _0222960C + cmp r0, #1 + cmpne r0, #3 + bne _0222960C + cmp lr, #0x2e + strneb lr, [r1, #0x120] + b _022299B4 +_0222960C: + mvn r2, #0 + cmp r3, r2 + bne _0222963C + add r0, r1, #0x100 + ldrsb r0, [r0, #0x20] + cmp r0, #0x23 + cmpne r0, #0x32 + moveq r0, #0x23 + streqb r0, [r1, #0x121] + movne r0, #0x22 + strneb r0, [r1, #0x121] + b _022299B4 +_0222963C: + sub r0, r2, #1 + cmp r3, r0 + bne _022296FC + add r0, r1, #0x100 + ldrsb r0, [r0, #0x20] + cmp r0, #0x26 + bgt _02229694 + bge _022296CC + cmp r0, #5 + bgt _02229688 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _022296F0 +_02229670: ; jump table + b _022296B4 ; case 0 + b _022296C0 ; case 1 + b _022296F0 ; case 2 + b _022296CC ; case 3 + b _022296D8 ; case 4 + b _022296E4 ; case 5 +_02229688: + cmp r0, #0x24 + beq _022296C0 + b _022296F0 +_02229694: + cmp r0, #0x28 + bgt _022296AC + bge _022296E4 + cmp r0, #0x27 + beq _022296D8 + b _022296F0 +_022296AC: + cmp r0, #0x31 + bne _022296F0 +_022296B4: + mov r0, #0x31 + strb r0, [r1, #0x121] + b _022299B4 +_022296C0: + mov r0, #0x24 + strb r0, [r1, #0x121] + b _022299B4 +_022296CC: + mov r0, #0x26 + strb r0, [r1, #0x121] + b _022299B4 +_022296D8: + mov r0, #0x27 + strb r0, [r1, #0x121] + b _022299B4 +_022296E4: + mov r0, #0x28 + strb r0, [r1, #0x121] + b _022299B4 +_022296F0: + mov r0, #0x25 + strb r0, [r1, #0x121] + b _022299B4 +_022296FC: + sub r0, r2, #2 + cmp r3, r0 + bne _022297F4 + add r0, r1, #0x100 + ldrsb r0, [r0, #0x20] + cmp r0, #0x23 + bgt _0222976C + bge _022297DC + cmp r0, #0xb + bgt _02229760 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _022297E8 +_02229730: ; jump table + b _022297E8 ; case 0 + b _022297E8 ; case 1 + b _022297E8 ; case 2 + b _022297E8 ; case 3 + b _022297E8 ; case 4 + b _022297E8 ; case 5 + b _022297AC ; case 6 + b _022297B8 ; case 7 + b _022297E8 ; case 8 + b _022297C4 ; case 9 + b _022297D0 ; case 10 + b _022297DC ; case 11 +_02229760: + cmp r0, #0x22 + beq _022297DC + b _022297E8 +_0222976C: + cmp r0, #0x2a + bgt _02229784 + bge _022297B8 + cmp r0, #0x29 + beq _022297AC + b _022297E8 +_02229784: + cmp r0, #0x32 + bgt _022297E8 + cmp r0, #0x2c + blt _022297E8 + beq _022297C4 + cmp r0, #0x2d + beq _022297D0 + cmp r0, #0x32 + beq _022297DC + b _022297E8 +_022297AC: + mov r0, #0x29 + strb r0, [r1, #0x121] + b _022299B4 +_022297B8: + mov r0, #0x2a + strb r0, [r1, #0x121] + b _022299B4 +_022297C4: + mov r0, #0x2c + strb r0, [r1, #0x121] + b _022299B4 +_022297D0: + mov r0, #0x2d + strb r0, [r1, #0x121] + b _022299B4 +_022297DC: + mov r0, #0x2e + strb r0, [r1, #0x121] + b _022299B4 +_022297E8: + mov r0, #0x2b + strb r0, [r1, #0x121] + b _022299B4 +_022297F4: + sub r0, r2, #3 + cmp r3, r0 + bne _022298B4 + add r0, r1, #0x100 + ldrsb r0, [r0, #0x20] + cmp r0, #0x26 + bgt _0222984C + bge _02229884 + cmp r0, #5 + bgt _02229840 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _022298A8 +_02229828: ; jump table + b _0222986C ; case 0 + b _02229878 ; case 1 + b _022298A8 ; case 2 + b _02229884 ; case 3 + b _02229890 ; case 4 + b _0222989C ; case 5 +_02229840: + cmp r0, #0x24 + beq _02229878 + b _022298A8 +_0222984C: + cmp r0, #0x28 + bgt _02229864 + bge _0222989C + cmp r0, #0x27 + beq _02229890 + b _022298A8 +_02229864: + cmp r0, #0x31 + bne _022298A8 +_0222986C: + mov r0, #0 + strb r0, [r1, #0x121] + b _022299B4 +_02229878: + mov r0, #1 + strb r0, [r1, #0x121] + b _022299B4 +_02229884: + mov r0, #3 + strb r0, [r1, #0x121] + b _022299B4 +_02229890: + mov r0, #4 + strb r0, [r1, #0x121] + b _022299B4 +_0222989C: + mov r0, #5 + strb r0, [r1, #0x121] + b _022299B4 +_022298A8: + mov r0, #2 + strb r0, [r1, #0x121] + b _022299B4 +_022298B4: + sub r0, r2, #4 + cmp r3, r0 + bne _022299B4 + add r0, r1, #0x100 + ldrsb r0, [r0, #0x20] + cmp r0, #0x23 + bgt _02229924 + bge _022299A0 + cmp r0, #0xb + bgt _02229918 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _022299AC +_022298E8: ; jump table + b _022299AC ; case 0 + b _022299AC ; case 1 + b _022299AC ; case 2 + b _022299AC ; case 3 + b _022299AC ; case 4 + b _022299AC ; case 5 + b _02229964 ; case 6 + b _02229970 ; case 7 + b _022299AC ; case 8 + b _0222997C ; case 9 + b _02229988 ; case 10 + b _02229994 ; case 11 +_02229918: + cmp r0, #0x22 + beq _02229994 + b _022299AC +_02229924: + cmp r0, #0x2a + bgt _0222993C + bge _02229970 + cmp r0, #0x29 + beq _02229964 + b _022299AC +_0222993C: + cmp r0, #0x32 + bgt _022299AC + cmp r0, #0x2c + blt _022299AC + beq _0222997C + cmp r0, #0x2d + beq _02229988 + cmp r0, #0x32 + beq _022299A0 + b _022299AC +_02229964: + mov r0, #6 + strb r0, [r1, #0x121] + b _022299B4 +_02229970: + mov r0, #7 + strb r0, [r1, #0x121] + b _022299B4 +_0222997C: + mov r0, #9 + strb r0, [r1, #0x121] + b _022299B4 +_02229988: + mov r0, #0xa + strb r0, [r1, #0x121] + b _022299B4 +_02229994: + mov r0, #0xb + strb r0, [r1, #0x121] + b _022299B4 +_022299A0: + mov r0, #0x32 + strb r0, [r1, #0x121] + b _022299B4 +_022299AC: + mov r0, #8 + strb r0, [r1, #0x121] +_022299B4: + bl ov13_022294B8 + mov r0, #8 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022299C4: .word ov13_0224F4BC +_022299C8: .word ov13_02245134 + arm_func_end ov13_02229594 + + arm_func_start ov13_022299CC +ov13_022299CC: ; 0x022299CC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02229A44 ; =ov13_0224F4BC + mov r4, r0 + ldr r0, [r1] + mov r1, #0 + ldr r0, [r0, #0xfc] + bl ov13_0223FDE0 + ldr r3, [r0] + ldr r1, _02229A44 ; =ov13_0224F4BC + ldr r0, _02229A48 ; =0x01FF0000 + and r2, r3, #0xff + and r0, r3, r0 + mov r3, r0, lsr #0x10 + ldr r1, [r1] + add r2, r2, #0xc + ldrb r0, [r1, #0x11d] + str r2, [sp] + mov r1, #4 + str r3, [sp, #4] + bl ov13_022290F0 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02229A4C ; =ov13_02229A50 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229A44: .word ov13_0224F4BC +_02229A48: .word 0x01FF0000 +_02229A4C: .word ov13_02229A50 + arm_func_end ov13_022299CC + + arm_func_start ov13_02229A50 +ov13_02229A50: ; 0x02229A50 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02229AB8 ; =ov13_0224F4BC + ldr r2, _02229ABC ; =0x01FF0000 + ldr r3, [r1] + mov r4, r0 + ldr r1, [r3, #0xc0] + ldrb r0, [r3, #0x11d] + ldr ip, [r1] + mov r1, #3 + and r3, ip, #0xff + and ip, ip, r2 + add r2, r3, #0xc + mov r3, ip, lsr #0x10 + str r2, [sp] + str r3, [sp, #4] + bl ov13_022290F0 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02229AC0 ; =ov13_02229AC4 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229AB8: .word ov13_0224F4BC +_02229ABC: .word 0x01FF0000 +_02229AC0: .word ov13_02229AC4 + arm_func_end ov13_02229A50 + + arm_func_start ov13_02229AC4 +ov13_02229AC4: ; 0x02229AC4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02229B2C ; =ov13_0224F4BC + ldr r2, _02229B30 ; =0x01FF0000 + ldr r3, [r1] + mov r4, r0 + ldr r1, [r3, #0x90] + ldrb r0, [r3, #0x11d] + ldr ip, [r1] + mov r1, #2 + and r3, ip, #0xff + and ip, ip, r2 + add r2, r3, #0xc + mov r3, ip, lsr #0x10 + str r2, [sp] + str r3, [sp, #4] + bl ov13_022290F0 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02229B34 ; =ov13_02229B38 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229B2C: .word ov13_0224F4BC +_02229B30: .word 0x01FF0000 +_02229B34: .word ov13_02229B38 + arm_func_end ov13_02229AC4 + + arm_func_start ov13_02229B38 +ov13_02229B38: ; 0x02229B38 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02229BA0 ; =ov13_0224F4BC + ldr r2, _02229BA4 ; =0x01FF0000 + ldr r3, [r1] + mov r4, r0 + ldr r1, [r3, #0x60] + ldrb r0, [r3, #0x11d] + ldr ip, [r1] + mov r1, #1 + and r3, ip, #0xff + and ip, ip, r2 + add r2, r3, #0xc + mov r3, ip, lsr #0x10 + str r2, [sp] + str r3, [sp, #4] + bl ov13_022290F0 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02229BA8 ; =ov13_02229BAC + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229BA0: .word ov13_0224F4BC +_02229BA4: .word 0x01FF0000 +_02229BA8: .word ov13_02229BAC + arm_func_end ov13_02229B38 + + arm_func_start ov13_02229BAC +ov13_02229BAC: ; 0x02229BAC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _02229C14 ; =ov13_0224F4BC + ldr r2, _02229C18 ; =0x01FF0000 + ldr r3, [r1] + mov r4, r0 + ldr r1, [r3, #0x30] + ldrb r0, [r3, #0x11d] + ldr ip, [r1] + mov r1, #0 + and r3, ip, #0xff + and ip, ip, r2 + add r2, r3, #0xc + mov r3, ip, lsr #0x10 + str r2, [sp] + str r3, [sp, #4] + bl ov13_022290F0 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _02229C1C ; =ov13_02229C20 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02229C14: .word ov13_0224F4BC +_02229C18: .word 0x01FF0000 +_02229C1C: .word ov13_02229C20 + arm_func_end ov13_02229BAC + + arm_func_start ov13_02229C20 +ov13_02229C20: ; 0x02229C20 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r1, r0 + mov r0, #0 + bl ov13_022425D0 + mov r5, #0 + ldr r7, _02229CF8 ; =ov13_0224F4BC + mov r4, r5 +_02229C3C: + mov r6, r4 +_02229C40: + ldr r0, [r7] + add r0, r0, r5, lsl #4 + ldr r0, [r0, r6, lsl #2] + bl ov13_02240874 + cmp r5, #0 + bne _02229C68 + ldr r0, [r7] + add r0, r0, r6, lsl #2 + ldr r0, [r0, #0x104] + bl ov13_0223FD60 +_02229C68: + add r6, r6, #1 + cmp r6, #4 + blt _02229C40 + add r5, r5, #1 + cmp r5, #3 + blt _02229C3C + ldr r4, _02229CF8 ; =ov13_0224F4BC + mov r5, #0 +_02229C88: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xfc] + bl ov13_0223FD60 + add r5, r5, #1 + cmp r5, #2 + blt _02229C88 + ldr r4, _02229CF8 ; =ov13_0224F4BC + mov r5, #0 +_02229CAC: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xec] + bl ov13_02241D98 + add r5, r5, #1 + cmp r5, #4 + blt _02229CAC + ldr r4, _02229CF8 ; =ov13_0224F4BC + mov r5, #0 +_02229CD0: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x30] + bl ov13_02241D98 + add r5, r5, #1 + cmp r5, #0x2f + blt _02229CD0 + ldr r0, _02229CFC ; =ov13_0224F4BC + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02229CF8: .word ov13_0224F4BC +_02229CFC: .word ov13_0224F4BC + arm_func_end ov13_02229C20 + + arm_func_start ov13_02229D00 +ov13_02229D00: ; 0x02229D00 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + ldr r0, _0222A020 ; =ov13_02245228 + mov r3, #0x1c + ldrh r5, [r0, #0x20] + ldrh r4, [r0, #0x22] + mov r2, #0x14 + mov r0, #0x6c + mov r1, #4 + strh r5, [sp, #0x1c] + strh r4, [sp, #0x1e] + strh r3, [sp, #0x20] + strh r2, [sp, #0x22] + bl ov13_0224128C + ldr r8, _0222A024 ; =ov13_0224F4C0 + mov r6, #0 + mov r1, #0x1f + str r0, [r8] + strb r1, [r0, #0x60] + ldr r0, [r8] + mov r1, #1 + strb r6, [r0, #0x63] + ldr r0, [r8] + ldr r7, _0222A028 ; =0xC1FFFCFF + strb r1, [r0, #0x66] + ldr r0, [r8] + mov r5, r6 + strb r1, [r0, #0x67] + ldr r0, [r8] + mov r4, #0x36 + strb r1, [r0, #0x68] +_02229D7C: + mov r0, r5 + mov r1, r4 + bl ov13_02240184 + ldr r1, [r8] + add r1, r1, r6, lsl #2 + str r0, [r1, #0x10] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x10] + ldr r0, [r1] + and r0, r0, r7 + orr r0, r0, #0x200 + str r0, [r1] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x10] + add r6, r6, #1 + ldrh r0, [r1, #4] + cmp r6, #0xa + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + blt _02229D7C + mov r6, #0 + ldr r5, _0222A02C ; =ov13_02245214 + ldr r8, _0222A024 ; =ov13_0224F4C0 + ldr r7, _0222A028 ; =0xC1FFFCFF + mov r4, r6 +_02229DEC: + ldrb r1, [r5], #1 + mov r0, r4 + bl ov13_02240184 + ldr r1, [r8] + add r1, r1, r6, lsl #2 + str r0, [r1, #0x38] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x38] + ldr r0, [r1] + and r0, r0, r7 + orr r0, r0, #0x200 + str r0, [r1] + ldr r0, [r8] + add r0, r0, r6, lsl #2 + ldr r1, [r0, #0x38] + add r6, r6, #1 + ldrh r0, [r1, #4] + cmp r6, #2 + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + blt _02229DEC + mov sl, #0 + ldr sb, _0222A030 ; =ov13_02245218 + ldr r4, _0222A024 ; =ov13_0224F4C0 + mov r8, sl + mov r7, #1 + mvn r6, #0 + mov r5, #0x200 + mov fp, sl +_02229E68: + ldrb r1, [sb], #1 + mov r0, r8 + mov r2, r7 + bl ov13_022401B0 + ldr r2, [r4] + mov r1, r6 + add r2, r2, sl, lsl #2 + str r0, [r2, #0x40] + ldr r0, [r4] + mov r2, r5 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #0x40] + mov r3, fp + bl ov13_0223FDF4 + ldr r0, [r4] + mov r1, r6 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #0x40] + mov r2, #3 + bl ov13_02240008 + add sl, sl, #1 + cmp sl, #2 + blt _02229E68 + mov sl, #0 + str sl, [sp, #0x10] + strh sl, [sp, #0x16] +_02229ED0: + add r1, sp, #0x18 + mov r0, #0 + str r1, [sp] + mov r3, r0 + mov r1, #0xc + mov r2, #4 + str r0, [sp, #4] + bl ov13_02240798 + ldr fp, _0222A024 ; =ov13_0224F4C0 + mov sb, #0 + ldr r1, [fp] + ldr r8, [sp, #0x10] + ldr r7, _0222A034 ; =ov13_02245260 + str r0, [r1, sl, lsl #2] + strh sb, [sp, #0x1c] + mov r6, #2 + mov r5, #0x480 + add r4, sp, #0x14 +_02229F18: + mov r0, r8, lsl #1 + ldrh r2, [r7, r0] + ldrh r0, [sp, #0x22] + ldrh r1, [sp, #0x1c] + strh r2, [sp, #0x14] + stmia sp, {r0, r6} + str r5, [sp, #8] + str r4, [sp, #0xc] + ldr r0, [fp] + ldrh r2, [sp, #0x1e] + ldrh r3, [sp, #0x20] + ldr r0, [r0, sl, lsl #2] + bl ov13_02240CC0 + ldrh r0, [sp, #0x1c] + add sb, sb, #1 + cmp sb, #3 + add r0, r0, #0x20 + strh r0, [sp, #0x1c] + add r8, r8, #1 + blt _02229F18 + mov r0, #0 + ldr r1, [sp, #0x18] + mov r2, r0 + bl ov13_0223FC04 + ldr r1, [sp, #0x10] + ldr r2, _0222A024 ; =ov13_0224F4C0 + add r1, r1, #3 + str r1, [sp, #0x10] + ldr r1, [r2] + add r1, r1, sl, lsl #2 + add sl, sl, #1 + str r0, [r1, #0x48] + cmp sl, #4 + blt _02229ED0 + mov r0, #0 + mov r1, #0x44 + mov r2, #1 + bl ov13_022401B0 + ldr r3, _0222A024 ; =ov13_0224F4C0 + mvn r1, #0 + ldr r4, [r3] + mov r2, #0x200 + str r0, [r4, #0x58] + ldr r0, [r3] + mov r3, #0 + ldr r0, [r0, #0x58] + bl ov13_0223FDF4 + ldr r0, _0222A024 ; =ov13_0224F4C0 + mvn r1, #0 + ldr r0, [r0] + mov r2, #2 + ldr r0, [r0, #0x58] + bl ov13_02240008 + mov r0, #0 + ldr r1, _0222A038 ; =ov13_0222A0DC + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r2, _0222A024 ; =ov13_0224F4C0 + mov r1, #0xc0 + ldr r2, [r2] + str r0, [r2, #0x5c] + mov r0, #0 + bl ov13_0222AAFC + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0222A020: .word ov13_02245228 +_0222A024: .word ov13_0224F4C0 +_0222A028: .word 0xC1FFFCFF +_0222A02C: .word ov13_02245214 +_0222A030: .word ov13_02245218 +_0222A034: .word ov13_02245260 +_0222A038: .word ov13_0222A0DC + arm_func_end ov13_02229D00 + + arm_func_start ov13_0222A03C +ov13_0222A03C: ; 0x0222A03C + stmdb sp!, {r3, lr} + ldr r0, _0222A068 ; =ov13_0224F4C0 + ldr r0, [r0] + ldr r0, [r0, #0x58] + bl ov13_0223FD60 + ldr r0, _0222A068 ; =ov13_0224F4C0 + ldr r1, _0222A06C ; =ov13_0222AF5C + ldr r0, [r0] + ldr r0, [r0, #0x5c] + bl ov13_022425C8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222A068: .word ov13_0224F4C0 +_0222A06C: .word ov13_0222AF5C + arm_func_end ov13_0222A03C + + arm_func_start ov13_0222A070 +ov13_0222A070: ; 0x0222A070 + ldr r0, _0222A080 ; =ov13_0224F4C0 + ldr r0, [r0] + ldrb r0, [r0, #0x60] + bx lr + .balign 4, 0 +_0222A080: .word ov13_0224F4C0 + arm_func_end ov13_0222A070 + + arm_func_start ov13_0222A084 +ov13_0222A084: ; 0x0222A084 + ldr r1, _0222A094 ; =ov13_0224F4C0 + ldr r1, [r1] + strb r0, [r1, #0x66] + bx lr + .balign 4, 0 +_0222A094: .word ov13_0224F4C0 + arm_func_end ov13_0222A084 + + arm_func_start ov13_0222A098 +ov13_0222A098: ; 0x0222A098 + ldr r1, _0222A0A8 ; =ov13_0224F4C0 + ldr r1, [r1] + strb r0, [r1, #0x67] + bx lr + .balign 4, 0 +_0222A0A8: .word ov13_0224F4C0 + arm_func_end ov13_0222A098 + + arm_func_start ov13_0222A0AC +ov13_0222A0AC: ; 0x0222A0AC + ldr r1, _0222A0BC ; =ov13_0224F4C0 + ldr r1, [r1] + strb r0, [r1, #0x68] + bx lr + .balign 4, 0 +_0222A0BC: .word ov13_0224F4C0 + arm_func_end ov13_0222A0AC + + arm_func_start ov13_0222A0C0 +ov13_0222A0C0: ; 0x0222A0C0 + ldr r0, _0222A0D8 ; =ov13_0224F4C0 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0222A0D8: .word ov13_0224F4C0 + arm_func_end ov13_0222A0C0 + + arm_func_start ov13_0222A0DC +ov13_0222A0DC: ; 0x0222A0DC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _0222A154 ; =ov13_0224F4C0 + mov r4, r0 + ldr r2, [r2] + ldr r1, _0222A158 ; =0x01FF0000 + ldr r0, [r2, #0x10] + ldr r0, [r0] + and r2, r0, r1 + and r0, r0, #0xff + sub r1, r0, #0xc + mov r0, r2, lsr #0x10 + str r0, [sp, #4] + str r1, [sp] + cmp r1, #0x4c + mov r0, #0 + ble _0222A12C + bl ov13_0222AAFC + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222A12C: + mov r1, #0x4c + bl ov13_0222AAFC + mov r0, #1 + mov r1, #0xc0 + bl ov13_0222AAFC + ldr r1, _0222A15C ; =ov13_0222A160 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A154: .word ov13_0224F4C0 +_0222A158: .word 0x01FF0000 +_0222A15C: .word ov13_0222A160 + arm_func_end ov13_0222A0DC + + arm_func_start ov13_0222A160 +ov13_0222A160: ; 0x0222A160 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _0222A1D8 ; =ov13_0224F4C0 + mov r4, r0 + ldr r2, [r2] + ldr r1, _0222A1DC ; =0x01FF0000 + ldr r0, [r2, #0x1c] + ldr r0, [r0] + and r2, r0, r1 + and r0, r0, #0xff + sub r1, r0, #0xc + mov r0, r2, lsr #0x10 + str r0, [sp, #4] + str r1, [sp] + cmp r1, #0x63 + mov r0, #1 + ble _0222A1B0 + bl ov13_0222AAFC + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222A1B0: + mov r1, #0x63 + bl ov13_0222AAFC + mov r0, #2 + mov r1, #0xc0 + bl ov13_0222AAFC + ldr r1, _0222A1E0 ; =ov13_0222A1E4 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A1D8: .word ov13_0224F4C0 +_0222A1DC: .word 0x01FF0000 +_0222A1E0: .word ov13_0222A1E4 + arm_func_end ov13_0222A160 + + arm_func_start ov13_0222A1E4 +ov13_0222A1E4: ; 0x0222A1E4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _0222A25C ; =ov13_0224F4C0 + mov r4, r0 + ldr r2, [r2] + ldr r1, _0222A260 ; =0x01FF0000 + ldr r0, [r2, #0x28] + ldr r0, [r0] + and r2, r0, r1 + and r0, r0, #0xff + sub r1, r0, #0xc + mov r0, r2, lsr #0x10 + str r0, [sp, #4] + str r1, [sp] + cmp r1, #0x7a + mov r0, #2 + ble _0222A234 + bl ov13_0222AAFC + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222A234: + mov r1, #0x7a + bl ov13_0222AAFC + mov r0, #3 + mov r1, #0xc0 + bl ov13_0222AAFC + ldr r1, _0222A264 ; =ov13_0222A268 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A25C: .word ov13_0224F4C0 +_0222A260: .word 0x01FF0000 +_0222A264: .word ov13_0222A268 + arm_func_end ov13_0222A1E4 + + arm_func_start ov13_0222A268 +ov13_0222A268: ; 0x0222A268 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _0222A2E0 ; =ov13_0224F4C0 + mov r4, r0 + ldr r2, [r2] + ldr r1, _0222A2E4 ; =0x01FF0000 + ldr r0, [r2, #0x34] + ldr r0, [r0] + and r2, r0, r1 + and r0, r0, #0xff + sub r1, r0, #0xc + mov r0, r2, lsr #0x10 + str r0, [sp, #4] + str r1, [sp] + cmp r1, #0x91 + mov r0, #3 + ble _0222A2B8 + bl ov13_0222AAFC + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222A2B8: + mov r1, #0x91 + bl ov13_0222AAFC + mov r0, #4 + mov r1, #0xc0 + bl ov13_0222AAFC + ldr r1, _0222A2E8 ; =ov13_0222A2EC + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A2E0: .word ov13_0224F4C0 +_0222A2E4: .word 0x01FF0000 +_0222A2E8: .word ov13_0222A2EC + arm_func_end ov13_0222A268 + + arm_func_start ov13_0222A2EC +ov13_0222A2EC: ; 0x0222A2EC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222A358 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0, #0x40] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + sub r1, r0, #0xc + str r1, [sp] + cmp r1, #0xaa + mov r0, #4 + ble _0222A338 + bl ov13_0222AAFC + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0222A338: + mov r1, #0xaa + bl ov13_0222AAFC + bl ov13_0222AE24 + ldr r1, _0222A35C ; =ov13_0222A360 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A358: .word ov13_0224F4C0 +_0222A35C: .word ov13_0222A360 + arm_func_end ov13_0222A2EC + + arm_func_start ov13_0222A360 +ov13_0222A360: ; 0x0222A360 + stmdb sp!, {r3, lr} + bl ov13_0222A378 + bl ov13_0222A554 + bl ov13_0222A724 + bl ov13_0222A960 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222A360 + + arm_func_start ov13_0222A378 +ov13_0222A378: ; 0x0222A378 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r0, _0222A534 ; =ov13_02245958 + bl ov13_022417DC + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _0222A538 ; =ov13_0224F4C0 + mvn r1, #0 + ldr r0, [r0] + ldr r7, _0222A53C ; =ov13_0224527A + ldr r6, _0222A540 ; =ov13_02245228 + strb r1, [r0, #0x61] + mov r4, #0 + add r5, sp, #0 +_0222A3B4: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0222A414 + ldr r0, _0222A538 ; =ov13_0224F4C0 + ldr r0, [r0] + ldrb r0, [r0, #0x67] + cmp r0, #0 + bne _0222A3F8 + mov r0, #9 + bl ov13_0223ABB8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A3F8: + mov r0, #0 + bl ov13_0223ABB8 + ldr r0, _0222A538 ; =ov13_0224F4C0 + add sp, sp, #8 + ldr r0, [r0] + strb r4, [r0, #0x61] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A414: + add r4, r4, #1 + cmp r4, #0xa + add r7, r7, #4 + blt _0222A3B4 + ldr r7, _0222A544 ; =ov13_02245250 + ldr r6, _0222A548 ; =ov13_02245230 + mov r4, #0 + add r5, sp, #0 +_0222A434: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0222A4BC + cmp r4, #0 + bne _0222A470 + ldr r0, _0222A538 ; =ov13_0224F4C0 + ldr r0, [r0] + ldrb r0, [r0, #0x66] + cmp r0, #0 + beq _0222A48C +_0222A470: + cmp r4, #1 + bne _0222A49C + ldr r0, _0222A538 ; =ov13_0224F4C0 + ldr r0, [r0] + ldrb r0, [r0, #0x68] + cmp r0, #0 + bne _0222A49C +_0222A48C: + mov r0, #9 + bl ov13_0223ABB8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A49C: + mov r0, #0 + bl ov13_0223ABB8 + ldr r0, _0222A538 ; =ov13_0224F4C0 + add r1, r4, #0xa + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x61] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A4BC: + add r4, r4, #1 + cmp r4, #2 + add r7, r7, #4 + blt _0222A434 + ldr r6, _0222A54C ; =ov13_02245258 + ldr r5, _0222A550 ; =ov13_02245234 + mov r7, #0 + add r4, sp, #0 +_0222A4DC: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_022417DC + cmp r0, #0 + beq _0222A51C + mov r0, #0 + bl ov13_0223ABB8 + ldr r0, _0222A538 ; =ov13_0224F4C0 + add r1, r7, #0xc + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x61] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A51C: + add r7, r7, #1 + cmp r7, #2 + add r6, r6, #4 + blt _0222A4DC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0222A534: .word ov13_02245958 +_0222A538: .word ov13_0224F4C0 +_0222A53C: .word ov13_0224527A +_0222A540: .word ov13_02245228 +_0222A544: .word ov13_02245250 +_0222A548: .word ov13_02245230 +_0222A54C: .word ov13_02245258 +_0222A550: .word ov13_02245234 + arm_func_end ov13_0222A378 + + arm_func_start ov13_0222A554 +ov13_0222A554: ; 0x0222A554 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r1, _0222A6F8 ; =ov13_0224F4C0 + ldr r0, _0222A6FC ; =ov13_02245958 + ldr r1, [r1] + mov r2, #0 + strb r2, [r1, #0x60] + bl ov13_022418EC + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r7, _0222A700 ; =ov13_0224527A + ldr r6, _0222A704 ; =ov13_02245228 + mov r4, #0 + add r5, sp, #0 +_0222A590: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _0222A5E8 + ldr r0, _0222A6F8 ; =ov13_0224F4C0 + ldr r2, [r0] + ldrsb r1, [r2, #0x61] + cmp r1, r4 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _0222A708 ; =ov13_02245314 + ldrb r1, [r1, r4] + strb r1, [r2, #0x60] + ldr r0, [r0] + strb r4, [r0, #0x63] + bl ov13_0222AE24 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A5E8: + add r4, r4, #1 + cmp r4, #0xa + add r7, r7, #4 + blt _0222A590 + ldr r7, _0222A70C ; =ov13_02245250 + ldr r6, _0222A710 ; =ov13_02245230 + mov r4, #0 + add r5, sp, #0 +_0222A608: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _0222A664 + ldr r0, _0222A6F8 ; =ov13_0224F4C0 + add r2, r4, #0xa + ldr r3, [r0] + ldrsb r1, [r3, #0x61] + cmp r1, r2 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _0222A714 ; =ov13_02245224 + ldrb r1, [r1, r4] + strb r1, [r3, #0x60] + ldr r0, [r0] + strb r2, [r0, #0x63] + bl ov13_0222AE24 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A664: + add r4, r4, #1 + cmp r4, #2 + add r7, r7, #4 + blt _0222A608 + ldr r7, _0222A718 ; =ov13_02245258 + ldr r6, _0222A71C ; =ov13_02245234 + mov r4, #0 + add r5, sp, #0 +_0222A684: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022418EC + cmp r0, #0 + beq _0222A6E0 + ldr r0, _0222A6F8 ; =ov13_0224F4C0 + add r2, r4, #0xc + ldr r3, [r0] + ldrsb r1, [r3, #0x61] + cmp r1, r2 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _0222A720 ; =ov13_02245220 + ldrb r1, [r1, r4] + strb r1, [r3, #0x60] + ldr r0, [r0] + strb r2, [r0, #0x63] + bl ov13_0222AE24 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A6E0: + add r4, r4, #1 + cmp r4, #2 + add r7, r7, #4 + blt _0222A684 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0222A6F8: .word ov13_0224F4C0 +_0222A6FC: .word ov13_02245958 +_0222A700: .word ov13_0224527A +_0222A704: .word ov13_02245228 +_0222A708: .word ov13_02245314 +_0222A70C: .word ov13_02245250 +_0222A710: .word ov13_02245230 +_0222A714: .word ov13_02245224 +_0222A718: .word ov13_02245258 +_0222A71C: .word ov13_02245234 +_0222A720: .word ov13_02245220 + arm_func_end ov13_0222A554 + + arm_func_start ov13_0222A724 +ov13_0222A724: ; 0x0222A724 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r0, _0222A8F4 ; =ov13_02245958 + bl ov13_02241754 + cmp r0, #0 + beq _0222A8D4 + ldr r7, _0222A8F8 ; =ov13_0224527A + ldr r5, _0222A8FC ; =ov13_02245228 + mov r6, #0 + add r4, sp, #0 +_0222A74C: + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + beq _0222A78C + ldr r0, _0222A900 ; =ov13_0224F4C0 + ldr r0, [r0] + ldrsb r0, [r0, #0x61] + cmp r0, r6 + bne _0222A8D4 + mov r0, r6 + bl ov13_0222A914 + b _0222A8DC +_0222A78C: + add r6, r6, #1 + cmp r6, #0xa + add r7, r7, #4 + blt _0222A74C + ldr r6, _0222A904 ; =ov13_02245250 + ldr r5, _0222A908 ; =ov13_02245230 + mov r7, #0 + add r4, sp, #0 +_0222A7AC: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + beq _0222A864 + ldr r1, _0222A900 ; =ov13_0224F4C0 + add r0, r7, #0xa + ldr r1, [r1] + ldrsb r1, [r1, #0x61] + cmp r1, r0 + bne _0222A8D4 + bl ov13_0222A914 + cmp r7, #0 + bne _0222A8DC + ldr r0, _0222A900 ; =ov13_0224F4C0 + ldr r2, [r0] + ldrb r1, [r2, #0x65] + add r1, r1, #1 + strb r1, [r2, #0x65] + ldr r2, [r0] + ldrb r1, [r2, #0x65] + cmp r1, #0x28 + addlo sp, sp, #8 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r2, #0x66] + cmp r1, #0 + bne _0222A844 + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _0222A900 ; =ov13_0224F4C0 + mvn r1, #0 + ldr r0, [r0] + add sp, sp, #8 + strb r1, [r0, #0x61] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A844: + mov r1, #0x10 + strb r1, [r2, #0x60] + ldr r1, [r0] + add sp, sp, #8 + ldrb r0, [r1, #0x65] + sub r0, r0, #7 + strb r0, [r1, #0x65] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A864: + add r7, r7, #1 + cmp r7, #2 + add r6, r6, #4 + blt _0222A7AC + ldr r6, _0222A90C ; =ov13_02245258 + ldr r5, _0222A910 ; =ov13_02245234 + mov r7, #0 + add r4, sp, #0 +_0222A884: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_02240E74 + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + beq _0222A8C4 + ldr r1, _0222A900 ; =ov13_0224F4C0 + add r0, r7, #0xc + ldr r1, [r1] + ldrsb r1, [r1, #0x61] + cmp r1, r0 + bne _0222A8D4 + bl ov13_0222A914 + b _0222A8DC +_0222A8C4: + add r7, r7, #1 + cmp r7, #2 + add r6, r6, #4 + blt _0222A884 +_0222A8D4: + mvn r0, #0 + bl ov13_0222A914 +_0222A8DC: + ldr r0, _0222A900 ; =ov13_0224F4C0 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x65] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0222A8F4: .word ov13_02245958 +_0222A8F8: .word ov13_0224527A +_0222A8FC: .word ov13_02245228 +_0222A900: .word ov13_0224F4C0 +_0222A904: .word ov13_02245250 +_0222A908: .word ov13_02245230 +_0222A90C: .word ov13_02245258 +_0222A910: .word ov13_02245234 + arm_func_end ov13_0222A724 + + arm_func_start ov13_0222A914 +ov13_0222A914: ; 0x0222A914 + stmdb sp!, {r4, lr} + ldr r1, _0222A95C ; =ov13_0224F4C0 + mov r4, r0 + ldr r1, [r1] + ldrsb r1, [r1, #0x62] + cmp r4, r1 + ldmeqia sp!, {r4, pc} + mov r1, #1 + bl ov13_0222AD5C + ldr r0, _0222A95C ; =ov13_0224F4C0 + mov r1, #0 + ldr r0, [r0] + ldrsb r0, [r0, #0x62] + bl ov13_0222AD5C + ldr r0, _0222A95C ; =ov13_0224F4C0 + ldr r0, [r0] + strb r4, [r0, #0x62] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222A95C: .word ov13_0224F4C0 + arm_func_end ov13_0222A914 + + arm_func_start ov13_0222A960 +ov13_0222A960: ; 0x0222A960 + stmdb sp!, {r3, lr} + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _0222A97C + mov r0, #0 + bl ov13_0222AEB0 +_0222A97C: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _0222A994 + mov r0, #1 + bl ov13_0222AEB0 +_0222A994: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + beq _0222A9AC + mov r0, #2 + bl ov13_0222AEB0 +_0222A9AC: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _0222A9C4 + mov r0, #3 + bl ov13_0222AEB0 +_0222A9C4: + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222AA70 + ldr r0, _0222AAEC ; =ov13_0224F4C0 + ldr r0, [r0] + ldrsb r2, [r0, #0x63] + cmp r2, #0xa + bge _0222AA10 + ldrb r1, [r0, #0x67] + cmp r1, #0 + beq _0222AA04 + ldr r1, _0222AAF0 ; =ov13_02245314 + ldrb r1, [r1, r2] + strb r1, [r0, #0x60] + ldmia sp!, {r3, pc} +_0222AA04: + mov r0, #9 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} +_0222AA10: + sub r1, r2, #0xa + cmp r1, #2 + bge _0222AA60 + cmp r1, #0 + ldreqb r1, [r0, #0x66] + cmpeq r1, #0 + beq _0222AA40 + sub r1, r2, #0xa + cmp r1, #1 + ldreqb r1, [r0, #0x68] + cmpeq r1, #0 + bne _0222AA4C +_0222AA40: + mov r0, #9 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} +_0222AA4C: + ldr r1, _0222AAF4 ; =ov13_02245224 + sub r2, r2, #0xa + ldrb r1, [r1, r2] + strb r1, [r0, #0x60] + ldmia sp!, {r3, pc} +_0222AA60: + ldr r1, _0222AAF8 ; =ov13_02245220 + sub r2, r2, #0xc + ldrb r1, [r1, r2] + strb r1, [r0, #0x60] +_0222AA70: + mov r0, #2 + bl ov13_022416D4 + cmp r0, #0 + beq _0222AAC8 + ldr r0, _0222AAEC ; =ov13_0224F4C0 + ldr r1, [r0] + ldrb r0, [r1, #0x66] + cmp r0, #0 + bne _0222AABC + ldrb r0, [r1, #0x69] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _0222AAEC ; =ov13_0224F4C0 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x69] + ldmia sp!, {r3, pc} +_0222AABC: + mov r0, #0x10 + strb r0, [r1, #0x60] + ldmia sp!, {r3, pc} +_0222AAC8: + mov r0, #2 + bl ov13_02241714 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _0222AAEC ; =ov13_0224F4C0 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x69] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222AAEC: .word ov13_0224F4C0 +_0222AAF0: .word ov13_02245314 +_0222AAF4: .word ov13_02245224 +_0222AAF8: .word ov13_02245220 + arm_func_end ov13_0222A960 + + arm_func_start ov13_0222AAFC +ov13_0222AAFC: ; 0x0222AAFC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r2, _0222AD40 ; =ov13_02245228 + mov sl, r0 + ldrb r3, [r2, #0x15] + ldrb r0, [r2, #0x16] + ldrb r4, [r2, #0x17] + strb r3, [sp, #0xe] + strb r0, [sp, #0xf] + ldrb r0, [r2, #0x18] + mov sb, r1 + add r3, sp, #0xe + strb r4, [sp, #0x10] + strb r0, [sp, #0x11] + ldrb r0, [r2, #0x19] + add lr, sl, sl, lsl #1 + mov r4, lr + strb r0, [sp, #0x12] + ldrb r6, [r2, #0x1a] + ldrb r1, [r2, #0x1b] + ldrb r0, [r3, sl] + mov r5, #0 + strb r6, [sp, #9] + strb r1, [sp, #0xa] + ldrb r6, [r2, #0x1c] + ldrb r1, [r2, #0x1d] + cmp r0, #0 + strb r6, [sp, #0xb] + strb r1, [sp, #0xc] + ldrb r0, [r2, #0x1e] + strb r0, [sp, #0xd] + ldrb r1, [r2, #0x10] + ldrb r0, [r2, #0x11] + strb r1, [sp, #4] + strb r0, [sp, #5] + ldrb r1, [r2, #0x12] + ldrb r0, [r2, #0x13] + strb r1, [sp, #6] + strb r0, [sp, #7] + ldrb r0, [r2, #0x14] + strb r0, [sp, #8] + ble _0222AC10 + ldr r0, _0222AD44 ; =ov13_0224527A + ldr fp, _0222AD48 ; =ov13_0224F4C0 + ldr r7, _0222AD4C ; =0xC1FFFCFF + ldr r8, _0222AD50 ; =0xFE00FF00 + and r6, sb, #0xff +_0222ABB8: + ldr r1, [fp] + mov r2, r4, lsl #2 + add r1, r1, r4, lsl #2 + ldr r1, [r1, #0x10] + ldrh r2, [r0, r2] + ldr ip, [r1] + add r5, r5, #1 + and ip, ip, r7 + str ip, [r1] + ldr ip, [fp] + mov r1, r2, lsl #0x17 + add r2, ip, r4, lsl #2 + ldr r2, [r2, #0x10] + add r4, r4, #1 + ldr ip, [r2] + and ip, ip, r8 + orr ip, ip, r6 + orr r1, ip, r1, lsr #7 + str r1, [r2] + ldrb r1, [r3, sl] + cmp r5, r1 + blt _0222ABB8 +_0222AC10: + cmp sl, #4 + bge _0222AC48 + ldr r0, _0222AD48 ; =ov13_0224F4C0 + ldr r1, _0222AD44 ; =ov13_0224527A + ldr r3, [r0] + mov r0, lr, lsl #2 + mov r2, #2 + str r2, [sp] + add r2, r3, sl, lsl #2 + ldrh r1, [r1, r0] + ldr r0, [r3, sl, lsl #2] + ldr r3, [r2, #0x48] + mov r2, sb + bl ov13_02240D94 +_0222AC48: + add r3, sp, #9 + ldrb r0, [r3, sl] + mov r5, #0 + cmp r0, #0 + ble _0222ACC4 + ldr r0, _0222AD54 ; =ov13_02245250 + ldr r8, _0222AD48 ; =ov13_0224F4C0 + ldr r6, _0222AD4C ; =0xC1FFFCFF + ldr r7, _0222AD50 ; =0xFE00FF00 + and r4, sb, #0xff +_0222AC70: + ldr r1, [r8] + mov r2, r5, lsl #2 + add r1, r1, r5, lsl #2 + ldr fp, [r1, #0x38] + ldrh r1, [r0, r2] + ldr r2, [fp] + and r2, r2, r6 + str r2, [fp] + ldr r2, [r8] + mov r1, r1, lsl #0x17 + add r2, r2, r5, lsl #2 + ldr r2, [r2, #0x38] + add r5, r5, #1 + ldr fp, [r2] + and fp, fp, r7 + orr fp, fp, r4 + orr r1, fp, r1, lsr #7 + str r1, [r2] + ldrb r1, [r3, sl] + cmp r5, r1 + blt _0222AC70 +_0222ACC4: + add r7, sp, #4 + ldrb r0, [r7, sl] + mov r8, #0 + cmp r0, #0 + addle sp, sp, #0x14 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, _0222AD58 ; =ov13_02245258 + ldr r4, _0222AD48 ; =ov13_0224F4C0 + mvn r6, #0 + mov fp, r8 +_0222ACEC: + ldr r0, [r4] + mov r1, r6 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #0x40] + mov r2, fp + mov r3, fp + bl ov13_0223FDF4 + ldr r0, [r4] + mov r1, r8, lsl #2 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #0x40] + ldrh r2, [r5, r1] + mov r1, r6 + mov r3, sb + bl ov13_0223FF18 + ldrb r0, [r7, sl] + add r8, r8, #1 + cmp r8, r0 + blt _0222ACEC + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0222AD40: .word ov13_02245228 +_0222AD44: .word ov13_0224527A +_0222AD48: .word ov13_0224F4C0 +_0222AD4C: .word 0xC1FFFCFF +_0222AD50: .word 0xFE00FF00 +_0222AD54: .word ov13_02245250 +_0222AD58: .word ov13_02245258 + arm_func_end ov13_0222AAFC + + arm_func_start ov13_0222AD5C +ov13_0222AD5C: ; 0x0222AD5C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmltia sp!, {r3, pc} + cmp r0, #0xa + bge _0222ADA8 + ldr r2, _0222AE18 ; =ov13_0224F4C0 + ldr r3, _0222AE1C ; =ov13_0224521C + ldr r2, [r2] + ldrb r1, [r3, r1] + add r0, r2, r0, lsl #2 + ldr r2, [r0, #0x10] + ldr r0, [r2] + bic r0, r0, #0xc00 + str r0, [r2] + ldrh r0, [r2, #4] + bic r0, r0, #0xf000 + orr r0, r0, r1, lsl #12 + strh r0, [r2, #4] + ldmia sp!, {r3, pc} +_0222ADA8: + sub ip, r0, #0xa + cmp ip, #2 + bge _0222ADEC + ldr r0, _0222AE18 ; =ov13_0224F4C0 + ldr r2, _0222AE1C ; =ov13_0224521C + ldr r3, [r0] + ldrb r0, [r2, r1] + add r1, r3, ip, lsl #2 + ldr r2, [r1, #0x38] + ldr r1, [r2] + bic r1, r1, #0xc00 + str r1, [r2] + ldrh r1, [r2, #4] + bic r1, r1, #0xf000 + orr r0, r1, r0, lsl #12 + strh r0, [r2, #4] + ldmia sp!, {r3, pc} +_0222ADEC: + ldr r2, _0222AE18 ; =ov13_0224F4C0 + ldr r3, _0222AE20 ; =ov13_02245210 + ldr r2, [r2] + sub r0, r0, #0xc + add r0, r2, r0, lsl #2 + ldrb r3, [r3, r1] + ldr r0, [r0, #0x40] + mvn r1, #0 + mov r2, #0 + bl ov13_0223FE98 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222AE18: .word ov13_0224F4C0 +_0222AE1C: .word ov13_0224521C +_0222AE20: .word ov13_02245210 + arm_func_end ov13_0222AD5C + + arm_func_start ov13_0222AE24 +ov13_0222AE24: ; 0x0222AE24 + stmdb sp!, {r4, lr} + ldr r0, _0222AEA4 ; =ov13_0224F4C0 + ldr r1, [r0] + ldrsb r0, [r1, #0x63] + cmp r0, #0xb + movle r4, #0x44 + ldr r0, [r1, #0x58] + movgt r4, #0x45 + mov r1, #0 + bl ov13_0223FDE0 + mov r2, r0 + mov r1, r4 + mov r0, #0 + bl ov13_022400F0 + ldr r0, _0222AEA4 ; =ov13_0224F4C0 + mvn r1, #0 + ldr r0, [r0] + mov r2, #2 + ldr r0, [r0, #0x58] + bl ov13_02240008 + ldr r0, _0222AEA4 ; =ov13_0224F4C0 + ldr r2, _0222AEA8 ; =ov13_022452A2 + ldr r0, [r0] + ldr r3, _0222AEAC ; =ov13_022452A4 + ldrsb ip, [r0, #0x63] + ldr r0, [r0, #0x58] + mvn r1, #0 + mov ip, ip, lsl #2 + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + bl ov13_0223FF18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222AEA4: .word ov13_0224F4C0 +_0222AEA8: .word ov13_022452A2 +_0222AEAC: .word ov13_022452A4 + arm_func_end ov13_0222AE24 + + arm_func_start ov13_0222AEB0 +ov13_0222AEB0: ; 0x0222AEB0 + stmdb sp!, {r3, lr} + ldr r1, _0222AF54 ; =ov13_0224F4C0 + ldr r2, _0222AF58 ; =ov13_022452DA + ldr r3, [r1] + ldrsb ip, [r3, #0x63] + add r2, r2, ip, lsl #2 + ldrsb r2, [r0, r2] + strb r2, [r3, #0x63] + ldr r2, [r1] + ldrsb r1, [r2, #0x63] + cmp r1, #0xd + bne _0222AEF0 + cmp r0, #1 + cmpne r0, #3 + streqb ip, [r2, #0x64] + beq _0222AF44 +_0222AEF0: + mvn r0, #0 + cmp r1, r0 + bne _0222AF1C + ldrsb r0, [r2, #0x64] + cmp r0, #1 + cmpne r0, #0xa + moveq r0, #0xa + streqb r0, [r2, #0x63] + movne r0, #0xb + strneb r0, [r2, #0x63] + b _0222AF44 +_0222AF1C: + sub r0, r0, #1 + cmp r1, r0 + bne _0222AF44 + ldrsb r0, [r2, #0x64] + cmp r0, #1 + cmpne r0, #0xa + moveq r0, #1 + streqb r0, [r2, #0x63] + movne r0, #2 + strneb r0, [r2, #0x63] +_0222AF44: + bl ov13_0222AE24 + mov r0, #8 + bl ov13_0223ABB8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222AF54: .word ov13_0224F4C0 +_0222AF58: .word ov13_022452DA + arm_func_end ov13_0222AEB0 + + arm_func_start ov13_0222AF5C +ov13_0222AF5C: ; 0x0222AF5C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222AFC8 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + mov r1, #0 + ldr r0, [r0, #0x40] + bl ov13_0223FDE0 + ldr r2, [r0] + ldr r0, _0222AFCC ; =0x01FF0000 + and r1, r2, #0xff + and r0, r2, r0 + mov r2, r0, lsr #0x10 + add r1, r1, #0xc + str r1, [sp] + mov r0, #4 + str r2, [sp, #4] + bl ov13_0222AAFC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _0222AFD0 ; =ov13_0222AFD4 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222AFC8: .word ov13_0224F4C0 +_0222AFCC: .word 0x01FF0000 +_0222AFD0: .word ov13_0222AFD4 + arm_func_end ov13_0222AF5C + + arm_func_start ov13_0222AFD4 +ov13_0222AFD4: ; 0x0222AFD4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222B038 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + ldr r1, _0222B03C ; =0x01FF0000 + ldr r2, [r0, #0x34] + mov r0, #3 + ldr r3, [r2] + and r2, r3, #0xff + and r3, r3, r1 + add r1, r2, #0xc + mov r2, r3, lsr #0x10 + str r1, [sp] + str r2, [sp, #4] + bl ov13_0222AAFC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _0222B040 ; =ov13_0222B044 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B038: .word ov13_0224F4C0 +_0222B03C: .word 0x01FF0000 +_0222B040: .word ov13_0222B044 + arm_func_end ov13_0222AFD4 + + arm_func_start ov13_0222B044 +ov13_0222B044: ; 0x0222B044 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222B0A8 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + ldr r1, _0222B0AC ; =0x01FF0000 + ldr r2, [r0, #0x28] + mov r0, #2 + ldr r3, [r2] + and r2, r3, #0xff + and r3, r3, r1 + add r1, r2, #0xc + mov r2, r3, lsr #0x10 + str r1, [sp] + str r2, [sp, #4] + bl ov13_0222AAFC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _0222B0B0 ; =ov13_0222B0B4 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B0A8: .word ov13_0224F4C0 +_0222B0AC: .word 0x01FF0000 +_0222B0B0: .word ov13_0222B0B4 + arm_func_end ov13_0222B044 + + arm_func_start ov13_0222B0B4 +ov13_0222B0B4: ; 0x0222B0B4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222B118 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + ldr r1, _0222B11C ; =0x01FF0000 + ldr r2, [r0, #0x1c] + mov r0, #1 + ldr r3, [r2] + and r2, r3, #0xff + and r3, r3, r1 + add r1, r2, #0xc + mov r2, r3, lsr #0x10 + str r1, [sp] + str r2, [sp, #4] + bl ov13_0222AAFC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _0222B120 ; =ov13_0222B124 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B118: .word ov13_0224F4C0 +_0222B11C: .word 0x01FF0000 +_0222B120: .word ov13_0222B124 + arm_func_end ov13_0222B0B4 + + arm_func_start ov13_0222B124 +ov13_0222B124: ; 0x0222B124 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0222B188 ; =ov13_0224F4C0 + mov r4, r0 + ldr r0, [r1] + ldr r1, _0222B18C ; =0x01FF0000 + ldr r2, [r0, #0x10] + mov r0, #0 + ldr r3, [r2] + and r2, r3, #0xff + and r3, r3, r1 + add r1, r2, #0xc + mov r2, r3, lsr #0x10 + str r1, [sp] + str r2, [sp, #4] + bl ov13_0222AAFC + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r1, _0222B190 ; =ov13_0222B194 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B188: .word ov13_0224F4C0 +_0222B18C: .word 0x01FF0000 +_0222B190: .word ov13_0222B194 + arm_func_end ov13_0222B124 + + arm_func_start ov13_0222B194 +ov13_0222B194: ; 0x0222B194 + stmdb sp!, {r3, r4, r5, lr} + mov r1, r0 + mov r0, #0 + bl ov13_022425D0 + ldr r4, _0222B24C ; =ov13_0224F4C0 + mov r5, #0 +_0222B1AC: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x48] + bl ov13_0223FD60 + ldr r0, [r4] + ldr r0, [r0, r5, lsl #2] + bl ov13_02240874 + add r5, r5, #1 + cmp r5, #4 + blt _0222B1AC + ldr r4, _0222B24C ; =ov13_0224F4C0 + mov r5, #0 +_0222B1DC: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x40] + bl ov13_0223FD60 + add r5, r5, #1 + cmp r5, #2 + blt _0222B1DC + ldr r4, _0222B24C ; =ov13_0224F4C0 + mov r5, #0 +_0222B200: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x38] + bl ov13_02241D98 + add r5, r5, #1 + cmp r5, #2 + blt _0222B200 + ldr r4, _0222B24C ; =ov13_0224F4C0 + mov r5, #0 +_0222B224: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_02241D98 + add r5, r5, #1 + cmp r5, #0xa + blt _0222B224 + ldr r0, _0222B250 ; =ov13_0224F4C0 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222B24C: .word ov13_0224F4C0 +_0222B250: .word ov13_0224F4C0 + arm_func_end ov13_0222B194 + + arm_func_start ov13_0222B254 +ov13_0222B254: ; 0x0222B254 + stmdb sp!, {lr} + sub sp, sp, #0x104 + mov r0, #0x26c + mov r1, #4 + bl ov13_0224128C + ldr r3, _0222B354 ; =ov13_0224F4C4 + add r1, sp, #0 + str r0, [r3, #4] + mov r0, #0 + mov r2, #0x104 + strb r0, [r3] + bl MIi_CpuClear16 + mov r3, #0x50 + mov r2, #0xc + ldr r0, _0222B358 ; =ov13_02245320 + add r1, sp, #4 + strb r3, [sp] + strh r2, [sp, #2] + bl MI_CpuCopy8 + ldr r0, _0222B354 ; =ov13_0224F4C4 + mov r2, #3 + ldr r1, [r0, #4] + add ip, sp, #0 + strh r2, [r1] + ldr lr, [r0, #4] + mov r2, #0x41 + add r3, lr, #2 +_0222B2C0: + ldrh r1, [ip] + ldrh r0, [ip, #2] + add ip, ip, #4 + subs r2, r2, #1 + strh r1, [r3] + strh r0, [r3, #2] + add r3, r3, #4 + bne _0222B2C0 + ldr r1, _0222B354 ; =ov13_0224F4C4 + mov r3, #1 + add r0, lr, #0x100 + strh r3, [r0, #6] + ldr r0, [r1, #4] + sub r2, r3, #2 + add r0, r0, #0x100 + strh r2, [r0, #8] + ldr r0, [r1, #4] + add r0, r0, #0x100 + strh r3, [r0, #0xa] + ldr r0, [r1, #4] + add r0, r0, #0x100 + strh r2, [r0, #0xc] + ldr r0, [r1, #4] + add r0, r0, #0x100 + strh r2, [r0, #0xe] + ldr r0, [r1, #4] + add r0, r0, #0x110 + bl OS_GetMacAddress + ldr r0, _0222B35C ; =ov13_0222B414 + ldr r1, _0222B360 ; =ov13_0222B424 + bl ov13_02222C1C + cmp r0, #0 + addeq sp, sp, #0x104 + ldmeqia sp!, {pc} + bl OS_Terminate + add sp, sp, #0x104 + ldmia sp!, {pc} + .balign 4, 0 +_0222B354: .word ov13_0224F4C4 +_0222B358: .word ov13_02245320 +_0222B35C: .word ov13_0222B414 +_0222B360: .word ov13_0222B424 + arm_func_end ov13_0222B254 + + arm_func_start ov13_0222B364 +ov13_0222B364: ; 0x0222B364 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_02222CE0 + cmp r4, #0 + beq _0222B3A0 + ldr r0, _0222B3AC ; =ov13_0224F4C4 + ldr r2, [r0, #4] + ldrb r1, [r2, #0x116] + cmp r1, #0 + ldreqb r0, [r0] + cmpeq r0, #1 + bne _0222B3A0 + add r0, r2, #0x17 + add r0, r0, #0x100 + bl ov13_0223A6E4 +_0222B3A0: + ldr r0, _0222B3B0 ; =ov13_0224F4C8 + bl ov13_022412B0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B3AC: .word ov13_0224F4C4 +_0222B3B0: .word ov13_0224F4C8 + arm_func_end ov13_0222B364 + + arm_func_start ov13_0222B3B4 +ov13_0222B3B4: ; 0x0222B3B4 + stmdb sp!, {r3, lr} + ldr r0, _0222B410 ; =ov13_0224F4C4 + ldr r0, [r0, #4] + bl ov13_02220908 + cmp r0, #0 + bne _0222B3DC + ldr r1, _0222B410 ; =ov13_0224F4C4 + mov r0, #1 + strb r0, [r1] + ldmia sp!, {r3, pc} +_0222B3DC: + ldr r0, _0222B410 ; =ov13_0224F4C4 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x116] + cmp r0, #1 + beq _0222B400 + add r0, r0, #0xfd + and r0, r0, #0xff + cmp r0, #2 + bhi _0222B408 +_0222B400: + mov r0, #0 + ldmia sp!, {r3, pc} +_0222B408: + mov r0, #2 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222B410: .word ov13_0224F4C4 + arm_func_end ov13_0222B3B4 + + arm_func_start ov13_0222B414 +ov13_0222B414: ; 0x0222B414 + ldr ip, _0222B420 ; =ov13_0224128C + mov r1, #0x20 + bx ip + .balign 4, 0 +_0222B420: .word ov13_0224128C + arm_func_end ov13_0222B414 + + arm_func_start ov13_0222B424 +ov13_0222B424: ; 0x0222B424 + ldr ip, _0222B42C ; =ov13_022412F4 + bx ip + .balign 4, 0 +_0222B42C: .word ov13_022412F4 + arm_func_end ov13_0222B424 + + arm_func_start ov13_0222B430 +ov13_0222B430: ; 0x0222B430 + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _0222B4B4 ; =ov13_0224F4CC + str r0, [r3, #4] + mov r0, r1 + mov r1, r2 + bl ov13_0222B4BC + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _0222B4B4 ; =ov13_0224F4CC + mov r1, #0 + strb r1, [r0, #1] + bl ov13_0222B558 + bl ov13_0222B620 + bl ov13_0223AAFC + ldr r0, _0222B4B8 ; =ov13_0222C1BC + bl ov13_0222B8E8 + ldr r4, _0222B4B4 ; =ov13_0224F4CC + mov r5, #0 +_0222B47C: + bl ov13_022413E4 + ldr r0, [r4, #0xc] + blx r0 + mov r0, r5 + bl ov13_02242478 + bl ov13_02241A44 + bl ov13_022422E0 + bl OS_WaitVBlankIntr + ldrb r0, [r4, #1] + cmp r0, #0 + beq _0222B47C + bl ov13_0222B898 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222B4B4: .word ov13_0224F4CC +_0222B4B8: .word ov13_0222C1BC + arm_func_end ov13_0222B430 + + arm_func_start ov13_0222B4BC +ov13_0222B4BC: ; 0x0222B4BC + ldr r2, _0222B554 ; =ov13_0224F4CC + cmp r0, #0 + strb r0, [r2] + str r1, [r2, #8] + blt _0222B4D8 + cmp r0, #6 + ble _0222B4E0 +_0222B4D8: + mov r0, #0 + bx lr +_0222B4E0: + cmp r0, #1 + bne _0222B4F8 + mov r1, r1, lsr #4 + bics r1, r1, #2 + movne r0, #0 + bxne lr +_0222B4F8: + ldr r1, _0222B554 ; =ov13_0224F4CC + ldr r1, [r1, #8] + mov r2, r1, lsl #0x1c + mov r2, r2, lsr #0x1c + cmp r2, #1 + movhi r0, #0 + bxhi lr + cmp r0, #0 + beq _0222B52C + mov r1, r1, lsr #4 + tst r1, #1 + movne r0, #0 + bxne lr +_0222B52C: + cmp r0, #0 + bne _0222B54C + ldr r0, _0222B554 ; =ov13_0224F4CC + ldr r0, [r0, #8] + mov r0, r0, lsr #4 + tst r0, #1 + moveq r0, #0 + bxeq lr +_0222B54C: + mov r0, #1 + bx lr + .balign 4, 0 +_0222B554: .word ov13_0224F4CC + arm_func_end ov13_0222B4BC + + arm_func_start ov13_0222B558 +ov13_0222B558: ; 0x0222B558 + stmdb sp!, {r3, lr} + ldr r2, _0222B614 ; =0x04000208 + mov r0, #0 + ldrh r1, [r2] + strh r0, [r2] + bl GX_DispOff + ldr r1, _0222B618 ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x10000 + str r0, [r1] + bl OS_IsTickAvailable + cmp r0, #0 + bne _0222B590 + bl OS_Terminate +_0222B590: + bl OS_IsAlarmAvailable + cmp r0, #0 + bne _0222B5A0 + bl OS_Terminate +_0222B5A0: + mov r0, #0 + bl GX_VBlankIntr + bl FX_Init + mvn r0, #0 + bl FS_Init + bl TP_Init + bl RTC_Init + bl GX_DispOff + ldr r1, _0222B618 ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x10000 + str r0, [r1] + bl ov13_022420A0 + ldr r0, _0222B61C ; =ov13_0224F4CC + ldr r0, [r0, #4] + bl ov13_022411DC + bl ov13_02241AC0 + bl ov13_0224231C + bl ov13_0223F664 + bl ov13_02241330 + bl ov13_02240338 + mov r0, #0x700 + mov r1, #0x20 + bl ov13_0224128C + str r0, [sp] + bl DWC_BM_Init + add r0, sp, #0 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222B614: .word 0x04000208 +_0222B618: .word 0x04001000 +_0222B61C: .word ov13_0224F4CC + arm_func_end ov13_0222B558 + + arm_func_start ov13_0222B620 +ov13_0222B620: ; 0x0222B620 + stmdb sp!, {r4, lr} + mov r0, #0 + bl GX_VBlankIntr + mov r0, #1 + bl GX_SetBankForBG + mov r0, #2 + bl GX_SetBankForOBJ + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl GX_SetGraphicsMode + mov r3, #0x4000000 + ldr r1, [r3] + add r0, r3, #0x6c + bic r1, r1, #0x1f00 + str r1, [r3] + ldr r2, [r3] + mov r1, #0 + bic r2, r2, #0xe000 + str r2, [r3] + bl GXx_SetMasterBrightness_ + mov r3, #0x4000000 + ldr r2, [r3] + ldr r0, _0222B884 ; =0xFFCFFFEF + ldr r1, _0222B888 ; =0x00200010 + and r0, r2, r0 + orr r0, r0, #0x10 + add ip, r1, #0x3e00000 + orr r0, r0, #0x200000 + str r0, [r3] + ldrh r1, [r3, #8] + mov lr, #0 + add r0, r3, #0x50 + bic r1, r1, #0x40 + strh r1, [r3, #8] + ldrh r4, [r3, #0xa] + mov r1, #0x3f + mov r2, #0x10 + bic r4, r4, #0x40 + strh r4, [r3, #0xa] + ldrh r4, [r3, #0xc] + bic r4, r4, #0x40 + strh r4, [r3, #0xc] + ldrh r4, [r3, #0xe] + bic r4, r4, #0x40 + strh r4, [r3, #0xe] + str lr, [ip] + str lr, [r3, #0x14] + str lr, [r3, #0x18] + str lr, [r3, #0x1c] + bl G2x_SetBlendBrightness_ + mov r0, #0x80 + bl GX_SetBankForSubBG + mov r0, #0x100 + bl GX_SetBankForSubOBJ + mov r0, #0 + bl GXS_SetGraphicsMode + ldr r1, _0222B88C ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x1f00 + str r0, [r1] + ldr r0, [r1] + bic r0, r0, #0xe000 + str r0, [r1] + add r0, r1, #0x6c + mov r1, #0 + bl GXx_SetMasterBrightness_ + ldr r3, _0222B88C ; =0x04001000 + ldr r0, _0222B884 ; =0xFFCFFFEF + ldr r1, [r3] + mov ip, #0 + and r0, r1, r0 + orr r0, r0, #0x10 + str r0, [r3] + ldrh r2, [r3, #8] + add r0, r3, #0x50 + mov r1, #0x3f + bic r2, r2, #0x40 + strh r2, [r3, #8] + ldrh lr, [r3, #0xa] + mov r2, #0x10 + bic lr, lr, #0x40 + strh lr, [r3, #0xa] + ldrh lr, [r3, #0xc] + bic lr, lr, #0x40 + strh lr, [r3, #0xc] + ldrh lr, [r3, #0xe] + bic lr, lr, #0x40 + strh lr, [r3, #0xe] + str ip, [r3, #0x10] + str ip, [r3, #0x14] + str ip, [r3, #0x18] + str ip, [r3, #0x1c] + bl G2x_SetBlendBrightness_ + ldr r2, _0222B890 ; =0x04000008 + ldr r3, _0222B894 ; =0x0400100A + ldrh r0, [r2] + add r1, r2, #0x1000 + and r0, r0, #0x43 + orr r0, r0, #0xc00 + strh r0, [r2] + ldrh r0, [r2, #2] + and r0, r0, #0x43 + orr r0, r0, #0x108 + orr r0, r0, #0xc00 + strh r0, [r2, #2] + ldrh r0, [r2, #4] + and r0, r0, #0x43 + orr r0, r0, #0xe10 + strh r0, [r2, #4] + ldrh r0, [r2, #6] + and r0, r0, #0x43 + orr r0, r0, #0xf10 + strh r0, [r2, #6] + ldrh r0, [r1] + and r0, r0, #0x43 + orr r0, r0, #0xc00 + strh r0, [r1] + ldrh r0, [r3] + and r0, r0, #0x43 + orr r0, r0, #0xd00 + strh r0, [r3] + ldrh r0, [r3, #2] + and r0, r0, #0x43 + orr r0, r0, #0xe00 + strh r0, [r3, #2] + ldrh r0, [r3, #4] + mov r2, #0x4000000 + add r1, r2, #0x304 + and r0, r0, #0x43 + orr r0, r0, #0xf00 + strh r0, [r3, #4] + ldr r0, [r2] + bic r0, r0, #0x38000000 + str r0, [r2] + ldr r0, [r2] + bic r0, r0, #0x7000000 + str r0, [r2] + ldrh r0, [r1] + bic r0, r0, #0x8000 + strh r0, [r1] + bl ov13_02240648 + bl ov13_02241C68 + bl ov13_02241DFC + bl ov13_0223FADC + bl GX_DispOn + ldr r2, _0222B88C ; =0x04001000 + mov r0, #1 + ldr r1, [r2] + orr r1, r1, #0x10000 + str r1, [r2] + bl GX_VBlankIntr + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222B884: .word 0xFFCFFFEF +_0222B888: .word 0x00200010 +_0222B88C: .word 0x04001000 +_0222B890: .word 0x04000008 +_0222B894: .word 0x0400100A + arm_func_end ov13_0222B620 + + arm_func_start ov13_0222B898 +ov13_0222B898: ; 0x0222B898 + stmdb sp!, {r3, lr} + bl GX_DispOff + ldr r1, _0222B8E4 ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x10000 + str r0, [r1] + bl ov13_0224230C + bl ov13_022413AC + bl ov13_02241B34 + bl ov13_0223AB8C + bl ov13_0223FBB0 + bl ov13_02241D4C + bl ov13_0224074C + bl ov13_02240380 + bl ov13_0223F814 + bl ov13_02242430 + bl ov13_0224121C + bl ov13_02242154 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222B8E4: .word 0x04001000 + arm_func_end ov13_0222B898 + + arm_func_start ov13_0222B8E8 +ov13_0222B8E8: ; 0x0222B8E8 + ldr r1, _0222B8F4 ; =ov13_0224F4CC + str r0, [r1, #0xc] + bx lr + .balign 4, 0 +_0222B8F4: .word ov13_0224F4CC + arm_func_end ov13_0222B8E8 + + arm_func_start ov13_0222B8F8 +ov13_0222B8F8: ; 0x0222B8F8 + ldr r2, _0222B908 ; =ov13_0224F4CC + str r0, [r2, #0x10] + str r1, [r2, #0x14] + bx lr + .balign 4, 0 +_0222B908: .word ov13_0224F4CC + arm_func_end ov13_0222B8F8 + + arm_func_start ov13_0222B90C +ov13_0222B90C: ; 0x0222B90C + cmp r0, #0 + ldrne r2, _0222B930 ; =ov13_0224F4CC + ldrne r2, [r2, #0x10] + strne r2, [r0] + cmp r1, #0 + ldrne r0, _0222B930 ; =ov13_0224F4CC + ldrne r0, [r0, #0x14] + strne r0, [r1] + bx lr + .balign 4, 0 +_0222B930: .word ov13_0224F4CC + arm_func_end ov13_0222B90C + + arm_func_start ov13_0222B934 +ov13_0222B934: ; 0x0222B934 + ldr r2, _0222B944 ; =ov13_0224F4CC + str r0, [r2, #0x18] + str r1, [r2, #0x1c] + bx lr + .balign 4, 0 +_0222B944: .word ov13_0224F4CC + arm_func_end ov13_0222B934 + + arm_func_start ov13_0222B948 +ov13_0222B948: ; 0x0222B948 + cmp r0, #0 + ldrne r2, _0222B96C ; =ov13_0224F4CC + ldrne r2, [r2, #0x18] + strne r2, [r0] + cmp r1, #0 + ldrne r0, _0222B96C ; =ov13_0224F4CC + ldrne r0, [r0, #0x1c] + strne r0, [r1] + bx lr + .balign 4, 0 +_0222B96C: .word ov13_0224F4CC + arm_func_end ov13_0222B948 + + arm_func_start ov13_0222B970 +ov13_0222B970: ; 0x0222B970 + ldr r0, _0222B97C ; =ov13_0224F4CC + ldrb r0, [r0] + bx lr + .balign 4, 0 +_0222B97C: .word ov13_0224F4CC + arm_func_end ov13_0222B970 + + arm_func_start ov13_0222B980 +ov13_0222B980: ; 0x0222B980 + ldr r0, _0222B994 ; =ov13_0224F4CC + ldr r0, [r0, #8] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + bx lr + .balign 4, 0 +_0222B994: .word ov13_0224F4CC + arm_func_end ov13_0222B980 + + arm_func_start ov13_0222B998 +ov13_0222B998: ; 0x0222B998 + ldr r1, _0222B9B0 ; =ov13_0224F4CC + ldr r1, [r1, #8] + tst r0, r1, lsr #4 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0222B9B0: .word ov13_0224F4CC + arm_func_end ov13_0222B998 + + arm_func_start ov13_0222B9B4 +ov13_0222B9B4: ; 0x0222B9B4 + ldr r0, _0222B9C4 ; =ov13_0224F4CC + mov r1, #1 + strb r1, [r0, #1] + bx lr + .balign 4, 0 +_0222B9C4: .word ov13_0224F4CC + arm_func_end ov13_0222B9B4 + + arm_func_start ov13_0222B9C8 +ov13_0222B9C8: ; 0x0222B9C8 + ldr r0, _0222BA04 ; =ov13_0224F4CC + ldrb r1, [r0] + cmp r1, #6 + moveq r0, #0x38 + bxeq lr + cmp r1, #1 + bne _0222B9F8 + ldr r0, [r0, #8] + mov r0, r0, lsr #4 + tst r0, #2 + moveq r0, #0x37 + bxeq lr +_0222B9F8: + add r0, r1, #0x31 + and r0, r0, #0xff + bx lr + .balign 4, 0 +_0222BA04: .word ov13_0224F4CC + arm_func_end ov13_0222B9C8 + + arm_func_start ov13_0222BA08 +ov13_0222BA08: ; 0x0222BA08 + stmdb sp!, {r3, lr} + mov r0, #0x64 + mov r1, #4 + bl ov13_0224128C + mov r1, r0 + ldr r3, _0222BA40 ; =ov13_0224F4EC + mov r0, #8 + mov r2, #0xc + str r1, [r3] + bl ov13_0224022C + ldr r1, _0222BA40 ; =ov13_0224F4EC + ldr r1, [r1] + str r0, [r1, #0x60] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222BA40: .word ov13_0224F4EC + arm_func_end ov13_0222BA08 + + arm_func_start ov13_0222BA44 +ov13_0222BA44: ; 0x0222BA44 + ldr ip, _0222BA50 ; =ov13_022412B0 + ldr r0, _0222BA54 ; =ov13_0224F4EC + bx ip + .balign 4, 0 +_0222BA50: .word ov13_022412B0 +_0222BA54: .word ov13_0224F4EC + arm_func_end ov13_0222BA44 + + arm_func_start ov13_0222BA58 +ov13_0222BA58: ; 0x0222BA58 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0222BAAC ; =ov13_0224F4EC + mov r5, r0 + ldr r0, [r1] + ldr r0, [r0, #0x60] + bl ov13_022402E0 + mov r4, r0 + add r1, sp, #0 + mov r0, r5 + mov r2, #4 + bl ov13_0223F95C + add r2, r0, #0x20 + str r0, [r4, #8] + add r0, r2, #0x10 + str r0, [r4] + ldr r1, [r2, #4] + mov r0, r4 + add r1, r2, r1 + add r1, r1, #8 + str r1, [r4, #4] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222BAAC: .word ov13_0224F4EC + arm_func_end ov13_0222BA58 + + arm_func_start ov13_0222BAB0 +ov13_0222BAB0: ; 0x0222BAB0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + bl ov13_0223FA50 + ldr r0, _0222BAD8 ; =ov13_0224F4EC + mov r1, r4 + ldr r0, [r0] + ldr r0, [r0, #0x60] + bl ov13_02240288 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222BAD8: .word ov13_0224F4EC + arm_func_end ov13_0222BAB0 + + arm_func_start ov13_0222BADC +ov13_0222BADC: ; 0x0222BADC + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + ldmia r0, {r2, r3} + ldr r0, [r2, r1, lsl #2] + add r0, r3, r0 + bx lr + arm_func_end ov13_0222BADC + + arm_func_start ov13_0222BAF4 +ov13_0222BAF4: ; 0x0222BAF4 + stmdb sp!, {r3, lr} + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + ldmia r0, {ip, lr} + ldr r0, [ip, r1, lsl #2] + cmp r2, #0 + add r0, lr, r0 + addge r3, r3, #0x30 + movge r1, r2, lsl #1 + strgeh r3, [r0, r1] + ldmia sp!, {r3, pc} + arm_func_end ov13_0222BAF4 + + arm_func_start ov13_0222BB20 +ov13_0222BB20: ; 0x0222BB20 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov r4, r0 + ldr r0, _0222BBF8 ; =0x0001E2A4 + mov r1, #0x20 + bl ov13_0224128C + ldr r2, _0222BBFC ; =ov13_0224F4F0 + add r1, r0, #0x1e000 + str r0, [r2] + str r4, [r1, #0x298] + ldr r0, [r2] + mov r4, #0 + add r0, r0, #0x1e000 + strb r4, [r0, #0x2a0] + ldr r0, [r2] + ldr lr, _0222BC00 ; =ov13_02245F8C + add r0, r0, #0x1e000 + strb r4, [r0, #0x2a1] + add ip, sp, #0 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2} + stmia ip, {r0, r1, r2} + ldr r0, _0222BC04 ; =ov13_0224F4F8 + mov r1, r4 + ldr r0, [r0] + bl ov13_0222BADC + ldr r1, _0222BC04 ; =ov13_0224F4F8 + str r0, [sp, #4] + ldr r0, [r1] + mov r1, #1 + bl ov13_0222BADC + str r0, [sp, #8] + bl ov13_0222B9C8 + strb r0, [sp, #0x18] + ldr r0, _0222BBFC ; =ov13_0224F4F0 + add r1, sp, #0 + ldr r0, [r0] + bl ov13_0223E80C + bl ov13_0223EA58 + cmp r0, #0 + bne _0222BBCC + bl OS_Terminate +_0222BBCC: + mov r0, #0 + ldr r1, _0222BC08 ; =ov13_0222BCC0 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0222BBFC ; =ov13_0224F4F0 + ldr r1, [r1] + add r1, r1, #0x1e000 + str r0, [r1, #0x29c] + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0222BBF8: .word 0x0001E2A4 +_0222BBFC: .word ov13_0224F4F0 +_0222BC00: .word ov13_02245F8C +_0222BC04: .word ov13_0224F4F8 +_0222BC08: .word ov13_0222BCC0 + arm_func_end ov13_0222BB20 + + arm_func_start ov13_0222BC0C +ov13_0222BC0C: ; 0x0222BC0C + ldr ip, _0222BC24 ; =ov13_02242528 + mov r0, #0 + ldr r1, _0222BC28 ; =ov13_0222BC2C + mov r2, r0 + mov r3, #0x78 + bx ip + .balign 4, 0 +_0222BC24: .word ov13_02242528 +_0222BC28: .word ov13_0222BC2C + arm_func_end ov13_0222BC0C + + arm_func_start ov13_0222BC2C +ov13_0222BC2C: ; 0x0222BC2C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_0223E8FC + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _0222BC64 ; =ov13_0224F4F0 + mov r1, r4 + ldr r0, [r0] + mov r3, #1 + add r2, r0, #0x1e000 + mov r0, #0 + strb r3, [r2, #0x2a1] + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222BC64: .word ov13_0224F4F0 + arm_func_end ov13_0222BC2C + + arm_func_start ov13_0222BC68 +ov13_0222BC68: ; 0x0222BC68 + ldr r0, _0222BC80 ; =ov13_0224F4F0 + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_0222BC80: .word ov13_0224F4F0 + arm_func_end ov13_0222BC68 + + arm_func_start ov13_0222BC84 +ov13_0222BC84: ; 0x0222BC84 + ldr r1, _0222BC98 ; =ov13_0224F4F0 + ldr r1, [r1] + add r1, r1, #0x1e000 + str r0, [r1, #0x298] + bx lr + .balign 4, 0 +_0222BC98: .word ov13_0224F4F0 + arm_func_end ov13_0222BC84 + + arm_func_start ov13_0222BC9C +ov13_0222BC9C: ; 0x0222BC9C + ldr ip, _0222BCA4 ; =ov13_0223EAA0 + bx ip + .balign 4, 0 +_0222BCA4: .word ov13_0223EAA0 + arm_func_end ov13_0222BC9C + + arm_func_start ov13_0222BCA8 +ov13_0222BCA8: ; 0x0222BCA8 + ldr r0, _0222BCBC ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x2280 + add r0, r0, #0x1c000 + bx lr + .balign 4, 0 +_0222BCBC: .word ov13_0224F4F0 + arm_func_end ov13_0222BCA8 + + arm_func_start ov13_0222BCC0 +ov13_0222BCC0: ; 0x0222BCC0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + bl ov13_0223EAD4 + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldrb r1, [r0, #0x2a0] + cmp r1, #0 + beq _0222BD14 + ldrb r1, [r0, #0x2a1] + cmp r1, #0 + bne _0222BD14 + ldr r1, [r0, #0x298] + cmp r1, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #0 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BD14: + add r0, sp, #1 + add r1, sp, #0 + bl ov13_0223EE58 + ldrb r0, [sp, #1] + cmp r0, #0x1a + bgt _0222BDA8 + bge _0222BEB4 + cmp r0, #0x14 + bgt _0222BD98 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _0222BF50 +_0222BD44: ; jump table + b _0222BF50 ; case 0 + b _0222BF50 ; case 1 + b _0222BF50 ; case 2 + b _0222BF50 ; case 3 + b _0222BF50 ; case 4 + b _0222BDCC ; case 5 + b _0222BF50 ; case 6 + b _0222BF50 ; case 7 + b _0222BF50 ; case 8 + b _0222BF50 ; case 9 + b _0222BF50 ; case 10 + b _0222BF50 ; case 11 + b _0222BEF8 ; case 12 + b _0222BE2C ; case 13 + b _0222BF50 ; case 14 + b _0222BF50 ; case 15 + b _0222BF50 ; case 16 + b _0222BF50 ; case 17 + b _0222BF50 ; case 18 + b _0222BF50 ; case 19 + b _0222BE70 ; case 20 +_0222BD98: + cmp r0, #0x17 + beq _0222BE70 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BDA8: + cmp r0, #0x1d + bgt _0222BDBC + beq _0222BEB4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BDBC: + cmp r0, #0x22 + beq _0222BF3C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BDCC: + ldrb r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r4, r0, #0x2280 + bl ov13_0223EE9C + add r1, r4, #0x1c000 + mov r2, #0x16 + bl MIi_CpuCopy16 + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldr r1, [r0, #0x298] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0x2a0] + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #0 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BE2C: + ldrb r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldr r1, [r0, #0x298] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0x2a0] + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #1 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BE70: + ldrb r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldr r1, [r0, #0x298] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0x2a0] + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #3 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BEB4: + ldrb r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldr r1, [r0, #0x298] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0x2a0] + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #4 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BEF8: + ldrb r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r0, _0222BF58 ; =ov13_0224F4F0 + ldr r0, [r0] + add r0, r0, #0x1e000 + ldr r1, [r0, #0x298] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0x2a0] + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r0, #2 + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0222BF3C: + mov r1, r4 + mov r0, #0 + bl ov13_022425D0 + ldr r0, _0222BF5C ; =ov13_0224F4F0 + bl ov13_022412B0 +_0222BF50: + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0222BF58: .word ov13_0224F4F0 +_0222BF5C: .word ov13_0224F4F0 + arm_func_end ov13_0222BCC0 + + arm_func_start ov13_0222BF60 +ov13_0222BF60: ; 0x0222BF60 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov r0, #0xc + sub r1, r0, #0x10 + bl ov13_0224128C + ldr r1, _0222BFBC ; =ov13_0224F4F4 + ldr ip, _0222BFC0 ; =ov13_0222C100 + str r0, [r1] + ldr r2, _0222BFC4 ; =ov13_0222C0D8 + ldr r3, _0222BFC8 ; =ov13_0222C0F0 + str ip, [sp] + mov ip, #0x800 + mov r0, #0xf + mov r1, #0x40 + str ip, [sp, #4] + bl ov13_02226D74 + cmp r0, #1 + beq _0222BFAC + bl OS_Terminate +_0222BFAC: + mov r0, #0xa + bl OS_Sleep + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222BFBC: .word ov13_0224F4F4 +_0222BFC0: .word ov13_0222C100 +_0222BFC4: .word ov13_0222C0D8 +_0222BFC8: .word ov13_0222C0F0 + arm_func_end ov13_0222BF60 + + arm_func_start ov13_0222BFCC +ov13_0222BFCC: ; 0x0222BFCC + stmdb sp!, {r3, lr} + bl ov13_02226E5C + cmp r0, #1 + beq _0222BFE0 + bl OS_Terminate +_0222BFE0: + ldr r0, _0222BFEC ; =ov13_0224F4F4 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222BFEC: .word ov13_0224F4F4 + arm_func_end ov13_0222BFCC + + arm_func_start ov13_0222BFF0 +ov13_0222BFF0: ; 0x0222BFF0 + stmdb sp!, {r3, lr} + sub sp, sp, #0xe8 + ldr r1, _0222C0A8 ; =ov13_0224F4F4 + ldr r1, [r1] + ldr r1, [r1] + cmp r1, #7 + addls pc, pc, r1, lsl #2 + b _0222C0A0 +_0222C010: ; jump table + b _0222C030 ; case 0 + b _0222C030 ; case 1 + b _0222C03C ; case 2 + b _0222C030 ; case 3 + b _0222C048 ; case 4 + b _0222C030 ; case 5 + b _0222C054 ; case 6 + b _0222C09C ; case 7 +_0222C030: + add sp, sp, #0xe8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0222C03C: + add sp, sp, #0xe8 + mov r0, #1 + ldmia sp!, {r3, pc} +_0222C048: + add sp, sp, #0xe8 + mov r0, #2 + ldmia sp!, {r3, pc} +_0222C054: + add r0, sp, #0 + bl ov13_02226F28 + cmp r0, #1 + beq _0222C068 + bl OS_Terminate +_0222C068: + ldr r0, [sp, #0x20] + cmp r0, #0 + blt _0222C090 + cmp r0, #3 + bgt _0222C090 + ldr r0, [sp, #0x24] + cmp r0, #1 + addeq sp, sp, #0xe8 + moveq r0, #3 + ldmeqia sp!, {r3, pc} +_0222C090: + add sp, sp, #0xe8 + mov r0, #5 + ldmia sp!, {r3, pc} +_0222C09C: + mov r0, #4 +_0222C0A0: + add sp, sp, #0xe8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C0A8: .word ov13_0224F4F4 + arm_func_end ov13_0222BFF0 + + arm_func_start ov13_0222C0AC +ov13_0222C0AC: ; 0x0222C0AC + stmdb sp!, {r3, lr} + sub sp, sp, #0xe8 + add r0, sp, #0 + bl ov13_02226F28 + cmp r0, #1 + beq _0222C0C8 + bl OS_Terminate +_0222C0C8: + add r0, sp, #0 + bl ov13_0223A5D0 + add sp, sp, #0xe8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222C0AC + + arm_func_start ov13_0222C0D8 +ov13_0222C0D8: ; 0x0222C0D8 + ldr r3, _0222C0EC ; =ov13_0224F4F4 + ldmia r0, {r0, r1, r2} + ldr r3, [r3] + stmia r3, {r0, r1, r2} + bx lr + .balign 4, 0 +_0222C0EC: .word ov13_0224F4F4 + arm_func_end ov13_0222C0D8 + + arm_func_start ov13_0222C0F0 +ov13_0222C0F0: ; 0x0222C0F0 + ldr ip, _0222C0FC ; =ov13_0224128C + mov r1, #0x20 + bx ip + .balign 4, 0 +_0222C0FC: .word ov13_0224128C + arm_func_end ov13_0222C0F0 + + arm_func_start ov13_0222C100 +ov13_0222C100: ; 0x0222C100 + ldr ip, _0222C108 ; =ov13_022412F4 + bx ip + .balign 4, 0 +_0222C108: .word ov13_022412F4 + arm_func_end ov13_0222C100 + + arm_func_start ov13_0222C10C +ov13_0222C10C: ; 0x0222C10C + stmdb sp!, {r3, lr} + mov r0, #3 + mov r1, #1 + mov r2, #0x3f + mov r3, #0x14 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x3f + mov r3, #0x14 + bl ov13_022403B8 + ldr r0, _0222C144 ; =ov13_0222C148 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C144: .word ov13_0222C148 + arm_func_end ov13_0222C10C + + arm_func_start ov13_0222C148 +ov13_0222C148: ; 0x0222C148 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + mov r1, r0 + bl ov13_02242640 + mov r0, #1 + mov r1, #0 + bl ov13_02242640 + mov r0, #1 + bl ov13_022400C8 + mov r0, #0 + bl ov13_022400C8 + bl ov13_02227DD0 + bl ov13_02227B54 + ldr r0, _0222C1B8 ; =ov13_0224F4F8 + ldr r0, [r0] + bl ov13_0222BAB0 + bl ov13_0222BA44 + bl ov13_02239FDC + bl ov13_0222B9B4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C1B8: .word ov13_0224F4F8 + arm_func_end ov13_0222C148 + + arm_func_start ov13_0222C1BC +ov13_0222C1BC: ; 0x0222C1BC + stmdb sp!, {r3, lr} + bl ov13_02239F98 + bl ov13_0222BA08 + bl ov13_02227B34 + bl ov13_02227D58 + bl ov13_022277A4 + bl ov13_0222B970 + cmp r0, #1 + bne _0222C204 + mov r0, #2 + bl ov13_0222B998 + cmp r0, #0 + beq _0222C204 + ldr r0, _0222C334 ; =ov13_02246034 + bl ov13_0222BA58 + ldr r1, _0222C338 ; =ov13_0224F4F8 + str r0, [r1] + b _0222C21C +_0222C204: + bl ov13_0222B970 + ldr r1, _0222C33C ; =ov13_02246018 + ldr r0, [r1, r0, lsl #2] + bl ov13_0222BA58 + ldr r1, _0222C338 ; =ov13_0224F4F8 + str r0, [r1] +_0222C21C: + ldr r0, _0222C340 ; =ov13_02246044 + bl ov13_022278C4 + mov r1, r0 + mov r0, #1 + bl ov13_02240098 + ldr r0, _0222C344 ; =ov13_02246058 + bl ov13_022278C4 + mov r1, r0 + mov r0, #0 + bl ov13_02240098 + ldr r0, _0222C348 ; =ov13_0224606C + ldr r1, _0222C34C ; =GXS_LoadBG1Char + bl ov13_02227924 + ldr r0, _0222C350 ; =ov13_02246080 + ldr r1, _0222C354 ; =GXS_LoadBGPltt + bl ov13_02227924 + ldr r0, _0222C358 ; =ov13_02246094 + ldr r1, _0222C35C ; =GXS_LoadOBJ + bl ov13_02227924 + ldr r0, _0222C360 ; =ov13_022460AC + ldr r1, _0222C364 ; =GXS_LoadOBJPltt + bl ov13_02227924 + ldr r0, _0222C368 ; =ov13_022460C4 + ldr r1, _0222C36C ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0222C370 ; =ov13_022460DC + ldr r1, _0222C374 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _0222C378 ; =ov13_022460F4 + ldr r1, _0222C37C ; =GX_LoadOBJ + bl ov13_02227924 + ldr r0, _0222C380 ; =ov13_0224610C + ldr r1, _0222C384 ; =GX_LoadOBJPltt + bl ov13_02227924 + bl ov13_0222B980 + cmp r0, #0 + beq _0222C2BC + cmp r0, #1 + beq _0222C2CC + b _0222C2D8 +_0222C2BC: + ldr r0, _0222C388 ; =ov13_02246124 + ldr r1, _0222C38C ; =GXS_LoadBG1Scr + bl ov13_02227924 + b _0222C2D8 +_0222C2CC: + ldr r0, _0222C390 ; =ov13_02246138 + ldr r1, _0222C38C ; =GXS_LoadBG1Scr + bl ov13_02227924 +_0222C2D8: + ldr ip, _0222C394 ; =0x0400100A + mov r0, #1 + ldrh r2, [ip] + sub r3, ip, #0x1000 + mov r1, #2 + bic r2, r2, #3 + orr r2, r2, #3 + strh r2, [ip] + ldrh r2, [r3] + bic r2, r2, #3 + orr r2, r2, #3 + strh r2, [r3] + ldrh r2, [r3] + bic r2, r2, #3 + orr r2, r2, #3 + strh r2, [r3] + bl ov13_02240EA8 + mov r0, #0 + mov r1, #2 + bl ov13_02240EA8 + ldr r0, _0222C398 ; =ov13_0222C39C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C334: .word ov13_02246034 +_0222C338: .word ov13_0224F4F8 +_0222C33C: .word ov13_02246018 +_0222C340: .word ov13_02246044 +_0222C344: .word ov13_02246058 +_0222C348: .word ov13_0224606C +_0222C34C: .word GXS_LoadBG1Char +_0222C350: .word ov13_02246080 +_0222C354: .word GXS_LoadBGPltt +_0222C358: .word ov13_02246094 +_0222C35C: .word GXS_LoadOBJ +_0222C360: .word ov13_022460AC +_0222C364: .word GXS_LoadOBJPltt +_0222C368: .word ov13_022460C4 +_0222C36C: .word GX_LoadBG2Char +_0222C370: .word ov13_022460DC +_0222C374: .word GX_LoadBGPltt +_0222C378: .word ov13_022460F4 +_0222C37C: .word GX_LoadOBJ +_0222C380: .word ov13_0224610C +_0222C384: .word GX_LoadOBJPltt +_0222C388: .word ov13_02246124 +_0222C38C: .word GXS_LoadBG1Scr +_0222C390: .word ov13_02246138 +_0222C394: .word 0x0400100A +_0222C398: .word ov13_0222C39C + arm_func_end ov13_0222C1BC + + arm_func_start ov13_0222C39C +ov13_0222C39C: ; 0x0222C39C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r2, r0 + mov r1, #1 + mov r3, #0x14 + bl ov13_022403B8 + mov r0, #2 + mov r2, r0 + mov r1, #0 + mov r3, #0x14 + bl ov13_022403B8 + ldr r0, _0222C3D4 ; =ov13_0222C3D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C3D4: .word ov13_0222C3D8 + arm_func_end ov13_0222C39C + + arm_func_start ov13_0222C3D8 +ov13_0222C3D8: ; 0x0222C3D8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222B980 + cmp r0, #0 + beq _0222C414 + cmp r0, #1 + beq _0222C42C + ldmia sp!, {r3, pc} +_0222C414: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222C444 ; =ov13_0222C44C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222C42C: + mov r0, #1 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _0222C448 ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C444: .word ov13_0222C44C +_0222C448: .word ov13_022368D8 + arm_func_end ov13_0222C3D8 + + arm_func_start ov13_0222C44C +ov13_0222C44C: ; 0x0222C44C + stmdb sp!, {r3, lr} + bl ov13_0222C4C8 + mov r0, #0 + bl ov13_02227DE4 + mov r0, #0x2e + sub r1, r0, #0x2f + mov r2, #0 + bl ov13_022277B8 + mov r0, #4 + bl ov13_0223B6F4 + ldr r0, _0222C4B0 ; =ov13_0224F4FC + ldr r3, _0222C4B4 ; =ov13_0224533E + ldrb r0, [r0] + ldr r1, _0222C4B8 ; =ov13_02245342 + ldr r2, _0222C4BC ; =ov13_02245340 + mov ip, r0, lsl #3 + ldrh r0, [r3, ip] + ldrh r1, [r1, ip] + ldrh r2, [r2, ip] + ldr r3, _0222C4C0 ; =ov13_02245344 + ldrh r3, [r3, ip] + bl ov13_02227C28 + ldr r0, _0222C4C4 ; =ov13_0222C5B4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C4B0: .word ov13_0224F4FC +_0222C4B4: .word ov13_0224533E +_0222C4B8: .word ov13_02245342 +_0222C4BC: .word ov13_02245340 +_0222C4C0: .word ov13_02245344 +_0222C4C4: .word ov13_0222C5B4 + arm_func_end ov13_0222C44C + + arm_func_start ov13_0222C4C8 +ov13_0222C4C8: ; 0x0222C4C8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr ip, _0222C58C ; =ov13_0224534E + add r3, sp, #0 + mov r2, #0xb +_0222C4DC: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0222C4DC + ldr r0, _0222C590 ; =ov13_0224614C + ldr r1, _0222C594 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0222C598 ; =ov13_02246164 + ldr r1, _0222C59C ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _0222C5A0 ; =ov13_0224617C + ldr r1, _0222C5A4 ; =GX_LoadBG2Scr + bl ov13_02227924 + add r0, sp, #0 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _0222C5A8 ; =ov13_0224F4FC + ldr r2, _0222C5AC ; =0x04001008 + str r0, [r1, #4] + ldrh r0, [r2] + ldr r1, _0222C5B0 ; =0x0400000A + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C58C: .word ov13_0224534E +_0222C590: .word ov13_0224614C +_0222C594: .word GX_LoadBG2Char +_0222C598: .word ov13_02246164 +_0222C59C: .word GX_LoadBGPltt +_0222C5A0: .word ov13_0224617C +_0222C5A4: .word GX_LoadBG2Scr +_0222C5A8: .word ov13_0224F4FC +_0222C5AC: .word 0x04001008 +_0222C5B0: .word 0x0400000A + arm_func_end ov13_0222C4C8 + + arm_func_start ov13_0222C5B4 +ov13_0222C5B4: ; 0x0222C5B4 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _0222C604 ; =ov13_0222C608 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C604: .word ov13_0222C608 + arm_func_end ov13_0222C5B4 + + arm_func_start ov13_0222C608 +ov13_0222C608: ; 0x0222C608 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_022279B4 + ldr r0, _0222C640 ; =ov13_0222C644 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C640: .word ov13_0222C644 + arm_func_end ov13_0222C608 + + arm_func_start ov13_0222C644 +ov13_0222C644: ; 0x0222C644 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222C668 ; =ov13_0222C66C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C668: .word ov13_0222C66C + arm_func_end ov13_0222C644 + + arm_func_start ov13_0222C66C +ov13_0222C66C: ; 0x0222C66C + stmdb sp!, {r3, lr} + bl ov13_0222C680 + bl ov13_0222C7AC + bl ov13_0222C7B0 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222C66C + + arm_func_start ov13_0222C680 +ov13_0222C680: ; 0x0222C680 + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _0222C794 ; =ov13_0224532E + mov r4, #0 +_0222C68C: + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0222C6DC + mov r0, #1 + bl ov13_0222726C + and r1, r4, #0xff + mov lr, r1, lsl #3 + ldr r0, _0222C798 ; =ov13_0224533E + ldr r1, _0222C79C ; =ov13_02245342 + ldr r2, _0222C7A0 ; =ov13_02245340 + ldr r3, _0222C7A4 ; =ov13_02245344 + ldr ip, _0222C7A8 ; =ov13_0224F4FC + ldrh r0, [r0, lr] + ldrh r1, [r1, lr] + ldrh r2, [r2, lr] + ldrh r3, [r3, lr] + strb r4, [ip] + bl ov13_02227C28 + ldmia sp!, {r3, r4, r5, pc} +_0222C6DC: + add r4, r4, #1 + cmp r4, #2 + add r5, r5, #8 + blo _0222C68C + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222C708 + mov r0, #1 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_0222C708: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _0222C724 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_0222C724: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _0222C740 + mov r0, #1 + bl ov13_0222C914 + ldmia sp!, {r3, r4, r5, pc} +_0222C740: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _0222C75C + mov r0, #3 + bl ov13_0222C914 + ldmia sp!, {r3, r4, r5, pc} +_0222C75C: + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _0222C778 + mov r0, #0 + bl ov13_0222C914 + ldmia sp!, {r3, r4, r5, pc} +_0222C778: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #2 + bl ov13_0222C914 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222C794: .word ov13_0224532E +_0222C798: .word ov13_0224533E +_0222C79C: .word ov13_02245342 +_0222C7A0: .word ov13_02245340 +_0222C7A4: .word ov13_02245344 +_0222C7A8: .word ov13_0224F4FC + arm_func_end ov13_0222C680 + + arm_func_start ov13_0222C7AC +ov13_0222C7AC: ; 0x0222C7AC + bx lr + arm_func_end ov13_0222C7AC + + arm_func_start ov13_0222C7B0 +ov13_0222C7B0: ; 0x0222C7B0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _0222C7CC + cmp r0, #1 + beq _0222C7E0 + ldmia sp!, {r3, pc} +_0222C7CC: + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _0222C7F8 ; =ov13_0222C10C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222C7E0: + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0222C984 + ldr r0, _0222C7FC ; =ov13_0222C800 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C7F8: .word ov13_0222C10C +_0222C7FC: .word ov13_0222C800 + arm_func_end ov13_0222C7B0 + + arm_func_start ov13_0222C800 +ov13_0222C800: ; 0x0222C800 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222C81C ; =ov13_0222C820 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C81C: .word ov13_0222C820 + arm_func_end ov13_0222C800 + + arm_func_start ov13_0222C820 +ov13_0222C820: ; 0x0222C820 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x16 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222C868 ; =ov13_0222C86C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C868: .word ov13_0222C86C + arm_func_end ov13_0222C820 + + arm_func_start ov13_0222C86C +ov13_0222C86C: ; 0x0222C86C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227D18 + bl ov13_0222788C + ldr r0, _0222C908 ; =ov13_0224F4FC + ldr r0, [r0, #4] + bl ov13_0223FA50 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + ldr r0, _0222C908 ; =ov13_0224F4FC + ldrb r0, [r0] + cmp r0, #0 + beq _0222C8D8 + cmp r0, #1 + beq _0222C8F0 + ldmia sp!, {r3, pc} +_0222C8D8: + mov r0, #1 + mov r1, #0 + bl ov13_0222B8F8 + ldr r0, _0222C90C ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222C8F0: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _0222C910 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C908: .word ov13_0224F4FC +_0222C90C: .word ov13_022368D8 +_0222C910: .word ov13_0222D454 + arm_func_end ov13_0222C86C + + arm_func_start ov13_0222C914 +ov13_0222C914: ; 0x0222C914 + stmdb sp!, {r3, lr} + cmp r0, #1 + cmpne r0, #3 + ldmeqia sp!, {r3, pc} + ldr r1, _0222C970 ; =ov13_0224F4FC + mov r0, #8 + ldrb r2, [r1] + eor r2, r2, #1 + strb r2, [r1] + bl ov13_0223ABB8 + ldr r0, _0222C970 ; =ov13_0224F4FC + ldr ip, _0222C974 ; =ov13_0224533E + ldrb r0, [r0] + ldr r1, _0222C978 ; =ov13_02245342 + ldr r2, _0222C97C ; =ov13_02245340 + mov lr, r0, lsl #3 + ldr r3, _0222C980 ; =ov13_02245344 + ldrh r0, [ip, lr] + ldrh r1, [r1, lr] + ldrh r2, [r2, lr] + ldrh r3, [r3, lr] + bl ov13_02227C28 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C970: .word ov13_0224F4FC +_0222C974: .word ov13_0224533E +_0222C978: .word ov13_02245342 +_0222C97C: .word ov13_02245340 +_0222C980: .word ov13_02245344 + arm_func_end ov13_0222C914 + + arm_func_start ov13_0222C984 +ov13_0222C984: ; 0x0222C984 + stmdb sp!, {r3, lr} + ldr r1, _0222C9BC ; =ov13_0224532C + ldr r0, _0222C9C0 ; =ov13_0224F4FC + ldrb r3, [r1] + ldrb r2, [r1, #1] + ldrb r1, [r0] + add ip, sp, #0 + strb r3, [sp] + strb r2, [sp, #1] + ldrb r1, [ip, r1] + ldr r0, [r0, #4] + mov r2, r1 + bl ov13_02239378 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222C9BC: .word ov13_0224532C +_0222C9C0: .word ov13_0224F4FC + arm_func_end ov13_0222C984 + + arm_func_start ov13_0222C9C4 +ov13_0222C9C4: ; 0x0222C9C4 + stmdb sp!, {r3, lr} + ldr r0, _0222CA04 ; =ov13_0224F504 + mov r1, #0 + strb r1, [r0] + bl ov13_0222CA0C + mov r0, #0x12 + bl ov13_02227DE4 + mov r0, #0x3b + sub r1, r0, #0x3c + mov r2, #0 + bl ov13_022277B8 + mov r0, #0x17 + bl ov13_022279EC + ldr r0, _0222CA08 ; =ov13_0222CA8C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CA04: .word ov13_0224F504 +_0222CA08: .word ov13_0222CA8C + arm_func_end ov13_0222C9C4 + + arm_func_start ov13_0222CA0C +ov13_0222CA0C: ; 0x0222CA0C + stmdb sp!, {r3, lr} + ldr r0, _0222CA7C ; =ov13_02246190 + ldr r1, _0222CA80 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222CA84 ; =0x04001008 + ldr r1, _0222CA88 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CA7C: .word ov13_02246190 +_0222CA80: .word GX_LoadBG2Scr +_0222CA84: .word 0x04001008 +_0222CA88: .word 0x0400000A + arm_func_end ov13_0222CA0C + + arm_func_start ov13_0222CA8C +ov13_0222CA8C: ; 0x0222CA8C + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222CADC ; =ov13_0222CAE0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CADC: .word ov13_0222CAE0 + arm_func_end ov13_0222CA8C + + arm_func_start ov13_0222CAE0 +ov13_0222CAE0: ; 0x0222CAE0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + bl ov13_022279B4 + ldr r0, _0222CB18 ; =ov13_0222CB1C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CB18: .word ov13_0222CB1C + arm_func_end ov13_0222CAE0 + + arm_func_start ov13_0222CB1C +ov13_0222CB1C: ; 0x0222CB1C + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222CB40 ; =ov13_0222CB44 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CB40: .word ov13_0222CB44 + arm_func_end ov13_0222CB1C + + arm_func_start ov13_0222CB44 +ov13_0222CB44: ; 0x0222CB44 + stmdb sp!, {r3, lr} + bl ov13_0222CB58 + bl ov13_0222CB90 + bl ov13_0222CB94 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222CB44 + + arm_func_start ov13_0222CB58 +ov13_0222CB58: ; 0x0222CB58 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222CB74 + mov r0, #1 + bl ov13_0222726C +_0222CB74: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222CB58 + + arm_func_start ov13_0222CB90 +ov13_0222CB90: ; 0x0222CB90 + bx lr + arm_func_end ov13_0222CB90 + + arm_func_start ov13_0222CB94 +ov13_0222CB94: ; 0x0222CB94 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _0222CBB0 + cmp r0, #1 + beq _0222CBC4 + ldmia sp!, {r3, pc} +_0222CBB0: + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _0222CBF4 ; =ov13_0222CBFC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222CBC4: + mov r0, #6 + bl ov13_0223ABB8 + mov r2, #1 + mov r1, #0 + sub r3, r2, #2 + mov r0, #0x18 + str r1, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _0222CBF8 ; =ov13_0222CD38 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CBF4: .word ov13_0222CBFC +_0222CBF8: .word ov13_0222CD38 + arm_func_end ov13_0222CB94 + + arm_func_start ov13_0222CBFC +ov13_0222CBFC: ; 0x0222CBFC + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222CC18 ; =ov13_0222CC1C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CC18: .word ov13_0222CC1C + arm_func_end ov13_0222CBFC + + arm_func_start ov13_0222CC1C +ov13_0222CC1C: ; 0x0222CC1C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _0222CC78 ; =ov13_0224F504 + ldrb r0, [r0] + cmp r0, #0 + bne _0222CC58 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222CC58: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222CC7C ; =ov13_0222CC80 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CC78: .word ov13_0224F504 +_0222CC7C: .word ov13_0222CC80 + arm_func_end ov13_0222CC1C + + arm_func_start ov13_0222CC80 +ov13_0222CC80: ; 0x0222CC80 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222CD2C ; =ov13_0224F504 + ldrb r0, [r0] + cmp r0, #0 + bne _0222CCB4 + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_0222CCB4: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0222CD2C ; =ov13_0224F504 + ldrb r0, [r0] + cmp r0, #0 + bne _0222CCE8 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222CCE8: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222CD2C ; =ov13_0224F504 + mov r1, #1 + ldrb r0, [r0] + cmp r0, #0 + mov r0, #0 + bne _0222CD1C + bl ov13_0222B8F8 + ldr r0, _0222CD30 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222CD1C: + bl ov13_0222B8F8 + ldr r0, _0222CD34 ; =ov13_0222CDA8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CD2C: .word ov13_0224F504 +_0222CD30: .word ov13_0222D454 +_0222CD34: .word ov13_0222CDA8 + arm_func_end ov13_0222CC80 + + arm_func_start ov13_0222CD38 +ov13_0222CD38: ; 0x0222CD38 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + beq _0222CD68 + cmp r0, #1 + ldmneia sp!, {r3, pc} + mov r0, #0xe + bl ov13_0223ABB8 + ldr r0, _0222CD80 ; =ov13_0224F504 + mov r1, #1 + strb r1, [r0] + b _0222CD70 +_0222CD68: + mov r0, #7 + bl ov13_0223ABB8 +_0222CD70: + bl ov13_0223C198 + ldr r0, _0222CD84 ; =ov13_0222CD88 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CD80: .word ov13_0224F504 +_0222CD84: .word ov13_0222CD88 + arm_func_end ov13_0222CD38 + + arm_func_start ov13_0222CD88 +ov13_0222CD88: ; 0x0222CD88 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222CDA4 ; =ov13_0222CBFC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CDA4: .word ov13_0222CBFC + arm_func_end ov13_0222CD88 + + arm_func_start ov13_0222CDA8 +ov13_0222CDA8: ; 0x0222CDA8 + stmdb sp!, {r3, lr} + bl ov13_0222CDCC + mov r0, #0x19 + bl ov13_022279EC + bl ov13_0223A840 + ldr r0, _0222CDC8 ; =ov13_0222CE4C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CDC8: .word ov13_0222CE4C + arm_func_end ov13_0222CDA8 + + arm_func_start ov13_0222CDCC +ov13_0222CDCC: ; 0x0222CDCC + stmdb sp!, {r3, lr} + ldr r0, _0222CE3C ; =ov13_022461A4 + ldr r1, _0222CE40 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222CE44 ; =0x04001008 + ldr r1, _0222CE48 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CE3C: .word ov13_022461A4 +_0222CE40: .word GX_LoadBG2Scr +_0222CE44: .word 0x04001008 +_0222CE48: .word 0x0400000A + arm_func_end ov13_0222CDCC + + arm_func_start ov13_0222CE4C +ov13_0222CE4C: ; 0x0222CE4C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222CE7C ; =ov13_0222CE80 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CE7C: .word ov13_0222CE80 + arm_func_end ov13_0222CE4C + + arm_func_start ov13_0222CE80 +ov13_0222CE80: ; 0x0222CE80 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #5 + bl ov13_022279B4 + ldr r0, _0222CEA8 ; =ov13_0222CEAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CEA8: .word ov13_0222CEAC + arm_func_end ov13_0222CE80 + + arm_func_start ov13_0222CEAC +ov13_0222CEAC: ; 0x0222CEAC + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222CED0 ; =ov13_0222CED4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CED0: .word ov13_0222CED4 + arm_func_end ov13_0222CEAC + + arm_func_start ov13_0222CED4 +ov13_0222CED4: ; 0x0222CED4 + stmdb sp!, {r3, lr} + bl ov13_0222CEE8 + bl ov13_0222CF08 + bl ov13_0222CF0C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222CED4 + + arm_func_start ov13_0222CEE8 +ov13_0222CEE8: ; 0x0222CEE8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222CEE8 + + arm_func_start ov13_0222CF08 +ov13_0222CF08: ; 0x0222CF08 + bx lr + arm_func_end ov13_0222CF08 + + arm_func_start ov13_0222CF0C +ov13_0222CF0C: ; 0x0222CF0C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0222CF30 ; =ov13_0222CF34 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CF30: .word ov13_0222CF34 + arm_func_end ov13_0222CF0C + + arm_func_start ov13_0222CF34 +ov13_0222CF34: ; 0x0222CF34 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222CF50 ; =ov13_0222CF54 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CF50: .word ov13_0222CF54 + arm_func_end ov13_0222CF34 + + arm_func_start ov13_0222CF54 +ov13_0222CF54: ; 0x0222CF54 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + mov r1, #1 + mov r2, #0x3f + mov r3, #0x40 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x3f + mov r3, #0x40 + bl ov13_022403B8 + ldr r0, _0222CF9C ; =ov13_0222CFA0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222CF9C: .word ov13_0222CFA0 + arm_func_end ov13_0222CF54 + + arm_func_start ov13_0222CFA0 +ov13_0222CFA0: ; 0x0222CFA0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0x1000000 + bl OS_SpinWait + bl PM_ForceToPowerOff + ldmia sp!, {r3, pc} + arm_func_end ov13_0222CFA0 + + arm_func_start ov13_0222CFD4 +ov13_0222CFD4: ; 0x0222CFD4 + stmdb sp!, {r3, lr} + bl ov13_0222D008 + mov r0, #0x11 + bl ov13_02227DE4 + mov r0, #0x3a + sub r1, r0, #0x3b + mov r2, #0 + bl ov13_022277B8 + bl ov13_0222D088 + ldr r0, _0222D004 ; =ov13_0222D25C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D004: .word ov13_0222D25C + arm_func_end ov13_0222CFD4 + + arm_func_start ov13_0222D008 +ov13_0222D008: ; 0x0222D008 + stmdb sp!, {r3, lr} + ldr r0, _0222D078 ; =ov13_022461B8 + ldr r1, _0222D07C ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222D080 ; =0x04001008 + ldr r1, _0222D084 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D078: .word ov13_022461B8 +_0222D07C: .word GX_LoadBG2Scr +_0222D080: .word 0x04001008 +_0222D084: .word 0x0400000A + arm_func_end ov13_0222D008 + + arm_func_start ov13_0222D088 +ov13_0222D088: ; 0x0222D088 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x68 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + mov fp, r0 + add r0, sp, #0x14 + bl OS_GetMacAddress + ldrb r1, [sp, #0x15] + ldr r2, _0222D24C ; =ov13_022461CC + add r0, sp, #0x1a + str r1, [sp] + ldrb r3, [sp, #0x16] + mov r1, #0x14 + str r3, [sp, #4] + ldrb r3, [sp, #0x17] + str r3, [sp, #8] + ldrb r3, [sp, #0x18] + str r3, [sp, #0xc] + ldrb r3, [sp, #0x19] + str r3, [sp, #0x10] + ldrb r3, [sp, #0x14] + bl swprintf + mov r0, #0x1c + str r0, [sp] + mov r0, #2 + str r0, [sp, #4] + mov r0, #0x480 + str r0, [sp, #8] + add r1, sp, #0x1a + str r1, [sp, #0xc] + mov r0, fp + mov r1, #8 + mov r2, #0x40 + mov r3, #0xf0 + bl ov13_02240CC0 + add r0, sp, #0x54 + bl DWCi_BM_GetWiFiInfo + ldr sl, [sp, #0x58] + ldr r8, [sp, #0x54] + cmp sl, #0 + mov r3, #0 + cmpeq r8, #0 + beq _0222D1F8 + mov r0, r8 + mov r1, sl + mov r2, #0xa + bl _ull_mod + mov r1, #0x3e8 + umull r4, r1, r0, r1 + mov r0, r8 + mov r1, sl + mov r3, #0 + mov r2, #0xa + str r4, [sp, #0x50] + bl _ll_udiv + mov sb, #0 + ldr r7, _0222D250 ; =0x00002710 + mov r8, r0 + mov sl, r1 + mov r6, sb + add r5, sp, #0x44 + mov r4, sb +_0222D184: + mov r0, r8 + mov r1, sl + mov r2, r7 + mov r3, r6 + bl _ull_mod + rsb r1, sb, #2 + str r0, [r5, r1, lsl #2] + mov r0, r8 + mov r1, sl + mov r2, r7 + mov r3, r4 + bl _ll_udiv + mov r8, r0 + mov sl, r1 + add sb, sb, #1 + cmp sb, #3 + blt _0222D184 + ldr r1, [sp, #0x48] + ldr r0, [sp, #0x4c] + str r1, [sp] + str r0, [sp, #4] + ldr r4, [sp, #0x50] + ldr r3, [sp, #0x44] + ldr r2, _0222D254 ; =ov13_02246208 + add r0, sp, #0x1a + mov r1, #0x14 + str r4, [sp, #8] + bl swprintf + b _0222D208 +_0222D1F8: + ldr r2, _0222D258 ; =ov13_02246230 + add r0, sp, #0x1a + mov r1, #0x14 + bl swprintf +_0222D208: + mov r0, #0x1c + str r0, [sp] + mov r0, #2 + str r0, [sp, #4] + mov r0, #0x480 + str r0, [sp, #8] + add r4, sp, #0x1a + mov r0, fp + mov r1, #8 + mov r2, #0x78 + mov r3, #0xf0 + str r4, [sp, #0xc] + bl ov13_02240CC0 + mov r0, fp + bl ov13_02240E2C + add sp, sp, #0x68 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0222D24C: .word ov13_022461CC +_0222D250: .word 0x00002710 +_0222D254: .word ov13_02246208 +_0222D258: .word ov13_02246230 + arm_func_end ov13_0222D088 + + arm_func_start ov13_0222D25C +ov13_0222D25C: ; 0x0222D25C + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222D2AC ; =ov13_0222D2B0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D2AC: .word ov13_0222D2B0 + arm_func_end ov13_0222D25C + + arm_func_start ov13_0222D2B0 +ov13_0222D2B0: ; 0x0222D2B0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #2 + bl ov13_022279B4 + ldr r0, _0222D2E8 ; =ov13_0222D2EC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D2E8: .word ov13_0222D2EC + arm_func_end ov13_0222D2B0 + + arm_func_start ov13_0222D2EC +ov13_0222D2EC: ; 0x0222D2EC + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222D310 ; =ov13_0222D314 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D310: .word ov13_0222D314 + arm_func_end ov13_0222D2EC + + arm_func_start ov13_0222D314 +ov13_0222D314: ; 0x0222D314 + stmdb sp!, {r3, lr} + bl ov13_0222D328 + bl ov13_0222D348 + bl ov13_0222D34C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222D314 + + arm_func_start ov13_0222D328 +ov13_0222D328: ; 0x0222D328 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222D328 + + arm_func_start ov13_0222D348 +ov13_0222D348: ; 0x0222D348 + bx lr + arm_func_end ov13_0222D348 + + arm_func_start ov13_0222D34C +ov13_0222D34C: ; 0x0222D34C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _0222D370 ; =ov13_0222D374 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D370: .word ov13_0222D374 + arm_func_end ov13_0222D34C + + arm_func_start ov13_0222D374 +ov13_0222D374: ; 0x0222D374 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222D390 ; =ov13_0222D394 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D390: .word ov13_0222D394 + arm_func_end ov13_0222D374 + + arm_func_start ov13_0222D394 +ov13_0222D394: ; 0x0222D394 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222D3E0 ; =ov13_0222D3E4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D3E0: .word ov13_0222D3E4 + arm_func_end ov13_0222D394 + + arm_func_start ov13_0222D3E4 +ov13_0222D3E4: ; 0x0222D3E4 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222D450 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D450: .word ov13_0222D454 + arm_func_end ov13_0222D3E4 + + arm_func_start ov13_0222D454 +ov13_0222D454: ; 0x0222D454 + stmdb sp!, {r4, lr} + ldr r0, _0222D500 ; =ov13_0224F508 + mov r1, #0 + strb r1, [r0, #1] + bl ov13_0222D51C + mov r0, #0x10 + bl ov13_02227DE4 + mov r0, #3 + bl ov13_0223B6F4 + mov r0, #0x39 + sub r1, r0, #0x3a + mov r2, #0 + bl ov13_022277B8 + mov r0, #0 + mov r1, #0x5b + bl ov13_02240184 + ldr r2, _0222D500 ; =ov13_0224F508 + ldr r1, _0222D504 ; =0xFE00FF00 + str r0, [r2, #8] + ldr r3, [r0] + ldr lr, _0222D508 ; =ov13_022453B2 + and r1, r3, r1 + orr r1, r1, #0x84 + orr r1, r1, #0xe00000 + str r1, [r0] + ldr r4, [r2, #8] + ldr r1, _0222D50C ; =ov13_022453B6 + ldrh r0, [r4, #4] + ldr ip, _0222D510 ; =ov13_022453B4 + ldr r3, _0222D514 ; =ov13_022453B8 + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r4, #4] + ldrb r0, [r2] + mov r4, r0, lsl #3 + ldrh r0, [lr, r4] + ldrh r1, [r1, r4] + ldrh r2, [ip, r4] + ldrh r3, [r3, r4] + bl ov13_02227C28 + ldr r0, _0222D518 ; =ov13_0222D6B8 + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222D500: .word ov13_0224F508 +_0222D504: .word 0xFE00FF00 +_0222D508: .word ov13_022453B2 +_0222D50C: .word ov13_022453B6 +_0222D510: .word ov13_022453B4 +_0222D514: .word ov13_022453B8 +_0222D518: .word ov13_0222D6B8 + arm_func_end ov13_0222D454 + + arm_func_start ov13_0222D51C +ov13_0222D51C: ; 0x0222D51C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x44 + ldr r4, _0222D694 ; =ov13_0224536C + add r3, sp, #0x2b + mov r2, #0xb +_0222D530: + ldrb r1, [r4] + ldrb r0, [r4, #1] + add r4, r4, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0222D530 + ldr r4, _0222D698 ; =ov13_02245382 + add r3, sp, #0x14 + mov r2, #0xb +_0222D55C: + ldrb r1, [r4] + ldrb r0, [r4, #1] + add r4, r4, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0222D55C + ldrb r2, [r4] + ldr r0, _0222D69C ; =ov13_02246258 + ldr r1, _0222D6A0 ; =GX_LoadBG2Char + strb r2, [r3] + bl ov13_02227924 + ldr r0, _0222D6A4 ; =ov13_02246270 + ldr r1, _0222D6A8 ; =GX_LoadBG2Scr + bl ov13_02227924 + add r0, sp, #0x14 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _0222D6AC ; =ov13_0224F508 + str r0, [r1, #4] + add r0, sp, #0x2b + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + mov r8, r0 + add r0, sp, #0 + bl DWCi_BM_GetWiFiInfo + ldr r0, [sp, #4] + ldr r1, [sp] + cmp r0, #0 + mov r7, #0 + cmpeq r1, #0 + bne _0222D620 + add r5, r8, #0xc0 + add r6, r8, #0x40 + mov r4, #0x20 +_0222D5FC: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl MI_CpuCopy8 + add r7, r7, #1 + cmp r7, #2 + add r5, r5, #0x20 + add r6, r6, #0x20 + blt _0222D5FC +_0222D620: + mov r0, r8 + mov r1, #0x200 + bl DC_FlushRange + mov r0, r8 + mov r1, #0 + mov r2, #0x200 + bl GX_LoadBGPltt + mov r0, r8 + bl ov13_0223FA50 + ldr r2, _0222D6B0 ; =0x04001008 + ldr r1, _0222D6B4 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + add sp, sp, #0x44 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0222D694: .word ov13_0224536C +_0222D698: .word ov13_02245382 +_0222D69C: .word ov13_02246258 +_0222D6A0: .word GX_LoadBG2Char +_0222D6A4: .word ov13_02246270 +_0222D6A8: .word GX_LoadBG2Scr +_0222D6AC: .word ov13_0224F508 +_0222D6B0: .word 0x04001008 +_0222D6B4: .word 0x0400000A + arm_func_end ov13_0222D51C + + arm_func_start ov13_0222D6B8 +ov13_0222D6B8: ; 0x0222D6B8 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _0222D708 ; =ov13_0222D70C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D708: .word ov13_0222D70C + arm_func_end ov13_0222D6B8 + + arm_func_start ov13_0222D70C +ov13_0222D70C: ; 0x0222D70C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_022279B4 + ldr r0, _0222D744 ; =ov13_0222D748 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D744: .word ov13_0222D748 + arm_func_end ov13_0222D70C + + arm_func_start ov13_0222D748 +ov13_0222D748: ; 0x0222D748 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222D76C ; =ov13_0222D770 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D76C: .word ov13_0222D770 + arm_func_end ov13_0222D748 + + arm_func_start ov13_0222D770 +ov13_0222D770: ; 0x0222D770 + stmdb sp!, {r3, lr} + bl ov13_0222D784 + bl ov13_0222D878 + bl ov13_0222D87C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222D770 + + arm_func_start ov13_0222D784 +ov13_0222D784: ; 0x0222D784 + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _0222D860 ; =ov13_0224539A + mov r4, #0 +_0222D790: + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0222D7E0 + mov r0, #1 + bl ov13_0222726C + and r1, r4, #0xff + mov lr, r1, lsl #3 + ldr r0, _0222D864 ; =ov13_022453B2 + ldr r1, _0222D868 ; =ov13_022453B6 + ldr r2, _0222D86C ; =ov13_022453B4 + ldr r3, _0222D870 ; =ov13_022453B8 + ldr ip, _0222D874 ; =ov13_0224F508 + ldrh r0, [r0, lr] + ldrh r1, [r1, lr] + ldrh r2, [r2, lr] + ldrh r3, [r3, lr] + strb r4, [ip] + bl ov13_02227C28 + ldmia sp!, {r3, r4, r5, pc} +_0222D7E0: + add r4, r4, #1 + cmp r4, #3 + add r5, r5, #8 + blo _0222D790 + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222D80C + mov r0, #1 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_0222D80C: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _0222D828 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_0222D828: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _0222D844 + mov r0, #1 + bl ov13_0222DAB0 + ldmia sp!, {r3, r4, r5, pc} +_0222D844: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #3 + bl ov13_0222DAB0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222D860: .word ov13_0224539A +_0222D864: .word ov13_022453B2 +_0222D868: .word ov13_022453B6 +_0222D86C: .word ov13_022453B4 +_0222D870: .word ov13_022453B8 +_0222D874: .word ov13_0224F508 + arm_func_end ov13_0222D784 + + arm_func_start ov13_0222D878 +ov13_0222D878: ; 0x0222D878 + bx lr + arm_func_end ov13_0222D878 + + arm_func_start ov13_0222D87C +ov13_0222D87C: ; 0x0222D87C + stmdb sp!, {lr} + sub sp, sp, #0x14 + bl ov13_02227258 + cmp r0, #0 + beq _0222D8A0 + cmp r0, #1 + beq _0222D8AC + add sp, sp, #0x14 + ldmia sp!, {pc} +_0222D8A0: + mov r0, #7 + bl ov13_0223ABB8 + b _0222D908 +_0222D8AC: + add r0, sp, #0 + bl DWCi_BM_GetWiFiInfo + ldr r0, _0222D918 ; =ov13_0224F508 + ldrb r0, [r0] + cmp r0, #0 + beq _0222D8F0 + ldr r0, [sp, #4] + ldr r1, [sp] + cmp r0, #0 + cmpeq r1, #0 + bne _0222D8F0 + mov r0, #9 + bl ov13_0223ABB8 + mvn r0, #0 + bl ov13_0222728C + add sp, sp, #0x14 + ldmia sp!, {pc} +_0222D8F0: + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0222DB40 + ldr r0, _0222D918 ; =ov13_0224F508 + mov r1, #1 + strb r1, [r0, #1] +_0222D908: + ldr r0, _0222D91C ; =ov13_0222D920 + bl ov13_0222B8E8 + add sp, sp, #0x14 + ldmia sp!, {pc} + .balign 4, 0 +_0222D918: .word ov13_0224F508 +_0222D91C: .word ov13_0222D920 + arm_func_end ov13_0222D87C + + arm_func_start ov13_0222D920 +ov13_0222D920: ; 0x0222D920 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222D93C ; =ov13_0222D940 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D93C: .word ov13_0222D940 + arm_func_end ov13_0222D920 + + arm_func_start ov13_0222D940 +ov13_0222D940: ; 0x0222D940 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222D99C ; =ov13_0224F508 + ldrb r0, [r0, #1] + cmp r0, #0 + beq _0222D968 + bl ov13_02227228 +_0222D968: + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222D9A0 ; =ov13_0222D9A4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222D99C: .word ov13_0224F508 +_0222D9A0: .word ov13_0222D9A4 + arm_func_end ov13_0222D940 + + arm_func_start ov13_0222D9A4 +ov13_0222D9A4: ; 0x0222D9A4 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _0222DA9C ; =ov13_0224F508 + ldr r0, [r0, #8] + bl ov13_02241D98 + bl ov13_02227D18 + bl ov13_0222788C + ldr r0, _0222DA9C ; =ov13_0224F508 + ldr r0, [r0, #4] + bl ov13_0223FA50 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + ldr r0, _0222DA9C ; =ov13_0224F508 + ldrb r1, [r0, #1] + cmp r1, #0 + bne _0222DA34 + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _0222DAA0 ; =ov13_0222C44C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222DA34: + ldrb r0, [r0] + cmp r0, #0 + beq _0222DA54 + cmp r0, #1 + beq _0222DA6C + cmp r0, #2 + beq _0222DA84 + ldmia sp!, {r3, pc} +_0222DA54: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222DAA4 ; =ov13_0222CFD4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222DA6C: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222DAA8 ; =ov13_0222C9C4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222DA84: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222DAAC ; =ov13_0222E220 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DA9C: .word ov13_0224F508 +_0222DAA0: .word ov13_0222C44C +_0222DAA4: .word ov13_0222CFD4 +_0222DAA8: .word ov13_0222C9C4 +_0222DAAC: .word ov13_0222E220 + arm_func_end ov13_0222D9A4 + + arm_func_start ov13_0222DAB0 +ov13_0222DAB0: ; 0x0222DAB0 + stmdb sp!, {r3, lr} + cmp r0, #1 + mov r1, #3 + bne _0222DAD8 + ldr r0, _0222DB2C ; =ov13_0224F508 + ldrb r0, [r0] + add r0, r0, #2 + bl FX_ModS32 + ldr r1, _0222DB2C ; =ov13_0224F508 + b _0222DAEC +_0222DAD8: + ldr r0, _0222DB2C ; =ov13_0224F508 + ldrb r0, [r0] + add r0, r0, #1 + bl FX_ModS32 + ldr r1, _0222DB2C ; =ov13_0224F508 +_0222DAEC: + strb r0, [r1] + mov r0, #8 + bl ov13_0223ABB8 + ldr r0, _0222DB2C ; =ov13_0224F508 + ldr ip, _0222DB30 ; =ov13_022453B2 + ldrb r0, [r0] + ldr r1, _0222DB34 ; =ov13_022453B6 + ldr r2, _0222DB38 ; =ov13_022453B4 + mov lr, r0, lsl #3 + ldr r3, _0222DB3C ; =ov13_022453B8 + ldrh r0, [ip, lr] + ldrh r1, [r1, lr] + ldrh r2, [r2, lr] + ldrh r3, [r3, lr] + bl ov13_02227C28 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DB2C: .word ov13_0224F508 +_0222DB30: .word ov13_022453B2 +_0222DB34: .word ov13_022453B6 +_0222DB38: .word ov13_022453B4 +_0222DB3C: .word ov13_022453B8 + arm_func_end ov13_0222DAB0 + + arm_func_start ov13_0222DB40 +ov13_0222DB40: ; 0x0222DB40 + ldr r0, _0222DB60 ; =ov13_0224F508 + ldr r1, _0222DB64 ; =ov13_02245364 + ldrb r2, [r0] + ldr ip, _0222DB68 ; =ov13_02239378 + ldr r0, [r0, #4] + ldrb r1, [r1, r2] + mov r2, r1 + bx ip + .balign 4, 0 +_0222DB60: .word ov13_0224F508 +_0222DB64: .word ov13_02245364 +_0222DB68: .word ov13_02239378 + arm_func_end ov13_0222DB40 + + arm_func_start ov13_0222DB6C +ov13_0222DB6C: ; 0x0222DB6C + stmdb sp!, {r3, lr} + bl ov13_0222DBA4 + mov r0, #0x1e + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + mov r0, #1 + bl ov13_02227EB0 + mov r0, #0xb + bl ov13_0223ABB8 + ldr r0, _0222DBA0 ; =ov13_0222DC24 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DBA0: .word ov13_0222DC24 + arm_func_end ov13_0222DB6C + + arm_func_start ov13_0222DBA4 +ov13_0222DBA4: ; 0x0222DBA4 + stmdb sp!, {r3, lr} + ldr r0, _0222DC14 ; =ov13_02246288 + ldr r1, _0222DC18 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222DC1C ; =0x04001008 + ldr r1, _0222DC20 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DC14: .word ov13_02246288 +_0222DC18: .word GX_LoadBG2Scr +_0222DC1C: .word 0x04001008 +_0222DC20: .word 0x0400000A + arm_func_end ov13_0222DBA4 + + arm_func_start ov13_0222DC24 +ov13_0222DC24: ; 0x0222DC24 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222DC54 ; =ov13_0222DC58 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DC54: .word ov13_0222DC58 + arm_func_end ov13_0222DC24 + + arm_func_start ov13_0222DC58 +ov13_0222DC58: ; 0x0222DC58 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222DC80 ; =ov13_0222DD5C + bl ov13_0222BC84 + ldr r0, _0222DC84 ; =ov13_0222DC88 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DC80: .word ov13_0222DD5C +_0222DC84: .word ov13_0222DC88 + arm_func_end ov13_0222DC58 + + arm_func_start ov13_0222DC88 +ov13_0222DC88: ; 0x0222DC88 + stmdb sp!, {r3, lr} + bl ov13_0222DC98 + bl ov13_0222DC9C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222DC88 + + arm_func_start ov13_0222DC98 +ov13_0222DC98: ; 0x0222DC98 + bx lr + arm_func_end ov13_0222DC98 + + arm_func_start ov13_0222DC9C +ov13_0222DC9C: ; 0x0222DC9C + bx lr + arm_func_end ov13_0222DC9C + + arm_func_start ov13_0222DCA0 +ov13_0222DCA0: ; 0x0222DCA0 + stmdb sp!, {r3, lr} + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222DCC4 ; =ov13_0222DCC8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DCC4: .word ov13_0222DCC8 + arm_func_end ov13_0222DCA0 + + arm_func_start ov13_0222DCC8 +ov13_0222DCC8: ; 0x0222DCC8 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_02227F68 + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222DD4C ; =ov13_0224F514 + ldrb r0, [r0] + cmp r0, #0 + bne _0222DD2C + ldr r0, _0222DD50 ; =ov13_0222E754 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222DD2C: + cmp r0, #2 + bne _0222DD40 + ldr r0, _0222DD54 ; =ov13_0222E56C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222DD40: + ldr r0, _0222DD58 ; =ov13_0222DDE4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DD4C: .word ov13_0224F514 +_0222DD50: .word ov13_0222E754 +_0222DD54: .word ov13_0222E56C +_0222DD58: .word ov13_0222DDE4 + arm_func_end ov13_0222DCC8 + + arm_func_start ov13_0222DD5C +ov13_0222DD5C: ; 0x0222DD5C + stmdb sp!, {r3, lr} + cmp r0, #2 + bne _0222DD88 + bl ov13_0223A840 + ldr r0, _0222DDDC ; =ov13_0224F514 + mov r1, #1 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #0x10 + bl ov13_0223ABB8 + b _0222DDC4 +_0222DD88: + cmp r0, #3 + bne _0222DDAC + ldr r0, _0222DDDC ; =ov13_0224F514 + mov r1, #2 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #0x12 + bl ov13_0223ABB8 + b _0222DDC4 +_0222DDAC: + ldr r0, _0222DDDC ; =ov13_0224F514 + mov r1, #0 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #0x12 + bl ov13_0223ABB8 +_0222DDC4: + mov r0, #0 + bl ov13_0222BC84 + bl ov13_0222BC0C + ldr r0, _0222DDE0 ; =ov13_0222DCA0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DDDC: .word ov13_0224F514 +_0222DDE0: .word ov13_0222DCA0 + arm_func_end ov13_0222DD5C + + arm_func_start ov13_0222DDE4 +ov13_0222DDE4: ; 0x0222DDE4 + stmdb sp!, {r3, lr} + bl ov13_0222DE04 + mov r0, #0x1f + bl ov13_022279EC + ldr r0, _0222DE00 ; =ov13_0222DE6C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DE00: .word ov13_0222DE6C + arm_func_end ov13_0222DDE4 + + arm_func_start ov13_0222DE04 +ov13_0222DE04: ; 0x0222DE04 + ldr r3, _0222DE64 ; =0x04001008 + ldr r1, _0222DE68 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + bx lr + .balign 4, 0 +_0222DE64: .word 0x04001008 +_0222DE68: .word 0x0400000A + arm_func_end ov13_0222DE04 + + arm_func_start ov13_0222DE6C +ov13_0222DE6C: ; 0x0222DE6C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222DE9C ; =ov13_0222DEA0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DE9C: .word ov13_0222DEA0 + arm_func_end ov13_0222DE6C + + arm_func_start ov13_0222DEA0 +ov13_0222DEA0: ; 0x0222DEA0 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #5 + bl ov13_022279B4 + ldr r0, _0222DEC8 ; =ov13_0222DECC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DEC8: .word ov13_0222DECC + arm_func_end ov13_0222DEA0 + + arm_func_start ov13_0222DECC +ov13_0222DECC: ; 0x0222DECC + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222DEF0 ; =ov13_0222DEF4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DEF0: .word ov13_0222DEF4 + arm_func_end ov13_0222DECC + + arm_func_start ov13_0222DEF4 +ov13_0222DEF4: ; 0x0222DEF4 + stmdb sp!, {r3, lr} + bl ov13_0222DF08 + bl ov13_0222DF28 + bl ov13_0222DF2C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222DEF4 + + arm_func_start ov13_0222DF08 +ov13_0222DF08: ; 0x0222DF08 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222DF08 + + arm_func_start ov13_0222DF28 +ov13_0222DF28: ; 0x0222DF28 + bx lr + arm_func_end ov13_0222DF28 + + arm_func_start ov13_0222DF2C +ov13_0222DF2C: ; 0x0222DF2C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0222DF50 ; =ov13_0222DF54 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DF50: .word ov13_0222DF54 + arm_func_end ov13_0222DF2C + + arm_func_start ov13_0222DF54 +ov13_0222DF54: ; 0x0222DF54 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222DF70 ; =ov13_0222DF74 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DF70: .word ov13_0222DF74 + arm_func_end ov13_0222DF54 + + arm_func_start ov13_0222DF74 +ov13_0222DF74: ; 0x0222DF74 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + mov r1, #1 + mov r2, #0x3f + mov r3, #0x40 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x3f + mov r3, #0x40 + bl ov13_022403B8 + ldr r0, _0222DFBC ; =ov13_0222DFC0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222DFBC: .word ov13_0222DFC0 + arm_func_end ov13_0222DF74 + + arm_func_start ov13_0222DFC0 +ov13_0222DFC0: ; 0x0222DFC0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0x1000000 + bl OS_SpinWait + bl PM_ForceToPowerOff + ldmia sp!, {r3, pc} + arm_func_end ov13_0222DFC0 + + arm_func_start ov13_0222DFF4 +ov13_0222DFF4: ; 0x0222DFF4 + stmdb sp!, {r3, lr} + bl ov13_0222E014 + mov r0, #0x1a + bl ov13_022279EC + ldr r0, _0222E010 ; =ov13_0222E07C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E010: .word ov13_0222E07C + arm_func_end ov13_0222DFF4 + + arm_func_start ov13_0222E014 +ov13_0222E014: ; 0x0222E014 + ldr r3, _0222E074 ; =0x04001008 + ldr r1, _0222E078 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + bx lr + .balign 4, 0 +_0222E074: .word 0x04001008 +_0222E078: .word 0x0400000A + arm_func_end ov13_0222E014 + + arm_func_start ov13_0222E07C +ov13_0222E07C: ; 0x0222E07C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222E0AC ; =ov13_0222E0B0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E0AC: .word ov13_0222E0B0 + arm_func_end ov13_0222E07C + + arm_func_start ov13_0222E0B0 +ov13_0222E0B0: ; 0x0222E0B0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #4 + bl ov13_022279B4 + ldr r0, _0222E0E8 ; =ov13_0222E0EC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E0E8: .word ov13_0222E0EC + arm_func_end ov13_0222E0B0 + + arm_func_start ov13_0222E0EC +ov13_0222E0EC: ; 0x0222E0EC + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222E110 ; =ov13_0222E114 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E110: .word ov13_0222E114 + arm_func_end ov13_0222E0EC + + arm_func_start ov13_0222E114 +ov13_0222E114: ; 0x0222E114 + stmdb sp!, {r3, lr} + bl ov13_0222E128 + bl ov13_0222E148 + bl ov13_0222E14C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E114 + + arm_func_start ov13_0222E128 +ov13_0222E128: ; 0x0222E128 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E128 + + arm_func_start ov13_0222E148 +ov13_0222E148: ; 0x0222E148 + bx lr + arm_func_end ov13_0222E148 + + arm_func_start ov13_0222E14C +ov13_0222E14C: ; 0x0222E14C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0222E170 ; =ov13_0222E174 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E170: .word ov13_0222E174 + arm_func_end ov13_0222E14C + + arm_func_start ov13_0222E174 +ov13_0222E174: ; 0x0222E174 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222E190 ; =ov13_0222E194 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E190: .word ov13_0222E194 + arm_func_end ov13_0222E174 + + arm_func_start ov13_0222E194 +ov13_0222E194: ; 0x0222E194 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222E1CC ; =ov13_0222E1D0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E1CC: .word ov13_0222E1D0 + arm_func_end ov13_0222E194 + + arm_func_start ov13_0222E1D0 +ov13_0222E1D0: ; 0x0222E1D0 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222E21C ; =ov13_0222EEB4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E21C: .word ov13_0222EEB4 + arm_func_end ov13_0222E1D0 + + arm_func_start ov13_0222E220 +ov13_0222E220: ; 0x0222E220 + stmdb sp!, {r3, lr} + ldr r0, _0222E260 ; =ov13_0224F518 + mov r1, #0 + strb r1, [r0] + bl ov13_0222E268 + mov r0, #0x13 + bl ov13_02227DE4 + mov r0, #0x3c + sub r1, r0, #0x3d + mov r2, #0 + bl ov13_022277B8 + mov r0, #0x1b + bl ov13_022279EC + ldr r0, _0222E264 ; =ov13_0222E2E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E260: .word ov13_0224F518 +_0222E264: .word ov13_0222E2E8 + arm_func_end ov13_0222E220 + + arm_func_start ov13_0222E268 +ov13_0222E268: ; 0x0222E268 + stmdb sp!, {r3, lr} + ldr r0, _0222E2D8 ; =ov13_0224629C + ldr r1, _0222E2DC ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222E2E0 ; =0x04001008 + ldr r1, _0222E2E4 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E2D8: .word ov13_0224629C +_0222E2DC: .word GX_LoadBG2Scr +_0222E2E0: .word 0x04001008 +_0222E2E4: .word 0x0400000A + arm_func_end ov13_0222E268 + + arm_func_start ov13_0222E2E8 +ov13_0222E2E8: ; 0x0222E2E8 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222E338 ; =ov13_0222E33C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E338: .word ov13_0222E33C + arm_func_end ov13_0222E2E8 + + arm_func_start ov13_0222E33C +ov13_0222E33C: ; 0x0222E33C + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + bl ov13_022279B4 + ldr r0, _0222E364 ; =ov13_0222E368 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E364: .word ov13_0222E368 + arm_func_end ov13_0222E33C + + arm_func_start ov13_0222E368 +ov13_0222E368: ; 0x0222E368 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222E38C ; =ov13_0222E390 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E38C: .word ov13_0222E390 + arm_func_end ov13_0222E368 + + arm_func_start ov13_0222E390 +ov13_0222E390: ; 0x0222E390 + stmdb sp!, {r3, lr} + bl ov13_0222E3A4 + bl ov13_0222E3DC + bl ov13_0222E3E0 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E390 + + arm_func_start ov13_0222E3A4 +ov13_0222E3A4: ; 0x0222E3A4 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222E3C0 + mov r0, #1 + bl ov13_0222726C +_0222E3C0: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E3A4 + + arm_func_start ov13_0222E3DC +ov13_0222E3DC: ; 0x0222E3DC + bx lr + arm_func_end ov13_0222E3DC + + arm_func_start ov13_0222E3E0 +ov13_0222E3E0: ; 0x0222E3E0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _0222E3FC + cmp r0, #1 + beq _0222E408 + ldmia sp!, {r3, pc} +_0222E3FC: + mov r0, #7 + bl ov13_0223ABB8 + b _0222E41C +_0222E408: + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0222E428 ; =ov13_0224F518 + mov r1, #1 + strb r1, [r0] +_0222E41C: + ldr r0, _0222E42C ; =ov13_0222E430 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E428: .word ov13_0224F518 +_0222E42C: .word ov13_0222E430 + arm_func_end ov13_0222E3E0 + + arm_func_start ov13_0222E430 +ov13_0222E430: ; 0x0222E430 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222E44C ; =ov13_0222E450 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E44C: .word ov13_0222E450 + arm_func_end ov13_0222E430 + + arm_func_start ov13_0222E450 +ov13_0222E450: ; 0x0222E450 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _0222E4AC ; =ov13_0224F518 + ldrb r0, [r0] + cmp r0, #0 + bne _0222E48C + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222E48C: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222E4B0 ; =ov13_0222E4B4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E4AC: .word ov13_0224F518 +_0222E4B0: .word ov13_0222E4B4 + arm_func_end ov13_0222E450 + + arm_func_start ov13_0222E4B4 +ov13_0222E4B4: ; 0x0222E4B4 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222E560 ; =ov13_0224F518 + ldrb r0, [r0] + cmp r0, #0 + bne _0222E4E8 + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_0222E4E8: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0222E560 ; =ov13_0224F518 + ldrb r0, [r0] + cmp r0, #0 + bne _0222E51C + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222E51C: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222E560 ; =ov13_0224F518 + mov r1, #1 + ldrb r0, [r0] + cmp r0, #0 + mov r0, #0 + bne _0222E550 + bl ov13_0222B8F8 + ldr r0, _0222E564 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222E550: + bl ov13_0222B8F8 + ldr r0, _0222E568 ; =ov13_0222DFF4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E560: .word ov13_0224F518 +_0222E564: .word ov13_0222D454 +_0222E568: .word ov13_0222DFF4 + arm_func_end ov13_0222E4B4 + + arm_func_start ov13_0222E56C +ov13_0222E56C: ; 0x0222E56C + stmdb sp!, {r3, lr} + ldr r0, _0222E594 ; =ov13_0224F51C + mov r1, #0 + strb r1, [r0] + bl ov13_0222E59C + mov r0, #0x21 + bl ov13_022279EC + ldr r0, _0222E598 ; =ov13_0222E608 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E594: .word ov13_0224F51C +_0222E598: .word ov13_0222E608 + arm_func_end ov13_0222E56C + + arm_func_start ov13_0222E59C +ov13_0222E59C: ; 0x0222E59C + stmdb sp!, {r3, lr} + ldr r0, _0222E5F8 ; =ov13_022462B0 + ldr r1, _0222E5FC ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r2, _0222E600 ; =0x04001008 + ldr r1, _0222E604 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E5F8: .word ov13_022462B0 +_0222E5FC: .word GX_LoadBG2Scr +_0222E600: .word 0x04001008 +_0222E604: .word 0x0400000A + arm_func_end ov13_0222E59C + + arm_func_start ov13_0222E608 +ov13_0222E608: ; 0x0222E608 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222E638 ; =ov13_0222E63C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E638: .word ov13_0222E63C + arm_func_end ov13_0222E608 + + arm_func_start ov13_0222E63C +ov13_0222E63C: ; 0x0222E63C + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _0222E668 ; =ov13_0222E66C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E668: .word ov13_0222E66C + arm_func_end ov13_0222E63C + + arm_func_start ov13_0222E66C +ov13_0222E66C: ; 0x0222E66C + stmdb sp!, {r3, lr} + bl ov13_0222E720 + bl ov13_0222E67C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E66C + + arm_func_start ov13_0222E67C +ov13_0222E67C: ; 0x0222E67C + bx lr + arm_func_end ov13_0222E67C + + arm_func_start ov13_0222E680 +ov13_0222E680: ; 0x0222E680 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222E6B8 ; =ov13_0222E6BC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E6B8: .word ov13_0222E6BC + arm_func_end ov13_0222E680 + + arm_func_start ov13_0222E6BC +ov13_0222E6BC: ; 0x0222E6BC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222E71C ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E71C: .word ov13_0222D454 + arm_func_end ov13_0222E6BC + + arm_func_start ov13_0222E720 +ov13_0222E720: ; 0x0222E720 + stmdb sp!, {r3, lr} + ldr r0, _0222E74C ; =ov13_0224F51C + ldrb r1, [r0] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0] + cmp r1, #0x78 + ldmloia sp!, {r3, pc} + ldr r0, _0222E750 ; =ov13_0222E680 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E74C: .word ov13_0224F51C +_0222E750: .word ov13_0222E680 + arm_func_end ov13_0222E720 + + arm_func_start ov13_0222E754 +ov13_0222E754: ; 0x0222E754 + stmdb sp!, {r3, lr} + bl ov13_0222E790 + mov r0, #0x20 + bl ov13_022279EC + mov r0, #0x3c + sub r1, r0, #0x3d + mov r2, #0 + bl ov13_022277B8 + ldr r1, _0222E788 ; =ov13_0224F520 + strb r0, [r1] + ldr r0, _0222E78C ; =ov13_0222E810 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E788: .word ov13_0224F520 +_0222E78C: .word ov13_0222E810 + arm_func_end ov13_0222E754 + + arm_func_start ov13_0222E790 +ov13_0222E790: ; 0x0222E790 + stmdb sp!, {r3, lr} + ldr r0, _0222E800 ; =ov13_022462C4 + ldr r1, _0222E804 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222E808 ; =0x04001008 + ldr r1, _0222E80C ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E800: .word ov13_022462C4 +_0222E804: .word GX_LoadBG2Scr +_0222E808: .word 0x04001008 +_0222E80C: .word 0x0400000A + arm_func_end ov13_0222E790 + + arm_func_start ov13_0222E810 +ov13_0222E810: ; 0x0222E810 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222E870 ; =ov13_0224F520 + ldrb r0, [r0] + cmp r0, #0 + beq _0222E864 + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 +_0222E864: + ldr r0, _0222E874 ; =ov13_0222E878 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E870: .word ov13_0224F520 +_0222E874: .word ov13_0222E878 + arm_func_end ov13_0222E810 + + arm_func_start ov13_0222E878 +ov13_0222E878: ; 0x0222E878 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + bl ov13_022279B4 + ldr r0, _0222E8B0 ; =ov13_0222E8B4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E8B0: .word ov13_0222E8B4 + arm_func_end ov13_0222E878 + + arm_func_start ov13_0222E8B4 +ov13_0222E8B4: ; 0x0222E8B4 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222E8E4 ; =ov13_0222E8E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E8E4: .word ov13_0222E8E8 + arm_func_end ov13_0222E8B4 + + arm_func_start ov13_0222E8E8 +ov13_0222E8E8: ; 0x0222E8E8 + stmdb sp!, {r3, lr} + bl ov13_0222E8FC + bl ov13_0222E934 + bl ov13_0222E938 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E8E8 + + arm_func_start ov13_0222E8FC +ov13_0222E8FC: ; 0x0222E8FC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0222E918 + mov r0, #1 + bl ov13_0222726C +_0222E918: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222E8FC + + arm_func_start ov13_0222E934 +ov13_0222E934: ; 0x0222E934 + bx lr + arm_func_end ov13_0222E934 + + arm_func_start ov13_0222E938 +ov13_0222E938: ; 0x0222E938 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _0222E968 + cmp r0, #1 + ldmneia sp!, {r3, pc} + ldr r1, _0222E988 ; =ov13_0224F520 + mov r2, #1 + mov r0, #6 + strb r2, [r1, #1] + bl ov13_0223ABB8 + b _0222E97C +_0222E968: + ldr r1, _0222E988 ; =ov13_0224F520 + mov r2, #0 + mov r0, #7 + strb r2, [r1, #1] + bl ov13_0223ABB8 +_0222E97C: + ldr r0, _0222E98C ; =ov13_0222E990 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E988: .word ov13_0224F520 +_0222E98C: .word ov13_0222E990 + arm_func_end ov13_0222E938 + + arm_func_start ov13_0222E990 +ov13_0222E990: ; 0x0222E990 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222E9AC ; =ov13_0222E9B0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222E9AC: .word ov13_0222E9B0 + arm_func_end ov13_0222E990 + + arm_func_start ov13_0222E9B0 +ov13_0222E9B0: ; 0x0222E9B0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _0222EA0C ; =ov13_0224F520 + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222E9EC + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222E9EC: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222EA10 ; =ov13_0222EA14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EA0C: .word ov13_0224F520 +_0222EA10: .word ov13_0222EA14 + arm_func_end ov13_0222E9B0 + + arm_func_start ov13_0222EA14 +ov13_0222EA14: ; 0x0222EA14 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0222EAB0 ; =ov13_0224F520 + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222EA6C + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222EA6C: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222EAB0 ; =ov13_0224F520 + mov r1, #1 + ldrb r0, [r0, #1] + cmp r0, #0 + mov r0, #0 + bne _0222EAA0 + bl ov13_0222B8F8 + ldr r0, _0222EAB4 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222EAA0: + bl ov13_0222B8F8 + ldr r0, _0222EAB8 ; =ov13_0222EEB4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EAB0: .word ov13_0224F520 +_0222EAB4: .word ov13_0222D454 +_0222EAB8: .word ov13_0222EEB4 + arm_func_end ov13_0222EA14 + + arm_func_start ov13_0222EABC +ov13_0222EABC: ; 0x0222EABC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + bl ov13_0222BCA8 + mov r5, r0 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + ldr r1, _0222EB80 ; =ov13_0224F524 + mov r2, #0 + strb r2, [r1, #1] + mov r4, r0 + strb r2, [r1] + bl ov13_0222EB8C + mov r0, #0 + add r1, sp, #0x10 + mov r2, #0x16 + bl MIi_CpuClear16 + ldrb r2, [r5, #1] + add r0, r5, #2 + add r1, sp, #0x10 + mov r2, r2, lsl #1 + bl MIi_CpuCopy16 + mov r0, #0x1c + str r0, [sp] + mov r0, #2 + str r0, [sp, #4] + mov r0, #0x480 + str r0, [sp, #8] + add r1, sp, #0x10 + str r1, [sp, #0xc] + mov r0, r4 + mov r1, #8 + mov r2, #0x35 + mov r3, #0xf0 + bl ov13_02240CC0 + mov r0, r4 + bl ov13_02240E2C + ldr r0, _0222EB84 ; =ov13_0222EE80 + bl ov13_0222BC84 + mov r1, #4 + mov r2, #0 + mov r0, #0x1d + sub r3, r1, #5 + str r2, [sp] + bl ov13_0223BE6C + ldr r0, _0222EB88 ; =ov13_0222EC0C + bl ov13_0222B8E8 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222EB80: .word ov13_0224F524 +_0222EB84: .word ov13_0222EE80 +_0222EB88: .word ov13_0222EC0C + arm_func_end ov13_0222EABC + + arm_func_start ov13_0222EB8C +ov13_0222EB8C: ; 0x0222EB8C + stmdb sp!, {r3, lr} + ldr r0, _0222EBFC ; =ov13_022462D8 + ldr r1, _0222EC00 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222EC04 ; =0x04001008 + ldr r1, _0222EC08 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EBFC: .word ov13_022462D8 +_0222EC00: .word GX_LoadBG2Scr +_0222EC04: .word 0x04001008 +_0222EC08: .word 0x0400000A + arm_func_end ov13_0222EB8C + + arm_func_start ov13_0222EC0C +ov13_0222EC0C: ; 0x0222EC0C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222EC3C ; =ov13_0222EC40 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EC3C: .word ov13_0222EC40 + arm_func_end ov13_0222EC0C + + arm_func_start ov13_0222EC40 +ov13_0222EC40: ; 0x0222EC40 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222EC60 ; =ov13_0222EC64 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EC60: .word ov13_0222EC64 + arm_func_end ov13_0222EC40 + + arm_func_start ov13_0222EC64 +ov13_0222EC64: ; 0x0222EC64 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + ldr r0, _0222EC84 ; =ov13_0222EC88 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EC84: .word ov13_0222EC88 + arm_func_end ov13_0222EC64 + + arm_func_start ov13_0222EC88 +ov13_0222EC88: ; 0x0222EC88 + stmdb sp!, {r3, lr} + bl ov13_0222ECF8 + bl ov13_0222ECFC + bl ov13_0223C1DC + cmp r0, #0 + beq _0222ECAC + cmp r0, #1 + beq _0222ECC4 + ldmia sp!, {r3, pc} +_0222ECAC: + ldr r1, _0222ECF0 ; =ov13_0224F524 + mov r2, #0 + mov r0, #7 + strb r2, [r1, #1] + bl ov13_0223ABB8 + b _0222ECD8 +_0222ECC4: + ldr r1, _0222ECF0 ; =ov13_0224F524 + mov r2, #1 + mov r0, #0xe + strb r2, [r1, #1] + bl ov13_0223ABB8 +_0222ECD8: + mov r0, #0 + bl ov13_0222BC84 + bl ov13_0223C198 + ldr r0, _0222ECF4 ; =ov13_0222ED00 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222ECF0: .word ov13_0224F524 +_0222ECF4: .word ov13_0222ED00 + arm_func_end ov13_0222EC88 + + arm_func_start ov13_0222ECF8 +ov13_0222ECF8: ; 0x0222ECF8 + bx lr + arm_func_end ov13_0222ECF8 + + arm_func_start ov13_0222ECFC +ov13_0222ECFC: ; 0x0222ECFC + bx lr + arm_func_end ov13_0222ECFC + + arm_func_start ov13_0222ED00 +ov13_0222ED00: ; 0x0222ED00 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222ED54 ; =ov13_0224F524 + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222ED34 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222ED34: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222ED58 ; =ov13_0222ED5C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222ED54: .word ov13_0224F524 +_0222ED58: .word ov13_0222ED5C + arm_func_end ov13_0222ED00 + + arm_func_start ov13_0222ED5C +ov13_0222ED5C: ; 0x0222ED5C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222EDB0 ; =ov13_0224F524 + ldrb r1, [r0] + cmp r1, #0 + ldreqb r0, [r0, #1] + cmpeq r0, #1 + bne _0222EDA0 + bl ov13_0222BC9C + b _0222EDA4 +_0222EDA0: + bl ov13_0222BC0C +_0222EDA4: + ldr r0, _0222EDB4 ; =ov13_0222EDB8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EDB0: .word ov13_0224F524 +_0222EDB4: .word ov13_0222EDB8 + arm_func_end ov13_0222ED5C + + arm_func_start ov13_0222EDB8 +ov13_0222EDB8: ; 0x0222EDB8 + stmdb sp!, {r3, lr} + ldr r0, _0222EE70 ; =ov13_0224F524 + ldrb r1, [r0] + cmp r1, #0 + bne _0222EDD8 + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222EDE4 +_0222EDD8: + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} +_0222EDE4: + mov r0, #0 + bl ov13_02240B04 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222EE70 ; =ov13_0224F524 + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222EE18 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222EE18: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222EE70 ; =ov13_0224F524 + ldrb r1, [r0] + cmp r1, #0 + beq _0222EE40 + ldr r0, _0222EE74 ; =ov13_0222E754 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222EE40: + ldrb r0, [r0, #1] + cmp r0, #0 + bne _0222EE64 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + ldr r0, _0222EE78 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222EE64: + ldr r0, _0222EE7C ; =ov13_0222DB6C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EE70: .word ov13_0224F524 +_0222EE74: .word ov13_0222E754 +_0222EE78: .word ov13_0222D454 +_0222EE7C: .word ov13_0222DB6C + arm_func_end ov13_0222EDB8 + + arm_func_start ov13_0222EE80 +ov13_0222EE80: ; 0x0222EE80 + ldr r0, _0222EE90 ; =ov13_0224F524 + mov r1, #1 + strb r1, [r0] + bx lr + .balign 4, 0 +_0222EE90: .word ov13_0224F524 + arm_func_end ov13_0222EE80 + + arm_func_start ov13_0222EE94 +ov13_0222EE94: ; 0x0222EE94 + ldr r0, _0222EEB0 ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0222EEB0: .word 0x027FFFA8 + arm_func_end ov13_0222EE94 + + arm_func_start ov13_0222EEB4 +ov13_0222EEB4: ; 0x0222EEB4 + stmdb sp!, {r3, lr} + ldr r0, _0222EEF4 ; =ov13_0222F230 + bl ov13_0222BB20 + ldr r0, _0222EEF8 ; =ov13_0224F528 + mov r1, #0 + strb r1, [r0] + bl ov13_0222EF00 + mov r0, #0x1c + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + mov r0, #0xb + bl ov13_0223ABB8 + ldr r0, _0222EEFC ; =ov13_0222EF80 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EEF4: .word ov13_0222F230 +_0222EEF8: .word ov13_0224F528 +_0222EEFC: .word ov13_0222EF80 + arm_func_end ov13_0222EEB4 + + arm_func_start ov13_0222EF00 +ov13_0222EF00: ; 0x0222EF00 + stmdb sp!, {r3, lr} + ldr r0, _0222EF70 ; =ov13_022462EC + ldr r1, _0222EF74 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222EF78 ; =0x04001008 + ldr r1, _0222EF7C ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EF70: .word ov13_022462EC +_0222EF74: .word GX_LoadBG2Scr +_0222EF78: .word 0x04001008 +_0222EF7C: .word 0x0400000A + arm_func_end ov13_0222EF00 + + arm_func_start ov13_0222EF80 +ov13_0222EF80: ; 0x0222EF80 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222EFB0 ; =ov13_0222EFB4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EFB0: .word ov13_0222EFB4 + arm_func_end ov13_0222EF80 + + arm_func_start ov13_0222EFB4 +ov13_0222EFB4: ; 0x0222EFB4 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_022279B4 + ldr r0, _0222EFDC ; =ov13_0222EFE0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222EFDC: .word ov13_0222EFE0 + arm_func_end ov13_0222EFB4 + + arm_func_start ov13_0222EFE0 +ov13_0222EFE0: ; 0x0222EFE0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + ldr r0, _0222F000 ; =ov13_0222F004 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F000: .word ov13_0222F004 + arm_func_end ov13_0222EFE0 + + arm_func_start ov13_0222F004 +ov13_0222F004: ; 0x0222F004 + stmdb sp!, {r3, lr} + bl ov13_0222F018 + bl ov13_0222F050 + bl ov13_0222F054 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222F004 + + arm_func_start ov13_0222F018 +ov13_0222F018: ; 0x0222F018 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _0222F038 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_0222F038: + bl ov13_0222EE94 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222F018 + + arm_func_start ov13_0222F050 +ov13_0222F050: ; 0x0222F050 + bx lr + arm_func_end ov13_0222F050 + + arm_func_start ov13_0222F054 +ov13_0222F054: ; 0x0222F054 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _0222F07C ; =ov13_0222F080 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F07C: .word ov13_0222F080 + arm_func_end ov13_0222F054 + + arm_func_start ov13_0222F080 +ov13_0222F080: ; 0x0222F080 + stmdb sp!, {r3, lr} + ldr r0, _0222F0B0 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F098 + bl ov13_0222BC0C +_0222F098: + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222F0B4 ; =ov13_0222F0B8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F0B0: .word ov13_0224F528 +_0222F0B4: .word ov13_0222F0B8 + arm_func_end ov13_0222F080 + + arm_func_start ov13_0222F0B8 +ov13_0222F0B8: ; 0x0222F0B8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F130 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F0E8 + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} +_0222F0E8: + bl ov13_02227228 + ldr r0, _0222F130 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F110 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222F110: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222F134 ; =ov13_0222F138 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F130: .word ov13_0224F528 +_0222F134: .word ov13_0222F138 + arm_func_end ov13_0222F0B8 + + arm_func_start ov13_0222F138 +ov13_0222F138: ; 0x0222F138 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F220 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F16C + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_0222F16C: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _0222F220 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F194 + bl ov13_0222BC68 + cmp r0, #0 + ldmeqia sp!, {r3, pc} +_0222F194: + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0222F220 ; =ov13_0224F528 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F1C0 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222F1C0: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222F220 ; =ov13_0224F528 + mov r1, #1 + ldrb r0, [r0] + cmp r0, #0 + bne _0222F1F4 + mov r0, #0 + bl ov13_0222B8F8 + ldr r0, _0222F224 ; =ov13_0222D454 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222F1F4: + cmp r0, #2 + mov r0, #0 + bne _0222F210 + bl ov13_0222B8F8 + ldr r0, _0222F228 ; =ov13_0222E754 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222F210: + bl ov13_0222B8F8 + ldr r0, _0222F22C ; =ov13_0222EABC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F220: .word ov13_0224F528 +_0222F224: .word ov13_0222D454 +_0222F228: .word ov13_0222E754 +_0222F22C: .word ov13_0222EABC + arm_func_end ov13_0222F138 + + arm_func_start ov13_0222F230 +ov13_0222F230: ; 0x0222F230 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_0223AC20 + cmp r4, #0 + bne _0222F25C + ldr r1, _0222F284 ; =ov13_0224F528 + mov r2, #1 + mov r0, #0x10 + strb r2, [r1] + bl ov13_0223ABB8 + b _0222F270 +_0222F25C: + ldr r1, _0222F284 ; =ov13_0224F528 + mov r2, #2 + mov r0, #0x12 + strb r2, [r1] + bl ov13_0223ABB8 +_0222F270: + mov r0, #0 + bl ov13_0222BC84 + ldr r0, _0222F288 ; =ov13_0222F080 + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222F284: .word ov13_0224F528 +_0222F288: .word ov13_0222F080 + arm_func_end ov13_0222F230 + + arm_func_start ov13_0222F28C +ov13_0222F28C: ; 0x0222F28C + ldr r0, _0222F2A8 ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0222F2A8: .word 0x027FFFA8 + arm_func_end ov13_0222F28C + + arm_func_start ov13_0222F2AC +ov13_0222F2AC: ; 0x0222F2AC + stmdb sp!, {r3, lr} + ldr r0, _0222F304 ; =ov13_0224F52C + mov r1, #0 + strh r1, [r0, #2] + bl ov13_0222F30C + bl ov13_02227E40 + mov r0, #0x36 + sub r1, r0, #0x37 + mov r2, #0 + bl ov13_022277B8 + mov r0, #2 + bl ov13_02227964 + mov r0, #0x22 + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + bl ov13_0222B254 + mov r0, #0xb + bl ov13_0223ABB8 + ldr r0, _0222F308 ; =ov13_0222F3B4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F304: .word ov13_0224F52C +_0222F308: .word ov13_0222F3B4 + arm_func_end ov13_0222F2AC + + arm_func_start ov13_0222F30C +ov13_0222F30C: ; 0x0222F30C + stmdb sp!, {r3, lr} + ldr r0, _0222F394 ; =ov13_02246300 + ldr r1, _0222F398 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0222F39C ; =ov13_02246318 + ldr r1, _0222F3A0 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _0222F3A4 ; =ov13_02246330 + ldr r1, _0222F3A8 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0222F3AC ; =0x04001008 + ldr r1, _0222F3B0 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F394: .word ov13_02246300 +_0222F398: .word GX_LoadBG2Char +_0222F39C: .word ov13_02246318 +_0222F3A0: .word GX_LoadBGPltt +_0222F3A4: .word ov13_02246330 +_0222F3A8: .word GX_LoadBG2Scr +_0222F3AC: .word 0x04001008 +_0222F3B0: .word 0x0400000A + arm_func_end ov13_0222F30C + + arm_func_start ov13_0222F3B4 +ov13_0222F3B4: ; 0x0222F3B4 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222F404 ; =ov13_0222F408 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F404: .word ov13_0222F408 + arm_func_end ov13_0222F3B4 + + arm_func_start ov13_0222F408 +ov13_0222F408: ; 0x0222F408 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_022279B4 + ldr r0, _0222F440 ; =ov13_0222F444 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F440: .word ov13_0222F444 + arm_func_end ov13_0222F408 + + arm_func_start ov13_0222F444 +ov13_0222F444: ; 0x0222F444 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + ldr r1, _0222F480 ; =ov13_0222F764 + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0222F484 ; =ov13_0224F52C + str r0, [r1, #4] + ldr r0, _0222F488 ; =ov13_0222F48C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F480: .word ov13_0222F764 +_0222F484: .word ov13_0224F52C +_0222F488: .word ov13_0222F48C + arm_func_end ov13_0222F444 + + arm_func_start ov13_0222F48C +ov13_0222F48C: ; 0x0222F48C + stmdb sp!, {r3, lr} + bl ov13_0222F560 + bl ov13_0222F598 + bl ov13_0222F59C + bl ov13_0222B3B4 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + cmp r0, #1 + beq _0222F4BC + cmp r0, #2 + beq _0222F4F0 + ldmia sp!, {r3, pc} +_0222F4BC: + ldr r2, _0222F554 ; =ov13_0224F52C + ldr r1, [r2, #4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #1 + strb r0, [r2] + bl ov13_022425F0 + ldr r1, _0222F554 ; =ov13_0224F52C + mov r2, #0 + ldr r0, _0222F558 ; =ov13_0222F7CC + str r2, [r1, #4] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222F4F0: + ldr r0, _0222F554 ; =ov13_0224F52C + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_0223AC20 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xc + str ip, [sp] + bl ov13_0223BE6C + mov r0, #9 + bl ov13_0223ABB8 + bl ov13_022272E4 + ldr r1, _0222F554 ; =ov13_0224F52C + mov r0, #1 + ldr r1, [r1, #4] + bl ov13_022425F0 + ldr r1, _0222F554 ; =ov13_0224F52C + mov r2, #0 + ldr r0, _0222F55C ; =ov13_0222F780 + str r2, [r1, #4] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F554: .word ov13_0224F52C +_0222F558: .word ov13_0222F7CC +_0222F55C: .word ov13_0222F780 + arm_func_end ov13_0222F48C + + arm_func_start ov13_0222F560 +ov13_0222F560: ; 0x0222F560 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _0222F580 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_0222F580: + bl ov13_0222F28C + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222F560 + + arm_func_start ov13_0222F598 +ov13_0222F598: ; 0x0222F598 + bx lr + arm_func_end ov13_0222F598 + + arm_func_start ov13_0222F59C +ov13_0222F59C: ; 0x0222F59C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F5E0 ; =ov13_0224F52C + ldr r1, [r0, #4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #1 + bl ov13_022425D0 + ldr r0, _0222F5E0 ; =ov13_0224F52C + mov r1, #0 + str r1, [r0, #4] + bl ov13_022272E4 + ldr r0, _0222F5E4 ; =ov13_0222F818 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F5E0: .word ov13_0224F52C +_0222F5E4: .word ov13_0222F818 + arm_func_end ov13_0222F59C + + arm_func_start ov13_0222F5E8 +ov13_0222F5E8: ; 0x0222F5E8 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + ldr r0, _0222F61C ; =ov13_0224F52C + ldr r1, [r0, #4] + cmp r1, #0 + beq _0222F608 + mov r0, #1 + bl ov13_022425F0 +_0222F608: + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0222F620 ; =ov13_0222F624 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F61C: .word ov13_0224F52C +_0222F620: .word ov13_0222F624 + arm_func_end ov13_0222F5E8 + + arm_func_start ov13_0222F624 +ov13_0222F624: ; 0x0222F624 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _0222F680 ; =ov13_0224F52C + ldrb r0, [r0] + cmp r0, #0 + bne _0222F660 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_0222F660: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222F684 ; =ov13_0222F688 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F680: .word ov13_0224F52C +_0222F684: .word ov13_0222F688 + arm_func_end ov13_0222F624 + + arm_func_start ov13_0222F688 +ov13_0222F688: ; 0x0222F688 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F758 ; =ov13_0224F52C + ldrb r0, [r0] + cmp r0, #0 + bne _0222F6BC + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_0222F6BC: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _0222F758 ; =ov13_0224F52C + ldrb r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bl ov13_0222B364 + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0222F758 ; =ov13_0224F52C + ldrb r0, [r0] + cmp r0, #0 + bne _0222F70C + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_0222F70C: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0222F758 ; =ov13_0224F52C + ldrb r0, [r0] + cmp r0, #0 + bne _0222F740 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0222F75C ; =ov13_02237618 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0222F740: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _0222F760 ; =ov13_0222F848 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F758: .word ov13_0224F52C +_0222F75C: .word ov13_02237618 +_0222F760: .word ov13_0222F848 + arm_func_end ov13_0222F688 + + arm_func_start ov13_0222F764 +ov13_0222F764: ; 0x0222F764 + stmdb sp!, {r3, lr} + bl ov13_022413E4 + mov r0, #0 + bl ov13_02242478 + bl ov13_0222F560 + bl ov13_0222F59C + ldmia sp!, {r3, pc} + arm_func_end ov13_0222F764 + + arm_func_start ov13_0222F780 +ov13_0222F780: ; 0x0222F780 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _0222F7A8 ; =ov13_0222F7AC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F7A8: .word ov13_0222F7AC + arm_func_end ov13_0222F780 + + arm_func_start ov13_0222F7AC +ov13_0222F7AC: ; 0x0222F7AC + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F7C8 ; =ov13_0222F5E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F7C8: .word ov13_0222F5E8 + arm_func_end ov13_0222F7AC + + arm_func_start ov13_0222F7CC +ov13_0222F7CC: ; 0x0222F7CC + stmdb sp!, {r3, lr} + bl ov13_0222F560 + bl ov13_0222F598 + bl ov13_0222F59C + ldr r1, _0222F80C ; =ov13_0224F52C + ldr r0, _0222F810 ; =0x00000438 + ldrh r2, [r1, #2] + add r2, r2, #1 + strh r2, [r1, #2] + ldrh r1, [r1, #2] + cmp r1, r0 + ldmloia sp!, {r3, pc} + bl ov13_0223AC20 + ldr r0, _0222F814 ; =ov13_0222F5E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F80C: .word ov13_0224F52C +_0222F810: .word 0x00000438 +_0222F814: .word ov13_0222F5E8 + arm_func_end ov13_0222F7CC + + arm_func_start ov13_0222F818 +ov13_0222F818: ; 0x0222F818 + stmdb sp!, {r3, lr} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r1, _0222F840 ; =ov13_0224F52C + mov r2, #0 + ldr r0, _0222F844 ; =ov13_0222F5E8 + strb r2, [r1] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F840: .word ov13_0224F52C +_0222F844: .word ov13_0222F5E8 + arm_func_end ov13_0222F818 + + arm_func_start ov13_0222F848 +ov13_0222F848: ; 0x0222F848 + stmdb sp!, {r3, lr} + ldr r0, _0222F87C ; =ov13_0224F534 + mov r1, #0 + strb r1, [r0] + bl ov13_0222F884 + bl ov13_02227E40 + mov r0, #0x23 + bl ov13_022279EC + mov r0, #0x10 + bl ov13_0223ABB8 + ldr r0, _0222F880 ; =ov13_0222F8F0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F87C: .word ov13_0224F534 +_0222F880: .word ov13_0222F8F0 + arm_func_end ov13_0222F848 + + arm_func_start ov13_0222F884 +ov13_0222F884: ; 0x0222F884 + stmdb sp!, {r3, lr} + ldr r0, _0222F8E0 ; =ov13_02246344 + ldr r1, _0222F8E4 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r2, _0222F8E8 ; =0x04001008 + ldr r1, _0222F8EC ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F8E0: .word ov13_02246344 +_0222F8E4: .word GX_LoadBG2Scr +_0222F8E8: .word 0x04001008 +_0222F8EC: .word 0x0400000A + arm_func_end ov13_0222F884 + + arm_func_start ov13_0222F8F0 +ov13_0222F8F0: ; 0x0222F8F0 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _0222F920 ; =ov13_0222F924 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F920: .word ov13_0222F924 + arm_func_end ov13_0222F8F0 + + arm_func_start ov13_0222F924 +ov13_0222F924: ; 0x0222F924 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0222F944 ; =ov13_0222F948 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F944: .word ov13_0222F948 + arm_func_end ov13_0222F924 + + arm_func_start ov13_0222F948 +ov13_0222F948: ; 0x0222F948 + stmdb sp!, {r3, lr} + bl ov13_0222FA08 + bl ov13_0222F958 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222F948 + + arm_func_start ov13_0222F958 +ov13_0222F958: ; 0x0222F958 + bx lr + arm_func_end ov13_0222F958 + + arm_func_start ov13_0222F95C +ov13_0222F95C: ; 0x0222F95C + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0222F994 ; =ov13_0222F998 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222F994: .word ov13_0222F998 + arm_func_end ov13_0222F95C + + arm_func_start ov13_0222F998 +ov13_0222F998: ; 0x0222F998 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, #1 + bl ov13_0222B934 + ldr r0, _0222FA04 ; =ov13_02238440 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FA04: .word ov13_02238440 + arm_func_end ov13_0222F998 + + arm_func_start ov13_0222FA08 +ov13_0222FA08: ; 0x0222FA08 + stmdb sp!, {r3, lr} + ldr r0, _0222FA34 ; =ov13_0224F534 + ldrb r1, [r0] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0] + cmp r1, #0x78 + ldmloia sp!, {r3, pc} + ldr r0, _0222FA38 ; =ov13_0222F95C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FA34: .word ov13_0224F534 +_0222FA38: .word ov13_0222F95C + arm_func_end ov13_0222FA08 + + arm_func_start ov13_0222FA3C +ov13_0222FA3C: ; 0x0222FA3C + stmdb sp!, {r3, lr} + mov r0, #0x5c + mov r1, #4 + bl ov13_0224128C + ldr r2, _0222FB08 ; =ov13_0224F538 + mov r1, #0 + str r0, [r2, #4] + add r0, sp, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + bne _0222FA7C + ldr r0, _0222FB08 ; =ov13_0224F538 + mov r1, #0 + strb r1, [r0] + strh r1, [r0, #2] +_0222FA7C: + ldr r0, _0222FB08 ; =ov13_0224F538 + ldr r0, [r0, #4] + bl ov13_02239D04 + ldr r1, _0222FB08 ; =ov13_0224F538 + ldr r1, [r1, #4] + strb r0, [r1, #0x51] + bl ov13_0222FB14 + bl ov13_02227E40 + mov r0, #0x34 + sub r1, r0, #0x35 + mov r2, #0 + bl ov13_022277B8 + mov r0, #2 + bl ov13_02227964 + bl ov13_0222FC68 + bl ov13_0222FD10 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + ldr r2, _0222FB08 ; =ov13_0224F538 + ldr r1, _0222FB0C ; =ov13_02230C68 + ldr r3, [r2, #4] + mov r2, #0 + str r0, [r3, #0xc] + mov r0, #1 + mov r3, #0x6e + bl ov13_02242528 + ldr r1, _0222FB08 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x3c] + bl ov13_022307AC + bl ov13_02230CC4 + ldr r0, _0222FB10 ; =ov13_0222FE84 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FB08: .word ov13_0224F538 +_0222FB0C: .word ov13_02230C68 +_0222FB10: .word ov13_0222FE84 + arm_func_end ov13_0222FA3C + + arm_func_start ov13_0222FB14 +ov13_0222FB14: ; 0x0222FB14 + stmdb sp!, {r3, lr} + sub sp, sp, #0x30 + ldr r3, _0222FC4C ; =ov13_022453E3 + add lr, sp, #0x16 + mov r2, #0xc +_0222FB28: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [lr] + strb r0, [lr, #1] + add lr, lr, #2 + subs r2, r2, #1 + bne _0222FB28 + ldrb r0, [r3] + ldr ip, _0222FC50 ; =ov13_022453CD + add r3, sp, #0 + strb r0, [lr] + mov r2, #0xb +_0222FB5C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0222FB5C + ldr r0, _0222FC54 ; =ov13_02246358 + ldr r1, _0222FC58 ; =GX_LoadBG3Scr + bl ov13_02227924 + add r0, sp, #0x16 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _0222FC5C ; =ov13_0224F538 + ldr r2, [r1, #4] + str r0, [r2, #4] + ldr r0, [r1, #4] + ldr r0, [r0, #4] + bl ov13_02239228 + bl ov13_022392B4 + add r0, sp, #0 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _0222FC5C ; =ov13_0224F538 + ldr r3, _0222FC60 ; =0x04001008 + ldr r1, [r1, #4] + sub r2, r3, #0x1000 + str r0, [r1, #8] + ldrh r0, [r3] + ldr r1, _0222FC64 ; =0x0400000A + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldrh r0, [r1, #4] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r1, #4] + add sp, sp, #0x30 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FC4C: .word ov13_022453E3 +_0222FC50: .word ov13_022453CD +_0222FC54: .word ov13_02246358 +_0222FC58: .word GX_LoadBG3Scr +_0222FC5C: .word ov13_0224F538 +_0222FC60: .word 0x04001008 +_0222FC64: .word 0x0400000A + arm_func_end ov13_0222FB14 + + arm_func_start ov13_0222FC68 +ov13_0222FC68: ; 0x0222FC68 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r2, _0222FD0C ; =ov13_0224F538 + mov r1, #0x1c + ldr ip, [r2, #4] + mov r0, #0 + ldrb r3, [ip, #0x51] + sub r3, r3, #4 + mul r1, r3, r1 + strh r1, [ip, #0x40] + ldr r2, [r2, #4] + ldrb r1, [r2, #0x51] + cmp r1, #4 + movls r4, r0 + strlsb r0, [r2, #0x53] + bls _0222FCC8 + cmp r1, #8 + movhi r1, #0x37 + strhib r1, [r2, #0x53] + movhi r4, #2 + bhi _0222FCC8 + mov r1, #0x1f + strb r1, [r2, #0x53] + mov r4, #1 +_0222FCC8: + cmp r4, #0 + beq _0222FCEC + ldr r0, _0222FD0C ; =ov13_0224F538 + ldr r1, [r0, #4] + ldrh r2, [r0, #2] + ldrb r0, [r1, #0x53] + ldrh r1, [r1, #0x40] + mul r0, r2, r0 + bl FX_DivS32 +_0222FCEC: + str r0, [sp] + mov r0, r4 + mov r1, #0x55 + mov r2, #0xec + mov r3, #0x3f + bl ov13_0223943C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0222FD0C: .word ov13_0224F538 + arm_func_end ov13_0222FC68 + + arm_func_start ov13_0222FD10 +ov13_0222FD10: ; 0x0222FD10 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _0222FE74 ; =ov13_0224F538 + mov sb, #0 + ldr r0, [r0, #4] + ldrb r8, [r0, #0x51] + cmp r8, #5 + movgt r8, #5 + cmp r8, #0 + ble _0222FD84 + ldr sl, _0222FE74 ; =ov13_0224F538 + mov r7, sb + mov r6, #0x2e + mov r5, sb + mov r4, #0x18 +_0222FD48: + mov r0, r7 + mov r1, r6 + bl ov13_02240184 + ldr r2, [sl, #4] + mov r1, r4 + add r2, r2, sb, lsl #2 + str r0, [r2, #0x10] + mov r0, r5 + bl ov13_02240184 + ldr r1, [sl, #4] + add r1, r1, sb, lsl #2 + add sb, sb, #1 + str r0, [r1, #0x24] + cmp sb, r8 + blt _0222FD48 +_0222FD84: + mov r6, #0 + ldr r5, _0222FE78 ; =ov13_0224544C + ldr sb, _0222FE74 ; =ov13_0224F538 + ldr r7, _0222FE7C ; =0x000003FF + mov r4, r6 +_0222FD98: + ldr r0, [sb, #4] + ldrb r1, [r5], #1 + ldr r2, [r0, #0x10] + mov r0, r4 + bl ov13_022400F0 + ldr r0, [sb, #4] + ldr r1, [r0, #0x10] + add r0, r0, r6, lsl #1 + ldrh r1, [r1, #4] + add r6, r6, #1 + cmp r6, #3 + and r1, r1, r7 + strh r1, [r0, #0x42] + blo _0222FD98 + mov r6, #0 + ldr r5, _0222FE80 ; =ov13_02245450 + ldr sb, _0222FE74 ; =ov13_0224F538 + ldr r7, _0222FE7C ; =0x000003FF + mov r4, r6 +_0222FDE4: + ldr r0, [sb, #4] + ldrb r1, [r5], #1 + ldr r2, [r0, #0x24] + mov r0, r4 + bl ov13_022400F0 + ldr r0, [sb, #4] + ldr r1, [r0, #0x24] + add r0, r0, r6, lsl #1 + ldrh r1, [r1, #4] + add r6, r6, #1 + cmp r6, #4 + and r1, r1, r7 + strh r1, [r0, #0x48] + blo _0222FDE4 + cmp r8, #0 + mov r0, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _0222FE74 ; =ov13_0224F538 +_0222FE2C: + ldr r2, [r1, #4] + add r2, r2, r0, lsl #2 + ldr r3, [r2, #0x10] + ldrh r2, [r3, #4] + bic r2, r2, #0xc00 + orr r2, r2, #0xc00 + strh r2, [r3, #4] + ldr r2, [r1, #4] + add r2, r2, r0, lsl #2 + ldr r3, [r2, #0x24] + add r0, r0, #1 + ldrh r2, [r3, #4] + cmp r0, r8 + bic r2, r2, #0xc00 + orr r2, r2, #0xc00 + strh r2, [r3, #4] + blt _0222FE2C + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0222FE74: .word ov13_0224F538 +_0222FE78: .word ov13_0224544C +_0222FE7C: .word 0x000003FF +_0222FE80: .word ov13_02245450 + arm_func_end ov13_0222FD10 + + arm_func_start ov13_0222FE84 +ov13_0222FE84: ; 0x0222FE84 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x1d + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x1d + bl ov13_02240EA8 + ldr r0, _0222FED4 ; =ov13_0222FED8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FED4: .word ov13_0222FED8 + arm_func_end ov13_0222FE84 + + arm_func_start ov13_0222FED8 +ov13_0222FED8: ; 0x0222FED8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_022279B4 + ldr r0, _0222FF10 ; =ov13_0222FF14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FF10: .word ov13_0222FF14 + arm_func_end ov13_0222FED8 + + arm_func_start ov13_0222FF14 +ov13_0222FF14: ; 0x0222FF14 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0222FF38 ; =ov13_0222FF3C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222FF38: .word ov13_0222FF3C + arm_func_end ov13_0222FF14 + + arm_func_start ov13_0222FF3C +ov13_0222FF3C: ; 0x0222FF3C + stmdb sp!, {r3, lr} + bl ov13_0222FF50 + bl ov13_022301A4 + bl ov13_02230414 + ldmia sp!, {r3, pc} + arm_func_end ov13_0222FF3C + + arm_func_start ov13_0222FF50 +ov13_0222FF50: ; 0x0222FF50 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _02230198 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldr r0, [r1, #0x38] + cmp r0, #0 + ldreqb r0, [r1, #0x57] + cmpeq r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _0223019C ; =ov13_02245958 + bl ov13_022417DC + cmp r0, #0 + beq _0222FFE8 + ldr r0, _02230198 ; =ov13_0224F538 + mvn r1, #0 + ldr r0, [r0, #4] + ldr r5, _022301A0 ; =ov13_022453FC + strb r1, [r0, #0x50] + mov r4, #0 +_0222FF98: + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0222FFD8 + cmp r4, #4 + bge _0222FFC0 + ldr r0, _02230198 ; =ov13_0224F538 + ldr r0, [r0, #4] + strb r4, [r0, #0x50] + b _0222FFE8 +_0222FFC0: + mov r0, #1 + bl ov13_0222726C + ldr r0, _02230198 ; =ov13_0224F538 + strb r4, [r0] + bl ov13_02230CC4 + ldmia sp!, {r3, r4, r5, pc} +_0222FFD8: + add r4, r4, #1 + cmp r4, #5 + add r5, r5, #8 + blo _0222FF98 +_0222FFE8: + ldr r0, _0223019C ; =ov13_02245958 + bl ov13_022418EC + cmp r0, #0 + beq _02230064 + ldr r4, _022301A0 ; =ov13_022453FC + mov r5, #0 +_02230000: + mov r0, r4 + bl ov13_022418EC + cmp r0, #0 + beq _02230054 + ldr r0, _02230198 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldrsb r0, [r1, #0x50] + cmp r0, r5 + bne _02230064 + ldrb r0, [r1, #0x51] + cmp r5, r0 + blt _0223003C + mov r0, #9 + bl ov13_0223ABB8 + b _02230064 +_0223003C: + mov r0, #1 + bl ov13_0222726C + ldr r0, _02230198 ; =ov13_0224F538 + strb r5, [r0] + bl ov13_02230CC4 + ldmia sp!, {r3, r4, r5, pc} +_02230054: + add r5, r5, #1 + cmp r5, #4 + add r4, r4, #8 + blt _02230000 +_02230064: + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _02230084 + mov r0, #1 + bl ov13_0222726C + bl ov13_0223959C + ldmia sp!, {r3, r4, r5, pc} +_02230084: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _022300A0 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_022300A0: + mov r0, #0x200 + bl ov13_022416D4 + cmp r0, #0 + beq _022300B8 + bl ov13_02230ED0 + ldmia sp!, {r3, r4, r5, pc} +_022300B8: + mov r0, #0x200 + bl ov13_02241714 + cmp r0, #0 + beq _022300DC + ldr r0, _02230198 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, r4, r5, pc} +_022300DC: + mov r0, #0x100 + bl ov13_022416D4 + cmp r0, #0 + beq _022300F4 + bl ov13_02230E5C + ldmia sp!, {r3, r4, r5, pc} +_022300F4: + mov r0, #0x100 + bl ov13_02241714 + cmp r0, #0 + beq _02230118 + ldr r0, _02230198 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, r4, r5, pc} +_02230118: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _02230134 + mov r0, #1 + bl ov13_02230D10 + ldmia sp!, {r3, r4, r5, pc} +_02230134: + mov r0, #0x40 + bl ov13_02241714 + cmp r0, #0 + beq _02230158 + ldr r0, _02230198 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, r4, r5, pc} +_02230158: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _02230174 + mov r0, #3 + bl ov13_02230D10 + ldmia sp!, {r3, r4, r5, pc} +_02230174: + mov r0, #0x80 + bl ov13_02241714 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _02230198 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02230198: .word ov13_0224F538 +_0223019C: .word ov13_02245958 +_022301A0: .word ov13_022453FC + arm_func_end ov13_0222FF50 + + arm_func_start ov13_022301A4 +ov13_022301A4: ; 0x022301A4 + stmdb sp!, {r3, lr} + ldr r0, _02230408 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldr r0, [r1, #0x38] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldrb r0, [r1, #0x55] + cmp r0, #0 + subne r0, r0, #1 + strneb r0, [r1, #0x55] + bl ov13_02239564 + cmp r0, #7 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_022301DC: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _022301FC ; case 1 + b _02230214 ; case 2 + b _02230268 ; case 3 + b _02230314 ; case 4 + b _022303F4 ; case 5 + b _0223037C ; case 6 + b _022303F4 ; case 7 +_022301FC: + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x57] + bl ov13_022272E4 + ldmia sp!, {r3, pc} +_02230214: + ldr r0, _02230408 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x55] + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227D18 + bl ov13_02239550 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + ldrh r2, [r1, #0x40] + ldrb r1, [r1, #0x53] + mul r0, r2, r0 + bl FX_DivS32 + ldr r1, _02230408 ; =ov13_0224F538 + strh r0, [r1, #2] + bl ov13_022307AC + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #4 + ldr r0, [r0, #4] + strb r1, [r0, #0x55] + ldmia sp!, {r3, pc} +_02230268: + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x57] + bl ov13_022272CC + bl ov13_02239550 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + ldrh r2, [r1, #0x40] + ldrb r1, [r1, #0x53] + mul r0, r2, r0 + bl FX_DivS32 + ldr r1, _02230408 ; =ov13_0224F538 + strh r0, [r1, #2] + mov r0, #0x13 + bl ov13_0223ABB8 + bl ov13_022307AC + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #0x1c + ldrh r0, [r0, #2] + bl FX_ModS32 + cmp r0, #0 + bne _022302CC + bl ov13_02230CC4 + ldmia sp!, {r3, pc} +_022302CC: + cmp r0, #0xe + mov r0, #0 + mov r3, #0x78 + bge _022302F8 + ldr r1, _0223040C ; =ov13_02230B14 + mov r2, r0 + bl ov13_02242528 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_022302F8: + ldr r1, _02230410 ; =ov13_02230BD0 + mov r2, r0 + bl ov13_02242528 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_02230314: + ldr r0, _02230408 ; =ov13_0224F538 + ldrh r1, [r0, #2] + cmp r1, #0 + bne _02230350 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x58] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x58] + ldmia sp!, {r3, pc} +_02230350: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _0223040C ; =ov13_02230B14 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_0223037C: + ldr r0, _02230408 ; =ov13_0224F538 + ldr r2, [r0, #4] + ldrb r1, [r2, #0x51] + cmp r1, #4 + bls _022303A0 + ldrh r1, [r0, #2] + ldrh r0, [r2, #0x40] + cmp r1, r0 + bne _022303C8 +_022303A0: + ldrb r0, [r2, #0x58] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x58] + ldmia sp!, {r3, pc} +_022303C8: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02230410 ; =ov13_02230BD0 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02230408 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_022303F4: + ldr r0, _02230408 ; =ov13_0224F538 + mov r1, #0 + ldr r0, [r0, #4] + strb r1, [r0, #0x58] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230408: .word ov13_0224F538 +_0223040C: .word ov13_02230B14 +_02230410: .word ov13_02230BD0 + arm_func_end ov13_022301A4 + + arm_func_start ov13_02230414 +ov13_02230414: ; 0x02230414 + stmdb sp!, {r3, lr} + ldr r0, _02230514 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldr r0, [r1, #0x38] + cmp r0, #0 + ldreqb r0, [r1, #0x57] + cmpeq r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227258 + cmp r0, #0 + beq _0223044C + cmp r0, #1 + beq _02230458 + ldmia sp!, {r3, pc} +_0223044C: + mov r0, #7 + bl ov13_0223ABB8 + b _02230508 +_02230458: + ldr r0, _02230514 ; =ov13_0224F538 + ldrb r1, [r0] + cmp r1, #4 + bne _02230484 + ldr r1, [r0, #4] + mov r2, #1 + mov r0, #6 + strb r2, [r1, #0x54] + bl ov13_0223ABB8 + bl ov13_02230F54 + b _02230508 +_02230484: + ldrh r0, [r0, #2] + mov r1, #0x1c + bl FX_DivS32 + ldr r2, _02230514 ; =ov13_0224F538 + mov r1, #0x2a + ldrb lr, [r2] + ldr ip, [r2, #4] + ldr r3, [ip] + add lr, lr, r0 + mla r0, lr, r1, r3 + ldrb r0, [r0, #0x28] + cmp r0, #2 + bne _022304F0 + mov r0, #9 + bl ov13_0223ABB8 + bl ov13_0223959C + bl ov13_022272E4 + mov r1, #1 + mov r0, #0 + str r0, [sp] + mov r2, r1 + mov r0, #0xe + sub r3, r1, #2 + bl ov13_0223BE6C + ldr r0, _02230518 ; =ov13_02230F84 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022304F0: + mov r0, #1 + strb r0, [ip, #0x54] + ldr r1, [r2, #4] + mov r0, #6 + strb lr, [r1, #0x52] + bl ov13_0223ABB8 +_02230508: + ldr r0, _0223051C ; =ov13_02230520 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230514: .word ov13_0224F538 +_02230518: .word ov13_02230F84 +_0223051C: .word ov13_02230520 + arm_func_end ov13_02230414 + + arm_func_start ov13_02230520 +ov13_02230520: ; 0x02230520 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0223053C ; =ov13_02230540 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223053C: .word ov13_02230540 + arm_func_end ov13_02230520 + + arm_func_start ov13_02230540 +ov13_02230540: ; 0x02230540 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022305A8 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x54] + cmp r0, #0 + beq _02230570 + bl ov13_02227228 + b _02230574 +_02230570: + bl ov13_022272E4 +_02230574: + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x1d + mov r3, #8 + bl ov13_022403B8 + ldr r0, _022305AC ; =ov13_022305B0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022305A8: .word ov13_0224F538 +_022305AC: .word ov13_022305B0 + arm_func_end ov13_02230540 + + arm_func_start ov13_022305B0 +ov13_022305B0: ; 0x022305B0 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _02230790 ; =ov13_0224F538 + mov r0, #1 + ldr r1, [r1, #4] + ldr r1, [r1, #0x3c] + bl ov13_022425F0 + ldr r4, _02230790 ; =ov13_0224F538 + mov r5, #0 +_022305FC: + ldr r0, [r4, #4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x10] + cmp r0, #0 + beq _02230614 + bl ov13_02241D98 +_02230614: + ldr r0, [r4, #4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x24] + cmp r0, #0 + beq _0223062C + bl ov13_02241D98 +_0223062C: + add r5, r5, #1 + cmp r5, #5 + blt _022305FC + ldr r0, _02230790 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldr r0, [r0, #0xc] + bl ov13_02240AA0 + bl ov13_02239514 + bl ov13_02227D18 + bl ov13_0222788C + bl ov13_02239288 + ldr r0, _02230790 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldr r0, [r0, #4] + bl ov13_0223FA50 + ldr r0, _02230790 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldr r0, [r0, #8] + bl ov13_0223FA50 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x1d + bl ov13_02240EFC + mov r2, #0 + ldr r1, _02230794 ; =0x04000010 + ldr r0, _02230790 ; =ov13_0224F538 + str r2, [r1] + str r2, [r1, #8] + ldr r2, [r0, #4] + ldrb r1, [r2, #0x54] + cmp r1, #0 + bne _022306DC + bl ov13_02239B34 + bl ov13_02239FF0 + ldrb r0, [r0, #0xf4] + bl ov13_0223A414 + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + ldr r0, _02230798 ; =ov13_02237618 + bl ov13_0222B8E8 + b _02230784 +_022306DC: + ldrb r0, [r0] + cmp r0, #4 + bne _02230704 + bl ov13_02239B34 + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0223079C ; =ov13_022363F4 + bl ov13_0222B8E8 + b _02230784 +_02230704: + ldrb r1, [r2, #0x52] + ldr r2, [r2] + mov r0, #0x2a + mla r0, r1, r0, r2 + bl ov13_0223A02C + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r1, _02230790 ; =ov13_0224F538 + mov r0, #0x2a + ldr r2, [r1, #4] + ldrb r1, [r2, #0x52] + ldr r2, [r2] + mla r0, r1, r0, r2 + ldrb r0, [r0, #0x28] + mov r1, #1 + cmp r0, #0 + mov r0, #0 + beq _0223076C + bl ov13_0222B8F8 + mov r0, #1 + mov r1, r0 + bl ov13_0222B934 + ldr r0, _022307A0 ; =ov13_02230FD8 + bl ov13_0222B8E8 + b _02230784 +_0223076C: + bl ov13_0222B8F8 + mov r0, #0 + mov r1, #1 + bl ov13_0222B934 + ldr r0, _022307A4 ; =ov13_02238440 + bl ov13_0222B8E8 +_02230784: + ldr r0, _022307A8 ; =ov13_0224F53C + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02230790: .word ov13_0224F538 +_02230794: .word 0x04000010 +_02230798: .word ov13_02237618 +_0223079C: .word ov13_022363F4 +_022307A0: .word ov13_02230FD8 +_022307A4: .word ov13_02238440 +_022307A8: .word ov13_0224F53C + arm_func_end ov13_022305B0 + + arm_func_start ov13_022307AC +ov13_022307AC: ; 0x022307AC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _02230850 ; =ov13_0224F538 + mov r1, #0x1c + ldrh r0, [r0, #2] + bl FX_DivS32 + ldr r1, _02230850 ; =ov13_0224F538 + mov r7, r0 + ldr r0, [r1, #4] + mov r1, #0 + ldrb r4, [r0, #0x51] + ldr r0, [r0, #0xc] + bl ov13_02240D80 + cmp r4, #5 + movgt r4, #5 + mov r5, r7 + cmp r4, #0 + mov r6, #0 + ble _02230810 +_022307F4: + mov r0, r5 + mov r1, r6 + bl ov13_02230854 + add r6, r6, #1 + cmp r6, r4 + add r5, r5, #1 + blt _022307F4 +_02230810: + cmp r4, #0 + mov r5, #0 + ble _02230838 +_0223081C: + mov r0, r7 + mov r1, r5 + bl ov13_022309CC + add r5, r5, #1 + cmp r5, r4 + add r7, r7, #1 + blt _0223081C +_02230838: + ldr r0, _02230850 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldr r0, [r0, #0xc] + bl ov13_02240E2C + bl ov13_02230A58 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02230850: .word ov13_0224F538 + arm_func_end ov13_022307AC + + arm_func_start ov13_02230854 +ov13_02230854: ; 0x02230854 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + mov r7, r0 + mov r0, #0x2a + ldr r2, _022309C8 ; =ov13_0224F538 + mul r6, r7, r0 + ldr r0, [r2, #4] + mov r4, r1 + ldr r0, [r0] + mov r1, #0x20 + add r0, r0, r6 + bl ov13_02242074 + ldr r2, _022309C8 ; =ov13_0224F538 + mov r1, #0x1c + mul r5, r4, r1 + ldr r2, [r2, #4] + mov r4, r0 + ldrb r1, [r2, #0x51] + cmp r7, r1 + addge sp, sp, #0x30 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0xc + cmp r4, #0x10 + mov r1, #0 + mov r2, #0x22 + addle r5, r5, #6 + bl MI_CpuFill8 + cmp r4, #0x10 + movle ip, r4 + movgt ip, #0x10 + cmp ip, #0 + mov r3, #0 + ble _02230904 + ldr r0, _022309C8 ; =ov13_0224F538 + ldr r7, [r0, #4] + add r0, sp, #0xc +_022308E4: + ldr r2, [r7] + mov r1, r3, lsl #1 + add r2, r6, r2 + ldrb r2, [r3, r2] + add r3, r3, #1 + cmp r3, ip + strh r2, [r0, r1] + blt _022308E4 +_02230904: + mov r1, #0xa + add r0, sp, #0xc + str r1, [sp] + str r0, [sp, #4] + mov r2, #1 + str r2, [sp, #8] + ldr r0, _022309C8 ; =ov13_0224F538 + mov r2, r5 + ldr r0, [r0, #4] + mov r3, #2 + ldr r0, [r0, #0xc] + bl ov13_02240C14 + cmp r4, #0x10 + addle sp, sp, #0x30 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0xc + mov r1, #0 + mov r2, #0x22 + bl MI_CpuFill8 + sub r3, r4, #0x10 + cmp r3, #0 + mov r7, #0 + ble _02230990 + ldr r0, _022309C8 ; =ov13_0224F538 + ldr r4, [r0, #4] + add r0, sp, #0xc +_0223096C: + ldr r2, [r4] + mov r1, r7, lsl #1 + add r2, r6, r2 + add r2, r7, r2 + ldrb r2, [r2, #0x10] + add r7, r7, #1 + cmp r7, r3 + strh r2, [r0, r1] + blt _0223096C +_02230990: + mov r1, #0xa + add r0, sp, #0xc + str r1, [sp] + str r0, [sp, #4] + mov r2, #1 + str r2, [sp, #8] + ldr r0, _022309C8 ; =ov13_0224F538 + add r2, r5, #0xc + ldr r0, [r0, #4] + mov r3, #2 + ldr r0, [r0, #0xc] + bl ov13_02240C14 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022309C8: .word ov13_0224F538 + arm_func_end ov13_02230854 + + arm_func_start ov13_022309CC +ov13_022309CC: ; 0x022309CC + stmdb sp!, {r4, lr} + ldr r3, _02230A54 ; =ov13_0224F538 + ldr lr, [r3, #4] + ldrb r2, [lr, #0x51] + cmp r0, r2 + ldmgeia sp!, {r4, pc} + mov r2, #0x2a + mul r2, r0, r2 + ldr r0, [lr] + add r4, lr, r1, lsl #2 + add r0, r0, r2 + ldrb ip, [r0, #0x28] + ldr r4, [r4, #0x10] + mov r0, #0x400 + add ip, lr, ip, lsl #1 + ldrh lr, [r4, #4] + rsb r0, r0, #0 + ldrh ip, [ip, #0x42] + and lr, lr, r0 + orr ip, lr, ip + strh ip, [r4, #4] + ldr lr, [r3, #4] + ldr r3, [lr] + add ip, lr, r1, lsl #2 + add r1, r3, r2 + ldrh r1, [r1, #0x26] + ldr r3, [ip, #0x24] + add r1, lr, r1, lsl #1 + ldrh r2, [r3, #4] + ldrh r1, [r1, #0x48] + and r0, r2, r0 + orr r0, r0, r1 + strh r0, [r3, #4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02230A54: .word ov13_0224F538 + arm_func_end ov13_022309CC + + arm_func_start ov13_02230A58 +ov13_02230A58: ; 0x02230A58 + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _02230B0C ; =ov13_0224F538 + mov r1, #0x1c + ldrh r0, [r0, #2] + bl FX_ModS32 + ldr r1, _02230B0C ; =ov13_0224F538 + rsb r0, r0, #0x36 + ldr r1, [r1, #4] + mov r2, #0 + ldrb r1, [r1, #0x51] + cmp r1, #5 + movgt r1, #5 + cmp r1, #0 + ble _02230AF8 + ldr ip, _02230B0C ; =ov13_0224F538 + ldr r3, _02230B10 ; =0xFE00FF00 +_02230A98: + ldr r5, [ip, #4] + sub r4, r0, #2 + add r5, r5, r2, lsl #2 + ldr r6, [r5, #0x10] + add lr, r0, #1 + ldr r5, [r6] + and r4, r4, #0xff + and r5, r5, r3 + orr r4, r5, r4 + orr r4, r4, #0xb30000 + str r4, [r6] + ldr r4, [ip, #4] + and lr, lr, #0xff + add r4, r4, r2, lsl #2 + ldr r5, [r4, #0x24] + add r2, r2, #1 + ldr r4, [r5] + cmp r2, r1 + and r4, r4, r3 + orr r4, r4, lr + orr r4, r4, #0xd20000 + str r4, [r5] + add r0, r0, #0x1c + blt _02230A98 +_02230AF8: + ldr r0, _02230B0C ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x56] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02230B0C: .word ov13_0224F538 +_02230B10: .word 0xFE00FF00 + arm_func_end ov13_02230A58 + + arm_func_start ov13_02230B14 +ov13_02230B14: ; 0x02230B14 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl ov13_0223959C + bl ov13_02227D18 + ldr r0, _02230BCC ; =ov13_0224F538 + ldrh r1, [r0, #2] + cmp r1, #4 + subhi r1, r1, #4 + movls r1, #0 + strh r1, [r0, #2] + ldr r0, _02230BCC ; =ov13_0224F538 + mov r1, #0x1c + ldrh r0, [r0, #2] + bl FX_ModS32 + mov r5, r0 + cmp r5, #0x18 + bne _02230B60 + bl ov13_022307AC + ldmia sp!, {r3, r4, r5, pc} +_02230B60: + ble _02230B7C + ldr r0, _02230BCC ; =ov13_0224F538 + rsb r1, r5, #0x1c + ldrh r2, [r0, #2] + mov r5, #0 + add r1, r2, r1 + strh r1, [r0, #2] +_02230B7C: + bl ov13_02230A58 + cmp r5, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _02230BCC ; =ov13_0224F538 + ldr r1, [r0, #4] + ldrh r2, [r0, #2] + ldrb r0, [r1, #0x53] + ldrh r1, [r1, #0x40] + mul r0, r2, r0 + bl FX_DivS32 + bl ov13_02239578 + bl ov13_02239584 + bl ov13_02230CC4 + ldr r0, _02230BCC ; =ov13_0224F538 + mov r1, r4 + ldr r2, [r0, #4] + mov r0, #0 + str r0, [r2, #0x38] + bl ov13_022425D0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02230BCC: .word ov13_0224F538 + arm_func_end ov13_02230B14 + + arm_func_start ov13_02230BD0 +ov13_02230BD0: ; 0x02230BD0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_0223959C + bl ov13_02227D18 + ldr r0, _02230C64 ; =ov13_0224F538 + mov r1, #0x1c + ldrh r2, [r0, #2] + add r2, r2, #4 + strh r2, [r0, #2] + ldrh r0, [r0, #2] + bl FX_ModS32 + cmp r0, #4 + blt _02230C0C + bl ov13_02230A58 + ldmia sp!, {r4, pc} +_02230C0C: + ldr r1, _02230C64 ; =ov13_0224F538 + ldrh r2, [r1, #2] + sub r0, r2, r0 + strh r0, [r1, #2] + bl ov13_022307AC + ldr r0, _02230C64 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldrh r2, [r0, #2] + ldrb r0, [r1, #0x53] + ldrh r1, [r1, #0x40] + mul r0, r2, r0 + bl FX_DivS32 + bl ov13_02239578 + bl ov13_02239584 + bl ov13_02230CC4 + ldr r0, _02230C64 ; =ov13_0224F538 + mov r1, r4 + ldr r2, [r0, #4] + mov r0, #0 + str r0, [r2, #0x38] + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02230C64: .word ov13_0224F538 + arm_func_end ov13_02230BD0 + + arm_func_start ov13_02230C68 +ov13_02230C68: ; 0x02230C68 + stmdb sp!, {r3, lr} + ldr r0, _02230CB8 ; =ov13_0224F538 + ldr r1, [r0, #4] + ldrb r1, [r1, #0x56] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldrh r0, [r0, #2] + mov r1, #0x1c + bl FX_ModS32 + ldr r1, _02230CBC ; =0x01FF0000 + sub r0, r0, #0x32 + ldr r2, _02230CC0 ; =0x04000010 + and r1, r1, r0, lsl #16 + str r1, [r2] + ldr r0, _02230CB8 ; =ov13_0224F538 + str r1, [r2, #8] + ldr r0, [r0, #4] + mov r1, #0 + strb r1, [r0, #0x56] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230CB8: .word ov13_0224F538 +_02230CBC: .word 0x01FF0000 +_02230CC0: .word 0x04000010 + arm_func_end ov13_02230C68 + + arm_func_start ov13_02230CC4 +ov13_02230CC4: ; 0x02230CC4 + stmdb sp!, {r3, lr} + ldr r0, _02230D00 ; =ov13_0224F538 + ldr r1, _02230D04 ; =ov13_02245424 + ldrb r2, [r0] + ldr r3, _02230D08 ; =ov13_02245426 + mov ip, r2, lsl #3 + cmp r2, #4 + ldr r2, _02230D0C ; =ov13_02245428 + movlo r0, #2 + ldrh r1, [r1, ip] + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + movhs r0, #3 + bl ov13_02227B6C + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230D00: .word ov13_0224F538 +_02230D04: .word ov13_02245424 +_02230D08: .word ov13_02245426 +_02230D0C: .word ov13_02245428 + arm_func_end ov13_02230CC4 + + arm_func_start ov13_02230D10 +ov13_02230D10: ; 0x02230D10 + stmdb sp!, {r4, lr} + ldr r1, _02230E54 ; =ov13_0224F538 + mov r4, #1 + ldrb r3, [r1] + cmp r3, #4 + addls pc, pc, r3, lsl #2 + b _02230E0C +_02230D2C: ; jump table + b _02230D40 ; case 0 + b _02230DA4 ; case 1 + b _02230DA4 ; case 2 + b _02230DD0 ; case 3 + b _02230DE8 ; case 4 +_02230D40: + cmp r0, #1 + bne _02230D88 + ldrh r0, [r1, #2] + cmp r0, #0 + moveq r0, #4 + streqb r0, [r1] + beq _02230E0C + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02230E58 ; =ov13_02230B14 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02230E54 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r4, pc} +_02230D88: + ldr r0, [r1, #4] + ldrb r0, [r0, #0x51] + cmp r0, #1 + addhi r0, r3, #1 + strhib r0, [r1] + movls r4, #0 + b _02230E0C +_02230DA4: + cmp r0, #1 + subeq r0, r3, #1 + streqb r0, [r1] + beq _02230E0C + ldr r2, [r1, #4] + add r0, r3, #1 + ldrb r2, [r2, #0x51] + cmp r2, r0 + strgtb r0, [r1] + movle r4, #0 + b _02230E0C +_02230DD0: + cmp r0, #1 + subeq r0, r3, #1 + streqb r0, [r1] + beq _02230E0C + bl ov13_02230ED0 + ldmia sp!, {r4, pc} +_02230DE8: + cmp r0, #1 + moveq r4, #0 + beq _02230E0C + mov r0, #0 + strh r0, [r1, #2] + strb r0, [r1] + bl ov13_022307AC + mov r0, #0 + bl ov13_02239578 +_02230E0C: + cmp r4, #0 + bne _02230E44 + ldr r0, _02230E54 ; =ov13_0224F538 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x59] + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02230E54 ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r4, pc} +_02230E44: + mov r0, #8 + bl ov13_0223ABB8 + bl ov13_02230CC4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02230E54: .word ov13_0224F538 +_02230E58: .word ov13_02230B14 + arm_func_end ov13_02230D10 + + arm_func_start ov13_02230E5C +ov13_02230E5C: ; 0x02230E5C + stmdb sp!, {r3, lr} + ldr r0, _02230EC8 ; =ov13_0224F538 + ldrh r1, [r0, #2] + cmp r1, #0 + bne _02230E9C + ldr r0, [r0, #4] + ldrb r0, [r0, #0x59] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02230EC8 ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, pc} +_02230E9C: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02230ECC ; =ov13_02230B14 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02230EC8 ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230EC8: .word ov13_0224F538 +_02230ECC: .word ov13_02230B14 + arm_func_end ov13_02230E5C + + arm_func_start ov13_02230ED0 +ov13_02230ED0: ; 0x02230ED0 + stmdb sp!, {r3, lr} + ldr r0, _02230F4C ; =ov13_0224F538 + ldr r2, [r0, #4] + ldrh r1, [r0, #2] + ldrh r0, [r2, #0x40] + cmp r1, r0 + beq _02230EF8 + ldrb r0, [r2, #0x51] + cmp r0, #4 + bhi _02230F20 +_02230EF8: + ldrb r0, [r2, #0x59] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02230F4C ; =ov13_0224F538 + mov r1, #1 + ldr r0, [r0, #4] + strb r1, [r0, #0x59] + ldmia sp!, {r3, pc} +_02230F20: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02230F50 ; =ov13_02230BD0 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02230F4C ; =ov13_0224F538 + ldr r1, [r1, #4] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230F4C: .word ov13_0224F538 +_02230F50: .word ov13_02230BD0 + arm_func_end ov13_02230ED0 + + arm_func_start ov13_02230F54 +ov13_02230F54: ; 0x02230F54 + stmdb sp!, {r3, lr} + ldr r1, _02230F7C ; =ov13_022453CC + ldr r0, _02230F80 ; =ov13_0224F538 + ldrb r1, [r1] + ldr r0, [r0, #4] + ldr r0, [r0, #8] + mov r2, r1 + strb r1, [sp] + bl ov13_02239378 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230F7C: .word ov13_022453CC +_02230F80: .word ov13_0224F538 + arm_func_end ov13_02230F54 + + arm_func_start ov13_02230F84 +ov13_02230F84: ; 0x02230F84 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02230FAC ; =ov13_02230FB0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230FAC: .word ov13_02230FB0 + arm_func_end ov13_02230F84 + + arm_func_start ov13_02230FB0 +ov13_02230FB0: ; 0x02230FB0 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272CC + bl ov13_02239584 + ldr r0, _02230FD4 ; =ov13_0222FF3C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02230FD4: .word ov13_0222FF3C + arm_func_end ov13_02230FB0 + + arm_func_start ov13_02230FD8 +ov13_02230FD8: ; 0x02230FD8 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r1, _02231100 ; =ov13_02245454 + mov r0, #0x2c + ldrb r3, [r1] + ldrb r2, [r1, #1] + mov r1, #4 + strb r3, [sp] + strb r2, [sp, #1] + bl ov13_0224128C + ldr r2, _02231104 ; =ov13_0224F540 + add r1, sp, #4 + str r0, [r2] + add r0, sp, #8 + bl ov13_0222B948 + ldr r0, [sp, #8] + cmp r0, #0 + bne _02231050 + ldr r0, _02231104 ; =ov13_0224F540 + ldr r0, [r0] + add r0, r0, #8 + bl ov13_0223A28C + ldr r0, _02231104 ; =ov13_0224F540 + mov r1, #0x20 + ldr r0, [r0] + add r0, r0, #8 + bl ov13_02242074 + ldr r1, _02231104 ; =ov13_0224F540 + ldr r1, [r1] + strb r0, [r1, #0x29] +_02231050: + bl ov13_0223110C + ldr r0, [sp, #8] + add r0, r0, #9 + bl ov13_02227DE4 + ldr r0, [sp, #4] + cmp r0, #1 + bne _02231080 + mov r0, #0x35 + sub r1, r0, #0x36 + mov r2, #0 + bl ov13_022277B8 + b _02231098 +_02231080: + ldr r2, [sp, #8] + add r0, sp, #0 + ldrb r0, [r0, r2] + mvn r1, #0 + mov r2, #0 + bl ov13_022277B8 +_02231098: + mov r0, #2 + bl ov13_02227964 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + ldr r2, _02231104 ; =ov13_0224F540 + mov r1, #0x3e + ldr r2, [r2] + str r0, [r2] + mov r0, #0 + bl ov13_02240184 + ldr r1, _02231104 ; =ov13_0224F540 + ldr r2, [r1] + str r0, [r2, #4] + ldr r0, [r1] + ldr r1, [r0, #4] + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + bl ov13_022317A8 + bl ov13_022316B4 + ldr r0, _02231108 ; =ov13_022311C8 + bl ov13_0222B8E8 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_02231100: .word ov13_02245454 +_02231104: .word ov13_0224F540 +_02231108: .word ov13_022311C8 + arm_func_end ov13_02230FD8 + + arm_func_start ov13_0223110C +ov13_0223110C: ; 0x0223110C + stmdb sp!, {r3, lr} + ldr r0, _022311A0 ; =ov13_02246370 + ldr r1, _022311A4 ; =GX_LoadOBJPltt + bl ov13_02227924 + ldr r0, _022311A8 ; =ov13_02246384 + ldr r1, _022311AC ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _022311B0 ; =ov13_0224639C + ldr r1, _022311B4 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _022311B8 ; =ov13_022463B4 + ldr r1, _022311BC ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _022311C0 ; =0x04001008 + ldr r1, _022311C4 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022311A0: .word ov13_02246370 +_022311A4: .word GX_LoadOBJPltt +_022311A8: .word ov13_02246384 +_022311AC: .word GX_LoadBG2Char +_022311B0: .word ov13_0224639C +_022311B4: .word GX_LoadBGPltt +_022311B8: .word ov13_022463B4 +_022311BC: .word GX_LoadBG2Scr +_022311C0: .word 0x04001008 +_022311C4: .word 0x0400000A + arm_func_end ov13_0223110C + + arm_func_start ov13_022311C8 +ov13_022311C8: ; 0x022311C8 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02231218 ; =ov13_0223121C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231218: .word ov13_0223121C + arm_func_end ov13_022311C8 + + arm_func_start ov13_0223121C +ov13_0223121C: ; 0x0223121C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02228054 + mov r0, #0x14 + bl ov13_0223ABB8 + ldr r0, _02231290 ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x29] + cmp r0, #0 + bne _02231268 + mov r0, #0 + bl ov13_02228400 +_02231268: + ldr r0, _02231290 ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x29] + cmp r0, #0x20 + bne _02231284 + mov r0, #0 + bl ov13_02228414 +_02231284: + ldr r0, _02231294 ; =ov13_02231298 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231290: .word ov13_0224F540 +_02231294: .word ov13_02231298 + arm_func_end ov13_0223121C + + arm_func_start ov13_02231298 +ov13_02231298: ; 0x02231298 + stmdb sp!, {r3, lr} + bl ov13_022283EC + cmp r0, #0xff + ldmeqia sp!, {r3, pc} + ldr r0, _022312B4 ; =ov13_022312B8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022312B4: .word ov13_022312B8 + arm_func_end ov13_02231298 + + arm_func_start ov13_022312B8 +ov13_022312B8: ; 0x022312B8 + stmdb sp!, {r3, lr} + bl ov13_022312C8 + bl ov13_02231488 + ldmia sp!, {r3, pc} + arm_func_end ov13_022312B8 + + arm_func_start ov13_022312C8 +ov13_022312C8: ; 0x022312C8 + stmdb sp!, {r4, lr} + bl ov13_022283EC + mov r4, r0 + cmp r4, #0x83 + bgt _02231308 + cmp r4, #0x80 + blt _022312FC + beq _02231314 + cmp r4, #0x82 + beq _02231378 + cmp r4, #0x83 + beq _0223139C + b _02231408 +_022312FC: + cmp r4, #0 + beq _0223146C + b _02231408 +_02231308: + ldr r0, _02231478 ; =0x0000E01D + cmp r4, r0 + b _02231408 +_02231314: + ldr r0, _0223147C ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x29] + cmp r0, #0 + beq _0223146C + mov r0, #3 + bl ov13_0223ABB8 + ldr r1, _0223147C ; =ov13_0224F540 + mov r0, #0 + ldr r3, [r1] + ldrb r2, [r3, #0x29] + sub r2, r2, #1 + strb r2, [r3, #0x29] + ldr r3, [r1] + ldrb r2, [r3, #0x29] + add r2, r3, r2 + strb r0, [r2, #8] + ldr r1, [r1] + ldrb r1, [r1, #0x29] + cmp r1, #0 + bne _0223136C + bl ov13_02228400 +_0223136C: + mov r0, #1 + bl ov13_02228414 + b _0223146C +_02231378: + mov r0, #7 + bl ov13_0223ABB8 + ldr r1, _0223147C ; =ov13_0224F540 + ldr r0, _02231480 ; =ov13_0223148C + ldr r1, [r1] + mov r2, #0 + strb r2, [r1, #0x2a] + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} +_0223139C: + bl ov13_0223191C + cmp r0, #0 + beq _022313C4 + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0223147C ; =ov13_0224F540 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x2a] + b _022313DC +_022313C4: + ldr r0, _0223147C ; =ov13_0224F540 + mov r2, #2 + ldr r1, [r0] + mov r0, #9 + strb r2, [r1, #0x2a] + bl ov13_0223ABB8 +_022313DC: + ldr r0, _0223147C ; =ov13_0224F540 + ldr r1, _02231484 ; =0xC1FFFCFF + ldr r2, [r0] + ldr r0, _02231480 ; =ov13_0223148C + ldr r3, [r2, #4] + ldr r2, [r3] + and r1, r2, r1 + orr r1, r1, #0x200 + str r1, [r3] + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} +_02231408: + ldr r0, _0223147C ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x29] + cmp r0, #0x20 + beq _0223146C + mov r0, #1 + bl ov13_0223ABB8 + ldr r1, _0223147C ; =ov13_0224F540 + mov r0, #1 + ldr r3, [r1] + ldrb r2, [r3, #0x29] + add r2, r3, r2 + strb r4, [r2, #8] + ldr r2, [r1] + ldrb r1, [r2, #0x29] + add r1, r1, #1 + strb r1, [r2, #0x29] + bl ov13_02228400 + ldr r0, _0223147C ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x29] + cmp r0, #0x20 + bne _0223146C + mov r0, #0 + bl ov13_02228414 +_0223146C: + bl ov13_022316B4 + bl ov13_022317A8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02231478: .word 0x0000E01D +_0223147C: .word ov13_0224F540 +_02231480: .word ov13_0223148C +_02231484: .word 0xC1FFFCFF + arm_func_end ov13_022312C8 + + arm_func_start ov13_02231488 +ov13_02231488: ; 0x02231488 + bx lr + arm_func_end ov13_02231488 + + arm_func_start ov13_0223148C +ov13_0223148C: ; 0x0223148C + stmdb sp!, {r3, lr} + mov r0, #8 + bl ov13_022405B8 + ldr r0, _022314A4 ; =ov13_022314A8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022314A4: .word ov13_022314A8 + arm_func_end ov13_0223148C + + arm_func_start ov13_022314A8 +ov13_022314A8: ; 0x022314A8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022283B8 + mov r0, #0x15 + bl ov13_0223ABB8 + ldr r0, _022314D4 ; =ov13_022314D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022314D4: .word ov13_022314D8 + arm_func_end ov13_022314A8 + + arm_func_start ov13_022314D8 +ov13_022314D8: ; 0x022314D8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr r0, _0223159C ; =ov13_02245454 + ldr r1, [r0, #8] + ldr r0, [r0, #0xc] + str r1, [sp, #8] + str r0, [sp, #0xc] + bl ov13_02228428 + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, pc} + ldr r0, _022315A0 ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x2a] + cmp r0, #0 + bne _02231528 + ldr r0, _022315A4 ; =ov13_022315B0 + bl ov13_0222B8E8 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} +_02231528: + cmp r0, #2 + bne _0223155C + mov r2, #1 + mov ip, #0 + sub r3, r2, #2 + mov r0, #6 + mov r1, #3 + str ip, [sp] + bl ov13_0223BE6C + ldr r0, _022315A8 ; =ov13_02231AA8 + bl ov13_0222B8E8 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} +_0223155C: + add r1, sp, #4 + mov r0, #0 + bl ov13_0222B948 + mov r0, #0 + str r0, [sp] + mov r2, #1 + ldr r1, [sp, #4] + add r0, sp, #8 + ldr r0, [r0, r1, lsl #2] + sub r3, r2, #2 + mov r1, #2 + bl ov13_0223BE6C + ldr r0, _022315AC ; =ov13_02231810 + bl ov13_0222B8E8 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223159C: .word ov13_02245454 +_022315A0: .word ov13_0224F540 +_022315A4: .word ov13_022315B0 +_022315A8: .word ov13_02231AA8 +_022315AC: .word ov13_02231810 + arm_func_end ov13_022314D8 + + arm_func_start ov13_022315B0 +ov13_022315B0: ; 0x022315B0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + bl ov13_0222788C + ldr r0, _02231698 ; =ov13_0224F540 + ldr r0, [r0] + ldr r0, [r0, #4] + bl ov13_02241D98 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0223169C ; =ov13_022463C8 + ldr r1, _022316A0 ; =GX_LoadOBJPltt + bl ov13_02227924 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + add r0, sp, #4 + add r1, sp, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + bne _02231634 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r1, [sp, #4] + mov r0, #0 + bl ov13_0222B934 + ldr r0, _022316A4 ; =ov13_02232E04 + bl ov13_0222B8E8 + b _02231688 +_02231634: + ldr r0, _02231698 ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #0x2a] + cmp r0, #0 + mov r0, #0 + bne _0223166C + mov r1, #1 + bl ov13_0222B8F8 + mov r0, #1 + mov r1, #0 + bl ov13_0222B934 + ldr r0, _022316A8 ; =ov13_0222FA3C + bl ov13_0222B8E8 + b _02231688 +_0223166C: + mov r1, r0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, #1 + bl ov13_0222B934 + ldr r0, _022316AC ; =ov13_02238440 + bl ov13_0222B8E8 +_02231688: + ldr r0, _022316B0 ; =ov13_0224F540 + bl ov13_022412B0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231698: .word ov13_0224F540 +_0223169C: .word ov13_022463C8 +_022316A0: .word GX_LoadOBJPltt +_022316A4: .word ov13_02232E04 +_022316A8: .word ov13_0222FA3C +_022316AC: .word ov13_02238440 +_022316B0: .word ov13_0224F540 + arm_func_end ov13_022315B0 + + arm_func_start ov13_022316B4 +ov13_022316B4: ; 0x022316B4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + ldr r0, _0223179C ; =ov13_0224F540 + add r5, sp, #0x14 + mov r1, #0 + strh r1, [r5, #2] + mov r4, #0x20 + strh r1, [r5, #4] + mov r3, #0xe + strh r1, [r5, #6] + mov r2, #0x10 + ldr r0, [r0] + strh r1, [r5] + strh r4, [sp, #0x16] + strh r3, [sp, #0x18] + strh r2, [sp, #0x1a] + ldr r0, [r0] + bl ov13_02240D80 + mov sl, #0 + ldr r7, _022317A0 ; =0x0000E01D + ldr r6, _022317A4 ; =ov13_02245470 + mov sb, sl + strh sl, [sp, #0x12] + mov r8, #0x31 + mov r5, #2 + mov r4, #0x480 + add fp, sp, #0x10 +_02231720: + ldr r0, _0223179C ; =ov13_0224F540 + cmp sl, #0x10 + ldr r0, [r0] + moveq sb, #0 + streqh r8, [sp, #0x16] + add r1, r0, sl + ldrb r1, [r1, #8] + ldrb r2, [r6, sb] + cmp r1, #0x20 + streqh r7, [sp, #0x10] + strneh r1, [sp, #0x10] + ldrh r1, [sp, #0x1a] + strh r2, [sp, #0x14] + stmia sp, {r1, r5} + str r4, [sp, #8] + str fp, [sp, #0xc] + ldrh r1, [sp, #0x14] + ldrh r2, [sp, #0x16] + ldrh r3, [sp, #0x18] + ldr r0, [r0] + bl ov13_02240CC0 + add sl, sl, #1 + cmp sl, #0x20 + add sb, sb, #1 + blt _02231720 + ldr r0, _0223179C ; =ov13_0224F540 + ldr r0, [r0] + ldr r0, [r0] + bl ov13_02240E2C + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223179C: .word ov13_0224F540 +_022317A0: .word 0x0000E01D +_022317A4: .word ov13_02245470 + arm_func_end ov13_022316B4 + + arm_func_start ov13_022317A8 +ov13_022317A8: ; 0x022317A8 + stmdb sp!, {r3, lr} + ldr r0, _02231800 ; =ov13_0224F540 + ldr r1, [r0] + ldrb r0, [r1, #0x29] + ldr ip, [r1, #4] + ldr r1, _02231804 ; =ov13_0224546C + cmp r0, #0x20 + and r2, r0, #0xf + mov lr, r0, asr #4 + movhs lr, #1 + ldr r0, _02231808 ; =ov13_02245470 + movhs r2, #0xf + ldrb r3, [r0, r2] + ldr r2, [ip] + ldr r0, _0223180C ; =0xFE00FF00 + ldrb r1, [r1, lr] + and r0, r2, r0 + mov r2, r3, lsl #0x17 + orr r0, r0, r1 + orr r0, r0, r2, lsr #7 + str r0, [ip] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231800: .word ov13_0224F540 +_02231804: .word ov13_0224546C +_02231808: .word ov13_02245470 +_0223180C: .word 0xFE00FF00 + arm_func_end ov13_022317A8 + + arm_func_start ov13_02231810 +ov13_02231810: ; 0x02231810 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + ldr r1, _02231864 ; =ov13_0224F540 + ldr r2, [r1] + strb r0, [r2, #0x2a] + ldr r0, [r1] + ldrb r0, [r0, #0x2a] + cmp r0, #0 + beq _02231840 + cmp r0, #1 + beq _0223184C + ldmia sp!, {r3, pc} +_02231840: + mov r0, #7 + bl ov13_0223ABB8 + b _02231854 +_0223184C: + mov r0, #0xe + bl ov13_0223ABB8 +_02231854: + bl ov13_0223C198 + ldr r0, _02231868 ; =ov13_0223186C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231864: .word ov13_0224F540 +_02231868: .word ov13_0223186C + arm_func_end ov13_02231810 + + arm_func_start ov13_0223186C +ov13_0223186C: ; 0x0223186C + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _02231908 ; =ov13_02245454 + ldr r1, [r0, #0x10] + ldr r0, [r0, #0x14] + str r1, [sp, #4] + str r0, [sp, #8] + bl ov13_0223C1F0 + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {pc} + ldr r0, _0223190C ; =ov13_0224F540 + ldr r1, [r0] + ldrb r0, [r1, #0x2a] + cmp r0, #0 + bne _022318D0 + ldr r3, [r1, #4] + ldr r1, _02231910 ; =0xC1FFFCFF + ldr r2, [r3] + ldr r0, _02231914 ; =ov13_0223121C + and r1, r2, r1 + str r1, [r3] + bl ov13_0222B8E8 + add sp, sp, #0xc + ldmia sp!, {pc} +_022318D0: + add r0, sp, #0 + mov r1, #0 + bl ov13_0222B948 + ldr r0, _0223190C ; =ov13_0224F540 + ldr r2, [sp] + add r1, sp, #4 + ldr r0, [r0] + ldr r1, [r1, r2, lsl #2] + add r0, r0, #8 + blx r1 + ldr r0, _02231918 ; =ov13_022315B0 + bl ov13_0222B8E8 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_02231908: .word ov13_02245454 +_0223190C: .word ov13_0224F540 +_02231910: .word 0xC1FFFCFF +_02231914: .word ov13_0223121C +_02231918: .word ov13_022315B0 + arm_func_end ov13_0223186C + + arm_func_start ov13_0223191C +ov13_0223191C: ; 0x0223191C + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r0, sp, #4 + add r1, sp, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #1 + bne _0223194C + mov r0, #0x35 + sub r1, r0, #0x36 + mov r2, #0 + bl ov13_022277B8 +_0223194C: + add r0, sp, #4 + add r1, sp, #0 + bl ov13_0222B948 + ldr r0, [sp, #4] + cmp r0, #0 + bne _02231984 + ldr r0, _02231AA4 ; =ov13_0224F540 + add sp, sp, #8 + ldr r0, [r0] + ldrb r0, [r0, #8] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} +_02231984: + ldr r0, [sp] + cmp r0, #1 + bne _022319AC + ldr r0, _02231AA4 ; =ov13_0224F540 + ldr r0, [r0] + ldrb r0, [r0, #8] + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_022319AC: + ldr r0, _02231AA4 ; =ov13_0224F540 + mov r1, #0x20 + ldr r0, [r0] + add r0, r0, #8 + bl ov13_02242074 + cmp r0, #0x10 + bgt _02231A00 + cmp r0, #0xa + blt _022319E4 + beq _02231A28 + cmp r0, #0xd + cmpne r0, #0x10 + beq _02231A1C + b _02231A98 +_022319E4: + cmp r0, #0 + bgt _022319F4 + beq _02231A1C + b _02231A98 +_022319F4: + cmp r0, #5 + beq _02231A1C + b _02231A98 +_02231A00: + cmp r0, #0x1a + bgt _02231A10 + beq _02231A28 + b _02231A98 +_02231A10: + cmp r0, #0x20 + beq _02231A28 + b _02231A98 +_02231A1C: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, pc} +_02231A28: + cmp r0, #0 + mov r2, #0 + ble _02231A8C + ldr r1, _02231AA4 ; =ov13_0224F540 + ldr r3, [r1] +_02231A3C: + ldrb r1, [r3, #8] + cmp r1, #0x30 + blo _02231A50 + cmp r1, #0x39 + bls _02231A7C +_02231A50: + cmp r1, #0x41 + blo _02231A60 + cmp r1, #0x46 + bls _02231A7C +_02231A60: + cmp r1, #0x61 + blo _02231A70 + cmp r1, #0x66 + bls _02231A7C +_02231A70: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, pc} +_02231A7C: + add r2, r2, #1 + cmp r2, r0 + add r3, r3, #1 + blt _02231A3C +_02231A8C: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, pc} +_02231A98: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231AA4: .word ov13_0224F540 + arm_func_end ov13_0223191C + + arm_func_start ov13_02231AA8 +ov13_02231AA8: ; 0x02231AA8 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02231AD0 ; =ov13_02231AD4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231AD0: .word ov13_02231AD4 + arm_func_end ov13_02231AA8 + + arm_func_start ov13_02231AD4 +ov13_02231AD4: ; 0x02231AD4 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02231B0C ; =ov13_0224F540 + ldr r1, _02231B10 ; =0xC1FFFCFF + ldr r2, [r0] + ldr r0, _02231B14 ; =ov13_0223121C + ldr r3, [r2, #4] + ldr r2, [r3] + and r1, r2, r1 + str r1, [r3] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231B0C: .word ov13_0224F540 +_02231B10: .word 0xC1FFFCFF +_02231B14: .word ov13_0223121C + arm_func_end ov13_02231AD4 + + arm_func_start ov13_02231B18 +ov13_02231B18: ; 0x02231B18 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + ldr r4, _02231C78 ; =ov13_02245498 + ldr ip, _02231C7C ; =ov13_02245480 + ldmia r4!, {r0, r1, r2, r3} + add r5, sp, #0xc + stmia r5!, {r0, r1, r2, r3} + ldr r4, [r4] + ldrb lr, [ip, #0xa] + str r4, [r5] + ldrb r5, [ip, #8] + ldrb r4, [ip, #9] + ldrb r3, [ip, #0xb] + ldrb r2, [ip, #0xc] + mov r0, #0x18 + mov r1, #4 + strb r5, [sp, #4] + strb r4, [sp, #5] + strb lr, [sp, #6] + strb r3, [sp, #7] + strb r2, [sp, #8] + bl ov13_0224128C + ldr r2, _02231C80 ; =ov13_0224F544 + mov r1, #0 + str r0, [r2] + add r0, sp, #0 + bl ov13_0222B948 + ldr r0, _02231C80 ; =ov13_0224F544 + ldr r2, [sp] + add r1, sp, #0xc + ldr r0, [r0] + ldr r1, [r1, r2, lsl #2] + add r0, r0, #8 + blx r1 + ldr r0, _02231C80 ; =ov13_0224F544 + ldr r1, _02231C84 ; =ov13_022463E0 + ldr r4, [r0] + mov r2, #3 + add r0, r4, #8 + bl memcmp + cmp r0, #0 + movne r0, #3 + strneb r0, [r4, #0x14] + bne _02231BE8 + add r0, r4, #8 + mov r1, #0 + mov r2, #0xc + bl MI_CpuFill8 + ldr r0, _02231C80 ; =ov13_0224F544 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x14] +_02231BE8: + bl ov13_02231C8C + ldr r0, [sp] + add r0, r0, #0xb + bl ov13_02227DE4 + ldr r2, [sp] + add r0, sp, #4 + ldrb r0, [r0, r2] + mvn r1, #0 + mov r2, #0 + bl ov13_022277B8 + mov r0, #2 + bl ov13_02227964 + mov r0, #0 + mov r1, r0 + bl ov13_022408A0 + ldr r2, _02231C80 ; =ov13_0224F544 + mov r1, #0x3f + ldr r2, [r2] + str r0, [r2] + mov r0, #0 + bl ov13_02240184 + ldr r1, _02231C80 ; =ov13_0224F544 + ldr r2, [r1] + str r0, [r2, #4] + ldr r0, [r1] + ldr r1, [r0, #4] + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + bl ov13_02232440 + bl ov13_0223237C + ldr r0, _02231C88 ; =ov13_02231D48 + bl ov13_0222B8E8 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02231C78: .word ov13_02245498 +_02231C7C: .word ov13_02245480 +_02231C80: .word ov13_0224F544 +_02231C84: .word ov13_022463E0 +_02231C88: .word ov13_02231D48 + arm_func_end ov13_02231B18 + + arm_func_start ov13_02231C8C +ov13_02231C8C: ; 0x02231C8C + stmdb sp!, {r3, lr} + ldr r0, _02231D20 ; =ov13_022463E4 + ldr r1, _02231D24 ; =GX_LoadOBJPltt + bl ov13_02227924 + ldr r0, _02231D28 ; =ov13_022463F8 + ldr r1, _02231D2C ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _02231D30 ; =ov13_02246410 + ldr r1, _02231D34 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02231D38 ; =ov13_02246428 + ldr r1, _02231D3C ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02231D40 ; =0x04001008 + ldr r1, _02231D44 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231D20: .word ov13_022463E4 +_02231D24: .word GX_LoadOBJPltt +_02231D28: .word ov13_022463F8 +_02231D2C: .word GX_LoadBG2Char +_02231D30: .word ov13_02246410 +_02231D34: .word GX_LoadBGPltt +_02231D38: .word ov13_02246428 +_02231D3C: .word GX_LoadBG2Scr +_02231D40: .word 0x04001008 +_02231D44: .word 0x0400000A + arm_func_end ov13_02231C8C + + arm_func_start ov13_02231D48 +ov13_02231D48: ; 0x02231D48 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02231D98 ; =ov13_02231D9C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231D98: .word ov13_02231D9C + arm_func_end ov13_02231D48 + + arm_func_start ov13_02231D9C +ov13_02231D9C: ; 0x02231D9C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02229D00 + mov r0, #0x14 + bl ov13_0223ABB8 + ldr r0, _02231E20 ; =ov13_0224F544 + ldr r0, [r0] + ldrb r0, [r0, #0x14] + cmp r0, #0 + bne _02231DF4 + mov r0, #0 + bl ov13_0222A084 + mov r0, #0 + bl ov13_0222A0AC + b _02231E14 +_02231DF4: + mov r0, #0x1a + bl ov13_02232168 + cmp r0, #0 + beq _02231E0C + mov r0, #0 + bl ov13_0222A098 +_02231E0C: + mov r0, #0 + bl ov13_0222A0AC +_02231E14: + ldr r0, _02231E24 ; =ov13_02231E28 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231E20: .word ov13_0224F544 +_02231E24: .word ov13_02231E28 + arm_func_end ov13_02231D9C + + arm_func_start ov13_02231E28 +ov13_02231E28: ; 0x02231E28 + stmdb sp!, {r3, lr} + bl ov13_0222A070 + cmp r0, #0x1f + ldmeqia sp!, {r3, pc} + ldr r0, _02231E44 ; =ov13_02231E48 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231E44: .word ov13_02231E48 + arm_func_end ov13_02231E28 + + arm_func_start ov13_02231E48 +ov13_02231E48: ; 0x02231E48 + stmdb sp!, {r3, lr} + bl ov13_02231E58 + bl ov13_022321FC + ldmia sp!, {r3, pc} + arm_func_end ov13_02231E48 + + arm_func_start ov13_02231E58 +ov13_02231E58: ; 0x02231E58 + stmdb sp!, {r3, r4, r5, lr} + bl ov13_0222A070 + mov r4, r0 + cmp r4, #0 + bgt _02231E74 + ldmeqia sp!, {r3, r4, r5, pc} + b _02232038 +_02231E74: + sub r0, r4, #0x10 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _02232038 +_02231E84: ; jump table + b _02231E98 ; case 0 + b _02231F40 ; case 1 + b _02231F94 ; case 2 + b _02231FB8 ; case 3 + ldmia sp!, {r3, r4, r5, pc} ; case 4 +_02231E98: + ldr r0, _0223215C ; =ov13_0224F544 + ldr r1, [r0] + ldrb r0, [r1, #0x14] + cmp r0, #0 + ldreqb r0, [r1, #0xa] + cmpeq r0, #0 + beq _02232150 + mov r0, #3 + bl ov13_0223ABB8 + ldr r0, _0223215C ; =ov13_0224F544 + ldr r2, [r0] + ldrb r1, [r2, #0x14] + add r0, r1, r1, lsl #1 + add r0, r0, #2 + add r0, r2, r0 + ldrb r0, [r0, #8] + cmp r0, #0 + subeq r0, r1, #1 + streqb r0, [r2, #0x14] + ldr r0, _0223215C ; =ov13_0224F544 + mov r1, #0 + ldr r3, [r0] + mov r2, #3 + ldrb r0, [r3, #0x14] + add r3, r3, #8 + add r0, r0, r0, lsl #1 + add r0, r3, r0 + bl MI_CpuFill8 + ldr r0, _0223215C ; =ov13_0224F544 + ldr r1, [r0] + ldrb r0, [r1, #0x14] + cmp r0, #0 + ldreqb r0, [r1, #0xa] + cmpeq r0, #0 + bne _02231F2C + mov r0, #0 + bl ov13_0222A084 +_02231F2C: + mov r0, #1 + bl ov13_0222A098 + mov r0, #0 + bl ov13_0222A0AC + b _02232150 +_02231F40: + ldr r0, _0223215C ; =ov13_0224F544 + ldr r1, [r0] + ldrb r0, [r1, #0x14] + cmp r0, #3 + bhs _02232150 + add r0, r0, r0, lsl #1 + add r0, r0, #2 + add r0, r1, r0 + ldrb r0, [r0, #8] + cmp r0, #0 + beq _02232150 + mov r0, #1 + bl ov13_0223ABB8 + ldr r1, _0223215C ; =ov13_0224F544 + mov r0, #0 + ldr r2, [r1] + ldrb r1, [r2, #0x14] + add r1, r1, #1 + strb r1, [r2, #0x14] + bl ov13_0222A0AC + b _02232150 +_02231F94: + ldr r0, _0223215C ; =ov13_0224F544 + mov r2, #0 + ldr r1, [r0] + mov r0, #7 + strb r2, [r1, #0x15] + bl ov13_0223ABB8 + ldr r0, _02232160 ; =ov13_02232200 + bl ov13_0222B8E8 + ldmia sp!, {r3, r4, r5, pc} +_02231FB8: + bl ov13_0223261C + cmp r0, #0 + beq _02231FE0 + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _0223215C ; =ov13_0224F544 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x15] + b _02231FF8 +_02231FE0: + ldr r0, _0223215C ; =ov13_0224F544 + mov r2, #2 + ldr r1, [r0] + mov r0, #9 + strb r2, [r1, #0x15] + bl ov13_0223ABB8 +_02231FF8: + ldr r1, _0223215C ; =ov13_0224F544 + mov r3, #3 + ldr r2, [r1] + ldr r0, _02232164 ; =0xC1FFFCFF + strb r3, [r2, #0x14] + ldr r1, [r1] + ldr r2, [r1, #4] + ldr r1, [r2] + and r0, r1, r0 + orr r0, r0, #0x200 + str r0, [r2] + bl ov13_02232440 + bl ov13_022325A4 + ldr r0, _02232160 ; =ov13_02232200 + bl ov13_0222B8E8 + ldmia sp!, {r3, r4, r5, pc} +_02232038: + ldr r0, _0223215C ; =ov13_0224F544 + ldr r0, [r0] + ldrb r0, [r0, #0x14] + cmp r0, #3 + bne _0223205C + mov r0, #0x1a + bl ov13_02232168 + cmp r0, #0 + bne _02232150 +_0223205C: + mov r0, #1 + bl ov13_0223ABB8 + ldr r0, _0223215C ; =ov13_0224F544 + ldr r2, [r0] + ldrb r1, [r2, #0x14] + add r5, r2, #8 + add lr, r1, r1, lsl #1 + add ip, lr, #2 + ldrb r3, [r5, ip] + cmp r3, #0 + streqb r4, [r5, ip] + beq _022320F4 + add r2, lr, #1 + ldrb r1, [r5, r2] + cmp r1, #0 + bne _022320D0 + strb r3, [r5, r2] + mov r0, #0x1a + strb r4, [r5, ip] + bl ov13_02232168 + cmp r0, #0 + beq _022320F4 + ldr r0, _0223215C ; =ov13_0224F544 + ldr r1, [r0] + ldrb r0, [r1, #0x14] + cmp r0, #3 + addlo r0, r0, #1 + strlob r0, [r1, #0x14] + b _022320F4 +_022320D0: + strb r1, [r5, lr] + ldrb r1, [r5, ip] + strb r1, [r5, r2] + strb r4, [r5, ip] + ldr r1, [r0] + ldrb r0, [r1, #0x14] + cmp r0, #3 + addlo r0, r0, #1 + strlob r0, [r1, #0x14] +_022320F4: + mov r0, #1 + bl ov13_0222A084 + ldr r0, _0223215C ; =ov13_0224F544 + ldr r0, [r0] + ldrb r0, [r0, #0x14] + cmp r0, #3 + bhs _0223211C + mov r0, #1 + bl ov13_0222A0AC + b _02232124 +_0223211C: + mov r0, #0 + bl ov13_0222A0AC +_02232124: + ldr r0, _0223215C ; =ov13_0224F544 + ldr r0, [r0] + ldrb r0, [r0, #0x14] + cmp r0, #3 + bne _02232150 + mov r0, #0x1a + bl ov13_02232168 + cmp r0, #0 + beq _02232150 + mov r0, #0 + bl ov13_0222A098 +_02232150: + bl ov13_0223237C + bl ov13_02232440 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223215C: .word ov13_0224F544 +_02232160: .word ov13_02232200 +_02232164: .word 0xC1FFFCFF + arm_func_end ov13_02231E58 + + arm_func_start ov13_02232168 +ov13_02232168: ; 0x02232168 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r1, _022321F8 ; =ov13_0224F544 + mov r4, r0 + ldr r1, [r1] + ldrb r0, [r1, #0x14] + add r3, r1, #8 + add r2, r0, r0, lsl #1 + ldrb r0, [r3, r2] + cmp r0, #0 + cmpne r0, #0x20 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + add r0, r3, r2 + add r1, sp, #0 + mov r2, #3 + bl MI_CpuCopy8 + mov r2, #0 + add r3, sp, #0 + strb r2, [sp, #3] + mov r0, #0x20 +_022321C0: + ldrb r1, [r3] + cmp r1, #0 + bne _022321DC + add r2, r2, #1 + cmp r2, #3 + strb r0, [r3], #1 + blt _022321C0 +_022321DC: + add r0, sp, #0 + bl atoi + cmp r0, r4 + movge r0, #1 + movlt r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022321F8: .word ov13_0224F544 + arm_func_end ov13_02232168 + + arm_func_start ov13_022321FC +ov13_022321FC: ; 0x022321FC + bx lr + arm_func_end ov13_022321FC + + arm_func_start ov13_02232200 +ov13_02232200: ; 0x02232200 + stmdb sp!, {r3, lr} + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02232218 ; =ov13_0223221C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232218: .word ov13_0223221C + arm_func_end ov13_02232200 + + arm_func_start ov13_0223221C +ov13_0223221C: ; 0x0223221C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222A03C + mov r0, #0x15 + bl ov13_0223ABB8 + ldr r0, _02232248 ; =ov13_0223224C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232248: .word ov13_0223224C + arm_func_end ov13_0223221C + + arm_func_start ov13_0223224C +ov13_0223224C: ; 0x0223224C + stmdb sp!, {r3, lr} + bl ov13_0222A0C0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022322C8 ; =ov13_0224F544 + ldr r0, [r0] + ldrb r0, [r0, #0x15] + cmp r0, #0 + bne _0223227C + ldr r0, _022322CC ; =ov13_022322D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0223227C: + mov r2, #1 + cmp r0, #2 + mov ip, #0 + sub r3, r2, #2 + bne _022322AC + mov r0, #6 + mov r1, #3 + str ip, [sp] + bl ov13_0223BE6C + ldr r0, _022322D0 ; =ov13_02232770 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022322AC: + mov r0, #0x47 + mov r1, #2 + str ip, [sp] + bl ov13_0223BE6C + ldr r0, _022322D4 ; =ov13_02232494 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022322C8: .word ov13_0224F544 +_022322CC: .word ov13_022322D8 +_022322D0: .word ov13_02232770 +_022322D4: .word ov13_02232494 + arm_func_end ov13_0223224C + + arm_func_start ov13_022322D8 +ov13_022322D8: ; 0x022322D8 + stmdb sp!, {r3, lr} + bl ov13_0222788C + ldr r0, _02232368 ; =ov13_0224F544 + ldr r0, [r0] + ldr r0, [r0, #4] + bl ov13_02241D98 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0223236C ; =ov13_02246440 + ldr r1, _02232370 ; =GX_LoadOBJPltt + bl ov13_02227924 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + add r0, sp, #0 + mov r1, #0 + bl ov13_0222B948 + ldr r0, [sp] + mov r1, #1 + cmp r0, #3 + addge r0, r0, #1 + strge r0, [sp] + mov r0, #2 + bl ov13_0222B8F8 + ldr r1, [sp] + mov r0, #0 + add r1, r1, #3 + bl ov13_0222B934 + ldr r0, _02232374 ; =ov13_02232E04 + bl ov13_0222B8E8 + ldr r0, _02232378 ; =ov13_0224F544 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232368: .word ov13_0224F544 +_0223236C: .word ov13_02246440 +_02232370: .word GX_LoadOBJPltt +_02232374: .word ov13_02232E04 +_02232378: .word ov13_0224F544 + arm_func_end ov13_022322D8 + + arm_func_start ov13_0223237C +ov13_0223237C: ; 0x0223237C + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x1c + ldr r0, _02232434 ; =ov13_0224F544 + ldr r1, _02232438 ; =ov13_02245480 + ldr r0, [r0] + ldrh r5, [r1, #0xe] + ldrh r4, [r1, #0x10] + mov r3, #0xb + mov r2, #0x10 + ldr r0, [r0] + mov r1, #0 + strh r5, [sp, #0x14] + strh r4, [sp, #0x16] + strh r3, [sp, #0x18] + strh r2, [sp, #0x1a] + bl ov13_02240D80 + mov r4, #0 + ldr r5, _0223243C ; =ov13_022454C0 + ldr r6, _02232434 ; =ov13_0224F544 + strh r4, [sp, #0x12] + mov sb, #2 + mov r8, #0x480 + add r7, sp, #0x10 +_022323D8: + ldr ip, [r6] + ldrb r1, [r5], #1 + add r0, ip, r4 + ldrb r3, [r0, #8] + ldrh r0, [sp, #0x1a] + ldrh r2, [sp, #0x16] + strh r3, [sp, #0x10] + stmia sp, {r0, sb} + str r8, [sp, #8] + str r7, [sp, #0xc] + ldrh r3, [sp, #0x18] + ldr r0, [ip] + strh r1, [sp, #0x14] + bl ov13_02240CC0 + add r4, r4, #1 + cmp r4, #0xc + blt _022323D8 + ldr r0, _02232434 ; =ov13_0224F544 + ldr r0, [r0] + ldr r0, [r0] + bl ov13_02240E2C + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02232434: .word ov13_0224F544 +_02232438: .word ov13_02245480 +_0223243C: .word ov13_022454C0 + arm_func_end ov13_0223237C + + arm_func_start ov13_02232440 +ov13_02232440: ; 0x02232440 + ldr r0, _02232488 ; =ov13_0224F544 + ldr r2, [r0] + ldrb r0, [r2, #0x14] + ldr r3, [r2, #4] + cmp r0, #3 + movgt r0, #3 + add r1, r0, r0, lsl #1 + ldr r0, _0223248C ; =ov13_022454C0 + add r1, r1, #2 + ldrb r2, [r0, r1] + ldr r1, [r3] + ldr r0, _02232490 ; =0xFE00FF00 + mov r2, r2, lsl #0x17 + and r0, r1, r0 + orr r0, r0, #0x28 + orr r0, r0, r2, lsr #7 + str r0, [r3] + bx lr + .balign 4, 0 +_02232488: .word ov13_0224F544 +_0223248C: .word ov13_022454C0 +_02232490: .word 0xFE00FF00 + arm_func_end ov13_02232440 + + arm_func_start ov13_02232494 +ov13_02232494: ; 0x02232494 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + ldr r1, _022324E8 ; =ov13_0224F544 + ldr r2, [r1] + strb r0, [r2, #0x15] + ldr r0, [r1] + ldrb r0, [r0, #0x15] + cmp r0, #0 + beq _022324C4 + cmp r0, #1 + beq _022324D0 + ldmia sp!, {r3, pc} +_022324C4: + mov r0, #7 + bl ov13_0223ABB8 + b _022324D8 +_022324D0: + mov r0, #0xe + bl ov13_0223ABB8 +_022324D8: + bl ov13_0223C198 + ldr r0, _022324EC ; =ov13_022324F0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022324E8: .word ov13_0224F544 +_022324EC: .word ov13_022324F0 + arm_func_end ov13_02232494 + + arm_func_start ov13_022324F0 +ov13_022324F0: ; 0x022324F0 + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr lr, _02232590 ; =ov13_022454AC + add ip, sp, #4 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldr r0, [lr] + str r0, [ip] + bl ov13_0223C1F0 + cmp r0, #0 + addne sp, sp, #0x18 + ldmneia sp!, {r3, pc} + ldr r0, _02232594 ; =ov13_0224F544 + ldr r1, [r0] + ldrb r0, [r1, #0x15] + cmp r0, #0 + bne _02232558 + ldr r3, [r1, #4] + ldr r1, _02232598 ; =0xC1FFFCFF + ldr r2, [r3] + ldr r0, _0223259C ; =ov13_02231D9C + and r1, r2, r1 + str r1, [r3] + bl ov13_0222B8E8 + add sp, sp, #0x18 + ldmia sp!, {r3, pc} +_02232558: + add r0, sp, #0 + mov r1, #0 + bl ov13_0222B948 + ldr r0, _02232594 ; =ov13_0224F544 + ldr r2, [sp] + add r1, sp, #4 + ldr r0, [r0] + ldr r1, [r1, r2, lsl #2] + add r0, r0, #8 + blx r1 + ldr r0, _022325A0 ; =ov13_022322D8 + bl ov13_0222B8E8 + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232590: .word ov13_022454AC +_02232594: .word ov13_0224F544 +_02232598: .word 0xC1FFFCFF +_0223259C: .word ov13_02231D9C +_022325A0: .word ov13_022322D8 + arm_func_end ov13_022324F0 + + arm_func_start ov13_022325A4 +ov13_022325A4: ; 0x022325A4 + stmdb sp!, {r4, r5, r6, lr} + mov r4, #0 + ldr r0, _02232618 ; =ov13_0224F544 + mov r6, r4 + mov r1, #0x20 + mov r2, #0x30 + mov ip, r4 +_022325C0: + ldr r3, [r0] + mov r5, ip + add r3, r3, #8 + add lr, r3, r6 +_022325D0: + ldrb r3, [lr, r5] + cmp r3, #0x30 + cmpne r3, #0x20 + cmpne r3, #0 + bne _02232600 + cmp r5, #2 + moveq r3, r2 + movne r3, r1 + strb r3, [lr, r5] + add r5, r5, #1 + cmp r5, #3 + blt _022325D0 +_02232600: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #3 + blt _022325C0 + bl ov13_0223237C + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02232618: .word ov13_0224F544 + arm_func_end ov13_022325A4 + + arm_func_start ov13_0223261C +ov13_0223261C: ; 0x0223261C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + ldr r2, _02232768 ; =ov13_02245480 + mov r0, #0 + ldrb ip, [r2] + ldrb r3, [r2, #1] + ldr r1, _0223276C ; =ov13_0224F544 + strb ip, [sp, #8] + strb r3, [sp, #9] + ldrb ip, [r2, #2] + ldrb r3, [r2, #3] + ldr r2, [r1] + add r4, sp, #8 + strb ip, [sp, #0xa] + mov r7, r0 + strb r3, [sp, #0xb] + add lr, r2, #8 + mov ip, r0 +_02232664: + ldrb r1, [lr, r7] + add r5, lr, r7 + cmp r1, #0x20 + beq _022326A8 + mov r6, ip + mov r8, r4 +_0223267C: + ldrb r3, [r5, r6] + ldrb r1, [r8] + cmp r3, r1 + addhi sp, sp, #0xc + movhi r0, #0 + ldmhiia sp!, {r3, r4, r5, r6, r7, r8, pc} + blo _022326A8 + add r6, r6, #1 + cmp r6, #3 + add r8, r8, #1 + blt _0223267C +_022326A8: + add r0, r0, #1 + cmp r0, #4 + add r7, r7, #3 + blt _02232664 + add r1, sp, #0 + add r0, r2, #8 + bl ov13_0223AA58 + add r0, sp, #4 + mov r1, #0 + bl ov13_0222B948 + ldr r0, [sp, #4] + cmp r0, #1 + bne _0223274C + mov r4, #0 + mov r1, #1 + add r5, sp, #0 + mov r6, r4 + mov r2, r1 + mov ip, r4 +_022326F4: + ldrb r3, [r5] + mov r7, ip +_022326FC: + cmp r4, #0 + rsb r0, r7, #7 + beq _0223271C + tst r3, r2, lsl r0 + beq _02232724 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0223271C: + tst r3, r1, lsl r0 + moveq r4, r1 +_02232724: + add r7, r7, #1 + cmp r7, #8 + blt _022326FC + add r6, r6, #1 + cmp r6, #4 + add r5, r5, #1 + blt _022326F4 + add sp, sp, #0xc + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0223274C: + add r0, sp, #0 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02232768: .word ov13_02245480 +_0223276C: .word ov13_0224F544 + arm_func_end ov13_0223261C + + arm_func_start ov13_02232770 +ov13_02232770: ; 0x02232770 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02232798 ; =ov13_0223279C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232798: .word ov13_0223279C + arm_func_end ov13_02232770 + + arm_func_start ov13_0223279C +ov13_0223279C: ; 0x0223279C + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022327D4 ; =ov13_0224F544 + ldr r1, _022327D8 ; =0xC1FFFCFF + ldr r2, [r0] + ldr r0, _022327DC ; =ov13_02231D9C + ldr r3, [r2, #4] + ldr r2, [r3] + and r1, r2, r1 + str r1, [r3] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022327D4: .word ov13_0224F544 +_022327D8: .word 0xC1FFFCFF +_022327DC: .word ov13_02231D9C + arm_func_end ov13_0223279C + + arm_func_start ov13_022327E0 +ov13_022327E0: ; 0x022327E0 + stmdb sp!, {r3, lr} + bl ov13_022327FC + bl ov13_0223287C + ldr r0, _022327F8 ; =ov13_02232BD8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022327F8: .word ov13_02232BD8 + arm_func_end ov13_022327E0 + + arm_func_start ov13_022327FC +ov13_022327FC: ; 0x022327FC + stmdb sp!, {r3, lr} + ldr r0, _0223286C ; =ov13_02246458 + ldr r1, _02232870 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02232874 ; =0x04001008 + ldr r1, _02232878 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223286C: .word ov13_02246458 +_02232870: .word GX_LoadBG2Scr +_02232874: .word 0x04001008 +_02232878: .word 0x0400000A + arm_func_end ov13_022327FC + + arm_func_start ov13_0223287C +ov13_0223287C: ; 0x0223287C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x24 + add r1, sp, #0x10 + mov r0, #0 + bl ov13_0222B948 + ldr r0, _02232BAC ; =ov13_0224F548 + ldr r2, _02232BB0 ; =0xFFFFB17D + ldr r1, [r0] + cmp r1, r2 + movge r4, #0 + bge _02232AD8 + sub r0, r2, #1 + cmp r1, r0 + movge r4, #2 + bge _02232AD8 + sub r0, r2, #2 + cmp r1, r0 + movge r4, #0x13 + bge _02232AD8 + sub r0, r2, #8 + cmp r1, r0 + movge r4, #2 + bge _02232AD8 + sub r0, r2, #9 + cmp r1, r0 + movge r4, #0x12 + bge _02232AD8 + sub r0, r2, #0xa + cmp r1, r0 + movge r4, #2 + bge _02232AD8 + sub r0, r2, #0xb + cmp r1, r0 + movge r4, #3 + bge _02232AD8 + sub r0, r2, #0x384 + cmp r1, r0 + movge r4, #2 + bge _02232AD8 + ldr r0, _02232BB4 ; =0xFFFFA629 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r0, #0x3e8 + cmp r1, r0 + movge r4, #0x13 + bge _02232AD8 + ldr r0, _02232BB8 ; =0xFFFF3CB1 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r2, r0, #3 + cmp r1, r2 + movge r4, #7 + bge _02232AD8 + sub r2, r0, #4 + cmp r1, r2 + movge r4, #5 + bge _02232AD8 + sub r2, r0, #0x63 + cmp r1, r2 + movge r4, #0 + bge _02232AD8 + sub r2, r0, #0x64 + cmp r1, r2 + blt _02232998 + ldr r0, [sp, #0x10] + cmp r0, #2 + moveq r4, #5 + movne r4, #7 + b _02232AD8 +_02232998: + ldr r3, _02232BBC ; =0xFFFF3866 + cmp r1, r3 + movge r4, #0 + bge _02232AD8 + sub r2, r3, #1 + cmp r1, r2 + blt _022329C8 + ldr r0, [sp, #0x10] + cmp r0, #2 + moveq r4, #5 + movne r4, #8 + b _02232AD8 +_022329C8: + sub r2, r3, #4 + cmp r1, r2 + movge r4, #9 + bge _02232AD8 + sub r2, r3, #5 + cmp r1, r2 + movge r4, #5 + bge _02232AD8 + sub r2, r3, #0x65 + cmp r1, r2 + movge r4, #0 + bge _02232AD8 + sub r2, r3, #0xc9 + cmp r1, r2 + movge r4, #0x14 + bge _02232AD8 + sub r2, r3, #0xcc + cmp r1, r2 + movge r4, #0x15 + bge _02232AD8 + sub r2, r3, #0xcd + cmp r1, r2 + movge r4, #4 + bge _02232AD8 + sub r0, r0, #0x7d0 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r3, #0x388 + cmp r1, r0 + movge r4, #0xa + bge _02232AD8 + ldr r2, _02232BC0 ; =0xFFFF34DD + cmp r1, r2 + movge r4, #0x16 + bge _02232AD8 + sub r0, r2, #0x60 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r2, #0x64 + cmp r1, r0 + movge r4, #0xb + bge _02232AD8 + sub r0, r2, #0xc4 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r2, #0xc8 + cmp r1, r0 + movge r4, #0xb + bge _02232AD8 + sub r0, r2, #0x128 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r2, #0x18c + cmp r1, r0 + movge r4, #2 + bge _02232AD8 + sub r0, r2, #0x3e4 + cmp r1, r0 + movge r4, #0 + bge _02232AD8 + sub r0, r2, #0x510 + cmp r1, r0 + movge r4, #2 + movlt r4, #0 +_02232AD8: + bl ov13_0222B970 + mov r2, r0 + ldr r1, _02232BC4 ; =ov13_022454CC + mov r0, #0 + ldrb r1, [r1, r2] + bl ov13_022408A0 + ldr r1, _02232BC8 ; =ov13_0224F4F8 + mov r5, r0 + ldr r0, [r1] + mov r1, r4 + bl ov13_0222BADC + ldr r1, _02232BAC ; =ov13_0224F548 + mov r4, r0 + ldr r1, [r1] + ldr r2, _02232BCC ; =ov13_0224646C + rsb r3, r1, #0 + add r0, sp, #0x14 + mov r1, #8 + bl swprintf + bl ov13_0222B970 + mov r1, r0, lsl #2 + ldr r0, _02232BD0 ; =ov13_022454DE + ldrh r6, [r0, r1] + bl ov13_0222B970 + mov r3, r0, lsl #2 + ldr r1, _02232BD4 ; =ov13_022454DC + mov r0, #0xa + ldrh r1, [r1, r3] + str r0, [sp] + add r3, sp, #0x14 + str r3, [sp, #4] + mov r0, #0 + str r0, [sp, #8] + mov r2, r6 + mov r0, r5 + mov r3, #2 + bl ov13_02240C14 + bl ov13_02227B1C + mov r1, #0x5e + str r1, [sp] + mov r1, #2 + str r1, [sp, #4] + str r0, [sp, #8] + mov r0, r5 + mov r1, #0xd + mov r2, #0x3c + mov r3, #0xe6 + str r4, [sp, #0xc] + bl ov13_02240CC0 + mov r0, r5 + bl ov13_02240E2C + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02232BAC: .word ov13_0224F548 +_02232BB0: .word 0xFFFFB17D +_02232BB4: .word 0xFFFFA629 +_02232BB8: .word 0xFFFF3CB1 +_02232BBC: .word 0xFFFF3866 +_02232BC0: .word 0xFFFF34DD +_02232BC4: .word ov13_022454CC +_02232BC8: .word ov13_0224F4F8 +_02232BCC: .word ov13_0224646C +_02232BD0: .word ov13_022454DE +_02232BD4: .word ov13_022454DC + arm_func_end ov13_0223287C + + arm_func_start ov13_02232BD8 +ov13_02232BD8: ; 0x02232BD8 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02232C08 ; =ov13_02232C0C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232C08: .word ov13_02232C0C + arm_func_end ov13_02232BD8 + + arm_func_start ov13_02232C0C +ov13_02232C0C: ; 0x02232C0C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #4 + bl ov13_022279B4 + ldr r0, _02232C44 ; =ov13_02232C48 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232C44: .word ov13_02232C48 + arm_func_end ov13_02232C0C + + arm_func_start ov13_02232C48 +ov13_02232C48: ; 0x02232C48 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02232C6C ; =ov13_02232C70 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232C6C: .word ov13_02232C70 + arm_func_end ov13_02232C48 + + arm_func_start ov13_02232C70 +ov13_02232C70: ; 0x02232C70 + stmdb sp!, {r3, lr} + bl ov13_02232C84 + bl ov13_02232CA4 + bl ov13_02232CA8 + ldmia sp!, {r3, pc} + arm_func_end ov13_02232C70 + + arm_func_start ov13_02232C84 +ov13_02232C84: ; 0x02232C84 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02232C84 + + arm_func_start ov13_02232CA4 +ov13_02232CA4: ; 0x02232CA4 + bx lr + arm_func_end ov13_02232CA4 + + arm_func_start ov13_02232CA8 +ov13_02232CA8: ; 0x02232CA8 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _02232CCC ; =ov13_02232CD0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232CCC: .word ov13_02232CD0 + arm_func_end ov13_02232CA8 + + arm_func_start ov13_02232CD0 +ov13_02232CD0: ; 0x02232CD0 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02232CEC ; =ov13_02232CF0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232CEC: .word ov13_02232CF0 + arm_func_end ov13_02232CD0 + + arm_func_start ov13_02232CF0 +ov13_02232CF0: ; 0x02232CF0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02232D3C ; =ov13_02232D40 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232D3C: .word ov13_02232D40 + arm_func_end ov13_02232CF0 + + arm_func_start ov13_02232D40 +ov13_02232D40: ; 0x02232D40 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + mov r0, #2 + beq _02232DC4 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02232DEC ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02232DC4: + mov r1, #0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + mov r0, #0 + bl ov13_022352C0 + ldr r0, _02232DF0 ; =ov13_02232E04 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232DEC: .word ov13_022368D8 +_02232DF0: .word ov13_02232E04 + arm_func_end ov13_02232D40 + + arm_func_start ov13_02232DF4 +ov13_02232DF4: ; 0x02232DF4 + ldr r1, _02232E00 ; =ov13_0224F548 + str r0, [r1] + bx lr + .balign 4, 0 +_02232E00: .word ov13_0224F548 + arm_func_end ov13_02232DF4 + + arm_func_start ov13_02232E04 +ov13_02232E04: ; 0x02232E04 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + bl ov13_02239FF0 + mov r4, r0 + mov r0, #0x48 + mov r1, #4 + bl ov13_0224128C + ldr r1, _02232FE8 ; =ov13_0224F54C + mov r2, #0xc + str r0, [r1, #8] + ldrb r3, [r4, #0xf6] + strb r3, [r0, #0x43] + ldr r0, [r1, #8] + strb r2, [r0, #0x42] + bl ov13_02233214 + bl ov13_02233000 + ldr r0, _02232FE8 ; =ov13_0224F54C + ldrb r0, [r0, #1] + cmp r0, #0 + bne _02232E74 + bl ov13_0222B970 + ldr r1, _02232FEC ; =ov13_022455D4 + ldrb r2, [r4, #0xf4] + ldrsb r1, [r1, r0] + mov r0, #0x30 + add r2, r2, #1 + bl ov13_022277B8 + b _02232E84 +_02232E74: + mov r0, #0x45 + sub r1, r0, #0x46 + mov r2, #0 + bl ov13_022277B8 +_02232E84: + mov r0, #1 + bl ov13_02227964 + bl ov13_02227E58 + ldr r0, _02232FE8 ; =ov13_0224F54C + mov r1, #0x37 + ldrh r3, [r0, #4] + ldr r2, _02232FF0 ; =0xE1FC780F + mov r0, #2 + mul r5, r3, r1 + smull r1, r3, r2, r5 + add r3, r5, r3 + mov r1, r5, lsr #0x1f + add r3, r1, r3, asr #7 + str r3, [sp] + mov r1, #0x55 + mov r2, #0xf1 + mov r3, #0x41 + bl ov13_0223943C + mov r0, #0 + mov r1, #1 + bl ov13_022408A0 + ldr r6, _02232FE8 ; =ov13_0224F54C + mov r5, #0 + ldr r1, [r6, #8] + mov r8, r5 + str r0, [r1, #0x14] + mov r7, #0x29 +_02232EF0: + mov r0, r8 + mov r1, r7 + bl ov13_02240184 + ldr r1, [r6, #8] + add r1, r1, r5, lsl #2 + add r5, r5, #1 + str r0, [r1, #0x18] + cmp r5, #7 + blt _02232EF0 + ldrb r0, [r4, #0xe7] + cmp r0, #1 + beq _02232F2C + cmp r0, #2 + beq _02232F60 + b _02232F90 +_02232F2C: + mov r0, #0 + mov r1, #0x50 + bl ov13_02240184 + ldr r1, _02232FE8 ; =ov13_0224F54C + ldr r2, [r1, #8] + str r0, [r2, #0x34] + ldr r0, [r1, #8] + ldr r1, [r0, #0x34] + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + b _02232F90 +_02232F60: + mov r0, #0 + mov r1, #0x51 + bl ov13_02240184 + ldr r1, _02232FE8 ; =ov13_0224F54C + ldr r2, [r1, #8] + str r0, [r2, #0x34] + ldr r0, [r1, #8] + ldr r1, [r0, #0x34] + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] +_02232F90: + ldr r1, _02232FF4 ; =ov13_02234B48 + mov r0, #1 + mov r2, #0 + mov r3, #0x6e + bl ov13_02242528 + ldr r2, _02232FE8 ; =ov13_0224F54C + ldr r1, _02232FF8 ; =ov13_022350A8 + ldr r2, [r2, #8] + mov r3, #0x78 + str r0, [r2, #0x3c] + mov r0, #0 + mov r2, r0 + bl ov13_02242528 + ldr r1, _02232FE8 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1] + bl ov13_02233DCC + bl ov13_02234BCC + ldr r0, _02232FFC ; =ov13_02233250 + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02232FE8: .word ov13_0224F54C +_02232FEC: .word ov13_022455D4 +_02232FF0: .word 0xE1FC780F +_02232FF4: .word ov13_02234B48 +_02232FF8: .word ov13_022350A8 +_02232FFC: .word ov13_02233250 + arm_func_end ov13_02232E04 + + arm_func_start ov13_02233000 +ov13_02233000: ; 0x02233000 + stmdb sp!, {lr} + sub sp, sp, #0x44 + ldr r3, _022331D4 ; =ov13_02245573 + add ip, sp, #0x2b + mov r2, #0xb +_02233014: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + bne _02233014 + ldrb r0, [r3] + ldr r3, _022331D8 ; =ov13_02245548 + add lr, sp, #0x16 + strb r0, [ip] + mov r2, #0xa +_02233048: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [lr] + strb r0, [lr, #1] + add lr, lr, #2 + subs r2, r2, #1 + bne _02233048 + ldrb r0, [r3] + ldr ip, _022331DC ; =ov13_0224555D + add r3, sp, #0 + strb r0, [lr] + mov r2, #0xb +_0223307C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0223307C + ldr r3, _022331E0 ; =0x0400000C + ldr r0, _022331E4 ; =ov13_02246474 + ldrh r2, [r3] + ldr r1, _022331E8 ; =GX_LoadOBJPltt + and r2, r2, #0x43 + orr r2, r2, #0x218 + orr r2, r2, #0xc00 + strh r2, [r3] + bl ov13_02227924 + ldr r0, _022331EC ; =ov13_02246488 + ldr r1, _022331F0 ; =GX_LoadBG3Char + bl ov13_02227924 + ldr r0, _022331F4 ; =ov13_022464A0 + ldr r1, _022331F8 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r1, _022331FC ; =GX_LoadBGPltt + add r0, sp, #0x16 + bl ov13_02227924 + ldr r0, _02233200 ; =ov13_022464B8 + ldr r1, _02233204 ; =GX_LoadBG3Scr + bl ov13_02227924 + add r0, sp, #0x2b + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _02233208 ; =ov13_0224F54C + ldr r2, [r1, #8] + str r0, [r2, #8] + ldr r0, [r1, #8] + ldr r0, [r0, #8] + bl ov13_02239228 + bl ov13_022392B4 + add r0, sp, #0x16 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _02233208 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0xc] + add r0, sp, #0 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _02233208 ; =ov13_0224F54C + ldr r2, _0223320C ; =0x04001008 + ldr r1, [r1, #8] + str r0, [r1, #0x10] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + sub r2, r2, #0x1000 + ldrh r0, [r2] + ldr r1, _02233210 ; =0x0400000A + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldrh r0, [r1, #4] + bic r0, r0, #3 + orr r0, r0, #2 + strh r0, [r1, #4] + add sp, sp, #0x44 + ldmia sp!, {pc} + .balign 4, 0 +_022331D4: .word ov13_02245573 +_022331D8: .word ov13_02245548 +_022331DC: .word ov13_0224555D +_022331E0: .word 0x0400000C +_022331E4: .word ov13_02246474 +_022331E8: .word GX_LoadOBJPltt +_022331EC: .word ov13_02246488 +_022331F0: .word GX_LoadBG3Char +_022331F4: .word ov13_022464A0 +_022331F8: .word GX_LoadBG2Char +_022331FC: .word GX_LoadBGPltt +_02233200: .word ov13_022464B8 +_02233204: .word GX_LoadBG3Scr +_02233208: .word ov13_0224F54C +_0223320C: .word 0x04001008 +_02233210: .word 0x0400000A + arm_func_end ov13_02233000 + + arm_func_start ov13_02233214 +ov13_02233214: ; 0x02233214 + stmdb sp!, {r3, lr} + bl ov13_02239FF0 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223324C ; =ov13_0224F54C + mov r1, #0 + strh r1, [r0, #4] + strb r1, [r0] + strb r1, [r0, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223324C: .word ov13_0224F54C + arm_func_end ov13_02233214 + + arm_func_start ov13_02233250 +ov13_02233250: ; 0x02233250 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x1d + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x1d + bl ov13_02240EA8 + ldr r0, _022332A0 ; =ov13_022332A4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022332A0: .word ov13_022332A4 + arm_func_end ov13_02233250 + + arm_func_start ov13_022332A4 +ov13_022332A4: ; 0x022332A4 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022332D4 ; =ov13_022332D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022332D4: .word ov13_022332D8 + arm_func_end ov13_022332A4 + + arm_func_start ov13_022332D8 +ov13_022332D8: ; 0x022332D8 + stmdb sp!, {r3, lr} + bl ov13_022332E8 + bl ov13_02233810 + ldmia sp!, {r3, pc} + arm_func_end ov13_022332D8 + + arm_func_start ov13_022332E8 +ov13_022332E8: ; 0x022332E8 + stmdb sp!, {r3, lr} + ldr r0, _02233558 ; =ov13_0224F54C + ldr r1, [r0, #8] + ldr r0, [r1, #0x38] + cmp r0, #0 + ldreqb r0, [r1, #0x45] + cmpeq r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02233568 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _02233334 + ldr r0, _02233558 ; =ov13_0224F54C + ldrb r0, [r0] + bl ov13_022335EC + ldmia sp!, {r3, pc} +_02233334: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02233368 + mov r0, #7 + bl ov13_0223ABB8 + ldr r1, _02233558 ; =ov13_0224F54C + ldr r0, _0223355C ; =ov13_02233A6C + ldr r1, [r1, #8] + mov r2, #0xd + strb r2, [r1, #0x40] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02233368: + mov r0, #0x200 + bl ov13_022416D4 + cmp r0, #0 + beq _022333E0 + ldr r0, _02233558 ; =ov13_0224F54C + ldrh r1, [r0, #4] + cmp r1, #0x91 + bne _022333B4 + ldr r0, [r0, #8] + ldrb r0, [r0, #0x47] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_022333B4: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02233560 ; =ov13_02234AA4 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02233558 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_022333E0: + mov r0, #0x200 + bl ov13_02241714 + cmp r0, #0 + beq _02233404 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_02233404: + mov r0, #0x100 + bl ov13_022416D4 + cmp r0, #0 + beq _0223347C + ldr r0, _02233558 ; =ov13_0224F54C + ldrh r1, [r0, #4] + cmp r1, #0 + bne _02233450 + ldr r0, [r0, #8] + ldrb r0, [r0, #0x47] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_02233450: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02233564 ; =ov13_022349DC + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02233558 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_0223347C: + mov r0, #0x100 + bl ov13_02241714 + cmp r0, #0 + beq _022334A0 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_022334A0: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _022334BC + mov r0, #1 + bl ov13_02234D84 + ldmia sp!, {r3, pc} +_022334BC: + mov r0, #0x40 + bl ov13_02241714 + cmp r0, #0 + beq _022334E0 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_022334E0: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _022334FC + mov r0, #3 + bl ov13_02234D84 + ldmia sp!, {r3, pc} +_022334FC: + mov r0, #0x80 + bl ov13_02241714 + cmp r0, #0 + beq _02233520 + ldr r0, _02233558 ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, pc} +_02233520: + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _0223353C + mov r0, #0 + bl ov13_02234D84 + ldmia sp!, {r3, pc} +_0223353C: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #2 + bl ov13_02234D84 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02233558: .word ov13_0224F54C +_0223355C: .word ov13_02233A6C +_02233560: .word ov13_02234AA4 +_02233564: .word ov13_022349DC + arm_func_end ov13_022332E8 + + arm_func_start ov13_02233568 +ov13_02233568: ; 0x02233568 + stmdb sp!, {r4, lr} + bl ov13_02239FF0 + bl ov13_02234700 + mov r4, r0 + cmp r4, #0xe + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl ov13_0223417C + cmp r0, #0 + bne _022335A0 + mov r0, #9 + bl ov13_0223ABB8 + mov r0, #1 + ldmia sp!, {r4, pc} +_022335A0: + mov r0, r4 + bl ov13_02234D54 + cmp r4, #8 + addls pc, pc, r4, lsl #2 + b _022335DC +_022335B4: ; jump table + b _022335DC ; case 0 + b _022335DC ; case 1 + b _022335D8 ; case 2 + b _022335D8 ; case 3 + b _022335DC ; case 4 + b _022335DC ; case 5 + b _022335DC ; case 6 + b _022335D8 ; case 7 + b _022335D8 ; case 8 +_022335D8: + bl ov13_022350FC +_022335DC: + mov r0, r4 + bl ov13_022335EC + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov13_02233568 + + arm_func_start ov13_022335EC +ov13_022335EC: ; 0x022335EC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + bl ov13_0223417C + cmp r0, #0 + bne _02233614 + mov r0, #9 + bl ov13_0223ABB8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02233614: + cmp r4, #8 + addls pc, pc, r4, lsl #2 + b _0223368C +_02233620: ; jump table + b _0223368C ; case 0 + b _0223368C ; case 1 + b _02233644 ; case 2 + b _02233644 ; case 3 + b _0223368C ; case 4 + b _0223368C ; case 5 + b _0223368C ; case 6 + b _02233668 ; case 7 + b _02233668 ; case 8 +_02233644: + mov r0, #6 + bl ov13_0223ABB8 + sub r0, r4, #2 + teq r0, #1 + movne r0, #1 + moveq r0, #0 + bl ov13_0223376C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02233668: + mov r0, #6 + bl ov13_0223ABB8 + sub r0, r4, #7 + teq r0, #1 + movne r0, #1 + moveq r0, #0 + bl ov13_022337D8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0223368C: + ldr r0, _0223375C ; =ov13_0224F54C + sub r1, r4, #0xb + ldr r0, [r0, #8] + cmp r1, #1 + strb r4, [r0, #0x40] + bhi _02233708 + bl ov13_02235074 + bl ov13_022351C0 + cmp r0, #0 + bne _022336E8 + mov r0, #9 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #6 + str ip, [sp] + bl ov13_0223BE6C + ldr r0, _02233760 ; =ov13_02235260 + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_022336E8: + cmp r4, #0xb + bne _022336FC + mov r0, #6 + bl ov13_0223ABB8 + b _02233748 +_022336FC: + mov r0, #0xe + bl ov13_0223ABB8 + b _02233748 +_02233708: + cmp r4, #0xd + bne _02233720 + bl ov13_02235074 + mov r0, #7 + bl ov13_0223ABB8 + b _02233748 +_02233720: + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _02233764 ; =ov13_022455F4 + ldrb r0, [r0, r4] + bl ov13_02234974 + mov r2, r0 + mov r0, #0 + mov r1, #1 + bl ov13_02234210 + bl ov13_022344F0 +_02233748: + bl ov13_0223959C + ldr r0, _02233768 ; =ov13_02233A6C + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0223375C: .word ov13_0224F54C +_02233760: .word ov13_02235260 +_02233764: .word ov13_022455F4 +_02233768: .word ov13_02233A6C + arm_func_end ov13_022335EC + + arm_func_start ov13_0223376C +ov13_0223376C: ; 0x0223376C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl ov13_02239FF0 + ldrb r1, [r0, #0xf5] + cmp r1, r4 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + beq _022337A8 + ldr r0, _022337D4 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x43] + cmp r0, #0 + movne r5, #1 + moveq r5, #0 + b _022337BC +_022337A8: + ldr r1, _022337D4 ; =ov13_0224F54C + ldrb r2, [r0, #0xf6] + ldr r0, [r1, #8] + mov r5, #0 + strb r2, [r0, #0x43] +_022337BC: + mov r0, r4 + bl ov13_0223A004 + mov r0, r5 + bl ov13_0223A018 + bl ov13_02233DCC + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022337D4: .word ov13_0224F54C + arm_func_end ov13_0223376C + + arm_func_start ov13_022337D8 +ov13_022337D8: ; 0x022337D8 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_02239FF0 + ldrb r0, [r0, #0xf6] + cmp r0, r4 + ldmeqia sp!, {r4, pc} + ldr r1, _0223380C ; =ov13_0224F54C + mov r0, r4 + ldr r1, [r1, #8] + strb r4, [r1, #0x43] + bl ov13_0223A018 + bl ov13_02233DCC + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223380C: .word ov13_0224F54C + arm_func_end ov13_022337D8 + + arm_func_start ov13_02233810 +ov13_02233810: ; 0x02233810 + stmdb sp!, {r3, lr} + ldr r0, _02233A5C ; =ov13_0224F54C + ldr r1, [r0, #8] + ldr r0, [r1, #0x38] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldrb r0, [r1, #0x41] + cmp r0, #0 + subne r0, r0, #1 + strneb r0, [r1, #0x41] + bl ov13_02239564 + cmp r0, #7 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_02233848: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _02233868 ; case 1 + b _0223387C ; case 2 + b _022338D0 ; case 3 + b _02233978 ; case 4 + b _02233A48 ; case 5 + b _022339E0 ; case 6 + b _02233A48 ; case 7 +_02233868: + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x45] + ldmia sp!, {r3, pc} +_0223387C: + ldr r0, _02233A5C ; =ov13_0224F54C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x41] + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227D18 + bl ov13_02239550 + mov r1, #0x91 + mul r1, r0, r1 + ldr r2, _02233A60 ; =0x094F2095 + mov r0, r1, lsr #0x1f + smull r1, r3, r2, r1 + ldr r1, _02233A5C ; =ov13_0224F54C + add r3, r0, r3, asr #1 + strh r3, [r1, #4] + bl ov13_02233DCC + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #4 + ldr r0, [r0, #8] + strb r1, [r0, #0x41] + ldmia sp!, {r3, pc} +_022338D0: + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x45] + bl ov13_02239550 + mov r1, #0x91 + mul r1, r0, r1 + ldr r2, _02233A60 ; =0x094F2095 + mov r0, r1, lsr #0x1f + smull r1, r3, r2, r1 + ldr r1, _02233A5C ; =ov13_0224F54C + add r3, r0, r3, asr #1 + mov r0, #0x13 + strh r3, [r1, #4] + bl ov13_0223ABB8 + bl ov13_02233DCC + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_ModS32 + cmp r0, #0 + bne _02233930 + bl ov13_02234CA4 + ldmia sp!, {r3, pc} +_02233930: + cmp r0, #0x10 + mov r0, #0 + mov r3, #0x78 + bge _0223395C + ldr r1, _02233A64 ; =ov13_022349DC + mov r2, r0 + bl ov13_02242528 + ldr r1, _02233A5C ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_0223395C: + ldr r1, _02233A68 ; =ov13_02234AA4 + mov r2, r0 + bl ov13_02242528 + ldr r1, _02233A5C ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_02233978: + ldr r0, _02233A5C ; =ov13_0224F54C + ldrh r1, [r0, #4] + cmp r1, #0 + bne _022339B4 + ldr r0, [r0, #8] + ldrb r0, [r0, #0x46] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x46] + ldmia sp!, {r3, pc} +_022339B4: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02233A64 ; =ov13_022349DC + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02233A5C ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_022339E0: + ldr r0, _02233A5C ; =ov13_0224F54C + ldrh r1, [r0, #4] + cmp r1, #0x91 + bne _02233A1C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x46] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x46] + ldmia sp!, {r3, pc} +_02233A1C: + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02233A68 ; =ov13_02234AA4 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02233A5C ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, pc} +_02233A48: + ldr r0, _02233A5C ; =ov13_0224F54C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x46] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02233A5C: .word ov13_0224F54C +_02233A60: .word 0x094F2095 +_02233A64: .word ov13_022349DC +_02233A68: .word ov13_02234AA4 + arm_func_end ov13_02233810 + + arm_func_start ov13_02233A6C +ov13_02233A6C: ; 0x02233A6C + stmdb sp!, {r3, lr} + bl ov13_0223959C + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02233A88 ; =ov13_02233A8C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02233A88: .word ov13_02233A8C + arm_func_end ov13_02233A6C + + arm_func_start ov13_02233A8C +ov13_02233A8C: ; 0x02233A8C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x1d + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02233AD4 ; =ov13_02233AD8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02233AD4: .word ov13_02233AD8 + arm_func_end ov13_02233A8C + + arm_func_start ov13_02233AD8 +ov13_02233AD8: ; 0x02233AD8 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, _02233DA0 ; =ov13_0224F54C + mov r0, #0 + ldr r1, [r1, #8] + ldr r1, [r1] + bl ov13_022425F0 + ldr r1, _02233DA0 ; =ov13_0224F54C + mov r0, #1 + ldr r1, [r1, #8] + ldr r1, [r1, #0x3c] + bl ov13_022425F0 + ldr r4, _02233DA0 ; =ov13_0224F54C + mov r5, #0 +_02233B2C: + ldr r0, [r4, #8] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x18] + bl ov13_02241D98 + add r5, r5, #1 + cmp r5, #7 + blt _02233B2C + ldr r0, _02233DA0 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldr r0, [r0, #0x34] + cmp r0, #0 + beq _02233B60 + bl ov13_02241D98 +_02233B60: + bl ov13_02239514 + mov r0, #0 + bl ov13_02240B04 + bl ov13_02227D18 + ldr r0, _02233DA0 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x40] + cmp r0, #0xc + beq _02233B88 + bl ov13_0222788C +_02233B88: + bl ov13_02239288 + ldr r0, _02233DA0 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldr r0, [r0, #8] + bl ov13_0223FA50 + ldr r4, _02233DA0 ; =ov13_0224F54C + mov r5, #0 +_02233BA4: + ldr r0, [r4, #8] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0xc] + bl ov13_0223FA50 + add r5, r5, #1 + cmp r5, #2 + blt _02233BA4 + ldr r0, _02233DA4 ; =ov13_022464CC + ldr r1, _02233DA8 ; =GX_LoadOBJPltt + bl ov13_02227924 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x1d + bl ov13_02240EFC + ldr r0, _02233DAC ; =0x04000010 + mov r1, #0 + str r1, [r0] + sub r3, r0, #4 + str r1, [r0, #8] + ldrh r0, [r3] + ldr r2, _02233DA0 ; =ov13_0224F54C + and r0, r0, #0x43 + orr r0, r0, #0xe10 + strh r0, [r3] + ldr r0, [r2, #8] + ldrb r0, [r0, #0x40] + cmp r0, #0xd + addls pc, pc, r0, lsl #2 + b _02233D94 +_02233C20: ; jump table + b _02233C58 ; case 0 + b _02233C58 ; case 1 + b _02233D94 ; case 2 + b _02233D94 ; case 3 + b _02233C74 ; case 4 + b _02233C74 ; case 5 + b _02233C74 ; case 6 + b _02233D94 ; case 7 + b _02233D94 ; case 8 + b _02233C74 ; case 9 + b _02233C74 ; case 10 + b _02233CA4 ; case 11 + b _02233D3C ; case 12 + b _02233D50 ; case 13 +_02233C58: + bl ov13_0222B934 + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + ldr r0, _02233DB0 ; =ov13_02230FD8 + bl ov13_0222B8E8 + b _02233D94 +_02233C74: + sub r4, r0, #4 + cmp r0, #9 + subhs r4, r4, #2 + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + mov r0, r4 + mov r1, #0 + bl ov13_0222B934 + ldr r0, _02233DB4 ; =ov13_02231B18 + bl ov13_0222B8E8 + b _02233D94 +_02233CA4: + bl ov13_02239FF0 + mov r4, r0 + add r0, r4, #0xf0 + bl DWCi_BACKUPlConvMaskCidr + strb r0, [r4, #0xd0] + ldrb r0, [r4, #0xf5] + cmp r0, #0 + beq _02233CFC + add r0, r4, #0xc0 + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + add r0, r4, #0xc4 + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + add r0, r4, #0xf0 + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + mov r0, #0 + strb r0, [r4, #0xd0] +_02233CFC: + ldrb r0, [r4, #0xf6] + cmp r0, #0 + beq _02233D18 + add r0, r4, #0xc8 + mov r1, #0 + mov r2, #8 + bl MI_CpuFill8 +_02233D18: + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + ldr r0, _02233DB8 ; =ov13_02237DD0 + bl ov13_0222B8E8 + b _02233D94 +_02233D3C: + mov r0, r1 + bl ov13_0222B8F8 + ldr r0, _02233DBC ; =ov13_022352D0 + bl ov13_0222B8E8 + b _02233D94 +_02233D50: + ldrb r0, [r2, #1] + cmp r0, #0 + bne _02233D74 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02233DC0 ; =ov13_022368D8 + bl ov13_0222B8E8 + b _02233D94 +_02233D74: + bl ov13_02239FF0 + ldrb r0, [r0, #0xf4] + bl ov13_0223A414 + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02233DC4 ; =ov13_02237618 + bl ov13_0222B8E8 +_02233D94: + ldr r0, _02233DC8 ; =ov13_0224F554 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02233DA0: .word ov13_0224F54C +_02233DA4: .word ov13_022464CC +_02233DA8: .word GX_LoadOBJPltt +_02233DAC: .word 0x04000010 +_02233DB0: .word ov13_02230FD8 +_02233DB4: .word ov13_02231B18 +_02233DB8: .word ov13_02237DD0 +_02233DBC: .word ov13_022352D0 +_02233DC0: .word ov13_022368D8 +_02233DC4: .word ov13_02237618 +_02233DC8: .word ov13_0224F554 + arm_func_end ov13_02233AD8 + + arm_func_start ov13_02233DCC +ov13_02233DCC: ; 0x02233DCC + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _02233E84 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_DivS32 + ldr r1, _02233E84 ; =ov13_0224F54C + mov r4, r0 + ldr r0, [r1, #8] + mov r1, #0 + ldr r0, [r0, #0x14] + bl ov13_02240D80 + mov r5, r4 + mov r6, #0 +_02233E00: + mov r0, r5 + mov r1, r6 + bl ov13_02233E8C + add r6, r6, #1 + cmp r6, #5 + add r5, r5, #1 + blt _02233E00 + ldr r0, _02233E84 ; =ov13_0224F54C + ldr r1, _02233E88 ; =ov13_02245536 + mov r2, r4, lsl #1 + ldr r3, [r0, #8] + ldrh r0, [r1, r2] + ldr r2, [r3, #8] + mov r1, #0 + add r0, r2, r0, lsl #1 + mov r2, #0x1e + mov r3, #0x13 + bl ov13_022392CC + mov r5, #0 +_02233E4C: + mov r0, r4 + mov r1, r5 + bl ov13_02234028 + add r5, r5, #1 + cmp r5, #5 + add r4, r4, #1 + blt _02233E4C + bl ov13_022392B4 + ldr r0, _02233E84 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldr r0, [r0, #0x14] + bl ov13_02240E2C + bl ov13_022344F0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02233E84: .word ov13_0224F54C +_02233E88: .word ov13_02245536 + arm_func_end ov13_02233DCC + + arm_func_start ov13_02233E8C +ov13_02233E8C: ; 0x02233E8C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x24 + mov r6, r0 + mov r5, r1 + bl ov13_02239FF0 + cmp r6, #8 + addls pc, pc, r6, lsl #2 + b _02234020 +_02233EAC: ; jump table + b _02233ED0 ; case 0 + b _02233EE4 ; case 1 + b _02234020 ; case 2 + b _02233F74 ; case 3 + b _02233F98 ; case 4 + b _02233FBC ; case 5 + b _02234020 ; case 6 + b _02233FE0 ; case 7 + b _02234004 ; case 8 +_02233ED0: + mov r1, r5 + add r0, r0, #0x40 + bl ov13_02234314 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233EE4: + ldrb r1, [r0, #0xe6] + mov r1, r1, lsl #0x1e + mov r1, r1, lsr #0x1e + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _02233F28 +_02233EFC: ; jump table + b _02233F0C ; case 0 + b _02233F14 ; case 1 + b _02233F1C ; case 2 + b _02233F24 ; case 3 +_02233F0C: + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233F14: + mov r4, #0xa + b _02233F28 +_02233F1C: + mov r4, #0x1a + b _02233F28 +_02233F24: + mov r4, #0x20 +_02233F28: + ldrb r0, [r0, #0xe6] + mov r1, #0 + mov r2, #0x21 + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1a + cmp r0, #1 + addeq r0, r4, r4, lsr #31 + moveq r4, r0, asr #1 + add r0, sp, #0 + bl MI_CpuFill8 + add r0, sp, #0 + mov r2, r4 + mov r1, #0x2a + bl memset + add r0, sp, #0 + mov r1, r5 + bl ov13_02234314 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233F74: + ldrb r1, [r0, #0xf5] + cmp r1, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r0, #0xc0 + bl ov13_02234468 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233F98: + ldrb r1, [r0, #0xf5] + cmp r1, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r0, #0xf0 + bl ov13_02234468 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233FBC: + ldrb r1, [r0, #0xf5] + cmp r1, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r0, #0xc4 + bl ov13_02234468 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233FE0: + ldrb r1, [r0, #0xf6] + cmp r1, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r0, #0xc8 + bl ov13_02234468 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} +_02234004: + ldrb r1, [r0, #0xf6] + cmp r1, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r0, #0xcc + bl ov13_02234468 +_02234020: + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov13_02233E8C + + arm_func_start ov13_02234028 +ov13_02234028: ; 0x02234028 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r6, r1 + bl ov13_02239FF0 + cmp r4, #8 + addls pc, pc, r4, lsl #2 + b _0223415C +_02234044: ; jump table + b _02234068 ; case 0 + b _02234068 ; case 1 + b _02234084 ; case 2 + b _022340D0 ; case 3 + b _022340D0 ; case 4 + b _022340D0 ; case 5 + b _022340E8 ; case 6 + b _02234144 ; case 7 + b _02234144 ; case 8 +_02234068: + mov r4, #0 + mov r0, r4 + mov r5, r4 + bl ov13_0223417C + cmp r0, #0 + moveq r5, #2 + b _02234164 +_02234084: + ldr r2, _02234178 ; =ov13_0224F54C + ldrb r0, [r0, #0xf5] + ldr r3, [r2, #8] + mov r1, #0 + ldrb r2, [r3, #4] + cmp r0, #0 + movne r4, #1 + movne r0, #4 + moveq r4, #2 + moveq r0, #3 + cmp r2, #0 + mov r5, r1 + ldrb r2, [r3, #5] + movne r5, #1 + cmp r2, #0 + movne r1, #1 + mov r2, r6 + bl ov13_02234210 + b _02234164 +_022340D0: + ldrb r0, [r0, #0xf5] + mov r4, #0 + cmp r0, #0 + movne r5, #2 + moveq r5, r4 + b _02234164 +_022340E8: + ldrb r2, [r0, #0xf6] + mov r1, #0 + mov r5, r1 + cmp r2, #0 + movne r4, #1 + movne r0, #4 + bne _02234118 + ldrb r0, [r0, #0xf5] + mov r4, #2 + cmp r0, #0 + moveq r5, #2 + mov r0, #3 +_02234118: + ldr r2, _02234178 ; =ov13_0224F54C + ldr r3, [r2, #8] + ldrb r2, [r3, #6] + cmp r2, #0 + ldrb r2, [r3, #7] + movne r5, #1 + cmp r2, #0 + movne r1, #1 + mov r2, r6 + bl ov13_02234210 + b _02234164 +_02234144: + ldrb r0, [r0, #0xf6] + mov r4, #0 + cmp r0, #0 + movne r5, #2 + moveq r5, r4 + b _02234164 +_0223415C: + mov r4, #0 + mov r5, #2 +_02234164: + mov r0, r4 + mov r1, r5 + mov r2, r6 + bl ov13_02234210 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02234178: .word ov13_0224F54C + arm_func_end ov13_02234028 + + arm_func_start ov13_0223417C +ov13_0223417C: ; 0x0223417C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_02239FF0 + cmp r4, #0xa + mov r1, #1 + addls pc, pc, r4, lsl #2 + b _02234208 +_02234198: ; jump table + b _022341D4 ; case 0 + b _022341D4 ; case 1 + b _02234208 ; case 2 + b _02234208 ; case 3 + b _022341EC ; case 4 + b _022341EC ; case 5 + b _022341EC ; case 6 + b _022341C4 ; case 7 + b _02234208 ; case 8 + b _022341FC ; case 9 + b _022341FC ; case 10 +_022341C4: + ldrb r0, [r0, #0xf5] + cmp r0, #0 + moveq r1, #0 + b _02234208 +_022341D4: + ldrb r0, [r0, #0xe7] + add r0, r0, #0xff + and r0, r0, #0xff + cmp r0, #1 + movls r1, #0 + b _02234208 +_022341EC: + ldrb r0, [r0, #0xf5] + cmp r0, #0 + movne r1, #0 + b _02234208 +_022341FC: + ldrb r0, [r0, #0xf6] + cmp r0, #0 + movne r1, #0 +_02234208: + mov r0, r1 + ldmia sp!, {r4, pc} + arm_func_end ov13_0223417C + + arm_func_start ov13_02234210 +ov13_02234210: ; 0x02234210 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr r3, _02234308 ; =ov13_0224F54C + mov ip, #0xc0 + ldr r3, [r3, #8] + mov r6, r0 + mov r4, #0x8f + add r3, r3, #0x18 + sub r0, r6, #1 + mov lr, #0xcc + mov r5, r1 + strh lr, [sp] + strh ip, [sp, #2] + strh ip, [sp, #4] + strh r4, [sp, #6] + strh r4, [sp, #8] + cmp r0, #1 + add r4, r3, r2, lsl #2 + bhi _02234284 + mov r0, r2 + bl ov13_022349B8 + cmp r0, #2 + ldrne r0, _02234308 ; =ov13_0224F54C + ldrne r0, [r0, #8] + addne r4, r0, #0x30 + bne _02234284 + ldr r0, _02234308 ; =ov13_0224F54C + ldr r0, [r0, #8] + add r4, r0, #0x2c +_02234284: + ldr r0, _0223430C ; =ov13_02245526 + add r1, r6, r6, lsl #1 + add r0, r0, r1 + ldrb r1, [r5, r0] + ldr r2, [r4] + cmp r1, #0 + beq _022342EC + mov r0, #0 + bl ov13_022400F0 + add r0, sp, #0 + mov r1, r6, lsl #1 + ldrh r2, [r0, r1] + ldr r3, [r4] + ldr r0, _02234310 ; =0xFE00FF00 + ldr r1, [r3] + mov r2, r2, lsl #0x17 + and r0, r1, r0 + orr r0, r0, r2, lsr #7 + str r0, [r3] + ldr r1, [r4] + add sp, sp, #0xc + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, #0xc00 + strh r0, [r1, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_022342EC: + ldr r0, _02234310 ; =0xFE00FF00 + ldr r1, [r2] + and r0, r1, r0 + orr r0, r0, #0x1000000 + str r0, [r2] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02234308: .word ov13_0224F54C +_0223430C: .word ov13_02245526 +_02234310: .word 0xFE00FF00 + arm_func_end ov13_02234210 + + arm_func_start ov13_02234314 +ov13_02234314: ; 0x02234314 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x30 + mov r6, r0 + mov r5, r1 + add r0, sp, #0xc + mov r1, #0 + mov r2, #0x22 + bl MI_CpuFill8 + mov r0, r6 + mov r1, #0x20 + bl ov13_02242074 + mov r4, r0 + cmp r4, #0x10 + movle lr, r4 + movgt lr, #0x10 + cmp lr, #0 + mov ip, #0 + ble _02234384 + ldr r2, _02234460 ; =0x0000E01D + add r1, sp, #0xc +_02234364: + ldrb r3, [r6, ip] + mov r0, ip, lsl #1 + add ip, ip, #1 + cmp r3, #0x20 + streqh r2, [r1, r0] + strneh r3, [r1, r0] + cmp ip, lr + blt _02234364 +_02234384: + mov r0, #0x1d + mul r0, r5, r0 + mov r1, #8 + add r5, r0, #2 + str r1, [sp] + add r0, sp, #0xc + str r0, [sp, #4] + mov r1, #1 + str r1, [sp, #8] + ldr r0, _02234464 ; =ov13_0224F54C + cmp r4, #0x10 + ldr r0, [r0, #8] + addle r5, r5, #5 + ldr r0, [r0, #0x14] + mov r2, r5 + mov r1, #0x48 + mov r3, #2 + bl ov13_02240C14 + cmp r4, #0x10 + addle sp, sp, #0x30 + ldmleia sp!, {r4, r5, r6, pc} + add r0, sp, #0xc + mov r1, #0 + mov r2, #0x22 + bl MI_CpuFill8 + sub r4, r4, #0x10 + cmp r4, #0 + mov ip, #0 + ble _02234424 + ldr r2, _02234460 ; =0x0000E01D + add r1, sp, #0xc +_02234400: + add r0, r6, ip + ldrb r3, [r0, #0x10] + mov r0, ip, lsl #1 + add ip, ip, #1 + cmp r3, #0x20 + streqh r2, [r1, r0] + strneh r3, [r1, r0] + cmp ip, r4 + blt _02234400 +_02234424: + mov r1, #8 + str r1, [sp] + add r0, sp, #0xc + str r0, [sp, #4] + mov r1, #1 + str r1, [sp, #8] + ldr r0, _02234464 ; =ov13_0224F54C + add r2, r5, #0xc + ldr r0, [r0, #8] + mov r1, #0x48 + ldr r0, [r0, #0x14] + mov r3, #2 + bl ov13_02240C14 + add sp, sp, #0x30 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02234460: .word 0x0000E01D +_02234464: .word ov13_0224F54C + arm_func_end ov13_02234314 + + arm_func_start ov13_02234468 +ov13_02234468: ; 0x02234468 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x2c + mov ip, r0 + ldrb r2, [ip, #1] + mov r4, r1 + add r0, sp, #0xc + str r2, [sp] + ldrb r3, [ip, #2] + ldr r2, _022344E8 ; =ov13_022464E4 + mov r1, #0x10 + str r3, [sp, #4] + ldrb r3, [ip, #3] + str r3, [sp, #8] + ldrb r3, [ip] + bl swprintf + mov r2, #7 + mov r0, #0x1d + mul r1, r4, r0 + str r2, [sp] + add r0, sp, #0xc + str r0, [sp, #4] + mov r2, #1 + str r2, [sp, #8] + ldr r0, _022344EC ; =ov13_0224F54C + add r2, r1, #8 + ldr r0, [r0, #8] + mov r1, #0x5f + ldr r0, [r0, #0x14] + mov r3, #2 + bl ov13_02240C14 + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022344E8: .word ov13_022464E4 +_022344EC: .word ov13_0224F54C + arm_func_end ov13_02234468 + + arm_func_start ov13_022344F0 +ov13_022344F0: ; 0x022344F0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + ldr r0, _022346F4 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_DivS32 + ldr r1, _022346F4 ; =ov13_0224F54C + mov r4, r0 + ldrh r0, [r1, #4] + mov r1, #0x1d + bl FX_ModS32 + ldr r1, _022346F4 ; =ov13_0224F54C + rsb ip, r0, #0x34 + ldr r1, [r1, #8] + ldr r0, [r1, #0x34] + cmp r0, #0 + beq _02234570 + ldr r5, [r1, #0x34] + cmp r4, #0 + moveq r0, #0x26 + streq r0, [sp, #4] + movne r0, #0x100 + strne r0, [sp, #4] + ldr r2, [r5] + ldr r0, _022346F8 ; =0xFE00FF00 + ldr r3, [sp, #4] + and r0, r2, r0 + and r1, ip, #0xff + mov r2, r3, lsl #0x17 + orr r0, r0, r1 + orr r0, r0, r2, lsr #7 + str r0, [r5] +_02234570: + ldr r8, _022346F4 ; =ov13_0224F54C + ldr r6, _022346FC ; =0x01FF0000 + ldr r7, _022346F8 ; =0xFE00FF00 + mov lr, ip + mov r5, #0 +_02234584: + ldr r0, [r8, #8] + and sb, lr, #0xff + add r0, r0, r5, lsl #2 + ldr r3, [r0, #0x18] + add r5, r5, #1 + ldr r1, [r3] + cmp r5, #5 + mov r0, r1 + and r2, r1, r6 + and sl, r0, r7 + mov r2, r2, lsr #0x10 + mov r0, r2, lsl #0x17 + orr sb, sl, sb + orr r0, sb, r0, lsr #7 + str r0, [r3] + and r0, r1, #0xff + add lr, lr, #0x1d + blt _02234584 + str r0, [sp] + str r2, [sp, #4] + cmp r4, #2 + bgt _02234634 + ldr r0, _022346F4 ; =ov13_0224F54C + rsb r2, r4, #2 + ldr r0, [r0, #8] + mov r1, #0x1d + ldr r0, [r0, #0x2c] + mla r3, r2, r1, ip + ldr r2, [r0] + ldr r1, _022346FC ; =0x01FF0000 + and r6, r2, #0xff + and r1, r2, r1 + mov r7, r1, lsr #0x10 + mov r5, r2 + ldr r1, _022346F8 ; =0xFE00FF00 + and r2, r3, #0xff + and r1, r5, r1 + mov r3, r7, lsl #0x17 + orr r1, r1, r2 + orr r1, r1, r3, lsr #7 + str r7, [sp, #4] + str r6, [sp] + str r1, [r0] + b _02234654 +_02234634: + ldr r1, _022346F4 ; =ov13_0224F54C + ldr r0, _022346F8 ; =0xFE00FF00 + ldr r1, [r1, #8] + ldr r2, [r1, #0x2c] + ldr r1, [r2] + and r0, r1, r0 + orr r0, r0, #0x1000000 + str r0, [r2] +_02234654: + cmp r4, #2 + blt _022346BC + cmp r4, #6 + bgt _022346BC + ldr r0, _022346F4 ; =ov13_0224F54C + rsb r2, r4, #6 + ldr r0, [r0, #8] + mov r1, #0x1d + ldr r0, [r0, #0x30] + mla r3, r2, r1, ip + ldr r2, [r0] + ldr r1, _022346FC ; =0x01FF0000 + and r5, r2, #0xff + and r1, r2, r1 + mov r6, r1, lsr #0x10 + mov r4, r2 + ldr r1, _022346F8 ; =0xFE00FF00 + and r2, r3, #0xff + and r1, r4, r1 + mov r3, r6, lsl #0x17 + orr r1, r1, r2 + orr r1, r1, r3, lsr #7 + str r6, [sp, #4] + str r5, [sp] + str r1, [r0] + b _022346DC +_022346BC: + ldr r1, _022346F4 ; =ov13_0224F54C + ldr r0, _022346F8 ; =0xFE00FF00 + ldr r1, [r1, #8] + ldr r2, [r1, #0x30] + ldr r1, [r2] + and r0, r1, r0 + orr r0, r0, #0x1000000 + str r0, [r2] +_022346DC: + ldr r0, _022346F4 ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x44] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_022346F4: .word ov13_0224F54C +_022346F8: .word 0xFE00FF00 +_022346FC: .word 0x01FF0000 + arm_func_end ov13_022344F0 + + arm_func_start ov13_02234700 +ov13_02234700: ; 0x02234700 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r0, _02234960 ; =ov13_02245958 + bl ov13_022417DC + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0xe + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _02234964 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_DivS32 + ldr r1, _02234968 ; =ov13_022454FC + mov r5, r0 + ldrh r3, [r1, #4] + ldrh r2, [r1, #6] + add r4, sp, #0 + strh r3, [sp] + strh r2, [sp, #2] + ldrh r2, [r1, #8] + ldrh r0, [r1, #0xa] + mov r6, #0 + strh r2, [sp, #4] + strh r0, [sp, #6] +_02234760: + cmp r5, #2 + cmpne r5, #6 + beq _02234788 + mov r0, r4 + bl ov13_02241974 + cmp r0, #0 + ldrne r0, _0223496C ; =ov13_022455DC + addne sp, sp, #8 + ldrneb r0, [r0, r5] + ldmneia sp!, {r4, r5, r6, pc} +_02234788: + ldrh r0, [sp, #2] + add r6, r6, #1 + cmp r6, #4 + add r0, r0, #0x1d + strh r0, [sp, #2] + add r5, r5, #1 + blt _02234760 + ldr r0, _02234964 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_DivS32 + mov r3, #0 +_022347B8: + cmp r0, #2 + bne _02234854 + ldr r1, _02234968 ; =ov13_022454FC + mov r0, #0x1d + ldrh r5, [r1, #0x16] + ldrh r2, [r1, #0x14] + mul r4, r3, r0 + strh r2, [sp] + strh r5, [sp, #2] + ldrh r3, [r1, #0x18] + ldrh r2, [r1, #0x1a] + add r1, r5, r4 + add r0, sp, #0 + strh r3, [sp, #4] + strh r2, [sp, #6] + strh r1, [sp, #2] + bl ov13_02241974 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #2 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _02234968 ; =ov13_022454FC + add r0, sp, #0 + ldrh r5, [r1, #0xe] + ldrh r2, [r1, #0xc] + strh r5, [sp, #2] + strh r2, [sp] + ldrh r3, [r1, #0x10] + ldrh r2, [r1, #0x12] + add r1, r5, r4 + strh r3, [sp, #4] + strh r2, [sp, #6] + strh r1, [sp, #2] + bl ov13_02241974 + cmp r0, #0 + beq _02234864 + add sp, sp, #8 + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} +_02234854: + add r3, r3, #1 + cmp r3, #4 + add r0, r0, #1 + blt _022347B8 +_02234864: + ldr r0, _02234964 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_DivS32 + mov r3, #0 +_02234878: + cmp r0, #6 + bne _02234914 + ldr r1, _02234968 ; =ov13_022454FC + mov r0, #0x1d + ldrh r5, [r1, #0x16] + ldrh r2, [r1, #0x14] + mul r4, r3, r0 + strh r2, [sp] + strh r5, [sp, #2] + ldrh r3, [r1, #0x18] + ldrh r2, [r1, #0x1a] + add r1, r5, r4 + add r0, sp, #0 + strh r3, [sp, #4] + strh r2, [sp, #6] + strh r1, [sp, #2] + bl ov13_02241974 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #7 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, _02234968 ; =ov13_022454FC + add r0, sp, #0 + ldrh r5, [r1, #0xe] + ldrh r2, [r1, #0xc] + strh r5, [sp, #2] + strh r2, [sp] + ldrh r3, [r1, #0x10] + ldrh r2, [r1, #0x12] + add r1, r5, r4 + strh r3, [sp, #4] + strh r2, [sp, #6] + strh r1, [sp, #2] + bl ov13_02241974 + cmp r0, #0 + beq _02234924 + add sp, sp, #8 + mov r0, #8 + ldmia sp!, {r4, r5, r6, pc} +_02234914: + add r3, r3, #1 + cmp r3, #4 + add r0, r0, #1 + blt _02234878 +_02234924: + ldr r4, _02234970 ; =ov13_0224558A + mov r5, #0 +_0223492C: + mov r0, r4 + bl ov13_022417DC + cmp r0, #0 + addne sp, sp, #8 + addne r0, r5, #0xb + ldmneia sp!, {r4, r5, r6, pc} + add r5, r5, #1 + cmp r5, #3 + add r4, r4, #8 + blt _0223492C + mov r0, #0xe + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02234960: .word ov13_02245958 +_02234964: .word ov13_0224F54C +_02234968: .word ov13_022454FC +_0223496C: .word ov13_022455DC +_02234970: .word ov13_0224558A + arm_func_end ov13_02234700 + + arm_func_start ov13_02234974 +ov13_02234974: ; 0x02234974 + stmdb sp!, {r4, lr} + ldr r1, _022349B4 ; =ov13_0224F54C + mov r4, r0 + ldrh r0, [r1, #4] + mov r1, #0x1d + bl FX_DivS32 + mov r1, #0 +_02234990: + cmp r0, r4 + moveq r0, r1 + ldmeqia sp!, {r4, pc} + add r1, r1, #1 + cmp r1, #4 + add r0, r0, #1 + blt _02234990 + mvn r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022349B4: .word ov13_0224F54C + arm_func_end ov13_02234974 + + arm_func_start ov13_022349B8 +ov13_022349B8: ; 0x022349B8 + stmdb sp!, {r4, lr} + ldr r1, _022349D8 ; =ov13_0224F54C + mov r4, r0 + ldrh r0, [r1, #4] + mov r1, #0x1d + bl FX_DivS32 + add r0, r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022349D8: .word ov13_0224F54C + arm_func_end ov13_022349B8 + + arm_func_start ov13_022349DC +ov13_022349DC: ; 0x022349DC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl ov13_0223959C + bl ov13_02227D18 + ldr r0, _02234A9C ; =ov13_0224F54C + ldrh r1, [r0, #4] + cmp r1, #6 + subhi r1, r1, #6 + movls r1, #0 + strh r1, [r0, #4] + ldr r0, _02234A9C ; =ov13_0224F54C + mov r1, #0x1d + ldrh r0, [r0, #4] + bl FX_ModS32 + mov r5, r0 + cmp r5, #0x17 + bne _02234A28 + bl ov13_02233DCC + ldmia sp!, {r3, r4, r5, pc} +_02234A28: + ble _02234A44 + ldr r0, _02234A9C ; =ov13_0224F54C + rsb r1, r5, #0x1d + ldrh r2, [r0, #4] + mov r5, #0 + add r1, r2, r1 + strh r1, [r0, #4] +_02234A44: + bl ov13_022344F0 + cmp r5, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, _02234A9C ; =ov13_0224F54C + mov r0, #0x37 + ldrh r1, [r1, #4] + ldr r2, _02234AA0 ; =0xE1FC780F + mul r3, r1, r0 + smull r1, r0, r2, r3 + add r0, r3, r0 + mov r1, r3, lsr #0x1f + add r0, r1, r0, asr #7 + bl ov13_02239578 + bl ov13_02239584 + bl ov13_02234CA4 + ldr r0, _02234A9C ; =ov13_0224F54C + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0 + str r0, [r2, #0x38] + bl ov13_022425D0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02234A9C: .word ov13_0224F54C +_02234AA0: .word 0xE1FC780F + arm_func_end ov13_022349DC + + arm_func_start ov13_02234AA4 +ov13_02234AA4: ; 0x02234AA4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_0223959C + bl ov13_02227D18 + ldr r0, _02234B40 ; =ov13_0224F54C + mov r1, #0x1d + ldrh r2, [r0, #4] + add r2, r2, #6 + strh r2, [r0, #4] + ldrh r0, [r0, #4] + bl FX_ModS32 + cmp r0, #6 + blt _02234AE0 + bl ov13_022344F0 + ldmia sp!, {r4, pc} +_02234AE0: + ldr r1, _02234B40 ; =ov13_0224F54C + ldrh r2, [r1, #4] + sub r0, r2, r0 + strh r0, [r1, #4] + bl ov13_02233DCC + ldr r1, _02234B40 ; =ov13_0224F54C + mov r0, #0x37 + ldrh r1, [r1, #4] + ldr r2, _02234B44 ; =0xE1FC780F + mul r3, r1, r0 + smull r1, r0, r2, r3 + add r0, r3, r0 + mov r1, r3, lsr #0x1f + add r0, r1, r0, asr #7 + bl ov13_02239578 + bl ov13_02239584 + bl ov13_02234CA4 + ldr r0, _02234B40 ; =ov13_0224F54C + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0 + str r0, [r2, #0x38] + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02234B40: .word ov13_0224F54C +_02234B44: .word 0xE1FC780F + arm_func_end ov13_02234AA4 + + arm_func_start ov13_02234B48 +ov13_02234B48: ; 0x02234B48 + stmdb sp!, {r4, lr} + ldr r0, _02234BBC ; =ov13_0224F54C + ldr r1, [r0, #8] + ldrb r1, [r1, #0x44] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + ldrh r0, [r0, #4] + mov r1, #0x1d + bl FX_DivS32 + ldr r1, _02234BBC ; =ov13_0224F54C + mov r4, r0 + ldrh r0, [r1, #4] + mov r1, #0x1d + bl FX_ModS32 + ldr r2, _02234BC0 ; =ov13_022455E8 + ldr r1, _02234BC4 ; =0x01FF0000 + sub ip, r0, #0x33 + ldrb r0, [r2, r4] + ldr r2, _02234BC8 ; =0x04000010 + and r3, r1, ip, lsl #16 + add r0, ip, r0 + str r3, [r2] + and r1, r1, r0, lsl #16 + ldr r0, _02234BBC ; =ov13_0224F54C + str r1, [r2, #8] + ldr r0, [r0, #8] + mov r1, #0 + strb r1, [r0, #0x44] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02234BBC: .word ov13_0224F54C +_02234BC0: .word ov13_022455E8 +_02234BC4: .word 0x01FF0000 +_02234BC8: .word 0x04000010 + arm_func_end ov13_02234B48 + + arm_func_start ov13_02234BCC +ov13_02234BCC: ; 0x02234BCC + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr ip, _02234C90 ; =ov13_02245518 + add r3, sp, #8 + mov r2, #7 +_02234BE0: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _02234BE0 + ldr r0, _02234C94 ; =ov13_0224F54C + add r1, sp, #8 + ldrb r2, [r0] + ldrb r2, [r1, r2] + cmp r2, #3 + blt _02234C44 + mov r3, r2, lsl #3 + ldr r1, _02234C98 ; =ov13_022455A2 + ldr r2, _02234C9C ; =ov13_022455A6 + ldr r0, _02234CA0 ; =ov13_022455A4 + ldrh r1, [r1, r3] + ldrh r2, [r2, r3] + ldrh r3, [r0, r3] + mov r0, #3 + bl ov13_02227B6C + add sp, sp, #0x18 + ldmia sp!, {r3, pc} +_02234C44: + ldr r1, _02234C98 ; =ov13_022455A2 + mov lr, r2, lsl #3 + add ip, r1, r2, lsl #3 + ldrb r2, [r0, #2] + ldrh r3, [ip, #2] + mov r0, #0x1d + ldrh r1, [r1, lr] + mla r0, r2, r0, r3 + strh r0, [sp, #2] + ldrh r2, [ip, #4] + ldrh ip, [ip, #6] + ldrh r3, [sp, #2] + mov r0, #1 + strh r1, [sp] + strh r2, [sp, #4] + strh ip, [sp, #6] + bl ov13_02227B6C + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02234C90: .word ov13_02245518 +_02234C94: .word ov13_0224F54C +_02234C98: .word ov13_022455A2 +_02234C9C: .word ov13_022455A6 +_02234CA0: .word ov13_022455A4 + arm_func_end ov13_02234BCC + + arm_func_start ov13_02234CA4 +ov13_02234CA4: ; 0x02234CA4 + stmdb sp!, {r4, lr} + ldr r0, _02234D4C ; =ov13_0224F54C + ldrb r0, [r0] + add r0, r0, #0xf5 + and r0, r0, #0xff + cmp r0, #2 + bhi _02234CC8 + bl ov13_02234BCC + ldmia sp!, {r4, pc} +_02234CC8: + bl ov13_02239FF0 + ldr r1, _02234D4C ; =ov13_0224F54C + mov r4, r0 + ldrh r0, [r1, #4] + mov r1, #0x1d + bl FX_DivS32 + ldr r1, _02234D4C ; =ov13_0224F54C + ldrb r2, [r1, #2] + add r2, r2, r0 + cmp r2, #2 + beq _02234D00 + cmp r2, #6 + beq _02234D1C + b _02234D38 +_02234D00: + ldrb r0, [r4, #0xf5] + cmp r0, #0 + movne r0, #2 + strneb r0, [r1] + moveq r0, #3 + streqb r0, [r1] + b _02234D44 +_02234D1C: + ldrb r0, [r4, #0xf6] + cmp r0, #0 + movne r0, #7 + strneb r0, [r1] + moveq r0, #8 + streqb r0, [r1] + b _02234D44 +_02234D38: + ldr r0, _02234D50 ; =ov13_022455DC + ldrb r0, [r0, r2] + strb r0, [r1] +_02234D44: + bl ov13_02234BCC + ldmia sp!, {r4, pc} + .balign 4, 0 +_02234D4C: .word ov13_0224F54C +_02234D50: .word ov13_022455DC + arm_func_end ov13_02234CA4 + + arm_func_start ov13_02234D54 +ov13_02234D54: ; 0x02234D54 + stmdb sp!, {r3, lr} + ldr r1, _02234D7C ; =ov13_0224F54C + ldr r2, _02234D80 ; =ov13_022455F4 + strb r0, [r1] + ldrb r0, [r2, r0] + bl ov13_02234974 + ldr r1, _02234D7C ; =ov13_0224F54C + strb r0, [r1, #2] + bl ov13_02234BCC + ldmia sp!, {r3, pc} + .balign 4, 0 +_02234D7C: .word ov13_0224F54C +_02234D80: .word ov13_022455F4 + arm_func_end ov13_02234D54 + + arm_func_start ov13_02234D84 +ov13_02234D84: ; 0x02234D84 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov13_02239FF0 + ldr r1, _02235068 ; =ov13_0224F54C + mov r4, #0 + ldrb r2, [r1] + cmp r2, #8 + ldreqb r0, [r0, #0xf5] + cmpeq r0, #0 + bne _02234DB8 + cmp r5, #0 + cmpne r5, #2 + ldmeqia sp!, {r3, r4, r5, pc} +_02234DB8: + cmp r2, #0 + bgt _02234DC8 + beq _02234DE8 + b _02234F4C +_02234DC8: + sub r0, r2, #0xa + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _02234F4C +_02234DD8: ; jump table + b _02234E20 ; case 0 + b _02234E5C ; case 1 + b _02234EC4 ; case 2 + b _02234EC4 ; case 3 +_02234DE8: + cmp r5, #1 + bne _02234E00 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #0xb + strb r1, [r0] + b _02235048 +_02234E00: + cmp r5, #3 + movne r4, #2 + bne _02235048 + ldr r0, _02235068 ; =ov13_0224F54C + ldrb r1, [r0, #2] + add r1, r1, #1 + strb r1, [r0, #2] + b _02235048 +_02234E20: + cmp r5, #1 + bne _02234E3C + ldr r0, _02235068 ; =ov13_0224F54C + ldrb r1, [r0, #2] + sub r1, r1, #1 + strb r1, [r0, #2] + b _02235048 +_02234E3C: + cmp r5, #3 + movne r4, #2 + bne _02235048 + ldr r0, _02235068 ; =ov13_0224F54C + ldr r1, [r0, #8] + ldrb r1, [r1, #0x42] + strb r1, [r0] + b _02235048 +_02234E5C: + cmp r5, #1 + bne _02234E94 + ldr r0, _02235068 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x47] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, r4, r5, pc} +_02234E94: + cmp r5, #3 + movne r4, #2 + bne _02235048 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #0 + strb r1, [r0] + strb r1, [r0, #2] + strh r1, [r0, #4] + bl ov13_02233DCC + mov r0, #0 + bl ov13_02239578 + b _02235048 +_02234EC4: + ldr r0, _02235068 ; =ov13_0224F54C + cmp r5, #1 + ldr r1, [r0, #8] + strb r2, [r1, #0x42] + bne _02234F00 + mov r1, #0xa + strb r1, [r0] + mov r1, #3 + strb r1, [r0, #2] + mov r1, #0x91 + strh r1, [r0, #4] + bl ov13_02233DCC + mov r0, #0x37 + bl ov13_02239578 + b _02235048 +_02234F00: + cmp r5, #3 + bne _02234F34 + ldr r0, [r0, #8] + ldrb r0, [r0, #0x47] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #1 + ldr r0, [r0, #8] + strb r1, [r0, #0x47] + ldmia sp!, {r3, r4, r5, pc} +_02234F34: + cmp r2, #0xc + moveq r1, #0xd + streqb r1, [r0] + movne r1, #0xc + strneb r1, [r0] + b _02235048 +_02234F4C: + cmp r5, #1 + bne _02234F98 + ldr r0, _02235068 ; =ov13_0224F54C + ldrb r1, [r0, #2] + cmp r1, #0 + subne r1, r1, #1 + strneb r1, [r0, #2] + bne _02235048 + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _0223506C ; =ov13_022349DC + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02235068 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, r4, r5, pc} +_02234F98: + cmp r5, #3 + bne _02234FE4 + ldr r0, _02235068 ; =ov13_0224F54C + ldrb r1, [r0, #2] + cmp r1, #3 + addlo r1, r1, #1 + strlob r1, [r0, #2] + blo _02235048 + mov r0, #0x13 + bl ov13_0223ABB8 + mov r0, #0 + ldr r1, _02235070 ; =ov13_02234AA4 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02235068 ; =ov13_0224F54C + ldr r1, [r1, #8] + str r0, [r1, #0x38] + ldmia sp!, {r3, r4, r5, pc} +_02234FE4: + cmp r2, #2 + mov r4, #2 + bne _02235000 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #3 + strb r1, [r0] + b _0223503C +_02235000: + cmp r2, #3 + ldreq r0, _02235068 ; =ov13_0224F54C + streqb r4, [r0] + beq _0223503C + cmp r2, #7 + bne _02235028 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #8 + strb r1, [r0] + b _0223503C +_02235028: + cmp r2, #8 + bne _02235048 + ldr r0, _02235068 ; =ov13_0224F54C + mov r1, #7 + strb r1, [r0] +_0223503C: + mov r0, #8 + bl ov13_0223ABB8 + bl ov13_02234BCC +_02235048: + cmp r4, #2 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #8 + bl ov13_0223ABB8 + cmp r4, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov13_02234CA4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02235068: .word ov13_0224F54C +_0223506C: .word ov13_022349DC +_02235070: .word ov13_02234AA4 + arm_func_end ov13_02234D84 + + arm_func_start ov13_02235074 +ov13_02235074: ; 0x02235074 + ldr r0, _0223509C ; =ov13_0224F54C + ldr r1, _022350A0 ; =ov13_022454F8 + ldrb r2, [r0] + ldr r0, [r0, #8] + ldr ip, _022350A4 ; =ov13_02239378 + sub r2, r2, #0xb + ldrb r1, [r1, r2] + ldr r0, [r0, #0x10] + mov r2, r1 + bx ip + .balign 4, 0 +_0223509C: .word ov13_0224F54C +_022350A0: .word ov13_022454F8 +_022350A4: .word ov13_02239378 + arm_func_end ov13_02235074 + + arm_func_start ov13_022350A8 +ov13_022350A8: ; 0x022350A8 + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _022350F8 ; =ov13_0224F54C + mov r4, #0 +_022350B4: + ldr r0, [r5, #8] + add r1, r0, r4 + ldrb r0, [r1, #4] + cmp r0, #0 + beq _022350E8 + sub r0, r0, #1 + strb r0, [r1, #4] + ldr r0, [r5, #8] + add r0, r0, r4 + ldrb r0, [r0, #4] + cmp r0, #0 + bne _022350E8 + bl ov13_02233DCC +_022350E8: + add r4, r4, #1 + cmp r4, #4 + blt _022350B4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022350F8: .word ov13_0224F54C + arm_func_end ov13_022350A8 + + arm_func_start ov13_022350FC +ov13_022350FC: ; 0x022350FC + stmdb sp!, {r3} + sub sp, sp, #4 + ldr r1, _022351B8 ; =ov13_022454FC + ldr r0, _022351BC ; =ov13_0224F54C + ldrb r3, [r1] + ldrb r2, [r1, #1] + ldrb ip, [r0] + strb r3, [sp] + strb r2, [sp, #1] + ldrb r2, [r1, #2] + ldrb r0, [r1, #3] + add r1, sp, #0 + mov r3, #0 + strb r2, [sp, #2] + strb r0, [sp, #3] +_02235138: + ldrb r0, [r1] + cmp ip, r0 + bne _0223519C + ldr r0, _022351BC ; =ov13_0224F54C + mov r2, #0x14 + ldr r1, [r0, #8] + tst r3, #1 + add r1, r1, r3 + strb r2, [r1, #4] + ldr r1, [r0, #8] + beq _02235180 + sub r0, r3, #1 + add r0, r1, r0 + mov r1, #0 + strb r1, [r0, #4] + add sp, sp, #4 + ldmia sp!, {r3} + bx lr +_02235180: + add r0, r3, #1 + add r0, r1, r0 + mov r1, #0 + strb r1, [r0, #4] + add sp, sp, #4 + ldmia sp!, {r3} + bx lr +_0223519C: + add r3, r3, #1 + cmp r3, #4 + add r1, r1, #1 + blt _02235138 + add sp, sp, #4 + ldmia sp!, {r3} + bx lr + .balign 4, 0 +_022351B8: .word ov13_022454FC +_022351BC: .word ov13_0224F54C + arm_func_end ov13_022350FC + + arm_func_start ov13_022351C0 +ov13_022351C0: ; 0x022351C0 + stmdb sp!, {r4, lr} + bl ov13_02239FF0 + mov r4, r0 + ldrb r0, [r4, #0x40] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldrb r0, [r4, #0xf6] + cmp r0, #0 + bne _0223520C + add r0, r4, #0xc8 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + bne _0223520C + add r0, r4, #0xcc + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_0223520C: + ldrb r0, [r4, #0xf5] + cmp r0, #0 + bne _02235258 + add r0, r4, #0xc0 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0xc4 + bl DWC_BACKUPlCheckAddress + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0xc0 + add r1, r4, #0xf0 + bl DWC_BACKUPlCheckIp + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_02235258: + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov13_022351C0 + + arm_func_start ov13_02235260 +ov13_02235260: ; 0x02235260 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02235298 ; =ov13_0224F54C + ldr r0, [r0, #8] + ldr r0, [r0, #0xc] + bl ov13_022393E0 + ldr r0, _0223529C ; =ov13_022352A0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235298: .word ov13_0224F54C +_0223529C: .word ov13_022352A0 + arm_func_end ov13_02235260 + + arm_func_start ov13_022352A0 +ov13_022352A0: ; 0x022352A0 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022352BC ; =ov13_022332D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022352BC: .word ov13_022332D8 + arm_func_end ov13_022352A0 + + arm_func_start ov13_022352C0 +ov13_022352C0: ; 0x022352C0 + ldr r1, _022352CC ; =ov13_0224F54C + strb r0, [r1, #1] + bx lr + .balign 4, 0 +_022352CC: .word ov13_0224F54C + arm_func_end ov13_022352C0 + + arm_func_start ov13_022352D0 +ov13_022352D0: ; 0x022352D0 + stmdb sp!, {r3, lr} + bl ov13_022352F0 + bl ov13_02227E40 + bl ov13_0223A4F4 + ldr r0, _022352EC ; =ov13_02235384 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022352EC: .word ov13_02235384 + arm_func_end ov13_022352D0 + + arm_func_start ov13_022352F0 +ov13_022352F0: ; 0x022352F0 + stmdb sp!, {r3, lr} + ldr r0, _02235364 ; =ov13_02246504 + ldr r1, _02235368 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0223536C ; =ov13_0224651C + ldr r1, _02235370 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02235374 ; =ov13_02246534 + ldr r1, _02235378 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r2, _0223537C ; =0x04001008 + ldr r1, _02235380 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235364: .word ov13_02246504 +_02235368: .word GX_LoadBG2Char +_0223536C: .word ov13_0224651C +_02235370: .word GX_LoadBGPltt +_02235374: .word ov13_02246534 +_02235378: .word GX_LoadBG2Scr +_0223537C: .word 0x04001008 +_02235380: .word 0x0400000A + arm_func_end ov13_022352F0 + + arm_func_start ov13_02235384 +ov13_02235384: ; 0x02235384 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _022353D4 ; =ov13_022353D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022353D4: .word ov13_022353D8 + arm_func_end ov13_02235384 + + arm_func_start ov13_022353D8 +ov13_022353D8: ; 0x022353D8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r2, #1 + mov ip, #0 + sub r3, r2, #2 + mov r0, #0x44 + mov r1, #5 + str ip, [sp] + bl ov13_0223BE6C + ldr r0, _02235424 ; =ov13_02235428 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235424: .word ov13_02235428 + arm_func_end ov13_022353D8 + + arm_func_start ov13_02235428 +ov13_02235428: ; 0x02235428 + stmdb sp!, {r3, lr} + bl ov13_02235450 + bl ov13_02235454 + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223544C ; =ov13_02235458 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223544C: .word ov13_02235458 + arm_func_end ov13_02235428 + + arm_func_start ov13_02235450 +ov13_02235450: ; 0x02235450 + bx lr + arm_func_end ov13_02235450 + + arm_func_start ov13_02235454 +ov13_02235454: ; 0x02235454 + bx lr + arm_func_end ov13_02235454 + + arm_func_start ov13_02235458 +ov13_02235458: ; 0x02235458 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02235490 ; =ov13_02235494 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235490: .word ov13_02235494 + arm_func_end ov13_02235458 + + arm_func_start ov13_02235494 +ov13_02235494: ; 0x02235494 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _022354EC ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022354EC: .word ov13_022368D8 + arm_func_end ov13_02235494 + + arm_func_start ov13_022354F0 +ov13_022354F0: ; 0x022354F0 + ldr r0, _0223550C ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0223550C: .word 0x027FFFA8 + arm_func_end ov13_022354F0 + + arm_func_start ov13_02235510 +ov13_02235510: ; 0x02235510 + stmdb sp!, {r3, lr} + ldr r0, _02235544 ; =ov13_0224F558 + mov r1, #0 + strb r1, [r0] + bl ov13_0223554C + bl ov13_02227E40 + mov r0, #0x25 + bl ov13_022279EC + mov r0, #1 + bl ov13_02226F58 + ldr r0, _02235548 ; =ov13_022355CC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235544: .word ov13_0224F558 +_02235548: .word ov13_022355CC + arm_func_end ov13_02235510 + + arm_func_start ov13_0223554C +ov13_0223554C: ; 0x0223554C + stmdb sp!, {r3, lr} + ldr r0, _022355BC ; =ov13_02246548 + ldr r1, _022355C0 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _022355C4 ; =0x04001008 + ldr r1, _022355C8 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022355BC: .word ov13_02246548 +_022355C0: .word GX_LoadBG2Scr +_022355C4: .word 0x04001008 +_022355C8: .word 0x0400000A + arm_func_end ov13_0223554C + + arm_func_start ov13_022355CC +ov13_022355CC: ; 0x022355CC + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _022355FC ; =ov13_02235600 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022355FC: .word ov13_02235600 + arm_func_end ov13_022355CC + + arm_func_start ov13_02235600 +ov13_02235600: ; 0x02235600 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_022279B4 + ldr r0, _02235628 ; =ov13_0223562C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235628: .word ov13_0223562C + arm_func_end ov13_02235600 + + arm_func_start ov13_0223562C +ov13_0223562C: ; 0x0223562C + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02235650 ; =ov13_02235654 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235650: .word ov13_02235654 + arm_func_end ov13_0223562C + + arm_func_start ov13_02235654 +ov13_02235654: ; 0x02235654 + stmdb sp!, {r3, lr} + mov r0, #0xa + bl OS_Sleep + bl ov13_02235838 + bl ov13_02235674 + bl ov13_022356AC + bl ov13_022356B0 + ldmia sp!, {r3, pc} + arm_func_end ov13_02235654 + + arm_func_start ov13_02235674 +ov13_02235674: ; 0x02235674 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02235694 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_02235694: + bl ov13_022354F0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02235674 + + arm_func_start ov13_022356AC +ov13_022356AC: ; 0x022356AC + bx lr + arm_func_end ov13_022356AC + + arm_func_start ov13_022356B0 +ov13_022356B0: ; 0x022356B0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _022356D8 ; =ov13_022356DC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022356D8: .word ov13_022356DC + arm_func_end ov13_022356B0 + + arm_func_start ov13_022356DC +ov13_022356DC: ; 0x022356DC + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _022356F8 ; =ov13_022356FC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022356F8: .word ov13_022356FC + arm_func_end ov13_022356DC + + arm_func_start ov13_022356FC +ov13_022356FC: ; 0x022356FC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02235768 ; =ov13_0224F558 + ldrb r0, [r0] + cmp r0, #0 + bne _02235724 + bl ov13_02227228 +_02235724: + ldr r0, _02235768 ; =ov13_0224F558 + ldrb r0, [r0] + cmp r0, #0 + bne _02235748 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_02235748: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _0223576C ; =ov13_02235770 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235768: .word ov13_0224F558 +_0223576C: .word ov13_02235770 + arm_func_end ov13_022356FC + + arm_func_start ov13_02235770 +ov13_02235770: ; 0x02235770 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223582C ; =ov13_0224F558 + ldrb r0, [r0] + cmp r0, #0 + bne _022357A4 + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_022357A4: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0223582C ; =ov13_0224F558 + ldrb r0, [r0] + cmp r0, #0 + bne _022357DC + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_022357DC: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0223582C ; =ov13_0224F558 + ldrb r0, [r0] + cmp r0, #0 + bne _02235814 + bl ov13_0222BFCC + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02235830 ; =ov13_02237618 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02235814: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _02235834 ; =ov13_02235928 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223582C: .word ov13_0224F558 +_02235830: .word ov13_02237618 +_02235834: .word ov13_02235928 + arm_func_end ov13_02235770 + + arm_func_start ov13_02235838 +ov13_02235838: ; 0x02235838 + stmdb sp!, {r3, lr} + bl ov13_0222BFF0 + cmp r0, #2 + beq _02235854 + cmp r0, #4 + beq _0223586C + ldmia sp!, {r3, pc} +_02235854: + ldr r1, _022358B0 ; =ov13_0224F558 + mov r2, #1 + ldr r0, _022358B4 ; =ov13_022356DC + strb r2, [r1] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0223586C: + ldr r0, _022358B0 ; =ov13_0224F558 + mov r1, #0 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #9 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xd + str ip, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _022358B8 ; =ov13_022358BC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022358B0: .word ov13_0224F558 +_022358B4: .word ov13_022356DC +_022358B8: .word ov13_022358BC + arm_func_end ov13_02235838 + + arm_func_start ov13_022358BC +ov13_022358BC: ; 0x022358BC + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _022358E4 ; =ov13_022358E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022358E4: .word ov13_022358E8 + arm_func_end ov13_022358BC + + arm_func_start ov13_022358E8 +ov13_022358E8: ; 0x022358E8 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02235904 ; =ov13_022356DC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235904: .word ov13_022356DC + arm_func_end ov13_022358E8 + + arm_func_start ov13_02235908 +ov13_02235908: ; 0x02235908 + ldr r0, _02235924 ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_02235924: .word 0x027FFFA8 + arm_func_end ov13_02235908 + + arm_func_start ov13_02235928 +ov13_02235928: ; 0x02235928 + stmdb sp!, {r3, lr} + ldr r0, _0223595C ; =ov13_0224F55C + mov r1, #0 + strb r1, [r0] + bl ov13_02235964 + bl ov13_02227E40 + mov r0, #0x2a + bl ov13_022279EC + mov r0, #2 + bl ov13_02226F58 + ldr r0, _02235960 ; =ov13_022359E4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223595C: .word ov13_0224F55C +_02235960: .word ov13_022359E4 + arm_func_end ov13_02235928 + + arm_func_start ov13_02235964 +ov13_02235964: ; 0x02235964 + stmdb sp!, {r3, lr} + ldr r0, _022359D4 ; =ov13_0224655C + ldr r1, _022359D8 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _022359DC ; =0x04001008 + ldr r1, _022359E0 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022359D4: .word ov13_0224655C +_022359D8: .word GX_LoadBG2Scr +_022359DC: .word 0x04001008 +_022359E0: .word 0x0400000A + arm_func_end ov13_02235964 + + arm_func_start ov13_022359E4 +ov13_022359E4: ; 0x022359E4 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02235A14 ; =ov13_02235A18 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235A14: .word ov13_02235A18 + arm_func_end ov13_022359E4 + + arm_func_start ov13_02235A18 +ov13_02235A18: ; 0x02235A18 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_022279B4 + ldr r0, _02235A40 ; =ov13_02235A44 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235A40: .word ov13_02235A44 + arm_func_end ov13_02235A18 + + arm_func_start ov13_02235A44 +ov13_02235A44: ; 0x02235A44 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02235A68 ; =ov13_02235A6C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235A68: .word ov13_02235A6C + arm_func_end ov13_02235A44 + + arm_func_start ov13_02235A6C +ov13_02235A6C: ; 0x02235A6C + stmdb sp!, {r3, lr} + mov r0, #0xa + bl OS_Sleep + bl ov13_02235C34 + bl ov13_02235A8C + bl ov13_02235AC4 + bl ov13_02235AC8 + ldmia sp!, {r3, pc} + arm_func_end ov13_02235A6C + + arm_func_start ov13_02235A8C +ov13_02235A8C: ; 0x02235A8C + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02235AAC + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_02235AAC: + bl ov13_02235908 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02235A8C + + arm_func_start ov13_02235AC4 +ov13_02235AC4: ; 0x02235AC4 + bx lr + arm_func_end ov13_02235AC4 + + arm_func_start ov13_02235AC8 +ov13_02235AC8: ; 0x02235AC8 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _02235AF0 ; =ov13_02235AF4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235AF0: .word ov13_02235AF4 + arm_func_end ov13_02235AC8 + + arm_func_start ov13_02235AF4 +ov13_02235AF4: ; 0x02235AF4 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02235B10 ; =ov13_02235B14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235B10: .word ov13_02235B14 + arm_func_end ov13_02235AF4 + + arm_func_start ov13_02235B14 +ov13_02235B14: ; 0x02235B14 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _02235B70 ; =ov13_0224F55C + ldrb r0, [r0] + cmp r0, #0 + bne _02235B50 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_02235B50: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02235B74 ; =ov13_02235B78 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235B70: .word ov13_0224F55C +_02235B74: .word ov13_02235B78 + arm_func_end ov13_02235B14 + + arm_func_start ov13_02235B78 +ov13_02235B78: ; 0x02235B78 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02235C28 ; =ov13_0224F55C + ldrb r0, [r0] + cmp r0, #0 + bne _02235BAC + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_02235BAC: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _02235C28 ; =ov13_0224F55C + ldrb r0, [r0] + cmp r0, #0 + bne _02235BE4 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_02235BE4: + bl ov13_0222BFCC + ldr r0, _02235C28 ; =ov13_0224F55C + ldrb r0, [r0] + cmp r0, #0 + bne _02235C10 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02235C2C ; =ov13_02237618 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02235C10: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _02235C30 ; =ov13_02235D58 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235C28: .word ov13_0224F55C +_02235C2C: .word ov13_02237618 +_02235C30: .word ov13_02235D58 + arm_func_end ov13_02235B78 + + arm_func_start ov13_02235C34 +ov13_02235C34: ; 0x02235C34 + stmdb sp!, {r3, lr} + bl ov13_0222BFF0 + cmp r0, #3 + beq _02235C58 + cmp r0, #4 + beq _02235C78 + cmp r0, #5 + beq _02235CBC + ldmia sp!, {r3, pc} +_02235C58: + ldr r0, _02235D00 ; =ov13_0224F55C + mov r1, #1 + strb r1, [r0] + bl ov13_0223AC20 + bl ov13_0222C0AC + ldr r0, _02235D04 ; =ov13_02235AF4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02235C78: + ldr r0, _02235D00 ; =ov13_0224F55C + mov r1, #0 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #9 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xd + str ip, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _02235D08 ; =ov13_02235D0C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02235CBC: + ldr r0, _02235D00 ; =ov13_0224F55C + mov r1, #0 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #0x12 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xe + str ip, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _02235D08 ; =ov13_02235D0C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235D00: .word ov13_0224F55C +_02235D04: .word ov13_02235AF4 +_02235D08: .word ov13_02235D0C + arm_func_end ov13_02235C34 + + arm_func_start ov13_02235D0C +ov13_02235D0C: ; 0x02235D0C + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02235D34 ; =ov13_02235D38 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235D34: .word ov13_02235D38 + arm_func_end ov13_02235D0C + + arm_func_start ov13_02235D38 +ov13_02235D38: ; 0x02235D38 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02235D54 ; =ov13_02235AF4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235D54: .word ov13_02235AF4 + arm_func_end ov13_02235D38 + + arm_func_start ov13_02235D58 +ov13_02235D58: ; 0x02235D58 + stmdb sp!, {r3, lr} + ldr r0, _02235D8C ; =ov13_0224F560 + mov r1, #0 + strb r1, [r0] + bl ov13_02235D94 + bl ov13_02227E40 + mov r0, #0x26 + bl ov13_022279EC + mov r0, #0x10 + bl ov13_0223ABB8 + ldr r0, _02235D90 ; =ov13_02235E14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235D8C: .word ov13_0224F560 +_02235D90: .word ov13_02235E14 + arm_func_end ov13_02235D58 + + arm_func_start ov13_02235D94 +ov13_02235D94: ; 0x02235D94 + stmdb sp!, {r3, lr} + ldr r0, _02235E04 ; =ov13_02246570 + ldr r1, _02235E08 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02235E0C ; =0x04001008 + ldr r1, _02235E10 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235E04: .word ov13_02246570 +_02235E08: .word GX_LoadBG2Scr +_02235E0C: .word 0x04001008 +_02235E10: .word 0x0400000A + arm_func_end ov13_02235D94 + + arm_func_start ov13_02235E14 +ov13_02235E14: ; 0x02235E14 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02235E44 ; =ov13_02235E48 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235E44: .word ov13_02235E48 + arm_func_end ov13_02235E14 + + arm_func_start ov13_02235E48 +ov13_02235E48: ; 0x02235E48 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02235E68 ; =ov13_02235E6C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235E68: .word ov13_02235E6C + arm_func_end ov13_02235E48 + + arm_func_start ov13_02235E6C +ov13_02235E6C: ; 0x02235E6C + stmdb sp!, {r3, lr} + bl ov13_02235F2C + bl ov13_02235E7C + ldmia sp!, {r3, pc} + arm_func_end ov13_02235E6C + + arm_func_start ov13_02235E7C +ov13_02235E7C: ; 0x02235E7C + bx lr + arm_func_end ov13_02235E7C + + arm_func_start ov13_02235E80 +ov13_02235E80: ; 0x02235E80 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02235EB8 ; =ov13_02235EBC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235EB8: .word ov13_02235EBC + arm_func_end ov13_02235E80 + + arm_func_start ov13_02235EBC +ov13_02235EBC: ; 0x02235EBC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, #1 + bl ov13_0222B934 + ldr r0, _02235F28 ; =ov13_02238440 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235F28: .word ov13_02238440 + arm_func_end ov13_02235EBC + + arm_func_start ov13_02235F2C +ov13_02235F2C: ; 0x02235F2C + stmdb sp!, {r3, lr} + ldr r0, _02235F58 ; =ov13_0224F560 + ldrb r1, [r0] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0] + cmp r1, #0x78 + ldmloia sp!, {r3, pc} + ldr r0, _02235F5C ; =ov13_02235E80 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235F58: .word ov13_0224F560 +_02235F5C: .word ov13_02235E80 + arm_func_end ov13_02235F2C + + arm_func_start ov13_02235F60 +ov13_02235F60: ; 0x02235F60 + ldr r0, _02235F7C ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_02235F7C: .word 0x027FFFA8 + arm_func_end ov13_02235F60 + + arm_func_start ov13_02235F80 +ov13_02235F80: ; 0x02235F80 + stmdb sp!, {r3, lr} + ldr r0, _02235FD4 ; =ov13_0224F564 + mov r1, #0 + strb r1, [r0] + bl ov13_02235FDC + bl ov13_02227E40 + mov r0, #0x37 + sub r1, r0, #0x38 + mov r2, #0 + bl ov13_022277B8 + mov r0, #2 + bl ov13_02227964 + mov r0, #0x24 + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + mov r0, #0xb + bl ov13_0223ABB8 + ldr r0, _02235FD8 ; =ov13_02236084 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02235FD4: .word ov13_0224F564 +_02235FD8: .word ov13_02236084 + arm_func_end ov13_02235F80 + + arm_func_start ov13_02235FDC +ov13_02235FDC: ; 0x02235FDC + stmdb sp!, {r3, lr} + ldr r0, _02236064 ; =ov13_02246584 + ldr r1, _02236068 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0223606C ; =ov13_0224659C + ldr r1, _02236070 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02236074 ; =ov13_022465B4 + ldr r1, _02236078 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0223607C ; =0x04001008 + ldr r1, _02236080 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236064: .word ov13_02246584 +_02236068: .word GX_LoadBG2Char +_0223606C: .word ov13_0224659C +_02236070: .word GX_LoadBGPltt +_02236074: .word ov13_022465B4 +_02236078: .word GX_LoadBG2Scr +_0223607C: .word 0x04001008 +_02236080: .word 0x0400000A + arm_func_end ov13_02235FDC + + arm_func_start ov13_02236084 +ov13_02236084: ; 0x02236084 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _022360D4 ; =ov13_022360D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022360D4: .word ov13_022360D8 + arm_func_end ov13_02236084 + + arm_func_start ov13_022360D8 +ov13_022360D8: ; 0x022360D8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0222BF60 + mov r0, #1 + bl ov13_022279B4 + ldr r0, _02236114 ; =ov13_02236118 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236114: .word ov13_02236118 + arm_func_end ov13_022360D8 + + arm_func_start ov13_02236118 +ov13_02236118: ; 0x02236118 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _0223613C ; =ov13_02236140 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223613C: .word ov13_02236140 + arm_func_end ov13_02236118 + + arm_func_start ov13_02236140 +ov13_02236140: ; 0x02236140 + stmdb sp!, {r3, lr} + mov r0, #0xa + bl OS_Sleep + bl ov13_02236324 + bl ov13_02236160 + bl ov13_02236198 + bl ov13_0223619C + ldmia sp!, {r3, pc} + arm_func_end ov13_02236140 + + arm_func_start ov13_02236160 +ov13_02236160: ; 0x02236160 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02236180 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_02236180: + bl ov13_02235F60 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02236160 + + arm_func_start ov13_02236198 +ov13_02236198: ; 0x02236198 + bx lr + arm_func_end ov13_02236198 + + arm_func_start ov13_0223619C +ov13_0223619C: ; 0x0223619C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _022361C4 ; =ov13_022361C8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022361C4: .word ov13_022361C8 + arm_func_end ov13_0223619C + + arm_func_start ov13_022361C8 +ov13_022361C8: ; 0x022361C8 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _022361E4 ; =ov13_022361E8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022361E4: .word ov13_022361E8 + arm_func_end ov13_022361C8 + + arm_func_start ov13_022361E8 +ov13_022361E8: ; 0x022361E8 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02236254 ; =ov13_0224F564 + ldrb r0, [r0] + cmp r0, #0 + bne _02236210 + bl ov13_02227228 +_02236210: + ldr r0, _02236254 ; =ov13_0224F564 + ldrb r0, [r0] + cmp r0, #0 + bne _02236234 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_02236234: + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02236258 ; =ov13_0223625C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236254: .word ov13_0224F564 +_02236258: .word ov13_0223625C + arm_func_end ov13_022361E8 + + arm_func_start ov13_0223625C +ov13_0223625C: ; 0x0223625C + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02236318 ; =ov13_0224F564 + ldrb r0, [r0] + cmp r0, #0 + bne _02236290 + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_02236290: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _02236318 ; =ov13_0224F564 + ldrb r0, [r0] + cmp r0, #0 + bne _022362C8 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_022362C8: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _02236318 ; =ov13_0224F564 + ldrb r0, [r0] + cmp r0, #0 + bne _02236300 + bl ov13_0222BFCC + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _0223631C ; =ov13_02237618 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02236300: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _02236320 ; =ov13_02235510 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236318: .word ov13_0224F564 +_0223631C: .word ov13_02237618 +_02236320: .word ov13_02235510 + arm_func_end ov13_0223625C + + arm_func_start ov13_02236324 +ov13_02236324: ; 0x02236324 + stmdb sp!, {r3, lr} + bl ov13_0222BFF0 + cmp r0, #1 + beq _02236340 + cmp r0, #4 + beq _02236358 + ldmia sp!, {r3, pc} +_02236340: + ldr r1, _0223639C ; =ov13_0224F564 + mov r2, #1 + ldr r0, _022363A0 ; =ov13_022361C8 + strb r2, [r1] + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02236358: + ldr r0, _0223639C ; =ov13_0224F564 + mov r1, #0 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #9 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xd + str ip, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _022363A4 ; =ov13_022363A8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223639C: .word ov13_0224F564 +_022363A0: .word ov13_022361C8 +_022363A4: .word ov13_022363A8 + arm_func_end ov13_02236324 + + arm_func_start ov13_022363A8 +ov13_022363A8: ; 0x022363A8 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _022363D0 ; =ov13_022363D4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022363D0: .word ov13_022363D4 + arm_func_end ov13_022363A8 + + arm_func_start ov13_022363D4 +ov13_022363D4: ; 0x022363D4 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022363F0 ; =ov13_022361C8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022363F0: .word ov13_022361C8 + arm_func_end ov13_022363D4 + + arm_func_start ov13_022363F4 +ov13_022363F4: ; 0x022363F4 + stmdb sp!, {r3, lr} + ldr r0, _02236454 ; =ov13_0224F568 + mov r1, #0 + strh r1, [r0, #2] + strb r1, [r0] + bl ov13_0223645C + mov r0, #0x33 + sub r1, r0, #0x34 + mov r2, #0 + bl ov13_022277B8 + bl ov13_02227E40 + mov r0, #2 + bl ov13_02227964 + mov r0, #0x33 + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + bl ov13_02239B00 + bl ov13_02239B68 + mov r0, #0xa + bl ov13_0223ABB8 + ldr r0, _02236458 ; =ov13_02236504 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236454: .word ov13_0224F568 +_02236458: .word ov13_02236504 + arm_func_end ov13_022363F4 + + arm_func_start ov13_0223645C +ov13_0223645C: ; 0x0223645C + stmdb sp!, {r3, lr} + ldr r0, _022364E4 ; =ov13_022465C8 + ldr r1, _022364E8 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _022364EC ; =ov13_022465E0 + ldr r1, _022364F0 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _022364F4 ; =ov13_022465F8 + ldr r1, _022364F8 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _022364FC ; =0x04001008 + ldr r1, _02236500 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022364E4: .word ov13_022465C8 +_022364E8: .word GX_LoadBG2Char +_022364EC: .word ov13_022465E0 +_022364F0: .word GX_LoadBGPltt +_022364F4: .word ov13_022465F8 +_022364F8: .word GX_LoadBG2Scr +_022364FC: .word 0x04001008 +_02236500: .word 0x0400000A + arm_func_end ov13_0223645C + + arm_func_start ov13_02236504 +ov13_02236504: ; 0x02236504 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02236554 ; =ov13_02236558 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236554: .word ov13_02236558 + arm_func_end ov13_02236504 + + arm_func_start ov13_02236558 +ov13_02236558: ; 0x02236558 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + bl ov13_022279B4 + ldr r0, _02236590 ; =ov13_02236594 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236590: .word ov13_02236594 + arm_func_end ov13_02236558 + + arm_func_start ov13_02236594 +ov13_02236594: ; 0x02236594 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _022365B8 ; =ov13_022365BC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022365B8: .word ov13_022365BC + arm_func_end ov13_02236594 + + arm_func_start ov13_022365BC +ov13_022365BC: ; 0x022365BC + stmdb sp!, {r3, lr} + bl ov13_022366FC + bl ov13_02236720 + bl ov13_02236724 + bl ov13_022365D4 + ldmia sp!, {r3, pc} + arm_func_end ov13_022365BC + + arm_func_start ov13_022365D4 +ov13_022365D4: ; 0x022365D4 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _022366F0 ; =ov13_0224F568 + ldrh r1, [r0, #2] + add r1, r1, #1 + strh r1, [r0, #2] + ldrh r0, [r0, #2] + cmp r0, #0x12c + addlo sp, sp, #8 + ldmloia sp!, {r3, pc} + bl ov13_0223AC20 + add r0, sp, #4 + bl ov13_02239D04 + cmp r0, #0 + bne _02236654 + ldr r0, _022366F0 ; =ov13_0224F568 + mov r1, #1 + mov r3, #2 + strb r3, [r0] + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xf + str ip, [sp] + bl ov13_0223BE6C + mov r0, #0x12 + bl ov13_0223ABB8 + bl ov13_022272E4 + ldr r0, _022366F4 ; =ov13_0223688C + bl ov13_0222B8E8 + add sp, sp, #8 + ldmia sp!, {r3, pc} +_02236654: + cmp r0, #0 + mov r2, #0 + ble _02236680 + ldr r3, [sp, #4] +_02236664: + ldrb r1, [r3, #0x28] + cmp r1, #2 + bne _02236680 + add r2, r2, #1 + cmp r2, r0 + add r3, r3, #0x2a + blt _02236664 +_02236680: + cmp r2, r0 + bne _022366CC + ldr r0, _022366F0 ; =ov13_0224F568 + mov r1, #1 + mov r3, #3 + strb r3, [r0] + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0xe + str ip, [sp] + bl ov13_0223BE6C + mov r0, #0x12 + bl ov13_0223ABB8 + bl ov13_022272E4 + ldr r0, _022366F4 ; =ov13_0223688C + bl ov13_0222B8E8 + add sp, sp, #8 + ldmia sp!, {r3, pc} +_022366CC: + ldr r1, _022366F0 ; =ov13_0224F568 + mov r2, #1 + mov r0, #0xf + strb r2, [r1] + bl ov13_0223ABB8 + ldr r0, _022366F8 ; =ov13_02236750 + bl ov13_0222B8E8 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022366F0: .word ov13_0224F568 +_022366F4: .word ov13_0223688C +_022366F8: .word ov13_02236750 + arm_func_end ov13_022365D4 + + arm_func_start ov13_022366FC +ov13_022366FC: ; 0x022366FC + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_022366FC + + arm_func_start ov13_02236720 +ov13_02236720: ; 0x02236720 + bx lr + arm_func_end ov13_02236720 + + arm_func_start ov13_02236724 +ov13_02236724: ; 0x02236724 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _0223674C ; =ov13_02236750 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223674C: .word ov13_02236750 + arm_func_end ov13_02236724 + + arm_func_start ov13_02236750 +ov13_02236750: ; 0x02236750 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _0223676C ; =ov13_02236770 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223676C: .word ov13_02236770 + arm_func_end ov13_02236750 + + arm_func_start ov13_02236770 +ov13_02236770: ; 0x02236770 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _022367BC ; =ov13_022367C0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022367BC: .word ov13_022367C0 + arm_func_end ov13_02236770 + + arm_func_start ov13_022367C0 +ov13_022367C0: ; 0x022367C0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} +_022367F0: + bl ov13_02239C68 + cmp r0, #0 + beq _022367F0 + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _02236880 ; =ov13_0224F568 + ldrb r0, [r0] + cmp r0, #1 + beq _0223685C + bl ov13_02239B34 + bl ov13_02239FF0 + ldrb r0, [r0, #0xf4] + bl ov13_0223A414 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02236884 ; =ov13_02237618 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0223685C: + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + ldr r0, _02236888 ; =ov13_0222FA3C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236880: .word ov13_0224F568 +_02236884: .word ov13_02237618 +_02236888: .word ov13_0222FA3C + arm_func_end ov13_022367C0 + + arm_func_start ov13_0223688C +ov13_0223688C: ; 0x0223688C + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _022368B4 ; =ov13_022368B8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022368B4: .word ov13_022368B8 + arm_func_end ov13_0223688C + + arm_func_start ov13_022368B8 +ov13_022368B8: ; 0x022368B8 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022368D4 ; =ov13_02236750 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022368D4: .word ov13_02236750 + arm_func_end ov13_022368B8 + + arm_func_start ov13_022368D8 +ov13_022368D8: ; 0x022368D8 + stmdb sp!, {r3, lr} + mov r0, #0x20 + mov r1, #4 + bl ov13_0224128C + ldr r1, _02236930 ; =ov13_0224F56C + mov r2, #0 + str r0, [r1, #4] + strb r2, [r0, #0x1d] + bl ov13_02236938 + mov r0, #1 + bl ov13_02227DE4 + mov r0, #0x2f + sub r1, r0, #0x30 + mov r2, #0 + bl ov13_022277B8 + mov r0, #0 + bl ov13_02227964 + bl ov13_02236A48 + bl ov13_022370B8 + ldr r0, _02236934 ; =ov13_02236B50 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236930: .word ov13_0224F56C +_02236934: .word ov13_02236B50 + arm_func_end ov13_022368D8 + + arm_func_start ov13_02236938 +ov13_02236938: ; 0x02236938 + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr ip, _02236A18 ; =ov13_0224560C + add r3, sp, #0 + mov r2, #0xb +_0223694C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0223694C + ldr r0, _02236A1C ; =ov13_0224660C + ldr r1, _02236A20 ; =GX_LoadOBJPltt + bl ov13_02227924 + ldr r0, _02236A24 ; =ov13_02246620 + ldr r1, _02236A28 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _02236A2C ; =ov13_02246638 + ldr r1, _02236A30 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02236A34 ; =ov13_02246650 + ldr r1, _02236A38 ; =GX_LoadBG2Scr + bl ov13_02227924 + add r0, sp, #0 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r2, _02236A3C ; =ov13_0224F56C + mov r1, #0x10 + ldr r2, [r2, #4] + str r0, [r2] + mov r0, #1 + bl ov13_02240EA8 + ldr r2, _02236A40 ; =0x04001008 + ldr r1, _02236A44 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236A18: .word ov13_0224560C +_02236A1C: .word ov13_0224660C +_02236A20: .word GX_LoadOBJPltt +_02236A24: .word ov13_02246620 +_02236A28: .word GX_LoadBG2Char +_02236A2C: .word ov13_02246638 +_02236A30: .word GX_LoadBGPltt +_02236A34: .word ov13_02246650 +_02236A38: .word GX_LoadBG2Scr +_02236A3C: .word ov13_0224F56C +_02236A40: .word 0x04001008 +_02236A44: .word 0x0400000A + arm_func_end ov13_02236938 + + arm_func_start ov13_02236A48 +ov13_02236A48: ; 0x02236A48 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, #0 + ldr r6, _02236B44 ; =ov13_02245622 + ldr r5, _02236B48 ; =ov13_02245600 + ldr r4, _02236B4C ; =ov13_0224F56C + mov fp, sl + mvn r7, #0 + mov r8, #3 +_02236A68: + mov r0, sl + bl ov13_0223A3FC + mov sb, r0 + cmp sb, #0xff + moveq sb, r8 + beq _02236ADC + mov r0, fp + mov r1, #0x11 + mov r2, #1 + bl ov13_022401B0 + ldr r1, [r4, #4] + add r3, sl, #3 + add r1, r1, sl, lsl #2 + str r0, [r1, #0x10] + mov r2, r3, lsl #2 + ldr r0, [r4, #4] + add r3, r6, r3, lsl #2 + add r0, r0, sl, lsl #2 + ldrh r2, [r6, r2] + ldrh r3, [r3, #2] + ldr r0, [r0, #0x10] + mov r1, r7 + bl ov13_0223FF18 + ldr r0, [r4, #4] + mov r1, r7 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #0x10] + mov r2, #3 + bl ov13_02240008 +_02236ADC: + ldrb r1, [r5, sb] + mov r0, #0 + mov r2, #1 + bl ov13_022401B0 + ldr r1, [r4, #4] + mov r2, sl, lsl #2 + add r1, r1, sl, lsl #2 + str r0, [r1, #4] + ldr r0, [r4, #4] + add r3, r6, sl, lsl #2 + add r0, r0, sl, lsl #2 + ldrh r2, [r6, r2] + ldrh r3, [r3, #2] + ldr r0, [r0, #4] + mov r1, r7 + bl ov13_0223FF18 + ldr r0, [r4, #4] + mov r1, r7 + add r0, r0, sl, lsl #2 + ldr r0, [r0, #4] + mov r2, #3 + bl ov13_02240008 + add sl, sl, #1 + cmp sl, #3 + blt _02236A68 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02236B44: .word ov13_02245622 +_02236B48: .word ov13_02245600 +_02236B4C: .word ov13_0224F56C + arm_func_end ov13_02236A48 + + arm_func_start ov13_02236B50 +ov13_02236B50: ; 0x02236B50 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _02236BA0 ; =ov13_02236BA4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236BA0: .word ov13_02236BA4 + arm_func_end ov13_02236B50 + + arm_func_start ov13_02236BA4 +ov13_02236BA4: ; 0x02236BA4 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_022279B4 + ldr r0, _02236BDC ; =ov13_02236BE0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236BDC: .word ov13_02236BE0 + arm_func_end ov13_02236BA4 + + arm_func_start ov13_02236BE0 +ov13_02236BE0: ; 0x02236BE0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_0223B2A8 + cmp r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02236C10 ; =ov13_02236C14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236C10: .word ov13_02236C14 + arm_func_end ov13_02236BE0 + + arm_func_start ov13_02236C14 +ov13_02236C14: ; 0x02236C14 + stmdb sp!, {r3, lr} + bl ov13_02236C28 + bl ov13_02236D1C + bl ov13_02236D20 + ldmia sp!, {r3, pc} + arm_func_end ov13_02236C14 + + arm_func_start ov13_02236C28 +ov13_02236C28: ; 0x02236C28 + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _02236D14 ; =ov13_0224563A + mov r4, #0 +_02236C34: + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _02236C5C + mov r0, #1 + bl ov13_0222726C + ldr r0, _02236D18 ; =ov13_0224F56C + strb r4, [r0] + bl ov13_022370B8 + ldmia sp!, {r3, r4, r5, pc} +_02236C5C: + add r4, r4, #1 + cmp r4, #7 + add r5, r5, #8 + blo _02236C34 + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _02236C88 + mov r0, #1 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_02236C88: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02236CA4 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, pc} +_02236CA4: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _02236CC0 + mov r0, #1 + bl ov13_02237134 + ldmia sp!, {r3, r4, r5, pc} +_02236CC0: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _02236CDC + mov r0, #3 + bl ov13_02237134 + ldmia sp!, {r3, r4, r5, pc} +_02236CDC: + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _02236CF8 + mov r0, #0 + bl ov13_02237134 + ldmia sp!, {r3, r4, r5, pc} +_02236CF8: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #2 + bl ov13_02237134 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02236D14: .word ov13_0224563A +_02236D18: .word ov13_0224F56C + arm_func_end ov13_02236C28 + + arm_func_start ov13_02236D1C +ov13_02236D1C: ; 0x02236D1C + bx lr + arm_func_end ov13_02236D1C + + arm_func_start ov13_02236D20 +ov13_02236D20: ; 0x02236D20 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + bl ov13_02227258 + cmp r0, #0 + beq _02236D44 + cmp r0, #1 + beq _02236D8C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02236D44: + bl ov13_0222B980 + cmp r0, #0 + beq _02236D5C + cmp r0, #1 + beq _02236D78 + b _02236E30 +_02236D5C: + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _02236E40 ; =ov13_0224F56C + mov r1, #2 + ldr r0, [r0, #4] + strb r1, [r0, #0x1d] + b _02236E30 +_02236D78: + bl ov13_022272E4 + ldr r0, _02236E44 ; =ov13_0222C10C + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02236D8C: + ldr r0, _02236E40 ; =ov13_0224F56C + mov r2, #1 + ldr r1, [r0, #4] + strb r2, [r1, #0x1d] + ldrb r0, [r0] + cmp r0, #4 + blo _02236E18 + sub r4, r0, #4 + mov r0, r4 + bl ov13_0223A3FC + cmp r0, #0xff + bne _02236DD4 + mov r0, #9 + bl ov13_0223ABB8 + mvn r0, #0 + bl ov13_0222728C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02236DD4: + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0222B970 + ldr r1, _02236E48 ; =ov13_022456AC + add ip, r4, #1 + ldrsb r3, [r1, r0] + mov r0, #0x46 + mov r1, #0 + mov r2, #1 + str ip, [sp] + bl ov13_0223BE6C + bl ov13_02237328 + bl ov13_022272E4 + ldr r0, _02236E4C ; =ov13_022373B8 + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_02236E18: + cmp r0, #2 + bhi _02236E24 + bl ov13_0223A414 +_02236E24: + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_02237548 +_02236E30: + ldr r0, _02236E50 ; =ov13_02236E54 + bl ov13_0222B8E8 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02236E40: .word ov13_0224F56C +_02236E44: .word ov13_0222C10C +_02236E48: .word ov13_022456AC +_02236E4C: .word ov13_022373B8 +_02236E50: .word ov13_02236E54 + arm_func_end ov13_02236D20 + + arm_func_start ov13_02236E54 +ov13_02236E54: ; 0x02236E54 + stmdb sp!, {r3, lr} + ldr r0, _02236E88 ; =ov13_0224F56C + ldr r0, [r0, #4] + ldrb r0, [r0, #0x1d] + cmp r0, #2 + bne _02236E70 + bl ov13_0223B1A0 +_02236E70: + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02236E8C ; =ov13_02236E90 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236E88: .word ov13_0224F56C +_02236E8C: .word ov13_02236E90 + arm_func_end ov13_02236E54 + + arm_func_start ov13_02236E90 +ov13_02236E90: ; 0x02236E90 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02236F0C ; =ov13_0224F56C + ldr r1, [r0, #4] + ldrb r1, [r1, #0x1d] + cmp r1, #1 + bne _02236ED8 + ldrb r0, [r0] + cmp r0, #3 + beq _02236ED4 + bl ov13_02239FF0 + ldrb r0, [r0, #0xe7] + cmp r0, #0xff + beq _02236ED8 +_02236ED4: + bl ov13_02227228 +_02236ED8: + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02236F10 ; =ov13_02236F14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236F0C: .word ov13_0224F56C +_02236F10: .word ov13_02236F14 + arm_func_end ov13_02236E90 + + arm_func_start ov13_02236F14 +ov13_02236F14: ; 0x02236F14 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl ov13_0223B6C8 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r4, _02237098 ; =ov13_0224F56C + mov r5, #0 +_02236F58: + ldr r0, [r4, #4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #4] + cmp r0, #0 + beq _02236F70 + bl ov13_0223FD60 +_02236F70: + add r5, r5, #1 + cmp r5, #3 + blo _02236F58 + ldr r4, _02237098 ; =ov13_0224F56C + mov r5, #0 +_02236F84: + ldr r0, [r4, #4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x10] + cmp r0, #0 + beq _02236F9C + bl ov13_0223FD60 +_02236F9C: + add r5, r5, #1 + cmp r5, #3 + blo _02236F84 + bl ov13_02227D18 + bl ov13_0222788C + ldr r0, _02237098 ; =ov13_0224F56C + ldr r0, [r0, #4] + ldr r0, [r0] + bl ov13_0223FA50 + ldr r0, _0223709C ; =ov13_02246664 + ldr r1, _022370A0 ; =GX_LoadOBJPltt + bl ov13_02227924 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + ldr r0, _02237098 ; =ov13_0224F56C + ldr r1, [r0, #4] + ldrb r1, [r1, #0x1d] + cmp r1, #2 + bne _02237010 + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _022370A4 ; =ov13_0222C44C + bl ov13_0222B8E8 + b _0223708C +_02237010: + ldrb r0, [r0] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0223708C +_02237020: ; jump table + b _02237030 ; case 0 + b _02237030 ; case 1 + b _02237030 ; case 2 + b _02237078 ; case 3 +_02237030: + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + bl ov13_02239FF0 + ldrb r0, [r0, #0xe7] + cmp r0, #0xff + bne _02237058 + ldr r0, _022370A8 ; =ov13_02237618 + bl ov13_0222B8E8 + b _0223708C +_02237058: + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + mov r0, #0 + bl ov13_022352C0 + ldr r0, _022370AC ; =ov13_02232E04 + bl ov13_0222B8E8 + b _0223708C +_02237078: + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _022370B0 ; =ov13_022388A0 + bl ov13_0222B8E8 +_0223708C: + ldr r0, _022370B4 ; =ov13_0224F570 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02237098: .word ov13_0224F56C +_0223709C: .word ov13_02246664 +_022370A0: .word GX_LoadOBJPltt +_022370A4: .word ov13_0222C44C +_022370A8: .word ov13_02237618 +_022370AC: .word ov13_02232E04 +_022370B0: .word ov13_022388A0 +_022370B4: .word ov13_0224F570 + arm_func_end ov13_02236F14 + + arm_func_start ov13_022370B8 +ov13_022370B8: ; 0x022370B8 + stmdb sp!, {r3, lr} + ldr r0, _02237120 ; =ov13_0224F56C + ldrb r2, [r0] + cmp r2, #4 + bhs _022370F8 + mov ip, r2, lsl #3 + ldr r0, _02237124 ; =ov13_02245672 + ldr r1, _02237128 ; =ov13_02245676 + ldr r2, _0223712C ; =ov13_02245674 + ldr r3, _02237130 ; =ov13_02245678 + ldrh r0, [r0, ip] + ldrh r1, [r1, ip] + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + bl ov13_02227C28 + ldmia sp!, {r3, pc} +_022370F8: + ldr r1, _02237124 ; =ov13_02245672 + mov r3, r2, lsl #3 + ldr r2, _02237128 ; =ov13_02245676 + ldr r0, _0223712C ; =ov13_02245674 + ldrh r1, [r1, r3] + ldrh r2, [r2, r3] + ldrh r3, [r0, r3] + mov r0, #0 + bl ov13_02227B6C + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237120: .word ov13_0224F56C +_02237124: .word ov13_02245672 +_02237128: .word ov13_02245676 +_0223712C: .word ov13_02245674 +_02237130: .word ov13_02245678 + arm_func_end ov13_022370B8 + + arm_func_start ov13_02237134 +ov13_02237134: ; 0x02237134 + stmdb sp!, {r3, lr} + ldr r2, _02237324 ; =ov13_0224F56C + mov r1, #1 + ldrb r3, [r2] + cmp r3, #6 + addls pc, pc, r3, lsl #2 + b _0223730C +_02237150: ; jump table + b _0223716C ; case 0 + b _022371AC ; case 1 + b _022371EC ; case 2 + b _0223722C ; case 3 + b _02237254 ; case 4 + b _02237294 ; case 5 + b _022372D0 ; case 6 +_0223716C: + ldr r3, [r2, #4] + mov ip, #0 + cmp r0, #0 + strb ip, [r3, #0x1c] + moveq r0, #2 + streqb r0, [r2] + beq _0223730C + cmp r0, #2 + streqb r1, [r2] + beq _0223730C + cmp r0, #1 + moveq r0, #3 + streqb r0, [r2] + movne r0, #4 + strneb r0, [r2] + b _0223730C +_022371AC: + ldr r3, [r2, #4] + cmp r0, #0 + strb r1, [r3, #0x1c] + moveq r0, #0 + streqb r0, [r2] + beq _0223730C + cmp r0, #2 + moveq r0, #2 + streqb r0, [r2] + beq _0223730C + cmp r0, #1 + moveq r0, #3 + streqb r0, [r2] + movne r0, #5 + strneb r0, [r2] + b _0223730C +_022371EC: + ldr r3, [r2, #4] + mov ip, #2 + strb ip, [r3, #0x1c] + cmp r0, #0 + streqb r1, [r2] + beq _0223730C + cmp r0, #2 + moveq r0, #0 + streqb r0, [r2] + beq _0223730C + cmp r0, #1 + moveq r0, #3 + streqb r0, [r2] + movne r0, #6 + strneb r0, [r2] + b _0223730C +_0223722C: + ldr r3, [r2, #4] + cmp r0, #1 + ldrb ip, [r3, #0x1c] + add r3, ip, #4 + streqb r3, [r2] + beq _0223730C + cmp r0, #3 + streqb ip, [r2] + movne r1, #0 + b _0223730C +_02237254: + ldr r3, [r2, #4] + mov ip, #0 + cmp r0, #0 + strb ip, [r3, #0x1c] + moveq r0, #6 + streqb r0, [r2] + beq _0223730C + cmp r0, #2 + moveq r0, #5 + streqb r0, [r2] + beq _0223730C + cmp r0, #1 + streqb ip, [r2] + movne r0, #3 + strneb r0, [r2] + b _0223730C +_02237294: + ldr r3, [r2, #4] + cmp r0, #0 + strb r1, [r3, #0x1c] + moveq r0, #4 + streqb r0, [r2] + beq _0223730C + cmp r0, #2 + moveq r0, #6 + streqb r0, [r2] + beq _0223730C + cmp r0, #1 + streqb r1, [r2] + movne r0, #3 + strneb r0, [r2] + b _0223730C +_022372D0: + ldr r3, [r2, #4] + mov ip, #2 + cmp r0, #0 + strb ip, [r3, #0x1c] + moveq r0, #5 + streqb r0, [r2] + beq _0223730C + cmp r0, #2 + moveq r0, #4 + streqb r0, [r2] + beq _0223730C + cmp r0, #1 + streqb ip, [r2] + movne r0, #3 + strneb r0, [r2] +_0223730C: + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #8 + bl ov13_0223ABB8 + bl ov13_022370B8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237324: .word ov13_0224F56C + arm_func_end ov13_02237134 + + arm_func_start ov13_02237328 +ov13_02237328: ; 0x02237328 + stmdb sp!, {r4, lr} + ldr r0, _022373AC ; =ov13_0224F56C + mov r1, #0 + ldrb r2, [r0] + ldr r0, [r0, #4] + sub r4, r2, #4 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_0223FDE0 + mov r2, r0 + mov r0, #0 + mov r1, #0x32 + bl ov13_022400F0 + ldr r0, _022373AC ; =ov13_0224F56C + add r3, r4, #3 + ldr r2, [r0, #4] + ldr r1, _022373B0 ; =ov13_02245622 + mov r3, r3, lsl #2 + ldr r0, _022373B4 ; =ov13_02245624 + add ip, r2, r4, lsl #2 + ldrh r2, [r1, r3] + ldrh r3, [r0, r3] + ldr r0, [ip, #0x10] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _022373AC ; =ov13_0224F56C + mvn r1, #0 + ldr r0, [r0, #4] + mov r2, #3 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_02240008 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022373AC: .word ov13_0224F56C +_022373B0: .word ov13_02245622 +_022373B4: .word ov13_02245624 + arm_func_end ov13_02237328 + + arm_func_start ov13_022373B8 +ov13_022373B8: ; 0x022373B8 + stmdb sp!, {r4, lr} + ldr r0, _02237514 ; =ov13_0224F56C + ldrb r0, [r0] + sub r4, r0, #4 + bl ov13_0223C1DC + cmp r0, #0 + beq _02237488 + cmp r0, #1 + ldmneia sp!, {r4, pc} + mov r0, #0xe + bl ov13_0223ABB8 + mov r0, r4 + bl ov13_0223A804 + ldr r0, _02237514 ; =ov13_0224F56C + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, r4, lsl #2 + ldr r0, [r0, #4] + bl ov13_0223FDE0 + mov r2, r0 + mov r0, #0 + mov r1, #0x56 + bl ov13_022400F0 + ldr r0, _02237514 ; =ov13_0224F56C + mov ip, r4, lsl #2 + ldr r0, [r0, #4] + mvn r1, #0 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #4] + ldr r2, _02237518 ; =ov13_02245622 + ldr r3, _0223751C ; =ov13_02245624 + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + bl ov13_0223FF18 + ldr r0, _02237514 ; =ov13_0224F56C + mvn r1, #0 + ldr r0, [r0, #4] + mov r2, #3 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #4] + bl ov13_02240008 + ldr r0, _02237514 ; =ov13_0224F56C + ldr r0, [r0, #4] + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_0223FD60 + mov r1, #0 + ldr r0, _02237514 ; =ov13_0224F56C + ldr r0, [r0, #4] + add r0, r0, r4, lsl #2 + str r1, [r0, #0x10] + b _02237504 +_02237488: + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _02237514 ; =ov13_0224F56C + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_0223FDE0 + mov r2, r0 + mov r0, #0 + mov r1, #0x11 + bl ov13_022400F0 + ldr r0, _02237514 ; =ov13_0224F56C + add r1, r4, #3 + ldr r0, [r0, #4] + mov ip, r1, lsl #2 + ldr r2, _02237518 ; =ov13_02245622 + ldr r3, _0223751C ; =ov13_02245624 + add r0, r0, r4, lsl #2 + ldrh r2, [r2, ip] + ldrh r3, [r3, ip] + ldr r0, [r0, #0x10] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _02237514 ; =ov13_0224F56C + mvn r1, #0 + ldr r0, [r0, #4] + mov r2, #3 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #0x10] + bl ov13_02240008 +_02237504: + bl ov13_0223C198 + ldr r0, _02237520 ; =ov13_02237524 + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02237514: .word ov13_0224F56C +_02237518: .word ov13_02245622 +_0223751C: .word ov13_02245624 +_02237520: .word ov13_02237524 + arm_func_end ov13_022373B8 + + arm_func_start ov13_02237524 +ov13_02237524: ; 0x02237524 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02237544 ; =ov13_02236C14 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237544: .word ov13_02236C14 + arm_func_end ov13_02237524 + + arm_func_start ov13_02237548 +ov13_02237548: ; 0x02237548 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r1, _02237610 ; =ov13_02245604 + ldr r0, _02237614 ; =ov13_0224F56C + ldrb r7, [r1] + ldrb r6, [r1, #1] + ldrb r5, [r1, #2] + ldrb r4, [r1, #3] + ldrb lr, [r1, #4] + ldrb ip, [r1, #5] + ldrb r3, [r1, #6] + ldrb r2, [r1, #7] + ldrb r1, [r0] + strb r7, [sp, #4] + strb r2, [sp, #3] + strb r6, [sp, #5] + strb r5, [sp, #6] + strb r4, [sp, #7] + strb lr, [sp] + strb ip, [sp, #1] + strb r3, [sp, #2] + cmp r1, #3 + add r2, sp, #4 + addhi sp, sp, #8 + ldmhiia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r2, r1] + ldr r0, [r0, #4] + ldr r0, [r0] + mov r2, r1 + bl ov13_02239378 + ldr r0, _02237614 ; =ov13_0224F56C + ldrb r0, [r0] + cmp r0, #3 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl ov13_0223A3FC + ldr r1, _02237614 ; =ov13_0224F56C + cmp r0, #2 + ldrb ip, [r1] + ldr r1, [r1, #4] + movgt r0, #3 + add r2, sp, #0 + ldrb r3, [r2, r0] + add r0, r1, ip, lsl #2 + ldr r0, [r0, #4] + mvn r1, #0 + mov r2, #0 + bl ov13_0223FE98 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02237610: .word ov13_02245604 +_02237614: .word ov13_0224F56C + arm_func_end ov13_02237548 + + arm_func_start ov13_02237618 +ov13_02237618: ; 0x02237618 + stmdb sp!, {r4, r5, r6, lr} + bl ov13_02239FF0 + ldr r1, _02237720 ; =ov13_0224F574 + mov r2, #0 + strb r2, [r1, #2] + ldrsb r2, [r1] + mov r4, r0 + cmp r2, #0 + moveq r0, #1 + streqb r0, [r1] + bl ov13_0222B970 + cmp r0, #0 + beq _02237674 + ldr r0, _02237720 ; =ov13_0224F574 + ldrsb r1, [r0, #1] + cmp r1, #2 + moveq r1, #0 + streqb r1, [r0, #1] + ldr r0, _02237720 ; =ov13_0224F574 + ldrsb r1, [r0] + cmp r1, #2 + moveq r1, #1 + streqb r1, [r0] +_02237674: + bl ov13_0223773C + bl ov13_02227E40 + bl ov13_0222B970 + mov r5, r0 + ldrb r1, [r4, #0xf4] + mov r0, #0x32 + ldr r3, _02237724 ; =ov13_02245770 + add r2, r1, #1 + ldrsb r1, [r3, r5] + bl ov13_022277B8 + mov r0, #1 + bl ov13_02227964 + mov r0, #1 + bl ov13_0222B998 + mov r6, r0 + mov r0, #1 + bl ov13_0222B998 + mov r5, r0 + mov r0, #1 + bl ov13_0222B998 + mov r4, r0 + mov r0, #1 + bl ov13_0222B998 + mov r3, r0 + ldr r1, _02237728 ; =ov13_0224572E + ldr r0, _02237720 ; =ov13_0224F574 + add ip, r1, r6, lsl #5 + ldrsb lr, [r0, #1] + ldr r1, _0223772C ; =ov13_02245732 + ldr r0, _02237730 ; =ov13_02245730 + add r1, r1, r5, lsl #5 + add r2, r0, r4, lsl #5 + mov r5, lr, lsl #3 + ldrh r0, [r5, ip] + ldrh r1, [r5, r1] + ldrh r2, [r5, r2] + ldr r4, _02237734 ; =ov13_02245734 + add r3, r4, r3, lsl #5 + ldrh r3, [r5, r3] + bl ov13_02227C28 + ldr r0, _02237738 ; =ov13_02237828 + bl ov13_0222B8E8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02237720: .word ov13_0224F574 +_02237724: .word ov13_02245770 +_02237728: .word ov13_0224572E +_0223772C: .word ov13_02245732 +_02237730: .word ov13_02245730 +_02237734: .word ov13_02245734 +_02237738: .word ov13_02237828 + arm_func_end ov13_02237618 + + arm_func_start ov13_0223773C +ov13_0223773C: ; 0x0223773C + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr ip, _02237800 ; =ov13_022456B8 + add r3, sp, #0 + mov r2, #0xb +_02237750: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _02237750 + ldr r0, _02237804 ; =ov13_0224667C + ldr r1, _02237808 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _0223780C ; =ov13_02246694 + ldr r1, _02237810 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02237814 ; =ov13_022466AC + ldr r1, _02237818 ; =GX_LoadBG2Scr + bl ov13_02227924 + add r0, sp, #0 + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _0223781C ; =ov13_0224F574 + ldr r2, _02237820 ; =0x04001008 + str r0, [r1, #4] + ldrh r0, [r2] + ldr r1, _02237824 ; =0x0400000A + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237800: .word ov13_022456B8 +_02237804: .word ov13_0224667C +_02237808: .word GX_LoadBG2Char +_0223780C: .word ov13_02246694 +_02237810: .word GX_LoadBGPltt +_02237814: .word ov13_022466AC +_02237818: .word GX_LoadBG2Scr +_0223781C: .word ov13_0224F574 +_02237820: .word 0x04001008 +_02237824: .word 0x0400000A + arm_func_end ov13_0223773C + + arm_func_start ov13_02237828 +ov13_02237828: ; 0x02237828 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _02237878 ; =ov13_0223787C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237878: .word ov13_0223787C + arm_func_end ov13_02237828 + + arm_func_start ov13_0223787C +ov13_0223787C: ; 0x0223787C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_022279B4 + ldr r0, _022378B4 ; =ov13_022378B8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022378B4: .word ov13_022378B8 + arm_func_end ov13_0223787C + + arm_func_start ov13_022378B8 +ov13_022378B8: ; 0x022378B8 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _022378DC ; =ov13_022378E0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022378DC: .word ov13_022378E0 + arm_func_end ov13_022378B8 + + arm_func_start ov13_022378E0 +ov13_022378E0: ; 0x022378E0 + stmdb sp!, {r3, lr} + bl ov13_022378F4 + bl ov13_02237A78 + bl ov13_02237A7C + ldmia sp!, {r3, pc} + arm_func_end ov13_022378E0 + + arm_func_start ov13_022378F4 +ov13_022378F4: ; 0x022378F4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, #0 + ldr r4, _02237A60 ; =ov13_022456EE + mov r7, r6 + mov r5, #1 +_02237908: + mov r0, r5 + bl ov13_0222B998 + add r0, r4, r0, lsl #5 + add r0, r0, r7 + bl ov13_022417DC + cmp r0, #0 + beq _022379A8 + mov r0, #1 + bl ov13_0222726C + ldr r1, _02237A64 ; =ov13_0224F574 + mov r0, #1 + strb r6, [r1, #1] + bl ov13_0222B998 + mov r6, r0 + mov r0, #1 + bl ov13_0222B998 + mov r5, r0 + mov r0, #1 + bl ov13_0222B998 + mov r4, r0 + mov r0, #1 + bl ov13_0222B998 + mov r3, r0 + ldr r0, _02237A64 ; =ov13_0224F574 + ldr r1, _02237A68 ; =ov13_0224572E + ldrsb lr, [r0, #1] + ldr r0, _02237A6C ; =ov13_02245730 + add ip, r1, r6, lsl #5 + ldr r1, _02237A70 ; =ov13_02245732 + add r2, r0, r4, lsl #5 + ldr r4, _02237A74 ; =ov13_02245734 + add r1, r1, r5, lsl #5 + mov r5, lr, lsl #3 + add r3, r4, r3, lsl #5 + ldrh r0, [r5, ip] + ldrh r1, [r5, r1] + ldrh r2, [r5, r2] + ldrh r3, [r5, r3] + bl ov13_02227C28 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022379A8: + add r6, r6, #1 + cmp r6, #4 + add r7, r7, #8 + blo _02237908 + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _022379D4 + mov r0, #1 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022379D4: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _022379F0 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022379F0: + mov r0, #0x40 + bl ov13_022416D4 + cmp r0, #0 + beq _02237A0C + mov r0, #1 + bl ov13_02237C84 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02237A0C: + mov r0, #0x80 + bl ov13_022416D4 + cmp r0, #0 + beq _02237A28 + mov r0, #3 + bl ov13_02237C84 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02237A28: + mov r0, #0x20 + bl ov13_022416D4 + cmp r0, #0 + beq _02237A44 + mov r0, #0 + bl ov13_02237C84 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02237A44: + mov r0, #0x10 + bl ov13_022416D4 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #2 + bl ov13_02237C84 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02237A60: .word ov13_022456EE +_02237A64: .word ov13_0224F574 +_02237A68: .word ov13_0224572E +_02237A6C: .word ov13_02245730 +_02237A70: .word ov13_02245732 +_02237A74: .word ov13_02245734 + arm_func_end ov13_022378F4 + + arm_func_start ov13_02237A78 +ov13_02237A78: ; 0x02237A78 + bx lr + arm_func_end ov13_02237A78 + + arm_func_start ov13_02237A7C +ov13_02237A7C: ; 0x02237A7C + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _02237A98 + cmp r0, #1 + beq _02237AA4 + ldmia sp!, {r3, pc} +_02237A98: + mov r0, #7 + bl ov13_0223ABB8 + b _02237ABC +_02237AA4: + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_02237D78 + ldr r0, _02237AC8 ; =ov13_0224F574 + mov r1, #1 + strb r1, [r0, #2] +_02237ABC: + ldr r0, _02237ACC ; =ov13_02237AD0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237AC8: .word ov13_0224F574 +_02237ACC: .word ov13_02237AD0 + arm_func_end ov13_02237A7C + + arm_func_start ov13_02237AD0 +ov13_02237AD0: ; 0x02237AD0 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02237AEC ; =ov13_02237AF0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237AEC: .word ov13_02237AF0 + arm_func_end ov13_02237AD0 + + arm_func_start ov13_02237AF0 +ov13_02237AF0: ; 0x02237AF0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02237B4C ; =ov13_0224F574 + ldrb r0, [r0, #2] + cmp r0, #0 + beq _02237B18 + bl ov13_02227228 +_02237B18: + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02237B50 ; =ov13_02237B54 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237B4C: .word ov13_0224F574 +_02237B50: .word ov13_02237B54 + arm_func_end ov13_02237AF0 + + arm_func_start ov13_02237B54 +ov13_02237B54: ; 0x02237B54 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_02227D18 + bl ov13_0222788C + ldr r0, _02237C6C ; =ov13_0224F574 + ldr r0, [r0, #4] + bl ov13_0223FA50 + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + ldr r0, _02237C6C ; =ov13_0224F574 + ldrb r1, [r0, #2] + cmp r1, #0 + bne _02237BD8 + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + ldr r0, _02237C70 ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02237BD8: + ldrsb r0, [r0, #1] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_02237BE8: ; jump table + b _02237BF8 ; case 0 + b _02237C10 ; case 1 + b _02237C28 ; case 2 + b _02237C40 ; case 3 +_02237BF8: + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02237C74 ; =ov13_022363F4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02237C10: + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02237C78 ; =ov13_0222F2AC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02237C28: + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02237C7C ; =ov13_02235F80 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02237C40: + mov r0, #2 + mov r1, #0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + mov r0, #1 + bl ov13_022352C0 + ldr r0, _02237C80 ; =ov13_02232E04 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237C6C: .word ov13_0224F574 +_02237C70: .word ov13_022368D8 +_02237C74: .word ov13_022363F4 +_02237C78: .word ov13_0222F2AC +_02237C7C: .word ov13_02235F80 +_02237C80: .word ov13_02232E04 + arm_func_end ov13_02237B54 + + arm_func_start ov13_02237C84 +ov13_02237C84: ; 0x02237C84 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _02237D60 ; =ov13_0224F574 + mov r5, r0 + mov r0, #1 + ldrsb r4, [r1, #1] + bl ov13_0222B998 + ldr r2, _02237D64 ; =ov13_022456CE + mvn r1, #0 + add r0, r2, r0, lsl #4 + add r0, r0, r4, lsl #2 + ldrsb r2, [r5, r0] + cmp r2, r1 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r2, #0 + ldreq r0, _02237D60 ; =ov13_0224F574 + streqb r4, [r0] + mvn r0, #1 + cmp r2, r0 + ldrne r0, _02237D60 ; =ov13_0224F574 + strneb r2, [r0, #1] + bne _02237CE4 + ldr r0, _02237D60 ; =ov13_0224F574 + ldrsb r1, [r0] + strb r1, [r0, #1] +_02237CE4: + mov r0, #8 + bl ov13_0223ABB8 + mov r0, #1 + bl ov13_0222B998 + mov r6, r0 + mov r0, #1 + bl ov13_0222B998 + mov r5, r0 + mov r0, #1 + bl ov13_0222B998 + mov r4, r0 + mov r0, #1 + bl ov13_0222B998 + mov r3, r0 + ldr r1, _02237D68 ; =ov13_0224572E + ldr r0, _02237D60 ; =ov13_0224F574 + add ip, r1, r6, lsl #5 + ldrsb lr, [r0, #1] + ldr r1, _02237D6C ; =ov13_02245732 + ldr r0, _02237D70 ; =ov13_02245730 + add r1, r1, r5, lsl #5 + add r2, r0, r4, lsl #5 + mov r5, lr, lsl #3 + ldrh r0, [r5, ip] + ldrh r1, [r5, r1] + ldrh r2, [r5, r2] + ldr r4, _02237D74 ; =ov13_02245734 + add r3, r4, r3, lsl #5 + ldrh r3, [r5, r3] + bl ov13_02227C28 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02237D60: .word ov13_0224F574 +_02237D64: .word ov13_022456CE +_02237D68: .word ov13_0224572E +_02237D6C: .word ov13_02245732 +_02237D70: .word ov13_02245730 +_02237D74: .word ov13_02245734 + arm_func_end ov13_02237C84 + + arm_func_start ov13_02237D78 +ov13_02237D78: ; 0x02237D78 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r1, _02237DC8 ; =ov13_022456B4 + ldr r0, _02237DCC ; =ov13_0224F574 + ldrb lr, [r1] + ldrb ip, [r1, #1] + ldrb r3, [r1, #2] + ldrb r2, [r1, #3] + ldrsb r1, [r0, #1] + add r4, sp, #0 + strb lr, [sp] + strb ip, [sp, #1] + strb r3, [sp, #2] + strb r2, [sp, #3] + ldrb r1, [r4, r1] + ldr r0, [r0, #4] + mov r2, r1 + bl ov13_02239378 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02237DC8: .word ov13_022456B4 +_02237DCC: .word ov13_0224F574 + arm_func_end ov13_02237D78 + + arm_func_start ov13_02237DD0 +ov13_02237DD0: ; 0x02237DD0 + stmdb sp!, {r3, lr} + ldr r0, _02237E54 ; =ov13_0224F57C + mov r1, #0 + strb r1, [r0] + bl ov13_02237E5C + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + bne _02237E0C + mov r0, #0x31 + sub r1, r0, #0x32 + mov r2, #0 + bl ov13_022277B8 +_02237E0C: + mov r0, #2 + bl ov13_02227964 + ldr r0, [sp] + cmp r0, #0 + bne _02237E24 + bl ov13_02227E40 +_02237E24: + mov r0, #0x2c + bl ov13_022279EC + mov r0, #0 + bl ov13_02226F58 + bl ov13_02237F04 + mov r0, #0 + bl ov13_02227EB0 + mov r0, #0xc + bl ov13_0223ABB8 + ldr r0, _02237E58 ; =ov13_02237F9C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237E54: .word ov13_0224F57C +_02237E58: .word ov13_02237F9C + arm_func_end ov13_02237DD0 + + arm_func_start ov13_02237E5C +ov13_02237E5C: ; 0x02237E5C + stmdb sp!, {r3, lr} + ldr r0, _02237EE4 ; =ov13_022466C0 + ldr r1, _02237EE8 ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _02237EEC ; =ov13_022466D8 + ldr r1, _02237EF0 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02237EF4 ; =ov13_022466F0 + ldr r1, _02237EF8 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02237EFC ; =0x04001008 + ldr r1, _02237F00 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02237EE4: .word ov13_022466C0 +_02237EE8: .word GX_LoadBG2Char +_02237EEC: .word ov13_022466D8 +_02237EF0: .word GX_LoadBGPltt +_02237EF4: .word ov13_022466F0 +_02237EF8: .word GX_LoadBG2Scr +_02237EFC: .word 0x04001008 +_02237F00: .word 0x0400000A + arm_func_end ov13_02237E5C + + arm_func_start ov13_02237F04 +ov13_02237F04: ; 0x02237F04 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + bl ov13_02239FF0 + mov r4, r0 + ldr r0, _02237F94 ; =ov13_02245778 + add r1, sp, #4 + mov r2, #0xc + bl MIi_CpuCopy32 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #2 + moveq r0, #4 + streqb r0, [sp, #0xe] + ldrneb r0, [r4, #0xf4] + addne r0, r0, #1 + strneb r0, [sp, #0xe] + add r0, sp, #4 + bl ov00_021FA75C + cmp r0, #0 + bne _02237F60 + bl OS_Terminate +_02237F60: + ldr r0, [sp] + cmp r0, #0 + bne _02237F78 + ldrb r0, [r4, #0xf4] + mov r1, r4 + bl ov00_021FAC20 +_02237F78: + mov r0, #0 + ldr r1, _02237F98 ; =ov13_0223813C + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02237F94: .word ov13_02245778 +_02237F98: .word ov13_0223813C + arm_func_end ov13_02237F04 + + arm_func_start ov13_02237F9C +ov13_02237F9C: ; 0x02237F9C + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + bne _02237FF8 + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 +_02237FF8: + ldr r0, _02238004 ; =ov13_02238008 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238004: .word ov13_02238008 + arm_func_end ov13_02237F9C + + arm_func_start ov13_02238008 +ov13_02238008: ; 0x02238008 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02238038 ; =ov13_0223803C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238038: .word ov13_0223803C + arm_func_end ov13_02238008 + + arm_func_start ov13_0223803C +ov13_0223803C: ; 0x0223803C + stmdb sp!, {r3, lr} + bl ov13_02238050 + bl ov13_02238054 + bl ov13_02238058 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223803C + + arm_func_start ov13_02238050 +ov13_02238050: ; 0x02238050 + bx lr + arm_func_end ov13_02238050 + + arm_func_start ov13_02238054 +ov13_02238054: ; 0x02238054 + bx lr + arm_func_end ov13_02238054 + + arm_func_start ov13_02238058 +ov13_02238058: ; 0x02238058 + bx lr + arm_func_end ov13_02238058 + + arm_func_start ov13_0223805C +ov13_0223805C: ; 0x0223805C + stmdb sp!, {r3, lr} + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02238080 ; =ov13_02238084 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238080: .word ov13_02238084 + arm_func_end ov13_0223805C + + arm_func_start ov13_02238084 +ov13_02238084: ; 0x02238084 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022380A4 ; =ov13_022380A8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022380A4: .word ov13_022380A8 + arm_func_end ov13_02238084 + + arm_func_start ov13_022380A8 +ov13_022380A8: ; 0x022380A8 + stmdb sp!, {r4, lr} + bl ov13_0223A7F4 + mov r4, r0 + bl ov00_021FAAC8 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl DWCi_BACKUPlGetWifi + add r1, r4, #0xf0 + mov r2, #0xe + bl MI_CpuCopy8 + bl DWCi_BACKUPlGetWifi + add r1, r4, #0x1f0 + mov r2, #0xe + bl MI_CpuCopy8 + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _02238130 ; =ov13_0224F57C + mov r1, #1 + ldrb r0, [r0] + cmp r0, #0 + mov r0, #0 + bne _02238120 + bl ov13_0222B8F8 + ldr r0, _02238134 ; =ov13_022327E0 + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} +_02238120: + bl ov13_0222B8F8 + ldr r0, _02238138 ; =ov13_022381CC + bl ov13_0222B8E8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02238130: .word ov13_0224F57C +_02238134: .word ov13_022327E0 +_02238138: .word ov13_022381CC + arm_func_end ov13_022380A8 + + arm_func_start ov13_0223813C +ov13_0223813C: ; 0x0223813C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ov00_021FA904 + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + bl ov13_02227F68 + bl ov13_0223AC20 + cmp r4, #0 + ble _02238178 + ldr r1, _022381A0 ; =ov13_0224F57C + mov r2, #1 + mov r0, #0x11 + strb r2, [r1] + bl ov13_0223ABB8 + b _02238188 +_02238178: + bl ov00_021FA9D4 + bl ov13_02232DF4 + mov r0, #0x12 + bl ov13_0223ABB8 +_02238188: + ldr r0, _022381A4 ; =ov13_0223805C + bl ov13_0222B8E8 + mov r1, r5 + mov r0, #0 + bl ov13_022425D0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022381A0: .word ov13_0224F57C +_022381A4: .word ov13_0223805C + arm_func_end ov13_0223813C + + arm_func_start ov13_022381A8 +ov13_022381A8: ; 0x022381A8 + ldr ip, _022381B8 ; =ov13_0224128C + mov r0, r1 + mov r1, #0x20 + bx ip + .balign 4, 0 +_022381B8: .word ov13_0224128C + arm_func_end ov13_022381A8 + + arm_func_start ov13_022381BC +ov13_022381BC: ; 0x022381BC + ldr ip, _022381C8 ; =ov13_022412F4 + mov r0, r1 + bx ip + .balign 4, 0 +_022381C8: .word ov13_022412F4 + arm_func_end ov13_022381BC + + arm_func_start ov13_022381CC +ov13_022381CC: ; 0x022381CC + stmdb sp!, {r3, lr} + ldr r0, _022381F4 ; =ov13_0224F580 + mov r1, #0 + strb r1, [r0] + bl ov13_022381FC + mov r0, #0x2d + bl ov13_022279EC + ldr r0, _022381F8 ; =ov13_02238268 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022381F4: .word ov13_0224F580 +_022381F8: .word ov13_02238268 + arm_func_end ov13_022381CC + + arm_func_start ov13_022381FC +ov13_022381FC: ; 0x022381FC + stmdb sp!, {r3, lr} + ldr r0, _02238258 ; =ov13_02246704 + ldr r1, _0223825C ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r2, _02238260 ; =0x04001008 + ldr r1, _02238264 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238258: .word ov13_02246704 +_0223825C: .word GX_LoadBG2Scr +_02238260: .word 0x04001008 +_02238264: .word 0x0400000A + arm_func_end ov13_022381FC + + arm_func_start ov13_02238268 +ov13_02238268: ; 0x02238268 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02238298 ; =ov13_0223829C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238298: .word ov13_0223829C + arm_func_end ov13_02238268 + + arm_func_start ov13_0223829C +ov13_0223829C: ; 0x0223829C + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022382BC ; =ov13_022382C0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022382BC: .word ov13_022382C0 + arm_func_end ov13_0223829C + + arm_func_start ov13_022382C0 +ov13_022382C0: ; 0x022382C0 + stmdb sp!, {r3, lr} + bl ov13_022383D0 + bl ov13_022382D0 + ldmia sp!, {r3, pc} + arm_func_end ov13_022382C0 + + arm_func_start ov13_022382D0 +ov13_022382D0: ; 0x022382D0 + bx lr + arm_func_end ov13_022382D0 + + arm_func_start ov13_022382D4 +ov13_022382D4: ; 0x022382D4 + stmdb sp!, {r3, lr} + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + beq _022382F4 + bl ov13_0223B1A0 +_022382F4: + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02238328 ; =ov13_0223832C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238328: .word ov13_0223832C + arm_func_end ov13_022382D4 + + arm_func_start ov13_0223832C +ov13_0223832C: ; 0x0223832C + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223B6C8 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + ldr r0, [sp] + cmp r0, #0 + bne _022383BC + mov r0, #0 + mov r1, r0 + bl ov13_0222B934 + ldr r0, _022383C8 ; =ov13_02232E04 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022383BC: + ldr r0, _022383CC ; =ov13_0222C44C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022383C8: .word ov13_02232E04 +_022383CC: .word ov13_0222C44C + arm_func_end ov13_0223832C + + arm_func_start ov13_022383D0 +ov13_022383D0: ; 0x022383D0 + stmdb sp!, {r3, lr} + ldr r0, _02238434 ; =ov13_0224F580 + ldrb r1, [r0] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0] + cmp r1, #0xb4 + ldmloia sp!, {r3, pc} + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + bl ov13_0222B980 + cmp r0, #0 + beq _02238428 + cmp r0, #1 + bne _02238428 + ldr r0, [sp] + cmp r0, #0 + beq _02238428 + ldr r0, _02238438 ; =ov13_0222C10C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02238428: + ldr r0, _0223843C ; =ov13_022382D4 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238434: .word ov13_0224F580 +_02238438: .word ov13_0222C10C +_0223843C: .word ov13_022382D4 + arm_func_end ov13_022383D0 + + arm_func_start ov13_02238440 +ov13_02238440: ; 0x02238440 + stmdb sp!, {r3, lr} + bl ov13_02239B34 + add r1, sp, #0 + mov r0, #0 + bl ov13_0222B948 + bl ov13_02238498 + mov r0, #0x31 + sub r1, r0, #0x32 + mov r2, #0 + bl ov13_022277B8 + ldr r0, [sp] + cmp r0, #2 + beq _02238478 + bl ov13_02227E40 +_02238478: + ldr r0, [sp] + cmp r0, #1 + bne _02238488 + bl ov13_0223A4F4 +_02238488: + ldr r0, _02238494 ; =ov13_02238504 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238494: .word ov13_02238504 + arm_func_end ov13_02238440 + + arm_func_start ov13_02238498 +ov13_02238498: ; 0x02238498 + stmdb sp!, {r3, lr} + ldr r0, _022384F4 ; =ov13_02246718 + ldr r1, _022384F8 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r2, _022384FC ; =0x04001008 + ldr r1, _02238500 ; =0x0400000A + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r2, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2, #2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022384F4: .word ov13_02246718 +_022384F8: .word GX_LoadBG2Scr +_022384FC: .word 0x04001008 +_02238500: .word 0x0400000A + arm_func_end ov13_02238498 + + arm_func_start ov13_02238504 +ov13_02238504: ; 0x02238504 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EA8 + ldr r0, _02238554 ; =ov13_02238558 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238554: .word ov13_02238558 + arm_func_end ov13_02238504 + + arm_func_start ov13_02238558 +ov13_02238558: ; 0x02238558 + stmdb sp!, {lr} + sub sp, sp, #0x14 + ldr r0, _022385D8 ; =ov13_02245784 + add r3, sp, #8 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {pc} + add r1, sp, #4 + mov r0, #0 + bl ov13_0222B948 + mov r0, #0 + str r0, [sp] + mov r1, #1 + ldr r3, [sp, #4] + add r0, sp, #8 + ldr r0, [r0, r3, lsl #2] + mov r2, r1 + sub r3, r1, #2 + bl ov13_0223BE6C + ldr r0, _022385DC ; =ov13_022385E0 + bl ov13_0222B8E8 + add sp, sp, #0x14 + ldmia sp!, {pc} + .balign 4, 0 +_022385D8: .word ov13_02245784 +_022385DC: .word ov13_022385E0 + arm_func_end ov13_02238558 + + arm_func_start ov13_022385E0 +ov13_022385E0: ; 0x022385E0 + stmdb sp!, {r3, lr} + bl ov13_0223861C + bl ov13_02238620 + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _02238618 ; =ov13_02238624 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238618: .word ov13_02238624 + arm_func_end ov13_022385E0 + + arm_func_start ov13_0223861C +ov13_0223861C: ; 0x0223861C + bx lr + arm_func_end ov13_0223861C + + arm_func_start ov13_02238620 +ov13_02238620: ; 0x02238620 + bx lr + arm_func_end ov13_02238620 + + arm_func_start ov13_02238624 +ov13_02238624: ; 0x02238624 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + mov r1, #0 + mov r2, #0x14 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02238654 ; =ov13_02238658 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238654: .word ov13_02238658 + arm_func_end ov13_02238624 + + arm_func_start ov13_02238658 +ov13_02238658: ; 0x02238658 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + mov r1, #0x14 + bl ov13_02240EFC + mov r0, #0 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02238690 ; =ov13_02237DD0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238690: .word ov13_02237DD0 + arm_func_end ov13_02238658 + + arm_func_start ov13_02238694 +ov13_02238694: ; 0x02238694 + stmdb sp!, {r3, lr} + ldr r0, _022386CC ; =ov13_0224F584 + mov r1, #0 + strb r1, [r0] + bl ov13_022386D4 + mov r0, #8 + bl ov13_02227DE4 + mov r0, #0x29 + bl ov13_022279EC + mov r0, #0x10 + bl ov13_0223ABB8 + ldr r0, _022386D0 ; =ov13_02238754 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022386CC: .word ov13_0224F584 +_022386D0: .word ov13_02238754 + arm_func_end ov13_02238694 + + arm_func_start ov13_022386D4 +ov13_022386D4: ; 0x022386D4 + stmdb sp!, {r3, lr} + ldr r0, _02238744 ; =ov13_0224672C + ldr r1, _02238748 ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _0223874C ; =0x04001008 + ldr r1, _02238750 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238744: .word ov13_0224672C +_02238748: .word GX_LoadBG2Scr +_0223874C: .word 0x04001008 +_02238750: .word 0x0400000A + arm_func_end ov13_022386D4 + + arm_func_start ov13_02238754 +ov13_02238754: ; 0x02238754 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02238784 ; =ov13_02238788 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238784: .word ov13_02238788 + arm_func_end ov13_02238754 + + arm_func_start ov13_02238788 +ov13_02238788: ; 0x02238788 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _022387A8 ; =ov13_022387AC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022387A8: .word ov13_022387AC + arm_func_end ov13_02238788 + + arm_func_start ov13_022387AC +ov13_022387AC: ; 0x022387AC + stmdb sp!, {r3, lr} + bl ov13_0223886C + bl ov13_022387BC + ldmia sp!, {r3, pc} + arm_func_end ov13_022387AC + + arm_func_start ov13_022387BC +ov13_022387BC: ; 0x022387BC + bx lr + arm_func_end ov13_022387BC + + arm_func_start ov13_022387C0 +ov13_022387C0: ; 0x022387C0 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _022387F8 ; =ov13_022387FC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022387F8: .word ov13_022387FC + arm_func_end ov13_022387C0 + + arm_func_start ov13_022387FC +ov13_022387FC: ; 0x022387FC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + mov r0, #0 + mov r1, #2 + bl ov13_0222B934 + ldr r0, _02238868 ; =ov13_02238440 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238868: .word ov13_02238440 + arm_func_end ov13_022387FC + + arm_func_start ov13_0223886C +ov13_0223886C: ; 0x0223886C + stmdb sp!, {r3, lr} + ldr r0, _02238898 ; =ov13_0224F584 + ldrb r1, [r0] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0] + cmp r1, #0x78 + ldmloia sp!, {r3, pc} + ldr r0, _0223889C ; =ov13_022387C0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238898: .word ov13_0224F584 +_0223889C: .word ov13_022387C0 + arm_func_end ov13_0223886C + + arm_func_start ov13_022388A0 +ov13_022388A0: ; 0x022388A0 + stmdb sp!, {r3, lr} + ldr r0, _022388E8 ; =ov13_0224F588 + mov r1, #0 + strb r1, [r0] + bl ov13_022388F0 + mov r0, #8 + bl ov13_02227DE4 + mov r0, #0x38 + sub r1, r0, #0x39 + mov r2, #0 + bl ov13_022277B8 + mov r0, #1 + bl ov13_02227964 + mov r0, #0x27 + bl ov13_022279EC + ldr r0, _022388EC ; =ov13_02238998 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022388E8: .word ov13_0224F588 +_022388EC: .word ov13_02238998 + arm_func_end ov13_022388A0 + + arm_func_start ov13_022388F0 +ov13_022388F0: ; 0x022388F0 + stmdb sp!, {r3, lr} + ldr r0, _02238978 ; =ov13_02246740 + ldr r1, _0223897C ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _02238980 ; =ov13_02246758 + ldr r1, _02238984 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02238988 ; =ov13_02246770 + ldr r1, _0223898C ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02238990 ; =0x04001008 + ldr r1, _02238994 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238978: .word ov13_02246740 +_0223897C: .word GX_LoadBG2Char +_02238980: .word ov13_02246758 +_02238984: .word GX_LoadBGPltt +_02238988: .word ov13_02246770 +_0223898C: .word GX_LoadBG2Scr +_02238990: .word 0x04001008 +_02238994: .word 0x0400000A + arm_func_end ov13_022388F0 + + arm_func_start ov13_02238998 +ov13_02238998: ; 0x02238998 + stmdb sp!, {r3, lr} + mov r1, #1 + mov r2, r1 + mov r0, #2 + mov r3, #8 + bl ov13_022403B8 + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #1 + mov r1, r0 + bl ov13_02240EA8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _022389E8 ; =ov13_022389EC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022389E8: .word ov13_022389EC + arm_func_end ov13_02238998 + + arm_func_start ov13_022389EC +ov13_022389EC: ; 0x022389EC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_022279B4 + ldr r0, _02238A24 ; =ov13_02238A28 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238A24: .word ov13_02238A28 + arm_func_end ov13_022389EC + + arm_func_start ov13_02238A28 +ov13_02238A28: ; 0x02238A28 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02238A4C ; =ov13_02238A50 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238A4C: .word ov13_02238A50 + arm_func_end ov13_02238A28 + + arm_func_start ov13_02238A50 +ov13_02238A50: ; 0x02238A50 + stmdb sp!, {r3, lr} + bl ov13_02238A64 + bl ov13_02238A9C + bl ov13_02238AA0 + ldmia sp!, {r3, pc} + arm_func_end ov13_02238A50 + + arm_func_start ov13_02238A64 +ov13_02238A64: ; 0x02238A64 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _02238A80 + mov r0, #1 + bl ov13_0222726C +_02238A80: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02238A64 + + arm_func_start ov13_02238A9C +ov13_02238A9C: ; 0x02238A9C + bx lr + arm_func_end ov13_02238A9C + + arm_func_start ov13_02238AA0 +ov13_02238AA0: ; 0x02238AA0 + stmdb sp!, {r3, lr} + bl ov13_02227258 + cmp r0, #0 + beq _02238ABC + cmp r0, #1 + beq _02238AC8 + ldmia sp!, {r3, pc} +_02238ABC: + mov r0, #7 + bl ov13_0223ABB8 + b _02238ADC +_02238AC8: + mov r0, #6 + bl ov13_0223ABB8 + ldr r0, _02238AE8 ; =ov13_0224F588 + mov r1, #1 + strb r1, [r0] +_02238ADC: + ldr r0, _02238AEC ; =ov13_02238AF0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238AE8: .word ov13_0224F588 +_02238AEC: .word ov13_02238AF0 + arm_func_end ov13_02238AA0 + + arm_func_start ov13_02238AF0 +ov13_02238AF0: ; 0x02238AF0 + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02238B0C ; =ov13_02238B10 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238B0C: .word ov13_02238B10 + arm_func_end ov13_02238AF0 + + arm_func_start ov13_02238B10 +ov13_02238B10: ; 0x02238B10 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _02238B6C ; =ov13_0224F588 + ldrb r0, [r0] + cmp r0, #0 + bne _02238B4C + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_02238B4C: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02238B70 ; =ov13_02238B74 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238B6C: .word ov13_0224F588 +_02238B70: .word ov13_02238B74 + arm_func_end ov13_02238B10 + + arm_func_start ov13_02238B74 +ov13_02238B74: ; 0x02238B74 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02238C20 ; =ov13_0224F588 + ldrb r0, [r0] + cmp r0, #0 + bne _02238BA8 + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_02238BA8: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_02240B04 + ldr r0, _02238C20 ; =ov13_0224F588 + ldrb r0, [r0] + cmp r0, #0 + bne _02238BDC + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_02238BDC: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _02238C20 ; =ov13_0224F588 + mov r1, #1 + ldrb r0, [r0] + cmp r0, #0 + mov r0, #2 + bne _02238C10 + bl ov13_0222B8F8 + ldr r0, _02238C24 ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02238C10: + bl ov13_0222B8F8 + ldr r0, _02238C28 ; =ov13_02238C4C + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238C20: .word ov13_0224F588 +_02238C24: .word ov13_022368D8 +_02238C28: .word ov13_02238C4C + arm_func_end ov13_02238B74 + + arm_func_start ov13_02238C2C +ov13_02238C2C: ; 0x02238C2C + ldr r0, _02238C48 ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_02238C48: .word 0x027FFFA8 + arm_func_end ov13_02238C2C + + arm_func_start ov13_02238C4C +ov13_02238C4C: ; 0x02238C4C + stmdb sp!, {lr} + sub sp, sp, #0x6c + ldr r0, _02238CD4 ; =ov13_0224F58C + mov r1, #0 + strb r1, [r0] + bl ov13_02238CE0 + mov r0, #8 + bl ov13_02227DE4 + mov r0, #2 + bl ov13_02227964 + add r0, sp, #0x16 + bl OS_GetOwnerInfo + add r1, sp, #0 + mov r0, #0 + mov r2, #0x16 + bl MIi_CpuClear16 + ldrh r2, [sp, #0x30] + add r0, sp, #0x1a + add r1, sp, #0 + mov r2, r2, lsl #1 + bl MIi_CpuCopy16 + add r0, sp, #0 + mov r1, #0x28 + bl ov13_02227A60 + mov r0, #0 + bl ov13_02226F58 + ldr r0, _02238CD8 ; =ov13_0223902C + bl ov13_0223B788 + mov r0, #0xb + bl ov13_0223ABB8 + ldr r0, _02238CDC ; =ov13_02238D88 + bl ov13_0222B8E8 + add sp, sp, #0x6c + ldmia sp!, {pc} + .balign 4, 0 +_02238CD4: .word ov13_0224F58C +_02238CD8: .word ov13_0223902C +_02238CDC: .word ov13_02238D88 + arm_func_end ov13_02238C4C + + arm_func_start ov13_02238CE0 +ov13_02238CE0: ; 0x02238CE0 + stmdb sp!, {r3, lr} + ldr r0, _02238D68 ; =ov13_02246784 + ldr r1, _02238D6C ; =GX_LoadBG2Char + bl ov13_02227924 + ldr r0, _02238D70 ; =ov13_0224679C + ldr r1, _02238D74 ; =GX_LoadBGPltt + bl ov13_02227924 + ldr r0, _02238D78 ; =ov13_022467B4 + ldr r1, _02238D7C ; =GX_LoadBG2Scr + bl ov13_02227924 + ldr r3, _02238D80 ; =0x04001008 + ldr r1, _02238D84 ; =0x0400000A + ldrh r0, [r3] + sub r2, r3, #0x1000 + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3] + ldrh r0, [r3, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r3, #2] + ldrh r0, [r2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r2] + ldrh r0, [r1] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1] + ldrh r0, [r1, #2] + bic r0, r0, #3 + orr r0, r0, #3 + strh r0, [r1, #2] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238D68: .word ov13_02246784 +_02238D6C: .word GX_LoadBG2Char +_02238D70: .word ov13_0224679C +_02238D74: .word GX_LoadBGPltt +_02238D78: .word ov13_022467B4 +_02238D7C: .word GX_LoadBG2Scr +_02238D80: .word 0x04001008 +_02238D84: .word 0x0400000A + arm_func_end ov13_02238CE0 + + arm_func_start ov13_02238D88 +ov13_02238D88: ; 0x02238D88 + stmdb sp!, {r3, lr} + mov r0, #2 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EA8 + ldr r0, _02238DB8 ; =ov13_02238DBC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238DB8: .word ov13_02238DBC + arm_func_end ov13_02238D88 + + arm_func_start ov13_02238DBC +ov13_02238DBC: ; 0x02238DBC + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #2 + bl ov13_022279B4 + ldr r0, _02238DE4 ; =ov13_02238DE8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238DE4: .word ov13_02238DE8 + arm_func_end ov13_02238DBC + + arm_func_start ov13_02238DE8 +ov13_02238DE8: ; 0x02238DE8 + stmdb sp!, {r3, lr} + bl ov13_02227258 + mvn r1, #1 + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl ov13_022272CC + ldr r0, _02238E0C ; =ov13_02238E10 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238E0C: .word ov13_02238E10 + arm_func_end ov13_02238DE8 + + arm_func_start ov13_02238E10 +ov13_02238E10: ; 0x02238E10 + stmdb sp!, {r3, lr} + bl ov13_02238E24 + bl ov13_02238E5C + bl ov13_02238E60 + ldmia sp!, {r3, pc} + arm_func_end ov13_02238E10 + + arm_func_start ov13_02238E24 +ov13_02238E24: ; 0x02238E24 + stmdb sp!, {r3, lr} + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _02238E44 + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} +_02238E44: + bl ov13_02238C2C + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl ov13_0222726C + ldmia sp!, {r3, pc} + arm_func_end ov13_02238E24 + + arm_func_start ov13_02238E5C +ov13_02238E5C: ; 0x02238E5C + bx lr + arm_func_end ov13_02238E5C + + arm_func_start ov13_02238E60 +ov13_02238E60: ; 0x02238E60 + stmdb sp!, {r3, lr} + ldr r0, _02238EA4 ; =ov13_0224F58C + ldrb r0, [r0] + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227258 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02238EA4 ; =ov13_0224F58C + mov r1, #2 + strb r1, [r0] + bl ov13_0223AC20 + mov r0, #7 + bl ov13_0223ABB8 + ldr r0, _02238EA8 ; =ov13_02238EAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238EA4: .word ov13_0224F58C +_02238EA8: .word ov13_02238EAC + arm_func_end ov13_02238E60 + + arm_func_start ov13_02238EAC +ov13_02238EAC: ; 0x02238EAC + stmdb sp!, {r3, lr} + bl ov13_022272E4 + mov r0, #8 + bl ov13_022405B8 + ldr r0, _02238EC8 ; =ov13_02238ECC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238EC8: .word ov13_02238ECC + arm_func_end ov13_02238EAC + + arm_func_start ov13_02238ECC +ov13_02238ECC: ; 0x02238ECC + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02227228 + ldr r0, _02238F30 ; =ov13_0224F58C + ldrb r0, [r0] + add r0, r0, #0xfe + and r0, r0, #0xff + cmp r0, #1 + bhi _02238F10 + mov r1, #1 + mov r2, r1 + mov r0, #3 + mov r3, #8 + bl ov13_022403B8 +_02238F10: + mov r0, #3 + mov r1, #0 + mov r2, #0x15 + mov r3, #8 + bl ov13_022403B8 + ldr r0, _02238F34 ; =ov13_02238F38 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02238F30: .word ov13_0224F58C +_02238F34: .word ov13_02238F38 + arm_func_end ov13_02238ECC + + arm_func_start ov13_02238F38 +ov13_02238F38: ; 0x02238F38 + stmdb sp!, {r3, lr} + mov r0, #0 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223901C ; =ov13_0224F58C + ldrb r0, [r0] + cmp r0, #2 + bne _02238F6C + mov r0, #1 + bl ov13_02240394 + cmp r0, #0 + ldmneia sp!, {r3, pc} +_02238F6C: + bl ov13_022272A0 + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov13_0223B940 + bl ov13_02227028 + mov r0, #0 + bl ov13_02240B04 + ldr r0, _0223901C ; =ov13_0224F58C + ldrb r0, [r0] + add r0, r0, #0xfe + and r0, r0, #0xff + cmp r0, #1 + bhi _02238FB0 + bl ov13_0222788C + mov r0, #1 + mov r1, r0 + bl ov13_02240EFC +_02238FB0: + mov r0, #0 + mov r1, #0x15 + bl ov13_02240EFC + ldr r0, _0223901C ; =ov13_0224F58C + ldrb r0, [r0] + cmp r0, #2 + bne _02238FE4 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02239020 ; =ov13_022368D8 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02238FE4: + cmp r0, #3 + bne _02239004 + mov r0, #2 + mov r1, #1 + bl ov13_0222B8F8 + ldr r0, _02239024 ; =ov13_022388A0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_02239004: + mov r0, #0 + mov r1, r0 + bl ov13_0222B8F8 + ldr r0, _02239028 ; =ov13_02238694 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223901C: .word ov13_0224F58C +_02239020: .word ov13_022368D8 +_02239024: .word ov13_022388A0 +_02239028: .word ov13_02238694 + arm_func_end ov13_02238F38 + + arm_func_start ov13_0223902C +ov13_0223902C: ; 0x0223902C + stmdb sp!, {r3, lr} + ldr r1, _02239108 ; =ov13_0224F58C + ldrb r2, [r1] + cmp r2, #0 + ldmneia sp!, {r3, pc} + cmp r0, #3 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_0223904C: ; jump table + b _0223905C ; case 0 + b _0223909C ; case 1 + b _022390B4 ; case 2 + b _022390E8 ; case 3 +_0223905C: + mov r0, #3 + strb r0, [r1] + bl ov13_0223AC20 + mov r0, #0x12 + bl ov13_0223ABB8 + mov r1, #1 + mov ip, #0 + mov r2, r1 + sub r3, r1, #2 + mov r0, #0x10 + str ip, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _0223910C ; =ov13_02239118 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_0223909C: + mov r0, #1 + strb r0, [r1] + bl ov13_0223AC20 + ldr r0, _02239110 ; =ov13_02238EAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022390B4: + bl ov13_0223AC20 + mov r0, #0 + bl ov13_0223BA24 + mov r2, #1 + mov r1, #0 + sub r3, r2, #2 + mov r0, #0x11 + str r1, [sp] + bl ov13_0223BE6C + bl ov13_022272E4 + ldr r0, _02239114 ; =ov13_02239164 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022390E8: + mov r0, #2 + strb r0, [r1] + bl ov13_0223AC20 + mov r0, #9 + bl ov13_0223ABB8 + ldr r0, _02239110 ; =ov13_02238EAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239108: .word ov13_0224F58C +_0223910C: .word ov13_02239118 +_02239110: .word ov13_02238EAC +_02239114: .word ov13_02239164 + arm_func_end ov13_0223902C + + arm_func_start ov13_02239118 +ov13_02239118: ; 0x02239118 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + bl ov13_0223ABB8 + bl ov13_0223C198 + ldr r0, _02239140 ; =ov13_02239144 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239140: .word ov13_02239144 + arm_func_end ov13_02239118 + + arm_func_start ov13_02239144 +ov13_02239144: ; 0x02239144 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02239160 ; =ov13_02238EAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239160: .word ov13_02238EAC + arm_func_end ov13_02239144 + + arm_func_start ov13_02239164 +ov13_02239164: ; 0x02239164 + stmdb sp!, {r3, lr} + bl ov13_0223C1DC + cmp r0, #0 + beq _02239194 + cmp r0, #1 + ldmneia sp!, {r3, pc} + ldr r1, _022391B8 ; =ov13_0224F58C + mov r2, #3 + mov r0, #6 + strb r2, [r1] + bl ov13_0223ABB8 + b _022391A8 +_02239194: + ldr r1, _022391B8 ; =ov13_0224F58C + mov r2, #1 + mov r0, #7 + strb r2, [r1] + bl ov13_0223ABB8 +_022391A8: + bl ov13_0223C198 + ldr r0, _022391BC ; =ov13_022391C0 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022391B8: .word ov13_0224F58C +_022391BC: .word ov13_022391C0 + arm_func_end ov13_02239164 + + arm_func_start ov13_022391C0 +ov13_022391C0: ; 0x022391C0 + stmdb sp!, {r3, lr} + bl ov13_0223C1F0 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02239218 ; =ov13_0224F58C + ldrb r0, [r0] + cmp r0, #1 + bne _022391EC + ldr r0, _0223921C ; =ov13_02238EAC + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} +_022391EC: + mov r0, #0xb + bl ov13_0223ABB8 + bl ov13_022272CC + ldr r1, _02239218 ; =ov13_0224F58C + mov r2, #0 + ldr r0, _02239220 ; =ov13_0223902C + strb r2, [r1] + bl ov13_0223BA24 + ldr r0, _02239224 ; =ov13_02238E10 + bl ov13_0222B8E8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239218: .word ov13_0224F58C +_0223921C: .word ov13_02238EAC +_02239220: .word ov13_0223902C +_02239224: .word ov13_02238E10 + arm_func_end ov13_022391C0 + + arm_func_start ov13_02239228 +ov13_02239228: ; 0x02239228 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _0223927C ; =0x00000608 + mov r1, #4 + bl ov13_0224128C + mov ip, r0 + ldr r3, _02239280 ; =ov13_0224F590 + mov r0, r4 + add r1, ip, #4 + mov r2, #0x600 + str ip, [r3] + bl MIi_CpuCopyFast + ldr r1, _02239284 ; =ov13_02239324 + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _02239280 ; =ov13_0224F590 + ldr r1, [r1] + str r0, [r1] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223927C: .word 0x00000608 +_02239280: .word ov13_0224F590 +_02239284: .word ov13_02239324 + arm_func_end ov13_02239228 + + arm_func_start ov13_02239288 +ov13_02239288: ; 0x02239288 + stmdb sp!, {r3, lr} + ldr r1, _022392AC ; =ov13_0224F590 + mov r0, #1 + ldr r1, [r1] + ldr r1, [r1] + bl ov13_022425F0 + ldr r0, _022392B0 ; =ov13_0224F590 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022392AC: .word ov13_0224F590 +_022392B0: .word ov13_0224F590 + arm_func_end ov13_02239288 + + arm_func_start ov13_022392B4 +ov13_022392B4: ; 0x022392B4 + ldr r0, _022392C8 ; =ov13_0224F590 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x604] + bx lr + .balign 4, 0 +_022392C8: .word ov13_0224F590 + arm_func_end ov13_022392B4 + + arm_func_start ov13_022392CC +ov13_022392CC: ; 0x022392CC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr ip, _02239320 ; =ov13_0224F590 + mov r7, r3 + ldr r3, [ip] + mov r8, r0 + add r0, r3, #4 + add r4, r0, r1, lsl #1 + mov r5, #0 + cmp r7, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, pc} + mov r6, r2, lsl #1 +_022392F8: + mov r0, r8 + mov r1, r4 + mov r2, r6 + bl MIi_CpuCopy16 + add r5, r5, #1 + cmp r5, r7 + add r8, r8, #0x40 + add r4, r4, #0x40 + blt _022392F8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02239320: .word ov13_0224F590 + arm_func_end ov13_022392CC + + arm_func_start ov13_02239324 +ov13_02239324: ; 0x02239324 + stmdb sp!, {r3, lr} + ldr r0, _02239374 ; =ov13_0224F590 + ldr r1, [r0] + ldrb r0, [r1, #0x604] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #4 + mov r1, #0x600 + bl DC_FlushRange + ldr r0, _02239374 ; =ov13_0224F590 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x600 + add r0, r0, #4 + bl GX_LoadBG2Scr + ldr r0, _02239374 ; =ov13_0224F590 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x604] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239374: .word ov13_0224F590 + arm_func_end ov13_02239324 + + arm_func_start ov13_02239378 +ov13_02239378: ; 0x02239378 + stmdb sp!, {r3, lr} + ldr ip, _022393AC ; =ov13_0224F590 + add r3, r0, r1, lsl #5 + mov r0, r2, lsl #5 + ldr r1, _022393B0 ; =ov13_022393B4 + str r3, [ip, #4] + add lr, r0, #0x5000000 + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + str lr, [ip, #8] + bl ov13_02242528 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022393AC: .word ov13_0224F590 +_022393B0: .word ov13_022393B4 + arm_func_end ov13_02239378 + + arm_func_start ov13_022393B4 +ov13_022393B4: ; 0x022393B4 + stmdb sp!, {r4, lr} + ldr r1, _022393DC ; =ov13_0224F590 + mov r4, r0 + mov r2, #0x20 + ldmib r1, {r0, r1} + bl MIi_CpuCopy16 + mov r1, r4 + mov r0, #1 + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022393DC: .word ov13_0224F590 + arm_func_end ov13_022393B4 + + arm_func_start ov13_022393E0 +ov13_022393E0: ; 0x022393E0 + ldr r2, _02239400 ; =ov13_0224F590 + ldr ip, _02239404 ; =ov13_02242528 + str r0, [r2, #4] + ldr r1, _02239408 ; =ov13_0223940C + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bx ip + .balign 4, 0 +_02239400: .word ov13_0224F590 +_02239404: .word ov13_02242528 +_02239408: .word ov13_0223940C + arm_func_end ov13_022393E0 + + arm_func_start ov13_0223940C +ov13_0223940C: ; 0x0223940C + stmdb sp!, {r4, lr} + ldr r1, _02239438 ; =ov13_0224F590 + mov r4, r0 + ldr r0, [r1, #4] + mov r1, #0x5000000 + mov r2, #0x200 + bl MIi_CpuCopy16 + mov r1, r4 + mov r0, #1 + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02239438: .word ov13_0224F590 + arm_func_end ov13_0223940C + + arm_func_start ov13_0223943C +ov13_0223943C: ; 0x0223943C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r7, r1 + mov r0, #0x20 + mov r1, #4 + mov r5, r2 + mov r4, r3 + bl ov13_0224128C + ldr r2, _02239508 ; =ov13_0224F59C + ldr ip, [sp, #0x18] + str r0, [r2] + strb r6, [r0, #0x1b] + ldr r1, [r2] + mov r0, r5 + strb r7, [r1, #0x19] + ldr r3, [r2] + mov r1, r4 + strb ip, [r3, #0x1a] + ldr r2, [r2] + add r2, r2, #0x10 + bl ov13_02240E50 + ldr r1, _0223950C ; =ov13_02245790 + mov r0, #0 + ldrb r1, [r1, r6] + mov r2, #1 + bl ov13_022401B0 + mov r2, r5 + ldr r5, _02239508 ; =ov13_0224F59C + ldr r3, [sp, #0x18] + ldr r6, [r5] + mvn r1, #0 + str r0, [r6] + ldr r0, [r5] + add r3, r4, r3 + ldr r0, [r0] + bl ov13_0223FF18 + mov r0, r5 + ldr r0, [r0] + mvn r1, #0 + ldr r0, [r0] + mov r2, #1 + bl ov13_02240008 + mov r0, #0 + ldr r1, _02239510 ; =ov13_022395B4 + mov r2, r0 + mov r3, #0x80 + bl ov13_02242528 + mov r1, r5 + ldr r1, [r1] + str r0, [r1, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02239508: .word ov13_0224F59C +_0223950C: .word ov13_02245790 +_02239510: .word ov13_022395B4 + arm_func_end ov13_0223943C + + arm_func_start ov13_02239514 +ov13_02239514: ; 0x02239514 + stmdb sp!, {r3, lr} + ldr r1, _02239548 ; =ov13_0224F59C + mov r0, #0 + ldr r1, [r1] + ldr r1, [r1, #0xc] + bl ov13_022425F0 + ldr r0, _02239548 ; =ov13_0224F59C + ldr r0, [r0] + ldr r0, [r0] + bl ov13_0223FD60 + ldr r0, _0223954C ; =ov13_0224F59C + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239548: .word ov13_0224F59C +_0223954C: .word ov13_0224F59C + arm_func_end ov13_02239514 + + arm_func_start ov13_02239550 +ov13_02239550: ; 0x02239550 + ldr r0, _02239560 ; =ov13_0224F59C + ldr r0, [r0] + ldrb r0, [r0, #0x1a] + bx lr + .balign 4, 0 +_02239560: .word ov13_0224F59C + arm_func_end ov13_02239550 + + arm_func_start ov13_02239564 +ov13_02239564: ; 0x02239564 + ldr r0, _02239574 ; =ov13_0224F59C + ldr r0, [r0] + ldrb r0, [r0, #0x1d] + bx lr + .balign 4, 0 +_02239574: .word ov13_0224F59C + arm_func_end ov13_02239564 + + arm_func_start ov13_02239578 +ov13_02239578: ; 0x02239578 + ldr ip, _02239580 ; =ov13_02239AC4 + bx ip + .balign 4, 0 +_02239580: .word ov13_02239AC4 + arm_func_end ov13_02239578 + + arm_func_start ov13_02239584 +ov13_02239584: ; 0x02239584 + ldr r0, _02239598 ; =ov13_0224F59C + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x1e] + bx lr + .balign 4, 0 +_02239598: .word ov13_0224F59C + arm_func_end ov13_02239584 + + arm_func_start ov13_0223959C +ov13_0223959C: ; 0x0223959C + ldr r0, _022395B0 ; =ov13_0224F59C + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x1e] + bx lr + .balign 4, 0 +_022395B0: .word ov13_0224F59C + arm_func_end ov13_0223959C + + arm_func_start ov13_022395B4 +ov13_022395B4: ; 0x022395B4 + stmdb sp!, {r3, lr} + ldr r0, _02239734 ; =ov13_0224F59C + mov r2, #0 + ldr r1, [r0] + strb r2, [r1, #0x1d] + ldr r1, [r0] + ldrb r0, [r1, #0x1c] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_022395DC: ; jump table + b _022395EC ; case 0 + b _0223969C ; case 1 + b _022396A4 ; case 2 + b _022396EC ; case 3 +_022395EC: + ldrb r0, [r1, #0x1e] + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_02239914 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_02239608: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _0223961C ; case 1 + b _0223967C ; case 2 + b _02239688 ; case 3 + b _02239694 ; case 4 +_0223961C: + ldr r0, _02239734 ; =ov13_0224F59C + ldr r0, [r0] + ldrb r0, [r0, #0x1b] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0x16 + bl ov13_0223ABB8 + mov r0, #0 + bl ov13_0223ABDC + ldr r0, _02239734 ; =ov13_0224F59C + mov r2, #1 + ldr r1, [r0] + strb r2, [r1, #0x1d] + ldr r0, [r0] + add r0, r0, #0x14 + bl ov13_022419DC + ldr r0, _02239734 ; =ov13_0224F59C + mov r1, #1 + ldr r3, [r0] + ldrb r2, [r3, #0x1a] + strb r2, [r3, #0x18] + ldr r0, [r0] + strb r1, [r0, #0x1c] + ldmia sp!, {r3, pc} +_0223967C: + mov r0, #2 + bl ov13_02239880 + ldmia sp!, {r3, pc} +_02239688: + mov r0, #3 + bl ov13_02239880 + ldmia sp!, {r3, pc} +_02239694: + bl ov13_022398AC + ldmia sp!, {r3, pc} +_0223969C: + bl ov13_02239738 + ldmia sp!, {r3, pc} +_022396A4: + mov r0, #2 + bl ov13_022399A0 + cmp r0, #2 + beq _022396D4 + ldr r0, _02239734 ; =ov13_0224F59C + mov r3, #5 + ldr r2, [r0] + mov r1, #0 + strb r3, [r2, #0x1d] + ldr r0, [r0] + strb r1, [r0, #0x1c] + ldmia sp!, {r3, pc} +_022396D4: + bl ov13_02239914 + cmp r0, #2 + ldmneia sp!, {r3, pc} + mov r0, #2 + bl ov13_02239880 + ldmia sp!, {r3, pc} +_022396EC: + mov r0, #3 + bl ov13_022399A0 + cmp r0, #3 + beq _0223971C + ldr r0, _02239734 ; =ov13_0224F59C + mov r3, #7 + ldr r2, [r0] + mov r1, #0 + strb r3, [r2, #0x1d] + ldr r0, [r0] + strb r1, [r0, #0x1c] + ldmia sp!, {r3, pc} +_0223971C: + bl ov13_02239914 + cmp r0, #3 + ldmneia sp!, {r3, pc} + mov r0, #3 + bl ov13_02239880 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239734: .word ov13_0224F59C + arm_func_end ov13_022395B4 + + arm_func_start ov13_02239738 +ov13_02239738: ; 0x02239738 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _022397FC ; =ov13_02245958 + bl ov13_02241754 + cmp r0, #0 + beq _022397D4 + add r0, sp, #0 + bl ov13_022419DC + ldr r0, _02239800 ; =ov13_0224F59C + ldrh r1, [sp] + ldr r3, [r0] + ldrh r0, [r3, #0x10] + sub r0, r0, #0x1e + cmp r1, r0 + blt _022397D4 + ldrh r1, [sp, #2] + ldrh r0, [r3, #0x16] + ldrb r2, [r3, #0x18] + sub r0, r1, r0 + adds r4, r2, r0 + movmi r4, #0 + bmi _022397AC + ldrb r1, [r3, #0x1b] + ldr r0, _02239804 ; =ov13_02245794 + ldrb r2, [r3, #0x19] + ldrb r0, [r0, r1] + sub r0, r2, r0 + cmp r4, r0 + movge r4, r0 +_022397AC: + mov r0, r4 + bl ov13_02239808 + mov r0, r4 + bl ov13_02239AC4 + ldr r0, _02239800 ; =ov13_0224F59C + mov r1, #2 + ldr r0, [r0] + add sp, sp, #4 + strb r1, [r0, #0x1d] + ldmia sp!, {r3, r4, pc} +_022397D4: + bl ov13_0223AC20 + ldr r0, _02239800 ; =ov13_0224F59C + mov r3, #0 + ldr r2, [r0] + mov r1, #3 + strb r3, [r2, #0x1c] + ldr r0, [r0] + strb r1, [r0, #0x1d] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022397FC: .word ov13_02245958 +_02239800: .word ov13_0224F59C +_02239804: .word ov13_02245794 + arm_func_end ov13_02239738 + + arm_func_start ov13_02239808 +ov13_02239808: ; 0x02239808 + stmdb sp!, {r4, lr} + ldr r1, _02239878 ; =ov13_0224F59C + ldr r1, [r1] + ldrb r1, [r1, #0x1a] + subs r4, r1, r0 + rsbmi r4, r4, #0 + cmp r4, #2 + movlt r0, #0 + blt _02239840 + cmp r4, #6 + mov r0, #0x7f + bge _02239840 + rsb r1, r4, #6 + bl FX_DivS32 +_02239840: + bl ov13_0223ABDC + cmp r4, #2 + mvnlt r1, #0xff + blt _0223986C + cmp r4, #6 + movge r1, #0x100 + bge _0223986C + rsb r1, r4, #6 + mov r0, #0x200 + bl FX_DivS32 + sub r1, r0, #0x100 +_0223986C: + ldr r0, _0223987C ; =0x0000FFFF + bl ov13_0223ABFC + ldmia sp!, {r4, pc} + .balign 4, 0 +_02239878: .word ov13_0224F59C +_0223987C: .word 0x0000FFFF + arm_func_end ov13_02239808 + + arm_func_start ov13_02239880 +ov13_02239880: ; 0x02239880 + ldr r1, _022398A8 ; =ov13_0224F59C + cmp r0, #2 + ldr r1, [r1] + strb r0, [r1, #0x1c] + ldr r0, _022398A8 ; =ov13_0224F59C + moveq r1, #4 + ldr r0, [r0] + movne r1, #6 + strb r1, [r0, #0x1d] + bx lr + .balign 4, 0 +_022398A8: .word ov13_0224F59C + arm_func_end ov13_02239880 + + arm_func_start ov13_022398AC +ov13_022398AC: ; 0x022398AC + stmdb sp!, {r3, lr} + add r0, sp, #0 + bl ov13_022419DC + ldr r0, _0223990C ; =ov13_0224F59C + ldr r2, _02239910 ; =ov13_02245794 + ldr ip, [r0] + ldrh r1, [sp, #2] + ldrb r3, [ip, #0x1b] + ldrh r0, [ip, #0x12] + ldrb r2, [r2, r3] + sub r0, r1, r0 + subs r0, r0, r2, lsr #1 + movmi r0, #0 + bmi _022398F4 + ldrb r1, [ip, #0x19] + sub r1, r1, r2 + cmp r0, r1 + movge r0, r1 +_022398F4: + bl ov13_02239AC4 + ldr r0, _0223990C ; =ov13_0224F59C + mov r1, #3 + ldr r0, [r0] + strb r1, [r0, #0x1d] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223990C: .word ov13_0224F59C +_02239910: .word ov13_02245794 + arm_func_end ov13_022398AC + + arm_func_start ov13_02239914 +ov13_02239914: ; 0x02239914 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + add r1, sp, #0 + mov r0, #1 + bl ov13_022399EC + add r0, sp, #0 + bl ov13_02241864 + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r5, #2 + add r4, sp, #0 +_02239948: + mov r0, r5 + mov r1, r4 + bl ov13_022399EC + mov r0, r4 + bl ov13_02241864 + cmp r0, #0 + addne sp, sp, #8 + movne r0, r5 + ldmneia sp!, {r3, r4, r5, pc} + add r5, r5, #1 + cmp r5, #3 + ble _02239948 + add r1, sp, #0 + mov r0, #4 + bl ov13_022399EC + add r0, sp, #0 + bl ov13_022417DC + cmp r0, #0 + movne r0, #4 + moveq r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov13_02239914 + + arm_func_start ov13_022399A0 +ov13_022399A0: ; 0x022399A0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, #2 + add r4, sp, #0 +_022399B0: + mov r0, r5 + mov r1, r4 + bl ov13_022399EC + mov r0, r4 + bl ov13_02241754 + cmp r0, #0 + addne sp, sp, #8 + movne r0, r5 + ldmneia sp!, {r3, r4, r5, pc} + add r5, r5, #1 + cmp r5, #3 + ble _022399B0 + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov13_022399A0 + + arm_func_start ov13_022399EC +ov13_022399EC: ; 0x022399EC + ldr r2, _02239ABC ; =ov13_0224F59C + cmp r0, #4 + ldr r3, [r2] + ldrh r3, [r3, #0x10] + strh r3, [r1] + add r3, r3, #0xc + strh r3, [r1, #4] + addls pc, pc, r0, lsl #2 + bx lr +_02239A10: ; jump table + bx lr ; case 0 + b _02239A24 ; case 1 + b _02239A58 ; case 2 + b _02239A78 ; case 3 + b _02239A9C ; case 4 +_02239A24: + ldr r3, [r2] + ldr r0, _02239AC0 ; =ov13_02245794 + ldrh ip, [r3, #0x12] + ldrb r3, [r3, #0x1a] + add r3, ip, r3 + strh r3, [r1, #2] + ldr r2, [r2] + ldrh r3, [r1, #2] + ldrb r2, [r2, #0x1b] + ldrb r0, [r0, r2] + add r0, r3, r0 + strh r0, [r1, #6] + bx lr +_02239A58: + ldr r0, [r2] + ldrh r0, [r0, #0x12] + sub r0, r0, #0xd + strh r0, [r1, #2] + ldr r0, [r2] + ldrh r0, [r0, #0x12] + strh r0, [r1, #6] + bx lr +_02239A78: + ldr r0, [r2] + ldrh r2, [r0, #0x12] + ldrb r0, [r0, #0x19] + add r0, r2, r0 + strh r0, [r1, #2] + ldrh r0, [r1, #2] + add r0, r0, #0xd + strh r0, [r1, #6] + bx lr +_02239A9C: + ldr r0, [r2] + ldrh r3, [r0, #0x12] + strh r3, [r1, #2] + ldr r0, [r2] + ldrb r0, [r0, #0x19] + add r0, r3, r0 + strh r0, [r1, #6] + bx lr + .balign 4, 0 +_02239ABC: .word ov13_0224F59C +_02239AC0: .word ov13_02245794 + arm_func_end ov13_022399EC + + arm_func_start ov13_02239AC4 +ov13_02239AC4: ; 0x02239AC4 + stmdb sp!, {r4, lr} + ldr r1, _02239AFC ; =ov13_0224F59C + mov r4, r0 + ldr r0, [r1] + mvn r1, #0 + ldrh r3, [r0, #0x12] + ldrh r2, [r0, #0x10] + ldr r0, [r0] + add r3, r4, r3 + bl ov13_0223FF18 + ldr r0, _02239AFC ; =ov13_0224F59C + ldr r0, [r0] + strb r4, [r0, #0x1a] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02239AFC: .word ov13_0224F59C + arm_func_end ov13_02239AC4 + + arm_func_start ov13_02239B00 +ov13_02239B00: ; 0x02239B00 + stmdb sp!, {r3, lr} + ldr r0, _02239B2C ; =ov13_0224F5A0 + ldr r0, [r0] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02239B30 ; =0x00001E60 + mov r1, #0x20 + bl ov13_0224128C + ldr r1, _02239B2C ; =ov13_0224F5A0 + str r0, [r1] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239B2C: .word ov13_0224F5A0 +_02239B30: .word 0x00001E60 + arm_func_end ov13_02239B00 + + arm_func_start ov13_02239B34 +ov13_02239B34: ; 0x02239B34 + stmdb sp!, {r3, lr} + ldr r0, _02239B60 ; =ov13_0224F5A0 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} +_02239B48: + bl WM_GetAllowedChannel + cmp r0, #0x8000 + bne _02239B48 + ldr r0, _02239B64 ; =ov13_0224F5A0 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239B60: .word ov13_0224F5A0 +_02239B64: .word ov13_0224F5A0 + arm_func_end ov13_02239B34 + + arm_func_start ov13_02239B68 +ov13_02239B68: ; 0x02239B68 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _02239C28 ; =ov13_0224F5A0 + mov r0, #0 + ldr r1, [r1] + mov r2, #0x348 + add r1, r1, #0x1300 + bl MIi_CpuClear16 + ldr r0, _02239C28 ; =ov13_0224F5A0 + ldr r1, _02239C2C ; =ov13_02239D60 + ldr r0, [r0] + mov r2, #3 + bl WM_Initialize + cmp r0, #2 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r4, _02239C28 ; =ov13_0224F5A0 +_02239BA8: + ldr r0, [r4] + add r0, r0, #0x28c + add r0, r0, #0x1400 + bl WM_ReadStatus + ldr ip, [r4] + add r0, ip, #0x1600 + ldrh r0, [r0, #0x8c] + cmp r0, #2 + bne _02239BA8 + add r0, ip, #0x248 + ldr r5, _02239C30 ; =ov13_022457A4 + add lr, r0, #0x1400 + mov r4, #4 +_02239BDC: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _02239BDC + ldr r0, [r5] + add r1, ip, #0xf00 + str r0, [lr] + add r0, ip, #0x1000 + str r1, [r0, #0x648] + bl WM_GetDispersionScanPeriod + ldr r1, _02239C28 ; =ov13_0224F5A0 + ldr r1, [r1] + add r1, r1, #0x1600 + strh r0, [r1, #0x50] + bl ov13_02239C34 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02239C28: .word ov13_0224F5A0 +_02239C2C: .word ov13_02239D60 +_02239C30: .word ov13_022457A4 + arm_func_end ov13_02239B68 + + arm_func_start ov13_02239C34 +ov13_02239C34: ; 0x02239C34 + stmdb sp!, {r3, lr} + ldr r1, _02239C60 ; =ov13_0224F5A0 + ldr r0, _02239C64 ; =ov13_02239D60 + ldr r1, [r1] + add r1, r1, #0x248 + add r1, r1, #0x1400 + bl WM_StartScanEx + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239C60: .word ov13_0224F5A0 +_02239C64: .word ov13_02239D60 + arm_func_end ov13_02239C34 + + arm_func_start ov13_02239C68 +ov13_02239C68: ; 0x02239C68 + stmdb sp!, {r4, lr} + ldr r1, _02239CFC ; =ov13_0224F5A0 + mov r2, #1 + ldr r0, [r1] + add r0, r0, #0x1000 + strb r2, [r0, #0xe5c] + ldr r0, [r1] + add r0, r0, #0x28c + add r0, r0, #0x1400 + bl WM_ReadStatus + ldr r0, _02239CFC ; =ov13_0224F5A0 + ldr r0, [r0] + add r0, r0, #0x1600 + ldrh r0, [r0, #0x8c] + cmp r0, #2 + beq _02239CE4 + ldr r0, _02239D00 ; =ov13_02239D60 + bl WM_Reset + cmp r0, #2 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r4, _02239CFC ; =ov13_0224F5A0 +_02239CC0: + ldr r0, [r4] + add r0, r0, #0x28c + add r0, r0, #0x1400 + bl WM_ReadStatus + ldr r0, [r4] + add r0, r0, #0x1600 + ldrh r0, [r0, #0x8c] + cmp r0, #2 + bne _02239CC0 +_02239CE4: + ldr r0, _02239D00 ; =ov13_02239D60 + bl WM_End + cmp r0, #2 + movne r0, #0 + moveq r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02239CFC: .word ov13_0224F5A0 +_02239D00: .word ov13_02239D60 + arm_func_end ov13_02239C68 + + arm_func_start ov13_02239D04 +ov13_02239D04: ; 0x02239D04 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _02239D58 ; =ov13_0224F5A0 + mov r6, #0 + ldr r1, [r1] + ldr r5, _02239D5C ; =ov13_0224579C + add r8, r1, #0x1300 + mov r7, r6 + str r8, [r0] + mov r4, #6 +_02239D28: + mov r1, r5 + mov r2, r4 + add r0, r8, #0x20 + bl memcmp + cmp r0, #0 + add r7, r7, #1 + addne r6, r6, #1 + cmp r7, #0x14 + add r8, r8, #0x2a + blt _02239D28 + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02239D58: .word ov13_0224F5A0 +_02239D5C: .word ov13_0224579C + arm_func_end ov13_02239D04 + + arm_func_start ov13_02239D60 +ov13_02239D60: ; 0x02239D60 + stmdb sp!, {r3, lr} + ldrh r1, [r0, #2] + cmp r1, #0 + ldmneia sp!, {r3, pc} + ldr r1, _02239DC0 ; =ov13_0224F5A0 + ldr r1, [r1] + add r1, r1, #0x1000 + ldrb r1, [r1, #0xe5c] + cmp r1, #0 + ldreqh r1, [r0] + cmpeq r1, #0x26 + ldmneia sp!, {r3, pc} + ldrh r1, [r0, #8] + cmp r1, #4 + beq _02239DB0 + cmp r1, #5 + bne _02239DB8 + bl ov13_02239DC4 + bl ov13_02239C34 + ldmia sp!, {r3, pc} +_02239DB0: + bl ov13_02239C34 + ldmia sp!, {r3, pc} +_02239DB8: + bl OS_Terminate + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239DC0: .word ov13_0224F5A0 + arm_func_end ov13_02239D60 + + arm_func_start ov13_02239DC4 +ov13_02239DC4: ; 0x02239DC4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x88 + ldr r1, _02239F8C ; =ov13_0224F5A0 + mov fp, r0 + ldr r2, [r1] + mov r1, #0x400 + add r0, r2, #0xf00 + add r2, r2, #0x1300 + str r2, [sp] + bl DC_InvalidateRange + ldrh r0, [fp, #0xe] + mov sl, #0 + cmp r0, #0 + addle sp, sp, #0x88 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02239E00: + add r0, fp, sl, lsl #2 + ldr r4, [r0, #0x10] + ldrb r0, [r4, #0xc] + cmp r0, #0 + beq _02239F74 + ldrh r0, [r4, #0x3c] + cmp r0, #0 + bne _02239F74 + ldr r7, [sp] + mov r5, #0 + mov r6, #6 +_02239E2C: + mov r2, r6 + add r0, r4, #4 + add r1, r7, #0x20 + bl memcmp + cmp r0, #0 + beq _02239E54 + add r5, r5, #1 + cmp r5, #0x14 + add r7, r7, #0x2a + blt _02239E2C +_02239E54: + cmp r5, #0x14 + bne _02239EA0 + ldr r8, [sp] + ldr r7, _02239F90 ; =ov13_0224579C + mov r5, #0 + mov r6, #6 +_02239E6C: + mov r1, r7 + mov r2, r6 + add r0, r8, #0x20 + bl memcmp + cmp r0, #0 + beq _02239E94 + add r5, r5, #1 + cmp r5, #0x14 + add r8, r8, #0x2a + blt _02239E6C +_02239E94: + cmp r5, #0x14 + addeq sp, sp, #0x88 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02239EA0: + ldr r0, [sp] + mov r1, #0x2a + mla sb, r5, r1, r0 + add r0, r4, #4 + add r1, sb, #0x20 + mov r2, #6 + bl MI_CpuCopy8 + mov r1, sb + add r0, r4, #0xc + mov r2, #0x20 + bl MI_CpuCopy8 + add r0, fp, sl, lsl #1 + ldrh r0, [r0, #0x50] + strh r0, [sb, #0x26] + ldrh r0, [r4, #0x2c] + tst r0, #0x10 + moveq r0, #0 + streqb r0, [sb, #0x28] + beq _02239F74 + mov r2, #1 + add r0, sp, #4 + mov r1, r4 + strb r2, [sb, #0x28] + bl WM_GetOtherElements + ldrb r8, [sp, #4] + mov r7, #0 + cmp r8, #0 + ble _02239F74 + ldr r5, _02239F94 ; =ov13_02245798 + mov r4, #4 + add r6, sp, #4 +_02239F1C: + add r1, r6, r7, lsl #3 + ldrb r0, [r1, #4] + cmp r0, #0x30 + moveq r0, #2 + streqb r0, [sb, #0x28] + beq _02239F74 + cmp r0, #0xdd + bne _02239F68 + ldrb r0, [r1, #5] + cmp r0, #4 + blo _02239F68 + ldr r0, [r1, #8] + mov r1, r5 + mov r2, r4 + bl memcmp + cmp r0, #0 + moveq r0, #2 + streqb r0, [sb, #0x28] + beq _02239F74 +_02239F68: + add r7, r7, #1 + cmp r7, r8 + blt _02239F1C +_02239F74: + ldrh r0, [fp, #0xe] + add sl, sl, #1 + cmp sl, r0 + blt _02239E00 + add sp, sp, #0x88 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02239F8C: .word ov13_0224F5A0 +_02239F90: .word ov13_0224579C +_02239F94: .word ov13_02245798 + arm_func_end ov13_02239DC4 + + arm_func_start ov13_02239F98 +ov13_02239F98: ; 0x02239F98 + stmdb sp!, {r3, lr} + ldr r0, _02239FD0 ; =0x000006F8 + mov r1, #0x20 + bl ov13_0224128C + ldr r1, _02239FD4 ; =ov13_0224F5A4 + add r2, r0, #0xf8 + str r0, [r1] + ldr r1, _02239FD8 ; =0x0000A001 + add r0, r2, #0x400 + bl MATHi_CRC16InitTableRev + ldr r0, _02239FD4 ; =ov13_0224F5A4 + ldr r0, [r0] + bl DWCi_BACKUPlRead + ldmia sp!, {r3, pc} + .balign 4, 0 +_02239FD0: .word 0x000006F8 +_02239FD4: .word ov13_0224F5A4 +_02239FD8: .word 0x0000A001 + arm_func_end ov13_02239F98 + + arm_func_start ov13_02239FDC +ov13_02239FDC: ; 0x02239FDC + ldr ip, _02239FE8 ; =ov13_022412B0 + ldr r0, _02239FEC ; =ov13_0224F5A4 + bx ip + .balign 4, 0 +_02239FE8: .word ov13_022412B0 +_02239FEC: .word ov13_0224F5A4 + arm_func_end ov13_02239FDC + + arm_func_start ov13_02239FF0 +ov13_02239FF0: ; 0x02239FF0 + ldr r0, _0223A000 ; =ov13_0224F5A4 + ldr r0, [r0] + add r0, r0, #0x400 + bx lr + .balign 4, 0 +_0223A000: .word ov13_0224F5A4 + arm_func_end ov13_02239FF0 + + arm_func_start ov13_0223A004 +ov13_0223A004: ; 0x0223A004 + ldr r1, _0223A014 ; =ov13_0224F5A4 + ldr r1, [r1] + strb r0, [r1, #0x4f5] + bx lr + .balign 4, 0 +_0223A014: .word ov13_0224F5A4 + arm_func_end ov13_0223A004 + + arm_func_start ov13_0223A018 +ov13_0223A018: ; 0x0223A018 + ldr r1, _0223A028 ; =ov13_0224F5A4 + ldr r1, [r1] + strb r0, [r1, #0x4f6] + bx lr + .balign 4, 0 +_0223A028: .word ov13_0224F5A4 + arm_func_end ov13_0223A018 + + arm_func_start ov13_0223A02C +ov13_0223A02C: ; 0x0223A02C + stmdb sp!, {r3, lr} + ldr r1, _0223A058 ; =ov13_0224F5A4 + mov r2, #0x20 + ldr r1, [r1] + add r1, r1, #0x440 + bl MI_CpuCopy8 + ldr r0, _0223A058 ; =ov13_0224F5A4 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x4e7] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A058: .word ov13_0224F5A4 + arm_func_end ov13_0223A02C + + arm_func_start ov13_0223A05C +ov13_0223A05C: ; 0x0223A05C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r1, _0223A1F0 ; =ov13_0224F5A4 + mov r6, r0 + ldr r0, [r1] + mov r1, #0 + add r0, r0, #0x480 + mov r2, #0x10 + bl MI_CpuFill8 + mov r0, r6 + mov r1, #0x20 + bl ov13_02242074 + mov r5, r0 + cmp r5, #0xa + bgt _0223A0A4 + bge _0223A0BC + cmp r5, #0 + beq _0223A0BC + b _0223A114 +_0223A0A4: + cmp r5, #0x1a + bgt _0223A0B4 + beq _0223A0BC + b _0223A114 +_0223A0B4: + cmp r5, #0x20 + bne _0223A114 +_0223A0BC: + ldr r0, _0223A1F0 ; =ov13_0224F5A4 + cmp r5, #0 + ldr r2, [r0] + mov r4, #0 + ldrb r1, [r2, #0x4e6] + bic r1, r1, #0xfc + strb r1, [r2, #0x4e6] + ldr r0, [r0] + add r8, r0, #0x480 + ble _0223A140 +_0223A0E4: + ldrb r0, [r6, r4] + add sb, r6, r4 + bl ov13_0223AAE0 + mov r7, r0 + ldrb r0, [sb, #1] + bl ov13_0223AAE0 + add r0, r0, r7, lsl #4 + add r4, r4, #2 + cmp r4, r5 + strb r0, [r8], #1 + blt _0223A0E4 + b _0223A140 +_0223A114: + ldr r1, _0223A1F0 ; =ov13_0224F5A4 + mov r0, r6 + ldr r4, [r1] + mov r2, #0x10 + ldrb r3, [r4, #0x4e6] + bic r3, r3, #0xfc + orr r3, r3, #4 + strb r3, [r4, #0x4e6] + ldr r1, [r1] + add r1, r1, #0x480 + bl MI_CpuCopy8 +_0223A140: + cmp r5, #5 + bgt _0223A158 + bge _0223A19C + cmp r5, #0 + beq _0223A184 + b _0223A1D4 +_0223A158: + cmp r5, #0xd + bgt _0223A178 + cmp r5, #0xa + blt _0223A1D4 + beq _0223A19C + cmp r5, #0xd + beq _0223A1B8 + b _0223A1D4 +_0223A178: + cmp r5, #0x1a + beq _0223A1B8 + b _0223A1D4 +_0223A184: + ldr r0, _0223A1F0 ; =ov13_0224F5A4 + ldr r1, [r0] + ldrb r0, [r1, #0x4e6] + bic r0, r0, #3 + strb r0, [r1, #0x4e6] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223A19C: + ldr r0, _0223A1F0 ; =ov13_0224F5A4 + ldr r1, [r0] + ldrb r0, [r1, #0x4e6] + bic r0, r0, #3 + orr r0, r0, #1 + strb r0, [r1, #0x4e6] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223A1B8: + ldr r0, _0223A1F0 ; =ov13_0224F5A4 + ldr r1, [r0] + ldrb r0, [r1, #0x4e6] + bic r0, r0, #3 + orr r0, r0, #2 + strb r0, [r1, #0x4e6] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223A1D4: + ldr r0, _0223A1F0 ; =ov13_0224F5A4 + ldr r1, [r0] + ldrb r0, [r1, #0x4e6] + bic r0, r0, #3 + orr r0, r0, #3 + strb r0, [r1, #0x4e6] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223A1F0: .word ov13_0224F5A4 + arm_func_end ov13_0223A05C + + arm_func_start ov13_0223A1F4 +ov13_0223A1F4: ; 0x0223A1F4 + ldr r1, _0223A208 ; =ov13_0224F5A4 + ldr ip, _0223A20C ; =ov13_0223AA58 + ldr r1, [r1] + add r1, r1, #0x4c0 + bx ip + .balign 4, 0 +_0223A208: .word ov13_0224F5A4 +_0223A20C: .word ov13_0223AA58 + arm_func_end ov13_0223A1F4 + + arm_func_start ov13_0223A210 +ov13_0223A210: ; 0x0223A210 + ldr r1, _0223A224 ; =ov13_0224F5A4 + ldr ip, _0223A228 ; =ov13_0223AA58 + ldr r1, [r1] + add r1, r1, #0x4f0 + bx ip + .balign 4, 0 +_0223A224: .word ov13_0224F5A4 +_0223A228: .word ov13_0223AA58 + arm_func_end ov13_0223A210 + + arm_func_start ov13_0223A22C +ov13_0223A22C: ; 0x0223A22C + ldr r1, _0223A244 ; =ov13_0224F5A4 + ldr ip, _0223A248 ; =ov13_0223AA58 + ldr r1, [r1] + add r1, r1, #0xc4 + add r1, r1, #0x400 + bx ip + .balign 4, 0 +_0223A244: .word ov13_0224F5A4 +_0223A248: .word ov13_0223AA58 + arm_func_end ov13_0223A22C + + arm_func_start ov13_0223A24C +ov13_0223A24C: ; 0x0223A24C + ldr r1, _0223A264 ; =ov13_0224F5A4 + ldr ip, _0223A268 ; =ov13_0223AA58 + ldr r1, [r1] + add r1, r1, #0xc8 + add r1, r1, #0x400 + bx ip + .balign 4, 0 +_0223A264: .word ov13_0224F5A4 +_0223A268: .word ov13_0223AA58 + arm_func_end ov13_0223A24C + + arm_func_start ov13_0223A26C +ov13_0223A26C: ; 0x0223A26C + ldr r1, _0223A284 ; =ov13_0224F5A4 + ldr ip, _0223A288 ; =ov13_0223AA58 + ldr r1, [r1] + add r1, r1, #0xcc + add r1, r1, #0x400 + bx ip + .balign 4, 0 +_0223A284: .word ov13_0224F5A4 +_0223A288: .word ov13_0223AA58 + arm_func_end ov13_0223A26C + + arm_func_start ov13_0223A28C +ov13_0223A28C: ; 0x0223A28C + ldr r2, _0223A2A8 ; =ov13_0224F5A4 + mov r1, r0 + ldr r0, [r2] + ldr ip, _0223A2AC ; =MI_CpuCopy8 + mov r2, #0x20 + add r0, r0, #0x440 + bx ip + .balign 4, 0 +_0223A2A8: .word ov13_0224F5A4 +_0223A2AC: .word MI_CpuCopy8 + arm_func_end ov13_0223A28C + + arm_func_start ov13_0223A2B0 +ov13_0223A2B0: ; 0x0223A2B0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _0223A2E8 ; =ov13_0224F5A4 + ldr r1, _0223A2EC ; =ov13_022467C8 + ldr r3, [r2] + ldrb r2, [r3, #0x4c2] + str r2, [sp] + ldrb r2, [r3, #0x4c3] + str r2, [sp, #4] + ldrb r2, [r3, #0x4c0] + ldrb r3, [r3, #0x4c1] + bl OS_SPrintf + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A2E8: .word ov13_0224F5A4 +_0223A2EC: .word ov13_022467C8 + arm_func_end ov13_0223A2B0 + + arm_func_start ov13_0223A2F0 +ov13_0223A2F0: ; 0x0223A2F0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _0223A328 ; =ov13_0224F5A4 + ldr r1, _0223A32C ; =ov13_022467C8 + ldr r3, [r2] + ldrb r2, [r3, #0x4f2] + str r2, [sp] + ldrb r2, [r3, #0x4f3] + str r2, [sp, #4] + ldrb r2, [r3, #0x4f0] + ldrb r3, [r3, #0x4f1] + bl OS_SPrintf + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A328: .word ov13_0224F5A4 +_0223A32C: .word ov13_022467C8 + arm_func_end ov13_0223A2F0 + + arm_func_start ov13_0223A330 +ov13_0223A330: ; 0x0223A330 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _0223A36C ; =ov13_0224F5A4 + ldr r1, _0223A370 ; =ov13_022467C8 + ldr ip, [r2] + add r3, ip, #0xc4 + ldrb r2, [r3, #0x402] + str r2, [sp] + ldrb r2, [r3, #0x403] + str r2, [sp, #4] + ldrb r2, [ip, #0x4c4] + ldrb r3, [r3, #0x401] + bl OS_SPrintf + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A36C: .word ov13_0224F5A4 +_0223A370: .word ov13_022467C8 + arm_func_end ov13_0223A330 + + arm_func_start ov13_0223A374 +ov13_0223A374: ; 0x0223A374 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _0223A3B0 ; =ov13_0224F5A4 + ldr r1, _0223A3B4 ; =ov13_022467C8 + ldr ip, [r2] + add r3, ip, #0xc8 + ldrb r2, [r3, #0x402] + str r2, [sp] + ldrb r2, [r3, #0x403] + str r2, [sp, #4] + ldrb r2, [ip, #0x4c8] + ldrb r3, [r3, #0x401] + bl OS_SPrintf + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A3B0: .word ov13_0224F5A4 +_0223A3B4: .word ov13_022467C8 + arm_func_end ov13_0223A374 + + arm_func_start ov13_0223A3B8 +ov13_0223A3B8: ; 0x0223A3B8 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r2, _0223A3F4 ; =ov13_0224F5A4 + ldr r1, _0223A3F8 ; =ov13_022467C8 + ldr ip, [r2] + add r3, ip, #0xcc + ldrb r2, [r3, #0x402] + str r2, [sp] + ldrb r2, [r3, #0x403] + str r2, [sp, #4] + ldrb r2, [ip, #0x4cc] + ldrb r3, [r3, #0x401] + bl OS_SPrintf + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223A3F4: .word ov13_0224F5A4 +_0223A3F8: .word ov13_022467C8 + arm_func_end ov13_0223A3B8 + + arm_func_start ov13_0223A3FC +ov13_0223A3FC: ; 0x0223A3FC + ldr r1, _0223A410 ; =ov13_0224F5A4 + ldr r1, [r1] + add r0, r1, r0, lsl #8 + ldrb r0, [r0, #0xe7] + bx lr + .balign 4, 0 +_0223A410: .word ov13_0224F5A4 + arm_func_end ov13_0223A3FC + + arm_func_start ov13_0223A414 +ov13_0223A414: ; 0x0223A414 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0223A4EC ; =ov13_0224F5A4 + mov r3, #0x78 + ldr r5, [r1] + add r4, r5, r0, lsl #8 + mov lr, r4 + add ip, r5, #0x400 +_0223A430: + ldrb r2, [lr] + ldrb r1, [lr, #1] + add lr, lr, #2 + subs r3, r3, #1 + strb r2, [ip] + strb r1, [ip, #1] + add ip, ip, #2 + bne _0223A430 + ldr r1, _0223A4F0 ; =ov13_022457E8 + strb r0, [r5, #0x4f4] + add r0, r4, #0xc0 + mov r2, #4 + bl memcmp + cmp r0, #0 + ldrne r0, _0223A4EC ; =ov13_0224F5A4 + movne r1, #0 + ldreq r0, _0223A4EC ; =ov13_0224F5A4 + moveq r1, #1 + ldr r0, [r0] + mov r2, #4 + strb r1, [r0, #0x4f5] + ldr r1, _0223A4F0 ; =ov13_022457E8 + add r0, r4, #0xc8 + bl memcmp + cmp r0, #0 + bne _0223A4B0 + ldr r1, _0223A4F0 ; =ov13_022457E8 + add r0, r4, #0xcc + mov r2, #4 + bl memcmp + cmp r0, #0 + beq _0223A4C4 +_0223A4B0: + ldr r0, _0223A4EC ; =ov13_0224F5A4 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x4f6] + b _0223A4D4 +_0223A4C4: + ldr r0, _0223A4EC ; =ov13_0224F5A4 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x4f6] +_0223A4D4: + ldr r1, _0223A4EC ; =ov13_0224F5A4 + ldrb r0, [r4, #0xd0] + ldr r1, [r1] + add r1, r1, #0x4f0 + bl DWCi_BACKUPlConvMaskAddr + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223A4EC: .word ov13_0224F5A4 +_0223A4F0: .word ov13_022457E8 + arm_func_end ov13_0223A414 + + arm_func_start ov13_0223A4F4 +ov13_0223A4F4: ; 0x0223A4F4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0223A5CC ; =ov13_0224F5A4 + mov r2, #0x78 + ldr r1, [r0] + add r4, r1, #0x400 + ldrb r0, [r4, #0xf4] + mov ip, r4 + add r5, r1, r0, lsl #8 + mov r3, r5 +_0223A518: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _0223A518 + ldrb r0, [r4, #0xf5] + mov r2, #4 + cmp r0, #0 + beq _0223A56C + add r0, r5, #0xc0 + mov r1, #0 + bl MI_CpuFill8 + add r0, r5, #0xc4 + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + mov r0, #0 + b _0223A590 +_0223A56C: + add r0, r4, #0xc0 + add r1, r5, #0xc0 + bl MI_CpuCopy8 + add r0, r4, #0xc4 + add r1, r5, #0xc4 + mov r2, #4 + bl MI_CpuCopy8 + add r0, r4, #0xf0 + bl DWCi_BACKUPlConvMaskCidr +_0223A590: + strb r0, [r5, #0xd0] + ldrb r0, [r4, #0xf6] + mov r2, #8 + cmp r0, #0 + beq _0223A5B4 + add r0, r5, #0xc8 + mov r1, #0 + bl MI_CpuFill8 + b _0223A5C0 +_0223A5B4: + add r0, r4, #0xc8 + add r1, r5, #0xc8 + bl MI_CpuCopy8 +_0223A5C0: + ldrb r0, [r4, #0xf4] + bl ov13_0223A8F0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223A5CC: .word ov13_0224F5A4 + arm_func_end ov13_0223A4F4 + + arm_func_start ov13_0223A5D0 +ov13_0223A5D0: ; 0x0223A5D0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _0223A6E0 ; =ov13_0224F5A4 + mov r6, r0 + ldr r4, [r1] + mov r1, #0 + add r0, r4, #0x400 + mov r2, #0xef + bl MI_CpuFill8 + mov r0, r6 + add r1, r4, #0x440 + mov r2, #0x20 + bl MI_CpuCopy8 + ldr r0, [r6, #0x20] + cmp r0, #1 + beq _0223A620 + cmp r0, #2 + beq _0223A638 + cmp r0, #3 + beq _0223A650 + b _0223A668 +_0223A620: + ldrb r0, [r4, #0x4e6] + mov r5, #5 + bic r0, r0, #3 + orr r0, r0, #1 + strb r0, [r4, #0x4e6] + b _0223A678 +_0223A638: + ldrb r0, [r4, #0x4e6] + mov r5, #0xd + bic r0, r0, #3 + orr r0, r0, #2 + strb r0, [r4, #0x4e6] + b _0223A678 +_0223A650: + ldrb r0, [r4, #0x4e6] + mov r5, #0x10 + bic r0, r0, #3 + orr r0, r0, #3 + strb r0, [r4, #0x4e6] + b _0223A678 +_0223A668: + ldrb r0, [r4, #0x4e6] + mov r5, #0 + bic r0, r0, #3 + strb r0, [r4, #0x4e6] +_0223A678: + ldrb r0, [r4, #0x4e6] + add r8, r6, #0x28 + add r7, r4, #0x480 + bic r0, r0, #0xfc + strb r0, [r4, #0x4e6] + mov r6, #0 +_0223A690: + mov r0, r8 + mov r1, r7 + mov r2, r5 + bl MI_CpuCopy8 + add r6, r6, #1 + cmp r6, #4 + add r7, r7, #0x10 + add r8, r8, #0x20 + blt _0223A690 + mov r3, #2 + add r0, r4, #0x4f0 + mov r1, #0 + mov r2, #4 + strb r3, [r4, #0x4e7] + bl MI_CpuFill8 + mov r0, #1 + strb r0, [r4, #0x4f5] + strb r0, [r4, #0x4f6] + bl ov13_0223A4F4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223A6E0: .word ov13_0224F5A4 + arm_func_end ov13_0223A5D0 + + arm_func_start ov13_0223A6E4 +ov13_0223A6E4: ; 0x0223A6E4 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0223A7F0 ; =ov13_0224F5A4 + mov r5, r0 + ldr r0, [r1] + mov r1, #0 + add r4, r0, #0x400 + mov r0, r4 + mov r2, #0xef + bl MI_CpuFill8 + mov r0, r5 + add r1, r4, #0xd1 + mov r2, #5 + bl MI_CpuCopy8 + add r0, r5, #6 + add r1, r4, #0xd6 + mov r2, #5 + bl MI_CpuCopy8 + add r0, r5, #0xc + add r1, r4, #0xdb + mov r2, #5 + bl MI_CpuCopy8 + add r0, r5, #0x12 + add r1, r4, #0xe0 + mov r2, #5 + bl MI_CpuCopy8 + add r0, r5, #0x18 + add r1, r4, #0x60 + mov r2, #0x20 + bl MI_CpuCopy8 + add r0, r5, #0x39 + add r1, r4, #0x80 + mov r2, #0xd + bl MI_CpuCopy8 + add r0, r5, #0x47 + add r1, r4, #0x90 + mov r2, #0xd + bl MI_CpuCopy8 + add r0, r5, #0x55 + add r1, r4, #0xa0 + mov r2, #0xd + bl MI_CpuCopy8 + add r0, r5, #0x63 + add r1, r4, #0xb0 + mov r2, #0xd + bl MI_CpuCopy8 + add r0, r5, #0x71 + add r1, r4, #0x40 + mov r2, #0x20 + bl MI_CpuCopy8 + ldrb r2, [r4, #0xe6] + mov r1, #1 + add r0, r4, #0xf0 + bic r2, r2, #3 + orr r2, r2, #2 + strb r2, [r4, #0xe6] + and r2, r2, #0xff + bic r2, r2, #0xfc + strb r2, [r4, #0xe6] + strb r1, [r4, #0xe7] + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + mov r0, #1 + strb r0, [r4, #0xf5] + strb r0, [r4, #0xf6] + bl ov13_0223A4F4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223A7F0: .word ov13_0224F5A4 + arm_func_end ov13_0223A6E4 + + arm_func_start ov13_0223A7F4 +ov13_0223A7F4: ; 0x0223A7F4 + ldr r0, _0223A800 ; =ov13_0224F5A4 + ldr r0, [r0] + bx lr + .balign 4, 0 +_0223A800: .word ov13_0224F5A4 + arm_func_end ov13_0223A7F4 + + arm_func_start ov13_0223A804 +ov13_0223A804: ; 0x0223A804 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0223A83C ; =ov13_0224F5A4 + mov r5, r0 + ldr r0, [r1] + mov r1, #0 + add r4, r0, r5, lsl #8 + mov r0, r4 + mov r2, #0xef + bl MI_CpuFill8 + mov r1, #0xff + mov r0, r5 + strb r1, [r4, #0xe7] + bl ov13_0223A8F0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223A83C: .word ov13_0224F5A4 + arm_func_end ov13_0223A804 + + arm_func_start ov13_0223A840 +ov13_0223A840: ; 0x0223A840 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + ldr r1, _0223A8EC ; =ov13_0224F5A4 + mov r0, #0 + ldr r1, [r1] + mov r2, #0x400 + bl MIi_CpuClear16 + ldr r0, _0223A8EC ; =ov13_0224F5A4 + mov r3, #0 + mov r2, #0xff +_0223A868: + ldr r1, [r0] + add r1, r1, r3, lsl #8 + add r3, r3, #1 + strb r2, [r1, #0xe7] + cmp r3, #3 + blt _0223A868 + add r0, sp, #0 + bl DWCi_AUTH_GetNewWiFiInfo + add r0, sp, #0 + bl DWCi_BACKUPlConvWifiInfo + mov r8, #0 + ldr r4, _0223A8EC ; =ov13_0224F5A4 + mov r6, r0 + mov r7, r8 + mov r5, #0xe +_0223A8A4: + ldr r1, [r4] + mov r0, r6 + add r1, r1, r7 + mov r2, r5 + add r1, r1, #0xf0 + bl MI_CpuCopy8 + add r8, r8, #1 + cmp r8, #2 + add r7, r7, #0x100 + blt _0223A8A4 + mov r4, #0 +_0223A8D0: + mov r0, r4 + bl ov13_0223A8F0 + add r4, r4, #1 + cmp r4, #4 + blt _0223A8D0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223A8EC: .word ov13_0224F5A4 + arm_func_end ov13_0223A840 + + arm_func_start ov13_0223A8F0 +ov13_0223A8F0: ; 0x0223A8F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + ldr r1, _0223AA54 ; =ov13_0224F5A4 + mov r7, r0 + ldr r0, [r1] + mov r6, #0 + add r2, r0, r7, lsl #8 + ldrb r5, [r2, #0xe7] + add r0, sp, #4 + mov r1, r6 + mov r2, #0x10 + mov r4, #1 + bl MI_CpuFill8 + add r0, sp, #4 + mov r2, r4 + str r2, [r0, r7, lsl #2] + cmp r7, #2 + bgt _0223A9CC + ldr r0, _0223AA54 ; =ov13_0224F5A4 + ldr r0, [r0] + ldrb r1, [r0, #0xef] + tst r1, r4, lsl r7 + movne r6, r2 + cmp r5, #0xff + bne _0223A990 + cmp r6, #0 + beq _0223A990 + ldrb r1, [r0, #0xef] + mvn r3, r4, lsl r7 + and r2, r1, r3 + ldr r1, _0223AA54 ; =ov13_0224F5A4 + strb r2, [r0, #0xef] + ldr r2, [r1] + mov r0, #1 + ldrb r1, [r2, #0x1ef] + and r1, r1, r3 + strb r1, [r2, #0x1ef] + str r0, [sp, #8] + str r0, [sp, #4] + b _0223A9CC +_0223A990: + cmp r5, #0xff + beq _0223A9CC + cmp r6, #0 + bne _0223A9CC + ldrb r3, [r0, #0xef] + ldr r1, _0223AA54 ; =ov13_0224F5A4 + mov r2, #1 + orr r3, r3, r4, lsl r7 + strb r3, [r0, #0xef] + ldr r1, [r1] + ldrb r0, [r1, #0x1ef] + orr r0, r0, r4, lsl r7 + strb r0, [r1, #0x1ef] + str r2, [sp, #8] + str r2, [sp, #4] +_0223A9CC: + mov r6, #0 + ldr r8, _0223AA54 ; =ov13_0224F5A4 + mov r7, r6 + mov r4, #0xfe + add r5, sp, #4 +_0223A9E0: + ldr r0, [r5, r6, lsl #2] + cmp r0, #0 + beq _0223AA10 + ldr r1, [r8] + mov r2, r4 + add r0, r1, #0xf8 + add r0, r0, #0x400 + add r1, r1, r7 + bl MATH_CalcCRC16 + ldr r1, [r8] + add r1, r1, r6, lsl #8 + strh r0, [r1, #0xfe] +_0223AA10: + add r6, r6, #1 + cmp r6, #4 + add r7, r7, #0x100 + blt _0223A9E0 + mov r0, #0x100 + mov r1, #0x20 + bl ov13_0224128C + mov r2, r0 + ldr r0, _0223AA54 ; =ov13_0224F5A4 + add r1, sp, #4 + ldr r0, [r0] + str r2, [sp] + bl DWCi_BACKUPlWritePage + add r0, sp, #0 + bl ov13_022412B0 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223AA54: .word ov13_0224F5A4 + arm_func_end ov13_0223A8F0 + + arm_func_start ov13_0223AA58 +ov13_0223AA58: ; 0x0223AA58 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + add r0, sp, #0 + mov r1, #0 + mov r2, #4 + bl MI_CpuFill8 + mov r7, #0 + mov r8, r7 + mov r4, #0x20 + add r6, sp, #0 + mov r5, #3 + mov fp, r7 +_0223AA8C: + mov r1, r6 + mov r2, r5 + add r0, sl, r8 + bl MI_CpuCopy8 + mov r1, fp + mov r2, r6 +_0223AAA4: + ldrb r0, [r2] + cmp r0, #0 + bne _0223AAC0 + add r1, r1, #1 + cmp r1, #3 + strb r4, [r2], #1 + blt _0223AAA4 +_0223AAC0: + mov r0, r6 + bl atoi + strb r0, [sb, r7] + add r7, r7, #1 + cmp r7, #4 + add r8, r8, #3 + blt _0223AA8C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov13_0223AA58 + + arm_func_start ov13_0223AAE0 +ov13_0223AAE0: ; 0x0223AAE0 + cmp r0, #0x39 + subls r0, r0, #0x30 + bxls lr + cmp r0, #0x46 + subls r0, r0, #0x37 + subhi r0, r0, #0x57 + bx lr + arm_func_end ov13_0223AAE0 + + arm_func_start ov13_0223AAFC +ov13_0223AAFC: ; 0x0223AAFC + stmdb sp!, {r3, lr} + mov r0, #0xa0 + mov r1, #4 + bl ov13_0224128C + ldr r2, _0223AB80 ; =ov13_0224F5A8 + add r1, sp, #0 + str r0, [r2] + ldr r0, _0223AB84 ; =ov13_022467D8 + mov r2, #0x20 + bl ov13_0223F95C + ldr r1, _0223AB80 ; =ov13_0224F5A8 + ldr r1, [r1] + str r0, [r1, #0x98] + bl NNS_SndInit + ldr r0, _0223AB80 ; =ov13_0224F5A8 + ldr r0, [r0] + ldr r1, [r0, #0x98] + bl NNS_SndArcInitOnMemory + mov r0, #0 + bl NNS_SndArcPlayerSetup + ldr r0, _0223AB80 ; =ov13_0224F5A8 + ldr r0, [r0] + add r0, r0, #0x94 + bl NNS_SndHandleInit + mov r0, #0 + ldr r1, _0223AB88 ; =ov13_0223AC40 + mov r2, r0 + mov r3, #0xc8 + bl ov13_02242528 + ldr r1, _0223AB80 ; =ov13_0224F5A8 + ldr r1, [r1] + str r0, [r1, #0x9c] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223AB80: .word ov13_0224F5A8 +_0223AB84: .word ov13_022467D8 +_0223AB88: .word ov13_0223AC40 + arm_func_end ov13_0223AAFC + + arm_func_start ov13_0223AB8C +ov13_0223AB8C: ; 0x0223AB8C + stmdb sp!, {r3, lr} + ldr r1, _0223ABB0 ; =ov13_0224F5A8 + mov r0, #0 + ldr r1, [r1] + ldr r1, [r1, #0x9c] + bl ov13_022425D0 + ldr r0, _0223ABB4 ; =ov13_0224F5A8 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223ABB0: .word ov13_0224F5A8 +_0223ABB4: .word ov13_0224F5A8 + arm_func_end ov13_0223AB8C + + arm_func_start ov13_0223ABB8 +ov13_0223ABB8: ; 0x0223ABB8 + ldr r1, _0223ABD4 ; =ov13_0224F5A8 + mov r2, r0 + ldr r0, [r1] + ldr ip, _0223ABD8 ; =NNS_SndArcPlayerStartSeqArc + mov r1, #0 + add r0, r0, #0x94 + bx ip + .balign 4, 0 +_0223ABD4: .word ov13_0224F5A8 +_0223ABD8: .word NNS_SndArcPlayerStartSeqArc + arm_func_end ov13_0223ABB8 + + arm_func_start ov13_0223ABDC +ov13_0223ABDC: ; 0x0223ABDC + ldr r2, _0223ABF4 ; =ov13_0224F5A8 + mov r1, r0 + ldr r0, [r2] + ldr ip, _0223ABF8 ; =NNS_SndPlayerSetVolume + add r0, r0, #0x94 + bx ip + .balign 4, 0 +_0223ABF4: .word ov13_0224F5A8 +_0223ABF8: .word NNS_SndPlayerSetVolume + arm_func_end ov13_0223ABDC + + arm_func_start ov13_0223ABFC +ov13_0223ABFC: ; 0x0223ABFC + ldr r2, _0223AC18 ; =ov13_0224F5A8 + ldr ip, _0223AC1C ; =NNS_SndPlayerSetTrackPitch + ldr r3, [r2] + mov r2, r1 + mov r1, r0 + add r0, r3, #0x94 + bx ip + .balign 4, 0 +_0223AC18: .word ov13_0224F5A8 +_0223AC1C: .word NNS_SndPlayerSetTrackPitch + arm_func_end ov13_0223ABFC + + arm_func_start ov13_0223AC20 +ov13_0223AC20: ; 0x0223AC20 + ldr r0, _0223AC38 ; =ov13_0224F5A8 + ldr ip, _0223AC3C ; =NNS_SndPlayerStopSeq + ldr r0, [r0] + mov r1, #0 + add r0, r0, #0x94 + bx ip + .balign 4, 0 +_0223AC38: .word ov13_0224F5A8 +_0223AC3C: .word NNS_SndPlayerStopSeq + arm_func_end ov13_0223AC20 + + arm_func_start ov13_0223AC40 +ov13_0223AC40: ; 0x0223AC40 + ldr ip, _0223AC48 ; =NNS_SndMain + bx ip + .balign 4, 0 +_0223AC48: .word NNS_SndMain + arm_func_end ov13_0223AC40 + + arm_func_start ov13_0223AC4C +ov13_0223AC4C: ; 0x0223AC4C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + str r0, [sp] + mov r0, #0x1c + mov r1, #4 + bl ov13_0224128C + ldr r1, [sp] + ldr r4, _0223AD34 ; =ov13_0224F5AC + add r3, r1, r1, lsl #2 + ldr r2, _0223AD38 ; =ov13_022457EC + ldr r1, _0223AD3C ; =ov13_022457FB + mov r8, #0 + mvn r7, #0 + ldr r5, _0223AD40 ; =ov13_0224580A + str r0, [r4, #4] + add sb, r2, r3 + add sl, r1, r3 + sub r6, r7, #0x29 + mov fp, r8 +_0223AC94: + ldrb r1, [sb], #1 + mov r0, #1 + mov r2, r0 + bl ov13_022401B0 + ldr r2, [r4, #4] + mov r1, r7 + str r0, [r2, r8, lsl #2] + ldr r0, [r4, #4] + mov r2, fp + ldr r0, [r0, r8, lsl #2] + bl ov13_02240008 + ldr r0, [r4, #4] + add r3, r5, r8, lsl #2 + ldrh r3, [r3, #2] + ldr r0, [r0, r8, lsl #2] + mov r1, r7 + mov r2, r6 + bl ov13_0223FF18 + ldr r0, [r4, #4] + ldrb r3, [sl], #1 + ldr r0, [r0, r8, lsl #2] + mov r1, r7 + mov r2, #0 + bl ov13_0223FE98 + add r8, r8, #1 + cmp r8, #5 + blt _0223AC94 + mov r0, #0 + ldr r1, _0223AD44 ; =ov13_0223AD48 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223AD34 ; =ov13_0224F5AC + ldr r1, [r1, #4] + str r0, [r1, #0x14] + ldr r0, [sp] + bl ov13_0223B6F4 + mov r0, #0xd + bl ov13_0223ABB8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223AD34: .word ov13_0224F5AC +_0223AD38: .word ov13_022457EC +_0223AD3C: .word ov13_022457FB +_0223AD40: .word ov13_0224580A +_0223AD44: .word ov13_0223AD48 + arm_func_end ov13_0223AC4C + + arm_func_start ov13_0223AD48 +ov13_0223AD48: ; 0x0223AD48 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223AE20 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + add r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x20 + blt _0223AD8C + cmp r0, #0x100 + ble _0223ADCC +_0223AD8C: + ldr r5, _0223AE24 ; =ov13_0224580A + ldr r4, _0223AE20 ; =ov13_0224F5AC + mov r7, #0 + mvn r6, #0 +_0223AD9C: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223AD9C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223ADCC: + mov r0, #0x20 + ldr r6, _0223AE24 ; =ov13_0224580A + ldr r5, _0223AE20 ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #0 + mvn r7, #0 +_0223ADE4: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223ADE4 + ldr r1, _0223AE28 ; =ov13_0223AE2C + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223AE20: .word ov13_0224F5AC +_0223AE24: .word ov13_0224580A +_0223AE28: .word ov13_0223AE2C + arm_func_end ov13_0223AD48 + + arm_func_start ov13_0223AE2C +ov13_0223AE2C: ; 0x0223AE2C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223AF04 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #4] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + add r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x50 + blt _0223AE70 + cmp r0, #0x100 + ble _0223AEB0 +_0223AE70: + ldr r5, _0223AF08 ; =ov13_0224580A + ldr r4, _0223AF04 ; =ov13_0224F5AC + mov r7, #1 + mvn r6, #0 +_0223AE80: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223AE80 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223AEB0: + mov r0, #0x50 + ldr r6, _0223AF08 ; =ov13_0224580A + ldr r5, _0223AF04 ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #1 + mvn r7, #0 +_0223AEC8: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223AEC8 + ldr r1, _0223AF0C ; =ov13_0223AF10 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223AF04: .word ov13_0224F5AC +_0223AF08: .word ov13_0224580A +_0223AF0C: .word ov13_0223AF10 + arm_func_end ov13_0223AE2C + + arm_func_start ov13_0223AF10 +ov13_0223AF10: ; 0x0223AF10 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223AFE8 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #8] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + add r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x68 + blt _0223AF54 + cmp r0, #0x100 + ble _0223AF94 +_0223AF54: + ldr r5, _0223AFEC ; =ov13_0224580A + ldr r4, _0223AFE8 ; =ov13_0224F5AC + mov r7, #2 + mvn r6, #0 +_0223AF64: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223AF64 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223AF94: + mov r0, #0x68 + ldr r6, _0223AFEC ; =ov13_0224580A + ldr r5, _0223AFE8 ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #2 + mvn r7, #0 +_0223AFAC: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223AFAC + ldr r1, _0223AFF0 ; =ov13_0223AFF4 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223AFE8: .word ov13_0224F5AC +_0223AFEC: .word ov13_0224580A +_0223AFF0: .word ov13_0223AFF4 + arm_func_end ov13_0223AF10 + + arm_func_start ov13_0223AFF4 +ov13_0223AFF4: ; 0x0223AFF4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223B0CC ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #0xc] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + add r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x98 + blt _0223B038 + cmp r0, #0x100 + ble _0223B078 +_0223B038: + ldr r5, _0223B0D0 ; =ov13_0224580A + ldr r4, _0223B0CC ; =ov13_0224F5AC + mov r7, #3 + mvn r6, #0 +_0223B048: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223B048 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223B078: + mov r0, #0x98 + ldr r6, _0223B0D0 ; =ov13_0224580A + ldr r5, _0223B0CC ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #3 + mvn r7, #0 +_0223B090: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223B090 + ldr r1, _0223B0D4 ; =ov13_0223B0D8 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223B0CC: .word ov13_0224F5AC +_0223B0D0: .word ov13_0224580A +_0223B0D4: .word ov13_0223B0D8 + arm_func_end ov13_0223AFF4 + + arm_func_start ov13_0223B0D8 +ov13_0223B0D8: ; 0x0223B0D8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0223B170 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #0x10] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + add r2, r0, #8 + str r2, [sp, #4] + cmp r2, #0xb0 + blt _0223B11C + cmp r2, #0x100 + ble _0223B13C +_0223B11C: + ldr r0, _0223B170 ; =ov13_0224F5AC + mvn r1, #0 + ldr r0, [r0, #4] + mov r3, #0x21 + ldr r0, [r0, #0x10] + bl ov13_0223FF18 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0223B13C: + ldr r0, _0223B170 ; =ov13_0224F5AC + mov r2, #0xb0 + ldr r0, [r0, #4] + str r2, [sp, #4] + ldr r0, [r0, #0x10] + sub r1, r2, #0xb1 + mov r3, #0x21 + bl ov13_0223FF18 + ldr r1, _0223B174 ; =ov13_0223B178 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223B170: .word ov13_0224F5AC +_0223B174: .word ov13_0223B178 + arm_func_end ov13_0223B0D8 + + arm_func_start ov13_0223B178 +ov13_0223B178: ; 0x0223B178 + stmdb sp!, {r3, lr} + mov r1, r0 + mov r0, #0 + bl ov13_022425D0 + ldr r0, _0223B19C ; =ov13_0224F5AC + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x14] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223B19C: .word ov13_0224F5AC + arm_func_end ov13_0223B178 + + arm_func_start ov13_0223B1A0 +ov13_0223B1A0: ; 0x0223B1A0 + stmdb sp!, {r3, lr} + ldr r1, _0223B1D8 ; =ov13_0224F5AC + mov r0, #0 + ldr ip, [r1, #4] + mov lr, #1 + ldr r1, _0223B1DC ; =ov13_0223B2C8 + mov r2, r0 + mov r3, #0x78 + strb lr, [ip, #0x18] + bl ov13_02242528 + ldr r1, _0223B1D8 ; =ov13_0224F5AC + ldr r1, [r1, #4] + str r0, [r1, #0x14] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223B1D8: .word ov13_0224F5AC +_0223B1DC: .word ov13_0223B2C8 + arm_func_end ov13_0223B1A0 + + arm_func_start ov13_0223B1E0 +ov13_0223B1E0: ; 0x0223B1E0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + str r0, [sp] + add r2, r0, r0, lsl #2 + ldr r1, _0223B298 ; =ov13_022457EC + ldr r0, _0223B29C ; =ov13_022457FB + mov r8, #0 + ldr r5, _0223B2A0 ; =ov13_0224580A + ldr r4, _0223B2A4 ; =ov13_0224F5AC + add sb, r1, r2 + add sl, r0, r2 + mov r7, r8 + mov fp, #1 + mvn r6, #0 +_0223B214: + ldr r0, [r4, #4] + mov r1, r7 + ldr r0, [r0, r8, lsl #2] + bl ov13_0223FDE0 + mov r2, r0 + ldrb r1, [sb], #2 + mov r0, fp + bl ov13_022400F0 + ldr r0, [r4, #4] + mov r1, r6 + ldr r0, [r0, r8, lsl #2] + mov r2, #0 + bl ov13_02240008 + ldr r0, [r4, #4] + mov r1, r8, lsl #2 + add r3, r5, r8, lsl #2 + ldrh r2, [r5, r1] + ldrh r3, [r3, #2] + ldr r0, [r0, r8, lsl #2] + mov r1, r6 + bl ov13_0223FF18 + ldr r0, [r4, #4] + ldrb r3, [sl], #2 + ldr r0, [r0, r8, lsl #2] + mov r1, r6 + mov r2, #0 + bl ov13_0223FE98 + add r8, r8, #2 + cmp r8, #5 + blt _0223B214 + ldr r0, [sp] + bl ov13_0223B6F4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223B298: .word ov13_022457EC +_0223B29C: .word ov13_022457FB +_0223B2A0: .word ov13_0224580A +_0223B2A4: .word ov13_0224F5AC + arm_func_end ov13_0223B1E0 + + arm_func_start ov13_0223B2A8 +ov13_0223B2A8: ; 0x0223B2A8 + ldr r0, _0223B2C4 ; =ov13_0224F5AC + ldr r0, [r0, #4] + ldr r0, [r0, #0x14] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0223B2C4: .word ov13_0224F5AC + arm_func_end ov13_0223B2A8 + + arm_func_start ov13_0223B2C8 +ov13_0223B2C8: ; 0x0223B2C8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0223B354 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #0x10] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + mov r3, #0x21 + sub r2, r0, #8 + str r2, [sp, #4] + cmp r2, #0x98 + ble _0223B324 + ldr r0, _0223B354 ; =ov13_0224F5AC + mvn r1, #0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x10] + bl ov13_0223FF18 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0223B324: + ldr r0, _0223B354 ; =ov13_0224F5AC + mov r2, #0x98 + ldr r0, [r0, #4] + str r2, [sp, #4] + ldr r0, [r0, #0x10] + sub r1, r2, #0x99 + bl ov13_0223FF18 + ldr r1, _0223B358 ; =ov13_0223B35C + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223B354: .word ov13_0224F5AC +_0223B358: .word ov13_0223B35C + arm_func_end ov13_0223B2C8 + + arm_func_start ov13_0223B35C +ov13_0223B35C: ; 0x0223B35C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223B42C ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #0xc] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + sub r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x68 + ble _0223B3D8 + ldr r5, _0223B430 ; =ov13_0224580A + ldr r4, _0223B42C ; =ov13_0224F5AC + mov r7, #3 + mvn r6, #0 +_0223B3A8: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223B3A8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223B3D8: + mov r0, #0x68 + ldr r6, _0223B430 ; =ov13_0224580A + ldr r5, _0223B42C ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #3 + mvn r7, #0 +_0223B3F0: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223B3F0 + ldr r1, _0223B434 ; =ov13_0223B438 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223B42C: .word ov13_0224F5AC +_0223B430: .word ov13_0224580A +_0223B434: .word ov13_0223B438 + arm_func_end ov13_0223B35C + + arm_func_start ov13_0223B438 +ov13_0223B438: ; 0x0223B438 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223B508 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #8] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + sub r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x50 + ble _0223B4B4 + ldr r5, _0223B50C ; =ov13_0224580A + ldr r4, _0223B508 ; =ov13_0224F5AC + mov r7, #2 + mvn r6, #0 +_0223B484: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223B484 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223B4B4: + mov r0, #0x50 + ldr r6, _0223B50C ; =ov13_0224580A + ldr r5, _0223B508 ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #2 + mvn r7, #0 +_0223B4CC: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223B4CC + ldr r1, _0223B510 ; =ov13_0223B514 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223B508: .word ov13_0224F5AC +_0223B50C: .word ov13_0224580A +_0223B510: .word ov13_0223B514 + arm_func_end ov13_0223B438 + + arm_func_start ov13_0223B514 +ov13_0223B514: ; 0x0223B514 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223B5E4 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0, #4] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + sub r0, r0, #8 + str r0, [sp, #4] + cmp r0, #0x20 + ble _0223B590 + ldr r5, _0223B5E8 ; =ov13_0224580A + ldr r4, _0223B5E4 ; =ov13_0224F5AC + mov r7, #1 + mvn r6, #0 +_0223B560: + add r0, r5, r7, lsl #2 + ldr r1, [r4, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r7, lsl #2] + ldr r2, [sp, #4] + mov r1, r6 + bl ov13_0223FF18 + add r7, r7, #1 + cmp r7, #5 + blt _0223B560 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223B590: + mov r0, #0x20 + ldr r6, _0223B5E8 ; =ov13_0224580A + ldr r5, _0223B5E4 ; =ov13_0224F5AC + str r0, [sp, #4] + mov r8, #1 + mvn r7, #0 +_0223B5A8: + add r0, r6, r8, lsl #2 + ldr r1, [r5, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r8, lsl #2] + ldr r2, [sp, #4] + mov r1, r7 + bl ov13_0223FF18 + add r8, r8, #1 + cmp r8, #5 + blt _0223B5A8 + ldr r1, _0223B5EC ; =ov13_0223B5F0 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223B5E4: .word ov13_0224F5AC +_0223B5E8: .word ov13_0224580A +_0223B5EC: .word ov13_0223B5F0 + arm_func_end ov13_0223B514 + + arm_func_start ov13_0223B5F0 +ov13_0223B5F0: ; 0x0223B5F0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r1, _0223B6B8 ; =ov13_0224F5AC + mov r5, r0 + ldr r0, [r1, #4] + add r2, sp, #4 + ldr r0, [r0] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp, #4] + ldr r7, _0223B6BC ; =ov13_0224580A + sub r0, r0, #8 + ldr r6, _0223B6B8 ; =ov13_0224F5AC + mov r4, #0 + str r0, [sp, #4] + mvn r8, #0 +_0223B634: + add r0, r7, r4, lsl #2 + ldr r1, [r6, #4] + ldrh r3, [r0, #2] + ldr r0, [r1, r4, lsl #2] + ldr r2, [sp, #4] + mov r1, r8 + bl ov13_0223FF18 + add r4, r4, #1 + cmp r4, #5 + blt _0223B634 + ldr r1, [sp, #4] + ldr r0, _0223B6C0 ; =0x000001D6 + cmp r1, r0 + addgt sp, sp, #8 + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} + cmp r1, #0x100 + addlt sp, sp, #8 + ldmltia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, r5 + mov r0, #0 + bl ov13_022425D0 + ldr r4, _0223B6B8 ; =ov13_0224F5AC + mov r5, #0 +_0223B690: + ldr r0, [r4, #4] + ldr r0, [r0, r5, lsl #2] + bl ov13_0223FD60 + add r5, r5, #1 + cmp r5, #5 + blt _0223B690 + ldr r0, _0223B6C4 ; =ov13_0224F5B0 + bl ov13_022412B0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223B6B8: .word ov13_0224F5AC +_0223B6BC: .word ov13_0224580A +_0223B6C0: .word 0x000001D6 +_0223B6C4: .word ov13_0224F5B0 + arm_func_end ov13_0223B5F0 + + arm_func_start ov13_0223B6C8 +ov13_0223B6C8: ; 0x0223B6C8 + ldr r0, _0223B6F0 ; =ov13_0224F5AC + ldr r0, [r0, #4] + cmp r0, #0 + moveq r0, #1 + bxeq lr + ldrb r0, [r0, #0x18] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_0223B6F0: .word ov13_0224F5AC + arm_func_end ov13_0223B6C8 + + arm_func_start ov13_0223B6F4 +ov13_0223B6F4: ; 0x0223B6F4 + stmdb sp!, {r3, lr} + ldr r1, _0223B730 ; =ov13_02246854 + ldr r0, [r1, r0, lsl #2] + bl ov13_022278C4 + mov r1, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r2, _0223B734 ; =ov13_0224F5AC + ldr r1, _0223B738 ; =ov13_0223B73C + str r0, [r2] + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223B730: .word ov13_02246854 +_0223B734: .word ov13_0224F5AC +_0223B738: .word ov13_0223B73C + arm_func_end ov13_0223B6F4 + + arm_func_start ov13_0223B73C +ov13_0223B73C: ; 0x0223B73C + stmdb sp!, {r4, lr} + ldr r1, _0223B784 ; =ov13_0224F5AC + mov r4, r0 + ldr r0, [r1] + mov r1, #0x600 + bl DC_FlushRange + ldr r0, _0223B784 ; =ov13_0224F5AC + mov r1, #0 + ldr r0, [r0] + mov r2, #0x600 + bl GXS_LoadBG1Scr + ldr r0, _0223B784 ; =ov13_0224F5AC + ldr r0, [r0] + bl ov13_0223FA50 + mov r1, r4 + mov r0, #1 + bl ov13_022425D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223B784: .word ov13_0224F5AC + arm_func_end ov13_0223B73C + + arm_func_start ov13_0223B788 +ov13_0223B788: ; 0x0223B788 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x54 + mov r4, r0 + ldr r0, _0223B8F0 ; =0x00001BA0 + mov r1, #0x20 + bl ov13_0224128C + ldr r2, _0223B8F4 ; =ov13_0224F5B4 + add r1, r0, #0x1000 + str r0, [r2] + str r4, [r1, #0x370] + bl OS_GetTick + ldr r4, _0223B8F4 ; =ov13_0224F5B4 + mov r2, #3 + ldr r3, [r4] + add r3, r3, #0x1000 + str r0, [r3, #0xb88] + str r1, [r3, #0xb8c] + ldr r0, [r4] + ldr r1, _0223B8F8 ; =ov13_0223BA3C + bl WM_Initialize + cmp r0, #2 + bne _0223B8DC +_0223B7E0: + ldr r0, [r4] + add r0, r0, #0x3b8 + add r0, r0, #0x1000 + bl WM_ReadStatus + ldr ip, [r4] + add r0, ip, #0x1300 + ldrh r0, [r0, #0xb8] + cmp r0, #2 + bne _0223B7E0 + add r0, ip, #0x374 + ldr r5, _0223B8FC ; =ov13_02245834 + add lr, r0, #0x1000 + mov r4, #4 +_0223B814: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _0223B814 + ldr r0, [r5] + add r1, ip, #0xf00 + str r0, [lr] + add r0, ip, #0x1000 + str r1, [r0, #0x374] + bl WM_GetDispersionScanPeriod + ldr r1, _0223B8F4 ; =ov13_0224F5B4 + ldr r1, [r1] + add r1, r1, #0x1300 + strh r0, [r1, #0x7c] + add r0, sp, #0 + bl OS_GetOwnerInfo + ldr r1, _0223B8F4 ; =ov13_0224F5B4 + ldr r0, _0223B900 ; =ov13_02245828 + ldr r1, [r1] + mov r2, #8 + add r1, r1, #0x388 + add r1, r1, #0x1000 + bl MI_CpuCopy8 + ldr r2, _0223B8F4 ; =ov13_0224F5B4 + mov r3, #1 + ldr r1, [r2] + add r0, sp, #4 + add r1, r1, #0x1000 + strb r3, [r1, #0x391] + ldr r1, [r2] + ldrh r2, [sp, #0x1a] + add r1, r1, #0x394 + add r1, r1, #0x1000 + mov r2, r2, lsl #1 + bl MI_CpuCopy8 + bl ov13_0223B90C + cmp r0, #0 + beq _0223B8DC + mov r0, #0 + ldr r1, _0223B904 ; =ov13_0223BD30 + mov r2, r0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223B8F4 ; =ov13_0224F5B4 + add sp, sp, #0x54 + ldr r1, [r1] + add r1, r1, #0x1000 + str r0, [r1, #0xb90] + mov r0, #1 + ldmia sp!, {r4, r5, pc} +_0223B8DC: + ldr r0, _0223B908 ; =ov13_0224F5B4 + bl ov13_022412B0 + mov r0, #0 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0223B8F0: .word 0x00001BA0 +_0223B8F4: .word ov13_0224F5B4 +_0223B8F8: .word ov13_0223BA3C +_0223B8FC: .word ov13_02245834 +_0223B900: .word ov13_02245828 +_0223B904: .word ov13_0223BD30 +_0223B908: .word ov13_0224F5B4 + arm_func_end ov13_0223B788 + + arm_func_start ov13_0223B90C +ov13_0223B90C: ; 0x0223B90C + stmdb sp!, {r3, lr} + ldr r1, _0223B938 ; =ov13_0224F5B4 + ldr r0, _0223B93C ; =ov13_0223BA3C + ldr r1, [r1] + add r1, r1, #0x374 + add r1, r1, #0x1000 + bl WM_StartScanEx + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223B938: .word ov13_0224F5B4 +_0223B93C: .word ov13_0223BA3C + arm_func_end ov13_0223B90C + + arm_func_start ov13_0223B940 +ov13_0223B940: ; 0x0223B940 + stmdb sp!, {r4, lr} + ldr r1, _0223BA18 ; =ov13_0224F5B4 + mov r2, #1 + ldr r0, [r1] + add r0, r0, #0x1000 + strb r2, [r0, #0xb94] + ldr r0, [r1] + add r0, r0, #0x3b8 + add r0, r0, #0x1000 + bl WM_ReadStatus + ldr r0, _0223BA18 ; =ov13_0224F5B4 + ldr r0, [r0] + add r0, r0, #0x1300 + ldrh r0, [r0, #0xb8] + cmp r0, #2 + beq _0223B9BC + ldr r0, _0223BA1C ; =ov13_0223BA3C + bl WM_Reset + cmp r0, #2 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r4, _0223BA18 ; =ov13_0224F5B4 +_0223B998: + ldr r0, [r4] + add r0, r0, #0x3b8 + add r0, r0, #0x1000 + bl WM_ReadStatus + ldr r0, [r4] + add r0, r0, #0x1300 + ldrh r0, [r0, #0xb8] + cmp r0, #2 + bne _0223B998 +_0223B9BC: + ldr r0, _0223BA1C ; =ov13_0223BA3C + bl WM_End + cmp r0, #2 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, _0223BA18 ; =ov13_0224F5B4 + ldr r0, [r0] + add r0, r0, #0x1000 + ldr r1, [r0, #0xb90] + cmp r1, #0 + beq _0223B9F0 + mov r0, #0 + bl ov13_022425F0 +_0223B9F0: + ldr r0, _0223BA18 ; =ov13_0224F5B4 + ldr r0, [r0] + add r0, r0, #0x1000 +_0223B9FC: + ldrb r1, [r0, #0xb94] + cmp r1, #2 + bne _0223B9FC + ldr r0, _0223BA20 ; =ov13_0224F5B4 + bl ov13_022412B0 + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223BA18: .word ov13_0224F5B4 +_0223BA1C: .word ov13_0223BA3C +_0223BA20: .word ov13_0224F5B4 + arm_func_end ov13_0223B940 + + arm_func_start ov13_0223BA24 +ov13_0223BA24: ; 0x0223BA24 + ldr r1, _0223BA38 ; =ov13_0224F5B4 + ldr r1, [r1] + add r1, r1, #0x1000 + str r0, [r1, #0x370] + bx lr + .balign 4, 0 +_0223BA38: .word ov13_0224F5B4 + arm_func_end ov13_0223BA24 + + arm_func_start ov13_0223BA3C +ov13_0223BA3C: ; 0x0223BA3C + stmdb sp!, {r3, lr} + ldrh r1, [r0, #2] + cmp r1, #0 + ldmneia sp!, {r3, pc} + ldr r1, _0223BAC8 ; =ov13_0224F5B4 + ldr r1, [r1] + add r1, r1, #0x1000 + ldrb r2, [r1, #0xb94] + cmp r2, #0 + beq _0223BA78 + ldrh r0, [r0] + cmp r0, #2 + moveq r0, #2 + streqb r0, [r1, #0xb94] + ldmia sp!, {r3, pc} +_0223BA78: + ldrh r2, [r0] + cmp r2, #0x26 + ldmneia sp!, {r3, pc} + ldrh r2, [r0, #8] + cmp r2, #4 + beq _0223BAB8 + cmp r2, #5 + bne _0223BAC0 + ldrb r1, [r1, #0xb96] + cmp r1, #0 + beq _0223BAAC + bl ov13_0223BC24 + b _0223BAB0 +_0223BAAC: + bl ov13_0223BACC +_0223BAB0: + bl ov13_0223B90C + ldmia sp!, {r3, pc} +_0223BAB8: + bl ov13_0223B90C + ldmia sp!, {r3, pc} +_0223BAC0: + bl OS_Terminate + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223BAC8: .word ov13_0224F5B4 + arm_func_end ov13_0223BA3C + + arm_func_start ov13_0223BACC +ov13_0223BACC: ; 0x0223BACC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov fp, r0 + ldrh r0, [fp, #0xe] + mov r7, #0 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223BAE4: + add r0, fp, r7, lsl #2 + ldr r6, [r0, #0x10] + mov r1, #0xc0 + mov r0, r6 + bl DC_InvalidateRange + ldr r1, _0223BC18 ; =ov13_02245828 + add r0, r6, #0xc + mov r2, #8 + bl memcmp + cmp r0, #0 + bne _0223BC04 + ldr r0, _0223BC1C ; =ov13_0224F5B4 + mov r5, #0 + ldr sb, [r0] + mov r4, #6 + add r8, sb, #0x1300 +_0223BB24: + mov r1, r8 + mov r2, r4 + add r0, r6, #4 + bl memcmp + cmp r0, #0 + bne _0223BB7C + rsb r0, r5, r5, lsl #3 + add r0, sb, r0 + add r0, r0, #0x1000 + ldrb r0, [r0, #0x306] + cmp r0, #0 + bne _0223BC04 + ldrb r0, [r6, #0x15] + tst r0, #1 + beq _0223BC04 + add r0, sb, #0x1000 + ldr r1, [r0, #0x370] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #1 + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223BB7C: + add r5, r5, #1 + cmp r5, #0x10 + add r8, r8, #7 + blt _0223BB24 + ldr r5, _0223BC20 ; =ov13_02245820 + add r8, sb, #0x1300 + mov sl, #0 + mov r4, #6 +_0223BB9C: + mov r0, r8 + mov r1, r5 + mov r2, r4 + bl memcmp + cmp r0, #0 + bne _0223BBF4 + rsb r4, sl, sl, lsl #3 + add r1, sb, #0x1300 + add r0, r6, #4 + add r1, r1, r4 + mov r2, #6 + bl MI_CpuCopy8 + ldrb r0, [r6, #0x15] + tst r0, #1 + ldr r0, _0223BC1C ; =ov13_0224F5B4 + movne r1, #1 + ldr r0, [r0] + moveq r1, #0 + add r0, r0, r4 + add r0, r0, #0x1000 + strb r1, [r0, #0x306] + b _0223BC04 +_0223BBF4: + add sl, sl, #1 + cmp sl, #0x10 + add r8, r8, #7 + blt _0223BB9C +_0223BC04: + ldrh r0, [fp, #0xe] + add r7, r7, #1 + cmp r7, r0 + blt _0223BAE4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223BC18: .word ov13_02245828 +_0223BC1C: .word ov13_0224F5B4 +_0223BC20: .word ov13_02245820 + arm_func_end ov13_0223BACC + + arm_func_start ov13_0223BC24 +ov13_0223BC24: ; 0x0223BC24 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _0223BD28 ; =ov13_0224F5B4 + mov sl, r0 + ldr r2, [r1] + add r1, r2, #0x1000 + ldrb r0, [r1, #0xb95] + cmp r0, #0 + beq _0223BC58 + ldr r1, [r1, #0x370] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223BC58: + add r0, r2, #0xf00 + mov r1, #0x400 + bl DC_InvalidateRange + ldrh fp, [sl, #0xe] + mov r6, #0 + cmp fp, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _0223BD28 ; =ov13_0224F5B4 + mov r4, #6 + ldr sb, [r0] +_0223BC80: + add r0, sl, r6, lsl #2 + ldr r5, [r0, #0x10] + ldr r1, _0223BD2C ; =ov13_02245828 + mov r2, #8 + add r0, r5, #0xc + bl memcmp + cmp r0, #0 + bne _0223BD18 + ldrb r0, [r5, #0x15] + tst r0, #1 + beq _0223BD18 + mov r7, #0 + add r8, sb, #0x1300 +_0223BCB4: + mov r1, r8 + mov r2, r4 + add r0, r5, #4 + bl memcmp + cmp r0, #0 + bne _0223BD08 + rsb r0, r7, r7, lsl #3 + add r0, sb, r0 + add r0, r0, #0x1000 + ldrb r0, [r0, #0x306] + cmp r0, #0 + bne _0223BD18 + add r0, sb, #0x1000 + ldr r1, [r0, #0x370] + cmp r1, #0 + moveq r1, #1 + streqb r1, [r0, #0xb95] + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #1 + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223BD08: + add r7, r7, #1 + cmp r7, #0x10 + add r8, r8, #7 + blt _0223BCB4 +_0223BD18: + add r6, r6, #1 + cmp r6, fp + blt _0223BC80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223BD28: .word ov13_0224F5B4 +_0223BD2C: .word ov13_02245828 + arm_func_end ov13_0223BC24 + + arm_func_start ov13_0223BD30 +ov13_0223BD30: ; 0x0223BD30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + str r0, [sp] + bl OS_GetTick + ldr r2, _0223BE60 ; =ov13_0224F5B4 + ldr r3, _0223BE64 ; =0x0017F898 + ldr sl, [r2] + mov r7, #0 + add r2, sl, #0x1000 + ldr r4, [r2, #0xb88] + ldr r2, [r2, #0xb8c] + adds r3, r4, r3 + adc r2, r2, #0 + cmp r1, r2 + cmpeq r0, r3 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _0223BE68 ; =ov13_02245820 + mov r6, r7 + mov r5, r7 + mov sb, sl + add r8, sl, #0x1300 + mov fp, #6 +_0223BD84: + mov r0, r8 + mov r1, r4 + mov r2, fp + bl memcmp + cmp r0, #0 + beq _0223BDB0 + add r0, sb, #0x1000 + ldrb r0, [r0, #0x306] + cmp r0, #0 + movne r6, #1 + moveq r7, #1 +_0223BDB0: + add r5, r5, #1 + cmp r5, #0x10 + add r8, r8, #7 + add sb, sb, #7 + blt _0223BD84 + cmp r6, #0 + cmpne r7, #0 + beq _0223BDEC + add r0, sl, #0x1000 + ldr r1, [r0, #0x370] + cmp r1, #0 + beq _0223BE30 + mov r0, #2 + blx r1 + b _0223BE30 +_0223BDEC: + cmp r6, #0 + beq _0223BE10 + add r0, sl, #0x1000 + ldr r1, [r0, #0x370] + cmp r1, #0 + beq _0223BE30 + mov r0, #1 + blx r1 + b _0223BE30 +_0223BE10: + cmp r7, #0 + bne _0223BE30 + add r0, sl, #0x1000 + ldr r1, [r0, #0x370] + cmp r1, #0 + beq _0223BE30 + mov r0, #0 + blx r1 +_0223BE30: + ldr r3, _0223BE60 ; =ov13_0224F5B4 + mov r0, #0 + ldr r2, [r3] + ldr r1, [sp] + add r2, r2, #0x1000 + str r0, [r2, #0xb90] + ldr r2, [r3] + mov r3, #1 + add r2, r2, #0x1000 + strb r3, [r2, #0xb96] + bl ov13_022425D0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223BE60: .word ov13_0224F5B4 +_0223BE64: .word 0x0017F898 +_0223BE68: .word ov13_02245820 + arm_func_end ov13_0223BD30 + + arm_func_start ov13_0223BE6C +ov13_0223BE6C: ; 0x0223BE6C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + ldr r5, _0223C168 ; =ov13_02245878 + ldr r4, _0223C16C ; =ov13_0224F4F8 + ldrb sl, [r5, #4] + ldrb sb, [r5, #5] + ldrb r8, [r5, #6] + ldrb r7, [r5, #7] + ldrb r6, [r5, #8] + ldrb r5, [r5, #9] + strb sl, [sp, #0x1c] + mov fp, r0 + str r2, [sp, #0x10] + mov r2, r3 + mov sl, r1 + ldr r0, [r4] + ldr r3, [sp, #0x48] + mov r1, fp + strb sb, [sp, #0x1d] + strb r8, [sp, #0x1e] + strb r7, [sp, #0x1f] + strb r6, [sp, #0x20] + strb r5, [sp, #0x21] + bl ov13_0222BAF4 + str r0, [sp, #0x14] + mov r0, #0x20 + mov r1, #4 + bl ov13_0224128C + ldr r1, _0223C170 ; =ov13_0224F5B8 + mvn r3, #1 + str r0, [r1] + strb sl, [r0, #0x1c] + ldr r2, [r1] + ldr r0, _0223C174 ; =0x04000050 + strb r3, [r2, #0x1b] + ldr r3, [r1] + ldr r2, [sp, #0x10] + mov r1, #0x1f + strb r2, [r3, #0x1e] + mov r2, #0 + bl G2x_SetBlendBrightness_ + ldr r1, _0223C178 ; =ov13_0224592C + mov r0, #0 + ldrb r1, [r1, sl] + mov r2, r0 + bl ov13_022401B0 + ldr r3, _0223C170 ; =ov13_0224F5B8 + mvn r1, #0 + ldr r4, [r3] + mov r2, #0x100 + str r0, [r4] + ldr r0, [r3] + mov r3, #0 + ldr r0, [r0] + bl ov13_0223FF18 + ldr r0, _0223C170 ; =ov13_0224F5B8 + mvn r1, #0 + ldr r0, [r0] + mov r2, #0 + ldr r0, [r0] + bl ov13_02240008 + ldr r7, _0223C17C ; =ov13_02245934 + mov r8, #0 + ldrb r0, [r7, sl] + cmp r0, #0 + ble _0223BFEC + ldr r0, _0223C180 ; =ov13_0224589E + ldr r4, _0223C170 ; =ov13_0224F5B8 + add sb, r0, sl, lsl #1 + mvn r6, #0 + mov r5, #0x100 + mov fp, r8 +_0223BF8C: + ldrb r1, [sb], #1 + mov r0, #0 + mov r2, r0 + bl ov13_022401B0 + ldr r2, [r4] + mov r1, r6 + add r2, r2, r8, lsl #2 + str r0, [r2, #8] + ldr r0, [r4] + mov r2, r5 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #8] + mov r3, fp + bl ov13_0223FF18 + ldr r0, [r4] + mov r1, r6 + add r0, r0, r8, lsl #2 + ldr r0, [r0, #8] + mov r2, #0 + bl ov13_02240008 + ldrb r0, [r7, sl] + add r8, r8, #1 + cmp r8, r0 + blt _0223BF8C +_0223BFEC: + add r1, sp, #0x18 + str r1, [sp] + mov r0, #0 + mov r1, #0x20 + mov r2, #0xc + mov r3, #1 + str r0, [sp, #4] + bl ov13_02240798 + ldr r1, _0223C170 ; =ov13_0224F5B8 + ldr r1, [r1] + str r0, [r1, #0x10] + mov r0, #0 + ldr r1, [sp, #0x18] + mov r2, r0 + bl ov13_0223FC04 + ldr r1, _0223C170 ; =ov13_0224F5B8 + ldr r1, [r1] + str r0, [r1, #4] + bl ov13_02227B1C + ldr r1, _0223C184 ; =ov13_022458BE + mov r5, sl, lsl #2 + ldrh r4, [r1, r5] + mov r3, #2 + ldr r2, _0223C170 ; =ov13_0224F5B8 + str r4, [sp] + str r3, [sp, #4] + str r0, [sp, #8] + ldr r0, [sp, #0x14] + ldr r3, _0223C188 ; =ov13_022458BC + str r0, [sp, #0xc] + ldr r0, [r2] + mov r1, #0 + ldrh r3, [r3, r5] + ldr r0, [r0, #0x10] + mov r2, r1 + bl ov13_02240CC0 + ldr r0, _0223C170 ; =ov13_0224F5B8 + mov r2, #0 + ldr r3, [r0] + mov r1, #0x100 + str r2, [sp] + ldr r0, [r3, #0x10] + ldr r3, [r3, #4] + bl ov13_02240D94 + mov r0, #0 + mov r1, r0 + mov r2, #0x1f + mov r3, r0 + bl ov13_02241070 + ldr r3, _0223C170 ; =ov13_0224F5B8 + add r4, sp, #0x1c + ldr r3, [r3] + mov r0, #0 + ldrb r3, [r3, #0x1c] + mov r1, #1 + mov r2, #0x1f + ldrb r3, [r4, r3] + bl ov13_02241070 + mov r0, #0 + mov r1, #3 + mov r2, #0x1f + mov r3, #1 + bl ov13_02241070 + ldr r2, _0223C18C ; =ov13_02245882 + mov r0, #0 + mov r1, #1 + bl ov13_02240F58 + mov r0, #0xc0 + bl ov13_0223C508 + mov r2, #0x4000000 + ldr r0, [sp, #0x10] + ldr r1, [r2] + cmp r0, #0 + bic r0, r1, #0xe000 + orr r0, r0, #0x6000 + str r0, [r2] + mov r0, #1 + mov r2, #0 + beq _0223C148 + ldr r1, _0223C190 ; =ov13_0223C20C + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223C170 ; =ov13_0224F5B8 + add sp, sp, #0x24 + ldr r1, [r1] + str r0, [r1, #0x14] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223C148: + ldr r1, _0223C194 ; =ov13_0223C26C + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223C170 ; =ov13_0224F5B8 + ldr r1, [r1] + str r0, [r1, #0x14] + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223C168: .word ov13_02245878 +_0223C16C: .word ov13_0224F4F8 +_0223C170: .word ov13_0224F5B8 +_0223C174: .word 0x04000050 +_0223C178: .word ov13_0224592C +_0223C17C: .word ov13_02245934 +_0223C180: .word ov13_0224589E +_0223C184: .word ov13_022458BE +_0223C188: .word ov13_022458BC +_0223C18C: .word ov13_02245882 +_0223C190: .word ov13_0223C20C +_0223C194: .word ov13_0223C26C + arm_func_end ov13_0223BE6C + + arm_func_start ov13_0223C198 +ov13_0223C198: ; 0x0223C198 + stmdb sp!, {r3, lr} + ldr r1, _0223C1D4 ; =ov13_0224F5B8 + mov r0, #0 + ldr r1, [r1] + ldr r1, [r1, #0x14] + bl ov13_022425D0 + ldr r1, _0223C1D8 ; =ov13_0223C7FC + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223C1D4 ; =ov13_0224F5B8 + ldr r1, [r1] + str r0, [r1, #0x14] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223C1D4: .word ov13_0224F5B8 +_0223C1D8: .word ov13_0223C7FC + arm_func_end ov13_0223C198 + + arm_func_start ov13_0223C1DC +ov13_0223C1DC: ; 0x0223C1DC + ldr r0, _0223C1EC ; =ov13_0224F5B8 + ldr r0, [r0] + ldrsb r0, [r0, #0x1b] + bx lr + .balign 4, 0 +_0223C1EC: .word ov13_0224F5B8 + arm_func_end ov13_0223C1DC + + arm_func_start ov13_0223C1F0 +ov13_0223C1F0: ; 0x0223C1F0 + ldr r0, _0223C208 ; =ov13_0224F5B8 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_0223C208: .word ov13_0224F5B8 + arm_func_end ov13_0223C1F0 + + arm_func_start ov13_0223C20C +ov13_0223C20C: ; 0x0223C20C + stmdb sp!, {r4, lr} + ldr r1, _0223C260 ; =ov13_0224F5B8 + mov r4, r0 + ldr r3, [r1] + ldr r0, _0223C264 ; =0x04000050 + ldrsb r2, [r3, #0x1a] + sub r2, r2, #1 + strb r2, [r3, #0x1a] + ldr r1, [r1] + ldrsb r1, [r1, #0x1a] + bl G2x_ChangeBlendBrightness_ + ldr r1, _0223C260 ; =ov13_0224F5B8 + mvn r0, #0xb + ldr r1, [r1] + ldrsb r1, [r1, #0x1a] + cmp r1, r0 + ldmgtia sp!, {r4, pc} + ldr r1, _0223C268 ; =ov13_0223C26C + mov r0, r4 + bl ov13_022425C8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223C260: .word ov13_0224F5B8 +_0223C264: .word 0x04000050 +_0223C268: .word ov13_0223C26C + arm_func_end ov13_0223C20C + + arm_func_start ov13_0223C26C +ov13_0223C26C: ; 0x0223C26C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0223C330 ; =ov13_0224F5B8 + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + ldr r1, _0223C330 ; =ov13_0224F5B8 + sub r0, r0, #0xc + ldr r1, [r1] + str r0, [sp] + ldrb r2, [r1, #0x1c] + ldr r1, _0223C334 ; =ov13_022458D6 + mov r2, r2, lsl #2 + ldrh r1, [r1, r2] + cmp r0, r1 + ble _0223C2CC + bl ov13_0223C508 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0223C2CC: + mov r0, r1 + bl ov13_0223C508 + ldr r0, _0223C330 ; =ov13_0224F5B8 + mov r3, #0x78 + ldr r0, [r0] + ldrb r0, [r0, #0x1c] + cmp r0, #5 + mov r0, #0 + bne _0223C304 + ldr r1, _0223C338 ; =ov13_0223C49C + mov r2, r0 + bl ov13_02242528 + ldr r1, _0223C330 ; =ov13_0224F5B8 + b _0223C314 +_0223C304: + ldr r1, _0223C33C ; =ov13_0223C340 + mov r2, r0 + bl ov13_02242528 + ldr r1, _0223C330 ; =ov13_0224F5B8 +_0223C314: + ldr r1, [r1] + str r0, [r1, #0x14] + mov r1, r4 + mov r0, #1 + bl ov13_022425D0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223C330: .word ov13_0224F5B8 +_0223C334: .word ov13_022458D6 +_0223C338: .word ov13_0223C49C +_0223C33C: .word ov13_0223C340 + arm_func_end ov13_0223C26C + + arm_func_start ov13_0223C340 +ov13_0223C340: ; 0x0223C340 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + ldr r4, _0223C480 ; =ov13_0224F5B8 + ldr sb, _0223C484 ; =ov13_02245934 + ldr r0, [r4] + mov sl, #0 + ldrb r1, [r0, #0x1c] + ldrb r0, [sb, r1] + cmp r0, #0 + ble _0223C3CC + ldr r8, _0223C488 ; =ov13_02245904 + ldr r7, _0223C48C ; =ov13_0224588A + ldr r6, _0223C490 ; =ov13_022458A8 + add r5, sp, #0 +_0223C378: + add r0, r7, r1, lsl #1 + ldrb r0, [sl, r0] + add r3, r8, r1, lsl #3 + mov r2, r5 + add r0, r3, r0, lsl #2 + add r1, r6, r1, lsl #2 + bl ov13_02240E74 + mov r0, r5 + bl ov13_022417DC + cmp r0, #0 + beq _0223C3B4 + ldr r0, _0223C480 ; =ov13_0224F5B8 + ldr r0, [r0] + strb sl, [r0, #0x1b] + b _0223C3CC +_0223C3B4: + ldr r0, [r4] + add sl, sl, #1 + ldrb r1, [r0, #0x1c] + ldrb r0, [sb, r1] + cmp sl, r0 + blt _0223C378 +_0223C3CC: + mov r0, #1 + bl ov13_02241694 + cmp r0, #0 + beq _0223C3F8 + ldr r0, _0223C480 ; =ov13_0224F5B8 + ldr r1, _0223C494 ; =ov13_02245894 + ldr r2, [r0] + ldrb r0, [r2, #0x1c] + mov r0, r0, lsl #1 + ldrsb r0, [r1, r0] + strb r0, [r2, #0x1b] +_0223C3F8: + mov r0, #2 + bl ov13_02241694 + cmp r0, #0 + beq _0223C424 + ldr r0, _0223C480 ; =ov13_0224F5B8 + ldr r1, _0223C498 ; =ov13_02245895 + ldr r2, [r0] + ldrb r0, [r2, #0x1c] + mov r0, r0, lsl #1 + ldrsb r0, [r1, r0] + strb r0, [r2, #0x1b] +_0223C424: + ldr r0, _0223C480 ; =ov13_0224F5B8 + ldr r2, _0223C484 ; =ov13_02245934 + ldr r4, [r0] + mov r0, #0 + ldrb r1, [r4, #0x1c] + ldrb r1, [r2, r1] + cmp r1, #0 + ble _0223C470 + ldrsb r3, [r4, #0x1b] +_0223C448: + cmp r0, r3 + bne _0223C45C + bl ov13_0223C73C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0223C45C: + ldrb r1, [r4, #0x1c] + add r0, r0, #1 + ldrb r1, [r2, r1] + cmp r0, r1 + blt _0223C448 +_0223C470: + mvn r0, #0 + strb r0, [r4, #0x1b] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0223C480: .word ov13_0224F5B8 +_0223C484: .word ov13_02245934 +_0223C488: .word ov13_02245904 +_0223C48C: .word ov13_0224588A +_0223C490: .word ov13_022458A8 +_0223C494: .word ov13_02245894 +_0223C498: .word ov13_02245895 + arm_func_end ov13_0223C340 + + arm_func_start ov13_0223C49C +ov13_0223C49C: ; 0x0223C49C + stmdb sp!, {r3, lr} + ldr r2, _0223C500 ; =ov13_0224F5B8 + mvn ip, #0 + ldr r3, [r2] + mov r1, r0 + strb ip, [r3, #0x1b] + ldr r3, [r2] + ldrh r0, [r3, #0x18] + add r0, r0, #1 + strh r0, [r3, #0x18] + ldr r0, [r2] + ldrh r0, [r0, #0x18] + cmp r0, #0x78 + ldmloia sp!, {r3, pc} + mov r0, #0 + bl ov13_022425D0 + ldr r1, _0223C504 ; =ov13_0223C7FC + mov r0, #1 + mov r2, #0 + mov r3, #0x78 + bl ov13_02242528 + ldr r1, _0223C500 ; =ov13_0224F5B8 + ldr r1, [r1] + str r0, [r1, #0x14] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223C500: .word ov13_0224F5B8 +_0223C504: .word ov13_0223C7FC + arm_func_end ov13_0223C49C + + arm_func_start ov13_0223C508 +ov13_0223C508: ; 0x0223C508 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r1, _0223C694 ; =ov13_0224F5B8 + mov sl, r0 + ldr r0, [r1] + ldr r1, _0223C698 ; =ov13_022458D4 + ldrb r2, [r0, #0x1c] + ldr r0, [r0] + mov r3, sl + mov r2, r2, lsl #2 + ldrh r2, [r1, r2] + mvn r1, #0 + bl ov13_0223FF18 + ldr r0, _0223C694 ; =ov13_0224F5B8 + ldr r2, _0223C698 ; =ov13_022458D4 + ldr r0, [r0] + add r3, sl, #8 + ldrb r4, [r0, #0x1c] + ldr r0, [r0, #4] + mvn r1, #0 + mov r4, r4, lsl #2 + ldrh r2, [r2, r4] + add r2, r2, #8 + bl ov13_0223FF18 + ldr r0, _0223C694 ; =ov13_0224F5B8 + mov r1, sl + ldr r0, [r0] + ldr r0, [r0] + bl ov13_0223C6B0 + ldr r0, _0223C694 ; =ov13_0224F5B8 + mov r1, sl + ldr r0, [r0] + ldr r0, [r0, #4] + bl ov13_0223C6B0 + ldr r4, _0223C694 ; =ov13_0224F5B8 + ldr r8, _0223C69C ; =ov13_02245934 + ldr r0, [r4] + mov sb, #0 + ldrb r0, [r0, #0x1c] + ldrb r1, [r8, r0] + cmp r1, #0 + ble _0223C62C + ldr r7, _0223C6A0 ; =ov13_0224588A + ldr r5, _0223C6A4 ; =ov13_02245904 + ldr fp, _0223C698 ; =ov13_022458D4 + mvn r6, #0 +_0223C5C0: + add r1, r7, r0, lsl #1 + ldrb ip, [sb, r1] + add r2, r5, r0, lsl #3 + add r3, fp, r0, lsl #2 + add r0, r2, ip, lsl #2 + ldr r1, [r4] + mov ip, ip, lsl #2 + ldrh r2, [ip, r2] + ldrh r0, [r0, #2] + add r1, r1, sb, lsl #2 + ldrh r3, [r3, #2] + add ip, sl, r0 + ldr r0, [r1, #8] + mov r1, r6 + sub r3, ip, r3 + bl ov13_0223FF18 + ldr r0, [r4] + mov r1, sl + add r0, r0, sb, lsl #2 + ldr r0, [r0, #8] + bl ov13_0223C6B0 + ldr r0, [r4] + add sb, sb, #1 + ldrb r0, [r0, #0x1c] + ldrb r1, [r8, r0] + cmp sb, r1 + blt _0223C5C0 +_0223C62C: + and r1, sl, #0xff + cmp r1, #0xc0 + movge r3, #0 + movge r1, r3 + bge _0223C650 + ldr r2, _0223C6A8 ; =ov13_022458EE + mov r3, r0, lsl #2 + ldrh r2, [r2, r3] + add r3, r1, r2 +_0223C650: + ldr r4, _0223C698 ; =ov13_022458D4 + mov r5, r0, lsl #2 + ldr r2, _0223C6AC ; =ov13_022458EC + ldrh r0, [r4, r5] + ldrh r2, [r2, r5] + cmp r3, #0xc0 + add r4, sp, #4 + movgt r3, #0xc0 + add r2, r0, r2 + str r4, [sp] + bl ov13_02240E5C + mov r0, #0 + mov r2, r4 + mov r1, r0 + bl ov13_02240F58 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223C694: .word ov13_0224F5B8 +_0223C698: .word ov13_022458D4 +_0223C69C: .word ov13_02245934 +_0223C6A0: .word ov13_0224588A +_0223C6A4: .word ov13_02245904 +_0223C6A8: .word ov13_022458EE +_0223C6AC: .word ov13_022458EC + arm_func_end ov13_0223C508 + + arm_func_start ov13_0223C6B0 +ov13_0223C6B0: ; 0x0223C6B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + mov sb, r1 + bl ov13_0223FDEC + mov r7, r0 + cmp r7, #0 + mov r8, #0 + addle sp, sp, #8 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov fp, #0x200 + mov r4, r8 + add r6, sp, #4 + add r5, sp, #0 +_0223C6E8: + mov r0, sl + mov r1, r8 + mov r2, r6 + mov r3, r5 + bl ov13_02240068 + ldr r0, [sp] + cmp r0, sb + blt _0223C714 + cmp r0, #0xc0 + movlt r2, r4 + blt _0223C718 +_0223C714: + mov r2, fp +_0223C718: + mov r0, sl + mov r1, r8 + mov r3, #0 + bl ov13_0223FDF4 + add r8, r8, #1 + cmp r8, r7 + blt _0223C6E8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov13_0223C6B0 + + arm_func_start ov13_0223C73C +ov13_0223C73C: ; 0x0223C73C + stmdb sp!, {r4, lr} + ldr r1, _0223C7E8 ; =ov13_0224F5B8 + mov r4, r0 + ldr r0, [r1] + mov r1, #0 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #8] + bl ov13_0223FDE0 + ldr r1, _0223C7E8 ; =ov13_0224F5B8 + mov r2, r0 + ldr r0, [r1] + ldr r1, _0223C7EC ; =ov13_0224589E + ldrb r3, [r0, #0x1c] + mov r0, #0 + add r1, r1, r3, lsl #1 + ldrb r1, [r4, r1] + add r1, r1, #1 + bl ov13_022400F0 + ldr r0, _0223C7E8 ; =ov13_0224F5B8 + ldr r2, _0223C7F0 ; =ov13_0224588A + ldr r0, [r0] + ldr r1, _0223C7F4 ; =ov13_02245904 + ldrb lr, [r0, #0x1c] + add r0, r0, r4, lsl #2 + ldr r0, [r0, #8] + add r2, r2, lr, lsl #1 + ldrb r3, [r4, r2] + add r2, r1, lr, lsl #3 + mvn r1, #0 + mov ip, r3, lsl #2 + ldrh r2, [ip, r2] + ldr r3, _0223C7F8 ; =ov13_02245906 + add r3, r3, lr, lsl #3 + ldrh r3, [ip, r3] + bl ov13_0223FF18 + ldr r0, _0223C7E8 ; =ov13_0224F5B8 + mvn r1, #0 + ldr r0, [r0] + mov r2, #0 + add r0, r0, r4, lsl #2 + ldr r0, [r0, #8] + bl ov13_02240008 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223C7E8: .word ov13_0224F5B8 +_0223C7EC: .word ov13_0224589E +_0223C7F0: .word ov13_0224588A +_0223C7F4: .word ov13_02245904 +_0223C7F8: .word ov13_02245906 + arm_func_end ov13_0223C73C + + arm_func_start ov13_0223C7FC +ov13_0223C7FC: ; 0x0223C7FC + stmdb sp!, {r3, lr} + ldr r1, _0223C830 ; =ov13_0224F5B8 + ldr r3, [r1] + ldrb r2, [r3, #0x1d] + add r2, r2, #1 + strb r2, [r3, #0x1d] + ldr r1, [r1] + ldrb r1, [r1, #0x1d] + cmp r1, #8 + ldmloia sp!, {r3, pc} + ldr r1, _0223C834 ; =ov13_0223C838 + bl ov13_022425C8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223C830: .word ov13_0224F5B8 +_0223C834: .word ov13_0223C838 + arm_func_end ov13_0223C7FC + + arm_func_start ov13_0223C838 +ov13_0223C838: ; 0x0223C838 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _0223C8BC ; =ov13_0224F5B8 + mov r4, r0 + ldr r0, [r1] + add r2, sp, #4 + ldr r0, [r0] + add r3, sp, #0 + mov r1, #0 + bl ov13_02240068 + ldr r0, [sp] + add r0, r0, #0xc + str r0, [sp] + bl ov13_0223C508 + ldr r0, [sp] + cmp r0, #0xc0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldr r0, _0223C8BC ; =ov13_0224F5B8 + ldr r0, [r0] + ldrb r0, [r0, #0x1e] + cmp r0, #0 + beq _0223C8A8 + ldr r1, _0223C8C0 ; =ov13_0223C8C8 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} +_0223C8A8: + ldr r1, _0223C8C4 ; =ov13_0223C924 + mov r0, r4 + bl ov13_022425C8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223C8BC: .word ov13_0224F5B8 +_0223C8C0: .word ov13_0223C8C8 +_0223C8C4: .word ov13_0223C924 + arm_func_end ov13_0223C838 + + arm_func_start ov13_0223C8C8 +ov13_0223C8C8: ; 0x0223C8C8 + stmdb sp!, {r4, lr} + ldr r1, _0223C918 ; =ov13_0224F5B8 + mov r4, r0 + ldr r3, [r1] + ldr r0, _0223C91C ; =0x04000050 + ldrsb r2, [r3, #0x1a] + add r2, r2, #1 + strb r2, [r3, #0x1a] + ldr r1, [r1] + ldrsb r1, [r1, #0x1a] + bl G2x_ChangeBlendBrightness_ + ldr r0, _0223C918 ; =ov13_0224F5B8 + ldr r0, [r0] + ldrsb r0, [r0, #0x1a] + cmp r0, #0 + ldmltia sp!, {r4, pc} + ldr r1, _0223C920 ; =ov13_0223C924 + mov r0, r4 + bl ov13_022425C8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223C918: .word ov13_0224F5B8 +_0223C91C: .word 0x04000050 +_0223C920: .word ov13_0223C924 + arm_func_end ov13_0223C8C8 + + arm_func_start ov13_0223C924 +ov13_0223C924: ; 0x0223C924 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r3, #0x4000000 + ldr r2, [r3] + ldr r1, _0223C9C8 ; =ov13_0224F5B8 + bic r2, r2, #0xe000 + str r2, [r3] + ldr r1, [r1] + mov r6, r0 + ldr r0, [r1] + bl ov13_0223FD60 + ldr r0, _0223C9C8 ; =ov13_0224F5B8 + ldr r0, [r0] + ldr r0, [r0, #4] + bl ov13_0223FD60 + ldr r7, _0223C9C8 ; =ov13_0224F5B8 + ldr r4, _0223C9CC ; =ov13_02245934 + ldr r1, [r7] + mov r5, #0 + ldrb r0, [r1, #0x1c] + ldrb r0, [r4, r0] + cmp r0, #0 + ble _0223C9A8 +_0223C97C: + add r0, r1, r5, lsl #2 + ldr r0, [r0, #8] + cmp r0, #0 + beq _0223C990 + bl ov13_0223FD60 +_0223C990: + ldr r1, [r7] + add r5, r5, #1 + ldrb r0, [r1, #0x1c] + ldrb r0, [r4, r0] + cmp r5, r0 + blt _0223C97C +_0223C9A8: + ldr r0, [r1, #0x10] + bl ov13_02240874 + mov r1, r6 + mov r0, #1 + bl ov13_022425D0 + ldr r0, _0223C9D0 ; =ov13_0224F5B8 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223C9C8: .word ov13_0224F5B8 +_0223C9CC: .word ov13_02245934 +_0223C9D0: .word ov13_0224F5B8 + arm_func_end ov13_0223C924 + + arm_func_start ov13_0223C9D4 +ov13_0223C9D4: ; 0x0223C9D4 + stmdb sp!, {r3, lr} + ldr r2, _0223CA10 ; =ov13_0224F5BC + add r1, r0, #0x160 + str r0, [r2] + add r0, r1, #0x1b000 + bl ov13_0223D66C + ldr r1, _0223CA10 ; =ov13_0224F5BC + mov r2, #0 + ldr r0, [r1] + add r0, r0, #0x1b000 + str r2, [r0, #0x140] + ldr r0, [r1] + add r0, r0, #0x1b000 + str r2, [r0, #0x144] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223CA10: .word ov13_0224F5BC + arm_func_end ov13_0223C9D4 + + arm_func_start ov13_0223CA14 +ov13_0223CA14: ; 0x0223CA14 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x7c + mov r5, r0 + add r0, sp, #0x28 + mov r4, r1 + bl OS_GetOwnerInfo + ldrb r2, [sp, #0x12] + ldrb r1, [sp, #0x29] + ldrh r3, [sp, #0x42] + bic r2, r2, #0xf + and r1, r1, #0xf + orr r2, r2, r1 + strb r2, [sp, #0x12] + add r0, sp, #0x2c + add r1, sp, #0x14 + mov r2, r3, lsl #1 + strb r3, [sp, #0x13] + bl MI_CpuCopy8 + ldrb r2, [sp, #0x12] + ldr r0, _0223CB2C ; =ov13_0224F5BC + add lr, sp, #4 + mov r1, #0 + ldr r0, [r0] + bic r2, r2, #0xf0 + mov ip, r0 + strb r2, [sp, #0x12] + strh r1, [lr] + strh r1, [lr, #2] + strh r1, [lr, #4] + strh r1, [lr, #6] + strh r1, [lr, #8] + strh r1, [lr, #0xa] + strh r1, [lr, #0xc] + mov r3, #3 +_0223CA9C: + ldrh r2, [lr] + ldrh r1, [lr, #2] + add lr, lr, #4 + subs r3, r3, #1 + strh r2, [ip] + strh r1, [ip, #2] + add ip, ip, #4 + bne _0223CA9C + ldrh r2, [lr] + add r1, r0, #0x40 + add r1, r1, #0x10000 + strh r2, [ip] + add r0, r0, #0x1b000 + str r1, [r0, #0x140] + mov r1, #2 + str r1, [sp] + ldr r0, _0223CB2C ; =ov13_0224F5BC + add r1, sp, #0x12 + ldr r0, [r0] + mov r2, r5 + add r0, r0, #0x1b000 + ldr r0, [r0, #0x140] + mov r3, r4 + bl MB_Init + cmp r0, #0 + beq _0223CB08 + bl OS_Terminate +_0223CB08: + mov r0, #0x100 + mov r1, #1 + bl MB_SetParentCommParam + ldr r0, _0223CB30 ; =ov13_0223D124 + bl MB_CommSetParentStateCallback + mov r0, #1 + bl ov13_0223D448 + add sp, sp, #0x7c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0223CB2C: .word ov13_0224F5BC +_0223CB30: .word ov13_0223D124 + arm_func_end ov13_0223CA14 + + arm_func_start ov13_0223CB34 +ov13_0223CB34: ; 0x0223CB34 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, #2 + bl ov13_0223D448 + mov r0, r4 + bl MB_StartParentFromIdle + cmp r0, #0 + beq _0223CB64 + mov r0, #7 + bl ov13_0223D448 + ldmia sp!, {r3, r4, r5, pc} +_0223CB64: + mov r0, r5 + bl ov13_0223CB7C + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl OS_Terminate + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov13_0223CB34 + + arm_func_start ov13_0223CB7C +ov13_0223CB7C: ; 0x0223CB7C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x48 + mov r6, r0 + ldr r0, [r6] + mov r5, #0 + cmp r0, #0 + moveq r4, r5 + beq _0223CBC4 + add r0, sp, #0 + bl FS_InitFile + ldr r1, [r6] + add r0, sp, #0 + bl FS_OpenFile + cmp r0, #0 + addeq sp, sp, #0x48 + moveq r0, r5 + ldmeqia sp!, {r4, r5, r6, pc} + add r4, sp, #0 +_0223CBC4: + mov r0, r4 + bl MB_GetSegmentLength + cmp r0, #0 + beq _0223CC30 + ldr r1, _0223CC4C ; =ov13_0224F5BC + ldr r0, [r1] + add r2, r0, #0x2c + add r0, r0, #0x1b000 + str r2, [r0, #0x144] + ldr r0, [r1] + add r0, r0, #0x1b000 + ldr r1, [r0, #0x144] + cmp r1, #0 + beq _0223CC30 + mov r0, r4 + mov r2, #0x10000 + bl MB_ReadSegment + cmp r0, #0 + beq _0223CC30 + ldr r1, _0223CC4C ; =ov13_0224F5BC + mov r0, r6 + ldr r1, [r1] + add r1, r1, #0x1b000 + ldr r1, [r1, #0x144] + bl MB_RegisterFile + cmp r0, #0 + movne r5, #1 +_0223CC30: + add r0, sp, #0 + cmp r4, r0 + bne _0223CC40 + bl FS_CloseFile +_0223CC40: + mov r0, r5 + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223CC4C: .word ov13_0224F5BC + arm_func_end ov13_0223CB7C + + arm_func_start ov13_0223CC50 +ov13_0223CC50: ; 0x0223CC50 + stmdb sp!, {r3, r4, r5, lr} + mov r1, #1 + mov r4, r0 + bl MB_CommResponseRequest + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #1 + mvn r0, r0, lsl r4 + mov r5, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r1, _0223CCEC ; =ov13_0224F5BC + ldr r3, [r1] + ldrh r2, [r3, #2] + and r2, r2, r5, lsr #16 + strh r2, [r3, #2] + ldr r3, [r1] + ldrh r2, [r3, #4] + and r2, r2, r5, lsr #16 + strh r2, [r3, #4] + ldr r3, [r1] + ldrh r2, [r3, #6] + and r2, r2, r5, lsr #16 + strh r2, [r3, #6] + ldr r3, [r1] + ldrh r2, [r3, #8] + and r2, r2, r5, lsr #16 + strh r2, [r3, #8] + ldr r3, [r1] + ldrh r2, [r3, #0xa] + and r2, r2, r5, lsr #16 + strh r2, [r3, #0xa] + ldr r2, [r1] + ldrh r1, [r2, #0xc] + and r1, r1, r5, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + mov r0, r4 + bl MB_DisconnectChild + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223CCEC: .word ov13_0224F5BC + arm_func_end ov13_0223CC50 + + arm_func_start ov13_0223CCF0 +ov13_0223CCF0: ; 0x0223CCF0 + stmdb sp!, {r3, r4, r5, lr} + mov r1, #0 + mov r4, r0 + bl MB_CommResponseRequest + cmp r0, #0 + bne _0223CD8C + mov r0, #1 + mvn r0, r0, lsl r4 + mov r5, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r1, _0223CDC4 ; =ov13_0224F5BC + ldr r3, [r1] + ldrh r2, [r3, #2] + and r2, r2, r5, lsr #16 + strh r2, [r3, #2] + ldr r3, [r1] + ldrh r2, [r3, #4] + and r2, r2, r5, lsr #16 + strh r2, [r3, #4] + ldr r3, [r1] + ldrh r2, [r3, #6] + and r2, r2, r5, lsr #16 + strh r2, [r3, #6] + ldr r3, [r1] + ldrh r2, [r3, #8] + and r2, r2, r5, lsr #16 + strh r2, [r3, #8] + ldr r3, [r1] + ldrh r2, [r3, #0xa] + and r2, r2, r5, lsr #16 + strh r2, [r3, #0xa] + ldr r2, [r1] + ldrh r1, [r2, #0xc] + and r1, r1, r5, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + mov r0, r4 + bl MB_DisconnectChild + ldmia sp!, {r3, r4, r5, pc} +_0223CD8C: + bl OS_DisableInterrupts + ldr r1, _0223CDC4 ; =ov13_0224F5BC + mov r2, #1 + ldr r3, [r1] + mvn r4, r2, lsl r4 + ldrh r2, [r3, #4] + and r2, r2, r4 + strh r2, [r3, #4] + ldr r2, [r1] + ldrh r1, [r2, #2] + and r1, r1, r4 + strh r1, [r2, #2] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223CDC4: .word ov13_0224F5BC + arm_func_end ov13_0223CCF0 + + arm_func_start ov13_0223CDC8 +ov13_0223CDC8: ; 0x0223CDC8 + stmdb sp!, {r3, r4, r5, lr} + mov r1, #2 + mov r4, r0 + bl MB_CommResponseRequest + cmp r0, #0 + bne _0223CE64 + mov r0, #1 + mvn r0, r0, lsl r4 + mov r5, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r1, _0223CE9C ; =ov13_0224F5BC + ldr r3, [r1] + ldrh r2, [r3, #2] + and r2, r2, r5, lsr #16 + strh r2, [r3, #2] + ldr r3, [r1] + ldrh r2, [r3, #4] + and r2, r2, r5, lsr #16 + strh r2, [r3, #4] + ldr r3, [r1] + ldrh r2, [r3, #6] + and r2, r2, r5, lsr #16 + strh r2, [r3, #6] + ldr r3, [r1] + ldrh r2, [r3, #8] + and r2, r2, r5, lsr #16 + strh r2, [r3, #8] + ldr r3, [r1] + ldrh r2, [r3, #0xa] + and r2, r2, r5, lsr #16 + strh r2, [r3, #0xa] + ldr r2, [r1] + ldrh r1, [r2, #0xc] + and r1, r1, r5, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + mov r0, r4 + bl MB_DisconnectChild + ldmia sp!, {r3, r4, r5, pc} +_0223CE64: + bl OS_DisableInterrupts + ldr r1, _0223CE9C ; =ov13_0224F5BC + mov ip, #1 + ldr r5, [r1] + mvn r2, ip, lsl r4 + ldrh r3, [r5, #6] + and r2, r3, r2 + strh r2, [r5, #6] + ldr r2, [r1] + ldrh r1, [r2, #8] + orr r1, r1, ip, lsl r4 + strh r1, [r2, #8] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223CE9C: .word ov13_0224F5BC + arm_func_end ov13_0223CDC8 + + arm_func_start ov13_0223CEA0 +ov13_0223CEA0: ; 0x0223CEA0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r0, #3 + bl ov13_0223D448 + mov r5, #1 + ldr r7, _0223CF7C ; =ov13_0224F5BC + mov r4, r5 +_0223CEB8: + ldr r1, [r7] + ldrh r0, [r1, #2] + tst r0, r4, lsl r5 + beq _0223CF64 + ldrh r0, [r1, #4] + tst r0, r4, lsl r5 + bne _0223CF64 + ldrh r0, [r1, #6] + tst r0, r4, lsl r5 + bne _0223CF5C + mvn r0, r4, lsl r5 + mov r6, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r2, [r7] + ldrh r1, [r2, #2] + and r1, r1, r6, lsr #16 + strh r1, [r2, #2] + ldr r2, [r7] + ldrh r1, [r2, #4] + and r1, r1, r6, lsr #16 + strh r1, [r2, #4] + ldr r2, [r7] + ldrh r1, [r2, #6] + and r1, r1, r6, lsr #16 + strh r1, [r2, #6] + ldr r2, [r7] + ldrh r1, [r2, #8] + and r1, r1, r6, lsr #16 + strh r1, [r2, #8] + ldr r2, [r7] + ldrh r1, [r2, #0xa] + and r1, r1, r6, lsr #16 + strh r1, [r2, #0xa] + ldr r2, [r7] + ldrh r1, [r2, #0xc] + and r1, r1, r6, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + mov r0, r5 + bl MB_DisconnectChild + b _0223CF64 +_0223CF5C: + mov r0, r5 + bl ov13_0223CDC8 +_0223CF64: + add r0, r5, #1 + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 + cmp r5, #0x10 + blo _0223CEB8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223CF7C: .word ov13_0224F5BC + arm_func_end ov13_0223CEA0 + + arm_func_start ov13_0223CF80 +ov13_0223CF80: ; 0x0223CF80 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _0223CFE4 ; =ov13_0224F5BC + ldr r0, [r4] + ldrh r0, [r0, #2] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r6, #1 + mov r5, r6 +_0223CFA4: + ldr r0, [r4] + ldrh r0, [r0, #2] + tst r0, r5, lsl r6 + beq _0223CFC8 + mov r0, r6 + bl MB_CommIsBootable + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_0223CFC8: + add r0, r6, #1 + mov r0, r0, lsl #0x10 + mov r6, r0, lsr #0x10 + cmp r6, #0x10 + blo _0223CFA4 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223CFE4: .word ov13_0224F5BC + arm_func_end ov13_0223CF80 + + arm_func_start ov13_0223CFE8 +ov13_0223CFE8: ; 0x0223CFE8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, #1 + ldr r4, _0223D0DC ; =ov13_0224F5BC + mov r8, #0 + mov r5, #3 + mov r6, r7 +_0223D000: + ldr r0, [r4] + ldrh r0, [r0, #0xa] + tst r0, r6, lsl r7 + beq _0223D0A8 + mov r0, r7 + mov r1, r5 + bl MB_CommResponseRequest + cmp r0, #0 + orrne r0, r8, r6, lsl r7 + movne r0, r0, lsl #0x10 + movne r8, r0, lsr #0x10 + bne _0223D0A8 + mvn r0, r6, lsl r7 + mov sb, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r2, [r4] + ldrh r1, [r2, #2] + and r1, r1, sb, lsr #16 + strh r1, [r2, #2] + ldr r2, [r4] + ldrh r1, [r2, #4] + and r1, r1, sb, lsr #16 + strh r1, [r2, #4] + ldr r2, [r4] + ldrh r1, [r2, #6] + and r1, r1, sb, lsr #16 + strh r1, [r2, #6] + ldr r2, [r4] + ldrh r1, [r2, #8] + and r1, r1, sb, lsr #16 + strh r1, [r2, #8] + ldr r2, [r4] + ldrh r1, [r2, #0xa] + and r1, r1, sb, lsr #16 + strh r1, [r2, #0xa] + ldr r2, [r4] + ldrh r1, [r2, #0xc] + and r1, r1, sb, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + mov r0, r7 + bl MB_DisconnectChild +_0223D0A8: + add r0, r7, #1 + mov r0, r0, lsl #0x10 + mov r7, r0, lsr #0x10 + cmp r7, #0x10 + blo _0223D000 + cmp r8, #0 + bne _0223D0D0 + mov r0, #7 + bl ov13_0223D448 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223D0D0: + mov r0, #4 + bl ov13_0223D448 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223D0DC: .word ov13_0224F5BC + arm_func_end ov13_0223CFE8 + + arm_func_start ov13_0223D0E0 +ov13_0223D0E0: ; 0x0223D0E0 + stmdb sp!, {r3, lr} + mov r0, #6 + bl ov13_0223D448 + bl MB_End + ldmia sp!, {r3, pc} + arm_func_end ov13_0223D0E0 + + arm_func_start ov13_0223D0F4 +ov13_0223D0F4: ; 0x0223D0F4 + stmdb sp!, {r3, lr} + ldr r0, _0223D120 ; =ov13_0224F5BC + ldr r2, [r0] + ldrh r0, [r2] + cmp r0, #4 + ldreqh r1, [r2, #2] + ldreqh r0, [r2, #0xc] + cmpeq r1, r0 + ldmneia sp!, {r3, pc} + bl MB_End + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223D120: .word ov13_0224F5BC + arm_func_end ov13_0223D0F4 + + arm_func_start ov13_0223D124 +ov13_0223D124: ; 0x0223D124 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r2 + cmp r1, #0xe + addls pc, pc, r1, lsl #2 + b _0223D43C +_0223D13C: ; jump table + b _0223D43C ; case 0 + ldmia sp!, {r4, r5, r6, pc} ; case 1 + b _0223D178 ; case 2 + b _0223D200 ; case 3 + ldmia sp!, {r4, r5, r6, pc} ; case 4 + ldmia sp!, {r4, r5, r6, pc} ; case 5 + ldmia sp!, {r4, r5, r6, pc} ; case 6 + b _0223D33C ; case 7 + ldmia sp!, {r4, r5, r6, pc} ; case 8 + b _0223D36C ; case 9 + b _0223D28C ; case 10 + ldmia sp!, {r4, r5, r6, pc} ; case 11 + b _0223D3A0 ; case 12 + b _0223D3FC ; case 13 + b _0223D2F8 ; case 14 +_0223D178: + bl ov13_0223D45C + cmp r0, #2 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, _0223D444 ; =ov13_0224F5BC + ldr r6, [r0] + bl OS_DisableInterrupts + ldrh r2, [r6, #2] + mov r1, #1 + orr r1, r2, r1, lsl r5 + strh r1, [r6, #2] + bl OS_RestoreInterrupts + ldr r1, _0223D444 ; =ov13_0224F5BC + sub r3, r5, #1 + mov r0, #0x1e + mul r0, r3, r0 + ldr r2, [r1] + add r3, r2, #0x24 + ldrb r2, [r4, #0xa] + add ip, r3, r0 + strb r2, [r3, r0] + ldrb r2, [r4, #0xb] + strb r2, [ip, #1] + ldrb r2, [r4, #0xc] + strb r2, [ip, #2] + ldrb r2, [r4, #0xd] + strb r2, [ip, #3] + ldrb r2, [r4, #0xe] + strb r2, [ip, #4] + ldrb r2, [r4, #0xf] + strb r2, [ip, #5] + ldr r1, [r1] + add r0, r1, r0 + strh r5, [r0, #0x2a] + ldmia sp!, {r4, r5, r6, pc} +_0223D200: + bl ov13_0223D4C8 + cmp r0, #6 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #1 + mvn r0, r0, lsl r5 + mov r4, r0, lsl #0x10 + bl OS_DisableInterrupts + ldr r1, _0223D444 ; =ov13_0224F5BC + ldr r3, [r1] + ldrh r2, [r3, #2] + and r2, r2, r4, lsr #16 + strh r2, [r3, #2] + ldr r3, [r1] + ldrh r2, [r3, #4] + and r2, r2, r4, lsr #16 + strh r2, [r3, #4] + ldr r3, [r1] + ldrh r2, [r3, #6] + and r2, r2, r4, lsr #16 + strh r2, [r3, #6] + ldr r3, [r1] + ldrh r2, [r3, #8] + and r2, r2, r4, lsr #16 + strh r2, [r3, #8] + ldr r3, [r1] + ldrh r2, [r3, #0xa] + and r2, r2, r4, lsr #16 + strh r2, [r3, #0xa] + ldr r2, [r1] + ldrh r1, [r2, #0xc] + and r1, r1, r4, lsr #16 + strh r1, [r2, #0xc] + bl OS_RestoreInterrupts + bl ov13_0223D0F4 + ldmia sp!, {r4, r5, r6, pc} +_0223D28C: + bl ov13_0223D45C + cmp r0, #2 + beq _0223D2A4 + mov r0, r5 + bl ov13_0223CCF0 + ldmia sp!, {r4, r5, r6, pc} +_0223D2A4: + ldr r0, _0223D444 ; =ov13_0224F5BC + mov r1, #1 + ldr r3, [r0] + mov r0, r5 + ldrh r2, [r3, #4] + orr r1, r2, r1, lsl r5 + strh r1, [r3, #4] + bl ov13_0223CC50 + mov r0, r5 + bl MB_CommGetChildUser + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, _0223D444 ; =ov13_0224F5BC + sub r2, r5, #1 + ldr r3, [r1] + mov r1, #0x1e + add r3, r3, #0xe + mla r1, r2, r1, r3 + mov r2, #0x16 + bl MI_CpuCopy8 + ldmia sp!, {r4, r5, r6, pc} +_0223D2F8: + ldr r0, _0223D444 ; =ov13_0224F5BC + mov r4, #1 + ldr r3, [r0] + mvn r1, r4, lsl r5 + ldrh r2, [r3, #4] + and r1, r2, r1 + strh r1, [r3, #4] + ldr r1, [r0] + ldrh r0, [r1, #6] + orr r0, r0, r4, lsl r5 + strh r0, [r1, #6] + bl ov13_0223D45C + cmp r0, #3 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl ov13_0223CDC8 + ldmia sp!, {r4, r5, r6, pc} +_0223D33C: + ldr r0, _0223D444 ; =ov13_0224F5BC + mov r4, #1 + ldr r3, [r0] + mvn r1, r4, lsl r5 + ldrh r2, [r3, #8] + and r1, r2, r1 + strh r1, [r3, #8] + ldr r1, [r0] + ldrh r0, [r1, #0xa] + orr r0, r0, r4, lsl r5 + strh r0, [r1, #0xa] + ldmia sp!, {r4, r5, r6, pc} +_0223D36C: + ldr r0, _0223D444 ; =ov13_0224F5BC + mov r4, #1 + ldr r3, [r0] + mvn r1, r4, lsl r5 + ldrh r2, [r3, #0xa] + and r1, r2, r1 + strh r1, [r3, #0xa] + ldr r1, [r0] + ldrh r0, [r1, #0xc] + orr r0, r0, r4, lsl r5 + strh r0, [r1, #0xc] + bl ov13_0223D0F4 + ldmia sp!, {r4, r5, r6, pc} +_0223D3A0: + bl ov13_0223D45C + cmp r0, #4 + bne _0223D3B8 + mov r0, #5 + bl ov13_0223D448 + b _0223D3C0 +_0223D3B8: + mov r0, #0 + bl ov13_0223D448 +_0223D3C0: + ldr r0, _0223D444 ; =ov13_0224F5BC + ldr r0, [r0] + add r0, r0, #0x1b000 + ldr r1, [r0, #0x144] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #0x144] + ldr r0, _0223D444 ; =ov13_0224F5BC + ldr r0, [r0] + add r0, r0, #0x1b000 + ldr r1, [r0, #0x140] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #0x140] + ldmia sp!, {r4, r5, r6, pc} +_0223D3FC: + ldrh r0, [r4] + cmp r0, #8 + bgt _0223D428 + ldmgeia sp!, {r4, r5, r6, pc} + cmp r0, #2 + ldmgtia sp!, {r4, r5, r6, pc} + cmp r0, #1 + ldmltia sp!, {r4, r5, r6, pc} + cmpne r0, #2 + beq _0223D430 + ldmia sp!, {r4, r5, r6, pc} +_0223D428: + cmp r0, #9 + ldmneia sp!, {r4, r5, r6, pc} +_0223D430: + mov r0, #7 + bl ov13_0223D448 + ldmia sp!, {r4, r5, r6, pc} +_0223D43C: + bl OS_Terminate + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223D444: .word ov13_0224F5BC + arm_func_end ov13_0223D124 + + arm_func_start ov13_0223D448 +ov13_0223D448: ; 0x0223D448 + ldr r1, _0223D458 ; =ov13_0224F5BC + ldr r1, [r1] + strh r0, [r1] + bx lr + .balign 4, 0 +_0223D458: .word ov13_0224F5BC + arm_func_end ov13_0223D448 + + arm_func_start ov13_0223D45C +ov13_0223D45C: ; 0x0223D45C + ldr r0, _0223D46C ; =ov13_0224F5BC + ldr r0, [r0] + ldrh r0, [r0] + bx lr + .balign 4, 0 +_0223D46C: .word ov13_0224F5BC + arm_func_end ov13_0223D45C + + arm_func_start ov13_0223D470 +ov13_0223D470: ; 0x0223D470 + ldr r2, _0223D4BC ; =ov13_0224F5BC + ldr r1, _0223D4C0 ; =ov13_022468D8 + ldr ip, [r2] + ldr r2, _0223D4C4 ; =ov13_022468D8 + add r3, ip, #2 + str r3, [r1] + add r3, ip, #4 + str r3, [r1, #4] + add r3, ip, #6 + str r3, [r1, #8] + add r3, ip, #8 + str r3, [r1, #0xc] + add r3, ip, #0xa + str r3, [r1, #0x10] + add r3, ip, #0xc + str r3, [r1, #0x14] + ldr r0, [r2, r0, lsl #2] + ldrh r0, [r0] + bx lr + .balign 4, 0 +_0223D4BC: .word ov13_0224F5BC +_0223D4C0: .word ov13_022468D8 +_0223D4C4: .word ov13_022468D8 + arm_func_end ov13_0223D470 + + arm_func_start ov13_0223D4C8 +ov13_0223D4C8: ; 0x0223D4C8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _0223D58C ; =ov13_0224F5BC + mov r3, #1 + ldr r2, [r1] + mov r3, r3, lsl r4 + ldrh r1, [r2, #2] + mov r4, r3, lsl #0x10 + mov r5, r0 + tst r1, r4, lsr #16 + bne _0223D50C + bl OS_RestoreInterrupts + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0223D50C: + mov r0, r2 + add r1, sp, #0 + mov r2, #0xe + bl MI_CpuCopy8 + mov r0, r5 + bl OS_RestoreInterrupts + ldrh r0, [sp, #4] + tst r0, r4, lsr #16 + addne sp, sp, #0x10 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, pc} + ldrh r0, [sp, #6] + tst r0, r4, lsr #16 + addne sp, sp, #0x10 + movne r0, #3 + ldmneia sp!, {r3, r4, r5, pc} + ldrh r0, [sp, #8] + tst r0, r4, lsr #16 + addne sp, sp, #0x10 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, pc} + ldrh r0, [sp, #0xa] + tst r0, r4, lsr #16 + addne sp, sp, #0x10 + movne r0, #5 + ldmneia sp!, {r3, r4, r5, pc} + ldrh r0, [sp, #0xc] + tst r0, r4, lsr #16 + movne r0, #6 + moveq r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223D58C: .word ov13_0224F5BC + arm_func_end ov13_0223D4C8 + + arm_func_start ov13_0223D590 +ov13_0223D590: ; 0x0223D590 + ldr r1, _0223D5C0 ; =ov13_0224F5BC + mov r2, #1 + ldr r3, [r1] + ldrh r1, [r3, #2] + tst r1, r2, lsl r0 + moveq r0, #0 + bxeq lr + sub r1, r0, #1 + add r2, r3, #0xe + mov r0, #0x1e + mla r0, r1, r0, r2 + bx lr + .balign 4, 0 +_0223D5C0: .word ov13_0224F5BC + arm_func_end ov13_0223D590 + + arm_func_start ov13_0223D5C4 +ov13_0223D5C4: ; 0x0223D5C4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _0223D668 ; =ov13_0224F5BC + mov lr, #1 + ldr r5, [r1] + mov ip, lr + ldrh r4, [r5, #2] + add r1, r5, #0x24 + mov r6, #0x1e +_0223D5E4: + tst r4, ip, lsl lr + beq _0223D64C + sub r2, lr, #1 + mul r3, r2, r6 + ldrb r8, [r0] + ldrb r7, [r1, r3] + add r2, r1, r3 + cmp r8, r7 + ldreqb r8, [r0, #1] + ldreqb r7, [r2, #1] + cmpeq r8, r7 + ldreqb r8, [r0, #2] + ldreqb r7, [r2, #2] + cmpeq r8, r7 + ldreqb r8, [r0, #3] + ldreqb r7, [r2, #3] + cmpeq r8, r7 + ldreqb r8, [r0, #4] + ldreqb r7, [r2, #4] + cmpeq r8, r7 + ldreqb r7, [r0, #5] + ldreqb r2, [r2, #5] + cmpeq r7, r2 + addeq r0, r5, r3 + ldreqh r0, [r0, #0x2a] + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_0223D64C: + add r2, lr, #1 + mov r2, r2, lsl #0x10 + mov lr, r2, lsr #0x10 + cmp lr, #2 + blo _0223D5E4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223D668: .word ov13_0224F5BC + arm_func_end ov13_0223D5C4 + + arm_func_start ov13_0223D66C +ov13_0223D66C: ; 0x0223D66C + ldr r1, _0223D6A4 ; =ov13_0224F5C0 + mov r2, #0 + str r0, [r1, #4] + str r2, [r0, #0x40] + ldr r0, [r1, #4] + add r0, r0, #0x1000 + str r2, [r0, #0x3a8] + ldr r0, [r1, #4] + add r0, r0, #0x1000 + str r2, [r0, #0x3ac] + ldr r0, [r1, #4] + add r0, r0, #0x1000 + str r2, [r0, #0x3b0] + bx lr + .balign 4, 0 +_0223D6A4: .word ov13_0224F5C0 + arm_func_end ov13_0223D66C + + arm_func_start ov13_0223D6A8 +ov13_0223D6A8: ; 0x0223D6A8 + stmdb sp!, {r4, lr} + ldr r1, _0223D714 ; =ov13_0224F5C0 + mov r4, r0 + ldr r3, [r1] + cmp r3, #0 + beq _0223D6DC + ldr r1, [r1, #4] + ldr r0, _0223D718 ; =ov13_02247120 + ldr r2, [r1, #0x40] + ldr r1, _0223D71C ; =ov13_02247200 + ldr r2, [r0, r2, lsl #2] + mov r0, #0x8000000 + blx r3 +_0223D6DC: + ldr r0, _0223D714 ; =ov13_0224F5C0 + ldr r1, [r0, #4] + str r4, [r1, #0x40] + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r0, #4] + ldr r0, _0223D718 ; =ov13_02247120 + ldr r2, [r1, #0x40] + ldr r1, _0223D720 ; =ov13_02247208 + ldr r2, [r0, r2, lsl #2] + mov r0, #0x8000000 + blx r3 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223D714: .word ov13_0224F5C0 +_0223D718: .word ov13_02247120 +_0223D71C: .word ov13_02247200 +_0223D720: .word ov13_02247208 + arm_func_end ov13_0223D6A8 + + arm_func_start ov13_0223D724 +ov13_0223D724: ; 0x0223D724 + ldr r1, _0223D740 ; =ov13_0224F5C0 + ldr r2, [r1, #4] + ldr r1, [r2, #0x40] + sub r1, r1, #9 + cmp r1, #1 + strhi r0, [r2, #0x54] + bx lr + .balign 4, 0 +_0223D740: .word ov13_0224F5C0 + arm_func_end ov13_0223D724 + + arm_func_start ov13_0223D744 +ov13_0223D744: ; 0x0223D744 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r1, _0223D780 ; =ov13_0224F5C0 + ldr r0, _0223D784 ; =ov13_0223D788 + ldr r1, [r1, #4] + bl WM_SetParentParameter + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223D780: .word ov13_0224F5C0 +_0223D784: .word ov13_0223D788 + arm_func_end ov13_0223D744 + + arm_func_start ov13_0223D788 +ov13_0223D788: ; 0x0223D788 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223D7A8 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223D7A8: + ldr r0, _0223D7F0 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + add r0, r0, #0x1000 + ldr r0, [r0, #0x3ac] + cmp r0, #0 + beq _0223D7D8 + bl ov13_0223D7F4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223D7D8: + bl ov13_0223D890 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223D7F0: .word ov13_0224F5C0 + arm_func_end ov13_0223D788 + + arm_func_start ov13_0223D7F4 +ov13_0223D7F4: ; 0x0223D7F4 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223D850 ; =ov13_0224F5C0 + ldr r1, [r0, #4] + add r0, r1, #0x1000 + ldr r2, [r0, #0x3ac] + add r0, r1, #0x13c0 + blx r2 + ldr r2, _0223D850 ; =ov13_0224F5C0 + mov r1, r0 + ldr r2, [r2, #4] + ldr r0, _0223D854 ; =ov13_0223D858 + add r2, r2, #0x13c0 + bl WM_SetWEPKey + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223D850: .word ov13_0224F5C0 +_0223D854: .word ov13_0223D858 + arm_func_end ov13_0223D7F4 + + arm_func_start ov13_0223D858 +ov13_0223D858: ; 0x0223D858 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223D878 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223D878: + bl ov13_0223D890 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223D858 + + arm_func_start ov13_0223D890 +ov13_0223D890: ; 0x0223D890 + stmdb sp!, {r3, lr} + ldr r0, _0223D8EC ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + sub r0, r0, #4 + cmp r0, #2 + movls r0, #1 + ldmlsia sp!, {r3, pc} + ldr r0, _0223D8F0 ; =ov13_0223D8F4 + bl WM_StartParent + cmp r0, #2 + beq _0223D8CC + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} +_0223D8CC: + ldr r1, _0223D8EC ; =ov13_0224F5C0 + mov r3, #0 + ldr r2, [r1, #4] + mov r0, #1 + strh r3, [r2, #0x50] + ldr r1, [r1, #4] + strh r0, [r1, #0x52] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223D8EC: .word ov13_0224F5C0 +_0223D8F0: .word ov13_0223D8F4 + arm_func_end ov13_0223D890 + + arm_func_start ov13_0223D8F4 +ov13_0223D8F4: ; 0x0223D8F4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldrh r2, [r4, #0x10] + ldrh r0, [r4, #2] + mov r1, #1 + mov r1, r1, lsl r2 + cmp r0, #0 + mov r5, r1, lsl #0x10 + beq _0223D928 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, r4, r5, pc} +_0223D928: + ldrh ip, [r4, #8] + cmp ip, #7 + bgt _0223D958 + bge _0223D964 + cmp ip, #2 + bgt _0223DA30 + cmp ip, #0 + blt _0223DA30 + beq _0223DA18 + cmp ip, #2 + ldmeqia sp!, {r3, r4, r5, pc} + b _0223DA30 +_0223D958: + cmp ip, #9 + beq _0223D9E0 + b _0223DA30 +_0223D964: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + ldr r3, [r0] + cmp r3, #0 + beq _0223D980 + ldr r1, _0223DA58 ; =ov13_0224720C + mov r0, #0x8000000 + blx r3 +_0223D980: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r1, [r0, #0x4c] + cmp r1, #0 + beq _0223D9C8 + mov r0, r4 + blx r1 + cmp r0, #0 + bne _0223D9C8 + ldrh r1, [r4, #0x10] + mov r0, #0 + bl WM_Disconnect + cmp r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, r4, r5, pc} +_0223D9C8: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + ldr r1, [r0, #4] + ldrh r0, [r1, #0x52] + orr r0, r0, r5, lsr #16 + strh r0, [r1, #0x52] + ldmia sp!, {r3, r4, r5, pc} +_0223D9E0: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + ldr r3, [r0] + cmp r3, #0 + beq _0223D9FC + ldr r1, _0223DA5C ; =ov13_02247238 + mov r0, #0x8000000 + blx r3 +_0223D9FC: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + mvn r1, r5, lsr #16 + ldr r2, [r0, #4] + ldrh r0, [r2, #0x52] + and r0, r0, r1 + strh r0, [r2, #0x52] + ldmia sp!, {r3, r4, r5, pc} +_0223DA18: + bl ov13_0223DA64 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, r4, r5, pc} +_0223DA30: + ldr r0, _0223DA54 ; =ov13_0224F5C0 + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _0223DA60 ; =ov13_02247264 + mov r2, ip + mov r0, #0x8000000 + blx r3 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223DA54: .word ov13_0224F5C0 +_0223DA58: .word ov13_0224720C +_0223DA5C: .word ov13_02247238 +_0223DA60: .word ov13_02247264 + arm_func_end ov13_0223D8F4 + + arm_func_start ov13_0223DA64 +ov13_0223DA64: ; 0x0223DA64 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _0223DAF4 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + sub r0, r0, #4 + cmp r0, #2 + addls sp, sp, #8 + movls r0, #1 + ldmlsia sp!, {r3, pc} + mov r0, #4 + bl ov13_0223D6A8 + ldr r0, _0223DAF4 ; =ov13_0224F5C0 + mov ip, #1 + ldr lr, [r0, #4] + ldr r0, _0223DAF8 ; =ov13_0223DAFC + add r3, lr, #0x1000 + ldr r1, [r3, #0x2a0] + add r2, lr, #0x60 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + stmia sp, {r1, ip} + ldr r3, [r3, #0x2a4] + add r1, r2, #0x1000 + mov r2, r3, lsl #0x10 + mov r2, r2, lsr #0x10 + add r3, lr, #0xf80 + bl WM_StartMP + cmp r0, #2 + addeq sp, sp, #8 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DAF4: .word ov13_0224F5C0 +_0223DAF8: .word ov13_0223DAFC + arm_func_end ov13_0223DA64 + + arm_func_start ov13_0223DAFC +ov13_0223DAFC: ; 0x0223DAFC + stmdb sp!, {r3, lr} + ldrh r1, [r0, #2] + cmp r1, #0 + beq _0223DB20 + mov r0, r1 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DB20: + ldrh r2, [r0, #4] + sub r0, r2, #0xa + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0223DBFC +_0223DB34: ; jump table + b _0223DB44 ; case 0 + ldmia sp!, {r3, pc} ; case 1 + b _0223DBFC ; case 2 + b _0223DBFC ; case 3 +_0223DB44: + ldr r0, _0223DC1C ; =ov13_0224F5C0 + ldr r1, [r0, #4] + ldr r0, [r1, #0x44] + cmp r0, #2 + bne _0223DBA4 + ldr r0, [r1, #0x40] + cmp r0, #4 + bne _0223DB98 + bl ov13_0223DC28 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223DC1C ; =ov13_0224F5C0 + ldr r2, [r0] + cmp r2, #0 + beq _0223DB8C + ldr r1, _0223DC20 ; =ov13_02247284 + mov r0, #0x8000000 + blx r2 +_0223DB8C: + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DB98: + cmp r0, #6 + bne _0223DBF0 + ldmia sp!, {r3, pc} +_0223DBA4: + cmp r0, #4 + bne _0223DBF0 + add r0, r1, #0x3e0 + mov ip, #1 + add r0, r0, #0x1000 + mov r1, #0xd + mov r2, #7 + mov r3, #0x44 + str ip, [sp] + bl WM_StartDataSharing + cmp r0, #0 + beq _0223DBE4 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DBE4: + mov r0, #5 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DBF0: + mov r0, #4 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DBFC: + ldr r0, _0223DC1C ; =ov13_0224F5C0 + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, pc} + ldr r1, _0223DC24 ; =ov13_02247264 + mov r0, #0x8000000 + blx r3 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DC1C: .word ov13_0224F5C0 +_0223DC20: .word ov13_02247284 +_0223DC24: .word ov13_02247264 + arm_func_end ov13_0223DAFC + + arm_func_start ov13_0223DC28 +ov13_0223DC28: ; 0x0223DC28 + stmdb sp!, {r3, lr} + mov r0, #6 + bl ov13_0223D6A8 + ldr r0, _0223DC60 ; =ov13_0224F5C0 + mov r1, #0xd + ldr r0, [r0, #4] + add r0, r0, #0x1e00 + bl WM_StartKeySharing + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DC60: .word ov13_0224F5C0 + arm_func_end ov13_0223DC28 + + arm_func_start ov13_0223DC64 +ov13_0223DC64: ; 0x0223DC64 + stmdb sp!, {r3, lr} + ldr r0, _0223DC90 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + add r0, r0, #0x1e00 + bl WM_EndKeySharing + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DC90: .word ov13_0224F5C0 + arm_func_end ov13_0223DC64 + + arm_func_start ov13_0223DC94 +ov13_0223DC94: ; 0x0223DC94 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223DCC0 ; =ov13_0223DCC4 + bl WM_EndMP + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DCC0: .word ov13_0223DCC4 + arm_func_end ov13_0223DC94 + + arm_func_start ov13_0223DCC4 +ov13_0223DCC4: ; 0x0223DCC4 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223DCE0 + bl ov13_0223D724 + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223DCE0: + bl ov13_0223DD18 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223DD10 ; =ov13_0224F5C0 + ldr r2, [r0] + cmp r2, #0 + beq _0223DD08 + ldr r1, _0223DD14 ; =ov13_022472B4 + mov r0, #0x8000000 + blx r2 +_0223DD08: + bl ov13_0223E698 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DD10: .word ov13_0224F5C0 +_0223DD14: .word ov13_022472B4 + arm_func_end ov13_0223DCC4 + + arm_func_start ov13_0223DD18 +ov13_0223DD18: ; 0x0223DD18 + stmdb sp!, {r3, lr} + ldr r0, _0223DD3C ; =ov13_0223DD40 + bl WM_EndParent + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DD3C: .word ov13_0223DD40 + arm_func_end ov13_0223DD18 + + arm_func_start ov13_0223DD40 +ov13_0223DD40: ; 0x0223DD40 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223DD58 + bl ov13_0223D724 + ldmia sp!, {r3, pc} +_0223DD58: + mov r0, #1 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223DD40 + + arm_func_start ov13_0223DD64 +ov13_0223DD64: ; 0x0223DD64 + stmdb sp!, {r3, lr} + ldr r0, _0223DDB0 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + cmp r0, #6 + movne r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223DDB0 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + add r0, r0, #0x1e00 + bl WM_EndKeySharing + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DDB0: .word ov13_0224F5C0 + arm_func_end ov13_0223DD64 + + arm_func_start ov13_0223DDB4 +ov13_0223DDB4: ; 0x0223DDB4 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223DDE0 ; =ov13_0223DDE4 + bl WM_EndMP + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DDE0: .word ov13_0223DDE4 + arm_func_end ov13_0223DDB4 + + arm_func_start ov13_0223DDE4 +ov13_0223DDE4: ; 0x0223DDE4 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223DE00 + bl ov13_0223D724 + bl ov13_0223E6B4 + ldmia sp!, {r3, pc} +_0223DE00: + bl ov13_0223DE18 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223DDE4 + + arm_func_start ov13_0223DE18 +ov13_0223DE18: ; 0x0223DE18 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223DE4C ; =ov13_0223DE50 + mov r1, #0 + bl WM_Disconnect + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + bl ov13_0223E698 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DE4C: .word ov13_0223DE50 + arm_func_end ov13_0223DE18 + + arm_func_start ov13_0223DE50 +ov13_0223DE50: ; 0x0223DE50 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223DE68 + bl ov13_0223D724 + ldmia sp!, {r3, pc} +_0223DE68: + mov r0, #1 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223DE50 + + arm_func_start ov13_0223DE74 +ov13_0223DE74: ; 0x0223DE74 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223DEA0 ; =ov13_0223DEA4 + bl WM_Reset + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223DEA0: .word ov13_0223DEA4 + arm_func_end ov13_0223DE74 + + arm_func_start ov13_0223DEA4 +ov13_0223DEA4: ; 0x0223DEA4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0223DECC + mov r0, #9 + bl ov13_0223D6A8 + ldrh r0, [r4, #2] + bl ov13_0223D724 + ldmia sp!, {r4, pc} +_0223DECC: + mov r0, #1 + bl ov13_0223D6A8 + ldmia sp!, {r4, pc} + arm_func_end ov13_0223DEA4 + + arm_func_start ov13_0223DED8 +ov13_0223DED8: ; 0x0223DED8 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223DEF4 + mov r0, #0xa + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223DEF4: + mov r0, #0 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223DED8 + + arm_func_start ov13_0223DF00 +ov13_0223DF00: ; 0x0223DF00 + ldr r1, _0223DF10 ; =ov13_0224F5C0 + ldr r1, [r1, #4] + str r0, [r1, #8] + bx lr + .balign 4, 0 +_0223DF10: .word ov13_0224F5C0 + arm_func_end ov13_0223DF00 + + arm_func_start ov13_0223DF14 +ov13_0223DF14: ; 0x0223DF14 + ldr r0, _0223DF24 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldrh r0, [r0, #0x52] + bx lr + .balign 4, 0 +_0223DF24: .word ov13_0224F5C0 + arm_func_end ov13_0223DF14 + + arm_func_start ov13_0223DF28 +ov13_0223DF28: ; 0x0223DF28 + ldr r0, _0223DF38 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + bx lr + .balign 4, 0 +_0223DF38: .word ov13_0224F5C0 + arm_func_end ov13_0223DF28 + + arm_func_start ov13_0223DF3C +ov13_0223DF3C: ; 0x0223DF3C + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r0, sp, #0 + bl OS_GetMacAddress + ldr r2, _0223E008 ; =0x027FFC3C + ldrh r0, [sp] + ldr r3, [r2] + ldrh r2, [sp, #2] + add r0, r0, r3 + ldr r1, _0223E00C ; =ov13_0224F5C0 + add r2, r2, r0 + ldrh r3, [sp, #4] + ldr r0, [r1, #4] + add r2, r3, r2 + str r2, [r0, #0x58] + ldr ip, [r1, #4] + ldr r0, _0223E010 ; =0x00010DCD + ldr r2, [ip, #0x58] + mov r3, #0 + mul r0, r2, r0 + add r0, r0, #0x39 + add r0, r0, #0x3000 + str r0, [ip, #0x58] + ldr r0, [r1, #4] + mov r2, #0x65 + strh r3, [r0, #0x5c] + ldr r1, [r1, #4] + mov r0, #3 + strh r2, [r1, #0x5e] + bl ov13_0223D6A8 + mov r0, #1 + bl ov13_0223E014 + cmp r0, #0x18 + bne _0223DFE0 + mov r0, #0x18 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, pc} +_0223DFE0: + cmp r0, #2 + addeq sp, sp, #8 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E008: .word 0x027FFC3C +_0223E00C: .word ov13_0224F5C0 +_0223E010: .word 0x00010DCD + arm_func_end ov13_0223DF3C + + arm_func_start ov13_0223E014 +ov13_0223E014: ; 0x0223E014 + stmdb sp!, {r4, lr} + mov r4, r0 + bl WM_GetAllowedChannel + cmp r0, #0x8000 + bne _0223E040 + mov r0, #3 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #3 + ldmia sp!, {r4, pc} +_0223E040: + cmp r0, #0 + bne _0223E060 + mov r0, #0x16 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #0x18 + ldmia sp!, {r4, pc} +_0223E060: + sub r1, r4, #1 + mov r2, #1 + tst r0, r2, lsl r1 + bne _0223E094 +_0223E070: + add r1, r4, #1 + mov r1, r1, lsl #0x10 + mov r4, r1, lsr #0x10 + cmp r4, #0x10 + movhi r0, #0x18 + ldmhiia sp!, {r4, pc} + sub r1, r4, #1 + tst r0, r2, lsl r1 + beq _0223E070 +_0223E094: + ldr r0, _0223E0AC ; =ov13_0223E0B0 + mov r1, r4 + bl ov13_0223E188 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223E0AC: .word ov13_0223E0B0 + arm_func_end ov13_0223E014 + + arm_func_start ov13_0223E0B0 +ov13_0223E0B0: ; 0x0223E0B0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0223E0D4 + bl ov13_0223D724 + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r4, pc} +_0223E0D4: + ldr r0, _0223E180 ; =ov13_0224F5C0 + ldr ip, [r0] + cmp ip, #0 + beq _0223E0F8 + ldrh r2, [r4, #8] + ldrh r3, [r4, #0xa] + ldr r1, _0223E184 ; =ov13_0224730C + mov r0, #0x8000000 + blx ip +_0223E0F8: + ldr r0, _0223E180 ; =ov13_0224F5C0 + ldrh r2, [r4, #0xa] + ldr r3, [r0, #4] + ldrh ip, [r4, #8] + ldrh r1, [r3, #0x5e] + cmp r1, r2 + bls _0223E130 + strh r2, [r3, #0x5e] + sub r1, ip, #1 + mov r2, #1 + mov r1, r2, lsl r1 + ldr r0, [r0, #4] + strh r1, [r0, #0x60] + b _0223E148 +_0223E130: + bne _0223E148 + ldrh r2, [r3, #0x60] + sub r0, ip, #1 + mov r1, #1 + orr r0, r2, r1, lsl r0 + strh r0, [r3, #0x60] +_0223E148: + add r0, ip, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl ov13_0223E014 + cmp r0, #0x18 + bne _0223E16C + mov r0, #7 + bl ov13_0223D6A8 + ldmia sp!, {r4, pc} +_0223E16C: + cmp r0, #2 + ldmeqia sp!, {r4, pc} + mov r0, #9 + bl ov13_0223D6A8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223E180: .word ov13_0224F5C0 +_0223E184: .word ov13_0224730C + arm_func_end ov13_0223E0B0 + + arm_func_start ov13_0223E188 +ov13_0223E188: ; 0x0223E188 + stmdb sp!, {r3, lr} + mov r3, r1 + mov ip, #0x1e + mov r1, #3 + mov r2, #0x11 + str ip, [sp] + bl WM_MeasureChannel + ldmia sp!, {r3, pc} + arm_func_end ov13_0223E188 + + arm_func_start ov13_0223E1A8 +ov13_0223E1A8: ; 0x0223E1A8 + stmdb sp!, {r3, lr} + ldr r0, _0223E218 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + cmp r0, #7 + beq _0223E1C4 + bl OS_Terminate +_0223E1C4: + mov r0, #1 + bl ov13_0223D6A8 + ldr r0, _0223E218 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldrh r0, [r0, #0x60] + bl ov13_0223E220 + ldr r1, _0223E218 ; =ov13_0224F5C0 + ldr r2, [r1, #4] + strh r0, [r2, #0x5c] + ldr r3, [r1] + cmp r3, #0 + beq _0223E208 + ldr r0, [r1, #4] + ldr r1, _0223E21C ; =ov13_02247324 + ldrh r2, [r0, #0x5c] + mov r0, #0x8000000 + blx r3 +_0223E208: + ldr r0, _0223E218 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldrh r0, [r0, #0x5c] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E218: .word ov13_0224F5C0 +_0223E21C: .word ov13_02247324 + arm_func_end ov13_0223E1A8 + + arm_func_start ov13_0223E220 +ov13_0223E220: ; 0x0223E220 + stmdb sp!, {r4, lr} + mov r3, #0 + mov r1, r3 + mov ip, r3 + mov r4, #1 +_0223E234: + tst r0, r4, lsl ip + beq _0223E254 + add r3, ip, #1 + add r2, r1, #1 + mov r1, r3, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r1, asr #0x10 + mov r1, r2, lsr #0x10 +_0223E254: + add r2, ip, #1 + mov r2, r2, lsl #0x10 + mov ip, r2, asr #0x10 + cmp ip, #0x10 + blt _0223E234 + cmp r1, #1 + movls r0, r3 + ldmlsia sp!, {r4, pc} + ldr ip, _0223E300 ; =ov13_0224F5C0 + ldr r3, _0223E304 ; =0x00010DCD + ldr r4, [ip, #4] + mov r2, #0 + ldr lr, [r4, #0x58] + mul r3, lr, r3 + add r3, r3, #0x39 + add r3, r3, #0x3000 + str r3, [r4, #0x58] + ldr r3, [ip, #4] + ldr r3, [r3, #0x58] + and r3, r3, #0xff + mul r3, r1, r3 + mov r1, r3, lsl #8 + mov r3, r1, lsr #0x10 +_0223E2B0: + tst r0, #1 + beq _0223E2DC + cmp r3, #0 + bne _0223E2D0 + add r0, r2, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + ldmia sp!, {r4, pc} +_0223E2D0: + sub r1, r3, #1 + mov r1, r1, lsl #0x10 + mov r3, r1, lsr #0x10 +_0223E2DC: + add r1, r2, #1 + mov r1, r1, lsl #0x10 + mov r0, r0, lsl #0xf + mov r2, r1, asr #0x10 + cmp r2, #0x10 + mov r0, r0, lsr #0x10 + blt _0223E2B0 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223E300: .word ov13_0224F5C0 +_0223E304: .word 0x00010DCD + arm_func_end ov13_0223E220 + + arm_func_start ov13_0223E308 +ov13_0223E308: ; 0x0223E308 + stmdb sp!, {r3, lr} + ldr r2, _0223E37C ; =ov13_0224F5C0 + mov r0, #0 + ldr r1, [r2, #4] + mov r3, #1 + add r1, r1, #0x1000 + str r0, [r1, #0x2a4] + ldr r1, [r2, #4] + add r1, r1, #0x1000 + str r0, [r1, #0x2a0] + ldr r1, [r2, #4] + str r0, [r1, #0x48] + ldr r1, [r2, #4] + strh r0, [r1, #0x50] + ldr r1, [r2, #4] + strh r3, [r1, #0x52] + ldr r1, [r2, #4] + str r0, [r1, #0x54] + ldr r1, [r2, #4] + str r0, [r1] + ldr r1, [r2, #4] + strh r0, [r1, #4] + ldr r1, [r2, #4] + str r0, [r1, #0x4c] + bl ov13_0223E3A0 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E37C: .word ov13_0224F5C0 + arm_func_end ov13_0223E308 + + arm_func_start ov13_0223E380 +ov13_0223E380: ; 0x0223E380 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #8 + ldmneia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + bl OS_Terminate + ldmia sp!, {r3, pc} + arm_func_end ov13_0223E380 + + arm_func_start ov13_0223E3A0 +ov13_0223E3A0: ; 0x0223E3A0 + stmdb sp!, {r3, lr} + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223E3E4 ; =ov13_0224F5C0 + ldr r1, _0223E3E8 ; =ov13_0223E3EC + ldr r0, [r0, #4] + mov r2, #2 + add r0, r0, #0x80 + bl WM_Initialize + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl ov13_0223D724 + mov r0, #0xa + bl ov13_0223D6A8 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E3E4: .word ov13_0224F5C0 +_0223E3E8: .word ov13_0223E3EC + arm_func_end ov13_0223E3A0 + + arm_func_start ov13_0223E3EC +ov13_0223E3EC: ; 0x0223E3EC + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #0 + beq _0223E40C + bl ov13_0223D724 + mov r0, #0xa + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223E40C: + ldr r0, _0223E438 ; =ov13_0223E380 + bl WM_SetIndCallback + cmp r0, #0 + beq _0223E42C + bl ov13_0223D724 + mov r0, #0xa + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} +_0223E42C: + mov r0, #1 + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E438: .word ov13_0223E380 + arm_func_end ov13_0223E3EC + + arm_func_start ov13_0223E43C +ov13_0223E43C: ; 0x0223E43C + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _0223E5A4 ; =ov13_0224F5C0 + mov r6, r0 + ldr r0, [r3, #4] + mov r5, r1 + ldr r0, [r0, #0x40] + mov r4, r2 + cmp r0, #1 + beq _0223E468 + bl OS_Terminate + movs r0, #0 +_0223E468: + ldr r1, _0223E5A4 ; =ov13_0224F5C0 + mov r3, #0x180 + ldr r0, [r1, #4] + mov r2, #0xe0 + add r0, r0, #0x1000 + str r3, [r0, #0x2a4] + ldr r0, [r1, #4] + add r0, r0, #0x1000 + str r2, [r0, #0x2a0] + ldr r3, [r1] + cmp r3, #0 + beq _0223E4B0 + ldr r0, [r1, #4] + ldr r1, _0223E5A8 ; =ov13_022472DC + add r0, r0, #0x1000 + ldr r2, [r0, #0x2a4] + mov r0, #0x8000000 + blx r3 +_0223E4B0: + ldr r0, _0223E5A4 ; =ov13_0224F5C0 + ldr r3, [r0] + cmp r3, #0 + beq _0223E4D8 + ldr r0, [r0, #4] + ldr r1, _0223E5AC ; =ov13_022472F4 + add r0, r0, #0x1000 + ldr r2, [r0, #0x2a0] + mov r0, #0x8000000 + blx r3 +_0223E4D8: + ldr r1, _0223E5A4 ; =ov13_0224F5C0 + mov r0, #3 + ldr r1, [r1, #4] + str r6, [r1, #0x44] + bl ov13_0223D6A8 + ldr r0, _0223E5A4 ; =ov13_0224F5C0 + ldr r1, [r0, #4] + strh r5, [r1, #0xc] + ldr r0, [r0, #4] + strh r4, [r0, #0x32] + bl WM_GetDispersionBeaconPeriod + ldr r1, _0223E5A4 ; =ov13_0224F5C0 + mov r2, #0xd0 + ldr r3, [r1, #4] + mov r4, #0x44 + strh r0, [r3, #0x18] + ldr r0, [r1, #4] + mov r3, #2 + strh r2, [r0, #0x34] + ldr r0, [r1, #4] + mov r2, #0 + strh r4, [r0, #0x36] + ldr r0, [r1, #4] + mov r4, #1 + strh r3, [r0, #0x10] + ldr r0, [r1, #4] + cmp r6, #2 + strh r2, [r0, #0x16] + ldr r0, [r1, #4] + strh r2, [r0, #0x12] + ldr r0, [r1, #4] + strh r4, [r0, #0xe] + ldr r0, _0223E5A4 ; =ov13_0224F5C0 + movne r4, r2 + ldr r1, [r0, #4] + cmp r6, #0 + cmpne r6, #2 + strh r4, [r1, #0x14] + cmpne r6, #4 + bne _0223E580 + bl ov13_0223D744 + ldmia sp!, {r4, r5, r6, pc} +_0223E580: + ldr r3, [r0] + cmp r3, #0 + beq _0223E59C + ldr r1, _0223E5B0 ; =ov13_0224733C + mov r2, r6 + mov r0, #0x8000000 + blx r3 +_0223E59C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223E5A4: .word ov13_0224F5C0 +_0223E5A8: .word ov13_022472DC +_0223E5AC: .word ov13_022472F4 +_0223E5B0: .word ov13_0224733C + arm_func_end ov13_0223E43C + + arm_func_start ov13_0223E5B4 +ov13_0223E5B4: ; 0x0223E5B4 + ldr r1, _0223E5C4 ; =ov13_0224F5C0 + ldr r1, [r1, #4] + str r0, [r1, #0x4c] + bx lr + .balign 4, 0 +_0223E5C4: .word ov13_0224F5C0 + arm_func_end ov13_0223E5B4 + + arm_func_start ov13_0223E5C8 +ov13_0223E5C8: ; 0x0223E5C8 + ldr r1, _0223E5E8 ; =ov13_0224F5C0 + ldr ip, _0223E5EC ; =WM_GetSharedDataAddress + ldr r1, [r1, #4] + mov r2, r0 + add r0, r1, #0x3e0 + add r0, r0, #0x1000 + add r1, r1, #0x1c00 + bx ip + .balign 4, 0 +_0223E5E8: .word ov13_0224F5C0 +_0223E5EC: .word WM_GetSharedDataAddress + arm_func_end ov13_0223E5C8 + + arm_func_start ov13_0223E5F0 +ov13_0223E5F0: ; 0x0223E5F0 + stmdb sp!, {r4, lr} + ldr r2, _0223E68C ; =ov13_0224F5C0 + mov r1, r0 + ldr r2, [r2, #4] + add r0, r2, #0x3e0 + add r0, r0, #0x1000 + add r2, r2, #0x1c00 + bl WM_StepDataSharing + mov r4, r0 + cmp r4, #7 + bne _0223E640 + ldr r0, _0223E68C ; =ov13_0224F5C0 + ldr r2, [r0] + cmp r2, #0 + beq _0223E638 + ldr r1, _0223E690 ; =ov13_02247358 + mov r0, #0x8000000 + blx r2 +_0223E638: + mov r0, #0 + ldmia sp!, {r4, pc} +_0223E640: + cmp r4, #5 + bne _0223E674 + ldr r0, _0223E68C ; =ov13_0224F5C0 + ldr r2, [r0] + cmp r2, #0 + beq _0223E664 + ldr r1, _0223E694 ; =ov13_02247388 + mov r0, #0x8000000 + blx r2 +_0223E664: + mov r0, r4 + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r4, pc} +_0223E674: + cmp r4, #0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + bl ov13_0223D724 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223E68C: .word ov13_0224F5C0 +_0223E690: .word ov13_02247358 +_0223E694: .word ov13_02247388 + arm_func_end ov13_0223E5F0 + + arm_func_start ov13_0223E698 +ov13_0223E698: ; 0x0223E698 + stmdb sp!, {r3, lr} + bl ov13_0223DE74 + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0xa + bl ov13_0223D6A8 + ldmia sp!, {r3, pc} + arm_func_end ov13_0223E698 + + arm_func_start ov13_0223E6B4 +ov13_0223E6B4: ; 0x0223E6B4 + stmdb sp!, {r3, lr} + ldr r0, _0223E7B0 ; =ov13_0224F5C0 + ldr r1, [r0, #4] + ldr r2, [r1, #0x40] + cmp r2, #1 + bne _0223E6E8 + ldr r2, [r0] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r1, _0223E7B4 ; =ov13_022473BC + mov r0, #0x8000000 + blx r2 + ldmia sp!, {r3, pc} +_0223E6E8: + ldr r3, [r0] + cmp r3, #0 + beq _0223E700 + ldr r1, _0223E7B8 ; =ov13_022473E0 + mov r0, #0x8000000 + blx r3 +_0223E700: + ldr r0, _0223E7B0 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + cmp r0, #6 + cmpne r0, #5 + cmpne r0, #4 + mov r0, #3 + beq _0223E72C + bl ov13_0223D6A8 + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223E72C: + bl ov13_0223D6A8 + ldr r0, _0223E7B0 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x44] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_0223E748: ; jump table + b _0223E79C ; case 0 + b _0223E774 ; case 1 + b _0223E788 ; case 2 + b _0223E760 ; case 3 + b _0223E79C ; case 4 + b _0223E774 ; case 5 +_0223E760: + bl ov13_0223DD64 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223E774: + bl ov13_0223DDB4 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223E788: + bl ov13_0223DC64 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223E79C: + bl ov13_0223DC94 + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E698 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E7B0: .word ov13_0224F5C0 +_0223E7B4: .word ov13_022473BC +_0223E7B8: .word ov13_022473E0 + arm_func_end ov13_0223E6B4 + + arm_func_start ov13_0223E7BC +ov13_0223E7BC: ; 0x0223E7BC + stmdb sp!, {r3, lr} + ldr r0, _0223E804 ; =ov13_0224F5C0 + ldr r0, [r0, #4] + ldr r0, [r0, #0x40] + cmp r0, #1 + beq _0223E7D8 + bl OS_Terminate +_0223E7D8: + mov r0, #3 + bl ov13_0223D6A8 + ldr r0, _0223E808 ; =ov13_0223DED8 + bl WM_End + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + mov r0, #9 + bl ov13_0223D6A8 + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E804: .word ov13_0224F5C0 +_0223E808: .word ov13_0223DED8 + arm_func_end ov13_0223E7BC + + arm_func_start ov13_0223E80C +ov13_0223E80C: ; 0x0223E80C + stmdb sp!, {r4, lr} + ldr r2, _0223E8F8 ; =ov13_0224F5C8 + mov r4, r1 + str r0, [r2] + add r0, r0, #0xb00 + bl ov13_0223C9D4 + ldr r1, _0223E8F8 ; =ov13_0224F5C8 + mov r3, #0 + ldr r0, [r1] + mov r2, #1 + add r0, r0, #0x600 + strh r3, [r0, #0x48] + ldr r0, [r1] + add r0, r0, #0x600 + strh r3, [r0, #0x4a] + ldr r0, [r1] + strb r2, [r0, #0xa90] + ldr r0, [r1] + strb r2, [r0, #0xa91] + ldr r0, [r1] + str r3, [r0, #0xa9c] + bl ov13_0223F3BC + ldr r0, _0223E8F8 ; =ov13_0224F5C8 + ldr r3, [r4] + ldr r2, [r0] + mov r1, #2 + str r3, [r2, #0xab4] + ldr r3, [r4, #4] + ldr r2, [r0] + str r3, [r2, #0xab8] + ldr r3, [r4, #8] + ldr r2, [r0] + str r3, [r2, #0xabc] + ldr r3, [r4, #0xc] + ldr r2, [r0] + str r3, [r2, #0xac0] + ldr r3, [r4, #0x10] + ldr r2, [r0] + str r3, [r2, #0xac4] + ldr r3, [r4, #0x14] + ldr r2, [r0] + str r3, [r2, #0xac8] + ldrb r3, [r4, #0x18] + ldr r2, [r0] + strb r3, [r2, #0xa92] + ldr r0, [r0] + strb r1, [r0, #0xacc] + bl OS_GetTick + ldr r0, _0223E8F8 ; =ov13_0224F5C8 + ldr r0, [r0] + add r0, r0, #0x24c + add r0, r0, #0x400 + bl DWCi_BACKUPlRead + bl OS_GetTick + bl ov13_0223A7F4 + ldr r1, _0223E8F8 ; =ov13_0224F5C8 + ldr r1, [r1] + str r0, [r1, #0xaa4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223E8F8: .word ov13_0224F5C8 + arm_func_end ov13_0223E80C + + arm_func_start ov13_0223E8FC +ov13_0223E8FC: ; 0x0223E8FC + stmdb sp!, {r3, lr} + ldr r0, _0223E9D4 ; =ov13_0224F5C8 + ldr r2, [r0] + ldrb r1, [r2, #0xa90] + cmp r1, #1 + cmpne r1, #0x14 + cmpne r1, #0x17 + cmpne r1, #0x1a + cmpne r1, #0x1d + bne _0223E944 + mov r1, #0x22 + strb r1, [r2, #0xa90] + ldr r0, _0223E9D4 ; =ov13_0224F5C8 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0xaac] + mov r0, #1 + ldmia sp!, {r3, pc} +_0223E944: + cmp r1, #4 + cmpne r1, #5 + cmpne r1, #6 + cmpne r1, #0xd + bne _0223E998 + cmp r1, #4 + bne _0223E970 + ldr r0, [r2, #0xa98] + cmp r0, #6 + movlo r0, #0 + ldmloia sp!, {r3, pc} +_0223E970: + bl MB_End + ldr r0, _0223E9D4 ; =ov13_0224F5C8 + mov r3, #0x10 + ldr r1, [r0] + mov r2, #2 + strb r3, [r1, #0xa90] + ldr r1, [r0] + mov r0, #1 + strb r2, [r1, #0xaac] + ldmia sp!, {r3, pc} +_0223E998: + add r0, r1, #0xf7 + and r0, r0, #0xff + cmp r0, #1 + bhi _0223E9B8 + mov r0, #0x20 + strb r0, [r2, #0xa90] + mov r0, #1 + ldmia sp!, {r3, pc} +_0223E9B8: + cmp r1, #0xc + movne r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #0x22 + strb r0, [r2, #0xa90] + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223E9D4: .word ov13_0224F5C8 + arm_func_end ov13_0223E8FC + + arm_func_start ov13_0223E9D8 +ov13_0223E9D8: ; 0x0223E9D8 + stmdb sp!, {r3, lr} + ldr r0, _0223EA54 ; =ov13_0224F5C8 + ldr r0, [r0] + ldr r0, [r0, #0xac8] + bl ov13_0223DF00 + ldr r0, _0223EA54 ; =ov13_0224F5C8 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0xa90] + bl WM_GetNextTgid + ldr r3, _0223EA54 ; =ov13_0224F5C8 + mov r2, #0x40 + ldr r1, [r3] + add r1, r1, #0x600 + strh r0, [r1, #0x48] + ldr r1, [r3] + ldr r0, [r1, #0xaa4] + add r1, r1, #0xa50 + bl MI_CpuCopy8 + ldr r0, _0223EA54 ; =ov13_0224F5C8 + mov r2, #0 + ldr r1, [r0] + strb r2, [r1, #0xa93] + ldr r1, [r0] + str r2, [r1, #0x204] + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r1, [r0, #0x48] + add r1, r1, #1 + strh r1, [r0, #0x48] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223EA54: .word ov13_0224F5C8 + arm_func_end ov13_0223E9D8 + + arm_func_start ov13_0223EA58 +ov13_0223EA58: ; 0x0223EA58 + stmdb sp!, {r3, lr} + ldr r0, _0223EA9C ; =ov13_0224F5C8 + ldr r0, [r0] + ldrb r0, [r0, #0xa90] + cmp r0, #1 + cmpne r0, #0x1a + cmpne r0, #0x1d + movne r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E9D8 + bl ov13_0223E308 + ldr r0, _0223EA9C ; =ov13_0224F5C8 + mov r2, #2 + ldr r1, [r0] + mov r0, #1 + strb r2, [r1, #0xa90] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223EA9C: .word ov13_0224F5C8 + arm_func_end ov13_0223EA58 + + arm_func_start ov13_0223EAA0 +ov13_0223EAA0: ; 0x0223EAA0 + stmdb sp!, {r3, lr} + ldr r0, _0223EAD0 ; =ov13_0224F5C8 + ldr r1, [r0] + ldrb r0, [r1, #0xa90] + cmp r0, #5 + movne r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #6 + strb r0, [r1, #0xa90] + bl ov13_0223CEA0 + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223EAD0: .word ov13_0224F5C8 + arm_func_end ov13_0223EAA0 + + arm_func_start ov13_0223EAD4 +ov13_0223EAD4: ; 0x0223EAD4 + stmdb sp!, {r3, lr} + ldr r1, _0223EE50 ; =ov13_0224F5C8 + ldr r0, [r1] + ldrb r2, [r0, #0xa90] + cmp r2, #0x22 + addls pc, pc, r2, lsl #2 + ldmia sp!, {r3, pc} +_0223EAF0: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _0223EB7C ; case 1 + b _0223EBB8 ; case 2 + b _0223EBC0 ; case 3 + b _0223EBD8 ; case 4 + b _0223EBEC ; case 5 + b _0223EBEC ; case 6 + b _0223EBF4 ; case 7 + b _0223EBFC ; case 8 + b _0223EBFC ; case 9 + b _0223EBFC ; case 10 + b _0223EC04 ; case 11 + ldmia sp!, {r3, pc} ; case 12 + ldmia sp!, {r3, pc} ; case 13 + ldmia sp!, {r3, pc} ; case 14 + ldmia sp!, {r3, pc} ; case 15 + b _0223EC0C ; case 16 + b _0223EC24 ; case 17 + b _0223EC40 ; case 18 + b _0223EC64 ; case 19 + ldmia sp!, {r3, pc} ; case 20 + b _0223EC9C ; case 21 + b _0223ECC0 ; case 22 + ldmia sp!, {r3, pc} ; case 23 + b _0223ECF8 ; case 24 + b _0223ED1C ; case 25 + ldmia sp!, {r3, pc} ; case 26 + b _0223ED54 ; case 27 + b _0223ED78 ; case 28 + ldmia sp!, {r3, pc} ; case 29 + b _0223EE48 ; case 30 + ldmia sp!, {r3, pc} ; case 31 + b _0223EDEC ; case 32 + b _0223EE10 ; case 33 + ldmia sp!, {r3, pc} ; case 34 +_0223EB7C: + ldrb r2, [r0, #0xaac] + cmp r2, #1 + bne _0223EB98 + mov r1, #0 + strb r1, [r0, #0xaac] + bl ov13_0223EA58 + ldmia sp!, {r3, pc} +_0223EB98: + cmp r2, #2 + ldmneia sp!, {r3, pc} + mov r2, #0 + strb r2, [r0, #0xaac] + ldr r0, [r1] + mov r1, #0x22 + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EBB8: + bl ov13_0223EEAC + ldmia sp!, {r3, pc} +_0223EBC0: + bl ov13_0223EF54 + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #4 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EBD8: + ldr r1, [r0, #0xa98] + add r1, r1, #1 + str r1, [r0, #0xa98] + bl ov13_0223EF78 + ldmia sp!, {r3, pc} +_0223EBEC: + bl ov13_0223EF78 + ldmia sp!, {r3, pc} +_0223EBF4: + bl ov13_0223F130 + ldmia sp!, {r3, pc} +_0223EBFC: + bl ov13_0223F15C + ldmia sp!, {r3, pc} +_0223EC04: + bl ov13_0223F338 + ldmia sp!, {r3, pc} +_0223EC0C: + mov r2, #0 + str r2, [r0, #0xa9c] + ldr r0, [r1] + mov r1, #0x11 + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EC24: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223F350 + ldmia sp!, {r3, pc} +_0223EC40: + bl MB_End + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #0x16 + str r3, [r2, #0xa9c] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EC64: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223DF28 + cmp r0, #1 + ldmneia sp!, {r3, pc} + bl ov13_0223E7BC + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #0x14 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EC9C: + bl ov13_0223E6B4 + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #0x16 + str r3, [r2, #0xa9c] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223ECC0: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223DF28 + cmp r0, #1 + ldmneia sp!, {r3, pc} + bl ov13_0223E7BC + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #0x17 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223ECF8: + bl ov13_0223E6B4 + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #0x19 + str r3, [r2, #0xa9c] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223ED1C: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223DF28 + cmp r0, #1 + ldmneia sp!, {r3, pc} + bl ov13_0223E7BC + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #0x1a + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223ED54: + bl ov13_0223E6B4 + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #0x1c + str r3, [r2, #0xa9c] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223ED78: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223DF28 + cmp r0, #1 + bne _0223EDB0 + bl ov13_0223E7BC + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #0x1d + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EDB0: + ldr r1, _0223EE50 ; =ov13_0224F5C8 + ldr r0, _0223EE54 ; =0x88888889 + ldr r1, [r1] + mov r2, #0x1e + ldr r3, [r1, #0xa9c] + umull r0, r1, r3, r0 + mov r1, r1, lsr #4 + umull r0, r1, r2, r1 + sub r1, r3, r0 + cmp r1, #1 + ldmneia sp!, {r3, pc} + cmp r3, #0x37 + ldmlsia sp!, {r3, pc} + bl ov13_0223E6B4 + ldmia sp!, {r3, pc} +_0223EDEC: + bl ov13_0223E6B4 + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #0x21 + str r3, [r2, #0xa9c] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EE10: + ldr r2, [r0, #0xa9c] + add r1, r2, #1 + str r1, [r0, #0xa9c] + cmp r2, #0x1e + ldmlsia sp!, {r3, pc} + bl ov13_0223DF28 + cmp r0, #1 + ldmneia sp!, {r3, pc} + bl ov13_0223E7BC + ldr r0, _0223EE50 ; =ov13_0224F5C8 + mov r1, #0x22 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EE48: + bl ov13_0223E6B4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223EE50: .word ov13_0224F5C8 +_0223EE54: .word 0x88888889 + arm_func_end ov13_0223EAD4 + + arm_func_start ov13_0223EE58 +ov13_0223EE58: ; 0x0223EE58 + ldr r2, _0223EE98 ; =ov13_0224F5C8 + ldr r3, [r2] + ldrb r3, [r3, #0xa90] + strb r3, [r0] + ldr r0, [r2] + ldrb r2, [r0, #0xa90] + ldrb r0, [r0, #0xa91] + cmp r2, r0 + movne r0, #1 + moveq r0, #0 + strb r0, [r1] + ldr r0, _0223EE98 ; =ov13_0224F5C8 + ldr r1, [r0] + ldrb r0, [r1, #0xa90] + strb r0, [r1, #0xa91] + bx lr + .balign 4, 0 +_0223EE98: .word ov13_0224F5C8 + arm_func_end ov13_0223EE58 + + arm_func_start ov13_0223EE9C +ov13_0223EE9C: ; 0x0223EE9C + ldr ip, _0223EEA8 ; =MB_CommGetChildUser + mov r0, #1 + bx ip + .balign 4, 0 +_0223EEA8: .word MB_CommGetChildUser + arm_func_end ov13_0223EE9C + + arm_func_start ov13_0223EEAC +ov13_0223EEAC: ; 0x0223EEAC + stmdb sp!, {r3, lr} + bl ov13_0223DF28 + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _0223EF48 +_0223EEC0: ; jump table + b _0223EF20 ; case 0 + b _0223EEE8 ; case 1 + b _0223EF48 ; case 2 + ldmia sp!, {r3, pc} ; case 3 + b _0223EF48 ; case 4 + b _0223EF48 ; case 5 + b _0223EF48 ; case 6 + b _0223EEF0 ; case 7 + b _0223EF48 ; case 8 + b _0223EF40 ; case 9 +_0223EEE8: + bl ov13_0223DF3C + ldmia sp!, {r3, pc} +_0223EEF0: + bl ov13_0223E1A8 + ldr r2, _0223EF50 ; =ov13_0224F5C8 + mov ip, #0 + ldr r1, [r2] + mov r3, #3 + add r1, r1, #0x600 + strh r0, [r1, #0x4a] + ldr r0, [r2] + str ip, [r0, #0xa98] + ldr r0, [r2] + strb r3, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EF20: + ldr r0, _0223EF50 ; =ov13_0224F5C8 + mov r3, #0 + ldr r2, [r0] + mov r1, #3 + str r3, [r2, #0xa98] + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EF40: + bl ov13_0223E698 + ldmia sp!, {r3, pc} +_0223EF48: + bl OS_Terminate + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223EF50: .word ov13_0224F5C8 + arm_func_end ov13_0223EEAC + + arm_func_start ov13_0223EF54 +ov13_0223EF54: ; 0x0223EF54 + ldr r0, _0223EF70 ; =ov13_0224F5C8 + ldr ip, _0223EF74 ; =ov13_0223CA14 + ldr r2, [r0] + add r0, r2, #0x600 + ldrh r1, [r0, #0x48] + ldr r0, [r2, #0xac8] + bx ip + .balign 4, 0 +_0223EF70: .word ov13_0224F5C8 +_0223EF74: .word ov13_0223CA14 + arm_func_end ov13_0223EF54 + + arm_func_start ov13_0223EF78 +ov13_0223EF78: ; 0x0223EF78 + stmdb sp!, {r3, lr} + bl ov13_0223D45C + cmp r0, #7 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_0223EF8C: ; jump table + b _0223F0DC ; case 0 + b _0223EFAC ; case 1 + b _0223EFCC ; case 2 + b _0223F05C ; case 3 + ldmia sp!, {r3, pc} ; case 4 + b _0223F0B0 ; case 5 + ldmia sp!, {r3, pc} ; case 6 + b _0223F0C4 ; case 7 +_0223EFAC: + ldr r0, _0223F12C ; =ov13_0224F5C8 + ldr r2, [r0] + add r0, r2, #0x600 + ldrh r1, [r0, #0x4a] + add r0, r2, #0x2b4 + add r0, r0, #0x800 + bl ov13_0223CB34 + ldmia sp!, {r3, pc} +_0223EFCC: + mov r0, #2 + bl ov13_0223D470 + cmp r0, #0 + beq _0223EFF0 + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #5 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223EFF0: + mov r0, #3 + bl ov13_0223D470 + cmp r0, #0 + bne _0223F010 + mov r0, #4 + bl ov13_0223D470 + cmp r0, #0 + beq _0223F024 +_0223F010: + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #6 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F024: + ldr r0, _0223F12C ; =ov13_0224F5C8 + ldr r0, [r0] + ldrb r0, [r0, #0xa90] + cmp r0, #5 + ldmneia sp!, {r3, pc} + mov r0, #2 + bl ov13_0223D470 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #0xd + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F05C: + bl ov13_0223CF80 + cmp r0, #0 + beq _0223F070 + bl ov13_0223CFE8 + ldmia sp!, {r3, pc} +_0223F070: + ldr r0, _0223F12C ; =ov13_0224F5C8 + ldr r0, [r0] + ldrb r0, [r0, #0xa90] + add r0, r0, #0xfa + and r0, r0, #0xff + cmp r0, #1 + ldmhiia sp!, {r3, pc} + mov r0, #3 + bl ov13_0223D470 + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #0x12 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F0B0: + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #7 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F0C4: + bl ov13_0223D0E0 + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F0DC: + bl ov13_0223DF28 + cmp r0, #0 + beq _0223F104 + cmp r0, #1 + beq _0223F0FC + cmp r0, #3 + ldmeqia sp!, {r3, pc} + b _0223F118 +_0223F0FC: + bl ov13_0223E7BC + ldmia sp!, {r3, pc} +_0223F104: + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #0x1f + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F118: + ldr r0, _0223F12C ; =ov13_0224F5C8 + mov r1, #0x1f + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F12C: .word ov13_0224F5C8 + arm_func_end ov13_0223EF78 + + arm_func_start ov13_0223F130 +ov13_0223F130: ; 0x0223F130 + stmdb sp!, {r3, lr} + bl ov13_0223F3BC + ldr r0, _0223F154 ; =ov13_0223F380 + bl ov13_0223E5B4 + ldr r0, _0223F158 ; =ov13_0224F5C8 + mov r1, #8 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F154: .word ov13_0223F380 +_0223F158: .word ov13_0224F5C8 + arm_func_end ov13_0223F130 + + arm_func_start ov13_0223F15C +ov13_0223F15C: ; 0x0223F15C + stmdb sp!, {r3, lr} + bl ov13_0223DF28 + cmp r0, #6 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_0223F170: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _0223F18C ; case 1 + ldmia sp!, {r3, pc} ; case 2 + ldmia sp!, {r3, pc} ; case 3 + b _0223F1B8 ; case 4 + b _0223F1B8 ; case 5 + b _0223F1B8 ; case 6 +_0223F18C: + ldr r1, _0223F334 ; =ov13_0224F5C8 + mov r0, #4 + ldr r1, [r1] + add r1, r1, #0x600 + ldrh r3, [r1, #0x48] + ldrh r2, [r1, #0x4a] + add r1, r3, #1 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bl ov13_0223E43C + ldmia sp!, {r3, pc} +_0223F1B8: + ldr r1, _0223F334 ; =ov13_0224F5C8 + mov r0, #0 + ldr r2, [r1] + add r1, r2, #0x200 + ldrh r1, [r1] + ldr ip, [r2, #0xaa4] + mov r3, r1, lsr #0x1f + rsb r2, r3, r1, lsl #28 + add r2, r3, r2, ror #28 + add r2, ip, r2, lsl #6 + bl ov13_0223F400 + bl ov13_0223F568 + ldr r0, _0223F334 ; =ov13_0224F5C8 + ldr r1, [r0] + ldrb r0, [r1, #0xa90] + cmp r0, #0x1b + ldmeqia sp!, {r3, pc} + ldr r0, [r1, #0x204] + cmp r0, #0x1e0 + movhi r0, #0x1b + strhib r0, [r1, #0xa90] + ldmhiia sp!, {r3, pc} + bl ov13_0223F64C + cmp r0, #0x10 + beq _0223F228 + bl ov13_0223F64C + cmp r0, #0x20 + bne _0223F240 +_0223F228: + bl ov13_0223F64C + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0xa + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F240: + bl ov13_0223F64C + cmp r0, #0x40 + bne _0223F260 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0xb + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F260: + bl ov13_0223F64C + cmp r0, #0xff + bne _0223F280 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0x1b + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F280: + bl ov13_0223F64C + cmp r0, #0x50 + bne _0223F2A0 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0x15 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F2A0: + bl ov13_0223F64C + cmp r0, #0x60 + bne _0223F2C0 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0x18 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F2C0: + bl ov13_0223F64C + cmp r0, #0x70 + bne _0223F2E0 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0x1b + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F2E0: + bl ov13_0223F64C + cmp r0, #0 + bne _0223F300 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #8 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F300: + bl ov13_0223F64C + cmp r0, #0xbd + bne _0223F320 + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #9 + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} +_0223F320: + ldr r0, _0223F334 ; =ov13_0224F5C8 + mov r1, #0x1f + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F334: .word ov13_0224F5C8 + arm_func_end ov13_0223F15C + + arm_func_start ov13_0223F338 +ov13_0223F338: ; 0x0223F338 + ldr r0, _0223F34C ; =ov13_0224F5C8 + mov r1, #0xc + ldr r0, [r0] + strb r1, [r0, #0xa90] + bx lr + .balign 4, 0 +_0223F34C: .word ov13_0224F5C8 + arm_func_end ov13_0223F338 + + arm_func_start ov13_0223F350 +ov13_0223F350: ; 0x0223F350 + stmdb sp!, {r3, lr} + bl ov13_0223DF28 + cmp r0, #1 + movne r0, #0 + ldmneia sp!, {r3, pc} + bl ov13_0223E7BC + ldr r1, _0223F37C ; =ov13_0224F5C8 + mov r0, #1 + ldr r1, [r1] + strb r0, [r1, #0xa90] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F37C: .word ov13_0224F5C8 + arm_func_end ov13_0223F350 + + arm_func_start ov13_0223F380 +ov13_0223F380: ; 0x0223F380 + stmdb sp!, {r4, lr} + add r0, r0, #0xa + bl ov13_0223D5C4 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl ov13_0223D590 + ldr r1, _0223F3B8 ; =ov13_0224F5C8 + sub r2, r4, #1 + ldr r1, [r1] + add r1, r1, r2, lsl #2 + str r0, [r1, #0xaa0] + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223F3B8: .word ov13_0224F5C8 + arm_func_end ov13_0223F380 + + arm_func_start ov13_0223F3BC +ov13_0223F3BC: ; 0x0223F3BC + stmdb sp!, {r3, lr} + ldr r0, _0223F3FC ; =ov13_0224F5C8 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x100 + add r0, r0, #0x100 + bl MI_CpuFill8 + ldr r0, _0223F3FC ; =ov13_0224F5C8 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x100 + bl MI_CpuFill8 + ldr r0, _0223F3FC ; =ov13_0224F5C8 + ldr r0, [r0] + str r0, [r0, #0xab0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F3FC: .word ov13_0224F5C8 + arm_func_end ov13_0223F3BC + + arm_func_start ov13_0223F400 +ov13_0223F400: ; 0x0223F400 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r3, _0223F564 ; =ov13_0224F5C8 + ldr r5, [r3] + ldrb r4, [r5, #0xa93] + cmp r4, #1 + bne _0223F448 + ldr r4, [r5, #0xab0] + strh r0, [r4] + ldr r4, [r3] + mov r0, r2 + ldr r4, [r4, #0xab0] + mov r2, #0x40 + strh r1, [r4, #2] + ldr r1, [r3] + ldr r1, [r1, #0xab0] + add r1, r1, #4 + bl MI_CpuCopy8 + b _0223F474 +_0223F448: + ldr r0, [r5, #0x204] + mov r1, #0xbc + add r0, r0, #1 + str r0, [r5, #0x204] + ldr r0, [r3] + ldr r0, [r0, #0xab0] + strh r1, [r0] + ldr r0, [r3] + ldrb r1, [r0, #0xa92] + ldr r0, [r0, #0xab0] + strb r1, [r0, #4] +_0223F474: + bl ov13_0223DF28 + cmp r0, #5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, _0223F564 ; =ov13_0224F5C8 + ldr r0, [r0] + bl ov13_0223E5F0 + cmp r0, #0 + bne _0223F4AC + ldr r0, _0223F564 ; =ov13_0224F5C8 + ldr r1, [r0] + ldr r0, [r1, #0x204] + add r0, r0, #4 + str r0, [r1, #0x204] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223F4AC: + ldr r0, _0223F564 ; =ov13_0224F5C8 + ldr r1, [r0] + ldrb r0, [r1, #0xa93] + cmp r0, #0 + bne _0223F4D0 + ldr r0, [r1, #0x204] + add r0, r0, #1 + str r0, [r1, #0x204] + b _0223F4F8 +_0223F4D0: + mov r0, #0 + str r0, [r1, #0x204] + bl ov13_0223DF14 + cmp r0, #3 + beq _0223F4F8 + ldr r0, _0223F564 ; =ov13_0224F5C8 + mov r1, #0x1b + ldr r0, [r0] + strb r1, [r0, #0xa90] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223F4F8: + mov r7, #0 + mov r6, #0x44 + ldr sb, _0223F564 ; =ov13_0224F5C8 + mov r4, r7 + mov r5, #1 + mov r8, r6 +_0223F510: + mov r0, r7 + bl ov13_0223E5C8 + cmp r0, #0 + ldreq r0, [sb] + addeq r0, r0, r7, lsl #2 + streq r4, [r0, #0x208] + beq _0223F54C + ldr r1, [sb] + mov r2, r6 + add r1, r1, #0x100 + mla r1, r7, r8, r1 + bl MI_CpuCopy8 + ldr r0, [sb] + add r0, r0, r7, lsl #2 + str r5, [r0, #0x208] +_0223F54C: + add r0, r7, #1 + mov r0, r0, lsl #0x10 + mov r7, r0, lsr #0x10 + cmp r7, #2 + blo _0223F510 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223F564: .word ov13_0224F5C8 + arm_func_end ov13_0223F400 + + arm_func_start ov13_0223F568 +ov13_0223F568: ; 0x0223F568 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov ip, #0 + ldr r4, _0223F648 ; =ov13_0224F5C8 + mov r0, #1 + mov r5, ip + mov r1, #0xbc + mov r2, ip + mov lr, #0x44 +_0223F588: + ldr r3, [r4] + add r6, r3, ip, lsl #2 + ldr r6, [r6, #0x208] + cmp r6, #0 + beq _0223F638 + mul r7, ip, lr + cmp ip, #1 + add r8, r3, #0x100 + bne _0223F638 + ldrb r6, [r3, #0xa93] + cmp r6, #1 + bne _0223F608 + ldrh r6, [r8, r7] + cmp r6, #0x10 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r6, [r3, #0xa94] + add r6, r6, #1 + str r6, [r3, #0xa94] + ldr r6, [r4] + ldr r3, [r6, #0xa94] + tst r3, #1 + bne _0223F638 + add r3, r6, #0x200 + ldrh r6, [r3] + add r6, r6, #1 + strh r6, [r3] + ldr r3, [r4] + add r3, r3, #0x200 + ldrh r6, [r3] + cmp r6, #0x24 + strhsh r2, [r3] + b _0223F638 +_0223F608: + add r3, r3, #0x200 + strh r1, [r3, #2] + ldrh r3, [r8, r7] + cmp r3, #0xbd + bne _0223F638 + ldr r3, [r4] + strb r0, [r3, #0xa93] + ldr r3, [r4] + add r3, r3, #0x200 + strh r5, [r3] + ldr r3, [r4] + str r5, [r3, #0xa94] +_0223F638: + add ip, ip, #1 + cmp ip, #0x10 + blt _0223F588 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223F648: .word ov13_0224F5C8 + arm_func_end ov13_0223F568 + + arm_func_start ov13_0223F64C +ov13_0223F64C: ; 0x0223F64C + ldr r0, _0223F660 ; =ov13_0224F5C8 + ldr r0, [r0] + add r0, r0, #0x100 + ldrh r0, [r0, #0x44] + bx lr + .balign 4, 0 +_0223F660: .word ov13_0224F5C8 + arm_func_end ov13_0223F64C + + arm_func_start ov13_0223F664 +ov13_0223F664: ; 0x0223F664 + stmdb sp!, {r4, lr} + sub sp, sp, #0xe8 + mov r0, #0xe8 + mov r1, #4 + bl ov13_0224128C + ldr r1, _0223F7F4 ; =ov13_0224F5CC + str r0, [r1] + add r0, sp, #0xa0 + bl FS_InitFile + ldr r1, _0223F7F8 ; =ov13_02247404 + add r0, sp, #0xa0 + bl FS_OpenFile + cmp r0, #0 + bne _0223F6A0 + bl OS_Terminate +_0223F6A0: + bl OS_GetLockID + ldr r2, _0223F7F4 ; =ov13_0224F5CC + add r1, sp, #0x18 + ldr r3, [r2] + mov r2, #8 + strh r0, [r3, #0xe4] + add r0, sp, #0xa0 + ldr r4, [sp, #0xc4] + bl FS_ReadFile + add r0, sp, #0xa0 + add r1, sp, #0x10 + mov r2, #8 + bl FS_ReadFile + add r0, sp, #0xa0 + bl FS_CloseFile + ldr r0, _0223F7F4 ; =ov13_0224F5CC + ldr r0, [r0] + add r0, r0, #0x88 + bl FS_InitArchive + ldr r0, _0223F7F4 ; =ov13_0224F5CC + ldr r1, _0223F7FC ; =ov13_0224593C + ldr r0, [r0] + mov r2, #3 + add r0, r0, #0x88 + bl FS_RegisterArchiveName + cmp r0, #0 + bne _0223F710 + bl OS_Terminate +_0223F710: + ldr r0, _0223F7F4 ; =ov13_0224F5CC + ldr r1, _0223F800 ; =ov13_0223F8A0 + ldr r0, [r0] + ldr r2, _0223F804 ; =0x00000602 + add r0, r0, #0x88 + bl FS_SetArchiveProc + ldr r0, [sp, #0x18] + ldr r1, _0223F808 ; =ov13_0223F904 + str r0, [sp] + ldr r2, [sp, #0x1c] + ldr r0, _0223F80C ; =ov13_0223F954 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r0, _0223F7F4 ; =ov13_0224F5CC + ldr r2, [sp, #0x10] + ldr r0, [r0] + ldr r3, [sp, #0x14] + mov r1, r4 + add r0, r0, #0x88 + bl FS_LoadArchive + cmp r0, #0 + bne _0223F770 + bl OS_Terminate +_0223F770: + ldr r0, _0223F7F4 ; =ov13_0224F5CC + mov r1, #0 + ldr r0, [r0] + mov r2, r1 + add r0, r0, #0x88 + bl FS_LoadArchiveTables + mov r1, #4 + mov r4, r0 + bl ov13_0224128C + ldr r1, _0223F7F4 ; =ov13_0224F5CC + mov r2, r4 + ldr r3, [r1] + str r0, [r3] + ldr r0, [r1] + ldr r1, [r0], #0x88 + bl FS_LoadArchiveTables + ldr r1, _0223F7F4 ; =ov13_0224F5CC + mov r0, #0x20 + ldr r1, [r1] + mov r2, #4 + add r1, r1, #4 + bl ov13_0224022C + ldr r2, _0223F7F4 ; =ov13_0224F5CC + ldr r1, _0223F810 ; =ov13_0224741C + ldr r3, [r2] + ldr r2, _0223F7FC ; =ov13_0224593C + str r0, [r3, #0x84] + add r0, sp, #0x20 + bl OS_SPrintf + add r0, sp, #0x20 + bl FS_ChangeDir + add sp, sp, #0xe8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223F7F4: .word ov13_0224F5CC +_0223F7F8: .word ov13_02247404 +_0223F7FC: .word ov13_0224593C +_0223F800: .word ov13_0223F8A0 +_0223F804: .word 0x00000602 +_0223F808: .word ov13_0223F904 +_0223F80C: .word ov13_0223F954 +_0223F810: .word ov13_0224741C + arm_func_end ov13_0223F664 + + arm_func_start ov13_0223F814 +ov13_0223F814: ; 0x0223F814 + stmdb sp!, {r3, lr} + ldr r0, _0223F894 ; =ov13_02247424 + bl FS_ChangeDir + ldr r0, _0223F898 ; =ov13_0224F5CC + ldr r0, [r0] + add r0, r0, #0x88 + bl FS_UnloadArchiveTables + ldr r0, _0223F898 ; =ov13_0224F5CC + ldr r0, [r0] + add r0, r0, #0x88 + bl FS_UnloadArchive + ldr r0, _0223F898 ; =ov13_0224F5CC + ldr r0, [r0] + add r0, r0, #0x88 + bl FS_ReleaseArchiveName + ldr r0, _0223F898 ; =ov13_0224F5CC + ldr r0, [r0] + ldrh r0, [r0, #0xe4] + bl OS_ReleaseLockID + ldr r0, _0223F898 ; =ov13_0224F5CC + mov r2, #0 + ldr r1, [r0] + strh r2, [r1, #0xe4] + ldr r0, [r0] + bl ov13_022412B0 + ldr r1, _0223F898 ; =ov13_0224F5CC + ldr r0, _0223F89C ; =ov13_0224F5CC + ldr r1, [r1] + mov r2, #0 + str r2, [r1] + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F894: .word ov13_02247424 +_0223F898: .word ov13_0224F5CC +_0223F89C: .word ov13_0224F5CC + arm_func_end ov13_0223F814 + + arm_func_start ov13_0223F8A0 +ov13_0223F8A0: ; 0x0223F8A0 + stmdb sp!, {r3, lr} + cmp r1, #1 + beq _0223F8F0 + cmp r1, #9 + beq _0223F8C0 + cmp r1, #0xa + beq _0223F8D8 + b _0223F8F8 +_0223F8C0: + ldr r0, _0223F900 ; =ov13_0224F5CC + ldr r0, [r0] + ldrh r0, [r0, #0xe4] + bl CARD_LockRom + mov r0, #0 + ldmia sp!, {r3, pc} +_0223F8D8: + ldr r0, _0223F900 ; =ov13_0224F5CC + ldr r0, [r0] + ldrh r0, [r0, #0xe4] + bl CARD_UnlockRom + mov r0, #0 + ldmia sp!, {r3, pc} +_0223F8F0: + mov r0, #4 + ldmia sp!, {r3, pc} +_0223F8F8: + mov r0, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223F900: .word ov13_0224F5CC + arm_func_end ov13_0223F8A0 + + arm_func_start ov13_0223F904 +ov13_0223F904: ; 0x0223F904 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, _0223F940 ; =ov13_0223F944 + mov lr, r1 + str ip, [sp] + mov ip, #1 + stmib sp, {r0, ip} + ldr r0, [r0, #0x28] + add r1, r2, r0 + mov r2, lr + sub r0, ip, #2 + bl CARDi_ReadRom + mov r0, #6 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0223F940: .word ov13_0223F944 + arm_func_end ov13_0223F904 + + arm_func_start ov13_0223F944 +ov13_0223F944: ; 0x0223F944 + ldr ip, _0223F950 ; =FS_NotifyArchiveAsyncEnd + mov r1, #0 + bx ip + .balign 4, 0 +_0223F950: .word FS_NotifyArchiveAsyncEnd + arm_func_end ov13_0223F944 + + arm_func_start ov13_0223F954 +ov13_0223F954: ; 0x0223F954 + mov r0, #1 + bx lr + arm_func_end ov13_0223F954 + + arm_func_start ov13_0223F95C +ov13_0223F95C: ; 0x0223F95C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x4c + ldr r3, _0223FA48 ; =ov13_0224F5CC + mov r6, r0 + ldr r0, [r3] + mov r5, r1 + ldr r0, [r0, #0x84] + mov r4, r2 + bl ov13_022402E0 + add r0, sp, #4 + bl FS_InitFile + add r0, sp, #4 + mov r1, r6 + bl FS_OpenFile + cmp r0, #0 + bne _0223F9A0 + bl OS_Terminate +_0223F9A0: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x28] + mov r2, #2 + sub r7, r1, r0 + cmp r5, #0 + ldr r1, _0223FA4C ; =ov13_0224742C + mov r0, r6 + strne r7, [r5] + bl ov13_0223FA84 + cmp r0, #0 + mvnne r6, #3 + moveq r6, r4 + mov r0, r7 + mov r1, r6 + bl ov13_0224128C + mov r1, r0 + add r0, sp, #4 + mov r2, r7 + str r1, [sp] + bl FS_ReadFile + add r0, sp, #4 + bl FS_CloseFile + cmp r6, #0 + ldrgt r0, [sp] + addgt sp, sp, #0x4c + ldmgtia sp!, {r4, r5, r6, r7, pc} + ldr r0, [sp] + cmp r5, #0 + ldr r0, [r0] + mov r1, r4 + mov r0, r0, lsr #8 + strne r0, [r5] + bl ov13_0224128C + mov r4, r0 + ldr r0, [sp] + mov r1, r4 + bl MI_UncompressLZ8 + add r0, sp, #0 + bl ov13_022412B0 + mov r0, r4 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0223FA48: .word ov13_0224F5CC +_0223FA4C: .word ov13_0224742C + arm_func_end ov13_0223F95C + + arm_func_start ov13_0223FA50 +ov13_0223FA50: ; 0x0223FA50 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r0, sp, #8 + bl ov13_022412B0 + ldr r0, _0223FA80 ; =ov13_0224F5CC + ldr r1, [sp, #8] + ldr r0, [r0] + ldr r0, [r0, #0x84] + bl ov13_02240288 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0223FA80: .word ov13_0224F5CC + arm_func_end ov13_0223FA50 + + arm_func_start ov13_0223FA84 +ov13_0223FA84: ; 0x0223FA84 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r5, r2 + bl strlen + mov r4, r0 + mov r0, r6 + bl strlen + cmp r4, r5 + cmpge r0, r5 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + sub r1, r0, r5 + sub r3, r4, r5 + mov r2, r5 + add r0, r7, r3 + add r1, r6, r1 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov13_0223FA84 + + arm_func_start ov13_0223FADC +ov13_0223FADC: ; 0x0223FADC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r0, #0x450 + mov r1, #4 + bl ov13_0224128C + ldr sl, _0223FBAC ; =ov13_0224F5D0 + mov r8, #0 + mov sb, r8 + str r0, [sl] + mov r7, #0x20 + mov r6, #0x10 + mov r5, #0x40 + mov r4, #0x7f +_0223FB0C: + ldr r1, [sl] + mov r0, r7 + mov r2, r6 + add r1, r1, sb + bl ov13_0224022C + ldr r1, [sl] + add r1, r1, sb + str r0, [r1, #0x224] + bl ov13_02241B98 + ldr r2, [sl] + mov r1, r5 + add r2, r2, sb + str r0, [r2, #0x220] + mov r0, r8 + bl ov13_02241DE4 + ldr r2, [sl] + mov r1, r4 + add r2, r2, sb + str r0, [r2, #0x208] + mov r0, r8 + bl ov13_02241DE4 + add r1, r0, #8 + ldr r0, [sl] + add r0, r0, sb + str r1, [r0, #0x218] + ldr r0, [sl] + add r1, r0, sb + ldr r0, [r1, #0x220] + add r1, r1, #0x200 + bl ov13_02241C58 + ldr r0, [sl] + add r1, r0, sb + ldr r0, [r1, #0x220] + add r1, r1, #0x210 + bl ov13_02241C48 + add sb, sb, #0x228 + add r8, r8, #1 + cmp r8, #2 + blt _0223FB0C + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0223FBAC: .word ov13_0224F5D0 + arm_func_end ov13_0223FADC + + arm_func_start ov13_0223FBB0 +ov13_0223FBB0: ; 0x0223FBB0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, #0 + ldr r4, _0223FBFC ; =ov13_0224F5D0 + mov r6, r5 +_0223FBC0: + ldr r0, [r4] + add r0, r0, r6 + ldr r0, [r0, #0x220] + bl ov13_02241BC4 + ldr r0, [r4] + add r0, r0, r6 + ldr r0, [r0, #0x224] + bl ov13_0224026C + add r5, r5, #1 + cmp r5, #2 + add r6, r6, #0x228 + blt _0223FBC0 + ldr r0, _0223FC00 ; =ov13_0224F5D0 + bl ov13_022412B0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223FBFC: .word ov13_0224F5D0 +_0223FC00: .word ov13_0224F5D0 + arm_func_end ov13_0223FBB0 + + arm_func_start ov13_0223FC04 +ov13_0223FC04: ; 0x0223FC04 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r0, #0x228 + mul r7, sb, r0 + ldr r0, _0223FD5C ; =ov13_0224F5D0 + mov r8, r1 + ldr r0, [r0] + mov r5, r2 + add r0, r0, r7 + ldr r0, [r0, #0x224] + bl ov13_022402E0 + mov r4, r0 + mov r0, #1 + bl OS_DisableIrqMask + mov r6, r0 + cmp r5, #0 + mov r0, #0x228 + beq _0223FCC8 + ldr r1, _0223FD5C ; =ov13_0224F5D0 + ldr r1, [r1] + mla r0, sb, r0, r1 + add r5, r0, #0x200 + add r0, r0, #0x210 + cmp r5, r0 + beq _0223FCA8 + add r0, r1, r7 + add r1, r0, #0x210 +_0223FC70: + ldrb r3, [r5, #0xc] + ldmib r5, {r0, sb} + add sb, sb, r3, lsl #3 + ldr r2, [r0, #8] + add r3, sb, r8, lsl #3 + cmp r3, r2 + bhi _0223FC9C + mov r1, r4 + str sb, [r4, #8] + bl ov13_02241C18 + b _0223FCA8 +_0223FC9C: + mov r5, r0 + cmp r0, r1 + bne _0223FC70 +_0223FCA8: + ldr r0, _0223FD5C ; =ov13_0224F5D0 + ldr r0, [r0] + add r0, r0, r7 + add r0, r0, #0x210 + cmp r5, r0 + bne _0223FD48 + bl OS_Terminate + b _0223FD48 +_0223FCC8: + ldr r1, _0223FD5C ; =ov13_0224F5D0 + ldr r1, [r1] + mla r0, sb, r0, r1 + add r5, r0, #0x210 + add r0, r0, #0x200 + cmp r5, r0 + beq _0223FD2C + add r0, r1, r7 + add r0, r0, #0x200 +_0223FCEC: + ldr sb, [r5] + ldr r3, [r5, #8] + ldrb r1, [sb, #0xc] + ldr r2, [sb, #8] + sub r3, r3, r8, lsl #3 + add r1, r2, r1, lsl #3 + cmp r3, r1 + blo _0223FD20 + mov r0, r5 + mov r1, r4 + str r3, [r4, #8] + bl ov13_02241C18 + b _0223FD2C +_0223FD20: + mov r5, sb + cmp sb, r0 + bne _0223FCEC +_0223FD2C: + ldr r0, _0223FD5C ; =ov13_0224F5D0 + ldr r0, [r0] + add r0, r0, r7 + add r0, r0, #0x200 + cmp r5, r0 + bne _0223FD48 + bl OS_Terminate +_0223FD48: + mov r0, r6 + bl OS_EnableIrqMask + mov r0, r4 + strb r8, [r4, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223FD5C: .word ov13_0224F5D0 + arm_func_end ov13_0223FC04 + + arm_func_start ov13_0223FD60 +ov13_0223FD60: ; 0x0223FD60 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r0, [r5, #0xc] + mov r4, #0 + mov r3, r4 + cmp r0, #0 + ldr r2, [r5, #8] + ble _0223FDA4 + ldr r0, _0223FDD8 ; =0xC1FFFCFF +_0223FD84: + ldr r1, [r2] + add r3, r3, #1 + and r1, r1, r0 + orr r1, r1, #0x200 + str r1, [r2], #8 + ldrb r1, [r5, #0xc] + cmp r3, r1 + blt _0223FD84 +_0223FDA4: + mov r0, r5 + bl ov13_02241BE0 + ldr r0, _0223FDDC ; =ov13_0224F5D0 + ldr r1, [r0] + add r0, r1, #0x228 + cmp r5, r0 + movhs r4, #1 + mov r0, #0x228 + mla r0, r4, r0, r1 + ldr r0, [r0, #0x224] + mov r1, r5 + bl ov13_02240288 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223FDD8: .word 0xC1FFFCFF +_0223FDDC: .word ov13_0224F5D0 + arm_func_end ov13_0223FD60 + + arm_func_start ov13_0223FDE0 +ov13_0223FDE0: ; 0x0223FDE0 + ldr r0, [r0, #8] + add r0, r0, r1, lsl #3 + bx lr + arm_func_end ov13_0223FDE0 + + arm_func_start ov13_0223FDEC +ov13_0223FDEC: ; 0x0223FDEC + ldrb r0, [r0, #0xc] + bx lr + arm_func_end ov13_0223FDEC + + arm_func_start ov13_0223FDF4 +ov13_0223FDF4: ; 0x0223FDF4 + stmdb sp!, {r4, lr} + cmp r1, #0 + ldr ip, [r0, #8] + blt _0223FE40 + cmp r2, #0x100 + cmpne r2, #0x300 + ldr r0, _0223FE94 ; =0xC1FFFCFF + beq _0223FE28 + ldr r3, [ip, r1, lsl #3] + and r0, r3, r0 + orr r0, r0, r2 + str r0, [ip, r1, lsl #3] + ldmia sp!, {r4, pc} +_0223FE28: + ldr r4, [ip, r1, lsl #3] + and r0, r4, r0 + orr r0, r0, r2 + orr r0, r0, r3, lsl #25 + str r0, [ip, r1, lsl #3] + ldmia sp!, {r4, pc} +_0223FE40: + ldrb r4, [r0, #0xc] + mov r1, #0 + cmp r4, #0 + ldmleia sp!, {r4, pc} + ldr lr, _0223FE94 ; =0xC1FFFCFF +_0223FE54: + cmp r2, #0x100 + cmpne r2, #0x300 + ldr r4, [ip, r1, lsl #3] + beq _0223FE70 + and r4, r4, lr + orr r4, r4, r2 + b _0223FE7C +_0223FE70: + and r4, r4, lr + orr r4, r4, r2 + orr r4, r4, r3, lsl #25 +_0223FE7C: + str r4, [ip, r1, lsl #3] + ldrb r4, [r0, #0xc] + add r1, r1, #1 + cmp r1, r4 + blt _0223FE54 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223FE94: .word 0xC1FFFCFF + arm_func_end ov13_0223FDF4 + + arm_func_start ov13_0223FE98 +ov13_0223FE98: ; 0x0223FE98 + stmdb sp!, {r4, lr} + cmp r1, #0 + ldr ip, [r0, #8] + blt _0223FED0 + ldr r0, [ip, r1, lsl #3] + add lr, ip, r1, lsl #3 + bic r0, r0, #0xc00 + orr r0, r0, r2, lsl #10 + str r0, [ip, r1, lsl #3] + ldrh r0, [lr, #4] + bic r0, r0, #0xf000 + orr r0, r0, r3, lsl #12 + strh r0, [lr, #4] + ldmia sp!, {r4, pc} +_0223FED0: + ldrb r1, [r0, #0xc] + mov r4, #0 + cmp r1, #0 + ldmleia sp!, {r4, pc} +_0223FEE0: + ldr r1, [ip, r4, lsl #3] + add lr, ip, r4, lsl #3 + bic r1, r1, #0xc00 + orr r1, r1, r2, lsl #10 + str r1, [ip, r4, lsl #3] + ldrh r1, [lr, #4] + add r4, r4, #1 + bic r1, r1, #0xf000 + orr r1, r1, r3, lsl #12 + strh r1, [lr, #4] + ldrb r1, [r0, #0xc] + cmp r4, r1 + blt _0223FEE0 + ldmia sp!, {r4, pc} + arm_func_end ov13_0223FE98 + + arm_func_start ov13_0223FF18 +ov13_0223FF18: ; 0x0223FF18 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x10 + cmp r1, #0 + ldr r5, [r0, #8] + blt _0223FF54 + ldr r4, [r5, r1, lsl #3] + ldr r0, _02240000 ; =0xFE00FF00 + and r3, r3, #0xff + and r0, r4, r0 + mov r2, r2, lsl #0x17 + orr r0, r0, r3 + orr r0, r0, r2, lsr #7 + add sp, sp, #0x10 + str r0, [r5, r1, lsl #3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0223FF54: + ldr r1, [r5] + ldr ip, _02240000 ; =0xFE00FF00 + and r6, r3, #0xff + and r7, r1, ip + mov sb, r1 + ldr r1, _02240004 ; =0x01FF0000 + mov r8, r2, lsl #0x17 + orr r6, r7, r6 + orr r6, r6, r8, lsr #7 + str r6, [r5] + ldrb r6, [r0, #0xc] + and r4, sb, r1 + and lr, sb, #0xff + mov r7, r4, lsr #0x10 + str r7, [sp, #0xc] + cmp r6, #1 + str lr, [sp, #8] + sub r6, r2, r4, lsr #16 + sub r7, r3, lr + mov r4, #1 + addle sp, sp, #0x10 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0223FFAC: + ldr r2, [r5, r4, lsl #3] + and r3, r2, #0xff + mov sb, r2 + and lr, r2, r1 + add r8, r3, r7 + add r2, r6, lr, lsr #16 + and sb, sb, ip + and r8, r8, #0xff + mov sl, r2, lsl #0x17 + orr r2, sb, r8 + orr r2, r2, sl, lsr #7 + str r2, [r5, r4, lsl #3] + ldrb r2, [r0, #0xc] + add r4, r4, #1 + mov r8, lr, lsr #0x10 + cmp r4, r2 + blt _0223FFAC + str r3, [sp] + str r8, [sp, #4] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02240000: .word 0xFE00FF00 +_02240004: .word 0x01FF0000 + arm_func_end ov13_0223FF18 + + arm_func_start ov13_02240008 +ov13_02240008: ; 0x02240008 + stmdb sp!, {r3, lr} + cmp r1, #0 + ldr ip, [r0, #8] + blt _02240030 + add r1, ip, r1, lsl #3 + ldrh r0, [r1, #4] + bic r0, r0, #0xc00 + orr r0, r0, r2, lsl #10 + strh r0, [r1, #4] + ldmia sp!, {r3, pc} +_02240030: + ldrb r1, [r0, #0xc] + mov lr, #0 + cmp r1, #0 + ldmleia sp!, {r3, pc} +_02240040: + add r3, ip, lr, lsl #3 + ldrh r1, [r3, #4] + add lr, lr, #1 + bic r1, r1, #0xc00 + orr r1, r1, r2, lsl #10 + strh r1, [r3, #4] + ldrb r1, [r0, #0xc] + cmp lr, r1 + blt _02240040 + ldmia sp!, {r3, pc} + arm_func_end ov13_02240008 + + arm_func_start ov13_02240068 +ov13_02240068: ; 0x02240068 + stmdb sp!, {r3, lr} + ldr lr, [r0, #8] + ldr r0, _02240094 ; =0x01FF0000 + ldr ip, [lr, r1, lsl #3] + and r0, ip, r0 + mov r0, r0, lsr #0x10 + str r0, [r2] + ldr r0, [lr, r1, lsl #3] + and r0, r0, #0xff + str r0, [r3] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02240094: .word 0x01FF0000 + arm_func_end ov13_02240068 + + arm_func_start ov13_02240098 +ov13_02240098: ; 0x02240098 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, r1 + add r1, sp, #0 + mov r2, #4 + bl ov13_0223F95C + ldr r1, _022400C4 ; =ov13_0224F5D4 + str r0, [r1, r4, lsl #2] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022400C4: .word ov13_0224F5D4 + arm_func_end ov13_02240098 + + arm_func_start ov13_022400C8 +ov13_022400C8: ; 0x022400C8 + stmdb sp!, {r4, lr} + ldr r1, _022400EC ; =ov13_0224F5D4 + mov r4, r0 + ldr r0, [r1, r4, lsl #2] + bl ov13_0223FA50 + ldr r0, _022400EC ; =ov13_0224F5D4 + mov r1, #0 + str r1, [r0, r4, lsl #2] + ldmia sp!, {r4, pc} + .balign 4, 0 +_022400EC: .word ov13_0224F5D4 + arm_func_end ov13_022400C8 + + arm_func_start ov13_022400F0 +ov13_022400F0: ; 0x022400F0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + ldr r3, _02240180 ; =ov13_0224F5D4 + mov r5, r2 + ldr r6, [r3, r0, lsl #2] + mov r2, r1, lsl #3 + add r0, r6, r1, lsl #3 + ldr r3, [r0, #4] + ldrh r4, [r6, r2] + add r1, sp, #0 + mov r0, #0 + mov r2, #8 + add sb, r6, r3 + bl MIi_CpuClear32 + cmp r4, #0 + mov sl, #0 + addle sp, sp, #8 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r8, sp, #0 + mov r7, #6 + mov r6, #8 +_02240144: + mov r0, sb + mov r1, r8 + mov r2, r7 + bl MIi_CpuCopy16 + mov r0, r8 + mov r1, r5 + mov r2, r6 + bl MIi_CpuCopy32 + add sl, sl, #1 + cmp sl, r4 + add sb, sb, #6 + add r5, r5, #8 + blt _02240144 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02240180: .word ov13_0224F5D4 + arm_func_end ov13_022400F0 + + arm_func_start ov13_02240184 +ov13_02240184: ; 0x02240184 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl ov13_02241D78 + mov r4, r0 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov13_022400F0 + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov13_02240184 + + arm_func_start ov13_022401B0 +ov13_022401B0: ; 0x022401B0 + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _022401F4 ; =ov13_0224F5D4 + mov r6, r0 + mov r5, r1 + ldr r3, [r3, r6, lsl #2] + mov r1, r5, lsl #3 + ldrh r1, [r3, r1] + bl ov13_0223FC04 + mov r1, #0 + mov r4, r0 + bl ov13_0223FDE0 + mov r2, r0 + mov r0, r6 + mov r1, r5 + bl ov13_022400F0 + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022401F4: .word ov13_0224F5D4 + arm_func_end ov13_022401B0 + + arm_func_start ov13_022401F8 +ov13_022401F8: ; 0x022401F8 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #1 + mov r0, r0, lsl #2 + add r0, r0, #8 + mov r1, #4 + bl ov13_0224128C + add r1, r4, #1 + strh r1, [r0] + mov r1, #0 + strb r1, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r4, pc} + arm_func_end ov13_022401F8 + + arm_func_start ov13_0224022C +ov13_0224022C: ; 0x0224022C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov13_022401F8 + cmp r6, #0 + mov r2, #0 + ble _02240264 +_0224024C: + add r1, r0, r2, lsl #2 + add r2, r2, #1 + str r5, [r1, #4] + cmp r2, r6 + add r5, r5, r4 + blt _0224024C +_02240264: + strb r6, [r0, #3] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov13_0224022C + + arm_func_start ov13_0224026C +ov13_0224026C: ; 0x0224026C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r0, sp, #8 + bl ov13_022412B0 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov13_0224026C + + arm_func_start ov13_02240288 +ov13_02240288: ; 0x02240288 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r0, #1 + mov r4, r1 + bl OS_DisableIrqMask + ldrb r2, [r5, #3] + mov r6, r0 + ldrh r1, [r5] + add r0, r2, #1 + bl FX_ModS32 + ldrb r1, [r5, #2] + mov r7, r0 + cmp r7, r1 + bne _022402C4 + bl OS_Terminate +_022402C4: + ldrb r1, [r5, #3] + mov r0, r6 + add r1, r5, r1, lsl #2 + str r4, [r1, #4] + strb r7, [r5, #3] + bl OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov13_02240288 + + arm_func_start ov13_022402E0 +ov13_022402E0: ; 0x022402E0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + mov r4, #0 + bl OS_DisableIrqMask + ldrb r2, [r6, #3] + ldrb r1, [r6, #2] + mov r5, r0 + cmp r1, r2 + beq _02240328 + ldrh r1, [r6] + add r0, r2, r1 + sub r0, r0, #1 + bl FX_ModS32 + and r1, r0, #0xff + strb r0, [r6, #3] + add r0, r6, r1, lsl #2 + ldr r4, [r0, #4] +_02240328: + mov r0, r5 + bl OS_EnableIrqMask + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov13_022402E0 + + arm_func_start ov13_02240338 +ov13_02240338: ; 0x02240338 + stmdb sp!, {r3, lr} + mov r0, #0x18 + mov r1, #4 + bl ov13_0224128C + ldr r2, _02240374 ; =ov13_0224F5DC + mov r1, #0x3f + str r0, [r2] + ldr r0, _02240378 ; =0x04000050 + mov r2, #0x10 + bl G2x_SetBlendBrightness_ + ldr r0, _0224037C ; =0x04001050 + mov r1, #0x3f + mov r2, #0x10 + bl G2x_SetBlendBrightness_ + ldmia sp!, {r3, pc} + .balign 4, 0 +_02240374: .word ov13_0224F5DC +_02240378: .word 0x04000050 +_0224037C: .word 0x04001050 + arm_func_end ov13_02240338 + + arm_func_start ov13_02240380 +ov13_02240380: ; 0x02240380 + ldr ip, _0224038C ; =ov13_022412B0 + ldr r0, _02240390 ; =ov13_0224F5DC + bx ip + .balign 4, 0 +_0224038C: .word ov13_022412B0 +_02240390: .word ov13_0224F5DC + arm_func_end ov13_02240380 + + arm_func_start ov13_02240394 +ov13_02240394: ; 0x02240394 + cmp r0, #1 + ldreq r0, _022403B4 ; =ov13_0224F5DC + ldreq r0, [r0] + ldrne r0, _022403B4 ; =ov13_0224F5DC + ldrne r0, [r0] + addne r0, r0, #0xc + ldrb r0, [r0, #9] + bx lr + .balign 4, 0 +_022403B4: .word ov13_0224F5DC + arm_func_end ov13_02240394 + + arm_func_start ov13_022403B8 +ov13_022403B8: ; 0x022403B8 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r4, _0224047C ; =ov13_02245940 + mov r5, r0 + ldrb r0, [r4, #0xb] + ldrb r6, [r4, #8] + ldrb lr, [r4, #9] + strb r0, [sp, #3] + cmp r1, #1 + ldreq r0, _02240480 ; =ov13_0224F5DC + strb r6, [sp] + ldreq r6, [r0] + ldrne r0, _02240480 ; =ov13_0224F5DC + ldrb ip, [r4, #0xa] + ldrne r0, [r0] + mov r4, r3 + addne r6, r0, #0xc + ldrb r0, [r6, #9] + strb lr, [sp, #1] + strb ip, [sp, #2] + cmp r0, #0 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + cmp r1, #1 + add r0, sp, #0 + mov r1, r2 + bne _02240438 + ldrsb r2, [r0, r5] + ldr r0, _02240484 ; =0x04001050 + bl G2x_SetBlendBrightness_ + b _02240444 +_02240438: + ldrsb r2, [r0, r5] + ldr r0, _02240488 ; =0x04000050 + bl G2x_SetBlendBrightness_ +_02240444: + ldr r1, _0224048C ; =ov13_02240490 + mov r2, r6 + mov r0, #1 + mov r3, #0xc8 + bl ov13_02242528 + str r0, [r6] + mov r0, #0 + strh r0, [r6, #4] + strb r5, [r6, #8] + strh r4, [r6, #6] + mov r0, #1 + strb r0, [r6, #9] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0224047C: .word ov13_02245940 +_02240480: .word ov13_0224F5DC +_02240484: .word 0x04001050 +_02240488: .word 0x04000050 +_0224048C: .word ov13_02240490 + arm_func_end ov13_022403B8 + + arm_func_start ov13_02240490 +ov13_02240490: ; 0x02240490 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + ldr r2, _022405A8 ; =ov13_02245940 + mov r4, r1 + ldrsh r1, [r4, #4] + ldrb sb, [r2, #4] + ldrb r8, [r2, #5] + ldrb r7, [r2, #6] + ldrb r6, [r2, #7] + ldrb lr, [r2] + ldrb ip, [r2, #1] + ldrb r3, [r2, #2] + ldrb r2, [r2, #3] + add r1, r1, #1 + mov r5, r0 + strh r1, [r4, #4] + ldrsh r0, [r4, #4] + ldrh r1, [r4, #6] + strb sb, [sp, #4] + mov r0, r0, lsl #4 + strb r8, [sp, #5] + strb r7, [sp, #6] + strb r6, [sp, #7] + strb lr, [sp] + strb ip, [sp, #1] + strb r3, [sp, #2] + strb r2, [sp, #3] + bl FX_DivS32 + ldrb r3, [r4, #8] + add r2, sp, #4 + mov r1, r0 + ldrb r0, [r2, r3] + tst r0, #1 + rsbne r1, r1, #0x10 + tst r0, #0x10 + ldr r0, _022405AC ; =ov13_0224F5DC + rsbne r1, r1, #0 + ldr r0, [r0] + cmp r4, r0 + bne _0224053C + ldr r0, _022405B0 ; =0x04001050 + bl G2x_ChangeBlendBrightness_ + b _02240544 +_0224053C: + ldr r0, _022405B4 ; =0x04000050 + bl G2x_ChangeBlendBrightness_ +_02240544: + ldrsh r1, [r4, #4] + ldrh r0, [r4, #6] + cmp r1, r0 + addlt sp, sp, #8 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, _022405AC ; =ov13_0224F5DC + ldrb r2, [r4, #8] + ldr r0, [r0] + add r1, sp, #0 + cmp r4, r0 + bne _02240580 + ldrsb r1, [r1, r2] + ldr r0, _022405B0 ; =0x04001050 + bl G2x_ChangeBlendBrightness_ + b _0224058C +_02240580: + ldrsb r1, [r1, r2] + ldr r0, _022405B4 ; =0x04000050 + bl G2x_ChangeBlendBrightness_ +_0224058C: + mov r2, #0 + mov r1, r5 + mov r0, #1 + strb r2, [r4, #9] + bl ov13_022425D0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_022405A8: .word ov13_02245940 +_022405AC: .word ov13_0224F5DC +_022405B0: .word 0x04001050 +_022405B4: .word 0x04000050 + arm_func_end ov13_02240490 + + arm_func_start ov13_022405B8 +ov13_022405B8: ; 0x022405B8 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _02240608 ; =ov13_0224F5DC + mov r5, r0 + ldr r4, [r1] + ldrb r0, [r4, #9] + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, _0224060C ; =ov13_02240610 + mov r2, r4 + mov r0, #1 + mov r3, #0xc8 + bl ov13_02242528 + str r0, [r4] + mov r0, #0 + strh r0, [r4, #4] + strh r5, [r4, #6] + mov r0, #1 + strb r0, [r4, #9] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02240608: .word ov13_0224F5DC +_0224060C: .word ov13_02240610 + arm_func_end ov13_022405B8 + + arm_func_start ov13_02240610 +ov13_02240610: ; 0x02240610 + stmdb sp!, {r3, lr} + ldrsh r2, [r1, #4] + add r2, r2, #1 + strh r2, [r1, #4] + ldrsh r3, [r1, #4] + ldrh r2, [r1, #6] + cmp r3, r2 + ldmltia sp!, {r3, pc} + mov r2, #0 + strb r2, [r1, #9] + mov r1, r0 + mov r0, #1 + bl ov13_022425D0 + ldmia sp!, {r3, pc} + arm_func_end ov13_02240610 + + arm_func_start ov13_02240648 +ov13_02240648: ; 0x02240648 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r0, #0x680 + mov r1, #4 + bl ov13_0224128C + mov r4, r0 + ldr r3, _02240740 ; =ov13_0224F5E0 + add r1, r4, #0x10 + mov r0, #0x20 + mov r2, #0x30 + str r4, [r3] + bl ov13_0224022C + ldr r1, _02240740 ; =ov13_0224F5E0 + ldr r1, [r1] + str r0, [r1, #0x670] + bl ov13_0222B970 + cmp r0, #6 + mov r4, #4 + bne _022406E8 + mov r7, #0 + ldr r6, _02240744 ; =ov13_02247430 + ldr sb, _02240740 ; =ov13_0224F5E0 + mov r8, r7 + mov r5, r7 +_022406A4: + ldr r0, [r6, r7, lsl #2] + mov r1, r5 + mov r2, r4 + bl ov13_0223F95C + ldr r1, [sb] + add r1, r1, r7, lsl #2 + str r0, [r1, #0x674] + ldr r2, [sb] + add r0, r2, r7, lsl #2 + ldr r1, [r0, #0x674] + add r0, r2, r8 + bl NNS_G2dFontInitUTF16 + add r7, r7, #1 + cmp r7, #2 + add r8, r8, #8 + blt _022406A4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022406E8: + mov r8, #0 + ldr r6, _02240748 ; =ov13_02247438 + ldr sb, _02240740 ; =ov13_0224F5E0 + mov r7, r8 + mov r5, r8 +_022406FC: + ldr r0, [r6, r8, lsl #2] + mov r1, r5 + mov r2, r4 + bl ov13_0223F95C + ldr r1, [sb] + add r1, r1, r8, lsl #2 + str r0, [r1, #0x674] + ldr r2, [sb] + add r0, r2, r8, lsl #2 + ldr r1, [r0, #0x674] + add r0, r2, r7 + bl NNS_G2dFontInitUTF16 + add r8, r8, #1 + cmp r8, #2 + add r7, r7, #8 + blt _022406FC + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02240740: .word ov13_0224F5E0 +_02240744: .word ov13_02247430 +_02240748: .word ov13_02247438 + arm_func_end ov13_02240648 + + arm_func_start ov13_0224074C +ov13_0224074C: ; 0x0224074C + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _02240790 ; =ov13_0224F5E0 + mov r5, #0 +_02240758: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + ldr r0, [r0, #0x674] + bl ov13_0223FA50 + add r5, r5, #1 + cmp r5, #2 + blt _02240758 + ldr r0, _02240790 ; =ov13_0224F5E0 + ldr r0, [r0] + ldr r0, [r0, #0x670] + bl ov13_0224026C + ldr r0, _02240794 ; =ov13_0224F5E0 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02240790: .word ov13_0224F5E0 +_02240794: .word ov13_0224F5E0 + arm_func_end ov13_0224074C + + arm_func_start ov13_02240798 +ov13_02240798: ; 0x02240798 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r4, _02240870 ; =ov13_0224F5E0 + mov r7, r0 + ldr r0, [r4] + mov r6, r1 + ldr r0, [r0, #0x670] + mov r5, r2 + mov r8, r3 + bl ov13_022402E0 + mov r4, r0 + strb r6, [r4, #0x2e] + mul r1, r6, r5 + mov r2, r8 + strb r5, [r4, #0x2f] + mov r0, r7 + add r3, sp, #4 + bl ov13_02241EBC + str r0, [r4, #0x28] + ldr r1, [sp, #4] + mov r0, r6 + strh r1, [r4, #0x2c] + mov r1, r5 + bl NNSi_G2dCalcRequiredOBJ + ldr r1, [sp, #0x20] + cmp r7, #1 + str r0, [r1] + moveq ip, #0x6600000 + ldr r7, [sp, #4] + mov r1, #4 + movne ip, #0x6400000 + str r1, [sp] + mov r0, r4 + mov r2, r6 + mov r3, r5 + add r1, ip, r7, lsl #7 + bl NNS_G2dCharCanvasInitForOBJ1D + ldr r1, [r4, #0x14] + mov r0, r4 + ldr r2, [r1, #4] + mov r1, #0 + blx r2 + ldr r0, _02240870 ; =ov13_0224F5E0 + ldr r2, [sp, #0x24] + ldr r0, [r0] + mov r1, #1 + str r4, [r4, #0x18] + add r0, r0, r2, lsl #3 + str r0, [r4, #0x1c] + str r1, [r4, #0x20] + mov r0, r4 + str r1, [r4, #0x24] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02240870: .word ov13_0224F5E0 + arm_func_end ov13_02240798 + + arm_func_start ov13_02240874 +ov13_02240874: ; 0x02240874 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x28] + bl ov13_02242034 + ldr r0, _0224089C ; =ov13_0224F5E0 + mov r1, r4 + ldr r0, [r0] + ldr r0, [r0, #0x670] + bl ov13_02240288 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0224089C: .word ov13_0224F5E0 + arm_func_end ov13_02240874 + + arm_func_start ov13_022408A0 +ov13_022408A0: ; 0x022408A0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r8, r0 + ldr r0, _022409FC ; =ov13_0224F5E0 + ldr r3, _02240A00 ; =ov13_02245952 + mov r4, r8, lsl #2 + ldr r2, _02240A04 ; =ov13_02245950 + ldr r0, [r0] + ldrh r5, [r3, r4] + ldrh r6, [r2, r4] + add r3, r0, #0x610 + mov r0, #0x30 + mul r2, r6, r5 + mov r7, r1 + mla r4, r8, r0, r3 + mov r0, r2, lsl #5 + mov r1, #0x20 + bl ov13_0224128C + str r0, [r4, #0x28] + cmp r8, #1 + bne _02240918 + ldr r1, _02240A08 ; =0x04001008 + ldrh r0, [r1] + bic r0, r0, #0x40 + strh r0, [r1] + ldrh r0, [r1] + and r0, r0, #0x43 + orr r0, r0, #0xc00 + strh r0, [r1] + b _02240938 +_02240918: + ldr r1, _02240A0C ; =0x04000008 + ldrh r0, [r1] + bic r0, r0, #0x40 + strh r0, [r1] + ldrh r0, [r1] + and r0, r0, #0x43 + orr r0, r0, #0xc00 + strh r0, [r1] +_02240938: + mov r0, #4 + str r0, [sp] + ldr r1, [r4, #0x28] + mov r0, r4 + mov r2, r6 + mov r3, r5 + bl NNS_G2dCharCanvasInitForBG + ldr r0, _022409FC ; =ov13_0224F5E0 + mov r1, #1 + ldr r0, [r0] + cmp r8, #1 + str r4, [r4, #0x18] + add r0, r0, r7, lsl #3 + str r0, [r4, #0x1c] + str r1, [r4, #0x20] + str r1, [r4, #0x24] + bne _02240984 + bl G2S_GetBG0ScrPtr + b _02240988 +_02240984: + bl G2_GetBG0ScrPtr +_02240988: + ldr r1, _02240A10 ; =ov13_0224594C + mov r2, r8, lsl #1 + mov r3, #0 + ldrh r7, [r1, r2] + str r3, [sp] + mov r1, #0x20 + str r1, [sp, #4] + mov r1, r6 + mov r2, r5 + str r7, [sp, #8] + mov r5, #0xf + str r5, [sp, #0xc] + bl NNS_G2dMapScrToCharText + mov r0, r4 + mov r1, #0 + bl ov13_02240D80 + ldr r0, _022409FC ; =ov13_0224F5E0 + ldr r1, _02240A14 ; =ov13_02240A18 + ldr r2, [r0] + mov r0, #1 + add r2, r2, #0x27c + add r2, r2, #0x400 + add r2, r2, r8 + mov r3, #0xc8 + bl ov13_02242528 + str r0, [r4, #0x2c] + mov r0, r4 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022409FC: .word ov13_0224F5E0 +_02240A00: .word ov13_02245952 +_02240A04: .word ov13_02245950 +_02240A08: .word 0x04001008 +_02240A0C: .word 0x04000008 +_02240A10: .word ov13_0224594C +_02240A14: .word ov13_02240A18 + arm_func_end ov13_022408A0 + + arm_func_start ov13_02240A18 +ov13_02240A18: ; 0x02240A18 + stmdb sp!, {r4, lr} + mov r4, r1 + ldrb r0, [r4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _02240A9C ; =ov13_0224F5E0 + ldr r1, [r0] + add r0, r1, #0x27c + add r0, r0, #0x400 + cmp r4, r0 + bne _02240A6C + ldr r0, [r1, #0x638] + mov r1, #0x6000 + bl DC_FlushRange + ldr r0, _02240A9C ; =ov13_0224F5E0 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x6000 + ldr r0, [r0, #0x638] + bl GX_LoadBG0Char + b _02240A90 +_02240A6C: + ldr r0, [r1, #0x668] + mov r1, #0x3000 + bl DC_FlushRange + ldr r0, _02240A9C ; =ov13_0224F5E0 + mov r1, #0x3000 + ldr r0, [r0] + mov r2, r1 + ldr r0, [r0, #0x668] + bl GXS_LoadBG0Char +_02240A90: + mov r0, #0 + strb r0, [r4] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02240A9C: .word ov13_0224F5E0 + arm_func_end ov13_02240A18 + + arm_func_start ov13_02240AA0 +ov13_02240AA0: ; 0x02240AA0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x2c] + mov r0, #1 + bl ov13_022425F0 + ldr r0, _02240B00 ; =ov13_0224F5E0 + ldr r0, [r0] + add r0, r0, #0x610 + cmp r4, r0 + bne _02240AE0 + bl G2_GetBG0CharPtr + mov r1, r0 + mov r0, #0 + mov r2, #0x6000 + bl MIi_CpuClear16 + b _02240AF4 +_02240AE0: + bl G2_GetBG0CharPtr + mov r1, r0 + mov r0, #0 + mov r2, #0x3000 + bl MIi_CpuClear16 +_02240AF4: + add r0, r4, #0x28 + bl ov13_022412B0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02240B00: .word ov13_0224F5E0 + arm_func_end ov13_02240AA0 + + arm_func_start ov13_02240B04 +ov13_02240B04: ; 0x02240B04 + ldr r2, _02240B20 ; =ov13_0224F5E0 + mov r1, #0x30 + ldr r2, [r2] + ldr ip, _02240B24 ; =ov13_02240AA0 + add r2, r2, #0x610 + mla r0, r1, r0, r2 + bx ip + .balign 4, 0 +_02240B20: .word ov13_0224F5E0 +_02240B24: .word ov13_02240AA0 + arm_func_end ov13_02240B04 + + arm_func_start ov13_02240B28 +ov13_02240B28: ; 0x02240B28 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr r4, [r0, #0x1c] + add ip, sp, #0xc + mov lr, #0 + strb lr, [ip] + strb lr, [ip, #1] + ldr ip, [r4] + ldr ip, [ip, #8] + ldrb ip, [ip, #7] + cmp ip, #7 + addls pc, pc, ip, lsl #2 + b _02240BA8 +_02240B5C: ; jump table + b _02240B7C ; case 0 + b _02240B88 ; case 1 + b _02240B88 ; case 2 + b _02240B94 ; case 3 + b _02240B94 ; case 4 + b _02240BA0 ; case 5 + b _02240BA0 ; case 6 + b _02240B7C ; case 7 +_02240B7C: + mov ip, #1 + strb ip, [sp, #0xc] + b _02240BA8 +_02240B88: + mov ip, #1 + strb ip, [sp, #0xd] + b _02240BA8 +_02240B94: + sub ip, lr, #1 + strb ip, [sp, #0xc] + b _02240BA8 +_02240BA0: + sub ip, lr, #1 + strb ip, [sp, #0xd] +_02240BA8: + ldr lr, [sp, #0x18] + ldr ip, [sp, #0x1c] + str lr, [sp] + str ip, [sp, #4] + ldrb lr, [sp, #0xc] + ldrb ip, [sp, #0xd] + add r0, r0, #0x18 + strb lr, [sp, #8] + strb ip, [sp, #9] + bl NNSi_G2dTextCanvasDrawText + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + arm_func_end ov13_02240B28 + + arm_func_start ov13_02240BD8 +ov13_02240BD8: ; 0x02240BD8 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldrh ip, [sp, #0x10] + str r3, [sp] + ldr r3, _02240C10 ; =ov13_0224F5E0 + str ip, [sp, #4] + ldr lr, [r3] + ldr ip, [sp, #0x14] + mov r3, r2 + mov r2, r1 + add r1, lr, ip, lsl #3 + bl NNS_G2dCharCanvasDrawChar + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02240C10: .word ov13_0224F5E0 + arm_func_end ov13_02240BD8 + + arm_func_start ov13_02240C14 +ov13_02240C14: ; 0x02240C14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r6, [sp, #0x34] + mov sb, r1 + ldrh r1, [r6] + ldr r7, [sp, #0x30] + ldr r5, [sp, #0x38] + cmp r1, #0 + mov sl, r0 + mov r8, r2 + mov fp, r3 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02240C48: + ldr r0, _02240CB8 ; =ov13_0224F5E0 + ldr r0, [r0] + add r4, r0, r5, lsl #3 + mov r0, r4 + bl NNS_G2dFontFindGlyphIndex + mov r1, r0 + ldr r0, _02240CBC ; =0x0000FFFF + cmp r1, r0 + ldreq r0, [r4] + ldreqh r1, [r0, #2] + mov r0, r4 + bl NNS_G2dFontGetCharWidthsFromIndex + ldrh r1, [r6] + mov r2, r0 + mov r0, sl + stmia sp, {r1, r5} + ldrsb r1, [r2, #2] + mov r2, r8 + mov r3, fp + sub r1, r7, r1 + add r1, sb, r1, asr #1 + bl ov13_02240BD8 + ldrh r1, [r6, #2]! + add sb, sb, r7 + cmp r1, #0 + bne _02240C48 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02240CB8: .word ov13_0224F5E0 +_02240CBC: .word 0x0000FFFF + arm_func_end ov13_02240C14 + + arm_func_start ov13_02240CC0 +ov13_02240CC0: ; 0x02240CC0 + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + ldr r4, [r0, #0x1c] + add ip, sp, #0x14 + mov lr, #0 + strb lr, [ip] + strb lr, [ip, #1] + ldr ip, [r4] + ldr ip, [ip, #8] + ldrb ip, [ip, #7] + cmp ip, #7 + addls pc, pc, ip, lsl #2 + b _02240D40 +_02240CF4: ; jump table + b _02240D14 ; case 0 + b _02240D20 ; case 1 + b _02240D20 ; case 2 + b _02240D2C ; case 3 + b _02240D2C ; case 4 + b _02240D38 ; case 5 + b _02240D38 ; case 6 + b _02240D14 ; case 7 +_02240D14: + mov ip, #1 + strb ip, [sp, #0x14] + b _02240D40 +_02240D20: + mov ip, #1 + strb ip, [sp, #0x15] + b _02240D40 +_02240D2C: + sub ip, lr, #1 + strb ip, [sp, #0x14] + b _02240D40 +_02240D38: + sub ip, lr, #1 + strb ip, [sp, #0x15] +_02240D40: + ldr lr, [sp, #0x20] + ldr ip, [sp, #0x24] + str lr, [sp] + ldr lr, [sp, #0x28] + str ip, [sp, #4] + ldr ip, [sp, #0x2c] + str lr, [sp, #8] + str ip, [sp, #0xc] + ldrb lr, [sp, #0x14] + ldrb ip, [sp, #0x15] + add r0, r0, #0x18 + strb lr, [sp, #0x10] + strb ip, [sp, #0x11] + bl NNSi_G2dTextCanvasDrawTextRect + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + arm_func_end ov13_02240CC0 + + arm_func_start ov13_02240D80 +ov13_02240D80: ; 0x02240D80 + stmdb sp!, {r3, lr} + ldr r2, [r0, #0x14] + ldr r2, [r2, #4] + blx r2 + ldmia sp!, {r3, pc} + arm_func_end ov13_02240D80 + + arm_func_start ov13_02240D94 +ov13_02240D94: ; 0x02240D94 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r6, r3 + mov r4, r0 + mov r8, r1 + mov r0, r6 + mov r1, #0 + mov r7, r2 + bl ov13_0223FDE0 + mov r2, #0 + mov r5, r0 + mov r0, r6 + mvn r1, #0 + mov r3, r2 + bl ov13_0223FDF4 + mov r0, r6 + mvn r1, #0 + mov r2, #0 + mov r3, #0xf + bl ov13_0223FE98 + mov r0, r6 + mvn r1, #0 + ldr r2, [sp, #0x28] + bl ov13_02240008 + str r7, [sp] + mov r0, r5 + mov r3, r8 + mov r1, #0 + str r1, [sp, #4] + ldrh r2, [r4, #0x2c] + mov r1, #2 + str r2, [sp, #8] + str r1, [sp, #0xc] + ldrb r1, [r4, #0x2e] + ldrb r2, [r4, #0x2f] + bl NNS_G2dArrangeOBJ1D + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov13_02240D94 + + arm_func_start ov13_02240E2C +ov13_02240E2C: ; 0x02240E2C + ldr r1, _02240E4C ; =ov13_0224F5E0 + ldr r2, [r1] + add r1, r2, #0x610 + cmp r0, r1 + mov r0, #1 + streqb r0, [r2, #0x67c] + strneb r0, [r2, #0x67d] + bx lr + .balign 4, 0 +_02240E4C: .word ov13_0224F5E0 + arm_func_end ov13_02240E2C + + arm_func_start ov13_02240E50 +ov13_02240E50: ; 0x02240E50 + strh r0, [r2] + strh r1, [r2, #2] + bx lr + arm_func_end ov13_02240E50 + + arm_func_start ov13_02240E5C +ov13_02240E5C: ; 0x02240E5C + ldr ip, [sp] + strh r0, [ip] + strh r1, [ip, #2] + strh r2, [ip, #4] + strh r3, [ip, #6] + bx lr + arm_func_end ov13_02240E5C + + arm_func_start ov13_02240E74 +ov13_02240E74: ; 0x02240E74 + ldrh r3, [r0] + strh r3, [r2] + ldrh r3, [r0, #2] + strh r3, [r2, #2] + ldrh ip, [r0] + ldrh r3, [r1] + add r3, ip, r3 + strh r3, [r2, #4] + ldrh r3, [r0, #2] + ldrh r0, [r1, #2] + add r0, r3, r0 + strh r0, [r2, #6] + bx lr + arm_func_end ov13_02240E74 + + arm_func_start ov13_02240EA8 +ov13_02240EA8: ; 0x02240EA8 + cmp r0, #1 + bne _02240ED4 + ldr r3, _02240EF8 ; =0x04001000 + ldr r2, [r3] + ldr r0, [r3] + and ip, r2, #0x1f00 + bic r2, r0, #0x1f00 + orr r0, r1, ip, lsr #8 + orr r0, r2, r0, lsl #8 + str r0, [r3] + bx lr +_02240ED4: + mov r3, #0x4000000 + ldr r2, [r3] + ldr r0, [r3] + and ip, r2, #0x1f00 + bic r2, r0, #0x1f00 + orr r0, r1, ip, lsr #8 + orr r0, r2, r0, lsl #8 + str r0, [r3] + bx lr + .balign 4, 0 +_02240EF8: .word 0x04001000 + arm_func_end ov13_02240EA8 + + arm_func_start ov13_02240EFC +ov13_02240EFC: ; 0x02240EFC + cmp r0, #1 + bne _02240F2C + ldr r3, _02240F54 ; =0x04001000 + mvn r0, r1 + ldr r2, [r3] + ldr r1, [r3] + and r2, r2, #0x1f00 + bic r1, r1, #0x1f00 + and r0, r0, r2, lsr #8 + orr r0, r1, r0, lsl #8 + str r0, [r3] + bx lr +_02240F2C: + mov r3, #0x4000000 + ldr r0, [r3] + ldr r2, [r3] + and ip, r0, #0x1f00 + mvn r0, r1 + bic r1, r2, #0x1f00 + and r0, r0, ip, lsr #8 + orr r0, r1, r0, lsl #8 + str r0, [r3] + bx lr + .balign 4, 0 +_02240F54: .word 0x04001000 + arm_func_end ov13_02240EFC + + arm_func_start ov13_02240F58 +ov13_02240F58: ; 0x02240F58 + cmp r0, #1 + bne _02240FE0 + cmp r1, #0 + ldrh r0, [r2] + ldrh r3, [r2, #2] + bne _02240FA8 + ldrh r1, [r2, #4] + ldrh ip, [r2, #6] + mov r2, r0, lsl #8 + mov r0, r3, lsl #8 + and r3, r2, #0xff00 + and r1, r1, #0xff + orr r3, r3, r1 + ldr r2, _02241060 ; =0x04001040 + and r1, r0, #0xff00 + and r0, ip, #0xff + strh r3, [r2] + orr r0, r1, r0 + strh r0, [r2, #4] + bx lr +_02240FA8: + ldrh r1, [r2, #4] + ldrh ip, [r2, #6] + mov r2, r0, lsl #8 + mov r0, r3, lsl #8 + and r3, r2, #0xff00 + and r1, r1, #0xff + orr r3, r3, r1 + ldr r2, _02241064 ; =0x04001042 + and r1, r0, #0xff00 + and r0, ip, #0xff + strh r3, [r2] + orr r0, r1, r0 + strh r0, [r2, #4] + bx lr +_02240FE0: + cmp r1, #0 + ldrh r0, [r2] + ldrh r3, [r2, #2] + bne _02241028 + ldrh r1, [r2, #4] + ldrh ip, [r2, #6] + mov r2, r0, lsl #8 + mov r0, r3, lsl #8 + and r3, r2, #0xff00 + and r1, r1, #0xff + orr r3, r3, r1 + ldr r2, _02241068 ; =0x04000040 + and r1, r0, #0xff00 + and r0, ip, #0xff + strh r3, [r2] + orr r0, r1, r0 + strh r0, [r2, #4] + bx lr +_02241028: + ldrh r1, [r2, #4] + ldrh ip, [r2, #6] + mov r2, r0, lsl #8 + mov r0, r3, lsl #8 + and r3, r2, #0xff00 + and r1, r1, #0xff + orr r3, r3, r1 + ldr r2, _0224106C ; =0x04000042 + and r1, r0, #0xff00 + and r0, ip, #0xff + strh r3, [r2] + orr r0, r1, r0 + strh r0, [r2, #4] + bx lr + .balign 4, 0 +_02241060: .word 0x04001040 +_02241064: .word 0x04001042 +_02241068: .word 0x04000040 +_0224106C: .word 0x04000042 + arm_func_end ov13_02240F58 + + arm_func_start ov13_02241070 +ov13_02241070: ; 0x02241070 + cmp r1, #3 + addls pc, pc, r1, lsl #2 + bx lr +_0224107C: ; jump table + b _0224108C ; case 0 + b _022410DC ; case 1 + b _0224112C ; case 2 + b _0224117C ; case 3 +_0224108C: + cmp r0, #1 + bne _022410B8 + ldr r0, _022411CC ; =0x04001048 + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f + orr r1, r0, r2 + ldr r0, _022411CC ; =0x04001048 + orrne r1, r1, #0x20 + strh r1, [r0] + bx lr +_022410B8: + ldr r0, _022411D0 ; =0x04000048 + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f + orr r1, r0, r2 + ldr r0, _022411D0 ; =0x04000048 + orrne r1, r1, #0x20 + strh r1, [r0] + bx lr +_022410DC: + cmp r0, #1 + bne _02241108 + ldr r0, _022411CC ; =0x04001048 + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f00 + orr r1, r0, r2, lsl #8 + ldr r0, _022411CC ; =0x04001048 + orrne r1, r1, #0x2000 + strh r1, [r0] + bx lr +_02241108: + ldr r0, _022411D0 ; =0x04000048 + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f00 + orr r1, r0, r2, lsl #8 + ldr r0, _022411D0 ; =0x04000048 + orrne r1, r1, #0x2000 + strh r1, [r0] + bx lr +_0224112C: + cmp r0, #1 + bne _02241158 + ldr r0, _022411D4 ; =0x0400104A + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f00 + orr r1, r0, r2, lsl #8 + ldr r0, _022411D4 ; =0x0400104A + orrne r1, r1, #0x2000 + strh r1, [r0] + bx lr +_02241158: + ldr r0, _022411D8 ; =0x0400004A + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f00 + orr r1, r0, r2, lsl #8 + ldr r0, _022411D8 ; =0x0400004A + orrne r1, r1, #0x2000 + strh r1, [r0] + bx lr +_0224117C: + cmp r0, #1 + bne _022411A8 + ldr r0, _022411D4 ; =0x0400104A + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f + orr r1, r0, r2 + ldr r0, _022411D4 ; =0x0400104A + orrne r1, r1, #0x20 + strh r1, [r0] + bx lr +_022411A8: + ldr r0, _022411D8 ; =0x0400004A + cmp r3, #0 + ldrh r0, [r0] + bic r0, r0, #0x3f + orr r1, r0, r2 + ldr r0, _022411D8 ; =0x0400004A + orrne r1, r1, #0x20 + strh r1, [r0] + bx lr + .balign 4, 0 +_022411CC: .word 0x04001048 +_022411D0: .word 0x04000048 +_022411D4: .word 0x0400104A +_022411D8: .word 0x0400004A + arm_func_end ov13_02241070 + + arm_func_start ov13_022411DC +ov13_022411DC: ; 0x022411DC + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, #0 + mov r2, #0x40000 + bl MI_CpuFill8 + mov r0, r4 + mov r1, #0x40000 + mov r2, #0 + bl NNS_FndCreateExpHeapEx + ldr r1, _02241218 ; =ov13_0224F5E4 + cmp r0, #0 + str r0, [r1] + ldmneia sp!, {r4, pc} + bl OS_Terminate + ldmia sp!, {r4, pc} + .balign 4, 0 +_02241218: .word ov13_0224F5E4 + arm_func_end ov13_022411DC + + arm_func_start ov13_0224121C +ov13_0224121C: ; 0x0224121C + stmdb sp!, {r3, lr} + ldr r0, _0224123C ; =ov13_0224F5E4 + ldr r0, [r0] + bl NNS_FndDestroyExpHeap + ldr r0, _0224123C ; =ov13_0224F5E4 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0224123C: .word ov13_0224F5E4 + arm_func_end ov13_0224121C + + arm_func_start ov13_02241240 +ov13_02241240: ; 0x02241240 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #1 + mov r4, r1 + bl OS_DisableIrqMask + ldr r1, _02241288 ; =ov13_0224F5E4 + mov r5, r0 + ldr r0, [r1] + mov r1, r6 + mov r2, r4 + bl NNS_FndAllocFromExpHeapEx + movs r4, r0 + bne _02241278 + bl OS_Terminate +_02241278: + mov r0, r5 + bl OS_EnableIrqMask + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02241288: .word ov13_0224F5E4 + arm_func_end ov13_02241240 + + arm_func_start ov13_0224128C +ov13_0224128C: ; 0x0224128C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov13_02241240 + mov r2, r4 + mov r1, #0 + mov r4, r0 + bl MI_CpuFill8 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov13_0224128C + + arm_func_start ov13_022412B0 +ov13_022412B0: ; 0x022412B0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #1 + bl OS_DisableIrqMask + ldr r1, [r5] + mov r4, r0 + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _022412F0 ; =ov13_0224F5E4 + ldr r0, [r0] + bl NNS_FndFreeToExpHeap + mov r0, r4 + bl OS_EnableIrqMask + mov r0, #0 + str r0, [r5] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022412F0: .word ov13_0224F5E4 + arm_func_end ov13_022412B0 + + arm_func_start ov13_022412F4 +ov13_022412F4: ; 0x022412F4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #1 + bl OS_DisableIrqMask + mov r4, r0 + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _0224132C ; =ov13_0224F5E4 + mov r1, r5 + ldr r0, [r0] + bl NNS_FndFreeToExpHeap + mov r0, r4 + bl OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224132C: .word ov13_0224F5E4 + arm_func_end ov13_022412F4 + + arm_func_start ov13_02241330 +ov13_02241330: ; 0x02241330 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov r0, #0x3a + mov r1, #4 + bl ov13_0224128C + ldr r1, _022413A8 ; =ov13_0224F5E8 + str r0, [r1, #4] + add r0, sp, #0 + bl TP_GetUserInfo + cmp r0, #0 + bne _02241360 + bl OS_Terminate +_02241360: + add r0, sp, #0 + bl TP_SetCalibrateParam + ldr r1, _022413A8 ; =ov13_0224F5E8 + mov r0, #0 + ldr r2, [r1, #4] + mov r1, #4 + mov r3, #5 + bl TP_RequestAutoSamplingStartAsync + mov r0, #2 + bl TP_WaitBusy + mov r0, #2 + bl TP_CheckBusy + cmp r0, #0 + beq _0224139C + bl OS_Terminate +_0224139C: + bl ov13_022413E4 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022413A8: .word ov13_0224F5E8 + arm_func_end ov13_02241330 + + arm_func_start ov13_022413AC +ov13_022413AC: ; 0x022413AC + stmdb sp!, {r3, r4, r5, lr} + mov r5, #4 + mov r4, r5 +_022413B8: + bl TP_RequestAutoSamplingStopAsync + mov r0, r5 + bl TP_WaitBusy + mov r0, r4 + bl TP_CheckBusy + cmp r0, #0 + bne _022413B8 + ldr r0, _022413E0 ; =ov13_0224F5EC + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022413E0: .word ov13_0224F5EC + arm_func_end ov13_022413AC + + arm_func_start ov13_022413E4 +ov13_022413E4: ; 0x022413E4 + stmdb sp!, {r3, lr} + bl ov13_022413F4 + bl ov13_022414F8 + ldmia sp!, {r3, pc} + arm_func_end ov13_022413E4 + + arm_func_start ov13_022413F4 +ov13_022413F4: ; 0x022413F4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _022414E4 ; =0x04000130 + ldr r0, _022414E8 ; =0x027FFFA8 + ldrh r2, [r1] + ldrh r1, [r0] + ldr r4, _022414EC ; =ov13_0224F5E8 + ldr r0, _022414F0 ; =0x00002FFF + orr r1, r2, r1 + eor r1, r1, r0 + and r0, r1, r0 + ldr r5, [r4, #4] + mov r0, r0, lsl #0x10 + ldrh r1, [r5, #0x30] + mov ip, r0, lsr #0x10 + ldr r3, _022414F4 ; =ov13_0224F5F0 + eor r1, r1, r0, lsr #16 + and r1, r1, r0, lsr #16 + strh r1, [r5, #0x32] + ldrh r5, [r5, #0x30] + ldr r1, [r4, #4] + mov r2, #0 + eor r0, r5, r0, lsr #16 + and r0, r5, r0 + strh r0, [r1, #0x36] + ldr r0, [r4, #4] + mov r5, #0x28 + strh ip, [r0, #0x30] + ldr r1, [r4, #4] + ldrh r0, [r1, #0x32] + strh r0, [r1, #0x34] + mov r0, r2 + mov r1, #1 +_02241474: + mov r6, r1, lsl r2 + mov lr, r6, lsl #0x10 + tst ip, lr, lsr #16 + streqb r0, [r3] + beq _022414D0 + ldrb r6, [r3] + add r7, r6, #1 + and r6, r7, #0xff + strb r7, [r3] + cmp r6, #0x28 + bne _022414B4 + ldr r7, [r4, #4] + ldrh r6, [r7, #0x34] + orr r6, r6, lr, lsr #16 + strh r6, [r7, #0x34] + b _022414D0 +_022414B4: + cmp r6, #0x2f + bne _022414D0 + ldr r7, [r4, #4] + ldrh r6, [r7, #0x34] + orr r6, r6, lr, lsr #16 + strh r6, [r7, #0x34] + strb r5, [r3] +_022414D0: + add r2, r2, #1 + cmp r2, #0xe + add r3, r3, #1 + blt _02241474 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022414E4: .word 0x04000130 +_022414E8: .word 0x027FFFA8 +_022414EC: .word ov13_0224F5E8 +_022414F0: .word 0x00002FFF +_022414F4: .word ov13_0224F5F0 + arm_func_end ov13_022413F4 + + arm_func_start ov13_022414F8 +ov13_022414F8: ; 0x022414F8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r0, _02241690 ; =ov13_0224F5E8 + mov r5, #0 + ldr r0, [r0, #4] + ldrb r0, [r0, #0x38] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r6, #1 + moveq r6, #0 + bl TP_GetLatestIndexInAuto + ldr r7, _02241690 ; =ov13_0224F5E8 + mov r4, r5 + ldr r3, [r7, #4] + mov r8, #5 + ldrh r2, [r3, #0x28] + ldrh r1, [r3, #0x2a] + strh r2, [r3, #0x2c] + strh r1, [r3, #0x2e] +_02241544: + ldr r1, [r7, #4] + add r1, r1, r0, lsl #3 + ldrh r2, [r1, #4] + cmp r2, #1 + ldreqh r2, [r1, #6] + cmpeq r2, #0 + bne _02241588 + add r0, sp, #0 + mov r5, #1 + bl TP_GetCalibratedPoint + ldr r1, _02241690 ; =ov13_0224F5E8 + ldrh r0, [sp] + ldr r2, [r1, #4] + ldrh r1, [sp, #2] + add r2, r2, #0x28 + bl ov13_02240E50 + b _022415A0 +_02241588: + mov r1, r8 + add r4, r4, #1 + add r0, r0, #4 + bl FX_ModS32 + cmp r4, #4 + blt _02241544 +_022415A0: + ldr r0, _02241690 ; =ov13_0224F5E8 + eor r7, r5, r6 + ldr r4, [r0, #4] + and r1, r5, r7 + ldrb r3, [r4, #0x38] + and r2, r1, #0xff + and r1, r6, r7 + bic r3, r3, #2 + mov r2, r2, lsl #0x1f + orr r2, r3, r2, lsr #30 + strb r2, [r4, #0x38] + ldr r4, [r0, #4] + and r1, r1, #0xff + ldrb r3, [r4, #0x38] + mov r2, r1, lsl #0x1f + cmp r5, #0 + bic r3, r3, #8 + orr r2, r3, r2, lsr #28 + strb r2, [r4, #0x38] + ldr r3, [r0, #4] + and r1, r5, #1 + ldrb r2, [r3, #0x38] + addeq sp, sp, #8 + bic r2, r2, #1 + orr r1, r2, r1 + strb r1, [r3, #0x38] + ldr r3, [r0, #4] + ldrb r2, [r3, #0x38] + mov r1, r2, lsl #0x1e + mov r1, r1, lsr #0x1f + bic r2, r2, #4 + mov r1, r1, lsl #0x1f + orr r1, r2, r1, lsr #29 + strb r1, [r3, #0x38] + moveq r1, #0 + streqb r1, [r0, #1] + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r1, [r0, #1] + add r2, r1, #1 + and r1, r2, #0xff + strb r2, [r0, #1] + cmp r1, #0x28 + bne _02241664 + ldr r1, [r0, #4] + add sp, sp, #8 + ldrb r0, [r1, #0x38] + orr r0, r0, #4 + strb r0, [r1, #0x38] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02241664: + cmp r1, #0x2f + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r3, [r0, #4] + mov r1, #0x28 + ldrb r2, [r3, #0x38] + orr r2, r2, #4 + strb r2, [r3, #0x38] + strb r1, [r0, #1] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02241690: .word ov13_0224F5E8 + arm_func_end ov13_022414F8 + + arm_func_start ov13_02241694 +ov13_02241694: ; 0x02241694 + ldr r1, _022416CC ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _022416D0 ; =ov13_0224F5E8 + ldr r1, [r1, #4] + ldrh r1, [r1, #0x32] + and r1, r0, r1 + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_022416CC: .word 0x027FFFA8 +_022416D0: .word ov13_0224F5E8 + arm_func_end ov13_02241694 + + arm_func_start ov13_022416D4 +ov13_022416D4: ; 0x022416D4 + ldr r1, _0224170C ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _02241710 ; =ov13_0224F5E8 + ldr r1, [r1, #4] + ldrh r1, [r1, #0x34] + and r1, r0, r1 + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_0224170C: .word 0x027FFFA8 +_02241710: .word ov13_0224F5E8 + arm_func_end ov13_022416D4 + + arm_func_start ov13_02241714 +ov13_02241714: ; 0x02241714 + ldr r1, _0224174C ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _02241750 ; =ov13_0224F5E8 + ldr r1, [r1, #4] + ldrh r1, [r1, #0x36] + and r1, r0, r1 + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_0224174C: .word 0x027FFFA8 +_02241750: .word ov13_0224F5E8 + arm_func_end ov13_02241714 + + arm_func_start ov13_02241754 +ov13_02241754: ; 0x02241754 + ldr r1, _022417D4 ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _022417D8 ; =ov13_0224F5E8 + ldr r3, [r1, #4] + ldrb r1, [r3, #0x38] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + moveq r0, #0 + bxeq lr + ldrh r2, [r3, #0x28] + ldrh r1, [r0] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r1, [r0, #4] + cmp r1, r2 + movlo r0, #0 + bxlo lr + ldrh r2, [r3, #0x2a] + ldrh r1, [r0, #2] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r0, [r0, #6] + cmp r0, r2 + movhs r0, #1 + movlo r0, #0 + bx lr + .balign 4, 0 +_022417D4: .word 0x027FFFA8 +_022417D8: .word ov13_0224F5E8 + arm_func_end ov13_02241754 + + arm_func_start ov13_022417DC +ov13_022417DC: ; 0x022417DC + ldr r1, _0224185C ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _02241860 ; =ov13_0224F5E8 + ldr r3, [r1, #4] + ldrb r1, [r3, #0x38] + mov r1, r1, lsl #0x1e + movs r1, r1, lsr #0x1f + moveq r0, #0 + bxeq lr + ldrh r2, [r3, #0x28] + ldrh r1, [r0] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r1, [r0, #4] + cmp r1, r2 + movlo r0, #0 + bxlo lr + ldrh r2, [r3, #0x2a] + ldrh r1, [r0, #2] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r0, [r0, #6] + cmp r0, r2 + movhs r0, #1 + movlo r0, #0 + bx lr + .balign 4, 0 +_0224185C: .word 0x027FFFA8 +_02241860: .word ov13_0224F5E8 + arm_func_end ov13_022417DC + + arm_func_start ov13_02241864 +ov13_02241864: ; 0x02241864 + ldr r1, _022418E4 ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _022418E8 ; =ov13_0224F5E8 + ldr r3, [r1, #4] + ldrb r1, [r3, #0x38] + mov r1, r1, lsl #0x1d + movs r1, r1, lsr #0x1f + moveq r0, #0 + bxeq lr + ldrh r2, [r3, #0x28] + ldrh r1, [r0] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r1, [r0, #4] + cmp r1, r2 + movlo r0, #0 + bxlo lr + ldrh r2, [r3, #0x2a] + ldrh r1, [r0, #2] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r0, [r0, #6] + cmp r0, r2 + movhs r0, #1 + movlo r0, #0 + bx lr + .balign 4, 0 +_022418E4: .word 0x027FFFA8 +_022418E8: .word ov13_0224F5E8 + arm_func_end ov13_02241864 + + arm_func_start ov13_022418EC +ov13_022418EC: ; 0x022418EC + ldr r1, _0224196C ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _02241970 ; =ov13_0224F5E8 + ldr r3, [r1, #4] + ldrb r1, [r3, #0x38] + mov r1, r1, lsl #0x1c + movs r1, r1, lsr #0x1f + moveq r0, #0 + bxeq lr + ldrh r2, [r3, #0x28] + ldrh r1, [r0] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r1, [r0, #4] + cmp r1, r2 + movlo r0, #0 + bxlo lr + ldrh r2, [r3, #0x2a] + ldrh r1, [r0, #2] + cmp r1, r2 + movhi r0, #0 + bxhi lr + ldrh r0, [r0, #6] + cmp r0, r2 + movhs r0, #1 + movlo r0, #0 + bx lr + .balign 4, 0 +_0224196C: .word 0x027FFFA8 +_02241970: .word ov13_0224F5E8 + arm_func_end ov13_022418EC + + arm_func_start ov13_02241974 +ov13_02241974: ; 0x02241974 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r1, _022419D8 ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + addne sp, sp, #8 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldrh r1, [r0] + strh r1, [sp] + ldrh r1, [r0, #2] + strh r1, [sp, #2] + ldrh r2, [r0] + ldrh r1, [r0, #4] + add r1, r2, r1 + strh r1, [sp, #4] + ldrh r2, [r0, #2] + ldrh r1, [r0, #6] + add r0, sp, #0 + add r1, r2, r1 + strh r1, [sp, #6] + bl ov13_022417DC + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022419D8: .word 0x027FFFA8 + arm_func_end ov13_02241974 + + arm_func_start ov13_022419DC +ov13_022419DC: ; 0x022419DC + ldr r1, _02241A3C ; =0x027FFFA8 + ldrh r1, [r1] + and r1, r1, #0x8000 + movs r1, r1, asr #0xf + movne r0, #0 + bxne lr + ldr r1, _02241A40 ; =ov13_0224F5E8 + ldr r3, [r1, #4] + ldrb r1, [r3, #0x38] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + bne _02241A24 + ldrh r2, [r3, #0x2c] + ldrh r1, [r3, #0x2e] + strh r2, [r0] + strh r1, [r0, #2] + mov r0, #0 + bx lr +_02241A24: + ldrh r2, [r3, #0x28] + ldrh r1, [r3, #0x2a] + strh r2, [r0] + strh r1, [r0, #2] + mov r0, #1 + bx lr + .balign 4, 0 +_02241A3C: .word 0x027FFFA8 +_02241A40: .word ov13_0224F5E8 + arm_func_end ov13_022419DC + + arm_func_start ov13_02241A44 +ov13_02241A44: ; 0x02241A44 + stmdb sp!, {r3, lr} + ldr r0, _02241AB8 ; =ov13_0224F5E8 + ldrb r0, [r0] + cmp r0, #0 + ldr r0, _02241ABC ; =0x027FFFA8 + beq _02241A8C + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + ldmneia sp!, {r3, pc} + mov r0, #1 + bl PM_SetLCDPower + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _02241AB8 ; =ov13_0224F5E8 + mov r1, #0 + strb r1, [r0] + ldmia sp!, {r3, pc} +_02241A8C: + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + ldmeqia sp!, {r3, pc} + mov r0, #0 + bl PM_SetLCDPower + cmp r0, #0 + ldrne r0, _02241AB8 ; =ov13_0224F5E8 + movne r1, #1 + strneb r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241AB8: .word ov13_0224F5E8 +_02241ABC: .word 0x027FFFA8 + arm_func_end ov13_02241A44 + + arm_func_start ov13_02241AC0 +ov13_02241AC0: ; 0x02241AC0 + stmdb sp!, {r3, lr} + ldr r0, _02241B20 ; =0x04000210 + ldr r1, _02241B24 ; =ov13_0224F600 + ldr r2, [r0] + ldr r0, _02241B28 ; =0x00040018 + str r2, [r1, #4] + bl OS_SetIrqMask + mov r0, #1 + bl OS_EnableIrqMask + mov r0, #1 + bl OS_GetIrqFunction + ldr r2, _02241B24 ; =ov13_0224F600 + ldr r1, _02241B2C ; =ov13_02241B70 + str r0, [r2] + mov r0, #1 + bl OS_SetIrqFunction + mov r0, #1 + bl OS_ResetRequestIrqMask + ldr r2, _02241B30 ; =0x04000208 + mov r0, #1 + ldrh r1, [r2] + strh r0, [r2] + bl OS_EnableInterrupts + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241B20: .word 0x04000210 +_02241B24: .word ov13_0224F600 +_02241B28: .word 0x00040018 +_02241B2C: .word ov13_02241B70 +_02241B30: .word 0x04000208 + arm_func_end ov13_02241AC0 + + arm_func_start ov13_02241B34 +ov13_02241B34: ; 0x02241B34 + stmdb sp!, {r3, lr} + ldr r2, _02241B68 ; =0x04000208 + mov r1, #0 + ldrh r0, [r2] + ldr r0, _02241B6C ; =ov13_0224F600 + strh r1, [r2] + ldr r0, [r0, #4] + bl OS_SetIrqMask + ldr r1, _02241B6C ; =ov13_0224F600 + mov r0, #1 + ldr r1, [r1] + bl OS_SetIrqFunction + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241B68: .word 0x04000208 +_02241B6C: .word ov13_0224F600 + arm_func_end ov13_02241B34 + + arm_func_start ov13_02241B70 +ov13_02241B70: ; 0x02241B70 + stmdb sp!, {r3, lr} + mov r0, #1 + bl ov13_02242478 + ldr r0, _02241B94 ; =0x027E0000 + add r0, r0, #0x3000 + ldr r1, [r0, #0xff8] + orr r1, r1, #1 + str r1, [r0, #0xff8] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241B94: .word 0x027E0000 + arm_func_end ov13_02241B70 + + arm_func_start ov13_02241B98 +ov13_02241B98: ; 0x02241B98 + stmdb sp!, {r3, lr} + mov r0, #0x10 + mov r1, #4 + bl ov13_0224128C + mov r2, #0 + str r2, [r0] + add r1, r0, #8 + str r1, [r0, #4] + str r0, [r0, #8] + str r2, [r0, #0xc] + ldmia sp!, {r3, pc} + arm_func_end ov13_02241B98 + + arm_func_start ov13_02241BC4 +ov13_02241BC4: ; 0x02241BC4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r0, sp, #8 + bl ov13_022412B0 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov13_02241BC4 + + arm_func_start ov13_02241BE0 +ov13_02241BE0: ; 0x02241BE0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + bl OS_DisableIrqMask + ldmia r4, {r2, r3} + str r3, [r2, #4] + ldr r3, [r4] + ldr r2, [r4, #4] + mov r1, #0 + str r3, [r2] + str r1, [r4, #4] + str r1, [r4] + bl OS_EnableIrqMask + ldmia sp!, {r4, pc} + arm_func_end ov13_02241BE0 + + arm_func_start ov13_02241C18 +ov13_02241C18: ; 0x02241C18 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #1 + mov r4, r1 + bl OS_DisableIrqMask + ldr r1, [r5] + str r4, [r1, #4] + ldr r1, [r5] + stmia r4, {r1, r5} + str r4, [r5] + bl OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov13_02241C18 + + arm_func_start ov13_02241C48 +ov13_02241C48: ; 0x02241C48 + ldr ip, _02241C54 ; =ov13_02241C18 + add r0, r0, #8 + bx ip + .balign 4, 0 +_02241C54: .word ov13_02241C18 + arm_func_end ov13_02241C48 + + arm_func_start ov13_02241C58 +ov13_02241C58: ; 0x02241C58 + ldr ip, _02241C64 ; =ov13_02241C18 + ldr r0, [r0, #4] + bx ip + .balign 4, 0 +_02241C64: .word ov13_02241C18 + arm_func_end ov13_02241C58 + + arm_func_start ov13_02241C68 +ov13_02241C68: ; 0x02241C68 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r0, _02241CF8 ; =0x0000080C + mov r1, #4 + bl ov13_0224128C + mov r1, r0 + ldr r3, _02241CFC ; =ov13_0224F608 + mov r0, #0x200 + mov r2, #0x800 + str r1, [r3] + bl MIi_CpuClearFast + mov r5, #0 + ldr r7, _02241CFC ; =ov13_0224F608 + mov r6, r5 + mov r4, #0x40 + mov r8, #8 +_02241CA4: + ldr r1, [r7] + mov r0, r4 + mov r2, r8 + add r1, r1, r6 + bl ov13_0224022C + ldr r1, [r7] + add r6, r6, #0x400 + add r1, r1, r5, lsl #2 + add r5, r5, #1 + str r0, [r1, #0x800] + cmp r5, #2 + blt _02241CA4 + ldr r1, _02241D00 ; =ov13_02241D04 + mov r0, #1 + mov r2, #0 + mov r3, #0xc8 + bl ov13_02242528 + ldr r1, _02241CFC ; =ov13_0224F608 + ldr r1, [r1] + str r0, [r1, #0x808] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02241CF8: .word 0x0000080C +_02241CFC: .word ov13_0224F608 +_02241D00: .word ov13_02241D04 + arm_func_end ov13_02241C68 + + arm_func_start ov13_02241D04 +ov13_02241D04: ; 0x02241D04 + stmdb sp!, {r3, lr} + ldr r0, _02241D48 ; =ov13_0224F608 + mov r1, #0x800 + ldr r0, [r0] + bl DC_FlushRange + ldr r0, _02241D48 ; =ov13_0224F608 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x400 + bl GX_LoadOAM + ldr r0, _02241D48 ; =ov13_0224F608 + mov r1, #0 + ldr r0, [r0] + mov r2, #0x400 + add r0, r0, #0x400 + bl GXS_LoadOAM + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241D48: .word ov13_0224F608 + arm_func_end ov13_02241D04 + + arm_func_start ov13_02241D4C +ov13_02241D4C: ; 0x02241D4C + stmdb sp!, {r3, lr} + ldr r1, _02241D70 ; =ov13_0224F608 + mov r0, #1 + ldr r1, [r1] + ldr r1, [r1, #0x808] + bl ov13_022425F0 + ldr r0, _02241D74 ; =ov13_0224F608 + bl ov13_022412B0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02241D70: .word ov13_0224F608 +_02241D74: .word ov13_0224F608 + arm_func_end ov13_02241D4C + + arm_func_start ov13_02241D78 +ov13_02241D78: ; 0x02241D78 + ldr r1, _02241D90 ; =ov13_0224F608 + ldr ip, _02241D94 ; =ov13_022402E0 + ldr r1, [r1] + add r0, r1, r0, lsl #2 + ldr r0, [r0, #0x800] + bx ip + .balign 4, 0 +_02241D90: .word ov13_0224F608 +_02241D94: .word ov13_022402E0 + arm_func_end ov13_02241D78 + + arm_func_start ov13_02241D98 +ov13_02241D98: ; 0x02241D98 + mov r1, r0 + ldr r3, [r1] + ldr r0, _02241DD8 ; =0xC1FFFCFF + ldr r2, _02241DDC ; =ov13_0224F608 + and r0, r3, r0 + orr r0, r0, #0x200 + str r0, [r1] + ldr r3, [r2] + mov r2, #0 + add r0, r3, #0x400 + cmp r1, r0 + movhs r2, #1 + add r0, r3, r2, lsl #2 + ldr ip, _02241DE0 ; =ov13_02240288 + ldr r0, [r0, #0x800] + bx ip + .balign 4, 0 +_02241DD8: .word 0xC1FFFCFF +_02241DDC: .word ov13_0224F608 +_02241DE0: .word ov13_02240288 + arm_func_end ov13_02241D98 + + arm_func_start ov13_02241DE4 +ov13_02241DE4: ; 0x02241DE4 + ldr r2, _02241DF8 ; =ov13_0224F608 + ldr r2, [r2] + add r0, r2, r0, lsl #10 + add r0, r0, r1, lsl #3 + bx lr + .balign 4, 0 +_02241DF8: .word ov13_0224F608 + arm_func_end ov13_02241DE4 + + arm_func_start ov13_02241DFC +ov13_02241DFC: ; 0x02241DFC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r0, #0x340 + mov r1, #4 + bl ov13_0224128C + ldr r4, _02241EB8 ; =ov13_0224F60C + mov sb, #0 + mov sl, sb + str r0, [r4] + mov r8, #0x20 + mov r7, #0xc + mov r6, #0x300 + mov r5, #0x400 +_02241E2C: + ldr r1, [r4] + mov r0, r8 + mov r2, r7 + add r1, r1, sl + bl ov13_0224022C + ldr r1, [r4] + add r1, r1, sl + str r0, [r1, #0x19c] + bl ov13_02241B98 + ldr r1, [r4] + add r1, r1, sl + str r0, [r1, #0x198] + ldr r0, [r4] + add r0, r0, sl + add r0, r0, #0x100 + strh r6, [r0, #0x88] + ldr r0, [r4] + add r0, r0, sl + add r0, r0, #0x100 + strh r5, [r0, #0x94] + ldr r0, [r4] + add r1, r0, sl + ldr r0, [r1, #0x198] + add r1, r1, #0x180 + bl ov13_02241C58 + ldr r0, [r4] + add r1, r0, sl + ldr r0, [r1, #0x198] + add r1, r1, #0x18c + bl ov13_02241C48 + add sb, sb, #1 + cmp sb, #2 + add sl, sl, #0x1a0 + blt _02241E2C + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02241EB8: .word ov13_0224F60C + arm_func_end ov13_02241DFC + + arm_func_start ov13_02241EBC +ov13_02241EBC: ; 0x02241EBC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r5, r0 + mov r0, #0x1a0 + mul sb, r5, r0 + ldr r0, _02242030 ; =ov13_0224F60C + mov r6, r1 + ldr r0, [r0] + mov sl, r2 + add r0, r0, sb + ldr r0, [r0, #0x19c] + mov r4, r3 + bl ov13_022402E0 + add r1, r6, #3 + bic r1, r1, #3 + mov r6, r0 + mov r8, r1, asr #2 + mov r0, #1 + strh r8, [r6, #0xa] + bl OS_DisableIrqMask + mov r7, r0 + cmp sl, #0 + mov r0, #0x1a0 + beq _02241F98 + ldr r1, _02242030 ; =ov13_0224F60C + ldr r1, [r1] + mla r0, r5, r0, r1 + add r5, r0, #0x180 + add r0, r0, #0x18c + cmp r5, r0 + beq _02241F78 + add r0, r1, sb + add r1, r0, #0x18c +_02241F3C: + ldr r0, [r5, #4] + ldrh sl, [r5, #8] + ldrh r3, [r5, #0xa] + ldrh r2, [r0, #8] + add sl, sl, r3 + add r3, sl, r8 + cmp r3, r2 + bgt _02241F6C + mov r1, r6 + strh sl, [r6, #8] + bl ov13_02241C18 + b _02241F78 +_02241F6C: + mov r5, r0 + cmp r0, r1 + bne _02241F3C +_02241F78: + ldr r0, _02242030 ; =ov13_0224F60C + ldr r0, [r0] + add r0, r0, sb + add r0, r0, #0x18c + cmp r5, r0 + bne _02242018 + bl OS_Terminate + b _02242018 +_02241F98: + ldr r1, _02242030 ; =ov13_0224F60C + ldr r1, [r1] + mla r0, r5, r0, r1 + add r5, r0, #0x18c + add r0, r0, #0x180 + cmp r5, r0 + beq _02241FFC + add r0, r1, sb + add r0, r0, #0x180 +_02241FBC: + ldr sl, [r5] + ldrh r3, [r5, #8] + ldrh r2, [sl, #8] + ldrh r1, [sl, #0xa] + sub r3, r3, r8 + add r1, r2, r1 + cmp r3, r1 + blt _02241FF0 + mov r0, r5 + mov r1, r6 + strh r3, [r6, #8] + bl ov13_02241C18 + b _02241FFC +_02241FF0: + mov r5, sl + cmp sl, r0 + bne _02241FBC +_02241FFC: + ldr r0, _02242030 ; =ov13_0224F60C + ldr r0, [r0] + add r0, r0, sb + add r0, r0, #0x180 + cmp r5, r0 + bne _02242018 + bl OS_Terminate +_02242018: + ldrh r1, [r6, #8] + mov r0, r7 + str r1, [r4] + bl OS_EnableIrqMask + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02242030: .word ov13_0224F60C + arm_func_end ov13_02241EBC + + arm_func_start ov13_02242034 +ov13_02242034: ; 0x02242034 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, #0 + bl ov13_02241BE0 + ldr r0, _02242070 ; =ov13_0224F60C + ldr r1, [r0] + add r0, r1, #0x1a0 + cmp r5, r0 + movhs r4, #1 + mov r0, #0x1a0 + mla r0, r4, r0, r1 + ldr r0, [r0, #0x19c] + mov r1, r5 + bl ov13_02240288 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02242070: .word ov13_0224F60C + arm_func_end ov13_02242034 + + arm_func_start ov13_02242074 +ov13_02242074: ; 0x02242074 + cmp r1, #0 + mov r3, #0 + ble _02242098 +_02242080: + ldrb r2, [r0, r3] + cmp r2, #0 + beq _02242098 + add r3, r3, #1 + cmp r3, r1 + blt _02242080 +_02242098: + mov r0, r3 + bx lr + arm_func_end ov13_02242074 + + arm_func_start ov13_022420A0 +ov13_022420A0: ; 0x022420A0 + stmdb sp!, {r3, lr} + bl GX_DisableBankForBG + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1] + bl GX_DisableBankForOBJ + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #4] + bl GX_DisableBankForBGExtPltt + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #8] + bl GX_DisableBankForOBJExtPltt + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0xc] + bl GX_DisableBankForTex + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x10] + bl GX_DisableBankForTexPltt + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x14] + bl GX_DisableBankForClearImage + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x18] + bl GX_DisableBankForSubBG + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x1c] + bl GX_DisableBankForSubOBJ + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x20] + bl GX_DisableBankForSubBGExtPltt + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x24] + bl GX_DisableBankForSubOBJExtPltt + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x28] + bl GX_DisableBankForARM7 + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x2c] + bl GX_DisableBankForLCDC + ldr r1, _02242150 ; =ov13_0224F610 + str r0, [r1, #0x30] + ldr r0, [r1, #0x2c] + bl GX_SetBankForARM7 + bl ov13_0224225C + ldmia sp!, {r3, pc} + .balign 4, 0 +_02242150: .word ov13_0224F610 + arm_func_end ov13_022420A0 + + arm_func_start ov13_02242154 +ov13_02242154: ; 0x02242154 + stmdb sp!, {r4, lr} + bl GX_DisableBankForBG + bl GX_DisableBankForOBJ + bl GX_DisableBankForSubBG + bl GX_DisableBankForSubOBJ + bl ov13_0224225C + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0] + bl GX_SetBankForBG + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #4] + bl GX_SetBankForOBJ + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #8] + bl GX_SetBankForBGExtPltt + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0xc] + bl GX_SetBankForOBJExtPltt + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x10] + bl GX_SetBankForTex + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x14] + bl GX_SetBankForTexPltt + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x18] + bl GX_SetBankForClearImage + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x1c] + bl GX_SetBankForSubBG + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x20] + bl GX_SetBankForSubOBJ + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x24] + bl GX_SetBankForSubBGExtPltt + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x28] + bl GX_SetBankForSubOBJExtPltt + ldr r0, _02242250 ; =ov13_0224F610 + ldr r0, [r0, #0x30] + bl GX_SetBankForLCDC + mov r3, #0 + ldr r2, _02242254 ; =0x04000050 + ldr r0, _02242258 ; =0x04001014 + strh r3, [r2] + add r1, r2, #0x1000 + strh r3, [r1] + str r3, [r2, #-0x40] + str r3, [r2, #-0x3c] + str r3, [r2, #-0x38] + str r3, [r2, #-0x34] + str r3, [r2, #0xfc0] + str r3, [r0] + str r3, [r0, #4] + str r3, [r0, #8] + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #1 + bl PM_SetLCDPower + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .balign 4, 0 +_02242250: .word ov13_0224F610 +_02242254: .word 0x04000050 +_02242258: .word 0x04001014 + arm_func_end ov13_02242154 + + arm_func_start ov13_0224225C +ov13_0224225C: ; 0x0224225C + stmdb sp!, {r3, lr} + ldr r0, _022422D0 ; =0x000001F3 + bl GX_SetBankForLCDC + mov r0, #0 + mov r1, #0x6800000 + mov r2, #0x40000 + bl MIi_CpuClearFast + ldr r1, _022422D4 ; =0x06880000 + mov r0, #0 + mov r2, #0x24000 + bl MIi_CpuClearFast + bl GX_DisableBankForLCDC + mov r0, #0x200 + mov r1, #0x7000000 + mov r2, #0x400 + bl MIi_CpuClearFast + mov r0, #0 + mov r1, #0x5000000 + mov r2, #0x400 + bl MIi_CpuClearFast + mov r0, #0x200 + ldr r1, _022422D8 ; =0x07000400 + mov r2, #0x400 + bl MIi_CpuClearFast + mov r0, #0 + ldr r1, _022422DC ; =0x05000400 + mov r2, #0x400 + bl MIi_CpuClearFast + ldmia sp!, {r3, pc} + .balign 4, 0 +_022422D0: .word 0x000001F3 +_022422D4: .word 0x06880000 +_022422D8: .word 0x07000400 +_022422DC: .word 0x05000400 + arm_func_end ov13_0224225C + + arm_func_start ov13_022422E0 +ov13_022422E0: ; 0x022422E0 + stmdb sp!, {r3, lr} + add r0, sp, #0 + bl PM_GetLEDPattern + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, [sp] + cmp r0, #0xf + ldmeqia sp!, {r3, pc} + mov r0, #0xf + bl PMi_SendLEDPatternCommand + ldmia sp!, {r3, pc} + arm_func_end ov13_022422E0 + + arm_func_start ov13_0224230C +ov13_0224230C: ; 0x0224230C + ldr ip, _02242318 ; =PMi_SendLEDPatternCommand + mov r0, #1 + bx ip + .balign 4, 0 +_02242318: .word PMi_SendLEDPatternCommand + arm_func_end ov13_0224230C + + arm_func_start ov13_0224231C +ov13_0224231C: ; 0x0224231C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r0, #0x80 + mov r1, #4 + bl ov13_0224128C + mov r8, #0 + ldr r4, _02242428 ; =ov13_0224F644 + ldr sb, _0224242C ; =ov13_02245960 + mov sl, r8 + str r0, [r4] + mov r7, r8 + mov r6, #0xff + mov r5, #1 + mov fp, #0x14 +_02242350: + ldr r0, [r4] + ldrb r2, [sb] + add r0, r0, r8, lsl #6 + mov r1, #4 + str r2, [r0, #0x34] + ldrb r2, [sb] + mul r0, r2, fp + bl ov13_0224128C + ldr r1, [r4] + mov r2, #0x14 + add r1, r1, r8, lsl #6 + str r0, [r1, #0x3c] + ldr r1, [r4] + ldrb r0, [sb] + add r1, r1, r8, lsl #6 + ldr r1, [r1, #0x3c] + bl ov13_0224022C + ldr r1, [r4] + str r0, [r1, r8, lsl #6] + ldrb r0, [sb], #1 + bl ov13_022401F8 + ldr r1, [r4] + add r1, r1, r8, lsl #6 + str r0, [r1, #4] + bl ov13_02241B98 + ldr r1, [r4] + add r1, r1, r8, lsl #6 + str r0, [r1, #8] + ldr r0, [r4] + add r0, r0, r8, lsl #6 + strb r7, [r0, #0x1c] + ldr r0, [r4] + add r0, r0, r8, lsl #6 + strb r6, [r0, #0x30] + ldr r1, [r4] + add r0, r1, r8, lsl #6 + add r1, r1, sl + ldr r0, [r0, #8] + add r1, r1, #0xc + bl ov13_02241C58 + ldr r1, [r4] + add r0, r1, r8, lsl #6 + add r1, r1, sl + ldr r0, [r0, #8] + add r1, r1, #0x20 + bl ov13_02241C48 + ldr r0, [r4] + add sl, sl, #0x40 + add r0, r0, r8, lsl #6 + add r8, r8, #1 + strb r5, [r0, #0x38] + cmp r8, #2 + blt _02242350 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02242428: .word ov13_0224F644 +_0224242C: .word ov13_02245960 + arm_func_end ov13_0224231C + + arm_func_start ov13_02242430 +ov13_02242430: ; 0x02242430 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _02242470 ; =ov13_0224F644 + mov r5, #0 +_0224243C: + ldr r0, [r4] + add r0, r0, r5, lsl #6 + ldr r0, [r0, #8] + bl ov13_02241BC4 + ldr r0, [r4] + ldr r0, [r0, r5, lsl #6] + bl ov13_0224026C + add r5, r5, #1 + cmp r5, #2 + blt _0224243C + ldr r0, _02242474 ; =ov13_0224F644 + bl ov13_022412B0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02242470: .word ov13_0224F644 +_02242474: .word ov13_0224F644 + arm_func_end ov13_02242430 + + arm_func_start ov13_02242478 +ov13_02242478: ; 0x02242478 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, _02242524 ; =ov13_0224F644 + mov r6, r0 + ldr r0, [r5] + add r2, r0, r6, lsl #6 + ldrb r1, [r2, #0x38] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, [r2, #0x10] + add r1, r2, #0x20 + cmp r4, r1 + beq _022424D0 +_022424A8: + ldr r1, [r4, #0xc] + ldr r2, [r4, #8] + mov r0, r4 + blx r2 + ldr r0, [r5] + ldr r4, [r4, #4] + add r1, r0, r6, lsl #6 + add r1, r1, #0x20 + cmp r4, r1 + bne _022424A8 +_022424D0: + add r1, r0, r6, lsl #6 + ldr r1, [r1, #0x34] + mov r4, r6, lsl #6 + mov r5, #0 + cmp r1, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + ldr r7, _02242524 ; =ov13_0224F644 +_022424EC: + add r0, r4, r0 + ldr r0, [r0, #4] + bl ov13_022402E0 + movs r1, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + bl ov13_022425FC + ldr r0, [r7] + add r5, r5, #1 + add r1, r4, r0 + ldr r1, [r1, #0x34] + cmp r5, r1 + blt _022424EC + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02242524: .word ov13_0224F644 + arm_func_end ov13_02242478 + + arm_func_start ov13_02242528 +ov13_02242528: ; 0x02242528 + stmdb sp!, {r3, lr} + mov ip, #0 + str ip, [sp] + bl ov13_0224253C + ldmia sp!, {r3, pc} + arm_func_end ov13_02242528 + + arm_func_start ov13_0224253C +ov13_0224253C: ; 0x0224253C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _022425C4 ; =ov13_0224F644 + mov r7, r0 + ldr r0, [r4] + mov r8, r1 + ldr r0, [r0, r7, lsl #6] + mov r5, r2 + mov r6, r3 + bl ov13_022402E0 + mov r4, r0 + str r8, [r4, #8] + str r5, [r4, #0xc] + ldrb r1, [sp, #0x18] + strb r6, [r4, #0x10] + mov r0, #1 + strb r1, [r4, #0x11] + bl OS_DisableIrqMask + ldr r1, _022425C4 ; =ov13_0224F644 + mov r5, r0 + ldr r0, [r1] + add r0, r0, r7, lsl #6 + ldr r0, [r0, #0x10] +_02242594: + ldrb r1, [r0, #0x10] + cmp r6, r1 + bhs _022425AC + mov r1, r4 + bl ov13_02241C18 + b _022425B4 +_022425AC: + ldr r0, [r0, #4] + b _02242594 +_022425B4: + mov r0, r5 + bl OS_EnableIrqMask + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022425C4: .word ov13_0224F644 + arm_func_end ov13_0224253C + + arm_func_start ov13_022425C8 +ov13_022425C8: ; 0x022425C8 + str r1, [r0, #8] + bx lr + arm_func_end ov13_022425C8 + + arm_func_start ov13_022425D0 +ov13_022425D0: ; 0x022425D0 + ldr r2, _022425E8 ; =ov13_0224F644 + ldr ip, _022425EC ; =ov13_02240288 + ldr r2, [r2] + add r0, r2, r0, lsl #6 + ldr r0, [r0, #4] + bx ip + .balign 4, 0 +_022425E8: .word ov13_0224F644 +_022425EC: .word ov13_02240288 + arm_func_end ov13_022425D0 + + arm_func_start ov13_022425F0 +ov13_022425F0: ; 0x022425F0 + ldr ip, _022425F8 ; =ov13_022425FC + bx ip + .balign 4, 0 +_022425F8: .word ov13_022425FC + arm_func_end ov13_022425F0 + + arm_func_start ov13_022425FC +ov13_022425FC: ; 0x022425FC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldrb r1, [r4, #0x11] + mov r5, r0 + cmp r1, #0 + beq _0224261C + add r0, r4, #0xc + bl ov13_022412B0 +_0224261C: + mov r0, r4 + bl ov13_02241BE0 + ldr r0, _0224263C ; =ov13_0224F644 + mov r1, r4 + ldr r0, [r0] + ldr r0, [r0, r5, lsl #6] + bl ov13_02240288 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224263C: .word ov13_0224F644 + arm_func_end ov13_022425FC + + arm_func_start ov13_02242640 +ov13_02242640: ; 0x02242640 + ldr r2, _02242654 ; =ov13_0224F644 + ldr r2, [r2] + add r0, r2, r0, lsl #6 + strb r1, [r0, #0x38] + bx lr + .balign 4, 0 +_02242654: .word ov13_0224F644 + arm_func_end ov13_02242640 + + .rodata + +ov13_02244EB0: + .byte 0x0E, 0x04, 0x05, 0x00, 0x00, 0x00, 0xA8, 0x00 + +ov13_02244EB8: ; 0x02244EB8 + .byte 0x78, 0x00, 0x10, 0x00 + +ov13_02244EBC: ; 0x02244EBC + .byte 0x08, 0x00 + +ov13_02244EBE: ; 0x02244EBE + .byte 0xAC, 0x00 + .byte 0x84, 0x00, 0xAC, 0x00 + +ov13_02244EC4: ; 0x02244EC4 + .byte 0x27, 0x1F, 0x25, 0x00, 0x27, 0x00, 0x23, 0x1D, 0x21, 0x00, 0x59, 0x00 + .byte 0x27, 0x21 + +ov13_02244ED2: ; 0x02244ED2 + .byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01 + +ov13_02244EE0: ; 0x02244EE0 + .byte 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x0D, 0x00, 0x3C, 0x00, 0xE6, 0x00, 0x5E, 0x00 + .byte 0x0D, 0x00, 0x28, 0x00, 0xE6, 0x00, 0x70, 0x00 + +ov13_02244EF8: ; 0x02244EF8 + .byte 0x80, 0x04, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00 + .byte 0x80, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00 + .byte 0x80, 0x02, 0x00, 0x00 + +ov13_02244F14: ; 0x02244F14 + .byte 0x6B, 0x00 + +ov13_02244F16: ; 0x02244F16 + .byte 0x22, 0x00, 0x6C, 0x00, 0x22, 0x00, 0x7C, 0x00, 0x22, 0x00 + .byte 0x5D, 0x00, 0x22, 0x00, 0x5F, 0x00, 0x22, 0x00, 0x7D, 0x00, 0x22, 0x00, 0x50, 0x00, 0x22, 0x00 + +ov13_02244F30: ; 0x02244F30 + .byte 0x6A, 0x65, 0x66, 0x67, 0x69, 0x73, 0x6B, 0x00 + +ov13_02244F38: ; 0x02244F38 + .byte 0x0A, 0x0B, 0x04, 0x05, 0x02, 0x03, 0x0C, 0x0D + .byte 0xE5, 0x00, 0x26, 0x00 + +ov13_02244F44: ; 0x02244F44 + .byte 0x18, 0x17, 0x16, 0x15, 0x5F, 0x5E, 0x5D, 0x5C + +ov13_02244F4C: ; 0x02244F4C + .byte 0x02, 0x03, 0x00, 0x00 + +ov13_02244F50: ; 0x02244F50 + .byte 0x04, 0x05, 0x00, 0x00 + +ov13_02244F54: ; 0x02244F54 + .byte 0x3C, 0x3D, 0x00, 0x00 + +ov13_02244F58: ; 0x02244F58 + .byte 0x82, 0x83, 0x00, 0x00 + +ov13_02244F5C: ; 0x02244F5C + .byte 0x3A, 0x3B, 0x35, 0x39 + +ov13_02244F60: ; 0x02244F60 + .byte 0x1C, 0x00, 0x02, 0x00 + +ov13_02244F64: ; 0x02244F64 + .byte 0x78, 0x00, 0x12, 0x00 + +ov13_02244F68: ; 0x02244F68 + .byte 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x02, 0x0C, 0x0C, 0x0C, 0x0B, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00 + +ov13_02244F7C: ; 0x02244F7C + .byte 0x04, 0x00, 0xAA, 0x00 + .byte 0x84, 0x00, 0xAA, 0x00 + +ov13_02244F84: ; 0x02244F84 + .byte 0x04, 0x00, 0x67, 0x00 + +ov13_02244F88: ; 0x02244F88 + .byte 0x04, 0x00, 0x7D, 0x00 + +ov13_02244F8C: ; 0x02244F8C + .byte 0x04, 0x00, 0x93, 0x00 + .byte 0xDC, 0x00, 0x51, 0x00 + +ov13_02244F94: ; 0x02244F94 + .byte 0x1B, 0x00, 0x12, 0x00 + +ov13_02244F98: ; 0x02244F98 + .byte 0x20, 0x00, 0x12, 0x00 + +ov13_02244F9C: ; 0x02244F9C + .byte 0x28, 0x00, 0x12, 0x00 + .byte 0x20, 0x00, 0x12, 0x00 + +ov13_02244FA4: ; 0x02244FA4 + .byte 0x04, 0x00, 0x51, 0x00, 0x16, 0x00, 0x51, 0x00, 0x28, 0x00, 0x51, 0x00 + .byte 0x3A, 0x00, 0x51, 0x00, 0x4C, 0x00, 0x51, 0x00, 0x5E, 0x00, 0x51, 0x00, 0x70, 0x00, 0x51, 0x00 + .byte 0x82, 0x00, 0x51, 0x00, 0x94, 0x00, 0x51, 0x00, 0xA6, 0x00, 0x51, 0x00, 0xB8, 0x00, 0x51, 0x00 + .byte 0xCA, 0x00, 0x51, 0x00, 0x20, 0x00, 0x67, 0x00, 0x32, 0x00, 0x67, 0x00, 0x44, 0x00, 0x67, 0x00 + .byte 0x56, 0x00, 0x67, 0x00, 0x68, 0x00, 0x67, 0x00, 0x7A, 0x00, 0x67, 0x00, 0x8C, 0x00, 0x67, 0x00 + .byte 0x9E, 0x00, 0x67, 0x00, 0xB0, 0x00, 0x67, 0x00, 0xC2, 0x00, 0x67, 0x00, 0xD4, 0x00, 0x67, 0x00 + .byte 0xE6, 0x00, 0x67, 0x00, 0x25, 0x00, 0x7D, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x49, 0x00, 0x7D, 0x00 + .byte 0x5B, 0x00, 0x7D, 0x00, 0x6D, 0x00, 0x7D, 0x00, 0x7F, 0x00, 0x7D, 0x00, 0x91, 0x00, 0x7D, 0x00 + .byte 0xA3, 0x00, 0x7D, 0x00, 0xB5, 0x00, 0x7D, 0x00, 0xC7, 0x00, 0x7D, 0x00, 0xD9, 0x00, 0x7D, 0x00 + .byte 0xEB, 0x00, 0x7D, 0x00, 0x2D, 0x00, 0x93, 0x00, 0x3F, 0x00, 0x93, 0x00, 0x51, 0x00, 0x93, 0x00 + .byte 0x63, 0x00, 0x93, 0x00, 0x75, 0x00, 0x93, 0x00, 0x87, 0x00, 0x93, 0x00, 0x99, 0x00, 0x93, 0x00 + .byte 0xAB, 0x00, 0x93, 0x00, 0xBD, 0x00, 0x93, 0x00, 0xCF, 0x00, 0x93, 0x00, 0xE1, 0x00, 0x93, 0x00 + +ov13_02245060: ; 0x02245060 + .byte 0x02, 0x00 + +ov13_02245062: ; 0x02245062 + .byte 0x4F, 0x00, 0x14, 0x00, 0x4F, 0x00, 0x26, 0x00, 0x4F, 0x00, 0x38, 0x00, 0x4F, 0x00 + .byte 0x4A, 0x00, 0x4F, 0x00, 0x5C, 0x00, 0x4F, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x80, 0x00, 0x4F, 0x00 + .byte 0x92, 0x00, 0x4F, 0x00, 0xA4, 0x00, 0x4F, 0x00, 0xB6, 0x00, 0x4F, 0x00, 0xC8, 0x00, 0x4F, 0x00 + .byte 0x1E, 0x00, 0x65, 0x00, 0x30, 0x00, 0x65, 0x00, 0x42, 0x00, 0x65, 0x00, 0x54, 0x00, 0x65, 0x00 + .byte 0x66, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x8A, 0x00, 0x65, 0x00, 0x9C, 0x00, 0x65, 0x00 + .byte 0xAE, 0x00, 0x65, 0x00, 0xC0, 0x00, 0x65, 0x00, 0xD2, 0x00, 0x65, 0x00, 0xE4, 0x00, 0x65, 0x00 + .byte 0x23, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x7B, 0x00, 0x47, 0x00, 0x7B, 0x00, 0x59, 0x00, 0x7B, 0x00 + .byte 0x6B, 0x00, 0x7B, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x8F, 0x00, 0x7B, 0x00, 0xA1, 0x00, 0x7B, 0x00 + .byte 0xB3, 0x00, 0x7B, 0x00, 0xC5, 0x00, 0x7B, 0x00, 0xD7, 0x00, 0x7B, 0x00, 0xE9, 0x00, 0x7B, 0x00 + .byte 0x2B, 0x00, 0x91, 0x00, 0x3D, 0x00, 0x91, 0x00, 0x4F, 0x00, 0x91, 0x00, 0x61, 0x00, 0x91, 0x00 + .byte 0x73, 0x00, 0x91, 0x00, 0x85, 0x00, 0x91, 0x00, 0x97, 0x00, 0x91, 0x00, 0xA9, 0x00, 0x91, 0x00 + .byte 0xBB, 0x00, 0x91, 0x00, 0xCD, 0x00, 0x91, 0x00, 0xDF, 0x00, 0x91, 0x00, 0x02, 0x00, 0x65, 0x00 + .byte 0x02, 0x00, 0x7B, 0x00, 0x02, 0x00, 0x91, 0x00, 0xDA, 0x00, 0x4F, 0x00, 0x02, 0x00, 0xA8, 0x00 + .byte 0x82, 0x00, 0xA8, 0x00 + +ov13_02245134: ; 0x02245134 + .byte 0x32, 0x33, 0x01, 0x2F, 0x00, 0x33, 0x02, 0x0C, 0x01, 0x33, 0x03, 0x0D + .byte 0x02, 0x33, 0x04, 0x0E, 0x03, 0x33, 0x05, 0x0F, 0x04, 0x33, 0x06, 0x10, 0x05, 0x34, 0x07, 0x11 + .byte 0x06, 0x34, 0x08, 0x12, 0x07, 0x34, 0x09, 0x13, 0x08, 0x34, 0x0A, 0x14, 0x09, 0x34, 0x0B, 0x15 + .byte 0x0A, 0x34, 0x32, 0x16, 0x2F, 0x01, 0x0D, 0x18, 0x0C, 0x02, 0x0E, 0x19, 0x0D, 0x03, 0x0F, 0x1A + .byte 0x0E, 0x04, 0x10, 0x1B, 0x0F, 0x05, 0x11, 0x1C, 0x10, 0x06, 0x12, 0x1D, 0x11, 0x07, 0x13, 0x1E + .byte 0x12, 0x08, 0x14, 0x1F, 0x13, 0x09, 0x15, 0x20, 0x14, 0x0A, 0x16, 0x21, 0x15, 0x0B, 0x17, 0x22 + .byte 0x16, 0x32, 0x2F, 0x23, 0x30, 0x0C, 0x19, 0x24, 0x18, 0x0D, 0x1A, 0x25, 0x19, 0x0E, 0x1B, 0x26 + .byte 0x1A, 0x0F, 0x1C, 0x27, 0x1B, 0x10, 0x1D, 0x28, 0x1C, 0x11, 0x1E, 0x29, 0x1D, 0x12, 0x1F, 0x2A + .byte 0x1E, 0x13, 0x20, 0x2B, 0x1F, 0x14, 0x21, 0x2C, 0x20, 0x15, 0x22, 0x2D, 0x21, 0x16, 0x23, 0x2E + .byte 0x22, 0x17, 0x30, 0x2E, 0x31, 0x18, 0x25, 0x33, 0x24, 0x19, 0x26, 0x33, 0x25, 0x1A, 0x27, 0x33 + .byte 0x26, 0x1B, 0x28, 0x33, 0x27, 0x1C, 0x29, 0x33, 0x28, 0x1D, 0x2A, 0x34, 0x29, 0x1E, 0x2B, 0x34 + .byte 0x2A, 0x1F, 0x2C, 0x34, 0x2B, 0x20, 0x2D, 0x34, 0x2C, 0x21, 0x2E, 0x34, 0x2D, 0xFF, 0x31, 0x34 + .byte 0x17, 0x00, 0x0C, 0x30, 0x23, 0x2F, 0x18, 0x31, 0x2E, 0x30, 0x24, 0x33, 0x0B, 0x34, 0x00, 0x17 + .byte 0x34, 0xFE, 0x34, 0xFC, 0x33, 0xFD, 0x33, 0xFB + +ov13_02245208: ; 0x02245208 + .byte 0xFF, 0xFF, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00 + +ov13_02245210: ; 0x02245210 + .byte 0x04, 0x05, 0x00, 0x00 + +ov13_02245214: ; 0x02245214 + .byte 0x37, 0x38, 0x00, 0x00 + +ov13_02245218: ; 0x02245218 + .byte 0x3C, 0x3D, 0x00, 0x00 + +ov13_0224521C: ; 0x0224521C + .byte 0x02, 0x03, 0x00, 0x00 + +ov13_02245220: ; 0x02245220 + .byte 0x12, 0x13, 0x00, 0x00 + +ov13_02245224: ; 0x02245224 + .byte 0x10, 0x11, 0x00, 0x00 + +ov13_02245228: ; 0x02245228 + .byte 0x1C, 0x00, 0x14, 0x00, 0x0C, 0x00, 0x04, 0x00 + +ov13_02245230: ; 0x02245230 + .byte 0x1C, 0x00, 0x14, 0x00 + +ov13_02245234: ; 0x02245234 + .byte 0x78, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x03 + .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov13_02245250: ; 0x02245250 + .byte 0x72, 0x00, 0x91, 0x00, 0x92, 0x00, 0x91, 0x00 + +ov13_02245258: ; 0x02245258 + .byte 0x04, 0x00, 0xAA, 0x00, 0x84, 0x00, 0xAA, 0x00 + +ov13_02245260: ; 0x02245260 + .byte 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x31, 0x00, 0x32, 0x00 + .byte 0x33, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00 + +ov13_0224527A: ; 0x0224527A + .byte 0x52, 0x00, 0x4C, 0x00, 0x72, 0x00 + .byte 0x4C, 0x00, 0x92, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x63, 0x00, 0x72, 0x00, 0x63, 0x00, 0x92, 0x00 + .byte 0x63, 0x00, 0x52, 0x00, 0x7A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x92, 0x00, 0x7A, 0x00, 0x52, 0x00 + .byte 0x91, 0x00 + +ov13_022452A2: ; 0x022452A2 + .byte 0x50, 0x00 + +ov13_022452A4: ; 0x022452A4 + .byte 0x4A, 0x00, 0x70, 0x00, 0x4A, 0x00, 0x90, 0x00, 0x4A, 0x00, 0x50, 0x00 + .byte 0x61, 0x00, 0x70, 0x00, 0x61, 0x00, 0x90, 0x00, 0x61, 0x00, 0x50, 0x00, 0x78, 0x00, 0x70, 0x00 + .byte 0x78, 0x00, 0x90, 0x00, 0x78, 0x00, 0x50, 0x00, 0x8F, 0x00, 0x70, 0x00, 0x8F, 0x00, 0x90, 0x00 + .byte 0x8F, 0x00, 0x02, 0x00, 0xA8, 0x00, 0x82, 0x00, 0xA8, 0x00 + +ov13_022452DA: ; 0x022452DA + .byte 0x02, 0x0C, 0x01, 0x03, 0x00, 0x0D + .byte 0x02, 0x04, 0x01, 0x0D, 0x00, 0x05, 0x05, 0x00, 0x04, 0x06, 0x03, 0x01, 0x05, 0x07, 0x04, 0x02 + .byte 0x03, 0x08, 0x08, 0x03, 0x07, 0x09, 0x06, 0x04, 0x08, 0x0A, 0x07, 0x05, 0x06, 0x0B, 0x0B, 0x06 + .byte 0x0A, 0x0C, 0x09, 0x07, 0x0B, 0x0D, 0x0A, 0x08, 0x09, 0x0D, 0x0D, 0x09, 0x0D, 0x00, 0x0C, 0xFF + .byte 0x0C, 0xFE, 0x00, 0x00 + +ov13_02245314: ; 0x02245314 + .byte 0x37, 0x38, 0x39, 0x34, 0x35, 0x36, 0x31, 0x32, 0x33, 0x30, 0x00, 0x00 + +ov13_02245320: ; 0x02245320 + .byte 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F, 0x2D, 0x44, 0x53, 0x00 + +ov13_0224532C: ; 0x0224532C + .byte 0x01, 0x02 + +ov13_0224532E: ; 0x0224532E + .byte 0x08, 0x00 + .byte 0x20, 0x00, 0xAC, 0x00, 0xA0, 0x00, 0xB4, 0x00, 0x20, 0x00, 0xF8, 0x00, 0xA0, 0x00 + +ov13_0224533E: ; 0x0224533E + .byte 0x06, 0x00 + +ov13_02245340: ; 0x02245340 + .byte 0x1E, 0x00 + +ov13_02245342: ; 0x02245342 + .byte 0x9E, 0x00 + +ov13_02245344: ; 0x02245344 + .byte 0x92, 0x00, 0xB2, 0x00, 0x1E, 0x00, 0xEA, 0x00, 0x92, 0x00 + +ov13_0224534E: ; 0x0224534E + .byte 0x63, 0x68 + .byte 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x31, 0x31, 0x2E, 0x6E, 0x63 + .byte 0x6C, 0x2E, 0x6C, 0x00 + +ov13_02245364: ; 0x02245364 + .byte 0x01, 0x02, 0x03, 0x00, 0xE0, 0x00, 0x84, 0x00 + +ov13_0224536C: ; 0x0224536C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x4F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x6E, 0x63, 0x6C, 0x2E + .byte 0x6C, 0x00 + +ov13_02245382: ; 0x02245382 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x4F, 0x70, 0x74, 0x69, 0x6F + .byte 0x6E, 0x31, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00 + +ov13_0224539A: ; 0x0224539A + .byte 0x08, 0x00, 0x24, 0x00, 0xF8, 0x00 + .byte 0x44, 0x00, 0x08, 0x00, 0x50, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x08, 0x00, 0x7C, 0x00, 0xF8, 0x00 + .byte 0x9C, 0x00 + +ov13_022453B2: ; 0x022453B2 + .byte 0x06, 0x00 + +ov13_022453B4: ; 0x022453B4 + .byte 0x22, 0x00 + +ov13_022453B6: ; 0x022453B6 + .byte 0xEA, 0x00 + +ov13_022453B8: ; 0x022453B8 + .byte 0x36, 0x00, 0x06, 0x00, 0x4E, 0x00, 0xEA, 0x00 + .byte 0x62, 0x00, 0x06, 0x00, 0x7A, 0x00, 0xEA, 0x00, 0x8E, 0x00, 0x00, 0x00 + +ov13_022453CC: ; 0x022453CC + .byte 0x02 + +ov13_022453CD: ; 0x022453CD + .byte 0x63, 0x68, 0x61 + .byte 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x31, 0x2E, 0x6E, 0x63, 0x6C + .byte 0x2E, 0x6C, 0x00 + +ov13_022453E3: ; 0x022453E3 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x41, 0x70, 0x4C, 0x69, 0x73 + .byte 0x74, 0x42, 0x61, 0x63, 0x6B, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_022453FC: ; 0x022453FC + .byte 0x07, 0x00, 0x32, 0x00 + .byte 0xD0, 0x00, 0x4C, 0x00, 0x07, 0x00, 0x4E, 0x00, 0xD0, 0x00, 0x68, 0x00, 0x07, 0x00, 0x6A, 0x00 + .byte 0xD0, 0x00, 0x84, 0x00, 0x07, 0x00, 0x86, 0x00, 0xD0, 0x00, 0xA0, 0x00, 0x85, 0x00, 0x1B, 0x00 + .byte 0xFD, 0x00, 0x2C, 0x00 + +ov13_02245424: ; 0x02245424 + .byte 0x04, 0x00 + +ov13_02245426: ; 0x02245426 + .byte 0x2E, 0x00 + +ov13_02245428: ; 0x02245428 + .byte 0xDB, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x4A, 0x00 + .byte 0xDB, 0x00, 0x5B, 0x00, 0x04, 0x00, 0x66, 0x00, 0xDB, 0x00, 0x77, 0x00, 0x04, 0x00, 0x82, 0x00 + .byte 0xDB, 0x00, 0x93, 0x00, 0x82, 0x00, 0x18, 0x00, 0xF0, 0x00, 0x2C, 0x00 + +ov13_0224544C: ; 0x0224544C + .byte 0x2E, 0x2D, 0x33, 0x00 + +ov13_02245450: ; 0x02245450 + .byte 0x18, 0x17, 0x16, 0x15 + +ov13_02245454: ; 0x02245454 + .byte 0x3E, 0x3D, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00 + .byte 0x48, 0x00, 0x00, 0x00, 0x2C, 0xA0, 0x23, 0x02, 0x5C, 0xA0, 0x23, 0x02 + +ov13_0224546C: ; 0x0224546C + .byte 0x20, 0x31, 0x00, 0x00 + +ov13_02245470: ; 0x02245470 + .byte 0x08, 0x17, 0x26, 0x35, 0x44, 0x53, 0x62, 0x71, 0x80, 0x8F, 0x9E, 0xAD, 0xBC, 0xCB, 0xDA, 0xE9 + +ov13_02245480: ; 0x02245480 + .byte 0x32, 0x35, 0x35, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x00, 0x00, 0x00 + .byte 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov13_02245498: ; 0x02245498 + .byte 0xB0, 0xA2, 0x23, 0x02, 0xF0, 0xA2, 0x23, 0x02 + .byte 0x30, 0xA3, 0x23, 0x02, 0x74, 0xA3, 0x23, 0x02, 0xB8, 0xA3, 0x23, 0x02 + +ov13_022454AC: ; 0x022454AC + .byte 0xF4, 0xA1, 0x23, 0x02 + .byte 0x10, 0xA2, 0x23, 0x02, 0x2C, 0xA2, 0x23, 0x02, 0x4C, 0xA2, 0x23, 0x02, 0x6C, 0xA2, 0x23, 0x02 + +ov13_022454C0: ; 0x022454C0 + .byte 0x31, 0x3D, 0x49, 0x5A, 0x66, 0x72, 0x83, 0x8F, 0x9B, 0xAC, 0xB8, 0xC4 + +ov13_022454CC: ; 0x022454CC + .byte 0x00, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x00, 0x00, 0x0D, 0x00, 0x3C, 0x00, 0xE6, 0x00, 0x5E, 0x00 + +ov13_022454DC: ; 0x022454DC + .byte 0x62, 0x00 + +ov13_022454DE: ; 0x022454DE + .byte 0x22, 0x00 + .byte 0x62, 0x00, 0x22, 0x00, 0x3D, 0x00, 0x22, 0x00, 0x65, 0x00, 0x22, 0x00, 0x6C, 0x00, 0x22, 0x00 + .byte 0x34, 0x00, 0x22, 0x00, 0x4E, 0x00, 0x22, 0x00 + +ov13_022454F8: ; 0x022454F8 + .byte 0x06, 0x08, 0x07, 0x00 + +ov13_022454FC: ; 0x022454FC + .byte 0x02, 0x03, 0x07, 0x08 + .byte 0xCC, 0x00, 0x34, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x8F, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x18, 0x00 + .byte 0xC0, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x18, 0x00 + +ov13_02245518: ; 0x02245518 + .byte 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01 + .byte 0x02, 0x00, 0x00, 0x03, 0x04, 0x05 + +ov13_02245526: ; 0x02245526 + .byte 0x00, 0x29, 0x2C, 0x52, 0x53, 0x30, 0x00, 0x2A, 0x30, 0x54 + .byte 0x55, 0x00, 0x00, 0x2B, 0x00, 0x00 + +ov13_02245536: ; 0x02245536 + .byte 0x00, 0x00, 0x60, 0x00, 0xE0, 0x00, 0x40, 0x01, 0xC0, 0x01 + .byte 0x40, 0x02, 0xA0, 0x02, 0x20, 0x03, 0xA0, 0x03 + +ov13_02245548: ; 0x02245548 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00 + +ov13_0224555D: ; 0x0224555D + .byte 0x63, 0x68, 0x61 + .byte 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x31, 0x2E, 0x6E, 0x63, 0x6C + .byte 0x2E, 0x6C, 0x00 + +ov13_02245573: ; 0x02245573 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x33, 0x4C, 0x69, 0x73, 0x74, 0x42 + .byte 0x61, 0x63, 0x6B, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_0224558A: ; 0x0224558A + .byte 0x84, 0x00, 0x1B, 0x00, 0xFC, 0x00 + .byte 0x2C, 0x00, 0x84, 0x00, 0xAC, 0x00, 0xFC, 0x00, 0xBD, 0x00, 0x04, 0x00, 0xAC, 0x00, 0x7C, 0x00 + .byte 0xBD, 0x00 + +ov13_022455A2: ; 0x022455A2 + .byte 0xC8, 0x00 + +ov13_022455A4: ; 0x022455A4 + .byte 0x31, 0x00 + +ov13_022455A6: ; 0x022455A6 + .byte 0xE0, 0x00, 0x4D, 0x00, 0xBC, 0x00, 0x31, 0x00, 0xE0, 0x00 + .byte 0x4D, 0x00, 0x8B, 0x00, 0x31, 0x00, 0xAF, 0x00, 0x4D, 0x00, 0x82, 0x00, 0x18, 0x00, 0xEE, 0x00 + .byte 0x2C, 0x00, 0x82, 0x00, 0xA9, 0x00, 0xEE, 0x00, 0xBD, 0x00, 0x02, 0x00, 0xA9, 0x00, 0x6E, 0x00 + .byte 0xBD, 0x00, 0x00, 0x00 + +ov13_022455D4: ; 0x022455D4 + .byte 0xFF, 0x23, 0x27, 0xFF, 0x23, 0x2F, 0xFF, 0x00 + +ov13_022455DC: ; 0x022455DC + .byte 0x00, 0x01, 0x0E, 0x04 + .byte 0x05, 0x06, 0x0E, 0x09, 0x0A, 0x00, 0x00, 0x00 + +ov13_022455E8: ; 0x022455E8 + .byte 0x00, 0x05, 0x02, 0x07, 0x04, 0x01, 0x06, 0x03 + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022455F4: ; 0x022455F4 + .byte 0x00, 0x01, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x00 + +ov13_02245600: ; 0x02245600 + .byte 0x13, 0x14, 0x12, 0x56 + +ov13_02245604: ; 0x02245604 + .byte 0x03, 0x04, 0x05, 0x07, 0x0A, 0x09, 0x0B, 0x06 + +ov13_0224560C: ; 0x0224560C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x31, 0x31, 0x2E, 0x6E, 0x63, 0x6C, 0x2E + .byte 0x6C, 0x00 + +ov13_02245622: ; 0x02245622 + .byte 0x08, 0x00 + +ov13_02245624: ; 0x02245624 + .byte 0x30, 0x00, 0x5A, 0x00, 0x30, 0x00, 0xAC, 0x00, 0x30, 0x00, 0x0C, 0x00 + .byte 0x58, 0x00, 0x5E, 0x00, 0x58, 0x00, 0xB0, 0x00, 0x58, 0x00 + +ov13_0224563A: ; 0x0224563A + .byte 0x08, 0x00, 0x20, 0x00, 0x54, 0x00 + .byte 0x56, 0x00, 0x5A, 0x00, 0x20, 0x00, 0xA6, 0x00, 0x56, 0x00, 0xAC, 0x00, 0x20, 0x00, 0xF8, 0x00 + .byte 0x56, 0x00, 0x08, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x54, 0x00, 0x54, 0x00 + .byte 0x70, 0x00, 0x5A, 0x00, 0x54, 0x00, 0xA6, 0x00, 0x70, 0x00, 0xAC, 0x00, 0x54, 0x00, 0xF8, 0x00 + .byte 0x70, 0x00 + +ov13_02245672: ; 0x02245672 + .byte 0x06, 0x00 + +ov13_02245674: ; 0x02245674 + .byte 0x1E, 0x00 + +ov13_02245676: ; 0x02245676 + .byte 0x46, 0x00 + +ov13_02245678: ; 0x02245678 + .byte 0x48, 0x00, 0x58, 0x00, 0x1E, 0x00, 0x98, 0x00 + .byte 0x48, 0x00, 0xAA, 0x00, 0x1E, 0x00, 0xEA, 0x00, 0x48, 0x00, 0x06, 0x00, 0x76, 0x00, 0xEA, 0x00 + .byte 0x92, 0x00, 0x09, 0x00, 0x54, 0x00, 0x43, 0x00, 0x70, 0x00, 0x5B, 0x00, 0x54, 0x00, 0x95, 0x00 + .byte 0x70, 0x00, 0xAD, 0x00, 0x54, 0x00, 0xE7, 0x00, 0x70, 0x00, 0x00, 0x00 + +ov13_022456AC: ; 0x022456AC + .byte 0x03, 0x2D, 0x27, 0x1D + .byte 0x32, 0x30, 0x06, 0x00 + +ov13_022456B4: ; 0x022456B4 + .byte 0x01, 0x02, 0x03, 0x04 + +ov13_022456B8: ; 0x022456B8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x31, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00 + +ov13_022456CE: ; 0x022456CE + .byte 0xFF, 0xFE + .byte 0xFF, 0xFE, 0x03, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFE + .byte 0xFF, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00 + +ov13_022456EE: ; 0x022456EE + .byte 0x08, 0x00 + .byte 0x20, 0x00, 0xF8, 0x00, 0x5C, 0x00, 0x08, 0x00, 0x64, 0x00, 0x7E, 0x00, 0xA0, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x64, 0x00, 0xF8, 0x00, 0xA0, 0x00, 0x08, 0x00 + .byte 0x20, 0x00, 0xF8, 0x00, 0x5C, 0x00, 0x08, 0x00, 0x64, 0x00, 0x64, 0x00, 0xA0, 0x00, 0x68, 0x00 + .byte 0x64, 0x00, 0xC4, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0x64, 0x00, 0xF8, 0x00, 0xA0, 0x00 + +ov13_0224572E: ; 0x0224572E + .byte 0x06, 0x00 + +ov13_02245730: ; 0x02245730 + .byte 0x1E, 0x00 + +ov13_02245732: ; 0x02245732 + .byte 0xEA, 0x00 + +ov13_02245734: ; 0x02245734 + .byte 0x4E, 0x00, 0x06, 0x00, 0x62, 0x00, 0x70, 0x00, 0x92, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x62, 0x00, 0xEA, 0x00, 0x92, 0x00, 0x06, 0x00 + .byte 0x1E, 0x00, 0xEA, 0x00, 0x4E, 0x00, 0x06, 0x00, 0x62, 0x00, 0x56, 0x00, 0x92, 0x00, 0x66, 0x00 + .byte 0x62, 0x00, 0xB6, 0x00, 0x92, 0x00, 0xC6, 0x00, 0x62, 0x00, 0xEA, 0x00, 0x92, 0x00, 0x00, 0x00 + +ov13_02245770: ; 0x02245770 + .byte 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x00 + +ov13_02245778: ; 0x02245778 + .byte 0xA8, 0x81, 0x23, 0x02, 0xBC, 0x81, 0x23, 0x02 + .byte 0x03, 0x01, 0x00, 0x00 + +ov13_02245784: ; 0x02245784 + .byte 0x2B, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00 + +ov13_02245790: ; 0x02245790 + .byte 0x10, 0x0F, 0x0E, 0x00 + +ov13_02245794: ; 0x02245794 + .byte 0x55, 0x36, 0x1E, 0x00 + +ov13_02245798: ; 0x02245798 + .byte 0x00, 0x50, 0xF2, 0x01 + +ov13_0224579C: ; 0x0224579C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022457A4: ; 0x022457A4 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov13_022457E8: ; 0x022457E8 + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022457EC: ; 0x022457EC + .byte 0x01, 0x00, 0x05, 0x00 + .byte 0x06, 0x04, 0x00, 0x02, 0x00, 0x06, 0x04, 0x00, 0x05, 0x00, 0x03 + +ov13_022457FB: ; 0x022457FB + .byte 0x02, 0x01, 0x03, 0x01, 0x03 + .byte 0x05, 0x01, 0x04, 0x01, 0x05, 0x07, 0x01, 0x07, 0x01, 0x06 + +ov13_0224580A: ; 0x0224580A + .byte 0x20, 0x00, 0x21, 0x00, 0x50, 0x00 + .byte 0x30, 0x00, 0x68, 0x00, 0x21, 0x00, 0x98, 0x00, 0x30, 0x00, 0xB0, 0x00, 0x21, 0x00, 0x00, 0x00 + +ov13_02245820: ; 0x02245820 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov13_02245828: ; 0x02245828 + .byte 0x4E, 0x57, 0x43, 0x55, 0x53, 0x42, 0x41, 0x50 + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02245834: ; 0x02245834 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov13_02245878: ; 0x02245878 + .byte 0x08, 0x00, 0x08, 0x00, 0x01, 0x01, 0x00, 0x00 + .byte 0x01, 0x01 + +ov13_02245882: ; 0x02245882 + .byte 0x04, 0x00, 0x1D, 0x00, 0xFC, 0x00, 0x44, 0x00 + +ov13_0224588A: ; 0x0224588A + .byte 0x00, 0x01, 0x01, 0x00, 0x00, 0x01 + .byte 0x01, 0x00, 0x00, 0x01 + +ov13_02245894: ; 0x02245894 + .byte 0x01 + +ov13_02245895: ; 0x02245895 + .byte 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x01, 0x00 + +ov13_0224589E: ; 0x0224589E + .byte 0x1B, 0x19 + .byte 0x57, 0x00, 0x23, 0x1D, 0x59, 0x00, 0x23, 0x1D + +ov13_022458A8: ; 0x022458A8 + .byte 0x6C, 0x00, 0x10, 0x00, 0x6C, 0x00, 0x10, 0x00 + .byte 0x78, 0x00, 0x10, 0x00, 0x78, 0x00, 0x10, 0x00, 0x78, 0x00, 0x10, 0x00 + +ov13_022458BC: ; 0x022458BC + .byte 0xD8, 0x00 + +ov13_022458BE: ; 0x022458BE + .byte 0x50, 0x00 + .byte 0xD8, 0x00, 0x50, 0x00, 0xE6, 0x00, 0x4F, 0x00, 0xE6, 0x00, 0x4F, 0x00, 0xE6, 0x00, 0x48, 0x00 + .byte 0xDA, 0x00, 0x5C, 0x00 + +ov13_022458D4: ; 0x022458D4 + .byte 0x0B, 0x00 + +ov13_022458D6: ; 0x022458D6 + .byte 0x27, 0x00, 0x0B, 0x00, 0x27, 0x00, 0x04, 0x00, 0x4C, 0x00 + .byte 0x04, 0x00, 0x4C, 0x00, 0x04, 0x00, 0x54, 0x00, 0x0B, 0x00, 0x27, 0x00 + +ov13_022458EC: ; 0x022458EC + .byte 0xEA, 0x00 + +ov13_022458EE: ; 0x022458EE + .byte 0x72, 0x00 + .byte 0xEA, 0x00, 0x72, 0x00, 0xF8, 0x00, 0x70, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x64, 0x00, 0x70, 0x00 + .byte 0xEA, 0x00, 0x72, 0x00 + +ov13_02245904: ; 0x02245904 + .byte 0x10, 0x00 + +ov13_02245906: ; 0x02245906 + .byte 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x10, 0x00, 0x84, 0x00 + .byte 0x84, 0x00, 0x84, 0x00, 0x09, 0x00, 0xA7, 0x00, 0x83, 0x00, 0xA7, 0x00, 0x09, 0x00, 0xA7, 0x00 + .byte 0x83, 0x00, 0xA7, 0x00, 0x09, 0x00, 0xA7, 0x00, 0x83, 0x00, 0xA7, 0x00 + +ov13_0224592C: ; 0x0224592C + .byte 0x00, 0x00, 0x46, 0x46 + .byte 0x4F, 0x2F, 0x00, 0x00 + +ov13_02245934: ; 0x02245934 + .byte 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00 + + .balign 4, 0 +ov13_0224593C: ; 0x0224593C + .byte 0x64, 0x77, 0x63, 0x00 + + .balign 4, 0 +ov13_02245940: ; 0x02245940 + .byte 0x00, 0xF0, 0x00, 0x10, 0x11, 0x10, 0x01, 0x00, 0xF0, 0x00, 0x10, 0x00 + +ov13_0224594C: ; 0x0224594C + .byte 0x00, 0x00, 0x80, 0x01 + +ov13_02245950: ; 0x02245950 + .byte 0x20, 0x00 + +ov13_02245952: ; 0x02245952 + .byte 0x18, 0x00, 0x20, 0x00, 0x0C, 0x00 + +ov13_02245958: ; 0x02245958 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00 + +ov13_02245960: ; 0x02245960 + .byte 0x80, 0x20, 0x00, 0x00 + + .data + + .balign 4, 0 +ov13_02245B20: ; 0x02245B20 + .asciz "char/jtNull.nsc.l" + .balign 4, 0 +ov13_02245B34: + .asciz "char/jb2HlAp.nsc.l" + .balign 4, 0 +ov13_02245B48: + .asciz "char/jb4HlIp.nsc.l" + .balign 4, 0 +ov13_02245B5C: + .asciz "char/jb4HlWep.nsc.l" + .balign 4, 0 +ov13_02245B70: + .asciz "char/jb4HlUsb.nsc.l" + .balign 4, 0 +ov13_02245B84: + .asciz "char/jb4HlDns1.nsc.l" + .balign 4, 0 +ov13_02245B9C: + .asciz "char/jb4HlSsid.nsc.l" + .balign 4, 0 +ov13_02245BB4: + .asciz "char/jb5HlMove.nsc.l" + .balign 4, 0 +ov13_02245BCC: + .asciz "char/jb2HlWiFi.nsc.l" + .balign 4, 0 +ov13_02245BE4: + .asciz "char/jb5HlInfo.nsc.l" + .balign 4, 0 +ov13_02245BFC: + .asciz "char/jb4HlMask.nsc.l" + .balign 4, 0 +ov13_02245C14: + .asciz "char/jb4HlSet2.nsc.l" + .balign 4, 0 +ov13_02245C2C: + .asciz "char/jb4HlDns0.nsc.l" + .balign 4, 0 +ov13_02245C44: + .asciz "char/jb4HlSet3.nsc.l" + .balign 4, 0 +ov13_02245C5C: + .asciz "char/jb4HlSet1.nsc.l" + .balign 4, 0 +ov13_02245C74: + .asciz "char/jb3HlList1.nsc.l" + .balign 4, 0 +ov13_02245C8C: + .asciz "char/jb3HlList2.nsc.l" + .balign 4, 0 +ov13_02245CA4: + .asciz "char/jb3HlList3.nsc.l" + .balign 4, 0 +ov13_02245CBC: + .asciz "char/jb5HlErase.nsc.l" + .balign 4, 0 +ov13_02245CD4: + .asciz "char/jb5HlOption.nsc.l" + .balign 4, 0 +ov13_02245CEC: + .asciz "char/jb4HlGateway.nsc.l" + .balign 4, 0 +ov13_02245D04: ; 0x02245D04 + .word ov13_02245BCC + .word ov13_02245B34 + .word ov13_02245C74 + .word ov13_02245C8C + .word ov13_02245CA4 + .word ov13_02245C5C + .word ov13_02245C14 + .word ov13_02245C44 + .word ov13_02245B70 + .word ov13_02245B9C + .word ov13_02245B5C + .word ov13_02245B48 + .word ov13_02245BFC + .word ov13_02245CEC + .word ov13_02245C2C + .word ov13_02245B84 + .word ov13_02245CD4 + .word ov13_02245BE4 + .word ov13_02245CBC + .word ov13_02245BB4 + + .balign 4, 0 +ov13_02245D54: ; 0x02245D54 + .asciz "char/jbBgHl.ncg.l" + + .balign 4, 0 +ov13_02245D68: ; 0x02245D68 + .word ov13_02245F18 + .word ov13_02245EB8 + .word ov13_02245EE8 + +ov13_02245D74: ; 0x02245D74 + .word ov13_02245D90 + .word ov13_02245DF2 + .word ov13_02245E54 + +ov13_02245D80: ; 0x02245D80 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + +ov13_02245D90: + .byte 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00 + .byte 0x39, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x3D, 0x00, 0x71, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00 + .byte 0x74, 0x00, 0x79, 0x00, 0x75, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x5B, 0x00, 0x5D, 0x00 + .byte 0x61, 0x00, 0x73, 0x00, 0x64, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x6A, 0x00, 0x6B, 0x00 + .byte 0x6C, 0x00, 0x3B, 0x00, 0x27, 0x00, 0x60, 0x00, 0x7A, 0x00, 0x78, 0x00, 0x63, 0x00, 0x76, 0x00 + .byte 0x62, 0x00, 0x6E, 0x00, 0x6D, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x5C, 0x00, 0x20, 0x00 + .byte 0x00, 0x00 + +ov13_02245DF2: + .byte 0x21, 0x00, 0x40, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x5E, 0x00, 0x26, 0x00 + .byte 0x2A, 0x00, 0x28, 0x00, 0x29, 0x00, 0x5F, 0x00, 0x2B, 0x00, 0x51, 0x00, 0x57, 0x00, 0x45, 0x00 + .byte 0x52, 0x00, 0x54, 0x00, 0x59, 0x00, 0x55, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x7B, 0x00 + .byte 0x7D, 0x00, 0x41, 0x00, 0x53, 0x00, 0x44, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x4A, 0x00 + .byte 0x4B, 0x00, 0x4C, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x7E, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x43, 0x00 + .byte 0x56, 0x00, 0x42, 0x00, 0x4E, 0x00, 0x4D, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x7C, 0x00 + .byte 0x20, 0x00, 0x00, 0x00 + +ov13_02245E54: + .byte 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00 + .byte 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x3D, 0x00, 0x51, 0x00, 0x57, 0x00 + .byte 0x45, 0x00, 0x52, 0x00, 0x54, 0x00, 0x59, 0x00, 0x55, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x50, 0x00 + .byte 0x5B, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x53, 0x00, 0x44, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00 + .byte 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x3B, 0x00, 0x27, 0x00, 0x60, 0x00, 0x5A, 0x00, 0x58, 0x00 + .byte 0x43, 0x00, 0x56, 0x00, 0x42, 0x00, 0x4E, 0x00, 0x4D, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x2F, 0x00 + .byte 0x5C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 + + .balign 4, 0 +ov13_02245EB8: + .asciz "!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL:\"~ZXCVBNM<>?|" + + .balign 4, 0 +ov13_02245EE8: + .asciz "1234567890-=QWERTYUIOP[]ASDFGHJKL;'`ZXCVBNM,./\\" + + .balign 4, 0 +ov13_02245F18: + .asciz "1234567890-=qwertyuiop[]asdfghjkl;'`zxcvbnm,./\\" + + .balign 4, 0 +ov13_02245F48: + .asciz "dwc:/move/child.srl" + .balign 4, 0 +ov13_02245F5C: + .asciz "dwc:/move/banner.plt" + .balign 4, 0 +ov13_02245F74: + .asciz "dwc:/move/banner.char" + .balign 4, 0 + +ov13_02245F8C: ; 0x02245F8C + .word ov13_02245F48 + .word 0 + .word 0 + .word ov13_02245F74 + .word ov13_02245F5C + .word 0x00000159 + .word 0 + + .balign 4, 0 +ov13_02245FA8: + .asciz "msg/kor.bmg.l" + .balign 4, 0 +ov13_02245FB8: + .asciz "msg/eng.bmg.l" + .balign 4, 0 +ov13_02245FC8: + .asciz "msg/ita.bmg.l" + .balign 4, 0 +ov13_02245FD8: + .asciz "msg/ger.bmg.l" + .balign 4, 0 +ov13_02245FE8: + .asciz "msg/fre.bmg.l" + .balign 4, 0 +ov13_02245FF8: + .asciz "msg/spa.bmg.l" + .balign 4, 0 +ov13_02246008: + .asciz "msg/jap.bmg.l" + .balign 4, 0 + +ov13_02246018: ; 0x02246018 + .word ov13_02246008 + .word ov13_02245FB8 + .word ov13_02245FE8 + .word ov13_02245FD8 + .word ov13_02245FC8 + .word ov13_02245FF8 + .word ov13_02245FA8 + + .balign 4, 0 +ov13_02246034: ; 0x02246034 + .asciz "msg/usa.bmg.l" + + .balign 4, 0 +ov13_02246044: ; 0x02246044 + .asciz "char/jtMain.nce.l" + + .balign 4, 0 +ov13_02246058: ; 0x02246058 + .asciz "char/jbMain.nce.l" + + .balign 4, 0 +ov13_0224606C: ; 0x0224606C + .asciz "char/jtBgMain.ncg.l" + + .balign 4, 0 +ov13_02246080: ; 0x02246080 + .asciz "char/jtBgMain.ncl.l" + + .balign 4, 0 +ov13_02246094: ; 0x02246094 + .asciz "char/jtObjMain.ncg.l" + + .balign 4, 0 +ov13_022460AC: ; 0x022460AC + .asciz "char/xtObjMain.ncl.l" + + .balign 4, 0 +ov13_022460C4: ; 0x022460C4 + .asciz "char/jbBgStep1.ncg.l" + + .balign 4, 0 +ov13_022460DC: ; 0x022460DC + .asciz "char/jbBgStep1.ncl.l" + + .balign 4, 0 +ov13_022460F4: ; 0x022460F4 + .asciz "char/jbObjMain.ncg.l" + + .balign 4, 0 +ov13_0224610C: ; 0x0224610C + .asciz "char/ybObjMain.ncl.l" + + .balign 4, 0 +ov13_02246124: ; 0x02246124 + .asciz "char/jtTop.nsc.l" + + .balign 4, 0 +ov13_02246138: ; 0x02246138 + .asciz "char/jtStep1.nsc.l" + + .balign 4, 0 +ov13_0224614C: ; 0x0224614C + .asciz "char/jbBgStep1.ncg.l" + + .balign 4, 0 +ov13_02246164: ; 0x02246164 + .asciz "char/jbBgStep1.ncl.l" + + .balign 4, 0 +ov13_0224617C: ; 0x0224617C + .asciz "char/jb2Menu.nsc.l" + + .balign 4, 0 +ov13_02246190: ; 0x02246190 + .asciz "char/yb5Multi.nsc.l" + + .balign 4, 0 +ov13_022461A4: ; 0x022461A4 + .asciz "char/yb5Multi.nsc.l" + + .balign 4, 0 +ov13_022461B8: ; 0x022461B8 + .asciz "char/jb5Info.nsc.l" + + .balign 4, 0 +ov13_022461CC: ; 0x022461CC + .byte 0x25, 0x00, 0x30, 0x00 + .byte 0x32, 0x00, 0x58, 0x00, 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00, 0x32, 0x00, 0x58, 0x00, 0x2D, 0x00 + .byte 0x25, 0x00, 0x30, 0x00, 0x32, 0x00, 0x58, 0x00, 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00, 0x32, 0x00 + .byte 0x58, 0x00, 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00, 0x32, 0x00, 0x58, 0x00, 0x2D, 0x00, 0x25, 0x00 + .byte 0x30, 0x00, 0x32, 0x00, 0x58, 0x00, 0x00, 0x00 + +ov13_02246208: ; 0x02246208 + .byte 0x25, 0x00, 0x30, 0x00, 0x34, 0x00, 0x64, 0x00 + .byte 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00, 0x34, 0x00, 0x64, 0x00, 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00 + .byte 0x34, 0x00, 0x64, 0x00, 0x2D, 0x00, 0x25, 0x00, 0x30, 0x00, 0x34, 0x00, 0x64, 0x00, 0x00, 0x00 + +ov13_02246230: ; 0x02246230 + .byte 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00 + .byte 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00 + .byte 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x00, 0x00 + +ov13_02246258: ; 0x02246258 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42 + .byte 0x67, 0x4F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00 + +ov13_02246270: ; 0x02246270 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x35, 0x4F, 0x70, 0x74, 0x4D, 0x65, 0x6E, 0x75, 0x2E + .byte 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x00 + +ov13_02246288: ; 0x02246288 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x35 + .byte 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_0224629C: ; 0x0224629C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x35, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_022462B0: ; 0x022462B0 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x35, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_022462C4: ; 0x022462C4 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x35, 0x4D, 0x75, 0x6C, 0x74 + .byte 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_022462D8: ; 0x022462D8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x35 + .byte 0x4D, 0x6F, 0x76, 0x65, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_022462EC: ; 0x022462EC + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x35, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246300: ; 0x02246300 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E + .byte 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246318: ; 0x02246318 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246330: ; 0x02246330 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246344: ; 0x02246344 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74 + .byte 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246358: ; 0x02246358 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x34 + .byte 0x41, 0x70, 0x4C, 0x69, 0x73, 0x74, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246370: ; 0x02246370 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4B, 0x62, 0x2E, 0x6E, 0x63, 0x6C + .byte 0x2E, 0x6C, 0x00, 0x00 + +ov13_02246384: ; 0x02246384 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65 + .byte 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_0224639C: ; 0x0224639C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022463B4: ; 0x022463B4 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x45, 0x64, 0x69, 0x74 + .byte 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_022463C8: ; 0x022463C8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F + .byte 0x62, 0x6A, 0x4D, 0x61, 0x69, 0x6E, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022463E0: ; 0x022463E0 + .byte 0x20, 0x20, 0x30, 0x00 + +ov13_022463E4: ; 0x022463E4 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4B, 0x62 + .byte 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00 + +ov13_022463F8: ; 0x022463F8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246410: ; 0x02246410 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E + .byte 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246428: ; 0x02246428 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34 + .byte 0x45, 0x64, 0x69, 0x74, 0x41, 0x64, 0x64, 0x72, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_02246440: ; 0x02246440 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4D, 0x61, 0x69, 0x6E, 0x2E, 0x6E + .byte 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246458: ; 0x02246458 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x34 + .byte 0x45, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_0224646C: ; 0x0224646C + .byte 0x25, 0x00, 0x64, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02246474: ; 0x02246474 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4B, 0x62 + .byte 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00 + +ov13_02246488: ; 0x02246488 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022464A0: ; 0x022464A0 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x31, 0x2E + .byte 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00 + +ov13_022464B8: ; 0x022464B8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x33 + .byte 0x4C, 0x69, 0x73, 0x74, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_022464CC: ; 0x022464CC + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4D, 0x61, 0x69, 0x6E, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022464E4: ; 0x022464E4 + .byte 0x25, 0x00, 0x33, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x33, 0x00 + .byte 0x64, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x33, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x33, 0x00 + .byte 0x64, 0x00, 0x00, 0x00 + +ov13_02246504: ; 0x02246504 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65 + .byte 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_0224651C: ; 0x0224651C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02246534: ; 0x02246534 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4E, 0x6F, 0x6E, 0x65 + .byte 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_02246548: ; 0x02246548 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34 + .byte 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_0224655C: ; 0x0224655C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246570: ; 0x02246570 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246584: ; 0x02246584 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65 + .byte 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_0224659C: ; 0x0224659C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022465B4: ; 0x022465B4 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74 + .byte 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_022465C8: ; 0x022465C8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022465E0: ; 0x022465E0 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E + .byte 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022465F8: ; 0x022465F8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34 + .byte 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_0224660C: ; 0x0224660C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x57, 0x61, 0x79, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00 + +ov13_02246620: ; 0x02246620 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x31, 0x2E, 0x6E + .byte 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246638: ; 0x02246638 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x31, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246650: ; 0x02246650 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x32, 0x41, 0x70, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02246664: ; 0x02246664 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x4F, 0x62, 0x6A, 0x4D, 0x61 + .byte 0x69, 0x6E, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_0224667C: ; 0x0224667C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02246694: ; 0x02246694 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65 + .byte 0x70, 0x32, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022466AC: ; 0x022466AC + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x6A, 0x62, 0x33, 0x57, 0x61, 0x79, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x00 + +ov13_022466C0: ; 0x022466C0 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E + .byte 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022466D8: ; 0x022466D8 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_022466F0: ; 0x022466F0 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246704: ; 0x02246704 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74 + .byte 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246718: ; 0x02246718 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x34 + .byte 0x4E, 0x6F, 0x6E, 0x65, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + +ov13_0224672C: ; 0x0224672C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x78, 0x62, 0x34, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246740: ; 0x02246740 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E + .byte 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246758: ; 0x02246758 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x79, 0x62, 0x42 + .byte 0x67, 0x53, 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_02246770: ; 0x02246770 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x78, 0x62, 0x33, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246784: ; 0x02246784 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65 + .byte 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x67, 0x2E, 0x6C, 0x00, 0x00, 0x00, 0x00 + +ov13_0224679C: ; 0x0224679C + .byte 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x79, 0x62, 0x42, 0x67, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x63, 0x6C, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_022467B4: ; 0x022467B4 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x62, 0x34, 0x55, 0x73, 0x62, 0x2E + .byte 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x00 + +ov13_022467C8: ; 0x022467C8 + .byte 0x25, 0x33, 0x64, 0x25, 0x33, 0x64, 0x25, 0x33 + .byte 0x64, 0x25, 0x33, 0x64, 0x00, 0x00, 0x00, 0x00 + +ov13_022467D8: ; 0x022467D8 + .byte 0x73, 0x6F, 0x75, 0x6E, 0x64, 0x2F, 0x73, 0x6F + .byte 0x75, 0x6E, 0x64, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x2E, 0x73, 0x64, 0x61, 0x74, 0x2E, 0x6C, 0x00 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x74, 0x54, 0x6F, 0x70, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C + .byte 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x74, 0x53, 0x74, 0x65, 0x70, 0x31 + .byte 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x74, 0x53 + .byte 0x74, 0x65, 0x70, 0x32, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00, 0x63, 0x68, 0x61, 0x72 + .byte 0x2F, 0x6A, 0x74, 0x53, 0x74, 0x65, 0x70, 0x33, 0x2E, 0x6E, 0x73, 0x63, 0x2E, 0x6C, 0x00, 0x00 + .byte 0x63, 0x68, 0x61, 0x72, 0x2F, 0x6A, 0x74, 0x4F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x6E, 0x73 + .byte 0x63, 0x2E, 0x6C, 0x00 + +ov13_02246854: ; 0x02246854 + .byte 0x04, 0x68, 0x24, 0x02, 0x18, 0x68, 0x24, 0x02, 0x2C, 0x68, 0x24, 0x02 + .byte 0x40, 0x68, 0x24, 0x02, 0xF0, 0x67, 0x24, 0x02, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F + .byte 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x45, 0x4E, 0x44, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43 + .byte 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x4E, 0x4F, 0x4E, 0x45, 0x00 + .byte 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x45 + .byte 0x52, 0x52, 0x4F, 0x52, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F + .byte 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x4B, 0x49, 0x43, 0x4B, 0x45, 0x44, 0x00, 0x00, 0x00 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50, 0x5F, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x53, 0x54, 0x4F, 0x50, 0x00 + +ov13_022468D8: ; 0x022468D8 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0xC0, 0x68, 0x24, 0x02, 0x4C, 0x69, 0x24, 0x02, 0x80, 0x69, 0x24, 0x02, 0x34, 0x6B, 0x24, 0x02 + .byte 0xB4, 0x6A, 0x24, 0x02, 0x44, 0x6A, 0x24, 0x02, 0xD4, 0x69, 0x24, 0x02, 0xB8, 0x69, 0x24, 0x02 + .byte 0x7C, 0x68, 0x24, 0x02, 0xD4, 0x6A, 0x24, 0x02, 0x64, 0x69, 0x24, 0x02, 0x28, 0x6A, 0x24, 0x02 + .byte 0xA8, 0x68, 0x24, 0x02, 0x60, 0x6A, 0x24, 0x02, 0x7C, 0x6A, 0x24, 0x02, 0xF4, 0x6A, 0x24, 0x02 + .byte 0x98, 0x6A, 0x24, 0x02, 0x14, 0x6B, 0x24, 0x02, 0x9C, 0x69, 0x24, 0x02, 0xF0, 0x69, 0x24, 0x02 + .byte 0x68, 0x68, 0x24, 0x02, 0x90, 0x68, 0x24, 0x02, 0x0C, 0x6A, 0x24, 0x02, 0x44, 0x57, 0x43, 0x69 + .byte 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x49 + .byte 0x44, 0x4C, 0x45, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50, 0x5F, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43 + .byte 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x52, 0x45, 0x51, 0x55, 0x45 + .byte 0x53, 0x54, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x4D, 0x42, 0x50, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x45, 0x52, 0x52, 0x4F, 0x52 + .byte 0x00, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50 + .byte 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x41, 0x4E, 0x43, 0x45, 0x4C, 0x00, 0x00, 0x00 + .byte 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x4D + .byte 0x45, 0x4D, 0x42, 0x45, 0x52, 0x5F, 0x46, 0x55, 0x4C, 0x4C, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43 + .byte 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x57, 0x41, 0x49, 0x54, 0x5F + .byte 0x54, 0x4F, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F + .byte 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43 + .byte 0x54, 0x45, 0x44, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50 + .byte 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x4C, 0x45, 0x54, 0x45, 0x00 + .byte 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x52 + .byte 0x45, 0x51, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x00, 0x4D, 0x42, 0x5F, 0x43 + .byte 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x5F + .byte 0x50, 0x52, 0x4F, 0x43, 0x45, 0x45, 0x44, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F + .byte 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x42, 0x4F, 0x4F, 0x54, 0x5F, 0x52, 0x45, 0x51, 0x55 + .byte 0x45, 0x53, 0x54, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50 + .byte 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x52, 0x45, 0x42, 0x4F, 0x4F, 0x54, 0x49, 0x4E, 0x47 + .byte 0x00, 0x00, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x4C, 0x45, 0x54, 0x45 + .byte 0x00, 0x00, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x5F, 0x43, 0x4F, 0x4D, 0x50, 0x4C, 0x45, 0x54, 0x45 + .byte 0x00, 0x00, 0x00, 0x00, 0x4D, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x4D, 0x5F, 0x50, 0x53, 0x54, 0x41 + .byte 0x54, 0x45, 0x5F, 0x42, 0x4F, 0x4F, 0x54, 0x5F, 0x53, 0x54, 0x41, 0x52, 0x54, 0x41, 0x42, 0x4C + .byte 0x45, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x4D, 0x42, 0x50 + .byte 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x45, 0x4E, 0x44, 0x49 + .byte 0x4E, 0x47, 0x00, 0x00, 0x4E, 0x2F, 0x41, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F + .byte 0x44, 0x45, 0x5F, 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45 + .byte 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4E, 0x4F, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x54, 0x49, 0x4D, 0x45, 0x4F + .byte 0x55, 0x54, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x53 + .byte 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4D, 0x50, 0x5F, 0x49, 0x4E, 0x44, 0x00, 0x57, 0x4D, 0x5F, 0x45 + .byte 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x44, 0x43, 0x46, 0x5F, 0x54, 0x45, 0x53, 0x54, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4E, 0x4F, 0x5F, 0x45, 0x4E + .byte 0x54, 0x52, 0x59, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4E + .byte 0x4F, 0x5F, 0x43, 0x48, 0x49, 0x4C, 0x44, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F + .byte 0x44, 0x45, 0x5F, 0x4F, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x44, 0x43, 0x46 + .byte 0x5F, 0x49, 0x4E, 0x44, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4D, 0x50, 0x5F, 0x53, 0x54, 0x41, 0x52, 0x54, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x46, 0x49, 0x46, 0x4F, 0x5F + .byte 0x45, 0x52, 0x52, 0x4F, 0x52, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F + .byte 0x44, 0x45, 0x5F, 0x4E, 0x4F, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x45, 0x54, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x57, 0x4D, 0x5F, 0x44, 0x49 + .byte 0x53, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x52, 0x45, 0x43, 0x56, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x43, 0x4F, 0x4E + .byte 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4D, 0x50, 0x41, 0x43, 0x4B, 0x5F, 0x49, 0x4E, 0x44, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x5F + .byte 0x46, 0x41, 0x49, 0x4C, 0x45, 0x44, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x44, 0x43, 0x46, 0x5F, 0x53, 0x54, 0x41, 0x52, 0x54, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x53, 0x48 + .byte 0x5F, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4D, 0x50, 0x45, 0x4E, 0x44, 0x5F, 0x49, 0x4E, 0x44, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x50, 0x4F, 0x52 + .byte 0x54, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x5F, 0x53, 0x54, 0x41, 0x52, 0x54, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x46, 0x49, 0x46 + .byte 0x4F, 0x5F, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F + .byte 0x44, 0x45, 0x5F, 0x49, 0x4C, 0x4C, 0x45, 0x47, 0x41, 0x4C, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45 + .byte 0x5F, 0x42, 0x45, 0x41, 0x43, 0x4F, 0x4E, 0x5F, 0x4C, 0x4F, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C + .byte 0x49, 0x44, 0x5F, 0x50, 0x41, 0x52, 0x41, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45 + .byte 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x57, 0x4C, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48 + .byte 0x5F, 0x45, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x42, 0x45, 0x41, 0x43, 0x4F, 0x4E, 0x5F, 0x52, 0x45, 0x43, 0x56 + .byte 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45 + .byte 0x5F, 0x52, 0x45, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x42, 0x45, 0x41 + .byte 0x43, 0x4F, 0x4E, 0x5F, 0x53, 0x45, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53 + .byte 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x50, 0x41, 0x52, 0x45, 0x4E, 0x54, 0x5F + .byte 0x46, 0x4F, 0x55, 0x4E, 0x44, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45 + .byte 0x44, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x53, 0x54, 0x4F, 0x50, 0x00, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4F, 0x56, 0x45, 0x52, 0x5F + .byte 0x4D, 0x41, 0x58, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69 + .byte 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x5F, 0x49, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x44, 0x49, 0x53, 0x41, 0x53, 0x53, 0x4F, 0x43, 0x49, 0x41, 0x54 + .byte 0x45, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45 + .byte 0x5F, 0x50, 0x41, 0x52, 0x45, 0x4E, 0x54, 0x5F, 0x53, 0x54, 0x41, 0x52, 0x54, 0x00, 0x00, 0x00 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53 + .byte 0x54, 0x41, 0x54, 0x45, 0x5F, 0x42, 0x55, 0x53, 0x59, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53 + .byte 0x54, 0x41, 0x54, 0x45, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4E, 0x54 + .byte 0x49, 0x43, 0x41, 0x54, 0x45, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x5F, 0x53, 0x54, 0x41 + .byte 0x52, 0x54, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x00, 0x00 + .byte 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x53, 0x45, 0x4E, 0x44, 0x5F + .byte 0x51, 0x55, 0x45, 0x55, 0x45, 0x5F, 0x46, 0x55, 0x4C, 0x4C, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45 + .byte 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x57, 0x4C, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49 + .byte 0x44, 0x5F, 0x50, 0x41, 0x52, 0x41, 0x4D, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x4E, 0x4F, 0x5F, 0x52 + .byte 0x41, 0x44, 0x49, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F + .byte 0x44, 0x45, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x50, 0x4F, 0x4C, 0x4C, 0x42 + .byte 0x49, 0x54, 0x4D, 0x41, 0x50, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x53, 0x43, 0x41 + .byte 0x4E, 0x4E, 0x49, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x57, 0x4D, 0x5F, 0x53, 0x54, 0x41, 0x54, 0x45 + .byte 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x50, 0x41, 0x52, 0x45, 0x4E, 0x54, 0x5F, 0x4E, 0x4F, 0x54, 0x5F + .byte 0x46, 0x4F, 0x55, 0x4E, 0x44, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E + .byte 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x4B, 0x45, 0x59 + .byte 0x53, 0x48, 0x41, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x44, 0x41, 0x54 + .byte 0x41, 0x53, 0x48, 0x41, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69 + .byte 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F + .byte 0x44, 0x49, 0x53, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x59, 0x53, 0x53 + .byte 0x54, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54, 0x5F, 0x46, 0x41, 0x49 + .byte 0x4C, 0x00, 0x00, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x4D, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45 + .byte 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x45, 0x52, 0x52, 0x43, 0x4F, 0x44, 0x45, 0x5F, 0x50, 0x41, 0x52, 0x45 + .byte 0x4E, 0x54, 0x5F, 0x4E, 0x4F, 0x54, 0x5F, 0x46, 0x4F, 0x55, 0x4E, 0x44, 0x00, 0x00, 0x00, 0x00 + +ov13_02247120: ; 0x02247120 + .byte 0x74, 0x6E, 0x24, 0x02, 0xAC, 0x6E, 0x24, 0x02, 0xE8, 0x6F, 0x24, 0x02, 0x00, 0x6F, 0x24, 0x02 + .byte 0x28, 0x70, 0x24, 0x02, 0x68, 0x70, 0x24, 0x02, 0x48, 0x70, 0x24, 0x02, 0xD4, 0x70, 0x24, 0x02 + .byte 0xB0, 0x70, 0x24, 0x02, 0x54, 0x6F, 0x24, 0x02, 0xE4, 0x6E, 0x24, 0x02, 0x54, 0x6B, 0x24, 0x02 + .byte 0x20, 0x6E, 0x24, 0x02, 0x48, 0x6D, 0x24, 0x02, 0x08, 0x70, 0x24, 0x02, 0x3C, 0x6E, 0x24, 0x02 + .byte 0x38, 0x6F, 0x24, 0x02, 0xA0, 0x6C, 0x24, 0x02, 0x94, 0x6D, 0x24, 0x02, 0x58, 0x6E, 0x24, 0x02 + .byte 0x28, 0x6C, 0x24, 0x02, 0x18, 0x6D, 0x24, 0x02, 0xA8, 0x6B, 0x24, 0x02, 0xB8, 0x6C, 0x24, 0x02 + .byte 0xE8, 0x6C, 0x24, 0x02, 0x10, 0x6C, 0x24, 0x02, 0xE8, 0x6D, 0x24, 0x02, 0xC8, 0x6E, 0x24, 0x02 + .byte 0x04, 0x6E, 0x24, 0x02, 0x1C, 0x6F, 0x24, 0x02, 0x30, 0x6D, 0x24, 0x02, 0x88, 0x6C, 0x24, 0x02 + .byte 0x60, 0x6D, 0x24, 0x02, 0x94, 0x6B, 0x24, 0x02, 0x58, 0x6B, 0x24, 0x02, 0xF8, 0x6B, 0x24, 0x02 + .byte 0x78, 0x6D, 0x24, 0x02, 0x70, 0x6C, 0x24, 0x02, 0x58, 0x6C, 0x24, 0x02, 0xB0, 0x6D, 0x24, 0x02 + .byte 0xE4, 0x6B, 0x24, 0x02, 0x40, 0x6C, 0x24, 0x02, 0x80, 0x6B, 0x24, 0x02, 0x70, 0x6F, 0x24, 0x02 + .byte 0xD0, 0x6B, 0x24, 0x02, 0x90, 0x6E, 0x24, 0x02, 0xC8, 0x6F, 0x24, 0x02, 0x6C, 0x6B, 0x24, 0x02 + .byte 0xD0, 0x6C, 0x24, 0x02, 0xBC, 0x6B, 0x24, 0x02, 0x8C, 0x6F, 0x24, 0x02, 0xCC, 0x6D, 0x24, 0x02 + .byte 0x00, 0x6D, 0x24, 0x02, 0x8C, 0x70, 0x24, 0x02, 0xF8, 0x70, 0x24, 0x02, 0xA8, 0x6F, 0x24, 0x02 + +ov13_02247200: ; 0x02247200 + .byte 0x25, 0x73, 0x20, 0x2D, 0x3E, 0x20, 0x00, 0x00 + +ov13_02247208: ; 0x02247208 + .byte 0x25, 0x73, 0x0A, 0x00 + +ov13_0224720C: ; 0x0224720C + .byte 0x53, 0x74, 0x61, 0x72 + .byte 0x74, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x2D, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x63, 0x68 + .byte 0x69, 0x6C, 0x64, 0x20, 0x28, 0x61, 0x69, 0x64, 0x20, 0x25, 0x78, 0x29, 0x20, 0x63, 0x6F, 0x6E + .byte 0x6E, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0A, 0x00 + +ov13_02247238: ; 0x02247238 + .byte 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72 + .byte 0x65, 0x6E, 0x74, 0x20, 0x2D, 0x20, 0x63, 0x68, 0x69, 0x6C, 0x64, 0x20, 0x28, 0x61, 0x69, 0x64 + .byte 0x20, 0x25, 0x78, 0x29, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x65 + .byte 0x64, 0x0A, 0x00, 0x00 + +ov13_02247264: ; 0x02247264 + .byte 0x75, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x69, 0x6E, 0x64, 0x69 + .byte 0x63, 0x61, 0x74, 0x65, 0x2C, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x25, 0x64 + .byte 0x0A, 0x00, 0x00, 0x00 + +ov13_02247284: ; 0x02247284 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x65 + .byte 0x6E, 0x74, 0x4B, 0x65, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65 + .byte 0x64, 0x0A, 0x00, 0x00 + +ov13_022472B4: ; 0x022472B4 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6E, 0x45, 0x6E, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6E, 0x74 + .byte 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x00 + +ov13_022472DC: ; 0x022472DC + .byte 0x72, 0x65, 0x63, 0x76 + .byte 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x25 + .byte 0x64, 0x0A, 0x00, 0x00 + +ov13_022472F4: ; 0x022472F4 + .byte 0x73, 0x65, 0x6E, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20 + .byte 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3D, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00 + +ov13_0224730C: ; 0x0224730C + .byte 0x63, 0x68, 0x61, 0x6E + .byte 0x6E, 0x65, 0x6C, 0x20, 0x25, 0x64, 0x20, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x20, 0x3D, 0x20 + .byte 0x25, 0x78, 0x0A, 0x00 + +ov13_02247324: ; 0x02247324 + .byte 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x6E + .byte 0x6E, 0x65, 0x6C, 0x20, 0x3D, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00, 0x00 + +ov13_0224733C: ; 0x0224733C + .byte 0x75, 0x6E, 0x6B, 0x6E + .byte 0x6F, 0x77, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x20, 0x6D, 0x6F, 0x64, 0x65 + .byte 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x00 + +ov13_02247358: ; 0x02247358 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x74, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x53, 0x68, 0x61, 0x72 + .byte 0x69, 0x6E, 0x67, 0x20, 0x2D, 0x20, 0x57, 0x61, 0x72, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x4E, 0x6F + .byte 0x20, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x0A, 0x00 + +ov13_02247388: ; 0x02247388 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56 + .byte 0x5F, 0x57, 0x48, 0x5F, 0x53, 0x74, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x53, 0x68, 0x61, 0x72 + .byte 0x69, 0x6E, 0x67, 0x20, 0x2D, 0x20, 0x57, 0x61, 0x72, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x4E, 0x6F + .byte 0x20, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x0A, 0x00, 0x00, 0x00 + +ov13_022473BC: ; 0x022473BC + .byte 0x61, 0x6C, 0x72, 0x65 + .byte 0x61, 0x64, 0x79, 0x20, 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F + .byte 0x53, 0x59, 0x53, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5F, 0x49, 0x44, 0x4C, 0x45, 0x0A, 0x00, 0x00 + +ov13_022473E0: ; 0x022473E0 + .byte 0x44, 0x57, 0x43, 0x69, 0x5F, 0x4D, 0x4F, 0x56, 0x5F, 0x57, 0x48, 0x5F, 0x46, 0x69, 0x6E, 0x61 + .byte 0x6C, 0x69, 0x7A, 0x65, 0x2C, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3D, 0x20, 0x25, 0x64 + .byte 0x0A, 0x00, 0x00, 0x00 + +ov13_02247404: ; 0x02247404 + .byte 0x72, 0x6F, 0x6D, 0x3A, 0x2F, 0x64, 0x77, 0x63, 0x2F, 0x75, 0x74, 0x69 + .byte 0x6C, 0x69, 0x74, 0x79, 0x2E, 0x62, 0x69, 0x6E, 0x00, 0x00, 0x00, 0x00 + +ov13_0224741C: ; 0x0224741C + .byte 0x25, 0x73, 0x3A, 0x2F + .byte 0x00, 0x00, 0x00, 0x00 + +ov13_02247424: ; 0x02247424 + .byte 0x72, 0x6F, 0x6D, 0x3A, 0x2F, 0x00, 0x00, 0x00 + +ov13_0224742C: ; 0x0224742C + .byte 0x2E, 0x6C, 0x00, 0x00 + +ov13_02247430: ; 0x02247430 + .byte 0x50, 0x74, 0x24, 0x02, 0x40, 0x74, 0x24, 0x02 + +ov13_02247438: ; 0x02247438 + .byte 0x60, 0x74, 0x24, 0x02, 0x40, 0x74, 0x24, 0x02 + .byte 0x6D, 0x73, 0x67, 0x2F, 0x6C, 0x63, 0x5F, 0x73, 0x2E, 0x4E, 0x46, 0x54, 0x52, 0x2E, 0x6C, 0x00 + .byte 0x6D, 0x73, 0x67, 0x2F, 0x6B, 0x63, 0x5F, 0x6D, 0x2E, 0x4E, 0x46, 0x54, 0x52, 0x2E, 0x6C, 0x00 + .byte 0x6D, 0x73, 0x67, 0x2F, 0x6C, 0x63, 0x5F, 0x6D, 0x2E, 0x4E, 0x46, 0x54, 0x52, 0x2E, 0x6C, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + + .bss + +ov13_0224F464: + .space 0x4 + +ov13_0224F468: ; 0x0224F468 + .space 0x4 + +ov13_0224F46C: ; 0x0224F46C + .space 0x4 + +ov13_0224F470: ; 0x0224F470 + .space 0x40 + +ov13_0224F4B0: ; 0x0224F4B0 + .space 0x4 + +ov13_0224F4B4: ; 0x0224F4B4 + .space 0x4 + +ov13_0224F4B8: ; 0x0224F4B8 + .space 0x4 + +ov13_0224F4BC: ; 0x0224F4BC + .space 0x4 + +ov13_0224F4C0: ; 0x0224F4C0 + .space 0x4 + +ov13_0224F4C4: ; 0x0224F4C4 + .space 0x4 + +ov13_0224F4C8: ; 0x0224F4C8 + .space 0x4 + +ov13_0224F4CC: ; 0x0224F4CC + .space 0x20 + +ov13_0224F4EC: ; 0x0224F4EC + .space 0x4 + +ov13_0224F4F0: ; 0x0224F4F0 + .space 0x4 + +ov13_0224F4F4: ; 0x0224F4F4 + .space 0x4 + +ov13_0224F4F8: ; 0x0224F4F8 + .space 0x4 + +ov13_0224F4FC: ; 0x0224F4FC + .space 0x8 + +ov13_0224F504: ; 0x0224F504 + .space 0x4 + +ov13_0224F508: ; 0x0224F508 + .space 0xC + +ov13_0224F514: ; 0x0224F514 + .space 0x4 + +ov13_0224F518: ; 0x0224F518 + .space 0x4 + +ov13_0224F51C: ; 0x0224F51C + .space 0x4 + +ov13_0224F520: ; 0x0224F520 + .space 0x4 + +ov13_0224F524: ; 0x0224F524 + .space 0x4 + +ov13_0224F528: ; 0x0224F528 + .space 0x4 + +ov13_0224F52C: ; 0x0224F52C + .space 0x8 + +ov13_0224F534: ; 0x0224F534 + .space 0x4 + +ov13_0224F538: ; 0x0224F538 + .space 0x4 + +ov13_0224F53C: ; 0x0224F53C + .space 0x4 + +ov13_0224F540: ; 0x0224F540 + .space 0x4 + +ov13_0224F544: ; 0x0224F544 + .space 0x4 + +ov13_0224F548: ; 0x0224F548 + .space 0x4 + +ov13_0224F54C: ; 0x0224F54C + .space 0x8 + +ov13_0224F554: ; 0x0224F554 + .space 0x4 + +ov13_0224F558: ; 0x0224F558 + .space 0x4 + +ov13_0224F55C: ; 0x0224F55C + .space 0x4 + +ov13_0224F560: ; 0x0224F560 + .space 0x4 + +ov13_0224F564: ; 0x0224F564 + .space 0x4 + +ov13_0224F568: ; 0x0224F568 + .space 0x4 + +ov13_0224F56C: ; 0x0224F56C + .space 0x4 + +ov13_0224F570: ; 0x0224F570 + .space 0x4 + +ov13_0224F574: ; 0x0224F574 + .space 0x8 + +ov13_0224F57C: ; 0x0224F57C + .space 0x4 + +ov13_0224F580: ; 0x0224F580 + .space 0x4 + +ov13_0224F584: ; 0x0224F584 + .space 0x4 + +ov13_0224F588: ; 0x0224F588 + .space 0x4 + +ov13_0224F58C: ; 0x0224F58C + .space 0x4 + +ov13_0224F590: ; 0x0224F590 + .space 0xC + +ov13_0224F59C: ; 0x0224F59C + .space 0x4 + +ov13_0224F5A0: ; 0x0224F5A0 + .space 0x4 + +ov13_0224F5A4: ; 0x0224F5A4 + .space 0x4 + +ov13_0224F5A8: ; 0x0224F5A8 + .space 0x4 + +ov13_0224F5AC: ; 0x0224F5AC + .space 0x4 + +ov13_0224F5B0: ; 0x0224F5B0 + .space 0x4 + +ov13_0224F5B4: ; 0x0224F5B4 + .space 0x4 + +ov13_0224F5B8: ; 0x0224F5B8 + .space 0x4 + +ov13_0224F5BC: ; 0x0224F5BC + .space 0x4 + +ov13_0224F5C0: ; 0x0224F5C0 + .space 0x8 + +ov13_0224F5C8: ; 0x0224F5C8 + .space 0x4 + +ov13_0224F5CC: ; 0x0224F5CC + .space 0x4 + +ov13_0224F5D0: ; 0x0224F5D0 + .space 0x4 + +ov13_0224F5D4: ; 0x0224F5D4 + .space 0x8 + +ov13_0224F5DC: ; 0x0224F5DC + .space 0x4 + +ov13_0224F5E0: ; 0x0224F5E0 + .space 0x4 + +ov13_0224F5E4: ; 0x0224F5E4 + .space 0x4 + +ov13_0224F5E8: ; 0x0224F5E8 + .space 0x4 + +ov13_0224F5EC: ; 0x0224F5EC + .space 0x4 + +ov13_0224F5F0: ; 0x0224F5F0 + .space 0x10 + +ov13_0224F600: ; 0x0224F600 + .space 0x8 + +ov13_0224F608: ; 0x0224F608 + .space 0x4 + +ov13_0224F60C: ; 0x0224F60C + .space 0x4 + +ov13_0224F610: ; 0x0224F610 + .space 0x34 + +ov13_0224F644: ; 0x0224F644 + .space 0x1c diff --git a/lib/NitroDWC/asm/overlay_38_arm.s b/lib/NitroDWC/asm/overlay_38_arm.s new file mode 100644 index 00000000..e26ce54a --- /dev/null +++ b/lib/NitroDWC/asm/overlay_38_arm.s @@ -0,0 +1,11606 @@ + .include "asm/macros.inc" + .include "overlay_38_arm.inc" + .include "global.inc" + + .text + + arm_func_start ghiResizeBuffer +ghiResizeBuffer: ; 0x0221C02C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0221C050 + ldr r0, _0221C0A8 ; =ov38_022251D4 + ldr r1, _0221C0AC ; =ov38_022251DC + ldr r2, _0221C0B0 ; =ov38_02225168 + mov r3, #0x20 + bl __msl_assertion_failed +_0221C050: + cmp r4, #0 + bgt _0221C06C + ldr r0, _0221C0B4 ; =ov38_022251EC + ldr r1, _0221C0AC ; =ov38_022251DC + ldr r2, _0221C0B0 ; =ov38_02225168 + mov r3, #0x21 + bl __msl_assertion_failed +_0221C06C: + cmp r5, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + movle r0, #0 + ldmleia sp!, {r3, r4, r5, pc} + ldmib r5, {r0, r1} + add r4, r1, r4 + mov r1, r4 + bl ov00_021EC3BC + cmp r0, #0 + moveq r0, #0 + stmneib r5, {r0, r4} + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221C0A8: .word ov38_022251D4 +_0221C0AC: .word ov38_022251DC +_0221C0B0: .word ov38_02225168 +_0221C0B4: .word ov38_022251EC + arm_func_end ghiResizeBuffer + + arm_func_start ghiInitBuffer +ghiInitBuffer: ; 0x0221C0B8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0221C0E4 + ldr r0, _0221C1BC ; =ov38_02225200 + ldr r1, _0221C1C0 ; =ov38_022251DC + ldr r2, _0221C1C4 ; =ov38_02225148 + mov r3, #0x43 + bl __msl_assertion_failed +_0221C0E4: + cmp r6, #0 + bne _0221C100 + ldr r0, _0221C1C8 ; =ov38_022251D4 + ldr r1, _0221C1C0 ; =ov38_022251DC + ldr r2, _0221C1C4 ; =ov38_02225148 + mov r3, #0x44 + bl __msl_assertion_failed +_0221C100: + cmp r5, #0 + bgt _0221C11C + ldr r0, _0221C1CC ; =ov38_0222520C + ldr r1, _0221C1C0 ; =ov38_022251DC + ldr r2, _0221C1C4 ; =ov38_02225148 + mov r3, #0x45 + bl __msl_assertion_failed +_0221C11C: + cmp r4, #0 + bgt _0221C138 + ldr r0, _0221C1D0 ; =ov38_022251EC + ldr r1, _0221C1C0 ; =ov38_022251DC + ldr r2, _0221C1C4 ; =ov38_02225148 + mov r3, #0x46 + bl __msl_assertion_failed +_0221C138: + cmp r7, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + movle r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + movle r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + str r7, [r6] + mov r2, #0 + str r2, [r6, #4] + str r2, [r6, #8] + str r2, [r6, #0xc] + str r2, [r6, #0x10] + str r4, [r6, #0x14] + str r2, [r6, #0x18] + str r2, [r6, #0x1c] + mov r0, r6 + mov r1, r5 + str r2, [r6, #0x20] + bl ghiResizeBuffer + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #4] + mov r1, #0 + strb r1, [r0] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221C1BC: .word ov38_02225200 +_0221C1C0: .word ov38_022251DC +_0221C1C4: .word ov38_02225148 +_0221C1C8: .word ov38_022251D4 +_0221C1CC: .word ov38_0222520C +_0221C1D0: .word ov38_022251EC + arm_func_end ghiInitBuffer + + arm_func_start ghiInitFixedBuffer +ghiInitFixedBuffer: ; 0x0221C1D4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0221C200 + ldr r0, _0221C2B8 ; =ov38_02225200 + ldr r1, _0221C2BC ; =ov38_022251DC + ldr r2, _0221C2C0 ; =ov38_02225178 + mov r3, #0x74 + bl __msl_assertion_failed +_0221C200: + cmp r6, #0 + bne _0221C21C + ldr r0, _0221C2C4 ; =ov38_022251D4 + ldr r1, _0221C2BC ; =ov38_022251DC + ldr r2, _0221C2C0 ; =ov38_02225178 + mov r3, #0x75 + bl __msl_assertion_failed +_0221C21C: + cmp r5, #0 + bne _0221C238 + ldr r0, _0221C2C8 ; =ov38_0222521C + ldr r1, _0221C2BC ; =ov38_022251DC + ldr r2, _0221C2C0 ; =ov38_02225178 + mov r3, #0x76 + bl __msl_assertion_failed +_0221C238: + cmp r4, #0 + bgt _0221C254 + ldr r0, _0221C2CC ; =ov38_02225228 + ldr r1, _0221C2BC ; =ov38_022251DC + ldr r2, _0221C2C0 ; =ov38_02225178 + mov r3, #0x77 + bl __msl_assertion_failed +_0221C254: + cmp r7, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + movle r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + str r7, [r6] + str r5, [r6, #4] + str r4, [r6, #8] + mov r2, #0 + str r2, [r6, #0xc] + str r2, [r6, #0x14] + mov r0, #1 + str r0, [r6, #0x18] + str r0, [r6, #0x1c] + str r2, [r6, #0x20] + ldr r1, [r6, #4] + strb r2, [r1] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221C2B8: .word ov38_02225200 +_0221C2BC: .word ov38_022251DC +_0221C2C0: .word ov38_02225178 +_0221C2C4: .word ov38_022251D4 +_0221C2C8: .word ov38_0222521C +_0221C2CC: .word ov38_02225228 + arm_func_end ghiInitFixedBuffer + + arm_func_start ghiFreeBuffer +ghiFreeBuffer: ; 0x0221C2D0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0221C2F0 + ldr r0, _0221C324 ; =ov38_022251D4 + ldr r1, _0221C328 ; =ov38_022251DC + ldr r2, _0221C32C ; =_02225138 + mov r3, #0x9b + bl __msl_assertion_failed +_0221C2F0: + cmp r4, #0 + ldrne r0, [r4, #4] + cmpne r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #0x1c] + cmp r1, #0 + bne _0221C310 + bl ov00_021EC3D8 +_0221C310: + mov r0, r4 + mov r1, #0 + mov r2, #0x24 + bl memset + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221C324: .word ov38_022251D4 +_0221C328: .word ov38_022251DC +_0221C32C: .word _02225138 + arm_func_end ghiFreeBuffer + + arm_func_start ghiAppendDataToBuffer +ghiAppendDataToBuffer: ; 0x0221C330 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + movs sb, r0 + mov r8, r1 + ldr r6, [sb] + bne _0221C360 + ldr r0, _0221C5D4 ; =ov38_022251D4 + ldr r1, _0221C5D8 ; =ov38_022251DC + ldr r2, _0221C5DC ; =ov38_022251A4 + mov r3, #0xb7 + bl __msl_assertion_failed +_0221C360: + cmp r8, #0 + bne _0221C37C + ldr r0, _0221C5E0 ; =ov38_02225234 + ldr r1, _0221C5D8 ; =ov38_022251DC + ldr r2, _0221C5DC ; =ov38_022251A4 + mov r3, #0xb8 + bl __msl_assertion_failed +_0221C37C: + ldr r0, [sp, #0x30] + cmp r0, #0 + bge _0221C39C + ldr r0, _0221C5E4 ; =ov38_0222523C + ldr r1, _0221C5D8 ; =ov38_022251DC + ldr r2, _0221C5DC ; =ov38_022251A4 + mov r3, #0xb9 + bl __msl_assertion_failed +_0221C39C: + cmp sb, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr} + addeq sp, sp, #0x10 + bxeq lr + cmp r8, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x30] + cmp r0, #0 + addlt sp, sp, #0xc + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, lr} + addlt sp, sp, #0x10 + bxlt lr + bne _0221C3F8 + mov r0, r8 + bl strlen + str r0, [sp, #0x30] +_0221C3F8: + ldr r0, [sb, #0x20] + cmp r0, #1 + bne _0221C500 + ldr r0, [r6, #0x168] + cmp r0, #0 + bne _0221C424 + ldr r0, _0221C5E8 ; =ov38_0222524C + ldr r1, _0221C5D8 ; =ov38_022251DC + ldr r2, _0221C5DC ; =ov38_022251A4 + mov r3, #0xce + bl __msl_assertion_failed +_0221C424: + add r5, sp, #8 + add r4, sp, #0x30 +_0221C42C: + ldr r2, [sb, #8] + ldr r1, [sb, #0xc] + mov r0, r6 + sub r1, r2, r1 + str r1, [sp, #8] + ldr r3, [sb, #4] + ldr r1, [sb, #0xc] + mov r2, r8 + add r1, r3, r1 + stmia sp, {r1, r5} + ldr r7, [r6, #0x17c] + mov r3, r4 + add r1, r6, #0x164 + blx r7 + mov r7, r0 + cmp r7, #2 + bne _0221C4E4 + ldr r0, [sb, #0x18] + cmp r0, #0 + beq _0221C4A8 + ldr r0, [sb] + mov r1, #1 + str r1, [r0, #0xfc] + ldr r0, [sb] + mov r1, #2 + str r1, [r0, #0x38] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr +_0221C4A8: + ldr r1, [sb, #0x14] + mov r0, sb + bl ghiResizeBuffer + cmp r0, #0 + beq _0221C4F4 + ldr r0, [sb] + mov r2, #1 + str r2, [r0, #0xfc] + ldr r1, [sb] + add sp, sp, #0xc + str r2, [r1, #0x38] + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr +_0221C4E4: + ldr r1, [sb, #0xc] + ldr r0, [sp, #8] + add r0, r1, r0 + str r0, [sb, #0xc] +_0221C4F4: + cmp r7, #2 + beq _0221C42C + b _0221C5C0 +_0221C500: + ldr r2, [sb, #0xc] + ldr r1, [sp, #0x30] + ldr r0, [sb, #8] + add r4, r2, r1 + cmp r4, r0 + blt _0221C598 +_0221C518: + ldr r0, [sb, #0x18] + cmp r0, #0 + beq _0221C550 + ldr r0, [sb] + mov r1, #1 + str r1, [r0, #0xfc] + ldr r0, [sb] + mov r1, #2 + str r1, [r0, #0x38] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr +_0221C550: + ldr r1, [sb, #0x14] + mov r0, sb + bl ghiResizeBuffer + cmp r0, #0 + bne _0221C58C + ldr r0, [sb] + mov r2, #1 + str r2, [r0, #0xfc] + ldr r1, [sb] + add sp, sp, #0xc + str r2, [r1, #0x38] + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr +_0221C58C: + ldr r0, [sb, #8] + cmp r4, r0 + bge _0221C518 +_0221C598: + ldr r3, [sb, #4] + ldr r0, [sb, #0xc] + ldr r2, [sp, #0x30] + mov r1, r8 + add r0, r3, r0 + bl memcpy + str r4, [sb, #0xc] + ldr r0, [sb, #4] + mov r1, #0 + strb r1, [r0, r4] +_0221C5C0: + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0221C5D4: .word ov38_022251D4 +_0221C5D8: .word ov38_022251DC +_0221C5DC: .word ov38_022251A4 +_0221C5E0: .word ov38_02225234 +_0221C5E4: .word ov38_0222523C +_0221C5E8: .word ov38_0222524C + arm_func_end ghiAppendDataToBuffer + + arm_func_start ov38_0221C5EC +ov38_0221C5EC: ; 0x0221C5EC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r2 + mov r2, #0 + mov r5, r0 + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _0221C664 ; =ov38_02225288 + mov r0, r5 + mov r2, #2 + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _0221C668 ; =ov38_0222528C + mov r0, r5 + mov r2, #2 + bl ghiAppendDataToBuffer + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221C664: .word ov38_02225288 +_0221C668: .word ov38_0222528C + arm_func_end ov38_0221C5EC + + arm_func_start ghiAppendCharToBuffer +ghiAppendCharToBuffer: ; 0x0221C66C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + movs r4, r0 + strb r1, [sp] + bne _0221C694 + ldr r0, _0221C6BC ; =ov38_022251D4 + ldr r1, _0221C6C0 ; =ov38_022251DC + ldr r2, _0221C6C4 ; =ov38_0222518C + ldr r3, _0221C6C8 ; =0x00000131 + bl __msl_assertion_failed +_0221C694: + cmp r4, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r1, sp, #0 + mov r0, r4 + mov r2, #1 + bl ghiAppendDataToBuffer + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0221C6BC: .word ov38_022251D4 +_0221C6C0: .word ov38_022251DC +_0221C6C4: .word ov38_0222518C +_0221C6C8: .word 0x00000131 + arm_func_end ghiAppendCharToBuffer + + arm_func_start ov38_0221C6CC +ov38_0221C6CC: ; 0x0221C6CC + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + mov r2, r1 + mov r4, r0 + ldr r1, _0221C700 ; =ov38_02225290 + add r0, sp, #0 + bl sprintf + add r1, sp, #0 + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221C700: .word ov38_02225290 + arm_func_end ov38_0221C6CC + + arm_func_start ghiResetBuffer +ghiResetBuffer: ; 0x0221C704 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0221C724 + ldr r0, _0221C73C ; =ov38_022251D4 + ldr r1, _0221C740 ; =ov38_022251DC + ldr r2, _0221C744 ; =ov38_02225158 + mov r3, #0x16c + bl __msl_assertion_failed +_0221C724: + mov r1, #0 + str r1, [r4, #0xc] + str r1, [r4, #0x10] + ldr r0, [r4, #4] + strb r1, [r0] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221C73C: .word ov38_022251D4 +_0221C740: .word ov38_022251DC +_0221C744: .word ov38_02225158 + arm_func_end ghiResetBuffer + + arm_func_start ov38_0221C748 +ov38_0221C748: ; 0x0221C748 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r7, r0 + mov r6, #0 + add r5, sp, #4 + add r4, sp, #0 + mvn r8, #0 +_0221C764: + ldr r0, [r7, #0x48] + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov00_021FF59C + cmp r0, r8 + beq _0221C78C + ldr r0, [sp] + cmp r0, #0 + beq _0221C7B4 +_0221C78C: + mov r0, #1 + str r0, [r7, #0xfc] + mov r0, #5 + str r0, [r7, #0x38] + ldr r0, [r7, #0x48] + bl ov00_021FFA60 + str r0, [r7, #0x4c] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221C7B4: + ldr r0, [sp, #4] + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r3, [r7, #0x60] + ldr r1, [r7, #0x54] + ldr r2, [r7, #0x5c] + mov r0, r7 + add r1, r1, r3 + sub r2, r2, r3 + bl ov38_0221CD90 + cmp r0, r8 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, [r7, #0x60] + add r1, r1, r0 + str r1, [r7, #0x60] + ldr r0, [r7, #0x5c] + cmp r1, r0 + blt _0221C764 + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov38_0221C748 + + arm_func_start ghiReadDataFromBuffer +ghiReadDataFromBuffer: ; 0x0221C818 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + bne _0221C840 + ldr r0, _0221C8C0 ; =ov38_02225294 + ldr r1, _0221C8C4 ; =ov38_022251DC + ldr r2, _0221C8C8 ; =ov38_022251BC + ldr r3, _0221C8CC ; =0x000001B7 + bl __msl_assertion_failed +_0221C840: + cmp r5, #0 + bne _0221C85C + ldr r0, _0221C8D0 ; =ov38_022252A8 + ldr r1, _0221C8C4 ; =ov38_022251DC + ldr r2, _0221C8C8 ; =ov38_022251BC + mov r3, #0x1b8 + bl __msl_assertion_failed +_0221C85C: + ldr r4, [r5] + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r3, [r7, #0x10] + ldr r0, [r7, #0xc] + sub r0, r0, r3 + cmp r0, #0 + movle r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r7, #4] + cmp r4, r0 + movge r4, r0 + mov r0, r6 + mov r2, r4 + add r1, r1, r3 + bl memcpy + mov r0, #0 + strb r0, [r6, r4] + str r4, [r5] + ldr r1, [r7, #0x10] + mov r0, #1 + add r1, r1, r4 + str r1, [r7, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221C8C0: .word ov38_02225294 +_0221C8C4: .word ov38_022251DC +_0221C8C8: .word ov38_022251BC +_0221C8CC: .word 0x000001B7 +_0221C8D0: .word ov38_022252A8 + arm_func_end ghiReadDataFromBuffer + + arm_func_start ghiCallCompletedCallback +ghiCallCompletedCallback: ; 0x0221C8D4 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + bne _0221C8F4 + ldr r0, _0221C948 ; =ov38_022252FC + ldr r1, _0221C94C ; =ov38_02225308 + ldr r2, _0221C950 ; =ov38_022252E0 + mov r3, #0x1b + bl __msl_assertion_failed +_0221C8F4: + ldr ip, [r5, #0x40] + cmp ip, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0xc] + cmp r0, #0 + movne r4, #0 + movne r3, r4 + ldreq r4, [r5, #0xc0] + ldreq r3, [r5, #0x100] + ldr r0, [r5, #0x44] + mov r2, r4 + str r0, [sp] + ldr r0, [r5, #4] + ldr r1, [r5, #0x38] + blx ip + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #0 + moveq r0, #1 + streq r0, [r5, #0xd8] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221C948: .word ov38_022252FC +_0221C94C: .word ov38_02225308 +_0221C950: .word ov38_022252E0 + arm_func_end ghiCallCompletedCallback + + arm_func_start ghiCallProgressCallback +ghiCallProgressCallback: ; 0x0221C954 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _0221C980 + ldr r0, _0221C9C4 ; =ov38_022252FC + ldr r1, _0221C9C8 ; =ov38_02225308 + ldr r2, _0221C9CC ; =ov38_022252C8 + mov r3, #0x45 + bl __msl_assertion_failed +_0221C980: + ldr ip, [r6, #0x3c] + cmp ip, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r6, #0x100] + mov r2, r5 + str r0, [sp] + ldr r0, [r6, #0x104] + mov r3, r4 + str r0, [sp, #4] + ldr r0, [r6, #0x44] + str r0, [sp, #8] + ldr r0, [r6, #4] + ldr r1, [r6, #0x10] + blx ip + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0221C9C4: .word ov38_022252FC +_0221C9C8: .word ov38_02225308 +_0221C9CC: .word ov38_022252C8 + arm_func_end ghiCallProgressCallback + + arm_func_start ghiCallPostCallback +ghiCallPostCallback: ; 0x0221C9D0 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + movs r4, r0 + bne _0221C9F4 + ldr r0, _0221CA38 ; =ov38_022252FC + ldr r1, _0221CA3C ; =ov38_02225308 + ldr r2, _0221CA40 ; =ov38_022252B4 + mov r3, #0x5e + bl __msl_assertion_failed +_0221C9F4: + ldr r0, [r4, #0x150] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0x140] + bl ArrayLength + str r0, [sp] + ldr r0, [r4, #0x44] + str r0, [sp, #4] + ldr r0, [r4, #4] + ldr r1, [r4, #0x148] + ldr r2, [r4, #0x14c] + ldr r3, [r4, #0x144] + ldr ip, [r4, #0x150] + blx ip + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221CA38: .word ov38_022252FC +_0221CA3C: .word ov38_02225308 +_0221CA40: .word ov38_022252B4 + arm_func_end ghiCallPostCallback + + arm_func_start ov38_0221CA44 +ov38_0221CA44: ; 0x0221CA44 + bx lr + arm_func_end ov38_0221CA44 + + arm_func_start ov38_0221CA48 +ov38_0221CA48: ; 0x0221CA48 + bx lr + arm_func_end ov38_0221CA48 + + arm_func_start ov38_0221CA4C +ov38_0221CA4C: ; 0x0221CA4C + bx lr + arm_func_end ov38_0221CA4C + + arm_func_start ov38_0221CA50 +ov38_0221CA50: ; 0x0221CA50 + bx lr + arm_func_end ov38_0221CA50 + + arm_func_start ov38_0221CA54 +ov38_0221CA54: ; 0x0221CA54 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r1, #0 + mov r7, r0 + str r1, [sp, #0xc] + str r1, [sp, #8] + add r5, sp, #8 + add r4, sp, #0xc +_0221CA74: + ldr ip, [r7, #0xa8] + ldr r0, [r7, #0xa4] + ldr r2, [r7, #0x9c] + sub r0, r0, ip + str r0, [sp, #0xc] + ldr r3, [r7, #0x80] + ldr r0, [r7, #0x7c] + ldr r1, [r7, #0x78] + sub r0, r0, r3 + str r0, [sp, #8] + add r0, r1, r3 + stmia sp, {r0, r5} + ldr r6, [r7, #0x180] + mov r0, r7 + mov r3, r4 + add r1, r7, #0x164 + add r2, r2, ip + blx r6 + mov r6, r0 + cmp r6, #2 + bne _0221CAE4 + ldr r1, [r7, #0x88] + add r0, r7, #0x74 + bl ghiResizeBuffer + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0221CAE4: + cmp r6, #2 + ldreq r0, [sp, #8] + cmpeq r0, #0 + beq _0221CA74 + ldr r1, [r7, #0xa8] + ldr r0, [sp, #0xc] + add r0, r1, r0 + str r0, [r7, #0xa8] + ldr r1, [r7, #0x80] + ldr r0, [sp, #8] + add r0, r1, r0 + str r0, [r7, #0x80] + ldr r1, [r7, #0xa8] + cmp r1, #0xff + ble _0221CB54 + ldr r0, [r7, #0xa4] + subs r4, r0, r1 + bne _0221CB38 + add r0, r7, #0x98 + bl ghiResetBuffer + b _0221CB54 +_0221CB38: + ldr r0, [r7, #0x9c] + mov r2, r4 + add r1, r0, r1 + bl memmove + mov r0, #0 + str r0, [r7, #0xa8] + str r4, [r7, #0xa4] +_0221CB54: + cmp r6, #3 + addne sp, sp, #0x10 + mov r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + str r0, [r7, #0xfc] + mov r0, #0x11 + str r0, [r7, #0x38] + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov38_0221CA54 + + arm_func_start ov38_0221CB7C +ov38_0221CB7C: ; 0x0221CB7C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r5, r2 + ldr r2, [r5] + ldr r0, [r7, #0x134] + mov r6, r1 + cmp r0, #0 + sub r4, r2, #1 + beq _0221CBD0 + bl ov00_021FF368 + ldr r1, _0221CD8C ; =ov38_0222531C + ldr r3, [r7, #0x138] + ldr r2, [r1] + add r2, r3, r2 + cmp r0, r2 + movlo r0, #1 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + str r0, [r7, #0x138] + ldr r0, [r1, #4] + cmp r4, r0 + movge r4, r0 +_0221CBD0: + ldr r1, [r7, #0x84] + ldr r0, [r7, #0x80] + cmp r1, r0 + bge _0221CC18 + mov r1, r6 + mov r2, r5 + add r0, r7, #0x74 + bl ghiReadDataFromBuffer + ldr r1, [r7, #0x84] + ldr r0, [r7, #0x80] + cmp r1, r0 + bne _0221CC10 + ldr r0, [r7, #0xf8] + str r0, [r7, #0x80] + ldr r0, [r7, #0xf8] + str r0, [r7, #0x84] +_0221CC10: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CC18: + ldr r0, [r7, #0x48] + mov r1, r6 + mov r2, r4 + mov r3, #0 + bl ov00_021FF92C + mov r2, r0 + mvn r0, #0 + str r2, [sp] + cmp r2, r0 + bne _0221CC88 + ldr r0, [r7, #0x48] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r2, #1 + str r2, [r7, #0xfc] + mov r1, #5 + str r1, [r7, #0x38] + str r0, [r7, #0x4c] + str r2, [r7, #0x130] + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CC88: + cmp r2, #0 + bne _0221CCA0 + mov r0, #1 + str r0, [r7, #0x130] + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CCA0: + ldr r0, [r7, #0x168] + cmp r0, #0 + beq _0221CD6C + mov r1, r6 + add r0, r7, #0x98 + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + bl ov38_0221CA54 + cmp r0, #0 + bne _0221CCEC + mov r0, #1 + str r0, [r7, #0xfc] + mov r0, #0x11 + str r0, [r7, #0x38] + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CCEC: + ldr r1, [r7, #0x80] + ldr r0, [r7, #0x84] + sub r0, r1, r0 + cmp r0, #0 + bgt _0221CD14 + mov r0, #0 + strb r0, [r6] + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CD14: + ldr r0, [r5] + add r2, sp, #0 + sub r3, r0, #1 + mov r1, r6 + add r0, r7, #0x74 + str r3, [sp] + bl ghiReadDataFromBuffer + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r7, #0x84] + ldr r0, [r7, #0x80] + cmp r1, r0 + bne _0221CD5C + ldr r0, [r7, #0xf8] + str r0, [r7, #0x80] + ldr r0, [r7, #0xf8] + str r0, [r7, #0x84] +_0221CD5C: + ldr r2, [sp] + cmp r2, #0 + movle r0, #1 + ldmleia sp!, {r3, r4, r5, r6, r7, pc} +_0221CD6C: + mov r0, #0 + strb r0, [r6, r2] + ldr r1, [sp] + str r1, [r5] + ldr r1, [sp] + cmp r1, #0 + movle r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221CD8C: .word ov38_0222531C + arm_func_end ov38_0221CB7C + + arm_func_start ov38_0221CD90 +ov38_0221CD90: ; 0x0221CD90 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x48] + mov r3, #0 + bl ov00_021FF970 + mvn r1, #0 + cmp r0, r1 + bne _0221CDF4 + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, #1 + str r1, [r4, #0xfc] + mov r1, #5 + str r1, [r4, #0x38] + str r0, [r4, #0x4c] + sub r0, r1, #6 + ldmia sp!, {r4, pc} +_0221CDF4: + ldr r1, [r4, #0x10] + cmp r1, #4 + ldreq r1, [r4, #0x148] + addeq r1, r1, r0 + streq r1, [r4, #0x148] + ldmia sp!, {r4, pc} + arm_func_end ov38_0221CD90 + + arm_func_start ov38_0221CE0C +ov38_0221CE0C: ; 0x0221CE0C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r3, [r6, #0x5c] + mov r5, r1 + mov r4, r2 + cmp r3, #0 + mov r3, #0 + bne _0221CE50 + bl ov38_0221CD90 + mov r3, r0 + mvn r0, #0 + cmp r3, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r3, r4 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} +_0221CE50: + add r0, r6, #0x50 + add r1, r5, r3 + sub r2, r4, r3 + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #0 + movne r0, #2 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov38_0221CE0C + + arm_func_start ghiFindFreeSlot +ghiFindFreeSlot: ; 0x0221CE70 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r1, _0221CF7C ; =ov38_0222602C + mov r0, #0 + ldr r3, [r1, #0xc] + cmp r3, #0 + ble _0221CEA8 + ldr r2, [r1, #4] +_0221CE8C: + ldr r1, [r2, r0, lsl #2] + ldr r1, [r1] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r0, #1 + cmp r0, r3 + blt _0221CE8C +_0221CEA8: + ldr r0, _0221CF7C ; =ov38_0222602C + ldr r0, [r0] + cmp r0, r3 + beq _0221CECC + ldr r0, _0221CF80 ; =ov38_02225378 + ldr r1, _0221CF84 ; =ov38_022253A0 + ldr r2, _0221CF88 ; =ov38_02225324 + mov r3, #0x33 + bl __msl_assertion_failed +_0221CECC: + ldr r0, _0221CF7C ; =ov38_0222602C + ldr r6, [r0, #0xc] + ldr r0, [r0, #4] + add r5, r6, #4 + mov r1, r5, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r8, _0221CF7C ; =ov38_0222602C + mov r7, r6 + str r0, [r8, #4] + cmp r6, r5 + bge _0221CF6C + mov sb, #0 + mov r4, #0x184 +_0221CF0C: + mov r0, r4 + bl ov00_021EC3A8 + ldr r1, [r8, #4] + str r0, [r1, r7, lsl #2] + ldr r0, [r8, #4] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + bne _0221CF5C + sub r7, r7, #1 + cmp r7, r6 + blt _0221CF54 + ldr r4, _0221CF7C ; =ov38_0222602C +_0221CF3C: + ldr r0, [r4, #4] + ldr r0, [r0, r7, lsl #2] + bl ov00_021EC3D8 + sub r7, r7, #1 + cmp r7, r6 + bge _0221CF3C +_0221CF54: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221CF5C: + add r7, r7, #1 + str sb, [r0] + cmp r7, r5 + blt _0221CF0C +_0221CF6C: + ldr r1, _0221CF7C ; =ov38_0222602C + mov r0, r6 + str r5, [r1, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0221CF7C: .word ov38_0222602C +_0221CF80: .word ov38_02225378 +_0221CF84: .word ov38_022253A0 +_0221CF88: .word ov38_02225324 + arm_func_end ghiFindFreeSlot + + arm_func_start ov38_0221CF8C +ov38_0221CF8C: ; 0x0221CF8C + stmdb sp!, {r3, r4, r5, lr} + bl ov38_0221CA4C + bl ghiFindFreeSlot + mov r5, r0 + mvn r0, #0 + cmp r5, r0 + bne _0221CFB4 + bl ov38_0221CA50 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0221CFB4: + ldr r0, _0221D120 ; =ov38_0222602C + mov r1, #0 + ldr r0, [r0, #4] + mov r2, #0x184 + ldr r4, [r0, r5, lsl #2] + mov r0, r4 + bl memset + mov r0, #1 + str r0, [r4] + ldr r0, _0221D120 ; =ov38_0222602C + str r5, [r4, #4] + ldr r2, [r0, #8] + mov ip, #0 + add r1, r2, #1 + str r1, [r0, #8] + str r2, [r4, #8] + str ip, [r4, #0xc] + str ip, [r4, #0x10] + str ip, [r4, #0x14] + str ip, [r4, #0x18] + str ip, [r4, #0x1c] + strh ip, [r4, #0x20] + str ip, [r4, #0x24] + str ip, [r4, #0x28] + str ip, [r4, #0x2c] + str ip, [r4, #0x30] + str ip, [r4, #0x34] + str ip, [r4, #0x38] + str ip, [r4, #0x3c] + str ip, [r4, #0x40] + str ip, [r4, #0x44] + sub r0, ip, #1 + str r0, [r4, #0x48] + str ip, [r4, #0x4c] + str ip, [r4, #0xe0] + str ip, [r4, #0xe4] + str ip, [r4, #0xe8] + str ip, [r4, #0xec] + str ip, [r4, #0xf0] + str ip, [r4, #0xf4] + str ip, [r4, #0xf8] + str ip, [r4, #0xfc] + str ip, [r4, #0x100] + str r0, [r4, #0x104] + str ip, [r4, #0x108] + str ip, [r4, #0x10c] + str ip, [r4, #0x110] + str ip, [r4, #0x12c] + str ip, [r4, #0x134] + str ip, [r4, #0x138] + str ip, [r4, #0x13c] + mov r0, #0x1f4 + str r0, [r4, #0x158] + add r0, r4, #0x100 + mov r1, #0x50 + strh r1, [r0, #0x60] + str ip, [r4, #0x15c] + mov r0, r4 + add r1, r4, #0x50 + mov r2, #0x800 + mov r3, #0x1000 + str ip, [r4, #0x164] + bl ghiInitBuffer + cmp r0, #0 + beq _0221D0CC + mov r2, #0x800 + mov r0, r4 + mov r3, r2 + add r1, r4, #0x74 + bl ghiInitBuffer +_0221D0CC: + cmp r0, #0 + beq _0221D0E8 + mov r0, r4 + add r1, r4, #0x98 + mov r2, #0x800 + mov r3, #0x400 + bl ghiInitBuffer +_0221D0E8: + cmp r0, #0 + bne _0221D104 + mov r0, r4 + bl ghiFreeConnection + bl ov38_0221CA50 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_0221D104: + ldr r0, _0221D120 ; =ov38_0222602C + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + bl ov38_0221CA50 + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221D120: .word ov38_0222602C + arm_func_end ov38_0221CF8C + + arm_func_start ghiFreeConnection +ghiFreeConnection: ; 0x0221D124 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0221D144 + ldr r0, _0221D2EC ; =ov38_022253B4 + ldr r1, _0221D2F0 ; =ov38_022253A0 + ldr r2, _0221D2F4 ; =ov38_02225334 + mov r3, #0xb3 + bl __msl_assertion_failed +_0221D144: + ldr r0, [r4, #4] + cmp r0, #0 + bge _0221D164 + ldr r0, _0221D2F8 ; =ov38_022253C0 + ldr r1, _0221D2F0 ; =ov38_022253A0 + ldr r2, _0221D2F4 ; =ov38_02225334 + mov r3, #0xb4 + bl __msl_assertion_failed +_0221D164: + ldr r0, _0221D2FC ; =ov38_0222602C + ldr r1, [r4, #4] + ldr r0, [r0, #0xc] + cmp r1, r0 + blt _0221D18C + ldr r0, _0221D300 ; =ov38_022253DC + ldr r1, _0221D2F0 ; =ov38_022253A0 + ldr r2, _0221D2F4 ; =ov38_02225334 + mov r3, #0xb5 + bl __msl_assertion_failed +_0221D18C: + ldr r0, [r4] + cmp r0, #0 + bne _0221D1AC + ldr r0, _0221D304 ; =ov38_02225404 + ldr r1, _0221D2F0 ; =ov38_022253A0 + ldr r2, _0221D2F4 ; =ov38_02225334 + mov r3, #0xb6 + bl __msl_assertion_failed +_0221D1AC: + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #4] + cmp r1, #0 + movlt r0, #0 + ldmltia sp!, {r4, pc} + ldr r0, _0221D2FC ; =ov38_0222602C + ldr r0, [r0, #0xc] + cmp r1, r0 + movge r0, #0 + ldmgeia sp!, {r4, pc} + bl ov38_0221CA4C + ldr r0, [r4, #0x14] + bl ov00_021EC3D8 + ldr r0, [r4, #0x18] + bl ov00_021EC3D8 + ldr r0, [r4, #0x24] + bl ov00_021EC3D8 + ldr r0, [r4, #0x28] + bl ov00_021EC3D8 + ldr r0, [r4, #0x108] + bl ov00_021EC3D8 + ldr r0, [r4, #0x15c] + bl ov00_021EC3D8 + ldr r0, [r4, #0x48] + mvn r1, #0 + cmp r0, r1 + beq _0221D240 + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4, #0x48] + bl ov00_021FF818 +_0221D240: + add r0, r4, #0x50 + bl ghiFreeBuffer + add r0, r4, #0x74 + bl ghiFreeBuffer + add r0, r4, #0x98 + bl ghiFreeBuffer + add r0, r4, #0xbc + bl ghiFreeBuffer + ldr r0, [r4, #0x140] + cmp r0, #0 + beq _0221D274 + mov r0, r4 + bl ov38_0221E0DC +_0221D274: + ldr r0, [r4, #0x13c] + cmp r0, #0 + beq _0221D29C + bl ov38_0221DB00 + cmp r0, #0 + beq _0221D29C + ldr r0, [r4, #0x13c] + bl ov38_0221DB08 + mov r0, #0 + str r0, [r4, #0x13c] +_0221D29C: + ldr r0, [r4, #0x16c] + cmp r0, #0 + beq _0221D2C8 + ldr r2, [r4, #0x178] + cmp r2, #0 + beq _0221D2C0 + mov r0, r4 + add r1, r4, #0x164 + blx r2 +_0221D2C0: + mov r0, #0 + str r0, [r4, #0x16c] +_0221D2C8: + mov r1, #0 + ldr r0, _0221D2FC ; =ov38_0222602C + str r1, [r4] + ldr r1, [r0] + sub r1, r1, #1 + str r1, [r0] + bl ov38_0221CA50 + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221D2EC: .word ov38_022253B4 +_0221D2F0: .word ov38_022253A0 +_0221D2F4: .word ov38_02225334 +_0221D2F8: .word ov38_022253C0 +_0221D2FC: .word ov38_0222602C +_0221D300: .word ov38_022253DC +_0221D304: .word ov38_02225404 + arm_func_end ghiFreeConnection + + arm_func_start ghiRequestToConnection +ghiRequestToConnection: ; 0x0221D308 + stmdb sp!, {r4, lr} + movs r4, r0 + bpl _0221D328 + ldr r0, _0221D394 ; =ov38_02225418 + ldr r1, _0221D398 ; =ov38_022253A0 + ldr r2, _0221D39C ; =ov38_02225360 + ldr r3, _0221D3A0 ; =0x00000101 + bl __msl_assertion_failed +_0221D328: + ldr r0, _0221D3A4 ; =ov38_0222602C + ldr r0, [r0, #0xc] + cmp r4, r0 + blt _0221D34C + ldr r0, _0221D3A8 ; =ov38_02225428 + ldr r1, _0221D398 ; =ov38_022253A0 + ldr r2, _0221D39C ; =ov38_02225360 + ldr r3, _0221D3AC ; =0x00000102 + bl __msl_assertion_failed +_0221D34C: + bl ov38_0221CA4C + cmp r4, #0 + blt _0221D368 + ldr r0, _0221D3A4 ; =ov38_0222602C + ldr r1, [r0, #0xc] + cmp r4, r1 + blt _0221D374 +_0221D368: + bl ov38_0221CA50 + mov r0, #0 + ldmia sp!, {r4, pc} +_0221D374: + ldr r0, [r0, #4] + ldr r4, [r0, r4, lsl #2] + ldr r0, [r4] + cmp r0, #0 + moveq r4, #0 + bl ov38_0221CA50 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221D394: .word ov38_02225418 +_0221D398: .word ov38_022253A0 +_0221D39C: .word ov38_02225360 +_0221D3A0: .word 0x00000101 +_0221D3A4: .word ov38_0222602C +_0221D3A8: .word ov38_02225428 +_0221D3AC: .word 0x00000102 + arm_func_end ghiRequestToConnection + + arm_func_start ov38_0221D3B0 +ov38_0221D3B0: ; 0x0221D3B0 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _0221D410 ; =ov38_0222602C + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + ldmleia sp!, {r4, r5, r6, pc} + bl ov38_0221CA4C + ldr r5, _0221D410 ; =ov38_0222602C + mov r6, #0 + ldr r0, [r5, #0xc] + cmp r0, #0 + ble _0221D408 +_0221D3E0: + ldr r0, [r5, #4] + ldr r0, [r0, r6, lsl #2] + ldr r1, [r0] + cmp r1, #0 + beq _0221D3F8 + blx r4 +_0221D3F8: + ldr r0, [r5, #0xc] + add r6, r6, #1 + cmp r6, r0 + blt _0221D3E0 +_0221D408: + bl ov38_0221CA50 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221D410: .word ov38_0222602C + arm_func_end ov38_0221D3B0 + + arm_func_start ov38_0221D414 +ov38_0221D414: ; 0x0221D414 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0221D434 + ldr r0, _0221D500 ; =ov38_022253B4 + ldr r1, _0221D504 ; =ov38_022253A0 + ldr r2, _0221D508 ; =ov38_02225348 + ldr r3, _0221D50C ; =0x00000132 + bl __msl_assertion_failed +_0221D434: + ldr r0, [r4, #0x108] + cmp r0, #0 + bne _0221D454 + ldr r0, _0221D510 ; =ov38_02225444 + ldr r1, _0221D504 ; =ov38_022253A0 + ldr r2, _0221D508 ; =ov38_02225348 + ldr r3, _0221D514 ; =0x00000133 + bl __msl_assertion_failed +_0221D454: + mov r0, #0 + str r0, [r4, #0x10] + ldr r0, [r4, #0x14] + bl ov00_021EC3D8 + ldr r1, [r4, #0x108] + mov r0, #0 + str r1, [r4, #0x14] + str r0, [r4, #0x108] + ldr r0, [r4, #0x18] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x18] + str r0, [r4, #0x1c] + strh r0, [r4, #0x20] + ldr r0, [r4, #0x24] + bl ov00_021EC3D8 + mov r0, #0 + str r0, [r4, #0x24] + ldr r0, [r4, #0x48] + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4, #0x48] + bl ov00_021FF818 + mvn r1, #0 + add r0, r4, #0x50 + str r1, [r4, #0x48] + bl ghiResetBuffer + add r0, r4, #0x74 + bl ghiResetBuffer + add r0, r4, #0x98 + bl ghiResetBuffer + mov r0, #0 + str r0, [r4, #0xe4] + str r0, [r4, #0xe8] + str r0, [r4, #0xec] + str r0, [r4, #0xf0] + str r0, [r4, #0xf4] + str r0, [r4, #0xf8] + str r0, [r4, #0x130] + ldr r0, [r4, #0x10c] + add r0, r0, #1 + str r0, [r4, #0x10c] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221D500: .word ov38_022253B4 +_0221D504: .word ov38_022253A0 +_0221D508: .word ov38_02225348 +_0221D50C: .word 0x00000132 +_0221D510: .word ov38_02225444 +_0221D514: .word 0x00000133 + arm_func_end ov38_0221D414 + + arm_func_start ov38_0221D518 +ov38_0221D518: ; 0x0221D518 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0221D588 ; =ov38_0222602C + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _0221D58C ; =ghiFreeConnection + bl ov38_0221D3B0 + ldr r4, _0221D588 ; =ov38_0222602C + mov r5, #0 + ldr r0, [r4, #0xc] + cmp r0, #0 + ble _0221D564 +_0221D548: + ldr r0, [r4, #4] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + add r5, r5, #1 + cmp r5, r0 + blt _0221D548 +_0221D564: + ldr r0, _0221D588 ; =ov38_0222602C + ldr r0, [r0, #4] + bl ov00_021EC3D8 + ldr r0, _0221D588 ; =ov38_0222602C + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #0xc] + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221D588: .word ov38_0222602C +_0221D58C: .word ghiFreeConnection + arm_func_end ov38_0221D518 + + arm_func_start ov38_0221D590 +ov38_0221D590: ; 0x0221D590 + stmdb sp!, {r3, lr} + ldr lr, [r0, #0xec] + ldr r3, _0221D648 ; =0x51EB851F + mov r1, lr, lsr #0x1f + smull r2, ip, r3, lr + add ip, r1, ip, asr #5 + cmp ip, #5 + addls pc, pc, ip, lsl #2 + ldmia sp!, {r3, pc} +_0221D5B4: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _0221D5CC ; case 1 + b _0221D5CC ; case 2 + b _0221D5CC ; case 3 + b _0221D5D0 ; case 4 + b _0221D63C ; case 5 +_0221D5CC: + ldmia sp!, {r3, pc} +_0221D5D0: + sub r1, lr, #0x91 + sub r1, r1, #0x100 + cmp r1, #9 + addls pc, pc, r1, lsl #2 + b _0221D630 +_0221D5E4: ; jump table + b _0221D60C ; case 0 + b _0221D630 ; case 1 + b _0221D618 ; case 2 + b _0221D624 ; case 3 + b _0221D630 ; case 4 + b _0221D630 ; case 5 + b _0221D630 ; case 6 + b _0221D630 ; case 7 + b _0221D630 ; case 8 + b _0221D624 ; case 9 +_0221D60C: + mov r1, #9 + str r1, [r0, #0x38] + ldmia sp!, {r3, pc} +_0221D618: + mov r1, #0xa + str r1, [r0, #0x38] + ldmia sp!, {r3, pc} +_0221D624: + mov r1, #0xb + str r1, [r0, #0x38] + ldmia sp!, {r3, pc} +_0221D630: + mov r1, #8 + str r1, [r0, #0x38] + ldmia sp!, {r3, pc} +_0221D63C: + mov r1, #0xc + str r1, [r0, #0x38] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221D648: .word 0x51EB851F + arm_func_end ov38_0221D590 + + arm_func_start ghiProcessConnection +ghiProcessConnection: ; 0x0221D64C + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + bne _0221D66C + ldr r0, _0221D7A4 ; =ov38_02225480 + ldr r1, _0221D7A8 ; =ov38_0222548C + ldr r2, _0221D7AC ; =ov38_02225468 + mov r3, #0x5b + bl __msl_assertion_failed +_0221D66C: + ldr r0, [r4, #4] + bl ghiRequestToConnection + cmp r0, r4 + beq _0221D690 + ldr r0, _0221D7B0 ; =ov38_02225498 + ldr r1, _0221D7A8 ; =ov38_0222548C + ldr r2, _0221D7AC ; =ov38_02225468 + mov r3, #0x5c + bl __msl_assertion_failed +_0221D690: + ldr r0, [r4, #0x12c] + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #1 + str r0, [r4, #0x12c] + ldr r0, [r4, #0x10] + cmp r0, #0 + bne _0221D6BC + mov r0, r4 + bl ov38_0221EBB0 +_0221D6BC: + ldr r0, [r4, #0x10] + cmp r0, #1 + bne _0221D6D0 + mov r0, r4 + bl ov38_0221EC74 +_0221D6D0: + ldr r0, [r4, #0x10] + cmp r0, #2 + bne _0221D6E4 + mov r0, r4 + bl ghiDoSecuringSession +_0221D6E4: + ldr r0, [r4, #0x10] + cmp r0, #3 + bne _0221D6F8 + mov r0, r4 + bl ov38_0221F024 +_0221D6F8: + ldr r0, [r4, #0x10] + cmp r0, #4 + bne _0221D70C + mov r0, r4 + bl ghiDoPosting +_0221D70C: + ldr r0, [r4, #0x10] + cmp r0, #5 + bne _0221D720 + mov r0, r4 + bl ov38_0221F330 +_0221D720: + ldr r0, [r4, #0x10] + cmp r0, #6 + bne _0221D734 + mov r0, r4 + bl ov38_0221F4FC +_0221D734: + ldr r0, [r4, #0x10] + cmp r0, #7 + bne _0221D748 + mov r0, r4 + bl ov38_0221FA38 +_0221D748: + ldr r0, [r4, #0x10] + cmp r0, #8 + bne _0221D75C + mov r0, r4 + bl ov38_0221FEA8 +_0221D75C: + ldr r0, [r4, #0x108] + cmp r0, #0 + beq _0221D770 + mov r0, r4 + bl ov38_0221D414 +_0221D770: + ldr r5, [r4, #0xfc] + cmp r5, #0 + moveq r0, #0 + streq r0, [r4, #0x12c] + beq _0221D79C + mov r0, r4 + bl ov38_0221D590 + mov r0, r4 + bl ghiCallCompletedCallback + mov r0, r4 + bl ghiFreeConnection +_0221D79C: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221D7A4: .word ov38_02225480 +_0221D7A8: .word ov38_0222548C +_0221D7AC: .word ov38_02225468 +_0221D7B0: .word ov38_02225498 + arm_func_end ghiProcessConnection + + arm_func_start ov38_0221D7B4 +ov38_0221D7B4: ; 0x0221D7B4 + stmdb sp!, {r3, lr} + bl ov38_0221CA4C + ldr r0, _0221D7FC ; =ov38_0222603C + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + cmp r1, #1 + bne _0221D7F4 + bl ov38_0221CA44 + ldr r0, _0221D800 ; =ov38_0222531C + mov r2, #0xfa + ldr r1, _0221D804 ; =ov38_02225320 + mov r3, #0x7d + str r2, [r0] + str r3, [r1] + ldmia sp!, {r3, pc} +_0221D7F4: + bl ov38_0221CA50 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221D7FC: .word ov38_0222603C +_0221D800: .word ov38_0222531C +_0221D804: .word ov38_02225320 + arm_func_end ov38_0221D7B4 + + arm_func_start ov38_0221D808 +ov38_0221D808: ; 0x0221D808 + stmdb sp!, {r3, lr} + bl ov38_0221CA4C + ldr r0, _0221D85C ; =ov38_0222603C + ldr r1, [r0] + subs r1, r1, #1 + str r1, [r0] + bne _0221D854 + bl ov38_0221D518 + ldr r0, _0221D860 ; =ov38_02226028 + ldr r0, [r0] + cmp r0, #0 + beq _0221D848 + bl ov00_021EC3D8 + ldr r0, _0221D860 ; =ov38_02226028 + mov r1, #0 + str r1, [r0] +_0221D848: + bl ov38_0221CA50 + bl ov38_0221CA48 + ldmia sp!, {r3, pc} +_0221D854: + bl ov38_0221CA50 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221D85C: .word ov38_0222603C +_0221D860: .word ov38_02226028 + arm_func_end ov38_0221D808 + + arm_func_start ov38_0221D864 +ov38_0221D864: ; 0x0221D864 + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + mov ip, #0 + str ip, [sp] + str ip, [sp, #4] + str r1, [sp, #8] + str ip, [sp, #0xc] + str r2, [sp, #0x10] + str r3, [sp, #0x14] + mov r1, ip + mov r2, ip + mov r3, ip + bl ghttpGetExA + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + arm_func_end ov38_0221D864 + + arm_func_start ghttpGetExA +ghttpGetExA: ; 0x0221D8A0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r8, r0 + ldrnesb r0, [r8] + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmpne r0, #0 + bne _0221D8D4 + ldr r0, _0221DACC ; =ov38_022254D4 + ldr r1, _0221DAD0 ; =ov38_0222548C + ldr r2, _0221DAD4 ; =ov38_0222545C + mov r3, #0x128 + bl __msl_assertion_failed +_0221D8D4: + cmp r5, #0 + bge _0221D8F0 + ldr r0, _0221DAD8 ; =ov38_022254E4 + ldr r1, _0221DAD0 ; =ov38_0222548C + ldr r2, _0221DAD4 ; =ov38_0222545C + ldr r3, _0221DADC ; =0x00000129 + bl __msl_assertion_failed +_0221D8F0: + cmp r6, #0 + beq _0221D914 + cmp r5, #0 + bne _0221D914 + ldr r0, _0221DAE0 ; =ov38_022254F4 + ldr r1, _0221DAD0 ; =ov38_0222548C + ldr r2, _0221DAD4 ; =ov38_0222545C + ldr r3, _0221DAE4 ; =0x0000012A + bl __msl_assertion_failed +_0221D914: + cmp r8, #0 + ldrnesb r0, [r8] + cmpne r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r5, #0 + mvnlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, pc} + cmp r6, #0 + beq _0221D948 + cmp r5, #0 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_0221D948: + ldr r0, _0221DAE8 ; =ov38_0222603C + ldr r0, [r0] + cmp r0, #0 + bne _0221D95C + bl ov38_0221D7B4 +_0221D95C: + bl ov38_0221CF8C + movs r4, r0 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, #0 + mov r0, r8 + str r1, [r4, #0xc] + bl ov00_021FF3D4 + str r0, [r4, #0x14] + cmp r0, #0 + bne _0221D998 + mov r0, r4 + bl ghiFreeConnection + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221D998: + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + beq _0221D9CC + mov r0, r7 + bl ov00_021FF3D4 + str r0, [r4, #0x28] + cmp r0, #0 + bne _0221D9CC + mov r0, r4 + bl ghiFreeConnection + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221D9CC: + ldr r1, [sp, #0x18] + ldr r0, [sp, #0x20] + str r1, [r4, #0x13c] + str r0, [r4, #0x30] + ldr r1, [sp, #0x24] + ldr r0, [sp, #0x28] + str r1, [r4, #0x3c] + str r0, [r4, #0x40] + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x1c] + str r1, [r4, #0x44] + str r0, [r4, #0x134] + cmp r6, #0 + movne r0, #1 + moveq r0, #0 + str r0, [r4, #0xe0] + cmp r0, #0 + beq _0221DA2C + mov r0, r4 + mov r2, r6 + mov r3, r5 + add r1, r4, #0xbc + bl ghiInitFixedBuffer + b _0221DA40 +_0221DA2C: + mov r2, #0x800 + mov r0, r4 + mov r3, r2 + add r1, r4, #0xbc + bl ghiInitBuffer +_0221DA40: + cmp r0, #0 + bne _0221DA58 + mov r0, r4 + bl ghiFreeConnection + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221DA58: + ldr r0, [sp, #0x18] + cmp r0, #0 + beq _0221DA84 + mov r0, r4 + bl ghiPostInitState + cmp r0, #0 + bne _0221DA84 + mov r0, r4 + bl ghiFreeConnection + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221DA84: + ldr r0, [sp, #0x20] + cmp r0, #0 + beq _0221DAC4 + mov r0, r4 + bl ghiProcessConnection + cmp r0, #0 + bne _0221DABC + mov r5, #0xa +_0221DAA4: + mov r0, r5 + bl ov00_021FF3C0 + mov r0, r4 + bl ghiProcessConnection + cmp r0, #0 + beq _0221DAA4 +_0221DABC: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221DAC4: + ldr r0, [r4, #4] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0221DACC: .word ov38_022254D4 +_0221DAD0: .word ov38_0222548C +_0221DAD4: .word ov38_0222545C +_0221DAD8: .word ov38_022254E4 +_0221DADC: .word 0x00000129 +_0221DAE0: .word ov38_022254F4 +_0221DAE4: .word 0x0000012A +_0221DAE8: .word ov38_0222603C + arm_func_end ghttpGetExA + + arm_func_start ov38_0221DAEC +ov38_0221DAEC: ; 0x0221DAEC + ldr ip, _0221DAF8 ; =ov38_0221D3B0 + ldr r0, _0221DAFC ; =ghiProcessConnection + bx ip + .balign 4, 0 +_0221DAF8: .word ov38_0221D3B0 +_0221DAFC: .word ghiProcessConnection + arm_func_end ov38_0221DAEC + + arm_func_start ov38_0221DB00 +ov38_0221DB00: ; 0x0221DB00 + ldr r0, [r0, #0x10] + bx lr + arm_func_end ov38_0221DB00 + + arm_func_start ov38_0221DB08 +ov38_0221DB08: ; 0x0221DB08 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + bl ov00_021FE678 + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + arm_func_end ov38_0221DB08 + + arm_func_start ghiPostGetContentType +ghiPostGetContentType: ; 0x0221DB24 + stmdb sp!, {r4, lr} + ldr r4, [r0, #0x13c] + cmp r4, #0 + bne _0221DB48 + ldr r0, _0221DB68 ; =ov38_02225694 + ldr r1, _0221DB6C ; =ov38_02225644 + ldr r2, _0221DB70 ; =ov38_02225574 + ldr r3, _0221DB74 ; =0x00000192 + bl __msl_assertion_failed +_0221DB48: + cmp r4, #0 + ldreq r0, _0221DB78 ; =ov38_0222569C + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + ldrne r0, _0221DB7C ; =ov38_022256A0 + ldreq r0, _0221DB80 ; =ov38_022256E4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221DB68: .word ov38_02225694 +_0221DB6C: .word ov38_02225644 +_0221DB70: .word ov38_02225574 +_0221DB74: .word 0x00000192 +_0221DB78: .word ov38_0222569C +_0221DB7C: .word ov38_022256A0 +_0221DB80: .word ov38_022256E4 + arm_func_end ghiPostGetContentType + + arm_func_start ghiPostGetNoFilesContentLength +ghiPostGetNoFilesContentLength: ; 0x0221DB84 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r6, [r0, #0x13c] + mov sl, #0 + ldr r0, [r6] + bl ArrayLength + movs sb, r0 + moveq r0, sl + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #0 + mov r8, sl + ble _0221DC18 + ldr r5, _0221DC24 ; =ov38_02225708 + ldr r4, _0221DC28 ; =ov38_02225644 + ldr fp, _0221DC2C ; =ov38_022255E0 +_0221DBBC: + ldr r0, [r6] + mov r1, r8 + bl ov00_021FE6EC + mov r7, r0 + ldr r0, [r7] + cmp r0, #0 + beq _0221DBEC + mov r0, r5 + mov r1, r4 + mov r2, fp + mov r3, #0x1b0 + bl __msl_assertion_failed +_0221DBEC: + ldr r0, [r7, #4] + bl strlen + add r8, r8, #1 + ldr r1, [r7, #0xc] + add r2, sl, r0 + ldr r0, [r7, #0x14] + add r1, r2, r1 + add r0, r1, r0, lsl #1 + cmp r8, sb + add sl, r0, #1 + blt _0221DBBC +_0221DC18: + sub r0, sb, #1 + add r0, sl, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221DC24: .word ov38_02225708 +_0221DC28: .word ov38_02225644 +_0221DC2C: .word ov38_022255E0 + arm_func_end ghiPostGetNoFilesContentLength + + arm_func_start ghiPostGetHasFilesContentLength +ghiPostGetHasFilesContentLength: ; 0x0221DC30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _0221DDB4 ; =ov38_02226040 + mov r4, r0 + ldr r0, [r1, #8] + ldr r7, [r4, #0x13c] + cmp r0, #0 + mov sl, #0 + bne _0221DC78 + ldr r0, _0221DDB8 ; =ov38_02225720 + bl strlen + ldr r1, _0221DDB4 ; =ov38_02226040 + add r2, r0, #0x2f + str r0, [r1, #8] + str r2, [r1, #4] + add r2, r0, #0x4c + str r2, [r1, #0xc] + add r0, r0, #4 + str r0, [r1] +_0221DC78: + ldr r0, [r7] + bl ArrayLength + mov sb, r0 + cmp sb, #0 + mov r8, #0 + ble _0221DDA4 + ldr fp, _0221DDBC ; =ov38_02225748 + ldr r5, _0221DDB4 ; =ov38_02226040 +_0221DC98: + ldr r0, [r7] + mov r1, r8 + bl ov00_021FE6EC + mov r6, r0 + ldr r0, [r6] + cmp r0, #0 + bne _0221DCD4 + ldr r1, [r5, #4] + ldr r0, [r6, #4] + add sl, sl, r1 + bl strlen + ldr r1, [r6, #0xc] + add r0, sl, r0 + add sl, r0, r1 + b _0221DD98 +_0221DCD4: + cmp r0, #1 + bne _0221DD3C + ldr r1, [r5, #0xc] + ldr r0, [r6, #4] + add sl, sl, r1 + bl strlen + add sl, sl, r0 + ldr r0, [r6, #0xc] + bl strlen + add sl, sl, r0 + ldr r0, [r6, #0x10] + bl strlen + add sl, sl, r0 + ldr r0, [r4, #0x140] + mov r1, r8 + bl ov00_021FE6EC + movs r6, r0 + bne _0221DD30 + ldr r1, _0221DDC0 ; =ov38_02225644 + ldr r2, _0221DDC4 ; =ov38_02225620 + mov r0, fp + mov r3, #0x1ec + bl __msl_assertion_failed +_0221DD30: + ldr r0, [r6, #0xc] + add sl, sl, r0 + b _0221DD98 +_0221DD3C: + cmp r0, #2 + bne _0221DD7C + ldr r1, [r5, #0xc] + ldr r0, [r6, #4] + add sl, sl, r1 + bl strlen + add sl, sl, r0 + ldr r0, [r6, #0x10] + bl strlen + add sl, sl, r0 + ldr r0, [r6, #0x14] + bl strlen + add r1, sl, r0 + ldr r0, [r6, #0xc] + add sl, r1, r0 + b _0221DD98 +_0221DD7C: + ldr r0, _0221DDC8 ; =ov38_02225640 + ldr r1, _0221DDC0 ; =ov38_02225644 + ldr r2, _0221DDC4 ; =ov38_02225620 + ldr r3, _0221DDCC ; =0x000001F9 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221DD98: + add r8, r8, #1 + cmp r8, sb + blt _0221DC98 +_0221DDA4: + ldr r0, _0221DDB4 ; =ov38_02226040 + ldr r0, [r0] + add r0, sl, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221DDB4: .word ov38_02226040 +_0221DDB8: .word ov38_02225720 +_0221DDBC: .word ov38_02225748 +_0221DDC0: .word ov38_02225644 +_0221DDC4: .word ov38_02225620 +_0221DDC8: .word ov38_02225640 +_0221DDCC: .word 0x000001F9 + arm_func_end ghiPostGetHasFilesContentLength + + arm_func_start ghiPostGetContentLength +ghiPostGetContentLength: ; 0x0221DDD0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5, #0x13c] + cmp r4, #0 + bne _0221DDF8 + ldr r0, _0221DE24 ; =ov38_02225694 + ldr r1, _0221DE28 ; =ov38_02225644 + ldr r2, _0221DE2C ; =ov38_0222558C + mov r3, #0x20c + bl __msl_assertion_failed +_0221DDF8: + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + mov r0, r5 + beq _0221DE1C + bl ghiPostGetHasFilesContentLength + ldmia sp!, {r3, r4, r5, pc} +_0221DE1C: + bl ghiPostGetNoFilesContentLength + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221DE24: .word ov38_02225694 +_0221DE28: .word ov38_02225644 +_0221DE2C: .word ov38_0222558C + arm_func_end ghiPostGetContentLength + + arm_func_start ghiPostStateInit +ghiPostStateInit: ; 0x0221DE30 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4] + mvn r0, #0 + ldr r1, [r1] + str r0, [r4, #4] + cmp r1, #0 + beq _0221DECC + cmp r1, #1 + bne _0221DEA8 + ldr r0, [r4, #8] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + mov r2, #2 + bl fseek + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #8] + bl ftell + mvn r1, #0 + str r0, [r4, #0xc] + cmp r0, r1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #8] + bl rewind + b _0221DECC +_0221DEA8: + cmp r1, #2 + beq _0221DECC + ldr r0, _0221DED4 ; =ov38_02225640 + ldr r1, _0221DED8 ; =ov38_02225644 + ldr r2, _0221DEDC ; =ov38_02225534 + mov r3, #0x244 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r4, pc} +_0221DECC: + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221DED4: .word ov38_02225640 +_0221DED8: .word ov38_02225644 +_0221DEDC: .word ov38_02225534 + arm_func_end ghiPostStateInit + + arm_func_start ghiPostStateCleanup +ghiPostStateCleanup: ; 0x0221DEE0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + cmp r0, #1 + bne _0221DF1C + ldr r0, [r4, #8] + cmp r0, #0 + beq _0221DF10 + bl fclose +_0221DF10: + mov r0, #0 + str r0, [r4, #8] + ldmia sp!, {r4, pc} +_0221DF1C: + cmp r0, #2 + ldmeqia sp!, {r4, pc} + ldr r0, _0221DF3C ; =ov38_02225640 + ldr r1, _0221DF40 ; =ov38_02225644 + ldr r2, _0221DF44 ; =ov38_02225548 + ldr r3, _0221DF48 ; =0x00000269 + bl __msl_assertion_failed + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221DF3C: .word ov38_02225640 +_0221DF40: .word ov38_02225644 +_0221DF44: .word ov38_02225548 +_0221DF48: .word 0x00000269 + arm_func_end ghiPostStateCleanup + + arm_func_start ghiPostInitState +ghiPostInitState: ; 0x0221DF4C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r4, r0 + ldr r0, [r4, #0x13c] + cmp r0, #0 + bne _0221DF78 + ldr r0, _0221E0C8 ; =ov38_02225750 + ldr r1, _0221E0CC ; =ov38_02225644 + ldr r2, _0221E0D0 ; =ov38_0222550C + mov r3, #0x278 + bl __msl_assertion_failed +_0221DF78: + ldr r0, [r4, #0x13c] + cmp r0, #0 + addeq sp, sp, #0x10 + mov r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r0, [r4, #0x144] + str r0, [r4, #0x148] + str r0, [r4, #0x14c] + ldr r0, [r4, #0x13c] + ldr r0, [r0, #4] + str r0, [r4, #0x150] + ldr r0, [r4, #0x13c] + ldr r0, [r0, #8] + str r0, [r4, #0x154] + ldr r0, [r4, #0x13c] + ldr r0, [r0] + bl ArrayLength + mov r8, r0 + mov r1, r8 + mov r0, #0x10 + mov r2, #0 + bl ov00_021FE5B4 + cmp r0, #0 + str r0, [r4, #0x140] + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r8, #0 + mov r7, #0 + ble _0221E07C + add r6, sp, #0 + mov r5, r7 +_0221DFF8: + ldr r0, [r4, #0x13c] + mov r1, r7 + ldr r0, [r0] + bl ov00_021FE6EC + str r5, [r6] + str r0, [sp] + mov r0, r6 + str r5, [r6, #4] + str r5, [r6, #8] + str r5, [r6, #0xc] + bl ghiPostStateInit + cmp r0, #0 + bne _0221E064 + subs r7, r7, #1 + bmi _0221E04C +_0221E034: + ldr r0, [r4, #0x140] + mov r1, r7 + bl ov00_021FE6EC + bl ghiPostStateCleanup + subs r7, r7, #1 + bpl _0221E034 +_0221E04C: + ldr r0, [r4, #0x140] + bl ov00_021FE678 + mov r0, #0 + add sp, sp, #0x10 + str r0, [r4, #0x140] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221E064: + ldr r0, [r4, #0x140] + mov r1, r6 + bl ov00_021FE754 + add r7, r7, #1 + cmp r7, r8 + blt _0221DFF8 +_0221E07C: + ldr r0, [r4, #0x13c] + ldr r0, [r0] + bl ArrayLength + mov r5, r0 + ldr r0, [r4, #0x140] + bl ArrayLength + cmp r5, r0 + beq _0221E0B0 + ldr r0, _0221E0D4 ; =ov38_02225764 + ldr r1, _0221E0CC ; =ov38_02225644 + ldr r2, _0221E0D0 ; =ov38_0222550C + ldr r3, _0221E0D8 ; =0x000002B1 + bl __msl_assertion_failed +_0221E0B0: + mov r0, r4 + bl ghiPostGetContentLength + str r0, [r4, #0x14c] + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0221E0C8: .word ov38_02225750 +_0221E0CC: .word ov38_02225644 +_0221E0D0: .word ov38_0222550C +_0221E0D4: .word ov38_02225764 +_0221E0D8: .word 0x000002B1 + arm_func_end ghiPostInitState + + arm_func_start ov38_0221E0DC +ov38_0221E0DC: ; 0x0221E0DC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6, #0x140] + cmp r0, #0 + beq _0221E130 + bl ArrayLength + mov r5, r0 + cmp r5, #0 + mov r4, #0 + ble _0221E120 +_0221E104: + ldr r0, [r6, #0x140] + mov r1, r4 + bl ov00_021FE6EC + bl ghiPostStateCleanup + add r4, r4, #1 + cmp r4, r5 + blt _0221E104 +_0221E120: + ldr r0, [r6, #0x140] + bl ov00_021FE678 + mov r0, #0 + str r0, [r6, #0x140] +_0221E130: + ldr r0, [r6, #0x13c] + cmp r0, #0 + ldrne r1, [r0, #0x10] + cmpne r1, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl ov38_0221DB08 + mov r0, #0 + str r0, [r6, #0x13c] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov38_0221E0DC + + arm_func_start ghiPostStringStateDoPosting +ghiPostStringStateDoPosting: ; 0x0221E154 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, r0 + ldr r0, [r4, #4] + mov sl, r1 + cmp r0, #0 + bge _0221E180 + ldr r0, _0221E30C ; =ov38_022257B8 + ldr r1, _0221E310 ; =ov38_02225644 + ldr r2, _0221E314 ; =ov38_022255A4 + ldr r3, _0221E318 ; =0x000002E7 + bl __msl_assertion_failed +_0221E180: + ldr r0, [r4] + ldr r1, [r0, #0xc] + cmp r1, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #4] + cmp r0, r1 + blt _0221E1B4 + ldr r0, _0221E31C ; =ov38_022257C8 + ldr r1, _0221E310 ; =ov38_02225644 + ldr r2, _0221E314 ; =ov38_022255A4 + ldr r3, _0221E320 ; =0x000002EE + bl __msl_assertion_failed +_0221E1B4: + ldr r0, [sl, #0x13c] + ldr r0, [r0, #0xc] + cmp r0, #0 + bne _0221E2C0 + ldr r1, [r4] + ldr r0, [r1, #0x10] + cmp r0, #0 + beq _0221E2C0 + ldr r0, _0221E324 ; =_02224E60 + ldr r8, [r1, #8] + ldrb r2, [r0] + ldrb r1, [r0, #1] + add r5, sp, #0 + strb r2, [sp] + strb r1, [sp, #1] + ldrb r1, [r0, #2] + ldrb r0, [r0, #3] + mov r6, #0 + strb r1, [sp, #2] + strb r0, [sp, #3] + ldrsb r7, [r8] + cmp r7, #0 + beq _0221E2B8 + ldr r4, _0221E328 ; =ov38_02225804 + ldr fp, _0221E32C ; =ov38_02225650 +_0221E218: + mov r0, fp + mov r1, r7 + bl strchr + cmp r0, #0 + beq _0221E23C + mov r1, r7 + add r0, sl, #0x50 + bl ghiAppendCharToBuffer + b _0221E2A8 +_0221E23C: + cmp r7, #0x20 + bne _0221E254 + mov r1, #0x2b + add r0, sl, #0x50 + bl ghiAppendCharToBuffer + b _0221E2A8 +_0221E254: + mov r0, r7, asr #3 + add r0, r7, r0, lsr #28 + mov sb, r0, asr #4 + cmp sb, #0x10 + blt _0221E27C + ldr r0, _0221E330 ; =ov38_022257F4 + ldr r1, _0221E310 ; =ov38_02225644 + ldr r2, _0221E314 ; =ov38_022255A4 + ldr r3, _0221E334 ; =0x0000030D + bl __msl_assertion_failed +_0221E27C: + ldrsb r2, [r4, sb] + mov r1, r7, lsr #0x1f + rsb r0, r1, r7, lsl #28 + add r0, r1, r0, ror #28 + strb r2, [sp, #1] + ldrsb r2, [r4, r0] + mov r1, r5 + add r0, sl, #0x50 + strb r2, [sp, #2] + mov r2, #3 + bl ghiAppendDataToBuffer +_0221E2A8: + add r6, r6, #1 + ldrsb r7, [r8, r6] + cmp r7, #0 + bne _0221E218 +_0221E2B8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221E2C0: + ldr r1, [r4] + ldr r0, [r4, #4] + ldr r2, [r1, #0xc] + ldr r1, [r1, #8] + sub r5, r2, r0 + mov r0, sl + mov r2, r5 + bl ov38_0221CD90 + mvn r1, #0 + cmp r0, r1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #4] + cmp r0, r5 + add r0, r1, r0 + str r0, [r4, #4] + moveq r0, #1 + movne r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221E30C: .word ov38_022257B8 +_0221E310: .word ov38_02225644 +_0221E314: .word ov38_022255A4 +_0221E318: .word 0x000002E7 +_0221E31C: .word ov38_022257C8 +_0221E320: .word 0x000002EE +_0221E324: .word _02224E60 +_0221E328: .word ov38_02225804 +_0221E32C: .word ov38_02225650 +_0221E330: .word ov38_022257F4 +_0221E334: .word 0x0000030D + arm_func_end ghiPostStringStateDoPosting + + arm_func_start ghiPostFileDiskStateDoPosting +ghiPostFileDiskStateDoPosting: ; 0x0221E338 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x1000 + mov r8, r0 + ldr r0, [r8, #4] + mov r7, r1 + cmp r0, #0 + bge _0221E368 + ldr r0, _0221E478 ; =ov38_022257B8 + ldr r1, _0221E47C ; =ov38_02225644 + ldr r2, _0221E480 ; =ov38_022255C0 + ldr r3, _0221E484 ; =0x00000336 + bl __msl_assertion_failed +_0221E368: + ldr r1, [r8, #4] + ldr r0, [r8, #0xc] + cmp r1, r0 + blt _0221E38C + ldr r0, _0221E488 ; =ov38_02225818 + ldr r1, _0221E47C ; =ov38_02225644 + ldr r2, _0221E480 ; =ov38_022255C0 + ldr r3, _0221E48C ; =0x00000337 + bl __msl_assertion_failed +_0221E38C: + ldr r0, [r8, #8] + bl ftell + ldr r1, [r8, #4] + cmp r1, r0 + beq _0221E3B4 + ldr r0, _0221E490 ; =ov38_02225840 + ldr r1, _0221E47C ; =ov38_02225644 + ldr r2, _0221E480 ; =ov38_022255C0 + mov r3, #0x338 + bl __msl_assertion_failed +_0221E3B4: + add r6, sp, #0 + mov r5, #1 + mov r4, #0x1000 +_0221E3C0: + ldr r3, [r8, #8] + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl fread + mov r2, r0 + cmp r2, #0 + bgt _0221E3FC + mov r0, #1 + str r0, [r7, #0xfc] + mov r0, #0xe + str r0, [r7, #0x38] + add sp, sp, #0x1000 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221E3FC: + ldr r0, [r8, #4] + add r1, r0, r2 + str r1, [r8, #4] + ldr r0, [r8, #0xc] + cmp r1, r0 + ble _0221E430 + mov r0, #1 + str r0, [r7, #0xfc] + mov r0, #0xe + str r0, [r7, #0x38] + add sp, sp, #0x1000 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221E430: + mov r0, r7 + mov r1, r6 + bl ov38_0221CE0C + cmp r0, #0 + addeq sp, sp, #0x1000 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, [r8, #4] + ldr r1, [r8, #0xc] + cmp r2, r1 + addeq sp, sp, #0x1000 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r0, #1 + beq _0221E3C0 + mov r0, #2 + add sp, sp, #0x1000 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0221E478: .word ov38_022257B8 +_0221E47C: .word ov38_02225644 +_0221E480: .word ov38_022255C0 +_0221E484: .word 0x00000336 +_0221E488: .word ov38_02225818 +_0221E48C: .word 0x00000337 +_0221E490: .word ov38_02225840 + arm_func_end ghiPostFileDiskStateDoPosting + + arm_func_start ghiPostFileMemoryStateDoPosting +ghiPostFileMemoryStateDoPosting: ; 0x0221E494 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + ldr r0, [r6, #4] + mov r5, r1 + cmp r0, #0 + bge _0221E4C0 + ldr r0, _0221E55C ; =ov38_022257B8 + ldr r1, _0221E560 ; =ov38_02225644 + ldr r2, _0221E564 ; =ov38_02225600 + ldr r3, _0221E568 ; =0x0000036E + bl __msl_assertion_failed +_0221E4C0: + ldr r0, [r6] + ldr r1, [r0, #0xc] + cmp r1, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #4] + cmp r0, r1 + blt _0221E4F4 + ldr r0, _0221E56C ; =ov38_02225878 + ldr r1, _0221E560 ; =ov38_02225644 + ldr r2, _0221E564 ; =ov38_02225600 + ldr r3, _0221E570 ; =0x00000375 + bl __msl_assertion_failed +_0221E4F4: + mov r4, #0x8000 + mvn r7, #0 +_0221E4FC: + ldmia r6, {r1, r3} + ldr r0, [r1, #0xc] + ldr r1, [r1, #8] + sub r2, r0, r3 + cmp r2, #0x8000 + movge r2, r4 + mov r0, r5 + add r1, r1, r3 + bl ov38_0221CD90 + cmp r0, r7 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r6, #4] + add r2, r1, r0 + str r2, [r6, #4] + ldr r1, [r6] + ldr r1, [r1, #0xc] + cmp r1, r2 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0 + bne _0221E4FC + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221E55C: .word ov38_022257B8 +_0221E560: .word ov38_02225644 +_0221E564: .word ov38_02225600 +_0221E568: .word 0x0000036E +_0221E56C: .word ov38_02225878 +_0221E570: .word 0x00000375 + arm_func_end ghiPostFileMemoryStateDoPosting + + arm_func_start ghiPostStateDoPosting +ghiPostStateDoPosting: ; 0x0221E574 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + sub sp, sp, #0x800 + mov r6, r0 + ldr r0, [r6, #4] + mvn r3, #0 + mov r5, r1 + mov r4, r2 + cmp r0, r3 + bne _0221E6CC + mov r0, #0 + str r0, [r6, #4] + ldr r0, [r5, #0x13c] + ldr r0, [r0, #0xc] + cmp r0, #0 + bne _0221E604 + ldr r0, [r6] + ldr r0, [r0] + cmp r0, #0 + beq _0221E5D8 + ldr r0, _0221E748 ; =ov38_022258A8 + ldr r1, _0221E74C ; =ov38_02225644 + ldr r2, _0221E750 ; =ov38_0222555C + rsb r3, r3, #0x3a8 + bl __msl_assertion_failed +_0221E5D8: + ldr r1, [r6] + cmp r4, #0 + add r0, sp, #8 + ldr r2, [r1, #4] + beq _0221E5F8 + ldr r1, _0221E754 ; =ov38_022258C8 + bl sprintf + b _0221E68C +_0221E5F8: + ldr r1, _0221E758 ; =ov38_022258CC + bl sprintf + b _0221E68C +_0221E604: + ldr r3, [r6] + ldr r1, [r3] + cmp r1, #0 + bne _0221E634 + cmp r4, #0 + ldrne r2, _0221E75C ; =ov38_022258D4 + ldr r3, [r3, #4] + ldreq r2, _0221E760 ; =ov38_022258FC + ldr r1, _0221E764 ; =ov38_02225928 + add r0, sp, #8 + bl sprintf + b _0221E68C +_0221E634: + sub r0, r1, #1 + cmp r0, #1 + bhi _0221E678 + cmp r1, #1 + ldreq r0, [r3, #0xc] + ldreq r1, [r3, #0x10] + ldrne r0, [r3, #0x10] + ldrne r1, [r3, #0x14] + cmp r4, #0 + stmia sp, {r0, r1} + ldrne r2, _0221E75C ; =ov38_022258D4 + ldr r3, [r3, #4] + ldreq r2, _0221E760 ; =ov38_022258FC + ldr r1, _0221E768 ; =ov38_02225958 + add r0, sp, #8 + bl sprintf + b _0221E68C +_0221E678: + ldr r0, _0221E76C ; =ov38_02225640 + ldr r1, _0221E74C ; =ov38_02225644 + ldr r2, _0221E750 ; =ov38_0222555C + mov r3, #0x3dc + bl __msl_assertion_failed +_0221E68C: + add r0, sp, #8 + bl strlen + mov r2, r0 + add r1, sp, #8 + mov r0, r5 + bl ov38_0221CE0C + cmp r0, #0 + addeq sp, sp, #8 + addeq sp, sp, #0x800 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r0, #2 + addeq sp, sp, #8 + addeq sp, sp, #0x800 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} +_0221E6CC: + ldr r0, [r6] + ldr r0, [r0] + cmp r0, #0 + bne _0221E6F4 + mov r0, r6 + mov r1, r5 + bl ghiPostStringStateDoPosting + add sp, sp, #8 + add sp, sp, #0x800 + ldmia sp!, {r4, r5, r6, pc} +_0221E6F4: + cmp r0, #1 + bne _0221E714 + mov r0, r6 + mov r1, r5 + bl ghiPostFileDiskStateDoPosting + add sp, sp, #8 + add sp, sp, #0x800 + ldmia sp!, {r4, r5, r6, pc} +_0221E714: + cmp r0, #2 + beq _0221E730 + ldr r0, _0221E770 ; =ov38_022259AC + ldr r1, _0221E74C ; =ov38_02225644 + ldr r2, _0221E750 ; =ov38_0222555C + ldr r3, _0221E774 ; =0x000003F5 + bl __msl_assertion_failed +_0221E730: + mov r0, r6 + mov r1, r5 + bl ghiPostFileMemoryStateDoPosting + add sp, sp, #8 + add sp, sp, #0x800 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221E748: .word ov38_022258A8 +_0221E74C: .word ov38_02225644 +_0221E750: .word ov38_0222555C +_0221E754: .word ov38_022258C8 +_0221E758: .word ov38_022258CC +_0221E75C: .word ov38_022258D4 +_0221E760: .word ov38_022258FC +_0221E764: .word ov38_02225928 +_0221E768: .word ov38_02225958 +_0221E76C: .word ov38_02225640 +_0221E770: .word ov38_022259AC +_0221E774: .word 0x000003F5 + arm_func_end ghiPostStateDoPosting + + arm_func_start ghiPostDoPosting +ghiPostDoPosting: ; 0x0221E778 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + bne _0221E798 + ldr r0, _0221E9AC ; =ov38_022259D0 + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9B8 ; =0x00000404 + bl __msl_assertion_failed +_0221E798: + ldr r0, [sl, #0x13c] + cmp r0, #0 + bne _0221E7B8 + ldr r0, _0221E9BC ; =ov38_02225750 + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9C0 ; =0x00000405 + bl __msl_assertion_failed +_0221E7B8: + ldr r0, [sl, #0x140] + cmp r0, #0 + bne _0221E7D8 + ldr r0, _0221E9C4 ; =ov38_022259DC + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9C8 ; =0x00000406 + bl __msl_assertion_failed +_0221E7D8: + ldr r0, [sl, #0x13c] + ldr r0, [r0] + bl ArrayLength + mov r4, r0 + ldr r0, [sl, #0x140] + bl ArrayLength + cmp r4, r0 + beq _0221E80C + ldr r0, _0221E9CC ; =ov38_02225764 + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9D0 ; =0x00000407 + bl __msl_assertion_failed +_0221E80C: + ldr r0, [sl, #0x144] + cmp r0, #0 + bge _0221E82C + ldr r0, _0221E9D4 ; =ov38_022259FC + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9D8 ; =0x00000408 + bl __msl_assertion_failed +_0221E82C: + ldr r0, [sl, #0x140] + bl ArrayLength + ldr r1, [sl, #0x144] + cmp r1, r0 + ble _0221E854 + ldr r0, _0221E9DC ; =ov38_02225A20 + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9E0 ; =0x00000409 + bl __msl_assertion_failed +_0221E854: + ldr r0, [sl, #0x140] + bl ArrayLength + ldr r1, [sl, #0x5c] + mov sb, r0 + cmp r1, #0 + beq _0221E8AC + mov r0, sl + bl ov38_0221C748 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sl, #0x60] + ldr r0, [sl, #0x5c] + cmp r1, r0 + movlt r0, #2 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sl, #0x50 + bl ghiResetBuffer + ldr r0, [sl, #0x144] + cmp r0, sb + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221E8AC: + ldr r1, [sl, #0x144] + cmp r1, sb + bge _0221E964 + ldr r7, _0221E9E4 ; =ov38_02225A70 + ldr r6, _0221E9B0 ; =ov38_02225644 + ldr r5, _0221E9B4 ; =ov38_02225520 + ldr r4, _0221E9E8 ; =0x0000042F + mov fp, #1 +_0221E8CC: + ldr r0, [sl, #0x140] + bl ov00_021FE6EC + movs r8, r0 + bne _0221E8F0 + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0221E8F0: + ldr r0, [sl, #0x144] + mov r1, sl + cmp r0, #0 + moveq r2, fp + movne r2, #0 + mov r0, r8 + bl ghiPostStateDoPosting + cmp r0, #0 + bne _0221E944 + ldr r0, [sl, #0xfc] + cmp r0, #0 + ldrne r0, [sl, #0x38] + cmpne r0, #0 + bne _0221E93C + ldr r0, _0221E9EC ; =ov38_02225A7C + ldr r1, _0221E9B0 ; =ov38_02225644 + ldr r2, _0221E9B4 ; =ov38_02225520 + ldr r3, _0221E9F0 ; =0x0000043B + bl __msl_assertion_failed +_0221E93C: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221E944: + cmp r0, #2 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl, #0x144] + add r1, r0, #1 + str r1, [sl, #0x144] + cmp r1, sb + blt _0221E8CC +_0221E964: + ldr r0, [sl, #0x13c] + ldr r0, [r0, #0xc] + cmp r0, #0 + beq _0221E998 + ldr r0, _0221E9F4 ; =ov38_02225AA8 + bl strlen + mov r2, r0 + ldr r1, _0221E9F4 ; =ov38_02225AA8 + mov r0, sl + bl ov38_0221CE0C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221E998: + ldr r0, [sl, #0x5c] + cmp r0, #0 + movne r0, #2 + moveq r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221E9AC: .word ov38_022259D0 +_0221E9B0: .word ov38_02225644 +_0221E9B4: .word ov38_02225520 +_0221E9B8: .word 0x00000404 +_0221E9BC: .word ov38_02225750 +_0221E9C0: .word 0x00000405 +_0221E9C4: .word ov38_022259DC +_0221E9C8: .word 0x00000406 +_0221E9CC: .word ov38_02225764 +_0221E9D0: .word 0x00000407 +_0221E9D4: .word ov38_022259FC +_0221E9D8: .word 0x00000408 +_0221E9DC: .word ov38_02225A20 +_0221E9E0: .word 0x00000409 +_0221E9E4: .word ov38_02225A70 +_0221E9E8: .word 0x0000042F +_0221E9EC: .word ov38_02225A7C +_0221E9F0: .word 0x0000043B +_0221E9F4: .word ov38_02225AA8 + arm_func_end ghiPostDoPosting + + arm_func_start ghiParseURL +ghiParseURL: ; 0x0221E9F8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r5, r0 + bne _0221EA18 + ldr r0, _0221EB8C ; =ov38_02225B68 + ldr r1, _0221EB90 ; =ov38_02225B74 + ldr r2, _0221EB94 ; =ov38_02225AD4 + mov r3, #0x25 + bl __msl_assertion_failed +_0221EA18: + cmp r5, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r5, #0x14] + cmp r0, #0 + bne _0221EA44 + ldr r0, _0221EB98 ; =ov38_02225B84 + ldr r1, _0221EB90 ; =ov38_02225B74 + ldr r2, _0221EB94 ; =ov38_02225AD4 + mov r3, #0x2b + bl __msl_assertion_failed +_0221EA44: + ldr r4, [r5, #0x14] + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, _0221EB9C ; =ov38_02225B94 + mov r0, r4 + mov r2, #7 + bl strncmp + cmp r0, #0 + addeq r4, r4, #7 + moveq r8, #0 + beq _0221EA9C + ldr r1, _0221EBA0 ; =ov38_02225B9C + mov r0, r4 + mov r2, #8 + bl strncmp + cmp r0, #0 + addeq r4, r4, #8 + moveq r8, #1 + beq _0221EA9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0221EA9C: + ldr r1, _0221EBA4 ; =ov38_02225BA8 + mov r0, r4 + bl strspn + mov r6, r0 + ldrsb r7, [r4, r6] + mov r1, #0 + mov r0, r4 + strb r1, [r4, r6] + bl ov00_021FF3D4 + str r0, [r5, #0x18] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + strb r7, [r4, r6] + ldrsb r0, [r4, r6]! + cmp r0, #0x3a + bne _0221EB18 + add r4, r4, #1 + mov r0, r4 + bl atoi + strh r0, [r5, #0x20] + ldrh r0, [r5, #0x20] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_0221EB00: + ldrsb r0, [r4, #1]! + cmp r0, #0 + beq _0221EB2C + cmp r0, #0x2f + bne _0221EB00 + b _0221EB2C +_0221EB18: + cmp r8, #0 + ldrne r0, _0221EBA8 ; =0x000001BB + strneh r0, [r5, #0x20] + moveq r0, #0x50 + streqh r0, [r5, #0x20] +_0221EB2C: + ldrsb r0, [r4] + cmp r0, #0 + ldreq r4, _0221EBAC ; =ov38_02225BAC + mov r0, r4 + bl ov00_021FF3D4 + mov r1, #0x20 + mov r7, r0 + str r0, [r5, #0x24] + bl strchr + cmp r0, #0 + beq _0221EB7C + mov r6, #0x2b + mov r4, #0x20 +_0221EB60: + strb r6, [r0] + ldr r7, [r5, #0x24] + mov r1, r4 + mov r0, r7 + bl strchr + cmp r0, #0 + bne _0221EB60 +_0221EB7C: + cmp r7, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0221EB8C: .word ov38_02225B68 +_0221EB90: .word ov38_02225B74 +_0221EB94: .word ov38_02225AD4 +_0221EB98: .word ov38_02225B84 +_0221EB9C: .word ov38_02225B94 +_0221EBA0: .word ov38_02225B9C +_0221EBA4: .word ov38_02225BA8 +_0221EBA8: .word 0x000001BB +_0221EBAC: .word ov38_02225BAC + arm_func_end ghiParseURL + + arm_func_start ov38_0221EBB0 +ov38_0221EBB0: ; 0x0221EBB0 + stmdb sp!, {r3, r4, r5, lr} + mov r1, #0 + mov r4, r0 + mov r2, r1 + bl ghiCallProgressCallback + bl ov00_021FF3CC + mov r0, r4 + bl ghiParseURL + cmp r0, #0 + bne _0221EBEC + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #3 + str r0, [r4, #0x38] + ldmia sp!, {r3, r4, r5, pc} +_0221EBEC: + ldr r5, [r4, #0x15c] + cmp r5, #0 + bne _0221EC08 + ldr r0, _0221EC70 ; =ov38_02226028 + ldr r5, [r0] + cmp r5, #0 + ldreq r5, [r4, #0x18] +_0221EC08: + mov r0, r5 + bl ov00_021FFA44 + mvn r1, #0 + str r0, [r4, #0x1c] + cmp r0, r1 + bne _0221EC54 + mov r0, r5 + bl SOC_GetHostByName + cmp r0, #0 + bne _0221EC44 + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #4 + str r0, [r4, #0x38] + ldmia sp!, {r3, r4, r5, pc} +_0221EC44: + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [r4, #0x1c] +_0221EC54: + mov r1, #0 + mov r3, #1 + mov r0, r4 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221EC70: .word ov38_02226028 + arm_func_end ov38_0221EBB0 + + arm_func_start ov38_0221EC74 +ov38_0221EC74: ; 0x0221EC74 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + mov r4, r0 + ldr r1, [r4, #0x48] + mvn r0, #0 + cmp r1, r0 + bne _0221EE20 + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl ov00_021FF804 + mvn r1, #0 + str r0, [r4, #0x48] + cmp r0, r1 + bne _0221ECD4 + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #5 + str r0, [r4, #0x38] + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + add sp, sp, #0x10 + str r0, [r4, #0x4c] + ldmia sp!, {r4, pc} +_0221ECD4: + mov r1, #0 + bl ov00_021FF44C + cmp r0, #0 + bne _0221ED08 + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #5 + str r0, [r4, #0x38] + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + add sp, sp, #0x10 + str r0, [r4, #0x4c] + ldmia sp!, {r4, pc} +_0221ED08: + ldr r0, [r4, #0x134] + cmp r0, #0 + beq _0221ED24 + ldr r1, _0221EEB8 ; =ov38_02225320 + ldr r0, [r4, #0x48] + ldr r1, [r1] + bl ov00_021FF48C +_0221ED24: + add r2, sp, #8 + mov r1, #0 + str r1, [r2] + mov r0, #2 + str r1, [r2, #4] + strb r0, [sp, #9] + ldr r0, [r4, #0x15c] + cmp r0, #0 + beq _0221ED6C + add r0, r4, #0x100 + ldrh r0, [r0, #0x60] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #0xa] + b _0221EDBC +_0221ED6C: + ldr r0, _0221EEBC ; =ov38_02226028 + ldr r0, [r0] + cmp r0, #0 + beq _0221EDA0 + ldr r0, _0221EEC0 ; =_02226024 + ldrh r0, [r0] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #0xa] + b _0221EDBC +_0221EDA0: + ldrh r0, [r4, #0x20] + mov r1, r0, asr #8 + mov r0, r0, lsl #8 + and r1, r1, #0xff + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [sp, #0xa] +_0221EDBC: + ldr r0, [r4, #0x1c] + add r1, sp, #8 + str r0, [sp, #0xc] + ldr r0, [r4, #0x48] + mov r2, #8 + bl ov00_021FF8A0 + mvn r1, #0 + cmp r0, r1 + bne _0221EE20 + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + mvn r2, #5 + cmp r0, r2 + subne r1, r2, #0x14 + cmpne r0, r1 + subne r1, r2, #0x46 + cmpne r0, r1 + beq _0221EE20 + mov r1, #1 + str r1, [r4, #0xfc] + mov r1, #6 + str r1, [r4, #0x38] + add sp, sp, #0x10 + str r0, [r4, #0x4c] + ldmia sp!, {r4, pc} +_0221EE20: + ldr r0, [r4, #0x48] + add r2, sp, #4 + add r3, sp, #0 + mov r1, #0 + bl ov00_021FF59C + cmp r0, #0 + movgt r1, #1 + movle r1, #0 + mvn r0, #0 + cmp r1, r0 + beq _0221EE58 + ldr r0, [sp] + cmp r0, #0 + beq _0221EE88 +_0221EE58: + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #6 + cmp r1, #0 + addne sp, sp, #0x10 + str r0, [r4, #0x38] + ldmneia sp!, {r4, pc} + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + add sp, sp, #0x10 + str r0, [r4, #0x4c] + ldmia sp!, {r4, pc} +_0221EE88: + ldr r0, [sp, #4] + cmp r0, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r4, pc} + mov r1, #0 + mov r3, #2 + mov r0, r4 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221EEB8: .word ov38_02225320 +_0221EEBC: .word ov38_02226028 +_0221EEC0: .word _02226024 + arm_func_end ov38_0221EC74 + + arm_func_start ghiDoSecuringSession +ghiDoSecuringSession: ; 0x0221EEC4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + sub sp, sp, #0x400 + mov r4, r0 + ldr r1, [r4, #0x168] + cmp r1, #0 + bne _0221EF38 + ldr r0, [r4, #0x14] + ldr r1, _0221F010 ; =ov38_02225B9C + mov r2, #8 + bl strncmp + cmp r0, #0 + bne _0221EF14 + mov r0, #1 + add sp, sp, #4 + str r0, [r4, #0xfc] + mov r0, #0x11 + add sp, sp, #0x400 + str r0, [r4, #0x38] + ldmia sp!, {r3, r4, pc} +_0221EF14: + mov r1, #0 + mov r3, #3 + mov r0, r4 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, pc} +_0221EF38: + ldr r1, [r4, #0x170] + cmp r1, #0 + beq _0221EF64 + mov r1, #0 + mov r3, #3 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, pc} +_0221EF64: + ldr r1, [r4, #0x16c] + cmp r1, #0 + bne _0221EFA4 + ldr r2, [r4, #0x174] + add r1, r4, #0x164 + blx r2 + cmp r0, #3 + bne _0221EFA4 + ldr r0, _0221F014 ; =ov38_02225BB0 + ldr r1, _0221F018 ; =ov38_02225B74 + ldr r2, _0221F01C ; =ov38_02225B14 + ldr r3, _0221F020 ; =0x00000146 + bl __msl_assertion_failed + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, pc} +_0221EFA4: + ldr r1, [r4, #0x60] + ldr r0, [r4, #0x5c] + cmp r1, r0 + bge _0221EFEC + mov r0, r4 + bl ov38_0221C748 + cmp r0, #0 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + ldmeqia sp!, {r3, r4, pc} + ldr r1, [r4, #0x60] + ldr r0, [r4, #0x5c] + cmp r1, r0 + addlt sp, sp, #4 + addlt sp, sp, #0x400 + ldmltia sp!, {r3, r4, pc} + add r0, r4, #0x50 + bl ghiResetBuffer +_0221EFEC: + mov r3, #0x400 + add r1, sp, #4 + add r2, sp, #0 + mov r0, r4 + str r3, [sp] + bl ov38_0221CB7C + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0221F010: .word ov38_02225B9C +_0221F014: .word ov38_02225BB0 +_0221F018: .word ov38_02225B74 +_0221F01C: .word ov38_02225B14 +_0221F020: .word 0x00000146 + arm_func_end ghiDoSecuringSession + + arm_func_start ov38_0221F024 +ov38_0221F024: ; 0x0221F024 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r5, r0 + ldr r0, [r5, #0x5c] + cmp r0, #0 + bne _0221F1FC + ldr r0, [r5, #0x13c] + add r4, r5, #0x50 + cmp r0, #0 + ldrne r1, _0221F258 ; =ov38_02225BB4 + bne _0221F060 + ldr r0, [r5, #0xc] + cmp r0, #3 + ldreq r1, _0221F25C ; =ov38_02225BBC + ldrne r1, _0221F260 ; =ov38_02225BC4 +_0221F060: + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + ldr r0, [r5, #0x15c] + mov r2, #0 + cmp r0, #0 + ldreq r0, _0221F264 ; =ov38_02226028 + ldreq r0, [r0] + cmpeq r0, #0 + beq _0221F098 + ldr r1, [r5, #0x14] + mov r0, r4 + bl ghiAppendDataToBuffer + b _0221F0A4 +_0221F098: + ldr r1, [r5, #0x24] + mov r0, r4 + bl ghiAppendDataToBuffer +_0221F0A4: + ldr r1, _0221F268 ; =ov38_02225BCC + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + ldrh r0, [r5, #0x20] + cmp r0, #0x50 + bne _0221F0D4 + ldr r2, [r5, #0x18] + ldr r1, _0221F26C ; =ov38_02225BD8 + mov r0, r4 + bl ov38_0221C5EC + b _0221F11C +_0221F0D4: + ldr r1, _0221F270 ; =ov38_02225BE0 + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + ldr r1, [r5, #0x18] + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer + mov r0, r4 + mov r1, #0x3a + bl ghiAppendCharToBuffer + ldrh r1, [r5, #0x20] + mov r0, r4 + bl ov38_0221C6CC + mov r0, r4 + ldr r1, _0221F274 ; =ov38_02225BE8 + mov r2, #2 + bl ghiAppendDataToBuffer +_0221F11C: + ldr r0, [r5, #0x28] + cmp r0, #0 + beq _0221F138 + ldr r1, _0221F278 ; =ov38_02225BEC + bl strstr + cmp r0, #0 + bne _0221F148 +_0221F138: + ldr r1, _0221F278 ; =ov38_02225BEC + ldr r2, _0221F27C ; =ov38_02225BF8 + mov r0, r4 + bl ov38_0221C5EC +_0221F148: + ldr r0, [r5, #0x34] + cmp r0, #0 + beq _0221F168 + ldr r1, _0221F280 ; =ov38_02225C08 + ldr r2, _0221F284 ; =ov38_02225C14 + mov r0, r4 + bl ov38_0221C5EC + b _0221F178 +_0221F168: + ldr r1, _0221F280 ; =ov38_02225C08 + ldr r2, _0221F288 ; =ov38_02225C20 + mov r0, r4 + bl ov38_0221C5EC +_0221F178: + ldr r0, [r5, #0x13c] + cmp r0, #0 + beq _0221F1BC + ldr r2, [r5, #0x14c] + ldr r1, _0221F28C ; =ov38_02225C28 + add r0, sp, #0 + bl sprintf + ldr r1, _0221F290 ; =ov38_02225C2C + add r2, sp, #0 + mov r0, r4 + bl ov38_0221C5EC + mov r0, r5 + bl ghiPostGetContentType + mov r2, r0 + ldr r1, _0221F294 ; =ov38_02225C3C + mov r0, r4 + bl ov38_0221C5EC +_0221F1BC: + ldr r1, [r5, #0x28] + cmp r1, #0 + beq _0221F1D4 + mov r0, r4 + mov r2, #0 + bl ghiAppendDataToBuffer +_0221F1D4: + ldr r1, _0221F274 ; =ov38_02225BE8 + mov r0, r4 + mov r2, #2 + bl ghiAppendDataToBuffer + add r0, r5, #0x50 + cmp r4, r0 + beq _0221F1FC + ldr r1, [r4, #4] + ldr r2, [r4, #0xc] + bl ghiAppendDataToBuffer +_0221F1FC: + mov r0, r5 + bl ov38_0221C748 + cmp r0, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #0x60] + ldr r0, [r5, #0x5c] + cmp r1, r0 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, r4, r5, pc} + add r0, r5, #0x50 + bl ghiResetBuffer + ldr r0, [r5, #0x13c] + mov r1, #0 + cmp r0, #0 + movne r0, #4 + moveq r0, #5 + str r0, [r5, #0x10] + mov r0, r5 + mov r2, r1 + bl ghiCallProgressCallback + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221F258: .word ov38_02225BB4 +_0221F25C: .word ov38_02225BBC +_0221F260: .word ov38_02225BC4 +_0221F264: .word ov38_02226028 +_0221F268: .word ov38_02225BCC +_0221F26C: .word ov38_02225BD8 +_0221F270: .word ov38_02225BE0 +_0221F274: .word ov38_02225BE8 +_0221F278: .word ov38_02225BEC +_0221F27C: .word ov38_02225BF8 +_0221F280: .word ov38_02225C08 +_0221F284: .word ov38_02225C14 +_0221F288: .word ov38_02225C20 +_0221F28C: .word ov38_02225C28 +_0221F290: .word ov38_02225C2C +_0221F294: .word ov38_02225C3C + arm_func_end ov38_0221F024 + + arm_func_start ghiDoPosting +ghiDoPosting: ; 0x0221F298 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r5, [r6, #0x148] + bl ghiPostDoPosting + movs r4, r0 + bne _0221F2E4 + ldr r0, [r6, #0xfc] + cmp r0, #0 + ldrne r0, [r6, #0x38] + cmpne r0, #0 + bne _0221F2D8 + ldr r0, _0221F324 ; =ov38_02225C4C + ldr r1, _0221F328 ; =ov38_02225B74 + ldr r2, _0221F32C ; =ov38_02225AE0 + mov r3, #0x200 + bl __msl_assertion_failed +_0221F2D8: + mov r0, r6 + bl ov38_0221E0DC + ldmia sp!, {r4, r5, r6, pc} +_0221F2E4: + ldr r0, [r6, #0x148] + cmp r5, r0 + beq _0221F2F8 + mov r0, r6 + bl ghiCallPostCallback +_0221F2F8: + cmp r4, #1 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl ov38_0221E0DC + mov r1, #0 + mov r3, #5 + mov r0, r6 + mov r2, r1 + str r3, [r6, #0x10] + bl ghiCallProgressCallback + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221F324: .word ov38_02225C4C +_0221F328: .word ov38_02225B74 +_0221F32C: .word ov38_02225AE0 + arm_func_end ghiDoPosting + + arm_func_start ov38_0221F330 +ov38_0221F330: ; 0x0221F330 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r2, #0 + ldr r0, [r4, #0x48] + add r1, sp, #0 + mov r3, r2 + bl ov00_021FF59C + mvn r1, #0 + cmp r0, r1 + bne _0221F380 + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #5 + str r0, [r4, #0x38] + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + add sp, sp, #4 + str r0, [r4, #0x4c] + ldmia sp!, {r3, r4, pc} +_0221F380: + ldr r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r1, #0 + mov r3, #6 + mov r0, r4 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov38_0221F330 + + arm_func_start ghiParseStatus +ghiParseStatus: ; 0x0221F3B0 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + movs r4, r0 + bne _0221F3D4 + ldr r0, _0221F4DC ; =ov38_02225B68 + ldr r1, _0221F4E0 ; =ov38_02225B74 + ldr r2, _0221F4E4 ; =ov38_02225AF0 + ldr r3, _0221F4E8 ; =0x0000024E + bl __msl_assertion_failed +_0221F3D4: + ldr r0, [r4, #0x80] + cmp r0, #0 + bgt _0221F3F4 + ldr r0, _0221F4EC ; =ov38_02225C78 + ldr r1, _0221F4E0 ; =ov38_02225B74 + ldr r2, _0221F4E4 ; =ov38_02225AF0 + ldr r3, _0221F4F0 ; =0x0000024F + bl __msl_assertion_failed +_0221F3F4: + add r1, sp, #0xc + str r1, [sp] + add r0, sp, #8 + str r0, [sp, #4] + ldr r0, [r4, #0x78] + ldr r1, _0221F4F4 ; =ov38_02225C98 + add r2, sp, #0x14 + add r3, sp, #0x10 + bl sscanf + mov ip, #0 + ldr r5, [sp, #8] + mov lr, #1 + ldr r2, _0221F4F8 ; =_0210E504 + mov r3, ip + b _0221F438 +_0221F430: + add r5, r5, #1 + str r5, [sp, #8] +_0221F438: + ldr r1, [r4, #0x78] + ldrsb r1, [r1, r5] + cmp r1, #0 + beq _0221F474 + mov r6, lr + blt _0221F458 + cmp r1, #0x80 + movlt r6, ip +_0221F458: + cmp r6, #0 + movne r1, r3 + moveq r1, r1, lsl #1 + ldreqh r1, [r2, r1] + andeq r1, r1, #0x100 + cmp r1, #0 + bne _0221F430 +_0221F474: + cmp r0, #3 + bne _0221F498 + ldr r1, [sp, #0x14] + cmp r1, #1 + ldrge r0, [sp, #0xc] + cmpge r0, #0x64 + blt _0221F498 + cmp r0, #0x258 + blt _0221F4B4 +_0221F498: + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #7 + str r0, [r4, #0x38] + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0221F4B4: + str r1, [r4, #0xe4] + ldr r1, [sp, #0x10] + mov r0, #1 + str r1, [r4, #0xe8] + ldr r1, [sp, #0xc] + str r1, [r4, #0xec] + ldr r1, [sp, #8] + str r1, [r4, #0xf0] + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221F4DC: .word ov38_02225B68 +_0221F4E0: .word ov38_02225B74 +_0221F4E4: .word ov38_02225AF0 +_0221F4E8: .word 0x0000024E +_0221F4EC: .word ov38_02225C78 +_0221F4F0: .word 0x0000024F +_0221F4F4: .word ov38_02225C98 +_0221F4F8: .word _0210E504 + arm_func_end ghiParseStatus + + arm_func_start ov38_0221F4FC +ov38_0221F4FC: ; 0x0221F4FC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + sub sp, sp, #0x400 + mov r3, #0x400 + add r1, sp, #4 + add r2, sp, #0 + mov r4, r0 + str r3, [sp] + bl ov38_0221CB7C + mov r5, r0 + cmp r5, #3 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + ldmeqia sp!, {r4, r5, pc} + cmp r5, #1 + ldreq r1, [r4, #0x84] + ldreq r0, [r4, #0x80] + cmpeq r1, r0 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + ldmeqia sp!, {r4, r5, pc} + cmp r5, #0 + bne _0221F578 + ldr r2, [sp] + add r1, sp, #4 + add r0, r4, #0x74 + bl ghiAppendDataToBuffer + cmp r0, #0 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + ldmeqia sp!, {r4, r5, pc} +_0221F578: + ldr r0, [r4, #0x78] + ldr r1, _0221F620 ; =ov38_02225BE8 + bl strstr + cmp r0, #0 + beq _0221F5E8 + mov r1, #0 + strb r1, [r0] + ldr r1, [r4, #0x78] + sub r5, r0, r1 + add r1, r5, #1 + mov r0, r4 + str r1, [r4, #0xf8] + bl ghiParseStatus + cmp r0, #0 + addeq sp, sp, #4 + addeq sp, sp, #0x400 + ldmeqia sp!, {r4, r5, pc} + add r3, r5, #2 + mov r1, #0 + str r3, [r4, #0x84] + mov r3, #7 + mov r0, r4 + mov r2, r1 + str r3, [r4, #0x10] + bl ghiCallProgressCallback + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r4, r5, pc} +_0221F5E8: + cmp r5, #2 + addne sp, sp, #4 + addne sp, sp, #0x400 + ldmneia sp!, {r4, r5, pc} + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #7 + str r0, [r4, #0x38] + ldr r0, [r4, #0x48] + bl ov00_021FFA60 + str r0, [r4, #0x4c] + add sp, sp, #4 + add sp, sp, #0x400 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0221F620: .word ov38_02225BE8 + arm_func_end ov38_0221F4FC + + arm_func_start ov38_0221F624 +ov38_0221F624: ; 0x0221F624 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x100] + mov ip, #0 + add r3, r0, r2 + str r3, [r4, #0x100] + ldr r0, [r4, #0x104] + mov lr, ip + cmp r3, r0 + beq _0221F658 + ldr r0, [r4, #0x130] + cmp r0, #0 + beq _0221F660 +_0221F658: + mov r0, #1 + str r0, [r4, #0xfc] +_0221F660: + ldr r0, [r4, #0xc] + cmp r0, #0 + bne _0221F68C + add r0, r4, #0xbc + bl ghiAppendDataToBuffer + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr ip, [r4, #0xc0] + ldr lr, [r4, #0xc8] + b _0221F6CC +_0221F68C: + cmp r0, #1 + bne _0221F6C0 + cmp r2, #0 + beq _0221F6B4 + mov r0, #1 + str r0, [r4, #0xfc] + mov r0, #0xd + str r0, [r4, #0x38] + mov r0, #0 + ldmia sp!, {r4, pc} +_0221F6B4: + mov ip, r1 + mov lr, r2 + b _0221F6CC +_0221F6C0: + cmp r0, #2 + moveq ip, r1 + moveq lr, r2 +_0221F6CC: + mov r0, r4 + mov r1, ip + mov r2, lr + bl ghiCallProgressCallback + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end ov38_0221F624 + + arm_func_start ghiParseChunkSize +ghiParseChunkSize: ; 0x0221F6E4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4, #0x120] + cmp r0, #0 + bne _0221F710 + ldr r0, _0221F734 ; =ov38_02225CA8 + ldr r1, _0221F738 ; =ov38_02225B74 + ldr r2, _0221F73C ; =ov38_02225B00 + ldr r3, _0221F740 ; =0x00000321 + bl __msl_assertion_failed +_0221F710: + ldr r1, _0221F744 ; =ov38_02225CAC + add r2, sp, #0 + add r0, r4, #0x114 + bl sscanf + cmp r0, #1 + mvnne r0, #0 + ldreq r0, [sp] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0221F734: .word ov38_02225CA8 +_0221F738: .word ov38_02225B74 +_0221F73C: .word ov38_02225B00 +_0221F740: .word 0x00000321 +_0221F744: .word ov38_02225CAC + arm_func_end ghiParseChunkSize + + arm_func_start ghiAppendToChunkHeaderBuffer +ghiAppendToChunkHeaderBuffer: ; 0x0221F748 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r4, r0 + mov r7, r1 + mov r6, r2 + bne _0221F770 + ldr r0, _0221F7F8 ; =ov38_02225B68 + ldr r1, _0221F7FC ; =ov38_02225B74 + ldr r2, _0221F800 ; =ov38_02225B48 + ldr r3, _0221F804 ; =0x00000333 + bl __msl_assertion_failed +_0221F770: + cmp r7, #0 + bne _0221F78C + ldr r0, _0221F808 ; =ov38_02225CB0 + ldr r1, _0221F7FC ; =ov38_02225B74 + ldr r2, _0221F800 ; =ov38_02225B48 + mov r3, #0x334 + bl __msl_assertion_failed +_0221F78C: + cmp r6, #0 + bge _0221F7A8 + ldr r0, _0221F80C ; =ov38_02225CB8 + ldr r1, _0221F7FC ; =ov38_02225B74 + ldr r2, _0221F800 ; =ov38_02225B48 + ldr r3, _0221F810 ; =0x00000335 + bl __msl_assertion_failed +_0221F7A8: + cmp r6, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r3, [r4, #0x120] + cmp r3, #0xa + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + rsb r5, r3, #0xa + cmp r5, r6 + movge r5, r6 + add r0, r4, #0x114 + mov r1, r7 + mov r2, r5 + add r0, r0, r3 + bl memcpy + ldr r0, [r4, #0x120] + mov r1, #0 + add r0, r0, r5 + str r0, [r4, #0x120] + add r0, r4, r0 + strb r1, [r0, #0x114] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221F7F8: .word ov38_02225B68 +_0221F7FC: .word ov38_02225B74 +_0221F800: .word ov38_02225B48 +_0221F804: .word 0x00000333 +_0221F808: .word ov38_02225CB0 +_0221F80C: .word ov38_02225CB8 +_0221F810: .word 0x00000335 + arm_func_end ghiAppendToChunkHeaderBuffer + + arm_func_start ghiProcessIncomingFileData +ghiProcessIncomingFileData: ; 0x0221F814 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _0221F83C + ldr r0, _0221FA10 ; =ov38_02225B68 + ldr r1, _0221FA14 ; =ov38_02225B74 + ldr r2, _0221FA18 ; =ov38_02225B2C + ldr r3, _0221FA1C ; =0x0000035D + bl __msl_assertion_failed +_0221F83C: + cmp r5, #0 + bne _0221F858 + ldr r0, _0221FA20 ; =ov38_02225CB0 + ldr r1, _0221FA14 ; =ov38_02225B74 + ldr r2, _0221FA18 ; =ov38_02225B2C + ldr r3, _0221FA24 ; =0x0000035E + bl __msl_assertion_failed +_0221F858: + cmp r4, #0 + bgt _0221F874 + ldr r0, _0221FA28 ; =ov38_02225CC4 + ldr r1, _0221FA14 ; =ov38_02225B74 + ldr r2, _0221FA18 ; =ov38_02225B2C + ldr r3, _0221FA2C ; =0x0000035F + bl __msl_assertion_failed +_0221F874: + ldr r0, [r6, #0x110] + cmp r0, #0 + beq _0221F9FC + cmp r4, #0 + ble _0221F9F4 + mov r8, #0 + mov fp, #1 + mov sb, #3 + mvn r7, #0 +_0221F898: + ldr r0, [r6, #0x128] + cmp r0, #0 + bne _0221F92C + mov r0, r5 + mov r1, #0xa + bl strchr + movs sl, r0 + beq _0221F914 + mov r0, r6 + mov r1, r5 + sub r2, sl, r5 + bl ghiAppendToChunkHeaderBuffer + add r1, sl, #1 + sub r2, r1, r5 + mov r0, r6 + sub r4, r4, r2 + mov r5, r1 + bl ghiParseChunkSize + str r0, [r6, #0x124] + cmp r0, r7 + bne _0221F904 + mov r0, #1 + str r0, [r6, #0xfc] + mov r0, #7 + str r0, [r6, #0x38] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F904: + cmp r0, #0 + streq sb, [r6, #0x128] + strne fp, [r6, #0x128] + b _0221F9EC +_0221F914: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ghiAppendToChunkHeaderBuffer + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F92C: + cmp r0, #1 + bne _0221F97C + ldr sl, [r6, #0x124] + mov r0, r6 + cmp sl, r4 + movge sl, r4 + mov r1, r5 + mov r2, sl + bl ov38_0221F624 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r6, #0x124] + add r5, r5, sl + subs r0, r0, sl + str r0, [r6, #0x124] + moveq r0, #2 + sub r4, r4, sl + streq r0, [r6, #0x128] + b _0221F9EC +_0221F97C: + cmp r0, #2 + bne _0221F9C0 + mov r0, r5 + mov r1, #0xa + bl strchr + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + strb r8, [r6, #0x114] + str r8, [r6, #0x120] + add r0, r0, #1 + sub r1, r0, r5 + str r8, [r6, #0x124] + mov r5, r0 + str r8, [r6, #0x128] + sub r4, r4, r1 + b _0221F9EC +_0221F9C0: + cmp r0, #3 + moveq r0, #1 + streq r0, [r6, #0xfc] + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _0221FA30 ; =ov38_02225BB0 + ldr r1, _0221FA14 ; =ov38_02225B74 + ldr r2, _0221FA18 ; =ov38_02225B2C + ldr r3, _0221FA34 ; =0x000003E3 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F9EC: + cmp r4, #0 + bgt _0221F898 +_0221F9F4: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F9FC: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov38_0221F624 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221FA10: .word ov38_02225B68 +_0221FA14: .word ov38_02225B74 +_0221FA18: .word ov38_02225B2C +_0221FA1C: .word 0x0000035D +_0221FA20: .word ov38_02225CB0 +_0221FA24: .word 0x0000035E +_0221FA28: .word ov38_02225CC4 +_0221FA2C: .word 0x0000035F +_0221FA30: .word ov38_02225BB0 +_0221FA34: .word 0x000003E3 + arm_func_end ghiProcessIncomingFileData + + arm_func_start ov38_0221FA38 +ov38_0221FA38: ; 0x0221FA38 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sl, r0 + mov r0, #0x1000 + bl ov00_021EC3A8 + str r0, [sp, #4] + cmp r0, #0 + bne _0221FA6C + mov r0, #1 + str r0, [sl, #0xfc] + add sp, sp, #0x18 + str r0, [sl, #0x38] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221FA6C: + ldr r1, [sp, #4] + mov r3, #0x1000 + add r2, sp, #8 + mov r0, sl + str r3, [sp, #8] + bl ov38_0221CB7C + mov r6, r0 + cmp r6, #3 + beq _0221FE74 + cmp r6, #1 + ldreq r1, [sl, #0x84] + ldreq r0, [sl, #0x80] + cmpeq r1, r0 + beq _0221FE74 + cmp r6, #0 + bne _0221FAC4 + ldr r2, [sp, #8] + ldr r1, [sp, #4] + add r0, sl, #0x74 + bl ghiAppendDataToBuffer + cmp r0, #0 + beq _0221FE74 +_0221FAC4: + ldr r5, [sl, #0x84] + ldr r4, [sl, #0x78] + ldr r1, _0221FE84 ; =ov38_02225CCC + add r0, r4, r5 + str r5, [sl, #0xf4] + bl strstr + cmp r0, #0 + bne _0221FAF0 + ldr r1, _0221FE88 ; =ov38_02225CD4 + add r0, r4, r5 + bl strstr +_0221FAF0: + cmp r0, #0 + beq _0221FE50 + mov r1, #0 + strb r1, [r0, #2] + ldr r2, [sl, #0x78] + add r7, r0, #2 + ldr r1, [sl, #0x80] + sub r3, r7, r2 + str r3, [sl, #0x80] + add r6, r0, #4 + ldr r3, [sl, #0x78] + sub r2, r6, r2 + sub r0, r7, r3 + str r0, [sl, #0xf8] + str r0, [sl, #0x84] + ldr r3, [sl, #0xec] + ldr r7, _0221FE8C ; =0x51EB851F + mov r0, r3, lsr #0x1f + smull r3, r8, r7, r3 + add r8, r0, r8, asr #5 + cmp r8, #1 + sub r7, r1, r2 + bne _0221FB98 + cmp r7, #0 + beq _0221FB74 + ldr r0, [sl, #0x78] + mov r1, r6 + add r2, r7, #1 + bl memmove + str r7, [sl, #0x80] + mov r0, #0 + str r0, [sl, #0x84] + b _0221FB7C +_0221FB74: + add r0, sl, #0x74 + bl ghiResetBuffer +_0221FB7C: + mov r1, #0 + mov r3, #6 + mov r0, sl + mov r2, r1 + str r3, [sl, #0x10] + bl ghiCallProgressCallback + b _0221FE74 +_0221FB98: + cmp r8, #3 + bne _0221FCE8 + ldr r0, [sl, #0x10c] + cmp r0, #0xa + ble _0221FBC0 + mov r0, #1 + str r0, [sl, #0xfc] + mov r0, #0xb + str r0, [sl, #0x38] + b _0221FE74 +_0221FBC0: + ldr r1, _0221FE90 ; =ov38_02225CD8 + add r0, r4, r5 + bl strstr + cmp r0, #0 + beq _0221FCE8 + add r4, r0, #9 + ldr r1, _0221FE94 ; =_0210E504 + mov r2, #0 + b _0221FBE8 +_0221FBE4: + add r4, r4, #1 +_0221FBE8: + ldrsb r0, [r4] + cmp r0, #0 + blt _0221FBFC + cmp r0, #0x80 + blt _0221FC04 +_0221FBFC: + mov r0, r2 + b _0221FC10 +_0221FC04: + mov r0, r0, lsl #1 + ldrh r0, [r1, r0] + and r0, r0, #0x100 +_0221FC10: + cmp r0, #0 + bne _0221FBE4 + mov r3, r4 + ldr r1, _0221FE94 ; =_0210E504 + mov r2, #0 + b _0221FC2C +_0221FC28: + add r3, r3, #1 +_0221FC2C: + ldrsb r0, [r3] + cmp r0, #0 + beq _0221FC60 + blt _0221FC44 + cmp r0, #0x80 + blt _0221FC4C +_0221FC44: + mov r0, r2 + b _0221FC58 +_0221FC4C: + mov r0, r0, lsl #1 + ldrh r0, [r1, r0] + and r0, r0, #0x100 +_0221FC58: + cmp r0, #0 + beq _0221FC28 +_0221FC60: + mov r0, #0 + strb r0, [r3] + ldrsb r0, [r4] + cmp r0, #0x2f + bne _0221FCC4 + ldr r0, [sl, #0x18] + bl strlen + mov r5, r0 + mov r0, r4 + bl strlen + add r1, r5, #0xe + add r0, r1, r0 + bl ov00_021EC3A8 + str r0, [sl, #0x108] + cmp r0, #0 + moveq r0, #1 + streq r0, [sl, #0xfc] + streq r0, [sl, #0x38] + str r4, [sp] + ldrh r3, [sl, #0x20] + ldr r0, [sl, #0x108] + ldr r2, [sl, #0x18] + ldr r1, _0221FE98 ; =ov38_02225CE4 + bl sprintf + b _0221FE74 +_0221FCC4: + mov r0, r4 + bl ov00_021FF3D4 + str r0, [sl, #0x108] + cmp r0, #0 + bne _0221FE74 + mov r0, #1 + str r0, [sl, #0xfc] + str r0, [sl, #0x38] + b _0221FE74 +_0221FCE8: + ldr r1, _0221FE9C ; =ov38_02225CF4 + add r0, r4, r5 + bl strstr + movs fp, r0 + beq _0221FDC0 + ldr r8, _0221FEA0 ; =ov38_02224E6C + add r1, sp, #0xc + mov r3, #5 +_0221FD08: + ldrb r2, [r8] + ldrb r0, [r8, #1] + add r8, r8, #2 + strb r2, [r1] + strb r0, [r1, #1] + add r1, r1, #2 + subs r3, r3, #1 + bne _0221FD08 + ldrb r2, [r8] + add r8, fp, #0x10 + add r0, sp, #0xc + mov sb, r8 + strb r2, [r1] + bl strlen + b _0221FD48 +_0221FD44: + add sb, sb, #1 +_0221FD48: + cmp sb, #0 + ldrnesb r1, [sb] + cmpne r1, #0 + cmpne r1, #0xa + cmpne r1, #0xd + cmpne r1, #0x20 + bne _0221FD44 + sub r2, sb, r8 + cmp r2, r0 + ble _0221FD84 + mov r0, #1 + str r0, [sl, #0xfc] + mov r0, #0x10 + str r0, [sl, #0x38] + b _0221FE74 +_0221FD84: + cmp r0, r2 + bne _0221FDB4 + add r1, sp, #0xc + mov r0, r8 + bl strncmp + cmp r0, #0 + blt _0221FDB4 + mov r0, #1 + str r0, [sl, #0xfc] + mov r0, #0x10 + str r0, [sl, #0x38] + b _0221FE74 +_0221FDB4: + mov r0, r8 + bl atoi + str r0, [sl, #0x104] +_0221FDC0: + ldr r1, _0221FEA4 ; =ov38_02225D04 + add r0, r4, r5 + bl strstr + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + str r0, [sl, #0x110] + cmp r0, #0 + beq _0221FDF8 + mov r0, #0 + strb r0, [sl, #0x114] + str r0, [sl, #0x120] + str r0, [sl, #0x124] + str r0, [sl, #0x128] +_0221FDF8: + ldr r0, [sl, #0xc] + sub r0, r0, #3 + cmp r0, #1 + movls r0, #1 + strls r0, [sl, #0xfc] + bls _0221FE74 + mov r0, #8 + str r0, [sl, #0x10] + cmp fp, #0 + beq _0221FE34 + ldr r0, [sl, #0x104] + cmp r0, #0 + moveq r0, #1 + streq r0, [sl, #0xfc] + beq _0221FE74 +_0221FE34: + cmp r7, #0 + ble _0221FE74 + mov r0, sl + mov r1, r6 + mov r2, r7 + bl ghiProcessIncomingFileData + b _0221FE74 +_0221FE50: + cmp r6, #2 + bne _0221FE74 + mov r0, #1 + str r0, [sl, #0xfc] + mov r0, #7 + str r0, [sl, #0x38] + ldr r0, [sl, #0x48] + bl ov00_021FFA60 + str r0, [sl, #0x4c] +_0221FE74: + ldr r0, [sp, #4] + bl ov00_021EC3D8 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221FE84: .word ov38_02225CCC +_0221FE88: .word ov38_02225CD4 +_0221FE8C: .word 0x51EB851F +_0221FE90: .word ov38_02225CD8 +_0221FE94: .word _0210E504 +_0221FE98: .word ov38_02225CE4 +_0221FE9C: .word ov38_02225CF4 +_0221FEA0: .word ov38_02224E6C +_0221FEA4: .word ov38_02225D04 + arm_func_end ov38_0221FA38 + + arm_func_start ov38_0221FEA8 +ov38_0221FEA8: ; 0x0221FEA8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + bl ov00_021FF368 + mov r7, r0 + mov r0, #0x2000 + mov r8, #0 + bl ov00_021EC3A8 + movs r6, r0 + bne _0221FEDC + mov r0, #1 + str r0, [sb, #0xfc] + str r0, [sb, #0x38] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221FEDC: + mov r5, #0x2000 + add r4, sp, #0 + b _0221FF58 +_0221FEE8: + mov r0, sb + mov r1, r6 + mov r2, r4 + str r5, [sp] + bl ov38_0221CB7C + cmp r0, #3 + cmpne r0, #1 + beq _0221FF70 + cmp r0, #2 + bne _0221FF38 + mov r0, #1 + str r0, [sb, #0xfc] + ldr r1, [sb, #0x104] + cmp r1, #0 + ble _0221FF70 + ldr r0, [sb, #0x100] + cmp r0, r1 + movlt r0, #0xf + strlt r0, [sb, #0x38] + b _0221FF70 +_0221FF38: + ldr r2, [sp] + mov r0, sb + mov r1, r6 + bl ghiProcessIncomingFileData + cmp r0, #0 + beq _0221FF70 + bl ov00_021FF368 + sub r8, r0, r7 +_0221FF58: + ldr r0, [sb, #0xfc] + cmp r0, #0 + bne _0221FF70 + ldr r0, [sb, #0x158] + cmp r8, r0 + blo _0221FEE8 +_0221FF70: + mov r0, r6 + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov38_0221FEA8 + + arm_func_start ov38_0221FF7C +ov38_0221FF7C: ; 0x0221FF7C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, #0 + ldr r6, _0221FFB8 ; =ov38_02226078 + ldr r4, _0221FFBC ; =ov38_02226070 + mov r5, r7 +_0221FF90: + ldr r0, [r6, r7, lsl #2] + cmp r0, #0 + beq _0221FFA8 + ldr r1, [r4] + blx r1 + str r5, [r6, r7, lsl #2] +_0221FFA8: + add r7, r7, #1 + cmp r7, #3 + blt _0221FF90 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221FFB8: .word ov38_02226078 +_0221FFBC: .word ov38_02226070 + arm_func_end ov38_0221FF7C + + arm_func_start ov38_0221FFC0 +ov38_0221FFC0: ; 0x0221FFC0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + ldrsb r1, [r6] + mov r4, r0 + cmp r1, #0 + beq _0222007C + mov r0, r6 + bl ov38_02221870 + cmp r0, #0xa + ble _0221FFFC + ldr r0, _02220084 ; =ov38_0222606C + mov r1, #7 + str r1, [r0] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0221FFFC: + mov r0, r6 + bl ov38_02221870 + mov r5, r0 + cmp r5, #0xa + ble _02220024 + ldr r0, _02220084 ; =ov38_0222606C + mov r1, #7 + str r1, [r0] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_02220024: + bl ov38_022201AC + ldr r1, _02220088 ; =ov38_0222605C + add r0, r0, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + ldr r1, _0222008C ; =ov38_02226078 + cmp r0, #0 + str r0, [r1, r4, lsl #2] + bne _02220060 + ldr r0, _02220084 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_02220060: + mov r1, r6 + mov r2, r5 + bl ov38_022201C8 + ldr r1, _0222008C ; =ov38_02226078 + mov r2, #0 + ldr r1, [r1, r4, lsl #2] + strb r2, [r1, r0] +_0222007C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02220084: .word ov38_0222606C +_02220088: .word ov38_0222605C +_0222008C: .word ov38_02226078 + arm_func_end ov38_0221FFC0 + + arm_func_start ov38_02220090 +ov38_02220090: ; 0x02220090 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov38_02221734 + bl ov38_0221FF7C + mov r1, r6 + mov r0, #0 + bl ov38_0221FFC0 + cmp r0, #0 + beq _022200F0 + mov r1, r5 + mov r0, #1 + bl ov38_0221FFC0 + cmp r0, #0 + beq _022200F0 + mov r1, r4 + mov r0, #2 + bl ov38_0221FFC0 + cmp r0, #0 + beq _022200F0 + bl ov38_02221748 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_022200F0: + bl ov38_0221FF7C + bl ov38_02221748 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov38_02220090 + + arm_func_start ov38_02220100 +ov38_02220100: ; 0x02220100 + stmdb sp!, {r4, lr} + mov r4, #0 + mov lr, r4 + cmp r2, #0 + ble _02220140 + mov r3, r4 +_02220118: + ldrsb ip, [r1] + cmp ip, #0 + streqb r3, [r0], #1 + beq _02220134 + add r4, r4, #1 + add r1, r1, #1 + strb ip, [r0], #1 +_02220134: + add lr, lr, #1 + cmp lr, r2 + blt _02220118 +_02220140: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov38_02220100 + + arm_func_start ov38_02220148 +ov38_02220148: ; 0x02220148 + cmp r0, #0x41 + blo _0222015C + cmp r0, #0x5a + subls r0, r0, #0x41 + bxls lr +_0222015C: + cmp r0, #0x61 + blo _02220170 + cmp r0, #0x7a + subls r0, r0, #0x47 + bxls lr +_02220170: + cmp r0, #0x30 + blo _02220184 + cmp r0, #0x39 + addls r0, r0, #4 + bxls lr +_02220184: + cmp r0, #0x2e + moveq r0, #0x3e + bxeq lr + cmp r0, #0x2d + moveq r0, #0x3f + mvnne r0, #0 + bx lr + arm_func_end ov38_02220148 + + arm_func_start ov38_022201A0 +ov38_022201A0: ; 0x022201A0 + mov r0, r0, asr #2 + add r0, r0, r0, lsl #1 + bx lr + arm_func_end ov38_022201A0 + + arm_func_start ov38_022201AC +ov38_022201AC: ; 0x022201AC + ldr r1, _022201C4 ; =0x55555556 + add r2, r0, #2 + smull r0, r3, r1, r2 + add r3, r3, r2, lsr #31 + mov r0, r3, lsl #2 + bx lr + .balign 4, 0 +_022201C4: .word 0x55555556 + arm_func_end ov38_022201AC + + arm_func_start ov38_022201C8 +ov38_022201C8: ; 0x022201C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r7, r2 + mov r8, r1 + mov sb, r0 + cmp r7, #3 + movgt r2, #3 + add r0, sp, #0 + mov r1, r8 + mov r6, #0 + bl ov38_02220100 + cmp r0, #0 + ble _022202AC + mov r5, #0 + ldr sl, _022202BC ; =ov38_02224E78 + mov r4, r5 + mov fp, #0x2a +_02220208: + cmp r7, #3 + strltb r5, [sp, #2] + cmp r7, #2 + strltb r4, [sp, #1] + ldrb r1, [sp, #2] + ldrb r2, [sp] + ldrb r3, [sp, #1] + mov lr, r1, asr #6 + mov ip, r2, asr #2 + orr lr, lr, r3, lsl #2 + mov r3, r3, asr #4 + and ip, ip, #0xff + orr r2, r3, r2, lsl #4 + ldrsb ip, [sl, ip] + and r2, r2, #0x3f + ldrsb r2, [sl, r2] + strb ip, [sb] + and ip, lr, #0x3f + cmp r0, #1 + strb r2, [sb, #1] + ldrgtsb r2, [sl, ip] + and r1, r1, #0x3f + add r8, r8, r0 + movle r2, fp + cmp r0, #2 + ldrgtsb r1, [sl, r1] + strb r2, [sb, #2] + add r6, r6, #4 + movle r1, #0x2a + strb r1, [sb, #3] + add sb, sb, #4 + subs r7, r7, r0 + beq _022202AC + cmp r7, #3 + movgt r2, #3 + movle r2, r7 + add r0, sp, #0 + mov r1, r8 + bl ov38_02220100 + cmp r0, #0 + bgt _02220208 +_022202AC: + mov r1, #0 + mov r0, r6 + strb r1, [sb] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022202BC: .word ov38_02224E78 + arm_func_end ov38_022201C8 + + arm_func_start ov38_022202C0 +ov38_022202C0: ; 0x022202C0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov sb, r0 + mov r7, r2 + add r0, sp, #3 + mov r2, #4 + mov r6, #0 + mov r8, r1 + bl ov38_02220100 + mov r5, r0 + mov r4, r6 + b _022203CC +_022202F0: + ldrb r0, [sp, #3] + mov r1, #0 + strb r1, [sp] + strb r1, [sp, #1] + strb r1, [sp, #2] + bl ov38_02220148 + movs r4, r0 + bmi _02220378 + ldrb r0, [sp, #4] + mov r1, r4, lsl #2 + strb r1, [sp] + bl ov38_02220148 + movs r4, r0 + bmi _02220378 + ldrsb r2, [sp] + ldrb r0, [sp, #5] + mov r1, r4, lsl #4 + orr r2, r2, r4, asr #4 + strb r2, [sp] + strb r1, [sp, #1] + bl ov38_02220148 + movs r4, r0 + bmi _02220378 + ldrsb r2, [sp, #1] + ldrb r0, [sp, #6] + mov r1, r4, lsl #6 + orr r2, r2, r4, asr #2 + strb r1, [sp, #2] + strb r2, [sp, #1] + bl ov38_02220148 + movs r4, r0 + ldrplsb r0, [sp, #2] + orrpl r0, r0, r4 + strplb r0, [sp, #2] +_02220378: + sub r1, r5, #1 + cmp r1, #0 + mov r2, #0 + ble _022203A0 + add r3, sp, #0 +_0222038C: + ldrsb r0, [r3], #1 + add r2, r2, #1 + cmp r2, r1 + strb r0, [sb], #1 + blt _0222038C +_022203A0: + sub r0, r5, #1 + sub r7, r7, #4 + cmp r7, #0 + add r8, r8, r5 + add r6, r6, r0 + ble _022203DC + add r0, sp, #3 + mov r1, r8 + mov r2, #4 + bl ov38_02220100 + mov r5, r0 +_022203CC: + cmp r5, #0 + ble _022203DC + cmp r4, #0 + bge _022202F0 +_022203DC: + mov r0, r6 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov38_022202C0 + + arm_func_start ov38_022203E8 +ov38_022203E8: ; 0x022203E8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl ov38_02221870 + ldr r1, _02220430 ; =ov38_02226050 + mov r4, r0 + ldr r2, [r1, #0xc] + add r0, r4, #1 + mov r1, #4 + blx r2 + movs r5, r0 + beq _02220428 + mov r1, r6 + mov r2, r4 + bl ov38_0222189C + mov r0, #0 + strb r0, [r5, r4] +_02220428: + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02220430: .word ov38_02226050 + arm_func_end ov38_022203E8 + + arm_func_start ov38_02220434 +ov38_02220434: ; 0x02220434 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, _022205C4 ; =ov38_02226050 + mov r5, r0 + mov r4, r1 + str r5, [ip, #0xc] + mov r1, #0 + ldr r0, [sp, #0x20] + str r4, [ip, #0x20] + str r0, [ip, #0x18] + str r1, [ip, #0x1c] + str r1, [ip, #0x28] + str r1, [ip, #0x2c] + str r1, [ip, #0x30] + str r1, [ip, #4] + sub r0, r1, #1 + str r0, [ip, #0x24] + str r1, [ip, #8] + ldr r0, _022205C8 ; =ov38_02226090 + mov r7, r2 + mov r6, r3 + str r1, [ip, #0x10] + bl ov38_02221810 + ldr r0, _022205CC ; =ov38_022260D8 + bl ov38_02220810 + mov r0, r7 + bl ov38_022203E8 + ldr r1, _022205C4 ; =ov38_02226050 + cmp r0, #0 + str r0, [r1, #0x10] + beq _02220580 + mov r0, r6 + bl ov38_022203E8 + ldr r1, _022205C4 ; =ov38_02226050 + cmp r0, #0 + str r0, [r1, #8] + beq _02220580 + ldr r1, [sp, #0x18] + ldr r0, _022205D0 ; =ov38_02226084 + mov r2, #4 + bl ov38_022201C8 + ldr r1, _022205D0 ; =ov38_02226084 + mov r2, #0 + strb r2, [r1, r0] + ldr r1, [sp, #0x1c] + ldr r0, _022205D4 ; =ov38_022260BC + mov r2, #0x10 + bl ov38_022201C8 + ldr r1, _022205D4 ; =ov38_022260BC + mov r2, #0 + strb r2, [r1, r0] + bl ov38_0222175C + cmp r0, #0 + beq _0222054C + bl ov38_02221718 + cmp r0, #0 + beq _0222054C + mov r0, r5 + mov r1, r4 + mov r2, #0xa + bl ov38_022219FC + cmp r0, #0 + beq _02220548 + ldr r0, _022205D8 ; =ov38_022260A4 + bl ov38_02220684 + ldr r1, _022205C4 ; =ov38_02226050 + str r0, [r1, #4] + mov r0, #1 + str r0, [r1, #0x14] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02220548: + bl ov38_02221730 +_0222054C: + ldr r1, _022205C4 ; =ov38_02226050 + ldr r0, [r1, #8] + ldr r1, [r1, #0x20] + blx r1 + ldr r1, _022205C4 ; =ov38_02226050 + ldr r0, [r1, #0x10] + ldr r1, [r1, #0x20] + blx r1 + ldr r0, _022205C4 ; =ov38_02226050 + mov r1, #8 + str r1, [r0, #0x1c] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02220580: + ldr r1, _022205C4 ; =ov38_02226050 + ldr r0, [r1, #8] + cmp r0, #0 + beq _02220598 + ldr r1, [r1, #0x20] + blx r1 +_02220598: + ldr r1, _022205C4 ; =ov38_02226050 + ldr r0, [r1, #0x10] + cmp r0, #0 + beq _022205B0 + ldr r1, [r1, #0x20] + blx r1 +_022205B0: + ldr r0, _022205C4 ; =ov38_02226050 + mov r1, #1 + str r1, [r0, #0x1c] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022205C4: .word ov38_02226050 +_022205C8: .word ov38_02226090 +_022205CC: .word ov38_022260D8 +_022205D0: .word ov38_02226084 +_022205D4: .word ov38_022260BC +_022205D8: .word ov38_022260A4 + arm_func_end ov38_02220434 + + arm_func_start ov38_022205DC +ov38_022205DC: ; 0x022205DC + stmdb sp!, {r3, lr} + bl ov38_0221FF7C + bl ov38_02221730 + bl ov38_02221784 + ldr r1, _0222061C ; =ov38_02226050 + ldr r0, [r1, #8] + ldr r1, [r1, #0x20] + blx r1 + ldr r1, _0222061C ; =ov38_02226050 + ldr r0, [r1, #0x10] + ldr r1, [r1, #0x20] + blx r1 + ldr r0, _0222061C ; =ov38_02226050 + ldr r0, [r0] + blx r0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222061C: .word ov38_02226050 + arm_func_end ov38_022205DC + + arm_func_start ov38_02220620 +ov38_02220620: ; 0x02220620 + ldr r1, _0222063C ; =ov38_02226050 + mov r2, #0 + str r2, [r1, #0x14] + str r0, [r1] + ldr ip, _02220640 ; =ov38_02221AC4 + ldr r0, _02220644 ; =ov38_022205DC + bx ip + .balign 4, 0 +_0222063C: .word ov38_02226050 +_02220640: .word ov38_02221AC4 +_02220644: .word ov38_022205DC + arm_func_end ov38_02220620 + + arm_func_start ov38_02220648 +ov38_02220648: ; 0x02220648 + stmdb sp!, {r4, lr} + bl ov38_02221788 + cmp r0, #0 + bne _02220674 + bl ov38_02221734 + ldr r0, _02220680 ; =ov38_02226074 + ldr r4, [r0] + bl ov38_02221748 + mov r0, r4 + bl ov38_02222C9C + ldmia sp!, {r4, pc} +_02220674: + bl ov38_022217D0 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02220680: .word ov38_02226074 + arm_func_end ov38_02220648 + + arm_func_start ov38_02220684 +ov38_02220684: ; 0x02220684 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr ip, _02220774 ; =ov38_02224EBC + add r3, sp, #0 + mov r4, r0 + mov r2, #6 +_0222069C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _0222069C + ldrb r1, [ip] + ldr r0, _02220778 ; =ov38_022260FC + strb r1, [r3] + bl ov00_021EC9E0 + cmp r0, #0 + beq _02220768 + ldr r0, _0222077C ; =ov38_022260FC + ldr r1, [r0] + cmp r1, #0 + blt _022206F4 + cmp r1, #0xa + addlt r0, r1, #0x30 + strltb r0, [sp, #1] + blt _0222070C +_022206F4: + cmp r1, #0xa + blt _0222070C + cmp r1, #0x64 + bge _0222070C + add r0, sp, #0 + bl ov38_022218C0 +_0222070C: + ldr r0, _0222077C ; =ov38_022260FC + ldr r0, [r0] + cmp r0, #4 + cmpne r0, #8 + bne _0222074C + ldr r0, _0222077C ; =ov38_022260FC + ldr r0, [r0, #4] + cmp r0, #0 + blt _0222073C + cmp r0, #0xa + addlt r0, r0, #0x30 + strltb r0, [sp, #3] +_0222073C: + ldr r1, _02220780 ; =ov38_02226104 + add r0, sp, #4 + mov r2, #9 + bl ov38_0222189C +_0222074C: + add r1, sp, #0 + mov r0, r4 + mov r2, #0xd + bl ov38_022201C8 + add sp, sp, #0x10 + mov r0, #1 + ldmia sp!, {r4, pc} +_02220768: + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02220774: .word ov38_02224EBC +_02220778: .word ov38_022260FC +_0222077C: .word ov38_022260FC +_02220780: .word ov38_02226104 + arm_func_end ov38_02220684 + + arm_func_start ov38_02220784 +ov38_02220784: ; 0x02220784 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r5, r0 + mov r4, r1 + add r0, sp, #0x10 + mov r1, #0x14 + bl ov38_02221888 + add r0, sp, #0x10 + bl DWCi_BM_GetWiFiInfo + ldr r1, [sp, #0x10] + ldr r2, [sp, #0x14] + mov r0, #0 + cmp r2, r0 + cmpeq r1, r0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, pc} + add r0, sp, #0 + mov r3, #0xd + bl ov38_022218CC + cmp r0, #0 + addlt sp, sp, #0x24 + movlt r0, #0 + ldmltia sp!, {r4, r5, pc} + add r1, sp, #0 + mov r0, r4 + mov r2, #0xd + bl ov38_022201C8 + ldr r1, _0222080C ; =0x027FFE0C + mov r0, r5 + mov r2, #4 + bl ov38_022201C8 + mov r0, #1 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0222080C: .word 0x027FFE0C + arm_func_end ov38_02220784 + + arm_func_start ov38_02220810 +ov38_02220810: ; 0x02220810 + stmdb sp!, {r3, lr} + ldr r2, _0222082C ; =ov38_02225E08 + mov r3, #2 + mov r1, #0x21 + str r3, [sp] + bl OS_SNPrintf + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222082C: .word ov38_02225E08 + arm_func_end ov38_02220810 + + arm_func_start ov38_02220830 +ov38_02220830: ; 0x02220830 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sb, r2 + mov sl, r1 + ldr r1, [sb, #8] + cmp r0, #0 + str r1, [sp, #8] + ldr r1, [sb, #0xc] + ldr r5, [sb, #4] + str r1, [sp, #4] + mvn r1, #0 + str r1, [sp] + beq _02220878 + cmp r0, #6 + beq _02220A54 + cmp r0, #8 + beq _02220A4C + b _02220A5C +_02220878: + ldr r1, _02220B48 ; =ov38_02225E24 + add r2, sp, #0x14 + mov r0, sl + bl ov38_02222F88 + cmp r0, #3 + movne r4, #3 + bne _02220A60 + ldr r0, [sp, #0x14] + mov r1, #3 + bl ov38_022218B4 + ldr r1, _02220B4C ; =0x0000012E + cmp r0, r1 + bne _022209C4 + add r1, sp, #0x10 + mov r0, sl + mov r8, #0 + bl ov38_0222308C + movs r6, r0 + movmi r4, #3 + bmi _02220A60 + cmp r6, #0 + mov r7, r8 + ble _022209B0 + ldr r4, _02220B50 ; =ov38_02225E34 + mov fp, #8 +_022208DC: + ldr r3, [sp, #0x10] + mov r1, r7 + add r2, r3, r7 + b _022208F4 +_022208EC: + add r2, r2, #1 + add r7, r7, #1 +_022208F4: + ldrsb r0, [r2] + cmp r0, #0x3d + beq _02220908 + cmp r7, r6 + blt _022208EC +_02220908: + sub r0, r7, r1 + cmp r0, #8 + add r7, r7, #1 + bne _02220934 + add r0, r3, r1 + mov r1, r4 + mov r2, fp + bl ov38_0222187C + cmp r0, #0 + moveq r8, #1 + movne r8, #0 +_02220934: + ldr r1, [sp, #0x10] + mov r3, r7 + add r2, r1, r7 + b _0222094C +_02220944: + add r2, r2, #1 + add r7, r7, #1 +_0222094C: + ldrsb r0, [r2] + cmp r0, #0x26 + cmpne r0, #0xd + cmpne r0, #0 + beq _02220968 + cmp r7, r6 + blt _02220944 +_02220968: + cmp r8, #0 + sub r2, r7, r3 + add r7, r7, #1 + beq _022209A8 + cmp r2, #4 + bne _022209B0 + add r0, sp, #0xc + add r1, r1, r3 + bl ov38_022202C0 + mov r1, r0 + add r0, sp, #0xc + mov r2, #0 + strb r2, [r0, r1] + bl ov38_022218B4 + str r0, [sp] + b _022209B0 +_022209A8: + cmp r7, r6 + blt _022208DC +_022209B0: + ldr r0, [sp] + cmp r0, #0 + movlt r4, #3 + movge r4, #5 + b _02220A60 +_022209C4: + cmp r0, #0 + ble _022209D4 + cmp r0, #0xc8 + beq _022209DC +_022209D4: + mov r4, #3 + b _02220A60 +_022209DC: + cmp r5, #1 + beq _022209F8 + cmp r5, #2 + beq _02220A14 + cmp r5, #3 + beq _02220A30 + b _02220A60 +_022209F8: + mov r0, sl + mov r1, sb + bl ov38_02221414 + cmp r0, #0 + movne r4, #0 + moveq r4, #3 + b _02220A60 +_02220A14: + mov r0, sl + mov r1, sb + bl ov38_02221494 + cmp r0, #0 + movne r4, #0 + moveq r4, #3 + b _02220A60 +_02220A30: + mov r0, sl + mov r1, sb + bl ov38_02221468 + cmp r0, #0 + movne r4, #0 + moveq r4, #3 + b _02220A60 +_02220A4C: + mov r4, #6 + b _02220A60 +_02220A54: + mov r4, #4 + b _02220A60 +_02220A5C: + mov r4, #3 +_02220A60: + cmp r5, #1 + beq _02220AD0 + cmp r5, #2 + beq _02220A7C + cmp r5, #3 + beq _02220AC0 + b _02220AD0 +_02220A7C: + ldr r0, [sb, #0x20] + cmp r0, #0 + beq _02220A94 + ldr r1, _02220B54 ; =ov38_02226070 + ldr r1, [r1] + blx r1 +_02220A94: + ldr r0, [sb, #0x1c] + cmp r0, #0 + beq _02220AAC + ldr r1, _02220B54 ; =ov38_02226070 + ldr r1, [r1] + blx r1 +_02220AAC: + ldr r1, _02220B54 ; =ov38_02226070 + ldr r0, [sb, #0x18] + ldr r1, [r1] + blx r1 + b _02220AD0 +_02220AC0: + ldr r1, _02220B54 ; =ov38_02226070 + ldr r0, [sb, #0x10] + ldr r1, [r1] + blx r1 +_02220AD0: + bl ov38_02221734 + ldr r0, _02220B58 ; =ov38_02226074 + mvn r1, #0 + str r1, [r0] + bl ov38_02221748 + mov r0, sl + bl ov38_02222E04 + ldr r1, _02220B54 ; =ov38_02226070 + mov r0, sb + ldr r1, [r1] + blx r1 + bl ov38_022217D0 + cmp r4, #0 + ldrne r0, _02220B5C ; =ov38_0222606C + strne r4, [r0] + ldr r0, [sp, #8] + cmp r0, #0 + beq _02220B2C + ldr r2, [sp] + ldr r3, [sp, #8] + mov r0, r5 + mov r1, r4 + blx r3 +_02220B2C: + ldr r0, [sp, #4] + cmp r0, #0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov38_022217FC + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02220B48: .word ov38_02225E24 +_02220B4C: .word 0x0000012E +_02220B50: .word ov38_02225E34 +_02220B54: .word ov38_02226070 +_02220B58: .word ov38_02226074 +_02220B5C: .word ov38_0222606C + arm_func_end ov38_02220830 + + arm_func_start ov38_02220B60 +ov38_02220B60: ; 0x02220B60 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + bl ov38_02222B1C + bl ov38_022217D0 + ldr r1, _02220B88 ; =ov38_02226070 + mov r0, r4 + ldr r1, [r1] + blx r1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02220B88: .word ov38_02226070 + arm_func_end ov38_02220B60 + + arm_func_start ov38_02220B8C +ov38_02220B8C: ; 0x02220B8C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r8, r0 + mov r7, r1 + ldr r0, _02220E44 ; =ov38_02226138 + ldr r1, _02220E48 ; =ov38_02226144 + mov r6, r2 + mov r5, r3 + bl ov38_02220784 + cmp r0, #0 + bne _02220BD0 + ldr r0, _02220E4C ; =ov38_0222606C + mov r1, #8 + str r1, [r0] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02220BD0: + ldr r1, _02220E50 ; =ov38_0222605C + mov r0, #0x24 + ldr r2, [r1] + mov r1, #4 + blx r2 + movs r4, r0 + bne _02220C04 + ldr r0, _02220E4C ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02220C04: + ldr r0, _02220E54 ; =ov38_02226068 + mov r1, #0 + ldr r0, [r0] + str r0, [r4, #8] + str r1, [r4, #0xc] + bl ov38_02221788 + cmp r0, #0 + bne _02220C4C + ldr r1, _02220E58 ; =ov38_02226070 + mov r0, r4 + ldr r1, [r1] + blx r1 + ldr r0, _02220E4C ; =ov38_0222606C + mov r1, #2 + str r1, [r0] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02220C4C: + ldr r1, _02220E5C ; =ov38_02220830 + ldr r0, _02220E60 ; =ov38_02226060 + stmia sp, {r1, r4} + ldr r0, [r0] + ldr r3, [sp, #0x20] + mov r2, r5 + mov r1, #1 + bl ov38_022225B8 + movs r5, r0 + bne _02220CA0 + bl ov38_022217D0 + ldr r1, _02220E58 ; =ov38_02226070 + mov r0, r4 + ldr r1, [r1] + blx r1 + ldr r0, _02220E4C ; =ov38_0222606C + mov r1, #3 + str r1, [r0] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02220CA0: + ldr r1, _02220E64 ; =ov38_02225E20 + str r4, [r8] + mov r2, #1 + str r5, [r7] + bl ov38_02221E10 + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E68 ; =ov38_02225E40 + ldr r2, _02220E6C ; =ov38_022260D8 + mov r0, r5 + bl ov38_02221D78 + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E70 ; =ov38_02225E4C + ldr r2, _02220E74 ; =ov38_02226084 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E78 ; =ov38_02225E54 + ldr r2, _02220E44 ; =ov38_02226138 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E7C ; =ov38_02225E60 + ldr r2, _02220E80 ; =ov38_022260BC + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r0, _02220E84 ; =ov38_02226058 + ldr r1, _02220E88 ; =ov38_02225E68 + ldr r2, [r0] + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E8C ; =ov38_02225E70 + ldr r2, _02220E48 ; =ov38_02226144 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E90 ; =ov38_02225E78 + ldr r2, _02220E94 ; =ov38_02226090 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r1, _02220E98 ; =ov38_02225E80 + mov r0, r5 + mov r2, r6 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 + ldr r0, _02220E9C ; =ov38_02226078 + ldr r2, [r0] + cmp r2, #0 + beq _02220DA4 + ldr r1, _02220EA0 ; =ov38_02225E88 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 +_02220DA4: + ldr r0, _02220E9C ; =ov38_02226078 + ldr r2, [r0, #4] + cmp r2, #0 + beq _02220DC8 + ldr r1, _02220EA4 ; =ov38_02225E90 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 +_02220DC8: + ldr r0, _02220E9C ; =ov38_02226078 + ldr r2, [r0, #8] + cmp r2, #0 + beq _02220DEC + ldr r1, _02220EA8 ; =ov38_02225E98 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 +_02220DEC: + ldr r0, _02220EAC ; =ov38_02226054 + ldr r0, [r0] + cmp r0, #0 + beq _02220E14 + ldr r1, _02220EB0 ; =ov38_02225EA0 + ldr r2, _02220EB4 ; =ov38_022260A4 + mov r0, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _02220E20 +_02220E14: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02220E20: + mov r0, r4 + mov r1, r5 + bl ov38_02220B60 + ldr r0, _02220E4C ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02220E44: .word ov38_02226138 +_02220E48: .word ov38_02226144 +_02220E4C: .word ov38_0222606C +_02220E50: .word ov38_0222605C +_02220E54: .word ov38_02226068 +_02220E58: .word ov38_02226070 +_02220E5C: .word ov38_02220830 +_02220E60: .word ov38_02226060 +_02220E64: .word ov38_02225E20 +_02220E68: .word ov38_02225E40 +_02220E6C: .word ov38_022260D8 +_02220E70: .word ov38_02225E4C +_02220E74: .word ov38_02226084 +_02220E78: .word ov38_02225E54 +_02220E7C: .word ov38_02225E60 +_02220E80: .word ov38_022260BC +_02220E84: .word ov38_02226058 +_02220E88: .word ov38_02225E68 +_02220E8C: .word ov38_02225E70 +_02220E90: .word ov38_02225E78 +_02220E94: .word ov38_02226090 +_02220E98: .word ov38_02225E80 +_02220E9C: .word ov38_02226078 +_02220EA0: .word ov38_02225E88 +_02220EA4: .word ov38_02225E90 +_02220EA8: .word ov38_02225E98 +_02220EAC: .word ov38_02226054 +_02220EB0: .word ov38_02225EA0 +_02220EB4: .word ov38_022260A4 + arm_func_end ov38_02220B8C + + arm_func_start ov38_02220EB8 +ov38_02220EB8: ; 0x02220EB8 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + bl ov38_02221734 + mov r0, r4 + bl ov38_02222C10 + ldr r1, _02220F10 ; =ov38_02226074 + str r0, [r5] + str r0, [r1] + bl ov38_02221748 + ldr r0, [r5] + cmp r0, #0 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov38_02220B60 + ldr r0, _02220F14 ; =ov38_0222606C + mov r1, #3 + str r1, [r0] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02220F10: .word ov38_02226074 +_02220F14: .word ov38_0222606C + arm_func_end ov38_02220EB8 + + arm_func_start ov38_02220F18 +ov38_02220F18: ; 0x02220F18 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r2, _02220F84 ; =ov38_02224ED8 + mov r4, r0 + mov ip, #0x80 + ldr r3, _02220F88 ; =ov38_0222615C + add r0, sp, #8 + add r1, sp, #4 + str ip, [sp] + bl ov38_02220B8C + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [sp, #8] + mov r1, #1 + str r1, [r0, #4] + ldr r0, [sp, #8] + str r4, [r0, #0x10] + ldr r0, [sp, #8] + ldr r1, [sp, #4] + bl ov38_02220EB8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02220F84: .word ov38_02224ED8 +_02220F88: .word ov38_0222615C + arm_func_end ov38_02220F18 + + arm_func_start ov38_02220F8C +ov38_02220F8C: ; 0x02220F8C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x18 + mov r4, r2 + mov r6, r1 + ldr r1, _02221234 ; =ov38_0222605C + mov r7, r4, lsl #8 + cmp r7, #0x80 + ldr r2, [r1] + movlt r7, #0x80 + mov r5, r0 + mov r0, r7 + mov r1, #4 + blx r2 + movs r8, r0 + bne _02220FE0 + ldr r0, _02221238 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02220FE0: + add r0, sp, #0xc + mov r1, r6 + bl ov38_022218C0 + mov r6, r0 + bl ov38_022201AC + ldr r1, _02221234 ; =ov38_0222605C + add r0, r0, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + movs sb, r0 + bne _02221038 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldr r0, _02221238 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02221038: + add r1, sp, #0xc + mov r2, r6 + bl ov38_022201C8 + mov r1, #0 + strb r1, [sb, r0] + add r0, sp, #0xc + mov r1, r4 + bl ov38_022218C0 + mov r6, r0 + bl ov38_022201AC + ldr r1, _02221234 ; =ov38_0222605C + add r0, r0, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + movs sl, r0 + bne _022210B4 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sb + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldr r0, _02221238 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_022210B4: + add r1, sp, #0xc + mov r2, r6 + bl ov38_022201C8 + mov r1, #0 + strb r1, [sl, r0] + ldr r2, _02221240 ; =ov38_02224ECC + add r0, sp, #8 + add r1, sp, #4 + mov r3, r8 + str r7, [sp] + bl ov38_02220B8C + cmp r0, #0 + bne _02221124 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sl + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sb + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, r8 + ldr r1, [r1] + blx r1 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02221124: + ldr r0, [sp, #4] + ldr r1, _02221244 ; =ov38_02225EA8 + mov r2, sb + bl ov38_02221D9C + cmp r0, #0 + beq _022211E0 + ldr r0, [sp, #4] + ldr r1, _02221248 ; =ov38_02225EB0 + mov r2, sl + bl ov38_02221D9C + cmp r0, #0 + beq _022211E0 + ldr r0, [sp, #8] + mov r1, #2 + str r1, [r0, #4] + ldr r0, [sp, #8] + str r5, [r0, #0x10] + ldr r0, [sp, #8] + str sb, [r0, #0x1c] + ldr r0, [sp, #8] + str sl, [r0, #0x20] + ldr r0, [sp, #8] + str r4, [r0, #0x14] + ldr r0, [sp, #8] + str r8, [r0, #0x18] + ldr r0, [sp, #8] + ldr r1, [sp, #4] + bl ov38_02220EB8 + cmp r0, #0 + addne sp, sp, #0x18 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sl + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sb + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, r8 + ldr r1, [r1] + blx r1 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_022211E0: + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sl + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, sb + ldr r1, [r1] + blx r1 + ldr r1, _0222123C ; =ov38_02226070 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldr r0, [sp, #8] + ldr r1, [sp, #4] + bl ov38_02220B60 + ldr r0, _02221238 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02221234: .word ov38_0222605C +_02221238: .word ov38_0222606C +_0222123C: .word ov38_02226070 +_02221240: .word ov38_02224ECC +_02221244: .word ov38_02225EA8 +_02221248: .word ov38_02225EB0 + arm_func_end ov38_02220F8C + + arm_func_start ov38_0222124C +ov38_0222124C: ; 0x0222124C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r8, r0 + ldr r3, [r8, #0xac] + mov r7, r1 + cmp r2, r3 + bhs _02221280 + ldr r0, _022213F4 ; =ov38_0222606C + mov r1, #7 + str r1, [r0] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02221280: + bl ov38_02221870 + mov r4, r0 + cmp r4, #0x20 + ble _022212A8 + ldr r0, _022213F4 ; =ov38_0222606C + mov r1, #7 + str r1, [r0] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_022212A8: + cmp r4, #0 + movle r6, #0 + ble _022212BC + bl ov38_022201AC + mov r6, r0 +_022212BC: + ldr r1, _022213F8 ; =ov38_0222605C + add r0, r6, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + movs r5, r0 + bne _022212F0 + ldr r0, _022213F4 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_022212F0: + ldr ip, [r8, #0xac] + ldr r2, _022213FC ; =ov38_02224EE4 + add r0, sp, #8 + add r1, sp, #4 + mov r3, r7 + str ip, [sp] + bl ov38_02220B8C + cmp r0, #0 + bne _02221330 + ldr r1, _02221400 ; =ov38_02226070 + mov r0, r5 + ldr r1, [r1] + blx r1 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02221330: + cmp r6, #0 + ble _02221368 + mov r0, r5 + mov r1, r8 + mov r2, r4 + bl ov38_022201C8 + mov r1, #0 + strb r1, [r5, r0] + ldr r0, [sp, #4] + ldr r1, _02221404 ; =ov38_02225EB4 + mov r2, r5 + bl ov38_02221D9C + cmp r0, #0 + beq _022213C0 +_02221368: + ldr r0, [sp, #8] + mov r1, #3 + str r1, [r0, #4] + ldr r0, [sp, #8] + str r5, [r0, #0x10] + ldr r1, [r8, #0xac] + ldr r0, [sp, #8] + str r1, [r0, #0x14] + ldr r0, [sp, #8] + ldr r1, [sp, #4] + bl ov38_02220EB8 + cmp r0, #0 + addne sp, sp, #0xc + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, _02221400 ; =ov38_02226070 + mov r0, r5 + ldr r1, [r1] + blx r1 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_022213C0: + ldr r0, [sp, #8] + ldr r1, [sp, #4] + bl ov38_02220B60 + ldr r1, _02221400 ; =ov38_02226070 + mov r0, r5 + ldr r1, [r1] + blx r1 + ldr r0, _022213F4 ; =ov38_0222606C + mov r1, #1 + str r1, [r0] + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022213F4: .word ov38_0222606C +_022213F8: .word ov38_0222605C +_022213FC: .word ov38_02224EE4 +_02221400: .word ov38_02226070 +_02221404: .word ov38_02225EB4 + arm_func_end ov38_0222124C + + arm_func_start ov38_02221408 +ov38_02221408: ; 0x02221408 + ldr ip, _02221410 ; =ov38_02223384 + bx ip + .balign 4, 0 +_02221410: .word ov38_02223384 + arm_func_end ov38_02221408 + + arm_func_start ov38_02221414 +ov38_02221414: ; 0x02221414 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r1 + add r1, sp, #0 + bl ov38_0222308C + movs r1, r0 + bmi _0222145C + ldr r0, [sp] + bl ov38_022218B4 + ldr r1, [r4, #0x10] + add sp, sp, #4 + str r0, [r1] + ldr r0, [r4, #0x10] + ldr r0, [r0] + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + ldmia sp!, {r3, r4, pc} +_0222145C: + mov r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov38_02221414 + + arm_func_start ov38_02221468 +ov38_02221468: ; 0x02221468 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r1 + add r1, sp, #0 + bl ov38_0222308C + ldr r1, [r4, #0x14] + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov38_02221468 + + arm_func_start ov38_02221494 +ov38_02221494: ; 0x02221494 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + ldr r2, [r1, #0x14] + str r1, [sp] + mov r1, #0xb0 + mul r1, r2, r1 + mov r4, r0 + ldr r0, [sp] + mov r2, #0 + ldr r0, [r0, #0x10] + str r2, [sp, #4] + bl ov38_02221888 + ldr r1, _02221714 ; =ov38_02225EC0 + add r2, sp, #0x10 + mov r0, r4 + bl ov38_02222F88 + cmp r0, #0 + ble _022214FC + ldr r1, [sp, #0x10] + ldrsb r0, [r1] + cmp r0, #0x30 + ldreqsb r0, [r1, #1] + cmpeq r0, #0 + addeq sp, sp, #0x18 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022214FC: + add r1, sp, #0x14 + mov r0, r4 + bl ov38_0222308C + mov r4, r0 + cmp r4, #0 + ble _02221708 + ldr r0, [sp] + mov r5, #0 + ldr r0, [r0, #0x14] + str r5, [sp, #0xc] + cmp r0, #0 + ble _02221708 + str r5, [sp, #8] +_02221530: + cmp r5, r4 + movge r0, #1 + strge r0, [sp, #4] + bge _02221708 + ldr r0, [sp] + mov r6, #0 + ldr r1, [r0, #0x10] + ldr r0, [sp, #8] + mov r7, r5 + mov r2, r6 + str r6, [sp, #4] + cmp r5, r4 + add r8, r1, r0 + bge _022216E0 + mov sl, r6 + mov fp, #1 +_02221570: + ldr r3, [sp, #0x14] + ldrsb r0, [r3, r5] + cmp r0, #0xd + moveq r2, fp + beq _022216D4 + cmp r2, #0 + beq _022215DC + cmp r0, #0xa + bne _022216D0 + cmp r6, #5 + bne _022215C0 + sub r0, r5, #1 + sub r1, r0, r7 + cmp r1, #8 + bgt _02221708 + add r0, r3, r7 + bl ov38_022218B4 + cmp r0, #0 + blt _02221708 + str r0, [r8, #0xac] +_022215C0: + cmp r6, #5 + movge r0, #1 + strge r0, [sp, #4] + movlt r0, #0 + add r5, r5, #1 + strlt r0, [sp, #4] + b _022216E0 +_022215DC: + cmp r0, #9 + bne _022216D0 + cmp r6, #5 + addls pc, pc, r6, lsl #2 + b _022216C8 +_022215F0: ; jump table + b _02221608 ; case 0 + b _02221624 ; case 1 + b _02221654 ; case 2 + b _02221670 ; case 3 + b _0222168C ; case 4 + b _022216A8 ; case 5 +_02221608: + sub r2, r5, r7 + cmp r2, #0x20 + bhi _02221708 + add r1, r3, r7 + mov r0, r8 + bl ov38_0222189C + b _022216C8 +_02221624: + sub sb, r5, r7 + mov r0, sb + bl ov38_022201A0 + cmp r0, #0x66 + bhi _02221708 + ldr r0, [sp, #0x14] + mov r2, sb + add r1, r0, r7 + add r0, r8, #0x22 + bl ov38_022202C0 + strh sl, [r8, #0x86] + b _022216C8 +_02221654: + sub r2, r5, r7 + cmp r2, #0xa + bhi _02221708 + add r1, r3, r7 + add r0, r8, #0x88 + bl ov38_0222189C + b _022216C8 +_02221670: + sub r2, r5, r7 + cmp r2, #0xa + bhi _02221708 + add r1, r3, r7 + add r0, r8, #0x93 + bl ov38_0222189C + b _022216C8 +_0222168C: + sub r2, r5, r7 + cmp r2, #0xa + bhi _02221708 + add r1, r3, r7 + add r0, r8, #0x9e + bl ov38_0222189C + b _022216C8 +_022216A8: + sub r1, r5, r7 + cmp r1, #8 + bgt _02221708 + add r0, r3, r7 + bl ov38_022218B4 + cmp r0, #0 + blt _02221708 + str r0, [r8, #0xac] +_022216C8: + add r6, r6, #1 + add r7, r5, #1 +_022216D0: + mov r2, #0 +_022216D4: + add r5, r5, #1 + cmp r5, r4 + blt _02221570 +_022216E0: + ldr r0, [sp] + ldr r1, [r0, #0x14] + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + cmp r0, r1 + ldr r0, [sp, #8] + add r0, r0, #0xb0 + str r0, [sp, #8] + blt _02221530 +_02221708: + ldr r0, [sp, #4] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02221714: .word ov38_02225EC0 + arm_func_end ov38_02221494 + + arm_func_start ov38_02221718 +ov38_02221718: ; 0x02221718 + stmdb sp!, {r3, lr} + ldr r0, _0222172C ; =ov38_022261F8 + bl OS_InitMutex + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222172C: .word ov38_022261F8 + arm_func_end ov38_02221718 + + arm_func_start ov38_02221730 +ov38_02221730: ; 0x02221730 + bx lr + arm_func_end ov38_02221730 + + arm_func_start ov38_02221734 +ov38_02221734: ; 0x02221734 + ldr ip, _02221740 ; =OS_LockMutex + ldr r0, _02221744 ; =ov38_022261F8 + bx ip + .balign 4, 0 +_02221740: .word OS_LockMutex +_02221744: .word ov38_022261F8 + arm_func_end ov38_02221734 + + arm_func_start ov38_02221748 +ov38_02221748: ; 0x02221748 + ldr ip, _02221754 ; =OS_UnlockMutex + ldr r0, _02221758 ; =ov38_022261F8 + bx ip + .balign 4, 0 +_02221754: .word OS_UnlockMutex +_02221758: .word ov38_022261F8 + arm_func_end ov38_02221748 + + arm_func_start ov38_0222175C +ov38_0222175C: ; 0x0222175C + stmdb sp!, {r3, lr} + ldr r0, _0222177C ; =ov38_022261E0 + bl OS_InitMutex + ldr r0, _02221780 ; =ov38_022261DC + mov r1, #0 + str r1, [r0] + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222177C: .word ov38_022261E0 +_02221780: .word ov38_022261DC + arm_func_end ov38_0222175C + + arm_func_start ov38_02221784 +ov38_02221784: ; 0x02221784 + bx lr + arm_func_end ov38_02221784 + + arm_func_start ov38_02221788 +ov38_02221788: ; 0x02221788 + stmdb sp!, {r4, lr} + ldr r0, _022217C8 ; =ov38_022261E0 + bl OS_LockMutex + ldr r0, _022217CC ; =ov38_022261DC + ldr r0, [r0] + cmp r0, #0 + moveq r4, #1 + movne r4, #0 + cmp r4, #0 + ldrne r0, _022217CC ; =ov38_022261DC + movne r1, #1 + strne r1, [r0] + ldr r0, _022217C8 ; =ov38_022261E0 + bl OS_UnlockMutex + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022217C8: .word ov38_022261E0 +_022217CC: .word ov38_022261DC + arm_func_end ov38_02221788 + + arm_func_start ov38_022217D0 +ov38_022217D0: ; 0x022217D0 + stmdb sp!, {r3, lr} + ldr r0, _022217F4 ; =ov38_022261E0 + bl OS_LockMutex + ldr r1, _022217F8 ; =ov38_022261DC + mov r2, #0 + ldr r0, _022217F4 ; =ov38_022261E0 + str r2, [r1] + bl OS_UnlockMutex + ldmia sp!, {r3, pc} + .balign 4, 0 +_022217F4: .word ov38_022261E0 +_022217F8: .word ov38_022261DC + arm_func_end ov38_022217D0 + + arm_func_start ov38_022217FC +ov38_022217FC: ; 0x022217FC + ldr ip, _0222180C ; =OS_SendMessage + mov r1, #0 + mov r2, r1 + bx ip + .balign 4, 0 +_0222180C: .word OS_SendMessage + arm_func_end ov38_022217FC + + arm_func_start ov38_02221810 +ov38_02221810: ; 0x02221810 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + mov sb, r0 + add r0, sp, #0 + bl OS_GetMacAddress + mov r6, #0 + add r7, sp, #0 + mov r8, r6 + add r5, sp, #6 + mov r4, #2 +_02221838: + ldrb r1, [r7], #1 + mov r2, r4 + add r0, r5, r8 + bl ov38_022219A4 + add r6, r6, #1 + cmp r6, #6 + add r8, r8, #2 + blt _02221838 + add r1, sp, #6 + mov r0, sb + mov r2, #0xc + bl ov38_022201C8 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov38_02221810 + + arm_func_start ov38_02221870 +ov38_02221870: ; 0x02221870 + ldr ip, _02221878 ; =STD_GetStringLength + bx ip + .balign 4, 0 +_02221878: .word STD_GetStringLength + arm_func_end ov38_02221870 + + arm_func_start ov38_0222187C +ov38_0222187C: ; 0x0222187C + ldr ip, _02221884 ; =STD_CompareNString + bx ip + .balign 4, 0 +_02221884: .word STD_CompareNString + arm_func_end ov38_0222187C + + arm_func_start ov38_02221888 +ov38_02221888: ; 0x02221888 + ldr ip, _02221898 ; =MI_CpuFill8 + mov r2, r1 + mov r1, #0 + bx ip + .balign 4, 0 +_02221898: .word MI_CpuFill8 + arm_func_end ov38_02221888 + + arm_func_start ov38_0222189C +ov38_0222189C: ; 0x0222189C + ldr ip, _022218B0 ; =MI_CpuCopy8 + mov r3, r0 + mov r0, r1 + mov r1, r3 + bx ip + .balign 4, 0 +_022218B0: .word MI_CpuCopy8 + arm_func_end ov38_0222189C + + arm_func_start ov38_022218B4 +ov38_022218B4: ; 0x022218B4 + ldr ip, _022218BC ; =ov38_02224B80 + bx ip + .balign 4, 0 +_022218BC: .word ov38_02224B80 + arm_func_end ov38_022218B4 + + arm_func_start ov38_022218C0 +ov38_022218C0: ; 0x022218C0 + ldr ip, _022218C8 ; =ov38_02224C18 + bx ip + .balign 4, 0 +_022218C8: .word ov38_02224C18 + arm_func_end ov38_022218C0 + + arm_func_start ov38_022218CC +ov38_022218CC: ; 0x022218CC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r8, r2 + ldr r4, _02221998 ; =0x01634578 + ldr r2, _0222199C ; =0x5D8A0000 + mov sb, r1 + cmp r8, r4 + mov sl, r0 + mov fp, r3 + mov r5, #0 + cmpeq sb, r2 + subhs r0, r5, #1 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, r5 + mov r0, r5 +_02221904: + ldr r1, _022219A0 ; =ov38_02224EF4 + add r1, r1, r4, lsl #3 + ldr r6, [r1, #4] + ldr r1, _022219A0 ; =ov38_02224EF4 + cmp r8, r6 + ldr r7, [r1, r4, lsl #3] + cmpeq sb, r7 + blo _0222195C + mov r0, sb + mov r1, r8 + mov r2, r7 + mov r3, r6 + bl _ll_udiv + umull r3, r2, r0, r7 + mla r2, r0, r6, r2 + add r0, r0, #0x30 + strb r0, [sl, r5] + subs sb, sb, r3 + sbc r8, r8, r2 + mov r0, #1 + add r5, r5, #1 + b _0222197C +_0222195C: + cmp r0, #0 + bne _02221970 + rsb r1, r4, #0x11 + cmp r1, fp + bgt _0222197C +_02221970: + mov r1, #0x30 + strb r1, [sl, r5] + add r5, r5, #1 +_0222197C: + add r4, r4, #1 + cmp r4, #0x10 + blt _02221904 + adds r0, sb, #0x30 + strb r0, [sl, r5] + add r0, r5, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02221998: .word 0x01634578 +_0222199C: .word 0x5D8A0000 +_022219A0: .word ov38_02224EF4 + arm_func_end ov38_022218CC + + arm_func_start ov38_022219A4 +ov38_022219A4: ; 0x022219A4 + stmdb sp!, {r3, lr} + mov lr, #0 + cmp r2, #8 + subgt r0, lr, #1 + ldmgtia sp!, {r3, pc} + cmp r2, #1 + mov ip, #1 + blt _022219F4 +_022219C4: + sub r3, r2, ip + mov r3, r3, lsl #2 + mov r3, r1, lsr r3 + and r3, r3, #0xf + cmp r3, #0xa + addlo r3, r3, #0x30 + addhs r3, r3, #0x57 + add ip, ip, #1 + strb r3, [r0, lr] + add lr, lr, #1 + cmp ip, r2 + ble _022219C4 +_022219F4: + mov r0, lr + ldmia sp!, {r3, pc} + arm_func_end ov38_022219A4 + + arm_func_start ov38_022219FC +ov38_022219FC: ; 0x022219FC + stmdb sp!, {r4, lr} + ldr r3, _02221AC0 ; =ov38_02226210 + mov ip, #0 + str r0, [r3, #8] + str r1, [r3, #0xc] + str ip, [r3, #4] + str ip, [r3, #0x1c] + str ip, [r3, #0x20] + str ip, [r3, #0x10] + mov r4, r2 + str ip, [r3, #0x14] + bl ov38_0222201C + cmp r0, #0 + bne _02221A48 + ldr r0, _02221AC0 ; =ov38_02226210 + mov r1, #9 + str r1, [r0, #4] + mov r0, #0 + ldmia sp!, {r4, pc} +_02221A48: + ldr r1, _02221AC0 ; =ov38_02226210 + mov r0, #0x2000 + ldr r2, [r1, #8] + mov r1, #8 + blx r2 + movs r1, r0 + ldr r0, _02221AC0 ; =ov38_02226210 + str r1, [r0, #0x18] + bne _02221A80 + mov r1, #1 + str r1, [r0, #4] + bl ov38_02222034 + mov r0, #0 + ldmia sp!, {r4, pc} +_02221A80: + mov r0, r4 + bl ov38_02222060 + cmp r0, #0 + ldrne r1, _02221AC0 ; =ov38_02226210 + movne r0, #1 + strne r0, [r1] + ldmneia sp!, {r4, pc} + ldr r1, _02221AC0 ; =ov38_02226210 + mov r0, #9 + str r0, [r1, #4] + ldr r0, [r1, #0x18] + ldr r1, [r1, #0xc] + blx r1 + bl ov38_02222034 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02221AC0: .word ov38_02226210 + arm_func_end ov38_022219FC + + arm_func_start ov38_02221AC4 +ov38_02221AC4: ; 0x02221AC4 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov r2, r0 + mov ip, #0x800 + ldr r0, _02221B00 ; =ov38_02226234 + ldr r1, _02221B04 ; =ov38_02221B0C + ldr r3, _02221B08 ; =ov38_02226AF4 + str ip, [sp] + mov ip, #0x10 + str ip, [sp, #4] + bl OS_CreateThread + ldr r0, _02221B00 ; =ov38_02226234 + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02221B00: .word ov38_02226234 +_02221B04: .word ov38_02221B0C +_02221B08: .word ov38_02226AF4 + arm_func_end ov38_02221AC4 + + arm_func_start ov38_02221B0C +ov38_02221B0C: ; 0x02221B0C + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov38_02222D18 + bl ov38_022220D8 + ldr r1, _02221B44 ; =ov38_02226210 + ldr r0, [r1, #0x18] + ldr r1, [r1, #0xc] + blx r1 + bl ov38_02222034 + ldr r0, _02221B44 ; =ov38_02226210 + mov r1, #0 + str r1, [r0] + blx r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02221B44: .word ov38_02226210 + arm_func_end ov38_02221B0C + + arm_func_start ov38_02221B48 +ov38_02221B48: ; 0x02221B48 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sb, r0 + ldr sl, [sb] + mov r8, r1 + mov r7, r2 + mov r6, r3 + cmp sl, #0 + mov r4, #0 + beq _02221BC4 + ldr r1, [sl, #8] + mov r0, r8 + mov r5, sl + bl ov38_02224CD4 + cmp r0, #0 + beq _02221BC0 + ldr r5, [sl, #4] + ldr r0, [sb] + cmp r5, r0 + beq _02221BC4 +_02221B94: + ldr r1, [r5, #8] + mov r0, r8 + bl ov38_02224CD4 + cmp r0, #0 + moveq r4, #1 + beq _02221BC4 + ldr r5, [r5, #4] + ldr r0, [sb] + cmp r5, r0 + bne _02221B94 + b _02221BC4 +_02221BC0: + mov r4, #1 +_02221BC4: + cmp r4, #0 + strne r7, [r5, #0xc] + bne _02221C50 + ldr r1, _02221C58 ; =ov38_02226218 + mov r0, r6 + ldr r2, [r1] + mov r1, #4 + blx r2 + cmp r0, #0 + bne _02221C00 + ldr r0, _02221C5C ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02221C00: + str r8, [r0, #8] + str r7, [r0, #0xc] + mov r1, #0 + str r1, [r0, #0x10] + str r1, [r0, #0x14] + ldr r1, [sb] + cmp r1, #0 + streq r0, [r0, #4] + streq r0, [r0] + streq r0, [sb] + beq _02221C50 + ldr r1, [r1] + str r1, [r0] + ldr r1, [sb] + str r1, [r0, #4] + ldr r1, [sb] + ldr r1, [r1] + str r0, [r1, #4] + ldr r1, [sb] + str r0, [r1] +_02221C50: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02221C58: .word ov38_02226218 +_02221C5C: .word ov38_02226214 + arm_func_end ov38_02221B48 + + arm_func_start ov38_02221C60 +ov38_02221C60: ; 0x02221C60 + ldr r3, [r0] + cmp r3, #0 + beq _02221C9C + ldr r2, [r3] + cmp r3, r2 + moveq r1, #0 + streq r1, [r0] + beq _02221C9C + ldr r1, [r3, #4] + str r1, [r2, #4] + ldr r2, [r3] + ldr r1, [r3, #4] + str r2, [r1] + ldr r1, [r3, #4] + str r1, [r0] +_02221C9C: + mov r0, r3 + bx lr + arm_func_end ov38_02221C60 + + arm_func_start ov38_02221CA4 +ov38_02221CA4: ; 0x02221CA4 + add r0, r0, #1 + and r0, r0, #0xff + cmp r0, #0x7b + moveq r0, #0x30 + beq _02221CCC + cmp r0, #0x5b + moveq r0, #0x61 + beq _02221CCC + cmp r0, #0x3a + moveq r0, #0x41 +_02221CCC: + mov r0, r0, lsl #0x18 + mov r0, r0, asr #0x18 + bx lr + arm_func_end ov38_02221CA4 + + arm_func_start ov38_02221CD8 +ov38_02221CD8: ; 0x02221CD8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r0, sb + mov r1, r8 + add r2, sl, #0x46 + mov r3, #0x12 + bl ov38_02224DC8 + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r6, _02221D74 ; =ov38_02224F87 + mov fp, #0x13 + mov r4, #0x12 +_02221D14: + add r7, sl, fp + ldrsb r5, [r7, #0x44] +_02221D1C: + and r0, r5, #0xff + bl ov38_02221CA4 + mov r5, r0 + strb r5, [r7, #0x44] + ldrsb r0, [r6] + cmp r5, r0 + beq _02221D5C + mov r0, sb + mov r1, r8 + mov r3, r4 + add r2, sl, #0x46 + bl ov38_02224DC8 + cmp r0, #0 + bge _02221D1C + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02221D5C: + sub fp, fp, #1 + cmp fp, #2 + sub r6, r6, #1 + bge _02221D14 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02221D74: .word ov38_02224F87 + arm_func_end ov38_02221CD8 + + arm_func_start ov38_02221D78 +ov38_02221D78: ; 0x02221D78 + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + movne r0, #0 + ldmneia sp!, {r3, pc} + add r0, r0, #0x34 + mov r3, #0x18 + bl ov38_02221B48 + ldmia sp!, {r3, pc} + arm_func_end ov38_02221D78 + + arm_func_start ov38_02221D9C +ov38_02221D9C: ; 0x02221D9C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldr r0, [r8] + mov r7, r1 + mov r6, r2 + mov r5, #0 + cmp r0, #0 + movne r0, r5 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r6 + bl ov38_0222334C + mov r4, r0 + mov r0, r8 + mov r1, r6 + mov r2, r4 + bl ov38_02221CD8 + cmp r0, #0 + beq _02221E08 + mov r1, r7 + mov r2, r6 + add r0, r8, #0x38 + mov r3, #0x18 + bl ov38_02221B48 + movs r5, r0 + ldrne r0, [r8, #0x38] + ldrne r0, [r0] + strne r4, [r0, #0x10] +_02221E08: + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov38_02221D9C + + arm_func_start ov38_02221E10 +ov38_02221E10: ; 0x02221E10 + ldr r3, [r0] + cmp r3, #0 + movne r0, #0 + streq r1, [r0, #0x1c] + streq r2, [r0, #0x18] + moveq r0, #1 + bx lr + arm_func_end ov38_02221E10 + + arm_func_start ov38_02221E2C +ov38_02221E2C: ; 0x02221E2C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _02221ED4 ; =ov38_02226218 + mov r4, r0 + ldr r2, [r1] + mov r0, #0x14 + mov r1, #4 + mvn r5, #0 + blx r2 + cmp r0, #0 + beq _02221ECC + ldr r1, _02221ED8 ; =ov38_02226230 + ldr r2, [r1] + cmp r2, #0 + streq r0, [r0] + streq r0, [r0, #4] + streq r0, [r1] + beq _02221E94 + ldr r2, [r2] + str r2, [r0] + ldr r2, [r1] + str r2, [r0, #4] + ldr r2, [r1] + ldr r2, [r2] + str r0, [r2, #4] + ldr r1, [r1] + str r0, [r1] +_02221E94: + ldr r1, _02221EDC ; =ov38_0222622C + mvn r2, #0 + ldr ip, [r1] + ldr r3, [r1] + add r3, r3, #1 + str r3, [r1] + str ip, [r0, #8] + str r4, [r0, #0xc] + str r2, [r0, #0x10] + ldr r2, [r1] + ldr r5, [r0, #8] + cmp r2, #0 + movlt r0, #0 + strlt r0, [r1] +_02221ECC: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02221ED4: .word ov38_02226218 +_02221ED8: .word ov38_02226230 +_02221EDC: .word ov38_0222622C + arm_func_end ov38_02221E2C + + arm_func_start ov38_02221EE0 +ov38_02221EE0: ; 0x02221EE0 + ldr r1, _02221F34 ; =ov38_02226230 + mov r2, #0 + ldr r3, [r1] + cmp r3, #0 + beq _02221F2C + ldr r1, [r3, #8] + cmp r1, r0 + moveq r2, r3 + beq _02221F2C + ldr ip, [r3, #4] + cmp ip, r3 + beq _02221F2C +_02221F10: + ldr r1, [ip, #8] + cmp r1, r0 + moveq r2, ip + beq _02221F2C + ldr ip, [ip, #4] + cmp ip, r3 + bne _02221F10 +_02221F2C: + mov r0, r2 + bx lr + .balign 4, 0 +_02221F34: .word ov38_02226230 + arm_func_end ov38_02221EE0 + + arm_func_start ov38_02221F38 +ov38_02221F38: ; 0x02221F38 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, #0 + bl ov38_02221EE0 + movs r4, r0 + beq _02221FC8 + ldr r0, _02221FD0 ; =ov38_02226230 + ldr r2, [r0] + ldr r1, [r2] + cmp r2, r1 + beq _02221F88 + ldmia r4, {r1, r2} + str r2, [r1, #4] + ldr r2, [r4] + ldr r1, [r4, #4] + str r2, [r1] + ldr r1, [r0] + cmp r1, r4 + ldreq r1, [r4, #4] + streq r1, [r0] + b _02221F90 +_02221F88: + mov r1, r5 + str r1, [r0] +_02221F90: + ldr r0, [r4, #0xc] + ldr r5, [r0, #0x3c] + ldr r6, [r0, #0x30] + ldr r7, [r0, #0x2c] + bl ov38_02222B98 + ldr r1, _02221FD4 ; =ov38_0222621C + mov r0, r4 + ldr r1, [r1] + blx r1 + mov r1, r6 + mov r2, r7 + mov r0, #8 + blx r5 + mov r5, #1 +_02221FC8: + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02221FD0: .word ov38_02226230 +_02221FD4: .word ov38_0222621C + arm_func_end ov38_02221F38 + + arm_func_start ov38_02221FD8 +ov38_02221FD8: ; 0x02221FD8 + stmdb sp!, {r4, lr} + ldr r4, _02222004 ; =ov38_02226230 + ldr r0, [r4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} +_02221FEC: + ldr r0, [r0, #8] + bl ov38_02221F38 + ldr r0, [r4] + cmp r0, #0 + bne _02221FEC + ldmia sp!, {r4, pc} + .balign 4, 0 +_02222004: .word ov38_02226230 + arm_func_end ov38_02221FD8 + + arm_func_start ov38_02222008 +ov38_02222008: ; 0x02222008 + ldr ip, _02222014 ; =ov38_02221C60 + ldr r0, _02222018 ; =ov38_02226230 + bx ip + .balign 4, 0 +_02222014: .word ov38_02221C60 +_02222018: .word ov38_02226230 + arm_func_end ov38_02222008 + + arm_func_start ov38_0222201C +ov38_0222201C: ; 0x0222201C + stmdb sp!, {r3, lr} + ldr r0, _02222030 ; =ov38_02226AF8 + bl OS_InitMutex + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02222030: .word ov38_02226AF8 + arm_func_end ov38_0222201C + + arm_func_start ov38_02222034 +ov38_02222034: ; 0x02222034 + bx lr + arm_func_end ov38_02222034 + + arm_func_start ov38_02222038 +ov38_02222038: ; 0x02222038 + ldr ip, _02222044 ; =OS_LockMutex + ldr r0, _02222048 ; =ov38_02226AF8 + bx ip + .balign 4, 0 +_02222044: .word OS_LockMutex +_02222048: .word ov38_02226AF8 + arm_func_end ov38_02222038 + + arm_func_start ov38_0222204C +ov38_0222204C: ; 0x0222204C + ldr ip, _02222058 ; =OS_UnlockMutex + ldr r0, _0222205C ; =ov38_02226AF8 + bx ip + .balign 4, 0 +_02222058: .word OS_UnlockMutex +_0222205C: .word ov38_02226AF8 + arm_func_end ov38_0222204C + + arm_func_start ov38_02222060 +ov38_02222060: ; 0x02222060 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + bl OS_IsThreadAvailable + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _022220C8 ; =ov38_02226B10 + ldr r1, _022220CC ; =ov38_02226AF4 + mov r2, #1 + bl OS_InitMessageQueue + mov r0, #0x2000 + str r0, [sp] + ldr r0, _022220D0 ; =ov38_02226B30 + ldr r1, _022220D4 ; =ov38_022236A0 + add r3, r4, #0x2000 + mov r2, #0 + str r5, [sp, #4] + bl OS_CreateThread + ldr r0, _022220D0 ; =ov38_02226B30 + bl OS_WakeupThreadDirect + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022220C8: .word ov38_02226B10 +_022220CC: .word ov38_02226AF4 +_022220D0: .word ov38_02226B30 +_022220D4: .word ov38_022236A0 + arm_func_end ov38_02222060 + + arm_func_start ov38_022220D8 +ov38_022220D8: ; 0x022220D8 + stmdb sp!, {r3, lr} + ldr r0, _022220F8 ; =ov38_02226224 + mov r1, #1 + str r1, [r0] + bl ov38_0222211C + ldr r0, _022220FC ; =ov38_02226B30 + bl OS_JoinThread + ldmia sp!, {r3, pc} + .balign 4, 0 +_022220F8: .word ov38_02226224 +_022220FC: .word ov38_02226B30 + arm_func_end ov38_022220D8 + + arm_func_start ov38_02222100 +ov38_02222100: ; 0x02222100 + stmdb sp!, {r3, lr} + ldr r0, _02222118 ; =ov38_02226B10 + add r1, sp, #0 + mov r2, #1 + bl OS_ReceiveMessage + ldmia sp!, {r3, pc} + .balign 4, 0 +_02222118: .word ov38_02226B10 + arm_func_end ov38_02222100 + + arm_func_start ov38_0222211C +ov38_0222211C: ; 0x0222211C + ldr ip, _02222130 ; =OS_SendMessage + mov r1, #0 + ldr r0, _02222134 ; =ov38_02226B10 + mov r2, r1 + bx ip + .balign 4, 0 +_02222130: .word OS_SendMessage +_02222134: .word ov38_02226B10 + arm_func_end ov38_0222211C + + arm_func_start ov38_02222138 +ov38_02222138: ; 0x02222138 + stmdb sp!, {r3, lr} + cmp r1, #0x400 + bge _02222154 + mov r0, #0 + str r0, [r2] + str r1, [r3] + ldmia sp!, {r3, pc} +_02222154: + sub ip, r1, #0x400 + movs ip, ip, asr #9 + sub lr, ip, #1 + ldr ip, [r0, #0x1c] + beq _02222178 +_02222168: + cmp lr, #0 + sub lr, lr, #1 + ldr ip, [ip] + bne _02222168 +_02222178: + ldr r0, _02222190 ; =0x000001FF + sub r1, r1, #0x400 + str ip, [r2] + and r0, r1, r0 + str r0, [r3] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02222190: .word 0x000001FF + arm_func_end ov38_02222138 + + arm_func_start ov38_02222194 +ov38_02222194: ; 0x02222194 + ldr r3, [r1] + cmp r3, #0 + bne _022221D4 + ldr r3, [r2] + cmp r3, #0x400 + bge _022221C0 + add r1, r3, #1 + str r1, [r2] + add r0, r0, r3 + ldrsb r0, [r0, #0x20] + bx lr +_022221C0: + mov r3, #0 + str r3, [r2] + ldr r0, [r0, #0x1c] + str r0, [r1] + b _022221F4 +_022221D4: + ldr r0, [r2] + cmp r0, #0x200 + bne _022221F4 + mov r0, #0 + str r0, [r2] + ldr r0, [r1] + ldr r0, [r0] + str r0, [r1] +_022221F4: + ldr r3, [r2] + add r0, r3, #1 + str r0, [r2] + ldr r0, [r1] + add r0, r0, r3 + ldrsb r0, [r0, #4] + bx lr + arm_func_end ov38_02222194 + + arm_func_start ov38_02222210 +ov38_02222210: ; 0x02222210 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r6, #0 + movs r7, r3 + mov sl, r0 + subne r0, r6, #1 + mov sb, r1 + mov r8, r2 + strne r0, [r7] + cmp sb, r8 + bge _022222D4 + add r2, sp, #4 + add r3, sp, #0 + mov r0, sl + mov r1, sb + bl ov38_02222138 + cmp sb, r8 + bge _022222D4 + mov fp, #1 + add r5, sp, #4 + add r4, sp, #0 +_02222264: + mov r0, sl + mov r1, r5 + mov r2, r4 + bl ov38_02222194 + cmp r0, #0x3a + bne _02222290 + cmp r7, #0 + beq _02222290 + ldr r1, [r7] + cmp r1, #0 + strlt sb, [r7] +_02222290: + cmp r6, #0 + bne _022222A4 + cmp r0, #0xd + moveq r6, fp + b _022222C8 +_022222A4: + cmp r0, #0xa + bne _022222C4 + sub r0, r8, #1 + cmp sb, r0 + moveq r0, #0 + add sp, sp, #8 + addne r0, sb, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022222C4: + mov r6, #0 +_022222C8: + add sb, sb, #1 + cmp sb, r8 + blt _02222264 +_022222D4: + mvn r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov38_02222210 + + arm_func_start ov38_022222E0 +ov38_022222E0: ; 0x022222E0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r7, r1 + mov r6, r2 + mov r8, r0 + cmp r7, r6 + bge _02222344 + add r2, sp, #4 + add r3, sp, #0 + bl ov38_02222138 + cmp r7, r6 + bge _02222344 + add r5, sp, #4 + add r4, sp, #0 +_02222318: + mov r0, r8 + mov r1, r5 + mov r2, r4 + bl ov38_02222194 + cmp r0, #0x20 + addne sp, sp, #8 + movne r0, r7 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + add r7, r7, #1 + cmp r7, r6 + blt _02222318 +_02222344: + mvn r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov38_022222E0 + + arm_func_start ov38_02222350 +ov38_02222350: ; 0x02222350 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sb, r1 + mov r4, r2 + mov sl, r0 + mov r8, r3 + cmp sb, r4 + ldr r7, [sp, #0x30] + bge _02222414 + add r2, sp, #4 + add r3, sp, #0 + bl ov38_02222138 + add r1, sp, #4 + add r2, sp, #0 + mov r0, sl + bl ov38_02222194 + sub r6, r4, #1 + add r5, sp, #4 + add r4, sp, #0 + mov fp, #0 + b _022223D8 +_022223A4: + cmp r2, #0 + cmpne r2, #0x20 + cmpne r2, r7 + cmpne sb, r6 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, r5 + mov r2, r4 + bl ov38_02222194 + add sb, sb, #1 + add r8, r8, #1 +_022223D8: + ldrsb r2, [r8] + mov r1, fp + cmp r2, #0x41 + blt _022223F0 + cmp r2, #0x5a + movle r1, #1 +_022223F0: + cmp r1, #0 + addne r1, r2, #0x20 + moveq r1, r2 + cmp r0, #0x41 + blt _0222240C + cmp r0, #0x5a + addle r0, r0, #0x20 +_0222240C: + cmp r0, r1 + beq _022223A4 +_02222414: + mvn r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov38_02222350 + + arm_func_start ov38_02222420 +ov38_02222420: ; 0x02222420 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r4, r0 + mov r7, r2 + mov r6, r3 + ldr r0, [r4] + add r2, r7, r6 + mov r8, r1 + cmp r2, r0 + bgt _02222500 + cmp r6, #0 + beq _022224F8 + cmp r7, #0x400 + bge _02222480 + rsb r5, r7, #0x400 + cmp r6, r5 + movle r5, r6 + add r1, r4, #0x20 + mov r0, r8 + mov r2, r5 + add r1, r1, r7 + bl ov38_0222336C + add r7, r7, r5 + sub r6, r6, r5 + add r8, r8, r5 +_02222480: + cmp r6, #0 + beq _022224F8 + sub r2, r7, #0x400 + ldr r0, _02222508 ; =0x000001FF + movs r1, r2, asr #9 + and r7, r2, r0 + sub r0, r1, #1 + ldr r4, [r4, #0x1c] + beq _022224B4 +_022224A4: + cmp r0, #0 + sub r0, r0, #1 + ldr r4, [r4] + bne _022224A4 +_022224B4: + cmp r6, #0 + beq _022224F8 + ldr sb, _02222508 ; =0x000001FF +_022224C0: + rsb r5, r7, #0x200 + cmp r6, r5 + movle r5, r6 + add r1, r4, #4 + mov r0, r8 + mov r2, r5 + add r1, r1, r7 + bl ov38_0222336C + add r0, r7, r5 + and r7, r0, sb + subs r6, r6, r5 + add r8, r8, r5 + ldr r4, [r4] + bne _022224C0 +_022224F8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02222500: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02222508: .word 0x000001FF + arm_func_end ov38_02222420 + + arm_func_start ov38_0222250C +ov38_0222250C: ; 0x0222250C + ldr r0, [r0, #0xc] + cmp r0, r1 + movls r0, #1 + movhi r0, #0 + bx lr + arm_func_end ov38_0222250C + + arm_func_start ov38_02222520 +ov38_02222520: ; 0x02222520 + stmdb sp!, {r3, lr} + ldr ip, [r0, #0x30] + mov lr, r2 + str r3, [sp] + ldr r2, [ip, #0x18] + ldr r3, [ip, #0xc] + add r2, r2, lr + sub r3, r3, lr + bl ov38_02223224 + ldmia sp!, {r3, pc} + arm_func_end ov38_02222520 + + arm_func_start ov38_02222548 +ov38_02222548: ; 0x02222548 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r8, r0 + ldr r4, [r8, #0x30] + mov r6, r2 + mov r7, r1 + mov r0, r4 + mov r1, r6 + mov r5, r3 + bl ov38_0222250C + cmp r0, #0 + addne sp, sp, #4 + ldrne r0, _022225B4 ; =0xFFFFFC15 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [r4, #0xc] + ldr r1, [sp, #0x20] + sub r3, r0, r6 + str r1, [sp] + ldr r2, [r4, #0x18] + cmp r5, r3 + movle r3, r5 + mov r0, r8 + mov r1, r7 + add r2, r2, r6 + bl ov38_02223224 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022225B4: .word 0xFFFFFC15 + arm_func_end ov38_02222548 + + arm_func_start ov38_022225B8 +ov38_022225B8: ; 0x022225B8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov fp, r0 + movs r0, r1 + cmpne r0, #1 + str r1, [sp] + mov r5, r2 + mov r4, r3 + mov r7, #0 + cmpne r0, #2 + beq _022225F0 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #0xb + str r1, [r0] + b _02222A7C +_022225F0: + cmp r4, #0 + bne _02222608 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #0xb + str r1, [r0] + b _02222A7C +_02222608: + ldr r1, _02222B04 ; =ov38_02226218 + mov r0, #0x58 + ldr r2, [r1] + mov r1, #4 + blx r2 + movs r7, r0 + bne _02222634 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + b _02222A7C +_02222634: + mov r1, #0x58 + bl ov38_02223358 + ldr r1, _02222B04 ; =ov38_02226218 + mov r0, #0x420 + ldr r2, [r1] + mov r1, #4 + blx r2 + str r0, [r7, #0x30] + cmp r0, #0 + bne _0222266C + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + b _02222A7C +_0222266C: + mov r1, #0x420 + bl ov38_02223358 + ldr r1, [r7, #0x30] + mov r0, fp + str r5, [r1, #0x18] + ldr r1, [r7, #0x30] + str r4, [r1, #0xc] + bl ov38_0222334C + mov r4, r0 + cmp r4, #7 + bgt _022226A8 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_022226A8: + mov r8, #7 + mov r3, #0x50 + ldr r1, _02222B08 ; =ov38_02225ED0 + mov r0, fp + mov r2, r8 + str r3, [r7, #0x28] + bl ov38_022232E4 + cmp r0, #0 + beq _02222708 + ldr r1, _02222B0C ; =ov38_02225ED8 + mov r0, fp + mov r2, #8 + bl ov38_022232E4 + cmp r0, #0 + beq _022226F4 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_022226F4: + mov r0, #1 + str r0, [r7, #8] + rsb r0, r0, #0x1bc + str r0, [r7, #0x28] + mov r8, #8 +_02222708: + sub r4, r4, r8 + cmp r4, #0 + add r6, fp, r8 + bgt _02222728 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_02222728: + mov r5, #0 + mov sb, r5 + mov sl, r5 + b _0222279C +_02222738: + cmp sl, #2 + subeq sl, sl, #1 + beq _02222798 + cmp sl, #1 + bne _0222278C + sub r0, r5, #1 + mov r1, #2 + add r0, r6, r0 + bl ov38_02224A98 + mov r0, r0, lsl #0x18 + movs r0, r0, asr #0x18 + sub sl, sl, #1 + bpl _0222277C + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_0222277C: + cmp r0, #0x2f + bne _02222798 + sub sb, sb, #1 + b _022227B0 +_0222278C: + cmp r0, #0x25 + moveq sl, #2 + addeq sb, sb, #1 +_02222798: + add r5, r5, #1 +_0222279C: + cmp r5, r4 + bge _022227B0 + ldrsb r0, [r6, r5] + cmp r0, #0x2f + bne _02222738 +_022227B0: + cmp sl, #0 + beq _022227C8 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_022227C8: + ldr r0, _02222B04 ; =ov38_02226218 + add r1, r8, r4 + sub r1, r1, sb, lsl #1 + ldr r2, [r0] + add r0, r1, #1 + mov r1, #4 + blx r2 + str r0, [r7, #0x24] + cmp r0, #0 + bne _02222800 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + b _02222A7C +_02222800: + mov r1, fp + mov r2, r8 + bl ov38_0222336C + mov sb, #0 + mov r5, sb + mov sl, sb + mov fp, sb + cmp r4, #0 + ble _022228A4 +_02222824: + cmp sl, #2 + subeq sl, sl, #1 + beq _02222898 + cmp sl, #1 + bne _02222870 + sub r0, sb, #1 + add r0, r6, r0 + mov r1, #2 + bl ov38_02224A98 + mov r0, r0, lsl #0x18 + mov r1, r0, asr #0x18 + ldr r0, [r7, #0x24] + cmp r1, #0x2f + add r0, r8, r0 + add r0, r5, r0 + sub sl, sl, #1 + strb r1, [r0, #-1] + moveq fp, #1 + b _02222898 +_02222870: + ldrsb r1, [r6, sb] + cmp r1, #0x2f + moveq fp, #1 + cmp fp, #0 + cmpeq r1, #0x25 + ldrne r0, [r7, #0x24] + moveq sl, #2 + addne r0, r8, r0 + strneb r1, [r5, r0] + add r5, r5, #1 +_02222898: + add sb, sb, #1 + cmp sb, r4 + blt _02222824 +_022228A4: + ldr r1, [r7, #0x24] + add r0, r8, r5 + mov r2, #0 + strb r2, [r1, r0] + ldr r0, [r7, #0x24] + cmp r5, #0 + add r1, r0, r8 + ble _022228E8 +_022228C4: + ldrsb r0, [r1, r2] + cmp r0, #0x2f + cmpne r0, #0x3a + addeq r0, r2, r8 + streq r0, [r7, #0xc] + beq _022228E8 + add r2, r2, #1 + cmp r2, r5 + blt _022228C4 +_022228E8: + cmp r2, r5 + bne _02222900 + add r0, r2, r8 + str r0, [r7, #0xc] + str r0, [r7, #0x10] + b _022229A4 +_02222900: + ldrsb r0, [r1, r2] + cmp r0, #0x2f + ldreq r0, [r7, #0xc] + streq r0, [r7, #0x10] + beq _022229A4 + cmp r0, #0x3a + bne _022229A4 + cmp r2, r5 + bge _02222944 +_02222924: + ldrsb r0, [r1, r2] + cmp r0, #0x2f + addeq r0, r2, r8 + streq r0, [r7, #0x10] + beq _02222944 + add r2, r2, #1 + cmp r2, r5 + blt _02222924 +_02222944: + cmp r2, r5 + addeq r0, r2, r8 + streq r0, [r7, #0x10] + beq _022229A4 + ldr r1, [r7, #0xc] + ldr r0, [r7, #0x24] + add r2, r1, #1 + ldr r1, [r7, #0x10] + add r0, r0, r2 + sub r1, r1, r2 + bl ov38_02224D58 + cmp r0, #0 + ldrlt r0, [r7, #0x28] + blt _02222998 + ldr r1, _02222B10 ; =0x0000FFFF + cmp r0, r1 + ble _02222998 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #4 + str r1, [r0] + b _02222A7C +_02222998: + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r7, #0x28] +_022229A4: + ldr r0, [r7, #8] + cmp r0, #0 + beq _02222A4C + ldr r0, _02222B04 ; =ov38_02226218 + ldr r3, [r7, #0xc] + ldr r2, [r0] + mov r0, #0x830 + mov r1, #4 + sub r4, r3, r8 + blx r2 + str r0, [r7, #0x20] + cmp r0, #0 + bne _022229E8 + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + b _02222A7C +_022229E8: + mov r1, #0x830 + bl ov38_02223358 + ldr r1, _02222B04 ; =ov38_02226218 + add r0, r4, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + ldr r1, [r7, #0x20] + str r0, [r1, #0x800] + ldr r0, [r7, #0x20] + ldr r0, [r0, #0x800] + cmp r0, #0 + bne _02222A2C + ldr r0, _02222B00 ; =ov38_02226214 + mov r1, #1 + str r1, [r0] + b _02222A7C +_02222A2C: + ldr r1, [r7, #0x24] + mov r2, r4 + add r1, r1, r8 + bl ov38_0222336C + ldr r0, [r7, #0x20] + mov r1, #0 + ldr r0, [r0, #0x800] + strb r1, [r0, r4] +_02222A4C: + ldr r1, _02222B14 ; =ov38_02224F74 + add r0, r7, #0x44 + mov r2, #0x14 + bl ov38_0222336C + ldr r0, [sp, #0x2c] + ldr r1, [sp, #0x28] + str r0, [r7, #0x2c] + ldr r0, [sp] + str r0, [r7, #0x40] + mov r0, r7 + str r1, [r7, #0x3c] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02222A7C: + cmp r7, #0 + beq _02222AF8 + ldr r0, [r7, #0x20] + cmp r0, #0 + beq _02222AB8 + ldr r0, [r0, #0x800] + cmp r0, #0 + beq _02222AA8 + ldr r1, _02222B18 ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222AA8: + ldr r1, _02222B18 ; =ov38_0222621C + ldr r0, [r7, #0x20] + ldr r1, [r1] + blx r1 +_02222AB8: + ldr r0, [r7, #0x24] + cmp r0, #0 + beq _02222AD0 + ldr r1, _02222B18 ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222AD0: + ldr r0, [r7, #0x30] + cmp r0, #0 + beq _02222AE8 + ldr r1, _02222B18 ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222AE8: + ldr r1, _02222B18 ; =ov38_0222621C + mov r0, r7 + ldr r1, [r1] + blx r1 +_02222AF8: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02222B00: .word ov38_02226214 +_02222B04: .word ov38_02226218 +_02222B08: .word ov38_02225ED0 +_02222B0C: .word ov38_02225ED8 +_02222B10: .word 0x0000FFFF +_02222B14: .word ov38_02224F74 +_02222B18: .word ov38_0222621C + arm_func_end ov38_022225B8 + + arm_func_start ov38_02222B1C +ov38_02222B1C: ; 0x02222B1C + stmdb sp!, {r4, lr} + ldr r1, _02222B40 ; =ov38_0222621C + mov r4, r0 + ldr r0, [r4, #0x30] + ldr r1, [r1] + blx r1 + mov r0, r4 + bl ov38_02222B98 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02222B40: .word ov38_0222621C + arm_func_end ov38_02222B1C + + arm_func_start ov38_02222B44 +ov38_02222B44: ; 0x02222B44 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, _02222B94 ; =ov38_0222621C + mov r5, #0 +_02222B58: + ldr r0, [r7] + cmp r7, r0 + beq _02222B78 + ldr r6, [r0] + ldr r1, [r4] + blx r1 + str r6, [r7] + b _02222B88 +_02222B78: + ldr r1, [r4] + mov r0, r7 + blx r1 + mov r7, r5 +_02222B88: + cmp r7, #0 + bne _02222B58 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02222B94: .word ov38_0222621C + arm_func_end ov38_02222B44 + + arm_func_start ov38_02222B98 +ov38_02222B98: ; 0x02222B98 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x34] + bl ov38_02222B44 + ldr r0, [r4, #0x38] + bl ov38_02222B44 + ldr r0, [r4, #0x20] + cmp r0, #0 + beq _02222BE4 + ldr r0, [r0, #0x800] + cmp r0, #0 + beq _02222BD4 + ldr r1, _02222C0C ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222BD4: + ldr r1, _02222C0C ; =ov38_0222621C + ldr r0, [r4, #0x20] + ldr r1, [r1] + blx r1 +_02222BE4: + ldr r1, _02222C0C ; =ov38_0222621C + ldr r0, [r4, #0x24] + ldr r1, [r1] + blx r1 + ldr r1, _02222C0C ; =ov38_0222621C + mov r0, r4 + ldr r1, [r1] + blx r1 + mov r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02222C0C: .word ov38_0222621C + arm_func_end ov38_02222B98 + + arm_func_start ov38_02222C10 +ov38_02222C10: ; 0x02222C10 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5] + cmp r0, #0 + beq _02222C38 + ldr r0, _02222C98 ; =ov38_02226214 + mov r1, #0xb + str r1, [r0] + sub r0, r1, #0xc + ldmia sp!, {r3, r4, r5, pc} +_02222C38: + ldr r0, [r5, #0x40] + cmp r0, #1 + ldreq r0, [r5, #0x38] + cmpeq r0, #0 + bne _02222C60 + ldr r0, _02222C98 ; =ov38_02226214 + mov r1, #0xb + str r1, [r0] + sub r0, r1, #0xc + ldmia sp!, {r3, r4, r5, pc} +_02222C60: + bl ov38_02222038 + mov r0, r5 + bl ov38_02221E2C + movs r4, r0 + ldrmi r0, _02222C98 ; =ov38_02226214 + movmi r1, #1 + strmi r1, [r0] + bmi _02222C8C + mov r0, #1 + str r0, [r5] + bl ov38_0222211C +_02222C8C: + bl ov38_0222204C + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02222C98: .word ov38_02226214 + arm_func_end ov38_02222C10 + + arm_func_start ov38_02222C9C +ov38_02222C9C: ; 0x02222C9C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, #0 + bl ov38_02222038 + ldr r0, _02222D14 ; =ov38_02226220 + ldr r2, [r0] + cmp r2, #0 + beq _02222CF4 + ldr r1, [r2, #8] + cmp r1, r4 + ldreq r1, [r2, #0xc] + ldreq r1, [r1, #4] + cmpeq r1, #0 + bne _02222CF4 + ldr r1, [r2, #0xc] + mov r2, #1 + str r2, [r1, #4] + ldr r1, [r0] + ldr r0, [r1, #0xc] + ldr r1, [r1, #0x10] + bl ov38_022232BC + mov r5, #1 +_02222CF4: + cmp r5, #0 + bne _02222D08 + mov r0, r4 + bl ov38_02221F38 + mov r5, r0 +_02222D08: + bl ov38_0222204C + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02222D14: .word ov38_02226220 + arm_func_end ov38_02222C9C + + arm_func_start ov38_02222D18 +ov38_02222D18: ; 0x02222D18 + stmdb sp!, {r3, lr} + bl ov38_02222038 + ldr r0, _02222D68 ; =ov38_02226220 + ldr r2, [r0] + cmp r2, #0 + beq _02222D5C + ldr r1, [r2, #0xc] + ldr r1, [r1, #4] + cmp r1, #0 + bne _02222D5C + ldr r1, [r2, #0xc] + mov r2, #1 + str r2, [r1, #4] + ldr r1, [r0] + ldr r0, [r1, #0xc] + ldr r1, [r1, #0x10] + bl ov38_022232BC +_02222D5C: + bl ov38_02221FD8 + bl ov38_0222204C + ldmia sp!, {r3, pc} + .balign 4, 0 +_02222D68: .word ov38_02226220 + arm_func_end ov38_02222D18 + + arm_func_start ov38_02222D6C +ov38_02222D6C: ; 0x02222D6C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + ldr r2, [r5, #0x24] + ldr r1, [r5, #0xc] + mov r0, #0 + ldrsb r4, [r2, r1] + strb r0, [r2, r1] + ldr r0, [r5, #8] + ldr r6, [r5, #0x24] + cmp r0, #0 + movne r7, #8 + moveq r7, #7 + add r1, sp, #0 + add r0, r6, r7 + bl SOC_InetAtoN + cmp r0, #0 + ldrne r0, [sp] + bne _02222DF4 + add r0, r6, r7 + bl SOCL_Resolve + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r2, r0, lsr #0x18 + mov r1, r0, lsr #8 + mov r3, r0, lsl #8 + mov ip, r0, lsl #0x18 + and r2, r2, #0xff + and r0, r1, #0xff00 + and r1, r3, #0xff0000 + orr r0, r2, r0 + and r2, ip, #0xff000000 + orr r0, r1, r0 + orr r0, r2, r0 +_02222DF4: + ldr r2, [r5, #0x24] + ldr r1, [r5, #0xc] + strb r4, [r2, r1] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov38_02222D6C + + arm_func_start ov38_02222E04 +ov38_02222E04: ; 0x02222E04 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldr r0, [r4, #0x1c] + cmp r0, #0 + beq _02222E34 + ldr r5, _02222E78 ; =ov38_0222621C +_02222E1C: + ldr r6, [r0] + ldr r1, [r5] + blx r1 + movs r0, r6 + str r6, [r4, #0x1c] + bne _02222E1C +_02222E34: + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02222E4C + ldr r1, _02222E78 ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222E4C: + ldr r0, [r4, #0x14] + cmp r0, #0 + beq _02222E64 + ldr r1, _02222E78 ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02222E64: + ldr r1, _02222E78 ; =ov38_0222621C + mov r0, r4 + ldr r1, [r1] + blx r1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02222E78: .word ov38_0222621C + arm_func_end ov38_02222E04 + + arm_func_start ov38_02222E7C +ov38_02222E7C: ; 0x02222E7C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r2 + mov sl, r1 + ldr r2, [r5] + add r3, sp, #4 + mov r1, #0xc + bl ov38_02222210 + mov r8, r0 + cmp r8, #0 + ble _02222F7C + mov r6, #0 + add r7, sp, #4 +_02222EB4: + ldr r2, [r5] + mov r0, r5 + mov r1, r8 + mov r3, r7 + bl ov38_02222210 + ldr r2, [sp, #4] + mov sb, r0 + cmp r2, #0 + ble _02222F70 + mov r0, r5 + mov r1, r8 + mov r3, sl + str r6, [sp] + bl ov38_02222350 + cmp r0, #0 + bne _02222F70 + ldr r1, [sp, #4] + ldr r0, [r5] + add r1, r1, #1 + cmp r1, r0 + bge _02222F64 + ldr r2, [r5] + mov r0, r5 + mov r3, #0 + bl ov38_02222210 + cmp r0, #0 + ldrle r6, [r5] + ble _02222F38 + cmp r0, #2 + addlt sp, sp, #8 + mvnlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + sub r6, r0, #2 +_02222F38: + ldr r1, [sp, #4] + mov r0, r5 + mov r2, r6 + add r1, r1, #1 + bl ov38_022222E0 + cmp r0, #0 + movlt r0, r6 + str r0, [r4] + add sp, sp, #8 + sub r0, r6, r0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02222F64: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02222F70: + mov r8, sb + cmp sb, #0 + bgt _02222EB4 +_02222F7C: + mvn r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov38_02222E7C + + arm_func_start ov38_02222F88 +ov38_02222F88: ; 0x02222F88 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r0, [r7, #8] + mov r6, r1 + cmp r0, #0 + mov r5, r2 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x14] + cmp r0, #0 + beq _02222FC8 + ldr r1, _02223080 ; =ov38_0222621C + ldr r1, [r1] + blx r1 + mov r0, #0 + str r0, [r7, #0x14] +_02222FC8: + add r2, sp, #0 + mov r0, r7 + mov r1, r6 + bl ov38_02222E7C + movs r4, r0 + bmi _02223024 + ldr r1, _02223084 ; =ov38_02226218 + add r0, r4, #1 + ldr r2, [r1] + mov r1, #4 + blx r2 + str r0, [r7, #0x14] + mov r1, #0 + strb r1, [r0, r4] + ldr r1, [r7, #0x14] + ldr r2, [sp] + mov r0, r7 + mov r3, r4 + bl ov38_02222420 + ldr r1, [r7, #0x14] + mov r0, r4 + str r1, [r5] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02223024: + ldr r0, _02223088 ; =ov38_02225EE4 + mov r1, r6 + bl ov38_022232D8 + cmp r0, #0 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _02223084 ; =ov38_02226218 + mov r0, #4 + ldr r2, [r1] + mov r1, r0 + blx r2 + str r0, [r7, #0x14] + mov r1, #0 + strb r1, [r0, #3] + ldr r1, [r7, #0x14] + mov r0, r7 + mov r2, #9 + mov r3, #3 + bl ov38_02222420 + ldr r1, [r7, #0x14] + mov r0, #3 + str r1, [r5] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02223080: .word ov38_0222621C +_02223084: .word ov38_02226218 +_02223088: .word ov38_02225EE4 + arm_func_end ov38_02222F88 + + arm_func_start ov38_0222308C +ov38_0222308C: ; 0x0222308C + ldr r2, [r0, #8] + cmp r2, #0 + ldrne r2, [r0, #4] + cmpne r2, #0 + mvneq r0, #0 + ldrne r2, [r0, #0x18] + strne r2, [r1] + ldrne r0, [r0, #4] + bx lr + arm_func_end ov38_0222308C + + arm_func_start ov38_022230B0 +ov38_022230B0: ; 0x022230B0 + tst r0, #0x8000 + bicne r0, r0, #0x8000 + bx lr + arm_func_end ov38_022230B0 + + arm_func_start ov38_022230BC +ov38_022230BC: ; 0x022230BC + stmdb sp!, {r3, lr} + ldr r0, _022230D8 ; =ov38_02226BF0 + bl OS_GetLowEntropyData + ldr r0, _022230D8 ; =ov38_02226BF0 + mov r1, #0x20 + bl CPS_SslAddRandomSeed + ldmia sp!, {r3, pc} + .balign 4, 0 +_022230D8: .word ov38_02226BF0 + arm_func_end ov38_022230BC + + arm_func_start ov38_022230DC +ov38_022230DC: ; 0x022230DC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl SOC_Socket + movs r4, r0 + bmi _02223150 + ldr r0, [r5, #8] + cmp r0, #0 + beq _02223150 + bl ov38_022230BC + ldr r1, [r5, #0x1c] + ldr r0, [r5, #0x20] + ldr r2, _02223158 ; =ov38_022230B0 + str r1, [r0, #0x814] + ldr r3, [r5, #0x18] + ldr r1, [r5, #0x20] + mov r0, r4 + str r3, [r1, #0x818] + ldr r1, [r5, #0x20] + str r2, [r1, #0x810] + ldr r1, [r5, #0x20] + bl SOCL_EnableSsl + cmp r0, #0 + bge _02223150 + mov r0, r4 + bl SOC_Close + mvn r4, #0 +_02223150: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02223158: .word ov38_022230B0 + arm_func_end ov38_022230DC + + arm_func_start ov38_0222315C +ov38_0222315C: ; 0x0222315C + ldr ip, _02223168 ; =SOC_Close + mov r0, r1 + bx ip + .balign 4, 0 +_02223168: .word SOC_Close + arm_func_end ov38_0222315C + + arm_func_start ov38_0222316C +ov38_0222316C: ; 0x0222316C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r0, r6 + bl SOC_Close + mvn r4, #0x19 + cmp r0, r4 + ldmneia sp!, {r4, r5, r6, pc} + mov r5, #0x1f4 +_0222318C: + mov r0, r5 + bl OS_Sleep + mov r0, r6 + bl SOC_Close + cmp r0, r4 + beq _0222318C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov38_0222316C + + arm_func_start ov38_022231A8 +ov38_022231A8: ; 0x022231A8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + mov ip, r3, asr #8 + mov r4, r0 + mov r5, #8 + mov lr, #2 + mov r3, r3, lsl #8 + mov r0, r1 + and ip, ip, #0xff + and r1, r3, #0xff00 + orr r3, ip, r1 + add r1, sp, #0 + strb r5, [sp] + strb lr, [sp, #1] + strh r3, [sp, #2] + str r2, [sp, #4] + bl SOC_Connect + cmp r0, #0 + bge _02223214 + ldr r0, [r4, #4] + add sp, sp, #8 + cmp r0, #0 + ldrne r0, _02223220 ; =0xFFFFFC16 + mvneq r0, #0x3e8 + ldmia sp!, {r3, r4, r5, pc} +_02223214: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02223220: .word 0xFFFFFC16 + arm_func_end ov38_022231A8 + + arm_func_start ov38_02223224 +ov38_02223224: ; 0x02223224 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, [sp, #8] + bl SOC_Recv + cmp r0, #0 + ldmgeia sp!, {r4, pc} + ldr r1, [r4, #4] + cmp r1, #0 + ldrne r0, _0222326C ; =0xFFFFFC16 + ldmneia sp!, {r4, pc} + mvn r1, #0x37 + cmp r0, r1 + moveq r0, #0 + mvnne r0, #0x3e8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222326C: .word 0xFFFFFC16 + arm_func_end ov38_02223224 + + arm_func_start ov38_02223270 +ov38_02223270: ; 0x02223270 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, [sp, #8] + bl SOC_Send + cmp r0, #0 + ldmgeia sp!, {r4, pc} + ldr r1, [r4, #4] + cmp r1, #0 + ldrne r0, _022232B8 ; =0xFFFFFC16 + ldmneia sp!, {r4, pc} + mvn r1, #0x37 + cmp r0, r1 + moveq r0, #0 + mvnne r0, #0x3e8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022232B8: .word 0xFFFFFC16 + arm_func_end ov38_02223270 + + arm_func_start ov38_022232BC +ov38_022232BC: ; 0x022232BC + stmdb sp!, {r3, lr} + cmp r1, #0 + ldmltia sp!, {r3, pc} + mov r0, r1 + mov r1, #2 + bl SOC_Shutdown + ldmia sp!, {r3, pc} + arm_func_end ov38_022232BC + + arm_func_start ov38_022232D8 +ov38_022232D8: ; 0x022232D8 + ldr ip, _022232E0 ; =STD_CompareString + bx ip + .balign 4, 0 +_022232E0: .word STD_CompareString + arm_func_end ov38_022232D8 + + arm_func_start ov38_022232E4 +ov38_022232E4: ; 0x022232E4 + cmp r2, #0 + ble _02223344 +_022232EC: + ldrsb ip, [r0], #1 + ldrsb r3, [r1], #1 + cmp ip, #0 + cmpne r3, #0 + bne _02223310 + cmp ip, #0 + cmpeq r3, #0 + moveq r2, #0 + b _02223344 +_02223310: + cmp r3, #0x41 + blt _02223320 + cmp r3, #0x5a + addle r3, r3, #0x20 +_02223320: + cmp ip, #0x41 + blt _02223330 + cmp ip, #0x5a + addle ip, ip, #0x20 +_02223330: + cmp ip, r3 + bne _02223344 + sub r2, r2, #1 + cmp r2, #0 + bgt _022232EC +_02223344: + mov r0, r2 + bx lr + arm_func_end ov38_022232E4 + + arm_func_start ov38_0222334C +ov38_0222334C: ; 0x0222334C + ldr ip, _02223354 ; =STD_GetStringLength + bx ip + .balign 4, 0 +_02223354: .word STD_GetStringLength + arm_func_end ov38_0222334C + + arm_func_start ov38_02223358 +ov38_02223358: ; 0x02223358 + ldr ip, _02223368 ; =MI_CpuFill8 + mov r2, r1 + mov r1, #0 + bx ip + .balign 4, 0 +_02223368: .word MI_CpuFill8 + arm_func_end ov38_02223358 + + arm_func_start ov38_0222336C +ov38_0222336C: ; 0x0222336C + ldr ip, _02223380 ; =MI_CpuCopy8 + mov r3, r0 + mov r0, r1 + mov r1, r3 + bx ip + .balign 4, 0 +_02223380: .word MI_CpuCopy8 + arm_func_end ov38_0222336C + + arm_func_start ov38_02223384 +ov38_02223384: ; 0x02223384 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0 + mov r4, r1 + str r0, [r5] + str r0, [r4] + bl ov38_02222038 + ldr r1, _0222341C ; =ov38_02226220 + ldr r2, [r1] + cmp r2, #0 + beq _022233FC + ldr r0, [r2, #0xc] + ldr r0, [r0, #0x14] + cmp r0, #0 + beq _022233F4 + ldr r2, [r2, #0xc] + mvn r0, #0 + ldr r2, [r2, #0x30] + ldr r2, [r2, #4] + str r2, [r5] + ldr r2, [r1] + ldr r1, [r2, #0xc] + ldr r1, [r1, #0x14] + cmp r1, r0 + moveq r0, #0 + ldrne r0, [r2, #0xc] + ldrne r0, [r0, #0x14] + str r0, [r4] +_022233F4: + mov r4, #1 + b _02223410 +_022233FC: + ldr r0, _02223420 ; =ov38_02226230 + ldr r0, [r0] + cmp r0, #0 + movne r4, #1 + moveq r4, #0 +_02223410: + bl ov38_0222204C + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222341C: .word ov38_02226220 +_02223420: .word ov38_02226230 + arm_func_end ov38_02223384 + + arm_func_start ov38_02223424 +ov38_02223424: ; 0x02223424 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r5, [sp, #0x28] + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r7, r3 + cmp r5, #0 + ble _022234CC + ldr r4, _022234D4 ; =ov38_02226C58 + mov fp, #0 +_0222344C: + ldr r0, [sl, #4] + cmp r0, #0 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r8] + mov r1, r7 + rsb r6, r0, #0x400 + cmp r5, r6 + movle r6, r5 + mov r2, r6 + add r0, r4, r0 + bl ov38_0222336C + ldr r0, [r8] + add r7, r7, r6 + add r0, r0, r6 + str r0, [r8] + cmp r0, #0x400 + sub r5, r5, r6 + bne _022234C4 + mov r0, sl + mov r1, sb + mov r2, r4 + mov r3, #0x400 + str fp, [sp] + bl ov38_02223270 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r8] + sub r0, r1, r0 + str r0, [r8] +_022234C4: + cmp r5, #0 + bgt _0222344C +_022234CC: + ldr r0, [sp, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022234D4: .word ov38_02226C58 + arm_func_end ov38_02223424 + + arm_func_start ov38_022234D8 +ov38_022234D8: ; 0x022234D8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + mov r8, #0 + mov sl, r0 + mov sb, r1 + mov r7, r8 + strb r8, [sp, #4] + strb r8, [sp, #5] + mov r6, r8 + mov r5, #1 + add r4, sp, #4 + b _02223534 +_02223508: + mov r0, sl + mov r1, sb + mov r3, r5 + add r2, r4, r2 + str r6, [sp] + bl ov38_02223224 + cmp r0, #0 + addle sp, sp, #8 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + add r8, r8, r0 + add r7, r7, #1 +_02223534: + and r2, r7, #1 + ldrsb r0, [r4, r2] + cmp r0, #0xd + bne _02223508 + sub r0, r7, #1 + and r0, r0, #1 + ldrsb r0, [r4, r0] + cmp r0, #0xa + bne _02223508 + mov r0, r8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov38_022234D8 + + arm_func_start ov38_02223564 +ov38_02223564: ; 0x02223564 + stmdb sp!, {r4, lr} + movs r4, r0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0x800] + cmp r0, #0 + beq _02223588 + ldr r1, _0222359C ; =ov38_0222621C + ldr r1, [r1] + blx r1 +_02223588: + ldr r1, _0222359C ; =ov38_0222621C + mov r0, r4 + ldr r1, [r1] + blx r1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0222359C: .word ov38_0222621C + arm_func_end ov38_02223564 + + arm_func_start ov38_022235A0 +ov38_022235A0: ; 0x022235A0 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _02223634 ; =ov38_02226C10 + mov r6, r0 + ldmia r2, {r0, r2} + add r0, r0, #1 + and r4, r0, #7 + mov r5, r1 + cmp r4, r2 + bne _022235FC + ldr r1, _02223638 ; =ov38_02226C18 + mov r0, #0 + ldr r1, [r1, r2, lsl #3] + bl ov38_0222316C + ldr r0, _02223634 ; =ov38_02226C10 + ldr r1, _0222363C ; =ov38_02226C1C + ldr r0, [r0, #4] + ldr r0, [r1, r0, lsl #3] + bl ov38_02223564 + ldr r0, _02223634 ; =ov38_02226C10 + ldr r1, [r0, #4] + add r1, r1, #1 + and r1, r1, #7 + str r1, [r0, #4] +_022235FC: + ldr r0, [r5] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _02223634 ; =ov38_02226C10 + ldr r1, _02223638 ; =ov38_02226C18 + ldr ip, [r0] + ldr r2, _0222363C ; =ov38_02226C1C + str r6, [r1, ip, lsl #3] + ldr r3, [r5] + mov r1, #0 + str r3, [r2, ip, lsl #3] + str r1, [r5] + str r4, [r0] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02223634: .word ov38_02226C10 +_02223638: .word ov38_02226C18 +_0222363C: .word ov38_02226C1C + arm_func_end ov38_022235A0 + + arm_func_start ov38_02223640 +ov38_02223640: ; 0x02223640 + stmdb sp!, {r4, r5, r6, lr} + ldr r6, _02223698 ; =ov38_02226C10 + ldmia r6, {r0, r1} + cmp r0, r1 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r4, _0222369C ; =ov38_02226C18 + mov r5, #0 +_0222365C: + ldr r1, [r4, r1, lsl #3] + mov r0, r5 + bl ov38_0222316C + ldr r0, [r6, #4] + add r0, r4, r0, lsl #3 + ldr r0, [r0, #4] + bl ov38_02223564 + ldr r0, [r6, #4] + add r0, r0, #1 + and r1, r0, #7 + str r1, [r6, #4] + ldr r0, [r6] + cmp r0, r1 + bne _0222365C + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02223698: .word ov38_02226C10 +_0222369C: .word ov38_02226C18 + arm_func_end ov38_02223640 + + arm_func_start ov38_022236A0 +ov38_022236A0: ; 0x022236A0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x4c + ldr r2, _022245C0 ; =ov38_02226C10 + mov r0, #0 + str r0, [sp, #0x3c] + str r0, [r2] + ldr r1, _022245C4 ; =ov38_02226224 + mvn r6, #0 + str r0, [r2, #4] + ldr r1, [r1] + str r0, [sp, #0x10] + str r6, [sp, #0x18] + str r6, [sp, #0x14] + str r0, [sp, #8] + str r0, [sp, #0xc] + cmp r1, #0 + bne _02224970 +_022236E4: + bl ov38_02222038 + bl ov38_02222008 + cmp r0, #0 + mvneq r4, #0 + beq _02223708 + ldr r4, [r0, #8] + ldr r8, [r0, #0xc] + ldr r1, _022245C8 ; =ov38_02226220 + str r0, [r1] +_02223708: + bl ov38_0222204C + cmp r4, #0 + bge _0222371C + bl ov38_02222100 + b _02224960 +_0222371C: + ldr r0, [r8, #4] + ldr sb, [r8, #0x30] + cmp r0, #0 + bne _02224890 + mov r0, r8 + bl ov38_02222D6C + str r0, [sp, #0x1c] + cmp r0, #0 + moveq r0, #4 + streq r0, [sp, #4] + beq _02224890 + mov r1, r0 + ldr r0, [sp, #0x18] + mov r2, #0 + cmp r1, r0 + ldreq r1, [r8, #0x28] + ldreq r0, [sp, #0x14] + add r5, sp, #0x38 + cmpeq r1, r0 + ldreq r1, [r8, #8] + ldreq r0, [sp, #0xc] + add r4, sp, #0x40 + cmpeq r1, r0 + ldr r0, [r8, #0x28] + moveq r2, #1 + str r0, [sp, #0x14] + ldr r0, [r8, #8] + str r0, [sp, #0xc] + ldr r0, [sp, #0x1c] + str r0, [sp, #0x18] + ldr r0, [sp, #8] + and r0, r0, r2 + str r0, [sp, #8] + mvn r0, #0 + str r0, [sp, #0x20] +_022237A8: + mov r0, #0 + cmp r6, #0 + str r0, [sp, #4] + blt _022237F8 + mov r0, #9 + strh r0, [sp, #0x2c] + ldr r2, _022245CC ; =0x0000CC8D + add r0, sp, #0x28 + mov r1, #1 + mov r3, #0 + str r6, [sp, #0x28] + bl SOC_Poll + cmp r0, #0 + movle r0, #0 + strle r0, [sp, #8] + ble _022237F8 + ldrsh r0, [sp, #0x2e] + tst r0, #0xe0 + movne r0, #0 + strne r0, [sp, #8] +_022237F8: + ldr r0, [sp, #8] + cmp r0, #0 + bne _022238C0 + cmp r6, #0 + blt _02223840 + mov r0, r8 + mov r1, r6 + bl ov38_0222315C + cmp r0, #0 + movlt r0, #0xa + strlt r0, [sp, #4] + mov r0, r6 + add r1, sp, #0x3c + bl ov38_022235A0 + ldr r0, [sp, #4] + ldr r6, [sp, #0x20] + cmp r0, #0 + bne _02224890 +_02223840: + mov r0, r8 + bl ov38_022230DC + movs r6, r0 + movmi r0, #3 + strmi r0, [sp, #4] + bmi _02224890 + ldr r0, [r8, #8] + cmp r0, #0 + beq _02223874 + ldr r0, [r8, #0x20] + str r0, [sp, #0x3c] + mov r0, #0 + str r0, [r8, #0x20] +_02223874: + bl ov38_02222038 + ldr r0, _022245C8 ; =ov38_02226220 + ldr r0, [r0] + str r6, [r0, #0x10] + bl ov38_0222204C + ldr r0, [r8, #4] + cmp r0, #0 + bne _02224890 + ldr r2, [sp, #0x1c] + ldr r3, [r8, #0x28] + mov r0, r8 + mov r1, r6 + bl ov38_022231A8 + cmp r0, #0 + movge r0, #1 + strge r0, [sp, #8] + movlt r0, #0 + strlt r0, [sp, #8] + b _022238F4 +_022238C0: + ldr r0, [r8, #8] + cmp r0, #0 + beq _022238DC + ldr r0, [r8, #0x20] + bl ov38_02223564 + mov r0, #0 + str r0, [r8, #0x20] +_022238DC: + bl ov38_022230BC + bl ov38_02222038 + ldr r0, _022245C8 ; =ov38_02226220 + ldr r0, [r0] + str r6, [r0, #0x10] + bl ov38_0222204C +_022238F4: + ldr r0, [r8, #4] + cmp r0, #0 + bne _02224890 + ldr r0, [sp, #8] + cmp r0, #0 + moveq r0, #5 + streq r0, [sp, #4] + beq _02224890 + mov r0, #0 + str r0, [sp, #0x38] + str r0, [sp, #8] + ldr r0, [r8, #0x24] + bl ov38_0222334C + mov r7, r0 + mov r0, #0xa + str r0, [sp, #4] + ldr r0, [r8, #0x40] + cmp r0, #0 + beq _02223954 + cmp r0, #1 + beq _02223980 + cmp r0, #2 + beq _022239AC + b _022239D4 +_02223954: + mov r0, #4 + str r0, [sp] + ldr r3, _022245D0 ; =ov38_02225EF4 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + b _022239D4 +_02223980: + mov r0, #5 + str r0, [sp] + ldr r3, _022245D4 ; =ov38_02225EFC + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + b _022239D4 +_022239AC: + mov r0, #5 + str r0, [sp] + ldr r3, _022245D8 ; =ov38_02225F04 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_022239D4: + ldr sl, [r8, #0x10] + cmp r7, sl + ble _02223A14 + subs r0, r7, sl + beq _02223A3C + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r8, #0x24] + add r3, r3, sl + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + b _02223A3C +_02223A14: + mov r0, #1 + str r0, [sp] + ldr r3, _022245DC ; =ov38_02225F0C + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223A3C: + mov r0, #0xb + str r0, [sp] + ldr r3, _022245E0 ; =ov38_02225F10 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r8, #8] + ldr r3, _022245E4 ; =ov38_02225F1C + cmp r0, #0 + movne r0, #8 + moveq r0, #7 + str r0, [sp, #0x34] + mov r0, #6 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r7, [sp, #0x34] + ldr r0, [r8, #0xc] + subs r0, r0, r7 + beq _02223AD8 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r8, #0x24] + add r3, r3, r7 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223AD8: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + add r0, r8, #0x34 + bl ov38_02221C60 + movs r7, r0 + beq _02223BE8 +_02223B10: + ldr r0, [r7, #8] + bl ov38_0222334C + cmp r0, #0 + beq _02223B44 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r7, #8] + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223B44: + mov r0, #2 + str r0, [sp] + ldr r3, _022245EC ; =ov38_02225F28 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r7, #0xc] + bl ov38_0222334C + cmp r0, #0 + beq _02223BA0 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r7, #0xc] + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223BA0: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r1, _022245F0 ; =ov38_0222621C + mov r0, r7 + ldr r1, [r1] + blx r1 + add r0, r8, #0x34 + bl ov38_02221C60 + movs r7, r0 + bne _02223B10 +_02223BE8: + ldr r0, [r8, #0x40] + cmp r0, #1 + bne _02223E08 + ldr sl, [r8, #0x38] + mov r7, #0 + mov r0, r7 + str r0, [sp, #0x10] + cmp sl, #0 + mov r1, sl + beq _02223C38 +_02223C10: + ldr r0, [r1, #0x14] + cmp r0, #0 + movne r0, #1 + strne r0, [sp, #0x10] + bne _02223C38 + ldr r0, [sl] + cmp r1, r0 + ldrne r1, [r1, #4] + cmpne r1, #0 + bne _02223C10 +_02223C38: + ldr r0, [sp, #0x10] + cmp r0, #0 + beq _02223D14 + cmp sl, #0 + beq _02223C94 +_02223C4C: + ldr r0, [sl, #8] + add r7, r7, #0x16 + bl ov38_0222334C + add r0, r0, #0x29 + add r7, r7, r0 + ldr r0, [sl, #0x14] + ldr r1, [sl, #0x10] + cmp r0, #0 + ldr r0, [r8, #0x38] + addne r7, r7, #0x4b + ldr r0, [r0] + add r2, r7, #2 + cmp sl, r0 + ldrne sl, [sl, #4] + add r1, r2, r1 + add r7, r1, #2 + cmpne sl, #0 + bne _02223C4C +_02223C94: + mov r0, #0x2c + str r0, [sp] + ldr r3, _022245F4 ; =ov38_02225F2C + mov r0, r8 + mov r1, r6 + mov r2, r5 + add r7, r7, #0x18 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r0, #0x12 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + add r3, r8, #0x46 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + b _02223D7C +_02223D14: + cmp sl, #0 + beq _02223D54 +_02223D1C: + ldr r0, [sl, #8] + bl ov38_022249A0 + add r0, r7, r0 + add r7, r0, #1 + ldr r0, [sl, #0xc] + bl ov38_022249A0 + add r7, r7, r0 + ldr r0, [r8, #0x38] + ldr r0, [r0] + cmp sl, r0 + ldrne sl, [sl, #4] + addne r7, r7, #1 + cmpne sl, #0 + bne _02223D1C +_02223D54: + mov r0, #0x31 + str r0, [sp] + ldr r3, _022245F8 ; =ov38_02225F5C + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223D7C: + mov r0, #0x10 + str r0, [sp] + ldr r3, _022245FC ; =ov38_02225F90 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r1, r7 + mov r0, r4 + bl ov38_02224C18 + str r0, [sp, #0x34] + cmp r0, #0 + beq _02223DE0 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223DE0: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223E08: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r8, #0x40] + cmp r0, #1 + bne _02224188 + ldr r0, [sp, #0x10] + cmp r0, #0 + beq _02224048 + ldr r7, [r8, #0x38] + cmp r7, #0 + beq _02223FF4 +_02223E54: + mov r0, #0x14 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + add r3, r8, #0x44 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r0, #0x26 + str r0, [sp] + ldr r3, _02224600 ; =ov38_02224F8C + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r7, #8] + bl ov38_0222334C + cmp r0, #0 + beq _02223F00 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r7, #8] + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223F00: + mov r0, #3 + str r0, [sp] + ldr r3, _02224604 ; =ov38_02225FA4 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r7, #0x14] + cmp r0, #0 + beq _02223F5C + mov r0, #0x4b + str r0, [sp] + ldr r3, _02224608 ; =ov38_02224FB4 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223F5C: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r7, #0x10] + cmp r0, #0 + beq _02223FB4 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + ldr r3, [r7, #0xc] + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02223FB4: + mov r0, #2 + str r0, [sp] + ldr r3, _022245E8 ; =ov38_02225F24 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r0, [r8, #0x38] + ldr r0, [r0] + cmp r7, r0 + ldrne r7, [r7, #4] + cmpne r7, #0 + bne _02223E54 +_02223FF4: + mov r0, #0x14 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + add r3, r8, #0x44 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + mov r0, #4 + str r0, [sp] + ldr r3, _0222460C ; =ov38_02225FA8 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + b _02224188 +_02224048: + ldr sl, [r8, #0x38] + cmp sl, #0 + beq _02224188 +_02224054: + ldr r1, [sl, #8] + mov r7, #0 + ldrsb r0, [r1] + cmp r0, #0 + beq _022240B8 +_02224068: + ldrsb r1, [r1, r7] + mov r0, r4 + bl ov38_02224A08 + str r0, [sp, #0x34] + cmp r0, #0 + beq _022240A4 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_022240A4: + add r7, r7, #1 + ldr r1, [sl, #8] + ldrsb r0, [r1, r7] + cmp r0, #0 + bne _02224068 +_022240B8: + mov r0, #1 + str r0, [sp] + ldr r3, _02224610 ; =ov38_02225FB0 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr r1, [sl, #0xc] + mov r7, #0 + ldrsb r0, [r1] + cmp r0, #0 + beq _02224144 +_022240F4: + ldrsb r1, [r1, r7] + mov r0, r4 + bl ov38_02224A08 + str r0, [sp, #0x34] + cmp r0, #0 + beq _02224130 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_02224130: + add r7, r7, #1 + ldr r1, [sl, #0xc] + ldrsb r0, [r1, r7] + cmp r0, #0 + bne _022240F4 +_02224144: + ldr r0, [r8, #0x38] + ldr r0, [r0] + cmp sl, r0 + beq _02224188 + mov r0, #1 + str r0, [sp] + ldr r3, _02224614 ; =ov38_02225FB4 + mov r0, r8 + mov r1, r6 + mov r2, r5 + bl ov38_02223424 + cmp r0, #0 + blt _02224890 + beq _022237A8 + ldr sl, [sl, #4] + cmp sl, #0 + bne _02224054 +_02224188: + ldr r3, [sp, #0x38] + cmp r3, #0 + ble _022241B8 + mov r0, #0 + str r0, [sp] + ldr r2, _02224618 ; =ov38_02226C58 + mov r0, r8 + mov r1, r6 + bl ov38_02223270 + cmp r0, #0 + blt _02224890 + beq _022237A8 +_022241B8: + mov r0, #0 + str r0, [sb] + strb r0, [sp, #0x40] + strb r0, [sp, #0x41] + mov r1, #7 + strb r0, [sp, #0x42] + strb r0, [sp, #0x43] + ldr r5, [sb, #0x1c] + str r1, [sp, #4] + str r0, [sp, #0x38] + add sl, sb, #0x20 + add r4, sp, #0x40 +_022241E8: + ldr r1, [r8, #4] + cmp r1, #0 + bne _02224890 + cmp r0, #0x400 + bge _02224230 + add r2, sl, r0 + mov r0, #0 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r3, #1 + bl ov38_02223224 + ldr r3, [sp, #0x38] + add r1, sb, r3 + ldrsb r2, [r1, #0x20] + and r1, r3, #3 + strb r2, [r4, r1] + b _022242C4 +_02224230: + ldr r1, _0222461C ; =0x000001FF + ands r7, r0, r1 + bne _02224290 + cmp r5, #0 + mov r0, #0x204 + mov r1, #4 + beq _02224264 + ldr r2, _02224620 ; =ov38_02226218 + ldr r2, [r2] + blx r2 + str r0, [r5] + mov r5, r0 + b _02224278 +_02224264: + ldr r2, _02224620 ; =ov38_02226218 + ldr r2, [r2] + blx r2 + mov r5, r0 + str r5, [sb, #0x1c] +_02224278: + cmp r5, #0 + moveq r0, #1 + streq r0, [sp, #4] + beq _02224890 + mov r0, #0 + str r0, [r5] +_02224290: + mov r0, #0 + add r2, r5, #4 + str r0, [sp] + mov r0, r8 + mov r1, r6 + add r2, r2, r7 + mov r3, #1 + bl ov38_02223224 + add r1, r5, r7 + ldrsb r2, [r1, #4] + ldr r1, [sp, #0x38] + and r1, r1, #3 + strb r2, [r4, r1] +_022242C4: + cmp r0, #0 + movle r0, #0xa + strle r0, [sp, #4] + ble _02224890 + ldr r1, [sp, #0x38] + add r0, r1, r0 + str r0, [sp, #0x38] + sub r1, r0, #4 + and r1, r1, #3 + ldrsb r1, [r4, r1] + cmp r1, #0xd + bne _022241E8 + sub r1, r0, #3 + and r1, r1, #3 + ldrsb r1, [r4, r1] + cmp r1, #0xa + bne _022241E8 + sub r1, r0, #2 + and r1, r1, #3 + ldrsb r1, [r4, r1] + cmp r1, #0xd + bne _022241E8 + sub r1, r0, #1 + and r1, r1, #3 + ldrsb r1, [r4, r1] + cmp r1, #0xa + bne _022241E8 + str r0, [sb] + ldr r0, [sb] + cmp r0, #0 + beq _02224890 + ldr r1, _02224618 ; =ov38_02226C58 + mov r0, sb + mov r2, #0 + mov r3, #0xe + bl ov38_02222420 + cmp r0, #0 + beq _02224890 + ldr r0, _02224618 ; =ov38_02226C58 + ldr r1, _02224624 ; =ov38_02225FB8 + mov r2, #5 + bl ov38_022232E4 + cmp r0, #0 + ldreq r0, _02224618 ; =ov38_02226C58 + ldreqsb r0, [r0, #8] + cmpeq r0, #0x20 + bne _02224890 + ldr r0, _02224628 ; =ov38_02226C61 + mov r1, #3 + bl ov38_02224B80 + cmp r0, #0 + blt _02224890 + ldr r2, [sb] + add r3, sp, #0x30 + mov r0, sb + mov r1, #0xc + bl ov38_02222210 + cmp r0, #0 + blt _02224890 + ldr r1, _0222462C ; =ov38_02225FC0 + add r2, sp, #0x34 + mov r0, sb + bl ov38_02222E7C + movs r5, r0 + moveq r0, #0 + streq r0, [sp, #4] + beq _02224890 + cmp r5, #0x400 + bgt _02224890 + cmp r5, #0 + ble _02224418 + ldr r2, [sp, #0x34] + ldr r1, _02224618 ; =ov38_02226C58 + mov r0, sb + mov r3, r5 + bl ov38_02222420 + cmp r0, #0 + beq _02224890 + ldr r0, _02224618 ; =ov38_02226C58 + mov r1, r5 + bl ov38_02224B80 + movs r5, r0 + bmi _02224890 + str r5, [r8, #0x14] + b _02224420 +_02224418: + mvn r0, #0 + str r0, [r8, #0x14] +_02224420: + ldr r1, _02224630 ; =ov38_02225FD0 + add r2, sp, #0x34 + mov r0, sb + bl ov38_02222E7C + str r0, [sp, #8] + cmp r0, #0 + beq _02224890 + bge _02224480 + ldr r0, _02224618 ; =ov38_02226C58 + mov r2, #0 + ldrsb r1, [r0, #5] + ldrsb r3, [r0, #7] + add r0, sp, #0x24 + strb r1, [sp, #0x24] + mov r1, #2 + strb r3, [sp, #0x25] + strb r2, [sp, #0x26] + bl ov38_02224B80 + cmp r0, #0xb + movge r0, #1 + strge r0, [sp, #8] + movlt r0, #0 + strlt r0, [sp, #8] + b _022244C0 +_02224480: + cmp r0, #0x400 + mov r0, #0 + strgt r0, [sp, #8] + bgt _022244C0 + ldr r1, [sp, #0x34] + ldr r2, [sp, #8] + str r0, [sp] + ldr r3, _02224634 ; =ov38_02225FDC + mov r0, sb + add r2, r1, r2 + bl ov38_02222350 + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #8] + movne r0, #0 + strne r0, [sp, #8] +_022244C0: + ldr r1, _02224638 ; =ov38_02225FE8 + add r2, sp, #0x34 + mov r0, sb + bl ov38_02222E7C + cmp r0, #0 + beq _02224890 + cmp r0, #0x400 + movgt r1, #0 + bgt _0222451C + cmp r0, #0 + ble _02224518 + ldr r1, [sp, #0x34] + ldr r3, _0222463C ; =ov38_02225FFC + add r2, r1, r0 + mov r0, #0x3b + str r0, [sp] + mov r0, sb + bl ov38_02222350 + cmp r0, #0 + moveq r1, #1 + movne r1, #0 + b _0222451C +_02224518: + mov r1, #0 +_0222451C: + ldr r0, [r8, #0x40] + cmp r0, #2 + beq _02224890 + cmp r5, #0 + blt _02224640 + mov r4, #0 + b _0222456C +_02224538: + str r4, [sp] + ldr r2, [sb, #4] + mov r0, r8 + mov r1, r6 + mov r3, r5 + bl ov38_02222548 + cmp r0, #0 + blt _02224890 + beq _02224588 + ldr r1, [sb, #4] + sub r5, r5, r0 + add r0, r1, r0 + str r0, [sb, #4] +_0222456C: + cmp r5, #0 + ble _02224588 + ldr r1, [sb, #4] + mov r0, sb + bl ov38_0222250C + cmp r0, #0 + beq _02224538 +_02224588: + cmp r5, #0 + beq _022245B4 + ldr r1, [sb, #4] + mov r0, sb + bl ov38_0222250C + cmp r0, #0 + movne r0, #6 + strne r0, [sp, #4] + moveq r0, #0xa + streq r0, [sp, #4] + b _02224890 +_022245B4: + mov r0, #0 + str r0, [sp, #4] + b _02224890 + .balign 4, 0 +_022245C0: .word ov38_02226C10 +_022245C4: .word ov38_02226224 +_022245C8: .word ov38_02226220 +_022245CC: .word 0x0000CC8D +_022245D0: .word ov38_02225EF4 +_022245D4: .word ov38_02225EFC +_022245D8: .word ov38_02225F04 +_022245DC: .word ov38_02225F0C +_022245E0: .word ov38_02225F10 +_022245E4: .word ov38_02225F1C +_022245E8: .word ov38_02225F24 +_022245EC: .word ov38_02225F28 +_022245F0: .word ov38_0222621C +_022245F4: .word ov38_02225F2C +_022245F8: .word ov38_02225F5C +_022245FC: .word ov38_02225F90 +_02224600: .word ov38_02224F8C +_02224604: .word ov38_02225FA4 +_02224608: .word ov38_02224FB4 +_0222460C: .word ov38_02225FA8 +_02224610: .word ov38_02225FB0 +_02224614: .word ov38_02225FB4 +_02224618: .word ov38_02226C58 +_0222461C: .word 0x000001FF +_02224620: .word ov38_02226218 +_02224624: .word ov38_02225FB8 +_02224628: .word ov38_02226C61 +_0222462C: .word ov38_02225FC0 +_02224630: .word ov38_02225FD0 +_02224634: .word ov38_02225FDC +_02224638: .word ov38_02225FE8 +_0222463C: .word ov38_02225FFC +_02224640: + mov r0, #0xa + cmp r1, #0 + str r0, [sp, #4] + beq _022247E4 + mov r7, #0 + ldr r5, _02224618 ; =ov38_02226C58 + add r4, sp, #0x40 + mov sl, r7 +_02224660: + mov r0, #0 + strb r0, [sp, #0x40] + strb r0, [sp, #0x41] + str r0, [sp, #0x38] +_02224670: + str r7, [sp] + ldr r2, [sp, #0x38] + mov r0, r8 + mov r1, r6 + mov r3, #1 + add r2, r5, r2 + bl ov38_02223224 + cmp r0, #0 + blt _02224890 + ldr r1, [sp, #0x38] + ldrsb r0, [r5, r1] + and r2, r1, #1 + strb r0, [r4, r2] + cmp r0, #0x3b + beq _022246C8 + cmp r0, #0xa + bne _02224710 + sub r2, r1, #1 + and r2, r2, #1 + ldrsb r2, [r4, r2] + cmp r2, #0xd + bne _02224710 +_022246C8: + cmp r0, #0xa + subeq r0, r1, #1 + streq r0, [sp, #0x34] + beq _022246F0 + str r1, [sp, #0x34] + mov r0, r8 + mov r1, r6 + bl ov38_022234D8 + cmp r0, #0 + ble _02224890 +_022246F0: + ldr r1, [sp, #0x34] + cmp r1, #0 + beq _02224890 + mov r0, r5 + bl ov38_02224A98 + movs fp, r0 + bmi _02224890 + b _02224724 +_02224710: + ldr r0, [sp, #0x38] + add r0, r0, #1 + str r0, [sp, #0x38] + cmp r0, #0x400 + blt _02224670 +_02224724: + ldr r0, [sp, #0x38] + cmp r0, #0x400 + moveq r0, #7 + streq r0, [sp, #4] + beq _02224890 + cmp fp, #0 + ble _022247CC + ble _02224660 +_02224744: + str sl, [sp] + mov r0, r8 + mov r1, r6 + ldr r2, [sb, #4] + mov r3, fp + bl ov38_02222548 + cmp r0, #0 + ble _02224890 + ldr r1, [sb, #4] + subs fp, fp, r0 + add r0, r1, r0 + str r0, [sb, #4] + bne _022247C0 + mov r0, #0 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + mov r3, #1 + bl ov38_02223224 + cmp r0, #0 + ble _02224890 + mov r0, #0 + str r0, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r5 + mov r3, #1 + bl ov38_02223224 + cmp r0, #0 + ble _02224890 +_022247C0: + cmp fp, #0 + bgt _02224744 + b _02224660 +_022247CC: + mov r0, r8 + mov r1, r6 + bl ov38_022234D8 + mov r0, #0 + str r0, [sp, #4] + b _02224890 +_022247E4: + ldr r1, [sb, #4] + mov r0, sb + bl ov38_0222250C + cmp r0, #0 + bne _02224890 + mov r5, #0 + ldr r4, _02224618 ; =ov38_02226C58 + mov sl, #1 + mov r7, r5 +_02224808: + mov r0, r8 + mov r1, r6 + ldr r2, [sb, #4] + mov r3, r7 + bl ov38_02222520 + cmp r0, #0 + blt _02224890 + moveq r0, #0 + streq r0, [sp, #4] + beq _02224890 + ldr r1, [sb, #4] + add r0, r1, r0 + str r0, [sb, #4] + mov r0, sb + ldr r1, [sb, #4] + bl ov38_0222250C + cmp r0, #0 + beq _0222487C + str r5, [sp] + mov r0, r8 + mov r1, r6 + mov r2, r4 + mov r3, sl + bl ov38_02223224 + cmp r0, #0 + blt _02224890 + movne r0, #6 + strne r0, [sp, #4] + bne _02224890 +_0222487C: + mov r0, sb + ldr r1, [sb, #4] + bl ov38_0222250C + cmp r0, #0 + beq _02224808 +_02224890: + bl ov38_02222038 + ldr r0, _022245C8 ; =ov38_02226220 + ldr r1, _022245F0 ; =ov38_0222621C + ldr r0, [r0] + ldr r1, [r1] + blx r1 + ldr r0, _022245C8 ; =ov38_02226220 + mov r1, #0 + str r1, [r0] + bl ov38_0222204C + ldr r0, [r8, #4] + cmp r0, #0 + movne r0, #8 + strne r0, [sp, #4] + cmp r6, #0 + blt _02224918 + ldr r0, [sp, #8] + cmp r0, #0 + beq _022248E8 + ldr r0, [sp, #4] + cmp r0, #0 + beq _02224918 +_022248E8: + mov r0, r8 + mov r1, r6 + bl ov38_0222315C + cmp r0, #0 + movlt r0, #0xa + strlt r0, [sp, #4] + add r1, sp, #0x3c + mov r0, r6 + bl ov38_022235A0 + mov r0, #0 + mvn r6, #0 + str r0, [sp, #8] +_02224918: + ldr r0, [sp, #4] + cmp r0, #0 + moveq r0, #1 + streq r0, [sb, #8] + beq _02224940 + mov r0, #0 + str r0, [sb, #8] + ldr r1, _0222499C ; =ov38_02226214 + ldr r0, [sp, #4] + str r0, [r1] +_02224940: + ldr r4, [r8, #0x2c] + mov r0, r8 + ldr r5, [r8, #0x3c] + bl ov38_02222B98 + ldr r0, [sp, #4] + mov r1, sb + mov r2, r4 + blx r5 +_02224960: + ldr r0, _022245C4 ; =ov38_02226224 + ldr r0, [r0] + cmp r0, #0 + beq _022236E4 +_02224970: + cmp r6, #0 + blt _02224990 + mov r0, r8 + mov r1, r6 + bl ov38_0222315C + add r1, sp, #0x3c + mov r0, r6 + bl ov38_022235A0 +_02224990: + bl ov38_02223640 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0222499C: .word ov38_02226214 + arm_func_end ov38_022236A0 + + arm_func_start ov38_022249A0 +ov38_022249A0: ; 0x022249A0 + ldrsb r2, [r0], #1 + mov r1, #0 + cmp r2, #0 + beq _02224A00 +_022249B0: + cmp r2, #0x30 + blt _022249C0 + cmp r2, #0x39 + ble _022249E8 +_022249C0: + cmp r2, #0x41 + blt _022249D0 + cmp r2, #0x5a + ble _022249E8 +_022249D0: + cmp r2, #0x61 + blt _022249E0 + cmp r2, #0x7a + ble _022249E8 +_022249E0: + cmp r2, #0x20 + bne _022249F0 +_022249E8: + add r1, r1, #1 + b _022249F4 +_022249F0: + add r1, r1, #3 +_022249F4: + ldrsb r2, [r0], #1 + cmp r2, #0 + bne _022249B0 +_02224A00: + mov r0, r1 + bx lr + arm_func_end ov38_022249A0 + + arm_func_start ov38_02224A08 +ov38_02224A08: ; 0x02224A08 + cmp r1, #0x20 + bne _02224A20 + mov r1, #0x2b + strb r1, [r0] + mov r0, #1 + bx lr +_02224A20: + cmp r1, #0x30 + blt _02224A30 + cmp r1, #0x39 + ble _02224A50 +_02224A30: + cmp r1, #0x41 + blt _02224A40 + cmp r1, #0x5a + ble _02224A50 +_02224A40: + cmp r1, #0x61 + blt _02224A5C + cmp r1, #0x7a + bgt _02224A5C +_02224A50: + strb r1, [r0] + mov r0, #1 + bx lr +_02224A5C: + mov r2, r1, asr #4 + and r3, r2, #0xf + mov r2, #0x25 + strb r2, [r0] + cmp r3, #0xa + addlt r2, r3, #0x30 + addge r2, r3, #0x37 + and r1, r1, #0xf + cmp r1, #0xa + addlt r1, r1, #0x30 + strb r2, [r0, #1] + addge r1, r1, #0x37 + strb r1, [r0, #2] + mov r0, #3 + bx lr + arm_func_end ov38_02224A08 + + arm_func_start ov38_02224A98 +ov38_02224A98: ; 0x02224A98 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + cmp r1, #8 + mvngt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} + bne _02224ABC + ldrsb r2, [r0] + cmp r2, #0x37 + mvngt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} +_02224ABC: + mov r5, #0 + mov r6, r5 + mov r7, r5 + cmp r1, #0 + ble _02224B78 + mov lr, #1 + mov r3, lr + mov ip, lr + mov r4, r5 +_02224AE0: + ldrsb r8, [r0, r5] + mov r2, r4 + cmp r8, #0x41 + blt _02224AF8 + cmp r8, #0x5a + movle r2, lr +_02224AF8: + cmp r2, #0 + addne r8, r8, #0x20 + mov r2, r8, lsl #0x18 + mov r2, r2, asr #0x18 + cmp r2, #0x30 + blt _02224B28 + cmp r2, #0x39 + bgt _02224B28 + add r2, r2, r6, lsl #4 + mov r7, ip + sub r6, r2, #0x30 + b _02224B6C +_02224B28: + cmp r2, #0x61 + blt _02224B48 + cmp r2, #0x66 + bgt _02224B48 + add r2, r2, r6, lsl #4 + mov r7, r3 + sub r6, r2, #0x57 + b _02224B6C +_02224B48: + cmp r7, #0 + beq _02224B5C + cmp r2, #0x20 + cmpne r2, #0 + beq _02224B78 +_02224B5C: + cmp r7, #0 + cmpeq r2, #0x20 + mvnne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_02224B6C: + add r5, r5, #1 + cmp r5, r1 + blt _02224AE0 +_02224B78: + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov38_02224A98 + + arm_func_start ov38_02224B80 +ov38_02224B80: ; 0x02224B80 + stmdb sp!, {r3, r4, r5, lr} + cmp r1, #0xa + mvngt r0, #0 + ldmgtia sp!, {r3, r4, r5, pc} + mov lr, #0 + mov r4, lr + mov r3, lr + cmp r1, #0 + ble _02224C10 + mov ip, #1 + mov r2, #0xa +_02224BAC: + cmp r3, #0 + ldrsb r5, [r0, lr] + beq _02224BC4 + cmp r5, #0x20 + cmpne r5, #0 + beq _02224C10 +_02224BC4: + cmp r3, #0 + cmpeq r5, #0x20 + beq _02224C04 + cmp r5, #0x30 + blt _02224BE0 + cmp r5, #0x39 + ble _02224BE8 +_02224BE0: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02224BE8: + mla r3, r4, r2, r5 + mov r5, r4 + sub r4, r3, #0x30 + cmp r5, r4 + mov r3, ip + mvngt r0, #0 + ldmgtia sp!, {r3, r4, r5, pc} +_02224C04: + add lr, lr, #1 + cmp lr, r1 + blt _02224BAC +_02224C10: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov38_02224B80 + + arm_func_start ov38_02224C18 +ov38_02224C18: ; 0x02224C18 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + ldr r6, _02224CD0 ; =ov38_02225000 + add r4, sp, #0 + mov sl, r0 + mov sb, r1 + ldmia r6!, {r0, r1, r2, r3} + mov r5, r4 + stmia r4!, {r0, r1, r2, r3} + ldmia r6!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, [r6] + mov r7, #0 + str r0, [r4] + mov r6, r7 + mov r1, r7 + mov fp, #1 + mov r4, #0x30 +_02224C60: + ldr r8, [r5, r6, lsl #2] + cmp sb, r8 + blo _02224C98 + mov r0, sb + mov r1, r8 + bl _u32_div_f + mul r2, r0, r8 + cmp sl, #0 + addne r0, r0, #0x30 + strneb r0, [sl, r7] + mov r1, fp + sub sb, sb, r2 + add r7, r7, #1 + b _02224CAC +_02224C98: + cmp r1, #0 + beq _02224CAC + cmp sl, #0 + strneb r4, [sl, r7] + add r7, r7, #1 +_02224CAC: + add r6, r6, #1 + cmp r6, #9 + blt _02224C60 + cmp sl, #0 + addne r0, sb, #0x30 + strneb r0, [sl, r7] + add r0, r7, #1 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02224CD0: .word ov38_02225000 + arm_func_end ov38_02224C18 + + arm_func_start ov38_02224CD4 +ov38_02224CD4: ; 0x02224CD4 + stmdb sp!, {r4, r5, r6, lr} + mov ip, #1 + mov r3, #0 + mov r2, ip + mov lr, r3 + b _02224D04 +_02224CEC: + cmp r5, #0 + cmpne r5, #0x20 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, r0, #1 + add r1, r1, #1 +_02224D04: + ldrsb r6, [r1] + mov r4, lr + cmp r6, #0x41 + blt _02224D1C + cmp r6, #0x5a + movle r4, ip +_02224D1C: + ldrsb r5, [r0] + cmp r4, #0 + addne r6, r6, #0x20 + mov r4, r3 + cmp r5, #0x41 + blt _02224D3C + cmp r5, #0x5a + movle r4, r2 +_02224D3C: + cmp r4, #0 + addne r4, r5, #0x20 + moveq r4, r5 + cmp r4, r6 + beq _02224CEC + mvn r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov38_02224CD4 + + arm_func_start ov38_02224D58 +ov38_02224D58: ; 0x02224D58 + stmdb sp!, {r3, lr} + mov ip, #0 + cmp r1, #0 + mov lr, ip + sub r1, r1, #1 + beq _02224DB8 + mov r2, #0xa +_02224D74: + ldrsb r3, [r0] + cmp r3, #0x20 + beq _02224DA8 + cmp r3, #0x30 + blt _02224DA8 + cmp r3, #0x39 + bgt _02224DA8 + mla r3, lr, r2, r3 + add ip, ip, #1 + cmp ip, #9 + sub lr, r3, #0x30 + mvngt r0, #0 + ldmgtia sp!, {r3, pc} +_02224DA8: + cmp r1, #0 + add r0, r0, #1 + sub r1, r1, #1 + bne _02224D74 +_02224DB8: + cmp ip, #0 + mvneq lr, #0 + mov r0, lr + ldmia sp!, {r3, pc} + arm_func_end ov38_02224D58 + + arm_func_start ov38_02224DC8 +ov38_02224DC8: ; 0x02224DC8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + cmp r1, r3 + mvnlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, pc} + sub r1, r1, r3 + add r8, r1, #1 + cmp r8, #0 + mov r4, #0 + ble _02224E44 + ldrsb r7, [r2] + mov lr, #1 +_02224DF4: + ldrsb r1, [r0, r4] + cmp r7, r1 + bne _02224E38 + mov r5, lr + cmp r3, #1 + add r6, r0, r4 + ble _02224E2C +_02224E10: + ldrsb ip, [r6, r5] + ldrsb r1, [r2, r5] + cmp ip, r1 + bne _02224E2C + add r5, r5, #1 + cmp r5, r3 + blt _02224E10 +_02224E2C: + cmp r5, r3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_02224E38: + add r4, r4, #1 + cmp r4, r8 + blt _02224DF4 +_02224E44: + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov38_02224DC8 + + .rodata + +_02224E60: + .byte 0x25, 0x30, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 + +ov38_02224E6C: ; 0x02224E6C + .byte 0x32, 0x31, 0x34, 0x37 + .byte 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x00, 0x00 + +ov38_02224E78: ; 0x02224E78 + .byte 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 + .byte 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58 + .byte 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E + .byte 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33 + .byte 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2E, 0x2D, 0x00, 0x00, 0x00, 0x00 + +ov38_02224EBC: ; 0x02224EBC + .byte 0x30, 0x30, 0x3A, 0x30 + .byte 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2D, 0x30, 0x30, 0x00, 0x00, 0x00 + +ov38_02224ECC: ; 0x02224ECC + .byte 0x62, 0x47, 0x6C, 0x7A + .byte 0x64, 0x41, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x00 + +ov38_02224ED8: ; 0x02224ED8 + .byte 0x59, 0x32, 0x39, 0x31, 0x62, 0x6E, 0x51, 0x2A + .byte 0x00, 0x00, 0x00, 0x00 + +ov38_02224EE4: ; 0x02224EE4 + .byte 0x59, 0x32, 0x39, 0x75, 0x64, 0x47, 0x56, 0x75, 0x64, 0x48, 0x4D, 0x2A + .byte 0x00, 0x00, 0x00, 0x00 + +ov38_02224EF4: ; 0x02224EF4 + .byte 0x00, 0x00, 0xC1, 0x6F, 0xF2, 0x86, 0x23, 0x00, 0x00, 0x80, 0xC6, 0xA4 + .byte 0x7E, 0x8D, 0x03, 0x00, 0x00, 0x40, 0x7A, 0x10, 0xF3, 0x5A, 0x00, 0x00, 0x00, 0xA0, 0x72, 0x4E + .byte 0x18, 0x09, 0x00, 0x00, 0x00, 0x10, 0xA5, 0xD4, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x76, 0x48 + .byte 0x17, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x0B, 0x54, 0x02, 0x00, 0x00, 0x00, 0x00, 0xCA, 0x9A, 0x3B + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xF5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x80, 0x96, 0x98, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + +ov38_02224F74: ; 0x02224F74 + .byte 0x2D, 0x2D, 0x74, 0x39, 0x53, 0x66, 0x34, 0x79, 0x66, 0x6A, 0x66, 0x31 + .byte 0x52, 0x74, 0x76, 0x44, 0x75, 0x33, 0x41 + +ov38_02224F87: ; 0x02224F87 + .byte 0x41, 0x00, 0x00, 0x00, 0x00 + +ov38_02224F8C: ; 0x02224F8C + .byte 0x43, 0x6F, 0x6E, 0x74 + .byte 0x65, 0x6E, 0x74, 0x2D, 0x44, 0x69, 0x73, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3A + .byte 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x2D, 0x64, 0x61, 0x74, 0x61, 0x3B, 0x20, 0x6E, 0x61, 0x6D, 0x65 + .byte 0x3D, 0x22, 0x00, 0x00 + +ov38_02224FB4: ; 0x02224FB4 + .byte 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65 + .byte 0x3A, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x6F, 0x63 + .byte 0x74, 0x65, 0x74, 0x2D, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74 + .byte 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x2D, 0x45, 0x6E, 0x63 + .byte 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3A, 0x20, 0x62, 0x69, 0x6E, 0x61, 0x72, 0x79, 0x0D, 0x0A, 0x00 + +ov38_02225000: ; 0x02225000 + .byte 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0xE1, 0xF5, 0x05, 0x80, 0x96, 0x98, 0x00, 0x40, 0x42, 0x0F, 0x00 + .byte 0xA0, 0x86, 0x01, 0x00, 0x10, 0x27, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00 + .byte 0x0A, 0x00, 0x00, 0x00 + + .data + +_02225138: + .asciz "ghiFreeBuffer" + .balign 4, 0 + +ov38_02225148: ; 0x02225148 + .asciz "ghiInitBuffer" + .balign 4, 0 + +ov38_02225158: ; 0x02225158 + .asciz "ghiResetBuffer" + .balign 4, 0 + +ov38_02225168: ; 0x02225168 + .asciz "ghiResizeBuffer" + .balign 4, 0 + +ov38_02225178: ; 0x02225178 + .asciz "ghiInitFixedBuffer" + .balign 4, 0 + +ov38_0222518C: ; 0x0222518C + .asciz "ghiAppendCharToBuffer" + .balign 4, 0 + +ov38_022251A4: ; 0x022251A4 + .asciz "ghiAppendDataToBuffer" + .balign 4, 0 + +ov38_022251BC: ; 0x022251BC + .asciz "ghiReadDataFromBuffer" + .balign 4, 0 + +ov38_022251D4: ; 0x022251D4 + .asciz "buffer" + .balign 4, 0 + +ov38_022251DC: ; 0x022251DC + .asciz "ghttpBuffer.c" + .balign 4, 0 + +ov38_022251EC: ; 0x022251EC + .asciz "sizeIncrement > 0" + .balign 4, 0 + +ov38_02225200: ; 0x02225200 + .asciz "connection" + .balign 4, 0 + +ov38_0222520C: ; 0x0222520C + .asciz "initialSize > 0" + .balign 4, 0 + +ov38_0222521C: ; 0x0222521C + .asciz "userBuffer" + .balign 4, 0 + +ov38_02225228: ; 0x02225228 + .asciz "size > 0" + .balign 4, 0 + +ov38_02225234: ; 0x02225234 + .asciz "data" + .balign 4, 0 + +ov38_0222523C: ; 0x0222523C + .asciz "dataLen >= 0" + .balign 4, 0 + +ov38_0222524C: ; 0x0222524C + .asciz "connection->encryptor.mEngine != GHTTPEncryptionEngine_None" + .balign 4, 0 + +ov38_02225288: ; 0x02225288 + .asciz ": " + .balign 4, 0 + +ov38_0222528C: ; 0x0222528C + .asciz "\r\n" + .balign 4, 0 + +ov38_02225290: ; 0x02225290 + .asciz "%d" + .balign 4, 0 + +ov38_02225294: ; 0x02225294 + .asciz "bufferIn != NULL" + .balign 4, 0 + +ov38_022252A8: ; 0x022252A8 + .asciz "len != NULL" + .balign 4, 0 + +ov38_022252B4: ; 0x022252B4 + .asciz "ghiCallPostCallback" + .balign 4, 0 + +ov38_022252C8: ; 0x022252C8 + .asciz "ghiCallProgressCallback" + .balign 4, 0 + +ov38_022252E0: ; 0x022252E0 + .asciz "ghiCallCompletedCallback" + .balign 4, 0 + +ov38_022252FC: ; 0x022252FC + .asciz "connection" + .balign 4, 0 + +ov38_02225308: ; 0x02225308 + .asciz "ghttpCallbacks.c" + .balign 4, 0 + +ov38_0222531C: ; 0x0222531C + .word 0x000000FA + +ov38_02225320: ; 0x02225320 + .asciz "}" + .balign 4, 0 + +ov38_02225324: ; 0x02225324 + .asciz "ghiFindFreeSlot" + .balign 4, 0 + +ov38_02225334: ; 0x02225334 + .asciz "ghiFreeConnection" + .balign 4, 0 + +ov38_02225348: ; 0x02225348 + .asciz "ghiRedirectConnection" + .balign 4, 0 + +ov38_02225360: ; 0x02225360 + .asciz "ghiRequestToConnection" + .balign 4, 0 + +ov38_02225378: ; 0x02225378 + .asciz "ghiNumConnections == ghiConnectionsLen" + .balign 4, 0 + +ov38_022253A0: ; 0x022253A0 + .asciz "ghttpConnection.c" + .balign 4, 0 + +ov38_022253B4: ; 0x022253B4 + .asciz "connection" + .balign 4, 0 + +ov38_022253C0: ; 0x022253C0 + .asciz "connection->request >= 0" + .balign 4, 0 + +ov38_022253DC: ; 0x022253DC + .asciz "connection->request < ghiConnectionsLen" + .balign 4, 0 + +ov38_02225404: ; 0x02225404 + .asciz "connection->inUse" + .balign 4, 0 + +ov38_02225418: ; 0x02225418 + .asciz "request >= 0" + .balign 4, 0 + +ov38_02225428: ; 0x02225428 + .asciz "request < ghiConnectionsLen" + .balign 4, 0 + +ov38_02225444: ; 0x02225444 + .asciz "connection->redirectURL" + .balign 4, 0 + +ov38_0222545C: ; 0x0222545C + .asciz "ghttpGetExA" + .balign 4, 0 + +ov38_02225468: ; 0x02225468 + .asciz "ghiProcessConnection" + .balign 4, 0 + +ov38_02225480: ; 0x02225480 + .asciz "connection" + .balign 4, 0 + +ov38_0222548C: ; 0x0222548C + .asciz "ghttpMain.c" + .balign 4, 0 + +ov38_02225498: ; 0x02225498 + .asciz "ghiRequestToConnection(connection->request) == connection" + .balign 4, 0 + +ov38_022254D4: ; 0x022254D4 + .asciz "URL && URL[0]" + .balign 4, 0 + +ov38_022254E4: ; 0x022254E4 + .asciz "bufferSize >= 0" + .balign 4, 0 + +ov38_022254F4: ; 0x022254F4 + .asciz "!buffer || bufferSize" + .balign 4, 0 + +ov38_0222550C: ; 0x0222550C + .asciz "ghiPostInitState" + .balign 4, 0 + +ov38_02225520: ; 0x02225520 + .asciz "ghiPostDoPosting" + .balign 4, 0 + +ov38_02225534: ; 0x02225534 + .asciz "ghiPostStateInit" + .balign 4, 0 + +ov38_02225548: ; 0x02225548 + .asciz "ghiPostStateCleanup" + .balign 4, 0 + +ov38_0222555C: ; 0x0222555C + .asciz "ghiPostStateDoPosting" + .balign 4, 0 + +ov38_02225574: ; 0x02225574 + .asciz "ghiPostGetContentType" + .balign 4, 0 + +ov38_0222558C: ; 0x0222558C + .asciz "ghiPostGetContentLength" + .balign 4, 0 + +ov38_022255A4: ; 0x022255A4 + .asciz "ghiPostStringStateDoPosting" + .balign 4, 0 + +ov38_022255C0: ; 0x022255C0 + .asciz "ghiPostFileDiskStateDoPosting" + .balign 4, 0 + +ov38_022255E0: ; 0x022255E0 + .asciz "ghiPostGetNoFilesContentLength" + .balign 4, 0 + +ov38_02225600: ; 0x02225600 + .asciz "ghiPostFileMemoryStateDoPosting" + .balign 4, 0 + +ov38_02225620: ; 0x02225620 + .asciz "ghiPostGetHasFilesContentLength" + .balign 4, 0 + +ov38_02225640: ; 0x02225640 + .asciz "0" + .balign 4, 0 + +ov38_02225644: ; 0x02225644 + .asciz "ghttpPost.c" + .balign 4, 0 + +ov38_02225650: ; 0x02225650 + .asciz "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_@-.*" + .balign 4, 0 + +ov38_02225694: ; 0x02225694 + .asciz "post" + .balign 4, 0 + +ov38_0222569C: ; 0x0222569C + .asciz "" + .balign 4, 0 + +ov38_022256A0: ; 0x022256A0 + .asciz "multipart/form-data; boundary=Qr4G823s23d---<<><><<<>--7d118e0536" + .balign 4, 0 + +ov38_022256E4: ; 0x022256E4 + .asciz "application/x-www-form-urlencoded" + .balign 4, 0 + +ov38_02225708: ; 0x02225708 + .asciz "data->type == GHIString" + .balign 4, 0 + +ov38_02225720: ; 0x02225720 + .asciz "--Qr4G823s23d---<<><><<<>--7d118e0536" + .balign 4, 0 + +ov38_02225748: ; 0x02225748 + .asciz "state" + .balign 4, 0 + +ov38_02225750: ; 0x02225750 + .asciz "connection->post" + .balign 4, 0 + +ov38_02225764: ; 0x02225764 + .asciz "ArrayLength(connection->post->data) == ArrayLength(connection->postingState.states)" + .balign 4, 0 + +ov38_022257B8: ; 0x022257B8 + .asciz "state->pos >= 0" + .balign 4, 0 + +ov38_022257C8: ; 0x022257C8 + .asciz "state->pos < state->data->data.string.len" + .balign 4, 0 + +ov38_022257F4: ; 0x022257F4 + .asciz "(c / 16) < 16" + .balign 4, 0 + +ov38_02225804: ; 0x02225804 + .asciz "0123456789ABCDEF" + .balign 4, 0 + +ov38_02225818: ; 0x02225818 + .asciz "state->pos < state->state.fileDisk.len" + .balign 4, 0 + +ov38_02225840: ; 0x02225840 + .asciz "state->pos == (int)ftell(state->state.fileDisk.file)" + .balign 4, 0 + +ov38_02225878: ; 0x02225878 + .asciz "state->pos < state->data->data.fileMemory.len" + .balign 4, 0 + +ov38_022258A8: ; 0x022258A8 + .asciz "state->data->type == GHIString" + .balign 4, 0 + +ov38_022258C8: ; 0x022258C8 + .asciz "%s=" + .balign 4, 0 + +ov38_022258CC: ; 0x022258CC + .asciz "&%s=" + .balign 4, 0 + +ov38_022258D4: ; 0x022258D4 + .asciz "--Qr4G823s23d---<<><><<<>--7d118e0536\r\n" + .balign 4, 0 + +ov38_022258FC: ; 0x022258FC + .asciz "\r\n--Qr4G823s23d---<<><><<<>--7d118e0536\r\n" + .balign 4, 0 + +ov38_02225928: ; 0x02225928 + .asciz "%sContent-Disposition: form-data; name=\"%s\"\r\n\r\n" + .balign 4, 0 + +ov38_02225958: ; 0x02225958 + .asciz "%sContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n" + .balign 4, 0 + +ov38_022259AC: ; 0x022259AC + .asciz "state->data->type == GHIFileMemory" + .balign 4, 0 + +ov38_022259D0: ; 0x022259D0 + .asciz "connection" + .balign 4, 0 + +ov38_022259DC: ; 0x022259DC + .asciz "connection->postingState.states" + .balign 4, 0 + +ov38_022259FC: ; 0x022259FC + .asciz "connection->postingState.index >= 0" + .balign 4, 0 + +ov38_02225A20: ; 0x02225A20 + .asciz "connection->postingState.index <= ArrayLength(connection->postingState.states)" + .balign 4, 0 + +ov38_02225A70: ; 0x02225A70 + .asciz "postState" + .balign 4, 0 + +ov38_02225A7C: ; 0x02225A7C + .asciz "connection->completed && connection->result" + .balign 4, 0 + +ov38_02225AA8: ; 0x02225AA8 + .asciz "\r\n--Qr4G823s23d---<<><><<<>--7d118e0536--\r\n" + .balign 4, 0 + +ov38_02225AD4: ; 0x02225AD4 + .asciz "ghiParseURL" + .balign 4, 0 + +ov38_02225AE0: ; 0x02225AE0 + .asciz "ghiDoPosting" + .balign 4, 0 + +ov38_02225AF0: ; 0x02225AF0 + .asciz "ghiParseStatus" + .balign 4, 0 + +ov38_02225B00: ; 0x02225B00 + .asciz "ghiParseChunkSize" + .balign 4, 0 + +ov38_02225B14: ; 0x02225B14 + .asciz "ghiDoSecuringSession" + .balign 4, 0 + +ov38_02225B2C: ; 0x02225B2C + .asciz "ghiProcessIncomingFileData" + .balign 4, 0 + +ov38_02225B48: ; 0x02225B48 + .asciz "ghiAppendToChunkHeaderBuffer" + .balign 4, 0 + +ov38_02225B68: ; 0x02225B68 + .asciz "connection" + .balign 4, 0 + +ov38_02225B74: ; 0x02225B74 + .asciz "ghttpProcess.c" + .balign 4, 0 + +ov38_02225B84: ; 0x02225B84 + .asciz "connection->URL" + .balign 4, 0 + +ov38_02225B94: ; 0x02225B94 + .asciz "http://" + .balign 4, 0 + +ov38_02225B9C: ; 0x02225B9C + .asciz "https://" + .balign 4, 0 + +ov38_02225BA8: ; 0x02225BA8 + .asciz ":/" + .balign 4, 0 + +ov38_02225BAC: ; 0x02225BAC + .asciz "/" + .balign 4, 0 + +ov38_02225BB0: ; 0x02225BB0 + .asciz "0" + .balign 4, 0 + +ov38_02225BB4: ; 0x02225BB4 + .asciz "POST " + .balign 4, 0 + +ov38_02225BBC: ; 0x02225BBC + .asciz "HEAD " + .balign 4, 0 + +ov38_02225BC4: ; 0x02225BC4 + .asciz "GET " + .balign 4, 0 + +ov38_02225BCC: ; 0x02225BCC + .asciz " HTTP/1.1\r\n" + .balign 4, 0 + +ov38_02225BD8: ; 0x02225BD8 + .asciz "Host" + .balign 4, 0 + +ov38_02225BE0: ; 0x02225BE0 + .asciz "Host: " + .balign 4, 0 + +ov38_02225BE8: ; 0x02225BE8 + .asciz "\r\n" + .balign 4, 0 + +ov38_02225BEC: ; 0x02225BEC + .asciz "User-Agent" + .balign 4, 0 + +ov38_02225BF8: ; 0x02225BF8 + .asciz "GameSpyHTTP/1.0" + .balign 4, 0 + +ov38_02225C08: ; 0x02225C08 + .asciz "Connection" + .balign 4, 0 + +ov38_02225C14: ; 0x02225C14 + .asciz "Keep-Alive" + .balign 4, 0 + +ov38_02225C20: ; 0x02225C20 + .asciz "close" + .balign 4, 0 + +ov38_02225C28: ; 0x02225C28 + .asciz "%d" + .balign 4, 0 + +ov38_02225C2C: ; 0x02225C2C + .asciz "Content-Length" + .balign 4, 0 + +ov38_02225C3C: ; 0x02225C3C + .asciz "Content-Type" + .balign 4, 0 + +ov38_02225C4C: ; 0x02225C4C + .asciz "connection->completed && connection->result" + .balign 4, 0 + +ov38_02225C78: ; 0x02225C78 + .asciz "connection->recvBuffer.len > 0" + .balign 4, 0 + +ov38_02225C98: ; 0x02225C98 + .asciz "HTTP/%d.%d %d%n" + .balign 4, 0 + +ov38_02225CA8: ; 0x02225CA8 + .asciz "len" + .balign 4, 0 + +ov38_02225CAC: ; 0x02225CAC + .asciz "%x" + .balign 4, 0 + +ov38_02225CB0: ; 0x02225CB0 + .asciz "data" + .balign 4, 0 + +ov38_02225CB8: ; 0x02225CB8 + .asciz "len >= 0" + .balign 4, 0 + +ov38_02225CC4: ; 0x02225CC4 + .asciz "len > 0" + .balign 4, 0 + +ov38_02225CCC: ; 0x02225CCC + .asciz "\r\n\r\n" + .balign 4, 0 + +ov38_02225CD4: ; 0x02225CD4 + .asciz "\n\n" + .balign 4, 0 + +ov38_02225CD8: ; 0x02225CD8 + .asciz "Location:" + .balign 4, 0 + +ov38_02225CE4: ; 0x02225CE4 + .asciz "http://%s:%d%s" + .balign 4, 0 + +ov38_02225CF4: ; 0x02225CF4 + .asciz "Content-Length:" + .balign 4, 0 + +ov38_02225D04: ; 0x02225D04 + .asciz "Transfer-Encoding: chunked" + .balign 4, 0 + + ; Another root certificate +ov38_02225D20: ; 0x02225D20 + .byte 0x01, 0x00, 0x01, 0x00 + +ov38_02225D24: ; 0x02225D24 + .word ov38_02225D38 + .word 0x00000080 + .word ov38_02225D88 + .word 0x00000003 + .word ov38_02225D20 + +ov38_02225D38: + .asciz "US, Washington, Nintendo of America Inc, NOA, Nintendo CA, ca@noa.nintendo.com" + .balign 4, 0 + +ov38_02225D88: + .byte 0xB3, 0xCD, 0x79, 0x97, 0x77, 0x5D, 0x8A, 0xAF, 0x86, 0xA8, 0xE8, 0xD7, 0x73, 0x1C, 0x77, 0xDF + .byte 0x10, 0x90, 0x1F, 0x81, 0xF8, 0x41, 0x9E, 0x21, 0x55, 0xDF, 0xBC, 0xFC, 0x63, 0xFB, 0x19, 0x43 + .byte 0xF1, 0xF6, 0xC4, 0x72, 0x42, 0x49, 0xBD, 0xAD, 0x44, 0x68, 0x4E, 0xF3, 0xDA, 0x1D, 0xE6, 0x4D + .byte 0xD8, 0xF9, 0x59, 0x88, 0xDC, 0xAE, 0x3E, 0x9B, 0x38, 0x09, 0xCA, 0x7F, 0xFF, 0xDC, 0x24, 0xA2 + .byte 0x44, 0x78, 0x78, 0x49, 0x93, 0xD4, 0x84, 0x40, 0x10, 0xB8, 0xEC, 0x3E, 0xDB, 0x2D, 0x93, 0xC8 + .byte 0x11, 0xC8, 0xFD, 0x78, 0x2D, 0x61, 0xAD, 0x31, 0xAE, 0x86, 0x26, 0xB0, 0xFD, 0x5A, 0x3F, 0xA1 + .byte 0x3D, 0xBF, 0xE2, 0x4B, 0x49, 0xEC, 0xCE, 0x66, 0x98, 0x58, 0x26, 0x12, 0xC0, 0xFB, 0xF4, 0x77 + .byte 0x65, 0x1B, 0xEA, 0xFB, 0xCB, 0x7F, 0xE0, 0x8C, 0xCB, 0x02, 0xA3, 0x4E, 0x5E, 0x8C, 0xEA, 0x9B + +ov38_02225E08: ; 0x02225E08 + .asciz "Nitro WiFi SDK/%d.%d" + .balign 4, 0 + +ov38_02225E20: ; 0x02225E20 + .word ov38_02225D24 + +ov38_02225E24: ; 0x02225E24 + .asciz "HTTPSTATUSCODE" + .balign 4, 0 + +ov38_02225E34: ; 0x02225E34 + .asciz "returncd" + .balign 4, 0 + +ov38_02225E40: ; 0x02225E40 + .asciz "User-Agent" + .balign 4, 0 + +ov38_02225E4C: ; 0x02225E4C + .asciz "gamecd" + .balign 4, 0 + +ov38_02225E54: ; 0x02225E54 + .asciz "rhgamecd" + .balign 4, 0 + +ov38_02225E60: ; 0x02225E60 + .asciz "passwd" + .balign 4, 0 + +ov38_02225E68: ; 0x02225E68 + .asciz "token" + .balign 4, 0 + +ov38_02225E70: ; 0x02225E70 + .asciz "userid" + .balign 4, 0 + +ov38_02225E78: ; 0x02225E78 + .asciz "macadr" + .balign 4, 0 + +ov38_02225E80: ; 0x02225E80 + .asciz "action" + .balign 4, 0 + +ov38_02225E88: ; 0x02225E88 + .asciz "attr1" + .balign 4, 0 + +ov38_02225E90: ; 0x02225E90 + .asciz "attr2" + .balign 4, 0 + +ov38_02225E98: ; 0x02225E98 + .asciz "attr3" + .balign 4, 0 + +ov38_02225EA0: ; 0x02225EA0 + .asciz "apinfo" + .balign 4, 0 + +ov38_02225EA8: ; 0x02225EA8 + .asciz "offset" + .balign 4, 0 + +ov38_02225EB0: ; 0x02225EB0 + .asciz "num" + .balign 4, 0 + +ov38_02225EB4: ; 0x02225EB4 + .asciz "contents" + .balign 4, 0 + +ov38_02225EC0: ; 0x02225EC0 + .asciz "Content-Length" + .balign 4, 0 + +ov38_02225ED0: ; 0x02225ED0 + .asciz "http://" + .balign 4, 0 + +ov38_02225ED8: ; 0x02225ED8 + .asciz "https://" + .balign 4, 0 + +ov38_02225EE4: ; 0x02225EE4 + .asciz "HTTPSTATUSCODE" + .balign 4, 0 + +ov38_02225EF4: ; 0x02225EF4 + .asciz "GET " + .balign 4, 0 + +ov38_02225EFC: ; 0x02225EFC + .asciz "POST " + .balign 4, 0 + +ov38_02225F04: ; 0x02225F04 + .asciz "HEAD " + .balign 4, 0 + +ov38_02225F0C: ; 0x02225F0C + .asciz "/" + .balign 4, 0 + +ov38_02225F10: ; 0x02225F10 + .asciz " HTTP/1.1\r\n" + .balign 4, 0 + +ov38_02225F1C: ; 0x02225F1C + .asciz "Host: " + .balign 4, 0 + +ov38_02225F24: ; 0x02225F24 + .asciz "\r\n" + .balign 4, 0 + +ov38_02225F28: ; 0x02225F28 + .asciz ": " + .balign 4, 0 + +ov38_02225F2C: ; 0x02225F2C + .asciz "Content-Type: multipart/form-data; boundary=" + .balign 4, 0 + +ov38_02225F5C: ; 0x02225F5C + .asciz "Content-Type: application/x-www-form-urlencoded\r\n" + .balign 4, 0 + +ov38_02225F90: ; 0x02225F90 + .asciz "Content-Length: " + .balign 4, 0 + +ov38_02225FA4: ; 0x02225FA4 + .asciz "\"\r\n" + .balign 4, 0 + +ov38_02225FA8: ; 0x02225FA8 + .asciz "--\r\n" + .balign 4, 0 + +ov38_02225FB0: ; 0x02225FB0 + .asciz "=" + .balign 4, 0 + +ov38_02225FB4: ; 0x02225FB4 + .asciz "&" + .balign 4, 0 + +ov38_02225FB8: ; 0x02225FB8 + .asciz "HTTP/" + .balign 4, 0 + +ov38_02225FC0: ; 0x02225FC0 + .asciz "Content-Length" + .balign 4, 0 + +ov38_02225FD0: ; 0x02225FD0 + .asciz "Connection" + .balign 4, 0 + +ov38_02225FDC: ; 0x02225FDC + .asciz "Keep-Alive" + .balign 4, 0 + +ov38_02225FE8: ; 0x02225FE8 + .asciz "Transfer-Encoding" + .balign 4, 0 + +ov38_02225FFC: ; 0x02225FFC + .asciz "chunked" + .balign 4, 0 + + .bss + +_02226024: + .space 0x4 + +ov38_02226028: ; 0x02226028 + .space 0x4 + +ov38_0222602C: ; 0x0222602C + .space 0x10 + +ov38_0222603C: ; 0x0222603C + .space 0x4 + +ov38_02226040: ; 0x02226040 + .space 0x10 + +ov38_02226050: ; 0x02226050 + .space 0x4 + +ov38_02226054: ; 0x02226054 + .space 0x4 + +ov38_02226058: ; 0x02226058 + .space 0x4 + +ov38_0222605C: ; 0x0222605C + .space 0x4 + +ov38_02226060: ; 0x02226060 + .space 0x8 + +ov38_02226068: ; 0x02226068 + .space 0x4 + +ov38_0222606C: ; 0x0222606C + .space 0x4 + +ov38_02226070: ; 0x02226070 + .space 0x4 + +ov38_02226074: ; 0x02226074 + .space 0x4 + +ov38_02226078: ; 0x02226078 + .space 0xC + +ov38_02226084: ; 0x02226084 + .space 0xC + +ov38_02226090: ; 0x02226090 + .space 0x14 + +ov38_022260A4: ; 0x022260A4 + .space 0x18 + +ov38_022260BC: ; 0x022260BC + .space 0x1C + +ov38_022260D8: ; 0x022260D8 + .space 0x24 + +ov38_022260FC: ; 0x022260FC + .space 0x8 + +ov38_02226104: ; 0x02226104 + .space 0x34 + +ov38_02226138: ; 0x02226138 + .space 0xC + +ov38_02226144: ; 0x02226144 + .space 0x18 + +ov38_0222615C: ; 0x0222615C + .space 0x80 + +ov38_022261DC: ; 0x022261DC + .space 0x4 + +ov38_022261E0: ; 0x022261E0 + .space 0x18 + +ov38_022261F8: ; 0x022261F8 + .space 0x18 + +ov38_02226210: ; 0x02226210 + .space 0x4 + +ov38_02226214: ; 0x02226214 + .space 0x4 + +ov38_02226218: ; 0x02226218 + .space 0x4 + +ov38_0222621C: ; 0x0222621C + .space 0x4 + +ov38_02226220: ; 0x02226220 + .space 0x4 + +ov38_02226224: ; 0x02226224 + .space 0x8 + +ov38_0222622C: ; 0x0222622C + .space 0x4 + +ov38_02226230: ; 0x02226230 + .space 0x4 + +ov38_02226234: ; 0x02226234 + .space 0x8C0 + +ov38_02226AF4: ; 0x02226AF4 + .space 0x4 + +ov38_02226AF8: ; 0x02226AF8 + .space 0x18 + +ov38_02226B10: ; 0x02226B10 + .space 0x20 + +ov38_02226B30: ; 0x02226B30 + .space 0xC0 + +ov38_02226BF0: ; 0x02226BF0 + .space 0x20 + +ov38_02226C10: ; 0x02226C10 + .space 0x8 + +ov38_02226C18: ; 0x02226C18 + .space 0x4 + +ov38_02226C1C: ; 0x02226C1C + .space 0x3C + +ov38_02226C58: ; 0x02226C58 + .space 0x9 + +ov38_02226C61: ; 0x02226C61 + .space 0x3ff diff --git a/lib/NitroDWC/asm/overlay_39_arm.s b/lib/NitroDWC/asm/overlay_39_arm.s new file mode 100644 index 00000000..3815bf39 --- /dev/null +++ b/lib/NitroDWC/asm/overlay_39_arm.s @@ -0,0 +1,1833 @@ + .include "asm/macros.inc" + .include "overlay_39_arm.inc" + .include "global.inc" + + .text + + arm_func_start ov39_02229310 +ov39_02229310: ; 0x02229310 + stmdb sp!, {r3, lr} + bl ov39_02229408 + mov r0, #0 + ldr lr, _0222936C ; =_0222AB84 + mov r1, r0 + mov r2, r0 + mov r3, r0 + mov ip, #9 +_02229330: + stmia lr!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _02229330 + stmia lr!, {r0, r1, r2, r3} + stmia lr, {r0, r1} + ldr r1, _0222936C ; =_0222AB84 + mov r2, #0 + str r2, [r1, #0x138] + ldr r0, _02229370 ; =ov39_0222AD84 + strb r2, [r1, #0x140] + strh r2, [r0, #0x40] + bl ov39_0222993C + bl ov39_02229970 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222936C: .word _0222AB84 +_02229370: .word ov39_0222AD84 + arm_func_end ov39_02229310 + + arm_func_start ov39_02229374 +ov39_02229374: ; 0x02229374 + stmdb sp!, {r4, r5, r6, lr} + movs r5, r2 + mov r6, r0 + mov r4, r1 + beq _022293B4 + ldr lr, _022293FC ; =_0222AB84 + mov ip, #0x13 +_02229390: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _02229390 + ldmia r5, {r0, r1} + stmia lr, {r0, r1} + ldr r0, _022293FC ; =_0222AB84 + mov r1, #0 + str r1, [r0, #0x138] +_022293B4: + bl ov39_02229944 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl ov39_02229924 + ldr r0, _02229400 ; =ov39_0222ACC4 + mov r1, r6 + bl strcpy + ldr r1, _02229404 ; =ov39_0222AD84 + mov r2, #0 + ldr r0, _022293FC ; =_0222AB84 + strh r4, [r1, #0x40] + str r2, [r0, #0x258] + sub r1, r2, #1 + str r1, [r0, #0x26c] + bl ov39_02229408 + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022293FC: .word _0222AB84 +_02229400: .word ov39_0222ACC4 +_02229404: .word ov39_0222AD84 + arm_func_end ov39_02229374 + + arm_func_start ov39_02229408 +ov39_02229408: ; 0x02229408 + stmdb sp!, {r3, lr} + bl ov39_02229BA4 + ldr r0, _02229470 ; =_0222AB84 + ldr r0, [r0, #0x258] + cmp r0, #0 + beq _02229430 + bl ov39_022298E0 + ldr r0, _02229470 ; =_0222AB84 + mov r1, #0 + str r1, [r0, #0x258] +_02229430: + ldr r0, _02229470 ; =_0222AB84 + mov r1, #0xf + str r1, [r0, #0x244] + mov r1, #0x1e + str r1, [r0, #0x248] + str r1, [r0, #0x24c] + mov r2, #0 + str r2, [r0, #0x254] + str r2, [r0, #0x25c] + str r2, [r0, #0x260] + str r2, [r0, #0x264] + str r2, [r0, #0x268] + mov r1, #1 + str r1, [r0, #0x13c] + str r2, [r0, #0x250] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229470: .word _0222AB84 + arm_func_end ov39_02229408 + + arm_func_start ov39_02229474 +ov39_02229474: ; 0x02229474 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r5, #0 + ldr r4, _0222962C ; =_0222AB84 + mov fp, #9 + mov sl, #7 + mov r6, #1 + mov r7, r5 +_02229490: + ldr r0, [r4, #0x13c] + mov r8, r7 + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _022295E8 +_022294A4: ; jump table + b _022294CC ; case 0 + b _022294CC ; case 1 + b _022294D4 ; case 2 + b _02229508 ; case 3 + b _0222953C ; case 4 + b _02229570 ; case 5 + b _022295B8 ; case 6 + b _022294CC ; case 7 + b _022294CC ; case 8 + b _022294CC ; case 9 +_022294CC: + mov r8, r6 + b _022295E8 +_022294D4: + bl ov39_02229FCC + cmp r0, #0 + bne _022294F8 + ldr r0, [r4, #0x250] + mov r8, #1 + cmp r0, #0xd + moveq sb, sl + movne sb, fp + b _022294FC +_022294F8: + mov sb, #3 +_022294FC: + bl ov39_022298FC + str sb, [r4, #0x13c] + b _022295E8 +_02229508: + bl ov39_02229AD4 + cmp r0, #0 + bne _0222952C + ldr r0, [r4, #0x250] + mov r8, #1 + cmp r0, #0xd + moveq sb, #7 + movne sb, #9 + b _02229530 +_0222952C: + mov sb, #4 +_02229530: + bl ov39_022298FC + str sb, [r4, #0x13c] + b _022295E8 +_0222953C: + bl ov39_02229BE4 + cmp r0, #0 + bne _02229560 + ldr r0, [r4, #0x250] + mov r8, #1 + cmp r0, #0xd + moveq sb, #7 + movne sb, #9 + b _02229564 +_02229560: + mov sb, #5 +_02229564: + bl ov39_022298FC + str sb, [r4, #0x13c] + b _022295E8 +_02229570: + bl ov39_02229D2C + cmp r0, #0 + bne _02229594 + ldr r0, [r4, #0x250] + mov r8, #1 + cmp r0, #0xd + moveq sb, #7 + movne sb, #9 + b _02229598 +_02229594: + mov sb, #6 +_02229598: + ldr r0, [r4, #0x258] + cmp r0, #0 + beq _022295AC + bl ov39_022298E0 + str r5, [r4, #0x258] +_022295AC: + bl ov39_022298FC + str sb, [r4, #0x13c] + b _022295E8 +_022295B8: + bl ov39_02229E40 + cmp r0, #0 + bne _022295D8 + ldr r0, [r4, #0x250] + cmp r0, #0xd + moveq sb, #7 + movne sb, #9 + b _022295DC +_022295D8: + mov sb, #8 +_022295DC: + mov r8, #1 + bl ov39_022298FC + str sb, [r4, #0x13c] +_022295E8: + cmp r8, #0 + bne _02229624 + ldr r0, [r4, #0x268] + cmp r0, #1 + bne _02229614 + ldr r0, _0222962C ; =_0222AB84 + mov r1, #7 + str r1, [r0, #0x13c] + mov r1, #0xd + str r1, [r0, #0x250] + b _02229624 +_02229614: + bl ov39_02229910 + mov r0, #1 + bl ov39_02229FC0 + b _02229490 +_02229624: + bl ov39_02229910 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0222962C: .word _0222AB84 + arm_func_end ov39_02229474 + + arm_func_start ov39_02229630 +ov39_02229630: ; 0x02229630 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov39_022298FC + ldr r0, _02229818 ; =_0222AB84 + ldr r0, [r0, #0x13c] + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _022296A8 +_0222965C: ; jump table + b _02229684 ; case 0 + b _022296A8 ; case 1 + b _02229684 ; case 2 + b _02229684 ; case 3 + b _02229684 ; case 4 + b _02229684 ; case 5 + b _02229684 ; case 6 + b _022296A4 ; case 7 + b _022296A4 ; case 8 + b _022296A4 ; case 9 +_02229684: + bl ov39_02229910 + ldr r0, _02229818 ; =_0222AB84 + mov r1, #9 + str r1, [r0, #0x13c] + mov r1, #1 + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022296A4: + bl ov39_02229408 +_022296A8: + bl ov39_02229910 + mov r0, r7 + bl ov39_0222A6DC + ldr r2, _02229818 ; =_0222AB84 + mvn r1, #0 + str r0, [r2, #0x25c] + cmp r0, r1 + bne _022296E0 + mov r0, #9 + str r0, [r2, #0x13c] + mov r0, #2 + str r0, [r2, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022296E0: + cmp r4, r1 + str r5, [r2, #0x260] + addne r0, r4, #0x140 + strne r0, [sp] + bne _02229728 + mov r0, r7 + bl ov39_0222A59C + mvn r1, #0 + str r0, [sp] + cmp r0, r1 + bne _02229728 + ldr r0, _02229818 ; =_0222AB84 + mov r1, #9 + str r1, [r0, #0x13c] + mov r1, #2 + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02229728: + ldr r0, [sp] + bl ov39_022298CC + ldr ip, _02229818 ; =_0222AB84 + cmp r0, #0 + str r0, [ip, #0x258] + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [sp] + add r3, sp, #0 + str r1, [ip, #0x254] + ldrb r2, [r3] + ldrb r1, [r3, #1] + mov r4, #0x13 + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldr lr, [ip, #0x258] + strh r7, [lr, #4] + add r5, lr, #8 +_02229780: + ldmia ip!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _02229780 + ldmia ip, {r0, r1} + stmia r5, {r0, r1} + mov r0, #0 + strh r0, [lr, #6] + ldr r2, [sp] + mov r1, r6 + add r0, lr, #0x140 + sub r2, r2, #0x140 + bl memcpy + ldr r0, _02229818 ; =_0222AB84 + ldr r2, [r0, #0x258] + ldr r1, [r0, #0x254] + add r0, r2, #4 + sub r1, r1, #4 + add r2, r2, #4 + bl ov39_0222A4EC + ldr r0, _02229818 ; =_0222AB84 + mov r1, #2 + str r1, [r0, #0x13c] + bl ov39_022298FC + bl ov39_02229980 + cmp r0, #0 + bne _0222980C + ldr r0, _02229818 ; =_0222AB84 + mov r1, #9 + str r1, [r0, #0x13c] + mov r1, #6 + str r1, [r0, #0x250] + bl ov39_02229910 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222980C: + bl ov39_02229910 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02229818: .word _0222AB84 + arm_func_end ov39_02229630 + + arm_func_start ov39_0222981C +ov39_0222981C: ; 0x0222981C + ldr r0, _02229828 ; =_0222AB84 + ldr r0, [r0, #0x13c] + bx lr + .balign 4, 0 +_02229828: .word _0222AB84 + arm_func_end ov39_0222981C + + arm_func_start ov39_0222982C +ov39_0222982C: ; 0x0222982C + stmdb sp!, {r3, lr} + bl ov39_022298FC + bl ov39_0222981C + cmp r0, #8 + beq _0222984C + bl ov39_02229910 + mov r0, #0 + ldmia sp!, {r3, pc} +_0222984C: + bl ov39_02229910 + ldr r0, _02229860 ; =_0222AB84 + ldr r0, [r0, #0x260] + add r0, r0, #4 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229860: .word _0222AB84 + arm_func_end ov39_0222982C + + arm_func_start ov39_02229864 +ov39_02229864: ; 0x02229864 + stmdb sp!, {r3, lr} + bl ov39_022298FC + bl ov39_0222981C + cmp r0, #8 + beq _02229884 + bl ov39_02229910 + mvn r0, #0 + ldmia sp!, {r3, pc} +_02229884: + bl ov39_02229910 + ldr r0, _02229894 ; =_0222AB84 + ldr r0, [r0, #0x25c] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229894: .word _0222AB84 + arm_func_end ov39_02229864 + + arm_func_start ov39_02229898 +ov39_02229898: ; 0x02229898 + stmdb sp!, {r3, lr} + bl ov39_022298FC + bl ov39_0222981C + cmp r0, #9 + beq _022298B8 + bl ov39_02229910 + mov r0, #0 + ldmia sp!, {r3, pc} +_022298B8: + bl ov39_02229910 + ldr r0, _022298C8 ; =_0222AB84 + ldr r0, [r0, #0x250] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022298C8: .word _0222AB84 + arm_func_end ov39_02229898 + + arm_func_start ov39_022298CC +ov39_022298CC: ; 0x022298CC + ldr ip, _022298DC ; =ov00_021EC2A8 + mov r1, r0 + mov r0, #0 + bx ip + .balign 4, 0 +_022298DC: .word ov00_021EC2A8 + arm_func_end ov39_022298CC + + arm_func_start ov39_022298E0 +ov39_022298E0: ; 0x022298E0 + stmdb sp!, {r3, lr} + movs r1, r0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, pc} + arm_func_end ov39_022298E0 + + arm_func_start ov39_022298FC +ov39_022298FC: ; 0x022298FC + ldr ip, _02229908 ; =OS_LockMutex + ldr r0, _0222990C ; =ov39_0222AEB8 + bx ip + .balign 4, 0 +_02229908: .word OS_LockMutex +_0222990C: .word ov39_0222AEB8 + arm_func_end ov39_022298FC + + arm_func_start ov39_02229910 +ov39_02229910: ; 0x02229910 + ldr ip, _0222991C ; =OS_UnlockMutex + ldr r0, _02229920 ; =ov39_0222AEB8 + bx ip + .balign 4, 0 +_0222991C: .word OS_UnlockMutex +_02229920: .word ov39_0222AEB8 + arm_func_end ov39_02229910 + + arm_func_start ov39_02229924 +ov39_02229924: ; 0x02229924 + stmdb sp!, {r3, lr} + ldr r0, _02229938 ; =ov39_0222AEB8 + bl OS_InitMutex + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229938: .word ov39_0222AEB8 + arm_func_end ov39_02229924 + + arm_func_start ov39_0222993C +ov39_0222993C: ; 0x0222993C + mov r0, #1 + bx lr + arm_func_end ov39_0222993C + + arm_func_start ov39_02229944 +ov39_02229944: ; 0x02229944 + stmdb sp!, {r3, lr} + bl OS_IsTickAvailable + cmp r0, #0 + bne _02229958 + bl OS_InitTick +_02229958: + ldr r0, _0222996C ; =_0222AB84 + mov r1, #0x10 + str r1, [r0, #0x270] + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222996C: .word _0222AB84 + arm_func_end ov39_02229944 + + arm_func_start ov39_02229970 +ov39_02229970: ; 0x02229970 + bx lr + arm_func_end ov39_02229970 + + arm_func_start ov39_02229974 +ov39_02229974: ; 0x02229974 + ldr ip, _0222997C ; =ov39_02229474 + bx ip + .balign 4, 0 +_0222997C: .word ov39_02229474 + arm_func_end ov39_02229974 + + arm_func_start ov39_02229980 +ov39_02229980: ; 0x02229980 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov r1, #0x800 + ldr r0, _022299C4 ; =_0222AB84 + str r1, [sp] + ldr ip, [r0, #0x270] + ldr r0, _022299C8 ; =ov39_0222ADF8 + ldr r1, _022299CC ; =ov39_02229974 + ldr r3, _022299D0 ; =ov39_0222B6D0 + mov r2, #0 + str ip, [sp, #4] + bl OS_CreateThread + ldr r0, _022299C8 ; =ov39_0222ADF8 + bl OS_WakeupThreadDirect + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022299C4: .word _0222AB84 +_022299C8: .word ov39_0222ADF8 +_022299CC: .word ov39_02229974 +_022299D0: .word ov39_0222B6D0 + arm_func_end ov39_02229980 + + arm_func_start ov39_022299D4 +ov39_022299D4: ; 0x022299D4 + ldrsb ip, [r0] + mov r2, #0 + mov r3, r2 + cmp ip, #0 + beq _02229A50 + mov r1, r2 +_022299EC: + cmp ip, #0x30 + blt _02229A10 + cmp ip, #0x39 + bgt _02229A10 + add r2, r2, #1 + cmp r2, #4 + blt _02229A44 + mov r0, #0 + bx lr +_02229A10: + cmp ip, #0x2e + bne _02229A3C + cmp r2, #0 + moveq r0, #0 + bxeq lr + add r3, r3, #1 + mov r2, r1 + cmp r3, #4 + blt _02229A44 + mov r0, r1 + bx lr +_02229A3C: + mov r0, #0 + bx lr +_02229A44: + ldrsb ip, [r0, #1]! + cmp ip, #0 + bne _022299EC +_02229A50: + cmp r3, #3 + bne _02229A64 + cmp r2, #0 + movne r0, #1 + bxne lr +_02229A64: + mov r0, #0 + bx lr + arm_func_end ov39_022299D4 + + arm_func_start ov39_02229A6C +ov39_02229A6C: ; 0x02229A6C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov39_022299D4 + cmp r0, #0 + bne _02229AC0 + mov r0, r5 + bl SOC_GetHostByName + cmp r0, #0 + beq _02229AB8 + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] + str r0, [sp] + bl SOC_InetNtoA + mov r1, r0 + mov r0, r4 + bl strcpy + b _02229ACC +_02229AB8: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02229AC0: + mov r0, r4 + mov r1, r5 + bl strcpy +_02229ACC: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov39_02229A6C + + arm_func_start ov39_02229AD4 +ov39_02229AD4: ; 0x02229AD4 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + mov r0, #2 + mov r1, #1 + mov r2, #0 + bl SOC_Socket + ldr r2, _02229B9C ; =_0222AB84 + mvn r1, #0 + str r0, [r2, #0x26c] + cmp r0, r1 + bne _02229B14 + mov r0, #3 + str r0, [r2, #0x250] + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, pc} +_02229B14: + mov r1, #3 + mov r2, #0 + bl SOC_Fcntl + ldr r1, _02229B9C ; =_0222AB84 + orr r2, r0, #4 + ldr r0, [r1, #0x26c] + mov r1, #4 + bl SOC_Fcntl + cmp r0, #0 + bge _02229B54 + ldr r0, _02229B9C ; =_0222AB84 + mov r1, #4 + str r1, [r0, #0x250] + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, pc} +_02229B54: + ldr r0, _02229BA0 ; =ov39_0222ACC4 + add r1, sp, #0 + bl ov39_02229A6C + cmp r0, #0 + bne _02229B80 + ldr r0, _02229B9C ; =_0222AB84 + mov r1, #5 + str r1, [r0, #0x250] + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, pc} +_02229B80: + add r0, sp, #0 + bl ov00_021FFA44 + ldr r1, _02229B9C ; =_0222AB84 + str r0, [r1, #0x264] + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229B9C: .word _0222AB84 +_02229BA0: .word ov39_0222ACC4 + arm_func_end ov39_02229AD4 + + arm_func_start ov39_02229BA4 +ov39_02229BA4: ; 0x02229BA4 + stmdb sp!, {r3, lr} + ldr r0, _02229BE0 ; =_0222AB84 + mvn r1, #0 + ldr r0, [r0, #0x26c] + cmp r0, r1 + ldmeqia sp!, {r3, pc} + mov r1, #2 + bl SOC_Shutdown + ldr r0, _02229BE0 ; =_0222AB84 + ldr r0, [r0, #0x26c] + bl SOC_Close + ldr r0, _02229BE0 ; =_0222AB84 + mvn r1, #0 + str r1, [r0, #0x26c] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02229BE0: .word _0222AB84 + arm_func_end ov39_02229BA4 + + arm_func_start ov39_02229BE4 +ov39_02229BE4: ; 0x02229BE4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + mov r2, #8 + mov r1, #2 + ldr r0, _02229D20 ; =ov39_0222AD84 + strb r2, [sp] + strb r1, [sp, #1] + ldrh r1, [r0, #0x40] + ldr r0, _02229D24 ; =_0222AB84 + mov r2, r1, asr #8 + mov r1, r1, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + strh r1, [sp, #2] + ldr r0, [r0, #0x264] + str r0, [sp, #4] + bl OS_GetTick + ldr r2, _02229D28 ; =0x0007FD88 + mov r3, #0 + bl _ll_udiv + ldr r5, _02229D28 ; =0x0007FD88 + ldr sb, _02229D24 ; =_0222AB84 + mov r7, r0 + mov r4, #0 + mov sl, #1 + add r6, sp, #0 + mvn r8, #0x19 +_02229C54: + ldr r0, [sb, #0x26c] + mov r1, r6 + bl SOC_Connect + cmp r0, #0 + bge _02229D14 + cmp r0, r8 + bne _02229CB4 + ldr r0, [sb, #0x244] + cmp r0, #0 + beq _02229CD8 + bl OS_GetTick + mov r2, r5 + mov r3, r4 + bl _ll_udiv + ldr r1, [sb, #0x244] + subs r0, r0, r7 + cmp r0, r1 + blt _02229CD8 + ldr r0, _02229D24 ; =_0222AB84 + mov r1, #0xa + str r1, [r0, #0x250] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02229CB4: + mvn r1, #0x1d + cmp r0, r1 + beq _02229D14 + ldr r0, _02229D24 ; =_0222AB84 + mov r1, #7 + str r1, [r0, #0x250] + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02229CD8: + bl ov39_022298FC + ldr r0, [sb, #0x268] + cmp r0, #1 + bne _02229D04 + ldr r0, _02229D24 ; =_0222AB84 + mov r1, #0xd + str r1, [r0, #0x250] + bl ov39_02229910 + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02229D04: + bl ov39_02229910 + mov r0, sl + bl ov39_02229FC0 + b _02229C54 +_02229D14: + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02229D20: .word ov39_0222AD84 +_02229D24: .word _0222AB84 +_02229D28: .word 0x0007FD88 + arm_func_end ov39_02229BE4 + + arm_func_start ov39_02229D2C +ov39_02229D2C: ; 0x02229D2C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, #0 + bl OS_GetTick + ldr r2, _02229E38 ; =0x0007FD88 + mov r3, sb + bl _ll_udiv + ldr r7, _02229E38 ; =0x0007FD88 + ldr r5, _02229E3C ; =_0222AB84 + mov sl, r0 + mov r8, sb + mov r6, sb + mov fp, #1 + mvn r4, #5 +_02229D60: + ldr r0, [r5, #0x254] + ldr r1, [r5, #0x258] + sub r2, r0, sb + cmp r2, r0 + movgt r2, r0 + ldr r0, [r5, #0x26c] + mov r3, r8 + add r1, r1, sb + bl SOC_Send + cmp r0, r4 + beq _02229DB8 + cmp r0, #0 + bge _02229DA8 + ldr r0, _02229E3C ; =_0222AB84 + mov r1, #0xb + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229DA8: + ldr r1, [r5, #0x254] + add sb, sb, r0 + cmp sb, r1 + beq _02229E30 +_02229DB8: + ldr r0, [r5, #0x248] + cmp r0, #0 + beq _02229DF8 + bl OS_GetTick + mov r2, r7 + mov r3, r6 + bl _ll_udiv + ldr r1, [r5, #0x248] + subs r0, r0, sl + cmp r0, r1 + blt _02229DF8 + ldr r0, _02229E3C ; =_0222AB84 + mov r1, #0xb + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229DF8: + bl ov39_022298FC + ldr r0, [r5, #0x268] + cmp r0, #1 + bne _02229E20 + ldr r0, _02229E3C ; =_0222AB84 + mov r1, #0xd + str r1, [r0, #0x250] + bl ov39_02229910 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229E20: + bl ov39_02229910 + mov r0, fp + bl ov39_02229FC0 + b _02229D60 +_02229E30: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02229E38: .word 0x0007FD88 +_02229E3C: .word _0222AB84 + arm_func_end ov39_02229D2C + + arm_func_start ov39_02229E40 +ov39_02229E40: ; 0x02229E40 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, #0 + sub r0, sl, #1 + str r0, [sp] + bl OS_GetTick + ldr r2, _02229FB8 ; =0x0007FD88 + mov r3, sl + bl _ll_udiv + mvn r4, #0 + ldr fp, _02229FB8 ; =0x0007FD88 + ldr r6, _02229FBC ; =_0222AB84 + mov sb, r0 + sub r5, r4, #5 + add r7, sp, #0 + mov r8, sl +_02229E7C: + ldr r1, [r6, #0x260] + ldr r2, [r6, #0x25c] + ldr r0, [r6, #0x26c] + mov r3, r8 + add r1, r1, sl + sub r2, r2, sl + bl SOC_Recv + cmp r0, r5 + beq _02229F38 + cmp r0, #0 + bgt _02229EBC + ldr r0, _02229FBC ; =_0222AB84 + mov r1, #9 + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229EBC: + add sl, sl, r0 + cmp sl, #4 + blo _02229EF8 + ldr r0, [sp] + cmp r0, r4 + bne _02229EF8 + ldr r2, [r6, #0x260] + ldrb r1, [r2] + ldrb r0, [r2, #1] + strb r1, [r7] + strb r0, [r7, #1] + ldrb r1, [r2, #2] + ldrb r0, [r2, #3] + strb r1, [r7, #2] + strb r0, [r7, #3] +_02229EF8: + ldr r0, [sp] + cmp sl, r0 + bne _02229F38 + cmp r0, r4 + beq _02229F38 + ldr r0, _02229FBC ; =_0222AB84 + sub r1, sl, #4 + ldr r2, [r0, #0x260] + add r0, r2, #4 + add r2, r2, #4 + bl ov39_0222A544 + ldr r1, [sp] + ldr r0, _02229FBC ; =_0222AB84 + sub r1, r1, #4 + str r1, [r0, #0x25c] + b _02229FB0 +_02229F38: + ldr r0, [r6, #0x24c] + cmp r0, #0 + beq _02229F78 + bl OS_GetTick + mov r2, fp + mov r3, #0 + bl _ll_udiv + ldr r1, [r6, #0x24c] + subs r0, r0, sb + cmp r0, r1 + blt _02229F78 + ldr r0, _02229FBC ; =_0222AB84 + mov r1, #0xc + str r1, [r0, #0x250] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229F78: + bl ov39_022298FC + ldr r0, [r6, #0x268] + cmp r0, #1 + bne _02229FA0 + ldr r0, _02229FBC ; =_0222AB84 + mov r1, #0xd + str r1, [r0, #0x250] + bl ov39_02229910 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02229FA0: + bl ov39_02229910 + mov r0, #1 + bl ov39_02229FC0 + b _02229E7C +_02229FB0: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02229FB8: .word 0x0007FD88 +_02229FBC: .word _0222AB84 + arm_func_end ov39_02229E40 + + arm_func_start ov39_02229FC0 +ov39_02229FC0: ; 0x02229FC0 + ldr ip, _02229FC8 ; =OS_Sleep + bx ip + .balign 4, 0 +_02229FC8: .word OS_Sleep + arm_func_end ov39_02229FC0 + + arm_func_start ov39_02229FCC +ov39_02229FCC: ; 0x02229FCC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x17c + ldr r0, _0222A104 ; =_0222AB84 + ldr r0, [r0, #0x138] + cmp r0, #1 + addeq sp, sp, #0x17c + moveq r0, #1 + ldmeqia sp!, {r4, r5, pc} + ldr r0, _0222A108 ; =_0222AA58 + add r1, sp, #8 + bl ov00_021ECC6C + cmp r0, #0 + bne _0222A018 + ldr r0, _0222A104 ; =_0222AB84 + mov r1, #0xe + str r1, [r0, #0x250] + add sp, sp, #0x17c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0222A018: + ldr r4, _0222A104 ; =_0222AB84 + mov r5, #1 +_0222A020: + bl ov00_021ECCE0 + cmp r0, #3 + bne _0222A074 + ldr r4, _0222A10C ; =ov39_0222AB8A + add r3, sp, #0x4d + mov r2, #0x96 +_0222A038: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [r4] + strb r0, [r4, #1] + add r4, r4, #2 + subs r2, r2, #1 + bne _0222A038 + ldrb r2, [r3] + ldr r1, _0222A104 ; =_0222AB84 + mov r0, #1 + strb r2, [r4] + str r0, [r1, #0x138] + add sp, sp, #0x17c + ldmia sp!, {r4, r5, pc} +_0222A074: + cmp r0, #4 + bne _0222A0A0 + add r0, sp, #0 + add r1, sp, #4 + bl ov00_021EC11C + ldr r0, _0222A104 ; =_0222AB84 + mov r1, #0xe + str r1, [r0, #0x250] + add sp, sp, #0x17c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0222A0A0: + cmp r0, #5 + bne _0222A0C0 + ldr r0, _0222A104 ; =_0222AB84 + mov r1, #0xe + str r1, [r0, #0x250] + add sp, sp, #0x17c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0222A0C0: + bl ov39_022298FC + ldr r0, [r4, #0x268] + cmp r0, #1 + bne _0222A0EC + ldr r0, _0222A104 ; =_0222AB84 + mov r1, #0xd + str r1, [r0, #0x250] + bl ov39_02229910 + add sp, sp, #0x17c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0222A0EC: + bl ov39_02229910 + mov r0, r5 + bl ov39_02229FC0 + b _0222A020 + arm_func_end ov39_02229FCC + + arm_func_start ov39_0222A0FC +ov39_0222A0FC: ; 0x0222A0FC + add sp, sp, #0x17c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0222A104: .word _0222AB84 +_0222A108: .word _0222AA58 +_0222A10C: .word ov39_0222AB8A + arm_func_end ov39_0222A0FC + + arm_func_start ov39_0222A110 +ov39_0222A110: ; 0x0222A110 + ldr ip, _0222A124 ; =ov39_02229374 + mov r2, r0 + ldr r0, _0222A128 ; =ov39_0222AA5C + ldr r1, _0222A12C ; =0x00003070 + bx ip + .balign 4, 0 +_0222A124: .word ov39_02229374 +_0222A128: .word ov39_0222AA5C +_0222A12C: .word 0x00003070 + arm_func_end ov39_0222A110 + + arm_func_start ov39_0222A130 +ov39_0222A130: ; 0x0222A130 + ldr ip, _0222A138 ; =ov39_02229310 + bx ip + .balign 4, 0 +_0222A138: .word ov39_02229310 + arm_func_end ov39_0222A130 + + arm_func_start ov39_0222A13C +ov39_0222A13C: ; 0x0222A13C + stmdb sp!, {r4, lr} + bl ov39_022298FC + bl ov39_0222981C + mov r4, r0 + bl ov39_02229910 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov39_0222A13C + + arm_func_start ov39_0222A158 +ov39_0222A158: ; 0x0222A158 + ldr ip, _0222A160 ; =ov39_02229898 + bx ip + .balign 4, 0 +_0222A160: .word ov39_02229898 + arm_func_end ov39_0222A158 + + arm_func_start ov39_0222A164 +ov39_0222A164: ; 0x0222A164 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0xe0 + mov r6, r0 + add lr, sp, #0 + mov r5, r1 + mov r4, r6 + mov ip, #0xe +_0222A180: + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _0222A180 + ldr r1, _0222A1B8 ; =ov39_0222AA78 + mov r0, r6 + bl ov39_0222A8AC + ldr r0, _0222A1BC ; =0x00004E20 + add r1, sp, #0 + mov r2, r5 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #0xe0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0222A1B8: .word ov39_0222AA78 +_0222A1BC: .word 0x00004E20 + arm_func_end ov39_0222A164 + + arm_func_start ov39_0222A1C0 +ov39_0222A1C0: ; 0x0222A1C0 + stmdb sp!, {lr} + sub sp, sp, #0xc + mov lr, #0 + mov ip, r0, asr #0x1f + str r0, [sp, #4] + mov r2, r1 + ldr r0, _0222A1FC ; =0x00004E21 + add r1, sp, #0 + sub r3, lr, #1 + strh lr, [sp] + strh lr, [sp, #2] + str ip, [sp, #8] + bl ov39_02229630 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0222A1FC: .word 0x00004E21 + arm_func_end ov39_0222A1C0 + + arm_func_start ov39_0222A200 +ov39_0222A200: ; 0x0222A200 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x220 + mov r6, r1 + add lr, sp, #4 + mov r5, r2 + mov r4, r6 + str r0, [sp] + mov ip, #0x21 +_0222A220: + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _0222A220 + ldmia r4, {r0, r1, r2} + stmia lr, {r0, r1, r2} + ldr r1, _0222A260 ; =ov39_0222AA78 + mov r0, r6 + bl ov39_0222A8AC + ldr r0, _0222A264 ; =0x00005208 + add r1, sp, #0 + mov r2, r5 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #0x220 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0222A260: .word ov39_0222AA78 +_0222A264: .word 0x00005208 + arm_func_end ov39_0222A200 + + arm_func_start ov39_0222A268 +ov39_0222A268: ; 0x0222A268 + stmdb sp!, {lr} + sub sp, sp, #0xc + mov lr, #0 + mov ip, r0, asr #0x1f + str r0, [sp, #4] + mov r2, r1 + ldr r0, _0222A2A4 ; =0x00005209 + add r1, sp, #0 + sub r3, lr, #1 + strh lr, [sp] + strh lr, [sp, #2] + str ip, [sp, #8] + bl ov39_02229630 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0222A2A4: .word 0x00005209 + arm_func_end ov39_0222A268 + + arm_func_start ov39_0222A2A8 +ov39_0222A2A8: ; 0x0222A2A8 + ldr ip, _0222A2B0 ; =ov39_02229864 + bx ip + .balign 4, 0 +_0222A2B0: .word ov39_02229864 + arm_func_end ov39_0222A2A8 + + arm_func_start ov39_0222A2B4 +ov39_0222A2B4: ; 0x0222A2B4 + ldr ip, _0222A2BC ; =ov39_0222982C + bx ip + .balign 4, 0 +_0222A2BC: .word ov39_0222982C + arm_func_end ov39_0222A2B4 + + arm_func_start ov39_0222A2C0 +ov39_0222A2C0: ; 0x0222A2C0 + ldr ip, _0222A2C8 ; =ov39_0222A6DC + bx ip + .balign 4, 0 +_0222A2C8: .word ov39_0222A6DC + arm_func_end ov39_0222A2C0 + + arm_func_start ov39_0222A2CC +ov39_0222A2CC: ; 0x0222A2CC + ldr ip, _0222A2E4 ; =ov39_02229630 + mov r1, #0 + mov r2, r0 + ldr r0, _0222A2E8 ; =0x000055F0 + sub r3, r1, #1 + bx ip + .balign 4, 0 +_0222A2E4: .word ov39_02229630 +_0222A2E8: .word 0x000055F0 + arm_func_end ov39_0222A2CC + + arm_func_start ov39_0222A2EC +ov39_0222A2EC: ; 0x0222A2EC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r5, r0 + mov r4, r1 + add lr, sp, #0 + ldmia r5!, {r0, r1, r2, r3} + mov ip, lr + stmia lr!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldr r0, [r5] + mov r1, ip + str r0, [lr] + ldr r0, _0222A338 ; =0x000055F1 + mov r2, r4 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0222A338: .word 0x000055F1 + arm_func_end ov39_0222A2EC + + arm_func_start ov39_0222A33C +ov39_0222A33C: ; 0x0222A33C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14c + sub sp, sp, #0x1c00 + add lr, sp, #0 + mov r5, r0 + mov r4, r1 + mov ip, #0x1d4 +_0222A358: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _0222A358 + ldmia r5, {r0, r1, r2} + stmia lr, {r0, r1, r2} + ldr r0, _0222A390 ; =0x000059D8 + add r1, sp, #0 + mov r2, r4 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #0x14c + add sp, sp, #0x1c00 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0222A390: .word 0x000059D8 + arm_func_end ov39_0222A33C + + arm_func_start ov39_0222A394 +ov39_0222A394: ; 0x0222A394 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov lr, #0 + add ip, sp, #4 + strh lr, [sp] + mov r4, r1 + ldmia r0, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + ldr r0, _0222A3D8 ; =0x000059D9 + add r1, sp, #0 + mov r2, r4 + sub r3, lr, #1 + strh lr, [sp] + strh lr, [sp, #2] + bl ov39_02229630 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0222A3D8: .word 0x000059D9 + arm_func_end ov39_0222A394 + + arm_func_start ov39_0222A3DC +ov39_0222A3DC: ; 0x0222A3DC + stmdb sp!, {lr} + sub sp, sp, #0x1c + mov r2, r1 + add r1, sp, #0 + mov ip, #0 + mov r3, #1 + str ip, [r1] + strh r3, [sp] + str ip, [r1, #4] + str ip, [r1, #8] + str ip, [r1, #0xc] + str ip, [r1, #0x10] + str ip, [r1, #0x14] + str ip, [r1, #0x18] + ldr ip, [r0] + ldr r0, _0222A430 ; =0x000059D9 + sub r3, r3, #2 + str ip, [sp, #0xc] + bl ov39_02229630 + add sp, sp, #0x1c + ldmia sp!, {pc} + .balign 4, 0 +_0222A430: .word 0x000059D9 + arm_func_end ov39_0222A3DC + + arm_func_start ov39_0222A434 +ov39_0222A434: ; 0x0222A434 + stmdb sp!, {lr} + sub sp, sp, #0x1c + mov r2, r1 + add r1, sp, #0 + mov ip, #0 + mov r3, #2 + str ip, [r1] + strh r3, [sp] + str ip, [r1, #4] + str ip, [r1, #8] + str ip, [r1, #0xc] + str ip, [r1, #0x10] + str ip, [r1, #0x14] + str ip, [r1, #0x18] + ldr ip, [r0] + ldr r0, _0222A488 ; =0x000059D9 + sub r3, r3, #3 + str ip, [sp, #0xc] + bl ov39_02229630 + add sp, sp, #0x1c + ldmia sp!, {pc} + .balign 4, 0 +_0222A488: .word 0x000059D9 + arm_func_end ov39_0222A434 + + arm_func_start ov39_0222A48C +ov39_0222A48C: ; 0x0222A48C + stmdb sp!, {lr} + sub sp, sp, #0xc + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov r2, r3 + ldr r0, _0222A4BC ; =0x000059DA + add r1, sp, #0 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0222A4BC: .word 0x000059DA + arm_func_end ov39_0222A48C + + arm_func_start ov39_0222A4C0 +ov39_0222A4C0: ; 0x0222A4C0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + str r0, [sp] + str r1, [sp, #4] + ldr r0, _0222A4E8 ; =0x000059DB + add r1, sp, #0 + mvn r3, #0 + bl ov39_02229630 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0222A4E8: .word 0x000059DB + arm_func_end ov39_0222A4C0 + + arm_func_start ov39_0222A4EC +ov39_0222A4EC: ; 0x0222A4EC + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 + cmp r1, #0 + ldmleia sp!, {r3, r4, r5, pc} + ldr lr, _0222A540 ; =ov39_0222AA7C + mov ip, r5 +_0222A504: + cmp r5, #0 + moveq r4, ip + beq _0222A524 + ldrb r4, [r0] + add r3, r5, r1 + add r3, r4, r3 + and r3, r3, #0xff + ldrb r4, [lr, r3] +_0222A524: + ldrb r3, [r0, r5] + add r5, r5, #1 + cmp r5, r1 + eor r3, r4, r3 + strb r3, [r2], #1 + blt _0222A504 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222A540: .word ov39_0222AA7C + arm_func_end ov39_0222A4EC + + arm_func_start ov39_0222A544 +ov39_0222A544: ; 0x0222A544 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 + cmp r1, #0 + ldmleia sp!, {r3, r4, r5, pc} + ldr lr, _0222A598 ; =ov39_0222AA7C + mov ip, r5 +_0222A55C: + cmp r5, #0 + moveq r4, ip + beq _0222A57C + ldrb r4, [r0] + add r3, r5, r1 + add r3, r4, r3 + and r3, r3, #0xff + ldrb r4, [lr, r3] +_0222A57C: + ldrb r3, [r2, r5] + eor r3, r3, r4 + strb r3, [r2, r5] + add r5, r5, #1 + cmp r5, r1 + blt _0222A55C + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222A598: .word ov39_0222AA7C + arm_func_end ov39_0222A544 + + arm_func_start ov39_0222A59C +ov39_0222A59C: ; 0x0222A59C + ldr r2, _0222A6C8 ; =0x00005209 + cmp r0, r2 + bgt _0222A5F4 + bge _0222A680 + sub r1, r2, #0x3e8 + cmp r0, r1 + bgt _0222A5E4 + ldr r1, _0222A6CC ; =0x00004E20 + cmp r0, r1 + blt _0222A5D8 + beq _0222A668 + add r1, r1, #1 + cmp r0, r1 + beq _0222A670 + b _0222A6B8 +_0222A5D8: + cmp r0, #0 + beq _0222A660 + b _0222A6B8 +_0222A5E4: + sub r1, r2, #1 + cmp r0, r1 + beq _0222A678 + b _0222A6B8 +_0222A5F4: + add r1, r2, #0x3e8 + cmp r0, r1 + bgt _0222A614 + bge _0222A690 + ldr r1, _0222A6D0 ; =0x000055F0 + cmp r0, r1 + beq _0222A688 + b _0222A6B8 +_0222A614: + ldr r2, _0222A6D4 ; =0x000059D8 + cmp r0, r2 + bgt _0222A628 + beq _0222A698 + b _0222A6B8 +_0222A628: + add r1, r2, #3 + cmp r0, r1 + bgt _0222A6B8 + add r1, r2, #1 + cmp r0, r1 + blt _0222A6B8 + beq _0222A6A0 + add r1, r2, #2 + cmp r0, r1 + beq _0222A6A8 + add r1, r2, #3 + cmp r0, r1 + beq _0222A6B0 + b _0222A6B8 +_0222A660: + mov r0, #0x400 + b _0222A6C0 +_0222A668: + mov r0, #0xe0 + b _0222A6C0 +_0222A670: + mov r0, #0xc + b _0222A6C0 +_0222A678: + mov r0, #0x220 + b _0222A6C0 +_0222A680: + mov r0, #0xc + b _0222A6C0 +_0222A688: + mov r0, #0 + b _0222A6C0 +_0222A690: + mov r0, #0x24 + b _0222A6C0 +_0222A698: + ldr r0, _0222A6D8 ; =0x00001D4C + b _0222A6C0 +_0222A6A0: + mov r0, #0x1c + b _0222A6C0 +_0222A6A8: + mov r0, #0xc + b _0222A6C0 +_0222A6B0: + mov r0, #8 + b _0222A6C0 +_0222A6B8: + mvn r0, #0 + bx lr +_0222A6C0: + add r0, r0, #0x140 + bx lr + .balign 4, 0 +_0222A6C8: .word 0x00005209 +_0222A6CC: .word 0x00004E20 +_0222A6D0: .word 0x000055F0 +_0222A6D4: .word 0x000059D8 +_0222A6D8: .word 0x00001D4C + arm_func_end ov39_0222A59C + + arm_func_start ov39_0222A6DC +ov39_0222A6DC: ; 0x0222A6DC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + ldr r6, _0222A88C ; =_0222A9AC + add lr, sp, #0 + mov ip, r0 + mov r5, lr + ldmia r6!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r6!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldr r4, _0222A890 ; =0x00005209 + ldmia r6, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + cmp ip, r4 + bgt _0222A774 + bge _0222A83C + ldr r1, _0222A894 ; =0x00004E20 + cmp ip, r1 + bgt _0222A750 + bge _0222A824 + cmp ip, #0 + bgt _0222A874 + mvn r6, #0 + cmp ip, r6 + blt _0222A874 + beq _0222A7E0 + cmp ip, #0 + beq _0222A81C + b _0222A874 +_0222A750: + add r0, r1, #1 + cmp ip, r0 + bgt _0222A764 + beq _0222A82C + b _0222A874 +_0222A764: + add r0, r1, #0x3e8 + cmp ip, r0 + beq _0222A834 + b _0222A874 +_0222A774: + add r0, r4, #0x3e8 + cmp ip, r0 + bgt _0222A794 + bge _0222A84C + ldr r0, _0222A898 ; =0x000055F0 + cmp ip, r0 + beq _0222A844 + b _0222A874 +_0222A794: + ldr r1, _0222A89C ; =0x000059D8 + cmp ip, r1 + bgt _0222A7A8 + beq _0222A854 + b _0222A874 +_0222A7A8: + add r0, r1, #3 + cmp ip, r0 + bgt _0222A874 + add r0, r1, #1 + cmp ip, r0 + blt _0222A874 + beq _0222A85C + add r0, r1, #2 + cmp ip, r0 + beq _0222A864 + add r0, r1, #3 + cmp ip, r0 + beq _0222A86C + b _0222A874 +_0222A7E0: + mov r7, #0 + mov r4, r6 +_0222A7E8: + ldr r0, [r5, r7, lsl #2] + cmp r0, r4 + beq _0222A808 + bl ov39_0222A6DC + cmp r0, r6 + movgt r6, r0 + add r7, r7, #1 + b _0222A7E8 +_0222A808: + mvn r0, #0 + cmp r6, r0 + bne _0222A880 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A81C: + mov r6, #0x400 + b _0222A880 +_0222A824: + mov r6, #8 + b _0222A880 +_0222A82C: + ldr r6, _0222A8A0 ; =0x0000093C + b _0222A880 +_0222A834: + mov r6, #8 + b _0222A880 +_0222A83C: + ldr r6, _0222A8A4 ; =0x00002B74 + b _0222A880 +_0222A844: + mov r6, #4 + b _0222A880 +_0222A84C: + mov r6, #0x630 + b _0222A880 +_0222A854: + mov r6, #8 + b _0222A880 +_0222A85C: + ldr r6, _0222A8A8 ; =0x00001C24 + b _0222A880 +_0222A864: + sub r6, r1, #0x3c80 + b _0222A880 +_0222A86C: + mov r6, #0 + b _0222A880 +_0222A874: + add sp, sp, #0x30 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0222A880: + add r0, r6, #8 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0222A88C: .word _0222A9AC +_0222A890: .word 0x00005209 +_0222A894: .word 0x00004E20 +_0222A898: .word 0x000055F0 +_0222A89C: .word 0x000059D8 +_0222A8A0: .word 0x0000093C +_0222A8A4: .word 0x00002B74 +_0222A8A8: .word 0x00001C24 + arm_func_end ov39_0222A6DC + + arm_func_start ov39_0222A8AC +ov39_0222A8AC: ; 0x0222A8AC + bx lr + arm_func_end ov39_0222A8AC + + .rodata + +_0222A9AC: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x20, 0x4E, 0x00, 0x00, 0x21, 0x4E, 0x00, 0x00, 0x08, 0x52, 0x00, 0x00, 0x09, 0x52, 0x00, 0x00 + .byte 0xF0, 0x55, 0x00, 0x00, 0xF1, 0x55, 0x00, 0x00, 0xD8, 0x59, 0x00, 0x00, 0xD9, 0x59, 0x00, 0x00 + .byte 0xDA, 0x59, 0x00, 0x00, 0xDB, 0x59, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00 + .byte 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 + + .data + +_0222AA58: + .byte 0x00, 0x00, 0x00, 0x00 + +ov39_0222AA5C: ; 0x0222AA5C + .byte 0x70, 0x6B, 0x67, 0x64 + .byte 0x73, 0x70, 0x72, 0x6F, 0x64, 0x2E, 0x6E, 0x69, 0x6E, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x2E, 0x63 + .byte 0x6F, 0x2E, 0x6A, 0x70, 0x00, 0x00, 0x00, 0x00 + +ov39_0222AA78: ; 0x0222AA78 + .byte 0x2D, 0x2D, 0x00, 0x00 + +ov39_0222AA7C: ; 0x0222AA7C + .byte 0x93, 0x18, 0x33, 0x28 + .byte 0x0B, 0x07, 0x03, 0x82, 0x02, 0x43, 0x8A, 0x86, 0xDB, 0x38, 0x34, 0x19, 0xD6, 0xF9, 0x59, 0xB2 + .byte 0xAD, 0x6A, 0x7D, 0xBC, 0xEE, 0xE0, 0x3A, 0x3F, 0xCA, 0x4C, 0x25, 0x68, 0xF4, 0xA9, 0x5B, 0xF7 + .byte 0x22, 0x60, 0x5A, 0x6F, 0xFA, 0x1B, 0x79, 0xE9, 0x17, 0xB1, 0x00, 0x9C, 0xAA, 0x5E, 0x9D, 0xFF + .byte 0xEA, 0xA0, 0x0D, 0x4B, 0x75, 0xF6, 0x61, 0x85, 0x5D, 0xBB, 0xDC, 0xFB, 0x64, 0x2E, 0x7A, 0xAB + .byte 0xF1, 0xE8, 0x44, 0x0C, 0xB8, 0x8F, 0xA8, 0x0A, 0x8E, 0xBD, 0xE1, 0x3B, 0xFC, 0x3C, 0x9F, 0x1A + .byte 0x56, 0xC5, 0xE2, 0xF5, 0x47, 0xD9, 0xD7, 0x8C, 0xCD, 0x97, 0xF0, 0x7B, 0x8B, 0xC3, 0x4F, 0x45 + .byte 0x04, 0x90, 0x81, 0x1E, 0x6B, 0xC9, 0xD3, 0x73, 0xC6, 0xE7, 0x24, 0xBA, 0x32, 0xF3, 0xC0, 0xEC + .byte 0x57, 0xCC, 0xC4, 0xB6, 0xC1, 0xAE, 0xAF, 0x88, 0xF2, 0x84, 0xCE, 0x4A, 0x0F, 0x94, 0x41, 0xB4 + .byte 0x74, 0x2A, 0xD1, 0x70, 0x1C, 0xD4, 0xB0, 0xC2, 0x09, 0x08, 0x16, 0x9B, 0xB5, 0x8D, 0x2B, 0xD2 + .byte 0x89, 0xB7, 0x99, 0xA1, 0x30, 0x65, 0x54, 0x40, 0x96, 0x71, 0xFE, 0xBF, 0x31, 0x06, 0xE5, 0x14 + .byte 0xE6, 0xDA, 0x48, 0x26, 0xAC, 0x87, 0x9A, 0xD8, 0xA6, 0xEB, 0x92, 0xCF, 0xFD, 0x77, 0x1D, 0x21 + .byte 0x9E, 0x36, 0x35, 0x53, 0x3E, 0xD0, 0xD5, 0x62, 0x58, 0x5F, 0x63, 0x7C, 0x7E, 0x52, 0x29, 0x12 + .byte 0x2C, 0x78, 0x05, 0x91, 0x55, 0xE3, 0xA2, 0xB9, 0xF8, 0x50, 0x95, 0x13, 0x80, 0x7F, 0x11, 0x27 + .byte 0xCB, 0x37, 0x4E, 0x51, 0x15, 0xEF, 0xA7, 0x72, 0x4D, 0x83, 0x49, 0xA4, 0x69, 0xDE, 0x20, 0xA3 + .byte 0x67, 0xDF, 0x10, 0x42, 0x39, 0x6C, 0x2D, 0xC7, 0x23, 0xE4, 0xDD, 0xED, 0xBE, 0x66, 0xB3, 0x2F + .byte 0x01, 0x6E, 0x6D, 0xC8, 0x1F, 0x98, 0xA5, 0x46, 0x76, 0x5C, 0x3D, 0x0E, 0x00, 0x00, 0x00, 0x00 + + .bss + +_0222AB84: + .space 0x6 + +ov39_0222AB8A: ; 0x0222AB8A + .space 0x13A + +ov39_0222ACC4: ; 0x0222ACC4 + .space 0xC0 + +ov39_0222AD84: ; 0x0222AD84 + .space 0x74 + +ov39_0222ADF8: ; 0x0222ADF8 + .space 0xC0 + +ov39_0222AEB8: ; 0x0222AEB8 + .space 0x818 + +ov39_0222B6D0: ; 0x0222B6D0 + .space 0x10 diff --git a/lib/NitroDWC/asm/overlay_45_arm.s b/lib/NitroDWC/asm/overlay_45_arm.s new file mode 100644 index 00000000..99e502a7 --- /dev/null +++ b/lib/NitroDWC/asm/overlay_45_arm.s @@ -0,0 +1,43681 @@ + .include "asm/macros.inc" + .include "overlay_45_arm.inc" + .include "global.inc" + .public _version_NINTENDO_DWC_LOBBY + + .text + + arm_func_start ov45_022310B0 +ov45_022310B0: ; 0x022310B0 + ldr r0, _022310BC ; =_022577C4 + ldr r0, [r0] + bx lr + .balign 4, 0 +_022310BC: .word _022577C4 + arm_func_end ov45_022310B0 + + arm_func_start ov45_022310C0 +ov45_022310C0: ; 0x022310C0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldr r8, [sp, #0x28] + mov r7, r0 + mov r0, r8 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl DWC_CheckUserData + cmp r0, #0 + beq _022310FC + mov r0, r8 + bl DWC_CheckHasProfile + cmp r0, #0 + bne _02231108 +_022310FC: + add sp, sp, #0x10 + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02231108: + ldr r1, [r8, #0x1c] + ldr r0, [sp, #0x2c] + str r1, [sp] + ldr ip, [sp, #0x30] + str r0, [sp, #4] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + str ip, [sp, #8] + mov r4, #1 + str r4, [sp, #0xc] + bl ov45_02231144 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov45_022310C0 + + arm_func_start ov45_02231144 +ov45_02231144: ; 0x02231144 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x30 + ldr r4, _02231430 ; =_022577C4 + mov r8, r0 + ldr r0, [r4] + mov r7, r1 + cmp r0, #0 + mov r6, r2 + mov r5, r3 + addne sp, sp, #0x30 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r3, _02231434 ; =ov45_02236070 + ldr r2, _02231438 ; =ov45_022362B4 + mov r1, #5 + ldr r0, _0223143C ; =0x0000047C + str r3, [sp, #0x24] + str r2, [sp, #0x28] + str r1, [sp, #0x2c] + bl ov45_02242394 + movs r4, r0 + beq _022312D8 + mov r0, #0 + str r0, [r4] + str r0, [r4, #4] + add lr, r4, #8 + mov ip, #4 +_022311B0: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _022311B0 + ldr r1, [r5] + ldr r0, [sp, #0x48] + str r1, [lr] + str r0, [r4, #0x4c] + ldr r0, [sp, #0x54] + str r6, [r4, #0x50] + str r0, [r4, #0x54] + mov r0, #0 + add r2, r4, #0x58 + mov r1, r0 +_022311E8: + str r1, [r2, r0, lsl #2] + add r0, r0, #1 + cmp r0, #3 + blo _022311E8 + str r1, [r4, #0x64] + str r1, [r4, #0x68] + str r1, [r4, #0x6c] + str r1, [r4, #0x70] + mov r0, #5 + str r0, [r4, #0xb8] + add r0, r4, #0xbc + mov r3, #0 +_02231218: + str r3, [r0, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02231218 + mov r0, #5 + str r0, [r4, #0xd0] + add r0, r4, #0xd4 + mov r2, #0 +_02231238: + str r2, [r0, r3, lsl #2] + add r3, r3, #1 + cmp r3, #3 + blo _02231238 + ldr r0, _02231440 ; =ov45_02254FA0 + add r1, r4, #0xf0 + str r0, [r4, #0xe8] + str r2, [r4, #0xec] + str r2, [r4, #0xf0] + str r1, [r4, #0xf4] + ldr r0, _02231444 ; =ov45_02254FB0 + add r1, sp, #8 + str r0, [r4, #0xf8] + mov r0, #5 + str r0, [r4, #0xfc] + str r2, [r4, #0x100] + str r2, [r4, #0x104] + add r0, sp, #0x14 + str r2, [r4, #0x108] + bl ov00_021ECB94 + add r0, sp, #0x14 + add r1, sp, #8 + bl RTC_ConvertDateTimeToSecond + str r0, [r4, #0x100] + str r1, [r4, #0x104] + mov r0, #1 + mov r2, #0 + str r0, [r4, #0x10c] + str r2, [r4, #0x110] + str r2, [r4, #0x114] + str r2, [r4, #0x118] + str r0, [r4, #0x11c] + sub r0, r2, #1 + str r0, [r4, #0x124] + str r2, [r4, #0x134] + str r2, [r4, #0x138] + add r1, r4, #0x138 + add r0, r4, #0x144 + str r1, [r4, #0x140] + bl ov45_02238B08 +_022312D8: + ldr r0, _02231430 ; =_022577C4 + cmp r4, #0 + str r4, [r0] + addeq sp, sp, #0x30 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r4, [sp, #0x48] + add r3, sp, #0x24 + mov r0, r8 + mov r1, r7 + mov r2, r6 + str r4, [sp] + bl ov45_02240B10 + mov r4, r0 + ldr r1, _02231430 ; =_022577C4 + mov r0, #0 + strb r0, [sp, #4] + cmp r4, #1 + ldr r1, [r1] + beq _02231334 + cmp r4, #2 + moveq r0, #3 + b _02231338 +_02231334: + mov r0, #2 +_02231338: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + cmp r4, #0 + beq _022313F4 + ldr r0, _02231430 ; =_022577C4 + ldr r5, [r0] + cmp r5, #0 + beq _022313E8 + beq _022313DC + add r0, r5, #0x194 + bl ov45_0223770C + add r0, r5, #0x17c + bl ov45_02236AE8 + add r0, r5, #0x170 + bl ov45_0223775C + add r0, r5, #0x134 + bl ov45_02236CB0 + add r0, r5, #0x134 + bl ov45_02236E38 + ldr r1, _02231440 ; =ov45_02254FA0 + add r0, r5, #0xe8 + str r1, [r5, #0xe8] + bl ov45_0223DF4C + add r0, r5, #0x110 + bl ov45_022379D4 + add r0, r5, #0xec + bl ov45_02236B88 + add r0, r5, #0xd4 + bl ov45_02237BC8 + add r0, r5, #0xbc + bl ov45_02237BC8 + add r0, r5, #0x58 + bl ov45_02237BC8 + cmp r5, #0 + beq _022313DC + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl ov00_021EC2EC +_022313DC: + ldr r0, _02231430 ; =_022577C4 + mov r1, #0 + str r1, [r0] +_022313E8: + add sp, sp, #0x30 + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022313F4: + ldr r0, _02231430 ; =_022577C4 + ldr r1, [sp, #0x48] + ldr r0, [r0] + ldr r2, [sp, #0x4c] + ldr r3, [sp, #0x50] + add r0, r0, #0xe8 + bl ov45_0223E100 + bl ov45_022335A0 + ldr r0, _02231430 ; =_022577C4 + mov r2, #1 + ldr r1, [r0] + mov r0, #0 + str r2, [r1] + add sp, sp, #0x30 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02231430: .word _022577C4 +_02231434: .word ov45_02236070 +_02231438: .word ov45_022362B4 +_0223143C: .word 0x0000047C +_02231440: .word ov45_02254FA0 +_02231444: .word ov45_02254FB0 + arm_func_end ov45_02231144 + + arm_func_start ov45_02231448 +ov45_02231448: ; 0x02231448 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x18 + bl ov45_022379D4 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02231448 + + arm_func_start ov45_02231460 +ov45_02231460: ; 0x02231460 + stmdb sp!, {r4, lr} + ldr r1, _0223148C ; =ov45_02254FA0 + mov r4, r0 + str r1, [r4] + bl ov45_0223DF4C + add r0, r4, #0x28 + bl ov45_022379D4 + add r0, r4, #4 + bl ov45_02236B88 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223148C: .word ov45_02254FA0 + arm_func_end ov45_02231460 + + arm_func_start ov45_02231490 +ov45_02231490: ; 0x02231490 + stmdb sp!, {r3, lr} + ldr r0, _02231510 ; =_022577C4 + ldr r1, [r0] + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r1] + cmp r0, #9 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x134 + bl ov45_02236CB0 + ldr r0, _02231510 ; =_022577C4 + mov r1, #9 + ldr r0, [r0] + str r1, [r0] + bl ov45_02240F9C + ldr r1, _02231510 ; =_022577C4 + mov r2, #0 + strb r2, [sp] + cmp r0, #1 + ldr r3, [r1] + beq _022314F8 + cmp r0, #2 + moveq r2, #3 + b _022314FC +_022314F8: + mov r2, #2 +_022314FC: + cmp r2, #0 + strne r2, [r3, #4] + movne r1, #0xa + strne r1, [r3] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02231510: .word _022577C4 + arm_func_end ov45_02231490 + + arm_func_start ov45_02231514 +ov45_02231514: ; 0x02231514 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x6c + ldr r0, _02231C20 ; =ov45_022577D4 + ldr r7, [r0] + mov r0, #0 + cmp r7, #0 + beq _022317B0 + str r0, [sp, #0x10] + bl ov45_022545F0 + cmp r0, #0 + beq _02231734 + cmp r0, #1 + beq _02231620 + cmp r0, #8 + bne _02231778 + add r0, sp, #0x10 + bl ov45_02254774 + mov r5, r0 + ldr r1, [sp, #0x10] + mov r0, #0 + bl ov00_021EC2A8 + movs r4, r0 + beq _02231580 + ldr r2, [sp, #0x10] + mov r0, r5 + mov r1, r4 + bl MI_CpuCopy8 +_02231580: + cmp r4, #0 + beq _022315C8 + ldr r6, [r7, #0x38] + ldr r5, [sp, #0x10] + bl ov45_022546F8 + ldr r2, _02231C24 ; =ov45_022577D8 + ldr r0, _02231C20 ; =ov45_022577D4 + ldr r8, [r2] + ldr r3, [r0] + mov r1, r4 + str r3, [r2] + str r8, [r0] + ldr r7, [r7, #0x34] + mov r2, r5 + mov r3, r6 + mov r0, #1 + blx r7 + b _02231600 +_022315C8: + ldr r5, [r7, #0x38] + bl ov45_022546F8 + ldr r3, _02231C24 ; =ov45_022577D8 + mov r0, #0 + ldr r2, _02231C20 ; =ov45_022577D4 + ldr r8, [r3] + ldr r6, [r2] + mov r1, r0 + str r6, [r3] + str r8, [r2] + ldr r6, [r7, #0x34] + mov r2, r0 + mov r3, r5 + blx r6 +_02231600: + cmp r4, #0 + beq _02231618 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02231618: + mov r0, #1 + b _0223177C +_02231620: + bl ov00_021EC210 + ldr r0, [r7, #4] + subs r0, r0, #1 + str r0, [r7, #4] + beq _022316F4 + bl ov45_022546F8 + ldr r0, [r7, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r7, #0xd + ldrne r1, [r7, #0x14] + ldr r0, [r7, #8] + bl ov45_0225443C + ldr r0, [r7, #0x3c] + ldr r4, [r7, #0x2c] + cmp r0, #0 + ldr r0, [r7, #0x18] + beq _022316A0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r7, #0x19 + ldrne r5, [r7, #0x20] + add r0, r7, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r7, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _022316D4 +_022316A0: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r7, #0x19 + ldrne r5, [r7, #0x20] + add r0, r7, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r7, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_022316D4: + cmp r0, #0 + moveq r0, #1 + beq _022316E8 + bl ov45_022546F8 + mov r0, #0 +_022316E8: + cmp r0, #0 + movne r0, #0 + bne _0223177C +_022316F4: + ldr r4, [r7, #0x38] + bl ov45_022546F8 + ldr r3, _02231C24 ; =ov45_022577D8 + mov r0, #0 + ldr r2, _02231C20 ; =ov45_022577D4 + ldr r6, [r3] + ldr r5, [r2] + mov r1, r0 + str r5, [r3] + str r6, [r2] + ldr r5, [r7, #0x34] + mov r2, r0 + mov r3, r4 + blx r5 + mov r0, #1 + b _0223177C +_02231734: + bl ov00_021EC210 + ldr r5, [r7, #0x38] + bl ov45_022546F8 + mov r0, #0 + ldr r4, _02231C24 ; =ov45_022577D8 + ldr r2, _02231C20 ; =ov45_022577D4 + ldr r6, [r4] + mov r3, r5 + ldr r5, [r2] + mov r1, r0 + str r5, [r4] + str r6, [r2] + ldr r4, [r7, #0x34] + mov r2, r0 + blx r4 + mov r0, #1 + b _0223177C +_02231778: + mov r0, #0 +_0223177C: + cmp r0, #0 + ldrne r0, _02231C24 ; =ov45_022577D8 + ldrne r0, [r0] + cmpne r0, #0 + beq _022317AC + beq _022317A0 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_022317A0: + ldr r0, _02231C24 ; =ov45_022577D8 + mov r1, #0 + str r1, [r0] +_022317AC: + mov r0, #1 +_022317B0: + cmp r0, #0 + beq _022317D4 + ldr r0, _02231C28 ; =_022577C4 + ldr r0, [r0] + cmp r0, #0 + bne _022317EC + add sp, sp, #0x6c + mov r0, #9 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022317D4: + ldr r0, _02231C28 ; =_022577C4 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0x6c + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022317EC: + cmp r0, #0 + beq _02231810 + ldr r0, _02231C28 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #0xa + addeq sp, sp, #0x6c + moveq r0, #0xa + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02231810: + bl ov45_02240874 + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _02231918 +_02231820: ; jump table + b _02231838 ; case 0 + b _02231918 ; case 1 + b _02231918 ; case 2 + b _022318E0 ; case 3 + b _02231918 ; case 4 + b _022318FC ; case 5 +_02231838: + bl ov45_02231490 + ldr r0, _02231C28 ; =_022577C4 + ldr r4, [r0] + cmp r4, #0 + beq _022318D4 + beq _022318C8 + add r0, r4, #0x194 + bl ov45_0223770C + add r0, r4, #0x17c + bl ov45_02236AE8 + add r0, r4, #0x170 + bl ov45_0223775C + add r0, r4, #0x134 + bl ov45_02236CB0 + add r0, r4, #0x134 + bl ov45_02236E38 + ldr r1, _02231C2C ; =ov45_02254FA0 + add r0, r4, #0xe8 + str r1, [r4, #0xe8] + bl ov45_0223DF4C + add r0, r4, #0x110 + bl ov45_022379D4 + add r0, r4, #0xec + bl ov45_02236B88 + add r0, r4, #0xd4 + bl ov45_02237BC8 + add r0, r4, #0xbc + bl ov45_02237BC8 + add r0, r4, #0x58 + bl ov45_02237BC8 + cmp r4, #0 + beq _022318C8 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_022318C8: + ldr r0, _02231C28 ; =_022577C4 + mov r1, #0 + str r1, [r0] +_022318D4: + add sp, sp, #0x6c + mov r0, #9 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022318E0: + ldr r0, _02231C28 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1] + cmp r0, #1 + moveq r0, #2 + streq r0, [r1] + b _02231918 +_022318FC: + bl ov45_02240A58 + ldr r1, _02231C28 ; =_022577C4 + cmp r0, #0 + ldr r1, [r1] + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] +_02231918: + ldr r2, _02231C28 ; =_022577C4 + add r0, sp, #0x28 + add r1, sp, #0x38 + ldr r5, [r2] + bl ov00_021ECB94 + add r0, sp, #0x28 + add r1, sp, #0x38 + bl RTC_ConvertDateTimeToSecond + ldr r2, [r5, #0x140] + add r7, r5, #0x138 + mov r6, r0 + mov sb, r1 + str r2, [sp, #0xc] + cmp r2, r7 + beq _022319E8 + mov fp, #1 + mov sl, #0 + add r4, sp, #0xc +_02231960: + ldr r1, [r2, #0x10] + ldr r0, [r2, #0x14] + subs r1, r6, r1 + ldr r8, [r2, #0x18] + sbc r0, sb, r0 + ldr r3, [r2, #0x1c] + subs r1, r8, r1 + sbcs r1, r3, r0 + bge _022319A4 + str r6, [r2, #0x10] + str sb, [r2, #0x14] + ldr r0, [r2, #0x20] + ldr r1, [r2, #0x24] + blx r1 + cmp r0, #0 + moveq r0, sl + beq _022319A8 +_022319A4: + mov r0, fp +_022319A8: + cmp r0, #0 + bne _022319D4 + ldr r8, [sp, #0xc] + mov r0, r4 + bl ov45_02236E58 + add r0, sp, #8 + mov r2, r8 + add r1, r5, #0x134 + str r8, [sp, #4] + bl ov45_02236C40 + b _022319DC +_022319D4: + mov r0, r4 + bl ov45_02236E58 +_022319DC: + ldr r2, [sp, #0xc] + cmp r2, r7 + bne _02231960 +_022319E8: + add r0, r5, #0xe8 + bl ov45_0223E558 + add r0, r5, #0x144 + bl ov45_0223AF28 + ldr r0, _02231C28 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1] + cmp r0, #0xa + addls pc, pc, r0, lsl #2 + b _02231C0C +_02231A10: ; jump table + b _02231A3C ; case 0 + b _02231C0C ; case 1 + b _02231A48 ; case 2 + b _02231A54 ; case 3 + b _02231A74 ; case 4 + b _02231C0C ; case 5 + b _02231AD4 ; case 6 + b _02231B3C ; case 7 + b _02231C0C ; case 8 + b _02231C0C ; case 9 + b _02231C0C ; case 10 +_02231A3C: + add sp, sp, #0x6c + mov r0, #9 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02231A48: + mov r0, #3 + str r0, [r1] + b _02231C0C +_02231A54: + ldr r0, [r1, #0x144] + cmp r0, #2 + movge r0, #1 + movlt r0, #0 + cmp r0, #0 + movne r0, #4 + strne r0, [r1] + b _02231C0C +_02231A74: + ldr r1, _02231C30 ; =ov45_022550B0 + add r0, sp, #0x50 + bl ov45_02237B58 + add r0, sp, #0x44 + add r2, sp, #0x50 + mov r1, #0 + bl ov45_02233994 + ldr r0, [sp, #0x44] + ldr r1, _02231C34 ; =ov45_0223633C + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x45 + ldrne r0, [sp, #0x4c] + mov r2, #0 + bl ov45_02241A20 + add r0, sp, #0x44 + bl ov45_02237BC8 + add r0, sp, #0x50 + bl ov45_02237BC8 + ldr r0, _02231C28 ; =_022577C4 + mov r1, #5 + ldr r0, [r0] + str r1, [r0] + b _02231C0C +_02231AD4: + bl ov45_02233CA0 + cmp r0, #0 + beq _02231B28 + ldr r1, _02231C28 ; =_022577C4 + cmp r0, #1 + ldr r1, [r1] + beq _02231AFC + cmp r0, #2 + beq _02231B04 + b _02231B0C +_02231AFC: + mov r0, #2 + b _02231B10 +_02231B04: + mov r0, #3 + b _02231B10 +_02231B0C: + mov r0, #0 +_02231B10: + cmp r0, #0 + beq _02231C0C + str r0, [r1, #4] + mov r0, #0xa + str r0, [r1] + b _02231C0C +_02231B28: + ldr r0, _02231C28 ; =_022577C4 + mov r1, #7 + ldr r0, [r0] + str r1, [r0] + b _02231C0C +_02231B3C: + bl ov45_02234688 + cmp r0, #0 + beq _02231C0C + ldr r0, _02231C28 ; =_022577C4 + add r7, sp, #0x60 + ldr r4, [r0] + mov r0, #0 + str r0, [r4, #0x10c] + ldr r0, [r4, #0xfc] + mov r6, #1 + str r0, [sp, #0x5c] + add r0, r4, #0x100 + ldmia r0, {r2, r3} + stmia r7, {r2, r3} + ldr r1, [sp, #0x5c] + str r6, [sp, #0x68] + add r0, sp, #0x18 + str r1, [sp, #0x14] + add r5, sp, #0x14 + ldmia r7, {r2, r3} + stmia r0, {r2, r3} + mov r1, r5 + add r0, r4, #0xfc + mov r2, #0x10 + str r6, [sp, #0x20] + str r6, [sp, #0x24] + bl memcmp + cmp r0, #0 + moveq r0, r6 + movne r0, #0 + cmp r0, #0 + bne _02231BE4 + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #0xfc] + add r0, r4, #0x100 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x108] + str r0, [r4, #0x10c] +_02231BE4: + mov r0, #1 + ldr r1, _02231C28 ; =_022577C4 + str r0, [r4, #0x128] + ldr r2, [r1] + mov r3, #8 + str r3, [r2] + ldr r2, [r1] + mov r1, #0 + ldr r2, [r2, #8] + blx r2 +_02231C0C: + ldr r0, _02231C28 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + add sp, sp, #0x6c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02231C20: .word ov45_022577D4 +_02231C24: .word ov45_022577D8 +_02231C28: .word _022577C4 +_02231C2C: .word ov45_02254FA0 +_02231C30: .word ov45_022550B0 +_02231C34: .word ov45_0223633C + arm_func_end ov45_02231514 + + arm_func_start ov45_02231C38 +ov45_02231C38: ; 0x02231C38 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x28 + bl ov45_022379D4 + add r0, r4, #0x18 + bl ov45_02237BC8 + add r0, r4, #0xc + bl ov45_02237BC8 + cmp r4, #0 + beq _02231C70 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02231C70: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02231C38 + + arm_func_start ov45_02231C78 +ov45_02231C78: ; 0x02231C78 + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldrne r0, [r0] + bx lr + arm_func_end ov45_02231C78 + + arm_func_start ov45_02231C8C +ov45_02231C8C: ; 0x02231C8C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x54 + ldr r1, _02231E88 ; =_022577C4 + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + addeq sp, sp, #0x54 + moveq r0, #4 + ldmeqia sp!, {r4, r5, pc} + beq _02231CC8 + ldr r0, [r1] + cmp r0, #0xa + addeq sp, sp, #0x54 + moveq r0, #7 + ldmeqia sp!, {r4, r5, pc} +_02231CC8: + cmp r1, #0 + beq _02231CEC + ldr r0, _02231E88 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x54 + movne r0, #4 + ldmneia sp!, {r4, r5, pc} +_02231CEC: + cmp r1, #0 + beq _02231D14 + ldr r0, [r1, #0xd0] + cmp r0, #5 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + addne sp, sp, #0x54 + movne r0, #4 + ldmneia sp!, {r4, r5, pc} +_02231D14: + ldr r5, _02231E8C ; =ov45_02235C40 + ldr lr, _02231E90 ; =ov45_02235E4C + ldr ip, _02231E94 ; =ov45_02236090 + ldr r3, _02231E98 ; =ov45_022362D0 + ldr r2, _02231E9C ; =ov45_02236A44 + add r0, sp, #0x24 + str r5, [sp, #0x3c] + str lr, [sp, #0x40] + str ip, [sp, #0x44] + str r3, [sp, #0x48] + str r2, [sp, #0x4c] + str r4, [sp, #0x50] + bl ov45_02231EB0 + add r0, sp, #0x30 + add r2, sp, #0x24 + mov r1, r4 + bl ov45_02233994 + add r0, sp, #0x24 + bl ov45_02237BC8 + cmp r4, #4 + addls pc, pc, r4, lsl #2 + b _02231D98 +_02231D6C: ; jump table + b _02231D98 ; case 0 + b _02231D80 ; case 1 + b _02231D80 ; case 2 + b _02231D88 ; case 3 + b _02231D90 ; case 4 +_02231D80: + ldr r2, _02231EA0 ; =ov45_02254D5C + b _02231D9C +_02231D88: + ldr r2, _02231EA4 ; =ov45_02254D1C + b _02231D9C +_02231D90: + ldr r2, _02231EA8 ; =ov45_02254D3C + b _02231D9C +_02231D98: + mov r2, #0 +_02231D9C: + ldr r0, [sp, #0x30] + ldr r1, _02231EAC ; =ov45_02235A94 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x31 + ldrne r0, [sp, #0x38] + add r3, sp, #0x3c + stmia sp, {r1, r4} + ldr r2, [r2, #0x1c] + mov r1, #0 + bl ov45_02241048 + mov r5, r0 + ldr r1, _02231E88 ; =_022577C4 + mov r0, #0 + strb r0, [sp, #8] + cmp r5, #1 + ldr r1, [r1] + beq _02231DF0 + cmp r5, #2 + moveq r0, #3 + b _02231DF4 +_02231DF0: + mov r0, #2 +_02231DF4: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + cmp r5, #0 + beq _02231E20 + add r0, sp, #0x30 + bl ov45_02237BC8 + add sp, sp, #0x54 + mov r0, r5 + ldmia sp!, {r4, r5, pc} +_02231E20: + add r0, sp, #0x10 + str r4, [sp, #0xc] + add r1, sp, #0x30 + add r4, sp, #0xc + bl ov45_02237A24 + mov r1, #0 + ldr r0, _02231E88 ; =_022577C4 + ldr r2, [sp, #0xc] + ldr r5, [r0] + str r1, [r4, #0x10] + str r1, [r4, #0x14] + add r1, sp, #0x10 + str r2, [r5, #0xd0] + add r0, r5, #0xd4 + bl ov45_02237D48 + ldr r1, [sp, #0x1c] + add r0, sp, #0x10 + str r1, [r5, #0xe0] + ldr r1, [sp, #0x20] + str r1, [r5, #0xe4] + bl ov45_02237BC8 + add r0, sp, #0x30 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_02231E88: .word _022577C4 +_02231E8C: .word ov45_02235C40 +_02231E90: .word ov45_02235E4C +_02231E94: .word ov45_02236090 +_02231E98: .word ov45_022362D0 +_02231E9C: .word ov45_02236A44 +_02231EA0: .word ov45_02254D5C +_02231EA4: .word ov45_02254D1C +_02231EA8: .word ov45_02254D3C +_02231EAC: .word ov45_02235A94 + arm_func_end ov45_02231C8C + + arm_func_start ov45_02231EB0 +ov45_02231EB0: ; 0x02231EB0 + ldr ip, _02231EBC ; =ov45_02237A24 + add r1, r1, #0x58 + bx ip + .balign 4, 0 +_02231EBC: .word ov45_02237A24 + arm_func_end ov45_02231EB0 + + arm_func_start ov45_02231EC0 +ov45_02231EC0: ; 0x02231EC0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x40 + ldr r0, _022320B0 ; =_022577C4 + ldr r1, [r0] + cmp r1, #0 + addeq sp, sp, #0x40 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, pc} + beq _02231EF8 + ldr r0, [r1] + cmp r0, #0xa + addeq sp, sp, #0x40 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, pc} +_02231EF8: + cmp r1, #0 + beq _02231F1C + ldr r0, _022320B0 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x40 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, pc} +_02231F1C: + cmp r1, #0 + beq _02231F3C + ldr r0, [r1, #0xd0] + cmp r0, #5 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _02231F48 +_02231F3C: + add sp, sp, #0x40 + mov r0, #4 + ldmia sp!, {r3, r4, r5, pc} +_02231F48: + add r0, sp, #0x24 + add r1, r1, #0xd0 + bl ov45_022320B4 + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x25 + ldrne r0, [sp, #0x2c] + bl ov45_022412CC + ldr r1, _022320B0 ; =_022577C4 + mov r2, #0 + strb r2, [sp] + cmp r0, #1 + ldr r1, [r1] + beq _02231F90 + cmp r0, #2 + moveq r2, #3 + b _02231F94 +_02231F90: + mov r2, #2 +_02231F94: + cmp r2, #0 + strne r2, [r1, #4] + movne r0, #0xa + strne r0, [r1] + add r0, sp, #0x24 + bl ov45_02237BC8 + ldr r0, _022320B0 ; =_022577C4 + mov r1, #0 + ldr r4, [r0] + add r2, sp, #0x18 + mov r0, r1 +_02231FC0: + str r0, [r2, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02231FC0 + mov r2, #5 + add r1, sp, #0x18 + add r0, r4, #0xd4 + str r2, [r4, #0xd0] + bl ov45_02237D48 + mov r1, #0 + str r1, [r4, #0xe0] + add r0, sp, #0x18 + str r1, [r4, #0xe4] + bl ov45_02237BC8 + ldr r0, _022320B0 ; =_022577C4 + mov r1, #0 + ldr r4, [r0] + add r5, sp, #4 + str r1, [r4, #0x10c] + ldr r0, [r4, #0xfc] + add r1, sp, #0x34 + str r0, [sp, #0x30] + add r0, r4, #0x100 + ldmia r0, {r2, r3} + stmia r1, {r2, r3} + ldr ip, [r4, #0x108] + mov r0, #5 + str ip, [sp, #0x3c] + str r0, [sp, #0x30] + str r0, [sp, #4] + ldmia r1, {r2, r3} + add r1, sp, #8 + stmia r1, {r2, r3} + mov r0, #1 + str r0, [sp, #0x14] + mov r1, r5 + add r0, r4, #0xfc + mov r2, #0x10 + str ip, [sp, #0x10] + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _0223209C + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #0xfc] + add r0, r4, #0x100 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x108] + str r0, [r4, #0x10c] +_0223209C: + mov r0, #1 + str r0, [r4, #0x128] + mov r0, #0 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022320B0: .word _022577C4 + arm_func_end ov45_02231EC0 + + arm_func_start ov45_022320B4 +ov45_022320B4: ; 0x022320B4 + ldr ip, _022320C0 ; =ov45_02237A24 + add r1, r1, #4 + bx ip + .balign 4, 0 +_022320C0: .word ov45_02237A24 + arm_func_end ov45_022320B4 + + arm_func_start ov45_022320C4 +ov45_022320C4: ; 0x022320C4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x1c + ldr r1, _0223216C ; =_022577C4 + mov r5, r0 + ldr r4, [r1] + cmp r4, #0 + addeq sp, sp, #0x1c + moveq r0, #4 + ldmeqia sp!, {r4, r5, pc} + beq _02232100 + ldr r0, [r4] + cmp r0, #0xa + addeq sp, sp, #0x1c + moveq r0, #7 + ldmeqia sp!, {r4, r5, pc} +_02232100: + cmp r4, #0 + beq _02232124 + ldr r0, _0223216C ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x1c + movne r0, #4 + ldmneia sp!, {r4, r5, pc} +_02232124: + add r0, sp, #0xc + add r1, sp, #0 + bl ov00_021ECB94 + add r0, sp, #0xc + add r1, sp, #0 + bl RTC_ConvertDateTimeToSecond + stmia r5, {r0, r1} + ldr r2, [r4, #0x14c] + ldr r1, [r4, #0x150] + mov r0, #0 + str r2, [r5, #8] + str r1, [r5, #0xc] + ldr r2, [r4, #0x154] + ldr r1, [r4, #0x158] + str r2, [r5, #0x10] + str r1, [r5, #0x14] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0223216C: .word _022577C4 + arm_func_end ov45_022320C4 + + arm_func_start ov45_02232170 +ov45_02232170: ; 0x02232170 + stmdb sp!, {r3, lr} + ldr r2, _022321DC ; =_022577C4 + ldr r3, [r2] + mov r2, r1 + cmp r3, #0 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + beq _022321A0 + ldr r1, [r3] + cmp r1, #0xa + moveq r0, #7 + ldmeqia sp!, {r3, pc} +_022321A0: + cmp r3, #0 + beq _022321C0 + ldr r1, _022321DC ; =_022577C4 + ldr r1, [r1] + ldr r1, [r1] + cmp r1, #8 + movne r0, #4 + ldmneia sp!, {r3, pc} +_022321C0: + mov r1, r0 + add r0, r3, #0x144 + bl ov45_02238B70 + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022321DC: .word _022577C4 + arm_func_end ov45_02232170 + + arm_func_start ov45_022321E0 +ov45_022321E0: ; 0x022321E0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r0, _022322A0 ; =_022577C4 + ldr r1, [r0] + cmp r1, #0 + addeq sp, sp, #0xc + moveq r0, #3 + ldmeqia sp!, {r3, r4, pc} + beq _02232218 + ldr r0, [r1] + cmp r0, #0xa + addeq sp, sp, #0xc + moveq r0, #3 + ldmeqia sp!, {r3, r4, pc} +_02232218: + cmp r1, #0 + beq _0223223C + ldr r0, _022322A0 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0xc + movne r0, #3 + ldmneia sp!, {r3, r4, pc} +_0223223C: + ldr r0, [r1, #0xd0] + cmp r0, #5 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #0 + add r1, r1, #0xd0 + bl ov45_022320B4 + ldr r0, [sp] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + bl ov45_02240A80 + mov r4, r0 + add r0, sp, #0 + bl ov45_02237BC8 + cmp r4, #0 + movne r0, #2 + moveq r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022322A0: .word _022577C4 + arm_func_end ov45_022321E0 + + arm_func_start ov45_022322A4 +ov45_022322A4: ; 0x022322A4 + stmdb sp!, {r3, lr} + ldr ip, _02232300 ; =_022577C4 + ldr lr, [ip] + cmp lr, #0 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + beq _022322D0 + ldr ip, [lr] + cmp ip, #0xa + moveq r0, #7 + ldmeqia sp!, {r3, pc} +_022322D0: + cmp lr, #0 + beq _022322F0 + ldr ip, _02232300 ; =_022577C4 + ldr ip, [ip] + ldr ip, [ip] + cmp ip, #8 + movne r0, #4 + ldmneia sp!, {r3, pc} +_022322F0: + ldr ip, [sp, #8] + str ip, [sp] + bl ov45_02233434 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232300: .word _022577C4 + arm_func_end ov45_022322A4 + + arm_func_start ov45_02232304 +ov45_02232304: ; 0x02232304 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + ldr r4, _02232428 ; =_022577C4 + mov r6, r0 + ldr ip, [r4] + mov r5, r2 + cmp ip, #0 + mov r4, r3 + addeq sp, sp, #0x14 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + beq _02232348 + ldr r0, [ip] + cmp r0, #0xa + addeq sp, sp, #0x14 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, r6, pc} +_02232348: + cmp ip, #0 + beq _0223236C + ldr r0, _02232428 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x14 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, pc} +_0223236C: + mov r2, r1 + add r0, sp, #8 + add r1, ip, #0xb8 + bl ov45_02232434 + ldr r1, _0223242C ; =ov45_022550B4 + add r0, sp, #8 + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _022323B0 + add r0, sp, #8 + bl ov45_02237BC8 + add sp, sp, #0x14 + mov r0, #5 + ldmia sp!, {r3, r4, r5, r6, pc} +_022323B0: + ldr r0, [sp, #8] + ldr r3, _02232430 ; =ov45_02236308 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #9 + ldrne r0, [sp, #0x10] + mov r1, r6 + mov r2, r5 + str r4, [sp] + bl ov45_022417B4 + mov r4, r0 + ldr r1, _02232428 ; =_022577C4 + mov r0, #0 + strb r0, [sp, #4] + cmp r4, #1 + ldr r1, [r1] + beq _02232400 + cmp r4, #2 + moveq r0, #3 + b _02232404 +_02232400: + mov r0, #2 +_02232404: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + add r0, sp, #8 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02232428: .word _022577C4 +_0223242C: .word ov45_022550B4 +_02232430: .word ov45_02236308 + arm_func_end ov45_02232304 + + arm_func_start ov45_02232434 +ov45_02232434: ; 0x02232434 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + cmp r2, #0 + bne _02232460 + bl ov45_022320B4 + add r3, sp, #0 + ldmia r4, {r0, r1, r2} + add sp, sp, #0xc + stmia r3, {r0, r1, r2} + ldmia sp!, {r3, r4, pc} +_02232460: + add r1, r1, #0x18 + bl ov45_022320B4 + add r3, sp, #0 + ldmia r4, {r0, r1, r2} + stmia r3, {r0, r1, r2} + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02232434 + + arm_func_start ov45_0223247C +ov45_0223247C: ; 0x0223247C + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, _022324FC ; =_022577C4 + ldr lr, [ip] + cmp lr, #0 + addeq sp, sp, #0xc + moveq r0, #4 + ldmeqia sp!, {pc} + beq _022324B4 + ldr ip, [lr] + cmp ip, #0xa + addeq sp, sp, #0xc + moveq r0, #7 + ldmeqia sp!, {pc} +_022324B4: + cmp lr, #0 + beq _022324D8 + ldr ip, _022324FC ; =_022577C4 + ldr ip, [ip] + ldr ip, [ip] + cmp ip, #8 + addne sp, sp, #0xc + movne r0, #4 + ldmneia sp!, {pc} +_022324D8: + stmia sp, {r1, r2} + mov r1, r0 + mov r2, #1 + str r3, [sp, #8] + mov r3, r2 + mvn r0, #0 + bl ov45_0223325C + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_022324FC: .word _022577C4 + arm_func_end ov45_0223247C + + arm_func_start ov45_02232500 +ov45_02232500: ; 0x02232500 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, _0223257C ; =_022577C4 + ldr lr, [ip] + cmp lr, #0 + addeq sp, sp, #0xc + moveq r0, #4 + ldmeqia sp!, {pc} + beq _02232538 + ldr ip, [lr] + cmp ip, #0xa + addeq sp, sp, #0xc + moveq r0, #7 + ldmeqia sp!, {pc} +_02232538: + cmp lr, #0 + beq _0223255C + ldr ip, _0223257C ; =_022577C4 + ldr ip, [ip] + ldr ip, [ip] + cmp ip, #8 + addne sp, sp, #0xc + movne r0, #4 + ldmneia sp!, {pc} +_0223255C: + stmia sp, {r1, r2} + mov r2, #1 + str r3, [sp, #8] + mov r3, r2 + mov r1, #5 + bl ov45_0223325C + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0223257C: .word _022577C4 + arm_func_end ov45_02232500 + + arm_func_start ov45_02232580 +ov45_02232580: ; 0x02232580 + ldr r0, _02232598 ; =_022577C4 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #0x4c] + mvneq r0, #0 + bx lr + .balign 4, 0 +_02232598: .word _022577C4 + arm_func_end ov45_02232580 + + arm_func_start ov45_0223259C +ov45_0223259C: ; 0x0223259C + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldrne r0, [r0] + bx lr + arm_func_end ov45_0223259C + + arm_func_start ov45_022325B0 +ov45_022325B0: ; 0x022325B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x3c + ldr r3, _0223275C ; =_022577C4 + mov r6, r2 + ldr r5, [r3] + cmp r5, #0 + addeq sp, sp, #0x3c + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + beq _022325EC + ldr r2, [r5] + cmp r2, #0xa + addeq sp, sp, #0x3c + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_022325EC: + cmp r5, #0 + beq _02232610 + ldr r2, _0223275C ; =_022577C4 + ldr r2, [r2] + ldr r2, [r2] + cmp r2, #8 + addne sp, sp, #0x3c + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02232610: + mov r2, #0 + str r2, [sp, #0x20] + add r4, r0, r1 + str r2, [sp, #0x24] + str r2, [sp, #0x28] + strb r2, [sp, #9] + strb r2, [sp, #0xa] + strb r2, [sp, #8] + strb r2, [sp, #4] + sub r2, sp, #4 + ldr r1, [sp, #0x1c] + str r4, [r2] + str r1, [r2, #4] + add ip, sp, #0x20 + str r0, [sp, #0x10] + ldr r3, [r2] + add r1, sp, #0x10 + mov r0, ip + str r4, [sp, #0x18] + ldmia r1, {r1, r2} + bl ov45_022327B8 + mov r2, #0 + ldrb r0, [sp, #0xc] + ldr r1, [sp, #0x20] + ldr ip, [sp, #0x24] + str r2, [sp, #0x2c] + str r2, [sp, #0x30] + str r2, [sp, #0x34] + sub r2, sp, #4 + strb r0, [r2] + add r4, sp, #0x2c + ldr r3, [r2] + mov r0, r4 + add r2, r1, ip + bl ov45_022383E0 + mov r0, #1 + cmp r6, #0 + str r0, [r4, #0xc] + strne r0, [r5, #0x11c] + mov r6, r4 + ldr r8, [r5, #0x114] + ldr r0, [r6, #4] + mov r7, #0 + cmp r8, r0 + bne _022326FC + cmp r8, #0 + beq _022326F8 + add r0, r5, #0x110 + bl ov45_02231C78 + mov r4, r0 + mov r0, r6 + bl ov45_02231C78 + mov r1, r0 + mov r0, r4 + mov r2, r8 + bl memcmp + cmp r0, #0 + bne _022326FC +_022326F8: + mov r7, #1 +_022326FC: + cmp r7, #0 + bne _02232738 + add r0, r5, #0x110 + cmp r0, r6 + beq _02232730 + mov r3, #0 + ldmia r6, {r1, r4} + strb r3, [sp, #0xb] + sub r2, sp, #4 + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r4 + bl ov45_02232760 +_02232730: + mov r0, #1 + str r0, [r5, #0x11c] +_02232738: + add r0, sp, #0x2c + bl ov45_022379D4 + mov r1, #1 + add r0, sp, #0x20 + str r1, [r5, #0x12c] + bl ov45_022379D4 + mov r0, #0 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223275C: .word _022577C4 + arm_func_end ov45_022325B0 + + arm_func_start ov45_02232760 +ov45_02232760: ; 0x02232760 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + ldr r1, [r7, #8] + sub r4, r5, r6 + cmp r4, r1 + bls _022327A0 + mov r2, #0 + sub r1, r4, r1 + strb r2, [sp] + bl ov45_02237890 + mov r2, r0 + mov r0, r7 + mov r1, r4 + bl ov45_02237820 +_022327A0: + ldr r0, [r7] + mov r1, r6 + sub r2, r5, r6 + bl memmove + str r4, [r7, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02232760 + + arm_func_start ov45_022327B8 +ov45_022327B8: ; 0x022327B8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r5, r0 + ldr r3, [sp, #0x24] + ldr r2, [sp, #0x1c] + ldr r1, [r5, #8] + sub r4, r3, r2 + cmp r4, r1 + bls _02232800 + mov r2, #0 + sub r1, r4, r1 + strb r2, [sp, #2] + bl ov45_02237890 + mov r2, r0 + mov r0, r5 + mov r1, r4 + bl ov45_02237820 +_02232800: + ldr r1, [sp, #0x1c] + ldr r0, [sp, #0x20] + ldr r3, [sp, #0x24] + str r1, [sp, #4] + str r0, [sp, #8] + cmp r1, r3 + ldr ip, [r5] + beq _02232848 + mov r2, #0 +_02232824: + ldr r0, [sp, #4] + strb r2, [sp] + ldrb r1, [r0], #1 + str r0, [sp, #4] + cmp r0, r3 + strb r1, [sp, #1] + ldrsb r1, [sp, #1] + strb r1, [ip], #1 + bne _02232824 +_02232848: + str r4, [r5, #4] + add sp, sp, #0xc + ldmia sp!, {r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022327B8 + + arm_func_start ov45_0223285C +ov45_0223285C: ; 0x0223285C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x94 + ldr r1, _02232AD8 ; =_022577C4 + mov r5, r0 + ldr r1, [r1] + cmp r1, #0 + addeq sp, sp, #0x94 + moveq r0, #4 + ldmeqia sp!, {r4, r5, pc} + beq _02232898 + ldr r0, [r1] + cmp r0, #0xa + addeq sp, sp, #0x94 + moveq r0, #7 + ldmeqia sp!, {r4, r5, pc} +_02232898: + cmp r1, #0 + beq _022328BC + ldr r0, _02232AD8 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x94 + movne r0, #4 + ldmneia sp!, {r4, r5, pc} +_022328BC: + mov r1, #0 + add r0, sp, #0x88 + mov r2, r1 +_022328C8: + str r2, [r0, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _022328C8 + ldr r0, _02232AD8 ; =_022577C4 + ldr r4, [r0] + ldr r0, [r4, #0x68] + cmp r0, #0 + bne _022329D8 + mov r0, #1 + str r0, [r4, #0x68] + ldr r0, [r5] + add ip, r5, #0x10 + str r0, [r4, #0x74] + ldr r0, [r5, #4] + add r3, r4, #0x84 + str r0, [r4, #0x78] + ldr r0, [r5, #8] + mov r2, #0x10 + str r0, [r4, #0x7c] + ldr r0, [r5, #0xc] + str r0, [r4, #0x80] +_02232920: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _02232920 + add ip, r5, #0x30 + add r3, r4, #0xa4 + mov r2, #0xa +_0223294C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _0223294C + bl ov00_021FF368 + ldr r1, _02232ADC ; =0x10624DD3 + mov r3, #0x3e8 + umull r1, r2, r0, r1 + mov r2, r2, lsr #6 + umull r1, r2, r3, r2 + sub r2, r0, r1 + str r2, [sp] + ldr r3, [r4, #0x4c] + ldr r2, _02232AE0 ; =ov45_02254F88 + add r0, sp, #0x7c + mov r1, #0x14 + bl ov45_02232B24 + add r0, sp, #0x88 + add r1, sp, #0x7c + bl ov45_02237D48 + add r0, sp, #0x7c + bl ov45_02237BC8 + ldr r0, [sp, #0x88] + mov r2, #0x13 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x89 + ldrne r1, [sp, #0x90] + add r0, r4, #0xa4 + bl strncpy + mov r2, #1 +_022329D8: + cmp r2, #0 + bne _022329F4 + add r0, sp, #0x88 + bl ov45_02237BC8 + add sp, sp, #0x94 + mov r0, #4 + ldmia sp!, {r4, r5, pc} +_022329F4: + ldr r0, [sp, #0x88] + mov r2, #0x13 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x89 + ldrne r1, [sp, #0x90] + add r0, r5, #0x30 + bl strncpy + ldr r2, _02232AD8 ; =_022577C4 + add r0, sp, #0x6c + add r1, sp, #0x60 + ldr r4, [r2] + bl ov00_021ECB94 + add r0, sp, #0x6c + add r1, sp, #0x60 + bl RTC_ConvertDateTimeToSecond + mov r2, #0 + subs r0, r0, #0x15 + str r0, [sp, #0x10] + sbc r0, r1, #0 + str r0, [sp, #0x14] + ldr r0, _02232AE4 ; =ov45_02234814 + mov r1, #0x15 + str r1, [sp, #0x18] + str r0, [sp, #0x24] + str r2, [sp, #0x1c] + str r2, [sp, #0x20] + add r0, sp, #0x28 + mov r1, #3 + add r2, sp, #0x10 + bl ov45_02232AE8 + mov r0, #0 + add r2, sp, #0x2c + add lr, sp, #0x48 + add r1, r4, #0x134 + strb r0, [sp, #5] + strb r0, [sp, #4] + ldr r0, [sp, #0x28] + add ip, r2, #8 + str r0, [sp, #0x44] + ldr r4, [r2, #0x10] + ldr r0, [r2, #0x14] + ldmia r2, {r2, r3} + stmia lr, {r2, r3} + add r5, lr, #8 + ldmia ip, {r2, r3} + stmia r5, {r2, r3} + str r0, [lr, #0x14] + add r0, sp, #8 + add r2, sp, #0x44 + str r4, [lr, #0x10] + bl ov45_02236BA8 + add r0, sp, #0x88 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x94 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_02232AD8: .word _022577C4 +_02232ADC: .word 0x10624DD3 +_02232AE0: .word ov45_02254F88 +_02232AE4: .word ov45_02234814 + arm_func_end ov45_0223285C + + arm_func_start ov45_02232AE8 +ov45_02232AE8: ; 0x02232AE8 + stmdb sp!, {r3, lr} + mov lr, r2 + str r1, [r0] + add ip, r0, #4 + ldmia lr, {r2, r3} + stmia ip, {r2, r3} + add r1, lr, #8 + add r0, ip, #8 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r0, [lr, #0x10] + str r0, [ip, #0x10] + ldr r0, [lr, #0x14] + str r0, [ip, #0x14] + ldmia sp!, {r3, pc} + arm_func_end ov45_02232AE8 + + arm_func_start ov45_02232B24 +ov45_02232B24: ; 0x02232B24 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r2, #0 + mov r5, r0 + add r0, sp, #0 + mov r4, r1 + str r2, [sp] + str r2, [sp, #4] + str r2, [sp, #8] + bl ov45_022377AC + add r0, sp, #0 + bl ov45_02232B9C + add r1, sp, #0x20 + bic r3, r1, #3 + ldr r2, [sp, #0x20] + mov r1, r4 + add r3, r3, #4 + bl OS_VSNPrintf + add r0, sp, #0 + bl ov45_02232B9C + mov r1, r0 + mov r0, r5 + bl ov45_02237B58 + add r0, sp, #0 + bl ov45_022379D4 + add sp, sp, #0xc + ldmia sp!, {r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02232B24 + + arm_func_start ov45_02232B9C +ov45_02232B9C: ; 0x02232B9C + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldrne r0, [r0] + bx lr + arm_func_end ov45_02232B9C + + arm_func_start ov45_02232BB0 +ov45_02232BB0: ; 0x02232BB0 + stmdb sp!, {r4, lr} + ldr r1, _02232CA0 ; =_022577C4 + ldr r2, [r1] + cmp r2, #0 + moveq r0, #4 + ldmeqia sp!, {r4, pc} + beq _02232BDC + ldr r1, [r2] + cmp r1, #0xa + moveq r0, #7 + ldmeqia sp!, {r4, pc} +_02232BDC: + cmp r2, #0 + beq _02232BFC + ldr r1, _02232CA0 ; =_022577C4 + ldr r1, [r1] + ldr r1, [r1] + cmp r1, #8 + movne r0, #4 + ldmneia sp!, {r4, pc} +_02232BFC: + ldr r1, _02232CA0 ; =_022577C4 + ldr r4, [r1] + ldr r1, [r4, #0x68] + cmp r1, #0 + moveq r0, #0 + beq _02232C90 + ldr r1, [r0] + add lr, r0, #0x10 + str r1, [r4, #0x74] + ldr r1, [r0, #4] + add ip, r4, #0x84 + str r1, [r4, #0x78] + ldr r1, [r0, #8] + mov r3, #0x10 + str r1, [r4, #0x7c] + ldr r1, [r0, #0xc] + str r1, [r4, #0x80] +_02232C40: + ldrb r2, [lr] + ldrb r1, [lr, #1] + add lr, lr, #2 + subs r3, r3, #1 + strb r2, [ip] + strb r1, [ip, #1] + add ip, ip, #2 + bne _02232C40 + add ip, r0, #0x30 + add r3, r4, #0xa4 + mov r2, #0xa +_02232C6C: + ldrb r1, [ip] + ldrb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _02232C6C + mov r0, #1 +_02232C90: + cmp r0, #0 + moveq r0, #4 + movne r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02232CA0: .word _022577C4 + arm_func_end ov45_02232BB0 + + arm_func_start ov45_02232CA4 +ov45_02232CA4: ; 0x02232CA4 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr r0, _02232D88 ; =_022577C4 + ldr r1, [r0] + cmp r1, #0 + addeq sp, sp, #0x10 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + beq _02232CDC + ldr r0, [r1] + cmp r0, #0xa + addeq sp, sp, #0x10 + moveq r0, #7 + ldmeqia sp!, {r3, pc} +_02232CDC: + cmp r1, #0 + beq _02232D00 + ldr r0, _02232D88 ; =_022577C4 + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #8 + addne sp, sp, #0x10 + movne r0, #4 + ldmneia sp!, {r3, pc} +_02232D00: + ldr r0, _02232D88 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0x68] + cmp r0, #0 + mov r0, #0 + strne r0, [r1, #0x68] + movne r0, #1 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #4 + ldmeqia sp!, {r3, pc} + ldr r0, _02232D88 ; =_022577C4 + mov r1, #0 + ldr r2, [r0] + mov r0, #2 + str r0, [sp] + add r0, r2, #0x74 + str r0, [sp, #4] + mov r0, #0x44 + str r0, [sp, #8] + ldr r0, [r2, #0x4c] + mov r3, r1 + mov r2, #1 + bl ov45_0223325C + ldr r0, _02232D88 ; =_022577C4 + mov r2, #3 + ldr r0, [r0] + add r1, sp, #0xc + add r0, r0, #0x134 + str r2, [sp, #0xc] + bl ov45_02232D8C + mov r0, #0 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02232D88: .word _022577C4 + arm_func_end ov45_02232CA4 + + arm_func_start ov45_02232D8C +ov45_02232D8C: ; 0x02232D8C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + mov r2, r1 + add r0, sp, #8 + mov r1, r4 + bl ov45_02232DDC + ldr r2, [sp, #8] + add r0, r4, #4 + cmp r2, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #4 + mov r1, r4 + str r2, [sp] + bl ov45_02236C40 + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02232D8C + + arm_func_start ov45_02232DDC +ov45_02232DDC: ; 0x02232DDC + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r4, r2 + mov r6, r0 + ldr r2, [r5, #4] + mov r0, r5 + mov r1, r4 + add r3, r5, #4 + bl ov45_02232E30 + add r1, r5, #4 + cmp r0, r1 + beq _02232E1C + ldr r2, [r4] + ldr r1, [r0, #0xc] + cmp r2, r1 + bhs _02232E28 +_02232E1C: + add r0, r5, #4 + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} +_02232E28: + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02232DDC + + arm_func_start ov45_02232E30 +ov45_02232E30: ; 0x02232E30 + cmp r2, #0 + beq _02232E58 + ldr r1, [r1] +_02232E3C: + ldr r0, [r2, #0xc] + cmp r0, r1 + movhs r3, r2 + ldrhs r2, [r2] + ldrlo r2, [r2, #4] + cmp r2, #0 + bne _02232E3C +_02232E58: + mov r0, r3 + bx lr + arm_func_end ov45_02232E30 + + arm_func_start ov45_02232E60 +ov45_02232E60: ; 0x02232E60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x334 + ldr r1, _022331D4 ; =_022577C4 + mov r5, r0 + ldr r2, [r1] + cmp r2, #0 + addeq sp, sp, #0x334 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + beq _02232E9C + ldr r0, [r2] + cmp r0, #0xa + addeq sp, sp, #0x334 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02232E9C: + cmp r5, #0 + blt _02232EAC + cmp r5, #2 + ble _02232EB8 +_02232EAC: + add sp, sp, #0x334 + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02232EB8: + add r1, sp, #0x5c + add r0, r2, #0x144 + bl ov45_0223AEDC + cmp r0, #0 + beq _02232EE0 + ldr r0, _022331D4 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0x6c] + cmp r0, #0 + beq _02232EEC +_02232EE0: + add sp, sp, #0x334 + mov r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02232EEC: + add r0, r1, #0x110 + bl ov45_02231C78 + mov r4, r0 + mov r0, #0 + add r3, sp, #0x30 + mov r1, r0 + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + ldr r2, _022331D4 ; =_022577C4 + str r0, [r3] + ldr r1, [r2] + add r0, r1, #0x110 + bl ov45_02231C78 + ldr r1, _022331D4 ; =_022577C4 + mov r2, #1 + ldr r1, [r1] + ldr r1, [r1, #0x4c] + strh r2, [sp, #0x20] + str r1, [sp, #0x1c] + ldrb r1, [r0, #0x42] + strb r1, [sp, #0x22] + ldrb r1, [r0, #0x39] + add r0, sp, #0x24 + strb r1, [sp, #0x23] + bl OS_GetMacAddress + ldrh r8, [sp, #0x20] + ldrb r7, [sp, #0x22] + ldrb r6, [sp, #0x23] + ldrb r2, [sp, #0x25] + ldrb r3, [sp, #0x24] + ldrb r1, [sp, #0x26] + ldrb r0, [sp, #0x27] + ldrb ip, [sp, #0x28] + strh r8, [sp, #0x34] + ldrb r8, [sp, #0x29] + strb r7, [sp, #0x36] + ldrh r7, [sp, #0x2a] + strb r6, [sp, #0x37] + ldr lr, [sp, #0x1c] + ldr r6, [sp, #0x2c] + strb r2, [sp, #0x39] + ldr r2, [sp, #0x60] + strb r3, [sp, #0x38] + ldr r3, [sp, #0x5c] + strb r1, [sp, #0x3a] + strb r0, [sp, #0x3b] + str lr, [sp, #0x30] + strb ip, [sp, #0x3c] + strb r8, [sp, #0x3d] + strh r7, [sp, #0x3e] + str r6, [sp, #0x40] + str r2, [sp, #0x48] + ldr r1, _022331D4 ; =_022577C4 + str r5, [sp, #0x4c] + str r3, [sp, #0x44] + ldr r3, [r4, #4] + ldr r0, _022331D8 ; =_02254F58 + str r3, [sp, #0x50] + ldr r2, [r1] + ldrb r1, [r4, #0x38] + ldr r5, [r0, #4] + str r1, [sp, #0x54] + ldrh r1, [r4, #0x3c] + strh r1, [sp, #0x58] + ldrb r1, [r4, #0x3e] + strh r1, [sp, #0x5a] + ldr r4, [r0, #0xc] + ldr r0, _022331DC ; =ov45_022577D4 + ldr r1, [r2, #0x50] + ldr r0, [r0] + cmp r1, #0 + moveq r8, #0 + movne r8, #1 + ldr r7, [r2, #0x4c] + cmp r0, #0 + bne _022331B8 + mov r0, #0x40 + bl ov45_02242394 + movs r6, r0 + beq _022330CC + ldr r1, _022331E0 ; =ov45_02254FC0 + mov r0, #3 + str r1, [r6] + str r0, [r6, #4] + mov r1, r4 + add r0, r6, #0xc + str r8, [r6, #8] + bl ov45_02237B58 + mov r1, r5 + add r0, r6, #0x18 + bl ov45_02237B58 + add r2, sp, #0x30 + add r4, r2, #0x2c + mov r1, #0 + str r7, [r6, #0x24] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + ldr r0, _022331E4 ; =ov45_022354AC + str r1, [r6, #0x30] + str r0, [r6, #0x34] + str r1, [r6, #0x38] + str r1, [r6, #0x3c] + strb r1, [sp, #9] + strb r1, [sp, #0xa] + strb r1, [sp, #8] + strb r1, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x18] + str r4, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0xc + str r2, [sp, #0xc] + add r0, r6, #0x28 + str r4, [sp, #0x14] + ldmia r1, {r1, r2} + bl ov45_022327B8 +_022330CC: + ldr r0, _022331DC ; =ov45_022577D4 + str r6, [r0] + ldr r0, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r6, #0xd + ldrne r1, [r6, #0x14] + ldr r0, [r6, #8] + bl ov45_0225443C + ldr r0, [r6, #0x3c] + ldr r4, [r6, #0x2c] + cmp r0, #0 + ldr r0, [r6, #0x18] + beq _0223313C + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _02233170 +_0223313C: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_02233170: + cmp r0, #0 + moveq r0, #1 + beq _02233184 + bl ov45_022546F8 + mov r0, #0 +_02233184: + cmp r0, #0 + bne _022331B8 + ldr r0, _022331DC ; =ov45_022577D4 + ldr r0, [r0] + cmp r0, #0 + beq _022331B8 + beq _022331AC + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_022331AC: + ldr r0, _022331DC ; =ov45_022577D4 + mov r1, #0 + str r1, [r0] +_022331B8: + ldr r0, _022331D4 ; =_022577C4 + mov r2, #1 + ldr r1, [r0] + mov r0, #0 + str r2, [r1, #0x6c] + add sp, sp, #0x334 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022331D4: .word _022577C4 +_022331D8: .word _02254F58 +_022331DC: .word ov45_022577D4 +_022331E0: .word ov45_02254FC0 +_022331E4: .word ov45_022354AC + arm_func_end ov45_02232E60 + + arm_func_start ov45_022331E8 +ov45_022331E8: ; 0x022331E8 + ldr r0, _02233200 ; =_022577C4 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #4] + moveq r0, #0 + bx lr + .balign 4, 0 +_02233200: .word _022577C4 + arm_func_end ov45_022331E8 + + arm_func_start ov45_02233204 +ov45_02233204: ; 0x02233204 + stmdb sp!, {r3, lr} + cmp r0, #4 + addge r0, r0, #0x17c + addge r0, r0, #0x2800 + ldmgeia sp!, {r3, pc} + bl ov45_02240A74 + ldmia sp!, {r3, pc} + arm_func_end ov45_02233204 + + arm_func_start ov45_02233220 +ov45_02233220: ; 0x02233220 + cmp r0, #0 + beq _0223323C + cmp r0, #1 + beq _02233244 + cmp r0, #2 + beq _0223324C + b _02233254 +_0223323C: + mov r0, #0 + bx lr +_02233244: + mov r0, #2 + bx lr +_0223324C: + mov r0, #3 + bx lr +_02233254: + mov r0, #1 + bx lr + arm_func_end ov45_02233220 + + arm_func_start ov45_0223325C +ov45_0223325C: ; 0x0223325C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r5, r0 + mvn r0, #0 + mov r4, r1 + cmp r5, r0 + cmpeq r4, #5 + addeq sp, sp, #0x24 + moveq r0, #3 + ldmeqia sp!, {r4, r5, pc} + mov ip, #0 + add r1, sp, #0x18 + mov r0, ip +_02233290: + str r0, [r1, ip, lsl #2] + add ip, ip, #1 + cmp ip, #3 + blo _02233290 + ldr lr, [sp, #0x38] + mov r0, r2 + mov r1, r3 + ldr r2, [sp, #0x30] + ldr r3, [sp, #0x34] + add ip, sp, #0x18 + str lr, [sp] + str ip, [sp, #4] + bl ov45_0223D7D4 + cmp r0, #0 + bne _022332E0 + add r0, sp, #0x18 + bl ov45_02237BC8 + add sp, sp, #0x24 + mov r0, #3 + ldmia sp!, {r4, r5, pc} +_022332E0: + cmp r4, #5 + bne _02233354 + ldr r0, [sp, #0x18] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x19 + ldrne r1, [sp, #0x20] + mov r0, r5 + bl ov45_022414C0 + mov r4, r0 + ldr r1, _0223342C ; =_022577C4 + mov r0, #0 + strb r0, [sp, #9] + cmp r4, #1 + ldr r1, [r1] + beq _0223332C + cmp r4, #2 + moveq r0, #3 + b _02233330 +_0223332C: + mov r0, #2 +_02233330: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + add r0, sp, #0x18 + bl ov45_02237BC8 + add sp, sp, #0x24 + mov r0, r4 + ldmia sp!, {r4, r5, pc} +_02233354: + ldr r1, _0223342C ; =_022577C4 + add r0, sp, #0xc + ldr r1, [r1] + mov r2, r4 + add r1, r1, #0xb8 + bl ov45_02232434 + ldr r1, _02233430 ; =ov45_022550B4 + add r0, sp, #0xc + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _022333A8 + add r0, sp, #0xc + bl ov45_02237BC8 + add r0, sp, #0x18 + bl ov45_02237BC8 + add sp, sp, #0x24 + mov r0, #5 + ldmia sp!, {r4, r5, pc} +_022333A8: + ldr r0, [sp, #0x18] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0xc] + addeq r1, sp, #0x19 + mov r0, r0, lsl #0x1f + ldrne r1, [sp, #0x20] + movs r0, r0, lsr #0x1f + addeq r0, sp, #0xd + ldrne r0, [sp, #0x14] + bl ov45_022413D4 + mov r4, r0 + ldr r1, _0223342C ; =_022577C4 + mov r0, #0 + strb r0, [sp, #8] + cmp r4, #1 + ldr r1, [r1] + beq _022333FC + cmp r4, #2 + moveq r0, #3 + b _02233400 +_022333FC: + mov r0, #2 +_02233400: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + add r0, sp, #0xc + bl ov45_02237BC8 + add r0, sp, #0x18 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0223342C: .word _022577C4 +_02233430: .word ov45_022550B4 + arm_func_end ov45_0223325C + + arm_func_start ov45_02233434 +ov45_02233434: ; 0x02233434 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + ldr r4, _02233594 ; =_022577C4 + mov r6, r0 + ldr r4, [r4] + mov r5, r2 + mov r2, r1 + add r1, r4, #0xb8 + add r0, sp, #0x10 + mov r4, r3 + bl ov45_02232434 + ldr r1, _02233598 ; =ov45_022550B4 + add r0, sp, #0x10 + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _02233494 + add r0, sp, #0x10 + bl ov45_02237BC8 + add sp, sp, #0x1c + mov r0, #5 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233494: + ldr r1, [sp, #0x30] + cmp r1, #0x12c + bls _022334B4 + add r0, sp, #0x10 + bl ov45_02237BC8 + add sp, sp, #0x1c + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_022334B4: + ldr r0, _0223359C ; =0xAAAAAAAB + add r1, r1, #2 + umull r0, r2, r1, r0 + mov r3, #0 + mov r2, r2, lsr #1 + mov r1, r2, lsl #2 + add r0, sp, #4 + add r1, r1, #1 + str r3, [sp, #4] + str r3, [sp, #8] + str r3, [sp, #0xc] + bl ov45_022377AC + add r0, sp, #4 + bl ov45_02232B9C + mov r2, r0 + ldr r1, [sp, #0x30] + ldr r3, [sp, #8] + mov r0, r4 + bl ov00_021EFF30 + ldr r1, [sp, #4] + mov r2, #0 + strb r2, [r1, r0] + ldr r0, [sp, #0x10] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r4, sp, #0x11 + ldrne r4, [sp, #0x18] + add r0, sp, #4 + bl ov45_02232B9C + mov r3, r0 + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov45_022415CC + mov r4, r0 + ldr r1, _02233594 ; =_022577C4 + mov r0, #0 + strb r0, [sp] + cmp r4, #1 + ldr r1, [r1] + beq _02233564 + cmp r4, #2 + moveq r0, #3 + b _02233568 +_02233564: + mov r0, #2 +_02233568: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + add r0, sp, #4 + bl ov45_022379D4 + add r0, sp, #0x10 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02233594: .word _022577C4 +_02233598: .word ov45_022550B4 +_0223359C: .word 0xAAAAAAAB + arm_func_end ov45_02233434 + + arm_func_start ov45_022335A0 +ov45_022335A0: ; 0x022335A0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc4 + ldr r0, _02233980 ; =_022577C4 + ldr r0, [r0] + add r0, r0, #0x110 + bl ov45_02231C78 + ldr r1, _02233980 ; =_022577C4 + mov r4, r0 + ldr r0, [r1] + add r0, r0, #0x110 + bl ov45_02231C78 + ldr r1, _02233980 ; =_022577C4 + mov r2, #1 + ldr r1, [r1] + ldr r1, [r1, #0x4c] + strh r2, [sp, #0x20] + str r1, [sp, #0x1c] + ldrb r1, [r0, #0x42] + strb r1, [sp, #0x22] + ldrb r1, [r0, #0x39] + add r0, sp, #0x24 + strb r1, [sp, #0x23] + bl OS_GetMacAddress + ldr r0, [r4] + add r3, sp, #0x38 + str r0, [sp, #0x30] + ldr r0, [r4, #4] + add r5, r4, #8 + str r0, [sp, #0x34] + mov r2, #4 +_02233618: + ldrh r1, [r5] + ldrh r0, [r5, #2] + add r5, r5, #4 + subs r2, r2, #1 + strh r1, [r3] + strh r0, [r3, #2] + add r3, r3, #4 + bne _02233618 + ldr r1, [r4, #0x18] + add r0, sp, #0x74 + str r1, [sp, #0x48] + ldr r2, [r4, #0x1c] + add r1, r4, #0x44 + str r2, [sp, #0x4c] + ldrh r3, [r4, #0x20] + ldrh r2, [r4, #0x22] + add r6, sp, #0x7c + add r7, r4, #0x4c + strh r3, [sp, #0x50] + strh r2, [sp, #0x52] + ldrh r3, [r4, #0x24] + ldrh r2, [r4, #0x26] + mov r5, #6 + strh r3, [sp, #0x54] + strh r2, [sp, #0x56] + ldrh r3, [r4, #0x28] + ldrh r2, [r4, #0x2a] + strh r3, [sp, #0x58] + strh r2, [sp, #0x5a] + ldrb r3, [r4, #0x2c] + ldrb r2, [r4, #0x2d] + strb r3, [sp, #0x5c] + strb r2, [sp, #0x5d] + ldrb r3, [r4, #0x2e] + ldrb r2, [r4, #0x2f] + strb r3, [sp, #0x5e] + strb r2, [sp, #0x5f] + ldrb r3, [r4, #0x30] + ldrb r2, [r4, #0x31] + strb r3, [sp, #0x60] + strb r2, [sp, #0x61] + ldrb r3, [r4, #0x32] + ldrb r2, [r4, #0x33] + strb r3, [sp, #0x62] + strb r2, [sp, #0x63] + ldrb r3, [r4, #0x34] + ldrb r2, [r4, #0x35] + strb r3, [sp, #0x64] + strb r2, [sp, #0x65] + ldrb r3, [r4, #0x36] + ldrb r2, [r4, #0x37] + strb r3, [sp, #0x66] + strb r2, [sp, #0x67] + ldrb r2, [r4, #0x38] + strb r2, [sp, #0x68] + ldrb r2, [r4, #0x39] + strb r2, [sp, #0x69] + ldrh r2, [r4, #0x3a] + strh r2, [sp, #0x6a] + ldrh r2, [r4, #0x3c] + strh r2, [sp, #0x6c] + ldrb r2, [r4, #0x3e] + strb r2, [sp, #0x6e] + ldrb r2, [r4, #0x3f] + strb r2, [sp, #0x6f] + ldrb r2, [r4, #0x40] + strb r2, [sp, #0x70] + ldrb r2, [r4, #0x41] + strb r2, [sp, #0x71] + ldrb r2, [r4, #0x42] + strb r2, [sp, #0x72] + ldrb r2, [r4, #0x43] + strb r2, [sp, #0x73] + ldmia r1, {r2, r3} + stmia r0, {r2, r3} +_02233744: + ldrb r1, [r7] + ldrb r0, [r7, #1] + add r7, r7, #2 + subs r5, r5, #1 + strb r1, [r6] + strb r0, [r6, #1] + add r6, r6, #2 + bne _02233744 + add r6, r4, #0x58 + add r5, sp, #0x88 + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r1, _02233980 ; =_022577C4 + ldr r0, _02233984 ; =_02254F58 + ldrh r6, [r4, #0x88] + ldrh r3, [r4, #0x8a] + ldr r2, [r1] + ldr r5, [r0, #0x18] + strh r6, [sp, #0xb8] + strh r3, [sp, #0xba] + ldr r3, [r4, #0x8c] + ldr r1, [r4, #0x90] + str r3, [sp, #0xbc] + str r1, [sp, #0xc0] + ldr r4, [r0, #0xc] + ldr r0, _02233988 ; =ov45_022577D4 + ldr r1, [r2, #0x50] + ldr r0, [r0] + cmp r1, #0 + moveq r8, #0 + movne r8, #1 + cmp r0, #0 + ldr r7, [r2, #0x4c] + addne sp, sp, #0xc4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, #0x40 + bl ov45_02242394 + movs r6, r0 + beq _02233884 + ldr r1, _0223398C ; =ov45_02254FC0 + mov r0, #3 + str r1, [r6] + str r0, [r6, #4] + mov r1, r4 + add r0, r6, #0xc + str r8, [r6, #8] + bl ov45_02237B58 + mov r1, r5 + add r0, r6, #0x18 + bl ov45_02237B58 + add r2, sp, #0x1c + add r4, r2, #0xa8 + mov r1, #0 + str r7, [r6, #0x24] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + ldr r0, _02233990 ; =ov45_02234A88 + str r1, [r6, #0x30] + str r0, [r6, #0x34] + str r1, [r6, #0x38] + str r1, [r6, #0x3c] + strb r1, [sp, #9] + strb r1, [sp, #0xa] + strb r1, [sp, #8] + strb r1, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x18] + str r4, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0xc + str r2, [sp, #0xc] + add r0, r6, #0x28 + str r4, [sp, #0x14] + ldmia r1, {r1, r2} + bl ov45_022327B8 +_02233884: + ldr r0, _02233988 ; =ov45_022577D4 + str r6, [r0] + ldr r0, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r6, #0xd + ldrne r1, [r6, #0x14] + ldr r0, [r6, #8] + bl ov45_0225443C + ldr r0, [r6, #0x3c] + ldr r4, [r6, #0x2c] + cmp r0, #0 + ldr r0, [r6, #0x18] + beq _022338F4 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _02233928 +_022338F4: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_02233928: + cmp r0, #0 + moveq r0, #1 + beq _0223393C + bl ov45_022546F8 + mov r0, #0 +_0223393C: + cmp r0, #0 + addne sp, sp, #0xc4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, _02233988 ; =ov45_022577D4 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0xc4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + beq _0223396C + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_0223396C: + ldr r0, _02233988 ; =ov45_022577D4 + mov r1, #0 + str r1, [r0] + add sp, sp, #0xc4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02233980: .word _022577C4 +_02233984: .word _02254F58 +_02233988: .word ov45_022577D4 +_0223398C: .word ov45_02254FC0 +_02233990: .word ov45_02234A88 + arm_func_end ov45_022335A0 + + arm_func_start ov45_02233994 +ov45_02233994: ; 0x02233994 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + ldr r3, _022339EC ; =_02254D04 + mov r5, r0 + ldr r1, [r3, r1, lsl #2] + add r0, sp, #0xc + mov r4, r2 + bl ov45_02237B58 + ldr r2, _022339F0 ; =ov45_022550B8 + add r0, sp, #0 + add r1, sp, #0xc + bl ov45_02233ABC + add r1, sp, #0 + mov r0, r5 + mov r2, r4 + bl ov45_022339F4 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022339EC: .word _02254D04 +_022339F0: .word ov45_022550B8 + arm_func_end ov45_02233994 + + arm_func_start ov45_022339F4 +ov45_022339F4: ; 0x022339F4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r3, #0 + mov r7, r0 + mov r0, r3 +_02233A08: + str r0, [r7, r3, lsl #2] + add r3, r3, #1 + cmp r3, #3 + blo _02233A08 + ldr r0, [r1] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldmneib r1, {r4, r5} + bne _02233A3C + ldrb r0, [r1] + add r5, r1, #1 + mov r0, r0, lsl #0x18 + mov r4, r0, lsr #0x19 +_02233A3C: + ldr r0, [r2] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r6, [r2, #8] + ldrne r8, [r2, #4] + bne _02233A64 + ldrb r0, [r2] + add r6, r2, #1 + mov r0, r0, lsl #0x18 + mov r8, r0, lsr #0x19 +_02233A64: + mov r0, r7 + add r1, r4, r8 + bl ov45_02237BFC + add r0, r5, r4 + mov r1, #0 + ldrb ip, [sp, #9] + str r0, [sp] + mov r0, r7 + mov r2, r1 + mov r3, r5 + strb ip, [sp, #4] + bl ov45_02238104 + add r1, r6, r8 + ldrb r5, [sp, #8] + str r1, [sp] + mov r1, r4 + mov r3, r6 + mov r2, #0 + strb r5, [sp, #4] + bl ov45_02238104 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov45_022339F4 + + arm_func_start ov45_02233ABC +ov45_02233ABC: ; 0x02233ABC + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r4, r1 + mov r1, #0 + mov r8, r0 + mov r7, r2 + mov r0, r1 +_02233AD8: + str r0, [r8, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02233AD8 + mov r0, r7 + bl strlen + ldr r1, [r4] + mov r6, r0 + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r5, [r4, #8] + ldrne r4, [r4, #4] + bne _02233B1C + ldrb r0, [r4] + add r5, r4, #1 + mov r0, r0, lsl #0x18 + mov r4, r0, lsr #0x19 +_02233B1C: + mov r0, r8 + add r1, r4, r6 + bl ov45_02237BFC + add r0, r5, r4 + mov r1, #0 + ldrb ip, [sp, #9] + str r0, [sp] + mov r0, r8 + mov r2, r1 + mov r3, r5 + strb ip, [sp, #4] + bl ov45_02238104 + add r1, r7, r6 + ldrb r5, [sp, #8] + str r1, [sp] + mov r1, r4 + mov r3, r7 + mov r2, #0 + strb r5, [sp, #4] + bl ov45_02238104 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov45_02233ABC + + arm_func_start ov45_02233B74 +ov45_02233B74: ; 0x02233B74 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _02233BBC ; =_022577C4 + mov r5, r0 + ldr r0, [r1] + ldr r4, [r0, #0x4c] + bl ov00_021FF368 + mov ip, r0 + ldr r0, _02233BC0 ; =0x10624DD3 + mov r1, #0x3e8 + umull r0, r3, ip, r0 + mov r3, r3, lsr #6 + umull r3, r0, r1, r3 + ldr r1, _02233BC4 ; =ov45_022550BC + mov r0, r5 + mov r2, r4 + sub r3, ip, r3 + bl ov45_02233BC8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02233BBC: .word _022577C4 +_02233BC0: .word 0x10624DD3 +_02233BC4: .word ov45_022550BC + arm_func_end ov45_02233B74 + + arm_func_start ov45_02233BC8 +ov45_02233BC8: ; 0x02233BC8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + add r1, sp, #0x24 + mov r6, r0 + mov r0, #0 + bic r4, r1, #3 + ldr r2, [sp, #0x24] + mov r1, r0 + str r0, [sp, #8] + add r3, r4, #4 + str r0, [sp, #4] + str r0, [sp, #0xc] + bl OS_VSNPrintf + ldr r3, [sp, #8] + add r5, r0, #1 + cmp r5, r3 + bls _02233C34 + mov r1, #0 + strb r1, [sp] + sub r0, sp, #4 + strb r1, [r0] + ldr r2, [r0] + add r0, sp, #4 + sub r1, r5, r3 + bl ov45_0223795C + b _02233C4C +_02233C34: + bhs _02233C4C + sub r0, r3, r5 + sub r0, r3, r0 + mov r1, #0 + strb r1, [sp, #1] + str r0, [sp, #8] +_02233C4C: + add r0, sp, #4 + bl ov45_02232B9C + ldr r2, [sp, #0x24] + mov r1, r5 + add r3, r4, #4 + bl OS_VSNPrintf + ldr r1, [sp, #4] + add r0, sp, #4 + add r1, r1, r5 + mov r2, #0 + strb r2, [r1, #-1] + bl ov45_02232B9C + mov r1, r0 + mov r0, r6 + bl ov45_02237B58 + add r0, sp, #4 + bl ov45_022379D4 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02233BC8 + + arm_func_start ov45_02233CA0 +ov45_02233CA0: ; 0x02233CA0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x54 + ldr r0, _02233DF4 ; =_022577C4 + ldr r5, _02233DF8 ; =ov45_02235C40 + ldr lr, _02233DFC ; =ov45_02235E4C + ldr ip, _02233E00 ; =ov45_02236090 + ldr r4, _02233E04 ; =ov45_022362D0 + ldr r3, _02233E08 ; =ov45_02236A44 + ldr r1, [r0] + mov r2, #0 + add r0, sp, #0x24 + str r5, [sp, #0x3c] + str lr, [sp, #0x40] + str ip, [sp, #0x44] + str r4, [sp, #0x48] + str r3, [sp, #0x4c] + str r2, [sp, #0x50] + bl ov45_02231EB0 + add r0, sp, #0x30 + add r2, sp, #0x24 + mov r1, #0 + bl ov45_02233994 + add r0, sp, #0x24 + bl ov45_02237BC8 + ldr r0, [sp, #0x30] + ldr r1, _02233E0C ; =ov45_022354F4 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x31 + ldrne r0, [sp, #0x38] + add r3, sp, #0x3c + str r1, [sp] + mov r1, #0 + mov r2, #0x14 + str r1, [sp, #4] + bl ov45_02241048 + mov r4, r0 + ldr r1, _02233DF4 ; =_022577C4 + mov r0, #0 + strb r0, [sp, #8] + cmp r4, #1 + ldr r1, [r1] + beq _02233D58 + cmp r4, #2 + moveq r0, #3 + b _02233D5C +_02233D58: + mov r0, #2 +_02233D5C: + cmp r0, #0 + strne r0, [r1, #4] + movne r0, #0xa + strne r0, [r1] + cmp r4, #0 + beq _02233D88 + add r0, sp, #0x30 + bl ov45_02237BC8 + add sp, sp, #0x54 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, pc} +_02233D88: + mov r2, #0 + add r0, sp, #0x10 + add r1, sp, #0x30 + str r2, [sp, #0xc] + add r5, sp, #0xc + bl ov45_02237A24 + mov r1, #0 + ldr r0, _02233DF4 ; =_022577C4 + ldr r2, [sp, #0xc] + ldr r6, [r0] + str r1, [r5, #0x10] + str r1, [r5, #0x14] + add r1, sp, #0x10 + str r2, [r6, #0xb8] + add r0, r6, #0xbc + bl ov45_02237D48 + ldr r1, [sp, #0x1c] + add r0, sp, #0x10 + str r1, [r6, #0xc8] + ldr r1, [sp, #0x20] + str r1, [r6, #0xcc] + bl ov45_02237BC8 + add r0, sp, #0x30 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x54 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02233DF4: .word _022577C4 +_02233DF8: .word ov45_02235C40 +_02233DFC: .word ov45_02235E4C +_02233E00: .word ov45_02236090 +_02233E04: .word ov45_022362D0 +_02233E08: .word ov45_02236A44 +_02233E0C: .word ov45_022354F4 + arm_func_end ov45_02233CA0 + + arm_func_start ov45_02233E10 +ov45_02233E10: ; 0x02233E10 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x40 + mov r8, r0 + mov r7, r1 + add r0, sp, #0x28 + mov r1, r2 + mov r6, r3 + bl ov45_02237B58 + ldr r1, _02233FE0 ; =_022577C4 + add r0, sp, #0x10 + ldr r5, [r1] + add sb, sp, #0x28 + add r1, r5, #0xb8 + bl ov45_022320B4 + add r0, sp, #0x10 + mov r1, sb + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x10 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r5, [r5, #0xb8] + bne _02233E9C + add r0, sp, #0x1c + add r1, r5, #0xd0 + bl ov45_022320B4 + add r0, sp, #0x1c + mov r1, sb + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x1c + bl ov45_02237BC8 + cmp r4, #0 + ldrne r5, [r5, #0xd0] + moveq r5, #5 +_02233E9C: + add r0, sp, #0x28 + bl ov45_02237BC8 + cmp r5, #5 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sp, #0x64] + mov r2, #0 + add r1, sp, #0x34 + str r2, [sp, #0x34] + str r2, [sp, #0x38] + str r2, [sp, #0x3c] + bl ov45_02233FE4 + cmp r0, #0 + add r0, sp, #0x34 + bne _02233EE4 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02233EE4: + ldr sb, [sp, #0x38] + cmp sb, #0 + bne _02233EFC + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02233EFC: + bl ov45_02231C78 + ldr r1, [sp, #0x60] + ldr r4, [sp, #0x68] + str r1, [sp] + stmib sp, {r0, sb} + mov r0, r8 + mov r1, r7 + mov r2, r5 + mov r3, r6 + str r4, [sp, #0xc] + bl ov45_0223415C + cmp r0, #0 + beq _02233F40 + add r0, sp, #0x34 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02233F40: + mvn r0, #0 + cmp r6, r0 + beq _02233F8C + ldr r0, _02233FE0 ; =_022577C4 + mov r1, r6 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + cmp r0, #0 + ldrne r0, [r0, #0x38] + cmpne r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _02233F8C + add r0, sp, #0x34 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02233F8C: + ldr r1, _02233FE0 ; =_022577C4 + add r0, sp, #0x34 + ldr r4, [r1] + bl ov45_02231C78 + ldr r2, [sp, #0x60] + ldr r1, [sp, #0x68] + str r2, [sp] + str r0, [sp, #4] + ldr r2, [sp, #0x38] + mov r0, r8 + str r2, [sp, #8] + str r1, [sp, #0xc] + ldr r4, [r4, #0x1c] + mov r1, r7 + mov r2, r5 + mov r3, r6 + blx r4 + add r0, sp, #0x34 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02233FE0: .word _022577C4 + arm_func_end ov45_02233E10 + + arm_func_start ov45_02233FE4 +ov45_02233FE4: ; 0x02233FE4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r2, #0 + mov r5, r1 + strb r2, [sp, #4] + mov r6, r0 + bl strlen + ldr r3, [r5, #4] + mov r4, r0 + cmp r4, r3 + bls _02234034 + mov r1, #0 + strb r1, [sp, #2] + sub r0, sp, #4 + strb r1, [r0] + ldr r2, [r0] + mov r0, r5 + sub r1, r4, r3 + bl ov45_0223795C + b _02234050 +_02234034: + bhs _02234050 + mov r0, #0 + strb r0, [sp, #3] + ldr r1, [r5, #4] + sub r0, r3, r4 + sub r0, r1, r0 + str r0, [r5, #4] +_02234050: + cmp r4, #0 + addeq sp, sp, #8 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl strlen + mov r4, r0 + mov r0, r5 + bl ov45_02231C78 + mov r2, r0 + ldr r3, [r5, #4] + mov r0, r6 + mov r1, r4 + bl ov00_021EFF3C + mov r4, r0 + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r3, [r5, #4] + cmp r4, r3 + bls _022340D0 + mov r1, #0 + strb r1, [sp] + sub r0, sp, #4 + strb r1, [r0] + ldr r2, [r0] + mov r0, r5 + sub r1, r4, r3 + bl ov45_0223795C + b _022340EC +_022340D0: + bhs _022340EC + mov r0, #0 + strb r0, [sp, #1] + ldr r1, [r5, #4] + sub r0, r3, r4 + sub r0, r1, r0 + str r0, [r5, #4] +_022340EC: + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02233FE4 + + arm_func_start ov45_022340F8 +ov45_022340F8: ; 0x022340F8 + stmdb sp!, {r4, lr} + ldr r2, [r1] + mov r4, #0 + mov r2, r2, lsl #0x1f + movs r2, r2, lsr #0x1f + ldrne r3, [r1, #4] + bne _02234120 + ldrb r2, [r1] + mov r2, r2, lsl #0x18 + mov r3, r2, lsr #0x19 +_02234120: + ldr r2, [r0] + mov r2, r2, lsl #0x1f + movs r2, r2, lsr #0x1f + ldrne r2, [r0, #4] + bne _02234140 + ldrb r2, [r0] + mov r2, r2, lsl #0x18 + mov r2, r2, lsr #0x19 +_02234140: + cmp r2, r3 + bne _02234154 + bl ov45_02237F7C + cmp r0, #0 + moveq r4, #1 +_02234154: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_022340F8 + + arm_func_start ov45_0223415C +ov45_0223415C: ; 0x0223415C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x70 + ldr r4, [sp, #0x98] + cmp r2, #0 + ldr sb, [sp, #0x9c] + ldr r8, [sp, #0xa0] + mov sl, r3 + addne sp, sp, #0x70 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _02234538 ; =ov45_022550C4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02234334 + ldr r0, _0223453C ; =_022577C4 + ldr r2, [r0] + ldr r0, [r2, #0x4c] + cmp sl, r0 + addeq sp, sp, #0x70 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, sl + add r0, r2, #0xe8 + bl ov45_0223DEC4 + movs r4, r0 + addeq sp, sp, #0x70 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #0 + str r0, [sp, #0x48] + add r2, sb, r8 + str r0, [sp, #0x4c] + str r0, [sp, #0x50] + strb r0, [sp, #9] + strb r0, [sp, #0xa] + strb r0, [sp, #8] + strb r0, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x24] + str r2, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r0, sp, #0x48 + add r1, sp, #0x18 + str sb, [sp, #0x18] + str r2, [sp, #0x20] + ldmia r1, {r1, r2} + bl ov45_022327B8 + mov r2, #0 + ldrb r0, [sp, #0xc] + ldr r1, [sp, #0x48] + ldr r6, [sp, #0x4c] + str r2, [sp, #0x54] + str r2, [sp, #0x58] + str r2, [sp, #0x5c] + sub r2, sp, #4 + strb r0, [r2] + add r5, sp, #0x54 + ldr r3, [r2] + mov r0, r5 + add r2, r1, r6 + bl ov45_022383E0 + mov r0, #1 + str r0, [r5, #0xc] + ldr r7, [r4, #0x1c] + ldr r0, [sp, #0x58] + mov r6, #0 + cmp r7, r0 + bne _022342AC + cmp r7, #0 + beq _022342A8 + add r0, r4, #0x18 + bl ov45_02231C78 + mov fp, r0 + mov r0, r5 + bl ov45_02231C78 + mov r2, r7 + mov r1, r0 + mov r0, fp + bl memcmp + cmp r0, #0 + bne _022342AC +_022342A8: + mov r6, #1 +_022342AC: + cmp r6, #0 + bne _022342E8 + add r0, r4, #0x18 + cmp r0, r5 + beq _022342E0 + mov r3, #0 + ldmia r5, {r1, r5} + strb r3, [sp, #0xb] + sub r2, sp, #4 + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r5 + bl ov45_02232760 +_022342E0: + mov r0, #1 + str r0, [r4, #0x24] +_022342E8: + add r0, sp, #0x54 + bl ov45_022379D4 + mov r1, #1 + add r0, sp, #0x48 + str r1, [r4, #0x34] + bl ov45_022379D4 + ldr r0, [r4, #0x38] + cmp r0, #0 + beq _02234328 + ldr r1, _0223453C ; =_022577C4 + mov r0, sl + ldr r2, [r1] + mov r1, sb + ldr r3, [r2, #0x24] + mov r2, r8 + blx r3 +_02234328: + add sp, sp, #0x70 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02234334: + ldr r1, _02234540 ; =ov45_022550D4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _02234478 + ldr r0, _0223453C ; =_022577C4 + ldr r2, [r0] + ldr r0, [r2, #0x4c] + cmp sl, r0 + addeq sp, sp, #0x70 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r8, #0x10 + addne sp, sp, #0x70 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, sl + add r0, r2, #0xe8 + bl ov45_0223DEC4 + movs r4, r0 + addeq sp, sp, #0x70 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sb] + add r0, sp, #0x38 + str r1, [sp, #0x34] + add r1, sb, #4 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + add r5, sp, #0x34 + ldr r6, [sb, #0xc] + mov r3, #1 + mov r1, r5 + add r0, r4, #4 + mov r2, #0x10 + str r6, [sp, #0x40] + str r3, [sp, #0x44] + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _02234408 + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #4] + add r0, r4, #8 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x10] + str r0, [r4, #0x14] +_02234408: + mov r0, #1 + str r0, [r4, #0x30] + ldr r0, [r4, #0x38] + cmp r0, #0 + ldrne r0, [r4, #0x14] + cmpne r0, #0 + beq _0223446C + mov r0, #0 + str r0, [r4, #0x14] + ldr r5, [r4, #4] + ldr r2, [r4, #8] + ldr r1, [r4, #0xc] + ldr r3, _0223453C ; =_022577C4 + add r0, sp, #0x28 + add r4, sp, #0x64 + str r5, [sp, #0x30] + str r2, [sp, #0x28] + str r1, [sp, #0x2c] + ldmia r0, {r0, r1, r2} + stmia r4, {r0, r1, r2} + ldr r1, [r3] + mov r0, sl + ldr r2, [r1, #0x20] + mov r1, r4 + blx r2 +_0223446C: + add sp, sp, #0x70 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02234478: + ldr r1, _02234544 ; =ov45_022550E4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _022344D4 + cmp r8, #8 + addne sp, sp, #0x70 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _0223453C ; =_022577C4 + ldr r4, [sb] + ldr r3, [sb, #4] + ldr r1, [r0] + mov r0, #1 + str r0, [r1, #0x148] + add r2, sp, #0x10 + str r4, [sp, #0x10] + str r3, [sp, #0x14] + add r1, r1, #0x14c + ldmia r2, {r2, r3} + add sp, sp, #0x70 + stmia r1, {r2, r3} + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022344D4: + ldr r1, _02234548 ; =ov45_022550F4 + mov r0, r4 + bl strcmp + cmp r0, #0 + bne _0223452C + ldr r0, _0223453C ; =_022577C4 + mov r1, sb + ldr r0, [r0] + mov r2, r8 + add r0, r0, #0x144 + bl ov45_02238C74 + cmp r0, #0 + addeq sp, sp, #0x70 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _0223453C ; =_022577C4 + mov r2, #4 + ldr r1, [r0] + add sp, sp, #0x70 + str r2, [r1, #0x144] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223452C: + mov r0, #0 + add sp, sp, #0x70 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02234538: .word ov45_022550C4 +_0223453C: .word _022577C4 +_02234540: .word ov45_022550D4 +_02234544: .word ov45_022550E4 +_02234548: .word ov45_022550F4 + arm_func_end ov45_0223415C + + arm_func_start ov45_0223454C +ov45_0223454C: ; 0x0223454C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + cmp r2, #0 + mov r5, r1 + mov r4, r3 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r6, #0x10] + cmp r0, #0 + beq _02234658 + cmp r0, #1 + beq _02234588 + cmp r0, #2 + beq _022345F0 + b _0223467C +_02234588: + ldr r0, _02234684 ; =_022577C4 + ldr r2, [r0] + ldr r0, [r2, #0x4c] + cmp r5, r0 + beq _0223467C + add r0, r2, #0xe8 + bl ov45_0223DEC4 + cmp r0, #0 + ldrne r0, [r0, #0x38] + cmpne r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _0223467C + ldr r0, [r6, #8] + cmp r0, #1 + ldreq r0, [sp, #0x10] + cmpeq r0, #0x44 + bne _0223467C + ldr r1, _02234684 ; =_022577C4 + mov r0, r5 + ldr r2, [r1] + mov r1, r4 + ldr r2, [r2, #0x28] + blx r2 + b _0223467C +_022345F0: + ldr r0, _02234684 ; =_022577C4 + ldr r2, [r0] + ldr r0, [r2, #0x4c] + cmp r5, r0 + beq _0223467C + add r0, r2, #0xe8 + bl ov45_0223DEC4 + cmp r0, #0 + ldrne r0, [r0, #0x38] + cmpne r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _0223467C + ldr r0, [r6, #8] + cmp r0, #1 + ldreq r0, [sp, #0x10] + cmpeq r0, #0x44 + bne _0223467C + ldr r1, _02234684 ; =_022577C4 + mov r0, r5 + ldr r2, [r1] + mov r1, r4 + ldr r2, [r2, #0x2c] + blx r2 + b _0223467C +_02234658: + ldr r0, [r6, #8] + cmp r0, #1 + ldreq r0, [sp, #0x10] + cmpeq r0, #4 + bne _0223467C + ldr r0, _02234684 ; =_022577C4 + ldr r0, [r0] + add r0, r0, #0x144 + bl ov45_0223B1C8 +_0223467C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02234684: .word _022577C4 + arm_func_end ov45_0223454C + + arm_func_start ov45_02234688 +ov45_02234688: ; 0x02234688 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r1, _02234760 ; =_022577C4 + add r0, sp, #0 + ldr r1, [r1] + add r1, r1, #0xb8 + bl ov45_022320B4 + ldr r0, [sp] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + bl ov45_02240A80 + cmp r0, #0 + moveq r4, #1 + movne r4, #0 + add r0, sp, #0 + bl ov45_02237BC8 + cmp r4, #0 + addne sp, sp, #0xc + movne r0, #0 + ldmneia sp!, {r3, r4, pc} + ldr r0, _02234760 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0xc8] + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [r1, #0xcc] + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [r1, #0x148] + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [r1, #0x144] + cmp r0, #4 + movge r0, #1 + movlt r0, #0 + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, r1, #0xe8 + bl ov45_0223E4A8 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_02234760: .word _022577C4 + arm_func_end ov45_02234688 + + arm_func_start ov45_02234764 +ov45_02234764: ; 0x02234764 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _022347BC ; =_022577C4 + ldr r4, [r0] + ldr r1, [r4, #0x11c] + cmp r1, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, #0 + str r1, [r4, #0x11c] + ldr r1, [r0] + add r0, r4, #0x110 + ldr r5, [r1, #0x4c] + bl ov45_02231C78 + ldr ip, [r4, #0x114] + mov r3, r0 + ldr r2, _022347C0 ; =ov45_022550C4 + mov r0, r5 + mov r1, #0 + str ip, [sp] + bl ov45_02233434 + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022347BC: .word _022577C4 +_022347C0: .word ov45_022550C4 + arm_func_end ov45_02234764 + + arm_func_start ov45_022347C4 +ov45_022347C4: ; 0x022347C4 + stmdb sp!, {r3, lr} + ldr r0, _0223480C ; =_022577C4 + ldr r3, [r0] + ldr r1, [r3, #0x10c] + cmp r1, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + mov r1, #0 + str r1, [r3, #0x10c] + mov r2, #0x10 + str r2, [sp] + ldr r0, [r0] + ldr r2, _02234810 ; =ov45_022550D4 + ldr r0, [r0, #0x4c] + add r3, r3, #0xfc + bl ov45_02233434 + mov r0, #1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223480C: .word _022577C4 +_02234810: .word ov45_022550D4 + arm_func_end ov45_022347C4 + + arm_func_start ov45_02234814 +ov45_02234814: ; 0x02234814 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _0223486C ; =_022577C4 + ldr r3, [r0] + ldr r0, [r3, #0x68] + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {pc} + mov r2, #1 + str r2, [sp] + add r0, r3, #0x74 + str r0, [sp, #4] + mov r0, #0x44 + str r0, [sp, #8] + mov r1, #0 + ldr r0, [r3, #0x4c] + mov r3, r1 + bl ov45_0223325C + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0223486C: .word _022577C4 + arm_func_end ov45_02234814 + + arm_func_start ov45_02234870 +ov45_02234870: ; 0x02234870 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r1, _022348C0 ; =_022577C4 + add r0, sp, #0 + ldr r1, [r1] + add r1, r1, #0xb8 + bl ov45_022320B4 + ldr r0, [sp] + ldr r1, _022348C4 ; =ov45_022367E0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + mov r2, #0 + bl ov45_02241E24 + add r0, sp, #0 + bl ov45_02237BC8 + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_022348C0: .word _022577C4 +_022348C4: .word ov45_022367E0 + arm_func_end ov45_02234870 + + arm_func_start ov45_022348C8 +ov45_022348C8: ; 0x022348C8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr r0, _02234938 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0x148] + cmp r0, #0 + addne sp, sp, #0x10 + movne r0, #0 + ldmneia sp!, {r3, pc} + add r0, sp, #4 + add r1, r1, #0xb8 + bl ov45_022320B4 + ldr r0, [sp, #4] + mov ip, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #5 + ldrne r0, [sp, #0xc] + ldr r2, _0223493C ; =ov45_022550E4 + ldr r3, _02234940 ; =ov45_0223683C + sub r1, ip, #1 + str ip, [sp] + bl ov45_022417B4 + add r0, sp, #4 + bl ov45_02237BC8 + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02234938: .word _022577C4 +_0223493C: .word ov45_022550E4 +_02234940: .word ov45_0223683C + arm_func_end ov45_022348C8 + + arm_func_start ov45_02234944 +ov45_02234944: ; 0x02234944 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr r0, _022349C0 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0x144] + cmp r0, #4 + movge r0, #1 + movlt r0, #0 + cmp r0, #0 + addne sp, sp, #0x10 + movne r0, #0 + ldmneia sp!, {r3, pc} + add r0, sp, #4 + add r1, r1, #0xb8 + bl ov45_022320B4 + ldr r0, [sp, #4] + mov ip, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #5 + ldrne r0, [sp, #0xc] + ldr r2, _022349C4 ; =ov45_022550F4 + ldr r3, _022349C8 ; =ov45_0223694C + sub r1, ip, #1 + str ip, [sp] + bl ov45_022417B4 + add r0, sp, #4 + bl ov45_02237BC8 + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022349C0: .word _022577C4 +_022349C4: .word ov45_022550F4 +_022349C8: .word ov45_0223694C + arm_func_end ov45_02234944 + + arm_func_start ov45_022349CC +ov45_022349CC: ; 0x022349CC + cmp r0, #0xa + addls pc, pc, r0, lsl #2 + b _02234A1C +_022349D8: ; jump table + b _02234A04 ; case 0 + b _02234A1C ; case 1 + b _02234A1C ; case 2 + b _02234A1C ; case 3 + b _02234A1C ; case 4 + b _02234A1C ; case 5 + b _02234A0C ; case 6 + b _02234A14 ; case 7 + b _02234A14 ; case 8 + b _02234A14 ; case 9 + b _02234A14 ; case 10 +_02234A04: + mov r0, #0 + bx lr +_02234A0C: + mov r0, #1 + bx lr +_02234A14: + mov r0, #2 + bx lr +_02234A1C: + mov r0, #2 + bx lr + arm_func_end ov45_022349CC + + arm_func_start ov45_02234A24 +ov45_02234A24: ; 0x02234A24 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r3 + mov r3, #0 + cmp r0, #0 + ldr r4, [sp, #0x18] + str r3, [r5] + mov r7, r1 + mov r6, r2 + str r3, [r4] + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #4 + movlo r0, #2 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r0, [r7] + bl ov45_022349CC + cmp r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r1, r7, #4 + str r1, [r5] + sub r1, r6, #4 + str r1, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02234A24 + + arm_func_start ov45_02234A88 +ov45_02234A88: ; 0x02234A88 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x38 + ldr r3, _02234D54 ; =_022577C4 + ldr r3, [r3] + cmp r3, #0 + ldrne r3, [r3] + cmpne r3, #9 + addeq sp, sp, #0x38 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r5, #0 + add r4, sp, #0x1c + add r3, sp, #0x20 + str r5, [sp, #0x20] + str r5, [sp, #0x1c] + str r4, [sp] + bl ov45_02234A24 + movs r4, r0 + bne _02234ADC + ldr r0, [sp, #0x1c] + cmp r0, #0x94 + movne r4, #2 +_02234ADC: + cmp r4, #0 + bne _02234AF4 + ldr r0, [sp, #0x20] + ldr r1, [sp, #0x1c] + mov r2, #0 + bl ov45_022325B0 +_02234AF4: + ldr r0, _02234D54 ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r0, [r0] + ldr r2, [sp, #0x1c] + ldr r3, [r0, #0x34] + mov r0, r4 + blx r3 + cmp r4, #0 + beq _02234B34 + ldr r0, _02234D54 ; =_022577C4 + mov r1, #6 + ldr r2, [r0] + mov r0, #0xa + stmia r2, {r0, r1} + add sp, sp, #0x38 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02234B34: + ldr r0, _02234D54 ; =_022577C4 + ldr r0, [r0] + add r0, r0, #0x110 + bl ov45_02231C78 + ldr r1, _02234D54 ; =_022577C4 + mov r2, #1 + ldr r1, [r1] + ldr r1, [r1, #0x4c] + strh r2, [sp, #0x28] + str r1, [sp, #0x24] + ldrb r1, [r0, #0x42] + strb r1, [sp, #0x2a] + ldrb r1, [r0, #0x39] + add r0, sp, #0x2c + strb r1, [sp, #0x2b] + bl OS_GetMacAddress + ldr r0, _02234D58 ; =_02254F58 + ldr r1, _02234D54 ; =_022577C4 + ldr r5, [r0, #0x10] + ldr r1, [r1] + ldr r4, [r0, #0xc] + ldr r0, [r1, #0x50] + ldr r7, [r1, #0x4c] + cmp r0, #0 + ldr r0, _02234D5C ; =ov45_022577D4 + moveq r8, #0 + ldr r0, [r0] + movne r8, #1 + cmp r0, #0 + addne sp, sp, #0x38 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #0x40 + bl ov45_02242394 + movs r6, r0 + beq _02234C58 + ldr r1, _02234D60 ; =ov45_02254FC0 + mov r0, #3 + str r1, [r6] + str r0, [r6, #4] + mov r1, r4 + add r0, r6, #0xc + str r8, [r6, #8] + bl ov45_02237B58 + mov r1, r5 + add r0, r6, #0x18 + bl ov45_02237B58 + add r2, sp, #0x24 + add r4, r2, #0x14 + mov r1, #0 + str r7, [r6, #0x24] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + ldr r0, _02234D64 ; =ov45_02234D68 + str r1, [r6, #0x30] + str r0, [r6, #0x34] + str r1, [r6, #0x38] + mov r0, #1 + str r0, [r6, #0x3c] + strb r1, [sp, #9] + strb r1, [sp, #0xa] + strb r1, [sp, #8] + strb r1, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x18] + str r4, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0xc + str r2, [sp, #0xc] + add r0, r6, #0x28 + str r4, [sp, #0x14] + ldmia r1, {r1, r2} + bl ov45_022327B8 +_02234C58: + ldr r0, _02234D5C ; =ov45_022577D4 + str r6, [r0] + ldr r0, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r6, #0xd + ldrne r1, [r6, #0x14] + ldr r0, [r6, #8] + bl ov45_0225443C + ldr r0, [r6, #0x3c] + ldr r4, [r6, #0x2c] + cmp r0, #0 + ldr r0, [r6, #0x18] + beq _02234CC8 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _02234CFC +_02234CC8: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_02234CFC: + cmp r0, #0 + moveq r0, #1 + beq _02234D10 + bl ov45_022546F8 + mov r0, #0 +_02234D10: + cmp r0, #0 + addne sp, sp, #0x38 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _02234D5C ; =ov45_022577D4 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0x38 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + beq _02234D40 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_02234D40: + ldr r0, _02234D5C ; =ov45_022577D4 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x38 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02234D54: .word _022577C4 +_02234D58: .word _02254F58 +_02234D5C: .word ov45_022577D4 +_02234D60: .word ov45_02254FC0 +_02234D64: .word ov45_02234D68 + arm_func_end ov45_02234A88 + + arm_func_start ov45_02234D68 +ov45_02234D68: ; 0x02234D68 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x50 + ldr r3, _022350E8 ; =_022577C4 + ldr r3, [r3] + cmp r3, #0 + ldrne r3, [r3] + cmpne r3, #9 + addeq sp, sp, #0x50 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r5, #0 + add r4, sp, #0x1c + add r3, sp, #0x20 + str r5, [sp, #0x20] + str r5, [sp, #0x1c] + str r4, [sp] + bl ov45_02234A24 + movs r4, r0 + bne _02234DD0 + ldr r0, _022350E8 ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r0, [r0] + ldr r2, [sp, #0x1c] + add r0, r0, #0x144 + bl ov45_0223AC78 + cmp r0, #0 + moveq r4, #2 +_02234DD0: + ldr r0, _022350E8 ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r2, [r0] + mov r0, r4 + ldr r2, [r2, #0x38] + blx r2 + cmp r4, #0 + beq _02234E0C + ldr r0, _022350E8 ; =_022577C4 + mov r1, #4 + ldr r2, [r0] + mov r0, #0xa + stmia r2, {r0, r1} + add sp, sp, #0x50 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02234E0C: + cmp r0, #0 + beq _02234E2C + ldr r0, _022350E8 ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r0, [r0] + ldr r2, [sp, #0x1c] + add r0, r0, #0x144 + bl ov45_02238C74 +_02234E2C: + ldr r0, _022350E8 ; =_022577C4 + ldr r0, [r0] + add r0, r0, #0x110 + bl ov45_02231C78 + ldr r1, _022350E8 ; =_022577C4 + add r2, sp, #0x38 + mov r3, #0 + ldr r1, [r1] + mov r4, r0 + add r0, r1, #0x110 + str r3, [r2] + str r3, [r2, #4] + str r3, [r2, #8] + str r3, [r2, #0xc] + str r3, [r2, #0x10] + str r3, [r2, #0x14] + bl ov45_02231C78 + ldr r1, _022350E8 ; =_022577C4 + mov r2, #1 + ldr r1, [r1] + ldr r1, [r1, #0x4c] + strh r2, [sp, #0x28] + str r1, [sp, #0x24] + ldrb r1, [r0, #0x42] + strb r1, [sp, #0x2a] + ldrb r1, [r0, #0x39] + add r0, sp, #0x2c + strb r1, [sp, #0x2b] + bl OS_GetMacAddress + ldrh r1, [sp, #0x28] + ldrb r0, [sp, #0x2a] + ldrb sb, [sp, #0x2b] + ldrb lr, [sp, #0x2c] + ldrb ip, [sp, #0x2d] + ldrb r8, [sp, #0x2e] + ldrb r7, [sp, #0x2f] + ldrb r6, [sp, #0x30] + ldrb r5, [sp, #0x31] + ldrh r3, [sp, #0x32] + ldr sl, [sp, #0x24] + ldr r2, [sp, #0x34] + strh r1, [sp, #0x3c] + strb r0, [sp, #0x3e] + str sl, [sp, #0x38] + strb sb, [sp, #0x3f] + strb lr, [sp, #0x40] + strb ip, [sp, #0x41] + strb r8, [sp, #0x42] + strb r7, [sp, #0x43] + strb r6, [sp, #0x44] + strb r5, [sp, #0x45] + ldr r0, _022350EC ; =_02254F58 + str r2, [sp, #0x48] + ldr r1, _022350E8 ; =_022577C4 + strh r3, [sp, #0x46] + ldr r3, [r4, #4] + ldr r2, [r1] + str r3, [sp, #0x4c] + ldr r1, [r2, #0x50] + ldr r5, [r0, #0x14] + ldr r4, [r0, #0xc] + ldr r0, _022350F0 ; =ov45_022577D4 + cmp r1, #0 + moveq r8, #0 + ldr r0, [r0] + movne r8, #1 + cmp r0, #0 + ldr r7, [r2, #0x4c] + addne sp, sp, #0x50 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, #0x40 + bl ov45_02242394 + movs r6, r0 + beq _02234FEC + ldr r1, _022350F4 ; =ov45_02254FC0 + mov r0, #3 + str r1, [r6] + str r0, [r6, #4] + mov r1, r4 + add r0, r6, #0xc + str r8, [r6, #8] + bl ov45_02237B58 + mov r1, r5 + add r0, r6, #0x18 + bl ov45_02237B58 + add r2, sp, #0x38 + add r4, r2, #0x18 + mov r1, #0 + str r7, [r6, #0x24] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + ldr r0, _022350F8 ; =ov45_022350FC + str r1, [r6, #0x30] + str r0, [r6, #0x34] + str r1, [r6, #0x38] + mov r0, #1 + str r0, [r6, #0x3c] + strb r1, [sp, #9] + strb r1, [sp, #0xa] + strb r1, [sp, #8] + strb r1, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x18] + str r4, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0xc + str r2, [sp, #0xc] + add r0, r6, #0x28 + str r4, [sp, #0x14] + ldmia r1, {r1, r2} + bl ov45_022327B8 +_02234FEC: + ldr r0, _022350F0 ; =ov45_022577D4 + str r6, [r0] + ldr r0, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r6, #0xd + ldrne r1, [r6, #0x14] + ldr r0, [r6, #8] + bl ov45_0225443C + ldr r0, [r6, #0x3c] + ldr r4, [r6, #0x2c] + cmp r0, #0 + ldr r0, [r6, #0x18] + beq _0223505C + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _02235090 +_0223505C: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_02235090: + cmp r0, #0 + moveq r0, #1 + beq _022350A4 + bl ov45_022546F8 + mov r0, #0 +_022350A4: + cmp r0, #0 + addne sp, sp, #0x50 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, _022350F0 ; =ov45_022577D4 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0x50 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + beq _022350D4 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_022350D4: + ldr r0, _022350F0 ; =ov45_022577D4 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x50 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_022350E8: .word _022577C4 +_022350EC: .word _02254F58 +_022350F0: .word ov45_022577D4 +_022350F4: .word ov45_02254FC0 +_022350F8: .word ov45_022350FC + arm_func_end ov45_02234D68 + + arm_func_start ov45_022350FC +ov45_022350FC: ; 0x022350FC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x38 + ldr r3, _022353DC ; =_022577C4 + ldr r3, [r3] + cmp r3, #0 + ldrne r3, [r3] + cmpne r3, #9 + addeq sp, sp, #0x38 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r5, #0 + add r4, sp, #0x1c + add r3, sp, #0x20 + str r5, [sp, #0x20] + str r5, [sp, #0x1c] + str r4, [sp] + bl ov45_02234A24 + ldr r2, _022353DC ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r3, [r2] + mov r4, r0 + ldr r2, [sp, #0x1c] + add r0, r3, #0x144 + bl ov45_0223AE84 + cmp r0, #0 + moveq r4, #2 + cmp r4, #0 + beq _02235184 + ldr r0, _022353DC ; =_022577C4 + mov r1, #5 + ldr r2, [r0] + mov r0, #0xa + stmia r2, {r0, r1} + add sp, sp, #0x38 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02235184: + ldr r0, _022353DC ; =_022577C4 + ldr r1, [sp, #0x20] + ldr r0, [r0] + ldr r2, [sp, #0x1c] + add r0, r0, #0x144 + bl ov45_0223ACA4 + ldr r0, _022353DC ; =_022577C4 + ldr r2, [sp, #0x1c] + ldr r0, [r0] + ldr r1, [sp, #0x20] + ldr r3, [r0, #0x3c] + mov r0, r4 + mov r2, r2, lsr #3 + blx r3 + ldr r0, _022353DC ; =_022577C4 + ldr r0, [r0] + add r0, r0, #0x110 + bl ov45_02231C78 + ldr r1, _022353DC ; =_022577C4 + mov r2, #1 + ldr r1, [r1] + ldr r1, [r1, #0x4c] + strh r2, [sp, #0x28] + str r1, [sp, #0x24] + ldrb r1, [r0, #0x42] + strb r1, [sp, #0x2a] + ldrb r1, [r0, #0x39] + add r0, sp, #0x2c + strb r1, [sp, #0x2b] + bl OS_GetMacAddress + ldr r0, _022353E0 ; =_02254F58 + ldr r1, _022353DC ; =_022577C4 + ldr r5, [r0, #8] + ldr r1, [r1] + ldr r4, [r0, #0xc] + ldr r0, [r1, #0x50] + ldr r7, [r1, #0x4c] + cmp r0, #0 + ldr r0, _022353E4 ; =ov45_022577D4 + moveq r8, #0 + ldr r0, [r0] + movne r8, #1 + cmp r0, #0 + addne sp, sp, #0x38 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #0x40 + bl ov45_02242394 + movs r6, r0 + beq _022352E0 + ldr r1, _022353E8 ; =ov45_02254FC0 + mov r0, #3 + str r1, [r6] + str r0, [r6, #4] + mov r1, r4 + add r0, r6, #0xc + str r8, [r6, #8] + bl ov45_02237B58 + mov r1, r5 + add r0, r6, #0x18 + bl ov45_02237B58 + add r2, sp, #0x24 + add r4, r2, #0x14 + mov r1, #0 + str r7, [r6, #0x24] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + ldr r0, _022353EC ; =ov45_022353F0 + str r1, [r6, #0x30] + str r0, [r6, #0x34] + str r1, [r6, #0x38] + mov r0, #1 + str r0, [r6, #0x3c] + strb r1, [sp, #9] + strb r1, [sp, #0xa] + strb r1, [sp, #8] + strb r1, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x18] + str r4, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0xc + str r2, [sp, #0xc] + add r0, r6, #0x28 + str r4, [sp, #0x14] + ldmia r1, {r1, r2} + bl ov45_022327B8 +_022352E0: + ldr r0, _022353E4 ; =ov45_022577D4 + str r6, [r0] + ldr r0, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r6, #0xd + ldrne r1, [r6, #0x14] + ldr r0, [r6, #8] + bl ov45_0225443C + ldr r0, [r6, #0x3c] + ldr r4, [r6, #0x2c] + cmp r0, #0 + ldr r0, [r6, #0x18] + beq _02235350 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_02254A04 + b _02235384 +_02235350: + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r5, r6, #0x19 + ldrne r5, [r6, #0x20] + add r0, r6, #0x28 + bl ov45_02231C78 + mov r1, #0 + str r1, [sp] + mov r2, r0 + ldr r1, [r6, #0x24] + mov r0, r5 + mov r3, r4 + bl ov45_022549E0 +_02235384: + cmp r0, #0 + moveq r0, #1 + beq _02235398 + bl ov45_022546F8 + mov r0, #0 +_02235398: + cmp r0, #0 + addne sp, sp, #0x38 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _022353E4 ; =ov45_022577D4 + ldr r0, [r0] + cmp r0, #0 + addeq sp, sp, #0x38 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + beq _022353C8 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_022353C8: + ldr r0, _022353E4 ; =ov45_022577D4 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x38 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022353DC: .word _022577C4 +_022353E0: .word _02254F58 +_022353E4: .word ov45_022577D4 +_022353E8: .word ov45_02254FC0 +_022353EC: .word ov45_022353F0 + arm_func_end ov45_022350FC + + arm_func_start ov45_022353F0 +ov45_022353F0: ; 0x022353F0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r3, _022354A8 ; =_022577C4 + ldr r3, [r3] + cmp r3, #0 + ldrne r3, [r3] + cmpne r3, #9 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, pc} + mov r3, #0 + add ip, sp, #4 + str r3, [sp, #8] + str r3, [sp, #4] + add r3, sp, #8 + str ip, [sp] + bl ov45_02234A24 + ldr r1, [sp, #4] + mov r4, r0 + cmp r1, #0x2d8 + movne r4, #2 + cmp r4, #0 + beq _02235464 + ldr r0, _022354A8 ; =_022577C4 + mov r1, #7 + ldr r2, [r0] + mov r0, #0xa + stmia r2, {r0, r1} + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} +_02235464: + ldr r0, _022354A8 ; =_022577C4 + ldr r1, [sp, #8] + ldr r0, [r0] + add r0, r0, #0x144 + bl ov45_0223AF04 + ldr r0, _022354A8 ; =_022577C4 + ldr r1, [sp, #8] + ldr r2, [r0] + mov r0, r4 + ldr r2, [r2, #0x40] + blx r2 + ldr r0, _022354A8 ; =_022577C4 + mov r1, #2 + ldr r0, [r0] + str r1, [r0, #0x144] + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022354A8: .word _022577C4 + arm_func_end ov45_022353F0 + + arm_func_start ov45_022354AC +ov45_022354AC: ; 0x022354AC + stmdb sp!, {r3, lr} + ldr r1, _022354F0 ; =_022577C4 + ldr r2, [r1] + cmp r2, #0 + ldrne r1, [r2] + cmpne r1, #9 + ldmeqia sp!, {r3, pc} + mov r3, #0 + ldr r1, _022354F0 ; =_022577C4 + str r3, [r2, #0x6c] + ldr r1, [r1] + cmp r0, #0 + moveq r3, #2 + ldr r1, [r1, #0x44] + mov r0, r3 + blx r1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022354F0: .word _022577C4 + arm_func_end ov45_022354AC + + arm_func_start ov45_022354F4 +ov45_022354F4: ; 0x022354F4 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2b4 + mov r6, r3 + cmp r6, #5 + mov r7, r2 + addeq sp, sp, #0x2b4 + ldmeqia sp!, {r4, r5, r6, r7, pc} + cmp r0, #0 + beq _022359D0 + ldr r0, _02235A78 ; =_022577C4 + mov r4, #0 + ldr r3, [r0] + mov r2, #5 + add r0, sp, #0x288 + add r1, sp, #0x27c + str r4, [r3, #0x70] + str r2, [sp, #0x298] + str r4, [sp, #0x29c] + str r4, [sp, #0x2a0] + str r4, [sp, #0x2a4] + bl ov00_021ECB94 + add r0, sp, #0x288 + add r1, sp, #0x27c + bl RTC_ConvertDateTimeToSecond + ldr r4, [sp, #0x298] + str r0, [sp, #0x29c] + str r1, [sp, #0x2a0] + ldr r2, _02235A78 ; =_022577C4 + str r4, [sp, #0x268] + add r3, sp, #0x29c + ldr r4, [r2] + add ip, sp, #0x26c + ldmia r3, {r2, r3} + stmia ip, {r2, r3} + ldr r1, [sp, #0x2a4] + mov r0, #1 + str r0, [sp, #0x278] + add r5, sp, #0x268 + str r1, [sp, #0x274] + mov r1, r5 + add r0, r4, #0xfc + mov r2, #0x10 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _022355DC + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #0xfc] + add r0, r4, #0x100 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x108] + str r0, [r4, #0x10c] +_022355DC: + ldr r1, _02235A7C ; =ov45_02236690 + mov r3, #1 + mov r0, r7 + mov r2, r6 + str r3, [r4, #0x128] + bl ov45_02241B84 + ldr r2, _02235A78 ; =_022577C4 + add r0, sp, #0x258 + add r1, sp, #0x24c + ldr r4, [r2] + bl ov00_021ECB94 + add r0, sp, #0x258 + add r1, sp, #0x24c + bl RTC_ConvertDateTimeToSecond + mov r2, #0 + subs r0, r0, #3 + str r0, [sp, #0x1fc] + sbc r0, r1, #0 + str r0, [sp, #0x200] + ldr r0, _02235A80 ; =ov45_022347C4 + mov r1, #3 + str r1, [sp, #0x204] + str r0, [sp, #0x210] + str r2, [sp, #0x208] + str r2, [sp, #0x20c] + add r0, sp, #0x214 + mov r1, #1 + add r2, sp, #0x1fc + bl ov45_02232AE8 + mov r0, #0 + add r2, sp, #0x218 + add r7, sp, #0x234 + add r1, r4, #0x134 + strb r0, [sp, #9] + strb r0, [sp, #8] + ldr r0, [sp, #0x214] + add r6, r2, #8 + str r0, [sp, #0x230] + ldr r4, [r2, #0x10] + ldr r0, [r2, #0x14] + ldmia r2, {r2, r3} + stmia r7, {r2, r3} + add r5, r7, #8 + ldmia r6, {r2, r3} + stmia r5, {r2, r3} + str r0, [r7, #0x14] + add r0, sp, #0x2c + add r2, sp, #0x230 + str r4, [r7, #0x10] + bl ov45_02236BA8 + ldr r1, _02235A78 ; =_022577C4 + add r0, sp, #0x1ec + ldr r4, [r1] + add r1, sp, #0x1e0 + bl ov00_021ECB94 + add r0, sp, #0x1ec + add r1, sp, #0x1e0 + bl RTC_ConvertDateTimeToSecond + ldr r6, _02235A84 ; =ov45_02234764 + mov r7, #0 + subs r5, r0, #4 + str r0, [sp, #0x190] + sbc r3, r1, #0 + mov ip, #4 + add r0, sp, #0x1a8 + add r2, sp, #0x190 + mov r1, #2 + str ip, [sp, #0x198] + str r7, [sp, #0x19c] + str r7, [sp, #0x1a0] + str r6, [sp, #0x1a4] + str r5, [sp, #0x190] + str r3, [sp, #0x194] + bl ov45_02232AE8 + ldr r0, [sp, #0x1a8] + add r6, sp, #0x1ac + add r5, sp, #0x1c8 + str r0, [sp, #0x1c4] + ldmia r6, {r2, r3} + stmia r5, {r2, r3} + add r2, r6, #8 + add r0, r5, #8 + ldmia r2, {r2, r3} + stmia r0, {r2, r3} + ldr r2, [r6, #0x10] + ldr r3, [r6, #0x14] + str r2, [r5, #0x10] + add r1, r4, #0x134 + add r0, sp, #0x24 + add r2, sp, #0x1c4 + strb r7, [sp, #7] + strb r7, [sp, #6] + str r3, [r5, #0x14] + bl ov45_02236BA8 + ldr r1, _02235A78 ; =_022577C4 + add r0, sp, #0x180 + ldr r4, [r1] + add r1, sp, #0x174 + bl ov00_021ECB94 + add r0, sp, #0x180 + add r1, sp, #0x174 + bl RTC_ConvertDateTimeToSecond + mov r2, #4 + str r2, [sp, #0x12c] + mov r2, r7 + str r0, [sp, #0x124] + subs r0, r0, #4 + str r0, [sp, #0x124] + str r2, [sp, #0x130] + str r2, [sp, #0x134] + ldr r2, _02235A88 ; =ov45_022348C8 + str r1, [sp, #0x128] + sbc r0, r1, #0 + str r2, [sp, #0x138] + str r0, [sp, #0x128] + add r0, sp, #0x13c + mov r1, #5 + add r2, sp, #0x124 + bl ov45_02232AE8 + ldr r0, [sp, #0x13c] + add r7, sp, #0x140 + add r6, sp, #0x15c + str r0, [sp, #0x158] + ldmia r7, {r2, r3} + mov ip, #0 + stmia r6, {r2, r3} + add r1, r7, #8 + ldmia r1, {r2, r3} + add r0, r6, #8 + stmia r0, {r2, r3} + ldr r5, [r7, #0x10] + ldr r3, [r7, #0x14] + add r0, sp, #0x1c + add r2, sp, #0x158 + add r1, r4, #0x134 + strb ip, [sp, #5] + strb ip, [sp, #4] + str r5, [r6, #0x10] + str r3, [r6, #0x14] + bl ov45_02236BA8 + ldr r2, _02235A78 ; =_022577C4 + add r0, sp, #0x114 + add r1, sp, #0x108 + ldr r4, [r2] + bl ov00_021ECB94 + add r0, sp, #0x114 + add r1, sp, #0x108 + bl RTC_ConvertDateTimeToSecond + mov r2, #3 + str r2, [sp, #0xc0] + mov r2, #0 + str r0, [sp, #0xb8] + subs r0, r0, #3 + str r0, [sp, #0xb8] + str r2, [sp, #0xc4] + str r2, [sp, #0xc8] + ldr r2, _02235A8C ; =ov45_02234870 + str r1, [sp, #0xbc] + sbc r0, r1, #0 + str r2, [sp, #0xcc] + str r0, [sp, #0xbc] + add r0, sp, #0xd0 + mov r1, #4 + add r2, sp, #0xb8 + bl ov45_02232AE8 + mov r0, #0 + add r2, sp, #0xd4 + add r7, sp, #0xf0 + strb r0, [sp, #3] + strb r0, [sp, #2] + ldr r0, [sp, #0xd0] + add r6, r2, #8 + str r0, [sp, #0xec] + ldr r1, [r2, #0x10] + ldr r0, [r2, #0x14] + ldmia r2, {r2, r3} + stmia r7, {r2, r3} + add r5, r7, #8 + ldmia r6, {r2, r3} + stmia r5, {r2, r3} + str r1, [r7, #0x10] + str r0, [r7, #0x14] + add r0, sp, #0x14 + add r2, sp, #0xec + add r1, r4, #0x134 + bl ov45_02236BA8 + ldr r2, _02235A78 ; =_022577C4 + add r0, sp, #0xa8 + add r1, sp, #0x9c + ldr r4, [r2] + bl ov00_021ECB94 + add r0, sp, #0xa8 + add r1, sp, #0x9c + bl RTC_ConvertDateTimeToSecond + mov r2, #0 + subs r0, r0, #4 + str r0, [sp, #0x4c] + sbc r0, r1, #0 + str r0, [sp, #0x50] + ldr r0, _02235A90 ; =ov45_02234944 + mov r1, #4 + str r1, [sp, #0x54] + str r0, [sp, #0x60] + str r2, [sp, #0x58] + str r2, [sp, #0x5c] + add r0, sp, #0x64 + mov r1, #6 + add r2, sp, #0x4c + bl ov45_02232AE8 + mov r0, #0 + add r2, sp, #0x68 + add r7, sp, #0x84 + add r1, r4, #0x134 + strb r0, [sp, #1] + strb r0, [sp] + ldr r0, [sp, #0x64] + add r6, r2, #8 + str r0, [sp, #0x80] + ldr r4, [r2, #0x10] + ldr r0, [r2, #0x14] + ldmia r2, {r2, r3} + stmia r7, {r2, r3} + add r5, r7, #8 + ldmia r6, {r2, r3} + stmia r5, {r2, r3} + str r0, [r7, #0x14] + add r0, sp, #0xc + add r2, sp, #0x80 + str r4, [r7, #0x10] + bl ov45_02236BA8 + ldr r0, _02235A78 ; =_022577C4 + add r1, sp, #0x40 + ldr r4, [r0] + add r3, sp, #0x2a8 + ldr r0, [r4, #0x100] + ldr r2, [r4, #0xfc] + str r0, [sp, #0x40] + ldr r0, [r4, #0x104] + str r2, [sp, #0x48] + str r0, [sp, #0x44] + ldmia r1, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r5, [r4, #0x124] + add r0, r4, #0x110 + bl ov45_02231C78 + ldr r3, [r4, #0x114] + mov r2, r0 + ldr r4, [r4, #0xc] + add r1, sp, #0x2a8 + mov r0, r5 + blx r4 + add sp, sp, #0x2b4 + ldmia sp!, {r4, r5, r6, r7, pc} +_022359D0: + ldr r0, _02235A78 ; =_022577C4 + mov r1, #0 + ldr r4, [r0] + add r2, sp, #0x34 + mov r0, r1 +_022359E4: + str r0, [r2, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _022359E4 + mov r2, #5 + add r1, sp, #0x34 + add r0, r4, #0xbc + str r2, [r4, #0xb8] + bl ov45_02237D48 + mov r1, #0 + str r1, [r4, #0xc8] + add r0, sp, #0x34 + str r1, [r4, #0xcc] + bl ov45_02237BC8 + ldr r0, _02235A78 ; =_022577C4 + ldr r1, [r0] + ldr r0, [r1, #0x70] + cmp r0, #3 + movge r0, #0 + addlt r0, r0, #1 + strlt r0, [r1, #0x70] + movlt r0, #1 + cmp r0, #0 + beq _02235A5C + ldr r0, _02235A78 ; =_022577C4 + mov r1, #4 + ldr r0, [r0] + add sp, sp, #0x2b4 + str r1, [r0] + ldmia sp!, {r4, r5, r6, r7, pc} +_02235A5C: + ldr r0, _02235A78 ; =_022577C4 + mov r1, #3 + ldr r2, [r0] + mov r0, #0xa + stmia r2, {r0, r1} + add sp, sp, #0x2b4 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02235A78: .word _022577C4 +_02235A7C: .word ov45_02236690 +_02235A80: .word ov45_022347C4 +_02235A84: .word ov45_02234764 +_02235A88: .word ov45_022348C8 +_02235A8C: .word ov45_02234870 +_02235A90: .word ov45_02234944 + arm_func_end ov45_022354F4 + + arm_func_start ov45_02235A94 +ov45_02235A94: ; 0x02235A94 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + mov r6, r3 + cmp r6, #5 + mov r7, r0 + addeq sp, sp, #0x30 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r7, #0 + beq _02235BC4 + cmp r6, #4 + addls pc, pc, r6, lsl #2 + b _02235AF0 +_02235AC4: ; jump table + b _02235AF0 ; case 0 + b _02235AD8 ; case 1 + b _02235AD8 ; case 2 + b _02235AE0 ; case 3 + b _02235AE8 ; case 4 +_02235AD8: + ldr r1, _02235C30 ; =ov45_02254D5C + b _02235AF4 +_02235AE0: + ldr r1, _02235C34 ; =ov45_02254D1C + b _02235AF4 +_02235AE8: + ldr r1, _02235C38 ; =ov45_02254D3C + b _02235AF4 +_02235AF0: + mov r1, #0 +_02235AF4: + cmp r1, #0 + bne _02235B10 + ldr r0, _02235C3C ; =_022577C4 + mov r3, #1 + ldr r4, [r0] + mov r0, #0xa + stmia r4, {r0, r3} +_02235B10: + mov r0, r2 + bl ov45_02241D58 + ldr r0, _02235C3C ; =_022577C4 + mov r1, #0 + ldr r4, [r0] + add ip, sp, #0x24 + str r1, [r4, #0x10c] + ldr r1, [r4, #0xfc] + add r0, r4, #0x100 + str r1, [sp, #0x20] + ldmia r0, {r2, r3} + stmia ip, {r2, r3} + ldr r1, [r4, #0x108] + add r0, sp, #0x10 + str r1, [sp, #0x2c] + str r6, [sp, #0x20] + str r6, [sp, #0xc] + ldmia ip, {r2, r3} + stmia r0, {r2, r3} + mov r0, #1 + str r0, [sp, #0x1c] + add r5, sp, #0xc + str r1, [sp, #0x18] + mov r1, r5 + add r0, r4, #0xfc + mov r2, #0x10 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _02235BB8 + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #0xfc] + add r0, r4, #0x100 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x108] + str r0, [r4, #0x10c] +_02235BB8: + mov r0, #1 + str r0, [r4, #0x128] + b _02235C10 +_02235BC4: + ldr r0, _02235C3C ; =_022577C4 + mov r1, #0 + ldr r4, [r0] + add r2, sp, #0 + mov r0, r1 +_02235BD8: + str r0, [r2, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02235BD8 + mov r2, #5 + add r1, sp, #0 + add r0, r4, #0xd4 + str r2, [r4, #0xd0] + bl ov45_02237D48 + mov r1, #0 + str r1, [r4, #0xe0] + add r0, sp, #0 + str r1, [r4, #0xe4] + bl ov45_02237BC8 +_02235C10: + ldr r1, _02235C3C ; =_022577C4 + mov r0, r7 + ldr r2, [r1] + mov r1, r6 + ldr r2, [r2, #8] + blx r2 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02235C30: .word ov45_02254D5C +_02235C34: .word ov45_02254D1C +_02235C38: .word ov45_02254D3C +_02235C3C: .word _022577C4 + arm_func_end ov45_02235A94 + + arm_func_start ov45_02235C40 +ov45_02235C40: ; 0x02235C40 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x60 + mov r2, r0 + mov r7, r1 + add r0, sp, #0x38 + mov r1, r2 + bl ov45_02237B58 + ldr r1, _02235E48 ; =_022577C4 + add r0, sp, #0x20 + ldr r5, [r1] + add r6, sp, #0x38 + add r1, r5, #0xb8 + bl ov45_022320B4 + add r0, sp, #0x20 + mov r1, r6 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x20 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r5, [r5, #0xb8] + bne _02235CC8 + add r0, sp, #0x2c + add r1, r5, #0xd0 + bl ov45_022320B4 + add r0, sp, #0x2c + mov r1, r6 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x2c + bl ov45_02237BC8 + cmp r4, #0 + ldrne r5, [r5, #0xd0] + moveq r5, #5 +_02235CC8: + add r0, sp, #0x38 + bl ov45_02237BC8 + cmp r5, #5 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + bne _02235D00 + ldr r0, _02235E48 ; =_022577C4 + mov r1, r7 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DD3C + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02235D00: + ldr r0, _02235E48 ; =_022577C4 + mov r1, r7 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + movs r4, r0 + bne _02235D48 + ldr r0, _02235E48 ; =_022577C4 + mov r1, r7 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DD3C + ldr r0, _02235E48 ; =_022577C4 + mov r1, r7 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + mov r4, r0 +_02235D48: + mov r0, #0 + str r0, [r4, #0x14] + ldr r0, [r4, #4] + add r1, sp, #0x54 + str r0, [sp, #0x50] + add r0, r4, #8 + ldmia r0, {r2, r3} + stmia r1, {r2, r3} + ldr ip, [r4, #0x10] + add r0, sp, #0x10 + str ip, [sp, #0x5c] + str r5, [sp, #0x50] + str r5, [sp, #0xc] + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + add r6, sp, #0xc + mov r3, #1 + mov r1, r6 + add r0, r4, #4 + mov r2, #0x10 + str ip, [sp, #0x18] + str r3, [sp, #0x1c] + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _02235DE0 + ldr r0, [r6] + add r1, r6, #4 + str r0, [r4, #4] + add r0, r4, #8 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r6, #0xc] + mov r0, #1 + str r1, [r4, #0x10] + str r0, [r4, #0x14] +_02235DE0: + mov r0, #1 + str r0, [r4, #0x30] + mov r0, #0 + str r0, [r4, #0x14] + ldr r5, [r4, #4] + ldr r2, [r4, #8] + ldr r1, [r4, #0xc] + add r0, sp, #0 + add r3, sp, #0x44 + str r5, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r0, [r4, #0x38] + cmp r0, #0 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _02235E48 ; =_022577C4 + mov r0, r7 + ldr r2, [r1] + mov r1, r3 + ldr r2, [r2, #0x20] + blx r2 + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02235E48: .word _022577C4 + arm_func_end ov45_02235C40 + + arm_func_start ov45_02235E4C +ov45_02235E4C: ; 0x02235E4C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x60 + mov r2, r0 + mov r6, r1 + add r0, sp, #0x38 + mov r1, r2 + bl ov45_02237B58 + ldr r1, _0223606C ; =_022577C4 + add r0, sp, #0x20 + ldr r5, [r1] + add r7, sp, #0x38 + add r1, r5, #0xb8 + bl ov45_022320B4 + add r0, sp, #0x20 + mov r1, r7 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x20 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r5, #0xb8] + bne _02235ED4 + add r0, sp, #0x2c + add r1, r5, #0xd0 + bl ov45_022320B4 + add r0, sp, #0x2c + mov r1, r7 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x2c + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r5, #0xd0] + moveq r4, #5 +_02235ED4: + add r0, sp, #0x38 + bl ov45_02237BC8 + cmp r4, #5 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + bne _02235F48 + ldr r0, _0223606C ; =_022577C4 + mov r1, r6 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + cmp r0, #0 + ldrne r0, [r0, #0x38] + cmpne r0, #0 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _0223606C ; =_022577C4 + mov r0, r6 + ldr r1, [r1] + ldr r1, [r1, #0x10] + blx r1 + ldr r0, _0223606C ; =_022577C4 + mov r1, r6 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DE38 + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02235F48: + ldr r0, _0223606C ; =_022577C4 + mov r1, r6 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + movs r4, r0 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + str r0, [r4, #0x14] + ldr r0, [r4, #4] + add lr, sp, #0x54 + str r0, [sp, #0x50] + add r0, r4, #8 + ldmia r0, {r2, r3} + stmia lr, {r2, r3} + ldr ip, [r4, #0x10] + mov r1, #5 + add r0, sp, #0x10 + str ip, [sp, #0x5c] + str r1, [sp, #0x50] + str r1, [sp, #0xc] + add r5, sp, #0xc + ldmia lr, {r2, r3} + stmia r0, {r2, r3} + mov r3, #1 + mov r1, r5 + add r0, r4, #4 + mov r2, #0x10 + str ip, [sp, #0x18] + str r3, [sp, #0x1c] + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _02236004 + ldr r0, [r5] + add r1, r5, #4 + str r0, [r4, #4] + add r0, r4, #8 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r5, #0xc] + mov r0, #1 + str r1, [r4, #0x10] + str r0, [r4, #0x14] +_02236004: + mov r0, #1 + str r0, [r4, #0x30] + mov r0, #0 + str r0, [r4, #0x14] + ldr r5, [r4, #4] + ldr r2, [r4, #8] + ldr r1, [r4, #0xc] + add r0, sp, #0 + add r3, sp, #0x44 + str r5, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r0, [r4, #0x38] + cmp r0, #0 + addeq sp, sp, #0x60 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _0223606C ; =_022577C4 + mov r0, r6 + ldr r2, [r1] + mov r1, r3 + ldr r2, [r2, #0x20] + blx r2 + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223606C: .word _022577C4 + arm_func_end ov45_02235E4C + + arm_func_start ov45_02236070 +ov45_02236070: ; 0x02236070 + stmdb sp!, {r3, lr} + mov ip, r1 + mov r3, r2 + mov r1, r0 + mov r2, ip + mov r0, #0 + bl ov45_02236090 + ldmia sp!, {r3, pc} + arm_func_end ov45_02236070 + + arm_func_start ov45_02236090 +ov45_02236090: ; 0x02236090 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x58 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, #5 + beq _0223612C + add r0, sp, #0x28 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _022362B0 ; =_022577C4 + add r0, sp, #4 + ldr r8, [r1] + add sb, sp, #0x28 + add r1, r8, #0xb8 + bl ov45_022320B4 + add r0, sp, #4 + mov r1, sb + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #4 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r8, #0xb8] + bne _02236124 + add r0, sp, #0x10 + add r1, r8, #0xd0 + bl ov45_022320B4 + add r0, sp, #0x10 + mov r1, sb + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x10 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r8, #0xd0] + moveq r4, #5 +_02236124: + add r0, sp, #0x28 + bl ov45_02237BC8 +_0223612C: + cmp r7, #0 + beq _02236140 + cmp r4, #5 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02236140: + mov r7, #0 + add r2, sp, #0x4c + mov r3, #6 + add r0, sp, #0x1c + mov r1, r5 + str r7, [sp, #0x34] + str r3, [sp, #0x38] + str r7, [sp, #0x3c] + str r7, [sp, #0x40] + str r7, [sp, #0x44] + str r7, [sp, #0x48] + str r7, [r2] + str r7, [r2, #4] + str r7, [r2, #8] + bl ov45_02237B58 + add r0, sp, #0x1c + add r1, sp, #0x34 + bl ov45_0223D27C + cmp r0, #0 + moveq r5, #1 + movne r5, r7 + add r0, sp, #0x1c + bl ov45_02237BC8 + cmp r5, #0 + beq _022361B4 + add r0, sp, #0x4c + bl ov45_022379D4 + add sp, sp, #0x58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022361B4: + ldr r0, [sp, #0x40] + cmp r0, #0 + beq _0223627C + cmp r0, #1 + bne _022362A0 + ldr r0, _022362B0 ; =_022577C4 + mov r1, r6 + ldr r0, [r0] + add r0, r0, #0xe8 + bl ov45_0223DEC4 + cmp r0, #0 + ldrne r0, [r0, #0x38] + cmpne r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _02236208 + add r0, sp, #0x4c + bl ov45_022379D4 + add sp, sp, #0x58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_02236208: + ldr r0, [sp, #0x3c] + cmp r0, #0 + beq _02236250 + cmp r0, #1 + bne _022362A0 + ldr r1, _022362B0 ; =_022577C4 + add r0, sp, #0x4c + ldr r5, [r1] + bl ov45_02231C78 + ldr r1, [sp, #0x50] + mov r3, r0 + str r1, [sp] + ldr r2, [sp, #0x44] + ldr r5, [r5, #0x18] + mov r0, r6 + mov r1, r4 + blx r5 + b _022362A0 +_02236250: + ldr r1, _022362B0 ; =_022577C4 + add r0, sp, #0x4c + ldr r5, [r1] + bl ov45_02231C78 + mov r3, r0 + ldr r2, [sp, #0x44] + ldr r5, [r5, #0x14] + mov r0, r6 + mov r1, r4 + blx r5 + b _022362A0 +_0223627C: + add r0, sp, #0x4c + bl ov45_02231C78 + ldr r5, [sp, #0x50] + mov r3, r0 + add r0, sp, #0x34 + mov r1, r6 + mov r2, r4 + str r5, [sp] + bl ov45_0223454C +_022362A0: + add r0, sp, #0x4c + bl ov45_022379D4 + add sp, sp, #0x58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_022362B0: .word _022577C4 + arm_func_end ov45_02236090 + + arm_func_start ov45_022362B4 +ov45_022362B4: ; 0x022362B4 + stmdb sp!, {r3, lr} + ldr r1, _022362CC ; =_022577C4 + ldr r1, [r1] + ldr r1, [r1, #0x48] + blx r1 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022362CC: .word _022577C4 + arm_func_end ov45_022362B4 + + arm_func_start ov45_022362D0 +ov45_022362D0: ; 0x022362D0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + stmia sp, {r2, r3} + mov lr, r1 + mov r0, #1 + mov ip, #0 + mov r1, r0 + mov r2, r4 + mov r3, lr + str ip, [sp, #8] + bl ov45_02233E10 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022362D0 + + arm_func_start ov45_02236308 +ov45_02236308: ; 0x02236308 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr lr, [sp, #0x18] + mov r4, r2 + stmia sp, {r3, lr} + ldr ip, [sp, #0x1c] + mov r2, r1 + mov r3, r4 + mov r1, #0 + str ip, [sp, #8] + bl ov45_02233E10 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02236308 + + arm_func_start ov45_0223633C +ov45_0223633C: ; 0x0223633C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + ldr r8, [sp, #0x60] + cmp r0, #0 + mov sl, r1 + mov sb, r2 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + mov r7, #0 + ble _0223644C + ldr fp, _02236494 ; =ov45_022550B8 + add r6, sp, #0x24 + add r5, sp, #0x18 + add r4, sp, #0x30 +_02236378: + ldr r0, [r8, r7, lsl #2] + cmp r0, #0x14 + bge _02236440 + ldr r1, [sb, r7, lsl #2] + mov r0, r6 + bl ov45_02237B58 + mov r0, r5 + mov r1, fp + bl ov45_02237B58 + mov r0, r4 + mov r1, r6 + mov r2, r5 + mov r3, #0 + bl ov45_0223649C + mov r0, r5 + bl ov45_02237BC8 + mov r0, r6 + bl ov45_02237BC8 + ldr r0, [sp, #0x34] + cmp r0, #2 + bhs _022363D8 + mov r0, r4 + bl ov45_02237664 + b _02236440 +_022363D8: + ldr r1, [sp, #0x30] + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r1, #0xd + ldrne r1, [r1, #0x14] + add r0, sp, #0xc + bl ov45_02237B58 + ldr r0, _02236498 ; =_022577C4 + add r1, sp, #0xc + ldr r0, [r0] + add r0, r0, #0x58 + bl ov45_02237D48 + add r0, sp, #0xc + bl ov45_02237BC8 + ldr r1, _02236498 ; =_022577C4 + mov r3, #0 + ldr r2, [r1] + add r0, sp, #0x30 + str r3, [r2, #0x64] + ldr r1, [r1] + mov r2, #6 + str r2, [r1] + bl ov45_02237664 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02236440: + add r7, r7, #1 + cmp r7, sl + blt _02236378 +_0223644C: + add r0, sp, #0 + bl ov45_02233B74 + ldr r0, _02236498 ; =_022577C4 + add r1, sp, #0 + ldr r0, [r0] + add r0, r0, #0x58 + bl ov45_02237D48 + add r0, sp, #0 + bl ov45_02237BC8 + ldr r0, _02236498 ; =_022577C4 + mov r3, #1 + ldr r2, [r0] + mov r1, #6 + str r3, [r2, #0x64] + ldr r0, [r0] + str r1, [r0] + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02236494: .word ov45_022550B8 +_02236498: .word _022577C4 + arm_func_end ov45_0223633C + + arm_func_start ov45_0223649C +ov45_0223649C: ; 0x0223649C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + mov sl, r0 + mov r4, #0 + str r4, [sl] + str r4, [sl, #4] + add r0, sp, #0x20 + mov sb, r2 + str r3, [sp] + str r4, [sl, #8] + mov r7, #1 + bl ov45_02237A24 + sub r5, sp, #4 + add fp, sp, #0x20 + add r6, sp, #0x14 + mvn r4, #0 + b _022365BC +_022364E0: + cmp r8, #0 + beq _02236574 + mov r0, r6 + mov r1, fp + mov r2, #0 + mov r3, r8 + bl ov45_02236680 + mov r1, #0 + add r0, sp, #7 + strb r1, [r0] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _02236544 + mov r0, #0xc + mul r0, r1, r0 + ldr r1, [sl] + adds r0, r1, r0 + beq _02236534 + mov r1, r6 + bl ov45_02237A24 +_02236534: + ldr r0, [sl, #4] + add r0, r0, #1 + str r0, [sl, #4] + b _02236568 +_02236544: + mov r0, #0 + mov r2, #0 + strb r0, [sp, #6] + mov r2, r2 + strb r2, [r5] + ldr r2, [r5] + mov r0, sl + mov r1, r6 + bl ov45_02237634 +_02236568: + mov r0, r6 + bl ov45_02237BC8 + add r7, r7, #1 +_02236574: + ldr r0, [sb] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r0, [sb, #4] + bne _02236594 + ldrb r0, [sb] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_02236594: + add r2, r8, r0 + add r0, sp, #8 + mov r1, fp + mov r3, r4 + bl ov45_02236680 + mov r0, fp + add r1, sp, #8 + bl ov45_02237D48 + add r0, sp, #8 + bl ov45_02237BC8 +_022365BC: + ldr r0, [sp] + cmp r7, r0 + beq _022365E4 + mov r0, fp + mov r1, sb + mov r2, #0 + bl ov45_02237EB0 + mov r8, r0 + cmp r8, r4 + bne _022364E0 +_022365E4: + ldr r0, [sp, #0x20] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r0, [sp, #0x24] + bne _02236604 + ldrb r0, [sp, #0x20] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_02236604: + cmp r0, #0 + beq _02236670 + mov r2, #0 + strb r2, [sp, #5] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _02236650 + mov r0, #0xc + mul r0, r1, r0 + ldr r1, [sl] + adds r0, r1, r0 + beq _02236640 + add r1, sp, #0x20 + bl ov45_02237A24 +_02236640: + ldr r0, [sl, #4] + add r0, r0, #1 + str r0, [sl, #4] + b _02236670 +_02236650: + strb r2, [sp, #4] + sub r1, sp, #4 + and r0, r2, #0xff + strb r0, [r1] + ldr r2, [r1] + add r1, sp, #0x20 + mov r0, sl + bl ov45_02237634 +_02236670: + add r0, sp, #0x20 + bl ov45_02237BC8 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223649C + + arm_func_start ov45_02236680 +ov45_02236680: ; 0x02236680 + stmdb sp!, {r3, lr} + str r1, [sp] + bl ov45_02237AA0 + ldmia sp!, {r3, pc} + arm_func_end ov45_02236680 + + arm_func_start ov45_02236690 +ov45_02236690: ; 0x02236690 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + cmp r0, #0 + mov sl, r1 + mov sb, r2 + mov r8, r3 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #0x1c + bl ov45_02237B58 + ldr r1, _022367D0 ; =_022577C4 + add r0, sp, #4 + ldr r5, [r1] + add r6, sp, #0x1c + add r1, r5, #0xb8 + bl ov45_022320B4 + add r0, sp, #4 + mov r1, r6 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #4 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r5, #0xb8] + bne _02236724 + add r0, sp, #0x10 + add r1, r5, #0xd0 + bl ov45_022320B4 + add r0, sp, #0x10 + mov r1, r6 + bl ov45_022340F8 + mov r4, r0 + add r0, sp, #0x10 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r4, [r5, #0xd0] + moveq r4, #5 +_02236724: + add r0, sp, #0x1c + bl ov45_02237BC8 + cmp r4, #5 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r4, #0 + addne sp, sp, #0x28 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #0 + mov r7, #0 + ble _022367B8 + ldr r5, _022367D4 ; =ov45_02236308 + ldr fp, _022367D0 ; =_022577C4 + mov r6, r7 + mov r4, r7 +_02236760: + ldr r2, [fp] + ldr r1, [r8, r7, lsl #2] + ldr r0, [r2, #0x4c] + cmp r1, r0 + beq _022367AC + add r0, r2, #0xe8 + bl ov45_0223DD3C + str r6, [sp] + ldr r1, [r8, r7, lsl #2] + ldr r2, _022367D8 ; =ov45_022550C4 + mov r0, sl + mov r3, r5 + bl ov45_022417B4 + str r4, [sp] + ldr r1, [r8, r7, lsl #2] + ldr r2, _022367DC ; =ov45_022550D4 + mov r0, sl + mov r3, r5 + bl ov45_022417B4 +_022367AC: + add r7, r7, #1 + cmp r7, sb + blt _02236760 +_022367B8: + ldr r0, _022367D0 ; =_022577C4 + mov r1, #1 + ldr r0, [r0] + str r1, [r0, #0xc8] + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022367D0: .word _022577C4 +_022367D4: .word ov45_02236308 +_022367D8: .word ov45_022550C4 +_022367DC: .word ov45_022550D4 + arm_func_end ov45_02236690 + + arm_func_start ov45_022367E0 +ov45_022367E0: ; 0x022367E0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r2, #0x1c] + cmp r0, #0x14 + bne _02236824 + ldr r0, _02236834 ; =_022577C4 + mov r3, #1 + ldr r2, [r0] + add r1, sp, #0 + str r3, [r2, #0xcc] + ldr r0, [r0] + mov r2, #4 + add r0, r0, #0x134 + str r2, [sp] + bl ov45_02232D8C + ldmia sp!, {r3, pc} +_02236824: + mov r0, r1 + ldr r1, _02236838 ; =ov45_02254D7C + bl ov45_02241D58 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02236834: .word _022577C4 +_02236838: .word ov45_02254D7C + arm_func_end ov45_022367E0 + + arm_func_start ov45_0223683C +ov45_0223683C: ; 0x0223683C + stmdb sp!, {r4, lr} + sub sp, sp, #0x40 + cmp r0, #0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r4, pc} + ldr r0, [sp, #0x48] + mov r2, #0 + add r1, sp, #0x34 + str r2, [sp, #0x34] + str r2, [sp, #0x38] + str r2, [sp, #0x3c] + bl ov45_02233FE4 + cmp r0, #0 + beq _02236880 + ldr r0, [sp, #0x38] + cmp r0, #8 + beq _022368E4 +_02236880: + ldr r2, _02236944 ; =_022577C4 + add r0, sp, #0x18 + add r1, sp, #0x28 + ldr r4, [r2] + bl ov00_021ECB94 + add r0, sp, #0x18 + add r1, sp, #0x28 + bl RTC_ConvertDateTimeToSecond + str r0, [r4, #0x14c] + str r1, [r4, #0x150] + add r2, r4, #0x14c + add r0, sp, #0x10 + ldmia r2, {r2, r3} + stmia r0, {r2, r3} + mov r1, #8 + mov r3, r0 + ldr r2, _02236948 ; =ov45_022550E4 + sub r0, r1, #9 + str r1, [sp] + mov r1, #0 + bl ov45_02233434 + add r0, sp, #0x34 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r4, pc} +_022368E4: + add r0, sp, #0x34 + bl ov45_02231C78 + ldr r1, _02236944 ; =_022577C4 + ldr lr, [r0] + ldr ip, [r0, #4] + ldr r2, [r1] + mov r0, #1 + str r0, [r2, #0x148] + add r3, sp, #8 + str lr, [sp, #8] + str ip, [sp, #0xc] + add r0, r2, #0x14c + ldmia r3, {r2, r3} + stmia r0, {r2, r3} + ldr r0, [r1] + mov r2, #5 + add r1, sp, #4 + add r0, r0, #0x134 + str r2, [sp, #4] + bl ov45_02232D8C + add r0, sp, #0x34 + bl ov45_022379D4 + add sp, sp, #0x40 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02236944: .word _022577C4 +_02236948: .word ov45_022550E4 + arm_func_end ov45_0223683C + + arm_func_start ov45_0223694C +ov45_0223694C: ; 0x0223694C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + cmp r0, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + mov r2, #0 + ldr r0, [sp, #0x30] + add r1, sp, #0x14 + str r2, [sp, #0x18] + str r2, [sp, #0x14] + str r2, [sp, #0x1c] + bl ov45_02233FE4 + cmp r0, #0 + ldrne r5, [sp, #0x18] + cmpne r5, #0 + beq _022369B4 + ldr r1, _02236A3C ; =_022577C4 + add r0, sp, #0x14 + ldr r4, [r1] + bl ov45_02231C78 + mov r1, r0 + mov r2, r5 + add r0, r4, #0x144 + bl ov45_02238C74 + cmp r0, #0 + bne _02236A04 +_022369B4: + ldr r1, _02236A3C ; =_022577C4 + add r0, sp, #8 + ldr r1, [r1] + add r1, r1, #0x144 + bl ov45_02238C1C + add r0, sp, #8 + bl ov45_02231C78 + ldr ip, [sp, #0xc] + mov r3, r0 + ldr r2, _02236A40 ; =ov45_022550F4 + mvn r0, #0 + mov r1, #0 + str ip, [sp] + bl ov45_02233434 + add r0, sp, #8 + bl ov45_022379D4 + add r0, sp, #0x14 + bl ov45_022379D4 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} +_02236A04: + ldr r0, _02236A3C ; =_022577C4 + mov r3, #4 + ldr r2, [r0] + add r1, sp, #4 + str r3, [r2, #0x144] + ldr r0, [r0] + mov r2, #6 + add r0, r0, #0x134 + str r2, [sp, #4] + bl ov45_02232D8C + add r0, sp, #0x14 + bl ov45_022379D4 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02236A3C: .word _022577C4 +_02236A40: .word ov45_022550F4 + arm_func_end ov45_0223694C + + arm_func_start ov45_02236A44 +ov45_02236A44: ; 0x02236A44 + bx lr + arm_func_end ov45_02236A44 + + arm_func_start ov45_02236A48 +ov45_02236A48: ; 0x02236A48 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x28 + bl ov45_022379D4 + add r0, r4, #0x18 + bl ov45_02237BC8 + add r0, r4, #0xc + bl ov45_02237BC8 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02236A48 + + arm_func_start ov45_02236A70 +ov45_02236A70: ; 0x02236A70 + stmdb sp!, {r4, lr} + ldr r1, _02236AB4 ; =ov45_02254FA0 + mov r4, r0 + str r1, [r4] + bl ov45_0223DF4C + add r0, r4, #0x28 + bl ov45_022379D4 + add r0, r4, #4 + bl ov45_02236B88 + cmp r4, #0 + beq _02236AAC + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02236AAC: + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02236AB4: .word ov45_02254FA0 + arm_func_end ov45_02236A70 + + arm_func_start ov45_02236AB8 +ov45_02236AB8: ; 0x02236AB8 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x18 + bl ov45_022379D4 + cmp r4, #0 + beq _02236AE0 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02236AE0: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02236AB8 + + arm_func_start ov45_02236AE8 +ov45_02236AE8: ; 0x02236AE8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r2, #0 + mov r4, r0 + strb r2, [sp] + str r2, [r4, #4] + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02236B78 + ldr r1, [r4, #0x14] + cmp r1, #0 + beq _02236B28 + ldr r2, [r4, #0xc] + ldr r0, [r4, #0x10] + add r0, r2, r0 + bl _u32_div_f + mov r2, r1 +_02236B28: + ldr r8, [r4, #8] + ldr r0, [r4, #0xc] + ldr r1, [r4, #0x14] + add r6, r8, r2, lsl #2 + add r7, r8, r0, lsl #2 + cmp r7, r6 + add sb, r8, r1, lsl #2 + beq _02236B78 + mov r5, #0 +_02236B4C: + ldr r1, [r7] + cmp r1, #0 + beq _02236B64 + mov r0, r5 + mov r2, r5 + bl ov00_021EC2EC +_02236B64: + add r7, r7, #4 + cmp r7, sb + moveq r7, r8 + cmp r7, r6 + bne _02236B4C +_02236B78: + add r0, r4, #8 + bl ov45_02238508 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov45_02236AE8 + + arm_func_start ov45_02236B88 +ov45_02236B88: ; 0x02236B88 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02236BA0 + bl ov45_02238558 +_02236BA0: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02236B88 + + arm_func_start ov45_02236BA8 +ov45_02236BA8: ; 0x02236BA8 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r5, r2 + mov r6, r1 + mov r4, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r6 + mov r1, r5 + str ip, [sp] + bl ov45_02238450 + ldr r3, [sp, #8] + mov r1, r0 + cmp r3, #0 + beq _02236BF8 + ldr r2, [r3, #0xc] + ldr r0, [r5] + cmp r2, r0 + bhs _02236C24 +_02236BF8: + str r5, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r6 + bl ov45_02236CE0 + ldr r1, _02236C3C ; =_02254F58 + str r0, [r4] + ldrb r0, [r1, #2] + add sp, sp, #0xc + strb r0, [r4, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_02236C24: + ldr r0, _02236C3C ; =_02254F58 + str r3, [r4] + ldrb r0, [r0] + strb r0, [r4, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02236C3C: .word _02254F58 + arm_func_end ov45_02236BA8 + + arm_func_start ov45_02236C40 +ov45_02236C40: ; 0x02236C40 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #0xc] + mov r6, r0 + cmp r4, r1 + bne _02236C70 + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #0xc] +_02236C70: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + cmp r4, #0 + beq _02236C98 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02236C98: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02236C40 + + arm_func_start ov45_02236CB0 +ov45_02236CB0: ; 0x02236CB0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + bl ov45_02236DEC + mov r0, #0 + str r0, [r4] + str r0, [r4, #4] + add r0, r4, #4 + str r0, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end ov45_02236CB0 + + arm_func_start ov45_02236CE0 +ov45_02236CE0: ; 0x02236CE0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + mov sb, r0 + ldr r4, [sb] + mvn r0, #0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + cmp r4, r0 + ldr r5, [sp, #0x30] + bne _02236D18 + ldr r0, _02236DE8 ; =ov45_02255104 + bl printf + bl abort +_02236D18: + mov r1, #0 + mov r0, #0x28 + strb r1, [sp] + bl ov45_02242394 + mov r4, r0 + add r0, sb, #4 + str r4, [sp, #4] + str r4, [sp, #8] + str r0, [sp, #0xc] + str r4, [sp, #0x10] + adds r2, r4, #0xc + beq _02236D80 + ldr r1, [r5] + add r0, r2, #4 + str r1, [r2] + add r1, r5, #4 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + add r2, r5, #0xc + add r1, r0, #8 + ldmia r2, {r2, r3} + stmia r1, {r2, r3} + ldr r1, [r5, #0x14] + str r1, [r0, #0x10] + ldr r1, [r5, #0x18] + str r1, [r0, #0x14] +_02236D80: + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r8, [r0] + cmp r7, #0 + strne r4, [r8] + streq r4, [r8, #4] + ldr r1, [sb] + mov r0, r4 + add r1, r1, #1 + str r1, [sb] + ldr r1, [sb, #4] + bl ov45_02236EC4 + cmp r6, #0 + ldr r1, [sp, #0x10] + strne r4, [sb, #0xc] + cmp r1, #0 + beq _02236DDC + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02236DDC: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02236DE8: .word ov45_02255104 + arm_func_end ov45_02236CE0 + + arm_func_start ov45_02236DEC +ov45_02236DEC: ; 0x02236DEC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _02236E08 + bl ov45_02236DEC +_02236E08: + ldr r1, [r4, #4] + cmp r1, #0 + beq _02236E1C + mov r0, r5 + bl ov45_02236DEC +_02236E1C: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02236DEC + + arm_func_start ov45_02236E38 +ov45_02236E38: ; 0x02236E38 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02236E50 + bl ov45_02236DEC +_02236E50: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02236E38 + + arm_func_start ov45_02236E58 +ov45_02236E58: ; 0x02236E58 + ldr r2, [r0] + ldr r1, [r2, #4] + cmp r1, #0 + beq _02236E8C + ldr r2, [r1] + cmp r2, #0 + beq _02236E84 +_02236E74: + mov r1, r2 + ldr r2, [r2] + cmp r2, #0 + bne _02236E74 +_02236E84: + str r1, [r0] + bx lr +_02236E8C: + ldr r1, [r2, #8] + bic r3, r1, #1 + ldr r1, [r3] + cmp r2, r1 + beq _02236EBC +_02236EA0: + mov r2, r3 + str r3, [r0] + ldr r1, [r2, #8] + bic r3, r1, #1 + ldr r1, [r3] + cmp r2, r1 + bne _02236EA0 +_02236EBC: + str r3, [r0] + bx lr + arm_func_end ov45_02236E58 + + arm_func_start ov45_02236EC4 +ov45_02236EC4: ; 0x02236EC4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r0, [sl, #8] + mov r8, #0 + mov sb, #1 + orr r0, r0, #1 + str r0, [sl, #8] + add r7, sp, #0x2c + mov fp, r8 + mov r4, sb + mov r5, r8 + mov r6, sb + b _02237088 +_02236EFC: + ldr r1, [r0, #8] + bic r2, r1, #1 + ldr r1, [r2] + cmp r0, r1 + bne _02236FD0 + ldr r1, [r2, #4] + cmp r1, #0 + beq _02236F6C + ldr r2, [r1, #8] + tst r2, #1 + movne r2, sb + moveq r2, r8 + cmp r2, #1 + bne _02236F6C + ldr r2, [r0, #8] + bic r2, r2, #1 + str r2, [r0, #8] + ldr r0, [r1, #8] + bic r0, r0, #1 + str r0, [r1, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic sl, r0, #1 + ldr r0, [sl, #8] + orr r0, r0, #1 + str r0, [sl, #8] + b _02237088 +_02236F6C: + ldr r1, [r0, #4] + cmp sl, r1 + bne _02236F84 + mov r1, r7 + mov sl, r0 + bl ov45_0223753C +_02236F84: + ldr r0, [sl, #8] + mov r1, r7 + bic r2, r0, #1 + ldr r0, [r2, #8] + bic r0, r0, #1 + str r0, [r2, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic r2, r0, #1 + ldr r0, [r2, #8] + orr r0, r0, #1 + str r0, [r2, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic r0, r0, #1 + bl ov45_022375B8 + b _02237088 +_02236FD0: + cmp r1, #0 + beq _02237028 + ldr r2, [r1, #8] + tst r2, #1 + movne r2, r6 + moveq r2, r5 + cmp r2, #1 + bne _02237028 + ldr r2, [r0, #8] + bic r2, r2, #1 + str r2, [r0, #8] + ldr r0, [r1, #8] + bic r0, r0, #1 + str r0, [r1, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic sl, r0, #1 + ldr r0, [sl, #8] + orr r0, r0, #1 + str r0, [sl, #8] + b _02237088 +_02237028: + ldr r1, [r0] + cmp sl, r1 + bne _02237040 + mov r1, r7 + mov sl, r0 + bl ov45_022375B8 +_02237040: + ldr r0, [sl, #8] + mov r1, r7 + bic r2, r0, #1 + ldr r0, [r2, #8] + bic r0, r0, #1 + str r0, [r2, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic r2, r0, #1 + ldr r0, [r2, #8] + orr r0, r0, #1 + str r0, [r2, #8] + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r0, [r0, #8] + bic r0, r0, #1 + bl ov45_0223753C +_02237088: + ldr r0, [sp, #0x2c] + cmp sl, r0 + beq _022370B4 + ldr r0, [sl, #8] + bic r0, r0, #1 + ldr r1, [r0, #8] + tst r1, #1 + movne r1, r4 + moveq r1, fp + cmp r1, #1 + beq _02236EFC +_022370B4: + ldr r1, [sp, #0x2c] + ldr r0, [r1, #8] + bic r0, r0, #1 + str r0, [r1, #8] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02236EC4 + + arm_func_start ov45_022370D0 +ov45_022370D0: ; 0x022370D0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, r0 + add r0, sp, #0 + str r4, [sp] + bl ov45_02236E58 + ldr r1, [r4] + mov r0, r4 + cmp r1, #0 + ldrne r1, [r4, #4] + cmpne r1, #0 + ldrne r0, [sp] + ldr r1, [r0] + ldr r2, [r0, #8] + cmp r1, #0 + ldreq r1, [r0, #4] + bic sb, r2, #1 + cmp r1, #0 + beq _0223712C + ldr r2, [r1, #8] + and r2, r2, #1 + orr r2, sb, r2 + str r2, [r1, #8] +_0223712C: + ldr r2, [r0, #8] + bic r3, r2, #1 + ldr r2, [r3] + cmp r0, r2 + streq r1, [r3] + strne r1, [r3, #4] + moveq sl, #1 + ldr r2, [r0, #8] + movne sl, #0 + tst r2, #1 + movne r2, #1 + moveq r2, #0 + cmp r2, #0 + moveq r2, #1 + movne r2, #0 + cmp r0, r4 + beq _02237218 + ldr r5, [r4, #8] + ldr r3, [r0, #8] + bic r5, r5, #1 + and r3, r3, #1 + orr r3, r5, r3 + bic r5, r3, #1 + str r3, [r0, #8] + ldr r3, [r5] + cmp r4, r3 + streq r0, [r5] + strne r0, [r5, #4] + ldr r5, [r4] + cmp r5, #0 + str r5, [r0] + moveq sb, r0 + beq _022371C0 + ldr r3, [r5, #8] + and r3, r3, #1 + orr r3, r0, r3 + str r3, [r5, #8] +_022371C0: + ldr r5, [r4, #4] + cmp r5, #0 + str r5, [r0, #4] + moveq sb, r0 + beq _022371E4 + ldr r3, [r5, #8] + and r3, r3, #1 + orr r3, r0, r3 + str r3, [r5, #8] +_022371E4: + ldr r3, [r4, #8] + tst r3, #1 + movne r3, #1 + moveq r3, #0 + cmp r3, #0 + ldr r3, [r0, #8] + orrne r3, r3, #1 + biceq r3, r3, #1 + str r3, [r0, #8] + ldr r3, [sp, #0x2c] + cmp r3, r4 + streq r0, [sp, #0x2c] + b _02237228 +_02237218: + cmp r1, #0 + ldreq r0, [sp, #0x2c] + cmpeq r4, r0 + moveq r2, #0 +_02237228: + cmp r2, #0 + beq _0223752C + mov r5, #1 + mov r4, #0 + mov r7, r4 + mov r8, r5 + add r6, sp, #0x2c + mov fp, r5 + b _022374F0 +_0223724C: + cmp sl, #0 + beq _022373A4 + ldr r0, [sb, #4] + ldr r1, [r0, #8] + tst r1, #1 + movne r2, r8 + moveq r2, r7 + cmp r2, #1 + bne _02237294 + bic r1, r1, #1 + str r1, [r0, #8] + ldr r1, [sb, #8] + mov r0, sb + orr r1, r1, #1 + str r1, [sb, #8] + mov r1, r6 + bl ov45_0223753C + ldr r0, [sb, #4] +_02237294: + ldr r2, [r0] + cmp r2, #0 + beq _022372B8 + ldr r1, [r2, #8] + tst r1, #1 + movne r1, r5 + moveq r1, r4 + cmp r1, #0 + bne _02237308 +_022372B8: + ldr r1, [r0, #4] + cmp r1, #0 + beq _022372DC + ldr r1, [r1, #8] + tst r1, #1 + movne r1, fp + moveq r1, #0 + cmp r1, #0 + bne _02237308 +_022372DC: + ldr r2, [r0, #8] + mov r1, sb + orr r2, r2, #1 + str r2, [r0, #8] + ldr r0, [sb, #8] + bic sb, r0, #1 + ldr r0, [sb] + cmp r1, r0 + moveq sl, #1 + movne sl, #0 + b _022374F0 +_02237308: + ldr r1, [r0, #4] + cmp r1, #0 + beq _0223732C + ldr r1, [r1, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _02237350 +_0223732C: + ldr r3, [r2, #8] + mov r1, r6 + bic r3, r3, #1 + str r3, [r2, #8] + ldr r2, [r0, #8] + orr r2, r2, #1 + str r2, [r0, #8] + bl ov45_022375B8 + ldr r0, [sb, #4] +_02237350: + ldr r1, [sb, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + ldr r1, [r0, #8] + orrne r1, r1, #1 + biceq r1, r1, #1 + str r1, [r0, #8] + ldr r2, [sb, #8] + mov r1, r6 + bic r2, r2, #1 + str r2, [sb, #8] + ldr r3, [r0, #4] + mov r0, sb + ldr r2, [r3, #8] + bic r2, r2, #1 + str r2, [r3, #8] + bl ov45_0223753C + ldr r1, [sp, #0x2c] + b _022374F0 +_022373A4: + ldr r0, [sb] + ldr r1, [r0, #8] + tst r1, #1 + movne r2, #1 + moveq r2, #0 + cmp r2, #1 + bne _022373E4 + bic r1, r1, #1 + str r1, [r0, #8] + ldr r1, [sb, #8] + mov r0, sb + orr r1, r1, #1 + str r1, [sb, #8] + mov r1, r6 + bl ov45_022375B8 + ldr r0, [sb] +_022373E4: + ldr r2, [r0] + cmp r2, #0 + beq _02237408 + ldr r1, [r2, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _02237458 +_02237408: + ldr r1, [r0, #4] + cmp r1, #0 + beq _0223742C + ldr r1, [r1, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _02237458 +_0223742C: + ldr r2, [r0, #8] + mov r1, sb + orr r2, r2, #1 + str r2, [r0, #8] + ldr r0, [sb, #8] + bic sb, r0, #1 + ldr r0, [sb] + cmp r1, r0 + moveq sl, #1 + movne sl, #0 + b _022374F0 +_02237458: + cmp r2, #0 + beq _02237478 + ldr r1, [r2, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _022374A0 +_02237478: + ldr r3, [r0, #4] + mov r1, r6 + ldr r2, [r3, #8] + bic r2, r2, #1 + str r2, [r3, #8] + ldr r2, [r0, #8] + orr r2, r2, #1 + str r2, [r0, #8] + bl ov45_0223753C + ldr r0, [sb] +_022374A0: + ldr r1, [sb, #8] + tst r1, #1 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + ldr r1, [r0, #8] + orrne r1, r1, #1 + biceq r1, r1, #1 + str r1, [r0, #8] + ldr r2, [sb, #8] + mov r1, r6 + bic r2, r2, #1 + str r2, [sb, #8] + ldr r3, [r0] + mov r0, sb + ldr r2, [r3, #8] + bic r2, r2, #1 + str r2, [r3, #8] + bl ov45_022375B8 + ldr r1, [sp, #0x2c] +_022374F0: + ldr r0, [sp, #0x2c] + cmp r1, r0 + beq _0223751C + cmp r1, #0 + beq _0223724C + ldr r0, [r1, #8] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _0223724C +_0223751C: + cmp r1, #0 + ldrne r0, [r1, #8] + bicne r0, r0, #1 + strne r0, [r1, #8] +_0223752C: + ldr r0, [sp] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022370D0 + + arm_func_start ov45_0223753C +ov45_0223753C: ; 0x0223753C + ldr r3, [r1] + ldr r2, [r0, #4] + cmp r3, r0 + streq r2, [r1] + ldr r1, [r2] + str r1, [r0, #4] + ldr r3, [r2] + cmp r3, #0 + beq _02237570 + ldr r1, [r3, #8] + and r1, r1, #1 + orr r1, r0, r1 + str r1, [r3, #8] +_02237570: + ldr r3, [r0, #8] + ldr r1, [r2, #8] + bic r3, r3, #1 + and r1, r1, #1 + orr r1, r3, r1 + str r1, [r2, #8] + ldr r1, [r0, #8] + bic r3, r1, #1 + ldr r1, [r3] + cmp r0, r1 + streq r2, [r3] + strne r2, [r3, #4] + str r0, [r2] + ldr r1, [r0, #8] + and r1, r1, #1 + orr r1, r2, r1 + str r1, [r0, #8] + bx lr + arm_func_end ov45_0223753C + + arm_func_start ov45_022375B8 +ov45_022375B8: ; 0x022375B8 + ldr r3, [r1] + ldr r2, [r0] + cmp r3, r0 + streq r2, [r1] + ldr r1, [r2, #4] + str r1, [r0] + ldr r3, [r2, #4] + cmp r3, #0 + beq _022375EC + ldr r1, [r3, #8] + and r1, r1, #1 + orr r1, r0, r1 + str r1, [r3, #8] +_022375EC: + ldr r3, [r0, #8] + ldr r1, [r2, #8] + bic r3, r3, #1 + and r1, r1, #1 + orr r1, r3, r1 + str r1, [r2, #8] + ldr r1, [r0, #8] + bic r3, r1, #1 + ldr r1, [r3] + cmp r0, r1 + streq r2, [r3] + strne r2, [r3, #4] + str r0, [r2, #4] + ldr r1, [r0, #8] + and r1, r1, #1 + orr r1, r2, r1 + str r1, [r0, #8] + bx lr + arm_func_end ov45_022375B8 + + arm_func_start ov45_02237634 +ov45_02237634: ; 0x02237634 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r2, #0 + mov r5, r0 + mov r1, #1 + strb r2, [sp] + bl ov45_022385A4 + mov r0, r5 + mov r2, r4 + mov r1, #1 + bl ov45_02238674 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02237634 + + arm_func_start ov45_02237664 +ov45_02237664: ; 0x02237664 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r1, [r4] + cmp r1, #0 + beq _022376B0 + ldr r1, [r4, #4] + mov r3, #0 + strb r3, [sp] + sub r2, sp, #4 + strb r3, [r2] + ldr r2, [r2] + bl ov45_022387E4 + ldr r1, [r4] + cmp r1, #0 + beq _022376B0 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_022376B0: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02237664 + + arm_func_start ov45_022376BC +ov45_022376BC: ; 0x022376BC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _02237700 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _02237700 + mov r2, r0 + bl ov00_021EC2EC +_02237700: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022376BC + + arm_func_start ov45_0223770C +ov45_0223770C: ; 0x0223770C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _02237750 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _02237750 + mov r2, r0 + bl ov00_021EC2EC +_02237750: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223770C + + arm_func_start ov45_0223775C +ov45_0223775C: ; 0x0223775C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _022377A0 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _022377A0 + mov r2, r0 + bl ov00_021EC2EC +_022377A0: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223775C + + arm_func_start ov45_022377AC +ov45_022377AC: ; 0x022377AC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r1 + mov r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r3, #0 + strb r3, [sp, #1] + sub r2, sp, #4 + strb r3, [r2] + ldr r2, [r2] + bl ov45_02237800 + mov r1, #0 + strb r1, [sp] + ldr r3, [r4] + ldr r0, [r4, #4] + mov r2, r5 + add r0, r3, r0 + bl memset + ldr r0, [r4, #4] + add r0, r0, r5 + str r0, [r4, #4] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022377AC + + arm_func_start ov45_02237800 +ov45_02237800: ; 0x02237800 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02237800 + + arm_func_start ov45_02237820 +ov45_02237820: ; 0x02237820 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #4] + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r5, #4] + mov r4, r2 + sub r1, r1, r3 + str r1, [r5, #4] + ldr r1, [r5] + cmp r1, #0 + beq _02237868 + beq _0223785C + mov r2, r0 + bl ov00_021EC2EC +_0223785C: + mov r0, #0 + str r0, [r5] + str r0, [r5, #8] +_02237868: + mov r3, #0 + strb r3, [sp] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + mov r0, r5 + mov r1, r4 + strb r3, [sp, #1] + bl ov45_02237800 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02237820 + + arm_func_start ov45_02237890 +ov45_02237890: ; 0x02237890 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [r0, #8] + mvn r0, #0 + ldr r1, [sp, #0x14] + sub r0, r0, r4 + cmp r1, r0 + bls _022378B8 + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_022378B8: + ldr r0, _02237954 ; =0x55555555 + cmp r4, r0 + bhs _02237904 + add r1, r4, #1 + ldr r0, _02237958 ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x14] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x14 + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_02237904: + cmp r4, r0, lsl #1 + bhs _02237940 + ldr r0, [sp, #0x14] + add r1, r4, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x14 + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_02237940: + mvn r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02237954: .word 0x55555555 +_02237958: .word 0xCCCCCCCD + arm_func_end ov45_02237890 + + arm_func_start ov45_0223795C +ov45_0223795C: ; 0x0223795C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #8] + mov r4, r1 + cmp r4, r3 + ldrls r1, [r5, #4] + subls r0, r3, r4 + cmpls r1, r0 + bls _022379A0 + ldr r0, [r5, #4] + mov r2, #0 + add r1, r0, r4 + mov r0, r5 + sub r1, r1, r3 + strb r2, [sp] + bl ov45_02237890 + b _022379C4 +_022379A0: + ldr r0, [r5] + mov r2, r4 + add r0, r0, r1 + mov r1, #0 + bl memset + ldr r0, [r5, #4] + add r0, r0, r4 + str r0, [r5, #4] + ldmia sp!, {r3, r4, r5, pc} +_022379C4: + mov r0, r5 + mov r1, r4 + bl ov45_02238820 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223795C + + arm_func_start ov45_022379D4 +ov45_022379D4: ; 0x022379D4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _02237A18 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _02237A18 + mov r2, r0 + bl ov00_021EC2EC +_02237A18: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022379D4 + + arm_func_start ov45_02237A24 +ov45_02237A24: ; 0x02237A24 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r5, r1 + ldr r1, [r5] + mov r4, r0 + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + ldmeqia r5, {r0, r1, r2} + stmeqia r4, {r0, r1, r2} + beq _02237A94 + mov r1, #0 + mov r0, r1 +_02237A54: + str r0, [r4, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02237A54 + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_02237BFC + ldmib r5, {r0, r3} + mov r1, #0 + add r0, r3, r0 + str r0, [sp] + ldrb ip, [sp, #8] + mov r0, r4 + mov r2, r1 + strb ip, [sp, #4] + bl ov45_02238104 +_02237A94: + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + arm_func_end ov45_02237A24 + + arm_func_start ov45_02237AA0 +ov45_02237AA0: ; 0x02237AA0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r5, r1 + mov r1, #0 + mov r6, r0 + mov r4, r2 + mov r0, r1 +_02237AC0: + str r0, [r6, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02237AC0 + ldr r0, [r5] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r1, [r5, #4] + bne _02237AF0 + ldrb r0, [r5] + mov r0, r0, lsl #0x18 + mov r1, r0, lsr #0x19 +_02237AF0: + cmp r4, r1 + bhi _02237B18 + ldr r0, [sp, #0x2c] + sub r1, r1, r4 + cmp r1, r0 + addlo r0, sp, #8 + addhs r0, sp, #0x2c + str r1, [sp, #8] + ldr r1, [r0] + b _02237B1C +_02237B18: + mov r1, #0 +_02237B1C: + mov r0, r6 + bl ov45_02237BFC + str r4, [sp] + ldr r4, [sp, #0x2c] + mov r1, #0 + mov r0, r6 + mov r2, r1 + mov r3, r5 + str r4, [sp, #4] + bl ov45_02237E04 + mov r0, r6 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02237AA0 + + arm_func_start ov45_02237B58 +ov45_02237B58: ; 0x02237B58 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r5, r1 + mov r1, #0 + mov r6, r0 + mov r0, r1 +_02237B70: + str r0, [r6, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02237B70 + mov r0, r5 + bl strlen + mov r4, r0 + mov r0, r6 + mov r1, r4 + bl ov45_02237BFC + add r0, r5, r4 + mov r1, #0 + ldrb r3, [sp, #8] + str r0, [sp] + mov r0, r6 + mov r2, r1 + strb r3, [sp, #4] + mov r3, r5 + bl ov45_02238104 + mov r0, r6 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_02237B58 + + arm_func_start ov45_02237BC8 +ov45_02237BC8: ; 0x02237BC8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r1, [r4, #8] + cmpne r1, #0 + beq _02237BF4 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02237BF4: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02237BC8 + + arm_func_start ov45_02237BFC +ov45_02237BFC: ; 0x02237BFC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r1 + mvn r1, #0x80000001 + mov sb, r0 + cmp r8, r1 + bls _02237C20 + ldr r0, _02237D44 ; =ov45_02255120 + bl printf + bl abort +_02237C20: + ldr r0, [sb] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r7, #1 + moveq r7, #0 + cmp r7, #0 + ldmneia sb, {r0, r4} + movne r1, r0, lsr #1 + bne _02237C54 + ldrb r0, [sb] + mov r1, #0xb + mov r0, r0, lsl #0x18 + mov r4, r0, lsr #0x19 +_02237C54: + cmp r8, r4 + movlo r8, r4 + add r0, r8, #1 + cmp r0, #0xb + movls r8, #0xb + addhi r0, r8, #0x10 + bichi r8, r0, #0xf + cmp r8, r1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp r8, #0xb + bne _02237C90 + add r5, sb, #1 + ldr sl, [sb, #8] + mov r6, #0 + b _02237CC4 +_02237C90: + cmp r8, r1 + mov r0, r8 + bls _02237CA8 + bl ov45_02242394 + mov r5, r0 + b _02237CB4 +_02237CA8: + bl ov45_02242394 + movs r5, r0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02237CB4: + cmp r7, #0 + ldrne sl, [sb, #8] + mov r6, #1 + addeq sl, sb, #1 +_02237CC4: + mov r0, r5 + mov r1, sl + mov r2, r4 + bl memmove + mov r0, #0 + cmp r7, #0 + strb r0, [r5, r4] + cmpne sl, #0 + beq _02237CF4 + mov r1, sl + mov r2, r0 + bl ov00_021EC2EC +_02237CF4: + ldr r1, [sb] + and r0, r6, #1 + bic r1, r1, #1 + orr r0, r1, r0 + str r0, [sb] + cmp r6, #0 + bne _02237D2C + ldrb r1, [sb] + and r0, r4, #0xff + mov r0, r0, lsl #0x19 + bic r1, r1, #0xfe + orr r0, r1, r0, lsr #24 + strb r0, [sb] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02237D2C: + stmib sb, {r4, r5} + ldr r0, [sb] + and r0, r0, #1 + orr r0, r0, r8, lsl #1 + str r0, [sb] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02237D44: .word ov45_02255120 + arm_func_end ov45_02237BFC + + arm_func_start ov45_02237D48 +ov45_02237D48: ; 0x02237D48 + stmdb sp!, {r3, lr} + mov ip, r0 + ldr r0, [ip] + mov r3, r1 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _02237D90 + ldr r0, [r3] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + bne _02237D90 + ldmia r3, {r0, r1, r2} + stmia ip, {r0, r1, r2} + mov r0, ip + ldmia sp!, {r3, pc} +_02237D90: + cmp r1, #0 + ldreqb r0, [ip] + ldrne r2, [ip, #4] + mov r1, #0 + moveq r0, r0, lsl #0x18 + moveq r2, r0, lsr #0x19 + mov r0, ip + bl ov45_02237DB4 + ldmia sp!, {r3, pc} + arm_func_end ov45_02237D48 + + arm_func_start ov45_02237DB4 +ov45_02237DB4: ; 0x02237DB4 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, [r3] + mov ip, ip, lsl #0x1f + movs ip, ip, lsr #0x1f + ldrne lr, [r3, #8] + ldrne r3, [r3, #4] + bne _02237DE4 + ldrb ip, [r3] + add lr, r3, #1 + mov r3, ip, lsl #0x18 + mov r3, r3, lsr #0x19 +_02237DE4: + ldrb ip, [sp, #8] + add r3, lr, r3 + str r3, [sp] + mov r3, lr + strb ip, [sp, #4] + bl ov45_02238104 + add sp, sp, #0xc + ldmia sp!, {pc} + arm_func_end ov45_02237DB4 + + arm_func_start ov45_02237E04 +ov45_02237E04: ; 0x02237E04 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldr r4, [r3] + mov r8, r0 + mov r0, r4, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r7, r1 + mov r6, r2 + ldrne r4, [r3, #8] + ldrne r5, [r3, #4] + bne _02237E40 + ldrb r0, [r3] + add r4, r3, #1 + mov r0, r0, lsl #0x18 + mov r5, r0, lsr #0x19 +_02237E40: + ldr r0, [sp, #0x28] + cmp r0, r5 + bls _02237E58 + ldr r0, _02237EAC ; =ov45_02255144 + bl printf + bl abort +_02237E58: + ldr r2, [sp, #0x28] + ldr r0, [sp, #0x2c] + sub r1, r5, r2 + cmp r1, r0 + addlo r0, sp, #0xc + str r1, [sp, #0xc] + add r4, r4, r2 + addhs r0, sp, #0x2c + ldr r0, [r0] + ldrb r5, [sp, #8] + str r0, [sp, #0x2c] + add r0, r4, r0 + str r0, [sp] + mov r0, r8 + mov r1, r7 + mov r2, r6 + mov r3, r4 + strb r5, [sp, #4] + bl ov45_02238104 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02237EAC: .word ov45_02255144 + arm_func_end ov45_02237E04 + + arm_func_start ov45_02237EB0 +ov45_02237EB0: ; 0x02237EB0 + stmdb sp!, {r3, lr} + ldr r3, [r1] + mov r3, r3, lsl #0x1f + movs r3, r3, lsr #0x1f + ldmneib r1, {r3, ip} + bne _02237ED8 + ldrb r3, [r1] + add ip, r1, #1 + mov r1, r3, lsl #0x18 + mov r3, r1, lsr #0x19 +_02237ED8: + mov r1, ip + bl ov45_02237EE4 + ldmia sp!, {r3, pc} + arm_func_end ov45_02237EB0 + + arm_func_start ov45_02237EE4 +ov45_02237EE4: ; 0x02237EE4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, [r0] + mov ip, ip, lsl #0x1f + movs ip, ip, lsr #0x1f + ldrne lr, [r0, #8] + ldrne r0, [r0, #4] + bne _02237F10 + ldrb ip, [r0] + add lr, r0, #1 + mov r0, ip, lsl #0x18 + mov r0, r0, lsr #0x19 +_02237F10: + cmp r2, r0 + bhi _02237F74 + sub ip, r0, r2 + cmp ip, r3 + add r4, r1, r3 + add r5, lr, r2 + blo _02237F74 +_02237F2C: + mov r6, r5 + mov r7, r1 + cmp r1, r4 + bhs _02237F5C +_02237F3C: + ldrsb r2, [r7] + ldrsb r0, [r6] + cmp r2, r0 + bne _02237F64 + add r7, r7, #1 + cmp r7, r4 + add r6, r6, #1 + blo _02237F3C +_02237F5C: + sub r0, r5, lr + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02237F64: + sub ip, ip, #1 + cmp ip, r3 + add r5, r5, #1 + bhs _02237F2C +_02237F74: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02237EE4 + + arm_func_start ov45_02237F7C +ov45_02237F7C: ; 0x02237F7C + stmdb sp!, {r3, lr} + ldr r2, [r1] + mov r2, r2, lsl #0x1f + movs r2, r2, lsr #0x1f + ldrne r3, [r1, #8] + ldrne ip, [r1, #4] + bne _02237FA8 + ldrb r2, [r1] + add r3, r1, #1 + mov r1, r2, lsl #0x18 + mov ip, r1, lsr #0x19 +_02237FA8: + ldr r1, [r0] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r2, [r0, #4] + bne _02237FC8 + ldrb r1, [r0] + mov r1, r1, lsl #0x18 + mov r2, r1, lsr #0x19 +_02237FC8: + mov r1, #0 + str ip, [sp] + bl ov45_02238024 + ldmia sp!, {r3, pc} + arm_func_end ov45_02237F7C + + arm_func_start ov45_02237FD8 +ov45_02237FD8: ; 0x02237FD8 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl strlen + ldr r1, [r5] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r2, [r5, #4] + bne _0223800C + ldrb r1, [r5] + mov r1, r1, lsl #0x18 + mov r2, r1, lsr #0x19 +_0223800C: + str r0, [sp] + mov r0, r5 + mov r3, r4 + mov r1, #0 + bl ov45_02238024 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02237FD8 + + arm_func_start ov45_02238024 +ov45_02238024: ; 0x02238024 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r2, [r0] + mov r6, r1 + mov r1, r2, lsl #0x1f + movs r1, r1, lsr #0x1f + mov r5, r3 + ldrne r4, [r0, #8] + ldrne r7, [r0, #4] + bne _02238060 + ldrb r1, [r0] + add r4, r0, #1 + mov r0, r1, lsl #0x18 + mov r7, r0, lsr #0x19 +_02238060: + cmp r6, r7 + bls _02238074 + ldr r0, _02238100 ; =ov45_02255160 + bl printf + bl abort +_02238074: + ldr r0, [sp, #0x28] + sub r1, r7, r6 + cmp r0, r1 + addlo r0, sp, #0x28 + addhs r0, sp, #0 + str r1, [sp] + ldr r1, [r0] + ldr r0, [sp, #0x30] + str r1, [sp, #4] + cmp r0, r1 + addlo r0, sp, #0x30 + addhs r0, sp, #4 + ldr r2, [r0] + mov r1, r5 + add r0, r4, r6 + bl memcmp + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, lr} + addne sp, sp, #0x10 + bxne lr + ldr r1, [sp, #0x30] + ldr r0, [sp, #4] + cmp r0, r1 + addlo sp, sp, #8 + mvnlo r0, #0 + ldmloia sp!, {r3, r4, r5, r6, r7, lr} + addlo sp, sp, #0x10 + bxlo lr + movne r0, #1 + moveq r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02238100: .word ov45_02255160 + arm_func_end ov45_02238024 + + arm_func_start ov45_02238104 +ov45_02238104: ; 0x02238104 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + mov r6, r0 + ldr r0, [r6] + mov r5, r1 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r0, #1 + strne r0, [sp] + moveq r0, #0 + streq r0, [sp] + ldr r0, [sp] + mov fp, r3 + ldr r4, [sp, #0x60] + cmp r0, #0 + bne _02238164 + ldrb r1, [r6] + mov r0, #0xb + str r0, [sp, #0x14] + mov r0, r1, lsl #0x18 + add r7, r6, #1 + mov r8, r0, lsr #0x19 + b _02238174 +_02238164: + ldmia r6, {r0, r8} + mov r0, r0, lsr #1 + ldr r7, [r6, #8] + str r0, [sp, #0x14] +_02238174: + cmp r5, r8 + bls _02238188 + ldr r0, _022383D4 ; =ov45_02255144 + bl printf + bl abort +_02238188: + ldr r0, [sp, #0x58] + sub r1, r8, r5 + cmp r1, r0 + addlo r0, sp, #0x18 + str r1, [sp, #0x18] + addhs r0, sp, #0x58 + ldr r0, [r0] + sub sb, r4, fp + mvn r1, #0x80000001 + cmp sb, r1 + str r0, [sp, #0x10] + subls sl, r8, r0 + subls r0, r1, sb + cmpls sl, r0 + bls _022381D0 + ldr r0, _022383D8 ; =ov45_0225517C + bl printf + bl abort +_022381D0: + ldr r0, [sp, #0x10] + add sl, sb, sl + add r1, r5, r0 + ldr r0, [sp, #0x14] + cmp sl, r0 + sub r0, r8, r1 + str r0, [sp, #0xc] + blo _022382E4 + ldr r0, [sp, #0x14] + add r1, sl, #1 + add r0, r0, #0xf + bic r8, r0, #0xf + cmp r8, r1 + bhs _0223821C +_02238208: + mov r0, r8, lsl #1 + add r0, r0, #0xf + bic r8, r0, #0xf + cmp r8, r1 + blo _02238208 +_0223821C: + mov r0, r8 + bl ov45_02242394 + str r0, [sp, #8] + cmp r5, #0 + beq _0223823C + mov r1, r7 + mov r2, r5 + bl memcpy +_0223823C: + ldr r0, [sp, #8] + sub r2, r4, fp + add r0, r0, r5 + mov r1, fp + str r0, [sp, #4] + bl memmove + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _0223827C + mov r2, r0 + ldr r0, [sp, #4] + ldr r1, [sp, #0x10] + add r3, r7, r5 + add r0, r0, sb + add r1, r3, r1 + bl memcpy +_0223827C: + ldr r1, _022383DC ; =_02254F58 + ldr r0, [sp] + ldrsb r1, [r1, #3] + cmp r0, #0 + ldr r0, [sp, #8] + strb r1, [r0, sl] + beq _022382B4 + cmp r7, #0 + beq _022382C4 + mov r0, #0 + mov r1, r7 + mov r2, r0 + bl ov00_021EC2EC + b _022382C4 +_022382B4: + ldr r0, [r6] + bic r0, r0, #1 + orr r0, r0, #1 + str r0, [r6] +_022382C4: + ldr r0, [sp, #8] + str r0, [r6, #8] + str sl, [r6, #4] + ldr r0, [r6] + and r0, r0, #1 + orr r0, r0, r8, lsl #1 + str r0, [r6] + b _022383C0 +_022382E4: + mov r1, #0 + add r0, sp, #0x1c + mov r3, r1 +_022382F0: + str r3, [r0, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _022382F0 + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _02238350 + add r0, r7, r5 + add r0, r0, sb + cmp r0, r4 + bhs _02238350 + add r0, r7, r8 + cmp r4, r0 + bhi _02238350 + add r0, sp, #0x1c + mov r1, fp + mov r2, r4 + bl ov45_022384BC + ldr r0, [sp, #0x1c] + add r1, sp, #0x1c + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq fp, r1, #1 + ldrne fp, [r1, #8] +_02238350: + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _02238374 + ldr r1, [sp, #0x10] + add r3, r7, r5 + mov r2, r0 + add r0, r3, sb + add r1, r3, r1 + bl memmove +_02238374: + mov r1, fp + mov r2, sb + add r0, r7, r5 + bl memmove + ldr r0, [sp] + ldr r1, _022383DC ; =_02254F58 + cmp r0, #0 + ldrsb r0, [r1, #1] + strb r0, [r7, sl] + strne sl, [r6, #4] + bne _022383B8 + ldrb r1, [r6] + and r0, sl, #0xff + mov r0, r0, lsl #0x19 + bic r1, r1, #0xfe + orr r0, r1, r0, lsr #24 + strb r0, [r6] +_022383B8: + add r0, sp, #0x1c + bl ov45_02237BC8 +_022383C0: + mov r0, r6 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_022383D4: .word ov45_02255144 +_022383D8: .word ov45_0225517C +_022383DC: .word _02254F58 + arm_func_end ov45_02238104 + + arm_func_start ov45_022383E0 +ov45_022383E0: ; 0x022383E0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r1 + mov r4, r2 + subs r1, r4, r5 + mov r6, r0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r3, #0 + strb r3, [sp, #1] + sub r2, sp, #4 + strb r3, [r2] + ldr r2, [r2] + bl ov45_02237800 + mov r0, #0 + strb r0, [sp] + ldr r2, [r6] + ldr r0, [r6, #4] + mov r1, r5 + add r0, r2, r0 + sub r2, r4, r5 + bl memmove + ldr r1, [r6, #4] + sub r0, r4, r5 + add r0, r1, r0 + str r0, [r6, #4] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_022383E0 + + arm_func_start ov45_02238450 +ov45_02238450: ; 0x02238450 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_02238484: + ldr r5, [r1] + ldr r4, [r6, #0xc] + mov r0, r6 + cmp r5, r4 + ldrlo r6, [r6] + strlob lr, [r3] + blo _022384B0 + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_022384B0: + cmp r6, #0 + bne _02238484 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02238450 + + arm_func_start ov45_022384BC +ov45_022384BC: ; 0x022384BC + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, [r0] + mov r3, r1 + mov r1, ip, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r1, [r0, #4] + bne _022384E8 + ldrb r1, [r0] + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x19 +_022384E8: + ldrb ip, [sp, #8] + str r2, [sp] + mov r2, r1 + mov r1, #0 + strb ip, [sp, #4] + bl ov45_02238104 + add sp, sp, #0xc + ldmia sp!, {pc} + arm_func_end ov45_022384BC + + arm_func_start ov45_02238508 +ov45_02238508: ; 0x02238508 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _0223854C + ldr r2, [r4, #8] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #8] + sub r1, r1, r2 + str r1, [r4, #8] + ldr r1, [r4] + cmp r1, #0 + beq _0223854C + mov r2, r0 + bl ov00_021EC2EC +_0223854C: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02238508 + + arm_func_start ov45_02238558 +ov45_02238558: ; 0x02238558 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _02238574 + bl ov45_02238558 +_02238574: + ldr r1, [r4, #4] + cmp r1, #0 + beq _02238588 + mov r0, r5 + bl ov45_02238558 +_02238588: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02238558 + + arm_func_start ov45_022385A4 +ov45_022385A4: ; 0x022385A4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [r0, #8] + ldr r0, _02238668 ; =0x15555555 + ldr r1, [sp, #0x14] + sub r0, r0, r4 + cmp r1, r0 + bls _022385CC + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_022385CC: + ldr r0, _0223866C ; =0x071C71C7 + cmp r4, r0 + bhs _02238618 + add r1, r4, #1 + ldr r0, _02238670 ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x14] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x14 + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_02238618: + cmp r4, r0, lsl #1 + bhs _02238654 + ldr r0, [sp, #0x14] + add r1, r4, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x14 + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_02238654: + ldr r0, _02238668 ; =0x15555555 + add sp, sp, #8 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02238668: .word 0x15555555 +_0223866C: .word 0x071C71C7 +_02238670: .word 0xCCCCCCCD + arm_func_end ov45_022385A4 + + arm_func_start ov45_02238674 +ov45_02238674: ; 0x02238674 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + mov r4, #0 + mov r7, r0 + add r3, r7, #8 + str r4, [sp, #8] + str r4, [sp, #0xc] + str r4, [sp, #0x10] + str r4, [sp, #0x18] + str r3, [sp, #0x14] + mov r6, r1 + ldr r3, [r7, #4] + ldr r1, [r7, #8] + add r3, r3, r6 + sub r1, r3, r1 + mov r5, r2 + bl ov45_022385A4 + mov r3, r4 + mov r1, r0 + strb r3, [sp, #3] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #8 + strb r3, [sp, #4] + bl ov45_02238A3C + ldr r4, [r7, #4] + mov r3, #0 + ldr r1, [sp, #8] + mov r0, #0xc + mla r2, r4, r0, r1 + ldr r1, [sp, #0xc] + str r4, [sp, #0x18] + mla r4, r1, r0, r2 + strb r3, [sp, #2] + cmp r6, #0 + beq _02238734 +_02238708: + cmp r4, #0 + beq _0223871C + mov r0, r4 + mov r1, r5 + bl ov45_02237A24 +_0223871C: + ldr r0, [sp, #0xc] + subs r6, r6, #1 + add r0, r0, #1 + str r0, [sp, #0xc] + add r4, r4, #0xc + bne _02238708 +_02238734: + ldr r6, [r7] + ldr r1, [r7, #4] + mov r0, #0xc + mla r5, r1, r0, r6 + mov r3, #0 + ldr r2, [sp, #8] + ldr r1, [sp, #0x18] + strb r3, [sp, #1] + mla r4, r1, r0, r2 + cmp r5, r6 + bls _02238798 +_02238760: + sub r5, r5, #0xc + subs r4, r4, #0xc + beq _02238778 + mov r0, r4 + mov r1, r5 + bl ov45_02237A24 +_02238778: + ldr r1, [sp, #0x18] + ldr r0, [sp, #0xc] + sub r1, r1, #1 + add r0, r0, #1 + str r1, [sp, #0x18] + str r0, [sp, #0xc] + cmp r5, r6 + bhi _02238760 +_02238798: + mov r0, #0 + strb r0, [sp] + add r3, sp, #0x10 + ldr r2, [r7, #8] + ldr r1, [r3] + add r0, sp, #8 + str r1, [r7, #8] + str r2, [r3] + ldr r2, [r7] + ldr r1, [sp, #8] + str r1, [r7] + str r2, [sp, #8] + ldr r2, [r7, #4] + ldr r1, [sp, #0xc] + str r1, [r7, #4] + str r2, [sp, #0xc] + bl ov45_0223895C + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov45_02238674 + + arm_func_start ov45_022387E4 +ov45_022387E4: ; 0x022387E4 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, [r0] + ldr r3, [r0, #4] + mov r2, #0xc + mla r4, r3, r2, ip + movs r5, r1 + sub r1, r3, r5 + str r1, [r0, #4] + ldmeqia sp!, {r3, r4, r5, pc} +_02238808: + sub r4, r4, #0xc + mov r0, r4 + bl ov45_02237BC8 + subs r5, r5, #1 + bne _02238808 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022387E4 + + arm_func_start ov45_02238820 +ov45_02238820: ; 0x02238820 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + mov r3, #0 + mov r6, r0 + add r2, r6, #8 + str r3, [sp, #8] + str r3, [sp, #0xc] + str r3, [sp, #0x10] + str r3, [sp, #0x18] + str r2, [sp, #0x14] + mov r4, r1 + ldr r2, [r6, #4] + ldr r1, [r6, #8] + add r2, r2, r4 + sub r1, r2, r1 + bl ov45_02237890 + mov r3, #0 + mov r1, r0 + strb r3, [sp, #3] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #8 + strb r3, [sp, #4] + bl ov45_022389CC + ldr r5, [r6, #4] + ldr r2, [sp, #8] + mov r1, #0 + add r3, r2, r5 + ldr r0, [sp, #0xc] + mov r2, r4 + add r0, r3, r0 + str r5, [sp, #0x18] + strb r1, [sp, #2] + bl memset + ldr r1, [sp, #0xc] + ldr r0, [sp, #0x18] + add r1, r1, r4 + str r1, [sp, #0xc] + ldr r5, [r6] + ldr r2, [r6, #4] + mov r1, #0 + strb r1, [sp, #1] + add r1, r5, r2 + sub r4, r1, r5 + sub r2, r0, r4 + ldr r0, [sp, #8] + str r2, [sp, #0x18] + add r0, r0, r2 + mov r1, r5 + mov r2, r4 + bl memcpy + mov r0, r5 + mov r1, #0 + mov r2, r4 + bl memset + ldr r1, [sp, #0xc] + mov r0, #0 + add r1, r1, r4 + str r1, [sp, #0xc] + strb r0, [sp] + str r0, [r6, #4] + add r3, sp, #0x10 + ldr r2, [r6, #8] + ldr r1, [r3] + add r0, sp, #8 + str r1, [r6, #8] + str r2, [r3] + ldr r2, [r6] + ldr r1, [sp, #8] + str r1, [r6] + str r2, [sp, #8] + ldr r2, [r6, #4] + ldr r1, [sp, #0xc] + str r1, [r6, #4] + str r2, [sp, #0xc] + bl ov45_022389B0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_02238820 + + arm_func_start ov45_0223895C +ov45_0223895C: ; 0x0223895C + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldr r2, [r4] + ldr r1, [r4, #0x10] + mov r0, #0xc + mla r5, r1, r0, r2 + ldr r1, [r4, #4] + mla r6, r1, r0, r5 + cmp r6, r5 + bls _02238998 +_02238984: + sub r6, r6, #0xc + mov r0, r6 + bl ov45_02237BC8 + cmp r6, r5 + bhi _02238984 +_02238998: + mov r1, #0 + mov r0, r4 + str r1, [r4, #4] + bl ov45_02238A74 + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_0223895C + + arm_func_start ov45_022389B0 +ov45_022389B0: ; 0x022389B0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, #0 + str r1, [r4, #4] + bl ov45_022389EC + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_022389B0 + + arm_func_start ov45_022389CC +ov45_022389CC: ; 0x022389CC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022389CC + + arm_func_start ov45_022389EC +ov45_022389EC: ; 0x022389EC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _02238A30 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _02238A30 + mov r2, r0 + bl ov00_021EC2EC +_02238A30: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022389EC + + arm_func_start ov45_02238A3C +ov45_02238A3C: ; 0x02238A3C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _02238A70 ; =0x15555555 + mov r4, r1 + mov r5, r0 + cmp r4, r2 + bls _02238A58 + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_02238A58: + mov r0, #0xc + mul r0, r4, r0 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02238A70: .word 0x15555555 + arm_func_end ov45_02238A3C + + arm_func_start ov45_02238A74 +ov45_02238A74: ; 0x02238A74 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r1, [r4] + cmp r1, #0 + beq _02238AC0 + ldr r1, [r4, #4] + mov r3, #0 + strb r3, [sp] + sub r2, sp, #4 + strb r3, [r2] + ldr r2, [r2] + bl ov45_02238ACC + ldr r1, [r4] + cmp r1, #0 + beq _02238AC0 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02238AC0: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02238A74 + + arm_func_start ov45_02238ACC +ov45_02238ACC: ; 0x02238ACC + stmdb sp!, {r3, r4, r5, lr} + ldr ip, [r0] + ldr r3, [r0, #4] + mov r2, #0xc + mla r4, r3, r2, ip + movs r5, r1 + sub r1, r3, r5 + str r1, [r0, #4] + ldmeqia sp!, {r3, r4, r5, pc} +_02238AF0: + sub r4, r4, #0xc + mov r0, r4 + bl ov45_02237BC8 + subs r5, r5, #1 + bne _02238AF0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02238ACC + + arm_func_start ov45_02238B08 +ov45_02238B08: ; 0x02238B08 + mov r1, #0 + str r1, [r0] + str r1, [r0, #4] + str r1, [r0, #8] + str r1, [r0, #0xc] + str r1, [r0, #0x10] + str r1, [r0, #0x14] + str r1, [r0, #0x18] + str r1, [r0, #0x1c] + str r1, [r0, #0x20] + str r1, [r0, #0x24] + strb r1, [r0, #0x28] + strb r1, [r0, #0x29] + str r1, [r0, #0x2c] + str r1, [r0, #0x30] + str r1, [r0, #0x34] + str r1, [r0, #0x38] + str r1, [r0, #0x3c] + str r1, [r0, #0x40] + str r1, [r0, #0x44] + str r1, [r0, #0x48] + str r1, [r0, #0x4c] + str r1, [r0, #0x50] + str r1, [r0, #0x54] + str r1, [r0, #0x58] + bx lr + arm_func_end ov45_02238B08 + + arm_func_start ov45_02238B70 +ov45_02238B70: ; 0x02238B70 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #0x30] + ldr r0, [r2] + sub r3, r3, #1 + mov r3, r3, lsl #3 + add r3, r3, #0x18 + mov r4, r1 + str r3, [r2] + cmp r0, r3 + blo _02238BA4 + cmp r4, #0 + bne _02238BAC +_02238BA4: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02238BAC: + ldr r0, [r5, #0x1c] + str r0, [r4] + ldr r0, [r5, #0x20] + str r0, [r4, #4] + ldr r0, [r5, #0x24] + str r0, [r4, #8] + ldrb r0, [r5, #0x28] + strb r0, [r4, #0xc] + ldrb r0, [r5, #0x29] + strb r0, [r4, #0xd] + ldr r0, [r5, #0x30] + strh r0, [r4, #0xe] + ldrh r0, [r4, #0xe] + cmp r0, #0 + beq _02238C00 + add r0, r5, #0x2c + bl ov45_02238C08 + ldr r2, [r5, #0x30] + add r1, r4, #0x10 + mov r2, r2, lsl #3 + bl MI_CpuCopy8 +_02238C00: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02238B70 + + arm_func_start ov45_02238C08 +ov45_02238C08: ; 0x02238C08 + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldrne r0, [r0] + bx lr + arm_func_end ov45_02238C08 + + arm_func_start ov45_02238C1C +ov45_02238C1C: ; 0x02238C1C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, #0 + mov r5, r0 + add r2, sp, #0 + mov r0, r4 + str r1, [sp] + bl ov45_02238B70 + ldr r1, [sp] + mov r2, #0 + str r2, [r5] + str r2, [r5, #4] + mov r0, r5 + str r2, [r5, #8] + bl ov45_022377AC + mov r0, r5 + bl ov45_02231C78 + mov r1, r0 + add r2, sp, #0 + mov r0, r4 + bl ov45_02238B70 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02238C1C + + arm_func_start ov45_02238C74 +ov45_02238C74: ; 0x02238C74 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r0 + mov r4, r1 + bl ov45_0223AC78 + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r4, #0xc] + add r1, r4, #0x10 + mov r3, #0 + strb r0, [r5, #0x28] + ldrb r0, [r4, #0xd] + sub r2, sp, #4 + strb r0, [r5, #0x29] + ldr ip, [r4] + add r0, r5, #0x2c + str ip, [r5, #0x1c] + ldr ip, [r4, #4] + str ip, [r5, #0x20] + ldr ip, [r4, #8] + str ip, [r5, #0x24] + ldrh r4, [r4, #0xe] + strb r3, [sp, #1] + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r4, lsl #3 + bl ov45_0223AAE4 + ldr r0, [r5, #0x2c] + ldr r1, [r5, #0x30] + ldrb r2, [sp, #2] + sub r3, sp, #4 + add r1, r0, r1, lsl #3 + strb r2, [r3] + ldr r2, [r3] + str r1, [sp, #0x10] + str r0, [sp, #0x14] + bl ov45_022391EC + ldr r2, [r5, #0x2c] + ldr r1, [r5, #0x30] + ldrb r0, [sp] + add r4, r2, r1, lsl #3 + str r4, [sp, #4] + ldr r1, [r5, #0x2c] + sub r2, sp, #4 + strb r0, [r2] + ldr r3, [r2] + add r2, sp, #4 + add r0, r5, #0x38 + str r4, [sp, #8] + str r1, [sp, #0xc] + bl ov45_02238D54 + mov r0, #1 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02238C74 + + arm_func_start ov45_02238D54 +ov45_02238D54: ; 0x02238D54 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x3c + mov r5, r2 + ldr r3, [r5] + ldr r2, [sp, #0x54] + mov r6, r0 + sub r1, r3, r2 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + mov r1, r0, asr #3 + str r1, [sp, #0x10] + ldr r1, [r6, #4] + str r2, [sp, #8] + cmp r1, r0, asr #3 + addlo r0, r6, #4 + addhs r0, sp, #0x10 + ldr r4, [r0] + ldr r1, [sp, #0x54] + str r3, [sp, #4] + add r3, r1, r4, lsl #3 + add r0, sp, #0x14 + mov r1, r6 + mov r2, #0 + str r3, [sp, #0xc] + bl ov45_0223B250 + add r1, sp, #0x54 + add r0, sp, #0xc + ldr r2, [r0] + ldr r1, [r1] + add r0, sp, #0x28 + add r3, sp, #0x14 + bl ov45_02239090 + ldr r0, [sp, #0x10] + subs r0, r0, r4 + str r0, [sp, #0x10] + beq _02238E18 + ldrb r0, [sp, #1] + sub r2, sp, #4 + add r1, sp, #0xc + strb r0, [r2] + ldr r3, [r2] + mov r0, r6 + mov r2, r5 + bl ov45_02238E60 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_02238E18: + ldr r3, [r6, #4] + cmp r4, r3 + addhs sp, sp, #0x3c + ldmhsia sp!, {r3, r4, r5, r6, lr} + addhs sp, sp, #0x10 + bxhs lr + mov r1, #0 + strb r1, [sp] + sub r0, sp, #4 + strb r1, [r0] + ldr r2, [r0] + mov r0, r6 + sub r1, r3, r4 + bl ov45_0223B764 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02238D54 + + arm_func_start ov45_02238E60 +ov45_02238E60: ; 0x02238E60 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x38 + mov r5, r1 + mov r4, r2 + ldr r1, [r5] + ldr ip, [r4] + mov r6, r0 + cmp r1, ip + addeq sp, sp, #0x38 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r3, [r5] + ldr r1, [r6, #0x10] + sub r2, ip, r3 + mov r0, r2, asr #2 + add r0, r2, r0, lsr #29 + str r3, [sp, #0xc] + cmp r1, #0 + mov r2, r0, asr #3 + subne r0, r1, #1 + moveq r3, #0 + movne r3, r0, lsl #7 + ldr r1, [r6] + ldr r0, [r6, #4] + str ip, [sp, #8] + add r0, r1, r0 + sub r1, r3, r0 + cmp r2, r1 + bls _02238EDC + mov r0, r6 + sub r1, r2, r1 + bl ov45_0223B2DC +_02238EDC: + ldr r2, [r6, #4] + add r0, sp, #0x10 + mov r1, r6 + bl ov45_0223B250 + add r0, r6, #8 + str r0, [sp] + add r0, r6, #4 + str r0, [sp, #4] + ldr r1, [r5] + ldr r2, [r4] + add r0, sp, #0x24 + add r3, sp, #0x10 + bl ov45_02238F18 + add sp, sp, #0x38 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02238E60 + + arm_func_start ov45_02238F18 +ov45_02238F18: ; 0x02238F18 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + ldr r4, [sp, #0x2c] + ldr r2, [sp, #0x30] + ldr r1, [sp, #0x3c] + cmp r4, r2 + beq _02239058 + sub r4, r2, r4 + mov r2, r4, asr #2 + add r2, r4, r2, lsr #29 + mov r2, r2, asr #3 + str r2, [sp, #0x10] +_02238F4C: + ldr r4, [r3, #0x10] + cmp r4, #0 + moveq r2, r4 + ldrne r2, [r3] + ldrne r2, [r2] + addne r2, r2, #0x400 + sub r4, r2, r4 + mov r2, r4, asr #2 + add r2, r4, r2, lsr #29 + ldr r4, [sp, #0x10] + mov ip, r2, asr #3 + cmp r4, r2, asr #3 + addgt r2, sp, #8 + str ip, [sp, #8] + addle r2, sp, #0x10 + ldr r4, [sp, #0x2c] + ldr r5, [r2] + str r4, [sp, #4] + add lr, r4, r5, lsl #3 + str lr, [sp, #0xc] + str lr, [sp] + cmp r4, lr + ldr r6, [r3, #0x10] + beq _02238FE4 +_02238FAC: + cmp r6, #0 + beq _02238FC4 + ldr ip, [r4] + ldr r2, [r4, #4] + str ip, [r6] + str r2, [r6, #4] +_02238FC4: + ldr r2, [r1] + add r4, r4, #8 + add r2, r2, #1 + str r2, [r1] + cmp r4, lr + add r6, r6, #8 + bne _02238FAC + str r4, [sp, #4] +_02238FE4: + ldr ip, [sp, #0x10] + sub r2, r5, #1 + sub ip, ip, r5 + str ip, [sp, #0x10] + ldr ip, [r3, #0x10] + add r2, ip, r2, lsl #3 + str r2, [r3, #0x10] + add ip, r2, #8 + ldr r2, [r3] + str ip, [r3, #0x10] + ldr r2, [r2] + add r2, r2, #0x400 + cmp ip, r2 + bne _02239044 + ldr r2, [r3] + add ip, r2, #4 + str ip, [r3] + ldr r2, [r3, #0xc] + cmp ip, r2 + ldreq r2, [r3, #4] + streq r2, [r3] + ldr r2, [r3] + ldr r2, [r2] + str r2, [r3, #0x10] +_02239044: + ldr r2, [sp, #0x10] + cmp r2, #0 + ldrne r2, [sp, #0xc] + strne r2, [sp, #0x2c] + bne _02238F4C +_02239058: + ldr r1, [r3] + str r1, [r0] + ldr r1, [r3, #4] + str r1, [r0, #4] + ldr r1, [r3, #8] + str r1, [r0, #8] + ldr r1, [r3, #0xc] + str r1, [r0, #0xc] + ldr r1, [r3, #0x10] + str r1, [r0, #0x10] + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02238F18 + + arm_func_start ov45_02239090 +ov45_02239090: ; 0x02239090 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + ldr r2, [sp, #0x24] + ldr r1, [sp, #0x28] + cmp r2, r1 + beq _022391B4 + sub r2, r1, r2 + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + mov r1, r1, asr #3 + str r1, [sp, #0x10] +_022390C0: + ldr r2, [r3, #0x10] + cmp r2, #0 + moveq r1, r2 + ldrne r1, [r3] + ldrne r1, [r1] + addne r1, r1, #0x400 + sub r2, r1, r2 + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + ldr r2, [sp, #0x10] + mov ip, r1, asr #3 + cmp r2, r1, asr #3 + addgt r1, sp, #8 + str ip, [sp, #8] + addle r1, sp, #0x10 + ldr r2, [sp, #0x24] + ldr ip, [r1] + str r2, [sp, #4] + add r4, r2, ip, lsl #3 + str r4, [sp, #0xc] + str r4, [sp] + cmp r2, r4 + ldr lr, [r3, #0x10] + bhs _02239140 +_02239120: + ldr r1, [r2] + str r1, [lr] + ldr r1, [r2, #4] + add r2, r2, #8 + str r1, [lr, #4] + cmp r2, r4 + add lr, lr, #8 + blo _02239120 +_02239140: + ldr r2, [sp, #0x10] + sub r1, ip, #1 + sub r2, r2, ip + str r2, [sp, #0x10] + ldr r2, [r3, #0x10] + add r1, r2, r1, lsl #3 + str r1, [r3, #0x10] + add r2, r1, #8 + ldr r1, [r3] + str r2, [r3, #0x10] + ldr r1, [r1] + add r1, r1, #0x400 + cmp r2, r1 + bne _022391A0 + ldr r1, [r3] + add r2, r1, #4 + str r2, [r3] + ldr r1, [r3, #0xc] + cmp r2, r1 + ldreq r1, [r3, #4] + streq r1, [r3] + ldr r1, [r3] + ldr r1, [r1] + str r1, [r3, #0x10] +_022391A0: + ldr r1, [sp, #0x10] + cmp r1, #0 + ldrne r1, [sp, #0xc] + strne r1, [sp, #0x24] + bne _022390C0 +_022391B4: + ldr r1, [r3] + str r1, [r0] + ldr r1, [r3, #4] + str r1, [r0, #4] + ldr r1, [r3, #8] + str r1, [r0, #8] + ldr r1, [r3, #0xc] + str r1, [r0, #0xc] + ldr r1, [r3, #0x10] + str r1, [r0, #0x10] + add sp, sp, #0x14 + ldmia sp!, {r3, r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239090 + + arm_func_start ov45_022391EC +ov45_022391EC: ; 0x022391EC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #0x30 + ldr r1, [sp, #0x3c] + ldr r0, [sp, #0x38] + sub r1, r1, r0 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + mov r1, r0, asr #3 + cmp r1, #0x14 + movle r1, #0 + add r0, sp, #0xc + bl ov45_0223AA80 + ldr r4, [sp, #0xc] + ldr r3, [sp, #0x10] + add ip, sp, #0x24 + mov r2, #0 + add lr, r4, r3, lsl #3 + str r3, [sp, #0x24] + str r2, [sp, #0x28] + str r4, [sp, #0x2c] + add r0, sp, #0x38 + add r1, sp, #0x3c + str lr, [sp] + add r3, sp, #0x40 + str ip, [sp, #4] + ldr r0, [r0] + ldr r1, [r1] + add r2, sp, #0x1c + str r4, [sp, #0x1c] + str ip, [sp, #0x20] + str r3, [sp, #8] + str lr, [sp, #0x14] + str ip, [sp, #0x18] + ldmia r2, {r2, r3} + bl ov45_02239294 + ldr r0, [sp, #0x2c] + bl _ZdaPv + add sp, sp, #0x30 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022391EC + + arm_func_start ov45_02239294 +ov45_02239294: ; 0x02239294 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x4c + ldr r0, [sp, #0x64] + ldr r6, [sp, #0x60] + ldr r7, [sp, #0x78] + sub r1, r0, r6 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + mov r5, r0, asr #3 + cmp r5, #1 + addle sp, sp, #0x4c + ldmleia sp!, {r4, r5, r6, r7, lr} + addle sp, sp, #0x10 + bxle lr + cmp r5, #2 + bne _02239338 + ldr r0, [sp, #0x64] + ldr r1, [sp, #0x60] + sub r4, r0, #8 + ldr r3, [r4] + ldr r0, [r1] + str r4, [sp, #0x64] + cmp r3, r0 + addge sp, sp, #0x4c + ldmgeia sp!, {r4, r5, r6, r7, lr} + addge sp, sp, #0x10 + bxge lr + ldr r2, [r1] + ldr r1, [r1, #4] + str r2, [sp, #0x1c] + str r3, [r6] + ldr r0, [r4, #4] + str r1, [sp, #0x20] + str r0, [r6, #4] + str r2, [r4] + add sp, sp, #0x4c + str r1, [r4, #4] + ldmia sp!, {r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_02239338: + cmp r5, #0x14 + bgt _02239368 + add r0, sp, #0x60 + add r1, sp, #0x64 + ldr r0, [r0] + ldr r1, [r1] + mov r2, r7 + bl ov45_0223A9C0 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_02239368: + ldr r2, [sp, #0x70] + ldr r1, [sp, #0x68] + add r0, r5, r5, lsr #31 + sub r2, r2, r1 + mov r1, r2, asr #2 + add r2, r2, r1, lsr #29 + sub r4, r5, r0, asr #1 + ldr r1, [sp, #0x60] + cmp r5, r2, asr #3 + add r1, r1, r4, lsl #3 + str r1, [sp, #0x48] + add r0, sp, #0x60 + add r2, sp, #0x68 + bgt _0223944C + ldr r0, [r0] + str r7, [sp] + ldmia r2, {r2, r3} + bl ov45_0223A0CC + ldr r2, [sp, #0x68] + add r0, sp, #0x48 + add r3, r2, r4, lsl #3 + add r1, sp, #0x64 + ldr r6, [sp, #0x6c] + ldr r0, [r0] + ldr r1, [r1] + add r2, sp, #0x40 + str r6, [sp, #0x44] + str r3, [sp, #0x40] + str r7, [sp] + ldmia r2, {r2, r3} + bl ov45_0223A0CC + ldr r0, [sp, #0x68] + add r1, sp, #0x68 + add r2, r0, r4, lsl #3 + add r3, r0, r5, lsl #3 + stmib sp, {r2, r6} + str r3, [sp, #0xc] + ldr r0, [sp, #0x60] + str r6, [sp, #0x10] + str r0, [sp, #0x14] + str r7, [sp, #0x18] + sub r0, sp, #4 + stmia r0, {r2, r6} + str r3, [sp, #0x24] + ldr r3, [r0] + add r0, sp, #0x3c + str r6, [sp, #0x28] + str r2, [sp, #0x2c] + str r2, [sp, #0x34] + str r6, [sp, #0x30] + str r6, [sp, #0x38] + ldmia r1, {r1, r2} + bl ov45_02239F48 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223944C: + ldr r4, [sp, #0x70] + ldr r3, [sp, #0x74] + str r4, [sp] + stmib sp, {r3, r7} + ldr r0, [r0] + ldmia r2, {r2, r3} + bl ov45_02239294 + ldr r4, [sp, #0x70] + add r0, sp, #0x48 + add r1, sp, #0x64 + ldr r3, [sp, #0x74] + str r4, [sp] + ldr r0, [r0] + ldr r1, [r1] + add r2, sp, #0x68 + stmib sp, {r3, r7} + ldmia r2, {r2, r3} + bl ov45_02239294 + add r0, sp, #0x60 + add r1, sp, #0x48 + add r2, sp, #0x64 + ldr ip, [sp, #0x48] + ldr r3, [sp, #0x60] + ldr r0, [r0] + sub r5, ip, r3 + mov r4, r5, asr #2 + add r4, r5, r4, lsr #29 + mov r4, r4, asr #3 + str r4, [sp] + ldr r4, [sp, #0x64] + ldr r5, [sp, #0x68] + sub r6, r4, ip + mov r4, r6, asr #2 + add r4, r6, r4, lsr #29 + mov r4, r4, asr #3 + str r4, [sp, #4] + str r5, [sp, #8] + ldr r4, [sp, #0x6c] + ldr r5, [sp, #0x70] + str r4, [sp, #0xc] + ldr r1, [r1] + ldr r2, [r2] + ldr r4, [sp, #0x74] + str r5, [sp, #0x10] + mov r3, r7 + str r4, [sp, #0x14] + bl ov45_02239518 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239294 + + arm_func_start ov45_02239518 +ov45_02239518: ; 0x02239518 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x88 + ldr r8, [sp, #0xb0] + ldr r7, [sp, #0xb4] + cmp r8, #0 + cmpne r7, #0 + mov r4, r3 + addeq sp, sp, #0x88 + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + addeq sp, sp, #0x10 + bxeq lr + add r0, r8, r7 + cmp r0, #2 + bne _022395B4 + ldr r6, [sp, #0xa4] + ldr r1, [sp, #0xa0] + ldr r5, [r6] + ldr r0, [r1] + cmp r5, r0 + addge sp, sp, #0x88 + ldmgeia sp!, {r4, r5, r6, r7, r8, lr} + addge sp, sp, #0x10 + bxge lr + ldr r4, [r1] + ldr r3, [r1, #4] + ldr r2, [sp, #0xa0] + ldr r0, [sp, #0xa4] + str r5, [r2] + ldr r1, [r6, #4] + str r4, [sp, #0x54] + str r1, [r2, #4] + str r4, [r0] + str r3, [sp, #0x58] + str r3, [r0, #4] + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr +_022395B4: + ldr r1, [sp, #0xc0] + ldr r0, [sp, #0xb8] + cmp r8, r7 + sub r1, r1, r0 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + cmple r8, r0, asr #3 + bgt _022396FC + ldr r1, [sp, #0xa4] + ldr r0, [sp, #0xa0] + ldr r3, [sp, #0xb8] + ldr r2, [sp, #0xbc] + str r0, [sp, #0x50] + cmp r0, r1 + movne r0, #1 + moveq r0, #0 + str r3, [sp, #0x44] + str r2, [sp, #0x48] + str r1, [sp, #0x4c] + cmp r0, #0 + beq _022396A0 + cmp r0, #0 + add r1, sp, #0x3c + beq _022396A0 + ldr r5, [sp, #0x50] + ldr r3, [sp, #0x4c] +_0223961C: + ldr r0, [sp, #0x44] + ldr r6, [sp, #0x48] + str r0, [sp, #0x3c] + str r6, [sp, #0x40] + ldr r2, [r6, #8] + ldr r6, [r6, #4] + sub r7, r0, r2 + mov r2, r7, asr #2 + add r2, r7, r2, lsr #29 + cmp r6, r2, asr #3 + ble _0223965C + ldr r2, [r5] + str r2, [r0] + ldr r2, [r5, #4] + str r2, [r0, #4] + b _02239684 +_0223965C: + cmp r0, #0 + beq _02239674 + ldr r6, [r5] + ldr r2, [r5, #4] + str r6, [r0] + str r2, [r0, #4] +_02239674: + ldr r2, [r1, #4] + ldr r0, [r2, #4] + add r0, r0, #1 + str r0, [r2, #4] +_02239684: + ldr r0, [sp, #0x44] + add r5, r5, #8 + add r0, r0, #8 + str r0, [sp, #0x44] + cmp r5, r3 + bne _0223961C + str r5, [sp, #0x50] +_022396A0: + ldr r0, [sp, #0xa4] + ldr r1, [sp, #0xa8] + str r0, [sp, #4] + str r1, [sp, #8] + ldr r0, [sp, #0xa0] + ldr r5, [sp, #0x44] + str r0, [sp, #0xc] + ldr r2, [sp, #0x48] + str r4, [sp, #0x10] + sub r0, sp, #4 + str r5, [r0] + str r2, [r0, #4] + ldr r3, [r0] + add r1, sp, #0xb8 + str r2, [sp, #0x78] + add r0, sp, #0x7c + str r5, [sp, #0x74] + ldmia r1, {r1, r2} + bl ov45_02239DF0 + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr +_022396FC: + cmp r7, r0, asr #3 + bgt _02239830 + ldr r1, [sp, #0xa4] + ldr r0, [sp, #0xa8] + ldr r3, [sp, #0xb8] + ldr r2, [sp, #0xbc] + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + str r3, [sp, #0x30] + str r2, [sp, #0x34] + str r1, [sp, #0x38] + cmp r0, #0 + beq _022397CC + cmp r0, #0 + add r1, sp, #0x28 + beq _022397CC + ldr r5, [sp, #0x38] + ldr r3, [sp, #0xa8] +_02239748: + ldr r0, [sp, #0x30] + ldr r6, [sp, #0x34] + str r0, [sp, #0x28] + str r6, [sp, #0x2c] + ldr r2, [r6, #8] + ldr r6, [r6, #4] + sub r7, r0, r2 + mov r2, r7, asr #2 + add r2, r7, r2, lsr #29 + cmp r6, r2, asr #3 + ble _02239788 + ldr r2, [r5] + str r2, [r0] + ldr r2, [r5, #4] + str r2, [r0, #4] + b _022397B0 +_02239788: + cmp r0, #0 + beq _022397A0 + ldr r6, [r5] + ldr r2, [r5, #4] + str r6, [r0] + str r2, [r0, #4] +_022397A0: + ldr r2, [r1, #4] + ldr r0, [r2, #4] + add r0, r0, #1 + str r0, [r2, #4] +_022397B0: + ldr r0, [sp, #0x30] + add r5, r5, #8 + add r0, r0, #8 + str r0, [sp, #0x30] + cmp r5, r3 + bne _02239748 + str r5, [sp, #0x38] +_022397CC: + ldr r6, [sp, #0x30] + ldr r5, [sp, #0x34] + str r6, [sp, #4] + ldr r0, [sp, #0xa8] + str r5, [sp, #8] + str r0, [sp, #0xc] + str r4, [sp, #0x10] + add r1, sp, #0xa0 + ldr r3, [sp, #0xb8] + sub r4, sp, #4 + ldr r2, [sp, #0xbc] + str r3, [r4] + str r2, [r4, #4] + add r0, sp, #0xa4 + ldr r2, [r0] + ldr r3, [r4] + ldr r1, [r1] + add r0, sp, #0x70 + str r6, [sp, #0x68] + str r5, [sp, #0x6c] + bl ov45_02239BBC + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr +_02239830: + cmp r8, r7 + bgt _02239890 + add r1, sp, #0xa0 + add r2, sp, #0xa4 + add r0, r7, r7, lsr #31 + mov r6, r0, asr #1 + ldr r3, [sp, #0xa4] + ldr r1, [r1] + add r3, r3, r6, lsl #3 + ldr r2, [r2] + add r0, sp, #0x64 + str r4, [sp] + str r3, [sp, #0x80] + bl ov45_02239B3C + ldr r3, [sp, #0x64] + ldr r2, [sp, #0xa0] + str r3, [sp, #0x84] + sub r1, r3, r2 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + str r3, [sp, #0x20] + str r2, [sp, #0x24] + mov r5, r0, asr #3 + b _022398E4 +_02239890: + add r1, sp, #0xa4 + add r2, sp, #0xa8 + add r0, r8, r8, lsr #31 + mov r5, r0, asr #1 + ldr r3, [sp, #0xa0] + ldr r1, [r1] + add r3, r3, r5, lsl #3 + ldr r2, [r2] + add r0, sp, #0x60 + str r4, [sp] + str r3, [sp, #0x84] + bl ov45_02239ABC + ldr r3, [sp, #0x60] + ldr r2, [sp, #0xa4] + str r3, [sp, #0x80] + sub r1, r3, r2 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + str r3, [sp, #0x18] + str r2, [sp, #0x1c] + mov r6, r0, asr #3 +_022398E4: + add r1, sp, #0x84 + add r2, sp, #0xa4 + add r0, sp, #0x80 + ldr r3, [r0] + ldr r1, [r1] + ldr r2, [r2] + add r0, sp, #0x5c + bl ov45_022399A8 + ldr r2, [sp, #0x5c] + add r0, sp, #0xa0 + add r1, sp, #0x84 + ldr r3, [sp, #0xb8] + stmia sp, {r5, r6} + str r3, [sp, #8] + ldr ip, [sp, #0xbc] + ldr r3, [sp, #0xc0] + str ip, [sp, #0xc] + str r3, [sp, #0x10] + ldr ip, [sp, #0xc4] + ldr r0, [r0] + ldr r1, [r1] + mov r3, r4 + str ip, [sp, #0x14] + str r2, [sp, #0xa4] + bl ov45_02239518 + sub r2, r8, r5 + str r2, [sp] + sub r5, r7, r6 + str r5, [sp, #4] + ldr r3, [sp, #0xb8] + add r0, sp, #0xa4 + add r1, sp, #0x80 + add r2, sp, #0xa8 + str r3, [sp, #8] + ldr r5, [sp, #0xbc] + ldr r3, [sp, #0xc0] + str r5, [sp, #0xc] + str r3, [sp, #0x10] + ldr r5, [sp, #0xc4] + ldr r0, [r0] + ldr r1, [r1] + ldr r2, [r2] + mov r3, r4 + str r5, [sp, #0x14] + bl ov45_02239518 + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239518 + + arm_func_start ov45_022399A8 +ov45_022399A8: ; 0x022399A8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + ldr r4, [sp, #0x24] + ldr lr, [sp, #0x28] + cmp r4, lr + ldreq r1, [sp, #0x2c] + addeq sp, sp, #0x10 + streq r1, [r0] + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr ip, [sp, #0x2c] + cmp lr, ip + ldreq r1, [sp, #0x24] + addeq sp, sp, #0x10 + streq r1, [r0] + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r5, [sp, #0x28] +_022399FC: + ldr r3, [r4] + ldr r2, [r4, #4] + ldr r1, [r5] + str r3, [sp, #8] + str r1, [r4] + ldr r1, [r5, #4] + str r2, [sp, #0xc] + str r1, [r4, #4] + str r3, [r5] + str r2, [r5, #4] + add r5, r5, #8 + cmp r5, ip + add r4, r4, #8 + beq _02239A40 + cmp r4, lr + moveq lr, r5 + b _022399FC +_02239A40: + mov r5, r4 + cmp r4, lr + beq _02239AA8 + ldr r1, [sp, #0x2c] + mov r6, lr +_02239A54: + ldr ip, [r4] + ldr r3, [r4, #4] + ldr r2, [r6] + str ip, [sp] + str r2, [r4] + ldr r2, [r6, #4] + str r3, [sp, #4] + str r2, [r4, #4] + str ip, [r6] + str r3, [r6, #4] + add r6, r6, #8 + cmp r6, r1 + add r4, r4, #8 + bne _02239A9C + cmp r4, lr + beq _02239AA8 + mov r6, lr + b _02239A54 +_02239A9C: + cmp r4, lr + moveq lr, r6 + b _02239A54 +_02239AA8: + str r5, [r0] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022399A8 + + arm_func_start ov45_02239ABC +ov45_02239ABC: ; 0x02239ABC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr ip, [sp, #0x14] + ldr r1, [sp, #0x18] + str ip, [sp] + sub r2, r1, ip + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + mov lr, r1, asr #3 + cmp lr, #0 + ble _02239B24 + ldr r4, [r3] +_02239AF0: + add r1, lr, lr, lsr #31 + mov r3, r1, asr #1 + ldr r1, [ip, r3, lsl #3] + add r2, ip, r3, lsl #3 + cmp r1, r4 + movge lr, r3 + bge _02239B1C + add ip, r2, #8 + add r1, r3, #1 + str ip, [sp, #0x14] + sub lr, lr, r1 +_02239B1C: + cmp lr, #0 + bgt _02239AF0 +_02239B24: + ldr r1, [sp, #0x14] + str r1, [r0] + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239ABC + + arm_func_start ov45_02239B3C +ov45_02239B3C: ; 0x02239B3C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr ip, [sp, #0x14] + ldr r1, [sp, #0x18] + str ip, [sp] + sub r2, r1, ip + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + mov lr, r1, asr #3 + cmp lr, #0 + ble _02239BA4 + ldr r4, [r3] +_02239B70: + add r1, lr, lr, lsr #31 + mov r3, r1, asr #1 + ldr r1, [ip, r3, lsl #3] + add r2, ip, r3, lsl #3 + cmp r4, r1 + movlt lr, r3 + blt _02239B9C + add ip, r2, #8 + add r1, r3, #1 + str ip, [sp, #0x14] + sub lr, lr, r1 +_02239B9C: + cmp lr, #0 + bgt _02239B70 +_02239BA4: + ldr r1, [sp, #0x14] + str r1, [r0] + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239B3C + + arm_func_start ov45_02239BBC +ov45_02239BBC: ; 0x02239BBC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x40 + ldr r3, [sp, #0x54] + ldr r1, [sp, #0x58] + cmp r3, r1 + bne _02239C48 + ldr r5, [sp, #0x6c] + ldr r4, [sp, #0x64] + ldr r3, [sp, #0x5c] + ldr r2, [sp, #0x68] + ldr r1, [sp, #0x60] + str r5, [sp, #0x2c] + str r4, [sp, #0x30] + str r2, [sp, #0x34] + str r3, [sp, #0x38] + str r1, [sp, #0x3c] + cmp r4, r3 + beq _02239C30 +_02239C08: + ldr r1, [sp, #0x30] + sub r2, r1, #8 + ldr r1, [r2] + str r2, [sp, #0x30] + str r1, [r5, #-8]! + ldr r1, [r2, #4] + cmp r2, r3 + str r1, [r5, #4] + bne _02239C08 + str r5, [sp, #0x2c] +_02239C30: + ldr r1, [sp, #0x2c] + add sp, sp, #0x40 + str r1, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02239C48: + ldr r2, [sp, #0x5c] + ldr r1, [sp, #0x64] + cmp r2, r1 + bne _02239CA4 + ldr r3, [sp, #0x6c] + ldr r2, [sp, #0x58] + ldr r4, [sp, #0x54] + str r3, [sp, #0x20] + str r2, [sp, #0x24] + str r4, [sp, #0x28] + cmp r2, r4 + bls _02239C90 +_02239C78: + ldr r1, [r2, #-8]! + cmp r2, r4 + str r1, [r3, #-8]! + ldr r1, [r2, #4] + str r1, [r3, #4] + bhi _02239C78 +_02239C90: + add sp, sp, #0x40 + str r3, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02239CA4: + ldr r1, [sp, #0x58] + ldr r4, [sp, #0x64] + sub r1, r1, #8 + sub r4, r4, #8 + ldr ip, [sp, #0x6c] + str r1, [sp, #0x58] + str r4, [sp, #0x64] +_02239CC0: + ldr r5, [sp, #0x64] + ldr lr, [r1] + ldr r4, [r5] + cmp r4, lr + bge _02239D6C + str lr, [ip, #-8]! + ldr lr, [r1, #4] + str ip, [sp, #0x6c] + str lr, [ip, #4] + cmp r3, r1 + bne _02239D60 + ldr r1, [sp, #0x64] + ldr r2, [sp, #0x68] + add lr, r1, #8 + ldr r3, [sp, #0x5c] + ldr r1, [sp, #0x60] + str ip, [sp, #0xc] + str lr, [sp, #0x64] + str lr, [sp, #0x10] + str r2, [sp, #0x14] + str r3, [sp, #0x18] + str r1, [sp, #0x1c] + cmp lr, r3 + beq _02239D48 +_02239D20: + ldr r1, [sp, #0x10] + sub r2, r1, #8 + ldr r1, [r2] + str r2, [sp, #0x10] + str r1, [ip, #-8]! + ldr r1, [r2, #4] + cmp r2, r3 + str r1, [ip, #4] + bne _02239D20 + str ip, [sp, #0xc] +_02239D48: + ldr r1, [sp, #0xc] + add sp, sp, #0x40 + str r1, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02239D60: + sub r1, r1, #8 + str r1, [sp, #0x58] + b _02239CC0 +_02239D6C: + str r4, [ip, #-8]! + ldr lr, [r5, #4] + str ip, [sp, #0x6c] + str lr, [ip, #4] + cmp r2, r5 + bne _02239DD0 + ldr r3, [sp, #0x54] + add r2, r1, #8 + str ip, [sp] + str r2, [sp, #0x58] + str r2, [sp, #4] + str r3, [sp, #8] + cmp r2, r3 + bls _02239DBC +_02239DA4: + ldr r1, [r2, #-8]! + cmp r2, r3 + str r1, [ip, #-8]! + ldr r1, [r2, #4] + str r1, [ip, #4] + bhi _02239DA4 +_02239DBC: + str ip, [r0] + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02239DD0: + ldr lr, [sp, #0x64] + sub lr, lr, #8 + str lr, [sp, #0x64] + b _02239CC0 + arm_func_end ov45_02239BBC + + arm_func_start ov45_02239DE0 +ov45_02239DE0: ; 0x02239DE0 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239DE0 + + arm_func_start ov45_02239DF0 +ov45_02239DF0: ; 0x02239DF0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + ldr r4, [sp, #0x44] + ldr r1, [sp, #0x48] + ldr ip, [sp, #0x4c] + ldr r2, [sp, #0x3c] + b _02239E5C +_02239E10: + ldr lr, [sp, #0x34] + ldr r5, [r4] + ldr r3, [lr] + cmp r5, r3 + bge _02239E3C + str r5, [ip] + ldr r3, [r4, #4] + add r4, r4, #8 + str r3, [ip, #4] + str r4, [sp, #0x44] + b _02239E54 +_02239E3C: + str r3, [ip] + ldr r3, [sp, #0x34] + ldr lr, [lr, #4] + add r3, r3, #8 + str lr, [ip, #4] + str r3, [sp, #0x34] +_02239E54: + add ip, ip, #8 + str ip, [sp, #0x4c] +_02239E5C: + ldr r3, [sp, #0x34] + cmp r3, r2 + cmpne r4, r1 + bne _02239E10 + ldr r2, [sp, #0x34] + ldr r1, [sp, #0x3c] + cmp r2, r1 + bne _02239ED0 + ldr r3, [sp, #0x4c] + ldr r4, [sp, #0x48] + ldr r2, [sp, #0x44] + str r3, [sp, #0x14] + str r4, [sp, #0x18] + str r2, [sp, #0x1c] + cmp r2, r4 + bhs _02239EBC +_02239E9C: + ldr r1, [r2] + str r1, [r3] + ldr r1, [r2, #4] + add r2, r2, #8 + str r1, [r3, #4] + cmp r2, r4 + add r3, r3, #8 + blo _02239E9C +_02239EBC: + add sp, sp, #0x20 + str r3, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02239ED0: + ldr lr, [sp, #0x4c] + ldr ip, [sp, #0x3c] + ldr r2, [sp, #0x34] + ldr r3, [sp, #0x40] + ldr r1, [sp, #0x38] + str lr, [sp] + str ip, [sp, #4] + str r3, [sp, #8] + str r2, [sp, #0xc] + str r1, [sp, #0x10] + cmp r2, ip + beq _02239F30 +_02239F00: + ldr r3, [sp, #0xc] + ldr r2, [r3] + mov r1, r3 + str r2, [lr] + add r1, r1, #8 + ldr r2, [r3, #4] + str r1, [sp, #0xc] + str r2, [lr, #4] + cmp r1, ip + add lr, lr, #8 + bne _02239F00 + str lr, [sp] +_02239F30: + ldr r1, [sp] + str r1, [r0] + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239DF0 + + arm_func_start ov45_02239F48 +ov45_02239F48: ; 0x02239F48 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + ldr r1, [sp, #0x54] + ldr ip, [sp, #0x5c] + ldr r3, [sp, #0x44] + b _02239FB8 +_02239F64: + ldr r5, [sp, #0x4c] + ldr lr, [sp, #0x3c] + ldr r4, [r5] + ldr r2, [lr] + cmp r4, r2 + bge _02239F98 + str r4, [ip] + ldr r2, [sp, #0x4c] + ldr lr, [r5, #4] + add r2, r2, #8 + str lr, [ip, #4] + str r2, [sp, #0x4c] + b _02239FB0 +_02239F98: + str r2, [ip] + ldr r2, [sp, #0x3c] + ldr lr, [lr, #4] + add r2, r2, #8 + str lr, [ip, #4] + str r2, [sp, #0x3c] +_02239FB0: + add ip, ip, #8 + str ip, [sp, #0x5c] +_02239FB8: + ldr r2, [sp, #0x3c] + cmp r2, r3 + ldrne r2, [sp, #0x4c] + cmpne r2, r1 + bne _02239F64 + ldr r2, [sp, #0x3c] + ldr r1, [sp, #0x44] + cmp r2, r1 + bne _0223A054 + ldr lr, [sp, #0x5c] + ldr ip, [sp, #0x54] + ldr r2, [sp, #0x4c] + ldr r3, [sp, #0x58] + ldr r1, [sp, #0x50] + str lr, [sp, #0x14] + str ip, [sp, #0x18] + str r3, [sp, #0x1c] + str r2, [sp, #0x20] + str r1, [sp, #0x24] + cmp r2, ip + beq _0223A03C +_0223A00C: + ldr r3, [sp, #0x20] + ldr r2, [r3] + mov r1, r3 + str r2, [lr] + add r1, r1, #8 + ldr r2, [r3, #4] + str r1, [sp, #0x20] + str r2, [lr, #4] + cmp r1, ip + add lr, lr, #8 + bne _0223A00C + str lr, [sp, #0x14] +_0223A03C: + ldr r1, [sp, #0x14] + add sp, sp, #0x28 + str r1, [r0] + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_0223A054: + ldr lr, [sp, #0x5c] + ldr ip, [sp, #0x44] + ldr r2, [sp, #0x3c] + ldr r3, [sp, #0x48] + ldr r1, [sp, #0x40] + str lr, [sp] + str ip, [sp, #4] + str r3, [sp, #8] + str r2, [sp, #0xc] + str r1, [sp, #0x10] + cmp r2, ip + beq _0223A0B4 +_0223A084: + ldr r3, [sp, #0xc] + ldr r2, [r3] + mov r1, r3 + str r2, [lr] + add r1, r1, #8 + ldr r2, [r3, #4] + str r1, [sp, #0xc] + str r2, [lr, #4] + cmp r1, ip + add lr, lr, #8 + bne _0223A084 + str lr, [sp] +_0223A0B4: + ldr r1, [sp] + str r1, [r0] + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02239F48 + + arm_func_start ov45_0223A0CC +ov45_0223A0CC: ; 0x0223A0CC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x80 + ldr r1, [sp, #0x9c] + ldr r0, [sp, #0x98] + ldr r7, [sp, #0xa8] + sub r1, r1, r0 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + mov r5, r0, asr #3 + cmp r5, #0 + addle sp, sp, #0x80 + ldmleia sp!, {r3, r4, r5, r6, r7, lr} + addle sp, sp, #0x10 + bxle lr + cmp r5, #1 + bne _0223A1A0 + ldr r3, [sp, #0xa0] + ldr r1, [sp, #0xa4] + str r3, [sp, #0x74] + str r1, [sp, #0x78] + ldr r0, [r1, #8] + ldr r1, [r1, #4] + sub r2, r3, r0 + mov r0, r2, asr #2 + add r0, r2, r0, lsr #29 + cmp r1, r0, asr #3 + add r2, sp, #0x74 + ble _0223A164 + ldr r1, [sp, #0x98] + add sp, sp, #0x80 + ldr r0, [r1] + str r0, [r3] + ldr r0, [r1, #4] + str r0, [r3, #4] + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223A164: + cmp r3, #0 + beq _0223A180 + ldr r0, [sp, #0x98] + ldr r1, [r0] + ldr r0, [r0, #4] + str r1, [r3] + str r0, [r3, #4] +_0223A180: + ldr r1, [r2, #4] + add sp, sp, #0x80 + ldr r0, [r1, #4] + add r0, r0, #1 + str r0, [r1, #4] + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223A1A0: + cmp r5, #2 + bne _0223A39C + ldr r3, [sp, #0x9c] + ldr r2, [sp, #0x98] + ldr r1, [r3, #-8] + ldr r0, [r2] + cmp r1, r0 + bge _0223A2B0 + ldr r0, [sp, #0xa4] + ldr r1, [sp, #0xa0] + str r0, [sp, #0x34] + cmp r2, r3 + movne r0, #1 + moveq r0, #0 + str r1, [sp, #0x30] + str r3, [sp, #0x38] + str r2, [sp, #0x3c] + cmp r0, #0 + addeq sp, sp, #0x80 + ldmeqia sp!, {r3, r4, r5, r6, r7, lr} + addeq sp, sp, #0x10 + bxeq lr + cmp r0, #0 + add r2, sp, #0x28 + addeq sp, sp, #0x80 + ldmeqia sp!, {r3, r4, r5, r6, r7, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r4, [sp, #0x3c] + ldr r1, [sp, #0x38] +_0223A218: + ldr r0, [sp, #0x30] + ldr r5, [sp, #0x34] + str r0, [sp, #0x28] + str r5, [sp, #0x2c] + ldr r3, [r5, #8] + sub r1, r1, #8 + sub r6, r0, r3 + mov r3, r6, asr #2 + ldr r5, [r5, #4] + add r3, r6, r3, lsr #29 + str r1, [sp, #0x38] + cmp r5, r3, asr #3 + ble _0223A260 + ldr r3, [r1] + str r3, [r0] + ldr r3, [r1, #4] + str r3, [r0, #4] + b _0223A288 +_0223A260: + cmp r0, #0 + beq _0223A278 + ldr r5, [r1] + ldr r3, [r1, #4] + str r5, [r0] + str r3, [r0, #4] +_0223A278: + ldr r3, [r2, #4] + ldr r0, [r3, #4] + add r0, r0, #1 + str r0, [r3, #4] +_0223A288: + ldr r3, [sp, #0x30] + ldr r0, [sp, #0x38] + add r3, r3, #8 + str r3, [sp, #0x30] + cmp r4, r0 + bne _0223A218 + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223A2B0: + ldr r0, [sp, #0xa4] + ldr r1, [sp, #0xa0] + str r0, [sp, #0x1c] + cmp r2, r3 + movne r0, #1 + moveq r0, #0 + str r1, [sp, #0x18] + str r3, [sp, #0x20] + str r2, [sp, #0x24] + cmp r0, #0 + addeq sp, sp, #0x80 + ldmeqia sp!, {r3, r4, r5, r6, r7, lr} + addeq sp, sp, #0x10 + bxeq lr + cmp r0, #0 + add r1, sp, #0x10 + addeq sp, sp, #0x80 + ldmeqia sp!, {r3, r4, r5, r6, r7, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r4, [sp, #0x24] + ldr r3, [sp, #0x20] +_0223A308: + ldr r0, [sp, #0x18] + ldr r5, [sp, #0x1c] + str r0, [sp, #0x10] + str r5, [sp, #0x14] + ldr r2, [r5, #8] + ldr r5, [r5, #4] + sub r6, r0, r2 + mov r2, r6, asr #2 + add r2, r6, r2, lsr #29 + cmp r5, r2, asr #3 + ble _0223A348 + ldr r2, [r4] + str r2, [r0] + ldr r2, [r4, #4] + str r2, [r0, #4] + b _0223A370 +_0223A348: + cmp r0, #0 + beq _0223A360 + ldr r5, [r4] + ldr r2, [r4, #4] + str r5, [r0] + str r2, [r0, #4] +_0223A360: + ldr r2, [r1, #4] + ldr r0, [r2, #4] + add r0, r0, #1 + str r0, [r2, #4] +_0223A370: + ldr r0, [sp, #0x18] + add r4, r4, #8 + add r0, r0, #8 + str r0, [sp, #0x18] + cmp r4, r3 + bne _0223A308 + str r4, [sp, #0x24] + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223A39C: + cmp r5, #0x14 + bgt _0223A3E8 + ldr r3, [sp, #0xa0] + str r7, [sp, #4] + sub r4, sp, #4 + add r1, sp, #0x98 + ldr r2, [sp, #0xa4] + str r3, [r4] + str r2, [r4, #4] + add r0, sp, #0x9c + ldr r2, [r0] + ldr r3, [r4] + ldr r1, [r1] + add r0, sp, #0x6c + bl ov45_0223A7E4 + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr +_0223A3E8: + add r0, r5, r5, lsr #31 + sub r4, r5, r0, asr #1 + ldr r1, [sp, #0xa0] + ldr r6, [sp, #0xa4] + add ip, r1, r4, lsl #3 + ldr r0, [sp, #0x98] + str ip, [sp] + add r1, r0, r4, lsl #3 + add r3, sp, #0x98 + str r6, [sp, #4] + ldr r0, [r3] + add r2, sp, #0xa0 + str r1, [sp, #0x7c] + str ip, [sp, #0x64] + str r6, [sp, #0x68] + str r7, [sp, #8] + ldmia r2, {r2, r3} + bl ov45_02239294 + ldr r2, [sp, #0xa0] + add r0, sp, #0x7c + add ip, r2, r5, lsl #3 + add r3, r2, r4, lsl #3 + add r1, sp, #0x9c + str ip, [sp] + str r6, [sp, #4] + ldr r0, [r0] + ldr r1, [r1] + add r2, sp, #0x5c + str r6, [sp, #0x60] + str r3, [sp, #0x5c] + str ip, [sp, #0x54] + str r6, [sp, #0x58] + str r7, [sp, #8] + ldmia r2, {r2, r3} + bl ov45_02239294 + ldr r1, [sp, #0x98] + ldr r3, [sp, #0xa0] + add r2, r1, r4, lsl #3 + add r4, r1, r5, lsl #3 + str r4, [sp] + str r3, [sp, #4] + ldr r1, [sp, #0xa4] + add r0, sp, #0x98 + str r1, [sp, #8] + ldr r1, [r0] + add r0, sp, #0x4c + mov r3, r2 + str r4, [sp, #0x40] + str r2, [sp, #0x44] + str r2, [sp, #0x48] + str r7, [sp, #0xc] + bl ov45_0223A4C8 + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223A0CC + + arm_func_start ov45_0223A4C8 +ov45_0223A4C8: ; 0x0223A4C8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x40 + ldr r3, [sp, #0x64] + ldr r5, [sp, #0x68] + ldr r1, [sp, #0x5c] + ldr r6, [sp, #0x60] + add ip, sp, #0x38 + add lr, sp, #0x30 + b _0223A5F0 +_0223A4F0: + ldr r4, [r3] + ldr r2, [r1] + cmp r4, r2 + bge _0223A574 + ldr r2, [sp, #0x6c] + ldr r7, [sp, #0x70] + str r2, [sp, #0x38] + str r7, [sp, #0x3c] + ldr r4, [r7, #8] + ldr r7, [r7, #4] + sub r8, r2, r4 + mov r4, r8, asr #2 + add r4, r8, r4, lsr #29 + cmp r7, r4, asr #3 + ble _0223A540 + ldr r4, [r3] + str r4, [r2] + ldr r4, [r3, #4] + str r4, [r2, #4] + b _0223A568 +_0223A540: + cmp r2, #0 + beq _0223A558 + ldr r7, [r3] + ldr r4, [r3, #4] + str r7, [r2] + str r4, [r2, #4] +_0223A558: + ldr r4, [ip, #4] + ldr r2, [r4, #4] + add r2, r2, #1 + str r2, [r4, #4] +_0223A568: + add r3, r3, #8 + str r3, [sp, #0x64] + b _0223A5E4 +_0223A574: + ldr r2, [sp, #0x6c] + ldr r7, [sp, #0x70] + str r2, [sp, #0x30] + str r7, [sp, #0x34] + ldr r4, [r7, #8] + ldr r7, [r7, #4] + sub r8, r2, r4 + mov r4, r8, asr #2 + add r4, r8, r4, lsr #29 + cmp r7, r4, asr #3 + ble _0223A5B4 + ldr r4, [r1] + str r4, [r2] + ldr r4, [r1, #4] + str r4, [r2, #4] + b _0223A5DC +_0223A5B4: + cmp r2, #0 + beq _0223A5CC + ldr r7, [r1] + ldr r4, [r1, #4] + str r7, [r2] + str r4, [r2, #4] +_0223A5CC: + ldr r4, [lr, #4] + ldr r2, [r4, #4] + add r2, r2, #1 + str r2, [r4, #4] +_0223A5DC: + add r1, r1, #8 + str r1, [sp, #0x5c] +_0223A5E4: + ldr r2, [sp, #0x6c] + add r2, r2, #8 + str r2, [sp, #0x6c] +_0223A5F0: + cmp r1, r6 + cmpne r3, r5 + bne _0223A4F0 + ldr r2, [sp, #0x5c] + ldr r1, [sp, #0x60] + cmp r2, r1 + bne _0223A6F8 + ldr r2, [sp, #0x68] + ldr r1, [sp, #0x64] + ldr r4, [sp, #0x6c] + ldr r3, [sp, #0x70] + str r1, [sp, #0x2c] + cmp r1, r2 + movne r1, #1 + moveq r1, #0 + str r4, [sp, #0x20] + str r3, [sp, #0x24] + str r2, [sp, #0x28] + cmp r1, #0 + beq _0223A6D8 + cmp r1, #0 + add r2, sp, #0x18 + beq _0223A6D8 + ldr r5, [sp, #0x2c] + ldr r4, [sp, #0x28] +_0223A654: + ldr r1, [sp, #0x20] + ldr ip, [sp, #0x24] + str r1, [sp, #0x18] + str ip, [sp, #0x1c] + ldr r3, [ip, #8] + ldr ip, [ip, #4] + sub lr, r1, r3 + mov r3, lr, asr #2 + add r3, lr, r3, lsr #29 + cmp ip, r3, asr #3 + ble _0223A694 + ldr r3, [r5] + str r3, [r1] + ldr r3, [r5, #4] + str r3, [r1, #4] + b _0223A6BC +_0223A694: + cmp r1, #0 + beq _0223A6AC + ldr ip, [r5] + ldr r3, [r5, #4] + str ip, [r1] + str r3, [r1, #4] +_0223A6AC: + ldr r3, [r2, #4] + ldr r1, [r3, #4] + add r1, r1, #1 + str r1, [r3, #4] +_0223A6BC: + ldr r1, [sp, #0x20] + add r5, r5, #8 + add r1, r1, #8 + str r1, [sp, #0x20] + cmp r5, r4 + bne _0223A654 + str r5, [sp, #0x2c] +_0223A6D8: + ldr r2, [sp, #0x20] + ldr r1, [sp, #0x24] + str r2, [r0] + str r1, [r0, #4] + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr +_0223A6F8: + ldr r2, [sp, #0x60] + ldr r1, [sp, #0x5c] + ldr r4, [sp, #0x6c] + ldr r3, [sp, #0x70] + str r1, [sp, #0x14] + cmp r1, r2 + movne r1, #1 + moveq r1, #0 + str r4, [sp, #8] + str r3, [sp, #0xc] + str r2, [sp, #0x10] + cmp r1, #0 + beq _0223A7C4 + cmp r1, #0 + add r2, sp, #0 + beq _0223A7C4 + ldr ip, [sp, #0x14] + ldr r4, [sp, #0x10] +_0223A740: + ldr r1, [sp, #8] + ldr r5, [sp, #0xc] + str r1, [sp] + str r5, [sp, #4] + ldr r3, [r5, #8] + ldr lr, [r5, #4] + sub r5, r1, r3 + mov r3, r5, asr #2 + add r3, r5, r3, lsr #29 + cmp lr, r3, asr #3 + ble _0223A780 + ldr r3, [ip] + str r3, [r1] + ldr r3, [ip, #4] + str r3, [r1, #4] + b _0223A7A8 +_0223A780: + cmp r1, #0 + beq _0223A798 + ldr lr, [ip] + ldr r3, [ip, #4] + str lr, [r1] + str r3, [r1, #4] +_0223A798: + ldr r3, [r2, #4] + ldr r1, [r3, #4] + add r1, r1, #1 + str r1, [r3, #4] +_0223A7A8: + ldr r1, [sp, #8] + add ip, ip, #8 + add r1, r1, #8 + str r1, [sp, #8] + cmp ip, r4 + bne _0223A740 + str ip, [sp, #0x14] +_0223A7C4: + ldr r2, [sp, #8] + ldr r1, [sp, #0xc] + str r2, [r0] + str r1, [r0, #4] + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223A4C8 + + arm_func_start ov45_0223A7E4 +ov45_0223A7E4: ; 0x0223A7E4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x18 + ldr r3, [sp, #0x3c] + ldr r1, [sp, #0x40] + ldr r4, [sp, #0x48] + cmp r3, r1 + ldr ip, [sp, #0x44] + beq _0223A9A8 + ldr r1, [sp, #0x44] + str r4, [sp, #0x14] + str r1, [sp, #0x10] + ldr r2, [r4, #8] + ldr r5, [r4, #4] + sub r6, r1, r2 + mov r2, r6, asr #2 + add r2, r6, r2, lsr #29 + cmp r5, r2, asr #3 + add r6, sp, #0x10 + ble _0223A84C + ldr r5, [sp, #0x3c] + ldr r2, [r5] + str r2, [r1] + ldr r2, [r5, #4] + str r2, [r1, #4] + b _0223A878 +_0223A84C: + cmp r1, #0 + beq _0223A868 + ldr r2, [sp, #0x3c] + ldr r5, [r2] + ldr r2, [r2, #4] + str r5, [r1] + str r2, [r1, #4] +_0223A868: + ldr r2, [r6, #4] + ldr r1, [r2, #4] + add r1, r1, #1 + str r1, [r2, #4] +_0223A878: + ldr r1, [sp, #0x40] + add r3, r3, #8 + cmp r3, r1 + movne r1, #1 + moveq r1, #0 + add ip, ip, #8 + cmp r1, #0 + beq _0223A9A8 + cmp r1, #0 + add r2, sp, #0 + beq _0223A9A8 +_0223A8A4: + mov lr, ip + mov r5, ip + ldr r8, [sp, #0x44] + add r1, sp, #8 + b _0223A91C +_0223A8B8: + str lr, [sp, #8] + str r4, [sp, #0xc] + ldr r6, [r4, #8] + ldr r7, [r4, #4] + sub sb, lr, r6 + mov r6, sb, asr #2 + add r6, sb, r6, lsr #29 + cmp r7, r6, asr #3 + ble _0223A8F0 + ldr r6, [r5] + str r6, [lr] + ldr r6, [r5, #4] + str r6, [lr, #4] + b _0223A918 +_0223A8F0: + cmp lr, #0 + beq _0223A908 + ldr r7, [r5] + ldr r6, [r5, #4] + str r7, [lr] + str r6, [lr, #4] +_0223A908: + ldr r7, [r1, #4] + ldr r6, [r7, #4] + add r6, r6, #1 + str r6, [r7, #4] +_0223A918: + sub lr, lr, #8 +_0223A91C: + cmp r5, r8 + beq _0223A934 + ldr r7, [r3] + ldr r6, [r5, #-8]! + cmp r7, r6 + blt _0223A8B8 +_0223A934: + str lr, [sp] + str r4, [sp, #4] + ldr r1, [r4, #8] + ldr r5, [r4, #4] + sub r6, lr, r1 + mov r1, r6, asr #2 + add r1, r6, r1, lsr #29 + cmp r5, r1, asr #3 + ble _0223A96C + ldr r1, [r3] + str r1, [lr] + ldr r1, [r3, #4] + str r1, [lr, #4] + b _0223A994 +_0223A96C: + cmp lr, #0 + beq _0223A984 + ldr r5, [r3] + ldr r1, [r3, #4] + str r5, [lr] + str r1, [lr, #4] +_0223A984: + ldr r5, [r2, #4] + ldr r1, [r5, #4] + add r1, r1, #1 + str r1, [r5, #4] +_0223A994: + ldr r1, [sp, #0x40] + add r3, r3, #8 + cmp r3, r1 + add ip, ip, #8 + bne _0223A8A4 +_0223A9A8: + str ip, [r0] + str r4, [r0, #4] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223A7E4 + + arm_func_start ov45_0223A9C0 +ov45_0223A9C0: ; 0x0223A9C0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr ip, [sp, #0x18] + ldr r3, [sp, #0x1c] + cmp ip, r3 + ldrne r0, [sp, #0x18] + addne lr, r0, #8 + cmpne lr, r3 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr +_0223A9F4: + sub r5, lr, #8 + ldr r1, [lr] + ldr r0, [r5] + cmp r1, r0 + bge _0223AA64 + ldr r2, [lr] + ldr r1, [lr, #4] + mov r4, r5 + str r0, [lr] + ldr r0, [r5, #4] + str r2, [sp] + str r1, [sp, #4] + str r0, [lr, #4] + b _0223AA40 +_0223AA2C: + ldr r0, [r5] + str r0, [r4] + ldr r0, [r5, #4] + str r0, [r4, #4] + sub r4, r4, #8 +_0223AA40: + cmp r5, ip + beq _0223AA54 + ldr r0, [r5, #-8]! + cmp r2, r0 + blt _0223AA2C +_0223AA54: + ldr r1, [sp] + ldr r0, [sp, #4] + str r1, [r4] + str r0, [r4, #4] +_0223AA64: + add lr, lr, #8 + cmp lr, r3 + bne _0223A9F4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223A9C0 + + arm_func_start ov45_0223AA80 +ov45_0223AA80: ; 0x0223AA80 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r2, #0 + ldr r0, _0223AADC ; =ov45_02255198 + str r2, [r6] + ldr r0, [r0, #4] + mov r5, r1 + str r0, [r6, #4] + cmp r5, #0 + ldmleia sp!, {r4, r5, r6, pc} + ldr r4, _0223AAE0 ; =_ZSt7nothrow +_0223AAAC: + mov r1, r4 + mov r0, r5, lsl #3 + bl _ZnamRKSt9nothrow_t + str r0, [r6] + cmp r0, #0 + strne r5, [r6, #4] + ldmneia sp!, {r4, r5, r6, pc} + add r0, r5, r5, lsr #31 + mov r5, r0, asr #1 + cmp r5, #0 + bgt _0223AAAC + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0223AADC: .word ov45_02255198 +_0223AAE0: .word _ZSt7nothrow + arm_func_end ov45_0223AA80 + + arm_func_start ov45_0223AAE4 +ov45_0223AAE4: ; 0x0223AAE4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r1 + mov r4, r2 + sub r2, r4, r5 + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + mov ip, r1, asr #3 + mov r6, r0 + str ip, [sp, #4] + ldr r3, [r6, #8] + cmp r3, r1, asr #3 + bhs _0223AB30 + mov r2, #0 + sub r1, ip, r3 + strb r2, [sp, #3] + bl ov45_0223BED0 + mov r2, r0 + b _0223AC10 +_0223AB30: + ldr r1, [r6, #4] + mov r0, r5 + cmp r1, ip + addlo r1, r6, #4 + addhs r1, sp, #4 + ldr r1, [r1] + ldr r2, [r6] + add r0, r0, r1, lsl #3 + cmp r5, r0 + bhs _0223AB78 +_0223AB58: + ldr r1, [r5] + str r1, [r2] + ldr r1, [r5, #4] + add r5, r5, #8 + str r1, [r2, #4] + cmp r5, r0 + add r2, r2, #8 + blo _0223AB58 +_0223AB78: + ldr r3, [r6, #4] + ldr r2, [sp, #4] + cmp r2, r3 + bhs _0223ABA8 + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r6, #4] + sub r0, r3, r2 + sub r0, r1, r0 + add sp, sp, #8 + str r0, [r6, #4] + ldmia sp!, {r4, r5, r6, pc} +_0223ABA8: + cmp r3, r2 + addhs sp, sp, #8 + ldmhsia sp!, {r4, r5, r6, pc} + mov r1, #0 + strb r1, [sp, #1] + ldr r2, [r6] + ldr r1, [r6, #4] + cmp r0, r4 + addeq sp, sp, #8 + add r3, r2, r1, lsl #3 + ldmeqia sp!, {r4, r5, r6, pc} +_0223ABD4: + cmp r3, #0 + beq _0223ABEC + ldr r2, [r0] + ldr r1, [r0, #4] + str r2, [r3] + str r1, [r3, #4] +_0223ABEC: + ldr r1, [r6, #4] + add r0, r0, #8 + add r1, r1, #1 + str r1, [r6, #4] + cmp r0, r4 + add r3, r3, #8 + bne _0223ABD4 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_0223AC10: + ldr r1, [sp, #4] + mov r0, r6 + bl ov45_0223BE60 + mov r0, #0 + strb r0, [sp] + cmp r5, r4 + ldr r1, [r6] + ldr r0, [r6, #4] + addeq sp, sp, #8 + add r2, r1, r0, lsl #3 + ldmeqia sp!, {r4, r5, r6, pc} +_0223AC3C: + cmp r2, #0 + beq _0223AC54 + ldr r1, [r5] + ldr r0, [r5, #4] + str r1, [r2] + str r0, [r2, #4] +_0223AC54: + ldr r0, [r6, #4] + add r5, r5, #8 + add r0, r0, #1 + str r0, [r6, #4] + cmp r5, r4 + add r2, r2, #8 + bne _0223AC3C + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_0223AAE4 + + arm_func_start ov45_0223AC78 +ov45_0223AC78: ; 0x0223AC78 + cmp r2, #0x10 + movlo r0, #0 + bxlo lr + ldrh r0, [r1, #0xe] + sub r0, r0, #1 + mov r0, r0, lsl #3 + add r0, r0, #0x18 + cmp r2, r0 + movhs r0, #1 + movlo r0, #0 + bx lr + arm_func_end ov45_0223AC78 + + arm_func_start ov45_0223ACA4 +ov45_0223ACA4: ; 0x0223ACA4 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl ov45_0223AE84 + mov r1, #0 + bic r2, r4, #7 + strb r1, [sp] + sub r0, sp, #4 + strb r1, [r0] + ldr r3, [r0] + mov r1, r5 + add r0, r6, #0x50 + add r2, r5, r2 + bl ov45_0223ACF0 + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_0223ACA4 + + arm_func_start ov45_0223ACF0 +ov45_0223ACF0: ; 0x0223ACF0 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r1 + mov r4, r2 + sub r2, r4, r5 + mov r1, r2, asr #2 + add r1, r2, r1, lsr #29 + mov ip, r1, asr #3 + mov r6, r0 + str ip, [sp, #4] + ldr r3, [r6, #8] + cmp r3, r1, asr #3 + bhs _0223AD3C + mov r2, #0 + sub r1, ip, r3 + strb r2, [sp, #3] + bl ov45_0223BD94 + mov r2, r0 + b _0223AE1C +_0223AD3C: + ldr r1, [r6, #4] + mov r0, r5 + cmp r1, ip + addlo r1, r6, #4 + addhs r1, sp, #4 + ldr r1, [r1] + ldr r2, [r6] + add r0, r0, r1, lsl #3 + cmp r5, r0 + bhs _0223AD84 +_0223AD64: + ldr r1, [r5] + str r1, [r2] + ldr r1, [r5, #4] + add r5, r5, #8 + str r1, [r2, #4] + cmp r5, r0 + add r2, r2, #8 + blo _0223AD64 +_0223AD84: + ldr r3, [r6, #4] + ldr r2, [sp, #4] + cmp r2, r3 + bhs _0223ADB4 + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r6, #4] + sub r0, r3, r2 + sub r0, r1, r0 + add sp, sp, #8 + str r0, [r6, #4] + ldmia sp!, {r4, r5, r6, pc} +_0223ADB4: + cmp r3, r2 + addhs sp, sp, #8 + ldmhsia sp!, {r4, r5, r6, pc} + mov r1, #0 + strb r1, [sp, #1] + ldr r2, [r6] + ldr r1, [r6, #4] + cmp r0, r4 + addeq sp, sp, #8 + add r3, r2, r1, lsl #3 + ldmeqia sp!, {r4, r5, r6, pc} +_0223ADE0: + cmp r3, #0 + beq _0223ADF8 + ldr r2, [r0] + ldr r1, [r0, #4] + str r2, [r3] + str r1, [r3, #4] +_0223ADF8: + ldr r1, [r6, #4] + add r0, r0, #8 + add r1, r1, #1 + str r1, [r6, #4] + cmp r0, r4 + add r3, r3, #8 + bne _0223ADE0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_0223AE1C: + ldr r1, [sp, #4] + mov r0, r6 + bl ov45_0223BD24 + mov r0, #0 + strb r0, [sp] + cmp r5, r4 + ldr r1, [r6] + ldr r0, [r6, #4] + addeq sp, sp, #8 + add r2, r1, r0, lsl #3 + ldmeqia sp!, {r4, r5, r6, pc} +_0223AE48: + cmp r2, #0 + beq _0223AE60 + ldr r1, [r5] + ldr r0, [r5, #4] + str r1, [r2] + str r0, [r2, #4] +_0223AE60: + ldr r0, [r6, #4] + add r5, r5, #8 + add r0, r0, #1 + str r0, [r6, #4] + cmp r5, r4 + add r2, r2, #8 + bne _0223AE48 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_0223ACF0 + + arm_func_start ov45_0223AE84 +ov45_0223AE84: ; 0x0223AE84 + stmdb sp!, {r3} + sub sp, sp, #4 + tst r2, #7 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3} + bxne lr + cmp r2, #0 + addne sp, sp, #4 + movne r0, #1 + ldmneia sp!, {r3} + bxne lr + ldr r2, [r0, #0x54] + mov r1, #0 + strb r1, [sp] + ldr r1, [r0, #0x54] + sub r1, r1, r2 + str r1, [r0, #0x54] + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3} + bx lr + arm_func_end ov45_0223AE84 + + arm_func_start ov45_0223AEDC +ov45_0223AEDC: ; 0x0223AEDC + stmdb sp!, {r3, lr} + ldr r2, [r0, #0x334] + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r0, #0x5c + mov r2, #0x2d8 + bl MI_CpuCopy8 + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov45_0223AEDC + + arm_func_start ov45_0223AF04 +ov45_0223AF04: ; 0x0223AF04 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + add r1, r4, #0x5c + mov r2, #0x2d8 + bl MI_CpuCopy8 + mov r0, #1 + str r0, [r4, #0x334] + ldmia sp!, {r4, pc} + arm_func_end ov45_0223AF04 + + arm_func_start ov45_0223AF28 +ov45_0223AF28: ; 0x0223AF28 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + mov r4, r0 + ldr r1, [r4] + cmp r1, #5 + addls pc, pc, r1, lsl #2 + b _0223B0F8 +_0223AF44: ; jump table + b _0223B0F8 ; case 0 + b _0223B0F8 ; case 1 + b _0223B0F8 ; case 2 + b _0223B0F8 ; case 3 + b _0223AF5C ; case 4 + b _0223AFE0 ; case 5 +_0223AF5C: + bl ov45_0223B104 + cmp r0, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov45_022310B0 + mov r1, r0 + add r0, sp, #0x30 + add r1, r1, #0xb8 + bl ov45_022320B4 + ldr r0, [sp, #0x30] + ldr r1, _0223B100 ; =ov45_02254D9C + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x31 + ldrne r0, [sp, #0x38] + bl ov45_02241D58 + add r0, sp, #0x30 + bl ov45_02237BC8 + mov r1, #0 + str r1, [sp, #0x10] + mov r5, #4 + add r0, sp, #0x10 + str r1, [sp] + str r0, [sp, #4] + mov r3, r1 + sub r0, r5, #5 + mov r2, #1 + str r5, [sp, #8] + bl ov45_0223325C + mov r0, r4 + bl ov45_0223B1C8 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223AFE0: + ldr r0, [r4, #0x3c] + cmp r0, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, [r4, #0x38] + ldr r0, [r4, #0x44] + ldr r1, [r4, #0x4c] + add r0, r0, r5, lsr #7 + bl _u32_div_f + ldr r2, [r4, #0x40] + add r0, sp, #0x14 + ldr r6, [r2, r1, lsl #2] + mov r5, r5, lsl #0x19 + add r1, sp, #0x24 + add r7, r6, r5, lsr #22 + bl ov00_021ECB94 + add r0, sp, #0x14 + add r1, sp, #0x24 + bl RTC_ConvertDateTimeToSecond + mov r8, r0 + ldr r2, [r4, #0x10] + ldr r3, [r6, r5, lsr #22] + ldr r0, [r4, #0x14] + mov sl, r1 + subs r2, r8, r2 + sbc r1, sl, r0 + subs r0, r2, r3 + sbcs r0, r1, r3, asr #31 + addlt sp, sp, #0x3c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + sub r5, sp, #4 + add r6, sp, #0xc + mov fp, #0 +_0223B064: + bl ov45_022310B0 + mov r1, r0 + ldr r0, [r7, #4] + ldr r1, [r1, #0x30] + blx r1 + strb fp, [r6] + and r2, fp, #0xff + strb r2, [r5] + ldr r2, [r5] + add r0, r4, #0x38 + mov r1, #1 + bl ov45_0223B81C + ldr r0, [r4, #0x3c] + cmp r0, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr sb, [r4, #0x38] + ldr r0, [r4, #0x44] + ldr r1, [r4, #0x4c] + add r0, r0, sb, lsr #7 + bl _u32_div_f + ldr r0, [r4, #0x40] + mov r2, sb, lsl #0x19 + ldr r1, [r0, r1, lsl #2] + ldr r0, [r1, r2, lsr #22] + add r1, r1, r2, lsr #22 + str r0, [r7] + ldr r0, [r1, #4] + str r0, [r7, #4] + ldr r1, [r4, #0x10] + ldr r3, [r7] + ldr r0, [r4, #0x14] + subs r2, r8, r1 + sbc r1, sl, r0 + subs r0, r2, r3 + sbcs r0, r1, r3, asr #31 + bge _0223B064 +_0223B0F8: + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0223B100: .word ov45_02254D9C + arm_func_end ov45_0223AF28 + + arm_func_start ov45_0223B104 +ov45_0223B104: ; 0x0223B104 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov r4, r0 + ldr r0, [r4] + cmp r0, #5 + beq _0223B12C + bl ov45_022310B0 + ldr r0, [r0] + cmp r0, #8 + beq _0223B138 +_0223B12C: + add sp, sp, #0x1c + mov r0, #0 + ldmia sp!, {r3, r4, pc} +_0223B138: + ldr r2, [r4, #0x10] + ldr r1, [r4, #0x14] + mov r0, #0 + cmp r1, r0 + cmpeq r2, r0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, pc} + ldr r0, [r4, #0x18] + cmp r0, #0 + addne sp, sp, #0x1c + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + bl ov45_022310B0 + add r0, r0, #0xe8 + bl ov45_0223DFC8 + cmp r0, #0 + addne sp, sp, #0x1c + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + add r0, sp, #0 + add r1, sp, #0x10 + bl ov00_021ECB94 + add r0, sp, #0 + add r1, sp, #0x10 + bl RTC_ConvertDateTimeToSecond + ldr ip, [r4, #8] + ldr r2, [r4, #0x1c] + ldr r3, [r4, #0xc] + adds r4, ip, r2 + adc r2, r3, #0 + subs r0, r4, r0 + sbcs r0, r2, r1 + movlt r0, #1 + movge r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223B104 + + arm_func_start ov45_0223B1C8 +ov45_0223B1C8: ; 0x0223B1C8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov r4, r0 + ldr r0, [r4] + cmp r0, #5 + beq _0223B23C + bl ov45_022310B0 + ldr r0, [r0] + cmp r0, #8 + bne _0223B23C + add r0, sp, #0 + add r1, sp, #0x10 + bl ov00_021ECB94 + add r0, sp, #0 + add r1, sp, #0x10 + bl RTC_ConvertDateTimeToSecond + str r0, [r4, #0x10] + str r1, [r4, #0x14] + mov r0, #5 + str r0, [r4] + mov r0, #0 + str r0, [r4, #0x18] + bl ov45_022310B0 + ldr r1, [r0, #0x30] + mov r0, #0 + blx r1 + add sp, sp, #0x1c + mov r0, #1 + ldmia sp!, {r3, r4, pc} +_0223B23C: + mov r0, #1 + str r0, [r4, #0x18] + mov r0, #0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223B1C8 + + arm_func_start ov45_0223B250 +ov45_0223B250: ; 0x0223B250 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + mov r5, r1 + ldr r1, [r5] + mov r4, r2 + mov r6, r0 + add r4, r4, r1 + ldr r3, [r5, #8] + ldr r1, [r5, #0xc] + ldr r0, [r5, #0x14] + add r2, r3, r1, lsl #2 + add r1, r3, r0, lsl #2 + str r1, [sp, #0xc] + add r0, sp, #0 + str r2, [sp] + str r3, [sp, #4] + str r2, [sp, #8] + mov r1, r4, lsr #7 + bl ov45_0223CD78 + ldr r0, [r5, #0x10] + ldr r1, [sp] + cmp r0, #0 + moveq r5, #0 + ldr r0, [sp, #4] + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + ldrne r5, [r1] + str r1, [r6] + stmib r6, {r0, r2} + mov r0, r4, lsl #0x19 + str r3, [r6, #0xc] + add r0, r5, r0, lsr #22 + str r0, [r6, #0x10] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_0223B250 + + arm_func_start ov45_0223B2DC +ov45_0223B2DC: ; 0x0223B2DC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0xbc + mov r5, r0 + tst r1, #0x7f + movne r0, #1 + moveq r0, #0 + mov r8, #0 + add r4, r0, r1, lsr #7 + mov r7, r8 + add r6, sp, #0x28 + b _0223B378 +_0223B308: + ldr r1, [r5, #8] + ldr r0, [r5, #0xc] + ldr sb, [r1, r0, lsl #2] + strb r8, [sp, #0x13] + ldr r0, [r5, #0xc] + add r1, r0, #1 + str r1, [r5, #0xc] + ldr r0, [r5, #0x14] + cmp r1, r0 + streq r8, [r5, #0xc] + ldr r0, [r5, #0x10] + sub r1, r0, #1 + str r1, [r5, #0x10] + ldr r0, [r5, #0xc] + add r0, r0, r1 + ldr r1, [r5, #0x14] + sub r0, r0, #1 + bl _u32_div_f + ldr r2, [r5, #8] + add r0, r5, #8 + str sb, [r2, r1, lsl #2] + mov r1, r6 + str r7, [sp, #0x28] + bl ov45_0223BA3C + ldr r0, [r5] + sub r4, r4, #1 + sub r0, r0, #0x80 + str r0, [r5] +_0223B378: + cmp r4, #0 + beq _0223B38C + ldr r0, [r5] + cmp r0, #0x80 + bhs _0223B308 +_0223B38C: + cmp r4, #0 + addeq sp, sp, #0xbc + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _0223B758 ; =ov45_022577C8 + ldr r2, [r1] + tst r2, #1 + bne _0223B3BC + ldr r0, _0223B75C ; =ov45_022551A8 + orr r2, r2, #1 + mvn r3, #0xff + str r3, [r0] + str r2, [r1] +_0223B3BC: + ldr r1, _0223B75C ; =ov45_022551A8 + mov r6, r4, lsl #7 + ldr r0, [r1] + cmp r0, r4, lsl #7 + blo _0223B418 + ldr r0, _0223B758 ; =ov45_022577C8 + ldr r2, [r0] + tst r2, #1 + bne _0223B3F0 + orr r2, r2, #1 + mvn r3, #0xff + str r3, [r1] + str r2, [r0] +_0223B3F0: + ldr r1, [r5, #0x10] + ldr r0, _0223B75C ; =ov45_022551A8 + cmp r1, #0 + ldr r2, [r0] + moveq r1, #0 + subne r0, r1, #1 + movne r1, r0, lsl #7 + sub r0, r2, r6 + cmp r1, r0 + bls _0223B420 +_0223B418: + ldr r0, _0223B760 ; =ov45_022551AC + bl ov45_0223B8D0 +_0223B420: + ldr r0, [r5, #0x14] + cmp r0, #0 + moveq r1, #0 + subne r1, r0, #1 + ldr r0, [r5, #0x10] + add r0, r4, r0 + cmp r0, r1 + bhi _0223B4A4 + cmp r4, #0 + addeq sp, sp, #0xbc + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + mov r7, #0x400 + mov sb, #0 + add r8, sp, #0x24 +_0223B458: + mov r0, r7 + bl ov45_02242394 + ldr r3, [r5, #0xc] + ldr r2, [r5, #0x10] + ldr r1, [r5, #0x14] + add r2, r3, r2 + mov r6, r0 + sub r0, r2, #1 + bl _u32_div_f + ldr r2, [r5, #8] + add r0, r5, #8 + str r6, [r2, r1, lsl #2] + mov r1, r8 + str sb, [sp, #0x24] + bl ov45_0223BA3C + subs r4, r4, #1 + bne _0223B458 + add sp, sp, #0xbc + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_0223B4A4: + movs r1, #0 + add r6, sp, #0xac + str r1, [sp, #0xa4] + str r1, [sp, #0xa8] + str r1, [sp, #0x74] + str r1, [sp, #0x78] + str r1, [sp, #0x7c] + str r1, [sp, #0x80] + str r1, [r6] + str r1, [r6, #4] + str r1, [r6, #8] + str r1, [r6, #0xc] + add r8, sp, #0x74 + beq _0223B4E4 + add r0, r1, r1 + bl _u32_div_f +_0223B4E4: + ldr r7, [r8] + ldr r2, [r8, #4] + ldr r0, [r8, #0xc] + add r3, r7, r2, lsl #2 + add r2, r7, r0, lsl #2 + add r8, r7, r1, lsl #2 + ldrb r1, [sp, #0x12] + add r0, sp, #0x84 + str r8, [sp, #0x84] + str r7, [sp, #0x88] + str r7, [sp, #0x98] + str r3, [sp, #0x8c] + str r2, [sp, #0x90] + str r0, [sp, #4] + add r0, sp, #0x94 + strb r1, [sp, #8] + sub r7, sp, #0xc + str r3, [sp, #0x94] + str r3, [sp, #0x9c] + str r2, [sp, #0xa0] + ldmia r0, {r0, r1, r2, r3} + stmia r7, {r0, r1, r2, r3} + mov r0, r6 + ldmia r7, {r1, r2, r3} + bl ov45_0223CE90 + add r0, sp, #0x74 + bl ov45_02238508 + ldr r0, [r5, #0x10] + add r8, sp, #0xac + add r0, r4, r0 + add r0, r0, #1 + str r0, [sp, #0x1c] + ldr r0, [r5, #0x14] + cmp r0, #0 + moveq r2, #0 + subne r2, r0, #1 + ldr r0, [sp, #0x1c] + mov r1, r2, lsl #1 + cmp r0, r2, lsl #1 + addhi r0, sp, #0x1c + addls r0, sp, #0x20 + str r1, [sp, #0x20] + ldr r1, [r0] + mov r0, r8 + bl ov45_0223B8E0 + mov r2, #0 + add r1, sp, #0x18 + mov r0, r8 + str r2, [sp, #0x18] + bl ov45_0223BA3C + cmp r4, #0 + beq _0223B604 + mov r7, #0x400 + mov sl, #0 + add sb, sp, #0x14 +_0223B5C0: + mov r0, r7 + bl ov45_02242394 + ldr r3, [r8, #4] + ldr r2, [r8, #8] + ldr r1, [r8, #0xc] + add r2, r3, r2 + mov r6, r0 + sub r0, r2, #1 + bl _u32_div_f + ldr r2, [r8] + mov r0, r8 + str r6, [r2, r1, lsl #2] + mov r1, sb + str sl, [sp, #0x14] + bl ov45_0223BA3C + subs r4, r4, #1 + bne _0223B5C0 +_0223B604: + ldr r0, [r5, #0x10] + cmp r0, #0 + beq _0223B6F4 + ldr r1, [r5, #0x14] + cmp r1, #0 + moveq r1, #0 + beq _0223B630 + ldr r2, [r5, #0xc] + ldr r0, [r5, #0x10] + add r0, r2, r0 + bl _u32_div_f +_0223B630: + ldr r4, [r5, #8] + ldr r2, [r5, #0xc] + ldr r0, [r5, #0x14] + add r3, r4, r2, lsl #2 + add r2, r4, r0, lsl #2 + add r1, r4, r1, lsl #2 + str r1, [sp, #0x64] + add r0, sp, #0x64 + str r4, [sp, #0x68] + str r3, [sp, #0x6c] + str r2, [sp, #0x70] + mvn r1, #0 + bl ov45_0223CD78 + ldr r0, [r5, #8] + ldr r2, [r5, #0xc] + ldr r1, [r5, #0x14] + add sb, r0, r2, lsl #2 + mov r6, #0 + ldr r7, [r8] + ldr r2, [r8, #0xc] + ldr r3, [r8, #4] + add r2, r7, r2, lsl #2 + add r4, r7, r3, lsl #2 + ldr r3, [sp, #0x64] + str r2, [sp, #0x38] + ldr r2, [sp, #0x68] + str r3, [sp, #0x50] + ldr r3, [sp, #0x6c] + str r2, [sp, #0x54] + ldr r2, [sp, #0x70] + str r7, [sp, #0x30] + add r7, r0, r1, lsl #2 + str r3, [sp, #0x58] + str r2, [sp, #0x5c] + str r0, [sp, #0x40] + add r1, sp, #0x2c + add r2, sp, #0x3c + add r3, sp, #0x50 + str r7, [sp, #0x48] + strb r6, [sp, #0xe] + strb r6, [sp, #0xf] + strb r6, [sp, #0xd] + mov r0, r8 + str sb, [sp, #0x3c] + str sb, [sp, #0x44] + str r4, [sp, #0x2c] + str r4, [sp, #0x34] + strb r6, [sp] + bl ov45_0223BF9C +_0223B6F4: + ldr r2, [r5, #8] + ldr r1, [r8] + add r0, sp, #0xa4 + str r1, [r5, #8] + str r2, [r8] + ldr r3, [r5, #0xc] + ldr r1, [r8, #4] + mov r2, #0 + str r1, [r5, #0xc] + str r3, [r8, #4] + ldr r3, [r5, #0x10] + ldr r1, [r8, #8] + str r1, [r5, #0x10] + str r3, [r8, #8] + ldr r3, [r5, #0x14] + ldr r1, [r8, #0xc] + str r1, [r5, #0x14] + ldr r1, [r8, #8] + str r3, [r8, #0xc] + sub r1, r1, r1 + strb r2, [sp, #0xc] + str r1, [r8, #8] + bl ov45_0223CA14 + add sp, sp, #0xbc + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0223B758: .word ov45_022577C8 +_0223B75C: .word ov45_022551A8 +_0223B760: .word ov45_022551AC + arm_func_end ov45_0223B2DC + + arm_func_start ov45_0223B764 +ov45_0223B764: ; 0x0223B764 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + cmp r1, #0 + mov r6, r0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, [r6, #4] + sub r0, r0, r1 + str r0, [r6, #4] + ldr r0, [r6, #0x10] + cmp r0, #0 + moveq r2, #0 + subne r0, r0, #1 + movne r2, r0, lsl #7 + ldmia r6, {r0, r1} + add r0, r0, r1 + sub r5, r2, r0 + cmp r5, #0x100 + addlo sp, sp, #4 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + mov r8, #0 + mov r7, r8 + mov r4, r8 +_0223B7C0: + strb r4, [sp] + ldr r0, [r6, #0x10] + sub r1, r0, #1 + str r1, [r6, #0x10] + ldr r0, [r6, #0xc] + add r0, r0, r1 + ldr r1, [r6, #0x14] + sub r0, r0, #1 + bl _u32_div_f + ldr sb, [r6, #8] + mov sl, r1 + ldr r1, [sb, sl, lsl #2] + cmp r1, #0 + beq _0223B804 + mov r0, r8 + mov r2, r8 + bl ov00_021EC2EC +_0223B804: + sub r5, r5, #0x80 + str r7, [sb, sl, lsl #2] + cmp r5, #0x100 + bhs _0223B7C0 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov45_0223B764 + + arm_func_start ov45_0223B81C +ov45_0223B81C: ; 0x0223B81C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + cmp r1, #0 + mov r6, r0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r6, #4] + sub r0, r0, r1 + str r0, [r6, #4] + ldr r0, [r6] + add r0, r0, r1 + str r0, [r6] + cmp r0, #0x100 + blo _0223B8B8 + mov r5, #0 + mov r4, r5 +_0223B85C: + ldr r1, [r6, #8] + ldr r0, [r6, #0xc] + ldr r1, [r1, r0, lsl #2] + cmp r1, #0 + beq _0223B87C + mov r0, r5 + mov r2, r5 + bl ov00_021EC2EC +_0223B87C: + strb r4, [sp] + ldr r0, [r6, #0xc] + add r1, r0, #1 + str r1, [r6, #0xc] + ldr r0, [r6, #0x14] + cmp r1, r0 + streq r4, [r6, #0xc] + ldr r0, [r6, #0x10] + sub r0, r0, #1 + str r0, [r6, #0x10] + ldr r0, [r6] + sub r0, r0, #0x80 + str r0, [r6] + cmp r0, #0x100 + bhs _0223B85C +_0223B8B8: + ldr r0, [r6, #4] + cmp r0, #0 + moveq r0, #0x40 + streq r0, [r6] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_0223B81C + + arm_func_start ov45_0223B8D0 +ov45_0223B8D0: ; 0x0223B8D0 + stmdb sp!, {r3, lr} + bl printf + bl abort + ldmia sp!, {r3, pc} + arm_func_end ov45_0223B8D0 + + arm_func_start ov45_0223B8E0 +ov45_0223B8E0: ; 0x0223B8E0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x38 + mov r4, r0 + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + subne r0, r0, #1 + cmp r1, r0 + addls sp, sp, #0x38 + ldmlsia sp!, {r3, r4, r5, pc} + mov r2, #0 + add r0, r4, #0xc + str r0, [sp, #0x34] + str r2, [sp, #0x24] + str r2, [sp, #0x28] + str r2, [sp, #0x2c] + str r2, [sp, #0x30] + strb r2, [sp, #2] + sub r0, sp, #4 + strb r2, [r0] + ldr r2, [r0] + add r0, sp, #0x24 + bl ov45_0223CB04 + ldr r1, [r4, #0xc] + cmp r1, #0 + moveq r1, #0 + beq _0223B95C + ldr r2, [r4, #4] + ldr r0, [r4, #8] + add r0, r2, r0 + bl _u32_div_f +_0223B95C: + ldr r0, [r4] + mov ip, #0 + add r0, r0, r1, lsl #2 + str r0, [sp, #4] + ldr r2, [r4] + sub r3, sp, #4 + str r2, [sp, #8] + ldr r0, [r4, #4] + add r0, r2, r0, lsl #2 + str r0, [sp, #0xc] + ldr r1, [r4, #0xc] + add r0, sp, #0x24 + add r1, r2, r1, lsl #2 + str r1, [sp, #0x10] + ldr r5, [r4] + ldr r2, [r4, #4] + add r1, sp, #0x14 + add r2, r5, r2, lsl #2 + str r2, [sp, #0x14] + ldr r5, [r4] + add r2, sp, #4 + str r5, [sp, #0x18] + ldr lr, [r4, #4] + add lr, r5, lr, lsl #2 + str lr, [sp, #0x1c] + ldr lr, [r4, #0xc] + add lr, r5, lr, lsl #2 + str lr, [sp, #0x20] + strb ip, [sp, #1] + strb ip, [r3] + ldr r3, [r3] + bl ov45_0223CC78 + mov r0, #0 + strb r0, [sp] + str r0, [r4, #8] + ldr r1, [r4] + ldr r0, [sp, #0x24] + add r3, sp, #0x30 + str r0, [r4] + str r1, [sp, #0x24] + ldr r2, [r4, #4] + ldr r1, [sp, #0x28] + add r0, sp, #0x24 + str r1, [r4, #4] + str r2, [sp, #0x28] + ldr r2, [r4, #8] + ldr r1, [sp, #0x2c] + str r1, [r4, #8] + str r2, [sp, #0x2c] + ldr r2, [r4, #0xc] + ldr r1, [r3] + str r1, [r4, #0xc] + str r2, [r3] + bl ov45_0223CAB4 + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223B8E0 + + arm_func_start ov45_0223BA3C +ov45_0223BA3C: ; 0x0223BA3C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x38 + mov r5, r0 + ldr r3, [r5, #8] + mov r4, r1 + ldr r1, [r5, #0xc] + add r2, r3, #1 + cmp r2, r1 + bhs _0223BA90 + ldr r0, [r5, #4] + add r0, r0, r3 + bl _u32_div_f + ldr r0, [r5] + add sp, sp, #0x38 + adds r1, r0, r1, lsl #2 + ldrne r0, [r4] + strne r0, [r1] + ldr r0, [r5, #8] + add r0, r0, #1 + str r0, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} +_0223BA90: + mov r3, #0 + add r2, r5, #0xc + mov r1, #1 + str r3, [sp, #0x24] + str r3, [sp, #0x28] + str r3, [sp, #0x2c] + str r3, [sp, #0x30] + str r2, [sp, #0x34] + bl ov45_0223BBFC + mov r3, #0 + mov r1, r0 + strb r3, [sp, #2] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #0x24 + strb r3, [sp, #3] + bl ov45_0223CB04 + ldr r1, [r5, #8] + ldr r0, [sp, #0x24] + str r1, [sp, #0x28] + adds r1, r0, r1, lsl #2 + ldrne r0, [r4] + strne r0, [r1] + ldr r0, [sp, #0x2c] + add r0, r0, #1 + str r0, [sp, #0x2c] + ldr r1, [r5, #0xc] + cmp r1, #0 + moveq r1, #0 + beq _0223BB1C + ldr r2, [r5, #4] + ldr r0, [r5, #8] + add r0, r2, r0 + bl _u32_div_f +_0223BB1C: + ldr r0, [r5] + mov r4, #0 + add r0, r0, r1, lsl #2 + str r0, [sp, #4] + ldr r2, [r5] + sub r3, sp, #4 + str r2, [sp, #8] + ldr r0, [r5, #4] + add r0, r2, r0, lsl #2 + str r0, [sp, #0xc] + ldr r1, [r5, #0xc] + add r0, sp, #0x24 + add r1, r2, r1, lsl #2 + str r1, [sp, #0x10] + ldr ip, [r5] + ldr r2, [r5, #4] + add r1, sp, #0x14 + add r2, ip, r2, lsl #2 + str r2, [sp, #0x14] + ldr lr, [r5] + add r2, sp, #4 + str lr, [sp, #0x18] + ldr ip, [r5, #4] + add ip, lr, ip, lsl #2 + str ip, [sp, #0x1c] + ldr ip, [r5, #0xc] + add ip, lr, ip, lsl #2 + str ip, [sp, #0x20] + strb r4, [sp, #1] + strb r4, [r3] + ldr r3, [r3] + bl ov45_0223CB6C + mov r0, r4 + strb r0, [sp] + str r0, [r5, #8] + ldr r1, [r5] + ldr r0, [sp, #0x24] + add r3, sp, #0x30 + str r0, [r5] + str r1, [sp, #0x24] + ldr r2, [r5, #4] + ldr r1, [sp, #0x28] + add r0, sp, #0x24 + str r1, [r5, #4] + str r2, [sp, #0x28] + ldr r2, [r5, #8] + ldr r1, [sp, #0x2c] + str r1, [r5, #8] + str r2, [sp, #0x2c] + ldr r2, [r5, #0xc] + ldr r1, [r3] + str r1, [r5, #0xc] + str r2, [r3] + bl ov45_0223CAB4 + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223BA3C + + arm_func_start ov45_0223BBFC +ov45_0223BBFC: ; 0x0223BBFC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr r2, _0223BCFC ; =ov45_022577D0 + ldr r3, [r2] + tst r3, #1 + bne _0223BC2C + ldr r1, _0223BD00 ; =ov45_022551A4 + orr r3, r3, #1 + mvn r4, #0xc0000001 + str r4, [r1] + str r3, [r2] +_0223BC2C: + ldr r1, [r0, #0xc] + ldr r0, _0223BD00 ; =ov45_022551A4 + cmp r1, #0 + moveq r5, #0 + subne r5, r1, #1 + ldr r4, [r0] + ldr r1, [sp, #0x1c] + sub r0, r4, r5 + cmp r1, r0 + bls _0223BC58 + bl ov45_0223BD0C +_0223BC58: + ldr r0, _0223BD04 ; =0xAAAAAAAB + umull r0, r1, r4, r0 + mov r1, r1, lsr #1 + cmp r5, r1 + bhs _0223BCAC + add r1, r5, #1 + ldr r0, _0223BD08 ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x1c] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x1c + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r5, r0 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_0223BCAC: + cmp r5, r1, lsl #1 + bhs _0223BCE8 + ldr r0, [sp, #0x1c] + add r1, r5, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x1c + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r5, r0 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_0223BCE8: + mov r0, r4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0223BCFC: .word ov45_022577D0 +_0223BD00: .word ov45_022551A4 +_0223BD04: .word 0xAAAAAAAB +_0223BD08: .word 0xCCCCCCCD + arm_func_end ov45_0223BBFC + + arm_func_start ov45_0223BD0C +ov45_0223BD0C: ; 0x0223BD0C + stmdb sp!, {r3, lr} + ldr r0, _0223BD20 ; =ov45_022551C4 + bl printf + bl abort + ldmia sp!, {r3, pc} + .balign 4, 0 +_0223BD20: .word ov45_022551C4 + arm_func_end ov45_0223BD0C + + arm_func_start ov45_0223BD24 +ov45_0223BD24: ; 0x0223BD24 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #4] + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r5, #4] + mov r4, r2 + sub r1, r1, r3 + str r1, [r5, #4] + ldr r1, [r5] + cmp r1, #0 + beq _0223BD6C + beq _0223BD60 + mov r2, r0 + bl ov00_021EC2EC +_0223BD60: + mov r0, #0 + str r0, [r5] + str r0, [r5, #8] +_0223BD6C: + mov r3, #0 + strb r3, [sp] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + mov r0, r5 + mov r1, r4 + strb r3, [sp, #1] + bl ov45_0223CE30 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223BD24 + + arm_func_start ov45_0223BD94 +ov45_0223BD94: ; 0x0223BD94 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [r0, #8] + mvn r0, #0xe0000000 + ldr r1, [sp, #0x14] + sub r0, r0, r4 + cmp r1, r0 + bls _0223BDBC + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223BDBC: + ldr r0, _0223BE58 ; =0x0AAAAAAA + cmp r4, r0 + bhs _0223BE08 + add r1, r4, #1 + ldr r0, _0223BE5C ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x14] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x14 + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223BE08: + cmp r4, r0, lsl #1 + bhs _0223BE44 + ldr r0, [sp, #0x14] + add r1, r4, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x14 + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223BE44: + mvn r0, #0xe0000000 + add sp, sp, #8 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0223BE58: .word 0x0AAAAAAA +_0223BE5C: .word 0xCCCCCCCD + arm_func_end ov45_0223BD94 + + arm_func_start ov45_0223BE60 +ov45_0223BE60: ; 0x0223BE60 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #4] + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r5, #4] + mov r4, r2 + sub r1, r1, r3 + str r1, [r5, #4] + ldr r1, [r5] + cmp r1, #0 + beq _0223BEA8 + beq _0223BE9C + mov r2, r0 + bl ov00_021EC2EC +_0223BE9C: + mov r0, #0 + str r0, [r5] + str r0, [r5, #8] +_0223BEA8: + mov r3, #0 + strb r3, [sp] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + mov r0, r5 + mov r1, r4 + strb r3, [sp, #1] + bl ov45_0223CE60 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223BE60 + + arm_func_start ov45_0223BED0 +ov45_0223BED0: ; 0x0223BED0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [r0, #8] + mvn r0, #0xe0000000 + ldr r1, [sp, #0x14] + sub r0, r0, r4 + cmp r1, r0 + bls _0223BEF8 + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223BEF8: + ldr r0, _0223BF94 ; =0x0AAAAAAA + cmp r4, r0 + bhs _0223BF44 + add r1, r4, #1 + ldr r0, _0223BF98 ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x14] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x14 + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223BF44: + cmp r4, r0, lsl #1 + bhs _0223BF80 + ldr r0, [sp, #0x14] + add r1, r4, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x14 + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223BF80: + mvn r0, #0xe0000000 + add sp, sp, #8 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0223BF94: .word 0x0AAAAAAA +_0223BF98: .word 0xCCCCCCCD + arm_func_end ov45_0223BED0 + + arm_func_start ov45_0223BF9C +ov45_0223BF9C: ; 0x0223BF9C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1a4 + mov sb, r2 + mov r8, r3 + ldrb r6, [r8, #0x10] + ldrb r2, [sb, #0x10] + str r1, [sp] + mov sl, r0 + ldr ip, [r8, #4] + ldr fp, [r8, #8] + ldr r7, [r8, #0xc] + ldr r5, [sb] + ldr r4, [sb, #4] + ldr r3, [sb, #8] + ldr lr, [sb, #0xc] + ldr r1, [r8] + add r0, sp, #0x5c + str r1, [sp, #0x5c] + add r1, sp, #0x48 + strb r6, [sp, #0x168] + strb r2, [sp, #0x17c] + str ip, [sp, #0x60] + str fp, [sp, #0x64] + str r7, [sp, #0x68] + strb r6, [sp, #0x6c] + str r5, [sp, #0x48] + str r4, [sp, #0x4c] + str r3, [sp, #0x50] + str lr, [sp, #0x54] + strb r2, [sp, #0x58] + bl ov45_0223CDBC + movs r4, r0 + addeq sp, sp, #0x1a4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp] + ldr r3, [sl] + ldr r1, [sl, #4] + ldr r2, [r0] + add r7, r3, r1, lsl #2 + sub r1, r2, r7 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + cmp r2, r7 + mov r5, r0, asr #2 + ldrlo r0, [sl, #0xc] + addlo r5, r5, r0 + ldr r0, [sl, #0xc] + cmp r0, #0 + moveq r0, #0 + subne r0, r0, #1 + cmp r4, r0 + ldrls r1, [sl, #8] + subls r0, r0, r4 + cmpls r1, r0 + bhi _0223C364 + str r7, [sp, #0x194] + ldr r6, [sl] + str r6, [sp, #0x198] + ldr r0, [sl, #4] + add r0, r6, r0, lsl #2 + str r0, [sp, #4] + str r0, [sp, #0x19c] + ldr r0, [sl, #0xc] + add fp, r6, r0, lsl #2 + str fp, [sp, #0x1a0] + ldr r1, [sl, #8] + sub r0, r1, r5 + str r0, [sp, #8] + cmp r5, r0 + bhs _0223C19C + add r0, sp, #0x194 + rsb r1, r4, #0 + bl ov45_0223CD78 + ldr r1, [sp, #0x194] + ldr r0, [sl] + cmp r5, #0 + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r0, r0, asr #2 + str r0, [sl, #4] + ldr r0, [sl, #8] + add r0, r0, r4 + str r0, [sl, #8] + beq _0223C2D8 + ldr r2, [sp, #0x1a0] + ldr sl, [sp, #0x194] + ldr r4, [sp, #0x198] + ldr r3, [sp, #0x19c] + str r2, [sp, #0x124] + ldr r2, [sp, #4] + add r0, sp, #0x38 + mov r1, r5 + str sl, [sp, #0x118] + str r4, [sp, #0x11c] + str r3, [sp, #0x120] + str r7, [sp, #0x38] + str r6, [sp, #0x3c] + str r2, [sp, #0x40] + str fp, [sp, #0x44] + bl ov45_0223CD78 + ldr r2, [r0] + add r1, sp, #0x138 + str r2, [sp, #0x128] + ldr r3, [r0, #4] + add r2, sp, #0x128 + str r3, [sp, #0x12c] + ldr r4, [r0, #8] + add r3, sp, #0x118 + str r4, [sp, #0x130] + ldr r4, [r0, #0xc] + add r0, sp, #0x148 + str r4, [sp, #0x134] + ldr r4, [sp, #4] + str r7, [sp, #0x138] + str r6, [sp, #0x13c] + str r4, [sp, #0x140] + str fp, [sp, #0x144] + bl ov45_0223C8A0 + ldr r3, [sp, #0x148] + ldr r2, [sp, #0x14c] + ldr r1, [sp, #0x150] + ldr r0, [sp, #0x154] + str r3, [sp, #0x194] + str r2, [sp, #0x198] + str r1, [sp, #0x19c] + str r0, [sp, #0x1a0] + b _0223C2D8 +_0223C19C: + add r0, r1, r4 + str r0, [sl, #8] + ldr r1, [sl, #0xc] + cmp r1, #0 + moveq r1, #0 + beq _0223C1C4 + ldr r2, [sl, #4] + ldr r0, [sl, #8] + add r0, r2, r0 + bl _u32_div_f +_0223C1C4: + ldr r5, [sl] + ldr r2, [sl, #4] + ldr r0, [sl, #0xc] + add r3, r5, r2, lsl #2 + add r2, r5, r0, lsl #2 + ldr r0, [sp, #8] + add r1, r5, r1, lsl #2 + str r1, [sp, #0x194] + str r5, [sp, #0x198] + str r3, [sp, #0x19c] + str r2, [sp, #0x1a0] + cmp r0, #0 + beq _0223C2CC + add r0, sp, #0x18 + str r1, [sp, #0xd8] + str r1, [sp, #0x18] + str r5, [sp, #0xdc] + str r3, [sp, #0xe0] + str r2, [sp, #0xe4] + str r5, [sp, #0x1c] + str r3, [sp, #0x20] + str r2, [sp, #0x24] + rsb r1, r4, #0 + bl ov45_0223CD78 + ldr r2, [r0] + ldr r1, [sp, #8] + str r2, [sp, #0xe8] + ldr r2, [r0, #4] + add r1, r4, r1 + str r2, [sp, #0xec] + ldr r2, [r0, #8] + ldr r6, [sp, #0x194] + str r2, [sp, #0xf0] + ldr r7, [r0, #0xc] + ldr r5, [sp, #0x198] + ldr r3, [sp, #0x19c] + ldr r2, [sp, #0x1a0] + add r0, sp, #0x28 + str r7, [sp, #0xf4] + str r6, [sp, #0x28] + str r5, [sp, #0x2c] + str r3, [sp, #0x30] + str r2, [sp, #0x34] + rsb r1, r1, #0 + bl ov45_0223CD78 + ldr r2, [r0] + add r1, sp, #0xf8 + str r2, [sp, #0xf8] + ldr r3, [r0, #4] + add r2, sp, #0xe8 + str r3, [sp, #0xfc] + ldr r5, [r0, #8] + add r3, sp, #0xd8 + str r5, [sp, #0x100] + ldr r5, [r0, #0xc] + add r0, sp, #0x108 + str r5, [sp, #0x104] + bl ov45_0223C70C + ldr r0, [sp, #0x108] + ldr r2, [sp, #0x10c] + ldr r1, [sp, #0x110] + str r0, [sp, #0x194] + ldr r0, [sp, #0x114] + str r2, [sp, #0x198] + str r1, [sp, #0x19c] + str r0, [sp, #0x1a0] +_0223C2CC: + add r0, sp, #0x194 + rsb r1, r4, #0 + bl ov45_0223CD78 +_0223C2D8: + ldr r3, [sp, #0x194] + ldr r2, [sp, #0x198] + ldr r0, [sp, #0x1a0] + ldr r1, [sp, #0x19c] + str r0, [sp, #0x9c] + str r3, [sp, #0x90] + str r2, [sp, #0x94] + str r1, [sp, #0x98] + ldr r1, [r8] + add r0, sp, #0xc8 + str r1, [sp, #0xa0] + ldr r2, [r8, #4] + add r1, sp, #0xb4 + str r2, [sp, #0xa4] + ldr r3, [r8, #8] + add r2, sp, #0xa0 + str r3, [sp, #0xa8] + ldr r4, [r8, #0xc] + add r3, sp, #0x90 + str r4, [sp, #0xac] + ldrb r4, [r8, #0x10] + strb r4, [sp, #0xb0] + ldr r4, [sb] + str r4, [sp, #0xb4] + ldr r4, [sb, #4] + str r4, [sp, #0xb8] + ldr r4, [sb, #8] + str r4, [sp, #0xbc] + ldr r4, [sb, #0xc] + str r4, [sp, #0xc0] + ldrb r4, [sb, #0x10] + strb r4, [sp, #0xc4] + bl ov45_0223C53C + add sp, sp, #0x1a4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0223C364: + mov r3, #0 + add r2, sl, #0xc + mov r0, sl + mov r1, r4 + str r3, [sp, #0x180] + str r3, [sp, #0x184] + str r3, [sp, #0x188] + str r3, [sp, #0x18c] + str r2, [sp, #0x190] + bl ov45_0223BBFC + mov r3, #0 + mov r1, r0 + strb r3, [sp, #0x10] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #0x180 + strb r3, [sp, #0x11] + bl ov45_0223CB04 + ldr r0, [sp, #0x180] + str r5, [sp, #0x184] + cmp r4, #0 + add r5, r0, r5, lsl #2 + beq _0223C418 + mov r3, #0 +_0223C3C8: + ldr r0, [sb] + cmp r5, #0 + strb r3, [sp, #0xf] + ldr r2, [r0] + sub r4, r4, #1 + strne r2, [r5] + ldr r0, [sp, #0x188] + add r5, r5, #4 + add r0, r0, #1 + str r0, [sp, #0x188] + ldr r0, [sb] + add r1, r0, #4 + str r1, [sb] + ldr r0, [sb, #0xc] + cmp r1, r0 + ldreq r0, [sb, #4] + streq r0, [sb] + cmp r4, #0 + bne _0223C3C8 + str r2, [sp, #0x14] +_0223C418: + ldr r1, [sl, #0xc] + cmp r1, #0 + moveq r1, #0 + beq _0223C438 + ldr r2, [sl, #4] + ldr r0, [sl, #8] + add r0, r2, r0 + bl _u32_div_f +_0223C438: + ldr r0, [sl] + mov r2, #0 + add r0, r0, r1, lsl #2 + str r0, [sp, #0x80] + ldr r4, [sl] + sub r1, sp, #4 + str r4, [sp, #0x84] + ldr r0, [sl, #4] + add r0, r4, r0, lsl #2 + str r0, [sp, #0x88] + ldr r3, [sl, #0xc] + add r0, sp, #0x180 + add r3, r4, r3, lsl #2 + str r3, [sp, #0x8c] + strb r2, [sp, #0xe] + strb r2, [r1] + ldr r3, [r1] + ldr r1, [sp] + add r2, sp, #0x80 + bl ov45_0223CC78 + ldr r1, [sl] + ldr r0, [sl, #4] + mov r2, #0 + add r0, r1, r0, lsl #2 + str r0, [sp, #0x70] + ldr r4, [sl] + sub r1, sp, #4 + str r4, [sp, #0x74] + ldr r0, [sl, #4] + add r0, r4, r0, lsl #2 + str r0, [sp, #0x78] + ldr r3, [sl, #0xc] + add r0, sp, #0x180 + add r3, r4, r3, lsl #2 + str r3, [sp, #0x7c] + strb r2, [sp, #0xd] + strb r2, [r1] + ldr r3, [r1] + ldr r2, [sp] + add r1, sp, #0x70 + bl ov45_0223CB6C + mov r0, #0 + strb r0, [sp, #0xc] + str r0, [sl, #8] + ldr r1, [sl] + ldr r0, [sp, #0x180] + add r3, sp, #0x18c + str r0, [sl] + str r1, [sp, #0x180] + ldr r2, [sl, #4] + ldr r1, [sp, #0x184] + add r0, sp, #0x180 + str r1, [sl, #4] + str r2, [sp, #0x184] + ldr r2, [sl, #8] + ldr r1, [sp, #0x188] + str r1, [sl, #8] + str r2, [sp, #0x188] + ldr r2, [sl, #0xc] + ldr r1, [r3] + str r1, [sl, #0xc] + str r2, [r3] + bl ov45_0223CAB4 + add sp, sp, #0x1a4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223BF9C + + arm_func_start ov45_0223C53C +ov45_0223C53C: ; 0x0223C53C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x60 + mov r5, r1 + ldr r8, [r5] + ldr r7, [r2] + mov r6, r0 + mov r4, r3 + cmp r8, r7 + beq _0223C6E4 + mov r0, r2 + bl ov45_0223CDBC + str r0, [sp, #0xc] +_0223C56C: + ldr r2, [r4, #0xc] + ldr r0, [r4] + ldr r1, [sp, #0xc] + sub r2, r2, r0 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + mov r2, r0, asr #2 + cmp r1, r0, asr #2 + addle r0, sp, #0xc + str r2, [sp, #8] + addgt r0, sp, #8 + ldr r7, [r0] + ldr r1, [r5] + add r0, sp, #0x10 + str r1, [sp, #0x10] + ldr r2, [r5, #4] + mov r1, r7 + str r2, [sp, #0x14] + ldr r2, [r5, #8] + str r2, [sp, #0x18] + ldr r2, [r5, #0xc] + str r2, [sp, #0x1c] + ldrb r2, [r5, #0x10] + strb r2, [sp, #0x20] + bl ov45_0223CD78 + ldrb r2, [sp, #0x20] + ldr r0, [sp, #0x10] + ldr ip, [r4] + ldr sb, [sp, #0x14] + ldr r8, [sp, #0x18] + ldr r3, [sp, #0x1c] + str r0, [sp, #0x24] + str sb, [sp, #0x28] + str r8, [sp, #0x2c] + str r3, [sp, #0x30] + strb r2, [sp, #0x34] + ldr lr, [r5] + str r3, [sp, #0x58] + str lr, [sp, #0x38] + ldr r1, [r5, #4] + str r0, [sp, #0x4c] + str r1, [sp, #0x3c] + ldr r1, [r5, #8] + str sb, [sp, #0x50] + str r1, [sp, #0x40] + ldr r1, [r5, #0xc] + str r8, [sp, #0x54] + str r1, [sp, #0x44] + ldrb r1, [r5, #0x10] + strb r2, [sp, #0x5c] + strb r2, [sp] + strb r1, [sp, #0x48] + cmp lr, r0 + add r3, sp, #0x24 + add r2, sp, #0x38 + beq _0223C690 + mov r1, #0 +_0223C650: + strb r1, [sp, #1] + ldr r0, [lr] + str r0, [ip] + ldr lr, [r2] + ldr r8, [r2, #0xc] + add lr, lr, #4 + cmp lr, r8 + ldreq r8, [r2, #4] + str lr, [r2] + streq r8, [r2] + ldr lr, [r2] + ldr r8, [r3] + add ip, ip, #4 + cmp lr, r8 + bne _0223C650 + str r0, [sp, #4] +_0223C690: + ldr r1, [sp, #0xc] + sub r0, r7, #1 + sub r1, r1, r7 + str r1, [sp, #0xc] + ldr r1, [r4] + add r0, r1, r0, lsl #2 + add r1, r0, #4 + str r1, [r4] + ldr r0, [r4, #0xc] + cmp r1, r0 + ldreq r0, [r4, #4] + streq r0, [r4] + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _0223C6E4 + add r0, sp, #0x4c + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldrb r7, [sp] + strb r7, [r5, #0x10] + b _0223C56C +_0223C6E4: + ldr r0, [r4] + str r0, [r6] + ldr r0, [r4, #4] + str r0, [r6, #4] + ldr r0, [r4, #8] + str r0, [r6, #8] + ldr r0, [r4, #0xc] + str r0, [r6, #0xc] + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov45_0223C53C + + arm_func_start ov45_0223C70C +ov45_0223C70C: ; 0x0223C70C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sb, r1 + mov r8, r2 + ldr r2, [r8] + ldr r1, [sb] + mov sl, r0 + mov r7, r3 + cmp r1, r2 + beq _0223C878 + add r4, sp, #8 + mov fp, #0 + mov r5, #1 +_0223C740: + ldr r0, [r8, #4] + cmp r2, r0 + ldreq r0, [r8, #0xc] + streq r0, [r8] + ldr r0, [r8] + sub r0, r0, #4 + str r0, [r8] + ldr r1, [r7] + ldr r0, [r7, #4] + cmp r1, r0 + ldreq r0, [r7, #0xc] + streq r0, [r7] + ldr r0, [r7] + sub r0, r0, #4 + str r0, [r7] + ldr r1, [r7, #8] + cmp r0, r1 + ldrlo r1, [r7, #4] + sub r1, r0, r1 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r0, r0, asr #2 + str r0, [sp, #8] + ldr r1, [sb] + ldr r0, [sb, #8] + ldr r6, [r8, #8] + cmp r1, r0 + movhs r2, r5 + ldr r0, [r8] + movlo r2, fp + cmp r0, r6 + movhs r3, #1 + movlo r3, #0 + cmp r2, r3 + bne _0223C7F4 + sub r1, r0, r1 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + ldr r1, [sp, #8] + mov r2, r0, asr #2 + cmp r1, r0, asr #2 + movlt r0, r4 + str r2, [sp, #4] + addge r0, sp, #4 + b _0223C820 +_0223C7F4: + cmp r0, r6 + ldrlo r6, [r8, #4] + sub r1, r0, r6 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + ldr r1, [sp, #8] + mov r2, r0, asr #2 + cmp r1, r0, asr #2 + movlt r0, r4 + str r2, [sp] + addge r0, sp, #0 +_0223C820: + ldr r6, [r0] + ldr r1, [r8] + add r0, r6, #1 + sub r1, r1, r6, lsl #2 + add r0, r1, r0, lsl #2 + str r1, [r8] + sub r2, r0, r1 + ldr r3, [r7] + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + add r3, r3, #4 + mov r2, r0, asr #2 + sub r0, r3, r2, lsl #2 + mov r2, r2, lsl #2 + bl memmove + ldr r0, [r7] + sub r0, r0, r6, lsl #2 + str r0, [r7] + ldr r2, [r8] + ldr r0, [sb] + cmp r0, r2 + bne _0223C740 +_0223C878: + ldr r0, [r7] + str r0, [sl] + ldr r0, [r7, #4] + str r0, [sl, #4] + ldr r0, [r7, #8] + str r0, [sl, #8] + ldr r0, [r7, #0xc] + str r0, [sl, #0xc] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223C70C + + arm_func_start ov45_0223C8A0 +ov45_0223C8A0: ; 0x0223C8A0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sb, r1 + mov r8, r2 + ldr r2, [sb] + ldr r1, [r8] + mov sl, r0 + mov r7, r3 + cmp r2, r1 + beq _0223C9EC + add r4, sp, #8 + mov fp, #0 + mov r5, #1 +_0223C8D4: + ldr r1, [r7, #0xc] + ldr r0, [r7] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r0, r0, asr #2 + str r0, [sp, #8] + ldr r2, [sb] + ldr r0, [sb, #8] + ldr r1, [r8] + cmp r2, r0 + movhs r3, r5 + ldr r0, [r8, #8] + movlo r3, fp + cmp r1, r0 + movhs r0, #1 + movlo r0, #0 + cmp r3, r0 + bne _0223C948 + sub r1, r1, r2 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + ldr r1, [sp, #8] + mov r2, r0, asr #2 + cmp r1, r0, asr #2 + movlt r0, r4 + str r2, [sp, #4] + addge r0, sp, #4 + b _0223C970 +_0223C948: + ldr r0, [sb, #0xc] + ldr r1, [sp, #8] + sub r2, r0, r2 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + mov r2, r0, asr #2 + cmp r1, r0, asr #2 + movlt r0, r4 + str r2, [sp] + addge r0, sp, #0 +_0223C970: + ldr r6, [r0] + ldr r1, [sb] + ldr r0, [r7] + add r2, r1, r6, lsl #2 + sub r3, r2, r1 + mov r2, r3, asr #1 + add r2, r3, r2, lsr #30 + mov r2, r2, asr #2 + mov r2, r2, lsl #2 + bl memmove + ldr r1, [sb] + sub r0, r6, #1 + add r1, r1, r0, lsl #2 + add r2, r1, #4 + str r2, [sb] + ldr r1, [sb, #0xc] + cmp r2, r1 + ldreq r1, [sb, #4] + streq r1, [sb] + ldr r1, [r7] + add r0, r1, r0, lsl #2 + add r1, r0, #4 + str r1, [r7] + ldr r0, [r7, #0xc] + cmp r1, r0 + ldreq r0, [r7, #4] + streq r0, [r7] + ldr r1, [sb] + ldr r0, [r8] + cmp r1, r0 + bne _0223C8D4 +_0223C9EC: + ldr r0, [r7] + str r0, [sl] + ldr r0, [r7, #4] + str r0, [sl, #4] + ldr r0, [r7, #8] + str r0, [sl, #8] + ldr r0, [r7, #0xc] + str r0, [sl, #0xc] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223C8A0 + + arm_func_start ov45_0223CA14 +ov45_0223CA14: ; 0x0223CA14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r2, #0 + mov r4, r0 + strb r2, [sp] + str r2, [r4, #4] + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _0223CAA4 + ldr r1, [r4, #0x14] + cmp r1, #0 + beq _0223CA54 + ldr r2, [r4, #0xc] + ldr r0, [r4, #0x10] + add r0, r2, r0 + bl _u32_div_f + mov r2, r1 +_0223CA54: + ldr r8, [r4, #8] + ldr r0, [r4, #0xc] + ldr r1, [r4, #0x14] + add r6, r8, r2, lsl #2 + add r7, r8, r0, lsl #2 + cmp r7, r6 + add sb, r8, r1, lsl #2 + beq _0223CAA4 + mov r5, #0 +_0223CA78: + ldr r1, [r7] + cmp r1, #0 + beq _0223CA90 + mov r0, r5 + mov r2, r5 + bl ov00_021EC2EC +_0223CA90: + add r7, r7, #4 + cmp r7, sb + moveq r7, r8 + cmp r7, r6 + bne _0223CA78 +_0223CAA4: + add r0, r4, #8 + bl ov45_02238508 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov45_0223CA14 + + arm_func_start ov45_0223CAB4 +ov45_0223CAB4: ; 0x0223CAB4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _0223CAF8 + ldr r2, [r4, #8] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #8] + sub r1, r1, r2 + str r1, [r4, #8] + ldr r1, [r4] + cmp r1, #0 + beq _0223CAF8 + mov r2, r0 + bl ov00_021EC2EC +_0223CAF8: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223CAB4 + + arm_func_start ov45_0223CB04 +ov45_0223CB04: ; 0x0223CB04 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0223CB64 ; =ov45_022577CC + mov r5, r0 + ldr r3, [r2] + mov r4, r1 + tst r3, #1 + bne _0223CB34 + ldr r0, _0223CB68 ; =ov45_022551A0 + orr r1, r3, #1 + mvn r3, #0xc0000001 + str r3, [r0] + str r1, [r2] +_0223CB34: + ldr r0, _0223CB68 ; =ov45_022551A0 + ldr r0, [r0] + cmp r4, r0 + bls _0223CB48 + bl ov45_0223BD0C +_0223CB48: + add r0, r4, #1 + mov r0, r0, lsl #2 + bl ov45_02242394 + str r0, [r5] + add r0, r4, #1 + str r0, [r5, #0xc] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223CB64: .word ov45_022577CC +_0223CB68: .word ov45_022551A0 + arm_func_end ov45_0223CB04 + + arm_func_start ov45_0223CB6C +ov45_0223CB6C: ; 0x0223CB6C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + ldr r3, [r7] + ldr r0, [r7, #4] + ldr r2, [r5] + ldr r1, [r6] + add r0, r3, r0, lsl #2 + cmp r1, r2 + bhi _0223CBE4 + sub r3, r2, r1 + mov r2, r3, asr #1 + add r2, r3, r2, lsr #30 + mov r3, r2, asr #2 + mov r2, r3, lsl #2 + sub r0, r0, r3, lsl #2 + bl memmove + ldr r2, [r5] + ldr r0, [r6] + ldr r1, [r7, #8] + sub r2, r2, r0 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + add r1, r1, r0, asr #2 + str r1, [r7, #8] + ldr r1, [r7, #4] + sub r0, r1, r0, asr #2 + str r0, [r7, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223CBE4: + ldr r1, [r5, #4] + sub r3, r2, r1 + mov r2, r3, asr #1 + add r2, r3, r2, lsr #30 + mov r2, r2, asr #2 + sub r4, r0, r2, lsl #2 + mov r0, r4 + mov r2, r2, lsl #2 + bl memmove + ldr r1, [r6] + ldr r0, [r6, #0xc] + sub r2, r0, r1 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + mov r0, r0, asr #2 + mov r2, r0, lsl #2 + sub r0, r4, r0, lsl #2 + bl memmove + ldr r1, [r6, #0xc] + ldr r0, [r6] + ldr r4, [r5] + ldr r3, [r5, #4] + sub r2, r1, r0 + sub r3, r4, r3 + mov r1, r2, asr #1 + mov r0, r3, asr #1 + add r1, r2, r1, lsr #30 + add r0, r3, r0, lsr #30 + mov r2, r1, asr #2 + ldr r1, [r7, #4] + add r2, r2, r0, asr #2 + sub r0, r1, r2 + str r0, [r7, #4] + ldr r0, [r7, #8] + add r0, r0, r2 + str r0, [r7, #8] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223CB6C + + arm_func_start ov45_0223CC78 +ov45_0223CC78: ; 0x0223CC78 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + ldr r3, [r7, #4] + ldr r0, [r7, #8] + mov r6, r1 + ldr r1, [r7, #0xc] + add r0, r3, r0 + mov r5, r2 + bl _u32_div_f + ldr r2, [r7] + ldr r0, [r5] + add r4, r2, r1, lsl #2 + ldr r1, [r6] + cmp r1, r0 + bhi _0223CCF4 + sub r2, r0, r1 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + mov r2, r0, asr #2 + mov r0, r4 + mov r2, r2, lsl #2 + bl memmove + ldr r1, [r5] + ldr r0, [r6] + ldr r2, [r7, #8] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + add r0, r2, r0, asr #2 + str r0, [r7, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0223CCF4: + ldr r2, [r6, #0xc] + mov r0, r4 + sub r3, r2, r1 + mov r2, r3, asr #1 + add r2, r3, r2, lsr #30 + mov r8, r2, asr #2 + mov r2, r8, lsl #2 + bl memmove + ldr r1, [r5, #4] + ldr r2, [r5] + add r0, r4, r8, lsl #2 + sub r3, r2, r1 + mov r2, r3, asr #1 + add r2, r3, r2, lsr #30 + mov r2, r2, asr #2 + mov r2, r2, lsl #2 + bl memmove + ldr r1, [r5] + ldr r0, [r5, #4] + ldr r4, [r6, #0xc] + ldr r3, [r6] + sub r2, r1, r0 + sub r3, r4, r3 + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + mov r0, r3, asr #1 + add r0, r3, r0, lsr #30 + mov r1, r1, asr #2 + ldr r2, [r7, #8] + add r0, r1, r0, asr #2 + add r0, r2, r0 + str r0, [r7, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov45_0223CC78 + + arm_func_start ov45_0223CD78 +ov45_0223CD78: ; 0x0223CD78 + stmdb sp!, {r4, lr} + ldr r3, [r0, #0xc] + ldmia r0, {r2, r4} + sub ip, r2, r4 + sub lr, r3, r4 + mov r3, ip, asr #1 + mov r2, lr, asr #1 + add r3, ip, r3, lsr #30 + add r2, lr, r2, lsr #30 + adds r1, r1, r3, asr #2 + addmi r1, r1, r2, asr #2 + bmi _0223CDB0 + cmp r1, r2, asr #2 + subge r1, r1, r2, asr #2 +_0223CDB0: + add r1, r4, r1, lsl #2 + str r1, [r0] + ldmia sp!, {r4, pc} + arm_func_end ov45_0223CD78 + + arm_func_start ov45_0223CDBC +ov45_0223CDBC: ; 0x0223CDBC + stmdb sp!, {r3, lr} + ldr ip, [r1] + ldr r3, [r0] + ldr lr, [r0, #8] + sub r2, r3, ip + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + cmp r3, lr + mov r2, r1, asr #2 + blo _0223CE08 + cmp ip, lr + bhs _0223CE28 + ldr r1, [r0, #0xc] + ldr r0, [r0, #4] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + sub r2, r2, r0, asr #2 + b _0223CE28 +_0223CE08: + cmp ip, lr + blo _0223CE28 + ldr r1, [r0, #0xc] + ldr r0, [r0, #4] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + add r2, r2, r0, asr #2 +_0223CE28: + mov r0, r2 + ldmia sp!, {r3, pc} + arm_func_end ov45_0223CDBC + + arm_func_start ov45_0223CE30 +ov45_0223CE30: ; 0x0223CE30 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mvn r1, #0xe0000000 + mov r5, r0 + cmp r4, r1 + bls _0223CE4C + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223CE4C: + mov r0, r4, lsl #3 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223CE30 + + arm_func_start ov45_0223CE60 +ov45_0223CE60: ; 0x0223CE60 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mvn r1, #0xe0000000 + mov r5, r0 + cmp r4, r1 + bls _0223CE7C + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223CE7C: + mov r0, r4, lsl #3 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223CE60 + + arm_func_start ov45_0223CE90 +ov45_0223CE90: ; 0x0223CE90 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + ldr r1, [sp, #0x44] + mov r4, r0 + ldmia r1, {r0, r1, r2, r3} + add r5, sp, #0x14 + add lr, sp, #0x34 + stmia r5, {r0, r1, r2, r3} + add ip, sp, #4 + ldmia lr, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + mov r0, r5 + mov r1, ip + bl ov45_0223D208 + movs r1, r0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr + mov r2, #0 + strb r2, [sp, #1] + sub r0, sp, #4 + strb r2, [r0] + ldr r2, [r0] + mov r0, r4 + bl ov45_0223D15C + mov r1, #0 + strb r1, [sp] + sub r0, sp, #4 + strb r1, [r0] + ldr r3, [r0] + ldr r2, [sp, #0x44] + add r1, sp, #0x34 + mov r0, r4 + bl ov45_0223CF30 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223CE90 + + arm_func_start ov45_0223CF30 +ov45_0223CF30: ; 0x0223CF30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x5c + mov r7, r0 + ldr r4, [r7] + mov r6, r1 + cmp r4, #0 + mov r5, r2 + addeq sp, sp, #0x5c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r2, [r7, #4] + ldr r0, [r7, #8] + ldr r1, [r7, #0xc] + add r0, r2, r0 + bl _u32_div_f + add r4, r4, r1, lsl #2 + mov r0, r5 + mov r1, r6 + bl ov45_0223D208 + str r0, [sp, #0x18] + ldr r2, [r7] + ldr r1, [r7, #0xc] + add r1, r2, r1, lsl #2 + sub r2, r1, r4 + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + mov r2, r1, asr #2 + cmp r0, r1, asr #2 + addlt r1, sp, #0x18 + str r2, [sp, #0x14] + addge r1, sp, #0x14 + ldr r1, [r1] + str r1, [sp, #0x14] + ldr r1, [r7, #8] + add r0, r1, r0 + str r0, [r7, #8] + ldr r0, [r6] + ldr r1, [sp, #0x14] + str r0, [sp, #0x2c] + ldr r2, [r6, #4] + add r0, sp, #0x2c + str r2, [sp, #0x30] + ldr r2, [r6, #8] + str r2, [sp, #0x34] + ldr r2, [r6, #0xc] + str r2, [sp, #0x38] + bl ov45_0223D1C4 + ldr r8, [r0] + ldr r3, [r0, #4] + ldr r2, [r0, #8] + ldr r1, [r0, #0xc] + str r8, [sp, #0x4c] + add r0, sp, #0x4c + mov r8, sp + str r3, [sp, #0x50] + str r2, [sp, #0x54] + str r1, [sp, #0x58] + ldmia r0, {r0, r1, r2, r3} + stmia r8, {r0, r1, r2, r3} + str r4, [sp, #0x10] + ldmia r6, {r0, r1, r2, r3} + bl ov45_0223D0A8 + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x18] + subs r0, r0, r1 + str r0, [sp, #0x18] + addeq sp, sp, #0x5c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r2, [r6] + add r0, sp, #0x1c + str r2, [sp, #0x1c] + ldr r2, [r6, #4] + str r2, [sp, #0x20] + ldr r2, [r6, #8] + str r2, [sp, #0x24] + ldr r2, [r6, #0xc] + str r2, [sp, #0x28] + bl ov45_0223D1C4 + ldmia r0, {r8, lr} + ldr ip, [r0, #8] + ldr r6, [r0, #0xc] + mov r4, sp + ldmia r5, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r4, [r7] + str r8, [sp, #0x3c] + add r0, sp, #0x3c + str lr, [sp, #0x40] + str ip, [sp, #0x44] + str r6, [sp, #0x48] + ldmia r0, {r0, r1, r2, r3} + str r4, [sp, #0x10] + bl ov45_0223D0A8 + add sp, sp, #0x5c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov45_0223CF30 + + arm_func_start ov45_0223D0A8 +ov45_0223D0A8: ; 0x0223D0A8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r0, [sp, #0x2c] + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x38] + ldr sl, [sp, #0x48] + cmp r6, r5 + str r0, [sp] + ldr r8, [sp, #0x34] + ldr r7, [sp, #0x30] + ldr fp, [sp, #0x40] + beq _0223D14C +_0223D0D8: + cmp r6, r7 + movhs r0, #1 + movlo r0, #0 + cmp r5, fp + movhs r1, #1 + movlo r1, #0 + cmp r0, r1 + subeq r1, r5, r6 + subne r1, r8, r6 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov sb, r0, asr #2 + add r0, r6, sb, lsl #2 + sub r1, r0, r6 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r4, r0, asr #2 + mov r2, r4, lsl #2 + mov r0, sl + mov r1, r6 + bl memmove + sub r0, sb, #1 + add r0, r6, r0, lsl #2 + add r6, r0, #4 + cmp r6, r8 + ldreq r6, [sp] + add sl, sl, r4, lsl #2 + cmp r6, r5 + bne _0223D0D8 +_0223D14C: + mov r0, sl + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223D0A8 + + arm_func_start ov45_0223D15C +ov45_0223D15C: ; 0x0223D15C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0223D1BC ; =ov45_022577D0 + mov r5, r0 + ldr r3, [r2] + mov r4, r1 + tst r3, #1 + bne _0223D18C + ldr r0, _0223D1C0 ; =ov45_022551A4 + orr r1, r3, #1 + mvn r3, #0xc0000001 + str r3, [r0] + str r1, [r2] +_0223D18C: + ldr r0, _0223D1C0 ; =ov45_022551A4 + ldr r0, [r0] + cmp r4, r0 + bls _0223D1A0 + bl ov45_0223BD0C +_0223D1A0: + add r0, r4, #1 + mov r0, r0, lsl #2 + bl ov45_02242394 + str r0, [r5] + add r0, r4, #1 + str r0, [r5, #0xc] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0223D1BC: .word ov45_022577D0 +_0223D1C0: .word ov45_022551A4 + arm_func_end ov45_0223D15C + + arm_func_start ov45_0223D1C4 +ov45_0223D1C4: ; 0x0223D1C4 + stmdb sp!, {r4, lr} + ldr r3, [r0, #0xc] + ldmia r0, {r2, r4} + sub ip, r2, r4 + sub lr, r3, r4 + mov r3, ip, asr #1 + mov r2, lr, asr #1 + add r3, ip, r3, lsr #30 + add r2, lr, r2, lsr #30 + adds r1, r1, r3, asr #2 + addmi r1, r1, r2, asr #2 + bmi _0223D1FC + cmp r1, r2, asr #2 + subge r1, r1, r2, asr #2 +_0223D1FC: + add r1, r4, r1, lsl #2 + str r1, [r0] + ldmia sp!, {r4, pc} + arm_func_end ov45_0223D1C4 + + arm_func_start ov45_0223D208 +ov45_0223D208: ; 0x0223D208 + stmdb sp!, {r3, lr} + ldr ip, [r1] + ldr r3, [r0] + ldr lr, [r0, #8] + sub r2, r3, ip + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + cmp r3, lr + mov r2, r1, asr #2 + blo _0223D254 + cmp ip, lr + bhs _0223D274 + ldr r1, [r0, #0xc] + ldr r0, [r0, #4] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + sub r2, r2, r0, asr #2 + b _0223D274 +_0223D254: + cmp ip, lr + blo _0223D274 + ldr r1, [r0, #0xc] + ldr r0, [r0, #4] + sub r1, r1, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + add r2, r2, r0, asr #2 +_0223D274: + mov r0, r2 + ldmia sp!, {r3, pc} + arm_func_end ov45_0223D208 + + arm_func_start ov45_0223D27C +ov45_0223D27C: ; 0x0223D27C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x84 + mov r4, r1 + mov r5, r0 + ldr r1, _0223D62C ; =ov45_022551DC + add r0, sp, #0x60 + bl ov45_02237B58 + add r0, sp, #0x78 + add r2, sp, #0x60 + mov r1, r5 + mov r3, #2 + bl ov45_0223649C + add r0, sp, #0x60 + bl ov45_02237BC8 + ldr r0, [sp, #0x7c] + cmp r0, #2 + beq _0223D2D4 + add r0, sp, #0x78 + bl ov45_02237664 + add sp, sp, #0x84 + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0223D2D4: + ldr r1, [sp, #0x78] + ldr r0, [r1] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r0, [r1, #4] + bne _0223D2F8 + ldrb r0, [r1] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_0223D2F8: + cmp r0, #0x28 + bls _0223D314 + add r0, sp, #0x78 + bl ov45_02237664 + add sp, sp, #0x84 + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0223D314: + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r0, [r1, #0x10] + bne _0223D334 + ldrb r0, [r1, #0xc] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_0223D334: + cmp r0, #0x190 + bls _0223D350 + add r0, sp, #0x78 + bl ov45_02237664 + add sp, sp, #0x84 + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0223D350: + ldr r1, _0223D630 ; =ov45_022551E0 + add r0, sp, #0x54 + bl ov45_02237B58 + ldr r1, [sp, #0x78] + add r0, sp, #0x6c + add r2, sp, #0x54 + mov r3, #0 + bl ov45_0223649C + add r0, sp, #0x54 + bl ov45_02237BC8 + ldr r0, [sp, #0x70] + cmp r0, #6 + bhs _0223D3A0 + add r0, sp, #0x6c + bl ov45_02237664 + add r0, sp, #0x78 + bl ov45_02237664 + add sp, sp, #0x84 + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0223D3A0: + ldr r1, [sp, #0x6c] + mov r2, #0x10 + ldr r0, [r1] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #1 + ldrne r0, [r1, #8] + add r1, sp, #0x20 + bl strtoul + str r0, [r4] + ldr r1, [sp, #0x6c] + mov r2, #0x10 + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #0xd + ldrne r0, [r1, #0x14] + add r1, sp, #0x20 + bl strtoul + str r0, [r4, #4] + ldr r1, [sp, #0x6c] + ldr r5, _0223D634 ; =ov45_022551E4 + ldr r0, [r1, #0x18] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r1, #0x19 + ldrne r1, [r1, #0x20] + add r0, sp, #0x3c + bl ov45_02237B58 + add r0, sp, #0x48 + mov r1, r5 + bl ov45_02237B58 + add r0, sp, #0x3c + add r1, sp, #0x48 + mov r2, #1 + bl ov45_0223D644 + mov r5, r0 + add r0, sp, #0x48 + bl ov45_02237BC8 + add r0, sp, #0x3c + bl ov45_02237BC8 + cmp r5, #0 + moveq r0, #1 + movne r0, #0 + str r0, [r4, #8] + ldr r1, [sp, #0x6c] + ldr r5, _0223D638 ; =ov45_022551E8 + ldr r0, [r1, #0x24] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, r1, #0x25 + ldrne r1, [r1, #0x2c] + add r0, sp, #0x24 + bl ov45_02237B58 + add r0, sp, #0x30 + mov r1, r5 + bl ov45_02237B58 + add r0, sp, #0x24 + add r1, sp, #0x30 + mov r2, #1 + bl ov45_0223D644 + mov r5, r0 + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + cmp r5, #0 + moveq r0, #0 + movne r0, #1 + str r0, [r4, #0xc] + ldr r1, [sp, #0x6c] + mov r2, #0x10 + ldr r0, [r1, #0x30] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #0x31 + ldrne r0, [r1, #0x38] + add r1, sp, #0x20 + bl strtol + str r0, [r4, #0x10] + add r0, sp, #0x6c + bl ov45_02237664 + ldr r0, [r4, #8] + cmp r0, #1 + bne _0223D530 + ldr r1, [sp, #0x78] + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #0xd + ldrne r0, [r1, #0x14] + add r1, r4, #0x18 + bl ov45_02233FE4 + cmp r0, #0 + bne _0223D618 + add r0, sp, #0x78 + bl ov45_02237664 + add sp, sp, #0x84 + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_0223D530: + ldr r0, [sp, #0x78] + ldr r1, [r0, #0xc] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r2, [r0, #0x10] + bne _0223D554 + ldrb r1, [r0, #0xc] + mov r1, r1, lsl #0x18 + mov r2, r1, lsr #0x19 +_0223D554: + ldr r1, [r0, #0xc] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + ldr r1, [r0, #0xc] + addeq r3, r0, #0xd + mov r1, r1, lsl #0x1f + ldrne r3, [r0, #0x14] + movs r1, r1, lsr #0x1f + addeq r5, r0, #0xd + ldrne r5, [r0, #0x14] + mov r0, #0 + add r2, r3, r2 + strb r0, [sp, #0xb] + strb r0, [sp, #0xc] + strb r0, [sp, #0xa] + strb r0, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x1c] + str r2, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r1, sp, #0x10 + str r5, [sp, #0x10] + str r2, [sp, #0x18] + add r0, r4, #0x18 + ldmia r1, {r1, r2} + bl ov45_022327B8 + mov r2, #0 + strb r2, [sp, #8] + ldr r1, [r4, #0x1c] + ldr r0, [r4, #0x20] + cmp r1, r0 + bhs _0223D5F8 + add r3, r1, #1 + str r3, [r4, #0x1c] + ldr r0, _0223D63C ; =ov45_022551D8 + ldr r1, [r4, #0x18] + ldrsb r2, [r0, #1] + add r0, r1, r3 + strb r2, [r0, #-1] + b _0223D618 +_0223D5F8: + strb r2, [sp, #9] + sub r1, sp, #4 + and r0, r2, #0xff + strb r0, [r1] + ldr r2, [r1] + ldr r1, _0223D640 ; =ov45_022551D9 + add r0, r4, #0x18 + bl ov45_0223DA3C +_0223D618: + add r0, sp, #0x78 + bl ov45_02237664 + mov r0, #1 + add sp, sp, #0x84 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0223D62C: .word ov45_022551DC +_0223D630: .word ov45_022551E0 +_0223D634: .word ov45_022551E4 +_0223D638: .word ov45_022551E8 +_0223D63C: .word ov45_022551D8 +_0223D640: .word ov45_022551D9 + arm_func_end ov45_0223D27C + + arm_func_start ov45_0223D644 +ov45_0223D644: ; 0x0223D644 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x30 + mov r6, r0 + ldr r0, [r6] + mov r5, r1 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r4, r2 + ldmneib r6, {r0, r1} + bne _0223D67C + ldrb r0, [r6] + add r1, r6, #1 + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_0223D67C: + add r0, r1, r0 + str r0, [sp, #0x28] + ldr r0, [r6] + add r1, sp, #0x28 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + moveq r2, #1 + movne r2, #0 + ldr r0, [r1] + cmp r2, #0 + addne r3, r6, #1 + ldreq r3, [r6, #8] + str r0, [sp, #0x10] + cmp r2, #0 + addne sb, r6, #1 + ldreq sb, [r6, #8] + ldr r8, [sp, #0x10] + str r3, [sp, #0x24] + str r3, [sp, #0xc] + str sb, [sp, #0x2c] + str sb, [sp, #0x14] + cmp sb, r8 + beq _0223D6F8 + ldr r7, [sp, #0xc] +_0223D6DC: + ldrsb r0, [sb], #1 + bl ov45_0223D7B4 + cmp sb, r8 + strb r0, [r7], #1 + bne _0223D6DC + str r7, [sp, #0xc] + str sb, [sp, #0x14] +_0223D6F8: + ldr r0, [r5] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldmneib r5, {r0, r1} + bne _0223D71C + ldrb r0, [r5] + add r1, r5, #1 + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_0223D71C: + add r0, r1, r0 + str r0, [sp, #0x1c] + ldr r0, [r5] + add r1, sp, #0x1c + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + moveq r2, #1 + movne r2, #0 + ldr r0, [r1] + cmp r2, #0 + addne r3, r5, #1 + ldreq r3, [r5, #8] + str r0, [sp, #4] + cmp r2, #0 + addne sb, r5, #1 + ldreq sb, [r5, #8] + ldr r8, [sp, #4] + str r3, [sp, #0x18] + str r3, [sp] + str sb, [sp, #0x20] + str sb, [sp, #8] + cmp sb, r8 + beq _0223D798 + ldr r7, [sp] +_0223D77C: + ldrsb r0, [sb], #1 + bl ov45_0223D7B4 + cmp sb, r8 + strb r0, [r7], #1 + bne _0223D77C + str r7, [sp] + str sb, [sp, #8] +_0223D798: + mov r0, r6 + mov r2, r4 + mov r3, r5 + mov r1, #0 + bl ov45_0223DB54 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov45_0223D644 + + arm_func_start ov45_0223D7B4 +ov45_0223D7B4: ; 0x0223D7B4 + cmp r0, #0 + bxlt lr + cmp r0, #0x80 + bxge lr + ldr r1, _0223D7D0 ; =_0210E404 + ldrb r0, [r1, r0] + bx lr + .balign 4, 0 +_0223D7D0: .word _0210E404 + arm_func_end ov45_0223D7B4 + + arm_func_start ov45_0223D7D4 +ov45_0223D7D4: ; 0x0223D7D4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x1c4 + movs sb, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + ldr r5, [sp, #0x1e0] + ldr r4, [sp, #0x1e4] + bne _0223D808 + cmp r5, #0x190 + addhi sp, sp, #0x1c4 + movhi r0, #0 + ldmhiia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0223D808: + cmp sb, #1 + bne _0223D820 + cmp r5, #0x12c + addhi sp, sp, #0x1c4 + movhi r0, #0 + ldmhiia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0223D820: + ldr r1, _0223DA14 ; =ov45_022551EC + mov r0, r4 + bl ov45_0223DAD4 + ldr r2, _0223DA18 ; =ov45_022551F0 + add r0, sp, #0x24 + mov r1, #3 + mov r3, #0 + bl ov45_02232B24 + mov r0, r4 + add r1, sp, #0x24 + bl ov45_0223DA6C + add r0, sp, #0x24 + bl ov45_02237BC8 + ldr r1, _0223DA1C ; =ov45_022551E0 + mov r0, r4 + bl ov45_0223DAA0 + ldr r2, _0223DA18 ; =ov45_022551F0 + add r0, sp, #0x18 + mov r1, #2 + mov r3, #6 + bl ov45_02232B24 + mov r0, r4 + add r1, sp, #0x18 + bl ov45_0223DA6C + add r0, sp, #0x18 + bl ov45_02237BC8 + ldr r1, _0223DA1C ; =ov45_022551E0 + mov r0, r4 + bl ov45_0223DAA0 + cmp sb, #0 + beq _0223D8A8 + cmp sb, #1 + beq _0223D8B8 + b _0223D8C8 +_0223D8A8: + ldr r1, _0223DA20 ; =ov45_022551E8 + mov r0, r4 + bl ov45_0223DAA0 + b _0223D8D4 +_0223D8B8: + ldr r1, _0223DA24 ; =ov45_022551E4 + mov r0, r4 + bl ov45_0223DAA0 + b _0223D8D4 +_0223D8C8: + add sp, sp, #0x1c4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0223D8D4: + ldr r1, _0223DA1C ; =ov45_022551E0 + mov r0, r4 + bl ov45_0223DAA0 + cmp r8, #0 + beq _0223D900 + cmp r8, #1 + bne _0223D910 + ldr r1, _0223DA28 ; =ov45_022551F4 + mov r0, r4 + bl ov45_0223DAA0 + b _0223D91C +_0223D900: + ldr r1, _0223DA20 ; =ov45_022551E8 + mov r0, r4 + bl ov45_0223DAA0 + b _0223D91C +_0223D910: + add sp, sp, #0x1c4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0223D91C: + ldr r1, _0223DA1C ; =ov45_022551E0 + mov r0, r4 + bl ov45_0223DAA0 + ldr r2, _0223DA18 ; =ov45_022551F0 + add r0, sp, #0xc + mov r3, r7 + mov r1, #8 + bl ov45_02232B24 + add r1, sp, #0xc + mov r0, r4 + bl ov45_0223DA6C + add r0, sp, #0xc + bl ov45_02237BC8 + ldr r1, _0223DA1C ; =ov45_022551E0 + mov r0, r4 + bl ov45_0223DAA0 + ldr r1, _0223DA2C ; =ov45_022551F8 + mov r0, r4 + bl ov45_0223DAA0 + ldr r1, _0223DA30 ; =ov45_022551DC + mov r0, r4 + bl ov45_0223DAA0 + cmp sb, #0 + beq _0223D988 + cmp sb, #1 + beq _0223D9B4 + b _0223D9FC +_0223D988: + ldr r2, _0223DA34 ; =ov45_022551FC + add r0, sp, #0 + mov r1, r5 + mov r3, r6 + bl ov45_02232B24 + add r1, sp, #0 + mov r0, r4 + bl ov45_0223DA6C + add r0, sp, #0 + bl ov45_02237BC8 + b _0223DA08 +_0223D9B4: + ldr r2, _0223DA38 ; =0x00000191 + add r0, sp, #0x30 + mov r1, #0 + bl MI_CpuFill8 + ldr r3, _0223DA38 ; =0x00000191 + add r2, sp, #0x30 + mov r0, r6 + mov r1, r5 + bl ov00_021EFF30 + mvn r1, #0 + cmp r0, r1 + addeq sp, sp, #0x1c4 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r1, sp, #0x30 + mov r0, r4 + bl ov45_0223DAA0 + b _0223DA08 +_0223D9FC: + add sp, sp, #0x1c4 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0223DA08: + mov r0, #1 + add sp, sp, #0x1c4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223DA14: .word ov45_022551EC +_0223DA18: .word ov45_022551F0 +_0223DA1C: .word ov45_022551E0 +_0223DA20: .word ov45_022551E8 +_0223DA24: .word ov45_022551E4 +_0223DA28: .word ov45_022551F4 +_0223DA2C: .word ov45_022551F8 +_0223DA30: .word ov45_022551DC +_0223DA34: .word ov45_022551FC +_0223DA38: .word 0x00000191 + arm_func_end ov45_0223D7D4 + + arm_func_start ov45_0223DA3C +ov45_0223DA3C: ; 0x0223DA3C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r2, #0 + mov r5, r0 + mov r1, #1 + strb r2, [sp] + bl ov45_02237890 + mov r0, r5 + mov r2, r4 + mov r1, #1 + bl ov45_0223DB8C + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223DA3C + + arm_func_start ov45_0223DA6C +ov45_0223DA6C: ; 0x0223DA6C + ldr r2, [r0] + mov r3, r1 + mov r1, r2, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r1, [r0, #4] + bne _0223DA90 + ldrb r1, [r0] + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x19 +_0223DA90: + ldr ip, _0223DA9C ; =ov45_02237DB4 + mov r2, #0 + bx ip + .balign 4, 0 +_0223DA9C: .word ov45_02237DB4 + arm_func_end ov45_0223DA6C + + arm_func_start ov45_0223DAA0 +ov45_0223DAA0: ; 0x0223DAA0 + ldr r2, [r0] + mov r3, r1 + mov r1, r2, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r1, [r0, #4] + bne _0223DAC4 + ldrb r1, [r0] + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x19 +_0223DAC4: + ldr ip, _0223DAD0 ; =ov45_0223DB08 + mov r2, #0 + bx ip + .balign 4, 0 +_0223DAD0: .word ov45_0223DB08 + arm_func_end ov45_0223DAA0 + + arm_func_start ov45_0223DAD4 +ov45_0223DAD4: ; 0x0223DAD4 + ldr r2, [r0] + mov r3, r1 + mov r1, r2, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrne r2, [r0, #4] + bne _0223DAF8 + ldrb r1, [r0] + mov r1, r1, lsl #0x18 + mov r2, r1, lsr #0x19 +_0223DAF8: + ldr ip, _0223DB04 ; =ov45_0223DB08 + mov r1, #0 + bx ip + .balign 4, 0 +_0223DB04: .word ov45_0223DB08 + arm_func_end ov45_0223DAD4 + + arm_func_start ov45_0223DB08 +ov45_0223DB08: ; 0x0223DB08 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r4, r3 + mov r7, r0 + mov r0, r4 + mov r6, r1 + mov r5, r2 + bl strlen + add r0, r4, r0 + ldrb ip, [sp, #8] + str r0, [sp] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + strb ip, [sp, #4] + bl ov45_02238104 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov45_0223DB08 + + arm_func_start ov45_0223DB54 +ov45_0223DB54: ; 0x0223DB54 + stmdb sp!, {r3, lr} + ldr ip, [r3] + mov ip, ip, lsl #0x1f + movs ip, ip, lsr #0x1f + ldmneib r3, {ip, lr} + bne _0223DB7C + ldrb ip, [r3] + add lr, r3, #1 + mov r3, ip, lsl #0x18 + mov ip, r3, lsr #0x19 +_0223DB7C: + mov r3, lr + str ip, [sp] + bl ov45_02238024 + ldmia sp!, {r3, pc} + arm_func_end ov45_0223DB54 + + arm_func_start ov45_0223DB8C +ov45_0223DB8C: ; 0x0223DB8C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + mov r4, #0 + mov r6, r0 + add r3, r6, #8 + str r4, [sp, #8] + str r4, [sp, #0xc] + str r4, [sp, #0x10] + str r4, [sp, #0x18] + str r3, [sp, #0x14] + mov r5, r1 + ldr r3, [r6, #4] + ldr r1, [r6, #8] + add r3, r3, r5 + sub r1, r3, r1 + mov r4, r2 + bl ov45_02237890 + mov r3, #0 + mov r1, r0 + strb r3, [sp, #3] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #8 + strb r3, [sp, #4] + bl ov45_022389CC + ldr r2, [r6, #4] + mov r0, #0 + ldr r1, [sp, #8] + strb r0, [sp, #2] + str r2, [sp, #0x18] + add r3, r1, r2 + ldr r0, [sp, #0xc] + ldrb r1, [r4] + mov r2, r5 + add r0, r3, r0 + bl memset + ldr r0, [sp, #0xc] + mov r1, #0 + add r0, r0, r5 + str r0, [sp, #0xc] + ldr r5, [r6] + ldr r2, [r6, #4] + ldr r0, [sp, #0x18] + strb r1, [sp, #1] + add r1, r5, r2 + sub r4, r1, r5 + sub r2, r0, r4 + ldr r0, [sp, #8] + str r2, [sp, #0x18] + add r0, r0, r2 + mov r1, r5 + mov r2, r4 + bl memcpy + mov r0, r5 + mov r1, #0 + mov r2, r4 + bl memset + ldr r1, [sp, #0xc] + mov r0, #0 + add r1, r1, r4 + str r1, [sp, #0xc] + strb r0, [sp] + str r0, [r6, #4] + add r3, sp, #0x10 + ldr r2, [r6, #8] + ldr r1, [r3] + add r0, sp, #8 + str r1, [r6, #8] + str r2, [r3] + ldr r2, [r6] + ldr r1, [sp, #8] + str r1, [r6] + str r2, [sp, #8] + ldr r2, [r6, #4] + ldr r1, [sp, #0xc] + str r1, [r6, #4] + str r2, [sp, #0xc] + bl ov45_022389B0 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_0223DB8C + + arm_func_start ov45_0223DCD0 +ov45_0223DCD0: ; 0x0223DCD0 + ldr r1, [r0, #0x28] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + bx lr +_0223DCE0: ; jump table + b _0223DCF0 ; case 0 + b _0223DD14 ; case 1 + b _0223DD28 ; case 2 + bx lr ; case 3 +_0223DCF0: + ldr r1, [r0, #0x30] + cmp r1, #0 + ldrne r1, [r0, #0x34] + cmpne r1, #0 + movne r1, #1 + moveq r1, #0 + str r1, [r0, #0x28] + cmp r1, #0 + bxeq lr +_0223DD14: + ldr r1, [r0, #0x10] + cmp r1, #0 + movne r1, #2 + strne r1, [r0, #0x28] + bx lr +_0223DD28: + ldr r1, [r0, #0x38] + cmp r1, #0 + movne r1, #3 + strne r1, [r0, #0x28] + bx lr + arm_func_end ov45_0223DCD0 + + arm_func_start ov45_0223DD3C +ov45_0223DD3C: ; 0x0223DD3C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x34 + mov r6, r0 + mov r0, #0x3c + mov r5, r1 + bl ov45_02242394 + movs r4, r0 + beq _0223DDCC + ldr r1, _0223DE34 ; =ov45_02254FB0 + mov r0, #5 + str r1, [r4] + str r0, [r4, #4] + mov r2, #0 + str r2, [r4, #8] + str r2, [r4, #0xc] + add r0, sp, #0x24 + add r1, sp, #0x18 + str r2, [r4, #0x10] + bl ov00_021ECB94 + add r0, sp, #0x24 + add r1, sp, #0x18 + bl RTC_ConvertDateTimeToSecond + str r0, [r4, #8] + str r1, [r4, #0xc] + mov r1, #1 + str r1, [r4, #0x14] + mov r0, #0 + str r0, [r4, #0x18] + str r0, [r4, #0x1c] + str r0, [r4, #0x20] + str r1, [r4, #0x24] + str r0, [r4, #0x28] + str r5, [r4, #0x2c] + str r0, [r4, #0x30] + str r0, [r4, #0x34] + str r0, [r4, #0x38] +_0223DDCC: + add r0, sp, #4 + add r2, sp, #0x14 + add r1, r6, #4 + str r4, [sp, #0x14] + bl ov45_0223E648 + ldrb r0, [sp, #8] + mov r2, #0 + ldr r1, [sp, #4] + strb r2, [sp, #1] + str r1, [sp, #0xc] + strb r2, [sp] + strb r0, [sp, #0x10] + tst r0, #0xff + bne _0223DE28 + ldr r0, [sp, #0x14] + cmp r0, #0 + beq _0223DE1C + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_0223DE1C: + add sp, sp, #0x34 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, pc} +_0223DE28: + mov r0, #1 + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0223DE34: .word ov45_02254FB0 + arm_func_end ov45_0223DD3C + + arm_func_start ov45_0223DE38 +ov45_0223DE38: ; 0x0223DE38 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r4, r0 + ldr r0, [r4, #0xc] + add r6, r4, #8 + mov r7, r1 + str r0, [sp, #4] + cmp r0, r6 + beq _0223DEB8 + add r5, sp, #4 +_0223DE60: + ldr r0, [r0, #0xc] + ldr r1, [r0, #0x2c] + cmp r7, r1 + bne _0223DEA4 + cmp r0, #0 + beq _0223DE84 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_0223DE84: + add r1, sp, #4 + ldr r2, [r1] + add r0, sp, #0 + add r1, r4, #4 + bl ov45_0223E6E8 + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223DEA4: + mov r0, r5 + bl ov45_02236E58 + ldr r0, [sp, #4] + cmp r0, r6 + bne _0223DE60 +_0223DEB8: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223DE38 + + arm_func_start ov45_0223DEC4 +ov45_0223DEC4: ; 0x0223DEC4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r4, r1 + cmp r4, r0 + addeq sp, sp, #0x18 + addeq r0, r5, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r5, #0xc] + add r7, r5, #8 + str r4, [sp, #0xc] + str r4, [sp] + str r7, [sp, #0x10] + str r7, [sp, #4] + str r0, [sp, #0x14] + str r0, [sp, #8] + add r6, sp, #8 + b _0223DF18 +_0223DF10: + mov r0, r6 + bl ov45_02236E58 +_0223DF18: + ldr r1, [sp, #8] + cmp r1, r7 + ldrne r0, [r1, #0xc] + ldrne r0, [r0, #0x2c] + cmpne r4, r0 + bne _0223DF10 + add r0, r5, #8 + cmp r1, r0 + ldr r0, [sp, #8] + moveq r0, #0 + ldrne r0, [r0, #0xc] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223DEC4 + + arm_func_start ov45_0223DF4C +ov45_0223DF4C: ; 0x0223DF4C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r5, r0 + ldr r0, [r5, #0xc] + add r4, r5, #8 + str r0, [sp, #8] + cmp r0, r4 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r8, sp, #8 + add r7, sp, #0 + add r6, sp, #4 +_0223DF7C: + ldr r0, [r0, #0xc] + cmp r0, #0 + beq _0223DF94 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_0223DF94: + ldr r1, [sp, #8] + mov r0, r8 + str r1, [sp, #4] + bl ov45_02236E58 + ldr r2, [r6] + mov r0, r7 + add r1, r5, #4 + bl ov45_0223E6E8 + ldr r0, [sp, #8] + cmp r0, r4 + bne _0223DF7C + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov45_0223DF4C + + arm_func_start ov45_0223DFC8 +ov45_0223DFC8: ; 0x0223DFC8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r1, r0 + ldr r0, [r1, #4] + mov r2, #0 + add r0, r0, #1 + mov r4, r2 + cmp r0, #0x14 + bne _0223E008 + add r0, sp, #0 + bl ov45_0223E024 + ldr r0, [sp, #4] + mov r2, #1 + add r0, r0, #1 + cmp r0, #0x14 + moveq r4, r2 +_0223E008: + cmp r2, #0 + beq _0223E018 + add r0, sp, #0 + bl ov45_022376BC +_0223E018: + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223DFC8 + + arm_func_start ov45_0223E024 +ov45_0223E024: ; 0x0223E024 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + mov r2, #0 + mov r6, r0 + str r2, [r6] + str r2, [r6, #4] + mov r4, r1 + str r2, [r6, #8] + ldr r1, [r4, #4] + cmp r1, #0 + bls _0223E054 + bl ov45_0223E830 +_0223E054: + ldr r0, [r4, #0xc] + add r5, r4, #8 + str r0, [sp, #8] + cmp r0, r5 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + sub r8, sp, #4 + mov r4, #0 + add sb, sp, #4 + add r7, sp, #8 +_0223E07C: + ldr r1, [r0, #0xc] + ldr r0, [r1, #0x38] + cmp r0, #0 + beq _0223E0E4 + ldr r0, [r1, #0x2c] + str r0, [sp, #4] + strb r4, [sp] + ldr r1, [r6, #4] + ldr r0, [r6, #8] + cmp r1, r0 + bhs _0223E0C8 + mov r0, r1 + add r2, r0, #1 + str r2, [r6, #4] + ldr r0, [r6] + ldr r1, [sp, #4] + add r0, r0, r2, lsl #2 + str r1, [r0, #-4] + b _0223E0E4 +_0223E0C8: + strb r4, [sp, #1] + and r0, r4, #0xff + strb r0, [r8] + ldr r2, [r8] + mov r0, r6 + mov r1, sb + bl ov45_0223E910 +_0223E0E4: + mov r0, r7 + bl ov45_02236E58 + ldr r0, [sp, #8] + cmp r0, r5 + bne _0223E07C + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end ov45_0223E024 + + arm_func_start ov45_0223E100 +ov45_0223E100: ; 0x0223E100 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0xd4 + ldr ip, _0223E490 ; =ov45_02254FB0 + mov r6, r0 + mov sb, r1 + add r8, sp, #0x9c + mov r7, #0 + mov sl, #5 + add r0, sp, #0x78 + add r1, sp, #0x6c + mov r5, r2 + mov r4, r3 + str ip, [sp, #0x98] + str sl, [r8] + str r7, [r8, #4] + str r7, [r8, #8] + str r7, [r8, #0xc] + add r7, sp, #0x98 + bl ov00_021ECB94 + add r0, sp, #0x78 + add r1, sp, #0x6c + bl RTC_ConvertDateTimeToSecond + str sb, [r7, #0x2c] + stmib r8, {r0, r1} + mov r0, #1 + str r0, [r8, #0x10] + str r0, [r7, #0x24] + mov r0, #0 + str r0, [r7, #0x18] + str r0, [r7, #0x1c] + str r0, [r7, #0x20] + str r0, [r7, #0x28] + str r0, [r7, #0x30] + str r0, [r7, #0x34] + str r0, [r7, #0x38] + mov r1, r8 + add r0, r6, #0x14 + mov r2, #0x10 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _0223E1D8 + ldr r0, [r7, #4] + add r1, r7, #8 + str r0, [r6, #0x14] + add r0, r6, #0x18 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r7, #0x10] + mov r0, #1 + str r1, [r6, #0x20] + str r0, [r6, #0x24] +_0223E1D8: + ldr sb, [r6, #0x2c] + ldr r0, [r7, #0x1c] + mov r8, #0 + cmp sb, r0 + bne _0223E224 + cmp sb, #0 + beq _0223E220 + add r0, r6, #0x28 + bl ov45_02231C78 + mov sl, r0 + add r0, r7, #0x18 + bl ov45_02231C78 + mov r1, r0 + mov r0, sl + mov r2, sb + bl memcmp + cmp r0, #0 + bne _0223E224 +_0223E220: + mov r8, #1 +_0223E224: + cmp r8, #0 + bne _0223E268 + add r0, r6, #0x28 + add r1, r7, #0x18 + cmp r0, r1 + beq _0223E260 + mov r3, #0 + ldr r1, [r7, #0x18] + ldr r8, [r7, #0x1c] + strb r3, [sp, #0xd] + sub r2, sp, #4 + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r8 + bl ov45_02232760 +_0223E260: + mov r0, #1 + str r0, [r6, #0x34] +_0223E268: + ldr r1, [r7, #0x28] + add r0, sp, #0xb0 + str r1, [r6, #0x38] + ldr r1, [r7, #0x2c] + str r1, [r6, #0x3c] + ldr r1, [r7, #0x30] + str r1, [r6, #0x40] + ldr r1, [r7, #0x34] + str r1, [r6, #0x44] + ldr r1, [r7, #0x38] + str r1, [r6, #0x48] + bl ov45_022379D4 + mov r2, #0 + mov r3, #5 + add r0, sp, #0x5c + add r1, sp, #0x50 + str r3, [sp, #0x88] + str r2, [sp, #0x8c] + str r2, [sp, #0x90] + str r2, [sp, #0x94] + bl ov00_021ECB94 + add r0, sp, #0x5c + add r1, sp, #0x50 + bl RTC_ConvertDateTimeToSecond + str r1, [sp, #0x90] + ldr r1, [sp, #0x88] + str r0, [sp, #0x8c] + add r0, sp, #0x8c + str r1, [sp, #0x3c] + ldmia r0, {r2, r3} + add r1, sp, #0x40 + stmia r1, {r2, r3} + ldr r0, [sp, #0x94] + add r7, sp, #0x3c + str r0, [sp, #0x48] + mov r0, #1 + str r0, [sp, #0x4c] + add r0, r6, #0x14 + mov r1, r7 + mov r2, #0x10 + bl memcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _0223E348 + ldr r0, [r7] + add r1, r7, #4 + str r0, [r6, #0x14] + add r0, r6, #0x18 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldr r1, [r7, #0xc] + mov r0, #1 + str r1, [r6, #0x20] + str r0, [r6, #0x24] +_0223E348: + mov r1, #1 + str r1, [r6, #0x40] + mov r0, #0 + add r2, r5, r4 + str r0, [sp, #0x20] + str r0, [sp, #0x24] + str r0, [sp, #0x28] + strb r0, [sp, #9] + strb r0, [sp, #0xa] + strb r0, [sp, #8] + strb r0, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x1c] + str r2, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r0, sp, #0x20 + add r1, sp, #0x10 + str r5, [sp, #0x10] + str r2, [sp, #0x18] + ldmia r1, {r1, r2} + bl ov45_022327B8 + mov r2, #0 + ldrb r0, [sp, #0xc] + ldr r1, [sp, #0x20] + ldr r4, [sp, #0x24] + str r2, [sp, #0x2c] + str r2, [sp, #0x30] + str r2, [sp, #0x34] + sub r2, sp, #4 + strb r0, [r2] + add r5, sp, #0x2c + ldr r3, [r2] + mov r0, r5 + add r2, r1, r4 + bl ov45_022383E0 + mov r0, #1 + str r0, [r5, #0xc] + ldr r8, [r6, #0x2c] + ldr r0, [sp, #0x30] + mov r7, #0 + cmp r8, r0 + bne _0223E42C + cmp r8, #0 + beq _0223E428 + add r0, r6, #0x28 + bl ov45_02231C78 + mov r4, r0 + mov r0, r5 + bl ov45_02231C78 + mov r1, r0 + mov r0, r4 + mov r2, r8 + bl memcmp + cmp r0, #0 + bne _0223E42C +_0223E428: + mov r7, #1 +_0223E42C: + cmp r7, #0 + bne _0223E468 + add r0, r6, #0x28 + cmp r0, r5 + beq _0223E460 + mov r3, #0 + ldmia r5, {r1, r4} + strb r3, [sp, #0xb] + sub r2, sp, #4 + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r4 + bl ov45_02232760 +_0223E460: + mov r0, #1 + str r0, [r6, #0x34] +_0223E468: + add r0, sp, #0x2c + bl ov45_022379D4 + mov r1, #1 + add r0, sp, #0x20 + str r1, [r6, #0x44] + bl ov45_022379D4 + mov r0, #1 + str r0, [r6, #0x48] + add sp, sp, #0xd4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0223E490: .word ov45_02254FB0 + arm_func_end ov45_0223E100 + + arm_func_start ov45_0223E494 +ov45_0223E494: ; 0x0223E494 + ldr r0, [r0, #0x28] + cmp r0, #1 + movge r0, #1 + movlt r0, #0 + bx lr + arm_func_end ov45_0223E494 + + arm_func_start ov45_0223E4A8 +ov45_0223E4A8: ; 0x0223E4A8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x20 + ldr r1, _0223E554 ; =ov45_02255200 + mov r7, r0 + ldr r2, [r1, #8] + ldr r1, [r1, #4] + str r2, [sp, #4] + str r1, [sp] + ldr r0, [r7, #0xc] + add r5, r7, #8 + str r1, [sp, #0x10] + str r2, [sp, #0x14] + str r5, [sp, #0x18] + str r5, [sp, #8] + str r0, [sp, #0x1c] + str r0, [sp, #0xc] + add r6, sp, #0 + add r4, sp, #0xc + b _0223E4FC +_0223E4F4: + mov r0, r4 + bl ov45_02236E58 +_0223E4FC: + ldr r0, [sp, #0xc] + cmp r0, r5 + beq _0223E538 + ldr r1, [sp, #4] + ldr r0, [r0, #0xc] + tst r1, #1 + add r0, r0, r1, asr #1 + ldreq r1, [r6] + beq _0223E52C + ldr r2, [r0] + ldr r1, [r6] + ldr r1, [r2, r1] +_0223E52C: + blx r1 + cmp r0, #0 + bne _0223E4F4 +_0223E538: + ldr r1, [sp, #0xc] + add r0, r7, #8 + cmp r1, r0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223E554: .word ov45_02255200 + arm_func_end ov45_0223E4A8 + + arm_func_start ov45_0223E558 +ov45_0223E558: ; 0x0223E558 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + ldr r1, [r0, #0xc] + add sb, r0, #8 + str r1, [sp] + cmp r1, sb + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r6, #0 + add fp, sp, #4 + add sl, sp, #0x10 +_0223E584: + ldr r0, [r1, #0xc] + bl ov45_0223DCD0 + ldr r0, [sp] + ldr r3, [r0, #0xc] + ldr r0, [r3, #0x28] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0223E62C +_0223E5A4: ; jump table + b _0223E62C ; case 0 + b _0223E62C ; case 1 + b _0223E5B4 ; case 2 + b _0223E62C ; case 3 +_0223E5B4: + str r6, [r3, #0x14] + ldr r0, [sp] + ldr r5, [r0, #0xc] + str r6, [r5, #0x24] + ldr r2, [r3, #4] + ldr r1, [r3, #8] + ldr r0, [r3, #0xc] + str r2, [sp, #0xc] + str r1, [sp, #4] + str r0, [sp, #8] + ldmia fp, {r0, r1, r2} + stmia sl, {r0, r1, r2} + ldr r0, [sp] + ldr r7, [r5, #0x1c] + ldr r0, [r0, #0xc] + ldr r8, [r0, #0x2c] + bl ov45_022310B0 + mov r4, r0 + add r0, r5, #0x18 + bl ov45_02231C78 + mov r2, r0 + ldr r4, [r4, #0xc] + mov r3, r7 + mov r0, r8 + mov r1, sl + blx r4 + ldr r0, [sp] + ldr r1, [r0, #0xc] + mov r0, #1 + str r0, [r1, #0x38] +_0223E62C: + add r0, sp, #0 + bl ov45_02236E58 + ldr r1, [sp] + cmp r1, sb + bne _0223E584 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223E558 + + arm_func_start ov45_0223E648 +ov45_0223E648: ; 0x0223E648 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r4, r2 + mov r5, r1 + mov r6, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r5 + mov r1, r4 + str ip, [sp] + bl ov45_0223E940 + ldr r3, [sp, #8] + mov r1, r0 + cmp r3, #0 + beq _0223E6A0 + ldr r2, [r3, #0xc] + ldr r0, [r4] + ldr r2, [r2, #0x2c] + ldr r0, [r0, #0x2c] + cmp r2, r0 + bge _0223E6CC +_0223E6A0: + str r4, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r5 + bl ov45_0223E758 + ldr r1, _0223E6E4 ; =ov45_02255200 + str r0, [r6] + ldrb r0, [r1] + add sp, sp, #0xc + strb r0, [r6, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_0223E6CC: + ldr r0, _0223E6E4 ; =ov45_02255200 + str r3, [r6] + ldrb r0, [r0, #1] + strb r0, [r6, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0223E6E4: .word ov45_02255200 + arm_func_end ov45_0223E648 + + arm_func_start ov45_0223E6E8 +ov45_0223E6E8: ; 0x0223E6E8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #8] + mov r6, r0 + cmp r4, r1 + bne _0223E718 + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #8] +_0223E718: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + cmp r4, #0 + beq _0223E740 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_0223E740: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0223E6E8 + + arm_func_start ov45_0223E758 +ov45_0223E758: ; 0x0223E758 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + mov r8, r0 + ldr r4, [r8] + mvn r0, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp r4, r0 + bne _0223E78C + ldr r0, _0223E82C ; =ov45_0225520C + bl printf + bl abort +_0223E78C: + mov r1, #0 + mov r0, #0x10 + strb r1, [sp] + bl ov45_02242394 + mov r4, r0 + add r0, r8, #4 + str r0, [sp, #0xc] + adds r1, r4, #0xc + ldrne r0, [sp, #0x30] + str r4, [sp, #0x10] + ldrne r0, [r0] + str r4, [sp, #4] + strne r0, [r1] + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r7, [r0] + cmp r6, #0 + strne r4, [r7] + streq r4, [r7, #4] + ldr r1, [r8] + mov r0, r4 + add r1, r1, #1 + str r1, [r8] + ldr r1, [r8, #4] + str r4, [sp, #8] + bl ov45_02236EC4 + cmp r5, #0 + ldr r1, [sp, #0x10] + strne r4, [r8, #8] + cmp r1, #0 + beq _0223E820 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_0223E820: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0223E82C: .word ov45_0225520C + arm_func_end ov45_0223E758 + + arm_func_start ov45_0223E830 +ov45_0223E830: ; 0x0223E830 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r2, #0 + mov r5, r0 + str r2, [sp, #4] + str r2, [sp, #8] + str r2, [sp, #0xc] + strb r2, [sp, #2] + sub r0, sp, #4 + strb r2, [r0] + ldr r2, [r0] + add r0, sp, #4 + bl ov45_0223EA04 + ldr r4, [r5] + ldr r0, [r5, #4] + mov ip, #0 + add r0, r4, r0, lsl #2 + sub r1, r0, r4 + mov r0, r1, asr #1 + add r6, r1, r0, lsr #30 + mov r0, r6, asr #2 + mov r7, r0, lsl #2 + ldr r3, [sp, #4] + ldr r0, [sp, #8] + mov r1, r4 + mov r2, r7 + add r0, r3, r0, lsl #2 + strb ip, [sp, #1] + bl memcpy + mov r0, r4 + mov r2, r7 + mov r1, #0 + bl memset + ldr r1, [sp, #8] + mov r0, #0 + add r1, r1, r6, asr #2 + str r1, [sp, #8] + strb r0, [sp] + str r0, [r5, #4] + add r3, sp, #0xc + ldr r2, [r5, #8] + ldr r1, [r3] + add r0, sp, #4 + str r1, [r5, #8] + str r2, [r3] + ldr r2, [r5] + ldr r1, [sp, #4] + str r1, [r5] + str r2, [sp, #4] + ldr r2, [r5, #4] + ldr r1, [sp, #8] + str r1, [r5, #4] + str r2, [sp, #8] + bl ov45_0223E9B4 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223E830 + + arm_func_start ov45_0223E910 +ov45_0223E910: ; 0x0223E910 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r2, #0 + mov r5, r0 + mov r1, #1 + strb r2, [sp] + bl ov45_0223EA34 + mov r0, r5 + mov r2, r4 + mov r1, #1 + bl ov45_0223EB00 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223E910 + + arm_func_start ov45_0223E940 +ov45_0223E940: ; 0x0223E940 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_0223E974: + ldr r4, [r1] + ldr r0, [r6, #0xc] + ldr r5, [r4, #0x2c] + ldr r4, [r0, #0x2c] + mov r0, r6 + cmp r5, r4 + ldrlt r6, [r6] + strltb lr, [r3] + blt _0223E9A8 + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_0223E9A8: + cmp r6, #0 + bne _0223E974 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223E940 + + arm_func_start ov45_0223E9B4 +ov45_0223E9B4: ; 0x0223E9B4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _0223E9F8 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _0223E9F8 + mov r2, r0 + bl ov00_021EC2EC +_0223E9F8: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223E9B4 + + arm_func_start ov45_0223EA04 +ov45_0223EA04: ; 0x0223EA04 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mvn r1, #0xc0000000 + mov r5, r0 + cmp r4, r1 + bls _0223EA20 + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223EA20: + mov r0, r4, lsl #2 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223EA04 + + arm_func_start ov45_0223EA34 +ov45_0223EA34: ; 0x0223EA34 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, [r0, #8] + mvn r0, #0xc0000000 + ldr r1, [sp, #0x14] + sub r0, r0, r4 + cmp r1, r0 + bls _0223EA5C + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223EA5C: + ldr r0, _0223EAF8 ; =0x15555555 + cmp r4, r0 + bhs _0223EAA8 + add r1, r4, #1 + ldr r0, _0223EAFC ; =0xCCCCCCCD + add r1, r1, r1, lsl #1 + umull r0, r2, r1, r0 + mov r2, r2, lsr #2 + ldr r0, [sp, #0x14] + str r2, [sp, #4] + cmp r0, r2 + addhi r0, sp, #0x14 + addls r0, sp, #4 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223EAA8: + cmp r4, r0, lsl #1 + bhs _0223EAE4 + ldr r0, [sp, #0x14] + add r1, r4, #1 + mov r2, r1, lsr #1 + cmp r0, r1, lsr #1 + addhi r0, sp, #0x14 + str r2, [sp] + addls r0, sp, #0 + ldr r0, [r0] + add sp, sp, #8 + add r0, r4, r0 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_0223EAE4: + mvn r0, #0xc0000000 + add sp, sp, #8 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_0223EAF8: .word 0x15555555 +_0223EAFC: .word 0xCCCCCCCD + arm_func_end ov45_0223EA34 + + arm_func_start ov45_0223EB00 +ov45_0223EB00: ; 0x0223EB00 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + mov r4, #0 + mov r6, r0 + add r3, r6, #8 + str r4, [sp, #8] + str r4, [sp, #0xc] + str r4, [sp, #0x10] + str r4, [sp, #0x18] + str r3, [sp, #0x14] + mov r5, r1 + ldr r3, [r6, #4] + ldr r1, [r6, #8] + add r3, r3, r5 + sub r1, r3, r1 + mov r4, r2 + bl ov45_0223EA34 + mov r3, #0 + mov r1, r0 + strb r3, [sp, #3] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + add r0, sp, #8 + strb r3, [sp, #4] + bl ov45_0223EC80 + ldr r3, [r6, #4] + ldr r1, [sp, #8] + mov r2, #0 + ldr r0, [sp, #0xc] + add r1, r1, r3, lsl #2 + mov ip, r5 + str r3, [sp, #0x18] + strb r2, [sp, #2] + cmp r5, #0 + add r1, r1, r0, lsl #2 + beq _0223EBA4 +_0223EB94: + ldr r0, [r4] + subs ip, ip, #1 + str r0, [r1], #4 + bne _0223EB94 +_0223EBA4: + ldr r0, [sp, #0xc] + ldr r1, [sp, #0x18] + add r0, r0, r5 + str r0, [sp, #0xc] + ldr r4, [r6] + ldr r0, [r6, #4] + mov ip, #0 + add r0, r4, r0, lsl #2 + sub r2, r0, r4 + mov r0, r2, asr #1 + add r5, r2, r0, lsr #30 + sub r3, r1, r5, asr #2 + mov r2, r5, asr #2 + ldr r0, [sp, #8] + mov r7, r2, lsl #2 + mov r1, r4 + mov r2, r7 + add r0, r0, r3, lsl #2 + strb ip, [sp, #1] + str r3, [sp, #0x18] + bl memcpy + mov r0, r4 + mov r2, r7 + mov r1, #0 + bl memset + ldr r1, [sp, #0xc] + mov r0, #0 + add r1, r1, r5, asr #2 + str r1, [sp, #0xc] + strb r0, [sp] + str r0, [r6, #4] + add r3, sp, #0x10 + ldr r2, [r6, #8] + ldr r1, [r3] + add r0, sp, #8 + str r1, [r6, #8] + str r2, [r3] + ldr r2, [r6] + ldr r1, [sp, #8] + str r1, [r6] + str r2, [sp, #8] + ldr r2, [r6, #4] + ldr r1, [sp, #0xc] + str r1, [r6, #4] + str r2, [sp, #0xc] + bl ov45_0223EC64 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov45_0223EB00 + + arm_func_start ov45_0223EC64 +ov45_0223EC64: ; 0x0223EC64 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, #0 + str r1, [r4, #4] + bl ov45_0223ECB0 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_0223EC64 + + arm_func_start ov45_0223EC80 +ov45_0223EC80: ; 0x0223EC80 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mvn r1, #0xc0000000 + mov r5, r0 + cmp r4, r1 + bls _0223EC9C + bl _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_0223EC9C: + mov r0, r4, lsl #2 + bl ov45_02242394 + str r0, [r5] + str r4, [r5, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0223EC80 + + arm_func_start ov45_0223ECB0 +ov45_0223ECB0: ; 0x0223ECB0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _0223ECF4 + ldr r2, [r4, #4] + mov r0, #0 + strb r0, [sp] + ldr r1, [r4, #4] + sub r1, r1, r2 + str r1, [r4, #4] + ldr r1, [r4] + cmp r1, #0 + beq _0223ECF4 + mov r2, r0 + bl ov00_021EC2EC +_0223ECF4: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0223ECB0 + + arm_func_start ov45_0223ED00 +ov45_0223ED00: ; 0x0223ED00 + ldr r0, _0223ED18 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #4] + cmpne r0, #5 + bx lr + .balign 4, 0 +_0223ED18: .word ov45_022577DC + arm_func_end ov45_0223ED00 + + arm_func_start ov45_0223ED1C +ov45_0223ED1C: ; 0x0223ED1C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _0223EDD4 ; =ov45_022577DC + ldr r3, [r0] + cmp r3, #0 + beq _0223ED44 + ldr r0, [r3, #4] + cmp r0, #5 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} +_0223ED44: + mov r2, #0 + add r1, sp, #0 + add r0, r3, #0x9c + str r2, [sp] + bl ov45_02232D8C + ldr r0, _0223EDD4 ; =ov45_022577DC + ldr r4, [r0] + ldr r1, [r4, #4] + cmp r1, #4 + bne _0223EDB0 + cmp r4, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + beq _0223ED9C + mov r0, r4 + bl ov45_02242858 + cmp r4, #0 + beq _0223ED9C + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_0223ED9C: + ldr r0, _0223EDD4 ; =ov45_022577DC + mov r1, #0 + str r1, [r0] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0223EDB0: + mov r1, #3 + str r1, [r4, #0x58] + mov r1, #5 + str r1, [r4, #4] + ldr r0, [r0] + mov r1, #1 + str r1, [r0, #0x60] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0223EDD4: .word ov45_022577DC + arm_func_end ov45_0223ED1C + + arm_func_start ov45_0223EDD8 +ov45_0223EDD8: ; 0x0223EDD8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x78 + ldr r0, _0223EFF0 ; =ov45_022577DC + mov r4, r1 + ldr r0, [r0] + mov r5, r2 + mov r7, r3 + cmp r0, #0 + beq _0223EE0C + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x78 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0223EE0C: + ldr r6, _0223EFF4 ; =ov45_022552C0 + add r0, sp, #0x18 + mov r1, r4 + bl ov45_02237B58 + add r0, sp, #0x24 + mov r1, r6 + bl ov45_02237B58 + add r0, sp, #0x18 + add r1, sp, #0x24 + mov r2, #6 + bl ov45_0223D644 + mov r6, r0 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0x18 + bl ov45_02237BC8 + cmp r6, #0 + bne _0223EF78 + ldr r4, _0223EFF8 ; =ov45_022552C8 + add r0, sp, #0 + mov r1, r5 + bl ov45_02237B58 + add r0, sp, #0xc + mov r1, r4 + bl ov45_02237B58 + add r0, sp, #0 + add r1, sp, #0xc + mov r2, #0xc + bl ov45_0223D644 + mov r4, r0 + add r0, sp, #0xc + bl ov45_02237BC8 + add r0, sp, #0 + bl ov45_02237BC8 + cmp r4, #0 + addne sp, sp, #0x78 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0x60 + mov r1, r5 + bl ov45_02237B58 + ldr r1, _0223EFFC ; =ov45_022552D8 + add r0, sp, #0x54 + bl ov45_02237B58 + add r0, sp, #0x6c + add r1, sp, #0x60 + add r2, sp, #0x54 + mov r3, #0 + bl ov45_0223F000 + add r0, sp, #0x54 + bl ov45_02237BC8 + add r0, sp, #0x60 + bl ov45_02237BC8 + ldr r0, [sp, #0x70] + cmp r0, #0 + bne _0223EEF8 + add r0, sp, #0x6c + bl ov45_02237664 + add sp, sp, #0x78 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223EEF8: + ldr r1, [sp, #0x70] + mov r0, #0xc + sub r1, r1, #1 + mul r2, r1, r0 + ldr r1, [sp, #0x6c] + ldr r0, [r1, r2] + add r1, r1, r2 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #1 + ldrne r0, [r1, #8] + bl atoi + movs r4, r0 + bne _0223EF40 + add r0, sp, #0x6c + bl ov45_02237664 + add sp, sp, #0x78 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223EF40: + ldr r0, _0223EFF0 ; =ov45_022577DC + add r3, sp, #0x48 + ldr r0, [r0] + add r0, r0, #0x64 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r1, [sp, #0x90] + ldr r2, [sp, #0x4c] + mov r0, r4 + blx r2 + add r0, sp, #0x6c + bl ov45_02237664 + add sp, sp, #0x78 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223EF78: + cmp r7, #3 + addne sp, sp, #0x78 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0x3c + mov r1, r4 + bl ov45_02237B58 + ldr r0, _0223EFF0 ; =ov45_022577DC + add r1, sp, #0x3c + ldr r0, [r0] + bl ov45_022435F8 + mov r4, r0 + add r0, sp, #0x3c + bl ov45_02237BC8 + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #0x78 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _0223EFF0 ; =ov45_022577DC + add r3, sp, #0x30 + ldr r0, [r0] + add r0, r0, #0x64 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r2, [sp, #0x90] + ldr r3, [sp, #0x30] + mov r0, r4 + mov r1, r5 + blx r3 + add sp, sp, #0x78 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223EFF0: .word ov45_022577DC +_0223EFF4: .word ov45_022552C0 +_0223EFF8: .word ov45_022552C8 +_0223EFFC: .word ov45_022552D8 + arm_func_end ov45_0223EDD8 + + arm_func_start ov45_0223F000 +ov45_0223F000: ; 0x0223F000 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + mov sl, r0 + mov r4, #0 + str r4, [sl] + str r4, [sl, #4] + add r0, sp, #0x24 + str r2, [sp] + str r3, [sp, #4] + str r4, [sl, #8] + mov r8, #1 + bl ov45_02237A24 + sub r5, sp, #4 + add r6, sp, #0x24 + add r7, sp, #0x18 + add fp, sp, #0xc + mvn r4, #0 + b _0223F104 +_0223F048: + cmp sb, #0 + beq _0223F0DC + mov r0, r7 + mov r1, r6 + mov r2, #0 + mov r3, sb + bl ov45_02236680 + mov r1, #0 + add r0, sp, #0xb + strb r1, [r0] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _0223F0AC + mov r0, #0xc + mul r0, r1, r0 + ldr r1, [sl] + adds r0, r1, r0 + beq _0223F09C + mov r1, r7 + bl ov45_02237A24 +_0223F09C: + ldr r0, [sl, #4] + add r0, r0, #1 + str r0, [sl, #4] + b _0223F0D0 +_0223F0AC: + mov r0, #0 + mov r2, #0 + strb r0, [sp, #0xa] + mov r2, r2 + strb r2, [r5] + ldr r2, [r5] + mov r0, sl + mov r1, r7 + bl ov45_02237634 +_0223F0D0: + mov r0, r7 + bl ov45_02237BC8 + add r8, r8, #1 +_0223F0DC: + add r2, sb, #1 + mov r0, fp + mov r1, r6 + mov r3, r4 + bl ov45_02236680 + mov r0, r6 + mov r1, fp + bl ov45_02237D48 + mov r0, fp + bl ov45_02237BC8 +_0223F104: + ldr r0, [sp, #4] + cmp r8, r0 + beq _0223F12C + ldr r1, [sp] + mov r0, r6 + mov r2, #0 + bl ov45_02242254 + mov sb, r0 + cmp sb, r4 + bne _0223F048 +_0223F12C: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r0, [sp, #0x28] + bne _0223F14C + ldrb r0, [sp, #0x24] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x19 +_0223F14C: + cmp r0, #0 + beq _0223F1B8 + mov r2, #0 + strb r2, [sp, #9] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _0223F198 + mov r0, #0xc + mul r0, r1, r0 + ldr r1, [sl] + adds r0, r1, r0 + beq _0223F188 + add r1, sp, #0x24 + bl ov45_02237A24 +_0223F188: + ldr r0, [sl, #4] + add r0, r0, #1 + str r0, [sl, #4] + b _0223F1B8 +_0223F198: + strb r2, [sp, #8] + sub r1, sp, #4 + and r0, r2, #0xff + strb r0, [r1] + ldr r2, [r1] + add r1, sp, #0x24 + mov r0, sl + bl ov45_02237634 +_0223F1B8: + add r0, sp, #0x24 + bl ov45_02237BC8 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_0223F000 + + arm_func_start ov45_0223F1C8 +ov45_0223F1C8: ; 0x0223F1C8 + ldr r0, _0223F1E0 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #4] + cmpne r0, #5 + bx lr + .balign 4, 0 +_0223F1E0: .word ov45_022577DC + arm_func_end ov45_0223F1C8 + + arm_func_start ov45_0223F1E4 +ov45_0223F1E4: ; 0x0223F1E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + ldr r0, _0223F2D4 ; =ov45_022577DC + mov r7, r1 + ldr r0, [r0] + mov r6, r3 + cmp r0, #0 + beq _0223F214 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x30 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0223F214: + ldr r0, [sp, #0x48] + cmp r0, #3 + addne sp, sp, #0x30 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0x24 + mov r1, r2 + bl ov45_02237B58 + ldr r0, _0223F2D4 ; =ov45_022577DC + add r1, sp, #0x24 + ldr r0, [r0] + bl ov45_022435F8 + mov r4, r0 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0x18 + mov r1, r7 + bl ov45_02237B58 + ldr r0, _0223F2D4 ; =ov45_022577DC + add r1, sp, #0x18 + ldr r0, [r0] + bl ov45_02242C3C + mov r5, r0 + add r0, sp, #0x18 + bl ov45_02237BC8 + mov r1, r7 + add r0, sp, #0xc + bl ov45_02237B58 + ldr r1, _0223F2D4 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428D8 + ldr r0, [sp] + ldr r3, [r5, #0x14] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + ldr r5, [r5, #8] + mov r1, r4 + mov r2, r6 + blx r5 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223F2D4: .word ov45_022577DC + arm_func_end ov45_0223F1E4 + + arm_func_start ov45_0223F2D8 +ov45_0223F2D8: ; 0x0223F2D8 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _0223F328 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + beq _0223F300 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0xc + ldmeqia sp!, {pc} +_0223F300: + add r0, sp, #0 + bl ov45_02237B58 + ldr r0, _0223F328 ; =ov45_022577DC + add r1, sp, #0 + ldr r0, [r0] + bl ov45_0224335C + add r0, sp, #0 + bl ov45_02237BC8 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0223F328: .word ov45_022577DC + arm_func_end ov45_0223F2D8 + + arm_func_start ov45_0223F32C +ov45_0223F32C: ; 0x0223F32C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0xa8 + ldr r0, _0223F5C4 ; =ov45_022577DC + mov r5, r1 + ldr r0, [r0] + mov r4, r2 + cmp r0, #0 + beq _0223F35C + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0xa8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0223F35C: + add r0, sp, #0x90 + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x90 + ldr r0, [r0] + bl ov45_02243808 + mov r6, r0 + add r0, sp, #0x90 + bl ov45_02237BC8 + cmp r6, #0 + beq _0223F3AC + ldr r0, _0223F5C4 ; =ov45_022577DC + mov r1, r5 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_02250F5C + cmp r0, r6 + addgt sp, sp, #0xa8 + ldmgtia sp!, {r3, r4, r5, r6, r7, pc} +_0223F3AC: + add r0, sp, #0x84 + mov r1, r4 + bl ov45_02237B58 + add r0, sp, #0x84 + bl ov45_02242A2C + ldr r1, _0223F5C4 ; =ov45_022577DC + mov r2, r0 + ldr r1, [r1] + add r0, sp, #0x9c + bl ov45_0224367C + add r0, sp, #0x84 + bl ov45_02237BC8 + add r0, sp, #0x78 + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x9c + ldr r0, [r0] + add r2, sp, #0x78 + bl ov45_02243280 + mov r6, r0 + add r0, sp, #0x78 + bl ov45_02237BC8 + cmp r6, #0 + beq _0223F4AC + add r0, sp, #0x6c + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x6c + ldr r0, [r0] + bl ov45_02242C3C + mov r6, r0 + add r0, sp, #0x6c + bl ov45_02237BC8 + add r0, sp, #0x60 + mov r1, r5 + bl ov45_02237B58 + ldr r1, _0223F5C4 ; =ov45_022577DC + add r0, sp, #0x54 + ldr r1, [r1] + add r2, sp, #0x60 + bl ov45_022428D8 + add r0, sp, #0x48 + mov r1, r4 + bl ov45_02237B58 + ldr r1, [sp, #0x54] + add r0, sp, #0x48 + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + addeq r7, sp, #0x55 + ldrne r7, [sp, #0x5c] + bl ov45_02242A2C + mov r1, r0 + ldr r2, [r6, #0x14] + ldr r3, [r6, #4] + mov r0, r7 + blx r3 + add r0, sp, #0x48 + bl ov45_02237BC8 + add r0, sp, #0x54 + bl ov45_02237BC8 + add r0, sp, #0x60 + bl ov45_02237BC8 +_0223F4AC: + add r0, sp, #0x3c + mov r1, r4 + bl ov45_02237B58 + add r0, sp, #0x30 + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x3c + ldr r0, [r0] + add r2, sp, #0x30 + bl ov45_02242D30 + mov r4, r0 + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x3c + bl ov45_02237BC8 + mvn r0, #0 + cmp r4, r0 + bne _0223F508 + add r0, sp, #0x9c + bl ov45_02237BC8 + add sp, sp, #0xa8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0223F508: + add r0, sp, #0x24 + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x24 + ldr r0, [r0] + bl ov45_02243794 + mov r6, r0 + add r0, sp, #0x24 + bl ov45_02237BC8 + cmp r6, #0 + beq _0223F5B4 + add r0, sp, #0x18 + mov r1, r5 + bl ov45_02237B58 + ldr r0, _0223F5C4 ; =ov45_022577DC + add r1, sp, #0x18 + ldr r0, [r0] + bl ov45_02242C3C + mov r6, r0 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0xc + mov r1, r5 + bl ov45_02237B58 + ldr r1, _0223F5C4 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428D8 + ldr r0, [sp] + ldr r2, [r6, #0x14] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + ldr r3, [r6] + mov r1, r4 + blx r3 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 +_0223F5B4: + add r0, sp, #0x9c + bl ov45_02237BC8 + add sp, sp, #0xa8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223F5C4: .word ov45_022577DC + arm_func_end ov45_0223F32C + + arm_func_start ov45_0223F5C8 +ov45_0223F5C8: ; 0x0223F5C8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x48 + ldr r0, _0223F6F0 ; =ov45_022577DC + mov r7, r1 + ldr r0, [r0] + mov r6, r2 + cmp r0, #0 + beq _0223F5F8 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x48 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0223F5F8: + add r0, sp, #0x3c + mov r1, r6 + bl ov45_02237B58 + ldr r0, _0223F6F0 ; =ov45_022577DC + add r1, sp, #0x3c + ldr r0, [r0] + bl ov45_022435F8 + mov r4, r0 + add r0, sp, #0x3c + bl ov45_02237BC8 + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #0x48 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, sp, #0x30 + mov r1, r7 + bl ov45_02237B58 + ldr r0, _0223F6F0 ; =ov45_022577DC + add r1, sp, #0x30 + ldr r0, [r0] + bl ov45_02242C3C + mov r5, r0 + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x24 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _0223F6F0 ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + add r2, sp, #0x24 + bl ov45_022428D8 + ldr r0, [sp, #0x18] + ldr r2, [r5, #0x14] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x19 + ldrne r0, [sp, #0x20] + ldr r3, [r5, #4] + mov r1, r4 + blx r3 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0xc + mov r1, r6 + bl ov45_02237B58 + add r0, sp, #0 + mov r1, r7 + bl ov45_02237B58 + ldr r0, _0223F6F0 ; =ov45_022577DC + add r1, sp, #0xc + ldr r0, [r0] + add r2, sp, #0 + bl ov45_02243280 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0223F6F0: .word ov45_022577DC + arm_func_end ov45_0223F5C8 + + arm_func_start ov45_0223F6F4 +ov45_0223F6F4: ; 0x0223F6F4 + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + ldr r0, _0223F764 ; =ov45_022577DC + mov r4, r3 + ldr r0, [r0] + cmp r0, #0 + beq _0223F720 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x18 + ldmeqia sp!, {r4, pc} +_0223F720: + add r0, sp, #0xc + mov r1, r2 + bl ov45_02237B58 + add r0, sp, #0 + mov r1, r4 + bl ov45_02237B58 + ldr r0, _0223F764 ; =ov45_022577DC + add r1, sp, #0xc + ldr r0, [r0] + add r2, sp, #0 + bl ov45_022436E0 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223F764: .word ov45_022577DC + arm_func_end ov45_0223F6F4 + + arm_func_start ov45_0223F768 +ov45_0223F768: ; 0x0223F768 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _0223F824 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + beq _0223F790 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0xc + ldmeqia sp!, {pc} +_0223F790: + mov r2, #0 + add r1, sp, #0 + mov r0, r2 +_0223F79C: + str r0, [r1, r2, lsl #2] + add r2, r2, #1 + cmp r2, #3 + blo _0223F79C + cmp r3, #3 + addls pc, pc, r3, lsl #2 + b _0223F808 +_0223F7B8: ; jump table + b _0223F7C8 ; case 0 + b _0223F7D8 ; case 1 + b _0223F7E8 ; case 2 + b _0223F7F8 ; case 3 +_0223F7C8: + ldr r1, _0223F828 ; =ov45_022552DC + add r0, sp, #0 + bl ov45_0223DAD4 + b _0223F814 +_0223F7D8: + ldr r1, _0223F82C ; =ov45_022552E4 + add r0, sp, #0 + bl ov45_0223DAD4 + b _0223F814 +_0223F7E8: + ldr r1, _0223F830 ; =ov45_022552EC + add r0, sp, #0 + bl ov45_0223DAD4 + b _0223F814 +_0223F7F8: + ldr r1, _0223F834 ; =ov45_022552F0 + add r0, sp, #0 + bl ov45_0223DAD4 + b _0223F814 +_0223F808: + ldr r1, _0223F838 ; =ov45_022552FC + add r0, sp, #0 + bl ov45_0223DAD4 +_0223F814: + add r0, sp, #0 + bl ov45_02237BC8 + add sp, sp, #0xc + ldmia sp!, {pc} + .balign 4, 0 +_0223F824: .word ov45_022577DC +_0223F828: .word ov45_022552DC +_0223F82C: .word ov45_022552E4 +_0223F830: .word ov45_022552EC +_0223F834: .word ov45_022552F0 +_0223F838: .word ov45_022552FC + arm_func_end ov45_0223F768 + + arm_func_start ov45_0223F83C +ov45_0223F83C: ; 0x0223F83C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x24 + ldr r0, _0223F8F0 ; =ov45_022577DC + mov r6, r1 + ldr r0, [r0] + mov r4, r2 + cmp r0, #0 + beq _0223F86C + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x24 + ldmeqia sp!, {r3, r4, r5, r6, pc} +_0223F86C: + add r0, sp, #0x18 + mov r1, r6 + bl ov45_02237B58 + ldr r0, _0223F8F0 ; =ov45_022577DC + add r1, sp, #0x18 + ldr r0, [r0] + bl ov45_02242C3C + mov r5, r0 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0xc + mov r1, r6 + bl ov45_02237B58 + ldr r1, _0223F8F0 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428D8 + ldr r0, [sp] + ldr r2, [r5, #0x14] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #1 + ldrne r0, [sp, #8] + ldr r3, [r5, #0x10] + mov r1, r4 + blx r3 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0223F8F0: .word ov45_022577DC + arm_func_end ov45_0223F83C + + arm_func_start ov45_0223F8F4 +ov45_0223F8F4: ; 0x0223F8F4 + ldr r0, _0223F90C ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #4] + cmpne r0, #5 + bx lr + .balign 4, 0 +_0223F90C: .word ov45_022577DC + arm_func_end ov45_0223F8F4 + + arm_func_start ov45_0223F910 +ov45_0223F910: ; 0x0223F910 + ldr r0, _0223F928 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #4] + cmpne r0, #5 + bx lr + .balign 4, 0 +_0223F928: .word ov45_022577DC + arm_func_end ov45_0223F910 + + arm_func_start ov45_0223F92C +ov45_0223F92C: ; 0x0223F92C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _0223F9C0 ; =ov45_022577DC + mov r4, r1 + ldr r3, [r0] + cmp r3, #0 + beq _0223F958 + ldr r0, [r3, #4] + cmp r0, #5 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} +_0223F958: + mov r2, #0 + add r1, sp, #0 + add r0, r3, #0x9c + str r2, [sp] + bl ov45_02232D8C + cmp r4, #0 + bne _0223F9A0 + ldr r0, _0223F9C0 ; =ov45_022577DC + mov r2, #3 + ldr r3, [r0] + mov r1, #5 + str r2, [r3, #0x58] + str r1, [r3, #4] + ldr r0, [r0] + mov r1, #1 + str r1, [r0, #0x60] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0223F9A0: + ldr r0, _0223F9C0 ; =ov45_022577DC + ldr r1, [r0] + ldr r0, [r1, #4] + cmp r0, #5 + movne r0, #2 + strne r0, [r1, #4] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0223F9C0: .word ov45_022577DC + arm_func_end ov45_0223F92C + + arm_func_start ov45_0223F9C4 +ov45_0223F9C4: ; 0x0223F9C4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r0, _0223FA28 ; =ov45_022577DC + mov r4, r2 + ldr r1, [r0] + cmp r1, #0 + beq _0223F9F0 + ldr r0, [r1, #4] + cmp r0, #5 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, pc} +_0223F9F0: + add r0, sp, #0 + bl ov45_0223FA2C + ldr r0, [sp] + mov r2, #0x7f + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #1 + ldrne r1, [sp, #8] + mov r0, r4 + bl strncpy + add r0, sp, #0 + bl ov45_02237BC8 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0223FA28: .word ov45_022577DC + arm_func_end ov45_0223F9C4 + + arm_func_start ov45_0223FA2C +ov45_0223FA2C: ; 0x0223FA2C + ldr ip, _0223FA38 ; =ov45_02237A24 + add r1, r1, #0x18 + bx ip + .balign 4, 0 +_0223FA38: .word ov45_02237A24 + arm_func_end ov45_0223FA2C + + arm_func_start ov45_0223FA3C +ov45_0223FA3C: ; 0x0223FA3C + stmdb sp!, {r4, lr} + sub sp, sp, #0x60 + ldr r2, _0223FC54 ; =ov45_022577DC + mov r4, r0 + ldr r0, [r2] + cmp r0, #0 + beq _0223FA68 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x60 + ldmeqia sp!, {r4, pc} +_0223FA68: + cmp r1, #1 + bne _0223FADC + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x54 + ldr r1, [r1] + ldr r1, [r1, #8] + bl ov45_022429E0 + ldr r0, _0223FC54 ; =ov45_022577DC + add r1, sp, #0x54 + ldr r0, [r0] + add r0, r0, #0xc + bl ov45_02237D48 + add r0, sp, #0x54 + bl ov45_02237BC8 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x48 + ldr r1, [r1] + bl ov45_0223FC5C + ldr r0, [sp, #0x48] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x49 + ldrne r1, [sp, #0x50] + mov r0, r4 + bl ov45_0225035C + add r0, sp, #0x48 + bl ov45_02237BC8 + add sp, sp, #0x60 + ldmia sp!, {r4, pc} +_0223FADC: + cmp r1, #2 + bne _0223FB50 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x3c + ldr r1, [r1] + ldr r1, [r1, #8] + bl ov45_022429E0 + ldr r0, _0223FC54 ; =ov45_022577DC + add r1, sp, #0x3c + ldr r0, [r0] + add r0, r0, #0xc + bl ov45_02237D48 + add r0, sp, #0x3c + bl ov45_02237BC8 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x30 + ldr r1, [r1] + bl ov45_0223FC5C + ldr r0, [sp, #0x30] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x31 + ldrne r1, [sp, #0x38] + mov r0, r4 + bl ov45_0225035C + add r0, sp, #0x30 + bl ov45_02237BC8 + add sp, sp, #0x60 + ldmia sp!, {r4, pc} +_0223FB50: + sub r0, r1, #3 + cmp r0, #1 + bhi _0223FBD0 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x24 + ldr r1, [r1] + ldr r1, [r1, #8] + bl ov45_022429E0 + ldr r0, _0223FC54 ; =ov45_022577DC + add r1, sp, #0x24 + ldr r0, [r0] + add r0, r0, #0xc + bl ov45_02237D48 + add r0, sp, #0x24 + bl ov45_02237BC8 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + bl ov45_0223FC5C + ldr r0, [sp, #0x18] + ldr r3, _0223FC58 ; =ov45_02255304 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r2, sp, #0x19 + ldrne r2, [sp, #0x20] + mov r0, r4 + mov r1, #2 + bl ov45_02250424 + add r0, sp, #0x18 + bl ov45_02237BC8 + add sp, sp, #0x60 + ldmia sp!, {r4, pc} +_0223FBD0: + cmp r1, #5 + addeq sp, sp, #0x60 + ldmeqia sp!, {r4, pc} + cmp r1, #6 + addne sp, sp, #0x60 + ldmneia sp!, {r4, pc} + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0xc + ldr r1, [r1] + ldr r1, [r1, #8] + bl ov45_022429E0 + ldr r0, _0223FC54 ; =ov45_022577DC + add r1, sp, #0xc + ldr r0, [r0] + add r0, r0, #0xc + bl ov45_02237D48 + add r0, sp, #0xc + bl ov45_02237BC8 + ldr r1, _0223FC54 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + bl ov45_0223FC5C + ldr r0, [sp] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #1 + ldrne r1, [sp, #8] + mov r0, r4 + bl ov45_0225035C + add r0, sp, #0 + bl ov45_02237BC8 + add sp, sp, #0x60 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0223FC54: .word ov45_022577DC +_0223FC58: .word ov45_02255304 + arm_func_end ov45_0223FA3C + + arm_func_start ov45_0223FC5C +ov45_0223FC5C: ; 0x0223FC5C + ldr ip, _0223FC68 ; =ov45_02237A24 + add r1, r1, #0xc + bx ip + .balign 4, 0 +_0223FC68: .word ov45_02237A24 + arm_func_end ov45_0223FC5C + + arm_func_start ov45_0223FC6C +ov45_0223FC6C: ; 0x0223FC6C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x28 + ldr r0, _0223FD64 ; =ov45_022577DC + mov r6, r1 + ldr r1, [r0] + mov r7, r2 + cmp r1, #0 + beq _0223FC9C + ldr r0, [r1, #4] + cmp r0, #5 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0223FC9C: + add r0, sp, #0x1c + mov r2, r7 + bl ov45_02242910 + ldr r0, _0223FD64 ; =ov45_022577DC + ldr r5, [sp, #0x50] + ldr r4, [r0] + ldr ip, _0223FD68 ; =ov45_02255238 + add r3, sp, #0x10 + mov r8, #0 + add r0, sp, #0xc + add r2, sp, #8 + add r1, r4, #0x90 + str ip, [sp, #0x10] + str r5, [sp, #0x14] + str r8, [sp, #0x18] + str r3, [sp, #8] + bl ov45_0223FD8C + ldr r1, [sp, #0xc] + add r0, r4, #0x94 + cmp r1, r0 + moveq sb, r8 + ldrne sb, [r1, #0xc] + cmp r6, #1 + moveq r6, #1 + add r0, sp, #0x1c + ldr r4, [sb, #0xc] + movne r6, #0 + bl ov45_0223FD74 + mov r8, r0 + mov r0, sb + ldr r1, [r0] + ldr r1, [r1, #0xc] + blx r1 + mov r1, r7 + ldr r7, [sp, #0x4c] + ldr r3, [sp, #0x48] + str r7, [sp] + str r0, [sp, #4] + mov r2, r8 + mov r0, r6 + blx r4 + ldr r0, _0223FD64 ; =ov45_022577DC + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + add r0, sp, #0x1c + bl ov45_022376BC + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0223FD64: .word ov45_022577DC +_0223FD68: .word ov45_02255238 + arm_func_end ov45_0223FC6C + + arm_func_start ov45_0223FD6C +ov45_0223FD6C: ; 0x0223FD6C + ldr r0, [r0, #8] + bx lr + arm_func_end ov45_0223FD6C + + arm_func_start ov45_0223FD74 +ov45_0223FD74: ; 0x0223FD74 + ldr r1, [r0, #4] + cmp r1, #0 + moveq r0, #0 + ldrne r0, [r0] + bx lr + arm_func_end ov45_0223FD74 + + arm_func_start ov45_0223FD88 +ov45_0223FD88: ; 0x0223FD88 + bx lr + arm_func_end ov45_0223FD88 + + arm_func_start ov45_0223FD8C +ov45_0223FD8C: ; 0x0223FD8C + stmdb sp!, {r4, r5, r6, lr} + mov r4, r1 + mov r6, r2 + mov r5, r0 + ldr r2, [r4, #4] + mov r0, r4 + mov r1, r6 + add r3, r4, #4 + bl ov45_0223FDE8 + add r1, r4, #4 + cmp r0, r1 + beq _0223FDD4 + ldr r2, [r6] + ldr r1, [r0, #0xc] + ldr r2, [r2, #4] + ldr r1, [r1, #4] + cmp r2, r1 + bhs _0223FDE0 +_0223FDD4: + add r0, r4, #4 + str r0, [r5] + ldmia sp!, {r4, r5, r6, pc} +_0223FDE0: + str r0, [r5] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_0223FD8C + + arm_func_start ov45_0223FDE8 +ov45_0223FDE8: ; 0x0223FDE8 + cmp r2, #0 + beq _0223FE18 + ldr r0, [r1] + ldr r1, [r0, #4] +_0223FDF8: + ldr r0, [r2, #0xc] + ldr r0, [r0, #4] + cmp r0, r1 + movhs r3, r2 + ldrhs r2, [r2] + ldrlo r2, [r2, #4] + cmp r2, #0 + bne _0223FDF8 +_0223FE18: + mov r0, r3 + bx lr + arm_func_end ov45_0223FDE8 + + arm_func_start ov45_0223FE20 +ov45_0223FE20: ; 0x0223FE20 + cmp r1, #0 + bx lr + arm_func_end ov45_0223FE20 + + arm_func_start ov45_0223FE28 +ov45_0223FE28: ; 0x0223FE28 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x58 + ldr r0, _0223FFE0 ; =ov45_022577DC + mov r4, r1 + ldr r0, [r0] + mov r6, r2 + mov r5, r3 + cmp r0, #0 + beq _0223FE5C + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x58 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0223FE5C: + mov r0, #0 + str r0, [sp, #0x4c] + str r0, [sp, #0x50] + str r0, [sp, #0x54] + cmp r5, #0 + beq _0223FEE4 + add r0, sp, #0x40 + mov r1, r6 + bl ov45_02237B58 + add r1, sp, #0x40 + ldr r0, _0223FFE0 ; =ov45_022577DC + str r1, [sp] + ldr r1, [r0] + ldr r3, [sp, #0x78] + add r0, sp, #0x34 + mov r2, r5 + bl ov45_02242EF4 + add r0, sp, #0x4c + add r1, sp, #0x34 + cmp r0, r1 + beq _0223FED4 + mov r3, #0 + ldr r1, [sp, #0x34] + ldr r5, [sp, #0x38] + strb r3, [sp, #4] + sub r2, sp, #4 + strb r3, [r2] + ldr r3, [r2] + add r2, r1, r5, lsl #2 + bl ov45_0223FFE8 +_0223FED4: + add r0, sp, #0x34 + bl ov45_022376BC + add r0, sp, #0x40 + bl ov45_02237BC8 +_0223FEE4: + ldr r0, _0223FFE0 ; =ov45_022577DC + ldr r8, [sp, #0x80] + ldr r5, [r0] + ldr sb, _0223FFE4 ; =ov45_02255238 + add r3, sp, #0x10 + mov r7, #0 + add r0, sp, #0xc + add r2, sp, #8 + add r1, r5, #0x90 + str sb, [sp, #0x10] + str r8, [sp, #0x14] + str r7, [sp, #0x18] + str r3, [sp, #8] + bl ov45_0223FD8C + ldr r1, [sp, #0xc] + add r0, r5, #0x94 + cmp r1, r0 + moveq r5, r7 + ldrne r5, [r1, #0xc] + add r0, sp, #0x28 + mov r1, r6 + bl ov45_02237B58 + ldr r1, _0223FFE0 ; =ov45_022577DC + add r0, sp, #0x1c + ldr r1, [r1] + add r2, sp, #0x28 + bl ov45_022428D8 + ldr r0, [sp, #0x1c] + ldr r6, [sp, #0x50] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq sb, sp, #0x1d + ldrne sb, [sp, #0x24] + cmp r4, #1 + moveq sl, #1 + add r0, sp, #0x4c + ldr r7, [r5, #0xc] + movne sl, #0 + bl ov45_0223259C + mov r4, r0 + mov r0, r5 + ldr r1, [r0] + ldr r1, [r1, #0xc] + blx r1 + str r0, [sp] + mov r1, sb + mov r2, r6 + mov r3, r4 + mov r0, sl + blx r7 + add r0, sp, #0x1c + bl ov45_02237BC8 + add r0, sp, #0x28 + bl ov45_02237BC8 + ldr r0, _0223FFE0 ; =ov45_022577DC + mov r1, r8 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + add r0, sp, #0x4c + bl ov45_022376BC + add sp, sp, #0x58 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0223FFE0: .word ov45_022577DC +_0223FFE4: .word ov45_02255238 + arm_func_end ov45_0223FE28 + + arm_func_start ov45_0223FFE8 +ov45_0223FFE8: ; 0x0223FFE8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r5, r2 + mov r7, r0 + sub r2, r5, r6 + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + ldr r3, [r7, #8] + mov r4, r1, asr #2 + cmp r3, r1, asr #2 + bhs _02240034 + mov r2, #0 + sub r1, r4, r3 + strb r2, [sp] + bl ov45_0223EA34 + mov r2, r0 + mov r0, r7 + mov r1, r4 + bl ov45_022421E4 +_02240034: + sub r1, r5, r6 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r2, r0, asr #2 + ldr r0, [r7] + mov r1, r6 + mov r2, r2, lsl #2 + bl memmove + str r4, [r7, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0223FFE8 + + arm_func_start ov45_0224005C +ov45_0224005C: ; 0x0224005C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x6c + ldr r0, _0224022C ; =ov45_022577DC + mov r5, r1 + ldr r0, [r0] + mov r4, r2 + mov r6, r3 + cmp r0, #0 + beq _02240090 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x6c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_02240090: + cmp r5, #1 + bne _022400D4 + add r0, sp, #0x60 + mov r1, r4 + bl ov45_02237B58 + add r1, sp, #0x60 + ldr r0, _0224022C ; =ov45_022577DC + str r1, [sp] + ldr r1, [r0] + ldr r3, [sp, #0x90] + add r0, sp, #0x54 + mov r2, r6 + bl ov45_02242EF4 + add r0, sp, #0x54 + bl ov45_022376BC + add r0, sp, #0x60 + bl ov45_02237BC8 +_022400D4: + add r0, sp, #0x48 + mov r1, r4 + bl ov45_02237B58 + ldr r0, _0224022C ; =ov45_022577DC + add r1, sp, #0x48 + ldr r0, [r0] + bl ov45_022437CC + add r0, sp, #0x48 + bl ov45_02237BC8 + ldr r0, _0224022C ; =ov45_022577DC + ldr r8, [sp, #0x98] + ldr r6, [r0] + ldr r0, _02240230 ; =ov45_02255238 + mov r1, #0 + str r0, [sp, #0xc] + add r0, sp, #0xc + str r1, [sp, #0x14] + str r0, [sp, #4] + add r0, sp, #8 + add r1, r6, #0x90 + add r2, sp, #4 + str r8, [sp, #0x10] + bl ov45_0223FD8C + ldr r1, [sp, #8] + add r0, r6, #0x94 + cmp r1, r0 + moveq r6, #0 + ldrne r6, [r1, #0xc] + add r0, sp, #0x3c + mov r1, r4 + bl ov45_02237B58 + ldr r1, _0224022C ; =ov45_022577DC + add r0, sp, #0x30 + ldr r1, [r1] + add r2, sp, #0x3c + bl ov45_022428D8 + ldr r0, [sp, #0x30] + ldr r7, [r6, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r0, r6 + ldr r1, [r0] + addeq sb, sp, #0x31 + ldrne sb, [sp, #0x38] + cmp r5, #1 + moveq sl, #1 + ldr r1, [r1, #0xc] + movne sl, #0 + blx r1 + mov r3, r0 + mov r0, sl + mov r2, sb + mov r1, #0 + blx r7 + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x3c + bl ov45_02237BC8 + ldr r0, _0224022C ; =ov45_022577DC + mov r1, r8 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + cmp r5, #0 + addne sp, sp, #0x6c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + add r0, sp, #0x24 + mov r1, r4 + bl ov45_02237B58 + ldr r1, _0224022C ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + add r2, sp, #0x24 + bl ov45_022428D8 + ldr r0, [sp, #0x18] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x19 + ldrne r0, [sp, #0x20] + bl ov45_022412CC + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + add sp, sp, #0x6c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0224022C: .word ov45_022577DC +_02240230: .word ov45_02255238 + arm_func_end ov45_0224005C + + arm_func_start ov45_02240234 +ov45_02240234: ; 0x02240234 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x6c + ldr r4, _02240488 ; =ov45_022577DC + mov r8, r0 + ldr r0, [r4] + mov r5, r1 + mov r7, r2 + mov r6, r3 + cmp r0, #0 + beq _0224026C + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x6c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0224026C: + cmp r5, #1 + bne _02240300 + add r0, sp, #0x60 + mov r1, r6 + bl ov45_02237B58 + ldr r0, _02240488 ; =ov45_022577DC + add r1, sp, #0x60 + ldr r0, [r0] + bl ov45_02243808 + mov r4, r0 + add r0, sp, #0x60 + bl ov45_02237BC8 + cmp r4, #0 + beq _02240300 + ldr r0, _02240488 ; =ov45_022577DC + mov r1, r6 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_02250F5C + mvn r1, #0 + cmp r4, r1 + moveq r5, #0 + moveq r7, #7 + beq _02240300 + cmp r0, r4 + bgt _022402DC + cmp r0, r1 + bne _022402E8 +_022402DC: + mov r5, #0 + mov r7, #2 + b _02240300 +_022402E8: + ldr r0, _02240488 ; =ov45_022577DC + mov r1, r6 + ldr r0, [r0] + mov r2, r4 + ldr r0, [r0] + bl ov45_02250E6C +_02240300: + cmp r5, #1 + bne _0224036C + ldr r1, _02240488 ; =ov45_022577DC + add r0, sp, #0x54 + ldr r1, [r1] + bl ov45_0223FC5C + add r0, sp, #0x48 + mov r1, r6 + bl ov45_02237B58 + ldr r0, _02240488 ; =ov45_022577DC + add r1, sp, #0x54 + ldr r0, [r0] + add r2, sp, #0x48 + bl ov45_02242D30 + add r0, sp, #0x48 + bl ov45_02237BC8 + add r0, sp, #0x54 + bl ov45_02237BC8 + mov r2, #0 + str r2, [sp] + ldr r2, _0224048C ; =ov45_0224005C + ldr r3, [sp, #0x88] + mov r0, r8 + mov r1, r6 + bl ov45_02251208 + add sp, sp, #0x6c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0224036C: + add r0, sp, #0x3c + mov r1, r6 + bl ov45_02237B58 + ldr r1, _02240488 ; =ov45_022577DC + add r0, sp, #0x30 + ldr r1, [r1] + add r2, sp, #0x3c + bl ov45_022428D8 + ldr r0, [sp, #0x30] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #0x31 + ldrne r0, [sp, #0x38] + bl ov45_022412CC + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x3c + bl ov45_02237BC8 + ldr r0, _02240488 ; =ov45_022577DC + ldr r5, [sp, #0x88] + ldr r4, [r0] + ldr r0, _02240490 ; =ov45_02255238 + mov r1, #0 + str r0, [sp, #0xc] + add r0, sp, #0xc + str r1, [sp, #0x14] + str r0, [sp, #4] + add r0, sp, #8 + add r1, r4, #0x90 + add r2, sp, #4 + str r5, [sp, #0x10] + bl ov45_0223FD8C + ldr r1, [sp, #8] + add r0, r4, #0x94 + cmp r1, r0 + moveq r4, #0 + ldrne r4, [r1, #0xc] + add r0, sp, #0x24 + mov r1, r6 + bl ov45_02237B58 + ldr r1, _02240488 ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + add r2, sp, #0x24 + bl ov45_022428D8 + ldr r0, [sp, #0x18] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r0, r4 + ldr r1, [r0] + addeq r6, sp, #0x19 + ldrne r6, [sp, #0x20] + ldr r1, [r1, #0xc] + ldr r4, [r4, #0xc] + blx r1 + mov r3, r0 + mov r1, r7 + mov r2, r6 + mov r0, #0 + blx r4 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + ldr r0, _02240488 ; =ov45_022577DC + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + add sp, sp, #0x6c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02240488: .word ov45_022577DC +_0224048C: .word ov45_0224005C +_02240490: .word ov45_02255238 + arm_func_end ov45_02240234 + + arm_func_start ov45_02240494 +ov45_02240494: ; 0x02240494 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + ldr r0, _02240618 ; =ov45_022577DC + mov r7, r1 + ldr r0, [r0] + mov sb, r2 + cmp r0, #0 + beq _022404C4 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022404C4: + cmp sb, #0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r3, #0 + mvneq fp, #0 + beq _02240504 + add r0, sp, #0x34 + mov r1, r3 + bl ov45_02237B58 + ldr r0, _02240618 ; =ov45_022577DC + add r1, sp, #0x34 + ldr r0, [r0] + bl ov45_022435F8 + mov fp, r0 + add r0, sp, #0x34 + bl ov45_02237BC8 +_02240504: + ldr r0, _02240618 ; =ov45_022577DC + ldr r8, [sp, #0x74] + ldr r4, [r0] + ldr r6, _0224061C ; =ov45_02255238 + add r3, sp, #0x10 + mov r5, #0 + add r0, sp, #0xc + add r2, sp, #8 + add r1, r4, #0x90 + str r6, [sp, #0x10] + str r8, [sp, #0x14] + str r5, [sp, #0x18] + str r3, [sp, #8] + bl ov45_0223FD8C + add r0, r4, #0x94 + ldr r1, [sp, #0xc] + mov r4, #0 + cmp r1, r0 + moveq r6, r5 + ldrne r6, [r1, #0xc] + mov r5, r4 + cmp r7, #1 + bne _0224057C + ldr r0, [sp, #0x68] + cmp r0, #0 + ble _0224057C + ldr r1, [sp, #0x6c] + ldr r0, [sp, #0x70] + ldr r4, [r1] + ldr r5, [r0] +_0224057C: + add r0, sp, #0x28 + mov r1, sb + bl ov45_02237B58 + ldr r1, _02240618 ; =ov45_022577DC + add r0, sp, #0x1c + ldr r1, [r1] + add r2, sp, #0x28 + bl ov45_022428D8 + ldr r0, [sp, #0x1c] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r0, r6 + ldr r1, [r0] + addeq sb, sp, #0x1d + ldrne sb, [sp, #0x24] + cmp r7, #1 + moveq sl, #1 + ldr r7, [r6, #0xc] + ldr r1, [r1, #0xc] + movne sl, #0 + blx r1 + str r5, [sp] + str r0, [sp, #4] + mov r0, sl + mov r1, sb + mov r2, fp + mov r3, r4 + blx r7 + add r0, sp, #0x1c + bl ov45_02237BC8 + add r0, sp, #0x28 + bl ov45_02237BC8 + ldr r0, _02240618 ; =ov45_022577DC + mov r1, r8 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02240618: .word ov45_022577DC +_0224061C: .word ov45_02255238 + arm_func_end ov45_02240494 + + arm_func_start ov45_02240620 +ov45_02240620: ; 0x02240620 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x34 + ldr r0, _02240714 ; =ov45_022577DC + mov r7, r1 + ldr r0, [r0] + mov r6, r3 + cmp r0, #0 + beq _02240650 + ldr r0, [r0, #4] + cmp r0, #5 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, pc} +_02240650: + cmp r2, #0 + mvneq r4, #0 + beq _02240684 + add r0, sp, #0x28 + mov r1, r2 + bl ov45_02237B58 + ldr r0, _02240714 ; =ov45_022577DC + add r1, sp, #0x28 + ldr r0, [r0] + bl ov45_022435F8 + mov r4, r0 + add r0, sp, #0x28 + bl ov45_02237BC8 +_02240684: + add r0, sp, #0x1c + mov r1, r7 + bl ov45_02237B58 + ldr r0, _02240714 ; =ov45_022577DC + add r1, sp, #0x1c + ldr r0, [r0] + bl ov45_02242C3C + mov r5, r0 + add r0, sp, #0x1c + bl ov45_02237BC8 + add r0, sp, #0x10 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02240714 ; =ov45_022577DC + add r0, sp, #4 + ldr r1, [r1] + add r2, sp, #0x10 + bl ov45_022428D8 + ldr r0, [sp, #4] + ldr r1, [r5, #0x14] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, sp, #5 + ldrne r0, [sp, #0xc] + ldr r3, [sp, #0x48] + str r1, [sp] + ldr r5, [r5, #0xc] + mov r1, r4 + mov r2, r6 + blx r5 + add r0, sp, #4 + bl ov45_02237BC8 + add r0, sp, #0x10 + bl ov45_02237BC8 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02240714: .word ov45_022577DC + arm_func_end ov45_02240620 + + arm_func_start ov45_02240718 +ov45_02240718: ; 0x02240718 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x2c + ldr r4, _02240848 ; =ov45_022577DC + mov r8, r1 + ldr r1, [r4] + mov r7, r2 + mov r6, r3 + cmp r1, #0 + beq _0224074C + ldr r1, [r1, #4] + cmp r1, #5 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0224074C: + cmp r8, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r3, [sp, #0x48] + mov r1, r7 + mov r2, r6 + bl ov45_0223F8F4 + ldr r0, _02240848 ; =ov45_022577DC + ldr r5, [sp, #0x48] + ldr r4, [r0] + ldr lr, _0224084C ; =ov45_02255238 + add r3, sp, #8 + mov ip, #0 + add r0, sp, #4 + add r2, sp, #0 + add r1, r4, #0x90 + str lr, [sp, #8] + str r5, [sp, #0xc] + str ip, [sp, #0x10] + str r3, [sp] + bl ov45_0223FD8C + ldr r1, [sp, #4] + add r0, r4, #0x94 + cmp r1, r0 + moveq r4, #0 + ldrne r4, [r1, #0xc] + add r0, sp, #0x20 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02240848 ; =ov45_022577DC + add r0, sp, #0x14 + ldr r1, [r1] + add r2, sp, #0x20 + bl ov45_022428D8 + ldr r0, [sp, #0x14] + ldr r7, [r4, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + mov r0, r4 + ldr r1, [r0] + addeq sb, sp, #0x15 + ldrne sb, [sp, #0x1c] + cmp r8, #1 + moveq r8, #1 + ldr r1, [r1, #0xc] + movne r8, #0 + blx r1 + mov r3, r0 + mov r0, r8 + mov r1, sb + mov r2, r6 + blx r7 + add r0, sp, #0x14 + bl ov45_02237BC8 + add r0, sp, #0x20 + bl ov45_02237BC8 + ldr r0, _02240848 ; =ov45_022577DC + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x90 + bl ov45_02242510 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02240848: .word ov45_022577DC +_0224084C: .word ov45_02255238 + arm_func_end ov45_02240718 + + arm_func_start ov45_02240850 +ov45_02240850: ; 0x02240850 + ldr r0, _02240870 ; =ov45_022577DC + mov r1, #3 + ldr r2, [r0] + mov r0, #5 + str r1, [r2, #0x58] + str r0, [r2, #4] + mov r0, #0 + bx lr + .balign 4, 0 +_02240870: .word ov45_022577DC + arm_func_end ov45_02240850 + + arm_func_start ov45_02240874 +ov45_02240874: ; 0x02240874 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + ldr r0, _02240A54 ; =ov45_022577DC + ldr r1, [r0] + cmp r1, #0 + addeq sp, sp, #0x28 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + beq _022408AC + ldr r0, [r1, #4] + cmp r0, #5 + addeq sp, sp, #0x28 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022408AC: + ldr r0, [r1] + cmp r0, #0 + beq _022408BC + bl ov45_02250590 +_022408BC: + ldr r2, _02240A54 ; =ov45_022577DC + add r0, sp, #0xc + add r1, sp, #0x1c + ldr r5, [r2] + bl ov00_021ECB94 + add r0, sp, #0xc + add r1, sp, #0x1c + bl RTC_ConvertDateTimeToSecond + ldr r2, [r5, #0xa8] + add r7, r5, #0xa0 + mov r6, r0 + mov sb, r1 + str r2, [sp, #8] + cmp r2, r7 + beq _0224098C + mov fp, #1 + mov sl, #0 + add r4, sp, #8 +_02240904: + ldr r1, [r2, #0x10] + ldr r0, [r2, #0x14] + subs r1, r6, r1 + ldr r8, [r2, #0x18] + sbc r0, sb, r0 + ldr r3, [r2, #0x1c] + subs r1, r8, r1 + sbcs r1, r3, r0 + bge _02240948 + str r6, [r2, #0x10] + str sb, [r2, #0x14] + ldr r0, [r2, #0x20] + ldr r1, [r2, #0x24] + blx r1 + cmp r0, #0 + moveq r0, sl + beq _0224094C +_02240948: + mov r0, fp +_0224094C: + cmp r0, #0 + bne _02240978 + ldr r8, [sp, #8] + mov r0, r4 + bl ov45_02236E58 + add r0, sp, #4 + mov r2, r8 + add r1, r5, #0x9c + str r8, [sp] + bl ov45_02236C40 + b _02240980 +_02240978: + mov r0, r4 + bl ov45_02236E58 +_02240980: + ldr r2, [sp, #8] + cmp r2, r7 + bne _02240904 +_0224098C: + ldr r0, _02240A54 ; =ov45_022577DC + ldr r3, [r0] + cmp r3, #0 + beq _022409B0 + ldr r0, [r3, #4] + cmp r0, #5 + addeq sp, sp, #0x28 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022409B0: + ldr r1, [r3, #0x54] + ldr r0, _02240A54 ; =ov45_022577DC + cmp r1, #3 + ldr r2, [r0] + blo _022409F0 + mov r1, #0 + str r1, [r3, #0x54] + ldr r2, [r0] + mov r1, #3 + str r1, [r2, #0x58] + mov r1, #5 + str r1, [r2, #4] + ldr r0, [r0] + add sp, sp, #0x28 + ldr r0, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022409F0: + ldr r0, [r2, #4] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _02240A40 +_02240A00: ; jump table + b _02240A40 ; case 0 + b _02240A40 ; case 1 + b _02240A14 ; case 2 + b _02240A40 ; case 3 + b _02240A40 ; case 4 +_02240A14: + ldr r1, [r2, #0x5c] + add r0, r1, #1 + str r0, [r2, #0x5c] + cmp r1, #0x3c + bne _02240A40 + mov r0, #0 + str r0, [r2, #0x5c] + ldr r0, [r2, #4] + cmp r0, #5 + movne r0, #3 + strne r0, [r2, #4] +_02240A40: + ldr r0, _02240A54 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02240A54: .word ov45_022577DC + arm_func_end ov45_02240874 + + arm_func_start ov45_02240A58 +ov45_02240A58: ; 0x02240A58 + ldr r0, _02240A70 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #0x58] + moveq r0, #0 + bx lr + .balign 4, 0 +_02240A70: .word ov45_022577DC + arm_func_end ov45_02240A58 + + arm_func_start ov45_02240A74 +ov45_02240A74: ; 0x02240A74 + add r0, r0, #0x410 + add r0, r0, #0xa000 + bx lr + arm_func_end ov45_02240A74 + + arm_func_start ov45_02240A80 +ov45_02240A80: ; 0x02240A80 + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + ldr r2, _02240B0C ; =ov45_022577DC + mov r1, r0 + ldr r0, [r2] + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, sp, #0xc + bl ov45_02237B58 + ldr r1, _02240B0C ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428C8 + ldr r0, [sp] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _02240B0C ; =ov45_022577DC + addeq r1, sp, #1 + ldr r0, [r0] + ldrne r1, [sp, #8] + ldr r0, [r0] + bl ov45_02251024 + cmp r0, #1 + moveq r4, #1 + add r0, sp, #0 + movne r4, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02240B0C: .word ov45_022577DC + arm_func_end ov45_02240A80 + + arm_func_start ov45_02240B10 +ov45_02240B10: ; 0x02240B10 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x13c + mov sl, r0 + ldr r0, _02240F30 ; =_version_NINTENDO_DWC_LOBBY + mov sb, r1 + mov r8, r2 + mov r7, r3 + bl OSi_ReferSymbol + ldr r0, _02240F34 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + addne sp, sp, #0x13c + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, [sp, #0x160] + add r0, sp, #0x130 + bl ov45_022429E0 + ldr r1, _02240F38 ; =ov45_02255308 + add r0, sp, #0x124 + bl ov45_02237B58 + ldr r1, _02240F3C ; =ov45_02255310 + add r0, sp, #0x118 + bl ov45_02237B58 + mov r4, #0 + mov r0, #0xac + mov r5, r4 + bl ov45_02242394 + movs r6, r0 + beq _02240BE0 + add r0, sp, #0xf8 + mov r1, sb + bl ov45_02237B58 + add r0, sp, #0xec + mov r1, sl + mov r4, #1 + bl ov45_02237B58 + ldr r1, [sp, #0x160] + add r0, sp, #0x130 + str r1, [sp] + str r0, [sp, #4] + add r1, sp, #0x124 + str r1, [sp, #8] + add r0, sp, #0x118 + str r0, [sp, #0xc] + add r1, sp, #0xec + add r2, sp, #0xf8 + mov r3, r8 + mov r0, r6 + str r7, [sp, #0x10] + mov r5, r4 + bl ov45_0224268C + mov r6, r0 +_02240BE0: + ldr r0, _02240F34 ; =ov45_022577DC + cmp r5, #0 + str r6, [r0] + beq _02240BF8 + add r0, sp, #0xec + bl ov45_02237BC8 +_02240BF8: + cmp r4, #0 + beq _02240C08 + add r0, sp, #0xf8 + bl ov45_02237BC8 +_02240C08: + ldr r0, _02240F34 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + bne _02240C3C + add r0, sp, #0x118 + bl ov45_02237BC8 + add r0, sp, #0x124 + bl ov45_02237BC8 + add r0, sp, #0x130 + bl ov45_02237BC8 + add sp, sp, #0x13c + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_02240C3C: + bl ov45_0224246C + cmp r0, #0 + moveq r4, #1 + beq _02240EC8 + add r0, sp, #0x104 + mov r1, #0 + mov r2, #0x14 + bl MI_CpuFill8 + ldr r4, _02240F40 ; =ov45_0223ED00 + ldr r3, _02240F44 ; =ov45_0223ED1C + ldr r1, _02240F48 ; =ov45_0223F1C8 + ldr r2, _02240F4C ; =ov45_0223EDD8 + ldr r0, _02240F34 ; =ov45_022577DC + str r1, [sp, #0x110] + ldr r1, [r0] + str r4, [sp, #0x104] + str r3, [sp, #0x108] + str r2, [sp, #0x10c] + ldr r2, [r7, #8] + add r0, sp, #0xe0 + str r2, [sp, #0x114] + bl ov45_02240F6C + ldr r2, _02240F50 ; =ov45_02255318 + add r0, sp, #0xd4 + add r1, sp, #0xe0 + bl ov45_02233ABC + ldr r2, _02240F54 ; =ov45_0225531C + add r0, sp, #0xc8 + add r1, sp, #0xd4 + bl ov45_02233ABC + ldr r1, _02240F34 ; =ov45_022577DC + add r0, sp, #0xbc + ldr r1, [r1] + bl ov45_0223FC5C + ldr r1, _02240F34 ; =ov45_022577DC + add r0, sp, #0xb0 + ldr r1, [r1] + bl ov45_02240F7C + ldr r1, _02240F34 ; =ov45_022577DC + add r0, sp, #0xa4 + ldr r1, [r1] + bl ov45_02240F6C + ldr r1, _02240F34 ; =ov45_022577DC + add r0, sp, #0x98 + ldr r1, [r1] + bl ov45_02240F8C + ldr r0, [sp, #0x98] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0xa4] + addeq r1, sp, #0x99 + mov r0, r0, lsl #0x1f + ldrne r1, [sp, #0xa0] + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0xb0] + addeq r4, sp, #0xa5 + mov r0, r0, lsl #0x1f + ldrne r4, [sp, #0xac] + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0xbc] + addeq r3, sp, #0xb1 + mov r0, r0, lsl #0x1f + ldrne r3, [sp, #0xb8] + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0xc8] + addeq r2, sp, #0xbd + mov r0, r0, lsl #0x1f + ldrne r2, [sp, #0xc4] + movs r0, r0, lsr #0x1f + addeq r0, sp, #0xc9 + ldrne r0, [sp, #0xd0] + str r4, [sp] + str r1, [sp, #4] + add r4, sp, #0x104 + str r4, [sp, #8] + ldr r1, _02240F58 ; =ov45_0223FA3C + ldr r4, _02240F5C ; =ov45_0223F9C4 + str r1, [sp, #0xc] + ldr r1, _02240F60 ; =ov45_0223F92C + str r4, [sp, #0x10] + str r1, [sp, #0x14] + ldr r4, [r7, #8] + ldr r1, _02240F64 ; =0x00001A0B + str r4, [sp, #0x18] + mov r4, #0 + str r4, [sp, #0x1c] + bl ov45_022502D0 + mov r4, r0 + add r0, sp, #0x98 + bl ov45_02237BC8 + add r0, sp, #0xa4 + bl ov45_02237BC8 + add r0, sp, #0xb0 + bl ov45_02237BC8 + add r0, sp, #0xbc + bl ov45_02237BC8 + add r0, sp, #0xc8 + bl ov45_02237BC8 + add r0, sp, #0xd4 + bl ov45_02237BC8 + add r0, sp, #0xe0 + bl ov45_02237BC8 + cmp r4, #0 + moveq r4, #2 + beq _02240EC8 + ldr r0, _02240F34 ; =ov45_022577DC + ldr r2, _02240F34 ; =ov45_022577DC + ldr r1, [r0] + str r4, [r1] + ldr r1, [r0] + ldr r0, [r1, #4] + cmp r0, #5 + movne r0, #1 + strne r0, [r1, #4] + add r0, sp, #0x88 + add r1, sp, #0x7c + ldr r5, [r2] + bl ov00_021ECB94 + add r0, sp, #0x88 + add r1, sp, #0x7c + bl RTC_ConvertDateTimeToSecond + ldr r3, _02240F68 ; =ov45_02240850 + str r0, [sp, #0x2c] + str r1, [sp, #0x30] + mov r4, #0x1e + mov r1, #0 + add r0, sp, #0x44 + add r2, sp, #0x2c + str r4, [sp, #0x34] + str r1, [sp, #0x38] + str r5, [sp, #0x3c] + str r3, [sp, #0x40] + bl ov45_02232AE8 + mov r0, #0 + add r2, sp, #0x48 + strb r0, [sp, #0x21] + strb r0, [sp, #0x20] + ldr r0, [sp, #0x44] + add r7, sp, #0x64 + str r0, [sp, #0x60] + add r1, r5, #0x9c + add r6, r2, #8 + ldr r4, [r2, #0x10] + ldr r0, [r2, #0x14] + ldmia r2, {r2, r3} + stmia r7, {r2, r3} + add r5, r7, #8 + ldmia r6, {r2, r3} + stmia r5, {r2, r3} + str r0, [r7, #0x14] + add r0, sp, #0x24 + add r2, sp, #0x60 + str r4, [r7, #0x10] + bl ov45_02236BA8 + add r0, sp, #0x118 + bl ov45_02237BC8 + add r0, sp, #0x124 + bl ov45_02237BC8 + add r0, sp, #0x130 + bl ov45_02237BC8 + add sp, sp, #0x13c + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_02240EC8: + bl ov45_022424DC + ldr r0, _02240F34 ; =ov45_022577DC + ldr r5, [r0] + cmp r5, #0 + beq _02240F0C + beq _02240F00 + mov r0, r5 + bl ov45_02242858 + cmp r5, #0 + beq _02240F00 + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl ov00_021EC2EC +_02240F00: + ldr r0, _02240F34 ; =ov45_022577DC + mov r1, #0 + str r1, [r0] +_02240F0C: + add r0, sp, #0x118 + bl ov45_02237BC8 + add r0, sp, #0x124 + bl ov45_02237BC8 + add r0, sp, #0x130 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0x13c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02240F30: .word _version_NINTENDO_DWC_LOBBY +_02240F34: .word ov45_022577DC +_02240F38: .word ov45_02255308 +_02240F3C: .word ov45_02255310 +_02240F40: .word ov45_0223ED00 +_02240F44: .word ov45_0223ED1C +_02240F48: .word ov45_0223F1C8 +_02240F4C: .word ov45_0223EDD8 +_02240F50: .word ov45_02255318 +_02240F54: .word ov45_0225531C +_02240F58: .word ov45_0223FA3C +_02240F5C: .word ov45_0223F9C4 +_02240F60: .word ov45_0223F92C +_02240F64: .word 0x00001A0B +_02240F68: .word ov45_02240850 + arm_func_end ov45_02240B10 + + arm_func_start ov45_02240F6C +ov45_02240F6C: ; 0x02240F6C + ldr ip, _02240F78 ; =ov45_02237A24 + add r1, r1, #0x30 + bx ip + .balign 4, 0 +_02240F78: .word ov45_02237A24 + arm_func_end ov45_02240F6C + + arm_func_start ov45_02240F7C +ov45_02240F7C: ; 0x02240F7C + ldr ip, _02240F88 ; =ov45_02237A24 + add r1, r1, #0x24 + bx ip + .balign 4, 0 +_02240F88: .word ov45_02237A24 + arm_func_end ov45_02240F7C + + arm_func_start ov45_02240F8C +ov45_02240F8C: ; 0x02240F8C + ldr ip, _02240F98 ; =ov45_02237A24 + add r1, r1, #0x3c + bx ip + .balign 4, 0 +_02240F98: .word ov45_02237A24 + arm_func_end ov45_02240F8C + + arm_func_start ov45_02240F9C +ov45_02240F9C: ; 0x02240F9C + stmdb sp!, {r4, lr} + ldr r0, _02241044 ; =ov45_022577DC + ldr r0, [r0] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r0, #4] + cmp r0, #4 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl ov45_022424DC + ldr r0, _02241044 ; =ov45_022577DC + ldr r2, [r0] + ldr r1, [r2, #0x60] + cmp r1, #0 + beq _02241028 + ldr r0, [r2] + bl ov45_022504E0 + ldr r0, _02241044 ; =ov45_022577DC + ldr r4, [r0] + cmp r4, #0 + beq _0224103C + beq _02241018 + mov r0, r4 + bl ov45_02242858 + cmp r4, #0 + beq _02241018 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02241018: + ldr r0, _02241044 ; =ov45_022577DC + mov r1, #0 + str r1, [r0] + b _0224103C +_02241028: + mov r1, #4 + str r1, [r2, #4] + ldr r0, [r0] + ldr r0, [r0] + bl ov45_022504E0 +_0224103C: + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02241044: .word ov45_022577DC + arm_func_end ov45_02240F9C + + arm_func_start ov45_02241048 +ov45_02241048: ; 0x02241048 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x88 + ldr r4, _02241288 ; =ov45_022577DC + mov r8, r0 + ldr r4, [r4] + mov r7, r1 + cmp r4, #0 + mov r6, r2 + mov r5, r3 + addeq sp, sp, #0x88 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + beq _02241090 + ldr r0, [r4, #4] + cmp r0, #5 + addeq sp, sp, #0x88 + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_02241090: + cmp r4, #0 + beq _022410B4 + ldr r0, _02241288 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x88 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_022410B4: + mov r0, r8 + bl strlen + mov r0, #0x10 + bl ov45_02242394 + cmp r0, #0 + beq _02241108 + ldr r2, _0224128C ; =ov45_02255238 + ldr r1, _02241290 ; =ov45_022577E0 + str r2, [r0] + mov ip, #0 + ldr r2, [r1] + ldr r3, [sp, #0xa4] + str ip, [r0, #4] + str r3, [r0, #8] + add ip, r2, #1 + ldr r3, _02241294 ; =ov45_02255280 + str r2, [r0, #4] + ldr r2, [sp, #0xa0] + str r3, [r0] + str ip, [r1] + str r2, [r0, #0xc] +_02241108: + str r0, [sp, #0x10] + add r0, sp, #0x14 + add r2, sp, #0x10 + add r1, r4, #0x90 + bl ov45_0224206C + mov r1, #0 + ldr r0, [sp, #0x10] + strb r1, [sp, #0xc] + strb r1, [sp, #0xd] + ldr r1, [r0] + ldr r1, [r1, #8] + blx r1 + mov r4, r0 + add r0, sp, #0x4c + mov r1, r8 + bl ov45_02237B58 + ldr r1, _02241288 ; =ov45_022577DC + add r0, sp, #0x40 + ldr r1, [r1] + add r2, sp, #0x4c + bl ov45_022428C8 + ldr r0, [sp, #0x40] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x41 + ldrne r1, [sp, #0x48] + add r0, sp, #0x34 + bl ov45_02237B58 + ldr r0, _02241288 ; =ov45_022577DC + add r1, sp, #0x34 + ldr r0, [r0] + mov r2, r5 + mov r3, r6 + bl ov45_02242ACC + add r0, sp, #0x34 + bl ov45_02237BC8 + add r0, sp, #0x40 + bl ov45_02237BC8 + add r0, sp, #0x4c + bl ov45_02237BC8 + add r0, sp, #0x58 + mov r1, #0 + mov r2, #0x30 + bl MI_CpuFill8 + ldr r0, _02241298 ; =ov45_0223F8F4 + ldr r2, _0224129C ; =ov45_0223F1E4 + str r0, [sp, #0x70] + ldr r0, _022412A0 ; =ov45_0223F83C + str r2, [sp, #0x58] + ldr r2, _022412A4 ; =ov45_0223F2D8 + str r0, [sp, #0x6c] + ldr r0, _022412A8 ; =ov45_0223F32C + str r2, [sp, #0x5c] + ldr r2, _022412AC ; =ov45_0223F5C8 + str r0, [sp, #0x60] + ldr r0, _022412B0 ; =ov45_0223F768 + str r2, [sp, #0x64] + ldr r2, _022412B4 ; =ov45_0223F910 + str r0, [sp, #0x74] + ldr r0, _022412B8 ; =ov45_02240620 + str r2, [sp, #0x78] + ldr r2, _022412BC ; =ov45_0223F6F4 + str r0, [sp, #0x80] + str r2, [sp, #0x68] + ldr r2, [r5, #0x14] + mov r1, r8 + add r0, sp, #0x28 + str r2, [sp, #0x84] + bl ov45_02237B58 + ldr r1, _02241288 ; =ov45_022577DC + add r0, sp, #0x1c + ldr r1, [r1] + add r2, sp, #0x28 + bl ov45_022428C8 + ldr r0, [sp, #0x1c] + mov r2, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x1d + ldrne r1, [sp, #0x24] + ldr r0, _022412C0 ; =ov45_02240234 + add r3, sp, #0x58 + stmia sp, {r0, r4} + str r2, [sp, #8] + ldr r0, _02241288 ; =ov45_022577DC + mov r2, r7 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_02250688 + add r0, sp, #0x1c + bl ov45_02237BC8 + add r0, sp, #0x28 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02241288: .word ov45_022577DC +_0224128C: .word ov45_02255238 +_02241290: .word ov45_022577E0 +_02241294: .word ov45_02255280 +_02241298: .word ov45_0223F8F4 +_0224129C: .word ov45_0223F1E4 +_022412A0: .word ov45_0223F83C +_022412A4: .word ov45_0223F2D8 +_022412A8: .word ov45_0223F32C +_022412AC: .word ov45_0223F5C8 +_022412B0: .word ov45_0223F768 +_022412B4: .word ov45_0223F910 +_022412B8: .word ov45_02240620 +_022412BC: .word ov45_0223F6F4 +_022412C0: .word ov45_02240234 + arm_func_end ov45_02241048 + + arm_func_start ov45_022412C4 +ov45_022412C4: ; 0x022412C4 + ldr r0, [r0, #4] + bx lr + arm_func_end ov45_022412C4 + + arm_func_start ov45_022412CC +ov45_022412CC: ; 0x022412CC + stmdb sp!, {r4, lr} + sub sp, sp, #0x30 + ldr r1, _022413D0 ; =ov45_022577DC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + addeq sp, sp, #0x30 + moveq r0, #4 + ldmeqia sp!, {r4, pc} + beq _02241308 + ldr r0, [r1, #4] + cmp r0, #5 + addeq sp, sp, #0x30 + moveq r0, #7 + ldmeqia sp!, {r4, pc} +_02241308: + cmp r1, #0 + beq _0224132C + ldr r0, _022413D0 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x30 + movne r0, #4 + ldmneia sp!, {r4, pc} +_0224132C: + add r0, sp, #0x24 + mov r1, r4 + bl ov45_02237B58 + ldr r1, _022413D0 ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + add r2, sp, #0x24 + bl ov45_022428C8 + ldr r0, [sp, #0x18] + mov r2, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _022413D0 ; =ov45_022577DC + addeq r1, sp, #0x19 + ldr r0, [r0] + ldrne r1, [sp, #0x20] + ldr r0, [r0] + bl ov45_022507D8 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0xc + mov r1, r4 + bl ov45_02237B58 + ldr r1, _022413D0 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428C8 + ldr r0, _022413D0 ; =ov45_022577DC + add r1, sp, #0 + ldr r0, [r0] + bl ov45_0224335C + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x30 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022413D0: .word ov45_022577DC + arm_func_end ov45_022412CC + + arm_func_start ov45_022413D4 +ov45_022413D4: ; 0x022413D4 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + ldr r2, _022414BC ; =ov45_022577DC + mov r5, r0 + ldr r2, [r2] + mov r4, r1 + cmp r2, #0 + addeq sp, sp, #0x18 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, pc} + beq _02241414 + ldr r0, [r2, #4] + cmp r0, #5 + addeq sp, sp, #0x18 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, pc} +_02241414: + cmp r2, #0 + beq _02241438 + ldr r0, _022414BC ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x18 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, pc} +_02241438: + mov r0, r4 + bl strlen + add r0, r0, #1 + cmp r0, #0x190 + addhi sp, sp, #0x18 + movhi r0, #3 + ldmhiia sp!, {r3, r4, r5, pc} + add r0, sp, #0xc + mov r1, r5 + bl ov45_02237B58 + ldr r1, _022414BC ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428C8 + ldr r0, [sp] + mov r2, r4 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _022414BC ; =ov45_022577DC + addeq r1, sp, #1 + ldr r0, [r0] + ldrne r1, [sp, #8] + ldr r0, [r0] + mov r3, #3 + bl ov45_0225089C + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022414BC: .word ov45_022577DC + arm_func_end ov45_022413D4 + + arm_func_start ov45_022414C0 +ov45_022414C0: ; 0x022414C0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr r2, _022415C4 ; =ov45_022577DC + mov r6, r0 + ldr r4, [r2] + mov r5, r1 + cmp r4, #0 + addeq sp, sp, #0xc + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + beq _02241500 + ldr r0, [r4, #4] + cmp r0, #5 + addeq sp, sp, #0xc + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, r6, pc} +_02241500: + cmp r4, #0 + beq _02241524 + ldr r0, _022415C4 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0xc + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, pc} +_02241524: + mov r0, r5 + bl strlen + add r0, r0, #1 + cmp r0, #0x190 + addhi sp, sp, #0xc + movhi r0, #3 + ldmhiia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #0 + mov r1, r4 + mov r2, r6 + bl ov45_0224367C + ldr r1, _022415C8 ; =ov45_02255304 + add r0, sp, #0 + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _02241584 + add r0, sp, #0 + bl ov45_02237BC8 + add sp, sp, #0xc + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, pc} +_02241584: + ldr r0, [sp] + mov r2, r5 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _022415C4 ; =ov45_022577DC + addeq r1, sp, #1 + ldr r0, [r0] + ldrne r1, [sp, #8] + ldr r0, [r0] + mov r3, #3 + bl ov45_02251350 + add r0, sp, #0 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_022415C4: .word ov45_022577DC +_022415C8: .word ov45_02255304 + arm_func_end ov45_022414C0 + + arm_func_start ov45_022415CC +ov45_022415CC: ; 0x022415CC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x38 + ldr r2, _022417AC ; =ov45_022577DC + mov r5, r0 + ldr r2, [r2] + mov r4, r1 + cmp r2, #0 + addeq sp, sp, #0x38 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr + beq _02241620 + ldr r0, [r2, #4] + cmp r0, #5 + addeq sp, sp, #0x38 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr +_02241620: + cmp r2, #0 + beq _0224164C + ldr r0, _022417AC ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x38 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, lr} + addne sp, sp, #0x10 + bxne lr +_0224164C: + ldr r0, [sp, #0x54] + bl strlen + add r0, r0, #1 + cmp r0, #0x190 + bhi _02241674 + ldr r0, [sp, #0x50] + bl strlen + add r0, r0, #1 + cmp r0, #0x14 + bls _02241688 +_02241674: + add sp, sp, #0x38 + mov r0, #3 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02241688: + ldr r1, _022417B0 ; =ov45_02255304 + add r0, sp, #0x2c + bl ov45_02237B58 + mvn r0, #0 + cmp r4, r0 + bne _022416B0 + ldr r1, _022417B0 ; =ov45_02255304 + add r0, sp, #0x2c + bl ov45_0223DAD4 + b _02241714 +_022416B0: + ldr r1, _022417AC ; =ov45_022577DC + add r0, sp, #0x20 + ldr r1, [r1] + mov r2, r4 + bl ov45_0224367C + add r0, sp, #0x2c + add r1, sp, #0x20 + bl ov45_02237D48 + add r0, sp, #0x20 + bl ov45_02237BC8 + ldr r1, _022417B0 ; =ov45_02255304 + add r0, sp, #0x2c + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _02241714 + add r0, sp, #0x2c + bl ov45_02237BC8 + add sp, sp, #0x38 + mov r0, #3 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_02241714: + add r0, sp, #0x14 + mov r1, r5 + bl ov45_02237B58 + ldr r1, _022417AC ; =ov45_022577DC + add r0, sp, #8 + ldr r1, [r1] + add r2, sp, #0x14 + bl ov45_022428C8 + ldr r0, [sp, #0x2c] + add r3, sp, #0x54 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, [sp, #8] + addeq r2, sp, #0x2d + mov r0, r0, lsl #0x1f + ldrne r2, [sp, #0x34] + movs r0, r0, lsr #0x1f + addeq r1, sp, #9 + ldrne r1, [sp, #0x10] + add r0, sp, #0x50 + str r0, [sp] + str r3, [sp, #4] + ldr r0, _022417AC ; =ov45_022577DC + mov r3, #1 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_02251554 + add r0, sp, #8 + bl ov45_02237BC8 + add r0, sp, #0x14 + bl ov45_02237BC8 + add r0, sp, #0x2c + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_022417AC: .word ov45_022577DC +_022417B0: .word ov45_02255304 + arm_func_end ov45_022415CC + + arm_func_start ov45_022417B4 +ov45_022417B4: ; 0x022417B4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x50 + ldr r2, _02241A08 ; =ov45_022577DC + mov r6, r0 + ldr r2, [r2] + mov r4, r1 + cmp r2, #0 + mov r5, r3 + addeq sp, sp, #0x50 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr + beq _0224180C + ldr r0, [r2, #4] + cmp r0, #5 + addeq sp, sp, #0x50 + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, lr} + addeq sp, sp, #0x10 + bxeq lr +_0224180C: + cmp r2, #0 + beq _02241838 + ldr r0, _02241A08 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x50 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, lr} + addne sp, sp, #0x10 + bxne lr +_02241838: + ldr r0, [sp, #0x68] + bl strlen + add r0, r0, #1 + cmp r0, #0x14 + addhi sp, sp, #0x50 + movhi r0, #3 + ldmhiia sp!, {r4, r5, r6, lr} + addhi sp, sp, #0x10 + bxhi lr + ldr r1, _02241A0C ; =ov45_02255304 + add r0, sp, #0x44 + bl ov45_02237B58 + mvn r0, #0 + cmp r4, r0 + bne _02241884 + ldr r1, _02241A0C ; =ov45_02255304 + add r0, sp, #0x44 + bl ov45_0223DAD4 + b _022418E8 +_02241884: + ldr r1, _02241A08 ; =ov45_022577DC + add r0, sp, #0x38 + ldr r1, [r1] + mov r2, r4 + bl ov45_0224367C + add r0, sp, #0x44 + add r1, sp, #0x38 + bl ov45_02237D48 + add r0, sp, #0x38 + bl ov45_02237BC8 + ldr r1, _02241A0C ; =ov45_02255304 + add r0, sp, #0x44 + bl ov45_02237FD8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _022418E8 + add r0, sp, #0x44 + bl ov45_02237BC8 + add sp, sp, #0x50 + mov r0, #3 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr +_022418E8: + ldr r1, _02241A08 ; =ov45_022577DC + mov r0, #0x10 + ldr r4, [r1] + bl ov45_02242394 + cmp r0, #0 + beq _02241934 + ldr r2, _02241A10 ; =ov45_02255238 + ldr r1, _02241A14 ; =ov45_022577E0 + str r2, [r0] + mov r3, #0 + ldr r2, [sp, #0x70] + str r3, [r0, #4] + ldr ip, [r1] + str r2, [r0, #8] + ldr r2, _02241A18 ; =ov45_02255268 + add r3, ip, #1 + stmia r0, {r2, ip} + str r3, [r1] + str r5, [r0, #0xc] +_02241934: + str r0, [sp, #0x14] + add r0, sp, #0x18 + add r2, sp, #0x14 + add r1, r4, #0x90 + bl ov45_0224206C + mov r1, #0 + ldr r0, [sp, #0x14] + strb r1, [sp, #0x10] + strb r1, [sp, #0x11] + ldr r1, [r0] + ldr r1, [r1, #8] + blx r1 + mov r4, r0 + add r0, sp, #0x2c + mov r1, r6 + bl ov45_02237B58 + ldr r1, _02241A08 ; =ov45_022577DC + add r0, sp, #0x20 + ldr r1, [r1] + add r2, sp, #0x2c + bl ov45_022428C8 + ldr r0, [sp, #0x44] + add r3, sp, #0x68 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, [sp, #0x20] + addeq r2, sp, #0x45 + mov r0, r0, lsl #0x1f + ldrne r2, [sp, #0x4c] + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x21 + ldrne r1, [sp, #0x28] + ldr r0, _02241A1C ; =ov45_02240494 + str r3, [sp] + stmib sp, {r0, r4} + mov r3, #0 + str r3, [sp, #0xc] + ldr r0, _02241A08 ; =ov45_022577DC + mov r3, #1 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_022518F0 + add r0, sp, #0x20 + bl ov45_02237BC8 + add r0, sp, #0x2c + bl ov45_02237BC8 + add r0, sp, #0x44 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x50 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02241A08: .word ov45_022577DC +_02241A0C: .word ov45_02255304 +_02241A10: .word ov45_02255238 +_02241A14: .word ov45_022577E0 +_02241A18: .word ov45_02255268 +_02241A1C: .word ov45_02240494 + arm_func_end ov45_022417B4 + + arm_func_start ov45_02241A20 +ov45_02241A20: ; 0x02241A20 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + ldr r3, _02241B6C ; =ov45_022577DC + mov r7, r0 + ldr r4, [r3] + mov r6, r1 + cmp r4, #0 + mov r5, r2 + addeq sp, sp, #0x30 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + beq _02241A64 + ldr r0, [r4, #4] + cmp r0, #5 + addeq sp, sp, #0x30 + moveq r0, #7 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_02241A64: + cmp r4, #0 + beq _02241A88 + ldr r0, _02241B6C ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x30 + movne r0, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_02241A88: + mov r0, #0x10 + bl ov45_02242394 + cmp r0, #0 + beq _02241AC4 + ldr r2, _02241B70 ; =ov45_02255238 + ldr r1, _02241B74 ; =ov45_022577E0 + str r2, [r0] + mov r2, #0 + ldr ip, [r1] + stmib r0, {r2, r5} + ldr r2, _02241B78 ; =ov45_022552B0 + add r3, ip, #1 + stmia r0, {r2, ip} + str r3, [r1] + str r6, [r0, #0xc] +_02241AC4: + str r0, [sp, #0xc] + add r0, sp, #0x10 + add r2, sp, #0xc + add r1, r4, #0x90 + bl ov45_0224206C + mov r1, #0 + ldr r0, [sp, #0xc] + strb r1, [sp, #8] + strb r1, [sp, #9] + ldr r1, [r0] + ldr r1, [r1, #8] + blx r1 + mov r4, r0 + add r0, sp, #0x24 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02241B6C ; =ov45_022577DC + add r0, sp, #0x18 + ldr r1, [r1] + add r2, sp, #0x24 + bl ov45_022428C8 + ldr r0, [sp, #0x18] + mov r2, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x19 + ldrne r1, [sp, #0x20] + ldr r0, _02241B6C ; =ov45_022577DC + str r4, [sp] + str r2, [sp, #4] + ldr r0, [r0] + ldr r2, _02241B7C ; =ov45_0223FE20 + ldr r0, [r0] + ldr r3, _02241B80 ; =ov45_0223FC6C + bl ov45_022505A0 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02241B6C: .word ov45_022577DC +_02241B70: .word ov45_02255238 +_02241B74: .word ov45_022577E0 +_02241B78: .word ov45_022552B0 +_02241B7C: .word ov45_0223FE20 +_02241B80: .word ov45_0223FC6C + arm_func_end ov45_02241A20 + + arm_func_start ov45_02241B84 +ov45_02241B84: ; 0x02241B84 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + ldr r3, _02241D44 ; =ov45_022577DC + mov r7, r0 + ldr r3, [r3] + mov r6, r1 + cmp r3, #0 + mov r5, r2 + addeq sp, sp, #0x44 + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, pc} + beq _02241BC8 + ldr r0, [r3, #4] + cmp r0, #5 + addeq sp, sp, #0x44 + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, r7, pc} +_02241BC8: + cmp r3, #0 + beq _02241BEC + ldr r0, _02241D44 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x44 + movne r0, #4 + ldmneia sp!, {r4, r5, r6, r7, pc} +_02241BEC: + add r0, sp, #0x38 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02241D44 ; =ov45_022577DC + add r0, sp, #0x2c + ldr r1, [r1] + add r2, sp, #0x38 + bl ov45_022428C8 + ldr r0, [sp, #0x2c] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _02241D44 ; =ov45_022577DC + addeq r1, sp, #0x2d + ldr r0, [r0] + ldrne r1, [sp, #0x34] + ldr r0, [r0] + bl ov45_02251024 + cmp r0, #0 + moveq r4, #1 + add r0, sp, #0x2c + movne r4, #0 + bl ov45_02237BC8 + add r0, sp, #0x38 + bl ov45_02237BC8 + cmp r4, #0 + addne sp, sp, #0x44 + movne r0, #5 + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r1, _02241D44 ; =ov45_022577DC + mov r0, #0x10 + ldr r4, [r1] + bl ov45_02242394 + cmp r0, #0 + beq _02241CA0 + ldr r2, _02241D48 ; =ov45_02255238 + ldr r1, _02241D4C ; =ov45_022577E0 + str r2, [r0] + mov r2, #0 + ldr ip, [r1] + stmib r0, {r2, r5} + ldr r2, _02241D50 ; =ov45_02255298 + add r3, ip, #1 + stmia r0, {r2, ip} + str r3, [r1] + str r6, [r0, #0xc] +_02241CA0: + str r0, [sp, #8] + add r0, sp, #0xc + add r2, sp, #8 + add r1, r4, #0x90 + bl ov45_0224206C + mov r1, #0 + ldr r0, [sp, #8] + strb r1, [sp, #4] + strb r1, [sp, #5] + ldr r1, [r0] + ldr r1, [r1, #8] + blx r1 + mov r4, r0 + add r0, sp, #0x20 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02241D44 ; =ov45_022577DC + add r0, sp, #0x14 + ldr r1, [r1] + add r2, sp, #0x20 + bl ov45_022428C8 + ldr r0, [sp, #0x14] + mov r2, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x15 + ldrne r1, [sp, #0x1c] + ldr r0, _02241D44 ; =ov45_022577DC + str r2, [sp] + ldr r0, [r0] + ldr r2, _02241D54 ; =ov45_0223FE28 + ldr r0, [r0] + mov r3, r4 + bl ov45_02251208 + add r0, sp, #0x14 + bl ov45_02237BC8 + add r0, sp, #0x20 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02241D44: .word ov45_022577DC +_02241D48: .word ov45_02255238 +_02241D4C: .word ov45_022577E0 +_02241D50: .word ov45_02255298 +_02241D54: .word ov45_0223FE28 + arm_func_end ov45_02241B84 + + arm_func_start ov45_02241D58 +ov45_02241D58: ; 0x02241D58 + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + ldr r2, _02241E20 ; =ov45_022577DC + mov r4, r1 + ldr r2, [r2] + mov r3, r0 + cmp r2, #0 + addeq sp, sp, #0x18 + moveq r0, #4 + ldmeqia sp!, {r4, pc} + beq _02241D98 + ldr r0, [r2, #4] + cmp r0, #5 + addeq sp, sp, #0x18 + moveq r0, #7 + ldmeqia sp!, {r4, pc} +_02241D98: + cmp r2, #0 + beq _02241DBC + ldr r0, _02241E20 ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x18 + movne r0, #4 + ldmneia sp!, {r4, pc} +_02241DBC: + add r0, sp, #0xc + mov r1, r3 + bl ov45_02237B58 + ldr r1, _02241E20 ; =ov45_022577DC + add r0, sp, #0 + ldr r1, [r1] + add r2, sp, #0xc + bl ov45_022428C8 + ldr r0, [sp] + mov r2, r4 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldr r0, _02241E20 ; =ov45_022577DC + addeq r1, sp, #1 + ldr r0, [r0] + ldrne r1, [sp, #8] + ldr r0, [r0] + bl ov45_02250A80 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02241E20: .word ov45_022577DC + arm_func_end ov45_02241D58 + + arm_func_start ov45_02241E24 +ov45_02241E24: ; 0x02241E24 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + ldr r3, _02241F6C ; =ov45_022577DC + mov r7, r0 + ldr r4, [r3] + mov r6, r1 + cmp r4, #0 + mov r5, r2 + addeq sp, sp, #0x2c + moveq r0, #4 + ldmeqia sp!, {r4, r5, r6, r7, pc} + beq _02241E68 + ldr r0, [r4, #4] + cmp r0, #5 + addeq sp, sp, #0x2c + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, r7, pc} +_02241E68: + cmp r4, #0 + beq _02241E8C + ldr r0, _02241F6C ; =ov45_022577DC + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + addne sp, sp, #0x2c + movne r0, #4 + ldmneia sp!, {r4, r5, r6, r7, pc} +_02241E8C: + mov r0, #0x10 + bl ov45_02242394 + cmp r0, #0 + beq _02241EC8 + ldr r2, _02241F70 ; =ov45_02255238 + ldr r1, _02241F74 ; =ov45_022577E0 + str r2, [r0] + mov r2, #0 + ldr ip, [r1] + stmib r0, {r2, r5} + ldr r2, _02241F78 ; =ov45_02255250 + add r3, ip, #1 + stmia r0, {r2, ip} + str r3, [r1] + str r6, [r0, #0xc] +_02241EC8: + str r0, [sp, #8] + add r0, sp, #0xc + add r2, sp, #8 + add r1, r4, #0x90 + bl ov45_0224206C + mov r1, #0 + ldr r0, [sp, #8] + strb r1, [sp, #4] + strb r1, [sp, #5] + ldr r1, [r0] + ldr r1, [r1, #8] + blx r1 + mov r4, r0 + add r0, sp, #0x20 + mov r1, r7 + bl ov45_02237B58 + ldr r1, _02241F6C ; =ov45_022577DC + add r0, sp, #0x14 + ldr r1, [r1] + add r2, sp, #0x20 + bl ov45_022428C8 + ldr r0, [sp, #0x14] + mov r2, #0 + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r1, sp, #0x15 + ldrne r1, [sp, #0x1c] + ldr r0, _02241F6C ; =ov45_022577DC + str r2, [sp] + ldr r0, [r0] + ldr r2, _02241F7C ; =ov45_02240718 + ldr r0, [r0] + mov r3, r4 + bl ov45_02250C80 + add r0, sp, #0x14 + bl ov45_02237BC8 + add r0, sp, #0x20 + bl ov45_02237BC8 + mov r0, #0 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02241F6C: .word ov45_022577DC +_02241F70: .word ov45_02255238 +_02241F74: .word ov45_022577E0 +_02241F78: .word ov45_02255250 +_02241F7C: .word ov45_02240718 + arm_func_end ov45_02241E24 + + arm_func_start ov45_02241F80 +ov45_02241F80: ; 0x02241F80 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _02241F9C + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02241F9C: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02241F80 + + arm_func_start ov45_02241FA4 +ov45_02241FA4: ; 0x02241FA4 + bx lr + arm_func_end ov45_02241FA4 + + arm_func_start ov45_02241FA8 +ov45_02241FA8: ; 0x02241FA8 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _02241FC4 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02241FC4: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02241FA8 + + arm_func_start ov45_02241FCC +ov45_02241FCC: ; 0x02241FCC + bx lr + arm_func_end ov45_02241FCC + + arm_func_start ov45_02241FD0 +ov45_02241FD0: ; 0x02241FD0 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _02241FEC + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02241FEC: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02241FD0 + + arm_func_start ov45_02241FF4 +ov45_02241FF4: ; 0x02241FF4 + bx lr + arm_func_end ov45_02241FF4 + + arm_func_start ov45_02241FF8 +ov45_02241FF8: ; 0x02241FF8 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _02242014 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02242014: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02241FF8 + + arm_func_start ov45_0224201C +ov45_0224201C: ; 0x0224201C + bx lr + arm_func_end ov45_0224201C + + arm_func_start ov45_02242020 +ov45_02242020: ; 0x02242020 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _0224203C + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_0224203C: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02242020 + + arm_func_start ov45_02242044 +ov45_02242044: ; 0x02242044 + bx lr + arm_func_end ov45_02242044 + + arm_func_start ov45_02242048 +ov45_02242048: ; 0x02242048 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _02242064 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02242064: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02242048 + + arm_func_start ov45_0224206C +ov45_0224206C: ; 0x0224206C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r4, r2 + mov r5, r1 + mov r6, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r5 + mov r1, r4 + str ip, [sp] + bl ov45_02242320 + ldr r3, [sp, #8] + mov r1, r0 + cmp r3, #0 + beq _022420C4 + ldr r2, [r3, #0xc] + ldr r0, [r4] + ldr r2, [r2, #4] + ldr r0, [r0, #4] + cmp r2, r0 + bhs _022420F0 +_022420C4: + str r4, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r5 + bl ov45_0224210C + ldr r1, _02242108 ; =ov45_02255228 + str r0, [r6] + ldrb r0, [r1, #1] + add sp, sp, #0xc + strb r0, [r6, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_022420F0: + ldr r0, _02242108 ; =ov45_02255228 + str r3, [r6] + ldrb r0, [r0, #2] + strb r0, [r6, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02242108: .word ov45_02255228 + arm_func_end ov45_0224206C + + arm_func_start ov45_0224210C +ov45_0224210C: ; 0x0224210C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + mov r8, r0 + ldr r4, [r8] + mvn r0, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp r4, r0 + bne _02242140 + ldr r0, _022421E0 ; =ov45_0225533C + bl printf + bl abort +_02242140: + mov r1, #0 + mov r0, #0x10 + strb r1, [sp] + bl ov45_02242394 + mov r4, r0 + add r0, r8, #4 + str r0, [sp, #0xc] + adds r1, r4, #0xc + ldrne r0, [sp, #0x30] + str r4, [sp, #0x10] + ldrne r0, [r0] + str r4, [sp, #4] + strne r0, [r1] + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r7, [r0] + cmp r6, #0 + strne r4, [r7] + streq r4, [r7, #4] + ldr r1, [r8] + mov r0, r4 + add r1, r1, #1 + str r1, [r8] + ldr r1, [r8, #4] + str r4, [sp, #8] + bl ov45_02236EC4 + cmp r5, #0 + ldr r1, [sp, #0x10] + strne r4, [r8, #8] + cmp r1, #0 + beq _022421D4 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_022421D4: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022421E0: .word ov45_0225533C + arm_func_end ov45_0224210C + + arm_func_start ov45_022421E4 +ov45_022421E4: ; 0x022421E4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5, #4] + mov r0, #0 + strb r0, [sp, #2] + ldr r1, [r5, #4] + mov r4, r2 + sub r1, r1, r3 + str r1, [r5, #4] + ldr r1, [r5] + cmp r1, #0 + beq _0224222C + beq _02242220 + mov r2, r0 + bl ov00_021EC2EC +_02242220: + mov r0, #0 + str r0, [r5] + str r0, [r5, #8] +_0224222C: + mov r3, #0 + strb r3, [sp] + sub r0, sp, #4 + strb r3, [r0] + ldr r2, [r0] + mov r0, r5 + mov r1, r4 + strb r3, [sp, #1] + bl ov45_0223EA04 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022421E4 + + arm_func_start ov45_02242254 +ov45_02242254: ; 0x02242254 + stmdb sp!, {r3, lr} + ldr r3, [r1] + mov r3, r3, lsl #0x1f + movs r3, r3, lsr #0x1f + ldmneib r1, {r3, ip} + bne _0224227C + ldrb r3, [r1] + add ip, r1, #1 + mov r1, r3, lsl #0x18 + mov r3, r1, lsr #0x19 +_0224227C: + mov r1, ip + bl ov45_02242288 + ldmia sp!, {r3, pc} + arm_func_end ov45_02242254 + + arm_func_start ov45_02242288 +ov45_02242288: ; 0x02242288 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, [r0] + mov ip, ip, lsl #0x1f + movs ip, ip, lsr #0x1f + ldrne lr, [r0, #8] + ldrne r0, [r0, #4] + bne _022422B4 + ldrb ip, [r0] + add lr, r0, #1 + mov r0, ip, lsl #0x18 + mov r0, r0, lsr #0x19 +_022422B4: + cmp r2, r0 + bhs _02242318 + cmp r3, #0 + beq _02242318 + add ip, lr, r0 + add r4, lr, r2 + cmp r4, ip + bhs _02242318 + mov r2, #0 +_022422D8: + mov r5, r1 + mov r6, r2 + cmp r3, #0 + bls _0224230C + ldrsb r7, [r4] +_022422EC: + ldrsb r0, [r5] + cmp r7, r0 + subeq r0, r4, lr + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r6, r6, #1 + cmp r6, r3 + add r5, r5, #1 + blo _022422EC +_0224230C: + add r4, r4, #1 + cmp r4, ip + blo _022422D8 +_02242318: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02242288 + + arm_func_start ov45_02242320 +ov45_02242320: ; 0x02242320 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_02242354: + ldr r4, [r1] + ldr r0, [r6, #0xc] + ldr r5, [r4, #4] + ldr r4, [r0, #4] + mov r0, r6 + cmp r5, r4 + ldrlo r6, [r6] + strlob lr, [r3] + blo _02242388 + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_02242388: + cmp r6, #0 + bne _02242354 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02242320 + + arm_func_start ov45_02242394 +ov45_02242394: ; 0x02242394 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + ldr r4, _022423DC ; =ov45_022577E4 + moveq r6, #1 + mov r5, #0 +_022423A8: + mov r0, r5 + mov r1, r6 + bl ov00_021EC2A8 + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r4] + str r0, [r4] + cmp r0, #0 + beq _022423D4 + blx r0 + b _022423A8 +_022423D4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022423DC: .word ov45_022577E4 + arm_func_end ov45_02242394 + + arm_func_start ov45_022423E0 +ov45_022423E0: ; 0x022423E0 + stmdb sp!, {r3, lr} + ldr r0, _02242404 ; =ov45_022577E8 + ldr r0, [r0] + ldr r0, [r0] + bl ov45_022504E0 + ldr r0, _02242408 ; =ov45_022577E4 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02242404: .word ov45_022577E8 +_02242408: .word ov45_022577E4 + arm_func_end ov45_022423E0 + + arm_func_start ov45_0224240C +ov45_0224240C: ; 0x0224240C + stmdb sp!, {r3, lr} + ldr r0, _02242460 ; =ov45_022577E8 + ldr r1, [r0, #4] + cmp r1, #0 + beq _02242438 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + ldr r0, _02242460 ; =ov45_022577E8 + mov r1, #0 + str r1, [r0, #4] +_02242438: + ldr r0, _02242460 ; =ov45_022577E8 + mov r1, #2 + ldr r3, [r0] + mov r2, #5 + str r1, [r3, #0x58] + ldr r1, _02242464 ; =ov45_022423E0 + ldr r0, _02242468 ; =ov45_022577E4 + str r2, [r3, #4] + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02242460: .word ov45_022577E8 +_02242464: .word ov45_022423E0 +_02242468: .word ov45_022577E4 + arm_func_end ov45_0224240C + + arm_func_start ov45_0224246C +ov45_0224246C: ; 0x0224246C + stmdb sp!, {r3, lr} + ldr r1, _022424D0 ; =ov45_022577E8 + str r0, [r1] + ldr r1, [r1, #4] + cmp r1, #0 + beq _0224249C + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + ldr r0, _022424D0 ; =ov45_022577E8 + mov r1, #0 + str r1, [r0, #4] +_0224249C: + mov r0, #0 + mov r1, #0x400 + bl ov00_021EC2A8 + ldr r1, _022424D0 ; =ov45_022577E8 + cmp r0, #0 + str r0, [r1, #4] + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _022424D4 ; =ov45_0224240C + ldr r1, _022424D8 ; =ov45_022577E4 + mov r0, #1 + str r2, [r1] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022424D0: .word ov45_022577E8 +_022424D4: .word ov45_0224240C +_022424D8: .word ov45_022577E4 + arm_func_end ov45_0224246C + + arm_func_start ov45_022424DC +ov45_022424DC: ; 0x022424DC + stmdb sp!, {r3, lr} + ldr r0, _0224250C ; =ov45_022577E8 + ldr r1, [r0, #4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + ldr r0, _0224250C ; =ov45_022577E8 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_0224250C: .word ov45_022577E8 + arm_func_end ov45_022424DC + + arm_func_start ov45_02242510 +ov45_02242510: ; 0x02242510 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov r4, r0 + ldr lr, _0224259C ; =ov45_02255238 + add r3, sp, #0x10 + str r1, [sp, #0x14] + mov ip, #0 + add r0, sp, #4 + add r2, sp, #8 + mov r1, r4 + str lr, [sp, #0x10] + str ip, [sp, #0x18] + str r3, [sp, #8] + bl ov45_0223FD8C + ldr r1, [sp, #4] + add r0, r4, #4 + cmp r1, r0 + str r1, [sp, #0xc] + addeq sp, sp, #0x1c + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r0, [r1, #0xc] + cmp r0, #0 + beq _0224257C + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_0224257C: + add r1, sp, #0xc + ldr r2, [r1] + add r0, sp, #0 + mov r1, r4 + bl ov45_0224261C + mov r0, #1 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224259C: .word ov45_02255238 + arm_func_end ov45_02242510 + + arm_func_start ov45_022425A0 +ov45_022425A0: ; 0x022425A0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r5, r0 + ldr r0, [r5, #8] + add r4, r5, #4 + str r0, [sp, #8] + cmp r0, r4 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r8, sp, #8 + add r7, sp, #0 + add r6, sp, #4 +_022425D0: + ldr r0, [r0, #0xc] + cmp r0, #0 + beq _022425E8 + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 +_022425E8: + ldr r1, [sp, #8] + mov r0, r8 + str r1, [sp, #4] + bl ov45_02236E58 + ldr r2, [r6] + mov r0, r7 + mov r1, r5 + bl ov45_0224261C + ldr r0, [sp, #8] + cmp r0, r4 + bne _022425D0 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end ov45_022425A0 + + arm_func_start ov45_0224261C +ov45_0224261C: ; 0x0224261C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #8] + mov r6, r0 + cmp r4, r1 + bne _0224264C + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #8] +_0224264C: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + cmp r4, #0 + beq _02242674 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02242674: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0224261C + + arm_func_start ov45_0224268C +ov45_0224268C: ; 0x0224268C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x84 + mov r5, r0 + mov r0, #0 + mov r7, r1 + str r0, [r5] + str r0, [r5, #4] + ldr ip, [sp, #0x98] + ldr r1, [sp, #0x9c] + add r0, r5, #0xc + mov r6, r2 + mov r4, r3 + str ip, [r5, #8] + bl ov45_02237A24 + ldr r1, [sp, #0xa0] + add r0, r5, #0x18 + bl ov45_02237A24 + ldr r1, [sp, #0xa4] + add r0, r5, #0x24 + bl ov45_02237A24 + mov r1, r7 + add r0, r5, #0x30 + bl ov45_02237A24 + mov r1, r6 + add r0, r5, #0x3c + bl ov45_02237A24 + mov r1, #0 + add r0, r5, #0x48 + mov ip, r1 +_02242700: + str ip, [r0, r1, lsl #2] + add r1, r1, #1 + cmp r1, #3 + blo _02242700 + str ip, [r5, #0x54] + str ip, [r5, #0x58] + str ip, [r5, #0x5c] + ldr r0, [sp, #0xa8] + str ip, [r5, #0x60] + add r3, r5, #0x64 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + str ip, [r5, #0x70] + str ip, [r5, #0x74] + add r0, r5, #0x74 + str r0, [r5, #0x7c] + str ip, [r5, #0x80] + str ip, [r5, #0x84] + add r0, r5, #0x84 + str r0, [r5, #0x8c] + str ip, [r5, #0x90] + str ip, [r5, #0x94] + add r0, r5, #0x94 + str r0, [r5, #0x98] + str ip, [r5, #0x9c] + str ip, [r5, #0xa0] + add r0, r5, #0xa0 + ldr lr, _0224284C ; =ov45_02254DC4 + str r0, [r5, #0xa8] + add ip, sp, #0x54 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + ldr r1, _02242850 ; =ov45_02254DBC + add r0, sp, #0x48 + bl ov45_02237B58 + ldr r2, _02242854 ; =ov45_02255398 + add r0, sp, #0x3c + add r1, sp, #0x48 + bl ov45_02233ABC + add r0, sp, #0x30 + add r1, sp, #0x3c + add r2, r5, #0x30 + bl ov45_022339F4 + ldr r2, _02242854 ; =ov45_02255398 + add r0, sp, #0x24 + add r1, sp, #0x30 + bl ov45_02233ABC + add r1, sp, #0x54 + ldr r1, [r1, r4, lsl #2] + add r0, sp, #0x18 + bl ov45_02237B58 + add r0, sp, #0xc + add r1, sp, #0x24 + add r2, sp, #0x18 + bl ov45_022339F4 + ldr r2, _02242854 ; =ov45_02255398 + add r0, sp, #0 + add r1, sp, #0xc + bl ov45_02233ABC + add r1, sp, #0 + add r0, r5, #0x48 + bl ov45_02237D48 + add r0, sp, #0 + bl ov45_02237BC8 + add r0, sp, #0xc + bl ov45_02237BC8 + add r0, sp, #0x18 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0x30 + bl ov45_02237BC8 + add r0, sp, #0x3c + bl ov45_02237BC8 + add r0, sp, #0x48 + bl ov45_02237BC8 + mov r0, r5 + add sp, sp, #0x84 + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224284C: .word ov45_02254DC4 +_02242850: .word ov45_02254DBC +_02242854: .word ov45_02255398 + arm_func_end ov45_0224268C + + arm_func_start ov45_02242858 +ov45_02242858: ; 0x02242858 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x9c + bl ov45_02236CB0 + add r0, r4, #0x9c + bl ov45_02236E38 + add r0, r4, #0x90 + bl ov45_022425A0 + add r0, r4, #0x90 + bl ov45_02244150 + add r0, r4, #0x80 + bl ov45_02243A98 + add r0, r4, #0x70 + bl ov45_02244130 + add r0, r4, #0x48 + bl ov45_02237BC8 + add r0, r4, #0x3c + bl ov45_02237BC8 + add r0, r4, #0x30 + bl ov45_02237BC8 + add r0, r4, #0x24 + bl ov45_02237BC8 + add r0, r4, #0x18 + bl ov45_02237BC8 + add r0, r4, #0xc + bl ov45_02237BC8 + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02242858 + + arm_func_start ov45_022428C8 +ov45_022428C8: ; 0x022428C8 + ldr ip, _022428D4 ; =ov45_022339F4 + add r1, r1, #0x48 + bx ip + .balign 4, 0 +_022428D4: .word ov45_022339F4 + arm_func_end ov45_022428C8 + + arm_func_start ov45_022428D8 +ov45_022428D8: ; 0x022428D8 + ldr r3, [r1, #0x48] + mov r3, r3, lsl #0x1f + movs r3, r3, lsr #0x1f + ldrne r3, [r1, #0x4c] + bne _022428F8 + ldrb r1, [r1, #0x48] + mov r1, r1, lsl #0x18 + mov r3, r1, lsr #0x19 +_022428F8: + ldr ip, _0224290C ; =ov45_02236680 + mov r1, r2 + mov r2, r3 + mvn r3, #0 + bx ip + .balign 4, 0 +_0224290C: .word ov45_02236680 + arm_func_end ov45_022428D8 + + arm_func_start ov45_02242910 +ov45_02242910: ; 0x02242910 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + mov r6, #0 + str r6, [sl] + mov r8, r2 + str r6, [sl, #4] + cmp r8, #0 + mov sb, r1 + mov r7, r3 + addle sp, sp, #8 + str r6, [sl, #8] + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + sub r4, sp, #4 + mov r5, r6 + add fp, sp, #4 +_02242950: + ldr r0, [sb, #0x48] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldrne r1, [sb, #0x4c] + bne _02242970 + ldrb r0, [sb, #0x48] + mov r0, r0, lsl #0x18 + mov r1, r0, lsr #0x19 +_02242970: + ldr r0, [r7, r6, lsl #2] + add r0, r0, r1 + str r0, [sp, #4] + strb r5, [sp] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _022429B0 + mov r0, r1 + add r2, r0, #1 + str r2, [sl, #4] + ldr r0, [sl] + ldr r1, [sp, #4] + add r0, r0, r2, lsl #2 + str r1, [r0, #-4] + b _022429CC +_022429B0: + strb r5, [sp, #1] + and r0, r5, #0xff + strb r0, [r4] + ldr r2, [r4] + mov r0, sl + mov r1, fp + bl ov45_0223E910 +_022429CC: + add r6, r6, #1 + cmp r6, r8 + blt _02242950 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_02242910 + + arm_func_start ov45_022429E0 +ov45_022429E0: ; 0x022429E0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov00_021FF368 + ldr r1, _02242A24 ; =0x10624DD3 + mov r3, #0x3e8 + umull r1, ip, r0, r1 + mov ip, ip, lsr #6 + umull r1, r2, r3, ip + sub ip, r0, r1 + ldr r2, _02242A28 ; =ov45_0225539C + mov r0, r5 + mov r3, r4 + mov r1, #0x14 + str ip, [sp] + bl ov45_02232B24 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02242A24: .word 0x10624DD3 +_02242A28: .word ov45_0225539C + arm_func_end ov45_022429E0 + + arm_func_start ov45_02242A2C +ov45_02242A2C: ; 0x02242A2C + stmdb sp!, {r4, lr} + sub sp, sp, #0x18 + ldr r1, _02242AC8 ; =ov45_022553A4 + mov r4, r0 + add r0, sp, #0 + bl ov45_02237B58 + add r0, sp, #0xc + add r2, sp, #0 + mov r1, r4 + mov r3, #0 + bl ov45_0223F000 + add r0, sp, #0 + bl ov45_02237BC8 + ldr r0, [sp, #0x10] + cmp r0, #2 + bhs _02242A80 + add r0, sp, #0xc + bl ov45_02237664 + add sp, sp, #0x18 + mvn r0, #0 + ldmia sp!, {r4, pc} +_02242A80: + ldr r1, [sp, #0xc] + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + addeq r0, r1, #0xd + ldrne r0, [r1, #0x14] + bl atoi + movs r4, r0 + add r0, sp, #0xc + bne _02242AB8 + bl ov45_02237664 + add sp, sp, #0x18 + mvn r0, #0 + ldmia sp!, {r4, pc} +_02242AB8: + bl ov45_02237664 + mov r0, r4 + add sp, sp, #0x18 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02242AC8: .word ov45_022553A4 + arm_func_end ov45_02242A2C + + arm_func_start ov45_02242ACC +ov45_02242ACC: ; 0x02242ACC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xb4 + mov r4, r0 + add r0, sp, #0xa8 + mov r6, r2 + mov r5, r3 + bl ov45_02237A24 + add r1, sp, #0x80 + mov r2, #0 + add r0, r1, #4 + add ip, sp, #0x90 + str r0, [r1, #8] + str r2, [sp, #0x7c] + str r2, [r1] + str r2, [r1, #4] + str r5, [sp, #0x8c] + ldmia r6!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r6, {r0, r1} + stmia ip, {r0, r1} + add r0, sp, #0x44 + add r1, sp, #0xa8 + add r2, sp, #0x7c + bl ov45_02242BE0 + mov r1, #0 + strb r1, [sp] + add r0, sp, #0xc + add r1, sp, #0x44 + bl ov45_02237A24 + add r6, sp, #0x50 + mov r1, #0 + ldr r0, [r6] + add r5, sp, #0x18 + stmia r5, {r0, r1} + add r0, r5, #8 + str r0, [r5, #0xc] + strb r1, [sp, #1] + str r1, [r5, #8] + add r0, r5, #4 + add r1, r6, #4 + bl ov45_02243BC0 + ldr r0, [r6, #0x10] + add lr, r6, #0x14 + str r0, [r5, #0x10] + add ip, r5, #0x14 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1} + stmia ip, {r0, r1} + add r1, r4, #0x80 + add r0, sp, #4 + add r2, sp, #0xc + bl ov45_02243840 + add r0, sp, #0x1c + ldrb r4, [sp, #8] + bl ov45_02243F1C + add r0, sp, #0xc + bl ov45_02237BC8 + add r0, sp, #0x54 + bl ov45_02243F1C + add r0, sp, #0x44 + bl ov45_02237BC8 + add r0, sp, #0x80 + bl ov45_02243F1C + add r0, sp, #0xa8 + bl ov45_02237BC8 + mov r0, r4 + add sp, sp, #0xb4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_02242ACC + + arm_func_start ov45_02242BE0 +ov45_02242BE0: ; 0x02242BE0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r2 + mov r5, r0 + bl ov45_02237A24 + ldr r1, [r4] + mov r0, #0 + str r1, [r5, #0xc] + str r0, [r5, #0x10] + str r0, [r5, #0x14] + add r0, r5, #0x14 + str r0, [r5, #0x18] + add r0, r5, #0x10 + add r1, r4, #4 + bl ov45_02243BC0 + ldr r0, [r4, #0x10] + add lr, r4, #0x14 + str r0, [r5, #0x1c] + add ip, r5, #0x20 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1} + stmia ip, {r0, r1} + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02242BE0 + + arm_func_start ov45_02242C3C +ov45_02242C3C: ; 0x02242C3C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r2, r1 + add r0, sp, #0 + add r1, r4, #0x80 + bl ov45_02242C74 + ldr r1, [sp] + add r0, r4, #0x84 + cmp r1, r0 + moveq r0, #0 + addne r0, r1, #0x2c + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02242C3C + + arm_func_start ov45_02242C74 +ov45_02242C74: ; 0x02242C74 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r5, r2 + mov r7, r0 + ldr r2, [r6, #4] + mov r0, r6 + mov r1, r5 + add r3, r6, #4 + bl ov45_02242CDC + mov r4, r0 + add r0, r6, #4 + cmp r4, r0 + beq _02242CC8 + mov r0, r5 + add r1, r4, #0xc + bl ov45_02237F7C + cmp r0, #0 + movlt r0, #1 + movge r0, #0 + cmp r0, #0 + beq _02242CD4 +_02242CC8: + add r0, r6, #4 + str r0, [r7] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02242CD4: + str r4, [r7] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02242C74 + + arm_func_start ov45_02242CDC +ov45_02242CDC: ; 0x02242CDC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r7, r2 + mov r8, r1 + mov r6, r3 + beq _02242D28 + mov r4, #0 + mov r5, #1 +_02242CF8: + mov r1, r8 + add r0, r7, #0xc + bl ov45_02237F7C + cmp r0, #0 + movlt r0, r5 + movge r0, r4 + cmp r0, #0 + moveq r6, r7 + ldreq r7, [r7] + ldrne r7, [r7, #4] + cmp r7, #0 + bne _02242CF8 +_02242D28: + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov45_02242CDC + + arm_func_start ov45_02242D30 +ov45_02242D30: ; 0x02242D30 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + mov r5, r1 + mov r6, r0 + mov r0, r5 + mov r4, r2 + bl ov45_02242A2C + mvn r1, #0 + str r0, [sp, #0x10] + cmp r0, r1 + addeq sp, sp, #0x14 + moveq r0, r1 + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #0xc + mov r2, r4 + add r1, r6, #0x80 + bl ov45_02242C74 + ldr r1, [sp, #0xc] + add r0, r6, #0x84 + cmp r1, r0 + addeq sp, sp, #0x14 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #4 + add r2, sp, #0x10 + add r1, r1, #0x1c + bl ov45_02243AB8 + mov r2, #0 + add r1, sp, #0x10 + add r0, r6, #0x70 + strb r2, [sp, #1] + strb r2, [sp] + bl ov45_02242DCC + mov r1, r5 + add r0, r0, #4 + bl ov45_02237D48 + ldr r0, [sp, #0x10] + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_02242D30 + + arm_func_start ov45_02242DCC +ov45_02242DCC: ; 0x02242DCC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x28 + add r4, sp, #4 + add r2, sp, #8 + add r3, sp, #5 + str r4, [sp] + mov r6, r0 + mov r5, r1 + bl ov45_02242E88 + ldr r2, [sp, #8] + mov r4, r0 + cmp r2, #0 + beq _02242E10 + ldr r1, [r2, #0xc] + ldr r0, [r5] + cmp r1, r0 + bge _02242E7C +_02242E10: + mov r2, #0 + add r1, sp, #0x1c + mov r0, r2 +_02242E1C: + str r0, [r1, r2, lsl #2] + add r2, r2, #1 + cmp r2, #3 + blo _02242E1C + ldr r2, [r5] + add r0, sp, #0x10 + add r1, sp, #0x1c + str r2, [sp, #0xc] + bl ov45_02237A24 + add r1, sp, #0xc + str r1, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r6 + mov r1, r4 + bl ov45_0224404C + mov r4, r0 + add r0, sp, #0x10 + bl ov45_02237BC8 + add r0, sp, #0x1c + bl ov45_02237BC8 + add sp, sp, #0x28 + add r0, r4, #0xc + ldmia sp!, {r4, r5, r6, pc} +_02242E7C: + add r0, r2, #0xc + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02242DCC + + arm_func_start ov45_02242E88 +ov45_02242E88: ; 0x02242E88 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_02242EBC: + ldr r5, [r1] + ldr r4, [r6, #0xc] + mov r0, r6 + cmp r5, r4 + ldrlt r6, [r6] + strltb lr, [r3] + blt _02242EE8 + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_02242EE8: + cmp r6, #0 + bne _02242EBC + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02242E88 + + arm_func_start ov45_02242EF4 +ov45_02242EF4: ; 0x02242EF4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + mov sb, r1 + movs r1, r2 + ldr r1, [sp, #0x58] + mov r4, #0 + mov sl, r0 + str r4, [sl] + str r4, [sl, #4] + str r2, [sp] + mov r8, r3 + str r4, [sl, #8] + str r1, [sp, #0x58] + beq _02242F34 + mov r1, r2 + bl ov45_0223E830 +_02242F34: + ldr r0, [sp] + mov r7, #0 + cmp r0, #0 + addle sp, sp, #0x34 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mvn r0, #0 + sub r4, sp, #4 + str r0, [sp, #4] +_02242F54: + ldr r1, [r8, r7, lsl #2] + add r0, sp, #0x28 + bl ov45_02237B58 + mov fp, #0 + ldr r6, [sb, #8] + add r0, sp, #0x28 + mov r5, fp + bl ov45_02242A2C + cmp r0, r6 + bne _02242FB0 + ldr r6, [r8, r7, lsl #2] + add r0, sp, #0x1c + mov r1, sb + bl ov45_0223FC5C + mov r1, r6 + mov fp, #1 + add r0, sp, #0x1c + bl ov45_02237FD8 + cmp r0, #0 + movne r0, fp + moveq r0, r5 + cmp r0, #0 + movne r5, #1 +_02242FB0: + cmp fp, #0 + beq _02242FC0 + add r0, sp, #0x1c + bl ov45_02237BC8 +_02242FC0: + add r0, sp, #0x28 + bl ov45_02237BC8 + cmp r5, #0 + bne _02243064 + ldr r1, [r8, r7, lsl #2] + add r0, sp, #0x10 + bl ov45_02237B58 + ldr r2, [sp, #0x58] + mov r0, sb + add r1, sp, #0x10 + bl ov45_02242D30 + str r0, [sp, #0xc] + add r0, sp, #0x10 + bl ov45_02237BC8 + ldr r1, [sp, #0xc] + ldr r0, [sp, #4] + cmp r1, r0 + beq _02243064 + mov r0, #0 + strb r0, [sp, #8] + ldr r1, [sl, #4] + ldr r0, [sl, #8] + cmp r1, r0 + bhs _02243040 + mov r0, r1 + add r2, r0, #1 + str r2, [sl, #4] + ldr r0, [sl] + ldr r1, [sp, #0xc] + add r0, r0, r2, lsl #2 + str r1, [r0, #-4] + b _02243064 +_02243040: + mov r0, #0 + mov r2, #0 + strb r0, [sp, #9] + mov r2, r2 + strb r2, [r4] + ldr r2, [r4] + mov r0, sl + add r1, sp, #0xc + bl ov45_0223E910 +_02243064: + ldr r0, [sp] + add r7, r7, #1 + cmp r7, r0 + blt _02242F54 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_02242EF4 + + arm_func_start ov45_0224307C +ov45_0224307C: ; 0x0224307C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + ldr r1, [sp, #0x34] + mov r7, r0 + str r1, [sp, #4] + ldr r0, [r7, #0x8c] + str r1, [sp, #8] + str r0, [sp, #0xc] + add r6, r7, #0x84 + add r5, sp, #4 + add r8, sp, #0 + add r4, sp, #0xc + b _022430BC +_022430B4: + mov r0, r4 + bl ov45_02236E58 +_022430BC: + ldr sb, [sp, #0xc] + cmp sb, r6 + beq _022430E8 + mov r0, r8 + mov r2, r5 + add r1, sb, #0x1c + bl ov45_02243128 + ldr r1, [sp] + add r0, sb, #0x20 + cmp r1, r0 + beq _022430B4 +_022430E8: + ldr r1, [sp, #0xc] + add r0, r7, #0x84 + cmp r1, r0 + addne sp, sp, #0x10 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + addne sp, sp, #0x10 + bxne lr + add r1, sp, #0x34 + add r0, r7, #0x70 + bl ov45_022431AC + mov r0, #1 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_0224307C + + arm_func_start ov45_02243128 +ov45_02243128: ; 0x02243128 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r4, r2 + mov r6, r0 + ldr r2, [r5, #4] + mov r0, r5 + mov r1, r4 + add r3, r5, #4 + bl ov45_0224317C + add r1, r5, #4 + cmp r0, r1 + beq _02243168 + ldr r2, [r4] + ldr r1, [r0, #0xc] + cmp r2, r1 + bge _02243174 +_02243168: + add r0, r5, #4 + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} +_02243174: + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02243128 + + arm_func_start ov45_0224317C +ov45_0224317C: ; 0x0224317C + cmp r2, #0 + beq _022431A4 + ldr r1, [r1] +_02243188: + ldr r0, [r2, #0xc] + cmp r0, r1 + movge r3, r2 + ldrge r2, [r2] + ldrlt r2, [r2, #4] + cmp r2, #0 + bne _02243188 +_022431A4: + mov r0, r3 + bx lr + arm_func_end ov45_0224317C + + arm_func_start ov45_022431AC +ov45_022431AC: ; 0x022431AC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + mov r2, r1 + add r0, sp, #8 + mov r1, r4 + bl ov45_022431FC + ldr r2, [sp, #8] + add r0, r4, #4 + cmp r2, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #4 + mov r1, r4 + str r2, [sp] + bl ov45_02243FD4 + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022431AC + + arm_func_start ov45_022431FC +ov45_022431FC: ; 0x022431FC + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r4, r2 + mov r6, r0 + ldr r2, [r5, #4] + mov r0, r5 + mov r1, r4 + add r3, r5, #4 + bl ov45_02243250 + add r1, r5, #4 + cmp r0, r1 + beq _0224323C + ldr r2, [r4] + ldr r1, [r0, #0xc] + cmp r2, r1 + bge _02243248 +_0224323C: + add r0, r5, #4 + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} +_02243248: + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_022431FC + + arm_func_start ov45_02243250 +ov45_02243250: ; 0x02243250 + cmp r2, #0 + beq _02243278 + ldr r1, [r1] +_0224325C: + ldr r0, [r2, #0xc] + cmp r0, r1 + movge r3, r2 + ldrge r2, [r2] + ldrlt r2, [r2, #4] + cmp r2, #0 + bne _0224325C +_02243278: + mov r0, r3 + bx lr + arm_func_end ov45_02243250 + + arm_func_start ov45_02243280 +ov45_02243280: ; 0x02243280 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r0, r1 + mov r4, r2 + bl ov45_02242A2C + mvn r1, #0 + str r0, [sp, #4] + cmp r0, r1 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + add r0, sp, #0 + mov r2, r4 + add r1, r5, #0x80 + bl ov45_02242C74 + ldr r2, [sp] + add r0, r5, #0x84 + cmp r2, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + add r1, sp, #4 + add r0, r2, #0x1c + bl ov45_0224330C + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [sp, #4] + mov r0, r5 + bl ov45_0224307C + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02243280 + + arm_func_start ov45_0224330C +ov45_0224330C: ; 0x0224330C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + mov r2, r1 + add r0, sp, #8 + mov r1, r4 + bl ov45_02243128 + ldr r2, [sp, #8] + add r0, r4, #4 + cmp r2, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #4 + mov r1, r4 + str r2, [sp] + bl ov45_02243B50 + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_0224330C + + arm_func_start ov45_0224335C +ov45_0224335C: ; 0x0224335C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x64 + mov r5, r0 + mov r4, r1 + add r0, sp, #0x3c + mov r2, r4 + add r1, r5, #0x80 + bl ov45_02242C74 + ldr r1, [sp, #0x3c] + add r0, r5, #0x84 + cmp r1, r0 + addeq sp, sp, #0x64 + mov r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + str r0, [sp, #0x58] + str r0, [sp, #0x5c] + str r0, [sp, #0x60] + ldr r2, [r1, #0x24] + add ip, r1, #0x20 + strb r0, [sp, #9] + strb r0, [sp, #0xa] + strb r0, [sp, #8] + strb r0, [sp, #4] + sub r1, sp, #4 + ldr r0, [sp, #0x20] + str ip, [r1] + str r0, [r1, #4] + ldr r3, [r1] + add r0, sp, #0x58 + add r1, sp, #0x14 + str r2, [sp, #0x14] + str ip, [sp, #0x34] + str ip, [sp, #0x24] + str r2, [sp, #0x38] + str r2, [sp, #0x28] + str ip, [sp, #0x1c] + ldmia r1, {r1, r2} + bl ov45_022434C0 + mov r1, r4 + add r0, r5, #0x80 + bl ov45_022435A8 + ldr r0, _022434BC ; =ov45_02255358 + ldr r4, [sp, #0x58] + ldr lr, [r0, #8] + ldr r2, [r0, #0xc] + ldr r0, [sp, #0x5c] + add r1, sp, #0x4c + add r3, r4, r0, lsl #2 + add ip, sp, #0x40 + str lr, [sp, #0x4c] + str r5, [sp, #0x54] + str r2, [sp, #0x50] + ldmia r1, {r0, r1, r2} + stmia ip, {r0, r1, r2} + cmp r4, r3 + movne r0, #1 + moveq r0, #0 + str r3, [sp, #0x2c] + str r3, [sp, #0xc] + str r4, [sp, #0x30] + str r4, [sp, #0x10] + cmp r0, #0 + beq _022434A8 + cmp r0, #0 + add r6, sp, #0x40 + beq _022434A8 + ldr r5, [sp, #0x10] + ldr r4, [sp, #0xc] +_0224346C: + ldr r1, [sp, #0x44] + ldr r0, [sp, #0x48] + tst r1, #1 + add r0, r0, r1, asr #1 + ldr r1, [r5] + ldreq r2, [r6] + beq _02243494 + ldr r3, [r0] + ldr r2, [r6] + ldr r2, [r3, r2] +_02243494: + blx r2 + add r5, r5, #4 + cmp r5, r4 + bne _0224346C + str r5, [sp, #0x10] +_022434A8: + add r0, sp, #0x58 + bl ov45_022376BC + mov r0, #1 + add sp, sp, #0x64 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_022434BC: .word ov45_02255358 + arm_func_end ov45_0224335C + + arm_func_start ov45_022434C0 +ov45_022434C0: ; 0x022434C0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x20 + ldr r2, [sp, #0x4c] + ldr r1, [sp, #0x50] + ldr r4, [sp, #0x54] + mov sl, r0 + str r2, [sp, #0x18] + str r1, [sp, #0x1c] + cmp r2, r4 + add r5, sp, #0x18 + mov r8, #0 + beq _0224350C +_022434F4: + mov r0, r5 + add r8, r8, #1 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + cmp r0, r4 + bne _022434F4 +_0224350C: + ldr r1, [sl, #8] + cmp r8, r1 + bls _0224353C + mov r2, #0 + mov r0, sl + sub r1, r8, r1 + strb r2, [sp, #1] + bl ov45_0223EA34 + mov r2, r0 + mov r0, sl + mov r1, r8 + bl ov45_022421E4 +_0224353C: + ldr sb, [sl] + ldr r1, [sp, #0x4c] + ldr r0, [sp, #0x50] + ldr r7, [sp, #0x54] + str r1, [sp, #0x10] + str r0, [sp, #0x14] + cmp r1, r7 + add fp, sp, #0x10 + beq _02243594 + mov r5, #0 +_02243564: + ldr r6, [sp, #0x10] + strb r5, [sp] + ldr r4, [r6, #0xc] + mov r0, fp + str r4, [sb], #4 + bl ov45_02236E58 + ldr r0, [sp, #0x10] + cmp r0, r7 + bne _02243564 + str r4, [sp, #8] + str r6, [sp, #4] + str r6, [sp, #0xc] +_02243594: + str r8, [sl, #4] + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022434C0 + + arm_func_start ov45_022435A8 +ov45_022435A8: ; 0x022435A8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + mov r2, r1 + add r0, sp, #8 + mov r1, r4 + bl ov45_02242C74 + ldr r2, [sp, #8] + add r0, r4, #4 + cmp r2, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r0, sp, #4 + mov r1, r4 + str r2, [sp] + bl ov45_022438F0 + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022435A8 + + arm_func_start ov45_022435F8 +ov45_022435F8: ; 0x022435F8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl ov45_02242A2C + mvn r1, #0 + str r0, [sp, #4] + cmp r0, r1 + addeq sp, sp, #8 + moveq r0, r1 + ldmeqia sp!, {r3, r4, r5, pc} + add r0, sp, #0 + add r2, sp, #4 + add r1, r5, #0x70 + bl ov45_022431FC + ldr r2, [sp] + add r0, r5, #0x74 + cmp r2, r0 + addeq sp, sp, #8 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, r4 + add r0, r2, #0x10 + bl ov45_022340F8 + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + mvnne r0, #0 + ldreq r0, [sp, #4] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022435F8 + + arm_func_start ov45_0224367C +ov45_0224367C: ; 0x0224367C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + add r0, sp, #0 + add r2, sp, #0x18 + add r1, r4, #0x70 + bl ov45_022431FC + ldr r1, [sp] + add r0, r4, #0x74 + cmp r1, r0 + bne _022436C4 + ldr r1, _022436DC ; =ov45_022553A8 + mov r0, r5 + bl ov45_02237B58 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_022436C4: + mov r0, r5 + add r1, r1, #0x10 + bl ov45_02237A24 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_022436DC: .word ov45_022553A8 + arm_func_end ov45_0224367C + + arm_func_start ov45_022436E0 +ov45_022436E0: ; 0x022436E0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x3c + mov r5, r0 + mov r4, r2 + bl ov45_022435F8 + str r0, [sp, #0xc] + add r1, sp, #0xc + add r0, r5, #0x70 + bl ov45_022431AC + add r0, sp, #0x30 + mov r1, r4 + bl ov45_02237A24 + ldr r1, [sp, #0xc] + add r0, sp, #0x20 + add r2, sp, #0x30 + bl ov45_02243780 + mov r0, #0 + ldr r1, [sp, #0x20] + strb r0, [sp] + strb r0, [sp, #1] + str r1, [sp, #0x10] + add r0, sp, #0x14 + add r1, sp, #0x24 + bl ov45_02237A24 + add r1, r5, #0x70 + add r0, sp, #4 + add r2, sp, #0x10 + bl ov45_02243F3C + ldrb r4, [sp, #8] + add r0, sp, #0x14 + bl ov45_02237BC8 + add r0, sp, #0x24 + bl ov45_02237BC8 + add r0, sp, #0x30 + bl ov45_02237BC8 + cmp r4, #0 + ldrne r0, [sp, #0xc] + mvneq r0, #0 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, pc} + arm_func_end ov45_022436E0 + + arm_func_start ov45_02243780 +ov45_02243780: ; 0x02243780 + ldr ip, _02243790 ; =ov45_02237A24 + str r1, [r0], #4 + mov r1, r2 + bx ip + .balign 4, 0 +_02243790: .word ov45_02237A24 + arm_func_end ov45_02243780 + + arm_func_start ov45_02243794 +ov45_02243794: ; 0x02243794 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r2, r1 + add r0, sp, #0 + add r1, r4, #0x80 + bl ov45_02242C74 + ldr r1, [sp] + add r0, r4, #0x84 + cmp r1, r0 + moveq r0, #0 + ldrne r0, [r1, #0x18] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02243794 + + arm_func_start ov45_022437CC +ov45_022437CC: ; 0x022437CC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r2, r1 + add r0, sp, #0 + add r1, r4, #0x80 + bl ov45_02242C74 + ldr r1, [sp] + add r0, r4, #0x84 + cmp r1, r0 + moveq r0, #0 + movne r0, #1 + strne r0, [r1, #0x18] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022437CC + + arm_func_start ov45_02243808 +ov45_02243808: ; 0x02243808 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r2, r1 + add r0, sp, #0 + add r1, r4, #0x80 + bl ov45_02242C74 + ldr r1, [sp] + add r0, r4, #0x84 + cmp r1, r0 + mvneq r0, #0 + ldrne r0, [r1, #0x28] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_02243808 + + arm_func_start ov45_02243840 +ov45_02243840: ; 0x02243840 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r6, r2 + mov r7, r1 + mov r4, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r7 + mov r1, r6 + str ip, [sp] + bl ov45_02244170 + ldr r2, [sp, #8] + mov r5, r0 + cmp r2, #0 + beq _022438A0 + mov r1, r6 + add r0, r2, #0xc + bl ov45_02237F7C + cmp r0, #0 + movlt r0, #1 + movge r0, #0 + cmp r0, #0 + beq _022438D0 +_022438A0: + str r6, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r7 + mov r1, r5 + bl ov45_02243970 + ldr r1, _022438EC ; =ov45_02255358 + str r0, [r4] + ldrb r0, [r1, #4] + add sp, sp, #0xc + strb r0, [r4, #4] + ldmia sp!, {r4, r5, r6, r7, pc} +_022438D0: + ldr r1, [sp, #8] + ldr r0, _022438EC ; =ov45_02255358 + str r1, [r4] + ldrb r0, [r0, #5] + strb r0, [r4, #4] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_022438EC: .word ov45_02255358 + arm_func_end ov45_02243840 + + arm_func_start ov45_022438F0 +ov45_022438F0: ; 0x022438F0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #0xc] + mov r6, r0 + cmp r4, r1 + bne _02243920 + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #0xc] +_02243920: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + add r0, r4, #0x1c + bl ov45_02243F1C + add r0, r4, #0xc + bl ov45_02237BC8 + cmp r4, #0 + beq _02243958 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02243958: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_022438F0 + + arm_func_start ov45_02243970 +ov45_02243970: ; 0x02243970 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + mov sb, r0 + ldr r4, [sb] + mvn r0, #0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + cmp r4, r0 + ldr r5, [sp, #0x30] + bne _022439A8 + ldr r0, _02243A94 ; =ov45_022553AC + bl printf + bl abort +_022439A8: + mov r1, #0 + mov r0, #0x44 + strb r1, [sp, #1] + bl ov45_02242394 + add r1, sb, #4 + str r0, [sp, #4] + str r0, [sp, #8] + str r1, [sp, #0xc] + str r0, [sp, #0x10] + adds r4, r0, #0xc + beq _02243A28 + mov r0, r4 + mov r1, r5 + bl ov45_02237A24 + ldr r1, [r5, #0xc] + mov r0, #0 + str r1, [r4, #0xc] + str r0, [r4, #0x10] + str r0, [r4, #0x14] + add r0, r4, #0x14 + str r0, [r4, #0x18] + add r0, r4, #0x10 + add r1, r5, #0x10 + bl ov45_02243BC0 + ldr r0, [r5, #0x1c] + add r5, r5, #0x20 + str r0, [r4, #0x1c] + add r4, r4, #0x20 + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldmia r5, {r0, r1} + stmia r4, {r0, r1} +_02243A28: + ldr r4, [sp, #0x10] + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r8, [r0] + cmp r7, #0 + strne r4, [r8] + streq r4, [r8, #4] + ldr r1, [sb] + mov r0, r4 + add r1, r1, #1 + str r1, [sb] + ldr r1, [sb, #4] + bl ov45_02236EC4 + cmp r6, #0 + ldr r1, [sp, #0x10] + strne r4, [sb, #0xc] + cmp r1, #0 + beq _02243A88 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02243A88: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02243A94: .word ov45_022553AC + arm_func_end ov45_02243970 + + arm_func_start ov45_02243A98 +ov45_02243A98: ; 0x02243A98 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02243AB0 + bl ov45_022442D4 +_02243AB0: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02243A98 + + arm_func_start ov45_02243AB8 +ov45_02243AB8: ; 0x02243AB8 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r5, r2 + mov r6, r1 + mov r4, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r6 + mov r1, r5 + str ip, [sp] + bl ov45_022441FC + ldr r3, [sp, #8] + mov r1, r0 + cmp r3, #0 + beq _02243B08 + ldr r2, [r3, #0xc] + ldr r0, [r5] + cmp r2, r0 + bge _02243B34 +_02243B08: + str r5, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r6 + bl ov45_02243E44 + ldr r1, _02243B4C ; =ov45_02255358 + str r0, [r4] + ldrb r0, [r1, #3] + add sp, sp, #0xc + strb r0, [r4, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_02243B34: + ldr r0, _02243B4C ; =ov45_02255358 + str r3, [r4] + ldrb r0, [r0, #7] + strb r0, [r4, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02243B4C: .word ov45_02255358 + arm_func_end ov45_02243AB8 + + arm_func_start ov45_02243B50 +ov45_02243B50: ; 0x02243B50 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #8] + mov r6, r0 + cmp r4, r1 + bne _02243B80 + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #8] +_02243B80: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + cmp r4, #0 + beq _02243BA8 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02243BA8: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02243B50 + + arm_func_start ov45_02243BC0 +ov45_02243BC0: ; 0x02243BC0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r4, r1 + ldr r1, [r4, #4] + mov r5, r0 + cmp r1, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, #0 + mov r0, #0x10 + strb r1, [sp, #1] + bl ov45_02242394 + add r1, r5, #4 + str r1, [sp, #0xc] + str r0, [sp, #4] + str r0, [sp, #8] + str r0, [sp, #0x10] + adds r1, r0, #0xc + ldr r0, [r4, #4] + add r2, sp, #0x18 + ldrne r0, [r0, #0xc] + mov r3, #0 + strne r0, [r1] + ldr r1, [sp, #0x10] + str r3, [sp, #0x14] + str r3, [sp, #0x18] + str r2, [sp, #0x1c] + str r3, [r1, #4] + str r3, [r1] + ldr r0, [r1, #8] + and r0, r0, #1 + orr r0, r2, r0 + str r0, [r1, #8] + ldr r0, [r4, #4] + ldr r1, [sp, #0x10] + ldr r0, [r0, #8] + tst r0, #1 + movne r3, #1 + cmp r3, #0 + ldr r0, [r1, #8] + mov r3, #0 + orrne r0, r0, #1 + biceq r0, r0, #1 + str r0, [r1, #8] + ldr r1, [sp, #0x10] + mov r0, #1 + str r1, [sp, #0x18] + str r0, [sp, #0x14] + str r1, [sp, #0x1c] + ldr r2, [r4, #4] + str r3, [sp, #0x10] + ldr r0, [r2, #4] + cmp r0, #0 + beq _02243CA0 + add r0, sp, #0x14 + bl ov45_02243CF8 +_02243CA0: + ldr r2, [r4, #4] + ldr r0, [r2] + cmp r0, #0 + beq _02243CC0 + ldr r1, [sp, #0x18] + add r0, sp, #0x14 + mov r3, #1 + bl ov45_02243CF8 +_02243CC0: + add r1, sp, #0x14 + mov r0, r5 + bl ov45_02244350 + add r0, sp, #0x14 + bl ov45_02244330 + ldr r1, [sp, #0x10] + cmp r1, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02243BC0 + + arm_func_start ov45_02243CF8 +ov45_02243CF8: ; 0x02243CF8 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + mov r7, r0 + mov ip, #0 + mov r0, #0x10 + mov r6, r1 + mov r5, r2 + mov r4, r3 + strb ip, [sp] + bl ov45_02242394 + mov r1, #0 + str r1, [r0, #4] + str r1, [r0] + ldr r1, [r0, #8] + add r2, r7, #4 + and r1, r1, #1 + orr r1, r6, r1 + str r0, [sp, #4] + str r0, [sp, #8] + str r2, [sp, #0xc] + str r0, [sp, #0x10] + str r1, [r0, #8] + cmp r4, #0 + beq _02243D88 + adds r1, r0, #0xc + ldr r0, [r5] + ldrne r0, [r0, #0xc] + strne r0, [r1] + ldr r1, [sp, #0x10] + mov r0, #0 + str r1, [r7, #8] + str r1, [r6] + mov r6, r1 + str r0, [sp, #0x10] + ldr r5, [r5] + b _02243DB0 +_02243D88: + adds r1, r0, #0xc + ldr r0, [r5, #4] + ldrne r0, [r0, #0xc] + strne r0, [r1] + ldr r1, [sp, #0x10] + mov r0, #0 + str r1, [r6, #4] + ldr r5, [r5, #4] + mov r6, r1 + str r0, [sp, #0x10] +_02243DB0: + ldr r0, [r5, #8] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + ldr r0, [r6, #8] + orrne r0, r0, #1 + biceq r0, r0, #1 + str r0, [r6, #8] + ldr r0, [r7] + add r0, r0, #1 + str r0, [r7] + ldr r0, [r5, #4] + cmp r0, #0 + beq _02243E00 + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, #0 + bl ov45_02243CF8 +_02243E00: + ldr r0, [r5] + cmp r0, #0 + beq _02243E20 + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, #1 + bl ov45_02243CF8 +_02243E20: + ldr r1, [sp, #0x10] + cmp r1, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ov45_02243CF8 + + arm_func_start ov45_02243E44 +ov45_02243E44: ; 0x02243E44 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + mov r8, r0 + ldr r4, [r8] + mvn r0, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp r4, r0 + bne _02243E78 + ldr r0, _02243F18 ; =ov45_022553AC + bl printf + bl abort +_02243E78: + mov r1, #0 + mov r0, #0x10 + strb r1, [sp] + bl ov45_02242394 + mov r4, r0 + add r0, r8, #4 + str r0, [sp, #0xc] + adds r1, r4, #0xc + ldrne r0, [sp, #0x30] + str r4, [sp, #0x10] + ldrne r0, [r0] + str r4, [sp, #4] + strne r0, [r1] + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r7, [r0] + cmp r6, #0 + strne r4, [r7] + streq r4, [r7, #4] + ldr r1, [r8] + mov r0, r4 + add r1, r1, #1 + str r1, [r8] + ldr r1, [r8, #4] + str r4, [sp, #8] + bl ov45_02236EC4 + cmp r5, #0 + ldr r1, [sp, #0x10] + strne r4, [r8, #8] + cmp r1, #0 + beq _02243F0C + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02243F0C: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02243F18: .word ov45_022553AC + arm_func_end ov45_02243E44 + + arm_func_start ov45_02243F1C +ov45_02243F1C: ; 0x02243F1C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02243F34 + bl ov45_022443DC +_02243F34: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02243F1C + + arm_func_start ov45_02243F3C +ov45_02243F3C: ; 0x02243F3C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + add ip, sp, #4 + mov r5, r2 + mov r6, r1 + mov r4, r0 + add r2, sp, #8 + add r3, sp, #5 + mov r0, r6 + mov r1, r5 + str ip, [sp] + bl ov45_02244268 + ldr r3, [sp, #8] + mov r1, r0 + cmp r3, #0 + beq _02243F8C + ldr r2, [r3, #0xc] + ldr r0, [r5] + cmp r2, r0 + bge _02243FB8 +_02243F8C: + str r5, [sp] + ldrb r2, [sp, #5] + ldrb r3, [sp, #4] + mov r0, r6 + bl ov45_0224404C + ldr r1, _02243FD0 ; =ov45_02255358 + str r0, [r4] + ldrb r0, [r1] + add sp, sp, #0xc + strb r0, [r4, #4] + ldmia sp!, {r3, r4, r5, r6, pc} +_02243FB8: + ldr r0, _02243FD0 ; =ov45_02255358 + str r3, [r4] + ldrb r0, [r0, #1] + strb r0, [r4, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02243FD0: .word ov45_02255358 + arm_func_end ov45_02243F3C + + arm_func_start ov45_02243FD4 +ov45_02243FD4: ; 0x02243FD4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [sp, #0x18] + ldr r1, [r5, #0xc] + mov r6, r0 + cmp r4, r1 + bne _02244004 + add r0, sp, #0x18 + bl ov45_02236E58 + ldr r0, [sp, #0x18] + str r0, [r5, #0xc] +_02244004: + ldr r1, [r5, #4] + mov r0, r4 + bl ov45_022370D0 + str r0, [r6] + add r0, r4, #0x10 + bl ov45_02237BC8 + cmp r4, #0 + beq _02244034 + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC +_02244034: + ldr r0, [r5] + sub r0, r0, #1 + str r0, [r5] + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov45_02243FD4 + + arm_func_start ov45_0224404C +ov45_0224404C: ; 0x0224404C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + mov r8, r0 + ldr r4, [r8] + mvn r0, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp r4, r0 + bne _02244080 + ldr r0, _0224412C ; =ov45_022553AC + bl printf + bl abort +_02244080: + mov r1, #0 + mov r0, #0x1c + strb r1, [sp] + bl ov45_02242394 + add r1, r8, #4 + str r0, [sp, #4] + str r0, [sp, #8] + str r1, [sp, #0xc] + str r0, [sp, #0x10] + adds r3, r0, #0xc + beq _022440C0 + ldr r1, [sp, #0x30] + add r0, r3, #4 + ldr r2, [r1], #4 + str r2, [r3] + bl ov45_02237A24 +_022440C0: + ldr r4, [sp, #0x10] + mov r0, #0 + str r0, [r4, #4] + str r0, [sp, #0x10] + str r0, [r4] + adds r0, r4, #8 + strne r7, [r0] + cmp r6, #0 + strne r4, [r7] + streq r4, [r7, #4] + ldr r1, [r8] + mov r0, r4 + add r1, r1, #1 + str r1, [r8] + ldr r1, [r8, #4] + bl ov45_02236EC4 + cmp r5, #0 + ldr r1, [sp, #0x10] + strne r4, [r8, #0xc] + cmp r1, #0 + beq _02244120 + mov r0, #0 + mov r2, r0 + bl ov00_021EC2EC +_02244120: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224412C: .word ov45_022553AC + arm_func_end ov45_0224404C + + arm_func_start ov45_02244130 +ov45_02244130: ; 0x02244130 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02244148 + bl ov45_02244428 +_02244148: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02244130 + + arm_func_start ov45_02244150 +ov45_02244150: ; 0x02244150 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02244168 + bl ov45_0224447C +_02244168: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02244150 + + arm_func_start ov45_02244170 +ov45_02244170: ; 0x02244170 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r2 + mov r2, #0 + str r2, [sb] + ldr r6, [r0, #4] + mov r8, r3 + mov r2, #1 + ldr r7, [sp, #0x28] + strb r2, [r8] + mov sl, r1 + strb r2, [r7] + cmp r6, #0 + add r5, r0, #4 + beq _022441F4 + mov fp, #0 + mov r4, r2 +_022441B0: + mov r0, sl + add r1, r6, #0xc + mov r5, r6 + bl ov45_02237F7C + cmp r0, #0 + movlt r0, #1 + movge r0, #0 + cmp r0, #0 + ldrne r6, [r6] + strneb r4, [r8] + bne _022441EC + str r6, [sb] + ldr r6, [r6, #4] + strb fp, [r8] + strb fp, [r7] +_022441EC: + cmp r6, #0 + bne _022441B0 +_022441F4: + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ov45_02244170 + + arm_func_start ov45_022441FC +ov45_022441FC: ; 0x022441FC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_02244230: + ldr r5, [r1] + ldr r4, [r6, #0xc] + mov r0, r6 + cmp r5, r4 + ldrlt r6, [r6] + strltb lr, [r3] + blt _0224425C + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_0224425C: + cmp r6, #0 + bne _02244230 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_022441FC + + arm_func_start ov45_02244268 +ov45_02244268: ; 0x02244268 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + str r4, [r2] + ldr r6, [r0, #4] + mov r4, #1 + ldr r7, [sp, #0x18] + strb r4, [r3] + strb r4, [r7] + cmp r6, #0 + add r0, r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov ip, #0 + mov lr, r4 +_0224429C: + ldr r5, [r1] + ldr r4, [r6, #0xc] + mov r0, r6 + cmp r5, r4 + ldrlt r6, [r6] + strltb lr, [r3] + blt _022442C8 + str r6, [r2] + ldr r6, [r6, #4] + strb ip, [r3] + strb ip, [r7] +_022442C8: + cmp r6, #0 + bne _0224429C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_02244268 + + arm_func_start ov45_022442D4 +ov45_022442D4: ; 0x022442D4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _022442F0 + bl ov45_022442D4 +_022442F0: + ldr r1, [r4, #4] + cmp r1, #0 + beq _02244304 + mov r0, r5 + bl ov45_022442D4 +_02244304: + add r0, r4, #0x1c + bl ov45_02243F1C + add r0, r4, #0xc + bl ov45_02237BC8 + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022442D4 + + arm_func_start ov45_02244330 +ov45_02244330: ; 0x02244330 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + cmp r1, #0 + beq _02244348 + bl ov45_022443DC +_02244348: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end ov45_02244330 + + arm_func_start ov45_02244350 +ov45_02244350: ; 0x02244350 + cmp r0, r1 + bxeq lr + ldr r3, [r0] + ldr r2, [r1] + str r2, [r0] + str r3, [r1] + ldr r3, [r0, #4] + ldr r2, [r1, #4] + str r2, [r0, #4] + str r3, [r1, #4] + ldr r3, [r0, #8] + ldr r2, [r1, #8] + str r2, [r0, #8] + str r3, [r1, #8] + ldr ip, [r0, #4] + cmp ip, #0 + addeq r2, r0, #4 + streq r2, [r0, #8] + beq _022443B0 + ldr r2, [ip, #8] + add r3, r0, #4 + and r0, r2, #1 + orr r0, r3, r0 + str r0, [ip, #8] +_022443B0: + ldr r2, [r1, #4] + cmp r2, #0 + addeq r0, r1, #4 + streq r0, [r1, #8] + bxeq lr + ldr r0, [r2, #8] + add r1, r1, #4 + and r0, r0, #1 + orr r0, r1, r0 + str r0, [r2, #8] + bx lr + arm_func_end ov45_02244350 + + arm_func_start ov45_022443DC +ov45_022443DC: ; 0x022443DC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _022443F8 + bl ov45_022443DC +_022443F8: + ldr r1, [r4, #4] + cmp r1, #0 + beq _0224440C + mov r0, r5 + bl ov45_022443DC +_0224440C: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_022443DC + + arm_func_start ov45_02244428 +ov45_02244428: ; 0x02244428 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _02244444 + bl ov45_02244428 +_02244444: + ldr r1, [r4, #4] + cmp r1, #0 + beq _02244458 + mov r0, r5 + bl ov45_02244428 +_02244458: + add r0, r4, #0x10 + bl ov45_02237BC8 + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_02244428 + + arm_func_start ov45_0224447C +ov45_0224447C: ; 0x0224447C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4] + mov r5, r0 + cmp r1, #0 + beq _02244498 + bl ov45_0224447C +_02244498: + ldr r1, [r4, #4] + cmp r1, #0 + beq _022444AC + mov r0, r5 + bl ov45_0224447C +_022444AC: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl ov00_021EC2EC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0224447C + + arm_func_start ov45_022444C8 +ov45_022444C8: ; 0x022444C8 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _022444E8 + ldr r0, _022444F4 ; =ov45_02255458 + ldr r1, _022444F8 ; =ov45_02255468 + ldr r2, _022444FC ; =ov45_02255438 + mov r3, #0xa4 + bl __msl_assertion_failed +_022444E8: + ldr r0, [r4, #0x14] + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022444F4: .word ov45_02255458 +_022444F8: .word ov45_02255468 +_022444FC: .word ov45_02255438 + arm_func_end ov45_022444C8 + + arm_func_start ov45_02244500 +ov45_02244500: ; 0x02244500 + stmdb sp!, {r4, r5, r6, lr} + movs r4, r0 + bne _02244520 + ldr r0, _02244B74 ; =ov45_02255458 + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_02244520: + ldr r0, [r4] + cmp r0, #0 + bge _02244540 + ldr r0, _02244B80 ; =ov45_02255478 + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_02244540: + ldr r0, [r4] + cmp r0, #0x20 + blt _02244560 + ldr r0, _02244B84 ; =ov45_02255488 + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_02244560: + ldr r0, [r4, #4] + cmp r0, #0 + bne _02244580 + ldr r0, _02244B88 ; =ov45_022554A4 + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_02244580: + ldr r0, [r4, #8] + cmp r0, #0 + bne _022445A0 + ldr r0, _02244B8C ; =ov45_022554BC + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_022445A0: + ldr r0, [r4, #0x10] + cmp r0, #0 + bge _022445C0 + ldr r0, _02244B90 ; =ov45_022554DC + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + mov r3, #0xab + bl __msl_assertion_failed +_022445C0: + ldr r0, [r4] + cmp r0, #0x1f + addls pc, pc, r0, lsl #2 + b _02244B54 +_022445D0: ; jump table + b _02244650 ; case 0 + b _02244660 ; case 1 + b _02244670 ; case 2 + b _02244688 ; case 3 + b _022446A0 ; case 4 + b _022446C0 ; case 5 + b _022446E0 ; case 6 + b _022446F8 ; case 7 + b _02244720 ; case 8 + b _02244740 ; case 9 + b _02244758 ; case 10 + b _02244770 ; case 11 + b _02244788 ; case 12 + b _02244798 ; case 13 + b _022447B0 ; case 14 + b _02244808 ; case 15 + b _02244818 ; case 16 + b _02244830 ; case 17 + b _02244848 ; case 18 + b _02244860 ; case 19 + b _022448AC ; case 20 + b _02244908 ; case 21 + b _02244928 ; case 22 + b _02244950 ; case 23 + b _02244968 ; case 24 + b _022449AC ; case 25 + b _022449F0 ; case 26 + b _02244A08 ; case 27 + b _02244A54 ; case 28 + b _02244A7C ; case 29 + b _02244ADC ; case 30 + b _02244B44 ; case 31 +_02244650: + ldr r0, [r4, #8] + ldr r0, [r0] + bl ov00_021EC3D8 + b _02244B68 +_02244660: + ldr r0, [r4, #8] + ldr r0, [r0] + bl ov00_021EC3D8 + b _02244B68 +_02244670: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_02244688: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_022446A0: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_022446C0: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_022446E0: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_022446F8: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + ldr r0, [r5, #0x10] + bl ov00_021EC3D8 + b _02244B68 +_02244720: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244740: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_02244758: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_02244770: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + b _02244B68 +_02244788: + ldr r0, [r4, #8] + ldr r0, [r0] + bl ov00_021EC3D8 + b _02244B68 +_02244798: + ldr r5, [r4, #8] + ldr r0, [r5, #8] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_022447B0: + ldr r6, [r4, #8] + mov r5, #0 + ldr r0, [r6, #4] + cmp r0, #0 + ble _022447EC +_022447C4: + ldr r0, [r6, #8] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #4] + add r5, r5, #1 + cmp r5, r0 + blt _022447C4 +_022447EC: + ldr r0, [r6, #8] + bl ov00_021EC3D8 + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + ldr r0, [r6, #0x10] + bl ov00_021EC3D8 + b _02244B68 +_02244808: + ldr r0, [r4, #8] + ldr r0, [r0, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244818: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244830: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244848: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_02244860: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + mov r5, #0 + cmp r0, #0 + ble _02244898 +_0224487C: + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + add r5, r5, #1 + cmp r5, r0 + blt _0224487C +_02244898: + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + ldr r0, [r6, #0x10] + bl ov00_021EC3D8 + b _02244B68 +_022448AC: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + bl ov00_021EC3D8 + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + ldr r0, [r6, #0x10] + bl ov00_021EC3D8 + ldr r0, [r6, #0x14] + mov r5, #0 + cmp r0, #0 + ble _022448FC +_022448E0: + ldr r0, [r6, #0x18] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0x14] + add r5, r5, #1 + cmp r5, r0 + blt _022448E0 +_022448FC: + ldr r0, [r6, #0x18] + bl ov00_021EC3D8 + b _02244B68 +_02244908: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_02244928: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + ldr r0, [r5, #0x10] + bl ov00_021EC3D8 + b _02244B68 +_02244950: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244968: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + mov r5, #0 + cmp r0, #0 + ble _022449A0 +_02244984: + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + add r5, r5, #1 + cmp r5, r0 + blt _02244984 +_022449A0: + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_022449AC: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + mov r5, #0 + cmp r0, #0 + ble _022449E4 +_022449C8: + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + add r5, r5, #1 + cmp r5, r0 + blt _022449C8 +_022449E4: + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_022449F0: + ldr r5, [r4, #8] + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + b _02244B68 +_02244A08: + ldr r6, [r4, #8] + ldr r0, [r6] + bl ov00_021EC3D8 + ldr r0, [r6, #4] + mov r5, #0 + cmp r0, #0 + ble _02244A40 +_02244A24: + ldr r0, [r6, #8] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #4] + add r5, r5, #1 + cmp r5, r0 + blt _02244A24 +_02244A40: + ldr r0, [r6, #8] + bl ov00_021EC3D8 + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_02244A54: + ldr r5, [r4, #8] + ldr r0, [r5] + bl ov00_021EC3D8 + ldr r0, [r5, #4] + bl ov00_021EC3D8 + ldr r0, [r5, #8] + bl ov00_021EC3D8 + ldr r0, [r5, #0xc] + bl ov00_021EC3D8 + b _02244B68 +_02244A7C: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + mov r5, #0 + cmp r0, #0 + ble _02244AC8 +_02244A98: + ldr r0, [r6, #0xc] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0x10] + cmp r0, #0 + beq _02244AB8 + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 +_02244AB8: + ldr r0, [r6, #8] + add r5, r5, #1 + cmp r5, r0 + blt _02244A98 +_02244AC8: + ldr r0, [r6, #0xc] + bl ov00_021EC3D8 + ldr r0, [r6, #0x10] + bl ov00_021EC3D8 + b _02244B68 +_02244ADC: + ldr r6, [r4, #8] + ldr r0, [r6, #4] + bl ov00_021EC3D8 + ldr r0, [r6, #8] + bl ov00_021EC3D8 + ldr r0, [r6, #0xc] + mov r5, #0 + cmp r0, #0 + ble _02244B30 +_02244B00: + ldr r0, [r6, #0x10] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r6, #0x14] + cmp r0, #0 + beq _02244B20 + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 +_02244B20: + ldr r0, [r6, #0xc] + add r5, r5, #1 + cmp r5, r0 + blt _02244B00 +_02244B30: + ldr r0, [r6, #0x10] + bl ov00_021EC3D8 + ldr r0, [r6, #0x14] + bl ov00_021EC3D8 + b _02244B68 +_02244B44: + ldr r0, [r4, #8] + ldr r0, [r0, #4] + bl ov00_021EC3D8 + b _02244B68 +_02244B54: + ldr r0, _02244B94 ; =ov45_022554EC + ldr r1, _02244B78 ; =ov45_02255468 + ldr r2, _02244B7C ; =ov45_022553F8 + ldr r3, _02244B98 ; =0x000001E5 + bl __msl_assertion_failed +_02244B68: + ldr r0, [r4, #8] + bl ov00_021EC3D8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02244B74: .word ov45_02255458 +_02244B78: .word ov45_02255468 +_02244B7C: .word ov45_022553F8 +_02244B80: .word ov45_02255478 +_02244B84: .word ov45_02255488 +_02244B88: .word ov45_022554A4 +_02244B8C: .word ov45_022554BC +_02244B90: .word ov45_022554DC +_02244B94: .word ov45_022554EC +_02244B98: .word 0x000001E5 + arm_func_end ov45_02244500 + + arm_func_start ov45_02244B9C +ov45_02244B9C: ; 0x02244B9C + stmdb sp!, {r4, lr} + ldr r2, _02244BC8 ; =ov45_022444C8 + mov r4, r0 + mov r0, #0x18 + mov r1, #0x80 + bl ov00_021FE5B4 + str r0, [r4, #0x820] + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02244BC8: .word ov45_022444C8 + arm_func_end ov45_02244B9C + + arm_func_start ov45_02244BCC +ov45_02244BCC: ; 0x02244BCC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + bne _02244BEC + ldr r0, _02244D04 ; =ov45_022554F0 + ldr r1, _02244D08 ; =ov45_02255468 + ldr r2, _02244D0C ; =ov45_0225540C + ldr r3, _02244D10 ; =0x000001FA + bl __msl_assertion_failed +_02244BEC: + ldr r0, [sl, #0x820] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ArrayLength + mov r8, r0 + cmp r8, #0 + mov sb, #0 + ble _02244CF8 + ldr fp, _02244D14 ; =ov45_02255458 + ldr r6, _02244D08 ; =ov45_02255468 + ldr r5, _02244D0C ; =ov45_0225540C + ldr r4, _02244D18 ; =0x0000020D +_02244C1C: + ldr r0, [sl, #0x820] + mov r1, sb + bl ov00_021FE6EC + movs r7, r0 + bne _02244C44 + mov r0, fp + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244C44: + ldr r0, [r7] + cmp r0, #0 + bge _02244C64 + ldr r0, _02244D1C ; =ov45_02255478 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244C64: + ldr r0, [r7] + cmp r0, #0x20 + blt _02244C84 + ldr r0, _02244D20 ; =ov45_02255488 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244C84: + ldr r0, [r7, #4] + cmp r0, #0 + bne _02244CA4 + ldr r0, _02244D24 ; =ov45_022554A4 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244CA4: + ldr r0, [r7, #8] + cmp r0, #0 + bne _02244CC4 + ldr r0, _02244D28 ; =ov45_022554BC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244CC4: + ldr r0, [r7, #0x10] + cmp r0, #0 + bge _02244CE4 + ldr r0, _02244D2C ; =ov45_022554DC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02244CE4: + mov r0, r7 + bl ov45_02244500 + add sb, sb, #1 + cmp sb, r8 + blt _02244C1C +_02244CF8: + ldr r0, [sl, #0x820] + bl ov00_021FE678 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02244D04: .word ov45_022554F0 +_02244D08: .word ov45_02255468 +_02244D0C: .word ov45_0225540C +_02244D10: .word 0x000001FA +_02244D14: .word ov45_02255458 +_02244D18: .word 0x0000020D +_02244D1C: .word ov45_02255478 +_02244D20: .word ov45_02255488 +_02244D24: .word ov45_022554A4 +_02244D28: .word ov45_022554BC +_02244D2C: .word ov45_022554DC + arm_func_end ov45_02244BCC + + arm_func_start ov45_02244D30 +ov45_02244D30: ; 0x02244D30 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x18 + movs r5, r0 + mov r7, r1 + mov r6, r2 + mov r4, r3 + bne _02244D60 + ldr r0, _02245C60 ; =ov45_022554F0 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C6C ; =0x0000021F + bl __msl_assertion_failed +_02244D60: + cmp r7, #0 + bge _02244D7C + ldr r0, _02245C70 ; =ov45_02255500 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C74 ; =0x00000221 + bl __msl_assertion_failed +_02244D7C: + cmp r7, #0x20 + blt _02244D98 + ldr r0, _02245C78 ; =ov45_0225550C + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C7C ; =0x00000222 + bl __msl_assertion_failed +_02244D98: + ldr r0, [r5, #0x820] + cmp r0, #0 + bne _02244DB8 + ldr r0, _02245C80 ; =ov45_02255520 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C84 ; =0x00000223 + bl __msl_assertion_failed +_02244DB8: + cmp r6, #0 + bne _02244DD4 + ldr r0, _02245C88 ; =ov45_02255544 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + mov r3, #0x224 + bl __msl_assertion_failed +_02244DD4: + cmp r4, #0 + bne _02244DF0 + ldr r0, _02245C8C ; =ov45_02255558 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C90 ; =0x00000225 + bl __msl_assertion_failed +_02244DF0: + ldr r0, [sp, #0x3c] + cmp r0, #0 + bne _02244E10 + ldr r0, _02245C94 ; =ov45_02255570 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245C98 ; =0x00000226 + bl __msl_assertion_failed +_02244E10: + ldr r0, [sp, #0x34] + cmp r0, #0 + bge _02244E30 + ldr r0, _02245C9C ; =ov45_02255588 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CA0 ; =0x00000227 + bl __msl_assertion_failed +_02244E30: + add r2, sp, #0 + mov r1, #0 + str r1, [r2] + str r1, [r2, #4] + ldr r0, [sp, #0x3c] + str r1, [r2, #8] + str r1, [r2, #0xc] + str r1, [r2, #0x10] + str r1, [r2, #0x14] + str r7, [sp] + str r6, [sp, #4] + bl ov00_021EC3A8 + str r0, [sp, #8] + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, [sp, #0x3c] + mov r1, r4 + bl memcpy + ldr r0, [sp, #0x38] + ldr r2, [sp, #0x30] + ldr r1, [sp, #0x34] + cmp r0, #0 + moveq r0, #0 + str r2, [sp, #0xc] + str r1, [sp, #0x10] + streq r0, [sp, #0x14] + beq _02244EE0 + bl strlen + mov r6, r0 + add r0, r6, #1 + bl ov00_021EC3A8 + str r0, [sp, #0x14] + cmp r0, #0 + bne _02244ED4 + ldr r0, [sp, #8] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02244ED4: + ldr r1, [sp, #0x38] + add r2, r6, #1 + bl memcpy +_02244EE0: + ldr r0, [sp] + cmp r0, #0x1f + addls pc, pc, r0, lsl #2 + b _02246B4C +_02244EF0: ; jump table + b _02244F70 ; case 0 + b _02244FAC ; case 1 + b _02244FE8 ; case 2 + b _0224505C ; case 3 + b _022450D0 ; case 4 + b _0224517C ; case 5 + b _02245228 ; case 6 + b _0224529C ; case 7 + b _02245380 ; case 8 + b _0224542C ; case 9 + b _022454A0 ; case 10 + b _02245528 ; case 11 + b _0224559C ; case 12 + b _022455D8 ; case 13 + b _0224564C ; case 14 + b _022458E4 ; case 15 + b _02245920 ; case 16 + b _02245994 ; case 17 + b _02245A1C ; case 18 + b _02245A90 ; case 19 + b _02245CC4 ; case 20 + b _02245EAC ; case 21 + b _02245F58 ; case 22 + b _0224603C ; case 23 + b _022460B0 ; case 24 + b _022461F0 ; case 25 + b _02246330 ; case 26 + b _022463A4 ; case 27 + b _02246574 ; case 28 + b _02246658 ; case 29 + b _02246898 ; case 30 + b _02246B10 ; case 31 +_02244F70: + ldr r0, [r4] + ldr r4, [sp, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r4] + cmp r0, #0 + bne _02246B60 + mov r0, r4 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02244FAC: + ldr r0, [r4] + ldr r4, [sp, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r4] + cmp r0, #0 + bne _02246B60 + mov r0, r4 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02244FE8: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245024 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _02245024 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245024: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224505C: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245098 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _02245098 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245098: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022450D0: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _0224510C + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _0224510C + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224510C: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02245144 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02245144 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245144: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224517C: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022451B8 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _022451B8 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022451B8: + ldr r0, [r4, #4] + cmp r0, #0 + beq _022451F0 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _022451F0 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022451F0: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245228: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245264 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _02245264 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245264: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224529C: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022452D8 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _022452D8 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022452D8: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02245310 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02245310 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245310: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02245348 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02245348 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245348: + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0x10] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245380: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022453BC + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _022453BC + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022453BC: + ldr r0, [r4, #4] + cmp r0, #0 + beq _022453F4 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _022453F4 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022453F4: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224542C: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245468 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _02245468 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245468: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022454A0: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022454DC + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _022454DC + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022454DC: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + mov r0, #0x20 + bl ov00_021EC3A8 + str r0, [r6, #4] + cmp r0, #0 + bne _02245518 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245518: + ldr r1, [r4, #4] + mov r2, #0x20 + bl memcpy + b _02246B60 +_02245528: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245564 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _02245564 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245564: + ldr r0, [r4, #4] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224559C: + ldr r0, [r4] + ldr r4, [sp, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r4] + cmp r0, #0 + bne _02246B60 + mov r0, r4 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022455D8: + ldr r0, [r4, #8] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245614 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02245614 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245614: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224564C: + ldr r0, [r4, #4] + ldr r8, [sp, #8] + cmp r0, #0 + bge _02245670 + ldr r0, _02245CA4 ; =ov45_02255590 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CA8 ; =0x000002D3 + bl __msl_assertion_failed +_02245670: + ldr r0, [r4, #8] + cmp r0, #0 + moveq r0, #0 + streq r0, [r8, #8] + beq _02245750 + ldr r0, [r4, #4] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r8, #8] + cmp r0, #0 + bne _022456B8 + mov r0, r8 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022456B8: + ldr r0, [r4, #4] + mov r7, #0 + cmp r0, #0 + ble _02245750 + mov r6, r7 +_022456CC: + ldr r0, [r4, #8] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + ldreq r0, [r8, #8] + streq r6, [r0, r7, lsl #2] + beq _02245740 + bl ov00_021FF3D4 + ldr r1, [r8, #8] + str r0, [r1, r7, lsl #2] + ldr r0, [r8, #8] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + bne _02245740 + subs r7, r7, #1 + bmi _0224571C +_02245708: + ldr r0, [r8, #8] + ldr r0, [r0, r7, lsl #2] + bl ov00_021EC3D8 + subs r7, r7, #1 + bpl _02245708 +_0224571C: + ldr r0, [r8, #8] + bl ov00_021EC3D8 + mov r0, r8 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245740: + ldr r0, [r4, #4] + add r7, r7, #1 + cmp r7, r0 + blt _022456CC +_02245750: + ldr r0, [r4, #4] + cmp r0, #0 + bge _02245770 + ldr r0, _02245CA4 ; =ov45_02255590 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + mov r3, #0x2d4 + bl __msl_assertion_failed +_02245770: + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r8, #0xc] + beq _02245850 + ldr r0, [r4, #4] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r8, #0xc] + cmp r0, #0 + bne _022457B8 + mov r0, r8 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022457B8: + ldr r0, [r4, #4] + mov r7, #0 + cmp r0, #0 + ble _02245850 + mov r6, r7 +_022457CC: + ldr r0, [r4, #0xc] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + ldreq r0, [r8, #0xc] + streq r6, [r0, r7, lsl #2] + beq _02245840 + bl ov00_021FF3D4 + ldr r1, [r8, #0xc] + str r0, [r1, r7, lsl #2] + ldr r0, [r8, #0xc] + ldr r0, [r0, r7, lsl #2] + cmp r0, #0 + bne _02245840 + subs r7, r7, #1 + bmi _0224581C +_02245808: + ldr r0, [r8, #0xc] + ldr r0, [r0, r7, lsl #2] + bl ov00_021EC3D8 + subs r7, r7, #1 + bpl _02245808 +_0224581C: + ldr r0, [r8, #0xc] + bl ov00_021EC3D8 + mov r0, r8 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245840: + ldr r0, [r4, #4] + add r7, r7, #1 + cmp r7, r0 + blt _022457CC +_02245850: + ldr r0, [r4, #4] + cmp r0, #0 + bge _02245870 + ldr r0, _02245CA4 ; =ov45_02255590 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CAC ; =0x000002D5 + bl __msl_assertion_failed +_02245870: + ldr r0, [r4, #4] + cmp r0, #0 + ble _02246B60 + ldr r0, [r4, #0x10] + cmp r0, #0 + bne _0224589C + ldr r0, _02245CB0 ; =ov45_022555B0 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CAC ; =0x000002D5 + bl __msl_assertion_failed +_0224589C: + ldr r0, [r4, #4] + mov r6, r0, lsl #2 + mov r0, r6 + bl ov00_021EC3A8 + str r0, [r8, #0x10] + cmp r0, #0 + bne _022458D4 + mov r0, r8 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022458D4: + ldr r1, [r4, #0x10] + mov r2, r6 + bl memcpy + b _02246B60 +_022458E4: + ldr r0, [r4, #8] + ldr r4, [sp, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r4, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r4 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245920: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _0224595C + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _0224595C + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224595C: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245994: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022459D0 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _022459D0 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022459D0: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + mov r0, #0x20 + bl ov00_021EC3A8 + str r0, [r6, #8] + cmp r0, #0 + bne _02245A0C + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245A0C: + ldr r1, [r4, #8] + mov r2, #0x20 + bl memcpy + b _02246B60 +_02245A1C: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245A58 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02245A58 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245A58: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245A90: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _02245ACC + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _02245ACC + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245ACC: + ldr r0, [r4, #8] + cmp r0, #0 + bge _02245AEC + ldr r0, _02245CB4 ; =ov45_022555CC + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CB8 ; =0x00000301 + bl __msl_assertion_failed +_02245AEC: + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0xc] + beq _02245BCC + ldr r0, [r4, #8] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02245B34 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245B34: + ldr r0, [r4, #8] + mov r8, #0 + cmp r0, #0 + ble _02245BCC + mov r6, r8 +_02245B48: + ldr r0, [r4, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0xc] + streq r6, [r0, r8, lsl #2] + beq _02245BBC + bl ov00_021FF3D4 + ldr r1, [r7, #0xc] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _02245BBC + subs r8, r8, #1 + bmi _02245B98 +_02245B84: + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _02245B84 +_02245B98: + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245BBC: + ldr r0, [r4, #8] + add r8, r8, #1 + cmp r8, r0 + blt _02245B48 +_02245BCC: + ldr r0, [r4, #8] + cmp r0, #0 + bge _02245BEC + ldr r0, _02245CB4 ; =ov45_022555CC + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CBC ; =0x00000302 + bl __msl_assertion_failed +_02245BEC: + ldr r0, [r4, #8] + cmp r0, #0 + ble _02246B60 + ldr r0, [r4, #0x10] + cmp r0, #0 + bne _02245C18 + ldr r0, _02245CC0 ; =ov45_022555E8 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02245CBC ; =0x00000302 + bl __msl_assertion_failed +_02245C18: + ldr r0, [r4, #8] + mov r6, r0, lsl #2 + mov r0, r6 + bl ov00_021EC3A8 + str r0, [r7, #0x10] + cmp r0, #0 + bne _02245C50 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245C50: + ldr r1, [r4, #0x10] + mov r2, r6 + bl memcpy + b _02246B60 + .balign 4, 0 +_02245C60: .word ov45_022554F0 +_02245C64: .word ov45_02255468 +_02245C68: .word ov45_022553C8 +_02245C6C: .word 0x0000021F +_02245C70: .word ov45_02255500 +_02245C74: .word 0x00000221 +_02245C78: .word ov45_0225550C +_02245C7C: .word 0x00000222 +_02245C80: .word ov45_02255520 +_02245C84: .word 0x00000223 +_02245C88: .word ov45_02255544 +_02245C8C: .word ov45_02255558 +_02245C90: .word 0x00000225 +_02245C94: .word ov45_02255570 +_02245C98: .word 0x00000226 +_02245C9C: .word ov45_02255588 +_02245CA0: .word 0x00000227 +_02245CA4: .word ov45_02255590 +_02245CA8: .word 0x000002D3 +_02245CAC: .word 0x000002D5 +_02245CB0: .word ov45_022555B0 +_02245CB4: .word ov45_022555CC +_02245CB8: .word 0x00000301 +_02245CBC: .word 0x00000302 +_02245CC0: .word ov45_022555E8 +_02245CC4: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _02245D00 + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _02245D00 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245D00: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02245D38 + bl ov00_021FF3D4 + str r0, [r7, #8] + cmp r0, #0 + bne _02245D38 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245D38: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02245D70 + bl ov00_021FF3D4 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02245D70 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245D70: + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02245DA8 + bl ov00_021FF3D4 + str r0, [r7, #0x10] + cmp r0, #0 + bne _02245DA8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245DA8: + ldr r0, [r4, #0x14] + cmp r0, #0 + bge _02245DC8 + ldr r0, _02245CA4 ; =ov45_02255590 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B78 ; =0x0000030E + bl __msl_assertion_failed +_02245DC8: + ldr r0, [r4, #0x18] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0x18] + beq _02246B60 + ldr r0, [r4, #0x14] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0x18] + cmp r0, #0 + bne _02245E10 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245E10: + ldr r0, [r4, #0x14] + mov r8, #0 + cmp r0, #0 + ble _02246B60 + mov r6, r8 +_02245E24: + ldr r0, [r4, #0x18] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0x18] + streq r6, [r0, r8, lsl #2] + beq _02245E98 + bl ov00_021FF3D4 + ldr r1, [r7, #0x18] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0x18] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _02245E98 + subs r8, r8, #1 + bmi _02245E74 +_02245E60: + ldr r0, [r7, #0x18] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _02245E60 +_02245E74: + ldr r0, [r7, #0x18] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245E98: + ldr r0, [r4, #0x14] + add r8, r8, #1 + cmp r8, r0 + blt _02245E24 + b _02246B60 +_02245EAC: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245EE8 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02245EE8 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245EE8: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02245F20 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02245F20 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245F20: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245F58: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02245F94 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02245F94 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245F94: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02245FCC + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02245FCC + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02245FCC: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02246004 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02246004 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246004: + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0x10] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224603C: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _02246078 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _02246078 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246078: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022460B0: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _022460EC + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _022460EC + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022460EC: + ldr r0, [r4, #8] + cmp r0, #0 + bge _0224610C + ldr r0, _02246B7C ; =ov45_02255604 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B80 ; =0x00000335 + bl __msl_assertion_failed +_0224610C: + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0xc] + beq _02246B60 + ldr r0, [r4, #8] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02246154 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246154: + ldr r0, [r4, #8] + mov r8, #0 + cmp r0, #0 + ble _02246B60 + mov r6, r8 +_02246168: + ldr r0, [r4, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0xc] + streq r6, [r0, r8, lsl #2] + beq _022461DC + bl ov00_021FF3D4 + ldr r1, [r7, #0xc] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _022461DC + subs r8, r8, #1 + bmi _022461B8 +_022461A4: + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _022461A4 +_022461B8: + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022461DC: + ldr r0, [r4, #8] + add r8, r8, #1 + cmp r8, r0 + blt _02246168 + b _02246B60 +_022461F0: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _0224622C + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _0224622C + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224622C: + ldr r0, [r4, #8] + cmp r0, #0 + bge _0224624C + ldr r0, _02246B84 ; =ov45_02255620 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B88 ; =0x0000033E + bl __msl_assertion_failed +_0224624C: + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0xc] + beq _02246B60 + ldr r0, [r4, #8] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02246294 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246294: + ldr r0, [r4, #8] + mov r8, #0 + cmp r0, #0 + ble _02246B60 + mov r6, r8 +_022462A8: + ldr r0, [r4, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0xc] + streq r6, [r0, r8, lsl #2] + beq _0224631C + bl ov00_021FF3D4 + ldr r1, [r7, #0xc] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _0224631C + subs r8, r8, #1 + bmi _022462F8 +_022462E4: + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _022462E4 +_022462F8: + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224631C: + ldr r0, [r4, #8] + add r8, r8, #1 + cmp r8, r0 + blt _022462A8 + b _02246B60 +_02246330: + ldr r0, [r4, #4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _0224636C + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _0224636C + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224636C: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022463A4: + ldr r0, [r4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _022463E0 + bl ov00_021FF3D4 + str r0, [r7] + cmp r0, #0 + bne _022463E0 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022463E0: + ldr r0, [r4, #4] + cmp r0, #0 + bge _02246400 + ldr r0, _02245CB4 ; =ov45_022555CC + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + mov r3, #0x350 + bl __msl_assertion_failed +_02246400: + ldr r0, [r4, #8] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #8] + beq _022464E0 + ldr r0, [r4, #4] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #8] + cmp r0, #0 + bne _02246448 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246448: + ldr r0, [r4, #4] + mov r8, #0 + cmp r0, #0 + ble _022464E0 + mov r6, r8 +_0224645C: + ldr r0, [r4, #8] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #8] + streq r6, [r0, r8, lsl #2] + beq _022464D0 + bl ov00_021FF3D4 + ldr r1, [r7, #8] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #8] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _022464D0 + subs r8, r8, #1 + bmi _022464AC +_02246498: + ldr r0, [r7, #8] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _02246498 +_022464AC: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022464D0: + ldr r0, [r4, #4] + add r8, r8, #1 + cmp r8, r0 + blt _0224645C +_022464E0: + ldr r0, [r4, #4] + cmp r0, #0 + bge _02246500 + ldr r0, _02245CB4 ; =ov45_022555CC + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B8C ; =0x00000351 + bl __msl_assertion_failed +_02246500: + ldr r0, [r4, #4] + cmp r0, #0 + ble _02246B60 + ldr r0, [r4, #0xc] + cmp r0, #0 + bne _0224652C + ldr r0, _02245CC0 ; =ov45_022555E8 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B8C ; =0x00000351 + bl __msl_assertion_failed +_0224652C: + ldr r0, [r4, #4] + mov r6, r0, lsl #2 + mov r0, r6 + bl ov00_021EC3A8 + str r0, [r7, #0xc] + cmp r0, #0 + bne _02246564 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246564: + ldr r1, [r4, #0xc] + mov r2, r6 + bl memcpy + b _02246B60 +_02246574: + ldr r0, [r4] + ldr r6, [sp, #8] + cmp r0, #0 + beq _022465B0 + bl ov00_021FF3D4 + str r0, [r6] + cmp r0, #0 + bne _022465B0 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022465B0: + ldr r0, [r4, #4] + cmp r0, #0 + beq _022465E8 + bl ov00_021FF3D4 + str r0, [r6, #4] + cmp r0, #0 + bne _022465E8 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022465E8: + ldr r0, [r4, #8] + cmp r0, #0 + beq _02246620 + bl ov00_021FF3D4 + str r0, [r6, #8] + cmp r0, #0 + bne _02246620 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246620: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r6, #0xc] + cmp r0, #0 + bne _02246B60 + mov r0, r6 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246658: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _02246694 + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _02246694 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246694: + ldr r0, [r4, #8] + cmp r0, #0 + bge _022466B4 + ldr r0, _02246B90 ; =ov45_02255644 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B94 ; =0x00000365 + bl __msl_assertion_failed +_022466B4: + ldr r0, [r4, #0xc] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0xc] + beq _02246794 + ldr r0, [r4, #8] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0xc] + cmp r0, #0 + bne _022466FC + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022466FC: + ldr r0, [r4, #8] + mov r8, #0 + cmp r0, #0 + ble _02246794 + mov r6, r8 +_02246710: + ldr r0, [r4, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0xc] + streq r6, [r0, r8, lsl #2] + beq _02246784 + bl ov00_021FF3D4 + ldr r1, [r7, #0xc] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _02246784 + subs r8, r8, #1 + bmi _02246760 +_0224674C: + ldr r0, [r7, #0xc] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _0224674C +_02246760: + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246784: + ldr r0, [r4, #8] + add r8, r8, #1 + cmp r8, r0 + blt _02246710 +_02246794: + ldr r0, [r4, #8] + cmp r0, #0 + bge _022467B4 + ldr r0, _02246B90 ; =ov45_02255644 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B98 ; =0x00000366 + bl __msl_assertion_failed +_022467B4: + ldr r0, [r4, #0x10] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0x10] + beq _02246B60 + ldr r0, [r4, #8] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0x10] + cmp r0, #0 + bne _022467FC + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022467FC: + ldr r0, [r4, #8] + mov r8, #0 + cmp r0, #0 + ble _02246B60 + mov r6, r8 +_02246810: + ldr r0, [r4, #0x10] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0x10] + streq r6, [r0, r8, lsl #2] + beq _02246884 + bl ov00_021FF3D4 + ldr r1, [r7, #0x10] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0x10] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _02246884 + subs r8, r8, #1 + bmi _02246860 +_0224684C: + ldr r0, [r7, #0x10] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _0224684C +_02246860: + ldr r0, [r7, #0x10] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246884: + ldr r0, [r4, #8] + add r8, r8, #1 + cmp r8, r0 + blt _02246810 + b _02246B60 +_02246898: + ldr r0, [r4, #4] + ldr r7, [sp, #8] + cmp r0, #0 + beq _022468D4 + bl ov00_021FF3D4 + str r0, [r7, #4] + cmp r0, #0 + bne _022468D4 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022468D4: + ldr r0, [r4, #8] + cmp r0, #0 + beq _0224690C + bl ov00_021FF3D4 + str r0, [r7, #8] + cmp r0, #0 + bne _0224690C + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224690C: + ldr r0, [r4, #0xc] + cmp r0, #0 + bge _0224692C + ldr r0, _02246B90 ; =ov45_02255644 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + mov r3, #0x370 + bl __msl_assertion_failed +_0224692C: + ldr r0, [r4, #0x10] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0x10] + beq _02246A0C + ldr r0, [r4, #0xc] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0x10] + cmp r0, #0 + bne _02246974 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246974: + ldr r0, [r4, #0xc] + mov r8, #0 + cmp r0, #0 + ble _02246A0C + mov r6, r8 +_02246988: + ldr r0, [r4, #0x10] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0x10] + streq r6, [r0, r8, lsl #2] + beq _022469FC + bl ov00_021FF3D4 + ldr r1, [r7, #0x10] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0x10] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _022469FC + subs r8, r8, #1 + bmi _022469D8 +_022469C4: + ldr r0, [r7, #0x10] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _022469C4 +_022469D8: + ldr r0, [r7, #0x10] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022469FC: + ldr r0, [r4, #0xc] + add r8, r8, #1 + cmp r8, r0 + blt _02246988 +_02246A0C: + ldr r0, [r4, #0xc] + cmp r0, #0 + bge _02246A2C + ldr r0, _02246B90 ; =ov45_02255644 + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + ldr r3, _02246B9C ; =0x00000371 + bl __msl_assertion_failed +_02246A2C: + ldr r0, [r4, #0x14] + cmp r0, #0 + moveq r0, #0 + streq r0, [r7, #0x14] + beq _02246B60 + ldr r0, [r4, #0xc] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #0x14] + cmp r0, #0 + bne _02246A74 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246A74: + ldr r0, [r4, #0xc] + mov r8, #0 + cmp r0, #0 + ble _02246B60 + mov r6, r8 +_02246A88: + ldr r0, [r4, #0x14] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + ldreq r0, [r7, #0x14] + streq r6, [r0, r8, lsl #2] + beq _02246AFC + bl ov00_021FF3D4 + ldr r1, [r7, #0x14] + str r0, [r1, r8, lsl #2] + ldr r0, [r7, #0x14] + ldr r0, [r0, r8, lsl #2] + cmp r0, #0 + bne _02246AFC + subs r8, r8, #1 + bmi _02246AD8 +_02246AC4: + ldr r0, [r7, #0x14] + ldr r0, [r0, r8, lsl #2] + bl ov00_021EC3D8 + subs r8, r8, #1 + bpl _02246AC4 +_02246AD8: + ldr r0, [r7, #0x14] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246AFC: + ldr r0, [r4, #0xc] + add r8, r8, #1 + cmp r8, r0 + blt _02246A88 + b _02246B60 +_02246B10: + ldr r0, [r4, #4] + ldr r4, [sp, #8] + cmp r0, #0 + beq _02246B60 + bl ov00_021FF3D4 + str r0, [r4, #4] + cmp r0, #0 + bne _02246B60 + mov r0, r4 + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02246B4C: + ldr r0, _02246BA0 ; =ov45_022554EC + ldr r1, _02245C64 ; =ov45_02255468 + ldr r2, _02245C68 ; =ov45_022553C8 + mov r3, #0x380 + bl __msl_assertion_failed +_02246B60: + ldr r0, [r5, #0x820] + add r1, sp, #0 + bl ov00_021FE754 + mov r0, #1 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02246B78: .word 0x0000030E +_02246B7C: .word ov45_02255604 +_02246B80: .word 0x00000335 +_02246B84: .word ov45_02255620 +_02246B88: .word 0x0000033E +_02246B8C: .word 0x00000351 +_02246B90: .word ov45_02255644 +_02246B94: .word 0x00000365 +_02246B98: .word 0x00000366 +_02246B9C: .word 0x00000371 +_02246BA0: .word ov45_022554EC + arm_func_end ov45_02244D30 + + arm_func_start ov45_02246BA4 +ov45_02246BA4: ; 0x02246BA4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + movs r6, r0 + mov r5, r1 + bne _02246BCC + ldr r0, _0224716C ; =ov45_022554F0 + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247178 ; =0x0000038D + bl __msl_assertion_failed +_02246BCC: + cmp r5, #0 + bne _02246BE8 + ldr r0, _0224717C ; =ov45_02255458 + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246BE8: + ldr r0, [r5] + cmp r0, #0 + bge _02246C08 + ldr r0, _02247184 ; =ov45_02255478 + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246C08: + ldr r0, [r5] + cmp r0, #0x20 + blt _02246C28 + ldr r0, _02247188 ; =ov45_02255488 + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246C28: + ldr r0, [r5, #4] + cmp r0, #0 + bne _02246C48 + ldr r0, _0224718C ; =ov45_022554A4 + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246C48: + ldr r0, [r5, #8] + cmp r0, #0 + bne _02246C68 + ldr r0, _02247190 ; =ov45_022554BC + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246C68: + ldr r0, [r5, #0x10] + cmp r0, #0 + bge _02246C88 + ldr r0, _02247194 ; =ov45_022554DC + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _02247180 ; =0x0000038F + bl __msl_assertion_failed +_02246C88: + ldr r0, [r5] + ldr r4, [r5, #0xc] + cmp r0, #0x1f + addls pc, pc, r0, lsl #2 + b _02247148 +_02246C9C: ; jump table + b _02246D1C ; case 0 + b _02246D38 ; case 1 + b _02246D54 ; case 2 + b _02246D70 ; case 3 + b _02246D8C ; case 4 + b _02246DAC ; case 5 + b _02246DC8 ; case 6 + b _02246DE4 ; case 7 + b _02246E0C ; case 8 + b _02246E28 ; case 9 + b _02246E44 ; case 10 + b _02246E60 ; case 11 + b _02246E7C ; case 12 + b _02246E98 ; case 13 + b _02246EC0 ; case 14 + b _02246EE8 ; case 15 + b _02246F10 ; case 16 + b _02246F2C ; case 17 + b _02246F48 ; case 18 + b _02246F68 ; case 19 + b _02246F90 ; case 20 + b _02246FCC ; case 21 + b _02246FEC ; case 22 + b _02247014 ; case 23 + b _02247034 ; case 24 + b _02247054 ; case 25 + b _02247074 ; case 26 + b _02247090 ; case 27 + b _022470B0 ; case 28 + b _022470D0 ; case 29 + b _022470F8 ; case 30 + b _0224712C ; case 31 +_02246D1C: + ldr r0, [r5, #8] + ldr r3, [r5, #4] + ldr r1, [r0] + mov r0, r6 + mov r2, r4 + blx r3 + b _0224715C +_02246D38: + ldr r0, [r5, #8] + ldr r3, [r5, #4] + ldr r1, [r0] + mov r0, r6 + mov r2, r4 + blx r3 + b _0224715C +_02246D54: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246D70: + ldr r0, [r5, #8] + ldr ip, [r5, #4] + ldmia r0, {r1, r2} + mov r0, r6 + mov r3, r4 + blx ip + b _0224715C +_02246D8C: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246DAC: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246DC8: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246DE4: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246E0C: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246E28: + ldr r0, [r5, #8] + ldr ip, [r5, #4] + ldmia r0, {r1, r2} + mov r0, r6 + mov r3, r4 + blx ip + b _0224715C +_02246E44: + ldr r0, [r5, #8] + ldr ip, [r5, #4] + ldmia r0, {r1, r2} + mov r0, r6 + mov r3, r4 + blx ip + b _0224715C +_02246E60: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246E7C: + ldr r0, [r5, #8] + ldr r3, [r5, #4] + ldr r1, [r0] + mov r0, r6 + mov r2, r4 + blx r3 + b _0224715C +_02246E98: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246EC0: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246EE8: + ldr r7, [r5, #8] + ldr r8, [r5, #4] + ldr r1, [r7, #8] + mov r0, r6 + bl ov45_02248558 + str r4, [sp] + mov r0, r6 + ldmia r7, {r1, r2, r3} + blx r8 + b _0224715C +_02246F10: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246F2C: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246F48: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246F68: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246F90: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + str r1, [sp, #4] + ldr r1, [r3, #0x14] + str r1, [sp, #8] + ldr r1, [r3, #0x18] + str r1, [sp, #0xc] + str r4, [sp, #0x10] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246FCC: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02246FEC: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02247014: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02247034: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02247054: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02247074: + ldr r3, [r5, #8] + mov r0, r6 + str r4, [sp] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_02247090: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_022470B0: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + stmia sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_022470D0: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + stmib sp, {r1, r4} + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_022470F8: + ldr r3, [r5, #8] + mov r0, r6 + ldr r1, [r3, #0xc] + str r1, [sp] + ldr r1, [r3, #0x10] + str r1, [sp, #4] + ldr r1, [r3, #0x14] + str r1, [sp, #8] + str r4, [sp, #0xc] + ldr r4, [r5, #4] + ldmia r3, {r1, r2, r3} + blx r4 + b _0224715C +_0224712C: + ldr r0, [r5, #8] + ldr ip, [r5, #4] + ldmia r0, {r1, r2} + mov r0, r6 + mov r3, r4 + blx ip + b _0224715C +_02247148: + ldr r0, _02247198 ; =ov45_022554EC + ldr r1, _02247170 ; =ov45_02255468 + ldr r2, _02247174 ; =ov45_022553D8 + ldr r3, _0224719C ; =0x000005EF + bl __msl_assertion_failed +_0224715C: + mov r0, r5 + bl ov45_02244500 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224716C: .word ov45_022554F0 +_02247170: .word ov45_02255468 +_02247174: .word ov45_022553D8 +_02247178: .word 0x0000038D +_0224717C: .word ov45_02255458 +_02247180: .word 0x0000038F +_02247184: .word ov45_02255478 +_02247188: .word ov45_02255488 +_0224718C: .word ov45_022554A4 +_02247190: .word ov45_022554BC +_02247194: .word ov45_022554DC +_02247198: .word ov45_022554EC +_0224719C: .word 0x000005EF + arm_func_end ov45_02246BA4 + + arm_func_start ov45_022471A0 +ov45_022471A0: ; 0x022471A0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + movs sl, r0 + mov sb, r1 + bne _022471C8 + ldr r0, _02247370 ; =ov45_022554F0 + ldr r1, _02247374 ; =ov45_02255468 + ldr r2, _02247378 ; =ov45_022553E8 + ldr r3, _0224737C ; =0x000005FC + bl __msl_assertion_failed +_022471C8: + ldr r0, [sl, #0x820] + mov r8, #0 + bl ArrayLength + cmp r0, #0 + addle sp, sp, #0x18 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr fp, _02247380 ; =ov45_02255458 + ldr r6, _02247374 ; =ov45_02255468 + ldr r5, _02247378 ; =ov45_022553E8 + ldr r4, _02247384 ; =0x00000605 +_022471F0: + ldr r0, [sl, #0x820] + mov r1, r8 + bl ov00_021FE6EC + movs r7, r0 + bne _02247218 + mov r0, fp + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02247218: + ldr r0, [r7] + cmp r0, #0 + bge _02247238 + ldr r0, _02247388 ; =ov45_02255478 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02247238: + ldr r0, [r7] + cmp r0, #0x20 + blt _02247258 + ldr r0, _0224738C ; =ov45_02255488 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02247258: + ldr r0, [r7, #4] + cmp r0, #0 + bne _02247278 + ldr r0, _02247390 ; =ov45_022554A4 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02247278: + ldr r0, [r7, #8] + cmp r0, #0 + bne _02247298 + ldr r0, _02247394 ; =ov45_022554BC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_02247298: + ldr r0, [r7, #0x10] + cmp r0, #0 + bge _022472B8 + ldr r0, _02247398 ; =ov45_022554DC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_022472B8: + ldr r1, [r7, #0x14] + cmp r1, #0 + beq _022472EC + mov r0, sl + bl ov45_02248238 + cmp r0, #0 + bne _022472EC + mov r0, r7 + bl ov45_02244500 + ldr r0, [sl, #0x820] + mov r1, r8 + bl ov00_021FE968 + b _02247358 +_022472EC: + ldr r1, [r7, #0x14] + cmp r1, #0 + beq _02247308 + mov r0, sl + bl ov45_0224861C + cmp r0, #0 + beq _02247354 +_02247308: + cmp sb, #0 + ldrne r0, [r7, #0x10] + cmpne r0, sb + bne _02247354 + add ip, sp, #0 + ldmia r7!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r7, {r0, r1} + stmia ip, {r0, r1} + ldr r0, [sl, #0x820] + mov r1, r8 + bl ov00_021FE968 + mov r0, sl + add r1, sp, #0 + bl ov45_02246BA4 + cmp sb, #0 + beq _02247358 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02247354: + add r8, r8, #1 +_02247358: + ldr r0, [sl, #0x820] + bl ArrayLength + cmp r8, r0 + blt _022471F0 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02247370: .word ov45_022554F0 +_02247374: .word ov45_02255468 +_02247378: .word ov45_022553E8 +_0224737C: .word 0x000005FC +_02247380: .word ov45_02255458 +_02247384: .word 0x00000605 +_02247388: .word ov45_02255478 +_0224738C: .word ov45_02255488 +_02247390: .word ov45_022554A4 +_02247394: .word ov45_022554BC +_02247398: .word ov45_022554DC + arm_func_end ov45_022471A0 + + arm_func_start ov45_0224739C +ov45_0224739C: ; 0x0224739C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + mov sb, r1 + bne _022473C0 + ldr r0, _022474D0 ; =ov45_022554F0 + ldr r1, _022474D4 ; =ov45_02255468 + ldr r2, _022474D8 ; =ov45_02255420 + ldr r3, _022474DC ; =0x0000063B + bl __msl_assertion_failed +_022473C0: + ldr r0, [sl, #0x820] + bl ArrayLength + mov fp, r0 + cmp fp, #0 + mov r8, #0 + ble _022474C8 + ldr r6, _022474D4 ; =ov45_02255468 + ldr r5, _022474D8 ; =ov45_02255420 + ldr r4, _022474E0 ; =0x00000648 +_022473E4: + ldr r0, [sl, #0x820] + mov r1, r8 + bl ov00_021FE6EC + movs r7, r0 + bne _0224740C + ldr r0, _022474E4 ; =ov45_02255458 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0224740C: + ldr r0, [r7] + cmp r0, #0 + bge _0224742C + ldr r0, _022474E8 ; =ov45_02255478 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0224742C: + ldr r0, [r7] + cmp r0, #0x20 + blt _0224744C + ldr r0, _022474EC ; =ov45_02255488 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0224744C: + ldr r0, [r7, #4] + cmp r0, #0 + bne _0224746C + ldr r0, _022474F0 ; =ov45_022554A4 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0224746C: + ldr r0, [r7, #8] + cmp r0, #0 + bne _0224748C + ldr r0, _022474F4 ; =ov45_022554BC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_0224748C: + ldr r0, [r7, #0x10] + cmp r0, #0 + bge _022474AC + ldr r0, _022474F8 ; =ov45_022554DC + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl __msl_assertion_failed +_022474AC: + ldr r0, [r7, #0x10] + cmp r0, sb + moveq r0, r8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r8, r8, #1 + cmp r8, fp + blt _022473E4 +_022474C8: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022474D0: .word ov45_022554F0 +_022474D4: .word ov45_02255468 +_022474D8: .word ov45_02255420 +_022474DC: .word 0x0000063B +_022474E0: .word 0x00000648 +_022474E4: .word ov45_02255458 +_022474E8: .word ov45_02255478 +_022474EC: .word ov45_02255488 +_022474F0: .word ov45_022554A4 +_022474F4: .word ov45_022554BC +_022474F8: .word ov45_022554DC + arm_func_end ov45_0224739C + + arm_func_start ov45_022474FC +ov45_022474FC: ; 0x022474FC + stmdb sp!, {r3, lr} + bl ov45_0224739C + mvn r1, #0 + cmp r0, r1 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov45_022474FC + + arm_func_start ov45_02247518 +ov45_02247518: ; 0x02247518 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224753C + ldr r0, _022475A4 ; =ov45_0225590C + ldr r1, _022475A8 ; =ov45_02255918 + ldr r2, _022475AC ; =ov45_02255668 + mov r3, #0x99 + bl __msl_assertion_failed +_0224753C: + ldrsb r0, [r5] + cmp r0, #0 + bne _0224755C + ldr r0, _022475B0 ; =ov45_02255928 + ldr r1, _022475A8 ; =ov45_02255918 + ldr r2, _022475AC ; =ov45_02255668 + mov r3, #0x99 + bl __msl_assertion_failed +_0224755C: + ldrsb r2, [r5], #1 + mov r0, #0 + cmp r2, #0 + beq _02247594 + ldr r1, _022475B4 ; =_0210E404 +_02247570: + cmp r2, #0 + blt _02247584 + cmp r2, #0x80 + bge _02247584 + ldrb r2, [r1, r2] +_02247584: + add r0, r0, r2 + ldrsb r2, [r5], #1 + cmp r2, #0 + bne _02247570 +_02247594: + mov r1, r4 + bl _s32_div_f + mov r0, r1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022475A4: .word ov45_0225590C +_022475A8: .word ov45_02255918 +_022475AC: .word ov45_02255668 +_022475B0: .word ov45_02255928 +_022475B4: .word _0210E404 + arm_func_end ov45_02247518 + + arm_func_start ov45_022475B8 +ov45_022475B8: ; 0x022475B8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1e4 + ldr r2, _022475EC ; =0x00000101 + mov r4, r0 + add r0, sp, #0 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x100] + ldr r0, [r4, #0x80c] + add r1, sp, #0 + bl ov00_021FF0C0 + add sp, sp, #0x1e4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_022475EC: .word 0x00000101 + arm_func_end ov45_022475B8 + + arm_func_start ov45_022475F0 +ov45_022475F0: ; 0x022475F0 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02247614 + ldr r0, _02247640 ; =ov45_02255938 + ldr r1, _02247644 ; =ov45_02255918 + ldr r2, _02247648 ; =ov45_022557FC + mov r3, #0xb4 + bl __msl_assertion_failed +_02247614: + cmp r4, #0 + bgt _02247630 + ldr r0, _0224764C ; =ov45_02255948 + ldr r1, _02247644 ; =ov45_02255918 + ldr r2, _02247648 ; =ov45_022557FC + mov r3, #0xb5 + bl __msl_assertion_failed +_02247630: + mov r0, r5 + mov r1, r4 + bl ov45_02247518 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02247640: .word ov45_02255938 +_02247644: .word ov45_02255918 +_02247648: .word ov45_022557FC +_0224764C: .word ov45_02255948 + arm_func_end ov45_022475F0 + + arm_func_start ov45_02247650 +ov45_02247650: ; 0x02247650 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02247674 + ldr r0, _02247750 ; =ov45_02255958 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc1 + bl __msl_assertion_failed +_02247674: + cmp r4, #0 + bne _02247690 + ldr r0, _0224775C ; =ov45_02255968 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc2 + bl __msl_assertion_failed +_02247690: + cmp r5, #0 + bne _022476AC + ldr r0, _02247760 ; =ov45_02255978 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc6 + bl __msl_assertion_failed +_022476AC: + cmp r4, #0 + bne _022476C8 + ldr r0, _02247764 ; =ov45_02255988 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc7 + bl __msl_assertion_failed +_022476C8: + cmp r5, #0 + bne _022476E4 + ldr r0, _02247760 ; =ov45_02255978 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc8 + bl __msl_assertion_failed +_022476E4: + ldrsb r0, [r5] + cmp r0, #0 + bne _02247704 + ldr r0, _02247768 ; =ov45_02255998 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc8 + bl __msl_assertion_failed +_02247704: + cmp r4, #0 + bne _02247720 + ldr r0, _02247764 ; =ov45_02255988 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc9 + bl __msl_assertion_failed +_02247720: + ldrsb r0, [r4] + cmp r0, #0 + bne _02247740 + ldr r0, _0224776C ; =ov45_022559A8 + ldr r1, _02247754 ; =ov45_02255918 + ldr r2, _02247758 ; =ov45_022558BC + mov r3, #0xc9 + bl __msl_assertion_failed +_02247740: + mov r0, r5 + mov r1, r4 + bl strnicmp + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02247750: .word ov45_02255958 +_02247754: .word ov45_02255918 +_02247758: .word ov45_022558BC +_0224775C: .word ov45_02255968 +_02247760: .word ov45_02255978 +_02247764: .word ov45_02255988 +_02247768: .word ov45_02255998 +_0224776C: .word ov45_022559A8 + arm_func_end ov45_02247650 + + arm_func_start ov45_02247770 +ov45_02247770: ; 0x02247770 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02247790 + ldr r0, _022477AC ; =ov45_02255938 + ldr r1, _022477B0 ; =ov45_02255918 + ldr r2, _022477B4 ; =ov45_022558F0 + mov r3, #0xd2 + bl __msl_assertion_failed +_02247790: + ldr r0, [r4, #0x15c] + bl ov00_021EC3D8 + ldr r0, [r4, #0x134] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021FEE8C + ldmia sp!, {r4, pc} + .balign 4, 0 +_022477AC: .word ov45_02255938 +_022477B0: .word ov45_02255918 +_022477B4: .word ov45_022558F0 + arm_func_end ov45_02247770 + + arm_func_start ov45_022477B8 +ov45_022477B8: ; 0x022477B8 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _022477DC + ldr r0, _02247808 ; =ov45_02255938 + ldr r1, _0224780C ; =ov45_02255918 + ldr r2, _02247810 ; =ov45_02255714 + mov r3, #0xe1 + bl __msl_assertion_failed +_022477DC: + cmp r4, #0 + bgt _022477F8 + ldr r0, _02247814 ; =ov45_02255948 + ldr r1, _0224780C ; =ov45_02255918 + ldr r2, _02247810 ; =ov45_02255714 + mov r3, #0xe2 + bl __msl_assertion_failed +_022477F8: + mov r0, r5 + mov r1, r4 + bl ov45_02247518 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02247808: .word ov45_02255938 +_0224780C: .word ov45_02255918 +_02247810: .word ov45_02255714 +_02247814: .word ov45_02255948 + arm_func_end ov45_022477B8 + + arm_func_start ov45_02247818 +ov45_02247818: ; 0x02247818 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224783C + ldr r0, _0224790C ; =ov45_02255958 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + mov r3, #0xee + bl __msl_assertion_failed +_0224783C: + cmp r4, #0 + bne _02247858 + ldr r0, _02247918 ; =ov45_02255968 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + mov r3, #0xef + bl __msl_assertion_failed +_02247858: + cmp r5, #0 + cmpne r4, #0 + bne _02247884 + cmp r5, #0 + cmpeq r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r5, #0 + mvneq r0, #0 + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_02247884: + cmp r5, #0 + bne _022478A0 + ldr r0, _0224791C ; =ov45_02255978 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + ldr r3, _02247920 ; =0x00000102 + bl __msl_assertion_failed +_022478A0: + ldrsb r0, [r5] + cmp r0, #0 + bne _022478C0 + ldr r0, _02247924 ; =ov45_02255998 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + ldr r3, _02247920 ; =0x00000102 + bl __msl_assertion_failed +_022478C0: + cmp r4, #0 + bne _022478DC + ldr r0, _02247928 ; =ov45_02255988 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + ldr r3, _0224792C ; =0x00000103 + bl __msl_assertion_failed +_022478DC: + ldrsb r0, [r4] + cmp r0, #0 + bne _022478FC + ldr r0, _02247930 ; =ov45_022559A8 + ldr r1, _02247910 ; =ov45_02255918 + ldr r2, _02247914 ; =ov45_022557B4 + ldr r3, _0224792C ; =0x00000103 + bl __msl_assertion_failed +_022478FC: + mov r0, r5 + mov r1, r4 + bl strnicmp + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224790C: .word ov45_02255958 +_02247910: .word ov45_02255918 +_02247914: .word ov45_022557B4 +_02247918: .word ov45_02255968 +_0224791C: .word ov45_02255978 +_02247920: .word 0x00000102 +_02247924: .word ov45_02255998 +_02247928: .word ov45_02255988 +_0224792C: .word 0x00000103 +_02247930: .word ov45_022559A8 + arm_func_end ov45_02247818 + + arm_func_start ov45_02247934 +ov45_02247934: ; 0x02247934 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02247958 ; =ov45_02255938 + ldr r1, _0224795C ; =ov45_02255918 + ldr r2, _02247960 ; =ov45_022558D4 + ldr r3, _02247964 ; =0x0000010A + bl __msl_assertion_failed + ldmia sp!, {r3, pc} + .balign 4, 0 +_02247958: .word ov45_02255938 +_0224795C: .word ov45_02255918 +_02247960: .word ov45_022558D4 +_02247964: .word 0x0000010A + arm_func_end ov45_02247934 + + arm_func_start ov45_02247968 +ov45_02247968: ; 0x02247968 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _022479E4 ; =ov45_02247650 + ldr ip, _022479E8 ; =ov45_02247770 + str r1, [sp] + mov r4, r0 + ldr r3, _022479EC ; =ov45_022475F0 + mov r0, #0x1e4 + mov r1, #7 + mov r2, #2 + str ip, [sp, #4] + bl ov00_021FED4C + cmp r0, #0 + str r0, [r4, #0x80c] + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + mov r2, r1 + mov r0, #0x1e4 + bl ov00_021FE5B4 + cmp r0, #0 + str r0, [r4, #0x810] + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #0x80c] + bl ov00_021FEE8C + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_022479E4: .word ov45_02247650 +_022479E8: .word ov45_02247770 +_022479EC: .word ov45_022475F0 + arm_func_end ov45_02247968 + + arm_func_start ov45_022479F0 +ov45_022479F0: ; 0x022479F0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02247A10 + ldr r0, _02247A34 ; =ov45_022559B8 + ldr r1, _02247A38 ; =ov45_02255918 + ldr r2, _02247A3C ; =ov45_02255700 + ldr r3, _02247A40 ; =0x00000127 + bl __msl_assertion_failed +_02247A10: + ldr r0, [r4, #0x80c] + cmp r0, #0 + beq _02247A20 + bl ov00_021FEE8C +_02247A20: + ldr r0, [r4, #0x810] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl ov00_021FE678 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02247A34: .word ov45_022559B8 +_02247A38: .word ov45_02255918 +_02247A3C: .word ov45_02255700 +_02247A40: .word 0x00000127 + arm_func_end ov45_022479F0 + + arm_func_start ov45_02247A44 +ov45_02247A44: ; 0x02247A44 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x1e4 + movs r5, r0 + mov r4, r1 + bne _02247A6C + ldr r0, _02247AC4 ; =ov45_022559B8 + ldr r1, _02247AC8 ; =ov45_02255918 + ldr r2, _02247ACC ; =ov45_0225573C + mov r3, #0x134 + bl __msl_assertion_failed +_02247A6C: + mov r0, #0 + add lr, sp, #0 + mov r1, r0 + mov r2, r0 + mov r3, r0 + mov ip, #0xf +_02247A84: + stmia lr!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _02247A84 + ldr r2, _02247AD0 ; =0x00000101 + str r0, [lr] + add r0, sp, #0 + mov r1, r4 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x100] + ldr r0, [r5, #0x810] + add r1, sp, #0 + bl ov00_021FE754 + add sp, sp, #0x1e4 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_02247AC4: .word ov45_022559B8 +_02247AC8: .word ov45_02255918 +_02247ACC: .word ov45_0225573C +_02247AD0: .word 0x00000101 + arm_func_end ov45_02247A44 + + arm_func_start ov45_02247AD4 +ov45_02247AD4: ; 0x02247AD4 + ldr ip, _02247ADC ; =strnicmp + bx ip + .balign 4, 0 +_02247ADC: .word strnicmp + arm_func_end ov45_02247AD4 + + arm_func_start ov45_02247AE0 +ov45_02247AE0: ; 0x02247AE0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + mov sb, r1 + bne _02247B04 + ldr r0, _02247B7C ; =ov45_022559B8 + ldr r1, _02247B80 ; =ov45_02255918 + ldr r2, _02247B84 ; =ov45_022557A0 + ldr r3, _02247B88 ; =0x0000014D + bl __msl_assertion_failed +_02247B04: + ldr r0, [sl, #0x810] + bl ArrayLength + mov r7, r0 + cmp r7, #0 + mov r6, #0 + ble _02247B74 + ldr r5, _02247B8C ; =ov45_022559C8 + ldr r4, _02247B80 ; =ov45_02255918 + ldr fp, _02247B84 ; =ov45_022557A0 +_02247B28: + ldr r0, [sl, #0x810] + mov r1, r6 + bl ov00_021FE6EC + movs r8, r0 + bne _02247B50 + ldr r3, _02247B90 ; =0x00000153 + mov r0, r5 + mov r1, r4 + mov r2, fp + bl __msl_assertion_failed +_02247B50: + mov r0, r8 + mov r1, sb + bl strnicmp + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r6, r6, #1 + cmp r6, r7 + blt _02247B28 +_02247B74: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02247B7C: .word ov45_022559B8 +_02247B80: .word ov45_02255918 +_02247B84: .word ov45_022557A0 +_02247B88: .word 0x0000014D +_02247B8C: .word ov45_022559C8 +_02247B90: .word 0x00000153 + arm_func_end ov45_02247AE0 + + arm_func_start ov45_02247B94 +ov45_02247B94: ; 0x02247B94 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1ec + movs r7, r0 + mov r6, r1 + mov r5, r2 + bne _02247BC0 + ldr r0, _02247D48 ; =ov45_022559B8 + ldr r1, _02247D4C ; =ov45_02255918 + ldr r2, _02247D50 ; =ov45_0225569C + mov r3, #0x160 + bl __msl_assertion_failed +_02247BC0: + cmp r6, #0 + bne _02247BDC + ldr r0, _02247D54 ; =ov45_022559D4 + ldr r1, _02247D4C ; =ov45_02255918 + ldr r2, _02247D50 ; =ov45_0225569C + ldr r3, _02247D58 ; =0x00000162 + bl __msl_assertion_failed +_02247BDC: + ldrsb r0, [r6] + cmp r0, #0 + bne _02247BFC + ldr r0, _02247D5C ; =ov45_022559E4 + ldr r1, _02247D4C ; =ov45_02255918 + ldr r2, _02247D50 ; =ov45_0225569C + ldr r3, _02247D58 ; =0x00000162 + bl __msl_assertion_failed +_02247BFC: + mov r0, r6 + bl strlen + ldr r3, _02247D60 ; =0x00000101 + cmp r0, r3 + blo _02247C24 + ldr r0, _02247D64 ; =ov45_022559F8 + ldr r1, _02247D4C ; =ov45_02255918 + ldr r2, _02247D50 ; =ov45_0225569C + add r3, r3, #0x61 + bl __msl_assertion_failed +_02247C24: + cmp r5, #0 + bne _02247C40 + ldr r0, _02247D68 ; =ov45_02255A18 + ldr r1, _02247D4C ; =ov45_02255918 + ldr r2, _02247D50 ; =ov45_0225569C + ldr r3, _02247D6C ; =0x00000163 + bl __msl_assertion_failed +_02247C40: + mov r0, #2 + bl ov00_021EC3A8 + movs r4, r0 + addeq sp, sp, #0x1ec + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r1, _02247D70 ; =ov45_02255A2C + mov r0, #0 + ldrb ip, [r1] + add lr, sp, #8 + mov r1, r0 + strb ip, [r4] + mov r2, r0 + mov r3, r0 + mov ip, #0xf +_02247C78: + stmia lr!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _02247C78 + str r0, [lr] + add ip, sp, #0x10c + ldmia r5!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r5, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + ldr r2, _02247D60 ; =0x00000101 + mov r1, r6 + add r0, sp, #8 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x108] + ldr r1, _02247D74 ; =ov45_02247818 + ldr r0, _02247D78 ; =ov45_02247934 + str r1, [sp] + str r0, [sp, #4] + ldr r3, _02247D7C ; =ov45_022477B8 + mov r0, #0xe0 + mov r1, #0x3d + mov r2, #2 + bl ov00_021FED4C + str r0, [sp, #0x13c] + cmp r0, #0 + addeq sp, sp, #0x1ec + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r3, #0 + str r3, [sp, #0x160] + str r4, [sp, #0x164] + str r3, [sp, #0x168] + strb r3, [sp, #0x16c] + str r3, [sp] + ldr r0, [r7, #0x810] + ldr r2, _02247D80 ; =ov45_02247AD4 + add r1, sp, #8 + bl ov00_021FEA40 + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + beq _02247D34 + ldr r0, [r7, #0x810] + bl ov00_021FE8D8 +_02247D34: + ldr r0, [r7, #0x80c] + add r1, sp, #8 + bl ov00_021FEF74 + add sp, sp, #0x1ec + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02247D48: .word ov45_022559B8 +_02247D4C: .word ov45_02255918 +_02247D50: .word ov45_0225569C +_02247D54: .word ov45_022559D4 +_02247D58: .word 0x00000162 +_02247D5C: .word ov45_022559E4 +_02247D60: .word 0x00000101 +_02247D64: .word ov45_022559F8 +_02247D68: .word ov45_02255A18 +_02247D6C: .word 0x00000163 +_02247D70: .word ov45_02255A2C +_02247D74: .word ov45_02247818 +_02247D78: .word ov45_02247934 +_02247D7C: .word ov45_022477B8 +_02247D80: .word ov45_02247AD4 + arm_func_end ov45_02247B94 + + arm_func_start ov45_02247D84 +ov45_02247D84: ; 0x02247D84 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x1e8 + movs r5, r0 + mov r4, r1 + bne _02247DAC + ldr r0, _02247E70 ; =ov45_022559B8 + ldr r1, _02247E74 ; =ov45_02255918 + ldr r2, _02247E78 ; =ov45_02255678 + ldr r3, _02247E7C ; =0x00000189 + bl __msl_assertion_failed +_02247DAC: + cmp r4, #0 + bne _02247DC8 + ldr r0, _02247E80 ; =ov45_022559D4 + ldr r1, _02247E74 ; =ov45_02255918 + ldr r2, _02247E78 ; =ov45_02255678 + ldr r3, _02247E84 ; =0x0000018B + bl __msl_assertion_failed +_02247DC8: + ldrsb r0, [r4] + cmp r0, #0 + bne _02247DE8 + ldr r0, _02247E88 ; =ov45_022559E4 + ldr r1, _02247E74 ; =ov45_02255918 + ldr r2, _02247E78 ; =ov45_02255678 + ldr r3, _02247E84 ; =0x0000018B + bl __msl_assertion_failed +_02247DE8: + mov r0, r4 + bl strlen + ldr r3, _02247E8C ; =0x00000101 + cmp r0, r3 + blo _02247E10 + ldr r0, _02247E90 ; =ov45_022559F8 + ldr r1, _02247E74 ; =ov45_02255918 + ldr r2, _02247E78 ; =ov45_02255678 + add r3, r3, #0x8a + bl __msl_assertion_failed +_02247E10: + ldr r2, _02247E8C ; =0x00000101 + add r0, sp, #4 + mov r1, r4 + bl strncpy + mov r3, #0 + strb r3, [sp, #0x104] + str r3, [sp] + ldr r0, [r5, #0x810] + ldr r2, _02247E94 ; =ov45_02247AD4 + add r1, sp, #4 + bl ov00_021FEA40 + mov r1, r0 + mvn r0, #0 + cmp r1, r0 + beq _02247E5C + ldr r0, [r5, #0x810] + bl ov00_021FE8D8 + add sp, sp, #0x1e8 + ldmia sp!, {r3, r4, r5, pc} +_02247E5C: + ldr r0, [r5, #0x80c] + add r1, sp, #4 + bl ov00_021FF01C + add sp, sp, #0x1e8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02247E70: .word ov45_022559B8 +_02247E74: .word ov45_02255918 +_02247E78: .word ov45_02255678 +_02247E7C: .word 0x00000189 +_02247E80: .word ov45_022559D4 +_02247E84: .word 0x0000018B +_02247E88: .word ov45_022559E4 +_02247E8C: .word 0x00000101 +_02247E90: .word ov45_022559F8 +_02247E94: .word ov45_02247AD4 + arm_func_end ov45_02247D84 + + arm_func_start ov45_02247E98 +ov45_02247E98: ; 0x02247E98 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02247EBC + ldr r0, _02247F3C ; =ov45_022559B8 + ldr r1, _02247F40 ; =ov45_02255918 + ldr r2, _02247F44 ; =ov45_02255844 + ldr r3, _02247F48 ; =0x000001A9 + bl __msl_assertion_failed +_02247EBC: + cmp r4, #0 + bne _02247ED8 + ldr r0, _02247F4C ; =ov45_022559D4 + ldr r1, _02247F40 ; =ov45_02255918 + ldr r2, _02247F44 ; =ov45_02255844 + ldr r3, _02247F50 ; =0x000001AB + bl __msl_assertion_failed +_02247ED8: + ldrsb r0, [r4] + cmp r0, #0 + bne _02247EF8 + ldr r0, _02247F54 ; =ov45_022559E4 + ldr r1, _02247F40 ; =ov45_02255918 + ldr r2, _02247F44 ; =ov45_02255844 + ldr r3, _02247F50 ; =0x000001AB + bl __msl_assertion_failed +_02247EF8: + mov r0, r4 + bl strlen + ldr r3, _02247F58 ; =0x00000101 + cmp r0, r3 + blo _02247F20 + ldr r0, _02247F5C ; =ov45_022559F8 + ldr r1, _02247F40 ; =ov45_02255918 + ldr r2, _02247F44 ; =ov45_02255844 + add r3, r3, #0xaa + bl __msl_assertion_failed +_02247F20: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + cmp r0, #0 + moveq r0, #0 + addne r0, r0, #0x104 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02247F3C: .word ov45_022559B8 +_02247F40: .word ov45_02255918 +_02247F44: .word ov45_02255844 +_02247F48: .word 0x000001A9 +_02247F4C: .word ov45_022559D4 +_02247F50: .word 0x000001AB +_02247F54: .word ov45_022559E4 +_02247F58: .word 0x00000101 +_02247F5C: .word ov45_022559F8 + arm_func_end ov45_02247E98 + + arm_func_start ov45_02247F60 +ov45_02247F60: ; 0x02247F60 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02247F84 + ldr r0, _022480B8 ; =ov45_02255938 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + mov r3, #0x1bc + bl __msl_assertion_failed +_02247F84: + cmp r4, #0 + bne _02247FA0 + ldr r0, _022480C4 ; =ov45_02255A30 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480C8 ; =0x000001BD + bl __msl_assertion_failed +_02247FA0: + cmp r5, #0 + bne _02247FBC + ldr r0, _022480CC ; =ov45_02255A44 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480D0 ; =0x000001C2 + bl __msl_assertion_failed +_02247FBC: + ldrsb r0, [r5] + cmp r0, #0 + bne _02247FDC + ldr r0, _022480D4 ; =ov45_02255A58 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480D0 ; =0x000001C2 + bl __msl_assertion_failed +_02247FDC: + mov r0, r5 + bl strlen + cmp r0, #0x80 + blo _02248000 + ldr r0, _022480D8 ; =ov45_02255A70 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480D0 ; =0x000001C2 + bl __msl_assertion_failed +_02248000: + ldr r0, [r4, #4] + cmp r0, #0 + bge _02248020 + ldr r0, _022480DC ; =ov45_02255A90 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480E0 ; =0x000001C7 + bl __msl_assertion_failed +_02248020: + ldr r1, [r4, #4] + ldr r0, [r4, #8] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _02248054 + ldr r0, _022480E4 ; =ov45_02255AA4 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + ldr r3, _022480E8 ; =0x000001D9 + bl __msl_assertion_failed + ldmia sp!, {r3, r4, r5, pc} +_02248054: + str r0, [r4, #8] + ldr r1, [r4, #4] + ldr r0, [r4, #0xc] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224808C + ldr r0, _022480E4 ; =ov45_02255AA4 + ldr r1, _022480BC ; =ov45_02255918 + ldr r2, _022480C0 ; =ov45_0225585C + mov r3, #0x1e0 + bl __msl_assertion_failed + ldmia sp!, {r3, r4, r5, pc} +_0224808C: + str r0, [r4, #0xc] + ldmib r4, {r0, r1} + str r5, [r1, r0, lsl #2] + ldr r2, [r5, #0xdc] + ldr r1, [r4, #0xc] + ldr r0, [r4, #4] + str r2, [r1, r0, lsl #2] + ldr r0, [r4, #4] + add r0, r0, #1 + str r0, [r4, #4] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022480B8: .word ov45_02255938 +_022480BC: .word ov45_02255918 +_022480C0: .word ov45_0225585C +_022480C4: .word ov45_02255A30 +_022480C8: .word 0x000001BD +_022480CC: .word ov45_02255A44 +_022480D0: .word 0x000001C2 +_022480D4: .word ov45_02255A58 +_022480D8: .word ov45_02255A70 +_022480DC: .word ov45_02255A90 +_022480E0: .word 0x000001C7 +_022480E4: .word ov45_02255AA4 +_022480E8: .word 0x000001D9 + arm_func_end ov45_02247F60 + + arm_func_start ov45_022480EC +ov45_022480EC: ; 0x022480EC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0224811C + ldr r0, _0224820C ; =ov45_022559B8 + ldr r1, _02248210 ; =ov45_02255918 + ldr r2, _02248214 ; =ov45_02255778 + mov r3, #0x1f0 + bl __msl_assertion_failed +_0224811C: + cmp r6, #0 + bne _02248138 + ldr r0, _02248218 ; =ov45_022559D4 + ldr r1, _02248210 ; =ov45_02255918 + ldr r2, _02248214 ; =ov45_02255778 + ldr r3, _0224821C ; =0x000001F2 + bl __msl_assertion_failed +_02248138: + ldrsb r0, [r6] + cmp r0, #0 + bne _02248158 + ldr r0, _02248220 ; =ov45_022559E4 + ldr r1, _02248210 ; =ov45_02255918 + ldr r2, _02248214 ; =ov45_02255778 + ldr r3, _0224821C ; =0x000001F2 + bl __msl_assertion_failed +_02248158: + mov r0, r6 + bl strlen + ldr r3, _02248224 ; =0x00000101 + cmp r0, r3 + blo _02248180 + ldr r0, _02248228 ; =ov45_022559F8 + ldr r1, _02248210 ; =ov45_02255918 + ldr r2, _02248214 ; =ov45_02255778 + add r3, r3, #0xf1 + bl __msl_assertion_failed +_02248180: + cmp r5, #0 + bne _0224819C + ldr r0, _0224822C ; =ov45_02255AA8 + ldr r1, _02248210 ; =ov45_02255918 + ldr r2, _02248214 ; =ov45_02255778 + ldr r3, _02248230 ; =0x000001F3 + bl __msl_assertion_failed +_0224819C: + mov r0, r7 + mov r1, r6 + bl ov45_022475B8 + cmp r0, #0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, #0 + str r7, [sp, #8] + str r1, [sp, #0xc] + str r1, [sp, #0x10] + str r1, [sp, #0x14] + ldr r0, [r0, #0x134] + ldr r1, _02248234 ; =ov45_02247F60 + add r2, sp, #8 + bl ov00_021FF160 + ldr r1, [sp, #0x14] + mov r0, r7 + stmia sp, {r1, r4} + ldr r2, [sp, #0xc] + ldr r3, [sp, #0x10] + mov r1, r6 + blx r5 + ldr r0, [sp, #0x10] + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0224820C: .word ov45_022559B8 +_02248210: .word ov45_02255918 +_02248214: .word ov45_02255778 +_02248218: .word ov45_022559D4 +_0224821C: .word 0x000001F2 +_02248220: .word ov45_022559E4 +_02248224: .word 0x00000101 +_02248228: .word ov45_022559F8 +_0224822C: .word ov45_02255AA8 +_02248230: .word 0x000001F3 +_02248234: .word ov45_02247F60 + arm_func_end ov45_022480EC + + arm_func_start ov45_02248238 +ov45_02248238: ; 0x02248238 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224825C + ldr r0, _02248278 ; =ov45_022559B8 + ldr r1, _0224827C ; =ov45_02255918 + ldr r2, _02248280 ; =ov45_0225565C + ldr r3, _02248284 ; =0x0000020F + bl __msl_assertion_failed +_0224825C: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02248278: .word ov45_022559B8 +_0224827C: .word ov45_02255918 +_02248280: .word ov45_0225565C +_02248284: .word 0x0000020F + arm_func_end ov45_02248238 + + arm_func_start ov45_02248288 +ov45_02248288: ; 0x02248288 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _022482B0 + ldr r0, _02248354 ; =ov45_022559B8 + ldr r1, _02248358 ; =ov45_02255918 + ldr r2, _0224835C ; =ov45_022556B0 + ldr r3, _02248360 ; =0x0000021A + bl __msl_assertion_failed +_022482B0: + cmp r5, #0 + bne _022482CC + ldr r0, _02248364 ; =ov45_022559D4 + ldr r1, _02248358 ; =ov45_02255918 + ldr r2, _0224835C ; =ov45_022556B0 + mov r3, #0x21c + bl __msl_assertion_failed +_022482CC: + ldrsb r0, [r5] + cmp r0, #0 + bne _022482EC + ldr r0, _02248368 ; =ov45_022559E4 + ldr r1, _02248358 ; =ov45_02255918 + ldr r2, _0224835C ; =ov45_022556B0 + mov r3, #0x21c + bl __msl_assertion_failed +_022482EC: + mov r0, r5 + bl strlen + ldr r1, _0224836C ; =0x00000101 + cmp r0, r1 + blo _02248314 + ldr r0, _02248370 ; =ov45_022559F8 + ldr r1, _02248358 ; =ov45_02255918 + ldr r2, _0224835C ; =ov45_022556B0 + mov r3, #0x21c + bl __msl_assertion_failed +_02248314: + mov r0, r6 + mov r1, r5 + bl ov45_022475B8 + movs r1, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r1, #0x158] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r4 + add r1, r1, #0x138 + mov r2, #0x20 + bl memcpy + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02248354: .word ov45_022559B8 +_02248358: .word ov45_02255918 +_0224835C: .word ov45_022556B0 +_02248360: .word 0x0000021A +_02248364: .word ov45_022559D4 +_02248368: .word ov45_022559E4 +_0224836C: .word 0x00000101 +_02248370: .word ov45_022559F8 + arm_func_end ov45_02248288 + + arm_func_start ov45_02248374 +ov45_02248374: ; 0x02248374 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _0224839C + ldr r0, _02248430 ; =ov45_022559B8 + ldr r1, _02248434 ; =ov45_02255918 + ldr r2, _02248438 ; =ov45_02255688 + ldr r3, _0224843C ; =0x00000233 + bl __msl_assertion_failed +_0224839C: + cmp r5, #0 + bne _022483B8 + ldr r0, _02248440 ; =ov45_022559D4 + ldr r1, _02248434 ; =ov45_02255918 + ldr r2, _02248438 ; =ov45_02255688 + ldr r3, _02248444 ; =0x00000235 + bl __msl_assertion_failed +_022483B8: + ldrsb r0, [r5] + cmp r0, #0 + bne _022483D8 + ldr r0, _02248448 ; =ov45_022559E4 + ldr r1, _02248434 ; =ov45_02255918 + ldr r2, _02248438 ; =ov45_02255688 + ldr r3, _02248444 ; =0x00000235 + bl __msl_assertion_failed +_022483D8: + mov r0, r5 + bl strlen + ldr r3, _0224844C ; =0x00000101 + cmp r0, r3 + blo _02248400 + ldr r0, _02248450 ; =ov45_022559F8 + ldr r1, _02248434 ; =ov45_02255918 + ldr r2, _02248438 ; =ov45_02255688 + add r3, r3, #0x134 + bl __msl_assertion_failed +_02248400: + mov r0, r6 + mov r1, r5 + bl ov45_022475B8 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, #1 + str r1, [r0, #0x158] + mov r1, r4 + add r0, r0, #0x138 + mov r2, #0x20 + bl memcpy + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02248430: .word ov45_022559B8 +_02248434: .word ov45_02255918 +_02248438: .word ov45_02255688 +_0224843C: .word 0x00000233 +_02248440: .word ov45_022559D4 +_02248444: .word 0x00000235 +_02248448: .word ov45_022559E4 +_0224844C: .word 0x00000101 +_02248450: .word ov45_022559F8 + arm_func_end ov45_02248374 + + arm_func_start ov45_02248454 +ov45_02248454: ; 0x02248454 + stmdb sp!, {r4, r5, r6, lr} + movs r5, r0 + mov r4, r1 + mov r6, r2 + bne _0224847C + ldr r0, _02248534 ; =ov45_022559B8 + ldr r1, _02248538 ; =ov45_02255918 + ldr r2, _0224853C ; =ov45_022557CC + ldr r3, _02248540 ; =0x0000024A + bl __msl_assertion_failed +_0224847C: + cmp r4, #0 + bne _02248498 + ldr r0, _02248544 ; =ov45_022559D4 + ldr r1, _02248538 ; =ov45_02255918 + ldr r2, _0224853C ; =ov45_022557CC + mov r3, #0x24c + bl __msl_assertion_failed +_02248498: + ldrsb r0, [r4] + cmp r0, #0 + bne _022484B8 + ldr r0, _02248548 ; =ov45_022559E4 + ldr r1, _02248538 ; =ov45_02255918 + ldr r2, _0224853C ; =ov45_022557CC + mov r3, #0x24c + bl __msl_assertion_failed +_022484B8: + mov r0, r4 + bl strlen + ldr r1, _0224854C ; =0x00000101 + cmp r0, r1 + blo _022484E0 + ldr r0, _02248550 ; =ov45_022559F8 + ldr r1, _02248538 ; =ov45_02255918 + ldr r2, _0224853C ; =ov45_022557CC + mov r3, #0x24c + bl __msl_assertion_failed +_022484E0: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + movs r5, r0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r5, #0x15c] + bl ov00_021EC3D8 + cmp r6, #0 + ldreq r6, _02248554 ; =ov45_02255A2C + mov r0, r6 + bl strlen + mov r4, r0 + add r0, r4, #1 + bl ov00_021EC3A8 + str r0, [r5, #0x15c] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r6 + add r2, r4, #1 + bl memcpy + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02248534: .word ov45_022559B8 +_02248538: .word ov45_02255918 +_0224853C: .word ov45_022557CC +_02248540: .word 0x0000024A +_02248544: .word ov45_022559D4 +_02248548: .word ov45_022559E4 +_0224854C: .word 0x00000101 +_02248550: .word ov45_022559F8 +_02248554: .word ov45_02255A2C + arm_func_end ov45_02248454 + + arm_func_start ov45_02248558 +ov45_02248558: ; 0x02248558 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224857C + ldr r0, _022485FC ; =ov45_022559B8 + ldr r1, _02248600 ; =ov45_02255918 + ldr r2, _02248604 ; =ov45_022557E4 + mov r3, #0x278 + bl __msl_assertion_failed +_0224857C: + cmp r4, #0 + bne _02248598 + ldr r0, _02248608 ; =ov45_022559D4 + ldr r1, _02248600 ; =ov45_02255918 + ldr r2, _02248604 ; =ov45_022557E4 + ldr r3, _0224860C ; =0x0000027A + bl __msl_assertion_failed +_02248598: + ldrsb r0, [r4] + cmp r0, #0 + bne _022485B8 + ldr r0, _02248610 ; =ov45_022559E4 + ldr r1, _02248600 ; =ov45_02255918 + ldr r2, _02248604 ; =ov45_022557E4 + ldr r3, _0224860C ; =0x0000027A + bl __msl_assertion_failed +_022485B8: + mov r0, r4 + bl strlen + ldr r1, _02248614 ; =0x00000101 + cmp r0, r1 + blo _022485E0 + ldr r0, _02248618 ; =ov45_022559F8 + ldr r1, _02248600 ; =ov45_02255918 + ldr r2, _02248604 ; =ov45_022557E4 + ldr r3, _0224860C ; =0x0000027A + bl __msl_assertion_failed +_022485E0: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + cmp r0, #0 + movne r1, #1 + strne r1, [r0, #0x160] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022485FC: .word ov45_022559B8 +_02248600: .word ov45_02255918 +_02248604: .word ov45_022557E4 +_02248608: .word ov45_022559D4 +_0224860C: .word 0x0000027A +_02248610: .word ov45_022559E4 +_02248614: .word 0x00000101 +_02248618: .word ov45_022559F8 + arm_func_end ov45_02248558 + + arm_func_start ov45_0224861C +ov45_0224861C: ; 0x0224861C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02248640 + ldr r0, _022486C0 ; =ov45_022559B8 + ldr r1, _022486C4 ; =ov45_02255918 + ldr r2, _022486C8 ; =ov45_022558A4 + ldr r3, _022486CC ; =0x0000028A + bl __msl_assertion_failed +_02248640: + cmp r4, #0 + bne _0224865C + ldr r0, _022486D0 ; =ov45_022559D4 + ldr r1, _022486C4 ; =ov45_02255918 + ldr r2, _022486C8 ; =ov45_022558A4 + mov r3, #0x28c + bl __msl_assertion_failed +_0224865C: + ldrsb r0, [r4] + cmp r0, #0 + bne _0224867C + ldr r0, _022486D4 ; =ov45_022559E4 + ldr r1, _022486C4 ; =ov45_02255918 + ldr r2, _022486C8 ; =ov45_022558A4 + mov r3, #0x28c + bl __msl_assertion_failed +_0224867C: + mov r0, r4 + bl strlen + ldr r1, _022486D8 ; =0x00000101 + cmp r0, r1 + blo _022486A4 + ldr r0, _022486DC ; =ov45_022559F8 + ldr r1, _022486C4 ; =ov45_02255918 + ldr r2, _022486C8 ; =ov45_022558A4 + mov r3, #0x28c + bl __msl_assertion_failed +_022486A4: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + cmp r0, #0 + moveq r0, #0 + ldrne r0, [r0, #0x160] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022486C0: .word ov45_022559B8 +_022486C4: .word ov45_02255918 +_022486C8: .word ov45_022558A4 +_022486CC: .word 0x0000028A +_022486D0: .word ov45_022559D4 +_022486D4: .word ov45_022559E4 +_022486D8: .word 0x00000101 +_022486DC: .word ov45_022559F8 + arm_func_end ov45_0224861C + + arm_func_start ov45_022486E0 +ov45_022486E0: ; 0x022486E0 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r4, r1 + mov r5, r2 + bne _02248708 + ldr r0, _0224879C ; =ov45_022559B8 + ldr r1, _022487A0 ; =ov45_02255918 + ldr r2, _022487A4 ; =ov45_02255728 + ldr r3, _022487A8 ; =0x0000029A + bl __msl_assertion_failed +_02248708: + cmp r4, #0 + bne _02248724 + ldr r0, _022487AC ; =ov45_022559D4 + ldr r1, _022487A0 ; =ov45_02255918 + ldr r2, _022487A4 ; =ov45_02255728 + mov r3, #0x29c + bl __msl_assertion_failed +_02248724: + ldrsb r0, [r4] + cmp r0, #0 + bne _02248744 + ldr r0, _022487B0 ; =ov45_022559E4 + ldr r1, _022487A0 ; =ov45_02255918 + ldr r2, _022487A4 ; =ov45_02255728 + mov r3, #0x29c + bl __msl_assertion_failed +_02248744: + mov r0, r4 + bl strlen + ldr r1, _022487B4 ; =0x00000101 + cmp r0, r1 + blo _0224876C + ldr r0, _022487B8 ; =ov45_022559F8 + ldr r1, _022487A0 ; =ov45_02255918 + ldr r2, _022487A4 ; =ov45_02255728 + mov r3, #0x29c + bl __msl_assertion_failed +_0224876C: + mov r0, r6 + mov r1, r4 + bl ov45_022475B8 + movs r4, r0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r5 + add r0, r4, #0x164 + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x1e3] + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224879C: .word ov45_022559B8 +_022487A0: .word ov45_02255918 +_022487A4: .word ov45_02255728 +_022487A8: .word 0x0000029A +_022487AC: .word ov45_022559D4 +_022487B0: .word ov45_022559E4 +_022487B4: .word 0x00000101 +_022487B8: .word ov45_022559F8 + arm_func_end ov45_022486E0 + + arm_func_start ov45_022487BC +ov45_022487BC: ; 0x022487BC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _022487E0 + ldr r0, _02248868 ; =ov45_022559B8 + ldr r1, _0224886C ; =ov45_02255918 + ldr r2, _02248870 ; =ov45_02255814 + mov r3, #0x2bc + bl __msl_assertion_failed +_022487E0: + cmp r4, #0 + bne _022487FC + ldr r0, _02248874 ; =ov45_022559D4 + ldr r1, _0224886C ; =ov45_02255918 + ldr r2, _02248870 ; =ov45_02255814 + ldr r3, _02248878 ; =0x000002BE + bl __msl_assertion_failed +_022487FC: + ldrsb r0, [r4] + cmp r0, #0 + bne _0224881C + ldr r0, _0224887C ; =ov45_022559E4 + ldr r1, _0224886C ; =ov45_02255918 + ldr r2, _02248870 ; =ov45_02255814 + ldr r3, _02248878 ; =0x000002BE + bl __msl_assertion_failed +_0224881C: + mov r0, r4 + bl strlen + ldr r1, _02248880 ; =0x00000101 + cmp r0, r1 + blo _02248844 + ldr r0, _02248884 ; =ov45_022559F8 + ldr r1, _0224886C ; =ov45_02255918 + ldr r2, _02248870 ; =ov45_02255814 + ldr r3, _02248878 ; =0x000002BE + bl __msl_assertion_failed +_02248844: + mov r0, r5 + mov r1, r4 + bl ov45_022475B8 + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r0, #0x134] + bl ov00_021FEF00 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02248868: .word ov45_022559B8 +_0224886C: .word ov45_02255918 +_02248870: .word ov45_02255814 +_02248874: .word ov45_022559D4 +_02248878: .word 0x000002BE +_0224887C: .word ov45_022559E4 +_02248880: .word 0x00000101 +_02248884: .word ov45_022559F8 + arm_func_end ov45_022487BC + + arm_func_start ov45_02248888 +ov45_02248888: ; 0x02248888 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0xe0 + movs r7, r0 + mov r6, r1 + mov r4, r2 + mov r5, r3 + bne _022488B8 + ldr r0, _02248A64 ; =ov45_022559B8 + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + mov r3, #0x2d0 + bl __msl_assertion_failed +_022488B8: + cmp r6, #0 + bne _022488D4 + ldr r0, _02248A70 ; =ov45_02255ABC + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A74 ; =0x000002D2 + bl __msl_assertion_failed +_022488D4: + ldrsb r0, [r6] + cmp r0, #0 + bne _022488F4 + ldr r0, _02248A78 ; =ov45_02255ACC + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A74 ; =0x000002D2 + bl __msl_assertion_failed +_022488F4: + mov r0, r6 + bl strlen + cmp r0, #0x80 + blo _02248918 + ldr r0, _02248A7C ; =ov45_02255ADC + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A74 ; =0x000002D2 + bl __msl_assertion_failed +_02248918: + cmp r4, #0 + bne _02248934 + ldr r0, _02248A80 ; =ov45_022559D4 + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A84 ; =0x000002D3 + bl __msl_assertion_failed +_02248934: + ldrsb r0, [r4] + cmp r0, #0 + bne _02248954 + ldr r0, _02248A88 ; =ov45_022559E4 + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A84 ; =0x000002D3 + bl __msl_assertion_failed +_02248954: + cmp r5, #0 + blt _02248964 + cmp r5, #3 + ble _02248978 +_02248964: + ldr r0, _02248A8C ; =ov45_02255AF4 + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + mov r3, #0x2d4 + bl __msl_assertion_failed +_02248978: + mov r0, r7 + mov r1, r4 + bl ov45_022475B8 + movs r4, r0 + addeq sp, sp, #0xe0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + add lr, sp, #0 + mov r1, r0 + mov r2, r0 + mov r3, r0 + mov ip, #7 +_022489A8: + stmia lr!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _022489A8 + add r0, sp, #0 + mov r1, r6 + mov r2, #0x80 + bl strncpy + ldr r1, [sp, #0xf8] + mov r0, #0 + strb r0, [sp, #0x7f] + cmp r1, #0 + ldrne r0, [sp, #0xfc] + cmpne r0, #0 + moveq r0, #0 + streq r0, [sp, #0xd8] + beq _02248A20 + add r0, sp, #0x80 + mov r2, #0x18 + bl strncpy + mov r3, #0 + ldr r1, [sp, #0xfc] + add r0, sp, #0x98 + mov r2, #0x40 + strb r3, [sp, #0x97] + bl strncpy + mov r1, #0 + mov r0, #1 + strb r1, [sp, #0xd7] + str r0, [sp, #0xd8] +_02248A20: + str r5, [sp, #0xdc] + ldr r0, [r4, #0x134] + add r1, sp, #0 + bl ov00_021FEF74 + ldr r0, [r4, #0x134] + add r1, sp, #0 + bl ov00_021FF0C0 + cmp r0, #0 + addne sp, sp, #0xe0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _02248A90 ; =ov45_02255B10 + ldr r1, _02248A68 ; =ov45_02255918 + ldr r2, _02248A6C ; =ov45_0225582C + ldr r3, _02248A94 ; =0x000002F7 + bl __msl_assertion_failed + add sp, sp, #0xe0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02248A64: .word ov45_022559B8 +_02248A68: .word ov45_02255918 +_02248A6C: .word ov45_0225582C +_02248A70: .word ov45_02255ABC +_02248A74: .word 0x000002D2 +_02248A78: .word ov45_02255ACC +_02248A7C: .word ov45_02255ADC +_02248A80: .word ov45_022559D4 +_02248A84: .word 0x000002D3 +_02248A88: .word ov45_022559E4 +_02248A8C: .word ov45_02255AF4 +_02248A90: .word ov45_02255B10 +_02248A94: .word 0x000002F7 + arm_func_end ov45_02248888 + + arm_func_start ov45_02248A98 +ov45_02248A98: ; 0x02248A98 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0xe0 + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02248AC4 + ldr r0, _02248BA4 ; =ov45_022559B8 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + ldr r3, _02248BB0 ; =0x000002FE + bl __msl_assertion_failed +_02248AC4: + cmp r5, #0 + bne _02248AE0 + ldr r0, _02248BB4 ; =ov45_02255B44 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + mov r3, #0x300 + bl __msl_assertion_failed +_02248AE0: + ldrsb r0, [r5] + cmp r0, #0 + bne _02248B00 + ldr r0, _02248BB8 ; =ov45_02255B54 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + mov r3, #0x300 + bl __msl_assertion_failed +_02248B00: + mov r0, r5 + bl strlen + cmp r0, #0x80 + blo _02248B24 + ldr r0, _02248BBC ; =ov45_02255B64 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + mov r3, #0x300 + bl __msl_assertion_failed +_02248B24: + cmp r4, #0 + bne _02248B40 + ldr r0, _02248BC0 ; =ov45_022559D4 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + ldr r3, _02248BC4 ; =0x00000301 + bl __msl_assertion_failed +_02248B40: + ldrsb r0, [r4] + cmp r0, #0 + bne _02248B60 + ldr r0, _02248BC8 ; =ov45_022559E4 + ldr r1, _02248BA8 ; =ov45_02255918 + ldr r2, _02248BAC ; =ov45_022556EC + ldr r3, _02248BC4 ; =0x00000301 + bl __msl_assertion_failed +_02248B60: + mov r0, r6 + mov r1, r4 + bl ov45_022475B8 + movs r4, r0 + addeq sp, sp, #0xe0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, sp, #0 + mov r1, r5 + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x7f] + ldr r0, [r4, #0x134] + add r1, sp, #0 + bl ov00_021FF01C + add sp, sp, #0xe0 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02248BA4: .word ov45_022559B8 +_02248BA8: .word ov45_02255918 +_02248BAC: .word ov45_022556EC +_02248BB0: .word 0x000002FE +_02248BB4: .word ov45_02255B44 +_02248BB8: .word ov45_02255B54 +_02248BBC: .word ov45_02255B64 +_02248BC0: .word ov45_022559D4 +_02248BC4: .word 0x00000301 +_02248BC8: .word ov45_022559E4 + arm_func_end ov45_02248A98 + + arm_func_start ov45_02248BCC +ov45_02248BCC: ; 0x02248BCC + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _02248BF0 + ldr r0, _02248CB8 ; =ov45_02255938 + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + mov r3, #0x318 + bl __msl_assertion_failed +_02248BF0: + cmp r5, #0 + bne _02248C0C + ldr r0, _02248CC4 ; =ov45_02255A30 + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + ldr r3, _02248CC8 ; =0x00000319 + bl __msl_assertion_failed +_02248C0C: + ldr r0, [r4, #0x134] + cmp r0, #0 + bne _02248C2C + ldr r0, _02248CCC ; =ov45_02255B7C + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + ldr r3, _02248CD0 ; =0x0000031E + bl __msl_assertion_failed +_02248C2C: + ldr r0, [r5, #4] + cmp r0, #0 + bne _02248C4C + ldr r0, _02248CD4 ; =ov45_02255B94 + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + ldr r3, _02248CD8 ; =0x00000323 + bl __msl_assertion_failed +_02248C4C: + ldr r0, [r5, #4] + ldrsb r0, [r0] + cmp r0, #0 + bne _02248C70 + ldr r0, _02248CDC ; =ov45_02255BA8 + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + mov r3, #0x324 + bl __msl_assertion_failed +_02248C70: + ldr r0, [r5, #8] + cmp r0, #0 + bne _02248C90 + ldr r0, _02248CE0 ; =ov45_02255BC4 + ldr r1, _02248CBC ; =ov45_02255918 + ldr r2, _02248CC0 ; =ov45_0225588C + ldr r3, _02248CE4 ; =0x00000325 + bl __msl_assertion_failed +_02248C90: + ldr r0, [r4, #0x134] + ldr r1, [r5, #4] + bl ov00_021FF0C0 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r5, #0xc] + mov r2, r4 + ldmia r5, {r0, r1, ip} + blx ip + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02248CB8: .word ov45_02255938 +_02248CBC: .word ov45_02255918 +_02248CC0: .word ov45_0225588C +_02248CC4: .word ov45_02255A30 +_02248CC8: .word 0x00000319 +_02248CCC: .word ov45_02255B7C +_02248CD0: .word 0x0000031E +_02248CD4: .word ov45_02255B94 +_02248CD8: .word 0x00000323 +_02248CDC: .word ov45_02255BA8 +_02248CE0: .word ov45_02255BC4 +_02248CE4: .word 0x00000325 + arm_func_end ov45_02248BCC + + arm_func_start ov45_02248CE8 +ov45_02248CE8: ; 0x02248CE8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0xf0 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _02248D18 + ldr r0, _02248DD8 ; =ov45_022559B8 + ldr r1, _02248DDC ; =ov45_02255918 + ldr r2, _02248DE0 ; =ov45_02255750 + ldr r3, _02248DE4 ; =0x00000336 + bl __msl_assertion_failed +_02248D18: + cmp r6, #0 + bne _02248D34 + ldr r0, _02248DE8 ; =ov45_02255B44 + ldr r1, _02248DDC ; =ov45_02255918 + ldr r2, _02248DE0 ; =ov45_02255750 + mov r3, #0x338 + bl __msl_assertion_failed +_02248D34: + ldrsb r0, [r6] + cmp r0, #0 + bne _02248D54 + ldr r0, _02248DEC ; =ov45_02255B54 + ldr r1, _02248DDC ; =ov45_02255918 + ldr r2, _02248DE0 ; =ov45_02255750 + mov r3, #0x338 + bl __msl_assertion_failed +_02248D54: + mov r0, r6 + bl strlen + cmp r0, #0x80 + blo _02248D78 + ldr r0, _02248DF0 ; =ov45_02255B64 + ldr r1, _02248DDC ; =ov45_02255918 + ldr r2, _02248DE0 ; =ov45_02255750 + mov r3, #0x338 + bl __msl_assertion_failed +_02248D78: + cmp r5, #0 + bne _02248D94 + ldr r0, _02248DF4 ; =ov45_02255AA8 + ldr r1, _02248DDC ; =ov45_02255918 + ldr r2, _02248DE0 ; =ov45_02255750 + ldr r3, _02248DF8 ; =0x00000339 + bl __msl_assertion_failed +_02248D94: + add r0, sp, #0x10 + mov r1, r6 + mov r2, #0x80 + bl strncpy + mov r1, #0 + add r0, sp, #0x10 + strb r1, [sp, #0x8f] + str r7, [sp] + str r5, [sp, #8] + str r4, [sp, #0xc] + str r0, [sp, #4] + ldr r0, [r7, #0x80c] + ldr r1, _02248DFC ; =ov45_02248BCC + add r2, sp, #0 + bl ov00_021FF160 + add sp, sp, #0xf0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02248DD8: .word ov45_022559B8 +_02248DDC: .word ov45_02255918 +_02248DE0: .word ov45_02255750 +_02248DE4: .word 0x00000336 +_02248DE8: .word ov45_02255B44 +_02248DEC: .word ov45_02255B54 +_02248DF0: .word ov45_02255B64 +_02248DF4: .word ov45_02255AA8 +_02248DF8: .word 0x00000339 +_02248DFC: .word ov45_02248BCC + arm_func_end ov45_02248CE8 + + arm_func_start ov45_02248E00 +ov45_02248E00: ; 0x02248E00 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xfc + movs r5, r0 + mov r4, r1 + bne _02248E28 + ldr r0, _02249010 ; =ov45_02255938 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _0224901C ; =0x0000034F + bl __msl_assertion_failed +_02248E28: + cmp r4, #0 + bne _02248E44 + ldr r0, _02249020 ; =ov45_02255A30 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + mov r3, #0x350 + bl __msl_assertion_failed +_02248E44: + ldr r0, [r5, #0x134] + cmp r0, #0 + bne _02248E64 + ldr r0, _02249024 ; =ov45_02255B7C + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249028 ; =0x00000355 + bl __msl_assertion_failed +_02248E64: + ldr r0, [r4, #8] + cmp r0, #0 + bne _02248E84 + ldr r0, _0224902C ; =ov45_02255BDC + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249030 ; =0x0000035A + bl __msl_assertion_failed +_02248E84: + ldr r0, [r4, #8] + ldrsb r0, [r0] + cmp r0, #0 + bne _02248EA8 + ldr r0, _02249034 ; =ov45_02255BF4 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249030 ; =0x0000035A + bl __msl_assertion_failed +_02248EA8: + ldr r0, [r4, #8] + bl strlen + cmp r0, #0x80 + blo _02248ECC + ldr r0, _02249038 ; =ov45_02255C10 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249030 ; =0x0000035A + bl __msl_assertion_failed +_02248ECC: + ldr r0, [r4, #4] + cmp r0, #0 + bne _02248EEC + ldr r0, _0224903C ; =ov45_02255C34 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249040 ; =0x0000035B + bl __msl_assertion_failed +_02248EEC: + ldr r0, [r4, #4] + ldrsb r0, [r0] + cmp r0, #0 + bne _02248F10 + ldr r0, _02249044 ; =ov45_02255C4C + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249040 ; =0x0000035B + bl __msl_assertion_failed +_02248F10: + ldr r0, [r4, #4] + bl strlen + cmp r0, #0x80 + blo _02248F34 + ldr r0, _02249048 ; =ov45_02255C68 + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249040 ; =0x0000035B + bl __msl_assertion_failed +_02248F34: + ldr r0, [r5, #0x134] + ldr r1, [r4, #4] + bl ov00_021FF0C0 + movs r6, r0 + addeq sp, sp, #0xfc + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #0x1c + mov r1, r6 + mov r2, #0xe0 + bl memcpy + ldr r0, [r5, #0x134] + mov r1, r6 + bl ov00_021FF01C + cmp r0, #0 + bne _02248F84 + ldr r0, _0224904C ; =ov45_02255C8C + ldr r1, _02249014 ; =ov45_02255918 + ldr r2, _02249018 ; =ov45_0225578C + ldr r3, _02249050 ; =0x00000367 + bl __msl_assertion_failed +_02248F84: + ldr r1, [r4, #8] + add r0, sp, #0x1c + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x9b] + ldr r0, [r5, #0x134] + add r1, sp, #0x1c + bl ov00_021FEF74 + ldr r0, [r4] + mov r1, r5 + bl ov45_0224861C + cmp r0, #0 + ldrne r0, [r5, #0x114] + cmpne r0, #0 + addeq sp, sp, #0xfc + ldmeqia sp!, {r3, r4, r5, r6, pc} + str r5, [sp, #0x10] + ldr r0, [r4, #4] + mov r1, #0 + str r0, [sp, #0x14] + ldr r2, [r4, #8] + mov r0, #0xc + str r2, [sp, #0x18] + ldr r2, [r5, #0x130] + add r3, sp, #0x10 + str r2, [sp] + stmib sp, {r1, r5} + str r0, [sp, #0xc] + ldr r0, [r4] + ldr r2, [r5, #0x114] + mov r1, #8 + bl ov45_02244D30 + add sp, sp, #0xfc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02249010: .word ov45_02255938 +_02249014: .word ov45_02255918 +_02249018: .word ov45_0225578C +_0224901C: .word 0x0000034F +_02249020: .word ov45_02255A30 +_02249024: .word ov45_02255B7C +_02249028: .word 0x00000355 +_0224902C: .word ov45_02255BDC +_02249030: .word 0x0000035A +_02249034: .word ov45_02255BF4 +_02249038: .word ov45_02255C10 +_0224903C: .word ov45_02255C34 +_02249040: .word 0x0000035B +_02249044: .word ov45_02255C4C +_02249048: .word ov45_02255C68 +_0224904C: .word ov45_02255C8C +_02249050: .word 0x00000367 + arm_func_end ov45_02248E00 + + arm_func_start ov45_02249054 +ov45_02249054: ; 0x02249054 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02249080 + ldr r0, _02249164 ; =ov45_022559B8 + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + ldr r3, _02249170 ; =0x00000386 + bl __msl_assertion_failed +_02249080: + cmp r5, #0 + bne _0224909C + ldr r0, _02249174 ; =ov45_02255C98 + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + mov r3, #0x388 + bl __msl_assertion_failed +_0224909C: + ldrsb r0, [r5] + cmp r0, #0 + bne _022490BC + ldr r0, _02249178 ; =ov45_02255CA8 + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + mov r3, #0x388 + bl __msl_assertion_failed +_022490BC: + mov r0, r5 + bl strlen + cmp r0, #0x80 + blo _022490E0 + ldr r0, _0224917C ; =ov45_02255CBC + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + mov r3, #0x388 + bl __msl_assertion_failed +_022490E0: + cmp r4, #0 + bne _022490FC + ldr r0, _02249180 ; =ov45_02255CD8 + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + ldr r3, _02249184 ; =0x00000389 + bl __msl_assertion_failed +_022490FC: + ldrsb r0, [r4] + cmp r0, #0 + bne _0224911C + ldr r0, _02249188 ; =ov45_02255CE8 + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + ldr r3, _02249184 ; =0x00000389 + bl __msl_assertion_failed +_0224911C: + mov r0, r4 + bl strlen + cmp r0, #0x80 + blo _02249140 + ldr r0, _0224918C ; =ov45_02255CFC + ldr r1, _02249168 ; =ov45_02255918 + ldr r2, _0224916C ; =ov45_022556C4 + ldr r3, _02249184 ; =0x00000389 + bl __msl_assertion_failed +_02249140: + str r6, [sp] + str r5, [sp, #4] + str r4, [sp, #8] + ldr r0, [r6, #0x80c] + ldr r1, _02249190 ; =ov45_02248E00 + add r2, sp, #0 + bl ov00_021FF160 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_02249164: .word ov45_022559B8 +_02249168: .word ov45_02255918 +_0224916C: .word ov45_022556C4 +_02249170: .word 0x00000386 +_02249174: .word ov45_02255C98 +_02249178: .word ov45_02255CA8 +_0224917C: .word ov45_02255CBC +_02249180: .word ov45_02255CD8 +_02249184: .word 0x00000389 +_02249188: .word ov45_02255CE8 +_0224918C: .word ov45_02255CFC +_02249190: .word ov45_02248E00 + arm_func_end ov45_02249054 + + arm_func_start ov45_02249194 +ov45_02249194: ; 0x02249194 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x2e0 + movs r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _022491C4 + ldr r0, _02249358 ; =ov45_022559B8 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _02249364 ; =0x0000039B + bl __msl_assertion_failed +_022491C4: + cmp r7, #0 + bne _022491E0 + ldr r0, _02249368 ; =ov45_02255B44 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _0224936C ; =0x0000039D + bl __msl_assertion_failed +_022491E0: + ldrsb r0, [r7] + cmp r0, #0 + bne _02249200 + ldr r0, _02249370 ; =ov45_02255B54 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _0224936C ; =0x0000039D + bl __msl_assertion_failed +_02249200: + mov r0, r7 + bl strlen + cmp r0, #0x80 + blo _02249224 + ldr r0, _02249374 ; =ov45_02255B64 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _0224936C ; =0x0000039D + bl __msl_assertion_failed +_02249224: + cmp r6, #0 + bne _02249240 + ldr r0, _02249378 ; =ov45_022559D4 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _0224937C ; =0x0000039E + bl __msl_assertion_failed +_02249240: + ldrsb r0, [r6] + cmp r0, #0 + bne _02249260 + ldr r0, _02249380 ; =ov45_022559E4 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _0224937C ; =0x0000039E + bl __msl_assertion_failed +_02249260: + cmp r5, #0 + blt _02249270 + cmp r5, #3 + ble _02249284 +_02249270: + ldr r0, _02249384 ; =ov45_02255AF4 + ldr r1, _0224935C ; =ov45_02255918 + ldr r2, _02249360 ; =ov45_022556D8 + ldr r3, _02249388 ; =0x0000039F + bl __msl_assertion_failed +_02249284: + ldr r2, _0224938C ; =0x00000101 + add r0, sp, #0xfc + mov r1, r6 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x1fc] + ldr r0, [r8, #0x80c] + add r1, sp, #0xfc + bl ov00_021FF0C0 + movs r4, r0 + addeq sp, sp, #0x2e0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, sp, #0x1c + mov r1, r7 + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [sp, #0x9b] + ldr r0, [r4, #0x134] + add r1, sp, #0x1c + bl ov00_021FF0C0 + cmp r0, #0 + addeq sp, sp, #0x2e0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, [sp, #0x2f8] + cmp r1, #0 + ldrne r1, [r0, #0xdc] + ldreq r2, [r0, #0xdc] + orrne r1, r1, r5 + mvneq r1, r5 + andeq r1, r2, r1 + str r1, [r0, #0xdc] + ldr r1, [r4, #0x120] + cmp r1, #0 + addeq sp, sp, #0x2e0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r6, [sp, #0x10] + str r7, [sp, #0x14] + ldr r0, [r0, #0xdc] + mov r1, #0 + str r0, [sp, #0x18] + ldr r2, [r4, #0x130] + mov r0, #0xc + str r2, [sp] + stmib sp, {r1, r6} + str r0, [sp, #0xc] + ldr r2, [r4, #0x120] + add r3, sp, #0x10 + mov r0, r8 + mov r1, #0xb + bl ov45_02244D30 + add sp, sp, #0x2e0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02249358: .word ov45_022559B8 +_0224935C: .word ov45_02255918 +_02249360: .word ov45_022556D8 +_02249364: .word 0x0000039B +_02249368: .word ov45_02255B44 +_0224936C: .word 0x0000039D +_02249370: .word ov45_02255B54 +_02249374: .word ov45_02255B64 +_02249378: .word ov45_022559D4 +_0224937C: .word 0x0000039E +_02249380: .word ov45_022559E4 +_02249384: .word ov45_02255AF4 +_02249388: .word 0x0000039F +_0224938C: .word 0x00000101 + arm_func_end ov45_02249194 + + arm_func_start ov45_02249390 +ov45_02249390: ; 0x02249390 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _022493B4 + ldr r0, _02249440 ; =ov45_02255938 + ldr r1, _02249444 ; =ov45_02255918 + ldr r2, _02249448 ; =ov45_02255874 + ldr r3, _0224944C ; =0x0000041A + bl __msl_assertion_failed +_022493B4: + cmp r5, #0 + bne _022493D0 + ldr r0, _02249450 ; =ov45_02255A30 + ldr r1, _02249444 ; =ov45_02255918 + ldr r2, _02249448 ; =ov45_02255874 + ldr r3, _02249454 ; =0x0000041B + bl __msl_assertion_failed +_022493D0: + ldr r0, [r4, #0x134] + cmp r0, #0 + bne _022493F0 + ldr r0, _02249458 ; =ov45_02255B7C + ldr r1, _02249444 ; =ov45_02255918 + ldr r2, _02249448 ; =ov45_02255874 + ldr r3, _0224945C ; =0x00000424 + bl __msl_assertion_failed +_022493F0: + ldr r0, [r4, #0x134] + ldr r1, [r5] + bl ov00_021FF0C0 + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #4] + add r0, r4, #0x80 + mov r2, #0x18 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x97] + ldr r1, [r5, #8] + add r0, r4, #0x98 + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r4, #0xd7] + mov r0, #1 + str r0, [r4, #0xd8] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02249440: .word ov45_02255938 +_02249444: .word ov45_02255918 +_02249448: .word ov45_02255874 +_0224944C: .word 0x0000041A +_02249450: .word ov45_02255A30 +_02249454: .word 0x0000041B +_02249458: .word ov45_02255B7C +_0224945C: .word 0x00000424 + arm_func_end ov45_02249390 + + arm_func_start ov45_02249460 +ov45_02249460: ; 0x02249460 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xec + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _02249490 + ldr r0, _02249530 ; =ov45_022559B8 + ldr r1, _02249534 ; =ov45_02255918 + ldr r2, _02249538 ; =ov45_02255764 + ldr r3, _0224953C ; =0x0000043D + bl __msl_assertion_failed +_02249490: + cmp r6, #0 + bne _022494AC + ldr r0, _02249540 ; =ov45_02255D18 + ldr r1, _02249534 ; =ov45_02255918 + ldr r2, _02249538 ; =ov45_02255764 + ldr r3, _02249544 ; =0x0000043F + bl __msl_assertion_failed +_022494AC: + ldrsb r0, [r6] + cmp r0, #0 + bne _022494CC + ldr r0, _02249548 ; =ov45_02255D28 + ldr r1, _02249534 ; =ov45_02255918 + ldr r2, _02249538 ; =ov45_02255764 + ldr r3, _02249544 ; =0x0000043F + bl __msl_assertion_failed +_022494CC: + mov r0, r6 + bl strlen + cmp r0, #0x80 + blo _022494F0 + ldr r0, _0224954C ; =ov45_02255D38 + ldr r1, _02249534 ; =ov45_02255918 + ldr r2, _02249538 ; =ov45_02255764 + ldr r3, _02249544 ; =0x0000043F + bl __msl_assertion_failed +_022494F0: + add r0, sp, #0xc + mov r1, r6 + mov r2, #0x80 + bl strncpy + mov r1, #0 + add r0, sp, #0xc + strb r1, [sp, #0x8b] + str r5, [sp, #4] + str r4, [sp, #8] + str r0, [sp] + ldr r0, [r7, #0x80c] + ldr r1, _02249550 ; =ov45_02249390 + add r2, sp, #0 + bl ov00_021FF160 + add sp, sp, #0xec + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_02249530: .word ov45_022559B8 +_02249534: .word ov45_02255918 +_02249538: .word ov45_02255764 +_0224953C: .word 0x0000043D +_02249540: .word ov45_02255D18 +_02249544: .word 0x0000043F +_02249548: .word ov45_02255D28 +_0224954C: .word ov45_02255D38 +_02249550: .word ov45_02249390 + arm_func_end ov45_02249460 + + arm_func_start ov45_02249554 +ov45_02249554: ; 0x02249554 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r8, r0 + mov r6, r2 + mov r1, #0 +_02249568: + rsb r0, r1, #0xff + strb r1, [r6, r0] + add r1, r1, #1 + cmp r1, #0x100 + blt _02249568 + mov r0, #0 + strb r0, [r6, #0x100] + mov r4, r0 + mov r5, r0 + strb r0, [r6, #0x101] +_02249590: + ldrb r2, [r6, r5] + ldrb r3, [r8, r0] + mov r1, r7 + add r0, r0, #1 + add r3, r3, r2 + add r3, r4, r3 + mov r4, r3, lsr #0x1f + rsb r3, r4, r3, lsl #24 + add r3, r4, r3, ror #24 + and r4, r3, #0xff + ldrb r3, [r6, r4] + strb r3, [r6, r5] + strb r2, [r6, r4] + bl _s32_div_f + add r5, r5, #1 + cmp r5, #0x100 + and r0, r1, #0xff + blt _02249590 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov45_02249554 + + arm_func_start ov45_022495DC +ov45_022495DC: ; 0x022495DC + stmdb sp!, {r4, r5, r6, lr} + cmp r1, #0 + ldrb r3, [r2, #0x100] + ldrb ip, [r2, #0x101] + mov lr, #0 + ble _02249660 +_022495F4: + add r3, r3, #1 + mov r4, r3, lsr #0x1f + rsb r3, r4, r3, lsl #24 + add r3, r4, r3, ror #24 + and r3, r3, #0xff + ldrb r5, [r2, r3] + add r4, ip, r5 + mov ip, r4, lsr #0x1f + rsb r4, ip, r4, lsl #24 + add r4, ip, r4, ror #24 + and ip, r4, #0xff + ldrb r4, [r2, ip] + strb r4, [r2, r3] + strb r5, [r2, ip] + ldrb r4, [r2, r3] + ldrb r6, [r0, lr] + add r4, r4, r5 + mov r5, r4, lsr #0x1f + rsb r4, r5, r4, lsl #24 + add r4, r5, r4, ror #24 + and r4, r4, #0xff + ldrb r4, [r2, r4] + eor r4, r6, r4 + strb r4, [r0, lr] + add lr, lr, #1 + cmp lr, r1 + blt _022495F4 +_02249660: + strb r3, [r2, #0x100] + strb ip, [r2, #0x101] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_022495DC + + arm_func_start ov45_0224966C +ov45_0224966C: ; 0x0224966C + stmdb sp!, {r4, lr} + mov r4, r2 + cmp r1, #0 + mov lr, #0 + ldmleia sp!, {r4, pc} +_02249680: + ldrsb ip, [r0, lr] + ldrsb r3, [r4] + eor r3, ip, r3 + strb r3, [r0, lr] + ldrsb r3, [r4, #1]! + add lr, lr, #1 + cmp r3, #0 + moveq r4, r2 + cmp lr, r1 + blt _02249680 + ldmia sp!, {r4, pc} + arm_func_end ov45_0224966C + + arm_func_start ov45_022496AC +ov45_022496AC: ; 0x022496AC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r4, r0 + mov sl, r1 + str r2, [sp] + bne _022496D4 + ldr r0, _02249818 ; =ov45_022565C0 + ldr r1, _0224981C ; =ov45_022565D0 + ldr r2, _02249820 ; =ov45_02255EB4 + ldr r3, _02249824 ; =0x0000015B + bl __msl_assertion_failed +_022496D4: + cmp sl, #0 + bgt _022496F0 + ldr r0, _02249828 ; =ov45_022565E0 + ldr r1, _0224981C ; =ov45_022565D0 + ldr r2, _02249820 ; =ov45_02255EB4 + ldr r3, _0224982C ; =0x0000015D + bl __msl_assertion_failed +_022496F0: + ldr r0, [sp] + cmp r0, #0 + bne _02249710 + ldr r0, _02249830 ; =ov45_022565F0 + ldr r1, _0224981C ; =ov45_022565D0 + ldr r2, _02249820 ; =ov45_02255EB4 + ldr r3, _02249834 ; =0x0000015E + bl __msl_assertion_failed +_02249710: + ldr r8, [r4, #0x814] + cmp r8, #0 + beq _02249810 +_0224971C: + cmp sl, #0 + mov r6, #0 + ble _02249804 + ldr sb, [sp] + ldr fp, _02249838 ; =ov45_022565F8 + mov r4, #1 + mov r5, r6 +_02249738: + ldr r0, [sb] + mov r1, r5 + cmp r0, #0 + blt _02249750 + cmp r0, #0x11 + movlt r1, r4 +_02249750: + cmp r1, #0 + bne _0224976C + ldr r1, _0224981C ; =ov45_022565D0 + ldr r2, _02249820 ; =ov45_02255EB4 + mov r0, fp + mov r3, #0x164 + bl __msl_assertion_failed +_0224976C: + ldr r1, [r8] + ldr r0, [sb] + cmp r1, r0 + bne _022497F4 + ldmib sb, {r0, r7} + cmp r0, #0 + ldreq r1, [r8, #8] + cmpeq r1, #0 + beq _022497AC + cmp r0, #0 + ldrne r1, [r8, #8] + cmpne r1, #0 + beq _022497F4 + bl strnicmp + cmp r0, #0 + bne _022497F4 +_022497AC: + cmp r7, #0 + ldreq r0, [r8, #0xc] + cmpeq r0, #0 + beq _022497DC + cmp r7, #0 + ldrne r1, [r8, #0xc] + cmpne r1, #0 + beq _022497F4 + mov r0, r7 + bl strnicmp + cmp r0, #0 + bne _022497F4 +_022497DC: + bl ov00_021FF368 + add r0, r0, #0xa60 + add r1, r0, #0xe000 + mov r0, r8 + str r1, [r8, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022497F4: + add r6, r6, #1 + cmp r6, sl + add sb, sb, #0xc + blt _02249738 +_02249804: + ldr r8, [r8, #0x24] + cmp r8, #0 + bne _0224971C +_02249810: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02249818: .word ov45_022565C0 +_0224981C: .word ov45_022565D0 +_02249820: .word ov45_02255EB4 +_02249824: .word 0x0000015B +_02249828: .word ov45_022565E0 +_0224982C: .word 0x0000015D +_02249830: .word ov45_022565F0 +_02249834: .word 0x0000015E +_02249838: .word ov45_022565F8 + arm_func_end ov45_022496AC + + arm_func_start ov45_0224983C +ov45_0224983C: ; 0x0224983C + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _02249860 + ldr r0, _022498E4 ; =ov45_022565C0 + ldr r1, _022498E8 ; =ov45_022565D0 + ldr r2, _022498EC ; =ov45_0225609C + ldr r3, _022498F0 ; =0x0000017F + bl __msl_assertion_failed +_02249860: + cmp r5, #0 + bne _0224987C + ldr r0, _022498F4 ; =ov45_02256630 + ldr r1, _022498E8 ; =ov45_022565D0 + ldr r2, _022498EC ; =ov45_0225609C + ldr r3, _022498F8 ; =0x00000181 + bl __msl_assertion_failed +_0224987C: + ldrsb r0, [r5] + cmp r0, #0 + bne _0224989C + ldr r0, _022498FC ; =ov45_02256638 + ldr r1, _022498E8 ; =ov45_022565D0 + ldr r2, _022498EC ; =ov45_0225609C + ldr r3, _02249900 ; =0x00000182 + bl __msl_assertion_failed +_0224989C: + ldr r4, [r4, #0x814] + cmp r4, #0 + beq _022498DC +_022498A8: + ldr r0, [r4] + cmp r0, #0xc + bne _022498D0 + ldr r0, [r4, #0x1c] + mov r1, r5 + ldr r0, [r0, #8] + bl strnicmp + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r3, r4, r5, pc} +_022498D0: + ldr r4, [r4, #0x24] + cmp r4, #0 + bne _022498A8 +_022498DC: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022498E4: .word ov45_022565C0 +_022498E8: .word ov45_022565D0 +_022498EC: .word ov45_0225609C +_022498F0: .word 0x0000017F +_022498F4: .word ov45_02256630 +_022498F8: .word 0x00000181 +_022498FC: .word ov45_02256638 +_02249900: .word 0x00000182 + arm_func_end ov45_0224983C + + arm_func_start ov45_02249904 +ov45_02249904: ; 0x02249904 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02249924 + ldr r0, _02249948 ; =ov45_02256644 + ldr r1, _0224994C ; =ov45_022565D0 + ldr r2, _02249950 ; =ov45_02255FC4 + ldr r3, _02249954 ; =0x00000193 + bl __msl_assertion_failed +_02249924: + ldr r0, [r4, #0x1c] + bl ov00_021EC3D8 + ldr r0, [r4, #8] + bl ov00_021EC3D8 + ldr r0, [r4, #0xc] + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02249948: .word ov45_02256644 +_0224994C: .word ov45_022565D0 +_02249950: .word ov45_02255FC4 +_02249954: .word 0x00000193 + arm_func_end ov45_02249904 + + arm_func_start ov45_02249958 +ov45_02249958: ; 0x02249958 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, #0 + bne _02249980 + ldr r0, _022499F4 ; =ov45_022565C0 + ldr r1, _022499F8 ; =ov45_022565D0 + ldr r2, _022499FC ; =ov45_02255F74 + ldr r3, _02249A00 ; =0x0000019F + bl __msl_assertion_failed +_02249980: + cmp r5, #0 + bne _0224999C + ldr r0, _02249A04 ; =ov45_02256644 + ldr r1, _022499F8 ; =ov45_022565D0 + ldr r2, _022499FC ; =ov45_02255F74 + ldr r3, _02249A08 ; =0x000001A1 + bl __msl_assertion_failed +_0224999C: + ldr r1, [r6, #0x814] + mov r0, r1 + cmp r1, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_022499AC: + cmp r0, r5 + bne _022499E0 + cmp r1, r0 + ldreq r1, [r0, #0x24] + streq r1, [r6, #0x814] + ldr r1, [r6, #0x818] + cmp r1, r0 + streq r4, [r6, #0x818] + cmp r4, #0 + ldrne r1, [r0, #0x24] + strne r1, [r4, #0x24] + bl ov45_02249904 + ldmia sp!, {r4, r5, r6, pc} +_022499E0: + mov r4, r0 + ldr r0, [r0, #0x24] + cmp r0, #0 + bne _022499AC + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022499F4: .word ov45_022565C0 +_022499F8: .word ov45_022565D0 +_022499FC: .word ov45_02255F74 +_02249A00: .word 0x0000019F +_02249A04: .word ov45_02256644 +_02249A08: .word 0x000001A1 + arm_func_end ov45_02249958 + + arm_func_start ov45_02249A0C +ov45_02249A0C: ; 0x02249A0C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + movs r5, r1 + mov r6, r0 + mov r4, r2 + bne _02249A38 + ldr r0, _0224A130 ; =ov45_02256654 + ldr r1, _0224A134 ; =ov45_022565D0 + ldr r2, _0224A138 ; =ov45_02255F84 + ldr r3, _0224A13C ; =0x000001C1 + bl __msl_assertion_failed +_02249A38: + ldr r0, [r5] + mov r1, #0 + cmp r0, #0 + blt _02249A50 + cmp r0, #0x11 + movlt r1, #1 +_02249A50: + cmp r1, #0 + bne _02249A6C + ldr r0, _0224A140 ; =ov45_0225665C + ldr r1, _0224A134 ; =ov45_022565D0 + ldr r2, _0224A138 ; =ov45_02255F84 + ldr r3, _0224A144 ; =0x000001C2 + bl __msl_assertion_failed +_02249A6C: + ldr r0, [r5] + cmp r0, #0 + bne _02249B0C + ldr r2, [r5, #0x14] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249AB8 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x14 + mov r1, #0xe + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249AB8: + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ble _02249AF0 +_02249AC8: + ldr r0, [r7, #8] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7, #0x10] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _02249AC8 +_02249AF0: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + ldr r0, [r7, #0x10] + bl ov00_021EC3D8 + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + b _0224A11C +_02249B0C: + cmp r0, #1 + bne _02249B54 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0xc + mov r1, #0xf + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249B54: + cmp r0, #2 + bne _02249B98 + ldr r2, [r5, #0x10] + ldr r7, [r4, #4] + cmp r2, #0 + beq _0224A11C + ldr r1, [r5, #0x18] + mov r3, r4 + str r1, [sp] + ldr r1, [r5, #0x20] + mov r0, r6 + stmib sp, {r1, r7} + mov r4, #0xc + mov r1, #0x10 + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249B98: + cmp r0, #3 + bne _02249C20 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249BE0 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x14 + mov r1, #0x13 + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249BE0: + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ble _02249C0C +_02249BF0: + ldr r0, [r7, #8] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _02249BF0 +_02249C0C: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + b _0224A11C +_02249C20: + cmp r0, #4 + bne _02249CB8 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249C68 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x1c + mov r1, #0x14 + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249C68: + ldr r0, [r7, #0xc] + mov r4, #0 + cmp r0, #0 + ble _02249C94 +_02249C78: + ldr r0, [r7, #0x10] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7, #0xc] + add r4, r4, #1 + cmp r4, r0 + blt _02249C78 +_02249C94: + ldr r0, [r7, #0x10] + bl ov00_021EC3D8 + ldr r0, [r7, #4] + bl ov00_021EC3D8 + ldr r0, [r7, #8] + bl ov00_021EC3D8 + ldr r0, [r7] + bl ov00_021EC3D8 + b _0224A11C +_02249CB8: + cmp r0, #0xa + bne _02249D00 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x10 + mov r1, #0x15 + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249D00: + cmp r0, #0xb + bne _02249D48 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x10 + mov r1, #0x16 + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249D48: + cmp r0, #5 + bne _02249D90 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0xc + mov r1, #0x11 + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249D90: + cmp r0, #6 + bne _02249DD8 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x10 + mov r1, #0x17 + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249DD8: + cmp r0, #7 + bne _02249DF0 + ldr r0, [r5, #0x1c] + ldr r0, [r0] + bl ov00_021EC3D8 + b _0224A11C +_02249DF0: + cmp r0, #8 + bne _02249E68 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249E38 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x10 + mov r1, #0x18 + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249E38: + ldr r0, [r7] + mov r4, #0 + cmp r0, #0 + ble _0224A11C +_02249E48: + ldr r0, [r7, #4] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _02249E48 + b _0224A11C +_02249E68: + cmp r0, #9 + bne _02249EB0 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0xc + mov r1, #0x1a + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_02249EB0: + cmp r0, #0xc + bne _02249F38 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249EF8 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x14 + mov r1, #0x1d + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249EF8: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + ldr r0, [r7] + mov r4, #0 + cmp r0, #0 + ble _02249F2C +_02249F10: + ldr r0, [r7, #4] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _02249F10 +_02249F2C: + ldr r0, [r7, #4] + bl ov00_021EC3D8 + b _0224A11C +_02249F38: + cmp r0, #0xd + bne _02249FB8 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _02249F80 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x18 + mov r1, #0x1e + str r4, [sp, #0xc] + bl ov45_02244D30 +_02249F80: + ldr r0, [r7] + mov r4, #0 + cmp r0, #0 + ble _02249FAC +_02249F90: + ldr r0, [r7, #4] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _02249F90 +_02249FAC: + ldr r0, [r7, #4] + bl ov00_021EC3D8 + b _0224A11C +_02249FB8: + cmp r0, #0xe + bne _0224A038 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _0224A000 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x18 + mov r1, #0x1e + str r4, [sp, #0xc] + bl ov45_02244D30 +_0224A000: + ldr r0, [r7] + mov r4, #0 + cmp r0, #0 + ble _0224A02C +_0224A010: + ldr r0, [r7, #4] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _0224A010 +_0224A02C: + ldr r0, [r7, #4] + bl ov00_021EC3D8 + b _0224A11C +_0224A038: + cmp r0, #0xf + bne _0224A0C0 + ldr r2, [r5, #0x10] + ldr r7, [r5, #0x1c] + cmp r2, #0 + beq _0224A080 + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #0x10 + mov r1, #0x1b + str r4, [sp, #0xc] + bl ov45_02244D30 +_0224A080: + ldr r0, [r7, #4] + mov r4, #0 + cmp r0, #0 + ble _0224A0AC +_0224A090: + ldr r0, [r7, #8] + ldr r0, [r0, r4, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r7, #4] + add r4, r4, #1 + cmp r4, r0 + blt _0224A090 +_0224A0AC: + ldr r0, [r7, #8] + bl ov00_021EC3D8 + ldr r0, [r7, #0xc] + bl ov00_021EC3D8 + b _0224A11C +_0224A0C0: + cmp r0, #0x10 + bne _0224A108 + ldr r2, [r5, #0x10] + cmp r2, #0 + beq _0224A11C + ldr r0, [r5, #0x18] + mov r1, #0 + str r0, [sp] + ldr r3, [r5, #0x20] + mov r0, r6 + str r3, [sp, #4] + mov r3, r4 + str r1, [sp, #8] + mov r4, #8 + mov r1, #0x1f + str r4, [sp, #0xc] + bl ov45_02244D30 + b _0224A11C +_0224A108: + ldr r0, _0224A148 ; =ov45_02256690 + ldr r1, _0224A134 ; =ov45_022565D0 + ldr r2, _0224A138 ; =ov45_02255F84 + mov r3, #0x25c + bl __msl_assertion_failed +_0224A11C: + mov r0, r6 + mov r1, r5 + bl ov45_02249958 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0224A130: .word ov45_02256654 +_0224A134: .word ov45_022565D0 +_0224A138: .word ov45_02255F84 +_0224A13C: .word 0x000001C1 +_0224A140: .word ov45_0225665C +_0224A144: .word 0x000001C2 +_0224A148: .word ov45_02256690 + arm_func_end ov45_02249A0C + + arm_func_start ov45_0224A14C +ov45_0224A14C: ; 0x0224A14C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x104 + movs r4, r1 + mov r5, r0 + bne _0224A174 + ldr r0, _0224A558 ; =ov45_02256654 + ldr r1, _0224A55C ; =ov45_022565D0 + ldr r2, _0224A560 ; =ov45_02256010 + mov r3, #0x268 + bl __msl_assertion_failed +_0224A174: + ldr r0, [r4] + mov r1, #0 + cmp r0, #0 + blt _0224A18C + cmp r0, #0x11 + movlt r1, #1 +_0224A18C: + cmp r1, #0 + bne _0224A1A8 + ldr r0, _0224A564 ; =ov45_0225665C + ldr r1, _0224A55C ; =ov45_022565D0 + ldr r2, _0224A560 ; =ov45_02256010 + ldr r3, _0224A568 ; =0x00000269 + bl __msl_assertion_failed +_0224A1A8: + ldr r0, [r4] + cmp r0, #0 + bne _0224A1E4 + mov r3, #0 + add r2, sp, #0xf0 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0xf0] + str r3, [sp, #0xf4] + str r3, [sp, #0xf8] + str r3, [sp, #0xfc] + str r3, [sp, #0x100] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A1E4: + cmp r0, #1 + bne _0224A21C + mov r1, #0 + mov r0, #7 + str r1, [sp, #0xe4] + str r0, [sp, #0xe8] + ldr r3, [r4, #8] + add r2, sp, #0xe4 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0xec] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A21C: + cmp r0, #2 + bne _0224A250 + mov ip, #0 + str ip, [sp, #0xd8] + ldr r3, [r4, #8] + add r2, sp, #0xd8 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0xdc] + str ip, [sp, #0xe0] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A250: + cmp r0, #3 + bne _0224A28C + mov ip, #0 + str ip, [sp, #0xc4] + ldr r3, [r4, #8] + add r2, sp, #0xc4 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0xc8] + str ip, [sp, #0xcc] + str ip, [sp, #0xd0] + str ip, [sp, #0xd4] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A28C: + cmp r0, #4 + bne _0224A2D0 + mov ip, #0 + str ip, [sp, #0xa8] + ldr r3, [r4, #8] + add r2, sp, #0xa8 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0xac] + str ip, [sp, #0xb0] + str ip, [sp, #0xb4] + str ip, [sp, #0xb8] + str ip, [sp, #0xbc] + str ip, [sp, #0xc0] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A2D0: + cmp r0, #0xa + bne _0224A308 + mov ip, #0 + str ip, [sp, #0x98] + ldr r3, [r4, #8] + add r2, sp, #0x98 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x9c] + str ip, [sp, #0xa0] + str ip, [sp, #0xa4] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A308: + cmp r0, #0xb + bne _0224A344 + mov ip, #0 + str ip, [sp, #0x84] + ldr r3, [r4, #8] + add r2, sp, #0x84 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x88] + str ip, [sp, #0x8c] + str ip, [sp, #0x90] + str ip, [sp, #0x94] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A344: + cmp r0, #5 + bne _0224A378 + mov ip, #0 + str ip, [sp, #0x78] + ldr r3, [r4, #8] + add r2, sp, #0x78 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x7c] + str ip, [sp, #0x80] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A378: + cmp r0, #6 + bne _0224A3B4 + mov ip, #0 + str ip, [sp, #0x68] + ldr r0, [r4, #0xc] + add r2, sp, #0x68 + str r0, [sp, #0x6c] + ldr r3, [r4, #8] + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x70] + str ip, [sp, #0x74] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A3B4: + cmp r0, #7 + bne _0224A3D4 + mov r0, r5 + mov r1, r4 + mov r2, #0 + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A3D4: + cmp r0, #8 + bne _0224A408 + ldr ip, [r4, #8] + mov r3, #0 + add r2, sp, #0x58 + mov r0, r5 + mov r1, r4 + str ip, [sp, #0x5c] + str r3, [sp, #0x60] + str r3, [sp, #0x64] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A408: + cmp r0, #9 + bne _0224A440 + mov r0, #0 + str r0, [sp, #0x4c] + ldr r0, [r4, #8] + add r2, sp, #0x4c + str r0, [sp, #0x50] + ldr r3, [r4, #0xc] + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x54] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A440: + cmp r0, #0xc + bne _0224A478 + mov r3, #0 + add r2, sp, #0x38 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x38] + str r3, [sp, #0x3c] + str r3, [sp, #0x40] + str r3, [sp, #0x44] + str r3, [sp, #0x48] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A478: + cmp r0, #0xd + bne _0224A4B4 + mov r3, #0 + add r2, sp, #0x20 + mov r0, r5 + mov r1, r4 + str r3, [sp, #0x20] + str r3, [sp, #0x24] + str r3, [sp, #0x28] + str r3, [sp, #0x2c] + str r3, [sp, #0x30] + str r3, [sp, #0x34] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A4B4: + cmp r0, #0xe + bne _0224A4F0 + mov r3, #0 + add r2, sp, #8 + mov r0, r5 + mov r1, r4 + str r3, [sp, #8] + str r3, [sp, #0xc] + str r3, [sp, #0x10] + str r3, [sp, #0x14] + str r3, [sp, #0x18] + str r3, [sp, #0x1c] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A4F0: + cmp r0, #0xf + bne _0224A50C + mov r0, r5 + mov r1, r4 + bl ov45_02249958 + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A50C: + cmp r0, #0x10 + bne _0224A53C + ldr r3, _0224A56C ; =ov45_02256694 + mov ip, #0 + add r2, sp, #0 + mov r0, r5 + mov r1, r4 + str ip, [sp] + str r3, [sp, #4] + bl ov45_02249A0C + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} +_0224A53C: + ldr r0, _0224A570 ; =ov45_02256690 + ldr r1, _0224A55C ; =ov45_022565D0 + ldr r2, _0224A560 ; =ov45_02256010 + ldr r3, _0224A574 ; =0x00000311 + bl __msl_assertion_failed + add sp, sp, #0x104 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224A558: .word ov45_02256654 +_0224A55C: .word ov45_022565D0 +_0224A560: .word ov45_02256010 +_0224A564: .word ov45_0225665C +_0224A568: .word 0x00000269 +_0224A56C: .word ov45_02256694 +_0224A570: .word ov45_02256690 +_0224A574: .word 0x00000311 + arm_func_end ov45_0224A14C + + arm_func_start ov45_0224A578 +ov45_0224A578: ; 0x0224A578 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + bne _0224A598 + ldr r0, _0224A5D4 ; =ov45_022565C0 + ldr r1, _0224A5D8 ; =ov45_022565D0 + ldr r2, _0224A5DC ; =ov45_02255EC4 + ldr r3, _0224A5E0 ; =0x0000031A + bl __msl_assertion_failed +_0224A598: + bl ov00_021FF368 + ldr r1, [r6, #0x814] + mov r5, r0 + cmp r1, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_0224A5AC: + ldr r0, [r1, #4] + ldr r4, [r1, #0x24] + cmp r5, r0 + bls _0224A5C4 + mov r0, r6 + bl ov45_0224A14C +_0224A5C4: + mov r1, r4 + cmp r4, #0 + bne _0224A5AC + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224A5D4: .word ov45_022565C0 +_0224A5D8: .word ov45_022565D0 +_0224A5DC: .word ov45_02255EC4 +_0224A5E0: .word 0x0000031A + arm_func_end ov45_0224A578 + + arm_func_start ov45_0224A5E4 +ov45_0224A5E4: ; 0x0224A5E4 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0224A604 + ldr r0, _0224A620 ; =ov45_022565C0 + ldr r1, _0224A624 ; =ov45_022565D0 + ldr r2, _0224A628 ; =ov45_02255E60 + ldr r3, _0224A62C ; =0x0000032D + bl __msl_assertion_failed +_0224A604: + ldr r0, [r4, #0x81c] + mvn r1, #0x80000000 + cmp r0, r1 + moveq r1, #1 + addne r1, r0, #1 + str r1, [r4, #0x81c] + ldmia sp!, {r4, pc} + .balign 4, 0 +_0224A620: .word ov45_022565C0 +_0224A624: .word ov45_022565D0 +_0224A628: .word ov45_02255E60 +_0224A62C: .word 0x0000032D + arm_func_end ov45_0224A5E4 + + arm_func_start ov45_0224A630 +ov45_0224A630: ; 0x0224A630 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224A654 + ldr r0, _0224A6A0 ; =ov45_022565C0 + ldr r1, _0224A6A4 ; =ov45_022565D0 + ldr r2, _0224A6A8 ; =ov45_022560B0 + mov r3, #0x340 + bl __msl_assertion_failed +_0224A654: + cmp r4, #0 + bgt _0224A670 + ldr r0, _0224A6AC ; =ov45_022566A0 + ldr r1, _0224A6A4 ; =ov45_022565D0 + ldr r2, _0224A6A8 ; =ov45_022560B0 + ldr r3, _0224A6B0 ; =0x00000342 + bl __msl_assertion_failed +_0224A670: + ldr r1, [r5, #0x814] + cmp r1, #0 + beq _0224A698 +_0224A67C: + ldr r0, [r1, #0x20] + cmp r0, r4 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r1, #0x24] + cmp r1, #0 + bne _0224A67C +_0224A698: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224A6A0: .word ov45_022565C0 +_0224A6A4: .word ov45_022565D0 +_0224A6A8: .word ov45_022560B0 +_0224A6AC: .word ov45_022566A0 +_0224A6B0: .word 0x00000342 + arm_func_end ov45_0224A630 + + arm_func_start ov45_0224A6B4 +ov45_0224A6B4: ; 0x0224A6B4 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0224A6D4 + ldr r0, _0224A6F8 ; =ov45_022565C0 + ldr r1, _0224A6FC ; =ov45_022565D0 + ldr r2, _0224A700 ; =ov45_02255FD4 + ldr r3, _0224A704 ; =0x00000353 + bl __msl_assertion_failed +_0224A6D4: + ldr r1, [r4, #0x814] + cmp r1, #0 + ldmeqia sp!, {r4, pc} +_0224A6E0: + mov r0, r4 + bl ov45_0224A14C + ldr r1, [r4, #0x814] + cmp r1, #0 + bne _0224A6E0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0224A6F8: .word ov45_022565C0 +_0224A6FC: .word ov45_022565D0 +_0224A700: .word ov45_02255FD4 +_0224A704: .word 0x00000353 + arm_func_end ov45_0224A6B4 + + arm_func_start ov45_0224A708 +ov45_0224A708: ; 0x0224A708 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r7, r0 + mov r8, r1 + mov r6, r2 + mov r5, r3 + bne _0224A734 + ldr r0, _0224A7E4 ; =ov45_022565C0 + ldr r1, _0224A7E8 ; =ov45_022565D0 + ldr r2, _0224A7EC ; =ov45_02255E6C + mov r3, #0x35c + bl __msl_assertion_failed +_0224A734: + mov r0, #0x28 + bl ov00_021EC3A8 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, #0 + mov r2, #0x28 + bl memset + str r8, [r4] + bl ov00_021FF368 + add r0, r0, #0xa60 + add r0, r0, #0xe000 + str r0, [r4, #4] + ldr r1, [sp, #0x18] + ldr r0, [sp, #0x1c] + str r1, [r4, #0x10] + str r0, [r4, #0x14] + ldr r1, [sp, #0x20] + ldr r0, [sp, #0x24] + str r1, [r4, #0x18] + str r0, [r4, #0x1c] + cmp r6, #0 + moveq r0, #0 + beq _0224A79C + mov r0, r6 + bl ov00_021FF3D4 +_0224A79C: + str r0, [r4, #8] + cmp r5, #0 + moveq r0, #0 + beq _0224A7B4 + mov r0, r5 + bl ov00_021FF3D4 +_0224A7B4: + str r0, [r4, #0xc] + mov r0, r7 + bl ov45_0224A5E4 + str r0, [r4, #0x20] + ldr r0, [r7, #0x814] + cmp r0, #0 + streq r4, [r7, #0x814] + ldrne r0, [r7, #0x818] + strne r4, [r0, #0x24] + str r4, [r7, #0x818] + ldr r0, [r4, #0x20] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224A7E4: .word ov45_022565C0 +_0224A7E8: .word ov45_022565D0 +_0224A7EC: .word ov45_02255E6C + arm_func_end ov45_0224A708 + + arm_func_start ov45_0224A7F0 +ov45_0224A7F0: ; 0x0224A7F0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r7, r0 + mov r0, #0x14 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC3A8 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r3, r0 + mov r2, #5 + mov r1, #0 +_0224A82C: + strb r1, [r3] + strb r1, [r3, #1] + strb r1, [r3, #2] + strb r1, [r3, #3] + add r3, r3, #4 + subs r2, r2, #1 + bne _0224A82C + str r6, [sp] + str r5, [sp, #4] + mov r1, #0 + str r4, [sp, #8] + str r0, [sp, #0xc] + mov r0, r7 + mov r2, r1 + mov r3, r1 + bl ov45_0224A708 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0224A7F0 + + arm_func_start ov45_0224A874 +ov45_0224A874: ; 0x0224A874 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldr r8, [sp, #0x2c] + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + cmp r8, #0 + bne _0224A8AC + ldr r0, _0224A960 ; =ov45_022566A8 + ldr r1, _0224A964 ; =ov45_022565D0 + ldr r2, _0224A968 ; =ov45_02255F94 + ldr r3, _0224A96C ; =0x00000391 + bl __msl_assertion_failed +_0224A8AC: + ldr r0, [sp, #0x2c] + bl strlen + cmp r0, #0x20 + blo _0224A8D0 + ldr r0, _0224A970 ; =ov45_022566BC + ldr r1, _0224A964 ; =ov45_022565D0 + ldr r2, _0224A968 ; =ov45_02255F94 + ldr r3, _0224A974 ; =0x00000392 + bl __msl_assertion_failed +_0224A8D0: + mov r0, #0x54 + bl ov00_021EC3A8 + movs r8, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, #0 + mov r2, #0x54 + bl memset + ldr lr, [sp, #0x28] + mov ip, r8 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + ldr r1, [sp, #0x2c] + add r0, r8, #0x34 + mov r2, #0x20 + bl strncpy + mov r3, #0 + strb r3, [r8, #0x53] + str r5, [sp] + mov r0, r7 + mov r2, r6 + mov r1, #1 + stmib sp, {r3, r4, r8} + bl ov45_0224A708 + movs r4, r0 + bne _0224A954 + mov r0, r8 + bl ov00_021EC3D8 +_0224A954: + mov r0, r4 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224A960: .word ov45_022566A8 +_0224A964: .word ov45_022565D0 +_0224A968: .word ov45_02255F94 +_0224A96C: .word 0x00000391 +_0224A970: .word ov45_022566BC +_0224A974: .word 0x00000392 + arm_func_end ov45_0224A874 + + arm_func_start ov45_0224A978 +ov45_0224A978: ; 0x0224A978 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r7, r0 + mov r0, #0x10 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ov00_021EC3A8 + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r3, r0 + mov r2, #4 + mov r1, #0 +_0224A9B4: + strb r1, [r3] + strb r1, [r3, #1] + strb r1, [r3, #2] + strb r1, [r3, #3] + add r3, r3, #4 + subs r2, r2, #1 + bne _0224A9B4 + str r5, [sp] + mov r3, #0 + stmib sp, {r3, r4} + str r0, [sp, #0xc] + mov r0, r7 + mov r2, r6 + mov r1, #3 + bl ov45_0224A708 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov45_0224A978 + + arm_func_start ov45_0224A9F8 +ov45_0224A9F8: ; 0x0224A9F8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + str r2, [sp] + mov ip, #0 + str ip, [sp, #4] + str r3, [sp, #8] + mov r2, r1 + mov r3, ip + mov r1, #5 + str ip, [sp, #0xc] + bl ov45_0224A708 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + arm_func_end ov45_0224A9F8 + + arm_func_start ov45_0224AA2C +ov45_0224AA2C: ; 0x0224AA2C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov fp, r0 + mov r0, #0x10 + str r1, [sp, #0x10] + mov sl, r2 + mov sb, r3 + bl ov00_021EC3A8 + movs r7, r0 + addeq sp, sp, #0x14 + mov r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r2, r7 + mov r1, #4 +_0224AA64: + strb r0, [r2] + strb r0, [r2, #1] + strb r0, [r2, #2] + strb r0, [r2, #3] + add r2, r2, #4 + subs r1, r1, #1 + bne _0224AA64 + ldr r1, [sp, #0x3c] + ldr r0, [sp, #0x38] + str r1, [r7, #0xc] + str sl, [r7] + str r0, [r7, #8] + cmp r1, #0 + ldrne r0, [r7] + subne r0, r0, #1 + strne r0, [r7] + ldr r0, [r7] + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #4] + cmp r0, #0 + bne _0224AAD0 + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224AAD0: + mov r5, #0 + mov r6, r5 + cmp sl, #0 + ble _0224AB64 + ldr r4, _0224AB9C ; =ov45_022566DC +_0224AAE4: + ldr r8, [sb, r5, lsl #2] + mov r1, r4 + mov r0, r8 + bl strcmp + cmp r0, #0 + beq _0224AB58 + mov r0, r8 + bl ov00_021FF3D4 + ldr r1, [r7, #4] + str r0, [r1, r6, lsl #2] + ldr r0, [r7, #4] + ldr r0, [r0, r6, lsl #2] + cmp r0, #0 + bne _0224AB54 + subs r6, r6, #1 + bmi _0224AB38 +_0224AB24: + ldr r0, [r7, #4] + ldr r0, [r0, r6, lsl #2] + bl ov00_021EC3D8 + subs r6, r6, #1 + bpl _0224AB24 +_0224AB38: + ldr r0, [r7, #4] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224AB54: + add r6, r6, #1 +_0224AB58: + add r5, r5, #1 + cmp r5, sl + blt _0224AAE4 +_0224AB64: + ldr r0, [sp, #0x40] + str r6, [r7] + str r0, [sp] + mov r3, #0 + ldr r0, [sp, #0x44] + str r3, [sp, #4] + str r0, [sp, #8] + ldr r2, [sp, #0x10] + mov r0, fp + mov r1, #0xd + str r7, [sp, #0xc] + bl ov45_0224A708 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224AB9C: .word ov45_022566DC + arm_func_end ov45_0224AA2C + + arm_func_start ov45_0224ABA0 +ov45_0224ABA0: ; 0x0224ABA0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov fp, r0 + mov r0, #0xc + str r1, [sp, #0x10] + mov sl, r2 + mov sb, r3 + bl ov00_021EC3A8 + movs r7, r0 + addeq sp, sp, #0x14 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, #0 + strb r1, [r7] + strb r1, [r7, #1] + strb r1, [r7, #2] + strb r1, [r7, #3] + strb r1, [r7, #4] + strb r1, [r7, #5] + strb r1, [r7, #6] + strb r1, [r7, #7] + strb r1, [r7, #8] + strb r1, [r7, #9] + strb r1, [r7, #0xa] + ldr r0, [sp, #0x38] + strb r1, [r7, #0xb] + str r0, [r7, #8] + str sl, [r7] + cmp r0, #0 + ldrne r0, [r7] + subne r0, r0, #1 + strne r0, [r7] + ldr r0, [r7] + cmp r0, #0 + beq _0224ACEC + mov r0, r0, lsl #2 + bl ov00_021EC3A8 + str r0, [r7, #4] + cmp r0, #0 + bne _0224AC54 + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224AC54: + mov r5, #0 + mov r6, r5 + cmp sl, #0 + ble _0224ACE8 + ldr r4, _0224AD20 ; =ov45_022566DC +_0224AC68: + ldr r8, [sb, r5, lsl #2] + mov r1, r4 + mov r0, r8 + bl strcmp + cmp r0, #0 + beq _0224ACDC + mov r0, r8 + bl ov00_021FF3D4 + ldr r1, [r7, #4] + str r0, [r1, r6, lsl #2] + ldr r0, [r7, #4] + ldr r0, [r0, r6, lsl #2] + cmp r0, #0 + bne _0224ACD8 + subs r6, r6, #1 + bmi _0224ACBC +_0224ACA8: + ldr r0, [r7, #4] + ldr r0, [r0, r6, lsl #2] + bl ov00_021EC3D8 + subs r6, r6, #1 + bpl _0224ACA8 +_0224ACBC: + ldr r0, [r7, #4] + bl ov00_021EC3D8 + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0x14 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224ACD8: + add r6, r6, #1 +_0224ACDC: + add r5, r5, #1 + cmp r5, sl + blt _0224AC68 +_0224ACE8: + str r6, [r7] +_0224ACEC: + ldr r1, [sp, #0x3c] + ldr r0, [sp, #0x40] + str r1, [sp] + mov r3, #0 + str r3, [sp, #4] + str r0, [sp, #8] + ldr r2, [sp, #0x10] + mov r0, fp + mov r1, #0xe + str r7, [sp, #0xc] + bl ov45_0224A708 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224AD20: .word ov45_022566DC + arm_func_end ov45_0224ABA0 + + arm_func_start ov45_0224AD24 +ov45_0224AD24: ; 0x0224AD24 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r3, #0 + str r3, [sp, #4] + movs fp, r0 + str r1, [sp] + mov sb, r2 + mov r8, r3 + mov r7, r3 + bne _0224AD60 + ldr r0, _0224AFC8 ; =ov45_022566E0 + ldr r1, _0224AFCC ; =ov45_022565D0 + ldr r2, _0224AFD0 ; =ov45_02255E78 + ldr r3, _0224AFD4 ; =0x00000494 + bl __msl_assertion_failed +_0224AD60: + ldrsb r0, [fp] + cmp r0, #0x2b + moveq sl, #1 + beq _0224AD88 + cmp r0, #0x2d + moveq sl, #0 + beq _0224AD88 + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224AD88: + add fp, fp, #1 + mvn r4, #0 +_0224AD90: + ldrsb r5, [fp], #1 + cmp r5, #0x2d + bgt _0224ADC0 + cmp r5, #0x2b + blt _0224ADB4 + beq _0224AE2C + cmp r5, #0x2d + beq _0224AE38 + b _0224AEF8 +_0224ADB4: + cmp r5, #0 + beq _0224AE44 + b _0224AEF8 +_0224ADC0: + cmp r5, #0x62 + bgt _0224ADD0 + beq _0224AEC8 + b _0224AEF8 +_0224ADD0: + sub r0, r5, #0x65 + cmp r0, #0x12 + addls pc, pc, r0, lsl #2 + b _0224AEF8 +_0224ADE0: ; jump table + b _0224AEEC ; case 0 + b _0224AEF8 ; case 1 + b _0224AEF8 ; case 2 + b _0224AEF8 ; case 3 + b _0224AE50 ; case 4 + b _0224AEF8 ; case 5 + b _0224AE80 ; case 6 + b _0224AE5C ; case 7 + b _0224AE8C ; case 8 + b _0224AE98 ; case 9 + b _0224AEB0 ; case 10 + b _0224AE68 ; case 11 + b _0224AEF8 ; case 12 + b _0224AEF8 ; case 13 + b _0224AE74 ; case 14 + b _0224AEA4 ; case 15 + b _0224AED4 ; case 16 + b _0224AEBC ; case 17 + b _0224AEE0 ; case 18 +_0224AE2C: + mov sl, #1 + mov r6, r4 + b _0224AEFC +_0224AE38: + mov sl, #0 + mov r6, r4 + b _0224AEFC +_0224AE44: + mov r6, #0 + mov r7, r6 + b _0224AEFC +_0224AE50: + mov r6, #2 + mov r7, #0 + b _0224AEFC +_0224AE5C: + mov r6, #3 + mov r7, #1 + b _0224AEFC +_0224AE68: + mov r6, #4 + mov r7, #0 + b _0224AEFC +_0224AE74: + mov r6, #5 + mov r7, #0 + b _0224AEFC +_0224AE80: + mov r6, #6 + mov r7, #1 + b _0224AEFC +_0224AE8C: + mov r6, #7 + mov r7, #0 + b _0224AEFC +_0224AE98: + mov r6, #8 + mov r7, #0 + b _0224AEFC +_0224AEA4: + mov r6, #9 + mov r7, #0 + b _0224AEFC +_0224AEB0: + mov r6, #0xa + mov r7, #1 + b _0224AEFC +_0224AEBC: + mov r6, #0xb + mov r7, #1 + b _0224AEFC +_0224AEC8: + mov r6, #1 + mov r7, r6 + b _0224AEFC +_0224AED4: + mov r6, #0xc + mov r7, #0 + b _0224AEFC +_0224AEE0: + mov r6, #0xd + mov r7, #0 + b _0224AEFC +_0224AEEC: + mov r6, #0xe + mov r7, #0 + b _0224AEFC +_0224AEF8: + mov r6, r4 +_0224AEFC: + cmp r6, r4 + beq _0224AFB4 + add r2, r8, #1 + mov r1, #0xc + mul r1, r2, r1 + ldr r0, [sp, #4] + bl ov00_021EC3BC + cmp r0, #0 + bne _0224AF34 + ldr r0, [sp, #4] + bl ov00_021EC3D8 + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224AF34: + mov r1, #0xc + mul r1, r8, r1 + mov r2, #0 + strb r2, [r0, r1] + add r2, r0, r1 + mov r3, #0 + strb r3, [r2, #1] + strb r3, [r2, #2] + strb r3, [r2, #3] + strb r3, [r2, #4] + strb r3, [r2, #5] + strb r3, [r2, #6] + strb r3, [r2, #7] + strb r3, [r2, #8] + strb r3, [r2, #9] + strb r3, [r2, #0xa] + strb r3, [r2, #0xb] + str sl, [r2, #4] + cmp r7, #0 + str r0, [sp, #4] + add r8, r8, #1 + str r6, [r0, r1] + beq _0224AFB4 + cmp sb, #0 + movle r0, r3 + strle r0, [r2, #8] + ble _0224AFB4 + ldr r0, [sp] + sub sb, sb, #1 + ldr r1, [r0], #4 + str r0, [sp] + str r1, [r2, #8] +_0224AFB4: + cmp r5, #0 + bne _0224AD90 + ldr r0, [sp, #4] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224AFC8: .word ov45_022566E0 +_0224AFCC: .word ov45_022565D0 +_0224AFD0: .word ov45_02255E78 +_0224AFD4: .word 0x00000494 + arm_func_end ov45_0224AD24 + + arm_func_start ov45_0224AFD8 +ov45_0224AFD8: ; 0x0224AFD8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r1 + ldr r1, [r8] + mov sb, r0 + cmp r1, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r6, _0224B0EC ; =ov45_02256690 + ldr r5, _0224B0F0 ; =ov45_022565D0 + ldr r4, _0224B0F4 ; =ov45_02256128 + ldr sl, _0224B0F8 ; =0x0000056C + mov r7, #0 +_0224B004: + ldr r0, [r8] + cmp r0, #0xe + addls pc, pc, r0, lsl #2 + b _0224B0C8 +_0224B014: ; jump table + b _0224B0C8 ; case 0 + b _0224B0DC ; case 1 + b _0224B050 ; case 2 + b _0224B05C ; case 3 + b _0224B080 ; case 4 + b _0224B08C ; case 5 + b _0224B0DC ; case 6 + b _0224B098 ; case 7 + b _0224B0A4 ; case 8 + b _0224B0B0 ; case 9 + b _0224B0DC ; case 10 + b _0224B0DC ; case 11 + b _0224B0DC ; case 12 + b _0224B0DC ; case 13 + b _0224B0BC ; case 14 +_0224B050: + ldr r0, [r8, #4] + str r0, [sb] + b _0224B0DC +_0224B05C: + ldr r0, [r8, #4] + cmp r0, #0 + ldrne r0, [r8, #8] + cmpne r0, #0 + streq r7, [sb, #0x1c] + beq _0224B0DC + bl atoi + str r0, [sb, #0x1c] + b _0224B0DC +_0224B080: + ldr r0, [r8, #4] + str r0, [sb, #4] + b _0224B0DC +_0224B08C: + ldr r0, [r8, #4] + str r0, [sb, #8] + b _0224B0DC +_0224B098: + ldr r0, [r8, #4] + str r0, [sb, #0xc] + b _0224B0DC +_0224B0A4: + ldr r0, [r8, #4] + str r0, [sb, #0x10] + b _0224B0DC +_0224B0B0: + ldr r0, [r8, #4] + str r0, [sb, #0x14] + b _0224B0DC +_0224B0BC: + ldr r0, [r8, #4] + str r0, [sb, #0x18] + b _0224B0DC +_0224B0C8: + mov r0, r6 + mov r1, r5 + mov r2, r4 + mov r3, sl + bl __msl_assertion_failed +_0224B0DC: + ldr r0, [r8, #0xc]! + cmp r0, #0 + bne _0224B004 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0224B0EC: .word ov45_02256690 +_0224B0F0: .word ov45_022565D0 +_0224B0F4: .word ov45_02256128 +_0224B0F8: .word 0x0000056C + arm_func_end ov45_0224AFD8 + + arm_func_start ov45_0224B0FC +ov45_0224B0FC: ; 0x0224B0FC + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x2c + movs sb, r0 + mov r4, r1 + mov r7, #0 + bne _0224B128 + ldr r0, _0224B2F0 ; =ov45_022565C0 + ldr r1, _0224B2F4 ; =ov45_022565D0 + ldr r2, _0224B2F8 ; =ov45_02255FE8 + ldr r3, _0224B2FC ; =0x0000057C + bl __msl_assertion_failed +_0224B128: + ldr r0, [r4, #0x24] + cmp r0, #2 + beq _0224B148 + ldr r0, _0224B300 ; =ov45_022566F0 + ldr r1, _0224B2F4 ; =ov45_022565D0 + ldr r2, _0224B2F8 ; =ov45_02255FE8 + ldr r3, _0224B304 ; =0x00000582 + bl __msl_assertion_failed +_0224B148: + ldr r0, [r4, #0x24] + cmp r0, #2 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r4, #0x20] + ldr r6, [r4, #8] + ldmia r0, {r5, r8} + mov r0, r8 + bl strlen + ldrsb r1, [r8] + ldr r4, _0224B308 ; =ov45_02256708 + cmp r1, #1 + bne _0224B1DC + ldrsb r1, [r8, #1] + cmp r1, #0x41 + blt _0224B190 + cmp r1, #0x5a + ble _0224B1A0 +_0224B190: + cmp r1, #0x61 + blt _0224B1DC + cmp r1, #0x7a + bgt _0224B1DC +_0224B1A0: + sub r3, r0, #1 + ldrsb r0, [r8, r3] + cmp r0, #1 + bne _0224B1DC + mov r2, #0 + mov r0, r8 + mov r1, #0x20 + strb r2, [r8, r3] + bl strchr + cmp r0, #0 + beq _0224B1DC + mov r1, #0 + add r4, r8, #1 + strb r1, [r0] + add r8, r0, #1 +_0224B1DC: + ldr r1, _0224B30C ; =ov45_0225670C + mov r0, r4 + bl strcmp + cmp r0, #0 + moveq r7, #1 + beq _0224B204 + ldrsb r0, [r4] + cmp r0, #0 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0224B204: + mov r0, r5 + add r1, sb, #0x36c + bl strnicmp + cmp r0, #0 + bne _0224B27C + ldr r0, [sb, #0x800] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + cmp r7, #0 + movne r0, #1 + strne r0, [sp, #0x28] + moveq r0, #0 + streq r0, [sp, #0x28] + str r6, [sp, #0x20] + str r8, [sp, #0x24] + ldr r1, [sb, #0x808] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [sb, #0x800] + add r3, sp, #0x20 + mov r0, sb + mov r1, #2 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0224B27C: + mov r0, sb + mov r1, r5 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + cmp r7, #0 + movne r1, #1 + strne r1, [sp, #0x1c] + moveq r1, #0 + streq r1, [sp, #0x1c] + str r5, [sp, #0x10] + str r6, [sp, #0x14] + str r8, [sp, #0x18] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r5} + mov r1, #0x10 + str r1, [sp, #0xc] + ldr r2, [r0] + add r3, sp, #0x10 + mov r0, sb + mov r1, #4 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0224B2F0: .word ov45_022565C0 +_0224B2F4: .word ov45_022565D0 +_0224B2F8: .word ov45_02255FE8 +_0224B2FC: .word 0x0000057C +_0224B300: .word ov45_022566F0 +_0224B304: .word 0x00000582 +_0224B308: .word ov45_02256708 +_0224B30C: .word ov45_0225670C + arm_func_end ov45_0224B0FC + + arm_func_start ov45_0224B310 +ov45_0224B310: ; 0x0224B310 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + movs r7, r0 + mov r6, r1 + bne _0224B338 + ldr r0, _0224B460 ; =ov45_022565C0 + ldr r1, _0224B464 ; =ov45_022565D0 + ldr r2, _0224B468 ; =ov45_02255FA4 + ldr r3, _0224B46C ; =0x000005EA + bl __msl_assertion_failed +_0224B338: + ldr r0, [r6, #0x24] + cmp r0, #2 + beq _0224B358 + ldr r0, _0224B470 ; =ov45_022566F0 + ldr r1, _0224B464 ; =ov45_022565D0 + ldr r2, _0224B468 ; =ov45_02255FA4 + mov r3, #0x5f0 + bl __msl_assertion_failed +_0224B358: + ldr r0, [r6, #0x24] + cmp r0, #2 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #0x20] + add r1, r7, #0x36c + ldmia r0, {r4, r5} + mov r0, r4 + bl strnicmp + cmp r0, #0 + bne _0224B3E8 + ldr r0, [r7, #0x800] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #8] + mov r1, #2 + cmp r0, #0 + strne r0, [sp, #0x20] + moveq r0, #0 + streq r0, [sp, #0x20] + str r5, [sp, #0x24] + str r1, [sp, #0x28] + ldr r2, [r7, #0x808] + mov r0, #0 + str r2, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [r7, #0x800] + add r3, sp, #0x20 + mov r0, r7 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} +_0224B3E8: + mov r0, r7 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + str r4, [sp, #0x10] + ldr r1, [r6, #8] + add r3, sp, #0x10 + cmp r1, #0 + strne r1, [sp, #0x14] + moveq r1, #0 + streq r1, [sp, #0x14] + mov r1, #2 + str r1, [sp, #0x1c] + str r5, [sp, #0x18] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r4} + mov r1, #0x10 + str r1, [sp, #0xc] + ldr r2, [r0] + mov r0, r7 + mov r1, #4 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224B460: .word ov45_022565C0 +_0224B464: .word ov45_022565D0 +_0224B468: .word ov45_02255FA4 +_0224B46C: .word 0x000005EA +_0224B470: .word ov45_022566F0 + arm_func_end ov45_0224B310 + + arm_func_start ov45_0224B474 +ov45_0224B474: ; 0x0224B474 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + movs r7, r0 + mov r6, r1 + bne _0224B49C + ldr r0, _0224B5C8 ; =ov45_022565C0 + ldr r1, _0224B5CC ; =ov45_022565D0 + ldr r2, _0224B5D0 ; =ov45_02255E94 + ldr r3, _0224B5D4 ; =0x0000061F + bl __msl_assertion_failed +_0224B49C: + ldr r0, [r6, #0x24] + cmp r0, #2 + beq _0224B4BC + ldr r0, _0224B5D8 ; =ov45_022566F0 + ldr r1, _0224B5CC ; =ov45_022565D0 + ldr r2, _0224B5D0 ; =ov45_02255E94 + ldr r3, _0224B5DC ; =0x00000625 + bl __msl_assertion_failed +_0224B4BC: + ldr r0, [r6, #0x24] + cmp r0, #2 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #0x20] + add r1, r7, #0x36c + ldmia r0, {r4, r5} + mov r0, r4 + bl strnicmp + cmp r0, #0 + bne _0224B550 + ldr r0, [r7, #0x800] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #8] + add r3, sp, #0x20 + cmp r0, #0 + strne r0, [sp, #0x20] + moveq r0, #0 + streq r0, [sp, #0x20] + mov r0, #3 + str r0, [sp, #0x28] + str r5, [sp, #0x24] + ldr r1, [r7, #0x808] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [r7, #0x800] + mov r0, r7 + mov r1, #2 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} +_0224B550: + mov r0, r7 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + str r4, [sp, #0x10] + ldr r1, [r6, #8] + add r3, sp, #0x10 + cmp r1, #0 + strne r1, [sp, #0x14] + moveq r1, #0 + streq r1, [sp, #0x14] + mov r1, #3 + str r1, [sp, #0x1c] + str r5, [sp, #0x18] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r4} + mov r1, #0x10 + str r1, [sp, #0xc] + ldr r2, [r0] + mov r0, r7 + mov r1, #4 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224B5C8: .word ov45_022565C0 +_0224B5CC: .word ov45_022565D0 +_0224B5D0: .word ov45_02255E94 +_0224B5D4: .word 0x0000061F +_0224B5D8: .word ov45_022566F0 +_0224B5DC: .word 0x00000625 + arm_func_end ov45_0224B474 + + arm_func_start ov45_0224B5E0 +ov45_0224B5E0: ; 0x0224B5E0 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + movs r7, r0 + mov r6, r1 + bne _0224B608 + ldr r0, _0224B730 ; =ov45_022565C0 + ldr r1, _0224B734 ; =ov45_022565D0 + ldr r2, _0224B738 ; =ov45_02255EA4 + ldr r3, _0224B73C ; =0x00000654 + bl __msl_assertion_failed +_0224B608: + ldr r0, [r6, #0x24] + cmp r0, #2 + beq _0224B628 + ldr r0, _0224B740 ; =ov45_022566F0 + ldr r1, _0224B734 ; =ov45_022565D0 + ldr r2, _0224B738 ; =ov45_02255EA4 + ldr r3, _0224B744 ; =0x0000065A + bl __msl_assertion_failed +_0224B628: + ldr r0, [r6, #0x24] + cmp r0, #2 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #0x20] + add r1, r7, #0x36c + ldmia r0, {r4, r5} + mov r0, r4 + bl strnicmp + cmp r0, #0 + bne _0224B6BC + ldr r0, [r7, #0x800] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #8] + add r3, sp, #0x20 + cmp r0, #0 + strne r0, [sp, #0x20] + moveq r0, #0 + streq r0, [sp, #0x20] + mov r0, #4 + str r0, [sp, #0x28] + str r5, [sp, #0x24] + ldr r1, [r7, #0x808] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [r7, #0x800] + mov r0, r7 + mov r1, #2 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} +_0224B6BC: + mov r0, r7 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, pc} + str r4, [sp, #0x10] + ldr r1, [r6, #8] + mov r2, #0 + cmp r1, #0 + strne r1, [sp, #0x14] + moveq r1, #0 + streq r1, [sp, #0x14] + mov r1, #4 + str r5, [sp, #0x18] + str r1, [sp, #0x1c] + ldr r3, [r0, #0x2c] + str r3, [sp] + stmib sp, {r2, r4} + mov r2, #0x10 + str r2, [sp, #0xc] + ldr r2, [r0] + add r3, sp, #0x10 + mov r0, r7 + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224B730: .word ov45_022565C0 +_0224B734: .word ov45_022565D0 +_0224B738: .word ov45_02255EA4 +_0224B73C: .word 0x00000654 +_0224B740: .word ov45_022566F0 +_0224B744: .word 0x0000065A + arm_func_end ov45_0224B5E0 + + arm_func_start ov45_0224B748 +ov45_0224B748: ; 0x0224B748 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224B76C + ldr r0, _0224B780 ; =ov45_022565C0 + ldr r1, _0224B784 ; =ov45_022565D0 + ldr r2, _0224B788 ; =ov45_02255ED4 + ldr r3, _0224B78C ; =0x00000687 + bl __msl_assertion_failed +_0224B76C: + ldr r2, [r4, #0x1c] + ldr r1, _0224B790 ; =ov45_02256714 + add r0, r5, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224B780: .word ov45_022565C0 +_0224B784: .word ov45_022565D0 +_0224B788: .word ov45_02255ED4 +_0224B78C: .word 0x00000687 +_0224B790: .word ov45_02256714 + arm_func_end ov45_0224B748 + + arm_func_start ov45_0224B794 +ov45_0224B794: ; 0x0224B794 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + movs r4, r0 + mov r6, r1 + bne _0224B7BC + ldr r0, _0224B8B0 ; =ov45_022565C0 + ldr r1, _0224B8B4 ; =ov45_022565D0 + ldr r2, _0224B8B8 ; =ov45_02255EE4 + ldr r3, _0224B8BC ; =0x00000694 + bl __msl_assertion_failed +_0224B7BC: + ldr r0, [r6, #0x24] + cmp r0, #1 + beq _0224B7DC + ldr r0, _0224B8C0 ; =ov45_0225671C + ldr r1, _0224B8B4 ; =ov45_022565D0 + ldr r2, _0224B8B8 ; =ov45_02255EE4 + ldr r3, _0224B8C4 ; =0x0000069A + bl __msl_assertion_failed +_0224B7DC: + ldr r0, [r6, #0x24] + cmp r0, #1 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, pc} + ldr r5, [r6, #8] + ldr r2, [r6, #0x20] + mov r0, r5 + add r1, r4, #0x36c + ldr r6, [r2] + bl strnicmp + cmp r0, #0 + bne _0224B898 + mov r0, r6 + bl strlen + cmp r0, #0x40 + blo _0224B830 + ldr r0, _0224B8C8 ; =ov45_02256734 + ldr r1, _0224B8B4 ; =ov45_022565D0 + ldr r2, _0224B8B8 ; =ov45_02255EE4 + ldr r3, _0224B8CC ; =0x000006AA + bl __msl_assertion_failed +_0224B830: + mov r1, r6 + add r0, r4, #0x36c + mov r2, #0x40 + bl strncpy + mov r1, #0 + add r2, sp, #0xc + strb r1, [r4, #0x3ab] + str r1, [r2, #4] + str r1, [r2, #8] + str r1, [r2] + mov r3, #9 + mov r0, r4 + mov r1, #1 + str r3, [sp, #0xc] + str r5, [sp, #0x10] + str r6, [sp, #0x14] + bl ov45_022496AC + movs r1, r0 + beq _0224B898 + mov r3, #1 + add r2, sp, #0 + mov r0, r4 + str r3, [sp] + str r5, [sp, #4] + str r6, [sp, #8] + bl ov45_02249A0C +_0224B898: + mov r0, r4 + mov r1, r5 + mov r2, r6 + bl ov45_02249054 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224B8B0: .word ov45_022565C0 +_0224B8B4: .word ov45_022565D0 +_0224B8B8: .word ov45_02255EE4 +_0224B8BC: .word 0x00000694 +_0224B8C0: .word ov45_0225671C +_0224B8C4: .word 0x0000069A +_0224B8C8: .word ov45_02256734 +_0224B8CC: .word 0x000006AA + arm_func_end ov45_0224B794 + + arm_func_start ov45_0224B8D0 +ov45_0224B8D0: ; 0x0224B8D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x2c + movs r4, r0 + mov r8, r1 + bne _0224B8F8 + ldr r0, _0224BB28 ; =ov45_022565C0 + ldr r1, _0224BB2C ; =ov45_022565D0 + ldr r2, _0224BB30 ; =ov45_02255EF4 + ldr r3, _0224BB34 ; =0x000006D6 + bl __msl_assertion_failed +_0224B8F8: + ldr r0, [r8, #0x24] + cmp r0, #1 + beq _0224B918 + ldr r0, _0224BB38 ; =ov45_0225671C + ldr r1, _0224BB2C ; =ov45_022565D0 + ldr r2, _0224BB30 ; =ov45_02255EF4 + ldr r3, _0224BB3C ; =0x000006DC + bl __msl_assertion_failed +_0224B918: + ldr r0, [r8, #0x24] + cmp r0, #1 + addne sp, sp, #0x2c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r6, [r8, #8] + ldr r1, [r8, #0x20] + ldrsb r0, [r6] + ldr r5, [r1] + ldr r7, [r8, #0xc] + cmp r0, #0x40 + ldr r8, [r8, #0x10] + bne _0224B970 + ldrsb r0, [r6, #1]! + mov sb, #2 + cmp r0, #0 + bne _0224B9A4 + ldr r0, _0224BB40 ; =ov45_02256750 + ldr r1, _0224BB2C ; =ov45_022565D0 + ldr r2, _0224BB30 ; =ov45_02255EF4 + ldr r3, _0224BB44 ; =0x000006EB + bl __msl_assertion_failed + b _0224B9A4 +_0224B970: + cmp r0, #0x2b + bne _0224B9A0 + ldrsb r0, [r6, #1]! + mov sb, #1 + cmp r0, #0 + bne _0224B9A4 + ldr r0, _0224BB40 ; =ov45_02256750 + ldr r1, _0224BB2C ; =ov45_022565D0 + ldr r2, _0224BB30 ; =ov45_02255EF4 + add r3, sb, #0x6f0 + bl __msl_assertion_failed + b _0224B9A4 +_0224B9A0: + mov sb, #0 +_0224B9A4: + mov r0, r6 + add r1, r4, #0x36c + bl strcmp + cmp r0, #0 + mov r0, r4 + mov r1, r5 + bne _0224BA48 + bl ov45_02247AE0 + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r2, sp, #0x20 + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0x20] + str r5, [sp, #0x24] + bl ov45_022496AC + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r6, [r0, #0x1c] + mov r0, r4 + mov r1, r5 + mov r2, r6 + bl ov45_02247B94 + mov r0, r4 + mov r1, r5 + add r2, r6, #0x34 + bl ov45_02248454 + mov r3, #1 + ldr r1, _0224BB48 ; =ov45_02256760 + mov r2, r5 + add r0, r4, #0x1c + str r3, [r6, #0x30] + bl ov45_02252F74 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0224BA48: + bl ov45_02248238 + cmp r0, #0 + beq _0224BA6C + mov r0, r4 + mov r1, r6 + mov r2, r5 + mov r3, sb + stmia sp, {r7, r8} + bl ov45_02248888 +_0224BA6C: + mov r0, r4 + mov r1, r5 + bl ov45_0224861C + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r0, r4 + mov r1, r5 + bl ov45_02247E98 + movs r7, r0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r7, #8] + cmp r0, #0 + beq _0224BAE0 + str r5, [sp, #0x14] + str r6, [sp, #0x18] + str sb, [sp, #0x1c] + ldr r1, [r7, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r5} + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [r7, #8] + add r3, sp, #0x14 + mov r0, r4 + mov r1, #6 + bl ov45_02244D30 +_0224BAE0: + ldr r0, [r7, #0x20] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + str r5, [sp, #0x10] + ldr r1, [r7, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r5} + mov r0, #4 + str r0, [sp, #0xc] + ldr r2, [r7, #0x20] + add r3, sp, #0x10 + mov r0, r4 + mov r1, #0xc + bl ov45_02244D30 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0224BB28: .word ov45_022565C0 +_0224BB2C: .word ov45_022565D0 +_0224BB30: .word ov45_02255EF4 +_0224BB34: .word 0x000006D6 +_0224BB38: .word ov45_0225671C +_0224BB3C: .word 0x000006DC +_0224BB40: .word ov45_02256750 +_0224BB44: .word 0x000006EB +_0224BB48: .word ov45_02256760 + arm_func_end ov45_0224B8D0 + + arm_func_start ov45_0224BB4C +ov45_0224BB4C: ; 0x0224BB4C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x28 + movs r7, r0 + mov r4, r1 + bne _0224BB74 + ldr r0, _0224BC78 ; =ov45_022565C0 + ldr r1, _0224BC7C ; =ov45_022565D0 + ldr r2, _0224BC80 ; =ov45_02255F04 + ldr r3, _0224BC84 ; =0x00000752 + bl __msl_assertion_failed +_0224BB74: + ldr r1, [r4, #0x20] + ldr r0, [r4, #0x24] + ldr r4, [r4, #8] + cmp r0, #1 + ldrgt r8, [r1, #4] + ldr r5, [r1] + ldrle r8, _0224BC88 ; =ov45_02256708 + mov r0, r4 + add r1, r7, #0x36c + bl strcmp + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + mov r1, r4 + mov r2, r5 + bl ov45_02248A98 + mov r0, r7 + mov r1, r5 + bl ov45_0224861C + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + mov r1, r5 + bl ov45_02247E98 + movs r6, r0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r6, #0xc] + cmp r0, #0 + beq _0224BC30 + mov r2, #0 + str r5, [sp, #0x14] + str r4, [sp, #0x18] + str r2, [sp, #0x1c] + str r8, [sp, #0x20] + str r2, [sp, #0x24] + ldr r1, [r6, #0x2c] + mov r0, #0x14 + stmia sp, {r1, r2, r5} + str r0, [sp, #0xc] + ldr r2, [r6, #0xc] + add r3, sp, #0x14 + mov r0, r7 + mov r1, #7 + bl ov45_02244D30 +_0224BC30: + ldr r0, [r6, #0x20] + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r5, [sp, #0x10] + ldr r1, [r6, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r5} + mov r0, #4 + str r0, [sp, #0xc] + ldr r2, [r6, #0x20] + add r3, sp, #0x10 + mov r0, r7 + mov r1, #0xc + bl ov45_02244D30 + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224BC78: .word ov45_022565C0 +_0224BC7C: .word ov45_022565D0 +_0224BC80: .word ov45_02255F04 +_0224BC84: .word 0x00000752 +_0224BC88: .word ov45_02256708 + arm_func_end ov45_0224BB4C + + arm_func_start ov45_0224BC8C +ov45_0224BC8C: ; 0x0224BC8C + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x34 + movs sb, r0 + mov r5, r1 + bne _0224BCB4 + ldr r0, _0224BE58 ; =ov45_022565C0 + ldr r1, _0224BE5C ; =ov45_022565D0 + ldr r2, _0224BE60 ; =ov45_02255F14 + ldr r3, _0224BE64 ; =0x00000794 + bl __msl_assertion_failed +_0224BCB4: + ldr r0, [r5, #0x24] + mov r1, #1 + cmp r0, #2 + cmpne r0, #3 + movne r1, #0 + cmp r1, #0 + bne _0224BCE4 + ldr r0, _0224BE68 ; =ov45_02256768 + ldr r1, _0224BE5C ; =ov45_022565D0 + ldr r2, _0224BE60 ; =ov45_02255F14 + ldr r3, _0224BE6C ; =0x0000079A + bl __msl_assertion_failed +_0224BCE4: + ldr r1, [r5, #0x24] + cmp r1, #2 + cmpne r1, #3 + addne sp, sp, #0x34 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r5, #0x20] + cmp r1, #3 + ldreq r8, [r0, #8] + ldmia r0, {r4, r6} + mov r0, sb + mov r1, r6 + mov r2, r4 + ldr r5, [r5, #8] + ldrne r8, _0224BE70 ; =ov45_02256708 + bl ov45_02248A98 + mov r0, sb + mov r1, r4 + bl ov45_02247E98 + movs r7, r0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r0, r6 + add r1, sb, #0x36c + bl strnicmp + cmp r0, #0 + bne _0224BDA8 + ldr r0, [r7, #4] + cmp r0, #0 + beq _0224BD94 + str r4, [sp, #0x28] + str r5, [sp, #0x2c] + str r8, [sp, #0x30] + ldr r1, [r7, #0x2c] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #0xc + str r0, [sp, #0xc] + ldr r2, [r7, #4] + add r3, sp, #0x28 + mov r0, sb + mov r1, #5 + bl ov45_02244D30 +_0224BD94: + mov r0, sb + mov r1, r4 + bl ov45_02247D84 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_0224BDA8: + mov r0, sb + mov r1, r4 + bl ov45_0224861C + cmp r0, #0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r7, #0xc] + cmp r0, #0 + beq _0224BE10 + mov r0, #2 + str r0, [sp, #0x1c] + str r4, [sp, #0x14] + str r6, [sp, #0x18] + str r8, [sp, #0x20] + str r5, [sp, #0x24] + ldr r1, [r7, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r4} + mov r0, #0x14 + str r0, [sp, #0xc] + ldr r2, [r7, #0xc] + add r3, sp, #0x14 + mov r0, sb + mov r1, #7 + bl ov45_02244D30 +_0224BE10: + ldr r0, [r7, #0x20] + cmp r0, #0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + str r4, [sp, #0x10] + ldr r1, [r7, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r4} + mov r0, #4 + str r0, [sp, #0xc] + ldr r2, [r7, #0x20] + add r3, sp, #0x10 + mov r0, sb + mov r1, #0xc + bl ov45_02244D30 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0224BE58: .word ov45_022565C0 +_0224BE5C: .word ov45_022565D0 +_0224BE60: .word ov45_02255F14 +_0224BE64: .word 0x00000794 +_0224BE68: .word ov45_02256768 +_0224BE6C: .word 0x0000079A +_0224BE70: .word ov45_02256708 + arm_func_end ov45_0224BC8C + + arm_func_start ov45_0224BE74 +ov45_0224BE74: ; 0x0224BE74 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x28 + movs r7, r1 + mov r8, r0 + mov r6, r2 + mov r5, r3 + bne _0224BEA4 + ldr r0, _0224BFF0 ; =ov45_022567A0 + ldr r1, _0224BFF4 ; =ov45_022565D0 + ldr r2, _0224BFF8 ; =ov45_02256324 + ldr r3, _0224BFFC ; =0x000007E6 + bl __msl_assertion_failed +_0224BEA4: + ldrsb r0, [r7] + cmp r0, #0 + bne _0224BEC4 + ldr r0, _0224C000 ; =ov45_022567B0 + ldr r1, _0224BFF4 ; =ov45_022565D0 + ldr r2, _0224BFF8 ; =ov45_02256324 + ldr r3, _0224BFFC ; =0x000007E6 + bl __msl_assertion_failed +_0224BEC4: + cmp r6, #0 + bne _0224BEE0 + ldr r0, _0224C004 ; =ov45_022567C0 + ldr r1, _0224BFF4 ; =ov45_022565D0 + ldr r2, _0224BFF8 ; =ov45_02256324 + ldr r3, _0224C008 ; =0x000007E7 + bl __msl_assertion_failed +_0224BEE0: + ldrsb r0, [r6] + cmp r0, #0 + bne _0224BF00 + ldr r0, _0224C00C ; =ov45_022567D0 + ldr r1, _0224BFF4 ; =ov45_022565D0 + ldr r2, _0224BFF8 ; =ov45_02256324 + ldr r3, _0224C008 ; =0x000007E7 + bl __msl_assertion_failed +_0224BF00: + cmp r5, #0 + bne _0224BF1C + ldr r0, _0224C010 ; =ov45_022567E4 + ldr r1, _0224BFF4 ; =ov45_022565D0 + ldr r2, _0224BFF8 ; =ov45_02256324 + ldr r3, _0224C014 ; =0x000007E8 + bl __msl_assertion_failed +_0224BF1C: + mov r0, r8 + mov r1, r7 + mov r2, r6 + bl ov45_02248A98 + mov r0, r8 + mov r1, r6 + bl ov45_0224861C + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r8 + mov r1, r6 + bl ov45_02247E98 + movs r4, r0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _0224BFA8 + mov r0, #1 + mov r2, #0 + str r0, [sp, #0x1c] + str r6, [sp, #0x14] + str r7, [sp, #0x18] + str r5, [sp, #0x20] + str r2, [sp, #0x24] + ldr r1, [r4, #0x2c] + mov r0, #0x14 + stmia sp, {r1, r2, r6} + str r0, [sp, #0xc] + ldr r2, [r4, #0xc] + add r3, sp, #0x14 + mov r0, r8 + mov r1, #7 + bl ov45_02244D30 +_0224BFA8: + ldr r0, [r4, #0x20] + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r6, [sp, #0x10] + ldr r1, [r4, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r6} + mov r0, #4 + str r0, [sp, #0xc] + ldr r2, [r4, #0x20] + add r3, sp, #0x10 + mov r0, r8 + mov r1, #0xc + bl ov45_02244D30 + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224BFF0: .word ov45_022567A0 +_0224BFF4: .word ov45_022565D0 +_0224BFF8: .word ov45_02256324 +_0224BFFC: .word 0x000007E6 +_0224C000: .word ov45_022567B0 +_0224C004: .word ov45_022567C0 +_0224C008: .word 0x000007E7 +_0224C00C: .word ov45_022567D0 +_0224C010: .word ov45_022567E4 +_0224C014: .word 0x000007E8 + arm_func_end ov45_0224BE74 + + arm_func_start ov45_0224C018 +ov45_0224C018: ; 0x0224C018 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224C03C + ldr r0, _0224C084 ; =ov45_022565C0 + ldr r1, _0224C088 ; =ov45_022565D0 + ldr r2, _0224C08C ; =ov45_02255F24 + ldr r3, _0224C090 ; =0x00000813 + bl __msl_assertion_failed +_0224C03C: + ldr r0, [r4, #0x24] + cmp r0, #1 + beq _0224C05C + ldr r0, _0224C094 ; =ov45_0225671C + ldr r1, _0224C088 ; =ov45_022565D0 + ldr r2, _0224C08C ; =ov45_02255F24 + ldr r3, _0224C098 ; =0x00000819 + bl __msl_assertion_failed +_0224C05C: + ldr r0, [r4, #0x24] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x20] + ldr r1, [r4, #8] + ldr r3, [r0] + ldr r2, _0224C09C ; =ov45_0224BE74 + mov r0, r5 + bl ov45_02248CE8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224C084: .word ov45_022565C0 +_0224C088: .word ov45_022565D0 +_0224C08C: .word ov45_02255F24 +_0224C090: .word 0x00000813 +_0224C094: .word ov45_0225671C +_0224C098: .word 0x00000819 +_0224C09C: .word ov45_0224BE74 + arm_func_end ov45_0224C018 + + arm_func_start ov45_0224C0A0 +ov45_0224C0A0: ; 0x0224C0A0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x28 + movs r7, r1 + mov r8, r0 + mov r6, r2 + mov r5, r3 + bne _0224C0D0 + ldr r0, _0224C21C ; =ov45_022567A0 + ldr r1, _0224C220 ; =ov45_022565D0 + ldr r2, _0224C224 ; =ov45_02256340 + ldr r3, _0224C228 ; =0x00000828 + bl __msl_assertion_failed +_0224C0D0: + ldrsb r0, [r7] + cmp r0, #0 + bne _0224C0F0 + ldr r0, _0224C22C ; =ov45_022567B0 + ldr r1, _0224C220 ; =ov45_022565D0 + ldr r2, _0224C224 ; =ov45_02256340 + ldr r3, _0224C228 ; =0x00000828 + bl __msl_assertion_failed +_0224C0F0: + cmp r6, #0 + bne _0224C10C + ldr r0, _0224C230 ; =ov45_022567C0 + ldr r1, _0224C220 ; =ov45_022565D0 + ldr r2, _0224C224 ; =ov45_02256340 + ldr r3, _0224C234 ; =0x00000829 + bl __msl_assertion_failed +_0224C10C: + ldrsb r0, [r6] + cmp r0, #0 + bne _0224C12C + ldr r0, _0224C238 ; =ov45_022567D0 + ldr r1, _0224C220 ; =ov45_022565D0 + ldr r2, _0224C224 ; =ov45_02256340 + ldr r3, _0224C234 ; =0x00000829 + bl __msl_assertion_failed +_0224C12C: + cmp r5, #0 + bne _0224C148 + ldr r0, _0224C23C ; =ov45_022567E4 + ldr r1, _0224C220 ; =ov45_022565D0 + ldr r2, _0224C224 ; =ov45_02256340 + ldr r3, _0224C240 ; =0x0000082A + bl __msl_assertion_failed +_0224C148: + mov r0, r8 + mov r1, r7 + mov r2, r6 + bl ov45_02248A98 + mov r0, r8 + mov r1, r6 + bl ov45_0224861C + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r8 + mov r1, r6 + bl ov45_02247E98 + movs r4, r0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _0224C1D4 + mov r0, #3 + mov r2, #0 + str r0, [sp, #0x1c] + str r6, [sp, #0x14] + str r7, [sp, #0x18] + str r5, [sp, #0x20] + str r2, [sp, #0x24] + ldr r1, [r4, #0x2c] + mov r0, #0x14 + stmia sp, {r1, r2, r6} + str r0, [sp, #0xc] + ldr r2, [r4, #0xc] + add r3, sp, #0x14 + mov r0, r8 + mov r1, #7 + bl ov45_02244D30 +_0224C1D4: + ldr r0, [r4, #0x20] + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + str r6, [sp, #0x10] + ldr r1, [r4, #0x2c] + mov r0, #0 + str r1, [sp] + stmib sp, {r0, r6} + mov r0, #4 + str r0, [sp, #0xc] + ldr r2, [r4, #0x20] + add r3, sp, #0x10 + mov r0, r8 + mov r1, #0xc + bl ov45_02244D30 + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224C21C: .word ov45_022567A0 +_0224C220: .word ov45_022565D0 +_0224C224: .word ov45_02256340 +_0224C228: .word 0x00000828 +_0224C22C: .word ov45_022567B0 +_0224C230: .word ov45_022567C0 +_0224C234: .word 0x00000829 +_0224C238: .word ov45_022567D0 +_0224C23C: .word ov45_022567E4 +_0224C240: .word 0x0000082A + arm_func_end ov45_0224C0A0 + + arm_func_start ov45_0224C244 +ov45_0224C244: ; 0x0224C244 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #2 + beq _0224C270 + ldr r0, _0224C294 ; =ov45_022566F0 + ldr r1, _0224C298 ; =ov45_022565D0 + ldr r2, _0224C29C ; =ov45_02255F34 + ldr r3, _0224C2A0 ; =0x00000859 + bl __msl_assertion_failed +_0224C270: + ldr r0, [r4, #0x24] + cmp r0, #2 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x20] + ldr r2, _0224C2A4 ; =ov45_0224C0A0 + ldmia r0, {r1, r3} + mov r0, r5 + bl ov45_02248CE8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224C294: .word ov45_022566F0 +_0224C298: .word ov45_022565D0 +_0224C29C: .word ov45_02255F34 +_0224C2A0: .word 0x00000859 +_0224C2A4: .word ov45_0224C0A0 + arm_func_end ov45_0224C244 + + arm_func_start ov45_0224C2A8 +ov45_0224C2A8: ; 0x0224C2A8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + movs r4, r0 + mov r5, r1 + bne _0224C2D0 + ldr r0, _0224C374 ; =ov45_022565C0 + ldr r1, _0224C378 ; =ov45_022565D0 + ldr r2, _0224C37C ; =ov45_02255F54 + ldr r3, _0224C380 ; =0x0000086A + bl __msl_assertion_failed +_0224C2D0: + ldr r0, [r5, #0x24] + cmp r0, #2 + beq _0224C2F0 + ldr r0, _0224C384 ; =ov45_022566F0 + ldr r1, _0224C378 ; =ov45_022565D0 + ldr r2, _0224C37C ; =ov45_02255F54 + mov r3, #0x870 + bl __msl_assertion_failed +_0224C2F0: + ldr r0, [r5, #0x24] + cmp r0, #2 + addne sp, sp, #0x18 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, [r5, #0x20] + mov r0, r4 + ldmia r1, {r5, r6} + mov r1, r5 + mov r2, r6 + bl ov45_022486E0 + mov r0, r4 + mov r1, r5 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0, #0x14] + cmpne r1, #0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r4, r5, r6, pc} + str r5, [sp, #0x10] + str r6, [sp, #0x14] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r5} + mov r1, #8 + str r1, [sp, #0xc] + ldr r2, [r0, #0x14] + add r3, sp, #0x10 + mov r0, r4 + mov r1, #9 + bl ov45_02244D30 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224C374: .word ov45_022565C0 +_0224C378: .word ov45_022565D0 +_0224C37C: .word ov45_02255F54 +_0224C380: .word 0x0000086A +_0224C384: .word ov45_022566F0 + arm_func_end ov45_0224C2A8 + + arm_func_start ov45_0224C388 +ov45_0224C388: ; 0x0224C388 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + mov r4, r1 + ldr r1, [r4, #0x24] + mov sb, r0 + cmp r1, #2 + bge _0224C3B8 + ldr r0, _0224C57C ; =ov45_022567F4 + ldr r1, _0224C580 ; =ov45_022565D0 + ldr r2, _0224C584 ; =ov45_02255F44 + ldr r3, _0224C588 ; =0x00000893 + bl __msl_assertion_failed +_0224C3B8: + ldr r0, [r4, #0x24] + cmp r0, #2 + addlt sp, sp, #0x28 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #0x20] + mov r0, sb + ldr r8, [r1] + ldr r5, [r1, #4] + mov r1, r8 + bl ov45_02248238 + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #0x20] + ldr r2, [r4, #0x24] + mov r0, r5 + add r1, r1, #8 + sub r2, r2, #2 + bl ov45_0224AD24 + str r0, [sp, #4] + cmp r0, #0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r0] + ldr r7, [sp, #4] + cmp r0, #0 + beq _0224C528 + ldr sl, _0224C58C ; =ov45_02256690 + ldr fp, _0224C580 ; =ov45_022565D0 + mov r4, #1 + mov r5, #2 + mov r6, #0 +_0224C438: + ldr r0, [r7] + cmp r0, #0xe + addls pc, pc, r0, lsl #2 + b _0224C508 +_0224C448: ; jump table + b _0224C508 ; case 0 + b _0224C51C ; case 1 + b _0224C51C ; case 2 + b _0224C51C ; case 3 + b _0224C51C ; case 4 + b _0224C51C ; case 5 + b _0224C484 ; case 6 + b _0224C51C ; case 7 + b _0224C51C ; case 8 + b _0224C51C ; case 9 + b _0224C4B8 ; case 10 + b _0224C4E0 ; case 11 + b _0224C51C ; case 12 + b _0224C51C ; case 13 + b _0224C51C ; case 14 +_0224C484: + ldr r0, [r7, #4] + cmp r0, #0 + beq _0224C4A4 + ldr r2, [r7, #8] + mov r0, sb + mov r1, r8 + bl ov45_02248454 + b _0224C51C +_0224C4A4: + mov r0, sb + mov r1, r8 + mov r2, r6 + bl ov45_02248454 + b _0224C51C +_0224C4B8: + ldr r1, [r7, #8] + cmp r1, #0 + beq _0224C51C + ldr r2, [r7, #4] + mov r0, sb + str r2, [sp] + mov r2, r8 + mov r3, r5 + bl ov45_02249194 + b _0224C51C +_0224C4E0: + ldr r1, [r7, #8] + cmp r1, #0 + beq _0224C51C + ldr r2, [r7, #4] + mov r0, sb + str r2, [sp] + mov r2, r8 + mov r3, r4 + bl ov45_02249194 + b _0224C51C +_0224C508: + ldr r2, _0224C584 ; =ov45_02255F44 + ldr r3, _0224C590 ; =0x000008DC + mov r0, sl + mov r1, fp + bl __msl_assertion_failed +_0224C51C: + ldr r0, [r7, #0xc]! + cmp r0, #0 + bne _0224C438 +_0224C528: + add r2, sp, #8 + mov r0, sb + mov r1, r8 + bl ov45_02248288 + cmp r0, #0 + bne _0224C550 + ldr r0, [sp, #4] + bl ov00_021EC3D8 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224C550: + ldr r1, [sp, #4] + add r0, sp, #8 + bl ov45_0224AFD8 + add r2, sp, #8 + mov r0, sb + mov r1, r8 + bl ov45_02248374 + ldr r0, [sp, #4] + bl ov00_021EC3D8 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224C57C: .word ov45_022567F4 +_0224C580: .word ov45_022565D0 +_0224C584: .word ov45_02255F44 +_0224C588: .word 0x00000893 +_0224C58C: .word ov45_02256690 +_0224C590: .word 0x000008DC + arm_func_end ov45_0224C388 + + arm_func_start ov45_0224C594 +ov45_0224C594: ; 0x0224C594 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224C5B8 + ldr r0, _0224C5F8 ; =ov45_022565C0 + ldr r1, _0224C5FC ; =ov45_022565D0 + ldr r2, _0224C600 ; =ov45_02255F64 + ldr r3, _0224C604 ; =0x000008F1 + bl __msl_assertion_failed +_0224C5B8: + ldr r0, [r4, #0x24] + cmp r0, #1 + beq _0224C5D8 + ldr r0, _0224C608 ; =ov45_0225671C + ldr r1, _0224C5FC ; =ov45_022565D0 + ldr r2, _0224C600 ; =ov45_02255F64 + ldr r3, _0224C60C ; =0x000008F7 + bl __msl_assertion_failed +_0224C5D8: + ldr r0, [r4, #0x24] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [r4, #0x20] + mov r0, r5 + ldr r1, [r1] + bl ov45_0224F69C + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224C5F8: .word ov45_022565C0 +_0224C5FC: .word ov45_022565D0 +_0224C600: .word ov45_02255F64 +_0224C604: .word 0x000008F1 +_0224C608: .word ov45_0225671C +_0224C60C: .word 0x000008F7 + arm_func_end ov45_0224C594 + + arm_func_start ov45_0224C610 +ov45_0224C610: ; 0x0224C610 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + movs r4, r0 + mov r5, r1 + bne _0224C638 + ldr r0, _0224C6C4 ; =ov45_022565C0 + ldr r1, _0224C6C8 ; =ov45_022565D0 + ldr r2, _0224C6CC ; =ov45_02255FB4 + ldr r3, _0224C6D0 ; =0x00000904 + bl __msl_assertion_failed +_0224C638: + ldr r0, [r5, #0x24] + cmp r0, #2 + beq _0224C658 + ldr r0, _0224C6D4 ; =ov45_022566F0 + ldr r1, _0224C6C8 ; =ov45_022565D0 + ldr r2, _0224C6CC ; =ov45_02255FB4 + ldr r3, _0224C6D8 ; =0x0000090A + bl __msl_assertion_failed +_0224C658: + ldr r0, [r5, #0x24] + cmp r0, #2 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x804] + ldr r1, [r5, #0x20] + cmp r0, #0 + addeq sp, sp, #0x18 + ldr r2, [r5, #8] + ldr r0, [r1, #4] + ldmeqia sp!, {r3, r4, r5, pc} + str r0, [sp, #0x10] + str r2, [sp, #0x14] + ldr r1, [r4, #0x808] + mov r0, #0 + str r1, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + mov r0, #8 + str r0, [sp, #0xc] + ldr r2, [r4, #0x804] + add r3, sp, #0x10 + mov r0, r4 + mov r1, #3 + bl ov45_02244D30 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224C6C4: .word ov45_022565C0 +_0224C6C8: .word ov45_022565D0 +_0224C6CC: .word ov45_02255FB4 +_0224C6D0: .word 0x00000904 +_0224C6D4: .word ov45_022566F0 +_0224C6D8: .word 0x0000090A + arm_func_end ov45_0224C610 + + arm_func_start ov45_0224C6DC +ov45_0224C6DC: ; 0x0224C6DC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + mov r4, r1 + ldr r1, [r4, #0x24] + str r0, [sp, #8] + cmp r1, #4 + mov r8, #0 + beq _0224C710 + ldr r0, _0224C9A8 ; =ov45_0225680C + ldr r1, _0224C9AC ; =ov45_022565D0 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, _0224C9B4 ; =0x0000092F + bl __msl_assertion_failed +_0224C710: + ldr r0, [r4, #0x24] + cmp r0, #4 + addne sp, sp, #0x40 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #0x20] + add r2, sp, #0x10 + mov r0, #0 + ldr r7, [r1, #8] + ldr r4, [r1, #0xc] + mov r3, r2 + mov r1, r0 + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3, {r0, r1} + mov r3, #3 + mov r6, #1 + mov r5, #0xf + ldr r0, [sp, #8] + mov r1, #4 + str r6, [sp, #0x10] + str r7, [sp, #0x14] + str r5, [sp, #0x1c] + str r7, [sp, #0x20] + str r3, [sp, #0x28] + str r7, [sp, #0x2c] + str r3, [sp, #0x34] + bl ov45_022496AC + movs r6, r0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r6] + ldr r1, _0224C9B8 ; =ov45_02256824 + cmp r0, #1 + ldrne r8, [r6, #0x1c] + mov r0, r4 + bl strtok + movs sb, r0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _0224C9BC ; =0x00000957 + ldr fp, _0224C9AC ; =ov45_022565D0 + sub r0, r0, #6 + str r0, [sp, #0xc] +_0224C7C8: + ldrsb r0, [sb] + cmp r0, #0 + bne _0224C7E8 + ldr r0, _0224C9C0 ; =ov45_02256828 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, [sp, #0xc] + mov r1, fp + bl __msl_assertion_failed +_0224C7E8: + ldrsb r0, [sb] + cmp r0, #0x40 + bne _0224C820 + ldrsb r0, [sb, #1] + cmp r0, #0 + bne _0224C814 + ldr r0, _0224C9C4 ; =ov45_02256838 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, _0224C9BC ; =0x00000957 + mov r1, fp + bl __msl_assertion_failed +_0224C814: + mov sl, #2 + add sb, sb, #1 + b _0224C85C +_0224C820: + cmp r0, #0x2b + bne _0224C858 + ldrsb r0, [sb, #1] + cmp r0, #0 + bne _0224C84C + ldr r3, _0224C9BC ; =0x00000957 + ldr r0, _0224C9C4 ; =ov45_02256838 + ldr r2, _0224C9B0 ; =ov45_02256088 + mov r1, fp + add r3, r3, #6 + bl __msl_assertion_failed +_0224C84C: + mov sl, #1 + add sb, sb, #1 + b _0224C85C +_0224C858: + mov sl, #0 +_0224C85C: + ldr r0, [r6] + cmp r0, #1 + beq _0224C95C + ldr r1, [r8] + ldr r0, [r8, #4] + cmp r0, r1 + bne _0224C8F8 + add r0, r1, #0x64 + mov r1, r0, lsl #2 + ldr r0, [r8, #8] + bl ov00_021EC3BC + cmp r0, #0 + bne _0224C8AC + ldr r0, _0224C9C8 ; =ov45_02256690 + ldr r1, _0224C9AC ; =ov45_022565D0 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, _0224C9CC ; =0x0000096D + bl __msl_assertion_failed + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224C8AC: + str r0, [r8, #8] + ldr r0, [r8, #0xc] + ldr r1, [r8] + add r1, r1, #0x64 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224C8E8 + ldr r0, _0224C9C8 ; =ov45_02256690 + ldr r1, _0224C9AC ; =ov45_022565D0 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, _0224C9D0 ; =0x00000974 + bl __msl_assertion_failed + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224C8E8: + str r0, [r8, #0xc] + ldr r0, [r8] + add r0, r0, #0x64 + str r0, [r8] +_0224C8F8: + mov r0, sb + bl strlen + mov r5, r0 + add r0, r5, #1 + bl ov00_021EC3A8 + movs r4, r0 + bne _0224C930 + ldr r0, _0224C9C8 ; =ov45_02256690 + ldr r1, _0224C9AC ; =ov45_022565D0 + ldr r2, _0224C9B0 ; =ov45_02256088 + ldr r3, _0224C9D4 ; =0x00000981 + bl __msl_assertion_failed + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224C930: + add r2, r5, #1 + mov r1, sb + bl memcpy + ldmib r8, {r0, r1} + str r4, [r1, r0, lsl #2] + ldr r1, [r8, #0xc] + ldr r0, [r8, #4] + str sl, [r1, r0, lsl #2] + ldr r0, [r8, #4] + add r0, r0, #1 + str r0, [r8, #4] +_0224C95C: + ldr r0, [r6] + cmp r0, #1 + cmpne r0, #0xf + bne _0224C98C + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + ldr r0, [sp, #8] + mov r1, sb + mov r3, sl + mov r2, r7 + bl ov45_02248888 +_0224C98C: + ldr r1, _0224C9B8 ; =ov45_02256824 + mov r0, #0 + bl strtok + movs sb, r0 + bne _0224C7C8 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224C9A8: .word ov45_0225680C +_0224C9AC: .word ov45_022565D0 +_0224C9B0: .word ov45_02256088 +_0224C9B4: .word 0x0000092F +_0224C9B8: .word ov45_02256824 +_0224C9BC: .word 0x00000957 +_0224C9C0: .word ov45_02256828 +_0224C9C4: .word ov45_02256838 +_0224C9C8: .word ov45_02256690 +_0224C9CC: .word 0x0000096D +_0224C9D0: .word 0x00000974 +_0224C9D4: .word 0x00000981 + arm_func_end ov45_0224C6DC + + arm_func_start ov45_0224C9D8 +ov45_0224C9D8: ; 0x0224C9D8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x60 + movs r6, r0 + mov r4, r1 + bne _0224CA00 + ldr r0, _0224CB90 ; =ov45_022565C0 + ldr r1, _0224CB94 ; =ov45_022565D0 + ldr r2, _0224CB98 ; =ov45_022560D8 + ldr r3, _0224CB9C ; =0x0000099F + bl __msl_assertion_failed +_0224CA00: + ldr r0, [r4, #0x24] + cmp r0, #3 + beq _0224CA20 + ldr r0, _0224CBA0 ; =ov45_02256848 + ldr r1, _0224CB94 ; =ov45_022565D0 + ldr r2, _0224CB98 ; =ov45_022560D8 + ldr r3, _0224CBA4 ; =0x000009A5 + bl __msl_assertion_failed +_0224CA20: + ldr r0, [r4, #0x24] + cmp r0, #3 + addne sp, sp, #0x60 + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #0x20] + ldr r1, _0224CBA8 ; =ov45_02256860 + ldr r5, [r0, #4] + mov r0, r5 + bl strcmp + cmp r0, #0 + add r2, sp, #0x30 + mov r0, #0 + mov r3, r2 + mov r1, r0 + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3, {r0, r1} + moveq r5, #0 + mov r3, #3 + mov ip, #1 + mov r4, #0xf + mov r0, r6 + mov r1, #4 + str ip, [sp, #0x30] + str r5, [sp, #0x34] + str r4, [sp, #0x3c] + str r5, [sp, #0x40] + str r3, [sp, #0x48] + str r5, [sp, #0x4c] + str r3, [sp, #0x54] + bl ov45_022496AC + movs r4, r0 + addeq sp, sp, #0x60 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r4] + cmp r0, #1 + bne _0224CB04 + mov r1, #1 + mov r0, #0 + str r1, [sp, #0x24] + str r0, [sp, #0x28] + str r5, [sp, #0x2c] + ldr r0, [r4, #0x10] + cmp r0, #0 + bne _0224CAEC + mov r0, r6 + mov r1, r5 + bl ov45_02248558 +_0224CAEC: + add r2, sp, #0x24 + mov r0, r6 + mov r1, r4 + bl ov45_02249A0C + add sp, sp, #0x60 + ldmia sp!, {r4, r5, r6, pc} +_0224CB04: + cmp r0, #0xf + bne _0224CB44 + ldr ip, [r4, #0x1c] + add r2, sp, #0x14 + str r5, [sp, #0x14] + ldr r1, [ip, #4] + mov r0, r6 + str r1, [sp, #0x18] + ldr r3, [ip, #8] + mov r1, r4 + str r3, [sp, #0x1c] + ldr r3, [ip, #0xc] + str r3, [sp, #0x20] + bl ov45_02249A0C + add sp, sp, #0x60 + ldmia sp!, {r4, r5, r6, pc} +_0224CB44: + cmp r0, #3 + addne sp, sp, #0x60 + ldmneia sp!, {r4, r5, r6, pc} + ldr r3, [r4, #0x1c] + mov r0, #1 + str r5, [sp, #4] + str r0, [sp] + ldr r0, [r3, #4] + add r2, sp, #0 + str r0, [sp, #8] + ldr r1, [r3, #8] + mov r0, r6 + str r1, [sp, #0xc] + ldr r3, [r3, #0xc] + mov r1, r4 + str r3, [sp, #0x10] + bl ov45_02249A0C + add sp, sp, #0x60 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224CB90: .word ov45_022565C0 +_0224CB94: .word ov45_022565D0 +_0224CB98: .word ov45_022560D8 +_0224CB9C: .word 0x0000099F +_0224CBA0: .word ov45_02256848 +_0224CBA4: .word 0x000009A5 +_0224CBA8: .word ov45_02256860 + arm_func_end ov45_0224C9D8 + + arm_func_start ov45_0224CBAC +ov45_0224CBAC: ; 0x0224CBAC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x30 + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #3 + beq _0224CBDC + ldr r0, _0224CCB8 ; =ov45_02256848 + ldr r1, _0224CCBC ; =ov45_022565D0 + ldr r2, _0224CCC0 ; =ov45_0225604C + ldr r3, _0224CCC4 ; =0x00000A05 + bl __msl_assertion_failed +_0224CBDC: + ldr r0, [r4, #0x24] + cmp r0, #3 + addne sp, sp, #0x30 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, [r4, #0x20] + mov r0, r5 + ldmib r1, {r4, r6} + mov r1, r4 + mov r2, r6 + bl ov45_022486E0 + add r2, sp, #0x24 + mov ip, #0 + str ip, [r2, #4] + mov r0, r5 + str ip, [r2] + mov r3, #2 + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x24] + str r4, [sp, #0x28] + bl ov45_022496AC + movs r1, r0 + beq _0224CC5C + mov r3, #1 + add r2, sp, #0x18 + mov r0, r5 + str r3, [sp, #0x18] + str r4, [sp, #0x1c] + str r6, [sp, #0x20] + bl ov45_02249A0C + add sp, sp, #0x30 + ldmia sp!, {r4, r5, r6, pc} +_0224CC5C: + mov r0, r5 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0, #0x14] + cmpne r1, #0 + addeq sp, sp, #0x30 + ldmeqia sp!, {r4, r5, r6, pc} + str r4, [sp, #0x10] + str r6, [sp, #0x14] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r4} + mov r1, #8 + str r1, [sp, #0xc] + ldr r2, [r0, #0x14] + add r3, sp, #0x10 + mov r0, r5 + mov r1, #9 + bl ov45_02244D30 + add sp, sp, #0x30 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224CCB8: .word ov45_02256848 +_0224CCBC: .word ov45_022565D0 +_0224CCC0: .word ov45_0225604C +_0224CCC4: .word 0x00000A05 + arm_func_end ov45_0224CBAC + + arm_func_start ov45_0224CCC8 +ov45_0224CCC8: ; 0x0224CCC8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x30 + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #2 + bge _0224CCF8 + ldr r0, _0224CDCC ; =ov45_022567F4 + ldr r1, _0224CDD0 ; =ov45_022565D0 + ldr r2, _0224CDD4 ; =ov45_02256100 + ldr r3, _0224CDD8 ; =0x00000A3C + bl __msl_assertion_failed +_0224CCF8: + ldr r0, [r4, #0x24] + cmp r0, #2 + addlt sp, sp, #0x30 + ldmltia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x20] + add r2, sp, #0x24 + ldr r4, [r0, #4] + mov ip, #0 + str ip, [r2, #4] + mov r0, r5 + str ip, [r2] + mov r3, #2 + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x24] + str r4, [sp, #0x28] + bl ov45_022496AC + movs r1, r0 + beq _0224CD6C + ldr r3, _0224CDDC ; =ov45_02256708 + mov ip, #1 + add r2, sp, #0x18 + mov r0, r5 + str ip, [sp, #0x18] + str r4, [sp, #0x1c] + str r3, [sp, #0x20] + bl ov45_02249A0C + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, pc} +_0224CD6C: + mov r0, r5 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0, #0x14] + cmpne r1, #0 + addeq sp, sp, #0x30 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _0224CDDC ; =ov45_02256708 + str r4, [sp, #0x10] + str r1, [sp, #0x14] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r4} + mov r1, #8 + str r1, [sp, #0xc] + ldr r2, [r0, #0x14] + add r3, sp, #0x10 + mov r0, r5 + mov r1, #9 + bl ov45_02244D30 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224CDCC: .word ov45_022567F4 +_0224CDD0: .word ov45_022565D0 +_0224CDD4: .word ov45_02256100 +_0224CDD8: .word 0x00000A3C +_0224CDDC: .word ov45_02256708 + arm_func_end ov45_0224CCC8 + + arm_func_start ov45_0224CDE0 +ov45_0224CDE0: ; 0x0224CDE0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + movs r4, r0 + mov r5, r1 + bne _0224CE08 + ldr r0, _0224CEEC ; =ov45_022565C0 + ldr r1, _0224CEF0 ; =ov45_022565D0 + ldr r2, _0224CEF4 ; =ov45_022561D0 + ldr r3, _0224CEF8 ; =0x00000A6D + bl __msl_assertion_failed +_0224CE08: + ldr r0, [r5, #0x24] + cmp r0, #3 + beq _0224CE28 + ldr r0, _0224CEFC ; =ov45_02256848 + ldr r1, _0224CEF0 ; =ov45_022565D0 + ldr r2, _0224CEF4 ; =ov45_022561D0 + ldr r3, _0224CF00 ; =0x00000A73 + bl __msl_assertion_failed +_0224CE28: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0x10 + ldmia r0, {r5, r6} + mov r1, #0 + str r1, [r2, #4] + str r1, [r2, #8] + str r1, [r2] + mov r3, #9 + mov r0, r4 + mov r1, #1 + str r3, [sp, #0x10] + str r5, [sp, #0x14] + str r6, [sp, #0x18] + bl ov45_022496AC + movs r1, r0 + beq _0224CE9C + mov r3, #0 + add r2, sp, #4 + mov r0, r4 + str r3, [sp, #4] + str r5, [sp, #8] + str r6, [sp, #0xc] + bl ov45_02249A0C + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} +_0224CE9C: + ldr r0, [r4, #4] + cmp r0, #0 + bne _0224CEBC + ldr r0, _0224CF04 ; =ov45_02256864 + ldr r1, _0224CEF0 ; =ov45_022565D0 + ldr r2, _0224CEF4 ; =ov45_022561D0 + ldr r3, _0224CF08 ; =0x00000A93 + bl __msl_assertion_failed +_0224CEBC: + ldr r0, [r4, #4] + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r3, #0 + mov r0, r4 + add r2, r4, #0x36c + mov r1, #1 + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0224CEEC: .word ov45_022565C0 +_0224CEF0: .word ov45_022565D0 +_0224CEF4: .word ov45_022561D0 +_0224CEF8: .word 0x00000A6D +_0224CEFC: .word ov45_02256848 +_0224CF00: .word 0x00000A73 +_0224CF04: .word ov45_02256864 +_0224CF08: .word 0x00000A93 + arm_func_end ov45_0224CDE0 + + arm_func_start ov45_0224CF0C +ov45_0224CF0C: ; 0x0224CF0C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x68 + mov sb, r1 + ldr r1, [sb, #0x24] + mov sl, r0 + cmp r1, #8 + beq _0224CF3C + ldr r0, _0224D118 ; =ov45_0225687C + ldr r1, _0224D11C ; =ov45_022565D0 + ldr r2, _0224D120 ; =ov45_02256140 + ldr r3, _0224D124 ; =0x00000AA6 + bl __msl_assertion_failed +_0224CF3C: + ldr r0, [sb, #0x24] + cmp r0, #8 + addne sp, sp, #0x68 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r4, [sb, #0x20] + mov r0, sl + ldr r6, [r4, #8] + ldr r7, [r4, #0xc] + ldr r5, [r4, #0x14] + mov r2, r6 + mov r1, r5 + mov r3, r7 + ldr r4, [r4, #4] + bl ov45_02249460 + add r2, sp, #0x44 + mov r0, #0 + mov r3, r2 + mov r1, r0 + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + stmia r3!, {r0, r1} + str r0, [r3] + mov r1, #6 + mov r0, #0xa + str r1, [sp, #0x44] + mov r1, #0xb + str r0, [sp, #0x50] + str r1, [sp, #0x5c] + mov r0, sl + mov r1, #3 + str r5, [sp, #0x48] + str r4, [sp, #0x4c] + str r5, [sp, #0x54] + str r4, [sp, #0x60] + bl ov45_022496AC + movs r8, r0 + addeq sp, sp, #0x68 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, [r8] + cmp r0, #6 + bne _0224D044 + ldr r0, [sb, #0x20] + mov r1, #0x40 + ldr r7, [r0, #0x18] + mov r6, #0 + mov r0, r7 + bl strchr + cmp r0, #0 + orrne r6, r6, #2 + mov r0, r7 + mov r1, #0x2b + bl strchr + cmp r0, #0 + orrne r6, r6, #1 + mov r3, #1 + add r2, sp, #0x34 + mov r0, sl + mov r1, r8 + str r3, [sp, #0x34] + str r4, [sp, #0x38] + str r5, [sp, #0x3c] + str r6, [sp, #0x40] + bl ov45_02249A0C + add sp, sp, #0x68 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0224D044: + cmp r0, #0xa + bne _0224D0A4 + mov r0, #1 + str r5, [sp, #0x28] + str r6, [sp, #0x2c] + str r7, [sp, #0x30] + str r0, [sp, #0x24] + ldr r0, [r8, #0x18] + mov r1, #0 + str r0, [sp] + ldr r2, [r8, #0x20] + mov r0, #0x10 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r8, #0x10] + add r3, sp, #0x24 + mov r0, sl + mov r1, #0x15 + bl ov45_02244D30 + mov r0, #0 + add sp, sp, #0x68 + str r0, [r8, #0x10] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0224D0A4: + cmp r0, #0xb + addne sp, sp, #0x68 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, [r8, #0x10] + cmp r0, #0 + addeq sp, sp, #0x68 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, #1 + str r0, [sp, #0x10] + ldr r0, [r8, #8] + mov r1, #0 + str r0, [sp, #0x14] + str r5, [sp, #0x18] + str r6, [sp, #0x1c] + str r7, [sp, #0x20] + ldr r2, [r8, #0x18] + mov r0, #0x14 + str r2, [sp] + ldr r2, [r8, #0x20] + add r3, sp, #0x10 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r8, #0x10] + mov r0, sl + mov r1, #0x16 + bl ov45_02244D30 + add sp, sp, #0x68 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0224D118: .word ov45_0225687C +_0224D11C: .word ov45_022565D0 +_0224D120: .word ov45_02256140 +_0224D124: .word 0x00000AA6 + arm_func_end ov45_0224CF0C + + arm_func_start ov45_0224D128 +ov45_0224D128: ; 0x0224D128 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x3c + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #3 + beq _0224D158 + ldr r0, _0224D230 ; =ov45_02256848 + ldr r1, _0224D234 ; =ov45_022565D0 + ldr r2, _0224D238 ; =ov45_02256158 + ldr r3, _0224D23C ; =0x00000B0D + bl __msl_assertion_failed +_0224D158: + ldr r0, [r4, #0x24] + cmp r0, #3 + addne sp, sp, #0x3c + ldmneia sp!, {r4, r5, pc} + ldr r0, [r4, #0x20] + add r2, sp, #0x24 + ldr r4, [r0, #4] + mov lr, #0 + str lr, [r2, #4] + str lr, [r2, #0x10] + mov r0, r5 + str lr, [r2] + mov ip, #0xa + str lr, [r2, #0xc] + mov r3, #0xb + mov r1, #2 + str lr, [r2, #8] + str lr, [r2, #0x14] + str ip, [sp, #0x24] + str r4, [sp, #0x28] + str r3, [sp, #0x30] + str r4, [sp, #0x34] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, pc} + ldr r0, [r1] + cmp r0, #0xa + bne _0224D1F4 + mov r3, #0 + add r2, sp, #0x14 + mov r0, r5 + str r3, [sp, #0x14] + str r4, [sp, #0x18] + str r3, [sp, #0x1c] + str r3, [sp, #0x20] + bl ov45_02249A0C + add sp, sp, #0x3c + ldmia sp!, {r4, r5, pc} +_0224D1F4: + cmp r0, #0xb + addne sp, sp, #0x3c + ldmneia sp!, {r4, r5, pc} + mov r3, #0 + mov ip, #1 + add r2, sp, #0 + mov r0, r5 + str ip, [sp] + str r4, [sp, #4] + str r3, [sp, #8] + str r3, [sp, #0xc] + str r3, [sp, #0x10] + bl ov45_02249A0C + add sp, sp, #0x3c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224D230: .word ov45_02256848 +_0224D234: .word ov45_022565D0 +_0224D238: .word ov45_02256158 +_0224D23C: .word 0x00000B0D + arm_func_end ov45_0224D128 + + arm_func_start ov45_0224D240 +ov45_0224D240: ; 0x0224D240 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r4, r1 + bne _0224D264 + ldr r0, _0224D2F4 ; =ov45_02256894 + ldr r1, _0224D2F8 ; =ov45_022565D0 + ldr r2, _0224D2FC ; =ov45_02255E84 + ldr r3, _0224D300 ; =0x00000B48 + bl __msl_assertion_failed +_0224D264: + cmp r4, #0 + bne _0224D280 + ldr r0, _0224D304 ; =ov45_0225689C + ldr r1, _0224D2F8 ; =ov45_022565D0 + ldr r2, _0224D2FC ; =ov45_02255E84 + ldr r3, _0224D308 ; =0x00000B49 + bl __msl_assertion_failed +_0224D280: + cmp r7, #0 + beq _0224D294 + ldrsb r0, [r7] + cmp r0, #0x5c + beq _0224D29C +_0224D294: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0224D29C: + mov r6, #0 + b _0224D2A8 +_0224D2A4: + add r6, r6, #1 +_0224D2A8: + add r0, r7, r6 + ldrsb r0, [r0, #1] + cmp r0, #0 + cmpne r0, #0x5c + bne _0224D2A4 + add r0, r6, #1 + bl ov00_021EC3A8 + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r2, r6 + add r1, r7, #1 + bl memcpy + mov r0, #0 + strb r0, [r5, r6] + add r1, r6, #1 + mov r0, r5 + str r1, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0224D2F4: .word ov45_02256894 +_0224D2F8: .word ov45_022565D0 +_0224D2FC: .word ov45_02255E84 +_0224D300: .word 0x00000B48 +_0224D304: .word ov45_0225689C +_0224D308: .word 0x00000B49 + arm_func_end ov45_0224D240 + + arm_func_start ov45_0224D30C +ov45_0224D30C: ; 0x0224D30C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + mov r4, r1 + ldr r1, [r4, #0x24] + str r0, [sp, #0x10] + cmp r1, #4 + beq _0224D33C + ldr r0, _0224D4A8 ; =ov45_0225680C + ldr r1, _0224D4AC ; =ov45_022565D0 + ldr r2, _0224D4B0 ; =ov45_02256060 + ldr r3, _0224D4B4 ; =0x00000B76 + bl __msl_assertion_failed +_0224D33C: + ldr r0, [r4, #0x24] + cmp r0, #4 + addne sp, sp, #0x3c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #0x20] + add r2, sp, #0x30 + ldr r0, [r1, #4] + ldr r5, [r1, #8] + ldr r7, [r1, #0xc] + mov r4, #0 + str r0, [sp, #0x14] + str r4, [r2, #4] + ldr r0, [sp, #0x10] + str r4, [r2] + mov r3, #0xc + mov r1, #1 + str r4, [r2, #8] + str r3, [sp, #0x30] + str r5, [sp, #0x34] + bl ov45_022496AC + movs r6, r0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr fp, [r6, #0x1c] + ldr r8, [fp] + mov r0, r8, lsl #2 + bl ov00_021EC3A8 + movs sb, r0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r8, #0 + mov sl, r4 + ble _0224D404 + ldr r4, _0224D4B8 ; =ov45_02256708 + add r5, sp, #0x18 +_0224D3C8: + mov r0, r7 + mov r1, r5 + bl ov45_0224D240 + cmp r0, #0 + beq _0224D3EC + str r0, [sb, sl, lsl #2] + ldr r0, [sp, #0x18] + add r7, r7, r0 + b _0224D3F8 +_0224D3EC: + mov r0, r4 + bl ov00_021FF3D4 + str r0, [sb, sl, lsl #2] +_0224D3F8: + add sl, sl, #1 + cmp sl, r8 + blt _0224D3C8 +_0224D404: + mov r0, #1 + str r0, [sp, #0x1c] + ldr r0, [sp, #0x14] + str r8, [sp, #0x24] + str r0, [sp, #0x20] + ldr r0, [fp, #4] + str sb, [sp, #0x2c] + str r0, [sp, #0x28] + ldr r0, [fp, #8] + cmp r0, #0 + bne _0224D444 + ldr r0, [sp, #0x10] + add r2, sp, #0x1c + mov r1, r6 + bl ov45_02249A0C + b _0224D478 +_0224D444: + ldr r0, [r6, #0x18] + mov r1, #0 + str r0, [sp] + ldr r2, [r6, #0x20] + mov r0, #0x14 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r6, #0x10] + ldr r0, [sp, #0x10] + add r3, sp, #0x1c + mov r1, #0x1d + bl ov45_02244D30 +_0224D478: + cmp r8, #0 + mov r4, #0 + ble _0224D498 +_0224D484: + ldr r0, [sb, r4, lsl #2] + bl ov00_021EC3D8 + add r4, r4, #1 + cmp r4, r8 + blt _0224D484 +_0224D498: + mov r0, sb + bl ov00_021EC3D8 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224D4A8: .word ov45_0225680C +_0224D4AC: .word ov45_022565D0 +_0224D4B0: .word ov45_02256060 +_0224D4B4: .word 0x00000B76 +_0224D4B8: .word ov45_02256708 + arm_func_end ov45_0224D30C + + arm_func_start ov45_0224D4BC +ov45_0224D4BC: ; 0x0224D4BC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #4 + beq _0224D4EC + ldr r0, _0224D578 ; =ov45_0225680C + ldr r1, _0224D57C ; =ov45_022565D0 + ldr r2, _0224D580 ; =ov45_02256188 + ldr r3, _0224D584 ; =0x00000BCC + bl __msl_assertion_failed +_0224D4EC: + ldr r0, [r5, #0x24] + cmp r0, #4 + addne sp, sp, #0x20 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0x14 + ldr lr, [r0, #8] + mov ip, #0 + str ip, [r2, #4] + mov r0, r4 + str ip, [r2] + mov r3, #0xc + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x14] + str lr, [sp, #0x18] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r1, #0x1c] + mov ip, #0 + mov r0, #1 + str ip, [sp, #4] + str r0, [sp] + ldr r0, [r3] + add r2, sp, #0 + str r0, [sp, #8] + ldr r3, [r3, #4] + mov r0, r4 + str r3, [sp, #0xc] + str ip, [sp, #0x10] + bl ov45_02249A0C + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224D578: .word ov45_0225680C +_0224D57C: .word ov45_022565D0 +_0224D580: .word ov45_02256188 +_0224D584: .word 0x00000BCC + arm_func_end ov45_0224D4BC + + arm_func_start ov45_0224D588 +ov45_0224D588: ; 0x0224D588 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x54 + mov r4, r1 + ldr r1, [r4, #0x24] + str r0, [sp, #0x10] + cmp r1, #5 + beq _0224D5B8 + ldr r0, _0224D90C ; =ov45_022568A0 + ldr r1, _0224D910 ; =ov45_022565D0 + ldr r2, _0224D914 ; =ov45_022560C4 + ldr r3, _0224D918 ; =0x00000BFC + bl __msl_assertion_failed +_0224D5B8: + ldr r0, [r4, #0x24] + cmp r0, #5 + addne sp, sp, #0x54 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r3, [r4, #0x20] + ldr r1, _0224D91C ; =ov45_022568B8 + ldr r5, [r3, #0xc] + ldr r2, [r3, #8] + mov r0, r5 + ldr fp, [r3, #4] + str r2, [sp, #0x14] + ldr r8, [r3, #0x10] + bl strcmp + cmp r0, #0 + bne _0224D6EC + ldr r0, [sp, #0x10] + mov r1, fp + bl ov45_02247E98 + movs r7, r0 + ldrne r0, [r7, #0x28] + cmpne r0, #0 + addeq sp, sp, #0x54 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add sl, sp, #0x38 + mov r0, #0 + str r0, [sl] + str r0, [sl, #4] + str r0, [sl, #8] + str r0, [sl, #0xc] + ldr r0, [sp, #0x14] + str fp, [sp, #0x38] + str r0, [sp, #0x3c] + ldrsb r0, [r8] + cmp r0, #0 + addeq sp, sp, #0x54 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r6, #0 + mov r5, r6 + mov r4, #0x10 +_0224D654: + ldr r1, _0224D920 ; =ov45_022568C0 + mov r0, r8 + bl strstr + mov r8, r0 + b _0224D66C +_0224D668: + add r8, r8, #1 +_0224D66C: + ldrsb r1, [r8] + cmp r1, #0 + cmpne r1, #0x5c + bne _0224D668 + cmp r1, #0 + addeq sp, sp, #0x54 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + strb r6, [r8], #1 + mov r1, r8 + b _0224D698 +_0224D694: + add r8, r8, #1 +_0224D698: + ldrsb sb, [r8] + cmp sb, #0 + cmpne sb, #0x5c + bne _0224D694 + strb r5, [r8] + str r0, [sp, #0x40] + str r1, [sp, #0x44] + ldr r1, [r7, #0x2c] + ldr r0, [sp, #0x10] + stmia sp, {r1, r5, fp} + str r4, [sp, #0xc] + ldr r2, [r7, #0x28] + mov r1, #0x1c + mov r3, sl + bl ov45_02244D30 + strb sb, [r8] + ldrsb r0, [r8] + cmp r0, #0 + bne _0224D654 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224D6EC: + add r2, sp, #0x48 + mov r4, #0 + str r4, [r2, #4] + ldr r0, [sp, #0x10] + str r4, [r2] + mov r3, #0xd + mov r1, #1 + str r4, [r2, #8] + str r3, [sp, #0x48] + str r5, [sp, #0x4c] + bl ov45_022496AC + str r0, [sp, #0x18] + cmp r0, #0 + addeq sp, sp, #0x54 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r6, [r0, #0x1c] + ldr r5, [r6] + mov r0, r5, lsl #2 + bl ov00_021EC3A8 + movs r7, r0 + addeq sp, sp, #0x54 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r5, #0 + mov sb, r4 + ble _0224D77C + add r4, sp, #0x1c +_0224D754: + mov r0, r8 + mov r1, r4 + bl ov45_0224D240 + str r0, [r7, sb, lsl #2] + cmp r0, #0 + ldrne r0, [sp, #0x1c] + add sb, sb, #1 + addne r8, r8, r0 + cmp sb, r5 + blt _0224D754 +_0224D77C: + ldr r0, [r6, #0xc] + cmp r0, #0 + beq _0224D858 + add r1, sp, #0x1c + mov r0, r8 + bl ov45_0224D240 + movs sb, r0 + beq _0224D854 +_0224D79C: + ldr r0, [sp, #0x1c] + add r1, sp, #0x1c + add r8, r8, r0 + mov r0, r8 + bl ov45_0224D240 + movs r4, r0 + beq _0224D834 + add r0, r5, #1 + mov sl, r0, lsl #2 + ldr r1, [sp, #0x1c] + ldr r0, [r6, #4] + add r8, r8, r1 + mov r1, sl + bl ov00_021EC3BC + cmp r0, #0 + beq _0224D820 + str r0, [r6, #4] + mov r0, r7 + mov r1, sl + bl ov00_021EC3BC + cmp r0, #0 + beq _0224D80C + ldr r1, [r6, #4] + mov r7, r0 + str sb, [r1, r5, lsl #2] + str r4, [r0, r5, lsl #2] + add r5, r5, #1 + b _0224D840 +_0224D80C: + mov r0, sb + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + b _0224D840 +_0224D820: + mov r0, sb + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + b _0224D840 +_0224D834: + mov r0, sb + bl ov00_021EC3D8 + b _0224D854 +_0224D840: + mov r0, r8 + add r1, sp, #0x1c + bl ov45_0224D240 + movs sb, r0 + bne _0224D79C +_0224D854: + str r5, [r6] +_0224D858: + mov r0, #1 + str r0, [sp, #0x20] + ldr r0, [sp, #0x14] + str fp, [sp, #0x24] + str r5, [sp, #0x2c] + str r0, [sp, #0x28] + ldr r0, [r6, #4] + str r7, [sp, #0x34] + str r0, [sp, #0x30] + ldr r0, [r6, #8] + cmp r0, #0 + bne _0224D89C + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x18] + add r2, sp, #0x20 + bl ov45_02249A0C + b _0224D8DC +_0224D89C: + ldr r0, [sp, #0x18] + mov r1, #0 + ldr r0, [r0, #0x18] + add r3, sp, #0x20 + str r0, [sp] + ldr r0, [sp, #0x18] + ldr r2, [r0, #0x20] + mov r0, #0x18 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r0, [sp, #0x18] + mov r1, #0x1e + ldr r2, [r0, #0x10] + ldr r0, [sp, #0x10] + bl ov45_02244D30 +_0224D8DC: + cmp r5, #0 + mov r4, #0 + ble _0224D8FC +_0224D8E8: + ldr r0, [r7, r4, lsl #2] + bl ov00_021EC3D8 + add r4, r4, #1 + cmp r4, r5 + blt _0224D8E8 +_0224D8FC: + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224D90C: .word ov45_022568A0 +_0224D910: .word ov45_022565D0 +_0224D914: .word ov45_022560C4 +_0224D918: .word 0x00000BFC +_0224D91C: .word ov45_022568B8 +_0224D920: .word ov45_022568C0 + arm_func_end ov45_0224D588 + + arm_func_start ov45_0224D924 +ov45_0224D924: ; 0x0224D924 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #4 + beq _0224D954 + ldr r0, _0224D9E4 ; =ov45_0225680C + ldr r1, _0224D9E8 ; =ov45_022565D0 + ldr r2, _0224D9EC ; =ov45_022561E8 + mov r3, #0xcb0 + bl __msl_assertion_failed +_0224D954: + ldr r0, [r4, #0x24] + cmp r0, #4 + addne sp, sp, #0x24 + ldmneia sp!, {r4, r5, pc} + ldr r0, [r4, #0x20] + add r2, sp, #0x18 + ldmib r0, {r4, lr} + mov ip, #0 + str ip, [r2, #4] + mov r0, r5 + str ip, [r2] + mov r3, #0xd + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x18] + str lr, [sp, #0x1c] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, pc} + ldr r3, [r1, #0x1c] + mov ip, #0 + mov r0, #1 + str r4, [sp, #4] + str ip, [sp, #8] + str r0, [sp] + ldr r0, [r3] + add r2, sp, #0 + str r0, [sp, #0xc] + ldr r3, [r3, #4] + mov r0, r5 + str r3, [sp, #0x10] + str ip, [sp, #0x14] + bl ov45_02249A0C + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224D9E4: .word ov45_0225680C +_0224D9E8: .word ov45_022565D0 +_0224D9EC: .word ov45_022561E8 + arm_func_end ov45_0224D924 + + arm_func_start ov45_0224D9F0 +ov45_0224D9F0: ; 0x0224D9F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x58 + mov r4, r1 + ldr r1, [r4, #0x24] + str r0, [sp, #0x10] + cmp r1, #4 + beq _0224DA20 + ldr r0, _0224DE58 ; =ov45_0225680C + ldr r1, _0224DE5C ; =ov45_022565D0 + ldr r2, _0224DE60 ; =ov45_02256200 + ldr r3, _0224DE64 ; =0x00000CE1 + bl __msl_assertion_failed +_0224DA20: + ldr r0, [r4, #0x24] + cmp r0, #4 + addne sp, sp, #0x58 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [r4, #0x20] + ldr r1, _0224DE68 ; =ov45_022568B8 + ldmib r2, {r0, r5} + str r0, [sp, #0x18] + mov r0, r5 + ldr sb, [r2, #0xc] + bl strcmp + cmp r0, #0 + bne _0224DB58 + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x18] + bl ov45_02247E98 + movs r8, r0 + ldrne r0, [r8, #0x28] + cmpne r0, #0 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r7, sp, #0x3c + mov r1, #0 + str r1, [r7, #4] + ldr r0, [sp, #0x18] + str r1, [r7] + str r1, [r7, #8] + str r1, [r7, #0xc] + str r1, [sp, #0x40] + str r0, [sp, #0x3c] + ldrsb r0, [sb] + cmp r0, #0 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr fp, _0224DE6C ; =ov45_022568C0 + mov r6, r1 + mov r5, r1 + mov r4, #0x10 +_0224DAB8: + mov r0, sb + mov r1, fp + bl strstr + mov sb, r0 + b _0224DAD0 +_0224DACC: + add sb, sb, #1 +_0224DAD0: + ldrsb r1, [sb] + cmp r1, #0 + cmpne r1, #0x5c + bne _0224DACC + cmp r1, #0 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + strb r6, [sb], #1 + mov r1, sb + b _0224DAFC +_0224DAF8: + add sb, sb, #1 +_0224DAFC: + ldrsb sl, [sb] + cmp sl, #0 + cmpne sl, #0x5c + bne _0224DAF8 + strb r5, [sb] + str r0, [sp, #0x44] + str r1, [sp, #0x48] + ldr r1, [r8, #0x2c] + ldr r0, [sp, #0x10] + stmia sp, {r1, r5} + ldr r1, [sp, #0x18] + mov r3, r7 + str r1, [sp, #8] + str r4, [sp, #0xc] + ldr r2, [r8, #0x28] + mov r1, #0x1c + bl ov45_02244D30 + strb sl, [sb] + ldrsb r0, [sb] + cmp r0, #0 + bne _0224DAB8 + add sp, sp, #0x58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224DB58: + add r2, sp, #0x4c + mov r4, #0 + str r4, [r2, #4] + ldr r0, [sp, #0x10] + str r4, [r2] + mov r3, #0xe + mov r1, #1 + str r4, [r2, #8] + str r3, [sp, #0x4c] + str r5, [sp, #0x50] + bl ov45_022496AC + str r0, [sp, #0x1c] + cmp r0, #0 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, [r0, #0x1c] + ldr sl, [r4] + cmp sl, #0 + beq _0224DCD4 + mov r0, sl, lsl #2 + bl ov00_021EC3A8 + movs r5, r0 + addeq sp, sp, #0x58 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + mov r7, #0 + ble _0224DBF0 + add r6, sp, #0x20 +_0224DBC8: + mov r0, sb + mov r1, r6 + bl ov45_0224D240 + str r0, [r5, r7, lsl #2] + cmp r0, #0 + ldrne r0, [sp, #0x20] + add r7, r7, #1 + addne sb, sb, r0 + cmp r7, sl + blt _0224DBC8 +_0224DBF0: + ldr r0, [r4, #8] + cmp r0, #0 + beq _0224DDF0 + add r1, sp, #0x20 + mov r0, sb + bl ov45_0224D240 + movs r7, r0 + beq _0224DCCC + add fp, sp, #0x20 +_0224DC14: + ldr r0, [sp, #0x20] + mov r1, fp + add sb, sb, r0 + mov r0, sb + bl ov45_0224D240 + movs r6, r0 + beq _0224DCAC + add r0, sl, #1 + mov r8, r0, lsl #2 + ldr r2, [sp, #0x20] + ldr r0, [r4, #4] + mov r1, r8 + add sb, sb, r2 + bl ov00_021EC3BC + cmp r0, #0 + beq _0224DC98 + str r0, [r4, #4] + mov r0, r5 + mov r1, r8 + bl ov00_021EC3BC + cmp r0, #0 + beq _0224DC84 + ldr r1, [r4, #4] + mov r5, r0 + str r7, [r1, sl, lsl #2] + str r6, [r0, sl, lsl #2] + add sl, sl, #1 + b _0224DCB8 +_0224DC84: + mov r0, r7 + bl ov00_021EC3D8 + mov r0, r6 + bl ov00_021EC3D8 + b _0224DCB8 +_0224DC98: + mov r0, r7 + bl ov00_021EC3D8 + mov r0, r6 + bl ov00_021EC3D8 + b _0224DCB8 +_0224DCAC: + mov r0, r7 + bl ov00_021EC3D8 + b _0224DCCC +_0224DCB8: + mov r0, sb + mov r1, fp + bl ov45_0224D240 + movs r7, r0 + bne _0224DC14 +_0224DCCC: + str sl, [r4] + b _0224DDF0 +_0224DCD4: + mov r6, #0 + mov r5, r6 + mov sl, r6 +_0224DCE0: + add r1, sp, #0x20 + mov r0, sb + bl ov45_0224D240 + movs fp, r0 + beq _0224DDE8 + ldr r0, [sp, #0x20] + add r1, sp, #0x20 + add sb, sb, r0 + mov r0, sb + bl ov45_0224D240 + str r0, [sp, #0x14] + cmp r0, #0 + bne _0224DD20 + mov r0, fp + bl ov00_021EC3D8 + b _0224DDE8 +_0224DD20: + add r0, sl, #1 + mov r7, r0, lsl #2 + ldr r2, [sp, #0x20] + mov r0, r6 + mov r1, r7 + add sb, sb, r2 + bl ov00_021EC3BC + mov r1, r7 + mov r7, r0 + mov r0, r5 + bl ov00_021EC3BC + mov r8, r0 + cmp r7, #0 + cmpne r8, #0 + bne _0224DDCC + mov r0, fp + bl ov00_021EC3D8 + ldr r0, [sp, #0x14] + bl ov00_021EC3D8 + cmp sl, #0 + sub sl, sl, #1 + beq _0224DD94 +_0224DD78: + ldr r0, [r6, sl, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r5, sl, lsl #2] + bl ov00_021EC3D8 + cmp sl, #0 + sub sl, sl, #1 + bne _0224DD78 +_0224DD94: + cmp r7, #0 + beq _0224DDA8 + mov r0, r7 + bl ov00_021EC3D8 + b _0224DDB0 +_0224DDA8: + mov r0, r6 + bl ov00_021EC3D8 +_0224DDB0: + cmp r8, #0 + beq _0224DDC4 + mov r0, r8 + bl ov00_021EC3D8 + b _0224DDCC +_0224DDC4: + mov r0, r5 + bl ov00_021EC3D8 +_0224DDCC: + ldr r0, [sp, #0x14] + str fp, [r7, sl, lsl #2] + str r0, [r8, sl, lsl #2] + mov r6, r7 + mov r5, r8 + add sl, sl, #1 + b _0224DCE0 +_0224DDE8: + str sl, [r4] + str r6, [r4, #4] +_0224DDF0: + mov r0, #1 + str r0, [sp, #0x24] + ldr r0, [sp, #0x18] + mov r1, #0 + str r0, [sp, #0x28] + str r1, [sp, #0x2c] + str sl, [sp, #0x30] + ldr r3, [r4, #4] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x1c] + add r2, sp, #0x24 + str r3, [sp, #0x34] + str r5, [sp, #0x38] + bl ov45_02249A0C + cmp sl, #0 + mov r4, #0 + ble _0224DE48 +_0224DE34: + ldr r0, [r5, r4, lsl #2] + bl ov00_021EC3D8 + add r4, r4, #1 + cmp r4, sl + blt _0224DE34 +_0224DE48: + mov r0, r5 + bl ov00_021EC3D8 + add sp, sp, #0x58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224DE58: .word ov45_0225680C +_0224DE5C: .word ov45_022565D0 +_0224DE60: .word ov45_02256200 +_0224DE64: .word 0x00000CE1 +_0224DE68: .word ov45_022568B8 +_0224DE6C: .word ov45_022568C0 + arm_func_end ov45_0224D9F0 + + arm_func_start ov45_0224DE70 +ov45_0224DE70: ; 0x0224DE70 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x80 + movs r4, r0 + mov r5, r1 + bne _0224DE98 + ldr r0, _0224DF38 ; =ov45_022565C0 + ldr r1, _0224DF3C ; =ov45_022565D0 + ldr r2, _0224DF40 ; =ov45_02256074 + ldr r3, _0224DF44 ; =0x00000DBD + bl __msl_assertion_failed +_0224DE98: + ldr r0, [r5, #0x24] + cmp r0, #1 + bge _0224DEB8 + ldr r0, _0224DF48 ; =ov45_022568C4 + ldr r1, _0224DF3C ; =ov45_022565D0 + ldr r2, _0224DF40 ; =ov45_02256074 + ldr r3, _0224DF4C ; =0x00000DC3 + bl __msl_assertion_failed +_0224DEB8: + ldr r0, [r5, #0x24] + cmp r0, #1 + addlt sp, sp, #0x80 + ldmltia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #0x20] + sub r0, r0, #1 + ldr r0, [r1, r0, lsl #2] + mov r1, #0x40 + bl strchr + cmp r0, #0 + ldrne r1, [r4, #0x10] + cmpne r1, #0 + beq _0224DF28 + add r0, r0, #1 + bl ov00_021FFA44 + mov r1, r0 + ldr r3, [r4, #0x18] + ldr ip, [r4, #0x10] + add r2, sp, #0 + mov r0, r4 + blx ip + add r0, r4, #0x2c + add r1, sp, #0 + add r0, r0, #0x400 + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x4ab] +_0224DF28: + mov r0, r4 + bl ov45_0224F9A0 + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224DF38: .word ov45_022565C0 +_0224DF3C: .word ov45_022565D0 +_0224DF40: .word ov45_02256074 +_0224DF44: .word 0x00000DBD +_0224DF48: .word ov45_022568C4 +_0224DF4C: .word 0x00000DC3 + arm_func_end ov45_0224DE70 + + arm_func_start ov45_0224DF50 +ov45_0224DF50: ; 0x0224DF50 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + add r2, sp, #0 + mov r3, #0 + str r3, [r2] + mov r1, #1 + str r3, [r2, #4] + str r3, [r2, #8] + str r3, [sp] + bl ov45_022496AC + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, pc} + ldr r4, [r0, #0x1c] + cmp r4, #0 + bne _0224DFA4 + ldr r0, _0224DFB4 ; =ov45_022568DC + ldr r1, _0224DFB8 ; =ov45_022565D0 + ldr r2, _0224DFBC ; =ov45_022561A0 + ldr r3, _0224DFC0 ; =0x00000DEF + bl __msl_assertion_failed +_0224DFA4: + mov r0, #1 + str r0, [r4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224DFB4: .word ov45_022568DC +_0224DFB8: .word ov45_022565D0 +_0224DFBC: .word ov45_022561A0 +_0224DFC0: .word 0x00000DEF + arm_func_end ov45_0224DF50 + + arm_func_start ov45_0224DFC4 +ov45_0224DFC4: ; 0x0224DFC4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + mov sb, r1 + ldr r1, [sb, #0x24] + mov sl, r0 + cmp r1, #4 + beq _0224DFF4 + ldr r0, _0224E1F8 ; =ov45_0225680C + ldr r1, _0224E1FC ; =ov45_022565D0 + ldr r2, _0224E200 ; =ov45_02255FFC + ldr r3, _0224E204 ; =0x00000E01 + bl __msl_assertion_failed +_0224DFF4: + ldr r0, [sb, #0x24] + cmp r0, #4 + addne sp, sp, #0x34 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r2, sp, #0x28 + mov r3, #0 + str r3, [r2] + mov r0, sl + mov r1, #1 + str r3, [r2, #4] + str r3, [r2, #8] + str r3, [sp, #0x28] + bl ov45_022496AC + movs r7, r0 + ldrne r0, [r7, #0x10] + cmpne r0, #0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r8, [r7, #0x1c] + cmp r8, #0 + bne _0224E05C + ldr r0, _0224E208 ; =ov45_022568DC + ldr r1, _0224E1FC ; =ov45_022565D0 + ldr r2, _0224E200 ; =ov45_02255FFC + ldr r3, _0224E20C ; =0x00000E15 + bl __msl_assertion_failed +_0224E05C: + ldr r0, [sb, #0x20] + ldr r0, [r0, #4] + bl strlen + mov r4, r0 + add r0, r4, #1 + bl ov00_021EC3A8 + movs r6, r0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sb, #0x20] + add r2, r4, #1 + ldr r1, [r1, #4] + bl memcpy + ldr r0, [sb, #0x20] + ldr r0, [r0, #8] + bl atoi + ldr r1, [sb, #0x20] + mov r5, r0 + ldr r0, [r1, #0xc] + bl strlen + mov fp, r0 + add r0, fp, #1 + bl ov00_021EC3A8 + movs r4, r0 + bne _0224E0D0 + mov r0, r6 + bl ov00_021EC3D8 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224E0D0: + ldr r1, [sb, #0x20] + add r2, fp, #1 + ldr r1, [r1, #0xc] + bl memcpy + ldr sb, [r8, #4] + mov r0, #1 + str sb, [sp, #0x14] + str r6, [sp, #0x18] + str r4, [sp, #0x1c] + str r5, [sp, #0x20] + str r0, [sp, #0x10] + ldr r0, [r7, #0x18] + mov r1, #0 + str r0, [sp] + ldr r2, [r7, #0x20] + mov r0, #0x18 + str r2, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r7, #0x10] + add r3, sp, #0x10 + mov r0, sl + mov r1, #0xd + bl ov45_02244D30 + ldr r1, [r8, #4] + ldr r0, [r8, #8] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224E164 + mov r0, r6 + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224E164: + str r0, [r8, #8] + str r6, [r0, sb, lsl #2] + ldr r1, [r8, #4] + ldr r0, [r8, #0xc] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224E1A0 + mov r0, r6 + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224E1A0: + str r0, [r8, #0xc] + str r5, [r0, sb, lsl #2] + ldr r1, [r8, #4] + ldr r0, [r8, #0x10] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224E1DC + mov r0, r6 + bl ov00_021EC3D8 + mov r0, r4 + bl ov00_021EC3D8 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224E1DC: + str r0, [r8, #0x10] + str r4, [r0, sb, lsl #2] + ldr r0, [r8, #4] + add r0, r0, #1 + str r0, [r8, #4] + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0224E1F8: .word ov45_0225680C +_0224E1FC: .word ov45_022565D0 +_0224E200: .word ov45_02255FFC +_0224E204: .word 0x00000E01 +_0224E208: .word ov45_022568DC +_0224E20C: .word 0x00000E15 + arm_func_end ov45_0224DFC4 + + arm_func_start ov45_0224E210 +ov45_0224E210: ; 0x0224E210 + stmdb sp!, {r4, lr} + sub sp, sp, #0x20 + add r2, sp, #0x14 + mov r3, #0 + str r3, [r2] + mov r1, #1 + mov r4, r0 + str r3, [r2, #4] + str r3, [r2, #8] + str r3, [sp, #0x14] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r4, pc} + ldr ip, [r1, #0x1c] + mov r0, #1 + str r0, [sp] + ldr r0, [ip, #4] + add r2, sp, #0 + str r0, [sp, #4] + ldr r3, [ip, #8] + mov r0, r4 + str r3, [sp, #8] + ldr r3, [ip, #0xc] + str r3, [sp, #0x10] + ldr r3, [ip, #0x10] + str r3, [sp, #0xc] + bl ov45_02249A0C + add sp, sp, #0x20 + ldmia sp!, {r4, pc} + arm_func_end ov45_0224E210 + + arm_func_start ov45_0224E288 +ov45_0224E288: ; 0x0224E288 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x70 + mov r4, r1 + ldr r1, [r4, #0x24] + mov r6, r0 + cmp r1, #3 + bge _0224E2B8 + ldr r0, _0224E3F8 ; =ov45_022568EC + ldr r1, _0224E3FC ; =ov45_022565D0 + ldr r2, _0224E400 ; =ov45_022562D0 + ldr r3, _0224E404 ; =0x00000E93 + bl __msl_assertion_failed +_0224E2B8: + ldr r0, [r4, #0x24] + cmp r0, #3 + addlt sp, sp, #0x70 + ldmltia sp!, {r4, r5, r6, pc} + ldr r3, [r4, #0x20] + sub r2, r0, #3 + ldr r0, [r3, #8] + add r1, r3, #0xc + ldr r4, [r3, #4] + bl ov45_0224AD24 + movs r5, r0 + addeq sp, sp, #0x70 + ldmeqia sp!, {r4, r5, r6, pc} + add r3, sp, #0x50 + mov r0, #0 + mov r2, r3 + mov r1, r0 + stmia r2!, {r0, r1} + stmia r2!, {r0, r1} + stmia r2!, {r0, r1} + stmia r2, {r0, r1} + mov r0, r3 + mov r1, r5 + bl ov45_0224AFD8 + add r2, sp, #0x30 + mov r0, r6 + mov r1, r4 + bl ov45_02248288 + cmp r0, #0 + bne _0224E394 + add r2, sp, #0x50 + mov r0, r6 + mov r1, r4 + bl ov45_02248374 + mov r0, r6 + mov r1, r4 + bl ov45_02247E98 + cmp r0, #0 + ldrne r1, [r0, #0x18] + cmpne r1, #0 + beq _0224E394 + add r1, sp, #0x50 + str r1, [sp, #0x14] + str r4, [sp, #0x10] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r4} + mov r1, #8 + str r1, [sp, #0xc] + ldr r2, [r0, #0x18] + add r3, sp, #0x10 + mov r0, r6 + mov r1, #0xa + bl ov45_02244D30 +_0224E394: + add r2, sp, #0x24 + mov ip, #0 + str ip, [r2, #4] + mov r0, r6 + str ip, [r2] + mov r3, #5 + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x24] + str r4, [sp, #0x28] + bl ov45_022496AC + movs r1, r0 + beq _0224E3E8 + add r3, sp, #0x50 + mov ip, #1 + add r2, sp, #0x18 + mov r0, r6 + str ip, [sp, #0x18] + str r4, [sp, #0x1c] + str r3, [sp, #0x20] + bl ov45_02249A0C +_0224E3E8: + mov r0, r5 + bl ov00_021EC3D8 + add sp, sp, #0x70 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0224E3F8: .word ov45_022568EC +_0224E3FC: .word ov45_022565D0 +_0224E400: .word ov45_022562D0 +_0224E404: .word 0x00000E93 + arm_func_end ov45_0224E288 + + arm_func_start ov45_0224E408 +ov45_0224E408: ; 0x0224E408 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + movs r7, r0 + mov r6, r1 + bne _0224E430 + ldr r0, _0224E5BC ; =ov45_022565C0 + ldr r1, _0224E5C0 ; =ov45_022565D0 + ldr r2, _0224E5C4 ; =ov45_022561B8 + ldr r3, _0224E5C8 ; =0x00000ED5 + bl __msl_assertion_failed +_0224E430: + ldr r0, [r6, #0x24] + cmp r0, #6 + beq _0224E450 + ldr r0, _0224E5CC ; =ov45_02256904 + ldr r1, _0224E5C0 ; =ov45_022565D0 + ldr r2, _0224E5C4 ; =ov45_022561B8 + ldr r3, _0224E5D0 ; =0x00000EDB + bl __msl_assertion_failed +_0224E450: + ldr r0, [r6, #0x24] + cmp r0, #6 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #0x20] + add r2, sp, #0 + ldr ip, [r0, #4] + mov r5, #0 + str r5, [r2, #4] + str r5, [r2, #0x10] + mov r0, r7 + str r5, [r2] + mov r4, #4 + str r5, [r2, #0xc] + mov r3, #7 + mov r1, #2 + str r5, [r2, #8] + str r5, [r2, #0x14] + str r4, [sp] + str ip, [sp, #4] + str r3, [sp, #0xc] + str ip, [sp, #0x10] + bl ov45_022496AC + movs r4, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4] + cmp r0, #4 + bne _0224E51C + ldr r1, [r6, #0x20] + ldr r6, [r4, #0x1c] + ldr r0, [r1, #8] + ldr r4, [r1, #0x14] + ldr r5, [r1, #0xc] + bl ov00_021FF3D4 + cmp r0, #0 + addeq sp, sp, #0x18 + str r0, [r6] + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + bl ov00_021FF3D4 + cmp r0, #0 + addeq sp, sp, #0x18 + str r0, [r6, #4] + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r5 + bl ov00_021FF3D4 + add sp, sp, #0x18 + str r0, [r6, #8] + cmp r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0224E51C: + cmp r0, #7 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r5, [r4, #0x1c] + cmp r5, #0 + bne _0224E548 + ldr r0, _0224E5D4 ; =ov45_022568DC + ldr r1, _0224E5C0 ; =ov45_022565D0 + ldr r2, _0224E5C4 ; =ov45_022561B8 + ldr r3, _0224E5D8 ; =0x00000F1D + bl __msl_assertion_failed +_0224E548: + ldr r0, [r5] + cmp r0, #0 + bne _0224E568 + ldr r0, _0224E5DC ; =ov45_0225691C + ldr r1, _0224E5C0 ; =ov45_022565D0 + ldr r2, _0224E5C4 ; =ov45_022561B8 + ldr r3, _0224E5E0 ; =0x00000F1E + bl __msl_assertion_failed +_0224E568: + ldr r0, [r5] + ldrsb r0, [r0] + cmp r0, #0 + bne _0224E58C + ldr r0, _0224E5E4 ; =ov45_02256934 + ldr r1, _0224E5C0 ; =ov45_022565D0 + ldr r2, _0224E5C4 ; =ov45_022561B8 + ldr r3, _0224E5E0 ; =0x00000F1E + bl __msl_assertion_failed +_0224E58C: + ldr r0, [r6, #0x20] + ldr r2, [r5] + ldr r3, [r0, #0xc] + ldr r1, _0224E5E8 ; =ov45_02256950 + add r0, r7, #0x1c + bl ov45_02252F74 + mov r0, r7 + mov r1, r4 + mov r2, #0 + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0224E5BC: .word ov45_022565C0 +_0224E5C0: .word ov45_022565D0 +_0224E5C4: .word ov45_022561B8 +_0224E5C8: .word 0x00000ED5 +_0224E5CC: .word ov45_02256904 +_0224E5D0: .word 0x00000EDB +_0224E5D4: .word ov45_022568DC +_0224E5D8: .word 0x00000F1D +_0224E5DC: .word ov45_0225691C +_0224E5E0: .word 0x00000F1E +_0224E5E4: .word ov45_02256934 +_0224E5E8: .word ov45_02256950 + arm_func_end ov45_0224E408 + + arm_func_start ov45_0224E5EC +ov45_0224E5EC: ; 0x0224E5EC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r6, r1 + ldr r1, [r6, #0x24] + mov r7, r0 + cmp r1, #3 + beq _0224E61C + ldr r0, _0224E720 ; =ov45_02256848 + ldr r1, _0224E724 ; =ov45_022565D0 + ldr r2, _0224E728 ; =ov45_022562EC + ldr r3, _0224E72C ; =0x00000F34 + bl __msl_assertion_failed +_0224E61C: + ldr r0, [r6, #0x24] + cmp r0, #3 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r6, #0x20] + add r2, sp, #0 + ldr r5, [r0, #4] + mov r4, #0 + str r4, [r2, #4] + mov r0, r7 + str r4, [r2] + mov r3, #4 + mov r1, #1 + str r4, [r2, #8] + str r3, [sp] + str r5, [sp, #4] + bl ov45_022496AC + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r1, [r6, #0x20] + ldr r4, [r0, #0x1c] + ldr r0, [r1, #8] + ldr r1, _0224E730 ; =ov45_02256824 + bl strtok + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r5, _0224E730 ; =ov45_02256824 + mov r6, #0 +_0224E694: + ldrsb r1, [r0] + cmp r1, #0x2d + addeq r0, r0, #1 + ldrsb r1, [r0] + cmp r1, #0x40 + cmpne r1, #0x2b + addeq r0, r0, #1 + bl ov00_021FF3D4 + movs r7, r0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r1, [r4, #0xc] + ldr r0, [r4, #0x10] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + bne _0224E6EC + mov r0, r7 + bl ov00_021EC3D8 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} +_0224E6EC: + str r0, [r4, #0x10] + ldr r1, [r4, #0xc] + str r7, [r0, r1, lsl #2] + ldr r1, [r4, #0xc] + mov r0, r6 + add r2, r1, #1 + mov r1, r5 + str r2, [r4, #0xc] + bl strtok + cmp r0, #0 + bne _0224E694 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224E720: .word ov45_02256848 +_0224E724: .word ov45_022565D0 +_0224E728: .word ov45_022562EC +_0224E72C: .word 0x00000F34 +_0224E730: .word ov45_02256824 + arm_func_end ov45_0224E5EC + + arm_func_start ov45_0224E734 +ov45_0224E734: ; 0x0224E734 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224E764 + ldr r0, _0224E80C ; =ov45_02256848 + ldr r1, _0224E810 ; =ov45_022565D0 + ldr r2, _0224E814 ; =ov45_02256218 + ldr r3, _0224E818 ; =0x00000F76 + bl __msl_assertion_failed +_0224E764: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x28 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0x1c + ldr r5, [r0, #4] + mov ip, #0 + str ip, [r2, #4] + mov r0, r4 + str ip, [r2] + mov r3, #4 + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x1c] + str r5, [sp, #0x20] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x28 + ldmeqia sp!, {r3, r4, r5, pc} + ldr ip, [r1, #0x1c] + add r2, sp, #0 + ldr r0, [ip] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + str r5, [sp, #4] + str r0, [sp] + ldr r0, [ip] + str r0, [sp, #8] + ldr r3, [ip, #4] + mov r0, r4 + str r3, [sp, #0xc] + ldr r3, [ip, #8] + str r3, [sp, #0x10] + ldr r3, [ip, #0xc] + str r3, [sp, #0x14] + ldr r3, [ip, #0x10] + str r3, [sp, #0x18] + bl ov45_02249A0C + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224E80C: .word ov45_02256848 +_0224E810: .word ov45_022565D0 +_0224E814: .word ov45_02256218 +_0224E818: .word 0x00000F76 + arm_func_end ov45_0224E734 + + arm_func_start ov45_0224E81C +ov45_0224E81C: ; 0x0224E81C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #3 + bge _0224E84C + ldr r0, _0224E94C ; =ov45_02256964 + ldr r1, _0224E950 ; =ov45_022565D0 + ldr r2, _0224E954 ; =ov45_022560EC + ldr r3, _0224E958 ; =0x00000F9D + bl __msl_assertion_failed +_0224E84C: + ldr r0, [r4, #0x24] + cmp r0, #3 + addlt sp, sp, #0xc + ldmltia sp!, {r4, r5, r6, r7, pc} + ldr r0, [r4, #0x20] + add r2, sp, #0 + ldr r7, [r0, #4] + ldr r4, [r0, #8] + mov r6, #0 + str r6, [r2, #4] + mov r0, r5 + str r6, [r2] + mov r3, #8 + mov r1, #1 + str r6, [r2, #8] + str r3, [sp] + str r7, [sp, #4] + bl ov45_022496AC + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r5, [r0, #0x1c] + cmp r5, #0 + bne _0224E8C0 + ldr r0, _0224E95C ; =ov45_022568DC + ldr r1, _0224E950 ; =ov45_022565D0 + ldr r2, _0224E954 ; =ov45_022560EC + ldr r3, _0224E960 ; =0x00000FAF + bl __msl_assertion_failed +_0224E8C0: + ldr r0, [r5] + cmp r0, #0 + bge _0224E8E0 + ldr r0, _0224E964 ; =ov45_0225697C + ldr r1, _0224E950 ; =ov45_022565D0 + ldr r2, _0224E954 ; =ov45_022560EC + mov r3, #0xfb0 + bl __msl_assertion_failed +_0224E8E0: + ldr r1, [r5] + ldr r0, [r5, #4] + add r1, r1, #1 + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + str r0, [r5, #4] + mov r0, r4 + bl strlen + mov r7, r0 + add r0, r7, #1 + bl ov00_021EC3A8 + movs r6, r0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, pc} + mov r1, r4 + add r2, r7, #1 + bl memcpy + ldmia r5, {r0, r1} + str r6, [r1, r0, lsl #2] + ldr r0, [r5] + add r0, r0, #1 + str r0, [r5] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .balign 4, 0 +_0224E94C: .word ov45_02256964 +_0224E950: .word ov45_022565D0 +_0224E954: .word ov45_022560EC +_0224E958: .word 0x00000F9D +_0224E95C: .word ov45_022568DC +_0224E960: .word 0x00000FAF +_0224E964: .word ov45_0225697C + arm_func_end ov45_0224E81C + + arm_func_start ov45_0224E968 +ov45_0224E968: ; 0x0224E968 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x1c + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224E998 + ldr r0, _0224EA1C ; =ov45_02256848 + ldr r1, _0224EA20 ; =ov45_022565D0 + ldr r2, _0224EA24 ; =ov45_0225627C + ldr r3, _0224EA28 ; =0x00000FCF + bl __msl_assertion_failed +_0224E998: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x1c + ldmneia sp!, {r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0x10 + ldr r5, [r0, #4] + mov ip, #0 + str ip, [r2, #4] + mov r0, r4 + str ip, [r2] + mov r3, #8 + mov r1, #1 + str ip, [r2, #8] + str r3, [sp, #0x10] + str r5, [sp, #0x14] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, pc} + ldr r3, [r1, #0x1c] + mov r0, #1 + str r5, [sp, #4] + str r0, [sp] + ldr r0, [r3] + add r2, sp, #0 + str r0, [sp, #8] + ldr r3, [r3, #4] + mov r0, r4 + str r3, [sp, #0xc] + bl ov45_02249A0C + add sp, sp, #0x1c + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224EA1C: .word ov45_02256848 +_0224EA20: .word ov45_022565D0 +_0224EA24: .word ov45_0225627C +_0224EA28: .word 0x00000FCF + arm_func_end ov45_0224E968 + + arm_func_start ov45_0224EA2C +ov45_0224EA2C: ; 0x0224EA2C + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + mov r5, r1 + bne _0224EA50 + ldr r0, _0224EADC ; =ov45_022565C0 + ldr r1, _0224EAE0 ; =ov45_022565D0 + ldr r2, _0224EAE4 ; =ov45_02256114 + ldr r3, _0224EAE8 ; =0x00000FEC + bl __msl_assertion_failed +_0224EA50: + ldr r0, [r5, #0x24] + cmp r0, #2 + beq _0224EA70 + ldr r0, _0224EAEC ; =ov45_022566F0 + ldr r1, _0224EAE0 ; =ov45_022565D0 + ldr r2, _0224EAE4 ; =ov45_02256114 + ldr r3, _0224EAF0 ; =0x00000FF2 + bl __msl_assertion_failed +_0224EA70: + ldr r0, [r5, #0x24] + cmp r0, #2 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #0x20] + add r0, r4, #0x36c + ldr r5, [r1] + mov r1, r5 + bl strcmp + cmp r0, #0 + beq _0224EAB0 + mov r1, r5 + add r0, r4, #0x36c + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x3ab] +_0224EAB0: + mov r2, #0 + str r2, [r4, #4] + mov r1, #1 + str r1, [r4] + ldr ip, [r4, #0x14] + cmp ip, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r4, #0x18] + mov r0, r4 + blx ip + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224EADC: .word ov45_022565C0 +_0224EAE0: .word ov45_022565D0 +_0224EAE4: .word ov45_02256114 +_0224EAE8: .word 0x00000FEC +_0224EAEC: .word ov45_022566F0 +_0224EAF0: .word 0x00000FF2 + arm_func_end ov45_0224EA2C + + arm_func_start ov45_0224EAF4 +ov45_0224EAF4: ; 0x0224EAF4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r6, r0 + mov r4, r1 + bne _0224EB18 + ldr r0, _0224EBF8 ; =ov45_022565C0 + ldr r1, _0224EBFC ; =ov45_022565D0 + ldr r2, _0224EC00 ; =ov45_02256170 + ldr r3, _0224EC04 ; =0x00001015 + bl __msl_assertion_failed +_0224EB18: + ldr r0, [r4, #0x24] + cmp r0, #3 + beq _0224EB38 + ldr r0, _0224EC08 ; =ov45_02256848 + ldr r1, _0224EBFC ; =ov45_022565D0 + ldr r2, _0224EC00 ; =ov45_02256170 + ldr r3, _0224EC0C ; =0x0000101B + bl __msl_assertion_failed +_0224EB38: + ldr r0, [r4, #0x24] + cmp r0, #3 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r4, #0x20] + ldmib r0, {r4, r5} + mov r0, r4 + bl strlen + mov r8, r0 + mov r0, r5 + bl strlen + add r2, r6, #0x28 + mov r7, r0 + mov r0, r4 + mov r1, r8 + add r2, r2, #0x800 + bl ov45_0224966C + add r2, r6, #0x28 + mov r0, r5 + mov r1, r7 + add r2, r2, #0x800 + bl ov45_0224966C + add r2, r6, #0x42 + mov r0, r4 + mov r1, r8 + add r2, r2, #0x200 + bl ov45_02249554 + mov r0, r5 + mov r1, r7 + add r2, r6, #0x140 + bl ov45_02249554 + mov r0, #1 + str r0, [r6, #0x13c] + ldr r0, [r6, #0x8a8] + cmp r0, #0 + beq _0224EBD0 + mov r0, r6 + bl ov45_0224F9B8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224EBD0: + ldr r0, [r6, #0x10] + cmp r0, #0 + beq _0224EBEC + ldr r1, _0224EC10 ; =ov45_02256990 + add r0, r6, #0x1c + bl ov45_02252CB4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224EBEC: + mov r0, r6 + bl ov45_0224F9A0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224EBF8: .word ov45_022565C0 +_0224EBFC: .word ov45_022565D0 +_0224EC00: .word ov45_02256170 +_0224EC04: .word 0x00001015 +_0224EC08: .word ov45_02256848 +_0224EC0C: .word 0x0000101B +_0224EC10: .word ov45_02256990 + arm_func_end ov45_0224EAF4 + + arm_func_start ov45_0224EC14 +ov45_0224EC14: ; 0x0224EC14 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224EC44 + ldr r0, _0224ECBC ; =ov45_02256848 + ldr r1, _0224ECC0 ; =ov45_022565D0 + ldr r2, _0224ECC4 ; =ov45_02256024 + ldr r3, _0224ECC8 ; =0x0000104E + bl __msl_assertion_failed +_0224EC44: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x14 + ldmneia sp!, {r3, r4, r5, r6, pc} + ldr r0, [r5, #0x20] + ldr r0, [r0, #4] + bl atoi + ldr r1, [r5, #0x20] + mov r5, r0 + ldr r6, [r1, #8] + add r2, sp, #8 + mov ip, #0 + mov r0, r4 + str ip, [r2] + mov r3, #0x10 + mov r1, #1 + str ip, [r2, #4] + str ip, [r2, #8] + str r3, [sp, #8] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r2, sp, #0 + mov r0, r4 + str r5, [sp] + str r6, [sp, #4] + bl ov45_02249A0C + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + .balign 4, 0 +_0224ECBC: .word ov45_02256848 +_0224ECC0: .word ov45_022565D0 +_0224ECC4: .word ov45_02256024 +_0224ECC8: .word 0x0000104E + arm_func_end ov45_0224EC14 + + arm_func_start ov45_0224ECCC +ov45_0224ECCC: ; 0x0224ECCC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _0224ECF0 + ldr r0, _0224ED64 ; =ov45_022565C0 + ldr r1, _0224ED68 ; =ov45_022565D0 + ldr r2, _0224ED6C ; =ov45_02256038 + ldr r3, _0224ED70 ; =0x00001069 + bl __msl_assertion_failed +_0224ECF0: + ldr r0, [r4, #0x24] + cmp r0, #3 + bge _0224ED10 + ldr r0, _0224ED74 ; =ov45_02256964 + ldr r1, _0224ED68 ; =ov45_022565D0 + ldr r2, _0224ED6C ; =ov45_02256038 + ldr r3, _0224ED78 ; =0x0000106F + bl __msl_assertion_failed +_0224ED10: + ldr r0, [r4, #0x24] + cmp r0, #3 + ldmltia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x20] + ldr r0, [r0, #4] + bl atoi + str r0, [r5, #0x8ac] + ldr r0, [r4, #0x20] + ldr r0, [r0, #8] + bl atoi + str r0, [r5, #0x8b0] + ldr r0, [r5, #0x10] + cmp r0, #0 + beq _0224ED58 + ldr r1, _0224ED7C ; =ov45_02256990 + add r0, r5, #0x1c + bl ov45_02252CB4 + ldmia sp!, {r3, r4, r5, pc} +_0224ED58: + mov r0, r5 + bl ov45_0224F9A0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224ED64: .word ov45_022565C0 +_0224ED68: .word ov45_022565D0 +_0224ED6C: .word ov45_02256038 +_0224ED70: .word 0x00001069 +_0224ED74: .word ov45_02256964 +_0224ED78: .word 0x0000106F +_0224ED7C: .word ov45_02256990 + arm_func_end ov45_0224ECCC + + arm_func_start ov45_0224ED80 +ov45_0224ED80: ; 0x0224ED80 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x44 + mov r4, r1 + ldr r1, [r4, #0x24] + mov r5, r0 + cmp r1, #3 + beq _0224EDB0 + ldr r0, _0224EEAC ; =ov45_02256848 + ldr r1, _0224EEB0 ; =ov45_022565D0 + ldr r2, _0224EEB4 ; =ov45_022562B4 + ldr r3, _0224EEB8 ; =0x00001090 + bl __msl_assertion_failed +_0224EDB0: + ldr r0, [r4, #0x24] + cmp r0, #3 + addne sp, sp, #0x44 + ldmneia sp!, {r4, r5, pc} + ldr r0, [r4, #0x20] + add r2, sp, #0x2c + ldr r4, [r0, #4] + mov lr, #0 + str lr, [r2, #4] + mov r3, #5 + mov r0, r5 + str lr, [r2] + mov ip, #1 + mov r1, #2 + str lr, [r2, #8] + str ip, [sp, #0x2c] + str r4, [sp, #0x30] + str r3, [sp, #0x38] + str r4, [sp, #0x3c] + bl ov45_022496AC + movs r1, r0 + beq _0224EE68 + ldr r0, [r1] + cmp r0, #1 + bne _0224EE3C + mov ip, #0 + mov r3, #1 + add r2, sp, #0x20 + mov r0, r5 + str ip, [sp, #0x20] + str r3, [sp, #0x24] + str r4, [sp, #0x28] + bl ov45_02249A0C + add sp, sp, #0x44 + ldmia sp!, {r4, r5, pc} +_0224EE3C: + cmp r0, #5 + bne _0224EE68 + mov r3, #0 + add r2, sp, #0x14 + mov r0, r5 + str r3, [sp, #0x14] + str r4, [sp, #0x18] + str r3, [sp, #0x1c] + bl ov45_02249A0C + add sp, sp, #0x44 + ldmia sp!, {r4, r5, pc} +_0224EE68: + mov r0, r5 + mov r1, r4 + bl ov45_0224983C + movs r1, r0 + addeq sp, sp, #0x44 + ldmeqia sp!, {r4, r5, pc} + mov r3, #0 + add r2, sp, #0 + mov r0, r5 + str r3, [sp] + str r3, [sp, #4] + str r3, [sp, #8] + str r3, [sp, #0xc] + str r3, [sp, #0x10] + bl ov45_02249A0C + add sp, sp, #0x44 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224EEAC: .word ov45_02256848 +_0224EEB0: .word ov45_022565D0 +_0224EEB4: .word ov45_022562B4 +_0224EEB8: .word 0x00001090 + arm_func_end ov45_0224ED80 + + arm_func_start ov45_0224EEBC +ov45_0224EEBC: ; 0x0224EEBC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224EEEC + ldr r0, _0224EF60 ; =ov45_02256848 + ldr r1, _0224EF64 ; =ov45_022565D0 + ldr r2, _0224EF68 ; =ov45_02256394 + ldr r3, _0224EF6C ; =0x000010DE + bl __msl_assertion_failed +_0224EEEC: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #6 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224EF60: .word ov45_02256848 +_0224EF64: .word ov45_022565D0 +_0224EF68: .word ov45_02256394 +_0224EF6C: .word 0x000010DE + arm_func_end ov45_0224EEBC + + arm_func_start ov45_0224EF70 +ov45_0224EF70: ; 0x0224EF70 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224EFA0 + ldr r0, _0224F014 ; =ov45_02256848 + ldr r1, _0224F018 ; =ov45_022565D0 + ldr r2, _0224F01C ; =ov45_02256308 + ldr r3, _0224F020 ; =0x00001101 + bl __msl_assertion_failed +_0224EFA0: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #2 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224F014: .word ov45_02256848 +_0224F018: .word ov45_022565D0 +_0224F01C: .word ov45_02256308 +_0224F020: .word 0x00001101 + arm_func_end ov45_0224EF70 + + arm_func_start ov45_0224F024 +ov45_0224F024: ; 0x0224F024 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224F054 + ldr r0, _0224F0C8 ; =ov45_02256848 + ldr r1, _0224F0CC ; =ov45_022565D0 + ldr r2, _0224F0D0 ; =ov45_0225635C + ldr r3, _0224F0D4 ; =0x00001124 + bl __msl_assertion_failed +_0224F054: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #3 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224F0C8: .word ov45_02256848 +_0224F0CC: .word ov45_022565D0 +_0224F0D0: .word ov45_0225635C +_0224F0D4: .word 0x00001124 + arm_func_end ov45_0224F024 + + arm_func_start ov45_0224F0D8 +ov45_0224F0D8: ; 0x0224F0D8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224F108 + ldr r0, _0224F17C ; =ov45_02256848 + ldr r1, _0224F180 ; =ov45_022565D0 + ldr r2, _0224F184 ; =ov45_02256378 + ldr r3, _0224F188 ; =0x00001147 + bl __msl_assertion_failed +_0224F108: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #4 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224F17C: .word ov45_02256848 +_0224F180: .word ov45_022565D0 +_0224F184: .word ov45_02256378 +_0224F188: .word 0x00001147 + arm_func_end ov45_0224F0D8 + + arm_func_start ov45_0224F18C +ov45_0224F18C: ; 0x0224F18C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224F1BC + ldr r0, _0224F230 ; =ov45_02256848 + ldr r1, _0224F234 ; =ov45_022565D0 + ldr r2, _0224F238 ; =ov45_02256298 + ldr r3, _0224F23C ; =0x0000116A + bl __msl_assertion_failed +_0224F1BC: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #5 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224F230: .word ov45_02256848 +_0224F234: .word ov45_022565D0 +_0224F238: .word ov45_02256298 +_0224F23C: .word 0x0000116A + arm_func_end ov45_0224F18C + + arm_func_start ov45_0224F240 +ov45_0224F240: ; 0x0224F240 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, r1 + ldr r1, [r5, #0x24] + mov r4, r0 + cmp r1, #3 + beq _0224F270 + ldr r0, _0224F2E4 ; =ov45_02256848 + ldr r1, _0224F2E8 ; =ov45_022565D0 + ldr r2, _0224F2EC ; =ov45_02256230 + ldr r3, _0224F2F0 ; =0x0000118D + bl __msl_assertion_failed +_0224F270: + ldr r0, [r5, #0x24] + cmp r0, #3 + addne sp, sp, #0x18 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + add r2, sp, #0xc + ldr r5, [r0, #4] + mov r3, #0 + str r3, [r2, #4] + mov r0, r4 + str r3, [r2] + mov r1, #1 + str r3, [r2, #8] + str r1, [sp, #0xc] + str r5, [sp, #0x10] + bl ov45_022496AC + movs r1, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, pc} + mov ip, #0 + mov r3, #8 + add r2, sp, #0 + mov r0, r4 + str ip, [sp] + str r3, [sp, #4] + str r5, [sp, #8] + bl ov45_02249A0C + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0224F2E4: .word ov45_02256848 +_0224F2E8: .word ov45_022565D0 +_0224F2EC: .word ov45_02256230 +_0224F2F0: .word 0x0000118D + arm_func_end ov45_0224F240 + + arm_func_start ov45_0224F2F4 +ov45_0224F2F4: ; 0x0224F2F4 + bx lr + arm_func_end ov45_0224F2F4 + + arm_func_start ov45_0224F2F8 +ov45_0224F2F8: ; 0x0224F2F8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + movs r4, r0 + bne _0224F31C + ldr r0, _0224F34C ; =ov45_022565C0 + ldr r1, _0224F350 ; =ov45_022565D0 + ldr r2, _0224F354 ; =ov45_022563B0 + ldr r3, _0224F358 ; =0x000011B2 + bl __msl_assertion_failed +_0224F31C: + ldr r0, [r4, #4] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + mov r3, #0 + mov r0, r4 + add r2, r4, #0x36c + mov r1, #2 + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224F34C: .word ov45_022565C0 +_0224F350: .word ov45_022565D0 +_0224F354: .word ov45_022563B0 +_0224F358: .word 0x000011B2 + arm_func_end ov45_0224F2F8 + + arm_func_start ov45_0224F35C +ov45_0224F35C: ; 0x0224F35C + stmdb sp!, {r4, lr} + movs r4, r0 + bne _0224F37C + ldr r0, _0224F3B0 ; =ov45_022565C0 + ldr r1, _0224F3B4 ; =ov45_022565D0 + ldr r2, _0224F3B8 ; =ov45_02256248 + ldr r3, _0224F3BC ; =0x000011C2 + bl __msl_assertion_failed +_0224F37C: + ldr r0, [r4, #4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + str r1, [r4, #4] + ldr ip, [r4, #0x14] + cmp ip, #0 + ldmeqia sp!, {r4, pc} + ldr r3, [r4, #0x18] + mov r0, r4 + mov r2, #2 + blx ip + ldmia sp!, {r4, pc} + .balign 4, 0 +_0224F3B0: .word ov45_022565C0 +_0224F3B4: .word ov45_022565D0 +_0224F3B8: .word ov45_02256248 +_0224F3BC: .word 0x000011C2 + arm_func_end ov45_0224F35C + + arm_func_start ov45_0224F3C0 +ov45_0224F3C0: ; 0x0224F3C0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + movs r4, r0 + bne _0224F3E4 + ldr r0, _0224F414 ; =ov45_022565C0 + ldr r1, _0224F418 ; =ov45_022565D0 + ldr r2, _0224F41C ; =ov45_02256260 + ldr r3, _0224F420 ; =0x000011DB + bl __msl_assertion_failed +_0224F3E4: + ldr r0, [r4, #4] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r2, _0224F424 ; =ov45_02256708 + mov r3, #0 + mov r0, r4 + mov r1, #4 + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224F414: .word ov45_022565C0 +_0224F418: .word ov45_022565D0 +_0224F41C: .word ov45_02256260 +_0224F420: .word 0x000011DB +_0224F424: .word ov45_02256708 + arm_func_end ov45_0224F3C0 + + arm_func_start ov45_0224F428 +ov45_0224F428: ; 0x0224F428 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + movs r4, r0 + bne _0224F44C + ldr r0, _0224F47C ; =ov45_022565C0 + ldr r1, _0224F480 ; =ov45_022565D0 + ldr r2, _0224F484 ; =ov45_022563D0 + ldr r3, _0224F488 ; =0x000011EB + bl __msl_assertion_failed +_0224F44C: + ldr r0, [r4, #4] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + ldr r2, _0224F48C ; =ov45_02256708 + mov r3, #0 + mov r0, r4 + mov r1, #3 + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224F47C: .word ov45_022565C0 +_0224F480: .word ov45_022565D0 +_0224F484: .word ov45_022563D0 +_0224F488: .word 0x000011EB +_0224F48C: .word ov45_02256708 + arm_func_end ov45_0224F428 + + arm_func_start ov45_0224F490 +ov45_0224F490: ; 0x0224F490 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r4, r0 + mov r5, r1 + bne _0224F4B4 + ldr r0, _0224F5A4 ; =ov45_022565C0 + ldr r1, _0224F5A8 ; =ov45_022565D0 + ldr r2, _0224F5AC ; =ov45_022563F0 + mov r3, #0x1200 + bl __msl_assertion_failed +_0224F4B4: + ldr r0, [r5, #0x24] + cmp r0, #4 + beq _0224F4D4 + ldr r0, _0224F5B0 ; =ov45_0225680C + ldr r1, _0224F5A8 ; =ov45_022565D0 + ldr r2, _0224F5AC ; =ov45_022563F0 + ldr r3, _0224F5B4 ; =0x00001206 + bl __msl_assertion_failed +_0224F4D4: + ldr r0, [r5, #0x24] + cmp r0, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r5, #0x20] + ldr r0, [r0, #4] + bl atoi + ldr r2, [r5, #0x20] + ldr r1, [r4, #4] + ldr r5, [r2, #8] + mov r7, r0 + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r7, lsl #2 + bl ov00_021EC3A8 + movs r8, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r1, _0224F5B8 ; =ov45_02256998 + mov r0, r5 + bl strtok + mov sb, #0 + mov r6, sb + ldr r5, _0224F5B8 ; =ov45_02256998 + b _0224F550 +_0224F530: + bl ov00_021FF3D4 + str r0, [r8, sb, lsl #2] + cmp r0, #0 + beq _0224F560 + mov r0, r6 + mov r1, r5 + bl strtok + add sb, sb, #1 +_0224F550: + cmp sb, r7 + bge _0224F560 + cmp r0, #0 + bne _0224F530 +_0224F560: + mov r0, r4 + mov r3, sb + add r2, r4, #0x510 + mov r1, #5 + str r8, [sp] + bl ov45_02251B0C + cmp sb, #0 + mov r4, #0 + ble _0224F598 +_0224F584: + ldr r0, [r8, r4, lsl #2] + bl ov00_021EC3D8 + add r4, r4, #1 + cmp r4, sb + blt _0224F584 +_0224F598: + mov r0, r8 + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0224F5A4: .word ov45_022565C0 +_0224F5A8: .word ov45_022565D0 +_0224F5AC: .word ov45_022563F0 +_0224F5B0: .word ov45_0225680C +_0224F5B4: .word 0x00001206 +_0224F5B8: .word ov45_02256998 + arm_func_end ov45_0224F490 + + arm_func_start ov45_0224F5BC +ov45_0224F5BC: ; 0x0224F5BC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r5, r1 + mov r6, r0 + bne _0224F5E0 + ldr r0, _0224F648 ; =ov45_02256B84 + ldr r1, _0224F64C ; =ov45_02256B94 + ldr r2, _0224F650 ; =ov45_02256B24 + mov r3, #0x4f + bl __msl_assertion_failed +_0224F5E0: + ldr r7, _0224F654 ; =ov45_02255DA0 + mov r4, #0 + ldr r0, [r7] + cmp r0, #0 + ble _0224F640 + ldr r8, _0224F658 ; =ov45_02256410 +_0224F5F8: + ldr r0, [r5, #0x14] + ldr r1, [r8, r4, lsl #3] + bl strnicmp + cmp r0, #0 + bne _0224F630 + ldr r0, _0224F65C ; =ov45_02256410 + 4 + ldr r2, [r0, r4, lsl #3] + cmp r2, #0 + beq _0224F628 + mov r0, r6 + mov r1, r5 + blx r2 +_0224F628: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0224F630: + ldr r0, [r7] + add r4, r4, #1 + cmp r4, r0 + blt _0224F5F8 +_0224F640: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0224F648: .word ov45_02256B84 +_0224F64C: .word ov45_02256B94 +_0224F650: .word ov45_02256B24 +_0224F654: .word ov45_02255DA0 +_0224F658: .word ov45_02256410 +_0224F65C: .word ov45_02256410 + 4 + arm_func_end ov45_0224F5BC + + arm_func_start ov45_0224F660 +ov45_0224F660: ; 0x0224F660 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl ov45_0224A630 + cmp r0, #0 + bne _0224F68C + mov r0, r5 + mov r1, r4 + bl ov45_022474FC + cmp r0, #0 + beq _0224F694 +_0224F68C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_0224F694: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov45_0224F660 + + arm_func_start ov45_0224F69C +ov45_0224F69C: ; 0x0224F69C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + movs r4, r0 + mov r5, r1 + bne _0224F6C4 + ldr r0, _0224F764 ; =ov45_02256BA0 + ldr r1, _0224F768 ; =ov45_02256B94 + ldr r2, _0224F76C ; =ov45_02256A54 + mov r3, #0x73 + bl __msl_assertion_failed +_0224F6C4: + ldr r0, [r4, #8] + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, pc} + mov r1, #0 + str r1, [r4] + str r1, [r4, #4] + mov ip, #1 + str ip, [r4, #8] + ldr r0, [r4, #4] + cmp r0, #0 + beq _0224F71C + ldr ip, [r4, #0x14] + cmp ip, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, pc} + ldr r3, [r4, #0x18] + mov r0, r4 + mov r2, r1 + blx ip + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} +_0224F71C: + ldr r0, [r4, #0x7fc] + cmp r0, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, pc} + str r5, [sp, #0x10] + ldr r2, [r4, #0x808] + mov r0, #4 + str r2, [sp] + str r1, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r4, #0x7fc] + add r3, sp, #0x10 + mov r0, r4 + mov r1, ip + bl ov45_02244D30 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0224F764: .word ov45_02256BA0 +_0224F768: .word ov45_02256B94 +_0224F76C: .word ov45_02256A54 + arm_func_end ov45_0224F69C + + arm_func_start ov45_0224F770 +ov45_0224F770: ; 0x0224F770 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + movs r6, r0 + mov r5, r1 + bne _0224F798 + ldr r0, _0224F850 ; =ov45_02256BA0 + ldr r1, _0224F854 ; =ov45_02256B94 + ldr r2, _0224F858 ; =ov45_022569A0 + mov r3, #0x9a + bl __msl_assertion_failed +_0224F798: + ldr r0, [r6, #0x20] + cmp r0, #1 + bne _0224F834 + add r0, r6, #0x1c + bl ov45_02252AA0 + add r0, r6, #0x1c + bl ov45_02253B5C + movs r4, r0 + beq _0224F81C + mov sb, #0 + mov r8, #4 + add r7, sp, #0x10 +_0224F7C8: + ldr r0, [r6, #0x7f8] + cmp r0, #0 + beq _0224F800 + ldr r1, [r4] + mov r0, r6 + str r1, [sp, #0x10] + ldr r2, [r6, #0x808] + mov r1, sb + stmia sp, {r2, sb} + str sb, [sp, #8] + str r8, [sp, #0xc] + ldr r2, [r6, #0x7f8] + mov r3, r7 + bl ov45_02244D30 +_0224F800: + mov r0, r6 + mov r1, r4 + bl ov45_0224F5BC + add r0, r6, #0x1c + bl ov45_02253B5C + movs r4, r0 + bne _0224F7C8 +_0224F81C: + ldr r0, [r6, #0x20] + cmp r0, #2 + bne _0224F834 + ldr r1, _0224F85C ; =ov45_02256BB0 + mov r0, r6 + bl ov45_0224F69C +_0224F834: + mov r0, r6 + bl ov45_0224A578 + mov r0, r6 + mov r1, r5 + bl ov45_022471A0 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0224F850: .word ov45_02256BA0 +_0224F854: .word ov45_02256B94 +_0224F858: .word ov45_022569A0 +_0224F85C: .word ov45_02256BB0 + arm_func_end ov45_0224F770 + + arm_func_start ov45_0224F860 +ov45_0224F860: ; 0x0224F860 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + movs r4, r0 + bne _0224F884 + ldr r0, _0224F920 ; =ov45_02256BA0 + ldr r1, _0224F924 ; =ov45_02256B94 + ldr r2, _0224F928 ; =ov45_022569A8 + mov r3, #0xce + bl __msl_assertion_failed +_0224F884: + ldr r0, [r4, #0x8a8] + cmp r0, #0 + bne _0224F8C4 + add r0, r4, #0x36c + bl ov45_02251A8C + movs r1, r0 + beq _0224F8BC + mov r3, #0 + mov r0, r4 + add r2, r4, #0x36c + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0224F8BC: + add r2, r4, #0x36c + b _0224F90C +_0224F8C4: + cmp r0, #2 + ldreq r0, [r4, #0x4ac] + cmpeq r0, #0 + bne _0224F908 + add r0, r4, #0x4f0 + bl ov45_02251A8C + movs r1, r0 + beq _0224F900 + mov r3, #0 + mov r0, r4 + add r2, r4, #0x4f0 + str r3, [sp] + bl ov45_02251B0C + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_0224F900: + add r2, r4, #0x4f0 + b _0224F90C +_0224F908: + ldr r2, _0224F92C ; =ov45_02256BC0 +_0224F90C: + ldr r1, _0224F930 ; =ov45_02256BC4 + add r0, r4, #0x1c + bl ov45_02252F74 + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224F920: .word ov45_02256BA0 +_0224F924: .word ov45_02256B94 +_0224F928: .word ov45_022569A8 +_0224F92C: .word ov45_02256BC0 +_0224F930: .word ov45_02256BC4 + arm_func_end ov45_0224F860 + + arm_func_start ov45_0224F934 +ov45_0224F934: ; 0x0224F934 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + movs r4, r0 + bne _0224F958 + ldr r0, _0224F98C ; =ov45_02256BA0 + ldr r1, _0224F990 ; =ov45_02256B94 + ldr r2, _0224F994 ; =ov45_022569B4 + mov r3, #0x104 + bl __msl_assertion_failed +_0224F958: + add r0, r4, #0x374 + add r0, r0, #0x400 + add r2, r4, #0x2c + ldr r1, _0224F998 ; =ov45_02256BCC + ldr r3, _0224F99C ; =ov45_02256BE0 + str r0, [sp] + add ip, r4, #0x3ac + add r0, r4, #0x1c + add r2, r2, #0x400 + str ip, [sp, #4] + bl ov45_02252F74 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0224F98C: .word ov45_02256BA0 +_0224F990: .word ov45_02256B94 +_0224F994: .word ov45_022569B4 +_0224F998: .word ov45_02256BCC +_0224F99C: .word ov45_02256BE0 + arm_func_end ov45_0224F934 + + arm_func_start ov45_0224F9A0 +ov45_0224F9A0: ; 0x0224F9A0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ov45_0224F934 + mov r0, r4 + bl ov45_0224F860 + ldmia sp!, {r4, pc} + arm_func_end ov45_0224F9A0 + + arm_func_start ov45_0224F9B8 +ov45_0224F9B8: ; 0x0224F9B8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x2c + movs r4, r0 + bne _0224F9DC + ldr r0, _0224FA9C ; =ov45_02256BA0 + ldr r1, _0224FAA0 ; =ov45_02256B94 + ldr r2, _0224FAA4 ; =ov45_022569CC + mov r3, #0x118 + bl __msl_assertion_failed +_0224F9DC: + ldr r0, [r4, #0x8a8] + cmp r0, #3 + bne _0224FA04 + ldr r1, _0224FAA8 ; =ov45_02256BEC + add r0, r4, #0x1c + add r2, r4, #0x570 + add r3, r4, #0x670 + bl ov45_02252F74 + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} +_0224FA04: + add r0, r4, #0x550 + bl strlen + mov r1, r0 + add r2, sp, #8 + add r0, r4, #0x550 + bl ov00_021FF31C + ldr r0, [r4, #0x8a8] + cmp r0, #1 + bne _0224FA4C + add r0, sp, #8 + str r0, [sp] + ldr r1, _0224FAAC ; =ov45_02256C00 + ldr r2, [r4, #0x4ac] + add r0, r4, #0x1c + add r3, r4, #0x510 + bl ov45_02252F74 + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} +_0224FA4C: + cmp r0, #2 + bne _0224FA80 + add r0, r4, #0x4f0 + str r0, [sp] + add r0, r4, #0x4b0 + str r0, [sp, #4] + ldr r2, [r4, #0x4ac] + ldr r1, _0224FAB0 ; =ov45_02256C10 + add r3, sp, #8 + add r0, r4, #0x1c + bl ov45_02252F74 + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} +_0224FA80: + ldr r0, _0224FAB4 ; =ov45_02256C28 + ldr r1, _0224FAA0 ; =ov45_02256B94 + ldr r2, _0224FAA4 ; =ov45_022569CC + ldr r3, _0224FAB8 ; =0x0000013E + bl __msl_assertion_failed + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0224FA9C: .word ov45_02256BA0 +_0224FAA0: .word ov45_02256B94 +_0224FAA4: .word ov45_022569CC +_0224FAA8: .word ov45_02256BEC +_0224FAAC: .word ov45_02256C00 +_0224FAB0: .word ov45_02256C10 +_0224FAB4: .word ov45_02256C28 +_0224FAB8: .word 0x0000013E + arm_func_end ov45_0224F9B8 + + arm_func_start ov45_0224FABC +ov45_0224FABC: ; 0x0224FABC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov fp, r0 + movs r0, r1 + ldr r0, [sp, #0x38] + str r1, [sp] + str r0, [sp, #0x38] + ldr r0, [sp, #0x3c] + str r2, [sp, #4] + str r0, [sp, #0x3c] + ldr r0, [sp, #0x4c] + mov sl, r3 + str r0, [sp, #0x4c] + ldr r0, [sp, #0x50] + ldr sb, [sp, #0x40] + str r0, [sp, #0x50] + ldr r0, _02250244 ; =ov45_02256C2C + ldr r8, [sp, #0x44] + ldr r7, [sp, #0x48] + ldr r6, [sp, #0x54] + ldr r5, [sp, #0x58] + str r0, [sp, #8] + bne _0224FB2C + ldr r0, _02250248 ; =ov45_02256C30 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250254 ; =0x0000015B + bl __msl_assertion_failed +_0224FB2C: + ldr r0, [sp, #0x5c] + cmp r0, #0 + bne _0224FB4C + ldr r0, _02250258 ; =ov45_02256C48 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + mov r3, #0x15c + bl __msl_assertion_failed +_0224FB4C: + ldr r0, [sp, #0x68] + cmp r0, #0 + bne _0224FB6C + ldr r0, _0225025C ; =ov45_02256C5C + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250260 ; =0x0000015D + bl __msl_assertion_failed +_0224FB6C: + cmp fp, #0 + bne _0224FBF4 + cmp sl, #0 + bne _0224FB90 + ldr r0, _02250264 ; =ov45_02256C74 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250268 ; =0x00000163 + bl __msl_assertion_failed +_0224FB90: + ldrsb r0, [sl] + cmp r0, #0 + bne _0224FBB0 + ldr r0, _0225026C ; =ov45_02256C84 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250268 ; =0x00000163 + bl __msl_assertion_failed +_0224FBB0: + mov r0, sl + bl strlen + cmp r0, #0x40 + blo _0224FBD4 + ldr r0, _02250270 ; =ov45_02256C94 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250268 ; =0x00000163 + bl __msl_assertion_failed +_0224FBD4: + cmp sl, #0 + ldrnesb r0, [sl] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str sl, [sp, #8] + b _0224FE48 +_0224FBF4: + cmp fp, #1 + bne _0224FCB0 + ldr r0, [sp, #0x38] + cmp r0, #0 + bgt _0224FC1C + ldr r0, _02250274 ; =ov45_02256CAC + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250278 ; =0x0000016A + bl __msl_assertion_failed +_0224FC1C: + ldr r0, [sp, #0x38] + cmp r0, #0 + addle sp, sp, #0xc + movle r0, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r8, #0 + ldrnesb r0, [r8] + cmpne r0, #0 + bne _0224FC54 + ldr r0, _0225027C ; =ov45_02256CBC + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250280 ; =0x0000016D + bl __msl_assertion_failed +_0224FC54: + cmp r8, #0 + ldrnesb r0, [r8] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + bne _0224FC90 + ldr r0, _02250284 ; =ov45_02256CD8 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + mov r3, #0x170 + bl __msl_assertion_failed +_0224FC90: + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str r8, [sp, #8] + b _0224FE48 +_0224FCB0: + cmp fp, #2 + bne _0224FDB0 + ldr r0, [sp, #0x38] + cmp r0, #0 + bge _0224FCD8 + ldr r0, _02250288 ; =ov45_02256CF0 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _0225028C ; =0x00000177 + bl __msl_assertion_failed +_0224FCD8: + ldr r0, [sp, #0x38] + cmp r0, #0 + addlt sp, sp, #0xc + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x3c] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + bne _0224FD14 + ldr r0, _02250290 ; =ov45_02256D04 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _02250294 ; =0x0000017A + bl __msl_assertion_failed +_0224FD14: + ldr r0, [sp, #0x3c] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #0 + ldrnesb r0, [sb] + cmpne r0, #0 + bne _0224FD54 + ldr r0, _02250298 ; =ov45_02256D18 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _0225029C ; =0x0000017D + bl __msl_assertion_failed +_0224FD54: + cmp sb, #0 + ldrnesb r0, [sb] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + bne _0224FD90 + ldr r0, _02250284 ; =ov45_02256CD8 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + mov r3, #0x180 + bl __msl_assertion_failed +_0224FD90: + cmp r7, #0 + ldrnesb r0, [r7] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str sb, [sp, #8] + b _0224FE48 +_0224FDB0: + cmp fp, #3 + bne _0224FE48 + ldr r0, [sp, #0x4c] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + bne _0224FDE0 + ldr r0, _022502A0 ; =ov45_02256D38 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _022502A4 ; =0x00000187 + bl __msl_assertion_failed +_0224FDE0: + ldr r0, [sp, #0x4c] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x50] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + bne _0224FE24 + ldr r0, _022502A8 ; =ov45_02256D54 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _022502AC ; =0x0000018A + bl __msl_assertion_failed +_0224FE24: + ldr r0, [sp, #0x50] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _022502B0 ; =ov45_02256D7C + str r0, [sp, #8] +_0224FE48: + cmp fp, #0 + beq _0224FEC8 + cmp r6, #0 + ldrnesb r0, [r6] + cmpne r0, #0 + bne _0224FE74 + ldr r0, _022502B4 ; =ov45_02256D84 + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + ldr r3, _022502B8 ; =0x00000191 + bl __msl_assertion_failed +_0224FE74: + cmp r6, #0 + ldrnesb r0, [r6] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + bne _0224FEB0 + ldr r0, _022502BC ; =ov45_02256D9C + ldr r1, _0225024C ; =ov45_02256B94 + ldr r2, _02250250 ; =ov45_02256A08 + mov r3, #0x194 + bl __msl_assertion_failed +_0224FEB0: + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0224FEC8: + bl ov00_021FF3CC + ldr r0, _022502C0 ; =0x000008B4 + bl ov00_021EC3A8 + movs r4, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, #0 + ldr r2, _022502C0 ; =0x000008B4 + bl memset + str fp, [r4, #0x8a8] + cmp sl, #0 + beq _0224FF14 + mov r1, sl + add r0, r4, #0x36c + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x3ab] +_0224FF14: + ldr r1, [sp, #0x30] + cmp r1, #0 + beq _0224FF38 + add r0, r4, #0x2c + add r0, r0, #0x400 + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x4ab] +_0224FF38: + ldr r1, [sp, #0x34] + cmp r1, #0 + beq _0224FF58 + add r0, r4, #0x3ac + mov r2, #0x80 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x42b] +_0224FF58: + ldr r0, [sp, #0x38] + str r0, [r4, #0x4ac] + ldr r0, [sp, #0x3c] + cmp r0, #0 + beq _0224FF84 + mov r1, r0 + add r0, r4, #0x4b0 + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x4ef] +_0224FF84: + cmp sb, #0 + beq _0224FFA4 + mov r1, sb + add r0, r4, #0x4f0 + mov r2, #0x20 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x50f] +_0224FFA4: + cmp r8, #0 + beq _0224FFC4 + mov r1, r8 + add r0, r4, #0x510 + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x54f] +_0224FFC4: + cmp r7, #0 + beq _0224FFE4 + mov r1, r7 + add r0, r4, #0x550 + mov r2, #0x20 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x56f] +_0224FFE4: + ldr r0, [sp, #0x4c] + cmp r0, #0 + beq _02250008 + mov r1, r0 + add r0, r4, #0x570 + mov r2, #0x100 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x66f] +_02250008: + ldr r0, [sp, #0x50] + cmp r0, #0 + beq _0225002C + mov r1, r0 + add r0, r4, #0x670 + mov r2, #0x100 + bl strncpy + mov r0, #0 + strb r0, [r4, #0x76f] +_0225002C: + add r0, r4, #0x374 + ldr r1, [sp] + add r0, r0, #0x400 + mov r2, #0x80 + bl strncpy + mov r7, #0 + add r1, r4, #0x3f8 + ldr sb, [sp, #0x5c] + ldr r0, [sp, #4] + strb r7, [r4, #0x7f3] + str r0, [r4, #0x7f4] + add r8, r1, #0x400 + ldmia sb!, {r0, r1, r2, r3} + stmia r8!, {r0, r1, r2, r3} + ldr r1, [sb] + mov r0, #1 + str r1, [r8] + str r0, [r4, #0x81c] + str r0, [r4, #4] + mov r0, r4 + str r7, [r4, #0x824] + bl ov45_02247968 + cmp r0, #0 + mov r0, r4 + bne _022500A4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + add sp, sp, #0xc + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022500A4: + bl ov45_02244B9C + cmp r0, #0 + bne _022500D0 + mov r0, r4 + bl ov45_022479F0 + mov r0, r4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + add sp, sp, #0xc + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022500D0: + ldr r1, [sp, #8] + add r0, r4, #0x1c + bl ov45_02251EF0 + cmp r0, #0 + bne _0225010C + mov r0, r4 + bl ov45_02244BCC + mov r0, r4 + bl ov45_022479F0 + mov r0, r4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + add sp, sp, #0xc + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0225010C: + ldr r1, [sp] + ldr r2, [sp, #4] + add r0, r4, #0x1c + bl ov45_02251F6C + cmp r0, #0 + bne _02250154 + add r0, r4, #0x1c + bl ov45_022522B4 + mov r0, r4 + bl ov45_02244BCC + mov r0, r4 + bl ov45_022479F0 + mov r0, r4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + add sp, sp, #0xc + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02250154: + ldr r1, [sp, #0x60] + ldr r0, [sp, #0x64] + str r1, [r4, #0xc] + str r0, [r4, #0x10] + ldr r1, [sp, #0x68] + ldr r0, [sp, #0x6c] + str r1, [r4, #0x14] + str r0, [r4, #0x18] + cmp r6, #0 + ldrnesb r0, [r6] + cmpne r0, #0 + cmpne r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + beq _022501C8 + add r0, r4, #0x28 + mov r1, r5 + add r0, r0, #0x800 + mov r2, #0x80 + bl strncpy + mov r1, r7 + strb r1, [r4, #0x8a7] + ldr r0, _022502C4 ; =ov45_0225699C + ldr r1, _022502C8 ; =ov45_02256DB8 + ldr r2, [r0] + mov r3, r6 + add r0, r4, #0x1c + bl ov45_02252F74 + b _022501EC +_022501C8: + ldr r0, [r4, #0x10] + cmp r0, #0 + beq _022501E4 + ldr r1, _022502CC ; =ov45_02256DC8 + add r0, r4, #0x1c + bl ov45_02252CB4 + b _022501EC +_022501E4: + mov r0, r4 + bl ov45_0224F9A0 +_022501EC: + ldr r0, [sp, #0x70] + cmp r0, #0 + beq _02250238 + mov r6, #0 + mov r5, #0xa +_02250200: + mov r0, r4 + mov r1, r6 + bl ov45_0224F770 + mov r0, r5 + bl ov00_021FF3C0 + ldr r0, [r4, #4] + cmp r0, #0 + bne _02250200 + ldr r0, [r4] + cmp r0, #0 + bne _02250238 + mov r0, r4 + bl ov45_022504E0 + mov r4, #0 +_02250238: + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02250244: .word ov45_02256C2C +_02250248: .word ov45_02256C30 +_0225024C: .word ov45_02256B94 +_02250250: .word ov45_02256A08 +_02250254: .word 0x0000015B +_02250258: .word ov45_02256C48 +_0225025C: .word ov45_02256C5C +_02250260: .word 0x0000015D +_02250264: .word ov45_02256C74 +_02250268: .word 0x00000163 +_0225026C: .word ov45_02256C84 +_02250270: .word ov45_02256C94 +_02250274: .word ov45_02256CAC +_02250278: .word 0x0000016A +_0225027C: .word ov45_02256CBC +_02250280: .word 0x0000016D +_02250284: .word ov45_02256CD8 +_02250288: .word ov45_02256CF0 +_0225028C: .word 0x00000177 +_02250290: .word ov45_02256D04 +_02250294: .word 0x0000017A +_02250298: .word ov45_02256D18 +_0225029C: .word 0x0000017D +_022502A0: .word ov45_02256D38 +_022502A4: .word 0x00000187 +_022502A8: .word ov45_02256D54 +_022502AC: .word 0x0000018A +_022502B0: .word ov45_02256D7C +_022502B4: .word ov45_02256D84 +_022502B8: .word 0x00000191 +_022502BC: .word ov45_02256D9C +_022502C0: .word 0x000008B4 +_022502C4: .word ov45_0225699C +_022502C8: .word ov45_02256DB8 +_022502CC: .word ov45_02256DC8 + arm_func_end ov45_0224FABC + + arm_func_start ov45_022502D0 +ov45_022502D0: ; 0x022502D0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x44 + mov ip, r0 + mov r0, #0 + stmia sp, {r0, r3} + str r0, [sp, #8] + str r0, [sp, #0xc] + str r0, [sp, #0x10] + str r0, [sp, #0x14] + str r0, [sp, #0x18] + str r0, [sp, #0x1c] + ldr lr, [sp, #0x50] + str r0, [sp, #0x20] + str lr, [sp, #0x24] + ldr r3, [sp, #0x54] + mov r4, r1 + str r3, [sp, #0x28] + ldr lr, [sp, #0x58] + mov r3, r2 + str lr, [sp, #0x2c] + ldr r2, [sp, #0x5c] + ldr r1, [sp, #0x60] + str r2, [sp, #0x30] + str r1, [sp, #0x34] + ldr r2, [sp, #0x64] + ldr r1, [sp, #0x68] + str r2, [sp, #0x38] + str r1, [sp, #0x3c] + ldr lr, [sp, #0x6c] + mov r1, ip + mov r2, r4 + str lr, [sp, #0x40] + bl ov45_0224FABC + add sp, sp, #0x44 + ldmia sp!, {r3, r4, pc} + arm_func_end ov45_022502D0 + + arm_func_start ov45_0225035C +ov45_0225035C: ; 0x0225035C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02250380 + ldr r0, _02250410 ; =ov45_02256BA0 + ldr r1, _02250414 ; =ov45_02256B94 + ldr r2, _02250418 ; =ov45_02256A68 + ldr r3, _0225041C ; =0x00000385 + bl __msl_assertion_failed +_02250380: + ldr r0, [r5] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + bne _022503BC + mov r1, #0 + str r1, [r5, #4] + ldr ip, [r5, #0x14] + cmp ip, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r5, #0x18] + mov r0, r5 + mov r2, #1 + blx ip + ldmia sp!, {r3, r4, r5, pc} +_022503BC: + mov r1, r4 + add r0, r5, #0x36c + mov r2, #0x40 + bl strncpy + mov r1, #0 + mov r0, r4 + strb r1, [r5, #0x3ab] + bl ov45_02251A8C + movs r1, r0 + beq _022503FC + mov r3, #0 + mov r0, r5 + mov r2, r4 + str r3, [sp] + bl ov45_02251B0C + ldmia sp!, {r3, r4, r5, pc} +_022503FC: + ldr r1, _02250420 ; =ov45_02256DD0 + mov r2, r4 + add r0, r5, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02250410: .word ov45_02256BA0 +_02250414: .word ov45_02256B94 +_02250418: .word ov45_02256A68 +_0225041C: .word 0x00000385 +_02250420: .word ov45_02256DD0 + arm_func_end ov45_0225035C + + arm_func_start ov45_02250424 +ov45_02250424: ; 0x02250424 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _02250450 + ldr r0, _022504C8 ; =ov45_02256BA0 + ldr r1, _022504CC ; =ov45_02256B94 + ldr r2, _022504D0 ; =ov45_02256B3C + ldr r3, _022504D4 ; =0x000003BD + bl __msl_assertion_failed +_02250450: + ldr r0, [r7] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + bne _0225048C + mov r1, #0 + str r1, [r7, #4] + ldr ip, [r7, #0x14] + cmp ip, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r3, [r7, #0x18] + mov r0, r7 + mov r2, #1 + blx ip + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0225048C: + cmp r4, #0 + ldreq r4, _022504D8 ; =ov45_02256C2C + ldr r1, _022504DC ; =ov45_02256DDC + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + str r4, [sp] + bl ov45_02252F74 + mov r1, r5 + add r0, r7, #0x510 + mov r2, #0x40 + bl strncpy + mov r0, #0 + strb r0, [r7, #0x54f] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022504C8: .word ov45_02256BA0 +_022504CC: .word ov45_02256B94 +_022504D0: .word ov45_02256B3C +_022504D4: .word 0x000003BD +_022504D8: .word ov45_02256C2C +_022504DC: .word ov45_02256DDC + arm_func_end ov45_02250424 + + arm_func_start ov45_022504E0 +ov45_022504E0: ; 0x022504E0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02250500 + ldr r0, _02250578 ; =ov45_02256BA0 + ldr r1, _0225057C ; =ov45_02256B94 + ldr r2, _02250580 ; =ov45_022569E8 + ldr r3, _02250584 ; =0x000003EF + bl __msl_assertion_failed +_02250500: + mov r0, r4 + bl ov45_0224A6B4 + ldr r0, [r4, #8] + cmp r0, #0 + bne _02250530 + ldr r3, [r4, #0x7fc] + cmp r3, #0 + beq _02250530 + ldr r2, [r4, #0x808] + ldr r1, _02250588 ; =ov45_02256C2C + mov r0, r4 + blx r3 +_02250530: + ldr r0, [r4] + cmp r0, #0 + beq _02250550 + ldr r1, _0225058C ; =ov45_02256DF4 + add r0, r4, #0x1c + bl ov45_02252CB4 + add r0, r4, #0x1c + bl ov45_02252AA0 +_02250550: + mov r0, r4 + bl ov45_022479F0 + mov r0, r4 + bl ov45_02244BCC + add r0, r4, #0x1c + bl ov45_022522B4 + mov r0, r4 + bl ov00_021EC3D8 + bl ov00_021FF3D0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02250578: .word ov45_02256BA0 +_0225057C: .word ov45_02256B94 +_02250580: .word ov45_022569E8 +_02250584: .word 0x000003EF +_02250588: .word ov45_02256C2C +_0225058C: .word ov45_02256DF4 + arm_func_end ov45_022504E0 + + arm_func_start ov45_02250590 +ov45_02250590: ; 0x02250590 + ldr ip, _0225059C ; =ov45_0224F770 + mov r1, #0 + bx ip + .balign 4, 0 +_0225059C: .word ov45_0224F770 + arm_func_end ov45_02250590 + + arm_func_start ov45_022505A0 +ov45_022505A0: ; 0x022505A0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r4, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _022505CC + ldr r0, _02250668 ; =ov45_02256BA0 + ldr r1, _0225066C ; =ov45_02256B94 + ldr r2, _02250670 ; =ov45_02256A18 + ldr r3, _02250674 ; =0x0000058E + bl __msl_assertion_failed +_022505CC: + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0 + cmpeq r6, #0 + bne _022505FC + ldr r0, _02250678 ; =ov45_02256E64 + ldr r1, _0225066C ; =ov45_02256B94 + ldr r2, _02250670 ; =ov45_02256A18 + ldr r3, _0225067C ; =0x00000591 + bl __msl_assertion_failed +_022505FC: + cmp r7, #0 + ldreq r7, _02250680 ; =ov45_02256C2C + ldr r1, _02250684 ; =ov45_02256E94 + mov r2, r7 + add r0, r4, #0x1c + bl ov45_02252F74 + ldr r3, [sp, #0x18] + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl ov45_0224A7F0 + ldr r1, [sp, #0x1c] + mov r6, r0 + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r5, #0xa +_0225063C: + mov r0, r4 + mov r1, r6 + bl ov45_0224F770 + mov r0, r5 + bl ov00_021FF3C0 + mov r0, r4 + mov r1, r6 + bl ov45_0224F660 + cmp r0, #0 + bne _0225063C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02250668: .word ov45_02256BA0 +_0225066C: .word ov45_02256B94 +_02250670: .word ov45_02256A18 +_02250674: .word 0x0000058E +_02250678: .word ov45_02256E64 +_0225067C: .word 0x00000591 +_02250680: .word ov45_02256C2C +_02250684: .word ov45_02256E94 + arm_func_end ov45_022505A0 + + arm_func_start ov45_02250688 +ov45_02250688: ; 0x02250688 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + movs r4, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _022506B8 + ldr r0, _022507AC ; =ov45_02256BA0 + ldr r1, _022507B0 ; =ov45_02256B94 + ldr r2, _022507B4 ; =ov45_02256A2C + ldr r3, _022507B8 ; =0x000005B3 + bl __msl_assertion_failed +_022506B8: + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r7, #0 + bne _022506E8 + ldr r0, _022507BC ; =ov45_02256E9C + ldr r1, _022507B0 ; =ov45_02256B94 + ldr r2, _022507B4 ; =ov45_02256A2C + ldr r3, _022507C0 ; =0x000005B6 + bl __msl_assertion_failed +_022506E8: + ldrsb r0, [r7] + cmp r0, #0 + bne _02250708 + ldr r0, _022507C4 ; =ov45_02256EAC + ldr r1, _022507B0 ; =ov45_02256B94 + ldr r2, _022507B4 ; =ov45_02256A2C + ldr r3, _022507C0 ; =0x000005B6 + bl __msl_assertion_failed +_02250708: + cmp r5, #0 + bne _02250724 + ldr r0, _022507C8 ; =ov45_02256C48 + ldr r1, _022507B0 ; =ov45_02256B94 + ldr r2, _022507B4 ; =ov45_02256A2C + ldr r3, _022507CC ; =0x000005B7 + bl __msl_assertion_failed +_02250724: + cmp r6, #0 + ldreq r6, _022507D0 ; =ov45_02256C2C + ldr r1, _022507D4 ; =ov45_02256EC0 + mov r2, r7 + mov r3, r6 + add r0, r4, #0x1c + bl ov45_02252F74 + ldr r2, [sp, #0x20] + ldr r3, [sp, #0x24] + mov r0, r4 + mov r1, r7 + stmia sp, {r5, r6} + bl ov45_0224A874 + mov r6, r0 + mov r0, r4 + mov r1, r7 + bl ov45_02247A44 + ldr r0, [sp, #0x28] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r5, #0xa +_0225077C: + mov r0, r4 + mov r1, r6 + bl ov45_0224F770 + mov r0, r5 + bl ov00_021FF3C0 + mov r0, r4 + mov r1, r6 + bl ov45_0224F660 + cmp r0, #0 + bne _0225077C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022507AC: .word ov45_02256BA0 +_022507B0: .word ov45_02256B94 +_022507B4: .word ov45_02256A2C +_022507B8: .word 0x000005B3 +_022507BC: .word ov45_02256E9C +_022507C0: .word 0x000005B6 +_022507C4: .word ov45_02256EAC +_022507C8: .word ov45_02256C48 +_022507CC: .word 0x000005B7 +_022507D0: .word ov45_02256C2C +_022507D4: .word ov45_02256EC0 + arm_func_end ov45_02250688 + + arm_func_start ov45_022507D8 +ov45_022507D8: ; 0x022507D8 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02250800 + ldr r0, _02250878 ; =ov45_02256BA0 + ldr r1, _0225087C ; =ov45_02256B94 + ldr r2, _02250880 ; =ov45_02256A40 + ldr r3, _02250884 ; =0x000005DB + bl __msl_assertion_failed +_02250800: + cmp r6, #0 + ldrne r0, [r6] + cmpne r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r5, #0 + bne _0225082C + ldr r0, _02250888 ; =ov45_02256E9C + ldr r1, _0225087C ; =ov45_02256B94 + ldr r2, _02250880 ; =ov45_02256A40 + ldr r3, _0225088C ; =0x000005DE + bl __msl_assertion_failed +_0225082C: + ldrsb r0, [r5] + cmp r0, #0 + bne _0225084C + ldr r0, _02250890 ; =ov45_02256EAC + ldr r1, _0225087C ; =ov45_02256B94 + ldr r2, _02250880 ; =ov45_02256A40 + ldr r3, _0225088C ; =0x000005DE + bl __msl_assertion_failed +_0225084C: + cmp r4, #0 + ldreq r4, _02250894 ; =ov45_02256C2C + ldr r1, _02250898 ; =ov45_02256ECC + mov r2, r5 + mov r3, r4 + add r0, r6, #0x1c + bl ov45_02252F74 + mov r0, r6 + mov r1, r5 + bl ov45_02247D84 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02250878: .word ov45_02256BA0 +_0225087C: .word ov45_02256B94 +_02250880: .word ov45_02256A40 +_02250884: .word 0x000005DB +_02250888: .word ov45_02256E9C +_0225088C: .word 0x000005DE +_02250890: .word ov45_02256EAC +_02250894: .word ov45_02256C2C +_02250898: .word ov45_02256ECC + arm_func_end ov45_022507D8 + + arm_func_start ov45_0225089C +ov45_0225089C: ; 0x0225089C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x20 + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _022508CC + ldr r0, _02250A4C ; =ov45_02256BA0 + ldr r1, _02250A50 ; =ov45_02256B94 + ldr r2, _02250A54 ; =ov45_02256B6C + ldr r3, _02250A58 ; =0x000005FC + bl __msl_assertion_failed +_022508CC: + cmp r7, #0 + ldrne r0, [r7] + cmpne r0, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + bne _022508FC + ldr r0, _02250A5C ; =ov45_02256E9C + ldr r1, _02250A50 ; =ov45_02256B94 + ldr r2, _02250A54 ; =ov45_02256B6C + ldr r3, _02250A60 ; =0x000005FF + bl __msl_assertion_failed +_022508FC: + ldrsb r0, [r6] + cmp r0, #0 + bne _0225091C + ldr r0, _02250A64 ; =ov45_02256EAC + ldr r1, _02250A50 ; =ov45_02256B94 + ldr r2, _02250A54 ; =ov45_02256B6C + ldr r3, _02250A60 ; =0x000005FF + bl __msl_assertion_failed +_0225091C: + cmp r4, #4 + bls _02250938 + ldr r0, _02250A68 ; =ov45_02256ED8 + ldr r1, _02250A50 ; =ov45_02256B94 + ldr r2, _02250A54 ; =ov45_02256B6C + mov r3, #0x600 + bl __msl_assertion_failed +_02250938: + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + bne _0225096C + ldr r1, _02250A6C ; =ov45_02256F50 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + b _022509EC +_0225096C: + cmp r4, #1 + bne _0225098C + ldr r1, _02250A70 ; =ov45_02256F60 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + b _022509EC +_0225098C: + cmp r4, #2 + bne _022509AC + ldr r1, _02250A74 ; =ov45_02256F78 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + b _022509EC +_022509AC: + cmp r4, #3 + bne _022509CC + ldr r1, _02250A78 ; =ov45_02256F88 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + b _022509EC +_022509CC: + cmp r4, #4 + addne sp, sp, #0x20 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _02250A7C ; =ov45_02256F94 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 +_022509EC: + mov r0, r7 + mov r1, r6 + bl ov45_02247E98 + cmp r0, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r1, r7, #0x36c + str r1, [sp, #0x14] + str r6, [sp, #0x10] + str r5, [sp, #0x18] + str r4, [sp, #0x1c] + ldr r2, [r0, #0x2c] + mov r1, #0 + str r2, [sp] + stmib sp, {r1, r6} + mov r1, #0x10 + str r1, [sp, #0xc] + ldr r2, [r0] + add r3, sp, #0x10 + mov r0, r7 + mov r1, #4 + bl ov45_02244D30 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02250A4C: .word ov45_02256BA0 +_02250A50: .word ov45_02256B94 +_02250A54: .word ov45_02256B6C +_02250A58: .word 0x000005FC +_02250A5C: .word ov45_02256E9C +_02250A60: .word 0x000005FF +_02250A64: .word ov45_02256EAC +_02250A68: .word ov45_02256ED8 +_02250A6C: .word ov45_02256F50 +_02250A70: .word ov45_02256F60 +_02250A74: .word ov45_02256F78 +_02250A78: .word ov45_02256F88 +_02250A7C: .word ov45_02256F94 + arm_func_end ov45_0225089C + + arm_func_start ov45_02250A80 +ov45_02250A80: ; 0x02250A80 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x40 + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02250AAC + ldr r0, _02250C50 ; =ov45_02256BA0 + ldr r1, _02250C54 ; =ov45_02256B94 + ldr r2, _02250C58 ; =ov45_02256ACC + ldr r3, _02250C5C ; =0x0000067F + bl __msl_assertion_failed +_02250AAC: + cmp r6, #0 + ldrne r0, [r6] + cmpne r0, #0 + addeq sp, sp, #0x40 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r5, #0 + bne _02250ADC + ldr r0, _02250C60 ; =ov45_02256E9C + ldr r1, _02250C54 ; =ov45_02256B94 + ldr r2, _02250C58 ; =ov45_02256ACC + ldr r3, _02250C64 ; =0x00000682 + bl __msl_assertion_failed +_02250ADC: + ldrsb r0, [r5] + cmp r0, #0 + bne _02250AFC + ldr r0, _02250C68 ; =ov45_02256EAC + ldr r1, _02250C54 ; =ov45_02256B94 + ldr r2, _02250C58 ; =ov45_02256ACC + ldr r3, _02250C64 ; =0x00000682 + bl __msl_assertion_failed +_02250AFC: + cmp r4, #0 + bne _02250B18 + ldr r0, _02250C6C ; =ov45_02256FB4 + ldr r1, _02250C54 ; =ov45_02256B94 + ldr r2, _02250C58 ; =ov45_02256ACC + ldr r3, _02250C70 ; =0x00000683 + bl __msl_assertion_failed +_02250B18: + ldr r3, _02250C74 ; =ov45_02256FC4 + add ip, sp, #0 + mov r2, #8 +_02250B24: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + bne _02250B24 + ldrb r0, [r3] + strb r0, [ip] + ldr r0, [r4] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp] + moveq r0, #0x2d + streqb r0, [sp] + ldr r0, [r4, #4] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #2] + moveq r0, #0x2d + streqb r0, [sp, #2] + ldr r0, [r4, #8] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #4] + moveq r0, #0x2d + streqb r0, [sp, #4] + ldr r0, [r4, #0xc] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #6] + moveq r0, #0x2d + streqb r0, [sp, #6] + ldr r0, [r4, #0x10] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #8] + moveq r0, #0x2d + streqb r0, [sp, #8] + ldr r0, [r4, #0x14] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #0xa] + moveq r0, #0x2d + streqb r0, [sp, #0xa] + ldr r0, [r4, #0x1c] + cmp r0, #0 + movgt r0, #0x2b + strgtb r0, [sp, #0xc] + movle r0, #0x2d + strleb r0, [sp, #0xc] + ldr r0, [r4, #0x18] + cmp r0, #0 + movne r0, #0x2b + strneb r0, [sp, #0xe] + moveq r0, #0x2d + streqb r0, [sp, #0xe] + ldr r4, [r4, #0x1c] + cmp r4, #0 + ble _02250C34 + add r0, sp, #0 + bl strlen + add r3, sp, #0 + ldr r1, _02250C78 ; =ov45_02256FD8 + mov r2, r4 + add r0, r3, r0 + bl sprintf +_02250C34: + ldr r1, _02250C7C ; =ov45_02256FDC + add r3, sp, #0 + mov r2, r5 + add r0, r6, #0x1c + bl ov45_02252F74 + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02250C50: .word ov45_02256BA0 +_02250C54: .word ov45_02256B94 +_02250C58: .word ov45_02256ACC +_02250C5C: .word 0x0000067F +_02250C60: .word ov45_02256E9C +_02250C64: .word 0x00000682 +_02250C68: .word ov45_02256EAC +_02250C6C: .word ov45_02256FB4 +_02250C70: .word 0x00000683 +_02250C74: .word ov45_02256FC4 +_02250C78: .word ov45_02256FD8 +_02250C7C: .word ov45_02256FDC + arm_func_end ov45_02250A80 + + arm_func_start ov45_02250C80 +ov45_02250C80: ; 0x02250C80 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x3c + movs r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _02250CB0 + ldr r0, _02250E44 ; =ov45_02256BA0 + ldr r1, _02250E48 ; =ov45_02256B94 + ldr r2, _02250E4C ; =ov45_02256AE0 + ldr r3, _02250E50 ; =0x000006C2 + bl __msl_assertion_failed +_02250CB0: + cmp r8, #0 + ldrne r0, [r8] + cmpne r0, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + cmp r7, #0 + bne _02250CE0 + ldr r0, _02250E54 ; =ov45_02256E9C + ldr r1, _02250E48 ; =ov45_02256B94 + ldr r2, _02250E4C ; =ov45_02256AE0 + ldr r3, _02250E58 ; =0x000006C5 + bl __msl_assertion_failed +_02250CE0: + ldrsb r0, [r7] + cmp r0, #0 + bne _02250D00 + ldr r0, _02250E5C ; =ov45_02256EAC + ldr r1, _02250E48 ; =ov45_02256B94 + ldr r2, _02250E4C ; =ov45_02256AE0 + ldr r3, _02250E58 ; =0x000006C5 + bl __msl_assertion_failed +_02250D00: + cmp r6, #0 + bne _02250D1C + ldr r0, _02250E60 ; =ov45_02256FA0 + ldr r1, _02250E48 ; =ov45_02256B94 + ldr r2, _02250E4C ; =ov45_02256AE0 + ldr r3, _02250E64 ; =0x000006C6 + bl __msl_assertion_failed +_02250D1C: + mov r0, r8 + mov r1, r7 + bl ov45_02248238 + cmp r0, #0 + beq _02250DD8 + add r2, sp, #0x1c + mov r0, r8 + mov r1, r7 + bl ov45_02248288 + cmp r0, #0 + beq _02250DD8 + mov r0, r8 + bl ov45_0224A5E4 + add r1, sp, #0x1c + mov r2, #1 + str r2, [sp, #0x10] + str r1, [sp, #0x18] + str r7, [sp, #0x14] + mov r4, r0 + str r5, [sp] + str r4, [sp, #4] + mov r1, #0 + str r1, [sp, #8] + mov r5, #0xc + add r3, sp, #0x10 + mov r0, r8 + mov r2, r6 + mov r1, #0x11 + str r5, [sp, #0xc] + bl ov45_02244D30 + ldr r0, [sp, #0x58] + cmp r0, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r5, #0xa +_02250DA8: + mov r0, r8 + mov r1, r4 + bl ov45_0224F770 + mov r0, r5 + bl ov00_021FF3C0 + mov r0, r8 + mov r1, r4 + bl ov45_0224F660 + cmp r0, #0 + bne _02250DA8 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_02250DD8: + ldr r1, _02250E68 ; =ov45_02256FE8 + mov r2, r7 + add r0, r8, #0x1c + bl ov45_02252F74 + mov r0, r8 + mov r1, r7 + mov r2, r6 + mov r3, r5 + bl ov45_0224A9F8 + ldr r1, [sp, #0x58] + mov r5, r0 + cmp r1, #0 + addeq sp, sp, #0x3c + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r4, #0xa +_02250E14: + mov r0, r8 + mov r1, r5 + bl ov45_0224F770 + mov r0, r4 + bl ov00_021FF3C0 + mov r0, r8 + mov r1, r5 + bl ov45_0224F660 + cmp r0, #0 + bne _02250E14 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02250E44: .word ov45_02256BA0 +_02250E48: .word ov45_02256B94 +_02250E4C: .word ov45_02256AE0 +_02250E50: .word 0x000006C2 +_02250E54: .word ov45_02256E9C +_02250E58: .word 0x000006C5 +_02250E5C: .word ov45_02256EAC +_02250E60: .word ov45_02256FA0 +_02250E64: .word 0x000006C6 +_02250E68: .word ov45_02256FE8 + arm_func_end ov45_02250C80 + + arm_func_start ov45_02250E6C +ov45_02250E6C: ; 0x02250E6C + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02250E94 + ldr r0, _02250F30 ; =ov45_02256BA0 + ldr r1, _02250F34 ; =ov45_02256B94 + ldr r2, _02250F38 ; =ov45_02256AF4 + ldr r3, _02250F3C ; =0x0000074E + bl __msl_assertion_failed +_02250E94: + cmp r6, #0 + ldrne r0, [r6] + cmpne r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r5, #0 + bne _02250EC0 + ldr r0, _02250F40 ; =ov45_02256E9C + ldr r1, _02250F34 ; =ov45_02256B94 + ldr r2, _02250F38 ; =ov45_02256AF4 + ldr r3, _02250F44 ; =0x00000751 + bl __msl_assertion_failed +_02250EC0: + ldrsb r0, [r5] + cmp r0, #0 + bne _02250EE0 + ldr r0, _02250F48 ; =ov45_02256EAC + ldr r1, _02250F34 ; =ov45_02256B94 + ldr r2, _02250F38 ; =ov45_02256AF4 + ldr r3, _02250F44 ; =0x00000751 + bl __msl_assertion_failed +_02250EE0: + cmp r4, #0 + bge _02250EFC + ldr r0, _02250F4C ; =ov45_02256FF0 + ldr r1, _02250F34 ; =ov45_02256B94 + ldr r2, _02250F38 ; =ov45_02256AF4 + ldr r3, _02250F50 ; =0x00000752 + bl __msl_assertion_failed +_02250EFC: + cmp r4, #0 + beq _02250F1C + ldr r1, _02250F54 ; =ov45_02256FFC + mov r2, r5 + mov r3, r4 + add r0, r6, #0x1c + bl ov45_02252F74 + ldmia sp!, {r4, r5, r6, pc} +_02250F1C: + ldr r1, _02250F58 ; =ov45_0225700C + mov r2, r5 + add r0, r6, #0x1c + bl ov45_02252F74 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02250F30: .word ov45_02256BA0 +_02250F34: .word ov45_02256B94 +_02250F38: .word ov45_02256AF4 +_02250F3C: .word 0x0000074E +_02250F40: .word ov45_02256E9C +_02250F44: .word 0x00000751 +_02250F48: .word ov45_02256EAC +_02250F4C: .word ov45_02256FF0 +_02250F50: .word 0x00000752 +_02250F54: .word ov45_02256FFC +_02250F58: .word ov45_0225700C + arm_func_end ov45_02250E6C + + arm_func_start ov45_02250F5C +ov45_02250F5C: ; 0x02250F5C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02250F80 + ldr r0, _02251008 ; =ov45_02256BA0 + ldr r1, _0225100C ; =ov45_02256B94 + ldr r2, _02251010 ; =ov45_02256B54 + ldr r3, _02251014 ; =0x000007D6 + bl __msl_assertion_failed +_02250F80: + ldr r0, [r5] + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + bne _02250FAC + ldr r0, _02251018 ; =ov45_02256E9C + ldr r1, _0225100C ; =ov45_02256B94 + ldr r2, _02251010 ; =ov45_02256B54 + ldr r3, _0225101C ; =0x000007DA + bl __msl_assertion_failed +_02250FAC: + ldrsb r0, [r4] + cmp r0, #0 + bne _02250FCC + ldr r0, _02251020 ; =ov45_02256EAC + ldr r1, _0225100C ; =ov45_02256B94 + ldr r2, _02251010 ; =ov45_02256B54 + ldr r3, _0225101C ; =0x000007DA + bl __msl_assertion_failed +_02250FCC: + cmp r4, #0 + ldrnesb r0, [r4] + cmpne r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov45_02248238 + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov45_022487BC + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02251008: .word ov45_02256BA0 +_0225100C: .word ov45_02256B94 +_02251010: .word ov45_02256B54 +_02251014: .word 0x000007D6 +_02251018: .word ov45_02256E9C +_0225101C: .word 0x000007DA +_02251020: .word ov45_02256EAC + arm_func_end ov45_02250F5C + + arm_func_start ov45_02251024 +ov45_02251024: ; 0x02251024 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02251048 + ldr r0, _022510B8 ; =ov45_02256BA0 + ldr r1, _022510BC ; =ov45_02256B94 + ldr r2, _022510C0 ; =ov45_022569D8 + ldr r3, _022510C4 ; =0x000007F4 + bl __msl_assertion_failed +_02251048: + ldr r0, [r5] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + bne _02251074 + ldr r0, _022510C8 ; =ov45_02256E9C + ldr r1, _022510BC ; =ov45_02256B94 + ldr r2, _022510C0 ; =ov45_022569D8 + ldr r3, _022510CC ; =0x000007F8 + bl __msl_assertion_failed +_02251074: + ldrsb r0, [r4] + cmp r0, #0 + bne _02251094 + ldr r0, _022510D0 ; =ov45_02256EAC + ldr r1, _022510BC ; =ov45_02256B94 + ldr r2, _022510C0 ; =ov45_022569D8 + ldr r3, _022510CC ; =0x000007F8 + bl __msl_assertion_failed +_02251094: + cmp r4, #0 + ldrnesb r0, [r4] + cmpne r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl ov45_02248238 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022510B8: .word ov45_02256BA0 +_022510BC: .word ov45_02256B94 +_022510C0: .word ov45_022569D8 +_022510C4: .word 0x000007F4 +_022510C8: .word ov45_02256E9C +_022510CC: .word 0x000007F8 +_022510D0: .word ov45_02256EAC + arm_func_end ov45_02251024 + + arm_func_start ov45_022510D4 +ov45_022510D4: ; 0x022510D4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + movs r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _02251104 + ldr r0, _022511D4 ; =ov45_02256BA0 + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _022511E0 ; =0x00000812 + bl __msl_assertion_failed +_02251104: + cmp r7, #0 + bne _02251120 + ldr r0, _022511E4 ; =ov45_02256E9C + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _022511E8 ; =0x00000816 + bl __msl_assertion_failed +_02251120: + ldrsb r0, [r7] + cmp r0, #0 + bne _02251140 + ldr r0, _022511EC ; =ov45_02256EAC + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _022511E8 ; =0x00000816 + bl __msl_assertion_failed +_02251140: + cmp r6, #0 + bge _0225115C + ldr r0, _022511F0 ; =ov45_02257018 + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _022511F4 ; =0x00000817 + bl __msl_assertion_failed +_0225115C: + ldr r0, [sp, #0x2c] + cmp r0, #0 + bne _0225117C + ldr r0, _022511F8 ; =ov45_02257028 + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _022511FC ; =0x00000827 + bl __msl_assertion_failed +_0225117C: + ldr r4, [sp, #0x2c] + ldr r0, [r4] + cmp r0, #0 + bne _022511A0 + ldr r0, _02251200 ; =ov45_02257038 + ldr r1, _022511D8 ; =ov45_02256B94 + ldr r2, _022511DC ; =ov45_02256A90 + ldr r3, _02251204 ; =0x0000082C + bl __msl_assertion_failed +_022511A0: + ldr r0, [sp, #0x28] + str r5, [sp] + str r0, [sp, #4] + ldr r1, [r4, #4] + mov r0, r8 + str r1, [sp, #8] + ldr r4, [r4] + mov r2, r7 + mov r3, r6 + mov r1, #1 + blx r4 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_022511D4: .word ov45_02256BA0 +_022511D8: .word ov45_02256B94 +_022511DC: .word ov45_02256A90 +_022511E0: .word 0x00000812 +_022511E4: .word ov45_02256E9C +_022511E8: .word 0x00000816 +_022511EC: .word ov45_02256EAC +_022511F0: .word ov45_02257018 +_022511F4: .word 0x00000817 +_022511F8: .word ov45_02257028 +_022511FC: .word 0x00000827 +_02251200: .word ov45_02257038 +_02251204: .word 0x0000082C + arm_func_end ov45_022510D4 + + arm_func_start ov45_02251208 +ov45_02251208: ; 0x02251208 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + movs r4, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _02251238 + ldr r0, _0225132C ; =ov45_02256BA0 + ldr r1, _02251330 ; =ov45_02256B94 + ldr r2, _02251334 ; =ov45_022569F8 + ldr r3, _02251338 ; =0x00000847 + bl __msl_assertion_failed +_02251238: + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + bne _02251268 + ldr r0, _0225133C ; =ov45_02256FA0 + ldr r1, _02251330 ; =ov45_02256B94 + ldr r2, _02251334 ; =ov45_022569F8 + ldr r3, _02251340 ; =0x0000084B + bl __msl_assertion_failed +_02251268: + cmp r7, #0 + ldreq r7, _02251344 ; =ov45_02256C2C + ldrsb r0, [r7] + cmp r0, #0 + beq _022512B4 + mov r0, r4 + mov r1, r7 + bl ov45_02248238 + cmp r0, #0 + beq _022512B4 + ldr r2, _02251348 ; =ov45_022510D4 + add r3, sp, #0 + mov r0, r4 + mov r1, r7 + str r6, [sp] + str r5, [sp, #4] + bl ov45_022480EC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022512B4: + ldr r1, _0225134C ; =ov45_02257050 + mov r2, r7 + add r0, r4, #0x1c + bl ov45_02252F74 + ldrsb r0, [r7] + mov r2, r6 + mov r3, r5 + cmp r0, #0 + moveq r7, #0 + mov r0, r4 + mov r1, r7 + bl ov45_0224A978 + ldr r1, [sp, #0x20] + mov r6, r0 + cmp r1, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r5, #0xa +_022512FC: + mov r0, r4 + mov r1, r6 + bl ov45_0224F770 + mov r0, r5 + bl ov00_021FF3C0 + mov r0, r4 + mov r1, r6 + bl ov45_0224F660 + cmp r0, #0 + bne _022512FC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0225132C: .word ov45_02256BA0 +_02251330: .word ov45_02256B94 +_02251334: .word ov45_022569F8 +_02251338: .word 0x00000847 +_0225133C: .word ov45_02256FA0 +_02251340: .word 0x0000084B +_02251344: .word ov45_02256C2C +_02251348: .word ov45_022510D4 +_0225134C: .word ov45_02257050 + arm_func_end ov45_02251208 + + arm_func_start ov45_02251350 +ov45_02251350: ; 0x02251350 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bne _0225137C + ldr r0, _022514B8 ; =ov45_02256BA0 + ldr r1, _022514BC ; =ov45_02256B94 + ldr r2, _022514C0 ; =ov45_02256B0C + ldr r3, _022514C4 ; =0x00000889 + bl __msl_assertion_failed +_0225137C: + cmp r7, #0 + ldrne r0, [r7] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + bne _022513A8 + ldr r0, _022514C8 ; =ov45_0225705C + ldr r1, _022514BC ; =ov45_02256B94 + ldr r2, _022514C0 ; =ov45_02256B0C + ldr r3, _022514CC ; =0x0000088C + bl __msl_assertion_failed +_022513A8: + ldrsb r0, [r6] + cmp r0, #0 + bne _022513C8 + ldr r0, _022514D0 ; =ov45_0225706C + ldr r1, _022514BC ; =ov45_02256B94 + ldr r2, _022514C0 ; =ov45_02256B0C + ldr r3, _022514CC ; =0x0000088C + bl __msl_assertion_failed +_022513C8: + mov r0, r6 + bl strlen + cmp r0, #0x80 + blo _022513EC + ldr r0, _022514D4 ; =ov45_0225707C + ldr r1, _022514BC ; =ov45_02256B94 + ldr r2, _022514C0 ; =ov45_02256B0C + ldr r3, _022514CC ; =0x0000088C + bl __msl_assertion_failed +_022513EC: + cmp r4, #4 + bls _02251408 + ldr r0, _022514D8 ; =ov45_02256ED8 + ldr r1, _022514BC ; =ov45_02256B94 + ldr r2, _022514C0 ; =ov45_02256B0C + ldr r3, _022514DC ; =0x0000088D + bl __msl_assertion_failed +_02251408: + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + bne _02251438 + ldr r1, _022514E0 ; =ov45_02256F50 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02251438: + cmp r4, #1 + bne _02251458 + ldr r1, _022514E4 ; =ov45_02256F60 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02251458: + cmp r4, #2 + bne _02251478 + ldr r1, _022514E8 ; =ov45_02256F78 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02251478: + cmp r4, #3 + bne _02251498 + ldr r1, _022514EC ; =ov45_02256F88 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02251498: + cmp r4, #4 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _022514F0 ; =ov45_02256F94 + mov r2, r6 + mov r3, r5 + add r0, r7, #0x1c + bl ov45_02252F74 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022514B8: .word ov45_02256BA0 +_022514BC: .word ov45_02256B94 +_022514C0: .word ov45_02256B0C +_022514C4: .word 0x00000889 +_022514C8: .word ov45_0225705C +_022514CC: .word 0x0000088C +_022514D0: .word ov45_0225706C +_022514D4: .word ov45_0225707C +_022514D8: .word ov45_02256ED8 +_022514DC: .word 0x0000088D +_022514E0: .word ov45_02256F50 +_022514E4: .word ov45_02256F60 +_022514E8: .word ov45_02256F78 +_022514EC: .word ov45_02256F88 +_022514F0: .word ov45_02256F94 + arm_func_end ov45_02251350 + + arm_func_start ov45_022514F4 +ov45_022514F4: ; 0x022514F4 + stmdb sp!, {r4, lr} + ldr r3, _02251544 ; =ov45_022577F4 + ldr r0, _02251548 ; =ov45_022577F0 + ldr r2, [r3] + ldr r1, _0225154C ; =ov45_0225709C + add r4, r2, #1 + str r4, [r3] + bl sprintf + ldr ip, _02251544 ; =ov45_022577F4 + ldr r3, _02251550 ; =0x10624DD3 + ldr lr, [ip] + mov r2, #0x3e8 + mov r0, lr, lsr #0x1f + smull r1, r4, r3, lr + add r4, r0, r4, asr #6 + smull r0, r1, r2, r4 + sub r4, lr, r0 + ldr r0, _02251548 ; =ov45_022577F0 + str r4, [ip] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02251544: .word ov45_022577F4 +_02251548: .word ov45_022577F0 +_0225154C: .word ov45_0225709C +_02251550: .word 0x10624DD3 + arm_func_end ov45_022514F4 + + arm_func_start ov45_02251554 +ov45_02251554: ; 0x02251554 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x200 + movs sl, r0 + mov r5, r1 + mov r4, r2 + mov sb, r3 + ldr r8, [sp, #0x228] + ldr r7, [sp, #0x22c] + bne _0225158C + ldr r0, _02251630 ; =ov45_02256BA0 + ldr r1, _02251634 ; =ov45_02256B94 + ldr r2, _02251638 ; =ov45_02256AB8 + ldr r3, _0225163C ; =0x00000AD7 + bl __msl_assertion_failed +_0225158C: + cmp sl, #0 + ldrne r0, [sl] + cmpne r0, #0 + addeq sp, sp, #0x200 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r4, #0 + ldrnesb r0, [r4] + cmpne r0, #0 + add r0, sp, #0 + bne _022515C4 + ldr r1, _02251640 ; =ov45_022570C4 + mov r2, r5 + bl sprintf + b _022515D4 +_022515C4: + ldr r1, _02251644 ; =ov45_022570D4 + mov r2, r5 + mov r3, r4 + bl sprintf +_022515D4: + cmp sb, #0 + mov r6, #0 + ble _0225161C + ldr fp, _02251648 ; =ov45_02256C2C + add r4, sp, #0 +_022515E8: + ldr r5, [r7, r6, lsl #2] + mov r0, r4 + cmp r5, #0 + moveq r5, fp + bl strlen + ldr r2, [r8, r6, lsl #2] + ldr r1, _0225164C ; =ov45_02257094 + mov r3, r5 + add r0, r4, r0 + bl sprintf + add r6, r6, #1 + cmp r6, sb + blt _022515E8 +_0225161C: + add r1, sp, #0 + add r0, sl, #0x1c + bl ov45_02252CB4 + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02251630: .word ov45_02256BA0 +_02251634: .word ov45_02256B94 +_02251638: .word ov45_02256AB8 +_0225163C: .word 0x00000AD7 +_02251640: .word ov45_022570C4 +_02251644: .word ov45_022570D4 +_02251648: .word ov45_02256C2C +_0225164C: .word ov45_02257094 + arm_func_end ov45_02251554 + + arm_func_start ov45_02251650 +ov45_02251650: ; 0x02251650 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x210 + str r0, [sp, #4] + cmp r0, #0 + mov r0, #0 + mov r5, r1 + str r2, [sp, #8] + mov r4, r3 + ldr sl, [sp, #0x238] + ldr sb, [sp, #0x23c] + str r0, [sp, #0xc] + bne _02251694 + ldr r0, _022518B4 ; =ov45_02256BA0 + ldr r1, _022518B8 ; =ov45_02256B94 + ldr r2, _022518BC ; =ov45_02256A7C + ldr r3, _022518C0 ; =0x00000B19 + bl __msl_assertion_failed +_02251694: + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + bne _022516B8 + ldr r0, _022518C4 ; =ov45_022570E4 + ldr r1, _022518B8 ; =ov45_02256B94 + ldr r2, _022518BC ; =ov45_02256A7C + ldr r3, _022518C8 ; =0x00000B1B + bl __msl_assertion_failed +_022516B8: + cmp r4, #0 + ldrnesb r0, [r4] + cmpne r0, #0 + bne _022516DC + ldr r0, _022518CC ; =ov45_022570A4 + ldr r1, _022518B8 ; =ov45_02256B94 + ldr r2, _022518BC ; =ov45_02256A7C + ldr r3, _022518D0 ; =0x00000B1C + bl __msl_assertion_failed +_022516DC: + cmp sl, #0 + beq _02251700 + cmp sb, #0 + bne _02251700 + ldr r0, _022518D4 ; =ov45_022570FC + ldr r1, _022518B8 ; =ov45_02256B94 + ldr r2, _022518BC ; =ov45_02256A7C + ldr r3, _022518D8 ; =0x00000B1D + bl __msl_assertion_failed +_02251700: + ldr r0, [sp, #8] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + add r0, sp, #0x10 + bne _0225172C + ldr r1, _022518DC ; =ov45_0225710C + mov r2, r5 + mov r3, r4 + bl sprintf + b _02251740 +_0225172C: + ldr r1, _022518E0 ; =ov45_02257124 + ldr r3, [sp, #8] + mov r2, r5 + str r4, [sp] + bl sprintf +_02251740: + add r0, sp, #0x10 + bl strlen + mov r7, r0 + cmp sl, #0 + mov r5, #0 + ble _02251810 + mov r4, #0x2f + add fp, sp, #0x10 +_02251760: + ldr r6, [sb, r5, lsl #2] + cmp r6, #0 + ldrnesb r0, [r6] + cmpne r0, #0 + beq _02251804 + ldr r1, _022518E4 ; =ov45_0225713C + mov r0, r6 + bl strcmp + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] + beq _02251804 + mov r0, r6 + bl strlen + mov r6, r0 + add r0, r7, r6 + add r0, r0, #1 + cmp r0, #0x200 + bge _02251804 + mov r0, #0x5c + strb r0, [fp, r7] + add r7, r7, #1 + add r8, fp, r7 + ldr r1, [sb, r5, lsl #2] + mov r0, r8 + mov r2, r6 + bl memcpy + add r2, r7, r6 + mov r1, r7 + cmp r7, r2 + bge _022517F8 +_022517DC: + ldrsb r0, [r8] + add r1, r1, #1 + cmp r0, #0x5c + streqb r4, [r8] + add r8, r8, #1 + cmp r1, r2 + blt _022517DC +_022517F8: + add r7, r7, r6 + mov r0, #0 + strb r0, [fp, r7] +_02251804: + add r5, r5, #1 + cmp r5, sl + blt _02251760 +_02251810: + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _02251860 + add r5, r7, #4 + cmp r5, #0x200 + bge _02251860 + ldr r3, _022518E8 ; =ov45_02257140 + add r4, sp, #0x10 + ldrb r2, [r3] + ldrb r1, [r3, #1] + ldrb r0, [r3, #2] + strb r2, [r4, r7] + add r2, r4, r7 + strb r1, [r2, #1] + strb r0, [r2, #2] + ldrb r1, [r3, #3] + ldrb r0, [r3, #4] + mov r7, r5 + strb r1, [r2, #3] + strb r0, [r2, #4] +_02251860: + cmp sl, #0 + bne _02251898 + ldr r0, [sp, #8] + cmp r0, #0 + ldrnesb r0, [r0] + cmpne r0, #0 + bne _02251898 + ldr r0, _022518EC ; =ov45_02256BC0 + add r2, sp, #0x10 + ldrb r1, [r0] + ldrb r0, [r0, #1] + add r3, r2, r7 + strb r1, [r2, r7] + strb r0, [r3, #1] +_02251898: + ldr r0, [sp, #4] + add r1, sp, #0x10 + add r0, r0, #0x1c + bl ov45_02252CB4 + ldr r0, [sp, #0xc] + add sp, sp, #0x210 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022518B4: .word ov45_02256BA0 +_022518B8: .word ov45_02256B94 +_022518BC: .word ov45_02256A7C +_022518C0: .word 0x00000B19 +_022518C4: .word ov45_022570E4 +_022518C8: .word 0x00000B1B +_022518CC: .word ov45_022570A4 +_022518D0: .word 0x00000B1C +_022518D4: .word ov45_022570FC +_022518D8: .word 0x00000B1D +_022518DC: .word ov45_0225710C +_022518E0: .word ov45_02257124 +_022518E4: .word ov45_0225713C +_022518E8: .word ov45_02257140 +_022518EC: .word ov45_02256BC0 + arm_func_end ov45_02251650 + + arm_func_start ov45_022518F0 +ov45_022518F0: ; 0x022518F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + movs sb, r0 + mov r5, r1 + mov r8, r2 + mov r7, r3 + ldr r6, [sp, #0x30] + bne _02251924 + ldr r0, _02251A68 ; =ov45_02256BA0 + ldr r1, _02251A6C ; =ov45_02256B94 + ldr r2, _02251A70 ; =ov45_02256AA4 + ldr r3, _02251A74 ; =0x00000B6F + bl __msl_assertion_failed +_02251924: + cmp sb, #0 + ldrne r0, [sb] + cmpne r0, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r7, #0 + bge _02251954 + ldr r0, _02251A78 ; =ov45_022570B8 + ldr r1, _02251A6C ; =ov45_02256B94 + ldr r2, _02251A70 ; =ov45_02256AA4 + ldr r3, _02251A7C ; =0x00000B72 + bl __msl_assertion_failed +_02251954: + cmp r7, #0 + beq _02251978 + cmp r6, #0 + bne _02251978 + ldr r0, _02251A80 ; =ov45_022570FC + ldr r1, _02251A6C ; =ov45_02256B94 + ldr r2, _02251A70 ; =ov45_02256AA4 + ldr r3, _02251A84 ; =0x00000B73 + bl __msl_assertion_failed +_02251978: + bl ov45_022514F4 + mov r4, r0 + str r7, [sp] + mov r0, sb + mov r1, r5 + mov r2, r8 + mov r3, r4 + str r6, [sp, #4] + bl ov45_02251650 + mov r5, r0 + cmp r8, #0 + ldrnesb r0, [r8] + cmpne r0, #0 + bne _022519DC + ldr r0, [sp, #0x34] + str r5, [sp] + str r0, [sp, #4] + ldr r5, [sp, #0x38] + mov r0, sb + mov r1, r4 + mov r2, r7 + mov r3, r6 + str r5, [sp, #8] + bl ov45_0224ABA0 + b _02251A20 +_022519DC: + ldr r1, _02251A88 ; =ov45_02256BC0 + mov r0, r8 + bl strcmp + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + str r0, [sp] + str r5, [sp, #4] + ldr r0, [sp, #0x34] + ldr r5, [sp, #0x38] + str r0, [sp, #8] + mov r0, sb + mov r1, r4 + mov r2, r7 + mov r3, r6 + str r5, [sp, #0xc] + bl ov45_0224AA2C +_02251A20: + mov r5, r0 + ldr r0, [sp, #0x3c] + cmp r0, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r4, #0xa +_02251A38: + mov r0, sb + mov r1, r5 + bl ov45_0224F770 + mov r0, r4 + bl ov00_021FF3C0 + mov r0, sb + mov r1, r5 + bl ov45_0224F660 + cmp r0, #0 + bne _02251A38 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02251A68: .word ov45_02256BA0 +_02251A6C: .word ov45_02256B94 +_02251A70: .word ov45_02256AA4 +_02251A74: .word 0x00000B6F +_02251A78: .word ov45_022570B8 +_02251A7C: .word 0x00000B72 +_02251A80: .word ov45_022570FC +_02251A84: .word 0x00000B73 +_02251A88: .word ov45_02256BC0 + arm_func_end ov45_022518F0 + + arm_func_start ov45_02251A8C +ov45_02251A8C: ; 0x02251A8C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl strlen + cmp r0, #0x15 + movhs r0, #6 + ldmhsia sp!, {r3, r4, r5, pc} + cmp r5, #0 + ldrnesb r0, [r5] + cmpne r0, #0 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #0x40 + cmpne r0, #0x23 + cmpne r0, #0x2b + cmpne r0, #0x3a + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #0 + beq _02251B00 + ldr r4, _02251B08 ; =ov45_02256E04 +_02251ADC: + ldrsb r1, [r5], #1 + mov r0, r4 + bl strchr + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsb r0, [r5] + cmp r0, #0 + bne _02251ADC +_02251B00: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02251B08: .word ov45_02256E04 + arm_func_end ov45_02251A8C + + arm_func_start ov45_02251B0C +ov45_02251B0C: ; 0x02251B0C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x20 + movs r4, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bne _02251B3C + ldr r0, _02251BD0 ; =ov45_02256BA0 + ldr r1, _02251BD4 ; =ov45_02256B94 + ldr r2, _02251BD8 ; =ov45_022569C0 + ldr r3, _02251BDC ; =0x00000BC9 + bl __msl_assertion_failed +_02251B3C: + ldr r0, [r4, #0xc] + cmp r0, #0 + beq _02251BA0 + add r3, sp, #0x10 + mov r2, #0 + str r2, [r3] + str r2, [r3, #4] + str r2, [r3, #8] + ldr r0, [sp, #0x38] + str r2, [r3, #0xc] + str r0, [sp, #0x1c] + str r7, [sp, #0x10] + str r6, [sp, #0x14] + str r5, [sp, #0x18] + ldr r1, [r4, #0x18] + mov r0, #0x10 + stmia sp, {r1, r2} + str r2, [sp, #8] + str r0, [sp, #0xc] + ldr r2, [r4, #0xc] + mov r0, r4 + mov r1, #0x19 + bl ov45_02244D30 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_02251BA0: + mov r1, #0 + str r1, [r4, #4] + ldr ip, [r4, #0x14] + cmp ip, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r3, [r4, #0x18] + mov r0, r4 + mov r2, #1 + blx ip + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_02251BD0: .word ov45_02256BA0 +_02251BD4: .word ov45_02256B94 +_02251BD8: .word ov45_022569C0 +_02251BDC: .word 0x00000BC9 + arm_func_end ov45_02251B0C + + arm_func_start ov45_02251BE0 +ov45_02251BE0: ; 0x02251BE0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02251C00 + ldr r0, _02251C34 ; =ov45_02257248 + ldr r1, _02251C38 ; =ov45_02257258 + ldr r2, _02251C3C ; =ov45_02257174 + mov r3, #0x5f + bl __msl_assertion_failed +_02251C00: + mov r0, #0 + mov r1, #0x2000 + str r0, [r4, #4] + add r0, r1, #1 + str r1, [r4, #8] + bl ov00_021EC3A8 + cmp r0, #0 + str r0, [r4] + moveq r0, #0 + movne r1, #0 + strneb r1, [r0] + movne r0, #1 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02251C34: .word ov45_02257248 +_02251C38: .word ov45_02257258 +_02251C3C: .word ov45_02257174 + arm_func_end ov45_02251BE0 + + arm_func_start ov45_02251C40 +ov45_02251C40: ; 0x02251C40 + ldr ip, _02251C4C ; =ov00_021EC3D8 + ldr r0, [r0] + bx ip + .balign 4, 0 +_02251C4C: .word ov00_021EC3D8 + arm_func_end ov45_02251C40 + + arm_func_start ov45_02251C50 +ov45_02251C50: ; 0x02251C50 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02251C74 + ldr r0, _02251D8C ; =ov45_02257268 + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x78 + bl __msl_assertion_failed +_02251C74: + ldr r0, [r5, #8] + cmp r0, #0 + bge _02251C94 + ldr r0, _02251D98 ; =ov45_0225727C + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x78 + bl __msl_assertion_failed +_02251C94: + ldr r0, [r5, #8] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02251CBC + ldr r0, _02251D9C ; =ov45_02257290 + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x78 + bl __msl_assertion_failed +_02251CBC: + ldr r0, [r5, #4] + cmp r0, #0 + bge _02251CDC + ldr r0, _02251DA0 ; =ov45_022572B4 + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x78 + bl __msl_assertion_failed +_02251CDC: + ldr r1, [r5, #4] + ldr r0, [r5, #8] + cmp r1, r0 + ble _02251D00 + ldr r0, _02251DA4 ; =ov45_022572CC + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x78 + bl __msl_assertion_failed +_02251D00: + cmp r4, #0 + bge _02251D1C + ldr r0, _02251DA8 ; =ov45_022572F0 + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x79 + bl __msl_assertion_failed +_02251D1C: + ldr r0, _02251DAC ; =0x00007FFF + cmp r4, r0 + ble _02251D3C + ldr r0, _02251DB0 ; =ov45_022572FC + ldr r1, _02251D90 ; =ov45_02257258 + ldr r2, _02251D94 ; =ov45_022571E4 + mov r3, #0x7a + bl __msl_assertion_failed +_02251D3C: + ldr r1, [r5, #4] + ldr r0, [r5, #8] + add r1, r1, r4 + cmp r1, r0 + movle r0, #1 + ldmleia sp!, {r3, r4, r5, pc} + add r2, r1, #0x2000 + mov r1, r2, lsr #0x1f + rsb r0, r1, r2, lsl #19 + add r0, r1, r0, ror #19 + sub r4, r2, r0 + ldr r0, [r5] + add r1, r4, #1 + bl ov00_021EC3BC + cmp r0, #0 + moveq r0, #0 + strne r0, [r5] + strne r4, [r5, #8] + movne r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02251D8C: .word ov45_02257268 +_02251D90: .word ov45_02257258 +_02251D94: .word ov45_022571E4 +_02251D98: .word ov45_0225727C +_02251D9C: .word ov45_02257290 +_02251DA0: .word ov45_022572B4 +_02251DA4: .word ov45_022572CC +_02251DA8: .word ov45_022572F0 +_02251DAC: .word 0x00007FFF +_02251DB0: .word ov45_022572FC + arm_func_end ov45_02251C50 + + arm_func_start ov45_02251DB4 +ov45_02251DB4: ; 0x02251DB4 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _02251DD8 + ldr r0, _02251ECC ; =ov45_02257268 + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x97 + bl __msl_assertion_failed +_02251DD8: + ldr r0, [r5, #8] + cmp r0, #0 + bge _02251DF8 + ldr r0, _02251ED8 ; =ov45_0225727C + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x97 + bl __msl_assertion_failed +_02251DF8: + ldr r0, [r5, #8] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02251E20 + ldr r0, _02251EDC ; =ov45_02257290 + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x97 + bl __msl_assertion_failed +_02251E20: + ldr r0, [r5, #4] + cmp r0, #0 + bge _02251E40 + ldr r0, _02251EE0 ; =ov45_022572B4 + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x97 + bl __msl_assertion_failed +_02251E40: + ldr r1, [r5, #4] + ldr r0, [r5, #8] + cmp r1, r0 + ble _02251E64 + ldr r0, _02251EE4 ; =ov45_022572CC + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x97 + bl __msl_assertion_failed +_02251E64: + cmp r4, #0 + bge _02251E80 + ldr r0, _02251EE8 ; =ov45_022572F0 + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x98 + bl __msl_assertion_failed +_02251E80: + ldr r0, [r5, #4] + cmp r4, r0 + ble _02251EA0 + ldr r0, _02251EEC ; =ov45_0225730C + ldr r1, _02251ED0 ; =ov45_02257258 + ldr r2, _02251ED4 ; =ov45_022571F8 + mov r3, #0x99 + bl __msl_assertion_failed +_02251EA0: + ldr r0, [r5, #4] + sub r2, r0, r4 + str r2, [r5, #4] + ldr r0, [r5] + add r1, r0, r4 + bl memmove + ldr r1, [r5] + ldr r0, [r5, #4] + mov r2, #0 + strb r2, [r1, r0] + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_02251ECC: .word ov45_02257268 +_02251ED0: .word ov45_02257258 +_02251ED4: .word ov45_022571F8 +_02251ED8: .word ov45_0225727C +_02251EDC: .word ov45_02257290 +_02251EE0: .word ov45_022572B4 +_02251EE4: .word ov45_022572CC +_02251EE8: .word ov45_022572F0 +_02251EEC: .word ov45_0225730C + arm_func_end ov45_02251DB4 + + arm_func_start ov45_02251EF0 +ov45_02251EF0: ; 0x02251EF0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02251F10 + ldr r0, _02251F60 ; =ov45_02257324 + ldr r1, _02251F64 ; =ov45_02257258 + ldr r2, _02251F68 ; =ov45_02257194 + mov r3, #0xb1 + bl __msl_assertion_failed +_02251F10: + mov r0, r4 + mov r1, #0 + mov r2, #0x350 + bl memset + mvn r1, #0 + add r0, r4, #0x108 + str r1, [r4] + bl ov45_02251BE0 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0x114 + bl ov45_02251BE0 + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, pc} + add r0, r4, #0x108 + bl ov45_02251C40 + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02251F60: .word ov45_02257324 +_02251F64: .word ov45_02257258 +_02251F68: .word ov45_02257194 + arm_func_end ov45_02251EF0 + + arm_func_start ov45_02251F6C +ov45_02251F6C: ; 0x02251F6C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + movs r6, r0 + mov r5, r1 + mov r4, r2 + bne _02251F98 + ldr r0, _02252268 ; =ov45_02257334 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02251F98: + ldr r0, [r6, #4] + cmp r0, #2 + bls _02251FB8 + ldr r0, _02252274 ; =ov45_02257344 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02251FB8: + adds r0, r6, #0x108 + bne _02251FD4 + ldr r0, _02252278 ; =ov45_022573C4 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02251FD4: + ldr r0, [r6, #0x110] + cmp r0, #0 + bge _02251FF4 + ldr r0, _0225227C ; =ov45_022573E4 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02251FF4: + ldr r0, [r6, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _0225201C + ldr r0, _02252280 ; =ov45_02257408 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_0225201C: + ldr r0, [r6, #0x10c] + cmp r0, #0 + bge _0225203C + ldr r0, _02252284 ; =ov45_02257438 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_0225203C: + ldr r1, [r6, #0x10c] + ldr r0, [r6, #0x110] + cmp r1, r0 + ble _02252060 + ldr r0, _02252288 ; =ov45_0225745C + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02252060: + adds r0, r6, #0x114 + bne _0225207C + ldr r0, _0225228C ; =ov45_0225749C + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_0225207C: + ldr r0, [r6, #0x11c] + cmp r0, #0 + bge _0225209C + ldr r0, _02252290 ; =ov45_022574BC + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_0225209C: + ldr r0, [r6, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _022520C4 + ldr r0, _02252294 ; =ov45_022574E0 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_022520C4: + ldr r0, [r6, #0x118] + cmp r0, #0 + bge _022520E4 + ldr r0, _02252298 ; =ov45_02257514 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_022520E4: + ldr r1, [r6, #0x118] + ldr r0, [r6, #0x11c] + cmp r1, r0 + ble _02252108 + ldr r0, _0225229C ; =ov45_02257538 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd8 + bl __msl_assertion_failed +_02252108: + cmp r5, #0 + bne _02252124 + ldr r0, _022522A0 ; =ov45_02257578 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xd9 + bl __msl_assertion_failed +_02252124: + cmp r4, #0 + bge _02252140 + ldr r0, _022522A4 ; =ov45_02257590 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xda + bl __msl_assertion_failed +_02252140: + ldr r0, _022522A8 ; =0x0000FFFF + cmp r4, r0 + ble _02252160 + ldr r0, _022522AC ; =ov45_0225759C + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xdb + bl __msl_assertion_failed +_02252160: + ldr r0, [r6, #4] + cmp r0, #0 + beq _02252180 + ldr r0, _022522B0 ; =ov45_022575B0 + ldr r1, _0225226C ; =ov45_02257258 + ldr r2, _02252270 ; =ov45_022571D4 + mov r3, #0xdc + bl __msl_assertion_failed +_02252180: + mov r1, r5 + add r0, r6, #8 + mov r2, #0xff + bl strncpy + mov r1, #0 + mov r0, r5 + strb r1, [r6, #0x106] + bl ov00_021FFA44 + mvn r1, #0 + cmp r0, r1 + bne _022521D0 + mov r0, r5 + bl SOC_GetHostByName + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r0, #0xc] + ldr r0, [r0] + ldr r0, [r0] +_022521D0: + mov r1, r4, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r3, r1, asr #8 + mov r1, r1, lsl #8 + add r4, sp, #0 + mov r2, #0 + str r2, [r4, #4] + and r3, r3, #0xff + and r1, r1, #0xff00 + orr r1, r3, r1 + str r2, [r4] + mov r3, #2 + str r0, [sp, #4] + strh r1, [sp, #2] + mov r0, r3 + mov r1, #1 + strb r3, [sp, #1] + bl ov00_021FF804 + mvn r1, #0 + cmp r0, r1 + str r0, [r6] + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r4 + mov r2, #8 + bl ov00_021FF8A0 + mvn r1, #0 + cmp r0, r1 + movne r0, #1 + addne sp, sp, #8 + strne r0, [r6, #4] + ldmneia sp!, {r4, r5, r6, pc} + ldr r0, [r6] + bl ov00_021FF818 + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02252268: .word ov45_02257334 +_0225226C: .word ov45_02257258 +_02252270: .word ov45_022571D4 +_02252274: .word ov45_02257344 +_02252278: .word ov45_022573C4 +_0225227C: .word ov45_022573E4 +_02252280: .word ov45_02257408 +_02252284: .word ov45_02257438 +_02252288: .word ov45_0225745C +_0225228C: .word ov45_0225749C +_02252290: .word ov45_022574BC +_02252294: .word ov45_022574E0 +_02252298: .word ov45_02257514 +_0225229C: .word ov45_02257538 +_022522A0: .word ov45_02257578 +_022522A4: .word ov45_02257590 +_022522A8: .word 0x0000FFFF +_022522AC: .word ov45_0225759C +_022522B0: .word ov45_022575B0 + arm_func_end ov45_02251F6C + + arm_func_start ov45_022522B4 +ov45_022522B4: ; 0x022522B4 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r0 + bne _022522D4 + ldr r0, _022524F4 ; =ov45_02257334 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_022522D4: + ldr r0, [r4, #4] + cmp r0, #2 + bls _022522F4 + ldr r0, _02252504 ; =ov45_02257344 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_022522F4: + adds r0, r4, #0x108 + bne _02252310 + ldr r0, _02252508 ; =ov45_022573C4 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252310: + ldr r0, [r4, #0x110] + cmp r0, #0 + bge _02252330 + ldr r0, _0225250C ; =ov45_022573E4 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252330: + ldr r0, [r4, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252358 + ldr r0, _02252510 ; =ov45_02257408 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252358: + ldr r0, [r4, #0x10c] + cmp r0, #0 + bge _02252378 + ldr r0, _02252514 ; =ov45_02257438 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252378: + ldr r1, [r4, #0x10c] + ldr r0, [r4, #0x110] + cmp r1, r0 + ble _0225239C + ldr r0, _02252518 ; =ov45_0225745C + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_0225239C: + adds r0, r4, #0x114 + bne _022523B8 + ldr r0, _0225251C ; =ov45_0225749C + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_022523B8: + ldr r0, [r4, #0x11c] + cmp r0, #0 + bge _022523D8 + ldr r0, _02252520 ; =ov45_022574BC + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_022523D8: + ldr r0, [r4, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252400 + ldr r0, _02252524 ; =ov45_022574E0 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252400: + ldr r0, [r4, #0x118] + cmp r0, #0 + bge _02252420 + ldr r0, _02252528 ; =ov45_02257514 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252420: + ldr r1, [r4, #0x118] + ldr r0, [r4, #0x11c] + cmp r1, r0 + ble _02252444 + ldr r0, _0225252C ; =ov45_02257538 + ldr r1, _022524F8 ; =ov45_02257258 + ldr r2, _022524FC ; =ov45_02257234 + ldr r3, _02252500 ; =0x0000011B + bl __msl_assertion_failed +_02252444: + ldr r0, [r4] + mvn r1, #0 + cmp r0, r1 + beq _02252464 + mov r1, #2 + bl ov00_021FF82C + ldr r0, [r4] + bl ov00_021FF818 +_02252464: + mov r1, #2 + add r0, r4, #0x108 + str r1, [r4, #4] + bl ov45_02251C40 + add r0, r4, #0x114 + bl ov45_02251C40 + ldr r0, [r4, #0x328] + bl ov00_021EC3D8 + ldr r0, [r4, #0x32c] + bl ov00_021EC3D8 + ldr r0, [r4, #0x330] + bl ov00_021EC3D8 + ldr r0, [r4, #0x334] + bl ov00_021EC3D8 + ldr r0, [r4, #0x338] + bl ov00_021EC3D8 + ldr r0, [r4, #0x33c] + bl ov00_021EC3D8 + ldr r0, [r4, #0x340] + bl ov00_021EC3D8 + ldr r0, [r4, #0x344] + bl ov00_021EC3D8 + ldr r0, [r4, #0x34c] + mov r5, #0 + cmp r0, #0 + ble _022524E8 +_022524CC: + ldr r0, [r4, #0x348] + ldr r0, [r0, r5, lsl #2] + bl ov00_021EC3D8 + ldr r0, [r4, #0x34c] + add r5, r5, #1 + cmp r5, r0 + blt _022524CC +_022524E8: + ldr r0, [r4, #0x348] + bl ov00_021EC3D8 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022524F4: .word ov45_02257334 +_022524F8: .word ov45_02257258 +_022524FC: .word ov45_02257234 +_02252500: .word 0x0000011B +_02252504: .word ov45_02257344 +_02252508: .word ov45_022573C4 +_0225250C: .word ov45_022573E4 +_02252510: .word ov45_02257408 +_02252514: .word ov45_02257438 +_02252518: .word ov45_0225745C +_0225251C: .word ov45_0225749C +_02252520: .word ov45_022574BC +_02252524: .word ov45_022574E0 +_02252528: .word ov45_02257514 +_0225252C: .word ov45_02257538 + arm_func_end ov45_022522B4 + + arm_func_start ov45_02252530 +ov45_02252530: ; 0x02252530 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov ip, #0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + add r1, sp, #8 + add r2, sp, #4 + add r3, sp, #0 + str ip, [sp, #8] + str ip, [sp, #4] + str ip, [sp] + bl ov00_021FF59C + cmp r6, #0 + ldrne r0, [sp, #8] + strne r0, [r6] + cmp r5, #0 + ldrne r0, [sp, #4] + strne r0, [r5] + cmp r4, #0 + ldrne r0, [sp] + strne r0, [r4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov45_02252530 + + arm_func_start ov45_02252590 +ov45_02252590: ; 0x02252590 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r6, r0 + bne _022525B0 + ldr r0, _022527C0 ; =ov45_02257334 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022525B0: + ldr r0, [r6, #4] + cmp r0, #2 + bls _022525D0 + ldr r0, _022527CC ; =ov45_02257344 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022525D0: + adds r0, r6, #0x108 + bne _022525EC + ldr r0, _022527D0 ; =ov45_022573C4 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022525EC: + ldr r0, [r6, #0x110] + cmp r0, #0 + bge _0225260C + ldr r0, _022527D4 ; =ov45_022573E4 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_0225260C: + ldr r0, [r6, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252634 + ldr r0, _022527D8 ; =ov45_02257408 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_02252634: + ldr r0, [r6, #0x10c] + cmp r0, #0 + bge _02252654 + ldr r0, _022527DC ; =ov45_02257438 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_02252654: + ldr r1, [r6, #0x10c] + ldr r0, [r6, #0x110] + cmp r1, r0 + ble _02252678 + ldr r0, _022527E0 ; =ov45_0225745C + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_02252678: + adds r0, r6, #0x114 + bne _02252694 + ldr r0, _022527E4 ; =ov45_0225749C + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_02252694: + ldr r0, [r6, #0x11c] + cmp r0, #0 + bge _022526B4 + ldr r0, _022527E8 ; =ov45_022574BC + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022526B4: + ldr r0, [r6, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _022526DC + ldr r0, _022527EC ; =ov45_022574E0 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022526DC: + ldr r0, [r6, #0x118] + cmp r0, #0 + bge _022526FC + ldr r0, _022527F0 ; =ov45_02257514 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_022526FC: + ldr r1, [r6, #0x118] + ldr r0, [r6, #0x11c] + cmp r1, r0 + ble _02252720 + ldr r0, _022527F4 ; =ov45_02257538 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + mov r3, #0x154 + bl __msl_assertion_failed +_02252720: + ldr r0, [r6, #4] + cmp r0, #1 + beq _02252740 + ldr r0, _022527F8 ; =ov45_022575D8 + ldr r1, _022527C4 ; =ov45_02257258 + ldr r2, _022527C8 ; =ov45_0225720C + ldr r3, _022527FC ; =0x00000155 + bl __msl_assertion_failed +_02252740: + ldr r0, [r6, #0x118] + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r8, #0 + mov sb, #0x400 + mov r5, r8 + add r4, sp, #0 + mvn r7, #0 +_02252760: + ldr r0, [r6] + mov r1, r5 + mov r2, r4 + mov r3, r5 + bl ov45_02252530 + ldr r0, [sp] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r2, [r6, #0x118] + ldr r0, [r6] + cmp r2, #0x400 + ldr r1, [r6, #0x114] + movge r2, sb + mov r3, r8 + bl ov00_021FF970 + movs r1, r0 + cmpne r1, r7 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r6, #0x114 + bl ov45_02251DB4 + ldr r0, [r6, #0x118] + cmp r0, #0 + bgt _02252760 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_022527C0: .word ov45_02257334 +_022527C4: .word ov45_02257258 +_022527C8: .word ov45_0225720C +_022527CC: .word ov45_02257344 +_022527D0: .word ov45_022573C4 +_022527D4: .word ov45_022573E4 +_022527D8: .word ov45_02257408 +_022527DC: .word ov45_02257438 +_022527E0: .word ov45_0225745C +_022527E4: .word ov45_0225749C +_022527E8: .word ov45_022574BC +_022527EC: .word ov45_022574E0 +_022527F0: .word ov45_02257514 +_022527F4: .word ov45_02257538 +_022527F8: .word ov45_022575D8 +_022527FC: .word 0x00000155 + arm_func_end ov45_02252590 + + arm_func_start ov45_02252800 +ov45_02252800: ; 0x02252800 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + bne _02252820 + ldr r0, _02252A5C ; =ov45_02257334 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_02252820: + ldr r0, [sl, #4] + cmp r0, #2 + bls _02252840 + ldr r0, _02252A6C ; =ov45_02257344 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_02252840: + adds r0, sl, #0x108 + bne _0225285C + ldr r0, _02252A70 ; =ov45_022573C4 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_0225285C: + ldr r0, [sl, #0x110] + cmp r0, #0 + bge _0225287C + ldr r0, _02252A74 ; =ov45_022573E4 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_0225287C: + ldr r0, [sl, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _022528A4 + ldr r0, _02252A78 ; =ov45_02257408 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_022528A4: + ldr r0, [sl, #0x10c] + cmp r0, #0 + bge _022528C4 + ldr r0, _02252A7C ; =ov45_02257438 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_022528C4: + ldr r1, [sl, #0x10c] + ldr r0, [sl, #0x110] + cmp r1, r0 + ble _022528E8 + ldr r0, _02252A80 ; =ov45_0225745C + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_022528E8: + adds r0, sl, #0x114 + bne _02252904 + ldr r0, _02252A84 ; =ov45_0225749C + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_02252904: + ldr r0, [sl, #0x11c] + cmp r0, #0 + bge _02252924 + ldr r0, _02252A88 ; =ov45_022574BC + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_02252924: + ldr r0, [sl, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _0225294C + ldr r0, _02252A8C ; =ov45_022574E0 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_0225294C: + ldr r0, [sl, #0x118] + cmp r0, #0 + bge _0225296C + ldr r0, _02252A90 ; =ov45_02257514 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_0225296C: + ldr r1, [sl, #0x118] + ldr r0, [sl, #0x11c] + cmp r1, r0 + ble _02252990 + ldr r0, _02252A94 ; =ov45_02257538 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A68 ; =0x0000017A + bl __msl_assertion_failed +_02252990: + ldr r0, [sl, #4] + cmp r0, #1 + beq _022529B0 + ldr r0, _02252A98 ; =ov45_022575D8 + ldr r1, _02252A60 ; =ov45_02257258 + ldr r2, _02252A64 ; =ov45_02257220 + ldr r3, _02252A9C ; =0x0000017B + bl __msl_assertion_failed +_022529B0: + mov r7, #0x1000 + mov fp, r7 + mov r4, #0 + add r8, sp, #0 +_022529C0: + mov r2, #0 + ldr r0, [sl] + mov r1, r8 + mov r3, r2 + bl ov45_02252530 + ldr r0, [sp] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, r7 + add r0, sl, #0x108 + bl ov45_02251C50 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r6, [sl, #0x108] + ldr r5, [sl, #0x10c] + ldr r0, [sl] + mov r2, fp + mov r3, #0 + add r1, r6, r5 + bl ov00_021FF92C + mov sb, r0 + cmp sb, #0 + movle r0, #2 + strle r0, [sl, #4] + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl, #0x120] + cmp r0, #0 + beq _02252A40 + mov r1, sb + add r0, r6, r5 + add r2, sl, #0x124 + bl ov45_022495DC +_02252A40: + ldr r0, [sl, #0x10c] + add r1, r0, sb + str r1, [sl, #0x10c] + ldr r0, [sl, #0x108] + strb r4, [r0, r1] + b _022529C0 + arm_func_end ov45_02252800 + + arm_func_start ov45_02252A58 +ov45_02252A58: ; 0x02252A58 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_02252A5C: .word ov45_02257334 +_02252A60: .word ov45_02257258 +_02252A64: .word ov45_02257220 +_02252A68: .word 0x0000017A +_02252A6C: .word ov45_02257344 +_02252A70: .word ov45_022573C4 +_02252A74: .word ov45_022573E4 +_02252A78: .word ov45_02257408 +_02252A7C: .word ov45_02257438 +_02252A80: .word ov45_0225745C +_02252A84: .word ov45_0225749C +_02252A88: .word ov45_022574BC +_02252A8C: .word ov45_022574E0 +_02252A90: .word ov45_02257514 +_02252A94: .word ov45_02257538 +_02252A98: .word ov45_022575D8 +_02252A9C: .word 0x0000017B + arm_func_end ov45_02252A58 + + arm_func_start ov45_02252AA0 +ov45_02252AA0: ; 0x02252AA0 + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02252AC0 + ldr r0, _02252C70 ; =ov45_02257334 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252AC0: + ldr r0, [r4, #4] + cmp r0, #2 + bls _02252AE0 + ldr r0, _02252C80 ; =ov45_02257344 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252AE0: + adds r0, r4, #0x108 + bne _02252AFC + ldr r0, _02252C84 ; =ov45_022573C4 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252AFC: + ldr r0, [r4, #0x110] + cmp r0, #0 + bge _02252B1C + ldr r0, _02252C88 ; =ov45_022573E4 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252B1C: + ldr r0, [r4, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252B44 + ldr r0, _02252C8C ; =ov45_02257408 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252B44: + ldr r0, [r4, #0x10c] + cmp r0, #0 + bge _02252B64 + ldr r0, _02252C90 ; =ov45_02257438 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252B64: + ldr r1, [r4, #0x10c] + ldr r0, [r4, #0x110] + cmp r1, r0 + ble _02252B88 + ldr r0, _02252C94 ; =ov45_0225745C + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252B88: + adds r0, r4, #0x114 + bne _02252BA4 + ldr r0, _02252C98 ; =ov45_0225749C + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252BA4: + ldr r0, [r4, #0x11c] + cmp r0, #0 + bge _02252BC4 + ldr r0, _02252C9C ; =ov45_022574BC + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252BC4: + ldr r0, [r4, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252BEC + ldr r0, _02252CA0 ; =ov45_022574E0 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252BEC: + ldr r0, [r4, #0x118] + cmp r0, #0 + bge _02252C0C + ldr r0, _02252CA4 ; =ov45_02257514 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252C0C: + ldr r1, [r4, #0x118] + ldr r0, [r4, #0x11c] + cmp r1, r0 + ble _02252C30 + ldr r0, _02252CA8 ; =ov45_02257538 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252C7C ; =0x000001BE + bl __msl_assertion_failed +_02252C30: + ldr r0, [r4, #4] + cmp r0, #1 + beq _02252C50 + ldr r0, _02252CAC ; =ov45_022575D8 + ldr r1, _02252C74 ; =ov45_02257258 + ldr r2, _02252C78 ; =ov45_022571B4 + ldr r3, _02252CB0 ; =0x000001BF + bl __msl_assertion_failed +_02252C50: + ldr r0, [r4, #4] + cmp r0, #2 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov45_02252590 + mov r0, r4 + bl ov45_02252800 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02252C70: .word ov45_02257334 +_02252C74: .word ov45_02257258 +_02252C78: .word ov45_022571B4 +_02252C7C: .word 0x000001BE +_02252C80: .word ov45_02257344 +_02252C84: .word ov45_022573C4 +_02252C88: .word ov45_022573E4 +_02252C8C: .word ov45_02257408 +_02252C90: .word ov45_02257438 +_02252C94: .word ov45_0225745C +_02252C98: .word ov45_0225749C +_02252C9C: .word ov45_022574BC +_02252CA0: .word ov45_022574E0 +_02252CA4: .word ov45_02257514 +_02252CA8: .word ov45_02257538 +_02252CAC: .word ov45_022575D8 +_02252CB0: .word 0x000001BF + arm_func_end ov45_02252AA0 + + arm_func_start ov45_02252CB4 +ov45_02252CB4: ; 0x02252CB4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r8, r0 + mov r7, r1 + bne _02252CD8 + ldr r0, _02252F2C ; =ov45_02257334 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252CD8: + ldr r0, [r8, #4] + cmp r0, #2 + bls _02252CF8 + ldr r0, _02252F38 ; =ov45_02257344 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252CF8: + adds r0, r8, #0x108 + bne _02252D14 + ldr r0, _02252F3C ; =ov45_022573C4 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252D14: + ldr r0, [r8, #0x110] + cmp r0, #0 + bge _02252D34 + ldr r0, _02252F40 ; =ov45_022573E4 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252D34: + ldr r0, [r8, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252D5C + ldr r0, _02252F44 ; =ov45_02257408 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252D5C: + ldr r0, [r8, #0x10c] + cmp r0, #0 + bge _02252D7C + ldr r0, _02252F48 ; =ov45_02257438 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252D7C: + ldr r1, [r8, #0x10c] + ldr r0, [r8, #0x110] + cmp r1, r0 + ble _02252DA0 + ldr r0, _02252F4C ; =ov45_0225745C + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252DA0: + adds r0, r8, #0x114 + bne _02252DBC + ldr r0, _02252F50 ; =ov45_0225749C + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252DBC: + ldr r0, [r8, #0x11c] + cmp r0, #0 + bge _02252DDC + ldr r0, _02252F54 ; =ov45_022574BC + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252DDC: + ldr r0, [r8, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02252E04 + ldr r0, _02252F58 ; =ov45_022574E0 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252E04: + ldr r0, [r8, #0x118] + cmp r0, #0 + bge _02252E24 + ldr r0, _02252F5C ; =ov45_02257514 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252E24: + ldr r1, [r8, #0x118] + ldr r0, [r8, #0x11c] + cmp r1, r0 + ble _02252E48 + ldr r0, _02252F60 ; =ov45_02257538 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + mov r3, #0x1d8 + bl __msl_assertion_failed +_02252E48: + ldr r0, [r8, #4] + cmp r0, #1 + beq _02252E68 + ldr r0, _02252F64 ; =ov45_022575D8 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + ldr r3, _02252F68 ; =0x000001D9 + bl __msl_assertion_failed +_02252E68: + cmp r7, #0 + bne _02252E84 + ldr r0, _02252F6C ; =ov45_02257248 + ldr r1, _02252F30 ; =ov45_02257258 + ldr r2, _02252F34 ; =ov45_02257154 + ldr r3, _02252F70 ; =0x000001DA + bl __msl_assertion_failed +_02252E84: + ldr r0, [r8, #4] + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + bl strlen + mov r6, r0 + add r0, r8, #0x114 + add r1, r6, #2 + bl ov45_02251C50 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r5, [r8, #0x114] + ldr r4, [r8, #0x118] + mov r1, r7 + mov r2, r6 + add r0, r5, r4 + bl memcpy + ldr r0, [r8, #0x118] + mov r2, #0xd + add r3, r0, r6 + add r0, r3, #1 + str r0, [r8, #0x118] + ldr r0, [r8, #0x114] + mov r1, #0xa + strb r2, [r0, r3] + ldr r2, [r8, #0x118] + add r0, r2, #1 + str r0, [r8, #0x118] + ldr r0, [r8, #0x114] + strb r1, [r0, r2] + ldr r0, [r8, #0x120] + cmp r0, #0 + beq _02252F24 + add r2, r8, #0x26 + add r0, r5, r4 + add r1, r6, #2 + add r2, r2, #0x200 + bl ov45_022495DC +_02252F24: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02252F2C: .word ov45_02257334 +_02252F30: .word ov45_02257258 +_02252F34: .word ov45_02257154 +_02252F38: .word ov45_02257344 +_02252F3C: .word ov45_022573C4 +_02252F40: .word ov45_022573E4 +_02252F44: .word ov45_02257408 +_02252F48: .word ov45_02257438 +_02252F4C: .word ov45_0225745C +_02252F50: .word ov45_0225749C +_02252F54: .word ov45_022574BC +_02252F58: .word ov45_022574E0 +_02252F5C: .word ov45_02257514 +_02252F60: .word ov45_02257538 +_02252F64: .word ov45_022575D8 +_02252F68: .word 0x000001D9 +_02252F6C: .word ov45_02257248 +_02252F70: .word 0x000001DA + arm_func_end ov45_02252CB4 + + arm_func_start ov45_02252F74 +ov45_02252F74: ; 0x02252F74 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02252F98 + ldr r0, _02253194 ; =ov45_02257334 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02252F98: + ldr r0, [r4, #4] + cmp r0, #2 + bls _02252FB8 + ldr r0, _022531A4 ; =ov45_02257344 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02252FB8: + adds r0, r4, #0x108 + bne _02252FD4 + ldr r0, _022531A8 ; =ov45_022573C4 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02252FD4: + ldr r0, [r4, #0x110] + cmp r0, #0 + bge _02252FF4 + ldr r0, _022531AC ; =ov45_022573E4 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02252FF4: + ldr r0, [r4, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _0225301C + ldr r0, _022531B0 ; =ov45_02257408 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_0225301C: + ldr r0, [r4, #0x10c] + cmp r0, #0 + bge _0225303C + ldr r0, _022531B4 ; =ov45_02257438 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_0225303C: + ldr r1, [r4, #0x10c] + ldr r0, [r4, #0x110] + cmp r1, r0 + ble _02253060 + ldr r0, _022531B8 ; =ov45_0225745C + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02253060: + adds r0, r4, #0x114 + bne _0225307C + ldr r0, _022531BC ; =ov45_0225749C + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_0225307C: + ldr r0, [r4, #0x11c] + cmp r0, #0 + bge _0225309C + ldr r0, _022531C0 ; =ov45_022574BC + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_0225309C: + ldr r0, [r4, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _022530C4 + ldr r0, _022531C4 ; =ov45_022574E0 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_022530C4: + ldr r0, [r4, #0x118] + cmp r0, #0 + bge _022530E4 + ldr r0, _022531C8 ; =ov45_02257514 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_022530E4: + ldr r1, [r4, #0x118] + ldr r0, [r4, #0x11c] + cmp r1, r0 + ble _02253108 + ldr r0, _022531CC ; =ov45_02257538 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + ldr r3, _022531A0 ; =0x00000213 + bl __msl_assertion_failed +_02253108: + ldr r0, [r4, #4] + cmp r0, #1 + beq _02253128 + ldr r0, _022531D0 ; =ov45_022575D8 + ldr r1, _02253198 ; =ov45_02257258 + ldr r2, _0225319C ; =ov45_022571A4 + mov r3, #0x214 + bl __msl_assertion_failed +_02253128: + ldr r0, [r4, #4] + cmp r0, #2 + moveq r0, #1 + ldmeqia sp!, {r4, lr} + addeq sp, sp, #0x10 + bxeq lr + add r0, sp, #0xc + bic r2, r0, #3 + ldr r1, [sp, #0xc] + ldr r0, _022531D4 ; =ov45_022577F8 + add r2, r2, #4 + bl vsprintf + mvn r1, #0 + cmp r0, r1 + ldreq r0, _022531D4 ; =ov45_022577F8 + moveq r1, #0 + streqb r1, [r0, #0xfff] + beq _0225317C + ldr r1, _022531D4 ; =ov45_022577F8 + mov r2, #0 + strb r2, [r1, r0] +_0225317C: + ldr r1, _022531D4 ; =ov45_022577F8 + mov r0, r4 + bl ov45_02252CB4 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .balign 4, 0 +_02253194: .word ov45_02257334 +_02253198: .word ov45_02257258 +_0225319C: .word ov45_022571A4 +_022531A0: .word 0x00000213 +_022531A4: .word ov45_02257344 +_022531A8: .word ov45_022573C4 +_022531AC: .word ov45_022573E4 +_022531B0: .word ov45_02257408 +_022531B4: .word ov45_02257438 +_022531B8: .word ov45_0225745C +_022531BC: .word ov45_0225749C +_022531C0: .word ov45_022574BC +_022531C4: .word ov45_022574E0 +_022531C8: .word ov45_02257514 +_022531CC: .word ov45_02257538 +_022531D0: .word ov45_022575D8 +_022531D4: .word ov45_022577F8 + arm_func_end ov45_02252F74 + + arm_func_start ov45_022531D8 +ov45_022531D8: ; 0x022531D8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + movs sl, r0 + ldrnesb r0, [sl] + mov r4, #0 + mov sb, r1 + mov r5, r4 + mov r6, r4 + mov r7, r4 + mov r8, r4 + cmpne r0, #0 + bne _02253220 + ldr r0, _02253364 ; =ov45_022575FC + ldr r1, _02253368 ; =ov45_02257258 + ldr r2, _0225336C ; =ov45_02257148 + ldr r3, _02253370 ; =0x00000232 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02253220: + ldrsb r0, [sl] + mov r1, sl + cmp r0, #0 + beq _0225329C +_02253230: + ldrsb r0, [r1] + cmp r0, #0x21 + addne r1, r1, #1 + addne r6, r6, #1 + bne _02253290 + ldrsb r0, [r1, #1]! + mov r4, r1 + cmp r0, #0 + beq _02253290 +_02253254: + cmp r0, #0x40 + addne r1, r1, #1 + addne r7, r7, #1 + bne _02253284 + ldrsb r0, [r1, #1]! + mov r5, r1 + cmp r0, #0 + beq _02253284 +_02253274: + ldrsb r0, [r1, #1]! + add r8, r8, #1 + cmp r0, #0 + bne _02253274 +_02253284: + ldrsb r0, [r1] + cmp r0, #0 + bne _02253254 +_02253290: + ldrsb r0, [r1] + cmp r0, #0 + bne _02253230 +_0225329C: + cmp r6, #0 + beq _022532D4 + add r0, r6, #1 + bl ov00_021EC3A8 + str r0, [sb, #8] + cmp r0, #0 + beq _022532DC + mov r1, sl + mov r2, r6 + bl memcpy + ldr r0, [sb, #8] + mov r1, #0 + strb r1, [r0, r6] + b _022532DC +_022532D4: + mov r0, #0 + str r0, [sb, #8] +_022532DC: + cmp r7, #0 + beq _02253314 + add r0, r7, #1 + bl ov00_021EC3A8 + str r0, [sb, #0xc] + cmp r0, #0 + beq _0225331C + mov r1, r4 + mov r2, r7 + bl memcpy + ldr r0, [sb, #0xc] + mov r1, #0 + strb r1, [r0, r7] + b _0225331C +_02253314: + mov r0, #0 + str r0, [sb, #0xc] +_0225331C: + cmp r8, #0 + beq _02253354 + add r0, r8, #1 + bl ov00_021EC3A8 + str r0, [sb, #0x10] + cmp r0, #0 + beq _0225335C + mov r1, r5 + mov r2, r8 + bl memcpy + ldr r0, [sb, #0x10] + mov r1, #0 + strb r1, [r0, r8] + b _0225335C +_02253354: + mov r0, #0 + str r0, [sb, #0x10] +_0225335C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02253364: .word ov45_022575FC +_02253368: .word ov45_02257258 +_0225336C: .word ov45_02257148 +_02253370: .word 0x00000232 + arm_func_end ov45_022531D8 + + arm_func_start ov45_02253374 +ov45_02253374: ; 0x02253374 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r1, [r5, #0x24] + mov r6, r0 + add r1, r1, #1 + ldr r0, [r5, #0x20] + mov r1, r1, lsl #2 + bl ov00_021EC3BC + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + str r0, [r5, #0x20] + mov r0, r6 + bl strlen + add r0, r0, #1 + bl ov00_021EC3A8 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r6 + bl strcpy + ldr r2, [r5, #0x24] + mov r0, #1 + add r1, r2, #1 + str r1, [r5, #0x24] + ldr r1, [r5, #0x20] + str r4, [r1, r2, lsl #2] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov45_02253374 + + arm_func_start ov45_022533E4 +ov45_022533E4: ; 0x022533E4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r6, r0 + mov r5, r1 + bne _02253408 + ldr r0, _02253508 ; =ov45_02257600 + ldr r1, _0225350C ; =ov45_02257258 + ldr r2, _02253510 ; =ov45_02257184 + ldr r3, _02253514 ; =0x000002A1 + bl __msl_assertion_failed +_02253408: + cmp r5, #0 + bne _02253424 + ldr r0, _02253518 ; =ov45_02257610 + ldr r1, _0225350C ; =ov45_02257258 + ldr r2, _02253510 ; =ov45_02257184 + ldr r3, _0225351C ; =0x000002A2 + bl __msl_assertion_failed +_02253424: + mov r0, r6 + bl strlen + add r0, r0, #1 + bl ov00_021EC3A8 + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, r6 + bl strcpy + ldrsb r0, [r4] + cmp r0, #0x3a + bne _02253464 + mov r0, #0 + strb r0, [r4] + add r8, r4, #1 + b _0225347C +_02253464: + ldr r1, _02253520 ; =ov45_02257620 + mov r0, r4 + bl strstr + movs r8, r0 + movne r0, #0 + strneb r0, [r8], #2 +_0225347C: + ldr r1, _02253524 ; =ov45_02257624 + mov r0, r4 + bl strtok + cmp r0, #0 + beq _022534CC + ldr r6, _02253524 ; =ov45_02257624 + mov r7, #0 +_02253498: + mov r1, r5 + bl ov45_02253374 + cmp r0, #0 + bne _022534B8 + mov r0, r4 + bl ov00_021EC3D8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022534B8: + mov r0, r7 + mov r1, r6 + bl strtok + cmp r0, #0 + bne _02253498 +_022534CC: + cmp r8, #0 + beq _022534F8 + mov r0, r8 + mov r1, r5 + bl ov45_02253374 + cmp r0, #0 + bne _022534F8 + mov r0, r4 + bl ov00_021EC3D8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022534F8: + mov r0, r4 + bl ov00_021EC3D8 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02253508: .word ov45_02257600 +_0225350C: .word ov45_02257258 +_02253510: .word ov45_02257184 +_02253514: .word 0x000002A1 +_02253518: .word ov45_02257610 +_0225351C: .word 0x000002A2 +_02253520: .word ov45_02257620 +_02253524: .word ov45_02257624 + arm_func_end ov45_022533E4 + + arm_func_start ov45_02253528 +ov45_02253528: ; 0x02253528 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + movs sb, r1 + mov sl, r0 + ldrnesb r0, [sb] + mov r5, #0 + mov r6, r5 + mov r7, r5 + mov r8, r5 + cmpne r0, #0 + bne _0225356C + ldr r0, _0225395C ; =ov45_022575FC + ldr r1, _02253960 ; =ov45_02257258 + ldr r2, _02253964 ; =ov45_022571C4 + mov r3, #0x2e4 + bl __msl_assertion_failed + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0225356C: + mov r0, sb + bl strlen + mov r4, r0 + add r0, r4, #1 + bl ov00_021EC3A8 + str r0, [sl, #0x328] + cmp r0, #0 + moveq r0, r5 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sb + mov r2, r4 + bl memcpy + ldr r0, [sl, #0x328] + mov r1, r5 + strb r1, [r0, r4] + b _022535B0 +_022535AC: + add sb, sb, #1 +_022535B0: + ldrsb r0, [sb] + cmp r0, #0xa + cmpne r0, #0xd + beq _022535AC + cmp r0, #0x3a + bne _022535F8 + add sb, sb, #1 + str sb, [sl, #0x32c] + ldrsb r0, [sb] + cmp r0, #0 + beq _022535F8 + b _022535E8 +_022535E0: + add r5, r5, #1 + add sb, sb, #1 +_022535E8: + ldrsb r0, [sb] + cmp r0, #0x20 + cmpne r0, #0 + bne _022535E0 +_022535F8: + cmp r0, #0x20 + bne _0225360C +_02253600: + ldrsb r0, [sb, #1]! + cmp r0, #0x20 + beq _02253600 +_0225360C: + cmp r0, #0 + beq _02253634 + str sb, [sl, #0x33c] + b _02253624 +_0225361C: + add r6, r6, #1 + add sb, sb, #1 +_02253624: + ldrsb r0, [sb] + cmp r0, #0x20 + cmpne r0, #0 + bne _0225361C +_02253634: + cmp r0, #0x20 + bne _02253648 +_0225363C: + ldrsb r0, [sb, #1]! + cmp r0, #0x20 + beq _0225363C +_02253648: + cmp r0, #0x3a + cmpne r0, #0 + beq _02253674 + str sb, [sl, #0x340] + b _02253664 +_0225365C: + add r7, r7, #1 + add sb, sb, #1 +_02253664: + ldrsb r0, [sb] + cmp r0, #0x20 + cmpne r0, #0 + bne _0225365C +_02253674: + cmp r0, #0x20 + bne _02253688 +_0225367C: + ldrsb r0, [sb, #1]! + cmp r0, #0x20 + beq _0225367C +_02253688: + cmp r0, #0 + strne sb, [sl, #0x344] + ldrnesb r0, [sb] + cmpne r0, #0 + beq _022536AC +_0225369C: + ldrsb r0, [sb, #1]! + add r8, r8, #1 + cmp r0, #0 + bne _0225369C +_022536AC: + cmp r5, #0 + beq _02253730 + ldr r4, [sl, #0x32c] + add r0, r5, #1 + bl ov00_021EC3A8 + str r0, [sl, #0x32c] + cmp r0, #0 + beq _022536E4 + mov r1, r4 + mov r2, r5 + bl memcpy + ldr r0, [sl, #0x32c] + mov r1, #0 + strb r1, [r0, r5] +_022536E4: + ldr r0, [sl, #0x32c] + add r1, sl, #0x328 + bl ov45_022531D8 + cmp r0, #0 + bne _02253744 + ldr r0, [sl, #0x328] + cmp r0, #0 + beq _02253710 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x328] +_02253710: + ldr r0, [sl, #0x32c] + cmp r0, #0 + beq _02253728 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x32c] +_02253728: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02253730: + mov r0, #0 + str r0, [sl, #0x32c] + str r0, [sl, #0x330] + str r0, [sl, #0x334] + str r0, [sl, #0x338] +_02253744: + cmp r7, #0 + beq _022537E0 + ldr r0, [sl, #0x340] + add r1, sl, #0x328 + bl ov45_022533E4 + cmp r0, #0 + bne _02253888 + ldr r0, [sl, #0x328] + cmp r0, #0 + beq _02253778 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x328] +_02253778: + ldr r0, [sl, #0x32c] + cmp r0, #0 + beq _02253790 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x32c] +_02253790: + ldr r0, [sl, #0x330] + cmp r0, #0 + beq _022537A8 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x330] +_022537A8: + ldr r0, [sl, #0x334] + cmp r0, #0 + beq _022537C0 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x334] +_022537C0: + ldr r0, [sl, #0x338] + cmp r0, #0 + beq _022537D8 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x338] +_022537D8: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_022537E0: + cmp r8, #0 + beq _0225387C + ldr r0, [sl, #0x344] + add r1, sl, #0x328 + bl ov45_022533E4 + cmp r0, #0 + bne _02253888 + ldr r0, [sl, #0x328] + cmp r0, #0 + beq _02253814 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x328] +_02253814: + ldr r0, [sl, #0x32c] + cmp r0, #0 + beq _0225382C + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x32c] +_0225382C: + ldr r0, [sl, #0x330] + cmp r0, #0 + beq _02253844 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x330] +_02253844: + ldr r0, [sl, #0x334] + cmp r0, #0 + beq _0225385C + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x334] +_0225385C: + ldr r0, [sl, #0x338] + cmp r0, #0 + beq _02253874 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x338] +_02253874: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_0225387C: + mov r0, #0 + str r0, [sl, #0x348] + str r0, [sl, #0x34c] +_02253888: + cmp r8, #0 + beq _022538C4 + ldr r4, [sl, #0x344] + add r0, r8, #1 + bl ov00_021EC3A8 + str r0, [sl, #0x344] + cmp r0, #0 + beq _022538CC + mov r1, r4 + mov r2, r8 + bl memcpy + ldr r0, [sl, #0x344] + mov r1, #0 + strb r1, [r0, r8] + b _022538CC +_022538C4: + mov r0, #0 + str r0, [sl, #0x344] +_022538CC: + cmp r6, #0 + beq _02253908 + ldr r4, [sl, #0x33c] + add r0, r6, #1 + bl ov00_021EC3A8 + str r0, [sl, #0x33c] + cmp r0, #0 + beq _02253910 + mov r1, r4 + mov r2, r6 + bl memcpy + ldr r0, [sl, #0x33c] + mov r1, #0 + strb r1, [r0, r6] + b _02253910 +_02253908: + mov r0, #0 + str r0, [sl, #0x33c] +_02253910: + cmp r7, #0 + beq _0225394C + ldr r4, [sl, #0x340] + add r0, r7, #1 + bl ov00_021EC3A8 + str r0, [sl, #0x340] + cmp r0, #0 + beq _02253954 + mov r1, r4 + mov r2, r7 + bl memcpy + ldr r0, [sl, #0x340] + mov r1, #0 + strb r1, [r0, r7] + b _02253954 +_0225394C: + mov r0, #0 + str r0, [sl, #0x340] +_02253954: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0225395C: .word ov45_022575FC +_02253960: .word ov45_02257258 +_02253964: .word ov45_022571C4 + arm_func_end ov45_02253528 + + arm_func_start ov45_02253968 +ov45_02253968: ; 0x02253968 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + ldr r5, [sl, #0x108] + ldrsb r0, [r5] + cmp r0, #0 + beq _02253B54 + b _02253988 +_02253984: + add r5, r5, #1 +_02253988: + ldrsb r0, [r5] + cmp r0, #0xd + cmpne r0, #0xa + beq _02253984 + cmp r0, #0 + beq _02253B54 + mov r6, r5 + mov r7, r5 + b _022539B8 +_022539AC: + cmp r0, #0x20 + movne r7, r6 + add r6, r6, #1 +_022539B8: + ldrsb r0, [r6] + cmp r0, #0xa + cmpne r0, #0xd + cmpne r0, #0 + bne _022539AC + cmp r0, #0 + beq _02253B54 + ldrsb r8, [r7, #1] + mov r0, #0 + strb r0, [r7, #1] + ldr r0, [sl, #0x328] + cmp r0, #0 + beq _022539F8 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x328] +_022539F8: + ldr r0, [sl, #0x32c] + cmp r0, #0 + beq _02253A10 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x32c] +_02253A10: + ldr r0, [sl, #0x330] + cmp r0, #0 + beq _02253A28 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x330] +_02253A28: + ldr r0, [sl, #0x334] + cmp r0, #0 + beq _02253A40 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x334] +_02253A40: + ldr r0, [sl, #0x338] + cmp r0, #0 + beq _02253A58 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x338] +_02253A58: + ldr r0, [sl, #0x33c] + cmp r0, #0 + beq _02253A70 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x33c] +_02253A70: + ldr r0, [sl, #0x340] + cmp r0, #0 + beq _02253A88 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x340] +_02253A88: + ldr r0, [sl, #0x344] + cmp r0, #0 + beq _02253AA0 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x344] +_02253AA0: + ldr r0, [sl, #0x34c] + mov sb, #0 + cmp r0, #0 + ble _02253AE0 + mov r4, sb +_02253AB4: + ldr r0, [sl, #0x348] + ldr r0, [r0, sb, lsl #2] + cmp r0, #0 + beq _02253AD0 + bl ov00_021EC3D8 + ldr r0, [sl, #0x348] + str r4, [r0, sb, lsl #2] +_02253AD0: + ldr r0, [sl, #0x34c] + add sb, sb, #1 + cmp sb, r0 + blt _02253AB4 +_02253AE0: + ldr r0, [sl, #0x348] + cmp r0, #0 + beq _02253AF8 + bl ov00_021EC3D8 + mov r0, #0 + str r0, [sl, #0x348] +_02253AF8: + mov r1, #0 + add r0, sl, #0x328 + mov r2, #0x28 + str r1, [sl, #0x34c] + bl memset + mov r0, sl + mov r1, r5 + bl ov45_02253528 + cmp r0, #0 + bne _02253B38 + add r0, sl, #0x328 + mov r1, #0 + mov r2, #0x28 + bl memset + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02253B38: + strb r8, [r7, #1] + ldr r1, [sl, #0x108] + add r0, sl, #0x108 + sub r1, r6, r1 + bl ov45_02251DB4 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02253B54: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov45_02253968 + + arm_func_start ov45_02253B5C +ov45_02253B5C: ; 0x02253B5C + stmdb sp!, {r4, lr} + movs r4, r0 + bne _02253B7C + ldr r0, _02253D14 ; =ov45_02257334 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253B7C: + ldr r0, [r4, #4] + cmp r0, #2 + bls _02253B9C + ldr r0, _02253D24 ; =ov45_02257344 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253B9C: + adds r0, r4, #0x108 + bne _02253BB8 + ldr r0, _02253D28 ; =ov45_022573C4 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253BB8: + ldr r0, [r4, #0x110] + cmp r0, #0 + bge _02253BD8 + ldr r0, _02253D2C ; =ov45_022573E4 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253BD8: + ldr r0, [r4, #0x110] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02253C00 + ldr r0, _02253D30 ; =ov45_02257408 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253C00: + ldr r0, [r4, #0x10c] + cmp r0, #0 + bge _02253C20 + ldr r0, _02253D34 ; =ov45_02257438 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253C20: + ldr r1, [r4, #0x10c] + ldr r0, [r4, #0x110] + cmp r1, r0 + ble _02253C44 + ldr r0, _02253D38 ; =ov45_0225745C + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253C44: + adds r0, r4, #0x114 + bne _02253C60 + ldr r0, _02253D3C ; =ov45_0225749C + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253C60: + ldr r0, [r4, #0x11c] + cmp r0, #0 + bge _02253C80 + ldr r0, _02253D40 ; =ov45_022574BC + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253C80: + ldr r0, [r4, #0x11c] + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #19 + adds r0, r1, r0, ror #19 + beq _02253CA8 + ldr r0, _02253D44 ; =ov45_022574E0 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253CA8: + ldr r0, [r4, #0x118] + cmp r0, #0 + bge _02253CC8 + ldr r0, _02253D48 ; =ov45_02257514 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253CC8: + ldr r1, [r4, #0x118] + ldr r0, [r4, #0x11c] + cmp r1, r0 + ble _02253CEC + ldr r0, _02253D4C ; =ov45_02257538 + ldr r1, _02253D18 ; =ov45_02257258 + ldr r2, _02253D1C ; =ov45_02257164 + ldr r3, _02253D20 ; =0x000003E9 + bl __msl_assertion_failed +_02253CEC: + ldr r0, [r4, #0x10c] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ov45_02253968 + cmp r0, #0 + addne r0, r4, #0x328 + moveq r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_02253D14: .word ov45_02257334 +_02253D18: .word ov45_02257258 +_02253D1C: .word ov45_02257164 +_02253D20: .word 0x000003E9 +_02253D24: .word ov45_02257344 +_02253D28: .word ov45_022573C4 +_02253D2C: .word ov45_022573E4 +_02253D30: .word ov45_02257408 +_02253D34: .word ov45_02257438 +_02253D38: .word ov45_0225745C +_02253D3C: .word ov45_0225749C +_02253D40: .word ov45_022574BC +_02253D44: .word ov45_022574E0 +_02253D48: .word ov45_02257514 +_02253D4C: .word ov45_02257538 + arm_func_end ov45_02253B5C + + arm_func_start ov45_02253D50 +ov45_02253D50: ; 0x02253D50 + ldr r1, _02253D84 ; =0xAAAAAAAB + mov r3, #3 + umull r1, r2, r0, r1 + mov r2, r2, lsr #1 + umull r1, r2, r3, r2 + subs r2, r0, r1 + ldr r1, _02253D84 ; =0xAAAAAAAB + movne r3, #1 + umull r1, r2, r0, r1 + moveq r3, #0 + add r0, r3, r2, lsr #1 + mov r0, r0, lsl #2 + bx lr + .balign 4, 0 +_02253D84: .word 0xAAAAAAAB + arm_func_end ov45_02253D50 + + arm_func_start ov45_02253D88 +ov45_02253D88: ; 0x02253D88 + ldr r1, _02253D98 ; =ov45_022587F8 + orr r0, r0, r0, lsl #16 + str r0, [r1] + bx lr + .balign 4, 0 +_02253D98: .word ov45_022587F8 + arm_func_end ov45_02253D88 + + arm_func_start ov45_02253D9C +ov45_02253D9C: ; 0x02253D9C + stmdb sp!, {r3, lr} + ldr r1, _02253DD4 ; =ov45_0225762C + ldr r0, _02253DD8 ; =ov45_022587F8 + ldr r3, [r1, #0x48] + ldr r2, [r1, #0x44] + ldr r0, [r0] + ldr r1, [r1, #0x4c] + mla r0, r2, r0, r3 + bl _u32_div_f + ldr r0, _02253DD8 ; =ov45_022587F8 + mov r2, r1, asr #0x10 + str r1, [r0] + and r0, r2, #0xff + ldmia sp!, {r3, pc} + .balign 4, 0 +_02253DD4: .word ov45_0225762C +_02253DD8: .word ov45_022587F8 + arm_func_end ov45_02253D9C + + arm_func_start ov45_02253DDC +ov45_02253DDC: ; 0x02253DDC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _02253ECC ; =ov45_0225762C + mov ip, #0 + str ip, [r4, #0xc] + ldr r4, [sp, #0x18] + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl strlen + cmp r0, #0x20 + movhs r0, #0 + ldmhsia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + bl strlen + cmp r0, #0x14 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + sub r0, r6, #5 + tst r0, #7 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + tst r5, #1 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r2, #0 + mov r1, r2 +_02253E48: + mov r0, r4, lsr r1 + and r0, r0, #1 + cmp r0, #1 + add r1, r1, #1 + addeq r2, r2, #1 + cmp r1, #0x20 + blt _02253E48 + cmp r2, #1 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _02253ED0 ; =ov45_0225763C + mov r1, r8 + mov r2, #0x20 + bl strncpy + ldr r3, _02253ED4 ; =ov45_0225765C + mov r2, #0xa +_02253E88: + ldrb r1, [r7] + ldrb r0, [r7, #1] + add r7, r7, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _02253E88 + ldr r1, _02253ECC ; =ov45_0225762C + ldr r0, [sp, #0x1c] + str r6, [r1, #0x44] + str r5, [r1, #0x48] + str r4, [r1, #0x4c] + str r0, [r1, #0x50] + mov r0, #1 + str r0, [r1, #0xc] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_02253ECC: .word ov45_0225762C +_02253ED0: .word ov45_0225763C +_02253ED4: .word ov45_0225765C + arm_func_end ov45_02253DDC + + arm_func_start ov45_02253ED8 +ov45_02253ED8: ; 0x02253ED8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x50 + ldr r4, _0225407C ; =ov45_02254DF4 + add r3, sp, #0 + mov r6, r0 + mov r5, r1 + mov r2, #8 +_02253EF4: + ldrb r1, [r4] + ldrb r0, [r4, #1] + add r4, r4, #2 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + bne _02253EF4 + ldrb r0, [r4] + cmp r5, #0x28 + addle sp, sp, #0x50 + strb r0, [r3] + movle r0, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, pc} + sub r4, r5, #0x28 + mov r0, r4 + bl ov45_02253D50 + add r1, r0, #0x29 + mov r0, #7 + bl ov00_021EC2A8 + movs r7, r0 + addeq sp, sp, #0x50 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r8, _02254080 ; =ov45_0225765C + mov r3, r7 + mov r2, #0xa +_02253F60: + ldrb r1, [r8] + ldrb r0, [r8, #1] + add r8, r8, #2 + subs r2, r2, #1 + strb r1, [r3] + strb r0, [r3, #1] + add r3, r3, #2 + bne _02253F60 + mov r0, r6 + mov r2, r4 + add r1, r7, #0x14 + mov r3, #2 + bl ov00_021FFC18 + mov r0, r4 + bl ov45_02253D50 + add r1, r7, #0x14 + ldr r3, _02254080 ; =ov45_0225765C + add r8, r1, r0 + mov r2, #0xa +_02253FAC: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + subs r2, r2, #1 + strb r1, [r8] + strb r0, [r8, #1] + add r8, r8, #2 + bne _02253FAC + mov r0, r4 + bl ov45_02253D50 + mov r2, r0 + add r0, sp, #0x11 + mov r1, r7 + add r2, r2, #0x28 + bl MATH_CalcSHA1 + mov r1, r7 + mov r0, #7 + mov r2, #0 + bl ov00_021EC2EC + mov r2, #0 + add r3, sp, #0x11 + mov r7, r2 + add r1, sp, #0x25 + add r8, sp, #0 +_0225400C: + ldrb ip, [r3], #1 + add r2, r2, #1 + add r0, r1, r7 + mov lr, ip, asr #4 + and ip, ip, #0xf + ldrsb lr, [r8, lr] + ldrsb ip, [r8, ip] + cmp r2, #0x14 + strb lr, [r1, r7] + strb ip, [r0, #1] + add r7, r7, #2 + blt _0225400C + sub r0, r5, #0x28 + mov r3, #0 + add r0, r6, r0 + mov r2, #0x28 + strb r3, [sp, #0x4d] + bl strncmp + cmp r0, #0 + addne sp, sp, #0x50 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r1, _02254084 ; =ov45_0225762C + mov r0, #1 + str r6, [r1, #0x68] + str r4, [r1, #0x6c] + add sp, sp, #0x50 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0225407C: .word ov45_02254DF4 +_02254080: .word ov45_0225765C +_02254084: .word ov45_0225762C + arm_func_end ov45_02253ED8 + + arm_func_start ov45_02254088 +ov45_02254088: ; 0x02254088 + bx lr + arm_func_end ov45_02254088 + + arm_func_start ov45_0225408C +ov45_0225408C: ; 0x0225408C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x48 + ldr r3, _022542DC ; =ov45_0225762C + mvn r4, #0 + str r4, [r3, #8] + ldr ip, [r3] + mov r5, r0 + cmp ip, #1 + mov r4, r1 + addeq sp, sp, #0x48 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r2, #0 + bne _022542D0 + cmp ip, #5 + beq _022540D8 + cmp ip, #7 + beq _02254200 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_022540D8: + cmp r4, #0x20 + bne _022541EC + ldr r0, [r3, #0x58] + ldr r3, _022542E0 ; =ov45_02254E05 + add lr, sp, #0 + add r4, r0, #0x14 + mov r2, #8 +_022540F4: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [lr] + strb r0, [lr, #1] + add lr, lr, #2 + subs r2, r2, #1 + bne _022540F4 + ldrb r0, [r3] + ldr r3, _022542E4 ; =ov45_0225765C + add ip, sp, #0x11 + strb r0, [lr] + mov r2, #0xa +_02254128: + ldrb r1, [r3] + ldrb r0, [r3, #1] + add r3, r3, #2 + strb r1, [ip] + strb r0, [ip, #1] + add ip, ip, #2 + subs r2, r2, #1 + bne _02254128 + add r0, sp, #0x25 + mov r1, r5 + mov r2, #0x20 + bl memcpy + add r1, sp, #0x11 + mov r0, r4 + mov r2, #0x34 + bl MATH_CalcSHA1 + mov r0, #0 + ldr r2, _022542DC ; =ov45_0225762C + mov r1, r0 + add lr, sp, #0 +_02254178: + ldrb ip, [r4, r0] + ldr r3, [r2, #0x58] + mov ip, ip, asr #4 + ldrsb ip, [lr, ip] + strb ip, [r3, r1] + ldrb ip, [r4, r0] + ldr r3, [r2, #0x58] + add r0, r0, #1 + and ip, ip, #0xf + ldrsb ip, [lr, ip] + add r3, r3, r1 + cmp r0, #0x14 + strb ip, [r3, #1] + add r1, r1, #2 + blt _02254178 + ldr r0, _022542E8 ; =ov45_022576CC + bl strlen + ldr r1, _022542DC ; =ov45_0225762C + mov r4, #0x26 + ldr r3, [r1, #0x58] + mov r2, #0x29 + strb r4, [r3, -r0] + ldr r1, [r1, #0x58] + ldr r0, _022542EC ; =ov45_022576A0 + bl strncpy + ldr r0, _022542DC ; =ov45_0225762C + mov r1, #6 + str r1, [r0] + b _022541F0 +_022541EC: + bl ov45_022545BC +_022541F0: + mov r0, r5 + bl ov00_021EC3D8 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_02254200: + ldr r0, _022542F0 ; =ov45_022576D4 + bl strlen + mov r2, r0 + ldr r1, _022542F0 ; =ov45_022576D4 + mov r0, r5 + bl strncmp + cmp r0, #0 + bne _02254234 + mov r0, r5 + bl ov00_021EC3D8 + bl ov45_022545BC + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_02254234: + ldr r0, _022542DC ; =ov45_0225762C + ldr r0, [r0, #0x60] + cmp r0, #0 + beq _02254254 + bl ov00_021EC3D8 + ldr r0, _022542DC ; =ov45_0225762C + mov r1, #0 + str r1, [r0, #0x60] +_02254254: + mov r0, r5 + mov r1, r4 + bl ov45_02253ED8 + cmp r0, #0 + bne _0225427C + mov r0, r5 + bl ov00_021EC3D8 + bl ov45_022545BC + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_0225427C: + ldr r0, _022542DC ; =ov45_0225762C + ldr r2, [r0, #0x70] + cmp r2, #0 + beq _022542B4 + mov r0, r5 + mov r1, r4 + blx r2 + cmp r0, #0 + bne _022542B4 + mov r0, r5 + bl ov00_021EC3D8 + bl ov45_022545BC + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_022542B4: + ldr r0, _022542DC ; =ov45_0225762C + mov r1, #8 + str r5, [r0, #0x60] + str r4, [r0, #0x64] + str r1, [r0] + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} +_022542D0: + bl ov45_022545BC + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022542DC: .word ov45_0225762C +_022542E0: .word ov45_02254E05 +_022542E4: .word ov45_0225765C +_022542E8: .word ov45_022576CC +_022542EC: .word ov45_022576A0 +_022542F0: .word ov45_022576D4 + arm_func_end ov45_0225408C + + arm_func_start ov45_022542F4 +ov45_022542F4: ; 0x022542F4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r4, [sp, #0x20] + mov sb, r2 + add r7, r4, sb + mov r4, r0 + mov sl, r1 + add r1, r7, #4 + mov r0, #7 + mov r8, r3 + mov r6, #0 + bl ov00_021EC2A8 + movs r5, r0 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp sb, #0 + mov r2, r6 + ble _02254350 +_02254338: + ldrb r1, [sl, r2] + add r0, r5, r2 + add r2, r2, #1 + strb r1, [r0, #4] + cmp r2, sb + blt _02254338 +_02254350: + ldr r3, [sp, #0x20] + mov sl, #0 + cmp r3, #0 + ble _0225437C + add r2, r5, sb +_02254364: + ldrb r1, [r8, sl] + add r0, r2, sl + add sl, sl, #1 + strb r1, [r0, #4] + cmp sl, r3 + blt _02254364 +_0225437C: + cmp r7, #0 + mov r1, #0 + ble _022543A0 +_02254388: + add r0, r5, r1 + ldrb r0, [r0, #4] + add r1, r1, #1 + cmp r1, r7 + add r6, r6, r0 + blt _02254388 +_022543A0: + mov r0, r6 + bl ov45_02253D88 + cmp r7, #0 + mov r8, #0 + ble _022543D4 +_022543B4: + bl ov45_02253D9C + add r2, r5, r8 + ldrb r1, [r2, #4] + add r8, r8, #1 + cmp r8, r7 + eor r0, r1, r0 + strb r0, [r2, #4] + blt _022543B4 +_022543D4: + ldr r1, _02254438 ; =ov45_0225762C + mov r0, r5 + ldr r2, [r1, #0x50] + mov r1, r4 + eor r6, r6, r2 + mov r2, r6, lsr #0x18 + strb r2, [r5] + mov r2, r6, lsr #0x10 + strb r2, [r5, #1] + mov r2, r6, lsr #8 + strb r2, [r5, #2] + add r2, r7, #4 + mov r3, #2 + strb r6, [r5, #3] + bl ov00_021FFC18 + mov r1, r5 + mov r0, #7 + mov r2, #0 + bl ov00_021EC2EC + add r0, r7, #4 + bl ov45_02253D50 + mov r1, #0 + strb r1, [r4, r0] + mov r0, r1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_02254438: .word ov45_0225762C + arm_func_end ov45_022542F4 + + arm_func_start ov45_0225443C +ov45_0225443C: ; 0x0225443C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x28 + mov r5, #0 + add r4, sp, #8 + ldr r2, _022545A8 ; =ov45_0225762C + sub r3, r5, #1 + strb r5, [r4] + strb r5, [r4, #1] + strb r5, [r4, #2] + strb r5, [r4, #3] + strb r5, [r4, #4] + strb r5, [r4, #5] + strb r5, [r4, #6] + strb r5, [r4, #7] + strb r5, [r4, #8] + str r3, [r2, #8] + str r5, [r2, #0x54] + str r5, [r2, #0x58] + str r5, [r2, #0x5c] + str r5, [r2, #0x60] + mov r4, r1 + str r5, [r2, #0x64] + cmp r0, #0 + beq _022544B8 + cmp r0, #1 + beq _022544C8 + cmp r0, #2 + ldreq r1, _022545AC ; =ov45_02257728 + ldreq r0, _022545B0 ; =ov45_02257628 + streq r1, [r0] + b _022544D4 +_022544B8: + ldr r1, _022545B4 ; =ov45_022576DC + ldr r0, _022545B0 ; =ov45_02257628 + str r1, [r0] + b _022544D4 +_022544C8: + ldr r1, _022545B8 ; =ov45_02257704 + ldr r0, _022545B0 ; =ov45_02257628 + str r1, [r0] +_022544D4: + add r0, sp, #0x11 + mov r1, r4 + mov r2, #0x14 + bl strncpy + mov r3, #0 + add r0, sp, #8 + add r1, r4, #0x14 + mov r2, #8 + strb r3, [sp, #0x25] + bl strncpy + mov r1, #0 + mov r2, #0x10 + bl strtoul + mov r7, r0 + add r0, sp, #8 + add r1, r4, #0x1c + mov r2, #8 + bl strncpy + mov r1, #0 + mov r2, #0x10 + bl strtoul + mov r6, r0 + add r0, sp, #8 + add r1, r4, #0x24 + mov r2, #8 + bl strncpy + mov r1, #0 + mov r2, #0x10 + bl strtoul + mov r5, r0 + add r0, sp, #8 + add r1, r4, #0x2c + mov r2, #8 + bl strncpy + mov r1, #0 + mov r2, #0x10 + bl strtoul + str r5, [sp] + str r0, [sp, #4] + mov r2, r7 + mov r3, r6 + add r0, r4, #0x34 + add r1, sp, #0x11 + bl ov45_02253DDC + mov r0, #0 + bl ov00_021FA0B4 + ldr r0, _022545A8 ; =ov45_0225762C + mov r2, #3 + mov r1, #1 + str r2, [r0] + str r1, [r0, #4] + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_022545A8: .word ov45_0225762C +_022545AC: .word ov45_02257728 +_022545B0: .word ov45_02257628 +_022545B4: .word ov45_022576DC +_022545B8: .word ov45_02257704 + arm_func_end ov45_0225443C + + arm_func_start ov45_022545BC +ov45_022545BC: ; 0x022545BC + stmdb sp!, {r3, lr} + bl ov00_021EC230 + cmp r0, #0 + bne _022545D8 + ldr r1, _022545E8 ; =0xFFFEA048 + mov r0, #6 + bl ov00_021EC24C +_022545D8: + ldr r0, _022545EC ; =ov45_0225762C + mov r1, #1 + str r1, [r0] + ldmia sp!, {r3, pc} + .balign 4, 0 +_022545E8: .word 0xFFFEA048 +_022545EC: .word ov45_0225762C + arm_func_end ov45_022545BC + + arm_func_start ov45_022545F0 +ov45_022545F0: ; 0x022545F0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _022546EC ; =ov45_0225762C + ldr r1, [r0] + cmp r1, #8 + addls pc, pc, r1, lsl #2 + b _022546DC +_0225460C: ; jump table + b _022546DC ; case 0 + b _02254630 ; case 1 + b _022546DC ; case 2 + b _022546DC ; case 3 + b _02254638 ; case 4 + b _02254678 ; case 5 + b _0225468C ; case 6 + b _022546CC ; case 7 + b _022546DC ; case 8 +_02254630: + bl ov45_022545BC + b _022546DC +_02254638: + ldr r2, _022546F0 ; =ov45_0225408C + mov r1, #0 + str r2, [sp] + str r1, [sp, #4] + ldr r0, [r0, #0x54] + ldr r3, _022546F4 ; =ov45_02254088 + mov r2, r1 + bl ov00_021FA488 + ldr r1, _022546EC ; =ov45_0225762C + cmp r0, #0 + str r0, [r1, #8] + movge r0, #5 + strge r0, [r1] + bge _022546DC + bl ov45_022545BC + b _022546DC +_02254678: + bl ov00_021FA118 + cmp r0, #0 + bne _022546DC + bl ov45_022545BC + b _022546DC +_0225468C: + ldr r2, _022546F0 ; =ov45_0225408C + mov r1, #0 + str r2, [sp] + str r1, [sp, #4] + ldr r0, [r0, #0x54] + ldr r3, _022546F4 ; =ov45_02254088 + mov r2, r1 + bl ov00_021FA488 + ldr r1, _022546EC ; =ov45_0225762C + cmp r0, #0 + str r0, [r1, #8] + movge r0, #7 + strge r0, [r1] + bge _022546DC + bl ov45_022545BC + b _022546DC +_022546CC: + bl ov00_021FA118 + cmp r0, #0 + bne _022546DC + bl ov45_022545BC +_022546DC: + ldr r0, _022546EC ; =ov45_0225762C + ldr r0, [r0] + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_022546EC: .word ov45_0225762C +_022546F0: .word ov45_0225408C +_022546F4: .word ov45_02254088 + arm_func_end ov45_022545F0 + + arm_func_start ov45_022546F8 +ov45_022546F8: ; 0x022546F8 + stmdb sp!, {r3, lr} + ldr r0, _02254770 ; =ov45_0225762C + ldr r1, [r0, #4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldr r1, [r0, #0x54] + cmp r1, #0 + beq _02254730 + mov r0, #7 + mov r2, #0 + bl ov00_021EC2EC + ldr r0, _02254770 ; =ov45_0225762C + mov r1, #0 + str r1, [r0, #0x54] +_02254730: + ldr r0, _02254770 ; =ov45_0225762C + ldr r0, [r0, #0x60] + cmp r0, #0 + beq _02254754 + bl ov00_021EC3D8 + ldr r0, _02254770 ; =ov45_0225762C + mov r1, #0 + str r1, [r0, #0x64] + str r1, [r0, #0x60] +_02254754: + bl ov00_021FA0D8 + ldr r0, _02254770 ; =ov45_0225762C + mov r1, #2 + str r1, [r0] + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02254770: .word ov45_0225762C + arm_func_end ov45_022546F8 + + arm_func_start ov45_02254774 +ov45_02254774: ; 0x02254774 + ldr r1, _02254788 ; =ov45_0225762C + ldr r2, [r1, #0x6c] + str r2, [r0] + ldr r0, [r1, #0x68] + bx lr + .balign 4, 0 +_02254788: .word ov45_0225762C + arm_func_end ov45_02254774 + + arm_func_start ov45_0225478C +ov45_0225478C: ; 0x0225478C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + ldr r4, _022549B4 ; =ov45_0225762C + mov sl, r0 + ldr r0, [r4, #0xc] + mov sb, r1 + cmp r0, #1 + str r2, [sp, #0x10] + mov r8, r3 + addne sp, sp, #0x34 + movne r0, #3 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r4, #0x54] + cmp r1, #0 + beq _022547E0 + mov r0, #7 + mov r2, #0 + bl ov00_021EC2EC + mov r0, r4 + mov r1, #0 + str r1, [r0, #0x54] +_022547E0: + add r0, r8, #0xc + bl ov45_02253D50 + mov r7, r0 + ldr r0, _022549B8 ; =ov45_02257750 + bl strlen + mov r6, r0 + ldr r0, _022549BC ; =ov45_022576CC + bl strlen + mov r5, r0 + ldr r2, _022549C0 ; =ov45_02257758 + add r0, sp, #0x24 + mov r1, #0x10 + mov r3, sb + bl snprintf + mov fp, r0 + ldr r0, _022549C4 ; =ov45_0225775C + bl strlen + str r0, [sp, #0x14] + mov r0, sl + bl strlen + str r0, [sp, #0x18] + ldr r0, _022549C8 ; =ov45_02257628 + ldr r0, [r0] + bl strlen + mov r4, r0 + ldr r0, _022549CC ; =ov45_0225763C + bl strlen + add r1, r4, r0 + ldr r0, [sp, #0x18] + add r1, r0, r1 + ldr r0, [sp, #0x14] + add r0, r0, r1 + add r0, fp, r0 + add r0, r5, r0 + add r0, r0, #0x29 + add r0, r6, r0 + add r1, r7, r0 + mov r0, #7 + bl ov00_021EC2A8 + ldr r1, _022549B4 ; =ov45_0225762C + cmp r0, #0 + str r0, [r1, #0x54] + addeq sp, sp, #0x34 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str sl, [sp] + ldr r1, _022549D0 ; =ov45_02257780 + str sb, [sp, #4] + str r1, [sp, #8] + ldr r2, _022549D4 ; =ov45_022577AC + ldr r1, _022549C8 ; =ov45_02257628 + str r2, [sp, #0xc] + ldr r2, [r1] + ldr r1, _022549D8 ; =ov45_02257764 + ldr r3, _022549CC ; =ov45_0225763C + bl sprintf + ldr r0, _022549B4 ; =ov45_0225762C + ldr r4, [r0, #0x54] + mov r0, r4 + bl strlen + add r2, r4, r0 + ldr r1, _022549B4 ; =ov45_0225762C + ldr r0, _022549B8 ; =ov45_02257750 + str r2, [r1, #0x5c] + bl strlen + ldr r4, _022549B4 ; =ov45_0225762C + ldr r3, [sp, #0x10] + ldr r5, [r4, #0x5c] + add r1, sp, #0x1c + sub r0, r5, r0 + sub r0, r0, #0x28 + str r0, [r4, #0x58] + str sb, [sp, #0x1c] + str r8, [sp, #0x20] + str r8, [sp] + ldr r0, [r4, #0x5c] + mov r2, #8 + bl ov45_022542F4 + cmp r0, #2 + bne _0225494C + mov r1, r4 + ldr r1, [r1, #0x54] + mov r0, #7 + mov r2, #0 + bl ov00_021EC2EC + mov r0, r4 + mov r1, #0 + str r1, [r0, #0x54] + add sp, sp, #0x34 + mov r0, #2 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0225494C: + ldr r0, [sp, #0x5c] + cmp r0, #0 + beq _0225497C + mov r0, r4 + ldr r1, _022549DC ; =ov45_022576A0 + ldr r0, [r0, #0x58] + mov r2, #0x28 + bl memcpy + mov r0, r4 + mov r1, #6 + str r1, [r0] + b _0225499C +_0225497C: + ldr r0, _022549BC ; =ov45_022576CC + bl strlen + mov r1, r4 + ldr r3, [r1, #0x58] + mov r4, #0 + mov r2, #4 + strb r4, [r3, -r0] + str r2, [r1] +_0225499C: + ldr r2, [sp, #0x58] + ldr r1, _022549B4 ; =ov45_0225762C + mov r0, #0 + str r2, [r1, #0x70] + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_022549B4: .word ov45_0225762C +_022549B8: .word ov45_02257750 +_022549BC: .word ov45_022576CC +_022549C0: .word ov45_02257758 +_022549C4: .word ov45_0225775C +_022549C8: .word ov45_02257628 +_022549CC: .word ov45_0225763C +_022549D0: .word ov45_02257780 +_022549D4: .word ov45_022577AC +_022549D8: .word ov45_02257764 +_022549DC: .word ov45_022576A0 + arm_func_end ov45_0225478C + + arm_func_start ov45_022549E0 +ov45_022549E0: ; 0x022549E0 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr lr, [sp, #0x10] + mov ip, #0 + str lr, [sp] + str ip, [sp, #4] + bl ov45_0225478C + add sp, sp, #8 + ldmia sp!, {r3, pc} + arm_func_end ov45_022549E0 + + arm_func_start ov45_02254A04 +ov45_02254A04: ; 0x02254A04 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr lr, [sp, #0x10] + mov ip, #1 + str lr, [sp] + str ip, [sp, #4] + bl ov45_0225478C + add sp, sp, #8 + ldmia sp!, {r3, pc} + arm_func_end ov45_02254A04 + + .rodata + +_02254D04: + .word ov45_02254F78 + .word ov45_02254F84 + .word ov45_02254F80 + .word ov45_02254F7C + .word ov45_02254F74 + .word ov45_02254F90 + +ov45_02254D1C: ; 0x02254D1C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 + +ov45_02254D3C: ; 0x02254D3C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 + +ov45_02254D5C: ; 0x02254D5C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 + +ov45_02254D7C: ; 0x02254D7C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 + +ov45_02254D9C: ; 0x02254D9C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 + +ov45_02254DBC: ; 0x02254DBC + .asciz "#GSP" + .balign 4, 0 + +ov45_02254DC4: ; 0x02254DC4 + .word ov45_02255368 + .word ov45_02255370 + .word ov45_02255384 + .word ov45_02255388 + .word ov45_0225538C + .word ov45_02255390 + .word ov45_02255394 + .word ov45_0225537C + .word ov45_02255374 + .word ov45_02255378 + .word ov45_02255380 + .word ov45_0225536C + +ov45_02254DF4: ; 0x02254DF4 + .asciz "0123456789abcdef" + +ov45_02254E05: ; 0x02254E05 + .asciz "0123456789abcdef" + + .data + +_02254F58: + .byte 0x00, 0x00, 0x01, 0x00 + .word ov45_02255048 + .word ov45_02255024 + .word ov45_02255070 + .word ov45_02254FE4 + .word ov45_02254FC8 + .word ov45_02255004 + +ov45_02254F74: + .asciz "N" + .balign 4, 0 + +ov45_02254F78: + .asciz "M" + .balign 4, 0 + +ov45_02254F7C: + .asciz "C" + .balign 4, 0 + +ov45_02254F80: + .asciz "F2" + .balign 4, 0 + +ov45_02254F84: + .asciz "F1" + .balign 4, 0 + +ov45_02254F88: ; 0x02254F88 + .asciz "M%d_%u" + .balign 4, 0 + +ov45_02254F90: + .asciz "Invalid" + .balign 4, 0 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02254FA0: ; 0x02254FA0 + .word ov45_02231460 + .word ov45_02236A70 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02254FB0: ; 0x02254FB0 + .word ov45_02231448 + .word ov45_02236AB8 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02254FC0: ; 0x02254FC0 + .word ov45_02236A48 + .word ov45_02231C38 + +ov45_02254FC8: + .asciz "/web/enc/lobby/getVIP.asp" + .balign 4, 0 + +ov45_02254FE4: + .asciz "/web/enc/lobby/getSchedule.asp" + .balign 4, 0 + +ov45_02255004: + .asciz "/web/enc/lobby/checkProfile.asp" + .balign 4, 0 +ov45_02255024: + .asciz "/web/enc/lobby/getQuestionnaire.asp" + .balign 4, 0 + +ov45_02255048: + .asciz "/web/enc/lobby/submitQuestionnaire.asp" + .balign 4, 0 + +ov45_02255070: + .asciz "uLMOGEiiJogofchScpXb000244fd00006015100000005b440e7epokemondpds" + .balign 4, 0 + +ov45_022550B0: ; 0x022550B0 + .asciz "*" + .balign 4, 0 + +ov45_022550B4: ; 0x022550B4 + .asciz "" + .balign 4, 0 + +ov45_022550B8: ; 0x022550B8 + .asciz "!" + .balign 4, 0 + +ov45_022550BC: ; 0x022550BC + .asciz "C%d_%u" + .balign 4, 0 + +ov45_022550C4: ; 0x022550C4 + .asciz "b_lib_u_user" + .balign 4, 0 + +ov45_022550D4: ; 0x022550D4 + .asciz "b_lib_u_system" + .balign 4, 0 + +ov45_022550E4: ; 0x022550E4 + .asciz "b_lib_c_time" + .balign 4, 0 + +ov45_022550F4: ; 0x022550F4 + .asciz "b_lib_c_lobby" + .balign 4, 0 + +ov45_02255104: ; 0x02255104 + .asciz "tree::insert length error" + .balign 4, 0 + +ov45_02255120: ; 0x02255120 + .asciz "basic_string::reserve length_error" + .balign 4, 0 + +ov45_02255144: ; 0x02255144 + .asciz "basic_string: out_of_range" + .balign 4, 0 + +ov45_02255160: ; 0x02255160 + .asciz "string compare: pos > len" + .balign 4, 0 + +ov45_0225517C: ; 0x0225517C + .asciz "basic_string: length_error" + .balign 4, 0 + +ov45_02255198: ; 0x02255198 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_022551A0: ; 0x022551A0 + .byte 0x00, 0x00, 0x00, 0x00 + +ov45_022551A4: ; 0x022551A4 + .byte 0x00, 0x00, 0x00, 0x00 + +ov45_022551A8: ; 0x022551A8 + .byte 0x00, 0x00, 0x00, 0x00 + +ov45_022551AC: ; 0x022551AC + .asciz "deque:: length error" + .balign 4, 0 + +ov45_022551C4: ; 0x022551C4 + .asciz "cdeque length error" + .balign 4, 0 + +ov45_022551D8: ; 0x022551D8 + .byte 0x00 + +ov45_022551D9: ; 0x022551D9 + .byte 0x00, 0x00, 0x00 + +ov45_022551DC: ; 0x022551DC + .asciz " " + .balign 4, 0 + +ov45_022551E0: ; 0x022551E0 + .asciz " " + .balign 4, 0 + +ov45_022551E4: ; 0x022551E4 + .asciz "B" + .balign 4, 0 + +ov45_022551E8: ; 0x022551E8 + .asciz "S" + .balign 4, 0 + +ov45_022551EC: ; 0x022551EC + .asciz "" + .balign 4, 0 + +ov45_022551F0: ; 0x022551F0 + .asciz "%x" + .balign 4, 0 + +ov45_022551F4: ; 0x022551F4 + .asciz "A" + .balign 4, 0 + +ov45_022551F8: ; 0x022551F8 + .asciz "_" + .balign 4, 0 + +ov45_022551FC: ; 0x022551FC + .asciz "%s" + .balign 4, 0 + +ov45_02255200: ; 0x02255200 + .byte 0x01, 0x00, 0x00, 0x00 + .word ov45_0223E494, 0 + +ov45_0225520C: ; 0x0225520C + .asciz "tree::insert length error" + .balign 4, 0 + +ov45_02255228: ; 0x02255228 + .byte 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02255238: ; 0x02255238 + .word ov45_0223FD88 + .word ov45_02241F80 + .word ov45_022412C4 + .word ov45_0223FD6C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02255250: ; 0x02255250 + .word ov45_02241FA4 + .word ov45_02241FA8 + .word ov45_022412C4 + .word ov45_0223FD6C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02255268: ; 0x02255268 + .word ov45_02241FCC + .word ov45_02241FD0 + .word ov45_022412C4 + .word ov45_0223FD6C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02255280: ; 0x02255280 + .word ov45_02241FF4 + .word ov45_02241FF8 + .word ov45_022412C4 + .word ov45_0223FD6C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_02255298: ; 0x02255298 + .word ov45_0224201C + .word ov45_02242020 + .word ov45_022412C4 + .word ov45_0223FD6C + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_022552B0: ; 0x022552B0 + .word ov45_02242044 + .word ov45_02242048 + .word ov45_022412C4 + .word ov45_0223FD6C + +ov45_022552C0: ; 0x022552C0 + .asciz "SERVER" + .balign 4, 0 + +ov45_022552C8: ; 0x022552C8 + .asciz "Excess Flood" + .balign 4, 0 + +ov45_022552D8: ; 0x022552D8 + .asciz " :" + .balign 4, 0 + +ov45_022552DC: ; 0x022552DC + .asciz "normal" + .balign 4, 0 + +ov45_022552E4: ; 0x022552E4 + .asciz "voice" + .balign 4, 0 + +ov45_022552EC: ; 0x022552EC + .asciz "ops" + .balign 4, 0 + +ov45_022552F0: ; 0x022552F0 + .asciz "voice+ops" + .balign 4, 0 + +ov45_022552FC: ; 0x022552FC + .asciz "invalid" + .balign 4, 0 + +ov45_02255304: ; 0x02255304 + .asciz "" + .balign 4, 0 + +ov45_02255308: ; 0x02255308 + .asciz "DWCUser" + .balign 4, 0 + +ov45_02255310: ; 0x02255310 + .asciz "DWCName" + .balign 4, 0 + +ov45_02255318: ; 0x02255318 + .asciz "." + .balign 4, 0 + +ov45_0225531C: ; 0x0225531C + .asciz "peerchat.gs.nintendowifi.net" + .balign 4, 0 + +ov45_0225533C: ; 0x0225533C + .asciz "tree::insert length error" + .balign 4, 0 + +ov45_02255358: ; 0x02255358 + .byte 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00 + .word ov45_0224307C + .byte 0x00, 0x00, 0x00, 0x00 + +ov45_02255368: + .asciz "R" + .balign 4, 0 + +ov45_0225536C: + .asciz "T" + .balign 4, 0 + +ov45_02255370: + .asciz "D" + .balign 4, 0 + +ov45_02255374: + .asciz "D7" + .balign 4, 0 + +ov45_02255378: + .asciz "D8" + .balign 4, 0 + +ov45_0225537C: + .asciz "D6" + .balign 4, 0 + +ov45_02255380: + .asciz "D9" + .balign 4, 0 + +ov45_02255384: + .asciz "D1" + .balign 4, 0 + +ov45_02255388: + .asciz "D2" + .balign 4, 0 + +ov45_0225538C: + .asciz "D3" + .balign 4, 0 + +ov45_02255390: + .asciz "D4" + .balign 4, 0 + +ov45_02255394: + .asciz "D5" + .balign 4, 0 + +ov45_02255398: ; 0x02255398 + .asciz "!" + .balign 4, 0 + +ov45_0225539C: ; 0x0225539C + .asciz "N_%d_%u" + .balign 4, 0 + +ov45_022553A4: ; 0x022553A4 + .asciz "_" + .balign 4, 0 + +ov45_022553A8: ; 0x022553A8 + .asciz "" + .balign 4, 0 + +ov45_022553AC: ; 0x022553AC + .asciz "tree::insert length error" + .balign 4, 0 + +ov45_022553C8: ; 0x022553C8 + .asciz "ciAddCallback_" + .balign 4, 0 + +ov45_022553D8: ; 0x022553D8 + .asciz "ciCallCallback" + .balign 4, 0 + +ov45_022553E8: ; 0x022553E8 + .asciz "ciCallCallbacks" + .balign 4, 0 + +ov45_022553F8: ; 0x022553F8 + .asciz "ciFreeCallbackData" + .balign 4, 0 + +ov45_0225540C: ; 0x0225540C + .asciz "ciCleanupCallbacks" + .balign 4, 0 + +ov45_02255420: ; 0x02255420 + .asciz "ciGetCallbackIndexByID" + .balign 4, 0 + +ov45_02255438: ; 0x02255438 + .asciz "ciCallbacksArrayElementFreeFn" + .balign 4, 0 + +ov45_02255458: ; 0x02255458 + .asciz "data != NULL" + .balign 4, 0 + +ov45_02255468: ; 0x02255468 + .asciz "chatCallbacks.c" + .balign 4, 0 + +ov45_02255478: ; 0x02255478 + .asciz "data->type >= 0" + .balign 4, 0 + +ov45_02255488: ; 0x02255488 + .asciz "data->type < CALLBACK_NUM" + .balign 4, 0 + +ov45_022554A4: ; 0x022554A4 + .asciz "data->callback != NULL" + .balign 4, 0 + +ov45_022554BC: ; 0x022554BC + .asciz "data->callbackParams != NULL" + .balign 4, 0 + +ov45_022554DC: ; 0x022554DC + .asciz "data->ID >= 0" + .balign 4, 0 + +ov45_022554EC: ; 0x022554EC + .asciz "0" + .balign 4, 0 + +ov45_022554F0: ; 0x022554F0 + .asciz "chat != NULL" + .balign 4, 0 + +ov45_02255500: ; 0x02255500 + .asciz "type >= 0" + .balign 4, 0 + +ov45_0225550C: ; 0x0225550C + .asciz "type < CALLBACK_NUM" + .balign 4, 0 + +ov45_02255520: ; 0x02255520 + .asciz "connection->callbackList != NULL" + .balign 4, 0 + +ov45_02255544: ; 0x02255544 + .asciz "callback != NULL" + .balign 4, 0 + +ov45_02255558: ; 0x02255558 + .asciz "callbackParams != NULL" + .balign 4, 0 + +ov45_02255570: ; 0x02255570 + .asciz "callbackParamsSize > 0" + .balign 4, 0 + +ov45_02255588: ; 0x02255588 + .asciz "ID >= 0" + .balign 4, 0 + +ov45_02255590: ; 0x02255590 + .asciz "srcParams-> numChannels >= 0" + .balign 4, 0 + +ov45_022555B0: ; 0x022555B0 + .asciz "srcParams->numUsers != NULL" + .balign 4, 0 + +ov45_022555CC: ; 0x022555CC + .asciz "srcParams-> numUsers >= 0" + .balign 4, 0 + +ov45_022555E8: ; 0x022555E8 + .asciz "srcParams->modes != NULL" + .balign 4, 0 + +ov45_02255604: ; 0x02255604 + .asciz "srcParams-> numBans >= 0" + .balign 4, 0 + +ov45_02255620: ; 0x02255620 + .asciz "srcParams-> numSuggestedNicks >= 0" + .balign 4, 0 + +ov45_02255644: ; 0x02255644 + .asciz "srcParams-> num >= 0" + .balign 4, 0 + +ov45_0225565C: ; 0x0225565C + .asciz "ciInChannel" + .balign 4, 0 + +ov45_02255668: ; 0x02255668 + .asciz "ciHashString" + .balign 4, 0 + +ov45_02255678: ; 0x02255678 + .asciz "ciChannelLeft" + .balign 4, 0 + +ov45_02255688: ; 0x02255688 + .asciz "ciSetChannelMode" + .balign 4, 0 + +ov45_0225569C: ; 0x0225569C + .asciz "ciChannelEntered" + .balign 4, 0 + +ov45_022556B0: ; 0x022556B0 + .asciz "ciGetChannelMode" + .balign 4, 0 + +ov45_022556C4: ; 0x022556C4 + .asciz "ciUserChangedNick" + .balign 4, 0 + +ov45_022556D8: ; 0x022556D8 + .asciz "ciUserChangedMode" + .balign 4, 0 + +ov45_022556EC: ; 0x022556EC + .asciz "ciUserLeftChannel" + .balign 4, 0 + +ov45_02255700: ; 0x02255700 + .asciz "ciCleanupChannels" + .balign 4, 0 + +ov45_02255714: ; 0x02255714 + .asciz "ciUserTableHashFn" + .balign 4, 0 + +ov45_02255728: ; 0x02255728 + .asciz "ciSetChannelTopic" + .balign 4, 0 + +ov45_0225573C: ; 0x0225573C + .asciz "ciChannelEntering" + .balign 4, 0 + +ov45_02255750: ; 0x02255750 + .asciz "ciUserEnumChannels" + .balign 4, 0 + +ov45_02255764: ; 0x02255764 + .asciz "ciSetUserBasicInfo" + .balign 4, 0 + +ov45_02255778: ; 0x02255778 + .asciz "ciChannelListUsers" + .balign 4, 0 + +ov45_0225578C: ; 0x0225578C + .asciz "ciUserChangeNickMap" + .balign 4, 0 + +ov45_022557A0: ; 0x022557A0 + .asciz "ciIsEnteringChannel" + .balign 4, 0 + +ov45_022557B4: ; 0x022557B4 + .asciz "ciUserTableCompareFn" + .balign 4, 0 + +ov45_022557CC: ; 0x022557CC + .asciz "ciSetChannelPassword" + .balign 4, 0 + +ov45_022557E4: ; 0x022557E4 + .asciz "ciJoinCallbackCalled" + .balign 4, 0 + +ov45_022557FC: ; 0x022557FC + .asciz "ciChannelTableHashFn" + .balign 4, 0 + +ov45_02255814: ; 0x02255814 + .asciz "ciGetChannelNumUsers" + .balign 4, 0 + +ov45_0225582C: ; 0x0225582C + .asciz "ciUserEnteredChannel" + .balign 4, 0 + +ov45_02255844: ; 0x02255844 + .asciz "ciGetChannelCallbacks" + .balign 4, 0 + +ov45_0225585C: ; 0x0225585C + .asciz "ciChannelListUsersMap" + .balign 4, 0 + +ov45_02255874: ; 0x02255874 + .asciz "ciSetUserBasicInfoMap" + .balign 4, 0 + +ov45_0225588C: ; 0x0225588C + .asciz "ciUserEnumChannelsMap" + .balign 4, 0 + +ov45_022558A4: ; 0x022558A4 + .asciz "ciWasJoinCallbackCalled" + .balign 4, 0 + +ov45_022558BC: ; 0x022558BC + .asciz "ciChannelTableCompareFn" + .balign 4, 0 + +ov45_022558D4: ; 0x022558D4 + .asciz "ciUserTableElementFreeFn" + .balign 4, 0 + +ov45_022558F0: ; 0x022558F0 + .asciz "ciChannelTableElementFreeFn" + .balign 4, 0 + +ov45_0225590C: ; 0x0225590C + .asciz "str != NULL" + .balign 4, 0 + +ov45_02255918: ; 0x02255918 + .asciz "chatChannel.c" + .balign 4, 0 + +ov45_02255928: ; 0x02255928 + .asciz "str[0] != '\\0'" + .balign 4, 0 + +ov45_02255938: ; 0x02255938 + .asciz "elem != NULL" + .balign 4, 0 + +ov45_02255948: ; 0x02255948 + .asciz "numBuckets > 0" + .balign 4, 0 + +ov45_02255958: ; 0x02255958 + .asciz "elem1 != NULL" + .balign 4, 0 + +ov45_02255968: ; 0x02255968 + .asciz "elem2 != NULL" + .balign 4, 0 + +ov45_02255978: ; 0x02255978 + .asciz "str1 != NULL" + .balign 4, 0 + +ov45_02255988: ; 0x02255988 + .asciz "str2 != NULL" + .balign 4, 0 + +ov45_02255998: ; 0x02255998 + .asciz "str1[0] != '\\0'" + .balign 4, 0 + +ov45_022559A8: ; 0x022559A8 + .asciz "str2[0] != '\\0'" + .balign 4, 0 + +ov45_022559B8: ; 0x022559B8 + .asciz "chat != NULL" + .balign 4, 0 + +ov45_022559C8: ; 0x022559C8 + .asciz "chatChannel" + .balign 4, 0 + +ov45_022559D4: ; 0x022559D4 + .asciz "channel != NULL" + .balign 4, 0 + +ov45_022559E4: ; 0x022559E4 + .asciz "channel[0] != '\\0'" + .balign 4, 0 + +ov45_022559F8: ; 0x022559F8 + .asciz "strlen(channel) < MAX_CHANNEL" + .balign 4, 0 + +ov45_02255A18: ; 0x02255A18 + .asciz "callbacks != NULL" + .balign 4, 0 + +ov45_02255A2C: ; 0x02255A2C + .asciz "" + .balign 4, 0 + +ov45_02255A30: ; 0x02255A30 + .asciz "clientData != NULL" + .balign 4, 0 + +ov45_02255A44: ; 0x02255A44 + .asciz "user->name != NULL" + .balign 4, 0 + +ov45_02255A58: ; 0x02255A58 + .asciz "user->name[0] != '\\0'" + .balign 4, 0 + +ov45_02255A70: ; 0x02255A70 + .asciz "strlen(user->name) < MAX_NAME" + .balign 4, 0 + +ov45_02255A90: ; 0x02255A90 + .asciz "data->numUsers >= 0" + .balign 4, 0 + +ov45_02255AA4: ; 0x02255AA4 + .asciz "0" + .balign 4, 0 + +ov45_02255AA8: ; 0x02255AA8 + .asciz "callback != NULL" + .balign 4, 0 + +ov45_02255ABC: ; 0x02255ABC + .asciz "name != NULL" + .balign 4, 0 + +ov45_02255ACC: ; 0x02255ACC + .asciz "name[0] != '\\0'" + .balign 4, 0 + +ov45_02255ADC: ; 0x02255ADC + .asciz "strlen(name) < MAX_NAME" + .balign 4, 0 + +ov45_02255AF4: ; 0x02255AF4 + .asciz "(mode >= 0) && (mode <= 3)" + .balign 4, 0 + +ov45_02255B10: ; 0x02255B10 + .asciz "TableLookup(chatChannel->users, &chatUser) != NULL" + .balign 4, 0 + +ov45_02255B44: ; 0x02255B44 + .asciz "user != NULL" + .balign 4, 0 + +ov45_02255B54: ; 0x02255B54 + .asciz "user[0] != '\\0'" + .balign 4, 0 + +ov45_02255B64: ; 0x02255B64 + .asciz "strlen(user) < MAX_NAME" + .balign 4, 0 + +ov45_02255B7C: ; 0x02255B7C + .asciz "channel->users != NULL" + .balign 4, 0 + +ov45_02255B94: ; 0x02255B94 + .asciz "data->user != NULL" + .balign 4, 0 + +ov45_02255BA8: ; 0x02255BA8 + .asciz "data->user->name[0] != '\\0'" + .balign 4, 0 + +ov45_02255BC4: ; 0x02255BC4 + .asciz "data->callback != NULL" + .balign 4, 0 + +ov45_02255BDC: ; 0x02255BDC + .asciz "data->newNick != NULL" + .balign 4, 0 + +ov45_02255BF4: ; 0x02255BF4 + .asciz "data->newNick[0] != '\\0'" + .balign 4, 0 + +ov45_02255C10: ; 0x02255C10 + .asciz "strlen(data->newNick) < MAX_NAME" + .balign 4, 0 + +ov45_02255C34: ; 0x02255C34 + .asciz "data->oldNick != NULL" + .balign 4, 0 + +ov45_02255C4C: ; 0x02255C4C + .asciz "data->oldNick[0] != '\\0'" + .balign 4, 0 + +ov45_02255C68: ; 0x02255C68 + .asciz "strlen(data->oldNick) < MAX_NAME" + .balign 4, 0 + +ov45_02255C8C: ; 0x02255C8C + .asciz "rcode != 0" + .balign 4, 0 + +ov45_02255C98: ; 0x02255C98 + .asciz "oldNick != NULL" + .balign 4, 0 + +ov45_02255CA8: ; 0x02255CA8 + .asciz "oldNick[0] != '\\0'" + .balign 4, 0 + +ov45_02255CBC: ; 0x02255CBC + .asciz "strlen(oldNick) < MAX_NAME" + .balign 4, 0 + +ov45_02255CD8: ; 0x02255CD8 + .asciz "newNick != NULL" + .balign 4, 0 + +ov45_02255CE8: ; 0x02255CE8 + .asciz "newNick[0] != '\\0'" + .balign 4, 0 + +ov45_02255CFC: ; 0x02255CFC + .asciz "strlen(newNick) < MAX_NAME" + .balign 4, 0 + +ov45_02255D18: ; 0x02255D18 + .asciz "nick != NULL" + .balign 4, 0 + +ov45_02255D28: ; 0x02255D28 + .asciz "nick[0] != '\\0'" + .balign 4, 0 + +ov45_02255D38: ; 0x02255D38 + .asciz "strlen(nick) < MAX_NAME" + .balign 4, 0 + +ov45_02255D50: + .asciz "475" + .balign 4, 0 + +ov45_02255D54: + .asciz "302" + .balign 4, 0 + +ov45_02255D58: + .asciz "401" + .balign 4, 0 + +ov45_02255D5C: + .asciz "UTM" + .balign 4, 0 + +ov45_02255D60: + .asciz "366" + .balign 4, 0 + +ov45_02255D64: + .asciz "701" + .balign 4, 0 + +ov45_02255D68: + .asciz "433" + .balign 4, 0 + +ov45_02255D6C: + .asciz "707" + .balign 4, 0 + +ov45_02255D70: + .asciz "352" + .balign 4, 0 + +ov45_02255D74: + .asciz "711" + .balign 4, 0 + +ov45_02255D78: + .asciz "323" + .balign 4, 0 + +ov45_02255D7C: + .asciz "476" + .balign 4, 0 + +ov45_02255D80: + .asciz "324" + .balign 4, 0 + +ov45_02255D84: + .asciz "704" + .balign 4, 0 + +ov45_02255D88: + .asciz "474" + .balign 4, 0 + +ov45_02255D8C: + .asciz "705" + .balign 4, 0 + +ov45_02255D90: + .asciz "405" + .balign 4, 0 + +ov45_02255D94: + .asciz "702" + .balign 4, 0 + +ov45_02255D98: + .asciz "471" + .balign 4, 0 + +ov45_02255D9C: + .asciz "331" + .balign 4, 0 + +ov45_02255DA0: ; 0x02255DA0 + .asciz "6" + .balign 4, 0 + +ov45_02255DA4: + .asciz "473" + .balign 4, 0 + +ov45_02255DA8: + .asciz "353" + .balign 4, 0 + +ov45_02255DAC: + .asciz "319" + .balign 4, 0 + +ov45_02255DB0: + .asciz "001" + .balign 4, 0 + +ov45_02255DB4: + .asciz "332" + .balign 4, 0 + +ov45_02255DB8: + .asciz "318" + .balign 4, 0 + +ov45_02255DBC: + .asciz "322" + .balign 4, 0 + +ov45_02255DC0: + .asciz "700" + .balign 4, 0 + +ov45_02255DC4: + .asciz "321" + .balign 4, 0 + +ov45_02255DC8: + .asciz "703" + .balign 4, 0 + +ov45_02255DCC: + .asciz "706" + .balign 4, 0 + +ov45_02255DD0: + .asciz "432" + .balign 4, 0 + +ov45_02255DD4: + .asciz "311" + .balign 4, 0 + +ov45_02255DD8: + .asciz "367" + .balign 4, 0 + +ov45_02255DDC: + .asciz "315" + .balign 4, 0 + +ov45_02255DE0: + .asciz "ATM" + .balign 4, 0 + +ov45_02255DE4: + .asciz "368" + .balign 4, 0 + +ov45_02255DE8: + .asciz "708" + .balign 4, 0 + +ov45_02255DEC: + .asciz "710" + .balign 4, 0 + +ov45_02255DF0: + .asciz "709" + .balign 4, 0 + +ov45_02255DF4: + .asciz "403" + .balign 4, 0 + +ov45_02255DF8: + .asciz "MODE" + .balign 4, 0 + +ov45_02255E00: + .asciz "KICK" + .balign 4, 0 + +ov45_02255E08: + .asciz "NICK" + .balign 4, 0 + +ov45_02255E10: + .asciz "PART" + .balign 4, 0 + +ov45_02255E18: + .asciz "QUIT" + .balign 4, 0 + +ov45_02255E20: + .asciz "JOIN" + .balign 4, 0 + +ov45_02255E28: + .asciz "KILL" + .balign 4, 0 + +ov45_02255E30: + .asciz "PING" + .balign 4, 0 + +ov45_02255E38: + .asciz "TOPIC" + .balign 4, 0 + +ov45_02255E40: + .asciz "ERROR" + .balign 4, 0 + +ov45_02255E48: + .asciz "INVITE" + .balign 4, 0 + +ov45_02255E50: + .asciz "NOTICE" + .balign 4, 0 + +ov45_02255E58: + .asciz "PRIVMSG" + .balign 4, 0 + +ov45_02255E60: ; 0x02255E60 + .asciz "ciGetNextID" + .balign 4, 0 + +ov45_02255E6C: ; 0x02255E6C + .asciz "ciAddFilter" + .balign 4, 0 + +ov45_02255E78: ; 0x02255E78 + .asciz "ciParseMode" + .balign 4, 0 + +ov45_02255E84: ; 0x02255E84 + .asciz "ciParseValue" + .balign 4, 0 + +ov45_02255E94: ; 0x02255E94 + .asciz "ciUTMHandler" + .balign 4, 0 + +ov45_02255EA4: ; 0x02255EA4 + .asciz "ciATMHandler" + .balign 4, 0 + +ov45_02255EB4: ; 0x02255EB4 + .asciz "ciFindFilter" + .balign 4, 0 + +ov45_02255EC4: ; 0x02255EC4 + .asciz "ciFilterThink" + .balign 4, 0 + +ov45_02255ED4: ; 0x02255ED4 + .asciz "ciPingHandler" + .balign 4, 0 + +ov45_02255EE4: ; 0x02255EE4 + .asciz "ciNickHandler" + .balign 4, 0 + +ov45_02255EF4: ; 0x02255EF4 + .asciz "ciJoinHandler" + .balign 4, 0 + +ov45_02255F04: ; 0x02255F04 + .asciz "ciPartHandler" + .balign 4, 0 + +ov45_02255F14: ; 0x02255F14 + .asciz "ciKickHandler" + .balign 4, 0 + +ov45_02255F24: ; 0x02255F24 + .asciz "ciQuitHandler" + .balign 4, 0 + +ov45_02255F34: ; 0x02255F34 + .asciz "ciKillHandler" + .balign 4, 0 + +ov45_02255F44: ; 0x02255F44 + .asciz "ciModeHandler" + .balign 4, 0 + +ov45_02255F54: ; 0x02255F54 + .asciz "ciTopicHandler" + .balign 4, 0 + +ov45_02255F64: ; 0x02255F64 + .asciz "ciErrorHandler" + .balign 4, 0 + +ov45_02255F74: ; 0x02255F74 + .asciz "ciRemoveFilter" + .balign 4, 0 + +ov45_02255F84: ; 0x02255F84 + .asciz "ciFinishFilter" + .balign 4, 0 + +ov45_02255F94: ; 0x02255F94 + .asciz "ciAddJOINFilter" + .balign 4, 0 + +ov45_02255FA4: ; 0x02255FA4 + .asciz "ciNoticeHandler" + .balign 4, 0 + +ov45_02255FB4: ; 0x02255FB4 + .asciz "ciInviteHandler" + .balign 4, 0 + +ov45_02255FC4: ; 0x02255FC4 + .asciz "ciDestroyFilter" + .balign 4, 0 + +ov45_02255FD4: ; 0x02255FD4 + .asciz "ciCleanupFilters" + .balign 4, 0 + +ov45_02255FE8: ; 0x02255FE8 + .asciz "ciPrivmsgHandler" + .balign 4, 0 + +ov45_02255FFC: ; 0x02255FFC + .asciz "ciRplListHandler" + .balign 4, 0 + +ov45_02256010: ; 0x02256010 + .asciz "ciFilterTimedout" + .balign 4, 0 + +ov45_02256024: ; 0x02256024 + .asciz "ciRplCDKeyHandler" + .balign 4, 0 + +ov45_02256038: ; 0x02256038 + .asciz "ciRplLoginHandler" + .balign 4, 0 + +ov45_0225604C: ; 0x0225604C + .asciz "ciRplTopicHandler" + .balign 4, 0 + +ov45_02256060: ; 0x02256060 + .asciz "ciRplGetKeyHandler" + .balign 4, 0 + +ov45_02256074: ; 0x02256074 + .asciz "ciRplUserIPHandler" + .balign 4, 0 + +ov45_02256088: ; 0x02256088 + .asciz "ciNameReplyHandler" + .balign 4, 0 + +ov45_0225609C: ; 0x0225609C + .asciz "ciFindGetKeyFilter" + .balign 4, 0 + +ov45_022560B0: ; 0x022560B0 + .asciz "ciCheckFiltersForID" + .balign 4, 0 + +ov45_022560C4: ; 0x022560C4 + .asciz "ciRplGetCKeyHandler" + .balign 4, 0 + +ov45_022560D8: ; 0x022560D8 + .asciz "ciEndOfNamesHandler" + .balign 4, 0 + +ov45_022560EC: ; 0x022560EC + .asciz "ciRplBanListHandler" + .balign 4, 0 + +ov45_02256100: ; 0x02256100 + .asciz "ciRplNoTopicHandler" + .balign 4, 0 + +ov45_02256114: ; 0x02256114 + .asciz "ciRplWelcomeHandler" + .balign 4, 0 + +ov45_02256128: ; 0x02256128 + .asciz "ciApplyChangesToMode" + .balign 4, 0 + +ov45_02256140: ; 0x02256140 + .asciz "ciRplWhoReplyHandler" + .balign 4, 0 + +ov45_02256158: ; 0x02256158 + .asciz "ciRplEndOfWhoHandler" + .balign 4, 0 + +ov45_02256170: ; 0x02256170 + .asciz "ciRplSecureKeyHandler" + .balign 4, 0 + +ov45_02256188: ; 0x02256188 + .asciz "ciRplEndGetKeyHandler" + .balign 4, 0 + +ov45_022561A0: ; 0x022561A0 + .asciz "ciRplListStartHandler" + .balign 4, 0 + +ov45_022561B8: ; 0x022561B8 + .asciz "ciRplWhoisUserHandler" + .balign 4, 0 + +ov45_022561D0: ; 0x022561D0 + .asciz "ciErrNickInUseHandler" + .balign 4, 0 + +ov45_022561E8: ; 0x022561E8 + .asciz "ciRplEndGetCKeyHandler" + .balign 4, 0 + +ov45_02256200: ; 0x02256200 + .asciz "ciRplGetChanKeyHandler" + .balign 4, 0 + +ov45_02256218: ; 0x02256218 + .asciz "ciRplEndOfWhoisHandler" + .balign 4, 0 + +ov45_02256230: ; 0x02256230 + .asciz "ciErrBadChanMaskHandler" + .balign 4, 0 + +ov45_02256248: ; 0x02256248 + .asciz "ciErrLoginFailedHandler" + .balign 4, 0 + +ov45_02256260: ; 0x02256260 + .asciz "ciErrNoUniqueNickHandler" + .balign 4, 0 + +ov45_0225627C: ; 0x0225627C + .asciz "ciRplEndOfBanListHandler" + .balign 4, 0 + +ov45_02256298: ; 0x02256298 + .asciz "ciErrBadChannelKeyHandler" + .balign 4, 0 + +ov45_022562B4: ; 0x022562B4 + .asciz "ciErrNoSuchChannelHandler" + .balign 4, 0 + +ov45_022562D0: ; 0x022562D0 + .asciz "ciRplChannelModeIsHandler" + .balign 4, 0 + +ov45_022562EC: ; 0x022562EC + .asciz "ciRplWhoisChannelsHandler" + .balign 4, 0 + +ov45_02256308: ; 0x02256308 + .asciz "ciErrChannelIsFullHandler" + .balign 4, 0 + +ov45_02256324: ; 0x02256324 + .asciz "ciQuitEnumChannelsCallback" + .balign 4, 0 + +ov45_02256340: ; 0x02256340 + .asciz "ciKillEnumChannelsCallback" + .balign 4, 0 + +ov45_0225635C: ; 0x0225635C + .asciz "ciErrInviteOnlyChanHandler" + .balign 4, 0 + +ov45_02256378: ; 0x02256378 + .asciz "ciErrBannedFromChanHandler" + .balign 4, 0 + +ov45_02256394: ; 0x02256394 + .asciz "ciErrTooManyChannelsHandler" + .balign 4, 0 + +ov45_022563B0: ; 0x022563B0 + .asciz "ciErrErroneusNicknameHandler" + .balign 4, 0 + +ov45_022563D0: ; 0x022563D0 + .asciz "ciErrUniqueNickExpiredHandler" + .balign 4, 0 + +ov45_022563F0: ; 0x022563F0 + .asciz "ciErrRegisterNickFailedHandler" + .balign 4, 0 + +ov45_02256410: ; 0x02256410 + .word ov45_02255E58, ov45_0224B0FC + .word ov45_02255E50, ov45_0224B310 + .word ov45_02255D5C, ov45_0224B474 + .word ov45_02255DE0, ov45_0224B5E0 + .word ov45_02255E30, ov45_0224B748 + .word ov45_02255E08, ov45_0224B794 + .word ov45_02255E20, ov45_0224B8D0 + .word ov45_02255E10, ov45_0224BB4C + .word ov45_02255E00, ov45_0224BC8C + .word ov45_02255E18, ov45_0224C018 + .word ov45_02255E28, ov45_0224C244 + .word ov45_02255E38, ov45_0224C2A8 + .word ov45_02255DF8, ov45_0224C388 + .word ov45_02255E40, ov45_0224C594 + .word ov45_02255E48, ov45_0224C610 + .word ov45_02255DA8, ov45_0224C6DC + .word ov45_02255D60, ov45_0224C9D8 + .word ov45_02255DB4, ov45_0224CBAC + .word ov45_02255D9C, ov45_0224CCC8 + .word ov45_02255D70, ov45_0224CF0C + .word ov45_02255D54, ov45_0224DE70 + .word ov45_02255DC4, ov45_0224DF50 + .word ov45_02255DBC, ov45_0224DFC4 + .word ov45_02255D78, ov45_0224E210 + .word ov45_02255D80, ov45_0224E288 + .word ov45_02255DD4, ov45_0224E408 + .word ov45_02255DAC, ov45_0224E5EC + .word ov45_02255DB8, ov45_0224E734 + .word ov45_02255DD8, ov45_0224E81C + .word ov45_02255DE4, ov45_0224E968 + .word ov45_02255DB0, ov45_0224EA2C + .word ov45_02255DDC, ov45_0224D128 + .word ov45_02255DC0, ov45_0224D30C + .word ov45_02255D64, ov45_0224D4BC + .word ov45_02255D94, ov45_0224D588 + .word ov45_02255DC8, ov45_0224D924 + .word ov45_02255D84, ov45_0224D9F0 + .word ov45_02255D8C, ov45_0224EAF4 + .word ov45_02255DCC, ov45_0224EC14 + .word ov45_02255D6C, ov45_0224ECCC + .word ov45_02255D68, ov45_0224CDE0 + .word ov45_02255DF4, ov45_0224ED80 + .word ov45_02255D90, ov45_0224EEBC + .word ov45_02255D98, ov45_0224EF70 + .word ov45_02255DA4, ov45_0224F024 + .word ov45_02255D88, ov45_0224F0D8 + .word ov45_02255D50, ov45_0224F18C + .word ov45_02255D7C, ov45_0224F240 + .word ov45_02255D58, ov45_0224F2F4 + .word ov45_02255DD0, ov45_0224F2F8 + .word ov45_02255DE8, ov45_0224F35C + .word ov45_02255DF0, ov45_0224F3C0 + .word ov45_02255DEC, ov45_0224F428 + .word ov45_02255D74, ov45_0224F490 + +ov45_022565C0: ; 0x022565C0 + .asciz "chat != NULL" + .balign 4, 0 + +ov45_022565D0: ; 0x022565D0 + .asciz "chatHandlers.c" + .balign 4, 0 + +ov45_022565E0: ; 0x022565E0 + .asciz "numMatches > 0" + .balign 4, 0 + +ov45_022565F0: ; 0x022565F0 + .asciz "matches" + .balign 4, 0 + +ov45_022565F8: ; 0x022565F8 + .asciz "(matches[i].type >= 0) && (matches[i].type < NUM_TYPES)" + .balign 4, 0 + +ov45_02256630: ; 0x02256630 + .asciz "channel" + .balign 4, 0 + +ov45_02256638: ; 0x02256638 + .asciz "channel[0]" + .balign 4, 0 + +ov45_02256644: ; 0x02256644 + .asciz "filter != NULL" + .balign 4, 0 + +ov45_02256654: ; 0x02256654 + .asciz "filter" + .balign 4, 0 + +ov45_0225665C: ; 0x0225665C + .asciz "(filter->type >= 0) && (filter->type < NUM_TYPES)" + .balign 4, 0 + +ov45_02256690: ; 0x02256690 + .asciz "0" + .balign 4, 0 + +ov45_02256694: ; 0x02256694 + .asciz "Timed out" + .balign 4, 0 + +ov45_022566A0: ; 0x022566A0 + .asciz "ID > 0" + .balign 4, 0 + +ov45_022566A8: ; 0x022566A8 + .asciz "password != NULL" + .balign 4, 0 + +ov45_022566BC: ; 0x022566BC + .asciz "strlen(password) < MAX_PASSWORD" + .balign 4, 0 + +ov45_022566DC: ; 0x022566DC + .asciz "b_*" + .balign 4, 0 + +ov45_022566E0: ; 0x022566E0 + .asciz "mode != NULL" + .balign 4, 0 + +ov45_022566F0: ; 0x022566F0 + .asciz "message->numParams == 2" + .balign 4, 0 + +ov45_02256708: ; 0x02256708 + .asciz "" + .balign 4, 0 + +ov45_0225670C: ; 0x0225670C + .asciz "ACTION" + .balign 4, 0 + +ov45_02256714: ; 0x02256714 + .asciz "PONG %s" + .balign 4, 0 + +ov45_0225671C: ; 0x0225671C + .asciz "message->numParams == 1" + .balign 4, 0 + +ov45_02256734: ; 0x02256734 + .asciz "strlen(newNick) < MAX_NICK" + .balign 4, 0 + +ov45_02256750: ; 0x02256750 + .asciz "*nick != '\\0'" + .balign 4, 0 + +ov45_02256760: ; 0x02256760 + .asciz "MODE %s" + .balign 4, 0 + +ov45_02256768: ; 0x02256768 + .asciz "(message->numParams == 2) || (message->numParams == 3)" + .balign 4, 0 + +ov45_022567A0: ; 0x022567A0 + .asciz "user != NULL" + .balign 4, 0 + +ov45_022567B0: ; 0x022567B0 + .asciz "user[0] != '\\0'" + .balign 4, 0 + +ov45_022567C0: ; 0x022567C0 + .asciz "channel != NULL" + .balign 4, 0 + +ov45_022567D0: ; 0x022567D0 + .asciz "channel[0] != '\\0'" + .balign 4, 0 + +ov45_022567E4: ; 0x022567E4 + .asciz "reason != NULL" + .balign 4, 0 + +ov45_022567F4: ; 0x022567F4 + .asciz "message->numParams >= 2" + .balign 4, 0 + +ov45_0225680C: ; 0x0225680C + .asciz "message->numParams == 4" + .balign 4, 0 + +ov45_02256824: ; 0x02256824 + .asciz " " + .balign 4, 0 + +ov45_02256828: ; 0x02256828 + .asciz "nick[0] != '\\0'" + .balign 4, 0 + +ov45_02256838: ; 0x02256838 + .asciz "nick[1] != '\\0'" + .balign 4, 0 + +ov45_02256848: ; 0x02256848 + .asciz "message->numParams == 3" + .balign 4, 0 + +ov45_02256860: ; 0x02256860 + .asciz "*" + .balign 4, 0 + +ov45_02256864: ; 0x02256864 + .asciz "connection->connecting" + .balign 4, 0 + +ov45_0225687C: ; 0x0225687C + .asciz "message->numParams == 8" + .balign 4, 0 + +ov45_02256894: ; 0x02256894 + .asciz "flags" + .balign 4, 0 + +ov45_0225689C: ; 0x0225689C + .asciz "len" + .balign 4, 0 + +ov45_022568A0: ; 0x022568A0 + .asciz "message->numParams == 5" + .balign 4, 0 + +ov45_022568B8: ; 0x022568B8 + .asciz "BCAST" + .balign 4, 0 + +ov45_022568C0: ; 0x022568C0 + .asciz "b_" + .balign 4, 0 + +ov45_022568C4: ; 0x022568C4 + .asciz "message->numParams >= 1" + .balign 4, 0 + +ov45_022568DC: ; 0x022568DC + .asciz "data != NULL" + .balign 4, 0 + +ov45_022568EC: ; 0x022568EC + .asciz "message->numParams >=3" + .balign 4, 0 + +ov45_02256904: ; 0x02256904 + .asciz "message->numParams == 6" + .balign 4, 0 + +ov45_0225691C: ; 0x0225691C + .asciz "data->channel != NULL" + .balign 4, 0 + +ov45_02256934: ; 0x02256934 + .asciz "data->channel[0] != '\\0'" + .balign 4, 0 + +ov45_02256950: ; 0x02256950 + .asciz "MODE %s +b *!*@%s" + .balign 4, 0 + +ov45_02256964: ; 0x02256964 + .asciz "message->numParams >= 3" + .balign 4, 0 + +ov45_0225697C: ; 0x0225697C + .asciz "data->numBans >= 0" + .balign 4, 0 + +ov45_02256990: ; 0x02256990 + .asciz "USRIP" + .balign 4, 0 + +ov45_02256998: ; 0x02256998 + .asciz "\\" + .balign 4, 0 + +ov45_0225699C: ; 0x0225699C + .asciz "" + .balign 4, 0 + +ov45_022569A0: ; 0x022569A0 + .asciz "ciThink" + .balign 4, 0 + +ov45_022569A8: ; 0x022569A8 + .asciz "ciSendNick" + .balign 4, 0 + +ov45_022569B4: ; 0x022569B4 + .asciz "ciSendUser" + .balign 4, 0 + +ov45_022569C0: ; 0x022569C0 + .asciz "ciNickError" + .balign 4, 0 + +ov45_022569CC: ; 0x022569CC + .asciz "ciSendLogin" + .balign 4, 0 + +ov45_022569D8: ; 0x022569D8 + .asciz "chatInChannelA" + .balign 4, 0 + +ov45_022569E8: ; 0x022569E8 + .asciz "chatDisconnect" + .balign 4, 0 + +ov45_022569F8: ; 0x022569F8 + .asciz "chatEnumUsersA" + .balign 4, 0 + +ov45_02256A08: ; 0x02256A08 + .asciz "chatConnectDoit" + .balign 4, 0 + +ov45_02256A18: ; 0x02256A18 + .asciz "chatEnumChannelsA" + .balign 4, 0 + +ov45_02256A2C: ; 0x02256A2C + .asciz "chatEnterChannelA" + .balign 4, 0 + +ov45_02256A40: ; 0x02256A40 + .asciz "chatLeaveChannelA" + .balign 4, 0 + +ov45_02256A54: ; 0x02256A54 + .asciz "ciHandleDisconnect" + .balign 4, 0 + +ov45_02256A68: ; 0x02256A68 + .asciz "chatRetryWithNickA" + .balign 4, 0 + +ov45_02256A7C: ; 0x02256A7C + .asciz "ciSendGetChannelKey" + .balign 4, 0 + +ov45_02256A90: ; 0x02256A90 + .asciz "ciEnumUsersCallback" + .balign 4, 0 + +ov45_02256AA4: ; 0x02256AA4 + .asciz "chatGetChannelKeysA" + .balign 4, 0 + +ov45_02256AB8: ; 0x02256AB8 + .asciz "chatSetChannelKeysA" + .balign 4, 0 + +ov45_02256ACC: ; 0x02256ACC + .asciz "chatSetChannelModeA" + .balign 4, 0 + +ov45_02256AE0: ; 0x02256AE0 + .asciz "chatGetChannelModeA" + .balign 4, 0 + +ov45_02256AF4: ; 0x02256AF4 + .asciz "chatSetChannelLimitA" + .balign 4, 0 + +ov45_02256B0C: ; 0x02256B0C + .asciz "chatSendUserMessageA" + .balign 4, 0 + +ov45_02256B24: ; 0x02256B24 + .asciz "ciProcessServerMessage" + .balign 4, 0 + +ov45_02256B3C: ; 0x02256B3C + .asciz "chatRegisterUniqueNickA" + .balign 4, 0 + +ov45_02256B54: ; 0x02256B54 + .asciz "chatGetChannelNumUsersA" + .balign 4, 0 + +ov45_02256B6C: ; 0x02256B6C + .asciz "chatSendChannelMessageA" + .balign 4, 0 + +ov45_02256B84: ; 0x02256B84 + .asciz "message != NULL" + .balign 4, 0 + +ov45_02256B94: ; 0x02256B94 + .asciz "chatMain.c" + .balign 4, 0 + +ov45_02256BA0: ; 0x02256BA0 + .asciz "chat != NULL" + .balign 4, 0 + +ov45_02256BB0: ; 0x02256BB0 + .asciz "Disconnected" + .balign 4, 0 + +ov45_02256BC0: ; 0x02256BC0 + .asciz "*" + .balign 4, 0 + +ov45_02256BC4: ; 0x02256BC4 + .asciz "NICK %s" + .balign 4, 0 + +ov45_02256BCC: ; 0x02256BCC + .asciz "USER %s %s %s :%s" + .balign 4, 0 + +ov45_02256BE0: ; 0x02256BE0 + .asciz "127.0.0.1" + .balign 4, 0 + +ov45_02256BEC: ; 0x02256BEC + .asciz "LOGINPREAUTH %s %s" + .balign 4, 0 + +ov45_02256C00: ; 0x02256C00 + .asciz "LOGIN %d %s %s" + .balign 4, 0 + +ov45_02256C10: ; 0x02256C10 + .asciz "LOGIN %d * %s :%s@%s" + .balign 4, 0 + +ov45_02256C28: ; 0x02256C28 + .asciz "0" + .balign 4, 0 + +ov45_02256C2C: ; 0x02256C2C + .asciz "" + .balign 4, 0 + +ov45_02256C30: ; 0x02256C30 + .asciz "serverAddress != NULL" + .balign 4, 0 + +ov45_02256C48: ; 0x02256C48 + .asciz "callbacks != NULL" + .balign 4, 0 + +ov45_02256C5C: ; 0x02256C5C + .asciz "connectCallback != NULL" + .balign 4, 0 + +ov45_02256C74: ; 0x02256C74 + .asciz "nick != NULL" + .balign 4, 0 + +ov45_02256C84: ; 0x02256C84 + .asciz "nick[0] != '\\0'" + .balign 4, 0 + +ov45_02256C94: ; 0x02256C94 + .asciz "strlen(nick) < MAX_NICK" + .balign 4, 0 + +ov45_02256CAC: ; 0x02256CAC + .asciz "namespaceID > 0" + .balign 4, 0 + +ov45_02256CBC: ; 0x02256CBC + .asciz "uniquenick && uniquenick[0]" + .balign 4, 0 + +ov45_02256CD8: ; 0x02256CD8 + .asciz "password && password[0]" + .balign 4, 0 + +ov45_02256CF0: ; 0x02256CF0 + .asciz "namespaceID >= 0" + .balign 4, 0 + +ov45_02256D04: ; 0x02256D04 + .asciz "email && email[0]" + .balign 4, 0 + +ov45_02256D18: ; 0x02256D18 + .asciz "profilenick && profilenick[0]" + .balign 4, 0 + +ov45_02256D38: ; 0x02256D38 + .asciz "authtoken && authtoken[0]" + .balign 4, 0 + +ov45_02256D54: ; 0x02256D54 + .asciz "partnerchallenge && partnerchallenge[0]" + .balign 4, 0 + +ov45_02256D7C: ; 0x02256D7C + .asciz "preauth" + .balign 4, 0 + +ov45_02256D84: ; 0x02256D84 + .asciz "gamename && gamename[0]" + .balign 4, 0 + +ov45_02256D9C: ; 0x02256D9C + .asciz "secretKey && secretKey[0]" + .balign 4, 0 + +ov45_02256DB8: ; 0x02256DB8 + .asciz "CRYPT des %d %s" + .balign 4, 0 + +ov45_02256DC8: ; 0x02256DC8 + .asciz "USRIP" + .balign 4, 0 + +ov45_02256DD0: ; 0x02256DD0 + .asciz "NICK :%s" + .balign 4, 0 + +ov45_02256DDC: ; 0x02256DDC + .asciz "REGISTERNICK %d %s %s" + .balign 4, 0 + +ov45_02256DF4: ; 0x02256DF4 + .asciz "QUIT :Later!" + .balign 4, 0 + +ov45_02256E04: ; 0x02256E04 + .asciz "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"#$%&'()*+,-./:;<=>?@[]^_`{|}~" + .balign 4, 0 + +ov45_02256E64: ; 0x02256E64 + .asciz "(callbackAll != NULL) || (callbackEach != NULL)" + .balign 4, 0 + +ov45_02256E94: ; 0x02256E94 + .asciz "LIST %s" + .balign 4, 0 + +ov45_02256E9C: ; 0x02256E9C + .asciz "channel != NULL" + .balign 4, 0 + +ov45_02256EAC: ; 0x02256EAC + .asciz "channel[0] != '\\0'" + .balign 4, 0 + +ov45_02256EC0: ; 0x02256EC0 + .asciz "JOIN %s %s" + .balign 4, 0 + +ov45_02256ECC: ; 0x02256ECC + .asciz "PART %s :%s" + .balign 4, 0 + +ov45_02256ED8: ; 0x02256ED8 + .asciz "(type == CHAT_MESSAGE) || (type == CHAT_ACTION) || (type == CHAT_NOTICE) || (type == CHAT_UTM) || (type == CHAT_ATM)" + .balign 4, 0 + +ov45_02256F50: ; 0x02256F50 + .asciz "PRIVMSG %s :%s" + .balign 4, 0 + +ov45_02256F60: ; 0x02256F60 + .asciz "PRIVMSG %s :ACTION %s" + .balign 4, 0 + +ov45_02256F78: ; 0x02256F78 + .asciz "NOTICE %s :%s" + .balign 4, 0 + +ov45_02256F88: ; 0x02256F88 + .asciz "UTM %s :%s" + .balign 4, 0 + +ov45_02256F94: ; 0x02256F94 + .asciz "ATM %s :%s" + .balign 4, 0 + +ov45_02256FA0: ; 0x02256FA0 + .asciz "callback != NULL" + .balign 4, 0 + +ov45_02256FB4: ; 0x02256FB4 + .asciz "mode != NULL" + .balign 4, 0 + +ov45_02256FC4: ; 0x02256FC4 + .asciz "XiXpXsXmXnXtXlXe" + .balign 4, 0 + +ov45_02256FD8: ; 0x02256FD8 + .asciz " %d" + .balign 4, 0 + +ov45_02256FDC: ; 0x02256FDC + .asciz "MODE %s %s" + .balign 4, 0 + +ov45_02256FE8: ; 0x02256FE8 + .asciz "MODE %s" + .balign 4, 0 + +ov45_02256FF0: ; 0x02256FF0 + .asciz "limit >= 0" + .balign 4, 0 + +ov45_02256FFC: ; 0x02256FFC + .asciz "MODE %s +l %d" + .balign 4, 0 + +ov45_0225700C: ; 0x0225700C + .asciz "MODE %s -l" + .balign 4, 0 + +ov45_02257018: ; 0x02257018 + .asciz "numUsers >= 0" + .balign 4, 0 + +ov45_02257028: ; 0x02257028 + .asciz "param != NULL" + .balign 4, 0 + +ov45_02257038: ; 0x02257038 + .asciz "data->callback != NULL" + .balign 4, 0 + +ov45_02257050: ; 0x02257050 + .asciz "NAMES %s" + .balign 4, 0 + +ov45_0225705C: ; 0x0225705C + .asciz "user != NULL" + .balign 4, 0 + +ov45_0225706C: ; 0x0225706C + .asciz "user[0] != '\\0'" + .balign 4, 0 + +ov45_0225707C: ; 0x0225707C + .asciz "strlen(user) < MAX_USER" + .balign 4, 0 + +ov45_02257094: ; 0x02257094 + .asciz "\\%s\\%s" + .balign 4, 0 + +ov45_0225709C: ; 0x0225709C + .asciz "%03d" + .balign 4, 0 + +ov45_022570A4: ; 0x022570A4 + .asciz "cookie && cookie[0]" + .balign 4, 0 + +ov45_022570B8: ; 0x022570B8 + .asciz "num >= 0" + .balign 4, 0 + +ov45_022570C4: ; 0x022570C4 + .asciz "SETCHANKEY %s :" + .balign 4, 0 + +ov45_022570D4: ; 0x022570D4 + .asciz "SETCKEY %s %s :" + .balign 4, 0 + +ov45_022570E4: ; 0x022570E4 + .asciz "channel && channel[0]" + .balign 4, 0 + +ov45_022570FC: ; 0x022570FC + .asciz "!num || keys" + .balign 4, 0 + +ov45_0225710C: ; 0x0225710C + .asciz "GETCHANKEY %s %s 0 :" + .balign 4, 0 + +ov45_02257124: ; 0x02257124 + .asciz "GETCKEY %s %s %s 0 :" + .balign 4, 0 + +ov45_0225713C: ; 0x0225713C + .asciz "b_*" + .balign 4, 0 + +ov45_02257140: ; 0x02257140 + .asciz "\\b_*" + .balign 4, 0 + +ov45_02257148: ; 0x02257148 + .asciz "ciParseUser" + .balign 4, 0 + +ov45_02257154: ; 0x02257154 + .asciz "ciSocketSend" + .balign 4, 0 + +ov45_02257164: ; 0x02257164 + .asciz "ciSocketRecv" + .balign 4, 0 + +ov45_02257174: ; 0x02257174 + .asciz "ciBufferInit" + .balign 4, 0 + +ov45_02257184: ; 0x02257184 + .asciz "ciParseParam" + .balign 4, 0 + +ov45_02257194: ; 0x02257194 + .asciz "ciSocketInit" + .balign 4, 0 + +ov45_022571A4: ; 0x022571A4 + .asciz "ciSocketSendf" + .balign 4, 0 + +ov45_022571B4: ; 0x022571B4 + .asciz "ciSocketThink" + .balign 4, 0 + +ov45_022571C4: ; 0x022571C4 + .asciz "ciParseMessage" + .balign 4, 0 + +ov45_022571D4: ; 0x022571D4 + .asciz "ciSocketConnect" + .balign 4, 0 + +ov45_022571E4: ; 0x022571E4 + .asciz "ciBufferPreAppend" + .balign 4, 0 + +ov45_022571F8: ; 0x022571F8 + .asciz "ciBufferClipFront" + .balign 4, 0 + +ov45_0225720C: ; 0x0225720C + .asciz "ciSocketThinkSend" + .balign 4, 0 + +ov45_02257220: ; 0x02257220 + .asciz "ciSocketThinkRecv" + .balign 4, 0 + +ov45_02257234: ; 0x02257234 + .asciz "ciSocketDisconnect" + .balign 4, 0 + +ov45_02257248: ; 0x02257248 + .asciz "buffer != NULL" + .balign 4, 0 + +ov45_02257258: ; 0x02257258 + .asciz "chatSocket.c" + .balign 4, 0 + +ov45_02257268: ; 0x02257268 + .asciz "(buffer) != NULL" + .balign 4, 0 + +ov45_0225727C: ; 0x0225727C + .asciz "(buffer)->size >= 0" + .balign 4, 0 + +ov45_02257290: ; 0x02257290 + .asciz "((buffer)->size % BUFFER_INC) == 0" + .balign 4, 0 + +ov45_022572B4: ; 0x022572B4 + .asciz "(buffer)->length >= 0" + .balign 4, 0 + +ov45_022572CC: ; 0x022572CC + .asciz "(buffer)->length <= (buffer)->size" + .balign 4, 0 + +ov45_022572F0: ; 0x022572F0 + .asciz "len >= 0" + .balign 4, 0 + +ov45_022572FC: ; 0x022572FC + .asciz "len <= SHRT_MAX" + .balign 4, 0 + +ov45_0225730C: ; 0x0225730C + .asciz "len <= buffer->length" + .balign 4, 0 + +ov45_02257324: ; 0x02257324 + .asciz "sock != NULL" + .balign 4, 0 + +ov45_02257334: ; 0x02257334 + .asciz "(sock) != NULL" + .balign 4, 0 + +ov45_02257344: ; 0x02257344 + .asciz "((sock)->connectState == ciNotConnected) || ((sock)->connectState == ciConnected) || ((sock)->connectState == ciDisconnected)" + .balign 4, 0 + +ov45_022573C4: ; 0x022573C4 + .asciz "(&(sock)->inputQueue) != NULL" + .balign 4, 0 + +ov45_022573E4: ; 0x022573E4 + .asciz "(&(sock)->inputQueue)->size >= 0" + .balign 4, 0 + +ov45_02257408: ; 0x02257408 + .asciz "((&(sock)->inputQueue)->size % BUFFER_INC) == 0" + .balign 4, 0 + +ov45_02257438: ; 0x02257438 + .asciz "(&(sock)->inputQueue)->length >= 0" + .balign 4, 0 + +ov45_0225745C: ; 0x0225745C + .asciz "(&(sock)->inputQueue)->length <= (&(sock)->inputQueue)->size" + .balign 4, 0 + +ov45_0225749C: ; 0x0225749C + .asciz "(&(sock)->outputQueue) != NULL" + .balign 4, 0 + +ov45_022574BC: ; 0x022574BC + .asciz "(&(sock)->outputQueue)->size >= 0" + .balign 4, 0 + +ov45_022574E0: ; 0x022574E0 + .asciz "((&(sock)->outputQueue)->size % BUFFER_INC) == 0" + .balign 4, 0 + +ov45_02257514: ; 0x02257514 + .asciz "(&(sock)->outputQueue)->length >= 0" + .balign 4, 0 + +ov45_02257538: ; 0x02257538 + .asciz "(&(sock)->outputQueue)->length <= (&(sock)->outputQueue)->size" + .balign 4, 0 + +ov45_02257578: ; 0x02257578 + .asciz "serverAddress != NULL" + .balign 4, 0 + +ov45_02257590: ; 0x02257590 + .asciz "port >= 0" + .balign 4, 0 + +ov45_0225759C: ; 0x0225759C + .asciz "port <= USHRT_MAX" + .balign 4, 0 + +ov45_022575B0: ; 0x022575B0 + .asciz "sock->connectState == ciNotConnected" + .balign 4, 0 + +ov45_022575D8: ; 0x022575D8 + .asciz "(sock)->connectState == ciConnected" + .balign 4, 0 + +ov45_022575FC: ; 0x022575FC + .asciz "0" + .balign 4, 0 + +ov45_02257600: ; 0x02257600 + .asciz "pText != NULL" + .balign 4, 0 + +ov45_02257610: ; 0x02257610 + .asciz "message != NULL" + .balign 4, 0 + +ov45_02257620: ; 0x02257620 + .asciz " :" + .balign 4, 0 + +ov45_02257624: ; 0x02257624 + .asciz " " + .balign 4, 0 + +ov45_02257628: ; 0x02257628 + .byte 0x00, 0x00, 0x00, 0x00 + +ov45_0225762C: ; 0x0225762C + .byte 0x02, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_0225763C: ; 0x0225763C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_0225765C: ; 0x0225765C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_022576A0: ; 0x022576A0 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +ov45_022576CC: ; 0x022576CC + .asciz "&hash=" + .balign 4, 0 + +ov45_022576D4: ; 0x022576D4 + .asciz "error:" + .balign 4, 0 + +ov45_022576DC: ; 0x022576DC + .asciz "http://gamestats2.gs.nintendowifi.net/" + .balign 4, 0 + +ov45_02257704: ; 0x02257704 + .asciz "http://sdkdev.gamespy.com/games/" + .balign 4, 0 + +ov45_02257728: ; 0x02257728 + .asciz "http://ishikawa.servebeer.com/games/" + .balign 4, 0 + +ov45_02257750: ; 0x02257750 + .asciz "&data=" + .balign 4, 0 + +ov45_02257758: ; 0x02257758 + .asciz "%d" + .balign 4, 0 + +ov45_0225775C: ; 0x0225775C + .asciz "?pid=" + .balign 4, 0 + +ov45_02257764: ; 0x02257764 + .asciz "%s%s%s?pid=%d&hash=%s&data=" + .balign 4, 0 + +ov45_02257780: ; 0x02257780 + .asciz "0000000000000000000000000000000000000000" + .balign 4, 0 + +ov45_022577AC: ; 0x022577AC + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + + .bss + +_022577C4: + .space 0x4 + +ov45_022577C8: ; 0x022577C8 + .space 0x4 + +ov45_022577CC: ; 0x022577CC + .space 0x4 + +ov45_022577D0: ; 0x022577D0 + .space 0x4 + +ov45_022577D4: ; 0x022577D4 + .space 0x4 + +ov45_022577D8: ; 0x022577D8 + .space 0x4 + +ov45_022577DC: ; 0x022577DC + .space 0x4 + +ov45_022577E0: ; 0x022577E0 + .space 0x4 + +ov45_022577E4: ; 0x022577E4 + .space 0x4 + +ov45_022577E8: ; 0x022577E8 + .space 0x8 + +ov45_022577F0: ; 0x022577F0 + .space 0x4 + +ov45_022577F4: ; 0x022577F4 + .space 0x4 + +ov45_022577F8: ; 0x022577F8 + .space 0x1000 + +ov45_022587F8: ; 0x022587F8 + .space 0x8 diff --git a/lib/NitroSDK/asm/fx.s b/lib/NitroSDK/asm/fx.s new file mode 100644 index 00000000..5ec64c59 --- /dev/null +++ b/lib/NitroSDK/asm/fx.s @@ -0,0 +1,30 @@ + .include "asm/macros.inc" + .include "fx.inc" + .include "global.inc" + .text + + arm_func_start FX_Init +FX_Init: ; 0x020CD784 + bx lr + arm_func_end FX_Init + + arm_func_start FX_Modf +FX_Modf: ; 0x020CD788 + cmp r0, #0 + ldr r2, _020CD7C0 ; =0x7FFFF000 + blt _020CD7A4 + and r3, r0, r2 + str r3, [r1] + and r0, r0, r2, lsr #19 + bx lr +_020CD7A4: + rsb ip, r0, #0 + and r0, ip, r2 + rsb r3, r0, #0 + and r0, ip, r2, lsr #19 + str r3, [r1] + rsb r0, r0, #0 + bx lr + .align 2, 0 +_020CD7C0: .word 0x7FFFF000 + arm_func_end FX_Modf diff --git a/lib/NitroSDK/asm/fx_atanidx.s b/lib/NitroSDK/asm/fx_atanidx.s new file mode 100644 index 00000000..f8b80a05 --- /dev/null +++ b/lib/NitroSDK/asm/fx_atanidx.s @@ -0,0 +1,264 @@ + .include "asm/macros.inc" + .include "fx_atanidx.inc" + .include "global.inc" + .text + + arm_func_start FX_Atan2Idx +FX_Atan2Idx: ; 0x020CD5DC + stmdb sp!, {r4, lr} + cmp r0, #0 + ble _020CD670 + cmp r1, #0 + ble _020CD628 + cmp r1, r0 + ble _020CD608 + mov r2, r0 + mov r4, #0 + mov r0, #1 + b _020CD720 +_020CD608: + bge _020CD620 + mov r2, r1 + mov r1, r0 + mov r4, #0x4000 + mov r0, #0 + b _020CD720 +_020CD620: + mov r0, #0x2000 + ldmia sp!, {r4, pc} +_020CD628: + bge _020CD668 + rsb r1, r1, #0 + cmp r1, r0 + bge _020CD64C + mov r2, r1 + mov r1, r0 + mov r4, #0x4000 + mov r0, #1 + b _020CD720 +_020CD64C: + ble _020CD660 + mov r2, r0 + mov r4, #0x8000 + mov r0, #0 + b _020CD720 +_020CD660: + mov r0, #0x6000 + ldmia sp!, {r4, pc} +_020CD668: + mov r0, #0x4000 + ldmia sp!, {r4, pc} +_020CD670: + bge _020CD710 + cmp r1, #0 + rsb r0, r0, #0 + bge _020CD6C4 + rsb r1, r1, #0 + cmp r1, r0 + ble _020CD6A0 + mov r4, #0x8000 + mov r2, r0 + rsb r4, r4, #0 + mov r0, #1 + b _020CD720 +_020CD6A0: + bge _020CD6BC + mov r4, #0x4000 + mov r2, r1 + mov r1, r0 + rsb r4, r4, #0 + mov r0, #0 + b _020CD720 +_020CD6BC: + mov r0, #0xa000 + ldmia sp!, {r4, pc} +_020CD6C4: + cmp r1, #0 + ble _020CD708 + cmp r1, r0 + bge _020CD6EC + mov r4, #0x4000 + mov r2, r1 + mov r1, r0 + rsb r4, r4, #0 + mov r0, #1 + b _020CD720 +_020CD6EC: + ble _020CD700 + mov r4, #0 + mov r2, r0 + mov r0, r4 + b _020CD720 +_020CD700: + mov r0, #0xe000 + ldmia sp!, {r4, pc} +_020CD708: + mov r0, #0xc000 + ldmia sp!, {r4, pc} +_020CD710: + cmp r1, #0 + movge r0, #0 + movlt r0, #0x8000 + ldmia sp!, {r4, pc} +_020CD720: + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r0, #0 + mov r0, r2 + beq _020CD75C + bl FX_Div + mov r1, r0, asr #5 + ldr r0, _020CD780 ; =FX_AtanIdxTable_ + mov r1, r1, lsl #1 + ldrsh r0, [r0, r1] + add r0, r4, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, pc} +_020CD75C: + bl FX_Div + mov r1, r0, asr #5 + ldr r0, _020CD780 ; =FX_AtanIdxTable_ + mov r1, r1, lsl #1 + ldrsh r0, [r0, r1] + sub r0, r4, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CD780: .word FX_AtanIdxTable_ + arm_func_end FX_Atan2Idx + + .rodata + +FX_AtanIdxTable_: + .short 0x0000 + .short 0x0051 + .short 0x00A3 + .short 0x00F4 + .short 0x0146 + .short 0x0197 + .short 0x01E9 + .short 0x023A + .short 0x028B + .short 0x02DC + .short 0x032D + .short 0x037E + .short 0x03CF + .short 0x0420 + .short 0x0470 + .short 0x04C1 + .short 0x0511 + .short 0x0561 + .short 0x05B1 + .short 0x0601 + .short 0x0651 + .short 0x06A0 + .short 0x06EF + .short 0x073E + .short 0x078D + .short 0x07DC + .short 0x082A + .short 0x0878 + .short 0x08C6 + .short 0x0914 + .short 0x0961 + .short 0x09AE + .short 0x09FB + .short 0x0A48 + .short 0x0A94 + .short 0x0AE0 + .short 0x0B2C + .short 0x0B77 + .short 0x0BC2 + .short 0x0C0D + .short 0x0C57 + .short 0x0CA1 + .short 0x0CEB + .short 0x0D34 + .short 0x0D7D + .short 0x0DC6 + .short 0x0E0F + .short 0x0E56 + .short 0x0E9E + .short 0x0EE5 + .short 0x0F2C + .short 0x0F73 + .short 0x0FB9 + .short 0x0FFF + .short 0x1044 + .short 0x1089 + .short 0x10CE + .short 0x1112 + .short 0x1156 + .short 0x1199 + .short 0x11DC + .short 0x121F + .short 0x1261 + .short 0x12A3 + .short 0x12E4 + .short 0x1325 + .short 0x1366 + .short 0x13A6 + .short 0x13E6 + .short 0x1425 + .short 0x1464 + .short 0x14A2 + .short 0x14E0 + .short 0x151E + .short 0x155B + .short 0x1598 + .short 0x15D5 + .short 0x1611 + .short 0x164C + .short 0x1688 + .short 0x16C2 + .short 0x16FD + .short 0x1737 + .short 0x1770 + .short 0x17AA + .short 0x17E2 + .short 0x181B + .short 0x1853 + .short 0x188A + .short 0x18C1 + .short 0x18F8 + .short 0x192E + .short 0x1964 + .short 0x199A + .short 0x19CF + .short 0x1A04 + .short 0x1A38 + .short 0x1A6C + .short 0x1A9F + .short 0x1AD3 + .short 0x1B05 + .short 0x1B38 + .short 0x1B6A + .short 0x1B9C + .short 0x1BCD + .short 0x1BFE + .short 0x1C2E + .short 0x1C5E + .short 0x1C8E + .short 0x1CBE + .short 0x1CED + .short 0x1D1B + .short 0x1D4A + .short 0x1D78 + .short 0x1DA5 + .short 0x1DD3 + .short 0x1DFF + .short 0x1E2C + .short 0x1E58 + .short 0x1E84 + .short 0x1EB0 + .short 0x1EDB + .short 0x1F06 + .short 0x1F30 + .short 0x1F5A + .short 0x1F84 + .short 0x1FAE + .short 0x1FD7 + .short 0x2000 diff --git a/lib/NitroSDK/asm/fx_cp.s b/lib/NitroSDK/asm/fx_cp.s new file mode 100644 index 00000000..c34ed454 --- /dev/null +++ b/lib/NitroSDK/asm/fx_cp.s @@ -0,0 +1,181 @@ + .include "asm/macros.inc" + .include "fx_cp.inc" + .include "global.inc" + .text + + arm_func_start FX_Div +FX_Div: ; 0x020CCBA0 + stmdb sp!, {r3, lr} + bl FX_DivAsync + bl FX_GetDivResult + ldmia sp!, {r3, pc} + arm_func_end FX_Div + + arm_func_start FX_Inv +FX_Inv: ; 0x020CCBB0 + stmdb sp!, {r3, lr} + bl FX_InvAsync + bl FX_GetDivResult + ldmia sp!, {r3, pc} + arm_func_end FX_Inv + + arm_func_start FX_InvFx64c +FX_InvFx64c: ; 0x020CCBC0 + stmdb sp!, {r3, lr} + bl FX_InvAsync + ldr r1, _020CCBE4 ; =0x04000280 +_020CCBCC: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020CCBCC + ldr r1, _020CCBE8 ; =0x040002A0 + ldmia r1, {r0, r1} + ldmia sp!, {r3, pc} + .align 2, 0 +_020CCBE4: .word 0x04000280 +_020CCBE8: .word 0x040002A0 + arm_func_end FX_InvFx64c + + arm_func_start FX_Sqrt +FX_Sqrt: ; 0x020CCBEC + stmdb sp!, {r3, lr} + cmp r0, #0 + movle r0, #0 + ldmleia sp!, {r3, pc} + ldr r2, _020CCC1C ; =0x040002B0 + mov r1, #1 + strh r1, [r2] + mov r1, #0 + str r1, [r2, #8] + str r0, [r2, #0xc] + bl FX_GetSqrtResult + ldmia sp!, {r3, pc} + .align 2, 0 +_020CCC1C: .word 0x040002B0 + arm_func_end FX_Sqrt + + arm_func_start FX_GetDivResultFx64c +FX_GetDivResultFx64c: ; 0x020CCC20 + ldr r1, _020CCC3C ; =0x04000280 +_020CCC24: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020CCC24 + ldr r1, _020CCC40 ; =0x040002A0 + ldmia r1, {r0, r1} + bx lr + .align 2, 0 +_020CCC3C: .word 0x04000280 +_020CCC40: .word 0x040002A0 + arm_func_end FX_GetDivResultFx64c + + arm_func_start FX_GetDivResult +FX_GetDivResult: ; 0x020CCC44 + ldr r1, _020CCC74 ; =0x04000280 +_020CCC48: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020CCC48 + ldr r0, _020CCC78 ; =0x040002A0 + ldr r1, [r0] + ldr r0, [r0, #4] + adds r2, r1, #0x80000 + adc r1, r0, #0 + mov r0, r2, lsr #0x14 + orr r0, r0, r1, lsl #12 + bx lr + .align 2, 0 +_020CCC74: .word 0x04000280 +_020CCC78: .word 0x040002A0 + arm_func_end FX_GetDivResult + + arm_func_start FX_InvAsync +FX_InvAsync: ; 0x020CCC7C + ldr r2, _020CCCA8 ; =0x04000280 + mov r1, #1 + strh r1, [r2] + mov r1, #0 + str r1, [r2, #0x10] + mov r1, #0x1000 + str r1, [r2, #0x14] + str r0, [r2, #0x18] + mov r0, #0 + str r0, [r2, #0x1c] + bx lr + .align 2, 0 +_020CCCA8: .word 0x04000280 + arm_func_end FX_InvAsync + + arm_func_start FX_GetSqrtResult +FX_GetSqrtResult: ; 0x020CCCAC + ldr r1, _020CCCD0 ; =0x040002B0 +_020CCCB0: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020CCCB0 + ldr r0, _020CCCD4 ; =0x040002B4 + ldr r0, [r0] + add r0, r0, #0x200 + mov r0, r0, lsr #0xa + bx lr + .align 2, 0 +_020CCCD0: .word 0x040002B0 +_020CCCD4: .word 0x040002B4 + arm_func_end FX_GetSqrtResult + + arm_func_start FX_DivAsync +FX_DivAsync: ; 0x020CCCD8 + ldr r3, _020CCCFC ; =0x04000280 + mov r2, #1 + strh r2, [r3] + mov r2, #0 + str r2, [r3, #0x10] + str r0, [r3, #0x14] + str r1, [r3, #0x18] + str r2, [r3, #0x1c] + bx lr + .align 2, 0 +_020CCCFC: .word 0x04000280 + arm_func_end FX_DivAsync + + arm_func_start FX_DivS32 +FX_DivS32: ; 0x020CCD00 + ldr r2, _020CCD34 ; =0x04000280 + mov r3, #0 + strh r3, [r2] + str r0, [r2, #0x10] + str r1, [r2, #0x18] + mov r0, r3 + str r0, [r2, #0x1c] +_020CCD1C: + ldrh r0, [r2] + tst r0, #0x8000 + bne _020CCD1C + ldr r0, _020CCD38 ; =0x040002A0 + ldr r0, [r0] + bx lr + .align 2, 0 +_020CCD34: .word 0x04000280 +_020CCD38: .word 0x040002A0 + arm_func_end FX_DivS32 + + arm_func_start FX_ModS32 +FX_ModS32: ; 0x020CCD3C + ldr r2, _020CCD70 ; =0x04000280 + mov r3, #0 + strh r3, [r2] + str r0, [r2, #0x10] + str r1, [r2, #0x18] + mov r0, r3 + str r0, [r2, #0x1c] +_020CCD58: + ldrh r0, [r2] + tst r0, #0x8000 + bne _020CCD58 + ldr r0, _020CCD74 ; =0x040002A8 + ldr r0, [r0] + bx lr + .align 2, 0 +_020CCD70: .word 0x04000280 +_020CCD74: .word 0x040002A8 + arm_func_end FX_ModS32 diff --git a/lib/NitroSDK/asm/fx_mtx22.s b/lib/NitroSDK/asm/fx_mtx22.s new file mode 100644 index 00000000..64b7bb58 --- /dev/null +++ b/lib/NitroSDK/asm/fx_mtx22.s @@ -0,0 +1,50 @@ + .include "asm/macros.inc" + .include "fx_mtx22.inc" + .include "global.inc" + .text + + arm_func_start MTX_Identity22_ +MTX_Identity22_: ; 0x020CAF70 + mov r1, #0 + mov r2, #0x1000 + mov r3, #0 + stmia r0!, {r2, r3} + stmia r0!, {r1, r2} + bx lr + arm_func_end MTX_Identity22_ + + thumb_func_start MTX_Rot22_ +MTX_Rot22_: ; 0x020CAF88 + str r2, [r0] + str r1, [r0, #4] + neg r1, r1 + str r1, [r0, #8] + str r2, [r0, #0xc] + bx lr + thumb_func_end MTX_Rot22_ + + arm_func_start MTX_ScaleApply22 +MTX_ScaleApply22: ; 0x020CAF94 + stmdb sp!, {r3, lr} + ldr ip, [r0] + smull lr, ip, r2, ip + mov lr, lr, lsr #0xc + orr lr, lr, ip, lsl #20 + str lr, [r1] + ldr ip, [r0, #4] + smull lr, ip, r2, ip + mov r2, lr, lsr #0xc + orr r2, r2, ip, lsl #20 + str r2, [r1, #4] + ldr r2, [r0, #8] + smull ip, r2, r3, r2 + mov ip, ip, lsr #0xc + orr ip, ip, r2, lsl #20 + str ip, [r1, #8] + ldr r0, [r0, #0xc] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end MTX_ScaleApply22 diff --git a/lib/NitroSDK/asm/fx_mtx33.s b/lib/NitroSDK/asm/fx_mtx33.s new file mode 100644 index 00000000..954be822 --- /dev/null +++ b/lib/NitroSDK/asm/fx_mtx33.s @@ -0,0 +1,489 @@ + .include "asm/macros.inc" + .include "fx_mtx33.inc" + .include "global.inc" + .text + + arm_func_start MTX_Identity33_ +MTX_Identity33_: ; 0x020CAFEC + mov r2, #0x1000 + str r2, [r0, #0x20] + mov r3, #0 + stmia r0!, {r2, r3} + mov r1, #0 + stmia r0!, {r1, r3} + stmia r0!, {r2, r3} + stmia r0!, {r1, r3} + bx lr + arm_func_end MTX_Identity33_ + + arm_func_start MTX_ScaleApply33 +MTX_ScaleApply33: ; 0x020CB010 + stmdb sp!, {r4, lr} + ldr r4, [r0] + ldr ip, [sp, #8] + smull lr, r4, r2, r4 + mov lr, lr, lsr #0xc + orr lr, lr, r4, lsl #20 + str lr, [r1] + ldr r4, [r0, #4] + smull lr, r4, r2, r4 + mov lr, lr, lsr #0xc + orr lr, lr, r4, lsl #20 + str lr, [r1, #4] + ldr lr, [r0, #8] + smull r4, lr, r2, lr + mov r2, r4, lsr #0xc + orr r2, r2, lr, lsl #20 + str r2, [r1, #8] + ldr r2, [r0, #0xc] + smull lr, r2, r3, r2 + mov lr, lr, lsr #0xc + orr lr, lr, r2, lsl #20 + str lr, [r1, #0xc] + ldr r2, [r0, #0x10] + smull lr, r2, r3, r2 + mov lr, lr, lsr #0xc + orr lr, lr, r2, lsl #20 + str lr, [r1, #0x10] + ldr r2, [r0, #0x14] + smull lr, r2, r3, r2 + mov r3, lr, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [r1, #0x14] + ldr r2, [r0, #0x18] + smull r3, r2, ip, r2 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [r1, #0x18] + ldr r2, [r0, #0x1c] + smull r3, r2, ip, r2 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [r1, #0x1c] + ldr r0, [r0, #0x20] + smull r2, r0, ip, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [r1, #0x20] + ldmia sp!, {r4, pc} + arm_func_end MTX_ScaleApply33 + + thumb_func_start MTX_RotX33_ +MTX_RotX33_: ; 0x020CB0D0 + mov r3, #1 + lsl r3, r3, #0xc + str r3, [r0] + mov r3, #0 + str r3, [r0, #4] + str r3, [r0, #8] + str r3, [r0, #0xc] + str r2, [r0, #0x10] + str r1, [r0, #0x14] + str r3, [r0, #0x18] + neg r1, r1 + str r1, [r0, #0x1c] + str r2, [r0, #0x20] + bx lr + thumb_func_end MTX_RotX33_ + + thumb_func_start MTX_RotY33_ +MTX_RotY33_: ; 0x020CB0EC + str r2, [r0] + str r2, [r0, #0x20] + mov r3, #0 + str r3, [r0, #4] + str r3, [r0, #0xc] + str r3, [r0, #0x14] + str r3, [r0, #0x1c] + neg r2, r1 + mov r3, #1 + lsl r3, r3, #0xc + str r1, [r0, #0x18] + str r2, [r0, #8] + str r3, [r0, #0x10] + bx lr + thumb_func_end MTX_RotY33_ + + thumb_func_start MTX_RotZ33_ +MTX_RotZ33_: ; 0x020CB108 + stmia r0!, {r2} + mov r3, #0 + stmia r0!, {r1, r3} + neg r1, r1 + stmia r0!, {r1, r2} + mov r1, #1 + lsl r1, r1, #0xc + str r3, [r0] + str r3, [r0, #4] + str r3, [r0, #8] + str r1, [r0, #0xc] + bx lr + thumb_func_end MTX_RotZ33_ + + arm_func_start MTX_Inverse33 +MTX_Inverse33: ; 0x020CB120 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x50 + mov sl, r0 + ldr r0, [sl, #0x14] + cmp sl, r1 + addeq sb, sp, #0x2c + ldr r3, [sl, #0x18] + ldr r2, [sl, #0xc] + ldr r6, [sl, #0x20] + str r1, [sp] + movne sb, r1 + smull fp, r8, r2, r6 + smull r7, r1, r0, r3 + subs r7, fp, r7 + sbc ip, r8, r1 + ldr r4, [sl, #0x10] + ldr r5, [sl, #0x1c] + adds r1, r7, #0x800 + smull fp, r8, r4, r6 + smull r7, r6, r0, r5 + adc r0, ip, #0 + subs r7, fp, r7 + sbc r6, r8, r6 + mov r8, r1, lsr #0xc + orr r8, r8, r0, lsl #20 + smull r1, r0, r2, r5 + adds r7, r7, #0x800 + smull r5, r3, r4, r3 + adc r2, r6, #0 + mov r7, r7, lsr #0xc + orr r7, r7, r2, lsl #20 + subs r1, r1, r5 + sbc r5, r0, r3 + ldr r2, [sl] + adds r6, r1, #0x800 + ldr fp, [sl, #4] + smull r4, r3, r2, r7 + smull r1, r0, fp, r8 + adc r2, r5, #0 + mov r6, r6, lsr #0xc + orr r6, r6, r2, lsl #20 + subs r2, r4, r1 + ldr r1, [sl, #8] + sbc r0, r3, r0 + smlal r2, r0, r1, r6 + adds r1, r2, #0x800 + adc r2, r0, #0 + mov r0, r1, lsr #0xc + mov r1, r8, asr #0x1f + str r1, [sp, #4] + mov r1, r7, asr #0x1f + str r1, [sp, #8] + mov r1, r6, asr #0x1f + str r1, [sp, #0xc] + orrs r0, r0, r2, lsl #20 + mov r1, #0 + addeq sp, sp, #0x50 + subeq r0, r1, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl FX_InvAsync + ldr r1, [sl, #8] + ldr r2, [sl, #0x1c] + ldr fp, [sl, #0x10] + smull r0, r4, r2, r1 + smull r3, r2, fp, r1 + ldr r5, [sl, #0x18] + str r2, [sp, #0x18] + str r3, [sp, #0x14] + smull r3, r2, r5, r1 + str r2, [sp, #0x20] + ldr r2, [sl, #0x20] + str r3, [sp, #0x1c] + str r2, [sp, #0x10] + ldr r5, [sp, #0x10] + ldmia sl, {r3, lr} + smull ip, r5, lr, r5 + subs r0, ip, r0 + ldr r2, [sl, #0xc] + sbc r4, r5, r4 + smull r1, r5, r2, r1 + str r5, [sp, #0x28] + mov r5, r0, lsr #0xc + ldr fp, [sl, #0x14] + orr r5, r5, r4, lsl #20 + smull r4, r2, lr, fp + ldr r0, [sp, #0x14] + subs r4, r4, r0 + ldr r0, [sp, #0x18] + mov r4, r4, lsr #0xc + sbc r0, r2, r0 + orr r4, r4, r0, lsl #20 + ldr r0, [sp, #0x10] + ldr r2, [sp, #0x1c] + smull ip, r0, r3, r0 + subs r2, ip, r2 + ldr ip, [sp, #0x20] + sbc r0, r0, ip + smull ip, fp, r3, fp + ldr r3, [sp, #0x28] + subs r1, ip, r1 + sbc r3, fp, r3 + mov fp, r2, lsr #0xc + orr fp, fp, r0, lsl #20 + mov r0, r1, lsr #0xc + orr r0, r0, r3, lsl #20 + str r0, [sp, #0x24] + bl FX_GetDivResult + smull r2, r1, r0, r5 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + rsb lr, r2, #0 + smull r2, r1, r0, r4 + mov r4, r2, lsr #0xc + orr r4, r4, r1, lsl #20 + smull r2, r1, r0, fp + mov r3, r2, lsr #0xc + orr r3, r3, r1, lsl #20 + ldr r1, [sp, #0x24] + umull fp, r5, r0, r7 + smull r2, r1, r0, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + ldr r1, [sp, #8] + mov ip, r0, asr #0x1f + mla r5, r0, r1, r5 + mla r5, ip, r7, r5 + mov r1, fp, lsr #0xc + orr r1, r1, r5, lsl #20 + stmia sb, {r1, lr} + str r4, [sb, #8] + ldr r1, [sp, #4] + umull r5, r4, r0, r8 + mla r4, r0, r1, r4 + mla r4, ip, r8, r4 + mov r1, r5, lsr #0xc + orr r1, r1, r4, lsl #20 + rsb r1, r1, #0 + str r1, [sb, #0xc] + ldr r1, [sp, #0xc] + rsb r2, r2, #0 + str r3, [sb, #0x10] + str r2, [sb, #0x14] + umull r3, r2, r0, r6 + mla r2, r0, r1, r2 + mla r2, ip, r6, r2 + mov r1, r3, lsr #0xc + orr r1, r1, r2, lsl #20 + str r1, [sb, #0x18] + ldr r3, [sl] + ldr r1, [sl, #0x1c] + ldr r2, [sl, #0x18] + smull r5, r4, r3, r1 + ldr r1, [sl, #4] + smull r3, r1, r2, r1 + subs r2, r5, r3 + sbc r1, r4, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + smull r2, r1, r0, r2 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + rsb r1, r2, #0 + str r1, [sb, #0x1c] + ldr r4, [sl] + ldr r3, [sl, #0x10] + ldr r2, [sl, #0xc] + ldr r1, [sl, #4] + smull r6, r5, r4, r3 + smull r3, r1, r2, r1 + subs r2, r6, r3 + sbc r1, r5, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + mov r1, r2, asr #0x1f + umull r4, r3, r0, r2 + mla r3, r0, r1, r3 + add r0, sp, #0x2c + mla r3, ip, r2, r3 + mov r1, r4, lsr #0xc + orr r1, r1, r3, lsl #20 + str r1, [sb, #0x20] + cmp sb, r0 + bne _020CB404 + ldr r1, [sp] + bl MI_Copy36B +_020CB404: + mov r0, #0 + add sp, sp, #0x50 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end MTX_Inverse33 + + arm_func_start MTX_Concat33 +MTX_Concat33: ; 0x020CB410 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + mov ip, r2 + ldr r3, [r0, #4] + ldr r2, [r1, #0xc] + cmp ip, r1 + smull r7, r5, r3, r2 + ldr r6, [r0] + ldr r4, [r1] + addeq sl, sp, #0x1c + smlal r7, r5, r6, r4 + ldr r2, [r0, #8] + ldr r4, [r1, #0x18] + movne sl, ip + smlal r7, r5, r2, r4 + mov r4, r7, lsr #0xc + orr r4, r4, r5, lsl #20 + str r4, [sl] + ldr r4, [r1, #0x10] + ldr r5, [r1, #4] + smull r8, r7, r3, r4 + smlal r8, r7, r6, r5 + ldr r4, [r1, #0x1c] + smlal r8, r7, r2, r4 + mov r4, r8, lsr #0xc + orr r4, r4, r7, lsl #20 + str r4, [sl, #4] + ldr r4, [r1, #0x14] + ldr r5, [r1, #8] + smull r8, r7, r3, r4 + smlal r8, r7, r6, r5 + ldr r3, [r1, #0x20] + smlal r8, r7, r2, r3 + mov r2, r8, lsr #0xc + orr r2, r2, r7, lsl #20 + str r2, [sl, #8] + ldr sb, [r0, #0x10] + ldr r2, [r0, #0xc] + smull r7, r6, sb, r4 + smlal r7, r6, r2, r5 + ldr r4, [r0, #0x14] + smlal r7, r6, r4, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + str r3, [sl, #0x14] + ldr r3, [r1, #0x10] + ldr r5, [r1, #4] + smull r7, r6, sb, r3 + smlal r7, r6, r2, r5 + ldr r5, [r1, #0x1c] + mov r3, sb, asr #0x1f + smlal r7, r6, r4, r5 + str r3, [sp] + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + str r3, [sl, #0x10] + mov r3, r2, asr #0x1f + str r3, [sp, #4] + mov r3, r4, asr #0x1f + ldr r8, [r1, #0xc] + str r3, [sp, #8] + mov r3, r8, asr #0x1f + str r3, [sp, #0x18] + ldr r7, [r1] + ldr r6, [r1, #0x18] + mov r3, r7, asr #0x1f + str r3, [sp, #0xc] + umull r3, r5, r4, r6 + mov fp, r6, asr #0x1f + str r3, [sp, #0x10] + mla r5, r4, fp, r5 + ldr r3, [sp, #8] + add lr, sp, #0x1c + mla r5, r3, r6, r5 + umull r3, r4, r2, r7 + str r3, [sp, #0x14] + ldr r3, [sp, #0xc] + mla r4, r2, r3, r4 + ldr r2, [sp, #4] + umull r3, fp, sb, r8 + mla r4, r2, r7, r4 + ldr r2, [sp, #0x14] + adds r3, r2, r3 + ldr r2, [sp, #0x18] + mla fp, sb, r2, fp + ldr r2, [sp] + mla fp, r2, r8, fp + adc r4, r4, fp + ldr r2, [sp, #0x10] + ldr fp, [sp, #0x18] + adds r3, r2, r3 + adc r2, r5, r4 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0xc] + ldr r2, [r0, #0x1c] + ldr r5, [r0, #0x18] + ldr r4, [r0, #0x20] + umull r3, r0, r2, r8 + mla r0, r2, fp, r0 + mov sb, r2, asr #0x1f + mla r0, sb, r8, r0 + smlal r3, r0, r5, r7 + smlal r3, r0, r4, r6 + mov r3, r3, lsr #0xc + orr r3, r3, r0, lsl #20 + str r3, [sl, #0x18] + ldr r0, [r1, #0x10] + ldr r3, [r1, #4] + smull r7, r0, r2, r0 + cmp sl, lr + smlal r7, r0, r5, r3 + ldr r6, [r1, #0x1c] + addne sp, sp, #0x40 + smlal r7, r0, r4, r6 + mov r3, r7, lsr #0xc + orr r3, r3, r0, lsl #20 + str r3, [sl, #0x1c] + ldr r0, [r1, #0x14] + ldr r6, [r1, #0x20] + ldr r3, [r1, #8] + smull r1, r0, r2, r0 + smlal r1, r0, r5, r3 + smlal r1, r0, r4, r6 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sl, #0x20] + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldr r0, [lr] + str r0, [ip] + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end MTX_Concat33 + + arm_func_start MTX_MultVec33 +MTX_MultVec33: ; 0x020CB630 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r1, #0xc] + ldmia r0, {r3, ip} + smull r6, r5, ip, r4 + ldr r4, [r1] + ldr r0, [r0, #8] + smlal r6, r5, r3, r4 + ldr r4, [r1, #0x18] + smlal r6, r5, r0, r4 + mov r4, r6, lsr #0xc + orr r4, r4, r5, lsl #20 + str r4, [r2] + ldr r4, [r1, #0x10] + ldr r5, [r1, #4] + smull r6, lr, ip, r4 + smlal r6, lr, r3, r5 + ldr r4, [r1, #0x1c] + smlal r6, lr, r0, r4 + mov r4, r6, lsr #0xc + orr r4, r4, lr, lsl #20 + str r4, [r2, #4] + ldr lr, [r1, #0x14] + ldr r4, [r1, #8] + smull r5, lr, ip, lr + smlal r5, lr, r3, r4 + ldr r1, [r1, #0x20] + smlal r5, lr, r0, r1 + mov r0, r5, lsr #0xc + orr r0, r0, lr, lsl #20 + str r0, [r2, #8] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MTX_MultVec33 diff --git a/lib/NitroSDK/asm/fx_mtx43.s b/lib/NitroSDK/asm/fx_mtx43.s new file mode 100644 index 00000000..284f3ed6 --- /dev/null +++ b/lib/NitroSDK/asm/fx_mtx43.s @@ -0,0 +1,685 @@ + .include "asm/macros.inc" + .include "fx_mtx43.inc" + .include "global.inc" + .text + + arm_func_start MTX_Identity43_ +MTX_Identity43_: ; 0x020CB6AC + mov r2, #0x1000 + mov r3, #0 + stmia r0!, {r2, r3} + mov r1, #0 + stmia r0!, {r1, r3} + stmia r0!, {r2, r3} + stmia r0!, {r1, r3} + stmia r0!, {r2, r3} + stmia r0!, {r1, r3} + bx lr + arm_func_end MTX_Identity43_ + + arm_func_start MTX_Copy43To44_ +MTX_Copy43To44_: ; 0x020CB6D4 + stmdb sp!, {r4} + mov ip, #0 + ldmia r0!, {r2, r3, r4} + stmia r1!, {r2, r3, r4, ip} + ldmia r0!, {r2, r3, r4} + stmia r1!, {r2, r3, r4, ip} + ldmia r0!, {r2, r3, r4} + stmia r1!, {r2, r3, r4, ip} + mov ip, #0x1000 + ldmia r0!, {r2, r3, r4} + stmia r1!, {r2, r3, r4, ip} + ldmia sp!, {r4} + bx lr + arm_func_end MTX_Copy43To44_ + + arm_func_start MTX_TransApply43 +MTX_TransApply43: ; 0x020CB708 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + cmp r7, r6 + beq _020CB728 + bl MI_Copy36B +_020CB728: + ldr r0, [r7, #0xc] + ldr r1, [r7] + smull r3, r2, r4, r0 + smlal r3, r2, r5, r1 + ldr r0, [sp, #0x18] + ldr r1, [r7, #0x18] + ldr ip, [r7, #0x24] + smlal r3, r2, r0, r1 + mov r1, r3, lsr #0xc + orr r1, r1, r2, lsl #20 + add r1, ip, r1 + str r1, [r6, #0x24] + ldr r1, [r7, #0x10] + ldr r2, [r7, #4] + smull ip, r3, r4, r1 + smlal ip, r3, r5, r2 + ldr r1, [r7, #0x1c] + ldr r2, [r7, #0x28] + smlal ip, r3, r0, r1 + mov r1, ip, lsr #0xc + orr r1, r1, r3, lsl #20 + add r1, r2, r1 + str r1, [r6, #0x28] + ldr r1, [r7, #0x14] + ldr r2, [r7, #8] + smull ip, r3, r4, r1 + smlal ip, r3, r5, r2 + ldr r1, [r7, #0x20] + ldr r2, [r7, #0x2c] + smlal ip, r3, r0, r1 + mov r0, ip, lsr #0xc + orr r0, r0, r3, lsl #20 + add r0, r2, r0 + str r0, [r6, #0x2c] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end MTX_TransApply43 + + thumb_func_start MTX_Scale43_ +MTX_Scale43_: ; 0x020CB7B4 + stmia r0!, {r1} + mov r1, #0 + str r3, [r0, #0x1c] + mov r3, #0 + stmia r0!, {r1, r3} + stmia r0!, {r1, r2, r3} + mov r2, #0 + stmia r0!, {r1, r3} + add r0, #4 + stmia r0!, {r1, r2, r3} + bx lr + .align 2, 0 + thumb_func_end MTX_Scale43_ + + arm_func_start MTX_ScaleApply43 +MTX_ScaleApply43: ; 0x020CB7CC + stmdb sp!, {r3, r4, r5, lr} + ldr ip, [sp, #0x10] + mov r5, r0 + str ip, [sp] + mov r4, r1 + bl MTX_ScaleApply33 + ldr r0, [r5, #0x24] + str r0, [r4, #0x24] + ldr r0, [r5, #0x28] + str r0, [r4, #0x28] + ldr r0, [r5, #0x2c] + str r0, [r4, #0x2c] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end MTX_ScaleApply43 + + thumb_func_start MTX_RotX43_ +MTX_RotX43_: ; 0x020CB800 + str r1, [r0, #0x14] + neg r1, r1 + str r1, [r0, #0x1c] + mov r1, #1 + lsl r1, r1, #0xc + stmia r0!, {r1} + mov r3, #0 + mov r1, #0 + stmia r0!, {r1, r3} + stmia r0!, {r1, r2} + str r1, [r0, #4] + add r0, #0xc + stmia r0!, {r2, r3} + stmia r0!, {r1, r3} + bx lr + .align 2, 0 + thumb_func_end MTX_RotX43_ + + thumb_func_start MTX_RotY43_ +MTX_RotY43_: ; 0x020CB820 + str r1, [r0, #0x18] + mov r3, #0 + stmia r0!, {r2, r3} + neg r1, r1 + stmia r0!, {r1, r3} + mov r1, #1 + lsl r1, r1, #0xc + stmia r0!, {r1, r3} + add r0, #4 + mov r1, #0 + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r3} + bx lr + .align 2, 0 + thumb_func_end MTX_RotY43_ + + arm_func_start MTX_Inverse43 +MTX_Inverse43: ; 0x020CB83C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x5c + mov sl, r0 + ldr r0, [sl, #0x14] + cmp sl, r1 + addeq sb, sp, #0x2c + ldr r3, [sl, #0x18] + ldr r2, [sl, #0xc] + ldr r6, [sl, #0x20] + str r1, [sp] + movne sb, r1 + smull fp, r8, r2, r6 + smull r7, r1, r0, r3 + subs r7, fp, r7 + sbc ip, r8, r1 + ldr r4, [sl, #0x10] + ldr r5, [sl, #0x1c] + adds r1, r7, #0x800 + smull fp, r8, r4, r6 + smull r7, r6, r0, r5 + adc r0, ip, #0 + subs r7, fp, r7 + sbc r6, r8, r6 + mov r8, r1, lsr #0xc + orr r8, r8, r0, lsl #20 + smull r1, r0, r2, r5 + adds r7, r7, #0x800 + smull r5, r3, r4, r3 + adc r2, r6, #0 + mov r7, r7, lsr #0xc + orr r7, r7, r2, lsl #20 + subs r1, r1, r5 + sbc r5, r0, r3 + ldr r2, [sl] + adds r6, r1, #0x800 + ldr fp, [sl, #4] + smull r4, r3, r2, r7 + smull r1, r0, fp, r8 + adc r2, r5, #0 + mov r6, r6, lsr #0xc + orr r6, r6, r2, lsl #20 + subs r2, r4, r1 + ldr r1, [sl, #8] + sbc r0, r3, r0 + smlal r2, r0, r1, r6 + adds r1, r2, #0x800 + adc r2, r0, #0 + mov r0, r1, lsr #0xc + mov r1, r8, asr #0x1f + str r1, [sp, #4] + mov r1, r7, asr #0x1f + str r1, [sp, #8] + mov r1, r6, asr #0x1f + str r1, [sp, #0xc] + orrs r0, r0, r2, lsl #20 + mov r1, #0 + addeq sp, sp, #0x5c + subeq r0, r1, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl FX_InvAsync + ldr r1, [sl, #8] + ldr r2, [sl, #0x1c] + ldr fp, [sl, #0x10] + smull r0, r4, r2, r1 + smull r3, r2, fp, r1 + ldr r5, [sl, #0x18] + str r2, [sp, #0x18] + str r3, [sp, #0x14] + smull r3, r2, r5, r1 + str r2, [sp, #0x20] + ldr r2, [sl, #0x20] + str r3, [sp, #0x1c] + str r2, [sp, #0x10] + ldr r5, [sp, #0x10] + ldmia sl, {r3, lr} + smull ip, r5, lr, r5 + subs r0, ip, r0 + ldr r2, [sl, #0xc] + sbc r4, r5, r4 + smull r1, r5, r2, r1 + str r5, [sp, #0x28] + mov r5, r0, lsr #0xc + ldr fp, [sl, #0x14] + orr r5, r5, r4, lsl #20 + smull r4, r2, lr, fp + ldr r0, [sp, #0x14] + subs r4, r4, r0 + ldr r0, [sp, #0x18] + mov r4, r4, lsr #0xc + sbc r0, r2, r0 + orr r4, r4, r0, lsl #20 + ldr r0, [sp, #0x10] + ldr r2, [sp, #0x1c] + smull ip, r0, r3, r0 + subs r2, ip, r2 + ldr ip, [sp, #0x20] + sbc r0, r0, ip + smull ip, fp, r3, fp + ldr r3, [sp, #0x28] + subs r1, ip, r1 + sbc r3, fp, r3 + mov fp, r2, lsr #0xc + orr fp, fp, r0, lsl #20 + mov r0, r1, lsr #0xc + orr r0, r0, r3, lsl #20 + str r0, [sp, #0x24] + bl FX_GetDivResult + smull r2, r1, r0, r5 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + rsb lr, r2, #0 + smull r2, r1, r0, r4 + mov r4, r2, lsr #0xc + orr r4, r4, r1, lsl #20 + smull r2, r1, r0, fp + mov r3, r2, lsr #0xc + orr r3, r3, r1, lsl #20 + ldr r1, [sp, #0x24] + umull fp, r5, r0, r7 + smull r2, r1, r0, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + ldr r1, [sp, #8] + mov ip, r0, asr #0x1f + mla r5, r0, r1, r5 + mla r5, ip, r7, r5 + mov r1, fp, lsr #0xc + orr r1, r1, r5, lsl #20 + stmia sb, {r1, lr} + str r4, [sb, #8] + ldr r1, [sp, #4] + umull r5, r4, r0, r8 + mla r4, r0, r1, r4 + mla r4, ip, r8, r4 + mov r1, r5, lsr #0xc + orr r1, r1, r4, lsl #20 + rsb r1, r1, #0 + str r1, [sb, #0xc] + ldr r1, [sp, #0xc] + rsb r2, r2, #0 + str r3, [sb, #0x10] + str r2, [sb, #0x14] + umull r3, r2, r0, r6 + mla r2, r0, r1, r2 + mla r2, ip, r6, r2 + mov r1, r3, lsr #0xc + orr r1, r1, r2, lsl #20 + str r1, [sb, #0x18] + ldr r3, [sl] + ldr r1, [sl, #0x1c] + ldr r2, [sl, #0x18] + smull r5, r4, r3, r1 + ldr r1, [sl, #4] + smull r3, r1, r2, r1 + subs r2, r5, r3 + sbc r1, r4, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + smull r2, r1, r0, r2 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + rsb r1, r2, #0 + str r1, [sb, #0x1c] + ldr r4, [sl] + ldr r3, [sl, #0x10] + ldr r2, [sl, #0xc] + ldr r1, [sl, #4] + smull r6, r5, r4, r3 + smull r3, r1, r2, r1 + subs r2, r6, r3 + sbc r1, r5, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + mov r1, r2, asr #0x1f + umull r4, r3, r0, r2 + mla r3, r0, r1, r3 + mla r3, ip, r2, r3 + mov r0, r4, lsr #0xc + orr r0, r0, r3, lsl #20 + str r0, [sb, #0x20] + ldr r1, [sb, #0xc] + ldr r0, [sl, #0x28] + ldr r2, [sb] + smull r5, r4, r1, r0 + ldr r0, [sl, #0x24] + ldr r3, [sb, #0x18] + smlal r5, r4, r2, r0 + ldr r1, [sl, #0x2c] + add r0, sp, #0x2c + smlal r5, r4, r3, r1 + mov r1, r5, lsr #0xc + orr r1, r1, r4, lsl #20 + rsb r1, r1, #0 + str r1, [sb, #0x24] + ldr r2, [sb, #0x10] + ldr r1, [sl, #0x28] + ldr r3, [sb, #4] + smull r5, r4, r2, r1 + ldr r1, [sl, #0x24] + ldr r2, [sb, #0x1c] + smlal r5, r4, r3, r1 + ldr r1, [sl, #0x2c] + cmp sb, r0 + smlal r5, r4, r2, r1 + mov r1, r5, lsr #0xc + orr r1, r1, r4, lsl #20 + rsb r1, r1, #0 + str r1, [sb, #0x28] + ldr r2, [sb, #0x14] + ldr r1, [sl, #0x28] + ldr r3, [sb, #8] + smull r6, r5, r2, r1 + ldr r1, [sl, #0x24] + ldr r4, [sb, #0x20] + smlal r6, r5, r3, r1 + ldr r2, [sl, #0x2c] + smlal r6, r5, r4, r2 + mov r1, r6, lsr #0xc + orr r1, r1, r5, lsl #20 + rsb r1, r1, #0 + str r1, [sb, #0x2c] + bne _020CBBBC + ldr r1, [sp] + bl MI_Copy48B +_020CBBBC: + mov r0, #0 + add sp, sp, #0x5c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end MTX_Inverse43 + + arm_func_start MTX_Concat43 +MTX_Concat43: ; 0x020CBBC8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x4c + mov ip, r2 + ldr r2, [r0, #4] + ldr r3, [r1, #0xc] + cmp ip, r1 + smull r7, r4, r2, r3 + ldr r6, [r0] + ldr r3, [r1] + addeq sl, sp, #0x1c + smlal r7, r4, r6, r3 + ldr r5, [r0, #8] + ldr r3, [r1, #0x18] + movne sl, ip + smlal r7, r4, r5, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r4, lsl #20 + str r3, [sl] + ldr r3, [r1, #0x10] + ldr r4, [r1, #4] + smull r8, r7, r2, r3 + smlal r8, r7, r6, r4 + ldr r3, [r1, #0x1c] + smlal r8, r7, r5, r3 + mov r3, r8, lsr #0xc + orr r3, r3, r7, lsl #20 + str r3, [sl, #4] + ldr r3, [r1, #0x14] + ldr r4, [r1, #8] + smull r8, r7, r2, r3 + smlal r8, r7, r6, r4 + ldr r2, [r1, #0x20] + smlal r8, r7, r5, r2 + mov r5, r8, lsr #0xc + orr r5, r5, r7, lsl #20 + str r5, [sl, #8] + ldr r8, [r0, #0x10] + ldr sb, [r0, #0xc] + smull r5, r3, r8, r3 + smlal r5, r3, sb, r4 + ldr r7, [r0, #0x14] + mov r6, sb, asr #0x1f + smlal r5, r3, r7, r2 + mov r2, r5, lsr #0xc + orr r2, r2, r3, lsl #20 + str r2, [sl, #0x14] + ldr r2, [r1, #0x10] + ldr r3, [r1, #4] + smull r5, r4, r8, r2 + smlal r5, r4, sb, r3 + ldr r3, [r1, #0x1c] + mov r2, r8, asr #0x1f + smlal r5, r4, r7, r3 + str r2, [sp, #0x14] + mov r2, r5, lsr #0xc + orr r2, r2, r4, lsl #20 + str r2, [sl, #0x10] + mov r2, r7, asr #0x1f + ldr r5, [r1] + str r2, [sp] + ldr r4, [r1, #0xc] + ldr lr, [r1, #0x18] + mov r2, r4, asr #0x1f + str r2, [sp, #4] + mov r2, r5, asr #0x1f + str r2, [sp, #8] + umull r2, r3, r7, lr + mov fp, lr, asr #0x1f + mla r3, r7, fp, r3 + str r2, [sp, #0xc] + ldr r2, [sp] + ldr r7, [sp, #8] + mla r3, r2, lr, r3 + umull fp, r2, sb, r5 + mla r2, sb, r7, r2 + mla r2, r6, r5, r2 + ldr r6, [sp, #4] + umull sb, r7, r8, r4 + mla r7, r8, r6, r7 + ldr r8, [sp, #0x14] + adds r6, fp, sb + mla r7, r8, r4, r7 + adc r7, r2, r7 + ldr r2, [sp, #0xc] + adds r6, r2, r6 + adc r2, r3, r7 + mov r3, r6, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0xc] + ldr r3, [r0, #0x1c] + ldr r6, [r0, #0x18] + smull r7, r4, r3, r4 + smlal r7, r4, r6, r5 + ldr r2, [r0, #0x20] + smlal r7, r4, r2, lr + mov r5, r7, lsr #0xc + orr r5, r5, r4, lsl #20 + str r5, [sl, #0x18] + ldr r4, [r1, #0x10] + ldr r5, [r1, #4] + smull r8, r4, r3, r4 + smlal r8, r4, r6, r5 + ldr r7, [r1, #0x1c] + smlal r8, r4, r2, r7 + mov r5, r8, lsr #0xc + orr r5, r5, r4, lsl #20 + str r5, [sl, #0x1c] + ldr r5, [r1, #0x14] + ldr r4, [r1, #8] + smull r8, r7, r3, r5 + smlal r8, r7, r6, r4 + ldr r3, [r1, #0x20] + smlal r8, r7, r2, r3 + mov r2, r8, lsr #0xc + orr r2, r2, r7, lsl #20 + str r2, [sl, #0x20] + ldr r2, [r0, #0x28] + ldr sb, [r0, #0x24] + ldr r7, [r0, #0x2c] + smull r5, r0, r2, r5 + smlal r5, r0, sb, r4 + smlal r5, r0, r7, r3 + mov r3, r5, lsr #0xc + orr r3, r3, r0, lsl #20 + mov r0, r7, asr #0x1f + str r0, [sp, #0x18] + ldr r0, [r1, #0x2c] + mov fp, r2, asr #0x1f + adds r0, r0, r3 + str r0, [sl, #0x2c] + ldr r3, [r1, #0x10] + ldr r4, [r1, #4] + smull r6, r3, r2, r3 + smlal r6, r3, sb, r4 + ldr r5, [r1, #0x1c] + ldr r0, [r1, #0x28] + smlal r6, r3, r7, r5 + mov r4, r6, lsr #0xc + orr r4, r4, r3, lsl #20 + adds r0, r0, r4 + mov r8, sb, asr #0x1f + str r0, [sl, #0x28] + ldr r4, [r1] + ldr r3, [r1, #0xc] + umull r0, r5, sb, r4 + mov lr, r4, asr #0x1f + mla r5, sb, lr, r5 + mov sb, r3, asr #0x1f + str r0, [sp, #0x10] + mla r5, r8, r4, r5 + umull r8, r0, r2, r3 + mla r0, r2, sb, r0 + ldr r4, [sp, #0x10] + mla r0, fp, r3, r0 + adds r4, r4, r8 + adc r2, r5, r0 + ldr r6, [r1, #0x18] + ldr r8, [r1, #0x24] + mov r1, r6, asr #0x1f + umull r5, r3, r7, r6 + mla r3, r7, r1, r3 + adds r1, r5, r4 + ldr r0, [sp, #0x18] + mov r1, r1, lsr #0xc + mla r3, r0, r6, r3 + adc r0, r3, r2 + orr r1, r1, r0, lsl #20 + adds r0, r8, r1 + add r4, sp, #0x1c + cmp sl, r4 + addne sp, sp, #0x4c + str r0, [sl, #0x24] + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldmia r4!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r4!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia r4, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end MTX_Concat43 + + arm_func_start MTX_MultVec43 +MTX_MultVec43: ; 0x020CBE9C + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r1, #0xc] + ldmia r0, {r3, ip} + smull r6, r5, ip, r4 + ldr r4, [r1] + ldr r0, [r0, #8] + smlal r6, r5, r3, r4 + ldr r4, [r1, #0x18] + smlal r6, r5, r0, r4 + mov r6, r6, lsr #0xc + orr r6, r6, r5, lsl #20 + str r6, [r2] + ldr r4, [r1, #0x24] + add r4, r6, r4 + str r4, [r2] + ldr r4, [r1, #0x10] + ldr r5, [r1, #4] + smull r6, lr, ip, r4 + smlal r6, lr, r3, r5 + ldr r4, [r1, #0x1c] + smlal r6, lr, r0, r4 + mov r5, r6, lsr #0xc + orr r5, r5, lr, lsl #20 + str r5, [r2, #4] + ldr r4, [r1, #0x28] + add r4, r5, r4 + str r4, [r2, #4] + ldr lr, [r1, #0x14] + ldr r4, [r1, #8] + smull r5, lr, ip, lr + smlal r5, lr, r3, r4 + ldr r3, [r1, #0x20] + smlal r5, lr, r0, r3 + mov r3, r5, lsr #0xc + orr r3, r3, lr, lsl #20 + str r3, [r2, #8] + ldr r0, [r1, #0x2c] + add r0, r3, r0 + str r0, [r2, #8] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MTX_MultVec43 + + arm_func_start MTX_LookAt +MTX_LookAt: ; 0x020CBF3C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x24 + mov r6, r0 + ldr r5, [r6] + ldr r4, [r2] + add r0, sp, #0x18 + sub r4, r5, r4 + str r4, [sp, #0x18] + ldr ip, [r6, #4] + ldr r4, [r2, #4] + mov r5, r1 + sub r1, ip, r4 + str r1, [sp, #0x1c] + ldr r4, [r6, #8] + ldr r2, [r2, #8] + mov r1, r0 + sub r2, r4, r2 + mov r4, r3 + str r2, [sp, #0x20] + bl VEC_Normalize + add r1, sp, #0x18 + add r2, sp, #0xc + mov r0, r5 + bl VEC_CrossProduct + add r0, sp, #0xc + mov r1, r0 + bl VEC_Normalize + add r0, sp, #0x18 + add r1, sp, #0xc + add r2, sp, #0 + bl VEC_CrossProduct + ldr r1, [sp, #0xc] + mov r0, r6 + str r1, [r4] + ldr r2, [sp] + add r1, sp, #0xc + str r2, [r4, #4] + ldr r2, [sp, #0x18] + str r2, [r4, #8] + ldr r2, [sp, #0x10] + str r2, [r4, #0xc] + ldr r2, [sp, #4] + str r2, [r4, #0x10] + ldr r2, [sp, #0x1c] + str r2, [r4, #0x14] + ldr r2, [sp, #0x14] + str r2, [r4, #0x18] + ldr r2, [sp, #8] + str r2, [r4, #0x1c] + ldr r2, [sp, #0x20] + str r2, [r4, #0x20] + bl VEC_DotProduct + rsb r0, r0, #0 + str r0, [r4, #0x24] + mov r0, r6 + add r1, sp, #0 + bl VEC_DotProduct + rsb r0, r0, #0 + str r0, [r4, #0x28] + mov r0, r6 + add r1, sp, #0x18 + bl VEC_DotProduct + rsb r0, r0, #0 + str r0, [r4, #0x2c] + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end MTX_LookAt diff --git a/lib/NitroSDK/asm/fx_mtx44.s b/lib/NitroSDK/asm/fx_mtx44.s new file mode 100644 index 00000000..582340a8 --- /dev/null +++ b/lib/NitroSDK/asm/fx_mtx44.s @@ -0,0 +1,802 @@ + .include "asm/macros.inc" + .include "fx_mtx44.inc" + .include "global.inc" + .text + + arm_func_start MTX_Identity44_ +MTX_Identity44_: ; 0x020CC044 + mov r2, #0x1000 + mov r3, #0 + stmia r0!, {r2, r3} + mov r1, #0 + stmia r0!, {r1, r3} + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r3} + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r3} + stmia r0!, {r1, r2} + bx lr + arm_func_end MTX_Identity44_ + + arm_func_start MTX_Copy44To43_ +MTX_Copy44To43_: ; 0x020CC070 + ldmia r0!, {r2, r3, ip} + add r0, r0, #4 + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + add r0, r0, #4 + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + add r0, r0, #4 + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + add r0, r0, #4 + stmia r1!, {r2, r3, ip} + bx lr + arm_func_end MTX_Copy44To43_ + + arm_func_start MTX_TransApply44 +MTX_TransApply44: ; 0x020CC0A4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + cmp r7, r6 + beq _020CC0C4 + bl MI_Copy48B +_020CC0C4: + ldr r0, [r7, #0x10] + ldr r1, [r7] + smull r3, r2, r4, r0 + smlal r3, r2, r5, r1 + ldr r0, [sp, #0x18] + ldr r1, [r7, #0x20] + ldr ip, [r7, #0x30] + smlal r3, r2, r0, r1 + mov r1, r3, lsr #0xc + orr r1, r1, r2, lsl #20 + add r1, ip, r1 + str r1, [r6, #0x30] + ldr r1, [r7, #0x14] + ldr r2, [r7, #4] + smull ip, r3, r4, r1 + smlal ip, r3, r5, r2 + ldr r1, [r7, #0x24] + ldr r2, [r7, #0x34] + smlal ip, r3, r0, r1 + mov r1, ip, lsr #0xc + orr r1, r1, r3, lsl #20 + add r1, r2, r1 + str r1, [r6, #0x34] + ldr r1, [r7, #0x18] + ldr r2, [r7, #8] + smull ip, r3, r4, r1 + smlal ip, r3, r5, r2 + ldr r1, [r7, #0x28] + ldr r2, [r7, #0x38] + smlal ip, r3, r0, r1 + mov r1, ip, lsr #0xc + orr r1, r1, r3, lsl #20 + add r1, r2, r1 + str r1, [r6, #0x38] + ldr r1, [r7, #0x1c] + ldr r2, [r7, #0xc] + smull ip, r3, r4, r1 + smlal ip, r3, r5, r2 + ldr r1, [r7, #0x2c] + ldr r2, [r7, #0x3c] + smlal ip, r3, r0, r1 + mov r0, ip, lsr #0xc + orr r0, r0, r3, lsl #20 + add r0, r2, r0 + str r0, [r6, #0x3c] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end MTX_TransApply44 + + thumb_func_start MTX_RotX44_ +MTX_RotX44_: ; 0x020CC17C + str r2, [r0, #0x14] + str r2, [r0, #0x28] + str r1, [r0, #0x18] + neg r1, r1 + str r1, [r0, #0x24] + mov r1, #1 + mov r2, #0 + lsl r1, r1, #0xc + mov r3, #0 + stmia r0!, {r1, r2, r3} + stmia r0!, {r2, r3} + add r0, #8 + stmia r0!, {r2, r3} + add r0, #8 + stmia r0!, {r2, r3} + stmia r0!, {r2, r3} + str r1, [r0] + bx lr + thumb_func_end MTX_RotX44_ + + thumb_func_start MTX_RotY44_ +MTX_RotY44_: ; 0x020CC1A0 + str r2, [r0] + str r2, [r0, #0x28] + str r1, [r0, #0x20] + neg r1, r1 + str r1, [r0, #8] + mov r3, #1 + mov r1, #0 + lsl r3, r3, #0xc + mov r2, #0 + str r2, [r0, #4] + add r0, #0xc + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r2} + str r2, [r0, #4] + add r0, #0xc + stmia r0!, {r1, r2} + stmia r0!, {r1, r2, r3} + bx lr + thumb_func_end MTX_RotY44_ + + thumb_func_start MTX_RotZ44_ +MTX_RotZ44_: ; 0x020CC1C4 + str r2, [r0] + str r2, [r0, #0x14] + str r1, [r0, #4] + neg r1, r1 + str r1, [r0, #0x10] + mov r3, #1 + mov r1, #0 + lsl r3, r3, #0xc + mov r2, #0 + add r0, #8 + stmia r0!, {r1, r2} + add r0, #8 + stmia r0!, {r1, r2} + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r2} + stmia r0!, {r1, r2, r3} + bx lr + .align 2, 0 + thumb_func_end MTX_RotZ44_ + + arm_func_start MTX_Concat44 +MTX_Concat44: ; 0x020CC1E8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xe8 + cmp r2, r1 + addeq sl, sp, #0xa8 + str r2, [sp] + movne sl, r2 + ldr r4, [r0, #4] + ldr r2, [r1, #0x10] + ldr r5, [r0] + smull r8, r7, r4, r2 + ldr r2, [r1] + ldr r3, [r0, #8] + smlal r8, r7, r5, r2 + ldr r6, [r1, #0x20] + ldr r2, [r0, #0xc] + smlal r8, r7, r3, r6 + ldr r6, [r1, #0x30] + smlal r8, r7, r2, r6 + mov r6, r8, lsr #0xc + orr r6, r6, r7, lsl #20 + str r6, [sl] + ldr r6, [r1, #0x14] + ldr r7, [r1, #4] + smull sb, r8, r4, r6 + smlal sb, r8, r5, r7 + ldr r6, [r1, #0x24] + ldr r7, [r1, #0x34] + smlal sb, r8, r3, r6 + smlal sb, r8, r2, r7 + mov r6, sb, lsr #0xc + orr r6, r6, r8, lsl #20 + str r6, [sl, #4] + ldr r6, [r1, #0x1c] + ldr r7, [r1, #0xc] + smull sb, r8, r4, r6 + smlal sb, r8, r5, r7 + ldr r6, [r1, #0x2c] + ldr r7, [r1, #0x3c] + smlal sb, r8, r3, r6 + smlal sb, r8, r2, r7 + mov r6, sb, lsr #0xc + orr r6, r6, r8, lsl #20 + str r6, [sl, #0xc] + ldr fp, [r1, #0x18] + ldr ip, [r1, #8] + smull r7, r6, r4, fp + ldr r8, [r1, #0x38] + smlal r7, r6, r5, ip + ldr sb, [r1, #0x28] + mov lr, r8, asr #0x1f + smlal r7, r6, r3, sb + smlal r7, r6, r2, r8 + mov r2, r7, lsr #0xc + orr r2, r2, r6, lsl #20 + str r2, [sl, #8] + mov r2, fp, asr #0x1f + str r2, [sp, #4] + mov r2, ip, asr #0x1f + str r2, [sp, #8] + mov r2, sb, asr #0x1f + str r2, [sp, #0x8c] + ldr r6, [r0, #0x14] + ldr r7, [r0, #0x10] + mov r2, r6, asr #0x1f + str r2, [sp, #0xc] + mov r2, r7, asr #0x1f + ldr r5, [r0, #0x18] + str r2, [sp, #0x10] + mov r2, r5, asr #0x1f + ldr r4, [r0, #0x1c] + str r2, [sp, #0x14] + mov r2, r4, asr #0x1f + str r2, [sp, #0x18] + umull r2, r3, r4, r8 + str r2, [sp, #0x1c] + mla r3, r4, lr, r3 + ldr r2, [sp, #0x18] + mla r3, r2, r8, r3 + umull r8, r2, r5, sb + str r8, [sp, #0x20] + ldr r8, [sp, #0x8c] + mla r2, r5, r8, r2 + ldr r8, [sp, #0x14] + mla r2, r8, sb, r2 + ldr r8, [sp, #8] + umull lr, sb, r7, ip + mla sb, r7, r8, sb + ldr r8, [sp, #0x10] + mla sb, r8, ip, sb + umull ip, r8, r6, fp + adds lr, lr, ip + ldr ip, [sp, #4] + mla r8, r6, ip, r8 + ldr ip, [sp, #0xc] + mla r8, ip, fp, r8 + adc sb, sb, r8 + ldr r8, [sp, #0x20] + adds fp, r8, lr + adc r8, r2, sb + ldr r2, [sp, #0x1c] + adds sb, r2, fp + adc r2, r3, r8 + mov r3, sb, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0x18] + ldr r2, [r1, #0x14] + ldr r3, [r1, #4] + smull fp, r2, r6, r2 + smlal fp, r2, r7, r3 + ldr r8, [r1, #0x24] + ldr sb, [r1, #0x34] + smlal fp, r2, r5, r8 + smlal fp, r2, r4, sb + mov r3, fp, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0x14] + ldr r2, [r1, #0x1c] + ldr r3, [r1, #0xc] + smull fp, r2, r6, r2 + smlal fp, r2, r7, r3 + ldr r8, [r1, #0x2c] + ldr sb, [r1, #0x3c] + smlal fp, r2, r5, r8 + smlal fp, r2, r4, sb + mov r3, fp, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0x1c] + ldr sb, [r1, #0x10] + ldr fp, [r1, #0x30] + smull ip, r8, r6, sb + ldr r3, [r1] + ldr r2, [r1, #0x20] + smlal ip, r8, r7, r3 + smlal ip, r8, r5, r2 + smlal ip, r8, r4, fp + mov r4, ip, lsr #0xc + orr r4, r4, r8, lsl #20 + str r4, [sl, #0x10] + mov r4, r3, asr #0x1f + mov r5, sb, asr #0x1f + str r4, [sp, #0x28] + mov r4, r2, asr #0x1f + str r5, [sp, #0x24] + ldr r7, [r0, #0x24] + str r4, [sp, #0x2c] + mov r4, r7, asr #0x1f + ldr r8, [r0, #0x20] + ldr r6, [r0, #0x28] + ldr r5, [r0, #0x2c] + mov lr, fp, asr #0x1f + str r4, [sp, #0x90] + mov r4, r8, asr #0x1f + str r4, [sp, #0x30] + mov r4, r6, asr #0x1f + str r4, [sp, #0x34] + mov r4, r5, asr #0x1f + str r4, [sp, #0x38] + umull ip, r4, r5, fp + str ip, [sp, #0x3c] + mla r4, r5, lr, r4 + ldr ip, [sp, #0x38] + mla r4, ip, fp, r4 + umull fp, lr, r6, r2 + str fp, [sp, #0x40] + ldr fp, [sp, #0x2c] + mla lr, r6, fp, lr + ldr fp, [sp, #0x34] + mla lr, fp, r2, lr + umull r2, ip, r8, r3 + str r2, [sp, #0x44] + ldr r2, [sp, #0x28] + mla ip, r8, r2, ip + ldr r2, [sp, #0x30] + mla ip, r2, r3, ip + umull r3, fp, r7, sb + ldr r2, [sp, #0x44] + adds r3, r2, r3 + ldr r2, [sp, #0x24] + mla fp, r7, r2, fp + ldr r2, [sp, #0x90] + mla fp, r2, sb, fp + ldr r2, [sp, #0x40] + adc sb, ip, fp + adds fp, r2, r3 + ldr r2, [sp, #0x3c] + adc r3, lr, sb + adds sb, r2, fp + adc r2, r4, r3 + mov r3, sb, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sl, #0x20] + ldr r2, [r1, #0x14] + ldr lr, [r1, #4] + str r2, [sp, #0x48] + ldr r3, [sp, #0x48] + mov r2, r2, asr #0x1f + umull ip, fp, r7, r3 + mla fp, r7, r2, fp + ldr r2, [sp, #0x90] + ldr r4, [r1, #0x24] + mla fp, r2, r3, fp + smlal ip, fp, r8, lr + smlal ip, fp, r6, r4 + ldr sb, [r1, #0x34] + smlal ip, fp, r5, sb + mov r2, ip, lsr #0xc + orr r2, r2, fp, lsl #20 + str r2, [sl, #0x24] + ldr r2, [r1, #0x1c] + ldr lr, [r1, #0xc] + str r2, [sp, #0x4c] + ldr r3, [sp, #0x4c] + mov r2, r2, asr #0x1f + umull ip, fp, r7, r3 + mla fp, r7, r2, fp + ldr r2, [sp, #0x90] + ldr r4, [r1, #0x2c] + mla fp, r2, r3, fp + smlal ip, fp, r8, lr + smlal ip, fp, r6, r4 + ldr sb, [r1, #0x3c] + smlal ip, fp, r5, sb + mov r2, ip, lsr #0xc + orr r2, r2, fp, lsl #20 + str r2, [sl, #0x2c] + ldr fp, [r1, #0x18] + ldr r3, [r1, #0x38] + mov ip, fp, asr #0x1f + str r3, [sp, #0x50] + umull r4, r3, r7, fp + mla r3, r7, ip, r3 + ldr r7, [sp, #0x90] + ldr r2, [r1, #8] + mla r3, r7, fp, r3 + smlal r4, r3, r8, r2 + ldr sb, [r1, #0x28] + smlal r4, r3, r6, sb + ldr r6, [sp, #0x50] + smlal r4, r3, r5, r6 + mov r4, r4, lsr #0xc + orr r4, r4, r3, lsl #20 + str r4, [sl, #0x28] + ldr r4, [r0, #0x34] + ldr r3, [r0, #0x30] + smull r6, r5, r4, fp + smlal r6, r5, r3, r2 + mov r2, r4, asr #0x1f + str r2, [sp, #0x54] + mov r2, r3, asr #0x1f + str r2, [sp, #0x58] + ldr r2, [r0, #0x38] + ldr ip, [r0, #0x3c] + smlal r6, r5, r2, sb + ldr r0, [sp, #0x50] + smlal r6, r5, ip, r0 + mov r0, r6, lsr #0xc + orr r0, r0, r5, lsl #20 + str r0, [sl, #0x38] + mov r0, r2, asr #0x1f + str r0, [sp, #0x5c] + mov r0, ip, asr #0x1f + str r0, [sp, #0x60] + ldr r8, [r1, #0x24] + ldr r7, [r1, #4] + mov r0, r8, asr #0x1f + ldr sb, [r1, #0x34] + str r0, [sp, #0x98] + mov r0, r7, asr #0x1f + ldr r6, [r1, #0x14] + str r0, [sp, #0x6c] + mov r0, r6, asr #0x1f + str r0, [sp, #0x70] + umull r0, fp, ip, sb + mov lr, sb, asr #0x1f + str r0, [sp, #0x64] + mla fp, ip, lr, fp + ldr r0, [sp, #0x60] + add r5, sp, #0xa8 + mla fp, r0, sb, fp + umull r0, sb, r2, r8 + str r0, [sp, #0x94] + ldr r0, [sp, #0x98] + mla sb, r2, r0, sb + ldr r0, [sp, #0x5c] + mla sb, r0, r8, sb + umull r0, r8, r3, r7 + str r0, [sp, #0x68] + ldr r0, [sp, #0x6c] + mla r8, r3, r0, r8 + ldr r0, [sp, #0x58] + mla r8, r0, r7, r8 + umull r7, lr, r4, r6 + ldr r0, [sp, #0x68] + adds r7, r0, r7 + ldr r0, [sp, #0x70] + mla lr, r4, r0, lr + ldr r0, [sp, #0x54] + mla lr, r0, r6, lr + ldr r0, [sp, #0x94] + adc r6, r8, lr + adds r7, r0, r7 + ldr r0, [sp, #0x64] + adc r6, sb, r6 + adds r7, r0, r7 + adc r0, fp, r6 + mov r6, r7, lsr #0xc + orr r6, r6, r0, lsl #20 + str r6, [sl, #0x34] + ldr r8, [r1, #0x20] + ldr sb, [r1, #0x30] + mov r0, r8, asr #0x1f + ldr r7, [r1] + str r0, [sp, #0xa0] + mov r0, r7, asr #0x1f + ldr r6, [r1, #0x10] + str r0, [sp, #0x7c] + mov r0, r6, asr #0x1f + str r0, [sp, #0x80] + umull r0, fp, ip, sb + mov lr, sb, asr #0x1f + str r0, [sp, #0x74] + mla fp, ip, lr, fp + ldr r0, [sp, #0x60] + mla fp, r0, sb, fp + umull r0, sb, r2, r8 + str r0, [sp, #0x9c] + ldr r0, [sp, #0xa0] + mla sb, r2, r0, sb + ldr r0, [sp, #0x5c] + mla sb, r0, r8, sb + umull r0, r8, r3, r7 + str r0, [sp, #0x78] + ldr r0, [sp, #0x7c] + mla r8, r3, r0, r8 + ldr r0, [sp, #0x58] + mla r8, r0, r7, r8 + umull r7, lr, r4, r6 + ldr r0, [sp, #0x78] + adds r7, r0, r7 + ldr r0, [sp, #0x80] + mla lr, r4, r0, lr + ldr r0, [sp, #0x54] + mla lr, r0, r6, lr + ldr r0, [sp, #0x9c] + adc r6, r8, lr + adds r7, r0, r7 + ldr r0, [sp, #0x74] + adc r6, sb, r6 + adds r7, r0, r7 + adc r0, fp, r6 + mov r6, r7, lsr #0xc + orr r6, r6, r0, lsl #20 + str r6, [sl, #0x30] + ldr r8, [r1, #0x3c] + ldr r6, [r1, #0xc] + mov r0, r8, asr #0x1f + str r0, [sp, #0x84] + ldr r7, [r1, #0x2c] + ldr fp, [sp, #0x84] + mov r0, r7, asr #0x1f + str r0, [sp, #0x88] + ldr r0, [r1, #0x1c] + mov lr, r6, asr #0x1f + mov r1, r0, asr #0x1f + str r1, [sp, #0xa4] + umull sb, r1, ip, r8 + mla r1, ip, fp, r1 + ldr fp, [sp, #0x60] + mla r1, fp, r8, r1 + ldr r8, [sp, #0x88] + umull ip, fp, r2, r7 + mla fp, r2, r8, fp + ldr r2, [sp, #0x5c] + ldr r8, [sp, #0xa4] + mla fp, r2, r7, fp + umull r7, r2, r3, r6 + mla r2, r3, lr, r2 + ldr r3, [sp, #0x58] + mla r2, r3, r6, r2 + umull r6, r3, r4, r0 + mla r3, r4, r8, r3 + ldr r4, [sp, #0x54] + mla r3, r4, r0, r3 + adds r4, r7, r6 + adc r0, r2, r3 + adds r2, ip, r4 + adc r0, fp, r0 + adds r2, sb, r2 + adc r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + cmp sl, r5 + addne sp, sp, #0xe8 + str r1, [sl, #0x3c] + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, [sp] + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + str r4, [sp] + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + str r4, [sp] + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldmia r5, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + str r4, [sp] + add sp, sp, #0xe8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end MTX_Concat44 + + arm_func_start MTX_PerspectiveW +MTX_PerspectiveW: ; 0x020CC84C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r4, r0 + mov r0, r1 + mov r1, r4 + mov r8, r2 + mov r7, r3 + ldr r6, [sp, #0x1c] + ldr r5, [sp, #0x20] + bl FX_Div + ldr r1, [sp, #0x18] + ldr r2, _020CC994 ; =0x04000290 + mov r3, #0 + str r3, [r2] + mov r3, #0x1000 + str r3, [r2, #4] + sub r1, r7, r1 + str r1, [r2, #8] + mov r1, #0 + mov r4, r0 + str r1, [r2, #0xc] + cmp r6, #0x1000 + beq _020CC8B4 + mul r1, r4, r6 + mov r0, r1, asr #0xb + add r0, r1, r0, lsr #20 + mov r4, r0, asr #0xc +_020CC8B4: + mov r1, #0 + str r1, [r5, #4] + str r1, [r5, #8] + str r1, [r5, #0xc] + str r1, [r5, #0x10] + str r4, [r5, #0x14] + str r1, [r5, #0x18] + str r1, [r5, #0x1c] + str r1, [r5, #0x20] + str r1, [r5, #0x24] + rsb r0, r6, #0 + str r0, [r5, #0x2c] + str r1, [r5, #0x30] + str r1, [r5, #0x34] + str r1, [r5, #0x3c] + bl FX_GetDivResultFx64c + ldr r2, _020CC994 ; =0x04000290 + mov r3, #0 + stmia r2, {r3, r4, r8} + str r3, [r2, #0xc] + cmp r6, #0x1000 + beq _020CC930 + mov r2, r6, asr #0x1f + umull r4, r3, r0, r6 + mla r3, r0, r2, r3 + mla r3, r1, r6, r3 + mov r0, r4 + mov r1, r3 + mov r2, #0x1000 + mov r3, #0 + bl _ll_sdiv +_020CC930: + ldr r4, [sp, #0x18] + mov r2, r7, lsl #1 + add r6, r4, r7 + mov r3, r6, asr #0x1f + umull r8, r7, r0, r6 + mla r7, r0, r3, r7 + smull r4, r3, r2, r4 + mla r7, r1, r6, r7 + adds r2, r8, #0x80000000 + adc r7, r7, #0 + adds r4, r4, #0x800 + adc r2, r3, #0 + mov r3, r4, lsr #0xc + orr r3, r3, r2, lsl #20 + umull r6, r4, r0, r3 + mov r2, r3, asr #0x1f + mla r4, r0, r2, r4 + mla r4, r1, r3, r4 + adds r0, r6, #0x80000000 + str r7, [r5, #0x28] + adc r0, r4, #0 + str r0, [r5, #0x38] + bl FX_GetDivResult + str r0, [r5] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020CC994: .word 0x04000290 + arm_func_end MTX_PerspectiveW + + arm_func_start MTX_OrthoW +MTX_OrthoW: ; 0x020CC998 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + str r2, [sp] + mov sl, r0 + ldr r0, [sp] + mov r2, r3 + sub r0, r2, r0 + ldr r8, [sp, #0x3c] + str r3, [sp, #4] + mov fp, r1 + ldr sb, [sp, #0x38] + bl FX_InvAsync + mov r0, #0 + str r0, [r8, #4] + str r0, [r8, #8] + str r0, [r8, #0xc] + str r0, [r8, #0x10] + str r0, [r8, #0x18] + str r0, [r8, #0x1c] + str r0, [r8, #0x20] + str r0, [r8, #0x24] + str r0, [r8, #0x2c] + str sb, [r8, #0x3c] + bl FX_GetDivResultFx64c + mov r6, r1 + mov r4, r0 + ldr r1, _020CCB9C ; =0x04000290 + mov r3, #0 + mov r2, #0x1000 + str r3, [r1] + sub r0, sl, fp + str r2, [r1, #4] + str r0, [r1, #8] + mov r0, r3 + cmp sb, #0x1000 + str r0, [r1, #0xc] + beq _020CCA48 + mov r5, sb, asr #0x1f + umull r0, r1, r4, sb + mla r1, r4, r5, r1 + mla r1, r6, sb, r1 + bl _ll_sdiv + mov r4, r0 + mov r6, r1 +_020CCA48: + mov r1, r6, lsl #0xd + mov r0, #0x80000000 + orr r1, r1, r4, lsr #19 + adds r0, r0, r4, lsl #13 + adc r0, r1, #0 + str r0, [r8] + bl FX_GetDivResultFx64c + mov r5, r0 + mov r7, r1 + mov r3, #0 + ldr ip, _020CCB9C ; =0x04000290 + ldr r1, [sp, #0x30] + ldr r0, [sp, #0x34] + str r3, [ip] + mov r2, #0x1000 + str r2, [ip, #4] + sub r0, r1, r0 + mov lr, r3 + str r0, [ip, #8] + cmp sb, #0x1000 + str lr, [ip, #0xc] + beq _020CCABC + mov ip, sb, asr #0x1f + umull r0, r1, r5, sb + mla r1, r5, ip, r1 + mla r1, r7, sb, r1 + bl _ll_sdiv + mov r5, r0 + mov r7, r1 +_020CCABC: + mov r1, r7, lsl #0xd + mov r0, #0x80000000 + orr r1, r1, r5, lsr #19 + adds r0, r0, r5, lsl #13 + adc r0, r1, #0 + str r0, [r8, #0x14] + bl FX_GetDivResultFx64c + cmp sb, #0x1000 + beq _020CCB04 + mov r2, sb, asr #0x1f + umull ip, r3, r0, sb + mla r3, r0, r2, r3 + mla r3, r1, sb, r3 + mov r0, ip + mov r1, r3 + mov r2, #0x1000 + mov r3, #0 + bl _ll_sdiv +_020CCB04: + ldr r3, [sp, #4] + ldr r2, [sp] + add r2, r3, r2 + rsb ip, r2, #0 + add r2, sl, fp + rsb r3, r2, #0 + ldr sl, [sp, #0x34] + ldr r2, [sp, #0x30] + mov sb, ip, asr #0x1f + add r2, sl, r2 + umull fp, sl, r4, ip + mla sl, r4, sb, sl + mov r4, #0x80000000 + mla sl, r6, ip, sl + adds r4, r4, r0, lsl #13 + mov sb, r1, lsl #0xd + mov r6, r3, asr #0x1f + umull ip, r4, r5, r3 + mla r4, r5, r6, r4 + orr sb, sb, r0, lsr #19 + mla r4, r7, r3, r4 + adc r3, sb, #0 + str r3, [r8, #0x28] + adds r3, fp, #0x80000000 + adc r7, sl, #0 + adds r3, ip, #0x80000000 + mov r3, r2, asr #0x1f + umull r6, r5, r0, r2 + mla r5, r0, r3, r5 + adc r3, r4, #0 + str r7, [r8, #0x30] + mla r5, r1, r2, r5 + adds r0, r6, #0x80000000 + str r3, [r8, #0x34] + adc r0, r5, #0 + str r0, [r8, #0x38] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020CCB9C: .word 0x04000290 + arm_func_end MTX_OrthoW diff --git a/lib/NitroSDK/asm/fx_sincos.s b/lib/NitroSDK/asm/fx_sincos.s new file mode 100644 index 00000000..f47c973f --- /dev/null +++ b/lib/NitroSDK/asm/fx_sincos.s @@ -0,0 +1,4 @@ + .include "asm/macros.inc" + .include "fx_sincos.inc" + .include "global.inc" + .text diff --git a/lib/NitroSDK/asm/fx_trig.s b/lib/NitroSDK/asm/fx_trig.s new file mode 100644 index 00000000..f42bfb00 --- /dev/null +++ b/lib/NitroSDK/asm/fx_trig.s @@ -0,0 +1,216 @@ + .include "asm/macros.inc" + .include "fx_trig.inc" + .include "global.inc" + .text + + arm_func_start FX_SinFx64c_internal +FX_SinFx64c_internal: ; 0x020CD2FC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov lr, #0 + cmp r1, #1 + cmpeq r0, #0 + mov r2, #1 + moveq r1, lr + ldreq r0, _020CD3CC ; =0xB504F334 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + umull r3, ip, r0, r0 + mla ip, r0, r1, ip + mla ip, r1, r0, ip + ldr r4, _020CD3D0 ; =0x02317888 + ldr r5, _020CD3D4 ; =0x03C2857C + umull r3, r8, ip, r4 + umull r3, r7, ip, r5 + mla r8, ip, lr, r8 + mov r3, lr + mla r7, ip, lr, r7 + mla r8, r3, r4, r8 + subs sb, lr, r8 + mla r7, r3, r5, r7 + umull r4, r5, sb, r7 + mla r5, sb, r3, r5 + sbc r8, r2, #0 + mla r5, r8, r7, r5 + subs r8, lr, r5 + ldr r6, _020CD3D8 ; =0x07E54B84 + sbc r7, r2, #0 + umull r4, r5, ip, r6 + mla r5, ip, lr, r5 + mla r5, r3, r6, r5 + umull r4, r6, r8, r5 + mla r6, r8, r3, r6 + mla r6, r7, r5, r6 + subs r8, lr, r6 + sbc r7, r2, #0 + ldr r2, _020CD3DC ; =0x14ABBCE6 + ldr r6, _020CD3E0 ; =0xC90FDAA2 + umull r4, r5, ip, r2 + mla r5, ip, lr, r5 + mla r5, r3, r2, r5 + umull r2, r4, r8, r5 + mla r4, r8, r3, r4 + mla r4, r7, r5, r4 + subs r6, r6, r4 + umull r2, r4, r6, r0 + mla r4, r6, r1, r4 + sbc r5, lr, #0 + mla r4, r5, r0, r4 + mov r0, r4 + mov r1, r3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020CD3CC: .word 0xB504F334 +_020CD3D0: .word 0x02317888 +_020CD3D4: .word 0x03C2857C +_020CD3D8: .word 0x07E54B84 +_020CD3DC: .word 0x14ABBCE6 +_020CD3E0: .word 0xC90FDAA2 + arm_func_end FX_SinFx64c_internal + + arm_func_start FX_CosFx64c_internal +FX_CosFx64c_internal: ; 0x020CD3E4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov ip, #0 + cmp r1, #1 + cmpeq r0, #0 + mov r2, #1 + moveq r1, ip + ldreq r0, _020CD49C ; =0xB504F334 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + umull r4, r3, r0, r0 + mla r3, r0, r1, r3 + mla r3, r1, r0, r3 + ldr r1, _020CD4A0 ; =0x02D1E41D + ldr lr, _020CD4A4 ; =0x054387AD + umull r0, r6, r3, r1 + umull r0, r5, r3, lr + mla r6, r3, ip, r6 + mov r0, ip + mla r5, r3, ip, r5 + mla r6, r0, r1, r6 + subs r8, ip, r6 + mla r5, r0, lr, r5 + umull r1, r6, r8, r5 + ldr r4, _020CD4A8 ; =0x0D28D331 + mla r6, r8, r0, r6 + umull r1, lr, r3, r4 + mla lr, r3, ip, lr + sbc r7, r2, #0 + mla r6, r7, r5, r6 + subs r6, ip, r6 + mla lr, r0, r4, lr + umull r1, r4, r6, lr + mla r4, r6, r0, r4 + sbc r5, r2, #0 + mla r4, r5, lr, r4 + subs r6, ip, r4 + ldr r1, _020CD4AC ; =0x4EF4F327 + sbc r5, r2, #0 + umull r4, lr, r3, r1 + mla lr, r3, ip, lr + mla lr, r0, r1, lr + umull r1, r3, r6, lr + mla r3, r6, r0, r3 + mla r3, r5, lr, r3 + subs r0, ip, r3 + sbc r1, r2, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020CD49C: .word 0xB504F334 +_020CD4A0: .word 0x02D1E41D +_020CD4A4: .word 0x054387AD +_020CD4A8: .word 0x0D28D331 +_020CD4AC: .word 0x4EF4F327 + arm_func_end FX_CosFx64c_internal + + arm_func_start FX_SinFx64c +FX_SinFx64c: ; 0x020CD4B0 + stmdb sp!, {r4, lr} + cmp r0, #0 + bge _020CD4D0 + rsb r0, r0, #0 + bl FX_SinFx64c + rsbs r0, r0, #0 + rsc r1, r1, #0 + ldmia sp!, {r4, pc} +_020CD4D0: + ldr r1, _020CD544 ; =0x45F306DD + mov r2, #1 + umull ip, lr, r0, r1 + mla lr, r0, r2, lr + mov r0, r0, asr #0x1f + mla lr, r0, r1, lr + mov r3, #0 + mov ip, ip, lsr #0xc + mov r4, lr, asr #0xc + orr ip, ip, lr, lsl #20 + sub r0, r3, #1 + tst r4, #1 + and r1, r3, lr, asr #12 + and r0, ip, r0 + beq _020CD514 + subs r0, r3, r0 + sbc r1, r2, r1 +_020CD514: + add r2, r4, #1 + tst r2, #2 + beq _020CD528 + bl FX_CosFx64c_internal + b _020CD52C +_020CD528: + bl FX_SinFx64c_internal +_020CD52C: + and r2, r4, #7 + cmp r2, #3 + ldmleia sp!, {r4, pc} + rsbs r0, r0, #0 + rsc r1, r1, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CD544: .word 0x45F306DD + arm_func_end FX_SinFx64c + + arm_func_start FX_CosFx64c +FX_CosFx64c: ; 0x020CD548 + stmdb sp!, {r4, lr} + cmp r0, #0 + bge _020CD560 + rsb r0, r0, #0 + bl FX_CosFx64c + ldmia sp!, {r4, pc} +_020CD560: + ldr r1, _020CD5D8 ; =0x45F306DD + mov r2, #1 + umull ip, lr, r0, r1 + mla lr, r0, r2, lr + mov r0, r0, asr #0x1f + mla lr, r0, r1, lr + mov r3, #0 + mov ip, ip, lsr #0xc + mov r4, lr, asr #0xc + orr ip, ip, lr, lsl #20 + sub r0, r3, #1 + tst r4, #1 + and r1, r3, lr, asr #12 + and r0, ip, r0 + beq _020CD5A4 + subs r0, r3, r0 + sbc r1, r2, r1 +_020CD5A4: + add r2, r4, #1 + tst r2, #2 + beq _020CD5B8 + bl FX_SinFx64c_internal + b _020CD5BC +_020CD5B8: + bl FX_CosFx64c_internal +_020CD5BC: + add r2, r4, #2 + and r2, r2, #7 + cmp r2, #3 + ldmleia sp!, {r4, pc} + rsbs r0, r0, #0 + rsc r1, r1, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CD5D8: .word 0x45F306DD + arm_func_end FX_CosFx64c diff --git a/lib/NitroSDK/asm/fx_vec.s b/lib/NitroSDK/asm/fx_vec.s new file mode 100644 index 00000000..d512803c --- /dev/null +++ b/lib/NitroSDK/asm/fx_vec.s @@ -0,0 +1,415 @@ + .include "asm/macros.inc" + .include "fx_vec.inc" + .include "global.inc" + .text + + arm_func_start VEC_Add +VEC_Add: ; 0x020CCD78 + ldr ip, [r0] + ldr r3, [r1] + add r3, ip, r3 + str r3, [r2] + ldr ip, [r0, #4] + ldr r3, [r1, #4] + add r3, ip, r3 + str r3, [r2, #4] + ldr r3, [r0, #8] + ldr r0, [r1, #8] + add r0, r3, r0 + str r0, [r2, #8] + bx lr + arm_func_end VEC_Add + + arm_func_start VEC_Subtract +VEC_Subtract: ; 0x020CCDAC + ldr ip, [r0] + ldr r3, [r1] + sub r3, ip, r3 + str r3, [r2] + ldr ip, [r0, #4] + ldr r3, [r1, #4] + sub r3, ip, r3 + str r3, [r2, #4] + ldr r3, [r0, #8] + ldr r0, [r1, #8] + sub r0, r3, r0 + str r0, [r2, #8] + bx lr + arm_func_end VEC_Subtract + + arm_func_start VEC_Fx16Add +VEC_Fx16Add: ; 0x020CCDE0 + ldrsh ip, [r0] + ldrsh r3, [r1] + add r3, ip, r3 + strh r3, [r2] + ldrsh ip, [r0, #2] + ldrsh r3, [r1, #2] + add r3, ip, r3 + strh r3, [r2, #2] + ldrsh r3, [r0, #4] + ldrsh r0, [r1, #4] + add r0, r3, r0 + strh r0, [r2, #4] + bx lr + arm_func_end VEC_Fx16Add + + arm_func_start VEC_DotProduct +VEC_DotProduct: ; 0x020CCE14 + stmdb sp!, {r4, lr} + ldr r3, [r0, #4] + ldr r2, [r1, #4] + ldr ip, [r0] + smull r4, lr, r3, r2 + ldr r2, [r1] + ldr r3, [r0, #8] + smlal r4, lr, ip, r2 + ldr r0, [r1, #8] + smlal r4, lr, r3, r0 + adds r0, r4, #0x800 + adc r1, lr, #0 + mov r0, r0, lsr #0xc + orr r0, r0, r1, lsl #20 + ldmia sp!, {r4, pc} + arm_func_end VEC_DotProduct + + arm_func_start VEC_Fx16DotProduct +VEC_Fx16DotProduct: ; 0x020CCE50 + stmdb sp!, {r3, r4, r5, lr} + ldrsh lr, [r0, #2] + ldrsh ip, [r1, #2] + ldrsh r3, [r0, #4] + ldrsh r2, [r1, #4] + ldrsh r5, [r0] + ldrsh r4, [r1] + smulbb r1, lr, ip + smulbb r0, r3, r2 + add r0, r0, #0x800 + smlabb r1, r5, r4, r1 + adds r2, r1, r0 + mov r0, r0, asr #0x1f + adc r1, r0, r1, asr #31 + mov r0, r2, lsr #0xc + orr r0, r0, r1, lsl #20 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end VEC_Fx16DotProduct + + arm_func_start VEC_CrossProduct +VEC_CrossProduct: ; 0x020CCE94 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldmia r0, {r5, lr} + ldr r6, [r1, #8] + ldr r0, [r0, #8] + ldmia r1, {r4, ip} + smull r8, r7, lr, r6 + smull r3, r1, r0, ip + subs r3, r8, r3 + sbc r1, r7, r1 + adds r3, r3, #0x800 + smull r8, r7, r0, r4 + smull r6, r0, r5, r6 + adc r1, r1, #0 + subs r6, r8, r6 + mov r3, r3, lsr #0xc + orr r3, r3, r1, lsl #20 + sbc r7, r7, r0 + adds r0, r6, #0x800 + smull ip, r6, r5, ip + adc r5, r7, #0 + smull r4, r1, lr, r4 + mov r7, r0, lsr #0xc + subs r4, ip, r4 + sbc r0, r6, r1 + adds r1, r4, #0x800 + str r3, [r2] + orr r7, r7, r5, lsl #20 + adc r0, r0, #0 + mov r1, r1, lsr #0xc + str r7, [r2, #4] + orr r1, r1, r0, lsl #20 + str r1, [r2, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end VEC_CrossProduct + + arm_func_start VEC_Fx16CrossProduct +VEC_Fx16CrossProduct: ; 0x020CCF18 + stmdb sp!, {r4, r5, r6, lr} + ldrsh r4, [r1, #4] + ldrsh ip, [r0, #2] + ldrsh lr, [r0] + ldrsh r3, [r1, #2] + ldrsh r6, [r0, #4] + ldrsh r1, [r1] + smulbb r5, ip, r4 + smulbb r0, r6, r3 + sub r0, r5, r0 + add r0, r0, #0x800 + mov r0, r0, asr #0xc + smulbb r5, r6, r1 + smulbb r4, lr, r4 + sub r4, r5, r4 + add r4, r4, #0x800 + smulbb r3, lr, r3 + smulbb r1, ip, r1 + sub r1, r3, r1 + add r1, r1, #0x800 + strh r0, [r2] + mov r0, r4, asr #0xc + strh r0, [r2, #2] + mov r0, r1, asr #0xc + strh r0, [r2, #4] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end VEC_Fx16CrossProduct + + arm_func_start VEC_Mag +VEC_Mag: ; 0x020CCF80 + ldr r1, [r0, #4] + ldr r2, [r0] + smull ip, r3, r1, r1 + smlal ip, r3, r2, r2 + ldr r0, [r0, #8] + ldr r2, _020CCFD8 ; =0x040002B0 + smlal ip, r3, r0, r0 + mov r1, #1 + mov r0, r3, lsl #2 + strh r1, [r2] + mov r1, ip, lsl #2 + str r1, [r2, #8] + orr r0, r0, ip, lsr #30 + str r0, [r2, #0xc] +_020CCFB8: + ldrh r0, [r2] + tst r0, #0x8000 + bne _020CCFB8 + ldr r0, _020CCFDC ; =0x040002B4 + ldr r0, [r0] + add r0, r0, #1 + mov r0, r0, asr #1 + bx lr + .align 2, 0 +_020CCFD8: .word 0x040002B0 +_020CCFDC: .word 0x040002B4 + arm_func_end VEC_Mag + + arm_func_start VEC_Normalize +VEC_Normalize: ; 0x020CCFE0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, [r0, #4] + ldr r3, [r0] + smull r6, r5, r2, r2 + smlal r6, r5, r3, r3 + ldr r2, [r0, #8] + ldr r4, _020CD0EC ; =0x04000280 + smlal r6, r5, r2, r2 + mov r3, #2 + strh r3, [r4] + mov r3, #0 + str r3, [r4, #0x10] + mov r3, #0x1000000 + str r3, [r4, #0x14] + str r6, [r4, #0x18] + mov r2, r5, lsl #2 + str r5, [r4, #0x1c] + mov r3, #1 + strh r3, [r4, #0x30] + mov r3, r6, lsl #2 + str r3, [r4, #0x38] + orr r2, r2, r6, lsr #30 + str r2, [r4, #0x3c] +_020CD03C: + ldrh r2, [r4, #0x30] + tst r2, #0x8000 + bne _020CD03C + ldr r2, _020CD0F0 ; =0x040002B4 + ldr ip, [r2] + sub r3, r2, #0x34 +_020CD054: + ldrh r2, [r3] + tst r2, #0x8000 + bne _020CD054 + ldr sb, _020CD0F4 ; =0x040002A0 + ldr r5, [r0] + ldr r8, [sb] + mov r7, ip, asr #0x1f + umull r3, r2, r8, ip + umull r6, lr, r3, r5 + mov r4, r5, asr #0x1f + mla r2, r8, r7, r2 + ldr r7, [sb, #4] + mla lr, r3, r4, lr + mla r2, r7, ip, r2 + mla lr, r2, r5, lr + adds r4, r6, #0 + adc r4, lr, #0x1000 + mov r4, r4, asr #0xd + str r4, [r1] + ldr ip, [r0, #4] + umull r5, lr, r3, ip + mov r4, ip, asr #0x1f + mla lr, r3, r4, lr + mla lr, r2, ip, lr + adds r4, r5, #0 + adc r4, lr, #0x1000 + mov r4, r4, asr #0xd + str r4, [r1, #4] + ldr ip, [r0, #8] + umull r4, lr, r3, ip + mov r0, ip, asr #0x1f + mla lr, r3, r0, lr + mla lr, r2, ip, lr + adds r0, r4, #0 + adc r0, lr, #0x1000 + mov r0, r0, asr #0xd + str r0, [r1, #8] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020CD0EC: .word 0x04000280 +_020CD0F0: .word 0x040002B4 +_020CD0F4: .word 0x040002A0 + arm_func_end VEC_Normalize + + arm_func_start VEC_Fx16Normalize +VEC_Fx16Normalize: ; 0x020CD0F8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldrsh r5, [r0] + ldrsh r2, [r0, #2] + ldrsh r3, [r0, #4] + ldr r4, _020CD218 ; =0x04000280 + smulbb r6, r2, r2 + smulbb r8, r5, r5 + mov r2, #2 + strh r2, [r4] + mov r2, #0 + str r2, [r4, #0x10] + mov r2, #0x1000000 + smulbb r3, r3, r3 + mov r5, r6, asr #0x1f + adds r7, r8, r6 + adc r6, r5, r8, asr #31 + adds r5, r7, r3 + str r2, [r4, #0x14] + adc r3, r6, r3, asr #31 + str r5, [r4, #0x18] + mov r2, r3, lsl #2 + str r3, [r4, #0x1c] + mov r3, #1 + strh r3, [r4, #0x30] + mov r3, r5, lsl #2 + str r3, [r4, #0x38] + orr r2, r2, r5, lsr #30 + str r2, [r4, #0x3c] +_020CD168: + ldrh r2, [r4, #0x30] + tst r2, #0x8000 + bne _020CD168 + ldr r2, _020CD21C ; =0x040002B4 + ldr ip, [r2] + sub r3, r2, #0x34 +_020CD180: + ldrh r2, [r3] + tst r2, #0x8000 + bne _020CD180 + ldr sb, _020CD220 ; =0x040002A0 + ldrsh r5, [r0] + ldr r8, [sb] + mov r7, ip, asr #0x1f + umull r3, r2, r8, ip + umull r6, lr, r3, r5 + mov r4, r5, asr #0x1f + mla r2, r8, r7, r2 + ldr r7, [sb, #4] + mla lr, r3, r4, lr + mla r2, r7, ip, r2 + mla lr, r2, r5, lr + adds r4, r6, #0 + adc r4, lr, #0x1000 + mov r4, r4, asr #0xd + strh r4, [r1] + ldrsh ip, [r0, #2] + umull r5, lr, r3, ip + mov r4, ip, asr #0x1f + mla lr, r3, r4, lr + mla lr, r2, ip, lr + adds r4, r5, #0 + adc r4, lr, #0x1000 + mov r4, r4, asr #0xd + strh r4, [r1, #2] + ldrsh ip, [r0, #4] + umull r4, lr, r3, ip + mov r0, ip, asr #0x1f + mla lr, r3, r0, lr + mla lr, r2, ip, lr + adds r0, r4, #0 + adc r0, lr, #0x1000 + mov r0, r0, asr #0xd + strh r0, [r1, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020CD218: .word 0x04000280 +_020CD21C: .word 0x040002B4 +_020CD220: .word 0x040002A0 + arm_func_end VEC_Fx16Normalize + + arm_func_start VEC_MultAdd +VEC_MultAdd: ; 0x020CD224 + stmdb sp!, {r4, lr} + ldr r4, [r1] + ldr lr, [r2] + smull ip, r4, r0, r4 + mov ip, ip, lsr #0xc + orr ip, ip, r4, lsl #20 + add r4, lr, ip + str r4, [r3] + ldr ip, [r1, #4] + ldr r4, [r2, #4] + smull lr, ip, r0, ip + mov lr, lr, lsr #0xc + orr lr, lr, ip, lsl #20 + add r4, r4, lr + str r4, [r3, #4] + ldr r1, [r1, #8] + ldr ip, [r2, #8] + smull r2, r1, r0, r1 + mov r0, r2, lsr #0xc + orr r0, r0, r1, lsl #20 + add r0, ip, r0 + str r0, [r3, #8] + ldmia sp!, {r4, pc} + arm_func_end VEC_MultAdd + + arm_func_start VEC_Distance +VEC_Distance: ; 0x020CD280 + stmdb sp!, {r4, lr} + ldr r3, [r0, #4] + ldr r2, [r1, #4] + ldr r4, [r0] + sub r2, r3, r2 + smull ip, r3, r2, r2 + ldr lr, [r1] + ldr r2, [r0, #8] + sub r4, r4, lr + ldr r0, [r1, #8] + smlal ip, r3, r4, r4 + sub r0, r2, r0 + smlal ip, r3, r0, r0 + mov r0, r3, lsl #2 + ldr r2, _020CD2F4 ; =0x040002B0 + mov r1, #1 + strh r1, [r2] + mov r1, ip, lsl #2 + str r1, [r2, #8] + orr r0, r0, ip, lsr #30 + str r0, [r2, #0xc] +_020CD2D4: + ldrh r0, [r2] + tst r0, #0x8000 + bne _020CD2D4 + ldr r0, _020CD2F8 ; =0x040002B4 + ldr r0, [r0] + add r0, r0, #1 + mov r0, r0, asr #1 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CD2F4: .word 0x040002B0 +_020CD2F8: .word 0x040002B4 + arm_func_end VEC_Distance diff --git a/lib/NitroSDK/asm/g2.s b/lib/NitroSDK/asm/g2.s new file mode 100644 index 00000000..c1f1d7ec --- /dev/null +++ b/lib/NitroSDK/asm/g2.s @@ -0,0 +1,100 @@ + .include "asm/macros.inc" + .include "g2.inc" + .include "global.inc" + + .text + + arm_func_start G2x_SetBGyAffine_ +G2x_SetBGyAffine_: ; 0x020CF0AC + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r1, #4] + ldr r5, [r1] + mov ip, r4, lsl #0xc + mov r4, ip, asr #0x10 + mov ip, r5, lsl #0xc + mov lr, r4, lsl #0x10 + mov r5, ip, asr #0x10 + mov r4, lr, lsr #0x10 + mov ip, r5, lsl #0x10 + mov r4, r4, lsl #0x10 + orr r4, r4, ip, lsr #16 + str r4, [r0] + ldr r4, [r1, #0xc] + ldr r5, [r1, #8] + mov ip, r4, lsl #0xc + mov r4, ip, asr #0x10 + mov ip, r5, lsl #0xc + mov lr, r4, lsl #0x10 + mov r6, ip, asr #0x10 + mov r5, lr, lsr #0x10 + ldr r4, [sp, #0x14] + mov ip, r6, lsl #0x10 + mov r5, r5, lsl #0x10 + orr r5, r5, ip, lsr #16 + str r5, [r0, #4] + ldr r6, [sp, #0x10] + ldr ip, [r1, #4] + sub r5, r4, r3 + ldr r4, [r1, #0xc] + mul lr, ip, r5 + mul r5, r4, r5 + ldr ip, [r1] + sub r6, r6, r2 + ldr r4, [r1, #8] + mla r1, ip, r6, lr + mla r5, r4, r6, r5 + add r1, r1, r2, lsl #12 + add r2, r5, r3, lsl #12 + mov r1, r1, asr #4 + str r1, [r0, #8] + mov r1, r2, asr #4 + str r1, [r0, #0xc] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end G2x_SetBGyAffine_ + + arm_func_start G2x_SetBlendAlpha_ +G2x_SetBlendAlpha_: ; 0x020CF15C + ldr ip, [sp] + orr r1, r1, #0x40 + orr r2, r1, r2, lsl #8 + orr r1, r3, ip, lsl #8 + orr r1, r2, r1, lsl #16 + str r1, [r0] + bx lr + arm_func_end G2x_SetBlendAlpha_ + + arm_func_start G2x_SetBlendBrightness_ +G2x_SetBlendBrightness_: ; 0x020CF178 + cmp r2, #0 + orrge r1, r1, #0x80 + strgeh r1, [r0] + strgeh r2, [r0, #4] + bxge lr + orr r1, r1, #0xc0 + strh r1, [r0] + rsb r1, r2, #0 + strh r1, [r0, #4] + bx lr + arm_func_end G2x_SetBlendBrightness_ + + arm_func_start G2x_ChangeBlendBrightness_ +G2x_ChangeBlendBrightness_: ; 0x020CF1A0 + ldrh r3, [r0] + cmp r1, #0 + and r2, r3, #0xc0 + bge _020CF1CC + cmp r2, #0x80 + biceq r2, r3, #0xc0 + orreq r2, r2, #0xc0 + streqh r2, [r0] + rsb r1, r1, #0 + strh r1, [r0, #4] + bx lr +_020CF1CC: + cmp r2, #0xc0 + biceq r2, r3, #0xc0 + orreq r2, r2, #0x80 + streqh r2, [r0] + strh r1, [r0, #4] + bx lr + arm_func_end G2x_ChangeBlendBrightness_ diff --git a/lib/NitroSDK/asm/g3.s b/lib/NitroSDK/asm/g3.s new file mode 100644 index 00000000..49a75fec --- /dev/null +++ b/lib/NitroSDK/asm/g3.s @@ -0,0 +1,71 @@ + .include "asm/macros.inc" + .include "g3.inc" + .include "global.inc" + + .text + + arm_func_start G3_BeginMakeDL +G3_BeginMakeDL: ; 0x020D0D60 + str r2, [r0, #0xc] + str r1, [r0, #8] + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + mov r1, #0 + str r1, [r0, #0x10] + bx lr + arm_func_end G3_BeginMakeDL + + arm_func_start G3_EndMakeDL +G3_EndMakeDL: ; 0x020D0D80 + ldr r3, [r0] + ldr r2, [r0, #8] + cmp r2, r3 + moveq r0, #0 + bxeq lr + and r1, r3, #3 + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _020D0DF4 +_020D0DA4: ; jump table + b _020D0DB4 ; case 0 + b _020D0DBC ; case 1 + b _020D0DCC ; case 2 + b _020D0DE0 ; case 3 +_020D0DB4: + sub r0, r3, r2 + bx lr +_020D0DBC: + add r1, r3, #1 + str r1, [r0] + mov r1, #0 + strb r1, [r3] +_020D0DCC: + ldr r3, [r0] + mov r1, #0 + add r2, r3, #1 + str r2, [r0] + strb r1, [r3] +_020D0DE0: + ldr r3, [r0] + mov r1, #0 + add r2, r3, #1 + str r2, [r0] + strb r1, [r3] +_020D0DF4: + ldr r1, [r0, #0x10] + cmp r1, #0 + beq _020D0E18 + ldr r3, [r0, #4] + mov r1, #0 + add r2, r3, #4 + str r2, [r0, #4] + str r1, [r3] + str r1, [r0, #0x10] +_020D0E18: + ldr r1, [r0, #4] + str r1, [r0] + ldr r0, [r0, #8] + sub r0, r1, r0 + bx lr + arm_func_end G3_EndMakeDL diff --git a/lib/NitroSDK/asm/g3_util.s b/lib/NitroSDK/asm/g3_util.s new file mode 100644 index 00000000..51514707 --- /dev/null +++ b/lib/NitroSDK/asm/g3_util.s @@ -0,0 +1,121 @@ + .include "asm/macros.inc" + .include "g3_util.inc" + .include "global.inc" + + .public G3_LoadMtx44 + + .text + + arm_func_start G3i_OrthoW_ +G3i_OrthoW_: ; 0x020CFB08 + stmdb sp!, {r4, lr} + sub sp, sp, #0x50 + ldr ip, [sp, #0x58] + ldr lr, [sp, #0x5c] + str ip, [sp] + ldr r4, [sp, #0x68] + ldr ip, [sp, #0x60] + str lr, [sp, #4] + cmp r4, #0 + addeq r4, sp, #0x10 + str ip, [sp, #8] + str r4, [sp, #0xc] + bl MTX_OrthoW + ldr r0, [sp, #0x64] + cmp r0, #0 + addeq sp, sp, #0x50 + ldmeqia sp!, {r4, pc} + ldr r1, _020CFB68 ; =0x04000440 + mov r2, #0 + mov r0, r4 + str r2, [r1] + bl G3_LoadMtx44 + add sp, sp, #0x50 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CFB68: .word 0x04000440 + arm_func_end G3i_OrthoW_ + + arm_func_start G3i_LookAt_ +G3i_LookAt_: ; 0x020CFB6C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x30 + ldr r4, [sp, #0x40] + mov r5, r3 + cmp r4, #0 + addeq r4, sp, #0 + mov r3, r4 + bl MTX_LookAt + cmp r5, #0 + addeq sp, sp, #0x30 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _020CFBB4 ; =0x04000440 + mov r2, #2 + mov r0, r4 + str r2, [r1] + bl G3_LoadMtx43 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020CFBB4: .word 0x04000440 + arm_func_end G3i_LookAt_ + + arm_func_start G3_RotX +G3_RotX: ; 0x020CFBB8 + ldr r3, _020CFBF0 ; =0x04000468 + mov r2, #0x1000 + str r2, [r3] + mov r2, #0 + str r2, [r3] + str r2, [r3] + str r2, [r3] + str r1, [r3] + str r0, [r3] + str r2, [r3] + rsb r0, r0, #0 + str r0, [r3] + str r1, [r3] + bx lr + .align 2, 0 +_020CFBF0: .word 0x04000468 + arm_func_end G3_RotX + + arm_func_start G3_RotY +G3_RotY: ; 0x020CFBF4 + ldr ip, _020CFC2C ; =0x04000468 + mov r3, #0 + str r1, [ip] + str r3, [ip] + rsb r2, r0, #0 + str r2, [ip] + str r3, [ip] + mov r2, #0x1000 + str r2, [ip] + str r3, [ip] + str r0, [ip] + str r3, [ip] + str r1, [ip] + bx lr + .align 2, 0 +_020CFC2C: .word 0x04000468 + arm_func_end G3_RotY + + arm_func_start G3_RotZ +G3_RotZ: ; 0x020CFC30 + ldr r3, _020CFC68 ; =0x04000468 + mov r2, #0 + str r1, [r3] + str r0, [r3] + str r2, [r3] + rsb r0, r0, #0 + str r0, [r3] + str r1, [r3] + str r2, [r3] + str r2, [r3] + str r2, [r3] + mov r0, #0x1000 + str r0, [r3] + bx lr + .align 2, 0 +_020CFC68: .word 0x04000468 + arm_func_end G3_RotZ diff --git a/lib/NitroSDK/asm/g3b.s b/lib/NitroSDK/asm/g3b.s new file mode 100644 index 00000000..8d8f057b --- /dev/null +++ b/lib/NitroSDK/asm/g3b.s @@ -0,0 +1,259 @@ + .include "asm/macros.inc" + .include "g3b.inc" + .include "global.inc" + + .text + + arm_func_start G3BS_LoadMtx44 +G3BS_LoadMtx44: ; 0x020CF1E4 + mov r3, r0 + ldr r0, [r3] + mov r2, #0x16 + str r2, [r0] + mov r0, r1 + ldr ip, _020CF204 ; =MI_Copy64B + ldr r1, [r3, #4] + bx ip + .align 2, 0 +_020CF204: .word MI_Copy64B + arm_func_end G3BS_LoadMtx44 + + arm_func_start G3B_PushMtx +G3B_PushMtx: ; 0x020CF208 + ldr r1, [r0] + mov r2, #0x11 + str r2, [r1] + ldr r1, [r0, #4] + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_PushMtx + + arm_func_start G3B_PopMtx +G3B_PopMtx: ; 0x020CF228 + ldr r2, [r0] + mov r3, #0x12 + str r3, [r2] + ldr r2, [r0, #4] + str r1, [r2] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_PopMtx + + arm_func_start G3B_LoadMtx44 +G3B_LoadMtx44: ; 0x020CF254 + stmdb sp!, {r4, lr} + mov r4, r0 + bl G3BS_LoadMtx44 + ldr r0, [r4, #4] + add r0, r0, #0x40 + str r0, [r4] + add r0, r0, #4 + str r0, [r4, #4] + ldmia sp!, {r4, pc} + arm_func_end G3B_LoadMtx44 + + arm_func_start G3B_Color +G3B_Color: ; 0x020CF278 + ldr r2, [r0] + mov r3, #0x20 + str r3, [r2] + ldr r2, [r0, #4] + str r1, [r2] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_Color + + arm_func_start G3B_Normal +G3B_Normal: ; 0x020CF2A4 + stmdb sp!, {r4, lr} + mov r4, #0x21 + ldr lr, [r0] + rsb ip, r4, #0x420 + str r4, [lr] + mov lr, r3, asr #3 + and r3, ip, r1, asr #3 + mov r2, r2, asr #3 + mov r1, r2, lsl #0x16 + orr r2, r3, r1, lsr #12 + mov ip, lr, lsl #0x16 + ldr r1, [r0, #4] + orr r2, r2, ip, lsr #2 + str r2, [r1] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + ldmia sp!, {r4, pc} + arm_func_end G3B_Normal + + arm_func_start G3B_Vtx +G3B_Vtx: ; 0x020CF2F4 + stmdb sp!, {r3, lr} + ldr ip, [r0] + mov r2, r2, lsl #0x10 + mov lr, #0x23 + str lr, [ip] + mov r2, r2, lsr #0x10 + mov ip, r2, lsl #0x10 + mov r2, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + ldr r3, [r0, #4] + orr r1, ip, r1, lsr #16 + str r1, [r3] + ldr r1, [r0, #4] + mov r2, r2, lsr #0x10 + str r2, [r1, #4] + ldr r1, [r0, #4] + add r1, r1, #8 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + arm_func_end G3B_Vtx + + arm_func_start G3B_PolygonAttr +G3B_PolygonAttr: ; 0x020CF348 + orr r1, r1, r2, lsl #4 + ldr r2, [r0] + mov ip, #0x29 + str ip, [r2] + orr r1, r1, r3, lsl #6 + ldr r2, [sp, #8] + ldr r3, [sp] + orr r1, r2, r1 + orr r2, r1, r3, lsl #24 + ldr ip, [sp, #4] + ldr r1, [r0, #4] + orr r2, r2, ip, lsl #16 + str r2, [r1] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_PolygonAttr + + arm_func_start G3B_MaterialColorDiffAmb +G3B_MaterialColorDiffAmb: ; 0x020CF394 + stmdb sp!, {r3, lr} + ldr ip, [r0] + mov lr, #0x30 + cmp r3, #0 + movne r3, #1 + str lr, [ip] + orr r2, r1, r2, lsl #16 + moveq r3, #0 + ldr r1, [r0, #4] + orr r2, r2, r3, lsl #15 + str r2, [r1] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + arm_func_end G3B_MaterialColorDiffAmb + + arm_func_start G3B_MaterialColorSpecEmi +G3B_MaterialColorSpecEmi: ; 0x020CF3D8 + stmdb sp!, {r3, lr} + ldr ip, [r0] + mov lr, #0x31 + cmp r3, #0 + movne r3, #1 + str lr, [ip] + orr r2, r1, r2, lsl #16 + moveq r3, #0 + ldr r1, [r0, #4] + orr r2, r2, r3, lsl #15 + str r2, [r1] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + arm_func_end G3B_MaterialColorSpecEmi + + arm_func_start G3B_LightVector +G3B_LightVector: ; 0x020CF41C + stmdb sp!, {r3, r4, r5, lr} + ldrsh lr, [sp, #0x10] + ldr ip, _020CF474 ; =0x000003FF + mov r3, r3, asr #3 + and ip, ip, r2, asr #3 + mov r2, r3, lsl #0x16 + mov lr, lr, asr #3 + ldr r4, [r0] + mov r5, #0x32 + str r5, [r4] + mov r3, lr, lsl #0x16 + orr r2, ip, r2, lsr #12 + orr r3, r2, r3, lsr #2 + ldr r2, [r0, #4] + orr r1, r3, r1, lsl #30 + str r1, [r2] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020CF474: .word 0x000003FF + arm_func_end G3B_LightVector + + arm_func_start G3B_LightColor +G3B_LightColor: ; 0x020CF478 + ldr r3, [r0] + mov ip, #0x33 + str ip, [r3] + ldr r3, [r0, #4] + orr r1, r2, r1, lsl #30 + str r1, [r3] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_LightColor + + arm_func_start G3B_Begin +G3B_Begin: ; 0x020CF4A8 + ldr r2, [r0] + mov r3, #0x40 + str r3, [r2] + ldr r2, [r0, #4] + str r1, [r2] + ldr r1, [r0, #4] + add r1, r1, #4 + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_Begin + + arm_func_start G3B_End +G3B_End: ; 0x020CF4D4 + ldr r1, [r0] + mov r2, #0x41 + str r2, [r1] + ldr r1, [r0, #4] + str r1, [r0] + add r1, r1, #4 + str r1, [r0, #4] + bx lr + arm_func_end G3B_End diff --git a/lib/NitroSDK/asm/g3imm.s b/lib/NitroSDK/asm/g3imm.s new file mode 100644 index 00000000..a090c751 --- /dev/null +++ b/lib/NitroSDK/asm/g3imm.s @@ -0,0 +1,56 @@ + .include "asm/macros.inc" + .include "g3imm.inc" + .include "global.inc" + + .public GX_SendFifo64B + .public GX_SendFifo48B + + .text + + arm_func_start G3_LoadMtx44 +G3_LoadMtx44: ; 0x020CF4F4 + ldr r1, _020CF508 ; =0x04000400 + mov r2, #0x16 + ldr ip, _020CF50C ; =GX_SendFifo64B + str r2, [r1] + bx ip + .align 2, 0 +_020CF508: .word 0x04000400 +_020CF50C: .word GX_SendFifo64B + arm_func_end G3_LoadMtx44 + + arm_func_start G3_LoadMtx43 +G3_LoadMtx43: ; 0x020CF510 + ldr r1, _020CF524 ; =0x04000400 + mov r2, #0x17 + ldr ip, _020CF528 ; =GX_SendFifo48B + str r2, [r1] + bx ip + .align 2, 0 +_020CF524: .word 0x04000400 +_020CF528: .word GX_SendFifo48B + arm_func_end G3_LoadMtx43 + + arm_func_start G3_MultMtx43 +G3_MultMtx43: ; 0x020CF52C + ldr r1, _020CF540 ; =0x04000400 + mov r2, #0x19 + ldr ip, _020CF544 ; =GX_SendFifo48B + str r2, [r1] + bx ip + .align 2, 0 +_020CF540: .word 0x04000400 +_020CF544: .word GX_SendFifo48B + arm_func_end G3_MultMtx43 + + arm_func_start G3_MultMtx33 +G3_MultMtx33: ; 0x020CF548 + ldr r1, _020CF55C ; =0x04000400 + mov r2, #0x1a + ldr ip, _020CF560 ; =MI_Copy36B + str r2, [r1] + bx ip + .align 2, 0 +_020CF55C: .word 0x04000400 +_020CF560: .word MI_Copy36B + arm_func_end G3_MultMtx33 diff --git a/lib/NitroSDK/asm/g3x.s b/lib/NitroSDK/asm/g3x.s new file mode 100644 index 00000000..1e95cd90 --- /dev/null +++ b/lib/NitroSDK/asm/g3x.s @@ -0,0 +1,463 @@ + .include "asm/macros.inc" + .include "g3x.inc" + .include "global.inc" + + .public GXi_DmaId + + .text + + arm_func_start G3X_Init +G3X_Init: ; 0x020CF564 + stmdb sp!, {r3, lr} + bl G3X_ClearFifo + ldr r1, _020CF650 ; =0x04000504 + mov r0, #0 + str r0, [r1] +_020CF578: + ldr r0, [r1, #0xfc] + tst r0, #0x8000000 + bne _020CF578 + ldr r0, _020CF654 ; =0x04000060 + mov r2, #0 + strh r2, [r0] + str r2, [r1, #0xfc] + str r2, [r0, #-0x50] + ldrh ip, [r0] + ldr r2, _020CF658 ; =0xFFFFCFFD + ldr r3, _020CF65C ; =0x0000CFFB + orr ip, ip, #0x2000 + strh ip, [r0] + ldrh ip, [r0] + orr ip, ip, #0x1000 + strh ip, [r0] + ldrh ip, [r0] + and r2, ip, r2 + strh r2, [r0] + ldrh r2, [r0] + bic r2, r2, #0x3000 + orr r2, r2, #0x10 + strh r2, [r0] + ldrh r2, [r0] + and r2, r2, r3 + strh r2, [r0] + ldr r0, [r1, #0xfc] + orr r0, r0, #0x8000 + str r0, [r1, #0xfc] + ldr r0, [r1, #0xfc] + bic r0, r0, #0xc0000000 + orr r0, r0, #0x80000000 + str r0, [r1, #0xfc] + bl G3X_InitMtxStack + ldr r1, _020CF660 ; =0x04000350 + mov r2, #0 + ldr r0, _020CF664 ; =0x00007FFF + str r2, [r1] + strh r0, [r1, #4] + strh r2, [r1, #6] + str r2, [r1, #8] + strh r2, [r1, #0xc] + sub r1, r1, #0x348 + ldrh r0, [r1] + bic r0, r0, #3 + strh r0, [r1] + bl G3X_InitTable + ldr r2, _020CF668 ; =0x001F0080 + ldr r1, _020CF66C ; =0x040004A4 + mov r0, #0 + str r2, [r1] + str r0, [r1, #4] + str r0, [r1, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF650: .word 0x04000504 +_020CF654: .word 0x04000060 +_020CF658: .word 0xFFFFCFFD +_020CF65C: .word 0x0000CFFB +_020CF660: .word 0x04000350 +_020CF664: .word 0x00007FFF +_020CF668: .word 0x001F0080 +_020CF66C: .word 0x040004A4 + arm_func_end G3X_Init + + arm_func_start G3X_Reset +G3X_Reset: ; 0x020CF670 + stmdb sp!, {r3, lr} + ldr r2, _020CF6CC ; =0x04000600 +_020CF678: + ldr r0, [r2] + tst r0, #0x8000000 + bne _020CF678 + ldr r0, [r2] + ldr r1, _020CF6D0 ; =0x04000060 + orr r0, r0, #0x8000 + str r0, [r2] + ldrh r0, [r1] + orr r0, r0, #0x2000 + strh r0, [r1] + ldrh r0, [r1] + orr r0, r0, #0x1000 + strh r0, [r1] + bl G3X_ResetMtxStack + ldr r2, _020CF6D4 ; =0x001F0080 + ldr r1, _020CF6D8 ; =0x040004A4 + mov r0, #0 + str r2, [r1] + str r0, [r1, #4] + str r0, [r1, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF6CC: .word 0x04000600 +_020CF6D0: .word 0x04000060 +_020CF6D4: .word 0x001F0080 +_020CF6D8: .word 0x040004A4 + arm_func_end G3X_Reset + + arm_func_start G3X_ClearFifo +G3X_ClearFifo: ; 0x020CF6DC + stmdb sp!, {r3, lr} + ldr r0, _020CF6FC ; =0x04000400 + bl GXi_NopClearFifo128_ + ldr r1, _020CF700 ; =0x04000600 +_020CF6EC: + ldr r0, [r1] + tst r0, #0x8000000 + bne _020CF6EC + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF6FC: .word 0x04000400 +_020CF700: .word 0x04000600 + arm_func_end G3X_ClearFifo + + arm_func_start G3X_InitMtxStack +G3X_InitMtxStack: ; 0x020CF704 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _020CF790 ; =0x04000600 + ldr r0, [r1] + orr r0, r0, #0x8000 + str r0, [r1] + add r4, sp, #4 +_020CF720: + mov r0, r4 + bl G3X_GetMtxStackLevelPV + cmp r0, #0 + bne _020CF720 + add r4, sp, #0 +_020CF734: + mov r0, r4 + bl G3X_GetMtxStackLevelPJ + cmp r0, #0 + bne _020CF734 + ldr r1, _020CF794 ; =0x04000440 + mov r0, #3 + str r0, [r1] + mov r0, #0 + str r0, [r1, #0x14] + str r0, [r1] + ldr r0, [sp] + mov r2, #0 + cmp r0, #0 + strne r0, [r1, #8] + ldr r1, _020CF798 ; =0x04000454 + mov r0, #2 + str r2, [r1] + str r0, [r1, #-0x14] + ldr r0, [sp, #4] + str r0, [r1, #-0xc] + str r2, [r1] + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CF790: .word 0x04000600 +_020CF794: .word 0x04000440 +_020CF798: .word 0x04000454 + arm_func_end G3X_InitMtxStack + + arm_func_start G3X_ResetMtxStack +G3X_ResetMtxStack: ; 0x020CF79C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _020CF824 ; =0x04000600 + ldr r0, [r1] + orr r0, r0, #0x8000 + str r0, [r1] + add r4, sp, #4 +_020CF7B8: + mov r0, r4 + bl G3X_GetMtxStackLevelPV + cmp r0, #0 + bne _020CF7B8 + add r4, sp, #0 +_020CF7CC: + mov r0, r4 + bl G3X_GetMtxStackLevelPJ + cmp r0, #0 + bne _020CF7CC + ldr r1, _020CF828 ; =0x04000440 + mov r0, #3 + str r0, [r1] + mov r0, #0 + str r0, [r1, #0x14] + str r0, [r1] + ldr r0, [sp] + ldr r2, _020CF828 ; =0x04000440 + cmp r0, #0 + strne r0, [r1, #8] + mov r0, #2 + str r0, [r2] + ldr r1, [sp, #4] + mov r0, #0 + str r1, [r2, #8] + str r0, [r2, #0x14] + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CF824: .word 0x04000600 +_020CF828: .word 0x04000440 + arm_func_end G3X_ResetMtxStack + + arm_func_start G3X_SetFog +G3X_SetFog: ; 0x020CF82C + cmp r0, #0 + beq _020CF860 + ldr ip, _020CF878 ; =0x0400035C + mov r0, r1, lsl #6 + strh r3, [ip] + sub r3, ip, #0x2fc + ldrh r1, [r3] + orr r0, r0, r2, lsl #8 + orr r0, r0, #0x80 + bic r1, r1, #0x3f40 + orr r0, r1, r0 + strh r0, [r3] + bx lr +_020CF860: + ldr r2, _020CF87C ; =0x04000060 + ldr r0, _020CF880 ; =0x0000CF7F + ldrh r1, [r2] + and r0, r1, r0 + strh r0, [r2] + bx lr + .align 2, 0 +_020CF878: .word 0x0400035C +_020CF87C: .word 0x04000060 +_020CF880: .word 0x0000CF7F + arm_func_end G3X_SetFog + + arm_func_start G3X_GetClipMtx +G3X_GetClipMtx: ; 0x020CF884 + stmdb sp!, {r3, lr} + ldr r2, _020CF8B0 ; =0x04000600 + mov r1, r0 + ldr r0, [r2] + tst r0, #0x8000000 + mvnne r0, #0 + ldmneia sp!, {r3, pc} + add r0, r2, #0x40 + bl MI_Copy64B + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF8B0: .word 0x04000600 + arm_func_end G3X_GetClipMtx + + arm_func_start G3X_GetVectorMtx +G3X_GetVectorMtx: ; 0x020CF8B4 + stmdb sp!, {r3, lr} + ldr r2, _020CF8E0 ; =0x04000600 + mov r1, r0 + ldr r0, [r2] + tst r0, #0x8000000 + mvnne r0, #0 + ldmneia sp!, {r3, pc} + add r0, r2, #0x80 + bl MI_Copy36B + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF8E0: .word 0x04000600 + arm_func_end G3X_GetVectorMtx + + arm_func_start G3X_SetEdgeColorTable +G3X_SetEdgeColorTable: ; 0x020CF8E4 + ldr ip, _020CF8F4 ; =MIi_CpuCopy16 + ldr r1, _020CF8F8 ; =0x04000330 + mov r2, #0x10 + bx ip + .align 2, 0 +_020CF8F4: .word MIi_CpuCopy16 +_020CF8F8: .word 0x04000330 + arm_func_end G3X_SetEdgeColorTable + + arm_func_start G3X_SetFogTable +G3X_SetFogTable: ; 0x020CF8FC + ldr ip, _020CF908 ; =MI_Copy32B + ldr r1, _020CF90C ; =0x04000360 + bx ip + .align 2, 0 +_020CF908: .word MI_Copy32B +_020CF90C: .word 0x04000360 + arm_func_end G3X_SetFogTable + + arm_func_start G3X_SetClearColor +G3X_SetClearColor: ; 0x020CF910 + ldr ip, [sp] + orr r0, r0, r1, lsl #16 + orr r1, r0, r3, lsl #24 + cmp ip, #0 + ldr r0, _020CF934 ; =0x04000350 + orrne r1, r1, #0x8000 + str r1, [r0] + strh r2, [r0, #4] + bx lr + .align 2, 0 +_020CF934: .word 0x04000350 + arm_func_end G3X_SetClearColor + + arm_func_start G3X_InitTable +G3X_InitTable: ; 0x020CF938 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + ldr r0, _020CF9C8 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + ldr r1, _020CF9CC ; =0x04000330 + beq _020CF988 + mov r2, #0 + str r2, [sp] + mov r3, #0x10 + str r2, [sp, #4] + bl MI_DmaFill32Async + ldr r0, _020CF9C8 ; =GXi_DmaId + ldr r1, _020CF9D0 ; =0x04000360 + ldr r0, [r0] + mov r2, #0 + mov r3, #0x60 + bl MI_DmaFill32 + b _020CF9A4 +_020CF988: + mov r0, #0 + mov r2, #0x10 + bl MIi_CpuClear32 + ldr r1, _020CF9D0 ; =0x04000360 + mov r0, #0 + mov r2, #0x60 + bl MIi_CpuClear32 +_020CF9A4: + mov r2, #0 + ldr r0, _020CF9D4 ; =0x040004D0 + mov r1, r2 +_020CF9B0: + add r2, r2, #1 + str r1, [r0] + cmp r2, #0x20 + blt _020CF9B0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CF9C8: .word GXi_DmaId +_020CF9CC: .word 0x04000330 +_020CF9D0: .word 0x04000360 +_020CF9D4: .word 0x040004D0 + arm_func_end G3X_InitTable + + arm_func_start G3X_GetMtxStackLevelPV +G3X_GetMtxStackLevelPV: ; 0x020CF9D8 + ldr r2, _020CFA04 ; =0x04000600 + ldr r1, [r2] + tst r1, #0x4000 + mvnne r0, #0 + bxne lr + ldr r1, [r2] + and r1, r1, #0x1f00 + mov r1, r1, lsr #8 + str r1, [r0] + mov r0, #0 + bx lr + .align 2, 0 +_020CFA04: .word 0x04000600 + arm_func_end G3X_GetMtxStackLevelPV + + arm_func_start G3X_GetMtxStackLevelPJ +G3X_GetMtxStackLevelPJ: ; 0x020CFA08 + ldr r2, _020CFA34 ; =0x04000600 + ldr r1, [r2] + tst r1, #0x4000 + mvnne r0, #0 + bxne lr + ldr r1, [r2] + and r1, r1, #0x2000 + mov r1, r1, lsr #0xd + str r1, [r0] + mov r0, #0 + bx lr + .align 2, 0 +_020CFA34: .word 0x04000600 + arm_func_end G3X_GetMtxStackLevelPJ + + arm_func_start G3X_GetBoxTestResult +G3X_GetBoxTestResult: ; 0x020CFA38 + ldr r2, _020CFA60 ; =0x04000600 + ldr r1, [r2] + tst r1, #1 + mvnne r0, #0 + bxne lr + ldr r1, [r2] + and r1, r1, #2 + str r1, [r0] + mov r0, #0 + bx lr + .align 2, 0 +_020CFA60: .word 0x04000600 + arm_func_end G3X_GetBoxTestResult + + arm_func_start G3X_SetHOffset +G3X_SetHOffset: ; 0x020CFA64 + ldr r1, _020CFA70 ; =0x04000010 + str r0, [r1] + bx lr + .align 2, 0 +_020CFA70: .word 0x04000010 + arm_func_end G3X_SetHOffset + + arm_func_start GXi_NopClearFifo128_ +GXi_NopClearFifo128_: ; 0x020CFA74 + mov r1, #0 + mov r2, #0 + mov r3, #0 + mov ip, #0 + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + stmia r0, {r1, r2, r3, ip} + bx lr + arm_func_end GXi_NopClearFifo128_ diff --git a/lib/NitroSDK/asm/gx.s b/lib/NitroSDK/asm/gx.s new file mode 100644 index 00000000..03327381 --- /dev/null +++ b/lib/NitroSDK/asm/gx.s @@ -0,0 +1,273 @@ + .include "asm/macros.inc" + .include "gx.inc" + .include "global.inc" + + .bss + +sDispMode: + .space 2 + + .public GXi_VRamLockId +GXi_VRamLockId: + .space 2 + + .data + + .public sIsDispOn +sIsDispOn: + .word 1 + .public GXi_DmaId +GXi_DmaId: + .word 3 + + .text + + arm_func_start GX_Init +GX_Init: ; 0x020CD7C4 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020CD8EC ; =0x04000304 + ldr r0, _020CD8F0 ; =0xFFFFFDF1 + ldrh r1, [r2] + orr r1, r1, #0x8000 + strh r1, [r2] + ldrh r1, [r2] + and r0, r1, r0 + orr r0, r0, #0xe + orr r0, r0, #0x200 + strh r0, [r2] + ldrh r0, [r2] + orr r0, r0, #1 + strh r0, [r2] + bl GX_InitGXState + ldr r5, _020CD8F4 ; =GXi_VRamLockId - 2 + ldrh r0, [r5, #2] + cmp r0, #0 + bne _020CD838 + mvn r4, #2 +_020CD814: + bl OS_GetLockID + mov r6, r0 + cmp r6, r4 + bne _020CD828 + bl OS_Terminate +_020CD828: + strh r6, [r5, #2] + ldrh r0, [r5, #2] + cmp r0, #0 + beq _020CD814 +_020CD838: + ldr r0, _020CD8F8 ; =0x04000004 + mov r2, #0 + mov r3, #0x4000000 + strh r2, [r0] + ldr r0, _020CD8FC ; =sIsDispOn + str r2, [r3] + ldr r0, [r0, #4] + sub r1, r3, #0x4000001 + cmp r0, r1 + beq _020CD890 + add r1, r3, #8 + mov r3, #0x60 + bl MI_DmaFill32 + ldr r1, _020CD900 ; =0x0400006C + mov r2, #0 + ldr r0, _020CD8FC ; =sIsDispOn + strh r2, [r1] + ldr r0, [r0, #4] + ldr r1, _020CD904 ; =0x04001000 + mov r3, #0x70 + bl MI_DmaFill32 + b _020CD8B8 +_020CD890: + mov r0, r2 + add r1, r3, #8 + mov r2, #0x60 + bl MIi_CpuClear32 + ldr r3, _020CD900 ; =0x0400006C + mov r0, #0 + ldr r1, _020CD904 ; =0x04001000 + mov r2, #0x70 + strh r0, [r3] + bl MIi_CpuClear32 +_020CD8B8: + ldr r0, _020CD908 ; =0x04000020 + mov r2, #0x100 + strh r2, [r0] + strh r2, [r0, #6] + strh r2, [r0, #0x10] + strh r2, [r0, #0x16] + add r1, r0, #0x1000 + ldr r0, _020CD90C ; =0x04001026 + strh r2, [r1] + strh r2, [r0] + strh r2, [r0, #0xa] + strh r2, [r0, #0x10] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020CD8EC: .word 0x04000304 +_020CD8F0: .word 0xFFFFFDF1 +_020CD8F4: .word GXi_VRamLockId - 2 +_020CD8F8: .word 0x04000004 +_020CD8FC: .word sIsDispOn +_020CD900: .word 0x0400006C +_020CD904: .word 0x04001000 +_020CD908: .word 0x04000020 +_020CD90C: .word 0x04001026 + arm_func_end GX_Init + + arm_func_start GX_HBlankIntr +GX_HBlankIntr: ; 0x020CD910 + ldr r2, _020CD940 ; =0x04000004 + cmp r0, #0 + ldrh r0, [r2] + ldreqh r1, [r2] + and r0, r0, #0x10 + biceq r1, r1, #0x10 + streqh r1, [r2] + bxeq lr + ldrh r1, [r2] + orr r1, r1, #0x10 + strh r1, [r2] + bx lr + .align 2, 0 +_020CD940: .word 0x04000004 + arm_func_end GX_HBlankIntr + + arm_func_start GX_VBlankIntr +GX_VBlankIntr: ; 0x020CD944 + ldr r2, _020CD974 ; =0x04000004 + cmp r0, #0 + ldrh r0, [r2] + ldreqh r1, [r2] + and r0, r0, #8 + biceq r1, r1, #8 + streqh r1, [r2] + bxeq lr + ldrh r1, [r2] + orr r1, r1, #8 + strh r1, [r2] + bx lr + .align 2, 0 +_020CD974: .word 0x04000004 + arm_func_end GX_VBlankIntr + + arm_func_start GX_DispOff +GX_DispOff: ; 0x020CD978 + stmdb sp!, {r3, lr} + mov lr, #0x4000000 + ldr ip, [lr] + ldr r1, _020CD9AC ; =sIsDispOn + and r2, ip, #0x30000 + mov r3, #0 + ldr r0, _020CD9B0 ; =sDispMode + mov r2, r2, lsr #0x10 + strh r3, [r1] + strh r2, [r0] + bic r0, ip, #0x30000 + str r0, [lr] + ldmia sp!, {r3, pc} + .align 2, 0 +_020CD9AC: .word sIsDispOn +_020CD9B0: .word sDispMode + arm_func_end GX_DispOff + + arm_func_start GX_DispOn +GX_DispOn: ; 0x020CD9B4 + ldr r0, _020CD9F4 ; =sDispMode + ldr r1, _020CD9F8 ; =sIsDispOn + ldrh r2, [r0] + mov r0, #1 + strh r0, [r1] + mov r1, #0x4000000 + cmp r2, #0 + ldreq r0, [r1] + orreq r0, r0, #0x10000 + streq r0, [r1] + bxeq lr + ldr r0, [r1] + bic r0, r0, #0x30000 + orr r0, r0, r2, lsl #16 + str r0, [r1] + bx lr + .align 2, 0 +_020CD9F4: .word sDispMode +_020CD9F8: .word sIsDispOn + arm_func_end GX_DispOn + + arm_func_start GX_SetGraphicsMode +GX_SetGraphicsMode: ; 0x020CD9FC + stmdb sp!, {r3, lr} + ldr r3, _020CDA58 ; =sIsDispOn + mov lr, #0x4000000 + ldrh ip, [r3] + ldr lr, [lr] + ldr r3, _020CDA5C ; =sDispMode + cmp ip, #0 + strh r0, [r3] + ldr r3, _020CDA60 ; =0xFFF0FFF0 + moveq r0, #0 + and r3, lr, r3 + orr r0, r3, r0, lsl #16 + orr r0, r1, r0 + orr r1, r0, r2, lsl #3 + mov ip, #0x4000000 + ldr r0, _020CDA5C ; =sDispMode + str r1, [ip] + ldrh r0, [r0] + cmp r0, #0 + ldreq r0, _020CDA58 ; =sIsDispOn + moveq r1, #0 + streqh r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020CDA58: .word sIsDispOn +_020CDA5C: .word sDispMode +_020CDA60: .word 0xFFF0FFF0 + arm_func_end GX_SetGraphicsMode + + arm_func_start GXS_SetGraphicsMode +GXS_SetGraphicsMode: ; 0x020CDA64 + ldr r2, _020CDA7C ; =0x04001000 + ldr r1, [r2] + bic r1, r1, #7 + orr r0, r1, r0 + str r0, [r2] + bx lr + .align 2, 0 +_020CDA7C: .word 0x04001000 + arm_func_end GXS_SetGraphicsMode + + arm_func_start GXx_SetMasterBrightness_ +GXx_SetMasterBrightness_: ; 0x020CDA80 + cmp r1, #0 + moveq r1, #0 + streqh r1, [r0] + bxeq lr + orrgt r1, r1, #0x4000 + strgth r1, [r0] + rsble r1, r1, #0 + orrle r1, r1, #0x8000 + strleh r1, [r0] + bx lr + arm_func_end GXx_SetMasterBrightness_ + + arm_func_start GXx_GetMasterBrightness_ +GXx_GetMasterBrightness_: ; 0x020CDAA8 + ldrh r1, [r0] + and r1, r1, #0xc000 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + moveq r0, #0 + bxeq lr + cmp r1, #0x4000 + ldreqh r0, [r0] + andeq r0, r0, #0x1f + bxeq lr + cmp r1, #0x8000 + movne r0, #0 + bxne lr + ldrh r0, [r0] + and r0, r0, #0x1f + rsb r0, r0, #0 + bx lr + arm_func_end GXx_GetMasterBrightness_ diff --git a/lib/NitroSDK/asm/gx_bgcnt.s b/lib/NitroSDK/asm/gx_bgcnt.s new file mode 100644 index 00000000..cd5e73d0 --- /dev/null +++ b/lib/NitroSDK/asm/gx_bgcnt.s @@ -0,0 +1,393 @@ + .include "asm/macros.inc" + .include "gx_bgcnt.inc" + .include "global.inc" + + .text + + arm_func_start G2_GetBG0ScrPtr +G2_GetBG0ScrPtr: ; 0x020CEC3C + ldr r1, _020CEC6C ; =0x04000008 + mov r0, #0x4000000 + ldrh r1, [r1] + ldr r0, [r0] + and r0, r0, #0x38000000 + mov r0, r0, lsr #0x1b + and r1, r1, #0x1f00 + mov r0, r0, lsl #0x10 + mov r1, r1, asr #8 + add r0, r0, #0x6000000 + add r0, r0, r1, lsl #11 + bx lr + .align 2, 0 +_020CEC6C: .word 0x04000008 + arm_func_end G2_GetBG0ScrPtr + + arm_func_start G2S_GetBG0ScrPtr +G2S_GetBG0ScrPtr: ; 0x020CEC70 + ldr r0, _020CEC8C ; =0x04001008 + ldrh r0, [r0] + and r0, r0, #0x1f00 + mov r0, r0, asr #8 + mov r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr + .align 2, 0 +_020CEC8C: .word 0x04001008 + arm_func_end G2S_GetBG0ScrPtr + + arm_func_start G2_GetBG1ScrPtr +G2_GetBG1ScrPtr: ; 0x020CEC90 + ldr r1, _020CECC0 ; =0x0400000A + mov r0, #0x4000000 + ldrh r1, [r1] + ldr r0, [r0] + and r0, r0, #0x38000000 + mov r0, r0, lsr #0x1b + and r1, r1, #0x1f00 + mov r0, r0, lsl #0x10 + mov r1, r1, asr #8 + add r0, r0, #0x6000000 + add r0, r0, r1, lsl #11 + bx lr + .align 2, 0 +_020CECC0: .word 0x0400000A + arm_func_end G2_GetBG1ScrPtr + + arm_func_start G2S_GetBG1ScrPtr +G2S_GetBG1ScrPtr: ; 0x020CECC4 + ldr r0, _020CECE0 ; =0x0400100A + ldrh r0, [r0] + and r0, r0, #0x1f00 + mov r0, r0, asr #8 + mov r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr + .align 2, 0 +_020CECE0: .word 0x0400100A + arm_func_end G2S_GetBG1ScrPtr + + arm_func_start G2_GetBG2ScrPtr +G2_GetBG2ScrPtr: ; 0x020CECE4 + mov r0, #0x4000000 + ldr r1, [r0] + ldrh r3, [r0, #0xc] + ldr r0, [r0] + and ip, r1, #7 + and r0, r0, #0x38000000 + mov r1, r0, lsr #0x1b + and r0, r3, #0x1f00 + mov r2, r1, lsl #0x10 + cmp ip, #6 + mov r1, r0, lsr #8 + addls pc, pc, ip, lsl #2 + b _020CED60 +_020CED18: ; jump table + b _020CED34 ; case 0 + b _020CED34 ; case 1 + b _020CED34 ; case 2 + b _020CED34 ; case 3 + b _020CED34 ; case 4 + b _020CED40 ; case 5 + b _020CED58 ; case 6 +_020CED34: + add r0, r2, #0x6000000 + add r0, r0, r1, lsl #11 + bx lr +_020CED40: + tst r3, #0x80 + movne r0, r1, lsl #0xe + addne r0, r0, #0x6000000 + addeq r0, r2, #0x6000000 + addeq r0, r0, r1, lsl #11 + bx lr +_020CED58: + mov r0, #0x6000000 + bx lr +_020CED60: + mov r0, #0 + bx lr + arm_func_end G2_GetBG2ScrPtr + + arm_func_start G2S_GetBG2ScrPtr +G2S_GetBG2ScrPtr: ; 0x020CED68 + ldr r1, _020CEDD8 ; =0x04001000 + ldr r0, [r1] + ldrh r1, [r1, #0xc] + and r2, r0, #7 + cmp r2, #6 + and r0, r1, #0x1f00 + mov r0, r0, lsr #8 + addls pc, pc, r2, lsl #2 + b _020CEDD0 +_020CED8C: ; jump table + b _020CEDA8 ; case 0 + b _020CEDA8 ; case 1 + b _020CEDA8 ; case 2 + b _020CEDA8 ; case 3 + b _020CEDA8 ; case 4 + b _020CEDB4 ; case 5 + b _020CEDC8 ; case 6 +_020CEDA8: + mov r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr +_020CEDB4: + tst r1, #0x80 + movne r0, r0, lsl #0xe + moveq r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr +_020CEDC8: + mov r0, #0 + bx lr +_020CEDD0: + mov r0, #0 + bx lr + .align 2, 0 +_020CEDD8: .word 0x04001000 + arm_func_end G2S_GetBG2ScrPtr + + arm_func_start G2_GetBG3ScrPtr +G2_GetBG3ScrPtr: ; 0x020CEDDC + mov r0, #0x4000000 + ldr r1, [r0] + ldrh r3, [r0, #0xe] + ldr r0, [r0] + and ip, r1, #7 + and r0, r0, #0x38000000 + mov r1, r0, lsr #0x1b + and r0, r3, #0x1f00 + mov r2, r1, lsl #0x10 + cmp ip, #6 + mov r1, r0, lsr #8 + addls pc, pc, ip, lsl #2 + b _020CEE58 +_020CEE10: ; jump table + b _020CEE2C ; case 0 + b _020CEE2C ; case 1 + b _020CEE2C ; case 2 + b _020CEE38 ; case 3 + b _020CEE38 ; case 4 + b _020CEE38 ; case 5 + b _020CEE50 ; case 6 +_020CEE2C: + add r0, r2, #0x6000000 + add r0, r0, r1, lsl #11 + bx lr +_020CEE38: + tst r3, #0x80 + movne r0, r1, lsl #0xe + addne r0, r0, #0x6000000 + addeq r0, r2, #0x6000000 + addeq r0, r0, r1, lsl #11 + bx lr +_020CEE50: + mov r0, #0 + bx lr +_020CEE58: + mov r0, #0 + bx lr + arm_func_end G2_GetBG3ScrPtr + + arm_func_start G2S_GetBG3ScrPtr +G2S_GetBG3ScrPtr: ; 0x020CEE60 + ldr r1, _020CEED0 ; =0x04001000 + ldr r0, [r1] + ldrh r1, [r1, #0xe] + and r2, r0, #7 + cmp r2, #6 + and r0, r1, #0x1f00 + mov r0, r0, lsr #8 + addls pc, pc, r2, lsl #2 + b _020CEEC8 +_020CEE84: ; jump table + b _020CEEA0 ; case 0 + b _020CEEA0 ; case 1 + b _020CEEA0 ; case 2 + b _020CEEAC ; case 3 + b _020CEEAC ; case 4 + b _020CEEAC ; case 5 + b _020CEEC0 ; case 6 +_020CEEA0: + mov r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr +_020CEEAC: + tst r1, #0x80 + movne r0, r0, lsl #0xe + moveq r0, r0, lsl #0xb + add r0, r0, #0x6200000 + bx lr +_020CEEC0: + mov r0, #0 + bx lr +_020CEEC8: + mov r0, #0 + bx lr + .align 2, 0 +_020CEED0: .word 0x04001000 + arm_func_end G2S_GetBG3ScrPtr + + arm_func_start G2_GetBG0CharPtr +G2_GetBG0CharPtr: ; 0x020CEED4 + ldr r1, _020CEF04 ; =0x04000008 + mov r0, #0x4000000 + ldrh r1, [r1] + ldr r0, [r0] + and r0, r0, #0x7000000 + mov r0, r0, lsr #0x18 + and r1, r1, #0x3c + mov r0, r0, lsl #0x10 + mov r1, r1, asr #2 + add r0, r0, #0x6000000 + add r0, r0, r1, lsl #14 + bx lr + .align 2, 0 +_020CEF04: .word 0x04000008 + arm_func_end G2_GetBG0CharPtr + + arm_func_start G2S_GetBG0CharPtr +G2S_GetBG0CharPtr: ; 0x020CEF08 + ldr r0, _020CEF24 ; =0x04001008 + ldrh r0, [r0] + and r0, r0, #0x3c + mov r0, r0, asr #2 + mov r0, r0, lsl #0xe + add r0, r0, #0x6200000 + bx lr + .align 2, 0 +_020CEF24: .word 0x04001008 + arm_func_end G2S_GetBG0CharPtr + + arm_func_start G2_GetBG1CharPtr +G2_GetBG1CharPtr: ; 0x020CEF28 + ldr r1, _020CEF58 ; =0x0400000A + mov r0, #0x4000000 + ldrh r1, [r1] + ldr r0, [r0] + and r0, r0, #0x7000000 + mov r0, r0, lsr #0x18 + and r1, r1, #0x3c + mov r0, r0, lsl #0x10 + mov r1, r1, asr #2 + add r0, r0, #0x6000000 + add r0, r0, r1, lsl #14 + bx lr + .align 2, 0 +_020CEF58: .word 0x0400000A + arm_func_end G2_GetBG1CharPtr + + arm_func_start G2S_GetBG1CharPtr +G2S_GetBG1CharPtr: ; 0x020CEF5C + ldr r0, _020CEF78 ; =0x0400100A + ldrh r0, [r0] + and r0, r0, #0x3c + mov r0, r0, asr #2 + mov r0, r0, lsl #0xe + add r0, r0, #0x6200000 + bx lr + .align 2, 0 +_020CEF78: .word 0x0400100A + arm_func_end G2S_GetBG1CharPtr + + arm_func_start G2_GetBG2CharPtr +G2_GetBG2CharPtr: ; 0x020CEF7C + mov r1, #0x4000000 + ldr r0, [r1] + ldrh r2, [r1, #0xc] + and r0, r0, #7 + cmp r0, #5 + blt _020CEF9C + tst r2, #0x80 + bne _020CEFC4 +_020CEF9C: + mov r0, #0x4000000 + ldr r1, [r0] + and r0, r2, #0x3c + and r1, r1, #0x7000000 + mov r1, r1, lsr #0x18 + mov r1, r1, lsl #0x10 + add r1, r1, #0x6000000 + mov r0, r0, lsr #2 + add r0, r1, r0, lsl #14 + bx lr +_020CEFC4: + mov r0, #0 + bx lr + arm_func_end G2_GetBG2CharPtr + + arm_func_start G2S_GetBG2CharPtr +G2S_GetBG2CharPtr: ; 0x020CEFCC + ldr r1, _020CF008 ; =0x04001000 + ldr r0, [r1] + ldrh r1, [r1, #0xc] + and r0, r0, #7 + cmp r0, #5 + blt _020CEFEC + tst r1, #0x80 + bne _020CF000 +_020CEFEC: + and r0, r1, #0x3c + mov r0, r0, lsr #2 + mov r0, r0, lsl #0xe + add r0, r0, #0x6200000 + bx lr +_020CF000: + mov r0, #0 + bx lr + .align 2, 0 +_020CF008: .word 0x04001000 + arm_func_end G2S_GetBG2CharPtr + + arm_func_start G2_GetBG3CharPtr +G2_GetBG3CharPtr: ; 0x020CF00C + mov r1, #0x4000000 + ldr r0, [r1] + ldrh r2, [r1, #0xe] + and r0, r0, #7 + cmp r0, #3 + blt _020CF034 + cmp r0, #6 + bge _020CF05C + tst r2, #0x80 + bne _020CF05C +_020CF034: + mov r0, #0x4000000 + ldr r1, [r0] + and r0, r2, #0x3c + and r1, r1, #0x7000000 + mov r1, r1, lsr #0x18 + mov r1, r1, lsl #0x10 + add r1, r1, #0x6000000 + mov r0, r0, lsr #2 + add r0, r1, r0, lsl #14 + bx lr +_020CF05C: + mov r0, #0 + bx lr + arm_func_end G2_GetBG3CharPtr + + arm_func_start G2S_GetBG3CharPtr +G2S_GetBG3CharPtr: ; 0x020CF064 + ldr r1, _020CF0A8 ; =0x04001000 + ldr r0, [r1] + ldrh r1, [r1, #0xe] + and r0, r0, #7 + cmp r0, #3 + blt _020CF08C + cmp r0, #6 + bge _020CF0A0 + tst r1, #0x80 + bne _020CF0A0 +_020CF08C: + and r0, r1, #0x3c + mov r0, r0, lsr #2 + mov r0, r0, lsl #0xe + add r0, r0, #0x6200000 + bx lr +_020CF0A0: + mov r0, #0 + bx lr + .align 2, 0 +_020CF0A8: .word 0x04001000 + arm_func_end G2S_GetBG3CharPtr diff --git a/lib/NitroSDK/asm/gx_load2d.s b/lib/NitroSDK/asm/gx_load2d.s new file mode 100644 index 00000000..084000a4 --- /dev/null +++ b/lib/NitroSDK/asm/gx_load2d.s @@ -0,0 +1,1047 @@ + .include "asm/macros.inc" + .include "gx_load2d.inc" + .include "global.inc" + .public GXi_DmaId + + .bss + +sSubBGExtPltt: ; 0x021E15DC + .space 0x4 + +sOBJExtPlttLCDCBlk: ; 0x021E15E0 + .space 0x4 + +sOBJExtPltt: ; 0x021E15E4 + .space 0x4 + +sBGExtPlttLCDCOffset: ; 0x021E15E8 + .space 0x4 + +sBGExtPlttLCDCBlk: ; 0x021E15EC + .space 0x4 + +sBGExtPltt: ; 0x021E15F0 + .space 0x4 + +sSubOBJExtPltt: ; 0x021E15F4 + .space 0x4 + + .text + + arm_func_start GX_LoadBGPltt +GX_LoadBGPltt: ; 0x020CFC6C + stmdb sp!, {r4, lr} + ldr r3, _020CFCBC ; =GXi_DmaId + mov r4, r0 + ldr r0, [r3] + mvn ip, #0 + mov lr, r1 + mov r3, r2 + cmp r0, ip + beq _020CFCA8 + cmp r3, #0x1c + bls _020CFCA8 + mov r1, r4 + add r2, lr, #0x5000000 + bl MI_DmaCopy16 + ldmia sp!, {r4, pc} +_020CFCA8: + mov r0, r4 + mov r2, r3 + add r1, lr, #0x5000000 + bl MIi_CpuCopy16 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CFCBC: .word GXi_DmaId + arm_func_end GX_LoadBGPltt + + arm_func_start GXS_LoadBGPltt +GXS_LoadBGPltt: ; 0x020CFCC0 + stmdb sp!, {r3, lr} + ldr r3, _020CFD14 ; =GXi_DmaId + mov lr, r0 + ldr r0, [r3] + mvn ip, #0 + mov r3, r2 + cmp r0, ip + beq _020CFCFC + cmp r3, #0x1c + bls _020CFCFC + add r2, r1, #0x400 + mov r1, lr + add r2, r2, #0x5000000 + bl MI_DmaCopy16 + ldmia sp!, {r3, pc} +_020CFCFC: + add r1, r1, #0x400 + mov r0, lr + mov r2, r3 + add r1, r1, #0x5000000 + bl MIi_CpuCopy16 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CFD14: .word GXi_DmaId + arm_func_end GXS_LoadBGPltt + + arm_func_start GX_LoadOBJPltt +GX_LoadOBJPltt: ; 0x020CFD18 + stmdb sp!, {r3, lr} + ldr r3, _020CFD6C ; =GXi_DmaId + mov lr, r0 + ldr r0, [r3] + mvn ip, #0 + mov r3, r2 + cmp r0, ip + beq _020CFD54 + cmp r3, #0x1c + bls _020CFD54 + add r2, r1, #0x200 + mov r1, lr + add r2, r2, #0x5000000 + bl MI_DmaCopy16 + ldmia sp!, {r3, pc} +_020CFD54: + add r1, r1, #0x200 + mov r0, lr + mov r2, r3 + add r1, r1, #0x5000000 + bl MIi_CpuCopy16 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CFD6C: .word GXi_DmaId + arm_func_end GX_LoadOBJPltt + + arm_func_start GXS_LoadOBJPltt +GXS_LoadOBJPltt: ; 0x020CFD70 + stmdb sp!, {r3, lr} + ldr r3, _020CFDC4 ; =GXi_DmaId + mov lr, r0 + ldr r0, [r3] + mvn ip, #0 + mov r3, r2 + cmp r0, ip + beq _020CFDAC + cmp r3, #0x1c + bls _020CFDAC + add r2, r1, #0x600 + mov r1, lr + add r2, r2, #0x5000000 + bl MI_DmaCopy16 + ldmia sp!, {r3, pc} +_020CFDAC: + add r1, r1, #0x600 + mov r0, lr + mov r2, r3 + add r1, r1, #0x5000000 + bl MIi_CpuCopy16 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CFDC4: .word GXi_DmaId + arm_func_end GXS_LoadOBJPltt + + arm_func_start GX_LoadOAM +GX_LoadOAM: ; 0x020CFDC8 + stmdb sp!, {r4, lr} + ldr r3, _020CFE18 ; =GXi_DmaId + mov r4, r0 + ldr r0, [r3] + mvn ip, #0 + mov lr, r1 + mov r3, r2 + cmp r0, ip + beq _020CFE04 + cmp r3, #0x30 + bls _020CFE04 + mov r1, r4 + add r2, lr, #0x7000000 + bl MI_DmaCopy32 + ldmia sp!, {r4, pc} +_020CFE04: + mov r0, r4 + mov r2, r3 + add r1, lr, #0x7000000 + bl MIi_CpuCopy32 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CFE18: .word GXi_DmaId + arm_func_end GX_LoadOAM + + arm_func_start GXS_LoadOAM +GXS_LoadOAM: ; 0x020CFE1C + stmdb sp!, {r3, lr} + ldr r3, _020CFE70 ; =GXi_DmaId + mov lr, r0 + ldr r0, [r3] + mvn ip, #0 + mov r3, r2 + cmp r0, ip + beq _020CFE58 + cmp r3, #0x30 + bls _020CFE58 + add r2, r1, #0x400 + mov r1, lr + add r2, r2, #0x7000000 + bl MI_DmaCopy32 + ldmia sp!, {r3, pc} +_020CFE58: + add r1, r1, #0x400 + mov r0, lr + mov r2, r3 + add r1, r1, #0x7000000 + bl MIi_CpuCopy32 + ldmia sp!, {r3, pc} + .align 2, 0 +_020CFE70: .word GXi_DmaId + arm_func_end GXS_LoadOAM + + arm_func_start GX_LoadOBJ +GX_LoadOBJ: ; 0x020CFE74 + stmdb sp!, {r4, lr} + ldr r3, _020CFEC8 ; =GXi_DmaId + mov r4, r0 + ldr r0, [r3] + mvn ip, #0 + mov lr, r1 + mov r3, r2 + cmp r0, ip + mov ip, #0x6400000 + beq _020CFEB4 + cmp r3, #0x30 + bls _020CFEB4 + mov r1, r4 + add r2, ip, lr + bl MI_DmaCopy32 + ldmia sp!, {r4, pc} +_020CFEB4: + mov r0, r4 + mov r2, r3 + add r1, ip, lr + bl MIi_CpuCopy32 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CFEC8: .word GXi_DmaId + arm_func_end GX_LoadOBJ + + arm_func_start GXS_LoadOBJ +GXS_LoadOBJ: ; 0x020CFECC + stmdb sp!, {r4, lr} + ldr r3, _020CFF20 ; =GXi_DmaId + mov r4, r0 + ldr r0, [r3] + mvn ip, #0 + mov lr, r1 + mov r3, r2 + cmp r0, ip + mov ip, #0x6600000 + beq _020CFF0C + cmp r3, #0x30 + bls _020CFF0C + mov r1, r4 + add r2, ip, lr + bl MI_DmaCopy32 + ldmia sp!, {r4, pc} +_020CFF0C: + mov r0, r4 + mov r2, r3 + add r1, ip, lr + bl MIi_CpuCopy32 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CFF20: .word GXi_DmaId + arm_func_end GXS_LoadOBJ + + arm_func_start GX_LoadBG0Scr +GX_LoadBG0Scr: ; 0x020CFF24 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG0ScrPtr + ldr r1, _020CFF80 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020CFF6C + cmp r4, #0x1c + bls _020CFF6C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020CFF6C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020CFF80: .word GXi_DmaId + arm_func_end GX_LoadBG0Scr + + arm_func_start GXS_LoadBG0Scr +GXS_LoadBG0Scr: ; 0x020CFF84 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG0ScrPtr + ldr r1, _020CFFE0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020CFFCC + cmp r4, #0x1c + bls _020CFFCC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020CFFCC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020CFFE0: .word GXi_DmaId + arm_func_end GXS_LoadBG0Scr + + arm_func_start GX_LoadBG1Scr +GX_LoadBG1Scr: ; 0x020CFFE4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG1ScrPtr + ldr r1, _020D0040 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D002C + cmp r4, #0x1c + bls _020D002C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D002C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0040: .word GXi_DmaId + arm_func_end GX_LoadBG1Scr + + arm_func_start GXS_LoadBG1Scr +GXS_LoadBG1Scr: ; 0x020D0044 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG1ScrPtr + ldr r1, _020D00A0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D008C + cmp r4, #0x1c + bls _020D008C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D008C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D00A0: .word GXi_DmaId + arm_func_end GXS_LoadBG1Scr + + arm_func_start GX_LoadBG2Scr +GX_LoadBG2Scr: ; 0x020D00A4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG2ScrPtr + ldr r1, _020D0100 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D00EC + cmp r4, #0x1c + bls _020D00EC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D00EC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0100: .word GXi_DmaId + arm_func_end GX_LoadBG2Scr + + arm_func_start GXS_LoadBG2Scr +GXS_LoadBG2Scr: ; 0x020D0104 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG2ScrPtr + ldr r1, _020D0160 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D014C + cmp r4, #0x1c + bls _020D014C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D014C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0160: .word GXi_DmaId + arm_func_end GXS_LoadBG2Scr + + arm_func_start GX_LoadBG3Scr +GX_LoadBG3Scr: ; 0x020D0164 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG3ScrPtr + ldr r1, _020D01C0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D01AC + cmp r4, #0x1c + bls _020D01AC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D01AC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D01C0: .word GXi_DmaId + arm_func_end GX_LoadBG3Scr + + arm_func_start GXS_LoadBG3Scr +GXS_LoadBG3Scr: ; 0x020D01C4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG3ScrPtr + ldr r1, _020D0220 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D020C + cmp r4, #0x1c + bls _020D020C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy16 + ldmia sp!, {r4, r5, r6, pc} +_020D020C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy16 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0220: .word GXi_DmaId + arm_func_end GXS_LoadBG3Scr + + arm_func_start GX_LoadBG0Char +GX_LoadBG0Char: ; 0x020D0224 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG0CharPtr + ldr r1, _020D0280 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D026C + cmp r4, #0x30 + bls _020D026C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D026C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0280: .word GXi_DmaId + arm_func_end GX_LoadBG0Char + + arm_func_start GXS_LoadBG0Char +GXS_LoadBG0Char: ; 0x020D0284 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG0CharPtr + ldr r1, _020D02E0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D02CC + cmp r4, #0x30 + bls _020D02CC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D02CC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D02E0: .word GXi_DmaId + arm_func_end GXS_LoadBG0Char + + arm_func_start GX_LoadBG1Char +GX_LoadBG1Char: ; 0x020D02E4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG1CharPtr + ldr r1, _020D0340 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D032C + cmp r4, #0x30 + bls _020D032C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D032C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0340: .word GXi_DmaId + arm_func_end GX_LoadBG1Char + + arm_func_start GXS_LoadBG1Char +GXS_LoadBG1Char: ; 0x020D0344 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG1CharPtr + ldr r1, _020D03A0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D038C + cmp r4, #0x30 + bls _020D038C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D038C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D03A0: .word GXi_DmaId + arm_func_end GXS_LoadBG1Char + + arm_func_start GX_LoadBG2Char +GX_LoadBG2Char: ; 0x020D03A4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG2CharPtr + ldr r1, _020D0400 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D03EC + cmp r4, #0x30 + bls _020D03EC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D03EC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0400: .word GXi_DmaId + arm_func_end GX_LoadBG2Char + + arm_func_start GXS_LoadBG2Char +GXS_LoadBG2Char: ; 0x020D0404 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG2CharPtr + ldr r1, _020D0460 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D044C + cmp r4, #0x30 + bls _020D044C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D044C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0460: .word GXi_DmaId + arm_func_end GXS_LoadBG2Char + + arm_func_start GX_LoadBG3Char +GX_LoadBG3Char: ; 0x020D0464 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2_GetBG3CharPtr + ldr r1, _020D04C0 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D04AC + cmp r4, #0x30 + bls _020D04AC + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D04AC: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D04C0: .word GXi_DmaId + arm_func_end GX_LoadBG3Char + + arm_func_start GXS_LoadBG3Char +GXS_LoadBG3Char: ; 0x020D04C4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl G2S_GetBG3CharPtr + ldr r1, _020D0520 ; =GXi_DmaId + mov ip, r0 + ldr r0, [r1] + mvn r1, #0 + cmp r0, r1 + beq _020D050C + cmp r4, #0x30 + bls _020D050C + mov r1, r6 + mov r3, r4 + add r2, ip, r5 + bl MI_DmaCopy32 + ldmia sp!, {r4, r5, r6, pc} +_020D050C: + mov r0, r6 + mov r2, r4 + add r1, ip, r5 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0520: .word GXi_DmaId + arm_func_end GXS_LoadBG3Char + + arm_func_start GX_BeginLoadBGExtPltt +GX_BeginLoadBGExtPltt: ; 0x020D0524 + stmdb sp!, {r3, lr} + bl GX_ResetBankForBGExtPltt + ldr r1, _020D05B4 ; =sSubBGExtPltt + cmp r0, #0x20 + str r0, [r1, #0x14] + bgt _020D0558 + cmp r0, #0x20 + bge _020D059C + cmp r0, #0 + ldmleia sp!, {r3, pc} + cmp r0, #0x10 + beq _020D0574 + ldmia sp!, {r3, pc} +_020D0558: + cmp r0, #0x40 + bgt _020D0568 + beq _020D0588 + ldmia sp!, {r3, pc} +_020D0568: + cmp r0, #0x60 + beq _020D059C + ldmia sp!, {r3, pc} +_020D0574: + ldr r2, _020D05B8 ; =0x06880000 + mov r0, #0 + str r2, [r1, #0x10] + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} +_020D0588: + ldr r2, _020D05BC ; =0x06894000 + mov r0, #0x4000 + str r2, [r1, #0x10] + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} +_020D059C: + ldr r2, _020D05C0 ; =0x06890000 + ldr r0, _020D05B4 ; =sSubBGExtPltt + mov r1, #0 + str r2, [r0, #0x10] + str r1, [r0, #0xc] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D05B4: .word sSubBGExtPltt +_020D05B8: .word 0x06880000 +_020D05BC: .word 0x06894000 +_020D05C0: .word 0x06890000 + arm_func_end GX_BeginLoadBGExtPltt + + arm_func_start GX_LoadBGExtPltt +GX_LoadBGExtPltt: ; 0x020D05C4 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr ip, _020D062C ; =sSubBGExtPltt + ldr r3, _020D0630 ; =GXi_DmaId + ldr lr, [ip, #0x10] + ldr r4, [ip, #0xc] + add r5, lr, r1 + ldr lr, [r3] + mvn ip, #0 + mov r1, r0 + mov r3, r2 + cmp lr, ip + sub r4, r5, r4 + beq _020D061C + mov ip, #0 + str ip, [sp] + mov r0, lr + mov r2, r4 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} +_020D061C: + mov r1, r4 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D062C: .word sSubBGExtPltt +_020D0630: .word GXi_DmaId + arm_func_end GX_LoadBGExtPltt + + arm_func_start GX_EndLoadBGExtPltt +GX_EndLoadBGExtPltt: ; 0x020D0634 + stmdb sp!, {r3, lr} + ldr r0, _020D0674 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0650 + bl MI_WaitDma +_020D0650: + ldr r0, _020D0678 ; =sSubBGExtPltt + ldr r0, [r0, #0x14] + bl GX_SetBankForBGExtPltt + ldr r0, _020D0678 ; =sSubBGExtPltt + mov r1, #0 + str r1, [r0, #0x14] + str r1, [r0, #0x10] + str r1, [r0, #0xc] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0674: .word GXi_DmaId +_020D0678: .word sSubBGExtPltt + arm_func_end GX_EndLoadBGExtPltt + + arm_func_start GX_BeginLoadOBJExtPltt +GX_BeginLoadOBJExtPltt: ; 0x020D067C + stmdb sp!, {r3, lr} + bl GX_ResetBankForOBJExtPltt + ldr r1, _020D06B8 ; =sSubBGExtPltt + cmp r0, #0 + str r0, [r1, #8] + ldmeqia sp!, {r3, pc} + cmp r0, #0x20 + beq _020D06AC + cmp r0, #0x40 + ldreq r0, _020D06BC ; =0x06894000 + streq r0, [r1, #4] + ldmia sp!, {r3, pc} +_020D06AC: + ldr r0, _020D06C0 ; =0x06890000 + str r0, [r1, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D06B8: .word sSubBGExtPltt +_020D06BC: .word 0x06894000 +_020D06C0: .word 0x06890000 + arm_func_end GX_BeginLoadOBJExtPltt + + arm_func_start GX_LoadOBJExtPltt +GX_LoadOBJExtPltt: ; 0x020D06C4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r3, _020D0728 ; =GXi_DmaId + ldr lr, _020D072C ; =sSubBGExtPltt + ldr r4, [r3] + mvn ip, #0 + mov r6, r0 + mov r5, r1 + mov r3, r2 + cmp r4, ip + ldr lr, [lr, #4] + beq _020D0718 + mov ip, #0 + str ip, [sp] + mov r0, r4 + mov r1, r6 + add r2, lr, r5 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_020D0718: + add r1, lr, r5 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0728: .word GXi_DmaId +_020D072C: .word sSubBGExtPltt + arm_func_end GX_LoadOBJExtPltt + + arm_func_start GX_EndLoadOBJExtPltt +GX_EndLoadOBJExtPltt: ; 0x020D0730 + stmdb sp!, {r3, lr} + ldr r0, _020D076C ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D074C + bl MI_WaitDma +_020D074C: + ldr r0, _020D0770 ; =sSubBGExtPltt + ldr r0, [r0, #8] + bl GX_SetBankForOBJExtPltt + ldr r0, _020D0770 ; =sSubBGExtPltt + mov r1, #0 + str r1, [r0, #8] + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D076C: .word GXi_DmaId +_020D0770: .word sSubBGExtPltt + arm_func_end GX_EndLoadOBJExtPltt + + arm_func_start GXS_BeginLoadBGExtPltt +GXS_BeginLoadBGExtPltt: ; 0x020D0774 + stmdb sp!, {r3, lr} + bl GX_ResetBankForSubBGExtPltt + ldr r1, _020D0788 ; =sSubBGExtPltt + str r0, [r1] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0788: .word sSubBGExtPltt + arm_func_end GXS_BeginLoadBGExtPltt + + arm_func_start GXS_LoadBGExtPltt +GXS_LoadBGExtPltt: ; 0x020D078C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r3, _020D07EC ; =GXi_DmaId + mvn ip, #0 + ldr lr, [r3] + mov r4, r0 + mov r3, r2 + cmp lr, ip + beq _020D07D8 + add r2, r1, #0x98000 + mov ip, #0 + str ip, [sp] + mov r0, lr + mov r1, r4 + add r2, r2, #0x6800000 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r4, pc} +_020D07D8: + add r1, r1, #0x98000 + add r1, r1, #0x6800000 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D07EC: .word GXi_DmaId + arm_func_end GXS_LoadBGExtPltt + + arm_func_start GXS_EndLoadBGExtPltt +GXS_EndLoadBGExtPltt: ; 0x020D07F0 + stmdb sp!, {r3, lr} + ldr r0, _020D0828 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D080C + bl MI_WaitDma +_020D080C: + ldr r0, _020D082C ; =sSubBGExtPltt + ldr r0, [r0] + bl GX_SetBankForSubBGExtPltt + ldr r0, _020D082C ; =sSubBGExtPltt + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0828: .word GXi_DmaId +_020D082C: .word sSubBGExtPltt + arm_func_end GXS_EndLoadBGExtPltt + + arm_func_start GXS_BeginLoadOBJExtPltt +GXS_BeginLoadOBJExtPltt: ; 0x020D0830 + stmdb sp!, {r3, lr} + bl GX_ResetBankForSubOBJExtPltt + ldr r1, _020D0844 ; =sSubBGExtPltt + str r0, [r1, #0x18] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0844: .word sSubBGExtPltt + arm_func_end GXS_BeginLoadOBJExtPltt + + arm_func_start GXS_LoadOBJExtPltt +GXS_LoadOBJExtPltt: ; 0x020D0848 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r3, _020D08A8 ; =GXi_DmaId + mvn ip, #0 + ldr lr, [r3] + mov r4, r0 + mov r3, r2 + cmp lr, ip + beq _020D0894 + add r2, r1, #0x8a0000 + mov ip, #0 + str ip, [sp] + mov r0, lr + mov r1, r4 + add r2, r2, #0x6000000 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r4, pc} +_020D0894: + add r1, r1, #0x8a0000 + add r1, r1, #0x6000000 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D08A8: .word GXi_DmaId + arm_func_end GXS_LoadOBJExtPltt + + arm_func_start GXS_EndLoadOBJExtPltt +GXS_EndLoadOBJExtPltt: ; 0x020D08AC + stmdb sp!, {r3, lr} + ldr r0, _020D08E4 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D08C8 + bl MI_WaitDma +_020D08C8: + ldr r0, _020D08E8 ; =sSubBGExtPltt + ldr r0, [r0, #0x18] + bl GX_SetBankForSubOBJExtPltt + ldr r0, _020D08E8 ; =sSubBGExtPltt + mov r1, #0 + str r1, [r0, #0x18] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D08E4: .word GXi_DmaId +_020D08E8: .word sSubBGExtPltt + arm_func_end GXS_EndLoadOBJExtPltt diff --git a/lib/NitroSDK/asm/gx_load3d.s b/lib/NitroSDK/asm/gx_load3d.s new file mode 100644 index 00000000..e204e3c2 --- /dev/null +++ b/lib/NitroSDK/asm/gx_load3d.s @@ -0,0 +1,414 @@ + .include "asm/macros.inc" + .include "gx_load3d.inc" + .include "global.inc" + .public GXi_DmaId + .public GX_ResetBankForClearImage + + .bss + +sClrImg: ; 0x021E15F8 + .space 0x4 + +sTexLCDCBlk1: ; 0x021E15FC + .space 0x4 + +sTexPlttLCDCBlk: ; 0x021E1600 + .space 0x4 + +sTexPltt: ; 0x021E1604 + .space 0x4 + +sClrImgLCDCBlk: ; 0x021E1608 + .space 0x4 + +sTex: ; 0x021E160C + .space 0x4 + +sTexLCDCBlk2: ; 0x021E1610 + .space 0x4 + +sSzTexBlk1: ; 0x021E1614 + .space 0x4 + + .text + + arm_func_start GX_BeginLoadTex +GX_BeginLoadTex: ; 0x020D08EC + stmdb sp!, {r3, lr} + bl GX_ResetBankForTex + mov r1, #6 + mul lr, r0, r1 + ldr r2, _020D0938 ; =sTexStartAddrTable + ldr r1, _020D093C ; =sTexStartAddrTable + 2 + ldrh ip, [r2, lr] + ldr r2, _020D0940 ; =sTexStartAddrTable + 4 + ldrh r3, [r1, lr] + ldr r1, _020D0944 ; =sClrImg + ldrh r2, [r2, lr] + str r0, [r1, #0x14] + mov r0, ip, lsl #0xc + str r0, [r1, #4] + mov r0, r3, lsl #0xc + str r0, [r1, #0x18] + mov r0, r2, lsl #0xc + str r0, [r1, #0x1c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0938: .word sTexStartAddrTable +_020D093C: .word sTexStartAddrTable + 2 +_020D0940: .word sTexStartAddrTable + 4 +_020D0944: .word sClrImg + arm_func_end GX_BeginLoadTex + + arm_func_start GX_LoadTex +GX_LoadTex: ; 0x020D0948 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r3, _020D0A80 ; =sClrImg + mov r7, r0 + ldr r4, [r3, #0x18] + mov ip, r1 + cmp r4, #0 + ldreq r0, [r3, #4] + mov r6, r2 + addeq r2, r0, ip + beq _020D0A34 + ldr r2, [r3, #0x1c] + add r0, ip, r6 + cmp r0, r2 + ldrlo r0, [r3, #4] + addlo r2, r0, ip + blo _020D0A34 + cmp ip, r2 + addhs r0, r4, ip + subhs r2, r0, r2 + bhs _020D0A34 + ldr r0, _020D0A84 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + sub r5, r2, ip + cmp r0, r1 + ldr lr, [r3, #4] + beq _020D09D4 + cmp r5, #0x30 + bls _020D09D4 + mov r1, r7 + mov r3, r5 + add r2, lr, ip + bl MI_DmaCopy32 + b _020D09E4 +_020D09D4: + mov r0, r7 + mov r2, r5 + add r1, lr, ip + bl MIi_CpuCopy32 +_020D09E4: + ldr r0, _020D0A84 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0A1C + mov ip, #0 + str ip, [sp] + mov r2, r4 + add r1, r7, r5 + sub r3, r6, r5 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D0A1C: + mov r1, r4 + add r0, r7, r5 + sub r2, r6, r5 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D0A34: + ldr r0, _020D0A84 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0A68 + mov r4, #0 + str r4, [sp] + mov r1, r7 + mov r3, r6 + str r4, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D0A68: + mov r1, r2 + mov r0, r7 + mov r2, r6 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D0A80: .word sClrImg +_020D0A84: .word GXi_DmaId + arm_func_end GX_LoadTex + + arm_func_start GX_EndLoadTex +GX_EndLoadTex: ; 0x020D0A88 + stmdb sp!, {r3, lr} + ldr r0, _020D0ACC ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0AA4 + bl MI_WaitDma +_020D0AA4: + ldr r0, _020D0AD0 ; =sClrImg + ldr r0, [r0, #0x14] + bl GX_SetBankForTex + ldr r0, _020D0AD0 ; =sClrImg + mov r1, #0 + str r1, [r0, #0x1c] + str r1, [r0, #0x18] + str r1, [r0, #4] + str r1, [r0, #0x14] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0ACC: .word GXi_DmaId +_020D0AD0: .word sClrImg + arm_func_end GX_EndLoadTex + + arm_func_start GX_BeginLoadTexPltt +GX_BeginLoadTexPltt: ; 0x020D0AD4 + stmdb sp!, {r3, lr} + bl GX_ResetBankForTexPltt + mov r3, r0, asr #4 + ldr r1, _020D0B00 ; =sClrImg + ldr r2, _020D0B04 ; =sTexPlttStartAddrTable + mov r3, r3, lsl #1 + ldrh r2, [r2, r3] + str r0, [r1, #0xc] + mov r0, r2, lsl #0xc + str r0, [r1, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0B00: .word sClrImg +_020D0B04: .word sTexPlttStartAddrTable + arm_func_end GX_BeginLoadTexPltt + + arm_func_start GX_LoadTexPltt +GX_LoadTexPltt: ; 0x020D0B08 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r3, _020D0B6C ; =GXi_DmaId + ldr lr, _020D0B70 ; =sClrImg + ldr r4, [r3] + mvn ip, #0 + mov r6, r0 + mov r5, r1 + mov r3, r2 + cmp r4, ip + ldr lr, [lr, #8] + beq _020D0B5C + mov ip, #0 + str ip, [sp] + mov r0, r4 + mov r1, r6 + add r2, lr, r5 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} +_020D0B5C: + add r1, lr, r5 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D0B6C: .word GXi_DmaId +_020D0B70: .word sClrImg + arm_func_end GX_LoadTexPltt + + arm_func_start GX_EndLoadTexPltt +GX_EndLoadTexPltt: ; 0x020D0B74 + stmdb sp!, {r3, lr} + ldr r0, _020D0BB0 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0B90 + bl MI_WaitDma +_020D0B90: + ldr r0, _020D0BB4 ; =sClrImg + ldr r0, [r0, #0xc] + bl GX_SetBankForTexPltt + ldr r0, _020D0BB4 ; =sClrImg + mov r1, #0 + str r1, [r0, #0xc] + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0BB0: .word GXi_DmaId +_020D0BB4: .word sClrImg + arm_func_end GX_EndLoadTexPltt + + arm_func_start GX_BeginLoadClearImage +GX_BeginLoadClearImage: ; 0x020D0BB8 + stmdb sp!, {r3, lr} + bl GX_ResetBankForClearImage + ldr r1, _020D0C38 ; =sClrImg + cmp r0, #0xc + str r0, [r1] + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_020D0BD4: ; jump table + ldmia sp!, {r3, pc} ; case 0 + b _020D0C20 ; case 1 + b _020D0C08 ; case 2 + b _020D0C08 ; case 3 + b _020D0C2C ; case 4 + ldmia sp!, {r3, pc} ; case 5 + ldmia sp!, {r3, pc} ; case 6 + ldmia sp!, {r3, pc} ; case 7 + b _020D0C14 ; case 8 + ldmia sp!, {r3, pc} ; case 9 + ldmia sp!, {r3, pc} ; case 10 + ldmia sp!, {r3, pc} ; case 11 + b _020D0C14 ; case 12 +_020D0C08: + mov r0, #0x6800000 + str r0, [r1, #0x10] + ldmia sp!, {r3, pc} +_020D0C14: + ldr r0, _020D0C3C ; =0x06840000 + str r0, [r1, #0x10] + ldmia sp!, {r3, pc} +_020D0C20: + ldr r0, _020D0C40 ; =0x067E0000 + str r0, [r1, #0x10] + ldmia sp!, {r3, pc} +_020D0C2C: + ldr r0, _020D0C44 ; =0x06820000 + str r0, [r1, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0C38: .word sClrImg +_020D0C3C: .word 0x06840000 +_020D0C40: .word 0x067E0000 +_020D0C44: .word 0x06820000 + arm_func_end GX_BeginLoadClearImage + + arm_func_start GX_LoadClearImageColor +GX_LoadClearImageColor: ; 0x020D0C48 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _020D0CA8 ; =GXi_DmaId + ldr ip, _020D0CAC ; =sClrImg + ldr lr, [r2] + mvn r2, #0 + mov r4, r0 + mov r3, r1 + cmp lr, r2 + ldr r2, [ip, #0x10] + beq _020D0C94 + mov ip, #0 + str ip, [sp] + mov r0, lr + mov r1, r4 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r4, pc} +_020D0C94: + mov r1, r2 + mov r2, r3 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D0CA8: .word GXi_DmaId +_020D0CAC: .word sClrImg + arm_func_end GX_LoadClearImageColor + + arm_func_start GX_LoadClearImageDepth +GX_LoadClearImageDepth: ; 0x020D0CB0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr r2, _020D0D14 ; =GXi_DmaId + ldr ip, _020D0D18 ; =sClrImg + ldr lr, [r2] + mvn r2, #0 + mov r5, r0 + mov r3, r1 + cmp lr, r2 + ldr r4, [ip, #0x10] + beq _020D0D00 + mov ip, #0 + str ip, [sp] + mov r0, lr + mov r1, r5 + add r2, r4, #0x20000 + str ip, [sp, #4] + bl MI_DmaCopy32Async + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} +_020D0D00: + mov r2, r3 + add r1, r4, #0x20000 + bl MIi_CpuCopy32 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D0D14: .word GXi_DmaId +_020D0D18: .word sClrImg + arm_func_end GX_LoadClearImageDepth + + arm_func_start GX_EndLoadClearImage +GX_EndLoadClearImage: ; 0x020D0D1C + stmdb sp!, {r3, lr} + ldr r0, _020D0D58 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + beq _020D0D38 + bl MI_WaitDma +_020D0D38: + ldr r0, _020D0D5C ; =sClrImg + ldr r0, [r0] + bl GX_SetBankForClearImage + ldr r0, _020D0D5C ; =sClrImg + mov r1, #0 + str r1, [r0] + str r1, [r0, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D0D58: .word GXi_DmaId +_020D0D5C: .word sClrImg + arm_func_end GX_EndLoadClearImage + + .rodata + +sTexPlttStartAddrTable: ; 0x0210D5E0 + .short 0x0000 + .short 0x6880 + .short 0x6890 + .short 0x6880 + .short 0x6894 + .short 0x0000 + .short 0x6890 + .short 0x6880 + +sTexStartAddrTable: ; 0x0210D5F0 + .short 0x0000, 0x0000, 0x0000 + .short 0x6800, 0x0000, 0x0000 + .short 0x6820, 0x0000, 0x0000 + .short 0x6800, 0x0000, 0x0000 + .short 0x6840, 0x0000, 0x0000 + .short 0x6800, 0x6840, 0x0020 + .short 0x6820, 0x0000, 0x0000 + .short 0x6800, 0x0000, 0x0000 + .short 0x6860, 0x0000, 0x0000 + .short 0x6800, 0x6860, 0x0020 + .short 0x6820, 0x6860, 0x0020 + .short 0x6800, 0x6860, 0x0040 + .short 0x6840, 0x0000, 0x0000 + .short 0x6800, 0x6840, 0x0020 + .short 0x6820, 0x0000, 0x0000 + .short 0x6800, 0x0000, 0x0000 diff --git a/lib/NitroSDK/asm/gx_vramcnt.s b/lib/NitroSDK/asm/gx_vramcnt.s new file mode 100644 index 00000000..ee5e4196 --- /dev/null +++ b/lib/NitroSDK/asm/gx_vramcnt.s @@ -0,0 +1,1424 @@ + .include "asm/macros.inc" + .include "gx_vramcnt.inc" + .include "global.inc" + + .public gGXState + .public GXi_VRamLockId + + .text + + arm_func_start GX_VRAMCNT_SetLCDC_ +GX_VRAMCNT_SetLCDC_: ; 0x020CDB4C + tst r0, #1 + ldrne r1, _020CDBE0 ; =0x04000240 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #2 + ldrne r1, _020CDBE4 ; =0x04000241 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #4 + ldrne r1, _020CDBE8 ; =0x04000242 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #8 + ldrne r1, _020CDBEC ; =0x04000243 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #0x10 + ldrne r1, _020CDBF0 ; =0x04000244 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #0x20 + ldrne r1, _020CDBF4 ; =0x04000245 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #0x40 + ldrne r1, _020CDBF8 ; =0x04000246 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #0x80 + ldrne r1, _020CDBFC ; =0x04000248 + movne r2, #0x80 + strneb r2, [r1] + tst r0, #0x100 + ldrne r0, _020CDC00 ; =0x04000249 + movne r1, #0x80 + strneb r1, [r0] + bx lr + .align 2, 0 +_020CDBE0: .word 0x04000240 +_020CDBE4: .word 0x04000241 +_020CDBE8: .word 0x04000242 +_020CDBEC: .word 0x04000243 +_020CDBF0: .word 0x04000244 +_020CDBF4: .word 0x04000245 +_020CDBF8: .word 0x04000246 +_020CDBFC: .word 0x04000248 +_020CDC00: .word 0x04000249 + arm_func_end GX_VRAMCNT_SetLCDC_ + + arm_func_start GX_SetBankForBG +GX_SetBankForBG: ; 0x020CDC04 + stmdb sp!, {r3, lr} + ldr r1, _020CDE74 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #2] + cmp r0, #0x40 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #2] + bgt _020CDCDC + cmp r0, #0x40 + bge _020CDE58 + cmp r0, #0x20 + bgt _020CDCD0 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _020CDE64 +_020CDC4C: ; jump table + b _020CDE64 ; case 0 + b _020CDD78 ; case 1 + b _020CDD44 ; case 2 + b _020CDD6C ; case 3 + b _020CDD1C ; case 4 + b _020CDDB4 ; case 5 + b _020CDD38 ; case 6 + b _020CDD60 ; case 7 + b _020CDD00 ; case 8 + b _020CDDCC ; case 9 + b _020CDDE4 ; case 10 + b _020CDD88 ; case 11 + b _020CDD10 ; case 12 + b _020CDDA8 ; case 13 + b _020CDD2C ; case 14 + b _020CDD54 ; case 15 + b _020CDE14 ; case 16 + b _020CDE64 ; case 17 + b _020CDE64 ; case 18 + b _020CDE64 ; case 19 + b _020CDE64 ; case 20 + b _020CDE64 ; case 21 + b _020CDE64 ; case 22 + b _020CDE64 ; case 23 + b _020CDE64 ; case 24 + b _020CDE64 ; case 25 + b _020CDE64 ; case 26 + b _020CDE64 ; case 27 + b _020CDE64 ; case 28 + b _020CDE64 ; case 29 + b _020CDE64 ; case 30 + b _020CDE64 ; case 31 + b _020CDE48 ; case 32 +_020CDCD0: + cmp r0, #0x30 + beq _020CDE08 + b _020CDE64 +_020CDCDC: + cmp r0, #0x60 + bgt _020CDCF4 + bge _020CDE3C + cmp r0, #0x50 + beq _020CDE24 + b _020CDE64 +_020CDCF4: + cmp r0, #0x70 + beq _020CDDFC + b _020CDE64 +_020CDD00: + ldr r0, _020CDE78 ; =0x04000243 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDD10: + ldr r0, _020CDE78 ; =0x04000243 + mov r1, #0x89 + strb r1, [r0] +_020CDD1C: + ldr r0, _020CDE7C ; =0x04000242 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDD2C: + ldr r0, _020CDE78 ; =0x04000243 + mov r1, #0x91 + strb r1, [r0] +_020CDD38: + ldr r0, _020CDE7C ; =0x04000242 + mov r1, #0x89 + strb r1, [r0] +_020CDD44: + ldr r0, _020CDE80 ; =0x04000241 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDD54: + ldr r0, _020CDE78 ; =0x04000243 + mov r1, #0x99 + strb r1, [r0] +_020CDD60: + ldr r0, _020CDE7C ; =0x04000242 + mov r1, #0x91 + strb r1, [r0] +_020CDD6C: + ldr r0, _020CDE80 ; =0x04000241 + mov r1, #0x89 + strb r1, [r0] +_020CDD78: + ldr r0, _020CDE84 ; =0x04000240 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDD88: + ldr r1, _020CDE84 ; =0x04000240 + mov r0, #0x81 + strb r0, [r1] + mov r0, #0x89 + strb r0, [r1, #1] + mov r0, #0x91 + strb r0, [r1, #3] + b _020CDE64 +_020CDDA8: + ldr r0, _020CDE78 ; =0x04000243 + mov r1, #0x91 + strb r1, [r0] +_020CDDB4: + ldr r1, _020CDE84 ; =0x04000240 + mov r0, #0x81 + strb r0, [r1] + mov r0, #0x89 + strb r0, [r1, #2] + b _020CDE64 +_020CDDCC: + ldr r1, _020CDE84 ; =0x04000240 + mov r0, #0x81 + strb r0, [r1] + mov r0, #0x89 + strb r0, [r1, #3] + b _020CDE64 +_020CDDE4: + ldr r1, _020CDE80 ; =0x04000241 + mov r0, #0x81 + strb r0, [r1] + mov r0, #0x89 + strb r0, [r1, #2] + b _020CDE64 +_020CDDFC: + ldr r0, _020CDE88 ; =0x04000246 + mov r1, #0x99 + strb r1, [r0] +_020CDE08: + ldr r0, _020CDE8C ; =0x04000245 + mov r1, #0x91 + strb r1, [r0] +_020CDE14: + ldr r0, _020CDE90 ; =0x04000244 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDE24: + ldr r1, _020CDE88 ; =0x04000246 + mov r0, #0x91 + strb r0, [r1] + mov r0, #0x81 + strb r0, [r1, #-2] + b _020CDE64 +_020CDE3C: + ldr r0, _020CDE88 ; =0x04000246 + mov r1, #0x89 + strb r1, [r0] +_020CDE48: + ldr r0, _020CDE8C ; =0x04000245 + mov r1, #0x81 + strb r1, [r0] + b _020CDE64 +_020CDE58: + ldr r0, _020CDE88 ; =0x04000246 + mov r1, #0x81 + strb r1, [r0] +_020CDE64: + ldr r0, _020CDE74 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CDE74: .word gGXState +_020CDE78: .word 0x04000243 +_020CDE7C: .word 0x04000242 +_020CDE80: .word 0x04000241 +_020CDE84: .word 0x04000240 +_020CDE88: .word 0x04000246 +_020CDE8C: .word 0x04000245 +_020CDE90: .word 0x04000244 + arm_func_end GX_SetBankForBG + + arm_func_start GX_SetBankForOBJ +GX_SetBankForOBJ: ; 0x020CDE94 + stmdb sp!, {r3, lr} + ldr r1, _020CDFCC ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #4] + cmp r0, #0x30 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #4] + bgt _020CDEFC + cmp r0, #0x30 + bge _020CDF70 + cmp r0, #0x10 + bgt _020CDEF0 + bge _020CDF7C + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020CDFBC +_020CDEE0: ; jump table + b _020CDFBC ; case 0 + b _020CDF44 ; case 1 + b _020CDF54 ; case 2 + b _020CDF38 ; case 3 +_020CDEF0: + cmp r0, #0x20 + beq _020CDFB0 + b _020CDFBC +_020CDEFC: + cmp r0, #0x50 + bgt _020CDF1C + bge _020CDF8C + cmp r0, #0x40 + ldreq r0, _020CDFD0 ; =0x04000246 + moveq r1, #0x82 + streqb r1, [r0] + b _020CDFBC +_020CDF1C: + cmp r0, #0x60 + bgt _020CDF2C + beq _020CDFA4 + b _020CDFBC +_020CDF2C: + cmp r0, #0x70 + beq _020CDF64 + b _020CDFBC +_020CDF38: + ldr r0, _020CDFD4 ; =0x04000241 + mov r1, #0x8a + strb r1, [r0] +_020CDF44: + ldr r0, _020CDFD8 ; =0x04000240 + mov r1, #0x82 + strb r1, [r0] + b _020CDFBC +_020CDF54: + ldr r0, _020CDFD4 ; =0x04000241 + mov r1, #0x82 + strb r1, [r0] + b _020CDFBC +_020CDF64: + ldr r0, _020CDFD0 ; =0x04000246 + mov r1, #0x9a + strb r1, [r0] +_020CDF70: + ldr r0, _020CDFDC ; =0x04000245 + mov r1, #0x92 + strb r1, [r0] +_020CDF7C: + ldr r0, _020CDFE0 ; =0x04000244 + mov r1, #0x82 + strb r1, [r0] + b _020CDFBC +_020CDF8C: + ldr r1, _020CDFD0 ; =0x04000246 + mov r0, #0x92 + strb r0, [r1] + mov r0, #0x82 + strb r0, [r1, #-2] + b _020CDFBC +_020CDFA4: + ldr r0, _020CDFD0 ; =0x04000246 + mov r1, #0x8a + strb r1, [r0] +_020CDFB0: + ldr r0, _020CDFDC ; =0x04000245 + mov r1, #0x82 + strb r1, [r0] +_020CDFBC: + ldr r0, _020CDFCC ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CDFCC: .word gGXState +_020CDFD0: .word 0x04000246 +_020CDFD4: .word 0x04000241 +_020CDFD8: .word 0x04000240 +_020CDFDC: .word 0x04000245 +_020CDFE0: .word 0x04000244 + arm_func_end GX_SetBankForOBJ + + arm_func_start GX_SetBankForBGExtPltt +GX_SetBankForBGExtPltt: ; 0x020CDFE4 + stmdb sp!, {r3, lr} + ldr r1, _020CE0D8 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0xe] + cmp r0, #0x20 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0xe] + bgt _020CE034 + cmp r0, #0x20 + bge _020CE098 + cmp r0, #0 + bgt _020CE028 + beq _020CE0B8 + b _020CE0C8 +_020CE028: + cmp r0, #0x10 + beq _020CE050 + b _020CE0C8 +_020CE034: + cmp r0, #0x40 + bgt _020CE044 + beq _020CE06C + b _020CE0C8 +_020CE044: + cmp r0, #0x60 + beq _020CE08C + b _020CE0C8 +_020CE050: + mov r2, #0x4000000 + ldr r1, [r2] + mov r0, #0x84 + orr r1, r1, #0x40000000 + str r1, [r2] + strb r0, [r2, #0x244] + b _020CE0C8 +_020CE06C: + mov r2, #0x4000000 + ldr r1, [r2] + ldr r0, _020CE0DC ; =0x04000246 + orr r1, r1, #0x40000000 + str r1, [r2] + mov r1, #0x8c + strb r1, [r0] + b _020CE0C8 +_020CE08C: + ldr r0, _020CE0DC ; =0x04000246 + mov r1, #0x8c + strb r1, [r0] +_020CE098: + ldr r0, _020CE0E0 ; =0x04000245 + mov r1, #0x84 + strb r1, [r0] + mov r1, #0x4000000 + ldr r0, [r1] + orr r0, r0, #0x40000000 + str r0, [r1] + b _020CE0C8 +_020CE0B8: + mov r1, #0x4000000 + ldr r0, [r1] + bic r0, r0, #0x40000000 + str r0, [r1] +_020CE0C8: + ldr r0, _020CE0D8 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE0D8: .word gGXState +_020CE0DC: .word 0x04000246 +_020CE0E0: .word 0x04000245 + arm_func_end GX_SetBankForBGExtPltt + + arm_func_start GX_SetBankForOBJExtPltt +GX_SetBankForOBJExtPltt: ; 0x020CE0E4 + stmdb sp!, {r3, lr} + ldr r1, _020CE184 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0x10] + cmp r0, #0 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0x10] + beq _020CE164 + cmp r0, #0x20 + beq _020CE124 + cmp r0, #0x40 + beq _020CE144 + b _020CE174 +_020CE124: + mov r2, #0x4000000 + ldr r1, [r2] + ldr r0, _020CE188 ; =0x04000245 + orr r1, r1, #0x80000000 + str r1, [r2] + mov r1, #0x85 + strb r1, [r0] + b _020CE174 +_020CE144: + mov r2, #0x4000000 + ldr r1, [r2] + ldr r0, _020CE18C ; =0x04000246 + orr r1, r1, #0x80000000 + str r1, [r2] + mov r1, #0x85 + strb r1, [r0] + b _020CE174 +_020CE164: + mov r1, #0x4000000 + ldr r0, [r1] + bic r0, r0, #0x80000000 + str r0, [r1] +_020CE174: + ldr r0, _020CE184 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE184: .word gGXState +_020CE188: .word 0x04000245 +_020CE18C: .word 0x04000246 + arm_func_end GX_SetBankForOBJExtPltt + + arm_func_start GX_SetBankForTex +GX_SetBankForTex: ; 0x020CE190 + stmdb sp!, {r3, lr} + ldr r1, _020CE34C ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #8] + cmp r0, #0 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #8] + ldr r2, _020CE350 ; =0x04000060 + bne _020CE1D4 + ldrh r1, [r2] + ldr r0, _020CE354 ; =0x0000CFFE + and r0, r1, r0 + strh r0, [r2] + b _020CE33C +_020CE1D4: + ldrh r1, [r2] + cmp r0, #0xf + bic r1, r1, #0x3000 + orr r1, r1, #1 + strh r1, [r2] + addls pc, pc, r0, lsl #2 + b _020CE33C +_020CE1F0: ; jump table + b _020CE33C ; case 0 + b _020CE330 ; case 1 + b _020CE2FC ; case 2 + b _020CE324 ; case 3 + b _020CE2D4 ; case 4 + b _020CE230 ; case 5 + b _020CE2F0 ; case 6 + b _020CE318 ; case 7 + b _020CE2B8 ; case 8 + b _020CE248 ; case 9 + b _020CE260 ; case 10 + b _020CE278 ; case 11 + b _020CE2C8 ; case 12 + b _020CE298 ; case 13 + b _020CE2E4 ; case 14 + b _020CE30C ; case 15 +_020CE230: + mov r1, #0x83 + ldr r0, _020CE358 ; =0x04000242 + strb r1, [r2, #0x1e0] + mov r1, #0x8b + strb r1, [r0] + b _020CE33C +_020CE248: + mov r1, #0x83 + ldr r0, _020CE35C ; =0x04000243 + strb r1, [r2, #0x1e0] + mov r1, #0x8b + strb r1, [r0] + b _020CE33C +_020CE260: + ldr r1, _020CE360 ; =0x04000241 + mov r0, #0x83 + strb r0, [r1] + mov r0, #0x8b + strb r0, [r1, #2] + b _020CE33C +_020CE278: + mov r0, #0x83 + ldr r1, _020CE360 ; =0x04000241 + strb r0, [r2, #0x1e0] + mov r0, #0x8b + strb r0, [r1] + mov r0, #0x93 + strb r0, [r1, #2] + b _020CE33C +_020CE298: + mov r0, #0x83 + ldr r1, _020CE358 ; =0x04000242 + strb r0, [r2, #0x1e0] + mov r0, #0x8b + strb r0, [r1] + mov r0, #0x93 + strb r0, [r1, #1] + b _020CE33C +_020CE2B8: + ldr r0, _020CE35C ; =0x04000243 + mov r1, #0x83 + strb r1, [r0] + b _020CE33C +_020CE2C8: + ldr r0, _020CE35C ; =0x04000243 + mov r1, #0x8b + strb r1, [r0] +_020CE2D4: + ldr r0, _020CE358 ; =0x04000242 + mov r1, #0x83 + strb r1, [r0] + b _020CE33C +_020CE2E4: + ldr r0, _020CE35C ; =0x04000243 + mov r1, #0x93 + strb r1, [r0] +_020CE2F0: + ldr r0, _020CE358 ; =0x04000242 + mov r1, #0x8b + strb r1, [r0] +_020CE2FC: + ldr r0, _020CE360 ; =0x04000241 + mov r1, #0x83 + strb r1, [r0] + b _020CE33C +_020CE30C: + ldr r0, _020CE35C ; =0x04000243 + mov r1, #0x9b + strb r1, [r0] +_020CE318: + ldr r0, _020CE358 ; =0x04000242 + mov r1, #0x93 + strb r1, [r0] +_020CE324: + ldr r0, _020CE360 ; =0x04000241 + mov r1, #0x8b + strb r1, [r0] +_020CE330: + ldr r0, _020CE364 ; =0x04000240 + mov r1, #0x83 + strb r1, [r0] +_020CE33C: + ldr r0, _020CE34C ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE34C: .word gGXState +_020CE350: .word 0x04000060 +_020CE354: .word 0x0000CFFE +_020CE358: .word 0x04000242 +_020CE35C: .word 0x04000243 +_020CE360: .word 0x04000241 +_020CE364: .word 0x04000240 + arm_func_end GX_SetBankForTex + + arm_func_start GX_SetBankForTexPltt +GX_SetBankForTexPltt: ; 0x020CE368 + stmdb sp!, {r3, lr} + ldr r1, _020CE440 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0xa] + cmp r0, #0x30 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0xa] + bgt _020CE3BC + cmp r0, #0x30 + bge _020CE418 + cmp r0, #0x10 + bgt _020CE3B0 + bge _020CE424 + cmp r0, #0 + b _020CE430 +_020CE3B0: + cmp r0, #0x20 + beq _020CE3EC + b _020CE430 +_020CE3BC: + cmp r0, #0x60 + bgt _020CE3D4 + bge _020CE3E0 + cmp r0, #0x40 + beq _020CE3FC + b _020CE430 +_020CE3D4: + cmp r0, #0x70 + beq _020CE40C + b _020CE430 +_020CE3E0: + ldr r0, _020CE444 ; =0x04000246 + mov r1, #0x8b + strb r1, [r0] +_020CE3EC: + ldr r0, _020CE448 ; =0x04000245 + mov r1, #0x83 + strb r1, [r0] + b _020CE430 +_020CE3FC: + ldr r0, _020CE444 ; =0x04000246 + mov r1, #0x83 + strb r1, [r0] + b _020CE430 +_020CE40C: + ldr r0, _020CE444 ; =0x04000246 + mov r1, #0x9b + strb r1, [r0] +_020CE418: + ldr r0, _020CE448 ; =0x04000245 + mov r1, #0x93 + strb r1, [r0] +_020CE424: + ldr r0, _020CE44C ; =0x04000244 + mov r1, #0x83 + strb r1, [r0] +_020CE430: + ldr r0, _020CE440 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE440: .word gGXState +_020CE444: .word 0x04000246 +_020CE448: .word 0x04000245 +_020CE44C: .word 0x04000244 + arm_func_end GX_SetBankForTexPltt + + arm_func_start GX_SetBankForClearImage +GX_SetBankForClearImage: ; 0x020CE450 + stmdb sp!, {r3, lr} + ldr r1, _020CE56C ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0xc] + cmp r0, #0xc + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0xc] + addls pc, pc, r0, lsl #2 + b _020CE55C +_020CE480: ; jump table + b _020CE50C ; case 0 + b _020CE520 ; case 1 + b _020CE4C0 ; case 2 + b _020CE4B4 ; case 3 + b _020CE540 ; case 4 + b _020CE55C ; case 5 + b _020CE55C ; case 6 + b _020CE55C ; case 7 + b _020CE4EC ; case 8 + b _020CE55C ; case 9 + b _020CE55C ; case 10 + b _020CE55C ; case 11 + b _020CE4E0 ; case 12 +_020CE4B4: + ldr r0, _020CE570 ; =0x04000240 + mov r1, #0x93 + strb r1, [r0] +_020CE4C0: + ldr r0, _020CE574 ; =0x04000241 + mov r2, #0x9b + ldr r1, _020CE578 ; =0x04000060 + strb r2, [r0] + ldrh r0, [r1] + orr r0, r0, #0x4000 + strh r0, [r1] + b _020CE55C +_020CE4E0: + ldr r0, _020CE57C ; =0x04000242 + mov r1, #0x93 + strb r1, [r0] +_020CE4EC: + ldr r0, _020CE580 ; =0x04000243 + mov r2, #0x9b + ldr r1, _020CE578 ; =0x04000060 + strb r2, [r0] + ldrh r0, [r1] + orr r0, r0, #0x4000 + strh r0, [r1] + b _020CE55C +_020CE50C: + ldr r1, _020CE578 ; =0x04000060 + ldrh r0, [r1] + bic r0, r0, #0x4000 + strh r0, [r1] + b _020CE55C +_020CE520: + ldr r0, _020CE570 ; =0x04000240 + mov r1, #0x9b + strb r1, [r0] + sub r1, r0, #0x1e0 + ldrh r0, [r1] + orr r0, r0, #0x4000 + strh r0, [r1] + b _020CE55C +_020CE540: + ldr r0, _020CE57C ; =0x04000242 + mov r2, #0x9b + ldr r1, _020CE578 ; =0x04000060 + strb r2, [r0] + ldrh r0, [r1] + orr r0, r0, #0x4000 + strh r0, [r1] +_020CE55C: + ldr r0, _020CE56C ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE56C: .word gGXState +_020CE570: .word 0x04000240 +_020CE574: .word 0x04000241 +_020CE578: .word 0x04000060 +_020CE57C: .word 0x04000242 +_020CE580: .word 0x04000243 + arm_func_end GX_SetBankForClearImage + + arm_func_start GX_SetBankForARM7 +GX_SetBankForARM7: ; 0x020CE584 + stmdb sp!, {r3, lr} + ldr r1, _020CE624 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #6] + cmp r0, #8 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #6] + bgt _020CE5D8 + cmp r0, #8 + bge _020CE608 + cmp r0, #4 + bgt _020CE614 + cmp r0, #0 + blt _020CE614 + beq _020CE614 + cmp r0, #4 + beq _020CE5F8 + b _020CE614 +_020CE5D8: + cmp r0, #0xc + bne _020CE614 + ldr r1, _020CE628 ; =0x04000243 + mov r0, #0x8a + strb r0, [r1] + mov r0, #0x82 + strb r0, [r1, #-1] + b _020CE614 +_020CE5F8: + ldr r0, _020CE62C ; =0x04000242 + mov r1, #0x82 + strb r1, [r0] + b _020CE614 +_020CE608: + ldr r0, _020CE628 ; =0x04000243 + mov r1, #0x82 + strb r1, [r0] +_020CE614: + ldr r0, _020CE624 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE624: .word gGXState +_020CE628: .word 0x04000243 +_020CE62C: .word 0x04000242 + arm_func_end GX_SetBankForARM7 + + arm_func_start GX_SetBankForLCDC +GX_SetBankForLCDC: ; 0x020CE630 + ldr r1, _020CE648 ; =gGXState + ldr ip, _020CE64C ; =GX_VRAMCNT_SetLCDC_ + ldrh r2, [r1] + orr r2, r2, r0 + strh r2, [r1] + bx ip + .align 2, 0 +_020CE648: .word gGXState +_020CE64C: .word GX_VRAMCNT_SetLCDC_ + arm_func_end GX_SetBankForLCDC + + arm_func_start GX_SetBankForSubBG +GX_SetBankForSubBG: ; 0x020CE650 + stmdb sp!, {r3, lr} + ldr r1, _020CE6E8 ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0x12] + cmp r0, #0x80 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0x12] + bgt _020CE6A4 + cmp r0, #0x80 + bge _020CE6CC + cmp r0, #4 + bgt _020CE6D8 + cmp r0, #0 + blt _020CE6D8 + beq _020CE6D8 + cmp r0, #4 + beq _020CE6B0 + b _020CE6D8 +_020CE6A4: + cmp r0, #0x180 + beq _020CE6C0 + b _020CE6D8 +_020CE6B0: + ldr r0, _020CE6EC ; =0x04000242 + mov r1, #0x84 + strb r1, [r0] + b _020CE6D8 +_020CE6C0: + ldr r0, _020CE6F0 ; =0x04000249 + mov r1, #0x81 + strb r1, [r0] +_020CE6CC: + ldr r0, _020CE6F4 ; =0x04000248 + mov r1, #0x81 + strb r1, [r0] +_020CE6D8: + ldr r0, _020CE6E8 ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE6E8: .word gGXState +_020CE6EC: .word 0x04000242 +_020CE6F0: .word 0x04000249 +_020CE6F4: .word 0x04000248 + arm_func_end GX_SetBankForSubBG + + arm_func_start GX_SetBankForSubOBJ +GX_SetBankForSubOBJ: ; 0x020CE6F8 + stmdb sp!, {r3, lr} + ldr r1, _020CE75C ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0x14] + cmp r0, #0 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0x14] + beq _020CE74C + cmp r0, #8 + beq _020CE740 + cmp r0, #0x100 + ldreq r0, _020CE760 ; =0x04000249 + moveq r1, #0x82 + streqb r1, [r0] + b _020CE74C +_020CE740: + ldr r0, _020CE764 ; =0x04000243 + mov r1, #0x84 + strb r1, [r0] +_020CE74C: + ldr r0, _020CE75C ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE75C: .word gGXState +_020CE760: .word 0x04000249 +_020CE764: .word 0x04000243 + arm_func_end GX_SetBankForSubOBJ + + arm_func_start GX_SetBankForSubBGExtPltt +GX_SetBankForSubBGExtPltt: ; 0x020CE768 + stmdb sp!, {r3, lr} + ldr r1, _020CE7DC ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0x16] + cmp r0, #0 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0x16] + beq _020CE7BC + cmp r0, #0x80 + bne _020CE7CC + ldr r3, _020CE7E0 ; =0x04001000 + ldr r0, _020CE7E4 ; =0x04000248 + ldr r2, [r3] + mov r1, #0x82 + orr r2, r2, #0x40000000 + str r2, [r3] + strb r1, [r0] + b _020CE7CC +_020CE7BC: + ldr r1, _020CE7E0 ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x40000000 + str r0, [r1] +_020CE7CC: + ldr r0, _020CE7DC ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE7DC: .word gGXState +_020CE7E0: .word 0x04001000 +_020CE7E4: .word 0x04000248 + arm_func_end GX_SetBankForSubBGExtPltt + + arm_func_start GX_SetBankForSubOBJExtPltt +GX_SetBankForSubOBJExtPltt: ; 0x020CE7E8 + stmdb sp!, {r3, lr} + ldr r1, _020CE85C ; =gGXState + mvn ip, r0 + ldrh r3, [r1] + ldrh r2, [r1, #0x18] + cmp r0, #0 + orr r2, r3, r2 + and r2, ip, r2 + strh r2, [r1] + strh r0, [r1, #0x18] + beq _020CE83C + cmp r0, #0x100 + bne _020CE84C + ldr r3, _020CE860 ; =0x04001000 + ldr r0, _020CE864 ; =0x04000249 + ldr r2, [r3] + mov r1, #0x83 + orr r2, r2, #0x80000000 + str r2, [r3] + strb r1, [r0] + b _020CE84C +_020CE83C: + ldr r1, _020CE860 ; =0x04001000 + ldr r0, [r1] + bic r0, r0, #0x80000000 + str r0, [r1] +_020CE84C: + ldr r0, _020CE85C ; =gGXState + ldrh r0, [r0] + bl GX_VRAMCNT_SetLCDC_ + ldmia sp!, {r3, pc} + .align 2, 0 +_020CE85C: .word gGXState +_020CE860: .word 0x04001000 +_020CE864: .word 0x04000249 + arm_func_end GX_SetBankForSubOBJExtPltt + + arm_func_start resetBankForX_ +resetBankForX_: ; 0x020CE868 + stmdb sp!, {r4, lr} + ldrh r4, [r0] + mov r2, #0 + ldr r1, _020CE898 ; =gGXState + strh r2, [r0] + ldrh r2, [r1] + mov r0, r4 + orr r2, r2, r4 + strh r2, [r1] + bl GX_VRAMCNT_SetLCDC_ + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CE898: .word gGXState + arm_func_end resetBankForX_ + + arm_func_start GX_ResetBankForBG +GX_ResetBankForBG: ; 0x020CE89C + ldr ip, _020CE8A8 ; =resetBankForX_ + ldr r0, _020CE8AC ; =gGXState + 0x02 + bx ip + .align 2, 0 +_020CE8A8: .word resetBankForX_ +_020CE8AC: .word gGXState + 0x02 + arm_func_end GX_ResetBankForBG + + arm_func_start GX_ResetBankForOBJ +GX_ResetBankForOBJ: ; 0x020CE8B0 + ldr ip, _020CE8BC ; =resetBankForX_ + ldr r0, _020CE8C0 ; =gGXState + 0x04 + bx ip + .align 2, 0 +_020CE8BC: .word resetBankForX_ +_020CE8C0: .word gGXState + 0x04 + arm_func_end GX_ResetBankForOBJ + + arm_func_start GX_ResetBankForBGExtPltt +GX_ResetBankForBGExtPltt: ; 0x020CE8C4 + mov r2, #0x4000000 + ldr r1, [r2] + ldr ip, _020CE8E0 ; =resetBankForX_ + bic r1, r1, #0x40000000 + ldr r0, _020CE8E4 ; =gGXState + 0x0E + str r1, [r2] + bx ip + .align 2, 0 +_020CE8E0: .word resetBankForX_ +_020CE8E4: .word gGXState + 0x0E + arm_func_end GX_ResetBankForBGExtPltt + + arm_func_start GX_ResetBankForOBJExtPltt +GX_ResetBankForOBJExtPltt: ; 0x020CE8E8 + mov r2, #0x4000000 + ldr r1, [r2] + ldr ip, _020CE904 ; =resetBankForX_ + bic r1, r1, #0x80000000 + ldr r0, _020CE908 ; =gGXState + 0x10 + str r1, [r2] + bx ip + .align 2, 0 +_020CE904: .word resetBankForX_ +_020CE908: .word gGXState + 0x10 + arm_func_end GX_ResetBankForOBJExtPltt + + arm_func_start GX_ResetBankForTex +GX_ResetBankForTex: ; 0x020CE90C + ldr ip, _020CE918 ; =resetBankForX_ + ldr r0, _020CE91C ; =gGXState + 0x08 + bx ip + .align 2, 0 +_020CE918: .word resetBankForX_ +_020CE91C: .word gGXState + 0x08 + arm_func_end GX_ResetBankForTex + + arm_func_start GX_ResetBankForTexPltt +GX_ResetBankForTexPltt: ; 0x020CE920 + ldr ip, _020CE92C ; =resetBankForX_ + ldr r0, _020CE930 ; =gGXState + 0x0A + bx ip + .align 2, 0 +_020CE92C: .word resetBankForX_ +_020CE930: .word gGXState + 0x0A + arm_func_end GX_ResetBankForTexPltt + + arm_func_start GX_ResetBankForClearImage +GX_ResetBankForClearImage: ; 0x020CE934 + ldr ip, _020CE940 ; =resetBankForX_ + ldr r0, _020CE944 ; =gGXState + 0x0C + bx ip + .align 2, 0 +_020CE940: .word resetBankForX_ +_020CE944: .word gGXState + 0x0C + arm_func_end GX_ResetBankForClearImage + + arm_func_start GX_ResetBankForSubBG +GX_ResetBankForSubBG: ; 0x020CE948 + ldr ip, _020CE954 ; =resetBankForX_ + ldr r0, _020CE958 ; =gGXState + 0x12 + bx ip + .align 2, 0 +_020CE954: .word resetBankForX_ +_020CE958: .word gGXState + 0x12 + arm_func_end GX_ResetBankForSubBG + + arm_func_start GX_ResetBankForSubOBJ +GX_ResetBankForSubOBJ: ; 0x020CE95C + ldr ip, _020CE968 ; =resetBankForX_ + ldr r0, _020CE96C ; =gGXState + 0x14 + bx ip + .align 2, 0 +_020CE968: .word resetBankForX_ +_020CE96C: .word gGXState + 0x14 + arm_func_end GX_ResetBankForSubOBJ + + arm_func_start GX_ResetBankForSubBGExtPltt +GX_ResetBankForSubBGExtPltt: ; 0x020CE970 + ldr r2, _020CE98C ; =0x04001000 + ldr ip, _020CE990 ; =resetBankForX_ + ldr r1, [r2] + ldr r0, _020CE994 ; =gGXState + 0x16 + bic r1, r1, #0x40000000 + str r1, [r2] + bx ip + .align 2, 0 +_020CE98C: .word 0x04001000 +_020CE990: .word resetBankForX_ +_020CE994: .word gGXState + 0x16 + arm_func_end GX_ResetBankForSubBGExtPltt + + arm_func_start GX_ResetBankForSubOBJExtPltt +GX_ResetBankForSubOBJExtPltt: ; 0x020CE998 + ldr r2, _020CE9B4 ; =0x04001000 + ldr ip, _020CE9B8 ; =resetBankForX_ + ldr r1, [r2] + ldr r0, _020CE9BC ; =gGXState + 0x18 + bic r1, r1, #0x80000000 + str r1, [r2] + bx ip + .align 2, 0 +_020CE9B4: .word 0x04001000 +_020CE9B8: .word resetBankForX_ +_020CE9BC: .word gGXState + 0x18 + arm_func_end GX_ResetBankForSubOBJExtPltt + + arm_func_start disableBankForX_ +disableBankForX_: ; 0x020CE9C0 + stmdb sp!, {r4, lr} + ldrh r4, [r0] + mov r1, #0 + strh r1, [r0] + tst r4, #1 + ldrne r0, _020CEA78 ; =0x04000240 + strneb r1, [r0] + tst r4, #2 + ldrne r0, _020CEA7C ; =0x04000241 + movne r1, #0 + strneb r1, [r0] + tst r4, #4 + ldrne r0, _020CEA80 ; =0x04000242 + movne r1, #0 + strneb r1, [r0] + tst r4, #8 + ldrne r0, _020CEA84 ; =0x04000243 + movne r1, #0 + strneb r1, [r0] + tst r4, #0x10 + ldrne r0, _020CEA88 ; =0x04000244 + movne r1, #0 + strneb r1, [r0] + tst r4, #0x20 + ldrne r0, _020CEA8C ; =0x04000245 + movne r1, #0 + strneb r1, [r0] + tst r4, #0x40 + ldrne r0, _020CEA90 ; =0x04000246 + movne r1, #0 + strneb r1, [r0] + tst r4, #0x80 + ldrne r0, _020CEA94 ; =0x04000248 + movne r1, #0 + strneb r1, [r0] + tst r4, #0x100 + ldrne r0, _020CEA98 ; =0x04000249 + movne r1, #0 + strneb r1, [r0] + ldr r1, _020CEA9C ; =GXi_VRamLockId + mov r0, r4, lsl #0x10 + ldrh r1, [r1] + mov r0, r0, lsr #0x10 + bl OSi_UnlockVram + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020CEA78: .word 0x04000240 +_020CEA7C: .word 0x04000241 +_020CEA80: .word 0x04000242 +_020CEA84: .word 0x04000243 +_020CEA88: .word 0x04000244 +_020CEA8C: .word 0x04000245 +_020CEA90: .word 0x04000246 +_020CEA94: .word 0x04000248 +_020CEA98: .word 0x04000249 +_020CEA9C: .word GXi_VRamLockId + arm_func_end disableBankForX_ + + arm_func_start GX_DisableBankForBG +GX_DisableBankForBG: ; 0x020CEAA0 + ldr ip, _020CEAAC ; =disableBankForX_ + ldr r0, _020CEAB0 ; =gGXState + 0x02 + bx ip + .align 2, 0 +_020CEAAC: .word disableBankForX_ +_020CEAB0: .word gGXState + 0x02 + arm_func_end GX_DisableBankForBG + + arm_func_start GX_DisableBankForOBJ +GX_DisableBankForOBJ: ; 0x020CEAB4 + ldr ip, _020CEAC0 ; =disableBankForX_ + ldr r0, _020CEAC4 ; =gGXState + 0x04 + bx ip + .align 2, 0 +_020CEAC0: .word disableBankForX_ +_020CEAC4: .word gGXState + 0x04 + arm_func_end GX_DisableBankForOBJ + + arm_func_start GX_DisableBankForBGExtPltt +GX_DisableBankForBGExtPltt: ; 0x020CEAC8 + mov r2, #0x4000000 + ldr r1, [r2] + ldr ip, _020CEAE4 ; =disableBankForX_ + bic r1, r1, #0x40000000 + ldr r0, _020CEAE8 ; =gGXState + 0x0E + str r1, [r2] + bx ip + .align 2, 0 +_020CEAE4: .word disableBankForX_ +_020CEAE8: .word gGXState + 0x0E + arm_func_end GX_DisableBankForBGExtPltt + + arm_func_start GX_DisableBankForOBJExtPltt +GX_DisableBankForOBJExtPltt: ; 0x020CEAEC + mov r2, #0x4000000 + ldr r1, [r2] + ldr ip, _020CEB08 ; =disableBankForX_ + bic r1, r1, #0x80000000 + ldr r0, _020CEB0C ; =gGXState + 0x10 + str r1, [r2] + bx ip + .align 2, 0 +_020CEB08: .word disableBankForX_ +_020CEB0C: .word gGXState + 0x10 + arm_func_end GX_DisableBankForOBJExtPltt + + arm_func_start GX_DisableBankForTex +GX_DisableBankForTex: ; 0x020CEB10 + ldr ip, _020CEB1C ; =disableBankForX_ + ldr r0, _020CEB20 ; =gGXState + 0x08 + bx ip + .align 2, 0 +_020CEB1C: .word disableBankForX_ +_020CEB20: .word gGXState + 0x08 + arm_func_end GX_DisableBankForTex + + arm_func_start GX_DisableBankForTexPltt +GX_DisableBankForTexPltt: ; 0x020CEB24 + ldr ip, _020CEB30 ; =disableBankForX_ + ldr r0, _020CEB34 ; =gGXState + 0x0A + bx ip + .align 2, 0 +_020CEB30: .word disableBankForX_ +_020CEB34: .word gGXState + 0x0A + arm_func_end GX_DisableBankForTexPltt + + arm_func_start GX_DisableBankForClearImage +GX_DisableBankForClearImage: ; 0x020CEB38 + ldr ip, _020CEB44 ; =disableBankForX_ + ldr r0, _020CEB48 ; =gGXState + 0x0C + bx ip + .align 2, 0 +_020CEB44: .word disableBankForX_ +_020CEB48: .word gGXState + 0x0C + arm_func_end GX_DisableBankForClearImage + + arm_func_start GX_DisableBankForARM7 +GX_DisableBankForARM7: ; 0x020CEB4C + ldr ip, _020CEB58 ; =disableBankForX_ + ldr r0, _020CEB5C ; =gGXState + 0x06 + bx ip + .align 2, 0 +_020CEB58: .word disableBankForX_ +_020CEB5C: .word gGXState + 0x06 + arm_func_end GX_DisableBankForARM7 + + arm_func_start GX_DisableBankForLCDC +GX_DisableBankForLCDC: ; 0x020CEB60 + ldr ip, _020CEB6C ; =disableBankForX_ + ldr r0, _020CEB70 ; =gGXState + bx ip + .align 2, 0 +_020CEB6C: .word disableBankForX_ +_020CEB70: .word gGXState + arm_func_end GX_DisableBankForLCDC + + arm_func_start GX_DisableBankForSubBG +GX_DisableBankForSubBG: ; 0x020CEB74 + ldr ip, _020CEB80 ; =disableBankForX_ + ldr r0, _020CEB84 ; =gGXState + 0x12 + bx ip + .align 2, 0 +_020CEB80: .word disableBankForX_ +_020CEB84: .word gGXState + 0x12 + arm_func_end GX_DisableBankForSubBG + + arm_func_start GX_DisableBankForSubOBJ +GX_DisableBankForSubOBJ: ; 0x020CEB88 + ldr ip, _020CEB94 ; =disableBankForX_ + ldr r0, _020CEB98 ; =gGXState + 0x14 + bx ip + .align 2, 0 +_020CEB94: .word disableBankForX_ +_020CEB98: .word gGXState + 0x14 + arm_func_end GX_DisableBankForSubOBJ + + arm_func_start GX_DisableBankForSubBGExtPltt +GX_DisableBankForSubBGExtPltt: ; 0x020CEB9C + ldr r2, _020CEBB8 ; =0x04001000 + ldr ip, _020CEBBC ; =disableBankForX_ + ldr r1, [r2] + ldr r0, _020CEBC0 ; =gGXState + 0x16 + bic r1, r1, #0x40000000 + str r1, [r2] + bx ip + .align 2, 0 +_020CEBB8: .word 0x04001000 +_020CEBBC: .word disableBankForX_ +_020CEBC0: .word gGXState + 0x16 + arm_func_end GX_DisableBankForSubBGExtPltt + + arm_func_start GX_DisableBankForSubOBJExtPltt +GX_DisableBankForSubOBJExtPltt: ; 0x020CEBC4 + ldr r2, _020CEBE0 ; =0x04001000 + ldr ip, _020CEBE4 ; =disableBankForX_ + ldr r1, [r2] + ldr r0, _020CEBE8 ; =gGXState + 0x18 + bic r1, r1, #0x80000000 + str r1, [r2] + bx ip + .align 2, 0 +_020CEBE0: .word 0x04001000 +_020CEBE4: .word disableBankForX_ +_020CEBE8: .word gGXState + 0x18 + arm_func_end GX_DisableBankForSubOBJExtPltt + + arm_func_start GX_GetBankForOBJ +GX_GetBankForOBJ: ; 0x020CEBEC + ldr r0, _020CEBF8 ; =gGXState + ldrh r0, [r0, #4] + bx lr + .align 2, 0 +_020CEBF8: .word gGXState + arm_func_end GX_GetBankForOBJ + + arm_func_start GX_GetBankForOBJExtPltt +GX_GetBankForOBJExtPltt: ; 0x020CEBFC + ldr r0, _020CEC08 ; =gGXState + ldrh r0, [r0, #0x10] + bx lr + .align 2, 0 +_020CEC08: .word gGXState + arm_func_end GX_GetBankForOBJExtPltt + + arm_func_start GX_GetBankForLCDC +GX_GetBankForLCDC: ; 0x020CEC0C + ldr r0, _020CEC18 ; =gGXState + ldrh r0, [r0] + bx lr + .align 2, 0 +_020CEC18: .word gGXState + arm_func_end GX_GetBankForLCDC + + arm_func_start GX_GetBankForSubOBJ +GX_GetBankForSubOBJ: ; 0x020CEC1C + ldr r0, _020CEC28 ; =gGXState + ldrh r0, [r0, #0x14] + bx lr + .align 2, 0 +_020CEC28: .word gGXState + arm_func_end GX_GetBankForSubOBJ + + arm_func_start GX_GetBankForSubOBJExtPltt +GX_GetBankForSubOBJExtPltt: ; 0x020CEC2C + ldr r0, _020CEC38 ; =gGXState + ldrh r0, [r0, #0x18] + bx lr + .align 2, 0 +_020CEC38: .word gGXState + arm_func_end GX_GetBankForSubOBJExtPltt diff --git a/lib/NitroSDK/asm/gxasm.s b/lib/NitroSDK/asm/gxasm.s new file mode 100644 index 00000000..37fa51df --- /dev/null +++ b/lib/NitroSDK/asm/gxasm.s @@ -0,0 +1,29 @@ + .include "asm/macros.inc" + .include "gxasm.inc" + .include "global.inc" + + .text + + arm_func_start GX_SendFifo48B +GX_SendFifo48B: ; 0x020D0E2C + ldmia r0!, {r2, r3, ip} + stmia r1, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1, {r2, r3, ip} + bx lr + arm_func_end GX_SendFifo48B + + arm_func_start GX_SendFifo64B +GX_SendFifo64B: ; 0x020D0E50 + stmdb sp!, {r4, r5, r6, r7, r8} + ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, ip} + stmia r1, {r2, r3, r4, r5, r6, r7, r8, ip} + ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, ip} + stmia r1, {r2, r3, r4, r5, r6, r7, r8, ip} + ldmia sp!, {r4, r5, r6, r7, r8} + bx lr + arm_func_end GX_SendFifo64B diff --git a/lib/NitroSDK/asm/gxstate.s b/lib/NitroSDK/asm/gxstate.s new file mode 100644 index 00000000..a8cd50e3 --- /dev/null +++ b/lib/NitroSDK/asm/gxstate.s @@ -0,0 +1,40 @@ + .include "asm/macros.inc" + .include "gxstate.inc" + .include "global.inc" + + .bss + + .public gGXState +gGXState: + .space 0x1A + + .text + + arm_func_start GX_InitGXState +GX_InitGXState: ; 0x020CDAEC + ldr r0, _020CDB44 ; =gGXState + mov r2, #0 + strh r2, [r0] + strh r2, [r0, #2] + strh r2, [r0, #4] + strh r2, [r0, #6] + strh r2, [r0, #8] + strh r2, [r0, #0xa] + strh r2, [r0, #0xc] + strh r2, [r0, #0xe] + strh r2, [r0, #0x10] + strh r2, [r0, #0x12] + strh r2, [r0, #0x14] + strh r2, [r0, #0x16] + ldr r1, _020CDB48 ; =0x04000240 + strh r2, [r0, #0x18] + str r2, [r1] + strb r2, [r1, #4] + strb r2, [r1, #5] + strb r2, [r1, #6] + strh r2, [r1, #8] + bx lr + .align 2, 0 +_020CDB44: .word gGXState +_020CDB48: .word 0x04000240 + arm_func_end GX_InitGXState diff --git a/lib/NitroSDK/asm/include/fx.inc b/lib/NitroSDK/asm/include/fx.inc new file mode 100644 index 00000000..83fcf457 --- /dev/null +++ b/lib/NitroSDK/asm/include/fx.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public FX_Init +.public FX_Modf diff --git a/lib/NitroSDK/asm/include/fx_atanidx.inc b/lib/NitroSDK/asm/include/fx_atanidx.inc new file mode 100644 index 00000000..4be6f9c9 --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_atanidx.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public FX_Div +.public FX_Atan2Idx diff --git a/lib/NitroSDK/asm/include/fx_cp.inc b/lib/NitroSDK/asm/include/fx_cp.inc new file mode 100644 index 00000000..8a885d61 --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_cp.inc @@ -0,0 +1,12 @@ +#include +#pragma once +.public FX_Div +.public FX_Inv +.public FX_InvFx64c +.public FX_Sqrt +.public FX_GetDivResultFx64c +.public FX_GetDivResult +.public FX_InvAsync +.public FX_DivAsync +.public FX_DivS32 +.public FX_ModS32 diff --git a/lib/NitroSDK/asm/include/fx_mtx22.inc b/lib/NitroSDK/asm/include/fx_mtx22.inc new file mode 100644 index 00000000..a664c86d --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_mtx22.inc @@ -0,0 +1,5 @@ +#include +#pragma once +.public MTX_Identity22_ +.public MTX_Rot22_ +.public MTX_ScaleApply22 diff --git a/lib/NitroSDK/asm/include/fx_mtx33.inc b/lib/NitroSDK/asm/include/fx_mtx33.inc new file mode 100644 index 00000000..e5318633 --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_mtx33.inc @@ -0,0 +1,13 @@ +#include +#pragma once +.public MTX_Identity33_ +.public MTX_ScaleApply33 +.public MTX_RotX33_ +.public MTX_RotY33_ +.public MTX_RotZ33_ +.public MTX_Inverse33 +.public MTX_Concat33 +.public MTX_MultVec33 +.public FX_GetDivResult +.public FX_InvAsync +.public MI_Copy36B diff --git a/lib/NitroSDK/asm/include/fx_mtx43.inc b/lib/NitroSDK/asm/include/fx_mtx43.inc new file mode 100644 index 00000000..c9874951 --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_mtx43.inc @@ -0,0 +1,20 @@ +#include +#pragma once +.public MTX_ScaleApply33 +.public MTX_Identity43_ +.public MTX_Copy43To44_ +.public MTX_TransApply43 +.public MTX_Scale43_ +.public MTX_ScaleApply43 +.public MTX_RotY43_ +.public MTX_Inverse43 +.public MTX_Concat43 +.public MTX_MultVec43 +.public MTX_LookAt +.public FX_GetDivResult +.public FX_InvAsync +.public VEC_DotProduct +.public VEC_CrossProduct +.public VEC_Normalize +.public MI_Copy36B +.public MI_Copy48B diff --git a/lib/NitroSDK/asm/include/fx_mtx44.inc b/lib/NitroSDK/asm/include/fx_mtx44.inc new file mode 100644 index 00000000..6984243c --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_mtx44.inc @@ -0,0 +1,17 @@ +#include +#pragma once +.public MTX_Identity44_ +.public MTX_Copy44To43_ +.public MTX_TransApply44 +.public MTX_RotX44_ +.public MTX_RotY44_ +.public MTX_RotZ44_ +.public MTX_Concat44 +.public MTX_PerspectiveW +.public MTX_OrthoW +.public FX_Div +.public FX_GetDivResultFx64c +.public FX_GetDivResult +.public FX_InvAsync +.public MI_Copy48B +.public _ll_sdiv diff --git a/lib/NitroSDK/asm/include/fx_sincos.inc b/lib/NitroSDK/asm/include/fx_sincos.inc new file mode 100644 index 00000000..752d922c --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_sincos.inc @@ -0,0 +1,2 @@ +#include +#pragma once diff --git a/lib/NitroSDK/asm/include/fx_trig.inc b/lib/NitroSDK/asm/include/fx_trig.inc new file mode 100644 index 00000000..9048fb5b --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_trig.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public FX_SinFx64c +.public FX_CosFx64c diff --git a/lib/NitroSDK/asm/include/fx_vec.inc b/lib/NitroSDK/asm/include/fx_vec.inc new file mode 100644 index 00000000..fa75d9ce --- /dev/null +++ b/lib/NitroSDK/asm/include/fx_vec.inc @@ -0,0 +1,14 @@ +#include +#pragma once +.public VEC_Add +.public VEC_Subtract +.public VEC_Fx16Add +.public VEC_DotProduct +.public VEC_Fx16DotProduct +.public VEC_CrossProduct +.public VEC_Fx16CrossProduct +.public VEC_Mag +.public VEC_Normalize +.public VEC_Fx16Normalize +.public VEC_MultAdd +.public VEC_Distance diff --git a/lib/NitroSDK/asm/include/g2.inc b/lib/NitroSDK/asm/include/g2.inc new file mode 100644 index 00000000..9b90333a --- /dev/null +++ b/lib/NitroSDK/asm/include/g2.inc @@ -0,0 +1,6 @@ +#include +#pragma once +.public G2x_SetBGyAffine_ +.public G2x_SetBlendAlpha_ +.public G2x_SetBlendBrightness_ +.public G2x_ChangeBlendBrightness_ diff --git a/lib/NitroSDK/asm/include/g3.inc b/lib/NitroSDK/asm/include/g3.inc new file mode 100644 index 00000000..d2474efc --- /dev/null +++ b/lib/NitroSDK/asm/include/g3.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public G3_BeginMakeDL +.public G3_EndMakeDL diff --git a/lib/NitroSDK/asm/include/g3_util.inc b/lib/NitroSDK/asm/include/g3_util.inc new file mode 100644 index 00000000..96c4572e --- /dev/null +++ b/lib/NitroSDK/asm/include/g3_util.inc @@ -0,0 +1,11 @@ +#include +#pragma once +.public MTX_LookAt +.public MTX_OrthoW +.public G3_LoadMtx44 +.public G3_LoadMtx43 +.public G3i_OrthoW_ +.public G3i_LookAt_ +.public G3_RotX +.public G3_RotY +.public G3_RotZ diff --git a/lib/NitroSDK/asm/include/g3b.inc b/lib/NitroSDK/asm/include/g3b.inc new file mode 100644 index 00000000..3243726e --- /dev/null +++ b/lib/NitroSDK/asm/include/g3b.inc @@ -0,0 +1,16 @@ +#include +#pragma once +.public G3B_PushMtx +.public G3B_PopMtx +.public G3B_LoadMtx44 +.public G3B_Color +.public G3B_Normal +.public G3B_Vtx +.public G3B_PolygonAttr +.public G3B_MaterialColorDiffAmb +.public G3B_MaterialColorSpecEmi +.public G3B_LightVector +.public G3B_LightColor +.public G3B_Begin +.public G3B_End +.public MI_Copy64B diff --git a/lib/NitroSDK/asm/include/g3imm.inc b/lib/NitroSDK/asm/include/g3imm.inc new file mode 100644 index 00000000..cb0342ca --- /dev/null +++ b/lib/NitroSDK/asm/include/g3imm.inc @@ -0,0 +1,9 @@ +#include +#pragma once +.public G3_LoadMtx44 +.public G3_LoadMtx43 +.public G3_MultMtx43 +.public G3_MultMtx33 +.public GX_SendFifo48B +.public GX_SendFifo64B +.public MI_Copy36B diff --git a/lib/NitroSDK/asm/include/g3x.inc b/lib/NitroSDK/asm/include/g3x.inc new file mode 100644 index 00000000..42c2a864 --- /dev/null +++ b/lib/NitroSDK/asm/include/g3x.inc @@ -0,0 +1,21 @@ +#include +#pragma once +.public G3X_Init +.public G3X_Reset +.public G3X_InitMtxStack +.public G3X_SetFog +.public G3X_GetClipMtx +.public G3X_GetVectorMtx +.public G3X_SetEdgeColorTable +.public G3X_SetFogTable +.public G3X_SetClearColor +.public G3X_GetBoxTestResult +.public G3X_SetHOffset +.public MI_DmaFill32 +.public MI_DmaFill32Async +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MI_Copy32B +.public MI_Copy36B +.public MI_Copy64B +.public GXi_DmaId diff --git a/lib/NitroSDK/asm/include/gx.inc b/lib/NitroSDK/asm/include/gx.inc new file mode 100644 index 00000000..99609a34 --- /dev/null +++ b/lib/NitroSDK/asm/include/gx.inc @@ -0,0 +1,19 @@ +#include +#pragma once +.public GX_Init +.public GX_HBlankIntr +.public GX_VBlankIntr +.public GX_DispOff +.public GX_DispOn +.public GX_SetGraphicsMode +.public GXS_SetGraphicsMode +.public GXx_SetMasterBrightness_ +.public GXx_GetMasterBrightness_ +.public GX_InitGXState +.public OS_GetLockID +.public OS_Terminate +.public MI_DmaFill32 +.public MIi_CpuClear32 +.public sIsDispOn +.public GXi_DmaId +.public GXi_VRamLockId diff --git a/lib/NitroSDK/asm/include/gx_bgcnt.inc b/lib/NitroSDK/asm/include/gx_bgcnt.inc new file mode 100644 index 00000000..9582bd16 --- /dev/null +++ b/lib/NitroSDK/asm/include/gx_bgcnt.inc @@ -0,0 +1,18 @@ +#include +#pragma once +.public G2_GetBG0ScrPtr +.public G2S_GetBG0ScrPtr +.public G2_GetBG1ScrPtr +.public G2S_GetBG1ScrPtr +.public G2_GetBG2ScrPtr +.public G2S_GetBG2ScrPtr +.public G2_GetBG3ScrPtr +.public G2S_GetBG3ScrPtr +.public G2_GetBG0CharPtr +.public G2S_GetBG0CharPtr +.public G2_GetBG1CharPtr +.public G2S_GetBG1CharPtr +.public G2_GetBG2CharPtr +.public G2S_GetBG2CharPtr +.public G2_GetBG3CharPtr +.public G2S_GetBG3CharPtr diff --git a/lib/NitroSDK/asm/include/gx_load2d.inc b/lib/NitroSDK/asm/include/gx_load2d.inc new file mode 100644 index 00000000..18f10427 --- /dev/null +++ b/lib/NitroSDK/asm/include/gx_load2d.inc @@ -0,0 +1,69 @@ +#include +#pragma once +.public GX_SetBankForBGExtPltt +.public GX_SetBankForOBJExtPltt +.public GX_SetBankForSubBGExtPltt +.public GX_SetBankForSubOBJExtPltt +.public GX_ResetBankForBGExtPltt +.public GX_ResetBankForOBJExtPltt +.public GX_ResetBankForSubBGExtPltt +.public GX_ResetBankForSubOBJExtPltt +.public G2_GetBG0ScrPtr +.public G2S_GetBG0ScrPtr +.public G2_GetBG1ScrPtr +.public G2S_GetBG1ScrPtr +.public G2_GetBG2ScrPtr +.public G2S_GetBG2ScrPtr +.public G2_GetBG3ScrPtr +.public G2S_GetBG3ScrPtr +.public G2_GetBG0CharPtr +.public G2S_GetBG0CharPtr +.public G2_GetBG1CharPtr +.public G2S_GetBG1CharPtr +.public G2_GetBG2CharPtr +.public G2S_GetBG2CharPtr +.public G2_GetBG3CharPtr +.public G2S_GetBG3CharPtr +.public GX_LoadBGPltt +.public GXS_LoadBGPltt +.public GX_LoadOBJPltt +.public GXS_LoadOBJPltt +.public GX_LoadOAM +.public GXS_LoadOAM +.public GX_LoadOBJ +.public GXS_LoadOBJ +.public GX_LoadBG0Scr +.public GXS_LoadBG0Scr +.public GX_LoadBG1Scr +.public GXS_LoadBG1Scr +.public GX_LoadBG2Scr +.public GXS_LoadBG2Scr +.public GX_LoadBG3Scr +.public GXS_LoadBG3Scr +.public GX_LoadBG0Char +.public GXS_LoadBG0Char +.public GX_LoadBG1Char +.public GXS_LoadBG1Char +.public GX_LoadBG2Char +.public GXS_LoadBG2Char +.public GX_LoadBG3Char +.public GXS_LoadBG3Char +.public GX_BeginLoadBGExtPltt +.public GX_LoadBGExtPltt +.public GX_EndLoadBGExtPltt +.public GX_BeginLoadOBJExtPltt +.public GX_LoadOBJExtPltt +.public GX_EndLoadOBJExtPltt +.public GXS_BeginLoadBGExtPltt +.public GXS_LoadBGExtPltt +.public GXS_EndLoadBGExtPltt +.public GXS_BeginLoadOBJExtPltt +.public GXS_LoadOBJExtPltt +.public GXS_EndLoadOBJExtPltt +.public MI_DmaCopy32 +.public MI_DmaCopy16 +.public MI_DmaCopy32Async +.public MI_WaitDma +.public MIi_CpuCopy16 +.public MIi_CpuCopy32 +.public GXi_DmaId diff --git a/lib/NitroSDK/asm/include/gx_load3d.inc b/lib/NitroSDK/asm/include/gx_load3d.inc new file mode 100644 index 00000000..6a1edfbb --- /dev/null +++ b/lib/NitroSDK/asm/include/gx_load3d.inc @@ -0,0 +1,23 @@ +#include +#pragma once +.public GX_SetBankForTex +.public GX_SetBankForTexPltt +.public GX_SetBankForClearImage +.public GX_ResetBankForTex +.public GX_ResetBankForTexPltt +.public GX_ResetBankForClearImage +.public GX_BeginLoadTex +.public GX_LoadTex +.public GX_EndLoadTex +.public GX_BeginLoadTexPltt +.public GX_LoadTexPltt +.public GX_EndLoadTexPltt +.public GX_BeginLoadClearImage +.public GX_LoadClearImageColor +.public GX_LoadClearImageDepth +.public GX_EndLoadClearImage +.public MI_DmaCopy32 +.public MI_DmaCopy32Async +.public MI_WaitDma +.public MIi_CpuCopy32 +.public GXi_DmaId diff --git a/lib/NitroSDK/asm/include/gx_vramcnt.inc b/lib/NitroSDK/asm/include/gx_vramcnt.inc new file mode 100644 index 00000000..3375e826 --- /dev/null +++ b/lib/NitroSDK/asm/include/gx_vramcnt.inc @@ -0,0 +1,47 @@ +#include +#pragma once +.public GX_SetBankForBG +.public GX_SetBankForOBJ +.public GX_SetBankForBGExtPltt +.public GX_SetBankForOBJExtPltt +.public GX_SetBankForTex +.public GX_SetBankForTexPltt +.public GX_SetBankForClearImage +.public GX_SetBankForARM7 +.public GX_SetBankForLCDC +.public GX_SetBankForSubBG +.public GX_SetBankForSubOBJ +.public GX_SetBankForSubBGExtPltt +.public GX_SetBankForSubOBJExtPltt +.public GX_ResetBankForBG +.public GX_ResetBankForOBJ +.public GX_ResetBankForBGExtPltt +.public GX_ResetBankForOBJExtPltt +.public GX_ResetBankForTex +.public GX_ResetBankForTexPltt +.public GX_ResetBankForClearImage +.public GX_ResetBankForSubBG +.public GX_ResetBankForSubOBJ +.public GX_ResetBankForSubBGExtPltt +.public GX_ResetBankForSubOBJExtPltt +.public GX_DisableBankForBG +.public GX_DisableBankForOBJ +.public GX_DisableBankForBGExtPltt +.public GX_DisableBankForOBJExtPltt +.public GX_DisableBankForTex +.public GX_DisableBankForTexPltt +.public GX_DisableBankForClearImage +.public GX_DisableBankForARM7 +.public GX_DisableBankForLCDC +.public GX_DisableBankForSubBG +.public GX_DisableBankForSubOBJ +.public GX_DisableBankForSubBGExtPltt +.public GX_DisableBankForSubOBJExtPltt +.public GX_GetBankForOBJ +.public GX_GetBankForOBJExtPltt +.public GX_GetBankForLCDC +.public GX_GetBankForSubOBJ +.public GX_GetBankForSubOBJExtPltt +.public OSi_UnlockVram +.public GXi_VRamLockId +.public gGXState diff --git a/lib/NitroSDK/asm/include/gxasm.inc b/lib/NitroSDK/asm/include/gxasm.inc new file mode 100644 index 00000000..738538d7 --- /dev/null +++ b/lib/NitroSDK/asm/include/gxasm.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public GX_SendFifo48B +.public GX_SendFifo64B diff --git a/lib/NitroSDK/asm/include/gxstate.inc b/lib/NitroSDK/asm/include/gxstate.inc new file mode 100644 index 00000000..1ea12124 --- /dev/null +++ b/lib/NitroSDK/asm/include/gxstate.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public GX_InitGXState +.public gGXState diff --git a/lib/NitroSDK/asm/include/mb.inc b/lib/NitroSDK/asm/include/mb.inc new file mode 100644 index 00000000..a2abc282 --- /dev/null +++ b/lib/NitroSDK/asm/include/mb.inc @@ -0,0 +1,64 @@ +#include +#pragma once +.public _start_AutoloadDoneCallback +.public OS_CreateThread +.public OS_ExitThread +.public OS_SleepThread +.public OS_WakeupThreadDirect +.public OS_SetThreadPriority +.public OS_GetThreadPriority +.public DC_InvalidateRange +.public DC_FlushRange +.public DC_WaitWriteBufferEmpty +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_SpinWait +.public OS_GetMacAddress +.public OS_Terminate +.public MI_DmaCopy16 +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuClearFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public PXI_IsCallbackReady +.public FS_FindArchive +.public FS_InitFile +.public FS_OpenFileDirect +.public FS_OpenFile +.public FS_CloseFile +.public FS_ReadFile +.public FS_SeekFile +.public WM_SetIndCallback +.public WM_SetPortCallback +.public WM_ReadMPData +.public WM_GetAllowedChannel +.public WM_GetNextTgid +.public WM_Initialize +.public WM_Reset +.public WM_End +.public WM_SetParentParameter +.public WMi_StartParentEx +.public WM_StartScan +.public WM_StartConnectEx +.public WM_Disconnect +.public WM_StartMPEx +.public WM_SetMPDataToPortEx +.public WM_SetGameInfo +.public WM_SetBeaconIndication +.public WM_SetLifeTime +.public _s32_div_f +.public _u32_div_f +.public MB_CommSetParentStateCallback +.public MB_CommGetChildUser +.public MB_CommIsBootable +.public MB_CommResponseRequest +.public MB_GetSegmentLength +.public MB_ReadSegment +.public MB_RegisterFile +.public MB_Init +.public MB_SetParentCommParam +.public MB_StartParentFromIdle +.public MB_End +.public MB_DisconnectChild diff --git a/lib/NitroSDK/asm/include/mi_compress.inc b/lib/NitroSDK/asm/include/mi_compress.inc new file mode 100644 index 00000000..82c502ac --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_compress.inc @@ -0,0 +1,3 @@ +#include +#pragma once +.public MI_CompressLZImpl diff --git a/lib/NitroSDK/asm/include/mi_dma.inc b/lib/NitroSDK/asm/include/mi_dma.inc new file mode 100644 index 00000000..622369db --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_dma.inc @@ -0,0 +1,16 @@ +#include +#pragma once +.public OSi_EnterDmaCallback +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_Terminate +.public MI_DmaFill32 +.public MI_DmaCopy32 +.public MI_DmaCopy16 +.public MI_DmaFill32Async +.public MI_DmaCopy32Async +.public MI_WaitDma +.public MI_StopDma +.public MIi_CheckAnotherAutoDMA +.public MIi_CheckDma0SourceAddress +.public MIi_DmaSetParams diff --git a/lib/NitroSDK/asm/include/mi_dma_card.inc b/lib/NitroSDK/asm/include/mi_dma_card.inc new file mode 100644 index 00000000..906f986c --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_dma_card.inc @@ -0,0 +1,6 @@ +#include +#pragma once +.public MIi_CheckAnotherAutoDMA +.public MIi_CheckDma0SourceAddress +.public MIi_CardDmaCopy32 +.public MIi_DmaSetParams diff --git a/lib/NitroSDK/asm/include/mi_dma_gxcommand.inc b/lib/NitroSDK/asm/include/mi_dma_gxcommand.inc new file mode 100644 index 00000000..e6e87405 --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_dma_gxcommand.inc @@ -0,0 +1,17 @@ +#include +#pragma once +.public OS_SetIrqFunction +.public OS_GetIrqFunction +.public OSi_EnterDmaCallback +.public OS_EnableIrqMask +.public OS_DisableIrqMask +.public OS_ResetRequestIrqMask +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public MI_WaitDma +.public MIi_CheckAnotherAutoDMA +.public MIi_CheckDma0SourceAddress +.public MI_SendGXCommandAsync +.public MI_SendGXCommandAsyncFast +.public MIi_DmaSetParams +.public MI_SendGXCommand diff --git a/lib/NitroSDK/asm/include/mi_dma_hblank.inc b/lib/NitroSDK/asm/include/mi_dma_hblank.inc new file mode 100644 index 00000000..a4c681ce --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_dma_hblank.inc @@ -0,0 +1,8 @@ +#include +#pragma once +.public MI_WaitDma +.public MIi_CheckAnotherAutoDMA +.public MIi_CheckDma0SourceAddress +.public MI_HBlankDmaCopy32 +.public MI_HBlankDmaCopy16 +.public MIi_DmaSetParams diff --git a/lib/NitroSDK/asm/include/mi_init.inc b/lib/NitroSDK/asm/include/mi_init.inc new file mode 100644 index 00000000..9254714e --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_init.inc @@ -0,0 +1,4 @@ +#include +#pragma once +.public MI_SetWramBank +.public MI_StopDma diff --git a/lib/NitroSDK/asm/include/mi_memory.inc b/lib/NitroSDK/asm/include/mi_memory.inc new file mode 100644 index 00000000..eeff2ca6 --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_memory.inc @@ -0,0 +1,16 @@ +#include +#pragma once +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MIi_CpuSend32 +.public MIi_CpuClearFast +.public MIi_CpuCopyFast +.public MI_Copy32B +.public MI_Copy36B +.public MI_Copy48B +.public MI_Copy64B +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public MI_Zero36B diff --git a/lib/NitroSDK/asm/include/mi_swap.inc b/lib/NitroSDK/asm/include/mi_swap.inc new file mode 100644 index 00000000..752d922c --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_swap.inc @@ -0,0 +1,2 @@ +#include +#pragma once diff --git a/lib/NitroSDK/asm/include/mi_uncompress.inc b/lib/NitroSDK/asm/include/mi_uncompress.inc new file mode 100644 index 00000000..2eaea8ee --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_uncompress.inc @@ -0,0 +1,3 @@ +#include +#pragma once +.public MI_UncompressLZ8 diff --git a/lib/NitroSDK/asm/include/mi_wram.inc b/lib/NitroSDK/asm/include/mi_wram.inc new file mode 100644 index 00000000..c75cbb41 --- /dev/null +++ b/lib/NitroSDK/asm/include/mi_wram.inc @@ -0,0 +1,3 @@ +#include +#pragma once +.public MI_SetWramBank diff --git a/lib/NitroSDK/asm/include/wvr.inc b/lib/NitroSDK/asm/include/wvr.inc new file mode 100644 index 00000000..1fe85ac6 --- /dev/null +++ b/lib/NitroSDK/asm/include/wvr.inc @@ -0,0 +1,13 @@ +#include +#pragma once +.public WVR_StartUpAsync +.public WVR_TerminateAsync +.public OS_GetLockID +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OSi_TryLockVram +.public OSi_UnlockVram +.public PXI_Init +.public PXI_SetFifoRecvCallback +.public PXI_IsCallbackReady +.public PXI_SendWordByFifo diff --git a/lib/NitroSDK/asm/mb.s b/lib/NitroSDK/asm/mb.s new file mode 100644 index 00000000..136d510b --- /dev/null +++ b/lib/NitroSDK/asm/mb.s @@ -0,0 +1,5848 @@ + .include "asm/macros.inc" + .include "mb.inc" + .include "global.inc" + + .public _start_AutoloadDoneCallback + + .text + + arm_func_start MB_CommSetParentStateCallback +MB_CommSetParentStateCallback: ; 0x0221BA70 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _0221BA94 ; =mbc + ldr r1, [r1] + add r1, r1, #0x1000 + str r4, [r1, #0x4e4] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221BA94: .word mbc + arm_func_end MB_CommSetParentStateCallback + + arm_func_start MB_CommGetChildUser +MB_CommGetChildUser: ; 0x0221BA98 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _0221BB18 ; =mbc + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + beq _0221BB08 + mov r0, r5 + bl IsChildAidValid + cmp r0, #0 + beq _0221BB08 + ldr r0, _0221BB18 ; =mbc + sub r1, r5, #1 + ldr r3, [r0] + mov r2, #0x16 + add r0, r3, #0x1340 + mla r0, r1, r2, r0 + add r1, r3, #0x72 + add r1, r1, #0x1700 + bl MI_CpuCopy8 + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, _0221BB18 ; =mbc + ldr r0, [r0] + add r0, r0, #0x72 + add r0, r0, #0x1700 + ldmia sp!, {r3, r4, r5, pc} +_0221BB08: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221BB18: .word mbc + arm_func_end MB_CommGetChildUser + + arm_func_start MB_CommIsBootable +MB_CommIsBootable: ; 0x0221BB1C + stmdb sp!, {r4, lr} + ldr r1, _0221BB6C ; =mbc + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + beq _0221BB64 + bl IsChildAidValid + cmp r0, #0 + beq _0221BB64 + ldr r0, _0221BB6C ; =mbc + sub r1, r4, #1 + ldr r0, [r0] + add r0, r0, r1, lsl #2 + add r0, r0, #0x1000 + ldr r0, [r0, #0x4e8] + cmp r0, #7 + moveq r0, #1 + ldmeqia sp!, {r4, pc} +_0221BB64: + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221BB6C: .word mbc + arm_func_end MB_CommIsBootable + + arm_func_start MB_CommResponseRequest +MB_CommResponseRequest: ; 0x0221BB70 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + mov r7, r0 + bl OS_DisableInterrupts + mov r6, r0 + cmp r4, #3 + addls pc, pc, r4, lsl #2 + b _0221BBD0 +_0221BB90: ; jump table + b _0221BBA0 ; case 0 + b _0221BBAC ; case 1 + b _0221BBB8 ; case 2 + b _0221BBC4 ; case 3 +_0221BBA0: + mov r5, #0xa + mov r4, #4 + b _0221BBE0 +_0221BBAC: + mov r5, #0xa + mov r4, #3 + b _0221BBE0 +_0221BBB8: + mov r5, #0xe + mov r4, #2 + b _0221BBE0 +_0221BBC4: + mov r5, #7 + mov r4, #5 + b _0221BBE0 +_0221BBD0: + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221BBE0: + ldr r0, _0221BC4C ; =mbc + ldr r0, [r0] + cmp r0, #0 + beq _0221BC3C + mov r0, r7 + bl IsChildAidValid + cmp r0, #0 + beq _0221BC3C + ldr r0, _0221BC4C ; =mbc + sub r2, r7, #1 + ldr r1, [r0] + add r0, r1, r2, lsl #2 + add r0, r0, #0x1000 + ldr r0, [r0, #0x4e8] + cmp r5, r0 + bne _0221BC3C + add r0, r1, r2, lsl #1 + add r1, r0, #0x1700 + mov r0, r6 + strh r4, [r1, #0x54] + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221BC3C: + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221BC4C: .word mbc + arm_func_end MB_CommResponseRequest + + arm_func_start MBi_CommChangeParentState +MBi_CommChangeParentState: ; 0x0221BC50 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl IsChildAidValid + cmp r0, #0 + beq _0221BC84 + ldr r0, _0221BC98 ; =mbc + sub r1, r6, #1 + ldr r0, [r0] + add r0, r0, r1, lsl #2 + add r0, r0, #0x1000 + str r5, [r0, #0x4e8] +_0221BC84: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl MBi_CommChangeParentStateCallbackOnly + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221BC98: .word mbc + arm_func_end MBi_CommChangeParentState + + arm_func_start MBi_CommChangeParentStateCallbackOnly +MBi_CommChangeParentStateCallbackOnly: ; 0x0221BC9C + stmdb sp!, {r3, lr} + ldr r3, _0221BCC0 ; =mbc + ldr r3, [r3] + add r3, r3, #0x1000 + ldr r3, [r3, #0x4e4] + cmp r3, #0 + ldmeqia sp!, {r3, pc} + blx r3 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221BCC0: .word mbc + arm_func_end MBi_CommChangeParentStateCallbackOnly + + arm_func_start MBi_CommParentCallback +MBi_CommParentCallback: ; 0x0221BCC4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r5, r0 + mov r4, r1 + cmp r5, #0x19 + bgt _0221BD1C + bge _0221BF60 + cmp r5, #0x11 + bgt _0221BD10 + bge _0221C114 + cmp r5, #3 + bgt _0221C114 + cmp r5, #0 + blt _0221C114 + beq _0221BD54 + cmp r5, #1 + beq _0221BD78 + cmp r5, #3 + beq _0221BF54 + b _0221C114 +_0221BD10: + cmp r5, #0x15 + beq _0221BD40 + b _0221C114 +_0221BD1C: + cmp r5, #0xff + bgt _0221BD34 + bge _0221C000 + cmp r5, #0x1c + beq _0221BF68 + b _0221C114 +_0221BD34: + cmp r5, #0x100 + beq _0221C070 + b _0221C114 +_0221BD40: + mov r2, r4 + mov r0, #0 + mov r1, #1 + bl MBi_CommChangeParentState + b _0221C114 +_0221BD54: + ldrh r0, [r4, #0x10] + cmp r0, #0 + beq _0221C114 + cmp r0, #0x10 + bhs _0221C114 + mov r2, r4 + mov r1, #2 + bl MBi_CommChangeParentState + b _0221C114 +_0221BD78: + ldrh r0, [r4, #0x10] + cmp r0, #0 + beq _0221C114 + cmp r0, #0x10 + bhs _0221C114 + ldr r2, _0221C15C ; =mbc + sub r0, r0, #1 + ldr r3, [r2] + mov r1, #0 + add r0, r3, r0, lsl #1 + add r0, r0, #0x1400 + strh r1, [r0, #0x8a] + ldr r0, [r2] + ldrh r2, [r4, #0x10] + add r0, r0, #0xa8 + add r3, r0, #0x1400 + sub r0, r2, #1 + add r0, r3, r0, lsl #2 + mov r2, #4 + bl MI_CpuFill8 + ldr r0, _0221C15C ; =mbc + ldrh r1, [r4, #0x10] + ldr r0, [r0] + mov r2, #0x16 + add r0, r0, #0x1340 + sub r1, r1, #1 + mla r0, r1, r2, r0 + mov r1, #0 + bl MI_CpuFill8 + ldrh r0, [r4, #0x10] + bl MBi_ClearParentPieceBuffer + ldrh r1, [r4, #0x10] + ldr r0, _0221C15C ; =mbc + mov r3, #0 + ldr r2, [r0] + sub r1, r1, #1 + add r1, r2, r1, lsl #1 + add r1, r1, #0x1700 + strh r3, [r1, #0x54] + ldrh r7, [r4, #0x10] + ldr r8, [r0] + sub r2, r3, #1 + sub r6, r7, #1 + add r1, r8, r6 + add r1, r1, #0x1500 + ldrsb r3, [r1, #0x26] + cmp r3, r2 + beq _0221BEA4 + ldr r1, _0221C160 ; =0x000005D4 + and r2, r3, #0xff + mul r1, r2, r1 + add r2, r8, r1 + add r8, r2, #0x1d00 + mov r3, #1 + ldrh sb, [r8, #0x4e] + mvn r2, r3, lsl r7 + and sb, sb, r2 + strh sb, [r8, #0x4e] + ldr r8, [r0] + sub sb, r3, #2 + add r8, r8, r1 + add r8, r8, #0x1d00 + ldrh ip, [r8, #0x50] + orr r3, ip, r3, lsl r7 + strh r3, [r8, #0x50] + ldr r3, [r0] + add r3, r3, r6 + add r3, r3, #0x1000 + strb sb, [r3, #0x526] + ldr r0, [r0] + add r0, r0, r1 + add r0, r0, #0x1d00 + ldrh r1, [r0, #0x4c] + and r1, r1, r2 + strh r1, [r0, #0x4c] +_0221BEA4: + ldr r1, _0221C15C ; =mbc + ldrh r2, [r4, #0x10] + ldr r6, [r1] + mov r3, #1 + add r0, r6, #0x1500 + ldrh r0, [r0, #0x36] + tst r0, r3, lsl r2 + beq _0221BEF0 + add r0, r6, #0x1000 + ldrb r2, [r0, #0x535] + sub r2, r2, #1 + strb r2, [r0, #0x535] + ldr r0, [r1] + ldrh r1, [r4, #0x10] + add r0, r0, #0x1500 + ldrh r2, [r0, #0x36] + mvn r1, r3, lsl r1 + and r1, r2, r1 + strh r1, [r0, #0x36] +_0221BEF0: + ldrh r0, [r4, #0x10] + ldr r1, _0221C15C ; =mbc + ldr r2, [r1] + sub r1, r0, #1 + add r1, r2, r1, lsl #2 + add r1, r1, #0x1000 + ldr r1, [r1, #0x4e8] + cmp r1, #8 + bne _0221BF20 + mov r1, #9 + mov r2, #0 + bl MBi_CommChangeParentState +_0221BF20: + ldrh r0, [r4, #0x10] + mov r2, r4 + mov r1, #3 + bl MBi_CommChangeParentState + ldrh r1, [r4, #0x10] + ldr r0, _0221C15C ; =mbc + mov r3, #0 + ldr r2, [r0] + sub r0, r1, #1 + add r0, r2, r0, lsl #2 + add r0, r0, #0x1000 + str r3, [r0, #0x4e8] + b _0221C114 +_0221BF54: + mov r0, r4 + bl MBi_CommParentRecvData + b _0221C114 +_0221BF60: + bl MBi_CommParentSendData + b _0221C114 +_0221BF68: + mov r8, #0 + ldr r6, _0221C15C ; =mbc + ldr r4, _0221C160 ; =0x000005D4 + mov r7, r8 +_0221BF78: + mul sb, r8, r4 + ldr r1, [r6] + add r2, r1, sb + add r0, r2, #0x1000 + ldrb r0, [r0, #0xd52] + cmp r0, #0 + addne r2, r2, #0x1d00 + ldrneh r3, [r2, #0x50] + cmpne r3, #0 + beq _0221BFC8 + add r0, r1, #0x6c + add r0, r0, #0x1800 + ldrh r2, [r2, #0x4e] + add r0, r0, sb + add r1, r1, #0x1340 + bl MB_UpdateGameInfoMember + ldr r0, [r6] + add r0, r0, sb + add r0, r0, #0x1d00 + strh r7, [r0, #0x50] +_0221BFC8: + add r0, r8, #1 + and r8, r0, #0xff + cmp r8, #0x10 + blo _0221BF78 + bl MBi_GetGgid + mov r6, r0 + bl MBi_GetTgid + mov r4, r0 + bl MBi_GetAttribute + mov r2, r0 + mov r0, r6 + mov r1, r4 + bl MB_SendGameInfoBeacon + b _0221C114 +_0221C000: + ldrh r0, [r4, #2] + cmp r0, #0xf + addls pc, pc, r0, lsl #2 + b _0221C060 +_0221C010: ; jump table + b _0221C060 ; case 0 + b _0221C050 ; case 1 + b _0221C060 ; case 2 + b _0221C060 ; case 3 + b _0221C050 ; case 4 + b _0221C050 ; case 5 + b _0221C050 ; case 6 + b _0221C060 ; case 7 + b _0221C050 ; case 8 + b _0221C050 ; case 9 + b _0221C060 ; case 10 + b _0221C060 ; case 11 + b _0221C060 ; case 12 + b _0221C060 ; case 13 + b _0221C060 ; case 14 + b _0221C060 ; case 15 +_0221C050: + mov r0, #0 + mov r1, #9 + bl MBi_CommCallParentError + b _0221C114 +_0221C060: + mov r0, #0 + mov r1, #8 + bl MBi_CommCallParentError + b _0221C114 +_0221C070: + ldrh r0, [r4] + cmp r0, #0x1d + addls pc, pc, r0, lsl #2 + b _0221C108 +_0221C080: ; jump table + b _0221C0F8 ; case 0 + b _0221C108 ; case 1 + b _0221C108 ; case 2 + b _0221C108 ; case 3 + b _0221C108 ; case 4 + b _0221C108 ; case 5 + b _0221C108 ; case 6 + b _0221C0F8 ; case 7 + b _0221C0F8 ; case 8 + b _0221C108 ; case 9 + b _0221C108 ; case 10 + b _0221C108 ; case 11 + b _0221C108 ; case 12 + b _0221C0F8 ; case 13 + b _0221C0F8 ; case 14 + b _0221C0F8 ; case 15 + b _0221C108 ; case 16 + b _0221C0F8 ; case 17 + b _0221C0F8 ; case 18 + b _0221C108 ; case 19 + b _0221C108 ; case 20 + b _0221C0F8 ; case 21 + b _0221C108 ; case 22 + b _0221C108 ; case 23 + b _0221C108 ; case 24 + b _0221C0F8 ; case 25 + b _0221C108 ; case 26 + b _0221C108 ; case 27 + b _0221C108 ; case 28 + b _0221C0F8 ; case 29 +_0221C0F8: + mov r0, #0 + mov r1, #9 + bl MBi_CommCallParentError + b _0221C114 +_0221C108: + mov r0, #0 + mov r1, #8 + bl MBi_CommCallParentError +_0221C114: + cmp r5, #0x11 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r1, _0221C15C ; =mbc + mov r0, #0 + ldr r1, [r1] + mov r2, #0x7d00 + add r3, r1, #0x1000 + ldr r4, [r3, #0x4e4] + bl MIi_CpuClearFast + ldr r1, _0221C15C ; =mbc + mov r0, #0 + str r0, [r1] + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r2, r0 + mov r1, #0xc + blx r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0221C15C: .word mbc +_0221C160: .word 0x000005D4 + arm_func_end MBi_CommParentCallback + + arm_func_start MBi_CommParentRecvDataPerChild +MBi_CommParentRecvDataPerChild: ; 0x0221C164 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x34 + movs r6, r1 + addeq sp, sp, #0x34 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + cmp r6, #0xf + addhi sp, sp, #0x34 + ldmhiia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r1, sp, #0x20 + mov r2, r6 + add r0, r0, #0xa + bl MBi_SetRecvBufferFromChild + ldr r1, _0221C63C ; =mbc + ldrb r7, [sp, #0x20] + ldr r2, [r1] + sub r3, r6, #1 + add r4, r2, r3, lsl #2 + add r4, r4, #0x1000 + ldr r4, [r4, #0x4e8] + mov r5, r0 + cmp r7, #0xb + addls pc, pc, r7, lsl #2 + b _0221C634 +_0221C1C0: ; jump table + b _0221C634 ; case 0 + b _0221C634 ; case 1 + b _0221C634 ; case 2 + b _0221C634 ; case 3 + b _0221C634 ; case 4 + b _0221C634 ; case 5 + b _0221C634 ; case 6 + b _0221C1F0 ; case 7 + b _0221C488 ; case 8 + b _0221C530 ; case 9 + b _0221C5A0 ; case 10 + b _0221C634 ; case 11 +_0221C1F0: + cmp r4, #2 + bne _0221C298 + cmp r5, #0 + addeq sp, sp, #0x34 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r1, sp, #0 + mov r2, #0x1d + bl MI_CpuCopy8 + ldr r2, _0221C63C ; =mbc + sub r0, r6, #1 + ldr r1, [r2] + ldr r3, [sp] + add r1, r1, r0, lsl #2 + add r1, r1, #0x1000 + str r3, [r1, #0x4a8] + ldr r1, [r2] + ldrh r3, [sp, #0x1a] + add r1, r1, r0, lsl #1 + add r1, r1, #0x1400 + strh r3, [r1, #0x8a] + ldr r1, [r2] + mov r2, #0x16 + add r1, r1, #0x1340 + mla r1, r0, r2, r1 + add r0, sp, #4 + bl MI_CpuCopy8 + ldr r0, _0221C63C ; =mbc + sub r2, r6, #1 + ldr r3, [r0] + mov r0, #0x16 + mul r7, r2, r0 + add r8, r3, #0x1340 + and r1, r6, #0xff + ldrb r3, [r8, r7] + mov r0, r1, lsl #0x1c + add r2, sp, #4 + bic r1, r3, #0xf0 + orr r1, r1, r0, lsr #24 + strb r1, [r8, r7] + mov r0, r6 + mov r1, #0xa + bl MBi_CommChangeParentState +_0221C298: + cmp r4, #0xa + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldrb lr, [r5, #0x1c] + mov r0, #0 + cmp lr, #0x10 + bhs _0221C2F4 + ldr r2, _0221C63C ; =mbc + ldr r1, _0221C640 ; =0x000005D4 + ldr r3, [r2] + mla r4, lr, r1, r3 + add r1, r4, #0x1000 + ldrb r2, [r1, #0xd52] + cmp r2, #0 + beq _0221C2F4 + sub r2, r6, #1 + add r3, r3, r2, lsl #2 + ldr r2, [r1, #0xd40] + add r1, r3, #0x1000 + ldr r3, [r1, #0x4a8] + ldr r1, [r2, #0x14] + cmp r3, r1 + beq _0221C314 +_0221C2F4: + ldr r0, _0221C63C ; =mbc + sub r1, r6, #1 + ldr r0, [r0] + mov r2, #4 + add r0, r0, r1, lsl #1 + add r0, r0, #0x1700 + strh r2, [r0, #0x54] + b _0221C390 +_0221C314: + mov r5, r0 + add r1, r4, #0x1d00 + mov r3, #1 + b _0221C33C +_0221C324: + ldrh r2, [r1, #0x4e] + tst r2, r3, lsl r5 + addne r0, r0, #1 + add r2, r5, #1 + andne r0, r0, #0xff + and r5, r2, #0xff +_0221C33C: + cmp r5, #0x10 + blo _0221C324 + ldr r2, _0221C63C ; =mbc + ldr r1, _0221C640 ; =0x000005D4 + ldr r2, [r2] + mla r1, lr, r1, r2 + add r1, r1, #0x1000 + ldr r1, [r1, #0xd40] + ldrb r1, [r1, #0x18] + cmp r0, r1 + blo _0221C390 + sub r0, r6, #1 + add r1, r2, r0, lsl #1 + add r3, r1, #0x1700 + mov r2, #0 + mov r0, r6 + mov r1, #0xb + strh r2, [r3, #0x54] + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C390: + ldr r3, _0221C63C ; =mbc + sub ip, r6, #1 + ldr r1, [r3] + add r0, r1, ip, lsl #1 + add r4, r0, #0x1700 + ldrh r0, [r4, #0x54] + cmp r0, #3 + beq _0221C3C0 + cmp r0, #4 + beq _0221C46C + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C3C0: + add r0, r1, #0x1500 + ldrh r0, [r0, #0x36] + mov r5, #1 + tst r0, r5, lsl r6 + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r1, r1, #0x1000 + ldrb r4, [r1, #0x535] + ldr r2, _0221C640 ; =0x000005D4 + mov r0, r6 + add r4, r4, #1 + strb r4, [r1, #0x535] + ldr r1, [r3] + mul r4, lr, r2 + add r7, r1, #0x1500 + ldrh r8, [r7, #0x36] + mov r2, #0 + mov r1, #5 + orr r8, r8, r5, lsl r6 + strh r8, [r7, #0x36] + ldr r7, [r3] + add r7, r7, ip + add r7, r7, #0x1000 + strb lr, [r7, #0x526] + ldr r7, [r3] + add r7, r7, #0x4e + add lr, r7, #0x1d00 + ldrh r7, [lr, r4] + orr r7, r7, r5, lsl r6 + strh r7, [lr, r4] + ldr r7, [r3] + add r7, r7, #0xd50 + add lr, r7, #0x1000 + ldrh r7, [lr, r4] + orr r5, r7, r5, lsl r6 + strh r5, [lr, r4] + ldr r3, [r3] + add r3, r3, ip, lsl #1 + add r3, r3, #0x1700 + strh r2, [r3, #0x54] + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C46C: + mov r2, #0 + mov r0, r6 + mov r1, #4 + strh r2, [r4, #0x54] + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C488: + cmp r4, #5 + bne _0221C4A8 + mov r0, r6 + mov r1, #0xe + mov r2, #0 + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C4A8: + cmp r4, #0xe + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r0, r2, r3, lsl #1 + add r0, r0, #0x1700 + ldrh r0, [r0, #0x54] + cmp r0, #2 + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r0, r2, r3 + add r0, r0, #0x1000 + ldrb r7, [r0, #0x526] + ldr r4, _0221C640 ; =0x000005D4 + add r0, r2, #0x14c + mul r5, r7, r4 + add r7, r0, #0x1c00 + ldrh r4, [r7, r5] + mov r0, #1 + mov r2, #0 + orr r0, r4, r0, lsl r6 + strh r0, [r7, r5] + ldr r4, [r1] + mov r0, r6 + add r4, r4, r5 + add r4, r4, #0x1d00 + strh r2, [r4, #0x48] + ldr r4, [r1] + mov r1, #6 + add r3, r4, r3, lsl #1 + add r3, r3, #0x1700 + strh r2, [r3, #0x54] + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C530: + cmp r4, #6 + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r0, r2, r3 + add r0, r0, #0x1000 + ldrb r4, [r0, #0x526] + cmp r4, #0xff + addeq sp, sp, #0x34 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, _0221C640 ; =0x000005D4 + ldrh r1, [sp, #0x22] + mla r0, r4, r0, r2 + add r0, r0, #0x1d00 + ldrh r0, [r0, #0x4a] + bl MBi_calc_nextsendblock + ldr r2, _0221C63C ; =mbc + ldr r1, _0221C640 ; =0x000005D4 + ldr r3, [r2] + ldr r2, _0221C644 ; =_02247480 + mla r1, r4, r1, r3 + add r1, r1, #0x1d00 + strh r0, [r1, #0x4a] + ldr r1, [r2] + mov r0, #1 + orr r0, r1, r0, lsl r4 + str r0, [r2] + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C5A0: + cmp r4, #6 + bne _0221C5FC + add r0, r2, r3 + add r0, r0, #0x1000 + ldrb r3, [r0, #0x526] + cmp r3, #0xff + addeq sp, sp, #0x34 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, _0221C640 ; =0x000005D4 + add r0, r2, #0x14c + mul r4, r3, r1 + add r5, r0, #0x1c00 + mov r0, #1 + ldrh r1, [r5, r4] + mvn r0, r0, lsl r6 + and r3, r1, r0 + mov r0, r6 + mov r1, #7 + mov r2, #0 + strh r3, [r5, r4] + bl MBi_CommChangeParentState + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_0221C5FC: + cmp r4, #7 + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + add r0, r2, r3, lsl #1 + add r3, r0, #0x1700 + ldrh r0, [r3, #0x54] + cmp r0, #5 + addne sp, sp, #0x34 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r2, #0 + mov r0, r6 + mov r1, #8 + strh r2, [r3, #0x54] + bl MBi_CommChangeParentState +_0221C634: + add sp, sp, #0x34 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .balign 4, 0 +_0221C63C: .word mbc +_0221C640: .word 0x000005D4 +_0221C644: .word _02247480 + arm_func_end MBi_CommParentRecvDataPerChild + + arm_func_start MBi_CommParentRecvData +MBi_CommParentRecvData: ; 0x0221C648 + stmdb sp!, {r4, r5, r6, lr} + mov ip, #0 + ldr r2, _0221C6E4 ; =mbc + ldr r1, _0221C6E8 ; =0x000005D4 + mov r4, r0 + mov r3, ip +_0221C660: + ldr r0, [r2] + mla r5, ip, r1, r0 + add r0, r5, #0x1000 + ldrb r0, [r0, #0xd52] + cmp r0, #0 + addne r0, r5, #0x1d00 + strneh r3, [r0, #0x4a] + add r0, ip, #1 + mov r0, r0, lsl #0x10 + mov ip, r0, lsr #0x10 + cmp ip, #0x10 + blo _0221C660 + ldr r0, _0221C6EC ; =_02247480 + mov r1, #0 + ldr r5, _0221C6F0 ; =0x0000FFFF + str r1, [r0] + mov r6, #1 +_0221C6A4: + mov r0, r4 + mov r1, r6 + bl WM_ReadMPData + cmp r0, #0 + ldrneh r1, [r0] + cmpne r1, r5 + cmpne r1, #0 + beq _0221C6CC + mov r1, r6 + bl MBi_CommParentRecvDataPerChild +_0221C6CC: + add r0, r6, #1 + mov r0, r0, lsl #0x10 + mov r6, r0, lsr #0x10 + cmp r6, #0xf + bls _0221C6A4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221C6E4: .word mbc +_0221C6E8: .word 0x000005D4 +_0221C6EC: .word _02247480 +_0221C6F0: .word 0x0000FFFF + arm_func_end MBi_CommParentRecvData + + arm_func_start MBi_CommParentSendMsg +MBi_CommParentSendMsg: ; 0x0221C6F4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r2, _0221C730 ; =mbc + mov r4, r1 + ldr r1, [r2] + strb r0, [sp] + add r0, sp, #0 + bl MBi_MakeParentSendBuffer + ldr r0, _0221C730 ; =mbc + mov r1, r4 + ldr r2, [r0] + mov r0, #6 + bl MBi_BlockHeaderEnd + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221C730: .word mbc + arm_func_end MBi_CommParentSendMsg + + arm_func_start MBi_CommParentSendDLFileInfo +MBi_CommParentSendDLFileInfo: ; 0x0221C734 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + mov r5, #0 + add r0, sp, #6 + mov r1, r5 + mov r2, #0x10 + mvn r4, #0 + bl MI_CpuFill8 + ldr r1, _0221C8C0 ; =mbc + mov r0, #1 + ldr r1, [r1] + add ip, sp, #6 +_0221C764: + add r2, r1, r0, lsl #2 + add r2, r2, #0x1000 + ldr r2, [r2, #0x4e4] + cmp r2, #5 + bne _0221C790 + add r2, r1, r0 + add r2, r2, #0x1500 + ldrsb r3, [r2, #0x25] + ldrb r2, [ip, r3] + add r2, r2, #1 + strb r2, [ip, r3] +_0221C790: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #0xf + bls _0221C764 + ldr r2, _0221C8C4 ; =_02245980 + ldr ip, _0221C8C8 ; =0x000005D4 + ldrb r3, [r2] + mov r0, #0 + add lr, sp, #6 +_0221C7B8: + add r2, r3, #1 + mov r3, r2, lsr #0x1f + rsb r2, r3, r2, lsl #28 + add r2, r3, r2, ror #28 + and r3, r2, #0xff + mla r2, r3, ip, r1 + add r2, r2, #0x1000 + ldrb r2, [r2, #0xd52] + cmp r2, #0 + ldrneb r2, [lr, r3] + cmpne r2, #0 + movne r0, r3, lsl #0x18 + movne r4, r0, asr #0x18 + bne _0221C800 + add r0, r0, #1 + and r0, r0, #0xff + cmp r0, #0x10 + blo _0221C7B8 +_0221C800: + mvn r0, #0 + cmp r4, r0 + addeq sp, sp, #0x18 + moveq r0, #0x15 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, _0221C8C4 ; =_02245980 + mov r0, #1 + strb r4, [r2] + mov r3, r0 +_0221C824: + add r2, r1, r0, lsl #2 + add r2, r2, #0x1000 + ldr r2, [r2, #0x4e4] + cmp r2, #5 + bne _0221C854 + add r2, r1, r0 + add r2, r2, #0x1500 + ldrsb r2, [r2, #0x25] + cmp r4, r2 + orreq r2, r5, r3, lsl r0 + moveq r2, r2, lsl #0x10 + moveq r5, r2, lsr #0x10 +_0221C854: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #0xf + bls _0221C824 + mov r2, #3 + add r0, sp, #0 + strb r2, [sp] + strh r4, [sp, #2] + bl MBi_MakeParentSendBuffer + movs r1, r0 + beq _0221C8A4 + ldr r0, _0221C8C0 ; =mbc + ldr r3, _0221C8C8 ; =0x000005D4 + ldr r0, [r0] + mov r2, #0xe4 + add r0, r0, #0x388 + add r0, r0, #0x1400 + mla r0, r4, r3, r0 + bl MI_CpuCopy8 +_0221C8A4: + ldr r0, _0221C8C0 ; =mbc + mov r1, r5 + ldr r2, [r0] + mov r0, #0xea + bl MBi_BlockHeaderEnd + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221C8C0: .word mbc +_0221C8C4: .word _02245980 +_0221C8C8: .word 0x000005D4 + arm_func_end MBi_CommParentSendDLFileInfo + + arm_func_start MBi_ReloadCache +MBi_ReloadCache: ; 0x0221C8CC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x4c + ldr r5, [r0, #0x14] + ldr r4, [r0, #0x10] + ldr r1, [r5, #0x14] + add r0, r5, #0x10 + bl FS_FindArchive + movs r6, r0 + add r0, sp, #4 + ldreq r6, [r5, #0x18] + bl FS_InitFile + ldr r2, [r4] + mvn r0, #0 + str r0, [sp] + ldr r3, [r4, #4] + add r0, sp, #4 + mov r1, r6 + add r3, r2, r3 + bl FS_OpenFileDirect + cmp r0, #0 + beq _0221C948 + ldr r1, [r4, #8] + ldr r2, [r4, #4] + add r0, sp, #4 + bl FS_ReadFile + ldr r1, [r4, #4] + cmp r1, r0 + moveq r0, #2 + streq r0, [r4, #0xc] + add r0, sp, #4 + bl FS_CloseFile +_0221C948: + ldr r0, [r4, #0xc] + cmp r0, #2 + addeq sp, sp, #0x4c + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r0, #0 + str r0, [r4] + mov r0, #2 + str r0, [r4, #0xc] + add sp, sp, #0x4c + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end MBi_ReloadCache + + arm_func_start MBi_CommParentSendBlock +MBi_CommParentSendBlock: ; 0x0221C970 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + ldr r5, _0221CC00 ; =mbc + ldr r0, [r5] + add r0, r0, #0x1000 + ldrb r0, [r0, #0x524] + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0x15 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, _0221CC04 ; =0x000005D4 + mov r1, #0 +_0221C9A0: + ldr r0, [r5] + add r3, r0, #0x1000 + ldrb r0, [r3, #0x525] + add r0, r0, #1 + mov r2, r0, lsr #0x1f + rsb r0, r2, r0, lsl #28 + add r0, r2, r0, ror #28 + strb r0, [r3, #0x525] + ldr r2, [r5] + add r0, r2, #0x1000 + ldrb r0, [r0, #0x525] + mla r3, r0, r4, r2 + add r2, r3, #0x1000 + ldrb r2, [r2, #0xd52] + cmp r2, #0 + addne r2, r3, #0x1d00 + ldrneh r2, [r2, #0x4c] + cmpne r2, #0 + bne _0221C9FC + add r1, r1, #1 + and r1, r1, #0xff + cmp r1, #0x10 + blo _0221C9A0 +_0221C9FC: + cmp r1, #0x10 + addeq sp, sp, #0x18 + moveq r0, #0x15 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl MBi_calc_sendblock + ldr r0, _0221CC00 ; =mbc + ldr r2, _0221CC04 ; =0x000005D4 + ldr r6, [r0] + add r0, sp, #8 + add r1, r6, #0x1000 + ldrb r4, [r1, #0x525] + add r1, r6, #0x12c + add r3, r6, #0x388 + mul r5, r4, r2 + add r2, r6, r5 + add r2, r2, #0x1d00 + add r1, r1, #0x1c00 + add r3, r3, #0x1400 + ldrh r2, [r2, #0x48] + add r1, r1, r5 + add r3, r3, r5 + bl MBi_get_blockinfo + cmp r0, #0 + addeq sp, sp, #0x18 + moveq r0, #0x15 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _0221CC00 ; =mbc + mov r3, #4 + ldr r1, [r0] + strb r3, [sp] + add r2, r1, #0x1000 + ldrb r4, [r2, #0x525] + add r3, r3, #0x5d0 + add r0, sp, #0 + strh r4, [sp, #2] + ldrb r4, [r2, #0x525] + mla r2, r4, r3, r1 + add r2, r2, #0x1d00 + ldrh r2, [r2, #0x48] + strh r2, [sp, #4] + bl MBi_MakeParentSendBuffer + ldr r1, _0221CC00 ; =mbc + ldr r4, _0221CC04 ; =0x000005D4 + ldr r5, [r1] + ldrb r1, [sp, #0x14] + add r2, r5, #0x1000 + ldrb r2, [r2, #0x525] + ldr r6, [sp, #0x10] + ldr r3, [sp, #0xc] + mla r4, r2, r4, r5 + add r2, r4, r1, lsl #2 + add r5, r4, #0x1000 + ldr r4, [r5, #0xd58] + add r2, r2, #0x1000 + ldr r2, [r2, #0xd2c] + ldr r1, [r4, r1, lsl #2] + sub r2, r6, r2 + add r4, r2, r1 + ldr r5, [r5, #0xd54] + mov r2, r0 + mov r0, r5 + mov r1, r4 + bl MBi_ReadFromCache + cmp r0, #0 + bne _0221CBCC + ldr r0, _0221CC00 ; =mbc + ldr r0, [r0] + add r0, r0, #0xce0 + add r6, r0, #0x7000 + mov r0, r6 + bl MBi_IsTaskBusy + cmp r0, #0 + bne _0221CBC0 + ldr r0, [r5] + cmp r0, #0 + subne r0, r0, #1 + strne r0, [r5] + bne _0221CBC0 + add r2, r5, #0x30 + mov r7, #0 + mov r3, r7 + mov ip, r2 +_0221CB44: + add r0, r2, r3, lsl #4 + ldr r0, [r0, #0xc] + cmp r0, #2 + bne _0221CB70 + cmp r7, #0 + beq _0221CB6C + ldr r1, [r7] + ldr r0, [r2, r3, lsl #4] + cmp r1, r0 + bls _0221CB70 +_0221CB6C: + mov r7, ip +_0221CB70: + add r3, r3, #1 + cmp r3, #4 + add ip, ip, #0x10 + blt _0221CB44 + cmp r7, #0 + bne _0221CB8C + bl OS_Terminate +_0221CB8C: + mov r0, #2 + str r0, [r5] + mov r0, #1 + str r0, [r7, #0xc] + bic r0, r4, #0x1f + str r0, [r7] + str r7, [r6, #0x10] + ldr r1, _0221CC08 ; =MBi_ReloadCache + mov r0, r6 + mov r2, #0 + mov r3, #4 + str r5, [r6, #0x14] + bl MBi_SetTask +_0221CBC0: + add sp, sp, #0x18 + mov r0, #0x15 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221CBCC: + ldr r0, _0221CC00 ; =mbc + ldr r4, [sp, #0xc] + ldr r2, [r0] + ldr r1, _0221CC04 ; =0x000005D4 + add r0, r2, #0x1000 + ldrb r3, [r0, #0x525] + add r0, r4, #6 + mla r1, r3, r1, r2 + add r1, r1, #0x1d00 + ldrh r1, [r1, #0x4c] + bl MBi_BlockHeaderEnd + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221CC00: .word mbc +_0221CC04: .word 0x000005D4 +_0221CC08: .word MBi_ReloadCache + arm_func_end MBi_CommParentSendBlock + + arm_func_start MBi_CommParentSendData +MBi_CommParentSendData: ; 0x0221CC0C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + add r1, sp, #0 + mov r0, #0 + mov r2, #0xa + bl MIi_CpuClear16 + mov r3, #1 + ldr r0, _0221CD84 ; =mbc + mov r4, r3 + ldr ip, [r0] + mov r5, r3 + mov r0, r3 + mov r1, r3 + mov r2, r3 +_0221CC44: + add lr, ip, r3, lsl #2 + add lr, lr, #0x1000 + ldr lr, [lr, #0x4e4] + cmp lr, #0xb + addls pc, pc, lr, lsl #2 + b _0221CCD8 +_0221CC5C: ; jump table + b _0221CCD8 ; case 0 + b _0221CCD8 ; case 1 + b _0221CC8C ; case 2 + b _0221CCD8 ; case 3 + b _0221CCAC ; case 4 + b _0221CC9C ; case 5 + b _0221CCD8 ; case 6 + b _0221CCD8 ; case 7 + b _0221CCBC ; case 8 + b _0221CCD8 ; case 9 + b _0221CCD8 ; case 10 + b _0221CCCC ; case 11 +_0221CC8C: + ldrh lr, [sp] + orr lr, lr, r2, lsl r3 + strh lr, [sp] + b _0221CCD8 +_0221CC9C: + ldrh lr, [sp, #2] + orr lr, lr, r1, lsl r3 + strh lr, [sp, #2] + b _0221CCD8 +_0221CCAC: + ldrh lr, [sp, #4] + orr lr, lr, r0, lsl r3 + strh lr, [sp, #4] + b _0221CCD8 +_0221CCBC: + ldrh lr, [sp, #6] + orr lr, lr, r5, lsl r3 + strh lr, [sp, #6] + b _0221CCD8 +_0221CCCC: + ldrh lr, [sp, #8] + orr lr, lr, r4, lsl r3 + strh lr, [sp, #8] +_0221CCD8: + add r3, r3, #1 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + cmp r3, #0xf + bls _0221CC44 + ldrh r1, [sp, #6] + cmp r1, #0 + beq _0221CD04 + mov r0, #5 + bl MBi_CommParentSendMsg + b _0221CD64 +_0221CD04: + ldrh r1, [sp] + cmp r1, #0 + beq _0221CD1C + mov r0, #1 + bl MBi_CommParentSendMsg + b _0221CD64 +_0221CD1C: + ldrh r1, [sp, #8] + cmp r1, #0 + beq _0221CD34 + mov r0, #6 + bl MBi_CommParentSendMsg + b _0221CD64 +_0221CD34: + ldrh r1, [sp, #4] + cmp r1, #0 + beq _0221CD4C + mov r0, #2 + bl MBi_CommParentSendMsg + b _0221CD64 +_0221CD4C: + ldrh r0, [sp, #2] + cmp r0, #0 + beq _0221CD60 + bl MBi_CommParentSendDLFileInfo + b _0221CD64 +_0221CD60: + bl MBi_CommParentSendBlock +_0221CD64: + cmp r0, #0x15 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, pc} + ldr r1, _0221CD88 ; =0x0000FFFF + mov r0, #0 + bl MBi_CommParentSendMsg + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .balign 4, 0 +_0221CD84: .word mbc +_0221CD88: .word 0x0000FFFF + arm_func_end MBi_CommParentSendData + + arm_func_start MBi_calc_sendblock +MBi_calc_sendblock: ; 0x0221CD8C + ldr r1, _0221CDFC ; =_02247480 + mov r2, #1 + ldr r1, [r1] + tst r1, r2, lsl r0 + bxeq lr + ldr r2, _0221CE00 ; =mbc + ldr r1, _0221CE04 ; =0x000005D4 + ldr r2, [r2] + mla ip, r0, r1, r2 + add r0, ip, #0x1000 + ldrb r0, [r0, #0xd52] + cmp r0, #0 + addne r0, ip, #0x1d00 + ldrneh r1, [r0, #0x4c] + cmpne r1, #0 + bxeq lr + ldrh r2, [r0, #0x48] + ldrh r3, [r0, #0x4a] + cmp r3, r2 + bhi _0221CDF0 + add r1, r3, #2 + cmp r2, r1 + addle r1, r2, #1 + strleh r1, [r0, #0x48] + bxle lr +_0221CDF0: + add r0, ip, #0x1d00 + strh r3, [r0, #0x48] + bx lr + .balign 4, 0 +_0221CDFC: .word _02247480 +_0221CE00: .word mbc +_0221CE04: .word 0x000005D4 + arm_func_end MBi_calc_sendblock + + arm_func_start MBi_calc_nextsendblock +MBi_calc_nextsendblock: ; 0x0221CE08 + cmp r1, r0 + movls r1, r0 + mov r0, r1 + bx lr + arm_func_end MBi_calc_nextsendblock + + arm_func_start IsChildAidValid +IsChildAidValid: ; 0x0221CE18 + cmp r0, #1 + blo _0221CE2C + cmp r0, #0xf + movls r0, #1 + bxls lr +_0221CE2C: + mov r0, #0 + bx lr + arm_func_end IsChildAidValid + + arm_func_start MBi_CommCallParentError +MBi_CommCallParentError: ; 0x0221CE34 + stmdb sp!, {r3, lr} + strh r1, [sp] + add r2, sp, #0 + mov r1, #0xd + bl MBi_CommChangeParentStateCallbackOnly + ldmia sp!, {r3, pc} + arm_func_end MBi_CommCallParentError + + arm_func_start MB_GetSegmentLength +MB_GetSegmentLength: ; 0x0221CE4C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x60 + mov r4, #0 + movs r7, r0 + mov r5, r4 + beq _0221CE98 + ldr ip, [r7, #0x2c] + ldr r3, [r7, #0x24] + add r1, sp, #0 + mov r2, #0x60 + sub r6, ip, r3 + bl FS_ReadFile + cmp r0, #0x60 + mov r0, r7 + mov r1, r6 + mov r2, #0 + addhs r4, sp, #0 + bl FS_SeekFile + b _0221CE9C +_0221CE98: + ldr r4, _0221CEC8 ; =0x027FFE00 +_0221CE9C: + cmp r4, #0 + beq _0221CEBC + ldr r1, [r4, #0x2c] + ldr r0, [r4, #0x3c] + add r1, r1, #0x268 + add r5, r1, r0 + cmp r5, #0x10000 + movlo r5, #0x10000 +_0221CEBC: + mov r0, r5 + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221CEC8: .word 0x027FFE00 + arm_func_end MB_GetSegmentLength + + arm_func_start MB_ReadSegment +MB_ReadSegment: ; 0x0221CECC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x6c + str r2, [sp, #4] + cmp r2, #0x164 + mov r2, #0 + mov sl, r0 + mov sb, r1 + str r2, [sp, #0x10] + blo _0221D324 + ldr r4, [sp, #4] + mov r5, sb + str r2, [sp, #0xc] + mov r6, r2 + mov fp, r2 + cmp sl, #0 + add r5, r5, #0x160 + sub r4, r4, #0x160 + beq _0221CF44 + ldr r7, [sl, #0x2c] + ldr r3, [sl, #0x24] + mov r2, #0x160 + sub r3, r7, r3 + str r3, [sp, #8] + bl FS_ReadFile + cmp r0, #0x160 + ldr r7, [sb, #0x80] + movlt r4, fp + cmp r7, #0 + moveq r7, #0x1000000 + b _0221CFC0 +_0221CF44: + ldr r0, _0221D330 ; =0x027FFE00 + mov r1, #1 + ldr r7, [r0, #0x80] + add r0, sp, #0x24 + cmp r7, #0 + moveq r7, #0x1000000 + str r1, [sp, #0xc] + bl FS_InitFile + ldr r0, _0221D334 ; =ov13_02245988 + mov r1, #3 + bl FS_FindArchive + mov r1, r0 + mvn r0, #0 + str r0, [sp] + add r0, sp, #0x24 + mov r2, #0 + add r3, r7, #0x88 + bl FS_OpenFileDirect + ldr r2, [sp, #0x50] + ldr r1, [sp, #0x48] + ldr r0, _0221D330 ; =0x027FFE00 + sub r1, r2, r1 + str r1, [sp, #8] + mov r1, sb + mov r2, #0x160 + add sl, sp, #0x24 + bl MI_CpuCopy8 + ldr r0, [sb, #0x60] + orr r0, r0, #0x6000 + orr r0, r0, #0x400000 + str r0, [sb, #0x60] +_0221CFC0: + cmp r4, #0x88 + movlo r4, #0 + blo _0221CFF8 + ldr r1, [sp, #8] + mov r0, sl + add r1, r1, r7 + mov r2, #0 + bl FS_SeekFile + mov r0, sl + mov r1, r5 + mov r2, #0x88 + bl FS_ReadFile + add r5, r5, #0x88 + sub r4, r4, #0x88 +_0221CFF8: + cmp r4, #0x70 + blo _0221D070 + mov r0, r5 + mov r6, r5 + bl MBi_InitCache + mov r0, #3 + str r0, [sp] + mov r0, r6 + mov r1, #0 + mov r2, #0x160 + mov r3, sb + add r5, r5, #0x70 + sub r4, r4, #0x70 + bl MBi_AttachCacheBuffer + ldr r8, [sl, #8] + mov r7, #0 + b _0221D040 +_0221D03C: + add r7, r7, #1 +_0221D040: + cmp r7, #3 + bge _0221D054 + ldrsb r0, [r8, r7] + cmp r0, #0 + bne _0221D03C +_0221D054: + mov r0, r8 + mov r2, r7 + add r1, r6, #0x10 + bl MI_CpuCopy8 + str r7, [r6, #0x14] + str r8, [r6, #0x18] + b _0221D074 +_0221D070: + mov r4, #0 +_0221D074: + cmp r4, #0x10 + movlo r4, #0 + blo _0221D0C4 + mov r0, #0 + str r0, [r5] + ldr r1, [sl, #0x24] + ldr r0, [sp, #8] + ldr r2, [sb, #0x20] + add r0, r0, r1 + add r0, r2, r0 + str r0, [r5, #4] + ldr r1, [sl, #0x24] + ldr r0, [sp, #8] + ldr r2, [sb, #0x30] + add r0, r0, r1 + add r0, r2, r0 + mov fp, r5 + str r0, [r5, #8] + add r5, r5, #0x10 + sub r4, r4, #0x10 +_0221D0C4: + ldr r1, [sb, #0x2c] + ldr r0, [sb, #0x3c] + add r0, r1, r0 + cmp r4, r0 + blo _0221D16C + ldr r7, [sl, #0x24] + ldr r1, [fp, #4] + mov r0, sl + sub r1, r1, r7 + mov r2, #0 + bl FS_SeekFile + ldr r2, [sb, #0x2c] + mov r0, sl + mov r1, r5 + bl FS_ReadFile + mov r0, #3 + str r0, [sp] + ldr r1, [fp, #4] + ldr r2, [sb, #0x2c] + mov r0, r6 + mov r3, r5 + bl MBi_AttachCacheBuffer + ldr r1, [fp, #8] + ldr r4, [sb, #0x2c] + mov r0, sl + mov r2, #0 + sub r1, r1, r7 + bl FS_SeekFile + ldr r2, [sb, #0x3c] + mov r0, sl + add r1, r5, r4 + bl FS_ReadFile + mov r0, #3 + str r0, [sp] + ldr r1, [fp, #8] + ldr r2, [sb, #0x3c] + add r3, r5, r4 + mov r0, r6 + bl MBi_AttachCacheBuffer + mov r0, #1 + str r0, [sp, #0x10] + b _0221D240 +_0221D16C: + cmp r4, #0xcc00 + blo _0221D240 + ldr r7, [sl, #0x24] + ldr r4, [fp, #4] + mov r0, sl + sub r1, r4, r7 + mov r2, #0 + bl FS_SeekFile + mov r0, sl + mov r1, r5 + mov r2, #0x4400 + bl FS_ReadFile + mov r0, #3 + str r0, [sp] + mov r0, r6 + mov r1, r4 + mov r2, #0x4400 + mov r3, r5 + bl MBi_AttachCacheBuffer + add r1, r4, #0x4400 + mov r0, sl + sub r1, r1, r7 + mov r2, #0 + bl FS_SeekFile + mov r0, sl + add r1, r5, #0x4400 + mov r2, #0x4400 + bl FS_ReadFile + mov r0, #2 + str r0, [sp] + mov r0, r6 + add r1, r4, #0x4400 + mov r2, #0x4400 + add r3, r5, #0x4400 + bl MBi_AttachCacheBuffer + add r1, r4, #0x8800 + mov r0, sl + sub r1, r1, r7 + mov r2, #0 + bl FS_SeekFile + mov r0, sl + add r1, r5, #0x8800 + mov r2, #0x4400 + bl FS_ReadFile + mov r0, #2 + str r0, [sp] + add r1, r4, #0x8800 + add r3, r5, #0x8800 + mov r0, r6 + mov r2, #0x4400 + bl MBi_AttachCacheBuffer + mov r0, #1 + str r0, [sp, #0x10] +_0221D240: + ldr r1, [sp, #8] + mov r0, sl + mov r2, #0 + bl FS_SeekFile + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _0221D30C + add r0, sp, #0x24 + bl FS_CloseFile + ldr r0, [sp, #0x10] + cmp r0, #0 + beq _0221D30C + ldr r1, [sb, #0x20] + ldr r0, _0221D338 ; =mbi_seg_header + str r1, [sp, #0x14] + ldr r2, [sb, #0x28] + ldr r1, [sb, #0x20] + ldr r4, [r0] + sub r0, r2, r1 + str r0, [sp, #0x18] + ldr r2, [r6, #0x48] + ldr r1, [sb, #0x20] + add r0, sp, #0x14 + sub r1, r2, r1 + str r1, [sp, #0x1c] + ldr r1, [sp, #4] + mov r2, #0x8000 + str r1, [sp, #0x20] + mov r1, #0x4000 + mov r3, #1 + bl MBi_ReadSegmentHeader + ldr r0, [r4, #4] + cmp r0, #0 + beq _0221D2F4 + add r7, sp, #0x14 + mov r5, #0 +_0221D2D0: + ldmia r4, {r1, r2} + mov r0, r7 + mov r3, r5 + add r2, r1, r2 + bl MBi_ReadSegmentHeader + add r4, r4, #8 + ldr r0, [r4, #4] + cmp r0, #0 + bne _0221D2D0 +_0221D2F4: + ldr r1, [sb, #0x28] + ldr r2, _0221D33C ; =_start_AutoloadDoneCallback + ldr r3, [r6, #0x48] + ldr r0, _0221D340 ; =0xE12FFF1E + sub r1, r2, r1 + str r0, [r3, r1] +_0221D30C: + ldr r0, [sp, #0x10] + cmp r0, #0 + beq _0221D324 + ldr r1, [sp, #4] + mov r0, sb + bl DC_FlushRange +_0221D324: + ldr r0, [sp, #0x10] + add sp, sp, #0x6c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221D330: .word 0x027FFE00 +_0221D334: .word ov13_02245988 +_0221D338: .word mbi_seg_header +_0221D33C: .word _start_AutoloadDoneCallback +_0221D340: .word 0xE12FFF1E + arm_func_end MB_ReadSegment + + arm_func_start MBi_ReadSegmentHeader +MBi_ReadSegmentHeader: ; 0x0221D344 + stmdb sp!, {r3, lr} + mov lr, r1 + ldr ip, [r0] + ldr r1, [r0, #0xc] + cmp lr, #0x4000 + movlo lr, #0x4000 + cmp r2, #0x8000 + movhi r2, #0x8000 + cmp lr, ip + add r1, ip, r1 + movlo lr, ip + cmp r2, r1 + movhi r2, r1 + cmp lr, r2 + ldmhsia sp!, {r3, pc} + cmp r3, #0 + beq _0221D3A0 + ldr r0, [r0, #8] + sub r2, r2, lr + add r0, r0, lr + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r3, pc} +_0221D3A0: + ldr r3, [r0, #4] + ldr r1, [r0, #8] + add r0, r3, lr + add r1, r1, lr + sub r2, r2, lr + bl MI_CpuCopy8 + ldmia sp!, {r3, pc} + arm_func_end MBi_ReadSegmentHeader + + arm_func_start MB_RegisterFile +MB_RegisterFile: ; 0x0221D3BC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r0 + mov r7, r1 + mov r4, #0xff + bl OS_DisableInterrupts + mov r5, r0 + bl MBi_IsStarted + cmp r0, #0 + bne _0221D3F0 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221D3F0: + ldr r0, _0221D640 ; =mbc + ldr r0, [r0] + add r1, r0, #0x1000 + ldrb r1, [r1, #0x524] + add r1, r1, #1 + cmp r1, #0x10 + ble _0221D41C + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221D41C: + ldr r1, _0221D644 ; =0x000005D4 + mov r6, #0 +_0221D424: + mla r2, r6, r1, r0 + add r2, r2, #0x1000 + ldr r3, [r2, #0xd40] + cmp r3, r8 + bne _0221D448 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221D448: + ldrb r2, [r2, #0xd52] + cmp r2, #0 + moveq r4, r6 + beq _0221D468 + add r2, r6, #1 + and r6, r2, #0xff + cmp r6, #0x10 + blo _0221D424 +_0221D468: + cmp r6, #0x10 + bne _0221D480 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221D480: + ldr r1, _0221D644 ; =0x000005D4 + ldr r2, _0221D640 ; =mbc + mul r6, r4, r1 + add r0, r0, r6 + add r0, r0, #0x1000 + str r8, [r0, #0xd40] + ldr r0, [r2] + mov r1, r7 + add r0, r0, #0x388 + add r0, r0, #0x1400 + add sb, r0, r6 + mov r0, sb + bl MBi_MakeDownloadFileInfo + add r0, r8, #0x1c + add r1, sb, #0xc4 + mov r2, #0x20 + bl MI_CpuCopy8 + ldr r0, _0221D640 ; =mbc + mov r1, sb + ldr r0, [r0] + add r0, r0, #0x12c + add r0, r0, #0x1c00 + add r0, r0, r6 + bl MBi_MakeBlockInfoTable + cmp r0, #0 + bne _0221D4F8 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0221D4F8: + ldr r0, _0221D640 ; =mbc + mov r1, r8 + ldr r2, [r0] + add r0, r2, #0x6c + add r0, r0, #0x1800 + add r0, r0, r6 + add r2, r2, #0x1300 + bl MBi_MakeGameInfo + ldr r1, _0221D640 ; =mbc + ldr r0, [r1] + add r0, r0, r6 + add r0, r0, #0x1000 + strb r4, [r0, #0xd21] + ldr r0, [r1] + add r0, r0, #0x6c + add r0, r0, #0x1800 + add r0, r0, r6 + bl MB_AddGameInfo + ldr r2, _0221D640 ; =mbc + ldr r3, _0221D648 ; =ov13_02247484 + ldr r1, [r2] + ldrb r0, [r3] + add r1, r1, r6 + add r1, r1, #0x1000 + strb r0, [r1, #0xd1f] + ldr r1, [r2] + mov r4, #1 + add r1, r1, r6 + add r1, r1, #0x1d00 + strh r4, [r1, #0x4e] + ldr r1, [r2] + add r8, r7, #0x1e8 + add r1, r1, r6 + add r1, r1, #0x1000 + str r7, [r1, #0xd44] + ldr r1, [r2] + add r4, r7, #0x258 + add r1, r1, r6 + add r1, r1, #0x1000 + str r8, [r1, #0xd54] + ldr r1, [r2] + add r7, r0, #1 + add r0, r1, r6 + add r0, r0, #0x1000 + str r4, [r0, #0xd58] + ldr r0, [r2] + strb r7, [r3] + add r0, r0, r6 + add r0, r0, #0x1000 + ldr r0, [r0, #0xd54] + ldr r0, [r0, #0x6c] + cmp r0, #0 + beq _0221D604 + bl MBi_IsTaskAvailable + cmp r0, #0 + bne _0221D604 + ldr r0, _0221D640 ; =mbc + ldr r0, [r0] + add r0, r0, #0xce0 + add r0, r0, #0x7000 + bl MBi_InitTaskInfo + ldr r0, _0221D640 ; =mbc + mov r1, #0x800 + ldr r0, [r0] + add r0, r0, #0x4e0 + add r0, r0, #0x7000 + bl MBi_InitTaskThread +_0221D604: + ldr r2, _0221D640 ; =mbc + mov r3, #1 + ldr r1, [r2] + mov r0, r5 + add r1, r1, r6 + add r1, r1, #0x1000 + strb r3, [r1, #0xd52] + ldr r1, [r2] + add r1, r1, #0x1000 + ldrb r2, [r1, #0x524] + add r2, r2, #1 + strb r2, [r1, #0x524] + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0221D640: .word mbc +_0221D644: .word 0x000005D4 +_0221D648: .word ov13_02247484 + arm_func_end MB_RegisterFile + + arm_func_start MBi_MakeDownloadFileInfo +MBi_MakeDownloadFileInfo: ; 0x0221D64C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r2, #0x22c0000 + mov r4, r1 + mov r5, r0 + str r2, [sp] + ldr r0, [r4, #0x24] + ldr r7, _0221D6BC ; =MBi_defaultLoadSegList + str r0, [r5] + ldr r0, [r4, #0x34] + add r8, r5, #0xc + str r0, [r5, #4] + mov sb, #0 + add r6, sp, #0 +_0221D680: + mov r0, r4 + mov r1, r7 + mov r2, r8 + mov r3, r6 + bl MBi_SetSegmentInfo + add sb, sb, #1 + cmp sb, #3 + add r8, r8, #0x10 + add r7, r7, #4 + blt _0221D680 + add r0, r4, #0x160 + add r1, r5, #0x3c + mov r2, #0x88 + bl MI_CpuCopy8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0221D6BC: .word MBi_defaultLoadSegList + arm_func_end MBi_MakeDownloadFileInfo + + arm_func_start MBi_SetSegmentInfo +MBi_SetSegmentInfo: ; 0x0221D6C0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, [r1] + mov r7, r0 + mov r6, r2 + mov r5, r3 + cmp r1, #0 + beq _0221D6F0 + cmp r1, #1 + beq _0221D73C + cmp r1, #2 + beq _0221D80C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221D6F0: + ldr r0, [r7, #0x28] + cmp r0, #0x2000000 + blo _0221D734 + cmp r0, #0x22c0000 + bhs _0221D734 + ldr r1, [r7, #0x2c] + add r0, r0, r1 + cmp r0, #0x22c0000 + bhi _0221D734 + str r1, [r6, #8] + ldr r0, [r7, #0x28] + str r0, [r6, #4] + str r0, [r6] + ldr r0, [r6, #0xc] + bic r0, r0, #1 + str r0, [r6, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221D734: + bl OS_Terminate + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221D73C: + ldr ip, [r7, #0x38] + ldr r1, [r7, #0x3c] + mov r2, #0 + mov r4, r2 + cmp ip, #0x2000000 + add r3, ip, r1 + blo _0221D788 + ldr r0, _0221D82C ; =0x023FE800 + cmp ip, r0 + bhs _0221D788 + cmp r3, #0x2300000 + bls _0221D7B4 + cmp r3, r0 + bhs _0221D780 + cmp r1, #0x40000 + movls r4, #1 + bls _0221D7B4 +_0221D780: + mov r2, #1 + b _0221D7B4 +_0221D788: + ldr r1, _0221D830 ; =0x037F8000 + cmp ip, r1 + blo _0221D7B0 + add r0, r1, #0x17000 + cmp ip, r0 + bhs _0221D7B0 + cmp r3, r0 + movls r4, #1 + movhi r2, #1 + b _0221D7B4 +_0221D7B0: + mov r2, #1 +_0221D7B4: + cmp r2, #1 + bne _0221D7C0 + bl OS_Terminate +_0221D7C0: + ldr r0, [r7, #0x3c] + cmp r4, #0 + str r0, [r6, #8] + ldr r0, [r7, #0x38] + str r0, [r6, #4] + ldreq r0, [r6, #4] + streq r0, [r6] + beq _0221D7F8 + ldr r0, [r5] + str r0, [r6] + ldr r1, [r5] + ldr r0, [r6, #8] + add r0, r1, r0 + str r0, [r5] +_0221D7F8: + ldr r0, [r6, #0xc] + bic r0, r0, #1 + orr r0, r0, #1 + str r0, [r6, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221D80C: + ldr r0, _0221D834 ; =0x027FFE00 + mov r1, #0x160 + stmib r6, {r0, r1} + str r0, [r6] + ldr r0, [r6, #0xc] + bic r0, r0, #1 + str r0, [r6, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221D82C: .word 0x023FE800 +_0221D830: .word 0x037F8000 +_0221D834: .word 0x027FFE00 + arm_func_end MBi_SetSegmentInfo + + arm_func_start MBi_MakeBlockInfoTable +MBi_MakeBlockInfoTable: ; 0x0221D838 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + add r6, sl, #0xc + cmp r1, #0 + mov r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r2, r0 +_0221D854: + str r0, [sl, r2, lsl #2] + add r3, r1, r2, lsl #4 + add r2, r2, #1 + ldr r3, [r3, #0x14] + and r2, r2, #0xff + cmp r2, #3 + add r0, r0, r3 + blo _0221D854 + mov sb, #0 + ldr r4, _0221D900 ; =mbc + strh sb, [r6] + add r5, r1, #0xc +_0221D884: + ldr r0, [r4] + add r7, r5, sb, lsl #4 + add r0, r0, #0x1000 + ldr r1, [r0, #0x318] + ldr r8, [r7, #8] + add r0, r8, r1 + sub r0, r0, #1 + bl _u32_div_f + mov r1, sb, lsl #1 + ldrh r3, [r6, r1] + mov r2, r0, lsl #0x10 + ldr r1, [r7, #4] + add r2, r3, r2, lsr #16 + mov r3, r2, lsl #0x10 + mov r0, sb + mov r2, r8 + mov r7, r3, lsr #0x10 + bl IsAbleToLoad + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + cmp sb, #2 + addlo r0, r6, sb, lsl #1 + strloh r7, [r0, #2] + add r0, sb, #1 + and sb, r0, #0xff + strhsh r7, [sl, #0x12] + cmp sb, #3 + blo _0221D884 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .balign 4, 0 +_0221D900: .word mbc + arm_func_end MBi_MakeBlockInfoTable + + arm_func_start MBi_get_blockinfo +MBi_get_blockinfo: ; 0x0221D904 + stmdb sp!, {r3, r4, r5, lr} + ldrh r4, [r1, #0x12] + cmp r2, r4 + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, pc} + mov ip, #2 +_0221D91C: + add r4, r1, ip, lsl #1 + ldrh r4, [r4, #0xc] + cmp r2, r4 + bhs _0221D93C + sub r4, ip, #1 + mov ip, r4, lsl #0x18 + movs ip, ip, asr #0x18 + bpl _0221D91C +_0221D93C: + cmp ip, #0 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + ldr r4, _0221D9B4 ; =mbc + add r5, r1, ip, lsl #1 + ldr lr, [r4] + ldrh r5, [r5, #0xc] + add lr, lr, #0x1000 + ldr lr, [lr, #0x318] + sub r5, r2, r5 + mul r2, r5, lr + add r3, r3, #0xc + add r5, r3, ip, lsl #4 + ldr r3, [r5, #8] + sub lr, r3, r2 + str lr, [r0, #4] + ldr r3, [r4] + add r3, r3, #0x1000 + ldr r3, [r3, #0x318] + cmp lr, r3 + strhi r3, [r0, #4] + ldr r1, [r1, ip, lsl #2] + add r1, r2, r1 + str r1, [r0, #8] + ldr r1, [r5] + add r1, r2, r1 + str r1, [r0] + strb ip, [r0, #0xc] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221D9B4: .word mbc + arm_func_end MBi_get_blockinfo + + arm_func_start MBi_IsAbleToRecv +MBi_IsAbleToRecv: ; 0x0221D9B8 + ldr r3, _0221DA5C ; =MBi_defaultLoadSegList + ldr r0, [r3, r0, lsl #2] + cmp r0, #0 + beq _0221D9FC + cmp r0, #1 + beq _0221DA18 + cmp r0, #2 + bne _0221DA4C + ldr r0, _0221DA60 ; =0x027FFE00 + cmp r1, r0 + blo _0221DA54 + add r1, r1, r2 + add r0, r0, #0x160 + cmp r1, r0 + bhi _0221DA54 + mov r0, #1 + bx lr +_0221D9FC: + cmp r1, #0x2000000 + blo _0221DA54 + add r0, r1, r2 + cmp r0, #0x22c0000 + bhi _0221DA54 + mov r0, #1 + bx lr +_0221DA18: + cmp r1, #0x22c0000 + blo _0221DA30 + add r0, r1, r2 + cmp r0, #0x2300000 + movls r0, #1 + bxls lr +_0221DA30: + cmp r1, #0x2000000 + blo _0221DA54 + add r0, r1, r2 + cmp r0, #0x2300000 + bhi _0221DA54 + mov r0, #1 + bx lr +_0221DA4C: + mov r0, #0 + bx lr +_0221DA54: + mov r0, #0 + bx lr + .balign 4, 0 +_0221DA5C: .word MBi_defaultLoadSegList +_0221DA60: .word 0x027FFE00 + arm_func_end MBi_IsAbleToRecv + + arm_func_start IsAbleToLoad +IsAbleToLoad: ; 0x0221DA64 + stmdb sp!, {r3, lr} + ldr r3, _0221DB24 ; =MBi_defaultLoadSegList + ldr r3, [r3, r0, lsl #2] + cmp r3, #0 + beq _0221DA88 + cmp r3, #1 + beq _0221DA90 + cmp r3, #2 + bne _0221DB14 +_0221DA88: + bl MBi_IsAbleToRecv + ldmia sp!, {r3, pc} +_0221DA90: + cmp r1, #0x2000000 + blo _0221DAE8 + ldr r0, _0221DB28 ; =0x023FE800 + cmp r1, r0 + bhs _0221DAE8 + cmp r1, #0x2300000 + add r1, r1, r2 + bhs _0221DABC + cmp r1, #0x2300000 + movhi r0, #0 + ldmhiia sp!, {r3, pc} +_0221DABC: + cmp r1, #0x2300000 + movls r0, #1 + ldmlsia sp!, {r3, pc} + ldr r0, _0221DB28 ; =0x023FE800 + cmp r1, r0 + bhs _0221DAE0 + cmp r2, #0x40000 + movls r0, #1 + ldmlsia sp!, {r3, pc} +_0221DAE0: + mov r0, #0 + ldmia sp!, {r3, pc} +_0221DAE8: + ldr r3, _0221DB2C ; =0x037F8000 + cmp r1, r3 + blo _0221DB1C + add r0, r3, #0x17000 + cmp r1, r0 + bhs _0221DB1C + add r1, r1, r2 + cmp r1, r0 + movls r0, #1 + movhi r0, #0 + ldmia sp!, {r3, pc} +_0221DB14: + mov r0, #0 + ldmia sp!, {r3, pc} +_0221DB1C: + mov r0, #0 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221DB24: .word MBi_defaultLoadSegList +_0221DB28: .word 0x023FE800 +_0221DB2C: .word 0x037F8000 + arm_func_end IsAbleToLoad + + arm_func_start MBi_BlockHeaderEnd +MBi_BlockHeaderEnd: ; 0x0221DB30 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r4, r2 + add r2, r6, #0x1f + mov r5, r1 + mov r0, r4 + bic r1, r2, #0x1f + bl DC_FlushRange + bl DC_WaitWriteBufferEmpty + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl MBi_SendMP + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MBi_BlockHeaderEnd + + arm_func_start MBi_calc_cksum +MBi_calc_cksum: ; 0x0221DB68 + mov r3, r1, asr #1 + cmp r3, #0 + mov r2, #0 + ble _0221DB8C +_0221DB78: + ldrh r1, [r0], #2 + sub r3, r3, #1 + cmp r3, #0 + add r2, r2, r1 + bgt _0221DB78 +_0221DB8C: + mov r0, r2, lsl #0x10 + mov r0, r0, lsr #0x10 + add r1, r0, r2, lsr #16 + ldr r0, _0221DBB0 ; =0x0000FFFF + add r1, r1, r1, lsr #16 + eor r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + .balign 4, 0 +_0221DBB0: .word 0x0000FFFF + arm_func_end MBi_calc_cksum + + arm_func_start MBi_MakeGameInfo +MBi_MakeGameInfo: ; 0x0221DBB4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + mov r1, r6 + mov r0, #0 + mov r2, #0x4c0 + bl MIi_CpuClear16 + mov r0, #0 + strb r0, [r6, #0x4b2] + ldr r0, [r5, #0xc] + mov r1, r6 + mov r2, #1 + bl MBi_ReadIconInfo + cmp r0, #0 + moveq r7, #1 + ldr r0, [r5, #0x10] + mov r1, r6 + mov r2, #0 + movne r7, #0 + bl MBi_ReadIconInfo + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + orrs r0, r7, r0 + beq _0221DC34 + mov r3, #1 + mov r1, r6 + mov r0, #0 + mov r2, #0x220 + strb r3, [r6, #0x4b2] + bl MIi_CpuClearFast +_0221DC34: + ldr r0, [r5, #0x14] + cmp r4, #0 + str r0, [r6, #0x4b8] + beq _0221DC54 + mov r0, r4 + add r1, r6, #0x220 + mov r2, #0x16 + bl MIi_CpuCopy16 +_0221DC54: + ldrb r0, [r5, #0x18] + strb r0, [r6, #0x236] + ldr r0, [r5, #4] + bl mystrlen + mov r2, r0, lsl #0x11 + ldr r0, [r5, #4] + add r1, r6, #0x238 + mov r2, r2, lsr #0x10 + bl MIi_CpuCopy16 + ldr r0, [r5, #8] + add r1, r6, #0x298 + mov r2, #0xc0 + bl MIi_CpuCopy16 + mov r1, #1 + strb r1, [r6, #0x358] + add r0, r6, #0x300 + strh r1, [r0, #0x5a] + add r0, r6, #0x400 + strh r1, [r0, #0xb0] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end MBi_MakeGameInfo + + arm_func_start MBi_ReadIconInfo +MBi_ReadIconInfo: ; 0x0221DCA4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x48 + cmp r2, #0 + movne r4, #0x200 + moveq r4, #0x20 + mov r6, r0 + mov r5, r1 + cmp r2, #0 + addne r5, r5, #0x20 + cmp r6, #0 + addeq sp, sp, #0x48 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, sp, #0 + bl FS_InitFile + add r0, sp, #0 + mov r1, r6 + bl FS_OpenFile + cmp r0, #0 + addeq sp, sp, #0x48 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, [sp, #0x28] + ldr r0, [sp, #0x24] + sub r0, r1, r0 + cmp r4, r0 + add r0, sp, #0 + beq _0221DD24 + bl FS_CloseFile + add sp, sp, #0x48 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0221DD24: + mov r1, r5 + mov r2, r4 + bl FS_ReadFile + add r0, sp, #0 + bl FS_CloseFile + mov r0, #1 + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MBi_ReadIconInfo + + arm_func_start MB_UpdateGameInfoMember +MB_UpdateGameInfoMember: ; 0x0221DD44 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r5, r2 + add r4, r6, #0x5e + mov r0, r1 + add r1, r4, #0x300 + ldr r2, _0221DDB0 ; =0x0000014A + mov r4, r3 + mov r7, #1 + bl MIi_CpuCopy16 + mov r2, #0 + mov r1, #2 +_0221DD74: + tst r5, r1, lsl r2 + addne r0, r7, #1 + add r2, r2, #1 + andne r7, r0, #0xff + cmp r2, #0xf + blt _0221DD74 + strb r7, [r6, #0x358] + orr r1, r5, #1 + add r0, r6, #0x300 + strh r1, [r0, #0x5a] + strh r4, [r0, #0x5c] + ldrb r0, [r6, #0x4b4] + add r0, r0, #1 + strb r0, [r6, #0x4b4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221DDB0: .word 0x0000014A + arm_func_end MB_UpdateGameInfoMember + + arm_func_start mystrlen +mystrlen: ; 0x0221DDB4 + ldrh r1, [r0], #2 + mov r2, #0 + cmp r1, #0 + beq _0221DDD4 +_0221DDC4: + ldrh r1, [r0], #2 + add r2, r2, #1 + cmp r1, #0 + bne _0221DDC4 +_0221DDD4: + mov r0, r2 + bx lr + arm_func_end mystrlen + + arm_func_start MB_AddGameInfo +MB_AddGameInfo: ; 0x0221DDDC + ldr r1, _0221DE1C ; =ov13_022474A0 + ldr r2, [r1, #0x18] + cmp r2, #0 + streq r0, [r1, #0x18] + beq _0221DE10 + ldr r1, [r2, #0x4bc] + cmp r1, #0 + beq _0221DE0C +_0221DDFC: + mov r2, r1 + ldr r1, [r1, #0x4bc] + cmp r1, #0 + bne _0221DDFC +_0221DE0C: + str r0, [r2, #0x4bc] +_0221DE10: + mov r1, #0 + str r1, [r0, #0x4bc] + bx lr + .balign 4, 0 +_0221DE1C: .word ov13_022474A0 + arm_func_end MB_AddGameInfo + + arm_func_start MB_InitSendGameInfoStatus +MB_InitSendGameInfoStatus: ; 0x0221DE20 + ldr r0, _0221DE44 ; =ov13_022474A0 + mov r2, #0 + str r2, [r0, #0x18] + str r2, [r0, #0x1c] + mov r1, #1 + strb r1, [r0, #0x24] + ldr ip, _0221DE48 ; =MBi_ClearSendStatus + str r2, [r0, #0x14] + bx ip + .balign 4, 0 +_0221DE44: .word ov13_022474A0 +_0221DE48: .word MBi_ClearSendStatus + arm_func_end MB_InitSendGameInfoStatus + + arm_func_start MBi_ClearSendStatus +MBi_ClearSendStatus: ; 0x0221DE4C + ldr r0, _0221DE6C ; =ov13_022474A0 + mov r1, #0 + strb r1, [r0, #0x25] + strb r1, [r0, #0x26] + strb r1, [r0, #0x27] + strb r1, [r0, #0x28] + strb r1, [r0, #0x29] + bx lr + .balign 4, 0 +_0221DE6C: .word ov13_022474A0 + arm_func_end MBi_ClearSendStatus + + arm_func_start MB_SendGameInfoBeacon +MB_SendGameInfoBeacon: ; 0x0221DE70 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _0221DEF8 ; =ov13_022474A0 + mov r7, r0 + mov r6, r1 + mov r5, r2 +_0221DE84: + ldrb r0, [r4, #0x24] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _0221DE84 +_0221DE94: ; jump table + b _0221DEB0 ; case 0 + b _0221DEB0 ; case 1 + b _0221DEC0 ; case 2 + b _0221DEC8 ; case 3 + b _0221DEDC ; case 4 + b _0221DEE4 ; case 5 + b _0221DE84 ; case 6 +_0221DEB0: + bl MBi_ReadyBeaconSendStatus + cmp r0, #0 + bne _0221DE84 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221DEC0: + bl MBi_InitSendFixedBeacon + b _0221DE84 +_0221DEC8: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl MBi_SendFixedBeacon + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0221DEDC: + bl MBi_InitSendVolatBeacon + b _0221DE84 +_0221DEE4: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl MBi_SendVolatBeacon + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221DEF8: .word ov13_022474A0 + arm_func_end MB_SendGameInfoBeacon + + arm_func_start MBi_ReadyBeaconSendStatus +MBi_ReadyBeaconSendStatus: ; 0x0221DEFC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r0, _0221DF94 ; =ov13_022474A0 + ldr r1, [r0, #0x18] + cmp r1, #0 + bne _0221DF4C + bl MBi_GetGgid + mov r4, r0 + bl MBi_GetTgid + str r0, [sp] + mov ip, #8 + ldr r1, _0221DF98 ; =bsendBuff + mov r3, r4 + mov r0, #0 + mov r2, #0x70 + str ip, [sp, #4] + bl WM_SetGameInfo + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, pc} +_0221DF4C: + ldr r0, [r0, #0x1c] + cmp r0, #0 + ldrne r1, [r0, #0x4bc] + cmpne r1, #0 + ldreq r0, _0221DF94 ; =ov13_022474A0 + ldreq r1, [r0, #0x18] + ldr r0, _0221DF94 ; =ov13_022474A0 + str r1, [r0, #0x1c] + bl MBi_ClearSendStatus + ldr r1, _0221DF94 ; =ov13_022474A0 + mov r2, #2 + ldr r3, [r1, #0x1c] + mov r0, #1 + ldrb r3, [r3, #0x4b4] + strb r3, [r1, #0x26] + strb r2, [r1, #0x24] + add sp, sp, #8 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221DF94: .word ov13_022474A0 +_0221DF98: .word bsendBuff + arm_func_end MBi_ReadyBeaconSendStatus + + arm_func_start MBi_InitSendFixedBeacon +MBi_InitSendFixedBeacon: ; 0x0221DF9C + ldr r0, _0221DFEC ; =ov13_022474A0 + ldrb r1, [r0, #0x24] + cmp r1, #2 + bxne lr + ldr r2, [r0, #0x1c] + ldrb r1, [r2, #0x4b2] + cmp r1, #0 + bne _0221DFCC + mov r1, #9 + strb r1, [r0, #0x28] + str r2, [r0, #0x20] + b _0221DFDC +_0221DFCC: + mov r1, #4 + strb r1, [r0, #0x28] + add r1, r2, #0x220 + str r1, [r0, #0x20] +_0221DFDC: + ldr r0, _0221DFEC ; =ov13_022474A0 + mov r1, #3 + strb r1, [r0, #0x24] + bx lr + .balign 4, 0 +_0221DFEC: .word ov13_022474A0 + arm_func_end MBi_InitSendFixedBeacon + + arm_func_start MBi_SendFixedBeacon +MBi_SendFixedBeacon: ; 0x0221DFF0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r3, _0221E144 ; =ov13_022474A0 + mov r6, r0 + ldr r4, [r3, #0x1c] + ldr r0, [r3, #0x20] + add ip, r4, #0x358 + add r7, r0, #0x62 + cmp r7, ip + movls r0, #0x62 + mov r5, r1 + mov r4, r2 + strlsb r0, [r3, #0x4c] + bls _0221E048 + sub r7, ip, r0 + and r1, r7, #0xff + ldr r0, _0221E148 ; =bsendBuff + 0xE + rsb r2, r1, #0x62 + add r1, r0, r1 + mov r0, #0 + strb r7, [r3, #0x4c] + bl MIi_CpuClear16 +_0221E048: + ldr r0, _0221E144 ; =ov13_022474A0 + ldr r1, _0221E148 ; =bsendBuff + 0xE + ldrb r2, [r0, #0x4c] + ldr r0, [r0, #0x20] + bl MIi_CpuCopy16 + ldr r2, _0221E144 ; =ov13_022474A0 + ldr r0, _0221E14C ; =bsendBuff + 0x8 + ldrb r7, [r2, #0x27] + mov r3, #0 + mov r1, #0x68 + strb r7, [r2, #0x4a] + ldrb r7, [r2, #0x28] + strb r7, [r2, #0x4b] + ldr r7, [r2, #0x1c] + ldrb lr, [r2, #0x44] + ldrb ip, [r7, #0x4b2] + bic lr, lr, #3 + and ip, ip, #3 + orr ip, lr, ip + strb ip, [r2, #0x44] + ldrb ip, [r7, #0x4b3] + strb ip, [r2, #0x45] + ldrb ip, [r2, #0x26] + strb ip, [r2, #0x46] + ldr ip, [r7, #0x4b8] + str ip, [r2, #0x40] + ldrb lr, [r2, #0x44] + ldrb ip, [r7, #0x4b5] + bic lr, lr, #0xfc + mov ip, ip, lsl #0x1a + orr ip, lr, ip, lsr #24 + strb ip, [r2, #0x44] + ldrb lr, [r2, #0x29] + add ip, lr, #1 + strb ip, [r2, #0x29] + strb lr, [r2, #0x47] + strh r3, [r2, #0x48] + bl MBi_calc_cksum + ldr r1, _0221E144 ; =ov13_022474A0 + strh r0, [r1, #0x48] + ldrb r0, [r1, #0x27] + add r2, r0, #1 + strb r2, [r1, #0x27] + ldrb r0, [r1, #0x28] + and r2, r2, #0xff + cmp r2, r0 + movhs r0, #4 + strhsb r0, [r1, #0x24] + bhs _0221E118 + ldr r0, [r1, #0x20] + add r0, r0, #0x62 + str r0, [r1, #0x20] +_0221E118: + orr r0, r4, #3 + ldr r1, _0221E150 ; =bsendBuff + mov r3, r6 + str r5, [sp] + and r4, r0, #0xff + mov r0, #0 + mov r2, #0x70 + str r4, [sp, #4] + bl WM_SetGameInfo + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221E144: .word ov13_022474A0 +_0221E148: .word bsendBuff + 0xE +_0221E14C: .word bsendBuff + 0x8 +_0221E150: .word bsendBuff + arm_func_end MBi_SendFixedBeacon + + arm_func_start MBi_InitSendVolatBeacon +MBi_InitSendVolatBeacon: ; 0x0221E154 + ldr r1, _0221E180 ; =ov13_022474A0 + mov r3, #1 + ldr r0, [r1, #0x1c] + mov r2, #5 + add r0, r0, #0x400 + strh r3, [r0, #0xb0] + ldr r0, [r1, #0x1c] + ldrb r0, [r0, #0x4b4] + strb r0, [r1, #0x26] + strb r2, [r1, #0x24] + bx lr + .balign 4, 0 +_0221E180: .word ov13_022474A0 + arm_func_end MBi_InitSendVolatBeacon + + arm_func_start MBi_SendVolatBeacon +MBi_SendVolatBeacon: ; 0x0221E184 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r3, _0221E3DC ; =ov13_022474A0 + str r0, [sp, #8] + ldr r0, [r3, #0x1c] + ldrb r3, [r3, #0x26] + ldrb r0, [r0, #0x4b4] + str r1, [sp, #0xc] + str r2, [sp, #0x10] + cmp r3, r0 + beq _0221E1B4 + bl MBi_InitSendVolatBeacon +_0221E1B4: + ldr r2, _0221E3DC ; =ov13_022474A0 + ldrb r0, [r2, #0x44] + bic r0, r0, #3 + orr r0, r0, #2 + strb r0, [r2, #0x44] + ldr r0, [r2, #0x1c] + ldrb r3, [r0, #0x4b3] + add r1, r0, #0x300 + strb r3, [r2, #0x45] + ldrb r3, [r2, #0x26] + strb r3, [r2, #0x46] + ldr r3, [r0, #0x4b8] + str r3, [r2, #0x40] + ldrb r4, [r2, #0x44] + ldrb r3, [r0, #0x4b5] + bic r4, r4, #0xfc + mov r3, r3, lsl #0x1a + orr r3, r4, r3, lsr #24 + strb r3, [r2, #0x44] + ldrb r4, [r2, #0x29] + add r3, r4, #1 + strb r3, [r2, #0x29] + strb r4, [r2, #0x47] + ldrb r3, [r0, #0x358] + strb r3, [r2, #0x4a] + ldrh r3, [r1, #0x5a] + strh r3, [r2, #0x4c] + ldrh r1, [r1, #0x5c] + strh r1, [r2, #0x4e] + ldr r1, [r2, #0x10] + cmp r1, #0 + bne _0221E248 + ldr r1, [r2, #0x14] + cmp r1, #0 + beq _0221E248 + ldr r0, [r0, #0x4b8] + blx r1 +_0221E248: + ldr r0, _0221E3DC ; =ov13_022474A0 + mov sb, #0 + ldr r1, _0221E3E0 ; =bsendBuff + 0x68 + ldr r2, [r0, #0x1c] + b _0221E26C +_0221E25C: + add r0, r2, sb + ldrb r0, [r0, #0x4a8] + strb r0, [r1, sb] + add sb, sb, #1 +_0221E26C: + cmp sb, #8 + blt _0221E25C + ldr r1, _0221E3E4 ; =bsendBuff + 0x10 + mov r0, #0 + mov r2, #0x58 + bl MIi_CpuClear16 + ldr r5, _0221E3DC ; =ov13_022474A0 + mov sl, #0 + ldr r1, [r5, #0x1c] + mov r6, #2 + add r0, r1, #0x400 + add r1, r1, #0x300 + ldrh r2, [r0, #0xb0] + ldrh r0, [r1, #0x5a] + mov sb, sl + ldr r7, _0221E3E4 ; =bsendBuff + 0x10 + eor r0, r2, r0 + mov r4, r0, lsl #0x10 + mov r8, r6 + mov fp, #0x16 + b _0221E310 +_0221E2C0: + mov r0, r8, lsl sb + tst r0, r4, lsr #16 + beq _0221E30C + ldr r0, [r5, #0x1c] + mla r1, sl, fp, r7 + add r0, r0, #0x5e + add r2, r0, #0x300 + mov r0, #0x16 + mla r0, sb, r0, r2 + mov r2, #0x16 + bl MIi_CpuCopy16 + ldr r0, [r5, #0x1c] + add sl, sl, #1 + add r0, r0, #0x400 + ldrh r1, [r0, #0xb0] + cmp sl, #4 + orr r1, r1, r6, lsl sb + strh r1, [r0, #0xb0] + beq _0221E318 +_0221E30C: + add sb, sb, #1 +_0221E310: + cmp sb, #0xf + blt _0221E2C0 +_0221E318: + cmp sl, #4 + bhs _0221E338 + mov r0, #0x16 + mul r1, sl, r0 + ldr r2, _0221E3E4 ; =bsendBuff + 0x10 + ldrb r0, [r2, r1] + bic r0, r0, #0xf0 + strb r0, [r2, r1] +_0221E338: + ldr r2, _0221E3DC ; =ov13_022474A0 + mov r3, #0 + ldr r0, _0221E3E8 ; =bsendBuff + 0x8 + mov r1, #0x68 + strh r3, [r2, #0x48] + bl MBi_calc_cksum + ldr r2, _0221E3DC ; =ov13_022474A0 + strh r0, [r2, #0x48] + ldr r1, [r2, #0x1c] + add r0, r1, #0x400 + add r1, r1, #0x300 + ldrh r3, [r0, #0xb0] + ldrh r0, [r1, #0x5a] + ldr r1, _0221E3EC ; =bsendBuff + cmp r3, r0 + moveq r0, #1 + streqb r0, [r2, #0x24] + ldr r0, [sp, #0x10] + ldr r3, [sp, #8] + orr r2, r0, #3 + ldr r0, [sp, #0xc] + and r4, r2, #0xff + str r0, [sp] + mov r0, #0 + mov r2, #0x70 + str r4, [sp, #4] + bl WM_SetGameInfo + ldr r0, _0221E3DC ; =ov13_022474A0 + ldr r1, [r0, #0x10] + cmp r1, #1 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [r0, #0x14] + cmp r1, #0 + addeq sp, sp, #0x14 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r0, #0x1c] + ldr r0, [r0, #0x4b8] + blx r1 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221E3DC: .word ov13_022474A0 +_0221E3E0: .word bsendBuff + 0x68 +_0221E3E4: .word bsendBuff + 0x10 +_0221E3E8: .word bsendBuff + 0x8 +_0221E3EC: .word bsendBuff + arm_func_end MBi_SendVolatBeacon + + arm_func_start changeScanChannel +changeScanChannel: ; 0x0221E3F0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl WM_GetAllowedChannel + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrh lr, [r4, #4] + mov r2, #1 + mov ip, #0 + mov r5, lr + mov r3, r2 +_0221E41C: + sub r1, r5, #1 + tst r0, r3, lsl r1 + cmpne lr, r5 + strneh r5, [r4, #4] + bne _0221E458 + add r1, ip, #1 + mov r1, r1, lsl #0x10 + cmp r5, #0x10 + mov ip, r1, lsr #0x10 + moveq r1, r2 + addne r1, r5, #1 + mov r1, r1, lsl #0x10 + cmp ip, #0x10 + mov r5, r1, lsr #0x10 + blo _0221E41C +_0221E458: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end changeScanChannel + + arm_func_start MBi_IsSendEnabled +MBi_IsSendEnabled: ; 0x0221E460 + ldr r1, _0221E4BC ; =ov13_0224CF40 + mov r0, #0 + ldr ip, [r1, #8] + mov r3, r0 + add r1, ip, #0x500 + ldrh r1, [r1, #0x28] + mov r2, r0 + cmp r1, #1 + ldreqb r1, [ip, #0x50c] + cmpeq r1, #0 + moveq r3, #1 + cmp r3, #0 + beq _0221E4A4 + add r1, ip, #0x500 + ldrh r1, [r1, #0x26] + cmp r1, #0 + moveq r2, #1 +_0221E4A4: + cmp r2, #0 + addne r1, ip, #0x500 + ldrneh r1, [r1, #0x2a] + cmpne r1, #0 + movne r0, #1 + bx lr + .balign 4, 0 +_0221E4BC: .word ov13_0224CF40 + arm_func_end MBi_IsSendEnabled + + arm_func_start MBi_OnInitializeDone +MBi_OnInitializeDone: ; 0x0221E4C0 + stmdb sp!, {r3, lr} + ldr r0, _0221E508 ; =MBi_ParentCallback + bl WM_SetIndCallback + mov r1, r0 + mov r0, #0x80 + bl MBi_CheckWmErrcode + ldr r3, _0221E50C ; =ov13_0224598C + ldr r0, _0221E508 ; =MBi_ParentCallback + ldrh r1, [r3, #4] + str r1, [sp] + ldrh r1, [r3, #6] + ldrh r2, [r3, #2] + ldrh r3, [r3] + bl WM_SetLifeTime + mov r1, r0 + mov r0, #0x1d + bl MBi_CheckWmErrcode + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221E508: .word MBi_ParentCallback +_0221E50C: .word ov13_0224598C + arm_func_end MBi_OnInitializeDone + + arm_func_start MBi_EndCommon +MBi_EndCommon: ; 0x0221E510 + stmdb sp!, {r3, lr} + ldr r2, _0221E550 ; =ov13_0224CF40 + mov ip, #0 + ldr r3, [r2, #8] + mov r1, r0 + strb ip, [r3, #0x50d] + ldr r0, [r2, #0xc] + add r0, r0, #0x1300 + strh ip, [r0, #0x16] + ldr r0, [r2, #8] + ldr r2, [r0, #0x51c] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0x11 + blx r2 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221E550: .word ov13_0224CF40 + arm_func_end MBi_EndCommon + + arm_func_start MBi_ParentCallback +MBi_ParentCallback: ; 0x0221E554 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x1c + mov r4, r0 + ldrh r1, [r4] + cmp r1, #0x19 + bgt _0221E5BC + bge _0221E698 + cmp r1, #0xf + addls pc, pc, r1, lsl #2 + b _0221ED7C +_0221E57C: ; jump table + b _0221E5D8 ; case 0 + b _0221EB4C ; case 1 + b _0221EC3C ; case 2 + b _0221ED7C ; case 3 + b _0221ED7C ; case 4 + b _0221ED7C ; case 5 + b _0221ED7C ; case 6 + b _0221E660 ; case 7 + b _0221E734 ; case 8 + b _0221ED7C ; case 9 + b _0221ED7C ; case 10 + b _0221ED7C ; case 11 + b _0221ED7C ; case 12 + b _0221EC84 ; case 13 + b _0221E988 ; case 14 + b _0221EA28 ; case 15 +_0221E5BC: + cmp r1, #0x1d + bgt _0221E5CC + beq _0221E610 + b _0221ED7C +_0221E5CC: + cmp r1, #0x80 + beq _0221ECBC + b _0221ED7C +_0221E5D8: + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0221E604 + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E604: + bl MBi_OnInitializeDone + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E610: + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0221E63C + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E63C: + ldr r1, _0221ED9C ; =ov13_0224CF40 + ldr r0, _0221EDA0 ; =MBi_ParentCallback + ldr r1, [r1, #8] + bl WM_SetParentParameter + mov r1, r0 + mov r0, #7 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E660: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x15 + ldr r2, [r2, #0x51c] + blx r2 + ldr r0, _0221EDA0 ; =MBi_ParentCallback + mov r1, #1 + bl WM_SetBeaconIndication + mov r1, r0 + mov r0, #0x19 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E698: + ldr r2, _0221ED9C ; =ov13_0224CF40 + ldr ip, [r2, #8] + add r1, ip, #0x500 + ldrh r3, [r1, #0x26] + cmp r3, #0 + bne _0221E6F8 + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0221E6D4 + ldr r2, [ip, #0x51c] + mov r1, r4 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E6D4: + ldr r1, _0221EDA4 ; =ov13_0224598C + ldr r0, _0221EDA0 ; =MBi_ParentCallback + ldr r1, [r1, #0xc] + bl WMi_StartParentEx + mov r1, r0 + mov r0, #8 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E6F8: + ldrh r3, [r4, #2] + cmp r3, #0 + beq _0221E728 + mov r0, #0 + strh r0, [r1, #0x26] + ldr r0, [r2, #8] + mov r1, r4 + ldr r2, [r0, #0x51c] + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E728: + bl MBi_EndCommon + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E734: + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0221E760 + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E760: + ldrh r0, [r4, #8] + cmp r0, #7 + bgt _0221E790 + bge _0221E7D8 + cmp r0, #2 + bgt _0221E968 + cmp r0, #0 + blt _0221E968 + beq _0221E7B0 + cmp r0, #2 + beq _0221E934 + b _0221E968 +_0221E790: + cmp r0, #9 + bgt _0221E7A0 + beq _0221E8F8 + b _0221E968 +_0221E7A0: + cmp r0, #0x1a + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, pc} + b _0221E968 +_0221E7B0: + ldr r1, _0221ED9C ; =ov13_0224CF40 + mov r2, #0 + ldr r0, [r1, #8] + add sp, sp, #0x1c + add r0, r0, #0x500 + strh r2, [r0, #0x2a] + ldr r0, [r1, #8] + add r0, r0, #0x500 + strh r2, [r0, #0x28] + ldmia sp!, {r3, r4, pc} +_0221E7D8: + ldr r2, _0221ED9C ; =ov13_0224CF40 + ldr r0, [r2, #8] + add r0, r0, #0x500 + ldrh r1, [r0, #0x26] + cmp r1, #1 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, pc} + ldrh lr, [r0, #0x2a] + ldrh r3, [r4, #0x10] + mov ip, #1 + mov r1, r4 + orr r3, lr, ip, lsl r3 + strh r3, [r0, #0x2a] + ldr r2, [r2, #8] + mov r0, #0 + ldr r2, [r2, #0x51c] + blx r2 + ldr r1, _0221ED9C ; =ov13_0224CF40 + ldr r0, [r1, #8] + add r0, r0, #0x500 + ldrh r0, [r0, #0x28] + cmp r0, #0 + bne _0221E8C8 + ldr r0, [r1, #0xc] + add r0, r0, #0x1000 + ldr r2, [r0, #0x31c] + cmp r2, #0 + bne _0221E8C8 + mov r2, #1 + str r2, [r0, #0x31c] + ldr r0, [r1, #8] + ldr r1, _0221ED9C ; =ov13_0224CF40 + add r0, r0, #0x500 + ldrh r0, [r0, #0x2c] + ldr ip, [r1, #8] + mov r1, #1 + cmp r0, #0 + movne r2, #0 + mov r0, r2, lsl #0x10 + mov r3, r0, lsr #0x10 + add r0, ip, #0x500 + ldrh r4, [r0, #0x18] + mov r2, #0 + str r4, [sp] + str r3, [sp, #4] + str r2, [sp, #8] + str r2, [sp, #0xc] + str r2, [sp, #0x10] + str r1, [sp, #0x14] + str r1, [sp, #0x18] + ldrh r2, [r0, #0x1a] + ldr r1, [ip, #0x504] + ldr r0, _0221EDA0 ; =MBi_ParentCallback + add r3, ip, #0x40 + bl WM_StartMPEx + mov r1, r0 + mov r0, #0xe + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E8C8: + bl MBi_IsSendEnabled + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, pc} + ldr r1, _0221ED9C ; =ov13_0224CF40 + mov r0, #0x19 + ldr r2, [r1, #8] + mov r1, #0 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E8F8: + ldr r2, _0221ED9C ; =ov13_0224CF40 + ldrh r3, [r4, #0x10] + ldr r1, [r2, #8] + mov r0, #1 + add r1, r1, #0x500 + ldrh ip, [r1, #0x2a] + mvn r3, r0, lsl r3 + and r3, ip, r3 + strh r3, [r1, #0x2a] + ldr r2, [r2, #8] + mov r1, r4 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E934: + ldr r0, _0221ED9C ; =ov13_0224CF40 + ldr r1, [r0, #8] + add r0, r1, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #1 + addeq sp, sp, #0x1c + ldmeqia sp!, {r3, r4, pc} + ldr r2, [r1, #0x51c] + mov r1, r4 + mov r0, #0x1c + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E968: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E988: + ldr r2, _0221ED9C ; =ov13_0224CF40 + mov r1, #0 + ldr r0, [r2, #0xc] + add r0, r0, #0x1000 + str r1, [r0, #0x31c] + ldrh r0, [r4, #4] + cmp r0, #0xa + beq _0221E9B4 + cmp r0, #0xb + beq _0221E9F0 + b _0221EA0C +_0221E9B4: + ldr r0, [r2, #8] + mov r3, #1 + add r0, r0, #0x500 + strh r3, [r0, #0x28] + ldr r2, [r2, #8] + add r0, r2, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, pc} + ldr r2, [r2, #0x51c] + mov r0, #0x19 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221E9F0: + ldr r0, [r2, #8] + ldr r1, [r4, #8] + ldr r2, [r0, #0x51c] + mov r0, #3 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EA0C: + ldr r0, [r2, #8] + mov r1, r4 + ldr r2, [r0, #0x51c] + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EA28: + ldr r0, _0221ED9C ; =ov13_0224CF40 + ldr r3, [r0, #0xc] + add r0, r3, #0x7000 + ldr r0, [r0, #0x4c8] + cmp r0, #0 + beq _0221EA84 + mov r2, #0 + mov r1, r2 +_0221EA48: + add r0, r3, r1, lsl #2 + add r0, r0, #0x1000 + ldr r0, [r0, #0x4e8] + cmp r0, #0 + beq _0221EA68 + add r2, r2, #1 + cmp r2, #2 + bhs _0221EA74 +_0221EA68: + add r1, r1, #1 + cmp r1, #0xf + blo _0221EA48 +_0221EA74: + cmp r2, #1 + bne _0221EA84 + ldr r0, _0221EDA8 ; =0x000032C8 + bl OS_SpinWait +_0221EA84: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r2, #0 + ldr r1, [r0, #8] + strb r2, [r1, #0x50c] + ldrh r1, [r4, #2] + cmp r1, #0 + bne _0221EAE8 + ldr r0, [r0, #8] + mov r1, r4 + ldr r2, [r0, #0x51c] + mov r0, #2 + blx r2 + ldr r0, _0221ED9C ; =ov13_0224CF40 + ldr r1, [r0, #8] + add r0, r1, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, pc} + ldr r2, [r1, #0x51c] + mov r0, #0x19 + mov r1, #0 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EAE8: + cmp r1, #0xa + ldr r0, [r0, #8] + mov r1, r4 + bne _0221EB0C + ldr r2, [r0, #0x51c] + mov r0, #0x2a + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EB0C: + ldr r2, [r0, #0x51c] + mov r0, #0x13 + blx r2 + ldr r0, _0221ED9C ; =ov13_0224CF40 + ldr r1, [r0, #8] + add r0, r1, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, pc} + ldr r2, [r1, #0x51c] + mov r0, #0x19 + mov r1, #0 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EB4C: + ldr r1, _0221ED9C ; =ov13_0224CF40 + ldr r0, [r1, #0xc] + add r0, r0, #0x1000 + ldr r0, [r0, #0x320] + cmp r0, #0 + bne _0221EBC8 + ldrh r0, [r4, #2] + mov r2, #0 + cmp r0, #0 + ldr r0, [r1, #8] + add r0, r0, #0x500 + beq _0221EB9C + strh r2, [r0, #0x26] + ldr r0, [r1, #8] + mov r1, r4 + ldr r2, [r0, #0x51c] + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EB9C: + strh r2, [r0, #0x2a] + ldr r1, [r1, #8] + ldr r0, _0221EDA0 ; =MBi_ParentCallback + add r1, r1, #0x500 + strh r2, [r1, #0x28] + bl WM_End + mov r1, r0 + mov r0, #2 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EBC8: + mov r1, #0 + mov r2, r1 + mov r0, #1 + bl WM_SetPortCallback + mov r0, #0 + bl WM_SetIndCallback + ldrh r0, [r4, #2] + cmp r0, #0 + beq _0221EC1C + ldr r2, _0221ED9C ; =ov13_0224CF40 + mov r3, #0 + ldr r0, [r2, #8] + mov r1, r4 + add r0, r0, #0x500 + strh r3, [r0, #0x26] + ldr r2, [r2, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EC1C: + ldr r0, _0221EDA0 ; =MBi_ParentCallback + mov r1, #0 + bl WM_SetBeaconIndication + mov r1, r0 + mov r0, #0x19 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EC3C: + ldrh r1, [r4, #2] + cmp r1, #0 + beq _0221EC78 + ldr r2, _0221ED9C ; =ov13_0224CF40 + mov r3, #0 + ldr r0, [r2, #8] + mov r1, r4 + add r0, r0, #0x500 + strh r3, [r0, #0x26] + ldr r2, [r2, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EC78: + bl MBi_EndCommon + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221EC84: + ldrh r0, [r4, #2] + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, pc} + ldr r0, _0221ED9C ; =ov13_0224CF40 + ldrh r1, [r4, #0xa] + ldr r0, [r0, #8] + add sp, sp, #0x1c + add r0, r0, #0x500 + ldrh r2, [r0, #0x2a] + mvn r1, r1 + and r1, r2, r1 + strh r1, [r0, #0x2a] + ldmia sp!, {r3, r4, pc} +_0221ECBC: + ldrh r0, [r4, #4] + sub r0, r0, #0x10 + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _0221ED94 +_0221ECD0: ; jump table + b _0221ECF0 ; case 0 + b _0221ED10 ; case 1 + b _0221ED30 ; case 2 + b _0221ED50 ; case 3 + b _0221ED94 ; case 4 + b _0221ED94 ; case 5 + b _0221ED70 ; case 6 + b _0221ED94 ; case 7 +_0221ECF0: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x1d + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221ED10: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x1f + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221ED30: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x20 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221ED50: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x21 + ldr r2, [r2, #0x51c] + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221ED70: + bl OS_Terminate + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} +_0221ED7C: + ldr r0, _0221ED9C ; =ov13_0224CF40 + mov r1, r4 + ldr r2, [r0, #8] + mov r0, #0x100 + ldr r2, [r2, #0x51c] + blx r2 +_0221ED94: + add sp, sp, #0x1c + ldmia sp!, {r3, r4, pc} + .balign 4, 0 +_0221ED9C: .word ov13_0224CF40 +_0221EDA0: .word MBi_ParentCallback +_0221EDA4: .word ov13_0224598C +_0221EDA8: .word 0x000032C8 + arm_func_end MBi_ParentCallback + + arm_func_start MBi_ChildPortCallback +MBi_ChildPortCallback: ; 0x0221EDAC + stmdb sp!, {r3, lr} + mov r1, r0 + ldrh r0, [r1, #2] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldrh r0, [r1, #4] + cmp r0, #0x15 + bgt _0221EDE8 + bge _0221EE00 + cmp r0, #9 + ldmgtia sp!, {r3, pc} + cmp r0, #7 + ldmltia sp!, {r3, pc} + cmpne r0, #9 + ldmia sp!, {r3, pc} +_0221EDE8: + cmp r0, #0x1a + ldmgtia sp!, {r3, pc} + cmp r0, #0x19 + ldmltia sp!, {r3, pc} + cmpne r0, #0x1a + ldmia sp!, {r3, pc} +_0221EE00: + ldr r2, _0221EE18 ; =ov13_0224CF40 + mov r0, #9 + ldr r2, [r2, #8] + ldr r2, [r2, #0x51c] + blx r2 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221EE18: .word ov13_0224CF40 + arm_func_end MBi_ChildPortCallback + + arm_func_start MBi_ChildCallback +MBi_ChildCallback: ; 0x0221EE1C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + mov r6, r0 + ldrh r2, [r6] + ldr r1, _0221F634 ; =ov13_0224CF40 + cmp r2, #0x1d + ldr r4, [r1, #8] + bgt _0221EEA8 + cmp r2, #0x1d + bge _0221EF14 + cmp r2, #0x15 + addls pc, pc, r2, lsl #2 + b _0221F61C +_0221EE50: ; jump table + b _0221EEB4 ; case 0 + b _0221F534 ; case 1 + b _0221F594 ; case 2 + b _0221F61C ; case 3 + b _0221F61C ; case 4 + b _0221F61C ; case 5 + b _0221F61C ; case 6 + b _0221F61C ; case 7 + b _0221F61C ; case 8 + b _0221F61C ; case 9 + b _0221EFB0 ; case 10 + b _0221F278 ; case 11 + b _0221F2C8 ; case 12 + b _0221F61C ; case 13 + b _0221F440 ; case 14 + b _0221F4B4 ; case 15 + b _0221F61C ; case 16 + b _0221F61C ; case 17 + b _0221F61C ; case 18 + b _0221F61C ; case 19 + b _0221F61C ; case 20 + b _0221F5D0 ; case 21 +_0221EEA8: + cmp r2, #0x80 + beq _0221F5F8 + b _0221F61C +_0221EEB4: + ldrh r0, [r6, #2] + ldr r2, [r4, #0x51c] + mov r1, r6 + cmp r0, #0 + beq _0221EED8 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221EED8: + mov r0, #0x15 + blx r2 + ldr r3, _0221F638 ; =ov13_0224598C + ldr r0, _0221F63C ; =MBi_ChildCallback + ldrh r1, [r3, #4] + str r1, [sp] + ldrh r1, [r3, #6] + ldrh r2, [r3, #2] + ldrh r3, [r3] + bl WM_SetLifeTime + mov r1, r0 + mov r0, #0x1d + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221EF14: + ldrh r0, [r6, #2] + cmp r0, #0 + beq _0221EF38 + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221EF38: + add r0, r4, #0x440 + str r0, [r1, #0x20] + ldrh r0, [r1, #0x24] + mov r2, #1 + cmp r0, #0 + moveq r0, #1 + streqh r0, [r1, #0x24] + ldr r0, _0221F634 ; =ov13_0224CF40 + ldrh r1, [r0, #0x26] + cmp r1, #0 + moveq r1, #0xc8 + streqh r1, [r0, #0x26] + ldr r0, _0221F634 ; =ov13_0224CF40 + mov r1, #0xff + strb r1, [r0, #0x28] + strb r1, [r0, #0x29] + strb r1, [r0, #0x2a] + strb r1, [r0, #0x2b] + strb r1, [r0, #0x2c] + strb r1, [r0, #0x2d] + str r2, [r4, #0x5e4] + ldr r0, _0221F63C ; =MBi_ChildCallback + ldr r1, _0221F640 ; =ov13_0224CF60 + str r2, [r4, #0x5e8] + bl WM_StartScan + mov r1, r0 + mov r0, #0xa + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221EFB0: + ldrh r0, [r6, #2] + cmp r0, #0 + beq _0221EFD4 + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221EFD4: + ldrh r0, [r6, #8] + cmp r0, #3 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #4 + beq _0221F200 + cmp r0, #5 + bne _0221F260 + add ip, r4, #0x600 + mov r5, #0 + add r0, r4, #0x500 + mov fp, #0x180 + b _0221F130 +_0221F008: + mla r2, r5, fp, ip + ldrb r3, [r6, #0xa] + ldrb r1, [r2, #0xca] + mov lr, #0 + mov sl, lr + cmp r3, r1 + ldreqb r1, [r2, #0xcb] + ldreqb r2, [r6, #0xb] + mov r7, lr + mov r8, lr + cmpeq r2, r1 + moveq sl, #1 + mov sb, lr + cmp sl, #0 + beq _0221F05C + mov r2, #0x180 + mla r2, r5, r2, ip + ldrb r1, [r6, #0xc] + ldrb r2, [r2, #0xcc] + cmp r1, r2 + moveq sb, #1 +_0221F05C: + cmp sb, #0 + beq _0221F07C + mov r1, #0x180 + mla r1, r5, r1, ip + ldrb r2, [r6, #0xd] + ldrb r1, [r1, #0xcd] + cmp r2, r1 + moveq r8, #1 +_0221F07C: + cmp r8, #0 + beq _0221F09C + mov r1, #0x180 + mla r1, r5, r1, ip + ldrb r2, [r6, #0xe] + ldrb r1, [r1, #0xce] + cmp r2, r1 + moveq r7, #1 +_0221F09C: + cmp r7, #0 + beq _0221F0BC + mov r1, #0x180 + mla r1, r5, r1, ip + ldrb r2, [r6, #0xf] + ldrb r1, [r1, #0xcf] + cmp r2, r1 + moveq lr, #1 +_0221F0BC: + cmp lr, #0 + beq _0221F12C + mov r0, #0x180 + mla r0, r5, r0, ip + ldrh r1, [r6, #0x36] + add sb, r6, #0x38 + add r8, r0, #0xf8 + strh r1, [r0, #0xf6] + mov r7, #8 +_0221F0E0: + ldmia sb!, {r0, r1, r2, r3} + stmia r8!, {r0, r1, r2, r3} + subs r7, r7, #1 + bne _0221F0E0 + add r1, r4, #0x600 + mov r0, #0x180 + mla r0, r5, r0, r1 + mov r1, #0xc0 + bl DC_InvalidateRange + ldr r1, _0221F634 ; =ov13_0224CF40 + add r2, r4, #0x600 + mov r0, #0x180 + mla r2, r5, r0, r2 + ldrh r0, [r1] + add r1, r4, #0x440 + mov r3, #0xc0 + bl MI_DmaCopy16 + str r5, [r4, #0x5ec] + b _0221F1A0 +_0221F12C: + add r5, r5, #1 +_0221F130: + ldrh r1, [r0, #0xe0] + cmp r5, r1 + blt _0221F008 + cmp r5, #0x10 + bge _0221F1A0 + mov r0, #0x180 + mla r1, r5, r0, ip + mov r0, r6 + add r7, r5, #1 + add r3, r4, #0x500 + add r1, r1, #0xc0 + mov r2, #0xb8 + strh r7, [r3, #0xe0] + bl MIi_CpuCopy16 + add r1, r4, #0x600 + mov r0, #0x180 + mla r0, r5, r0, r1 + mov r1, #0xc0 + bl DC_InvalidateRange + ldr r1, _0221F634 ; =ov13_0224CF40 + add r2, r4, #0x600 + mov r0, #0x180 + mla r2, r5, r0, r2 + ldrh r0, [r1] + add r1, r4, #0x440 + mov r3, #0xc0 + bl MI_DmaCopy16 + str r5, [r4, #0x5ec] +_0221F1A0: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #4 + blx r2 + ldr r0, [r4, #0x5e4] + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #0x5e8] + cmp r0, #0 + beq _0221F1E0 + ldr r0, _0221F640 ; =ov13_0224CF60 + bl changeScanChannel + cmp r0, #0 + bne _0221F1E0 + bl MBi_CommEnd +_0221F1E0: + ldr r0, _0221F63C ; =MBi_ChildCallback + ldr r1, _0221F640 ; =ov13_0224CF60 + bl WM_StartScan + mov r1, r0 + mov r0, #0xa + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F200: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #5 + blx r2 + ldr r0, [r4, #0x5e4] + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #0x5e8] + cmp r0, #0 + beq _0221F240 + ldr r0, _0221F640 ; =ov13_0224CF60 + bl changeScanChannel + cmp r0, #0 + bne _0221F240 + bl MBi_CommEnd +_0221F240: + ldr r0, _0221F63C ; =MBi_ChildCallback + ldr r1, _0221F640 ; =ov13_0224CF60 + bl WM_StartScan + mov r1, r0 + mov r0, #0xa + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F260: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F278: + ldrh r0, [r6, #2] + cmp r0, #0 + beq _0221F29C + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F29C: + ldr r1, [r4, #0x520] + mov r2, #0 + ldr r0, _0221F63C ; =MBi_ChildCallback + mov r3, #1 + str r2, [sp] + bl WM_StartConnectEx + mov r1, r0 + mov r0, #0xc + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F2C8: + ldrh r0, [r6, #2] + cmp r0, #0 + beq _0221F2F8 + add r0, r4, #0x500 + mov r1, #0 + strh r1, [r0, #0xe0] + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0xb + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F2F8: + ldrh r0, [r6, #8] + cmp r0, #9 + bgt _0221F324 + cmp r0, #6 + blt _0221F428 + beq _0221F334 + cmp r0, #7 + beq _0221F350 + cmp r0, #9 + beq _0221F400 + b _0221F428 +_0221F324: + cmp r0, #0x1a + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + b _0221F428 +_0221F334: + add r0, r4, #0x500 + mov r1, #0 + strh r1, [r0, #0x2a] + mov r1, #1 + strh r1, [r0, #0x28] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F350: + ldrh r2, [r6, #0xa] + add r0, r4, #0x500 + mov r1, r6 + strh r2, [r0, #0xe2] + ldr r2, [r4, #0x51c] + mov r0, #6 + blx r2 + ldr r1, _0221F644 ; =MBi_ChildPortCallback + add r3, r4, #0x500 + mov r0, #1 + mov r2, #0 + strh r0, [r3, #0x2a] + bl WM_SetPortCallback + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, r4, #0x500 + ldrh r0, [r0, #0x2c] + add r1, r4, #0x500 + ldrh r2, [r1, #0x18] + cmp r0, #0 + movne r0, #0 + moveq r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r2, [sp] + str r0, [sp, #4] + mov r0, #0 + str r0, [sp, #8] + str r0, [sp, #0xc] + str r0, [sp, #0x10] + mov r0, #1 + str r0, [sp, #0x14] + str r0, [sp, #0x18] + ldrh r2, [r1, #0x1a] + ldr r1, [r4, #0x504] + ldr r0, _0221F63C ; =MBi_ChildCallback + add r3, r4, #0x40 + bl WM_StartMPEx + mov r1, r0 + mov r0, #0xe + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F400: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0xa + blx r2 + add r0, r4, #0x500 + mov r1, #0 + strh r1, [r0, #0x2a] + strh r1, [r0, #0x28] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F428: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F440: + ldrh r0, [r6, #4] + cmp r0, #0xa + beq _0221F468 + cmp r0, #0xc + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #0xd + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + b _0221F49C +_0221F468: + add r0, r4, #0x500 + mov r1, #1 + strh r1, [r0, #0x28] + bl MBi_IsSendEnabled + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [r4, #0x51c] + mov r0, #0x19 + mov r1, #0 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F49C: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F4B4: + mov r0, #0 + strb r0, [r4, #0x50c] + ldrh r0, [r6, #2] + cmp r0, #0 + bne _0221F4DC + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #8 + blx r2 + b _0221F500 +_0221F4DC: + cmp r0, #9 + ldr r2, [r4, #0x51c] + mov r1, r6 + bne _0221F4F8 + mov r0, #0x29 + blx r2 + b _0221F500 +_0221F4F8: + mov r0, #0x12 + blx r2 +_0221F500: + ldr r0, _0221F634 ; =ov13_0224CF40 + ldr r0, [r0, #8] + add r0, r0, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #0 + addne sp, sp, #0x1c + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [r4, #0x51c] + mov r0, #0x19 + mov r1, #0 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F534: + ldrh r0, [r6, #2] + cmp r0, #0 + add r0, r4, #0x500 + beq _0221F564 + mov r1, #0 + strh r1, [r0, #0x26] + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F564: + mov r2, #0 + strh r2, [r0, #0x2a] + ldr r1, [r1, #8] + ldr r0, _0221F63C ; =MBi_ChildCallback + add r1, r1, #0x500 + strh r2, [r1, #0x28] + bl WM_End + mov r1, r0 + mov r0, #2 + bl MBi_CheckWmErrcode + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F594: + ldrh r1, [r6, #2] + cmp r1, #0 + beq _0221F5C4 + add r0, r4, #0x500 + mov r1, #0 + strh r1, [r0, #0x26] + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F5C4: + bl MBi_EndCommon + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F5D0: + bl MBi_IsSendEnabled + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [r4, #0x51c] + mov r0, #0x19 + mov r1, #0 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F5F8: + ldrh r0, [r6, #4] + cmp r0, #0x16 + beq _0221F610 + add sp, sp, #0x1c + cmp r0, #0x17 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F610: + bl OS_Terminate + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0221F61C: + ldr r2, [r4, #0x51c] + mov r1, r6 + mov r0, #0x100 + blx r2 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .balign 4, 0 +_0221F634: .word ov13_0224CF40 +_0221F638: .word ov13_0224598C +_0221F63C: .word MBi_ChildCallback +_0221F640: .word ov13_0224CF60 +_0221F644: .word MBi_ChildPortCallback + arm_func_end MBi_ChildCallback + + arm_func_start MBi_GetBeaconPeriodDispersion +MBi_GetBeaconPeriodDispersion: ; 0x0221F648 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r0, sp, #0 + bl OS_GetMacAddress + mov r1, #0 + add r2, sp, #0 + mov r3, r1 +_0221F664: + ldrb r0, [r2], #1 + add r1, r1, #1 + cmp r1, #6 + add r3, r3, r0 + blt _0221F664 + ldr r1, _0221F6A8 ; =0x027FFC3C + ldr r0, _0221F6AC ; =0xCCCCCCCD + ldr r1, [r1] + mov r2, #0x14 + add r1, r3, r1 + rsb r3, r1, r1, lsl #3 + umull r1, r0, r3, r0 + mov r0, r0, lsr #4 + umull r0, r1, r2, r0 + sub r0, r3, r0 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .balign 4, 0 +_0221F6A8: .word 0x027FFC3C +_0221F6AC: .word 0xCCCCCCCD + arm_func_end MBi_GetBeaconPeriodDispersion + + arm_func_start MB_Init +MB_Init: ; 0x0221F6B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r4, _0221F888 ; =ov13_0224CF40 + mov sb, r1 + ldr r1, [r4, #0xc] + mov r8, r2 + cmp r1, #0 + addne r1, r1, #0x1300 + ldrneh r1, [r1, #0x16] + mov r7, r3 + cmpne r1, #0 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r0, #0x1f + bic r4, r0, #0x1f + add r0, r4, #0x1f + add r0, r0, #0x1e00 + cmp r7, #0x10000 + bic r5, r0, #0x1f + bne _0221F704 + bl WM_GetNextTgid + mov r7, r0 +_0221F704: + bl OS_DisableInterrupts + ldr r3, _0221F88C ; =0x0000FFFF + ldr r1, _0221F890 ; =ov13_0224598C + mov r2, #5 + strh r3, [r1, #6] + strh r2, [r1] + mov r2, #0x28 + strh r2, [r1, #2] + mov r6, r0 + strh r2, [r1, #4] + mov r2, #1 + ldr r0, [sp, #0x20] + ldr r3, _0221F888 ; =ov13_0224CF40 + str r2, [r1, #0xc] + strh r0, [r3] + str r4, [r3, #8] + mov r1, r4 + mov r0, #0 + mov r2, #0x1e00 + str r5, [r3, #0xc] + bl MIi_CpuClear32 + mov r1, r5 + mov r0, #0 + mov r2, #0x1340 + bl MIi_CpuClear16 + ldrb r0, [sb, #1] + add r2, r4, #0x530 + mov r1, #0 + cmp r0, #0 + ble _0221F798 +_0221F77C: + add r0, sb, r1, lsl #1 + ldrh r0, [r0, #2] + add r1, r1, #1 + strh r0, [r2], #2 + ldrb r0, [sb, #1] + cmp r1, r0 + blt _0221F77C +_0221F798: + add r0, r4, #0x138 + add r3, r0, #0x400 + ldr r0, _0221F890 ; =ov13_0224598C + mov ip, #0 + ldr r1, [r0, #8] +_0221F7AC: + ldrh r2, [r1] + cmp r2, #0 + beq _0221F7D0 + add r1, r1, #2 + add ip, ip, #1 + str r1, [r0, #8] + cmp ip, #0x10 + strh r2, [r3], #2 + blt _0221F7AC +_0221F7D0: + mov r0, sb + add r1, r5, #0x1300 + mov r2, #0x16 + bl MI_CpuCopy8 + ldrb r0, [sb, #1] + cmp r0, #0xa + bhs _0221F7FC + add r0, r5, r0, lsl #1 + add r0, r0, #0x1300 + mov r1, #0 + strh r1, [r0, #2] +_0221F7FC: + add r0, r4, #0x500 + mov r1, #0x100 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r2, #0 + strh r2, [r0, #0x18] + strh r2, [r0, #0x1a] + mov r1, #1 + strh r1, [r0, #0x2c] + add r0, r5, #0x400 + str r0, [r4, #0x504] + strh r2, [r4, #0xe] + strh r2, [r4, #0x12] + strh r1, [r4, #0x16] + strh r2, [r4, #0x14] + str r8, [r4, #8] + strh r7, [r4, #0xc] + bl MBi_GetBeaconPeriodDispersion + add r0, r0, #0xc8 + strh r0, [r4, #0x18] + mov r0, #0xf + strh r0, [r4, #0x10] + mov r3, #0 + strb r3, [r4, #0x50c] + strb r3, [r4, #0x50d] + add r1, r5, #0x1300 + mov r2, #1 + mov r0, r6 + strh r2, [r1, #0x16] + add r1, r5, #0x1000 + str r3, [r1, #0x31c] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0221F888: .word ov13_0224CF40 +_0221F88C: .word 0x0000FFFF +_0221F890: .word ov13_0224598C + arm_func_end MB_Init + + arm_func_start MBi_IsCommSizeValid +MBi_IsCommSizeValid: ; 0x0221F894 + ldr r3, _0221F8FC ; =0x000001FE + cmp r0, r3 + bhi _0221F8A8 + cmp r0, #0xe4 + bhs _0221F8B0 +_0221F8A8: + mov r0, #0 + bx lr +_0221F8B0: + cmp r1, #0x10 + bhi _0221F8C0 + cmp r1, #8 + bhs _0221F8C8 +_0221F8C0: + mov r0, #0 + bx lr +_0221F8C8: + add r0, r0, #0x26 + mov r0, r0, lsl #2 + add r1, r1, #0x20 + add r0, r0, #0x4a + mov r1, r1, lsl #2 + add r3, r0, #0x100 + add r0, r1, #0x70 + mla r1, r2, r0, r3 + ldr r0, _0221F900 ; =0x000015E0 + cmp r1, r0 + movlt r0, #1 + movge r0, #0 + bx lr + .balign 4, 0 +_0221F8FC: .word 0x000001FE +_0221F900: .word 0x000015E0 + arm_func_end MBi_IsCommSizeValid + + arm_func_start MB_SetParentCommParam +MB_SetParentCommParam: ; 0x0221F904 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r1 + bl OS_DisableInterrupts + ldr r1, _0221F998 ; =ov13_0224CF40 + mov r6, r0 + ldr r1, [r1, #8] + ldrb r1, [r1, #0x50d] + cmp r1, #0 + beq _0221F938 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0221F938: + mov r0, r5 + mov r2, r4 + mov r1, #8 + bl MBi_IsCommSizeValid + cmp r0, #0 + bne _0221F960 + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0221F960: + ldr r2, _0221F998 ; =ov13_0224CF40 + mov r0, r6 + ldr r1, [r2, #8] + mov r3, #8 + strh r4, [r1, #0x10] + ldr r1, [r2, #8] + add r1, r1, #0x500 + strh r5, [r1] + ldr r1, [r2, #8] + add r1, r1, #0x500 + strh r3, [r1, #2] + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221F998: .word ov13_0224CF40 + arm_func_end MB_SetParentCommParam + + arm_func_start MBi_StartCommon +MBi_StartCommon: ; 0x0221F99C + stmdb sp!, {r4, lr} + ldr r2, _0221FA6C ; =ov13_0224CF40 + mov r3, #0 + ldr r1, [r2, #8] + mov r0, #0xa + add r1, r1, #0x500 + strh r3, [r1, #0x28] + ldr r1, [r2, #8] + add r1, r1, #0x500 + strh r3, [r1, #0x2a] + ldr r1, [r2, #8] + add r1, r1, #0x500 + strh r3, [r1, #0x26] + ldr r1, [r2, #8] + add r1, r1, #0x500 + strh r3, [r1, #0x48] + bl MBi_SetMaxScanTime + ldr r4, _0221FA6C ; =ov13_0224CF40 + ldr r0, [r4, #0xc] + add r0, r0, #0x1000 + ldr r0, [r0, #0x320] + cmp r0, #0 + bne _0221FA44 +_0221F9F8: + ldrh r2, [r4] + ldmib r4, {r0, r1} + ldr r1, [r1, #0x508] + bl WM_Initialize + cmp r0, #4 + beq _0221F9F8 + cmp r0, #2 + movne r0, #8 + ldmneia sp!, {r4, pc} + ldr r0, _0221FA6C ; =ov13_0224CF40 + ldr r0, [r0, #8] + ldr r0, [r0, #0x508] + bl WM_SetIndCallback + ldr r0, _0221FA6C ; =ov13_0224CF40 + mov r2, #1 + ldr r1, [r0, #8] + mov r0, #0 + strb r2, [r1, #0x50d] + ldmia sp!, {r4, pc} +_0221FA44: + ldr r0, [r4, #8] + ldr r0, [r0, #0x508] + bl WM_SetIndCallback + mov r0, r4 + ldr r0, [r0, #8] + mov r1, #1 + strb r1, [r0, #0x50d] + bl MBi_OnInitializeDone + mov r0, #0 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221FA6C: .word ov13_0224CF40 + arm_func_end MBi_StartCommon + + arm_func_start MBi_StartParentCore +MBi_StartParentCore: ; 0x0221FA70 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r3, _0221FC40 ; =ov13_0224CF40 + mov r4, r0 + ldr r0, [r3, #8] + ldr r2, _0221FC44 ; =0x000069C0 + strh r5, [r0, #0x32] + ldr r5, [r3, #0xc] + mov r0, #0 + add r1, r5, #0x1f + add r1, r1, #0x7d00 + bic r1, r1, #0x1f + str r1, [r3, #4] + add r1, r5, #0x1000 + ldr r6, [r1, #0x4e4] + add r1, r5, #0x1340 + bl MIi_CpuClear16 + mov r0, r6 + bl MB_CommSetParentStateCallback + ldr r1, _0221FC40 ; =ov13_0224CF40 + ldr r0, [r1, #8] + ldr r2, [r1, #0xc] + add r0, r0, #0x500 + ldrh r3, [r0] + add r0, r2, #0x1000 + sub r2, r3, #6 + str r2, [r0, #0x318] + ldr r0, [r1, #8] + add r0, r0, #0x500 + ldrh r0, [r0, #2] + bl MBi_SetChildMPMaxSize + ldr r0, _0221FC40 ; =ov13_0224CF40 + ldr r0, [r0, #0xc] + add r0, r0, #0x138 + add r0, r0, #0x1400 + bl MBi_SetParentPieceBuffer + mov r5, #0 + ldr r2, _0221FC40 ; =ov13_0224CF40 + mov r0, r5 + mvn r3, #0 +_0221FB14: + ldr r1, [r2, #0xc] + add r1, r1, r5, lsl #2 + add r1, r1, #0x1000 + str r0, [r1, #0x4e8] + ldr r1, [r2, #0xc] + add r1, r1, r5 + add r1, r1, #0x1000 + add r5, r5, #1 + strb r3, [r1, #0x526] + cmp r5, #0xf + blt _0221FB14 + ldr r3, _0221FC40 ; =ov13_0224CF40 + ldr r2, _0221FC48 ; =0x00005D40 + ldr r1, [r3, #0xc] + add r1, r1, #0x1000 + strb r0, [r1, #0x524] + ldr r1, [r3, #0xc] + add r1, r1, #0x388 + add r1, r1, #0x1400 + bl MIi_CpuClear16 + ldr r0, _0221FC40 ; =ov13_0224CF40 + mov r1, #0 + ldr r0, [r0, #0xc] + mov r2, #0x1e + add r0, r0, #0x354 + add r0, r0, #0x1400 + bl MI_CpuFill8 + ldr r1, _0221FC40 ; =ov13_0224CF40 + mov r2, #1 + ldr r0, [r1, #8] + ldr r3, _0221FC4C ; =MBi_CommParentCallback + add r0, r0, #0x500 + strh r2, [r0, #0x24] + ldr r0, [r1, #8] + ldr r2, _0221FC50 ; =MBi_ParentCallback + str r3, [r0, #0x51c] + ldr r0, [r1, #8] + str r2, [r0, #0x508] + ldr r2, [r1, #8] + add r0, r2, #0x500 + ldrh r0, [r0] + strh r0, [r2, #0x34] + ldr r0, [r1, #8] + ldrh r2, [r0, #0x34] + add r0, r0, #0x500 + add r2, r2, #0x23 + bic r2, r2, #0x1f + strh r2, [r0, #0x18] + ldr r2, [r1, #8] + add r0, r2, #0x500 + ldrh r0, [r0, #2] + strh r0, [r2, #0x36] + ldr r0, [r1, #8] + ldrh r1, [r0, #0x36] + add r0, r0, #0x500 + add r1, r1, #0xe + rsb r1, r1, r1, lsl #4 + add r1, r1, #0x29 + bic r1, r1, #0x1f + mov r1, r1, lsl #1 + strh r1, [r0, #0x1a] + bl MB_InitSendGameInfoStatus + bl MBi_StartCommon + mov r5, r0 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0xf + mov r1, #1 + bl PXI_IsCallbackReady + ldr r1, _0221FC40 ; =ov13_0224CF40 + ldr r1, [r1, #0xc] + add r1, r1, #0x7000 + str r0, [r1, #0x4c8] + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_0221FC40: .word ov13_0224CF40 +_0221FC44: .word 0x000069C0 +_0221FC48: .word 0x00005D40 +_0221FC4C: .word MBi_CommParentCallback +_0221FC50: .word MBi_ParentCallback + arm_func_end MBi_StartParentCore + + arm_func_start MB_StartParentFromIdle +MB_StartParentFromIdle: ; 0x0221FC54 + ldr r1, _0221FC70 ; =ov13_0224CF40 + ldr ip, _0221FC74 ; =MBi_StartParentCore + ldr r1, [r1, #0xc] + mov r2, #1 + add r1, r1, #0x1000 + str r2, [r1, #0x320] + bx ip + .balign 4, 0 +_0221FC70: .word ov13_0224CF40 +_0221FC74: .word MBi_StartParentCore + arm_func_end MB_StartParentFromIdle + + arm_func_start MBi_CallReset +MBi_CallReset: ; 0x0221FC78 + stmdb sp!, {r4, lr} + ldr r0, _0221FCAC ; =ov13_0224CF40 + ldr r0, [r0, #8] + ldr r0, [r0, #0x508] + bl WM_Reset + mov r4, r0 + mov r1, r4 + mov r0, #1 + bl MBi_CheckWmErrcode + cmp r4, #2 + moveq r4, #0 + mov r0, r4 + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221FCAC: .word ov13_0224CF40 + arm_func_end MBi_CallReset + + arm_func_start MBi_OnReset +MBi_OnReset: ; 0x0221FCB0 + ldr ip, _0221FCB8 ; =MBi_CallReset + bx ip + .balign 4, 0 +_0221FCB8: .word MBi_CallReset + arm_func_end MBi_OnReset + + arm_func_start MBi_CommEnd +MBi_CommEnd: ; 0x0221FCBC + stmdb sp!, {r3, r4, r5, lr} + mov r5, #1 + bl OS_DisableInterrupts + ldr r1, _0221FD48 ; =ov13_0224CF40 + mov r4, r0 + ldr r2, [r1, #8] + ldrb r0, [r2, #0x50d] + cmp r0, #0 + bne _0221FCEC + mov r0, #0 + bl MBi_EndCommon + b _0221FD38 +_0221FCEC: + add r0, r2, #0x500 + ldrh r0, [r0, #0x26] + cmp r0, #0 + bne _0221FD38 + mov r0, #0 + str r0, [r2, #0x5e4] + ldr r0, [r1, #8] + mov r1, r5 + add r0, r0, #0x500 + strh r1, [r0, #0x26] + bl MBi_IsTaskAvailable + cmp r0, #0 + beq _0221FD30 + ldr r0, _0221FD4C ; =MBi_OnReset + bl MBi_EndTaskThread + mov r5, #0 + b _0221FD38 +_0221FD30: + bl MBi_CallReset + mov r5, r0 +_0221FD38: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0221FD48: .word ov13_0224CF40 +_0221FD4C: .word MBi_OnReset + arm_func_end MBi_CommEnd + + arm_func_start MB_End +MB_End: ; 0x0221FD50 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _0221FD88 ; =ov13_0224CF40 + mov r4, r0 + ldr r0, [r1, #0xc] + add r0, r0, #0x1000 + ldr r0, [r0, #0x320] + cmp r0, #0 + bne _0221FD78 + bl OS_Terminate +_0221FD78: + bl MBi_CommEnd + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .balign 4, 0 +_0221FD88: .word ov13_0224CF40 + arm_func_end MB_End + + arm_func_start MB_DisconnectChild +MB_DisconnectChild: ; 0x0221FD8C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + ldr r0, _0221FF0C ; =MBi_ParentCallback + mov r1, r5 + bl WM_Disconnect + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0x10 + ldmhsia sp!, {r3, r4, r5, r6, r7, pc} + ldr r2, _0221FF10 ; =ov13_0224CF40 + sub r4, r5, #1 + ldr r0, [r2, #0xc] + mov r1, #0 + add r0, r0, r4, lsl #1 + add r0, r0, #0x1400 + strh r1, [r0, #0x8a] + ldr r0, [r2, #0xc] + mov r2, #4 + add r0, r0, #0xa8 + add r0, r0, #0x1400 + add r0, r0, r4, lsl #2 + bl MI_CpuFill8 + ldr r0, _0221FF10 ; =ov13_0224CF40 + mov r2, #0x16 + ldr r0, [r0, #0xc] + mov r1, #0 + add r0, r0, #0x1340 + mla r0, r4, r2, r0 + bl MI_CpuFill8 + mov r0, r5 + bl MBi_ClearParentPieceBuffer + ldr ip, _0221FF10 ; =ov13_0224CF40 + mov r2, #0 + ldr r0, [ip, #0xc] + sub r1, r2, #1 + add r0, r0, r4, lsl #1 + add r0, r0, #0x1700 + strh r2, [r0, #0x54] + ldr r3, [ip, #0xc] + add r0, r3, r4 + add r0, r0, #0x1500 + ldrsb r2, [r0, #0x26] + cmp r2, r1 + beq _0221FEAC + ldr r0, _0221FF14 ; =0x000005D4 + and r1, r2, #0xff + mul r0, r1, r0 + add r1, r3, r0 + add r3, r1, #0x1d00 + mov r2, #1 + ldrh r6, [r3, #0x4e] + mvn r1, r2, lsl r5 + and r6, r6, r1 + strh r6, [r3, #0x4e] + ldr r3, [ip, #0xc] + sub r6, r2, #2 + add r3, r3, r0 + add r3, r3, #0x1d00 + ldrh r7, [r3, #0x50] + mov lr, r4 + orr r2, r7, r2, lsl r5 + strh r2, [r3, #0x50] + ldr r2, [ip, #0xc] + add r2, r2, lr + add r2, r2, #0x1000 + strb r6, [r2, #0x526] + ldr r2, [ip, #0xc] + add r0, r2, r0 + add r0, r0, #0x1d00 + ldrh r2, [r0, #0x4c] + and r1, r2, r1 + strh r1, [r0, #0x4c] +_0221FEAC: + ldr r1, _0221FF10 ; =ov13_0224CF40 + mov ip, #1 + ldr r2, [r1, #0xc] + add r0, r2, #0x1500 + ldrh r0, [r0, #0x36] + tst r0, ip, lsl r5 + beq _0221FEF0 + add r0, r2, #0x1000 + ldrb r3, [r0, #0x535] + mvn r2, ip, lsl r5 + sub r3, r3, #1 + strb r3, [r0, #0x535] + ldr r0, [r1, #0xc] + add r0, r0, #0x1500 + ldrh r1, [r0, #0x36] + and r1, r1, r2 + strh r1, [r0, #0x36] +_0221FEF0: + ldr r0, _0221FF10 ; =ov13_0224CF40 + mov r1, #0 + ldr r0, [r0, #0xc] + add r0, r0, r4, lsl #2 + add r0, r0, #0x1000 + str r1, [r0, #0x4e8] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .balign 4, 0 +_0221FF0C: .word MBi_ParentCallback +_0221FF10: .word ov13_0224CF40 +_0221FF14: .word 0x000005D4 + arm_func_end MB_DisconnectChild + + arm_func_start MBi_SetMaxScanTime +MBi_SetMaxScanTime: ; 0x0221FF18 + ldr r1, _0221FF24 ; =ov13_0224CF40 + strh r0, [r1, #0x26] + bx lr + .balign 4, 0 +_0221FF24: .word ov13_0224CF40 + arm_func_end MBi_SetMaxScanTime + + arm_func_start MBi_SetMPData +MBi_SetMPData: ; 0x0221FF28 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldrh r4, [sp, #0x18] + mov r3, r2 + mov r2, r1 + str r4, [sp] + mov r4, #1 + str r4, [sp, #4] + mov r4, #3 + mov r1, #0 + str r4, [sp, #8] + bl WM_SetMPDataToPortEx + mov r4, r0 + mov r1, r4 + mov r0, #0xf + bl MBi_CheckWmErrcode + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end MBi_SetMPData + + arm_func_start MBi_SendMP +MBi_SendMP: ; 0x0221FF74 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, _0222004C ; =ov13_0224CF40 + mov r3, r1, lsl #0x10 + ldr r5, [ip, #8] + mov ip, r2, lsl #0x10 + add lr, r5, #0x500 + ldrh r4, [lr, #0x28] + mov r1, r0 + mov r2, r3, lsr #0x10 + cmp r4, #0 + ldrneh r0, [lr, #0x26] + mov r4, ip, lsr #0x10 + cmpne r0, #1 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldrh r0, [lr, #0x24] + cmp r0, #1 + beq _0221FFC8 + cmp r0, #2 + beq _02220010 + b _02220044 +_0221FFC8: + ldrh r0, [lr, #0x2c] + cmp r0, #0 + moveq r0, #0x3e8 + movne r0, #0 + mov r3, r0, lsl #0x10 + str r4, [sp] + ldr r0, [r5, #0x508] + mov r3, r3, lsr #0x10 + bl MBi_SetMPData + cmp r0, #2 + bne _02220004 + ldr r1, _0222004C ; =ov13_0224CF40 + mov r2, #1 + ldr r1, [r1, #8] + strb r2, [r1, #0x50c] +_02220004: + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02220010: + ldr r0, _02220050 ; =MBi_ChildCallback + mov r3, #0 + str r4, [sp] + bl MBi_SetMPData + cmp r0, #2 + bne _02220038 + ldr r1, _0222004C ; =ov13_0224CF40 + mov r2, #1 + ldr r1, [r1, #8] + strb r2, [r1, #0x50c] +_02220038: + cmp r0, #2 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_02220044: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_0222004C: .word ov13_0224CF40 +_02220050: .word MBi_ChildCallback + arm_func_end MBi_SendMP + + arm_func_start MBi_GetGgid +MBi_GetGgid: ; 0x02220054 + ldr r0, _02220064 ; =ov13_0224CF40 + ldr r0, [r0, #8] + ldr r0, [r0, #8] + bx lr + .balign 4, 0 +_02220064: .word ov13_0224CF40 + arm_func_end MBi_GetGgid + + arm_func_start MBi_GetTgid +MBi_GetTgid: ; 0x02220068 + ldr r0, _02220078 ; =ov13_0224CF40 + ldr r0, [r0, #8] + ldrh r0, [r0, #0xc] + bx lr + .balign 4, 0 +_02220078: .word ov13_0224CF40 + arm_func_end MBi_GetTgid + + arm_func_start MBi_GetAttribute +MBi_GetAttribute: ; 0x0222007C + ldr r0, _022200D8 ; =ov13_0224CF40 + ldr r1, [r0, #8] + ldrh r0, [r1, #0x12] + cmp r0, #0 + ldrh r0, [r1, #0xe] + movne r2, #2 + moveq r2, #0 + cmp r0, #0 + movne r3, #1 + ldrh r0, [r1, #0x14] + moveq r3, #0 + cmp r0, #0 + movne ip, #4 + ldrh r0, [r1, #0x16] + moveq ip, #0 + cmp r0, #0 + movne r1, #8 + orr r0, r3, r2 + moveq r1, #0 + orr r0, ip, r0 + orr r0, r1, r0 + and r0, r0, #0xff + bx lr + .balign 4, 0 +_022200D8: .word ov13_0224CF40 + arm_func_end MBi_GetAttribute + + arm_func_start MBi_IsStarted +MBi_IsStarted: ; 0x022200DC + ldr r0, _022200F8 ; =ov13_0224CF40 + ldr r0, [r0, #8] + ldrb r0, [r0, #0x50d] + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + bx lr + .balign 4, 0 +_022200F8: .word ov13_0224CF40 + arm_func_end MBi_IsStarted + + arm_func_start MBi_CheckWmErrcode +MBi_CheckWmErrcode: ; 0x022200FC + stmdb sp!, {r3, lr} + cmp r1, #2 + cmpne r1, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _02220130 ; =ov13_0224CF40 + strh r0, [sp] + ldr r0, [r2, #8] + strh r1, [sp, #2] + ldr r2, [r0, #0x51c] + add r1, sp, #0 + mov r0, #0xff + blx r2 + ldmia sp!, {r3, pc} + .balign 4, 0 +_02220130: .word ov13_0224CF40 + arm_func_end MBi_CheckWmErrcode + + arm_func_start MBi_InitCache +MBi_InitCache: ; 0x02220134 + ldr ip, _02220144 ; =MI_CpuFill8 + mov r1, #0 + mov r2, #0x70 + bx ip + .balign 4, 0 +_02220144: .word MI_CpuFill8 + arm_func_end MBi_InitCache + + arm_func_start MBi_AttachCacheBuffer +MBi_AttachCacheBuffer: ; 0x02220148 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r4, r0 + mov sb, r1 + mov r8, r2 + mov r7, r3 + bl OS_DisableInterrupts + add r6, r4, #0x30 + mov r5, r0 + add r4, r4, #0x70 +_0222016C: + cmp r6, r4 + blo _02220178 + bl OS_Terminate +_02220178: + ldr r0, [r6, #0xc] + cmp r0, #0 + bne _0222019C + str sb, [r6] + str r8, [r6, #4] + ldr r0, [sp, #0x20] + str r7, [r6, #8] + str r0, [r6, #0xc] + b _022201A4 +_0222019C: + add r6, r6, #0x10 + b _0222016C +_022201A4: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end MBi_AttachCacheBuffer + + arm_func_start MBi_ReadFromCache +MBi_ReadFromCache: ; 0x022201B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + mov r4, #0 + bl OS_DisableInterrupts + add r2, sb, #0x30 + add r1, sb, #0x70 + mov r5, r0 + cmp r2, r1 + bhs _02220238 +_022201E0: + ldr r0, [r2, #0xc] + cmp r0, #2 + blo _0222022C + ldr r0, [r2] + subs r0, r8, r0 + bmi _0222022C + ldr r3, [r2, #4] + add ip, r0, r6 + cmp ip, r3 + bhi _0222022C + ldr r3, [r2, #8] + mov r1, r7 + mov r2, r6 + add r0, r3, r0 + bl MI_CpuCopy8 + mov r0, #0 + str r0, [sb] + mov r4, #1 + b _02220238 +_0222022C: + add r2, r2, #0x10 + cmp r2, r1 + blo _022201E0 +_02220238: + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end MBi_ReadFromCache + + arm_func_start MBi_TaskThread +MBi_TaskThread: ; 0x02220248 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 +_02220250: + bl OS_DisableInterrupts + ldr r1, [r7, #0xc0] + mov r5, r0 + cmp r1, #0 + bne _0222028C + mov r6, #0 + mov r4, r6 +_0222026C: + mov r0, r7 + mov r1, r6 + bl OS_SetThreadPriority + mov r0, r4 + bl OS_SleepThread + ldr r0, [r7, #0xc0] + cmp r0, #0 + beq _0222026C +_0222028C: + ldr r4, [r7, #0xc0] + ldr r1, [r7, #0xc0] + mov r0, r7 + ldr r1, [r1] + str r1, [r7, #0xc0] + ldr r1, [r4, #4] + mov r1, r1, lsr #1 + bl OS_SetThreadPriority + mov r0, r5 + bl OS_RestoreInterrupts + ldr r1, [r4, #8] + cmp r1, #0 + beq _022202C8 + mov r0, r4 + blx r1 +_022202C8: + bl OS_DisableInterrupts + mov r5, r0 + mov r0, r7 + ldr r6, [r4, #0xc] + bl OS_GetThreadPriority + ldr r1, [r7, #0xc0] + cmp r1, #0 + moveq r1, #0 + beq _0222030C + ldr r1, [r7, #0xc0] + ldr r1, [r1, #4] + cmp r0, r1, lsr #1 + movhs r1, r0 + bhs _0222030C + ldr r1, [r7, #0xc0] + ldr r1, [r1, #4] + mov r1, r1, lsr #1 +_0222030C: + cmp r1, r0 + beq _0222031C + mov r0, r7 + bl OS_SetThreadPriority +_0222031C: + mov r0, #0 + str r0, [r4] + ldr r0, [r4, #4] + cmp r6, #0 + bic r0, r0, #1 + str r0, [r4, #4] + beq _02220340 + mov r0, r4 + blx r6 +_02220340: + add r0, r7, #0xc4 + cmp r4, r0 + beq _02220358 + mov r0, r5 + bl OS_RestoreInterrupts + b _02220250 +_02220358: + bl OS_ExitThread + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end MBi_TaskThread + + arm_func_start MBi_InitTaskThread +MBi_InitTaskThread: ; 0x02220360 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r0 + mov r6, r1 + bl OS_DisableInterrupts + ldr r1, _022203D8 ; =ov13_0224CF80 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + bne _022203C8 + add r0, r5, #0xc4 + str r5, [r1] + bl MBi_InitTaskInfo + sub r0, r6, #0xe4 + mov lr, #0 + bic ip, r0, #3 + add r3, r5, #0xe4 + str lr, [r5, #0xc0] + ldr r1, _022203DC ; =MBi_TaskThread + mov r0, r5 + mov r2, r5 + add r3, r3, ip + stmia sp, {ip, lr} + bl OS_CreateThread + mov r0, r5 + bl OS_WakeupThreadDirect +_022203C8: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_022203D8: .word ov13_0224CF80 +_022203DC: .word MBi_TaskThread + arm_func_end MBi_InitTaskThread + + arm_func_start MBi_IsTaskAvailable +MBi_IsTaskAvailable: ; 0x022203E0 + ldr r0, _022203F8 ; =ov13_0224CF80 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .balign 4, 0 +_022203F8: .word ov13_0224CF80 + arm_func_end MBi_IsTaskAvailable + + arm_func_start MBi_InitTaskInfo +MBi_InitTaskInfo: ; 0x022203FC + ldr ip, _0222040C ; =MI_CpuFill8 + mov r1, #0 + mov r2, #0x20 + bx ip + .balign 4, 0 +_0222040C: .word MI_CpuFill8 + arm_func_end MBi_InitTaskInfo + + arm_func_start MBi_IsTaskBusy +MBi_IsTaskBusy: ; 0x02220410 + ldr r0, [r0, #4] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end MBi_IsTaskBusy + + arm_func_start MBi_SetTask +MBi_SetTask: ; 0x02220428 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r4, _02220588 ; =ov13_0224CF80 + mov sb, r0 + ldr r4, [r4] + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl MBi_IsTaskAvailable + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sb, #4] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r6, #0x1f + bls _022204AC + mov r0, r4 + bl OS_GetThreadPriority + cmp r6, #0x20 + bne _02220488 + cmp r0, #0 + subne r6, r0, #1 + moveq r6, #0 + b _022204AC +_02220488: + cmp r6, #0x21 + bne _022204A0 + cmp r0, #0x1f + addlo r6, r0, #1 + movhs r6, #0x1f + b _022204AC +_022204A0: + cmp r6, #0x22 + moveq r6, r0 + movne r6, #0x1f +_022204AC: + bl OS_DisableInterrupts + ldr r1, [sb, #4] + mov r5, r0 + bic r0, r1, #1 + orr r1, r0, #1 + and r0, r1, #1 + str r1, [sb, #4] + orr r0, r0, r6, lsl #1 + stmib sb, {r0, r8} + str r7, [sb, #0xc] + ldr r0, [r4, #0xc0] + cmp r0, #0 + add r0, r4, #0xc4 + bne _02220504 + cmp sb, r0 + ldreq r0, _02220588 ; =ov13_0224CF80 + moveq r1, #0 + streq r1, [r0] + mov r0, r4 + str sb, [r4, #0xc0] + bl OS_WakeupThreadDirect + b _0222057C +_02220504: + cmp sb, r0 + ldr r1, [r4, #0xc0] + bne _02220540 + ldr r0, [r1] + cmp r0, #0 + beq _0222052C +_0222051C: + mov r1, r0 + ldr r0, [r0] + cmp r0, #0 + bne _0222051C +_0222052C: + ldr r0, _02220588 ; =ov13_0224CF80 + str sb, [r1] + mov r1, #0 + str r1, [r0] + b _0222057C +_02220540: + ldr r0, [r1, #4] + cmp r6, r0, lsr #1 + strlo sb, [r4, #0xc0] + strlo r1, [sb] + blo _0222057C + b _0222055C +_02220558: + mov r1, r2 +_0222055C: + ldr r2, [r1] + cmp r2, #0 + beq _02220574 + ldr r0, [r2, #4] + cmp r6, r0, lsr #1 + bhs _02220558 +_02220574: + str r2, [sb] + str sb, [r1] +_0222057C: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_02220588: .word ov13_0224CF80 + arm_func_end MBi_SetTask + + arm_func_start MBi_EndTaskThread +MBi_EndTaskThread: ; 0x0222058C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + bl MBi_IsTaskAvailable + cmp r0, #0 + beq _022205C4 + ldr r0, _022205D0 ; =ov13_0224CF80 + mov r1, #0 + ldr r0, [r0] + mov r2, r5 + mov r3, r1 + add r0, r0, #0xc4 + bl MBi_SetTask +_022205C4: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .balign 4, 0 +_022205D0: .word ov13_0224CF80 + arm_func_end MBi_EndTaskThread + + arm_func_start MBi_SetChildMPMaxSize +MBi_SetChildMPMaxSize: ; 0x022205D4 + stmdb sp!, {r3, lr} + ldr r2, _02220600 ; =ov13_0224CF84 + sub r1, r0, #2 + mov r0, #0x1e + str r1, [r2, #8] + bl _s32_div_f + ldr r1, _02220600 ; =ov13_0224CF84 + mov r2, #0x1e + str r0, [r1, #0xc] + str r2, [r1, #0x10] + ldmia sp!, {r3, pc} + .balign 4, 0 +_02220600: .word ov13_0224CF84 + arm_func_end MBi_SetChildMPMaxSize + + arm_func_start MBi_SetParentPieceBuffer +MBi_SetParentPieceBuffer: ; 0x02220604 + ldr r3, _0222061C ; =ov13_0224CF84 + ldr ip, _02220620 ; =MI_CpuFill8 + mov r1, #0 + mov r2, #0x21c + str r0, [r3, #4] + bx ip + .balign 4, 0 +_0222061C: .word ov13_0224CF84 +_02220620: .word MI_CpuFill8 + arm_func_end MBi_SetParentPieceBuffer + + arm_func_start MBi_ClearParentPieceBuffer +MBi_ClearParentPieceBuffer: ; 0x02220624 + stmdb sp!, {r4, lr} + ldr r1, _02220664 ; =ov13_0224CF84 + ldr r1, [r1, #4] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + sub r4, r0, #1 + add r0, r1, r4, lsl #5 + mov r1, #0 + mov r2, #0x1e + bl MI_CpuFill8 + ldr r0, _02220664 ; =ov13_0224CF84 + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, r4, lsl #2 + str r1, [r0, #0x1e0] + ldmia sp!, {r4, pc} + .balign 4, 0 +_02220664: .word ov13_0224CF84 + arm_func_end MBi_ClearParentPieceBuffer + + arm_func_start MBi_MakeParentSendBuffer +MBi_MakeParentSendBuffer: ; 0x02220668 + ldrb r2, [r0] + mov r3, r1 + add r3, r3, #1 + strb r2, [r1] + ldrb r1, [r0] + cmp r1, #6 + addls pc, pc, r1, lsl #2 + b _022206DC +_02220688: ; jump table + b _022206DC ; case 0 + b _022206E4 ; case 1 + b _022206E4 ; case 2 + b _022206E4 ; case 3 + b _022206A4 ; case 4 + b _022206E4 ; case 5 + b _022206E4 ; case 6 +_022206A4: + ldrh r1, [r0, #2] + strb r1, [r3] + ldrh r1, [r0, #2] + and r1, r1, #0xff00 + mov r1, r1, asr #8 + strb r1, [r3, #1] + ldrh r1, [r0, #4] + strb r1, [r3, #2] + ldrh r0, [r0, #4] + and r0, r0, #0xff00 + mov r0, r0, asr #8 + strb r0, [r3, #3] + add r3, r3, #4 + b _022206E4 +_022206DC: + mov r0, #0 + bx lr +_022206E4: + mov r0, r3 + bx lr + arm_func_end MBi_MakeParentSendBuffer + + arm_func_start MBi_SetRecvBufferFromChild +MBi_SetRecvBufferFromChild: ; 0x022206EC + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6] + mov r5, r1 + mov r4, r2 + strb r0, [r5] + cmp r0, #7 + beq _02220720 + cmp r0, #8 + beq _02220784 + cmp r0, #9 + beq _022207AC + b _022207F4 +_02220720: + mov r0, r4 + bl IsGetAllRequestData + cmp r0, #0 + beq _02220744 + ldr r0, _02220804 ; =ov13_0224CF84 + sub r1, r4, #1 + ldr r0, [r0, #4] + add r0, r0, r1, lsl #5 + ldmia sp!, {r4, r5, r6, pc} +_02220744: + ldrb r2, [r6, #1] + ldr r0, _02220804 ; =ov13_0224CF84 + strb r2, [r5, #2] + ldr r1, [r0, #0xc] + cmp r2, r1 + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, pc} + ldr r2, [r0, #8] + add r0, r6, #2 + add r1, r5, #3 + bl MI_CpuCopy8 + mov r0, r5 + mov r1, r4 + bl MBi_ReceiveRequestDataPiece + mov r4, r0 + b _022207FC +_02220784: + ldrb r0, [r6, #1] + add r4, r6, #3 + strh r0, [r5, #2] + ldrb r0, [r6, #2] + ldrh r1, [r5, #2] + mov r0, r0, lsl #8 + and r0, r0, #0xff00 + orr r0, r1, r0 + strh r0, [r5, #2] + b _022207FC +_022207AC: + ldrb r0, [r6, #1] + add r4, r6, #3 + ldr r1, _02220804 ; =ov13_0224CF84 + strh r0, [r5, #2] + ldrb r2, [r6, #2] + ldrh r3, [r5, #2] + mov r0, r4 + mov r2, r2, lsl #8 + and r2, r2, #0xff00 + orr r2, r3, r2 + strh r2, [r5, #2] + ldr r2, [r1, #8] + add r1, r5, #4 + bl MI_CpuCopy8 + ldr r0, _02220804 ; =ov13_0224CF84 + ldr r0, [r0, #8] + add r4, r4, r0 + b _022207FC +_022207F4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_022207FC: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02220804: .word ov13_0224CF84 + arm_func_end MBi_SetRecvBufferFromChild + + arm_func_start MBi_ReceiveRequestDataPiece +MBi_ReceiveRequestDataPiece: ; 0x02220808 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _02220890 ; =ov13_0224CF84 + mov r6, r1 + ldr r3, [r2, #4] + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldrb r5, [r0, #2] + ldr r1, [r2, #0xc] + cmp r5, r1 + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, pc} + sub r4, r6, #1 + ldr r2, [r2, #8] + add r1, r3, r4, lsl #5 + mla r1, r5, r2, r1 + add r0, r0, #3 + bl MI_CpuCopy8 + ldr r0, _02220890 ; =ov13_0224CF84 + mov r1, #1 + ldr r2, [r0, #4] + mov r0, r6 + add r3, r2, #0x1e0 + ldr r2, [r3, r4, lsl #2] + orr r1, r2, r1, lsl r5 + str r1, [r3, r4, lsl #2] + bl IsGetAllRequestData + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _02220890 ; =ov13_0224CF84 + ldr r0, [r0, #4] + add r0, r0, r4, lsl #5 + ldmia sp!, {r4, r5, r6, pc} + .balign 4, 0 +_02220890: .word ov13_0224CF84 + arm_func_end MBi_ReceiveRequestDataPiece + + arm_func_start IsGetAllRequestData +IsGetAllRequestData: ; 0x02220894 + ldr r1, _022208E4 ; =ov13_0224CF84 + mov r2, #0 + ldr ip, [r1, #0xc] + cmp ip, #0 + ble _022208DC + ldr r1, [r1, #4] + sub r0, r0, #1 + add r0, r1, r0, lsl #2 + ldr r3, [r0, #0x1e0] + mov r1, #1 +_022208BC: + tst r3, r1, lsl r2 + moveq r0, #0 + bxeq lr + add r0, r2, #1 + mov r0, r0, lsl #0x10 + cmp ip, r0, lsr #16 + mov r2, r0, lsr #0x10 + bgt _022208BC +_022208DC: + mov r0, #1 + bx lr + .balign 4, 0 +_022208E4: .word ov13_0224CF84 + arm_func_end IsGetAllRequestData + + .rodata + +MBi_defaultLoadSegList: + .word 2 + .word 0 + .word 1 + +mbi_seg_header_default: + .word 0x00004000, 0x00001000 + .word 0x00007000, 0x00001000 + .word 0x00000000, 0x00000000 + + .data + +_02245980: + .byte 0xFF, 0x00, 0x00, 0x00 + +mbi_seg_header: ; 0x02245984 + .word mbi_seg_header_default + +ov13_02245988: ; 0x02245988 + .asciz "rom" + .balign 4, 0 + +ov13_0224598C: ; 0x0224598C + .byte 0x05, 0x00, 0x28, 0x00 + .byte 0x28, 0x00, 0xFF, 0xFF + .word ov13_0224599C + .byte 0x01, 0x00, 0x00, 0x00 + +ov13_0224599C: + .byte 0x6D, 0x00, 0x75, 0x00 + .byte 0x6C, 0x00, 0x74, 0x00, 0x69, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x00, 0x00 + + .bss + +_02247480: + .space 0x4 + +ov13_02247484: ; 0x02247484 + .space 0x1C + +ov13_022474A0: ; 0x022474A0 + .space 0x40 + +bsendBuff: ; 0x022474E0 + .space 0x5A60 + +ov13_0224CF40: ; 0x0224CF40 + .space 0xC + +mbc: ; 0x0224CF4C + .space 0x14 + +ov13_0224CF60: ; 0x0224CF60 + .space 0x20 + +ov13_0224CF80: ; 0x0224CF80 + .space 0x4 + +ov13_0224CF84: ; 0x0224CF84 + .space 0x14 diff --git a/lib/NitroSDK/asm/mi_compress.s b/lib/NitroSDK/asm/mi_compress.s new file mode 100644 index 00000000..088300b4 --- /dev/null +++ b/lib/NitroSDK/asm/mi_compress.s @@ -0,0 +1,212 @@ + .include "asm/macros.inc" + .include "mi_compress.inc" + .include "global.inc" + + .text + + arm_func_start MI_CompressLZImpl +MI_CompressLZImpl: ; 0x020D4D5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sl, r0 + movs r0, r3 + ldrne r0, _020D4F30 ; =0x00010110 + str r3, [sp, #4] + strne r0, [sp, #8] + moveq r0, #0x12 + streq r0, [sp, #8] + ldr r0, [sp, #4] + mov sb, r1 + cmp r0, #0 + movne r1, #1 + mov r0, sb, lsl #8 + moveq r1, #0 + orr r0, r0, #0x10 + mov r8, r2 + orr r0, r0, r1 + str sl, [sp, #0x10] + mov r7, sb + cmp sb, #0 + str r0, [r8], #4 + mov r4, #4 + beq _020D4EFC +_020D4DBC: + ldr r0, _020D4F34 ; =0x00000111 + mov r5, #0 + str r8, [sp, #0xc] + mov r6, r5 + add r8, r8, #1 + add r4, r4, #1 + rsb fp, r0, #0 +_020D4DD8: + cmp sb, #0 + mov r0, r5, lsl #1 + and r5, r0, #0xff + beq _020D4EDC + ldr r0, [sp, #8] + mov r1, sl + str r0, [sp] + ldr r0, [sp, #0x10] + mov r2, sb + add r3, sp, #0x14 + bl SearchLZ + cmp r0, #0 + beq _020D4EBC + orr r1, r5, #1 + add r2, r4, #2 + cmp r2, r7 + and r5, r1, #0xff + addhs sp, sp, #0x18 + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #4] + cmp r1, #0 + beq _020D4E84 + ldr r1, _020D4F34 ; =0x00000111 + cmp r0, r1 + blo _020D4E64 + mov r4, r2 + add r1, r0, fp + mov r2, r1, lsr #0xc + orr r2, r2, #0x10 + strb r2, [r8] + mov r2, r1, lsr #4 + strb r2, [r8, #1] + add r8, r8, #2 + b _020D4E88 +_020D4E64: + cmp r0, #0x11 + sublo r1, r0, #1 + blo _020D4E88 + sub r1, r0, #0x11 + mov r2, r1, lsr #4 + strb r2, [r8], #1 + add r4, r4, #1 + b _020D4E88 +_020D4E84: + sub r1, r0, #3 +_020D4E88: + ldrh r2, [sp, #0x14] + add r4, r4, #2 + add sl, sl, r0 + sub r2, r2, #1 + mov r2, r2, asr #8 + orr r1, r2, r1, lsl #4 + strb r1, [r8] + sub sb, sb, r0 + ldrh r0, [sp, #0x14] + sub r0, r0, #1 + strb r0, [r8, #1] + add r8, r8, #2 + b _020D4EDC +_020D4EBC: + add r4, r4, #1 + cmp r4, r7 + addhs sp, sp, #0x18 + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [sl], #1 + sub sb, sb, #1 + strb r0, [r8], #1 +_020D4EDC: + add r0, r6, #1 + and r6, r0, #0xff + cmp r6, #8 + blo _020D4DD8 + ldr r0, [sp, #0xc] + cmp sb, #0 + strb r5, [r0] + bne _020D4DBC +_020D4EFC: + tst r4, #3 + mov r2, #0 + beq _020D4F24 + mov r1, r2 +_020D4F0C: + add r0, r2, #1 + and r2, r0, #0xff + add r0, r4, r2 + tst r0, #3 + strb r1, [r8], #1 + bne _020D4F0C +_020D4F24: + mov r0, r4 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D4F30: .word 0x00010110 +_020D4F34: .word 0x00000111 + arm_func_end MI_CompressLZImpl + + arm_func_start SearchLZ +SearchLZ: ; 0x020D4F38 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r7, [sp, #0x20] + mov r4, #2 + cmp r2, #3 + movlo r0, #0 + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + sub ip, r1, #0x1000 + cmp ip, r0 + movlo ip, r0 + sub r6, r1, ip + cmp r6, #2 + blt _020D5018 +_020D4F68: + mov r0, r1 + ldrb r5, [r1] + b _020D4F84 +_020D4F74: + add ip, ip, #1 + sub r6, r1, ip + cmp r6, #2 + blt _020D5018 +_020D4F84: + ldrb r8, [ip] + cmp r5, r8 + ldreqb sb, [r1, #1] + ldreqb r8, [ip, #1] + cmpeq sb, r8 + ldreqb sb, [r1, #2] + ldreqb r8, [ip, #2] + cmpeq sb, r8 + bne _020D4F74 + add sl, ip, #3 + add r0, r0, #3 + mov r5, #3 + b _020D4FCC +_020D4FB8: + add r5, r5, #1 + cmp r5, r7 + add r0, r0, #1 + add sl, sl, #1 + beq _020D4FE8 +_020D4FCC: + sub r8, r0, r1 + cmp r8, r2 + bhs _020D4FE8 + ldrb sb, [r0] + ldrb r8, [sl] + cmp sb, r8 + beq _020D4FB8 +_020D4FE8: + cmp r5, r4 + bls _020D5008 + mov r0, r6, lsl #0x10 + cmp r5, r7 + mov r4, r5 + mov lr, r0, lsr #0x10 + cmpne r5, r2 + beq _020D5018 +_020D5008: + add ip, ip, #1 + sub r6, r1, ip + cmp r6, #2 + bge _020D4F68 +_020D5018: + cmp r4, #3 + movlo r0, #0 + movhs r0, r4 + strhsh lr, [r3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end SearchLZ diff --git a/lib/NitroSDK/asm/mi_dma.s b/lib/NitroSDK/asm/mi_dma.s new file mode 100644 index 00000000..f939b1d5 --- /dev/null +++ b/lib/NitroSDK/asm/mi_dma.s @@ -0,0 +1,449 @@ + .include "asm/macros.inc" + .include "mi_dma.inc" + .include "global.inc" + + .public OSi_EnterDmaCallback + + .section .itcm,4,1,4 + + arm_func_start MIi_DmaSetParams +MIi_DmaSetParams: ; 0x01FF8448 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl OS_DisableInterrupts + mov r1, #0xc + mul r2, r7, r1 + add r1, r2, #0xb0 + add r2, r2, #0x4000000 + str r6, [r2, #0xb0] + add r1, r1, #0x4000000 + str r5, [r1, #4] + str r4, [r1, #8] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end MIi_DmaSetParams + + arm_func_start MIi_DmaSetParams_wait +MIi_DmaSetParams_wait: ; 0x01FF8488 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl OS_DisableInterrupts + mov r1, #0xc + mul r2, r7, r1 + add r1, r2, #0xb0 + add r2, r2, #0x4000000 + str r6, [r2, #0xb0] + add r3, r1, #0x4000000 + str r5, [r3, #4] + ldr r2, _01FF84F0 ; =0x040000B0 + str r4, [r3, #8] + ldr r1, [r2] + cmp r7, #0 + ldr r1, [r2] + bne _01FF84E8 + mov r2, #0 + str r2, [r3] + ldr r1, _01FF84F4 ; =0x81400001 + str r2, [r3, #4] + str r1, [r3, #8] +_01FF84E8: + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_01FF84F0: .word 0x040000B0 +_01FF84F4: .word 0x81400001 + arm_func_end MIi_DmaSetParams_wait + + arm_func_start MIi_DmaSetParams_noInt +MIi_DmaSetParams_noInt: ; 0x01FF84F8 + mov ip, #0xc + mul ip, r0, ip + add r0, ip, #0xb0 + add ip, ip, #0x4000000 + str r1, [ip, #0xb0] + add r0, r0, #0x4000000 + str r2, [r0, #4] + str r3, [r0, #8] + bx lr + arm_func_end MIi_DmaSetParams_noInt + + arm_func_start MIi_DmaSetParams_wait_noInt +MIi_DmaSetParams_wait_noInt: ; 0x01FF851C + stmdb sp!, {r3, lr} + mov ip, #0xc + mul lr, r0, ip + add ip, lr, #0xb0 + add lr, lr, #0x4000000 + str r1, [lr, #0xb0] + add ip, ip, #0x4000000 + str r2, [ip, #4] + ldr r2, _01FF8578 ; =0x040000B0 + str r3, [ip, #8] + ldr r1, [r2] + cmp r0, #0 + ldr r0, [r2] + bne _01FF8568 + mov r1, #0 + str r1, [ip] + ldr r0, _01FF857C ; =0x81400001 + str r1, [ip, #4] + str r0, [ip, #8] +_01FF8568: + ldr r1, _01FF8578 ; =0x040000B0 + ldr r0, [r1] + ldr r0, [r1] + ldmia sp!, {r3, pc} + .align 2, 0 +_01FF8578: .word 0x040000B0 +_01FF857C: .word 0x81400001 + arm_func_end MIi_DmaSetParams_wait_noInt + + .text + + arm_func_start MI_DmaFill32 +MI_DmaFill32: ; 0x020D3F74 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r4, r3 + mov r8, r0 + mov r7, r1 + mov r6, r2 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r8, r8, lsl #1 + add r0, r0, #2 + mov r0, r0, lsl #2 + add r0, r0, #0xb0 + add r5, r0, #0x4000000 +_020D3FA0: + ldr r0, [r5] + tst r0, #0x80000000 + bne _020D3FA0 + bl OS_DisableInterrupts + mov r2, r8, lsl #2 + add r1, r2, #0xe0 + mov r3, r4, lsr #2 + mov r4, r0 + add ip, r2, #0x4000000 + mov r0, r8 + mov r2, r7 + add r1, r1, #0x4000000 + orr r3, r3, #0x85000000 + str r6, [ip, #0xe0] + bl MIi_DmaSetParams_wait_noInt + mov r0, r4 + bl OS_RestoreInterrupts +_020D3FE4: + ldr r0, [r5] + tst r0, #0x80000000 + bne _020D3FE4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end MI_DmaFill32 + + arm_func_start MI_DmaCopy32 +MI_DmaCopy32: ; 0x020D3FF4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r3 + mov r6, r2 + mov r2, r5 + mov r3, #0 + mov r8, r0 + mov r7, r1 + bl MIi_CheckDma0SourceAddress + cmp r5, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r8, r8, lsl #1 + add r0, r0, #2 + mov r0, r0, lsl #2 + add r0, r0, #0xb0 + add r4, r0, #0x4000000 +_020D4030: + ldr r0, [r4] + tst r0, #0x80000000 + bne _020D4030 + mov r3, r5, lsr #2 + mov r0, r8 + mov r1, r7 + mov r2, r6 + orr r3, r3, #0x84000000 + bl MIi_DmaSetParams_wait +_020D4054: + ldr r0, [r4] + tst r0, #0x80000000 + bne _020D4054 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end MI_DmaCopy32 + + arm_func_start MI_DmaCopy16 +MI_DmaCopy16: ; 0x020D4064 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r5, r3 + mov r8, r0 + mov r7, r1 + mov r6, r2 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r2, r5 + mov r3, #0 + bl MIi_CheckDma0SourceAddress + add r0, r8, r8, lsl #1 + add r0, r0, #2 + mov r0, r0, lsl #2 + add r0, r0, #0xb0 + add r4, r0, #0x4000000 +_020D409C: + ldr r0, [r4] + tst r0, #0x80000000 + bne _020D409C + mov r3, r5, lsr #1 + mov r0, r8 + mov r1, r7 + mov r2, r6 + orr r3, r3, #0x80000000 + bl MIi_DmaSetParams_wait +_020D40C0: + ldr r0, [r4] + tst r0, #0x80000000 + bne _020D40C0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end MI_DmaCopy16 + + arm_func_start MI_DmaFill32Async +MI_DmaFill32Async: ; 0x020D40D0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r4, r3 + mov r7, r0 + mov r6, r1 + mov r5, r2 + ldr r8, [sp, #0x18] + bne _020D4100 + cmp r8, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #0x1c] + blx r8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D4100: + bl MI_WaitDma + cmp r8, #0 + beq _020D4158 + ldr r2, [sp, #0x1c] + mov r0, r7 + mov r1, r8 + bl OSi_EnterDmaCallback + bl OS_DisableInterrupts + mov r3, r4, lsr #2 + mov r2, r7, lsl #2 + add r1, r2, #0xe0 + add r2, r2, #0x4000000 + str r5, [r2, #0xe0] + mov r4, r0 + mov r0, r7 + mov r2, r6 + add r1, r1, #0x4000000 + orr r3, r3, #0xc5000000 + bl MIi_DmaSetParams_noInt + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D4158: + bl OS_DisableInterrupts + mov r2, r7, lsl #2 + add r1, r2, #0xe0 + mov r3, r4, lsr #2 + mov r4, r0 + add ip, r2, #0x4000000 + mov r0, r7 + mov r2, r6 + add r1, r1, #0x4000000 + orr r3, r3, #0x85000000 + str r5, [ip, #0xe0] + bl MIi_DmaSetParams_noInt + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end MI_DmaFill32Async + + arm_func_start MI_DmaCopy32Async +MI_DmaCopy32Async: ; 0x020D4194 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r3 + mov r6, r2 + mov r2, r5 + mov r3, #0 + mov r8, r0 + mov r7, r1 + ldr r4, [sp, #0x18] + bl MIi_CheckDma0SourceAddress + cmp r5, #0 + bne _020D41D4 + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #0x1c] + blx r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D41D4: + mov r0, r8 + bl MI_WaitDma + cmp r4, #0 + beq _020D4210 + ldr r2, [sp, #0x1c] + mov r0, r8 + mov r1, r4 + bl OSi_EnterDmaCallback + mov r3, r5, lsr #2 + mov r0, r8 + mov r1, r7 + mov r2, r6 + orr r3, r3, #0xc4000000 + bl MIi_DmaSetParams + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D4210: + mov r3, r5, lsr #2 + mov r0, r8 + mov r1, r7 + mov r2, r6 + orr r3, r3, #0x84000000 + bl MIi_DmaSetParams + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end MI_DmaCopy32Async + + arm_func_start MI_WaitDma +MI_WaitDma: ; 0x020D422C + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + add r1, r4, r4, lsl #1 + add r1, r1, #2 + mov r1, r1, lsl #2 + add r1, r1, #0xb0 + add r2, r1, #0x4000000 +_020D424C: + ldr r1, [r2] + tst r1, #0x80000000 + bne _020D424C + cmp r4, #0 + bne _020D4288 + mov r1, #0xc + mul r2, r4, r1 + add r1, r2, #0xb0 + add r2, r2, #0x4000000 + mov r3, #0 + str r3, [r2, #0xb0] + add r2, r1, #0x4000000 + ldr r1, _020D4290 ; =0x81400001 + str r3, [r2, #4] + str r1, [r2, #8] +_020D4288: + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020D4290: .word 0x81400001 + arm_func_end MI_WaitDma + + arm_func_start MI_StopDma +MI_StopDma: ; 0x020D4294 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + mov r1, #6 + mul r1, r4, r1 + add r1, r1, #5 + mov r1, r1, lsl #1 + add r1, r1, #0x4000000 + ldrh r2, [r1, #0xb0] + cmp r4, #0 + bic r2, r2, #0x3a00 + strh r2, [r1, #0xb0] + ldrh r2, [r1, #0xb0] + bic r2, r2, #0x8000 + strh r2, [r1, #0xb0] + ldrh r2, [r1, #0xb0] + ldrh r1, [r1, #0xb0] + bne _020D4304 + mov r1, #0xc + mul r2, r4, r1 + add r1, r2, #0xb0 + add r2, r2, #0x4000000 + mov r3, #0 + str r3, [r2, #0xb0] + add r2, r1, #0x4000000 + ldr r1, _020D430C ; =0x81400001 + str r3, [r2, #4] + str r1, [r2, #8] +_020D4304: + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020D430C: .word 0x81400001 + arm_func_end MI_StopDma + + arm_func_start MIi_CheckAnotherAutoDMA +MIi_CheckAnotherAutoDMA: ; 0x020D4310 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, _020D4390 ; =0x040000B8 + mov r7, r0 + mov r6, r1 + mov r4, #0 +_020D4324: + cmp r4, r7 + beq _020D437C + ldr r0, [r5] + tst r0, #0x80000000 + andne r0, r0, #0x38000000 + cmpne r0, r6 + beq _020D437C + cmp r0, #0x8000000 + cmpeq r6, #0x10000000 + beq _020D437C + cmp r0, #0x10000000 + cmpeq r6, #0x8000000 + beq _020D437C + cmp r0, #0x18000000 + cmpne r0, #0x20000000 + cmpne r0, #0x28000000 + cmpne r0, #0x30000000 + cmpne r0, #0x38000000 + cmpne r0, #0x8000000 + cmpne r0, #0x10000000 + bne _020D437C + bl OS_Terminate +_020D437C: + add r4, r4, #1 + cmp r4, #3 + add r5, r5, #0xc + blt _020D4324 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D4390: .word 0x040000B8 + arm_func_end MIi_CheckAnotherAutoDMA + + arm_func_start MIi_CheckDma0SourceAddress +MIi_CheckDma0SourceAddress: ; 0x020D4394 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmneia sp!, {r3, pc} + cmp r3, #0 + and ip, r1, #0xff000000 + beq _020D43B8 + cmp r3, #0x800000 + subeq r1, r1, r2 + b _020D43BC +_020D43B8: + add r1, r1, r2 +_020D43BC: + cmp ip, #0x4000000 + and r0, r1, #0xff000000 + beq _020D43E0 + cmp ip, #0x8000000 + bhs _020D43E0 + cmp r0, #0x4000000 + beq _020D43E0 + cmp r0, #0x8000000 + ldmloia sp!, {r3, pc} +_020D43E0: + bl OS_Terminate + ldmia sp!, {r3, pc} + arm_func_end MIi_CheckDma0SourceAddress diff --git a/lib/NitroSDK/asm/mi_dma_card.s b/lib/NitroSDK/asm/mi_dma_card.s new file mode 100644 index 00000000..9e6fe433 --- /dev/null +++ b/lib/NitroSDK/asm/mi_dma_card.s @@ -0,0 +1,44 @@ + .include "asm/macros.inc" + .include "mi_dma_card.inc" + .include "global.inc" + + .public MIi_CheckAnotherAutoDMA + .public MIi_CheckDma0SourceAddress + .public MIi_DmaSetParams + + .text + + arm_func_start MIi_CardDmaCopy32 +MIi_CardDmaCopy32: ; 0x020D4CE8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + mov r6, r0 + mov r7, r3 + mvn r1, #0 + mov r4, r2 + bl MIi_CheckAnotherAutoDMA + mov r0, r6 + mov r1, r5 + mov r2, r7 + mov r3, #0x1000000 + bl MIi_CheckDma0SourceAddress + cmp r7, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, r6, r6, lsl #1 + add r0, r0, #2 + mov r0, r0, lsl #2 + add r0, r0, #0xb0 + add r1, r0, #0x4000000 +_020D4D34: + ldr r0, [r1] + tst r0, #0x80000000 + bne _020D4D34 + ldr r3, _020D4D58 ; =0xAF000001 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl MIi_DmaSetParams + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D4D58: .word 0xAF000001 + arm_func_end MIi_CardDmaCopy32 diff --git a/lib/NitroSDK/asm/mi_dma_gxcommand.s b/lib/NitroSDK/asm/mi_dma_gxcommand.s new file mode 100644 index 00000000..f04051eb --- /dev/null +++ b/lib/NitroSDK/asm/mi_dma_gxcommand.s @@ -0,0 +1,279 @@ + .include "asm/macros.inc" + .include "mi_dma_gxcommand.inc" + .include "global.inc" + + .public MIi_CheckAnotherAutoDMA + .public MIi_CheckDma0SourceAddress + .public MIi_DmaSetParams + .public OSi_EnterDmaCallback + + .bss + +MIiGXDmaParam: ; 0x021E1A20 + .space 0x20 + + .section .itcm,4,1,4 + + arm_func_start MI_SendGXCommand +MI_SendGXCommand: ; 0x01FF8580 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r8, r2 + mov sl, r0 + mov sb, r1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r3, #0 + bl MIi_CheckDma0SourceAddress + add r0, sl, sl, lsl #1 + add r0, r0, #2 + mov r0, r0, lsl #2 + add r0, r0, #0xb0 + add r6, r0, #0x4000000 +_01FF85B0: + ldr r0, [r6] + tst r0, #-0x80000000 + bne _01FF85B0 + cmp r8, #0 + beq _01FF85FC + ldr fp, _01FF860C ; =0x04000400 + ldr r4, _01FF8610 ; =0x84400000 + mov r5, #0x1d8 +_01FF85D0: + cmp r8, #0x1d8 + movhi r7, r5 + movls r7, r8 + mov r0, sl + mov r1, sb + mov r2, fp + orr r3, r4, r7, lsr #2 + bl MIi_DmaSetParams + subs r8, r8, r7 + add sb, sb, r7 + bne _01FF85D0 +_01FF85FC: + ldr r0, [r6] + tst r0, #-0x80000000 + bne _01FF85FC + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_01FF860C: .word 0x04000400 +_01FF8610: .word 0x84400000 + arm_func_end MI_SendGXCommand + + .text + + arm_func_start MI_SendGXCommandAsync +MI_SendGXCommandAsync: ; 0x020D44A8 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r2, #0 + bne _020D44CC + cmp r3, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [sp, #8] + blx r3 + ldmia sp!, {r4, pc} +_020D44CC: + ldr r0, _020D4594 ; =MIiGXDmaParam +_020D44D0: + ldr ip, [r0] + cmp ip, #0 + bne _020D44D0 + ldr ip, _020D4598 ; =0x04000600 +_020D44E0: + ldr r0, [ip] + and r0, r0, #0x7000000 + mov r0, r0, lsr #0x18 + tst r0, #2 + beq _020D44E0 + ldr ip, _020D4594 ; =MIiGXDmaParam + mov r0, #1 + str r0, [ip] + str r4, [ip, #4] + str r1, [ip, #8] + str r2, [ip, #0xc] + str r3, [ip, #0x10] + ldr lr, [sp, #8] + mov r0, r4 + mov r3, #0 + str lr, [ip, #0x14] + bl MIi_CheckDma0SourceAddress + mov r0, r4 + bl MI_WaitDma + bl OS_DisableInterrupts + ldr r1, _020D4598 ; =0x04000600 + mov r4, r0 + ldr r0, [r1] + ldr r1, _020D4594 ; =MIiGXDmaParam + and r0, r0, #0xc0000000 + mov r2, r0, lsr #0x1e + mov r0, #0x200000 + str r2, [r1, #0x18] + bl OS_GetIrqFunction + ldr r1, _020D4594 ; =MIiGXDmaParam + ldr r2, _020D4598 ; =0x04000600 + str r0, [r1, #0x1c] + ldr r0, [r2] + ldr r1, _020D459C ; =MIi_FIFOCallback + bic r0, r0, #0xc0000000 + orr r3, r0, #0x40000000 + mov r0, #0x200000 + str r3, [r2] + bl OS_SetIrqFunction + mov r0, #0x200000 + bl OS_EnableIrqMask + bl MIi_FIFOCallback + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020D4594: .word MIiGXDmaParam +_020D4598: .word 0x04000600 +_020D459C: .word MIi_FIFOCallback + arm_func_end MI_SendGXCommandAsync + + arm_func_start MIi_FIFOCallback +MIi_FIFOCallback: ; 0x020D45A0 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020D463C ; =MIiGXDmaParam + ldr r5, [r0, #0xc] + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _020D463C ; =MIiGXDmaParam + cmp r5, #0x1d8 + ldr r1, [r0, #0xc] + movhs r5, #0x1d8 + ldr r4, [r0, #8] + subs r1, r1, r5 + str r1, [r0, #0xc] + add r1, r4, r5 + str r1, [r0, #8] + bne _020D4618 + ldr r0, [r0, #4] + ldr r1, _020D4640 ; =MIi_DMACallback + mov r2, #0 + bl OSi_EnterDmaCallback + ldr r0, _020D463C ; =MIiGXDmaParam + mov r3, #0x3bc00000 + rsb r3, r3, #0 + ldr r0, [r0, #4] + ldr r2, _020D4644 ; =0x04000400 + mov r1, r4 + orr r3, r3, r5, lsr #2 + bl MIi_DmaSetParams + mov r0, #0x200000 + bl OS_ResetRequestIrqMask + ldmia sp!, {r3, r4, r5, pc} +_020D4618: + ldr r3, _020D4648 ; =0x84400000 + ldr r0, [r0, #4] + ldr r2, _020D4644 ; =0x04000400 + mov r1, r4 + orr r3, r3, r5, lsr #2 + bl MIi_DmaSetParams + mov r0, #0x200000 + bl OS_ResetRequestIrqMask + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D463C: .word MIiGXDmaParam +_020D4640: .word MIi_DMACallback +_020D4644: .word 0x04000400 +_020D4648: .word 0x84400000 + arm_func_end MIi_FIFOCallback + + arm_func_start MIi_DMACallback +MIi_DMACallback: ; 0x020D464C + stmdb sp!, {r3, lr} + mov r0, #0x200000 + bl OS_DisableIrqMask + ldr r2, _020D46A4 ; =0x04000600 + ldr r0, _020D46A8 ; =MIiGXDmaParam + ldr r1, [r2] + ldr r3, [r0, #0x18] + bic r1, r1, #0xc0000000 + orr r1, r1, r3, lsl #30 + str r1, [r2] + ldr r1, [r0, #0x1c] + mov r0, #0x200000 + bl OS_SetIrqFunction + ldr r0, _020D46A8 ; =MIiGXDmaParam + mov r1, #0 + str r1, [r0] + ldr r1, [r0, #0x10] + ldr r0, [r0, #0x14] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + blx r1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020D46A4: .word 0x04000600 +_020D46A8: .word MIiGXDmaParam + arm_func_end MIi_DMACallback + + arm_func_start MI_SendGXCommandAsyncFast +MI_SendGXCommandAsyncFast: ; 0x020D46AC + stmdb sp!, {r4, r5, r6, lr} + movs r4, r2 + mov r6, r0 + mov r5, r1 + bne _020D46D4 + cmp r3, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [sp, #0x10] + blx r3 + ldmia sp!, {r4, r5, r6, pc} +_020D46D4: + ldr r0, _020D4758 ; =MIiGXDmaParam +_020D46D8: + ldr r1, [r0] + cmp r1, #0 + bne _020D46D8 + ldr r2, _020D4758 ; =MIiGXDmaParam + mov r0, #1 + str r0, [r2] + str r6, [r2, #4] + ldr ip, [sp, #0x10] + str r3, [r2, #0x10] + mov r0, r6 + mov r1, #0x38000000 + str ip, [r2, #0x14] + bl MIi_CheckAnotherAutoDMA + mov r0, r6 + mov r1, r5 + mov r2, r4 + mov r3, #0 + bl MIi_CheckDma0SourceAddress + mov r0, r6 + bl MI_WaitDma + mov r0, r6 + ldr r1, _020D475C ; =MIi_DMAFastCallback + mov r2, #0 + bl OSi_EnterDmaCallback + mov r0, r6 + mov r1, r5 + ldr r2, _020D4760 ; =0x04000400 + mov r3, #0x3c00000 + rsb r3, r3, #0 + orr r3, r3, r4, lsr #2 + bl MIi_DmaSetParams + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D4758: .word MIiGXDmaParam +_020D475C: .word MIi_DMAFastCallback +_020D4760: .word 0x04000400 + arm_func_end MI_SendGXCommandAsyncFast + + arm_func_start MIi_DMAFastCallback +MIi_DMAFastCallback: ; 0x020D4764 + stmdb sp!, {r3, lr} + ldr r0, _020D478C ; =MIiGXDmaParam + mov r1, #0 + str r1, [r0] + ldr r1, [r0, #0x10] + ldr r0, [r0, #0x14] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + blx r1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020D478C: .word MIiGXDmaParam + arm_func_end MIi_DMAFastCallback diff --git a/lib/NitroSDK/asm/mi_dma_hblank.s b/lib/NitroSDK/asm/mi_dma_hblank.s new file mode 100644 index 00000000..df988f7f --- /dev/null +++ b/lib/NitroSDK/asm/mi_dma_hblank.s @@ -0,0 +1,67 @@ + .include "asm/macros.inc" + .include "mi_dma_hblank.inc" + .include "global.inc" + + .public MIi_CheckAnotherAutoDMA + .public MIi_CheckDma0SourceAddress + .public MIi_DmaSetParams + + .text + + arm_func_start MI_HBlankDmaCopy32 +MI_HBlankDmaCopy32: ; 0x020D43E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r4, r3 + mov r1, #0x10000000 + mov r5, r2 + bl MIi_CheckAnotherAutoDMA + mov r0, r7 + mov r1, r6 + mov r2, r4 + mov r3, #0 + bl MIi_CheckDma0SourceAddress + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + bl MI_WaitDma + ldr r3, _020D4444 ; =0x96600000 + mov r0, r7 + mov r1, r6 + mov r2, r5 + orr r3, r3, r4, lsr #2 + bl MIi_DmaSetParams + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D4444: .word 0x96600000 + arm_func_end MI_HBlankDmaCopy32 + + arm_func_start MI_HBlankDmaCopy16 +MI_HBlankDmaCopy16: ; 0x020D4448 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r4, r3 + mov r1, #0x10000000 + mov r5, r2 + bl MIi_CheckAnotherAutoDMA + mov r0, r7 + mov r1, r6 + mov r2, r4 + mov r3, #0 + bl MIi_CheckDma0SourceAddress + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + bl MI_WaitDma + ldr r3, _020D44A4 ; =0x92600000 + mov r0, r7 + mov r1, r6 + mov r2, r5 + orr r3, r3, r4, lsr #1 + bl MIi_DmaSetParams + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D44A4: .word 0x92600000 + arm_func_end MI_HBlankDmaCopy16 diff --git a/lib/NitroSDK/asm/mi_init.s b/lib/NitroSDK/asm/mi_init.s new file mode 100644 index 00000000..33cea47a --- /dev/null +++ b/lib/NitroSDK/asm/mi_init.s @@ -0,0 +1,17 @@ + .include "asm/macros.inc" + .include "mi_init.inc" + .include "global.inc" + + .public MI_SetWramBank + + .text + + arm_func_start MI_Init +MI_Init: ; 0x020D502C + stmdb sp!, {r3, lr} + mov r0, #3 + bl MI_SetWramBank + mov r0, #0 + bl MI_StopDma + ldmia sp!, {r3, pc} + arm_func_end MI_Init diff --git a/lib/NitroSDK/asm/mi_memory.s b/lib/NitroSDK/asm/mi_memory.s new file mode 100644 index 00000000..85f70690 --- /dev/null +++ b/lib/NitroSDK/asm/mi_memory.s @@ -0,0 +1,422 @@ + .include "asm/macros.inc" + .include "mi_memory.inc" + .include "global.inc" + + .text + + arm_func_start MIi_CpuClear16 +MIi_CpuClear16: ; 0x020D4790 + mov r3, #0 +_020D4794: + cmp r3, r2 + blt _020D47A0 + b _020D47A4 +_020D47A0: + strh r0, [r1, r3] +_020D47A4: + blt _020D47AC + b _020D47B0 +_020D47AC: + add r3, r3, #2 +_020D47B0: + blt _020D4794 + bx lr + arm_func_end MIi_CpuClear16 + + arm_func_start MIi_CpuCopy16 +MIi_CpuCopy16: ; 0x020D47B8 + mov ip, #0 +_020D47BC: + cmp ip, r2 + blt _020D47C8 + b _020D47CC +_020D47C8: + ldrh r3, [r0, ip] +_020D47CC: + blt _020D47D4 + b _020D47D8 +_020D47D4: + strh r3, [r1, ip] +_020D47D8: + blt _020D47E0 + b _020D47E4 +_020D47E0: + add ip, ip, #2 +_020D47E4: + blt _020D47BC + bx lr + arm_func_end MIi_CpuCopy16 + + arm_func_start MIi_CpuClear32 +MIi_CpuClear32: ; 0x020D47EC + add ip, r1, r2 +_020D47F0: + cmp r1, ip + blt _020D47FC + b _020D4800 +_020D47FC: + stmia r1!, {r0} +_020D4800: + blt _020D47F0 + bx lr + arm_func_end MIi_CpuClear32 + + arm_func_start MIi_CpuCopy32 +MIi_CpuCopy32: ; 0x020D4808 + add ip, r1, r2 +_020D480C: + cmp r1, ip + blt _020D4818 + b _020D481C +_020D4818: + ldmia r0!, {r2} +_020D481C: + blt _020D4824 + b _020D4828 +_020D4824: + stmia r1!, {r2} +_020D4828: + blt _020D480C + bx lr + arm_func_end MIi_CpuCopy32 + + arm_func_start MIi_CpuSend32 +MIi_CpuSend32: ; 0x020D4830 + add ip, r0, r2 +_020D4834: + cmp r0, ip + blt _020D4840 + b _020D4844 +_020D4840: + ldmia r0!, {r2} +_020D4844: + blt _020D484C + b _020D4850 +_020D484C: + str r2, [r1] +_020D4850: + blt _020D4834 + bx lr + arm_func_end MIi_CpuSend32 + + arm_func_start MIi_CpuClearFast +MIi_CpuClearFast: ; 0x020D4858 + stmdb sp!, {r4, r5, r6, r7, r8, sb} + add sb, r1, r2 + mov ip, r2, lsr #5 + add ip, r1, ip, lsl #5 + mov r2, r0 + mov r3, r2 + mov r4, r2 + mov r5, r2 + mov r6, r2 + mov r7, r2 + mov r8, r2 +_020D4884: + cmp r1, ip + blt _020D4890 + b _020D4894 +_020D4890: + stmia r1!, {r0, r2, r3, r4, r5, r6, r7, r8} +_020D4894: + blt _020D4884 +_020D4898: + cmp r1, sb + blt _020D48A4 + b _020D48A8 +_020D48A4: + stmia r1!, {r0} +_020D48A8: + blt _020D4898 + ldmia sp!, {r4, r5, r6, r7, r8, sb} + bx lr + arm_func_end MIi_CpuClearFast + + arm_func_start MIi_CpuCopyFast +MIi_CpuCopyFast: ; 0x020D48B4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl} + add sl, r1, r2 + mov ip, r2, lsr #5 + add ip, r1, ip, lsl #5 +_020D48C4: + cmp r1, ip + blt _020D48D0 + b _020D48D4 +_020D48D0: + ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, sb} +_020D48D4: + blt _020D48DC + b _020D48E0 +_020D48DC: + stmia r1!, {r2, r3, r4, r5, r6, r7, r8, sb} +_020D48E0: + blt _020D48C4 +_020D48E4: + cmp r1, sl + blt _020D48F0 + b _020D48F4 +_020D48F0: + ldmia r0!, {r2} +_020D48F4: + blt _020D48FC + b _020D4900 +_020D48FC: + stmia r1!, {r2} +_020D4900: + blt _020D48E4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl} + bx lr + arm_func_end MIi_CpuCopyFast + + arm_func_start MI_Copy32B +MI_Copy32B: ; 0x020D490C + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3} + stmia r1!, {r2, r3} + bx lr + arm_func_end MI_Copy32B + + arm_func_start MI_Copy36B +MI_Copy36B: ; 0x020D4928 + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + bx lr + arm_func_end MI_Copy36B + + arm_func_start MI_Copy48B +MI_Copy48B: ; 0x020D4944 + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + bx lr + arm_func_end MI_Copy48B + + arm_func_start MI_Copy64B +MI_Copy64B: ; 0x020D4968 + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0!, {r2, r3, ip} + stmia r1!, {r2, r3, ip} + ldmia r0, {r0, r2, r3, ip} + stmia r1!, {r0, r2, r3, ip} + bx lr + arm_func_end MI_Copy64B + + arm_func_start MI_CpuFill8 +MI_CpuFill8: ; 0x020D4994 + cmp r2, #0 + beq _020D49A0 + b _020D49A4 +_020D49A0: + bx lr +_020D49A4: + tst r0, #1 + beq _020D49D0 + ldrh ip, [r0, #-1] + and ip, ip, #0xff + orr r3, ip, r1, lsl #8 + strh r3, [r0, #-1] + add r0, r0, #1 + subs r2, r2, #1 + beq _020D49CC + b _020D49D0 +_020D49CC: + bx lr +_020D49D0: + cmp r2, #2 + blo _020D4A28 + orr r1, r1, r1, lsl #8 + tst r0, #2 + beq _020D49F8 + strh r1, [r0], #2 + subs r2, r2, #2 + beq _020D49F4 + b _020D49F8 +_020D49F4: + bx lr +_020D49F8: + orr r1, r1, r1, lsl #16 + bics r3, r2, #3 + beq _020D4A18 + sub r2, r2, r3 + add ip, r3, r0 +_020D4A0C: + str r1, [r0], #4 + cmp r0, ip + blo _020D4A0C +_020D4A18: + tst r2, #2 + bne _020D4A24 + b _020D4A28 +_020D4A24: + strh r1, [r0], #2 +_020D4A28: + tst r2, #1 + beq _020D4A34 + b _020D4A38 +_020D4A34: + bx lr +_020D4A38: + ldrh r3, [r0] + and r3, r3, #0xff00 + and r1, r1, #0xff + orr r1, r1, r3 + strh r1, [r0] + bx lr + arm_func_end MI_CpuFill8 + + arm_func_start MI_CpuCopy8 +MI_CpuCopy8: ; 0x020D4A50 + cmp r2, #0 + beq _020D4A5C + b _020D4A60 +_020D4A5C: + bx lr +_020D4A60: + tst r1, #1 + beq _020D4AB8 + ldrh ip, [r1, #-1] + and ip, ip, #0xff + tst r0, #1 + bne _020D4A7C + b _020D4A80 +_020D4A7C: + ldrh r3, [r0, #-1] +_020D4A80: + bne _020D4A88 + b _020D4A8C +_020D4A88: + mov r3, r3, lsr #8 +_020D4A8C: + beq _020D4A94 + b _020D4A98 +_020D4A94: + ldrh r3, [r0] +_020D4A98: + orr r3, ip, r3, lsl #8 + strh r3, [r1, #-1] + add r0, r0, #1 + add r1, r1, #1 + subs r2, r2, #1 + beq _020D4AB4 + b _020D4AB8 +_020D4AB4: + bx lr +_020D4AB8: + eor ip, r1, r0 + tst ip, #1 + beq _020D4B14 + bic r0, r0, #1 + ldrh ip, [r0], #2 + mov r3, ip, lsr #8 + subs r2, r2, #2 + blo _020D4AF0 +_020D4AD8: + ldrh ip, [r0], #2 + orr ip, r3, ip, lsl #8 + strh ip, [r1], #2 + mov r3, ip, lsr #0x10 + subs r2, r2, #2 + bhs _020D4AD8 +_020D4AF0: + tst r2, #1 + beq _020D4AFC + b _020D4B00 +_020D4AFC: + bx lr +_020D4B00: + ldrh ip, [r1] + and ip, ip, #0xff00 + orr ip, ip, r3 + strh ip, [r1] + bx lr +_020D4B14: + tst ip, #2 + beq _020D4B40 + bics r3, r2, #1 + beq _020D4BA4 + sub r2, r2, r3 + add ip, r3, r1 +_020D4B2C: + ldrh r3, [r0], #2 + strh r3, [r1], #2 + cmp r1, ip + blo _020D4B2C + b _020D4BA4 +_020D4B40: + cmp r2, #2 + blo _020D4BA4 + tst r1, #2 + beq _020D4B68 + ldrh r3, [r0], #2 + strh r3, [r1], #2 + subs r2, r2, #2 + beq _020D4B64 + b _020D4B68 +_020D4B64: + bx lr +_020D4B68: + bics r3, r2, #3 + beq _020D4B88 + sub r2, r2, r3 + add ip, r3, r1 +_020D4B78: + ldr r3, [r0], #4 + str r3, [r1], #4 + cmp r1, ip + blo _020D4B78 +_020D4B88: + tst r2, #2 + bne _020D4B94 + b _020D4B98 +_020D4B94: + ldrh r3, [r0], #2 +_020D4B98: + bne _020D4BA0 + b _020D4BA4 +_020D4BA0: + strh r3, [r1], #2 +_020D4BA4: + tst r2, #1 + beq _020D4BB0 + b _020D4BB4 +_020D4BB0: + bx lr +_020D4BB4: + ldrh r2, [r1] + ldrh r0, [r0] + and r2, r2, #0xff00 + and r0, r0, #0xff + orr r0, r2, r0 + strh r0, [r1] + bx lr + arm_func_end MI_CpuCopy8 + + thumb_func_start MI_Zero36B +MI_Zero36B: ; 0x020D4BD0 + mov r1, #0 + mov r2, #0 + mov r3, #0 + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r2, r3} + stmia r0!, {r1, r2, r3} + bx lr + thumb_func_end MI_Zero36B + + .balign 4, 0 diff --git a/lib/NitroSDK/asm/mi_swap.s b/lib/NitroSDK/asm/mi_swap.s new file mode 100644 index 00000000..5c537506 --- /dev/null +++ b/lib/NitroSDK/asm/mi_swap.s @@ -0,0 +1,11 @@ + .include "asm/macros.inc" + .include "mi_swap.inc" + .include "global.inc" + + .text + + arm_func_start MI_SwapWord +MI_SwapWord: ; 0x020D4BE0 + swp r0, r0, [r1] + bx lr + arm_func_end MI_SwapWord diff --git a/lib/NitroSDK/asm/mi_uncompress.s b/lib/NitroSDK/asm/mi_uncompress.s new file mode 100644 index 00000000..9ea1bbc6 --- /dev/null +++ b/lib/NitroSDK/asm/mi_uncompress.s @@ -0,0 +1,88 @@ + .include "asm/macros.inc" + .include "mi_uncompress.inc" + .include "global.inc" + + .text + + arm_func_start MI_UncompressLZ8 +MI_UncompressLZ8: ; 0x020D4BE8 + stmdb sp!, {r4, r5, r6, r7, lr} + ldr r5, [r0], #4 + mov r2, r5, lsr #8 + mov r7, #0 + tst r5, #0xf + bne _020D4C04 + b _020D4C08 +_020D4C04: + mov r7, #1 +_020D4C08: + cmp r2, #0 + ble _020D4CE0 + ldrb lr, [r0], #1 + mov r4, #8 +_020D4C18: + subs r4, r4, #1 + blt _020D4C08 + tst lr, #0x80 + bne _020D4C3C + ldrb r6, [r0], #1 + swpb r6, r6, [r1] + add r1, r1, #1 + sub r2, r2, #1 + b _020D4CC8 +_020D4C3C: + ldrb r5, [r0] + cmp r7, #0 + beq _020D4C4C + b _020D4C50 +_020D4C4C: + mov r6, #3 +_020D4C50: + beq _020D4C94 + tst r5, #0xe0 + bne _020D4C60 + b _020D4C64 +_020D4C60: + mov r6, #1 +_020D4C64: + bne _020D4C94 + add r0, r0, #1 + and r6, r5, #0xf + mov r6, r6, lsl #4 + tst r5, #0x10 + beq _020D4C8C + mov r6, r6, lsl #8 + ldrb r5, [r0], #1 + add r6, r6, r5, lsl #4 + add r6, r6, #0x100 +_020D4C8C: + add r6, r6, #0x11 + ldrb r5, [r0] +_020D4C94: + add r3, r6, r5, asr #4 + add r0, r0, #1 + and r5, r5, #0xf + mov ip, r5, lsl #8 + ldrb r6, [r0], #1 + orr r5, r6, ip + add ip, r5, #1 + sub r2, r2, r3 +_020D4CB4: + ldrb r5, [r1, -ip] + swpb r5, r5, [r1] + add r1, r1, #1 + subs r3, r3, #1 + bgt _020D4CB4 +_020D4CC8: + cmp r2, #0 + bgt _020D4CD4 + b _020D4CD8 +_020D4CD4: + mov lr, lr, lsl #1 +_020D4CD8: + bgt _020D4C18 + b _020D4C08 +_020D4CE0: + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + arm_func_end MI_UncompressLZ8 diff --git a/lib/NitroSDK/asm/mi_wram.s b/lib/NitroSDK/asm/mi_wram.s new file mode 100644 index 00000000..85bb2da7 --- /dev/null +++ b/lib/NitroSDK/asm/mi_wram.s @@ -0,0 +1,14 @@ + .include "asm/macros.inc" + .include "mi_wram.inc" + .include "global.inc" + + .text + + arm_func_start MI_SetWramBank +MI_SetWramBank: ; 0x020D3F64 + ldr r1, _020D3F70 ; =0x04000247 + strb r0, [r1] + bx lr + .align 2, 0 +_020D3F70: .word 0x04000247 ; reg_GX_VRAMCNT_WRAM + arm_func_end MI_SetWramBank diff --git a/lib/NitroSDK/asm/wvr.s b/lib/NitroSDK/asm/wvr.s new file mode 100644 index 00000000..700482cb --- /dev/null +++ b/lib/NitroSDK/asm/wvr.s @@ -0,0 +1,315 @@ + .include "asm/macros.inc" + .include "wvr.inc" + .include "global.inc" + + .bss + +wvrLockId: + .space 2 + +wvrVRam: + .space 2 + +wvrArg: + .space 4 + +wvrCallback: + .space 4 + + .text + + arm_func_start WVR_StartUpAsync +WVR_StartUpAsync: ; 0x0209E00C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl PXI_Init + mov r0, #0xf + mov r1, #1 + bl PXI_IsCallbackReady + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r8, _0209E234 ; =.bss + ldrh r0, [r8] + cmp r0, #0 + bne _0209E06C + mvn r4, #2 +_0209E04C: + bl OS_GetLockID + cmp r0, r4 + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + strh r0, [r8] + ldrh r0, [r8] + cmp r0, #0 + beq _0209E04C +_0209E06C: + bl OS_DisableInterrupts + ldr r1, _0209E234 ; =.bss + mov r4, r0 + ldr r2, [r1, #8] + cmp r2, #0 + beq _0209E090 + bl OS_RestoreInterrupts + mov r0, #5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E090: + ldrh r2, [r1, #2] + cmp r2, #0 + beq _0209E0A8 + bl OS_RestoreInterrupts + mov r0, #5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E0A8: + cmp r7, #4 + beq _0209E0C4 + cmp r7, #8 + beq _0209E104 + cmp r7, #0xc + beq _0209E144 + b _0209E18C +_0209E0C4: + ldrh r1, [r1] + mov r0, #4 + bl OSi_TryLockVram + cmp r0, #0 + bne _0209E0E8 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E0E8: + ldr r0, _0209E234 ; =.bss + mov r2, #4 + ldr r1, _0209E238 ; =0x04000242 + strh r2, [r0, #2] + mov r0, #0x82 + strb r0, [r1] + b _0209E198 +_0209E104: + ldrh r1, [r1] + mov r0, #8 + bl OSi_TryLockVram + cmp r0, #0 + bne _0209E128 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E128: + ldr r0, _0209E234 ; =.bss + mov r2, #8 + ldr r1, _0209E23C ; =0x04000243 + strh r2, [r0, #2] + mov r0, #0x82 + strb r0, [r1] + b _0209E198 +_0209E144: + ldrh r1, [r1] + mov r0, #0xc + bl OSi_TryLockVram + cmp r0, #0 + bne _0209E168 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E168: + ldr r0, _0209E234 ; =.bss + mov r2, #0xc + ldr r1, _0209E238 ; =0x04000242 + strh r2, [r0, #2] + mov r0, #0x82 + strb r0, [r1] + mov r0, #0x8a + strb r0, [r1, #1] + b _0209E198 +_0209E18C: + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E198: + mov r0, #0xf + mov r1, #0 + bl PXI_IsCallbackReady + cmp r0, #0 + bne _0209E1B8 + ldr r1, _0209E240 ; =WvrReceiveCallback + mov r0, #0xf + bl PXI_SetFifoRecvCallback +_0209E1B8: + cmp r6, #0 + ldrne r0, _0209E234 ; =.bss + strne r6, [r0, #8] + bne _0209E1D4 + ldr r1, _0209E244 ; =WvrDummyAsyncCallback + ldr r0, _0209E234 ; =.bss + str r1, [r0, #8] +_0209E1D4: + ldr r3, _0209E234 ; =.bss + mov r0, #0xf + mov r1, #0x10000 + mov r2, #0 + str r5, [r3, #4] + bl PXI_SendWordByFifo + cmp r0, #0 + bge _0209E224 + ldr r1, _0209E234 ; =.bss + ldrh r0, [r1, #2] + ldrh r1, [r1] + bl OSi_UnlockVram + ldr r1, _0209E234 ; =.bss + mov r2, #0 + strh r2, [r1, #2] + mov r0, r4 + str r2, [r1, #8] + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0209E224: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_0209E234: .word .bss +_0209E238: .word 0x04000242 +_0209E23C: .word 0x04000243 +_0209E240: .word WvrReceiveCallback +_0209E244: .word WvrDummyAsyncCallback + arm_func_end WVR_StartUpAsync + + arm_func_start WVR_TerminateAsync +WVR_TerminateAsync: ; 0x0209E248 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl PXI_Init + mov r0, #0xf + mov r1, #1 + bl PXI_IsCallbackReady + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} + bl OS_DisableInterrupts + ldr r1, _0209E31C ; =.bss + mov r4, r0 + ldr r1, [r1, #8] + cmp r1, #0 + beq _0209E294 + bl OS_RestoreInterrupts + mov r0, #5 + ldmia sp!, {r4, r5, r6, pc} +_0209E294: + mov r0, #0xf + mov r1, #0 + bl PXI_IsCallbackReady + cmp r0, #0 + bne _0209E2B4 + ldr r1, _0209E320 ; =WvrReceiveCallback + mov r0, #0xf + bl PXI_SetFifoRecvCallback +_0209E2B4: + cmp r6, #0 + ldrne r0, _0209E31C ; =.bss + strne r6, [r0, #8] + bne _0209E2D0 + ldr r1, _0209E324 ; =WvrDummyAsyncCallback + ldr r0, _0209E31C ; =.bss + str r1, [r0, #8] +_0209E2D0: + ldr r3, _0209E31C ; =.bss + mov r0, #0xf + mov r1, #0x20000 + mov r2, #0 + str r5, [r3, #4] + bl PXI_SendWordByFifo + cmp r0, #0 + bge _0209E30C + ldr r1, _0209E31C ; =.bss + mov r2, #0 + mov r0, r4 + str r2, [r1, #8] + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r4, r5, r6, pc} +_0209E30C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0209E31C: .word .bss +_0209E320: .word WvrReceiveCallback +_0209E324: .word WvrDummyAsyncCallback + arm_func_end WVR_TerminateAsync + + arm_func_start WvrReceiveCallback +WvrReceiveCallback: ; 0x0209E328 + stmdb sp!, {r4, r5, r6, lr} + mov r0, #0x10000 + ldr r2, _0209E3FC ; =.bss + rsb r0, r0, #0 + and r0, r1, r0 + cmp r0, #0x10000 + and r6, r1, #0xff + ldr r4, [r2, #8] + ldr r5, [r2, #4] + beq _0209E35C + cmp r0, #0x20000 + beq _0209E394 + b _0209E3D4 +_0209E35C: + cmp r6, #7 + bne _0209E3D4 + ldrh r0, [r2, #2] + cmp r0, #0 + ldrneh r0, [r2] + cmpne r0, #0 + beq _0209E3D4 + ldrh r0, [r2, #2] + ldrh r1, [r2] + bl OSi_UnlockVram + ldr r0, _0209E3FC ; =.bss + mov r1, #0 + strh r1, [r0, #2] + b _0209E3D4 +_0209E394: + cmp r6, #0 + bne _0209E3C8 + ldrh r0, [r2, #2] + cmp r0, #0 + ldrneh r0, [r2] + cmpne r0, #0 + beq _0209E3C8 + ldrh r0, [r2, #2] + ldrh r1, [r2] + bl OSi_UnlockVram + ldr r0, _0209E3FC ; =.bss + mov r1, #0 + strh r1, [r0, #2] +_0209E3C8: + mov r0, #0xf + mov r1, #0 + bl PXI_SetFifoRecvCallback +_0209E3D4: + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r2, _0209E3FC ; =.bss + mov r3, #0 + str r3, [r2, #8] + mov r0, r5 + mov r1, r6 + str r3, [r2, #4] + blx r4 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0209E3FC: .word .bss + arm_func_end WvrReceiveCallback + + arm_func_start WvrDummyAsyncCallback +WvrDummyAsyncCallback: ; 0x0209E400 + bx lr + arm_func_end WvrDummyAsyncCallback diff --git a/lib/NitroSDK/src/os/os_alarm.c b/lib/NitroSDK/src/os/os_alarm.c new file mode 100644 index 00000000..5b36d4f8 --- /dev/null +++ b/lib/NitroSDK/src/os/os_alarm.c @@ -0,0 +1,197 @@ +#include + +void OSi_AlarmHandler(void *arg); +void OSi_ArrangeTimer(void); + +#define OSi_ALARM_TIMER OS_TIMER_1 +#define OSi_ALARM_TIMERCONTROL ((1 << REG_OS_TM1CNT_H_E_SHIFT) | (1 << REG_OS_TM1CNT_H_I_SHIFT) | OS_TIMER_PRESCALER_64) +#define OSi_ALARM_IE_TIMER OS_IE_TIMER1 + +u16 OSi_UseAlarm = FALSE; +struct OSiAlarmQueue OSi_AlarmQueue; + +void OSi_SetTimer(OSAlarm *alarm) { + s64 delta; + OSTick tick = OS_GetTick(); + u16 timerCount; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + delta = alarm->fire - tick; + OSi_EnterTimerCallback(OSi_ALARM_TIMER, OSi_AlarmHandler, NULL); + if (delta < 0) { + timerCount = (u16)~1; + } else if (delta < 0x10000) { + timerCount = (u16)~delta; + } else { + timerCount = 0; + } + OS_SetTimerCount(OSi_ALARM_TIMER, timerCount); + OS_SetTimerControl(OSi_ALARM_TIMER, OSi_ALARM_TIMERCONTROL); + OS_EnableIrqMask(OSi_ALARM_IE_TIMER); +} + +void OS_InitAlarm(void) { + if (OSi_UseAlarm) { + return; + } + OSi_UseAlarm = TRUE; + OSi_SetTimerReserved(OSi_ALARM_TIMER); + OSi_AlarmQueue.head = NULL; + OSi_AlarmQueue.tail = NULL; + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); +} + +BOOL OS_IsAlarmAvailable(void) { + return OSi_UseAlarm; +} + +void OS_CreateAlarm(OSAlarm *alarm) { + alarm->handler = NULL; + alarm->tag = 0; +} + +void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire) { + OSAlarm *prev; + OSAlarm *next; + + if (alarm->period > 0) { + OSTick tick = OS_GetTick(); + fire = alarm->start; + if (alarm->start < tick) { + fire += alarm->period * ((tick - alarm->start) / alarm->period + 1); + } + } + alarm->fire = fire; + for (next = OSi_AlarmQueue.head; next; next = next->next) { + if ((s64)(fire - next->fire) >= 0) { // cast required to match + continue; + } + alarm->prev = next->prev; + next->prev = alarm; + alarm->next = next; + prev = alarm->prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = alarm; + OSi_SetTimer(alarm); + } + return; + } + alarm->next = NULL; + prev = OSi_AlarmQueue.tail; + OSi_AlarmQueue.tail = alarm; + alarm->prev = prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = OSi_AlarmQueue.tail = alarm; // why set .tail twice? + OSi_SetTimer(alarm); + } +} + +void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg) { + OSIntrMode enabled; + + if (alarm == NULL || alarm->handler != NULL) { + OS_Panic(""); + } + + enabled = OS_DisableInterrupts(); + alarm->period = 0; + alarm->handler = handler; + alarm->arg = arg; + OSi_InsertAlarm(alarm, tick + OS_GetTick()); + OS_RestoreInterrupts(enabled); +} + +void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg) { + OSIntrMode enabled; + + if (alarm == NULL || alarm->handler != NULL) { + OS_Panic(""); + } + + enabled = OS_DisableInterrupts(); + alarm->period = period; + alarm->start = start; + alarm->handler = handler; + alarm->arg = arg; + OSi_InsertAlarm(alarm, 0); +} + +void OS_CancelAlarm(OSAlarm *alarm) { + OSAlarm *next; + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + if (alarm->handler == NULL) { + OS_RestoreInterrupts(enabled); + return; + } + next = alarm->next; + if (next == NULL) { + OSi_AlarmQueue.tail = alarm->prev; + } else { + next->prev = alarm->prev; + } + if (alarm->prev != NULL) { + alarm->prev->next = next; + } else { + OSi_AlarmQueue.head = next; + if (next != NULL) { + OSi_SetTimer(next); + } + } + alarm->handler = NULL; + alarm->period = 0; + OS_RestoreInterrupts(enabled); +} + +asm void OSi_AlarmHandler(void *arg) { + stmdb sp!, {r0, lr} + bl OSi_ArrangeTimer + ldmia sp!, {r0, lr} + bx lr +} + +void OSi_ArrangeTimer(void) { + OSTick tick; + OSAlarm *alarm; + OSAlarm *next; + OSAlarmHandler handler; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); + OS_SetIrqCheckFlag(OSi_ALARM_IE_TIMER); + tick = OS_GetTick(); + alarm = OSi_AlarmQueue.head; + if (alarm == NULL) { + return; + } + if (tick < alarm->fire) { + OSi_SetTimer(alarm); + return; + } + next = alarm->next; + OSi_AlarmQueue.head = next; + if (next == NULL) { + OSi_AlarmQueue.tail = NULL; + } else { + next->prev = NULL; + } + handler = alarm->handler; + if (alarm->period == 0) { + alarm->handler = NULL; + } + if (handler) { + handler(alarm->arg); + } + if (alarm->period > 0) { + alarm->handler = handler; + OSi_InsertAlarm(alarm, 0); + } + if (OSi_AlarmQueue.head) { + OSi_SetTimer(OSi_AlarmQueue.head); + } +} diff --git a/lib/NitroSDK/src/os/os_alloc.c b/lib/NitroSDK/src/os/os_alloc.c new file mode 100644 index 00000000..a6dcb853 --- /dev/null +++ b/lib/NitroSDK/src/os/os_alloc.c @@ -0,0 +1,272 @@ +#include + +#define OFFSET(n, a) (((u32) (n)) & ((a) - 1)) +#define TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) +#define ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) + +#define ALIGNMENT 32 +#define MINOBJSIZE (HEADERSIZE + ALIGNMENT) +#define HEADERSIZE ROUND(sizeof(Cell), ALIGNMENT) + +void *OSiHeapInfo[OS_ARENA_MAX] = {}; + +static +#ifdef SDK_ARM7 +inline +#endif //SDK_ARM7 +Cell *DLAddFront(Cell *list, Cell *cell) { + cell->next = list; + cell->prev = NULL; + if (list != NULL) { + list->prev = cell; + } + return cell; +} + +Cell *DLExtract(Cell *list, Cell *cell) { + if (cell->next != NULL) { + cell->next->prev = cell->prev; + } + if (cell->prev == NULL) { + return cell->next; + } else { + cell->prev->next = cell->next; + return list; + } +} + +Cell *DLInsert(Cell *list, Cell *cell) { + Cell *prev; + Cell *next; + + for (next = list, prev = NULL; next; prev = next, next = next->next) { + if (cell <= next) { + break; + } + } + + cell->next = next; + cell->prev = prev; + + if (next) { + next->prev = cell; + if ((char *)cell + cell->size == (char *)next) { + cell->size += next->size; + cell->next = next = next->next; + if (next) { + next->prev = cell; + } + } + } + if (prev) { + prev->next = cell; + if ((char *)prev + prev->size == (char *)cell) { + prev->size += cell->size; + prev->next = next; + if (next) { + next->prev = prev; + } + } + return list; + } else { + return cell; + } +} + +void *OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + Cell *newCell; + long leftoverSize; + OSIntrMode enabled = OS_DisableInterrupts(); + + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + if (heapInfo == NULL) { + OS_RestoreInterrupts(enabled); + return NULL; + } + + if (heap < 0) { + heap = heapInfo->currentHeap; + } + hd = &heapInfo->heapArray[heap]; + size += HEADERSIZE; + size = ROUND(size, ALIGNMENT); + for (cell = hd->free; cell != NULL; cell = cell->next) { + if ((long)size <= cell->size) { + break; + } + } + if (cell == NULL) { + OS_RestoreInterrupts(enabled); + return NULL; + } + leftoverSize = cell->size - size; + if (leftoverSize < MINOBJSIZE) { + hd->free = DLExtract(hd->free, cell); + } else { + cell->size = (long)size; + newCell = (Cell*)((char *)cell + size); + newCell->size = leftoverSize; + newCell->prev = cell->prev; + newCell->next = cell->next; + if (newCell->next != NULL) { + newCell->next->prev = newCell; + } + if (newCell->prev != NULL) { + newCell->prev->next = newCell; + } else { + // debug assert here: "broken heap" + hd->free = newCell; + } + } + hd->allocated = DLAddFront(hd->allocated, cell); + OS_RestoreInterrupts(enabled); + return (void *)((char *)cell + HEADERSIZE); +} + +void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void *ptr) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + if (heap < 0) { + heap = heapInfo->currentHeap; + } + hd = &heapInfo->heapArray[heap]; + cell = (Cell *)((char *)ptr - HEADERSIZE); + hd->allocated = DLExtract(hd->allocated, cell); + hd->free = DLInsert(hd->free, cell); + OS_RestoreInterrupts(enabled); +} + +OSHeapHandle OS_SetCurrentHeap(OSArenaId id, OSHeapHandle heap) { + OSHeapInfo *heapInfo; + OSHeapHandle prev; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + prev = heapInfo->currentHeap; + heapInfo->currentHeap = heap; + OS_RestoreInterrupts(enabled); + return prev; +} + +void *OS_InitAlloc(OSArenaId id, void *arenaStart, void *arenaEnd, s32 maxHeaps) { + OSHeapInfo *heapInfo; + OSHeapHandle i; + u32 arraySize; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = arenaStart; + OSiHeapInfo[id] = heapInfo; + arraySize = sizeof(HeapDesc) * maxHeaps; + heapInfo->heapArray = (void *)((u32)arenaStart + sizeof(OSHeapInfo)); + heapInfo->numHeaps = maxHeaps; + for (i = 0; i < heapInfo->numHeaps; i++) { + HeapDesc *hd = &heapInfo->heapArray[i]; + hd->size = -1; + hd->free = hd->allocated = NULL; + } + heapInfo->currentHeap = -1; + arenaStart = (void *)((char *)heapInfo->heapArray + arraySize); + arenaStart = (void *)ROUND(arenaStart, ALIGNMENT); + heapInfo->arenaStart = arenaStart; + heapInfo->arenaEnd = (void *)TRUNC(arenaEnd, ALIGNMENT); + OS_RestoreInterrupts(enabled); + return heapInfo->arenaStart; +} + +void OS_ClearAlloc(OSArenaId id) { + OSiHeapInfo[id] = NULL; // Act like it never existed +} + +OSHeapHandle OS_CreateHeap(OSArenaId id, void *start, void *end) { + OSHeapInfo *heapInfo; + OSHeapHandle heap; + HeapDesc *hd; + Cell *cell; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + start = (void *)ROUND(start, ALIGNMENT); + end = (void *)TRUNC(end, ALIGNMENT); + for (heap = 0; heap < heapInfo->numHeaps; heap++) { + hd = &heapInfo->heapArray[heap]; + if (hd->size < 0) { + // This heap is available, asign it + hd->size = (char *)end - (char *)start; + cell = (Cell *)start; + cell->prev = NULL; + cell->next = NULL; + cell->size = hd->size; + hd->free = cell; + hd->allocated = NULL; + OS_RestoreInterrupts(enabled); + return heap; + } + } + // No heap is available, signal such + OS_RestoreInterrupts(enabled); + return -1; +} + +#define InRange(targ, a, b)((u32)(a) <= (u32)(targ) && (u32)(targ) < (u32)(b)) + +#define OSi_CHECK(exp) do { \ + if (!(exp)) { \ + goto exit_OS_CheckHeap; \ + } \ +} while (0) + +s32 OS_CheckHeap(OSArenaId id, OSHeapHandle heap) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + long total = 0; + long free = 0; + long retValue = -1; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = OSiHeapInfo[id]; + if (heap == -1) { + heap = heapInfo->currentHeap; + } + OSi_CHECK(heapInfo->heapArray); + OSi_CHECK(0 <= heap && heap < heapInfo->numHeaps); + + hd = &heapInfo->heapArray[heap]; + OSi_CHECK(0 <= hd->size); + + OSi_CHECK(hd->allocated == NULL || hd->allocated->prev == NULL); + for (cell = hd->allocated; cell; cell = cell->next) { + OSi_CHECK(InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OFFSET(cell, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OFFSET(cell->size, ALIGNMENT) == 0); + + total += cell->size; + OSi_CHECK(0 < total && total <= hd->size); + + } + + OSi_CHECK(hd->free == NULL || hd->free->prev == NULL); + for (cell = hd->free; cell; cell = cell->next) { + OSi_CHECK(InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OFFSET(cell, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OFFSET(cell->size, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || (char *) cell + cell->size < (char *) cell->next); + + total += cell->size; + free += cell->size - HEADERSIZE; + OSi_CHECK(0 < total && total <= hd->size); + } + + OSi_CHECK(total == hd->size); + retValue = free; + +exit_OS_CheckHeap: + OS_RestoreInterrupts(enabled); + return retValue; +} diff --git a/lib/NitroSDK/src/os/os_arena.c b/lib/NitroSDK/src/os/os_arena.c new file mode 100644 index 00000000..fa894f69 --- /dev/null +++ b/lib/NitroSDK/src/os/os_arena.c @@ -0,0 +1,243 @@ +#include + +extern void SDK_IRQ_STACKSIZE(void); +#define OSi_IRQ_STACKSIZE ((s32)SDK_IRQ_STACKSIZE) +extern void SDK_SYS_STACKSIZE(void); +#define OSi_SYS_STACKSIZE ((s32)SDK_SYS_STACKSIZE) + +#ifdef SDK_ARM9 +extern void SDK_SECTION_ARENA_DTCM_START(void); +#define OSi_DTCM_ARENA_LO_DEFAULT ((s32)SDK_SECTION_ARENA_DTCM_START) + +extern void SDK_SECTION_ARENA_ITCM_START(void); +#define OSi_ITCM_ARENA_LO_DEFAULT ((s32)SDK_SECTION_ARENA_ITCM_START) + +extern void SDK_MAIN_ARENA_LO(void); +#define OSi_MAIN_ARENA_LO_DEFAULT ((s32)SDK_MAIN_ARENA_LO) +#else +extern void SDK_SUBPRIV_ARENA_LO(void); +#define OSi_SUBPRIV_ARENA_LO_DEFAULT ((s32)SDK_SUBPRIV_ARENA_LO) + +extern void SDK_WRAM_ARENA_LO(void); +#define OSi_WRAM_ARENA_LO_DEFAULT ((s32)SDK_WRAM_ARENA_LO) +#endif //SDK_ARM9 + +static BOOL OSi_Initialized = FALSE; +#ifdef SDK_ARM9 +static BOOL OSi_MainArenaEnabled = FALSE; +#endif + +void OS_InitArena(void) { + if (OSi_Initialized) { + return; + } + OSi_Initialized = TRUE; +#ifdef SDK_ARM9 + OS_SetArenaHi(OS_ARENA_MAIN, OS_GetInitArenaHi(OS_ARENA_MAIN)); + OS_SetArenaLo(OS_ARENA_MAIN, OS_GetInitArenaLo(OS_ARENA_MAIN)); + OS_SetArenaLo(OS_ARENA_MAINEX, NULL); + OS_SetArenaHi(OS_ARENA_MAINEX, NULL); + OS_SetArenaHi(OS_ARENA_ITCM, OS_GetInitArenaHi(OS_ARENA_ITCM)); + OS_SetArenaLo(OS_ARENA_ITCM, OS_GetInitArenaLo(OS_ARENA_ITCM)); + OS_SetArenaHi(OS_ARENA_DTCM, OS_GetInitArenaHi(OS_ARENA_DTCM)); + OS_SetArenaLo(OS_ARENA_DTCM, OS_GetInitArenaLo(OS_ARENA_DTCM)); + OS_SetArenaHi(OS_ARENA_SHARED, OS_GetInitArenaHi(OS_ARENA_SHARED)); + OS_SetArenaLo(OS_ARENA_SHARED, OS_GetInitArenaLo(OS_ARENA_SHARED)); + OS_SetArenaHi(OS_ARENA_WRAM_MAIN, OS_GetInitArenaHi(OS_ARENA_WRAM_MAIN)); + OS_SetArenaLo(OS_ARENA_WRAM_MAIN, OS_GetInitArenaLo(OS_ARENA_WRAM_MAIN)); +#else + OS_InitArenaHiAndLo(OS_ARENA_MAIN_SUBPRIV); + OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUB); + OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUBPRIV); +#endif +} + +#ifdef SDK_ARM9 +void OS_InitArenaEx(void) { + OS_SetArenaHi(OS_ARENA_MAINEX, OS_GetInitArenaHi(OS_ARENA_MAINEX)); + OS_SetArenaLo(OS_ARENA_MAINEX, OS_GetInitArenaLo(OS_ARENA_MAINEX)); + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + OS_SetProtectionRegion(1, HW_MAIN_MEM_MAIN, 4MB); + OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 128KB); + } +} +#else +static inline void OS_InitArenaHi(OSArenaId id) +{ + OS_SetArenaHi(id, OS_GetInitArenaHi((OSArenaId)id)); +} + +static inline void OS_InitArenaLo(OSArenaId id) +{ + OS_SetArenaLo(id, OS_GetInitArenaLo(id)); +} + +void OS_InitArenaHiAndLo(OSArenaId id) +{ + OS_InitArenaHi(id); + OS_InitArenaLo(id); +} +#endif //SDK_ARM9 + +void *OS_GetArenaHi(OSArenaId id) { + return OSi_GetArenaInfo().hi[id]; +} + +void *OS_GetArenaLo(OSArenaId id) { + return OSi_GetArenaInfo().lo[id]; +} + +void *OS_GetInitArenaHi(OSArenaId id) { + switch (id) { +#ifdef SDK_ARM9 + case OS_ARENA_MAIN: + return (void *)OSi_MAIN_ARENA_HI_DEFAULT; + case OS_ARENA_MAINEX: + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + return NULL; + } else { + return (void *)OSi_MAINEX_ARENA_HI_DEFAULT; + } + case OS_ARENA_ITCM: + return (void *)HW_ITCM_ARENA_HI_DEFAULT; + case OS_ARENA_DTCM: { + u32 irqStackLo; + u32 sysStackLo; + + irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - OSi_IRQ_STACKSIZE; + + if (OSi_SYS_STACKSIZE == 0) { + sysStackLo = HW_DTCM; + if (sysStackLo < OSi_DTCM_ARENA_LO_DEFAULT) { + sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT; + } + } else if (OSi_SYS_STACKSIZE < 0) { + sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT - OSi_SYS_STACKSIZE; + } else { + sysStackLo = irqStackLo - OSi_SYS_STACKSIZE; + } + return (void *)sysStackLo; + } + case OS_ARENA_SHARED: + return (void *)HW_SHARED_ARENA_HI_DEFAULT; + case OS_ARENA_WRAM_MAIN: + return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT; +#else + case OS_ARENA_MAIN_SUBPRIV: + return (void *)HW_MAIN_MEM_SUB_END; + case OS_ARENA_WRAM_SUB: + return (void *)HW_WRAM_END; + case OS_ARENA_WRAM_SUBPRIV: + { + u32 irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE; + u32 sysStackLo = (u32)HW_PRV_WRAM; + + if ((u32)OSi_WRAM_ARENA_LO_DEFAULT > (u32)HW_PRV_WRAM) { + sysStackLo = (u32)OSi_WRAM_ARENA_LO_DEFAULT; + } + + if (!OSi_SYS_STACKSIZE) { + return (void *)sysStackLo; + } else if (OSi_SYS_STACKSIZE < 0) { + sysStackLo -= OSi_SYS_STACKSIZE; + } else { + sysStackLo = irqStackLo - OSi_SYS_STACKSIZE; + } + + return (void *)sysStackLo; + } +#endif //SDK_ARM9 + default: + return NULL; + } +} + +void *OS_GetInitArenaLo(OSArenaId id) { + switch (id) { +#ifdef SDK_ARM9 + case OS_ARENA_MAIN: + return (void *)OSi_MAIN_ARENA_LO_DEFAULT; + case OS_ARENA_MAINEX: + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + return NULL; + } else { + return (void *)OSi_MAINEX_ARENA_LO_DEFAULT; + } + case OS_ARENA_ITCM: + return (void *)OSi_ITCM_ARENA_LO_DEFAULT; + case OS_ARENA_DTCM: + return (void *)OSi_DTCM_ARENA_LO_DEFAULT; + case OS_ARENA_SHARED: + return (void *)HW_SHARED_ARENA_LO_DEFAULT; + case OS_ARENA_WRAM_MAIN: + return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT; +#else + case OS_ARENA_MAIN_SUBPRIV: + return (void *)OSi_SUBPRIV_ARENA_LO_DEFAULT; + case OS_ARENA_WRAM_SUB: + { + u32 wramSubLo = ((u32)OSi_WRAM_ARENA_LO_DEFAULT); + if ((u32)HW_WRAM_END < (u32)wramSubLo) { + wramSubLo = (u32)HW_WRAM_END; + } + return (void *)wramSubLo; + } + case OS_ARENA_WRAM_SUBPRIV: + { + u32 privWramLo = HW_PRV_WRAM; + if ((u32)OSi_WRAM_ARENA_LO_DEFAULT > (u32)privWramLo) { + privWramLo = (u32)OSi_WRAM_ARENA_LO_DEFAULT; + } + return (void *)privWramLo; + } +#endif + default: + return NULL; + } +} + +void OS_SetArenaHi(OSArenaId id, void *ptr) { + OSi_GetArenaInfo().hi[id] = ptr; +} + +void OS_SetArenaLo(OSArenaId arena, void *ptr) { + OSi_GetArenaInfo().lo[arena] = ptr; +} + +void *OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) { + void *ptr; + u8 *arenaLo; + + ptr = OS_GetArenaLo(id); + if (ptr == NULL) { + return NULL; + } + + arenaLo = ptr = (void *)OSi_ROUND(ptr, align); + arenaLo += size; + arenaLo = (u8 *)OSi_ROUND(arenaLo, align); + if (arenaLo > (u8 *)OS_GetArenaHi(id)) { + return NULL; + } + OS_SetArenaLo(id, arenaLo); + return ptr; +} + +void *OS_AllocFromArenaHi(OSArenaId arena, u32 size, u32 align) { + void *ptr; + u8 *arenaHi; + + arenaHi = OS_GetArenaHi(arena); + if (arenaHi == NULL) { + return NULL; + } + + arenaHi = (u8 *)OSi_TRUNC(arenaHi, align); + arenaHi -= size; + arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align); + if (arenaHi < (u8 *)OS_GetArenaLo(arena)) { + return NULL; + } + OS_SetArenaHi(arena, arenaHi); + return ptr; +} diff --git a/lib/NitroSDK/src/os/os_cache.c b/lib/NitroSDK/src/os/os_cache.c new file mode 100644 index 00000000..1cc54593 --- /dev/null +++ b/lib/NitroSDK/src/os/os_cache.c @@ -0,0 +1,100 @@ +#include +#include + +asm void DC_InvalidateAll(void) { + mov r0, #0 + mcr p15, 0, r0, c7, c6, 0 + bx lr +} + +asm void DC_StoreAll(void) { + mov r1, #0 +@outerLoop: + mov r0, #0 +@innerLoop: + orr r2, r1, r0 + mcr p15, 0, r2, c7, c10, 2 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, #HW_DCACHE_SIZE / 4 + blt @innerLoop + add r1, r1, #1 << HW_C7_CACHE_SET_NO_SHIFT + cmp r1, #0 + bne @outerLoop + bx lr +} + +asm void DC_FlushAll(void) { + mov r12, #0 + mov r1, #0 +@outerLoop: + mov r0, #0 +@innerLoop: + orr r2, r1, r0 + mcr p15, 0, r12, c7, c10, 4 + mcr p15, 0, r2, c7, c14, 2 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, #HW_DCACHE_SIZE / 4 + blt @innerLoop + add r1, r1, #1 << HW_C7_CACHE_SET_NO_SHIFT + cmp r1, #0 + bne @outerLoop + bx lr +} + +asm void DC_InvalidateRange(register void * startAddr, register u32 nBytes) { + add r1, r1, r0 + bic r0, r0, #HW_CACHE_LINE_SIZE - 1 +@loop: + mcr p15, 0, r0, c7, c6, 1 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, r1 + blt @loop + bx lr +} + +asm void DC_StoreRange(register void * startAddr, register u32 nBytes) { + add r1, r1, r0 + bic r0, r0, #HW_CACHE_LINE_SIZE - 1 +@loop: + mcr p15, 0, r0, c7, c10, 1 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, r1 + blt @loop + bx lr +} + +asm void DC_FlushRange(register const void * startAddr, register u32 nBytes) { + mov r12, #0 + add r1, r1, r0 + bic r0, r0, #HW_CACHE_LINE_SIZE - 1 +@loop: + mcr p15, 0, r12, c7, c10, 4 + mcr p15, 0, r0, c7, c14, 1 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, r1 + blt @loop + bx lr +} + +asm void DC_WaitWriteBufferEmpty(void) { + mov r0, #0 + mcr p15, 0, r0, c7, c10, 4 + bx lr +} + +asm void IC_InvalidateAll(void) { + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 + bx lr +} + +asm void IC_InvalidateRange(register void *startAddr, register u32 nBytes) { + add r1, r1, r0 + bic r0, r0, #HW_CACHE_LINE_SIZE - 1 +@loop: + mcr p15, 0, r0, c7, c5, 1 + add r0, r0, #HW_CACHE_LINE_SIZE + cmp r0, r1 + blt @loop + bx lr +} diff --git a/lib/NitroSDK/src/os/os_context.c b/lib/NitroSDK/src/os/os_context.c new file mode 100644 index 00000000..0c71371f --- /dev/null +++ b/lib/NitroSDK/src/os/os_context.c @@ -0,0 +1,96 @@ +#include +#include + +asm void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp) { + add newpc, newpc, #4 + str newpc, [context, #OS_CONTEXT_PC_PLUS4] + +#ifdef SDK_CONTEXT_HAS_SP_SVC + str newsp, [context, #OS_CONTEXT_SP_SVC] + sub newsp, newsp, #HW_SVC_STACK_SIZE +#endif + + tst newsp, #4 + subne newsp, newsp, #4 + str newsp, [context, #OS_CONTEXT_SP] + + ands newpc, newpc, #1 + movne r1, #HW_PSR_SYS_MODE | HW_PSR_THUMB_STATE + moveq r1, #HW_PSR_SYS_MODE | HW_PSR_ARM_STATE + str r1, [context, #OS_CONTEXT_CPSR] + + // Zero-initialize the registers + mov r1, #0 + str r1, [context, #OS_CONTEXT_R0] + str r1, [context, #OS_CONTEXT_R1] + str r1, [context, #OS_CONTEXT_R2] + str r1, [context, #OS_CONTEXT_R3] + str r1, [context, #OS_CONTEXT_R4] + str r1, [context, #OS_CONTEXT_R5] + str r1, [context, #OS_CONTEXT_R6] + str r1, [context, #OS_CONTEXT_R7] + str r1, [context, #OS_CONTEXT_R8] + str r1, [context, #OS_CONTEXT_R9] + str r1, [context, #OS_CONTEXT_R10] + str r1, [context, #OS_CONTEXT_R11] + str r1, [context, #OS_CONTEXT_R12] + str r1, [context, #OS_CONTEXT_R14] + bx lr +} + +asm BOOL OS_SaveContext(register OSContext *context) { +#ifdef SDK_ARM9 + stmdb sp!, {r0, lr} + add r0, r0, #OS_CONTEXT_CP_CONTEXT + ldr r1, =CP_SaveContext + blx r1 + ldmia sp!, {r0, lr} +#endif + add r1, r0, #0 + + mrs r2, cpsr + str r2, [r1], #OS_CONTEXT_R0 - OS_CONTEXT_CPSR + +#ifdef SDK_CONTEXT_HAS_SP_SVC + mov r0, #HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE | HW_PSR_ARM_STATE + msr cpsr_c, r0 + str sp, [r1, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0] + msr cpsr_c, r2 +#endif + + mov r0, #1 // Return value if restoring context via OS_LoadContext + stmia r1, {r0-r14} + add r0, pc, #0x8 + str r0, [r1, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0] + + mov r0, #0 + bx lr +} + +asm void OS_LoadContext(register OSContext *context) { +#ifdef SDK_ARM9 + stmdb sp!, {r0, lr} + add r0, r0, #OS_CONTEXT_CP_CONTEXT + ldr r1, =CPi_RestoreContext + blx r1 + ldmia sp!, {r0, lr} +#endif + + mrs r1, cpsr + bic r1, r1, #HW_PSR_CPU_MODE_MASK + orr r1, r1, #HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + msr cpsr_c, r1 + + ldr r1, [r0], #OS_CONTEXT_R0 - OS_CONTEXT_CPSR + msr spsr_fsxc, r1 + +#ifdef SDK_CONTEXT_HAS_SP_SVC + ldr sp, [r0, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0] +#endif + + ldr lr, [r0, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0] + ldmia r0, {r0-r14} ^ + nop + + subs pc, lr, #4 +} diff --git a/lib/NitroSDK/src/os/os_emulator.c b/lib/NitroSDK/src/os/os_emulator.c new file mode 100644 index 00000000..9cf77dba --- /dev/null +++ b/lib/NitroSDK/src/os/os_emulator.c @@ -0,0 +1,14 @@ +#include + +u32 OSi_ContextTypeCache = OSi_CONSOLE_NOT_DETECT; + +BOOL OS_IsRunOnEmulator(void) { + // In non-retail ROMs, this would actually detect + // the IS emulator. + return FALSE; +} + +u32 OS_GetConsoleType(void) { + OSi_ContextTypeCache = OS_CONSOLE_NITRO | OS_CONSOLE_DEV_CARD | OS_CONSOLE_SIZE_4MB; + return OSi_ContextTypeCache; +} diff --git a/lib/NitroSDK/src/os/os_entropy.c b/lib/NitroSDK/src/os/os_entropy.c new file mode 100644 index 00000000..186c610d --- /dev/null +++ b/lib/NitroSDK/src/os/os_entropy.c @@ -0,0 +1,17 @@ +#include + +void OS_GetLowEntropyData(u32 buffer[8]) { + const OSSystemWork *work = OS_GetSystemWork(); + const u8 *macAddress = (u8 *)((u32)(work->nvramUserInfo) + ((sizeof(NVRAMConfig) + 3) & ~0x00000003)); + buffer[0] = (GX_GetVCount() << 16) | OS_GetTickLo(); + buffer[1] = (*(u16 *)(macAddress + 4) << 16) ^ OSi_TickCounter; + buffer[2] = (OSi_TickCounter >> 32) ^ *(u32 *)macAddress ^ work->vblankCount; +#ifdef reg_G3X_GXSTAT + buffer[2] ^= reg_G3X_GXSTAT; +#endif + buffer[3] = *(u32 *)(&work->real_time_clock[0]); + buffer[4] = *(u32 *)(&work->real_time_clock[4]); + buffer[5] = ((work->mic_sampling_data) << 16) ^ work->mic_last_address; + buffer[6] = (*(u16 *)(&work->touch_panel[0]) << 16) | *(u16 *)(&work->touch_panel[2]); + buffer[7] = (work->wm_rssi_pool << 16) | (reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF); +} diff --git a/lib/NitroSDK/src/os/os_exception.c b/lib/NitroSDK/src/os/os_exception.c new file mode 100644 index 00000000..cf4a3e3d --- /dev/null +++ b/lib/NitroSDK/src/os/os_exception.c @@ -0,0 +1,149 @@ +#include + +typedef struct { + OSContext context; + u32 cp15; + u32 spsr; + u32 exinfo; + u32 debug[4]; +} OSiExContext; + +static OSiExContext OSi_ExContext; +static OSExceptionHandler OSi_UserExceptionHandler; +static void *OSi_UserExceptionHandlerArg; +static void *OSi_DebuggerHandler = NULL; +static u32 OSi_ExceptionHookStack[8]; + +asm void OSi_GetAndDisplayContext(void); +asm void OSi_SetExContext(void); +void OSi_DisplayExContext(void); + +void OSi_ExceptionHandler(void); + +#define HW_EXCP_VECTOR_BUF_FOR_DEBUGGER 0x027ffd9c + +void OS_InitException(void) { + if (0x02600000 <= *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER && *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER < 0x02800000) { + OSi_DebuggerHandler = *(void **)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER; + } else { + OSi_DebuggerHandler = NULL; + } + if (!OSi_DebuggerHandler) { + *(u32 *)(HW_EXCP_VECTOR_BUF_FOR_DEBUGGER) = (u32)OSi_ExceptionHandler; + *(u32 *)(HW_EXCP_VECTOR_BUF) = (u32)OSi_ExceptionHandler; + } + OSi_UserExceptionHandler = NULL; + (void)OSi_ExceptionHookStack; // force active +} + +asm void OSi_ExceptionHandler(void) { + ldr r12, =OSi_DebuggerHandler + ldr r12, [r12] + cmp r12, #0 + movne lr, pc + bxne r12 + ldr r12, =HW_ITCM_END + stmdb r12!, {r0-r3, sp, lr} + and r0, sp, #1 + mov sp, r12 + mrs r1, cpsr + and r1, r1, #0x1f + teq r1, #0x17 + bne @skip1 + bl OSi_GetAndDisplayContext + b @ok +@skip1: + teq r1, #0x1b + bne @ok + bl OSi_GetAndDisplayContext +@ok: + ldr r12, =OSi_DebuggerHandler + ldr r12, [r12] + cmp r12, #0 +@trap: + beq @trap +@trap2: + nop + b @trap2 + // Never reached + ldmia sp!, {r0-r3, r12, lr} + mov sp, r12 + bx lr +} + +asm void OSi_GetAndDisplayContext(void) { + stmdb sp!, {r0, lr} + bl OSi_SetExContext + bl OSi_DisplayExContext + ldmia sp!, {r0, lr} + bx lr +} + +asm void OSi_SetExContext(void) { + ldr r1, =OSi_ExContext + mrs r2, cpsr + str r2, [r1, #OSiExContext.debug[1]] + str r0, [r1, #OSiExContext.exinfo] + ldr r0, [r12] + str r0, [r1, #OSiExContext.context.r[0]] + ldr r0, [r12, #4] + str r0, [r1, #OSiExContext.context.r[1]] + ldr r0, [r12, #8] + str r0, [r1, #OSiExContext.context.r[2]] + ldr r0, [r12, #12] + str r0, [r1, #OSiExContext.context.r[3]] + ldr r2, [r12, #16] + bic r2, r2, #1 + add r0, r1, #OSiExContext.context.r[4] + stmia r0, {r4-r11} + str r12, [r1, #OSiExContext.debug[0]] + ldr r0, [r2] + str r0, [r1, #OSiExContext.cp15] + ldr r3, [r2, #4] + str r3, [r1, #OSiExContext.context.cpsr] + ldr r0, [r2, #8] + str r0, [r1, #OSiExContext.context.r[12]] + ldr r0, [r2, #12] + str r0, [r1, #OSiExContext.context.pc_plus4] + mrs r0, cpsr + orr r3, r3, #0x80 + bic r3, r3, #0x20 + msr cpsr_fsxc, r3 + str sp, [r1, #OSiExContext.context.sp] + str lr, [r1, #OSiExContext.context.lr] + mrs r2, spsr + str r2, [r1, #OSiExContext.debug[3]] + msr cpsr_fsxc, r0 + bx lr +} + +void OSi_DisplayExContext(void) { + if (OSi_UserExceptionHandler) { + // asm must be on its own line + asm + { + /* *INDENT-OFF* */ + mrs r2, cpsr + mov r0, sp + ldr r1, =0x9F // why not mov? + msr cpsr_fsxc, r1 + mov r1, sp + mov sp, r0 + stmdb sp!, {r1, r2} + bl OS_EnableProtectionUnit + ldr r0, =OSi_ExContext + ldr r1, =OSi_UserExceptionHandlerArg + ldr r1, [r1] + ldr r12, =OSi_UserExceptionHandler + ldr r12, [r12] + ldr lr, =@ret + bx r12 +@ret: + bl OS_DisableProtectionUnit + ldmia sp!, {r1, r2} + mov sp, r1 + msr cpsr_fsxc, r2 + /* *INDENT-ON* */ + } + } +} diff --git a/lib/NitroSDK/src/os/os_init.c b/lib/NitroSDK/src/os/os_init.c new file mode 100644 index 00000000..ec0717b9 --- /dev/null +++ b/lib/NitroSDK/src/os/os_init.c @@ -0,0 +1,45 @@ +#include + +asm void OSi_WaitVCount0(void) { + mov r12, #HW_REG_BASE + ldr r1, [r12, #REG_IME_OFFSET] + str r12, [r12, #REG_IME_OFFSET] +@spinWait: + ldrh r0, [r12, #REG_VCOUNT_OFFSET] + cmp r0, #0 + bne @spinWait + str r1, [r12, #REG_IME_OFFSET] + bx lr +} + +void OS_Init(void) +{ +#ifdef SDK_ARM9 + OS_InitArena(); + PXI_Init(); + OS_InitLock(); + OS_InitArenaEx(); + OS_InitIrqTable(); + OS_SetIrqStackChecker(); + OS_InitException(); + MI_Init(); + OS_InitVAlarm(); + OSi_InitVramExclusive(); + OS_InitThread(); + OS_InitReset(); + CTRDG_Init(); + CARD_Init(); + PM_Init(); + OSi_WaitVCount0(); +#else + OS_InitArena(); + PXI_Init(); + OS_InitLock(); + OS_InitIrqTable(); + OS_InitTick(); + OS_InitAlarm(); + OS_InitThread(); + OS_InitReset(); + CTRDG_Init(); +#endif +} diff --git a/lib/NitroSDK/src/os/os_interrupt.c b/lib/NitroSDK/src/os/os_interrupt.c new file mode 100644 index 00000000..17bf2fb9 --- /dev/null +++ b/lib/NitroSDK/src/os/os_interrupt.c @@ -0,0 +1,147 @@ +#include + +extern OSThreadQueue OSi_IrqThreadQueue; + +static u32 OSi_IrqStackWarningOffset = 0; + +void OS_InitIrqTable(void) { + OS_InitThreadQueue(&OSi_IrqThreadQueue); +#ifdef SDK_ARM7 + OSi_SetVBlankCount(0); +#endif +} + +void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) { + int i; + OSIrqCallbackInfo * info; + for (i = 0; i < OS_IRQ_TABLE_MAX; i++) { + if (intrBit & 1) { + info = NULL; + if (REG_OS_IE_D0_SHIFT <= i && i <= REG_OS_IE_D3_SHIFT) { + info = &OSi_IrqCallbackInfo[i - REG_OS_IE_D0_SHIFT]; + } else if (REG_OS_IE_T0_SHIFT <= i && i <= REG_OS_IE_T3_SHIFT) { + info = &OSi_IrqCallbackInfo[i - REG_OS_IE_T0_SHIFT + OSi_IRQCALLBACK_NO_TIMER0]; + } +#ifdef SDK_ARM7 + else if (i == REG_OS_IE_VB_SHIFT) { + info = &OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK]; + } +#endif + else { + OS_IRQTable[i] = function; + } + if (info) { + info->func = (void (*)(void*))function; + info->arg = 0; + info->enable = TRUE; + } + } + intrBit >>= 1; + } +} + +OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { + int i; + OSIrqFunction *funcPtr = &OS_IRQTable[0]; + for (i = 0; i < OS_IRQ_TABLE_MAX; i++) { + if (intrBit & 1) { + if (REG_OS_IE_D0_SHIFT <= i && i <= REG_OS_IE_D3_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[i - REG_OS_IE_D0_SHIFT].func; + } else if (REG_OS_IE_T0_SHIFT <= i && i <= REG_OS_IE_T3_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[i - REG_OS_IE_T0_SHIFT + OSi_IRQCALLBACK_NO_TIMER0].func; + } +#ifdef SDK_ARM7 + else if (i == REG_OS_IE_VB_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func; + } +#endif + return *funcPtr; + } + intrBit >>= 1; + funcPtr++; + } + return NULL; +} + +void OSi_EnterDmaCallback(u32 dmaNo, void (*callback)(void * arg), void * arg) { + OSIrqMask imask = (1UL << (dmaNo + REG_OS_IE_D0_SHIFT)); + OSi_IrqCallbackInfo[dmaNo].func = callback; + OSi_IrqCallbackInfo[dmaNo].arg = arg; + OSi_IrqCallbackInfo[dmaNo].enable = OS_EnableIrqMask(imask) & imask; +} + +void OSi_EnterTimerCallback(u32 timerNo, void (*callback)(void * arg), void * arg) { + OSIrqMask imask = (1UL << (timerNo + REG_OS_IE_T0_SHIFT)); + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].func = callback; + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].arg = arg; + OS_EnableIrqMask(imask); + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].enable = TRUE; +} + +OSIrqMask OS_SetIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = newMask; + OS_RestoreIrq(ime); + return prep; +} + +#ifdef SDK_ARM7 +BOOL OS_DisableIrq(void) { + BOOL ime = reg_OS_IME; + reg_OS_IME = 0; + return ime; +} +#endif + +OSIrqMask OS_EnableIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = prep | newMask; + OS_RestoreIrq(ime); + return prep; +} + +OSIrqMask OS_DisableIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = prep & ~newMask; + OS_RestoreIrq(ime); + return prep; +} + +OSIrqMask OS_ResetRequestIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IF; + reg_OS_IF = newMask; + OS_RestoreIrq(ime); + return prep; +} + +extern void SDK_IRQ_STACKSIZE(void); + +//---- defs for irq stack +#ifdef SDK_ARM9 +#define OSi_IRQ_STACK_TOP (HW_DTCM_SVC_STACK - ((s32)SDK_IRQ_STACKSIZE)) +#define OSi_IRQ_STACK_BOTTOM HW_DTCM_SVC_STACK +#else +#define OSi_IRQ_STACK_TOP (HW_PRV_WRAM_IRQ_STACK_END - ((s32)SDK_IRQ_STACKSIZE)) +#define OSi_IRQ_STACK_BOTTOM HW_PRV_WRAM_IRQ_STACK_END +#endif + +//---- Stack CheckNumber +#ifdef SDK_ARM9 +#define OSi_IRQ_STACK_CHECKNUM_BOTTOM 0xfddb597dUL +#define OSi_IRQ_STACK_CHECKNUM_TOP 0x7bf9dd5bUL +#define OSi_IRQ_STACK_CHECKNUM_WARN 0x597dfbd9UL +#else +#define OSi_IRQ_STACK_CHECKNUM_BOTTOM 0xd73bfdf7UL +#define OSi_IRQ_STACK_CHECKNUM_TOP 0xfbdd37bbUL +#define OSi_IRQ_STACK_CHECKNUM_WARN 0xbdf7db3dUL +#endif + + +void OS_SetIrqStackChecker(void) { + *(u32 *)(OSi_IRQ_STACK_BOTTOM - sizeof(u32)) = OSi_IRQ_STACK_CHECKNUM_BOTTOM; + *(u32 *)(OSi_IRQ_STACK_TOP) = OSi_IRQ_STACK_CHECKNUM_TOP; +} diff --git a/lib/NitroSDK/src/os/os_irqHandler.c b/lib/NitroSDK/src/os/os_irqHandler.c new file mode 100644 index 00000000..106ff968 --- /dev/null +++ b/lib/NitroSDK/src/os/os_irqHandler.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include +#include + +extern OSThreadQueue OSi_IrqThreadQueue; +asm void OS_IrqHandler_ThreadSwitch(void); + +void OS_WaitIrq(BOOL clear, OSIrqMask irqFlags) { + OSIntrMode enabled = OS_DisableInterrupts(); + if (clear) { + OS_ClearIrqCheckFlag(irqFlags); + } + OS_RestoreInterrupts(enabled); + while (!(OS_GetIrqCheckFlag() & irqFlags)) { + OS_SleepThread(&OSi_IrqThreadQueue); + } +} + +#ifdef SDK_ARM9 +#include +#endif + +OSThreadQueue OSi_IrqThreadQueue = {NULL, NULL}; + +#ifdef SDK_ARM9 +#include +#endif + +#ifdef SDK_ARM9 +#include +#endif //SDK_ARM9 + +asm void OS_IrqHandler(register OSIrqMask irq) { + stmdb sp!, {lr} + mov r12, #HW_REG_BASE + add r12, r12, #REG_IE_OFFSET + // Are intr disabled? + ldr r1, [r12, #REG_IME_OFFSET - REG_IE_OFFSET] + cmp r1, #0 + ldmeqia sp!, {pc} + // Is intr requested? + ldmia r12, {r1, r2} + ands r1, r1, r2 + ldmeqia sp!, {pc} + // Least significant intr flag takes highest priority +#ifdef SDK_ARM9 + mov r3, #1 << 31 +@clzLoop: + clz r0, r1 + bics r1, r1, r3, lsr r0 + bne @clzLoop + mov r1, r3, lsr r0 + str r1, [r12, #REG_IF_OFFSET - REG_IE_OFFSET] + rsbs r0, r0, #31 +#else + mov r3, #1 + mov r0, #0 +@clzLoop: + ands r2, r1, r3, lsl r0 + addeq r0, r0, #1 + beq @clzLoop + str r2, [r12, #REG_IF_OFFSET - REG_IE_OFFSET] +#endif + ldr r1, =OS_IRQTable + ldr r0, [r1, r0, lsl #2] + ldr lr, =OS_IrqHandler_ThreadSwitch + bx r0 +} + +asm void OS_IrqHandler_ThreadSwitch(void) { + ldr r12, =OSi_IrqThreadQueue + mov r3, #0 + ldr r12, [r12, #OSThreadQueue.head] + mov r2, #1 + cmp r12, #0 + beq @noThreadsToWake +@wakeThreadsLoop: + str r2, [r12, #OSThread.state] + str r3, [r12, #OSThread.queue] + str r3, [r12, #OSThread.link.prev] + ldr r0, [r12, #OSThread.link.next] + str r3, [r12, #OSThread.link.next] + mov r12, r0 + cmp r12, #0 + bne @wakeThreadsLoop + ldr r12, =OSi_IrqThreadQueue + str r3, [r12, #OSThreadQueue.head] + str r3, [r12, #OSThreadQueue.tail] + ldr r12, =OSi_ThreadInfo + mov r1, #1 + strh r1, [r12, #OSThreadInfo.isNeedRescheduling] +@noThreadsToWake: + ldr r12, =OSi_ThreadInfo + ldrh r1, [r12, #OSThreadInfo.isNeedRescheduling] + cmp r1, #0 + ldreq pc, [sp], #4 + mov r1, #0 + strh r1, [r12, #OSThreadInfo.isNeedRescheduling] + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 + add r2, r12, #OSThreadInfo.list + ldr r1, [r2] +@listLoop: + cmp r1, #0 + ldrneh r0, [r1, #OSThread.state] + cmpne r0, #OS_THREAD_STATE_READY + ldrne r1, [r1, #OSThread.next] + bne @listLoop + cmp r1, #0 + bne @checkNext +@enableFiqAndBail: + mov r3, #HW_PSR_DISABLE_IRQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 + ldr pc, [sp], #4 +@checkNext: + ldr r0, [r12, #OSThreadInfo.current] + cmp r1, r0 + beq @enableFiqAndBail + ldr r3, [r12, #OSThreadInfo.switchCallback] + cmp r3, #0 + beq @noSwitchCB + stmdb sp!, {r0, r1, r12} + mov lr, pc + bx r3 + ldmia sp!, {r0, r1, r12} +@noSwitchCB: + str r1, [r12, #OSThreadInfo.current] + mrs r2, spsr + str r2, [r0, #OSThread.context + OS_CONTEXT_CPSR]! +#ifdef SDK_ARM9 + stmdb sp!, {r0, r1} + add r0, r0, #OSThread.context + add r0, r0, #OSContext.cp_context + ldr r1, =CP_SaveContext + blx r1 + ldmia sp!, {r0, r1} +#endif + ldmib sp!, {r2, r3} + stmib r0!, {r2, r3} + ldmib sp!, {r2, r3, r12, lr} + stmib r0!, {r2-r14} ^ + stmib r0!, {lr} +#ifdef SDK_CONTEXT_HAS_SP_SVC + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_SVC_MODE + msr cpsr_c, r3 + stmib r0!, {sp} +#endif +#ifdef SDK_ARM9 + stmdb sp!, {r1} + add r0, r1, #OSThread.context + add r0, r0, #OSContext.cp_context + ldr r1, =CPi_RestoreContext + blx r1 + ldmia sp!, {r1} +#endif +#ifdef SDK_CONTEXT_HAS_SP_SVC + ldr sp, [r1, #OSThread.context + OSContext.sp_svc] + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 +#endif + ldr r2, [r1, #OSThread.context + OSContext.cpsr]! + msr spsr_fc, r2 + ldr lr, [r1, #OSThread.context + OSContext.pc_plus4] + ldmib r1, {r0-r14} ^ + nop + stmda sp!, {r0-r3, r12, lr} + ldmia sp!, {pc} +} diff --git a/lib/NitroSDK/src/os/os_irqTable.c b/lib/NitroSDK/src/os/os_irqTable.c new file mode 100644 index 00000000..647924dc --- /dev/null +++ b/lib/NitroSDK/src/os/os_irqTable.c @@ -0,0 +1,114 @@ +#include +#include + +OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM]; + +u16 OSi_IrqCallbackInfoIndex[] = { + REG_OS_IE_D0_SHIFT, + REG_OS_IE_D1_SHIFT, + REG_OS_IE_D2_SHIFT, + REG_OS_IE_D3_SHIFT, + REG_OS_IE_T0_SHIFT, + REG_OS_IE_T1_SHIFT, + REG_OS_IE_T2_SHIFT, + REG_OS_IE_T3_SHIFT, +#ifdef SDK_ARM7 + REG_OS_IE_VB_SHIFT, +#endif +}; + +#ifdef SDK_ARM9 +#include +#endif +OSIrqFunction OS_IRQTable[] = { +#ifdef SDK_ARM7 + OSi_IrqVBlank, +#else + OS_IrqDummy, +#endif + OS_IrqDummy, + OS_IrqDummy, + OSi_IrqTimer0, + OSi_IrqTimer1, + OSi_IrqTimer2, + OSi_IrqTimer3, + OS_IrqDummy, + OSi_IrqDma0, + OSi_IrqDma1, + OSi_IrqDma2, + OSi_IrqDma3, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, +#ifdef SDK_ARM7 + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, +#endif +}; + +#ifdef SDK_ARM9 +#include +#endif + +void OS_IrqDummy(void) {} + +void OSi_IrqCallback(s32 index) { + OSIrqMask imask = (1UL << OSi_IrqCallbackInfoIndex[index]); + void (*callback)(void *) = OSi_IrqCallbackInfo[index].func; + OSi_IrqCallbackInfo[index].func = NULL; + if (callback) callback(OSi_IrqCallbackInfo[index].arg); + OS_SetIrqCheckFlag(imask); + if (!OSi_IrqCallbackInfo[index].enable) + OS_DisableIrqMask(imask); +} + +void OSi_IrqDma0(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA0); +} + +void OSi_IrqDma1(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA1); +} + +void OSi_IrqDma2(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA2); +} + +void OSi_IrqDma3(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA3); +} + +void OSi_IrqTimer0(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER0); +} + +void OSi_IrqTimer1(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER1); +} + +void OSi_IrqTimer2(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER2); +} + +void OSi_IrqTimer3(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER3); +} + +#ifdef SDK_ARM7 +void OSi_IrqVBlank(void) { + void (*callback)(void) = (void(*)(void))OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func; + (*(u32 *)HW_VBLANK_COUNT_BUF)++; + if (callback) { + callback(); + } + OS_SetIrqCheckFlag(1UL << REG_OS_IE_VB_SHIFT); +} +#endif //SDK_ARM7 diff --git a/lib/NitroSDK/src/os/os_message.c b/lib/NitroSDK/src/os/os_message.c new file mode 100644 index 00000000..ee86a3bb --- /dev/null +++ b/lib/NitroSDK/src/os/os_message.c @@ -0,0 +1,92 @@ +#include + +void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount) { + OS_InitThreadQueue(&mq->queueSend); + OS_InitThreadQueue(&mq->queueReceive); + mq->msgArray = msgArray; + mq->msgCount = msgCount; + mq->firstIndex = 0; + mq->usedCount = 0; +} + +BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags) { + OSIntrMode enabled; + s32 lastIndex; + + enabled = OS_DisableInterrupts(); + + while (mq->msgCount <= mq->usedCount) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OS_RestoreInterrupts(enabled); + return FALSE; + } + OS_SleepThread(&mq->queueSend); + } + lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount; + mq->msgArray[lastIndex] = msg; + mq->usedCount++; + OS_WakeupThread(&mq->queueReceive); + OS_RestoreInterrupts(enabled); + return TRUE; +} + +BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags) { + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + + while (mq->usedCount == 0) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OS_RestoreInterrupts(enabled); + return FALSE; + } + OS_SleepThread(&mq->queueReceive); + } + if (msg != NULL) { + *msg = mq->msgArray[mq->firstIndex]; + } + mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount; + mq->usedCount--; + OS_WakeupThread(&mq->queueSend); + OS_RestoreInterrupts(enabled); + return TRUE; +} + +BOOL OS_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags) { + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + + while (mq->msgCount <= mq->usedCount) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OS_RestoreInterrupts(enabled); + return FALSE; + } + OS_SleepThread(&mq->queueSend); + } + mq->firstIndex = (mq->firstIndex + mq->msgCount - 1) % mq->msgCount; + mq->msgArray[mq->firstIndex] = msg; + mq->usedCount++; + OS_WakeupThread(&mq->queueReceive); + OS_RestoreInterrupts(enabled); + return TRUE; +} + +BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags) { + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + + while (mq->usedCount == 0) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OS_RestoreInterrupts(enabled); + return FALSE; + } + OS_SleepThread(&mq->queueReceive); + } + if (msg != NULL) { + *msg = mq->msgArray[mq->firstIndex]; + } + OS_RestoreInterrupts(enabled); + return TRUE; +} diff --git a/lib/NitroSDK/src/os/os_mutex.c b/lib/NitroSDK/src/os/os_mutex.c new file mode 100644 index 00000000..03e2cef8 --- /dev/null +++ b/lib/NitroSDK/src/os/os_mutex.c @@ -0,0 +1,113 @@ +#include + +void OSi_EnqueueTail(OSThread *thread, OSMutex *mtx); +void OSi_DequeueItem(OSThread *thread, OSMutex *mtx); + +void OS_InitMutex(OSMutex *mtx) { + OS_InitThreadQueue(&mtx->queue); + mtx->thread = NULL; + mtx->count = 0; +} + +void OS_LockMutex(OSMutex *mtx) { + OSIntrMode enable; + OSThread *currentThread; + + enable = OS_DisableInterrupts(); + currentThread = OS_GetCurrentThread(); + while (1) { + if (mtx->thread == NULL) { + mtx->thread = currentThread; + mtx->count++; + OSi_EnqueueTail(currentThread, mtx); + break; + } else if (mtx->thread == currentThread) { + mtx->count++; + break; + } else { + currentThread->mutex = mtx; + OS_SleepThread(&mtx->queue); + currentThread->mutex = NULL; + } + } + OS_RestoreInterrupts(enable); +} + +void OS_UnlockMutex(OSMutex *mtx) { + OSIntrMode enable; + OSThread *currentThread; + + enable = OS_DisableInterrupts(); + currentThread = OS_GetCurrentThread(); + if (mtx->thread == currentThread && --mtx->count == 0) { + OSi_DequeueItem(currentThread, mtx); + mtx->thread = NULL; + OS_WakeupThread(&mtx->queue); + } + OS_RestoreInterrupts(enable); +} + +void OSi_UnlockAllMutex(OSThread *thread) { + while (thread->mutexQueue.head) { + OSMutex *mtx = OSi_RemoveMutexLinkFromQueue(&thread->mutexQueue); + mtx->count = 0; + mtx->thread = NULL; + OS_WakeupThread(&mtx->queue); + } +} + +BOOL OS_TryLockMutex(OSMutex *mtx) { + OSIntrMode enable; + OSThread *currentThread; + BOOL success; + + enable = OS_DisableInterrupts(); + currentThread = OS_GetCurrentThread(); + if (mtx->thread == NULL) { + mtx->thread = currentThread; + mtx->count++; + OSi_EnqueueTail(currentThread, mtx); + success = TRUE; + } else if (mtx->thread == currentThread) { + mtx->count++; + success = TRUE; + } else { + success = FALSE; + } + OS_RestoreInterrupts(enable); + return success; +} + +void OSi_EnqueueTail(OSThread *thread, OSMutex *mtx) { + OSMutex *prev; + + prev = thread->mutexQueue.tail; + if (prev == NULL) { + thread->mutexQueue.head = mtx; + } else { + prev->link.next = mtx; + } + mtx->link.prev = prev; + mtx->link.next = NULL; + thread->mutexQueue.tail = mtx; +} + +void OSi_DequeueItem(OSThread *thread, OSMutex *mtx) { + OSMutex *next; + OSMutex *prev; + + next = mtx->link.next; + prev = mtx->link.prev; + + if (next == NULL) { + thread->mutexQueue.tail = prev; + } else { + next->link.prev = prev; + } + + if (prev == NULL) { + thread->mutexQueue.head = next; + } else { + prev->link.next = next; + } +} diff --git a/lib/NitroSDK/src/os/os_ownerInfo.c b/lib/NitroSDK/src/os/os_ownerInfo.c new file mode 100644 index 00000000..204be73b --- /dev/null +++ b/lib/NitroSDK/src/os/os_ownerInfo.c @@ -0,0 +1,24 @@ +#include + +void OS_GetMacAddress(u8 *macAddr) { + MI_CpuCopy8(OS_GetSystemWork()->nvramUserInfo + ((sizeof(NVRAMConfig) + 3) & ~3), macAddr, 6); +} + +void OS_GetOwnerInfo(OSOwnerInfo *info) { + NVRAMConfig *src = (NVRAMConfig *)OS_GetSystemWork()->nvramUserInfo; + info->language = src->ncd.option.language; + info->favoriteColor = src->ncd.owner.favouriteColour; + info->birthday.month = src->ncd.owner.birthday.month; + info->birthday.day = src->ncd.owner.birthday.day; + info->nickNameLength = src->ncd.owner.nickname.length; + info->commentLength = src->ncd.owner.comment.length; + MI_CpuCopy16(src->ncd.owner.nickname.str, info->nickName, 20); + MI_CpuCopy16(src->ncd.owner.comment.str, info->comment, 52); + info->nickName[10] = 0; + info->comment[26] = 0; +} + +s64 OS_GetOwnerRtcOffset(void) { + NVRAMConfig *cfg = (NVRAMConfig *)OS_GetSystemWork()->nvramUserInfo; + return cfg->ncd.option.rtcOffset; +} diff --git a/lib/NitroSDK/src/os/os_printf.c b/lib/NitroSDK/src/os/os_printf.c new file mode 100644 index 00000000..64966b21 --- /dev/null +++ b/lib/NitroSDK/src/os/os_printf.c @@ -0,0 +1,28 @@ +#include +#include + +int OS_SPrintf(char * dest, const char * format, ...) { + int ret; + va_list va; + va_start(va, format); + ret = OS_VSPrintf(dest, format, va); + va_end(va); + return ret; +} + +int OS_VSPrintf(char * dest, const char * format, va_list va) { + return OS_VSNPrintf(dest, 0x7FFFFFFF, format, va); +} + +int OS_SNPrintf(char * dest, u32 len, const char * format, ...) { + int ret; + va_list va; + va_start(va, format); + ret = OS_VSNPrintf(dest, len, format, va); + va_end(va); + return ret; +} + +int OS_VSNPrintf(char * dest, u32 len, const char * format, va_list va) { + return STD_TVSNPrintf(dest, len, format, va); +} diff --git a/lib/NitroSDK/src/os/os_protectionRegion.c b/lib/NitroSDK/src/os/os_protectionRegion.c new file mode 100644 index 00000000..d66f7984 --- /dev/null +++ b/lib/NitroSDK/src/os/os_protectionRegion.c @@ -0,0 +1,19 @@ +#include + +asm void OS_SetDPermissionsForProtectionRegion(register u32 setMask, register u32 flags) { + mrc p15, 0, r2, c5, c0, 2 + bic r2, r2, r0 + orr r2, r2, r1 + mcr p15, 0, r2, c5, c0, 2 + bx lr +} + +asm void OS_SetProtectionRegion1(u32 param) { + mcr p15, 0, r0, c6, c1, 0 + bx lr +} + +asm void OS_SetProtectionRegion2(u32 param) { + mcr p15, 0, r0, c6, c2, 0 + bx lr +} diff --git a/lib/NitroSDK/src/os/os_protectionUnit.c b/lib/NitroSDK/src/os/os_protectionUnit.c new file mode 100644 index 00000000..ed5f154f --- /dev/null +++ b/lib/NitroSDK/src/os/os_protectionUnit.c @@ -0,0 +1,15 @@ +#include + +asm void OS_EnableProtectionUnit(void) { + mrc p15, 0, r0, c1, c0, 0 + orr r0, r0, #1 + mcr p15, 0, r0, c1, c0, 0 + bx lr +} + +asm void OS_DisableProtectionUnit(void) { + mrc p15, 0, r0, c1, c0, 0 + bic r0, r0, #1 + mcr p15, 0, r0, c1, c0, 0 + bx lr +} diff --git a/lib/NitroSDK/src/os/os_reset.c b/lib/NitroSDK/src/os/os_reset.c new file mode 100644 index 00000000..a1de6973 --- /dev/null +++ b/lib/NitroSDK/src/os/os_reset.c @@ -0,0 +1,293 @@ +#include + +extern void SDK_IRQ_STACKSIZE(void); + +#define OSi_HW_DTCM SDK_AUTOLOAD_DTCM_START +#define RESET_HW_DTCM_IRQ_STACK_END SDK_AUTOLOAD_DTCM_START + 0x00003fc0 - HW_SVC_STACK_SIZE + +#ifdef SDK_ARM9 +static vu16 OSi_IsResetOccurred = FALSE; +static u16 OSi_IsInitReset = FALSE; +#else +static u16 OSi_IsInitReset = FALSE; +static vu16 OSi_IsResetOccurred = FALSE; +#endif + +u32 OSi_CpuClear32(u32 value, void *ptr, u32 size); +void OSi_ReadCardRom32(u32 src, void *dst, int len); + +void OSi_DoResetSystem(void); +void OSi_ReloadRomData(void); +void OSi_DoBoot(void); + +void OS_InitReset(void) { + if (OSi_IsInitReset) { + return; + } + OSi_IsInitReset = TRUE; +#ifdef SDK_ARM9 + PXI_Init(); + while (!PXI_IsCallbackReady(PXI_FIFO_TAG_OS, PXI_PROC_ARM7)) {} +#endif //SDK_ARM9 + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_OS, OSi_CommonCallback); +} + +BOOL OS_IsResetOccurred(void) { + return OSi_IsResetOccurred; +} + +void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err) { +#pragma unused(tag) +#pragma unused(err) + u16 command; + u16 commandArg; + + command = (u16)((data & OS_PXI_COMMAND_MASK) >> OS_PXI_COMMAND_SHIFT); + commandArg = (u16)((data & OS_PXI_DATA_MASK) >> OS_PXI_DATA_SHIFT); + if (command == OS_PXI_COMMAND_RESET) { + OSi_IsResetOccurred = TRUE; + } else { + OS_Panic(""); + } +} + +void OSi_SendToPxi(u16 data) { + u32 pxi_send_data; + + pxi_send_data = (u32)(data) << OS_PXI_COMMAND_SHIFT; + while (PXI_SendWordByFifo(PXI_FIFO_TAG_OS, pxi_send_data, FALSE) != PXI_FIFO_SUCCESS) {} +} + +#ifdef SDK_ARM9 +void OS_ResetSystem(u32 parameter) { + u16 lockId; + + if (MB_IsMultiBootChild()) { + OS_Panic(""); + } + + lockId = OS_GetLockID(); + CARD_LockRom(lockId); + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + OS_SetIrqMask(OS_IE_SPFIFO_RECV); + OS_ResetRequestIrqMask(~OS_IE_SPFIFO_RECV); + *(vu32 *)HW_RESET_PARAMETER_BUF = parameter; + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + asm { + ldr r0, =RESET_HW_DTCM_IRQ_STACK_END + ldr r1, =SDK_IRQ_STACKSIZE + sub r0, r0, r1 + mov sp, r0 + bl OSi_DoResetSystem // noreturn + } +} + +#include +void OSi_DoResetSystem(void) { + while (!OSi_IsResetOccurred) {} + reg_OS_IME = 0; + OSi_ReloadRomData(); + OSi_DoBoot(); // noreturn +} + +asm void OSi_DoBoot(void) { + mov r12, #HW_REG_BASE + str r12, [r12, #REG_IME_OFFSET] + ldr r1, =OSi_HW_DTCM + add r1, r1, #0x3FC0 + add r1, r1, #HW_DTCM_SYSRV_OFS_INTR_VECTOR + mov r0, #0 + str r0, [r1] + ldr r1, =REG_SUBINTF_ADDR + @waitSubIntf: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + bne @waitSubIntf + mov r0, #0x0100 + strh r0, [r1] + mov r0, #0 + ldr r3, =HW_EXCP_VECTOR_MAIN + ldr r4, [r3] + ldr r1, =HW_BIOS_EXCP_STACK_MAIN + mov r2, #0x80 + bl OSi_CpuClear32 + str r4, [r3] + ldr r1, =HW_PXI_SIGNAL_PARAM_ARM9 + mov r2, #0x18 + bl OSi_CpuClear32 + ldr r1, =HW_WM_RSSI_POOL + strh r0, [r1] + ldr r1, =HW_COMPONENT_PARAM + mov r2, #0x64 + bl OSi_CpuClear32 + ldr r1, =REG_SUBINTF_ADDR + @waitSubIntf2: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + beq @waitSubIntf2 + mov r0, #0x0000 + strh r0, [r1] + ldr r3, =HW_ROM_HEADER_BUF + ldr r12, [r3, #0x24] // ARM9 entry + mov lr, r12 + ldr r11, =HW_PXI_SIGNAL_PARAM_ARM9 + ldmia r11, {r0-r10} + mov r11, #0 + bx r12 +} + +asm u32 OSi_CpuClear32(register u32 value, register void * startAddr, register u32 size) { + add r12, r1, r2 + @loop: + cmp r1, r12 + stmltia r1!, {r0} + blt @loop + bx lr +} + +void OSi_ReloadRomData(void) { + u32 p = (u32)HW_ROM_HEADER_BUF; + const u32 rom_base = *(u32 *)HW_ROM_BASE_OFFSET_BUF; + if (rom_base >= 0x8000) { + OSi_ReadCardRom32(rom_base, (void *)p, 0x160); + } + u32 src_arm9 = *(u32 *)(p + 0x20); + u32 dst_arm9 = *(u32 *)(p + 0x28); + u32 len_arm9 = *(u32 *)(p + 0x2C); + u32 src_arm7 = *(u32 *)(p + 0x30); + u32 dst_arm7 = *(u32 *)(p + 0x38); + u32 len_arm7 = *(u32 *)(p + 0x3C); + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + DC_StoreAll(); + DC_InvalidateAll(); + OS_RestoreInterrupts(bak_cpsr); + IC_InvalidateAll(); + DC_WaitWriteBufferEmpty(); + src_arm9 += rom_base; + src_arm7 += rom_base; + if (src_arm9 < 0x8000) { + u32 diff = 0x8000 - src_arm9; + src_arm9 = 0x8000; + dst_arm9 += diff; + len_arm9 -= diff; + } + OSi_ReadCardRom32(src_arm9, (void *)dst_arm9, len_arm9); + OSi_ReadCardRom32(src_arm7, (void *)dst_arm7, len_arm7); +} + +#undef reg_CARD_MASTERCNT +#undef reg_CARD_CMD +#undef reg_CARD_CNT +#undef reg_CARD_DATA + +void OSi_ReadCardRom32(u32 src, void *dst, int len) { + vu8 *reg_CARD_MASTERCNT = (vu8 *)(HW_REG_BASE + 0x1a1); + vu8 *reg_CARD_CMD = (vu8 *)(HW_REG_BASE + 0x1a8); + vu32 *reg_CARD_CNT = (vu32 *)(HW_REG_BASE + 0x1a4); + vu32 *reg_CARD_DATA = (vu32 *)(HW_REG_BASE + 0x100010); + vu32 *hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60); + + enum { + CARD_MASTER_SELECT_ROM = 0x00, + CARD_MASTER_ENABLE = 0x80, + CARD_CMD_READ_PAGE = 0xb7, + CARD_CTRL_CMD_MASK = 0x07000000, + CARD_CTRL_CMD_PAGE = 0x01000000, + CARD_CTRL_READ = 0x00000000, + CARD_CTRL_RESET_HI = 0x20000000, + CARD_CTRL_START = 0x80000000, + CARD_CTRL_READY = 0x00800000, + CARD_ENUM_END + }; + + const u32 ctrl_start = ((*hdr_GAME_BUF & ~CARD_CTRL_CMD_MASK) | (CARD_CTRL_CMD_PAGE | CARD_CTRL_READ | CARD_CTRL_START | CARD_CTRL_RESET_HI)); + int pos = -(src & 0x1FF); + while ((*reg_CARD_CNT & CARD_CTRL_START) != 0) {} + *reg_CARD_MASTERCNT = (u32)(CARD_MASTER_SELECT_ROM | CARD_MASTER_ENABLE); + for (src += pos; pos < len; src += 512) + { + //---- setting for command of one page reading + reg_CARD_CMD[0] = CARD_CMD_READ_PAGE; + reg_CARD_CMD[1] = src >> 24; + reg_CARD_CMD[2] = src >> 16; + reg_CARD_CMD[3] = src >> 8; + reg_CARD_CMD[4] = src >> 0; + reg_CARD_CMD[5] = 0; + reg_CARD_CMD[6] = 0; + reg_CARD_CMD[7] = 0; + *reg_CARD_CNT = ctrl_start; + for (;;) + { + u32 ctrl = *reg_CARD_CNT; + if ((ctrl & CARD_CTRL_READY) != 0) { + const u32 data = *reg_CARD_DATA; + if ((pos >= 0) && (pos < len)) { + *(u32 *)(dst + pos) = data; + } + pos += sizeof(u32); + } + if (!(ctrl & CARD_CTRL_START)) { + break; + } + } + } +} + +#include + +#else +void OS_ResetSystem(void) { + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + OS_SetIrqMask(OS_IE_FIFO_RECV); + OS_ResetRequestIrqMask(0xFFFFFFFF); + SND_Shutdown(); + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + OSi_DoResetSystem(); +} + +void OSi_DoResetSystem(void) { + reg_OS_IME = 0; + OSi_DoBoot(); +} + +#include +asm void OSi_DoBoot(void) { + mov r12, #HW_REG_BASE + str r12, [r12, #REG_IME_OFFSET] + ldr r1, =HW_INTR_VECTOR_BUF + mov r0, #0 + str r0, [r1] + ldr r1, =REG_MAINPINTF_ADDR + mov r0, #0x100 + strh r0, [r1] +@waitMainpIntf: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + bne @waitMainpIntf + ldr r1, =REG_MAINPINTF_ADDR + mov r0, #0 + strh r0, [r1] +@waitMainpIntf2: + ldrh r0, [r1] + and r0, r0, #0x000F + beq @waitMainpIntf2 + ldr r3, =HW_ROM_HEADER_BUF + ldr r12, [r3, #0x34] // ARM7 entry + mov lr, r12 + mov r0, #0 + mov r1, #0 + mov r2, #0 + mov r3, #0 + bx r12 +} +#include +#endif diff --git a/lib/NitroSDK/src/os/os_spinLock.c b/lib/NitroSDK/src/os/os_spinLock.c new file mode 100644 index 00000000..593113ae --- /dev/null +++ b/lib/NitroSDK/src/os/os_spinLock.c @@ -0,0 +1,262 @@ +#include + +#define OSi_LOCKID_INITIAL_FLAG_0 0xffffffff +#define OSi_LOCKID_INITIAL_FLAG_1 0xffff0000 + +#ifdef SDK_ARM9 +#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_MAIN +#define OSi_ANYP_LOCK_ID_START OS_MAINP_LOCK_ID_START +#else +#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_SUB +#define OSi_ANYP_LOCK_ID_START OS_SUBP_LOCK_ID_START +#endif + +void OSi_AllocateCartridgeBus(void); +void OSi_FreeCartridgeBus(void); +void OSi_AllocateCardBus(void); +void OSi_FreeCardBus(void); + +// FIXME: This looks like it's meant to be a linker-inserted veneer, but I can't get it to insert properly yet +#ifdef SDK_ARM9 +static inline void OSi_WaitByLoop(void) { + SVC_WaitByLoop(0x1000 / 4); +} +#else +void VENEER_SVC_WaitByLoop(s32 count); +static inline void OSi_WaitByLoop(void) { + VENEER_SVC_WaitByLoop(0x1000 / 4); +} +#endif + +void OS_InitLock(void) { + static BOOL isInitialized = FALSE; + OSLockWord *lockp; + + if (isInitialized) + return; + + isInitialized = TRUE; + lockp = (OSLockWord *)HW_INIT_LOCK_BUF; + +#ifdef SDK_ARM9 + lockp->lockFlag = 0; + OS_LockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL); + while (lockp->extension != 0) { + OSi_WaitByLoop(); + } + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0; + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1; + MI_CpuClear32((void *)HW_SHARED_LOCK_BUF, HW_CTRDG_LOCK_BUF - HW_SHARED_LOCK_BUF); + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); + OS_UnlockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL); + OS_LockByWord(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL); +#else + lockp->extension = 0; + while (lockp->ownerID != OS_MAINP_SYSTEM_LOCK_ID) { + OSi_WaitByLoop(); + } + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0; + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1; + lockp->extension = OS_SUBP_SYSTEM_LOCK_ID; +#endif +} + +#ifdef SDK_ARM7 +asm void VENEER_SVC_WaitByLoop(register s32 count) { + ldr ip, =SVC_WaitByLoop + bx ip +} +#endif + +#ifdef SDK_ARM7 +static inline +#endif //SDK_ARM7 +s32 OSi_DoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + s32 lastLockFlag; + + while ((lastLockFlag = OSi_DoTryLockByWord(lockID, lockp, ctrlFuncp, disableFiq)) > 0) { + OSi_WaitByLoop(); + } + return lastLockFlag; +} + +s32 OS_LockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void)) { + return OSi_DoLockByWord(lockID, lockp, ctrlFuncp, FALSE); +} + +s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + if (lockID != lockp->ownerID) { + return -2; + } + OSIntrMode ime = disableFiq ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lockp->ownerID = 0; + if (ctrlFuncp != NULL) { + ctrlFuncp(); + } + lockp->lockFlag = 0; + if (disableFiq) { + OS_RestoreInterrupts_IrqAndFiq(ime); + } else { + OS_RestoreInterrupts(ime); + } + return 0; +} + +s32 OS_UnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void)) { + return OSi_DoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE); +} + +s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + s32 lastLockFlag; + OSIntrMode ime; + + ime = disableFiq ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lastLockFlag = MI_SwapWord(lockID, &lockp->lockFlag); + if (lastLockFlag == 0) { + if (ctrlFuncp != NULL) { + ctrlFuncp(); + } + lockp->ownerID = lockID; + } + if (disableFiq) { + OS_RestoreInterrupts_IrqAndFiq(ime); + } else { + OS_RestoreInterrupts(ime); + } + return lastLockFlag; +} + +s32 OS_LockCartridge(u16 lockID) { + return OSi_DoLockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +s32 OS_UnlockCartridge(u16 lockID) { + return OSi_DoUnlockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_FreeCartridgeBus, TRUE); +} + +// For backwards compatibility. +// Nintendo decided they didn't want to use a define here, +// so they made an asm func instead +asm s32 OS_UnLockCartridge(u16 lockID) { + ldr r1, =OS_UnlockCartridge + bx r1 +} + +s32 OS_TryLockCartridge(u16 lockID) { + return OSi_DoTryLockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +void OSi_AllocateCartridgeBus(void) { +#ifdef SDK_ARM9 + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9); +#endif +} + +void OSi_FreeCartridgeBus(void) { +#ifdef SDK_ARM9 + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); +#endif +} + +s32 OS_LockCard(u16 lockID) { + return OS_LockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_AllocateCardBus); +} + +s32 OS_UnlockCard(u16 lockID) { + return OS_UnlockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_FreeCardBus); +} + +// For backwards compatibility. +// Nintendo decided they didn't want to use a define here, +// so they made an asm func instead +asm s32 OS_UnLockCard(u16 lockID) { + ldr r1, =OS_UnlockCard + bx r1 +} + +BOOL OS_TryLockCard(u16 lockID) { + return OSi_DoTryLockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_AllocateCardBus, FALSE); +} + +void OSi_AllocateCardBus(void) { +#ifdef SDK_ARM9 + MIi_SetCardProcessor(MI_PROCESSOR_ARM9); +#endif +} + +void OSi_FreeCardBus(void) { +#ifdef SDK_ARM9 + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); +#endif +} + +u16 OS_ReadOwnerOfLockWord(OSLockWord *lockp) { + return lockp->ownerID; +} + +asm s32 OS_GetLockID(void) { + ldr r3, =OSi_ANYP_LOCK_ID_FLAG; + ldr r1, [r3] +#ifdef SDK_ARM9 + clz r2, r1 +#else //SDK_ARM7 + mov r2, #0 + mov r0, #0x80000000 +_lp1: + tst r1, r0 + bne _ex1 + add r2, r2, #1 + cmp r2, #32 + beq _ex1 + mov r0, r0, lsr #1 + b _lp1 +_ex1: +#endif //SDK_ARM9 + cmp r2, #32 + movne r0, #OSi_ANYP_LOCK_ID_START + bne @movne + add r3, r3, #4 + ldr r1, [r3] +#ifdef SDK_ARM9 + clz r2, r1 +#else //SDK_ARM7 + mov r2, #0 + mov r0, #0x80000000 +_lp2: + tst r1, r0 + bne _ex2 + add r2, r2, #1 + cmp r2, #32 + beq _ex2 + mov r0, r0, lsr #1 + b _lp2 +_ex2: +#endif //SDK_ARM9 + cmp r2, #32 + ldr r0, =-3 + bxeq lr + mov r0, #OSi_ANYP_LOCK_ID_START + 32 + @movne: + add r0, r0, r2 + mov r1, #0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3] + bic r2, r2, r1 + str r2, [r3] + bx lr +} + +asm void OS_ReleaseLockID(register u16 lockID) { + ldr r3, =OSi_ANYP_LOCK_ID_FLAG + cmp r0, #OSi_ANYP_LOCK_ID_START + 32 + addpl r3, r3, #4 + subpl r0, r0, #OSi_ANYP_LOCK_ID_START + 32 + submi r0, r0, #OSi_ANYP_LOCK_ID_START + mov r1, #0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3] + orr r2, r2, r1 + str r2, [r3] + bx lr +} diff --git a/lib/NitroSDK/src/os/os_system.c b/lib/NitroSDK/src/os/os_system.c new file mode 100644 index 00000000..c4c92bca --- /dev/null +++ b/lib/NitroSDK/src/os/os_system.c @@ -0,0 +1,75 @@ +#include + +asm OSIntrMode OS_EnableInterrupts(void) { + mrs r0, cpsr + bic r1, r0, #HW_PSR_IRQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_DisableInterrupts(void) { + mrs r0, cpsr + orr r1, r0, #HW_PSR_IRQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_RestoreInterrupts(register OSIntrMode prev) { + mrs r1, cpsr + bic r2, r1, #HW_PSR_IRQ_DISABLE + orr r2, r2, r0 + msr cpsr_c, r2 + and r0, r1, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_DisableInterrupts_IrqAndFiq(void) { + mrs r0, cpsr + orr r1, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + bx lr +} + +asm OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode prev) { + mrs r1, cpsr + bic r2, r1, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + orr r2, r2, r0 + msr cpsr_c, r2 + and r0, r1, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + bx lr +} + +asm OSIntrMode_Irq OS_GetCpsrIrq(void) { + mrs r0, cpsr + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSProcMode OS_GetProcMode(void) { + mrs r0, cpsr + and r0, r0, #HW_PSR_CPU_MODE_MASK + bx lr +} + +#ifdef SDK_ARM9 +#include +asm void OS_SpinWait(register u32 cycles) { + @loop: + subs r0, r0, #4 + bhs @loop + bx lr +} +#include +#else +void OS_SpinWait(u32 cycles) { + SVC_WaitByLoop((s32)cycles / 4); +} +#endif + +void OS_WaitVBlankIntr(void) { + SVC_WaitByLoop(1); + OS_WaitIrq(TRUE, OS_IE_VBLANK); +} diff --git a/lib/NitroSDK/src/os/os_tcm.c b/lib/NitroSDK/src/os/os_tcm.c new file mode 100644 index 00000000..ab12c33e --- /dev/null +++ b/lib/NitroSDK/src/os/os_tcm.c @@ -0,0 +1,8 @@ +#include + +asm u32 OS_GetDTCMAddress(void) { + mrc p15, 0, r0, c9, c1, 0 + ldr r1, =0xFFFFF000 + and r0, r0, r1 + bx lr +} diff --git a/lib/NitroSDK/src/os/os_terminate_proc.c b/lib/NitroSDK/src/os/os_terminate_proc.c new file mode 100644 index 00000000..d84dbb95 --- /dev/null +++ b/lib/NitroSDK/src/os/os_terminate_proc.c @@ -0,0 +1,19 @@ +#include + +void OS_Terminate(void) { +#ifdef SDK_ARM7 + CTRDG_VibPulseEdgeUpdate(0); +#endif + while (1) { + OS_DisableInterrupts(); + OS_Halt(); + } +} + +#ifdef SDK_ARM9 +asm void OS_Halt(void) { + mov r0, #0 + mcr p15, 0, r0, c7, c0, 4 + bx lr +} +#endif diff --git a/lib/NitroSDK/src/os/os_thread.c b/lib/NitroSDK/src/os/os_thread.c new file mode 100644 index 00000000..b460a267 --- /dev/null +++ b/lib/NitroSDK/src/os/os_thread.c @@ -0,0 +1,608 @@ +#if 1 + +#include +#include +#include + +extern void SDK_SYS_STACKSIZE(void); +extern void SDK_IRQ_STACKSIZE(void); +#define OSi_SYS_STACKSIZE ((s32)SDK_SYS_STACKSIZE) +#define OSi_IRQ_STACKSIZE ((s32)SDK_IRQ_STACKSIZE) + +#ifdef SDK_ARM9 +#define OSi_STACK_CHECKNUM_BOTTOM 0xfddb597dUL +#define OSi_STACK_CHECKNUM_TOP 0x7bf9dd5bUL +#define OSi_STACK_CHECKNUM_WARN 0x597dfbd9UL +#else +#define OSi_STACK_CHECKNUM_BOTTOM 0xd73bfdf7UL +#define OSi_STACK_CHECKNUM_TOP 0xfbdd37bbUL +#define OSi_STACK_CHECKNUM_WARN 0xbdf7db3dUL +#endif + +//---- defs for launcher thread stack +#ifdef SDK_ARM9 +extern void SDK_SECTION_ARENA_DTCM_START(void); +void SDK_AUTOLOAD_DTCM_END(void); // defined in LCF +#define OSi_LAUNCHER_STACK_LO_DEFAULT SDK_SECTION_ARENA_DTCM_START +#define OSi_LAUNCHER_STACK_HI_MAX (HW_DTCM_SVC_STACK - OSi_IRQ_STACKSIZE) +#define OSi_LAUNCHER_STACK_BOTTOM (HW_DTCM_SVC_STACK - OSi_IRQ_STACKSIZE) +#else +#define OSi_LAUNCHER_STACK_LO_DEFAULT HW_WRAM +#define OSi_LAUNCHER_STACK_HI_MAX (HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE) +#define OSi_LAUNCHER_STACK_BOTTOM (HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE) +#endif + +#define OSi_IDLE_CHECKNUM_SIZE ( sizeof(u32)*2 + HW_SVC_STACK_SIZE ) + +#ifdef SDK_ARM9 +#define OSi_IDLE_SVC_SIZE ( sizeof(u32)*32 ) +#else +#define OSi_IDLE_SVC_SIZE ( sizeof(u32)*16 ) +#endif + +#define OSi_IDLE_THREAD_STACK_SIZE ( OSi_IDLE_CHECKNUM_SIZE + OSi_IDLE_SVC_SIZE ) + +OSThread OSi_LauncherThread; +OSThread OSi_IdleThread; +OSThreadInfo OSi_ThreadInfo; +OSThread **OSi_CurrentThreadPtr; +#define OSi_GetCurrentThread() (*OSi_CurrentThreadPtr) +BOOL OSi_IsThreadInitialized = FALSE; +u32 OSi_IdleThreadStack[OSi_IDLE_THREAD_STACK_SIZE / sizeof(u32)]; +void *OSi_SystemCallbackInSwitchThread = NULL; +u32 OSi_RescheduleCount = 0; +static int OSi_ThreadIdCount = 0; +void *OSi_StackForDestructor = NULL; + +void OSi_IdleThreadProc(void *arg); +void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg); +void OSi_ExitThread(void *arg); +void OSi_ExitThread_Destroy(void); +void OSi_CancelThreadAlarmForSleep(OSThread *thread); +void OS_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio); + +s32 OSi_GetUnusedThreadId(void) { + ++OSi_ThreadIdCount; + return OSi_ThreadIdCount; +} + +static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread) { + OSThread *next = queue->head; + while (next && next->priority <= thread->priority) { + if (next == thread) { + return; + } + next = next->link.next; + } + if (!next) { + OSThread *prev = queue->tail; + if (!prev) { + queue->head = thread; + } else { + prev->link.next = thread; + } + thread->link.prev = prev; + thread->link.next = NULL; + queue->tail = thread; + } else { + OSThread *prev = next->link.prev; + if (!prev) { + queue->head = thread; + } else { + prev->link.next = thread; + } + thread->link.prev = prev; + thread->link.next = next; + next->link.prev = thread; + } +} + +OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue) { + OSThread *t = queue->head; + if (t) { + OSThread *next = t->link.next; + queue->head = next; + if (next) { + next->link.prev = NULL; + } else { + queue->tail = NULL; + t->queue = NULL; + } + } + return t; +} + +OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread) { + OSThread *t = queue->head; + OSThread *next; + OSThread *prev; + while (t) { + next = t->link.next; + if (t == thread) { + prev = t->link.prev; + if (queue->head == t) { + queue->head = next; + } else { + prev->link.next = next; + } + if (queue->tail == t) { + queue->tail = prev; + } else { + next->link.prev = prev; + } + break; + } + t = next; + } + return t; +} + +OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue) { + OSMutex *m = queue->head; + if (m) { + OSMutex *next = m->link.next; + queue->head = next; + if (next) { + next->link.prev = NULL; + } else { + queue->tail = NULL; + } + } + return m; +} + +void OSi_InsertThreadToList(OSThread *thread) { + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + while (t && t->priority < thread->priority) { + pre = t; + t = t->next; + } + if (!pre) { + thread->next = OSi_ThreadInfo.list; + OSi_ThreadInfo.list = thread; + } else { + thread->next = pre->next; + pre->next = thread; + } +} + +void OSi_RemoveThreadFromList(OSThread *thread) { + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + while (t && t != thread) { + pre = t; + t = t->next; + } + if (!pre) { + OSi_ThreadInfo.list = thread->next; + } else { + pre->next = thread->next; + } +} + +void OSi_RescheduleThread(void) { + if (OSi_RescheduleCount <= 0) { + OSThreadInfo *info = &OSi_ThreadInfo; + if (info->irqDepth > 0 || OS_GetProcMode() == OS_PROCMODE_IRQ) { + info->isNeedRescheduling = TRUE; + } + else { + OSThread *currentThread, *nextThread; + currentThread = OSi_GetCurrentThread(); + nextThread = OS_SelectThread(); + if (currentThread == nextThread || !nextThread) { + return; + } + if (currentThread->state != OS_THREAD_STATE_TERMINATED + && OS_SaveContext(¤tThread->context)) { + return; + } + if (OSi_SystemCallbackInSwitchThread) { + ((OSSwitchThreadCallback)OSi_SystemCallbackInSwitchThread) (currentThread, + nextThread); + } + if (info->switchCallback) { + ((OSSwitchThreadCallback)info->switchCallback) (currentThread, nextThread); + } + OS_SetCurrentThread(nextThread); + OS_LoadContext(&nextThread->context); + } + } +} + +void OS_InitThread(void) { + void *stackLo; +#ifndef SDK_THREAD_INFINITY + int i; +#endif + if (OSi_IsThreadInitialized) { + return; + } + OSi_IsThreadInitialized = TRUE; +#ifndef SDK_THREAD_INFINITY + for (i = 0; i < OS_THREAD_MAX_NUM; i++) { + OSi_ThreadInfo.entry[i] = NULL; + } +#endif + OSi_CurrentThreadPtr = &(OSi_ThreadInfo.current); + OSi_LauncherThread.priority = OS_THREAD_LAUNCHER_PRIORITY; + OSi_LauncherThread.id = 0; + OSi_LauncherThread.state = OS_THREAD_STATE_READY; + OSi_LauncherThread.next = NULL; + OSi_LauncherThread.profiler = NULL; +#ifndef SDK_THREAD_INFINITY + OSi_ThreadInfo.entry[0] = &OSi_LauncherThread; +#endif + OSi_ThreadInfo.list = &OSi_LauncherThread; + OS_SetCurrentThread(&OSi_LauncherThread); + stackLo = (OSi_SYS_STACKSIZE <= 0) ? + (void *)((u32)OSi_LAUNCHER_STACK_LO_DEFAULT - OSi_SYS_STACKSIZE) : + (void *)((u32)OSi_LAUNCHER_STACK_HI_MAX - OSi_SYS_STACKSIZE); + OSi_LauncherThread.stackBottom = (u32)OSi_LAUNCHER_STACK_BOTTOM; + OSi_LauncherThread.stackTop = (u32)stackLo; + OSi_LauncherThread.stackWarningOffset = 0; + *(u32 *)(OSi_LauncherThread.stackBottom - sizeof(u32)) = OSi_STACK_CHECKNUM_BOTTOM; + *(u32 *)OSi_LauncherThread.stackTop = OSi_STACK_CHECKNUM_TOP; + OS_InitThreadQueue(&OSi_LauncherThread.joinQueue); +#ifndef SDK_THREAD_INFINITY + OSi_ThreadInfo.max_entry = OS_THREAD_MAX_NUM; +#endif + OSi_ThreadInfo.isNeedRescheduling = FALSE; + OSi_ThreadInfo.irqDepth = 0; +#ifdef SDK_ARM9 + OS_GetSystemWork()->threadinfo_mainp = &OSi_ThreadInfo; +#else + OS_GetSystemWork()->threadinfo_subp = &OSi_ThreadInfo; +#endif + OS_SetSwitchThreadCallback(NULL); +#ifdef SDK_ARM9 + OS_CreateThread(&OSi_IdleThread, + OSi_IdleThreadProc, + (void *)NULL, + OSi_IdleThreadStack + OSi_IDLE_THREAD_STACK_SIZE / sizeof(u32), + OSi_IDLE_THREAD_STACK_SIZE, + OS_THREAD_PRIORITY_MAX); + OSi_IdleThread.priority = OS_THREAD_PRIORITY_MAX + 1; + OSi_IdleThread.state = OS_THREAD_STATE_READY; +#endif +} + +#include +asm BOOL OS_IsThreadAvailable(void) { + ldr r0, =OSi_IsThreadInitialized + ldr r0, [r0] + bx lr +} +#include + +void OS_CreateThread(OSThread *thread, void (*func)(void * arg), void *arg, void *stack, u32 stackSize, u32 prio) { + OSIntrMode enable = OS_DisableInterrupts(); + int index = OSi_GetUnusedThreadId(); + thread->priority = prio; + thread->id = (u32)index; + thread->state = OS_THREAD_STATE_WAITING; + thread->profiler = NULL; + OSi_InsertThreadToList(thread); + thread->stackBottom = (u32)stack; + thread->stackTop = (u32)stack - stackSize; + thread->stackWarningOffset = 0; + *(u32 *)(thread->stackBottom - sizeof(u32)) = OSi_STACK_CHECKNUM_BOTTOM; + *(u32 *)thread->stackTop = OSi_STACK_CHECKNUM_TOP; + OS_InitThreadQueue(&thread->joinQueue); + OS_InitContext(&thread->context, (u32)func, (u32)stack - sizeof(u32)); + thread->context.r[0] = (u32)arg; + thread->context.lr = (u32)OS_ExitThread; + MI_CpuClear32((void *)((u32)stack - stackSize + sizeof(u32)), stackSize - sizeof(u32) * 2); + thread->mutex = NULL; + thread->mutexQueue.head = NULL; + thread->mutexQueue.tail = NULL; + OS_SetThreadDestructor(thread, NULL); + thread->queue = NULL; + thread->link.prev = thread->link.next = NULL; + MI_CpuClear32(&thread->specific[0], sizeof(void *) * OS_THREAD_SPECIFIC_MAX); + thread->alarmForSleep = NULL; + OS_RestoreInterrupts(enable); +} + +static vu32 exitThreadStatus = 0; + +void OS_ExitThread(void) { + OS_DisableInterrupts(); + OSi_ExitThread_ArgSpecified(OS_GetCurrentThread(), NULL); +} + +void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg) { + if (OSi_StackForDestructor) { + OS_InitContext(&thread->context, (u32)OSi_ExitThread, (u32)OSi_StackForDestructor); + thread->context.r[0] = (u32)arg; + thread->context.cpsr |= HW_PSR_IRQ_DISABLE; + thread->state = OS_THREAD_STATE_READY; + OS_LoadContext(&thread->context); + } + else { + OSi_ExitThread(arg); + } +} + +void OSi_ExitThread(void *arg) { + OSThread *currentThread = OSi_GetCurrentThread(); + OSThreadDestructor destructor = currentThread->destructor; + if (destructor) { + currentThread->destructor = NULL; + destructor(arg); + OS_DisableInterrupts(); + } + OSi_ExitThread_Destroy(); +} + +void OSi_ExitThread_Destroy(void) { + OSThread *currentThread = OSi_GetCurrentThread(); + OS_DisableScheduler(); + OSi_UnlockAllMutex(currentThread); + if (currentThread->queue) { + OSi_RemoveSpecifiedLinkFromQueue(currentThread->queue, currentThread); + } + OSi_RemoveThreadFromList(currentThread); + currentThread->state = OS_THREAD_STATE_TERMINATED; + OS_WakeupThread(¤tThread->joinQueue); + OS_EnableScheduler(); + OS_RescheduleThread(); + OS_Terminate(); +} + +void OS_DestroyThread(OSThread *thread) { + OSIntrMode enable = OS_DisableInterrupts(); + if (OS_GetCurrentThread() == thread) { + OSi_ExitThread_Destroy(); + } + OS_DisableScheduler(); + OSi_UnlockAllMutex(thread); + OSi_CancelThreadAlarmForSleep(thread); + if (thread->queue) { + OSi_RemoveSpecifiedLinkFromQueue(thread->queue, thread); + } + OSi_RemoveThreadFromList(thread); + thread->state = OS_THREAD_STATE_TERMINATED; + OS_WakeupThread(&thread->joinQueue); + OS_EnableScheduler(); + OS_RestoreInterrupts(enable); + OS_RescheduleThread(); +} + +static vu32 killThreadStatus = 0; + +static inline void OSi_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio) { + u32 stack = OSi_StackForDestructor ? (u32)OSi_StackForDestructor : thread->stackBottom - sizeof(u32); + OS_InitContext(&thread->context, (u32)OSi_ExitThread, stack); + thread->context.r[0] = (u32)arg; + thread->context.cpsr |= HW_PSR_IRQ_DISABLE; + thread->state = OS_THREAD_STATE_READY; + OS_DisableScheduler(); + OS_SetThreadPriority(thread, prio); + OS_EnableScheduler(); +} + +void OS_KillThread(OSThread *thread, void *arg) { + OS_KillThreadWithPriority(thread, arg, OS_GetThreadPriority(thread)); +} + +void OS_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio) { + OSIntrMode enable = OS_DisableInterrupts(); + if (thread == OS_GetCurrentThread()) { + OSi_ExitThread_ArgSpecified(thread, arg); + } + OSi_CancelThreadAlarmForSleep(thread); + OSi_KillThreadWithPriority(thread, arg, prio); + OSi_RescheduleThread(); + OS_RestoreInterrupts(enable); +} + +void OSi_CancelThreadAlarmForSleep(OSThread *thread) { + if (thread->alarmForSleep) { + OS_CancelAlarm(thread->alarmForSleep); + } +} + +void OS_JoinThread(OSThread *thread) { + OSIntrMode enable = OS_DisableInterrupts(); + if (thread->state != OS_THREAD_STATE_TERMINATED) { + OS_SleepThread(&thread->joinQueue); + } + OS_RestoreInterrupts(enable); +} + +BOOL OS_IsThreadTerminated(const OSThread *thread) { + return thread->state == OS_THREAD_STATE_TERMINATED ? TRUE : FALSE; +} + +void OS_SleepThread(OSThreadQueue *queue) { + OSIntrMode enable = OS_DisableInterrupts(); + OSThread *currentThread = OSi_GetCurrentThread(); + if (queue) { + currentThread->queue = queue; + OSi_InsertLinkToQueue(queue, currentThread); + } + currentThread->state = OS_THREAD_STATE_WAITING; + OSi_RescheduleThread(); + OS_RestoreInterrupts(enable); +} + +void OS_WakeupThread(OSThreadQueue *queue) { + OSIntrMode enable = OS_DisableInterrupts(); + if (queue->head) { + while (queue->head) { + OSThread *thread = OSi_RemoveLinkFromQueue(queue); + thread->state = OS_THREAD_STATE_READY; + thread->queue = NULL; + thread->link.prev = thread->link.next = NULL; + } + OS_InitThreadQueue(queue); + OSi_RescheduleThread(); + } + OS_RestoreInterrupts(enable); +} + +void OS_WakeupThreadDirect(OSThread *thread) { + OSIntrMode enable = OS_DisableInterrupts(); + thread->state = OS_THREAD_STATE_READY; + OSi_RescheduleThread(); + OS_RestoreInterrupts(enable); +} + +OSThread *OS_SelectThread(void) { + OSThread *t = OSi_ThreadInfo.list; + while (t && !OS_IsThreadRunnable(t)) { + t = t->next; + } + return t; +} + +void OS_RescheduleThread() { + OSIntrMode enable = OS_DisableInterrupts(); + OSi_RescheduleThread(); + OS_RestoreInterrupts(enable); +} + +void OS_YieldThread(void) { + OSThread *current = OS_GetCurrentThread(); + OSThread *pre = NULL; + OSThread *lastThread = NULL; + int samePriorityThread = 0; + OSIntrMode enable = OS_DisableInterrupts(); + OSThread *t = OSi_ThreadInfo.list; + OSThread *tPre = NULL; + while (t) { + if (t == current) { + pre = tPre; + } + if (current->priority == t->priority) { + lastThread = t; + samePriorityThread++; + } + tPre = t; + t = t->next; + } + if (samePriorityThread <= 1 || lastThread == current) { + OS_RestoreInterrupts(enable); + return; + } + if (!pre) { + OSi_ThreadInfo.list = current->next; + } + else { + pre->next = current->next; + } + current->next = lastThread->next; + lastThread->next = current; + OSi_RescheduleThread(); + OS_RestoreInterrupts(enable); +} + +BOOL OS_SetThreadPriority(OSThread *thread, u32 prio) { + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + OSIntrMode enable; + enable = OS_DisableInterrupts(); + while (t && t != thread) { + pre = t; + t = t->next; + } + if (!t || t == &OSi_IdleThread) { + (void)OS_RestoreInterrupts(enable); + return FALSE; + } + if (t->priority != prio) { + if (!pre) { + OSi_ThreadInfo.list = thread->next; + } + else { + pre->next = thread->next; + } + thread->priority = prio; + OSi_InsertThreadToList(thread); + OSi_RescheduleThread(); + } + OS_RestoreInterrupts(enable); + return TRUE; +} + +u32 OS_GetThreadPriority(const OSThread *thread) { + return thread->priority; +} + +void OSi_SleepAlarmCallback(void *arg); + +void OS_Sleep(u32 msec) { + OSAlarm alarm; + + OS_CreateAlarm(&alarm); + OSThread *volatile p_thread = OSi_GetCurrentThread(); + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + p_thread->alarmForSleep = &alarm; + OS_SetAlarm(&alarm, OS_MilliSecondsToTicks(msec), OSi_SleepAlarmCallback, (void *)&p_thread); + while (p_thread != NULL) { + OS_SleepThread(NULL); + } + OS_RestoreInterrupts(bak_cpsr); +} + +void OSi_SleepAlarmCallback(void *arg) { + OSThread **ppthread = arg; + OSThread *pthread = *ppthread; + *ppthread = NULL; + pthread->alarmForSleep = NULL; + OS_WakeupThreadDirect(pthread); +} + +OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback) { + OSSwitchThreadCallback prev; + OSIntrMode bak_psr; + + bak_psr = OS_DisableInterrupts(); + prev = OSi_ThreadInfo.switchCallback; + OSi_ThreadInfo.switchCallback = callback; + OS_RestoreInterrupts(bak_psr); + return prev; +} + +void OSi_IdleThreadProc(void * unused) { + OS_EnableInterrupts(); + while (1) { + OS_Halt(); + } +} + +u32 OS_DisableScheduler(void) { + OSIntrMode bak_psr = OS_DisableInterrupts(); + u32 count; + if (OSi_RescheduleCount < (u32)(0 - 1)) { + count = OSi_RescheduleCount++; + } + OS_RestoreInterrupts(bak_psr); + return count; +} + +u32 OS_EnableScheduler(void) { + OSIntrMode bak_psr = OS_DisableInterrupts(); + u32 count = 0; + if (OSi_RescheduleCount > 0) { + count = OSi_RescheduleCount--; + } + OS_RestoreInterrupts(bak_psr); + return count; +} + +static u32 OSi_SystemStackBuffer; + +void OS_SetThreadDestructor(OSThread *thread, void (*dtor)(void *)) { + thread->destructor = dtor; + + // Gotta put this somewhere to force the symbols to compile + // FIXME: when we can safely pass -nodead, port the dead-stripped routines + (void)&OSi_SystemStackBuffer; + (void)&killThreadStatus; + (void)&exitThreadStatus; +} + +#endif diff --git a/lib/NitroSDK/src/os/os_tick.c b/lib/NitroSDK/src/os/os_tick.c new file mode 100644 index 00000000..08f3146e --- /dev/null +++ b/lib/NitroSDK/src/os/os_tick.c @@ -0,0 +1,71 @@ +#include + +static u16 OSi_UseTick = FALSE; +vu64 OSi_TickCounter; +BOOL OSi_NeedResetTimer = FALSE; + +#define OSi_TICK_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) +#define OSi_TICK_TIMER OS_TIMER_0 +#define OSi_TICK_IE_TIMER OS_IE_TIMER0 + +void OSi_CountUpTick(void); + +void OS_InitTick(void) { + if (OSi_UseTick) { + return; + } + OSi_UseTick = TRUE; + OSi_SetTimerReserved(OSi_TICK_TIMER); + OSi_TickCounter = 0; + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, 0); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OS_SetIrqFunction(OSi_TICK_IE_TIMER, OSi_CountUpTick); + OS_EnableIrqMask(OSi_TICK_IE_TIMER); + OSi_NeedResetTimer = FALSE; +} + +BOOL OS_IsTickAvailable(void) { + return OSi_UseTick; +} + +void OSi_CountUpTick(void) { + // timer0 interrupt + OSi_TickCounter++; + if (OSi_NeedResetTimer) { + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, 0); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OSi_NeedResetTimer = FALSE; + } + OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))OSi_CountUpTick, NULL); +} + +OSTick OS_GetTick(void) { + vu16 countL; + vu64 countH; + OSIntrMode enabled = OS_DisableInterrupts(); + + countL = *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); + countH = OSi_TickCounter & 0xffffffffffffULL; + if (reg_OS_IF & OSi_TICK_IE_TIMER && !(countL & 0x8000)) { + countH++; + } + OS_RestoreInterrupts(enabled); + return (countH << 16) | countL; +} + +u16 OS_GetTickLo(void) { + return *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); +} + +void OS_SetTick(OSTick tick) { + OSIntrMode enabled = OS_DisableInterrupts(); + reg_OS_IF = OSi_TICK_IE_TIMER; + OSi_NeedResetTimer = TRUE; + OSi_TickCounter = tick >> 16; + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, tick & 0xFFFF); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OS_RestoreInterrupts(enabled); +} diff --git a/lib/NitroSDK/src/os/os_timer.c b/lib/NitroSDK/src/os/os_timer.c new file mode 100644 index 00000000..a285545f --- /dev/null +++ b/lib/NitroSDK/src/os/os_timer.c @@ -0,0 +1,7 @@ +#include + +static u16 OSi_TimerReserved = 0; + +void OSi_SetTimerReserved(s32 timerNum) { + OSi_TimerReserved |= (1 << timerNum); +} diff --git a/lib/NitroSDK/src/os/os_valarm.c b/lib/NitroSDK/src/os/os_valarm.c new file mode 100644 index 00000000..855dd312 --- /dev/null +++ b/lib/NitroSDK/src/os/os_valarm.c @@ -0,0 +1,258 @@ +#include + +#define HW_LCD_LINES (263) + +#define OSi_VHIGHT HW_LCD_LINES + +#define OSi_VALARM_LATER 0 +#define OSi_VALARM_NOW 1 +#define OSi_VALARM_TIMEOUT 2 + +struct OSiVAlarmQueue { + OSVAlarm *head; + OSVAlarm *tail; +} OSi_VAlarmQueue; + +u16 OSi_UseVAlarm = FALSE; +s32 OSi_VFrameCount; +s32 OSi_PreviousVCount; + +static void OSi_SetNextVAlarm(OSVAlarm *alarm); +static void OSi_AppendVAlarm(OSVAlarm *alarm); +static int OSi_CompareVCount(OSVAlarm *alarm, s32 currentVCount, s32 currentVFrame); +static s32 OSi_GetVFrame(s32 vcount); +static void OSi_VAlarmHandler(void); + +void OS_InitVAlarm(void) { + if (!OSi_UseVAlarm) { + OSi_UseVAlarm = TRUE; + OSi_VAlarmQueue.head = NULL; + OSi_VAlarmQueue.tail = NULL; + OS_DisableIrqMask(OS_IE_V_COUNT); + OSi_VFrameCount = 0; + OSi_PreviousVCount = 0; + } +} + +BOOL OS_IsVAlarmAvailable(void) { + return OSi_UseVAlarm; +} + +void OSi_InsertVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev; + OSVAlarm *next; + for (next = OSi_VAlarmQueue.head; next; next = next->next) { + if ((next->frame < alarm->frame) || (next->frame == alarm->frame) && (next->fire <= alarm->fire)) { + continue; + } + prev = next->prev; + alarm->prev = prev; + alarm->next = next; + next->prev = alarm; + if (prev) { + prev->next = alarm; + } else { + OSi_VAlarmQueue.head = alarm; + OSi_SetNextVAlarm(alarm); + } + return; + } + OSi_AppendVAlarm(alarm); +} + +static void OSi_AppendVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev = OSi_VAlarmQueue.tail; + alarm->prev = prev; + alarm->next = NULL; + OSi_VAlarmQueue.tail = alarm; + if (prev) { + prev->next = alarm; + } else { + OSi_VAlarmQueue.head = alarm; + OSi_SetNextVAlarm(alarm); + } +} + +void OSi_DetachVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev; + OSVAlarm *next; + if (alarm == NULL) { + return; + } + prev = alarm->prev; + next = alarm->next; + if (next) { + next->prev = prev; + } else { + OSi_VAlarmQueue.tail = prev; + } + if (prev) { + prev->next = next; + } else { + OSi_VAlarmQueue.head = next; + } +} + +void OS_CreateVAlarm(OSVAlarm *alarm) { + alarm->handler = NULL; + alarm->tag = 0; + alarm->finish = FALSE; +} + +void OS_SetVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg) { + OSIntrMode enabled = OS_DisableInterrupts(); + s32 currentVCount; + s32 currentVFrame; + if (!alarm || alarm->handler) { + OS_Panic(""); + } + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + alarm->period = FALSE; + alarm->fire = count; + alarm->frame = ((count > currentVCount) ? currentVFrame : (currentVFrame + 1)); + alarm->delay = delay; + alarm->handler = handler; + alarm->arg = arg; + alarm->canceled = FALSE; + OSi_InsertVAlarm(alarm); + OS_RestoreInterrupts(enabled); +} + +void OS_SetPeriodicVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg) { + OSIntrMode enabled = OS_DisableInterrupts(); + s32 currentVCount; + s32 currentVFrame; + if (!alarm || alarm->handler) { + OS_Panic(""); + } + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + alarm->period = TRUE; + alarm->fire = count; + alarm->frame = ((count > currentVCount) ? currentVFrame : (currentVFrame + 1)); + alarm->delay = delay; + alarm->handler = handler; + alarm->arg = arg; + alarm->canceled = FALSE; + OSi_InsertVAlarm(alarm); + OS_RestoreInterrupts(enabled); +} + +__declspec(noinline) +static void OSi_SetNextVAlarm(OSVAlarm *alarm) { + OS_SetIrqFunction(OS_IE_V_COUNT, (void(*)())OSi_VAlarmHandler); + GX_SetVCountEqVal(alarm->fire); + GX_VCountEqIntr(TRUE); + OS_EnableIrqMask(OS_IE_V_COUNT); +} + +void OS_SetVAlarmTag(OSVAlarm *alarm, u32 tag) { + if (tag == 0) { + OS_Panic(""); + } + if (alarm) { + alarm->tag = tag; + } +} + +void OS_CancelVAlarm(OSVAlarm *alarm) { + OSIntrMode enabled = OS_DisableInterrupts(); + alarm->canceled = TRUE; + if (alarm->handler == NULL) { + OS_RestoreInterrupts(enabled); + return; + } + OSi_DetachVAlarm(alarm); + alarm->handler = NULL; + OS_RestoreInterrupts(enabled); +} + +void OS_CancelVAlarms(u32 tag) { + OSIntrMode enabled = OS_DisableInterrupts(); + OSVAlarm *alarm; + OSVAlarm *next; + if (tag == 0) { + OS_Panic(""); + } + for (alarm = OSi_VAlarmQueue.head, next = alarm ? alarm->next : NULL; alarm; alarm = next, next = alarm? alarm->next : NULL) { + if (alarm->tag == tag) { + OS_CancelVAlarm(alarm); + } + } + OS_RestoreInterrupts(enabled); +} + +void OSi_VAlarmHandler(void) { + OSVAlarm *alarm; + OSVAlarmHandler handler; + int check; + s32 currentVCount; + s32 currentVFrame; + + OS_DisableIrqMask(OS_IE_V_COUNT); + GX_VCountEqIntr(FALSE); + OS_SetIrqCheckFlag(OS_IE_V_COUNT); + currentVCount = GX_GetVCountEqVal(); + currentVFrame = OSi_GetVFrame(currentVCount - 1); + + while (NULL != (alarm = OSi_VAlarmQueue.head)) { + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + check = OSi_CompareVCount(alarm, currentVFrame, currentVCount); + switch (check) { + case OSi_VALARM_LATER: + OSi_SetNextVAlarm(alarm); + if (alarm->fire != GX_GetVCount() || alarm->frame != currentVFrame) { + return; + } + OS_DisableIrqMask(OS_IE_V_COUNT); + GX_VCountEqIntr(FALSE); + OS_ResetRequestIrqMask(OS_IE_V_COUNT); + // fallthrough + case OSi_VALARM_NOW: + handler = alarm->handler; + OSi_DetachVAlarm(alarm); + alarm->handler = NULL; + if (handler) { + (handler)(alarm->arg); + } + if (alarm->period && !alarm->canceled) { + alarm->handler = handler; + alarm->frame = OSi_VFrameCount + 1; + OSi_InsertVAlarm(alarm); + } + break; + case OSi_VALARM_TIMEOUT: + OSi_DetachVAlarm(alarm); + alarm->frame = OSi_VFrameCount + 1; + OSi_InsertVAlarm(alarm); + break; + } + } +} + +static int OSi_CompareVCount(OSVAlarm *alarm, s32 currentVFrame, s32 currentVCount) { + s32 delayVFrame; + s32 delayVCount; + + delayVFrame = currentVFrame - alarm->frame; + delayVCount = currentVCount - alarm->fire; + if (delayVFrame < 0 || (delayVFrame == 0 && delayVCount < 0)) { + return OSi_VALARM_LATER; + } + if (delayVCount < 0) { + delayVCount += OSi_VHIGHT; + } + return (delayVCount <= alarm->delay) ? OSi_VALARM_NOW : OSi_VALARM_TIMEOUT; +} + +static s32 OSi_GetVFrame(s32 vcount) { + OSIntrMode enabled = OS_DisableInterrupts(); + if (vcount < OSi_PreviousVCount) { + OSi_VFrameCount++; + } + OSi_PreviousVCount = vcount; + OS_RestoreInterrupts(enabled); + return OSi_VFrameCount; +} diff --git a/lib/NitroSDK/src/os/os_vramExclusive.c b/lib/NitroSDK/src/os/os_vramExclusive.c new file mode 100644 index 00000000..c8c29962 --- /dev/null +++ b/lib/NitroSDK/src/os/os_vramExclusive.c @@ -0,0 +1,69 @@ +#include + +static u32 OSi_vramExclusive; +static u16 OSi_vramLockId[9]; + +asm u32 OsCountZeroBits(u32 bitmap) { + clz r0, r0 + bx lr +} + +void OSi_InitVramExclusive(void) { + int i; + + OSi_vramExclusive = 0; + for (i = 0; i < 9; i++) { + OSi_vramLockId[i] = 0; + } +} + +BOOL OSi_TryLockVram(u16 bank, u16 lockId) { + u32 workMap; + s32 zeroBits; + OSIntrMode enabled = OS_DisableInterrupts(); + + workMap = bank & OSi_vramExclusive; + while (TRUE) { + zeroBits = 31 - OsCountZeroBits(workMap); + if (zeroBits < 0) { + break; + } + workMap &= ~(1 << zeroBits); + if (OSi_vramLockId[zeroBits] != lockId) { + OS_RestoreInterrupts(enabled); + return FALSE; + } + } + workMap = bank & 0x1FF; + while (TRUE) { + zeroBits = 31 - OsCountZeroBits(workMap); + if (zeroBits < 0) { + break; + } + workMap &= ~(1 << zeroBits); + OSi_vramLockId[zeroBits] = lockId; + OSi_vramExclusive |= (1 << zeroBits); + } + OS_RestoreInterrupts(enabled); + return TRUE; +} + +void OSi_UnlockVram(u16 bank, u16 lockId) { + u32 workMap; + s32 zeroBits; + OSIntrMode enabled = OS_DisableInterrupts(); + + workMap = bank & OSi_vramExclusive & 0x1FF; + while (TRUE) { + zeroBits = 31 - OsCountZeroBits(workMap); + if (zeroBits < 0) { + break; + } + workMap &= ~(1 << zeroBits); + if (OSi_vramLockId[zeroBits] == lockId) { + OSi_vramLockId[zeroBits] = 0; + OSi_vramExclusive &= ~(1 << zeroBits); + } + } + OS_RestoreInterrupts(enabled); +} diff --git a/lib/asm/crt0.s b/lib/asm/crt0.s new file mode 100644 index 00000000..c66f3370 --- /dev/null +++ b/lib/asm/crt0.s @@ -0,0 +1,322 @@ + .include "asm/macros.inc" + .include "crt0.inc" + .include "global.inc" + .public SDK_AUTOLOAD_DTCM_START + .public SDK_AUTOLOAD_LIST + .public SDK_AUTOLOAD_LIST_END + .public SDK_AUTOLOAD_START + .public SDK_STATIC_BSS_START + .public SDK_STATIC_BSS_END + .public SDK_IRQ_STACKSIZE + .text + + arm_func_start _start +_start: ; 0x02000800 + mov ip, #0x4000000 + str ip, [ip, #0x208] +_02000808: + ldrh r0, [ip, #6] + cmp r0, #0 + bne _02000808 + bl init_cp15 + mov r0, #0x13 + msr cpsr_c, r0 + ldr r0, _02000930 ; =SDK_AUTOLOAD_DTCM_START + add r0, r0, #0x3fc0 + mov sp, r0 + mov r0, #0x12 + msr cpsr_c, r0 + ldr r0, _02000930 ; =SDK_AUTOLOAD_DTCM_START + add r0, r0, #0x3fc0 + sub r0, r0, #0x40 + sub sp, r0, #4 + tst sp, #4 + beq _02000850 + b _02000854 +_02000850: + sub sp, sp, #4 +_02000854: + ldr r1, _02000934 ; =SDK_IRQ_STACKSIZE + sub r1, r0, r1 + mov r0, #0x1f + msr cpsr_fsxc, r0 + sub sp, r1, #4 + mov r0, #0 + ldr r1, _02000930 ; =SDK_AUTOLOAD_DTCM_START + mov r2, #0x4000 + bl INITi_CpuClear32 + mov r0, #0 + ldr r1, _02000938 ; =0x05000000 + mov r2, #0x400 + bl INITi_CpuClear32 + mov r0, #0x200 + ldr r1, _0200093C ; =0x07000000 + mov r2, #0x400 + bl INITi_CpuClear32 + ldr r1, _02000940 ; =_start_ModuleParams + ldr r0, [r1, #0x14] + bl MIi_UncompressBackward + bl do_autoload + ldr r0, _02000940 ; =_start_ModuleParams + ldr r1, [r0, #0xc] + ldr r2, [r0, #0x10] + mov r3, r1 + mov r0, #0 +_020008BC: + cmp r1, r2 + blo _020008C8 + b _020008CC +_020008C8: + str r0, [r1], #4 +_020008CC: + blo _020008BC + bic r1, r3, #0x1f +_020008D4: + mcr p15, 0, r0, c7, c10, 4 + mcr p15, 0, r1, c7, c5, 1 + mcr p15, 0, r1, c7, c14, 1 + add r1, r1, #0x20 + cmp r1, r2 + blt _020008D4 + ldr r1, _02000944 ; =0x027FFF9C + str r0, [r1] + ldr r1, _02000930 ; =SDK_AUTOLOAD_DTCM_START + add r1, r1, #0x3fc0 + add r1, r1, #0x3c + ldr r0, _02000948 ; =OS_IrqHandler + str r0, [r1] + bl _fp_init + bl NitroStartUp + bl __call_static_initializers + ldr r1, _0200094C ; =NitroMain + ldr lr, _02000950 ; =0xFFFF0000 + tst sp, #4 + bne _02000928 + b _0200092C +_02000928: + sub sp, sp, #4 +_0200092C: + bx r1 + .align 2, 0 +_02000930: .word SDK_AUTOLOAD_DTCM_START +_02000934: .word SDK_IRQ_STACKSIZE +_02000938: .word 0x05000000 +_0200093C: .word 0x07000000 +_02000940: .word _start_ModuleParams +_02000944: .word 0x027FFF9C +_02000948: .word OS_IrqHandler +_0200094C: .word NitroMain +_02000950: .word 0xFFFF0000 + arm_func_end _start + + arm_func_start INITi_CpuClear32 +INITi_CpuClear32: ; 0x02000954 + add ip, r1, r2 +_02000958: + cmp r1, ip + blt _02000964 + b _02000968 +_02000964: + stmia r1!, {r0} +_02000968: + blt _02000958 + bx lr + arm_func_end INITi_CpuClear32 + + arm_func_start MIi_UncompressBackward +MIi_UncompressBackward: ; 0x02000970 + cmp r0, #0 + beq _02000A18 + stmdb sp!, {r4, r5, r6, r7} + ldmdb r0, {r1, r2} + add r2, r0, r2 + sub r3, r0, r1, lsr #24 + bic r1, r1, #0xff000000 + sub r1, r0, r1 + mov r4, r2 +_02000994: + cmp r3, r1 + ble _020009F4 + ldrb r5, [r3, #-1]! + mov r6, #8 +_020009A4: + subs r6, r6, #1 + blt _02000994 + tst r5, #0x80 + bne _020009C0 + ldrb r0, [r3, #-1]! + strb r0, [r2, #-1]! + b _020009E8 +_020009C0: + ldrb ip, [r3, #-1]! + ldrb r7, [r3, #-1]! + orr r7, r7, ip, lsl #8 + bic r7, r7, #0xf000 + add r7, r7, #2 + add ip, ip, #0x20 +_020009D8: + ldrb r0, [r2, r7] + strb r0, [r2, #-1]! + subs ip, ip, #0x10 + bge _020009D8 +_020009E8: + cmp r3, r1 + mov r5, r5, lsl #1 + bgt _020009A4 +_020009F4: + mov r0, #0 + bic r3, r1, #0x1f +_020009FC: + mcr p15, 0, r0, c7, c10, 4 + mcr p15, 0, r3, c7, c5, 1 + mcr p15, 0, r3, c7, c14, 1 + add r3, r3, #0x20 + cmp r3, r4 + blt _020009FC + ldmia sp!, {r4, r5, r6, r7} +_02000A18: + bx lr + arm_func_end MIi_UncompressBackward + + arm_func_start do_autoload +do_autoload: ; 0x02000A1C + ldr r0, _02000AA8 ; =_start_ModuleParams + ldr r1, [r0] + ldr r2, [r0, #4] + ldr r3, [r0, #8] +_02000A2C: + cmp r1, r2 + beq _02000AA4 + ldr r5, [r1], #4 + ldr r7, [r1], #4 + add r6, r5, r7 + mov r4, r5 +_02000A44: + cmp r4, r6 + bmi _02000A50 + b _02000A54 +_02000A50: + ldr r7, [r3], #4 +_02000A54: + bmi _02000A5C + b _02000A60 +_02000A5C: + str r7, [r4], #4 +_02000A60: + bmi _02000A44 + ldr r7, [r1], #4 + add r6, r4, r7 + mov r7, #0 +_02000A70: + cmp r4, r6 + blo _02000A7C + b _02000A80 +_02000A7C: + str r7, [r4], #4 +_02000A80: + blo _02000A70 + bic r4, r5, #0x1f +_02000A88: + mcr p15, 0, r7, c7, c10, 4 + mcr p15, 0, r4, c7, c5, 1 + mcr p15, 0, r4, c7, c14, 1 + add r4, r4, #0x20 + cmp r4, r6 + blt _02000A88 + b _02000A2C +_02000AA4: + b _start_AutoloadDoneCallback + .align 2, 0 +_02000AA8: .word _start_ModuleParams + arm_func_end do_autoload + + arm_func_start _start_AutoloadDoneCallback +_start_AutoloadDoneCallback: + bx lr + arm_func_end _start_AutoloadDoneCallback + + arm_func_start init_cp15 +init_cp15: ; 0x02000AB0 + mrc p15, 0, r0, c1, c0, 0 + ldr r1, _02000B68 ; =0x000F9005 + bic r0, r0, r1 + mcr p15, 0, r0, c1, c0, 0 + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 + mcr p15, 0, r0, c7, c6, 0 + mcr p15, 0, r0, c7, c10, 4 + ldr r0, _02000B6C ; =0x04000033 + mcr p15, 0, r0, c6, c0, 0 + ldr r0, _02000B70 ; =0x0200002D + mcr p15, 0, r0, c6, c1, 0 + ldr r0, _02000B74 ; =0x027E0021 + mcr p15, 0, r0, c6, c2, 0 + ldr r0, _02000B78 ; =0x08000035 + mcr p15, 0, r0, c6, c3, 0 + ldr r0, _02000B7C ; =OS_IRQTable + orr r0, r0, #0x1a + orr r0, r0, #1 + mcr p15, 0, r0, c6, c4, 0 + ldr r0, _02000B80 ; =0x0100002F + mcr p15, 0, r0, c6, c5, 0 + ldr r0, _02000B84 ; =0xFFFF001D + mcr p15, 0, r0, c6, c6, 0 + ldr r0, _02000B88 ; =0x027FF017 + mcr p15, 0, r0, c6, c7, 0 + mov r0, #0x20 + mcr p15, 0, r0, c9, c1, 1 + ldr r0, _02000B7C ; =OS_IRQTable + orr r0, r0, #0xa + mcr p15, 0, r0, c9, c1, 0 + mov r0, #0x42 + mcr p15, 0, r0, c2, c0, 1 + mov r0, #0x42 + mcr p15, 0, r0, c2, c0, 0 + mov r0, #2 + mcr p15, 0, r0, c3, c0, 0 + ldr r0, _02000B8C ; =0x05100011 + mcr p15, 0, r0, c5, c0, 3 + ldr r0, _02000B90 ; =0x15111011 + mcr p15, 0, r0, c5, c0, 2 + mrc p15, 0, r0, c1, c0, 0 + ldr r1, _02000B94 ; =0x0005707D + orr r0, r0, r1 + mcr p15, 0, r0, c1, c0, 0 + bx lr + .align 2, 0 +_02000B68: .word 0x000F9005 +_02000B6C: .word 0x04000033 +_02000B70: .word 0x0200002D +_02000B74: .word 0x027E0021 +_02000B78: .word 0x08000035 +_02000B7C: .word OS_IRQTable +_02000B80: .word 0x0100002F +_02000B84: .word 0xFFFF001D +_02000B88: .word 0x027FF017 +_02000B8C: .word 0x05100011 +_02000B90: .word 0x15111011 +_02000B94: .word 0x0005707D + arm_func_end init_cp15 + + arm_func_start NitroStartUp +NitroStartUp: ; 0x02000B98 + bx lr + arm_func_end NitroStartUp + + arm_func_start OSi_ReferSymbol +OSi_ReferSymbol: ; 0x02000B9C + bx lr + arm_func_end OSi_ReferSymbol + + .rodata + .public _start_ModuleParams +_start_ModuleParams: ; 0x02000BA0 + .word SDK_AUTOLOAD_LIST + .word SDK_AUTOLOAD_LIST_END + .word SDK_AUTOLOAD_START + .word SDK_STATIC_BSS_START + .word SDK_STATIC_BSS_END + .word 0 ; SDK_COMPRESSED_STATIC_END + .word 0x04027533 ; SDK_VERSION_ID + .word 0xDEC00621 ; SDK_NITROCODE_BE + .word 0x2106C0DE ; SDK_NITROCODE_LE diff --git a/lib/asm/include/crt0.inc b/lib/asm/include/crt0.inc new file mode 100644 index 00000000..12008f7e --- /dev/null +++ b/lib/asm/include/crt0.inc @@ -0,0 +1,11 @@ +#include +#pragma once +.public _start +.public MIi_UncompressBackward +.public _start_AutoloadDoneCallback +.public OSi_ReferSymbol +.public NitroMain +.public _fp_init +.public __call_static_initializers +.public OS_IrqHandler +.public OS_IRQTable diff --git a/lib/asm/include/jn_spl.inc b/lib/asm/include/jn_spl.inc new file mode 100644 index 00000000..0c0b567e --- /dev/null +++ b/lib/asm/include/jn_spl.inc @@ -0,0 +1,50 @@ +#include +#pragma once +.public SPL_DeleteAll +.public SPL_Delete +.public SPL_CreateWithInitialize +.public SPL_Create +.public SPL_Draw +.public SPL_Calc +.public SPL_LoadTexPlttByVRAMManager +.public SPL_LoadTexByVRAMManager +.public SPL_LoadTexPlttByCallbackFunction +.public SPL_LoadTexByCallbackFunction +.public SPL_Load +.public SPL_Init +.public spl_calc +.public spl_calc_convergence +.public spl_calc_scfield +.public spl_calc_spin +.public spl_calc_magnet +.public spl_calc_random +.public spl_calc_gravity +.public MTX_RotX33_ +.public MTX_RotY33_ +.public MTX_RotZ33_ +.public MTX_MultVec33 +.public MTX_Identity43_ +.public MTX_Scale43_ +.public MTX_Concat43 +.public MTX_MultVec43 +.public VEC_DotProduct +.public VEC_Fx16DotProduct +.public VEC_CrossProduct +.public VEC_Fx16CrossProduct +.public VEC_Normalize +.public VEC_Fx16Normalize +.public G3_LoadMtx43 +.public G3_MultMtx43 +.public GX_BeginLoadTex +.public GX_LoadTex +.public GX_EndLoadTex +.public GX_BeginLoadTexPltt +.public GX_LoadTexPltt +.public GX_EndLoadTexPltt +.public MI_Copy36B +.public MI_CpuFill8 +.public _s32_div_f +.public _u32_div_f +.public FX_SinCosTable_ +.public NNS_GfdDefaultFuncAllocTexVram +.public NNS_GfdDefaultFuncAllocPlttVram diff --git a/lib/asm/include/libVCT.inc b/lib/asm/include/libVCT.inc new file mode 100644 index 00000000..fc881833 --- /dev/null +++ b/lib/asm/include/libVCT.inc @@ -0,0 +1,33 @@ +#include +#pragma once +.public OSi_ReferSymbol +.public _version_Abiosso_libVCT +.public VCT_StartStreaming +.public VCT_StopStreaming +.public VCT_SendAudio +.public VCT_ReceiveAudio +.public VCT_SetCodec +.public VCT_EnableVAD +.public VCT_EnableEchoCancel +.public VCT_CreateSession +.public VCT_DeleteSession +.public VCT_Request +.public VCT_Response +.public VCT_AddConferenceClient +.public VCT_GetVADInfo +.public VCT_Init +.public VCT_Cleanup +.public VCT_Main +.public VCT_HandleData +.public OS_GetTick +.public OS_GetTickLo +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public MIi_CpuClearFast +.public MIi_CpuCopyFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public MATH_CountPopulation +.public _ll_udiv +.public DWC_SendReliable +.public DWC_SendUnreliable diff --git a/lib/asm/include/msl.inc b/lib/asm/include/msl.inc new file mode 100644 index 00000000..ec559bb4 --- /dev/null +++ b/lib/asm/include/msl.inc @@ -0,0 +1,99 @@ +#include +#pragma once +.public OS_LockMutex +.public OS_UnlockMutex +.public OS_TryLockMutex +.public OS_AllocFromHeap +.public OS_FreeToHeap +.public abort +.public exit +.public nan +.public free +.public abs +.public __msl_assertion_failed +.public fread +.public fclose +.public ftell +.public fseek +.public rewind +.public memcpy +.public memmove +.public memset +.public memcmp +.public printf +.public vsprintf +.public snprintf +.public sprintf +.public qsort +.public rand +.public srand +.public sscanf +.public strlen +.public strcpy +.public strncpy +.public strcat +.public strncat +.public strcmp +.public strncmp +.public strchr +.public strspn +.public strtok +.public strstr +.public atof +.public strtoul +.public strtol +.public atoi +.public swprintf +.public wcslen +.public pow +.public strnicmp +.public _dadd +.public _d2f +.public _dfix +.public _dfixu +.public _dflt +.public _dfltu +.public _dmul +.public _dsub +.public _fadd +.public _dgeq +.public _dgr +.public _dleq +.public _dls +.public _dneq +.public _fgr +.public _fleq +.public _fls +.public _feq +.public _fneq +.public _fdiv +.public _f2d +.public _ffix +.public _ffixu +.public _fflt +.public _ffltu +.public _f_lltof +.public _f_ulltof +.public _fmul +.public _fsub +.public _ll_mod +.public _ll_sdiv +.public _ll_udiv +.public _ull_mod +.public _ll_mul +.public _s32_div_f +.public _u32_div_f +.public _ddiv +.public _fp_init +.public __call_static_initializers +.public _0210E404 +.public _0210E484 +.public _0210E504 +.public OSi_ThreadInfo +.public _021E58C0 +.public __global_destructor_chain +.public _Z14__ThrowHandlerP12ThrowContext +.public _ZNSt15__vector_commonILb1EE18throw_length_errorEv +.public _ZSt7nothrow +.public _ZdaPv +.public _ZnamRKSt9nothrow_t diff --git a/lib/asm/include/nitro.inc b/lib/asm/include/nitro.inc new file mode 100644 index 00000000..a337a658 --- /dev/null +++ b/lib/asm/include/nitro.inc @@ -0,0 +1,343 @@ +#include +#pragma once +.public SVC_CpuSet +.public SVC_WaitByLoop +.public MIi_UncompressBackward +.public OSi_ReferSymbol +.public _version_NINTENDO_BACKUP +.public GX_ResetBankForClearImage +.public G2_GetBG0ScrPtr +.public G2S_GetBG0ScrPtr +.public G2_GetBG1ScrPtr +.public G2S_GetBG1ScrPtr +.public G2_GetBG2ScrPtr +.public G2S_GetBG2ScrPtr +.public G2_GetBG3ScrPtr +.public G2S_GetBG3ScrPtr +.public G3_LoadMtx44 +.public OSi_IrqCallback +.public OS_InitIrqTable +.public OS_SetIrqFunction +.public OSi_EnterDmaCallback +.public OSi_EnterTimerCallback +.public OS_SetIrqMask +.public OS_EnableIrqMask +.public OS_DisableIrqMask +.public OS_ResetRequestIrqMask +.public OS_SetIrqStackChecker +.public OS_InitLock +.public OSi_DoLockByWord +.public OS_LockByWord +.public OSi_DoUnlockByWord +.public OS_UnlockByWord +.public OSi_DoTryLockByWord +.public OS_LockCartridge +.public OS_UnlockCartridge +.public OS_UnLockCartridge +.public OS_TryLockCartridge +.public OS_LockCard +.public OS_UnlockCard +.public OS_UnLockCard +.public OS_ReadOwnerOfLockWord +.public OS_GetLockID +.public OSi_GetUnusedThreadId +.public OSi_InsertLinkToQueue +.public OSi_RemoveLinkFromQueue +.public OSi_RemoveSpecifiedLinkFromQueue +.public OSi_RemoveMutexLinkFromQueue +.public OSi_InsertThreadToList +.public OSi_RemoveThreadFromList +.public OSi_RescheduleThread +.public OS_InitThread +.public OS_CreateThread +.public OS_ExitThread +.public OSi_ExitThread_ArgSpecified +.public OSi_ExitThread +.public OSi_ExitThread_Destroy +.public OS_SleepThread +.public OS_WakeupThread +.public OS_WakeupThreadDirect +.public OS_SetThreadPriority +.public OS_IsRunOnEmulator +.public OS_GetConsoleType +.public OS_InitMessageQueue +.public OS_SendMessage +.public OS_ReceiveMessage +.public OS_JamMessage +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public DC_FlushAll +.public DC_InvalidateRange +.public DC_StoreRange +.public DC_FlushRange +.public DC_WaitWriteBufferEmpty +.public IC_InvalidateRange +.public OS_GetDTCMAddress +.public OS_EnableProtectionUnit +.public OS_DisableProtectionUnit +.public OS_SetDPermissionsForProtectionRegion +.public OSi_SetTimerReserved +.public OS_IsTickAvailable +.public OS_GetTick +.public OSi_SetTimer +.public OSi_InsertAlarm +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_GetCpsrIrq +.public OS_SpinWait +.public OSi_SendToPxi +.public OS_GetMacAddress +.public OS_Terminate +.public OS_Halt +.public MI_SetWramBank +.public MI_DmaFill32 +.public MI_DmaCopy32 +.public MI_DmaCopy16 +.public MI_StopDma +.public MIi_CheckAnotherAutoDMA +.public MIi_CheckDma0SourceAddress +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MIi_CpuClearFast +.public MIi_CpuCopyFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public MIi_CardDmaCopy32 +.public SND_StopSeq +.public SND_PrepareSeq +.public SND_StartPreparedSeq +.public SND_PauseSeq +.public SND_SetPlayerTempoRatio +.public SND_SetPlayerVolume +.public SND_SetPlayerChannelPriority +.public SND_SetTrackPitch +.public SND_SetTrackPan +.public SND_SetTrackAllocatableChannel +.public SND_StartTimer +.public SND_StopTimer +.public SND_SetupAlarm +.public SND_LockChannel +.public SND_UnlockChannel +.public SND_SetChannelTimer +.public SND_SetChannelVolume +.public SND_SetChannelPan +.public SND_SetupChannelPcm +.public SND_InvalidateSeqData +.public SND_InvalidateBankData +.public SND_InvalidateWaveData +.public SND_SetMasterVolume +.public SND_SetOutputSelector +.public SND_SetMasterPan +.public SND_ResetMasterPan +.public SND_ReadDriverInfo +.public SND_Init +.public SND_RecvCommandReply +.public SND_FlushCommand +.public SND_WaitForCommandProc +.public SND_GetCurrentCommandTag +.public SND_IsFinishedCommandTag +.public AllocCommand +.public SND_GetPlayerStatus +.public SND_GetChannelStatus +.public SND_GetPlayerLocalVariable +.public SND_ReadChannelInfo +.public SND_ReadTrackInfo +.public SND_CalcChannelVolume +.public SND_AssignWaveArc +.public SND_DestroyBank +.public SND_DestroyWaveArc +.public SND_GetFirstInstDataPos +.public SND_GetNextInstData +.public SND_GetWaveDataCount +.public SND_SetWaveDataAddress +.public SND_GetWaveDataAddress +.public PXI_Init +.public PXI_SetFifoRecvCallback +.public PXI_IsCallbackReady +.public PXI_SendWordByFifo +.public FS_InitArchive +.public FS_FindArchive +.public FS_RegisterArchiveName +.public FS_ReleaseArchiveName +.public FS_LoadArchive +.public FS_UnloadArchive +.public FS_LoadArchiveTables +.public FS_UnloadArchiveTables +.public FS_SetArchiveProc +.public FS_NotifyArchiveAsyncEnd +.public FS_Init +.public FS_IsAvailable +.public FS_InitFile +.public FS_ConvertPathToFileID +.public FS_OpenFileDirect +.public FS_OpenFileFast +.public FS_OpenFile +.public FS_CloseFile +.public FS_WaitAsync +.public FS_ReadFile +.public FS_SeekFile +.public FS_ChangeDir +.public FS_SetDefaultDMA +.public FS_TryLoadTable +.public FS_LoadOverlayInfo +.public FS_LoadOverlayImageAsync +.public FS_LoadOverlayImage +.public FS_StartOverlay +.public FS_LoadOverlay +.public FS_UnloadOverlay +.public DGT_Hash1Reset +.public DGT_Hash1SetSource +.public DGT_Hash1GetDigest_R +.public TP_Init +.public TP_GetUserInfo +.public TP_SetCalibrateParam +.public TP_RequestAutoSamplingStartAsync +.public TP_RequestAutoSamplingStopAsync +.public TP_GetLatestRawPointInAuto +.public TP_GetLatestIndexInAuto +.public TP_GetCalibratedPoint +.public TP_WaitBusy +.public TP_CheckBusy +.public MIC_Init +.public MIC_StartAutoSamplingAsync +.public MIC_StartAutoSampling +.public MIC_StopAutoSampling +.public MIC_GetLastSamplingAddress +.public PM_Init +.public PM_SetBackLight +.public PM_ForceToPowerOff +.public PM_SetAmp +.public PM_SetAmpGain +.public PM_GetBackLight +.public PM_GoSleepMode +.public PM_SetLCDPower +.public PMi_SendLEDPatternCommand +.public PM_GetLEDPattern +.public PM_PrependPreSleepCallback +.public PM_AppendPostSleepCallback +.public PM_DeletePreSleepCallback +.public PM_DeletePostSleepCallback +.public RTC_Init +.public RTC_GetDate +.public RTC_GetTime +.public RTC_GetDateTimeAsync +.public RTC_GetDateTime +.public RTC_ConvertDateToDay +.public RTC_ConvertDateTimeToSecond +.public RTC_ConvertDayToDate +.public RTC_ConvertSecondToDateTime +.public CARD_GetResultCode +.public CARD_LockRom +.public CARD_UnlockRom +.public CARD_LockBackup +.public CARD_UnlockBackup +.public CARD_SetCacheFlushThreshold +.public CARD_IdentifyBackup +.public CARD_WaitBackupAsync +.public CARD_TryWaitBackupAsync +.public CARD_CancelBackupAsync +.public CARDi_ReadRom +.public CARD_Init +.public CARD_IsPulledOut +.public CARD_SetSpiReadWaitCycles +.public CARD_SetSpiWriteWaitCycles +.public CARD_SpiWaitInit +.public CARD_SpiWaitReadRange +.public CARD_SpiWaitWriteRange +.public CARD_SpiWaitGetStatus +.public WM_Init +.public WM_Finish +.public WMi_GetStatusAddress +.public WM_SetIndCallback +.public WM_SetPortCallback +.public WM_ReadStatus +.public WM_ReadMPData +.public WM_GetAllowedChannel +.public WM_GetLinkLevel +.public WM_GetDispersionBeaconPeriod +.public WM_GetDispersionScanPeriod +.public WM_GetOtherElements +.public WM_GetNextTgid +.public WM_Enable +.public WM_Disable +.public WM_PowerOn +.public WM_PowerOff +.public WM_Initialize +.public WM_InitializeForListening +.public WM_Reset +.public WM_End +.public WM_SetParentParameter +.public WMi_StartParentEx +.public WM_StartParent +.public WM_EndParent +.public WM_StartScan +.public WM_StartScanEx +.public WM_EndScan +.public WM_StartConnectEx +.public WM_Disconnect +.public WM_StartMPEx +.public WM_StartMP +.public WM_SetMPDataToPortEx +.public WM_EndMP +.public WM_StartDCF +.public WM_SetDCFData +.public WM_EndDCF +.public WM_StartDataSharing +.public WM_StepDataSharing +.public WM_GetSharedDataAddress +.public WM_StartKeySharing +.public WM_EndKeySharing +.public WM_SetWEPKey +.public WM_SetWEPKeyEx +.public WM_SetGameInfo +.public WM_SetBeaconIndication +.public WM_SetLifeTime +.public WM_MeasureChannel +.public WM_SetEntry +.public CTRDG_IsAgbCartridge +.public CTRDG_GetAgbGameCode +.public CTRDG_GetAgbMakerCode +.public CTRDG_IsPulledOut +.public CTRDG_IsExisting +.public CTRDG_CpuCopy8 +.public CTRDG_CpuCopy16 +.public CTRDG_CpuCopy32 +.public CTRDG_Read32 +.public CTRDG_Enable +.public CTRDG_Init +.public CTRDG_TerminateForPulledOut +.public CTRDG_IdentifyAgbBackup +.public CTRDG_ReadAgbFlash +.public CTRDG_WriteAndVerifyAgbFlashAsync +.public MATH_CountPopulation +.public MATH_CalcMD5 +.public MATH_CalcSHA1 +.public MATHi_CRC8InitTable +.public MATHi_CRC16InitTable +.public MATHi_CRC16InitTableRev +.public MATHi_CRC16Update +.public MATHi_CRC16UpdateRev +.public MATHi_CRC32InitTableRev +.public MATH_CalcCRC8 +.public MATH_CalcCRC16 +.public MATH_CalcCRC16CCITT +.public MATH_CalcCRC32 +.public MATH_QSort +.public STD_CopyLString +.public STD_GetStringLength +.public STD_CompareString +.public STD_CompareNString +.public _ll_mod +.public _ll_sdiv +.public _ll_udiv +.public _0210D750 +.public GXi_DmaId +.public OSi_ThreadInfo +.public __global_destructor_chain +.public OS_IrqHandler +.public MIi_DmaSetParams +.public SDK_OVERLAY_DIGEST_END +.public SDK_OVERLAY_DIGEST diff --git a/lib/asm/include/nnsys.inc b/lib/asm/include/nnsys.inc new file mode 100644 index 00000000..c274756b --- /dev/null +++ b/lib/asm/include/nnsys.inc @@ -0,0 +1,422 @@ +#include +#pragma once +.public NNS_FndCreateExpHeapEx +.public NNS_FndDestroyExpHeap +.public NNS_FndAllocFromExpHeapEx +.public NNS_FndResizeForMBlockExpHeap +.public NNS_FndFreeToExpHeap +.public NNS_FndGetTotalFreeSizeForExpHeap +.public NNS_FndSetGroupIDForExpHeap +.public NNS_FndGetSizeForMBlockExpHeap +.public NNS_FndGetGroupIDForMBlockExpHeap +.public NNS_FndAllocFromAllocator +.public NNS_FndInitAllocatorForExpHeap +.public NNS_GfdInitFrmTexVramManager +.public NNS_GfdResetFrmTexVramState +.public NNS_GfdGetFrmTexVramState +.public NNS_GfdSetFrmTexVramState +.public NNS_GfdInitFrmPlttVramManager +.public NNS_GfdGetFrmPlttVramState +.public NNS_GfdSetFrmPlttVramState +.public NNS_GfdResetFrmPlttVramState +.public NNS_GfdInitVramTransferManager +.public NNS_GfdDoVramTransfer +.public NNS_GfdRegisterNewVramTransferTask +.public NNS_GfdGetLnkTexVramManagerWorkSize +.public NNS_GfdInitLnkTexVramManager +.public NNS_GfdFreeLnkTexVram +.public NNS_GfdResetLnkTexVramState +.public NNS_GfdGetLnkPlttVramManagerWorkSize +.public NNS_GfdInitLnkPlttVramManager +.public NNS_GfdFreeLnkPlttVram +.public NNS_GfdResetLnkPlttVramState +.public NNS_G2dGetUnpackedAnimBank +.public NNS_G2dGetUnpackedMCAnimBank +.public NNS_G2dGetAnimSequenceByIdx +.public NNS_G2dGetUnpackedCellBank +.public NNS_G2dGetUnpackedMultiCellBank +.public NNS_G2dGetUnpackedCharacterData +.public NNS_G2dGetUnpackedBGCharacterData +.public NNS_G2dGetUnpackedPaletteData +.public NNS_G2dGetUnpackedPaletteCompressInfo +.public NNS_G2dGetUnpackedScreenData +.public NNS_G2dSetupSoftwareSpriteCamera +.public NNS_G2dDrawSpriteFast +.public NNS_G2dGetAnimCtrlCurrentElement +.public NNS_G2dGetAnimCtrlCurrentFrame +.public NNS_G2dResetAnimCtrlState +.public NNS_G2dInitOamManagerModule +.public NNS_G2dGetNewOamManagerInstance +.public NNS_G2dEntryOamManagerOamWithAffineIdx +.public NNS_G2dEntryOamManagerAffine +.public NNS_G2dApplyAndResetOamManagerBuffer +.public NNS_G2dInitImageProxy +.public NNS_G2dSetImageLocation +.public NNS_G2dGetImageLocation +.public NNS_G2dInitImagePaletteProxy +.public NNS_G2dSetImagePaletteLocation +.public NNS_G2dGetImagePaletteLocation +.public NNS_G2dLoadImage1DMapping +.public NNS_G2dLoadImage2DMapping +.public NNS_G2dLoadImageVramTransfer +.public NNS_G2dLoadPalette +.public NNS_G2dLoadPaletteEx +.public NNS_G2dInitCellAnimation +.public NNS_G2dInitCellAnimationVramTransfered +.public NNS_G2dSetCellAnimationSequence +.public NNS_G2dTickCellAnimation +.public NNS_G2dSetCellAnimationCurrentFrame +.public NNS_G2dSetAnimSequenceToMCAnimation +.public NNS_G2dGetMCBankNumNodesRequired +.public NNS_G2dTickMCAnimation +.public NNS_G2dSetMCAnimationCurrentFrame +.public NNS_G2dInitMCAnimation +.public NNS_G2dInitRenderer +.public NNS_G2dAddRendererTargetSurface +.public NNS_G2dInitRenderSurface +.public NNS_G2dBeginRendering +.public NNS_G2dEndRendering +.public NNS_G2dDrawCellAnimation +.public NNS_G2dDrawMultiCell +.public NNS_G2dDrawMultiCellAnimation +.public NNS_G2dPushMtx +.public NNS_G2dPopMtx +.public NNS_G2dTranslate +.public NNS_G2dScale +.public NNS_G2dRotZ +.public NNS_G2dSetRendererImageProxy +.public NNS_G2dInitCellTransferStateManager +.public NNS_G2dUpdateCellTransferStateManager +.public NNS_G2dGetNewCellTransferStateHandle +.public NNS_G2dFreeCellTransferStateHandle +.public NNS_G2dSetRndCoreAffineOverwriteMode +.public NNS_G2dSetRndCoreFlipMode +.public NNS_G2dFontInitUTF16 +.public NNS_G2dFontFindGlyphIndex +.public NNS_G2dFontGetCharWidthsFromIndex +.public ClearChar +.public NNS_G2dCharCanvasDrawChar +.public NNS_G2dCharCanvasInitForBG +.public NNS_G2dCharCanvasInitForOBJ1D +.public NNS_G2dMapScrToCharText +.public NNSi_G2dCalcRequiredOBJ +.public NNS_G2dArrangeOBJ1D +.public NNSi_G2dTextCanvasDrawText +.public NNSi_G2dTextCanvasDrawTextRect +.public NNS_G3dAnmObjInit +.public NNS_G3dAnmObjEnableID +.public NNS_G3dAnmObjDisableID +.public NNS_G3dRenderObjInit +.public NNS_G3dRenderObjAddAnmObj +.public NNS_G3dRenderObjRemoveAnmObj +.public NNS_G3dTexGetRequiredSize +.public NNS_G3dTex4x4GetRequiredSize +.public NNS_G3dTexSetTexKey +.public NNS_G3dTexLoad +.public NNS_G3dTexReleaseTexKey +.public NNS_G3dPlttGetRequiredSize +.public NNS_G3dPlttSetPlttKey +.public NNS_G3dPlttLoad +.public NNS_G3dPlttReleasePlttKey +.public NNS_G3dForceBindMdlTex +.public NNS_G3dReleaseMdlTex +.public NNS_G3dForceBindMdlPltt +.public NNS_G3dReleaseMdlPltt +.public NNS_G3dBindMdlSet +.public NNS_G3dReleaseMdlSet +.public NNS_G3dGlbFlushP +.public NNS_G3dGlbSetBaseTrans +.public NNS_G3dGlbSetBaseScale +.public NNS_G3dGlbLightVector +.public NNS_G3dGlbLightColor +.public NNS_G3dGlbMaterialColorDiffAmb +.public NNS_G3dGlbMaterialColorSpecEmi +.public NNS_G3dGlbPolygonAttr +.public NNS_G3dDraw +.public NNS_G3dDraw1Mat1Shp +.public NNS_G3dGeFlushBuffer +.public NNS_G3dGeBufferOP_N +.public NNS_G3dInit +.public NNS_G3dResDefaultSetup +.public NNS_G3dScrPosToWorldLine +.public NNS_G3dAllocAnmObj +.public NNS_G3dFreeAnmObj +.public NNSi_G3dModifyMatFlag +.public NNSi_G3dModifyPolygonAttrMask +.public NNS_G3dMdlSetMdlDiff +.public NNS_G3dMdlSetMdlAmb +.public NNS_G3dMdlSetMdlSpec +.public NNS_G3dMdlSetMdlEmi +.public NNS_G3dMdlSetMdlLightEnableFlag +.public NNS_G3dMdlSetMdlPolygonMode +.public NNS_G3dMdlSetMdlCullMode +.public NNS_G3dMdlSetMdlPolygonID +.public NNS_G3dMdlSetMdlAlpha +.public NNS_G3dMdlSetMdlFogEnableFlag +.public NNS_G3dMdlSetMdlDepthTestCond +.public NNS_G3dMdlSetMdl1Dot +.public NNS_G3dMdlSetMdlFarClip +.public NNS_G3dMdlSetMdlXLDepthUpdate +.public NNS_G3dMdlGetMdlLightEnableFlag +.public NNS_G3dMdlGetMdlFogEnableFlag +.public NNS_G3dMdlSetMdlDiffAll +.public NNS_G3dMdlSetMdlAmbAll +.public NNS_G3dMdlSetMdlSpecAll +.public NNS_G3dMdlSetMdlEmiAll +.public NNS_G3dMdlSetMdlLightEnableFlagAll +.public NNS_G3dMdlSetMdlPolygonModeAll +.public NNS_G3dMdlSetMdlCullModeAll +.public NNS_G3dMdlSetMdlPolygonIDAll +.public NNS_G3dMdlSetMdlAlphaAll +.public NNS_G3dMdlSetMdlFogEnableFlagAll +.public NNS_G3dMdlSetMdlDepthTestCondAll +.public NNS_G3dMdlSetMdl1DotAll +.public NNS_G3dMdlSetMdlFarClipAll +.public NNS_G3dMdlSetMdlXLDepthUpdateAll +.public NNS_G3dGetResDataByName +.public NNS_G3dGetResDictIdxByName +.public NNS_G3dGetMdlSet +.public NNS_G3dGetTex +.public NNS_G3dGetAnmByIdx +.public NNS_SndInit +.public NNS_SndMain +.public NNS_SndSetMasterVolume +.public NNS_SndSetMonoFlag +.public NNS_SndUpdateDriverInfo +.public NNS_SndReadDriverChannelInfo +.public NNS_SndWaveOutAllocChannel +.public NNS_SndWaveOutFreeChannel +.public NNS_SndWaveOutStart +.public NNS_SndWaveOutStop +.public NNS_SndWaveOutSetVolume +.public NNS_SndWaveOutSetSpeed +.public NNS_SndWaveOutSetPan +.public NNS_SndWaveOutIsPlaying +.public NNS_SndPlayerSetPlayerVolume +.public NNS_SndPlayerSetPlayableSeqCount +.public NNS_SndPlayerSetAllocatableChannel +.public NNS_SndPlayerCreateHeap +.public NNS_SndPlayerStopSeq +.public NNS_SndPlayerStopSeqByPlayerNo +.public NNS_SndPlayerStopSeqBySeqNo +.public NNS_SndPlayerStopSeqAll +.public NNS_SndPlayerPause +.public NNS_SndPlayerPauseByPlayerNo +.public NNS_SndHandleInit +.public NNS_SndHandleReleaseSeq +.public NNS_SndPlayerCountPlayingSeqByPlayerNo +.public NNS_SndPlayerSetVolume +.public NNS_SndPlayerSetInitialVolume +.public NNS_SndPlayerMoveVolume +.public NNS_SndPlayerSetTrackPitch +.public NNS_SndPlayerSetTrackPan +.public NNS_SndPlayerSetTrackAllocatableChannel +.public NNS_SndPlayerSetTempoRatio +.public NNS_SndPlayerGetSeqNo +.public NNS_SndPlayerReadVariable +.public NNS_SndPlayerReadDriverTrackInfo +.public NNS_SndStrmInit +.public NNS_SndStrmAllocChannel +.public NNS_SndStrmFreeChannel +.public NNS_SndStrmSetup +.public NNS_SndStrmStart +.public NNS_SndStrmStop +.public NNS_SndStrmSetVolume +.public NNS_SndCaptureStopReverb +.public NNS_SndCaptureIsActive +.public NNS_SndCaptureGetCaptureType +.public NNS_SndArcInit +.public NNS_SndArcInitOnMemory +.public NNS_SndArcGetSeqParam +.public NNS_SndArcGetBankInfo +.public NNS_SndArcGetWaveArcInfo +.public NNS_SndArcGetFileSize +.public NNS_SndArcReadFile +.public NNS_SndHeapCreate +.public NNS_SndHeapSaveState +.public NNS_SndHeapLoadState +.public NNS_SndHeapGetSize +.public NNS_SndHeapGetFreeSize +.public InitHeap +.public NNS_SndArcLoadGroup +.public NNS_SndArcLoadSeq +.public NNS_SndArcLoadBank +.public NNS_SndArcLoadWaveArc +.public NNS_SndArcLoadSeqEx +.public LoadSeq +.public LoadBank +.public LoadWaveArc +.public NNS_SndArcPlayerSetup +.public NNS_SndArcPlayerStartSeqEx +.public NNS_SndArcPlayerStartSeqArc +.public StartSeq +.public StartSeqArc +.public FreeChannel +.public MTX_Identity33_ +.public MTX_Identity43_ +.public MTX_Copy43To44_ +.public MTX_ScaleApply43 +.public MTX_Inverse43 +.public MTX_Concat43 +.public MTX_Identity44_ +.public MTX_Copy44To43_ +.public MTX_Concat44 +.public FX_Div +.public FX_Inv +.public FX_InvFx64c +.public FX_GetDivResultFx64c +.public FX_GetDivResult +.public FX_InvAsync +.public FX_DivAsync +.public VEC_CrossProduct +.public VEC_Mag +.public VEC_Normalize +.public G3_LoadMtx43 +.public G3_MultMtx43 +.public G3_MultMtx33 +.public G3X_Init +.public G3X_GetClipMtx +.public G3X_GetVectorMtx +.public G3i_OrthoW_ +.public G3i_LookAt_ +.public GX_LoadBGPltt +.public GXS_LoadBGPltt +.public GX_LoadOBJPltt +.public GXS_LoadOBJPltt +.public GX_LoadOAM +.public GXS_LoadOAM +.public GX_LoadOBJ +.public GXS_LoadOBJ +.public GX_LoadBG0Scr +.public GXS_LoadBG0Scr +.public GX_LoadBG1Scr +.public GXS_LoadBG1Scr +.public GX_LoadBG2Scr +.public GXS_LoadBG2Scr +.public GX_LoadBG3Scr +.public GXS_LoadBG3Scr +.public GX_LoadBG0Char +.public GXS_LoadBG0Char +.public GX_LoadBG1Char +.public GXS_LoadBG1Char +.public GX_LoadBG2Char +.public GXS_LoadBG2Char +.public GX_LoadBG3Char +.public GXS_LoadBG3Char +.public GX_BeginLoadBGExtPltt +.public GX_LoadBGExtPltt +.public GX_EndLoadBGExtPltt +.public GX_BeginLoadOBJExtPltt +.public GX_LoadOBJExtPltt +.public GX_EndLoadOBJExtPltt +.public GXS_BeginLoadBGExtPltt +.public GXS_LoadBGExtPltt +.public GXS_EndLoadBGExtPltt +.public GXS_BeginLoadOBJExtPltt +.public GXS_LoadOBJExtPltt +.public GXS_EndLoadOBJExtPltt +.public GX_BeginLoadTex +.public GX_LoadTex +.public GX_EndLoadTex +.public GX_BeginLoadTexPltt +.public GX_LoadTexPltt +.public GX_EndLoadTexPltt +.public GX_BeginLoadClearImage +.public GX_LoadClearImageColor +.public GX_LoadClearImageDepth +.public GX_EndLoadClearImage +.public OS_ReceiveMessage +.public OS_LockMutex +.public OS_UnlockMutex +.public DC_InvalidateRange +.public DC_StoreRange +.public DC_FlushRange +.public OS_AllocFromHeap +.public OS_FreeToHeap +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_Terminate +.public MI_DmaFill32 +.public MI_SendGXCommandAsync +.public MI_SendGXCommandAsyncFast +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MIi_CpuSend32 +.public MIi_CpuClearFast +.public MIi_CpuCopyFast +.public MI_Copy64B +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public MI_Zero36B +.public SND_StopSeq +.public SND_PrepareSeq +.public SND_StartPreparedSeq +.public SND_PauseSeq +.public SND_SetPlayerTempoRatio +.public SND_SetPlayerVolume +.public SND_SetPlayerChannelPriority +.public SND_SetTrackPitch +.public SND_SetTrackPan +.public SND_SetTrackAllocatableChannel +.public SND_StartTimer +.public SND_StopTimer +.public SND_SetupAlarm +.public SND_LockChannel +.public SND_UnlockChannel +.public SND_SetChannelTimer +.public SND_SetChannelVolume +.public SND_SetChannelPan +.public SND_SetupChannelPcm +.public SND_InvalidateSeqData +.public SND_InvalidateBankData +.public SND_InvalidateWaveData +.public SND_SetMasterVolume +.public SND_SetOutputSelector +.public SND_SetMasterPan +.public SND_ResetMasterPan +.public SND_ReadDriverInfo +.public SND_Init +.public SND_RecvCommandReply +.public SND_FlushCommand +.public SND_WaitForCommandProc +.public SND_GetCurrentCommandTag +.public SND_IsFinishedCommandTag +.public SND_GetPlayerStatus +.public SND_GetChannelStatus +.public SND_GetPlayerLocalVariable +.public SND_ReadChannelInfo +.public SND_ReadTrackInfo +.public SND_CalcChannelVolume +.public SND_AssignWaveArc +.public SND_DestroyBank +.public SND_DestroyWaveArc +.public SND_GetFirstInstDataPos +.public SND_GetNextInstData +.public SND_GetWaveDataCount +.public SND_SetWaveDataAddress +.public SND_GetWaveDataAddress +.public FS_InitFile +.public FS_ConvertPathToFileID +.public FS_OpenFileFast +.public FS_ReadFile +.public FS_SeekFile +.public PM_PrependPreSleepCallback +.public PM_AppendPostSleepCallback +.public PM_DeletePreSleepCallback +.public PM_DeletePostSleepCallback +.public abs +.public _ll_udiv +.public _s32_div_f +.public _u32_div_f +.public FX_SinCosTable_ +.public _0210D750 +.public NNS_GfdDefaultFuncAllocTexVram +.public NNS_GfdDefaultFuncFreeTexVram +.public NNS_GfdDefaultFuncAllocPlttVram +.public NNS_GfdDefaultFuncFreePlttVram +.public _02110A0C +.public sIsDispOn +.public GXi_DmaId +.public NNS_G3dGlb diff --git a/lib/asm/include/overlay_123.inc b/lib/asm/include/overlay_123.inc new file mode 100644 index 00000000..25225fc1 --- /dev/null +++ b/lib/asm/include/overlay_123.inc @@ -0,0 +1,16 @@ +#include +#pragma once +.public OS_GetLockID +.public OS_ReleaseLockID +.public DC_FlushRange +.public IC_InvalidateRange +.public OS_GetMacAddress +.public OS_GetOwnerInfo +.public CARD_LockRom +.public CARD_UnlockRom +.public ov123_0225F430 +.public ov123_0225F4A8 +.public ov123_0225F520 +.public ov123_0225F598 +.public ov123_0225F610 +.public ov123_0225F688 diff --git a/lib/asm/include/wifi.inc b/lib/asm/include/wifi.inc new file mode 100644 index 00000000..25220f6a --- /dev/null +++ b/lib/asm/include/wifi.inc @@ -0,0 +1,153 @@ +#include +#pragma once +.public OSi_ReferSymbol +.public _version_NINTENDO_WiFi +.public _version_UBIQUITOUS_CPS +.public _version_UBIQUITOUS_SSL +.public SOCL_CalmDown +.public SOCL_Resolve +.public SOCL_GetHostID +.public SOC_Socket +.public SOC_Bind +.public SOC_Connect +.public SOC_Recv +.public SOC_RecvFrom +.public SOC_Send +.public SOC_SendTo +.public SOC_Shutdown +.public SOC_Close +.public SOC_GetHostByName +.public SOC_GetSockName +.public SOC_GetHostID +.public SOC_SetResolver +.public SOC_Listen +.public SOC_Accept +.public SOC_Fcntl +.public SOC_Startup +.public SOC_Cleanup +.public SOC_InetNtoA +.public SOC_InetAtoN +.public SOC_U32to4U8 +.public SOC_Poll +.public SOCL_EnableSsl +.public CPS_SocRegister +.public CPS_SocUnRegister +.public CPS_SocBind +.public CPS_SocUse +.public CPS_SocRelease +.public CPS_TcpConnect +.public CPS_TcpShutdown +.public CPS_TcpClose +.public CPS_SocRead +.public CPS_SocConsume +.public CPS_SocWrite +.public CPS_SocGetLength +.public CPS_SocFlush +.public CPS_Resolve +.public CPS_GetSslHandshakePriority +.public CPS_SetSslHandshakePriority +.public CPS_SetRootCa +.public decrypt +.public CPS_SslAddRandomSeed +.public CPS_SetSsl +.public R +.public WCM_Init +.public WCM_Finish +.public WCM_StartupAsync +.public WCM_CleanupAsync +.public WCM_SearchAsync +.public WCM_EndSearchAsync +.public WCM_ConnectAsync +.public WCM_DisconnectAsync +.public WCM_TerminateAsync +.public WCM_GetPhase +.public WCM_ClearApList +.public WCM_CountApList +.public WCM_LockApList +.public WCM_PointApList +.public WCM_GetApMacAddress +.public WCM_GetApEssid +.public WCM_GetLinkLevel +.public MD5Init +.public MD5Update +.public MD5Final +.public OS_SNPrintf +.public OS_CreateThread +.public OS_DestroyThread +.public OS_JoinThread +.public OS_IsThreadTerminated +.public OS_SleepThread +.public OS_WakeupThread +.public OS_WakeupThreadDirect +.public OS_RescheduleThread +.public OS_YieldThread +.public OS_SetThreadPriority +.public OS_GetThreadPriority +.public OS_Sleep +.public OS_DisableScheduler +.public OS_EnableScheduler +.public OS_InitMessageQueue +.public OS_SendMessage +.public OS_ReceiveMessage +.public OS_ReadMessage +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public OS_TryLockMutex +.public DC_InvalidateRange +.public OS_InitTick +.public OS_IsTickAvailable +.public OS_GetTick +.public OS_InitAlarm +.public OS_IsAlarmAvailable +.public OS_CreateAlarm +.public OS_SetAlarm +.public OS_CancelAlarm +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public OS_GetProcMode +.public OS_GetMacAddress +.public MIi_CpuCopyFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public DGT_Hash1Reset +.public DGT_Hash1SetSource +.public DGT_Hash1GetDigest_R +.public RTC_GetDate +.public RTC_GetTime +.public RTC_ConvertDateTimeToSecond +.public WM_Init +.public WM_Finish +.public WMi_GetStatusAddress +.public WM_SetIndCallback +.public WM_GetAllowedChannel +.public WM_GetDispersionScanPeriod +.public WM_Enable +.public WM_Disable +.public WM_PowerOn +.public WM_PowerOff +.public WM_Reset +.public WM_StartScanEx +.public WM_EndScan +.public WM_StartConnectEx +.public WM_Disconnect +.public WM_StartDCF +.public WM_SetDCFData +.public WM_EndDCF +.public WM_SetWEPKeyEx +.public WM_SetBeaconIndication +.public WM_SetLifeTime +.public STD_CopyLString +.public memmove +.public memcmp +.public strlen +.public strcmp +.public _ll_udiv +.public _s32_div_f +.public _u32_div_f +.public _02108FC0 +.public _02108FC8 +.public _021D4420 +.public _021D4670 +.public OSi_ThreadInfo +.public OS_IrqHandler diff --git a/lib/asm/jn_spl.s b/lib/asm/jn_spl.s new file mode 100644 index 00000000..ee839140 --- /dev/null +++ b/lib/asm/jn_spl.s @@ -0,0 +1,6622 @@ + .include "asm/macros.inc" + .include "jn_spl.inc" + .include "global.inc" + + .bss + +spl_rndm_seed: + .space 0x4 + + .text + + arm_func_start SPL_DeleteAll +SPL_DeleteAll: ; 0x02097FF4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + ldr r1, [r5, #4] + cmp r1, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r4, r5, lr} + bxeq lr +_02098014: + ldr r4, [r1] + mov r0, r5 + bl SPL_Delete + mov r1, r4 + cmp r4, #0 + bne _02098014 + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + arm_func_end SPL_DeleteAll + + arm_func_start SPL_Delete +SPL_Delete: ; 0x02098038 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r6, r1 + mov r7, r0 + add r0, r6, #8 + bl spl_pop_front + movs r1, r0 + beq _02098078 + add r5, r7, #0x1c + add r4, r6, #8 +_02098060: + mov r0, r5 + bl spl_push_front + mov r0, r4 + bl spl_pop_front + movs r1, r0 + bne _02098060 +_02098078: + add r0, r6, #0x14 + bl spl_pop_front + movs r1, r0 + beq _020980A8 + add r5, r7, #0x1c + add r4, r6, #0x14 +_02098090: + mov r0, r5 + bl spl_push_front + mov r0, r4 + bl spl_pop_front + movs r1, r0 + bne _02098090 +_020980A8: + mov r1, r6 + add r0, r7, #4 + bl spl_del + mov r1, r6 + add r0, r7, #0x10 + bl spl_push_front + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + arm_func_end SPL_Delete + + arm_func_start SPL_CreateWithInitialize +SPL_CreateWithInitialize: ; 0x020980CC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r7, r0 + ldr r0, [r7, #0x10] + mov r6, r1 + mov r5, r2 + cmp r0, #0 + mov r4, #0 + beq _02098150 + add r1, sp, #0 + str r4, [r1] + str r4, [r1, #4] + add r0, r7, #0x10 + str r4, [r1, #8] + bl spl_pop_front + ldr r1, [r7, #0x28] + add r2, sp, #0 + add r1, r1, r6, lsl #5 + mov r4, r0 + bl spl_init + cmp r5, #0 + beq _0209812C + mov r0, r4 + blx r5 +_0209812C: + mov r1, r4 + add r0, r7, #4 + bl spl_push_front + ldr r0, [r4, #0x20] + ldr r0, [r0] + ldr r0, [r0] + mov r0, r0, lsl #0x11 + movs r0, r0, lsr #0x1f + movne r4, #0 +_02098150: + mov r0, r4 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + arm_func_end SPL_CreateWithInitialize + + arm_func_start SPL_Create +SPL_Create: ; 0x02098160 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r7, r0 + ldr r0, [r7, #0x10] + mov r6, r1 + mov r5, r2 + cmp r0, #0 + mov r4, #0 + beq _020981C4 + add r0, r7, #0x10 + bl spl_pop_front + ldr r1, [r7, #0x28] + mov r4, r0 + mov r2, r5 + add r1, r1, r6, lsl #5 + bl spl_init + mov r1, r4 + add r0, r7, #4 + bl spl_push_front + ldr r0, [r4, #0x20] + ldr r0, [r0] + ldr r0, [r0] + mov r0, r0, lsl #0x11 + movs r0, r0, lsr #0x1f + movne r4, #0 +_020981C4: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + arm_func_end SPL_Create + + arm_func_start SPL_Draw +SPL_Draw: ; 0x020981D4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + ldr r2, _02098298 ; =0x04000060 + mov r4, r0 + ldrh r0, [r2] + bic r0, r0, #0x3000 + orr r0, r0, #8 + strh r0, [r2] + str r1, [r4, #0x44] + ldr r0, [r4, #0x38] + mov r0, r0, lsl #7 + movs r0, r0, lsr #0x1f + bne _02098250 + ldr r5, [r4, #4] + cmp r5, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r4, r5, lr} + bxeq lr +_0209821C: + str r5, [r4, #0x40] + ldr r0, [r5, #0x24] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1f + bne _02098238 + mov r0, r4 + bl spl_draw +_02098238: + ldr r5, [r5] + cmp r5, #0 + bne _0209821C + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_02098250: + ldr r5, [r4, #0xc] + cmp r5, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r4, r5, lr} + bxeq lr +_02098264: + str r5, [r4, #0x40] + ldr r0, [r5, #0x24] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1f + bne _02098280 + mov r0, r4 + bl spl_draw +_02098280: + ldr r5, [r5, #4] + cmp r5, #0 + bne _02098264 + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + .align 2, 0 +_02098298: .word 0x04000060 + arm_func_end SPL_Draw + + arm_func_start SPL_Calc +SPL_Calc: ; 0x0209829C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r0 + ldr r7, [r8, #4] + cmp r7, #0 + beq _020983B0 + add sl, r8, #4 + add sb, r8, #0x10 + mov r4, #0 +_020982BC: + ldr r2, [r7, #0x24] + ldr r1, [r7, #0x20] + mov r0, r2, lsl #0x1b + movs r0, r0, lsr #0x1f + ldr r5, [r1] + ldr r6, [r7] + bne _020982F0 + ldrh r1, [r7, #0x4c] + ldrh r0, [r5, #0x32] + cmp r1, r0 + orrhs r0, r2, #0x10 + strhs r0, [r7, #0x24] + strhsh r4, [r7, #0x4c] +_020982F0: + ldr r0, [r7, #0x24] + mov r0, r0, lsl #0x1d + movs r0, r0, lsr #0x1f + bne _0209832C + ldr r0, [r7, #0x80] + mov r0, r0, lsl #0xd + movs r0, r0, lsr #0x1d + beq _02098320 + ldrh r1, [r8, #0x48] + sub r0, r0, #1 + cmp r1, r0 + bne _0209832C +_02098320: + mov r0, r8 + mov r1, r7 + bl spl_calc +_0209832C: + ldr r0, [r5] + mov r0, r0, lsl #0x11 + movs r0, r0, lsr #0x1f + beq _02098364 + ldrh r1, [r5, #0x3c] + cmp r1, #0 + beq _02098364 + ldr r0, [r7, #0x24] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _02098364 + ldrh r0, [r7, #0x4c] + cmp r0, r1 + bhi _02098374 +_02098364: + ldr r0, [r7, #0x24] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _020983A4 +_02098374: + ldr r0, [r7, #0xc] + cmp r0, #0 + bne _020983A4 + ldr r0, [r7, #0x18] + cmp r0, #0 + bne _020983A4 + mov r0, sl + mov r1, r7 + bl spl_del + mov r1, r0 + mov r0, sb + bl spl_push_front +_020983A4: + mov r7, r6 + cmp r6, #0 + bne _020982BC +_020983B0: + ldrh r0, [r8, #0x48] + add r0, r0, #1 + strh r0, [r8, #0x48] + ldrh r0, [r8, #0x48] + cmp r0, #1 + movhi r0, #0 + strhih r0, [r8, #0x48] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + arm_func_end SPL_Calc + + arm_func_start SPL_LoadTexPlttByVRAMManager +SPL_LoadTexPlttByVRAMManager: ; 0x020983D4 + ldr ip, _020983E0 ; =SPL_LoadTexPlttByCallbackFunction + ldr r1, _020983E4 ; =sAllocTexPalette + bx ip + .align 2, 0 +_020983E0: .word SPL_LoadTexPlttByCallbackFunction +_020983E4: .word sAllocTexPalette + arm_func_end SPL_LoadTexPlttByVRAMManager + + arm_func_start SPL_LoadTexByVRAMManager +SPL_LoadTexByVRAMManager: ; 0x020983E8 + ldr ip, _020983F4 ; =SPL_LoadTexByCallbackFunction + ldr r1, _020983F8 ; =sAllocTex + bx ip + .align 2, 0 +_020983F4: .word SPL_LoadTexByCallbackFunction +_020983F8: .word sAllocTex + arm_func_end SPL_LoadTexByVRAMManager + + arm_func_start SPL_LoadTexPlttByCallbackFunction +SPL_LoadTexPlttByCallbackFunction: ; 0x020983FC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #4 + mov sl, r0 + mov fp, r1 + bl GX_BeginLoadTexPltt + ldrh r0, [sl, #0x32] + mov sb, #0 + cmp r0, #0 + ble _0209849C + mov r0, #1 + mov r5, sb + mov r4, sb + str r0, [sp] +_02098430: + ldr r0, [sl, #0x2c] + mov r6, r4 + ldr r7, [r0, r5] + add r8, r0, r5 + ldr r0, [r7, #0x10] + cmp r0, #0 + beq _02098484 + ldr r1, [r7, #4] + mov r1, r1, lsl #0x1c + mov r1, r1, lsr #0x1c + cmp r1, #2 + ldreq r1, [sp] + movne r1, r4 + blx fp + mov r6, r0 + ldr r1, [r8] + ldr r0, [r7, #0xc] + ldr r2, [r7, #0x10] + add r0, r1, r0 + mov r1, r6 + bl GX_LoadTexPltt +_02098484: + str r6, [r8, #8] + ldrh r0, [sl, #0x32] + add sb, sb, #1 + add r5, r5, #0x14 + cmp sb, r0 + blt _02098430 +_0209849C: + bl GX_EndLoadTexPltt + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + arm_func_end SPL_LoadTexPlttByCallbackFunction + + arm_func_start SPL_LoadTexByCallbackFunction +SPL_LoadTexByCallbackFunction: ; 0x020984B0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sl, r0 + mov fp, r1 + bl GX_BeginLoadTex + ldrh r0, [sl, #0x32] + mov sb, #0 + cmp r0, #0 + ble _02098568 + mov r0, #1 + mov r6, sb + str sb, [sp, #4] + str r0, [sp] + mov r4, #0x14 +_020984E8: + ldr r2, [sl, #0x2c] + ldr r7, [r2, r6] + add r8, r2, r6 + ldr r0, [r7, #4] + mov r1, r0, lsl #0xe + movs r1, r1, lsr #0x1f + beq _0209851C + mov r0, r0, lsl #6 + mov r1, r0, lsr #0x18 + mla r0, r1, r4, r2 + ldr r0, [r0, #4] + str r0, [r8, #4] + b _02098554 +_0209851C: + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #5 + ldreq r1, [sp] + ldr r0, [r7, #8] + ldrne r1, [sp, #4] + blx fp + mov r5, r0 + ldr r0, [r8] + ldr r2, [r7, #8] + add r0, r0, #0x20 + mov r1, r5 + bl GX_LoadTex + str r5, [r8, #4] +_02098554: + ldrh r0, [sl, #0x32] + add sb, sb, #1 + add r6, r6, #0x14 + cmp sb, r0 + blt _020984E8 +_02098568: + bl GX_EndLoadTex + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + arm_func_end SPL_LoadTexByCallbackFunction + + arm_func_start SPL_Load +SPL_Load: ; 0x0209857C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + mov sb, r1 + ldrh r1, [sb, #8] + mov sl, r0 + mov r8, #0x20 + strh r1, [sl, #0x30] + ldrh r0, [sb, #0xa] + strh r0, [sl, #0x32] + ldrh r0, [sl, #0x30] + ldr r1, [sl] + mov r0, r0, lsl #5 + blx r1 + str r0, [sl, #0x28] + ldrh r2, [sl, #0x30] + ldr r0, [sl, #0x28] + mov r1, #0 + mov r2, r2, lsl #5 + bl MI_CpuFill8 + ldrh r1, [sl, #0x30] + mov r0, #0 + str r0, [sp] + cmp r1, #0 + ble _0209881C + mov r6, r0 + str r0, [sp, #0x10] + str r0, [sp, #0x14] + str r0, [sp, #0x18] + str r0, [sp, #0x1c] + str r0, [sp, #0x20] + str r0, [sp, #0x24] +_020985F8: + ldr r1, [sl, #0x28] + add r0, sb, r8 + str r0, [r1, r6] + ldr r0, [r1, r6] + add r8, r8, #0x58 + ldr r0, [r0] + add r7, r1, r6 + str r0, [sp, #0x28] + mov r0, r0, lsl #0x17 + movs r0, r0, lsr #0x1f + addne r0, sb, r8 + strne r0, [r7, #4] + ldreq r0, [sp, #0x10] + addne r8, r8, #0xc + streq r0, [r7, #4] + ldr r0, [sp, #0x28] + mov r0, r0, lsl #0x16 + movs r0, r0, lsr #0x1f + addne r0, sb, r8 + strne r0, [r7, #8] + ldreq r0, [sp, #0x14] + addne r8, r8, #0xc + streq r0, [r7, #8] + ldr r0, [sp, #0x28] + mov r0, r0, lsl #0x15 + movs r0, r0, lsr #0x1f + addne r0, sb, r8 + strne r0, [r7, #0xc] + ldreq r0, [sp, #0x18] + addne r8, r8, #8 + streq r0, [r7, #0xc] + ldr r0, [sp, #0x28] + mov r0, r0, lsl #0x14 + movs r0, r0, lsr #0x1f + addne r0, sb, r8 + strne r0, [r7, #0x10] + ldreq r0, [sp, #0x1c] + addne r8, r8, #0xc + streq r0, [r7, #0x10] + ldr r0, [sp, #0x28] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + addne r0, sb, r8 + strne r0, [r7, #0x14] + ldreq r0, [sp, #0x20] + addne r8, r8, #0x14 + streq r0, [r7, #0x14] + ldr r0, [sp, #0x28] + mov r1, r0, lsl #7 + mov r2, r0, lsl #6 + mov r5, r1, lsr #0x1f + mov r4, r2, lsr #0x1f + add r1, r5, r2, lsr #31 + mov r2, r0, lsl #5 + add r1, r1, r2, lsr #31 + mov r3, r0, lsl #4 + mov fp, r2, lsr #0x1f + add r2, r1, r3, lsr #31 + mov r1, r3, lsr #0x1f + mov ip, r0, lsl #3 + str r1, [sp, #4] + mov r3, r0, lsl #2 + mov r0, ip, lsr #0x1f + add r1, r2, ip, lsr #31 + str r0, [sp, #8] + add r0, r1, r3, lsr #31 + strh r0, [r7, #0x1c] + mov r0, r3, lsr #0x1f + str r0, [sp, #0xc] + ldrh r0, [r7, #0x1c] + cmp r0, #0 + beq _020987F8 + mov r0, r0, lsl #3 + ldr r1, [sl] + blx r1 + str r0, [r7, #0x18] + cmp r5, #0 + ldr r0, [r7, #0x18] + beq _0209874C + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988DC ; =spl_calc_gravity + add r8, r8, #8 + str r1, [r0] + add r0, r0, #8 +_0209874C: + cmp r4, #0 + beq _0209876C + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988E0 ; =spl_calc_random + add r8, r8, #8 + str r1, [r0] + add r0, r0, #8 +_0209876C: + cmp fp, #0 + beq _0209878C + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988E4 ; =spl_calc_magnet + add r8, r8, #0x10 + str r1, [r0] + add r0, r0, #8 +_0209878C: + ldr r1, [sp, #4] + cmp r1, #0 + beq _020987B0 + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988E8 ; =spl_calc_spin + add r8, r8, #4 + str r1, [r0] + add r0, r0, #8 +_020987B0: + ldr r1, [sp, #8] + cmp r1, #0 + beq _020987D4 + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988EC ; =spl_calc_scfield + add r8, r8, #8 + str r1, [r0] + add r0, r0, #8 +_020987D4: + ldr r1, [sp, #0xc] + cmp r1, #0 + beq _02098800 + add r1, sb, r8 + str r1, [r0, #4] + ldr r1, _020988F0 ; =spl_calc_convergence + add r8, r8, #0x10 + str r1, [r0] + b _02098800 +_020987F8: + ldr r0, [sp, #0x24] + str r0, [r7, #0x18] +_02098800: + ldr r0, [sp] + ldrh r1, [sl, #0x30] + add r0, r0, #1 + add r6, r6, #0x20 + str r0, [sp] + cmp r0, r1 + blt _020985F8 +_0209881C: + ldrh r2, [sl, #0x32] + mov r0, #0x14 + ldr r1, [sl] + mul r0, r2, r0 + blx r1 + str r0, [sl, #0x2c] + ldrh r3, [sl, #0x32] + mov r1, #0x14 + ldr r0, [sl, #0x2c] + mul r2, r3, r1 + mov r1, #0 + bl MI_CpuFill8 + ldrh r0, [sl, #0x32] + mov r3, #0 + cmp r0, #0 + addle sp, sp, #0x2c + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxle lr + mov r4, r3 + mov r0, #1 +_0209886C: + ldr r2, [sl, #0x2c] + add r1, sb, r8 + str r1, [r2, r4] + ldr r5, [r1, #4] + add r2, r2, r4 + mov r5, r5, lsl #0x18 + mov r5, r5, lsr #0x1c + add r5, r5, #3 + mov r5, r0, lsl r5 + strh r5, [r2, #0x10] + ldr r5, [r1, #4] + add r3, r3, #1 + mov r5, r5, lsl #0x14 + mov r5, r5, lsr #0x1c + add r5, r5, #3 + mov r5, r0, lsl r5 + strh r5, [r2, #0x12] + ldr r5, [r1, #4] + add r4, r4, #0x14 + str r5, [r2, #0xc] + ldrh r2, [sl, #0x32] + ldr r1, [r1, #0x1c] + cmp r3, r2 + add r8, r8, r1 + blt _0209886C + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_020988DC: .word spl_calc_gravity +_020988E0: .word spl_calc_random +_020988E4: .word spl_calc_magnet +_020988E8: .word spl_calc_spin +_020988EC: .word spl_calc_scfield +_020988F0: .word spl_calc_convergence + arm_func_end SPL_Load + + arm_func_start SPL_Init +SPL_Init: ; 0x020988F4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r0 + mov r0, #0x4c + mov r7, r1 + mov r6, r2 + mov r4, r3 + blx r8 + mov r5, r0 + mov r1, #0 + mov r2, #0x4c + bl MI_CpuFill8 + strh r7, [r5, #0x34] + strh r6, [r5, #0x36] + ldrh r0, [sp, #0x20] + and r2, r4, #0x3f + ldr r1, [r5, #0x38] + and r0, r0, #0x3f + bic r1, r1, #0x3f + orr r0, r1, r0 + str r0, [r5, #0x38] + ldrh r0, [sp, #0x24] + ldr r3, [r5, #0x38] + mov r1, #0 + bic r3, r3, #0xfc0 + and r0, r0, #0x3f + orr r0, r3, r0, lsl #6 + str r0, [r5, #0x38] + ldr r3, [r5, #0x38] + mov r0, #0x9c + mul r4, r7, r0 + bic ip, r3, #0x3f000 + mov r0, r3, lsl #0x1a + mov r0, r0, lsr #0x1a + and r0, r0, #0x3f + orr r0, ip, r0, lsl #12 + str r0, [r5, #0x38] + ldr r3, [r5, #0x38] + mov r0, r4 + bic r3, r3, #0xfc0000 + orr r2, r3, r2, lsl #18 + str r2, [r5, #0x38] + ldr r2, [r5, #0x38] + bic r2, r2, #0x1000000 + str r2, [r5, #0x38] + ldr r2, [r5, #0x38] + bic r2, r2, #0xfe000000 + str r2, [r5, #0x38] + str r8, [r5] + str r1, [r5, #8] + str r1, [r5, #0x14] + str r1, [r5, #0x20] + str r1, [r5, #4] + str r1, [r5, #0x10] + str r1, [r5, #0x1c] + str r1, [r5, #0x3c] + strh r1, [r5, #0x48] + blx r8 + mov r2, r4 + mov sb, r0 + mov r1, #0 + bl MI_CpuFill8 + cmp r7, #0 + mov sl, #0 + ble _02098A14 + add r4, r5, #0x10 +_020989F8: + mov r0, r4 + mov r1, sb + bl spl_push_front + add sl, sl, #1 + cmp sl, r7 + add sb, sb, #0x9c + blt _020989F8 +_02098A14: + mov r0, #0x44 + mul r4, r6, r0 + mov r0, r4 + blx r8 + mov r2, r4 + mov r1, #0 + mov r8, r0 + bl MI_CpuFill8 + cmp r6, #0 + mov r7, #0 + ble _02098A60 + add r4, r5, #0x1c +_02098A44: + mov r0, r4 + mov r1, r8 + bl spl_push_front + add r7, r7, #1 + cmp r7, r6 + add r8, r8, #0x44 + blt _02098A44 +_02098A60: + mov r0, #0 + str r0, [r5, #0x28] + str r0, [r5, #0x2c] + strh r0, [r5, #0x32] + ldrh r1, [r5, #0x32] + mov r0, r5 + strh r1, [r5, #0x30] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + arm_func_end SPL_Init + + arm_func_start sAllocTexPalette +sAllocTexPalette: ; 0x02098A84 + stmdb sp!, {lr} + sub sp, sp, #4 + ldr r3, _02098AB4 ; =NNS_GfdDefaultFuncAllocPlttVram + mov r2, #0 + ldr r3, [r3] + blx r3 + ldr r1, _02098AB8 ; =0x0000FFFF + and r0, r0, r1 + mov r0, r0, lsl #3 + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + .align 2, 0 +_02098AB4: .word NNS_GfdDefaultFuncAllocPlttVram +_02098AB8: .word 0x0000FFFF + arm_func_end sAllocTexPalette + + arm_func_start sAllocTex +sAllocTex: ; 0x02098ABC + stmdb sp!, {lr} + sub sp, sp, #4 + ldr r3, _02098AEC ; =NNS_GfdDefaultFuncAllocTexVram + mov r2, #0 + ldr r3, [r3] + blx r3 + ldr r1, _02098AF0 ; =0x0000FFFF + and r0, r0, r1 + mov r0, r0, lsl #3 + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + .align 2, 0 +_02098AEC: .word NNS_GfdDefaultFuncAllocTexVram +_02098AF0: .word 0x0000FFFF + arm_func_end sAllocTex + + arm_func_start spl_draw +spl_draw: ; 0x02098AF4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r4, r0 + ldr r1, [r4, #0x40] + ldr r1, [r1, #0x20] + ldr r5, [r1] + ldr r1, [r5] + mov r2, r1, lsl #0xa + movs r2, r2, lsr #0x1f + beq _02098B4C + bl sDrawChild + ldr r0, [r5] + mov r0, r0, lsl #9 + movs r0, r0, lsr #0x1f + addne sp, sp, #4 + ldmneia sp!, {r4, r5, lr} + bxne lr + mov r0, r4 + bl sDrawParent + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_02098B4C: + mov r1, r1, lsl #9 + movs r1, r1, lsr #0x1f + bne _02098B5C + bl sDrawParent +_02098B5C: + mov r0, r4 + bl sDrawChild + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + arm_func_end spl_draw + + arm_func_start sDrawChild +sDrawChild: ; 0x02098B70 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r7, r0 + ldr r6, [r7, #0x40] + mov r4, #0 + ldr r5, [r6, #0x20] + ldr r0, [r5] + ldr r0, [r0] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + addeq sp, sp, #4 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + ldr r0, [r5, #0x14] + ldr r2, [r7, #0x2c] + ldrb r1, [r0, #0xf] + mov r0, #0x14 + mla r0, r1, r0, r2 + bl spl_set_tex + ldr r0, [r5, #0x14] + ldrh r0, [r0] + mov r0, r0, lsl #0x17 + mov r0, r0, lsr #0x1e + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _02098C10 +_02098BD8: ; jump table + b _02098BEC ; case 0 + b _02098BF4 ; case 1 + b _02098BFC ; case 2 + b _02098C04 ; case 3 + b _02098C0C ; case 4 +_02098BEC: + ldr r4, _02098C48 ; =spl_draw_chld_bb + b _02098C10 +_02098BF4: + ldr r4, _02098C4C ; =spl_draw_chld_dbb + b _02098C10 +_02098BFC: + ldr r4, _02098C50 ; =spl_draw_chld_pol + b _02098C10 +_02098C04: + ldr r4, _02098C54 ; =spl_draw_chld_dpl + b _02098C10 +_02098C0C: + ldr r4, _02098C54 ; =spl_draw_chld_dpl +_02098C10: + ldr r5, [r6, #0x14] + cmp r5, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr +_02098C24: + mov r0, r7 + mov r1, r5 + blx r4 + ldr r5, [r5] + cmp r5, #0 + bne _02098C24 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_02098C48: .word spl_draw_chld_bb +_02098C4C: .word spl_draw_chld_dbb +_02098C50: .word spl_draw_chld_pol +_02098C54: .word spl_draw_chld_dpl + arm_func_end sDrawChild + + arm_func_start sDrawParent +sDrawParent: ; 0x02098C58 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + ldr r6, [r7, #0x40] + ldr r2, [r7, #0x2c] + ldr r1, [r6, #0x20] + mov r0, #0x14 + ldr r5, [r1] + mov r4, #0 + ldrb r1, [r5, #0x47] + mla r0, r1, r0, r2 + bl spl_set_tex + ldr r0, [r5] + mov r0, r0, lsl #0x1a + mov r0, r0, lsr #0x1e + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _02098CD4 +_02098C9C: ; jump table + b _02098CB0 ; case 0 + b _02098CB8 ; case 1 + b _02098CC0 ; case 2 + b _02098CC8 ; case 3 + b _02098CD0 ; case 4 +_02098CB0: + ldr r4, _02098D2C ; =spl_draw_bb + b _02098CD4 +_02098CB8: + ldr r4, _02098D30 ; =spl_draw_dbb + b _02098CD4 +_02098CC0: + ldr r4, _02098D34 ; =spl_draw_pol + b _02098CD4 +_02098CC8: + ldr r4, _02098D38 ; =spl_draw_dpl + b _02098CD4 +_02098CD0: + ldr r4, _02098D38 ; =spl_draw_dpl +_02098CD4: + ldr r0, [r5] + ldr r8, [r6, #8] + mov r0, r0, lsl #0x14 + movs r0, r0, lsr #0x1f + ldrne r5, _02098D3C ; =spl_set_tex + ldreq r5, _02098D40 ; =spl_set_tex_dummy + cmp r8, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + bxeq lr + mov r6, #0x14 +_02098CFC: + ldrb r1, [r8, #0x2c] + ldr r0, [r7, #0x2c] + mla r0, r1, r6, r0 + blx r5 + mov r0, r7 + mov r1, r8 + blx r4 + ldr r8, [r8] + cmp r8, #0 + bne _02098CFC + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_02098D2C: .word spl_draw_bb +_02098D30: .word spl_draw_dbb +_02098D34: .word spl_draw_pol +_02098D38: .word spl_draw_dpl +_02098D3C: .word spl_set_tex +_02098D40: .word spl_set_tex_dummy + arm_func_end sDrawParent + + arm_func_start spl_calc +spl_calc: ; 0x02098D44 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x74 + mov sb, r1 + ldr r8, [sb, #0x20] + mov sl, r0 + ldr r0, [r8, #0x14] + ldr r4, [r8] + str r0, [sp, #4] + ldr r0, [r4] + mov r6, #0 + str r0, [sp, #0x24] + ldrb r0, [r4, #0x46] + ldr r2, [sb, #0x90] + ldrh r7, [r8, #0x1c] + add r0, r0, #0x180 + cmp r2, #0 + str r0, [sp, #8] + beq _02098D98 + mov r0, sb + mov r1, r6 + blx r2 +_02098D98: + ldrh r1, [r4, #0x3c] + cmp r1, #0 + beq _02098DB0 + ldrh r0, [sb, #0x4c] + cmp r0, r1 + bhs _02098DF8 +_02098DB0: + ldrh r0, [sb, #0x4c] + ldrb r1, [sb, #0x80] + bl _s32_div_f + cmp r1, #0 + bne _02098DF8 + ldr r1, [sb, #0x24] + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + bne _02098DF8 + mov r0, r1, lsl #0x1e + movs r0, r0, lsr #0x1f + bne _02098DF8 + mov r0, r1, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _02098DF8 + mov r0, sb + add r1, sl, #0x1c + bl spl_gen_ptcl +_02098DF8: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x17 + movs r0, r0, lsr #0x1f + beq _02098E28 + ldr r0, _02099574 ; =spl_scl_in_out + add r6, r6, #1 + str r0, [sp, #0x28] + ldr r0, [r8, #4] + ldrh r0, [r0, #8] + mov r0, r0, lsl #0x1f + mov r0, r0, lsr #0x1f + str r0, [sp, #0x2c] +_02098E28: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x16 + movs r0, r0, lsr #0x1f + beq _02098E74 + ldr r3, [r8, #8] + ldrh r0, [r3, #8] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + bne _02098E74 + ldr r2, _02099578 ; =spl_clr_in_out + add r1, sp, #0x28 + str r2, [r1, r6, lsl #3] + ldrh r1, [r3, #8] + mov r2, r6, lsl #3 + add r0, sp, #0x2c + mov r1, r1, lsl #0x1e + mov r1, r1, lsr #0x1f + add r6, r6, #1 + str r1, [r0, r2] +_02098E74: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x15 + movs r0, r0, lsr #0x1f + beq _02098EB0 + ldr r2, _0209957C ; =spl_alp_in_out + add r1, sp, #0x28 + str r2, [r1, r6, lsl #3] + ldr r1, [r8, #0xc] + mov r2, r6, lsl #3 + ldrh r1, [r1, #2] + add r0, sp, #0x2c + add r6, r6, #1 + mov r1, r1, lsl #0x17 + mov r1, r1, lsr #0x1f + str r1, [r0, r2] +_02098EB0: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0x14 + movs r0, r0, lsr #0x1f + beq _02098EF8 + ldr r3, [r8, #0x10] + ldr r0, [r3, #8] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + bne _02098EF8 + ldr r2, _02099580 ; =spl_tex_ptn_anm + add r1, sp, #0x28 + str r2, [r1, r6, lsl #3] + ldr r1, [r3, #8] + add r0, sp, #0x2c + mov r1, r1, lsl #0xe + mov r1, r1, lsr #0x1f + str r1, [r0, r6, lsl #3] + add r6, r6, #1 +_02098EF8: + ldr r4, [sb, #8] + cmp r4, #0 + beq _02099234 + ldr r0, [sp, #0x24] + add fp, sp, #0x28 + mov r2, r0, lsl #0x10 + mov r1, r0, lsl #0xf + mov r0, r2, lsr #0x1f + str r0, [sp, #0xc] + mov r0, r1, lsr #0x1f + str r0, [sp, #0x10] + mov r0, #0 + str r0, [sp, #0x18] +_02098F2C: + ldr r0, [r4] + ldrh r1, [r4, #0x2a] + str r0, [sp] + ldrh r0, [r4, #0x26] + cmp r6, #0 + ldr r5, [sp, #0x18] + mul r2, r1, r0 + mov r1, r2, asr #8 + strb r1, [sp, #0x20] + ldrh r1, [r4, #0x28] + ldrb r2, [r4, #0x2d] + mul r0, r1, r0 + add r0, r2, r0, asr #8 + strb r0, [sp, #0x21] + ble _02098F94 +_02098F68: + add r2, fp, r5, lsl #3 + ldr ip, [r2, #4] + add r2, sp, #0x20 + ldrb r2, [r2, ip] + ldr r3, [fp, r5, lsl #3] + mov r0, r4 + mov r1, r8 + blx r3 + add r5, r5, #1 + cmp r5, r6 + blt _02098F68 +_02098F94: + ldr r0, [sp, #0x18] + ldr r5, [sp, #0x18] + str r0, [sp, #0x70] + str r0, [sp, #0x6c] + str r0, [sp, #0x68] + ldr r0, [sp, #0xc] + cmp r0, #0 + addne r0, sb, #0x28 + addne r3, r4, #0x38 + ldmneia r0, {r0, r1, r2} + stmneia r3, {r0, r1, r2} + cmp r7, #0 + ble _02098FF4 +_02098FC8: + ldr r2, [r8, #0x18] + mov r1, r4 + add r0, r2, r5, lsl #3 + ldr ip, [r2, r5, lsl #3] + ldr r0, [r0, #4] + add r2, sp, #0x68 + mov r3, sb + blx ip + add r5, r5, #1 + cmp r5, r7 + blt _02098FC8 +_02098FF4: + ldr r0, [sp, #0x10] + ldrh r1, [r4, #0x20] + cmp r0, #0 + ldrsh r0, [r4, #0x22] + add r0, r1, r0 + strh r0, [r4, #0x20] + ldr r1, [r4, #0x14] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r4, #0x14] + ldr r1, [r4, #0x18] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r4, #0x18] + ldr r1, [r4, #0x1c] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r4, #0x1c] + ldr r1, [r4, #0x14] + ldr r0, [sp, #0x68] + add r0, r1, r0 + str r0, [r4, #0x14] + ldr r1, [r4, #0x18] + ldr r0, [sp, #0x6c] + add r0, r1, r0 + str r0, [r4, #0x18] + ldr r1, [r4, #0x1c] + ldr r0, [sp, #0x70] + add r0, r1, r0 + str r0, [r4, #0x1c] + ldr r1, [r4, #0x14] + ldr r0, [sb, #0x34] + ldr r2, [r4, #8] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r4, #8] + ldr r1, [r4, #0x18] + ldr r0, [sb, #0x38] + ldr r2, [r4, #0xc] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r4, #0xc] + ldr r1, [r4, #0x1c] + ldr r0, [sb, #0x3c] + ldr r2, [r4, #0x10] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r4, #0x10] + beq _0209912C + ldr r0, [sp, #4] + ldrh r2, [r4, #0x24] + ldrb r1, [r0, #0xd] + ldrh r3, [r4, #0x26] + mov r2, r2, lsl #0xc + mov r1, r1, lsl #0xc + mov r0, r3, lsl #0xc + smull r5, r3, r2, r1 + mov r1, #0x800 + adds r2, r5, r1 + adc r1, r3, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + mov r1, r2, asr #8 + subs r0, r0, r1 + bmi _0209912C + ldr r1, [sp, #4] + mov r0, r0, asr #0xc + ldrb r1, [r1, #0xe] + bl _s32_div_f + cmp r1, #0 + bne _0209912C + mov r0, r4 + mov r1, sb + add r2, sl, #0x1c + bl spl_gen_child +_0209912C: + ldr r0, [sb, #0x20] + ldr r0, [r0] + ldr r0, [r0] + mov r0, r0, lsl #1 + movs r0, r0, lsr #0x1f + beq _02099170 + ldrh r0, [r4, #0x2e] + ldr r1, [sl, #0x38] + bic r0, r0, #0xfc00 + mov r1, r1, lsl #8 + mov r1, r1, lsr #0x1a + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + and r1, r1, #0x3f + orr r0, r0, r1, lsl #10 + strh r0, [r4, #0x2e] + b _020991F0 +_02099170: + ldrh r0, [r4, #0x2e] + ldr r2, [sl, #0x38] + add r1, sl, #0x38 + bic r0, r0, #0xfc00 + mov r2, r2, lsl #0xe + mov r2, r2, lsr #0x1a + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + and r2, r2, #0x3f + orr r0, r0, r2, lsl #10 + strh r0, [r4, #0x2e] + ldr r2, [sl, #0x38] + bic r0, r2, #0x3f000 + mov r2, r2, lsl #0xe + mov r2, r2, lsr #0x1a + add r2, r2, #1 + and r2, r2, #0x3f + orr r0, r0, r2, lsl #12 + str r0, [sl, #0x38] + ldr r2, [sl, #0x38] + mov r0, r2, lsl #0xe + mov r3, r0, lsr #0x1a + mov r0, r2, lsl #0x14 + cmp r3, r0, lsr #26 + bls _020991F0 + mov r0, r2, lsl #0x1a + mov r0, r0, lsr #0x1a + and r0, r0, #0x3f + ldr r2, [r1] + bic r2, r2, #0x3f000 + orr r0, r2, r0, lsl #12 + str r0, [r1] +_020991F0: + ldrh r0, [r4, #0x26] + add r0, r0, #1 + strh r0, [r4, #0x26] + ldrh r1, [r4, #0x26] + ldrh r0, [r4, #0x24] + cmp r1, r0 + bls _02099224 + mov r1, r4 + add r0, sb, #8 + bl spl_del + mov r1, r0 + add r0, sl, #0x1c + bl spl_push_front +_02099224: + ldr r0, [sp] + cmp r0, #0 + mov r4, r0 + bne _02098F2C +_02099234: + ldr r0, [sp, #0x24] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + beq _0209953C + ldr r0, [sp, #4] + mov r6, #0 + ldrh r0, [r0] + mov r0, r0, lsl #0x1e + movs r0, r0, lsr #0x1f + ldrne r0, _02099584 ; =spl_chld_scl_out + strne r6, [sp, #0x4c] + strne r0, [sp, #0x48] + ldr r0, [sp, #4] + addne r6, r6, #1 + ldrh r0, [r0] + mov r0, r0, lsl #0x1d + movs r0, r0, lsr #0x1f + beq _02099298 + ldr r2, _02099588 ; =spl_chld_alp_out + add r1, sp, #0x48 + str r2, [r1, r6, lsl #3] + add r0, sp, #0x4c + mov r1, #0 + str r1, [r0, r6, lsl #3] + add r6, r6, #1 +_02099298: + ldr r0, [sp, #4] + ldr r5, [sb, #0x14] + ldrh r0, [r0] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + moveq r7, #0 + cmp r5, #0 + beq _0209953C + mov r0, #0 + str r0, [sp, #0x1c] +_020992C0: + ldrh r2, [r5, #0x26] + ldr r0, [r5] + ldrh r1, [r5, #0x24] + str r0, [sp, #0x14] + mov r0, r2, lsl #8 + bl _s32_div_f + ldr r4, [sp, #0x1c] + strb r0, [sp, #0x20] + cmp r6, #0 + ble _02099310 + ldrb fp, [sp, #0x20] +_020992EC: + add r3, sp, #0x48 + ldr r3, [r3, r4, lsl #3] + mov r0, r5 + mov r1, r8 + mov r2, fp + blx r3 + add r4, r4, #1 + cmp r4, r6 + blt _020992EC +_02099310: + ldr r0, [sp, #0x1c] + ldr r4, [sp, #0x1c] + str r0, [sp, #0x70] + str r0, [sp, #0x6c] + str r0, [sp, #0x68] + ldr r0, [sp, #4] + ldrh r0, [r0] + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + addne r0, sb, #0x28 + addne r3, r5, #0x38 + ldmneia r0, {r0, r1, r2} + stmneia r3, {r0, r1, r2} + cmp r7, #0 + ble _02099378 +_0209934C: + ldr r2, [r8, #0x18] + mov r1, r5 + add r0, r2, r4, lsl #3 + ldr fp, [r2, r4, lsl #3] + ldr r0, [r0, #4] + add r2, sp, #0x68 + mov r3, sb + blx fp + add r4, r4, #1 + cmp r4, r7 + blt _0209934C +_02099378: + ldrh r1, [r5, #0x20] + ldrsh r0, [r5, #0x22] + add r0, r1, r0 + strh r0, [r5, #0x20] + ldr r1, [r5, #0x14] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r5, #0x14] + ldr r1, [r5, #0x18] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r5, #0x18] + ldr r1, [r5, #0x1c] + ldr r0, [sp, #8] + mul r0, r1, r0 + mov r0, r0, asr #9 + str r0, [r5, #0x1c] + ldr r1, [r5, #0x14] + ldr r0, [sp, #0x68] + add r0, r1, r0 + str r0, [r5, #0x14] + ldr r1, [r5, #0x18] + ldr r0, [sp, #0x6c] + add r0, r1, r0 + str r0, [r5, #0x18] + ldr r1, [r5, #0x1c] + ldr r0, [sp, #0x70] + add r0, r1, r0 + str r0, [r5, #0x1c] + ldr r1, [r5, #0x14] + ldr r0, [sb, #0x34] + ldr r2, [r5, #8] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r5, #8] + ldr r1, [r5, #0x18] + ldr r0, [sb, #0x38] + ldr r2, [r5, #0xc] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r5, #0xc] + ldr r1, [r5, #0x1c] + ldr r0, [sb, #0x3c] + ldr r2, [r5, #0x10] + add r0, r1, r0 + add r0, r2, r0 + str r0, [r5, #0x10] + ldr r0, [sb, #0x20] + ldr r0, [r0] + ldr r0, [r0] + movs r0, r0, lsr #0x1f + beq _0209947C + ldr r0, [sl, #0x38] + ldrh r1, [r5, #0x2e] + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x1a + bic r1, r1, #0xfc00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + and r0, r0, #0x3f + orr r0, r1, r0, lsl #10 + strh r0, [r5, #0x2e] + b _020994FC +_0209947C: + ldr r0, [sl, #0x38] + ldrh r1, [r5, #0x2e] + mov r0, r0, lsl #0xe + mov r0, r0, lsr #0x1a + bic r1, r1, #0xfc00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + and r0, r0, #0x3f + orr r0, r1, r0, lsl #10 + strh r0, [r5, #0x2e] + ldr r1, [sl, #0x38] + add r0, sl, #0x38 + bic r2, r1, #0x3f000 + mov r1, r1, lsl #0xe + mov r1, r1, lsr #0x1a + add r1, r1, #1 + and r1, r1, #0x3f + orr r1, r2, r1, lsl #12 + str r1, [sl, #0x38] + ldr r2, [sl, #0x38] + mov r1, r2, lsl #0xe + mov r3, r1, lsr #0x1a + mov r1, r2, lsl #0x14 + cmp r3, r1, lsr #26 + bls _020994FC + mov r1, r2, lsl #0x1a + mov r1, r1, lsr #0x1a + and r1, r1, #0x3f + ldr r2, [r0] + bic r2, r2, #0x3f000 + orr r1, r2, r1, lsl #12 + str r1, [r0] +_020994FC: + ldrh r0, [r5, #0x26] + add r0, r0, #1 + strh r0, [r5, #0x26] + ldrh r1, [r5, #0x26] + ldrh r0, [r5, #0x24] + cmp r1, r0 + bls _02099530 + mov r1, r5 + add r0, sb, #0x14 + bl spl_del + mov r1, r0 + add r0, sl, #0x1c + bl spl_push_front +_02099530: + ldr r5, [sp, #0x14] + movs r0, r5 + bne _020992C0 +_0209953C: + ldrh r0, [sb, #0x4c] + add r0, r0, #1 + strh r0, [sb, #0x4c] + ldr r2, [sb, #0x90] + cmp r2, #0 + addeq sp, sp, #0x74 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + mov r0, sb + mov r1, #1 + blx r2 + add sp, sp, #0x74 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_02099574: .word spl_scl_in_out +_02099578: .word spl_clr_in_out +_0209957C: .word spl_alp_in_out +_02099580: .word spl_tex_ptn_anm +_02099584: .word spl_chld_scl_out +_02099588: .word spl_chld_alp_out + arm_func_end spl_calc + + arm_func_start spl_init +spl_init: ; 0x0209958C + stmdb sp!, {r4, r5, r6, lr} + str r1, [r0, #0x20] + mov r3, #0 + str r3, [r0, #0x24] + ldr r1, [r0, #0x20] + ldr r5, [r2] + ldr r1, [r1] + ldr r4, _02099850 ; =0x00007FFF + ldr r1, [r1, #4] + ldr ip, _02099854 ; =0x0007FFFF + add r1, r5, r1 + str r1, [r0, #0x28] + ldr r1, [r0, #0x20] + ldr r6, [r2, #4] + ldr r1, [r1] + mov lr, #0x80000000 + ldr r5, [r1, #8] + mov r1, #0x1000 + add r5, r6, r5 + str r5, [r0, #0x2c] + ldr r5, [r0, #0x20] + ldr r6, [r2, #8] + ldr r2, [r5] + ldr r2, [r2, #0xc] + add r2, r6, r2 + str r2, [r0, #0x30] + str r3, [r0, #0x40] + str r3, [r0, #0x44] + str r3, [r0, #0x48] + str r3, [r0, #0x3c] + ldr r2, [r0, #0x3c] + str r2, [r0, #0x38] + ldr r2, [r0, #0x38] + str r2, [r0, #0x34] + strh r3, [r0, #0x4c] + strh r3, [r0, #0x4e] + ldr r2, [r0, #0x20] + ldr r5, [r2] + ldrh r3, [r5, #0x1c] + ldrh r2, [r5, #0x1e] + strh r3, [r0, #0x50] + strh r2, [r0, #0x52] + ldrh r2, [r5, #0x20] + strh r2, [r0, #0x54] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldrh r2, [r2, #0x38] + strh r2, [r0, #0x56] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x10] + str r2, [r0, #0x58] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x14] + str r2, [r0, #0x5c] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x18] + str r2, [r0, #0x60] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x24] + str r2, [r0, #0x64] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x28] + str r2, [r0, #0x68] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x2c] + str r2, [r0, #0x6c] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldrh r2, [r2, #0x3e] + strh r2, [r0, #0x70] + strh r4, [r0, #0x72] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldrb r2, [r2, #0x44] + strb r2, [r0, #0x80] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldrb r2, [r2, #0x45] + strb r2, [r0, #0x81] + ldr r2, [r0, #0x80] + bic r2, r2, #0x70000 + str r2, [r0, #0x80] + ldr r2, [r0, #0x80] + and r2, r2, ip + str r2, [r0, #0x80] + str lr, [r0, #0x74] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x48] + mov r2, r2, lsl #6 + mov r2, r2, lsr #0x1e + mov r2, r1, lsl r2 + strh r2, [r0, #0x78] + ldr r2, [r0, #0x20] + ldr r2, [r2] + ldr r2, [r2, #0x48] + mov r2, r2, lsl #4 + mov r2, r2, lsr #0x1e + mov r1, r1, lsl r2 + strh r1, [r0, #0x7a] + ldr r1, [r0, #0x20] + ldr r1, [r1] + ldr r1, [r1, #0x4c] + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + ldrnesh r2, [r0, #0x78] + mvnne r1, #0 + smulbbne r1, r2, r1 + strneh r1, [r0, #0x78] + ldr r1, [r0, #0x20] + ldr r1, [r1] + ldr r1, [r1, #0x4c] + mov r1, r1, lsl #0x1e + movs r1, r1, lsr #0x1f + ldrnesh r2, [r0, #0x7a] + mvnne r1, #0 + smulbbne r1, r2, r1 + strneh r1, [r0, #0x7a] + ldr r2, [r0, #0x20] + ldr r1, [r2] + ldr r1, [r1] + mov r1, r1, lsl #0xf + movs r1, r1, lsr #0x1f + beq _02099814 + ldr r1, [r2, #0x14] + mov r2, #0x1000 + ldr r1, [r1, #0x10] + mov r1, r1, lsl #0x1e + mov r1, r1, lsr #0x1e + mov r1, r2, lsl r1 + strh r1, [r0, #0x7c] + ldr r1, [r0, #0x20] + ldr r1, [r1, #0x14] + ldr r1, [r1, #0x10] + mov r1, r1, lsl #0x1c + mov r1, r1, lsr #0x1e + mov r1, r2, lsl r1 + strh r1, [r0, #0x7e] + ldr r1, [r0, #0x20] + ldr r1, [r1, #0x14] + ldr r1, [r1, #0x10] + mov r1, r1, lsl #0x1b + movs r1, r1, lsr #0x1f + ldrnesh r2, [r0, #0x7c] + mvnne r1, #0 + smulbbne r1, r2, r1 + strneh r1, [r0, #0x7c] + ldr r1, [r0, #0x20] + ldr r1, [r1, #0x14] + ldr r1, [r1, #0x10] + mov r1, r1, lsl #0x1a + movs r1, r1, lsr #0x1f + ldrnesh r2, [r0, #0x7e] + mvnne r1, #0 + smulbbne r1, r2, r1 + strneh r1, [r0, #0x7e] +_02099814: + mov r2, #0 + str r2, [r0, #4] + ldr r1, [r0, #4] + str r1, [r0] + str r2, [r0, #0x14] + ldr r1, [r0, #0x14] + str r1, [r0, #8] + str r2, [r0, #0x18] + ldr r1, [r0, #0x18] + str r1, [r0, #0xc] + str r2, [r0, #0x90] + str r2, [r0, #0x94] + str r2, [r0, #0x98] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_02099850: .word 0x00007FFF +_02099854: .word 0x0007FFFF + arm_func_end spl_init + + arm_func_start spl_set_tex_dummy +spl_set_tex_dummy: ; 0x02099858 + bx lr + arm_func_end spl_set_tex_dummy + + arm_func_start spl_set_tex +spl_set_tex: ; 0x0209985C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + ldr r7, [r0, #0xc] + ldr r3, _02099934 ; =0x040004A8 + str r7, [sp] + ldr r1, [r0, #4] + mov r2, r7, lsl #0x1c + mov lr, r2, lsr #0x1c + mov r1, r1, lsr #3 + orr ip, r1, lr, lsl #26 + mov r4, r7, lsl #0x18 + mov r5, r7, lsl #0x14 + mov r2, r7, lsl #0xf + mov r4, r4, lsr #0x1c + orr ip, ip, #0x40000000 + mov r6, r7, lsl #0x12 + orr ip, ip, r4, lsl #20 + mov r5, r5, lsr #0x1c + mov r1, r7, lsl #0x10 + orr ip, ip, r5, lsl #23 + mov r4, r6, lsr #0x1e + mov r5, r1, lsr #0x1e + orr r1, ip, r4, lsl #16 + mov r2, r2, lsr #0x1f + orr r1, r1, r5, lsl #18 + orr r1, r1, r2, lsl #29 + str r1, [r3] + cmp lr, #2 + moveq r1, #1 + movne r1, #0 + ldr r2, [r0, #8] + rsb r1, r1, #4 + mov r2, r2, lsr r1 + ldr r1, _02099938 ; =0x040004AC + ldr ip, _0209993C ; =0x04000440 + str r2, [r1] + mov r2, #3 + ldr r1, _02099940 ; =0x04000454 + str r2, [ip] + mov r3, #0 + str r3, [r1] + ldrh r1, [r0, #0x10] + ldrh r2, [r0, #0x12] + ldr r0, _02099944 ; =0x0400046C + mov r1, r1, lsl #0xc + str r1, [r0] + mov r1, r2, lsl #0xc + str r1, [r0] + str r3, [r0] + mov r0, #1 + str r0, [ip] + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_02099934: .word 0x040004A8 +_02099938: .word 0x040004AC +_0209993C: .word 0x04000440 +_02099940: .word 0x04000454 +_02099944: .word 0x0400046C + arm_func_end spl_set_tex + + arm_func_start spl_draw_chld_dpl +spl_draw_chld_dpl: ; 0x02099948 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xf0 + mov r4, r1 + ldrh r2, [r4, #0x2e] + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r1, r2, lsl #0x16 + mov r3, r2, lsl #0x1b + mov r1, r1, lsr #0x1b + mov r3, r3, lsr #0x1b + add r1, r1, #1 + mul r6, r3, r1 + mov r1, r2, lsl #0x10 + movs r2, r6, asr #5 + mov r1, r1, lsr #0x1a + orr r0, r0, #0xc0 + orr r1, r0, r1, lsl #24 + ldr r0, _02099DA4 ; =0x040004A4 + orr r1, r1, r2, lsl #16 + str r1, [r0] + addeq sp, sp, #0xf0 + ldr r0, [r0] + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + bxeq lr + ldr r0, [r5, #0x40] + ldrh r1, [r4, #0x20] + ldr r0, [r0, #0x20] + ldr r6, _02099DA8 ; =FX_SinCosTable_ + ldr r0, [r0, #0x14] + mov r1, r1, asr #4 + ldrh r0, [r0] + mov r2, r1, lsl #1 + add r1, r2, #1 + mov r7, r2, lsl #1 + mov r1, r1, lsl #1 + mov r0, r0, lsl #0x15 + mov r3, r0, lsr #0x1e + ldr r2, _02099DAC ; =_021105E4 + ldrsh r0, [r6, r7] + ldr r3, [r2, r3, lsl #2] + ldrsh r1, [r6, r1] + add r2, sp, #0x30 + blx r3 + add r0, sp, #0xc0 + bl MTX_Identity43_ + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r0, [r0, #0x14] + ldr r0, [r0, #0x10] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + bne _02099A28 + add r1, sp, #0x90 + add r0, r4, #0x14 + bl VEC_Normalize + b _02099A58 +_02099A28: + add r1, sp, #0x90 + add r0, r4, #8 + bl VEC_Normalize + ldr r2, [sp, #0x90] + ldr r1, [sp, #0x94] + ldr r0, [sp, #0x98] + rsb r2, r2, #0 + rsb r1, r1, #0 + rsb r0, r0, #0 + str r2, [sp, #0x90] + str r1, [sp, #0x94] + str r0, [sp, #0x98] +_02099A58: + mov r3, #0 + mov r2, #0x1000 + add r0, sp, #0x90 + add r1, sp, #0xb4 + str r3, [sp, #0xb4] + str r2, [sp, #0xb8] + str r3, [sp, #0xbc] + bl VEC_DotProduct + ldr r1, _02099DB0 ; =0x00000CCD + cmp r0, r1 + bgt _02099A90 + ldr r1, _02099DB4 ; =0xFFFFF333 + cmp r0, r1 + bge _02099AA4 +_02099A90: + mov r0, #0 + mov r1, #0x1000 + str r1, [sp, #0xb4] + str r0, [sp, #0xb8] + str r0, [sp, #0xbc] +_02099AA4: + add r0, sp, #0x90 + add r1, sp, #0xb4 + add r2, sp, #0x9c + bl VEC_CrossProduct + add r0, sp, #0x90 + add r1, sp, #0x9c + add r2, sp, #0xa8 + bl VEC_CrossProduct + ldr r7, [sp, #0x9c] + ldr r6, [sp, #0xa0] + ldr r3, [sp, #0xa4] + ldr r0, [sp, #0x90] + ldr r1, [sp, #0x94] + ldr r2, [sp, #0x98] + str r7, [sp, #0xc0] + ldr r7, [sp, #0xa8] + str r6, [sp, #0xc4] + ldr r6, [sp, #0xac] + str r3, [sp, #0xc8] + ldr r3, [sp, #0xb0] + str r0, [sp, #0xcc] + str r1, [sp, #0xd0] + add r0, sp, #0x30 + str r2, [sp, #0xd4] + add r1, sp, #0xc0 + mov r2, r0 + str r7, [sp, #0xd8] + str r6, [sp, #0xdc] + str r3, [sp, #0xe0] + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r2, [r4, #0x30] + ldr r0, [r0, #0x20] + mov ip, #0x800 + ldr r0, [r0] + mov r3, r2, asr #0x1f + ldrsh r1, [r0, #0x30] + ldr r0, [r0, #0x48] + mov lr, #0 + smull r6, r1, r2, r1 + adds r7, r6, ip + adc r6, r1, #0 + mov r0, r0, lsl #1 + mov r1, r7, lsr #0xc + orr r1, r1, r6, lsl #20 + movs r0, r0, lsr #0x1d + beq _02099B74 + cmp r0, #1 + beq _02099BB0 + cmp r0, #2 + beq _02099BCC + b _02099BF0 +_02099B74: + ldrsh r0, [r4, #0x34] + mov r8, r0, asr #0x1f + umull r7, r6, r2, r0 + mla r6, r2, r8, r6 + smull r8, r2, r1, r0 + adds r1, r8, ip + adc r8, r2, lr + adds r2, r7, ip + mla r6, r3, r0, r6 + mov r1, r1, lsr #0xc + adc r0, r6, lr + mov r2, r2, lsr #0xc + orr r1, r1, r8, lsl #20 + orr r2, r2, r0, lsl #20 + b _02099BF0 +_02099BB0: + ldrsh r0, [r4, #0x34] + smull r3, r0, r1, r0 + adds r1, r3, ip + adc r0, r0, lr + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + b _02099BF0 +_02099BCC: + ldrsh r6, [r4, #0x34] + mov r0, r6, asr #0x1f + umull r8, r7, r2, r6 + mla r7, r2, r0, r7 + adds r2, r8, ip + mla r7, r3, r6, r7 + adc r0, r7, lr + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 +_02099BF0: + add r0, sp, #0x60 + mov r3, r2 + bl MTX_Scale43_ + add r0, sp, #0x30 + add r1, sp, #0x60 + add r2, sp, #0 + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r3, [r0] + ldr r0, [r3] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _02099C6C + ldr r1, [r4, #8] + ldr r0, [r4, #0x38] + add r0, r1, r0 + str r0, [sp, #0x24] + ldr r1, [r4, #0xc] + ldr r0, [r4, #0x3c] + add r0, r1, r0 + str r0, [sp, #0x28] + ldr r1, [r4, #0x10] + ldr r0, [r4, #0x40] + add r0, r1, r0 + str r0, [sp, #0x2c] + ldr r0, [r5, #0x44] + bl G3_LoadMtx43 + add r0, sp, #0 + bl G3_MultMtx43 + b _02099D10 +_02099C6C: + ldr r2, [r4, #8] + ldr r1, [r4, #0x38] + ldr r0, [r3, #4] + add r1, r2, r1 + sub r0, r1, r0 + str r0, [sp, #0x24] + ldr r0, [r5, #0x40] + ldr r2, [r4, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r4, #0x3c] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #8] + ldr r0, _02099DB8 ; =0x04000454 + sub r1, r2, r1 + str r1, [sp, #0x28] + ldr r1, [r5, #0x40] + ldr r3, [r4, #0x10] + ldr r1, [r1, #0x20] + ldr r2, [r4, #0x40] + ldr r1, [r1] + add r3, r3, r2 + ldr r2, [r1, #0xc] + mov r1, #0 + sub r2, r3, r2 + str r2, [sp, #0x2c] + str r1, [r0] + ldr r1, [r5, #0x40] + ldr r0, _02099DBC ; =0x04000470 + ldr r1, [r1, #0x20] + ldr r1, [r1] + ldr r3, [r1, #0xc] + ldr r2, [r1, #8] + ldr r1, [r1, #4] + str r1, [r0] + str r2, [r0] + str r3, [r0] + ldr r0, [r5, #0x44] + bl G3_MultMtx43 + add r0, sp, #0 + bl G3_MultMtx43 +_02099D10: + ldr r0, [r5, #0x40] + ldrh r4, [r4, #0x36] + ldrh ip, [r0, #0x72] + mov r2, #0 + and r1, r4, #0x1f + and r0, ip, #0x1f + mul r3, r1, r0 + and r1, r4, #0x3e0 + and r0, ip, #0x3e0 + mul r0, r1, r0 + and r4, r4, #0x7c00 + and r1, ip, #0x7c00 + mul ip, r4, r1 + mov r1, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, ip, asr #0x19 + orr r0, r1, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + ldr r1, _02099DC0 ; =0x04000480 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r5, [r5, #0x40] + ldr r4, _02099DC4 ; =_021105DC + ldr r1, [r5, #0x20] + ldrsh r0, [r5, #0x7c] + ldr r3, [r1, #0x14] + ldrsh r1, [r5, #0x7e] + ldrh r5, [r3] + mov r3, r2 + mov r5, r5, lsl #0x14 + mov r5, r5, lsr #0x1f + ldr r4, [r4, r5, lsl #2] + blx r4 + add sp, sp, #0xf0 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_02099DA4: .word 0x040004A4 +_02099DA8: .word FX_SinCosTable_ +_02099DAC: .word _021105E4 +_02099DB0: .word 0x00000CCD +_02099DB4: .word 0xFFFFF333 +_02099DB8: .word 0x04000454 +_02099DBC: .word 0x04000470 +_02099DC0: .word 0x04000480 +_02099DC4: .word _021105DC + arm_func_end spl_draw_chld_dpl + + arm_func_start spl_draw_dpl +spl_draw_dpl: ; 0x02099DC8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xf0 + mov r4, r1 + ldrh r2, [r4, #0x2e] + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r1, r2, lsl #0x16 + mov r3, r2, lsl #0x1b + mov r1, r1, lsr #0x1b + mov r3, r3, lsr #0x1b + add r1, r1, #1 + mul r6, r3, r1 + mov r1, r2, lsl #0x10 + movs r2, r6, asr #5 + mov r1, r1, lsr #0x1a + orr r0, r0, #0xc0 + orr r1, r0, r1, lsl #24 + ldr r0, _0209A220 ; =0x040004A4 + orr r1, r1, r2, lsl #16 + str r1, [r0] + addeq sp, sp, #0xf0 + ldr r0, [r0] + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + bxeq lr + ldr r0, [r5, #0x40] + ldrh r1, [r4, #0x20] + ldr r0, [r0, #0x20] + ldr r6, _0209A224 ; =FX_SinCosTable_ + ldr r0, [r0] + mov r1, r1, asr #4 + mov r2, r1, lsl #1 + ldr r0, [r0] + add r1, r2, #1 + mov r7, r2, lsl #1 + mov r1, r1, lsl #1 + mov r0, r0, lsl #0xd + mov r3, r0, lsr #0x1e + ldr r2, _0209A228 ; =_021105E4 + ldrsh r0, [r6, r7] + ldr r3, [r2, r3, lsl #2] + ldrsh r1, [r6, r1] + add r2, sp, #0x30 + blx r3 + add r0, sp, #0xc0 + bl MTX_Identity43_ + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r0, [r0] + ldr r0, [r0, #0x48] + movs r0, r0, lsr #0x1f + bne _02099EA4 + add r1, sp, #0x90 + add r0, r4, #0x14 + bl VEC_Normalize + b _02099ED4 +_02099EA4: + add r1, sp, #0x90 + add r0, r4, #8 + bl VEC_Normalize + ldr r2, [sp, #0x90] + ldr r1, [sp, #0x94] + ldr r0, [sp, #0x98] + rsb r2, r2, #0 + rsb r1, r1, #0 + rsb r0, r0, #0 + str r2, [sp, #0x90] + str r1, [sp, #0x94] + str r0, [sp, #0x98] +_02099ED4: + mov r3, #0 + mov r2, #0x1000 + add r0, sp, #0x90 + add r1, sp, #0xb4 + str r3, [sp, #0xb4] + str r2, [sp, #0xb8] + str r3, [sp, #0xbc] + bl VEC_DotProduct + ldr r1, _0209A22C ; =0x00000CCD + cmp r0, r1 + bgt _02099F0C + ldr r1, _0209A230 ; =0xFFFFF333 + cmp r0, r1 + bge _02099F20 +_02099F0C: + mov r0, #0 + mov r1, #0x1000 + str r1, [sp, #0xb4] + str r0, [sp, #0xb8] + str r0, [sp, #0xbc] +_02099F20: + add r0, sp, #0x90 + add r1, sp, #0xb4 + add r2, sp, #0x9c + bl VEC_CrossProduct + add r0, sp, #0x90 + add r1, sp, #0x9c + add r2, sp, #0xa8 + bl VEC_CrossProduct + ldr r7, [sp, #0x9c] + ldr r6, [sp, #0xa0] + ldr r3, [sp, #0xa4] + ldr r0, [sp, #0x90] + ldr r1, [sp, #0x94] + ldr r2, [sp, #0x98] + str r7, [sp, #0xc0] + ldr r7, [sp, #0xa8] + str r6, [sp, #0xc4] + ldr r6, [sp, #0xac] + str r3, [sp, #0xc8] + ldr r3, [sp, #0xb0] + str r0, [sp, #0xcc] + str r1, [sp, #0xd0] + add r0, sp, #0x30 + str r2, [sp, #0xd4] + add r1, sp, #0xc0 + mov r2, r0 + str r7, [sp, #0xd8] + str r6, [sp, #0xdc] + str r3, [sp, #0xe0] + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r2, [r4, #0x30] + ldr r0, [r0, #0x20] + mov ip, #0x800 + ldr r0, [r0] + mov r3, r2, asr #0x1f + ldrsh r1, [r0, #0x30] + ldr r0, [r0, #0x48] + mov lr, #0 + smull r6, r1, r2, r1 + adds r7, r6, ip + adc r6, r1, #0 + mov r0, r0, lsl #1 + mov r1, r7, lsr #0xc + orr r1, r1, r6, lsl #20 + movs r0, r0, lsr #0x1d + beq _02099FF0 + cmp r0, #1 + beq _0209A02C + cmp r0, #2 + beq _0209A048 + b _0209A06C +_02099FF0: + ldrsh r0, [r4, #0x34] + mov r8, r0, asr #0x1f + umull r7, r6, r2, r0 + mla r6, r2, r8, r6 + smull r8, r2, r1, r0 + adds r1, r8, ip + adc r8, r2, lr + adds r2, r7, ip + mla r6, r3, r0, r6 + mov r1, r1, lsr #0xc + adc r0, r6, lr + mov r2, r2, lsr #0xc + orr r1, r1, r8, lsl #20 + orr r2, r2, r0, lsl #20 + b _0209A06C +_0209A02C: + ldrsh r0, [r4, #0x34] + smull r3, r0, r1, r0 + adds r1, r3, ip + adc r0, r0, lr + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + b _0209A06C +_0209A048: + ldrsh r6, [r4, #0x34] + mov r0, r6, asr #0x1f + umull r8, r7, r2, r6 + mla r7, r2, r0, r7 + adds r2, r8, ip + mla r7, r3, r6, r7 + adc r0, r7, lr + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 +_0209A06C: + add r0, sp, #0x60 + mov r3, r2 + bl MTX_Scale43_ + add r0, sp, #0x60 + add r1, sp, #0x30 + add r2, sp, #0 + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r3, [r0] + ldr r0, [r3] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209A0E8 + ldr r1, [r4, #8] + ldr r0, [r4, #0x38] + add r0, r1, r0 + str r0, [sp, #0x24] + ldr r1, [r4, #0xc] + ldr r0, [r4, #0x3c] + add r0, r1, r0 + str r0, [sp, #0x28] + ldr r1, [r4, #0x10] + ldr r0, [r4, #0x40] + add r0, r1, r0 + str r0, [sp, #0x2c] + ldr r0, [r5, #0x44] + bl G3_LoadMtx43 + add r0, sp, #0 + bl G3_MultMtx43 + b _0209A18C +_0209A0E8: + ldr r2, [r4, #8] + ldr r1, [r4, #0x38] + ldr r0, [r3, #4] + add r1, r2, r1 + sub r0, r1, r0 + str r0, [sp, #0x24] + ldr r0, [r5, #0x40] + ldr r2, [r4, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r4, #0x3c] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #8] + ldr r0, _0209A234 ; =0x04000454 + sub r1, r2, r1 + str r1, [sp, #0x28] + ldr r1, [r5, #0x40] + ldr r3, [r4, #0x10] + ldr r1, [r1, #0x20] + ldr r2, [r4, #0x40] + ldr r1, [r1] + add r3, r3, r2 + ldr r2, [r1, #0xc] + mov r1, #0 + sub r2, r3, r2 + str r2, [sp, #0x2c] + str r1, [r0] + ldr r1, [r5, #0x40] + ldr r0, _0209A238 ; =0x04000470 + ldr r1, [r1, #0x20] + ldr r1, [r1] + ldr r3, [r1, #0xc] + ldr r2, [r1, #8] + ldr r1, [r1, #4] + str r1, [r0] + str r2, [r0] + str r3, [r0] + ldr r0, [r5, #0x44] + bl G3_MultMtx43 + add r0, sp, #0 + bl G3_MultMtx43 +_0209A18C: + ldr r0, [r5, #0x40] + ldrh r4, [r4, #0x36] + ldrh ip, [r0, #0x72] + ldr r1, _0209A23C ; =0x04000480 + and r2, r4, #0x1f + and r0, ip, #0x1f + mul r3, r2, r0 + and r2, r4, #0x3e0 + and r0, ip, #0x3e0 + mul r0, r2, r0 + and r4, r4, #0x7c00 + and r2, ip, #0x7c00 + mul ip, r4, r2 + mov r2, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, ip, asr #0x19 + orr r0, r2, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r2, [r5, #0x40] + ldr r4, _0209A240 ; =_021105DC + ldr r1, [r2, #0x20] + ldrsh r0, [r2, #0x78] + ldr ip, [r1] + ldrsh r1, [r2, #0x7a] + ldr r3, [ip] + ldrsh r2, [ip, #0x50] + mov r3, r3, lsl #0xc + mov r5, r3, lsr #0x1f + ldrsh r3, [ip, #0x52] + ldr r4, [r4, r5, lsl #2] + blx r4 + add sp, sp, #0xf0 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0209A220: .word 0x040004A4 +_0209A224: .word FX_SinCosTable_ +_0209A228: .word _021105E4 +_0209A22C: .word 0x00000CCD +_0209A230: .word 0xFFFFF333 +_0209A234: .word 0x04000454 +_0209A238: .word 0x04000470 +_0209A23C: .word 0x04000480 +_0209A240: .word _021105DC + arm_func_end spl_draw_dpl + + arm_func_start spl_draw_chld_pol +spl_draw_chld_pol: ; 0x0209A244 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x90 + mov r4, r1 + ldrh r2, [r4, #0x2e] + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r1, r2, lsl #0x16 + mov r3, r2, lsl #0x1b + mov r1, r1, lsr #0x1b + mov r3, r3, lsr #0x1b + add r1, r1, #1 + mul r6, r3, r1 + mov r1, r2, lsl #0x10 + movs r2, r6, asr #5 + mov r1, r1, lsr #0x1a + orr r0, r0, #0xc0 + orr r1, r0, r1, lsl #24 + ldr r0, _0209A578 ; =0x040004A4 + orr r1, r1, r2, lsl #16 + str r1, [r0] + addeq sp, sp, #0x90 + ldr r0, [r0] + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + bxeq lr + ldr r0, [r5, #0x40] + ldrh r1, [r4, #0x20] + ldr r0, [r0, #0x20] + ldr r6, _0209A57C ; =FX_SinCosTable_ + ldr r0, [r0, #0x14] + mov r1, r1, asr #4 + ldrh r0, [r0] + mov r2, r1, lsl #1 + add r1, r2, #1 + mov r7, r2, lsl #1 + mov r1, r1, lsl #1 + mov r0, r0, lsl #0x15 + mov r3, r0, lsr #0x1e + ldr r2, _0209A580 ; =_021105E4 + ldrsh r0, [r6, r7] + ldr r3, [r2, r3, lsl #2] + ldrsh r1, [r6, r1] + add r2, sp, #0x30 + blx r3 + ldr r0, [r5, #0x40] + ldr r2, [r4, #0x30] + ldr r0, [r0, #0x20] + mov ip, #0x800 + ldr r0, [r0] + mov r3, r2, asr #0x1f + ldrsh r1, [r0, #0x30] + ldr r0, [r0, #0x48] + mov lr, #0 + smull r6, r1, r2, r1 + adds r7, r6, ip + adc r6, r1, #0 + mov r1, r7, lsr #0xc + mov r0, r0, lsl #1 + orr r1, r1, r6, lsl #20 + movs r0, r0, lsr #0x1d + beq _0209A348 + cmp r0, #1 + beq _0209A384 + cmp r0, #2 + beq _0209A3A0 + b _0209A3C4 +_0209A348: + ldrsh r0, [r4, #0x34] + mov r8, r0, asr #0x1f + umull r7, r6, r2, r0 + mla r6, r2, r8, r6 + smull r8, r2, r1, r0 + adds r1, r8, ip + adc r8, r2, lr + adds r2, r7, ip + mla r6, r3, r0, r6 + mov r1, r1, lsr #0xc + adc r0, r6, lr + mov r2, r2, lsr #0xc + orr r1, r1, r8, lsl #20 + orr r2, r2, r0, lsl #20 + b _0209A3C4 +_0209A384: + ldrsh r0, [r4, #0x34] + smull r3, r0, r1, r0 + adds r1, r3, ip + adc r0, r0, lr + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + b _0209A3C4 +_0209A3A0: + ldrsh r6, [r4, #0x34] + mov r0, r6, asr #0x1f + umull r8, r7, r2, r6 + mla r7, r2, r0, r7 + adds r2, r8, ip + mla r7, r3, r6, r7 + adc r0, r7, lr + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 +_0209A3C4: + add r0, sp, #0x60 + mov r3, r2 + bl MTX_Scale43_ + add r0, sp, #0x30 + add r1, sp, #0x60 + add r2, sp, #0 + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r3, [r0] + ldr r0, [r3] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209A440 + ldr r1, [r4, #8] + ldr r0, [r4, #0x38] + add r0, r1, r0 + str r0, [sp, #0x24] + ldr r1, [r4, #0xc] + ldr r0, [r4, #0x3c] + add r0, r1, r0 + str r0, [sp, #0x28] + ldr r1, [r4, #0x10] + ldr r0, [r4, #0x40] + add r0, r1, r0 + str r0, [sp, #0x2c] + ldr r0, [r5, #0x44] + bl G3_LoadMtx43 + add r0, sp, #0 + bl G3_MultMtx43 + b _0209A4E4 +_0209A440: + ldr r2, [r4, #8] + ldr r1, [r4, #0x38] + ldr r0, [r3, #4] + add r1, r2, r1 + sub r0, r1, r0 + str r0, [sp, #0x24] + ldr r0, [r5, #0x40] + ldr r2, [r4, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r4, #0x3c] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #8] + ldr r0, _0209A584 ; =0x04000454 + sub r1, r2, r1 + str r1, [sp, #0x28] + ldr r1, [r5, #0x40] + ldr r3, [r4, #0x10] + ldr r1, [r1, #0x20] + ldr r2, [r4, #0x40] + ldr r1, [r1] + add r3, r3, r2 + ldr r2, [r1, #0xc] + mov r1, #0 + sub r2, r3, r2 + str r2, [sp, #0x2c] + str r1, [r0] + ldr r1, [r5, #0x40] + ldr r0, _0209A588 ; =0x04000470 + ldr r1, [r1, #0x20] + ldr r1, [r1] + ldr r3, [r1, #0xc] + ldr r2, [r1, #8] + ldr r1, [r1, #4] + str r1, [r0] + str r2, [r0] + str r3, [r0] + ldr r0, [r5, #0x44] + bl G3_MultMtx43 + add r0, sp, #0 + bl G3_MultMtx43 +_0209A4E4: + ldr r0, [r5, #0x40] + ldrh r4, [r4, #0x36] + ldrh ip, [r0, #0x72] + mov r2, #0 + and r1, r4, #0x1f + and r0, ip, #0x1f + mul r3, r1, r0 + and r1, r4, #0x3e0 + and r0, ip, #0x3e0 + mul r0, r1, r0 + and r4, r4, #0x7c00 + and r1, ip, #0x7c00 + mul ip, r4, r1 + mov r1, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, ip, asr #0x19 + orr r0, r1, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + ldr r1, _0209A58C ; =0x04000480 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r5, [r5, #0x40] + ldr r4, _0209A590 ; =_021105DC + ldr r1, [r5, #0x20] + ldrsh r0, [r5, #0x7c] + ldr r3, [r1, #0x14] + ldrsh r1, [r5, #0x7e] + ldrh r5, [r3] + mov r3, r2 + mov r5, r5, lsl #0x14 + mov r5, r5, lsr #0x1f + ldr r4, [r4, r5, lsl #2] + blx r4 + add sp, sp, #0x90 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0209A578: .word 0x040004A4 +_0209A57C: .word FX_SinCosTable_ +_0209A580: .word _021105E4 +_0209A584: .word 0x04000454 +_0209A588: .word 0x04000470 +_0209A58C: .word 0x04000480 +_0209A590: .word _021105DC + arm_func_end spl_draw_chld_pol + + arm_func_start spl_draw_pol +spl_draw_pol: ; 0x0209A594 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x90 + mov r4, r1 + ldrh r2, [r4, #0x2e] + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r1, r2, lsl #0x16 + mov r3, r2, lsl #0x1b + mov r1, r1, lsr #0x1b + mov r3, r3, lsr #0x1b + add r1, r1, #1 + mul r6, r3, r1 + mov r1, r2, lsl #0x10 + movs r2, r6, asr #5 + mov r1, r1, lsr #0x1a + orr r0, r0, #0xc0 + orr r1, r0, r1, lsl #24 + ldr r0, _0209A8C8 ; =0x040004A4 + orr r1, r1, r2, lsl #16 + str r1, [r0] + addeq sp, sp, #0x90 + ldr r0, [r0] + ldmeqia sp!, {r4, r5, r6, r7, r8, lr} + bxeq lr + ldr r0, [r5, #0x40] + ldrh r1, [r4, #0x20] + ldr r0, [r0, #0x20] + ldr r6, _0209A8CC ; =FX_SinCosTable_ + ldr r0, [r0] + mov r1, r1, asr #4 + mov r2, r1, lsl #1 + ldr r0, [r0] + add r1, r2, #1 + mov r7, r2, lsl #1 + mov r1, r1, lsl #1 + mov r0, r0, lsl #0xd + mov r3, r0, lsr #0x1e + ldr r2, _0209A8D0 ; =_021105E4 + ldrsh r0, [r6, r7] + ldr r3, [r2, r3, lsl #2] + ldrsh r1, [r6, r1] + add r2, sp, #0x30 + blx r3 + ldr r0, [r5, #0x40] + ldr r2, [r4, #0x30] + ldr r0, [r0, #0x20] + mov ip, #0x800 + ldr r0, [r0] + mov r3, r2, asr #0x1f + ldrsh r1, [r0, #0x30] + ldr r0, [r0, #0x48] + mov lr, #0 + smull r6, r1, r2, r1 + adds r7, r6, ip + adc r6, r1, #0 + mov r1, r7, lsr #0xc + mov r0, r0, lsl #1 + orr r1, r1, r6, lsl #20 + movs r0, r0, lsr #0x1d + beq _0209A698 + cmp r0, #1 + beq _0209A6D4 + cmp r0, #2 + beq _0209A6F0 + b _0209A714 +_0209A698: + ldrsh r0, [r4, #0x34] + mov r8, r0, asr #0x1f + umull r7, r6, r2, r0 + mla r6, r2, r8, r6 + smull r8, r2, r1, r0 + adds r1, r8, ip + adc r8, r2, lr + adds r2, r7, ip + mla r6, r3, r0, r6 + mov r1, r1, lsr #0xc + adc r0, r6, lr + mov r2, r2, lsr #0xc + orr r1, r1, r8, lsl #20 + orr r2, r2, r0, lsl #20 + b _0209A714 +_0209A6D4: + ldrsh r0, [r4, #0x34] + smull r3, r0, r1, r0 + adds r1, r3, ip + adc r0, r0, lr + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + b _0209A714 +_0209A6F0: + ldrsh r6, [r4, #0x34] + mov r0, r6, asr #0x1f + umull r8, r7, r2, r6 + mla r7, r2, r0, r7 + adds r2, r8, ip + mla r7, r3, r6, r7 + adc r0, r7, lr + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 +_0209A714: + add r0, sp, #0x60 + mov r3, r2 + bl MTX_Scale43_ + add r0, sp, #0x60 + add r1, sp, #0x30 + add r2, sp, #0 + bl MTX_Concat43 + ldr r0, [r5, #0x40] + ldr r0, [r0, #0x20] + ldr r3, [r0] + ldr r0, [r3] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209A790 + ldr r1, [r4, #8] + ldr r0, [r4, #0x38] + add r0, r1, r0 + str r0, [sp, #0x24] + ldr r1, [r4, #0xc] + ldr r0, [r4, #0x3c] + add r0, r1, r0 + str r0, [sp, #0x28] + ldr r1, [r4, #0x10] + ldr r0, [r4, #0x40] + add r0, r1, r0 + str r0, [sp, #0x2c] + ldr r0, [r5, #0x44] + bl G3_LoadMtx43 + add r0, sp, #0 + bl G3_MultMtx43 + b _0209A834 +_0209A790: + ldr r2, [r4, #8] + ldr r1, [r4, #0x38] + ldr r0, [r3, #4] + add r1, r2, r1 + sub r0, r1, r0 + str r0, [sp, #0x24] + ldr r0, [r5, #0x40] + ldr r2, [r4, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r4, #0x3c] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #8] + ldr r0, _0209A8D4 ; =0x04000454 + sub r1, r2, r1 + str r1, [sp, #0x28] + ldr r1, [r5, #0x40] + ldr r3, [r4, #0x10] + ldr r1, [r1, #0x20] + ldr r2, [r4, #0x40] + ldr r1, [r1] + add r3, r3, r2 + ldr r2, [r1, #0xc] + mov r1, #0 + sub r2, r3, r2 + str r2, [sp, #0x2c] + str r1, [r0] + ldr r1, [r5, #0x40] + ldr r0, _0209A8D8 ; =0x04000470 + ldr r1, [r1, #0x20] + ldr r1, [r1] + ldr r3, [r1, #0xc] + ldr r2, [r1, #8] + ldr r1, [r1, #4] + str r1, [r0] + str r2, [r0] + str r3, [r0] + ldr r0, [r5, #0x44] + bl G3_MultMtx43 + add r0, sp, #0 + bl G3_MultMtx43 +_0209A834: + ldr r0, [r5, #0x40] + ldrh r4, [r4, #0x36] + ldrh ip, [r0, #0x72] + ldr r1, _0209A8DC ; =0x04000480 + and r2, r4, #0x1f + and r0, ip, #0x1f + mul r3, r2, r0 + and r2, r4, #0x3e0 + and r0, ip, #0x3e0 + mul r0, r2, r0 + and r4, r4, #0x7c00 + and r2, ip, #0x7c00 + mul ip, r4, r2 + mov r2, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, ip, asr #0x19 + orr r0, r2, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r2, [r5, #0x40] + ldr r4, _0209A8E0 ; =_021105DC + ldr r1, [r2, #0x20] + ldrsh r0, [r2, #0x78] + ldr ip, [r1] + ldrsh r1, [r2, #0x7a] + ldr r3, [ip] + ldrsh r2, [ip, #0x50] + mov r3, r3, lsl #0xc + mov r5, r3, lsr #0x1f + ldrsh r3, [ip, #0x52] + ldr r4, [r4, r5, lsl #2] + blx r4 + add sp, sp, #0x90 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0209A8C8: .word 0x040004A4 +_0209A8CC: .word FX_SinCosTable_ +_0209A8D0: .word _021105E4 +_0209A8D4: .word 0x04000454 +_0209A8D8: .word 0x04000470 +_0209A8DC: .word 0x04000480 +_0209A8E0: .word _021105DC + arm_func_end spl_draw_pol + + arm_func_start spl_draw_chld_dbb +spl_draw_chld_dbb: ; 0x0209A8E4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x88 + mov r6, r1 + ldrh r1, [r6, #0x2e] + mov r7, r0 + ldr r4, [r7, #0x40] + mov r0, r1, lsl #0x16 + mov r2, r1, lsl #0x1b + mov r0, r0, lsr #0x1b + mov r2, r2, lsr #0x1b + add r0, r0, #1 + mul r3, r2, r0 + ldr r2, [r4, #0x20] + movs r3, r3, asr #5 + ldr r0, [r7, #0x3c] + ldr r4, [r2] + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x1a + orr r1, r0, #0xc0 + orr r2, r1, r2, lsl #24 + ldrsh r0, [r4, #0x30] + ldr r8, [r7, #0x44] + ldr r1, _0209AFB4 ; =0x040004A4 + orr r2, r2, r3, lsl #16 + str r2, [r1] + addeq sp, sp, #0x88 + ldr r1, [r1] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr + ldr r4, [r6, #0x30] + ldr r1, [r7, #0x40] + smull r2, r5, r4, r0 + ldr r0, [r1, #0x20] + mov r3, #0x800 + adds r1, r2, r3 + ldr r2, [r0] + adc sb, r5, #0 + ldr r0, [r2, #0x48] + mov r5, r1, lsr #0xc + mov r0, r0, lsl #1 + mov r1, r4, asr #0x1f + orr r5, r5, sb, lsl #20 + movs r0, r0, lsr #0x1d + mov sb, #0 + beq _0209A9AC + cmp r0, #1 + beq _0209A9E8 + cmp r0, #2 + beq _0209AA04 + b _0209AA28 +_0209A9AC: + ldrsh r0, [r6, #0x34] + mov lr, r0, asr #0x1f + umull ip, sl, r4, r0 + mla sl, r4, lr, sl + smull lr, r4, r5, r0 + mla sl, r1, r0, sl + adds r0, lr, r3 + adc lr, r4, sb + adds r1, ip, r3 + mov r5, r0, lsr #0xc + adc r0, sl, sb + mov r4, r1, lsr #0xc + orr r5, r5, lr, lsl #20 + orr r4, r4, r0, lsl #20 + b _0209AA28 +_0209A9E8: + ldrsh r0, [r6, #0x34] + smull r1, r0, r5, r0 + adds r1, r1, r3 + adc r0, r0, sb + mov r5, r1, lsr #0xc + orr r5, r5, r0, lsl #20 + b _0209AA28 +_0209AA04: + ldrsh sl, [r6, #0x34] + mov r0, sl, asr #0x1f + umull lr, ip, r4, sl + mla ip, r4, r0, ip + adds r3, lr, r3 + mla ip, r1, sl, ip + adc r0, ip, sb + mov r4, r3, lsr #0xc + orr r4, r4, r0, lsl #20 +_0209AA28: + ldr r0, [r2] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209AC90 + ldr r1, [r6, #8] + ldr r0, [r6, #0x38] + add sb, sp, #0x18 + add r0, r1, r0 + str r0, [sp, #0xc] + ldr r2, [r6, #0xc] + ldr r1, [r6, #0x3c] + add r0, r6, #0x14 + add r1, r2, r1 + str r1, [sp, #0x10] + ldr r2, [r6, #0x10] + ldr r1, [r6, #0x40] + add r1, r2, r1 + str r1, [sp, #0x14] + ldmia r0, {r0, r1, r2} + stmia sb, {r0, r1, r2} + ldr r0, [r8, #8] + add r1, sp, #0x24 + str r0, [sp, #0x24] + ldr r2, [r8, #0x14] + mov r0, sb + str r2, [sp, #0x28] + ldr r3, [r8, #0x20] + mov r2, sb + str r3, [sp, #0x2c] + bl VEC_CrossProduct + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _0209AACC + ldr r0, [sp, #0x1c] + cmp r0, #0 + bne _0209AACC + ldr r0, [sp, #0x20] + cmp r0, #0 + addeq sp, sp, #0x88 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr +_0209AACC: + add r0, sp, #0x18 + mov r1, r0 + bl VEC_Normalize + add r1, sp, #0x30 + mov r0, r8 + bl MI_Copy36B + add r0, sp, #0x18 + add r1, sp, #0x30 + mov r2, r0 + bl MTX_MultVec33 + add r0, sp, #0xc + mov r1, r8 + mov r2, r0 + bl MTX_MultVec43 + add r0, r6, #0x14 + add r3, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, r3 + mov r1, r3 + bl VEC_Normalize + ldr r0, [r8, #0x20] + ldr r1, [sp, #8] + rsb r0, r0, #0 + smull r3, r0, r1, r0 + mov r2, #0x800 + adds r1, r3, r2 + ldr r3, [r8, #0x14] + adc r0, r0, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + ldr r0, [r8, #8] + ldr sb, [sp] + rsb r0, r0, #0 + smull r8, r0, sb, r0 + adds sb, r8, r2 + adc r8, r0, #0 + mov r0, sb, lsr #0xc + orr r0, r0, r8, lsl #20 + ldr r8, [sp, #4] + rsb r3, r3, #0 + smull sb, r3, r8, r3 + adds r8, sb, r2 + adc r2, r3, #0 + mov r3, r8, lsr #0xc + orr r3, r3, r2, lsl #20 + add r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r7, #0x40] + rsbmi r1, r1, #0 + ldr r0, [r0, #0x20] + rsb r2, r1, #0x1000 + ldr r0, [r0] + mov sb, #0x800 + ldr r0, [r0, #0x48] + ldr ip, [sp, #0x18] + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x10 + smull r8, r0, r2, r0 + adds r2, r8, sb + adc r0, r0, #0 + mov r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + add r0, r2, #0x1000 + smull r2, r0, r4, r0 + adds r2, r2, sb + adc r0, r0, #0 + mov lr, r2, lsr #0xc + orr lr, lr, r0, lsl #20 + smull r0, r4, ip, r5 + adds r8, r0, sb + ldr r3, [sp, #0x1c] + ldr r0, [sp, #0xc] + rsb r2, r3, #0 + str r0, [sp, #0x78] + ldr r0, [sp, #0x10] + smull sl, r5, r3, r5 + str r0, [sp, #0x7c] + smull r3, r0, r2, lr + adc r4, r4, #0 + mov r8, r8, lsr #0xc + orr r8, r8, r4, lsl #20 + adds r3, r3, sb + smull lr, r2, ip, lr + str r8, [sp, #0x54] + adc r0, r0, #0 + adds r8, sl, sb + adc r4, r5, #0 + adds r5, lr, sb + mov sb, r3, lsr #0xc + orr sb, sb, r0, lsl #20 + mov r8, r8, lsr #0xc + orr r8, r8, r4, lsl #20 + ldr r3, [sp, #0x14] + adc r0, r2, #0 + mov r5, r5, lsr #0xc + orr r5, r5, r0, lsl #20 + mov r4, #0x1000 + ldr r2, _0209AFB8 ; =0x04000454 + str sb, [sp, #0x60] + str r8, [sp, #0x58] + add r0, sp, #0x54 + str r5, [sp, #0x64] + str r1, [sp, #0x6c] + str r1, [sp, #0x70] + str r1, [sp, #0x5c] + str r1, [sp, #0x68] + str r4, [sp, #0x74] + str r3, [sp, #0x80] + str r1, [r2] + bl G3_MultMtx43 + b _0209AF3C +_0209AC90: + ldr r3, [r6, #8] + ldr r1, [r6, #0x38] + ldr r0, [r2, #4] + add r1, r3, r1 + sub r0, r1, r0 + str r0, [sp, #0xc] + ldr r0, [r7, #0x40] + ldr r2, [r6, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r6, #0x3c] + ldr r0, [r0] + add r1, r2, r1 + ldr r0, [r0, #8] + add sb, sp, #0x18 + sub r0, r1, r0 + str r0, [sp, #0x10] + ldr r0, [r7, #0x40] + ldr r2, [r6, #0x10] + ldr r0, [r0, #0x20] + ldr r1, [r6, #0x40] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #0xc] + add r0, r6, #0x14 + sub r1, r2, r1 + str r1, [sp, #0x14] + ldmia r0, {r0, r1, r2} + stmia sb, {r0, r1, r2} + ldr r0, [r8, #8] + add r1, sp, #0x24 + str r0, [sp, #0x24] + ldr r2, [r8, #0x14] + mov r0, sb + str r2, [sp, #0x28] + ldr r3, [r8, #0x20] + mov r2, sb + str r3, [sp, #0x2c] + bl VEC_CrossProduct + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _0209AD54 + ldr r0, [sp, #0x1c] + cmp r0, #0 + bne _0209AD54 + ldr r0, [sp, #0x20] + cmp r0, #0 + addeq sp, sp, #0x88 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr +_0209AD54: + add r0, sp, #0x18 + mov r1, r0 + bl VEC_Normalize + add r1, sp, #0x30 + mov r0, r8 + bl MI_Copy36B + add r0, sp, #0x18 + add r1, sp, #0x30 + mov r2, r0 + bl MTX_MultVec33 + add r0, sp, #0xc + mov r1, r8 + mov r2, r0 + bl MTX_MultVec43 + add r0, r6, #0x14 + add r3, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, r3 + mov r1, r3 + bl VEC_Normalize + ldr r0, [r8, #0x20] + ldr r1, [sp, #8] + rsb r0, r0, #0 + smull r3, r0, r1, r0 + mov r2, #0x800 + adds r1, r3, r2 + ldr r3, [r8, #0x14] + adc r0, r0, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + ldr r0, [r8, #8] + ldr sb, [sp] + rsb r0, r0, #0 + smull r8, r0, sb, r0 + adds sb, r8, r2 + adc r8, r0, #0 + mov r0, sb, lsr #0xc + orr r0, r0, r8, lsl #20 + ldr r8, [sp, #4] + rsb r3, r3, #0 + smull sb, r3, r8, r3 + adds r8, sb, r2 + adc r2, r3, #0 + mov r3, r8, lsr #0xc + orr r3, r3, r2, lsl #20 + add r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r7, #0x40] + rsbmi r1, r1, #0 + ldr r0, [r0, #0x20] + rsb r2, r1, #0x1000 + ldr r0, [r0] + mov sb, #0x800 + ldr r0, [r0, #0x48] + ldr lr, [sp, #0x18] + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x10 + smull r8, r0, r2, r0 + adds r2, r8, sb + adc r0, r0, #0 + mov r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + add r0, r2, #0x1000 + smull r2, r0, r4, r0 + adds r2, r2, sb + adc r0, r0, #0 + mov r8, r2, lsr #0xc + orr r8, r8, r0, lsl #20 + smull r0, r4, lr, r5 + adds ip, r0, sb + ldr r3, [sp, #0x1c] + ldr r0, [sp, #0xc] + rsb r2, r3, #0 + str r0, [sp, #0x78] + ldr r0, [sp, #0x10] + smull sl, r5, r3, r5 + str r0, [sp, #0x7c] + smull r3, r0, r2, r8 + adc r4, r4, #0 + mov ip, ip, lsr #0xc + adds r3, r3, sb + orr ip, ip, r4, lsl #20 + adc r0, r0, #0 + adds sl, sl, sb + smull r8, r2, lr, r8 + adc r4, r5, #0 + adds r5, r8, sb + mov sb, r3, lsr #0xc + orr sb, sb, r0, lsl #20 + mov r8, sl, lsr #0xc + orr r8, r8, r4, lsl #20 + ldr r3, [sp, #0x14] + adc r0, r2, #0 + mov r2, r5, lsr #0xc + orr r2, r2, r0, lsl #20 + mov r4, #0x1000 + ldr r0, _0209AFB8 ; =0x04000454 + str ip, [sp, #0x54] + str sb, [sp, #0x60] + str r8, [sp, #0x58] + str r1, [sp, #0x6c] + str r2, [sp, #0x64] + str r1, [sp, #0x70] + str r1, [sp, #0x5c] + str r1, [sp, #0x68] + str r4, [sp, #0x74] + str r3, [sp, #0x80] + str r1, [r0] + ldr r0, [r7, #0x40] + ldr r1, _0209AFBC ; =0x04000470 + ldr r2, [r0, #0x20] + add r0, sp, #0x54 + ldr r2, [r2] + ldr r4, [r2, #0xc] + ldr r3, [r2, #8] + ldr r2, [r2, #4] + str r2, [r1] + str r3, [r1] + str r4, [r1] + bl G3_MultMtx43 +_0209AF3C: + ldr r0, [r7, #0x40] + ldrh r4, [r6, #0x36] + ldrh r5, [r0, #0x72] + mov r2, #0 + and r1, r4, #0x1f + and r0, r5, #0x1f + mul r3, r1, r0 + and r1, r4, #0x3e0 + and r0, r5, #0x3e0 + mul r0, r1, r0 + and r4, r4, #0x7c00 + and r1, r5, #0x7c00 + mul r5, r4, r1 + mov r1, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, r5, asr #0x19 + orr r0, r1, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + ldr r1, _0209AFC0 ; =0x04000480 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r1, [r7, #0x40] + mov r3, r2 + ldrsh r0, [r1, #0x7c] + ldrsh r1, [r1, #0x7e] + bl drawXYPlane + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0209AFB4: .word 0x040004A4 +_0209AFB8: .word 0x04000454 +_0209AFBC: .word 0x04000470 +_0209AFC0: .word 0x04000480 + arm_func_end spl_draw_chld_dbb + + arm_func_start spl_draw_dbb +spl_draw_dbb: ; 0x0209AFC4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x88 + mov r6, r1 + ldrh r1, [r6, #0x2e] + mov r7, r0 + ldr r4, [r7, #0x40] + mov r0, r1, lsl #0x16 + mov r2, r1, lsl #0x1b + mov r0, r0, lsr #0x1b + mov r2, r2, lsr #0x1b + add r0, r0, #1 + mul r3, r2, r0 + ldr r2, [r4, #0x20] + movs r3, r3, asr #5 + ldr r0, [r7, #0x3c] + ldr r4, [r2] + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x1a + orr r1, r0, #0xc0 + orr r2, r1, r2, lsl #24 + ldrsh r0, [r4, #0x30] + ldr r8, [r7, #0x44] + ldr r1, _0209B69C ; =0x040004A4 + orr r2, r2, r3, lsl #16 + str r2, [r1] + addeq sp, sp, #0x88 + ldr r1, [r1] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr + ldr r4, [r6, #0x30] + ldr r1, [r7, #0x40] + smull r2, r5, r4, r0 + ldr r0, [r1, #0x20] + mov r3, #0x800 + adds r1, r2, r3 + ldr r2, [r0] + adc sb, r5, #0 + ldr r0, [r2, #0x48] + mov r5, r1, lsr #0xc + mov r0, r0, lsl #1 + mov r1, r4, asr #0x1f + orr r5, r5, sb, lsl #20 + movs r0, r0, lsr #0x1d + mov sb, #0 + beq _0209B08C + cmp r0, #1 + beq _0209B0C8 + cmp r0, #2 + beq _0209B0E4 + b _0209B108 +_0209B08C: + ldrsh r0, [r6, #0x34] + mov lr, r0, asr #0x1f + umull ip, sl, r4, r0 + mla sl, r4, lr, sl + smull lr, r4, r5, r0 + mla sl, r1, r0, sl + adds r0, lr, r3 + adc lr, r4, sb + adds r1, ip, r3 + mov r5, r0, lsr #0xc + adc r0, sl, sb + mov r4, r1, lsr #0xc + orr r5, r5, lr, lsl #20 + orr r4, r4, r0, lsl #20 + b _0209B108 +_0209B0C8: + ldrsh r0, [r6, #0x34] + smull r1, r0, r5, r0 + adds r1, r1, r3 + adc r0, r0, sb + mov r5, r1, lsr #0xc + orr r5, r5, r0, lsl #20 + b _0209B108 +_0209B0E4: + ldrsh sl, [r6, #0x34] + mov r0, sl, asr #0x1f + umull lr, ip, r4, sl + mla ip, r4, r0, ip + adds r3, lr, r3 + mla ip, r1, sl, ip + adc r0, ip, sb + mov r4, r3, lsr #0xc + orr r4, r4, r0, lsl #20 +_0209B108: + ldr r0, [r2] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209B370 + ldr r1, [r6, #8] + ldr r0, [r6, #0x38] + add sb, sp, #0x18 + add r0, r1, r0 + str r0, [sp, #0xc] + ldr r2, [r6, #0xc] + ldr r1, [r6, #0x3c] + add r0, r6, #0x14 + add r1, r2, r1 + str r1, [sp, #0x10] + ldr r2, [r6, #0x10] + ldr r1, [r6, #0x40] + add r1, r2, r1 + str r1, [sp, #0x14] + ldmia r0, {r0, r1, r2} + stmia sb, {r0, r1, r2} + ldr r0, [r8, #8] + add r1, sp, #0x24 + str r0, [sp, #0x24] + ldr r2, [r8, #0x14] + mov r0, sb + str r2, [sp, #0x28] + ldr r3, [r8, #0x20] + mov r2, sb + str r3, [sp, #0x2c] + bl VEC_CrossProduct + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _0209B1AC + ldr r0, [sp, #0x1c] + cmp r0, #0 + bne _0209B1AC + ldr r0, [sp, #0x20] + cmp r0, #0 + addeq sp, sp, #0x88 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr +_0209B1AC: + add r0, sp, #0x18 + mov r1, r0 + bl VEC_Normalize + add r1, sp, #0x30 + mov r0, r8 + bl MI_Copy36B + add r0, sp, #0x18 + add r1, sp, #0x30 + mov r2, r0 + bl MTX_MultVec33 + add r0, sp, #0xc + mov r1, r8 + mov r2, r0 + bl MTX_MultVec43 + add r0, r6, #0x14 + add r3, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, r3 + mov r1, r3 + bl VEC_Normalize + ldr r0, [r8, #0x20] + ldr r1, [sp, #8] + rsb r0, r0, #0 + smull r3, r0, r1, r0 + mov r2, #0x800 + adds r1, r3, r2 + ldr r3, [r8, #0x14] + adc r0, r0, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + ldr r0, [r8, #8] + ldr sb, [sp] + rsb r0, r0, #0 + smull r8, r0, sb, r0 + adds sb, r8, r2 + adc r8, r0, #0 + mov r0, sb, lsr #0xc + orr r0, r0, r8, lsl #20 + ldr r8, [sp, #4] + rsb r3, r3, #0 + smull sb, r3, r8, r3 + adds r8, sb, r2 + adc r2, r3, #0 + mov r3, r8, lsr #0xc + orr r3, r3, r2, lsl #20 + add r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r7, #0x40] + rsbmi r1, r1, #0 + ldr r0, [r0, #0x20] + rsb r2, r1, #0x1000 + ldr r0, [r0] + mov sb, #0x800 + ldr r0, [r0, #0x48] + ldr ip, [sp, #0x18] + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x10 + smull r8, r0, r2, r0 + adds r2, r8, sb + adc r0, r0, #0 + mov r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + add r0, r2, #0x1000 + smull r2, r0, r4, r0 + adds r2, r2, sb + adc r0, r0, #0 + mov lr, r2, lsr #0xc + orr lr, lr, r0, lsl #20 + smull r0, r4, ip, r5 + adds r8, r0, sb + ldr r3, [sp, #0x1c] + ldr r0, [sp, #0xc] + rsb r2, r3, #0 + str r0, [sp, #0x78] + ldr r0, [sp, #0x10] + smull sl, r5, r3, r5 + str r0, [sp, #0x7c] + smull r3, r0, r2, lr + adc r4, r4, #0 + mov r8, r8, lsr #0xc + orr r8, r8, r4, lsl #20 + adds r3, r3, sb + smull lr, r2, ip, lr + str r8, [sp, #0x54] + adc r0, r0, #0 + adds r8, sl, sb + adc r4, r5, #0 + adds r5, lr, sb + mov sb, r3, lsr #0xc + orr sb, sb, r0, lsl #20 + mov r8, r8, lsr #0xc + orr r8, r8, r4, lsl #20 + ldr r3, [sp, #0x14] + adc r0, r2, #0 + mov r5, r5, lsr #0xc + orr r5, r5, r0, lsl #20 + mov r4, #0x1000 + ldr r2, _0209B6A0 ; =0x04000454 + str sb, [sp, #0x60] + str r8, [sp, #0x58] + add r0, sp, #0x54 + str r5, [sp, #0x64] + str r1, [sp, #0x6c] + str r1, [sp, #0x70] + str r1, [sp, #0x5c] + str r1, [sp, #0x68] + str r4, [sp, #0x74] + str r3, [sp, #0x80] + str r1, [r2] + bl G3_MultMtx43 + b _0209B61C +_0209B370: + ldr r3, [r6, #8] + ldr r1, [r6, #0x38] + ldr r0, [r2, #4] + add r1, r3, r1 + sub r0, r1, r0 + str r0, [sp, #0xc] + ldr r0, [r7, #0x40] + ldr r2, [r6, #0xc] + ldr r0, [r0, #0x20] + ldr r1, [r6, #0x3c] + ldr r0, [r0] + add r1, r2, r1 + ldr r0, [r0, #8] + add sb, sp, #0x18 + sub r0, r1, r0 + str r0, [sp, #0x10] + ldr r0, [r7, #0x40] + ldr r2, [r6, #0x10] + ldr r0, [r0, #0x20] + ldr r1, [r6, #0x40] + ldr r0, [r0] + add r2, r2, r1 + ldr r1, [r0, #0xc] + add r0, r6, #0x14 + sub r1, r2, r1 + str r1, [sp, #0x14] + ldmia r0, {r0, r1, r2} + stmia sb, {r0, r1, r2} + ldr r0, [r8, #8] + add r1, sp, #0x24 + str r0, [sp, #0x24] + ldr r2, [r8, #0x14] + mov r0, sb + str r2, [sp, #0x28] + ldr r3, [r8, #0x20] + mov r2, sb + str r3, [sp, #0x2c] + bl VEC_CrossProduct + ldr r0, [sp, #0x18] + cmp r0, #0 + bne _0209B434 + ldr r0, [sp, #0x1c] + cmp r0, #0 + bne _0209B434 + ldr r0, [sp, #0x20] + cmp r0, #0 + addeq sp, sp, #0x88 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr +_0209B434: + add r0, sp, #0x18 + mov r1, r0 + bl VEC_Normalize + add r1, sp, #0x30 + mov r0, r8 + bl MI_Copy36B + add r0, sp, #0x18 + add r1, sp, #0x30 + mov r2, r0 + bl MTX_MultVec33 + add r0, sp, #0xc + mov r1, r8 + mov r2, r0 + bl MTX_MultVec43 + add r0, r6, #0x14 + add r3, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, r3 + mov r1, r3 + bl VEC_Normalize + ldr r0, [r8, #0x20] + ldr r1, [sp, #8] + rsb r0, r0, #0 + smull r3, r0, r1, r0 + mov r2, #0x800 + adds r1, r3, r2 + ldr r3, [r8, #0x14] + adc r0, r0, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + ldr r0, [r8, #8] + ldr sb, [sp] + rsb r0, r0, #0 + smull r8, r0, sb, r0 + adds sb, r8, r2 + adc r8, r0, #0 + mov r0, sb, lsr #0xc + orr r0, r0, r8, lsl #20 + ldr r8, [sp, #4] + rsb r3, r3, #0 + smull sb, r3, r8, r3 + adds r8, sb, r2 + adc r2, r3, #0 + mov r3, r8, lsr #0xc + orr r3, r3, r2, lsl #20 + add r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r7, #0x40] + rsbmi r1, r1, #0 + ldr r0, [r0, #0x20] + rsb r2, r1, #0x1000 + ldr r0, [r0] + mov sb, #0x800 + ldr r0, [r0, #0x48] + ldr lr, [sp, #0x18] + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x10 + smull r8, r0, r2, r0 + adds r2, r8, sb + adc r0, r0, #0 + mov r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + add r0, r2, #0x1000 + smull r2, r0, r4, r0 + adds r2, r2, sb + adc r0, r0, #0 + mov r8, r2, lsr #0xc + orr r8, r8, r0, lsl #20 + smull r0, r4, lr, r5 + adds ip, r0, sb + ldr r3, [sp, #0x1c] + ldr r0, [sp, #0xc] + rsb r2, r3, #0 + str r0, [sp, #0x78] + ldr r0, [sp, #0x10] + smull sl, r5, r3, r5 + str r0, [sp, #0x7c] + smull r3, r0, r2, r8 + adc r4, r4, #0 + mov ip, ip, lsr #0xc + adds r3, r3, sb + orr ip, ip, r4, lsl #20 + adc r0, r0, #0 + adds sl, sl, sb + smull r8, r2, lr, r8 + adc r4, r5, #0 + adds r5, r8, sb + mov sb, r3, lsr #0xc + orr sb, sb, r0, lsl #20 + mov r8, sl, lsr #0xc + orr r8, r8, r4, lsl #20 + ldr r3, [sp, #0x14] + adc r0, r2, #0 + mov r2, r5, lsr #0xc + orr r2, r2, r0, lsl #20 + mov r4, #0x1000 + ldr r0, _0209B6A0 ; =0x04000454 + str ip, [sp, #0x54] + str sb, [sp, #0x60] + str r8, [sp, #0x58] + str r1, [sp, #0x6c] + str r2, [sp, #0x64] + str r1, [sp, #0x70] + str r1, [sp, #0x5c] + str r1, [sp, #0x68] + str r4, [sp, #0x74] + str r3, [sp, #0x80] + str r1, [r0] + ldr r0, [r7, #0x40] + ldr r1, _0209B6A4 ; =0x04000470 + ldr r2, [r0, #0x20] + add r0, sp, #0x54 + ldr r2, [r2] + ldr r4, [r2, #0xc] + ldr r3, [r2, #8] + ldr r2, [r2, #4] + str r2, [r1] + str r3, [r1] + str r4, [r1] + bl G3_MultMtx43 +_0209B61C: + ldr r0, [r7, #0x40] + ldrh r4, [r6, #0x36] + ldrh r5, [r0, #0x72] + ldr r1, _0209B6A8 ; =0x04000480 + and r2, r4, #0x1f + and r0, r5, #0x1f + mul r3, r2, r0 + and r2, r4, #0x3e0 + and r0, r5, #0x3e0 + mul r0, r2, r0 + and r4, r4, #0x7c00 + and r2, r5, #0x7c00 + mul r5, r4, r2 + mov r2, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, r5, asr #0x19 + orr r0, r2, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r2, [r7, #0x40] + ldr r1, [r2, #0x20] + ldrsh r0, [r2, #0x78] + ldr r3, [r1] + ldrsh r1, [r2, #0x7a] + ldrsh r2, [r3, #0x50] + ldrsh r3, [r3, #0x52] + bl drawXYPlane + add sp, sp, #0x88 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0209B69C: .word 0x040004A4 +_0209B6A0: .word 0x04000454 +_0209B6A4: .word 0x04000470 +_0209B6A8: .word 0x04000480 + arm_func_end spl_draw_dbb + + arm_func_start spl_draw_chld_bb +spl_draw_chld_bb: ; 0x0209B6AC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x40 + mov r6, r1 + ldrh r1, [r6, #0x2e] + mov r7, r0 + ldr r4, [r7, #0x40] + mov r0, r1, lsl #0x16 + mov r2, r1, lsl #0x1b + mov r0, r0, lsr #0x1b + mov r2, r2, lsr #0x1b + add r0, r0, #1 + mul r3, r2, r0 + ldr r2, [r4, #0x20] + ldr r0, [r7, #0x3c] + ldr r4, [r2] + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x1a + orr r1, r0, #0xc0 + ldrsh r0, [r4, #0x30] + movs r4, r3, asr #5 + orr r3, r1, r2, lsl #24 + ldr r1, [r7, #0x44] + ldr r2, _0209BAEC ; =0x040004A4 + orr r3, r3, r4, lsl #16 + str r3, [r2] + addeq sp, sp, #0x40 + ldr r2, [r2] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bxeq lr + ldr r4, [r6, #0x30] + ldr r2, [r7, #0x40] + smull r3, r5, r4, r0 + ldr r0, [r2, #0x20] + mov r8, #0x800 + adds r2, r3, r8 + ldr r3, [r0] + adc sb, r5, #0 + ldr r0, [r3, #0x48] + mov r5, r2, lsr #0xc + mov r0, r0, lsl #1 + mov r2, r4, asr #0x1f + orr r5, r5, sb, lsl #20 + movs r0, r0, lsr #0x1d + mov sb, #0 + beq _0209B774 + cmp r0, #1 + beq _0209B7B0 + cmp r0, #2 + beq _0209B7CC + b _0209B7F0 +_0209B774: + ldrsh r0, [r6, #0x34] + mov lr, r0, asr #0x1f + umull ip, sl, r4, r0 + mla sl, r4, lr, sl + smull lr, r4, r5, r0 + mla sl, r2, r0, sl + adds r0, lr, r8 + adc lr, r4, sb + adds r2, ip, r8 + mov r5, r0, lsr #0xc + adc r0, sl, sb + mov r4, r2, lsr #0xc + orr r5, r5, lr, lsl #20 + orr r4, r4, r0, lsl #20 + b _0209B7F0 +_0209B7B0: + ldrsh r0, [r6, #0x34] + smull r2, r0, r5, r0 + adds r2, r2, r8 + adc r0, r0, sb + mov r5, r2, lsr #0xc + orr r5, r5, r0, lsl #20 + b _0209B7F0 +_0209B7CC: + ldrsh sl, [r6, #0x34] + mov r0, sl, asr #0x1f + umull lr, ip, r4, sl + mla ip, r4, r0, ip + adds r4, lr, r8 + mla ip, r2, sl, ip + adc r0, ip, sb + mov r4, r4, lsr #0xc + orr r4, r4, r0, lsl #20 +_0209B7F0: + ldr r0, [r3] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209B910 + ldr r3, [r6, #8] + ldr r2, [r6, #0x38] + add r0, sp, #0 + add r2, r3, r2 + str r2, [sp] + ldr r8, [r6, #0xc] + ldr r3, [r6, #0x3c] + mov r2, r0 + add r3, r8, r3 + str r3, [sp, #4] + ldr r8, [r6, #0x10] + ldr r3, [r6, #0x40] + add r3, r8, r3 + str r3, [sp, #8] + bl MTX_MultVec43 + ldrh r0, [r6, #0x20] + ldr r2, _0209BAF0 ; =FX_SinCosTable_ + mov sb, #0 + mov r0, r0, asr #4 + mov r3, r0, lsl #1 + mov r0, r3, lsl #1 + ldrsh r1, [r2, r0] + add r0, r3, #1 + mov r0, r0, lsl #1 + ldrsh r0, [r2, r0] + mov lr, #0x1000 + ldr r3, [sp] + ldr r2, [sp, #4] + str r3, [sp, #0x30] + smull ip, sl, r1, r5 + str lr, [sp, #0x2c] + rsb r8, r1, #0 + ldr r1, [sp, #8] + smull lr, r5, r0, r5 + mov r3, #0x800 + str r2, [sp, #0x34] + adds r2, lr, r3 + adc r5, r5, #0 + adds ip, ip, r3 + mov lr, r2, lsr #0xc + orr lr, lr, r5, lsl #20 + smull r5, r2, r8, r4 + adc sl, sl, #0 + mov r8, ip, lsr #0xc + orr r8, r8, sl, lsl #20 + adds r5, r5, r3 + smull sl, r4, r0, r4 + adc r0, r2, #0 + adds r2, sl, r3 + mov r5, r5, lsr #0xc + orr r5, r5, r0, lsl #20 + mov r3, r2, lsr #0xc + adc r0, r4, #0 + orr r3, r3, r0, lsl #20 + ldr r2, _0209BAF4 ; =0x04000454 + str lr, [sp, #0xc] + add r0, sp, #0xc + str r8, [sp, #0x10] + str sb, [sp, #0x14] + str r5, [sp, #0x18] + str r3, [sp, #0x1c] + str sb, [sp, #0x20] + str sb, [sp, #0x24] + str sb, [sp, #0x28] + str r1, [sp, #0x38] + str sb, [r2] + bl G3_MultMtx43 + b _0209BA74 +_0209B910: + ldr r8, [r6, #8] + ldr r2, [r6, #0x38] + ldr r0, [r3, #4] + add r2, r8, r2 + sub r0, r2, r0 + str r0, [sp] + ldr r2, [r7, #0x40] + ldr r8, [r6, #0xc] + ldr r2, [r2, #0x20] + ldr r3, [r6, #0x3c] + ldr r2, [r2] + add r3, r8, r3 + ldr r2, [r2, #8] + add r0, sp, #0 + sub r2, r3, r2 + str r2, [sp, #4] + ldr r2, [r7, #0x40] + ldr r8, [r6, #0x10] + ldr r2, [r2, #0x20] + ldr r3, [r6, #0x40] + ldr r2, [r2] + add r8, r8, r3 + ldr r3, [r2, #0xc] + mov r2, r0 + sub r3, r8, r3 + str r3, [sp, #8] + bl MTX_MultVec43 + ldrh r0, [r6, #0x20] + ldr r2, _0209BAF0 ; =FX_SinCosTable_ + mov lr, #0 + mov r0, r0, asr #4 + mov r3, r0, lsl #1 + mov r0, r3, lsl #1 + ldrsh r1, [r2, r0] + add r0, r3, #1 + mov r0, r0, lsl #1 + ldrsh r0, [r2, r0] + mov sl, #0x1000 + ldr r3, [sp] + ldr r2, [sp, #4] + str r3, [sp, #0x30] + smull sb, r8, r1, r5 + str sl, [sp, #0x2c] + rsb ip, r1, #0 + smull sl, r5, r0, r5 + ldr r1, [sp, #8] + mov r3, #0x800 + str r2, [sp, #0x34] + adds r2, sl, r3 + adc r5, r5, #0 + mov sl, r2, lsr #0xc + orr sl, sl, r5, lsl #20 + str r1, [sp, #0x38] + adds sb, sb, r3 + str sl, [sp, #0xc] + adc sl, r8, #0 + smull r5, r2, ip, r4 + mov r8, sb, lsr #0xc + orr r8, r8, sl, lsl #20 + smull sb, r4, r0, r4 + adds r5, r5, r3 + adc r0, r2, #0 + adds r2, sb, r3 + mov r3, r5, lsr #0xc + orr r3, r3, r0, lsl #20 + adc r0, r4, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + ldr r0, _0209BAF4 ; =0x04000454 + str r8, [sp, #0x10] + str lr, [sp, #0x14] + str r3, [sp, #0x18] + str r2, [sp, #0x1c] + str lr, [sp, #0x20] + str lr, [sp, #0x24] + str lr, [sp, #0x28] + str lr, [r0] + ldr r0, [r7, #0x40] + ldr r1, _0209BAF8 ; =0x04000470 + ldr r2, [r0, #0x20] + add r0, sp, #0xc + ldr r2, [r2] + ldr r4, [r2, #0xc] + ldr r3, [r2, #8] + ldr r2, [r2, #4] + str r2, [r1] + str r3, [r1] + str r4, [r1] + bl G3_MultMtx43 +_0209BA74: + ldr r0, [r7, #0x40] + ldrh r4, [r6, #0x36] + ldrh r5, [r0, #0x72] + mov r2, #0 + and r1, r4, #0x1f + and r0, r5, #0x1f + mul r3, r1, r0 + and r1, r4, #0x3e0 + and r0, r5, #0x3e0 + mul r0, r1, r0 + and r4, r4, #0x7c00 + and r1, r5, #0x7c00 + mul r5, r4, r1 + mov r1, r3, asr #5 + mov r0, r0, asr #0xf + mov r3, r5, asr #0x19 + orr r0, r1, r0, lsl #5 + orr r0, r0, r3, lsl #10 + mov r0, r0, lsl #0x10 + ldr r1, _0209BAFC ; =0x04000480 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r1, [r7, #0x40] + mov r3, r2 + ldrsh r0, [r1, #0x7c] + ldrsh r1, [r1, #0x7e] + bl drawXYPlane + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0209BAEC: .word 0x040004A4 +_0209BAF0: .word FX_SinCosTable_ +_0209BAF4: .word 0x04000454 +_0209BAF8: .word 0x04000470 +_0209BAFC: .word 0x04000480 + arm_func_end spl_draw_chld_bb + + arm_func_start spl_draw_bb +spl_draw_bb: ; 0x0209BB00 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + mov r8, r1 + ldrh r3, [r8, #0x2e] + mov sb, r0 + ldr r1, [sb, #0x40] + mov r0, r3, lsl #0x16 + mov r2, r3, lsl #0x1b + mov r0, r0, lsr #0x1b + ldr r4, [r1, #0x20] + mov r2, r2, lsr #0x1b + ldr r5, [r4] + add r0, r0, #1 + mul r0, r2, r0 + movs fp, r0, asr #5 + mov r3, r3, lsl #0x10 + ldr r2, [sb, #0x3c] + mov r6, r3, lsr #0x1a + orr r3, r2, #0xc0 + ldr r4, [r5, #0x48] + ldrsh r7, [r5, #0x30] + mov r2, r4, lsl #1 + ldrh r4, [r1, #0x72] + orr r3, r3, r6, lsl #24 + ldrsh sl, [r8, #0x34] + ldrh r5, [r8, #0x36] + ldr r1, [sb, #0x44] + ldr r0, _0209BF38 ; =0x040004A4 + orr r3, r3, fp, lsl #16 + str r3, [r0] + mov r2, r2, lsr #0x1d + addeq sp, sp, #0x3c + and r3, r2, #0xff + ldr r0, [r0] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + ldr r6, [r8, #0x30] + mov r0, #0x800 + smull r7, r2, r6, r7 + adds r7, r7, r0 + adc r2, r2, #0 + mov r7, r7, lsr #0xc + cmp r3, #0 + mov lr, r6, asr #0x1f + orr r7, r7, r2, lsl #20 + mov r2, #0 + bne _0209BBF4 + mov ip, sl, asr #0x1f + umull fp, r3, r6, sl + mla r3, r6, ip, r3 + mla r3, lr, sl, r3 + smull r6, sl, r7, sl + adds r6, r6, r0 + adc sl, sl, r2 + adds fp, fp, r0 + adc r0, r3, r2 + mov r7, r6, lsr #0xc + mov r6, fp, lsr #0xc + orr r7, r7, sl, lsl #20 + orr r6, r6, r0, lsl #20 + b _0209BC34 +_0209BBF4: + cmp r3, #1 + bne _0209BC14 + smull sl, r3, r7, sl + adds r7, sl, r0 + adc r0, r3, r2 + mov r7, r7, lsr #0xc + orr r7, r7, r0, lsl #20 + b _0209BC34 +_0209BC14: + mov ip, sl, asr #0x1f + umull fp, r3, r6, sl + adds r0, fp, r0 + mla r3, r6, ip, r3 + mla r3, lr, sl, r3 + adc r2, r3, r2 + mov r6, r0, lsr #0xc + orr r6, r6, r2, lsl #20 +_0209BC34: + ldr r0, [sb, #0x40] + ldr r0, [r0, #0x20] + ldr sl, [r0] + ldr r0, [sl] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + bne _0209BD60 + ldr r3, [r8, #8] + ldr r2, [r8, #0x38] + add r0, sp, #0 + add r2, r3, r2 + str r2, [sp] + ldr sl, [r8, #0xc] + ldr r3, [r8, #0x3c] + mov r2, r0 + add r3, sl, r3 + str r3, [sp, #4] + ldr sl, [r8, #0x10] + ldr r3, [r8, #0x40] + add r3, sl, r3 + str r3, [sp, #8] + bl MTX_MultVec43 + ldrh r0, [r8, #0x20] + ldr r2, _0209BF3C ; =FX_SinCosTable_ + ldr ip, [sp] + mov r0, r0, asr #4 + mov r3, r0, lsl #1 + mov r0, r3, lsl #1 + ldrsh r1, [r2, r0] + add r0, r3, #1 + mov r0, r0, lsl #1 + ldrsh r0, [r2, r0] + str ip, [sp, #0x30] + mov ip, #0x1000 + ldr r2, [sp, #4] + smull fp, sl, r1, r7 + str ip, [sp, #0x2c] + rsb r3, r1, #0 + ldr r1, [sp, #8] + str r2, [sp, #0x34] + mov r8, #0 + smull ip, r7, r0, r7 + mov r2, #0x800 + str r1, [sp, #0x38] + adds r1, ip, r2 + adc ip, r7, #0 + adds r7, fp, r2 + mov fp, r1, lsr #0xc + orr fp, fp, ip, lsl #20 + smull ip, r1, r3, r6 + adc sl, sl, #0 + mov r7, r7, lsr #0xc + orr r7, r7, sl, lsl #20 + adds r3, ip, r2 + smull sl, r6, r0, r6 + adc r0, r1, #0 + adds r1, sl, r2 + mov r3, r3, lsr #0xc + orr r3, r3, r0, lsl #20 + mov r2, r1, lsr #0xc + adc r0, r6, #0 + orr r2, r2, r0, lsl #20 + ldr r1, _0209BF40 ; =0x04000454 + str fp, [sp, #0xc] + add r0, sp, #0xc + str r7, [sp, #0x10] + str r8, [sp, #0x14] + str r3, [sp, #0x18] + str r2, [sp, #0x1c] + str r8, [sp, #0x20] + str r8, [sp, #0x24] + str r8, [sp, #0x28] + str r8, [r1] + bl G3_MultMtx43 + b _0209BEC4 +_0209BD60: + ldr r3, [r8, #8] + ldr r2, [r8, #0x38] + ldr r0, [sl, #4] + add r2, r3, r2 + sub r0, r2, r0 + str r0, [sp] + ldr r2, [sb, #0x40] + ldr sl, [r8, #0xc] + ldr r2, [r2, #0x20] + ldr r3, [r8, #0x3c] + ldr r2, [r2] + add r3, sl, r3 + ldr r2, [r2, #8] + add r0, sp, #0 + sub r2, r3, r2 + str r2, [sp, #4] + ldr r2, [sb, #0x40] + ldr sl, [r8, #0x10] + ldr r2, [r2, #0x20] + ldr r3, [r8, #0x40] + ldr r2, [r2] + add sl, sl, r3 + ldr r3, [r2, #0xc] + mov r2, r0 + sub r3, sl, r3 + str r3, [sp, #8] + bl MTX_MultVec43 + ldrh r0, [r8, #0x20] + ldr r2, _0209BF3C ; =FX_SinCosTable_ + mov r8, #0 + mov r0, r0, asr #4 + mov r3, r0, lsl #1 + mov r0, r3, lsl #1 + ldrsh r1, [r2, r0] + add r0, r3, #1 + mov r0, r0, lsl #1 + ldrsh r0, [r2, r0] + ldr ip, [sp] + ldr r2, [sp, #4] + str ip, [sp, #0x30] + mov ip, #0x1000 + str r2, [sp, #0x34] + smull fp, sl, r1, r7 + str ip, [sp, #0x2c] + rsb r3, r1, #0 + ldr r1, [sp, #8] + smull ip, r7, r0, r7 + mov r2, #0x800 + str r1, [sp, #0x38] + adds r1, ip, r2 + adc ip, r7, #0 + adds r7, fp, r2 + mov fp, r1, lsr #0xc + orr fp, fp, ip, lsl #20 + smull ip, r1, r3, r6 + adc sl, sl, #0 + mov r7, r7, lsr #0xc + orr r7, r7, sl, lsl #20 + smull sl, r6, r0, r6 + adds r3, ip, r2 + adc r0, r1, #0 + adds r1, sl, r2 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + adc r0, r6, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x1c] + ldr r0, _0209BF40 ; =0x04000454 + str fp, [sp, #0xc] + str r7, [sp, #0x10] + str r8, [sp, #0x14] + str r2, [sp, #0x18] + str r8, [sp, #0x20] + str r8, [sp, #0x24] + str r8, [sp, #0x28] + str r8, [r0] + ldr r0, [sb, #0x40] + ldr r1, _0209BF44 ; =0x04000470 + ldr r2, [r0, #0x20] + add r0, sp, #0xc + ldr r2, [r2] + ldr r6, [r2, #0xc] + ldr r3, [r2, #8] + ldr r2, [r2, #4] + str r2, [r1] + str r3, [r1] + str r6, [r1] + bl G3_MultMtx43 +_0209BEC4: + and r1, r5, #0x1f + and r0, r4, #0x1f + mul r2, r1, r0 + and r1, r5, #0x3e0 + and r0, r4, #0x3e0 + mul r0, r1, r0 + and r3, r5, #0x7c00 + and r1, r4, #0x7c00 + mul r4, r3, r1 + mov r1, r2, asr #5 + mov r0, r0, asr #0xf + mov r2, r4, asr #0x19 + orr r0, r1, r0, lsl #5 + orr r0, r0, r2, lsl #10 + mov r0, r0, lsl #0x10 + ldr r1, _0209BF48 ; =0x04000480 + mov r0, r0, lsr #0x10 + str r0, [r1] + ldr r2, [sb, #0x40] + ldr r1, [r2, #0x20] + ldrsh r0, [r2, #0x78] + ldr r3, [r1] + ldrsh r1, [r2, #0x7a] + ldrsh r2, [r3, #0x50] + ldrsh r3, [r3, #0x52] + bl drawXYPlane + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0209BF38: .word 0x040004A4 +_0209BF3C: .word FX_SinCosTable_ +_0209BF40: .word 0x04000454 +_0209BF44: .word 0x04000470 +_0209BF48: .word 0x04000480 + arm_func_end spl_draw_bb + + arm_func_start rotTypeY +rotTypeY: ; 0x0209BF4C + str r1, [r2] + mov ip, #0 + str ip, [r2, #0xc] + str r0, [r2, #0x18] + str ip, [r2, #0x24] + str ip, [r2, #4] + mov r3, #0x1000 + str r3, [r2, #0x10] + str ip, [r2, #0x1c] + str ip, [r2, #0x28] + rsb r0, r0, #0 + str r0, [r2, #8] + str ip, [r2, #0x14] + str r1, [r2, #0x20] + str ip, [r2, #0x2c] + bx lr + arm_func_end rotTypeY + + arm_func_start rotTypeXYZ +rotTypeXYZ: ; 0x0209BF8C + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #4 + ldr r3, _0209C030 ; =0x00000555 + rsb r7, r1, #0x1000 + ldr ip, _0209C034 ; =0x0000093D + mov r4, #0 + umull sb, r8, r7, r3 + umull r6, r5, r0, ip + mov lr, #0x800 + adds sb, sb, lr + mla r8, r7, r4, r8 + mov r7, r7, asr #0x1f + mla r8, r7, r3, r8 + adc r7, r8, #0 + mov r3, sb, lsr #0xc + adds r6, r6, lr + orr r3, r3, r7, lsl #20 + add r1, r3, r1 + mla r5, r0, r4, r5 + mov r0, r0, asr #0x1f + mla r5, r0, ip, r5 + adc r0, r5, #0 + mov r5, r6, lsr #0xc + orr r5, r5, r0, lsl #20 + str r1, [r2] + add ip, r3, r5 + str ip, [r2, #0xc] + sub r0, r3, r5 + str r0, [r2, #0x18] + str r4, [r2, #0x24] + str r0, [r2, #4] + str r1, [r2, #0x10] + str ip, [r2, #0x1c] + str r4, [r2, #0x28] + str ip, [r2, #8] + str r0, [r2, #0x14] + str r1, [r2, #0x20] + str r4, [r2, #0x2c] + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_0209C030: .word 0x00000555 +_0209C034: .word 0x0000093D + arm_func_end rotTypeXYZ + + arm_func_start drawXZPlane +drawXZPlane: ; 0x0209C038 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub r7, r2, #0x1000 + add r5, r3, #0x1000 + add r4, r2, #0x1000 + mov r2, r0, lsl #8 + mov r0, r1, lsl #8 + sub r3, r3, #0x1000 + mov r0, r0, lsr #0x10 + mov r1, r2, lsr #0x10 + ldr ip, _0209C0E0 ; =0x04000500 + mov r8, #1 + ldr r6, _0209C0E4 ; =0x000003FF + mov r2, r7, lsl #0x10 + mov lr, r5, lsl #0x10 + mov r4, r4, lsl #0x10 + mov r5, r3, lsl #0x10 + ldr r3, _0209C0E8 ; =0x04000488 + str r8, [ip] + mov ip, #0 + and r2, r6, r2, asr #22 + and r7, r6, lr, asr #22 + and lr, r6, r4, asr #22 + and r4, r6, r5, asr #22 + ldr r6, _0209C0EC ; =0x04000490 + str ip, [r3] + orr r5, r2, r7, lsl #20 + str r5, [r6] + str r1, [r3] + orr r5, lr, r7, lsl #20 + str r5, [r6] + orr r1, r1, r0, lsl #16 + str r1, [r3] + orr r1, lr, r4, lsl #20 + str r1, [r6] + mov r0, r0, lsl #0x10 + str r0, [r3] + orr r1, r2, r4, lsl #20 + ldr r0, _0209C0F0 ; =0x04000504 + str r1, [r6] + str ip, [r0] + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0209C0E0: .word 0x04000500 +_0209C0E4: .word 0x000003FF +_0209C0E8: .word 0x04000488 +_0209C0EC: .word 0x04000490 +_0209C0F0: .word 0x04000504 + arm_func_end drawXZPlane + + arm_func_start drawXYPlane +drawXYPlane: ; 0x0209C0F4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + add ip, r3, #0x1000 + sub r5, r2, #0x1000 + add r4, r2, #0x1000 + mov r2, r0, lsl #8 + mov r0, r1, lsl #8 + sub r3, r3, #0x1000 + mov r0, r0, lsr #0x10 + mov r1, r2, lsr #0x10 + ldr r7, _0209C19C ; =0x04000500 + mov r8, #1 + ldr r6, _0209C1A0 ; =0x000003FF + mov r2, ip, lsl #0x10 + mov lr, r5, lsl #0x10 + mov r4, r4, lsl #0x10 + mov r5, r3, lsl #0x10 + ldr r3, _0209C1A4 ; =0x04000488 + str r8, [r7] + mov ip, #0 + and r7, r6, r2, asr #22 + and r2, r6, lr, asr #22 + and lr, r6, r4, asr #22 + and r4, r6, r5, asr #22 + ldr r6, _0209C1A8 ; =0x04000490 + str ip, [r3] + orr r5, r2, r7, lsl #10 + str r5, [r6] + str r1, [r3] + orr r5, lr, r7, lsl #10 + str r5, [r6] + orr r1, r1, r0, lsl #16 + str r1, [r3] + orr r1, lr, r4, lsl #10 + str r1, [r6] + mov r0, r0, lsl #0x10 + str r0, [r3] + orr r1, r2, r4, lsl #10 + ldr r0, _0209C1AC ; =0x04000504 + str r1, [r6] + str ip, [r0] + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0209C19C: .word 0x04000500 +_0209C1A0: .word 0x000003FF +_0209C1A4: .word 0x04000488 +_0209C1A8: .word 0x04000490 +_0209C1AC: .word 0x04000504 + arm_func_end drawXYPlane + + arm_func_start spl_gen_child +spl_gen_child: ; 0x0209C1B0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + ldr r3, [r1, #0x20] + str r1, [sp] + ldr r6, [r3, #0x14] + mov r8, r0 + ldrb r3, [r6, #8] + ldrb r0, [r6, #0xc] + str r2, [sp, #4] + mov r3, r3, lsl #0xc + mov r2, r3, asr #0x1f + mov r2, r2, lsl #4 + mov r1, #0x800 + mov r4, r3, lsl #4 + adds r4, r4, r1 + orr r2, r2, r3, lsr #28 + adc r1, r2, #0 + mov r5, r4, lsr #0xc + cmp r0, #0 + mov r0, #0 + str r0, [sp, #8] + orr r5, r5, r1, lsl #20 + addle sp, sp, #0x24 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxle lr + ldr sb, _0209C4C0 ; =spl_rndm_seed + str r0, [sp, #0x18] + str r0, [sp, #0x14] + str r0, [sp, #0x1c] + str r0, [sp, #0x20] + mov r0, #0x1000 + mov r4, r5, asr #0x1f + str r0, [sp, #0x10] +_0209C234: + ldr r0, [sp, #4] + bl spl_pop_front + movs r7, r0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + ldr r0, [sp] + mov r1, r7 + add r0, r0, #0x14 + bl spl_push_front + add r0, r7, #0x38 + add r1, r8, #8 + str r0, [sp, #0xc] + add sl, r7, #8 + ldmia r1, {r0, r1, r2} + stmia sl, {r0, r1, r2} + ldr sl, [r8, #0x14] + ldr ip, [sb] + ldr r1, _0209C4C4 ; =0x5EEDF715 + ldr r0, _0209C4C8 ; =0x1B0CB173 + mov r2, sl, asr #0x1f + mla r0, ip, r1, r0 + str r0, [sb] + umull lr, ip, sl, r5 + mla ip, sl, r4, ip + ldrsh r1, [r6, #2] + mov r0, r0, lsr #0x17 + mla ip, r2, r5, ip + mul r0, r1, r0 + mov r3, #0x800 + adds r2, lr, r3 + sub r0, r0, r1, lsl #8 + adc sl, ip, #0 + mov r2, r2, lsr #0xc + orr r2, r2, sl, lsl #20 + add r0, r2, r0, asr #8 + str r0, [r7, #0x14] + ldr sl, [r8, #0x18] + ldr ip, [sb] + ldr r1, _0209C4C4 ; =0x5EEDF715 + ldr r0, _0209C4C8 ; =0x1B0CB173 + mov r2, sl, asr #0x1f + mla r0, ip, r1, r0 + str r0, [sb] + umull lr, ip, sl, r5 + mla ip, sl, r4, ip + mla ip, r2, r5, ip + adds r2, lr, r3 + ldrsh r1, [r6, #2] + mov r0, r0, lsr #0x17 + adc sl, ip, #0 + mul r0, r1, r0 + mov r2, r2, lsr #0xc + sub r0, r0, r1, lsl #8 + orr r2, r2, sl, lsl #20 + add r0, r2, r0, asr #8 + str r0, [r7, #0x18] + ldr ip, [r8, #0x1c] + ldr sl, [sb] + ldr r1, _0209C4C4 ; =0x5EEDF715 + ldr r0, _0209C4C8 ; =0x1B0CB173 + mov r2, ip, asr #0x1f + mla r0, sl, r1, r0 + umull sl, lr, ip, r5 + str r0, [sb] + mla lr, ip, r4, lr + adds r3, sl, r3 + mla lr, r2, r5, lr + ldrsh r1, [r6, #2] + mov r0, r0, lsr #0x17 + adc r2, lr, #0 + mul r0, r1, r0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + sub r0, r0, r1, lsl #8 + add r0, r3, r0, asr #8 + ldr r3, [sp, #0xc] + add fp, r8, #0x38 + str r0, [r7, #0x1c] + ldmia fp, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldrb r0, [r6, #9] + ldrsh r1, [r8, #0x34] + ldr r2, [r8, #0x30] + add r0, r0, #1 + mul r1, r2, r1 + mov r1, r1, asr #0xc + mul r0, r1, r0 + mov r0, r0, asr #6 + str r0, [r7, #0x30] + ldr r0, [sp, #0x10] + strh r0, [r7, #0x34] + ldrh r0, [r6] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + ldrneh r0, [r6, #0xa] + strneh r0, [r7, #0x36] + ldreqh r0, [r8, #0x36] + streqh r0, [r7, #0x36] + ldrh r1, [r8, #0x2e] + ldrh r0, [r7, #0x2e] + mov r2, r1, lsl #0x1b + mov r1, r1, lsl #0x16 + mov r1, r1, lsr #0x1b + mov r2, r2, lsr #0x1b + add r1, r1, #1 + mul r1, r2, r1 + mov r1, r1, lsl #0xb + mov r1, r1, lsr #0x10 + bic r0, r0, #0x1f + and r1, r1, #0x1f + orr r0, r0, r1 + strh r0, [r7, #0x2e] + ldrh r0, [r7, #0x2e] + bic r0, r0, #0x3e0 + orr r0, r0, #0x3e0 + strh r0, [r7, #0x2e] + ldrh r0, [r6] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1e + beq _0209C438 + cmp r0, #1 + beq _0209C448 + cmp r0, #2 + ldreqh r0, [r8, #0x20] + streqh r0, [r7, #0x20] + ldreqsh r0, [r8, #0x22] + streqh r0, [r7, #0x22] + b _0209C458 +_0209C438: + ldr r0, [sp, #0x14] + strh r0, [r7, #0x20] + strh r0, [r7, #0x22] + b _0209C458 +_0209C448: + ldrh r0, [r8, #0x20] + strh r0, [r7, #0x20] + ldr r0, [sp, #0x18] + strh r0, [r7, #0x22] +_0209C458: + ldrh r1, [r6, #6] + ldr r0, _0209C4CC ; =0x0000FFFF + strh r1, [r7, #0x24] + ldr r1, [sp, #0x1c] + strh r1, [r7, #0x26] + ldrb r1, [r6, #0xf] + strb r1, [r7, #0x2c] + ldrh r1, [r8, #0x24] + mov r1, r1, lsr #1 + bl _s32_div_f + strh r0, [r7, #0x28] + ldrh r1, [r8, #0x24] + ldr r0, _0209C4CC ; =0x0000FFFF + bl _s32_div_f + strh r0, [r7, #0x2a] + ldr r0, [sp, #0x20] + strb r0, [r7, #0x2d] + ldr r0, [sp, #8] + ldrb r1, [r6, #0xc] + add r0, r0, #1 + str r0, [sp, #8] + cmp r0, r1 + blt _0209C234 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0209C4C0: .word spl_rndm_seed +_0209C4C4: .word 0x5EEDF715 +_0209C4C8: .word 0x1B0CB173 +_0209C4CC: .word 0x0000FFFF + arm_func_end spl_gen_child + + arm_func_start spl_gen_ptcl +spl_gen_ptcl: ; 0x0209C4D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc4 + mov sb, r0 + ldr r0, [sb, #0x20] + ldrsh r3, [sb, #0x4e] + str r0, [sp, #4] + ldr r0, [sb, #0x58] + ldr r2, _0209D1DC ; =0x00000FFF + add r3, r0, r3 + ldr r0, [sp, #4] + str r1, [sp] + ldr r8, [r0] + and r0, r3, r2 + strh r0, [sb, #0x4e] + ldr r0, [r8] + mov r0, r0, lsl #0x1c + mov r1, r0, lsr #0x1c + mov r0, r3, asr #0xc + cmp r1, #2 + str r0, [sp, #0xc] + beq _0209C538 + cmp r1, #3 + beq _0209C538 + sub r0, r1, #5 + cmp r0, #4 + bhi _0209C540 +_0209C538: + mov r0, sb + bl spl_set_cross_to_axis +_0209C540: + ldr r0, [sp, #0xc] + cmp r0, #0 + mov r0, #0 + str r0, [sp, #8] + addle sp, sp, #0xc4 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxle lr + str r0, [sp, #0x18] + str r0, [sp, #0x24] + str r0, [sp, #0x20] + str r0, [sp, #0x1c] + mov r0, #0x1000 + str r0, [sp, #0x34] + ldr r0, [sp, #8] + ldr r6, _0209D1E0 ; =spl_rndm_seed + ldr r4, _0209D1E4 ; =0x5EEDF715 + ldr r5, _0209D1E8 ; =0x1B0CB173 + str r0, [sp, #0x38] + str r0, [sp, #0x3c] + str r0, [sp, #0x40] +_0209C590: + ldr r0, [sp] + bl spl_pop_front + movs r7, r0 + addeq sp, sp, #0xc4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + add r0, sb, #8 + mov r1, r7 + bl spl_push_front + ldr r0, [r8] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _0209CCD0 +_0209C5CC: ; jump table + b _0209C5F4 ; case 0 + b _0209C610 ; case 1 + b _0209C680 ; case 2 + b _0209C6E8 ; case 3 + b _0209C77C ; case 4 + b _0209C87C ; case 5 + b _0209CB74 ; case 6 + b _0209CBF8 ; case 7 + b _0209C938 ; case 8 + b _0209CA08 ; case 9 +_0209C5F4: + ldr r0, [sp, #0x1c] + str r0, [r7, #0x10] + ldr r0, [r7, #0x10] + str r0, [r7, #0xc] + ldr r0, [r7, #0xc] + str r0, [r7, #8] + b _0209CCD0 +_0209C610: + add r0, r7, #8 + bl spl_rndm_get_arb_vec_xyz + ldr r2, [r7, #8] + ldr r1, [sb, #0x5c] + mov r0, #0x800 + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #8] + ldr r2, [r7, #0xc] + ldr r1, [sb, #0x5c] + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #0xc] + ldr r2, [r7, #0x10] + ldr r1, [sb, #0x5c] + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r0, r1, #0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [r7, #0x10] + b _0209CCD0 +_0209C680: + add r0, sp, #0x58 + bl spl_rndm_get_arb_vec_xy + ldr r2, [sp, #0x58] + ldr r0, [sb, #0x5c] + mov r1, #0x800 + smull r3, r0, r2, r0 + adds r2, r3, r1 + adc r0, r0, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #0x58] + ldr r3, [sp, #0x5c] + ldr r2, [sb, #0x5c] + add r0, r7, #8 + smull sl, r2, r3, r2 + adds r3, sl, r1 + adc r1, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + ldr r1, [sp, #0x20] + str r2, [sp, #0x5c] + str r1, [sp, #0x60] + add r1, sp, #0x58 + mov r2, sb + bl spl_set_circle_axis + b _0209CCD0 +_0209C6E8: + ldr r0, [sp, #0x18] + ldr r1, [sp, #0xc] + bl _s32_div_f + ldr r1, [sp, #0x18] + mov r0, r0, asr #4 + add r1, r1, #0x10000 + mov r2, r0, lsl #1 + str r1, [sp, #0x18] + ldr r0, _0209D1EC ; =FX_SinCosTable_ + mov r1, r2, lsl #1 + ldrsh r0, [r0, r1] + add r1, r2, #1 + mov r2, r1, lsl #1 + ldr r1, _0209D1EC ; =FX_SinCosTable_ + ldrsh r3, [r1, r2] + ldr r2, [sb, #0x5c] + mov r1, #0x800 + smull sl, r2, r0, r2 + adds sl, sl, r1 + adc r0, r2, #0 + mov r2, sl, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #0x64] + ldr r2, [sb, #0x5c] + add r0, r7, #8 + smull sl, r2, r3, r2 + adds r3, sl, r1 + adc r1, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + ldr r1, [sp, #0x24] + str r2, [sp, #0x68] + str r1, [sp, #0x6c] + add r1, sp, #0x64 + mov r2, sb + bl spl_set_circle_axis + b _0209CCD0 +_0209C77C: + add r0, r7, #8 + bl spl_rndm_get_arb_vec_xyz + ldr r1, [r6] + mov r0, #0x800 + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #8 + ldr r3, [r7, #8] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #8] + ldr r1, [r6] + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #8 + ldr r3, [r7, #0xc] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #0xc] + ldr r1, [r6] + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #8 + ldr r3, [r7, #0x10] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r0, r1, #0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [r7, #0x10] + b _0209CCD0 +_0209C87C: + add r0, sp, #0x70 + bl spl_rndm_get_arb_vec_xy + ldr r0, [r6] + ldr r3, [sp, #0x70] + mla r1, r0, r4, r5 + str r1, [r6] + ldr r0, [sb, #0x5c] + mov r2, #0x800 + smull sl, r0, r3, r0 + adds sl, sl, r2 + adc r3, r0, #0 + mov r0, sl, lsr #0xc + orr r0, r0, r3, lsl #20 + mov r3, r1, lsr #0x17 + mov r3, r3, lsl #0xc + sub r3, r3, #0x100000 + mov r3, r3, asr #8 + smull sl, r3, r0, r3 + adds sl, sl, r2 + adc r0, r3, #0 + mov r3, sl, lsr #0xc + orr r3, r3, r0, lsl #20 + mla r0, r1, r4, r5 + str r0, [r6] + str r3, [sp, #0x70] + mov r0, r0, lsr #0x17 + mov r0, r0, lsl #0xc + sub r0, r0, #0x100000 + mov r1, r0, asr #8 + ldr sl, [sp, #0x74] + ldr r3, [sb, #0x5c] + add r0, r7, #8 + smull fp, r3, sl, r3 + adds sl, fp, r2 + adc r3, r3, #0 + mov sl, sl, lsr #0xc + orr sl, sl, r3, lsl #20 + smull r3, r1, sl, r1 + adds r2, r3, r2 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x74] + add r1, sp, #0x70 + mov r2, sb + bl spl_set_circle_axis + b _0209CCD0 +_0209C938: + add r0, r7, #8 + bl spl_rndm_get_arb_vec_xyz + add r0, sb, #0x84 + add r1, sb, #0x8a + add r2, sp, #0x44 + bl VEC_Fx16CrossProduct + ldrsh r1, [sp, #0x46] + ldrsh r0, [sp, #0x48] + ldrsh r2, [sp, #0x44] + str r1, [sp, #0x80] + str r0, [sp, #0x84] + add r0, sp, #0x7c + add r1, r7, #8 + str r2, [sp, #0x7c] + bl VEC_DotProduct + cmp r0, #0 + bgt _0209C9A0 + ldr r0, [r7, #8] + rsb r0, r0, #0 + str r0, [r7, #8] + ldr r0, [r7, #0xc] + rsb r0, r0, #0 + str r0, [r7, #0xc] + ldr r0, [r7, #0x10] + rsb r0, r0, #0 + str r0, [r7, #0x10] +_0209C9A0: + ldr r2, [r7, #8] + ldr r1, [sb, #0x5c] + mov r0, #0x800 + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #8] + ldr r2, [r7, #0xc] + ldr r1, [sb, #0x5c] + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #0xc] + ldr r2, [r7, #0x10] + ldr r1, [sb, #0x5c] + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r0, r1, #0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [r7, #0x10] + b _0209CCD0 +_0209CA08: + add r0, r7, #8 + bl spl_rndm_get_arb_vec_xyz + add r0, sb, #0x84 + add r1, sb, #0x8a + add r2, sp, #0x4a + bl VEC_Fx16CrossProduct + ldrsh r1, [sp, #0x4c] + ldrsh r0, [sp, #0x4e] + ldrsh r2, [sp, #0x4a] + str r1, [sp, #0x8c] + str r0, [sp, #0x90] + add r0, sp, #0x88 + add r1, r7, #8 + str r2, [sp, #0x88] + bl VEC_DotProduct + cmp r0, #0 + bge _0209CA70 + ldr r0, [r7, #8] + rsb r0, r0, #0 + str r0, [r7, #8] + ldr r0, [r7, #0xc] + rsb r0, r0, #0 + str r0, [r7, #0xc] + ldr r0, [r7, #0x10] + rsb r0, r0, #0 + str r0, [r7, #0x10] +_0209CA70: + ldr r1, [r6] + mov r0, #0x800 + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #9 + add r1, r1, #0x800 + ldr r3, [r7, #8] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #8] + ldr r1, [r6] + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #9 + add r1, r1, #0x800 + ldr r3, [r7, #0xc] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [r7, #0xc] + ldr r1, [r6] + mla r2, r1, r4, r5 + str r2, [r6] + mov r1, r2, lsr #0x17 + mov r1, r1, lsl #0xc + sub r1, r1, #0x100000 + mov r1, r1, asr #9 + add r1, r1, #0x800 + ldr r3, [r7, #0x10] + ldr r2, [sb, #0x5c] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + smull r2, r1, r3, r1 + adds r2, r2, r0 + adc r0, r1, #0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [r7, #0x10] + b _0209CCD0 +_0209CB74: + add r0, r7, #0x14 + bl spl_rndm_get_arb_vec_xy + ldr r2, [r7, #0x14] + ldr r1, [sb, #0x5c] + mov r0, #0x800 + smull r3, r1, r2, r1 + adds r2, r3, r0 + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x94] + ldr r3, [r7, #0x18] + ldr r2, [sb, #0x5c] + ldr r1, [r6] + smull sl, r2, r3, r2 + adds r3, sl, r0 + adc r0, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + mla r0, r1, r4, r5 + str r0, [r6] + str r2, [sp, #0x98] + mov r1, r0, lsr #0x17 + ldr r2, [sb, #0x60] + add r0, r7, #8 + mul r1, r2, r1 + sub r1, r1, r2, lsl #8 + mov r1, r1, asr #8 + str r1, [sp, #0x9c] + add r1, sp, #0x94 + mov r2, sb + bl spl_set_circle_axis + b _0209CCD0 +_0209CBF8: + add r0, r7, #0x14 + bl spl_rndm_get_arb_vec_xy + ldr r0, [r6] + mov r3, #0x800 + mla r2, r0, r4, r5 + str r2, [r6] + ldr sl, [r7, #0x14] + ldr r0, [sb, #0x5c] + mov r1, r2, lsr #0x17 + smull fp, r0, sl, r0 + adds fp, fp, r3 + mov r1, r1, lsl #0xc + adc sl, r0, #0 + mov r0, fp, lsr #0xc + sub r1, r1, #0x100000 + orr r0, r0, sl, lsl #20 + mov r1, r1, asr #8 + smull sl, r1, r0, r1 + adds sl, sl, r3 + adc r0, r1, #0 + mov r1, sl, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0xa0] + mla r1, r2, r4, r5 + str r1, [r6] + mov r2, r1, lsr #0x17 + mov r2, r2, lsl #0xc + sub r2, r2, #0x100000 + ldr sl, [r7, #0x18] + ldr r0, [sb, #0x5c] + mov r2, r2, asr #8 + smull fp, r0, sl, r0 + adds fp, fp, r3 + adc sl, r0, #0 + mov r0, fp, lsr #0xc + orr r0, r0, sl, lsl #20 + smull sl, r2, r0, r2 + adds r3, sl, r3 + adc r0, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + mla r0, r1, r4, r5 + str r0, [r6] + str r2, [sp, #0xa4] + mov r1, r0, lsr #0x17 + ldr r2, [sb, #0x60] + add r0, r7, #8 + mul r1, r2, r1 + sub r1, r1, r2, lsl #8 + mov r1, r1, asr #8 + str r1, [sp, #0xa8] + add r1, sp, #0xa0 + mov r2, sb + bl spl_set_circle_axis +_0209CCD0: + ldr r1, [r6] + mla r0, r1, r4, r5 + str r0, [r6] + ldrb r2, [r8, #0x42] + mov r1, r0, lsr #0x18 + ldr r3, [sb, #0x64] + mul r1, r2, r1 + add r2, r2, #0xff + sub r1, r2, r1, asr #7 + mul r1, r3, r1 + mov r1, r1, asr #8 + str r1, [sp, #0x10] + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x18 + ldrb r2, [r8, #0x42] + ldr r3, [sb, #0x68] + ldr r1, [r8] + mul r0, r2, r0 + add r2, r2, #0xff + sub r0, r2, r0, asr #7 + mul r0, r3, r0 + mov r0, r0, asr #8 + str r0, [sp, #0x14] + mov r0, r1, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #6 + bne _0209CE1C + ldrsh r0, [sb, #0x84] + ldr r1, [r7, #0x14] + mov r2, #0x800 + smull r3, r0, r1, r0 + adds r1, r3, r2 + ldrsh r3, [sb, #0x8a] + ldr lr, [r7, #0x18] + mov ip, r1, lsr #0xc + smull sl, r3, lr, r3 + adc r0, r0, #0 + adds sl, sl, r2 + orr ip, ip, r0, lsl #20 + adc r3, r3, #0 + mov sl, sl, lsr #0xc + orr sl, sl, r3, lsl #20 + add r3, ip, sl + str r3, [sp, #0xb8] + ldrsh sl, [sb, #0x86] + ldr r3, [r7, #0x14] + ldrsh lr, [sb, #0x8c] + smull ip, sl, r3, sl + adds ip, ip, r2 + ldr fp, [r7, #0x18] + adc sl, sl, #0 + smull r3, lr, fp, lr + mov ip, ip, lsr #0xc + adds r3, r3, r2 + orr ip, ip, sl, lsl #20 + adc sl, lr, #0 + mov r3, r3, lsr #0xc + orr r3, r3, sl, lsl #20 + add r3, ip, r3 + str r3, [sp, #0xbc] + ldr sl, [r7, #0x18] + ldrsh fp, [sb, #0x88] + ldr r3, [r7, #0x14] + str sl, [sp, #0x28] + smull ip, fp, r3, fp + ldrsh sl, [sb, #0x8e] + ldr r3, [sp, #0x28] + adds ip, ip, r2 + smull sl, lr, r3, sl + adc r3, fp, #0 + adds r2, sl, r2 + mov sl, ip, lsr #0xc + orr sl, sl, r3, lsl #20 + adc r3, lr, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r3, lsl #20 + add r2, sl, r2 + add r0, sp, #0xb8 + add r1, sp, #0xac + str r2, [sp, #0xc0] + bl VEC_Normalize + b _0209CE58 +_0209CE1C: + ldr r0, [r7, #8] + cmp r0, #0 + bne _0209CE4C + ldr r0, [r7, #0xc] + cmp r0, #0 + bne _0209CE4C + ldr r0, [r7, #0x10] + cmp r0, #0 + bne _0209CE4C + add r0, sp, #0xac + bl spl_rndm_get_arb_vec_xyz + b _0209CE58 +_0209CE4C: + add r0, r7, #8 + add r1, sp, #0xac + bl VEC_Normalize +_0209CE58: + ldr r2, [sp, #0xac] + ldr r1, [sp, #0x10] + mov r0, #0x800 + smull sl, r1, r2, r1 + adds r2, sl, r0 + add sl, sb, #0x28 + str sl, [sp, #0x2c] + add sl, r7, #0x38 + str sl, [sp, #0x30] + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + ldrsh r1, [sb, #0x50] + ldr sl, [sp, #0x14] + ldr r3, [sb, #0x40] + smull fp, sl, r1, sl + adds fp, fp, r0 + adc r1, sl, #0 + mov sl, fp, lsr #0xc + orr sl, sl, r1, lsl #20 + add r1, r2, sl + add r1, r3, r1 + str r1, [r7, #0x14] + ldr r3, [sp, #0xb0] + ldr r1, [sp, #0x10] + ldrsh sl, [sb, #0x52] + smull fp, r1, r3, r1 + adds fp, fp, r0 + adc r3, r1, #0 + mov r1, fp, lsr #0xc + orr r1, r1, r3, lsl #20 + ldr r3, [sp, #0x14] + ldr r2, [sb, #0x44] + smull fp, r3, sl, r3 + adds sl, fp, r0 + adc r3, r3, #0 + mov sl, sl, lsr #0xc + orr sl, sl, r3, lsl #20 + add r1, r1, sl + add r1, r2, r1 + str r1, [r7, #0x18] + ldr r1, [sp, #0xb4] + ldr r2, [sp, #0x10] + ldrsh lr, [sb, #0x54] + smull sl, r3, r1, r2 + ldr r1, [sp, #0x14] + adds sl, sl, r0 + smull r2, r1, lr, r1 + adc r3, r3, #0 + adds r0, r2, r0 + mov r2, sl, lsr #0xc + orr r2, r2, r3, lsl #20 + adc r1, r1, #0 + mov r0, r0, lsr #0xc + orr r0, r0, r1, lsl #20 + ldr ip, [sb, #0x48] + add r0, r2, r0 + add r0, ip, r0 + str r0, [r7, #0x1c] + ldr r0, [sp, #0x2c] + ldr r3, [sp, #0x30] + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r0, [r6] + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x18 + ldrb r1, [r8, #0x40] + ldr r2, [sb, #0x6c] + mul r0, r1, r0 + add r1, r1, #0xff + sub r0, r1, r0, asr #7 + mul r0, r2, r0 + mov r0, r0, asr #8 + str r0, [r7, #0x30] + ldr r0, [sp, #0x34] + strh r0, [r7, #0x34] + ldr r0, [r8] + mov r0, r0, lsl #0x16 + movs r0, r0, lsr #0x1f + beq _0209D010 + ldr r0, [sp, #4] + ldr r0, [r0, #8] + ldrh r0, [r0, #8] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _0209D010 + ldr r0, [r6] + ldr r3, _0209D1F0 ; =0x00000003 + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x14 + ldr r1, [sp, #4] + ldr r2, [r1, #8] + ldr r1, _0209D1F4 ; =0xAAAAAAAB + umull r1, sl, r0, r1 + mov sl, sl, lsr #1 + umull sl, fp, r3, sl + ldrh r1, [r2] + sub sl, r0, sl + strh r1, [sp, #0x50] + ldrh r0, [r8, #0x22] + mov r1, sl, lsl #1 + strh r0, [sp, #0x52] + ldrh r0, [r2, #2] + strh r0, [sp, #0x54] + add r0, sp, #0x50 + ldrh r0, [r0, r1] + strh r0, [r7, #0x36] + b _0209D018 +_0209D010: + ldrh r0, [r8, #0x22] + strh r0, [r7, #0x36] +_0209D018: + ldrh r1, [r7, #0x2e] + ldrb r0, [sb, #0x81] + bic r1, r1, #0x1f + and r0, r0, #0x1f + orr r0, r1, r0 + strh r0, [r7, #0x2e] + ldrh r0, [r7, #0x2e] + bic r0, r0, #0x3e0 + orr r0, r0, #0x3e0 + strh r0, [r7, #0x2e] + ldr r0, [r8] + mov r0, r0, lsl #0x12 + movs r0, r0, lsr #0x1f + ldrne r0, [r6] + mlane r1, r0, r4, r5 + strne r1, [r6] + strneh r1, [r7, #0x20] + ldreqh r0, [sb, #0x56] + streqh r0, [r7, #0x20] + ldr r0, [r8] + mov r0, r0, lsl #0x13 + movs r0, r0, lsr #0x1f + ldreq r0, [sp, #0x38] + streqh r0, [r7, #0x22] + beq _0209D0A8 + ldr r0, [r6] + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x14 + ldrsh r2, [r8, #0x34] + ldrsh r1, [r8, #0x36] + sub r1, r1, r2 + mul r0, r1, r0 + add r0, r0, r2, lsl #12 + mov r0, r0, lsr #0xc + strh r0, [r7, #0x22] +_0209D0A8: + ldr r0, [r6] + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x18 + ldrb r1, [r8, #0x41] + ldrh r2, [sb, #0x70] + mul r0, r1, r0 + mov r0, r0, asr #8 + rsb r0, r0, #0xff + mul r0, r2, r0 + mov r0, r0, asr #8 + add r0, r0, #1 + strh r0, [r7, #0x24] + ldr r0, [sp, #0x3c] + strh r0, [r7, #0x26] + ldr r0, [r8] + mov r0, r0, lsl #0x14 + movs r1, r0, lsr #0x1f + beq _0209D138 + ldr r0, [sp, #4] + ldr r0, [r0, #0x10] + ldr r0, [r0, #8] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + beq _0209D138 + ldr r0, [r6] + mla r1, r0, r4, r5 + str r1, [r6] + mov r0, r1, lsr #0x14 + ldr r1, [sp, #4] + ldr sl, [r1, #0x10] + ldrb r1, [sl, #8] + bl _u32_div_f + ldrb r0, [sl, r1] + strb r0, [r7, #0x2c] + b _0209D168 +_0209D138: + cmp r1, #0 + beq _0209D160 + ldr r0, [sp, #4] + ldr r1, [r0, #0x10] + ldr r0, [r1, #8] + mov r0, r0, lsl #0xf + movs r0, r0, lsr #0x1f + ldreqb r0, [r1] + streqb r0, [r7, #0x2c] + beq _0209D168 +_0209D160: + ldrb r0, [r8, #0x47] + strb r0, [r7, #0x2c] +_0209D168: + ldr r1, [sp, #4] + ldr r0, _0209D1F8 ; =0x0000FFFF + ldr r1, [r1] + ldrb r1, [r1, #0x48] + bl _s32_div_f + strh r0, [r7, #0x28] + ldrh r1, [r7, #0x24] + ldr r0, _0209D1F8 ; =0x0000FFFF + bl _s32_div_f + strh r0, [r7, #0x2a] + ldr r0, [sp, #0x40] + strb r0, [r7, #0x2d] + ldr r0, [r8] + mov r0, r0, lsl #0xb + movs r0, r0, lsr #0x1f + ldrne r0, [r6] + mlane r1, r0, r4, r5 + strne r1, [r6] + movne r0, r1, lsr #0x18 + strneb r0, [r7, #0x2d] + ldr r0, [sp, #8] + add r1, r0, #1 + ldr r0, [sp, #0xc] + str r1, [sp, #8] + cmp r1, r0 + blt _0209C590 + add sp, sp, #0xc4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0209D1DC: .word 0x00000FFF +_0209D1E0: .word spl_rndm_seed +_0209D1E4: .word 0x5EEDF715 +_0209D1E8: .word 0x1B0CB173 +_0209D1EC: .word FX_SinCosTable_ +_0209D1F0: .word 0x00000003 +_0209D1F4: .word 0xAAAAAAAB +_0209D1F8: .word 0x0000FFFF + arm_func_end spl_gen_ptcl + + arm_func_start spl_set_circle_axis +spl_set_circle_axis: ; 0x0209D1FC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r4, r2 + mov r6, r0 + mov r5, r1 + add r2, sp, #0 + add r0, r4, #0x84 + add r1, r4, #0x8a + bl VEC_Fx16CrossProduct + add r0, sp, #0 + mov r1, r0 + bl VEC_Fx16Normalize + ldrsh r1, [sp] + ldr lr, [r5, #8] + ldrsh r0, [r4, #0x84] + ldr ip, [r5] + smull r3, r2, lr, r1 + smull r1, r0, ip, r0 + ldrsh r7, [r4, #0x8a] + ldr r8, [r5, #4] + mov ip, #0x800 + smull lr, r7, r8, r7 + adds r8, r3, ip + adc r3, r2, #0 + mov r2, r8, lsr #0xc + adds r1, r1, ip + orr r2, r2, r3, lsl #20 + adc r0, r0, #0 + mov r3, r1, lsr #0xc + adds r1, lr, ip + orr r3, r3, r0, lsl #20 + adc r0, r7, #0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + add r0, r3, r1 + add r0, r2, r0 + str r0, [r6] + ldrsh r0, [sp, #2] + ldr r1, [r5, #8] + ldrsh r3, [r4, #0x86] + smull r2, r0, r1, r0 + adds r2, r2, ip + ldr lr, [r5] + adc r1, r0, #0 + mov r0, r2, lsr #0xc + orr r0, r0, r1, lsl #20 + smull r8, r7, lr, r3 + ldrsh r1, [r4, #0x8c] + ldr r2, [r5, #4] + adds r8, r8, ip + smull r3, r1, r2, r1 + adc r2, r7, #0 + mov r7, r8, lsr #0xc + orr r7, r7, r2, lsl #20 + adds r2, r3, ip + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + add r1, r7, r2 + add r0, r0, r1 + str r0, [r6, #4] + ldrsh r0, [sp, #4] + ldr r1, [r5, #8] + ldr lr, [r5] + smull r3, r0, r1, r0 + adds r3, r3, ip + adc r1, r0, #0 + mov r0, r3, lsr #0xc + orr r0, r0, r1, lsl #20 + ldrsh r3, [r4, #0x88] + ldrsh r1, [r4, #0x8e] + ldr r2, [r5, #4] + smull r5, r4, lr, r3 + adds r5, r5, ip + smull r3, r1, r2, r1 + adc r4, r4, #0 + adds r2, r3, ip + mov r3, r5, lsr #0xc + adc r1, r1, #0 + mov r2, r2, lsr #0xc + orr r3, r3, r4, lsl #20 + orr r2, r2, r1, lsl #20 + add r1, r3, r2 + add r0, r0, r1 + str r0, [r6, #8] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + arm_func_end spl_set_circle_axis + + arm_func_start spl_set_cross_to_axis +spl_set_cross_to_axis: ; 0x0209D35C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + ldr r1, _0209D5E0 ; =_021105EC + mov r4, r0 + ldrh r3, [r1] + ldrh r2, [r1, #2] + ldrh r0, [r1, #4] + strh r3, [sp] + strh r2, [sp, #2] + strh r0, [sp, #4] + ldr r0, [r4, #0x20] + ldr r0, [r0] + ldr r0, [r0] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1e + beq _0209D3DC + cmp r0, #1 + beq _0209D3C4 + cmp r0, #2 + bne _0209D3F4 + mov r0, #0 + mov r1, #0x1000 + strh r1, [sp, #6] + strh r0, [sp, #8] + strh r0, [sp, #0xa] + b _0209D400 +_0209D3C4: + mov r1, #0 + mov r0, #0x1000 + strh r1, [sp, #6] + strh r0, [sp, #8] + strh r1, [sp, #0xa] + b _0209D400 +_0209D3DC: + mov r1, #0 + mov r0, #0x1000 + strh r1, [sp, #6] + strh r1, [sp, #8] + strh r0, [sp, #0xa] + b _0209D400 +_0209D3F4: + add r1, sp, #6 + add r0, r4, #0x50 + bl VEC_Fx16Normalize +_0209D400: + add r0, sp, #0 + add r1, sp, #6 + bl VEC_Fx16DotProduct + cmp r0, #0x1000 + beq _0209D424 + mov r1, #0x1000 + rsb r1, r1, #0 + cmp r0, r1 + bne _0209D438 +_0209D424: + mov r0, #0 + mov r1, #0x1000 + strh r1, [sp] + strh r0, [sp, #2] + strh r0, [sp, #4] +_0209D438: + ldrsh r3, [sp, #8] + ldrsh r1, [sp, #4] + ldrsh r2, [sp, #0xa] + ldrsh r0, [sp, #2] + smull r6, r5, r3, r1 + mov r1, #0x800 + adds r6, r6, r1 + smull r3, r0, r2, r0 + adc r5, r5, #0 + adds r2, r3, r1 + mov r3, r6, lsr #0xc + adc r0, r0, #0 + mov r2, r2, lsr #0xc + orr r3, r3, r5, lsl #20 + orr r2, r2, r0, lsl #20 + sub r0, r3, r2 + strh r0, [r4, #0x84] + ldrsh r5, [sp, #0xa] + ldrsh r3, [sp] + ldrsh r2, [sp, #6] + ldrsh r0, [sp, #4] + smull r3, r6, r5, r3 + adds ip, r3, r1 + smull r3, r0, r2, r0 + adc r5, r6, #0 + adds r2, r3, r1 + mov r3, ip, lsr #0xc + adc r0, r0, #0 + mov r2, r2, lsr #0xc + orr r3, r3, r5, lsl #20 + orr r2, r2, r0, lsl #20 + sub r0, r3, r2 + strh r0, [r4, #0x86] + ldrsh r5, [sp, #6] + ldrsh r3, [sp, #2] + ldrsh r2, [sp, #8] + ldrsh r0, [sp] + smull r3, r6, r5, r3 + adds ip, r3, r1 + smull r3, r0, r2, r0 + adc r5, r6, #0 + adds r2, r3, r1 + mov r3, ip, lsr #0xc + adc r0, r0, #0 + mov r2, r2, lsr #0xc + orr r3, r3, r5, lsl #20 + orr r2, r2, r0, lsl #20 + sub r0, r3, r2 + strh r0, [r4, #0x88] + ldrsh r6, [sp, #8] + ldrsh r5, [r4, #0x88] + add r0, r4, #0x84 + ldrsh r3, [sp, #0xa] + ldrsh r2, [r4, #0x86] + smull r5, ip, r6, r5 + adds lr, r5, r1 + smull r5, r2, r3, r2 + adc r6, ip, #0 + adds r3, r5, r1 + mov r5, lr, lsr #0xc + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r5, r5, r6, lsl #20 + orr r3, r3, r2, lsl #20 + sub r2, r5, r3 + strh r2, [r4, #0x8a] + ldrsh r6, [sp, #0xa] + ldrsh r5, [r4, #0x84] + ldrsh r3, [sp, #6] + ldrsh r2, [r4, #0x88] + smull lr, ip, r6, r5 + smull r5, r2, r3, r2 + adds r6, lr, r1 + adc r3, ip, #0 + mov r6, r6, lsr #0xc + orr r6, r6, r3, lsl #20 + adds r3, r5, r1 + adc r2, r2, #0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + sub r2, r6, r3 + strh r2, [r4, #0x8c] + ldrsh lr, [sp, #6] + ldrsh ip, [r4, #0x86] + ldrsh r3, [sp, #8] + ldrsh r2, [r4, #0x84] + smull r6, r5, lr, ip + smull ip, r2, r3, r2 + adds r6, r6, r1 + adc r5, r5, #0 + adds r3, ip, r1 + mov r6, r6, lsr #0xc + orr r6, r6, r5, lsl #20 + adc r1, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + sub r1, r6, r2 + strh r1, [r4, #0x8e] + mov r1, r0 + bl VEC_Fx16Normalize + add r0, r4, #0x8a + mov r1, r0 + bl VEC_Fx16Normalize + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0209D5E0: .word _021105EC + arm_func_end spl_set_cross_to_axis + + arm_func_start spl_chld_alp_out +spl_chld_alp_out: ; 0x0209D5E4 + stmdb sp!, {lr} + sub sp, sp, #4 + rsb r2, r2, #0xff + mov r1, #0x1f + mul r3, r2, r1 + ldr r2, _0209D638 ; =0x80808081 + ldrh lr, [r0, #0x2e] + smull r1, ip, r2, r3 + add ip, r3, ip + mov ip, ip, asr #7 + mov r1, r3, lsr #0x1f + add ip, r1, ip + mov r1, ip, lsl #0x10 + mov r1, r1, lsr #0x10 + bic r2, lr, #0x3e0 + and r1, r1, #0x1f + orr r1, r2, r1, lsl #5 + strh r1, [r0, #0x2e] + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + .align 2, 0 +_0209D638: .word 0x80808081 + arm_func_end spl_chld_alp_out + + arm_func_start spl_chld_scl_out +spl_chld_scl_out: ; 0x0209D63C + stmdb sp!, {lr} + sub sp, sp, #4 + ldr r3, [r1, #0x14] + sub r1, r2, #0xff + ldrsh lr, [r3, #4] + ldr r2, _0209D684 ; =0x80808081 + sub r3, lr, #0x1000 + mul ip, r3, r1 + smull r1, r3, r2, ip + add r3, ip, r3 + mov r3, r3, asr #7 + mov r1, ip, lsr #0x1f + add r3, r1, r3 + add r1, lr, r3 + strh r1, [r0, #0x34] + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + .align 2, 0 +_0209D684: .word 0x80808081 + arm_func_end spl_chld_scl_out + + arm_func_start spl_tex_ptn_anm +spl_tex_ptn_anm: ; 0x0209D688 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + ldr r5, [r1, #0x10] + mov r4, #0 + ldrb r3, [r5, #8] + cmp r3, #0 + addle sp, sp, #4 + ldmleia sp!, {r4, r5, lr} + bxle lr + ldrb ip, [r5, #9] + mov lr, r4 +_0209D6B4: + add r1, lr, ip + cmp r2, r1 + ldrltb r1, [r5, r4] + addlt sp, sp, #4 + strltb r1, [r0, #0x2c] + ldmltia sp!, {r4, r5, lr} + bxlt lr + add r4, r4, #1 + cmp r4, r3 + add lr, lr, ip + blt _0209D6B4 + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + arm_func_end spl_tex_ptn_anm + + arm_func_start spl_alp_in_out +spl_alp_in_out: ; 0x0209D6EC + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r1, #0xc] + mov r5, r0 + ldrb r1, [r4, #4] + ldrb r3, [r4, #5] + cmp r2, r1 + bge _0209D72C + ldrh r3, [r4] + mov r0, r3, lsl #0x16 + mov r6, r3, lsl #0x1b + mov r0, r0, lsr #0x1b + sub r0, r0, r6, lsr #27 + mul r0, r2, r0 + bl _s32_div_f + add r0, r0, r6, lsr #27 + b _0209D768 +_0209D72C: + cmp r2, r3 + ldrlth r0, [r4] + movlt r0, r0, lsl #0x16 + movlt r0, r0, lsr #0x1b + blt _0209D768 + ldrh r0, [r4] + sub r2, r2, #0xff + rsb r1, r3, #0xff + mov r6, r0, lsl #0x11 + mov r3, r6, lsr #0x1b + mov r0, r0, lsl #0x16 + sub r0, r3, r0, lsr #27 + mul r0, r2, r0 + bl _s32_div_f + add r0, r0, r6, lsr #27 +_0209D768: + ldr r3, _0209D7BC ; =spl_rndm_seed + ldr r1, _0209D7C0 ; =0x5EEDF715 + ldr ip, [r3] + ldr r2, _0209D7C4 ; =0x1B0CB173 + mla r1, ip, r1, r2 + str r1, [r3] + ldrb r2, [r4, #2] + mov r1, r1, lsr #0x18 + ldrh r3, [r5, #0x2e] + mul r1, r2, r1 + mov r1, r1, asr #8 + rsb r1, r1, #0xff + mul r1, r0, r1 + mov r0, r1, lsl #8 + mov r0, r0, lsr #0x10 + bic r1, r3, #0x3e0 + and r0, r0, #0x1f + orr r0, r1, r0, lsl #5 + strh r0, [r5, #0x2e] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0209D7BC: .word spl_rndm_seed +_0209D7C0: .word 0x5EEDF715 +_0209D7C4: .word 0x1B0CB173 + arm_func_end spl_alp_in_out + + arm_func_start spl_clr_in_out +spl_clr_in_out: ; 0x0209D7C8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #4 + ldr r4, [r1, #8] + mov sl, r0 + ldrb r3, [r4, #4] + ldr r0, [r1] + ldrb r1, [r4, #5] + cmp r2, r3 + ldrb fp, [r4, #6] + ldrlth r0, [r4] + addlt sp, sp, #4 + strlth r0, [sl, #0x36] + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxlt lr + cmp r2, r1 + bge _0209D8C0 + ldrh sb, [r0, #0x22] + ldrh r0, [r4, #8] + ldrh r8, [r4] + mov r7, sb, asr #5 + mov fp, sb, asr #0xa + mov r4, r0, lsl #0x1d + mov r6, r8, asr #5 + mov r5, r8, asr #0xa + movs r4, r4, lsr #0x1f + and sb, sb, #0x1f + and r7, r7, #0x1f + and r0, fp, #0x1f + orreq r1, sb, r7, lsl #5 + orreq r0, r1, r0, lsl #10 + and r8, r8, #0x1f + and r6, r6, #0x1f + and r5, r5, #0x1f + addeq sp, sp, #4 + streqh r0, [sl, #0x36] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + sub r4, r2, r3 + sub r0, r0, r5 + mul r0, r4, r0 + sub fp, r1, r3 + mov r1, fp + bl _s32_div_f + sub r1, sb, r8 + mov sb, r0 + mul r0, r4, r1 + mov r1, fp + bl _s32_div_f + sub r1, r7, r6 + mov r7, r0 + mul r0, r4, r1 + mov r1, fp + bl _s32_div_f + add r1, r8, r7 + add r0, r6, r0 + add r2, r5, sb + orr r0, r1, r0, lsl #5 + orr r0, r0, r2, lsl #10 + add sp, sp, #4 + strh r0, [sl, #0x36] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr +_0209D8C0: + cmp r2, fp + bge _0209D980 + ldrh r7, [r4, #2] + ldrh r8, [r0, #0x22] + ldrh r0, [r4, #8] + mov r5, r7, asr #5 + mov r4, r7, asr #0xa + mov r3, r0, lsl #0x1d + mov r6, r8, asr #5 + mov sb, r8, asr #0xa + movs r3, r3, lsr #0x1f + and r7, r7, #0x1f + and r5, r5, #0x1f + and r0, r4, #0x1f + orreq r1, r7, r5, lsl #5 + orreq r0, r1, r0, lsl #10 + and r8, r8, #0x1f + and r6, r6, #0x1f + and sb, sb, #0x1f + addeq sp, sp, #4 + streqh r0, [sl, #0x36] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bxeq lr + sub r4, r2, r1 + sub r0, r0, sb + mul r0, r4, r0 + sub fp, fp, r1 + mov r1, fp + bl _s32_div_f + sub r1, r7, r8 + mov r7, r0 + mul r0, r4, r1 + mov r1, fp + bl _s32_div_f + sub r1, r5, r6 + mov r5, r0 + mul r0, r4, r1 + mov r1, fp + bl _s32_div_f + add r1, r8, r5 + add r0, r6, r0 + add r2, sb, r7 + orr r0, r1, r0, lsl #5 + orr r0, r0, r2, lsl #10 + add sp, sp, #4 + strh r0, [sl, #0x36] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr +_0209D980: + ldrh r0, [r4, #2] + strh r0, [sl, #0x36] + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + arm_func_end spl_clr_in_out + + arm_func_start spl_scl_in_out +spl_scl_in_out: ; 0x0209D994 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + ldr ip, [r1, #4] + mov r4, r0 + ldrb r1, [ip, #6] + ldrb r3, [ip, #7] + cmp r2, r1 + bge _0209D9DC + ldrsh r5, [ip] + ldrsh r0, [ip, #2] + sub r0, r0, r5 + mul r0, r2, r0 + bl _s32_div_f + add r0, r5, r0 + add sp, sp, #4 + strh r0, [r4, #0x34] + ldmia sp!, {r4, r5, lr} + bx lr +_0209D9DC: + cmp r2, r3 + ldrltsh r0, [ip, #2] + addlt sp, sp, #4 + strlth r0, [r4, #0x34] + ldmltia sp!, {r4, r5, lr} + bxlt lr + ldrsh r5, [ip, #4] + ldrsh r0, [ip, #2] + sub r2, r2, #0xff + rsb r1, r3, #0xff + sub r0, r5, r0 + mul r0, r2, r0 + bl _s32_div_f + add r0, r5, r0 + strh r0, [r4, #0x34] + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + arm_func_end spl_scl_in_out + + arm_func_start spl_calc_convergence +spl_calc_convergence: ; 0x0209DA24 + stmdb sp!, {r4, lr} + ldr lr, [r1, #8] + ldr r2, [r0] + ldrsh r4, [r0, #0xc] + sub r3, r2, lr + mov r2, #0x800 + smull ip, r3, r4, r3 + adds r4, ip, r2 + adc r3, r3, #0 + mov r4, r4, lsr #0xc + orr r4, r4, r3, lsl #20 + add r3, lr, r4 + str r3, [r1, #8] + ldr r4, [r1, #0xc] + ldr r3, [r0, #4] + ldrsh ip, [r0, #0xc] + sub r3, r3, r4 + smull lr, r3, ip, r3 + adds ip, lr, r2 + adc r3, r3, #0 + mov ip, ip, lsr #0xc + orr ip, ip, r3, lsl #20 + add r3, r4, ip + str r3, [r1, #0xc] + ldr lr, [r1, #0x10] + ldr r3, [r0, #8] + ldrsh ip, [r0, #0xc] + sub r0, r3, lr + smull r3, r0, ip, r0 + adds r2, r3, r2 + adc r0, r0, #0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + add r0, lr, r2 + str r0, [r1, #0x10] + ldmia sp!, {r4, lr} + bx lr + arm_func_end spl_calc_convergence + + arm_func_start spl_calc_scfield +spl_calc_scfield: ; 0x0209DAB8 + ldr r3, [r3, #0x74] + ldr r2, [r0] + cmp r3, #0x80000000 + movne r2, r3 + ldrh r3, [r0, #6] + mov r3, r3, lsl #0x1e + movs r3, r3, lsr #0x1e + beq _0209DAE4 + cmp r3, #1 + beq _0209DB38 + bx lr +_0209DAE4: + ldr r3, [r1, #0x3c] + cmp r3, r2 + bge _0209DB10 + ldr r0, [r1, #0xc] + add r0, r3, r0 + cmp r0, r2 + subgt r0, r2, r3 + strgt r0, [r1, #0xc] + ldrgth r0, [r1, #0x24] + strgth r0, [r1, #0x26] + bxgt lr +_0209DB10: + cmp r3, r2 + bxlt lr + ldr r0, [r1, #0xc] + add r0, r3, r0 + cmp r0, r2 + sublt r0, r2, r3 + strlt r0, [r1, #0xc] + ldrlth r0, [r1, #0x24] + strlth r0, [r1, #0x26] + bx lr +_0209DB38: + ldr ip, [r1, #0x3c] + cmp ip, r2 + bge _0209DB88 + ldr r3, [r1, #0xc] + add r3, ip, r3 + cmp r3, r2 + ble _0209DB88 + sub r2, r2, ip + str r2, [r1, #0xc] + ldrsh r2, [r0, #4] + ldr r3, [r1, #0x18] + mov r0, #0x800 + smull ip, r2, r3, r2 + adds r3, ip, r0 + adc r0, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + rsb r0, r2, #0 + str r0, [r1, #0x18] + bx lr +_0209DB88: + cmp ip, r2 + bxlt lr + ldr r3, [r1, #0xc] + add r3, ip, r3 + cmp r3, r2 + bxge lr + sub r2, r2, ip + str r2, [r1, #0xc] + ldrsh r2, [r0, #4] + ldr r3, [r1, #0x18] + mov r0, #0x800 + smull ip, r2, r3, r2 + adds r3, ip, r0 + adc r0, r2, #0 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + rsb r0, r2, #0 + str r0, [r1, #0x18] + bx lr + arm_func_end spl_calc_scfield + + arm_func_start spl_calc_spin +spl_calc_spin: ; 0x0209DBD4 + stmdb sp!, {r4, lr} + sub sp, sp, #0x28 + ldrh r2, [r0, #2] + mov r4, r1 + cmp r2, #0 + beq _0209DC00 + cmp r2, #1 + beq _0209DC30 + cmp r2, #2 + beq _0209DC60 + b _0209DC8C +_0209DC00: + ldrh r1, [r0] + ldr r3, _0209DCA8 ; =FX_SinCosTable_ + add r0, sp, #0 + mov r1, r1, asr #4 + mov r2, r1, lsl #1 + add r1, r2, #1 + mov ip, r2, lsl #1 + mov r2, r1, lsl #1 + ldrsh r1, [r3, ip] + ldrsh r2, [r3, r2] + bl MTX_RotX33_ + b _0209DC8C +_0209DC30: + ldrh r1, [r0] + ldr r3, _0209DCA8 ; =FX_SinCosTable_ + add r0, sp, #0 + mov r1, r1, asr #4 + mov r2, r1, lsl #1 + add r1, r2, #1 + mov ip, r2, lsl #1 + mov r2, r1, lsl #1 + ldrsh r1, [r3, ip] + ldrsh r2, [r3, r2] + bl MTX_RotY33_ + b _0209DC8C +_0209DC60: + ldrh r1, [r0] + ldr r3, _0209DCA8 ; =FX_SinCosTable_ + add r0, sp, #0 + mov r1, r1, asr #4 + mov r2, r1, lsl #1 + add r1, r2, #1 + mov ip, r2, lsl #1 + mov r2, r1, lsl #1 + ldrsh r1, [r3, ip] + ldrsh r2, [r3, r2] + bl MTX_RotZ33_ +_0209DC8C: + add r0, r4, #8 + add r1, sp, #0 + mov r2, r0 + bl MTX_MultVec33 + add sp, sp, #0x28 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0209DCA8: .word FX_SinCosTable_ + arm_func_end spl_calc_spin + + arm_func_start spl_calc_magnet +spl_calc_magnet: ; 0x0209DCAC + stmdb sp!, {r4, lr} + ldr ip, [r0] + ldr r4, [r1, #8] + ldrsh lr, [r0, #0xc] + ldr r3, [r1, #0x14] + sub r4, ip, r4 + sub r3, r4, r3 + mul r3, lr, r3 + ldr r4, [r2] + add r3, r4, r3, asr #12 + str r3, [r2] + ldr lr, [r0, #4] + ldr ip, [r1, #0xc] + ldrsh r4, [r0, #0xc] + ldr r3, [r1, #0x18] + sub ip, lr, ip + sub r3, ip, r3 + mul r3, r4, r3 + ldr r4, [r2, #4] + add r3, r4, r3, asr #12 + str r3, [r2, #4] + ldr ip, [r0, #8] + ldr r3, [r1, #0x10] + ldrsh lr, [r0, #0xc] + ldr r0, [r1, #0x1c] + sub r1, ip, r3 + sub r0, r1, r0 + mul r0, lr, r0 + ldr r1, [r2, #8] + add r0, r1, r0, asr #12 + str r0, [r2, #8] + ldmia sp!, {r4, lr} + bx lr + arm_func_end spl_calc_magnet + + arm_func_start spl_calc_random +spl_calc_random: ; 0x0209DD30 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + ldrh r0, [r1, #0x26] + ldrh r1, [r5, #6] + mov r4, r2 + bl _s32_div_f + cmp r1, #0 + addne sp, sp, #4 + ldmneia sp!, {r4, r5, lr} + bxne lr + ldr r2, _0209DDEC ; =spl_rndm_seed + ldr r0, _0209DDF0 ; =0x5EEDF715 + ldr r3, [r2] + ldr r1, _0209DDF4 ; =0x1B0CB173 + mla ip, r3, r0, r1 + str ip, [r2] + ldrsh lr, [r5] + mov r3, ip, lsr #0x17 + ldr ip, [r4] + mul r3, lr, r3 + sub r3, r3, lr, lsl #8 + add r3, ip, r3, asr #8 + str r3, [r4] + ldr r3, [r2] + mla ip, r3, r0, r1 + str ip, [r2] + ldrsh lr, [r5, #2] + mov r3, ip, lsr #0x17 + ldr ip, [r4, #4] + mul r3, lr, r3 + sub r3, r3, lr, lsl #8 + add r3, ip, r3, asr #8 + str r3, [r4, #4] + ldr r3, [r2] + mla r0, r3, r0, r1 + str r0, [r2] + ldrsh r2, [r5, #4] + mov r0, r0, lsr #0x17 + ldr r1, [r4, #8] + mul r0, r2, r0 + sub r0, r0, r2, lsl #8 + add r0, r1, r0, asr #8 + str r0, [r4, #8] + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + .align 2, 0 +_0209DDEC: .word spl_rndm_seed +_0209DDF0: .word 0x5EEDF715 +_0209DDF4: .word 0x1B0CB173 + arm_func_end spl_calc_random + + arm_func_start spl_calc_gravity +spl_calc_gravity: ; 0x0209DDF8 + ldrsh r1, [r0] + ldr r3, [r2] + add r1, r3, r1 + str r1, [r2] + ldrsh r1, [r0, #2] + ldr r3, [r2, #4] + add r1, r3, r1 + str r1, [r2, #4] + ldrsh r0, [r0, #4] + ldr r1, [r2, #8] + add r0, r1, r0 + str r0, [r2, #8] + bx lr + arm_func_end spl_calc_gravity + + arm_func_start spl_del +spl_del: ; 0x0209DE2C + ldr r3, [r1] + cmp r3, #0 + bne _0209DE6C + ldr r2, [r0] + cmp r2, r1 + moveq r2, #0 + streq r2, [r0] + streq r2, [r0, #8] + beq _0209DE98 + ldr r2, [r1, #4] + mov r3, #0 + str r3, [r2] + ldr r2, [r0, #8] + ldr r2, [r2, #4] + str r2, [r0, #8] + b _0209DE98 +_0209DE6C: + ldr r2, [r0] + cmp r2, r1 + streq r3, [r0] + ldreq r2, [r0] + moveq r3, #0 + streq r3, [r2, #4] + ldrne r2, [r1, #4] + strne r2, [r3, #4] + ldrne r3, [r1] + ldrne r2, [r1, #4] + strne r3, [r2] +_0209DE98: + ldr r2, [r0, #4] + sub r2, r2, #1 + str r2, [r0, #4] + mov r0, r1 + bx lr + arm_func_end spl_del + + arm_func_start spl_pop_front +spl_pop_front: ; 0x0209DEAC + ldr r2, [r0] + mov r3, #0 + mov ip, r3 + cmp r2, #0 + beq _0209DEF0 + ldr r1, [r2] + mov ip, r2 + str r1, [r0] + ldr r1, [r0] + cmp r1, #0 + ldrne r1, [r2] + strne r3, [r1, #4] + streq r3, [r0] + streq r3, [r0, #8] + ldr r1, [r0, #4] + sub r1, r1, #1 + str r1, [r0, #4] +_0209DEF0: + mov r0, ip + bx lr + arm_func_end spl_pop_front + + arm_func_start spl_push_front +spl_push_front: ; 0x0209DEF8 + ldr r2, [r0] + cmp r2, #0 + bne _0209DF20 + str r1, [r0] + str r1, [r0, #8] + mov r2, #0 + str r2, [r1] + ldr r2, [r1] + str r2, [r1, #4] + b _0209DF38 +_0209DF20: + str r2, [r1] + mov r2, #0 + str r2, [r1, #4] + ldr r2, [r0] + str r1, [r2, #4] + str r1, [r0] +_0209DF38: + ldr r1, [r0, #4] + add r1, r1, #1 + str r1, [r0, #4] + bx lr + arm_func_end spl_push_front + + arm_func_start spl_rndm_get_arb_vec_xy +spl_rndm_get_arb_vec_xy: ; 0x0209DF48 + stmdb sp!, {r4, lr} + ldr ip, _0209DF98 ; =spl_rndm_seed + ldr r2, _0209DF9C ; =0x5EEDF715 + ldr r4, [ip] + ldr r3, _0209DFA0 ; =0x1B0CB173 + mov r1, r0 + mla lr, r4, r2, r3 + str lr, [ip] + mov r4, lr, asr #8 + str r4, [r0] + ldr r4, [ip] + mov lr, #0 + mla r2, r4, r2, r3 + str r2, [ip] + mov r2, r2, asr #8 + str r2, [r0, #4] + str lr, [r0, #8] + bl VEC_Normalize + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0209DF98: .word spl_rndm_seed +_0209DF9C: .word 0x5EEDF715 +_0209DFA0: .word 0x1B0CB173 + arm_func_end spl_rndm_get_arb_vec_xy + + arm_func_start spl_rndm_get_arb_vec_xyz +spl_rndm_get_arb_vec_xyz: ; 0x0209DFA4 + stmdb sp!, {r4, lr} + ldr ip, _0209E000 ; =spl_rndm_seed + ldr r2, _0209E004 ; =0x5EEDF715 + ldr r4, [ip] + ldr r3, _0209E008 ; =0x1B0CB173 + mov r1, r0 + mla lr, r4, r2, r3 + str lr, [ip] + mov r4, lr, asr #8 + str r4, [r0] + ldr lr, [ip] + mla r4, lr, r2, r3 + str r4, [ip] + mov lr, r4, asr #8 + str lr, [r0, #4] + ldr lr, [ip] + mla r2, lr, r2, r3 + str r2, [ip] + mov r2, r2, asr #8 + str r2, [r0, #8] + bl VEC_Normalize + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0209E000: .word spl_rndm_seed +_0209E004: .word 0x5EEDF715 +_0209E008: .word 0x1B0CB173 + arm_func_end spl_rndm_get_arb_vec_xyz + + .data + +_021105DC: + .word drawXYPlane + .word drawXZPlane +_021105E4: + .word rotTypeY + .word rotTypeXYZ +_021105EC: + .short 0, 0x1000, 0 + .balign 4, 0 diff --git a/lib/asm/libVCT.s b/lib/asm/libVCT.s new file mode 100644 index 00000000..56b73866 --- /dev/null +++ b/lib/asm/libVCT.s @@ -0,0 +1,5504 @@ + .include "asm/macros.inc" + .include "libVCT.inc" + .include "global.inc" + + .bss + +_021D6040: + .space 0x10 + +sAdpcmState: ; 0x021D6050 + .space 0x1C + +sAudioSession: ; 0x021D606C + .space 0xC + +sStream: ; 0x021D6078 + .space 0x1BC + +_021D6234: ; 0x021D6234 + .space 0x44C + +sSendInfo: ; 0x021D6680 + .space 0x8D8 + +_021D6F58: ; 0x021D6F58 + .space 0x8 + +_021D6F60: ; 0x021D6F60 + .space 0xC + +_021D6F6C: ; 0x021D6F6C + .space 0xC + +_021D6F78: ; 0x021D6F78 + .space 0xC + +_021D6F84: ; 0x021D6F84 + .space 0xC + +_021D6F90: ; 0x021D6F90 + .space 0x24 + +_021D6FB4: ; 0x021D6FB4 + .space 0x18 + +_021D6FCC: ; 0x021D6FCC + .space 0x18 + +_021D6FE4: ; 0x021D6FE4 + .space 0x8 + +_021D6FEC: ; 0x021D6FEC + .space 0xC + +E2scales: ; 0x021D6FF8 + .space 0x10 + +_021D7008: ; 0x021D7008 + .space 0x14 + +sH: ; 0x021D701C + .space 0x18 + +sTap: ; 0x021D7034 + .space 0x18 + +sSpkBuffer: ; 0x021D704C + .space 0x440 + +sDelayLine: ; 0x021D748C + .space 0x1000 + +_021D848C: ; 0x021D848C + .space 0xC + +__vct: ; 0x021D8498 + .space 0x18 + + .text + + arm_func_start vct_decode_adpcm_32 +vct_decode_adpcm_32: ; 0x020B03F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r6, #0 + cmp r2, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0x8000 + ldr lr, _020B0538 ; =0x00007FFF + ldr ip, _020B053C ; =cAdpcmIndexTable4 + ldr r5, _020B0540 ; =cAdpcmStepSizeTable + rsb r4, r4, #0 +_020B0414: + ldrb r7, [r3, #2] + ldrb sl, [r0] + ldrsh r8, [r3] + mov sb, r7, lsl #1 + ldrsh fp, [r5, sb] + and sl, sl, #0xf + tst sl, #4 + mov sb, fp, asr #3 + addne sb, sb, fp + tst sl, #2 + addne sb, sb, fp, asr #1 + tst sl, #1 + addne sb, sb, fp, asr #2 + tst sl, #8 + beq _020B0460 + sub r8, r8, sb + cmp r8, r4 + movlt r8, r4 + b _020B046C +_020B0460: + add r8, r8, sb + cmp r8, lr + movgt r8, lr +_020B046C: + ldrsb sb, [ip, sl] + adds r7, r7, sb + movmi r7, #0 + bmi _020B0484 + cmp r7, #0x58 + movgt r7, #0x58 +_020B0484: + mov r8, r8, lsl #0x10 + mov r8, r8, asr #0x10 + strh r8, [r3] + strb r7, [r3, #2] + strh r8, [r1] + ldrb r7, [r3, #2] + ldrb sl, [r0] + ldrsh r8, [r3] + mov sb, r7, lsl #1 + ldrsh fp, [r5, sb] + mov sl, sl, asr #4 + and sl, sl, #0xf + mov sb, fp, asr #3 + tst sl, #4 + addne sb, sb, fp + tst sl, #2 + addne sb, sb, fp, asr #1 + tst sl, #1 + addne sb, sb, fp, asr #2 + tst sl, #8 + beq _020B04E8 + sub r8, r8, sb + cmp r8, r4 + movlt r8, r4 + b _020B04F4 +_020B04E8: + add r8, r8, sb + cmp r8, lr + movgt r8, lr +_020B04F4: + ldrsb sb, [ip, sl] + adds r7, r7, sb + movmi r7, #0 + bmi _020B050C + cmp r7, #0x58 + movgt r7, #0x58 +_020B050C: + mov r8, r8, lsl #0x10 + mov r8, r8, asr #0x10 + strh r8, [r3] + strb r7, [r3, #2] + add r6, r6, #1 + strh r8, [r1, #2] + cmp r6, r2 + add r1, r1, #4 + add r0, r0, #1 + blo _020B0414 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B0538: .word 0x00007FFF +_020B053C: .word cAdpcmIndexTable4 +_020B0540: .word cAdpcmStepSizeTable + arm_func_end vct_decode_adpcm_32 + + arm_func_start vct_encode_adpcm_32 +vct_encode_adpcm_32: ; 0x020B0544 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r8, r2, lsr #1 + mov r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov ip, #0x8000 + rsb ip, ip, #0 + ldr lr, _020B06C8 ; =cAdpcmStepSizeTable + mov r2, ip, lsr #0x11 +_020B0564: + ldrb r6, [r3, #2] + ldrsh r7, [r3] + ldrsh r5, [r1] + mov sb, r6, lsl #1 + ldrsh sb, [lr, sb] + subs sl, r5, r7 + movmi r5, #8 + rsbmi sl, sl, #0 + movpl r5, #0 + cmp sl, sb + orrge r5, r5, #4 + subge sl, sl, sb + cmp sl, sb, asr #1 + orrge r5, r5, #2 + subge sl, sl, sb, asr #1 + cmp sl, sb, asr #2 + orrge r5, r5, #1 + mov sl, sb, asr #3 + tst r5, #4 + addne sl, sl, sb + tst r5, #2 + addne sl, sl, sb, asr #1 + tst r5, #1 + addne sl, sl, sb, asr #2 + tst r5, #8 + rsbne sl, sl, #0 + add sb, r7, sl + ldr r7, _020B06CC ; =cAdpcmIndexTable4 + cmp sb, ip + movlt sb, ip + cmp sb, ip, lsr #17 + ldrsb r7, [r7, r5] + movgt sb, r2 + adds r6, r6, r7 + movmi r6, #0 + bmi _020B05FC + cmp r6, #0x58 + movgt r6, #0x58 +_020B05FC: + strh sb, [r3] + strb r6, [r3, #2] + and r7, r6, #0xff + ldrsh r6, [r1, #2] + ldrsh sb, [r3] + mov sl, r7, lsl #1 + ldrsh sl, [lr, sl] + subs fp, r6, sb + movmi r6, #8 + rsbmi fp, fp, #0 + movpl r6, #0 + cmp fp, sl + orrge r6, r6, #4 + subge fp, fp, sl + cmp fp, sl, asr #1 + orrge r6, r6, #2 + subge fp, fp, sl, asr #1 + cmp fp, sl, asr #2 + orrge r6, r6, #1 + mov fp, sl, asr #3 + tst r6, #4 + addne fp, fp, sl + tst r6, #2 + addne fp, fp, sl, asr #1 + tst r6, #1 + addne fp, fp, sl, asr #2 + tst r6, #8 + rsbne fp, fp, #0 + add sl, sb, fp + ldr sb, _020B06CC ; =cAdpcmIndexTable4 + cmp sl, ip + movlt sl, ip + cmp sl, ip, lsr #17 + ldrsb sb, [sb, r6] + movgt sl, r2 + and r5, r5, #0xff + adds r7, r7, sb + add r1, r1, #4 + movmi r7, #0 + bmi _020B06A4 + cmp r7, #0x58 + movgt r7, #0x58 +_020B06A4: + strh sl, [r3] + strb r7, [r3, #2] + and r6, r6, #0xff + orr r5, r5, r6, lsl #4 + strb r5, [r0], #1 + add r4, r4, #1 + cmp r4, r8 + blo _020B0564 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B06C8: .word cAdpcmStepSizeTable +_020B06CC: .word cAdpcmIndexTable4 + arm_func_end vct_encode_adpcm_32 + + arm_func_start vct_decode_adpcm_24 +vct_decode_adpcm_24: ; 0x020B06D0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + ldr r5, _020B0B54 ; =0xAAAAAAAB + mov r4, #0 + str r4, [sp, #0xc] + umull r5, r4, r2, r5 + movs r2, r4, lsr #1 + str r2, [sp] + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0x8000 + ldr lr, _020B0B58 ; =0x00007FFF + ldr r5, _020B0B5C ; =cAdpcmStepSizeTable + rsb r4, r4, #0 +_020B0708: + ldrb r7, [r3, #2] + ldrb fp, [r0] + ldrb r2, [r0, #1] + mov r6, r7, lsl #1 + ldrsh r6, [r5, r6] + mov sb, fp, asr #5 + tst sb, #2 + str r6, [sp, #8] + ldrne sl, [sp, #8] + mov r6, r6, asr #2 + addne r6, r6, sl + tst sb, #1 + ldrne sl, [sp, #8] + ldrb ip, [r0, #2] + addne r6, r6, sl, asr #1 + ldrsh r8, [r3] + tst sb, #4 + beq _020B0760 + sub r8, r8, r6 + cmp r8, r4 + movlt r8, r4 + b _020B076C +_020B0760: + add r8, r8, r6 + cmp r8, lr + movgt r8, lr +_020B076C: + ldr r6, _020B0B60 ; =cAdpcmIndexTable3 + ldrsb r6, [r6, sb] + adds r7, r7, r6 + movmi r7, #0 + bmi _020B0788 + cmp r7, #0x58 + movgt r7, #0x58 +_020B0788: + mov r6, r8, lsl #0x10 + mov r6, r6, asr #0x10 + strh r6, [r3] + strb r7, [r3, #2] + strh r6, [r1] + ldrb r7, [r3, #2] + mov sb, fp, asr #2 + tst sb, #2 + mov r6, r7, lsl #1 + ldrsh r6, [r5, r6] + ldrsh r8, [r3] + str r6, [sp, #4] + ldrne sl, [sp, #4] + mov r6, r6, asr #2 + addne r6, r6, sl + tst sb, #1 + ldrne sl, [sp, #4] + addne r6, r6, sl, asr #1 + tst sb, #4 + beq _020B07E8 + sub r8, r8, r6 + cmp r8, r4 + movlt r8, r4 + b _020B07F4 +_020B07E8: + add r8, r8, r6 + cmp r8, lr + movgt r8, lr +_020B07F4: + ldr r6, _020B0B60 ; =cAdpcmIndexTable3 + and sb, sb, #7 + ldrsb r6, [r6, sb] + adds r7, r7, r6 + movmi r7, #0 + bmi _020B0814 + cmp r7, #0x58 + movgt r7, #0x58 +_020B0814: + mov r6, r8, lsl #0x10 + mov r6, r6, asr #0x10 + strh r6, [r3] + strb r7, [r3, #2] + strh r6, [r1, #2] + ldrb r6, [r3, #2] + mov r8, fp, lsl #1 + and r8, r8, #7 + mov sb, r6, lsl #1 + ldrsh sl, [r5, sb] + orr r8, r8, r2, asr #7 + tst r8, #2 + mov sb, sl, asr #2 + addne sb, sb, sl + tst r8, #1 + addne sb, sb, sl, asr #1 + ldrsh r7, [r3] + tst r8, #4 + beq _020B0870 + sub r7, r7, sb + cmp r7, r4 + movlt r7, r4 + b _020B087C +_020B0870: + add r7, r7, sb + cmp r7, lr + movgt r7, lr +_020B087C: + ldr sb, _020B0B60 ; =cAdpcmIndexTable3 + ldrsb r8, [sb, r8] + adds r6, r6, r8 + movmi r6, #0 + bmi _020B0898 + cmp r6, #0x58 + movgt r6, #0x58 +_020B0898: + mov r7, r7, lsl #0x10 + mov r7, r7, asr #0x10 + strh r7, [r3] + strb r6, [r3, #2] + strh r7, [r1, #4] + ldrb r6, [r3, #2] + mov r8, r2, asr #4 + tst r8, #2 + mov sb, r6, lsl #1 + ldrsh sl, [r5, sb] + ldrsh r7, [r3] + mov sb, sl, asr #2 + addne sb, sb, sl + tst r8, #1 + addne sb, sb, sl, asr #1 + tst r8, #4 + beq _020B08EC + sub r7, r7, sb + cmp r7, r4 + movlt r7, r4 + b _020B08F8 +_020B08EC: + add r7, r7, sb + cmp r7, lr + movgt r7, lr +_020B08F8: + and sb, r8, #7 + ldr r8, _020B0B60 ; =cAdpcmIndexTable3 + ldrsb r8, [r8, sb] + adds r6, r6, r8 + movmi r6, #0 + bmi _020B0918 + cmp r6, #0x58 + movgt r6, #0x58 +_020B0918: + mov r7, r7, lsl #0x10 + mov r7, r7, asr #0x10 + strh r7, [r3] + strb r6, [r3, #2] + strh r7, [r1, #6] + ldrb r6, [r3, #2] + mov r8, r2, asr #1 + tst r8, #2 + mov sb, r6, lsl #1 + ldrsh sl, [r5, sb] + ldrsh r7, [r3] + mov sb, sl, asr #2 + addne sb, sb, sl + tst r8, #1 + addne sb, sb, sl, asr #1 + tst r8, #4 + beq _020B096C + sub r7, r7, sb + cmp r7, r4 + movlt r7, r4 + b _020B0978 +_020B096C: + add r7, r7, sb + cmp r7, lr + movgt r7, lr +_020B0978: + and sb, r8, #7 + ldr r8, _020B0B60 ; =cAdpcmIndexTable3 + ldrsb r8, [r8, sb] + adds r6, r6, r8 + movmi r6, #0 + bmi _020B0998 + cmp r6, #0x58 + movgt r6, #0x58 +_020B0998: + mov r7, r7, lsl #0x10 + mov r8, r7, asr #0x10 + strh r8, [r3] + mov r2, r2, lsl #2 + strb r6, [r3, #2] + and r2, r2, #7 + strh r8, [r1, #8] + orr r7, r2, ip, asr #6 + ldrb r2, [r3, #2] + tst r7, #2 + ldrsh r6, [r3] + mov r8, r2, lsl #1 + ldrsh sb, [r5, r8] + mov r8, sb, asr #2 + addne r8, r8, sb + tst r7, #1 + addne r8, r8, sb, asr #1 + tst r7, #4 + beq _020B09F4 + sub r6, r6, r8 + cmp r6, r4 + movlt r6, r4 + b _020B0A00 +_020B09F4: + add r6, r6, r8 + cmp r6, lr + movgt r6, lr +_020B0A00: + ldr r8, _020B0B60 ; =cAdpcmIndexTable3 + ldrsb r7, [r8, r7] + adds r2, r2, r7 + movmi r2, #0 + bmi _020B0A1C + cmp r2, #0x58 + movgt r2, #0x58 +_020B0A1C: + mov r6, r6, lsl #0x10 + mov r6, r6, asr #0x10 + strh r6, [r3] + strb r2, [r3, #2] + strh r6, [r1, #0xa] + ldrb r2, [r3, #2] + mov sb, ip, asr #3 + tst sb, #2 + mov r7, r2, lsl #1 + ldrsh r8, [r5, r7] + ldrsh r6, [r3] + mov r7, r8, asr #2 + addne r7, r7, r8 + tst sb, #1 + addne r7, r7, r8, asr #1 + tst sb, #4 + beq _020B0A70 + sub r6, r6, r7 + cmp r6, r4 + movlt r6, r4 + b _020B0A7C +_020B0A70: + add r6, r6, r7 + cmp r6, lr + movgt r6, lr +_020B0A7C: + ldr r7, _020B0B60 ; =cAdpcmIndexTable3 + and r8, sb, #7 + ldrsb r7, [r7, r8] + adds r2, r2, r7 + movmi r2, #0 + bmi _020B0A9C + cmp r2, #0x58 + movgt r2, #0x58 +_020B0A9C: + mov r6, r6, lsl #0x10 + mov r6, r6, asr #0x10 + strh r6, [r3] + strb r2, [r3, #2] + strh r6, [r1, #0xc] + ldrb r2, [r3, #2] + tst ip, #2 + ldrsh r6, [r3] + mov r7, r2, lsl #1 + ldrsh r8, [r5, r7] + mov r7, r8, asr #2 + addne r7, r7, r8 + tst ip, #1 + addne r7, r7, r8, asr #1 + tst ip, #4 + beq _020B0AEC + sub r6, r6, r7 + cmp r6, r4 + movlt r6, r4 + b _020B0AF8 +_020B0AEC: + add r6, r6, r7 + cmp r6, lr + movgt r6, lr +_020B0AF8: + ldr r7, _020B0B60 ; =cAdpcmIndexTable3 + and r8, ip, #7 + ldrsb r7, [r7, r8] + adds r2, r2, r7 + movmi r2, #0 + bmi _020B0B18 + cmp r2, #0x58 + movgt r2, #0x58 +_020B0B18: + mov r6, r6, lsl #0x10 + mov r6, r6, asr #0x10 + strh r6, [r3] + strb r2, [r3, #2] + ldr r2, [sp, #0xc] + strh r6, [r1, #0xe] + add r6, r2, #1 + ldr r2, [sp] + add r0, r0, #3 + add r1, r1, #0x10 + str r6, [sp, #0xc] + cmp r6, r2 + blo _020B0708 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B0B54: .word 0xAAAAAAAB +_020B0B58: .word 0x00007FFF +_020B0B5C: .word cAdpcmStepSizeTable +_020B0B60: .word cAdpcmIndexTable3 + arm_func_end vct_decode_adpcm_24 + + arm_func_start vct_encode_adpcm_24 +vct_encode_adpcm_24: ; 0x020B0B64 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + movs r2, r2, lsr #3 + str r2, [sp] + mov r2, #0 + str r2, [sp, #4] + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r6, #0x8000 + rsb r6, r6, #0 + ldr r7, _020B1068 ; =cAdpcmStepSizeTable + ldr r4, _020B106C ; =cAdpcmIndexTable3 + mov r5, r6, lsr #0x11 +_020B0B98: + ldrsh r2, [r3] + ldrsh sb, [r1] + ldrb r8, [r3, #2] + subs fp, sb, r2 + mov sb, r8, lsl #1 + movmi sl, #4 + ldrsh sb, [r7, sb] + rsbmi fp, fp, #0 + movpl sl, #0 + cmp fp, sb + orrge sl, sl, #2 + subge fp, fp, sb + cmp fp, sb, asr #1 + orrge sl, sl, #1 + mov fp, sb, asr #2 + tst sl, #2 + addne fp, fp, sb + tst sl, #1 + addne fp, fp, sb, asr #1 + tst sl, #4 + rsbne fp, fp, #0 + add sb, r2, fp + cmp sb, r6 + movlt sb, r6 + cmp sb, r6, lsr #17 + ldrsb r2, [r4, sl] + movgt sb, r5 + adds r8, r8, r2 + movmi r8, #0 + bmi _020B0C18 + cmp r8, #0x58 + movgt r8, #0x58 +_020B0C18: + strh sb, [r3] + strb r8, [r3, #2] + and r2, sl, #0xff + and sb, r8, #0xff + mov fp, sb, lsl #1 + ldrsh sl, [r3] + ldrsh r8, [r1, #2] + ldrsh fp, [r7, fp] + mov r2, r2, lsl #5 + subs ip, r8, sl + movmi r8, #4 + rsbmi ip, ip, #0 + movpl r8, #0 + cmp ip, fp + orrge r8, r8, #2 + subge ip, ip, fp + cmp ip, fp, asr #1 + orrge r8, r8, #1 + mov ip, fp, asr #2 + tst r8, #2 + addne ip, ip, fp + tst r8, #1 + addne ip, ip, fp, asr #1 + tst r8, #4 + rsbne ip, ip, #0 + add fp, sl, ip + cmp fp, r6 + movlt fp, r6 + cmp fp, r6, lsr #17 + ldrsb sl, [r4, r8] + movgt fp, r5 + and r2, r2, #0xff + adds sb, sb, sl + movmi sb, #0 + bmi _020B0CAC + cmp sb, #0x58 + movgt sb, #0x58 +_020B0CAC: + strh fp, [r3] + strb sb, [r3, #2] + and r8, r8, #0xff + orr r2, r2, r8, lsl #2 + and sb, sb, #0xff + mov fp, sb, lsl #1 + ldrsh sl, [r3] + ldrsh r8, [r1, #4] + ldrsh fp, [r7, fp] + and r2, r2, #0xff + subs ip, r8, sl + movmi r8, #4 + rsbmi ip, ip, #0 + movpl r8, #0 + cmp ip, fp + orrge r8, r8, #2 + subge ip, ip, fp + cmp ip, fp, asr #1 + orrge r8, r8, #1 + mov ip, fp, asr #2 + tst r8, #2 + addne ip, ip, fp + tst r8, #1 + addne ip, ip, fp, asr #1 + tst r8, #4 + rsbne ip, ip, #0 + add fp, sl, ip + cmp fp, r6 + movlt fp, r6 + cmp fp, r6, lsr #17 + ldrsb sl, [r4, r8] + movgt fp, r5 + adds sb, sb, sl + movmi sb, #0 + bmi _020B0D40 + cmp sb, #0x58 + movgt sb, #0x58 +_020B0D40: + strh fp, [r3] + and lr, r8, #0xff + strb sb, [r3, #2] + orr r2, r2, lr, asr #1 + strb r2, [r0] + ldrb sb, [r3, #2] + ldrsh r8, [r3] + ldrsh r2, [r1, #6] + mov sl, sb, lsl #1 + ldrsh sl, [r7, sl] + subs fp, r2, r8 + movmi r2, #4 + rsbmi fp, fp, #0 + movpl r2, #0 + cmp fp, sl + orrge r2, r2, #2 + subge fp, fp, sl + cmp fp, sl, asr #1 + orrge r2, r2, #1 + mov fp, sl, asr #2 + tst r2, #2 + addne fp, fp, sl + tst r2, #1 + addne fp, fp, sl, asr #1 + tst r2, #4 + rsbne fp, fp, #0 + add sl, r8, fp + cmp sl, r6 + movlt sl, r6 + cmp sl, r6, lsr #17 + ldrsb r8, [r4, r2] + movgt sl, r5 + adds sb, sb, r8 + movmi sb, #0 + bmi _020B0DD4 + cmp sb, #0x58 + movgt sb, #0x58 +_020B0DD4: + strh sl, [r3] + and r2, r2, #0xff + mov r2, r2, lsl #4 + strb sb, [r3, #2] + and r8, r2, #0xff + and ip, sb, #0xff + ldrsh r2, [r3] + ldrsh sb, [r1, #8] + subs fp, sb, r2 + mov sb, ip, lsl #1 + movmi sl, #4 + ldrsh sb, [r7, sb] + rsbmi fp, fp, #0 + movpl sl, #0 + cmp fp, sb + orrge sl, sl, #2 + subge fp, fp, sb + cmp fp, sb, asr #1 + orrge sl, sl, #1 + mov fp, sb, asr #2 + tst sl, #2 + addne fp, fp, sb + tst sl, #1 + addne fp, fp, sb, asr #1 + tst sl, #4 + rsbne fp, fp, #0 + add sb, r2, fp + cmp sb, r6 + movlt sb, r6 + cmp sb, r6, lsr #17 + ldrsb r2, [r4, sl] + movgt sb, r5 + adds ip, ip, r2 + movmi ip, #0 + bmi _020B0E68 + cmp ip, #0x58 + movgt ip, #0x58 +_020B0E68: + strh sb, [r3] + strb ip, [r3, #2] + and r2, sl, #0xff + orr r2, r8, r2, lsl #1 + and r8, r2, #0xff + ldrsh r2, [r3] + ldrsh sb, [r1, #0xa] + and ip, ip, #0xff + subs fp, sb, r2 + mov sb, ip, lsl #1 + movmi sl, #4 + ldrsh sb, [r7, sb] + rsbmi fp, fp, #0 + movpl sl, #0 + cmp fp, sb + orrge sl, sl, #2 + subge fp, fp, sb + cmp fp, sb, asr #1 + orrge sl, sl, #1 + mov fp, sb, asr #2 + tst sl, #2 + addne fp, fp, sb + tst sl, #1 + addne fp, fp, sb, asr #1 + tst sl, #4 + rsbne fp, fp, #0 + add r2, r2, fp + cmp r2, r6 + movlt r2, r6 + cmp r2, r6, lsr #17 + ldrsb sb, [r4, sl] + movgt r2, r5 + adds ip, ip, sb + movmi ip, #0 + bmi _020B0EFC + cmp ip, #0x58 + movgt ip, #0x58 +_020B0EFC: + strh r2, [r3] + orr r8, r8, lr, lsl #7 + and r2, sl, #0xff + strb ip, [r3, #2] + orr r8, r8, r2, asr #2 + strb r8, [r0, #1] + ldrb sb, [r3, #2] + ldrsh sl, [r3] + ldrsh r8, [r1, #0xc] + mov fp, sb, lsl #1 + ldrsh fp, [r7, fp] + subs ip, r8, sl + movmi r8, #4 + rsbmi ip, ip, #0 + movpl r8, #0 + cmp ip, fp + orrge r8, r8, #2 + subge ip, ip, fp + cmp ip, fp, asr #1 + orrge r8, r8, #1 + mov ip, fp, asr #2 + tst r8, #2 + addne ip, ip, fp + tst r8, #1 + addne ip, ip, fp, asr #1 + tst r8, #4 + rsbne ip, ip, #0 + add fp, sl, ip + cmp fp, r6 + movlt fp, r6 + cmp fp, r6, lsr #17 + ldrsb sl, [r4, r8] + movgt fp, r5 + adds sb, sb, sl + movmi sb, #0 + bmi _020B0F94 + cmp sb, #0x58 + movgt sb, #0x58 +_020B0F94: + strh fp, [r3] + and r8, r8, #0xff + mov r8, r8, lsl #3 + strb sb, [r3, #2] + and ip, r8, #0xff + and sl, sb, #0xff + ldrsh r8, [r1, #0xe] + ldrsh fp, [r3] + mov lr, sl, lsl #1 + ldrsh lr, [r7, lr] + subs sb, r8, fp + movmi r8, #4 + rsbmi sb, sb, #0 + movpl r8, #0 + cmp sb, lr + orrge r8, r8, #2 + subge sb, sb, lr + cmp sb, lr, asr #1 + orrge r8, r8, #1 + mov sb, lr, asr #2 + tst r8, #2 + addne sb, sb, lr + tst r8, #1 + addne sb, sb, lr, asr #1 + tst r8, #4 + rsbne sb, sb, #0 + add fp, fp, sb + cmp fp, r6 + movlt fp, r6 + cmp fp, r6, lsr #17 + ldrsb sb, [r4, r8] + movgt fp, r5 + add r1, r1, #0x10 + adds sl, sl, sb + movmi sl, #0 + bmi _020B102C + cmp sl, #0x58 + movgt sl, #0x58 +_020B102C: + and r8, r8, #0xff + strh fp, [r3] + orr r8, ip, r8 + strb sl, [r3, #2] + orr r2, r8, r2, lsl #6 + strb r2, [r0, #2] + ldr r2, [sp, #4] + add r0, r0, #3 + add r8, r2, #1 + ldr r2, [sp] + str r8, [sp, #4] + cmp r8, r2 + blo _020B0B98 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B1068: .word cAdpcmStepSizeTable +_020B106C: .word cAdpcmIndexTable3 + arm_func_end vct_encode_adpcm_24 + + arm_func_start vct_decode_adpcm_16 +vct_decode_adpcm_16: ; 0x020B1070 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r7, #0 + cmp r2, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0x8000 + ldr lr, _020B127C ; =0x00007FFF + ldr ip, _020B1280 ; =cAdpcmIndexTable2 + ldr r6, _020B1284 ; =cAdpcmStepSizeTable + rsb r4, r4, #0 + mov r5, r7 +_020B1098: + ldrb sl, [r0] + ldrb r8, [r3, #2] + ldrsh sb, [r3] + and fp, sl, #3 + mov sl, r8, lsl #1 + ldrsh sl, [r6, sl] + tst fp, #1 + moveq sl, r5 + tst fp, #2 + beq _020B10D0 + sub sb, sb, sl + cmp sb, r4 + movlt sb, r4 + b _020B10DC +_020B10D0: + add sb, sb, sl + cmp sb, lr + movgt sb, lr +_020B10DC: + ldrsb sl, [ip, fp] + adds r8, r8, sl + movmi r8, #0 + bmi _020B10F4 + cmp r8, #0x58 + movgt r8, #0x58 +_020B10F4: + mov sb, sb, lsl #0x10 + mov sb, sb, asr #0x10 + strh sb, [r3] + strb r8, [r3, #2] + strh sb, [r1] + ldrb sl, [r0] + ldrb r8, [r3, #2] + ldrsh sb, [r3] + mov sl, sl, asr #2 + and fp, sl, #3 + mov sl, r8, lsl #1 + ldrsh sl, [r6, sl] + tst fp, #1 + moveq sl, #0 + tst fp, #2 + beq _020B1144 + sub sb, sb, sl + cmp sb, r4 + movlt sb, r4 + b _020B1150 +_020B1144: + add sb, sb, sl + cmp sb, lr + movgt sb, lr +_020B1150: + ldrsb sl, [ip, fp] + adds r8, r8, sl + movmi r8, #0 + bmi _020B1168 + cmp r8, #0x58 + movgt r8, #0x58 +_020B1168: + mov sb, sb, lsl #0x10 + mov sb, sb, asr #0x10 + strh sb, [r3] + strb r8, [r3, #2] + strh sb, [r1, #2] + ldrb sl, [r0] + ldrb r8, [r3, #2] + ldrsh sb, [r3] + mov sl, sl, asr #4 + and fp, sl, #3 + mov sl, r8, lsl #1 + ldrsh sl, [r6, sl] + tst fp, #1 + moveq sl, #0 + tst fp, #2 + beq _020B11B8 + sub sb, sb, sl + cmp sb, r4 + movlt sb, r4 + b _020B11C4 +_020B11B8: + add sb, sb, sl + cmp sb, lr + movgt sb, lr +_020B11C4: + ldrsb sl, [ip, fp] + adds r8, r8, sl + movmi r8, #0 + bmi _020B11DC + cmp r8, #0x58 + movgt r8, #0x58 +_020B11DC: + mov sb, sb, lsl #0x10 + mov sb, sb, asr #0x10 + strh sb, [r3] + strb r8, [r3, #2] + strh sb, [r1, #4] + ldrb sl, [r0] + ldrb r8, [r3, #2] + ldrsh sb, [r3] + mov sl, sl, asr #6 + and fp, sl, #3 + mov sl, r8, lsl #1 + ldrsh sl, [r6, sl] + tst fp, #1 + moveq sl, #0 + tst fp, #2 + beq _020B122C + sub sb, sb, sl + cmp sb, r4 + movlt sb, r4 + b _020B1238 +_020B122C: + add sb, sb, sl + cmp sb, lr + movgt sb, lr +_020B1238: + ldrsb sl, [ip, fp] + adds r8, r8, sl + movmi r8, #0 + bmi _020B1250 + cmp r8, #0x58 + movgt r8, #0x58 +_020B1250: + mov sb, sb, lsl #0x10 + mov sb, sb, asr #0x10 + strh sb, [r3] + strb r8, [r3, #2] + add r7, r7, #1 + strh sb, [r1, #6] + add r1, r1, #8 + add r0, r0, #1 + cmp r7, r2 + blo _020B1098 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B127C: .word 0x00007FFF +_020B1280: .word cAdpcmIndexTable2 +_020B1284: .word cAdpcmStepSizeTable + arm_func_end vct_decode_adpcm_16 + + arm_func_start vct_encode_adpcm_16 +vct_encode_adpcm_16: ; 0x020B1288 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r2, r2, lsr #2 + mov fp, #0 + str r2, [sp] + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0x8000 + rsb r4, r4, #0 + ldr r5, _020B14B0 ; =cAdpcmStepSizeTable + ldr ip, _020B14B4 ; =cAdpcmIndexTable2 + mov lr, r4, lsr #0x11 +_020B12B0: + ldrb r7, [r3, #2] + ldrsh r6, [r3] + ldrsh r2, [r1] + mov r8, r7, lsl #1 + ldrsh r8, [r5, r8] + subs sb, r2, r6 + movmi r2, #2 + rsbmi sb, sb, #0 + movpl r2, #0 + cmp sb, r8 + orrge r2, r2, #1 + tst r2, #1 + moveq r8, #0 + tst r2, #2 + rsbne r8, r8, #0 + add r8, r6, r8 + cmp r8, r4 + movlt r8, r4 + cmp r8, r4, lsr #17 + ldrsb r6, [ip, r2] + movgt r8, lr + adds r7, r7, r6 + movmi r7, #0 + bmi _020B1318 + cmp r7, #0x58 + movgt r7, #0x58 +_020B1318: + strh r8, [r3] + strb r7, [r3, #2] + and r6, r2, #0xff + ldrsh sl, [r3] + ldrsh r2, [r1, #2] + and sb, r7, #0xff + subs r8, r2, sl + mov r2, sb, lsl #1 + movmi r7, #2 + ldrsh r2, [r5, r2] + rsbmi r8, r8, #0 + movpl r7, #0 + cmp r8, r2 + orrge r7, r7, #1 + tst r7, #1 + moveq r2, #0 + tst r7, #2 + rsbne r2, r2, #0 + add r8, sl, r2 + cmp r8, r4 + movlt r8, r4 + cmp r8, r4, lsr #17 + ldrsb r2, [ip, r7] + movgt r8, lr + adds sb, sb, r2 + movmi sb, #0 + bmi _020B138C + cmp sb, #0x58 + movgt sb, #0x58 +_020B138C: + strh r8, [r3] + strb sb, [r3, #2] + and r2, r7, #0xff + orr r2, r6, r2, lsl #2 + and r6, r2, #0xff + ldrsh sl, [r3] + ldrsh r2, [r1, #4] + and sb, sb, #0xff + subs r8, r2, sl + mov r2, sb, lsl #1 + movmi r7, #2 + ldrsh r2, [r5, r2] + rsbmi r8, r8, #0 + movpl r7, #0 + cmp r8, r2 + orrge r7, r7, #1 + tst r7, #1 + moveq r2, #0 + tst r7, #2 + rsbne r2, r2, #0 + add r8, sl, r2 + cmp r8, r4 + movlt r8, r4 + cmp r8, r4, lsr #17 + ldrsb r2, [ip, r7] + movgt r8, lr + adds sb, sb, r2 + movmi sb, #0 + bmi _020B1408 + cmp sb, #0x58 + movgt sb, #0x58 +_020B1408: + strh r8, [r3] + strb sb, [r3, #2] + and r2, r7, #0xff + orr r2, r6, r2, lsl #4 + and r6, r2, #0xff + ldrsh r2, [r1, #6] + ldrsh sl, [r3] + and sb, sb, #0xff + add r1, r1, #8 + subs r8, r2, sl + mov r2, sb, lsl #1 + movmi r7, #2 + ldrsh r2, [r5, r2] + rsbmi r8, r8, #0 + movpl r7, #0 + cmp r8, r2 + orrge r7, r7, #1 + tst r7, #1 + moveq r2, #0 + tst r7, #2 + rsbne r2, r2, #0 + add r8, sl, r2 + cmp r8, r4 + movlt r8, r4 + cmp r8, r4, lsr #17 + ldrsb r2, [ip, r7] + movgt r8, lr + adds sb, sb, r2 + movmi sb, #0 + bmi _020B1488 + cmp sb, #0x58 + movgt sb, #0x58 +_020B1488: + strh r8, [r3] + and r2, r7, #0xff + strb sb, [r3, #2] + orr r2, r6, r2, lsl #6 + strb r2, [r0], #1 + ldr r2, [sp] + add fp, fp, #1 + cmp fp, r2 + blo _020B12B0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B14B0: .word cAdpcmStepSizeTable +_020B14B4: .word cAdpcmIndexTable2 + arm_func_end vct_encode_adpcm_16 + + arm_func_start vct_decode_adpcm +vct_decode_adpcm: ; 0x020B14B8 + stmdb sp!, {r3, lr} + ldrsh ip, [r0] + cmp r3, #2 + strh ip, [sp] + ldrb ip, [r0, #2] + strb ip, [sp, #2] + beq _020B14E8 + cmp r3, #3 + beq _020B14FC + cmp r3, #4 + beq _020B1510 + ldmia sp!, {r3, pc} +_020B14E8: + add r3, sp, #0 + add r0, r0, #4 + sub r2, r2, #4 + bl vct_decode_adpcm_16 + ldmia sp!, {r3, pc} +_020B14FC: + add r3, sp, #0 + add r0, r0, #4 + sub r2, r2, #4 + bl vct_decode_adpcm_24 + ldmia sp!, {r3, pc} +_020B1510: + add r3, sp, #0 + add r0, r0, #4 + sub r2, r2, #4 + bl vct_decode_adpcm_32 + ldmia sp!, {r3, pc} + arm_func_end vct_decode_adpcm + + arm_func_start vct_encode_adpcm +vct_encode_adpcm: ; 0x020B1524 + stmdb sp!, {r4, lr} + ldrsh r4, [r3] + ldr ip, [sp, #8] + mov lr, #0 + strh r4, [r0] + ldrb r4, [r3, #2] + cmp ip, #2 + strb r4, [r0, #2] + strb lr, [r0, #3] + beq _020B1560 + cmp ip, #3 + beq _020B156C + cmp ip, #4 + beq _020B1578 + ldmia sp!, {r4, pc} +_020B1560: + add r0, r0, #4 + bl vct_encode_adpcm_16 + ldmia sp!, {r4, pc} +_020B156C: + add r0, r0, #4 + bl vct_encode_adpcm_24 + ldmia sp!, {r4, pc} +_020B1578: + add r0, r0, #4 + bl vct_encode_adpcm_32 + ldmia sp!, {r4, pc} + arm_func_end vct_encode_adpcm + + arm_func_start vct_init_audio +vct_init_audio: ; 0x020B1584 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bl OS_GetTickLo + ldr r2, _020B1668 ; =_021D6040 + ldr r1, _020B166C ; =sEnableVAD + mov r3, #1 + str r3, [r1] + strh r0, [r2] + mov r1, #0 + str r1, [r2, #0x20] + ldr r0, _020B1670 ; =__vct + str r1, [r2, #4] + ldr r0, [r0, #0x10] + ldr r3, _020B1674 ; =sCodecInfo + cmp r0, #1 + streq r1, [r2, #0x1c] + movne r0, #4 + strne r0, [r2, #0x1c] + ldr r1, _020B1668 ; =_021D6040 + mov r0, #0x440 + str r0, [r1, #0x24] + ldr r5, [r1, #0x1c] + mov r0, #0x44 + add r2, r3, r5, lsl #1 + ldrb r4, [r2, #1] + ldrb r3, [r3, r5, lsl #1] + mov r2, #0 + mla r0, r3, r0, r4 + add r0, r0, #0xc + str r0, [r1, #0xc] + str r2, [r1, #0xf00] + str r2, [r1, #0xf04] + str r2, [r1, #0xf0c] + str r2, [r1, #0xf08] + str r2, [r1, #0xf10] + str r2, [r1, #0xf14] + bl vct_init_vad + mov sb, #0 + mov r8, sb + ldr r7, _020B1678 ; =sAudioSession + ldr r6, _020B167C ; =sStream + mvn r5, #0 + mov r4, #0x94 + b _020B1650 +_020B1630: + mov r0, sb + str r8, [r7, sb, lsl #2] + bl vct_init_audio_queue + mla r0, sb, r4, r6 + mov r1, sb + mov r2, r5 + bl vct_init_stream + add sb, sb, #1 +_020B1650: + cmp sb, #3 + blo _020B1630 + bl vct_init_decoder + bl InitFIRFilter + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B1668: .word _021D6040 +_020B166C: .word sEnableVAD +_020B1670: .word __vct +_020B1674: .word sCodecInfo +_020B1678: .word sAudioSession +_020B167C: .word sStream + arm_func_end vct_init_audio + + arm_func_start vct_finish_audio +vct_finish_audio: ; 0x020B1680 + ldr r0, _020B1690 ; =_021D6040 + mov r1, #0 + str r1, [r0, #0x20] + bx lr + .align 2, 0 +_020B1690: .word _021D6040 + arm_func_end vct_finish_audio + + arm_func_start VCT_StartStreaming +VCT_StartStreaming: ; 0x020B1694 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _020B17C0 ; =_021D6040 + ldr r0, [r0, #0x20] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0xc] + cmp r0, #2 + cmpne r0, #3 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r4, #0 + ldr r1, _020B17C4 ; =sAudioSession + b _020B16EC +_020B16D8: + ldr r0, [r1, r4, lsl #2] + cmp r0, r5 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + add r4, r4, #1 +_020B16EC: + cmp r4, #3 + blo _020B16D8 + mov r4, #0 + ldr r1, _020B17C4 ; =sAudioSession + b _020B1714 +_020B1700: + ldr r0, [r1, r4, lsl #2] + cmp r0, #0 + streq r5, [r1, r4, lsl #2] + beq _020B171C + add r4, r4, #1 +_020B1714: + cmp r4, #3 + blo _020B1700 +_020B171C: + ldr r1, _020B17C0 ; =_021D6040 + ldr r2, _020B17C8 ; =sStream + ldr r3, [r1, #0x20] + mov r0, #0x94 + add r3, r3, #1 + str r3, [r1, #0x20] + ldr ip, [r1, #4] + ldr r3, [r5, #8] + mla r0, r4, r0, r2 + orr r2, ip, r3 + str r2, [r1, #4] + ldrb r2, [r5, #5] + mov r1, r4 + bl vct_init_stream + mov r0, r4 + bl vct_init_audio_queue + ldr r0, [r5, #0xc] + cmp r0, #2 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _020B17C0 ; =_021D6040 + ldr r0, [r0, #0x20] + cmp r0, #1 + bne _020B17B8 + bl VCT_ResetVAD + bl OS_GetTickLo + ldr r1, _020B17C0 ; =_021D6040 + mov r2, #0 + strh r0, [r1] + strh r2, [r1, #0x10] + strb r2, [r1, #0x12] + mov r0, #1 + str r0, [r1, #0x14] + str r2, [r1, #0xf00] + str r2, [r1, #0xf04] + str r2, [r1, #0xf0c] + str r2, [r1, #0xf08] + str r2, [r1, #0xf10] + str r2, [r1, #0xf14] +_020B17B8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B17C0: .word _021D6040 +_020B17C4: .word sAudioSession +_020B17C8: .word sStream + arm_func_end VCT_StartStreaming + + arm_func_start VCT_StopStreaming +VCT_StopStreaming: ; 0x020B17CC + stmdb sp!, {r3, r4, r5, lr} + ldr ip, _020B1874 ; =sAudioSession + mov r5, r0 + mov r4, #0 +_020B17DC: + ldr r0, [ip, r4, lsl #2] + cmp r0, r5 + bne _020B183C + ldr r1, _020B1878 ; =sStream + mov r0, #0x94 + mla r0, r4, r0, r1 + ldr r1, _020B187C ; =_021D6040 + mov r3, #0 + ldr r2, [r1, #0x20] + str r3, [ip, r4, lsl #2] + sub r2, r2, #1 + str r2, [r1, #0x20] + bl vct_reset_stream + mov r0, r4 + bl vct_flush_audio_queue + mov r0, r4 + bl vct_flush_decoder + ldr r0, _020B187C ; =_021D6040 + ldr r1, [r5, #8] + ldr r2, [r0, #4] + mvn r1, r1 + and r1, r2, r1 + str r1, [r0, #4] + b _020B1848 +_020B183C: + add r4, r4, #1 + cmp r4, #3 + blo _020B17DC +_020B1848: + ldr r0, _020B187C ; =_021D6040 + ldr r1, [r0, #0x20] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + str r1, [r0, #0x14] + bl VCT_ResetVAD + ldr r0, _020B187C ; =_021D6040 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B1874: .word sAudioSession +_020B1878: .word sStream +_020B187C: .word _021D6040 + arm_func_end VCT_StopStreaming + + arm_func_start VCT_SendAudio +VCT_SendAudio: ; 0x020B1880 + stmdb sp!, {r4, lr} + ldr r3, _020B1980 ; =_021D6040 + mov r2, r1 + ldr r1, [r3, #0x24] + mov ip, #0 + cmp r2, r1 + movne r0, ip + ldmneia sp!, {r4, pc} + ldr r1, [r3, #0x20] + cmp r1, #0 + moveq r0, ip + ldmeqia sp!, {r4, pc} + mov r4, ip + ldr r3, _020B1984 ; =sAudioSession + b _020B18DC +_020B18BC: + ldr r1, [r3, r4, lsl #2] + cmp r1, #0 + beq _020B18D8 + ldr r1, [r1, #0xc] + cmp r1, #2 + moveq ip, #1 + beq _020B18E4 +_020B18D8: + add r4, r4, #1 +_020B18DC: + cmp r4, #3 + blo _020B18BC +_020B18E4: + cmp ip, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, _020B1980 ; =_021D6040 + ldr ip, _020B1988 ; =sSendInfo + ldr r1, [r1, #0xf04] + ldr r3, _020B198C ; =0x5F564354 + tst r1, #1 + ldr r1, _020B1980 ; =_021D6040 + movne r4, #0 + moveq r4, #0x460 + ldr r1, [r1, #0x1c] + str r3, [ip, r4] + cmp r1, #2 + add r4, ip, r4 + blt _020B1930 + add r1, r4, #0x10 + bl MIi_CpuCopyFast + b _020B1938 +_020B1930: + add r1, r4, #0xc + bl MIi_CpuCopyFast +_020B1938: + ldr r0, _020B1980 ; =_021D6040 + mov r1, #0x40 + ldrh r2, [r0] + strb r1, [r4, #4] + add r1, r2, #1 + strh r1, [r0] + strh r2, [r4, #6] + bl OS_GetTick + mov r2, #0x40 + mov r3, #0 + bl _ll_udiv + str r0, [r4, #8] + ldr r1, _020B1980 ; =_021D6040 + mov r0, #1 + ldr r2, [r1, #0xf04] + add r2, r2, #1 + str r2, [r1, #0xf04] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B1980: .word _021D6040 +_020B1984: .word sAudioSession +_020B1988: .word sSendInfo +_020B198C: .word 0x5F564354 + arm_func_end VCT_SendAudio + + arm_func_start VCTi_ReceiveAudioData +VCTi_ReceiveAudioData: ; 0x020B1990 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r4, _020B1BD4 ; =sStream + mov sl, r2 + mov r2, #0x94 + mla r6, sl, r2, r4 + str r0, [sp] + mov r0, sl + str r1, [sp, #4] + mov fp, r3 + mov r7, #1 + bl vct_count_audio_queue + movs r4, r0 + beq _020B1BB0 +_020B19C8: + bl OS_GetTick + mov r8, r0 + mov r0, sl + mov sb, r1 + bl vct_top_audio_queue + movs r5, r0 + beq _020B1B98 + ldr r1, [r5, #0x46c] + adds r3, r8, #0x34 + ldr r0, [r5, #0x470] + adc r2, sb, #0 + cmp r0, r2 + cmpeq r1, r3 + bls _020B1A7C + ldr r0, [r5, #0x45c] + cmp r0, #0 + bne _020B1A70 + ldr r0, [r6, #0x3c] + cmp r0, #0 + beq _020B1A70 + ldr r0, [r6, #0x20] + ldr r1, [sp] + add r0, r0, #1 + str r0, [r6, #0x20] + ldr r0, [r6, #0x3c] + ldr r2, [sp, #4] + ldr r0, [r0, #0x474] + bl MIi_CpuCopyFast + ldr r0, [r6, #0x3c] + bl vct_free_packet_buffer + mov r0, #0 + str r0, [r6, #0x3c] + cmp fp, #0 + beq _020B1A64 + ldrb r0, [r5, #0x10] + ldr r2, [fp] + mov r1, #1 + orr r0, r2, r1, lsl r0 + str r0, [fp] +_020B1A64: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B1A70: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B1A7C: + ldr r2, _020B1BD8 ; =0x00008B4C + adds r2, r1, r2 + adc r0, r0, #0 + cmp sb, r0 + cmpeq r8, r2 + bls _020B1ABC + ldr r2, [r5, #0x18] + mov r0, r6 + mov r1, r5 + str r2, [r6, #0x58] + bl vct_save_previous_buffer + mov r4, r0 + mov r0, sl + bl vct_top_audio_queue + mov r7, #0 + b _020B1BA8 +_020B1ABC: + ldr r1, [r6, #0x58] + ldr r2, [r5, #0x18] + add r0, r1, #1 + cmp r0, r2 + cmpne r1, #0 + beq _020B1AF0 + cmp r1, r2 + bhi _020B1AF0 + ldr r0, [r5, #0x45c] + cmp r0, #0 + ldreq r0, [r6, #0x14] + addeq r0, r0, #1 + streq r0, [r6, #0x14] +_020B1AF0: + ldr r0, [r5, #0x18] + cmp r7, #0 + str r0, [r6, #0x58] + ldrne r0, [r6, #0x70] + cmpne r0, #0 + beq _020B1B30 + mov r0, r6 + mov r1, r5 + bl vct_save_previous_buffer + mov r4, r0 + mov r0, sl + bl vct_top_audio_queue + ldr r0, [r6, #0x70] + sub r0, r0, #1 + str r0, [r6, #0x70] + b _020B1BA8 +_020B1B30: + ldr r1, [r5, #0x464] + ldr r0, [r6, #0x28] + subs r1, r8, r1 + sub r0, r1, r0 + sub r0, r0, r1 + str r1, [r6, #0x28] + add r0, r1, r0, lsr #4 + str r0, [r6, #0x2c] + str r0, [r6] + ldr r0, [r5, #0x474] + ldr r1, [sp] + ldr r2, [sp, #4] + bl MIi_CpuCopyFast + mov r0, r6 + mov r1, r5 + bl vct_save_previous_buffer + cmp fp, #0 + beq _020B1B8C + ldrb r0, [r5, #0x10] + ldr r2, [fp] + mov r1, #1 + orr r0, r2, r1, lsl r0 + str r0, [fp] +_020B1B8C: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B1B98: + add sp, sp, #8 + str r4, [r6, #8] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B1BA8: + cmp r4, #0 + bne _020B19C8 +_020B1BB0: + ldr r0, [r6, #0x3c] + cmp r0, #0 + beq _020B1BC8 + bl vct_free_packet_buffer + mov r0, #0 + str r0, [r6, #0x3c] +_020B1BC8: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B1BD4: .word sStream +_020B1BD8: .word 0x00008B4C + arm_func_end VCTi_ReceiveAudioData + + arm_func_start VCT_ReceiveAudio +VCT_ReceiveAudio: ; 0x020B1BDC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r5, r2 + mov r7, r0 + movne r0, #0 + strne r0, [r5] + ldr r0, _020B1CF0 ; =_021D6040 + mov r6, r1 + ldr r1, [r0, #0x24] + mov r4, #0 + cmp r6, r1 + bne _020B1CB8 + ldr r0, [r0, #0x20] + cmp r0, #0 + beq _020B1CB8 + mov r8, r4 +_020B1C18: + mov r0, r7 + mov r1, r6 + mov r2, r8 + mov r3, r5 + bl VCTi_ReceiveAudioData + cmp r0, #1 + moveq r4, #1 + beq _020B1C44 + add r8, r8, #1 + cmp r8, #3 + blo _020B1C18 +_020B1C44: + cmp r4, #0 + beq _020B1CA4 + add sb, r8, #1 + cmp sb, #3 + moveq r4, #1 + beq _020B1CCC + bhs _020B1CCC + ldr r8, _020B1CF4 ; =_021D6234 +_020B1C64: + mov r0, r8 + mov r1, r6 + mov r2, sb + mov r3, r5 + bl VCTi_ReceiveAudioData + cmp r0, #1 + bne _020B1C94 + mov r0, r7 + mov r1, r8 + mov r2, r7 + mov r3, r6 + bl vct_mix_audio +_020B1C94: + add sb, sb, #1 + cmp sb, #3 + blo _020B1C64 + b _020B1CCC +_020B1CA4: + mov r1, r7 + mov r2, r6 + mov r0, #0 + bl MIi_CpuClearFast + b _020B1CCC +_020B1CB8: + mov r1, r7 + mov r2, r6 + mov r0, #0 + bl MIi_CpuClearFast + mov r4, #0 +_020B1CCC: + ldr r0, _020B1CF0 ; =_021D6040 + ldr r0, [r0, #0x18] + cmp r0, #0 + beq _020B1CE8 + mov r0, r7 + mov r1, r6 + bl vct_set_speaker_samples +_020B1CE8: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B1CF0: .word _021D6040 +_020B1CF4: .word _021D6234 + arm_func_end VCT_ReceiveAudio + + arm_func_start VCT_SetCodec +VCT_SetCodec: ; 0x020B1CF8 + cmp r0, #5 + movge r0, #0 + bxge lr + ldr r1, _020B1D5C ; =__vct + ldr r1, [r1, #0x10] + cmp r1, #1 + beq _020B1D20 + cmp r0, #1 + movls r0, #0 + bxls lr +_020B1D20: + ldr r2, _020B1D60 ; =sCodecInfo + 1 + ldr r1, _020B1D64 ; =sCodecInfo + ldrb ip, [r2, r0, lsl #1] + ldrb r3, [r1, r0, lsl #1] + mov r1, #0x44 + ldr r2, _020B1D68 ; =_021D6040 + mla r1, r3, r1, ip + add r1, r1, #0xc + str r1, [r2, #0xc] + str r0, [r2, #0x1c] + mov r0, #0 + strh r0, [r2, #0x10] + strb r0, [r2, #0x12] + mov r0, #1 + bx lr + .align 2, 0 +_020B1D5C: .word __vct +_020B1D60: .word sCodecInfo + 1 +_020B1D64: .word sCodecInfo +_020B1D68: .word _021D6040 + arm_func_end VCT_SetCodec + + arm_func_start VCT_EnableVAD +VCT_EnableVAD: ; 0x020B1D6C + stmdb sp!, {r4, lr} + ldr r1, _020B1D94 ; =sEnableVAD + mov r4, r0 + str r4, [r1] + bl VCT_ResetVAD + cmp r4, #0 + ldreq r0, _020B1D98 ; =_021D6040 + moveq r1, #1 + streq r1, [r0, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B1D94: .word sEnableVAD +_020B1D98: .word _021D6040 + arm_func_end VCT_EnableVAD + + arm_func_start VCT_EnableEchoCancel +VCT_EnableEchoCancel: ; 0x020B1D9C + ldr r1, _020B1DA8 ; =_021D6040 + str r0, [r1, #0x18] + bx lr + .align 2, 0 +_020B1DA8: .word _021D6040 + arm_func_end VCT_EnableEchoCancel + + arm_func_start vct_prepare_send_buffer +vct_prepare_send_buffer: ; 0x020B1DAC + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + ldr r0, _020B200C ; =_021D6040 + ldr r2, [r0, #0xf04] + ldr r1, [r0, #0xf00] + ldr r8, [r0, #0x1c] + sub r1, r2, r1 + cmp r1, #1 + subhi r1, r2, #1 + strhi r1, [r0, #0xf00] + movhi r1, #1 + cmp r1, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, _020B200C ; =_021D6040 + ldr r0, [r0, #0xf00] + tst r0, #1 + movne r1, #0 + moveq r1, #0x460 + ldr r0, _020B2010 ; =sSendInfo + cmp r8, #2 + add r5, r0, r1 + ldr r1, _020B200C ; =_021D6040 + add r4, r5, #0xc + addge r4, r4, #4 + ldr r1, [r1, #0x24] + mov r0, r4 + bl HPFFilter + ldr r1, _020B2014 ; =0x040002B0 + mov r2, #0 + mov r6, r0 + strh r2, [r1] + str r6, [r1, #8] +_020B1E34: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020B1E34 + ldr r0, _020B200C ; =_021D6040 + ldr r2, _020B2018 ; =0x040002B4 + ldr r1, [r0, #0x18] + ldr r7, [r2] + cmp r1, #0 + beq _020B1E68 + ldr r1, [r0, #0x24] + mov r0, r4 + mov r2, r7 + bl vct_process_fir +_020B1E68: + ldr r0, _020B201C ; =sEnableVAD + strb r8, [r5, #5] + ldr r0, [r0] + cmp r0, #0 + beq _020B1ED8 + mov r0, r6 + mov r1, r7 + mov r2, #0 + bl VCTi_GetVADStatus + ldr r1, _020B200C ; =_021D6040 + cmp r0, #0 + str r0, [r1, #0x28] + beq _020B1EB4 + cmp r0, #1 + beq _020B1ECC + cmp r0, #3 + moveq r0, #0x41 + streqb r0, [r5, #4] + b _020B1ED8 +_020B1EB4: + ldr r2, [r1, #0xf00] + add sp, sp, #4 + add r2, r2, #1 + str r2, [r1, #0xf00] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020B1ECC: + ldrb r0, [r5, #5] + orr r0, r0, #0x80 + strb r0, [r5, #5] +_020B1ED8: + ldr r0, _020B201C ; =sEnableVAD + ldr r0, [r0] + cmp r0, #0 + bne _020B1F0C + ldr r0, _020B200C ; =_021D6040 + ldr r1, [r0, #8] + cmp r1, #0 + beq _020B1F0C + ldrb r2, [r5, #5] + mov r1, #0 + str r1, [r0, #8] + orr r0, r2, #0x80 + strb r0, [r5, #5] +_020B1F0C: + ldr r0, _020B200C ; =_021D6040 + ldr r1, [r0, #0x14] + cmp r1, #0 + beq _020B1F30 + ldrb r2, [r5, #5] + mov r1, #0 + str r1, [r0, #0x14] + orr r0, r2, #0x80 + strb r0, [r5, #5] +_020B1F30: + cmp r8, #2 + blt _020B1F78 + ldrb r0, [r5, #5] + tst r0, #0x80 + beq _020B1F54 + ldr r0, _020B200C ; =_021D6040 + mov r1, #0 + strh r1, [r0, #0x10] + strb r1, [r0, #0x12] +_020B1F54: + ldr r0, _020B200C ; =_021D6040 + str r8, [sp] + ldr r2, [r0, #0x24] + ldr r3, _020B2020 ; =sAdpcmState + mov r1, r4 + sub r0, r4, #4 + mov r2, r2, lsr #1 + bl vct_encode_adpcm + b _020B1FBC +_020B1F78: + cmp r8, #1 + bne _020B1F9C + ldr r1, _020B200C ; =_021D6040 + mov r0, r4 + ldr r2, [r1, #0x24] + mov r1, r4 + mov r2, r2, lsr #1 + bl vct_encode_g711_ulaw + b _020B1FBC +_020B1F9C: + cmp r8, #0 + bne _020B1FBC + ldr r1, _020B200C ; =_021D6040 + mov r0, r4 + ldr r2, [r1, #0x24] + mov r1, r4 + mov r2, r2, lsr #1 + bl vct_encode_8bit_raw +_020B1FBC: + ldr r1, _020B200C ; =_021D6040 + ldr r0, _020B2024 ; =__vct + ldr r3, [r1, #4] + mov r2, #1 + str r3, [r1, #0xf0c] + ldrb r0, [r0] + mvn r0, r2, lsl r0 + and r0, r3, r0 + str r0, [r1, #0xf0c] + bl MATH_CountPopulation + sub r0, r0, #1 + ldr r1, _020B200C ; =_021D6040 + cmp r0, #7 + str r0, [r1, #0xf14] + movgt r0, #0 + movle r2, #0 + movle r0, r5 + strle r2, [r1, #0xf10] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020B200C: .word _021D6040 +_020B2010: .word sSendInfo +_020B2014: .word 0x040002B0 +_020B2018: .word 0x040002B4 +_020B201C: .word sEnableVAD +_020B2020: .word sAdpcmState +_020B2024: .word __vct + arm_func_end vct_prepare_send_buffer + + arm_func_start vct_handle_audio +vct_handle_audio: ; 0x020B2028 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _020B2204 ; =_021D6040 + mov sl, r0 + ldr r0, [r4, #0x20] + ldr r7, [sp, #0x28] + mov sb, r1 + mov r8, r2 + mov fp, r3 + mov r5, #0 + cmp r0, #0 + moveq r0, r5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _020B2208 ; =sStream + mov r2, r5 +_020B2060: + ldr r0, [r1, #0x38] + cmp sl, r0 + bne _020B207C + ldr r1, _020B2208 ; =sStream + mov r0, #0x94 + mla r5, r2, r0, r1 + b _020B208C +_020B207C: + add r2, r2, #1 + cmp r2, #3 + add r1, r1, #0x94 + blo _020B2060 +_020B208C: + cmp r5, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [sb, #4] + cmp r0, #0x41 + bne _020B20C0 + ldrh r2, [sb, #6] + mov r0, #0 + mov r1, #1 + str r2, [r5, #0x30] + str r0, [r5, #0x4c] + str r1, [r5, #0x6c] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B20C0: + cmp r0, #0x40 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r0, [sb, #5] + and r6, r0, #0x7f + cmp r6, #5 + str r6, [r5, #0x24] + movge r0, #0 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _020B220C ; =sCodecInfo + 1 + ldr r0, _020B2210 ; =sCodecInfo + ldrb r2, [r1, r6, lsl #1] + ldrb r1, [r0, r6, lsl #1] + mov r0, #0x44 + mla r0, r1, r0, r2 + add r0, r0, #0xc + cmp r8, r0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + movne r0, #1 + movne r1, r0, lsl sl + ldr r0, _020B2204 ; =_021D6040 + moveq r1, #1 + ldr r0, [r0, #4] + tst r0, r1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl vct_alloc_packet_buffer + movs r4, r0 + bne _020B2174 + ldr r0, [r5, #0x34] + bl vct_flush_audio_queue + ldr r0, [r5, #0x34] + bl vct_flush_decoder + bl vct_alloc_packet_buffer + movs r4, r0 + bne _020B2168 + bl vct_flush_all_audio_queue + bl vct_flush_all_decoder + bl vct_alloc_packet_buffer + mov r4, r0 +_020B2168: + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B2174: + add r0, r4, #0x5c + add r0, r0, #0x400 + sub r2, r8, #0xc + sub r1, r0, r2 + add r0, sb, #0xc + str r1, [sp] + bl MI_CpuCopy8 + ldr r0, [r5, #0x34] + sub r1, r8, #0xc + strb r0, [r4, #0x11] + ldr r0, [sp] + str r6, [r4, #0xc] + str r0, [r4, #0x474] + str r1, [r4, #0x14] + str fp, [r4, #0x464] + str r7, [r4, #0x468] + strb sl, [r4, #0x10] + ldrb r2, [sb, #5] + mov r0, r5 + mov r1, r4 + and r2, r2, #0x80 + str r2, [r4, #0x45c] + ldr r2, [sb, #8] + str r2, [r4, #0x460] + ldrh r2, [sb, #6] + str r2, [r4, #0x18] + bl vct_calc_jitter_and_skew + cmp r0, #0 + mov r0, r4 + bne _020B21F8 + bl vct_free_packet_buffer + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B21F8: + bl vct_insert_decoder + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B2204: .word _021D6040 +_020B2208: .word sStream +_020B220C: .word sCodecInfo + 1 +_020B2210: .word sCodecInfo + arm_func_end vct_handle_audio + + arm_func_start vct_decode_audio_buffer +vct_decode_audio_buffer: ; 0x020B2214 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + bl vct_top_decoder + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + bl OS_DisableInterrupts + ldrb r6, [r4, #0x11] + mov r7, r0 + mov r0, r6 + bl vct_count_decoder_queue + mov r5, r0 + cmp r5, #0 + mov r4, #0 + ble _020B22D4 +_020B224C: + mov r0, r6 + bl vct_get_packet_from_decoder + mov r8, r0 + ldr r3, [r8, #0xc] + cmp r3, #2 + blt _020B2278 + ldr r0, [r8, #0x474] + ldr r2, [r8, #0x14] + add r1, r8, #0x1c + bl vct_decode_adpcm + b _020B229C +_020B2278: + cmp r3, #1 + ldr r0, [r8, #0x474] + ldr r2, [r8, #0x14] + bne _020B2294 + add r1, r8, #0x1c + bl vct_decode_g711_ulaw + b _020B229C +_020B2294: + add r1, r8, #0x1c + bl vct_decode_8bit_raw +_020B229C: + add r1, r8, #0x1c + mov r0, r8 + str r1, [r8, #0x474] + bl vct_remove_packet_from_decoder + ldrb r1, [r8, #0x11] + mov r0, r8 + bl vct_insert_audio_queue + cmp r0, #0 + bge _020B22C8 + mov r0, r8 + bl vct_free_packet_buffer +_020B22C8: + add r4, r4, #1 + cmp r4, r5 + blt _020B224C +_020B22D4: + mov r0, r7 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end vct_decode_audio_buffer + + arm_func_start vct_flush_send_buffer +vct_flush_send_buffer: ; 0x020B22E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _020B23E4 ; =_021D6040 + ldr r0, [r1, #0x20] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r1, #0xf08] + cmp r0, #0 + bne _020B232C + bl vct_prepare_send_buffer + ldr r1, _020B23E4 ; =_021D6040 + cmp r0, #0 + str r0, [r1, #0xf08] + ldrne r0, [r1, #0x18] + cmpne r0, #0 + movne r0, #0 + moveq r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B232C: + ldr r0, _020B23E8 ; =__vct + mov r5, #1 + ldr r0, [r0, #0x10] + cmp r0, #2 + bne _020B2360 + ldr r3, [r1, #0xf10] + ldr r0, _020B23EC ; =sTransceiverBalance + add r2, r3, #1 + str r2, [r1, #0xf10] + ldr r1, [r1, #0xf14] + add r1, r1, r1, lsl #1 + add r0, r0, r1 + ldrb r5, [r3, r0] +_020B2360: + mov r4, #0 + mov r7, #0x80000000 + ldr r6, _020B23E4 ; =_021D6040 + b _020B23D4 +_020B2370: + ldr r1, [r6, #0xf0c] + mov r2, r1 + clz r2, r2 + cmp r2, #0x20 + beq _020B23DC + mvn r0, r7, lsr r2 + and r0, r1, r0 + str r0, [r6, #0xf0c] + rsb r0, r2, #0x1f + ldr r1, [r6, #0xf08] + ldr r2, [r6, #0xc] + and r0, r0, #0xff + bl DWC_SendUnreliable + ldr r0, [r6, #0xf0c] + cmp r0, #0 + bne _020B23D0 + ldr r0, _020B23E4 ; =_021D6040 + mov r1, #0 + ldr r2, [r0, #0xf00] + add r2, r2, #1 + str r2, [r0, #0xf00] + str r1, [r0, #0xf08] + str r1, [r0, #0xf0c] + b _020B23DC +_020B23D0: + add r4, r4, #1 +_020B23D4: + cmp r4, r5 + blt _020B2370 +_020B23DC: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B23E4: .word _021D6040 +_020B23E8: .word __vct +_020B23EC: .word sTransceiverBalance + arm_func_end vct_flush_send_buffer + + arm_func_start vct_init_decoder +vct_init_decoder: ; 0x020B23F0 + stmdb sp!, {r3, lr} + bl OS_DisableInterrupts + mov r3, #0 + ldr r1, _020B2428 ; =_021D6F58 + mov r2, r3 + str r3, [r1, #4] + str r3, [r1] + ldr r1, _020B242C ; =_021D6F60 +_020B2410: + str r2, [r1, r3, lsl #2] + add r3, r3, #1 + cmp r3, #3 + blt _020B2410 + bl OS_RestoreInterrupts + ldmia sp!, {r3, pc} + .align 2, 0 +_020B2428: .word _021D6F58 +_020B242C: .word _021D6F60 + arm_func_end vct_init_decoder + + arm_func_start vct_flush_decoder +vct_flush_decoder: ; 0x020B2430 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, r6 + bl vct_get_packet_from_decoder + movs r5, r0 + beq _020B2470 +_020B2450: + mov r0, r5 + bl vct_remove_packet_from_decoder + mov r0, r5 + bl vct_free_packet_buffer + mov r0, r6 + bl vct_get_packet_from_decoder + movs r5, r0 + bne _020B2450 +_020B2470: + ldr r1, _020B2488 ; =_021D6F60 + mov r2, #0 + mov r0, r4 + str r2, [r1, r6, lsl #2] + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B2488: .word _021D6F60 + arm_func_end vct_flush_decoder + + arm_func_start vct_flush_all_decoder +vct_flush_all_decoder: ; 0x020B248C + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + ldr r1, _020B24F0 ; =_021D6F58 + mov r4, r0 + ldr r5, [r1] + cmp r5, #0 + beq _020B24BC +_020B24A8: + mov r0, r5 + ldr r5, [r5, #8] + bl vct_free_packet_buffer + cmp r5, #0 + bne _020B24A8 +_020B24BC: + ldr r0, _020B24F0 ; =_021D6F58 + mov r2, #0 + str r2, [r0] + str r2, [r0, #4] + ldr r0, _020B24F4 ; =_021D6F60 + mov r1, r2 +_020B24D4: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #3 + blt _020B24D4 + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B24F0: .word _021D6F58 +_020B24F4: .word _021D6F60 + arm_func_end vct_flush_all_decoder + + arm_func_start vct_insert_decoder +vct_insert_decoder: ; 0x020B24F8 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020B2578 ; =_021D6F58 + ldr r2, [r1] + cmp r2, #0 + bne _020B2534 + str r4, [r1] + mov r3, #0 + str r3, [r4, #4] + ldr r2, [r1] + str r3, [r2, #8] + ldr r2, [r1] + str r2, [r1, #4] + b _020B2550 +_020B2534: + ldr r3, [r1, #4] + mov r2, #0 + str r3, [r4, #4] + str r2, [r4, #8] + ldr r2, [r1, #4] + str r4, [r2, #8] + str r4, [r1, #4] +_020B2550: + ldrb r2, [r4, #0x11] + ldr r3, _020B257C ; =_021D6F60 + ldr r1, [r3, r2, lsl #2] + add r1, r1, #1 + str r1, [r3, r2, lsl #2] + bl OS_RestoreInterrupts + ldrb r1, [r4, #0x11] + ldr r0, _020B257C ; =_021D6F60 + ldr r0, [r0, r1, lsl #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B2578: .word _021D6F58 +_020B257C: .word _021D6F60 + arm_func_end vct_insert_decoder + + arm_func_start vct_top_decoder +vct_top_decoder: ; 0x020B2580 + ldr r0, _020B258C ; =_021D6F58 + ldr r0, [r0] + bx lr + .align 2, 0 +_020B258C: .word _021D6F58 + arm_func_end vct_top_decoder + + arm_func_start vct_count_decoder_queue +vct_count_decoder_queue: ; 0x020B2590 + ldr r1, _020B259C ; =_021D6F60 + ldr r0, [r1, r0, lsl #2] + bx lr + .align 2, 0 +_020B259C: .word _021D6F60 + arm_func_end vct_count_decoder_queue + + arm_func_start vct_get_packet_from_decoder +vct_get_packet_from_decoder: ; 0x020B25A0 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020B25EC ; =_021D6F58 + mov r5, r0 + ldr r4, [r1] + bl OS_DisableInterrupts + cmp r4, #0 + beq _020B25E0 +_020B25BC: + ldrb r1, [r4, #0x11] + cmp r1, r5 + bne _020B25D4 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} +_020B25D4: + ldr r4, [r4, #8] + cmp r4, #0 + bne _020B25BC +_020B25E0: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B25EC: .word _021D6F58 + arm_func_end vct_get_packet_from_decoder + + arm_func_start vct_remove_packet_from_decoder +vct_remove_packet_from_decoder: ; 0x020B25F0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r2, [r4, #4] + cmp r2, #0 + ldrne r1, [r4, #8] + strne r1, [r2, #8] + bne _020B2628 + ldr r2, [r4, #8] + ldr r1, _020B267C ; =_021D6F58 + cmp r2, #0 + str r2, [r1] + movne r1, #0 + strne r1, [r2, #4] +_020B2628: + ldr r2, [r4, #8] + cmp r2, #0 + ldrne r1, [r4, #4] + strne r1, [r2, #4] + bne _020B2654 + ldr r2, [r4, #4] + ldr r1, _020B267C ; =_021D6F58 + cmp r2, #0 + str r2, [r1, #4] + movne r1, #0 + strne r1, [r2, #8] +_020B2654: + ldrb r2, [r4, #0x11] + ldr r3, _020B2680 ; =_021D6F60 + ldr r1, [r3, r2, lsl #2] + sub r1, r1, #1 + str r1, [r3, r2, lsl #2] + bl OS_RestoreInterrupts + ldrb r1, [r4, #0x11] + ldr r0, _020B2680 ; =_021D6F60 + ldr r0, [r0, r1, lsl #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B267C: .word _021D6F58 +_020B2680: .word _021D6F60 + arm_func_end vct_remove_packet_from_decoder + + arm_func_start vct_encode_g711_ulaw +vct_encode_g711_ulaw: ; 0x020B2684 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r7, #0 + cmp r2, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr ip, _020B2728 ; =0x00001FDF + ldr r3, _020B272C ; =ulaw_segment + mov lr, #0xff + mov r4, #0x7f +_020B26A4: + mov r5, r7, lsl #1 + ldrsh r5, [r1, r5] + mov fp, r3 + movs sl, r5, asr #2 + movmi r6, r4 + ldr r5, _020B2728 ; =0x00001FDF + rsbmi sl, sl, #0 + movpl r6, lr + cmp sl, r5 + movgt sl, ip + mov r5, #0 + add sb, sl, #0x21 +_020B26D4: + ldr r8, [fp], #4 + cmp sb, r8 + ble _020B26F0 + add r5, r5, #1 + cmp r5, #8 + blt _020B26D4 + mov r5, #8 +_020B26F0: + cmp r5, #8 + eorge r5, r6, #0x7f + bge _020B2714 + add sb, sl, #0x21 + add r8, r5, #1 + mov r8, sb, asr r8 + and r8, r8, #0xf + orr r5, r8, r5, lsl #4 + eor r5, r5, r6 +_020B2714: + strb r5, [r0, r7] + add r7, r7, #1 + cmp r7, r2 + blo _020B26A4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B2728: .word 0x00001FDF +_020B272C: .word ulaw_segment + arm_func_end vct_encode_g711_ulaw + + arm_func_start vct_decode_g711_ulaw +vct_decode_g711_ulaw: ; 0x020B2730 + stmdb sp!, {r4, lr} + mov r4, #0 + cmp r2, #0 + ldmlsia sp!, {r4, pc} +_020B2740: + ldrb r3, [r0, r4] + mvn lr, r3 + mov r3, lr, lsl #0x1c + mov ip, r3, lsr #0x19 + and r3, lr, #0x70 + add ip, ip, #0x84 + mov r3, r3, asr #4 + mov r3, ip, lsl r3 + tst lr, #0x80 + rsbne ip, r3, #0x84 + subeq ip, r3, #0x84 + mov r3, r4, lsl #1 + add r4, r4, #1 + strh ip, [r1, r3] + cmp r4, r2 + blo _020B2740 + ldmia sp!, {r4, pc} + arm_func_end vct_decode_g711_ulaw + + arm_func_start vct_encode_8bit_raw +vct_encode_8bit_raw: ; 0x020B2784 + cmp r2, #0 + mov ip, #0 + bxls lr +_020B2790: + mov r3, ip, lsl #1 + ldrsh r3, [r1, r3] + mov r3, r3, asr #8 + strb r3, [r0, ip] + add ip, ip, #1 + cmp ip, r2 + blo _020B2790 + bx lr + arm_func_end vct_encode_8bit_raw + + arm_func_start vct_decode_8bit_raw +vct_decode_8bit_raw: ; 0x020B27B0 + stmdb sp!, {r3, lr} + cmp r2, #0 + mov lr, #0 + ldmlsia sp!, {r3, pc} +_020B27C0: + ldrsb ip, [r0, lr] + mov r3, lr, lsl #1 + add lr, lr, #1 + mov ip, ip, lsl #8 + strh ip, [r1, r3] + cmp lr, r2 + blo _020B27C0 + ldmia sp!, {r3, pc} + arm_func_end vct_decode_8bit_raw + + arm_func_start vct_init_audio_queue +vct_init_audio_queue: ; 0x020B27E0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r3, _020B2810 ; =_021D6F84 + mov ip, #0 + ldr r1, _020B2814 ; =_021D6F78 + ldr r2, _020B2818 ; =_021D6F6C + str ip, [r3, r4, lsl #2] + str ip, [r2, r4, lsl #2] + str ip, [r1, r4, lsl #2] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020B2810: .word _021D6F84 +_020B2814: .word _021D6F78 +_020B2818: .word _021D6F6C + arm_func_end vct_init_audio_queue + + arm_func_start vct_flush_audio_queue +vct_flush_audio_queue: ; 0x020B281C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r7, _020B2880 ; =_021D6F6C + mov r4, r0 + ldr r0, [r7, r5, lsl #2] + cmp r0, #0 + beq _020B2860 + mov r6, #0 +_020B2840: + ldr r1, [r0, #8] + str r1, [r7, r5, lsl #2] + cmp r1, #0 + strne r6, [r1, #4] + bl vct_free_packet_buffer + ldr r0, [r7, r5, lsl #2] + cmp r0, #0 + bne _020B2840 +_020B2860: + ldr r2, _020B2884 ; =_021D6F84 + mov r3, #0 + ldr r1, _020B2888 ; =_021D6F78 + mov r0, r4 + str r3, [r2, r5, lsl #2] + str r3, [r1, r5, lsl #2] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B2880: .word _021D6F6C +_020B2884: .word _021D6F84 +_020B2888: .word _021D6F78 + arm_func_end vct_flush_audio_queue + + arm_func_start vct_flush_all_audio_queue +vct_flush_all_audio_queue: ; 0x020B288C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bl OS_DisableInterrupts + mov r6, #0 + mov r5, r0 + mov sl, r6 + ldr r4, _020B2900 ; =_021D6F6C + mov sb, r6 + ldr r8, _020B2904 ; =_021D6F84 + ldr r7, _020B2908 ; =_021D6F78 + b _020B28EC +_020B28B4: + ldr r0, [r4, r6, lsl #2] + cmp r0, #0 + beq _020B28E0 +_020B28C0: + ldr r1, [r0, #8] + str r1, [r4, r6, lsl #2] + cmp r1, #0 + strne sl, [r1, #4] + bl vct_free_packet_buffer + ldr r0, [r4, r6, lsl #2] + cmp r0, #0 + bne _020B28C0 +_020B28E0: + str sb, [r8, r6, lsl #2] + str sb, [r7, r6, lsl #2] + add r6, r6, #1 +_020B28EC: + cmp r6, #3 + blt _020B28B4 + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020B2900: .word _021D6F6C +_020B2904: .word _021D6F84 +_020B2908: .word _021D6F78 + arm_func_end vct_flush_all_audio_queue + + arm_func_start vct_insert_audio_queue +vct_insert_audio_queue: ; 0x020B290C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #3 + mvnhs r0, #0 + ldmhsia sp!, {r3, r4, r5, pc} + bl OS_DisableInterrupts + ldr ip, _020B2A00 ; =_021D6F6C + ldr r1, [ip, r4, lsl #2] + cmp r1, #0 + bne _020B2964 + str r5, [ip, r4, lsl #2] + mov r3, #0 + str r3, [r5, #4] + ldr r2, [ip, r4, lsl #2] + ldr r1, _020B2A04 ; =_021D6F84 + str r3, [r2, #8] + ldr r2, [ip, r4, lsl #2] + str r2, [r1, r4, lsl #2] + b _020B29E0 +_020B2964: + ldr r1, _020B2A04 ; =_021D6F84 + ldr r3, [r1, r4, lsl #2] + cmp r3, #0 + beq _020B29C0 + ldr r2, [r5, #0x18] +_020B2978: + ldr r1, [r3, #0x18] + cmp r1, r2 + bhs _020B29B4 + str r3, [r5, #4] + ldr r1, [r3, #8] + ldr r2, _020B2A04 ; =_021D6F84 + str r1, [r5, #8] + str r5, [r3, #8] + ldr r1, [r5, #8] + cmp r1, #0 + strne r5, [r1, #4] + ldr r1, [r2, r4, lsl #2] + cmp r3, r1 + streq r5, [r2, r4, lsl #2] + b _020B29E0 +_020B29B4: + ldr r3, [r3, #4] + cmp r3, #0 + bne _020B2978 +_020B29C0: + mov r1, #0 + ldr r2, _020B2A00 ; =_021D6F6C + str r1, [r5, #4] + ldr r1, [r2, r4, lsl #2] + str r1, [r5, #8] + ldr r1, [r2, r4, lsl #2] + str r5, [r1, #4] + str r5, [r2, r4, lsl #2] +_020B29E0: + ldr r2, _020B2A08 ; =_021D6F78 + ldr r1, [r2, r4, lsl #2] + add r1, r1, #1 + str r1, [r2, r4, lsl #2] + bl OS_RestoreInterrupts + ldr r0, _020B2A08 ; =_021D6F78 + ldr r0, [r0, r4, lsl #2] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B2A00: .word _021D6F6C +_020B2A04: .word _021D6F84 +_020B2A08: .word _021D6F78 + arm_func_end vct_insert_audio_queue + + arm_func_start vct_top_audio_queue +vct_top_audio_queue: ; 0x020B2A0C + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020B2A44 ; =_021D6F6C + ldr r1, [r1, r4, lsl #2] + cmp r1, #0 + beq _020B2A38 + bl OS_RestoreInterrupts + ldr r0, _020B2A44 ; =_021D6F6C + ldr r0, [r0, r4, lsl #2] + ldmia sp!, {r4, pc} +_020B2A38: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B2A44: .word _021D6F6C + arm_func_end vct_top_audio_queue + + arm_func_start vct_pop_audio_queue +vct_pop_audio_queue: ; 0x020B2A48 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr ip, _020B2AA4 ; =_021D6F6C + ldr r1, [ip, r4, lsl #2] + cmp r1, #0 + beq _020B2A94 + ldr r2, _020B2AA8 ; =_021D6F78 + ldr r3, [r1, #8] + ldr r1, [r2, r4, lsl #2] + str r3, [ip, r4, lsl #2] + sub r1, r1, #1 + str r1, [r2, r4, lsl #2] + cmp r3, #0 + movne r1, #0 + strne r1, [r3, #4] + ldreq r1, _020B2AAC ; =_021D6F84 + moveq r2, #0 + streq r2, [r1, r4, lsl #2] +_020B2A94: + bl OS_RestoreInterrupts + ldr r0, _020B2AA8 ; =_021D6F78 + ldr r0, [r0, r4, lsl #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B2AA4: .word _021D6F6C +_020B2AA8: .word _021D6F78 +_020B2AAC: .word _021D6F84 + arm_func_end vct_pop_audio_queue + + arm_func_start vct_count_audio_queue +vct_count_audio_queue: ; 0x020B2AB0 + ldr r1, _020B2ABC ; =_021D6F78 + ldr r0, [r1, r0, lsl #2] + bx lr + .align 2, 0 +_020B2ABC: .word _021D6F78 + arm_func_end vct_count_audio_queue + + arm_func_start vct_init_stream +vct_init_stream: ; 0x020B2AC0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r4, r2 + mov r1, #0 + mov r2, #0x28 + mov r6, r0 + bl MI_CpuFill8 + ldr r0, _020B2B48 ; =0x000134DF + mov r1, #0 + str r0, [r6, #4] + str r1, [r6, #0x28] + str r1, [r6, #0x2c] + str r5, [r6, #0x34] + str r4, [r6, #0x38] + str r1, [r6, #0x7c] + str r1, [r6, #0x80] + str r1, [r6, #0x84] + str r1, [r6, #0x88] + str r0, [r6, #0x8c] + str r1, [r6, #0x90] + str r1, [r6, #0x4c] + str r1, [r6, #0x44] + str r1, [r6, #0x48] + str r1, [r6, #0x6c] + str r1, [r6, #0x70] + str r1, [r6, #0x50] + str r1, [r6, #0x54] + str r1, [r6, #0x58] + mov r0, #1 + str r0, [r6, #0x5c] + str r1, [r6, #0x3c] + str r1, [r6, #0x40] + str r1, [r6, #0x30] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B2B48: .word 0x000134DF + arm_func_end vct_init_stream + + arm_func_start vct_reset_stream +vct_reset_stream: ; 0x020B2B4C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x3c] + cmp r0, #0 + beq _020B2B6C + bl vct_free_packet_buffer + mov r0, #0 + str r0, [r4, #0x3c] +_020B2B6C: + mvn r0, #0 + str r0, [r4, #0x38] + ldmia sp!, {r4, pc} + arm_func_end vct_reset_stream + + arm_func_start vct_save_previous_buffer +vct_save_previous_buffer: ; 0x020B2B78 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0x3c] + mov r4, r1 + cmp r0, #0 + beq _020B2B94 + bl vct_free_packet_buffer +_020B2B94: + str r4, [r5, #0x3c] + ldr r0, [r5, #0x34] + bl vct_pop_audio_queue + ldmia sp!, {r3, r4, r5, pc} + arm_func_end vct_save_previous_buffer + + arm_func_start vct_init_sequence +vct_init_sequence: ; 0x020B2BA4 + ldr r2, _020B2BC0 ; =0x00010001 + strh r1, [r0, #0x68] + str r2, [r0, #0x64] + mov r1, #0 + str r1, [r0, #0x60] + str r1, [r0, #0x5c] + bx lr + .align 2, 0 +_020B2BC0: .word 0x00010001 + arm_func_end vct_init_sequence + + arm_func_start vct_update_sequence +vct_update_sequence: ; 0x020B2BC4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrh ip, [r6, #0x68] + mov r4, r2 + ldr r3, _020B2C94 ; =0x00000BB8 + sub r2, r4, ip + mov r2, r2, lsl #0x10 + mov r5, r1 + cmp r3, r2, lsr #16 + mov r2, r2, lsr #0x10 + bls _020B2C08 + cmp r4, ip + ldrlo r0, [r6, #0x60] + addlo r0, r0, #0x10000 + strlo r0, [r6, #0x60] + strh r4, [r6, #0x68] + b _020B2C80 +_020B2C08: + ldr r1, _020B2C98 ; =0x0000FF9C + cmp r2, r1 + bhi _020B2C54 + ldr r1, [r6, #0x64] + cmp r4, r1 + bne _020B2C3C + mov r1, r4 + bl vct_init_sequence + sub r0, r4, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r6, #0x54] + b _020B2C80 +_020B2C3C: + add r0, r4, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r6, #0x64] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020B2C54: + ldr r0, [r6, #0x54] + ldr r1, [r6, #0x60] + add r0, r0, #0x39c + add r1, r4, r1 + add r0, r0, #0xfc00 + cmp r1, r0 + bls _020B2C80 + sub r0, r1, #0x10000 + str r0, [r5, #0x18] + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020B2C80: + ldr r1, [r6, #0x60] + mov r0, #1 + add r1, r4, r1 + str r1, [r5, #0x18] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B2C94: .word 0x00000BB8 +_020B2C98: .word 0x0000FF9C + arm_func_end vct_update_sequence + + arm_func_start vct_calc_jitter_and_skew +vct_calc_jitter_and_skew: ; 0x020B2C9C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r2, [r7, #0x5c] + mov r6, r1 + cmp r2, #0 + mov r5, #0 + beq _020B2CCC + ldr r1, [r6, #0x18] + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bl vct_init_sequence + b _020B2D64 +_020B2CCC: + ldr r2, [r6, #0x18] + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + bl vct_update_sequence + cmp r0, #0 + bne _020B2CF8 + ldr r1, [r7, #0x14] + mov r0, r5 + add r1, r1, #1 + str r1, [r7, #0x14] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B2CF8: + ldr r0, [r6, #0x18] + str r0, [r7, #0x10] + ldr r1, [r6, #0x18] + ldr r2, [r7, #0x54] + cmp r2, r1 + bne _020B2D24 + ldr r1, [r7, #0x14] + mov r0, r5 + add r1, r1, #1 + str r1, [r7, #0x14] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B2D24: + add r0, r2, #1 + cmp r0, r1 + beq _020B2D64 + ldr r0, [r6, #0x45c] + cmp r0, #0 + bne _020B2D64 + subs r0, r1, r2 + rsbmi r0, r0, #0 + cmp r0, #0x64 + strgt r1, [r7, #0x54] + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, pc} + cmp r2, r1 + ldrhi r0, [r7, #0x1c] + addhi r0, r0, #1 + strhi r0, [r7, #0x1c] +_020B2D64: + ldr r0, [r6, #0x18] + str r0, [r7, #0x54] + ldr r0, [r7, #0x4c] + cmp r0, #0 + bne _020B2D9C + ldr r1, [r6, #0x460] + add r0, r6, #0x64 + str r1, [r7, #0x4c] + add r1, r0, #0x400 + add r0, r7, #0x44 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + mov r0, #0 + str r0, [r7, #0x6c] +_020B2D9C: + ldr r2, [r6, #0x460] + ldr r0, [r7, #0x4c] + ldr r3, [r6, #0x464] + ldr r1, [r7, #0x44] + sub r0, r2, r0 + ldr r2, [r7, #0x80] + mov r0, r0, lsl #6 + subs r1, r3, r1 + subs r4, r0, r1 + cmp r2, #0 + beq _020B2DD4 + ldr r1, [r6, #0x45c] + cmp r1, #0 + beq _020B2DDC +_020B2DD4: + str r4, [r7, #0x80] + b _020B2E50 +_020B2DDC: + str r4, [r7, #0x80] + subs r1, r4, r2 + ldr r2, [r7, #0x7c] + rsbmi r1, r1, #0 + add r2, r2, #0x318 + add r2, r2, #0x8800 + mov ip, r2, lsl #1 + ldr r3, _020B302C ; =0x0000CC8D + mov r2, #0 + adds r3, ip, r3 + mov lr, r1, asr #0x1f + adc r2, r2, ip, asr #31 + cmp lr, r2 + cmpeq r1, r3 + bls _020B2E30 + ldr ip, _020B3030 ; =0x75CA82CB + mov r2, r1, lsr #0x1f + smull r3, lr, ip, r1 + add lr, r2, lr, asr #14 + add r2, lr, #2 + str r2, [r7, #0x84] +_020B2E30: + ldr r2, [r7, #0x84] + cmp r2, #0 + bgt _020B2E50 + ldr r2, [r7, #0x7c] + sub r1, r1, r2 + add r1, r2, r1, asr #4 + str r1, [r7, #0x7c] + str r1, [r7, #0x18] +_020B2E50: + ldr r2, [r7, #0x44] + ldr r3, [r7, #4] + ldr r1, [r7, #0x48] + adds r2, r0, r2 + adc r0, r1, #0 + adds r1, r3, r2 + str r1, [r6, #0x46c] + adc r0, r0, #0 + str r0, [r6, #0x470] + bl OS_GetTick + ldr ip, [r6, #0x46c] + ldr r2, _020B3034 ; =0x00008B18 + ldr lr, [r6, #0x470] + adds r6, ip, r2 + adc r3, lr, #0 + cmp r3, r1 + mov r3, #0 + cmpeq r6, r0 + movlo r0, r3 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldr r6, _020B3038 ; =0x0007FD88 + adds r6, r0, r6 + adc r0, r1, r3 + cmp lr, r0 + cmpeq ip, r6 + movhi r0, r3 + ldmhiia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0x84] + cmp r0, #0 + bgt _020B3018 + ldr r0, [r7, #0x7c] + ldr r6, _020B3030 ; =0x75CA82CB + add ip, r0, r0, lsl #1 + smull r1, r0, r6, ip + ldr r6, [r7, #0x8c] + mov r1, ip, lsr #0x1f + cmp ip, r6 + add r0, r1, r0, asr #14 + bls _020B2F24 + add r1, r0, #1 + mul r6, r1, r2 + mul r1, r0, r2 + add r0, r6, #0xdf + add r2, r0, #0x13400 + ldr r0, _020B303C ; =0xFFFF2F5C + add r1, r1, #0xdf + str r2, [r7, #0x8c] + add r0, r2, r0 + str r0, [r7, #0x88] + add r0, r1, #0x13400 + str r0, [r7, #4] + str r3, [r7, #0x90] + b _020B2F84 +_020B2F24: + ldr r1, [r7, #0x88] + cmp ip, r1 + bge _020B2F84 + ldr r1, [r7, #0x90] + add r1, r1, #1 + str r1, [r7, #0x90] + cmp r1, #0x46 + bls _020B2F84 + add r1, r0, #1 + mul ip, r1, r2 + add r1, ip, #0xdf + add r1, r1, #0x13400 + ldr r6, _020B3040 ; =0xFFFFBA74 + str r1, [r7, #0x8c] + ldr r1, _020B3034 ; =0x00008B18 + mlas r2, r0, r2, r6 + str r2, [r7, #0x88] + mul r1, r0, r1 + add r0, r1, #0xdf + strmi r3, [r7, #0x88] + add r0, r0, #0x13400 + mov r2, #0 + str r0, [r7, #4] + str r2, [r7, #0x90] +_020B2F84: + ldr r1, [r7, #4] + ldr r0, _020B3044 ; =0x00068520 + cmp r1, r0 + strhi r0, [r7, #4] + ldr r0, [r7, #0x6c] + cmp r0, #0x10 + bhs _020B2FB4 + add r0, r0, #1 + str r0, [r7, #0x6c] + str r4, [r7, #0x74] + str r4, [r7, #0x78] + b _020B2FD0 +_020B2FB4: + ldr r0, [r7, #0x74] + rsb r0, r0, r0, lsl #5 + add r1, r4, r0 + mov r0, r1, asr #4 + add r0, r1, r0, lsr #27 + mov r0, r0, asr #5 + str r0, [r7, #0x74] +_020B2FD0: + ldr r2, [r7, #0x78] + ldr r1, [r7, #0x74] + ldr r0, _020B3048 ; =0x00008701 + sub r1, r2, r1 + cmp r1, r0 + mvn r0, #0x8700 + movgt r5, #1 + str r1, [r7, #0xc] + cmp r1, r0 + bge _020B3008 + ldr r1, [r7, #0x70] + add r5, r0, #0x8700 + add r0, r1, #1 + str r0, [r7, #0x70] +_020B3008: + cmp r5, #0 + movne r0, #0 + strne r0, [r7, #0x6c] + strne r0, [r7, #0x4c] +_020B3018: + ldr r1, [r7, #0x84] + mov r0, #1 + sub r1, r1, #1 + str r1, [r7, #0x84] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B302C: .word 0x0000CC8D +_020B3030: .word 0x75CA82CB +_020B3034: .word 0x00008B18 +_020B3038: .word 0x0007FD88 +_020B303C: .word 0xFFFF2F5C +_020B3040: .word 0xFFFFBA74 +_020B3044: .word 0x00068520 +_020B3048: .word 0x00008701 + arm_func_end vct_calc_jitter_and_skew + + arm_func_start VCT_CreateSession +VCT_CreateSession: ; 0x020B304C + stmdb sp!, {r3, lr} + ldr r1, _020B3070 ; =__vct + ldr r1, [r1, #0x10] + cmp r1, #0 + cmpne r1, #2 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl vct_create_session_impl + ldmia sp!, {r3, pc} + .align 2, 0 +_020B3070: .word __vct + arm_func_end VCT_CreateSession + + arm_func_start VCT_DeleteSession +VCT_DeleteSession: ; 0x020B3074 + stmdb sp!, {r3, lr} + ldr r2, _020B3124 ; =_021D6F90 + mov ip, #0 + cmp r0, #0 + ldr lr, [r2, #0x14] + moveq r0, ip + ldmeqia sp!, {r3, pc} + ldr r1, _020B3128 ; =__vct + ldr r1, [r1, #0x10] + cmp r1, #2 + bne _020B30B4 + ldr r1, _020B312C ; =_021D6FCC + cmp r0, r1 + streq ip, [r2, #0x3c] + mov r0, #1 + ldmia sp!, {r3, pc} +_020B30B4: + cmp lr, #0 + beq _020B311C +_020B30BC: + cmp lr, r0 + bne _020B310C + mov r3, #0 + str r3, [r0] + cmp ip, #0 + ldrne r1, [r0, #0x14] + strne r1, [ip, #0x14] + bne _020B30F4 + ldr r2, [lr, #0x14] + cmp r2, #0 + ldrne r1, _020B3124 ; =_021D6F90 + strne r2, [r1, #0x14] + ldreq r1, _020B3124 ; =_021D6F90 + streq r3, [r1, #0x14] +_020B30F4: + ldr r1, _020B3124 ; =_021D6F90 + ldr r2, [r1, #0x10] + str r2, [r0, #0x14] + str r0, [r1, #0x10] + mov r0, #1 + ldmia sp!, {r3, pc} +_020B310C: + mov ip, lr + ldr lr, [lr, #0x14] + cmp lr, #0 + bne _020B30BC +_020B311C: + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B3124: .word _021D6F90 +_020B3128: .word __vct +_020B312C: .word _021D6FCC + arm_func_end VCT_DeleteSession + + arm_func_start vct_build_request_data +vct_build_request_data: ; 0x020B3130 + stmdb sp!, {r4, r5, r6, lr} + movs r5, r0 + mov r4, r1 + mov r6, r2 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r3, #0x10 + mvnlo r0, #0 + ldmloia sp!, {r4, r5, r6, pc} + ldr r1, _020B31DC ; =__vct + ldr r1, [r1, #0xc] + cmp r1, #1 + mvneq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r4, #0 + blt _020B3178 + cmp r4, #5 + blt _020B3180 +_020B3178: + mvn r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_020B3180: + mov r3, #0xff + mov r1, r6 + and r2, r4, #0xff + strb r3, [r6, #4] + bl vct_build_ssp_header + mov r0, r5 + mov r1, r6 + bl vct_check_send_state + cmp r0, #0 + mvneq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _020B31DC ; =__vct + ldr r0, [r0, #0x10] + cmp r0, #1 + cmpeq r4, #0 + bne _020B31D4 + mov r0, r5 + bl vct_check_multisession + cmp r0, #0 + mvneq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} +_020B31D4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B31DC: .word __vct + arm_func_end vct_build_request_data + + arm_func_start VCT_Request +VCT_Request: ; 0x020B31E0 + stmdb sp!, {r3, lr} + ldr r2, _020B3200 ; =__vct + ldr r2, [r2, #0x10] + cmp r2, #2 + mvneq r0, #2 + ldmeqia sp!, {r3, pc} + bl vct_request_impl + ldmia sp!, {r3, pc} + .align 2, 0 +_020B3200: .word __vct + arm_func_end VCT_Request + + arm_func_start vct_build_response_data +vct_build_response_data: ; 0x020B3204 + stmdb sp!, {r4, r5, r6, lr} + movs r5, r0 + mov r6, r1 + mov r4, r2 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + cmp r3, #0x10 + mvnlo r0, #0 + ldmloia sp!, {r4, r5, r6, pc} + cmp r6, #0 + blt _020B3238 + cmp r6, #6 + blt _020B3240 +_020B3238: + mvn r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_020B3240: + mov r3, #0 + mov r1, r4 + and r2, r6, #0xff + strb r3, [r4, #4] + bl vct_build_ssp_header + cmp r6, #0 + bne _020B329C + ldr r0, _020B32B8 ; =__vct + ldr r0, [r0, #0x10] + cmp r0, #1 + ldreq r0, [r5, #0xc] + cmpeq r0, #4 + bne _020B3288 + mov r0, r5 + bl vct_check_multisession + cmp r0, #0 + mvneq r0, #2 + ldmeqia sp!, {r4, r5, r6, pc} +_020B3288: + ldrb r1, [r5, #4] + mov r0, #1 + cmp r1, #0 + movne r0, r0, lsl r1 + str r0, [r5, #8] +_020B329C: + mov r0, r5 + mov r1, r4 + bl vct_check_send_state + cmp r0, #0 + mvneq r0, #2 + movne r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B32B8: .word __vct + arm_func_end vct_build_response_data + + arm_func_start VCT_Response +VCT_Response: ; 0x020B32BC + stmdb sp!, {r3, lr} + ldr r2, _020B32DC ; =__vct + ldr r2, [r2, #0x10] + cmp r2, #2 + mvneq r0, #2 + ldmeqia sp!, {r3, pc} + bl vct_response_impl + ldmia sp!, {r3, pc} + .align 2, 0 +_020B32DC: .word __vct + arm_func_end VCT_Response + + arm_func_start VCT_AddConferenceClient +VCT_AddConferenceClient: ; 0x020B32E0 + stmdb sp!, {r4, lr} + ldr r2, _020B3390 ; =__vct + mov r4, r0 + ldr r1, [r2, #0x10] + cmp r1, #3 + mvnne r0, #1 + ldmneia sp!, {r4, pc} + ldr r1, _020B3394 ; =_021D6F90 + ldr r1, [r1] + cmp r1, #3 + mvneq r0, #5 + ldmeqia sp!, {r4, pc} + ldrb r1, [r2] + cmp r4, r1 + mvneq r0, #0 + ldmeqia sp!, {r4, pc} + bl vct_find_session + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl VCT_CreateSession + movs r2, r0 + mvneq r0, #0 + ldmeqia sp!, {r4, pc} + strb r4, [r2, #4] + mov r0, #1 + strb r4, [r2, #5] + mov r3, #2 + mov r1, r0, lsl r4 + str r3, [r2, #0xc] + ldr r0, _020B3390 ; =__vct + str r1, [r2, #8] + ldr r3, [r0, #8] + ldr ip, [r0, #4] + mov r0, r4 + mov r1, #7 + blx ip + ldr r1, _020B3394 ; =_021D6F90 + mov r0, #0 + ldr r2, [r1] + add r2, r2, #1 + str r2, [r1] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B3390: .word __vct +_020B3394: .word _021D6F90 + arm_func_end VCT_AddConferenceClient + + arm_func_start vct_init_ssp +vct_init_ssp: ; 0x020B3398 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + ldrne r1, [r4, #4] + cmpne r1, #0 + beq _020B33BC + cmp r1, #8 + bls _020B33C4 +_020B33BC: + mov r0, #0 + ldmia sp!, {r4, pc} +_020B33C4: + ldr r1, _020B3490 ; =_021D6F90 + mov r2, #0x18 + str r0, [r1, #0x10] + ldr r3, [r4, #4] + mov r1, #0 + mul r2, r3, r2 + bl MI_CpuFill8 + ldr r0, _020B3494 ; =_021D6FCC + mov r1, #0 + mov r2, #0x18 + bl MI_CpuFill8 + ldr r0, _020B3498 ; =_021D6FB4 + mov r1, #0 + mov r2, #0x18 + bl MI_CpuFill8 + ldr r3, [r4, #4] + mov ip, #0 + subs r0, r3, #1 + beq _020B3444 + ldr r1, _020B3490 ; =_021D6F90 + mov lr, ip + mov r0, #0x18 +_020B341C: + ldr r2, [r1, #0x10] + add ip, ip, #1 + mla r3, ip, r0, r2 + add r2, r2, lr + str r3, [r2, #0x14] + ldr r3, [r4, #4] + add lr, lr, #0x18 + sub r2, r3, #1 + cmp ip, r2 + blo _020B341C +_020B3444: + ldr r1, _020B3490 ; =_021D6F90 + mov r0, #0x18 + ldr r2, [r1, #0x10] + mov r4, #0 + mla r0, r3, r0, r2 + str r4, [r0, #-4] + str r4, [r1, #0x14] + str r4, [r1, #4] + ldr r0, _020B349C ; =__vct + str r4, [r1] + ldr r3, _020B34A0 ; =OS_GetTick + str r4, [r0, #0x14] + ldr r2, _020B34A4 ; =0x5D588B65 + str r3, [r1, #0x18] + ldr r0, _020B34A8 ; =0x00269EC3 + str r2, [r1, #0x1c] + str r0, [r1, #0x20] + mov r0, #1 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B3490: .word _021D6F90 +_020B3494: .word _021D6FCC +_020B3498: .word _021D6FB4 +_020B349C: .word __vct +_020B34A0: .word OS_GetTick +_020B34A4: .word 0x5D588B65 +_020B34A8: .word 0x00269EC3 + arm_func_end vct_init_ssp + + arm_func_start vct_finish_ssp +vct_finish_ssp: ; 0x020B34AC + ldr r0, _020B34C0 ; =_021D6F90 + mov r1, #0 + str r1, [r0, #0x14] + str r1, [r0, #0x10] + bx lr + .align 2, 0 +_020B34C0: .word _021D6F90 + arm_func_end vct_finish_ssp + + arm_func_start vct_check_timeout +vct_check_timeout: ; 0x020B34C4 + stmdb sp!, {r3, r4, r5, lr} + bl OS_GetTick + ldr r2, _020B3560 ; =__vct + ldr r3, [r2, #0x10] + cmp r3, #2 + ldmneia sp!, {r3, r4, r5, pc} + ldr r2, [r2, #0xc] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, _020B3564 ; =_021D6F90 + mov ip, #0 + ldr r5, [r3, #0xc] + ldr r4, [r3, #8] + cmp r5, #0 + cmpeq r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, _020B3568 ; =sTransceiverLimit + subs r4, r0, r4 + ldr lr, [r2] + ldr r0, [r2, #4] + sbc r1, r1, r5 + cmp r1, r0 + cmpeq r4, lr + ldmlsia sp!, {r3, r4, r5, pc} + str ip, [r3, #8] + str ip, [r3, #0xc] + str ip, [r3, #0x3c] + mov r0, ip + str ip, [r3, #0x48] + bl vct_send_notify + ldr r1, _020B3560 ; =__vct + ldr r0, _020B3564 ; =_021D6F90 + ldr r3, [r1, #8] + ldrb r0, [r0, #0x40] + ldr ip, [r1, #4] + ldr r2, _020B356C ; =_021D6FCC + mov r1, #9 + blx ip + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B3560: .word __vct +_020B3564: .word _021D6F90 +_020B3568: .word sTransceiverLimit +_020B356C: .word _021D6FCC + arm_func_end vct_check_timeout + + arm_func_start vct_handle_ssp +vct_handle_ssp: ; 0x020B3570 + stmdb sp!, {r3, lr} + cmp r2, #0x10 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldrb r2, [r1, #8] + cmp r2, r0 + bne _020B35A0 + ldr r0, _020B35E8 ; =__vct + ldrb ip, [r1, #9] + ldrb r2, [r0] + cmp ip, r2 + beq _020B35A8 +_020B35A0: + mov r0, #0 + ldmia sp!, {r3, pc} +_020B35A8: + ldrb r2, [r1, #5] + cmp r2, #0x10 + beq _020B35C4 + mov r0, r1 + mov r1, r3 + bl vct_response_reject + ldmia sp!, {r3, pc} +_020B35C4: + ldr r0, [r0, #0xc] + cmp r0, #0 + mov r0, r1 + mov r1, r3 + bne _020B35E0 + bl vct_handle_ssp_client + ldmia sp!, {r3, pc} +_020B35E0: + bl vct_handle_ssp_server + ldmia sp!, {r3, pc} + .align 2, 0 +_020B35E8: .word __vct + arm_func_end vct_handle_ssp + + arm_func_start vct_create_session_impl +vct_create_session_impl: ; 0x020B35EC + stmdb sp!, {r4, lr} + mov r1, r0 + cmp r1, #0x20 + movhs r0, #0 + ldmhsia sp!, {r4, pc} + ldr r0, _020B3650 ; =__vct + ldrb r0, [r0] + cmp r1, r0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r2, _020B3654 ; =_021D6F90 + ldr r4, [r2, #0x10] + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r3, [r4, #0x14] + mov r0, r4 + str r3, [r2, #0x10] + bl vct_init_session + ldr r1, _020B3654 ; =_021D6F90 + mov r0, r4 + ldr r2, [r1, #0x14] + str r2, [r4, #0x14] + str r4, [r1, #0x14] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B3650: .word __vct +_020B3654: .word _021D6F90 + arm_func_end vct_create_session_impl + + arm_func_start vct_request_impl +vct_request_impl: ; 0x020B3658 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + add r2, sp, #0 + mov r3, #0x10 + mov r4, r0 + bl vct_build_request_data + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, pc} + add r1, sp, #0 + mov r0, r4 + bl vct_send_ssp + cmp r0, #0 + movne r0, #0 + mvneq r0, #3 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + arm_func_end vct_request_impl + + arm_func_start vct_response_impl +vct_response_impl: ; 0x020B369C + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + add r2, sp, #0 + mov r3, #0x10 + mov r4, r0 + bl vct_build_response_data + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, pc} + add r1, sp, #0 + mov r0, r4 + bl vct_send_ssp + cmp r0, #0 + movne r0, #0 + mvneq r0, #3 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + arm_func_end vct_response_impl + + arm_func_start vct_add_notify_aid_list +vct_add_notify_aid_list: ; 0x020B36E0 + ldrb r2, [r1, #0xa] + cmp r2, #1 + bxne lr + ldrb r2, [r0, #4] + ldr r0, _020B3704 ; =_021D6F90 + strb r2, [r1, #0xb] + ldr r0, [r0, #4] + str r0, [r1, #0xc] + bx lr + .align 2, 0 +_020B3704: .word _021D6F90 + arm_func_end vct_add_notify_aid_list + + arm_func_start vct_send_notify_impl +vct_send_notify_impl: ; 0x020B3708 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + str r0, [sp] + mov sl, r1 + mov r8, #0 + bl vct_add_notify_aid_list + mov r6, #1 + ldr r4, _020B37C0 ; =__vct + ldr r5, _020B37C4 ; =_021D6F90 + mov sb, r8 + mov r7, r6 + mov fp, #0x10 +_020B3734: + cmp sb, #0 + movne r1, r7, lsl sb + ldr r0, [r5, #4] + moveq r1, r6 + tst r0, r1 + ldrneb r0, [r4] + cmpne sb, r0 + beq _020B3770 + mov r0, sb + mov r1, sl + mov r2, fp + strb sb, [sl, #9] + bl DWC_SendReliable + cmp r0, #0 + addne r8, r8, #1 +_020B3770: + add r0, sb, #1 + and sb, r0, #0xff + cmp sb, #0x20 + blo _020B3734 + ldrb r0, [sl, #0xa] + cmp r0, #1 + bne _020B37A0 + ldr r0, _020B37C4 ; =_021D6F90 + ldr r1, [r0, #4] + ldr r0, [sp] + str r1, [r0, #8] + b _020B37B0 +_020B37A0: + cmp r0, #0 + ldreq r0, [sp] + moveq r1, #0 + streq r1, [r0, #8] +_020B37B0: + cmp r8, #0 + mvneq r0, #3 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B37C0: .word __vct +_020B37C4: .word _021D6F90 + arm_func_end vct_send_notify_impl + + arm_func_start vct_send_notify +vct_send_notify: ; 0x020B37C8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + mov r4, r0 + mov r3, #0xff + ldr r0, _020B3804 ; =_021D6FCC + add r1, sp, #0 + mov r2, #4 + strb r3, [sp, #4] + bl vct_build_ssp_header + ldr r0, _020B3804 ; =_021D6FCC + add r1, sp, #0 + strb r4, [sp, #0xa] + bl vct_send_notify_impl + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B3804: .word _021D6FCC + arm_func_end vct_send_notify + + arm_func_start vct_init_session +vct_init_session: ; 0x020B3808 + mov ip, r0 + mov r3, #6 + mov r2, #0 +_020B3814: + strb r2, [ip] + strb r2, [ip, #1] + strb r2, [ip, #2] + strb r2, [ip, #3] + add ip, ip, #4 + subs r3, r3, #1 + bne _020B3814 + ldr r2, _020B384C ; =__vct + mov r3, #0 + ldr r2, [r2, #0x10] + str r2, [r0] + str r3, [r0, #0xc] + strb r1, [r0, #4] + bx lr + .align 2, 0 +_020B384C: .word __vct + arm_func_end vct_init_session + + arm_func_start vct_send_ssp +vct_send_ssp: ; 0x020B3850 + stmdb sp!, {r3, lr} + ldrb r2, [r1, #4] + cmp r2, #0xff + ldreqb r2, [r1, #6] + cmpeq r2, #4 + bne _020B3870 + bl vct_send_notify_impl + b _020B3888 +_020B3870: + ldrb r0, [r0, #4] + mov r2, #0x10 + bl DWC_SendReliable + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_020B3888: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end vct_send_ssp + + arm_func_start vct_dispatch_session +vct_dispatch_session: ; 0x020B3890 + ldrb r2, [r0, #0xb] + strb r2, [r1, #5] + ldrb r2, [r0, #4] + cmp r2, #0xff + bne _020B38D4 + ldrb r2, [r0, #6] + cmp r2, #0 + bne _020B38C4 + ldrb r3, [r1, #4] + mov r2, #1 + cmp r3, #0 + movne r2, r2, lsl r3 + str r2, [r1, #8] +_020B38C4: + ldrb r1, [r0, #6] + ldr r0, _020B3934 ; =sRequestEvent + ldrb r0, [r0, r1] + bx lr +_020B38D4: + cmp r2, #0 + bne _020B392C + ldrb r2, [r0, #6] + cmp r2, #0 + bne _020B3920 + ldr r0, [r1, #0xc] + cmp r0, #1 + bne _020B3910 + ldrb r2, [r1, #4] + mov r0, #1 + cmp r2, #0 + movne r0, r0, lsl r2 + str r0, [r1, #8] + mov r0, #7 + bx lr +_020B3910: + cmp r0, #5 + moveq r0, #9 + movne r0, #0xc + bx lr +_020B3920: + ldr r0, _020B3938 ; =sResponseEvent + ldrb r0, [r0, r2] + bx lr +_020B392C: + mov r0, #0xc + bx lr + .align 2, 0 +_020B3934: .word sRequestEvent +_020B3938: .word sResponseEvent + arm_func_end vct_dispatch_session + + arm_func_start vct_build_ssp_header +vct_build_ssp_header: ; 0x020B393C + ldr ip, _020B397C ; =0x5F564354 + mov r3, #0x10 + str ip, [r1] + strb r3, [r1, #5] + ldr r3, _020B3980 ; =__vct + strb r2, [r1, #6] + ldrb r2, [r3] + strb r2, [r1, #8] + ldrb r2, [r0, #4] + mov r0, #0 + strb r2, [r1, #9] + strb r0, [r1, #0xa] + ldrb r2, [r3] + strb r2, [r1, #0xb] + str r0, [r1, #0xc] + bx lr + .align 2, 0 +_020B397C: .word 0x5F564354 +_020B3980: .word __vct + arm_func_end vct_build_ssp_header + + arm_func_start vct_check_recv_state +vct_check_recv_state: ; 0x020B3984 + stmdb sp!, {r3, r4, r5, lr} + ldrb r2, [r1, #4] + ldrb r3, [r1, #6] + mov r4, r0 + cmp r2, #0 + addeq r3, r3, #5 + cmp r3, #0 + blt _020B39AC + cmp r3, #0xb + blt _020B39B0 +_020B39AC: + mvn r3, #0 +_020B39B0: + cmp r3, #0 + mvnlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + ldr r0, _020B3A50 ; =__vct + ldr r2, [r4, #0xc] + ldr r0, [r0, #0x10] + cmp r0, #1 + ldreq r1, _020B3A54 ; =sRecvState + mov r0, #0xb + ldrne r1, _020B3A58 ; =sTransRecvState + mla r0, r2, r0, r1 + ldrsb r5, [r3, r0] + mvn r1, #2 + cmp r5, r1 + beq _020B3A2C + add r0, r1, #1 + cmp r5, r0 + beq _020B3A0C + add r0, r1, #2 + cmp r5, r0 + mov r0, r5 + bne _020B3A4C + ldmia sp!, {r3, r4, r5, pc} +_020B3A0C: + mov r0, r4 + mov r1, #1 + bl vct_response_impl + mov r1, #0 + str r1, [r4, #0xc] + mov r0, r5 + str r1, [r4] + ldmia sp!, {r3, r4, r5, pc} +_020B3A2C: + mov r0, r4 + mov r1, #3 + bl vct_response_impl + mov r1, #0 + str r1, [r4, #0xc] + mov r0, r5 + str r1, [r4] + ldmia sp!, {r3, r4, r5, pc} +_020B3A4C: + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B3A50: .word __vct +_020B3A54: .word sRecvState +_020B3A58: .word sTransRecvState + arm_func_end vct_check_recv_state + + arm_func_start vct_check_multisession +vct_check_multisession: ; 0x020B3A5C + ldr r1, _020B3AA4 ; =_021D6F90 + ldr r2, [r1, #0x14] + cmp r2, #0 + beq _020B3A9C +_020B3A6C: + ldr r1, [r2] + cmp r1, #0 + beq _020B3A90 + ldr r1, [r2, #0xc] + cmp r1, #2 + bne _020B3A90 + cmp r0, r2 + movne r0, #0 + bxne lr +_020B3A90: + ldr r2, [r2, #0x14] + cmp r2, #0 + bne _020B3A6C +_020B3A9C: + mov r0, #1 + bx lr + .align 2, 0 +_020B3AA4: .word _021D6F90 + arm_func_end vct_check_multisession + + arm_func_start vct_check_send_state +vct_check_send_state: ; 0x020B3AA8 + ldrb r2, [r1, #4] + ldrb ip, [r1, #6] + cmp r2, #0 + addeq ip, ip, #5 + cmp ip, #0 + blt _020B3AC8 + cmp ip, #0xb + blt _020B3ACC +_020B3AC8: + mvn ip, #0 +_020B3ACC: + cmp ip, #0 + mvnlt r0, #0 + bxlt lr + ldr r1, _020B3B24 ; =__vct + ldr r3, [r0, #0xc] + ldr r1, [r1, #0x10] + cmp r1, #1 + ldreq r2, _020B3B28 ; =sSendState + mov r1, #0xb + ldrne r2, _020B3B2C ; =sTransSendState + mla r1, r3, r1, r2 + ldrsb r2, [ip, r1] + mvn r1, #0 + cmp r2, r1 + moveq r0, #1 + bxeq lr + sub r1, r1, #1 + cmp r2, r1 + moveq r0, #0 + strne r2, [r0, #0xc] + movne r0, #1 + bx lr + .align 2, 0 +_020B3B24: .word __vct +_020B3B28: .word sSendState +_020B3B2C: .word sTransSendState + arm_func_end vct_check_send_state + + arm_func_start vct_find_session +vct_find_session: ; 0x020B3B30 + ldr r1, _020B3BA4 ; =__vct + ldr r2, _020B3BA8 ; =_021D6F90 + ldr r1, [r1, #0x10] + ldr r3, [r2, #0x14] + cmp r1, #2 + bne _020B3B6C + ldr r1, [r2, #0x3c] + cmp r1, #0 + beq _020B3B64 + ldrb r1, [r2, #0x40] + cmp r1, r0 + ldreq r0, _020B3BAC ; =_021D6FCC + bxeq lr +_020B3B64: + mov r0, #0 + bx lr +_020B3B6C: + cmp r3, #0 + beq _020B3B9C +_020B3B74: + ldr r1, [r3] + cmp r1, #0 + beq _020B3B90 + ldrb r1, [r3, #4] + cmp r1, r0 + moveq r0, r3 + bxeq lr +_020B3B90: + ldr r3, [r3, #0x14] + cmp r3, #0 + bne _020B3B74 +_020B3B9C: + mov r0, #0 + bx lr + .align 2, 0 +_020B3BA4: .word __vct +_020B3BA8: .word _021D6F90 +_020B3BAC: .word _021D6FCC + arm_func_end vct_find_session + + arm_func_start vct_handle_ssp_client +vct_handle_ssp_client: ; 0x020B3BB0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + ldrb r2, [r6, #4] + mov r5, r1 + cmp r2, #0xff + bne _020B3BE8 + ldrb r2, [r6, #6] + cmp r2, #4 + bne _020B3BDC + bl vct_handle_notify + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3BDC: + cmp r2, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020B3BE8: + ldrb r0, [r6, #8] + bl vct_find_session + movs r4, r0 + beq _020B3C68 + mov r1, r6 + bl vct_check_recv_state + mov r7, r0 + mvn r0, #1 + cmp r7, r0 + beq _020B3C24 + add r0, r0, #1 + cmp r7, r0 + bne _020B3C40 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3C24: + mov r0, #0xc + str r0, [r5] + mov r0, #0 + str r0, [r4] + str r4, [r5, #4] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3C40: + mov r0, r6 + mov r1, r4 + bl vct_dispatch_session + stmia r5, {r0, r4} + str r7, [r4, #0xc] + ldr r0, [r5] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3C68: + ldrb r0, [r6, #8] + bl vct_create_session_impl + movs r7, r0 + bne _020B3C98 + ldrb r1, [r6, #8] + ldr r0, _020B3CE8 ; =_021D6FB4 + bl vct_init_session + ldr r0, _020B3CE8 ; =_021D6FB4 + mov r1, #3 + bl vct_response_impl + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3C98: + mov r1, r6 + bl vct_check_recv_state + mov r4, r0 + add r0, r4, #2 + cmp r0, #1 + bhi _020B3CC0 + mov r0, r7 + bl VCT_DeleteSession + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B3CC0: + mov r0, r6 + mov r1, r7 + bl vct_dispatch_session + stmia r5, {r0, r7} + str r4, [r7, #0xc] + ldr r0, [r5] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B3CE8: .word _021D6FB4 + arm_func_end vct_handle_ssp_client + + arm_func_start vct_handle_ssp_server +vct_handle_ssp_server: ; 0x020B3CEC + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020B3E74 ; =_021D6F90 + mov r5, r0 + ldr r0, [r2, #0x3c] + mov r4, r1 + cmp r0, #2 + bne _020B3D9C + ldrb r1, [r2, #0x40] + ldrb r0, [r5, #8] + cmp r1, r0 + bne _020B3D8C + ldr r0, _020B3E78 ; =_021D6FCC + mov r1, r5 + bl vct_check_recv_state + mov r6, r0 + mvn r1, #2 + cmp r6, r1 + beq _020B3D68 + add r0, r1, #1 + cmp r6, r0 + beq _020B3D50 + add r0, r1, #2 + cmp r6, r0 + beq _020B3D68 + b _020B3D70 +_020B3D50: + mov r0, #0xc + str r0, [r4] + mov r0, #0 + str r0, [r4, #4] + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020B3D68: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020B3D70: + ldr r1, _020B3E78 ; =_021D6FCC + mov r0, r5 + bl vct_dispatch_session + ldr r1, _020B3E78 ; =_021D6FCC + stmia r4, {r0, r1} + str r6, [r1, #0xc] + b _020B3E2C +_020B3D8C: + mov r0, #1 + bl vct_send_notify + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020B3D9C: + ldrb r1, [r5, #8] + ldr r2, _020B3E74 ; =_021D6F90 + cmp r1, #0 + movne r0, #1 + movne r3, r0, lsl r1 + ldr r0, [r2, #4] + moveq r3, #1 + tst r0, r3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + strb r1, [r2, #0x40] + mov r3, #2 + str r3, [r2, #0x3c] + mov r3, #0 + ldr r0, _020B3E78 ; =_021D6FCC + mov r1, r5 + str r3, [r2, #0x48] + bl vct_check_recv_state + mov r6, r0 + mvn r1, #2 + cmp r6, r1 + addne r0, r1, #1 + cmpne r6, r0 + addne r0, r1, #2 + cmpne r6, r0 + bne _020B3E14 + ldr r1, _020B3E74 ; =_021D6F90 + mov r0, #0 + str r0, [r1, #0x3c] + ldmia sp!, {r4, r5, r6, pc} +_020B3E14: + ldr r1, _020B3E78 ; =_021D6FCC + mov r0, r5 + bl vct_dispatch_session + ldr r1, _020B3E78 ; =_021D6FCC + stmia r4, {r0, r1} + str r6, [r1, #0xc] +_020B3E2C: + ldr r0, [r4] + cmp r0, #0xa + bne _020B3E54 + mov r0, #1 + bl vct_send_notify + bl OS_GetTick + ldr r2, _020B3E74 ; =_021D6F90 + str r0, [r2, #8] + str r1, [r2, #0xc] + b _020B3E6C +_020B3E54: + mov r0, #0 + bl vct_send_notify + ldr r0, _020B3E74 ; =_021D6F90 + mov r1, #0 + str r1, [r0, #8] + str r1, [r0, #0xc] +_020B3E6C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B3E74: .word _021D6F90 +_020B3E78: .word _021D6FCC + arm_func_end vct_handle_ssp_server + + arm_func_start vct_response_reject +vct_response_reject: ; 0x020B3E7C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r0, [r5, #4] + mov r4, r1 + cmp r0, #0xff + ldreqb r0, [r5, #6] + cmpeq r0, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r5, #8] + bl vct_find_session + cmp r0, #0 + beq _020B3ED0 + mov r1, #2 + str r1, [r4] + str r0, [r4, #4] + mov r2, #0 + str r2, [r0] + bl vct_response_impl + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020B3ED0: + ldrb r1, [r5, #8] + ldr r0, _020B3EF0 ; =_021D6FB4 + bl vct_init_session + ldr r0, _020B3EF0 ; =_021D6FB4 + mov r1, #2 + bl vct_response_impl + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B3EF0: .word _021D6FB4 + arm_func_end vct_response_reject + + arm_func_start vct_handle_notify +vct_handle_notify: ; 0x020B3EF4 + stmdb sp!, {r3, lr} + ldr r3, _020B4008 ; =__vct + ldr r2, [r3, #0x10] + cmp r2, #2 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldrb ip, [r3, #1] + ldrb r2, [r0, #8] + cmp ip, r2 + movne r0, #0 + ldmneia sp!, {r3, pc} + ldrb r2, [r0, #0xa] + cmp r2, #0 + beq _020B3F38 + cmp r2, #1 + beq _020B3F84 + b _020B3FF8 +_020B3F38: + ldr r0, _020B400C ; =_021D6F90 + ldr r2, [r0, #0x3c] + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x48] + mov r3, #0 + cmp r0, #5 + cmpne r0, #2 + moveq r0, #9 + streq r0, [r1] + movne r0, #5 + strne r0, [r1] + ldr r0, _020B400C ; =_021D6F90 + ldr r2, _020B4010 ; =_021D6FCC + str r3, [r0, #0x3c] + str r3, [r0, #0x48] + str r2, [r1, #4] + b _020B4000 +_020B3F84: + ldr r2, _020B400C ; =_021D6F90 + mov lr, #2 + str lr, [r2, #0x3c] + ldrb ip, [r0, #0xb] + ldrb r3, [r3] + cmp ip, r3 + bne _020B3FB4 + str lr, [r2, #0x48] + mov r3, #7 + str r3, [r1] + ldr r3, [r0, #0xc] + b _020B3FDC +_020B3FB4: + mov r3, #3 + str r3, [r2, #0x48] + mov r2, #6 + str r2, [r1] + ldrb r3, [r0, #0xb] + cmp r3, #0 + movne r2, #1 + movne r3, r2, lsl r3 + ldr r2, _020B400C ; =_021D6F90 + moveq r3, #1 +_020B3FDC: + str r3, [r2, #0x44] + ldrb r3, [r0, #0xb] + ldr r0, _020B400C ; =_021D6F90 + ldr r2, _020B4010 ; =_021D6FCC + strb r3, [r0, #0x41] + str r2, [r1, #4] + b _020B4000 +_020B3FF8: + mov r0, #0 + ldmia sp!, {r3, pc} +_020B4000: + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B4008: .word __vct +_020B400C: .word _021D6F90 +_020B4010: .word _021D6FCC + arm_func_end vct_handle_notify + + arm_func_start vct_init_packet_buffer +vct_init_packet_buffer: ; 0x020B4014 + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _020B40D0 ; =0xE525982B + mov r2, r1 + umull r1, r4, r2, r3 + ldr r1, _020B40D4 ; =_021D6FE4 + mov r4, r4, lsr #0xa + str r0, [r1, #4] + cmp r4, #4 + blo _020B4040 + cmp r4, #0x48 + bls _020B4048 +_020B4040: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020B4048: + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + tst r0, #0x1f + movne r0, #0 + strne r0, [r1, #4] + ldmneia sp!, {r4, r5, r6, pc} + mov r1, r0 + mov r0, #0 + bl MIi_CpuClearFast + subs lr, r4, #1 + mov r5, #0 + beq _020B40A8 + ldr r2, _020B40D4 ; =_021D6FE4 + ldr r0, _020B40D8 ; =0x00000478 + mov r6, r5 +_020B4088: + ldr ip, [r2, #4] + add r5, r5, #1 + mla r3, r5, r0, ip + add r1, r6, #0x78 + str r3, [ip, r6] + cmp r5, lr + add r6, r1, #0x400 + blo _020B4088 +_020B40A8: + ldr r1, _020B40D4 ; =_021D6FE4 + ldr r0, _020B40D8 ; =0x00000478 + ldr r2, [r1, #4] + mov r3, #0 + mla r0, r4, r0, r2 + str r3, [r0, #-0x478] + ldr r2, [r1, #4] + mov r0, #1 + str r2, [r1] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B40D0: .word 0xE525982B +_020B40D4: .word _021D6FE4 +_020B40D8: .word 0x00000478 + arm_func_end vct_init_packet_buffer + + arm_func_start vct_cleanup_packet_buffer +vct_cleanup_packet_buffer: ; 0x020B40DC + ldr r0, _020B40F0 ; =_021D6FE4 + mov r1, #0 + str r1, [r0] + str r1, [r0, #4] + bx lr + .align 2, 0 +_020B40F0: .word _021D6FE4 + arm_func_end vct_cleanup_packet_buffer + + arm_func_start vct_alloc_packet_buffer +vct_alloc_packet_buffer: ; 0x020B40F4 + stmdb sp!, {r4, lr} + mov r4, #0 + bl OS_DisableInterrupts + ldr r1, _020B4124 ; =_021D6FE4 + ldr r3, [r1] + cmp r3, #0 + ldrne r2, [r3] + movne r4, r3 + strne r2, [r1] + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4124: .word _021D6FE4 + arm_func_end vct_alloc_packet_buffer + + arm_func_start vct_free_packet_buffer +vct_free_packet_buffer: ; 0x020B4128 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020B4158 ; =_021D6FE4 + mov r2, #0 + ldr r3, [r1] + str r3, [r4] + str r4, [r1] + str r2, [r4, #4] + str r2, [r4, #8] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4158: .word _021D6FE4 + arm_func_end vct_free_packet_buffer + + arm_func_start VCT_ResetVAD +VCT_ResetVAD: ; 0x020B415C + ldr r0, _020B419C ; =E2scales + mov r2, #0 + mov r1, #0x1000000 +_020B4168: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #4 + blt _020B4168 + ldr r1, _020B41A0 ; =_021D6FEC + mov r2, #0 + str r2, [r1, #4] + ldr r0, _020B41A4 ; =sVADInfo + str r2, [r1] + str r2, [r0] + str r2, [r0, #4] + str r2, [r1, #8] + bx lr + .align 2, 0 +_020B419C: .word E2scales +_020B41A0: .word _021D6FEC +_020B41A4: .word sVADInfo + arm_func_end VCT_ResetVAD + + arm_func_start VCT_GetVADInfo +VCT_GetVADInfo: ; 0x020B41A8 + stmdb sp!, {r3, lr} + movs r1, r0 + ldmeqia sp!, {r3, pc} + ldr r0, _020B41C4 ; =sVADInfo + mov r2, #0x10 + bl MI_CpuCopy8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B41C4: .word sVADInfo + arm_func_end VCT_GetVADInfo + + arm_func_start VCTi_GetVADStatus +VCTi_GetVADStatus: ; 0x020B41C8 + stmdb sp!, {r4, lr} + ldr r3, _020B4394 ; =sVADInfo + mov ip, r1, lsr #8 + str ip, [r3, #4] + cmp r2, #0 + strneb ip, [r2] + ldr r2, _020B4394 ; =sVADInfo + ldr r2, [r2] + cmp r2, #0 + bne _020B42DC + mov ip, #0 + ldr r3, _020B4398 ; =E2scales + mov lr, ip +_020B41FC: + ldr r2, [r3, lr, lsl #2] + add lr, lr, #1 + cmp lr, #4 + add ip, ip, r2 + blt _020B41FC + ldr r3, _020B439C ; =0x040002B0 + mov r2, #0 + strh r2, [r3] + mov r2, ip, lsr #2 + str r2, [r3, #8] +_020B4224: + ldrh r2, [r3] + tst r2, #0x8000 + bne _020B4224 + ldr r2, _020B43A0 ; =0x040002B4 + cmp r1, #0 + ldr r2, [r2] + beq _020B42B8 + cmp r1, r2, lsl #1 + blo _020B42B8 + mov r3, #0 + ldr r2, _020B4398 ; =E2scales + mov ip, r3 +_020B4254: + ldr r1, [r2, ip, lsl #2] + add ip, ip, #1 + cmp ip, #4 + add r3, r3, r1 + blo _020B4254 + ldr r2, _020B439C ; =0x040002B0 + mov r1, #0 + strh r1, [r2] + mov r1, r3, lsr #2 + str r1, [r2, #8] +_020B427C: + ldrh r1, [r2] + tst r1, #0x8000 + bne _020B427C + ldr r1, _020B43A0 ; =0x040002B4 + ldr r2, _020B43A4 ; =_021D6FEC + ldr r1, [r1] + mov r3, #0 + add r1, r1, r1, lsl #1 + mov r1, r1, lsr #1 + str r1, [r2] + ldr r1, _020B4394 ; =sVADInfo + str r3, [r2, #4] + mov lr, #1 + str lr, [r1] + b _020B42BC +_020B42B8: + mov lr, #0 +_020B42BC: + ldr r1, _020B43A4 ; =_021D6FEC + ldr r3, _020B4398 ; =E2scales + ldr ip, [r1, #4] + add r2, ip, #1 + and r2, r2, #3 + str r0, [r3, ip, lsl #2] + str r2, [r1, #4] + b _020B438C +_020B42DC: + ldr r1, _020B43A4 ; =_021D6FEC + mov lr, #0 + ldr ip, [r1, #4] + ldr r3, _020B4398 ; =E2scales + add r2, ip, #1 + and r2, r2, #3 + mov r4, lr + str r0, [r3, ip, lsl #2] + str r2, [r1, #4] +_020B4300: + ldr r0, [r3, r4, lsl #2] + add r4, r4, #1 + cmp r4, #4 + add lr, lr, r0 + blt _020B4300 + ldr r1, _020B439C ; =0x040002B0 + mov r0, #0 + strh r0, [r1] + mov r0, lr, lsr #2 + str r0, [r1, #8] +_020B4328: + ldrh r0, [r1] + tst r0, #0x8000 + bne _020B4328 + ldr r0, _020B43A0 ; =0x040002B4 + ldr r1, _020B43A4 ; =_021D6FEC + ldr r2, [r0] + ldr r0, [r1] + cmp r2, r0 + bhi _020B4380 + ldr r2, [r1, #8] + ldr r0, _020B4394 ; =sVADInfo + add r3, r2, #1 + str r3, [r1, #8] + ldr r2, [r0, #8] + cmp r3, r2 + ble _020B4388 + mov r2, #0 + str r2, [r0] + str r2, [r1, #8] + str r2, [r1, #4] + mov r0, #3 + ldmia sp!, {r4, pc} +_020B4380: + mov r0, #0 + str r0, [r1, #8] +_020B4388: + mov lr, #2 +_020B438C: + mov r0, lr + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4394: .word sVADInfo +_020B4398: .word E2scales +_020B439C: .word 0x040002B0 +_020B43A0: .word 0x040002B4 +_020B43A4: .word _021D6FEC + arm_func_end VCTi_GetVADStatus + + arm_func_start vct_init_vad +vct_init_vad: ; 0x020B43A8 + mov r2, #0xf + ldr r1, _020B43C8 ; =sVADInfo + mov r0, #0x44 + smulbb r0, r2, r0 + str r2, [r1, #8] + ldr ip, _020B43CC ; =VCT_ResetVAD + str r0, [r1, #0xc] + bx ip + .align 2, 0 +_020B43C8: .word sVADInfo +_020B43CC: .word VCT_ResetVAD + arm_func_end vct_init_vad + + arm_func_start HPFFilter +HPFFilter: ; 0x020B43D0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldrsh r2, [r0] + ldr r3, _020B44A8 ; =_021D7008 + ldr r5, _020B44AC ; =0x00000E9F + ldr r4, [r3, #4] + smulbb r7, r2, r5 + ldr r2, [r3, #0x10] + ldr r6, _020B44B0 ; =0x00000D3E + add r4, r7, r4 + mla r4, r2, r6, r4 + mov r4, r4, asr #0xc + mul lr, r4, r4 + mov r1, r1, lsr #1 + str r4, [r3, #0x10] + rsb r2, r7, #0 + str r2, [r3, #4] + cmp r1, #1 + mov ip, lr, asr #0x1f + mov r3, #1 + bls _020B4468 +_020B4420: + mov r7, r3, lsl #1 + ldrsh r8, [r0, r7] + add r7, r0, r3, lsl #1 + add r3, r3, #1 + smulbb r8, r8, r5 + add r2, r8, r2 + mla r2, r4, r6, r2 + strh r4, [r7, #-2] + mov r4, r2, asr #0xc + mul r2, r4, r4 + adds lr, lr, r2 + adc ip, ip, r2, asr #31 + rsb r2, r8, #0 + cmp r3, r1 + blo _020B4420 + ldr r3, _020B44A8 ; =_021D7008 + str r2, [r3, #4] + str r4, [r3, #0x10] +_020B4468: + add r0, r0, r1, lsl #1 + strh r4, [r0, #-2] + ldr r2, _020B44B4 ; =0x04000280 + mov r0, #1 + strh r0, [r2] + str lr, [r2, #0x10] + str ip, [r2, #0x14] + str r1, [r2, #0x18] + mov r0, #0 + str r0, [r2, #0x1c] +_020B4490: + ldrh r0, [r2] + tst r0, #0x8000 + bne _020B4490 + ldr r0, _020B44B8 ; =0x040002A0 + ldr r0, [r0] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020B44A8: .word _021D7008 +_020B44AC: .word 0x00000E9F +_020B44B0: .word 0x00000D3E +_020B44B4: .word 0x04000280 +_020B44B8: .word 0x040002A0 + arm_func_end HPFFilter + + arm_func_start InitFIRFilter +InitFIRFilter: ; 0x020B44BC + stmdb sp!, {r3, lr} + ldr r0, _020B4520 ; =_021D7008 + mov r2, #0 + ldr r1, _020B4524 ; =0x0000019D + str r2, [r0, #0xc] + str r1, [r0, #8] + ldr ip, _020B4528 ; =sImpulseResponse + ldr r0, _020B452C ; =sDelayLine + mov lr, r2 +_020B44E0: + mov r1, r2, lsl #1 + add r2, r2, #1 + strh lr, [r0, r1] + cmp r2, #0x800 + blt _020B44E0 + ldr r2, _020B4530 ; =sTap + ldr r0, _020B4534 ; =sH + mov r3, #0 +_020B4500: + mov r1, lr, lsl #1 + ldrsh r1, [ip, r1] + str r3, [r2, lr, lsl #2] + str r1, [r0, lr, lsl #2] + add lr, lr, #1 + cmp lr, #6 + blt _020B4500 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B4520: .word _021D7008 +_020B4524: .word 0x0000019D +_020B4528: .word sImpulseResponse +_020B452C: .word sDelayLine +_020B4530: .word sTap +_020B4534: .word sH + arm_func_end InitFIRFilter + + arm_func_start vct_set_speaker_samples +vct_set_speaker_samples: ; 0x020B4538 + ldr ip, _020B4548 ; =MIi_CpuCopyFast + mov r2, r1 + ldr r1, _020B454C ; =sSpkBuffer + bx ip + .align 2, 0 +_020B4548: .word MIi_CpuCopyFast +_020B454C: .word sSpkBuffer + arm_func_end vct_set_speaker_samples + + arm_func_start DoFIRFilter +DoFIRFilter: ; 0x020B4550 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x10 + mov r4, #0 + str r4, [sp, #8] + str r4, [sp, #0xc] + mov r8, r4 + movs r2, r2, lsr #1 + beq _020B4678 + ldr lr, _020B4754 ; =0x3FFF8000 + ldr ip, _020B4758 ; =_021D7008 +_020B4578: + mov r4, r8, lsl #1 + ldr r7, [ip, #0xc] + ldrsh r6, [r1, r4] + ldr r4, _020B475C ; =sDelayLine + mov r5, r7, lsl #1 + strh r6, [r4, r5] + ldr r4, [ip, #8] + str r4, [sp] + mov r5, r4, lsl #1 + ldr r4, _020B475C ; =sDelayLine + ldrsh r6, [r4, r5] + str r6, [ip, #0x2c] + ldr sb, [ip, #0x3c] + ldr sl, [ip, #0x24] + ldr r5, [ip, #0x40] + mul sl, sb, sl + ldr r4, [ip, #0x28] + str sb, [sp, #4] + mla r4, r5, r4, sl + mov r5, sb + str r5, [ip, #0x40] + ldr sb, [ip, #0x38] + ldr r5, [ip, #0x20] + mla r5, sb, r5, r4 + str sb, [ip, #0x3c] + ldr sb, [ip, #0x34] + ldr r4, [ip, #0x1c] + mla r5, sb, r4, r5 + str sb, [ip, #0x38] + ldr sb, [ip, #0x30] + ldr r4, [ip, #0x18] + mla r5, sb, r4, r5 + str sb, [ip, #0x34] + ldr r4, [ip, #0x14] + mla r4, r6, r4, r5 + cmp r4, lr + str r6, [ip, #0x30] + movgt r4, lr + bgt _020B461C + cmp r4, #0xc0000000 + movlt r4, #0xc0000000 +_020B461C: + add r5, r7, #1 + and r5, r5, lr, lsr #19 + str r5, [ip, #0xc] + ldr r5, [sp] + mov r6, r8, lsl #1 + add r5, r5, #1 + and r5, r5, lr, lsr #19 + str r5, [ip, #8] + mov r4, r4, asr #0xf + strh r4, [r1, r6] + ldrsh r5, [r1, r6] + ldrsh r4, [r0, r6] + add r8, r8, #1 + smulbb r5, r5, r5 + strh r4, [r1, r6] + ldr r4, [sp, #8] + adds r4, r4, r5 + str r4, [sp, #8] + ldr r4, [sp, #0xc] + adc r4, r4, r5, asr #31 + str r4, [sp, #0xc] + cmp r8, r2 + blo _020B4578 +_020B4678: + ldr r4, _020B4760 ; =0x04000280 + mov r1, #1 + strh r1, [r4] + ldr r1, [sp, #8] + str r1, [r4, #0x10] + ldr r1, [sp, #0xc] + str r1, [r4, #0x14] + str r2, [r4, #0x18] + mov r1, #0 + str r1, [r4, #0x1c] +_020B46A0: + ldrh r1, [r4] + tst r1, #0x8000 + bne _020B46A0 + ldr r5, _020B4764 ; =0x040002A0 + mov r1, #0 + ldr r4, [r5] + strh r1, [r5, #0x10] + str r4, [r5, #0x18] +_020B46C0: + ldrh r1, [r5, #0x10] + tst r1, #0x8000 + bne _020B46C0 + ldr r1, _020B4768 ; =0x040002B4 + ldr r4, [r1] + add r1, r4, r4, lsl #1 + cmp r1, r3, lsl #1 + bhs _020B46F4 + ldr r0, _020B4758 ; =_021D7008 + mov r1, #0 + add sp, sp, #0x10 + strh r1, [r0] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020B46F4: + cmp r3, r4 + ldrlo r1, _020B4758 ; =_021D7008 + movlo r3, #4 + strloh r3, [r1] + ldr r1, _020B4758 ; =_021D7008 + mov r5, #0 + ldrsh r3, [r1] + cmp r3, #4 + addlt r3, r3, #1 + strlth r3, [r1] + cmp r2, #0 + addls sp, sp, #0x10 + ldmlsia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, _020B4758 ; =_021D7008 + ldrsh r4, [r1] +_020B4730: + mov r3, r5, lsl #1 + ldrsh r1, [r0, r3] + add r5, r5, #1 + cmp r5, r2 + mov r1, r1, asr r4 + strh r1, [r0, r3] + blo _020B4730 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020B4754: .word 0x3FFF8000 +_020B4758: .word _021D7008 +_020B475C: .word sDelayLine +_020B4760: .word 0x04000280 +_020B4764: .word 0x040002A0 +_020B4768: .word 0x040002B4 + arm_func_end DoFIRFilter + + arm_func_start vct_process_fir +vct_process_fir: ; 0x020B476C + stmdb sp!, {r3, lr} + mov ip, r1 + mov r3, r2 + ldr r1, _020B4788 ; =sSpkBuffer + mov r2, ip + bl DoFIRFilter + ldmia sp!, {r3, pc} + .align 2, 0 +_020B4788: .word sSpkBuffer + arm_func_end vct_process_fir + + arm_func_start vct_mix_audio +vct_mix_audio: ; 0x020B478C + stmdb sp!, {r4, r5, r6, lr} + mov r4, #0 + movs lr, r3, lsr #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r3, #0x8000 + rsb r3, r3, #0 + mov ip, r3, lsr #0x11 +_020B47A8: + mov r5, r4, lsl #1 + ldrsh r6, [r0, r5] + ldrsh r5, [r1, r5] + add r6, r6, r5 + cmp r6, r3, lsr #17 + movgt r6, ip + bgt _020B47CC + cmp r6, r3 + movlt r6, r3 +_020B47CC: + mov r5, r4, lsl #1 + strh r6, [r2, r5] + add r6, r0, r4, lsl #1 + add r5, r1, r4, lsl #1 + ldrsh r6, [r6, #2] + ldrsh r5, [r5, #2] + add r6, r6, r5 + cmp r6, r3, lsr #17 + movgt r6, ip + bgt _020B47FC + cmp r6, r3 + movlt r6, r3 +_020B47FC: + add r5, r2, r4, lsl #1 + strh r6, [r5, #2] + add r6, r0, r4, lsl #1 + add r5, r1, r4, lsl #1 + ldrsh r6, [r6, #4] + ldrsh r5, [r5, #4] + add r6, r6, r5 + cmp r6, r3, lsr #17 + movgt r6, ip + bgt _020B482C + cmp r6, r3 + movlt r6, r3 +_020B482C: + add r5, r2, r4, lsl #1 + strh r6, [r5, #4] + add r6, r0, r4, lsl #1 + add r5, r1, r4, lsl #1 + ldrsh r6, [r6, #6] + ldrsh r5, [r5, #6] + add r6, r6, r5 + cmp r6, r3, lsr #17 + movgt r6, ip + bgt _020B485C + cmp r6, r3 + movlt r6, r3 +_020B485C: + add r5, r2, r4, lsl #1 + add r4, r4, #4 + strh r6, [r5, #6] + cmp r4, lr + blo _020B47A8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end vct_mix_audio + + arm_func_start VCT_Init +VCT_Init: ; 0x020B4874 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _020B49A0 ; =_version_Abiosso_libVCT + bl OSi_ReferSymbol + cmp r4, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _020B49A4 ; =_021D848C + ldr r0, [r0, #8] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #8] + cmp r0, #1 + cmpne r0, #2 + cmpne r0, #3 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #0x18] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r2, [r4, #0x10] + cmp r2, #0 + ldrne r0, [r4, #0x14] + cmpne r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, r2, lsr #0x1f + rsb r0, r1, r2, lsl #27 + adds r0, r1, r0, ror #27 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, _020B49A8 ; =__vct + mov r1, #0 + mov r2, #0x18 + bl MI_CpuFill8 + ldr r2, [r4, #0x18] + ldr r1, _020B49A4 ; =_021D848C + mov r0, #0 + str r2, [r1, #0x10] + ldr r2, [r4, #0x1c] + str r2, [r1, #0x14] + ldr r2, [r4, #8] + str r2, [r1, #0x1c] + str r0, [r1, #0x18] + ldrb r2, [r4, #0xc] + cmp r2, #0x20 + ldmhsia sp!, {r4, pc} + strb r2, [r1, #0xc] + ldr r0, [r4, #0x10] + ldr r1, [r4, #0x14] + bl vct_init_packet_buffer + cmp r0, #0 + bne _020B495C + bl vct_cleanup_packet_buffer + mov r0, #0 + ldmia sp!, {r4, pc} +_020B495C: + mov r0, r4 + bl vct_init_ssp + cmp r0, #0 + bne _020B4978 + bl vct_cleanup_packet_buffer + mov r0, #0 + ldmia sp!, {r4, pc} +_020B4978: + bl vct_init_audio + cmp r0, #0 + ldrne r1, _020B49A4 ; =_021D848C + movne r0, #1 + strne r0, [r1, #8] + ldmneia sp!, {r4, pc} + bl vct_finish_ssp + bl vct_cleanup_packet_buffer + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B49A0: .word _version_Abiosso_libVCT +_020B49A4: .word _021D848C +_020B49A8: .word __vct + arm_func_end VCT_Init + + arm_func_start VCT_Cleanup +VCT_Cleanup: ; 0x020B49AC + stmdb sp!, {r3, lr} + bl vct_finish_audio + bl vct_finish_ssp + bl vct_cleanup_packet_buffer + ldr r0, _020B49D0 ; =_021D848C + mov r1, #0 + str r1, [r0, #0x1c] + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020B49D0: .word _021D848C + arm_func_end VCT_Cleanup + + arm_func_start VCT_Main +VCT_Main: ; 0x020B49D4 + stmdb sp!, {r3, lr} + ldr r0, _020B4A14 ; =_021D848C + ldr r1, [r0, #8] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + tst r1, #0xf + bne _020B4A00 + bl vct_check_timeout +_020B4A00: + bl vct_flush_send_buffer + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl vct_decode_audio_buffer + ldmia sp!, {r3, pc} + .align 2, 0 +_020B4A14: .word _021D848C + arm_func_end VCT_Main + + arm_func_start VCT_HandleData +VCT_HandleData: ; 0x020B4A18 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + add r3, sp, #0 + mov r4, r0 + bl VCTi_HandleData + cmp r0, #0 + beq _020B4A7C + cmp r0, #1 + beq _020B4A48 + cmp r0, #2 + beq _020B4A70 + b _020B4A7C +_020B4A48: + ldr r0, _020B4A88 ; =_021D848C + ldr r1, [sp] + ldr r2, [sp, #4] + ldr r3, [r0, #0x14] + ldr ip, [r0, #0x10] + mov r0, r4 + blx ip + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r4, pc} +_020B4A70: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, pc} +_020B4A7C: + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4A88: .word _021D848C + arm_func_end VCT_HandleData + + arm_func_start VCTi_HandleData +VCTi_HandleData: ; 0x020B4A8C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r6, r1 + mov r7, r0 + mov r5, r2 + mov r4, r3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r6] + ldr r0, _020B4B60 ; =0x5F564354 + cmp r1, r0 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _020B4B64 ; =_021D848C + ldr r1, [r0, #0x1c] + cmp r1, #0 + ldrne r0, [r0, #8] + cmpne r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + str r0, [r4] + str r0, [r4, #4] + bl OS_GetTick + ldrb r2, [r6, #4] + and r3, r2, #0xf0 + cmp r3, #0x40 + bne _020B4B28 + ldr r2, _020B4B64 ; =_021D848C + mov r3, r0 + ldr r4, [r2, #4] + mov r0, r7 + add r4, r4, #1 + str r4, [r2, #4] + str r1, [sp] + mov r1, r6 + mov r2, r5 + bl vct_handle_audio + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B4B28: + cmp r2, #0 + cmpne r2, #0xff + bne _020B4B58 + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl vct_handle_ssp + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B4B58: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B4B60: .word 0x5F564354 +_020B4B64: .word _021D848C + arm_func_end VCTi_HandleData + + .rodata + +cAdpcmIndexTable2: + .byte 0xFF, 0x01, 0xFF, 0x01 + +cAdpcmIndexTable3: + .byte 0xFF, 0xFF, 0x01, 0x02 + .byte 0xFF, 0xFF, 0x01, 0x02 +cAdpcmIndexTable4: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x04, 0x06, 0x08, 0xFF, 0xFF, 0xFF, 0xFF + .byte 0x02, 0x04, 0x06, 0x08 +cAdpcmStepSizeTable: + .byte 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00 + .byte 0x0D, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x11, 0x00, 0x13, 0x00, 0x15, 0x00, 0x17, 0x00, 0x19, 0x00 + .byte 0x1C, 0x00, 0x1F, 0x00, 0x22, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2D, 0x00, 0x32, 0x00, 0x37, 0x00 + .byte 0x3C, 0x00, 0x42, 0x00, 0x49, 0x00, 0x50, 0x00, 0x58, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x76, 0x00 + .byte 0x82, 0x00, 0x8F, 0x00, 0x9D, 0x00, 0xAD, 0x00, 0xBE, 0x00, 0xD1, 0x00, 0xE6, 0x00, 0xFD, 0x00 + .byte 0x17, 0x01, 0x33, 0x01, 0x51, 0x01, 0x73, 0x01, 0x98, 0x01, 0xC1, 0x01, 0xEE, 0x01, 0x20, 0x02 + .byte 0x56, 0x02, 0x92, 0x02, 0xD4, 0x02, 0x1C, 0x03, 0x6C, 0x03, 0xC3, 0x03, 0x24, 0x04, 0x8E, 0x04 + .byte 0x02, 0x05, 0x83, 0x05, 0x10, 0x06, 0xAB, 0x06, 0x56, 0x07, 0x12, 0x08, 0xE0, 0x08, 0xC3, 0x09 + .byte 0xBD, 0x0A, 0xD0, 0x0B, 0xFF, 0x0C, 0x4C, 0x0E, 0xBA, 0x0F, 0x4C, 0x11, 0x07, 0x13, 0xEE, 0x14 + .byte 0x06, 0x17, 0x54, 0x19, 0xDC, 0x1B, 0xA5, 0x1E, 0xB6, 0x21, 0x15, 0x25, 0xCA, 0x28, 0xDF, 0x2C + .byte 0x5B, 0x31, 0x4B, 0x36, 0xB9, 0x3B, 0xB2, 0x41, 0x44, 0x48, 0x7E, 0x4F, 0x71, 0x57, 0x2F, 0x60 + .byte 0xCE, 0x69, 0x62, 0x74, 0xFF, 0x7F, 0x00, 0x00 + +sCodecInfo: + .byte 0x08, 0x00, 0x08, 0x00, 0x02, 0x04, 0x03, 0x04 + .byte 0x04, 0x04 + +sTransceiverBalance: + .byte 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02 + .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00 + +sRequestEvent: + .byte 0x01, 0x08, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00 + +sResponseEvent: + .byte 0x07, 0x0C, 0x02, 0x03, 0x09, 0x02, 0x00, 0x00 + +sTransRecvState: + .byte 0xFE, 0xFE, 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFF, 0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFE, 0xFE + .byte 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE + .byte 0xFE, 0xFE, 0xFD, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF + +sSendState: + .byte 0x01, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE + .byte 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x05, 0xFE, 0xFE, 0xFE, 0x00, 0xFE, 0xFE, 0xFE, 0xFE + .byte 0xFE, 0x05, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE + .byte 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x02, 0x00, 0x00, 0x00, 0xFE + .byte 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0xFE + +sTransSendState: + .byte 0xFE, 0xFE, 0xFE, 0x01 + .byte 0xFF, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x05, 0x05, 0xFE, 0xFF, 0xFE, 0x00, 0xFE, 0xFE + .byte 0xFE, 0xFE, 0xFE, 0x05, 0xFE, 0xFE, 0xFF, 0xFE, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE + .byte 0xFE, 0xFF, 0xFE, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x03, 0x00, 0x00 + .byte 0x00, 0xFE, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0xFE + +sRecvState: + .byte 0x04, 0xFE + .byte 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x02, 0x00 + .byte 0x00, 0x00, 0xFF, 0x00, 0xFE, 0x05, 0x05, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE + .byte 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x05, 0xFE, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF + .byte 0x14, 0x59, 0x0B, 0x02, 0x34, 0x59, 0x0B, 0x02, 0xFC, 0x58, 0x0B, 0x02, 0x10, 0x59, 0x0B, 0x02 + + .data + +sEnableVAD: + .byte 0x01, 0x00, 0x00, 0x00 +ulaw_segment: + .byte 0x3F, 0x00, 0x00, 0x00 + .byte 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00 + .byte 0xFF, 0x07, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00 +sTransceiverLimit: + .byte 0xF7, 0xB5, 0xEF, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 +sVADInfo: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00 + .byte 0xFC, 0x03, 0x00, 0x00 +sImpulseResponse: + .byte 0xFB, 0xE9, 0x3D, 0x40, 0xBC, 0xC7, 0xD1, 0x2C, 0x2A, 0xD0, 0x7C, 0x03 + .byte 0xF0, 0x08, 0x93, 0xF5 diff --git a/lib/asm/msl.s b/lib/asm/msl.s new file mode 100644 index 00000000..da02a699 --- /dev/null +++ b/lib/asm/msl.s @@ -0,0 +1,20392 @@ + .include "asm/macros.inc" + .include "msl.inc" + .include "global.inc" + .public __sinit__ + .public __exception_table_start__ + .public __exception_table_end__ + .type __sinit__, @function + .public OSi_ThreadInfo + .type OSi_ThreadInfo, @function + + .bss + + ; msl + .public _021E5390 + .type _021E5390, @function +_021E5390: + .space 0x10 + +_021E53A0: + .space 0x100 + +_021E54A0: + .space 0x24 + +_021E54C4: + .space 0x24 + +_021E54E8: + .space 0x48 + +_021E5530: + .space 0x60 + +_021E5590: + .space 0x30 + +_021E55C0: + .space 0x100 + +_021E56C0: + .space 0x100 + +_021E57C0: + .space 0x100 + + .public _021E58C0 +_021E58C0: + .space 0x4 + +_021E58C4: + .space 0x1C + + .public _ZSt7nothrow +_ZSt7nothrow: + .space 0x4 + +_ZSt13__new_handler: + .space 0x4 + +__global_destructor_chain: ; 0x021E58E8 + .space 4 + + .text + + ; MSL_C_NITRO_Ai_LE.a + + arm_func_start abort +abort: ; 0x020E47C0 + stmdb sp!, {r3, lr} + mov r0, #1 + bl raise + ldr r1, _020E47E0 ; =_021E5390 + mov r0, #1 + str r0, [r1, #0xc] + bl exit + ldmia sp!, {r3, pc} + .align 2, 0 +_020E47E0: .word _021E5390 + arm_func_end abort + + arm_func_start exit +exit: ; 0x020E47E4 + stmdb sp!, {r4, lr} + ldr r1, _020E482C ; =_021E5390 + mov r4, r0 + ldr r0, [r1, #0xc] + cmp r0, #0 + bne _020E4820 + bl __destroy_global_chain + ldr r0, _020E482C ; =_021E5390 + ldr r0, [r0, #4] + cmp r0, #0 + beq _020E4820 + blx r0 + ldr r0, _020E482C ; =_021E5390 + mov r1, #0 + str r1, [r0, #4] +_020E4820: + mov r0, r4 + bl __exit + ldmia sp!, {r4, pc} + .align 2, 0 +_020E482C: .word _021E5390 + arm_func_end exit + + arm_func_start __exit +__exit: ; 0x020E4830 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020E4940 ; =_021E54E8 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E4868 + ldr r0, _020E4944 ; =OSi_ThreadInfo + ldr r1, _020E4948 ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E494C ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1] + str r2, [r0] + b _020E48C0 +_020E4868: + ldr r0, _020E4944 ; =OSi_ThreadInfo + ldr r1, _020E4948 ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E4898 + ldr r0, _020E494C ; =_021E54C4 + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + b _020E48C0 +_020E4898: + ldr r0, _020E4940 ; =_021E54E8 + bl OS_LockMutex + ldr r0, _020E4944 ; =OSi_ThreadInfo + ldr r1, _020E4948 ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E494C ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1] + str r2, [r0] +_020E48C0: + ldr r4, _020E4950 ; =_021E5390 + ldr r0, [r4, #8] + cmp r0, #0 + ble _020E48F4 + ldr r5, _020E4954 ; =_021E53A0 +_020E48D4: + ldr r0, [r4, #8] + sub r1, r0, #1 + ldr r0, [r5, r1, lsl #2] + str r1, [r4, #8] + blx r0 + ldr r0, [r4, #8] + cmp r0, #0 + bgt _020E48D4 +_020E48F4: + ldr r0, _020E494C ; =_021E54C4 + ldr r1, [r0] + subs r1, r1, #1 + str r1, [r0] + bne _020E4910 + ldr r0, _020E4940 ; =_021E54E8 + bl OS_UnlockMutex +_020E4910: + ldr r0, _020E4950 ; =_021E5390 + ldr r0, [r0] + cmp r0, #0 + beq _020E4930 + blx r0 + ldr r0, _020E4950 ; =_021E5390 + mov r1, #0 + str r1, [r0] +_020E4930: + mov r0, #0 + bl fflush + bl _ExitProcess + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E4940: .word _021E54E8 +_020E4944: .word OSi_ThreadInfo +_020E4948: .word _021E54A0 +_020E494C: .word _021E54C4 +_020E4950: .word _021E5390 +_020E4954: .word _021E53A0 + arm_func_end __exit + + arm_func_start nan +nan: ; 0x020E4958 + ldr r0, _020E4968 ; =_021110EC + ldr ip, _020E496C ; =_f2d + ldr r0, [r0] + bx ip + .align 2, 0 +_020E4968: .word _021110EC +_020E496C: .word _f2d + arm_func_end nan + + arm_func_start malloc +malloc: ; 0x020E4970 + stmdb sp!, {r3, lr} + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl __sys_alloc + ldmia sp!, {r3, pc} + arm_func_end malloc + + arm_func_start free +free: ; 0x020E4988 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl __sys_free + ldmia sp!, {r3, pc} + arm_func_end free + + arm_func_start __flush_line_buffered_output_files +__flush_line_buffered_output_files: ; 0x020E499C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r0, _020E4A24 ; =_02110FCC + mov r4, #0 + mov r5, #1 + mov r8, r0 + mvn sb, #0 + mov r7, r4 + mov r6, #0x4c +_020E49BC: + ldr r1, [r0, #4] + mov r2, r1, lsl #0x16 + movs r2, r2, lsr #0x1d + beq _020E49FC + mov r1, r1, lsl #0x19 + mov r1, r1, lsr #0x1e + tst r1, #1 + beq _020E49FC + ldr r1, [r0, #8] + mov r1, r1, lsl #0x1d + mov r1, r1, lsr #0x1d + cmp r1, #1 + bne _020E49FC + bl fflush + cmp r0, #0 + movne r4, sb +_020E49FC: + cmp r5, #3 + movge r0, r7 + bge _020E4A14 + mul r0, r5, r6 + add r5, r5, #1 + add r0, r8, r0 +_020E4A14: + cmp r0, #0 + bne _020E49BC + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020E4A24: .word _02110FCC + arm_func_end __flush_line_buffered_output_files + + arm_func_start __flush_all +__flush_all: ; 0x020E4A28 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r0, _020E4A8C ; =_02110FCC + mov r4, #0 + mov r5, #1 + mov r8, r0 + mvn sb, #0 + mov r7, r4 + mov r6, #0x4c +_020E4A48: + ldr r1, [r0, #4] + mov r1, r1, lsl #0x16 + movs r1, r1, lsr #0x1d + beq _020E4A64 + bl fflush + cmp r0, #0 + movne r4, sb +_020E4A64: + cmp r5, #3 + movge r0, r7 + bge _020E4A7C + mul r0, r5, r6 + add r5, r5, #1 + add r0, r8, r0 +_020E4A7C: + cmp r0, #0 + bne _020E4A48 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020E4A8C: .word _02110FCC + arm_func_end __flush_all + + arm_func_start abs +abs: ; 0x020E4A90 + cmp r0, #0 + rsblt r0, r0, #0 + bx lr + arm_func_end abs + + arm_func_start __msl_assertion_failed +__msl_assertion_failed: ; 0x020E4A9C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov lr, r1 + mov ip, r2 + str r3, [sp] + ldr r0, _020E4AD4 ; =_021110B0 + mov r1, r4 + mov r2, lr + mov r3, ip + bl printf + bl abort + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020E4AD4: .word _021110B0 + arm_func_end __msl_assertion_failed + + arm_func_start __convert_from_newlines +__convert_from_newlines: ; 0x020E4AD8 + bx lr + arm_func_end __convert_from_newlines + + arm_func_start __convert_to_newlines +__convert_to_newlines: ; 0x020E4ADC + bx lr + arm_func_end __convert_to_newlines + + arm_func_start __prep_buffer +__prep_buffer: ; 0x020E4AE0 + ldr r1, [r0, #0x1c] + str r1, [r0, #0x24] + ldr r3, [r0, #0x20] + str r3, [r0, #0x28] + ldr r2, [r0, #0x18] + ldr r1, [r0, #0x2c] + and r1, r2, r1 + sub r1, r3, r1 + str r1, [r0, #0x28] + ldr r1, [r0, #0x18] + str r1, [r0, #0x34] + bx lr + arm_func_end __prep_buffer + + arm_func_start __load_buffer +__load_buffer: ; 0x020E4B10 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r2 + mov r4, r0 + mov r6, r1 + bl __prep_buffer + cmp r5, #1 + ldreq r0, [r4, #0x20] + add r2, r4, #0x28 + streq r0, [r4, #0x28] + ldr r0, [r4] + ldr r1, [r4, #0x1c] + ldr r3, [r4, #0x48] + ldr ip, [r4, #0x3c] + blx ip + cmp r0, #2 + moveq r1, #0 + streq r1, [r4, #0x28] + cmp r6, #0 + ldrne r1, [r4, #0x28] + strne r1, [r6] + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, [r4, #0x18] + ldr r0, [r4, #0x28] + add r0, r1, r0 + str r0, [r4, #0x18] + ldr r0, [r4, #4] + mov r0, r0, lsl #0x13 + movs r0, r0, lsr #0x1f + bne _020E4B94 + ldr r0, [r4, #0x1c] + add r1, r4, #0x28 + bl __convert_to_newlines +_020E4B94: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end __load_buffer + + arm_func_start __flush_buffer +__flush_buffer: ; 0x020E4B9C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r2, [r5, #0x24] + ldr r0, [r5, #0x1c] + mov r4, r1 + subs r0, r2, r0 + beq _020E4C14 + str r0, [r5, #0x28] + ldr r0, [r5, #4] + mov r0, r0, lsl #0x13 + movs r0, r0, lsr #0x1f + bne _020E4BD8 + ldr r0, [r5, #0x1c] + add r1, r5, #0x28 + bl __convert_from_newlines +_020E4BD8: + ldr r0, [r5] + ldr r1, [r5, #0x1c] + ldr r3, [r5, #0x48] + ldr ip, [r5, #0x40] + add r2, r5, #0x28 + blx ip + cmp r4, #0 + ldrne r1, [r5, #0x28] + strne r1, [r4] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #0x18] + ldr r0, [r5, #0x28] + add r0, r1, r0 + str r0, [r5, #0x18] +_020E4C14: + mov r0, r5 + bl __prep_buffer + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __flush_buffer + + arm_func_start fread +fread: ; 0x020E4C24 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r4, _020E4D1C ; =_02110FCC + mov r7, r3 + cmp r7, r4 + moveq r6, #2 + mov sl, r0 + movne r6, #5 + mov r0, #0x18 + mul r4, r6, r0 + ldr r5, _020E4D20 ; =_021E54E8 + mov sb, r1 + add r0, r5, r4 + mov r8, r2 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E4C88 + ldr r0, _020E4D24 ; =OSi_ThreadInfo + ldr r2, _020E4D28 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E4D2C ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] + b _020E4CE0 +_020E4C88: + ldr r0, _020E4D24 ; =OSi_ThreadInfo + ldr r1, _020E4D28 ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1, r6, lsl #2] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E4CB8 + ldr r1, _020E4D2C ; =_021E54C4 + ldr r0, [r1, r6, lsl #2] + add r0, r0, #1 + str r0, [r1, r6, lsl #2] + b _020E4CE0 +_020E4CB8: + add r0, r5, r4 + bl OS_LockMutex + ldr r0, _020E4D24 ; =OSi_ThreadInfo + ldr r2, _020E4D28 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E4D2C ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] +_020E4CE0: + mov r0, sl + mov r1, sb + mov r2, r8 + mov r3, r7 + bl __fread + ldr r1, _020E4D2C ; =_021E54C4 + mov r7, r0 + ldr r0, [r1, r6, lsl #2] + subs r0, r0, #1 + str r0, [r1, r6, lsl #2] + bne _020E4D14 + add r0, r5, r4 + bl OS_UnlockMutex +_020E4D14: + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020E4D1C: .word _02110FCC +_020E4D20: .word _021E54E8 +_020E4D24: .word OSi_ThreadInfo +_020E4D28: .word _021E54A0 +_020E4D2C: .word _021E54C4 + arm_func_end fread + + arm_func_start __fread +__fread: ; 0x020E4D30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r7, r3 + mov sb, r0 + mov r8, r1 + mov r0, r7 + mov r1, #0 + mov r4, r2 + bl fwide + cmp r0, #0 + bne _020E4D68 + mov r0, r7 + mvn r1, #0 + bl fwide +_020E4D68: + muls r4, r8, r4 + beq _020E4D8C + ldrb r0, [r7, #0xd] + cmp r0, #0 + bne _020E4D8C + ldr r1, [r7, #4] + mov r0, r1, lsl #0x16 + movs r0, r0, lsr #0x1d + bne _020E4D98 +_020E4D8C: + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020E4D98: + mov r0, r1, lsl #0x13 + movs r0, r0, lsr #0x1f + movne r0, r1, lsl #0x19 + movne r0, r0, lsr #0x1e + ldr r1, [r7, #8] + cmpne r0, #2 + mov r6, #1 + mov r0, r1, lsl #0x1d + movne r6, #0 + movs r0, r0, lsr #0x1d + bne _020E4DEC + ldr r0, [r7, #4] + mov r0, r0, lsl #0x1b + mov r0, r0, lsr #0x1d + tst r0, #1 + beq _020E4DEC + bic r0, r1, #7 + orr r0, r0, #2 + str r0, [r7, #8] + mov r0, #0 + str r0, [r7, #0x28] +_020E4DEC: + ldr r0, [r7, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #2 + bhs _020E4E18 + mov r0, #1 + strb r0, [r7, #0xd] + mov r0, #0 + add sp, sp, #4 + str r0, [r7, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020E4E18: + ldr r0, [r7, #4] + mov r0, r0, lsl #0x19 + mov r0, r0, lsr #0x1e + tst r0, #1 + beq _020E4E50 + bl __flush_line_buffered_output_files + cmp r0, #0 + beq _020E4E50 + mov r0, #1 + strb r0, [r7, #0xd] + mov r0, #0 + add sp, sp, #4 + str r0, [r7, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020E4E50: + cmp r4, #0 + mov r5, #0 + beq _020E4F14 + ldr r0, [r7, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #3 + blo _020E4F14 + mov sl, r5 +_020E4E74: + mov r0, r7 + mov r1, sl + bl fwide + cmp r0, #1 + ldr r0, [r7, #8] + bne _020E4EA8 + mov r0, r0, lsl #0x1d + add r0, r7, r0, lsr #28 + ldrh r0, [r0, #0xe] + add r5, r5, #2 + sub r4, r4, #2 + strh r0, [sb], #2 + b _020E4EC0 +_020E4EA8: + mov r0, r0, lsl #0x1d + add r0, r7, r0, lsr #29 + ldrb r0, [r0, #0xf] + add r5, r5, #1 + sub r4, r4, #1 + strb r0, [sb], #1 +_020E4EC0: + ldr r1, [r7, #8] + cmp r4, #0 + mov r0, r1, lsl #0x1d + mov r0, r0, lsr #0x1d + sub r0, r0, #1 + bic r1, r1, #7 + and r0, r0, #7 + orr r0, r1, r0 + str r0, [r7, #8] + beq _020E4EFC + ldr r0, [r7, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #3 + bhs _020E4E74 +_020E4EFC: + ldr r0, [r7, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #2 + ldreq r0, [r7, #0x30] + streq r0, [r7, #0x28] +_020E4F14: + cmp r4, #0 + beq _020E4FD8 + ldr r0, [r7, #0x28] + cmp r0, #0 + cmpeq r6, #0 + beq _020E4FD8 + mov sl, #0 +_020E4F30: + ldr r0, [r7, #0x28] + cmp r0, #0 + bne _020E4F84 + mov r0, r7 + mov r1, sl + mov r2, sl + bl __load_buffer + cmp r0, #0 + beq _020E4F84 + cmp r0, #1 + mov r0, #1 + streqb r0, [r7, #0xd] + beq _020E4F74 + ldr r1, [r7, #8] + bic r1, r1, #7 + str r1, [r7, #8] + strb r0, [r7, #0xc] +_020E4F74: + mov r0, #0 + str r0, [r7, #0x28] + mov r4, #0 + b _020E4FD8 +_020E4F84: + ldr r0, [r7, #0x28] + str r0, [sp] + cmp r0, r4 + strhi r4, [sp] + ldr r1, [r7, #0x24] + ldr r2, [sp] + mov r0, sb + bl memcpy + ldr r2, [sp] + ldr r0, [r7, #0x24] + subs r4, r4, r2 + add r0, r0, r2 + str r0, [r7, #0x24] + ldr r1, [r7, #0x28] + ldr r0, [sp] + add sb, sb, r2 + sub r0, r1, r0 + add r5, r5, r2 + str r0, [r7, #0x28] + cmpne r6, #0 + bne _020E4F30 +_020E4FD8: + cmp r4, #0 + beq _020E5064 + cmp r6, #0 + bne _020E5064 + ldr r6, [r7, #0x1c] + ldr sl, [r7, #0x20] + add r1, sp, #0 + str sb, [r7, #0x1c] + mov r0, r7 + mov r2, #1 + str r4, [r7, #0x20] + bl __load_buffer + cmp r0, #0 + beq _020E5044 + cmp r0, #1 + mov r0, #1 + bne _020E502C + strb r0, [r7, #0xd] + mov r0, #0 + str r0, [r7, #0x28] + b _020E5044 +_020E502C: + ldr r1, [r7, #8] + bic r1, r1, #7 + str r1, [r7, #8] + strb r0, [r7, #0xc] + mov r0, #0 + str r0, [r7, #0x28] +_020E5044: + ldr r1, [sp] + mov r0, r7 + str r6, [r7, #0x1c] + str sl, [r7, #0x20] + add r5, r5, r1 + bl __prep_buffer + mov r0, #0 + str r0, [r7, #0x28] +_020E5064: + mov r0, r5 + mov r1, r8 + bl _u32_div_f + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end __fread + + arm_func_start __fwrite +__fwrite: ; 0x020E5078 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sb, r3 + mov sl, r0 + str r1, [sp] + mov r0, sb + mov r1, #0 + mov r4, r2 + bl fwide + cmp r0, #0 + bne _020E50B0 + mov r0, sb + mvn r1, #0 + bl fwide +_020E50B0: + ldr r0, [sp] + muls r5, r0, r4 + beq _020E50D8 + ldrb r0, [sb, #0xd] + cmp r0, #0 + bne _020E50D8 + ldr r1, [sb, #4] + mov r0, r1, lsl #0x16 + movs r0, r0, lsr #0x1d + bne _020E50E4 +_020E50D8: + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E50E4: + mov r0, r1, lsl #0x13 + movs r0, r0, lsr #0x1f + movne r0, r1, lsl #0x19 + movne r0, r0, lsr #0x1e + cmpne r0, #2 + ldr r1, [sb, #8] + cmpne r0, #1 + mov r8, #1 + mov r0, r1, lsl #0x1d + movne r8, #0 + movs r0, r0, lsr #0x1d + bne _020E513C + ldr r0, [sb, #4] + mov r0, r0, lsl #0x1b + mov r0, r0, lsr #0x1d + tst r0, #2 + beq _020E513C + bic r0, r1, #7 + orr r1, r0, #1 + mov r0, sb + str r1, [sb, #8] + bl __prep_buffer +_020E513C: + ldr r0, [sb, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #1 + beq _020E5168 + mov r0, #1 + strb r0, [sb, #0xd] + mov r0, #0 + add sp, sp, #8 + str r0, [sb, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E5168: + cmp r5, #0 + mov r6, #0 + beq _020E5290 + ldr r0, [sb, #0x1c] + ldr r2, [sb, #0x24] + cmp r2, r0 + cmpeq r8, #0 + beq _020E5290 + ldr r1, [sb, #0x20] + sub r0, r2, r0 + sub r0, r1, r0 + str r0, [sb, #0x28] + mov fp, #0xa + mov r4, #0 +_020E51A0: + ldr r0, [sb, #0x28] + mov r7, r4 + str r0, [sp, #4] + cmp r0, r5 + strhi r5, [sp, #4] + ldr r0, [sb, #4] + mov r0, r0, lsl #0x19 + mov r0, r0, lsr #0x1e + cmp r0, #1 + bne _020E51F0 + ldr r2, [sp, #4] + cmp r2, #0 + beq _020E51F0 + mov r0, sl + mov r1, fp + bl __memrchr + movs r7, r0 + addne r0, r7, #1 + subne r0, r0, sl + strne r0, [sp, #4] +_020E51F0: + ldr r2, [sp, #4] + cmp r2, #0 + beq _020E5230 + ldr r0, [sb, #0x24] + mov r1, sl + bl memcpy + ldr r2, [sp, #4] + ldr r0, [sb, #0x24] + add sl, sl, r2 + add r0, r0, r2 + str r0, [sb, #0x24] + ldr r1, [sb, #0x28] + ldr r0, [sp, #4] + sub r5, r5, r2 + sub r0, r1, r0 + str r0, [sb, #0x28] +_020E5230: + ldr r0, [sb, #0x28] + cmp r0, #0 + beq _020E5254 + cmp r7, #0 + bne _020E5254 + ldr r0, [sb, #4] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1e + bne _020E527C +_020E5254: + mov r0, sb + mov r1, #0 + bl __flush_buffer + cmp r0, #0 + beq _020E527C + mov r0, #1 + strb r0, [sb, #0xd] + mov r5, #0 + str r5, [sb, #0x28] + b _020E5290 +_020E527C: + ldr r0, [sp, #4] + cmp r5, #0 + add r6, r6, r0 + cmpne r8, #0 + bne _020E51A0 +_020E5290: + cmp r5, #0 + beq _020E52FC + cmp r8, #0 + bne _020E52FC + ldr r4, [sb, #0x1c] + ldr r7, [sb, #0x20] + add r2, sl, r5 + str sl, [sb, #0x1c] + str r5, [sb, #0x20] + add r1, sp, #4 + mov r0, sb + str r2, [sb, #0x24] + bl __flush_buffer + cmp r0, #0 + ldreq r0, [sp, #4] + addeq r6, r6, r0 + beq _020E52E4 + mov r0, #1 + strb r0, [sb, #0xd] + mov r0, #0 + str r0, [sb, #0x28] +_020E52E4: + str r4, [sb, #0x1c] + mov r0, sb + str r7, [sb, #0x20] + bl __prep_buffer + mov r0, #0 + str r0, [sb, #0x28] +_020E52FC: + ldr r0, [sb, #4] + ldr r1, [sp] + mov r0, r0, lsl #0x19 + mov r0, r0, lsr #0x1e + cmp r0, #2 + movne r0, #0 + strne r0, [sb, #0x28] + mov r0, r6 + bl _u32_div_f + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end __fwrite + + arm_func_start fclose +fclose: ; 0x020E5328 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #4] + mov r1, r1, lsl #0x16 + movs r1, r1, lsr #0x1d + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl fflush + mov r4, r0 + ldr r0, [r5] + ldr r1, [r5, #0x44] + blx r1 + ldr r1, [r5, #4] + mov r2, #0 + bic r1, r1, #0x380 + str r1, [r5, #4] + str r2, [r5] + ldr r1, [r5, #8] + mov r1, r1, lsl #0x1c + movs r1, r1, lsr #0x1f + subne r0, r2, #1 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + cmpeq r0, #0 + movne r2, #1 + rsb r0, r2, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end fclose + + arm_func_start fflush +fflush: ; 0x020E539C + stmdb sp!, {r4, lr} + movs r4, r0 + bne _020E53B0 + bl __flush_all + ldmia sp!, {r4, pc} +_020E53B0: + ldrb r0, [r4, #0xd] + cmp r0, #0 + bne _020E53CC + ldr r0, [r4, #4] + mov r1, r0, lsl #0x16 + movs r1, r1, lsr #0x1d + bne _020E53D4 +_020E53CC: + mvn r0, #0 + ldmia sp!, {r4, pc} +_020E53D4: + mov r0, r0, lsl #0x1b + mov r0, r0, lsr #0x1d + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #8] + mov r1, r0, lsl #0x1d + mov r1, r1, lsr #0x1d + cmp r1, #3 + bichs r0, r0, #7 + orrhs r0, r0, #2 + strhs r0, [r4, #8] + ldr r0, [r4, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + cmp r0, #2 + moveq r0, #0 + streq r0, [r4, #0x28] + ldr r0, [r4, #8] + mov r1, r0, lsl #0x1d + mov r1, r1, lsr #0x1d + cmp r1, #1 + beq _020E5440 + bic r0, r0, #7 + str r0, [r4, #8] + mov r0, #0 + ldmia sp!, {r4, pc} +_020E5440: + mov r0, r4 + mov r1, #0 + bl __flush_buffer + cmp r0, #0 + mov r0, #0 + beq _020E546C + mov r1, #1 + strb r1, [r4, #0xd] + str r0, [r4, #0x28] + sub r0, r0, #1 + ldmia sp!, {r4, pc} +_020E546C: + ldr r1, [r4, #8] + bic r1, r1, #7 + str r1, [r4, #8] + str r0, [r4, #0x18] + str r0, [r4, #0x28] + ldmia sp!, {r4, pc} + arm_func_end fflush + + arm_func_start _ftell +_ftell: ; 0x020E5484 + ldr r1, [r0, #4] + mov r1, r1, lsl #0x16 + mov r1, r1, lsr #0x1d + and r1, r1, #0xff + add r1, r1, #0xff + and r1, r1, #0xff + cmp r1, #1 + bhi _020E54B0 + ldrb r1, [r0, #0xd] + cmp r1, #0 + beq _020E54C4 +_020E54B0: + ldr r0, _020E54FC ; =_021E58C0 + mov r1, #0x28 + str r1, [r0] + sub r0, r1, #0x29 + bx lr +_020E54C4: + ldr r1, [r0, #8] + mov r1, r1, lsl #0x1d + movs ip, r1, lsr #0x1d + ldreq r0, [r0, #0x18] + bxeq lr + ldr r2, [r0, #0x24] + ldr r1, [r0, #0x1c] + ldr r3, [r0, #0x34] + sub r0, r2, r1 + cmp ip, #3 + add r0, r3, r0 + subhs r1, ip, #2 + subhs r0, r0, r1 + bx lr + .align 2, 0 +_020E54FC: .word _021E58C0 + arm_func_end _ftell + + arm_func_start ftell +ftell: ; 0x020E5500 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _020E5600 ; =_02110FCC + mov r7, r0 + cmp r7, r1 + moveq r6, #2 + beq _020E5538 + ldr r0, _020E5604 ; =_02111018 + cmp r7, r0 + moveq r6, #3 + beq _020E5538 + ldr r0, _020E5608 ; =_02111064 + cmp r7, r0 + moveq r6, #4 + movne r6, #5 +_020E5538: + mov r0, #0x18 + mul r4, r6, r0 + ldr r5, _020E560C ; =_021E54E8 + add r0, r5, r4 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E5578 + ldr r0, _020E5610 ; =OSi_ThreadInfo + ldr r2, _020E5614 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E5618 ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] + b _020E55D0 +_020E5578: + ldr r0, _020E5610 ; =OSi_ThreadInfo + ldr r1, _020E5614 ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1, r6, lsl #2] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E55A8 + ldr r1, _020E5618 ; =_021E54C4 + ldr r0, [r1, r6, lsl #2] + add r0, r0, #1 + str r0, [r1, r6, lsl #2] + b _020E55D0 +_020E55A8: + add r0, r5, r4 + bl OS_LockMutex + ldr r0, _020E5610 ; =OSi_ThreadInfo + ldr r2, _020E5614 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E5618 ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] +_020E55D0: + mov r0, r7 + bl _ftell + ldr r1, _020E5618 ; =_021E54C4 + mov r7, r0 + ldr r0, [r1, r6, lsl #2] + subs r0, r0, #1 + str r0, [r1, r6, lsl #2] + bne _020E55F8 + add r0, r5, r4 + bl OS_UnlockMutex +_020E55F8: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E5600: .word _02110FCC +_020E5604: .word _02111018 +_020E5608: .word _02111064 +_020E560C: .word _021E54E8 +_020E5610: .word OSi_ThreadInfo +_020E5614: .word _021E54A0 +_020E5618: .word _021E54C4 + arm_func_end ftell + + arm_func_start _fseek +_fseek: ; 0x020E561C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r1, [r5, #4] + mov r4, r2 + mov r1, r1, lsl #0x16 + mov r1, r1, lsr #0x1d + and r1, r1, #0xff + cmp r1, #1 + ldreqb r1, [r5, #0xd] + cmpeq r1, #0 + beq _020E5668 + ldr r0, _020E5800 ; =_021E58C0 + mov r1, #0x28 + str r1, [r0] + sub r0, r1, #0x29 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_020E5668: + ldr r1, [r5, #8] + mov r1, r1, lsl #0x1d + mov r1, r1, lsr #0x1d + cmp r1, #1 + bne _020E56B8 + mov r1, #0 + bl __flush_buffer + cmp r0, #0 + beq _020E56B8 + mov r0, #1 + strb r0, [r5, #0xd] + mov r2, #0 + ldr r0, _020E5800 ; =_021E58C0 + mov r1, #0x28 + str r2, [r5, #0x28] + str r1, [r0] + sub r0, r1, #0x29 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_020E56B8: + cmp r4, #1 + bne _020E56D8 + mov r0, r5 + mov r4, #0 + bl _ftell + ldr r1, [sp, #0x14] + add r0, r1, r0 + str r0, [sp, #0x14] +_020E56D8: + cmp r4, #2 + beq _020E576C + ldr r0, [r5, #4] + mov r0, r0, lsl #0x1b + mov r0, r0, lsr #0x1d + cmp r0, #3 + beq _020E576C + ldr r0, [r5, #8] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + sub r0, r0, #2 + cmp r0, #1 + bhi _020E576C + ldr r2, [sp, #0x14] + ldr r0, [r5, #0x18] + cmp r2, r0 + bhs _020E5728 + ldr r0, [r5, #0x34] + cmp r2, r0 + bhs _020E5738 +_020E5728: + ldr r0, [r5, #8] + bic r0, r0, #7 + str r0, [r5, #8] + b _020E5778 +_020E5738: + ldr r1, [r5, #0x1c] + sub r0, r2, r0 + add r0, r1, r0 + str r0, [r5, #0x24] + ldr r1, [r5, #0x18] + ldr r0, [sp, #0x14] + sub r0, r1, r0 + str r0, [r5, #0x28] + ldr r0, [r5, #8] + bic r0, r0, #7 + orr r0, r0, #2 + str r0, [r5, #8] + b _020E5778 +_020E576C: + ldr r0, [r5, #8] + bic r0, r0, #7 + str r0, [r5, #8] +_020E5778: + ldr r0, [r5, #8] + mov r0, r0, lsl #0x1d + movs r0, r0, lsr #0x1d + bne _020E57F0 + ldr ip, [r5, #0x38] + cmp ip, #0 + beq _020E57DC + ldr r0, [r5] + ldr r3, [r5, #0x48] + add r1, sp, #0x14 + mov r2, r4 + blx ip + cmp r0, #0 + beq _020E57DC + mov r0, #1 + strb r0, [r5, #0xd] + mov r2, #0 + ldr r0, _020E5800 ; =_021E58C0 + mov r1, #0x28 + str r2, [r5, #0x28] + str r1, [r0] + sub r0, r1, #0x29 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr +_020E57DC: + mov r1, #0 + strb r1, [r5, #0xc] + ldr r0, [sp, #0x14] + str r0, [r5, #0x18] + str r1, [r5, #0x28] +_020E57F0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E5800: .word _021E58C0 + arm_func_end _fseek + + arm_func_start fseek +fseek: ; 0x020E5804 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r3, _020E5914 ; =_02110FCC + mov sb, r0 + cmp sb, r3 + mov r8, r1 + mov r7, r2 + moveq r6, #2 + beq _020E5844 + ldr r0, _020E5918 ; =_02111018 + cmp sb, r0 + moveq r6, #3 + beq _020E5844 + ldr r0, _020E591C ; =_02111064 + cmp sb, r0 + moveq r6, #4 + movne r6, #5 +_020E5844: + mov r0, #0x18 + mul r4, r6, r0 + ldr r5, _020E5920 ; =_021E54E8 + add r0, r5, r4 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E5884 + ldr r0, _020E5924 ; =OSi_ThreadInfo + ldr r2, _020E5928 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E592C ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] + b _020E58DC +_020E5884: + ldr r0, _020E5924 ; =OSi_ThreadInfo + ldr r1, _020E5928 ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1, r6, lsl #2] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E58B4 + ldr r1, _020E592C ; =_021E54C4 + ldr r0, [r1, r6, lsl #2] + add r0, r0, #1 + str r0, [r1, r6, lsl #2] + b _020E58DC +_020E58B4: + add r0, r5, r4 + bl OS_LockMutex + ldr r0, _020E5924 ; =OSi_ThreadInfo + ldr r2, _020E5928 ; =_021E54A0 + ldr r1, [r0, #4] + ldr r0, _020E592C ; =_021E54C4 + ldr r3, [r1, #0x6c] + mov r1, #1 + str r3, [r2, r6, lsl #2] + str r1, [r0, r6, lsl #2] +_020E58DC: + mov r0, sb + mov r1, r8 + mov r2, r7 + bl _fseek + ldr r1, _020E592C ; =_021E54C4 + mov r7, r0 + ldr r0, [r1, r6, lsl #2] + subs r0, r0, #1 + str r0, [r1, r6, lsl #2] + bne _020E590C + add r0, r5, r4 + bl OS_UnlockMutex +_020E590C: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020E5914: .word _02110FCC +_020E5918: .word _02111018 +_020E591C: .word _02111064 +_020E5920: .word _021E54E8 +_020E5924: .word OSi_ThreadInfo +_020E5928: .word _021E54A0 +_020E592C: .word _021E54C4 + arm_func_end fseek + + arm_func_start rewind +rewind: ; 0x020E5930 + stmdb sp!, {r4, lr} + mov r1, #0 + mov r4, r0 + mov r2, r1 + strb r1, [r4, #0xd] + bl fseek + mov r0, #0 + strb r0, [r4, #0xd] + ldmia sp!, {r4, pc} + arm_func_end rewind + + arm_func_start mbtowc +mbtowc: ; 0x020E5954 + stmdb sp!, {r3, lr} + ldr r3, _020E596C ; =_0211120C + ldr r3, [r3, #8] + ldr r3, [r3] + blx r3 + ldmia sp!, {r3, pc} + .align 2, 0 +_020E596C: .word _0211120C + arm_func_end mbtowc + + arm_func_start __mbtowc_noconv +__mbtowc_noconv: ; 0x020E5970 + cmp r1, #0 + moveq r0, #0 + bxeq lr + cmp r2, #0 + mvneq r0, #0 + bxeq lr + cmp r0, #0 + ldrneb r2, [r1] + strneh r2, [r0] + ldrsb r0, [r1] + cmp r0, #0 + moveq r0, #0 + movne r0, #1 + bx lr + arm_func_end __mbtowc_noconv + + arm_func_start __wctomb_noconv +__wctomb_noconv: ; 0x020E59A8 + cmp r0, #0 + moveq r0, #0 + strneb r1, [r0] + movne r0, #1 + bx lr + arm_func_end __wctomb_noconv + + arm_func_start wctomb +wctomb: ; 0x020E59BC + stmdb sp!, {r3, lr} + ldr r2, _020E59D4 ; =_0211120C + ldr r2, [r2, #8] + ldr r2, [r2, #4] + blx r2 + ldmia sp!, {r3, pc} + .align 2, 0 +_020E59D4: .word _0211120C + arm_func_end wctomb + + arm_func_start mbstowcs +mbstowcs: ; 0x020E59D8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r8, r0 + mov r0, r7 + mov r6, r2 + bl strlen + mov r5, r0 + cmp r8, #0 + mov r4, #0 + beq _020E5A58 + cmp r6, #0 + bls _020E5A58 +_020E5A08: + ldrsb r0, [r7] + cmp r0, #0 + beq _020E5A40 + mov r0, r8 + mov r1, r7 + mov r2, r5 + bl mbtowc + cmp r0, #0 + add r8, r8, #2 + addgt r7, r7, r0 + subgt r5, r5, r0 + bgt _020E5A4C + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E5A40: + mov r0, #0 + strh r0, [r8] + b _020E5A58 +_020E5A4C: + add r4, r4, #1 + cmp r4, r6 + blo _020E5A08 +_020E5A58: + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end mbstowcs + + arm_func_start wcstombs +wcstombs: ; 0x020E5A60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r4, r0 + mov sb, r1 + cmpne sb, #0 + mov r8, r2 + mov r7, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r6, sp, #0 +_020E5A84: + ldrh r1, [sb] + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4, r7] + beq _020E5AD0 + mov r0, r6 + add sb, sb, #2 + bl wctomb + mov r5, r0 + add r0, r7, r5 + cmp r0, r8 + bhi _020E5AD0 + mov r1, r6 + mov r2, r5 + add r0, r4, r7 + bl strncpy + add r7, r7, r5 + cmp r7, r8 + bls _020E5A84 +_020E5AD0: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end wcstombs + + arm_func_start memcpy +memcpy: ; 0x020E5AD8 + mov ip, r0 + cmp r2, #0 + bxeq lr +_020E5AE4: + ldrsb r3, [r1], #1 + subs r2, r2, #1 + strb r3, [ip], #1 + bne _020E5AE4 + bx lr + arm_func_end memcpy + + arm_func_start memmove +memmove: ; 0x020E5AF8 + cmp r1, r0 + blo _020E5B20 + mov ip, r0 + cmp r2, #0 + bxeq lr +_020E5B0C: + ldrsb r3, [r1], #1 + subs r2, r2, #1 + strb r3, [ip], #1 + bne _020E5B0C + bx lr +_020E5B20: + cmp r2, #0 + add r3, r1, r2 + add ip, r0, r2 + bxeq lr +_020E5B30: + ldrsb r1, [r3, #-1]! + subs r2, r2, #1 + strb r1, [ip, #-1]! + bne _020E5B30 + bx lr + arm_func_end memmove + + arm_func_start memset +memset: ; 0x020E5B44 + stmdb sp!, {r4, lr} + mov r4, r0 + bl __fill_mem + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end memset + + arm_func_start memchr +memchr: ; 0x020E5B58 + cmp r2, #0 + and r3, r1, #0xff + beq _020E5B7C +_020E5B64: + ldrb r1, [r0], #1 + cmp r1, r3 + subeq r0, r0, #1 + bxeq lr + subs r2, r2, #1 + bne _020E5B64 +_020E5B7C: + mov r0, #0 + bx lr + arm_func_end memchr + + arm_func_start __memrchr +__memrchr: ; 0x020E5B84 + cmp r2, #0 + and r3, r1, #0xff + add r0, r0, r2 + beq _020E5BA8 +_020E5B94: + ldrb r1, [r0, #-1]! + cmp r1, r3 + bxeq lr + subs r2, r2, #1 + bne _020E5B94 +_020E5BA8: + mov r0, #0 + bx lr + arm_func_end __memrchr + + arm_func_start memcmp +memcmp: ; 0x020E5BB0 + cmp r2, #0 + beq _020E5BE8 +_020E5BB8: + ldrb ip, [r0], #1 + ldrb r3, [r1], #1 + cmp ip, r3 + beq _020E5BE0 + ldrb r2, [r0, #-1] + ldrb r0, [r1, #-1] + cmp r2, r0 + mvnlo r0, #0 + movhs r0, #1 + bx lr +_020E5BE0: + subs r2, r2, #1 + bne _020E5BB8 +_020E5BE8: + mov r0, #0 + bx lr + arm_func_end memcmp + + arm_func_start __fill_mem +__fill_mem: ; 0x020E5BF0 + cmp r2, #0x20 + and r3, r1, #0xff + blo _020E5C84 + rsb r1, r0, #0 + ands ip, r1, #3 + beq _020E5C1C + sub r2, r2, ip + and r1, r3, #0xff +_020E5C10: + strb r1, [r0], #1 + subs ip, ip, #1 + bne _020E5C10 +_020E5C1C: + cmp r3, #0 + beq _020E5C34 + mov r1, r3, lsl #0x10 + orr r1, r1, r3, lsl #24 + orr r1, r1, r3, lsl #8 + orr r3, r3, r1 +_020E5C34: + movs r1, r2, lsr #5 + beq _020E5C68 +_020E5C3C: + str r3, [r0] + str r3, [r0, #4] + str r3, [r0, #8] + str r3, [r0, #0xc] + str r3, [r0, #0x10] + str r3, [r0, #0x14] + str r3, [r0, #0x18] + str r3, [r0, #0x1c] + add r0, r0, #0x20 + subs r1, r1, #1 + bne _020E5C3C +_020E5C68: + and r1, r2, #0x1f + movs r1, r1, lsr #2 + beq _020E5C80 +_020E5C74: + str r3, [r0], #4 + subs r1, r1, #1 + bne _020E5C74 +_020E5C80: + and r2, r2, #3 +_020E5C84: + cmp r2, #0 + bxeq lr + and r1, r3, #0xff +_020E5C90: + strb r1, [r0], #1 + subs r2, r2, #1 + bne _020E5C90 + bx lr + arm_func_end __fill_mem + + arm_func_start parse_format__printf +parse_format__printf: ; 0x020E5CA0 static routine + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldrsb r3, [r0, #1] + mov r4, #0 + mov r5, #1 + mov lr, r2 + strb r5, [sp] + strb r4, [sp, #1] + strb r4, [sp, #2] + strb r4, [sp, #3] + strb r4, [sp, #4] + str r4, [sp, #8] + str r4, [sp, #0xc] + cmp r3, #0x25 + add ip, r0, #1 + bne _020E5CFC + add r0, sp, #0 + strb r3, [sp, #5] + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add sp, sp, #0x10 + add r0, ip, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E5CFC: + mov r2, #2 + mov r0, r4 + mov r5, r2 + mov r6, r4 + mov r7, #1 +_020E5D10: + mov r8, r7 + cmp r3, #0x2b + bgt _020E5D40 + bge _020E5D68 + cmp r3, #0x23 + bgt _020E5D98 + cmp r3, #0x20 + blt _020E5D98 + beq _020E5D70 + cmp r3, #0x23 + beq _020E5D80 + b _020E5D98 +_020E5D40: + cmp r3, #0x30 + bgt _020E5D98 + cmp r3, #0x2d + blt _020E5D98 + beq _020E5D60 + cmp r3, #0x30 + beq _020E5D88 + b _020E5D98 +_020E5D60: + strb r6, [sp] + b _020E5D9C +_020E5D68: + strb r7, [sp, #1] + b _020E5D9C +_020E5D70: + ldrb r4, [sp, #1] + cmp r4, #1 + strneb r5, [sp, #1] + b _020E5D9C +_020E5D80: + strb r7, [sp, #3] + b _020E5D9C +_020E5D88: + ldrb r4, [sp] + cmp r4, #0 + strneb r2, [sp] + b _020E5D9C +_020E5D98: + mov r8, r0 +_020E5D9C: + cmp r8, #0 + ldrnesb r3, [ip, #1]! + bne _020E5D10 + cmp r3, #0x2a + bne _020E5DE4 + ldr r0, [r1] + add r0, r0, #4 + str r0, [r1] + ldr r0, [r0, #-4] + str r0, [sp, #8] + cmp r0, #0 + bge _020E5DDC + rsb r0, r0, #0 + mov r2, #0 + strb r2, [sp] + str r0, [sp, #8] +_020E5DDC: + ldrsb r3, [ip, #1]! + b _020E5E34 +_020E5DE4: + ldr r4, _020E6228 ; =_0210E504 + mov r5, #0 + mov r0, #0xa + b _020E5E08 +_020E5DF4: + ldr r2, [sp, #8] + sub r3, r3, #0x30 + mla r6, r2, r0, r3 + ldrsb r3, [ip, #1]! + str r6, [sp, #8] +_020E5E08: + cmp r3, #0 + blt _020E5E18 + cmp r3, #0x80 + blt _020E5E20 +_020E5E18: + mov r2, r5 + b _020E5E2C +_020E5E20: + mov r2, r3, lsl #1 + ldrh r2, [r4, r2] + and r2, r2, #8 +_020E5E2C: + cmp r2, #0 + bne _020E5DF4 +_020E5E34: + ldr r2, [sp, #8] + ldr r0, _020E622C ; =0x000001FD + cmp r2, r0 + ble _020E5E64 + mov r1, #0xff + add r0, sp, #0 + strb r1, [sp, #5] + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add sp, sp, #0x10 + add r0, ip, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E5E64: + cmp r3, #0x2e + bne _020E5EF8 + ldrsb r3, [ip, #1]! + mov r0, #1 + strb r0, [sp, #2] + cmp r3, #0x2a + bne _020E5EA8 + ldr r0, [r1] + add r0, r0, #4 + str r0, [r1] + ldr r0, [r0, #-4] + ldrsb r3, [ip, #1]! + str r0, [sp, #0xc] + cmp r0, #0 + movlt r0, #0 + strltb r0, [sp, #2] + b _020E5EF8 +_020E5EA8: + ldr r2, _020E6228 ; =_0210E504 + mov r4, #0 + mov r0, #0xa + b _020E5ECC +_020E5EB8: + ldr r1, [sp, #0xc] + sub r3, r3, #0x30 + mla r5, r1, r0, r3 + ldrsb r3, [ip, #1]! + str r5, [sp, #0xc] +_020E5ECC: + cmp r3, #0 + blt _020E5EDC + cmp r3, #0x80 + blt _020E5EE4 +_020E5EDC: + mov r1, r4 + b _020E5EF0 +_020E5EE4: + mov r1, r3, lsl #1 + ldrh r1, [r2, r1] + and r1, r1, #8 +_020E5EF0: + cmp r1, #0 + bne _020E5EB8 +_020E5EF8: + cmp r3, #0x6c + mov r0, #1 + bgt _020E5F30 + cmp r3, #0x68 + blt _020E5F24 + beq _020E5F4C + cmp r3, #0x6a + beq _020E5F98 + cmp r3, #0x6c + beq _020E5F68 + b _020E5FBC +_020E5F24: + cmp r3, #0x4c + beq _020E5F8C + b _020E5FBC +_020E5F30: + cmp r3, #0x74 + bgt _020E5F40 + beq _020E5FA4 + b _020E5FBC +_020E5F40: + cmp r3, #0x7a + beq _020E5FB0 + b _020E5FBC +_020E5F4C: + ldrsb r1, [ip, #1] + mov r2, #2 + strb r2, [sp, #4] + cmp r1, #0x68 + streqb r0, [sp, #4] + ldreqsb r3, [ip, #1]! + b _020E5FC0 +_020E5F68: + ldrsb r1, [ip, #1] + mov r2, #3 + strb r2, [sp, #4] + cmp r1, #0x6c + bne _020E5FC0 + mov r1, #4 + strb r1, [sp, #4] + ldrsb r3, [ip, #1]! + b _020E5FC0 +_020E5F8C: + mov r1, #9 + strb r1, [sp, #4] + b _020E5FC0 +_020E5F98: + mov r1, #6 + strb r1, [sp, #4] + b _020E5FC0 +_020E5FA4: + mov r1, #8 + strb r1, [sp, #4] + b _020E5FC0 +_020E5FB0: + mov r1, #7 + strb r1, [sp, #4] + b _020E5FC0 +_020E5FBC: + mov r0, #0 +_020E5FC0: + cmp r0, #0 + ldrnesb r3, [ip, #1]! + strb r3, [sp, #5] + cmp r3, #0x61 + bgt _020E6014 + bge _020E60FC + cmp r3, #0x47 + bgt _020E6008 + subs r0, r3, #0x41 + addpl pc, pc, r0, lsl #2 + b _020E6208 +_020E5FEC: ; jump table + b _020E60FC ; case 0 + b _020E6208 ; case 1 + b _020E6208 ; case 2 + b _020E6208 ; case 3 + b _020E6144 ; case 4 + b _020E60C4 ; case 5 + b _020E6134 ; case 6 +_020E6008: + cmp r3, #0x58 + beq _020E6088 + b _020E6208 +_020E6014: + cmp r3, #0x63 + bgt _020E6024 + beq _020E61A4 + b _020E6208 +_020E6024: + sub r0, r3, #0x64 + cmp r0, #0x14 + addls pc, pc, r0, lsl #2 + b _020E6208 +_020E6034: ; jump table + b _020E6088 ; case 0 + b _020E6144 ; case 1 + b _020E60C4 ; case 2 + b _020E6134 ; case 3 + b _020E6208 ; case 4 + b _020E6088 ; case 5 + b _020E6208 ; case 6 + b _020E6208 ; case 7 + b _020E6208 ; case 8 + b _020E6208 ; case 9 + b _020E61F4 ; case 10 + b _020E6088 ; case 11 + b _020E6180 ; case 12 + b _020E6208 ; case 13 + b _020E6208 ; case 14 + b _020E61D0 ; case 15 + b _020E6208 ; case 16 + b _020E6088 ; case 17 + b _020E6208 ; case 18 + b _020E6208 ; case 19 + b _020E6088 ; case 20 +_020E6088: + ldrb r0, [sp, #4] + cmp r0, #9 + moveq r0, #0xff + streqb r0, [sp, #5] + beq _020E6210 + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] + beq _020E6210 + ldrb r0, [sp] + cmp r0, #2 + moveq r0, #1 + streqb r0, [sp] + b _020E6210 +_020E60C4: + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + moveq r0, #0xff + streqb r0, [sp, #5] + beq _020E6210 + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #6 + streq r0, [sp, #0xc] + b _020E6210 +_020E60FC: + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #0xd + streq r0, [sp, #0xc] + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + cmpne r0, #1 + moveq r0, #0xff + streqb r0, [sp, #5] + b _020E6210 +_020E6134: + ldr r0, [sp, #0xc] + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] +_020E6144: + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + cmpne r0, #1 + moveq r0, #0xff + streqb r0, [sp, #5] + beq _020E6210 + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #6 + streq r0, [sp, #0xc] + b _020E6210 +_020E6180: + mov r3, #0x78 + mov r2, #1 + mov r1, #3 + mov r0, #8 + strb r3, [sp, #5] + strb r2, [sp, #3] + strb r1, [sp, #4] + str r0, [sp, #0xc] + b _020E6210 +_020E61A4: + ldrb r1, [sp, #4] + cmp r1, #3 + moveq r0, #5 + streqb r0, [sp, #4] + beq _020E6210 + ldrb r0, [sp, #2] + cmp r0, #0 + cmpeq r1, #0 + movne r0, #0xff + strneb r0, [sp, #5] + b _020E6210 +_020E61D0: + ldrb r0, [sp, #4] + cmp r0, #3 + moveq r0, #5 + streqb r0, [sp, #4] + beq _020E6210 + cmp r0, #0 + movne r0, #0xff + strneb r0, [sp, #5] + b _020E6210 +_020E61F4: + ldrb r0, [sp, #4] + cmp r0, #9 + moveq r0, #0xff + streqb r0, [sp, #5] + b _020E6210 +_020E6208: + mov r0, #0xff + strb r0, [sp, #5] +_020E6210: + add r0, sp, #0 + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add r0, ip, #1 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E6228: .word _0210E504 +_020E622C: .word 0x000001FD + arm_func_end parse_format__printf + + arm_func_start long2str__printf +long2str__printf: ; 0x020E6230 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + movs sl, r0 + mov r0, #0 + mov r5, r1 + str r0, [sp, #0xc] + ldr r7, [sp, #0x4c] + mov r6, r0 + strb r0, [r5, #-1]! + ldrb r0, [sp, #0x43] + str r1, [sp] + ldrb r8, [sp, #0x45] + str r0, [sp, #4] + ldr r0, [sp, #0x48] + ldrb fp, [sp, #0x41] + str r0, [sp, #8] + cmpeq r7, #0 + bne _020E62A4 + ldr r0, [sp, #4] + cmp r0, #0 + beq _020E6290 + cmp r8, #0x6f + beq _020E62A4 +_020E6290: + add sp, sp, #0x10 + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E62A4: + cmp r8, #0x69 + bgt _020E62CC + bge _020E6300 + cmp r8, #0x58 + bgt _020E62C0 + beq _020E632C + b _020E6334 +_020E62C0: + cmp r8, #0x64 + beq _020E6300 + b _020E6334 +_020E62CC: + cmp r8, #0x6f + bgt _020E62E0 + moveq r4, #8 + moveq fp, #0 + b _020E6334 +_020E62E0: + cmp r8, #0x78 + bgt _020E6334 + cmp r8, #0x75 + blt _020E6334 + beq _020E6320 + cmp r8, #0x78 + beq _020E632C + b _020E6334 +_020E6300: + cmp sl, #0 + mov r4, #0xa + bge _020E6334 + mov r0, #1 + cmp sl, #0x80000000 + rsbne sl, sl, #0 + str r0, [sp, #0xc] + b _020E6334 +_020E6320: + mov r4, #0xa + mov fp, #0 + b _020E6334 +_020E632C: + mov r4, #0x10 + mov fp, #0 +_020E6334: + mov r0, sl + mov r1, r4 + bl _u32_div_f + mov sb, r1 + mov r0, sl + mov r1, r4 + bl _u32_div_f + cmp sb, #0xa + mov sl, r0 + addlt sb, sb, #0x30 + blt _020E636C + cmp r8, #0x78 + addeq sb, sb, #0x57 + addne sb, sb, #0x37 +_020E636C: + cmp sl, #0 + strb sb, [r5, #-1]! + add r6, r6, #1 + bne _020E6334 + cmp r4, #8 + bne _020E63A0 + ldr r0, [sp, #4] + cmp r0, #0 + ldrnesb r0, [r5] + cmpne r0, #0x30 + movne r0, #0x30 + strneb r0, [r5, #-1]! + addne r6, r6, #1 +_020E63A0: + ldrb r0, [sp, #0x40] + cmp r0, #2 + bne _020E63D4 + ldr r0, [sp, #0xc] + ldr r7, [sp, #8] + cmp r0, #0 + cmpeq fp, #0 + subne r7, r7, #1 + cmp r4, #0x10 + bne _020E63D4 + ldr r0, [sp, #4] + cmp r0, #0 + subne r7, r7, #2 +_020E63D4: + ldr r0, [sp] + sub r1, r0, r5 + ldr r0, _020E6478 ; =0x000001FD + add r1, r7, r1 + cmp r1, r0 + addgt sp, sp, #0x10 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + cmp r6, r7 + bge _020E6418 + mov r0, #0x30 +_020E6408: + add r6, r6, #1 + cmp r6, r7 + strb r0, [r5, #-1]! + blt _020E6408 +_020E6418: + cmp r4, #0x10 + bne _020E6434 + ldr r0, [sp, #4] + cmp r0, #0 + movne r0, #0x30 + strneb r8, [r5, #-1] + strneb r0, [r5, #-2]! +_020E6434: + ldr r0, [sp, #0xc] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r5, #-1]! + bne _020E6464 + cmp fp, #1 + moveq r0, #0x2b + streqb r0, [r5, #-1]! + beq _020E6464 + cmp fp, #2 + moveq r0, #0x20 + streqb r0, [r5, #-1]! +_020E6464: + mov r0, r5 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E6478: .word 0x000001FD + arm_func_end long2str__printf + + arm_func_start longlong2str__printf +longlong2str__printf: ; 0x020E647C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + mov sb, r1 + mov r1, #0 + mov sl, r0 + mov r8, r2 + mov r0, r1 + strb r0, [r8, #-1]! + ldr r0, [sp, #0x58] + cmp sb, #0 + str r0, [sp, #0x14] + ldrb r0, [sp, #0x4f] + cmpeq sl, #0 + str r2, [sp] + str r0, [sp, #4] + ldrb r0, [sp, #0x51] + str r1, [sp, #0x18] + mov fp, r1 + str r0, [sp, #8] + ldr r0, [sp, #0x54] + str r0, [sp, #0xc] + ldrb r0, [sp, #0x4d] + str r0, [sp, #0x10] + ldreq r0, [sp, #0x14] + cmpeq r0, #0 + bne _020E6514 + ldr r0, [sp, #4] + cmp r0, #0 + beq _020E6500 + ldr r0, [sp, #8] + cmp r0, #0x6f + beq _020E6514 +_020E6500: + add sp, sp, #0x1c + mov r0, r8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E6514: + ldr r0, [sp, #8] + cmp r0, #0x69 + bgt _020E6540 + bge _020E6570 + cmp r0, #0x58 + bgt _020E6534 + beq _020E65C4 + b _020E65D0 +_020E6534: + cmp r0, #0x64 + beq _020E6570 + b _020E65D0 +_020E6540: + cmp r0, #0x6f + bgt _020E6550 + beq _020E65A4 + b _020E65D0 +_020E6550: + cmp r0, #0x78 + bgt _020E65D0 + cmp r0, #0x75 + blt _020E65D0 + beq _020E65B4 + cmp r0, #0x78 + beq _020E65C4 + b _020E65D0 +_020E6570: + subs r0, sl, #0 + sbcs r0, sb, #0 + mov r7, #0xa + mov r6, #0 + bge _020E65D0 + cmp sb, #0x80000000 + cmpeq sl, r6 + beq _020E6598 + rsbs sl, sl, #0 + rsc sb, sb, #0 +_020E6598: + mov r0, #1 + str r0, [sp, #0x18] + b _020E65D0 +_020E65A4: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #8 + b _020E65D0 +_020E65B4: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #0xa + b _020E65D0 +_020E65C4: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #0x10 +_020E65D0: + mov r4, #0 +_020E65D4: + mov r0, sl + mov r1, sb + mov r2, r7 + mov r3, r6 + bl _ull_mod + mov r5, r0 + mov r0, sl + mov r1, sb + mov r2, r7 + mov r3, r6 + bl _ll_udiv + mov sl, r0 + cmp r5, #0xa + mov sb, r1 + addlt r0, r5, #0x30 + blt _020E6624 + ldr r0, [sp, #8] + cmp r0, #0x78 + addeq r0, r5, #0x57 + addne r0, r5, #0x37 +_020E6624: + strb r0, [r8, #-1]! + mov r0, #0 + cmp sb, r0 + cmpeq sl, r4 + add fp, fp, #1 + bne _020E65D4 + cmp r6, #0 + cmpeq r7, #8 + bne _020E6664 + ldr r0, [sp, #4] + cmp r0, #0 + ldrnesb r0, [r8] + cmpne r0, #0x30 + movne r0, #0x30 + strneb r0, [r8, #-1]! + addne fp, fp, #1 +_020E6664: + ldrb r0, [sp, #0x4c] + cmp r0, #2 + bne _020E66B4 + ldr r0, [sp, #0xc] + str r0, [sp, #0x14] + ldr r0, [sp, #0x18] + cmp r0, #0 + ldreq r0, [sp, #0x10] + cmpeq r0, #0 + ldrne r0, [sp, #0x14] + subne r0, r0, #1 + strne r0, [sp, #0x14] + cmp r6, #0 + cmpeq r7, #0x10 + bne _020E66B4 + ldr r0, [sp, #4] + cmp r0, #0 + ldrne r0, [sp, #0x14] + subne r0, r0, #2 + strne r0, [sp, #0x14] +_020E66B4: + ldr r0, [sp] + ldr r1, _020E6774 ; =0x000001FD + sub r2, r0, r8 + ldr r0, [sp, #0x14] + add r0, r0, r2 + cmp r0, r1 + addgt sp, sp, #0x1c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + ldr r0, [sp, #0x14] + cmp fp, r0 + bge _020E6704 + mov r1, #0x30 +_020E66F0: + ldr r0, [sp, #0x14] + add fp, fp, #1 + cmp fp, r0 + strb r1, [r8, #-1]! + blt _020E66F0 +_020E6704: + cmp r6, #0 + cmpeq r7, #0x10 + bne _020E672C + ldr r0, [sp, #4] + cmp r0, #0 + beq _020E672C + ldr r0, [sp, #8] + mov r1, #0x30 + strb r0, [r8, #-1] + strb r1, [r8, #-2]! +_020E672C: + ldr r0, [sp, #0x18] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r8, #-1]! + bne _020E6760 + ldr r0, [sp, #0x10] + cmp r0, #1 + moveq r0, #0x2b + streqb r0, [r8, #-1]! + beq _020E6760 + cmp r0, #2 + moveq r0, #0x20 + streqb r0, [r8, #-1]! +_020E6760: + mov r0, r8 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E6774: .word 0x000001FD + arm_func_end longlong2str__printf + + arm_func_start double2hex__printf +double2hex__printf: ; 0x020E6778 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x44 + ldr r7, [sp, #0x80] + ldr r0, _020E6C28 ; =0x000001FD + mov r8, r2 + cmp r7, r0 + ldrb r6, [sp, #0x79] + ldrb r5, [sp, #0x77] + ldrb r4, [sp, #0x75] + ldr r1, [sp, #0x68] + ldr r2, [sp, #0x6c] + addgt sp, sp, #0x44 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addgt sp, sp, #0x10 + bxgt lr + mov sl, #0 + mov sb, #0x20 + add r0, sp, #8 + add r3, sp, #0xc + strb sl, [sp, #8] + strh sb, [sp, #0xa] + bl __num2dec + ldr r0, [sp, #0x68] + ldr r1, [sp, #0x6c] + bl fabs + mov r2, r0 + mov r0, sl + mov r3, r1 + mov r1, r0 + bl _deq + bne _020E6844 + ldr r3, _020E6C2C ; =_02111314 + sub r0, r8, #6 + ldrb r2, [r3] + ldrb r1, [r3, #1] + add sp, sp, #0x44 + strb r2, [r8, #-6] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r2, [r3, #4] + ldrb r1, [r3, #5] + strb r2, [r0, #4] + strb r1, [r0, #5] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E6844: + ldrb r0, [sp, #0x11] + cmp r0, #0x49 + bne _020E6954 + ldrsb r0, [sp, #0xc] + cmp r0, #0 + beq _020E68E0 + cmp r6, #0x41 + sub r0, r8, #5 + bne _020E68A4 + ldr r3, _020E6C30 ; =_0211131C + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E68A4: + ldr r3, _020E6C34 ; =_02111324 + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E68E0: + cmp r6, #0x41 + sub r0, r8, #4 + bne _020E6920 + ldr r3, _020E6C38 ; =_0211132C + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E6920: + ldr r3, _020E6C3C ; =_02111330 + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E6954: + cmp r0, #0x4e + bne _020E6A60 + ldrsb r0, [sp, #0xc] + cmp r0, #0 + beq _020E69EC + cmp r6, #0x41 + sub r0, r8, #5 + bne _020E69B0 + ldr r3, _020E6C40 ; =_02111334 + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E69B0: + ldr r3, _020E6C44 ; =_0211133C + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E69EC: + cmp r6, #0x41 + sub r0, r8, #4 + bne _020E6A2C + ldr r3, _020E6C48 ; =_02111344 + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E6A2C: + ldr r3, _020E6C4C ; =_02111348 + add sp, sp, #0x44 + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020E6A60: + mov r3, sl + mov r1, #1 + mov r0, #0x64 + add sb, sp, #0x68 + strb r1, [sp, #0x34] + strb r1, [sp, #0x35] + strb r3, [sp, #0x36] + strb r3, [sp, #0x37] + strb r3, [sp, #0x38] + str r3, [sp, #0x3c] + str r1, [sp, #0x40] + strb r0, [sp, #0x39] +_020E6A90: + rsb r1, r3, #7 + ldrsb r2, [sb, r3] + ldrsb r0, [sb, r1] + strb r0, [sb, r3] + add r3, r3, #1 + strb r2, [sb, r1] + cmp r3, #4 + blt _020E6A90 + ldrb r0, [sp, #0x69] + ldrb r1, [sp, #0x68] + ldr sb, _020E6C50 ; =0x000007FF + mov r0, r0, lsl #0x11 + orr r1, r0, r1, lsl #25 + add r0, sp, #0x34 + and lr, sb, r1, lsr #21 + sub ip, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + rsb r0, sb, #0x400 + mov r1, r8 + add r0, lr, r0 + ldmia ip, {r2, r3} + bl long2str__printf + cmp r6, #0x61 + moveq r1, #0x70 + movne r1, #0x50 + strb r1, [r0, #-1]! + mov r1, r7, lsl #2 + mov lr, r7 + cmp r7, #1 + add r8, r1, #0xb + add ip, sp, #0x68 + blt _020E6BA0 + mov sb, #0x30 +_020E6B18: + cmp r8, #0x40 + bge _020E6B88 + ldrb r1, [ip, r8, asr #3] + and r2, r8, #7 + rsb r3, r2, #7 + mov r2, r1, asr r3 + sub sl, r8, #4 + bic r1, r8, #7 + bic sl, sl, #7 + cmp r1, sl + add sl, ip, r8, asr #3 + and r1, r2, #0xff + beq _020E6B5C + ldrb r2, [sl, #-1] + mov r2, r2, lsl #8 + orr r1, r1, r2, asr r3 + and r1, r1, #0xff +_020E6B5C: + and r1, r1, #0xf + cmp r1, #0xa + addlo r1, r1, #0x30 + andlo r1, r1, #0xff + blo _020E6B8C + cmp r6, #0x61 + addeq r1, r1, #0x57 + andeq r1, r1, #0xff + addne r1, r1, #0x37 + andne r1, r1, #0xff + b _020E6B8C +_020E6B88: + mov r1, sb +_020E6B8C: + sub lr, lr, #1 + cmp lr, #1 + strb r1, [r0, #-1]! + sub r8, r8, #4 + bge _020E6B18 +_020E6BA0: + cmp r7, #0 + cmpeq r5, #0 + movne r1, #0x2e + strneb r1, [r0, #-1]! + mov r1, #0x31 + strb r1, [r0, #-1] + cmp r6, #0x61 + moveq r1, #0x78 + movne r1, #0x58 + strb r1, [r0, #-2]! + mov r1, #0x30 + strb r1, [r0, #-1]! + ldrsb r1, [sp, #0xc] + cmp r1, #0 + movne r1, #0x2d + strneb r1, [r0, #-1]! + addne sp, sp, #0x44 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addne sp, sp, #0x10 + bxne lr + cmp r4, #1 + moveq r1, #0x2b + streqb r1, [r0, #-1]! + addeq sp, sp, #0x44 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addeq sp, sp, #0x10 + bxeq lr + cmp r4, #2 + moveq r1, #0x20 + streqb r1, [r0, #-1]! + add sp, sp, #0x44 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E6C28: .word 0x000001FD +_020E6C2C: .word _02111314 +_020E6C30: .word _0211131C +_020E6C34: .word _02111324 +_020E6C38: .word _0211132C +_020E6C3C: .word _02111330 +_020E6C40: .word _02111334 +_020E6C44: .word _0211133C +_020E6C48: .word _02111344 +_020E6C4C: .word _02111348 +_020E6C50: .word 0x000007FF + arm_func_end double2hex__printf + + arm_func_start round_decimal__printf +round_decimal__printf: ; 0x020E6C54 + stmdb sp!, {r4, lr} + cmp r1, #0 + bge _020E6C7C +_020E6C60: + mov r1, #0 + strh r1, [r0, #2] + mov r1, #1 + strb r1, [r0, #4] + mov r1, #0x30 + strb r1, [r0, #5] + ldmia sp!, {r4, pc} +_020E6C7C: + ldrb lr, [r0, #4] + cmp r1, lr + ldmgeia sp!, {r4, pc} + add ip, r0, #5 + add r2, ip, r1 + add r2, r2, #1 + ldrsb r3, [r2, #-1]! + sub r3, r3, #0x30 + mov r3, r3, lsl #0x18 + mov r3, r3, asr #0x18 + cmp r3, #5 + bne _020E6CDC + add ip, ip, lr +_020E6CB0: + sub ip, ip, #1 + cmp ip, r2 + bls _020E6CC8 + ldrsb r3, [ip] + cmp r3, #0x30 + beq _020E6CB0 +_020E6CC8: + cmp ip, r2 + ldreqsb r3, [r2, #-1] + andeq r4, r3, #1 + movne r4, #1 + b _020E6CE4 +_020E6CDC: + movgt r4, #1 + movle r4, #0 +_020E6CE4: + cmp r1, #0 + beq _020E6D40 + mov ip, #0 + mov lr, #1 +_020E6CF4: + ldrsb r3, [r2, #-1]! + sub r3, r3, #0x30 + add r3, r3, r4 + mov r3, r3, lsl #0x18 + mov r3, r3, asr #0x18 + cmp r3, #9 + movgt r4, lr + movle r4, ip + cmp r4, #0 + bne _020E6D24 + cmp r3, #0 + bne _020E6D2C +_020E6D24: + sub r1, r1, #1 + b _020E6D38 +_020E6D2C: + add r3, r3, #0x30 + strb r3, [r2] + b _020E6D40 +_020E6D38: + cmp r1, #0 + bne _020E6CF4 +_020E6D40: + cmp r4, #0 + beq _020E6D68 + ldrsh r3, [r0, #2] + mov r2, #1 + mov r1, #0x31 + add r3, r3, #1 + strh r3, [r0, #2] + strb r2, [r0, #4] + strb r1, [r0, #5] + ldmia sp!, {r4, pc} +_020E6D68: + cmp r1, #0 + beq _020E6C60 + strb r1, [r0, #4] + ldmia sp!, {r4, pc} + arm_func_end round_decimal__printf + + arm_func_start float2str__printf +float2str__printf: ; 0x020E6D78 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + ldr r7, [sp, #0x68] + ldr r3, _020E74B0 ; =0x000001FD + ldrb r6, [sp, #0x61] + ldrb r5, [sp, #0x5f] + ldrb r4, [sp, #0x5d] + cmp r7, r3 + mov sl, r0 + mov r8, r1 + mov sb, r2 + addgt sp, sp, #0x2c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + mov ip, #0 + mov fp, #0x20 + add r0, sp, #0 + add r3, sp, #4 + mov r1, sl + mov r2, r8 + strb ip, [sp] + strh fp, [sp, #2] + bl __num2dec + ldrb r0, [sp, #8] + add r1, sp, #9 + add r0, r1, r0 + b _020E6E08 +_020E6DF0: + ldrb r2, [sp, #8] + ldrsh r1, [sp, #6] + sub r2, r2, #1 + add r1, r1, #1 + strb r2, [sp, #8] + strh r1, [sp, #6] +_020E6E08: + ldrb r1, [sp, #8] + cmp r1, #1 + bls _020E6E20 + ldrsb r1, [r0, #-1]! + cmp r1, #0x30 + beq _020E6DF0 +_020E6E20: + ldrb r0, [sp, #9] + cmp r0, #0x30 + beq _020E6E40 + cmp r0, #0x49 + beq _020E6E4C + cmp r0, #0x4e + beq _020E6FAC + b _020E7100 +_020E6E40: + mov r0, #0 + strh r0, [sp, #6] + b _020E7100 +_020E6E4C: + mov r2, #0 + mov r0, sl + mov r1, r8 + mov r3, r2 + bl _dls + bhs _020E6F10 + cmp r6, #0 + sub r0, sb, #5 + blt _020E6E78 + cmp r6, #0x80 + blt _020E6E80 +_020E6E78: + mov r1, #0 + b _020E6E90 +_020E6E80: + ldr r1, _020E74B4 ; =_0210E504 + mov r2, r6, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #0x200 +_020E6E90: + cmp r1, #0 + beq _020E6ED4 + ldr r3, _020E74B8 ; =_0211131C + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E6ED4: + ldr r3, _020E74BC ; =_02111324 + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E6F10: + cmp r6, #0 + sub r0, sb, #4 + blt _020E6F24 + cmp r6, #0x80 + blt _020E6F2C +_020E6F24: + mov r1, #0 + b _020E6F3C +_020E6F2C: + ldr r1, _020E74B4 ; =_0210E504 + mov r2, r6, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #0x200 +_020E6F3C: + cmp r1, #0 + beq _020E6F78 + ldr r3, _020E74C0 ; =_0211132C + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E6F78: + ldr r3, _020E74C4 ; =_02111330 + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E6FAC: + ldrsb r0, [sp, #4] + cmp r0, #0 + beq _020E7064 + cmp r6, #0 + sub r0, sb, #5 + blt _020E6FCC + cmp r6, #0x80 + blt _020E6FD4 +_020E6FCC: + mov r1, #0 + b _020E6FE4 +_020E6FD4: + ldr r1, _020E74B4 ; =_0210E504 + mov r2, r6, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #0x200 +_020E6FE4: + cmp r1, #0 + beq _020E7028 + ldr r3, _020E74C8 ; =_02111334 + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E7028: + ldr r3, _020E74CC ; =_0211133C + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldrb r1, [r3, #4] + strb r1, [r0, #4] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E7064: + cmp r6, #0 + sub r0, sb, #4 + blt _020E7078 + cmp r6, #0x80 + blt _020E7080 +_020E7078: + mov r1, #0 + b _020E7090 +_020E7080: + ldr r1, _020E74B4 ; =_0210E504 + mov r2, r6, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #0x200 +_020E7090: + cmp r1, #0 + beq _020E70CC + ldr r3, _020E74D0 ; =_02111344 + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E70CC: + ldr r3, _020E74D4 ; =_02111348 + add sp, sp, #0x2c + ldrb r2, [r3] + ldrb r1, [r3, #1] + strb r2, [r0] + strb r1, [r0, #1] + ldrb r2, [r3, #2] + ldrb r1, [r3, #3] + strb r2, [r0, #2] + strb r1, [r0, #3] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E7100: + ldrb r0, [sp, #8] + ldrsh r1, [sp, #6] + sub r8, sb, #1 + sub r0, r0, #1 + add r0, r1, r0 + strh r0, [sp, #6] + mov r0, #0 + strb r0, [r8] + cmp r6, #0x65 + bgt _020E7154 + bge _020E71E0 + cmp r6, #0x47 + bgt _020E749C + cmp r6, #0x45 + blt _020E749C + beq _020E71E0 + cmp r6, #0x46 + beq _020E7328 + cmp r6, #0x47 + beq _020E716C + b _020E749C +_020E7154: + cmp r6, #0x66 + bgt _020E7164 + beq _020E7328 + b _020E749C +_020E7164: + cmp r6, #0x67 + bne _020E749C +_020E716C: + ldrb r0, [sp, #8] + cmp r0, r7 + ble _020E7184 + add r0, sp, #4 + mov r1, r7 + bl round_decimal__printf +_020E7184: + ldrsh r2, [sp, #6] + mvn r0, #3 + cmp r2, r0 + blt _020E719C + cmp r2, r7 + blt _020E71BC +_020E719C: + cmp r5, #0 + ldreqb r0, [sp, #8] + subne r7, r7, #1 + subeq r7, r0, #1 + cmp r6, #0x67 + moveq r6, #0x65 + movne r6, #0x45 + b _020E71E0 +_020E71BC: + cmp r5, #0 + addne r0, r2, #1 + subne r7, r7, r0 + bne _020E7328 + ldrb r1, [sp, #8] + add r0, r2, #1 + subs r7, r1, r0 + movmi r7, #0 + b _020E7328 +_020E71E0: + ldrb r0, [sp, #8] + add r1, r7, #1 + cmp r0, r1 + ble _020E71F8 + add r0, sp, #4 + bl round_decimal__printf +_020E71F8: + ldrsh lr, [sp, #6] + mov fp, #0x2b + mov sl, #0 + cmp lr, #0 + rsblt lr, lr, #0 + movlt fp, #0x2d + ldr r3, _020E74D8 ; =0x66666667 + mov r0, #0xa + b _020E724C +_020E721C: + mov r1, lr, lsr #0x1f + smull r2, ip, r3, lr + add ip, r1, ip, asr #2 + smull r1, r2, r0, ip + sub ip, lr, r1 + add r1, ip, #0x30 + strb r1, [r8, #-1]! + mov r2, lr + smull r1, lr, r3, r2 + mov r1, r2, lsr #0x1f + add lr, r1, lr, asr #2 + add sl, sl, #1 +_020E724C: + cmp lr, #0 + bne _020E721C + cmp sl, #2 + blt _020E721C + strb fp, [r8, #-1] + strb r6, [r8, #-2]! + sub r1, sb, r8 + ldr r0, _020E74B0 ; =0x000001FD + add r1, r7, r1 + cmp r1, r0 + addgt sp, sp, #0x2c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + ldrb r1, [sp, #8] + add r0, r7, #1 + cmp r1, r0 + bge _020E72B8 + add r0, r7, #2 + sub r0, r0, r1 + subs r1, r0, #1 + beq _020E72B8 + mov r0, #0x30 +_020E72AC: + strb r0, [r8, #-1]! + subs r1, r1, #1 + bne _020E72AC +_020E72B8: + ldrb r1, [sp, #8] + add r0, sp, #9 + add r2, r0, r1 + subs r1, r1, #1 + beq _020E72DC +_020E72CC: + ldrsb r0, [r2, #-1]! + subs r1, r1, #1 + strb r0, [r8, #-1]! + bne _020E72CC +_020E72DC: + cmp r7, #0 + cmpeq r5, #0 + movne r0, #0x2e + strneb r0, [r8, #-1]! + ldrb r0, [sp, #9] + strb r0, [r8, #-1]! + ldrsb r0, [sp, #4] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r8, #-1]! + bne _020E749C + cmp r4, #1 + moveq r0, #0x2b + streqb r0, [r8, #-1]! + beq _020E749C + cmp r4, #2 + moveq r0, #0x20 + streqb r0, [r8, #-1]! + b _020E749C +_020E7328: + ldrsh r3, [sp, #6] + ldrb r2, [sp, #8] + sub r0, r2, r3 + subs r1, r0, #1 + movmi r1, #0 + cmp r1, r7 + ble _020E7368 + sub r1, r1, r7 + add r0, sp, #4 + sub r1, r2, r1 + bl round_decimal__printf + ldrsh r3, [sp, #6] + ldrb r2, [sp, #8] + sub r0, r2, r3 + subs r1, r0, #1 + movmi r1, #0 +_020E7368: + adds r0, r3, #1 + movmi r0, #0 + ldr r3, _020E74B0 ; =0x000001FD + add r6, r0, r1 + cmp r6, r3 + addgt sp, sp, #0x2c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + add r3, sp, #9 + sub r6, r7, r1 + cmp r6, #0 + add r2, r3, r2 + mov sb, #0 + ble _020E73BC + mov r3, #0x30 +_020E73AC: + add sb, sb, #1 + cmp sb, r6 + strb r3, [r8, #-1]! + blt _020E73AC +_020E73BC: + mov r6, #0 + b _020E73D0 +_020E73C4: + ldrsb r3, [r2, #-1]! + add r6, r6, #1 + strb r3, [r8, #-1]! +_020E73D0: + cmp r6, r1 + ldrltb r3, [sp, #8] + cmplt r6, r3 + blt _020E73C4 + cmp r6, r1 + bge _020E73FC + mov r3, #0x30 +_020E73EC: + add r6, r6, #1 + cmp r6, r1 + strb r3, [r8, #-1]! + blt _020E73EC +_020E73FC: + cmp r7, #0 + cmpeq r5, #0 + movne r1, #0x2e + strneb r1, [r8, #-1]! + cmp r0, #0 + beq _020E7464 + ldrb r1, [sp, #8] + mov r5, #0 + sub r1, r0, r1 + cmp r1, #0 + ble _020E7444 + mov r3, #0x30 +_020E742C: + strb r3, [r8, #-1]! + ldrb r1, [sp, #8] + add r5, r5, #1 + sub r1, r0, r1 + cmp r5, r1 + blt _020E742C +_020E7444: + cmp r5, r0 + bge _020E746C +_020E744C: + ldrsb r1, [r2, #-1]! + add r5, r5, #1 + cmp r5, r0 + strb r1, [r8, #-1]! + blt _020E744C + b _020E746C +_020E7464: + mov r0, #0x30 + strb r0, [r8, #-1]! +_020E746C: + ldrsb r0, [sp, #4] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r8, #-1]! + bne _020E749C + cmp r4, #1 + moveq r0, #0x2b + streqb r0, [r8, #-1]! + beq _020E749C + cmp r4, #2 + moveq r0, #0x20 + streqb r0, [r8, #-1]! +_020E749C: + mov r0, r8 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E74B0: .word 0x000001FD +_020E74B4: .word _0210E504 +_020E74B8: .word _0211131C +_020E74BC: .word _02111324 +_020E74C0: .word _0211132C +_020E74C4: .word _02111330 +_020E74C8: .word _02111334 +_020E74CC: .word _0211133C +_020E74D0: .word _02111344 +_020E74D4: .word _02111348 +_020E74D8: .word 0x66666667 + arm_func_end float2str__printf + + arm_func_start __pformatter +__pformatter: ; 0x020E74DC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x22c + mov r3, #0x20 + mov fp, r2 + strb r3, [sp, #0x19] + ldrsb r2, [fp] + mov sb, r0 + mov r8, r1 + cmp r2, #0 + mov sl, #0 + beq _020E7CE4 +_020E750C: + mov r0, fp + mov r1, #0x25 + bl strchr + str r0, [sp, #0xc] + cmp r0, #0 + bne _020E7560 + mov r0, fp + bl strlen + movs r2, r0 + add sl, sl, r2 + beq _020E7CE4 + mov r0, r8 + mov r1, fp + blx sb + cmp r0, #0 + bne _020E7CE4 + add sp, sp, #0x22c + mvn r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E7560: + subs r2, r0, fp + add sl, sl, r2 + beq _020E7590 + mov r0, r8 + mov r1, fp + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020E7590: + ldr r0, [sp, #0xc] + add r1, sp, #0x25c + add r2, sp, #0x1c + bl parse_format__printf + ldrb r1, [sp, #0x21] + mov fp, r0 + cmp r1, #0x61 + bgt _020E75FC + bge _020E7960 + cmp r1, #0x47 + bgt _020E75F0 + subs r0, r1, #0x41 + addpl pc, pc, r0, lsl #2 + b _020E75E4 +_020E75C8: ; jump table + b _020E7960 ; case 0 + b _020E7B48 ; case 1 + b _020E7B48 ; case 2 + b _020E7B48 ; case 3 + b _020E78F8 ; case 4 + b _020E78F8 ; case 5 + b _020E78F8 ; case 6 +_020E75E4: + cmp r1, #0x25 + beq _020E7B34 + b _020E7B48 +_020E75F0: + cmp r1, #0x58 + beq _020E77BC + b _020E7B48 +_020E75FC: + cmp r1, #0x75 + bgt _020E7664 + subs r0, r1, #0x64 + addpl pc, pc, r0, lsl #2 + b _020E7658 +_020E7610: ; jump table + b _020E767C ; case 0 + b _020E78F8 ; case 1 + b _020E78F8 ; case 2 + b _020E78F8 ; case 3 + b _020E7B48 ; case 4 + b _020E767C ; case 5 + b _020E7B48 ; case 6 + b _020E7B48 ; case 7 + b _020E7B48 ; case 8 + b _020E7B48 ; case 9 + b _020E7A88 ; case 10 + b _020E77BC ; case 11 + b _020E7B48 ; case 12 + b _020E7B48 ; case 13 + b _020E7B48 ; case 14 + b _020E79C8 ; case 15 + b _020E7B48 ; case 16 + b _020E77BC ; case 17 +_020E7658: + cmp r1, #0x63 + beq _020E7B14 + b _020E7B48 +_020E7664: + cmp r1, #0x78 + bgt _020E7674 + beq _020E77BC + b _020E7B48 +_020E7674: + cmp r1, #0xff + b _020E7B48 +_020E767C: + ldrb r0, [sp, #0x20] + cmp r0, #3 + bne _020E769C + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7734 +_020E769C: + cmp r0, #4 + bne _020E76C4 + ldr r1, [sp, #0x25c] + add r2, r1, #8 + str r2, [sp, #0x25c] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020E7734 +_020E76C4: + cmp r0, #6 + bne _020E76EC + ldr r1, [sp, #0x25c] + add r2, r1, #8 + str r2, [sp, #0x25c] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020E7734 +_020E76EC: + cmp r0, #7 + bne _020E7708 + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7734 +_020E7708: + cmp r0, #8 + bne _020E7724 + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7734 +_020E7724: + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] +_020E7734: + cmp r0, #2 + moveq r1, r5, lsl #0x10 + moveq r5, r1, asr #0x10 + cmp r0, #1 + moveq r1, r5, lsl #0x18 + moveq r5, r1, asr #0x18 + cmp r0, #4 + cmpne r0, #6 + add r0, sp, #0x1c + bne _020E7788 + sub r4, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r3, [r4] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + add r2, sp, #0x22c + bl longlong2str__printf + movs r7, r0 + beq _020E7B48 + b _020E77AC +_020E7788: + sub r4, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + add r1, sp, #0x22c + mov r0, r5 + ldmia r4, {r2, r3} + bl long2str__printf + movs r7, r0 + beq _020E7B48 +_020E77AC: + add r0, sp, #0x200 + add r0, r0, #0x2b + sub r6, r0, r7 + b _020E7B94 +_020E77BC: + ldrb r0, [sp, #0x20] + cmp r0, #3 + bne _020E77DC + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7874 +_020E77DC: + cmp r0, #4 + bne _020E7804 + ldr r1, [sp, #0x25c] + add r2, r1, #8 + str r2, [sp, #0x25c] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020E7874 +_020E7804: + cmp r0, #6 + bne _020E782C + ldr r1, [sp, #0x25c] + add r2, r1, #8 + str r2, [sp, #0x25c] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020E7874 +_020E782C: + cmp r0, #7 + bne _020E7848 + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7874 +_020E7848: + cmp r0, #8 + bne _020E7864 + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] + b _020E7874 +_020E7864: + ldr r1, [sp, #0x25c] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r5, [r1, #-4] +_020E7874: + cmp r0, #2 + moveq r1, r5, lsl #0x10 + moveq r5, r1, lsr #0x10 + cmp r0, #1 + andeq r5, r5, #0xff + cmp r0, #4 + cmpne r0, #6 + add r0, sp, #0x1c + bne _020E78C4 + sub r4, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r3, [r4] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + add r2, sp, #0x22c + bl longlong2str__printf + movs r7, r0 + beq _020E7B48 + b _020E78E8 +_020E78C4: + sub r4, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + add r1, sp, #0x22c + mov r0, r5 + ldmia r4, {r2, r3} + bl long2str__printf + movs r7, r0 + beq _020E7B48 +_020E78E8: + add r0, sp, #0x200 + add r0, r0, #0x2b + sub r6, r0, r7 + b _020E7B94 +_020E78F8: + ldrb r0, [sp, #0x20] + cmp r0, #9 + ldrne r0, [sp, #0x25c] + addne r0, r0, #8 + strne r0, [sp, #0x25c] + bne _020E791C + ldr r0, [sp, #0x25c] + add r0, r0, #8 + str r0, [sp, #0x25c] +_020E791C: + ldr r7, [r0, #-8] + ldr r6, [r0, #-4] + add r0, sp, #0x1c + sub r4, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r3, [r4] + mov r0, r7 + mov r1, r6 + add r2, sp, #0x22c + bl float2str__printf + movs r7, r0 + beq _020E7B48 + add r0, sp, #0x200 + add r0, r0, #0x2b + sub r6, r0, r7 + b _020E7B94 +_020E7960: + ldrb r0, [sp, #0x20] + cmp r0, #9 + ldrne r0, [sp, #0x25c] + addne r0, r0, #8 + strne r0, [sp, #0x25c] + bne _020E7984 + ldr r0, [sp, #0x25c] + add r0, r0, #8 + str r0, [sp, #0x25c] +_020E7984: + ldr r7, [r0, #-8] + ldr r6, [r0, #-4] + add r0, sp, #0x1c + sub r4, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r3, [r4] + mov r0, r7 + mov r1, r6 + add r2, sp, #0x22c + bl double2hex__printf + movs r7, r0 + beq _020E7B48 + add r0, sp, #0x200 + add r0, r0, #0x2b + sub r6, r0, r7 + b _020E7B94 +_020E79C8: + ldrb r0, [sp, #0x20] + cmp r0, #5 + bne _020E7A08 + ldr r0, [sp, #0x25c] + mov r2, #0x200 + add r0, r0, #4 + str r0, [sp, #0x25c] + ldr r1, [r0, #-4] + add r0, sp, #0x2c + cmp r1, #0 + ldreq r1, _020E7CF8 ; =_0211134C + bl wcstombs + cmp r0, #0 + blt _020E7B48 + add r7, sp, #0x2c + b _020E7A18 +_020E7A08: + ldr r0, [sp, #0x25c] + add r0, r0, #4 + str r0, [sp, #0x25c] + ldr r7, [r0, #-4] +_020E7A18: + ldrb r0, [sp, #0x1f] + cmp r7, #0 + ldreq r7, _020E7CFC ; =_02111350 + cmp r0, #0 + beq _020E7A4C + ldrb r0, [sp, #0x1e] + ldrb r6, [r7], #1 + cmp r0, #0 + beq _020E7B94 + ldr r0, [sp, #0x28] + cmp r6, r0 + movgt r6, r0 + b _020E7B94 +_020E7A4C: + ldrb r0, [sp, #0x1e] + cmp r0, #0 + beq _020E7A78 + ldr r6, [sp, #0x28] + mov r0, r7 + mov r2, r6 + mov r1, #0 + bl memchr + cmp r0, #0 + subne r6, r0, r7 + b _020E7B94 +_020E7A78: + mov r0, r7 + bl strlen + mov r6, r0 + b _020E7B94 +_020E7A88: + ldr r1, [sp, #0x25c] + ldrb r0, [sp, #0x20] + add r1, r1, #4 + str r1, [sp, #0x25c] + ldr r1, [r1, #-4] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020E7CD8 +_020E7AA8: ; jump table + b _020E7ACC ; case 0 + b _020E7CD8 ; case 1 + b _020E7AD4 ; case 2 + b _020E7ADC ; case 3 + b _020E7B04 ; case 4 + b _020E7CD8 ; case 5 + b _020E7AE4 ; case 6 + b _020E7AF4 ; case 7 + b _020E7AFC ; case 8 +_020E7ACC: + str sl, [r1] + b _020E7CD8 +_020E7AD4: + strh sl, [r1] + b _020E7CD8 +_020E7ADC: + str sl, [r1] + b _020E7CD8 +_020E7AE4: + str sl, [r1] + mov r0, sl, asr #0x1f + str r0, [r1, #4] + b _020E7CD8 +_020E7AF4: + str sl, [r1] + b _020E7CD8 +_020E7AFC: + str sl, [r1] + b _020E7CD8 +_020E7B04: + str sl, [r1] + mov r0, sl, asr #0x1f + str r0, [r1, #4] + b _020E7CD8 +_020E7B14: + ldr r0, [sp, #0x25c] + add r7, sp, #0x2c + add r0, r0, #4 + str r0, [sp, #0x25c] + ldr r0, [r0, #-4] + mov r6, #1 + strb r0, [sp, #0x2c] + b _020E7B94 +_020E7B34: + mov r0, #0x25 + strb r0, [sp, #0x2c] + add r7, sp, #0x2c + mov r6, #1 + b _020E7B94 +_020E7B48: + ldr r0, [sp, #0xc] + bl strlen + movs r4, r0 + beq _020E7B80 + ldr r1, [sp, #0xc] + mov r0, r8 + mov r2, r4 + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020E7B80: + add sp, sp, #0x22c + add r0, sl, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020E7B94: + ldrb r0, [sp, #0x1c] + mov r4, r6 + cmp r0, #0 + beq _020E7C48 + cmp r0, #2 + moveq r0, #0x30 + movne r0, #0x20 + strb r0, [sp, #0x19] + ldrsb r0, [r7] + cmp r0, #0x2b + cmpne r0, #0x2d + cmpne r0, #0x20 + bne _020E7C04 + ldrsb r0, [sp, #0x19] + cmp r0, #0x30 + bne _020E7C04 + mov r0, r8 + mov r1, r7 + mov r2, #1 + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + add r7, r7, #1 + sub r6, r6, #1 +_020E7C04: + ldr r0, [sp, #0x24] + cmp r4, r0 + bge _020E7C48 +_020E7C10: + mov r0, r8 + add r1, sp, #0x19 + mov r2, #1 + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x24] + add r4, r4, #1 + cmp r4, r0 + blt _020E7C10 +_020E7C48: + cmp r6, #0 + beq _020E7C78 + mov r0, r8 + mov r1, r7 + mov r2, r6 + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020E7C78: + ldrb r0, [sp, #0x1c] + cmp r0, #0 + bne _020E7CD4 + ldr r0, [sp, #0x24] + cmp r4, r0 + bge _020E7CD4 + mov r6, #0x20 + add r7, sp, #0x18 +_020E7C98: + mov r0, r8 + mov r1, r7 + mov r2, #1 + strb r6, [sp, #0x18] + blx sb + cmp r0, #0 + addeq sp, sp, #0x22c + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x24] + add r4, r4, #1 + cmp r4, r0 + blt _020E7C98 +_020E7CD4: + add sl, sl, r4 +_020E7CD8: + ldrsb r0, [fp] + cmp r0, #0 + bne _020E750C +_020E7CE4: + mov r0, sl + add sp, sp, #0x22c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E7CF8: .word _0211134C +_020E7CFC: .word _02111350 + arm_func_end __pformatter + + arm_func_start __FileWrite +__FileWrite: ; 0x020E7D00 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, r1 + mov r3, r5 + mov r1, #1 + mov r4, r2 + bl __fwrite + cmp r4, r0 + movne r5, #0 + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __FileWrite + + arm_func_start __StringWrite +__StringWrite: ; 0x020E7D2C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r3, [r4, #8] + mov r5, r2 + ldr r2, [r4, #4] + add r0, r3, r5 + cmp r0, r2 + ldr r0, [r4] + subhi r5, r2, r3 + mov r2, r5 + add r0, r0, r3 + bl memcpy + ldr r1, [r4, #8] + mov r0, #1 + add r1, r1, r5 + str r1, [r4, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __StringWrite + + arm_func_start printf +printf: ; 0x020E7D70 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + ldr r0, _020E7E70 ; =_02111018 + mvn r1, #0 + bl fwide + cmp r0, #0 + mvnge r0, #0 + ldmgeia sp!, {r4, lr} + addge sp, sp, #0x10 + bxge lr + ldr r0, _020E7E74 ; =_021E5530 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E7DCC + ldr r0, _020E7E78 ; =OSi_ThreadInfo + ldr r1, _020E7E7C ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E7E80 ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1, #0xc] + str r2, [r0, #0xc] + b _020E7E24 +_020E7DCC: + ldr r0, _020E7E78 ; =OSi_ThreadInfo + ldr r1, _020E7E7C ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1, #0xc] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E7DFC + ldr r0, _020E7E80 ; =_021E54C4 + ldr r1, [r0, #0xc] + add r1, r1, #1 + str r1, [r0, #0xc] + b _020E7E24 +_020E7DFC: + ldr r0, _020E7E74 ; =_021E5530 + bl OS_LockMutex + ldr r0, _020E7E78 ; =OSi_ThreadInfo + ldr r1, _020E7E7C ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E7E80 ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1, #0xc] + str r2, [r0, #0xc] +_020E7E24: + add r0, sp, #8 + bic r3, r0, #3 + ldr r2, [sp, #8] + ldr r0, _020E7E84 ; =__FileWrite + ldr r1, _020E7E70 ; =_02111018 + add r3, r3, #4 + bl __pformatter + ldr r1, _020E7E80 ; =_021E54C4 + mov r4, r0 + ldr r0, [r1, #0xc] + subs r0, r0, #1 + str r0, [r1, #0xc] + bne _020E7E60 + ldr r0, _020E7E74 ; =_021E5530 + bl OS_UnlockMutex +_020E7E60: + mov r0, r4 + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020E7E70: .word _02111018 +_020E7E74: .word _021E5530 +_020E7E78: .word OSi_ThreadInfo +_020E7E7C: .word _021E54A0 +_020E7E80: .word _021E54C4 +_020E7E84: .word __FileWrite + arm_func_end printf + + arm_func_start vsnprintf +vsnprintf: ; 0x020E7E88 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r5, r0 + mov r4, r1 + mov ip, #0 + ldr r0, _020E7EEC ; =__StringWrite + add r1, sp, #0 + str r5, [sp] + str r4, [sp, #4] + str ip, [sp, #8] + bl __pformatter + cmp r5, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, pc} + cmp r0, r4 + movlo r1, #0 + addlo sp, sp, #0xc + strlob r1, [r5, r0] + ldmloia sp!, {r4, r5, pc} + cmp r4, #0 + addne r1, r5, r4 + movne r2, #0 + strneb r2, [r1, #-1] + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020E7EEC: .word __StringWrite + arm_func_end vsnprintf + + arm_func_start vsprintf +vsprintf: ; 0x020E7EF0 + ldr ip, _020E7F04 ; =vsnprintf + mov r3, r2 + mov r2, r1 + mvn r1, #0 + bx ip + .align 2, 0 +_020E7F04: .word vsnprintf + arm_func_end vsprintf + + arm_func_start snprintf +snprintf: ; 0x020E7F08 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r3, sp, #0x10 + bic r3, r3, #3 + ldr r2, [sp, #0x10] + add r3, r3, #4 + bl vsnprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end snprintf + + arm_func_start sprintf +sprintf: ; 0x020E7F30 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r1, sp, #0xc + bic r1, r1, #3 + add r3, r1, #4 + ldr r2, [sp, #0xc] + mvn r1, #0 + bl vsnprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end sprintf + + arm_func_start qsort +qsort: ; 0x020E7F5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + mov sb, r1 + cmp sb, #2 + mov sl, r0 + mov r8, r2 + mov r7, r3 + addlo sp, sp, #0x10 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sb, lsr #1 + add fp, r0, #1 + sub r0, fp, #1 + mla r0, r8, r0, sl + sub r2, sb, #1 + str r0, [sp, #0xc] + mla r0, r8, r2, sl + str r0, [sp, #8] + mul r0, fp, r8 + mvn r1, #0 + str r0, [sp, #4] + mul r0, r8, r1 + str r0, [sp] +_020E7FB4: + cmp fp, #1 + bls _020E7FDC + ldr r0, [sp, #4] + sub fp, fp, #1 + sub r0, r0, r8 + str r0, [sp, #4] + ldr r0, [sp, #0xc] + sub r0, r0, r8 + str r0, [sp, #0xc] + b _020E8024 +_020E7FDC: + mov r2, r8 + ldr r4, [sp, #8] + ldr r3, [sp, #0xc] + cmp r8, #0 + beq _020E8008 +_020E7FF0: + ldrsb r0, [r4] + ldrsb r1, [r3] + subs r2, r2, #1 + strb r0, [r3], #1 + strb r1, [r4], #1 + bne _020E7FF0 +_020E8008: + sub sb, sb, #1 + cmp sb, #1 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #8] + sub r0, r0, r8 + str r0, [sp, #8] +_020E8024: + ldr r1, [sp, #4] + ldr r0, [sp] + mov r4, fp + add r0, r1, r0 + cmp sb, fp, lsl #1 + add r5, sl, r0 + blo _020E7FB4 +_020E8040: + mov r4, r4, lsl #1 + sub r0, r4, #1 + mov r6, r5 + mla r5, r8, r0, sl + cmp sb, r4 + bls _020E8070 + mov r0, r5 + add r1, r5, r8 + blx r7 + cmp r0, #0 + addlt r4, r4, #1 + addlt r5, r5, r8 +_020E8070: + mov r0, r6 + mov r1, r5 + blx r7 + cmp r0, #0 + bge _020E7FB4 + mov r2, r8 + mov r3, r5 + cmp r8, #0 + beq _020E80AC +_020E8094: + ldrsb r1, [r6] + ldrsb r0, [r3] + subs r2, r2, #1 + strb r0, [r6], #1 + strb r1, [r3], #1 + bne _020E8094 +_020E80AC: + cmp sb, r4, lsl #1 + bhs _020E8040 + b _020E7FB4 +_020E80B8: ; 0x020E80B8 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end qsort + + arm_func_start rand +rand: ; 0x020E80C0 + ldr r2, _020E80E8 ; =_02111354 + ldr r0, _020E80EC ; =0x41C64E6D + ldr r3, [r2] + ldr r1, _020E80F0 ; =0x00007FFF + mul r0, r3, r0 + add r0, r0, #0x39 + add r0, r0, #0x3000 + str r0, [r2] + and r0, r1, r0, lsr #16 + bx lr + .align 2, 0 +_020E80E8: .word _02111354 +_020E80EC: .word 0x41C64E6D +_020E80F0: .word 0x00007FFF + arm_func_end rand + + arm_func_start srand +srand: ; 0x020E80F4 + ldr r1, _020E8100 ; =_02111354 + str r0, [r1] + bx lr + .align 2, 0 +_020E8100: .word _02111354 + arm_func_end srand + + arm_func_start parse_format__printf__scanf +parse_format__printf__scanf: ; 0x020E8104 static routine + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x28 + ldr r6, _020E85F4 ; =_0210E604 + add r5, sp, #0 + mov r7, r0 + mov lr, r1 + mov r4, r5 + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6, {r0, r1} + stmia r5, {r0, r1} + ldrsb r0, [r7, #1] + add ip, r7, #1 + cmp r0, #0x25 + bne _020E8170 + strb r0, [sp, #3] + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4, {r0, r1} + stmia lr, {r0, r1} + add sp, sp, #0x28 + add r0, ip, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020E8170: + cmp r0, #0x2a + moveq r0, #1 + streqb r0, [sp] + ldreqsb r0, [ip, #1]! + cmp r0, #0 + blt _020E8190 + cmp r0, #0x80 + blt _020E8198 +_020E8190: + mov r1, #0 + b _020E81A8 +_020E8198: + ldr r1, _020E85F8 ; =_0210E504 + mov r2, r0, lsl #1 + ldrh r1, [r1, r2] + and r1, r1, #8 +_020E81A8: + cmp r1, #0 + beq _020E8248 + mov r1, #0 + ldr r3, _020E85F8 ; =_0210E504 + str r1, [sp, #4] + mov r4, r1 + mov r1, #0xa +_020E81C4: + ldr r2, [sp, #4] + sub r0, r0, #0x30 + mla r0, r2, r1, r0 + str r0, [sp, #4] + ldrsb r0, [ip, #1]! + cmp r0, #0 + blt _020E81E8 + cmp r0, #0x80 + blt _020E81F0 +_020E81E8: + mov r2, r4 + b _020E81FC +_020E81F0: + mov r2, r0, lsl #1 + ldrh r2, [r3, r2] + and r2, r2, #8 +_020E81FC: + cmp r2, #0 + bne _020E81C4 + ldr r1, [sp, #4] + cmp r1, #0 + bne _020E8240 + mov r0, #0xff + add r4, sp, #0 + strb r0, [sp, #3] + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4, {r0, r1} + stmia lr, {r0, r1} + add sp, sp, #0x28 + add r0, ip, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020E8240: + mov r1, #1 + strb r1, [sp, #1] +_020E8248: + cmp r0, #0x6c + mov r1, #1 + bgt _020E8280 + cmp r0, #0x68 + blt _020E8274 + beq _020E829C + cmp r0, #0x6a + beq _020E82E8 + cmp r0, #0x6c + beq _020E82B8 + b _020E830C +_020E8274: + cmp r0, #0x4c + beq _020E82DC + b _020E830C +_020E8280: + cmp r0, #0x74 + bgt _020E8290 + beq _020E8300 + b _020E830C +_020E8290: + cmp r0, #0x7a + beq _020E82F4 + b _020E830C +_020E829C: + mov r2, #2 + strb r2, [sp, #2] + ldrsb r2, [ip, #1] + cmp r2, #0x68 + streqb r1, [sp, #2] + ldreqsb r0, [ip, #1]! + b _020E8310 +_020E82B8: + mov r2, #3 + strb r2, [sp, #2] + ldrsb r2, [ip, #1] + cmp r2, #0x6c + bne _020E8310 + mov r0, #7 + strb r0, [sp, #2] + ldrsb r0, [ip, #1]! + b _020E8310 +_020E82DC: + mov r2, #9 + strb r2, [sp, #2] + b _020E8310 +_020E82E8: + mov r2, #4 + strb r2, [sp, #2] + b _020E8310 +_020E82F4: + mov r2, #5 + strb r2, [sp, #2] + b _020E8310 +_020E8300: + mov r2, #6 + strb r2, [sp, #2] + b _020E8310 +_020E830C: + mov r1, #0 +_020E8310: + cmp r1, #0 + ldrnesb r0, [ip, #1]! + strb r0, [sp, #3] + cmp r0, #0x5b + bgt _020E8364 + bge _020E84B4 + cmp r0, #0x47 + bgt _020E8358 + subs r1, r0, #0x41 + addpl pc, pc, r1, lsl #2 + b _020E85C4 +_020E833C: ; jump table + b _020E83F0 ; case 0 + b _020E85C4 ; case 1 + b _020E85C4 ; case 2 + b _020E85C4 ; case 3 + b _020E83F0 ; case 4 + b _020E83F0 ; case 5 + b _020E83F0 ; case 6 +_020E8358: + cmp r0, #0x58 + beq _020E83DC + b _020E85C4 +_020E8364: + cmp r0, #0x61 + bgt _020E8374 + beq _020E83F0 + b _020E85C4 +_020E8374: + sub r0, r0, #0x63 + cmp r0, #0x15 + addls pc, pc, r0, lsl #2 + b _020E85C4 +_020E8384: ; jump table + b _020E8440 ; case 0 + b _020E83DC ; case 1 + b _020E83F0 ; case 2 + b _020E83F0 ; case 3 + b _020E83F0 ; case 4 + b _020E85C4 ; case 5 + b _020E83DC ; case 6 + b _020E85C4 ; case 7 + b _020E85C4 ; case 8 + b _020E85C4 ; case 9 + b _020E85C4 ; case 10 + b _020E85CC ; case 11 + b _020E83DC ; case 12 + b _020E842C ; case 13 + b _020E85C4 ; case 14 + b _020E85C4 ; case 15 + b _020E8464 ; case 16 + b _020E85C4 ; case 17 + b _020E83DC ; case 18 + b _020E85C4 ; case 19 + b _020E85C4 ; case 20 + b _020E83DC ; case 21 +_020E83DC: + ldrb r0, [sp, #2] + cmp r0, #9 + moveq r0, #0xff + streqb r0, [sp, #3] + b _020E85CC +_020E83F0: + ldrb r1, [sp, #2] + cmp r1, #1 + cmpne r1, #2 + beq _020E8410 + add r0, r1, #0xfc + and r0, r0, #0xff + cmp r0, #3 + bhi _020E841C +_020E8410: + mov r0, #0xff + strb r0, [sp, #3] + b _020E85CC +_020E841C: + cmp r1, #3 + moveq r0, #8 + streqb r0, [sp, #2] + b _020E85CC +_020E842C: + mov r1, #3 + mov r0, #0x78 + strb r1, [sp, #2] + strb r0, [sp, #3] + b _020E85CC +_020E8440: + ldrb r0, [sp, #2] + cmp r0, #3 + moveq r0, #0xa + streqb r0, [sp, #2] + beq _020E85CC + cmp r0, #0 + movne r0, #0xff + strneb r0, [sp, #3] + b _020E85CC +_020E8464: + ldrb r0, [sp, #2] + cmp r0, #3 + moveq r0, #0xa + streqb r0, [sp, #2] + beq _020E8484 + cmp r0, #0 + movne r0, #0xff + strneb r0, [sp, #3] +_020E8484: + add r2, sp, #8 + mov r1, #0x20 + mov r0, #0xff +_020E8490: + sub r1, r1, #1 + cmp r1, #0 + strb r0, [r2], #1 + bgt _020E8490 + mov r1, #0xc1 + mov r0, #0xfe + strb r1, [sp, #9] + strb r0, [sp, #0xc] + b _020E85CC +_020E84B4: + ldrb r0, [sp, #2] + cmp r0, #3 + moveq r0, #0xa + streqb r0, [sp, #2] + beq _020E84D4 + cmp r0, #0 + movne r0, #0xff + strneb r0, [sp, #3] +_020E84D4: + ldrsb r2, [ip, #1]! + mov r1, #0 + cmp r2, #0x5e + ldreqsb r2, [ip, #1]! + moveq r1, #1 + cmp r2, #0x5d + bne _020E857C + ldrb r0, [sp, #0x13] + orr r0, r0, #0x20 + strb r0, [sp, #0x13] + ldrsb r2, [ip, #1]! + b _020E857C +_020E8504: + add r0, sp, #0 + and r3, r2, #0xff + add r6, r0, r3, asr #3 + ldrb r5, [r6, #8] + and r3, r2, #7 + mov r4, #1 + orr r3, r5, r4, lsl r3 + strb r3, [r6, #8] + ldrsb r3, [ip, #1] + cmp r3, #0x2d + bne _020E8578 + ldrsb r7, [ip, #2] + cmp r7, #0 + cmpne r7, #0x5d + beq _020E8578 + add r2, r2, #1 + cmp r2, r7 + bgt _020E8570 +_020E854C: + and r3, r2, #0xff + add r6, r0, r3, asr #3 + ldrb r5, [r6, #8] + and r3, r2, #7 + add r2, r2, #1 + orr r3, r5, r4, lsl r3 + strb r3, [r6, #8] + cmp r2, r7 + ble _020E854C +_020E8570: + ldrsb r2, [ip, #3]! + b _020E857C +_020E8578: + ldrsb r2, [ip, #1]! +_020E857C: + cmp r2, #0 + cmpne r2, #0x5d + bne _020E8504 + cmp r2, #0 + moveq r0, #0xff + streqb r0, [sp, #3] + beq _020E85CC + cmp r1, #0 + beq _020E85CC + add r2, sp, #8 + mov r1, #0x20 +_020E85A8: + ldrb r0, [r2] + sub r1, r1, #1 + cmp r1, #0 + mvn r0, r0 + strb r0, [r2], #1 + bgt _020E85A8 + b _020E85CC +_020E85C4: + mov r0, #0xff + strb r0, [sp, #3] +_020E85CC: + add r4, sp, #0 + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4, {r0, r1} + stmia lr, {r0, r1} + add r0, ip, #1 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E85F4: .word _0210E604 +_020E85F8: .word _0210E504 + arm_func_end parse_format__printf__scanf + + arm_func_start __sformatter +__sformatter: ; 0x020E85FC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x88 + ldrsb r5, [r2] + str r2, [sp, #0xc] + mov r2, #0 + mov sb, r0 + mov r0, r2 + str r2, [sp, #0x20] + mov r8, r1 + str r3, [sp, #0x10] + str r0, [sp, #0x24] + cmp r5, #0 + ldr sl, [sp, #0xb0] + str r0, [sp, #0x30] + mov r4, r2 + str r0, [sp, #0x44] + str r0, [sp, #0x40] + beq _020E9310 +_020E8644: + cmp r5, #0 + mov r0, #1 + blt _020E8658 + cmp r5, #0x80 + movlt r0, #0 +_020E8658: + cmp r0, #0 + movne r0, #0 + bne _020E8674 + mov r1, r5, lsl #1 + ldr r0, _020E9348 ; =_0210E504 + ldrh r0, [r0, r1] + and r0, r0, #0x100 +_020E8674: + cmp r0, #0 + beq _020E8734 + mov r2, #0 + ldr r1, _020E9348 ; =_0210E504 + mov ip, r2 + mov r3, #1 +_020E868C: + ldr r0, [sp, #0xc] + ldrsb r5, [r0, #1]! + str r0, [sp, #0xc] + mov r0, r3 + cmp r5, #0 + blt _020E86AC + cmp r5, #0x80 + movlt r0, r2 +_020E86AC: + cmp r0, #0 + movne r0, ip + moveq r0, r5, lsl #1 + ldreqh r0, [r1, r0] + andeq r0, r0, #0x100 + cmp r0, #0 + bne _020E868C + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020E9300 + ldr r5, _020E9348 ; =_0210E504 + b _020E86E0 +_020E86DC: + add r4, r4, #1 +_020E86E0: + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + strb r0, [sp, #0x50] + ldrsb r1, [sp, #0x50] + cmp r1, #0 + blt _020E8708 + cmp r1, #0x80 + blt _020E8710 +_020E8708: + mov r0, #0 + b _020E871C +_020E8710: + mov r0, r1, lsl #1 + ldrh r0, [r5, r0] + and r0, r0, #0x100 +_020E871C: + cmp r0, #0 + bne _020E86DC + mov r0, r8 + mov r2, #1 + blx sb + b _020E9300 +_020E8734: + cmp r5, #0x25 + beq _020E87AC + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020E87AC + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + strb r0, [sp, #0x50] + and r0, r5, #0xff + ldrsb r1, [sp, #0x50] + cmp r0, r1 + beq _020E8798 + mov r0, r8 + mov r2, #1 + blx sb + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + b _020E9300 +_020E8798: + ldr r0, [sp, #0xc] + add r4, r4, #1 + add r0, r0, #1 + str r0, [sp, #0xc] + b _020E9300 +_020E87AC: + ldr r0, [sp, #0xc] + add r1, sp, #0x60 + bl parse_format__printf__scanf + str r0, [sp, #0xc] + ldrb r0, [sp, #0x60] + cmp r0, #0 + bne _020E87E8 + ldrb r0, [sp, #0x63] + cmp r0, #0x25 + beq _020E87E8 + ldr r0, [sp, #0x10] + add r0, r0, #4 + str r0, [sp, #0x10] + ldr r5, [r0, #-4] + b _020E87EC +_020E87E8: + mov r5, #0 +_020E87EC: + ldrb r0, [sp, #0x63] + cmp r0, #0x6e + beq _020E882C + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020E882C + mov r0, r8 + mov r1, #0 + mov r2, #2 + blx sb + cmp r0, #0 + beq _020E882C + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] +_020E882C: + ldrb r1, [sp, #0x63] + cmp r1, #0x5b + bgt _020E8884 + bge _020E9058 + cmp r1, #0x47 + bgt _020E8878 + subs r0, r1, #0x41 + addpl pc, pc, r0, lsl #2 + b _020E886C +_020E8850: ; jump table + b _020E8CD4 ; case 0 + b _020E9310 ; case 1 + b _020E9310 ; case 2 + b _020E9310 ; case 3 + b _020E8CD4 ; case 4 + b _020E8CD4 ; case 5 + b _020E8CD4 ; case 6 +_020E886C: + cmp r1, #0x25 + beq _020E8F50 + b _020E9310 +_020E8878: + cmp r1, #0x58 + beq _020E8B10 + b _020E9310 +_020E8884: + cmp r1, #0x78 + bgt _020E88FC + subs r0, r1, #0x63 + addpl pc, pc, r0, lsl #2 + b _020E88F0 +_020E8898: ; jump table + b _020E8D98 ; case 0 + b _020E8904 ; case 1 + b _020E8CD4 ; case 2 + b _020E8CD4 ; case 3 + b _020E8CD4 ; case 4 + b _020E9310 ; case 5 + b _020E890C ; case 6 + b _020E9310 ; case 7 + b _020E9310 ; case 8 + b _020E9310 ; case 9 + b _020E9310 ; case 10 + b _020E929C ; case 11 + b _020E8B00 ; case 12 + b _020E9310 ; case 13 + b _020E9310 ; case 14 + b _020E9310 ; case 15 + b _020E8FDC ; case 16 + b _020E9310 ; case 17 + b _020E8B08 ; case 18 + b _020E9310 ; case 19 + b _020E9310 ; case 20 + b _020E8B10 ; case 21 +_020E88F0: + cmp r1, #0x61 + beq _020E8CD4 + b _020E9310 +_020E88FC: + cmp r1, #0xff + b _020E9310 +_020E8904: + mov r0, #0xa + b _020E8910 +_020E890C: + mov r0, #0 +_020E8910: + ldr r1, [sp, #0x30] + cmp r1, #0 + beq _020E8930 + mov r0, #0 + str r0, [sp, #0x1c] + str r0, [sp, #0x20] + str r0, [sp, #0x24] + b _020E8A38 +_020E8930: + ldrb r1, [sp, #0x62] + add r2, sp, #0x5c + cmp r1, #7 + cmpne r1, #4 + add r1, sp, #0x58 + bne _020E8974 + str r2, [sp] + str r1, [sp, #4] + add r1, sp, #0x54 + str r1, [sp, #8] + ldr r1, [sp, #0x64] + mov r2, sb + mov r3, r8 + bl __strtoull + str r0, [sp, #0x34] + str r1, [sp, #0x18] + b _020E8998 +_020E8974: + str r2, [sp] + str r1, [sp, #4] + add r1, sp, #0x54 + str r1, [sp, #8] + ldr r1, [sp, #0x64] + mov r2, sb + mov r3, r8 + bl __strtoul + str r0, [sp, #0x3c] +_020E8998: + ldr r0, [sp, #0x5c] + cmp r0, #0 + bne _020E89C8 + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] + mov r0, #0 + str r0, [sp, #0x1c] + str r0, [sp, #0x20] + str r0, [sp, #0x24] + b _020E8A38 +_020E89C8: + add r4, r4, r0 + ldrb r0, [sp, #0x62] + cmp r0, #7 + cmpne r0, #4 + bne _020E8A18 + ldr r0, [sp, #0x58] + cmp r0, #0 + beq _020E8A04 + ldr r0, [sp, #0x34] + rsbs r0, r0, #0 + str r0, [sp, #0x20] + ldr r0, [sp, #0x18] + rsc r0, r0, #0 + str r0, [sp, #0x24] + b _020E8A38 +_020E8A04: + ldr r0, [sp, #0x34] + str r0, [sp, #0x20] + ldr r0, [sp, #0x18] + str r0, [sp, #0x24] + b _020E8A38 +_020E8A18: + ldr r0, [sp, #0x58] + cmp r0, #0 + ldreq r0, [sp, #0x3c] + streq r0, [sp, #0x1c] + beq _020E8A38 + ldr r0, [sp, #0x3c] + rsb r0, r0, #0 + str r0, [sp, #0x1c] +_020E8A38: + cmp r5, #0 + beq _020E8AF0 + ldrb r0, [sp, #0x62] + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _020E8ADC +_020E8A50: ; jump table + b _020E8A70 ; case 0 + b _020E8A7C ; case 1 + b _020E8A88 ; case 2 + b _020E8A94 ; case 3 + b _020E8AA0 ; case 4 + b _020E8AB4 ; case 5 + b _020E8AC0 ; case 6 + b _020E8ACC ; case 7 +_020E8A70: + ldr r0, [sp, #0x1c] + str r0, [r5] + b _020E8ADC +_020E8A7C: + ldr r0, [sp, #0x1c] + strb r0, [r5] + b _020E8ADC +_020E8A88: + ldr r0, [sp, #0x1c] + strh r0, [r5] + b _020E8ADC +_020E8A94: + ldr r0, [sp, #0x1c] + str r0, [r5] + b _020E8ADC +_020E8AA0: + ldr r0, [sp, #0x20] + str r0, [r5] + ldr r0, [sp, #0x24] + str r0, [r5, #4] + b _020E8ADC +_020E8AB4: + ldr r0, [sp, #0x1c] + str r0, [r5] + b _020E8ADC +_020E8AC0: + ldr r0, [sp, #0x1c] + str r0, [r5] + b _020E8ADC +_020E8ACC: + ldr r0, [sp, #0x20] + str r0, [r5] + ldr r0, [sp, #0x24] + str r0, [r5, #4] +_020E8ADC: + ldr r0, [sp, #0x30] + cmp r0, #0 + ldreq r0, [sp, #0x44] + addeq r0, r0, #1 + streq r0, [sp, #0x44] +_020E8AF0: + ldr r0, [sp, #0x40] + add r0, r0, #1 + str r0, [sp, #0x40] + b _020E9300 +_020E8B00: + mov r0, #8 + b _020E8B14 +_020E8B08: + mov r0, #0xa + b _020E8B14 +_020E8B10: + mov r0, #0x10 +_020E8B14: + ldr r1, [sp, #0x30] + cmp r1, #0 + beq _020E8B34 + mov r0, #0 + str r0, [sp, #0x3c] + str r0, [sp, #0x34] + str r0, [sp, #0x18] + b _020E8C0C +_020E8B34: + ldrb r1, [sp, #0x62] + add r2, sp, #0x5c + cmp r1, #7 + cmpne r1, #4 + add r1, sp, #0x58 + bne _020E8B78 + str r2, [sp] + str r1, [sp, #4] + add r1, sp, #0x54 + str r1, [sp, #8] + ldr r1, [sp, #0x64] + mov r2, sb + mov r3, r8 + bl __strtoull + str r0, [sp, #0x34] + str r1, [sp, #0x18] + b _020E8B9C +_020E8B78: + str r2, [sp] + str r1, [sp, #4] + add r1, sp, #0x54 + str r1, [sp, #8] + ldr r1, [sp, #0x64] + mov r2, sb + mov r3, r8 + bl __strtoul + str r0, [sp, #0x3c] +_020E8B9C: + ldr r0, [sp, #0x5c] + cmp r0, #0 + bne _020E8BCC + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] + mov r0, #0 + str r0, [sp, #0x3c] + str r0, [sp, #0x34] + str r0, [sp, #0x18] + b _020E8C0C +_020E8BCC: + add r4, r4, r0 + ldr r0, [sp, #0x58] + cmp r0, #0 + beq _020E8C0C + ldrb r0, [sp, #0x62] + cmp r0, #7 + ldrne r0, [sp, #0x3c] + rsbne r0, r0, #0 + strne r0, [sp, #0x3c] + bne _020E8C0C + ldr r0, [sp, #0x34] + rsbs r0, r0, #0 + str r0, [sp, #0x34] + ldr r0, [sp, #0x18] + rsc r0, r0, #0 + str r0, [sp, #0x18] +_020E8C0C: + cmp r5, #0 + beq _020E8CC4 + ldrb r0, [sp, #0x62] + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _020E8CB0 +_020E8C24: ; jump table + b _020E8C44 ; case 0 + b _020E8C50 ; case 1 + b _020E8C5C ; case 2 + b _020E8C68 ; case 3 + b _020E8C74 ; case 4 + b _020E8C88 ; case 5 + b _020E8C94 ; case 6 + b _020E8CA0 ; case 7 +_020E8C44: + ldr r0, [sp, #0x3c] + str r0, [r5] + b _020E8CB0 +_020E8C50: + ldr r0, [sp, #0x3c] + strb r0, [r5] + b _020E8CB0 +_020E8C5C: + ldr r0, [sp, #0x3c] + strh r0, [r5] + b _020E8CB0 +_020E8C68: + ldr r0, [sp, #0x3c] + str r0, [r5] + b _020E8CB0 +_020E8C74: + ldr r0, [sp, #0x34] + str r0, [r5] + ldr r0, [sp, #0x18] + str r0, [r5, #4] + b _020E8CB0 +_020E8C88: + ldr r0, [sp, #0x3c] + str r0, [r5] + b _020E8CB0 +_020E8C94: + ldr r0, [sp, #0x3c] + str r0, [r5] + b _020E8CB0 +_020E8CA0: + ldr r0, [sp, #0x34] + str r0, [r5] + ldr r0, [sp, #0x18] + str r0, [r5, #4] +_020E8CB0: + ldr r0, [sp, #0x30] + cmp r0, #0 + ldreq r0, [sp, #0x44] + addeq r0, r0, #1 + streq r0, [sp, #0x44] +_020E8CC4: + ldr r0, [sp, #0x40] + add r0, r0, #1 + str r0, [sp, #0x40] + b _020E9300 +_020E8CD4: + ldr r0, [sp, #0x30] + cmp r0, #0 + beq _020E8CF0 + ldr r0, _020E934C ; =_021110EC + ldr r0, [r0] + bl _f2d + b _020E8D3C +_020E8CF0: + add r0, sp, #0x54 + str r0, [sp] + ldr r0, [sp, #0x64] + mov r1, sb + mov r2, r8 + add r3, sp, #0x5c + bl __strtold + ldr r2, [sp, #0x5c] + cmp r2, #0 + bne _020E8D38 + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] + ldr r0, _020E934C ; =_021110EC + ldr r0, [r0] + bl _f2d + b _020E8D3C +_020E8D38: + add r4, r4, r2 +_020E8D3C: + cmp r5, #0 + beq _020E8D88 + ldrb r2, [sp, #0x62] + cmp r2, #0 + beq _020E8D64 + cmp r2, #8 + beq _020E8D70 + cmp r2, #9 + stmeqia r5, {r0, r1} + b _020E8D74 +_020E8D64: + bl _d2f + str r0, [r5] + b _020E8D74 +_020E8D70: + stmia r5, {r0, r1} +_020E8D74: + ldr r0, [sp, #0x30] + cmp r0, #0 + ldreq r0, [sp, #0x44] + addeq r0, r0, #1 + streq r0, [sp, #0x44] +_020E8D88: + ldr r0, [sp, #0x40] + add r0, r0, #1 + str r0, [sp, #0x40] + b _020E9300 +_020E8D98: + ldrb r0, [sp, #0x61] + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0x64] + cmp r5, #0 + beq _020E8EE0 + cmp sl, #0 + beq _020E8DCC + ldr r0, [sp, #0x10] + mov r7, #1 + add r0, r0, #4 + ldr fp, [r0, #-4] + str r0, [sp, #0x10] +_020E8DCC: + ldr r0, [sp, #0x30] + mov r1, #0 + cmp r0, #0 + str r1, [sp, #0x5c] + beq _020E8DEC + cmp fp, #0 + strneb r1, [r5] + b _020E9300 +_020E8DEC: + mvn r0, #0 + str r5, [sp, #0x2c] + str r0, [sp, #0x48] + b _020E8E34 +_020E8DFC: + ldrb r0, [sp, #0x62] + strb r6, [sp, #0x50] + cmp r0, #0xa + ldrnesb r0, [sp, #0x50] + strneb r0, [r5], #1 + bne _020E8E28 + mov r0, r5 + add r1, sp, #0x50 + mov r2, #1 + bl mbtowc + add r5, r5, #1 +_020E8E28: + ldr r0, [sp, #0x5c] + add r1, r0, #1 + str r1, [sp, #0x5c] +_020E8E34: + ldr r0, [sp, #0x64] + cmp r0, #0 + sub r0, r0, #1 + str r0, [sp, #0x64] + beq _020E8E84 + cmp sl, #0 + beq _020E8E64 + cmp fp, r1 + movhi r7, #1 + movls r7, #0 + cmp r7, #0 + beq _020E8E84 +_020E8E64: + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r6, r0 + ldr r0, [sp, #0x48] + cmp r6, r0 + bne _020E8DFC +_020E8E84: + strb r6, [sp, #0x50] + ldr r0, [sp, #0x5c] + cmp r0, #0 + beq _020E8EA4 + cmp sl, #0 + beq _020E8ECC + cmp r7, #0 + bne _020E8ECC +_020E8EA4: + cmp sl, #0 + beq _020E9310 + mov r0, #1 + cmp fp, #0 + str r0, [sp, #0x30] + beq _020E9300 + ldr r0, [sp, #0x2c] + mov r1, #0 + strb r1, [r0] + b _020E9300 +_020E8ECC: + add r4, r4, r0 + ldr r0, [sp, #0x44] + add r0, r0, #1 + str r0, [sp, #0x44] + b _020E8F40 +_020E8EE0: + mov r0, #0 + str r0, [sp, #0x5c] + mvn r5, #0 + b _020E8F00 +_020E8EF0: + strb r6, [sp, #0x50] + ldr r0, [sp, #0x5c] + add r0, r0, #1 + str r0, [sp, #0x5c] +_020E8F00: + ldr r0, [sp, #0x64] + cmp r0, #0 + sub r0, r0, #1 + str r0, [sp, #0x64] + beq _020E8F30 + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r6, r0 + cmp r6, r5 + bne _020E8EF0 +_020E8F30: + strb r6, [sp, #0x50] + ldr r0, [sp, #0x5c] + cmp r0, #0 + beq _020E9310 +_020E8F40: + ldr r0, [sp, #0x40] + add r0, r0, #1 + str r0, [sp, #0x40] + b _020E9300 +_020E8F50: + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020E9300 + ldr r5, _020E9348 ; =_0210E504 + b _020E8F68 +_020E8F64: + add r4, r4, #1 +_020E8F68: + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + strb r0, [sp, #0x50] + ldrsb r1, [sp, #0x50] + cmp r1, #0 + blt _020E8F90 + cmp r1, #0x80 + blt _020E8F98 +_020E8F90: + mov r0, #0 + b _020E8FA4 +_020E8F98: + mov r0, r1, lsl #1 + ldrh r0, [r5, r0] + and r0, r0, #0x100 +_020E8FA4: + cmp r0, #0 + bne _020E8F64 + cmp r1, #0x25 + beq _020E8FD4 + mov r0, r8 + mov r2, #1 + blx sb + cmp sl, #0 + beq _020E9310 + mov r0, #1 + str r0, [sp, #0x30] + b _020E9300 +_020E8FD4: + add r4, r4, #1 + b _020E9300 +_020E8FDC: + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020E9058 + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + strb r0, [sp, #0x50] + b _020E9018 +_020E9000: + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + strb r0, [sp, #0x50] +_020E9018: + ldrsb r1, [sp, #0x50] + cmp r1, #0 + blt _020E902C + cmp r1, #0x80 + blt _020E9034 +_020E902C: + mov r0, #0 + b _020E9044 +_020E9034: + ldr r0, _020E9348 ; =_0210E504 + mov r2, r1, lsl #1 + ldrh r0, [r0, r2] + and r0, r0, #0x100 +_020E9044: + cmp r0, #0 + bne _020E9000 + mov r0, r8 + mov r2, #1 + blx sb +_020E9058: + cmp r5, #0 + beq _020E91D4 + cmp sl, #0 + beq _020E9080 + ldr r0, [sp, #0x10] + mov r7, #1 + add r0, r0, #4 + str r0, [sp, #0x10] + ldr r0, [r0, #-4] + sub fp, r0, #1 +_020E9080: + ldr r0, [sp, #0x30] + mov r1, #0 + cmp r0, #0 + str r1, [sp, #0x5c] + beq _020E90A0 + cmp fp, #0 + strneb r1, [r5] + b _020E9300 +_020E90A0: + mvn r0, #0 + str r5, [sp, #0x28] + str r0, [sp, #0x4c] + b _020E9104 +_020E90B0: + strb r6, [sp, #0x50] + ldrsb r1, [sp, #0x50] + add r2, sp, #0x60 + and r3, r1, #0xff + add r2, r2, r3, asr #3 + ldrb r3, [r2, #8] + and r0, r1, #7 + mov r2, #1 + tst r3, r2, lsl r0 + beq _020E9154 + ldrb r0, [sp, #0x62] + cmp r0, #0xa + strneb r1, [r5], #1 + bne _020E90F8 + mov r0, r5 + add r1, sp, #0x50 + bl mbtowc + add r5, r5, #2 +_020E90F8: + ldr r0, [sp, #0x5c] + add r1, r0, #1 + str r1, [sp, #0x5c] +_020E9104: + ldr r0, [sp, #0x64] + cmp r0, #0 + sub r0, r0, #1 + str r0, [sp, #0x64] + beq _020E9154 + cmp sl, #0 + beq _020E9134 + cmp fp, r1 + movhs r7, #1 + movlo r7, #0 + cmp r7, #0 + beq _020E9154 +_020E9134: + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r6, r0 + ldr r0, [sp, #0x4c] + cmp r6, r0 + bne _020E90B0 +_020E9154: + strb r6, [sp, #0x50] + ldr r0, [sp, #0x5c] + cmp r0, #0 + beq _020E9174 + cmp sl, #0 + beq _020E91AC + cmp r7, #0 + bne _020E91AC +_020E9174: + mov r0, r8 + ldrsb r1, [sp, #0x50] + mov r2, #1 + blx sb + cmp sl, #0 + beq _020E9310 + mov r0, #1 + cmp fp, #0 + str r0, [sp, #0x30] + beq _020E9300 + ldr r0, [sp, #0x28] + mov r1, #0 + strb r1, [r0] + b _020E9300 +_020E91AC: + add r4, r4, r0 + ldrb r0, [sp, #0x62] + cmp r0, #0xa + mov r0, #0 + streqh r0, [r5] + strneb r0, [r5] + ldr r0, [sp, #0x44] + add r0, r0, #1 + str r0, [sp, #0x44] + b _020E9270 +_020E91D4: + mov r0, #0 + str r0, [sp, #0x5c] + mvn r5, #0 + b _020E9218 +_020E91E4: + strb r6, [sp, #0x50] + ldrsb r1, [sp, #0x50] + and r0, r1, #7 + and r2, r1, #0xff + add r1, sp, #0x60 + add r1, r1, r2, asr #3 + ldrb r2, [r1, #8] + mov r1, #1 + tst r2, r1, lsl r0 + beq _020E9248 + ldr r0, [sp, #0x5c] + add r0, r0, #1 + str r0, [sp, #0x5c] +_020E9218: + ldr r0, [sp, #0x64] + cmp r0, #0 + sub r0, r0, #1 + str r0, [sp, #0x64] + beq _020E9248 + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r6, r0 + cmp r6, r5 + bne _020E91E4 +_020E9248: + strb r6, [sp, #0x50] + ldr r0, [sp, #0x5c] + cmp r0, #0 + bne _020E926C + mov r0, r8 + ldrsb r1, [sp, #0x50] + mov r2, #1 + blx sb + b _020E9300 +_020E926C: + add r4, r4, r0 +_020E9270: + ldr r0, [sp, #0x64] + cmp r0, #0 + blt _020E928C + mov r0, r8 + ldrsb r1, [sp, #0x50] + mov r2, #1 + blx sb +_020E928C: + ldr r0, [sp, #0x40] + add r0, r0, #1 + str r0, [sp, #0x40] + b _020E9300 +_020E929C: + cmp r5, #0 + beq _020E9300 + ldrb r0, [sp, #0x62] + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _020E9300 +_020E92B4: ; jump table + b _020E92D4 ; case 0 + b _020E92EC ; case 1 + b _020E92DC ; case 2 + b _020E92E4 ; case 3 + b _020E9300 ; case 4 + b _020E9300 ; case 5 + b _020E9300 ; case 6 + b _020E92F4 ; case 7 +_020E92D4: + str r4, [r5] + b _020E9300 +_020E92DC: + strh r4, [r5] + b _020E9300 +_020E92E4: + str r4, [r5] + b _020E9300 +_020E92EC: + strb r4, [r5] + b _020E9300 +_020E92F4: + str r4, [r5] + mov r0, r4, asr #0x1f + str r0, [r5, #4] +_020E9300: + ldr r0, [sp, #0xc] + ldrsb r5, [r0] + cmp r5, #0 + bne _020E8644 +_020E9310: + mov r0, r8 + mov r1, #0 + mov r2, #2 + blx sb + cmp r0, #0 + beq _020E933C + ldr r0, [sp, #0x40] + cmp r0, #0 + addeq sp, sp, #0x88 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E933C: + ldr r0, [sp, #0x44] + add sp, sp, #0x88 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E9348: .word _0210E504 +_020E934C: .word _021110EC + arm_func_end __sformatter + + arm_func_start __StringRead +__StringRead: ; 0x020E9350 + cmp r2, #0 + beq _020E936C + cmp r2, #1 + beq _020E939C + cmp r2, #2 + beq _020E93C4 + b _020E93CC +_020E936C: + ldr r1, [r0] + ldrsb r2, [r1] + cmp r2, #0 + bne _020E938C + mov r1, #1 + str r1, [r0, #4] + sub r0, r1, #2 + bx lr +_020E938C: + add r1, r1, #1 + str r1, [r0] + and r0, r2, #0xff + bx lr +_020E939C: + ldr r2, [r0, #4] + cmp r2, #0 + movne r2, #0 + strne r2, [r0, #4] + bne _020E93BC + ldr r2, [r0] + sub r2, r2, #1 + str r2, [r0] +_020E93BC: + mov r0, r1 + bx lr +_020E93C4: + ldr r0, [r0, #4] + bx lr +_020E93CC: + mov r0, #0 + bx lr + arm_func_end __StringRead + + arm_func_start vsscanf +vsscanf: ; 0x020E93D4 + stmdb sp!, {lr} + sub sp, sp, #0xc + str r0, [sp, #4] + cmp r0, #0 + ldrnesb r0, [r0] + mov lr, r1 + mov r3, r2 + cmpne r0, #0 + addeq sp, sp, #0xc + mvneq r0, #0 + ldmeqia sp!, {pc} + mov ip, #0 + str ip, [sp, #8] + ldr r0, _020E9424 ; =__StringRead + add r1, sp, #4 + mov r2, lr + str ip, [sp] + bl __sformatter + add sp, sp, #0xc + ldmia sp!, {pc} + .align 2, 0 +_020E9424: .word __StringRead + arm_func_end vsscanf + + arm_func_start sscanf +sscanf: ; 0x020E9428 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r2, sp, #0xc + bic r2, r2, #3 + ldr r1, [sp, #0xc] + add r2, r2, #4 + bl vsscanf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end sscanf + + arm_func_start raise +raise: ; 0x020E9450 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + cmp r5, #1 + blt _020E9468 + cmp r5, #7 + ble _020E9470 +_020E9468: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020E9470: + ldr r0, _020E956C ; =_021E5590 + bl OS_TryLockMutex + cmp r0, #0 + bne _020E94A4 + ldr r0, _020E9570 ; =OSi_ThreadInfo + ldr r1, _020E9574 ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E9578 ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1, #0x1c] + str r2, [r0, #0x1c] + b _020E94FC +_020E94A4: + ldr r0, _020E9570 ; =OSi_ThreadInfo + ldr r1, _020E9574 ; =_021E54A0 + ldr r0, [r0, #4] + ldr r1, [r1, #0x1c] + ldr r0, [r0, #0x6c] + cmp r1, r0 + bne _020E94D4 + ldr r0, _020E9578 ; =_021E54C4 + ldr r1, [r0, #0x1c] + add r1, r1, #1 + str r1, [r0, #0x1c] + b _020E94FC +_020E94D4: + ldr r0, _020E956C ; =_021E5590 + bl OS_LockMutex + ldr r0, _020E9570 ; =OSi_ThreadInfo + ldr r1, _020E9574 ; =_021E54A0 + ldr r2, [r0, #4] + ldr r0, _020E9578 ; =_021E54C4 + ldr r3, [r2, #0x6c] + mov r2, #1 + str r3, [r1, #0x1c] + str r2, [r0, #0x1c] +_020E94FC: + ldr r1, _020E957C ; =_021E58C4 + sub r2, r5, #1 + ldr r4, [r1, r2, lsl #2] + cmp r4, #1 + movne r0, #0 + strne r0, [r1, r2, lsl #2] + ldr r0, _020E9578 ; =_021E54C4 + ldr r1, [r0, #0x1c] + subs r1, r1, #1 + str r1, [r0, #0x1c] + bne _020E9530 + ldr r0, _020E956C ; =_021E5590 + bl OS_UnlockMutex +_020E9530: + cmp r4, #1 + beq _020E9544 + cmp r4, #0 + cmpeq r5, #1 + bne _020E954C +_020E9544: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020E954C: + cmp r4, #0 + bne _020E955C + mov r0, #0 + bl exit +_020E955C: + mov r0, r5 + blx r4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E956C: .word _021E5590 +_020E9570: .word OSi_ThreadInfo +_020E9574: .word _021E54A0 +_020E9578: .word _021E54C4 +_020E957C: .word _021E58C4 + arm_func_end raise + + arm_func_start strlen +strlen: ; 0x020E9580 + mvn r2, #0 +_020E9584: + ldrsb r1, [r0], #1 + add r2, r2, #1 + cmp r1, #0 + bne _020E9584 + mov r0, r2 + bx lr + arm_func_end strlen + + arm_func_start strcpy +strcpy: ; 0x020E959C + stmdb sp!, {r3, r4, r5, lr} + and r4, r1, #3 + and r3, r0, #3 + mov r2, r0 + cmp r3, r4 + bne _020E9638 + cmp r4, #0 + beq _020E95F4 + ldrb r3, [r1] + strb r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} + rsbs r4, r4, #3 + beq _020E95EC +_020E95D4: + ldrb r3, [r1, #1]! + cmp r3, #0 + strb r3, [r2, #1]! + ldmeqia sp!, {r3, r4, r5, pc} + subs r4, r4, #1 + bne _020E95D4 +_020E95EC: + add r2, r2, #1 + add r1, r1, #1 +_020E95F4: + ldr r5, [r1] + ldr r3, _020E965C ; =0xFEFEFEFF + mvn r4, r5 + add lr, r5, r3 + ldr ip, _020E9660 ; =0x80808080 + and r4, lr, r4 + tst r4, ip + bne _020E9638 + sub r2, r2, #4 +_020E9618: + str r5, [r2, #4]! + ldr r5, [r1, #4]! + add r4, r5, r3 + mvn lr, r5 + and lr, r4, lr + tst lr, ip + beq _020E9618 + add r2, r2, #4 +_020E9638: + ldrb r3, [r1] + strb r3, [r2] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} +_020E9648: + ldrb r3, [r1, #1]! + cmp r3, #0 + strb r3, [r2, #1]! + bne _020E9648 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E965C: .word 0xFEFEFEFF +_020E9660: .word 0x80808080 + arm_func_end strcpy + + arm_func_start strncpy +strncpy: ; 0x020E9664 + stmdb sp!, {r3, lr} + mov lr, r0 + cmp r2, #0 + ldmeqia sp!, {r3, pc} +_020E9674: + ldrsb r3, [r1], #1 + mov ip, lr + strb r3, [lr], #1 + ldrsb r3, [ip] + cmp r3, #0 + bne _020E96A8 + subs r2, r2, #1 + ldmeqia sp!, {r3, pc} + mov r1, #0 +_020E9698: + strb r1, [lr], #1 + subs r2, r2, #1 + bne _020E9698 + ldmia sp!, {r3, pc} +_020E96A8: + subs r2, r2, #1 + bne _020E9674 + ldmia sp!, {r3, pc} + arm_func_end strncpy + + arm_func_start strcat +strcat: ; 0x020E96B4 + mov r3, r0 +_020E96B8: + ldrsb r2, [r3], #1 + cmp r2, #0 + bne _020E96B8 + sub r3, r3, #1 +_020E96C8: + ldrsb r2, [r1], #1 + mov ip, r3 + strb r2, [r3], #1 + ldrsb r2, [ip] + cmp r2, #0 + bne _020E96C8 + bx lr + arm_func_end strcat + + arm_func_start strncat +strncat: ; 0x020E96E4 + stmdb sp!, {r3, lr} + mov ip, r0 +_020E96EC: + ldrsb r3, [ip], #1 + cmp r3, #0 + bne _020E96EC + cmp r2, #0 + sub ip, ip, #1 + beq _020E9728 +_020E9704: + ldrsb r3, [r1], #1 + mov lr, ip + strb r3, [ip], #1 + ldrsb r3, [lr] + cmp r3, #0 + subeq ip, ip, #1 + beq _020E9728 + subs r2, r2, #1 + bne _020E9704 +_020E9728: + mov r1, #0 + strb r1, [ip] + ldmia sp!, {r3, pc} + arm_func_end strncat + + arm_func_start strcmp +strcmp: ; 0x020E9734 + stmdb sp!, {r4, lr} + ldrb r2, [r0] + ldrb r3, [r1] + subs r3, r2, r3 + movne r0, r3 + ldmneia sp!, {r4, pc} + and r4, r0, #3 + and r3, r1, #3 + cmp r3, r4 + bne _020E9810 + cmp r4, #0 + beq _020E97A8 + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + rsbs r4, r4, #3 + beq _020E97A0 +_020E9778: + ldrb r3, [r0, #1]! + ldrb r2, [r1, #1]! + subs r2, r3, r2 + movne r0, r2 + ldmneia sp!, {r4, pc} + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + subs r4, r4, #1 + bne _020E9778 +_020E97A0: + add r0, r0, #1 + add r1, r1, #1 +_020E97A8: + ldr r2, [r0] + ldr r3, _020E9840 ; =0xFEFEFEFF + mvn r4, r2 + add lr, r2, r3 + ldr ip, _020E9844 ; =0x80808080 + and r4, lr, r4 + tst r4, ip + ldr r4, [r1] + bne _020E97FC + cmp r2, r4 + bne _020E97F0 +_020E97D4: + ldr r2, [r0, #4]! + ldr r4, [r1, #4]! + add lr, r2, r3 + tst lr, ip + bne _020E97FC + cmp r2, r4 + beq _020E97D4 +_020E97F0: + sub r0, r0, #1 + sub r1, r1, #1 + b _020E9810 +_020E97FC: + ldrb r2, [r0] + ldrb r3, [r1] + subs r3, r2, r3 + movne r0, r3 + ldmneia sp!, {r4, pc} +_020E9810: + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_020E981C: + ldrb r3, [r0, #1]! + ldrb r2, [r1, #1]! + subs r2, r3, r2 + movne r0, r2 + ldmneia sp!, {r4, pc} + cmp r3, #0 + bne _020E981C + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020E9840: .word 0xFEFEFEFF +_020E9844: .word 0x80808080 + arm_func_end strcmp + + arm_func_start strncmp +strncmp: ; 0x020E9848 + cmp r2, #0 + beq _020E9874 +_020E9850: + ldrb ip, [r1], #1 + ldrb r3, [r0], #1 + cmp r3, ip + subne r0, r3, ip + bxne lr + cmp r3, #0 + beq _020E9874 + subs r2, r2, #1 + bne _020E9850 +_020E9874: + mov r0, #0 + bx lr + arm_func_end strncmp + + arm_func_start strchr +strchr: ; 0x020E987C + ldrsb r2, [r0], #1 + mov r1, r1, lsl #0x18 + mov r1, r1, asr #0x18 + cmp r2, #0 + beq _020E98A8 +_020E9890: + cmp r2, r1 + subeq r0, r0, #1 + bxeq lr + ldrsb r2, [r0], #1 + cmp r2, #0 + bne _020E9890 +_020E98A8: + cmp r1, #0 + movne r0, #0 + subeq r0, r0, #1 + bx lr + arm_func_end strchr + + arm_func_start strspn +strspn: ; 0x020E98B8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x20 + add ip, sp, #0 + mov r3, #8 + mov r2, #0 +_020E98CC: + strb r2, [ip] + strb r2, [ip, #1] + strb r2, [ip, #2] + strb r2, [ip, #3] + add ip, ip, #4 + subs r3, r3, #1 + bne _020E98CC + ldrb r3, [r1] + add r4, r1, #1 + cmp r3, #0 + beq _020E9928 + add lr, sp, #0 + mov r2, #1 +_020E9900: + and ip, r3, #0xff + and r1, r3, #7 + mov r1, r2, lsl r1 + ldrb r3, [lr, ip, asr #3] + and r1, r1, #0xff + orr r1, r3, r1 + strb r1, [lr, ip, asr #3] + ldrb r3, [r4], #1 + cmp r3, #0 + bne _020E9900 +_020E9928: + ldrb r1, [r0] + add r4, r0, #1 + cmp r1, #0 + beq _020E9968 + add ip, sp, #0 + mov r2, #1 +_020E9940: + and r3, r1, #0xff + and r1, r1, #7 + mov r1, r2, lsl r1 + ldrb r3, [ip, r3, asr #3] + and r1, r1, #0xff + tst r3, r1 + bne _020E9968 + ldrb r1, [r4], #1 + cmp r1, #0 + bne _020E9940 +_020E9968: + sub r0, r4, r0 + sub r0, r0, #1 + add sp, sp, #0x20 + ldmia sp!, {r4, pc} + arm_func_end strspn + + arm_func_start strtok +strtok: ; 0x020E9978 + stmdb sp!, {r4, lr} + sub sp, sp, #0x20 + add ip, sp, #0 + mov r3, #8 + mov r2, #0 +_020E998C: + strb r2, [ip] + strb r2, [ip, #1] + strb r2, [ip, #2] + strb r2, [ip, #3] + add ip, ip, #4 + subs r3, r3, #1 + bne _020E998C + cmp r0, #0 + ldrne r2, _020E9ACC ; =_0211135C + add lr, r1, #1 + strne r0, [r2, #4] + ldrb r0, [r1] + cmp r0, #0 + beq _020E99F4 + add ip, sp, #0 + mov r1, #1 +_020E99CC: + and r3, r0, #0xff + and r0, r0, #7 + mov r0, r1, lsl r0 + ldrb r2, [ip, r3, asr #3] + and r0, r0, #0xff + orr r0, r2, r0 + strb r0, [ip, r3, asr #3] + ldrb r0, [lr], #1 + cmp r0, #0 + bne _020E99CC +_020E99F4: + ldr r0, _020E9ACC ; =_0211135C + ldr r0, [r0, #4] + ldrb r4, [r0] + add r1, r0, #1 + cmp r4, #0 + beq _020E9A38 + add ip, sp, #0 + mov r2, #1 +_020E9A14: + and r3, r4, #0xff + and r0, r4, #7 + mov r0, r2, lsl r0 + ldrb r3, [ip, r3, asr #3] + and r0, r0, #0xff + tst r3, r0 + ldrneb r4, [r1], #1 + cmpne r4, #0 + bne _020E9A14 +_020E9A38: + cmp r4, #0 + bne _020E9A58 + ldr r1, _020E9ACC ; =_0211135C + add sp, sp, #0x20 + ldr r2, [r1] + mov r0, #0 + str r2, [r1, #4] + ldmia sp!, {r4, pc} +_020E9A58: + sub r0, r1, #1 + ldrb r4, [r1], #1 + cmp r4, #0 + beq _020E9A98 + add lr, sp, #0 + mov r3, #1 +_020E9A70: + and ip, r4, #0xff + and r2, r4, #7 + mov r2, r3, lsl r2 + ldrb ip, [lr, ip, asr #3] + and r2, r2, #0xff + tst ip, r2 + bne _020E9A98 + ldrb r4, [r1], #1 + cmp r4, #0 + bne _020E9A70 +_020E9A98: + cmp r4, #0 + bne _020E9AB4 + ldr r1, _020E9ACC ; =_0211135C + add sp, sp, #0x20 + ldr r2, [r1] + str r2, [r1, #4] + ldmia sp!, {r4, pc} +_020E9AB4: + ldr r2, _020E9ACC ; =_0211135C + mov r3, #0 + str r1, [r2, #4] + strb r3, [r1, #-1] + add sp, sp, #0x20 + ldmia sp!, {r4, pc} + .align 2, 0 +_020E9ACC: .word _0211135C + arm_func_end strtok + + arm_func_start strstr +strstr: ; 0x020E9AD0 + stmdb sp!, {r4, lr} + cmp r1, #0 + ldrneb r2, [r1] + cmpne r2, #0 + ldmeqia sp!, {r4, pc} + ldrb r3, [r0] + add r4, r0, #1 + cmp r3, #0 + beq _020E9B34 +_020E9AF4: + cmp r3, r2 + bne _020E9B28 + mov lr, r4 + add ip, r1, #1 +_020E9B04: + ldrb r3, [ip], #1 + ldrb r0, [lr], #1 + cmp r0, r3 + bne _020E9B1C + cmp r0, #0 + bne _020E9B04 +_020E9B1C: + cmp r3, #0 + subeq r0, r4, #1 + ldmeqia sp!, {r4, pc} +_020E9B28: + ldrb r3, [r4], #1 + cmp r3, #0 + bne _020E9AF4 +_020E9B34: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end strstr + + arm_func_start __strtold +__strtold: ; 0x020E9B3C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xa8 + ldr r4, [sp, #0xd0] + mov sl, #0 + str r4, [sp, #0xd0] + str r0, [sp] + add r6, sp, #0x80 + mov sb, r1 + mov r8, r2 + str r3, [sp, #4] + mov r4, sl + str sl, [sp, #0x2c] + mov r5, #1 + mov r0, #4 +_020E9B74: + strh sl, [r6] + strh sl, [r6, #2] + strh sl, [r6, #4] + strh sl, [r6, #6] + add r6, r6, #8 + subs r0, r0, #1 + bne _020E9B74 + mov r0, #0 + str r0, [sp, #0x28] + strh sl, [r6] + strh sl, [r6, #2] + ldr r2, [sp, #0x28] + ldr r1, [sp, #0xd0] + strh sl, [r6, #4] + str r2, [r1] + mov r1, r2 + mov r0, r8 + str r1, [sp, #0x24] + str r1, [sp, #0x20] + str r1, [sp, #0x1c] + str r1, [sp, #0x18] + str r1, [sp, #0x10] + str r1, [sp, #0xc] + str r1, [sp, #8] + add r4, r4, #1 + blx sb + mov r1, r0 + ldr r7, _020EAB1C ; =_0210E631 + add r0, sp, #0x4d + mov r6, #4 +_020E9BEC: + ldrb r3, [r7] + ldrb r2, [r7, #1] + add r7, r7, #2 + strb r3, [r0] + strb r2, [r0, #1] + add r0, r0, #2 + subs r6, r6, #1 + bne _020E9BEC + ldrb r3, [r7] + ldr r2, _020EAB20 ; =_0210E62C + strb r3, [r0] + ldrb r3, [r2, #1] + ldrb r0, [r2, #2] + ldrb r6, [r2] + strb r3, [sp, #0x31] + strb r0, [sp, #0x32] + ldrb r3, [r2, #3] + ldrb r0, [r2, #4] + strb r6, [sp, #0x30] + strb r3, [sp, #0x33] + strb r0, [sp, #0x34] + b _020EA930 +_020E9C44: + cmp r5, #0x100 + bgt _020E9CBC + bge _020EA3C4 + cmp r5, #0x20 + bgt _020E9CA0 + bge _020EA298 + cmp r5, #8 + bgt _020E9C94 + cmp r5, #0 + addge pc, pc, r5, lsl #2 + b _020EA930 +_020E9C70: ; jump table + b _020EA930 ; case 0 + b _020E9D00 ; case 1 + b _020EA0E4 ; case 2 + b _020EA930 ; case 3 + b _020EA194 ; case 4 + b _020EA930 ; case 5 + b _020EA930 ; case 6 + b _020EA930 ; case 7 + b _020EA1BC ; case 8 +_020E9C94: + cmp r5, #0x10 + beq _020EA260 + b _020EA930 +_020E9CA0: + cmp r5, #0x40 + bgt _020E9CB0 + beq _020EA324 + b _020EA930 +_020E9CB0: + cmp r5, #0x80 + beq _020EA370 + b _020EA930 +_020E9CBC: + cmp r5, #0x2000 + bgt _020E9CE4 + bge _020E9F18 + cmp r5, #0x200 + bgt _020E9CD8 + beq _020EA424 + b _020EA930 +_020E9CD8: + cmp r5, #0x400 + beq _020EA44C + b _020EA930 +_020E9CE4: + cmp r5, #0x4000 + bgt _020E9CF4 + beq _020E9E20 + b _020EA930 +_020E9CF4: + cmp r5, #0x8000 + beq _020EA4C4 + b _020EA930 +_020E9D00: + cmp r1, #0 + blt _020E9D10 + cmp r1, #0x80 + blt _020E9D18 +_020E9D10: + mov r0, #0 + b _020E9D28 +_020E9D18: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #0x100 +_020E9D28: + cmp r0, #0 + beq _020E9D54 + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r1, r0 + ldr r0, [sp, #0x2c] + add r0, r0, #1 + str r0, [sp, #0x2c] + b _020EA930 +_020E9D54: + cmp r1, #0 + blt _020E9D64 + cmp r1, #0x80 + blt _020E9D6C +_020E9D64: + mov r0, r1 + b _020E9D74 +_020E9D6C: + ldr r0, _020EAB28 ; =_0210E484 + ldrb r0, [r0, r1] +_020E9D74: + cmp r0, #0x49 + bgt _020E9DA0 + bge _020E9DD8 + cmp r0, #0x2d + bgt _020E9E18 + cmp r0, #0x2b + blt _020E9E18 + beq _020E9DB4 + cmp r0, #0x2d + beq _020E9DAC + b _020E9E18 +_020E9DA0: + cmp r0, #0x4e + beq _020E9DF8 + b _020E9E18 +_020E9DAC: + mov r0, #1 + str r0, [sp, #0x28] +_020E9DB4: + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + mov r0, #1 + str r0, [sp, #0x18] + b _020EA930 +_020E9DD8: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + mov r5, #0x4000 + b _020EA930 +_020E9DF8: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + mov r5, #0x2000 + b _020EA930 +_020E9E18: + mov r5, #2 + b _020EA930 +_020E9E20: + mov r5, #1 + add r7, sp, #0x4d + add r0, sp, #0x76 + mov r6, #4 +_020E9E30: + ldrb r3, [r7] + ldrb r2, [r7, #1] + add r7, r7, #2 + strb r3, [r0] + strb r2, [r0, #1] + add r0, r0, #2 + subs r6, r6, #1 + bne _020E9E30 + ldrb r2, [r7] + add r6, sp, #0x77 + ldr r7, _020EAB28 ; =_0210E484 + strb r2, [r0] + b _020E9E84 +_020E9E64: + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r6, r6, #1 + add r5, r5, #1 + add r4, r4, #1 + blx sb + mov r1, r0 +_020E9E84: + cmp r5, #8 + bge _020E9EB4 + cmp r1, #0 + blt _020E9E9C + cmp r1, #0x80 + blt _020E9EA4 +_020E9E9C: + mov r2, r1 + b _020E9EA8 +_020E9EA4: + ldrb r2, [r7, r1] +_020E9EA8: + ldrsb r0, [r6] + cmp r0, r2 + beq _020E9E64 +_020E9EB4: + cmp r5, #3 + cmpne r5, #8 + bne _020E9F10 + ldr r0, [sp, #0x28] + cmp r0, #0 + beq _020E9EE4 + ldr r1, _020EAB2C ; =_021110E8 + mov r0, #0 + ldr r1, [r1] + bl _fsub + bl _f2d + b _020E9EF0 +_020E9EE4: + ldr r0, _020EAB2C ; =_021110E8 + ldr r0, [r0] + bl _f2d +_020E9EF0: + ldr r2, [sp, #0x2c] + add r3, r2, r5 + ldr r2, [sp, #0x18] + add r3, r2, r3 + ldr r2, [sp, #4] + add sp, sp, #0xa8 + str r3, [r2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E9F10: + mov r5, #0x1000 + b _020EA930 +_020E9F18: + ldrb r3, [sp, #0x30] + ldrb r0, [sp, #0x32] + ldrb r2, [sp, #0x31] + strb r3, [sp, #0x40] + strb r0, [sp, #0x42] + ldrb r3, [sp, #0x33] + ldrb r0, [sp, #0x34] + strb r2, [sp, #0x41] + mov r5, #1 + strb r0, [sp, #0x44] + mov r6, #0 + add r2, sp, #0x56 + strb r3, [sp, #0x43] + mov r0, #8 +_020E9F50: + strb r6, [r2] + strb r6, [r2, #1] + strb r6, [r2, #2] + strb r6, [r2, #3] + add r2, r2, #4 + subs r0, r0, #1 + bne _020E9F50 + add r7, sp, #0x41 + b _020E9F94 +_020E9F74: + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r7, r7, #1 + add r5, r5, #1 + add r4, r4, #1 + blx sb + mov r1, r0 +_020E9F94: + cmp r5, #4 + bge _020E9FC8 + cmp r1, #0 + blt _020E9FAC + cmp r1, #0x80 + blt _020E9FB4 +_020E9FAC: + mov r2, r1 + b _020E9FBC +_020E9FB4: + ldr r0, _020EAB28 ; =_0210E484 + ldrb r2, [r0, r1] +_020E9FBC: + ldrsb r0, [r7] + cmp r0, r2 + beq _020E9F74 +_020E9FC8: + sub r0, r5, #3 + cmp r0, #1 + bhi _020EA0DC + cmp r5, #4 + bne _020EA080 + ldr r7, _020EAB24 ; =_0210E504 + b _020EA008 +_020E9FE4: + add r0, sp, #0x56 + strb r1, [r0, r6] + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r6, r6, #1 + add r4, r4, #1 + blx sb + mov r1, r0 +_020EA008: + cmp r6, #0x20 + bge _020EA070 + cmp r1, #0 + blt _020EA020 + cmp r1, #0x80 + blt _020EA028 +_020EA020: + mov r0, #0 + b _020EA034 +_020EA028: + mov r0, r1, lsl #1 + ldrh r0, [r7, r0] + and r0, r0, #8 +_020EA034: + cmp r0, #0 + bne _020E9FE4 + cmp r1, #0 + blt _020EA04C + cmp r1, #0x80 + blt _020EA054 +_020EA04C: + mov r0, #0 + b _020EA060 +_020EA054: + mov r0, r1, lsl #1 + ldrh r0, [r7, r0] + and r0, r0, #1 +_020EA060: + cmp r0, #0 + bne _020E9FE4 + cmp r1, #0x2e + beq _020E9FE4 +_020EA070: + cmp r1, #0x29 + movne r5, #0x1000 + bne _020EA930 + add r6, r6, #1 +_020EA080: + add r0, sp, #0x56 + mov r1, #0 + strb r1, [r0, r6] + ldr r1, [sp, #0x28] + cmp r1, #0 + beq _020EA0B4 + bl nan + mov r2, r0 + mov r0, #0 + mov r3, r1 + mov r1, r0 + bl _dsub + b _020EA0B8 +_020EA0B4: + bl nan +_020EA0B8: + ldr r2, [sp, #0x2c] + add r2, r2, r5 + add r3, r6, r2 + ldr r2, [sp, #0x18] + add r3, r2, r3 + ldr r2, [sp, #4] + add sp, sp, #0xa8 + str r3, [r2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EA0DC: + mov r5, #0x1000 + b _020EA930 +_020EA0E4: + cmp r1, #0x2e + bne _020EA10C + mov r5, #0x10 + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA10C: + cmp r1, #0 + blt _020EA11C + cmp r1, #0x80 + blt _020EA124 +_020EA11C: + mov r0, #0 + b _020EA134 +_020EA124: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA134: + cmp r0, #0 + moveq r5, #0x1000 + beq _020EA930 + cmp r1, #0x30 + bne _020EA18C + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + cmp r0, #0 + mov r1, r0 + blt _020EA178 + cmp r0, #0x80 + bge _020EA178 + ldr r2, _020EAB28 ; =_0210E484 + ldrb r0, [r2, r0] +_020EA178: + cmp r0, #0x58 + moveq r5, #0x8000 + moveq sl, #1 + movne r5, #4 + b _020EA930 +_020EA18C: + mov r5, #8 + b _020EA930 +_020EA194: + cmp r1, #0x30 + movne r5, #8 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA1BC: + cmp r1, #0 + blt _020EA1CC + cmp r1, #0x80 + blt _020EA1D4 +_020EA1CC: + mov r0, #0 + b _020EA1E4 +_020EA1D4: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA1E4: + cmp r0, #0 + bne _020EA218 + cmp r1, #0x2e + movne r5, #0x40 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov r5, #0x20 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA218: + ldrb r2, [sp, #0x84] + cmp r2, #0x14 + ldrhs r0, [sp, #0x1c] + addhs r0, r0, #1 + strhs r0, [sp, #0x1c] + bhs _020EA244 + add r0, r2, #1 + strb r0, [sp, #0x84] + add r0, sp, #0x80 + add r0, r0, r2 + strb r1, [r0, #5] +_020EA244: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA260: + cmp r1, #0 + blt _020EA270 + cmp r1, #0x80 + blt _020EA278 +_020EA270: + mov r0, #0 + b _020EA288 +_020EA278: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA288: + cmp r0, #0 + moveq r5, #0x1000 + movne r5, #0x20 + b _020EA930 +_020EA298: + cmp r1, #0 + blt _020EA2A8 + cmp r1, #0x80 + blt _020EA2B0 +_020EA2A8: + mov r0, #0 + b _020EA2C0 +_020EA2B0: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA2C0: + cmp r0, #0 + moveq r5, #0x40 + beq _020EA930 + ldrb r3, [sp, #0x84] + cmp r3, #0x14 + bhs _020EA308 + cmp r1, #0x30 + cmpeq r3, #0 + beq _020EA2FC + ldrb r2, [sp, #0x84] + add r0, sp, #0x80 + add r0, r0, r3 + add r2, r2, #1 + strb r2, [sp, #0x84] + strb r1, [r0, #5] +_020EA2FC: + ldr r0, [sp, #0x1c] + sub r0, r0, #1 + str r0, [sp, #0x1c] +_020EA308: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA324: + cmp r1, #0 + blt _020EA334 + cmp r1, #0x80 + blt _020EA33C +_020EA334: + mov r0, r1 + b _020EA344 +_020EA33C: + ldr r0, _020EAB28 ; =_0210E484 + ldrb r0, [r0, r1] +_020EA344: + cmp r0, #0x45 + movne r5, #0x800 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov r5, #0x80 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA370: + cmp r1, #0x2b + bne _020EA394 + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA3BC +_020EA394: + cmp r1, #0x2d + bne _020EA3BC + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + mov r0, #1 + str r0, [sp, #0x24] +_020EA3BC: + mov r5, #0x100 + b _020EA930 +_020EA3C4: + cmp r1, #0 + blt _020EA3D4 + cmp r1, #0x80 + blt _020EA3DC +_020EA3D4: + mov r0, #0 + b _020EA3EC +_020EA3DC: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA3EC: + cmp r0, #0 + moveq r5, #0x1000 + beq _020EA930 + cmp r1, #0x30 + movne r5, #0x400 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov r5, #0x200 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA424: + cmp r1, #0x30 + movne r5, #0x400 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA44C: + cmp r1, #0 + blt _020EA45C + cmp r1, #0x80 + blt _020EA464 +_020EA45C: + mov r0, #0 + b _020EA474 +_020EA464: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA474: + cmp r0, #0 + moveq r5, #0x800 + beq _020EA930 + ldr r0, [sp, #0x20] + sub r2, r1, #0x30 + mov r1, #0xa + mla r0, r1, r0, r2 + ldr r1, _020EAB30 ; =0x00007FFF + str r0, [sp, #0x20] + cmp r0, r1 + ldrgt r0, [sp, #0xd0] + movgt r1, #1 + strgt r1, [r0] + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA4C4: + cmp sl, #0x20 + bgt _020EA514 + bge _020EA7E8 + cmp sl, #8 + bgt _020EA508 + cmp sl, #0 + addge pc, pc, sl, lsl #2 + b _020EA930 +_020EA4E4: ; jump table + b _020EA930 ; case 0 + b _020EA538 ; case 1 + b _020EA588 ; case 2 + b _020EA930 ; case 3 + b _020EA5B0 ; case 4 + b _020EA930 ; case 5 + b _020EA930 ; case 6 + b _020EA930 ; case 7 + b _020EA6C0 ; case 8 +_020EA508: + cmp sl, #0x10 + beq _020EA79C + b _020EA930 +_020EA514: + cmp sl, #0x80 + bgt _020EA52C + bge _020EA890 + cmp sl, #0x40 + beq _020EA830 + b _020EA930 +_020EA52C: + cmp sl, #0x100 + beq _020EA8B8 + b _020EA930 +_020EA538: + mov r1, #0 + add r0, sp, #0x45 + str r0, [sp, #0x14] + strb r1, [r0] + strb r1, [r0, #1] + strb r1, [r0, #2] + strb r1, [r0, #3] + strb r1, [r0, #4] + strb r1, [r0, #5] + strb r1, [r0, #6] + strb r1, [r0, #7] + mov r0, r8 + mov r2, r1 + str r1, [sp, #8] + mov fp, r1 + mov sl, #2 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA588: + cmp r1, #0x30 + movne sl, #4 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA5B0: + cmp r1, #0 + blt _020EA5C0 + cmp r1, #0x80 + blt _020EA5C8 +_020EA5C0: + mov r0, #0 + b _020EA5D8 +_020EA5C8: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #0x400 +_020EA5D8: + cmp r0, #0 + bne _020EA60C + cmp r1, #0x2e + movne sl, #0x10 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov sl, #8 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA60C: + ldr r2, [sp, #8] + mov r0, #0xe + cmp r2, r0 + bhs _020EA6A4 + mov r0, r2 + add r0, r0, #1 + str r0, [sp, #8] + ldr r0, [sp, #0x14] + add r2, fp, fp, lsr #31 + cmp r1, #0 + ldrb r0, [r0, r2, asr #1] + blt _020EA64C + cmp r1, #0x80 + bge _020EA64C + ldr r2, _020EAB28 ; =_0210E484 + ldrb r1, [r2, r1] +_020EA64C: + cmp r1, #0x41 + subge r1, r1, #0x37 + sublt r1, r1, #0x30 + mov r2, fp, lsr #0x1f + and r3, r1, #0xff + rsb r1, r2, fp, lsl #31 + adds r1, r2, r1, ror #31 + moveq r1, r3, lsl #4 + add r2, fp, fp, lsr #31 + orrne r0, r0, r3 + andeq r1, r1, #0xff + orreq r0, r0, r1 + ldr r1, [sp, #0x14] + add fp, fp, #1 + strb r0, [r1, r2, asr #1] + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA6A4: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA6C0: + cmp r1, #0 + blt _020EA6D0 + cmp r1, #0x80 + blt _020EA6D8 +_020EA6D0: + mov r0, #0 + b _020EA6E8 +_020EA6D8: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #0x400 +_020EA6E8: + cmp r0, #0 + moveq sl, #0x10 + beq _020EA930 + ldr r2, [sp, #8] + mov r0, #0xe + cmp r2, r0 + bhs _020EA780 + ldr r0, [sp, #0x14] + add r2, fp, fp, lsr #31 + cmp r1, #0 + ldrb r0, [r0, r2, asr #1] + blt _020EA728 + cmp r1, #0x80 + bge _020EA728 + ldr r2, _020EAB28 ; =_0210E484 + ldrb r1, [r2, r1] +_020EA728: + cmp r1, #0x41 + subge r1, r1, #0x37 + sublt r1, r1, #0x30 + mov r2, fp, lsr #0x1f + and r3, r1, #0xff + rsb r1, r2, fp, lsl #31 + adds r1, r2, r1, ror #31 + moveq r1, r3, lsl #4 + add r2, fp, fp, lsr #31 + orrne r0, r0, r3 + andeq r1, r1, #0xff + orreq r0, r0, r1 + ldr r1, [sp, #0x14] + add fp, fp, #1 + strb r0, [r1, r2, asr #1] + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA780: + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA79C: + cmp r1, #0 + blt _020EA7AC + cmp r1, #0x80 + blt _020EA7B4 +_020EA7AC: + mov r0, r1 + b _020EA7BC +_020EA7B4: + ldr r0, _020EAB28 ; =_0210E484 + ldrb r0, [r0, r1] +_020EA7BC: + cmp r0, #0x50 + movne r5, #0x800 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov sl, #0x20 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA7E8: + cmp r1, #0x2d + moveq r0, #1 + streq r0, [sp, #0xc] + beq _020EA810 + cmp r1, #0x2b + beq _020EA810 + mov r0, r8 + mov r2, #1 + blx sb + sub r4, r4, #1 +_020EA810: + mov sl, #0x40 + add r4, r4, #1 + mov r0, r8 + mov r1, #0 + mov r2, r1 + blx sb + mov r1, r0 + b _020EA930 +_020EA830: + cmp r1, #0 + blt _020EA840 + cmp r1, #0x80 + blt _020EA848 +_020EA840: + mov r0, #0 + b _020EA858 +_020EA848: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA858: + cmp r0, #0 + moveq r5, #0x1000 + beq _020EA930 + cmp r1, #0x30 + movne sl, #0x100 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + mov sl, #0x80 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA890: + cmp r1, #0x30 + movne sl, #0x100 + bne _020EA930 + mov r1, #0 + mov r0, r8 + mov r2, r1 + add r4, r4, #1 + blx sb + mov r1, r0 + b _020EA930 +_020EA8B8: + cmp r1, #0 + blt _020EA8C8 + cmp r1, #0x80 + blt _020EA8D0 +_020EA8C8: + mov r0, #0 + b _020EA8E0 +_020EA8D0: + mov r2, r1, lsl #1 + ldr r0, _020EAB24 ; =_0210E504 + ldrh r0, [r0, r2] + and r0, r0, #8 +_020EA8E0: + cmp r0, #0 + moveq r5, #0x800 + beq _020EA930 + ldr r0, [sp, #0x10] + sub r2, r1, #0x30 + mov r1, #0xa + mla r0, r1, r0, r2 + str r0, [sp, #0x10] + ldr r1, _020EAB30 ; =0x00007FFF + ldr r0, [sp, #0x20] + add r4, r4, #1 + cmp r0, r1 + ldrgt r0, [sp, #0xd0] + movgt r1, #1 + strgt r1, [r0] + mov r1, #0 + mov r0, r8 + mov r2, r1 + blx sb + mov r1, r0 +_020EA930: + ldr r0, [sp] + cmp r4, r0 + bgt _020EA950 + mvn r0, #0 + cmp r1, r0 + beq _020EA950 + tst r5, #0x1800 + beq _020E9C44 +_020EA950: + cmp r5, #0x8000 + beq _020EA96C + ldr r0, _020EAB34 ; =0x00000E2C + tst r5, r0 + moveq r0, #1 + movne r0, #0 + b _020EA990 +_020EA96C: + sub r0, r4, #1 + cmp r0, #2 + ble _020EA984 + ldr r0, _020EAB38 ; =0x0000018E + tst sl, r0 + bne _020EA98C +_020EA984: + mov r0, #1 + b _020EA990 +_020EA98C: + mov r0, #0 +_020EA990: + cmp r0, #0 + movne r2, #0 + ldrne r0, [sp, #4] + bne _020EA9B0 + ldr r0, [sp, #0x2c] + sub r2, r4, #1 + add r2, r2, r0 + ldr r0, [sp, #4] +_020EA9B0: + str r2, [r0] + mov r0, r8 + mov r2, #1 + blx sb + cmp sl, #0 + bne _020EABB4 + ldr r0, [sp, #0x24] + ldrb r2, [sp, #0x84] + cmp r0, #0 + ldrne r0, [sp, #0x20] + rsbne r0, r0, #0 + strne r0, [sp, #0x20] + add r0, sp, #0x85 + add r1, r0, r2 + b _020EA9F8 +_020EA9EC: + ldr r0, [sp, #0x1c] + add r0, r0, #1 + str r0, [sp, #0x1c] +_020EA9F8: + cmp r2, #0 + sub r2, r2, #1 + beq _020EAA10 + ldrb r0, [r1, #-1]! + cmp r0, #0x30 + beq _020EA9EC +_020EAA10: + add r0, r2, #1 + strb r0, [sp, #0x84] + ands r2, r0, #0xff + bne _020EAA34 + add r1, r2, #1 + strb r1, [sp, #0x84] + add r0, sp, #0x85 + mov r1, #0x30 + strb r1, [r0, r2] +_020EAA34: + ldr r1, [sp, #0x20] + ldr r0, [sp, #0x1c] + mov r2, #0x8000 + add r0, r1, r0 + rsb r2, r2, #0 + str r0, [sp, #0x20] + cmp r0, r2 + blt _020EAA5C + cmp r0, r2, lsr #17 + ble _020EAA68 +_020EAA5C: + ldr r0, [sp, #0xd0] + mov r1, #1 + str r1, [r0] +_020EAA68: + ldr r0, [sp, #0xd0] + ldr r0, [r0] + cmp r0, #0 + beq _020EAAC4 + ldr r0, [sp, #0x24] + cmp r0, #0 + movne r0, #0 + addne sp, sp, #0xa8 + movne r1, r0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #0x28] + cmp r0, #0 + ldreq r1, _020EAB3C ; =_021110F0 + addeq sp, sp, #0xa8 + ldmeqia r1, {r0, r1} + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, _020EAB3C ; =_021110F0 + mov r0, #0 + ldmia r1, {r2, r3} + mov r1, r0 + bl _dsub + add sp, sp, #0xa8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EAAC4: + ldr r1, [sp, #0x20] + add r0, sp, #0x80 + strh r1, [sp, #0x82] + bl __dec2num + mov r4, r0 + mov r6, r1 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r6 + bl _dneq + beq _020EAB44 + mov r0, r4 + mov r1, r6 + mov r2, #0 + mov r3, #0x100000 + bl _dls + bhs _020EAB44 + ldr r0, [sp, #0xd0] + mov r1, #1 + str r1, [r0] + b _020EAB70 + .align 2, 0 +_020EAB1C: .word _0210E631 +_020EAB20: .word _0210E62C +_020EAB24: .word _0210E504 +_020EAB28: .word _0210E484 +_020EAB2C: .word _021110E8 +_020EAB30: .word 0x00007FFF +_020EAB34: .word 0x00000E2C +_020EAB38: .word 0x0000018E +_020EAB3C: .word _021110F0 +_020EAB40: .word 0x7FEFFFFF +_020EAB44: + ldr r3, _020EAB40 ; =0x7FEFFFFF + mov r0, r4 + mov r1, r6 + mvn r2, #0 + bl _dgr + bls _020EAB70 + ldr r0, [sp, #0xd0] + mov r2, #1 + ldr r1, _020EAB3C ; =_021110F0 + str r2, [r0] + ldmia r1, {r4, r6} +_020EAB70: + ldr r0, [sp, #0x28] + cmp r0, #0 + beq _020EABA4 + ldr r0, _020EAB34 ; =0x00000E2C + tst r5, r0 + beq _020EABA4 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r6 + bl _dsub + mov r4, r0 + mov r6, r1 +_020EABA4: + add sp, sp, #0xa8 + mov r0, r4 + mov r1, r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EABB4: + ldr r0, [sp, #0xc] + add r4, sp, #0x38 + cmp r0, #0 + ldrne r0, [sp, #0x10] + ldrb r3, [sp, #0x45] + rsbne r0, r0, #0 + strne r0, [sp, #0x10] + ldr r1, [sp, #0x10] + ldr r0, [sp, #8] + mov r2, #0 + add r0, r1, r0, lsl #2 + str r0, [sp, #0x10] + mov r1, #0x80 + b _020EABFC +_020EABEC: + ldr r0, [sp, #0x10] + add r2, r2, #1 + sub r0, r0, #1 + str r0, [sp, #0x10] +_020EABFC: + cmp r2, #4 + bhs _020EAC0C + tst r3, r1, asr r2 + beq _020EABEC +_020EAC0C: + adds r5, r2, #1 + beq _020EAC58 + add r0, sp, #0x4c + add r3, sp, #0x45 + str r0, [sp, #0x14] + mov r1, #0 + cmp r0, r3 + blo _020EAC58 + rsb r6, r5, #8 +_020EAC30: + ldr r0, [sp, #0x14] + ldrb r0, [r0] + orr r2, r1, r0, lsl r5 + mov r1, r0, asr r6 + ldr r0, [sp, #0x14] + and r1, r1, #0xff + strb r2, [r0], #-1 + str r0, [sp, #0x14] + cmp r0, r3 + bhs _020EAC30 +_020EAC58: + mov r2, #0 + mov r6, r2 + strb r2, [r4] + strb r2, [r4, #1] + strb r2, [r4, #2] + strb r2, [r4, #3] + strb r2, [r4, #4] + strb r2, [r4, #5] + strb r2, [r4, #6] + strb r2, [r4, #7] + mov r3, #0xc + mov r7, #1 + mov r0, #0xff + add r1, sp, #0x45 +_020EAC90: + add r5, r2, #8 + cmp r5, #0x34 + ldrb r5, [r1, r6] + rsbhi r8, r2, #0x34 + and fp, r3, #7 + andhi r5, r5, r0, lsl r8 + andhi r5, r5, #0xff + mov r8, r5, asr fp + and sb, r8, #0xff + ldrb sl, [r4, r7] + rsb r8, fp, #8 + mov r5, r5, lsl r8 + orr sb, sl, sb + strb sb, [r4, r7] + add r7, r7, #1 + add r2, r2, #8 + ldrb r8, [r4, r7] + and r5, r5, #0xff + cmp r2, #0x34 + orr r5, r8, r5 + strb r5, [r4, r7] + add r3, r3, #8 + add r6, r6, #1 + blo _020EAC90 + ldr r0, [sp, #0x10] + mov r1, #0x800 + add r0, r0, #0xfe + add r2, r0, #0x300 + rsb r1, r1, #0 + tst r2, r1 + beq _020EAD28 + ldr r2, [sp, #0xd0] + mov r3, #1 + mov r0, #0 + add sp, sp, #0xa8 + mov r1, r0 + str r3, [r2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EAD28: + ldrb r0, [r4, #1] + mov r2, r2, lsl #0x15 + ldrb r1, [r4] + orr r0, r0, r2, lsr #17 + strb r0, [r4, #1] + ldr r0, [sp, #0x28] + orr r1, r1, r2, lsr #25 + cmp r0, #0 + andne r0, r1, #0xff + strb r1, [r4] + orrne r0, r0, #0x80 + strneb r0, [r4] + mov r3, #0 +_020EAD5C: + rsb r1, r3, #7 + ldrb r2, [r4, r3] + ldrb r0, [r4, r1] + strb r0, [r4, r3] + add r3, r3, #1 + strb r2, [r4, r1] + cmp r3, #4 + blt _020EAD5C + ldmia r4, {r0, r1} + add sp, sp, #0xa8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end __strtold + + arm_func_start strtold +strtold: ; 0x020EAD88 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x14 + mov r7, r0 + mov r0, #0 + mov r6, r1 + str r0, [sp, #8] + add r4, sp, #0xc + str r7, [sp, #4] + ldr r1, _020EAE5C ; =__StringRead + add r2, sp, #4 + add r3, sp, #0x10 + sub r0, r0, #0x80000001 + str r4, [sp] + bl __strtold + mov r5, r1 + mov r4, r0 + cmp r6, #0 + ldrne r0, [sp, #0x10] + mov r1, r5 + addne r0, r7, r0 + strne r0, [r6] + mov r0, r4 + bl fabs + ldr r2, [sp, #0xc] + mov r6, r0 + mov r7, r1 + cmp r2, #0 + bne _020EAE40 + mov r0, #0 + mov r1, r0 + mov r2, r4 + mov r3, r5 + bl _dneq + beq _020EAE4C + mov r0, r6 + mov r1, r7 + mov r2, #0 + mov r3, #0x100000 + bl _dls + blo _020EAE40 + ldr r3, _020EAE60 ; =0x7FEFFFFF + mov r0, r6 + mov r1, r7 + mvn r2, #0 + bl _dgr + bls _020EAE4C +_020EAE40: + ldr r0, _020EAE64 ; =_021E58C0 + mov r1, #0x22 + str r1, [r0] +_020EAE4C: + mov r0, r4 + mov r1, r5 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020EAE5C: .word __StringRead +_020EAE60: .word 0x7FEFFFFF +_020EAE64: .word _021E58C0 + arm_func_end strtold + + arm_func_start atof +atof: ; 0x020EAE68 + ldr ip, _020EAE74 ; =strtold + mov r1, #0 + bx ip + .align 2, 0 +_020EAE74: .word strtold + arm_func_end atof + + arm_func_start __strtoul +__strtoul: ; 0x020EAE78 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, [sp, #0x38] + movs sb, r0 + ldr r0, [sp, #0x34] + str r4, [sp, #0x38] + mov r4, #0 + str r0, [sp, #0x34] + ldr r0, [sp, #0x38] + str r1, [sp] + str r4, [r0] + mov r0, r4 + str r0, [sp, #4] + ldr r0, [sp, #0x34] + mov r1, r4 + str r1, [r0] + ldr r0, [sp, #0x30] + str r4, [sp, #8] + mov r8, r2 + mov r7, r3 + mov r5, r4 + mov sl, r4 + str r0, [sp, #0x30] + mov r4, #1 + bmi _020EAEF8 + cmp sb, #1 + beq _020EAEF8 + cmp sb, #0x24 + bgt _020EAEF8 + ldr r0, [sp] + cmp r0, #1 + bge _020EAF00 +_020EAEF8: + mov r4, #0x40 + b _020EAF1C +_020EAF00: + ldr r1, [sp, #8] + mov r0, r7 + mov r3, r1 + mov r2, r1 + add r5, r3, #1 + blx r8 + mov r6, r0 +_020EAF1C: + cmp sb, #0 + beq _020EAF34 + mov r1, sb + mvn r0, #0 + bl _u32_div_f + str r0, [sp, #4] +_020EAF34: + mvn fp, #0 + b _020EB1F4 +_020EAF3C: + cmp r4, #8 + bgt _020EAF74 + cmp r4, #0 + addge pc, pc, r4, lsl #2 + b _020EB1F4 +_020EAF50: ; jump table + b _020EB1F4 ; case 0 + b _020EAF80 ; case 1 + b _020EB02C ; case 2 + b _020EB1F4 ; case 3 + b _020EB068 ; case 4 + b _020EB1F4 ; case 5 + b _020EB1F4 ; case 6 + b _020EB1F4 ; case 7 + b _020EB0A8 ; case 8 +_020EAF74: + cmp r4, #0x10 + beq _020EB0A8 + b _020EB1F4 +_020EAF80: + cmp r6, #0 + blt _020EAF90 + cmp r6, #0x80 + blt _020EAF98 +_020EAF90: + mov r0, #0 + b _020EAFA8 +_020EAF98: + ldr r0, _020EB258 ; =_0210E504 + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x100 +_020EAFA8: + cmp r0, #0 + beq _020EAFD4 + mov r1, #0 + mov r0, r7 + mov r2, r1 + blx r8 + mov r6, r0 + ldr r0, [sp, #8] + add r0, r0, #1 + str r0, [sp, #8] + b _020EB1F4 +_020EAFD4: + cmp r6, #0x2b + bne _020EAFF8 + mov r1, #0 + mov r0, r7 + mov r2, r1 + add r5, r5, #1 + blx r8 + mov r6, r0 + b _020EB024 +_020EAFF8: + cmp r6, #0x2d + bne _020EB024 + mov r1, #0 + mov r0, r7 + mov r2, r1 + add r5, r5, #1 + blx r8 + mov r6, r0 + ldr r0, [sp, #0x34] + mov r1, #1 + str r1, [r0] +_020EB024: + mov r4, #2 + b _020EB1F4 +_020EB02C: + cmp sb, #0 + cmpne sb, #0x10 + bne _020EB060 + cmp r6, #0x30 + bne _020EB060 + mov r1, #0 + mov r0, r7 + mov r2, r1 + mov r4, #4 + add r5, r5, #1 + blx r8 + mov r6, r0 + b _020EB1F4 +_020EB060: + mov r4, #8 + b _020EB1F4 +_020EB068: + cmp r6, #0x58 + cmpne r6, #0x78 + bne _020EB098 + mov r1, #0 + mov r0, r7 + mov r2, r1 + mov sb, #0x10 + mov r4, #8 + add r5, r5, #1 + blx r8 + mov r6, r0 + b _020EB1F4 +_020EB098: + cmp sb, #0 + moveq sb, #8 + mov r4, #0x10 + b _020EB1F4 +_020EB0A8: + ldr r0, [sp, #4] + cmp sb, #0 + moveq sb, #0xa + cmp r0, #0 + bne _020EB0CC + mov r0, fp + mov r1, sb + bl _u32_div_f + str r0, [sp, #4] +_020EB0CC: + cmp r6, #0 + blt _020EB0DC + cmp r6, #0x80 + blt _020EB0E4 +_020EB0DC: + mov r0, #0 + b _020EB0F4 +_020EB0E4: + ldr r0, _020EB258 ; =_0210E504 + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #8 +_020EB0F4: + cmp r0, #0 + beq _020EB11C + sub r6, r6, #0x30 + cmp r6, sb + blt _020EB1A4 + cmp r4, #0x10 + moveq r4, #0x20 + movne r4, #0x40 + add r6, r6, #0x30 + b _020EB1F4 +_020EB11C: + cmp r6, #0 + blt _020EB12C + cmp r6, #0x80 + blt _020EB134 +_020EB12C: + mov r0, #0 + b _020EB144 +_020EB134: + ldr r0, _020EB258 ; =_0210E504 + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #1 +_020EB144: + cmp r0, #0 + beq _020EB178 + cmp r6, #0 + blt _020EB15C + cmp r6, #0x80 + blt _020EB164 +_020EB15C: + mov r0, r6 + b _020EB16C +_020EB164: + ldr r0, _020EB25C ; =_0210E484 + ldrb r0, [r0, r6] +_020EB16C: + sub r0, r0, #0x37 + cmp r0, sb + blt _020EB188 +_020EB178: + cmp r4, #0x10 + moveq r4, #0x20 + movne r4, #0x40 + b _020EB1F4 +_020EB188: + cmp r6, #0 + blt _020EB1A0 + cmp r6, #0x80 + bge _020EB1A0 + ldr r0, _020EB25C ; =_0210E484 + ldrb r6, [r0, r6] +_020EB1A0: + sub r6, r6, #0x37 +_020EB1A4: + ldr r0, [sp, #4] + mov r4, #0x10 + cmp sl, r0 + ldrhi r0, [sp, #0x38] + movhi r1, #1 + strhi r1, [r0] + mul r0, sl, sb + mov sl, r0 + sub r0, fp, r0 + cmp r6, r0 + ldrhi r0, [sp, #0x38] + movhi r1, #1 + strhi r1, [r0] + mov r1, #0 + mov r0, r7 + mov r2, r1 + add sl, sl, r6 + add r5, r5, #1 + blx r8 + mov r6, r0 +_020EB1F4: + ldr r0, [sp] + cmp r5, r0 + bgt _020EB210 + cmp r6, fp + beq _020EB210 + tst r4, #0x60 + beq _020EAF3C +_020EB210: + tst r4, #0x34 + bne _020EB228 + ldr r0, [sp, #0x30] + mov sl, #0 + str sl, [r0] + b _020EB23C +_020EB228: + ldr r0, [sp, #8] + sub r1, r5, #1 + add r1, r1, r0 + ldr r0, [sp, #0x30] + str r1, [r0] +_020EB23C: + mov r0, r7 + mov r1, r6 + mov r2, #1 + blx r8 + mov r0, sl + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020EB258: .word _0210E504 +_020EB25C: .word _0210E484 + arm_func_end __strtoul + + arm_func_start __strtoull +__strtoull: ; 0x020EB260 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x20 + ldr r4, [sp, #0x48] + movs sb, r0 + ldr r0, [sp, #0x44] + str r4, [sp, #0x48] + mov r4, #0 + str r0, [sp, #0x44] + ldr r0, [sp, #0x48] + str r1, [sp] + str r4, [r0] + mov r0, r4 + str r0, [sp, #0x10] + str r0, [sp, #0x14] + str r0, [sp, #0xc] + ldr r0, [sp, #0x44] + mov r1, r4 + str r1, [r0] + ldr r0, [sp, #0x40] + str r4, [sp, #0x18] + mov sl, r2 + str r3, [sp, #4] + mov r6, r4 + mov r7, r4 + str r0, [sp, #0x40] + mov r5, #1 + bmi _020EB2E8 + cmp sb, #1 + beq _020EB2E8 + cmp sb, #0x24 + bgt _020EB2E8 + ldr r0, [sp] + cmp r0, #1 + bge _020EB2F0 +_020EB2E8: + mov r5, #0x40 + b _020EB304 +_020EB2F0: + mov r0, r3 + mov r2, r4 + add r6, r1, #1 + blx sl + mov r8, r0 +_020EB304: + cmp sb, #0 + beq _020EB328 + mvn r0, #0 + mov r1, r0 + mov r3, sb, asr #0x1f + mov r2, sb + bl _ll_udiv + mov r7, r0 + str r1, [sp, #0xc] +_020EB328: + mvn r0, #0 + str r0, [sp, #0x1c] + mov r4, #0 + b _020EB650 +_020EB338: + cmp r5, #8 + bgt _020EB370 + cmp r5, #0 + addge pc, pc, r5, lsl #2 + b _020EB650 +_020EB34C: ; jump table + b _020EB650 ; case 0 + b _020EB37C ; case 1 + b _020EB428 ; case 2 + b _020EB650 ; case 3 + b _020EB464 ; case 4 + b _020EB650 ; case 5 + b _020EB650 ; case 6 + b _020EB650 ; case 7 + b _020EB4A4 ; case 8 +_020EB370: + cmp r5, #0x10 + beq _020EB4A4 + b _020EB650 +_020EB37C: + cmp r8, #0 + blt _020EB38C + cmp r8, #0x80 + blt _020EB394 +_020EB38C: + mov r0, #0 + b _020EB3A4 +_020EB394: + ldr r0, _020EB6C4 ; =_0210E504 + mov r1, r8, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x100 +_020EB3A4: + cmp r0, #0 + beq _020EB3D0 + mov r1, #0 + ldr r0, [sp, #4] + mov r2, r1 + blx sl + mov r8, r0 + ldr r0, [sp, #0x18] + add r0, r0, #1 + str r0, [sp, #0x18] + b _020EB650 +_020EB3D0: + cmp r8, #0x2b + bne _020EB3F4 + mov r1, #0 + ldr r0, [sp, #4] + mov r2, r1 + add r6, r6, #1 + blx sl + mov r8, r0 + b _020EB420 +_020EB3F4: + cmp r8, #0x2d + bne _020EB420 + mov r1, #0 + ldr r0, [sp, #4] + mov r2, r1 + add r6, r6, #1 + blx sl + mov r8, r0 + ldr r0, [sp, #0x44] + mov r1, #1 + str r1, [r0] +_020EB420: + mov r5, #2 + b _020EB650 +_020EB428: + cmp sb, #0 + cmpne sb, #0x10 + bne _020EB45C + cmp r8, #0x30 + bne _020EB45C + mov r1, #0 + ldr r0, [sp, #4] + mov r2, r1 + mov r5, #4 + add r6, r6, #1 + blx sl + mov r8, r0 + b _020EB650 +_020EB45C: + mov r5, #8 + b _020EB650 +_020EB464: + cmp r8, #0x58 + cmpne r8, #0x78 + bne _020EB494 + mov r1, #0 + ldr r0, [sp, #4] + mov r2, r1 + mov sb, #0x10 + mov r5, #8 + add r6, r6, #1 + blx sl + mov r8, r0 + b _020EB650 +_020EB494: + cmp sb, #0 + moveq sb, #8 + mov r5, #0x10 + b _020EB650 +_020EB4A4: + ldr r1, [sp, #0xc] + mov r0, #0 + cmp sb, #0 + moveq sb, #0xa + cmp r1, r0 + cmpeq r7, r4 + bne _020EB4DC + ldr r0, [sp, #0x1c] + mov r3, sb, asr #0x1f + mov r1, r0 + mov r2, sb + bl _ll_udiv + mov r7, r0 + str r1, [sp, #0xc] +_020EB4DC: + cmp r8, #0 + blt _020EB4EC + cmp r8, #0x80 + blt _020EB4F4 +_020EB4EC: + mov r0, #0 + b _020EB504 +_020EB4F4: + ldr r0, _020EB6C4 ; =_0210E504 + mov r1, r8, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #8 +_020EB504: + cmp r0, #0 + beq _020EB52C + sub r8, r8, #0x30 + cmp r8, sb + blt _020EB5B4 + cmp r5, #0x10 + moveq r5, #0x20 + movne r5, #0x40 + add r8, r8, #0x30 + b _020EB650 +_020EB52C: + cmp r8, #0 + blt _020EB53C + cmp r8, #0x80 + blt _020EB544 +_020EB53C: + mov r0, #0 + b _020EB554 +_020EB544: + ldr r0, _020EB6C4 ; =_0210E504 + mov r1, r8, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #1 +_020EB554: + cmp r0, #0 + beq _020EB588 + cmp r8, #0 + blt _020EB56C + cmp r8, #0x80 + blt _020EB574 +_020EB56C: + mov r0, r8 + b _020EB57C +_020EB574: + ldr r0, _020EB6C8 ; =_0210E484 + ldrb r0, [r0, r8] +_020EB57C: + sub r0, r0, #0x37 + cmp r0, sb + blt _020EB598 +_020EB588: + cmp r5, #0x10 + moveq r5, #0x20 + movne r5, #0x40 + b _020EB650 +_020EB598: + cmp r8, #0 + blt _020EB5B0 + cmp r8, #0x80 + bge _020EB5B0 + ldr r0, _020EB6C8 ; =_0210E484 + ldrb r8, [r0, r8] +_020EB5B0: + sub r8, r8, #0x37 +_020EB5B4: + ldr r1, [sp, #0x14] + ldr r0, [sp, #0xc] + ldr r3, [sp, #0x10] + cmp r1, r0 + ldr r0, [sp, #0x10] + mov r5, sb, asr #0x1f + cmpeq r0, r7 + ldrhi r0, [sp, #0x48] + movhi r1, #1 + strhi r1, [r0] + umull r0, r1, r3, sb + mla r1, r3, r5, r1 + ldr r3, [sp, #0x14] + str r0, [sp, #0x10] + mla r1, r3, sb, r1 + ldr r3, [sp, #0x1c] + mov r2, r8, asr #0x1f + subs r3, r3, r0 + ldr r0, [sp, #0x1c] + str r1, [sp, #0x14] + sbc r0, r0, r1 + cmp r2, r0 + cmpeq r8, r3 + ldrhi r0, [sp, #0x48] + movhi r1, #1 + strhi r1, [r0] + ldr r0, [sp, #0x10] + mov r1, #0 + adds r0, r0, r8 + str r0, [sp, #0x10] + ldr r0, [sp, #0x14] + mov r5, #0x10 + adc r0, r0, r2 + str r0, [sp, #0x14] + ldr r0, [sp, #4] + mov r2, r1 + add r6, r6, #1 + blx sl + mov r8, r0 +_020EB650: + ldr r0, [sp] + cmp r6, r0 + bgt _020EB670 + ldr r0, [sp, #0x1c] + cmp r8, r0 + beq _020EB670 + tst r5, #0x60 + beq _020EB338 +_020EB670: + tst r5, #0x34 + bne _020EB690 + mov r0, #0 + str r0, [sp, #0x10] + str r0, [sp, #0x14] + mov r1, r0 + ldr r0, [sp, #0x40] + b _020EB6A0 +_020EB690: + ldr r0, [sp, #0x18] + sub r1, r6, #1 + add r1, r1, r0 + ldr r0, [sp, #0x40] +_020EB6A0: + str r1, [r0] + ldr r0, [sp, #4] + mov r1, r8 + mov r2, #1 + blx sl + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + add sp, sp, #0x20 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020EB6C4: .word _0210E504 +_020EB6C8: .word _0210E484 + arm_func_end __strtoull + + arm_func_start strtoul +strtoul: ; 0x020EB6CC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r5, r0 + mov lr, #0 + mov r0, r2 + mov r4, r1 + add r2, sp, #0x1c + str r5, [sp, #0xc] + str lr, [sp, #0x10] + str r2, [sp] + add r1, sp, #0x18 + str r1, [sp, #4] + add ip, sp, #0x14 + ldr r2, _020EB75C ; =__StringRead + add r3, sp, #0xc + sub r1, lr, #0x80000001 + str ip, [sp, #8] + bl __strtoul + cmp r4, #0 + ldrne r1, [sp, #0x1c] + addne r1, r5, r1 + strne r1, [r4] + ldr r1, [sp, #0x14] + cmp r1, #0 + beq _020EB748 + ldr r0, _020EB760 ; =_021E58C0 + mov r1, #0x22 + str r1, [r0] + add sp, sp, #0x20 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020EB748: + ldr r1, [sp, #0x18] + cmp r1, #0 + rsbne r0, r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020EB75C: .word __StringRead +_020EB760: .word _021E58C0 + arm_func_end strtoul + + arm_func_start strtol +strtol: ; 0x020EB764 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x20 + mov r5, r0 + mov lr, #0 + mov r0, r2 + mov r4, r1 + add r2, sp, #0x1c + str r5, [sp, #0xc] + str lr, [sp, #0x10] + str r2, [sp] + add r1, sp, #0x18 + str r1, [sp, #4] + add ip, sp, #0x14 + ldr r2, _020EB824 ; =__StringRead + add r3, sp, #0xc + sub r1, lr, #0x80000001 + str ip, [sp, #8] + bl __strtoul + cmp r4, #0 + ldrne r1, [sp, #0x1c] + addne r1, r5, r1 + strne r1, [r4] + ldr r1, [sp, #0x14] + cmp r1, #0 + bne _020EB7F0 + ldr r2, [sp, #0x18] + cmp r2, #0 + bne _020EB7E0 + mvn r1, #0x80000000 + cmp r0, r1 + bhi _020EB7F0 +_020EB7E0: + cmp r2, #0 + beq _020EB814 + cmp r0, #0x80000000 + bls _020EB814 +_020EB7F0: + ldr r0, [sp, #0x18] + ldr r1, _020EB828 ; =_021E58C0 + mov r2, #0x22 + cmp r0, #0 + movne r0, #0x80000000 + str r2, [r1] + add sp, sp, #0x20 + mvneq r0, #0x80000000 + ldmia sp!, {r3, r4, r5, pc} +_020EB814: + cmp r2, #0 + rsbne r0, r0, #0 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020EB824: .word __StringRead +_020EB828: .word _021E58C0 + arm_func_end strtol + + arm_func_start atoi +atoi: ; 0x020EB82C + ldr ip, _020EB83C ; =strtol + mov r1, #0 + mov r2, #0xa + bx ip + .align 2, 0 +_020EB83C: .word strtol + arm_func_end atoi + + arm_func_start fwide +fwide: ; 0x020EB840 + cmp r0, #0 + beq _020EB858 + ldr r3, [r0, #4] + mov r2, r3, lsl #0x16 + movs r2, r2, lsr #0x1d + bne _020EB860 +_020EB858: + mov r0, #0 + bx lr +_020EB860: + mov r2, r3, lsl #0x14 + movs r2, r2, lsr #0x1e + beq _020EB880 + cmp r2, #1 + beq _020EB8A8 + cmp r2, #2 + moveq r1, #1 + b _020EB8AC +_020EB880: + cmp r1, #0 + ble _020EB898 + bic r2, r3, #0xc00 + orr r2, r2, #0x800 + str r2, [r0, #4] + b _020EB8AC +_020EB898: + biclt r2, r3, #0xc00 + orrlt r2, r2, #0x400 + strlt r2, [r0, #4] + b _020EB8AC +_020EB8A8: + mvn r1, #0 +_020EB8AC: + mov r0, r1 + bx lr + arm_func_end fwide + + arm_func_start wmemcpy +wmemcpy: ; 0x020EB8B4 + ldr ip, _020EB8C0 ; =memcpy + mov r2, r2, lsl #1 + bx ip + .align 2, 0 +_020EB8C0: .word memcpy + arm_func_end wmemcpy + + arm_func_start wmemchr +wmemchr: ; 0x020EB8C4 + cmp r2, #0 + beq _020EB8E4 +_020EB8CC: + ldrh r3, [r0] + cmp r3, r1 + bxeq lr + add r0, r0, #2 + subs r2, r2, #1 + bne _020EB8CC +_020EB8E4: + mov r0, #0 + bx lr + arm_func_end wmemchr + + arm_func_start parse_format__wprintf +parse_format__wprintf: ; 0x020EB8EC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldrh r3, [r0, #2] + mov r4, #0 + mov r5, #1 + mov lr, r2 + strb r5, [sp] + strb r4, [sp, #1] + strb r4, [sp, #2] + strb r4, [sp, #3] + strb r4, [sp, #4] + str r4, [sp, #8] + str r4, [sp, #0xc] + cmp r3, #0x25 + add ip, r0, #2 + bne _020EB948 + add r0, sp, #0 + strh r3, [sp, #6] + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add sp, sp, #0x10 + add r0, ip, #2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020EB948: + mov r2, #2 + mov r0, r4 + mov r5, r2 + mov r6, r4 + mov r7, #1 +_020EB95C: + mov r8, r7 + cmp r3, #0x2b + bgt _020EB98C + bge _020EB9B4 + cmp r3, #0x23 + bgt _020EB9E4 + cmp r3, #0x20 + blt _020EB9E4 + beq _020EB9BC + cmp r3, #0x23 + beq _020EB9CC + b _020EB9E4 +_020EB98C: + cmp r3, #0x30 + bgt _020EB9E4 + cmp r3, #0x2d + blt _020EB9E4 + beq _020EB9AC + cmp r3, #0x30 + beq _020EB9D4 + b _020EB9E4 +_020EB9AC: + strb r6, [sp] + b _020EB9E8 +_020EB9B4: + strb r7, [sp, #1] + b _020EB9E8 +_020EB9BC: + ldrb r4, [sp, #1] + cmp r4, #1 + strneb r5, [sp, #1] + b _020EB9E8 +_020EB9CC: + strb r7, [sp, #3] + b _020EB9E8 +_020EB9D4: + ldrb r4, [sp] + cmp r4, #0 + strneb r2, [sp] + b _020EB9E8 +_020EB9E4: + mov r8, r0 +_020EB9E8: + cmp r8, #0 + ldrneh r3, [ip, #2]! + bne _020EB95C + cmp r3, #0x2a + bne _020EBA30 + ldr r0, [r1] + add r0, r0, #4 + str r0, [r1] + ldr r0, [r0, #-4] + str r0, [sp, #8] + cmp r0, #0 + bge _020EBA28 + rsb r0, r0, #0 + mov r2, #0 + strb r2, [sp] + str r0, [sp, #8] +_020EBA28: + ldrh r3, [ip, #2]! + b _020EBA74 +_020EBA30: + mov r2, #0 + ldr r5, _020EBE58 ; =_0210E73C + mov r0, #0xa + b _020EBA54 +_020EBA40: + ldr r4, [sp, #8] + sub r3, r3, #0x30 + mla r6, r4, r0, r3 + ldrh r3, [ip, #2]! + str r6, [sp, #8] +_020EBA54: + cmp r3, #0x80 + movhs r4, r2 + bhs _020EBA6C + mov r4, r3, lsl #1 + ldrh r4, [r5, r4] + and r4, r4, #8 +_020EBA6C: + cmp r4, #0 + bne _020EBA40 +_020EBA74: + ldr r2, [sp, #8] + ldr r0, _020EBE5C ; =0x000001FD + cmp r2, r0 + ble _020EBAA4 + ldr r1, _020EBE60 ; =0x0000FFFF + add r0, sp, #0 + strh r1, [sp, #6] + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add sp, sp, #0x10 + add r0, ip, #2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020EBAA4: + cmp r3, #0x2e + bne _020EBB2C + ldrh r3, [ip, #2]! + mov r0, #1 + strb r0, [sp, #2] + cmp r3, #0x2a + bne _020EBAE8 + ldr r0, [r1] + add r0, r0, #4 + str r0, [r1] + ldr r0, [r0, #-4] + ldrh r3, [ip, #2]! + str r0, [sp, #0xc] + cmp r0, #0 + movlt r0, #0 + strltb r0, [sp, #2] + b _020EBB2C +_020EBAE8: + mov r1, #0 + ldr r4, _020EBE58 ; =_0210E73C + mov r0, #0xa + b _020EBB0C +_020EBAF8: + ldr r2, [sp, #0xc] + sub r3, r3, #0x30 + mla r5, r2, r0, r3 + ldrh r3, [ip, #2]! + str r5, [sp, #0xc] +_020EBB0C: + cmp r3, #0x80 + movhs r2, r1 + bhs _020EBB24 + mov r2, r3, lsl #1 + ldrh r2, [r4, r2] + and r2, r2, #8 +_020EBB24: + cmp r2, #0 + bne _020EBAF8 +_020EBB2C: + cmp r3, #0x6c + mov r0, #1 + bgt _020EBB64 + cmp r3, #0x68 + blt _020EBB58 + beq _020EBB80 + cmp r3, #0x6a + beq _020EBBCC + cmp r3, #0x6c + beq _020EBB9C + b _020EBBF0 +_020EBB58: + cmp r3, #0x4c + beq _020EBBC0 + b _020EBBF0 +_020EBB64: + cmp r3, #0x74 + bgt _020EBB74 + beq _020EBBD8 + b _020EBBF0 +_020EBB74: + cmp r3, #0x7a + beq _020EBBE4 + b _020EBBF0 +_020EBB80: + ldrh r1, [ip, #2] + mov r2, #2 + strb r2, [sp, #4] + cmp r1, #0x68 + streqb r0, [sp, #4] + ldreqh r3, [ip, #2]! + b _020EBBF4 +_020EBB9C: + ldrh r1, [ip, #2] + mov r2, #3 + strb r2, [sp, #4] + cmp r1, #0x6c + bne _020EBBF4 + mov r1, #4 + strb r1, [sp, #4] + ldrh r3, [ip, #2]! + b _020EBBF4 +_020EBBC0: + mov r1, #9 + strb r1, [sp, #4] + b _020EBBF4 +_020EBBCC: + mov r1, #6 + strb r1, [sp, #4] + b _020EBBF4 +_020EBBD8: + mov r1, #8 + strb r1, [sp, #4] + b _020EBBF4 +_020EBBE4: + mov r1, #7 + strb r1, [sp, #4] + b _020EBBF4 +_020EBBF0: + mov r0, #0 +_020EBBF4: + cmp r0, #0 + ldrneh r3, [ip, #2]! + strh r3, [sp, #6] + cmp r3, #0x61 + bgt _020EBC48 + bge _020EBD2C + cmp r3, #0x47 + bgt _020EBC3C + subs r0, r3, #0x41 + addpl pc, pc, r0, lsl #2 + b _020EBE38 +_020EBC20: ; jump table + b _020EBD2C ; case 0 + b _020EBE38 ; case 1 + b _020EBE38 ; case 2 + b _020EBE38 ; case 3 + b _020EBD74 ; case 4 + b _020EBCF4 ; case 5 + b _020EBD64 ; case 6 +_020EBC3C: + cmp r3, #0x58 + beq _020EBCBC + b _020EBE38 +_020EBC48: + cmp r3, #0x63 + bgt _020EBC58 + beq _020EBDD4 + b _020EBE38 +_020EBC58: + sub r0, r3, #0x64 + cmp r0, #0x14 + addls pc, pc, r0, lsl #2 + b _020EBE38 +_020EBC68: ; jump table + b _020EBCBC ; case 0 + b _020EBD74 ; case 1 + b _020EBCF4 ; case 2 + b _020EBD64 ; case 3 + b _020EBE38 ; case 4 + b _020EBCBC ; case 5 + b _020EBE38 ; case 6 + b _020EBE38 ; case 7 + b _020EBE38 ; case 8 + b _020EBE38 ; case 9 + b _020EBE24 ; case 10 + b _020EBCBC ; case 11 + b _020EBDB0 ; case 12 + b _020EBE38 ; case 13 + b _020EBE38 ; case 14 + b _020EBE00 ; case 15 + b _020EBE38 ; case 16 + b _020EBCBC ; case 17 + b _020EBE38 ; case 18 + b _020EBE38 ; case 19 + b _020EBCBC ; case 20 +_020EBCBC: + ldrb r0, [sp, #4] + cmp r0, #9 + moveq r0, #4 + streqb r0, [sp, #4] + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] + beq _020EBE40 + ldrb r0, [sp] + cmp r0, #2 + moveq r0, #1 + streqb r0, [sp] + b _020EBE40 +_020EBCF4: + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + ldreq r0, _020EBE60 ; =0x0000FFFF + streqh r0, [sp, #6] + beq _020EBE40 + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #6 + streq r0, [sp, #0xc] + b _020EBE40 +_020EBD2C: + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #0xd + streq r0, [sp, #0xc] + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + cmpne r0, #1 + ldreq r0, _020EBE60 ; =0x0000FFFF + streqh r0, [sp, #6] + b _020EBE40 +_020EBD64: + ldr r0, [sp, #0xc] + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] +_020EBD74: + ldrb r0, [sp, #4] + cmp r0, #2 + cmpne r0, #6 + cmpne r0, #7 + cmpne r0, #8 + cmpne r0, #4 + cmpne r0, #1 + ldreq r0, _020EBE60 ; =0x0000FFFF + streqh r0, [sp, #6] + beq _020EBE40 + ldrb r0, [sp, #2] + cmp r0, #0 + moveq r0, #6 + streq r0, [sp, #0xc] + b _020EBE40 +_020EBDB0: + mov r3, #3 + mov r2, #1 + mov r1, #0x78 + mov r0, #8 + strb r3, [sp, #4] + strb r2, [sp, #3] + strh r1, [sp, #6] + str r0, [sp, #0xc] + b _020EBE40 +_020EBDD4: + ldrb r1, [sp, #4] + cmp r1, #3 + moveq r0, #5 + streqb r0, [sp, #4] + beq _020EBE40 + ldrb r0, [sp, #2] + cmp r0, #0 + cmpeq r1, #0 + ldrne r0, _020EBE60 ; =0x0000FFFF + strneh r0, [sp, #6] + b _020EBE40 +_020EBE00: + ldrb r0, [sp, #4] + cmp r0, #3 + moveq r0, #5 + streqb r0, [sp, #4] + beq _020EBE40 + cmp r0, #0 + ldrne r0, _020EBE60 ; =0x0000FFFF + strneh r0, [sp, #6] + b _020EBE40 +_020EBE24: + ldrb r0, [sp, #4] + cmp r0, #9 + moveq r0, #4 + streqb r0, [sp, #4] + b _020EBE40 +_020EBE38: + ldr r0, _020EBE60 ; =0x0000FFFF + strh r0, [sp, #6] +_020EBE40: + add r0, sp, #0 + ldmia r0, {r0, r1, r2, r3} + stmia lr, {r0, r1, r2, r3} + add r0, ip, #2 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020EBE58: .word _0210E73C +_020EBE5C: .word 0x000001FD +_020EBE60: .word 0x0000FFFF + arm_func_end parse_format__wprintf + + arm_func_start long2str__wprintf +long2str__wprintf: ; 0x020EBE64 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + movs sl, r0 + mov r0, #0 + mov r5, r1 + str r0, [sp, #0xc] + ldr r7, [sp, #0x4c] + mov r6, r0 + strh r0, [r5, #-2]! + ldrb r0, [sp, #0x43] + str r1, [sp] + ldrh r8, [sp, #0x46] + str r0, [sp, #4] + ldr r0, [sp, #0x48] + ldrb fp, [sp, #0x41] + str r0, [sp, #8] + cmpeq r7, #0 + bne _020EBED8 + ldr r0, [sp, #4] + cmp r0, #0 + beq _020EBEC4 + cmp r8, #0x6f + beq _020EBED8 +_020EBEC4: + add sp, sp, #0x10 + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EBED8: + cmp r8, #0x69 + bgt _020EBF00 + bge _020EBF34 + cmp r8, #0x58 + bgt _020EBEF4 + beq _020EBF60 + b _020EBF68 +_020EBEF4: + cmp r8, #0x64 + beq _020EBF34 + b _020EBF68 +_020EBF00: + cmp r8, #0x6f + bgt _020EBF14 + moveq r4, #8 + moveq fp, #0 + b _020EBF68 +_020EBF14: + cmp r8, #0x78 + bgt _020EBF68 + cmp r8, #0x75 + blt _020EBF68 + beq _020EBF54 + cmp r8, #0x78 + beq _020EBF60 + b _020EBF68 +_020EBF34: + cmp sl, #0 + mov r4, #0xa + bge _020EBF68 + mov r0, #1 + cmp sl, #0x80000000 + rsbne sl, sl, #0 + str r0, [sp, #0xc] + b _020EBF68 +_020EBF54: + mov r4, #0xa + mov fp, #0 + b _020EBF68 +_020EBF60: + mov r4, #0x10 + mov fp, #0 +_020EBF68: + mov r0, sl + mov r1, r4 + bl _u32_div_f + mov sb, r1 + mov r0, sl + mov r1, r4 + bl _u32_div_f + cmp sb, #0xa + mov sl, r0 + addlt sb, sb, #0x30 + blt _020EBFA0 + cmp r8, #0x78 + addeq sb, sb, #0x57 + addne sb, sb, #0x37 +_020EBFA0: + cmp sl, #0 + strh sb, [r5, #-2]! + add r6, r6, #1 + bne _020EBF68 + cmp r4, #8 + bne _020EBFD4 + ldr r0, [sp, #4] + cmp r0, #0 + ldrneh r0, [r5] + cmpne r0, #0x30 + movne r0, #0x30 + strneh r0, [r5, #-2]! + addne r6, r6, #1 +_020EBFD4: + ldrb r0, [sp, #0x40] + cmp r0, #2 + bne _020EC008 + ldr r0, [sp, #0xc] + ldr r7, [sp, #8] + cmp r0, #0 + cmpeq fp, #0 + subne r7, r7, #1 + cmp r4, #0x10 + bne _020EC008 + ldr r0, [sp, #4] + cmp r0, #0 + subne r7, r7, #2 +_020EC008: + ldr r0, [sp] + ldr r1, _020EC0B0 ; =0x000001FD + sub r0, r0, r5 + add r0, r0, r0, lsr #31 + add r0, r7, r0, asr #1 + cmp r0, r1 + addgt sp, sp, #0x10 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + cmp r6, r7 + bge _020EC050 + mov r0, #0x30 +_020EC040: + add r6, r6, #1 + cmp r6, r7 + strh r0, [r5, #-2]! + blt _020EC040 +_020EC050: + cmp r4, #0x10 + bne _020EC06C + ldr r0, [sp, #4] + cmp r0, #0 + movne r0, #0x30 + strneh r8, [r5, #-2] + strneh r0, [r5, #-4]! +_020EC06C: + ldr r0, [sp, #0xc] + cmp r0, #0 + movne r0, #0x2d + strneh r0, [r5, #-2]! + bne _020EC09C + cmp fp, #1 + moveq r0, #0x2b + streqh r0, [r5, #-2]! + beq _020EC09C + cmp fp, #2 + moveq r0, #0x20 + streqh r0, [r5, #-2]! +_020EC09C: + mov r0, r5 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020EC0B0: .word 0x000001FD + arm_func_end long2str__wprintf + + arm_func_start longlong2str__wprintf +longlong2str__wprintf: ; 0x020EC0B4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + mov sb, r1 + mov r1, #0 + mov sl, r0 + mov r8, r2 + mov r0, r1 + strh r0, [r8, #-2]! + ldr r0, [sp, #0x58] + cmp sb, #0 + str r0, [sp, #0x14] + ldrb r0, [sp, #0x4f] + cmpeq sl, #0 + str r2, [sp] + str r0, [sp, #4] + ldrh r0, [sp, #0x52] + str r1, [sp, #0x18] + mov fp, r1 + str r0, [sp, #8] + ldr r0, [sp, #0x54] + str r0, [sp, #0xc] + ldrb r0, [sp, #0x4d] + str r0, [sp, #0x10] + ldreq r0, [sp, #0x14] + cmpeq r0, #0 + bne _020EC14C + ldr r0, [sp, #4] + cmp r0, #0 + beq _020EC138 + ldr r0, [sp, #8] + cmp r0, #0x6f + beq _020EC14C +_020EC138: + add sp, sp, #0x1c + mov r0, r8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EC14C: + ldr r0, [sp, #8] + cmp r0, #0x69 + bgt _020EC178 + bge _020EC1A8 + cmp r0, #0x58 + bgt _020EC16C + beq _020EC1FC + b _020EC208 +_020EC16C: + cmp r0, #0x64 + beq _020EC1A8 + b _020EC208 +_020EC178: + cmp r0, #0x6f + bgt _020EC188 + beq _020EC1DC + b _020EC208 +_020EC188: + cmp r0, #0x78 + bgt _020EC208 + cmp r0, #0x75 + blt _020EC208 + beq _020EC1EC + cmp r0, #0x78 + beq _020EC1FC + b _020EC208 +_020EC1A8: + subs r0, sl, #0 + sbcs r0, sb, #0 + mov r7, #0xa + mov r6, #0 + bge _020EC208 + cmp sb, #0x80000000 + cmpeq sl, r6 + beq _020EC1D0 + rsbs sl, sl, #0 + rsc sb, sb, #0 +_020EC1D0: + mov r0, #1 + str r0, [sp, #0x18] + b _020EC208 +_020EC1DC: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #8 + b _020EC208 +_020EC1EC: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #0xa + b _020EC208 +_020EC1FC: + mov r6, #0 + str r6, [sp, #0x10] + mov r7, #0x10 +_020EC208: + mov r4, #0 +_020EC20C: + mov r0, sl + mov r1, sb + mov r2, r7 + mov r3, r6 + bl _ull_mod + mov r5, r0 + mov r0, sl + mov r1, sb + mov r2, r7 + mov r3, r6 + bl _ll_udiv + mov sl, r0 + cmp r5, #0xa + mov sb, r1 + addlt r0, r5, #0x30 + blt _020EC25C + ldr r0, [sp, #8] + cmp r0, #0x78 + addeq r0, r5, #0x57 + addne r0, r5, #0x37 +_020EC25C: + strh r0, [r8, #-2]! + mov r0, #0 + cmp sb, r0 + cmpeq sl, r4 + add fp, fp, #1 + bne _020EC20C + cmp r6, #0 + cmpeq r7, #8 + bne _020EC29C + ldr r0, [sp, #4] + cmp r0, #0 + ldrneh r0, [r8] + cmpne r0, #0x30 + movne r0, #0x30 + strneh r0, [r8, #-2]! + addne fp, fp, #1 +_020EC29C: + ldrb r0, [sp, #0x4c] + cmp r0, #2 + bne _020EC2EC + ldr r0, [sp, #0xc] + str r0, [sp, #0x14] + ldr r0, [sp, #0x18] + cmp r0, #0 + ldreq r0, [sp, #0x10] + cmpeq r0, #0 + ldrne r0, [sp, #0x14] + subne r0, r0, #1 + strne r0, [sp, #0x14] + cmp r6, #0 + cmpeq r7, #0x10 + bne _020EC2EC + ldr r0, [sp, #4] + cmp r0, #0 + ldrne r0, [sp, #0x14] + subne r0, r0, #2 + strne r0, [sp, #0x14] +_020EC2EC: + ldr r0, [sp] + ldr r2, _020EC3B0 ; =0x000001FD + sub r0, r0, r8 + add r1, r0, r0, lsr #31 + ldr r0, [sp, #0x14] + add r0, r0, r1, asr #1 + cmp r0, r2 + addgt sp, sp, #0x1c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + ldr r0, [sp, #0x14] + cmp fp, r0 + bge _020EC340 + mov r1, #0x30 +_020EC32C: + ldr r0, [sp, #0x14] + add fp, fp, #1 + cmp fp, r0 + strh r1, [r8, #-2]! + blt _020EC32C +_020EC340: + cmp r6, #0 + cmpeq r7, #0x10 + bne _020EC368 + ldr r0, [sp, #4] + cmp r0, #0 + beq _020EC368 + ldr r0, [sp, #8] + mov r1, #0x30 + strh r0, [r8, #-2] + strh r1, [r8, #-4]! +_020EC368: + ldr r0, [sp, #0x18] + cmp r0, #0 + movne r0, #0x2d + strneh r0, [r8, #-2]! + bne _020EC39C + ldr r0, [sp, #0x10] + cmp r0, #1 + moveq r0, #0x2b + streqh r0, [r8, #-2]! + beq _020EC39C + cmp r0, #2 + moveq r0, #0x20 + streqh r0, [r8, #-2]! +_020EC39C: + mov r0, r8 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020EC3B0: .word 0x000001FD + arm_func_end longlong2str__wprintf + + arm_func_start double2hex__wprintf +double2hex__wprintf: ; 0x020EC3B4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x44 + ldr r7, [sp, #0x80] + ldr r0, _020EC720 ; =0x000001FD + mov r8, r2 + cmp r7, r0 + ldrh r6, [sp, #0x7a] + ldrb r5, [sp, #0x77] + ldrb r4, [sp, #0x75] + ldr r1, [sp, #0x68] + ldr r2, [sp, #0x6c] + addgt sp, sp, #0x44 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addgt sp, sp, #0x10 + bxgt lr + mov sl, #0 + mov sb, #0x20 + add r0, sp, #8 + add r3, sp, #0xc + strb sl, [sp, #8] + strh sb, [sp, #0xa] + bl __num2dec + ldr r0, [sp, #0x68] + ldr r1, [sp, #0x6c] + bl fabs + mov r2, r0 + mov r0, sl + mov r3, r1 + mov r1, r0 + bl _deq + bne _020EC45C + sub r4, r8, #0xc + ldr r1, _020EC724 ; =_02111364 + mov r0, r4 + bl wcscpy + add sp, sp, #0x44 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020EC45C: + ldrb r0, [sp, #0x11] + cmp r0, #0x49 + bne _020EC4DC + ldrsb r0, [sp, #0xc] + cmp r0, #0 + beq _020EC4A0 + cmp r6, #0x41 + sub r4, r8, #0xa + bne _020EC490 + ldr r1, _020EC728 ; =_02111370 + mov r0, r4 + bl wcscpy + b _020EC4C8 +_020EC490: + ldr r1, _020EC72C ; =_0211137C + mov r0, r4 + bl wcscpy + b _020EC4C8 +_020EC4A0: + cmp r6, #0x41 + sub r4, r8, #8 + bne _020EC4BC + ldr r1, _020EC730 ; =_02111388 + mov r0, r4 + bl wcscpy + b _020EC4C8 +_020EC4BC: + ldr r1, _020EC734 ; =_02111390 + mov r0, r4 + bl wcscpy +_020EC4C8: + add sp, sp, #0x44 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020EC4DC: + cmp r0, #0x4e + bne _020EC558 + ldrsb r0, [sp, #0xc] + cmp r0, #0 + beq _020EC51C + cmp r6, #0x41 + sub r4, r8, #0xa + bne _020EC50C + ldr r1, _020EC738 ; =_02111398 + mov r0, r4 + bl wcscpy + b _020EC544 +_020EC50C: + ldr r1, _020EC73C ; =_021113A4 + mov r0, r4 + bl wcscpy + b _020EC544 +_020EC51C: + cmp r6, #0x41 + sub r4, r8, #8 + bne _020EC538 + ldr r1, _020EC740 ; =_021113B0 + mov r0, r4 + bl wcscpy + b _020EC544 +_020EC538: + ldr r1, _020EC744 ; =_021113B8 + mov r0, r4 + bl wcscpy +_020EC544: + add sp, sp, #0x44 + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr +_020EC558: + mov r3, sl + mov r1, #1 + mov r0, #0x64 + add sb, sp, #0x68 + strb r1, [sp, #0x34] + strb r1, [sp, #0x35] + strb r3, [sp, #0x36] + strb r3, [sp, #0x37] + strb r3, [sp, #0x38] + str r3, [sp, #0x3c] + str r1, [sp, #0x40] + strh r0, [sp, #0x3a] +_020EC588: + rsb r1, r3, #7 + ldrsb r2, [sb, r3] + ldrsb r0, [sb, r1] + strb r0, [sb, r3] + add r3, r3, #1 + strb r2, [sb, r1] + cmp r3, #4 + blt _020EC588 + ldrb r0, [sp, #0x69] + ldrb r1, [sp, #0x68] + ldr sb, _020EC748 ; =0x000007FF + mov r0, r0, lsl #0x11 + orr r1, r0, r1, lsl #25 + add r0, sp, #0x34 + and lr, sb, r1, lsr #21 + sub ip, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + rsb r0, sb, #0x400 + mov r1, r8 + add r0, lr, r0 + ldmia ip, {r2, r3} + bl long2str__wprintf + cmp r6, #0x61 + moveq r1, #0x70 + movne r1, #0x50 + strh r1, [r0, #-2]! + mov r1, r7, lsl #2 + mov lr, r7 + cmp r7, #1 + add r8, r1, #0xb + add ip, sp, #0x68 + blt _020EC698 + mov sb, #0x30 +_020EC610: + cmp r8, #0x40 + bge _020EC680 + ldrb r1, [ip, r8, asr #3] + and r2, r8, #7 + rsb r3, r2, #7 + mov r2, r1, asr r3 + sub sl, r8, #4 + bic r1, r8, #7 + bic sl, sl, #7 + cmp r1, sl + add sl, ip, r8, asr #3 + and r1, r2, #0xff + beq _020EC654 + ldrb r2, [sl, #-1] + mov r2, r2, lsl #8 + orr r1, r1, r2, asr r3 + and r1, r1, #0xff +_020EC654: + and r1, r1, #0xf + cmp r1, #0xa + addlo r1, r1, #0x30 + andlo r1, r1, #0xff + blo _020EC684 + cmp r6, #0x61 + addeq r1, r1, #0x57 + andeq r1, r1, #0xff + addne r1, r1, #0x37 + andne r1, r1, #0xff + b _020EC684 +_020EC680: + mov r1, sb +_020EC684: + sub lr, lr, #1 + cmp lr, #1 + strh r1, [r0, #-2]! + sub r8, r8, #4 + bge _020EC610 +_020EC698: + cmp r7, #0 + cmpeq r5, #0 + movne r1, #0x2e + strneh r1, [r0, #-2]! + mov r1, #0x31 + strh r1, [r0, #-2] + cmp r6, #0x61 + moveq r1, #0x78 + movne r1, #0x58 + strh r1, [r0, #-4]! + mov r1, #0x30 + strh r1, [r0, #-2]! + ldrsb r1, [sp, #0xc] + cmp r1, #0 + movne r1, #0x2d + strneh r1, [r0, #-2]! + addne sp, sp, #0x44 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addne sp, sp, #0x10 + bxne lr + cmp r4, #1 + moveq r1, #0x2b + streqh r1, [r0, #-2]! + addeq sp, sp, #0x44 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + addeq sp, sp, #0x10 + bxeq lr + cmp r4, #2 + moveq r1, #0x20 + streqh r1, [r0, #-2]! + add sp, sp, #0x44 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020EC720: .word 0x000001FD +_020EC724: .word _02111364 +_020EC728: .word _02111370 +_020EC72C: .word _0211137C +_020EC730: .word _02111388 +_020EC734: .word _02111390 +_020EC738: .word _02111398 +_020EC73C: .word _021113A4 +_020EC740: .word _021113B0 +_020EC744: .word _021113B8 +_020EC748: .word 0x000007FF + arm_func_end double2hex__wprintf + + arm_func_start round_decimal__wprintf +round_decimal__wprintf: ; 0x020EC74C + stmdb sp!, {r4, lr} + cmp r1, #0 + bge _020EC774 +_020EC758: + mov r1, #0 + strh r1, [r0, #2] + mov r1, #1 + strb r1, [r0, #4] + mov r1, #0x30 + strb r1, [r0, #5] + ldmia sp!, {r4, pc} +_020EC774: + ldrb lr, [r0, #4] + cmp r1, lr + ldmgeia sp!, {r4, pc} + add ip, r0, #5 + add r2, ip, r1 + add r2, r2, #1 + ldrsb r3, [r2, #-1]! + sub r3, r3, #0x30 + mov r3, r3, lsl #0x18 + mov r3, r3, asr #0x18 + cmp r3, #5 + bne _020EC7D4 + add ip, ip, lr +_020EC7A8: + sub ip, ip, #1 + cmp ip, r2 + bls _020EC7C0 + ldrsb r3, [ip] + cmp r3, #0x30 + beq _020EC7A8 +_020EC7C0: + cmp ip, r2 + ldreqsb r3, [r2, #-1] + andeq r4, r3, #1 + movne r4, #1 + b _020EC7DC +_020EC7D4: + movgt r4, #1 + movle r4, #0 +_020EC7DC: + cmp r1, #0 + beq _020EC838 + mov ip, #0 + mov lr, #1 +_020EC7EC: + ldrsb r3, [r2, #-1]! + sub r3, r3, #0x30 + add r3, r3, r4 + mov r3, r3, lsl #0x18 + mov r3, r3, asr #0x18 + cmp r3, #9 + movgt r4, lr + movle r4, ip + cmp r4, #0 + bne _020EC81C + cmp r3, #0 + bne _020EC824 +_020EC81C: + sub r1, r1, #1 + b _020EC830 +_020EC824: + add r3, r3, #0x30 + strb r3, [r2] + b _020EC838 +_020EC830: + cmp r1, #0 + bne _020EC7EC +_020EC838: + cmp r4, #0 + beq _020EC860 + ldrsh r3, [r0, #2] + mov r2, #1 + mov r1, #0x31 + add r3, r3, #1 + strh r3, [r0, #2] + strb r2, [r0, #4] + strb r1, [r0, #5] + ldmia sp!, {r4, pc} +_020EC860: + cmp r1, #0 + beq _020EC758 + strb r1, [r0, #4] + ldmia sp!, {r4, pc} + arm_func_end round_decimal__wprintf + + arm_func_start float2str__wprintf +float2str__wprintf: ; 0x020EC870 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x22c + mov sl, r0 + add r0, sp, #0x250 + ldr r7, [sp, #0x268] + ldr r3, _020ECE90 ; =0x000001FD + ldrh r6, [r0, #0x12] + cmp r7, r3 + ldrb r5, [sp, #0x25f] + ldrb r4, [sp, #0x25d] + mov r8, r1 + mov sb, r2 + addgt sp, sp, #0x22c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + mov ip, #0 + mov fp, #0x20 + add r0, sp, #0 + add r3, sp, #4 + mov r1, sl + mov r2, r8 + strb ip, [sp] + strh fp, [sp, #2] + bl __num2dec + ldrb r0, [sp, #8] + add r1, sp, #9 + add r0, r1, r0 + b _020EC904 +_020EC8EC: + ldrb r2, [sp, #8] + ldrsh r1, [sp, #6] + sub r2, r2, #1 + add r1, r1, #1 + strb r2, [sp, #8] + strh r1, [sp, #6] +_020EC904: + ldrb r1, [sp, #8] + cmp r1, #1 + bls _020EC91C + ldrsb r1, [r0, #-1]! + cmp r1, #0x30 + beq _020EC8EC +_020EC91C: + ldrb r0, [sp, #9] + cmp r0, #0x30 + beq _020EC93C + cmp r0, #0x49 + beq _020EC948 + cmp r0, #0x4e + beq _020ECA00 + b _020ECAAC +_020EC93C: + mov r0, #0 + strh r0, [sp, #6] + b _020ECAAC +_020EC948: + mov r2, #0 + mov r0, sl + mov r1, r8 + mov r3, r2 + bl _dls + bhs _020EC9A8 + cmp r6, #0x80 + sub r4, sb, #0xa + movhs r0, #0 + bhs _020EC980 + ldr r0, _020ECE94 ; =_0210E73C + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x200 +_020EC980: + cmp r0, #0 + beq _020EC998 + ldr r1, _020ECE98 ; =_02111370 + mov r0, r4 + bl wcscpy + b _020EC9EC +_020EC998: + ldr r1, _020ECE9C ; =_0211137C + mov r0, r4 + bl wcscpy + b _020EC9EC +_020EC9A8: + cmp r6, #0x80 + sub r4, sb, #8 + movhs r0, #0 + bhs _020EC9C8 + ldr r0, _020ECE94 ; =_0210E73C + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x200 +_020EC9C8: + cmp r0, #0 + beq _020EC9E0 + ldr r1, _020ECEA0 ; =_02111388 + mov r0, r4 + bl wcscpy + b _020EC9EC +_020EC9E0: + ldr r1, _020ECEA4 ; =_02111390 + mov r0, r4 + bl wcscpy +_020EC9EC: + add sp, sp, #0x22c + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020ECA00: + ldrsb r0, [sp, #4] + cmp r0, #0 + beq _020ECA54 + cmp r6, #0x80 + sub r4, sb, #0xa + movhs r0, #0 + bhs _020ECA2C + ldr r0, _020ECE94 ; =_0210E73C + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x200 +_020ECA2C: + cmp r0, #0 + beq _020ECA44 + ldr r1, _020ECEA8 ; =_02111398 + mov r0, r4 + bl wcscpy + b _020ECA98 +_020ECA44: + ldr r1, _020ECEAC ; =_021113A4 + mov r0, r4 + bl wcscpy + b _020ECA98 +_020ECA54: + cmp r6, #0x80 + sub r4, sb, #8 + movhs r0, #0 + bhs _020ECA74 + ldr r0, _020ECE94 ; =_0210E73C + mov r1, r6, lsl #1 + ldrh r0, [r0, r1] + and r0, r0, #0x200 +_020ECA74: + cmp r0, #0 + beq _020ECA8C + ldr r1, _020ECEB0 ; =_021113B0 + mov r0, r4 + bl wcscpy + b _020ECA98 +_020ECA8C: + ldr r1, _020ECEB4 ; =_021113B8 + mov r0, r4 + bl wcscpy +_020ECA98: + add sp, sp, #0x22c + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020ECAAC: + ldrb r1, [sp, #8] + ldrsh r2, [sp, #6] + add r0, sp, #0x200 + sub r1, r1, #1 + add r0, r0, #0x2a + add r1, r2, r1 + sub r8, r0, #1 + strh r1, [sp, #6] + mov r0, #0 + strb r0, [r8] + cmp r6, #0x65 + bgt _020ECB08 + bge _020ECB94 + cmp r6, #0x47 + bgt _020ECE54 + cmp r6, #0x45 + blt _020ECE54 + beq _020ECB94 + cmp r6, #0x46 + beq _020ECCE0 + cmp r6, #0x47 + beq _020ECB20 + b _020ECE54 +_020ECB08: + cmp r6, #0x66 + bgt _020ECB18 + beq _020ECCE0 + b _020ECE54 +_020ECB18: + cmp r6, #0x67 + bne _020ECE54 +_020ECB20: + ldrb r0, [sp, #8] + cmp r0, r7 + ble _020ECB38 + add r0, sp, #4 + mov r1, r7 + bl round_decimal__wprintf +_020ECB38: + ldrsh r2, [sp, #6] + mvn r0, #3 + cmp r2, r0 + blt _020ECB50 + cmp r2, r7 + blt _020ECB70 +_020ECB50: + cmp r5, #0 + ldreqb r0, [sp, #8] + subne r7, r7, #1 + subeq r7, r0, #1 + cmp r6, #0x67 + moveq r6, #0x65 + movne r6, #0x45 + b _020ECB94 +_020ECB70: + cmp r5, #0 + addne r0, r2, #1 + subne r7, r7, r0 + bne _020ECCE0 + ldrb r1, [sp, #8] + add r0, r2, #1 + subs r7, r1, r0 + movmi r7, #0 + b _020ECCE0 +_020ECB94: + ldrb r0, [sp, #8] + add r1, r7, #1 + cmp r0, r1 + ble _020ECBAC + add r0, sp, #4 + bl round_decimal__wprintf +_020ECBAC: + ldrsh lr, [sp, #6] + mov fp, #0x2b + mov sl, #0 + cmp lr, #0 + rsblt lr, lr, #0 + movlt fp, #0x2d + ldr r3, _020ECEB8 ; =0x66666667 + mov r0, #0xa + b _020ECC00 +_020ECBD0: + mov r1, lr, lsr #0x1f + smull r2, ip, r3, lr + add ip, r1, ip, asr #2 + smull r1, r2, r0, ip + sub ip, lr, r1 + add r1, ip, #0x30 + strb r1, [r8, #-1]! + mov r2, lr + smull r1, lr, r3, r2 + mov r1, r2, lsr #0x1f + add lr, r1, lr, asr #2 + add sl, sl, #1 +_020ECC00: + cmp lr, #0 + bne _020ECBD0 + cmp sl, #2 + blt _020ECBD0 + add r0, sp, #0x2a + strb fp, [r8, #-1] + strb r6, [r8, #-2]! + sub r1, r0, r8 + ldr r0, _020ECE90 ; =0x000001FD + add r1, r1, r7 + cmp r1, r0 + addgt sp, sp, #0x22c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + ldrb r1, [sp, #8] + add r0, r7, #1 + cmp r1, r0 + bge _020ECC70 + add r0, r7, #2 + sub r0, r0, r1 + subs r1, r0, #1 + beq _020ECC70 + mov r0, #0x30 +_020ECC64: + strb r0, [r8, #-1]! + subs r1, r1, #1 + bne _020ECC64 +_020ECC70: + ldrb r1, [sp, #8] + add r0, sp, #9 + add r2, r0, r1 + subs r1, r1, #1 + beq _020ECC94 +_020ECC84: + ldrsb r0, [r2, #-1]! + subs r1, r1, #1 + strb r0, [r8, #-1]! + bne _020ECC84 +_020ECC94: + cmp r7, #0 + cmpeq r5, #0 + movne r0, #0x2e + strneb r0, [r8, #-1]! + ldrb r0, [sp, #9] + strb r0, [r8, #-1]! + ldrsb r0, [sp, #4] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r8, #-1]! + bne _020ECE54 + cmp r4, #1 + moveq r0, #0x2b + streqb r0, [r8, #-1]! + beq _020ECE54 + cmp r4, #2 + moveq r0, #0x20 + streqb r0, [r8, #-1]! + b _020ECE54 +_020ECCE0: + ldrsh r3, [sp, #6] + ldrb r2, [sp, #8] + sub r0, r2, r3 + subs r1, r0, #1 + movmi r1, #0 + cmp r1, r7 + ble _020ECD20 + sub r1, r1, r7 + add r0, sp, #4 + sub r1, r2, r1 + bl round_decimal__wprintf + ldrsh r3, [sp, #6] + ldrb r2, [sp, #8] + sub r0, r2, r3 + subs r1, r0, #1 + movmi r1, #0 +_020ECD20: + adds r0, r3, #1 + movmi r0, #0 + ldr r3, _020ECE90 ; =0x000001FD + add r6, r0, r1 + cmp r6, r3 + addgt sp, sp, #0x22c + movgt r0, #0 + ldmgtia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + addgt sp, sp, #0x10 + bxgt lr + add r3, sp, #9 + sub r6, r7, r1 + cmp r6, #0 + add r2, r3, r2 + mov sl, #0 + ble _020ECD74 + mov r3, #0x30 +_020ECD64: + add sl, sl, #1 + cmp sl, r6 + strb r3, [r8, #-1]! + blt _020ECD64 +_020ECD74: + mov r6, #0 + b _020ECD88 +_020ECD7C: + ldrsb r3, [r2, #-1]! + add r6, r6, #1 + strb r3, [r8, #-1]! +_020ECD88: + cmp r6, r1 + ldrltb r3, [sp, #8] + cmplt r6, r3 + blt _020ECD7C + cmp r6, r1 + bge _020ECDB4 + mov r3, #0x30 +_020ECDA4: + add r6, r6, #1 + cmp r6, r1 + strb r3, [r8, #-1]! + blt _020ECDA4 +_020ECDB4: + cmp r7, #0 + cmpeq r5, #0 + movne r1, #0x2e + strneb r1, [r8, #-1]! + cmp r0, #0 + beq _020ECE1C + ldrb r1, [sp, #8] + mov r5, #0 + sub r1, r0, r1 + cmp r1, #0 + ble _020ECDFC + mov r3, #0x30 +_020ECDE4: + strb r3, [r8, #-1]! + ldrb r1, [sp, #8] + add r5, r5, #1 + sub r1, r0, r1 + cmp r5, r1 + blt _020ECDE4 +_020ECDFC: + cmp r5, r0 + bge _020ECE24 +_020ECE04: + ldrsb r1, [r2, #-1]! + add r5, r5, #1 + cmp r5, r0 + strb r1, [r8, #-1]! + blt _020ECE04 + b _020ECE24 +_020ECE1C: + mov r0, #0x30 + strb r0, [r8, #-1]! +_020ECE24: + ldrsb r0, [sp, #4] + cmp r0, #0 + movne r0, #0x2d + strneb r0, [r8, #-1]! + bne _020ECE54 + cmp r4, #1 + moveq r0, #0x2b + streqb r0, [r8, #-1]! + beq _020ECE54 + cmp r4, #2 + moveq r0, #0x20 + streqb r0, [r8, #-1]! +_020ECE54: + mov r0, r8 + bl strlen + sub r1, sb, r0, lsl #1 + mov r0, r8 + sub r4, r1, #2 + bl strlen + mov r2, r0 + mov r0, r4 + mov r1, r8 + bl mbstowcs + mov r0, r4 + add sp, sp, #0x22c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020ECE90: .word 0x000001FD +_020ECE94: .word _0210E73C +_020ECE98: .word _02111370 +_020ECE9C: .word _0211137C +_020ECEA0: .word _02111388 +_020ECEA4: .word _02111390 +_020ECEA8: .word _02111398 +_020ECEAC: .word _021113A4 +_020ECEB0: .word _021113B0 +_020ECEB4: .word _021113B8 +_020ECEB8: .word 0x66666667 + arm_func_end float2str__wprintf + + arm_func_start __wpformatter +__wpformatter: ; 0x020ECEBC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x430 + mov r3, #0x20 + mov fp, r2 + strh r3, [sp, #0x1c] + ldrh r2, [fp] + mov sb, r0 + mov r8, r1 + cmp r2, #0 + mov r4, #0 + beq _020ED78C +_020ECEEC: + mov r0, fp + mov r1, #0x25 + bl wcschr + str r0, [sp, #0xc] + cmp r0, #0 + bne _020ECF40 + mov r0, fp + bl wcslen + movs r2, r0 + add r4, r4, r2 + beq _020ED78C + mov r0, r8 + mov r1, fp + blx sb + cmp r0, #0 + bne _020ED78C + add sp, sp, #0x430 + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020ECF40: + sub r0, r0, fp + add r0, r0, r0, lsr #31 + movs r2, r0, asr #1 + add r4, r4, r2 + beq _020ECF78 + mov r0, r8 + mov r1, fp + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020ECF78: + add r1, sp, #0x400 + ldr r0, [sp, #0xc] + add r1, r1, #0x64 + add r2, sp, #0x20 + bl parse_format__wprintf + ldrh r1, [sp, #0x26] + mov fp, r0 + cmp r1, #0x61 + bgt _020ECFE8 + bge _020ED354 + cmp r1, #0x47 + bgt _020ECFDC + subs r0, r1, #0x41 + addpl pc, pc, r0, lsl #2 + b _020ECFD0 +_020ECFB4: ; jump table + b _020ED354 ; case 0 + b _020ED5F8 ; case 1 + b _020ED5F8 ; case 2 + b _020ED5F8 ; case 3 + b _020ED2E4 ; case 4 + b _020ED2E4 ; case 5 + b _020ED2E4 ; case 6 +_020ECFD0: + cmp r1, #0x25 + beq _020ED5E4 + b _020ED5F8 +_020ECFDC: + cmp r1, #0x58 + beq _020ED1A8 + b _020ED5F8 +_020ECFE8: + cmp r1, #0x75 + bgt _020ED050 + subs r0, r1, #0x64 + addpl pc, pc, r0, lsl #2 + b _020ED044 +_020ECFFC: ; jump table + b _020ED06C ; case 0 + b _020ED2E4 ; case 1 + b _020ED2E4 ; case 2 + b _020ED2E4 ; case 3 + b _020ED5F8 ; case 4 + b _020ED06C ; case 5 + b _020ED5F8 ; case 6 + b _020ED5F8 ; case 7 + b _020ED5F8 ; case 8 + b _020ED5F8 ; case 9 + b _020ED500 ; case 10 + b _020ED1A8 ; case 11 + b _020ED5F8 ; case 12 + b _020ED5F8 ; case 13 + b _020ED5F8 ; case 14 + b _020ED3C4 ; case 15 + b _020ED5F8 ; case 16 + b _020ED1A8 ; case 17 +_020ED044: + cmp r1, #0x63 + beq _020ED58C + b _020ED5F8 +_020ED050: + cmp r1, #0x78 + bgt _020ED060 + beq _020ED1A8 + b _020ED5F8 +_020ED060: + ldr r0, _020ED7A0 ; =0x0000FFFF + cmp r1, r0 + b _020ED5F8 +_020ED06C: + ldrb r0, [sp, #0x24] + cmp r0, #3 + bne _020ED08C + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED124 +_020ED08C: + cmp r0, #4 + bne _020ED0B4 + ldr r1, [sp, #0x464] + add r2, r1, #8 + str r2, [sp, #0x464] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020ED124 +_020ED0B4: + cmp r0, #6 + bne _020ED0DC + ldr r1, [sp, #0x464] + add r2, r1, #8 + str r2, [sp, #0x464] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020ED124 +_020ED0DC: + cmp r0, #7 + bne _020ED0F8 + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED124 +_020ED0F8: + cmp r0, #8 + bne _020ED114 + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED124 +_020ED114: + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] +_020ED124: + cmp r0, #2 + moveq r1, sl, lsl #0x10 + moveq sl, r1, asr #0x10 + cmp r0, #4 + cmpne r0, #6 + add r0, sp, #0x20 + bne _020ED16C + sub r5, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r3, [r5] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + add r2, sp, #0x430 + bl longlong2str__wprintf + movs r6, r0 + beq _020ED5F8 + b _020ED190 +_020ED16C: + sub r5, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + add r1, sp, #0x430 + mov r0, sl + ldmia r5, {r2, r3} + bl long2str__wprintf + movs r6, r0 + beq _020ED5F8 +_020ED190: + add r0, sp, #0x400 + add r0, r0, #0x2e + sub r0, r0, r6 + add r0, r0, r0, lsr #31 + mov r7, r0, asr #1 + b _020ED644 +_020ED1A8: + ldrb r0, [sp, #0x24] + cmp r0, #3 + bne _020ED1C8 + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED260 +_020ED1C8: + cmp r0, #4 + bne _020ED1F0 + ldr r1, [sp, #0x464] + add r2, r1, #8 + str r2, [sp, #0x464] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020ED260 +_020ED1F0: + cmp r0, #6 + bne _020ED218 + ldr r1, [sp, #0x464] + add r2, r1, #8 + str r2, [sp, #0x464] + ldr r1, [r2, #-8] + str r1, [sp, #0x10] + ldr r1, [r2, #-4] + str r1, [sp, #0x14] + b _020ED260 +_020ED218: + cmp r0, #7 + bne _020ED234 + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED260 +_020ED234: + cmp r0, #8 + bne _020ED250 + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] + b _020ED260 +_020ED250: + ldr r1, [sp, #0x464] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr sl, [r1, #-4] +_020ED260: + cmp r0, #2 + moveq r1, sl, lsl #0x10 + moveq sl, r1, lsr #0x10 + cmp r0, #4 + cmpne r0, #6 + add r0, sp, #0x20 + bne _020ED2A8 + sub r5, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r3, [r5] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + add r2, sp, #0x430 + bl longlong2str__wprintf + movs r6, r0 + beq _020ED5F8 + b _020ED2CC +_020ED2A8: + sub r5, sp, #8 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + add r1, sp, #0x430 + mov r0, sl + ldmia r5, {r2, r3} + bl long2str__wprintf + movs r6, r0 + beq _020ED5F8 +_020ED2CC: + add r0, sp, #0x400 + add r0, r0, #0x2e + sub r0, r0, r6 + add r0, r0, r0, lsr #31 + mov r7, r0, asr #1 + b _020ED644 +_020ED2E4: + ldrb r0, [sp, #0x24] + cmp r0, #9 + ldrne r0, [sp, #0x464] + addne r0, r0, #8 + strne r0, [sp, #0x464] + bne _020ED308 + ldr r0, [sp, #0x464] + add r0, r0, #8 + str r0, [sp, #0x464] +_020ED308: + ldr r7, [r0, #-8] + ldr r6, [r0, #-4] + add r0, sp, #0x20 + sub r5, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r3, [r5] + mov r0, r7 + mov r1, r6 + add r2, sp, #0x430 + bl float2str__wprintf + movs r6, r0 + beq _020ED5F8 + add r0, sp, #0x400 + add r0, r0, #0x2e + sub r0, r0, r6 + add r0, r0, r0, lsr #31 + mov r7, r0, asr #1 + b _020ED644 +_020ED354: + ldrb r0, [sp, #0x24] + cmp r0, #9 + ldrne r0, [sp, #0x464] + addne r0, r0, #8 + strne r0, [sp, #0x464] + bne _020ED378 + ldr r0, [sp, #0x464] + add r0, r0, #8 + str r0, [sp, #0x464] +_020ED378: + ldr r7, [r0, #-8] + ldr r6, [r0, #-4] + add r0, sp, #0x20 + sub r5, sp, #4 + ldmia r0, {r0, r1, r2, r3} + stmia r5, {r0, r1, r2, r3} + ldr r3, [r5] + mov r0, r7 + mov r1, r6 + add r2, sp, #0x430 + bl double2hex__wprintf + movs r6, r0 + beq _020ED5F8 + add r0, sp, #0x400 + add r0, r0, #0x2e + sub r0, r0, r6 + add r0, r0, r0, lsr #31 + mov r7, r0, asr #1 + b _020ED644 +_020ED3C4: + ldrb r0, [sp, #0x24] + cmp r0, #5 + bne _020ED460 + ldr r0, [sp, #0x464] + add r0, r0, #4 + str r0, [sp, #0x464] + ldr r6, [r0, #-4] + ldrb r0, [sp, #0x23] + cmp r6, #0 + ldreq r6, _020ED7A4 ; =_021113C0 + cmp r0, #0 + beq _020ED418 + ldrh r1, [r6], #2 + ldrb r0, [sp, #0x22] + and r7, r1, #0xff + cmp r0, #0 + beq _020ED644 + ldr r0, [sp, #0x2c] + cmp r7, r0 + movgt r7, r0 + b _020ED644 +_020ED418: + ldrb r0, [sp, #0x22] + cmp r0, #0 + beq _020ED450 + ldr r7, [sp, #0x2c] + mov r0, r6 + mov r2, r7 + mov r1, #0 + bl wmemchr + cmp r0, #0 + beq _020ED644 + sub r0, r0, r6 + add r0, r0, r0, lsr #31 + mov r7, r0, asr #1 + b _020ED644 +_020ED450: + mov r0, r6 + bl wcslen + mov r7, r0 + b _020ED644 +_020ED460: + ldr r0, [sp, #0x464] + add r0, r0, #4 + str r0, [sp, #0x464] + ldr r5, [r0, #-4] + ldrb r0, [sp, #0x23] + cmp r5, #0 + ldreq r5, _020ED7A8 ; =_021113C4 + cmp r0, #0 + beq _020ED4A8 + ldrh r1, [r6] + ldrb r0, [sp, #0x22] + and r6, r1, #0xff + cmp r0, #0 + beq _020ED4E0 + ldr r0, [sp, #0x2c] + cmp r6, r0 + movgt r6, r0 + b _020ED4E0 +_020ED4A8: + ldrb r0, [sp, #0x22] + cmp r0, #0 + beq _020ED4D4 + ldr r6, [sp, #0x2c] + mov r0, r5 + mov r2, r6 + mov r1, #0 + bl memchr + cmp r0, #0 + subne r6, r0, r5 + b _020ED4E0 +_020ED4D4: + mov r0, r5 + bl strlen + mov r6, r0 +_020ED4E0: + add r0, sp, #0x30 + mov r1, r5 + mov r2, r6 + bl mbstowcs + movs r7, r0 + bmi _020ED5F8 + add r6, sp, #0x30 + b _020ED644 +_020ED500: + ldr r1, [sp, #0x464] + ldrb r0, [sp, #0x24] + add r1, r1, #4 + str r1, [sp, #0x464] + ldr r6, [r1, #-4] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020ED780 +_020ED520: ; jump table + b _020ED544 ; case 0 + b _020ED780 ; case 1 + b _020ED54C ; case 2 + b _020ED554 ; case 3 + b _020ED57C ; case 4 + b _020ED780 ; case 5 + b _020ED55C ; case 6 + b _020ED56C ; case 7 + b _020ED574 ; case 8 +_020ED544: + str r4, [r6] + b _020ED780 +_020ED54C: + strh r4, [r6] + b _020ED780 +_020ED554: + str r4, [r6] + b _020ED780 +_020ED55C: + str r4, [r6] + mov r0, r4, asr #0x1f + str r0, [r6, #4] + b _020ED780 +_020ED56C: + str r4, [r6] + b _020ED780 +_020ED574: + str r4, [r6] + b _020ED780 +_020ED57C: + str r4, [r6] + mov r0, r4, asr #0x1f + str r0, [r6, #4] + b _020ED780 +_020ED58C: + ldrb r0, [sp, #0x24] + add r6, sp, #0x30 + cmp r0, #5 + bne _020ED5B8 + ldr r0, [sp, #0x464] + mov r7, #1 + add r0, r0, #4 + str r0, [sp, #0x464] + ldr r0, [r0, #-4] + strh r0, [r6] + b _020ED644 +_020ED5B8: + ldr r0, [sp, #0x464] + add r1, sp, #0x18 + add r0, r0, #4 + str r0, [sp, #0x464] + ldr r3, [r0, #-4] + mov r0, r6 + mov r2, #1 + strb r3, [sp, #0x18] + bl mbtowc + mov r7, r0 + b _020ED644 +_020ED5E4: + mov r0, #0x25 + strh r0, [sp, #0x30] + add r6, sp, #0x30 + mov r7, #1 + b _020ED644 +_020ED5F8: + ldr r0, [sp, #0xc] + bl wcslen + movs r5, r0 + beq _020ED630 + ldr r1, [sp, #0xc] + mov r0, r8 + mov r2, r5 + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020ED630: + add sp, sp, #0x430 + add r0, r4, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020ED644: + ldrb r0, [sp, #0x20] + mov r5, r7 + cmp r0, #0 + beq _020ED6F4 + cmp r0, #2 + moveq r1, #0x30 + movne r1, #0x20 + strh r1, [sp, #0x1c] + ldrh r0, [r6] + cmp r0, #0x2b + cmpne r0, #0x2d + cmpne r0, #0x20 + bne _020ED6B0 + cmp r1, #0x30 + bne _020ED6B0 + mov r0, r8 + mov r1, r6 + mov r2, #1 + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + add r6, r6, #2 + sub r7, r7, #1 +_020ED6B0: + ldr r0, [sp, #0x28] + cmp r5, r0 + bge _020ED6F4 +_020ED6BC: + mov r0, r8 + add r1, sp, #0x1c + mov r2, #1 + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x28] + add r5, r5, #1 + cmp r5, r0 + blt _020ED6BC +_020ED6F4: + cmp r7, #0 + beq _020ED724 + mov r0, r8 + mov r1, r6 + mov r2, r7 + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr +_020ED724: + ldrb r0, [sp, #0x20] + cmp r0, #0 + bne _020ED77C + ldr r0, [sp, #0x28] + cmp r5, r0 + bge _020ED77C + mov r7, #0x20 +_020ED740: + mov r0, r8 + add r1, sp, #0x1a + mov r2, #1 + strh r7, [sp, #0x1a] + blx sb + cmp r0, #0 + addeq sp, sp, #0x430 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #0x28] + add r5, r5, #1 + cmp r5, r0 + blt _020ED740 +_020ED77C: + add r4, r4, r5 +_020ED780: + ldrh r0, [fp] + cmp r0, #0 + bne _020ECEEC +_020ED78C: + mov r0, r4 + add sp, sp, #0x430 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020ED7A0: .word 0x0000FFFF +_020ED7A4: .word _021113C0 +_020ED7A8: .word _021113C4 + arm_func_end __wpformatter + + arm_func_start __wStringWrite +__wStringWrite: ; 0x020ED7AC + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r3, [r4, #8] + mov r5, r2 + ldr r2, [r4, #4] + add r0, r3, r5 + cmp r0, r2 + ldr r0, [r4] + subhi r5, r2, r3 + mov r2, r5 + add r0, r0, r3, lsl #1 + bl wmemcpy + ldr r1, [r4, #8] + add r1, r1, r5 + str r1, [r4, #8] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __wStringWrite + + arm_func_start swprintf +swprintf: ; 0x020ED7EC + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r3, sp, #0x10 + bic r3, r3, #3 + ldr r2, [sp, #0x10] + add r3, r3, #4 + bl vswprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end swprintf + + arm_func_start vswprintf +vswprintf: ; 0x020ED814 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r5, r0 + mov r4, r1 + mov ip, #0 + ldr r0, _020ED880 ; =__wStringWrite + add r1, sp, #0 + str r5, [sp] + str r4, [sp, #4] + str ip, [sp, #8] + bl __wpformatter + cmp r0, #0 + addlt sp, sp, #0xc + ldmltia sp!, {r4, r5, pc} + cmp r0, r4 + bhs _020ED868 + mov r1, r0, lsl #1 + mov r2, #0 + add sp, sp, #0xc + strh r2, [r5, r1] + ldmia sp!, {r4, r5, pc} +_020ED868: + mov r1, #0 + add r0, r5, r4, lsl #1 + strh r1, [r0, #-2] + sub r0, r1, #1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020ED880: .word __wStringWrite + arm_func_end vswprintf + + arm_func_start wcslen +wcslen: ; 0x020ED884 + mvn r2, #0 +_020ED888: + ldrh r1, [r0], #2 + add r2, r2, #1 + cmp r1, #0 + bne _020ED888 + mov r0, r2 + bx lr + arm_func_end wcslen + + arm_func_start wcscpy +wcscpy: ; 0x020ED8A0 + mov r3, r0 +_020ED8A4: + ldrh r2, [r1], #2 + mov ip, r3 + strh r2, [r3], #2 + ldrh r2, [ip] + cmp r2, #0 + bne _020ED8A4 + bx lr + arm_func_end wcscpy + + arm_func_start wcschr +wcschr: ; 0x020ED8C0 + ldrh r2, [r0], #2 + cmp r2, #0 + beq _020ED8E4 +_020ED8CC: + cmp r2, r1 + subeq r0, r0, #2 + bxeq lr + ldrh r2, [r0], #2 + cmp r2, #0 + bne _020ED8CC +_020ED8E4: + cmp r1, #0 + movne r0, #0 + subeq r0, r0, #2 + bx lr + arm_func_end wcschr + + arm_func_start __ieee754_pow +__ieee754_pow: ; 0x020ED8F4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x80 + ldr r8, [sp, #0xb4] + ldr r6, [sp, #0xac] + ldr r0, [sp, #0xb0] + bic sb, r8, #0x80000000 + orrs r1, sb, r0 + ldr r7, [sp, #0xa8] + bic r4, r6, #0x80000000 + addeq sp, sp, #0x80 + moveq r0, #0 + ldreq r1, _020EDEA0 ; =0x3FF00000 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r1, _020EDEA4 ; =0x7FF00000 + cmp r4, r1 + bgt _020ED964 + bne _020ED94C + cmp r7, #0 + bne _020ED964 +_020ED94C: + ldr r1, _020EDEA4 ; =0x7FF00000 + cmp sb, r1 + bgt _020ED964 + bne _020ED988 + cmp r0, #0 + beq _020ED988 +_020ED964: + ldr r0, [sp, #0xa8] + ldr r1, [sp, #0xac] + ldr r2, [sp, #0xb0] + ldr r3, [sp, #0xb4] + bl _dadd + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020ED988: + cmp r6, #0 + mov r5, #0 + bge _020ED9F0 + ldr r1, _020EDEA8 ; =0x43400000 + cmp sb, r1 + movge r5, #2 + bge _020ED9F0 + sub r1, r1, #0x3500000 + cmp sb, r1 + blt _020ED9F0 + ldr r1, _020EDEAC ; =0xFFFFFC01 + add r1, r1, sb, asr #20 + cmp r1, #0x14 + ble _020ED9D8 + rsb r2, r1, #0x34 + mov r1, r0, lsr r2 + cmp r0, r1, lsl r2 + andeq r1, r1, #1 + rsbeq r5, r1, #2 + b _020ED9F0 +_020ED9D8: + cmp r0, #0 + rsbeq r2, r1, #0x14 + moveq r1, sb, asr r2 + cmpeq sb, r1, lsl r2 + andeq r1, r1, #1 + rsbeq r5, r1, #2 +_020ED9F0: + cmp r0, #0 + bne _020EDB4C + ldr r1, _020EDEA4 ; =0x7FF00000 + cmp sb, r1 + bne _020EDAA4 + add r0, r4, #0x100000 + add r0, r0, #0xc0000000 + orrs r0, r0, r7 + bne _020EDA38 + ldr r0, [sp, #0xb0] + ldr r1, [sp, #0xb4] + mov r2, r0 + mov r3, r1 + bl _dsub + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDA38: + sub r0, r1, #0x40000000 + cmp r4, r0 + blt _020EDA68 + cmp r8, #0 + ldrge r0, [sp, #0xb0] + ldrge r1, [sp, #0xb4] + movlt r0, #0 + add sp, sp, #0x80 + movlt r1, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDA68: + cmp r8, #0 + mov r0, #0 + addge sp, sp, #0x80 + movge r1, r0 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addge sp, sp, #0x10 + bxge lr + ldr r2, [sp, #0xb0] + ldr r3, [sp, #0xb4] + mov r1, r0 + bl _dsub + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDAA4: + sub r0, r1, #0x40000000 + cmp sb, r0 + bne _020EDAF0 + cmp r8, #0 + ldrge r0, [sp, #0xa8] + ldrge r1, [sp, #0xac] + addge sp, sp, #0x80 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addge sp, sp, #0x10 + bxge lr + ldr r2, [sp, #0xa8] + ldr r3, [sp, #0xac] + sub r1, r1, #0x40000000 + mov r0, #0 + bl _ddiv + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDAF0: + cmp r8, #0x40000000 + bne _020EDB1C + ldr r0, [sp, #0xa8] + ldr r1, [sp, #0xac] + mov r2, r0 + mov r3, r1 + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDB1C: + ldr r0, _020EDEB0 ; =0x3FE00000 + cmp r8, r0 + bne _020EDB4C + cmp r6, #0 + blt _020EDB4C + ldr r0, [sp, #0xa8] + ldr r1, [sp, #0xac] + bl _dsqrt + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDB4C: + ldr r0, [sp, #0xa8] + ldr r1, [sp, #0xac] + bl fabs + str r0, [sp, #0x70] + str r1, [sp, #0x74] + cmp r7, #0 + bne _020EDC50 + ldr r0, _020EDEA4 ; =0x7FF00000 + cmp r4, r0 + cmpne r4, #0 + subne r0, r0, #0x40000000 + cmpne r4, r0 + bne _020EDC50 + ldr r2, [sp, #0x70] + ldr r3, [sp, #0x74] + str r2, [sp, #0x78] + str r3, [sp, #0x7c] + cmp r8, #0 + bge _020EDBAC + ldr r1, _020EDEA0 ; =0x3FF00000 + mov r0, #0 + bl _ddiv + str r0, [sp, #0x78] + str r1, [sp, #0x7c] +_020EDBAC: + cmp r6, #0 + bge _020EDC38 + add r0, r4, #0x100000 + add r0, r0, #0xc0000000 + orrs r0, r0, r5 + bne _020EDC14 + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + mov r2, r0 + mov r3, r1 + bl _dsub + mov r4, r0 + mov r5, r1 + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + mov r2, r0 + mov r3, r1 + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, r5 + bl _ddiv + str r0, [sp, #0x78] + str r1, [sp, #0x7c] + b _020EDC38 +_020EDC14: + cmp r5, #1 + bne _020EDC38 + mov r0, #0 + ldr r2, [sp, #0x78] + ldr r3, [sp, #0x7c] + mov r1, r0 + bl _dsub + str r0, [sp, #0x78] + str r1, [sp, #0x7c] +_020EDC38: + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDC50: + mov r0, r6, asr #0x1f + add r7, r0, #1 + orrs r0, r7, r5 + bne _020EDC88 + ldr r0, _020EDEB4 ; =_021110EC + ldr r1, _020EDEB8 ; =_021E58C0 + ldr r0, [r0] + mov r2, #0x21 + str r2, [r1] + bl _f2d + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDC88: + ldr r3, _020EDEBC ; =0x41E00000 + cmp sb, r3 + ble _020EDF8C + add r0, r3, #0x2100000 + cmp sb, r0 + ble _020EDCF8 + ldr r1, _020EDEC0 ; =0x3FEFFFFF + cmp r4, r1 + bgt _020EDCCC + cmp r8, #0 + mov r0, #0 + addlt r1, r1, #0x40000001 + add sp, sp, #0x80 + movge r1, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDCCC: + add r0, r1, #1 + cmp r4, r0 + blt _020EDCF8 + cmp r8, #0 + mov r0, #0 + addgt r1, r1, #0x40000001 + add sp, sp, #0x80 + movle r1, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDCF8: + ldr r2, _020EDEC0 ; =0x3FEFFFFF + cmp r4, r2 + bge _020EDD24 + cmp r8, #0 + mov r0, #0 + addlt r1, r2, #0x40000001 + add sp, sp, #0x80 + movge r1, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDD24: + add r0, r2, #1 + cmp r4, r0 + ble _020EDD50 + cmp r8, #0 + mov r0, #0 + addgt r1, r2, #0x40000001 + add sp, sp, #0x80 + movle r1, r0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EDD50: + ldr r0, [sp, #0xa8] + ldr r1, [sp, #0xac] + add r3, r2, #1 + mov r2, #0 + bl _dsub + mov r2, r0 + mov r3, r1 + str r0, [sp, #0x50] + str r1, [sp, #0x54] + bl _dmul + mov r6, r1 + mov r4, r0 + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + ldr r1, _020EDEC4 ; =0x3FD00000 + mov r0, #0 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDEC8 ; =0x55555555 + sub r1, r0, #0x15800000 + bl _dsub + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, #0 + ldr r1, _020EDEB0 ; =0x3FE00000 + bl _dsub + mov r2, r0 + mov r0, r4 + mov r3, r1 + mov r1, r6 + bl _dmul + mov r6, r0 + mov r8, r1 + mov r0, #0x60000000 + ldr r1, _020EDECC ; =0x3FF71547 + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + bl _dmul + mov r4, r0 + mov sb, r1 + ldr r0, _020EDED0 ; =0xF85DDF44 + ldr r1, _020EDED4 ; =0x3E54AE0B + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + bl _dmul + mov fp, r0 + mov sl, r1 + ldr r0, _020EDED8 ; =0x652B82FE + ldr r1, _020EDECC ; =0x3FF71547 + mov r2, r6 + mov r3, r8 + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, fp + mov r1, sl + bl _dsub + mov r6, r0 + mov r8, r1 + mov r0, r4 + mov r1, sb + mov r2, r6 + mov r3, r8 + bl _dadd + mov r2, r4 + mov r3, sb + str r1, [sp, #0x5c] + mov r0, #0 + str r0, [sp, #0x58] + bl _dsub + mov r2, r0 + mov r0, r6 + mov r3, r1 + mov r1, r8 + bl _dsub + mov r4, r0 + mov r8, r1 + b _020EE4E8 + .align 2, 0 +_020EDEA0: .word 0x3FF00000 +_020EDEA4: .word 0x7FF00000 +_020EDEA8: .word 0x43400000 +_020EDEAC: .word 0xFFFFFC01 +_020EDEB0: .word 0x3FE00000 +_020EDEB4: .word _021110EC +_020EDEB8: .word _021E58C0 +_020EDEBC: .word 0x41E00000 +_020EDEC0: .word 0x3FEFFFFF +_020EDEC4: .word 0x3FD00000 +_020EDEC8: .word 0x55555555 +_020EDECC: .word 0x3FF71547 +_020EDED0: .word 0xF85DDF44 +_020EDED4: .word 0x3E54AE0B +_020EDED8: .word 0x652B82FE +_020EDEDC: .word 0x0003988E +_020EDEE0: .word 0x000BB67A +_020EDEE4: .word _0210E94C +_020EDEE8: .word 0x4A454EEF +_020EDEEC: .word 0x3FCA7E28 +_020EDEF0: .word 0x93C9DB65 +_020EDEF4: .word 0x3FCD864A +_020EDEF8: .word 0xA91D4101 +_020EDEFC: .word 0x3FD17460 +_020EDF00: .word 0x518F264D +_020EDF04: .word 0x3FD55555 +_020EDF08: .word 0xDB6FABFF +_020EDF0C: .word 0x3FDB6DB6 +_020EDF10: .word 0x33333303 +_020EDF14: .word 0x3FE33333 +_020EDF18: .word 0x40080000 +_020EDF1C: .word 0x3FEEC709 +_020EDF20: .word 0x145B01F5 +_020EDF24: .word 0xBE3E2FE0 +_020EDF28: .word 0xDC3A03FD +_020EDF2C: .word _0210E95C +_020EDF30: .word _0210E93C +_020EDF34: .word 0x40900000 +_020EDF38: .word 0x8800759C +_020EDF3C: .word 0x7E37E43C +_020EDF40: .word 0x3C971547 +_020EDF44: .word 0x3F6F3400 +_020EDF48: .word 0xC2F8F359 +_020EDF4C: .word 0x01A56E1F +_020EDF50: .word 0x3FE62E43 +_020EDF54: .word 0xFEFA39EF +_020EDF58: .word 0x3FE62E42 +_020EDF5C: .word 0x0CA86C39 +_020EDF60: .word 0xBE205C61 +_020EDF64: .word 0x72BEA4D0 +_020EDF68: .word 0x3E663769 +_020EDF6C: .word 0xC5D26BF1 +_020EDF70: .word 0xBEBBBD41 +_020EDF74: .word 0xAF25DE2C +_020EDF78: .word 0x3F11566A +_020EDF7C: .word 0x16BEBD93 +_020EDF80: .word 0xBF66C16C +_020EDF84: .word 0x5555553E +_020EDF88: .word 0x3FC55555 +_020EDF8C: + cmp r4, #0x100000 + mov r6, #0 + bge _020EDFBC + ldr r0, [sp, #0x70] + ldr r1, [sp, #0x74] + mov r2, r6 + add r3, r3, #0x1600000 + bl _dmul + mov r4, r1 + str r0, [sp, #0x70] + str r4, [sp, #0x74] + sub r6, r6, #0x35 +_020EDFBC: + ldr r0, _020EDEAC ; =0xFFFFFC01 + ldr r1, _020EDEDC ; =0x0003988E + and r2, r4, r0, lsr #12 + add r0, r0, r4, asr #20 + orr sb, r2, #0xff00000 + cmp r2, r1 + add r6, r6, r0 + orr sb, sb, #0x30000000 + movle r8, #0 + ble _020EDFFC + ldr r0, _020EDEE0 ; =0x000BB67A + cmp r2, r0 + movlt r8, #1 + addge r6, r6, #1 + subge sb, sb, #0x100000 + movge r8, #0 +_020EDFFC: + ldr r2, _020EDEE4 ; =_0210E94C + ldr r0, [sp, #0x70] + add r1, r2, r8, lsl #3 + ldr r3, [r1, #4] + ldr r2, [r2, r8, lsl #3] + mov r1, sb + str sb, [sp, #0x74] + bl _dsub + ldr r2, _020EDEE4 ; =_0210E94C + mov sl, r0 + add r3, r2, r8, lsl #3 + mov r4, r1 + ldr r0, [sp, #0x70] + ldr r2, [r2, r8, lsl #3] + ldr r3, [r3, #4] + mov r1, sb + bl _dadd + mov r3, r1 + mov r2, r0 + ldr r1, _020EDEA0 ; =0x3FF00000 + mov r0, #0 + bl _ddiv + str r1, [sp, #0x24] + mov fp, r0 + ldr r3, [sp, #0x24] + mov r0, sl + mov r1, r4 + mov r2, fp + bl _dmul + mov r2, sb, asr #1 + orr r2, r2, #0x20000000 + mov sb, r1 + add r2, r2, #0x80000 + add r1, r2, r8, lsl #18 + ldr r2, _020EDEE4 ; =_0210E94C + str r0, [sp, #0x28] + add r3, r2, r8, lsl #3 + mov r0, #0 + ldr r2, [r2, r8, lsl #3] + ldr r3, [r3, #4] + str sb, [sp, #0x4c] + str r1, [sp, #0x44] + str r0, [sp, #0x48] + str r0, [sp, #0x40] + bl _dsub + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x70] + ldr r1, [sp, #0x74] + bl _dsub + str r0, [sp, #0x2c] + str r1, [sp, #0x1c] + ldr r0, [sp, #0x48] + ldr r2, [sp, #0x40] + ldr r3, [sp, #0x44] + mov r1, sb + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, sl + mov r1, r4 + bl _dsub + mov sl, r0 + mov r4, r1 + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x1c] + ldr r0, [sp, #0x48] + mov r1, sb + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, sl + mov r1, r4 + bl _dsub + mov r3, r1 + mov r2, r0 + ldr r1, [sp, #0x24] + mov r0, fp + bl _dmul + str r0, [sp, #0x30] + ldr r0, [sp, #0x28] + str r1, [sp, #0x14] + mov r1, sb + mov r2, r0 + mov r3, sb + bl _dmul + mov r4, r0 + mov sl, r1 + mov r2, r4 + mov r3, sl + bl _dmul + str r0, [sp, #0x34] + mov fp, r1 + ldr r0, _020EDEE8 ; =0x4A454EEF + ldr r1, _020EDEEC ; =0x3FCA7E28 + mov r2, r4 + mov r3, sl + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDEF0 ; =0x93C9DB65 + ldr r1, _020EDEF4 ; =0x3FCD864A + bl _dadd + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDEF8 ; =0xA91D4101 + ldr r1, _020EDEFC ; =0x3FD17460 + bl _dadd + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF00 ; =0x518F264D + ldr r1, _020EDF04 ; =0x3FD55555 + bl _dadd + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF08 ; =0xDB6FABFF + ldr r1, _020EDF0C ; =0x3FDB6DB6 + bl _dadd + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF10 ; =0x33333303 + ldr r1, _020EDF14 ; =0x3FE33333 + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x34] + mov r1, fp + bl _dmul + mov r4, r0 + mov sl, r1 + ldr r0, [sp, #0x48] + ldr r2, [sp, #0x28] + mov r1, sb + mov r3, sb + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x30] + ldr r1, [sp, #0x14] + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dadd + mov r4, r0 + ldr r0, [sp, #0x48] + mov sl, r1 + mov r1, sb + mov r2, r0 + mov r3, r1 + bl _dmul + str r1, [sp, #0xc] + mov fp, r0 + ldr r1, _020EDF18 ; =0x40080000 + ldr r3, [sp, #0xc] + mov r0, #0 + mov r2, fp + bl _dadd + mov r2, r4 + mov r3, sl + bl _dadd + mov r0, #0 + ldr r3, _020EDF18 ; =0x40080000 + mov r2, r0 + str r1, [sp, #0x44] + str r0, [sp, #0x40] + bl _dsub + ldr r3, [sp, #0xc] + mov r2, fp + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dsub + str r0, [sp, #0x38] + str r1, [sp, #4] + ldr r0, [sp, #0x48] + ldr r2, [sp, #0x40] + ldr r3, [sp, #0x44] + mov r1, sb + bl _dmul + mov r4, r0 + mov sl, r1 + ldr r0, [sp, #0x30] + ldr r1, [sp, #0x14] + ldr r2, [sp, #0x40] + ldr r3, [sp, #0x44] + bl _dmul + str r0, [sp, #0x3c] + mov fp, r1 + ldr r0, [sp, #0x38] + ldr r1, [sp, #4] + ldr r2, [sp, #0x28] + mov r3, sb + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x3c] + mov r1, fp + bl _dadd + mov sb, r0 + mov fp, r1 + mov r0, r4 + mov r1, sl + mov r2, sb + mov r3, fp + bl _dadd + mov r0, #0 + mov r2, r4 + mov r3, sl + str r1, [sp, #0x6c] + str r0, [sp, #0x68] + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, sb + mov r1, fp + bl _dsub + mov sl, r1 + mov fp, r0 + ldr r1, _020EDF1C ; =0x3FEEC709 + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + mov r0, #0xe0000000 + bl _dmul + mov r4, r0 + mov sb, r1 + ldr r0, _020EDF20 ; =0x145B01F5 + ldr r1, _020EDF24 ; =0xBE3E2FE0 + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + bl _dmul + mov r2, fp + mov r3, sl + mov fp, r0 + mov sl, r1 + ldr r0, _020EDF28 ; =0xDC3A03FD + ldr r1, _020EDF1C ; =0x3FEEC709 + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, fp + mov r1, sl + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF2C ; =_0210E95C + add r1, r0, r8, lsl #3 + ldr r0, [r0, r8, lsl #3] + ldr r1, [r1, #4] + bl _dadd + mov fp, r0 + mov sl, r1 + mov r0, r6 + bl _dflt + str r0, [sp, #0x50] + str r1, [sp, #0x54] + mov r0, r4 + mov r1, sb + mov r2, fp + mov r3, sl + bl _dadd + ldr r2, _020EDF30 ; =_0210E93C + add r3, r2, r8, lsl #3 + ldr r2, [r2, r8, lsl #3] + ldr r3, [r3, #4] + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dadd + str r1, [sp, #0x5c] + mov r0, #0 + str r0, [sp, #0x58] + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + bl _dsub + ldr r2, _020EDF30 ; =_0210E93C + add r3, r2, r8, lsl #3 + ldr r2, [r2, r8, lsl #3] + ldr r3, [r3, #4] + bl _dsub + mov r2, r4 + mov r3, sb + bl _dsub + mov r2, r0 + mov r0, fp + mov r3, r1 + mov r1, sl + bl _dsub + mov r4, r0 + mov r8, r1 +_020EE4E8: + sub r0, r5, #1 + ldr r1, [sp, #0xb4] + orrs r0, r7, r0 + ldr r5, _020EDEA0 ; =0x3FF00000 + mov r2, #0 + ldr r0, [sp, #0xb0] + mov r3, r1 + mov r6, #0 + subeq r5, r5, #0x80000000 + str r1, [sp, #0x64] + str r2, [sp, #0x60] + bl _dsub + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x58] + ldr r1, [sp, #0x5c] + bl _dmul + mov r7, r0 + mov sb, r1 + ldr r0, [sp, #0xb0] + ldr r1, [sp, #0xb4] + mov r2, r4 + mov r3, r8 + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, r7 + mov r1, sb + bl _dadd + mov r7, r0 + mov r8, r1 + ldr r0, [sp, #0x60] + ldr r1, [sp, #0x64] + ldr r2, [sp, #0x58] + ldr r3, [sp, #0x5c] + bl _dmul + mov r2, r0 + mov r3, r1 + mov r0, r7 + mov r1, r8 + str r2, [sp, #0x68] + str r3, [sp, #0x6c] + bl _dadd + mov sb, r1 + ldr r2, _020EDF34 ; =0x40900000 + str r0, [sp, #0x78] + str sb, [sp, #0x7c] + cmp sb, r2 + blt _020EE674 + add r1, sb, #0xf700000 + add r1, r1, #0xb0000000 + orrs r0, r1, r0 + beq _020EE5F4 + ldr r0, _020EDF38 ; =0x8800759C + ldr r1, _020EDF3C ; =0x7E37E43C + mov r2, r6 + mov r3, r5 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF38 ; =0x8800759C + ldr r1, _020EDF3C ; =0x7E37E43C + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EE5F4: + ldr r0, _020EDED8 ; =0x652B82FE + ldr r1, _020EDF40 ; =0x3C971547 + mov r2, r7 + mov r3, r8 + bl _dadd + mov r4, r0 + mov sl, r1 + ldr r0, [sp, #0x78] + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + mov r1, sb + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sl + bl _dgr + bls _020EE728 + ldr r0, _020EDF38 ; =0x8800759C + ldr r1, _020EDF3C ; =0x7E37E43C + mov r2, r6 + mov r3, r5 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF38 ; =0x8800759C + ldr r1, _020EDF3C ; =0x7E37E43C + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EE674: + bic r3, sb, #0x80000000 + add r2, r2, #0xcc00 + cmp r3, r2 + blt _020EE728 + ldr r2, _020EDF44 ; =0x3F6F3400 + add r2, sb, r2 + orrs r2, r2, r0 + beq _020EE6CC + ldr r0, _020EDF48 ; =0xC2F8F359 + ldr r1, _020EDF4C ; =0x01A56E1F + mov r2, r6 + mov r3, r5 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF48 ; =0xC2F8F359 + ldr r1, _020EDF4C ; =0x01A56E1F + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EE6CC: + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, r7 + mov r1, r8 + bl _dleq + bhi _020EE728 + ldr r0, _020EDF48 ; =0xC2F8F359 + ldr r1, _020EDF4C ; =0x01A56E1F + mov r2, r6 + mov r3, r5 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF48 ; =0xC2F8F359 + ldr r1, _020EDF4C ; =0x01A56E1F + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020EE728: + ldr r0, _020EDEAC ; =0xFFFFFC01 + bic r3, sb, #0x80000000 + ldr r1, _020EDEB0 ; =0x3FE00000 + add r2, r0, r3, asr #20 + cmp r3, r1 + mov r4, #0 + ble _020EE7A4 + mov r1, #0x100000 + add r2, r2, #1 + add r2, sb, r1, asr r2 + bic r3, r2, #0x80000000 + add r0, r0, r3, asr #20 + sub r3, r1, #1 + mvn r3, r3, asr r0 + sub r1, r1, #1 + and r1, r2, r1 + and r2, r2, r3 + str r2, [sp, #0x54] + str r4, [sp, #0x50] + orr r1, r1, #0x100000 + rsb r0, r0, #0x14 + mov r4, r1, asr r0 + cmp sb, #0 + ldr r0, [sp, #0x68] + ldr r1, [sp, #0x6c] + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + rsblt r4, r4, #0 + bl _dsub + str r0, [sp, #0x68] + str r1, [sp, #0x6c] +_020EE7A4: + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + mov r0, r7 + mov r1, r8 + bl _dadd + mov r3, r1 + mov r0, #0 + ldr r1, _020EDF50 ; =0x3FE62E43 + mov r2, r0 + str r3, [sp, #0x54] + str r0, [sp, #0x50] + bl _dmul + mov sb, r0 + mov sl, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + ldr r2, [sp, #0x68] + ldr r3, [sp, #0x6c] + bl _dsub + mov r2, r0 + mov r0, r7 + mov r3, r1 + mov r1, r8 + bl _dsub + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF54 ; =0xFEFA39EF + ldr r1, _020EDF58 ; =0x3FE62E42 + bl _dmul + mov r7, r0 + mov r8, r1 + ldr r0, _020EDF5C ; =0x0CA86C39 + ldr r1, _020EDF60 ; =0xBE205C61 + ldr r2, [sp, #0x50] + ldr r3, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r0, r7 + mov r3, r1 + mov r1, r8 + bl _dadd + mov r7, r0 + mov r8, r1 + mov r0, sb + mov r1, sl + mov r2, r7 + mov r3, r8 + bl _dadd + mov r2, sb + mov r3, sl + str r0, [sp, #0x78] + str r1, [sp, #0x7c] + bl _dsub + mov r2, r0 + mov r3, r1 + mov r0, r7 + mov r1, r8 + bl _dsub + mov r8, r0 + mov sb, r1 + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + mov r2, r0 + mov r3, r1 + bl _dmul + mov r2, r0 + str r2, [sp, #0x50] + mov r3, r1 + str r3, [sp, #0x54] + ldr r0, _020EDF64 ; =0x72BEA4D0 + ldr r1, _020EDF68 ; =0x3E663769 + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF6C ; =0xC5D26BF1 + ldr r1, _020EDF70 ; =0xBEBBBD41 + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF74 ; =0xAF25DE2C + ldr r1, _020EDF78 ; =0x3F11566A + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF7C ; =0x16BEBD93 + ldr r1, _020EDF80 ; =0xBF66C16C + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, _020EDF84 ; =0x5555553E + ldr r1, _020EDF88 ; =0x3FC55555 + bl _dadd + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x50] + ldr r1, [sp, #0x54] + bl _dmul + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + bl _dsub + mov r2, r0 + str r2, [sp, #0x58] + mov r3, r1 + str r3, [sp, #0x5c] + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + bl _dmul + mov r7, r0 + mov sl, r1 + ldr r0, [sp, #0x58] + ldr r1, [sp, #0x5c] + mov r2, #0 + mov r3, #0x40000000 + bl _dsub + mov r2, r0 + mov r0, r7 + mov r3, r1 + mov r1, sl + bl _ddiv + mov r7, r0 + mov sl, r1 + ldr r0, [sp, #0x78] + ldr r1, [sp, #0x7c] + mov r2, r8 + mov r3, sb + bl _dmul + mov r2, r0 + mov r0, r8 + mov r3, r1 + mov r1, sb + bl _dadd + mov r2, r0 + mov r0, r7 + mov r3, r1 + mov r1, sl + bl _dsub + ldr r2, [sp, #0x78] + ldr r3, [sp, #0x7c] + bl _dsub + mov r3, r1 + mov r2, r0 + ldr r1, _020EDEA0 ; =0x3FF00000 + mov r0, #0 + bl _dsub + add r3, r1, r4, lsl #20 + mov r2, r3, asr #0x14 + str r0, [sp, #0x78] + cmp r2, #0 + str r1, [sp, #0x7c] + addgt r0, sp, #0x78 + strgt r3, [r0, #4] + bgt _020EEA58 + mov r2, r4 + bl scalbn + str r0, [sp, #0x78] + str r1, [sp, #0x7c] +_020EEA58: + ldr r2, [sp, #0x78] + ldr r3, [sp, #0x7c] + mov r0, r6 + mov r1, r5 + bl _dmul + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end __ieee754_pow + + arm_func_start copysign +copysign: ; 0x020EEA7C + stmdb sp!, {r0, r1, r2, r3} + ldr r1, [sp, #4] + ldr r0, [sp, #0xc] + bic r1, r1, #0x80000000 + and r0, r0, #0x80000000 + orr r1, r1, r0 + ldr r0, [sp] + str r1, [sp, #4] + add sp, sp, #0x10 + bx lr + arm_func_end copysign + + arm_func_start fabs +fabs: ; 0x020EEAA4 + stmdb sp!, {r0, r1, r2, r3} + add r2, sp, #0 + ldr r1, [r2, #4] + ldr r0, [sp] + bic r1, r1, #0x80000000 + str r1, [r2, #4] + add sp, sp, #0x10 + bx lr + arm_func_end fabs + + arm_func_start frexp +frexp: ; 0x020EEAC4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + ldr r1, [sp, #0xc] + ldr r0, _020EEB70 ; =0x7FF00000 + mov r4, r2 + bic r3, r1, #0x80000000 + mov r2, #0 + str r2, [r4] + cmp r3, r0 + ldr r0, [sp, #8] + bge _020EEAF8 + orrs r0, r3, r0 + bne _020EEB0C +_020EEAF8: + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EEB0C: + cmp r3, #0x100000 + bge _020EEB38 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + ldr r3, _020EEB74 ; =0x43500000 + bl _dmul + mvn r2, #0x35 + str r0, [sp, #8] + str r1, [sp, #0xc] + str r2, [r4] + bic r3, r1, #0x80000000 +_020EEB38: + ldr r2, _020EEB78 ; =0x800FFFFF + ldr r0, _020EEB7C ; =0xFFFFFC02 + and r1, r1, r2 + orr r1, r1, #0xfe00000 + orr r1, r1, #0x30000000 + ldr r2, [r4] + add r0, r0, r3, asr #20 + add r2, r2, r0 + ldr r0, [sp, #8] + str r2, [r4] + str r1, [sp, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020EEB70: .word 0x7FF00000 +_020EEB74: .word 0x43500000 +_020EEB78: .word 0x800FFFFF +_020EEB7C: .word 0xFFFFFC02 + arm_func_end frexp + + arm_func_start ldexp +ldexp: ; 0x020EEB80 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + mov r4, r2 + bl __fpclassifyd + cmp r0, #2 + ble _020EEBB8 + mov r0, #0 + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + mov r1, r0 + bl _deq + bne _020EEBCC +_020EEBB8: + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EEBCC: + ldr r3, [sp, #0xc] + ldr r0, _020EEDA0 ; =0x7FF00000 + ldr r1, [sp, #8] + and r0, r3, r0 + movs ip, r0, asr #0x14 + bne _020EEC58 + bic r0, r3, #0x80000000 + orrs r0, r1, r0 + ldreq r0, [sp, #8] + ldreq r1, [sp, #0xc] + ldmeqia sp!, {r4, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + ldr r3, _020EEDA4 ; =0x43500000 + mov r2, #0 + bl _dmul + mov r3, r1 + ldr r1, _020EEDA0 ; =0x7FF00000 + ldr ip, _020EEDA8 ; =0xFFFF3CB0 + and r1, r3, r1 + mov r2, r0 + mov r0, r1, asr #0x14 + str r2, [sp, #8] + str r3, [sp, #0xc] + cmp r4, ip + sub ip, r0, #0x36 + bge _020EEC58 + ldr r0, _020EEDAC ; =0xC2F8F359 + ldr r1, _020EEDB0 ; =0x01A56E1F + bl _dmul + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EEC58: + ldr r0, _020EEDB4 ; =0x000007FF + cmp ip, r0 + bne _020EEC84 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + mov r2, r0 + mov r3, r1 + bl _dadd + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EEC84: + add r2, ip, r4 + sub r0, r0, #1 + cmp r2, r0 + ble _020EECC8 + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + ldr r0, _020EEDB8 ; =0x8800759C + ldr r1, _020EEDBC ; =0x7E37E43C + bl copysign + mov r2, r0 + mov r3, r1 + ldr r0, _020EEDB8 ; =0x8800759C + ldr r1, _020EEDBC ; =0x7E37E43C + bl _dmul + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EECC8: + cmp r2, #0 + ble _020EECF0 + ldr r1, _020EEDC0 ; =0x800FFFFF + ldr r0, [sp, #8] + and r1, r3, r1 + orr r1, r1, r2, lsl #20 + str r1, [sp, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EECF0: + mvn r0, #0x35 + cmp r2, r0 + bgt _020EED70 + ldr r0, _020EEDC4 ; =0x0000C350 + cmp r4, r0 + ble _020EED3C + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + ldr r0, _020EEDB8 ; =0x8800759C + ldr r1, _020EEDBC ; =0x7E37E43C + bl copysign + mov r2, r0 + mov r3, r1 + ldr r0, _020EEDB8 ; =0x8800759C + ldr r1, _020EEDBC ; =0x7E37E43C + bl _dmul + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EED3C: + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + ldr r0, _020EEDAC ; =0xC2F8F359 + ldr r1, _020EEDB0 ; =0x01A56E1F + bl copysign + mov r2, r0 + mov r3, r1 + ldr r0, _020EEDAC ; =0xC2F8F359 + ldr r1, _020EEDB0 ; =0x01A56E1F + bl _dmul + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr +_020EED70: + ldr r0, _020EEDC0 ; =0x800FFFFF + add r1, r2, #0x36 + and r0, r3, r0 + orr r3, r0, r1, lsl #20 + ldr r2, [sp, #8] + ldr r1, _020EEDC8 ; =0x3C900000 + mov r0, #0 + str r3, [sp, #0xc] + bl _dmul + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020EEDA0: .word 0x7FF00000 +_020EEDA4: .word 0x43500000 +_020EEDA8: .word 0xFFFF3CB0 +_020EEDAC: .word 0xC2F8F359 +_020EEDB0: .word 0x01A56E1F +_020EEDB4: .word 0x000007FF +_020EEDB8: .word 0x8800759C +_020EEDBC: .word 0x7E37E43C +_020EEDC0: .word 0x800FFFFF +_020EEDC4: .word 0x0000C350 +_020EEDC8: .word 0x3C900000 + arm_func_end ldexp + + arm_func_start pow +pow: ; 0x020EEDCC + ldr ip, _020EEDD4 ; =__ieee754_pow + bx ip + .align 2, 0 +_020EEDD4: .word __ieee754_pow + arm_func_end pow + + arm_func_start __must_round +__must_round: ; 0x020EEDD8 + add r3, r0, #5 + ldrb r2, [r3, r1] + add ip, r3, r1 + cmp r2, #5 + movhi r0, #1 + bxhi lr + mvnlo r0, #0 + bxlo lr + ldrb r2, [r0, #4] + add ip, ip, #1 + add r3, r3, r2 + cmp ip, r3 + bhs _020EEE28 +_020EEE0C: + ldrb r2, [ip] + cmp r2, #0 + movne r0, #1 + bxne lr + add ip, ip, #1 + cmp ip, r3 + blo _020EEE0C +_020EEE28: + sub r1, r1, #1 + add r0, r0, r1 + ldrb r0, [r0, #5] + tst r0, #1 + movne r0, #1 + mvneq r0, #0 + bx lr + arm_func_end __must_round + + arm_func_start __dorounddecup +__dorounddecup: ; 0x020EEE44 + add r3, r0, #5 + add r1, r3, r1 + sub ip, r1, #1 + mov r1, #0 +_020EEE54: + ldrb r2, [ip] + cmp r2, #9 + addlo r0, r2, #1 + strlob r0, [ip] + bxlo lr + cmp ip, r3 + bne _020EEE88 + mov r1, #1 + strb r1, [ip] + ldrsh r1, [r0, #2] + add r1, r1, #1 + strh r1, [r0, #2] + bx lr +_020EEE88: + strb r1, [ip], #-1 + b _020EEE54 + bx lr + arm_func_end __dorounddecup + + arm_func_start __rounddec +__rounddec: ; 0x020EEE94 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + cmp r4, #0 + ldmleia sp!, {r3, r4, r5, pc} + ldrb r2, [r5, #4] + cmp r4, r2 + ldmgeia sp!, {r3, r4, r5, pc} + bl __must_round + strb r4, [r5, #4] + cmp r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl __dorounddecup + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __rounddec + + arm_func_start __ull2dec +__ull2dec: ; 0x020EEED4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov r0, #0 + mov r8, r2 + strb r0, [sl] + mov sb, r1 + cmp r8, #0 + strb r0, [sl, #4] + cmpeq sb, #0 + beq _020EEF60 + mov r6, #0xa + mov fp, r0 + mov r5, r0 + mov r4, r0 +_020EEF0C: + ldrb r1, [sl, #4] + mov r0, sb + mov r2, r6 + add r3, r1, #1 + mov r7, r1 + strb r3, [sl, #4] + mov r1, r8 + mov r3, fp + bl _ull_mod + add r1, sl, r7 + strb r0, [r1, #5] + mov r0, sb + mov r1, r8 + mov r2, #0xa + mov r3, #0 + bl _ll_udiv + mov r8, r1 + mov sb, r0 + cmp r8, r5 + cmpeq sb, r4 + bne _020EEF0C +_020EEF60: + ldrb r0, [sl, #4] + add r2, sl, #5 + add r0, r2, r0 + sub r3, r0, #1 + cmp r2, r3 + bhs _020EEF90 +_020EEF78: + ldrb r0, [r3] + ldrb r1, [r2] + strb r0, [r2], #1 + strb r1, [r3], #-1 + cmp r2, r3 + blo _020EEF78 +_020EEF90: + ldrb r0, [sl, #4] + sub r0, r0, #1 + strh r0, [sl, #2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end __ull2dec + + arm_func_start __timesdec +__timesdec: ; 0x020EEFA0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + ldrb r6, [r1, #4] + ldrb r5, [r2, #4] + mov r4, #0 + add r3, sp, #0 + add r5, r6, r5 + sub r5, r5, #1 + add r3, r3, r5 + add r6, r3, #1 + mov r7, r6 + strb r4, [r0] + cmp r5, #0 + ble _020EF068 + add lr, r1, #5 + add fp, r2, #5 +_020EEFE0: + ldrb r3, [r2, #4] + sub sl, r3, #1 + sub r3, r5, sl + subs sb, r3, #1 + ldrb r3, [r1, #4] + movmi sb, #0 + submi sl, r5, #1 + add r8, sl, #1 + sub r3, r3, sb + cmp r8, r3 + movgt r8, r3 + add sl, fp, sl + add sb, lr, sb + cmp r8, #0 + ble _020EF034 +_020EF01C: + ldrb ip, [sb], #1 + ldrb r3, [sl], #-1 + sub r8, r8, #1 + cmp r8, #0 + mla r4, ip, r3, r4 + bgt _020EF01C +_020EF034: + ldr r3, _020EF120 ; =0xCCCCCCCD + sub r5, r5, #1 + umull r8, sb, r4, r3 + mov sb, sb, lsr #3 + cmp r5, #0 + mov sl, #0xa + umull r8, sb, sl, sb + sub sb, r4, r8 + strb sb, [r6, #-1]! + mov r8, r4 + umull r3, r4, r8, r3 + mov r4, r4, lsr #3 + bgt _020EEFE0 +_020EF068: + ldrsh r3, [r1, #2] + ldrsh r1, [r2, #2] + cmp r4, #0 + add r1, r3, r1 + strh r1, [r0, #2] + beq _020EF090 + strb r4, [r6, #-1]! + ldrsh r1, [r0, #2] + add r1, r1, #1 + strh r1, [r0, #2] +_020EF090: + mov r3, #0 + b _020EF0A8 +_020EF098: + ldrb r2, [r6], #1 + add r1, r0, r3 + add r3, r3, #1 + strb r2, [r1, #5] +_020EF0A8: + cmp r3, #0x20 + bge _020EF0B8 + cmp r6, r7 + blo _020EF098 +_020EF0B8: + cmp r6, r7 + addhs sp, sp, #0x40 + strb r3, [r0, #4] + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrb r1, [r6] + cmp r1, #5 + addlo sp, sp, #0x40 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bne _020EF110 + add r2, r6, #1 + cmp r2, r7 + bhs _020EF100 +_020EF0E8: + ldrb r1, [r2] + cmp r1, #0 + bne _020EF110 + add r2, r2, #1 + cmp r2, r7 + blo _020EF0E8 +_020EF100: + ldrb r1, [r6, #-1] + tst r1, #1 + addeq sp, sp, #0x40 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EF110: + ldrb r1, [r0, #4] + bl __dorounddecup + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020EF120: .word 0xCCCCCCCD + arm_func_end __timesdec + + arm_func_start __str2dec +__str2dec: ; 0x020EF124 + stmdb sp!, {r3, lr} + strh r2, [r0, #2] + mov ip, #0 + strb ip, [r0] + b _020EF14C +_020EF138: + ldrsb r3, [r1], #1 + add r2, r0, ip + add ip, ip, #1 + sub r3, r3, #0x30 + strb r3, [r2, #5] +_020EF14C: + cmp ip, #0x20 + bge _020EF160 + ldrsb r2, [r1] + cmp r2, #0 + bne _020EF138 +_020EF160: + strb ip, [r0, #4] + ldrsb r2, [r1] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + cmp r2, #5 + ldmltia sp!, {r3, pc} + bgt _020EF1B4 + ldrsb r2, [r1, #1] + add r1, r1, #1 + cmp r2, #0 + beq _020EF1A0 +_020EF18C: + cmp r2, #0x30 + bne _020EF1B4 + ldrsb r2, [r1, #1]! + cmp r2, #0 + bne _020EF18C +_020EF1A0: + sub r1, ip, #1 + add r1, r0, r1 + ldrb r1, [r1, #5] + tst r1, #1 + ldmeqia sp!, {r3, pc} +_020EF1B4: + ldrb r1, [r0, #4] + bl __dorounddecup + ldmia sp!, {r3, pc} + arm_func_end __str2dec + + arm_func_start __two_exp +__two_exp: ; 0x020EF1C0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x4c + mov r4, r1 + mvn r2, #0x34 + mov r5, r0 + cmp r4, r2 + bgt _020EF1F0 + bge _020EF2BC + sub r0, r2, #0xb + cmp r4, r0 + beq _020EF2A4 + b _020EF44C +_020EF1F0: + add r1, r4, #0x20 + cmp r1, #0x28 + addls pc, pc, r1, lsl #2 + b _020EF44C +_020EF200: ; jump table + b _020EF2D0 ; case 0 + b _020EF44C ; case 1 + b _020EF44C ; case 2 + b _020EF44C ; case 3 + b _020EF44C ; case 4 + b _020EF44C ; case 5 + b _020EF44C ; case 6 + b _020EF44C ; case 7 + b _020EF44C ; case 8 + b _020EF44C ; case 9 + b _020EF44C ; case 10 + b _020EF44C ; case 11 + b _020EF44C ; case 12 + b _020EF44C ; case 13 + b _020EF44C ; case 14 + b _020EF44C ; case 15 + b _020EF2E4 ; case 16 + b _020EF44C ; case 17 + b _020EF44C ; case 18 + b _020EF44C ; case 19 + b _020EF44C ; case 20 + b _020EF44C ; case 21 + b _020EF44C ; case 22 + b _020EF44C ; case 23 + b _020EF2F8 ; case 24 + b _020EF30C ; case 25 + b _020EF320 ; case 26 + b _020EF334 ; case 27 + b _020EF348 ; case 28 + b _020EF35C ; case 29 + b _020EF370 ; case 30 + b _020EF384 ; case 31 + b _020EF398 ; case 32 + b _020EF3AC ; case 33 + b _020EF3C0 ; case 34 + b _020EF3D4 ; case 35 + b _020EF3E8 ; case 36 + b _020EF3FC ; case 37 + b _020EF410 ; case 38 + b _020EF424 ; case 39 + b _020EF438 ; case 40 +_020EF2A4: + ldr r1, _020EF4F0 ; =_02111408 + mov r0, r5 + mvn r2, #0x13 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF2BC: + ldr r1, _020EF4F4 ; =_02111438 + add r2, r2, #0x25 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF2D0: + ldr r1, _020EF4F8 ; =_02111460 + add r2, r2, #0x2b + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF2E4: + ldr r1, _020EF4FC ; =_02111478 + add r2, r2, #0x30 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF2F8: + ldr r1, _020EF500 ; =_02111488 + add r2, r2, #0x32 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF30C: + ldr r1, _020EF504 ; =_02111490 + add r2, r2, #0x32 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF320: + ldr r1, _020EF508 ; =_02111498 + add r2, r2, #0x33 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF334: + ldr r1, _020EF50C ; =_021114A0 + add r2, r2, #0x33 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF348: + ldr r1, _020EF510 ; =_021114A8 + add r2, r2, #0x33 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF35C: + ldr r1, _020EF514 ; =_021114AC + add r2, r2, #0x34 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF370: + ldr r1, _020EF518 ; =_021114B0 + add r2, r2, #0x34 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF384: + ldr r1, _020EF51C ; =_021114B4 + add r2, r2, #0x34 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF398: + ldr r1, _020EF520 ; =_021114B8 + mov r2, #0 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF3AC: + ldr r1, _020EF524 ; =_021114BC + mov r2, #0 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF3C0: + ldr r1, _020EF528 ; =_021114C0 + mov r2, #0 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF3D4: + ldr r1, _020EF52C ; =_021114C4 + mov r2, #0 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF3E8: + ldr r1, _020EF530 ; =_021114C8 + mov r2, #1 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF3FC: + ldr r1, _020EF534 ; =_021114CC + mov r2, #1 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF410: + ldr r1, _020EF538 ; =_021114D0 + mov r2, #1 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF424: + ldr r1, _020EF53C ; =_021114D4 + mov r2, #2 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF438: + ldr r1, _020EF540 ; =_021114D8 + mov r2, #2 + bl __str2dec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} +_020EF44C: + and r0, r4, #0x80000000 + add r1, r4, r0, lsr #31 + add r0, sp, #0x26 + mov r1, r1, asr #1 + bl __two_exp + add r1, sp, #0x26 + mov r0, r5 + mov r2, r1 + bl __timesdec + tst r4, #1 + addeq sp, sp, #0x4c + ldmeqia sp!, {r4, r5, pc} + add r3, sp, #0 + mov ip, r5 + mov r2, #9 +_020EF488: + ldrh r1, [ip] + ldrh r0, [ip, #2] + add ip, ip, #4 + subs r2, r2, #1 + strh r1, [r3] + strh r0, [r3, #2] + add r3, r3, #4 + bne _020EF488 + ldrh r0, [ip] + cmp r4, #0 + strh r0, [r3] + add r0, sp, #0x26 + ble _020EF4CC + ldr r1, _020EF524 ; =_021114BC + mov r2, #0 + bl __str2dec + b _020EF4D8 +_020EF4CC: + ldr r1, _020EF51C ; =_021114B4 + mvn r2, #0 + bl __str2dec +_020EF4D8: + add r1, sp, #0 + add r2, sp, #0x26 + mov r0, r5 + bl __timesdec + add sp, sp, #0x4c + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020EF4F0: .word _02111408 +_020EF4F4: .word _02111438 +_020EF4F8: .word _02111460 +_020EF4FC: .word _02111478 +_020EF500: .word _02111488 +_020EF504: .word _02111490 +_020EF508: .word _02111498 +_020EF50C: .word _021114A0 +_020EF510: .word _021114A8 +_020EF514: .word _021114AC +_020EF518: .word _021114B0 +_020EF51C: .word _021114B4 +_020EF520: .word _021114B8 +_020EF524: .word _021114BC +_020EF528: .word _021114C0 +_020EF52C: .word _021114C4 +_020EF530: .word _021114C8 +_020EF534: .word _021114CC +_020EF538: .word _021114D0 +_020EF53C: .word _021114D4 +_020EF540: .word _021114D8 + arm_func_end __two_exp + + arm_func_start __equals_dec +__equals_dec: ; 0x020EF544 + stmdb sp!, {r4, lr} + ldrb r3, [r0, #5] + cmp r3, #0 + bne _020EF568 + ldrb r0, [r1, #5] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, pc} +_020EF568: + ldrb r2, [r1, #5] + cmp r2, #0 + bne _020EF584 + cmp r3, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, pc} +_020EF584: + ldrsh r3, [r0, #2] + ldrsh r2, [r1, #2] + cmp r3, r2 + bne _020EF61C + ldrb r4, [r0, #4] + ldrb r2, [r1, #4] + mov ip, #0 + mov lr, r4 + cmp r4, r2 + movgt lr, r2 + cmp lr, #0 + ble _020EF5DC +_020EF5B4: + add r3, r0, ip + add r2, r1, ip + ldrb r3, [r3, #5] + ldrb r2, [r2, #5] + cmp r3, r2 + movne r0, #0 + ldmneia sp!, {r4, pc} + add ip, ip, #1 + cmp ip, lr + blt _020EF5B4 +_020EF5DC: + cmp lr, r4 + moveq r0, r1 + ldrb r1, [r0, #4] + cmp ip, r1 + bge _020EF614 +_020EF5F0: + add r1, r0, ip + ldrb r1, [r1, #5] + cmp r1, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldrb r1, [r0, #4] + add ip, ip, #1 + cmp ip, r1 + blt _020EF5F0 +_020EF614: + mov r0, #1 + ldmia sp!, {r4, pc} +_020EF61C: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end __equals_dec + + arm_func_start __less_dec +__less_dec: ; 0x020EF624 + stmdb sp!, {r3, r4, r5, lr} + ldrb r2, [r0, #5] + cmp r2, #0 + bne _020EF648 + ldrb r0, [r1, #5] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020EF648: + ldrb r2, [r1, #5] + cmp r2, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsh r3, [r1, #2] + ldrsh r2, [r0, #2] + cmp r2, r3 + bne _020EF6F8 + ldrb r5, [r0, #4] + ldrb r4, [r1, #4] + mov ip, #0 + mov lr, r5 + cmp r5, r4 + movgt lr, r4 + cmp lr, #0 + ble _020EF6BC +_020EF688: + add r3, r1, ip + add r2, r0, ip + ldrb r3, [r3, #5] + ldrb r2, [r2, #5] + cmp r2, r3 + movlo r0, #1 + ldmloia sp!, {r3, r4, r5, pc} + cmp r3, r2 + movlo r0, #0 + ldmloia sp!, {r3, r4, r5, pc} + add ip, ip, #1 + cmp ip, lr + blt _020EF688 +_020EF6BC: + cmp lr, r5 + bne _020EF6F0 + cmp ip, r4 + bge _020EF6F0 +_020EF6CC: + add r0, r1, ip + ldrb r0, [r0, #5] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + ldrb r0, [r1, #4] + add ip, ip, #1 + cmp ip, r0 + blt _020EF6CC +_020EF6F0: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020EF6F8: + movlt r0, #1 + movge r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __less_dec + + arm_func_start __minus_dec +__minus_dec: ; 0x020EF704 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r5, #9 +_020EF710: + ldrh r4, [r1] + ldrh r3, [r1, #2] + add r1, r1, #4 + subs r5, r5, #1 + strh r4, [r6] + strh r3, [r6, #2] + add r6, r6, #4 + bne _020EF710 + ldrh r1, [r1] + strh r1, [r6] + ldrb r1, [r2, #5] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r7, [r0, #4] + ldrb r3, [r2, #4] + ldrsh r4, [r0, #2] + mov r1, r7 + cmp r7, r3 + movlt r1, r3 + ldrsh r3, [r2, #2] + sub r6, r4, r3 + add r1, r1, r6 + cmp r1, #0x20 + movgt r1, #0x20 + cmp r7, r1 + bge _020EF79C + mov r4, #0 +_020EF77C: + ldrb r5, [r0, #4] + add r3, r0, r7 + add r5, r5, #1 + strb r5, [r0, #4] + strb r4, [r3, #5] + ldrb r7, [r0, #4] + cmp r7, r1 + blt _020EF77C +_020EF79C: + ldrb r4, [r2, #4] + add r3, r0, #5 + add ip, r3, r1 + add r4, r4, r6 + cmp r4, r1 + addlt ip, r3, r4 + sub r4, ip, r3 + add r1, r2, #5 + sub r4, r4, r6 + add lr, r1, r4 + mov r4, lr + b _020EF830 +_020EF7CC: + ldrb r7, [ip, #-1]! + ldrb r5, [lr, #-1]! + cmp r7, r5 + bhs _020EF820 + ldrb r7, [ip, #-1] + sub r5, ip, #1 + cmp r7, #0 + bne _020EF7F8 +_020EF7EC: + ldrb r7, [r5, #-1]! + cmp r7, #0 + beq _020EF7EC +_020EF7F8: + cmp r5, ip + beq _020EF820 +_020EF800: + ldrb r7, [r5] + sub r7, r7, #1 + strb r7, [r5] + ldrb r7, [r5, #1]! + cmp r5, ip + add r7, r7, #0xa + strb r7, [r5] + bne _020EF800 +_020EF820: + ldrb r7, [ip] + ldrb r5, [lr] + sub r5, r7, r5 + strb r5, [ip] +_020EF830: + cmp ip, r3 + cmphi lr, r1 + bhi _020EF7CC + ldrb r5, [r2, #4] + sub lr, r4, r1 + cmp lr, r5 + bge _020EF90C + ldrb r1, [r4] + mov r7, #0 + cmp r1, #5 + movlo r7, #1 + blo _020EF8A8 + bne _020EF8A8 + add r1, r2, #5 + add r2, r1, r5 + add r4, r4, #1 + cmp r4, r2 + bhs _020EF890 +_020EF878: + ldrb r1, [r4] + cmp r1, #0 + bne _020EF90C + add r4, r4, #1 + cmp r4, r2 + blo _020EF878 +_020EF890: + add r1, r3, lr + add r2, r1, r6 + ldrb r1, [r2, #-1] + sub ip, r2, #1 + tst r1, #1 + movne r7, #1 +_020EF8A8: + cmp r7, #0 + beq _020EF90C + ldrb r1, [ip] + cmp r1, #1 + bhs _020EF900 + ldrb r1, [ip, #-1] + sub r2, ip, #1 + cmp r1, #0 + bne _020EF8D8 +_020EF8CC: + ldrb r1, [r2, #-1]! + cmp r1, #0 + beq _020EF8CC +_020EF8D8: + cmp r2, ip + beq _020EF900 +_020EF8E0: + ldrb r1, [r2] + sub r1, r1, #1 + strb r1, [r2] + ldrb r1, [r2, #1]! + cmp r2, ip + add r1, r1, #0xa + strb r1, [r2] + bne _020EF8E0 +_020EF900: + ldrb r1, [ip] + sub r1, r1, #1 + strb r1, [ip] +_020EF90C: + ldrb r1, [r3] + mov r5, r3 + cmp r1, #0 + bne _020EF928 +_020EF91C: + ldrb r1, [r5, #1]! + cmp r1, #0 + beq _020EF91C +_020EF928: + cmp r5, r3 + bls _020EF970 + ldrsh r1, [r0, #2] + sub r2, r5, r3 + and r4, r2, #0xff + sub r1, r1, r4 + strh r1, [r0, #2] + ldrb r1, [r0, #4] + add r2, r3, r1 + cmp r5, r2 + bhs _020EF964 +_020EF954: + ldrb r1, [r5], #1 + cmp r5, r2 + strb r1, [r3], #1 + blo _020EF954 +_020EF964: + ldrb r1, [r0, #4] + sub r1, r1, r4 + strb r1, [r0, #4] +_020EF970: + ldrb r1, [r0, #4] + add r2, r0, #5 + add r3, r2, r1 + cmp r3, r2 + bls _020EF998 +_020EF984: + ldrb r1, [r3, #-1]! + cmp r1, #0 + bne _020EF998 + cmp r3, r2 + bhi _020EF984 +_020EF998: + sub r1, r3, r2 + add r1, r1, #1 + strb r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end __minus_dec + + arm_func_start __num2dec_internal +__num2dec_internal: ; 0x020EF9A8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x58 + mov r8, r1 + mov r6, r2 + mov r7, r0 + mov r0, r8 + mov r1, r6 + bl __signbitd + cmp r0, #0 + movne r1, #1 + moveq r1, #0 + mov r4, r1, lsl #0x18 + mov r0, #0 + mov r1, r0 + mov r2, r8 + mov r3, r6 + mov r5, r4, asr #0x18 + bl _deq + bne _020EFA14 + strb r5, [r7] + mov r1, #0 + strh r1, [r7, #2] + mov r0, #1 + strb r0, [r7, #4] + add sp, sp, #0x58 + strb r1, [r7, #5] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020EFA14: + mov r0, r8 + mov r1, r6 + bl __fpclassifyd + cmp r0, #2 + bgt _020EFA60 + strb r5, [r7] + mov r2, #0 + strh r2, [r7, #2] + mov r2, #1 + mov r0, r8 + mov r1, r6 + strb r2, [r7, #4] + bl __fpclassifyd + cmp r0, #1 + moveq r0, #0x4e + movne r0, #0x49 + add sp, sp, #0x58 + strb r0, [r7, #5] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020EFA60: + cmp r5, #0 + beq _020EFA84 + mov r0, #0 + mov r1, r0 + mov r2, r8 + mov r3, r6 + bl _dsub + mov r8, r0 + mov r6, r1 +_020EFA84: + add r2, sp, #8 + mov r0, r8 + mov r1, r6 + bl frexp + mov r4, r0 + mov r6, r1 + orr ip, r4, #0 + rsbs r2, ip, #0 + orr r3, r6, #0x100000 + rsc r1, r3, #0 + mov r0, #0 + and r3, r3, r1 + sub r1, r0, #1 + and ip, ip, r2 + mov r2, r1 + adds r0, ip, r1 + adc r1, r3, r2 + str r4, [sp] + str r6, [sp, #4] + bl __msl_generic_count_bits64 + rsb r8, r0, #0x35 + ldr r1, [sp, #8] + add r0, sp, #0xc + sub r1, r1, r8 + bl __two_exp + mov r0, r4 + mov r1, r6 + mov r2, r8 + bl ldexp + bl _ll_ufrom_d + mov r2, r1 + mov r1, r0 + add r0, sp, #0x32 + bl __ull2dec + mov r0, r7 + add r1, sp, #0x32 + add r2, sp, #0xc + bl __timesdec + strb r5, [r7] + add sp, sp, #0x58 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end __num2dec_internal + + arm_func_start __num2dec +__num2dec: ; 0x020EFB28 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r3 + ldrsh r5, [r0, #2] + mov r0, r4 + bl __num2dec_internal + ldrb r0, [r4, #5] + cmp r0, #9 + ldmhiia sp!, {r3, r4, r5, pc} + cmp r5, #0x20 + movgt r5, #0x20 + mov r0, r4 + mov r1, r5 + bl __rounddec + ldrb r0, [r4, #4] + cmp r0, r5 + bge _020EFB8C + mov r1, #0 +_020EFB6C: + ldrb r2, [r4, #4] + add r0, r4, r0 + add r2, r2, #1 + strb r2, [r4, #4] + strb r1, [r0, #5] + ldrb r0, [r4, #4] + cmp r0, r5 + blt _020EFB6C +_020EFB8C: + ldrsh r1, [r4, #2] + sub r0, r0, #1 + mov r2, #0 + sub r0, r1, r0 + strh r0, [r4, #2] + ldrb r0, [r4, #4] + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, pc} +_020EFBAC: + add r1, r4, r2 + ldrb r0, [r1, #5] + add r2, r2, #1 + add r0, r0, #0x30 + strb r0, [r1, #5] + ldrb r0, [r4, #4] + cmp r2, r0 + blt _020EFBAC + ldmia sp!, {r3, r4, r5, pc} + arm_func_end __num2dec + + arm_func_start __dec2num +__dec2num: ; 0x020EFBD0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xfc + mov r4, r0 + ldrb r0, [r4, #4] + cmp r0, #0 + bne _020EFC10 + ldrsb r0, [r4] + mov r2, #0 + cmp r0, #0 + ldreq r3, _020F01D4 ; =0x3FF00000 + mov r0, #0 + ldrne r3, _020F01D8 ; =0xBFF00000 + mov r1, r0 + bl copysign + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EFC10: + ldrb r0, [r4, #5] + cmp r0, #0x30 + beq _020EFC30 + cmp r0, #0x49 + beq _020EFC58 + cmp r0, #0x4e + beq _020EFC8C + b _020EFCD4 +_020EFC30: + ldrsb r0, [r4] + mov r2, #0 + cmp r0, #0 + ldreq r3, _020F01D4 ; =0x3FF00000 + mov r0, #0 + ldrne r3, _020F01D8 ; =0xBFF00000 + mov r1, r0 + bl copysign + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EFC58: + ldrsb r0, [r4] + mov r5, #0 + cmp r0, #0 + ldreq r4, _020F01D4 ; =0x3FF00000 + ldr r0, _020F01DC ; =_021110E8 + ldrne r4, _020F01D8 ; =0xBFF00000 + ldr r0, [r0] + bl _f2d + mov r2, r5 + mov r3, r4 + bl copysign + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EFC8C: + ldr r1, _020F01E0 ; =0x7FF00000 + add r3, sp, #0x10 + mov r2, #0 + str r2, [r3] + str r1, [r3, #4] + ldrsb r0, [r4] + cmp r0, #0 + beq _020EFCBC + orr r0, r1, #0x80000000 + orr r1, r2, r2 + str r1, [r3] + str r0, [r3, #4] +_020EFCBC: + ldmia r3, {r0, r1} + orr r0, r0, #0 + orr r1, r1, #0x80000 + stmia r3, {r0, r1} + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EFCD4: + add r3, sp, #0xd6 + mov r5, r4 + mov r2, #9 +_020EFCE0: + ldrh r1, [r5] + ldrh r0, [r5, #2] + add r5, r5, #4 + subs r2, r2, #1 + strh r1, [r3] + strh r0, [r3, #2] + add r3, r3, #4 + bne _020EFCE0 + ldrh r0, [r5] + add r1, sp, #0xdb + strh r0, [r3] + ldrb r0, [sp, #0xda] + add r5, r1, r0 + cmp r1, r5 + bhs _020EFD30 +_020EFD1C: + ldrb r0, [r1] + sub r0, r0, #0x30 + strb r0, [r1], #1 + cmp r1, r5 + blo _020EFD1C +_020EFD30: + ldrb r1, [sp, #0xda] + ldrsh r2, [sp, #0xd8] + add r0, sp, #0xb0 + sub r1, r1, #1 + add r1, r2, r1 + strh r1, [sp, #0xd8] + ldr r1, _020F01E4 ; =_021114DC + mov r2, #0x134 + ldrsh fp, [sp, #0xd8] + bl __str2dec + add r0, sp, #0xb0 + add r1, sp, #0xd6 + bl __less_dec + cmp r0, #0 + beq _020EFDA0 + ldrsb r0, [r4] + mov r5, #0 + cmp r0, #0 + ldreq r4, _020F01D4 ; =0x3FF00000 + ldr r0, _020F01DC ; =_021110E8 + ldrne r4, _020F01D8 ; =0xBFF00000 + ldr r0, [r0] + bl _f2d + mov r2, r5 + mov r3, r4 + bl copysign + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020EFDA0: + add r1, sp, #0xdb + ldrb r0, [r1] + add r8, r1, #1 + bl _dfltu + str r0, [sp, #8] + str r1, [sp, #0xc] + cmp r8, r5 + bhs _020EFE78 +_020EFDC0: + sub r0, r5, r8 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #29 + adds r7, r1, r0, ror #29 + moveq r7, #8 + mov r6, #0 + mov r2, #0 + cmp r7, #0 + ble _020EFDFC + mov r0, #0xa +_020EFDE8: + ldrb r1, [r8], #1 + add r2, r2, #1 + cmp r2, r7 + mla r6, r0, r6, r1 + blt _020EFDE8 +_020EFDFC: + ldr r0, _020F01E8 ; =_021113C8 + ldr r1, [sp, #0xc] + add r3, r0, r7, lsl #3 + ldr r2, [r3, #-8] + ldr r0, [sp, #8] + ldr r3, [r3, #-4] + bl _dmul + mov r4, r0 + mov sb, r1 + mov r0, r6 + bl _dfltu + mov r2, r0 + mov r3, r1 + mov r0, r4 + mov r1, sb + bl _dadd + cmp r6, #0 + mov r6, r0 + mov sl, r1 + beq _020EFE64 + mov r0, r4 + mov r1, sb + mov r2, r6 + mov r3, sl + bl _deq + beq _020EFE78 +_020EFE64: + str r6, [sp, #8] + str sl, [sp, #0xc] + cmp r8, r5 + sub fp, fp, r7 + blo _020EFDC0 +_020EFE78: + cmp fp, #0 + bge _020EFEBC + rsb r0, fp, #0 + bl _dflt + mov r3, r1 + mov r2, r0 + ldr r1, _020F01EC ; =0x40140000 + mov r0, #0 + bl pow + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + bl _ddiv + str r0, [sp, #8] + str r1, [sp, #0xc] + b _020EFEF4 +_020EFEBC: + mov r0, fp + bl _dflt + mov r3, r1 + mov r2, r0 + ldr r1, _020F01EC ; =0x40140000 + mov r0, #0 + bl pow + mov r2, r0 + mov r3, r1 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + bl _dmul + str r0, [sp, #8] + str r1, [sp, #0xc] +_020EFEF4: + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + mov r2, fp + bl ldexp + str r0, [sp, #8] + str r1, [sp, #0xc] + bl __fpclassifyd + cmp r0, #2 + bne _020EFF28 + ldr r0, _020F01F0 ; =0x7FEFFFFF + mvn r1, #0 + str r1, [sp, #8] + str r0, [sp, #0xc] +_020EFF28: + ldr r1, [sp, #8] + ldr r2, [sp, #0xc] + add r0, sp, #0x8a + add r4, sp, #0 + mov r5, #0 + bl __num2dec_internal + add r0, sp, #0x8a + add r1, sp, #0xd6 + bl __equals_dec + cmp r0, #0 + bne _020F019C + add r0, sp, #0x8a + add r1, sp, #0xd6 + bl __less_dec + cmp r0, #0 + movne r5, #1 + ldr r1, [sp, #8] + ldr r0, [sp, #0xc] + cmp r5, #0 + moveq r6, #1 + str r1, [sp] + str r0, [sp, #4] + movne r6, #0 +_020EFF84: + cmp r6, #0 + bne _020EFFAC + ldmia r4, {r0, r1} + adds r0, r0, #1 + adc r1, r1, #0 + stmia r4, {r0, r1} + bl __fpclassifyd + cmp r0, #2 + beq _020F019C + b _020EFFC4 +_020EFFAC: + ldr r1, [r4] + ldr r0, [r4, #4] + subs r1, r1, #1 + sbc r0, r0, #0 + str r1, [r4] + str r0, [r4, #4] +_020EFFC4: + ldr r1, [sp] + ldr r2, [sp, #4] + add r0, sp, #0x64 + bl __num2dec_internal + cmp r5, #0 + beq _020EFFF0 + add r0, sp, #0x64 + add r1, sp, #0xd6 + bl __less_dec + cmp r0, #0 + beq _020F0114 +_020EFFF0: + cmp r5, #0 + bne _020F00CC + add r0, sp, #0xd6 + add r1, sp, #0x64 + bl __less_dec + cmp r0, #0 + bne _020F00CC + add r3, sp, #0x8a + add r5, sp, #0x3e + mov r2, #9 +_020F0018: + ldrh r1, [r3] + ldrh r0, [r3, #2] + add r3, r3, #4 + strh r1, [r5] + strh r0, [r5, #2] + add r5, r5, #4 + subs r2, r2, #1 + bne _020F0018 + ldrh r0, [r3] + add r3, sp, #0x64 + add r4, sp, #0x8a + strh r0, [r5] + mov r2, #9 +_020F004C: + ldrh r1, [r3] + ldrh r0, [r3, #2] + add r3, r3, #4 + strh r1, [r4] + strh r0, [r4, #2] + add r4, r4, #4 + subs r2, r2, #1 + bne _020F004C + ldrh r0, [r3] + add r3, sp, #0x3e + add r5, sp, #0x64 + strh r0, [r4] + mov r2, #9 +_020F0080: + ldrh r1, [r3] + ldrh r0, [r3, #2] + add r3, r3, #4 + strh r1, [r5] + strh r0, [r5, #2] + add r5, r5, #4 + subs r2, r2, #1 + bne _020F0080 + ldrh r4, [r3] + ldr r3, [sp, #8] + ldr r1, [sp] + ldr r2, [sp, #0xc] + ldr r0, [sp, #4] + strh r4, [r5] + str r1, [sp, #8] + str r0, [sp, #0xc] + str r3, [sp] + str r2, [sp, #4] + b _020F0114 +_020F00CC: + add r7, sp, #0x64 + add r3, sp, #0x8a + mov r2, #9 +_020F00D8: + ldrh r1, [r7] + ldrh r0, [r7, #2] + add r7, r7, #4 + strh r1, [r3] + strh r0, [r3, #2] + add r3, r3, #4 + subs r2, r2, #1 + bne _020F00D8 + ldrh r2, [r7] + ldr r1, [sp] + ldr r0, [sp, #4] + strh r2, [r3] + str r1, [sp, #8] + str r0, [sp, #0xc] + b _020EFF84 +_020F0114: + add r0, sp, #0x3e + add r1, sp, #0xd6 + add r2, sp, #0x8a + bl __minus_dec + add r0, sp, #0x18 + add r1, sp, #0x64 + add r2, sp, #0xd6 + bl __minus_dec + add r0, sp, #0x3e + add r1, sp, #0x18 + bl __equals_dec + cmp r0, #0 + beq _020F0178 + ldr r1, [sp, #8] + ldr r0, [sp, #0xc] + and r1, r1, #1 + and r0, r0, #0 + cmp r0, #0 + cmpeq r1, #0 + beq _020F019C + ldr r1, [sp] + ldr r0, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + b _020F019C +_020F0178: + add r0, sp, #0x3e + add r1, sp, #0x18 + bl __less_dec + cmp r0, #0 + bne _020F019C + ldr r1, [sp] + ldr r0, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] +_020F019C: + ldrsb r0, [sp, #0xd6] + cmp r0, #0 + beq _020F01C4 + mov r0, #0 + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + mov r1, r0 + bl _dsub + str r0, [sp, #8] + str r1, [sp, #0xc] +_020F01C4: + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + add sp, sp, #0xfc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020F01D4: .word 0x3FF00000 +_020F01D8: .word 0xBFF00000 +_020F01DC: .word _021110E8 +_020F01E0: .word 0x7FF00000 +_020F01E4: .word _021114DC +_020F01E8: .word _021113C8 +_020F01EC: .word 0x40140000 +_020F01F0: .word 0x7FEFFFFF + arm_func_end __dec2num + + arm_func_start __msl_generic_count_bits64 +__msl_generic_count_bits64: ; 0x020F01F4 + mov r3, r0, lsr #1 + ldr r2, _020F027C ; =0x55555555 + orr r3, r3, r1, lsl #31 + and r3, r3, r2 + subs ip, r0, r3 + and r2, r2, r1, lsr #1 + ldr r0, _020F0280 ; =0x33333333 + sbc r3, r1, r2 + mov r1, ip, lsr #2 + orr r1, r1, r3, lsl #30 + and r2, ip, r0 + and r1, r1, r0 + adds r2, r2, r1 + and r1, r3, r0 + and r0, r0, r3, lsr #2 + adc r1, r1, r0 + mov r0, r2, lsr #4 + orr r0, r0, r1, lsl #28 + adds r2, r2, r0 + ldr r0, _020F0284 ; =0x0F0F0F0F + adc r1, r1, r1, lsr #4 + and r3, r2, r0 + and r2, r1, r0 + mov r0, r3, lsr #8 + orr r0, r0, r2, lsl #24 + adds r1, r3, r0 + adc r2, r2, r2, lsr #8 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + adds r1, r1, r0 + adc r0, r2, r2, lsr #16 + adds r0, r1, r0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_020F027C: .word 0x55555555 +_020F0280: .word 0x33333333 +_020F0284: .word 0x0F0F0F0F + arm_func_end __msl_generic_count_bits64 + + arm_func_start __signbitd +__signbitd: ; 0x020F0288 + stmdb sp!, {r0, r1, r2, r3} + ldr r0, [sp, #4] + and r0, r0, #0x80000000 + add sp, sp, #0x10 + bx lr + arm_func_end __signbitd + + arm_func_start __fpclassifyd +__fpclassifyd: ; 0x020F029C + stmdb sp!, {r0, r1, r2, r3} + ldr r2, [sp, #4] + ldr r0, _020F0304 ; =0x7FF00000 + ands r1, r2, r0 + beq _020F02D8 + cmp r1, r0 + bne _020F02F8 + ldr r0, _020F0308 ; =0x000FFFFF + tst r2, r0 + ldreq r0, [sp] + add sp, sp, #0x10 + cmpeq r0, #0 + movne r0, #1 + moveq r0, #2 + bx lr +_020F02D8: + ldr r0, _020F0308 ; =0x000FFFFF + tst r2, r0 + ldreq r0, [sp] + add sp, sp, #0x10 + cmpeq r0, #0 + movne r0, #5 + moveq r0, #3 + bx lr +_020F02F8: + mov r0, #4 + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020F0304: .word 0x7FF00000 +_020F0308: .word 0x000FFFFF + arm_func_end __fpclassifyd + + arm_func_start scalbn +scalbn: ; 0x020F030C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r2 + add r2, sp, #0 + bl frexp + ldr r2, [sp] + add r2, r2, r4 + str r2, [sp] + bl ldexp + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end scalbn + + arm_func_start __sys_alloc +__sys_alloc: ; 0x020F0338 + ldr ip, _020F034C ; =OS_AllocFromHeap + mov r2, r0 + mov r0, #0 + sub r1, r0, #1 + bx ip + .align 2, 0 +_020F034C: .word OS_AllocFromHeap + arm_func_end __sys_alloc + + arm_func_start __sys_free +__sys_free: ; 0x020F0350 + ldr ip, _020F0364 ; =OS_FreeToHeap + mov r2, r0 + mov r0, #0 + sub r1, r0, #1 + bx ip + .align 2, 0 +_020F0364: .word OS_FreeToHeap + arm_func_end __sys_free + + ; MSL_Extras_NITRO_Ai_LE.a + + arm_func_start stricmp +stricmp: ; 0x020F0368 + stmdb sp!, {r3, lr} + ldr r3, _020F03CC ; =_0210E404 +_020F0370: + ldrb r2, [r0], #1 + cmp r2, #0 + blt _020F0388 + cmp r2, #0x80 + bge _020F0388 + ldrb r2, [r3, r2] +_020F0388: + ldrb lr, [r1], #1 + and ip, r2, #0xff + cmp lr, #0 + blt _020F03A4 + cmp lr, #0x80 + bge _020F03A4 + ldrb lr, [r3, lr] +_020F03A4: + and r2, lr, #0xff + cmp ip, r2 + mvnlo r0, #0 + ldmloia sp!, {r3, pc} + movhi r0, #1 + ldmhiia sp!, {r3, pc} + cmp ip, #0 + bne _020F0370 + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020F03CC: .word _0210E404 + arm_func_end stricmp + + arm_func_start strnicmp +strnicmp: ; 0x020F03D0 + ldr ip, _020F03D8 ; =stricmp + bx ip + .align 2, 0 +_020F03D8: .word stricmp + arm_func_end strnicmp + + ; MSL_CPP_NITRO_Ai_LE.a + + arm_func_start _ZNSt9exceptionD2Ev +_ZNSt9exceptionD2Ev: ; 0x020F03DC + bx lr + arm_func_end _ZNSt9exceptionD2Ev + + arm_func_start _ZNSt3tr110shared_ptrIcEC1IcNSt6detail14default_deleteIA0_cEEEEPT_T0_ +_ZNSt3tr110shared_ptrIcEC1IcNSt6detail14default_deleteIA0_cEEEEPT_T0_: ; 0x020F03E0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + str r4, [r5] + add r1, sp, #0x20 + mov r0, #0x10 + str r4, [sp] + str r1, [sp, #4] + bl _Znwm + cmp r0, #0 + beq _020F0430 + ldr r1, _020F0458 ; =_02111540 + mov r2, #1 + stmia r0, {r1, r2} + ldr r1, _020F045C ; =_02111558 + str r2, [r0, #8] + str r1, [r0] + str r4, [r0, #0xc] +_020F0430: + str r0, [r5, #4] + mov r1, #0 + add r0, sp, #0 + str r1, [sp] + bl _ZN10Metrowerks8move_ptrIcRNSt6detail14default_deleteIA0_cEEED1Ev + mov r0, r5 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020F0458: .word _02111540 +_020F045C: .word _02111558 + arm_func_end _ZNSt3tr110shared_ptrIcEC1IcNSt6detail14default_deleteIA0_cEEEEPT_T0_ + + arm_func_start _ZNSt9exceptionD0Ev +_ZNSt9exceptionD0Ev: ; 0x020F0460 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt9exceptionD0Ev + + arm_func_start _ZNSt9exceptionD1Ev +_ZNSt9exceptionD1Ev: ; 0x020F0474 + bx lr + arm_func_end _ZNSt9exceptionD1Ev + + arm_func_start _ZNKSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE11get_deleterERKSt9type_info +_ZNKSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE11get_deleterERKSt9type_info: ; 0x020F0478 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + ldr r1, _020F049C ; =_02111514 + bl _ZNKSt9type_infoeqERKS_ + cmp r0, #0 + addne r0, r4, #0xc + moveq r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020F049C: .word _02111514 + arm_func_end _ZNKSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE11get_deleterERKSt9type_info + + arm_func_start _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE7disposeEv +_ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE7disposeEv: ; 0x020F04A0 + ldr ip, _020F04AC ; =_ZdaPv + ldr r0, [r0, #0xc] + bx ip + .align 2, 0 +_020F04AC: .word _ZdaPv + arm_func_end _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE7disposeEv + + arm_func_start _ZNSt3tr110shared_ptrIcED1Ev +_ZNSt3tr110shared_ptrIcED1Ev: ; 0x020F04B0 + stmdb sp!, {r3, r4, fp, lr} + sub sp, sp, #0x18 + mov fp, sp + mov r4, r0 + ldr r0, [r4, #4] + cmp r0, #0 + beq _020F04D0 + bl _ZNSt3tr16detail25shared_ptr_deleter_common7releaseEv +_020F04D0: + add sp, fp, #0x18 + mov r0, r4 + ldmia sp!, {r3, r4, fp, pc} +_020F04DC: ; 0x020F04DC + add r0, fp, #0 + bl __unexpected +_020F04E4: + b _020F04E4 +_020F04E8: ; 0x020F04E8 + add sp, fp, #0x18 + ldmia sp!, {r3, r4, fp, pc} + arm_func_end _ZNSt3tr110shared_ptrIcED1Ev + + arm_func_start _ZN10Metrowerks8move_ptrIcRNSt6detail14default_deleteIA0_cEEED1Ev +_ZN10Metrowerks8move_ptrIcRNSt6detail14default_deleteIA0_cEEED1Ev: ; 0x020F04F0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + beq _020F0508 + bl _ZdaPv +_020F0508: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10Metrowerks8move_ptrIcRNSt6detail14default_deleteIA0_cEEED1Ev + + arm_func_start _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED0Ev +_ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED0Ev: ; 0x020F0510 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED0Ev + + arm_func_start _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED1Ev +_ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED1Ev: ; 0x020F0524 + bx lr + arm_func_end _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED1Ev + + arm_func_start _ZNSt3tr16detail25shared_ptr_deleter_commonD2Ev +_ZNSt3tr16detail25shared_ptr_deleter_commonD2Ev: ; 0x020F0528 + ldr r0, [r0, #4] + bx lr + arm_func_end _ZNSt3tr16detail25shared_ptr_deleter_commonD2Ev + + arm_func_start _ZNSt11logic_errorD1Ev +_ZNSt11logic_errorD1Ev: ; 0x020F0530 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #4 + bl _ZNSt3tr110shared_ptrIcED1Ev + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt11logic_errorD1Ev + + arm_func_start _ZNSt11logic_errorD0Ev +_ZNSt11logic_errorD0Ev: ; 0x020F0548 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #4 + bl _ZNSt3tr110shared_ptrIcED1Ev + mov r0, r4 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt11logic_errorD0Ev + + arm_func_start _ZNSt12length_errorD1Ev +_ZNSt12length_errorD1Ev: ; 0x020F0568 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #4 + bl _ZNSt3tr110shared_ptrIcED1Ev + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt12length_errorD1Ev + + arm_func_start _ZNSt12length_errorD0Ev +_ZNSt12length_errorD0Ev: ; 0x020F0580 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #4 + bl _ZNSt3tr110shared_ptrIcED1Ev + mov r0, r4 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt12length_errorD0Ev + + arm_func_start _ZNSt3tr16detail25shared_ptr_deleter_common7releaseEv +_ZNSt3tr16detail25shared_ptr_deleter_common7releaseEv: ; 0x020F05A0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #4] + subs r1, r1, #1 + str r1, [r4, #4] + ldmneia sp!, {r4, pc} + ldr r1, [r0] + ldr r1, [r1, #0xc] + blx r1 + mov r0, r4 + bl _ZNSt3tr16detail25shared_ptr_deleter_common12release_weakEv + ldmia sp!, {r4, pc} + arm_func_end _ZNSt3tr16detail25shared_ptr_deleter_common7releaseEv + + arm_func_start _ZNSt3tr16detail25shared_ptr_deleter_common12release_weakEv +_ZNSt3tr16detail25shared_ptr_deleter_common12release_weakEv: ; 0x020F05D0 + stmdb sp!, {r3, lr} + ldr r1, [r0, #8] + subs r1, r1, #1 + str r1, [r0, #8] + ldmneia sp!, {r3, pc} + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r1, [r0] + ldr r1, [r1, #4] + blx r1 + ldmia sp!, {r3, pc} + arm_func_end _ZNSt3tr16detail25shared_ptr_deleter_common12release_weakEv + + arm_func_start _ZNSt15__vector_commonILb1EE18throw_length_errorEv +_ZNSt15__vector_commonILb1EE18throw_length_errorEv: ; 0x020F05FC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + ldr r4, _020F0678 ; =_02111664 + ldr r1, _020F067C ; =_02111658 + add r6, sp, #4 + mov r0, r4 + str r1, [sp, #4] + add r5, sp, #8 + bl strlen + add r0, r0, #1 + rsb r0, r0, r0, lsl #1 + bl _Znam + mov r1, #0 + strb r1, [sp] + sub r2, sp, #4 + strb r1, [r2] + mov r1, r0 + ldr r2, [r2] + mov r0, r5 + bl _ZNSt3tr110shared_ptrIcEC1IcNSt6detail14default_deleteIA0_cEEEEPT_T0_ + ldr r0, [r5] + mov r1, r4 + bl strcpy + ldr r3, _020F0680 ; =_02111644 + ldr r0, _020F0684 ; =_02111678 + ldr r2, _020F0688 ; =_ZNSt12length_errorD1Ev + mov r1, r6 + str r3, [sp, #4] + bl __throw + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020F0678: .word _02111664 +_020F067C: .word _02111658 +_020F0680: .word _02111644 +_020F0684: .word _02111678 +_020F0688: .word _ZNSt12length_errorD1Ev + arm_func_end _ZNSt15__vector_commonILb1EE18throw_length_errorEv + + ; FP_fastI_v5t_LE.a + + .public _dadd + .type _dadd, @function + .public _d_add + .type _d_add, @function +_dadd: ; 0x020F068C +_d_add: + stmdb sp!, {r4, lr} + eors ip, r1, r3 + eormi r3, r3, #0x80000000 + bmi __dsub_start +__dadd_start: + subs ip, r0, r2 + sbcs lr, r1, r3 + bhs _020F06B8 + adds r2, r2, ip + adc r3, r3, lr + subs r0, r0, ip + sbc r1, r1, lr +_020F06B8: + mov lr, #0x80000000 + mov ip, r1, lsr #0x14 + orr r1, lr, r1, lsl #11 + orr r1, r1, r0, lsr #21 + mov r0, r0, lsl #0xb + movs r4, ip, lsl #0x15 + cmnne r4, #0x200000 + beq _020F07B4 + mov r4, r3, lsr #0x14 + orr r3, lr, r3, lsl #11 + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs lr, r4, lsl #0x15 + beq _020F07FC +_020F06F0: + subs r4, ip, r4 + beq _020F0748 + cmp r4, #0x20 + ble _020F072C + cmp r4, #0x38 + movge r4, #0x3f + sub r4, r4, #0x20 + rsb lr, r4, #0x20 + orrs lr, r2, r3, lsl lr + mov r2, r3, lsr r4 + orrne r2, r2, #1 + adds r0, r0, r2 + adcs r1, r1, #0 + blo _020F0770 + b _020F0754 +_020F072C: + rsb lr, r4, #0x20 + movs lr, r2, lsl lr + rsb lr, r4, #0x20 + mov r2, r2, lsr r4 + orr r2, r2, r3, lsl lr + mov r3, r3, lsr r4 + orrne r2, r2, #1 +_020F0748: + adds r0, r0, r2 + adcs r1, r1, r3 + blo _020F0770 +_020F0754: + add ip, ip, #1 + and r4, r0, #1 + movs r1, r1, rrx + orr r0, r4, r0, rrx + mov lr, ip, lsl #0x15 + cmn lr, #0x200000 + beq _020F0980 +_020F0770: + movs r2, r0, lsl #0x15 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + mov r1, r1, lsr #0xc + orr r1, r1, ip, lsl #20 + tst r2, #0x80000000 + ldmeqia sp!, {r4, lr} + bxeq lr + movs r2, r2, lsl #1 + andeqs r2, r0, #1 + ldmeqia sp!, {r4, lr} + bxeq lr + adds r0, r0, #1 + adc r1, r1, #0 + ldmia sp!, {r4, lr} + bx lr +_020F07B4: + cmp ip, #0x800 + movge lr, #0x80000000 + movlt lr, #0 + bics ip, ip, #0x800 + beq _020F0820 + orrs r4, r0, r1, lsl #1 + bne _020F095C + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r4, r4, lsl #0x15 + beq _020F0948 + cmn r4, #0x200000 + bne _020F0948 + orrs r4, r2, r3, lsl #1 + beq _020F0948 + b _020F095C +_020F07FC: + cmp r4, #0x800 + movge lr, #0x80000000 + movlt lr, #0 + bic ip, ip, #0x800 + bics r4, r4, #0x800 + beq _020F088C + orrs r4, r2, r3, lsl #1 + bne _020F095C + b _020F0948 +_020F0820: + orrs r4, r0, r1, lsl #1 + beq _020F0860 + mov ip, #1 + bic r1, r1, #0x80000000 + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r4, r4, lsl #0x15 + cmnne r4, #0x200000 + mov r4, r4, lsr #0x15 + orr r4, r4, lr, lsr #20 + beq _020F07FC + orr r3, r3, #0x80000000 + orr ip, ip, lr, lsr #20 + b _020F06F0 +_020F0860: + mov ip, r3, lsr #0x14 + mov r1, r3, lsl #0xb + orr r1, r1, r2, lsr #21 + mov r0, r2, lsl #0xb + movs r4, ip, lsl #0x15 + beq _020F0914 + cmn r4, #0x200000 + bne _020F0914 + orrs r4, r0, r1, lsl #1 + beq _020F0948 + b _020F0960 +_020F088C: + orrs r4, r2, r3, lsl #1 + beq _020F0924 + mov r4, #1 + bic r3, r3, #0x80000000 + cmp r1, #0 + bpl _020F08B0 + orr ip, ip, lr, lsr #20 + orr r4, r4, lr, lsr #20 + b _020F06F0 +_020F08B0: + adds r0, r0, r2 + adcs r1, r1, r3 + blo _020F08D0 + add ip, ip, #1 + and r4, r0, #1 + movs r1, r1, rrx + mov r0, r0, rrx + orr r0, r0, r4 +_020F08D0: + cmp r1, #0 + subges ip, ip, #1 + movs r2, r0, lsl #0x15 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + orr r1, lr, r1, lsr #12 + orr r1, r1, ip, lsl #20 + ldmeqia sp!, {r4, lr} + bxeq lr + tst r2, #0x80000000 + ldmeqia sp!, {r4, lr} + bxeq lr + movs r2, r2, lsl #1 + andeqs r2, r0, #1 + ldmeqia sp!, {r4, lr} + bxeq lr +_020F0914: + mov r1, r3 + mov r0, r2 + ldmia sp!, {r4, lr} + bx lr +_020F0924: + cmp r1, #0 + subges ip, ip, #1 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + orr r1, lr, r1, lsr #12 + orr r1, r1, ip, lsl #20 + ldmia sp!, {r4, lr} + bx lr +_020F0948: + ldr r1, _020F09A0 ; =0x7FF00000 + orr r1, lr, r1 + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr +_020F095C: + mov r1, r3 +_020F0960: + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, lr} + bx lr +_020F0970: ; 0x020F0970 + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, lr} + bx lr +_020F0980: + cmp ip, #0x800 + movge lr, #0x80000000 + movlt lr, #0 + ldr r1, _020F09A0 ; =0x7FF00000 + orr r1, lr, r1 + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_020F09A0: .word 0x7FF00000 + + .public _d2f + .type _d2f, @function + .public _d_dtof + .type _d_dtof, @function + .public _f_qtof + .type _f_qtof, @function +_d2f: ; 0x020F09A4 +_d_dtof: +_f_qtof: + and r2, r1, #0x80000000 + mov ip, r1, lsr #0x14 + bics ip, ip, #0x800 + beq _020F0A1C + mov r3, ip, lsl #0x15 + cmn r3, #0x200000 + bhs _020F0A00 + subs ip, ip, #0x380 + bls _020F0A2C + cmp ip, #0xff + bge _020F0A9C + mov r1, r1, lsl #0xc + orr r3, r2, r1, lsr #9 + orr r3, r3, r0, lsr #29 + movs r1, r0, lsl #3 + orr r0, r3, ip, lsl #23 + bxeq lr + tst r1, #0x80000000 + bxeq lr + movs r1, r1, lsl #1 + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F0A00: + orrs r3, r0, r1, lsl #12 + bne _020F0A14 + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +_020F0A14: + mvn r0, #0x80000000 + bx lr +_020F0A1C: + orrs r3, r0, r1, lsl #12 + bne __f_underflow +__f_result_zero: + mov r0, r2 + bx lr +_020F0A2C: + cmn ip, #0x17 + beq _020F0A80 + bmi __f_underflow + mov r1, r1, lsl #0xb + orr r1, r1, #0x80000000 + mov r3, r1, lsr #8 + orr r3, r3, r0, lsr #29 + rsb ip, ip, #1 + movs r1, r0, lsl #3 + orr r0, r2, r3, lsr ip + rsb ip, ip, #0x20 + mov r3, r3, lsl ip + orrne r3, r3, #1 + movs r1, r3 + bxeq lr + tst r1, #0x80000000 + bxeq lr + movs r1, r1, lsl #1 + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F0A80: + orr r0, r0, r1, lsl #12 +__f_very_tiny_result: + movs r1, r0 + mov r0, r2 + addne r0, r0, #1 + bx lr +__f_underflow: + mov r0, r2 + bx lr +_020F0A9C: + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr + + .public _dfix + .type _dfix, @function + .public _d_dtoi + .type _d_dtoi, @function +_dfix: ; 0x020F0AA8 +_d_dtoi: + bic r3, r1, #0x80000000 + ldr r2, _020F0AF0 ; =0x0000041E + subs r2, r2, r3, lsr #20 + ble _020F0AE4 + cmp r2, #0x20 + bge _020F0ADC + mov r3, r1, lsl #0xb + orr r3, r3, #0x80000000 + orr r3, r3, r0, lsr #21 + cmp r1, #0 + mov r0, r3, lsr r2 + rsbmi r0, r0, #0 + bx lr +_020F0ADC: + mov r0, #0 + bx lr +_020F0AE4: + mvn r0, r1, asr #31 + add r0, r0, #0x80000000 + bx lr + .align 2, 0 +_020F0AF0: .word 0x0000041E + + .public _dfixu + .type _dfixu, @function + .public _d_dtou + .type _d_dtou, @function +_dfixu: ; 0x020F0AF4 +_d_dtou: + tst r1, #0x80000000 + bne _020F0B2C + ldr r2, _020F0B48 ; =0x0000041E + subs r2, r2, r1, lsr #20 + blt _020F0B40 + cmp r2, #0x20 + bge _020F0B24 + mov r3, r1, lsl #0xb + orr r3, r3, #0x80000000 + orr r3, r3, r0, lsr #21 + mov r0, r3, lsr r2 + bx lr +_020F0B24: + mov r0, #0 + bx lr +_020F0B2C: + cmn r1, #0x100000 + cmpeq r0, #0 + movls r0, #0 + mvnhi r0, #0 + bx lr +_020F0B40: + mvn r0, #0 + bx lr + .align 2, 0 +_020F0B48: .word 0x0000041E + + .public _ll_ufrom_d + .type _ll_ufrom_d, @function + .public _d_dtoull + .type _d_dtoull, @function +_ll_ufrom_d: ; 0x020F0B4C +_d_dtoull: + tst r1, #0x80000000 + bne _020F0BB0 + ldr r2, _020F0BD4 ; =0x0000043E + subs r2, r2, r1, lsr #20 + blt _020F0BC8 + cmp r2, #0x40 + bge _020F0BA4 + mov ip, r1, lsl #0xb + orr ip, ip, #0x80000000 + orr ip, ip, r0, lsr #21 + cmp r2, #0x20 + ble _020F0B8C + sub r2, r2, #0x20 + mov r1, #0 + mov r0, ip, lsr r2 + bx lr +_020F0B8C: + mov r3, r0, lsl #0xb + mov r1, ip, lsr r2 + mov r0, r3, lsr r2 + rsb r2, r2, #0x20 + orr r0, r0, ip, lsl r2 + bx lr +_020F0BA4: + mov r1, #0 + mov r0, #0 + bx lr +_020F0BB0: + cmn r1, #0x100000 + cmpeq r0, #0 + bhi _020F0BC8 + mov r1, #0 + mov r0, #0 + bx lr +_020F0BC8: + mvn r1, #0 + mvn r0, #0 + bx lr + .align 2, 0 +_020F0BD4: .word 0x0000043E + + .public _dflt + .type _dflt, @function + .public _d_itod + .type _d_itod, @function +_dflt: ; 0x020F0BD8 +_d_itod: + ands r2, r0, #0x80000000 + rsbmi r0, r0, #0 + cmp r0, #0 +__d_itod_common: + mov r1, #0 + bxeq lr + mov r3, #0x400 + add r3, r3, #0x1e + clz ip, r0 + movs r0, r0, lsl ip + sub r3, r3, ip + movs r1, r0 + mov r0, r1, lsl #0x15 + add r1, r1, r1 + orr r1, r2, r1, lsr #12 + orr r1, r1, r3, lsl #20 + bx lr + + .public _dfltu + .type _dfltu, @function + .public _d_utod + .type _d_utod, @function +_dfltu: ; 0x020F0C18 +_d_utod: + cmp r0, #0 +__d_utod_common: + mov r1, #0 + bxeq lr + mov r3, #0x400 + add r3, r3, #0x1e + bmi _020F0C3C + clz ip, r0 + movs r0, r0, lsl ip + sub r3, r3, ip +_020F0C3C: + mov r1, r0 + mov r0, r1, lsl #0x15 + add r1, r1, r1 + mov r1, r1, lsr #0xc + orr r1, r1, r3, lsl #20 + bx lr + + .public _dmul + .type _dmul, @function + .public _d_mul + .type _d_mul, @function +_dmul: ; 0x020F0C54 +_d_mul: + stmdb sp!, {r4, r5, r6, r7, lr} + eor lr, r1, r3 + and lr, lr, #0x80000000 + mov ip, r1, lsr #0x14 + mov r1, r1, lsl #0xb + orr r1, r1, r0, lsr #21 + mov r0, r0, lsl #0xb + movs r6, ip, lsl #0x15 + cmnne r6, #0x200000 + beq _020F0D5C + orr r1, r1, #0x80000000 + bic ip, ip, #0x800 + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r5, r4, lsl #0x15 + cmnne r5, #0x200000 + beq _020F0DA4 + orr r3, r3, #0x80000000 + bic r4, r4, #0x800 +_020F0CA8: + add ip, r4, ip + umull r5, r4, r0, r2 + umull r7, r6, r0, r3 + adds r4, r7, r4 + adc r6, r6, #0 + umull r7, r0, r1, r2 + adds r4, r7, r4 + adcs r0, r0, r6 + umull r7, r2, r1, r3 + adc r1, r2, #0 + adds r0, r0, r7 + adc r1, r1, #0 + orrs r4, r4, r5 + orrne r0, r0, #1 + cmp r1, #0 + blt _020F0CF4 + sub ip, ip, #1 + adds r0, r0, r0 + adc r1, r1, r1 +_020F0CF4: + add ip, ip, #2 + subs ip, ip, #0x400 + bmi _020F0E90 + beq _020F0E90 + mov r6, ip, lsl #0x14 + cmn r6, #0x100000 + bmi _020F0F90 + movs r2, r0, lsl #0x15 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + orr r1, lr, r1, lsr #12 + orr r1, r1, ip, lsl #20 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + tst r2, #0x80000000 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + movs r2, r2, lsl #1 + andeqs r2, r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + adds r0, r0, #1 + adc r1, r1, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0D5C: + bics ip, ip, #0x800 + beq _020F0DB8 + orrs r6, r0, r1, lsl #1 + bne _020F0F44 + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r5, r4, lsl #0x15 + beq _020F0D98 + cmn r5, #0x200000 + bne _020F0F30 + orrs r5, r2, r3, lsl #1 + beq _020F0F30 + b _020F0F44 +_020F0D98: + orrs r5, r3, r2 + beq _020F0F58 + b _020F0F30 +_020F0DA4: + bics r4, r4, #0x800 + beq _020F0E4C + orrs r6, r2, r3, lsl #1 + bne _020F0F44 + b _020F0F30 +_020F0DB8: + orrs r6, r0, r1, lsl #1 + beq _020F0E20 + mov ip, #1 + cmp r1, #0 + bne _020F0DDC + sub ip, ip, #0x20 + movs r1, r0 + mov r0, #0 + bmi _020F0DF8 +_020F0DDC: + clz r6, r1 + movs r1, r1, lsl r6 + rsb r6, r6, #0x20 + orr r1, r1, r0, lsr r6 + rsb r6, r6, #0x20 + mov r0, r0, lsl r6 + sub ip, ip, r6 +_020F0DF8: + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r5, r4, lsl #0x15 + cmnne r5, #0x200000 + beq _020F0DA4 + orr r3, r3, #0x80000000 + bic r4, r4, #0x800 + b _020F0CA8 +_020F0E20: + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r5, r4, lsl #0x15 + beq _020F0FA4 + cmn r5, #0x200000 + bne _020F0FA4 + orrs r6, r2, r3, lsl #1 + beq _020F0F58 + b _020F0F44 +_020F0E4C: + orrs r5, r2, r3, lsl #1 + beq _020F0FA4 + mov r4, #1 + cmp r3, #0 + bne _020F0E70 + sub r4, r4, #0x20 + movs r3, r2 + mov r2, #0 + bmi _020F0CA8 +_020F0E70: + clz r6, r3 + movs r3, r3, lsl r6 + rsb r6, r6, #0x20 + orr r3, r3, r2, lsr r6 + rsb r6, r6, #0x20 + mov r2, r2, lsl r6 + sub r4, r4, r6 + b _020F0CA8 +_020F0E90: + cmn ip, #0x34 + beq _020F0F28 + bmi _020F0F80 + mov r2, r1 + mov r3, r0 + add r4, ip, #0x34 + cmp r4, #0x20 + movge r2, r3 + movge r3, #0 + subge r4, r4, #0x20 + rsb r5, r4, #0x20 + mov r2, r2, lsl r4 + orr r2, r2, r3, lsr r5 + movs r3, r3, lsl r4 + orrne r2, r2, #1 + rsb ip, ip, #0xc + cmp ip, #0x20 + movge r0, r1 + movge r1, #0 + subge ip, ip, #0x20 + rsb r4, ip, #0x20 + mov r0, r0, lsr ip + orr r0, r0, r1, lsl r4 + orr r1, lr, r1, lsr ip + cmp r2, #0 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + tst r2, #0x80000000 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + movs r2, r2, lsl #1 + andeqs r2, r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, lr} + bxeq lr + adds r0, r0, #1 + adc r1, r1, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F28: + orr r0, r0, r1, lsl #1 + b _020F0F68 +_020F0F30: + ldr r1, _020F0FB4 ; =0x7FF00000 + orr r1, lr, r1 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F44: + mov r1, r3 + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F58: + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F68: + movs r2, r0 + mov r1, lr + mov r0, #0 + addne r0, r0, #1 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F80: + mov r1, lr + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0F90: + ldr r1, _020F0FB4 ; =0x7FF00000 + orr r1, lr, r1 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_020F0FA4: + mov r1, lr + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_020F0FB4: .word 0x7FF00000 + + .public _dsqrt + .type _dsqrt, @function +_dsqrt: ; 0x020F0FB8 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020F1148 ; =0x7FF00000 + cmp r1, r2 + bhs _020F1104 + movs ip, r1, lsr #0x14 + beq _020F10B0 + bic r1, r1, r2 + orr r1, r1, #0x100000 +_020F0FD8: + movs ip, ip, asr #1 + bhs _020F0FEC + sub ip, ip, #1 + movs r0, r0, lsl #1 + adc r1, r1, r1 +_020F0FEC: + movs r3, r0, lsl #1 + adc r1, r1, r1 + mov r2, #0 + mov r4, #0 + mov lr, #0x200000 +_020F1000: + add r6, r4, lr + cmp r6, r1 + addle r4, r6, lr + suble r1, r1, r6 + addle r2, r2, lr + movs r3, r3, lsl #1 + adc r1, r1, r1 + movs lr, lr, lsr #1 + bne _020F1000 + mov r0, #0 + mov r5, #0 + cmp r1, r4 + cmpeq r3, #0x80000000 + blo _020F1048 + subs r3, r3, #0x80000000 + sbc r1, r1, r4 + add r4, r4, #1 + mov r0, #0x80000000 +_020F1048: + movs r3, r3, lsl #1 + adc r1, r1, r1 + mov lr, #0x40000000 +_020F1054: + add r6, r5, lr + cmp r4, r1 + cmpeq r6, r3 + bhi _020F1074 + add r5, r6, lr + subs r3, r3, r6 + sbc r1, r1, r4 + add r0, r0, lr +_020F1074: + movs r3, r3, lsl #1 + adc r1, r1, r1 + movs lr, lr, lsr #1 + bne _020F1054 + orrs r1, r1, r3 + biceq r0, r0, #1 + movs r1, r2, lsr #1 + movs r0, r0, rrx + adcs r0, r0, #0 + adc r1, r1, #0 + add r1, r1, #0x20000000 + sub r1, r1, #0x100000 + add r1, r1, ip, lsl #20 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F10B0: + cmp r1, #0 + bne _020F10E0 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, lr} + bxeq lr + mvn ip, #0x13 + clz r5, r0 + movs r0, r0, lsl r5 + sub ip, ip, r5 + mov r1, r0, lsr #0xb + mov r0, r0, lsl #0x15 + b _020F0FD8 +_020F10E0: + clz r2, r1 + movs r1, r1, lsl r2 + rsb r2, r2, #0x2b + mov r1, r1, lsr #0xb + orr r1, r1, r0, lsr r2 + rsb r2, r2, #0x20 + mov r0, r0, lsl r2 + rsb ip, r2, #1 + b _020F0FD8 +_020F1104: + tst r1, #0x80000000 + beq _020F1120 + bics r3, r1, #0x80000000 + cmpeq r0, #0 + ldmeqia sp!, {r4, r5, r6, lr} + bxeq lr + b _020F112C +_020F1120: + orrs r2, r0, r1, lsl #12 + ldmeqia sp!, {r4, r5, r6, lr} + bxeq lr +_020F112C: + ldr r2, _020F114C ; =0x7FF80000 + orr r1, r1, r2 + ldr r3, _020F1150 ; =_021E58C0 + mov r4, #0x21 + str r4, [r3] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_020F1148: .word 0x7FF00000 +_020F114C: .word 0x7FF80000 +_020F1150: .word _021E58C0 + + .public _drsb + .type _drsb, @function +_drsb: ; 0x020F1154 + eor r1, r1, r3 + eor r3, r1, r3 + eor r1, r1, r3 + eor r0, r0, r2 + eor r2, r0, r2 + eor r0, r0, r2 + .public _dsub + .type _dsub, @function + .public _d_sub + .type _d_sub, @function +_dsub: ; 0x020F116C +_d_sub: ; 0x020F116C + stmdb sp!, {r4, lr} + eors ip, r1, r3 + eormi r3, r3, #0x80000000 + bmi __dadd_start +__dsub_start: + subs ip, r0, r2 + sbcs lr, r1, r3 + bhs _020F119C + eor lr, lr, #0x80000000 + adds r2, r2, ip + adc r3, r3, lr + subs r0, r0, ip + sbc r1, r1, lr +_020F119C: + mov lr, #0x80000000 + mov ip, r1, lsr #0x14 + orr r1, lr, r1, lsl #11 + orr r1, r1, r0, lsr #21 + mov r0, r0, lsl #0xb + movs r4, ip, lsl #0x15 + cmnne r4, #0x200000 + beq _020F13A0 + mov r4, r3, lsr #0x14 + orr r3, lr, r3, lsl #11 + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs lr, r4, lsl #0x15 + beq _020F13E8 +_020F11D4: + subs r4, ip, r4 + beq _020F127C + cmp r4, #0x20 + ble _020F1210 + cmp r4, #0x38 + movge r4, #0x3f + sub r4, r4, #0x20 + rsb lr, r4, #0x20 + orrs lr, r2, r3, lsl lr + mov r2, r3, lsr r4 + orrne r2, r2, #1 + subs r0, r0, r2 + sbcs r1, r1, #0 + bmi _020F1238 + b _020F1328 +_020F1210: + rsb lr, r4, #0x20 + movs lr, r2, lsl lr + rsb lr, r4, #0x20 + mov r2, r2, lsr r4 + orr r2, r2, r3, lsl lr + mov r3, r3, lsr r4 + orrne r2, r2, #1 + subs r0, r0, r2 + sbcs r1, r1, r3 + bpl _020F1328 +_020F1238: + movs r2, r0, lsl #0x15 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + mov r1, r1, lsr #0xc + orr r1, r1, ip, lsl #20 + tst r2, #0x80000000 + ldmeqia sp!, {r4, lr} + bxeq lr + movs r2, r2, lsl #1 + andeqs r2, r0, #1 + ldmeqia sp!, {r4, lr} + bxeq lr + adds r0, r0, #1 + adc r1, r1, #0 + ldmia sp!, {r4, lr} + bx lr +_020F127C: + subs r0, r0, r2 + sbc r1, r1, r3 + orrs lr, r1, r0 + beq _020F150C + mov lr, ip, lsl #0x14 + and lr, lr, #0x80000000 + bic ip, ip, #0x800 + cmp r1, #0 + bmi _020F1304 + bne _020F12B4 + sub ip, ip, #0x20 + movs r1, r0 + mov r0, #0 + bmi _020F12D0 +_020F12B4: + clz r4, r1 + movs r1, r1, lsl r4 + rsb r4, r4, #0x20 + orr r1, r1, r0, lsr r4 + rsb r4, r4, #0x20 + mov r0, r0, lsl r4 + sub ip, ip, r4 +_020F12D0: + cmp ip, #0 + bgt _020F130C + rsb ip, ip, #0xc + cmp ip, #0x20 + movge r0, r1 + movge r1, #0 + subge ip, ip, #0x20 + rsb r4, ip, #0x20 + mov r0, r0, lsr ip + orr r0, r0, r1, lsl r4 + orr r1, lr, r1, lsr ip + ldmia sp!, {r4, lr} + bx lr +_020F1304: + cmp r1, #0 + subges ip, ip, #1 +_020F130C: + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + orr r1, lr, r1, lsr #12 + orr r1, r1, ip, lsl #20 + ldmia sp!, {r4, lr} + bx lr +_020F1328: + mov lr, ip, lsl #0x14 + and lr, lr, #0x80000000 + bic ip, ip, #0x800 + cmp r1, #0 + bne _020F134C + sub ip, ip, #0x20 + movs r1, r0 + mov r0, #0 + bmi _020F1368 +_020F134C: + clz r4, r1 + movs r1, r1, lsl r4 + rsb r4, r4, #0x20 + orr r1, r1, r0, lsr r4 + rsb r4, r4, #0x20 + mov r0, r0, lsl r4 + sub ip, ip, r4 +_020F1368: + cmp ip, #0 + orrgt ip, ip, lr, lsr #20 + bgt _020F1238 + rsb ip, ip, #0xc + cmp ip, #0x20 + movge r0, r1 + movge r1, #0 + subge ip, ip, #0x20 + rsb r4, ip, #0x20 + mov r0, r0, lsr ip + orr r0, r0, r1, lsl r4 + orr r1, lr, r1, lsr ip + ldmia sp!, {r4, lr} + bx lr +_020F13A0: + cmp ip, #0x800 + movge lr, #0x80000000 + movlt lr, #0 + bics ip, ip, #0x800 + beq _020F140C + orrs r4, r0, r1, lsl #1 + bne _020F14E8 + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r4, r4, lsl #0x15 + beq _020F14D4 + cmn r4, #0x200000 + bne _020F14D4 + orrs r4, r2, r3, lsl #1 + beq _020F14FC + b _020F14E8 +_020F13E8: + cmp r4, #0x800 + movge lr, #0x80000000 + movlt lr, #0 + bic ip, ip, #0x800 + bics r4, r4, #0x800 + beq _020F1484 + orrs r4, r2, r3, lsl #1 + bne _020F14E8 + b _020F14D4 +_020F140C: + orrs r4, r0, r1, lsl #1 + beq _020F144C + mov ip, #1 + bic r1, r1, #0x80000000 + mov r4, r3, lsr #0x14 + mov r3, r3, lsl #0xb + orr r3, r3, r2, lsr #21 + mov r2, r2, lsl #0xb + movs r4, r4, lsl #0x15 + cmnne r4, #0x200000 + mov r4, r4, lsr #0x15 + orr r4, r4, lr, lsr #20 + beq _020F13E8 + orr r3, r3, #0x80000000 + orr ip, ip, lr, lsr #20 + b _020F11D4 +_020F144C: + mov ip, r3, lsr #0x14 + mov r1, r3, lsl #0xb + orr r1, r1, r2, lsr #21 + mov r0, r2, lsl #0xb + movs r4, ip, lsl #0x15 + beq _020F1478 + cmn r4, #0x200000 + bne _020F14A0 + orrs r4, r0, r1, lsl #1 + bne _020F14EC + b _020F14D4 +_020F1478: + orrs r4, r0, r1, lsl #1 + beq _020F150C + b _020F14A0 +_020F1484: + orrs r4, r2, r3, lsl #1 + beq _020F14B0 + mov r4, #1 + bic r3, r3, #0x80000000 + orr ip, ip, lr, lsr #20 + orr r4, r4, lr, lsr #20 + b _020F11D4 +_020F14A0: + mov r1, r3 + mov r0, r2 + ldmia sp!, {r4, lr} + bx lr +_020F14B0: + cmp r1, #0 + subges ip, ip, #1 + mov r0, r0, lsr #0xb + orr r0, r0, r1, lsl #21 + add r1, r1, r1 + orr r1, lr, r1, lsr #12 + orr r1, r1, ip, lsl #20 + ldmia sp!, {r4, lr} + bx lr +_020F14D4: + ldr r1, _020F151C ; =0x7FF00000 + orr r1, lr, r1 + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr +_020F14E8: + mov r1, r3 +_020F14EC: + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, lr} + bx lr +_020F14FC: + mvn r0, #0 + bic r1, r0, #0x80000000 + ldmia sp!, {r4, lr} + bx lr +_020F150C: + mov r1, #0 + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_020F151C: .word 0x7FF00000 + + arm_func_start _fadd + arm_func_start _f_add +_fadd: ; 0x020F1520 +_f_add: ; 0x020F1520 + eors r2, r0, r1 + eormi r1, r1, #0x80000000 + bmi __fsub_start +__fadd_start: + subs ip, r0, r1 + sublo r0, r0, ip + addlo r1, r1, ip + mov r2, #0x80000000 + mov r3, r0, lsr #0x17 + orr r0, r2, r0, lsl #8 + ands ip, r3, #0xff + cmpne ip, #0xff + beq _020F15C0 + mov ip, r1, lsr #0x17 + orr r1, r2, r1, lsl #8 + ands r2, ip, #0xff + beq _020F1600 +_020F1560: + subs ip, r3, ip + beq _020F1578 + rsb r2, ip, #0x20 + movs r2, r1, lsl r2 + mov r1, r1, lsr ip + orrne r1, r1, #1 +_020F1578: + adds r0, r0, r1 + blo _020F1598 + and r1, r0, #1 + orr r0, r1, r0, rrx + add r3, r3, #1 + and r2, r3, #0xff + cmp r2, #0xff + beq _020F1708 +_020F1598: + ands r1, r0, #0xff + add r0, r0, r0 + mov r0, r0, lsr #9 + orr r0, r0, r3, lsl #23 + tst r1, #0x80 + bxeq lr + ands r1, r1, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F15C0: + cmp r3, #0x100 + movge r2, #0x80000000 + movlt r2, #0 + ands r3, r3, #0xff + beq _020F1624 + movs r0, r0, lsl #1 + bne _020F1734 + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F1728 + cmp ip, #0xff + blt _020F1728 + cmp r1, #0 + beq _020F1728 + b _020F1734 +_020F1600: + cmp r3, #0x100 + movge r2, #0x80000000 + movlt r2, #0 + and r3, r3, #0xff + ands ip, ip, #0xff + beq _020F1680 +_020F1618: + movs r1, r1, lsl #1 + bne _020F1734 + b _020F1728 +_020F1624: + movs r0, r0, lsl #1 + beq _020F165C + mov r3, #1 + mov r0, r0, lsr #1 + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #8 + ands ip, ip, #0xff + beq _020F1680 + cmp ip, #0xff + beq _020F1618 + orr r1, r1, #0x80000000 + orr r3, r3, r2, lsr #23 + orr ip, ip, r2, lsr #23 + b _020F1560 +_020F165C: + mov r3, r1, lsr #0x17 + mov r0, r1, lsl #9 + ands r3, r3, #0xff + beq _020F16E8 + cmp r3, #0xff + blt _020F16E8 + cmp r0, #0 + beq _020F1728 + b _020F1720 +_020F1680: + movs r1, r1, lsl #1 + beq _020F16F0 + mov r1, r1, lsr #1 + mov ip, #1 + orr r3, r3, r2, lsr #23 + orr ip, ip, r2, lsr #23 + cmp r0, #0 + bmi _020F1560 + adds r0, r0, r1 + blo _020F16B4 + and r1, r0, #1 + orr r0, r1, r0, rrx + add ip, ip, #1 +_020F16B4: + cmp r0, #0 + subge ip, ip, #1 + ands r1, r0, #0xff + add r0, r0, r0 + mov r0, r0, lsr #9 + orr r0, r0, ip, lsl #23 + bxeq lr + tst r1, #0x80 + bxeq lr + ands r1, r1, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F16E8: + mov r0, r1 + bx lr +_020F16F0: + cmp r0, #0 + subges r3, r3, #1 + add r0, r0, r0 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bx lr +_020F1708: + cmp r3, #0x100 + movge r2, #0x80000000 + movlt r2, #0 + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +_020F1720: + mvn r0, #0x80000000 + bx lr +_020F1728: + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +_020F1734: + mvn r0, #0x80000000 + bx lr +_020F173C: ; 0x020F173C + mvn r0, #0x80000000 + bx lr + + .public _dgeq + .type _dgeq, @function + .public _d_fge + .type _d_fge, @function +_dgeq: ; 0x020F1744 +_d_fge: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F17B8 + cmn ip, r3, lsl #1 + bhs _020F17CC +_020F1758: + orrs ip, r3, r1 + bmi _020F1788 + cmp r1, r3 + cmpeq r0, r2 + movhs r0, #1 + movlo r0, #0 + bx lr +_020F1774: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F1788: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #1 + mrs ip, cpsr + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bxeq lr + cmp r3, r1 + cmpeq r2, r0 + movhs r0, #1 + movlo r0, #0 + bx lr +_020F17B8: + bne _020F1774 + cmp r0, #0 + bhi _020F1774 + cmn ip, r3, lsl #1 + blo _020F1758 +_020F17CC: + bne _020F1774 + cmp r2, #0 + bhi _020F1774 + b _020F1758 + + .public _dgr + .type _dgr, @function + .public _d_fgt + .type _d_fgt, @function +_dgr: ; 0x020F17DC +_d_fgt: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F1850 + cmn ip, r3, lsl #1 + bhs _020F1864 +_020F17F0: + orrs ip, r3, r1 + bmi _020F1820 + cmp r1, r3 + cmpeq r0, r2 + movhi r0, #1 + movls r0, #0 + bx lr +_020F180C: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F1820: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #0 + mrs ip, cpsr + bic ip, ip, #0x20000000 + msr cpsr_f, ip + bxeq lr + cmp r3, r1 + cmpeq r2, r0 + movhi r0, #1 + movls r0, #0 + bx lr +_020F1850: + bne _020F180C + cmp r0, #0 + bhi _020F180C + cmn ip, r3, lsl #1 + blo _020F17F0 +_020F1864: + bne _020F180C + cmp r2, #0 + bhi _020F180C + b _020F17F0 + + .public _dleq + .type _dleq, @function + .public _d_fle + .type _d_fle, @function +_dleq: ; 0x020F1874 +_d_fle: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F18F4 + cmn ip, r3, lsl #1 + bhs _020F1908 +_020F1888: + orrs ip, r3, r1 + bmi _020F18BC + cmp r1, r3 + cmpeq r0, r2 + movls r0, #1 + movhi r0, #0 + bx lr +_020F18A4: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x40000000 + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F18BC: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #1 + bne _020F18E0 + mrs ip, cpsr + bic ip, ip, #0x20000000 + orr ip, ip, #0x40000000 + msr cpsr_f, ip + bxeq lr +_020F18E0: + cmp r3, r1 + cmpeq r2, r0 + movls r0, #1 + movhi r0, #0 + bx lr +_020F18F4: + bne _020F18A4 + cmp r0, #0 + bhi _020F18A4 + cmn ip, r3, lsl #1 + blo _020F1888 +_020F1908: + bne _020F18A4 + cmp r2, #0 + bhi _020F18A4 + b _020F1888 + + .public _dls + .type _dls, @function + .public _d_flt + .type _d_flt, @function +_dls: ; 0x020F1918 +_d_flt: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F1990 + cmn ip, r3, lsl #1 + bhs _020F19A4 +_020F192C: + orrs ip, r3, r1 + bmi _020F195C + cmp r1, r3 + cmpeq r0, r2 + movlo r0, #1 + movhs r0, #0 + bx lr +_020F1948: + mov r0, #0 + mrs ip, cpsr + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F195C: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #0 + bne _020F197C + mrs ip, cpsr + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bxeq lr +_020F197C: + cmp r3, r1 + cmpeq r2, r0 + movlo r0, #1 + movhs r0, #0 + bx lr +_020F1990: + bne _020F1948 + cmp r0, #0 + bhi _020F1948 + cmn ip, r3, lsl #1 + blo _020F192C +_020F19A4: + bne _020F1948 + cmp r2, #0 + bhi _020F1948 + b _020F192C + + .public _deq + .type _deq, @function + .public _d_feq + .type _d_feq, @function +_deq: ; 0x020F19B4 +_d_feq: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F1A1C + cmn ip, r3, lsl #1 + bhs _020F1A30 +_020F19C8: + orrs ip, r3, r1 + bmi _020F19F8 + cmp r1, r3 + cmpeq r0, r2 + moveq r0, #1 + movne r0, #0 + bx lr +_020F19E4: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F19F8: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #1 + bxeq lr + cmp r3, r1 + cmpeq r2, r0 + moveq r0, #1 + movne r0, #0 + bx lr +_020F1A1C: + bne _020F19E4 + cmp r0, #0 + bhi _020F19E4 + cmn ip, r3, lsl #1 + blo _020F19C8 +_020F1A30: + bne _020F19E4 + cmp r2, #0 + bhi _020F19E4 + b _020F19C8 + + .public _dneq + .type _dneq, @function + .public _d_fne + .type _d_fne, @function +_dneq: ; 0x020F1A40 +_d_fne: + mov ip, #0x200000 + cmn ip, r1, lsl #1 + bhs _020F1AA8 + cmn ip, r3, lsl #1 + bhs _020F1ABC +_020F1A54: + orrs ip, r3, r1 + bmi _020F1A84 + cmp r1, r3 + cmpeq r0, r2 + movne r0, #1 + moveq r0, #0 + bx lr +_020F1A70: + mov r0, #1 + mrs ip, cpsr + bic ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1A84: + orr ip, r0, ip, lsl #1 + orrs ip, ip, r2 + moveq r0, #0 + bxeq lr + cmp r3, r1 + cmpeq r2, r0 + movne r0, #1 + moveq r0, #0 + bx lr +_020F1AA8: + bne _020F1A70 + cmp r0, #0 + bhi _020F1A70 + cmn ip, r3, lsl #1 + blo _020F1A54 +_020F1ABC: + bne _020F1A70 + cmp r2, #0 + bhi _020F1A70 + b _020F1A54 + + .public _fgr + .type _fgr, @function + .public _f_fgt + .type _f_fgt, @function +_fgr: ; 0x020F1ACC +_f_fgt: + mov r3, #0xff000000 + cmp r3, r0, lsl #1 + cmphs r3, r1, lsl #1 + blo _020F1B14 + cmp r0, #0 + bicmi r0, r0, #0x80000000 + rsbmi r0, r0, #0 + cmp r1, #0 + bicmi r1, r1, #0x80000000 + rsbmi r1, r1, #0 + cmp r0, r1 + movgt r0, #1 + movle r0, #0 + mrs ip, cpsr + bicle ip, ip, #0x20000000 + orrgt ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F1B14: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr + + .public _fleq + .type _fleq, @function + .public _f_fle + .type _f_fle, @function +_fleq: ; 0x020F1B28 +_f_fle: + mov r3, #0xff000000 + cmp r3, r0, lsl #1 + cmphs r3, r1, lsl #1 + blo _020F1B78 + cmp r0, #0 + bicmi r0, r0, #0x80000000 + rsbmi r0, r0, #0 + cmp r1, #0 + bicmi r1, r1, #0x80000000 + rsbmi r1, r1, #0 + cmp r0, r1 + movle r0, #1 + movgt r0, #0 + mrs ip, cpsr + orrgt ip, ip, #0x20000000 + bicgt ip, ip, #0x40000000 + bicle ip, ip, #0x20000000 + orrle ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1B78: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x40000000 + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr + + .public _fls + .type _fls, @function + .public _f_flt + .type _f_flt, @function +_fls: ; 0x020F1B90 +_f_flt: + mov r3, #0xff000000 + cmp r3, r0, lsl #1 + cmphs r3, r1, lsl #1 + blo _020F1BD8 + cmp r0, #0 + bicmi r0, r0, #0x80000000 + rsbmi r0, r0, #0 + cmp r1, #0 + bicmi r1, r1, #0x80000000 + rsbmi r1, r1, #0 + cmp r0, r1 + movlt r0, #1 + movge r0, #0 + mrs ip, cpsr + orrge ip, ip, #0x20000000 + biclt ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr +_020F1BD8: + mov r0, #0 + mrs ip, cpsr + orr ip, ip, #0x20000000 + msr cpsr_f, ip + bx lr + + .public _feq + .type _feq, @function + .public _f_feq + .type _f_feq, @function +_feq: ; 0x020F1BEC +_f_feq: + mov r3, #0xff000000 + cmp r3, r0, lsl #1 + blo _020F1C40 + cmp r3, r1, lsl #1 + blo _020F1C40 + orr r3, r0, r1 + movs r3, r3, lsl #1 + moveq r0, #1 + bne _020F1C20 + mrs ip, cpsr + orr ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1C20: + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + mrs ip, cpsr + orreq ip, ip, #0x40000000 + bicne ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1C40: + mov r0, #0 + mrs ip, cpsr + bic ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr + + .public _fneq + .type _fneq, @function + .public _f_fne + .type _f_fne, @function +_fneq: ; 0x020F1C54 +_f_fne: + mov r3, #0xff000000 + cmp r3, r0, lsl #1 + blo _020F1CA8 + cmp r3, r1, lsl #1 + blo _020F1CA8 + orr r3, r0, r1 + movs r3, r3, lsl #1 + moveq r0, #0 + bne _020F1C88 + mrs ip, cpsr + orr ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1C88: + cmp r0, r1 + movne r0, #1 + moveq r0, #0 + mrs ip, cpsr + bicne ip, ip, #0x40000000 + orreq ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr +_020F1CA8: + mov r0, #1 + mrs ip, cpsr + bic ip, ip, #0x40000000 + msr cpsr_f, ip + bx lr + + .public _frdiv + .type _frdiv, @function +_frdiv: ; 0x020F1CBC + eor r0, r0, r1 + eor r1, r0, r1 + eor r0, r0, r1 + .public _fdiv + .type _fdiv, @function + .public _f_div + .type _f_div, @function +_fdiv: ; 0x020F1CC8 +_f_div: + stmdb sp!, {lr} + mov ip, #0xff + ands r3, ip, r0, lsr #23 + cmpne r3, #0xff + beq _020F1E9C + ands ip, ip, r1, lsr #23 + cmpne ip, #0xff + beq _020F1ED8 + orr r1, r1, #0x800000 + orr r0, r0, #0x800000 + bic r2, r0, #0xff000000 + bic lr, r1, #0xff000000 +_020F1CF8: + cmp r2, lr + movlo r2, r2, lsl #1 + sublo r3, r3, #1 + teq r0, r1 + adr r0, UNK_020F1D7C - 0x100 + ldrb r1, [r0, lr, lsr #15] + rsb lr, lr, #0 + mov r0, lr, asr #1 + mul r0, r1, r0 + add r0, r0, #0x80000000 + mov r0, r0, lsr #6 + mul r0, r1, r0 + mov r0, r0, lsr #0xe + mul r1, lr, r0 + sub ip, r3, ip + mov r1, r1, lsr #0xc + mul r1, r0, r1 + mov r0, r0, lsl #0xe + add r0, r0, r1, lsr #15 + umull r1, r0, r2, r0 + mov r3, r0 + orrmi r0, r0, #0x80000000 + adds ip, ip, #0x7e + bmi _020F1FA0 + cmp ip, #0xfe + bge _020F2054 + add r0, r0, ip, lsl #23 + mov ip, r1, lsr #0x1c + cmp ip, #7 + beq _020F1E7C + add r0, r0, r1, lsr #31 + ldmia sp!, {lr} + bx lr +UNK_020F1D7C: ; 0x020F1D7C + .byte 0xFF, 0xFF, 0xFE, 0xFD + .byte 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xF0, 0xEF, 0xEE + .byte 0xED, 0xEC, 0xEB, 0xEA, 0xEA, 0xE9, 0xE8, 0xE7, 0xE6, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE2, 0xE1 + .byte 0xE0, 0xDF, 0xDF, 0xDE, 0xDD, 0xDC, 0xDC, 0xDB, 0xDA, 0xD9, 0xD9, 0xD8, 0xD7, 0xD7, 0xD6, 0xD5 + .byte 0xD4, 0xD4, 0xD3, 0xD2, 0xD2, 0xD1, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, 0xCD, 0xCC, 0xCC, 0xCB, 0xCB + .byte 0xCA, 0xC9, 0xC9, 0xC8, 0xC8, 0xC7, 0xC6, 0xC6, 0xC5, 0xC5, 0xC4, 0xC3, 0xC3, 0xC2, 0xC2, 0xC1 + .byte 0xC0, 0xC0, 0xBF, 0xBF, 0xBE, 0xBE, 0xBD, 0xBD, 0xBC, 0xBC, 0xBB, 0xBA, 0xBA, 0xB9, 0xB9, 0xB8 + .byte 0xB8, 0xB7, 0xB7, 0xB6, 0xB6, 0xB5, 0xB5, 0xB4, 0xB4, 0xB3, 0xB3, 0xB2, 0xB2, 0xB1, 0xB1, 0xB0 + .byte 0xB0, 0xAF, 0xAF, 0xAF, 0xAE, 0xAE, 0xAD, 0xAD, 0xAC, 0xAC, 0xAB, 0xAB, 0xAA, 0xAA, 0xAA, 0xA9 + .byte 0xA9, 0xA8, 0xA8, 0xA7, 0xA7, 0xA7, 0xA6, 0xA6, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA3, 0xA3, 0xA2 + .byte 0xA2, 0xA2, 0xA1, 0xA1, 0xA0, 0xA0, 0xA0, 0x9F, 0x9F, 0x9E, 0x9E, 0x9E, 0x9D, 0x9D, 0x9D, 0x9C + .byte 0x9C, 0x9B, 0x9B, 0x9B, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x96 + .byte 0x96, 0x96, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x91, 0x91 + .byte 0x91, 0x91, 0x90, 0x90, 0x90, 0x8F, 0x8F, 0x8F, 0x8E, 0x8E, 0x8E, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C + .byte 0x8C, 0x8C, 0x8B, 0x8B, 0x8B, 0x8A, 0x8A, 0x8A, 0x8A, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88 + .byte 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x83, 0x83 + .byte 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80 +_020F1E7C: + mov r1, r3, lsl #1 + add r1, r1, #1 + rsb lr, lr, #0 + mul r1, lr, r1 + cmp r1, r2, lsl #24 + addmi r0, r0, #1 + ldmia sp!, {lr} + bx lr +_020F1E9C: + eor lr, r0, r1 + and lr, lr, #0x80000000 + cmp r3, #0 + beq _020F1EF4 + movs r0, r0, lsl #9 + bne _020F203C + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F202C + cmp ip, #0xff + blt _020F202C + cmp r1, #0 + beq _020F2048 + b _020F2024 +_020F1ED8: + eor lr, r0, r1 + and lr, lr, #0x80000000 + cmp ip, #0 + beq _020F1F58 +_020F1EE8: + movs r1, r1, lsl #9 + bne _020F2024 + b _020F2074 +_020F1EF4: + movs r2, r0, lsl #9 + beq _020F1F28 + clz r3, r2 + movs r2, r2, lsl r3 + rsb r3, r3, #0 + mov r2, r2, lsr #8 + ands ip, ip, r1, lsr #23 + beq _020F1F80 + cmp ip, #0xff + beq _020F1EE8 + orr r1, r1, #0x800000 + bic lr, r1, #0xff000000 + b _020F1CF8 +_020F1F28: + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F1F4C + cmp ip, #0xff + blt _020F2074 + cmp r1, #0 + beq _020F2074 + b _020F2024 +_020F1F4C: + cmp r1, #0 + beq _020F2048 + b _020F2074 +_020F1F58: + movs ip, r1, lsl #9 + beq _020F202C + mov lr, ip + clz ip, lr + movs lr, lr, lsl ip + rsb ip, ip, #0 + mov lr, lr, lsr #8 + orr r0, r0, #0x800000 + bic r2, r0, #0xff000000 + b _020F1CF8 +_020F1F80: + movs ip, r1, lsl #9 + beq _020F202C + mov lr, ip + clz ip, lr + movs lr, lr, lsl ip + rsb ip, ip, #0 + mov lr, lr, lsr #8 + b _020F1CF8 +_020F1FA0: + and r0, r0, #0x80000000 + cmn ip, #0x18 + beq _020F2014 + bmi _020F206C + add r1, ip, #0x17 + mov r2, r2, lsl r1 + rsb ip, ip, #0 + mov r3, r3, lsr ip + orr r0, r0, r3 + rsb lr, lr, #0 + mul r1, lr, r3 + cmp r1, r2 + ldmeqia sp!, {lr} + bxeq lr + add r1, r1, lr + cmp r1, r2 + beq _020F2008 + addmi r0, r0, #1 + subpl r1, r1, lr + add r1, lr, r1, lsl #1 + cmp r1, r2, lsl #1 + and r3, r0, #1 + addmi r0, r0, #1 + addeq r0, r0, r3 + ldmia sp!, {lr} + bx lr +_020F2008: + add r0, r0, #1 + ldmia sp!, {lr} + bx lr +_020F2014: + cmn r2, lr + addne r0, r0, #1 + ldmia sp!, {lr} + bx lr +_020F2024: + mov r0, r1 + b _020F203C +_020F202C: + mov r0, #0xff000000 + orr r0, lr, r0, lsr #1 + ldmia sp!, {lr} + bx lr +_020F203C: + mvn r0, #0x80000000 + ldmia sp!, {lr} + bx lr +_020F2048: + mvn r0, #0x80000000 + ldmia sp!, {lr} + bx lr +_020F2054: + tst r0, #0x80000000 + mov r0, #0xff000000 + movne r0, r0, asr #1 + moveq r0, r0, lsr #1 + ldmia sp!, {lr} + bx lr +_020F206C: + ldmia sp!, {lr} + bx lr +_020F2074: + mov r0, lr + ldmia sp!, {lr} + bx lr + + .public _f2d + .type _f2d, @function + .public _f_ftod + .type _f_ftod, @function +_f2d: ; 0x020F2080 +_f_ftod: + and r2, r0, #0x80000000 + mov ip, r0, lsr #0x17 + mov r3, r0, lsl #9 + ands ip, ip, #0xff + beq _020F20B0 + cmp ip, #0xff + beq _020F20DC +_020F209C: + add ip, ip, #0x380 + mov r0, r3, lsl #0x14 + orr r1, r2, r3, lsr #12 + orr r1, r1, ip, lsl #20 + bx lr +_020F20B0: + cmp r3, #0 + bne _020F20C4 + mov r1, r2 + mov r0, #0 + bx lr +_020F20C4: + mov r3, r3, lsr #1 + clz ip, r3 + movs r3, r3, lsl ip + rsb ip, ip, #1 + add r3, r3, r3 + b _020F209C +_020F20DC: + cmp r3, #0 + bhi _020F20F4 + ldr r1, _020F2100 ; =0x7FF00000 + orr r1, r1, r2 + mov r0, #0 + bx lr +_020F20F4: + mvn r0, #0 + bic r1, r0, #0x80000000 + bx lr + .align 2, 0 +_020F2100: .word 0x7FF00000 + + .public _f_ftoi + .type _f_ftoi, @function + .public _ffix + .type _ffix, @function +_f_ftoi: ; 0x020F2104 +_ffix: + bic r1, r0, #0x80000000 + mov r2, #0x9e + subs r2, r2, r1, lsr #23 + ble _020F212C + mov r1, r1, lsl #8 + orr r1, r1, #0x80000000 + cmp r0, #0 + mov r0, r1, lsr r2 + rsbmi r0, r0, #0 + bx lr +_020F212C: + mvn r0, r0, asr #31 + add r0, r0, #0x80000000 + bx lr + + .public _ffixu + .type _ffixu, @function + .public _f_ftou + .type _f_ftou, @function +_ffixu: ; 0x020F2138 +_f_ftou: + tst r0, #0x80000000 + bne _020F215C + mov r1, #0x9e + subs r1, r1, r0, lsr #23 + blt _020F2170 + mov r2, r0, lsl #8 + orr r0, r2, #0x80000000 + mov r0, r0, lsr r1 + bx lr +_020F215C: + mov r2, #0xff000000 + cmp r2, r0, lsl #1 + movhs r0, #0 + mvnlo r0, #0 + bx lr +_020F2170: + mvn r0, #0 + bx lr + + .public _fflt + .type _fflt, @function + .public _f_itof + .type _f_itof, @function +_fflt: ; 0x020F2178 +_f_itof: + ands r2, r0, #0x80000000 + rsbmi r0, r0, #0 + cmp r0, #0 +__f_itof_common: + bxeq lr + clz r3, r0 + movs r0, r0, lsl r3 + rsb r3, r3, #0x9e + ands r1, r0, #0xff + add r0, r0, r0 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bxeq lr + tst r1, #0x80 + bxeq lr + ands r3, r1, #0x7f + andeqs r3, r0, #1 + addne r0, r0, #1 + bx lr + + .public _ffltu + .type _ffltu, @function + .public _f_utof + .type _f_utof, @function +_ffltu: ; 0x020F21C0 +_f_utof: + cmp r0, #0 +__f_utof_common: + bxeq lr + mov r3, #0x9e + bmi _020F21DC + clz ip, r0 + movs r0, r0, lsl ip + sub r3, r3, ip +_020F21DC: + ands r2, r0, #0xff + add r0, r0, r0 + mov r0, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bxeq lr + tst r2, #0x80 + bxeq lr + ands r1, r2, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr + + .public _f_lltof + .type _f_lltof, @function + .public _ll_sto_f + .type _ll_sto_f, @function +_f_lltof: ; 0x020F2208 +_ll_sto_f: + ands r2, r1, #0x80000000 + beq _020F2218 + rsbs r0, r0, #0 + rsc r1, r1, #0 +_020F2218: + cmp r1, #0 + bne _020F2228 + movs r0, r0 + b __f_itof_common +_020F2228: + clz r3, r1 + movs r1, r1, lsl r3 + rsb r3, r3, #0x20 + orr r1, r1, r0, lsr r3 + rsb ip, r3, #0x20 + movs r0, r0, lsl ip + orrne r1, r1, #1 + add r3, r3, #0x9e + ands ip, r1, #0xff + add r0, r1, r1 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bxeq lr + tst ip, #0x80 + bxeq lr + ands r3, ip, #0x7f + andeqs r3, r0, #1 + addne r0, r0, #1 + bx lr + + .public _f_ulltof + .type _f_ulltof, @function + .public _ll_uto_f + .type _ll_uto_f, @function +_f_ulltof: ; 0x020F2274 +_ll_uto_f: + cmp r1, #0 + bne _020F2284 + movs r0, r0 + b __f_utof_common +_020F2284: + mov r3, #0x20 + bmi _020F22A4 + clz ip, r1 + movs r1, r1, lsl ip + sub r3, r3, ip + orr r1, r1, r0, lsr r3 + rsb r2, r3, #0x20 + mov r0, r0, lsl r2 +_020F22A4: + cmp r0, #0 + orrne r1, r1, #1 + add r3, r3, #0x9e + ands r2, r1, #0xff + add r0, r1, r1 + mov r0, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bxeq lr + tst r2, #0x80 + bxeq lr + ands r1, r2, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr + + .public _fmul + .type _fmul, @function + .public _f_mul + .type _f_mul, @function +_fmul: ; 0x020F22DC +_f_mul: + eor r2, r0, r1 + and r2, r2, #0x80000000 + mov ip, #0xff + ands r3, ip, r0, lsr #23 + mov r0, r0, lsl #8 + cmpne r3, #0xff + beq _020F2358 + orr r0, r0, #0x80000000 + ands ip, ip, r1, lsr #23 + mov r1, r1, lsl #8 + cmpne ip, #0xff + beq _020F2398 + orr r1, r1, #0x80000000 +_020F2310: + add ip, r3, ip + umull r1, r3, r0, r1 + movs r0, r3 + addpl r0, r0, r0 + subpl ip, ip, #1 + subs ip, ip, #0x7f + bmi _020F2424 + cmp ip, #0xfe + bge _020F2490 + ands r3, r0, #0xff + orr r0, r2, r0, lsr #8 + add r0, r0, ip, lsl #23 + tst r3, #0x80 + bxeq lr + orrs r1, r1, r3, lsl #25 + andeqs r3, r0, #1 + addne r0, r0, #1 + bx lr +_020F2358: + cmp r3, #0 + beq _020F23AC + movs r0, r0, lsl #1 + bne __f_result_x_NaN + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F238C + cmp ip, #0xff + blt __f_result_INF + cmp r1, #0 + beq __f_result_INF + b __f_result_x_NaN +_020F238C: + cmp r1, #0 + beq __f_result_invalid + b __f_result_INF +_020F2398: + cmp ip, #0 + beq _020F2408 +_020F23A0: + movs r1, r1, lsl #1 + bne __f_result_x_NaN + b __f_result_INF +_020F23AC: + movs r0, r0, lsl #1 + beq _020F23E4 + mov r0, r0, lsr #1 + clz r3, r0 + movs r0, r0, lsl r3 + rsb r3, r3, #1 + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #8 + ands ip, ip, #0xff + beq _020F2408 + cmp ip, #0xff + beq _020F23A0 + orr r1, r1, #0x80000000 + b _020F2310 +_020F23E4: + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F24B4 + cmp ip, #0xff + blt _020F24B4 + cmp r1, #0 + beq __f_result_invalid + b __f_result_x_NaN +_020F2408: + movs r1, r1, lsl #1 + beq _020F24B4 + mov r1, r1, lsr #1 + clz ip, r1 + movs r1, r1, lsl ip + rsb ip, ip, #1 + b _020F2310 +_020F2424: + cmn ip, #0x18 + beq _020F246C + bmi _020F24AC + cmp r1, #0 + orrne r0, r0, #1 + mov r3, r0 + mov r0, r0, lsr #8 + rsb ip, ip, #0 + orr r0, r2, r0, lsr ip + rsb ip, ip, #0x18 + movs r1, r3, lsl ip + bxeq lr + tst r1, #0x80000000 + bxeq lr + movs r1, r1, lsl #1 + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F246C: + mov r0, r0, lsl #1 + b _020F249C +__f_result_INF: + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +__f_result_x_NaN: + mvn r0, #0x80000000 + bx lr +__f_result_invalid: + mvn r0, #0x80000000 + bx lr +_020F2490: + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +_020F249C: + movs r1, r0 + mov r0, r2 + addne r0, r0, #1 + bx lr +_020F24AC: + mov r0, r2 + bx lr +_020F24B4: + mov r0, r2 + bx lr + + .public _frsb + .type _frsb, @function +_frsb: ; 0x020F24BC + eor r0, r0, r1 + eor r1, r0, r1 + eor r0, r0, r1 + .public _fsub + .type _fsub, @function + .public _f_sub + .type _f_sub, @function +_fsub: ; 0x020F24C8 +_f_sub: ; 0x020F24C8 + eors r2, r0, r1 + eormi r1, r1, #0x80000000 + bmi __fadd_start +__fsub_start: + subs ip, r0, r1 + eorlo ip, ip, #0x80000000 + sublo r0, r0, ip + addlo r1, r1, ip + mov r2, #0x80000000 + mov r3, r0, lsr #0x17 + orr r0, r2, r0, lsl #8 + ands ip, r3, #0xff + cmpne ip, #0xff + beq _020F25F0 + mov ip, r1, lsr #0x17 + orr r1, r2, r1, lsl #8 + ands r2, ip, #0xff + beq _020F2630 +_020F250C: + subs ip, r3, ip + beq _020F2554 + rsb r2, ip, #0x20 + movs r2, r1, lsl r2 + mov r1, r1, lsr ip + orrne r1, r1, #1 + subs r0, r0, r1 + bpl _020F2598 + ands r1, r0, #0xff + add r0, r0, r0 + mov r0, r0, lsr #9 + orr r0, r0, r3, lsl #23 + tst r1, #0x80 + bxeq lr + ands r1, r1, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F2554: + subs r0, r0, r1 + beq _020F26FC + mov r2, r3, lsl #0x17 + and r2, r2, #0x80000000 + bic r3, r3, #0x100 + clz ip, r0 + movs r0, r0, lsl ip + sub r3, r3, ip + cmp r3, #0 + bgt _020F2588 + rsb r3, r3, #9 + orr r0, r2, r0, lsr r3 + bx lr +_020F2588: + add r0, r0, r0 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bx lr +_020F2598: + mov r2, r3, lsl #0x17 + and r2, r2, #0x80000000 + bic r3, r3, #0x100 + clz ip, r0 + movs r0, r0, lsl ip + sub r3, r3, ip + cmp r3, #0 + bgt _020F25C4 + rsb r3, r3, #9 + orr r0, r2, r0, lsr r3 + bx lr +_020F25C4: + ands r1, r0, #0xff + add r0, r0, r0 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bxeq lr + tst r1, #0x80 + bxeq lr + ands r1, r1, #0x7f + andeqs r1, r0, #1 + addne r0, r0, #1 + bx lr +_020F25F0: + cmp r3, #0x100 + movge r2, #0x80000000 + movlt r2, #0 + ands r3, r3, #0xff + beq _020F2658 + movs r0, r0, lsl #1 + bne _020F2730 + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #9 + ands ip, ip, #0xff + beq _020F2724 + cmp ip, #0xff + blt _020F2724 + cmp r1, #0 + beq _020F2738 + b _020F2730 +_020F2630: + cmp ip, #0x100 + movge r2, #0x80000000 + movlt r2, #0 + and r3, r3, #0xff + ands ip, ip, #0xff + beq _020F26C0 +_020F2648: + eor r2, r2, #0x80000000 + movs r1, r1, lsl #1 + bne _020F2730 + b _020F2724 +_020F2658: + movs r0, r0, lsl #1 + beq _020F2690 + mov r0, r0, lsr #1 + mov r3, #1 + mov ip, r1, lsr #0x17 + mov r1, r1, lsl #8 + ands ip, ip, #0xff + beq _020F26C0 + cmp ip, #0xff + beq _020F2648 + orr r1, r1, #0x80000000 + orr r3, r3, r2, lsr #23 + orr ip, ip, r2, lsr #23 + b _020F250C +_020F2690: + mov r3, r1, lsr #0x17 + mov r0, r1, lsl #9 + ands r2, r3, #0xff + beq _020F26B4 + cmp r2, #0xff + blt _020F26DC + cmp r0, #0 + bne _020F271C + b _020F2724 +_020F26B4: + cmp r0, #0 + beq _020F26FC + b _020F26DC +_020F26C0: + movs r1, r1, lsl #1 + beq _020F26E4 + mov r1, r1, lsr #1 + mov ip, #1 + orr ip, ip, r2, lsr #23 + orr r3, r3, r2, lsr #23 + b _020F250C +_020F26DC: + mov r0, r1 + bx lr +_020F26E4: + cmp r0, #0 + subges r3, r3, #1 + add r0, r0, r0 + orr r0, r2, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bx lr +_020F26FC: + mov r0, #0 + bx lr +_020F2704: ; 0x020F2704 + cmp r0, #0 + subges r3, r3, #1 + add r0, r0, r0 + mov r0, r0, lsr #9 + orr r0, r0, r3, lsl #23 + bx lr +_020F271C: + mvn r0, #0x80000000 + bx lr +_020F2724: + mov r0, #0xff000000 + orr r0, r2, r0, lsr #1 + bx lr +_020F2730: + mvn r0, #0x80000000 + bx lr +_020F2738: + mvn r0, #0x80000000 + bx lr + + .public _ll_mod + .type _ll_mod, @function +_ll_mod: ; 0x020F2740 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, r1 + orr r4, r4, #1 + b _020F2760 + + .public _ll_sdiv + .type _ll_sdiv, @function + .public _ll_div + .type _ll_div, @function +_ll_sdiv: ; 0x020F2750 +_ll_div: ; 0x020F2750 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + eor r4, r1, r3 + mov r4, r4, asr #1 + mov r4, r4, lsl #1 +_020F2760: + orrs r5, r3, r2 + bne _020F2770 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_020F2770: + mov r5, r0, lsr #0x1f + add r5, r5, r1 + mov r6, r2, lsr #0x1f + add r6, r6, r3 + orrs r6, r5, r6 + bne _020F27A4 + mov r1, r2 + bl _s32_div_f + ands r4, r4, #1 + movne r0, r1 + mov r1, r0, asr #0x1f + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_020F27A4: + cmp r1, #0 + bge _020F27B4 + rsbs r0, r0, #0 + rsc r1, r1, #0 +_020F27B4: + cmp r3, #0 + bge _020F27C4 + rsbs r2, r2, #0 + rsc r3, r3, #0 +_020F27C4: + orrs r5, r1, r0 + beq _020F28E8 + mov r5, #0 + mov r6, #1 + cmp r3, #0 + bmi _020F27F0 +_020F27DC: + add r5, r5, #1 + adds r2, r2, r2 + adcs r3, r3, r3 + bpl _020F27DC + add r6, r6, r5 +_020F27F0: + cmp r1, #0 + blt _020F2810 +_020F27F8: + cmp r6, #1 + beq _020F2810 + sub r6, r6, #1 + adds r0, r0, r0 + adcs r1, r1, r1 + bpl _020F27F8 +_020F2810: + mov r7, #0 + mov ip, #0 + mov fp, #0 + b _020F2838 +_020F2820: + orr ip, ip, #1 + subs r6, r6, #1 + beq _020F2890 + adds r0, r0, r0 + adcs r1, r1, r1 + adcs r7, r7, r7 +_020F2838: + subs r0, r0, r2 + sbcs r1, r1, r3 + sbcs r7, r7, #0 + adds ip, ip, ip + adc fp, fp, fp + cmp r7, #0 + bge _020F2820 +_020F2854: + subs r6, r6, #1 + beq _020F2888 + adds r0, r0, r0 + adcs r1, r1, r1 + adc r7, r7, r7 + adds r0, r0, r2 + adcs r1, r1, r3 + adc r7, r7, #0 + adds ip, ip, ip + adc fp, fp, fp + cmp r7, #0 + bge _020F2820 + b _020F2854 +_020F2888: + adds r0, r0, r2 + adc r1, r1, r3 +_020F2890: + ands r7, r4, #1 + moveq r0, ip + moveq r1, fp + beq _020F28C8 + subs r7, r5, #0x20 + movge r0, r1, lsr r7 + bge _020F28EC + rsb r7, r5, #0x20 + mov r0, r0, lsr r5 + orr r0, r0, r1, lsl r7 + mov r1, r1, lsr r5 + b _020F28C8 +_020F28C0: ; 0x020F28C0 + mov r0, r1, lsr r7 + mov r1, #0 +_020F28C8: + cmp r4, #0 + blt _020F28D8 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_020F28D8: + rsbs r0, r0, #0 + rsc r1, r1, #0 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_020F28E8: + mov r0, #0 +_020F28EC: + mov r1, #0 + cmp r4, #0 + blt _020F28D8 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr + + .public _ll_udiv + .type _ll_udiv, @function + .public _ull_div + .type _ull_div, @function +_ll_udiv: ; 0x020F2900 +_ull_div: + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, #0 + b _020F2914 + + .public _ull_mod + .type _ull_mod, @function +_ull_mod: ; 0x020F290C + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, #1 +_020F2914: + orrs r5, r3, r2 + bne _020F2924 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_020F2924: + orrs r5, r1, r3 + bne _020F27C4 + mov r1, r2 + bl _u32_div_not_0_f + cmp r4, #0 + movne r0, r1 + mov r1, #0 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr + + .public _ll_mul + .type _ll_mul, @function + .public _ull_mul + .type _ull_mul, @function +_ll_mul: ; 0x020F2948 +_ull_mul: ; 0x020F2948 + stmdb sp!, {r4, r5, lr} + umull r5, r4, r0, r2 + mla r4, r0, r3, r4 + mla r4, r2, r1, r4 + mov r1, r4 + mov r0, r5 + ldmia sp!, {r4, r5, lr} + bx lr + + .public _ll_shl + .type _ll_shl, @function + .public _ll_sll + .type _ll_sll, @function + .public _ull_sll + .type _ull_sll, @function +_ll_shl: ; 0x020F2968 +_ll_sll: +_ull_sll: + ands r2, r2, #0x3f + bxeq lr + subs r3, r2, #0x20 + bge _020F298C + rsb r3, r2, #0x20 + mov r1, r1, lsl r2 + orr r1, r1, r0, lsr r3 + mov r0, r0, lsl r2 + bx lr +_020F298C: + mov r1, r0, lsl r3 + mov r0, #0 + bx lr + + .public _s32_div_f + .type _s32_div_f, @function +_s32_div_f: ; 0x020F2998 + eor ip, r0, r1 + and ip, ip, #0x80000000 + cmp r0, #0 + rsblt r0, r0, #0 + addlt ip, ip, #1 + cmp r1, #0 + rsblt r1, r1, #0 + beq _020F2B90 + cmp r0, r1 + movlo r1, r0 + movlo r0, #0 + blo _020F2B90 + mov r2, #0x1c + mov r3, r0, lsr #4 + cmp r1, r3, lsr #12 + suble r2, r2, #0x10 + movle r3, r3, lsr #0x10 + cmp r1, r3, lsr #4 + suble r2, r2, #8 + movle r3, r3, lsr #8 + cmp r1, r3 + suble r2, r2, #4 + movle r3, r3, lsr #4 + mov r0, r0, lsl r2 + rsb r1, r1, #0 + adds r0, r0, r0 + add r2, r2, r2, lsl #1 + add pc, pc, r2, lsl #2 + nop + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + mov r1, r3 +_020F2B90: + ands r3, ip, #0x80000000 + rsbne r0, r0, #0 + ands r3, ip, #1 + rsbne r1, r1, #0 + bx lr + + .public _u32_div_f + .type _u32_div_f, @function +_u32_div_f: ; 0x020F2BA4 + cmp r1, #0 + bxeq lr + .public _u32_div_not_0_f + .type _u32_div_not_0_f, @function +_u32_div_not_0_f: ; 0x020F2BAC + cmp r0, r1 + movlo r1, r0 + movlo r0, #0 + bxlo lr + mov r2, #0x1c + mov r3, r0, lsr #4 + cmp r1, r3, lsr #12 + suble r2, r2, #0x10 + movle r3, r3, lsr #0x10 + cmp r1, r3, lsr #4 + suble r2, r2, #8 + movle r3, r3, lsr #8 + cmp r1, r3 + suble r2, r2, #4 + movle r3, r3, lsr #4 + mov r0, r0, lsl r2 + rsb r1, r1, #0 + adds r0, r0, r0 + add r2, r2, r2, lsl #1 + add pc, pc, r2, lsl #2 + nop + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + mov r1, r3 + bx lr + + .public _drdiv + .type _drdiv, @function +_drdiv: ; 0x020F2D88 + eor r1, r1, r3 + eor r3, r1, r3 + eor r1, r1, r3 + eor r0, r0, r2 + eor r2, r0, r2 + eor r0, r0, r2 + .public _ddiv + .type _ddiv, @function + .public _d_div + .type _d_div, @function +_ddiv: ; 0x020F2DA0 +_d_div: + stmdb sp!, {r4, r5, r6, lr} + ldr lr, _020F32E0 ; =0x00000FFE + eor r4, r1, r3 + ands ip, lr, r1, lsr #19 + cmpne ip, lr + beq _020F314C + bic r1, r1, lr, lsl #20 + orr r1, r1, #0x100000 + add ip, ip, r4, lsr #31 +_020F2DC4: + ands r4, lr, r3, lsr #19 + cmpne r4, lr + beq _020F31E4 + bic r3, r3, lr, lsl #20 + orr r3, r3, #0x100000 +_020F2DD8: + sub ip, ip, r4 + cmp r1, r3 + cmpeq r0, r2 + bhs _020F2DF4 + adds r0, r0, r0 + adc r1, r1, r1 + sub ip, ip, #2 +_020F2DF4: + adr r4, UNK_020F2ED8 - 0x100 + ldrb lr, [r4, r3, lsr #12] + rsbs r2, r2, #0 + rsc r3, r3, #0 + mov r4, #0x20000000 + mla r5, lr, r3, r4 + mov r6, r3, lsl #0xa + mov r5, r5, lsr #7 + mul lr, r5, lr + orr r6, r6, r2, lsr #22 + mov lr, lr, lsr #0xd + mul r5, lr, r6 + mov r6, r1, lsl #0xa + orr r6, r6, r0, lsr #22 + mov r5, r5, lsr #0x10 + mul r5, lr, r5 + mov lr, lr, lsl #0xe + add lr, lr, r5, lsr #16 + umull r5, r6, lr, r6 + umull r4, r5, r6, r2 + mla r5, r3, r6, r5 + mov r4, r4, lsr #0x1a + orr r4, r4, r5, lsl #6 + add r4, r4, r0, lsl #2 + umull lr, r5, r4, lr + mov r4, #0 + adds r5, r5, r6, lsl #24 + adc r4, r4, r6, lsr #8 + cmp ip, #0x800 + bge _020F2FD8 + add ip, ip, #0x7f0 + adds ip, ip, #0xc + bmi _020F2FF0 + orr r1, r4, ip, lsl #31 + bic ip, ip, #1 + add r1, r1, ip, lsl #19 + tst lr, #0x80000000 + bne _020F2EC8 + rsbs r2, r2, #0 + mov r4, r4, lsl #1 + add r4, r4, r5, lsr #31 + mul lr, r2, r4 + mov r6, #0 + mov r4, r5, lsl #1 + orr r4, r4, #1 + umlal r6, lr, r4, r2 + rsc r3, r3, #0 + mla lr, r4, r3, lr + cmp lr, r0, lsl #21 + bmi _020F2EC8 + mov r0, r5 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F2EC8: + adds r0, r5, #1 + adc r1, r1, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +UNK_020F2ED8: ; 0x020F2ED8 + .byte 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9 + .byte 0xF8, 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xF0, 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA + .byte 0xEA, 0xE9, 0xE8, 0xE7, 0xE6, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE2, 0xE1, 0xE0, 0xDF, 0xDF, 0xDE + .byte 0xDD, 0xDC, 0xDC, 0xDB, 0xDA, 0xD9, 0xD9, 0xD8, 0xD7, 0xD7, 0xD6, 0xD5, 0xD4, 0xD4, 0xD3, 0xD2 + .byte 0xD2, 0xD1, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, 0xCD, 0xCC, 0xCC, 0xCB, 0xCB, 0xCA, 0xC9, 0xC9, 0xC8 + .byte 0xC8, 0xC7, 0xC6, 0xC6, 0xC5, 0xC5, 0xC4, 0xC3, 0xC3, 0xC2, 0xC2, 0xC1, 0xC0, 0xC0, 0xBF, 0xBF + .byte 0xBE, 0xBE, 0xBD, 0xBD, 0xBC, 0xBC, 0xBB, 0xBA, 0xBA, 0xB9, 0xB9, 0xB8, 0xB8, 0xB7, 0xB7, 0xB6 + .byte 0xB6, 0xB5, 0xB5, 0xB4, 0xB4, 0xB3, 0xB3, 0xB2, 0xB2, 0xB1, 0xB1, 0xB0, 0xB0, 0xAF, 0xAF, 0xAF + .byte 0xAE, 0xAE, 0xAD, 0xAD, 0xAC, 0xAC, 0xAB, 0xAB, 0xAA, 0xAA, 0xAA, 0xA9, 0xA9, 0xA8, 0xA8, 0xA7 + .byte 0xA7, 0xA7, 0xA6, 0xA6, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA3, 0xA3, 0xA2, 0xA2, 0xA2, 0xA1, 0xA1 + .byte 0xA0, 0xA0, 0xA0, 0x9F, 0x9F, 0x9E, 0x9E, 0x9E, 0x9D, 0x9D, 0x9D, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B + .byte 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x96, 0x96, 0x96, 0x95, 0x95 + .byte 0x95, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90 + .byte 0x90, 0x8F, 0x8F, 0x8F, 0x8E, 0x8E, 0x8E, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C, 0x8C, 0x8C, 0x8B, 0x8B + .byte 0x8B, 0x8A, 0x8A, 0x8A, 0x8A, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x86 + .byte 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82 + .byte 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80 +_020F2FD8: + movs r1, ip, lsl #0x1f + orr r1, r1, #0x7f000000 + orr r1, r1, #0xf00000 + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F2FF0: + mvn r6, ip, asr #1 + cmp r6, #0x34 + bgt _020F313C + beq _020F3118 + cmp r6, #0x14 + bge _020F3038 + rsb r6, r6, #0x13 + mov lr, r0, lsl r6 + rsb r6, r6, #0x14 + mov r0, r5, lsr r6 + rsb r6, r6, #0x20 + orr r0, r0, r4, lsl r6 + rsb r6, r6, #0x20 + mov r4, r4, lsr r6 + orr r1, r4, ip, lsl #31 + mov ip, lr + mov lr, #0 + b _020F3068 +_020F3038: + rsb r6, r6, #0x33 + mov lr, r1, lsl r6 + mov r1, ip, lsl #0x1f + rsb r6, r6, #0x20 + orr ip, lr, r0, lsr r6 + rsb r6, r6, #0x20 + mov lr, r0, lsl r6 + mov r5, r5, lsr #0x15 + orr r5, r5, r4, lsl #11 + rsb r6, r6, #0x1f + mov r0, r5, lsr r6 + mov r4, #0 +_020F3068: + rsbs r2, r2, #0 + mul r4, r2, r4 + mov r5, #0 + umlal r5, r4, r2, r0 + rsc r3, r3, #0 + mla r4, r0, r3, r4 + cmp r4, ip + cmpeq r5, lr + ldmeqia sp!, {r4, r5, r6, lr} + bxeq lr + adds r5, r5, r2 + adc r4, r4, r3 + cmp r4, ip + bmi _020F310C + bne _020F30B0 + cmp r5, lr + beq _020F30FC + blo _020F310C +_020F30B0: + subs r5, r5, r2 + sbc r4, r4, r3 +_020F30B8: + adds r5, r5, r5 + adc r4, r4, r4 + adds r5, r5, r2 + adc r4, r4, r3 + adds lr, lr, lr + adc ip, ip, ip + cmp r4, ip + bmi _020F30FC + ldmneia sp!, {r4, r5, r6, lr} + bxne lr + cmp r5, lr + blo _020F30FC + ldmneia sp!, {r4, r5, r6, lr} + bxne lr + tst r0, #1 + ldmeqia sp!, {r4, r5, r6, lr} + bxeq lr +_020F30FC: + adds r0, r0, #1 + adc r1, r1, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F310C: + adds r0, r0, #1 + adc r1, r1, #0 + b _020F30B8 +_020F3118: + rsbs r2, r2, #0 + rsc r3, r3, #0 + cmp r1, r3 + cmpeq r0, r2 + mov r1, ip, lsl #0x1f + mov r0, #0 + movne r0, #1 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F313C: + mov r1, ip, lsl #0x1f + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F314C: + orrs r5, r0, r1, lsl #1 + beq _020F3270 + cmp ip, lr + beq _020F31B4 + movs r1, r1, lsl #0xc + beq _020F3190 + clz r5, r1 + movs r1, r1, lsl r5 + sub ip, ip, r5 + add r5, ip, #0x1f + mov r1, r1, lsr #0xb + orr r1, r1, r0, lsr r5 + rsb r5, r5, #0x20 + mov r0, r0, lsl r5 + mov ip, ip, lsl #1 + orr ip, ip, r4, lsr #31 + b _020F2DC4 +_020F3190: + mvn ip, #0x13 + clz r5, r0 + movs r0, r0, lsl r5 + sub ip, ip, r5 + mov r1, r0, lsr #0xb + mov r0, r0, lsl #0x15 + mov ip, ip, lsl #1 + orr ip, ip, r4, lsr #31 + b _020F2DC4 +_020F31B4: + orrs r5, r0, r1, lsl #12 + bne _020F3298 + bic r5, r3, #0x80000000 + cmp r5, lr, lsl #19 + bhs _020F31D8 + and r5, r3, #0x80000000 + eor r1, r5, r1 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F31D8: + orrs r5, r2, r3, lsl #12 + bne _020F32B8 + b _020F32D0 +_020F31E4: + orrs r5, r2, r3, lsl #1 + beq _020F325C + cmp r4, lr + beq _020F3244 + movs r3, r3, lsl #0xc + beq _020F3224 + clz r5, r3 + movs r3, r3, lsl r5 + sub r4, r4, r5 + add r5, r4, #0x1f + mov r3, r3, lsr #0xb + orr r3, r3, r2, lsr r5 + rsb r5, r5, #0x20 + mov r2, r2, lsl r5 + mov r4, r4, lsl #1 + b _020F2DD8 +_020F3224: + mvn r4, #0x13 + clz r5, r2 + movs r2, r2, lsl r5 + sub r4, r4, r5 + mov r3, r2, lsr #0xb + mov r2, r2, lsl #0x15 + mov r4, r4, lsl #1 + b _020F2DD8 +_020F3244: + orrs r5, r2, r3, lsl #12 + bne _020F32B8 + mov r1, ip, lsl #0x1f + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F325C: + mov r1, ip, lsl #0x1f + orr r1, r1, lr, lsl #19 + mov r0, #0 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F3270: + orrs r5, r2, r3, lsl #1 + beq _020F32D0 + bic r5, r3, #0x80000000 + cmp r5, lr, lsl #19 + cmpeq r2, #0 + bhi _020F32B8 + eor r1, r1, r3 + and r1, r1, #0x80000000 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F3298: + tst r1, #0x80000 + beq _020F32D0 + bic r5, r3, #0x80000000 + cmp r5, lr, lsl #19 + cmpeq r2, #0 + bhi _020F32B8 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F32B8: + tst r3, #0x80000 + beq _020F32D0 + mov r1, r3 + mov r0, r2 + ldmia sp!, {r4, r5, r6, lr} + bx lr +_020F32D0: + orr r1, r1, #0x7f000000 + orr r1, r1, #0xf80000 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_020F32E0: .word 0x00000FFE + + .public _fp_init + .type _fp_init, @function +_fp_init: ; 0x020F32E4 + bx lr + + ; NITRO_Runtime_Ai_LE.a + + arm_func_start sys_writec +sys_writec: ; 0x020F32E8 + str lr, [sp, #-4]! + mov r1, r0 + mov r0, #3 + swi 0x123456 + ldr pc, [sp], #4 + arm_func_end sys_writec + + arm_func_start sys_readc +sys_readc: ; 0x020F32FC + str lr, [sp, #-4]! + mov r1, #0 + mov r0, #7 + swi 0x123456 + ldr pc, [sp], #4 + arm_func_end sys_readc + + arm_func_start sys_exit +sys_exit: ; 0x020F3310 + mov r1, #0 + mov r0, #0x18 + swi 0x123456 + mov pc, lr + arm_func_end sys_exit + + arm_func_start __read_console +__read_console: ; 0x020F3320 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r2 + ldr r5, [r6] + mov r7, r1 + cmp r5, #0 + mov r4, #0 + bls _020F3368 +_020F333C: + bl sys_readc + and r1, r0, #0xff + cmp r1, #0xd + strb r0, [r7, r4] + cmpne r1, #0xa + addeq r0, r4, #1 + streq r0, [r6] + beq _020F3368 + add r4, r4, #1 + cmp r4, r5 + blo _020F333C +_020F3368: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end __read_console + + arm_func_start __write_console +__write_console: ; 0x020F3370 + stmdb sp!, {r4, r5, r6, lr} + ldr r5, [r2] + mov r6, r1 + cmp r5, #0 + mov r4, #0 + bls _020F339C +_020F3388: + add r0, r6, r4 + bl sys_writec + add r4, r4, #1 + cmp r4, r5 + blo _020F3388 +_020F339C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end __write_console + + arm_func_start __close_console +__close_console: ; 0x020F33A4 + mov r0, #0 + bx lr + arm_func_end __close_console + + arm_func_start _Z20__DecodeSignedNumberPcPl +_Z20__DecodeSignedNumberPcPl: ; 0x020F33AC + stmdb sp!, {r4, lr} + ldrsb r2, [r0] + tst r2, #1 + bne _020F33CC + mov r2, r2, asr #1 + str r2, [r1] + add r0, r0, #1 + ldmia sp!, {r4, pc} +_020F33CC: + tst r2, #2 + ldrb r4, [r0, #1] + bne _020F33EC + mov r2, r2, asr #2 + orr r2, r4, r2, lsl #8 + str r2, [r1] + add r0, r0, #2 + ldmia sp!, {r4, pc} +_020F33EC: + tst r2, #4 + ldrb lr, [r0, #2] + bne _020F3414 + mov r3, r2, asr #3 + mov r2, r4, lsl #8 + orr r2, r2, r3, lsl #16 + orr r2, lr, r2 + str r2, [r1] + add r0, r0, #3 + ldmia sp!, {r4, pc} +_020F3414: + ldrb ip, [r0, #3] + mov r3, r2, asr #3 + mov r2, r4, lsl #0x10 + orr r2, r2, r3, lsl #24 + orr r2, r2, lr, lsl #8 + orr r2, ip, r2 + str r2, [r1] + add r0, r0, #4 + ldmia sp!, {r4, pc} + arm_func_end _Z20__DecodeSignedNumberPcPl + + arm_func_start _Z22__DecodeUnsignedNumberPcPm +_Z22__DecodeUnsignedNumberPcPm: ; 0x020F3438 + stmdb sp!, {r4, lr} + ldrb r2, [r0] + tst r2, #1 + bne _020F3458 + mov r2, r2, lsr #1 + str r2, [r1] + add r0, r0, #1 + ldmia sp!, {r4, pc} +_020F3458: + tst r2, #2 + ldrb r4, [r0, #1] + bne _020F3478 + mov r2, r2, lsr #2 + orr r2, r4, r2, lsl #8 + str r2, [r1] + add r0, r0, #2 + ldmia sp!, {r4, pc} +_020F3478: + tst r2, #4 + ldrb lr, [r0, #2] + bne _020F34A0 + mov r3, r2, lsr #3 + mov r2, r4, lsl #8 + orr r2, r2, r3, lsl #16 + orr r2, lr, r2 + str r2, [r1] + add r0, r0, #3 + ldmia sp!, {r4, pc} +_020F34A0: + ldrb ip, [r0, #3] + mov r3, r2, lsr #3 + mov r2, r4, lsl #0x10 + orr r2, r2, r3, lsl #24 + orr r2, r2, lr, lsl #8 + orr r2, ip, r2 + str r2, [r1] + add r0, r0, #4 + ldmia sp!, {r4, pc} + arm_func_end _Z22__DecodeUnsignedNumberPcPm + + arm_func_start _Z12BinarySearchP19ExceptionTableIndexmPc +_Z12BinarySearchP19ExceptionTableIndexmPc: ; 0x020F34C4 + stmdb sp!, {r4, r5, r6, lr} + subs r6, r1, #1 + mov r5, #0 + bmi _020F3520 + mov r1, #0xc +_020F34D8: + add r3, r5, r6 + mov r4, r3, asr #1 + mul r3, r4, r1 + ldr ip, [r0, r3] + add lr, r0, r3 + cmp r2, ip + sublo r6, r4, #1 + blo _020F3518 + ldr r3, [lr, #4] + bic r3, r3, #1 + add r3, ip, r3 + cmp r2, r3 + addhi r5, r4, #1 + bhi _020F3518 + mov r0, lr + ldmia sp!, {r4, r5, r6, pc} +_020F3518: + cmp r5, r6 + ble _020F34D8 +_020F3520: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end _Z12BinarySearchP19ExceptionTableIndexmPc + + arm_func_start _Z19FindExceptionRecordPcP13ExceptionInfo +_Z19FindExceptionRecordPcP13ExceptionInfo: ; 0x020F3528 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + mov r4, r0 + mov sb, r1 + mov r2, #0 + str r2, [sb, #4] + mov r0, sb + mov r1, r4 + str r2, [sb, #8] + bl _Z20__FindExceptionTableP13ExceptionInfoPc + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sb, #0xc] + ldr r1, [sb, #0x10] + ldr r3, _020F362C ; =0x2AAAAAAB + sub r5, r1, r0 + smull r2, r1, r3, r5 + mov r3, r5, lsr #0x1f + mov r2, r4 + add r1, r3, r1, asr #1 + bl _Z12BinarySearchP19ExceptionTableIndexmPc + cmp r0, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r1, [r0, #4] + tst r1, #1 + addne r1, r0, #8 + ldreq r1, [r0, #8] + str r1, [sb, #4] + ldr r1, [r0] + str r1, [sb] + ldr r1, [r0] + ldr r0, [sb, #4] + sub r7, r4, r1 + bl _Z16__SkipUnwindInfoPc + mov r8, #0 + add r5, sp, #4 + add r4, sp, #0 + add r6, sp, #8 +_020F35C8: + mov r1, r6 + bl _Z22__DecodeUnsignedNumberPcPm + ldr r1, [sp, #8] + cmp r1, #0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r1, r5 + bl _Z22__DecodeUnsignedNumberPcPm + mov r1, r4 + bl _Z22__DecodeUnsignedNumberPcPm + ldr r1, [sp, #8] + add r2, r8, r1 + cmp r7, r2 + addlo sp, sp, #0xc + ldmloia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r1, [sp, #4] + add r8, r2, r1 + cmp r7, r8 + bhi _020F35C8 + ldr r1, [sb, #4] + ldr r0, [sp] + add r0, r1, r0 + str r0, [sb, #8] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020F362C: .word 0x2AAAAAAB + arm_func_end _Z19FindExceptionRecordPcP13ExceptionInfo + + arm_func_start _Z13CurrentActionPK14ActionIterator +_Z13CurrentActionPK14ActionIterator: ; 0x020F3630 + ldr r0, [r0, #8] + cmp r0, #0 + ldrneb r0, [r0] + andne r0, r0, #0x1f + moveq r0, #0 + and r0, r0, #0xff + bx lr + arm_func_end _Z13CurrentActionPK14ActionIterator + + arm_func_start _Z10NextActionP14ActionIterator +_Z10NextActionP14ActionIterator: ; 0x020F364C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0xa0 + mov r4, r0 +_020F3658: + ldr r2, [r4, #8] + cmp r2, #0 + beq _020F3670 + ldrb r0, [r2] + tst r0, #0x80 + beq _020F36B4 +_020F3670: + mov r1, r4 + add r0, r4, #0x18 + bl _Z15__PopStackFrameP12ThrowContextP13ExceptionInfo + mov r1, r4 + bl _Z19FindExceptionRecordPcP13ExceptionInfo + ldr r0, [r4, #4] + cmp r0, #0 + addeq sp, sp, #0xa0 + moveq r0, #0xff + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, r4 + add r0, r4, #0x18 + bl _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo + ldr r0, [r4, #8] + cmp r0, #0 + beq _020F3658 + b _020F3984 +_020F36B4: + and r0, r0, #0x1f + cmp r0, #0x13 + addls pc, pc, r0, lsl #2 + b _020F3978 +_020F36C4: ; jump table + b _020F3978 ; case 0 + b _020F3978 ; case 1 + b _020F3714 ; case 2 + b _020F372C ; case 3 + b _020F374C ; case 4 + b _020F3764 ; case 5 + b _020F378C ; case 6 + b _020F37AC ; case 7 + b _020F37CC ; case 8 + b _020F37F4 ; case 9 + b _020F3824 ; case 10 + b _020F383C ; case 11 + b _020F385C ; case 12 + b _020F3878 ; case 13 + b _020F3978 ; case 14 + b _020F388C ; case 15 + b _020F38B8 ; case 16 + b _020F3904 ; case 17 + b _020F3938 ; case 18 + b _020F3964 ; case 19 +_020F3714: + add r1, sp, #0x9c + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F372C: + add r1, sp, #0x94 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x98 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F374C: + add r1, sp, #0x90 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F3764: + add r1, sp, #0x84 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x88 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x8c + bl _Z22__DecodeUnsignedNumberPcPm + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F378C: + add r1, sp, #0x7c + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x80 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F37AC: + add r1, sp, #0x74 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x78 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F37CC: + add r1, sp, #0x68 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x6c + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x70 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F37F4: + add r1, sp, #0x58 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x5c + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x60 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x64 + bl _Z22__DecodeUnsignedNumberPcPm + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F3824: + add r1, sp, #0x54 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F383C: + add r1, sp, #0x4c + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x50 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F385C: + add r1, sp, #0x44 + add r0, r2, #5 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x48 + bl _Z20__DecodeSignedNumberPcPl + str r0, [r4, #8] + b _020F3984 +_020F3878: + add r1, sp, #0x40 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + str r0, [r4, #8] + b _020F3984 +_020F388C: + add r1, sp, #0x34 + add r0, r2, #1 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x38 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x3c + bl _Z20__DecodeSignedNumberPcPl + ldr r1, [sp, #0x34] + add r0, r0, r1, lsl #2 + str r0, [r4, #8] + b _020F3984 +_020F38B8: + add r1, sp, #0x24 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x28 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + orr r2, r1, r5, lsl #24 + add r1, sp, #0x2c + add r0, r0, #4 + str r2, [sp, #0x30] + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F3904: + add r1, sp, #0x14 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x1c + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x18 + add r0, r0, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F3938: + add r1, sp, #8 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0xc + add r0, r0, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x10 + bl _Z22__DecodeUnsignedNumberPcPm + add r0, r0, #4 + str r0, [r4, #8] + b _020F3984 +_020F3964: + add r1, sp, #4 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + str r0, [r4, #8] + b _020F3984 +_020F3978: + add sp, sp, #0xa0 + mov r0, #0xff + ldmia sp!, {r3, r4, r5, pc} +_020F3984: + ldr r2, [r4, #8] + ldrb r0, [r2] + and r0, r0, #0x1f + cmp r0, #1 + addne sp, sp, #0xa0 + ldmneia sp!, {r3, r4, r5, pc} + add r5, sp, #0 +_020F39A0: + mov r1, r5 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + ldr r1, [r4, #8] + ldr r0, [sp] + add r2, r1, r0 + str r2, [r4, #8] + ldrb r0, [r2] + and r0, r0, #0x1f + cmp r0, #1 + beq _020F39A0 + add sp, sp, #0xa0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end _Z10NextActionP14ActionIterator + + arm_func_start _Z11UnwindStackP12ThrowContextP13ExceptionInfoPc +_Z11UnwindStackP12ThrowContextP13ExceptionInfoPc: ; 0x020F39D4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xa4 + mov sb, r0 + mov r8, r1 + str r2, [sp] +_020F39E8: + ldr r2, [r8, #8] + cmp r2, #0 + bne _020F3A30 + mov r0, sb + mov r1, r8 + bl _Z15__PopStackFrameP12ThrowContextP13ExceptionInfo + mov r1, r8 + bl _Z19FindExceptionRecordPcP13ExceptionInfo + ldr r0, [r8, #4] + cmp r0, #0 + bne _020F3A18 + bl _ZSt9terminatev +_020F3A18: + mov r0, sb + mov r1, r8 + bl _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo + ldr r2, [r8, #8] + cmp r2, #0 + beq _020F39E8 +_020F3A30: + ldrb r7, [r2] + and r0, r7, #0x1f + cmp r0, #0x13 + addls pc, pc, r0, lsl #2 + b _020F4268 +_020F3A44: ; jump table + b _020F4268 ; case 0 + b _020F3A94 ; case 1 + b _020F3AB4 ; case 2 + b _020F3B00 ; case 3 + b _020F3B80 ; case 4 + b _020F3BE0 ; case 5 + b _020F3C64 ; case 6 + b _020F3CD4 ; case 7 + b _020F3D44 ; case 8 + b _020F3DEC ; case 9 + b _020F3EA0 ; case 10 + b _020F3EFC ; case 11 + b _020F3F8C ; case 12 + b _020F3FB8 ; case 13 + b _020F4268 ; case 14 + b _020F4004 ; case 15 + b _020F4040 ; case 16 + b _020F40E4 ; case 17 + b _020F4190 ; case 18 + b _020F4254 ; case 19 +_020F3A94: + add r1, sp, #0xa0 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + ldr r1, [r8, #8] + ldr r0, [sp, #0xa0] + add r0, r1, r0 + str r0, [r8, #8] + b _020F426C +_020F3AB4: + add r1, sp, #0x9c + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + mov r4, r0 + ldrb r1, [r4] + ldrb r0, [r4, #1] + ldrb r2, [r4, #2] + ldrb r3, [r4, #3] + orr r0, r1, r0, lsl #8 + orr r0, r0, r2, lsl #16 + ldr r5, [sb, #0x18] + ldr r1, [sp, #0x9c] + orr r2, r0, r3, lsl #24 + add r0, r5, r1 + mvn r1, #0 + blx r2 + add r0, r4, #4 + str r0, [r8, #8] + b _020F426C +_020F3B00: + add r1, sp, #0x94 + add r0, r2, #1 + and r4, r7, #0x40 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x98 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x94] + ldreqb r0, [r1, r0] + beq _020F3B5C + ldr r0, [sp, #0x94] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] + and r0, r0, #0xff +_020F3B5C: + cmp r0, #0 + beq _020F3B78 + ldr r3, [sb, #0x18] + ldr r0, [sp, #0x98] + mvn r1, #0 + add r0, r3, r0 + blx r2 +_020F3B78: + str r4, [r8, #8] + b _020F426C +_020F3B80: + add r1, sp, #0x90 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x90] + ldreq r0, [r1, r0] + beq _020F3BD0 + ldr r0, [sp, #0x90] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] +_020F3BD0: + mvn r1, #0 + blx r2 + str r4, [r8, #8] + b _020F426C +_020F3BE0: + add r1, sp, #0x84 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x88 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x8c + bl _Z22__DecodeUnsignedNumberPcPm + ldr r3, [sb, #0x18] + ldr r2, [sp, #0x84] + ldr r6, [sp, #0x88] + ldrb r5, [r0] + ldrb r4, [r0, #1] + ldr r1, [sp, #0x8c] + add r2, r3, r2 + ldrb sl, [r0, #2] + orr r3, r5, r4, lsl #8 + mla r4, r6, r1, r2 + ldrb r2, [r0, #3] + orr r1, r3, sl, lsl #16 + cmp r6, #0 + orr r5, r1, r2, lsl #24 + add fp, r0, #4 + beq _020F3C5C + mvn sl, #0 +_020F3C40: + ldr r0, [sp, #0x8c] + mov r1, sl + sub r4, r4, r0 + mov r0, r4 + blx r5 + subs r6, r6, #1 + bne _020F3C40 +_020F3C5C: + str fp, [r8, #8] + b _020F426C +_020F3C64: + add r1, sp, #0x7c + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x80 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x7c] + ldreq r3, [r1, r0] + beq _020F3CBC + ldr r0, [sp, #0x7c] + add r0, sb, r0, lsl #2 + ldr r3, [r0, #0x1c] +_020F3CBC: + ldr r0, [sp, #0x80] + mov r1, #0 + add r0, r3, r0 + blx r2 + str r4, [r8, #8] + b _020F426C +_020F3CD4: + add r1, sp, #0x74 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x78 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x74] + ldreq r3, [r1, r0] + beq _020F3D2C + ldr r0, [sp, #0x74] + add r0, sb, r0, lsl #2 + ldr r3, [r0, #0x1c] +_020F3D2C: + ldr r0, [sp, #0x78] + mvn r1, #0 + add r0, r3, r0 + blx r2 + str r4, [r8, #8] + b _020F426C +_020F3D44: + add r1, sp, #0x68 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x6c + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x70 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + orr r2, r1, r5, lsl #24 + tst r7, #0x40 + add r5, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x68] + ldreqsh r0, [r1, r0] + beq _020F3DAC + ldr r0, [sp, #0x68] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 +_020F3DAC: + cmp r0, #0 + beq _020F3DE4 + cmp r4, #0 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x6c] + ldreq r3, [r1, r0] + beq _020F3DD4 + ldr r0, [sp, #0x6c] + add r0, sb, r0, lsl #2 + ldr r3, [r0, #0x1c] +_020F3DD4: + ldr r0, [sp, #0x70] + mvn r1, #0 + add r0, r3, r0 + blx r2 +_020F3DE4: + str r5, [r8, #8] + b _020F426C +_020F3DEC: + add r1, sp, #0x58 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x5c + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x60 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x64 + bl _Z22__DecodeUnsignedNumberPcPm + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r5, r1, r5, lsl #24 + add fp, r0, #4 + beq _020F3E50 + ldr r1, [sp, #0x58] + ldr r0, [sp, #0x5c] + add r1, sb, r1, lsl #2 + ldr r1, [r1, #0x1c] + b _020F3E60 +_020F3E50: + ldr r2, [sb, #0x18] + ldr r1, [sp, #0x58] + ldr r0, [sp, #0x5c] + ldr r1, [r2, r1] +_020F3E60: + add r4, r1, r0 + ldr r6, [sp, #0x60] + ldr r0, [sp, #0x64] + cmp r6, #0 + mla r4, r6, r0, r4 + beq _020F3E98 + mvn sl, #0 +_020F3E7C: + ldr r0, [sp, #0x64] + mov r1, sl + sub r4, r4, r0 + mov r0, r4 + blx r5 + subs r6, r6, #1 + bne _020F3E7C +_020F3E98: + str fp, [r8, #8] + b _020F426C +_020F3EA0: + add r1, sp, #0x54 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x54] + ldreq r0, [r1, r0] + beq _020F3EF0 + ldr r0, [sp, #0x54] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] +_020F3EF0: + blx r2 + str r4, [r8, #8] + b _020F426C +_020F3EFC: + add r1, sp, #0x4c + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x50 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + tst r7, #0x40 + orr r1, r1, r5, lsl #24 + add r5, r0, #4 + ldreq r2, [sb, #0x18] + ldreq r0, [sp, #0x4c] + ldreqb r0, [r2, r0] + beq _020F3F58 + ldr r0, [sp, #0x4c] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] + and r0, r0, #0xff +_020F3F58: + cmp r0, #0 + beq _020F3F84 + cmp r4, #0 + ldreq r2, [sb, #0x18] + ldreq r0, [sp, #0x50] + ldreq r0, [r2, r0] + beq _020F3F80 + ldr r0, [sp, #0x50] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] +_020F3F80: + blx r1 +_020F3F84: + str r5, [r8, #8] + b _020F426C +_020F3F8C: + ldr r0, [sp] + cmp r0, r2 + addeq sp, sp, #0xa4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r1, sp, #0x44 + add r0, r2, #5 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x48 + bl _Z20__DecodeSignedNumberPcPl + str r0, [r8, #8] + b _020F426C +_020F3FB8: + add r1, sp, #0x40 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + ldr r2, [sb, #0x18] + ldr r1, [sp, #0x40] + mov r4, r0 + add r0, r2, r1 + ldr r2, [r0, #8] + cmp r2, #0 + beq _020F3FFC + ldr r0, [r0] + ldr r1, [sb, #4] + cmp r1, r0 + streq r2, [sb, #8] + beq _020F3FFC + mvn r1, #0 + blx r2 +_020F3FFC: + str r4, [r8, #8] + b _020F426C +_020F4004: + ldr r0, [sp] + cmp r0, r2 + addeq sp, sp, #0xa4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r1, sp, #0x34 + add r0, r2, #1 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x38 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0x3c + bl _Z20__DecodeSignedNumberPcPl + ldr r1, [sp, #0x34] + add r0, r0, r1, lsl #2 + str r0, [r8, #8] + b _020F426C +_020F4040: + add r1, sp, #0x24 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x28 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + orr r2, r1, r5, lsl #24 + add r1, sp, #0x2c + add r0, r0, #4 + str r2, [sp, #0x30] + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r2, r1, r5, lsl #24 + add r4, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x24] + ldreq r5, [r1, r0] + beq _020F40C4 + ldr r0, [sp, #0x24] + add r0, sb, r0, lsl #2 + ldr r5, [r0, #0x1c] +_020F40C4: + ldr r0, [sp, #0x28] + ldr r3, [sp, #0x30] + ldr r1, [sp, #0x2c] + add r0, r5, r0 + add r1, r3, r1 + blx r2 + str r4, [r8, #8] + b _020F426C +_020F40E4: + add r1, sp, #0x14 + add r0, r2, #1 + and r5, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x1c + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0], #1 + add r1, sp, #0x18 + and r4, r2, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x20 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r6, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r5, #0 + orr r2, r1, r6, lsl #24 + add r5, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0x14] + ldreq r0, [r1, r0] + beq _020F4154 + ldr r0, [sp, #0x14] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] +_020F4154: + cmp r4, #0 + ldreq r3, [sb, #0x18] + ldreq r1, [sp, #0x18] + ldreq r4, [r3, r1] + beq _020F4174 + ldr r1, [sp, #0x18] + add r1, sb, r1, lsl #2 + ldr r4, [r1, #0x1c] +_020F4174: + ldr r3, [sp, #0x1c] + ldr r1, [sp, #0x20] + add r0, r0, r3 + add r1, r4, r1 + blx r2 + str r5, [r8, #8] + b _020F426C +_020F4190: + add r1, sp, #8 + add r0, r2, #1 + and r4, r7, #0x20 + bl _Z20__DecodeSignedNumberPcPl + ldrb r2, [r0], #1 + add r1, sp, #0xc + and r6, r2, #0x20 + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x10 + bl _Z22__DecodeUnsignedNumberPcPm + ldrb r2, [r0] + ldrb r1, [r0, #1] + ldrb r3, [r0, #2] + ldrb r5, [r0, #3] + orr r1, r2, r1, lsl #8 + orr r1, r1, r3, lsl #16 + cmp r4, #0 + orr r5, r1, r5, lsl #24 + add fp, r0, #4 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #8] + ldreq r4, [r1, r0] + beq _020F41F8 + ldr r0, [sp, #8] + add r0, sb, r0, lsl #2 + ldr r4, [r0, #0x1c] +_020F41F8: + cmp r6, #0 + ldreq r1, [sb, #0x18] + ldreq r0, [sp, #0xc] + ldreq r0, [r1, r0] + beq _020F4218 + ldr r0, [sp, #0xc] + add r0, sb, r0, lsl #2 + ldr r0, [r0, #0x1c] +_020F4218: + ldr r1, [sp, #0x10] + add r4, r4, r0 + bl _u32_div_f + movs r6, r0 + beq _020F424C + mvn sl, #0 +_020F4230: + ldr r0, [sp, #0x10] + mov r1, sl + sub r4, r4, r0 + mov r0, r4 + blx r5 + subs r6, r6, #1 + bne _020F4230 +_020F424C: + str fp, [r8, #8] + b _020F426C +_020F4254: + add r1, sp, #4 + add r0, r2, #1 + bl _Z20__DecodeSignedNumberPcPl + str r0, [r8, #8] + b _020F426C +_020F4268: + bl _ZSt9terminatev +_020F426C: + tst r7, #0x80 + movne r0, #0 + strne r0, [r8, #8] + b _020F39E8 +_020F427C: + add sp, sp, #0xa4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end _Z11UnwindStackP12ThrowContextP13ExceptionInfoPc + + arm_func_start _Z23FindMostRecentExceptionP12ThrowContextP13ExceptionInfo +_Z23FindMostRecentExceptionP12ThrowContextP13ExceptionInfo: ; 0x020F4284 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x8c + ldr r2, [r1] + mov r4, r0 + str r2, [sp, #4] + ldr r0, [r1, #4] + add ip, sp, #0x38 + str r0, [sp, #8] + ldr r0, [r1, #8] + add lr, r4, #0x1c + str r0, [sp, #0xc] + ldr r0, [r1, #0xc] + mov r5, #5 + str r0, [sp, #0x10] + ldr r0, [r1, #0x10] + str r0, [sp, #0x14] + ldr r0, [r1, #0x14] + str r0, [sp, #0x18] + ldr r0, [r4] + str r0, [sp, #0x1c] + ldr r0, [r4, #4] + str r0, [sp, #0x20] + ldr r0, [r4, #8] + str r0, [sp, #0x24] + ldr r0, [r4, #0xc] + str r0, [sp, #0x28] + ldr r0, [r4, #0x10] + str r0, [sp, #0x2c] + ldr r0, [r4, #0x14] + str r0, [sp, #0x30] + ldr r0, [r4, #0x18] + str r0, [sp, #0x34] +_020F4304: + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + subs r5, r5, #1 + bne _020F4304 + ldr r1, [lr] + add r0, sp, #4 + str r1, [ip] + bl _Z13CurrentActionPK14ActionIterator + add r5, sp, #4 +_020F4328: + cmp r0, #0x12 + addls pc, pc, r0, lsl #2 + b _020F4380 +_020F4334: ; jump table + b _020F438C ; case 0 + b _020F4380 ; case 1 + b _020F438C ; case 2 + b _020F438C ; case 3 + b _020F438C ; case 4 + b _020F438C ; case 5 + b _020F438C ; case 6 + b _020F438C ; case 7 + b _020F438C ; case 8 + b _020F438C ; case 9 + b _020F438C ; case 10 + b _020F438C ; case 11 + b _020F438C ; case 12 + b _020F4398 ; case 13 + b _020F4380 ; case 14 + b _020F438C ; case 15 + b _020F438C ; case 16 + b _020F438C ; case 17 + b _020F438C ; case 18 +_020F4380: + add sp, sp, #0x8c + mov r0, #0 + ldmia sp!, {r4, r5, pc} +_020F438C: + mov r0, r5 + bl _Z10NextActionP14ActionIterator + b _020F4328 +_020F4398: + ldr r0, [sp, #0xc] + add r1, sp, #0 + add r0, r0, #1 + bl _Z20__DecodeSignedNumberPcPl + ldr ip, [sp, #0x34] + ldr r3, [sp] + mov r1, #0 + add r0, ip, r3 + ldr r2, [r0, #4] + str r2, [r4] + ldr r2, [ip, r3] + str r2, [r4, #4] + str r1, [r4, #8] + str r0, [r4, #0xc] + add sp, sp, #0x8c + ldmia sp!, {r4, r5, pc} + arm_func_end _Z23FindMostRecentExceptionP12ThrowContextP13ExceptionInfo + + arm_func_start _Z17IsInSpecificationPcP16ex_specification +_Z17IsInSpecificationPcP16ex_specification: ; 0x020F43D8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r6, r1 + ldr r1, [r6] + mov r7, r0 + cmp r1, #0 + ldr r4, [r6, #0xc] + mov r5, #0 + bls _020F4450 + add r8, sp, #0 +_020F4400: + ldrb r1, [r4] + ldrb r0, [r4, #1] + ldrb r2, [r4, #2] + ldrb r3, [r4, #3] + orr r0, r1, r0, lsl #8 + orr r0, r0, r2, lsl #16 + orr r1, r0, r3, lsl #24 + mov r0, r7 + mov r2, r8 + str r1, [sp, #4] + bl __throw_catch_compare + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r6] + add r5, r5, #1 + cmp r5, r0 + add r4, r4, #4 + blo _020F4400 +_020F4450: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end _Z17IsInSpecificationPcP16ex_specification + + arm_func_start __unexpected +__unexpected: ; 0x020F445C + stmdb sp!, {r4, fp, lr} + sub sp, sp, #0x2c + mov fp, sp + str sp, [fp, #0x18] + ldr r4, [r0, #0x14] + bl _ZSt10unexpectedv + b _020F44E8 +_020F4478: + add r1, fp, #0x1c + add r0, r4, #1 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, fp, #0x20 + bl _Z22__DecodeUnsignedNumberPcPm + add r1, fp, #0x24 + bl _Z20__DecodeSignedNumberPcPl + str r0, [fp, #0x28] + ldr r0, [fp, #8] + add r1, fp, #0x1c + bl _Z17IsInSpecificationPcP16ex_specification + cmp r0, #0 + beq _020F44B0 + bl __rethrow +_020F44B0: + ldr r0, _020F44F4 ; =_021116F4 + add r1, fp, #0x1c + bl _Z17IsInSpecificationPcP16ex_specification + cmp r0, #0 + beq _020F44DC + ldr r3, _020F44F8 ; =_021116E8 + ldr r0, _020F44FC ; =_0211170C + ldr r2, _020F4500 ; =_ZNSt13bad_exceptionD1Ev + add r1, fp, #0 + str r3, [fp] + bl __throw +_020F44DC: + add r0, fp, #4 + bl __end__catch + ldr sp, [fp, #0x18] +_020F44E8: + bl _ZSt9terminatev + add sp, fp, #0x2c + ldmia sp!, {r4, fp, pc} + .balign 4, 0 +_020F44F4: .word _021116F4 +_020F44F8: .word _021116E8 +_020F44FC: .word _0211170C +_020F4500: .word _ZNSt13bad_exceptionD1Ev + arm_func_end __unexpected + + arm_func_start _ZNSt13bad_exceptionD1Ev +_ZNSt13bad_exceptionD1Ev: ; 0x020F4504 + bx lr + arm_func_end _ZNSt13bad_exceptionD1Ev + + arm_func_start _Z16HandleUnexpectedP12ThrowContextP13ExceptionInfoP16ex_specificationPc +_Z16HandleUnexpectedP12ThrowContextP13ExceptionInfoP16ex_specificationPc: ; 0x020F4508 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r3 + mov r5, r2 + mov r2, r4 + mov r7, r0 + mov r6, r1 + bl _Z11UnwindStackP12ThrowContextP13ExceptionInfoPc + ldr r2, [r7, #0x18] + ldr r1, [r5, #8] + ldr r0, [r7, #4] + add r3, r2, r1 + str r0, [r2, r1] + ldr r1, [r7] + mov r0, r7 + str r1, [r3, #4] + ldr r2, [r7, #8] + mov r1, r6 + str r2, [r3, #8] + str r4, [r3, #0x14] + ldr r3, [r6] + ldr r2, [r5, #4] + add r2, r3, r2 + bl _Z17__TransferControlP12ThrowContextP13ExceptionInfoPc + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end _Z16HandleUnexpectedP12ThrowContextP13ExceptionInfoP16ex_specificationPc + + arm_func_start _Z20FindExceptionHandlerP12ThrowContextP13ExceptionInfoPl +_Z20FindExceptionHandlerP12ThrowContextP13ExceptionInfoPl: ; 0x020F4568 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xa4 + mov r5, r1 + ldr r1, [r5] + mov r6, r0 + str r1, [sp, #0x1c] + ldr r0, [r5, #4] + add r8, sp, #0x50 + str r0, [sp, #0x20] + ldr r0, [r5, #8] + mov r4, r2 + str r0, [sp, #0x24] + ldr r0, [r5, #0xc] + add sb, r6, #0x1c + str r0, [sp, #0x28] + ldr r0, [r5, #0x10] + mov r7, #5 + str r0, [sp, #0x2c] + ldr r0, [r5, #0x14] + str r0, [sp, #0x30] + ldr r0, [r6] + str r0, [sp, #0x34] + ldr r0, [r6, #4] + str r0, [sp, #0x38] + ldr r0, [r6, #8] + str r0, [sp, #0x3c] + ldr r0, [r6, #0xc] + str r0, [sp, #0x40] + ldr r0, [r6, #0x10] + str r0, [sp, #0x44] + ldr r0, [r6, #0x14] + str r0, [sp, #0x48] + ldr r0, [r6, #0x18] + str r0, [sp, #0x4c] +_020F45F0: + ldmia sb!, {r0, r1, r2, r3} + stmia r8!, {r0, r1, r2, r3} + subs r7, r7, #1 + bne _020F45F0 + ldr r1, [sb] + add r0, sp, #0x1c + str r1, [r8] + bl _Z13CurrentActionPK14ActionIterator + add r7, sp, #0 + add sl, sp, #4 + add fp, sp, #8 + add sb, sp, #0x14 + add r8, sp, #0x18 +_020F4624: + cmp r0, #0x13 + addls pc, pc, r0, lsl #2 + b _020F4724 +_020F4630: ; jump table + b _020F472C ; case 0 + b _020F4724 ; case 1 + b _020F472C ; case 2 + b _020F472C ; case 3 + b _020F472C ; case 4 + b _020F472C ; case 5 + b _020F472C ; case 6 + b _020F472C ; case 7 + b _020F472C ; case 8 + b _020F472C ; case 9 + b _020F472C ; case 10 + b _020F472C ; case 11 + b _020F4680 ; case 12 + b _020F472C ; case 13 + b _020F4724 ; case 14 + b _020F46D4 ; case 15 + b _020F472C ; case 16 + b _020F472C ; case 17 + b _020F472C ; case 18 + b _020F472C ; case 19 +_020F4680: + ldr lr, [sp, #0x24] + mov r1, sb + ldrb r2, [lr, #1] + ldrb r0, [lr, #2] + ldrb r3, [lr, #3] + ldrb ip, [lr, #4] + orr r0, r2, r0, lsl #8 + orr r0, r0, r3, lsl #16 + orr r2, r0, ip, lsl #24 + add r0, lr, #5 + str r2, [sp, #0x10] + bl _Z22__DecodeUnsignedNumberPcPm + mov r1, r8 + bl _Z20__DecodeSignedNumberPcPl + ldr r0, [r6] + ldr r1, [sp, #0x10] + mov r2, r4 + bl __throw_catch_compare + cmp r0, #0 + beq _020F472C + b _020F4738 +_020F46D4: + ldr r0, [sp, #0x24] + mov r1, r7 + add r0, r0, #1 + bl _Z22__DecodeUnsignedNumberPcPm + mov r1, sl + bl _Z22__DecodeUnsignedNumberPcPm + mov r1, fp + bl _Z20__DecodeSignedNumberPcPl + str r0, [sp, #0xc] + ldr r0, [r6] + mov r1, r7 + bl _Z17IsInSpecificationPcP16ex_specification + cmp r0, #0 + bne _020F472C + ldr r3, [sp, #0x24] + mov r0, r6 + mov r1, r5 + mov r2, r7 + bl _Z16HandleUnexpectedP12ThrowContextP13ExceptionInfoP16ex_specificationPc + b _020F472C +_020F4724: + bl _ZSt9terminatev + b _020F4738 +_020F472C: + add r0, sp, #0x1c + bl _Z10NextActionP14ActionIterator + b _020F4624 +_020F4738: + ldr r0, [sp, #0x24] + add sp, sp, #0xa4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end _Z20FindExceptionHandlerP12ThrowContextP13ExceptionInfoPl + + arm_func_start _Z14SetupCatchInfoP12ThrowContextll +_Z14SetupCatchInfoP12ThrowContextll: ; 0x020F4744 + stmdb sp!, {r3, lr} + ldr lr, [r0, #0x18] + ldr ip, [r0, #4] + add r3, lr, r1 + str ip, [lr, r1] + ldr r1, [r0] + str r1, [r3, #4] + ldr r1, [r0, #8] + str r1, [r3, #8] + ldr r1, [r0] + ldrb r1, [r1] + cmp r1, #0x2a + ldrne r0, [r0, #4] + addne r0, r0, r2 + strne r0, [r3, #0xc] + ldmneia sp!, {r3, pc} + add r1, r3, #0x10 + str r1, [r3, #0xc] + ldr r0, [r0, #4] + ldr r0, [r0] + add r0, r0, r2 + str r0, [r3, #0x10] + ldmia sp!, {r3, pc} + arm_func_end _Z14SetupCatchInfoP12ThrowContextll + + arm_func_start _Z14__ThrowHandlerP12ThrowContext +_Z14__ThrowHandlerP12ThrowContext: + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + mov r5, r0 + ldr r0, [r5, #0x10] + add r1, sp, #0x10 + bl _Z19FindExceptionRecordPcP13ExceptionInfo + ldr r0, [sp, #0x14] + cmp r0, #0 + bne _020F47C8 + bl _ZSt9terminatev +_020F47C8: + add r1, sp, #0x10 + mov r0, r5 + bl _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo + ldr r0, [r5] + cmp r0, #0 + movne r0, #0 + strne r0, [r5, #0xc] + bne _020F4804 + add r1, sp, #0x10 + mov r0, r5 + bl _Z23FindMostRecentExceptionP12ThrowContextP13ExceptionInfo + str r0, [r5, #0xc] + cmp r0, #0 + bne _020F4804 + bl _ZSt9terminatev +_020F4804: + add r1, sp, #0x10 + add r2, sp, #0 + mov r0, r5 + bl _Z20FindExceptionHandlerP12ThrowContextP13ExceptionInfoPl + mov r4, r0 + ldrb r1, [r4, #1] + ldrb r0, [r4, #2] + ldrb r2, [r4, #3] + ldrb r3, [r4, #4] + orr r0, r1, r0, lsl #8 + orr r0, r0, r2, lsl #16 + orr r2, r0, r3, lsl #24 + add r1, sp, #8 + add r0, r4, #5 + str r2, [sp, #4] + bl _Z22__DecodeUnsignedNumberPcPm + add r1, sp, #0xc + bl _Z20__DecodeSignedNumberPcPl + add r1, sp, #0x10 + mov r0, r5 + mov r2, r4 + bl _Z11UnwindStackP12ThrowContextP13ExceptionInfoPc + ldr r1, [sp, #0xc] + ldr r2, [sp] + mov r0, r5 + bl _Z14SetupCatchInfoP12ThrowContextll + ldr r3, [sp, #0x10] + ldr r2, [sp, #8] + mov r0, r5 + add r1, sp, #0x10 + add r2, r3, r2 + bl _Z17__TransferControlP12ThrowContextP13ExceptionInfoPc + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end _Z14__ThrowHandlerP12ThrowContext + + arm_func_start __end__catch +__end__catch: ; 0x020F488C + stmdb sp!, {r3, lr} + ldr r1, [r0] + cmp r1, #0 + ldrne r2, [r0, #8] + cmpne r2, #0 + ldmeqia sp!, {r3, pc} + mov r0, r1 + mvn r1, #0 + blx r2 + ldmia sp!, {r3, pc} + arm_func_end __end__catch + + arm_func_start _ZNSt13bad_exceptionD0Ev +_ZNSt13bad_exceptionD0Ev: ; 0x020F48B4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt13bad_exceptionD0Ev + + arm_func_start _ZNKSt13bad_exception4whatEv +_ZNKSt13bad_exception4whatEv: ; 0x020F48C8 + ldr r0, _020F48D0 ; =_ZZNKSt13bad_exception4whatEvEs + bx lr + .align 2, 0 +_020F48D0: .word _ZZNKSt13bad_exception4whatEvEs + arm_func_end _ZNKSt13bad_exception4whatEv + + arm_func_start _ZSt17__throw_bad_allocv +_ZSt17__throw_bad_allocv: ; 0x020F48D4 + stmdb sp!, {r3, lr} + ldr r0, _020F4904 ; =_02111734 + ldrb r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r3, _020F4908 ; =_ZTVSt9bad_alloc + ldr r0, _020F490C ; =_02111788 + ldr r2, _020F4910 ; =_ZNSt9bad_allocD1Ev + add r1, sp, #0 + str r3, [sp] + bl __throw + ldmia sp!, {r3, pc} + .align 2, 0 +_020F4904: .word _02111734 +_020F4908: .word _ZTVSt9bad_alloc +_020F490C: .word _02111788 +_020F4910: .word _ZNSt9bad_allocD1Ev + arm_func_end _ZSt17__throw_bad_allocv + + arm_func_start _ZNSt9bad_allocD1Ev +_ZNSt9bad_allocD1Ev: ; 0x020F4914 + bx lr + arm_func_end _ZNSt9bad_allocD1Ev + + arm_func_start _Znwm +_Znwm: ; 0x020F4918 + stmdb sp!, {r3, r4, r5, r6, fp, lr} + sub sp, sp, #0x18 + mov fp, sp + movs r6, r0 + ldr r4, _020F4978 ; =_ZSt13__new_handler + moveq r6, #4 +_020F4930: + mov r0, r6 + bl malloc + movs r5, r0 + bne _020F4958 + ldr r0, [r4] + cmp r0, #0 + beq _020F4954 + blx r0 + b _020F4930 +_020F4954: + bl _ZSt17__throw_bad_allocv +_020F4958: + add sp, fp, #0x18 + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, fp, pc} +_020F4964: + add r0, fp, #0 + bl __unexpected +_020F496C: + b _020F496C +_020F4970: + add sp, fp, #0x18 + ldmia sp!, {r3, r4, r5, r6, fp, pc} + .align 2, 0 +_020F4978: .word _ZSt13__new_handler + arm_func_end _Znwm + + arm_func_start _ZnwmRKSt9nothrow_t +_ZnwmRKSt9nothrow_t: ; 0x020F497C + stmdb sp!, {fp, lr} + sub sp, sp, #0x30 + mov fp, sp + str sp, [fp, #0x2c] + bl _Znwm + add sp, fp, #0x30 + ldmia sp!, {fp, pc} +_020F4998: + add r0, fp, #0x18 + bl __end__catch + add sp, fp, #0x30 + mov r0, #0 + ldmia sp!, {fp, pc} +_020F49AC: + add r0, fp, #0 + bl __unexpected +_020F49B4: + b _020F49B4 +_020F49B8: ; 0x020F49B8 + add sp, fp, #0x30 + ldmia sp!, {fp, pc} + arm_func_end _ZnwmRKSt9nothrow_t + + arm_func_start _ZdlPv +_ZdlPv: ; 0x020F49C0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl free + ldmia sp!, {r3, pc} + arm_func_end _ZdlPv + + arm_func_start _Znam +_Znam: ; 0x020F49D4 + stmdb sp!, {fp, lr} + sub sp, sp, #0x18 + mov fp, sp + bl _Znwm + add sp, fp, #0x18 + ldmia sp!, {fp, pc} +_020F49EC: ; 0x020F49EC + add r0, fp, #0 + bl __unexpected +_020F49F4: + b _020F49F4 +_020F49F8: ; 0x020F49F8 + add sp, fp, #0x18 + ldmia sp!, {fp, pc} + arm_func_end _Znam + + arm_func_start _ZnamRKSt9nothrow_t +_ZnamRKSt9nothrow_t: ; 0x020F4A00 + stmdb sp!, {fp, lr} + sub sp, sp, #0x18 + mov fp, sp + bl _ZnwmRKSt9nothrow_t + add sp, fp, #0x18 + ldmia sp!, {fp, pc} +_020F4A18: ; 0x020F4A18 + add r0, fp, #0 + bl __unexpected +_020F4A20: + b _020F4A20 +_020F4A24: ; 0x020F4A24 + add sp, fp, #0x18 + ldmia sp!, {fp, pc} + arm_func_end _ZnamRKSt9nothrow_t + + arm_func_start _ZdaPv +_ZdaPv: ; 0x020F4A2C + ldr ip, _020F4A34 ; =_ZdlPv + bx ip + .align 2, 0 +_020F4A34: .word _ZdlPv + arm_func_end _ZdaPv + + arm_func_start _ZNSt9bad_allocD0Ev +_ZNSt9bad_allocD0Ev: ; 0x020F4A38 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZNSt9bad_allocD0Ev + + arm_func_start _ZNKSt9bad_alloc4whatEv +_ZNKSt9bad_alloc4whatEv: ; 0x020F4A4C + ldr r0, _020F4A54 ; =_02111738 + bx lr + .align 2, 0 +_020F4A54: .word _02111738 + arm_func_end _ZNKSt9bad_alloc4whatEv + + arm_func_start __call_static_initializers +__call_static_initializers: ; 0x020F4A58 + stmdb sp!, {r4, lr} + ldr r4, _020F4A80 ; =__sinit__ + b _020F4A6C +_020F4A64: + blx r0 + add r4, r4, #4 +_020F4A6C: + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + bne _020F4A64 + ldmia sp!, {r4, pc} + .align 2, 0 +_020F4A80: .word __sinit__ + arm_func_end __call_static_initializers + + arm_func_start __destroy_global_chain +__destroy_global_chain: ; 0x020F4A84 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020F4AC4 ; =__global_destructor_chain + ldr r2, [r4] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mvn r5, #0 +_020F4A9C: + ldr r0, [r2] + mov r1, r5 + str r0, [r4] + ldr r0, [r2, #8] + ldr r2, [r2, #4] + blx r2 + ldr r2, [r4] + cmp r2, #0 + bne _020F4A9C + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020F4AC4: .word __global_destructor_chain + arm_func_end __destroy_global_chain + + arm_func_start _ZNSt9type_infoD2Ev +_ZNSt9type_infoD2Ev: ; 0x020F4AC8 + bx lr + arm_func_end _ZNSt9type_infoD2Ev + + arm_func_start _ZNKSt9type_infoeqERKS_ +_ZNKSt9type_infoeqERKS_: ; 0x020F4ACC + stmdb sp!, {r3, lr} + cmp r0, r1 + beq _020F4AEC + ldr r0, [r0, #4] + ldr r1, [r1, #4] + bl strcmp + cmp r0, #0 + bne _020F4AF4 +_020F4AEC: + mov r0, #1 + ldmia sp!, {r3, pc} +_020F4AF4: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end _ZNKSt9type_infoeqERKS_ + + arm_func_start _ZN10__cxxabiv117__class_type_infoD1Ev +_ZN10__cxxabiv117__class_type_infoD1Ev: ; 0x020F4AFC + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZNSt9type_infoD2Ev + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10__cxxabiv117__class_type_infoD1Ev + + arm_func_start _ZN10__cxxabiv117__class_type_infoD0Ev +_ZN10__cxxabiv117__class_type_infoD0Ev: ; 0x020F4B10 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZNSt9type_infoD2Ev + mov r0, r4 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10__cxxabiv117__class_type_infoD0Ev + + arm_func_start _ZN10__cxxabiv117__class_type_infoD2Ev +_ZN10__cxxabiv117__class_type_infoD2Ev: ; 0x020F4B2C + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZNSt9type_infoD2Ev + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10__cxxabiv117__class_type_infoD2Ev + + arm_func_start _ZN10__cxxabiv120__si_class_type_infoD1Ev +_ZN10__cxxabiv120__si_class_type_infoD1Ev: ; 0x020F4B40 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZN10__cxxabiv117__class_type_infoD2Ev + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10__cxxabiv120__si_class_type_infoD1Ev + + arm_func_start _ZN10__cxxabiv120__si_class_type_infoD0Ev +_ZN10__cxxabiv120__si_class_type_infoD0Ev: ; 0x020F4B54 + stmdb sp!, {r4, lr} + mov r4, r0 + bl _ZN10__cxxabiv117__class_type_infoD2Ev + mov r0, r4 + bl _ZdlPv + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end _ZN10__cxxabiv120__si_class_type_infoD0Ev + + arm_func_start _ZSt9dthandlerv +_ZSt9dthandlerv: ; 0x020F4B70 + ldr ip, _020F4B78 ; =abort + bx ip + .align 2, 0 +_020F4B78: .word abort + arm_func_end _ZSt9dthandlerv + + arm_func_start _ZSt9duhandlerv +_ZSt9duhandlerv: ; 0x020F4B7C + ldr ip, _020F4B84 ; =_ZSt9terminatev + bx ip + .align 2, 0 +_020F4B84: .word _ZSt9terminatev + arm_func_end _ZSt9duhandlerv + + arm_func_start _ZSt9terminatev +_ZSt9terminatev: ; 0x020F4B88 + stmdb sp!, {r3, lr} + ldr r0, _020F4B9C ; =_02111848 + ldr r0, [r0] + blx r0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020F4B9C: .word _02111848 + arm_func_end _ZSt9terminatev + + arm_func_start _ZSt10unexpectedv +_ZSt10unexpectedv: ; 0x020F4BA0 + stmdb sp!, {r3, lr} + ldr r0, _020F4BB4 ; =_02111848 + ldr r0, [r0, #4] + blx r0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020F4BB4: .word _02111848 + arm_func_end _ZSt10unexpectedv + + arm_func_start __throw_catch_compare +__throw_catch_compare: ; 0x020F4BB8 + stmdb sp!, {r3, lr} + mov ip, #0 + mov r3, r1 + cmp r1, #0 + str ip, [r2] + moveq r0, #1 + ldmeqia sp!, {r3, pc} + ldrb ip, [r1] + cmp ip, #0x50 + bne _020F4C1C + ldrb ip, [r3, #1]! + cmp ip, #0x56 + addeq r3, r3, #1 + ldrb ip, [r3] + cmp ip, #0x4b + addeq r3, r3, #1 + ldrb r3, [r3] + cmp r3, #0x76 + bne _020F4C18 + ldrb r3, [r0] + cmp r3, #0x50 + cmpne r3, #0x2a + moveq r0, #1 + ldmeqia sp!, {r3, pc} +_020F4C18: + mov r3, r1 +_020F4C1C: + ldrb ip, [r0] + cmp ip, #0x21 + cmpne ip, #0x2a + bne _020F4D1C + ldrb lr, [r0], #1 + ldrb ip, [r3], #1 + cmp lr, ip + movne r0, #0 + ldmneia sp!, {r3, pc} +_020F4C40: + ldrb lr, [r0] + ldrb ip, [r3], #1 + cmp lr, ip + bne _020F4C94 + cmp lr, #0x21 + add r0, r0, #1 + bne _020F4C40 + ldrb r1, [r0] + mov lr, #0 + cmp r1, #0x21 + beq _020F4C88 + mov r1, #0xa +_020F4C70: + ldrb ip, [r0] + ldrb r3, [r0, #1]! + mla ip, lr, r1, ip + cmp r3, #0x21 + sub lr, ip, #0x30 + bne _020F4C70 +_020F4C88: + str lr, [r2] + mov r0, #1 + ldmia sp!, {r3, pc} +_020F4C94: + ldrb r3, [r0], #1 + cmp r3, #0x21 + bne _020F4C94 +_020F4CA0: + ldrb r3, [r0], #1 + cmp r3, #0x21 + bne _020F4CA0 + ldrb r3, [r0] + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r3, r1, #1 + b _020F4C40 +_020F4CC4: + ldrb r1, [r3, #1]! + add r0, r0, #1 + cmp r1, #0x4b + bne _020F4CE4 + ldrb r1, [r0] + add r3, r3, #1 + cmp r1, #0x4b + addeq r0, r0, #1 +_020F4CE4: + ldrb r2, [r0] + cmp r2, #0x4b + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldrb r1, [r3] + cmp r1, #0x56 + bne _020F4D0C + cmp r2, #0x56 + addeq r0, r0, #1 + add r3, r3, #1 +_020F4D0C: + ldrb r1, [r0] + cmp r1, #0x56 + moveq r0, #0 + ldmeqia sp!, {r3, pc} +_020F4D1C: + ldrb r2, [r0] + cmp r2, #0x50 + cmpne r2, #0x52 + bne _020F4D38 + ldrb r1, [r3] + cmp r2, r1 + beq _020F4CC4 +_020F4D38: + ldrb r1, [r3] + cmp r2, r1 + bne _020F4D60 +_020F4D44: + cmp r2, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + ldrb r2, [r0, #1]! + ldrb r1, [r3, #1]! + cmp r2, r1 + beq _020F4D44 +_020F4D60: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end __throw_catch_compare + + arm_func_start _Z15__PopStackFrameP12ThrowContextP13ExceptionInfo +_Z15__PopStackFrameP12ThrowContextP13ExceptionInfo: ; 0x020F4D68 + stmdb sp!, {r4, lr} + ldrb r1, [r0, #0x6a] + ldr ip, [r0, #0x60] + mov r4, #0xf + cmp r1, #0 + ldr r1, [r0, #0x18] + movne r2, #0x10 + moveq r2, #0 + add r1, r1, ip + sub lr, r1, r2 + mov r3, #1 +_020F4D94: + ldrh r1, [r0, #0x68] + tst r1, r3, lsl r4 + ldrne r2, [lr, #-4]! + addne r1, r0, r4, lsl #2 + strne r2, [r1, #0x1c] + subs r4, r4, #1 + bpl _020F4D94 + ldr r1, [r0, #0x18] + add r1, r1, ip + str r1, [r0, #0x14] + ldr r0, [r0, #0x54] + ldmia sp!, {r4, pc} + arm_func_end _Z15__PopStackFrameP12ThrowContextP13ExceptionInfo + + arm_func_start _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo +_Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo: ; 0x020F4DC4 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, [r1, #4] + mov r6, r0 + ldrb r0, [r1] + ands r4, r0, #0x40 + movne r2, #1 + moveq r2, #0 + strb r2, [r6, #0x6b] + tst r0, #0x20 + movne r2, #1 + moveq r2, #0 + ands r5, r0, #0x80 + movne r0, #1 + strb r2, [r6, #0x6a] + moveq r0, #0 + strb r0, [r6, #0x6c] + ldrb r2, [r1, #1] + add r0, r1, #2 + add r1, r6, #0x60 + mov r2, r2, lsl #4 + strh r2, [r6, #0x68] + ldrh r2, [r6, #0x68] + orr r2, r2, #0x4000 + strh r2, [r6, #0x68] + bl _Z22__DecodeUnsignedNumberPcPm + cmp r4, #0 + beq _020F4E38 + add r1, r6, #0x64 + bl _Z22__DecodeUnsignedNumberPcPm +_020F4E38: + cmp r4, #0 + beq _020F4E58 + cmp r5, #0 + ldrne r0, [r6, #0x38] + strne r0, [r6, #0x18] + ldreq r0, [r6, #0x48] + streq r0, [r6, #0x18] + ldmia sp!, {r4, r5, r6, pc} +_020F4E58: + ldr r0, [r6, #0x14] + str r0, [r6, #0x18] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo + + arm_func_start _Z20__FindExceptionTableP13ExceptionInfoPc +_Z20__FindExceptionTableP13ExceptionInfoPc: ; 0x020F4E64 + ldr r2, _020F4E7C ; =__exception_table_start__ + ldr r1, _020F4E80 ; =__exception_table_end__ + str r2, [r0, #0xc] + str r1, [r0, #0x10] + mov r0, #1 + bx lr + .align 2, 0 +_020F4E7C: .word __exception_table_start__ +_020F4E80: .word __exception_table_end__ + arm_func_end _Z20__FindExceptionTableP13ExceptionInfoPc + + arm_func_start _Z16__SkipUnwindInfoPc +_Z16__SkipUnwindInfoPc: ; 0x020F4E84 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldrb r4, [r0], #2 + add r1, sp, #0 + bl _Z22__DecodeUnsignedNumberPcPm + tst r4, #0x40 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + add r1, sp, #0 + bl _Z22__DecodeUnsignedNumberPcPm + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + arm_func_end _Z16__SkipUnwindInfoPc + + arm_func_start _Z17__TransferControlP12ThrowContextP13ExceptionInfoPc +_Z17__TransferControlP12ThrowContextP13ExceptionInfoPc: ; 0x020F4EB4 + ldr r4, [r0, #0x2c] + ldr r5, [r0, #0x30] + ldr r6, [r0, #0x34] + ldr r7, [r0, #0x38] + ldr r8, [r0, #0x3c] + ldr sb, [r0, #0x40] + ldr sl, [r0, #0x44] + ldr fp, [r0, #0x48] + ldr sp, [r0, #0x5c] + ldr ip, [r0, #0x64] + sub sp, sp, ip + bx r2 + arm_func_end _Z17__TransferControlP12ThrowContextP13ExceptionInfoPc + + arm_func_start __throw +__throw: ; 0x020F4EE4 + mov ip, sp + sub sp, sp, #0x70 + str r4, [sp, #0x2c] + str r5, [sp, #0x30] + str r6, [sp, #0x34] + str r7, [sp, #0x38] + str r8, [sp, #0x3c] + str sb, [sp, #0x40] + str sl, [sp, #0x44] + str fp, [sp, #0x48] + str ip, [sp, #0x14] + str ip, [sp, #0x5c] + str lr, [sp, #0x10] + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov r0, sp + b _Z14__ThrowHandlerP12ThrowContext + arm_func_end __throw + + arm_func_start __rethrow +__rethrow: ; 0x020F4F2C + mov ip, sp + sub sp, sp, #0x70 + str r4, [sp, #0x2c] + str r5, [sp, #0x30] + str r6, [sp, #0x34] + str r7, [sp, #0x38] + str r8, [sp, #0x3c] + str sb, [sp, #0x40] + str sl, [sp, #0x44] + str fp, [sp, #0x48] + str ip, [sp, #0x14] + str ip, [sp, #0x5c] + str lr, [sp, #0x10] + mov ip, #0 + str ip, [sp] + str ip, [sp, #4] + str ip, [sp, #8] + mov r0, sp + b _Z14__ThrowHandlerP12ThrowContext + arm_func_end __rethrow + + arm_func_start _ExitProcess +_ExitProcess: ; 0x020F4F78 + ldr ip, _020F4F80 ; =sys_exit + bx ip + .align 2, 0 +_020F4F80: .word sys_exit + arm_func_end _ExitProcess + + .rodata + + .public _0210E404 +_0210E404: + .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B + .byte 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B + .byte 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B + .byte 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B + .byte 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B + .byte 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x5B + .byte 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B + .byte 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B + .byte 0x7C, 0x7D, 0x7E, 0x7F + + .public _0210E484 +_0210E484: + .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B + .byte 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B + .byte 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B + .byte 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B + .byte 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B + .byte 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B + .byte 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B + .byte 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x7B + .byte 0x7C, 0x7D, 0x7E, 0x7F + + .public _0210E504 +_0210E504: + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x42, 0x01, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04 + .byte 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x51, 0x06, 0x51, 0x06, 0x51, 0x06, 0x51, 0x06, 0x51, 0x06 + .byte 0x51, 0x06, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02 + .byte 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02 + .byte 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x71, 0x04, 0x71, 0x04, 0x71, 0x04, 0x71, 0x04, 0x71, 0x04 + .byte 0x71, 0x04, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00 + .byte 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00 + .byte 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0x04, 0x00 + +_0210E604: + .byte 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_0210E62C: + .asciz "NAN(" +_0210E631: + .asciz "INFINITY" + .balign 4, 0 +_0210E63C: + .byte 0x00, 0x00, 0x01, 0x00 + .byte 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00 + .byte 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x11, 0x00 + .byte 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00 + .byte 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00 + .byte 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00 + .byte 0x2A, 0x00, 0x2B, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x00 + .byte 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00 + .byte 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x61, 0x00 + .byte 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00 + .byte 0x6A, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x71, 0x00 + .byte 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00 + .byte 0x7A, 0x00, 0x5B, 0x00, 0x5C, 0x00, 0x5D, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x60, 0x00, 0x61, 0x00 + .byte 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00 + .byte 0x6A, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x71, 0x00 + .byte 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00 + .byte 0x7A, 0x00, 0x7B, 0x00, 0x7C, 0x00, 0x7D, 0x00, 0x7E, 0x00, 0x7F, 0x00 + +_0210E73C: + .byte 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x01 + .byte 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00 + .byte 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x42, 0x01, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x58, 0x04, 0x58, 0x04 + .byte 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04, 0x58, 0x04 + .byte 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x51, 0x06 + .byte 0x51, 0x06, 0x51, 0x06, 0x51, 0x06, 0x51, 0x06, 0x51, 0x06, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02 + .byte 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02 + .byte 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02, 0x51, 0x02 + .byte 0x51, 0x02, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x71, 0x04 + .byte 0x71, 0x04, 0x71, 0x04, 0x71, 0x04, 0x71, 0x04, 0x71, 0x04, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00 + .byte 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00 + .byte 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00, 0x71, 0x00 + .byte 0x71, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00 + .byte 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00 + .byte 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x11, 0x00 + .byte 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00 + .byte 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00 + .byte 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00 + .byte 0x2A, 0x00, 0x2B, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x00 + .byte 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00 + .byte 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x41, 0x00 + .byte 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00 + .byte 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x51, 0x00 + .byte 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00 + .byte 0x5A, 0x00, 0x5B, 0x00, 0x5C, 0x00, 0x5D, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x60, 0x00, 0x41, 0x00 + .byte 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00 + .byte 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x51, 0x00 + .byte 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00 + .byte 0x5A, 0x00, 0x7B, 0x00, 0x7C, 0x00, 0x7D, 0x00, 0x7E, 0x00, 0x7F, 0x00 + +_0210E93C: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0xB8, 0xE2, 0x3F + +_0210E94C: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F + +_0210E95C: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x06, 0xD0, 0xCF, 0x43, 0xEB, 0xFD, 0x4C, 0x3E + + .data + +_02110FCC: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .word _021E57C0 + .byte 0x00, 0x01, 0x00, 0x00 + .word _021E57C0 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .word __read_console + .word __write_console + .word __close_console + .word 0x00000000 +_02111018: + .byte 0x01, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + .word _021E56C0 + .byte 0x00, 0x01, 0x00, 0x00 + .word _021E56C0 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + .word __read_console + .word __write_console + .word __close_console + .word 0x00000000 +_02111064: + .byte 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .word _021E55C0 + .byte 0x00, 0x01, 0x00, 0x00 + .word _021E55C0 + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .word __read_console + .word __write_console + .word __close_console + .word 0x00000000 +_021110B0: + .asciz "Assertion (%s) failed in \"%s\", function \"%s\", line %d\n" + .balign 4, 0 +_021110E8: + .byte 0x00, 0x00, 0x80, 0x7F +_021110EC: + .byte 0xFF, 0xFF, 0xFF, 0x7F +_021110F0: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F +_021110F8: + .byte 0x00, 0x00, 0x00, 0x00 + .balign 4, 0 +_021110FC: + .asciz "%T" + .balign 4, 0 +_02111100: + .asciz "AM|PM" + .balign 4, 0 +_02111108: + .word __mbtowc_noconv + .word __wctomb_noconv +_02111110: + .byte 0x20, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .word _02111140 +_02111120: + .word _02111100 + .word _02111224 + .word _02111218 + .word _02111200 + .word _021110FC + .word _02111234 + .word _0211128C + .word _021110F8 +_02111140: + .byte 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00 + .byte 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00 + .byte 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00 + .byte 0x29, 0x00, 0x2A, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00 + .byte 0x17, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x2F, 0x00, 0x31, 0x00, 0x33, 0x00, 0x35, 0x00, 0x37, 0x00 + .byte 0x39, 0x00, 0x3B, 0x00, 0x3D, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x47, 0x00 + .byte 0x49, 0x00, 0x4B, 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x51, 0x00, 0x53, 0x00, 0x55, 0x00, 0x57, 0x00 + .byte 0x59, 0x00, 0x5B, 0x00, 0x5D, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00 + .byte 0x00, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x32, 0x00, 0x34, 0x00, 0x36, 0x00, 0x38, 0x00 + .byte 0x3A, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x46, 0x00, 0x48, 0x00 + .byte 0x4A, 0x00, 0x4C, 0x00, 0x4E, 0x00, 0x50, 0x00, 0x52, 0x00, 0x54, 0x00, 0x56, 0x00, 0x58, 0x00 + .byte 0x5A, 0x00, 0x5C, 0x00, 0x5E, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x00, 0x00 + .balign 4, 0 +_02111200: + .asciz "%m/%d/%y" + .balign 4, 0 +_0211120C: + .word _02111120 + .word _02111110 + .word _02111108 + .balign 4, 0 +_02111218: + .asciz "%I:%M:%S %p" + .balign 4, 0 +_02111224: + .asciz "%a %b %e %T %Y" + .balign 4, 0 +_02111234: + .asciz "Sun|Sunday|Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday" + .balign 4, 0 +_0211128C: + .asciz "Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December" + .balign 4, 0 +_02111314: + .asciz "0x0p0" + .balign 4, 0 +_0211131C: + .asciz "-INF" + .balign 4, 0 +_02111324: + .asciz "-inf" + .balign 4, 0 +_0211132C: + .asciz "INF" + .balign 4, 0 +_02111330: + .asciz "inf" + .balign 4, 0 +_02111334: + .asciz "-NAN" + .balign 4, 0 +_0211133C: + .asciz "-nan" + .balign 4, 0 +_02111344: + .asciz "NAN" + .balign 4, 0 +_02111348: + .asciz "nan" + .balign 4, 0 +_0211134C: + .byte 0x00, 0x00, 0x00, 0x00 +_02111350: + .byte 0x00, 0x00, 0x00, 0x00 +_02111354: + .byte 0x01, 0x00, 0x00, 0x00 +_02111358: + .byte 0x00, 0x00, 0x00, 0x00 +_0211135C: + .word _02111358 + .word _02111358 +_02111364: + .byte 0x30, 0x00, 0x78, 0x00, 0x30, 0x00, 0x70, 0x00, 0x30, 0x00, 0x00, 0x00 +_02111370: + .byte 0x2D, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00 +_0211137C: + .byte 0x2D, 0x00, 0x69, 0x00 + .byte 0x6E, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00 +_02111388: + .byte 0x49, 0x00, 0x4E, 0x00, 0x46, 0x00, 0x00, 0x00 +_02111390: + .byte 0x69, 0x00, 0x6E, 0x00, 0x66, 0x00, 0x00, 0x00 +_02111398: + .byte 0x2D, 0x00, 0x4E, 0x00, 0x41, 0x00, 0x4E, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 +_021113A4: + .byte 0x2D, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00 +_021113B0: + .byte 0x4E, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x00, 0x00 +_021113B8: + .byte 0x6E, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x00, 0x00 +_021113C0: + .byte 0x00, 0x00, 0x00, 0x00 +_021113C4: + .byte 0x00, 0x00, 0x00, 0x00 +_021113C8: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x8F, 0x40 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xF8, 0x40 + .byte 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x2E, 0x41, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x63, 0x41 + .byte 0x00, 0x00, 0x00, 0x00, 0x84, 0xD7, 0x97, 0x41 + .balign 4, 0 +_02111408: + .asciz "542101086242752217003726400434970855712890625" + .balign 4, 0 +_02111438: + .asciz "11102230246251565404236316680908203125" + .balign 4, 0 +_02111460: + .asciz "23283064365386962890625" + .balign 4, 0 +_02111478: + .asciz "152587890625" + .balign 4, 0 +_02111488: + .asciz "390625" + .balign 4, 0 +_02111490: + .asciz "78125" + .balign 4, 0 +_02111498: + .asciz "15625" + .balign 4, 0 +_021114A0: + .asciz "3125" + .balign 4, 0 +_021114A8: + .asciz "625" + .balign 4, 0 +_021114AC: + .asciz "125" + .balign 4, 0 +_021114B0: + .asciz "25" + .balign 4, 0 +_021114B4: + .asciz "5" + .balign 4, 0 +_021114B8: + .asciz "1" + .balign 4, 0 +_021114BC: + .asciz "2" + .balign 4, 0 +_021114C0: + .asciz "4" + .balign 4, 0 +_021114C4: + .asciz "8" + .balign 4, 0 +_021114C8: + .asciz "16" + .balign 4, 0 +_021114CC: + .asciz "32" + .balign 4, 0 +_021114D0: + .asciz "64" + .balign 4, 0 +_021114D4: + .asciz "128" + .balign 4, 0 +_021114D8: + .asciz "256" + .balign 4, 0 +_021114DC: + .asciz "179769313486231580793728714053034151" + .balign 4, 0 +_02111504: + .word _021117F4 + .word _02111528 +_0211150C: + .word _021117F4 + .word _0211158C +_02111514: + .word _021117F4 + .word _02111568 +_0211151C: + .word _021117E4 + .word _021115B8 + .word _0211150C +_02111528: + .asciz "St9exception" + .balign 4, 0 +_02111538: + .word 0 + .word _0211150C +_02111540: + .word _ZNSt9exceptionD1Ev + .word _ZNSt9exceptionD0Ev + .word 0 + .word 0 + .word 0 + .word _0211151C +_02111558: + .word _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED1Ev + .word _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED0Ev + .word _ZNKSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE11get_deleterERKSt9type_info + .word _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE7disposeEv +_02111568: + .asciz "NSt6detail14default_deleteIA0_cEE" + .balign 4, 0 +_0211158C: + .asciz "NSt3tr16detail25shared_ptr_deleter_commonE" + .balign 4, 0 +_021115B8: + .asciz "NSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEEE" + .balign 4, 0 +_02111600: + .word _021117E4 + .word _02111618 + .word _02111504 +_0211160C: + .word _021117E4 + .word _02111628 + .word _02111600 +_02111618: + .asciz "St11logic_error" + .balign 4, 0 +_02111628: + .asciz "St12length_error" + .balign 4, 0 +_0211163C: + .word 0 + .word _0211160C +_02111644: + .word _ZNSt12length_errorD1Ev + .word _ZNSt12length_errorD0Ev + .word _ZNSt3tr16detail25shared_ptr_deleter_commonD2Ev + .word 0 + .word _02111600 +_02111658: + .word _ZNSt11logic_errorD1Ev + .word _ZNSt11logic_errorD0Ev + .word _ZNSt3tr16detail25shared_ptr_deleter_commonD2Ev +_02111664: + .asciz "vector length error" + .balign 4, 0 +_02111678: + .asciz "!std::exception!!std::logic_error!!std::length_error!!" + .balign 4, 0 +_021116B0: + .word _021117E4 + .word _021116CC + .word _02111504 +_ZZNKSt13bad_exception4whatEvEs: + .asciz "bad_exception" + .balign 4, 0 +_021116CC: + .asciz "St13bad_exception" + .balign 4, 0 +_021116E0: + .word 0 + .word _021116B0 +_021116E8: + .word _ZNSt13bad_exceptionD1Ev + .word _ZNSt13bad_exceptionD0Ev + .word _ZNKSt13bad_exception4whatEv +_021116F4: + .asciz "!std::bad_exception!!" + .balign 4, 0 +_0211170C: + .asciz "!std::exception!!std::bad_exception!!" + .balign 4, 0 +_02111734: + .byte 1 + .balign 4, 0 +_02111738: + .asciz "bad_alloc" + .balign 4, 0 +_02111744: + .word _021117E4 + .word _02111750 + .word _02111504 +_02111750: + .asciz "St9bad_alloc" + .balign 4, 0 +_02111760: + .asciz "!std::bad_alloc!" + .balign 4, 0 +_02111774: + .word 0 + .word _02111744 +_ZTVSt9bad_alloc: + .word _ZNSt9bad_allocD1Ev + .word _ZNSt9bad_allocD0Ev + .word _ZNKSt9bad_alloc4whatEv +_02111788: + .asciz "!std::exception!!std::bad_alloc!!" + .balign 4, 0 +_021117AC: + .word _021117F4 + .word _021117CC +_021117B4: + .word _021117E4 + .word _02111820 + .word _021117C0 +_021117C0: + .word _021117E4 + .word _021117FC + .word _021117AC +_021117CC: + .asciz "St9type_info" + .balign 4, 0 +_021117DC: + .word 0 + .word _021117B4 +_021117E4: + .word _ZN10__cxxabiv120__si_class_type_infoD1Ev + .word _ZN10__cxxabiv120__si_class_type_infoD0Ev + .word 0 + .word _021117C0 +_021117F4: + .word _ZN10__cxxabiv117__class_type_infoD1Ev + .word _ZN10__cxxabiv117__class_type_infoD0Ev +_021117FC: + .asciz "N10__cxxabiv117__class_type_infoE" + .balign 4, 0 +_02111820: + .asciz "N10__cxxabiv120__si_class_type_infoE" + .balign 4, 0 +_02111848: + .word _ZSt9dthandlerv + .word _ZSt9duhandlerv + + exception abort, 0x0025, 0x00100000 + exception exit, 0x004D, 0x00100100 + exception __exit, 0x0129, 0x00200300 + exception nan, 0x0019, 0x00000000 + exception malloc, 0x0019, 0x00100000 + exception free, 0x0015, 0x00100000 + exception __flush_line_buffered_output_files, 0x008D, 0x00403F00 + exception __flush_all, 0x0069, 0x00403F00 + exception __msl_assertion_failed, 0x003D, 0x00200100 + exception __load_buffer, 0x008D, 0x00200700 + exception __flush_buffer, 0x0089, 0x00200300 + exception fread, 0x010D, 0x00407F00 + exception __fread, 0x0349, 0x00507F00 + exception __fwrite, 0x02B1, 0x0060FF00 + exception fclose, 0x0075, 0x00200300 + exception fflush, 0x00E9, 0x00100100 + exception ftell, 0x011D, 0x00300F00 + exception _fseek, 0x01E9, 0x00400320 + exception fseek, 0x012D, 0x00403F00 + exception rewind, 0x0025, 0x00100100 + exception mbtowc, 0x001D, 0x00100000 + exception wctomb, 0x001D, 0x00100000 + exception mbstowcs, 0x0089, 0x00301F00 + exception wcstombs, 0x0079, 0x00403F00 + exception memset, 0x0015, 0x00100100 + exception long2str__printf, 0x024D, 0x0090FF20 + exception longlong2str__printf, 0x02FD, 0x00A0FF20 + exception double2hex__printf, 0x04DD, 0x00F07F20 + exception float2str__printf, 0x0765, 0x00C0FF20 + exception __pformatter, 0x0824, _020F4F84 + exception __FileWrite, 0x002D, 0x00200300 + exception __StringWrite, 0x0045, 0x00200300 + exception printf, 0x0119, 0x00300120 + exception vsnprintf, 0x0069, 0x00300300 + exception vsprintf, 0x0019, 0x00000000 + exception snprintf, 0x0029, 0x00300020 + exception sprintf, 0x002D, 0x00300020 + exception qsort, 0x0165, 0x0070FF00 + exception __sformatter, 0x0D54, _020F4F8C + exception vsscanf, 0x0055, 0x00200000 + exception sscanf, 0x0029, 0x00300020 + exception raise, 0x0131, 0x00200300 + exception __strtold, 0x124C, _020F4F94 + exception strtold, 0x00E1, 0x00500F00 + exception atof, 0x0011, 0x00000000 + exception __strtoul, 0x03E9, 0x0060FF00 + exception __strtoull, 0x046D, 0x00807F00 + exception strtoul, 0x0099, 0x00600300 + exception strtol, 0x00C9, 0x00600300 + exception atoi, 0x0015, 0x00000000 + exception wmemcpy, 0x0011, 0x00000000 + exception long2str__wprintf, 0x0251, 0x0090FF20 + exception longlong2str__wprintf, 0x0301, 0x00A0FF20 + exception double2hex__wprintf, 0x0399, 0x00F07F20 + exception float2str__wprintf, 0x064C, _020F4F9C + exception __wpformatter, 0x08F0, _020F4FA4 + exception __wStringWrite, 0x0041, 0x00200300 + exception swprintf, 0x0029, 0x00300020 + exception vswprintf, 0x0071, 0x00300300 + exception __ieee754_pow, 0x1188, _020F4FAC + exception frexp, 0x00BD, 0x00300120 + exception ldexp, 0x024D, 0x00300120 + exception pow, 0x000D, 0x00000000 + exception __rounddec, 0x0041, 0x00200300 + exception __ull2dec, 0x00CD, 0x0050FF00 + exception __timesdec, 0x0185, 0x00D0FF00 + exception __str2dec, 0x009D, 0x00100000 + exception __two_exp, 0x0385, 0x00B00300 + exception __num2dec_internal, 0x0181, 0x00E01F00 + exception __num2dec, 0x00A9, 0x00200300 + exception __dec2num, 0x0624, _020F4FB4 + exception scalbn, 0x002D, 0x00200100 + exception __sys_alloc, 0x0019, 0x00000000 + exception __sys_free, 0x0019, 0x00000000 + exception _ZNSt3tr110shared_ptrIcEC1IcNSt6detail14default_deleteIA0_cEEEEPT_T0_, 0x0080, _020F4FBC + exception _ZNSt9exceptionD0Ev, 0x0015, 0x00100100 + exception _ZNKSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE11get_deleterERKSt9type_info, 0x0029, 0x00100100 + exception _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEE7disposeEv, 0x0011, 0x00000000 + exception _ZNSt3tr110shared_ptrIcED1Ev, 0x0040, _020F4FCC + exception _ZN10Metrowerks8move_ptrIcRNSt6detail14default_deleteIA0_cEEED1Ev, 0x0021, 0x00100100 + exception _ZNSt3tr16detail18shared_ptr_deleterIcNSt6detail14default_deleteIA0_cEEED0Ev, 0x0015, 0x00100100 + exception _ZNSt11logic_errorD1Ev, 0x0019, 0x00100100 + exception _ZNSt11logic_errorD0Ev, 0x0021, 0x00100100 + exception _ZNSt12length_errorD1Ev, 0x0019, 0x00100100 + exception _ZNSt12length_errorD0Ev, 0x0021, 0x00100100 + exception _ZNSt3tr16detail25shared_ptr_deleter_common7releaseEv, 0x0031, 0x00100100 + exception _ZNSt3tr16detail25shared_ptr_deleter_common12release_weakEv, 0x002D, 0x00100000 + exception _ZNSt15__vector_commonILb1EE18throw_length_errorEv, 0x0090, _020F4FE0 + exception __read_console, 0x0051, 0x00300F00 + exception __write_console, 0x0035, 0x00200700 + exception _Z19FindExceptionRecordPcP13ExceptionInfo, 0x0109, 0x00503F00 + exception _Z10NextActionP14ActionIterator, 0x0388, _020F4FF8 + exception _Z11UnwindStackP12ThrowContextP13ExceptionInfoPc, 0x08B0, _020F5000 + exception _Z23FindMostRecentExceptionP12ThrowContextP13ExceptionInfo, 0x0154, _020F5010 + exception _Z17IsInSpecificationPcP16ex_specification, 0x0085, 0x00401F00 + exception __unexpected, 0x00A8, _020F5018 + exception _Z16HandleUnexpectedP12ThrowContextP13ExceptionInfoP16ex_specificationPc, 0x0060, _020F502C + exception _Z20FindExceptionHandlerP12ThrowContextP13ExceptionInfoPl, 0x01DC, _020F5034 + exception _Z14__ThrowHandlerP12ThrowContext, 0x00ED, 0x00700300 + exception __end__catch, 0x0029, 0x00100000 + exception _ZNSt13bad_exceptionD0Ev, 0x0015, 0x00100100 + exception _ZSt17__throw_bad_allocv, 0x0041, 0x00100000 + exception _Znwm, 0x0064, _020F503C + exception _ZnwmRKSt9nothrow_t, 0x0044, _020F5054 + exception _ZdlPv, 0x0015, 0x00100000 + exception _Znam, 0x002C, _020F5070 + exception _ZnamRKSt9nothrow_t, 0x002C, _020F5088 + exception _ZdaPv, 0x000D, 0x00000000 + exception _ZNSt9bad_allocD0Ev, 0x0015, 0x00100100 + exception __call_static_initializers, 0x002D, 0x00100100 + exception __destroy_global_chain, 0x0045, 0x00200300 + exception _ZNKSt9type_infoeqERKS_, 0x0031, 0x00100000 + exception _ZN10__cxxabiv117__class_type_infoD1Ev, 0x0015, 0x00100100 + exception _ZN10__cxxabiv117__class_type_infoD0Ev, 0x001D, 0x00100100 + exception _ZN10__cxxabiv117__class_type_infoD2Ev, 0x0015, 0x00100100 + exception _ZN10__cxxabiv120__si_class_type_infoD1Ev, 0x0015, 0x00100100 + exception _ZN10__cxxabiv120__si_class_type_infoD0Ev, 0x001D, 0x00100100 + exception _ZSt9dthandlerv, 0x000D, 0x00000000 + exception _ZSt9duhandlerv, 0x000D, 0x00000000 + exception _ZSt9terminatev, 0x0019, 0x00100000 + exception _ZSt10unexpectedv, 0x0019, 0x00100000 + exception _Z16__SetupFrameInfoP12ThrowContextP13ExceptionInfo, 0x00A1, 0x00200700 + exception _Z16__SkipUnwindInfoPc, 0x0031, 0x00200100 + exception _ExitProcess, 0x000D, 0x00000000 + + .section .exception,4,1,2 + ; MSL symbols have exceptions for C++ mode, even when compiling C. + +_020F4F84: + .byte 0x20, 0xFF, 0x09, 0x60, 0x00, 0x00, 0x00, 0x00 +_020F4F8C: + .byte 0x00, 0xFF, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00 +_020F4F94: + .byte 0x00, 0xFF, 0x01, 0xD0, 0x00, 0x00, 0x00, 0x00 +_020F4F9C: + .byte 0x20, 0xFF, 0x09, 0x60, 0x00, 0x00, 0x00, 0x00 +_020F4FA4: + .byte 0x20, 0xFF, 0x11, 0x68, 0x00, 0x00, 0x00, 0x00 +_020F4FAC: + .byte 0x20, 0xFF, 0x01, 0xB8, 0x00, 0x00, 0x00, 0x00 +_020F4FB4: + .byte 0x00, 0xFF, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00 +_020F4FBC: + .byte 0x20, 0x03, 0x50, 0x58, 0x00, 0x0E, 0x00, 0x82, 0x00, 0xF0, 0x04, 0x0F, 0x02, 0x00, 0x00, 0x00 +_020F4FCC: + .byte 0x40, 0x81, 0x50, 0x00 + .byte 0x40, 0x00, 0x16, 0x28, 0x00, 0x1E, 0x00, 0x8F, 0x00, 0x58, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x00 +_020F4FE0: + .byte 0x00, 0x07, 0x40, 0x48, 0x58, 0x22, 0x18, 0x00, 0x14, 0x00, 0x27, 0x0A, 0x00, 0xB0, 0x04, 0x0F + .byte 0x02, 0xA6, 0x0C, 0x00 + .word _ZNSt9exceptionD2Ev +_020F4FF8: + .byte 0x00, 0x03, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00 +_020F5000: + .byte 0x00, 0xFF, 0x01, 0xC8, 0x58, 0x1D, 0xB8, 0x1A, 0x01, 0x8C, 0x50, 0x1A, 0x00, 0x8E, 0x00, 0x00 +_020F5010: + .byte 0x00, 0x03, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00 +_020F5018: + .byte 0x40, 0x81, 0x70, 0x00, 0x30, 0x00, 0x16, 0x20 + .byte 0xB0, 0x24, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x8D, 0x08 +_020F502C: + .byte 0x00, 0x0F, 0x30, 0x38, 0x80, 0x0E, 0x00, 0x8E +_020F5034: + .byte 0x00, 0xFF, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x00 +_020F503C: + .byte 0x40, 0x87, 0x60, 0x00 + .byte 0x40, 0x40, 0x16, 0x28, 0x00, 0x26, 0x00, 0x8F, 0x02, 0x98, 0x00, 0x60, 0x17, 0x11, 0x02, 0x8D + .byte 0x00, 0x00, 0x00, 0x00 +_020F5054: + .byte 0x40, 0x80, 0x70, 0x00, 0x28, 0x00, 0x1C, 0x20, 0x00, 0x2A, 0x28, 0x00 + .byte 0x32, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x8F, 0x00, 0x60, 0x00, 0x8D, 0x00, 0x00 +_020F5070: + .byte 0x40, 0x80, 0x40, 0x00, 0x20, 0x00, 0x16, 0x20, 0x00, 0x26, 0x00, 0x8F, 0x02, 0x30, 0x00, 0x60 + .byte 0x17, 0x11, 0x02, 0x8D, 0x00, 0x00, 0x00, 0x00 +_020F5088: + .byte 0x40, 0x80, 0x40, 0x00, 0x20, 0x00, 0x16, 0x20 + .byte 0x00, 0x1E, 0x00, 0x8F, 0x00, 0x30, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x00 diff --git a/lib/asm/nitro.s b/lib/asm/nitro.s new file mode 100644 index 00000000..d53cf410 --- /dev/null +++ b/lib/asm/nitro.s @@ -0,0 +1,19779 @@ + .include "asm/macros.inc" + .include "nitro.inc" + .include "global.inc" + + .bss + + .public GXi_DmaId + .public GX_ResetBankForClearImage + .public G2_GetBG0ScrPtr + .public G2S_GetBG0ScrPtr + .public G2_GetBG1ScrPtr + .public G2S_GetBG1ScrPtr + .public G2_GetBG2ScrPtr + .public G2S_GetBG2ScrPtr + .public G2_GetBG3ScrPtr + .public G2S_GetBG3ScrPtr + .public G3_LoadMtx44 + .public OSi_GetUnusedThreadId + .public OSi_InsertLinkToQueue + .public OSi_ThreadInfo + .public OSi_IrqThreadQueue + + .public OSi_IrqCallback + .public OSi_IrqCallbackInfoIndex + .public OSi_IrqCallbackInfo + .public OSi_EnterDmaCallback + .public OSi_EnterTimerCallback + .public OS_SetIrqStackChecker + .public OS_InitLock + .public OSi_DoLockByWord + .public OS_LockByWord + .public OSi_DoUnlockByWord + .public OS_UnlockByWord + .public OSi_DoTryLockByWord + .public OS_LockCartridge + .public OS_UnlockCartridge + .public OS_UnLockCartridge + .public OS_TryLockCartridge + .public OS_LockCard + .public OS_UnlockCard + .public OS_UnLockCard + .public OS_ReadOwnerOfLockWord + .public OS_InitThread + .public OSi_ExitThread + .public OSi_ExitThread_ArgSpecified + .public OSi_InsertThreadToList + .public OSi_RemoveLinkFromQueue + .public OSi_RemoveMutexLinkFromQueue + .public OSi_RemoveSpecifiedLinkFromQueue + .public OSi_RemoveThreadFromList + .public OSi_RescheduleThread + .public OSi_ExitThread_Destroy + .public OS_IsRunOnEmulator + .public OS_GetConsoleType + .public OS_JamMessage + .public DC_InvalidateAll + .public DC_StoreAll + .public DC_FlushAll + .public DC_InvalidateRange + .public DC_StoreRange + .public DC_FlushRange + .public IC_InvalidateAll + .public MI_SetWramBank + .public MIi_CheckAnotherAutoDMA + .public MIi_CheckDma0SourceAddress + .public MIi_DmaSetParams + .public MIi_CardDmaCopy32 + .public OS_InitIrqTable + .public OSi_WaitVCount0 + .public OS_GetArenaHi + .public OS_GetArenaLo + .public DLAddFront + .public DLExtract + .public DLInsert + .public OS_GetDTCMAddress + .public OS_EnableProtectionUnit + .public OS_DisableProtectionUnit + .public OS_SetDPermissionsForProtectionRegion + .public OSi_SetTimerReserved + .public OSi_SetTimer + .public OSi_InsertAlarm + .public OS_GetCpsrIrq + .public OSi_SendToPxi + +_021E1A40: + .space 0x4 + +_021E1A44: + .space 0x1C + +_021E1A60: + .space 0x24 + +_021E1A84: + .space 0x3C + +_021E1AC0: + .space 0x280 + +_021E1D40: + .space 0xD20 + +_021E2A60: + .space 0xAC8 + +_021E3528: + .space 0x18 + +_021E3540: + .space 0x60 + +_021E35A0: + .space 0x4 + +_021E35A4: + .space 0x4 + +_021E35A8: + .space 0x80 + +_021E3628: + .space 0x4 + +_021E362C: + .space 0xC + +_021E3638: + .space 0x4 + +_021E363C: + .space 0x8 + +_021E3644: + .space 0x8 + +_021E364C: + .space 0x8 + +_021E3654: + .space 0x5C + +_021E36B0: + .space 0x1C + +_021E36CC: + .space 0x20 + +_021E36EC: + .space 0x4 + +_021E36F0: + .space 0x1C + +_021E370C: + .space 0xC + +_021E3718: + .space 0xC + +_021E3724: + .space 0x4 + +_021E3728: + .space 0x10 + +_021E3738: + .space 0x18 + +_021E3750: + .space 0x4 + +_021E3754: + .space 0x24 + +_021E3778: + .space 0xC + +_021E3784: + .space 0x24 + +_021E37A8: + .space 0x18 + +_021E37C0: + .space 0x60 + +_021E3820: + .space 0x620 + +_021E3E40: + .space 0x20 + +_021E3E60: + .space 0x220 + +_021E4080: + .space 0x8 + +_021E4088: + .space 0x4 + +_021E408C: + .space 0x10 + +_021E409C: + .space 0xBC + +_021E4158: + .space 0xC8 + +_021E4220: + .space 0x8 + +_021E4228: + .space 0x20 + +_021E4248: + .space 0x28 + +_021E4270: + .space 0x14 + +_021E4284: + .space 0x10 + +_021E4294: + .space 0x2C + +_021E42C0: + .space 0xA00 + +_021E4CC0: + .space 0x80 + +_021E4D40: + .space 0x4 + +_021E4D44: + .space 0x1C + +_021E4D60: + .space 0x20 + +_021E4D80: + .space 0x4 + +_021E4D84: + .space 0xBC + +_021E4E40: + .space 0xE8 + +_021E4F28: + .space 0x4 + +_021E4F2C: + .space 0x4 + +_021E4F30: + .space 0x4 + +_021E4F34: + .space 0x4 + +_021E4F38: + .space 0x4 + +_021E4F3C: + .space 0x4 + +_021E4F40: + .space 0x4 + +_021E4F44: + .space 0x4 + +_021E4F48: + .space 0x14 + +_021E4F5C: + .space 0x4 + +_021E4F60: + .space 0x8 + +_021E4F68: + .space 0x4 + +_021E4F6C: + .space 0x24 + +_021E4F90: + .space 0x400 + + .text + + arm_func_start SND_StopSeq +SND_StopSeq: ; 0x020D5044 + stmdb sp!, {r3, lr} + mov r2, #0 + mov r1, r0 + mov r3, r2 + mov r0, #1 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_StopSeq + + arm_func_start SND_PrepareSeq +SND_PrepareSeq: ; 0x020D5064 + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, r2 + str r3, [sp] + mov r1, r0 + mov r2, lr + mov r3, ip + mov r0, #2 + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_PrepareSeq + + arm_func_start SND_StartPreparedSeq +SND_StartPreparedSeq: ; 0x020D508C + stmdb sp!, {r3, lr} + mov r2, #0 + mov r1, r0 + mov r3, r2 + mov r0, #3 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_StartPreparedSeq + + arm_func_start SND_PauseSeq +SND_PauseSeq: ; 0x020D50AC + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #4 + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_PauseSeq + + arm_func_start SND_SetPlayerTempoRatio +SND_SetPlayerTempoRatio: ; 0x020D50CC + ldr ip, _020D50E0 ; =SNDi_SetPlayerParam + mov r2, r1 + mov r1, #0x1a + mov r3, #2 + bx ip + .align 2, 0 +_020D50E0: .word SNDi_SetPlayerParam + arm_func_end SND_SetPlayerTempoRatio + + arm_func_start SND_SetPlayerVolume +SND_SetPlayerVolume: ; 0x020D50E4 + ldr ip, _020D50F8 ; =SNDi_SetPlayerParam + mov r2, r1 + mov r1, #6 + mov r3, #2 + bx ip + .align 2, 0 +_020D50F8: .word SNDi_SetPlayerParam + arm_func_end SND_SetPlayerVolume + + arm_func_start SND_SetPlayerChannelPriority +SND_SetPlayerChannelPriority: ; 0x020D50FC + ldr ip, _020D5110 ; =SNDi_SetPlayerParam + mov r2, r1 + mov r1, #4 + mov r3, #1 + bx ip + .align 2, 0 +_020D5110: .word SNDi_SetPlayerParam + arm_func_end SND_SetPlayerChannelPriority + + arm_func_start SND_SetTrackPitch +SND_SetTrackPitch: ; 0x020D5114 + stmdb sp!, {r3, lr} + mov r3, r2 + mov ip, #2 + mov r2, #0xc + str ip, [sp] + bl SNDi_SetTrackParam + ldmia sp!, {r3, pc} + arm_func_end SND_SetTrackPitch + + arm_func_start SND_SetTrackPan +SND_SetTrackPan: ; 0x020D5130 + stmdb sp!, {r3, lr} + mov r3, r2 + mov ip, #1 + mov r2, #9 + str ip, [sp] + bl SNDi_SetTrackParam + ldmia sp!, {r3, pc} + arm_func_end SND_SetTrackPan + + arm_func_start SND_SetTrackAllocatableChannel +SND_SetTrackAllocatableChannel: ; 0x020D514C + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + mov ip, #0 + mov r1, r0 + mov r2, lr + mov r0, #9 + str ip, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetTrackAllocatableChannel + + arm_func_start SND_StartTimer +SND_StartTimer: ; 0x020D5174 + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, r2 + str r3, [sp] + mov r1, r0 + mov r2, lr + mov r3, ip + mov r0, #0xc + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_StartTimer + + arm_func_start SND_StopTimer +SND_StopTimer: ; 0x020D519C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r2 + mov sb, r0 + mov r8, r1 + mov r6, r3 + mov r5, r7 + mov r4, #0 + b _020D51D4 +_020D51BC: + tst r5, #1 + beq _020D51CC + mov r0, r4 + bl SNDi_IncAlarmId +_020D51CC: + add r4, r4, #1 + mov r5, r5, lsr #1 +_020D51D4: + cmp r4, #8 + bge _020D51E4 + cmp r5, #0 + bne _020D51BC +_020D51E4: + mov r1, sb + mov r2, r8 + mov r3, r7 + mov r0, #0xd + str r6, [sp] + bl PushCommand_impl + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end SND_StopTimer + + arm_func_start SND_SetupAlarm +SND_SetupAlarm: ; 0x020D5200 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r4, r2 + mov r5, r1 + ldr r2, [sp, #0x18] + mov r6, r0 + mov r1, r3 + bl SNDi_SetAlarmHandler + str r0, [sp] + mov r1, r6 + mov r2, r5 + mov r3, r4 + mov r0, #0x12 + bl PushCommand_impl + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end SND_SetupAlarm + + arm_func_start SND_LockChannel +SND_LockChannel: ; 0x020D5240 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x1a + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_LockChannel + + arm_func_start SND_UnlockChannel +SND_UnlockChannel: ; 0x020D5260 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x1b + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_UnlockChannel + + arm_func_start SND_SetChannelTimer +SND_SetChannelTimer: ; 0x020D5280 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x13 + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetChannelTimer + + arm_func_start SND_SetChannelVolume +SND_SetChannelVolume: ; 0x020D52A0 + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + mov ip, #0 + mov r1, r0 + mov r2, lr + mov r0, #0x14 + str ip, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetChannelVolume + + arm_func_start SND_SetChannelPan +SND_SetChannelPan: ; 0x020D52C8 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x15 + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetChannelPan + + arm_func_start SND_SetupChannelPcm +SND_SetupChannelPcm: ; 0x020D52E8 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, [sp, #0x1c] + mov r1, r1, lsl #0x18 + orr r4, r1, r3, lsl #26 + ldr r5, [sp, #0x24] + mov r1, ip, lsl #0x16 + ldr r3, [sp, #0x18] + ldr ip, [sp, #0x10] + orr r4, r4, r5, lsl #16 + orr r4, ip, r4 + ldr lr, [sp, #0x20] + orr r3, r1, r3, lsl #24 + ldr ip, [sp, #0x14] + orr r1, r0, lr, lsl #16 + orr r3, ip, r3 + mov r0, #0xe + str r4, [sp] + bl PushCommand_impl + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SND_SetupChannelPcm + + arm_func_start SND_InvalidateSeqData +SND_InvalidateSeqData: ; 0x020D5334 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x1e + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_InvalidateSeqData + + arm_func_start SND_InvalidateBankData +SND_InvalidateBankData: ; 0x020D5354 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x1f + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_InvalidateBankData + + arm_func_start SND_InvalidateWaveData +SND_InvalidateWaveData: ; 0x020D5374 + stmdb sp!, {r3, lr} + mov r2, r1 + mov r3, #0 + mov r1, r0 + mov r0, #0x20 + str r3, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_InvalidateWaveData + + arm_func_start SND_SetMasterVolume +SND_SetMasterVolume: ; 0x020D5394 + stmdb sp!, {r3, lr} + mov r2, #0 + mov r1, r0 + mov r3, r2 + mov r0, #0x17 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetMasterVolume + + arm_func_start SND_SetOutputSelector +SND_SetOutputSelector: ; 0x020D53B4 + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, r2 + str r3, [sp] + mov r1, r0 + mov r2, lr + mov r3, ip + mov r0, #0x19 + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetOutputSelector + + arm_func_start SND_SetMasterPan +SND_SetMasterPan: ; 0x020D53DC + stmdb sp!, {r3, lr} + mov r2, #0 + mov r1, r0 + mov r3, r2 + mov r0, #0x18 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_SetMasterPan + + arm_func_start SND_ResetMasterPan +SND_ResetMasterPan: ; 0x020D53FC + stmdb sp!, {r3, lr} + mov r2, #0 + mov r0, #0x18 + mov r3, r2 + sub r1, r0, #0x19 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_ResetMasterPan + + arm_func_start SND_ReadDriverInfo +SND_ReadDriverInfo: ; 0x020D541C + stmdb sp!, {r3, lr} + mov r2, #0 + mov r1, r0 + mov r3, r2 + mov r0, #0x21 + str r2, [sp] + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SND_ReadDriverInfo + + arm_func_start SNDi_SetPlayerParam +SNDi_SetPlayerParam: ; 0x020D543C + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, r2 + str r3, [sp] + mov r1, r0 + mov r2, lr + mov r3, ip + mov r0, #6 + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SNDi_SetPlayerParam + + arm_func_start SNDi_SetTrackParam +SNDi_SetTrackParam: ; 0x020D5464 + stmdb sp!, {r3, lr} + ldr ip, [sp, #8] + mov lr, r2 + str r3, [sp] + mov r2, r1 + orr r1, r0, ip, lsl #24 + mov r3, lr + mov r0, #7 + bl PushCommand_impl + ldmia sp!, {r3, pc} + arm_func_end SNDi_SetTrackParam + + arm_func_start PushCommand_impl +PushCommand_impl: ; 0x020D548C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #1 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl SND_AllocCommand + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + str r7, [r0, #4] + str r6, [r0, #8] + str r5, [r0, #0xc] + ldr r1, [sp, #0x18] + str r4, [r0, #0x10] + str r1, [r0, #0x14] + bl SND_PushCommand + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end PushCommand_impl + + arm_func_start SND_Init +SND_Init: ; 0x020D54D0 + stmdb sp!, {r3, lr} + ldr r1, _020D5500 ; =_021E1A40 + ldr r0, [r1] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _020D5504 ; =_021E1A44 + mov r2, #1 + str r2, [r1] + bl OS_InitMutex + bl SND_CommandInit + bl SND_AlarmInit + ldmia sp!, {r3, pc} + .align 2, 0 +_020D5500: .word _021E1A40 +_020D5504: .word _021E1A44 + arm_func_end SND_Init + + arm_func_start SNDi_LockMutex +SNDi_LockMutex: ; 0x020D5508 + ldr ip, _020D5514 ; =OS_LockMutex + ldr r0, _020D5518 ; =_021E1A44 + bx ip + .align 2, 0 +_020D5514: .word OS_LockMutex +_020D5518: .word _021E1A44 + arm_func_end SNDi_LockMutex + + arm_func_start SNDi_UnlockMutex +SNDi_UnlockMutex: ; 0x020D551C + ldr ip, _020D5528 ; =OS_UnlockMutex + ldr r0, _020D552C ; =_021E1A44 + bx ip + .align 2, 0 +_020D5528: .word OS_UnlockMutex +_020D552C: .word _021E1A44 + arm_func_end SNDi_UnlockMutex + + arm_func_start SND_CommandInit +SND_CommandInit: ; 0x020D5530 + stmdb sp!, {r4, lr} + bl InitPXI + ldr lr, _020D55EC ; =_021E1D40 + ldr r0, _020D55F0 ; =_021E1A60 + mov r4, #0 + str lr, [r0] + mov r0, #0x18 + mov r1, r0 + b _020D5568 +_020D5554: + add r3, r4, #1 + mul r2, r4, r1 + mla ip, r3, r0, lr + mov r4, r3 + str ip, [lr, r2] +_020D5568: + cmp r4, #0xff + blt _020D5554 + ldr r0, _020D55F4 ; =_021E2A60 + mov r3, #0 + str r3, [r0, #0xac8] + ldr r1, _020D55F8 ; =_021E3528 + ldr r2, _020D55F0 ; =_021E1A60 + mov r0, #1 + str r1, [r2, #0x10] + str r3, [r2, #8] + str r3, [r2, #0xc] + str r3, [r2, #0x1c] + str r3, [r2, #0x14] + str r3, [r2, #0x18] + str r0, [r2, #0x20] + ldr r0, _020D55FC ; =_021E1AC0 + ldr r1, _020D5600 ; =_021E35A0 + str r3, [r2, #4] + str r0, [r1] + bl SNDi_InitSharedWork + mov r0, #1 + bl SND_AllocCommand + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0x1d + ldr r1, _020D5600 ; =_021E35A0 + str r2, [r0, #4] + ldr r1, [r1] + str r1, [r0, #8] + bl SND_PushCommand + mov r0, #1 + bl SND_FlushCommand + ldmia sp!, {r4, pc} + .align 2, 0 +_020D55EC: .word _021E1D40 +_020D55F0: .word _021E1A60 +_020D55F4: .word _021E2A60 +_020D55F8: .word _021E3528 +_020D55FC: .word _021E1AC0 +_020D5600: .word _021E35A0 + arm_func_end SND_CommandInit + + arm_func_start SND_RecvCommandReply +SND_RecvCommandReply: ; 0x020D5604 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + tst r5, #1 + beq _020D5660 + bl SNDi_GetFinishedCommandTag + ldr r5, _020D570C ; =_021E1A60 + ldr r1, [r5, #4] + cmp r1, r0 + bne _020D5684 + mov r6, #0x64 +_020D5634: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r6 + bl OS_SpinWait + bl OS_DisableInterrupts + mov r4, r0 + bl SNDi_GetFinishedCommandTag + ldr r1, [r5, #4] + cmp r1, r0 + beq _020D5634 + b _020D5684 +_020D5660: + bl SNDi_GetFinishedCommandTag + ldr r1, _020D570C ; =_021E1A60 + ldr r1, [r1, #4] + cmp r1, r0 + bne _020D5684 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020D5684: + ldr r0, _020D570C ; =_021E1A60 + ldr r2, _020D5710 ; =_021E1A84 + ldr r3, [r0, #0x14] + add r1, r3, #1 + ldr r5, [r2, r3, lsl #2] + str r1, [r0, #0x14] + cmp r1, #8 + movgt r1, #0 + strgt r1, [r0, #0x14] + ldr r0, [r5] + mov r2, r5 + cmp r0, #0 + beq _020D56C8 +_020D56B8: + ldr r2, [r2] + ldr r0, [r2] + cmp r0, #0 + bne _020D56B8 +_020D56C8: + ldr r0, _020D570C ; =_021E1A60 + ldr r1, [r0, #0x10] + cmp r1, #0 + strne r5, [r1] + streq r5, [r0] + ldr r1, _020D570C ; =_021E1A60 + mov r0, r4 + str r2, [r1, #0x10] + ldr r2, [r1, #0x1c] + sub r2, r2, #1 + str r2, [r1, #0x1c] + ldr r2, [r1, #4] + add r2, r2, #1 + str r2, [r1, #4] + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D570C: .word _021E1A60 +_020D5710: .word _021E1A84 + arm_func_end SND_RecvCommandReply + + arm_func_start SND_AllocCommand +SND_AllocCommand: ; 0x020D5714 + stmdb sp!, {r4, lr} + mov r4, r0 + bl IsCommandAvailable + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl AllocCommand + cmp r0, #0 + ldmneia sp!, {r4, pc} + tst r4, #1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + bl SND_CountWaitingCommand + cmp r0, #0 + ble _020D5774 + mov r4, #0 +_020D5754: + mov r0, r4 + bl SND_RecvCommandReply + cmp r0, #0 + bne _020D5754 + bl AllocCommand + cmp r0, #0 + beq _020D577C + ldmia sp!, {r4, pc} +_020D5774: + mov r0, #1 + bl SND_FlushCommand +_020D577C: + bl RequestCommandProc + mov r4, #1 +_020D5784: + mov r0, r4 + bl SND_RecvCommandReply + bl AllocCommand + cmp r0, #0 + beq _020D5784 + ldmia sp!, {r4, pc} + arm_func_end SND_AllocCommand + + arm_func_start SND_PushCommand +SND_PushCommand: ; 0x020D579C + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020D57D0 ; =_021E1A60 + ldr r2, [r1, #0xc] + cmp r2, #0 + streq r4, [r1, #8] + strne r4, [r2] + str r4, [r1, #0xc] + mov r1, #0 + str r1, [r4] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020D57D0: .word _021E1A60 + arm_func_end SND_PushCommand + + arm_func_start SND_FlushCommand +SND_FlushCommand: ; 0x020D57D4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl OS_DisableInterrupts + ldr r4, _020D5984 ; =_021E1A60 + mov sb, r0 + ldr r1, [r4, #8] + cmp r1, #0 + bne _020D5800 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D5800: + ldr r1, [r4, #0x1c] + cmp r1, #8 + blt _020D5858 + tst sl, #1 + bne _020D5820 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D5820: + mov r5, #1 +_020D5824: + mov r0, r5 + bl SND_RecvCommandReply + ldr r0, [r4, #0x1c] + cmp r0, #8 + bge _020D5824 + ldr r0, _020D5984 ; =_021E1A60 + ldr r0, [r0, #8] + cmp r0, #0 + bne _020D5858 + mov r0, sb + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D5858: + ldr r0, _020D5988 ; =_021E1D40 + mov r1, #0x1800 + bl DC_FlushRange + ldr r1, _020D5984 ; =_021E1A60 + mov r0, #7 + ldr r1, [r1, #8] + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + bge _020D5918 + tst sl, #1 + bne _020D5898 + mov r0, sb + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D5898: + mov fp, #0 + mov r5, #7 + mov r8, fp + ldr r7, _020D5988 ; =_021E1D40 + mov r6, #0x1800 + ldr r4, _020D5984 ; =_021E1A60 + b _020D58F4 +_020D58B4: + mov r0, sb + bl OS_RestoreInterrupts + mov r0, r8 + bl SND_RecvCommandReply + bl OS_DisableInterrupts + mov sb, r0 + mov r0, r7 + mov r1, r6 + bl DC_FlushRange + ldr r0, [r4, #8] + cmp r0, #0 + bne _020D58F4 + mov r0, sb + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D58F4: + ldr r0, [r4, #0x1c] + cmp r0, #8 + bge _020D58B4 + ldr r1, [r4, #8] + mov r0, r5 + mov r2, fp + bl PXI_SendWordByFifo + cmp r0, #0 + blt _020D58B4 +_020D5918: + ldr r0, _020D5984 ; =_021E1A60 + ldr r2, _020D598C ; =_021E1A84 + ldr r3, [r0, #0x18] + ldr r4, [r0, #8] + add r1, r3, #1 + str r4, [r2, r3, lsl #2] + str r1, [r0, #0x18] + cmp r1, #8 + movgt r1, #0 + strgt r1, [r0, #0x18] + ldr r1, _020D5984 ; =_021E1A60 + mov r0, #0 + str r0, [r1, #8] + str r0, [r1, #0xc] + ldr r2, [r1, #0x1c] + mov r0, sb + add r2, r2, #1 + str r2, [r1, #0x1c] + ldr r2, [r1, #0x20] + add r2, r2, #1 + str r2, [r1, #0x20] + bl OS_RestoreInterrupts + tst sl, #2 + beq _020D597C + bl RequestCommandProc +_020D597C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D5984: .word _021E1A60 +_020D5988: .word _021E1D40 +_020D598C: .word _021E1A84 + arm_func_end SND_FlushCommand + + arm_func_start SND_WaitForCommandProc +SND_WaitForCommandProc: ; 0x020D5990 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl SND_IsFinishedCommandTag + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r4, #0 +_020D59A8: + mov r0, r4 + bl SND_RecvCommandReply + cmp r0, #0 + bne _020D59A8 + mov r0, r5 + bl SND_IsFinishedCommandTag + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl RequestCommandProc + mov r0, r5 + bl SND_IsFinishedCommandTag + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r4, #1 +_020D59E0: + mov r0, r4 + bl SND_RecvCommandReply + mov r0, r5 + bl SND_IsFinishedCommandTag + cmp r0, #0 + beq _020D59E0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SND_WaitForCommandProc + + arm_func_start SND_GetCurrentCommandTag +SND_GetCurrentCommandTag: ; 0x020D59FC + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020D5A24 ; =_021E1A60 + ldr r2, [r1, #8] + cmp r2, #0 + ldreq r4, [r1, #4] + ldrne r4, [r1, #0x20] + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5A24: .word _021E1A60 + arm_func_end SND_GetCurrentCommandTag + + arm_func_start SND_IsFinishedCommandTag +SND_IsFinishedCommandTag: ; 0x020D5A28 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020D5A74 ; =_021E1A60 + ldr r1, [r1, #4] + cmp r4, r1 + bls _020D5A58 + sub r1, r4, r1 + cmp r1, #0x80000000 + movlo r4, #0 + movhs r4, #1 + b _020D5A68 +_020D5A58: + sub r1, r1, r4 + cmp r1, #0x80000000 + movlo r4, #1 + movhs r4, #0 +_020D5A68: + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5A74: .word _021E1A60 + arm_func_end SND_IsFinishedCommandTag + + arm_func_start SND_CountFreeCommand +SND_CountFreeCommand: ; 0x020D5A78 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020D5AB0 ; =_021E1A60 + mov r4, #0 + ldr r1, [r1] + cmp r1, #0 + beq _020D5AA4 +_020D5A94: + ldr r1, [r1] + add r4, r4, #1 + cmp r1, #0 + bne _020D5A94 +_020D5AA4: + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5AB0: .word _021E1A60 + arm_func_end SND_CountFreeCommand + + arm_func_start SND_CountReservedCommand +SND_CountReservedCommand: ; 0x020D5AB4 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020D5AEC ; =_021E1A60 + mov r4, #0 + ldr r1, [r1, #8] + cmp r1, #0 + beq _020D5AE0 +_020D5AD0: + ldr r1, [r1] + add r4, r4, #1 + cmp r1, #0 + bne _020D5AD0 +_020D5AE0: + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5AEC: .word _021E1A60 + arm_func_end SND_CountReservedCommand + + arm_func_start SND_CountWaitingCommand +SND_CountWaitingCommand: ; 0x020D5AF0 + stmdb sp!, {r4, lr} + bl SND_CountFreeCommand + mov r4, r0 + bl SND_CountReservedCommand + rsb r1, r4, #0x100 + sub r0, r1, r0 + ldmia sp!, {r4, pc} + arm_func_end SND_CountWaitingCommand + + arm_func_start PxiFifoCallback +PxiFifoCallback: ; 0x020D5B0C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, r5 + bl SNDi_CallAlarmHandler + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + arm_func_end PxiFifoCallback + + arm_func_start InitPXI +InitPXI: ; 0x020D5B30 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _020D5B8C ; =PxiFifoCallback + mov r0, #7 + bl PXI_SetFifoRecvCallback + bl IsCommandAvailable + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #7 + mov r1, #1 + bl PXI_IsCallbackReady + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r6, #0x64 + mov r5, #7 + mov r4, #1 +_020D5B6C: + mov r0, r6 + bl OS_SpinWait + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020D5B6C + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D5B8C: .word PxiFifoCallback + arm_func_end InitPXI + + arm_func_start RequestCommandProc +RequestCommandProc: ; 0x020D5B90 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #7 + mov r4, #0 +_020D5B9C: + mov r0, r5 + mov r1, r4 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _020D5B9C + ldmia sp!, {r3, r4, r5, pc} + arm_func_end RequestCommandProc + + arm_func_start AllocCommand +AllocCommand: ; 0x020D5BB8 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020D5BFC ; =_021E1A60 + ldr r4, [r1] + cmp r4, #0 + bne _020D5BDC + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} +_020D5BDC: + ldr r2, [r4] + str r2, [r1] + cmp r2, #0 + moveq r2, #0 + streq r2, [r1, #0x10] + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5BFC: .word _021E1A60 + arm_func_end AllocCommand + + arm_func_start IsCommandAvailable +IsCommandAvailable: ; 0x020D5C00 + stmdb sp!, {r4, lr} + bl OS_IsRunOnEmulator + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + bl OS_DisableInterrupts + ldr r1, _020D5C3C ; =0x04FFF200 + mov r2, #0x10 + str r2, [r1] + ldr r4, [r1] + bl OS_RestoreInterrupts + cmp r4, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D5C3C: .word 0x04FFF200 + arm_func_end IsCommandAvailable + + arm_func_start SND_AlarmInit +SND_AlarmInit: ; 0x020D5C40 + mov r1, #0 + ldr r2, _020D5C6C ; =_021E3540 + mov r0, r1 +_020D5C4C: + str r0, [r2] + str r0, [r2, #4] + add r1, r1, #1 + strb r0, [r2, #8] + cmp r1, #8 + add r2, r2, #0xc + blt _020D5C4C + bx lr + .align 2, 0 +_020D5C6C: .word _021E3540 + arm_func_end SND_AlarmInit + + arm_func_start SNDi_IncAlarmId +SNDi_IncAlarmId: ; 0x020D5C70 + ldr r2, _020D5C8C ; =_021E3540 + mov r1, #0xc + mla r1, r0, r1, r2 + ldrb r0, [r1, #8] + add r0, r0, #1 + strb r0, [r1, #8] + bx lr + .align 2, 0 +_020D5C8C: .word _021E3540 + arm_func_end SNDi_IncAlarmId + + arm_func_start SNDi_SetAlarmHandler +SNDi_SetAlarmHandler: ; 0x020D5C90 + mov r3, #0xc + mul r3, r0, r3 + ldr r0, _020D5CBC ; =_021E3540 + str r1, [r0, r3] + add r1, r0, r3 + str r2, [r1, #4] + ldrb r0, [r1, #8] + add r0, r0, #1 + strb r0, [r1, #8] + and r0, r0, #0xff + bx lr + .align 2, 0 +_020D5CBC: .word _021E3540 + arm_func_end SNDi_SetAlarmHandler + + arm_func_start SNDi_CallAlarmHandler +SNDi_CallAlarmHandler: ; 0x020D5CC0 + stmdb sp!, {r3, lr} + ldr r3, _020D5D00 ; =_021E3540 + and r2, r0, #0xff + mov r1, #0xc + mla r3, r2, r1, r3 + mov r1, r0, asr #8 + ldrb r0, [r3, #8] + and r1, r1, #0xff + cmp r1, r0 + ldmneia sp!, {r3, pc} + ldr r1, [r3] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r3, #4] + blx r1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020D5D00: .word _021E3540 + arm_func_end SNDi_CallAlarmHandler + + arm_func_start SND_GetPlayerStatus +SND_GetPlayerStatus: ; 0x020D5D04 + stmdb sp!, {r3, lr} + ldr r0, _020D5D2C ; =_021E35A0 + mov r1, #4 + ldr r0, [r0] + add r0, r0, #4 + bl DC_InvalidateRange + ldr r0, _020D5D2C ; =_021E35A0 + ldr r0, [r0] + ldr r0, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D5D2C: .word _021E35A0 + arm_func_end SND_GetPlayerStatus + + arm_func_start SND_GetChannelStatus +SND_GetChannelStatus: ; 0x020D5D30 + stmdb sp!, {r3, lr} + ldr r0, _020D5D58 ; =_021E35A0 + mov r1, #2 + ldr r0, [r0] + add r0, r0, #8 + bl DC_InvalidateRange + ldr r0, _020D5D58 ; =_021E35A0 + ldr r0, [r0] + ldrh r0, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D5D58: .word _021E35A0 + arm_func_end SND_GetChannelStatus + + arm_func_start SND_GetPlayerLocalVariable +SND_GetPlayerLocalVariable: ; 0x020D5D5C + stmdb sp!, {r3, r4, r5, lr} + mov r2, #0x24 + mul r4, r0, r2 + ldr r0, _020D5DA0 ; =_021E35A0 + mov r5, r1 + ldr r0, [r0] + mov r1, #2 + add r0, r0, #0x20 + add r0, r0, r4 + add r0, r0, r5, lsl #1 + bl DC_InvalidateRange + ldr r0, _020D5DA0 ; =_021E35A0 + ldr r0, [r0] + add r0, r0, r4 + add r0, r0, r5, lsl #1 + ldrsh r0, [r0, #0x20] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D5DA0: .word _021E35A0 + arm_func_end SND_GetPlayerLocalVariable + + arm_func_start SND_ReadChannelInfo +SND_ReadChannelInfo: ; 0x020D5DA4 + stmdb sp!, {r3, lr} + cmp r1, #0 + blt _020D5DB8 + cmp r1, #0xf + ble _020D5DC0 +_020D5DB8: + mov r0, #0 + ldmia sp!, {r3, pc} +_020D5DC0: + add r3, r0, #0x1000 + ldr r3, [r3, #0x1c4] + mov lr, #1 + ldr ip, [r2] + tst r3, lr, lsl r1 + moveq lr, #0 + mov r3, lr, lsl #0x1f + bic ip, ip, #2 + orr ip, ip, r3, lsr #30 + mov r3, ip, lsl #0x1e + str ip, [r2] + movs r3, r3, asr #0x1f + beq _020D5E94 + add r0, r0, r1, lsl #2 + add r0, r0, #0x1000 + ldr r0, [r0, #0x180] + ldr r3, [r2] + tst r0, #0x80000000 + movne lr, #1 + moveq lr, #0 + bic ip, r3, #1 + and r3, lr, #1 + orr r3, ip, r3 + str r3, [r2] + and r1, r0, #0x7f + strh r1, [r2, #4] + ldrh r1, [r2, #4] + and r3, r0, #0x300 + mov r3, r3, lsr #8 + mov r1, r1, lsl #4 + strh r1, [r2, #4] + cmp r3, #3 + addls pc, pc, r3, lsl #2 + b _020D5E84 +_020D5E48: ; jump table + b _020D5E84 ; case 0 + b _020D5E58 ; case 1 + b _020D5E68 ; case 2 + b _020D5E78 ; case 3 +_020D5E58: + ldrh r1, [r2, #4] + mov r1, r1, asr #1 + strh r1, [r2, #4] + b _020D5E84 +_020D5E68: + ldrh r1, [r2, #4] + mov r1, r1, asr #2 + strh r1, [r2, #4] + b _020D5E84 +_020D5E78: + ldrh r1, [r2, #4] + mov r1, r1, asr #4 + strh r1, [r2, #4] +_020D5E84: + and r0, r0, #0x7f0000 + mov r0, r0, lsr #0x10 + strb r0, [r2, #6] + b _020D5F2C +_020D5E94: + mov r3, #0x54 + mla r0, r1, r3, r0 + ldrb r1, [r0, #3] + bic r3, ip, #1 + mov r1, r1, lsl #0x1f + mov r1, r1, lsr #0x1f + and r1, r1, #1 + orr r1, r3, r1 + str r1, [r2] + ldrb r1, [r0, #2] + str r1, [r2, #8] + ldrh r3, [r0, #0x24] + and r1, r3, #0xff + strh r1, [r2, #4] + ldrh r1, [r2, #4] + mov r3, r3, asr #8 + cmp r3, #3 + mov r1, r1, lsl #4 + strh r1, [r2, #4] + addls pc, pc, r3, lsl #2 + b _020D5F24 +_020D5EE8: ; jump table + b _020D5F24 ; case 0 + b _020D5EF8 ; case 1 + b _020D5F08 ; case 2 + b _020D5F18 ; case 3 +_020D5EF8: + ldrh r1, [r2, #4] + mov r1, r1, asr #1 + strh r1, [r2, #4] + b _020D5F24 +_020D5F08: + ldrh r1, [r2, #4] + mov r1, r1, asr #2 + strh r1, [r2, #4] + b _020D5F24 +_020D5F18: + ldrh r1, [r2, #4] + mov r1, r1, asr #4 + strh r1, [r2, #4] +_020D5F24: + ldrb r0, [r0, #0x23] + strb r0, [r2, #6] +_020D5F2C: + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end SND_ReadChannelInfo + + arm_func_start SND_ReadTrackInfo +SND_ReadTrackInfo: ; 0x020D5F34 + stmdb sp!, {r4, lr} + cmp r1, #0 + blt _020D5F48 + cmp r1, #0xf + ble _020D5F50 +_020D5F48: + mov r0, #0 + ldmia sp!, {r4, pc} +_020D5F50: + cmp r2, #0 + blt _020D5F60 + cmp r2, #0xf + ble _020D5F68 +_020D5F60: + mov r0, #0 + ldmia sp!, {r4, pc} +_020D5F68: + mov ip, #0x24 + mla ip, r1, ip, r0 + add r1, ip, r2 + ldrb r2, [r1, #0x548] + cmp r2, #0xff + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r1, r0, #0x780 + add ip, r1, r2, lsl #6 + ldrh r2, [ip, #2] + add r1, r0, #0x1000 + strh r2, [r3] + ldrb r2, [ip, #4] + strb r2, [r3, #2] + ldrb r2, [ip, #5] + strb r2, [r3, #3] + ldrsb r2, [ip, #6] + strb r2, [r3, #4] + ldrb r2, [ip, #7] + strb r2, [r3, #5] + ldrsb r2, [ip, #8] + add r2, r2, #0x40 + strb r2, [r3, #6] + ldrsb r2, [ip, #0x13] + strb r2, [r3, #7] + ldr r2, [ip, #0x3c] + ldr r1, [r1, #0x1c0] + cmp r2, #0 + moveq r4, #0 + subne r1, r2, r1 + addne r4, r0, r1 + mov r1, #0 + strb r1, [r3, #9] + cmp r4, #0 + beq _020D6038 + add r1, r0, #0x1000 + mov ip, #0 +_020D5FFC: + ldrb r2, [r3, #9] + ldrb lr, [r4] + add r2, r3, r2 + strb lr, [r2, #0xa] + ldrb r2, [r3, #9] + add r2, r2, #1 + strb r2, [r3, #9] + ldr r2, [r4, #0x50] + ldr lr, [r1, #0x1c0] + cmp r2, #0 + moveq r4, ip + subne r2, r2, lr + addne r4, r0, r2 + cmp r4, #0 + bne _020D5FFC +_020D6038: + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end SND_ReadTrackInfo + + arm_func_start SNDi_GetFinishedCommandTag +SNDi_GetFinishedCommandTag: ; 0x020D6040 + stmdb sp!, {r3, lr} + ldr r0, _020D6064 ; =_021E35A0 + mov r1, #4 + ldr r0, [r0] + bl DC_InvalidateRange + ldr r0, _020D6064 ; =_021E35A0 + ldr r0, [r0] + ldr r0, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020D6064: .word _021E35A0 + arm_func_end SNDi_GetFinishedCommandTag + + arm_func_start SNDi_InitSharedWork +SNDi_InitSharedWork: ; 0x020D6068 + stmdb sp!, {r4, lr} + mov ip, #0 + str ip, [r0, #4] + strh ip, [r0, #8] + strh ip, [r0, #0xa] + mov r4, r0 + str ip, [r0] + mvn r2, #0 + mov r3, ip +_020D608C: + mov lr, r3 + str r3, [r4, #0x40] +_020D6094: + add r1, r4, lr, lsl #1 + add lr, lr, #1 + strh r2, [r1, #0x20] + cmp lr, #0x10 + blt _020D6094 + add ip, ip, #1 + cmp ip, #0x10 + add r4, r4, #0x24 + blt _020D608C + mov r3, #0 + mvn r2, #0 +_020D60C0: + add r1, r0, r3, lsl #1 + add r1, r1, #0x200 + add r3, r3, #1 + strh r2, [r1, #0x60] + cmp r3, #0x10 + blt _020D60C0 + mov r1, #0x280 + bl DC_FlushRange + ldmia sp!, {r4, pc} + arm_func_end SNDi_InitSharedWork + + arm_func_start SND_CalcChannelVolume +SND_CalcChannelVolume: ; 0x020D60E4 + ldr r1, _020D614C ; =0xFFFFFD2D + cmp r0, r1 + movlt r0, r1 + blt _020D60FC + cmp r0, #0 + movgt r0, #0 +_020D60FC: + add r1, r0, #0xd3 + mvn r2, #0xef + cmp r0, r2 + ldr r3, _020D6150 ; =_0210DE50 + add r1, r1, #0x200 + ldrb r3, [r3, r1] + movlt r0, #3 + blt _020D613C + add r1, r2, #0x78 + cmp r0, r1 + movlt r0, #2 + blt _020D613C + add r1, r2, #0xb4 + cmp r0, r1 + movlt r0, #1 + movge r0, #0 +_020D613C: + orr r0, r3, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + .align 2, 0 +_020D614C: .word 0xFFFFFD2D +_020D6150: .word _0210DE50 + arm_func_end SND_CalcChannelVolume + + arm_func_start SND_AssignWaveArc +SND_AssignWaveArc: ; 0x020D6154 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl SNDi_LockMutex + add r3, r6, r5, lsl #3 + ldr r2, [r3, #0x18] + cmp r2, #0 + beq _020D61E4 + cmp r4, r2 + bne _020D6188 + bl SNDi_UnlockMutex + ldmia sp!, {r4, r5, r6, pc} +_020D6188: + add r1, r6, #0x18 + ldr r0, [r2, #0x18] + add ip, r1, r5, lsl #3 + cmp ip, r0 + bne _020D61B4 + ldr r0, [r3, #0x1c] + mov r1, #0x3c + str r0, [r2, #0x18] + ldr r0, [r3, #0x18] + bl DC_StoreRange + b _020D61E4 +_020D61B4: + cmp r0, #0 + beq _020D61D0 +_020D61BC: + ldr r1, [r0, #4] + cmp ip, r1 + movne r0, r1 + cmpne r1, #0 + bne _020D61BC +_020D61D0: + add r1, r6, r5, lsl #3 + ldr r2, [r1, #0x1c] + mov r1, #8 + str r2, [r0, #4] + bl DC_StoreRange +_020D61E4: + add r0, r6, #0x18 + ldr r1, [r4, #0x18] + add r0, r0, r5, lsl #3 + str r0, [r4, #0x18] + add r0, r6, r5, lsl #3 + str r1, [r0, #0x1c] + str r4, [r0, #0x18] + bl SNDi_UnlockMutex + mov r0, r6 + mov r1, #0x3c + bl DC_StoreRange + mov r0, r4 + mov r1, #0x3c + bl DC_StoreRange + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SND_AssignWaveArc + + arm_func_start SND_DestroyBank +SND_DestroyBank: ; 0x020D6220 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + bl SNDi_LockMutex + add r5, r7, #0x18 + mov r6, #0 + mov r8, #8 + mov r4, #0x3c +_020D623C: + add r1, r7, r6, lsl #3 + ldr r0, [r1, #0x18] + cmp r0, #0 + beq _020D62A0 + ldr r3, [r0, #0x18] + cmp r5, r3 + bne _020D626C + ldr r2, [r1, #0x1c] + mov r1, r4 + str r2, [r0, #0x18] + bl DC_StoreRange + b _020D62A0 +_020D626C: + cmp r3, #0 + beq _020D6288 +_020D6274: + ldr r0, [r3, #4] + cmp r5, r0 + movne r3, r0 + cmpne r0, #0 + bne _020D6274 +_020D6288: + add r0, r7, r6, lsl #3 + ldr r2, [r0, #0x1c] + mov r0, r3 + mov r1, r8 + str r2, [r3, #4] + bl DC_StoreRange +_020D62A0: + add r6, r6, #1 + cmp r6, #4 + add r5, r5, #8 + blt _020D623C + bl SNDi_UnlockMutex + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end SND_DestroyBank + + arm_func_start SND_DestroyWaveArc +SND_DestroyWaveArc: ; 0x020D62B8 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + bl SNDi_LockMutex + ldr r0, [r4, #0x18] + cmp r0, #0 + beq _020D62F8 + mov r5, #0 + mov r4, #8 +_020D62D8: + ldr r6, [r0, #4] + mov r1, r4 + str r5, [r0] + str r5, [r0, #4] + bl DC_StoreRange + mov r0, r6 + cmp r6, #0 + bne _020D62D8 +_020D62F8: + bl SNDi_UnlockMutex + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SND_DestroyWaveArc + + arm_func_start SND_GetFirstInstDataPos +SND_GetFirstInstDataPos: ; 0x020D6300 + sub sp, sp, #8 + mov r1, #0 + str r1, [r0] + str r1, [sp] + str r1, [sp, #4] + str r1, [r0, #4] + add sp, sp, #8 + bx lr + arm_func_end SND_GetFirstInstDataPos + + arm_func_start SND_GetNextInstData +SND_GetNextInstData: ; 0x020D6320 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [r2] + ldr r3, [r0, #0x38] + cmp r4, r3 + bhs _020D64C8 + mov ip, #0 +_020D6338: + add r3, r0, r4, lsl #2 + ldr r4, [r3, #0x3c] + and r3, r4, #0xff + strb r4, [r1] + cmp r3, #0x10 + mov r4, r4, lsr #8 + bgt _020D6380 + cmp r3, #0x10 + bge _020D63CC + cmp r3, #5 + addls pc, pc, r3, lsl #2 + b _020D64AC +_020D6368: ; jump table + b _020D64AC ; case 0 + b _020D638C ; case 1 + b _020D638C ; case 2 + b _020D638C ; case 3 + b _020D638C ; case 4 + b _020D638C ; case 5 +_020D6380: + cmp r3, #0x11 + beq _020D6440 + b _020D64AC +_020D638C: + add r5, r0, r4 + ldrh r4, [r0, r4] + ldrh r3, [r5, #2] + mov r0, #1 + strh r4, [r1, #2] + strh r3, [r1, #4] + ldrh r4, [r5, #4] + ldrh r3, [r5, #6] + strh r4, [r1, #6] + strh r3, [r1, #8] + ldrh r3, [r5, #8] + strh r3, [r1, #0xa] + ldr r1, [r2] + add r1, r1, #1 + str r1, [r2] + ldmia sp!, {r3, r4, r5, pc} +_020D63CC: + add r5, r0, r4 + b _020D6420 +_020D63D4: + mov r0, #0xc + mla ip, lr, r0, r5 + ldrh r4, [ip, #2] + ldrh r3, [ip, #4] + mov r0, #1 + strh r4, [r1] + strh r3, [r1, #2] + ldrh r4, [ip, #6] + ldrh r3, [ip, #8] + strh r4, [r1, #4] + strh r3, [r1, #6] + ldrh r4, [ip, #0xa] + ldrh r3, [ip, #0xc] + strh r4, [r1, #8] + strh r3, [r1, #0xa] + ldr r1, [r2, #4] + add r1, r1, #1 + str r1, [r2, #4] + ldmia sp!, {r3, r4, r5, pc} +_020D6420: + ldrb r4, [r5, #1] + ldrb r3, [r5] + ldr lr, [r2, #4] + sub r3, r4, r3 + add r3, r3, #1 + cmp lr, r3 + blo _020D63D4 + b _020D64AC +_020D6440: + add r4, r0, r4 + b _020D64A0 +_020D6448: + ldrb lr, [r4, r3] + cmp lr, #0 + beq _020D64AC + mov r0, #0xc + mla lr, r3, r0, r4 + ldrh ip, [lr, #8] + ldrh r3, [lr, #0xa] + mov r0, #1 + strh ip, [r1] + strh r3, [r1, #2] + ldrh ip, [lr, #0xc] + ldrh r3, [lr, #0xe] + strh ip, [r1, #4] + strh r3, [r1, #6] + ldrh ip, [lr, #0x10] + ldrh r3, [lr, #0x12] + strh ip, [r1, #8] + strh r3, [r1, #0xa] + ldr r1, [r2, #4] + add r1, r1, #1 + str r1, [r2, #4] + ldmia sp!, {r3, r4, r5, pc} +_020D64A0: + ldr r3, [r2, #4] + cmp r3, #8 + blo _020D6448 +_020D64AC: + ldr r3, [r2] + add r3, r3, #1 + stmia r2, {r3, ip} + ldr r4, [r2] + ldr r3, [r0, #0x38] + cmp r4, r3 + blo _020D6338 +_020D64C8: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SND_GetNextInstData + + arm_func_start SND_GetWaveDataCount +SND_GetWaveDataCount: ; 0x020D64D0 + ldr r0, [r0, #0x38] + bx lr + arm_func_end SND_GetWaveDataCount + + arm_func_start SND_SetWaveDataAddress +SND_SetWaveDataAddress: ; 0x020D64D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl SNDi_LockMutex + add r0, r6, #0x3c + add r2, r6, r5, lsl #2 + add r0, r0, r5, lsl #2 + mov r1, #4 + str r4, [r2, #0x3c] + bl DC_StoreRange + bl SNDi_UnlockMutex + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SND_SetWaveDataAddress + + arm_func_start SND_GetWaveDataAddress +SND_GetWaveDataAddress: ; 0x020D650C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl SNDi_LockMutex + add r0, r5, r4, lsl #2 + ldr r4, [r0, #0x3c] + cmp r4, #0 + beq _020D6538 + cmp r4, #0x2000000 + addlo r4, r5, r4 + b _020D653C +_020D6538: + mov r4, #0 +_020D653C: + bl SNDi_UnlockMutex + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SND_GetWaveDataAddress + + arm_func_start PXI_Init +PXI_Init: ; 0x020D6548 + ldr ip, _020D6550 ; =PXI_InitFifo + bx ip + .align 2, 0 +_020D6550: .word PXI_InitFifo + arm_func_end PXI_Init + + arm_func_start PXI_InitFifo +PXI_InitFifo: ; 0x020D6554 + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + ldr r1, _020D6638 ; =_021E35A4 + mov r4, r0 + ldrh r0, [r1] + cmp r0, #0 + bne _020D662C + mov r2, #1 + strh r2, [r1] + mov r2, #0 + ldr r0, _020D663C ; =0x027FFC00 + mov r1, r2 + str r2, [r0, #0x388] + ldr r0, _020D6640 ; =_021E35A8 +_020D658C: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #0x20 + blt _020D658C + ldr r2, _020D6644 ; =0x0000C408 + ldr r1, _020D6648 ; =0x04000184 + mov r0, #0x40000 + strh r2, [r1] + bl OS_ResetRequestIrqMask + ldr r1, _020D664C ; =PXIi_HandlerRecvFifoNotEmpty + mov r0, #0x40000 + bl OS_SetIrqFunction + mov r0, #0x40000 + bl OS_EnableIrqMask + mov r5, #0 + ldr r3, _020D6650 ; =0x04000180 + mov r1, r5 + mov r2, #0x3e8 +_020D65D4: + ldrh r0, [r3] + ands lr, r0, #0xf + mov r0, lr, lsl #8 + strh r0, [r3] + bne _020D65F0 + cmp r5, #4 + bgt _020D662C +_020D65F0: + ldrh r0, [r3] + mov ip, r2 + and r0, r0, #0xf + cmp r0, lr + bne _020D6624 +_020D6604: + cmp ip, #0 + movle r5, r1 + ble _020D6624 + ldrh r0, [r3] + sub ip, ip, #1 + and r0, r0, #0xf + cmp r0, lr + beq _020D6604 +_020D6624: + add r5, r5, #1 + b _020D65D4 +_020D662C: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D6638: .word _021E35A4 +_020D663C: .word 0x027FFC00 +_020D6640: .word _021E35A8 +_020D6644: .word 0x0000C408 +_020D6648: .word 0x04000184 +_020D664C: .word PXIi_HandlerRecvFifoNotEmpty +_020D6650: .word 0x04000180 + arm_func_end PXI_InitFifo + + arm_func_start PXI_SetFifoRecvCallback +PXI_SetFifoRecvCallback: ; 0x020D6654 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, r1 + bl OS_DisableInterrupts + ldr r1, _020D6698 ; =_021E35A8 + ldr r3, _020D669C ; =0x027FFC00 + str r5, [r1, r4, lsl #2] + cmp r5, #0 + ldrne r2, [r3, #0x388] + mov r1, #1 + orrne r1, r2, r1, lsl r4 + mvneq r1, r1, lsl r4 + ldreq r2, [r3, #0x388] + andeq r1, r2, r1 + str r1, [r3, #0x388] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D6698: .word _021E35A8 +_020D669C: .word 0x027FFC00 + arm_func_end PXI_SetFifoRecvCallback + + arm_func_start PXI_IsCallbackReady +PXI_IsCallbackReady: ; 0x020D66A0 + ldr r2, _020D66C0 ; =0x027FFC00 + mov r3, #1 + add r1, r2, r1, lsl #2 + ldr r1, [r1, #0x388] + tst r1, r3, lsl r0 + moveq r3, #0 + mov r0, r3 + bx lr + .align 2, 0 +_020D66C0: .word 0x027FFC00 + arm_func_end PXI_IsCallbackReady + + arm_func_start PXI_SendWordByFifo +PXI_SendWordByFifo: ; 0x020D66C4 + stmdb sp!, {r3, lr} + ldr ip, [sp] + ldr r3, _020D6748 ; =0x04000184 + bic ip, ip, #0x1f + and r0, r0, #0x1f + orr ip, ip, r0 + ldrh r0, [r3] + bic ip, ip, #0x20 + mov r2, r2, lsl #0x1f + orr r2, ip, r2, lsr #26 + and r2, r2, #0x3f + orr r1, r2, r1, lsl #6 + str r1, [sp] + tst r0, #0x4000 + beq _020D6714 + ldrh r1, [r3] + mvn r0, #0 + orr r1, r1, #0xc000 + strh r1, [r3] + ldmia sp!, {r3, pc} +_020D6714: + bl OS_DisableInterrupts + ldr r2, _020D6748 ; =0x04000184 + ldrh r1, [r2] + tst r1, #2 + beq _020D6734 + bl OS_RestoreInterrupts + mvn r0, #1 + ldmia sp!, {r3, pc} +_020D6734: + ldr r1, [sp] + str r1, [r2, #4] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020D6748: .word 0x04000184 + arm_func_end PXI_SendWordByFifo + + arm_func_start PXIi_HandlerRecvFifoNotEmpty +PXIi_HandlerRecvFifoNotEmpty: ; 0x020D674C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mvn r8, #3 + ldr r6, [sp] + ldr sb, _020D685C ; =0x04000184 + ldr r4, _020D6860 ; =_021E35A8 + add sl, r8, #1 + mov r7, #0x4100000 + mov r5, #0 +_020D6770: + ldrh r0, [sb] + tst r0, #0x4000 + beq _020D6790 + ldrh r0, [sb] + add r1, r8, #1 + orr r0, r0, #0xc000 + strh r0, [sb] + b _020D67BC +_020D6790: + bl OS_DisableInterrupts + ldrh r1, [sb] + tst r1, #0x100 + beq _020D67AC + bl OS_RestoreInterrupts + mov r1, r8 + b _020D67BC +_020D67AC: + ldr r6, [r7] + str r6, [sp] + bl OS_RestoreInterrupts + mov r1, r5 +_020D67BC: + cmp r1, r8 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + cmp r1, sl + beq _020D6770 + mov r0, r6, lsl #0x1b + movs r0, r0, lsr #0x1b + beq _020D6770 + ldr r3, [r4, r0, lsl #2] + cmp r3, #0 + beq _020D67FC + mov r2, r6, lsl #0x1a + mov r1, r6, lsr #6 + mov r2, r2, lsr #0x1f + blx r3 + b _020D6770 +_020D67FC: + mov r0, r6, lsl #0x1a + movs r0, r0, lsr #0x1f + bne _020D6770 + ldrh r0, [sb] + orr r6, r6, #0x20 + str r6, [sp] + tst r0, #0x4000 + beq _020D682C + ldrh r0, [sb] + orr r0, r0, #0xc000 + strh r0, [sb] + b _020D6770 +_020D682C: + bl OS_DisableInterrupts + ldrh r1, [sb] + tst r1, #2 + beq _020D6844 + bl OS_RestoreInterrupts + b _020D6770 +_020D6844: + mov r1, r6 + str r1, [sb, #4] + bl OS_RestoreInterrupts + b _020D6770 +_020D6854: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020D685C: .word 0x04000184 +_020D6860: .word _021E35A8 + arm_func_end PXIi_HandlerRecvFifoNotEmpty + + arm_func_start FSi_ReleaseCommand +FSi_ReleaseCommand: ; 0x020D6864 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r1 + bl OS_DisableInterrupts + ldr r1, [r5] + mov r6, r0 + ldr r0, [r5, #4] + cmp r1, #0 + strne r0, [r1, #4] + cmp r0, #0 + strne r1, [r0] + mov r0, #0 + str r0, [r5] + str r0, [r5, #4] + ldr r1, [r5, #0xc] + add r0, r5, #0x18 + bic r1, r1, #0x4f + str r1, [r5, #0xc] + str r4, [r5, #0x14] + bl OS_WakeupThread + mov r0, r6 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, pc} + arm_func_end FSi_ReleaseCommand + + arm_func_start FSi_TranslateCommand +FSi_TranslateCommand: ; 0x020D68C0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldr r0, [r8, #0xc] + ldr r5, [r8, #8] + mov r7, r1 + mov r1, #1 + tst r0, #4 + mov r6, r1, lsl r7 + moveq r1, #0 + ldr r0, [r5, #0x1c] + cmp r1, #0 + orrne r0, r0, #0x200 + orreq r0, r0, #0x100 + str r0, [r5, #0x1c] + ldr r0, [r5, #0x58] + tst r0, r6 + beq _020D6968 + ldr r2, [r5, #0x54] + mov r0, r8 + mov r1, r7 + blx r2 + mov r4, r0 + cmp r4, #8 + addls pc, pc, r4, lsl #2 + b _020D696C +_020D6924: ; jump table + b _020D6948 ; case 0 + b _020D6948 ; case 1 + b _020D696C ; case 2 + b _020D696C ; case 3 + b _020D6948 ; case 4 + b _020D696C ; case 5 + b _020D696C ; case 6 + b _020D696C ; case 7 + b _020D6950 ; case 8 +_020D6948: + str r4, [r8, #0x14] + b _020D696C +_020D6950: + ldr r1, [r5, #0x58] + mvn r0, r6 + and r0, r1, r0 + str r0, [r5, #0x58] + mov r4, #7 + b _020D696C +_020D6968: + mov r4, #7 +_020D696C: + cmp r4, #7 + bne _020D6988 + ldr r1, _020D6A4C ; =_0210E124 + mov r0, r8 + ldr r1, [r1, r7, lsl #2] + blx r1 + mov r4, r0 +_020D6988: + cmp r4, #6 + bne _020D6A00 + ldr r0, [r8, #0xc] + tst r0, #4 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D6A44 + bl OS_DisableInterrupts + ldr r1, [r5, #0x1c] + mov r7, r0 + tst r1, #0x200 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D69F0 + mov r4, #0 + mov r6, #1 +_020D69D0: + add r0, r5, #0xc + bl OS_SleepThread + ldr r0, [r5, #0x1c] + tst r0, #0x200 + movne r0, r6 + moveq r0, r4 + cmp r0, #0 + bne _020D69D0 +_020D69F0: + mov r0, r7 + ldr r4, [r8, #0x14] + bl OS_RestoreInterrupts + b _020D6A44 +_020D6A00: + ldr r0, [r8, #0xc] + tst r0, #4 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _020D6A34 + ldr r1, [r5, #0x1c] + mov r0, r8 + bic r2, r1, #0x100 + mov r1, r4 + str r2, [r5, #0x1c] + bl FSi_ReleaseCommand + b _020D6A44 +_020D6A34: + ldr r0, [r5, #0x1c] + bic r0, r0, #0x200 + str r0, [r5, #0x1c] + str r4, [r8, #0x14] +_020D6A44: + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020D6A4C: .word _0210E124 + arm_func_end FSi_TranslateCommand + + arm_func_start FSi_StrNICmp +FSi_StrNICmp: ; 0x020D6A50 + stmdb sp!, {r3, lr} + cmp r2, #0 + mov lr, #0 + bls _020D6A98 +_020D6A60: + ldrb ip, [r0, lr] + ldrb r3, [r1, lr] + sub ip, ip, #0x41 + cmp ip, #0x19 + sub r3, r3, #0x41 + addls ip, ip, #0x20 + cmp r3, #0x19 + addls r3, r3, #0x20 + cmp ip, r3 + subne r0, ip, r3 + ldmneia sp!, {r3, pc} + add lr, lr, #1 + cmp lr, r2 + blo _020D6A60 +_020D6A98: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end FSi_StrNICmp + + arm_func_start FSi_ReadTable +FSi_ReadTable: ; 0x020D6AA0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r0 + ldr r4, [r7] + mov r6, r2 + ldr r2, [r4, #0x1c] + mov r0, r4 + orr r2, r2, #0x200 + str r2, [r4, #0x1c] + ldr r2, [r7, #4] + ldr r5, [r4, #0x50] + mov r3, r6 + blx r5 + cmp r0, #0 + cmpne r0, #1 + beq _020D6AE8 + cmp r0, #6 + beq _020D6AF8 + b _020D6B50 +_020D6AE8: + ldr r1, [r4, #0x1c] + bic r1, r1, #0x200 + str r1, [r4, #0x1c] + b _020D6B50 +_020D6AF8: + bl OS_DisableInterrupts + ldr r1, [r4, #0x1c] + mov r5, r0 + tst r1, #0x200 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D6B40 + mov r8, #0 + mov sb, #1 +_020D6B20: + add r0, r4, #0xc + bl OS_SleepThread + ldr r0, [r4, #0x1c] + tst r0, #0x200 + movne r0, sb + moveq r0, r8 + cmp r0, #0 + bne _020D6B20 +_020D6B40: + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #0x24] + ldr r0, [r0, #0x14] +_020D6B50: + ldr r1, [r7, #4] + add r1, r1, r6 + str r1, [r7, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end FSi_ReadTable + + arm_func_start FSi_SeekDirDirect +FSi_SeekDirDirect: ; 0x020D6B60 + ldr r3, [r0, #0xc] + mov r2, #0 + orr r3, r3, #4 + str r3, [r0, #0xc] + ldr r3, [r0, #8] + ldr ip, _020D6B90 ; =FSi_TranslateCommand + str r3, [r0, #0x30] + str r2, [r0, #0x38] + strh r2, [r0, #0x36] + strh r1, [r0, #0x34] + mov r1, #2 + bx ip + .align 2, 0 +_020D6B90: .word FSi_TranslateCommand + arm_func_end FSi_SeekDirDirect + + arm_func_start FSi_ReadFileCommand +FSi_ReadFileCommand: ; 0x020D6B94 + stmdb sp!, {r3, lr} + ldr r2, [r0, #0x2c] + ldr r3, [r0, #0x38] + ldr lr, [r0, #8] + ldr r1, [r0, #0x30] + add ip, r2, r3 + str ip, [r0, #0x2c] + ldr ip, [lr, #0x48] + mov r0, lr + blx ip + ldmia sp!, {r3, pc} + arm_func_end FSi_ReadFileCommand + + arm_func_start FSi_WriteFileCommand +FSi_WriteFileCommand: ; 0x020D6BC0 + stmdb sp!, {r3, lr} + ldr r2, [r0, #0x2c] + ldr r3, [r0, #0x38] + ldr lr, [r0, #8] + ldr r1, [r0, #0x30] + add ip, r2, r3 + str ip, [r0, #0x2c] + ldr ip, [lr, #0x4c] + mov r0, lr + blx ip + ldmia sp!, {r3, pc} + arm_func_end FSi_WriteFileCommand + + arm_func_start FSi_SeekDirCommand +FSi_SeekDirCommand: ; 0x020D6BEC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x10 + mov r6, r0 + ldr r4, [r6, #8] + add r5, r6, #0x30 + str r4, [sp] + ldrh r1, [r5, #4] + ldr r2, [r4, #0x34] + add r0, sp, #0 + add r3, r2, r1, lsl #3 + add r1, sp, #8 + mov r2, #8 + str r3, [sp, #4] + bl FSi_ReadTable + movs r3, r0 + bne _020D6C74 + add ip, r6, #0x20 + ldmia r5, {r0, r1, r2} + stmia ip, {r0, r1, r2} + ldrh r0, [r5, #6] + cmp r0, #0 + ldreq r0, [r5, #8] + cmpeq r0, #0 + bne _020D6C64 + ldrh r0, [sp, #0xc] + strh r0, [r6, #0x26] + ldr r1, [r4, #0x34] + ldr r0, [sp, #8] + add r0, r1, r0 + str r0, [r6, #0x28] +_020D6C64: + ldrh r1, [sp, #0xe] + ldr r0, _020D6C80 ; =0x00000FFF + and r0, r1, r0 + str r0, [r6, #0x2c] +_020D6C74: + mov r0, r3 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D6C80: .word 0x00000FFF + arm_func_end FSi_SeekDirCommand + + arm_func_start FSi_ReadDirCommand +FSi_ReadDirCommand: ; 0x020D6C84 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + mov r5, r0 + ldr r4, [r5, #0x30] + ldr r1, [r5, #8] + add r0, sp, #4 + str r1, [sp, #4] + ldr r3, [r5, #0x28] + add r1, sp, #0 + mov r2, #1 + str r3, [sp, #8] + bl FSi_ReadTable + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, pc} + ldrb r1, [sp] + and r2, r1, #0x7f + mov r1, r1, asr #7 + str r2, [r4, #0x10] + and r1, r1, #1 + str r1, [r4, #0xc] + ldr r2, [r4, #0x10] + cmp r2, #0 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, pc} + ldr r1, [r5, #0x34] + cmp r1, #0 + bne _020D6D24 + add r0, sp, #4 + add r1, r4, #0x14 + bl FSi_ReadTable + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, pc} + ldr r1, [r4, #0x10] + mov r2, #0 + add r1, r4, r1 + strb r2, [r1, #0x14] + b _020D6D30 +_020D6D24: + ldr r1, [sp, #8] + add r1, r1, r2 + str r1, [sp, #8] +_020D6D30: + ldr r1, [r4, #0xc] + cmp r1, #0 + beq _020D6D80 + add r0, sp, #4 + add r1, sp, #2 + mov r2, #2 + bl FSi_ReadTable + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, pc} + ldr r2, [r5, #8] + ldr r1, _020D6DAC ; =0x00000FFF + str r2, [r4] + ldrh r3, [sp, #2] + mov r2, #0 + and r1, r3, r1 + strh r1, [r4, #4] + strh r2, [r4, #6] + str r2, [r4, #8] + b _020D6D9C +_020D6D80: + ldr r1, [r5, #8] + str r1, [r4] + ldrh r1, [r5, #0x26] + str r1, [r4, #4] + ldrh r1, [r5, #0x26] + add r1, r1, #1 + strh r1, [r5, #0x26] +_020D6D9C: + ldr r1, [sp, #8] + str r1, [r5, #0x28] + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020D6DAC: .word 0x00000FFF + arm_func_end FSi_ReadDirCommand + + arm_func_start FSi_FindPathCommand +FSi_FindPathCommand: ; 0x020D6DB0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x94 + mov sb, r0 + ldr r5, [sb, #0x3c] + mov r1, #2 + ldr r6, [sb, #0x40] + bl FSi_TranslateCommand + ldrb r3, [r5] + cmp r3, #0 + beq _020D6F68 +_020D6DD8: + mov r8, #0 + mov r0, #1 + mov r1, r8 + b _020D6DEC +_020D6DE8: + add r8, r8, #1 +_020D6DEC: + ldrb r7, [r5, r8] + mov r2, r1 + cmp r7, #0 + cmpne r7, #0x2f + cmpne r7, #0x5c + movne r2, r0 + cmp r2, #0 + bne _020D6DE8 + cmp r7, #0 + cmpeq r6, #0 + movne r7, #1 + cmp r8, #0 + addeq sp, sp, #0x94 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + cmp r3, #0x2e + bne _020D6E80 + cmp r8, #1 + addeq r5, r5, #1 + beq _020D6F4C + ldrb r0, [r5, #1] + cmp r8, #2 + moveq r1, #1 + movne r1, #0 + cmp r0, #0x2e + moveq r0, #1 + movne r0, #0 + tst r1, r0 + beq _020D6E80 + ldrh r0, [sb, #0x24] + cmp r0, #0 + beq _020D6E78 + ldr r1, [sb, #0x2c] + mov r0, sb + bl FSi_SeekDirDirect +_020D6E78: + add r5, r5, #2 + b _020D6F4C +_020D6E80: + cmp r8, #0x7f + addgt sp, sp, #0x94 + movgt r0, #1 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + add r1, sp, #0 + mov r0, #0 + str r1, [sb, #0x30] + str r0, [sb, #0x34] + add sl, sp, #0x14 + mov r4, #3 +_020D6EA8: + mov r0, sb + mov r1, r4 + bl FSi_TranslateCommand + cmp r0, #0 + addne sp, sp, #0x94 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, [sp, #0xc] + cmp r7, r0 + ldreq r0, [sp, #0x10] + cmpeq r8, r0 + bne _020D6EA8 + mov r0, r5 + mov r1, sl + mov r2, r8 + bl FSi_StrNICmp + cmp r0, #0 + bne _020D6EA8 + cmp r7, #0 + beq _020D6F1C + add r0, sp, #0 + add r3, sb, #0x30 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, sb + mov r1, #2 + add r5, r5, r8 + bl FSi_TranslateCommand + b _020D6F4C +_020D6F1C: + cmp r6, #0 + addne sp, sp, #0x94 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r3, [sb, #0x44] + ldr r2, [sp] + ldr r1, [sp, #4] + add sp, sp, #0x94 + str r2, [r3] + mov r0, #0 + str r1, [r3, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020D6F4C: + ldrb r0, [r5] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldrb r3, [r5, r0]! + cmp r3, #0 + bne _020D6DD8 +_020D6F68: + cmp r6, #0 + addeq sp, sp, #0x94 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r3, [sb, #0x44] + add r0, sb, #0x20 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #0 + add sp, sp, #0x94 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end FSi_FindPathCommand + + arm_func_start FSi_GetPathCommand +FSi_GetPathCommand: ; 0x020D6F94 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xe0 + mov sl, r0 + ldr r1, [sl, #8] + add r0, sp, #4 + str r1, [sp] + bl FS_InitFile + ldr r0, [sl, #8] + str r0, [sp, #0xc] + ldr r0, [sl, #0xc] + tst r0, #0x20 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + ldrneh sb, [sl, #0x24] + movne r6, #0x10000 + bne _020D7078 + ldrh r0, [sl, #0x38] + ldr r6, [sl, #0x20] + cmp r0, #0 + ldrneh sb, [sl, #0x3a] + bne _020D7078 + mov r7, #0 + mov r8, r7 + mov sb, #0x10000 + add r5, sp, #4 + mov r4, #3 + add fp, sp, #0x4c +_020D7004: + mov r0, r5 + mov r1, r7 + bl FSi_SeekDirDirect + mov r2, #1 + cmp r7, #0 + mov r0, r5 + mov r1, #3 + ldreq r8, [sp, #0x30] + str fp, [sp, #0x34] + str r2, [sp, #0x38] + bl FSi_TranslateCommand + cmp r0, #0 + bne _020D7064 +_020D7038: + ldr r0, [sp, #0x58] + cmp r0, #0 + ldreq r0, [sp, #0x50] + cmpeq r0, r6 + ldreqh sb, [sp, #0x28] + beq _020D7064 + mov r0, r5 + mov r1, r4 + bl FSi_TranslateCommand + cmp r0, #0 + beq _020D7038 +_020D7064: + cmp sb, #0x10000 + bne _020D7078 + add r7, r7, #1 + cmp r7, r8 + blo _020D7004 +_020D7078: + cmp sb, #0x10000 + bne _020D7094 + mov r0, #0 + strh r0, [sl, #0x38] + add sp, sp, #0xe0 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D7094: + ldrh r0, [sl, #0x38] + cmp r0, #0 + bne _020D7178 + ldr r0, [sp] + mov r1, #0 + ldr r0, [r0] + cmp r0, #0xff + addls r8, r1, #1 + bls _020D70C4 + cmp r0, #0xff00 + addls r8, r1, #2 + addhi r8, r1, #3 +_020D70C4: + cmp r6, #0x10000 + ldrne r0, [sp, #0x5c] + add r8, r8, #2 + addne r8, r8, r0 + mov r7, sb + cmp sb, #0 + beq _020D716C + add r0, sp, #4 + mov r1, sb + bl FSi_SeekDirDirect + add r5, sp, #4 + mov r4, #3 + add fp, sp, #0x4c +_020D70F8: + ldr r1, [sp, #0x30] + mov r0, r5 + bl FSi_SeekDirDirect + mov r1, #1 + str r1, [sp, #0x38] + mov r0, r5 + mov r1, #3 + str fp, [sp, #0x34] + bl FSi_TranslateCommand + cmp r0, #0 + bne _020D7160 +_020D7124: + ldr r0, [sp, #0x58] + cmp r0, #0 + beq _020D714C + ldrh r0, [sp, #0x50] + cmp r0, r7 + bne _020D714C + ldr r0, [sp, #0x5c] + add r0, r0, #1 + add r8, r8, r0 + b _020D7160 +_020D714C: + mov r0, r5 + mov r1, r4 + bl FSi_TranslateCommand + cmp r0, #0 + beq _020D7124 +_020D7160: + ldrh r7, [sp, #0x28] + cmp r7, #0 + bne _020D70F8 +_020D716C: + add r0, r8, #1 + strh r0, [sl, #0x38] + strh sb, [sl, #0x3a] +_020D7178: + ldr r5, [sl, #0x30] + cmp r5, #0 + addeq sp, sp, #0xe0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrh r4, [sl, #0x38] + ldr r0, [sl, #0x34] + cmp r0, r4 + addlo sp, sp, #0xe0 + movlo r0, #1 + ldmloia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp] + mov r7, #0 + ldr r0, [r0] + cmp r0, #0xff + movls r8, #1 + bls _020D71C8 + cmp r0, #0xff00 + movls r8, #2 + movhi r8, #3 +_020D71C8: + ldr r0, [sp] + mov r1, r5 + mov r2, r8 + bl MI_CpuCopy8 + add r1, r7, r8 + ldr r0, _020D733C ; =_02110C98 + add r1, r5, r1 + mov r2, #2 + bl MI_CpuCopy8 + add r0, sp, #4 + mov r1, sb + bl FSi_SeekDirDirect + cmp r6, #0x10000 + beq _020D7278 + add r3, sp, #0x4c + mov r2, #0 + add r0, sp, #4 + mov r1, #3 + str r3, [sp, #0x34] + str r2, [sp, #0x38] + bl FSi_TranslateCommand + cmp r0, #0 + bne _020D7254 + add r8, sp, #4 + mov r7, #3 +_020D722C: + ldr r0, [sp, #0x58] + cmp r0, #0 + ldreq r0, [sp, #0x50] + cmpeq r0, r6 + beq _020D7254 + mov r0, r8 + mov r1, r7 + bl FSi_TranslateCommand + cmp r0, #0 + beq _020D722C +_020D7254: + ldr r0, [sp, #0x5c] + add r1, r5, r4 + add r6, r0, #1 + add r0, sp, #0x60 + mov r2, r6 + sub r1, r1, r6 + bl MI_CpuCopy8 + sub r4, r4, r6 + b _020D7288 +_020D7278: + add r0, r5, r4 + mov r1, #0 + strb r1, [r0, #-1] + sub r4, r4, #1 +_020D7288: + cmp sb, #0 + beq _020D7330 + add sl, sp, #4 + mov r6, #3 + add r8, sp, #0x4c + mov r7, #0 + mov fp, #0x2f +_020D72A4: + ldr r1, [sp, #0x30] + mov r0, sl + bl FSi_SeekDirDirect + add r1, r5, r4 + str r8, [sp, #0x34] + str r7, [sp, #0x38] + strb fp, [r1, #-1] + mov r0, sl + mov r1, #3 + sub r4, r4, #1 + bl FSi_TranslateCommand + cmp r0, #0 + bne _020D7324 +_020D72D8: + ldr r0, [sp, #0x58] + cmp r0, #0 + beq _020D7310 + ldrh r0, [sp, #0x50] + cmp r0, sb + bne _020D7310 + ldr sb, [sp, #0x5c] + add r1, r5, r4 + add r0, sp, #0x60 + mov r2, sb + sub r1, r1, sb + bl MI_CpuCopy8 + sub r4, r4, sb + b _020D7324 +_020D7310: + mov r0, sl + mov r1, r6 + bl FSi_TranslateCommand + cmp r0, #0 + beq _020D72D8 +_020D7324: + ldrh sb, [sp, #0x28] + cmp sb, #0 + bne _020D72A4 +_020D7330: + mov r0, #0 + add sp, sp, #0xe0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D733C: .word _02110C98 + arm_func_end FSi_GetPathCommand + + arm_func_start FSi_OpenFileFastCommand +FSi_OpenFileFastCommand: ; 0x020D7340 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r5, r0 + ldr r1, [r5, #8] + ldr r4, [r5, #0x34] + ldr r0, [r1, #0x30] + mov r2, r4, lsl #3 + cmp r0, r4, lsl #3 + addls sp, sp, #0x10 + movls r0, #1 + ldmlsia sp!, {r3, r4, r5, pc} + str r1, [sp] + ldr r1, [r1, #0x2c] + add r0, sp, #0 + add r3, r1, r2 + add r1, sp, #8 + mov r2, #8 + str r3, [sp, #4] + bl FSi_ReadTable + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [sp, #8] + mov r0, r5 + str r1, [r5, #0x30] + ldr r2, [sp, #0xc] + mov r1, #7 + str r2, [r5, #0x34] + str r4, [r5, #0x38] + bl FSi_TranslateCommand + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end FSi_OpenFileFastCommand + + arm_func_start FSi_OpenFileDirectCommand +FSi_OpenFileDirectCommand: ; 0x020D73C0 + ldr r1, [r0, #0x30] + str r1, [r0, #0x24] + ldr r1, [r0, #0x30] + str r1, [r0, #0x2c] + ldr r1, [r0, #0x34] + str r1, [r0, #0x28] + ldr r1, [r0, #0x38] + str r1, [r0, #0x20] + mov r0, #0 + bx lr + arm_func_end FSi_OpenFileDirectCommand + + arm_func_start FSi_CloseFileCommand +FSi_CloseFileCommand: ; 0x020D73E8 + mov r0, #0 + bx lr + arm_func_end FSi_CloseFileCommand + + arm_func_start FSi_GetPackedName +FSi_GetPackedName: ; 0x020D73F0 + stmdb sp!, {r3, lr} + cmp r1, #3 + mov r3, #0 + bgt _020D7440 + mov ip, r3 + cmp r1, #0 + ble _020D7440 + mov lr, r3 +_020D7410: + ldrb r2, [r0, ip] + cmp r2, #0 + beq _020D7440 + sub r2, r2, #0x41 + cmp r2, #0x19 + addls r2, r2, #0x61 + addhi r2, r2, #0x41 + add ip, ip, #1 + orr r3, r3, r2, lsl lr + cmp ip, r1 + add lr, lr, #8 + blt _020D7410 +_020D7440: + mov r0, r3 + ldmia sp!, {r3, pc} + arm_func_end FSi_GetPackedName + + arm_func_start FSi_ReadMemCallback +FSi_ReadMemCallback: ; 0x020D7448 + stmdb sp!, {r3, lr} + ldr r0, [r0, #0x28] + add r0, r0, r2 + mov r2, r3 + bl MI_CpuCopy8 + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end FSi_ReadMemCallback + + arm_func_start FSi_WriteMemCallback +FSi_WriteMemCallback: ; 0x020D7464 + stmdb sp!, {r3, lr} + ldr ip, [r0, #0x28] + mov r0, r1 + add r1, ip, r2 + mov r2, r3 + bl MI_CpuCopy8 + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end FSi_WriteMemCallback + + arm_func_start FSi_ReadMemoryCore +FSi_ReadMemoryCore: ; 0x020D7484 + stmdb sp!, {r3, lr} + mov r0, r2 + mov r2, r3 + bl MI_CpuCopy8 + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end FSi_ReadMemoryCore + + arm_func_start FSi_NextCommand +FSi_NextCommand: ; 0x020D749C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x48 + mov r6, r0 + bl OS_DisableInterrupts + ldr r1, [r6, #0x1c] + mov r4, r0 + tst r1, #0x20 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D7530 + ldr r0, [r6, #0x1c] + bic r0, r0, #0x20 + str r0, [r6, #0x1c] + ldr r0, [r6, #0x24] + cmp r0, #0 + beq _020D7530 + mov r8, #0 + mov sb, #1 + mov r7, #3 +_020D74EC: + ldr r1, [r0, #0xc] + ldr r5, [r0, #4] + tst r1, #2 + movne r1, sb + moveq r1, r8 + cmp r1, #0 + beq _020D7524 + ldr r1, [r6, #0x24] + cmp r1, r0 + mov r1, r7 + streq r5, [r6, #0x24] + bl FSi_ReleaseCommand + cmp r5, #0 + ldreq r5, [r6, #0x24] +_020D7524: + mov r0, r5 + cmp r5, #0 + bne _020D74EC +_020D7530: + ldr r0, [r6, #0x1c] + tst r0, #0x40 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _020D7620 + ldr r0, [r6, #0x1c] + tst r0, #8 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _020D7620 + ldr r5, [r6, #0x24] + cmp r5, #0 + beq _020D7620 + ldr r0, [r6, #0x1c] + tst r0, #0x10 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + moveq r7, #1 + movne r7, #0 + cmp r7, #0 + ldrne r0, [r6, #0x1c] + orrne r0, r0, #0x10 + strne r0, [r6, #0x1c] + mov r0, r4 + bl OS_RestoreInterrupts + cmp r7, #0 + beq _020D75C4 + ldr r0, [r6, #0x58] + tst r0, #0x200 + beq _020D75C4 + ldr r2, [r6, #0x54] + mov r0, r5 + mov r1, #9 + blx r2 +_020D75C4: + bl OS_DisableInterrupts + ldr r1, [r5, #0xc] + mov r4, r0 + orr r0, r1, #0x40 + str r0, [r5, #0xc] + ldr r0, [r5, #0xc] + tst r0, #4 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D760C + add r0, r5, #0x18 + bl OS_WakeupThread + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #0x48 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020D760C: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #0x48 + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020D7620: + ldr r0, [r6, #0x1c] + tst r0, #0x10 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D766C + ldr r0, [r6, #0x1c] + bic r0, r0, #0x10 + str r0, [r6, #0x1c] + ldr r0, [r6, #0x58] + tst r0, #0x400 + beq _020D766C + add r0, sp, #0 + bl FS_InitFile + str r6, [sp, #8] + ldr r2, [r6, #0x54] + add r0, sp, #0 + mov r1, #0xa + blx r2 +_020D766C: + ldr r0, [r6, #0x1c] + tst r0, #0x40 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D769C + ldr r1, [r6, #0x1c] + add r0, r6, #0x14 + bic r1, r1, #0x40 + orr r1, r1, #8 + str r1, [r6, #0x1c] + bl OS_WakeupThread +_020D769C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end FSi_NextCommand + + arm_func_start FSi_ExecuteAsyncCommand +FSi_ExecuteAsyncCommand: ; 0x020D76B0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + movs r6, r0 + ldr r4, [r6, #8] + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r7, #0 + mov r8, #1 +_020D76C8: + bl OS_DisableInterrupts + ldr r1, [r6, #0xc] + mov r5, r0 + orr r0, r1, #0x40 + str r0, [r6, #0xc] + ldr r0, [r6, #0xc] + tst r0, #4 + movne r0, r8 + moveq r0, r7 + cmp r0, #0 + beq _020D7708 + add r0, r6, #0x18 + bl OS_WakeupThread + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D7708: + ldr r1, [r6, #0xc] + mov r0, r5 + orr r1, r1, #8 + str r1, [r6, #0xc] + bl OS_RestoreInterrupts + ldr r1, [r6, #0x10] + mov r0, r6 + bl FSi_TranslateCommand + cmp r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + bl FSi_NextCommand + movs r6, r0 + bne _020D76C8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end FSi_ExecuteAsyncCommand + + arm_func_start FSi_ExecuteSyncCommand +FSi_ExecuteSyncCommand: ; 0x020D7744 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x10] + bl FSi_TranslateCommand + mov r1, r0 + mov r0, r4 + bl FSi_ReleaseCommand + ldr r0, [r4, #8] + bl FSi_NextCommand + cmp r0, #0 + beq _020D7774 + bl FSi_ExecuteAsyncCommand +_020D7774: + ldr r0, [r4, #0x14] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, pc} + arm_func_end FSi_ExecuteSyncCommand + + arm_func_start FSi_SendCommand +FSi_SendCommand: ; 0x020D7788 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + ldr r4, [r6, #8] + mov r2, #1 + str r1, [r6, #0x10] + mov r0, #2 + str r0, [r6, #0x14] + ldr r0, [r6, #0xc] + mov r7, r2, lsl r1 + orr r0, r0, #1 + str r0, [r6, #0xc] + bl OS_DisableInterrupts + ldr r1, [r4, #0x1c] + mov r5, r0 + tst r1, #0x80 + beq _020D77E4 + mov r0, r6 + mov r1, #3 + bl FSi_ReleaseCommand + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D77E4: + tst r7, #0x1fc + ldrne r0, [r6, #0xc] + orrne r0, r0, #4 + strne r0, [r6, #0xc] + ldr r1, [r6] + ldr r2, [r6, #4] + cmp r1, #0 + strne r2, [r1, #4] + cmp r2, #0 + add r0, r4, #0x20 + strne r1, [r2] + ldr r1, [r0, #4] + cmp r1, #0 + beq _020D782C +_020D781C: + mov r0, r1 + ldr r1, [r1, #4] + cmp r1, #0 + bne _020D781C +_020D782C: + str r6, [r0, #4] + str r0, [r6] + mov r1, #0 + str r1, [r6, #4] + ldr r0, [r4, #0x1c] + tst r0, #8 + movne r1, #1 + cmp r1, #0 + bne _020D78DC + ldr r0, [r4, #0x1c] + tst r0, #0x10 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _020D78DC + ldr r1, [r4, #0x1c] + mov r0, r5 + orr r1, r1, #0x10 + str r1, [r4, #0x1c] + bl OS_RestoreInterrupts + ldr r0, [r4, #0x58] + tst r0, #0x200 + beq _020D7898 + ldr r2, [r4, #0x54] + mov r0, r6 + mov r1, #9 + blx r2 +_020D7898: + bl OS_DisableInterrupts + ldr r1, [r6, #0xc] + orr r1, r1, #0x40 + str r1, [r6, #0xc] + ldr r1, [r6, #0xc] + tst r1, #4 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + bne _020D78D4 + bl OS_RestoreInterrupts + mov r0, r6 + bl FSi_ExecuteAsyncCommand + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D78D4: + bl OS_RestoreInterrupts + b _020D7920 +_020D78DC: + ldr r0, [r6, #0xc] + tst r0, #4 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + bne _020D7904 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D7904: + add r0, r6, #0x18 + bl OS_SleepThread + ldr r0, [r6, #0xc] + tst r0, #0x40 + beq _020D7904 + mov r0, r5 + bl OS_RestoreInterrupts +_020D7920: + mov r0, r6 + bl FSi_ExecuteSyncCommand + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end FSi_SendCommand + + arm_func_start FS_InitArchive +FS_InitArchive: ; 0x020D792C + stmdb sp!, {r4, lr} + mov r1, #0 + mov r2, #0x5c + mov r4, r0 + bl MI_CpuFill8 + mov r0, #0 + str r0, [r4, #0x10] + str r0, [r4, #0xc] + str r0, [r4, #0x18] + str r0, [r4, #0x14] + ldmia sp!, {r4, pc} + arm_func_end FS_InitArchive + + arm_func_start FS_FindArchive +FS_FindArchive: ; 0x020D7958 + stmdb sp!, {r3, r4, r5, lr} + bl FSi_GetPackedName + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020D7994 ; =_021E3628 + ldr r5, [r1] + b _020D7978 +_020D7974: + ldr r5, [r5, #4] +_020D7978: + cmp r5, #0 + ldrne r1, [r5] + cmpne r1, r4 + bne _020D7974 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D7994: .word _021E3628 + arm_func_end FS_FindArchive + + arm_func_start FS_RegisterArchiveName +FS_RegisterArchiveName: ; 0x020D7998 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r1 + mov r5, r2 + mov r7, r0 + mov r8, #0 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, r6 + mov r1, r5 + bl FS_FindArchive + cmp r0, #0 + bne _020D7A38 + ldr r0, _020D7A48 ; =_021E3628 + ldr r1, [r0] + cmp r1, #0 + bne _020D79F4 + str r7, [r0] + str r7, [r0, #4] + mov r1, r8 + str r1, [r0, #0xc] + strh r1, [r0, #0xa] + strh r1, [r0, #8] + b _020D7A18 +_020D79F4: + ldr r0, [r1, #4] + cmp r0, #0 + beq _020D7A10 +_020D7A00: + mov r1, r0 + ldr r0, [r0, #4] + cmp r0, #0 + bne _020D7A00 +_020D7A10: + str r7, [r1, #4] + str r1, [r7, #8] +_020D7A18: + mov r0, r6 + mov r1, r5 + bl FSi_GetPackedName + str r0, [r7] + ldr r0, [r7, #0x1c] + mov r8, #1 + orr r0, r0, #1 + str r0, [r7, #0x1c] +_020D7A38: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020D7A48: .word _021E3628 + arm_func_end FS_RegisterArchiveName + + arm_func_start FS_ReleaseArchiveName +FS_ReleaseArchiveName: ; 0x020D7A4C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl OS_DisableInterrupts + ldr r2, [r4, #4] + mov r3, #0 + cmp r2, #0 + ldrne r1, [r4, #8] + strne r1, [r2, #8] + ldr r2, [r4, #8] + cmp r2, #0 + ldrne r1, [r4, #4] + strne r1, [r2, #4] + str r3, [r4] + str r3, [r4, #8] + str r3, [r4, #4] + ldr r2, [r4, #0x1c] + ldr r1, _020D7ACC ; =_021E3628 + bic r2, r2, #1 + str r2, [r4, #0x1c] + ldr r2, [r1, #4] + cmp r2, r4 + bne _020D7AC4 + ldr r2, [r1] + str r2, [r1, #4] + str r3, [r1, #0xc] + strh r3, [r1, #0xa] + strh r3, [r1, #8] +_020D7AC4: + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020D7ACC: .word _021E3628 + arm_func_end FS_ReleaseArchiveName + + arm_func_start FS_LoadArchive +FS_LoadArchive: ; 0x020D7AD0 + str r1, [r0, #0x28] + str r3, [r0, #0x30] + str r2, [r0, #0x3c] + ldr r3, [sp, #4] + str r2, [r0, #0x2c] + ldr ip, [sp, #8] + ldr r1, [sp] + str r3, [r0, #0x38] + str r1, [r0, #0x40] + str r1, [r0, #0x34] + cmp ip, #0 + ldreq ip, _020D7B38 ; =FSi_ReadMemCallback + ldr r1, [sp, #0xc] + str ip, [r0, #0x48] + cmp r1, #0 + ldreq r1, _020D7B3C ; =FSi_WriteMemCallback + str r1, [r0, #0x4c] + ldr r2, [r0, #0x48] + mov r1, #0 + str r2, [r0, #0x50] + str r1, [r0, #0x44] + ldr r1, [r0, #0x1c] + orr r1, r1, #2 + str r1, [r0, #0x1c] + mov r0, #1 + bx lr + .align 2, 0 +_020D7B38: .word FSi_ReadMemCallback +_020D7B3C: .word FSi_WriteMemCallback + arm_func_end FS_LoadArchive + + arm_func_start FS_UnloadArchive +FS_UnloadArchive: ; 0x020D7B40 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + bl OS_DisableInterrupts + ldr r1, [r6, #0x1c] + mov r4, r0 + tst r1, #2 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D7BF0 + mov r0, r6 + ldr r1, [r6, #0x1c] + bl FS_SuspendArchive + ldr r1, [r6, #0x1c] + mov r5, r0 + orr r0, r1, #0x80 + str r0, [r6, #0x1c] + ldr r0, [r6, #0x24] + cmp r0, #0 + beq _020D7BAC + mov r7, #3 +_020D7B94: + ldr r8, [r0, #4] + mov r1, r7 + bl FSi_ReleaseCommand + mov r0, r8 + cmp r8, #0 + bne _020D7B94 +_020D7BAC: + mov r0, #0 + str r0, [r6, #0x24] + cmp r5, #0 + beq _020D7BC4 + mov r0, r6 + bl FS_ResumeArchive +_020D7BC4: + mov r0, #0 + str r0, [r6, #0x28] + str r0, [r6, #0x2c] + str r0, [r6, #0x30] + str r0, [r6, #0x34] + str r0, [r6, #0x38] + str r0, [r6, #0x40] + str r0, [r6, #0x3c] + ldr r0, [r6, #0x1c] + bic r0, r0, #0xa2 + str r0, [r6, #0x1c] +_020D7BF0: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end FS_UnloadArchive + + arm_func_start FS_LoadArchiveTables +FS_LoadArchiveTables: ; 0x020D7C00 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x4c + mov r7, r0 + ldr r3, [r7, #0x30] + ldr r0, [r7, #0x38] + mov r6, r1 + add r0, r3, r0 + add r0, r0, #0x3f + bic r4, r0, #0x1f + cmp r4, r2 + bhi _020D7D14 + add r1, r6, #0x1f + add r0, sp, #4 + bic r5, r1, #0x1f + bl FS_InitFile + ldr r2, [r7, #0x2c] + mvn r0, #0 + str r0, [sp] + ldr r3, [r7, #0x30] + add r0, sp, #4 + mov r1, r7 + add r3, r2, r3 + bl FS_OpenFileDirect + cmp r0, #0 + beq _020D7C94 + ldr r2, [r7, #0x30] + add r0, sp, #4 + mov r1, r5 + bl FS_ReadFile + cmp r0, #0 + bge _020D7C8C + ldr r2, [r7, #0x30] + mov r0, r5 + mov r1, #0 + bl MI_CpuFill8 +_020D7C8C: + add r0, sp, #4 + bl FS_CloseFile +_020D7C94: + str r5, [r7, #0x2c] + ldr ip, [r7, #0x30] + ldr r2, [r7, #0x34] + mvn r0, #0 + str r0, [sp] + ldr r3, [r7, #0x38] + add r0, sp, #4 + mov r1, r7 + add r3, r2, r3 + add r5, r5, ip + bl FS_OpenFileDirect + cmp r0, #0 + beq _020D7CF8 + ldr r2, [r7, #0x38] + add r0, sp, #4 + mov r1, r5 + bl FS_ReadFile + cmp r0, #0 + bge _020D7CF0 + ldr r2, [r7, #0x38] + mov r0, r5 + mov r1, #0 + bl MI_CpuFill8 +_020D7CF0: + add r0, sp, #4 + bl FS_CloseFile +_020D7CF8: + str r5, [r7, #0x34] + ldr r0, _020D7D20 ; =FSi_ReadMemoryCore + str r6, [r7, #0x44] + str r0, [r7, #0x50] + ldr r0, [r7, #0x1c] + orr r0, r0, #4 + str r0, [r7, #0x1c] +_020D7D14: + mov r0, r4 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020D7D20: .word FSi_ReadMemoryCore + arm_func_end FS_LoadArchiveTables + + arm_func_start FS_UnloadArchiveTables +FS_UnloadArchiveTables: ; 0x020D7D24 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0x1c] + mov r4, #0 + tst r0, #2 + movne r0, #1 + moveq r0, r4 + cmp r0, #0 + beq _020D7DA8 + mov r0, r5 + bl FS_SuspendArchive + ldr r1, [r5, #0x1c] + tst r1, #4 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + beq _020D7D98 + ldr r2, [r5, #0x1c] + mov r1, #0 + bic r2, r2, #4 + str r2, [r5, #0x1c] + ldr r4, [r5, #0x44] + str r1, [r5, #0x44] + ldr r1, [r5, #0x3c] + str r1, [r5, #0x2c] + ldr r1, [r5, #0x40] + str r1, [r5, #0x34] + ldr r1, [r5, #0x48] + str r1, [r5, #0x50] +_020D7D98: + cmp r0, #0 + beq _020D7DA8 + mov r0, r5 + bl FS_ResumeArchive +_020D7DA8: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end FS_UnloadArchiveTables + + arm_func_start FS_SuspendArchive +FS_SuspendArchive: ; 0x020D7DB0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + bl OS_DisableInterrupts + ldr r1, [r6, #0x1c] + mov r4, r0 + tst r1, #8 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + moveq r5, #1 + movne r5, #0 + cmp r5, #0 + beq _020D7E3C + ldr r0, [r6, #0x1c] + tst r0, #0x10 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + ldr r0, [r6, #0x1c] + beq _020D7E34 + orr r0, r0, #0x40 + str r0, [r6, #0x1c] + mov r7, #0 + mov r8, #1 +_020D7E10: + add r0, r6, #0x14 + bl OS_SleepThread + ldr r0, [r6, #0x1c] + tst r0, #0x40 + movne r0, r8 + moveq r0, r7 + cmp r0, #0 + bne _020D7E10 + b _020D7E3C +_020D7E34: + orr r0, r0, #8 + str r0, [r6, #0x1c] +_020D7E3C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end FS_SuspendArchive + + arm_func_start FS_ResumeArchive +FS_ResumeArchive: ; 0x020D7E4C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + mov r5, #0 + bl OS_DisableInterrupts + ldr r1, [r4, #0x1c] + mov r6, r0 + tst r1, #8 + movne r0, #1 + moveq r0, r5 + cmp r0, #0 + moveq r7, #1 + movne r7, #0 + cmp r7, #0 + bne _020D7E9C + ldr r1, [r4, #0x1c] + mov r0, r4 + bic r1, r1, #8 + str r1, [r4, #0x1c] + bl FSi_NextCommand + mov r5, r0 +_020D7E9C: + mov r0, r6 + bl OS_RestoreInterrupts + cmp r5, #0 + beq _020D7EB4 + mov r0, r5 + bl FSi_ExecuteAsyncCommand +_020D7EB4: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end FS_ResumeArchive + + arm_func_start FS_SetArchiveProc +FS_SetArchiveProc: ; 0x020D7EBC + cmp r2, #0 + moveq r1, #0 + beq _020D7ED0 + cmp r1, #0 + moveq r2, #0 +_020D7ED0: + str r1, [r0, #0x54] + str r2, [r0, #0x58] + bx lr + arm_func_end FS_SetArchiveProc + + arm_func_start FS_NotifyArchiveAsyncEnd +FS_NotifyArchiveAsyncEnd: ; 0x020D7EDC + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldr r0, [r4, #0x1c] + mov r6, r1 + tst r0, #0x100 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020D7F30 + ldr r1, [r4, #0x1c] + ldr r0, [r4, #0x24] + bic r2, r1, #0x100 + mov r1, r6 + str r2, [r4, #0x1c] + bl FSi_ReleaseCommand + mov r0, r4 + bl FSi_NextCommand + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl FSi_ExecuteAsyncCommand + ldmia sp!, {r4, r5, r6, pc} +_020D7F30: + ldr r5, [r4, #0x24] + bl OS_DisableInterrupts + str r6, [r5, #0x14] + ldr r1, [r4, #0x1c] + mov r5, r0 + bic r1, r1, #0x200 + add r0, r4, #0xc + str r1, [r4, #0x1c] + bl OS_WakeupThread + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, pc} + arm_func_end FS_NotifyArchiveAsyncEnd + + arm_func_start FS_Init +FS_Init: ; 0x020D7F60 + stmdb sp!, {r3, lr} + ldr r1, _020D7F84 ; =_021E3638 + ldr r2, [r1] + cmp r2, #0 + ldmneia sp!, {r3, pc} + mov r2, #1 + str r2, [r1] + bl FSi_InitRom + ldmia sp!, {r3, pc} + .align 2, 0 +_020D7F84: .word _021E3638 + arm_func_end FS_Init + + arm_func_start FS_IsAvailable +FS_IsAvailable: ; 0x020D7F88 + ldr r0, _020D7F94 ; =_021E3638 + ldr r0, [r0] + bx lr + .align 2, 0 +_020D7F94: .word _021E3638 + arm_func_end FS_IsAvailable + + arm_func_start FS_InitFile +FS_InitFile: ; 0x020D7F98 + mov r2, #0 + str r2, [r0] + str r2, [r0, #4] + str r2, [r0, #0x1c] + str r2, [r0, #0x18] + str r2, [r0, #8] + mov r1, #0xe + str r1, [r0, #0x10] + str r2, [r0, #0xc] + bx lr + arm_func_end FS_InitFile + + arm_func_start FSi_FindPath +FSi_FindPath: ; 0x020D7FC0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r7, r1 + ldrb r1, [r7] + mov r8, r0 + mov r6, r2 + cmp r1, #0x2f + mov r5, r3 + cmpne r1, #0x5c + bne _020D800C + ldr r0, _020D8100 ; =_021E362C + mov r1, #0 + ldr r0, [r0] + strh r1, [sp, #4] + str r0, [sp] + str r1, [sp, #8] + strh r1, [sp, #6] + add r7, r7, #1 + b _020D80B0 +_020D800C: + ldr r0, _020D8100 ; =_021E362C + add r3, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r4, #0 +_020D8020: + ldrb r0, [r7, r4] + cmp r0, #0 + cmpne r0, #0x2f + cmpne r0, #0x5c + beq _020D80B0 + cmp r0, #0x3a + bne _020D80A4 + mov r0, r7 + mov r1, r4 + bl FS_FindArchive + cmp r0, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, [r0, #0x1c] + tst r1, #2 + movne r1, #1 + moveq r1, #0 + cmp r1, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r1, #0 + str r0, [sp] + str r1, [sp, #8] + strh r1, [sp, #6] + strh r1, [sp, #4] + add r0, r4, #1 + ldrb r0, [r7, r0]! + cmp r0, #0x2f + cmpne r0, #0x5c + addeq r7, r7, #1 + b _020D80B0 +_020D80A4: + add r4, r4, #1 + cmp r4, #3 + ble _020D8020 +_020D80B0: + ldr r1, [sp] + add r0, sp, #0 + str r1, [r8, #8] + str r7, [r8, #0x3c] + add r3, r8, #0x30 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + cmp r5, #0 + moveq r0, #0 + streq r0, [r8, #0x40] + streq r6, [r8, #0x44] + beq _020D80EC + mov r0, #1 + str r0, [r8, #0x40] + str r5, [r8, #0x44] +_020D80EC: + mov r0, r8 + mov r1, #4 + bl FSi_SendCommand + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020D8100: .word _021E362C + arm_func_end FSi_FindPath + + arm_func_start FSi_ReadFileCore +FSi_ReadFileCore: ; 0x020D8104 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r4, [r7, #0x2c] + ldr r0, [r7, #0x28] + mov r6, r2 + str r1, [r7, #0x30] + sub r0, r0, r4 + cmp r6, r0 + movgt r6, r0 + cmp r6, #0 + movlt r6, #0 + str r2, [r7, #0x34] + mov r5, r3 + str r6, [r7, #0x38] + cmp r5, #0 + ldreq r0, [r7, #0xc] + mov r1, #0 + orreq r0, r0, #4 + streq r0, [r7, #0xc] + mov r0, r7 + bl FSi_SendCommand + cmp r5, #0 + bne _020D8178 + mov r0, r7 + bl FS_WaitAsync + cmp r0, #0 + ldrne r0, [r7, #0x2c] + subne r6, r0, r4 + mvneq r6, #0 +_020D8178: + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end FSi_ReadFileCore + + arm_func_start FS_ConvertPathToFileID +FS_ConvertPathToFileID: ; 0x020D8180 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x48 + mov r5, r0 + add r0, sp, #0 + mov r4, r1 + bl FS_InitFile + add r0, sp, #0 + mov r1, r4 + mov r2, r5 + mov r3, #0 + bl FSi_FindPath + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end FS_ConvertPathToFileID + + arm_func_start FS_OpenFileDirect +FS_OpenFileDirect: ; 0x020D81C0 + stmdb sp!, {r4, lr} + mov r4, r0 + str r1, [r4, #8] + ldr ip, [sp, #8] + mov r1, #7 + str ip, [r4, #0x38] + str r2, [r4, #0x30] + str r3, [r4, #0x34] + bl FSi_SendCommand + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #0xc] + mov r0, #1 + orr r1, r1, #0x10 + bic r1, r1, #0x20 + str r1, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end FS_OpenFileDirect + + arm_func_start FS_OpenFileFast +FS_OpenFileFast: ; 0x020D8208 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, lr} + ldr r1, [sp, #0xc] + mov r4, r0 + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r4, lr} + addeq sp, sp, #0x10 + bxeq lr + str r1, [r4, #8] + str r1, [r4, #0x30] + ldr r2, [sp, #0x10] + mov r1, #6 + str r2, [r4, #0x34] + bl FSi_SendCommand + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, lr} + addeq sp, sp, #0x10 + bxeq lr + ldr r1, [r4, #0xc] + mov r0, #1 + orr r1, r1, #0x10 + bic r1, r1, #0x20 + str r1, [r4, #0xc] + ldmia sp!, {r4, lr} + add sp, sp, #0x10 + bx lr + arm_func_end FS_OpenFileFast + + arm_func_start FS_OpenFile +FS_OpenFile: ; 0x020D8278 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + add r0, sp, #0 + bl FS_ConvertPathToFileID + cmp r0, #0 + beq _020D82B4 + add r1, sp, #0 + mov r0, r4 + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r4, pc} +_020D82B4: + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end FS_OpenFile + + arm_func_start FS_CloseFile +FS_CloseFile: ; 0x020D82C0 + stmdb sp!, {r4, lr} + mov r1, #8 + mov r4, r0 + bl FSi_SendCommand + cmp r0, #0 + mov r0, #0 + ldmeqia sp!, {r4, pc} + str r0, [r4, #8] + mov r0, #0xe + str r0, [r4, #0x10] + ldr r1, [r4, #0xc] + mov r0, #1 + bic r1, r1, #0x30 + str r1, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end FS_CloseFile + + arm_func_start FS_WaitAsync +FS_WaitAsync: ; 0x020D82FC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, #0 + bl OS_DisableInterrupts + ldr r1, [r6, #0xc] + mov r4, r0 + tst r1, #1 + movne r0, #1 + moveq r0, r5 + cmp r0, #0 + beq _020D838C + ldr r0, [r6, #0xc] + tst r0, #0x44 + moveq r5, #1 + movne r5, #0 + cmp r5, #0 + beq _020D8364 + ldr r0, [r6, #0xc] + orr r0, r0, #4 + str r0, [r6, #0xc] +_020D834C: + add r0, r6, #0x18 + bl OS_SleepThread + ldr r0, [r6, #0xc] + tst r0, #0x40 + beq _020D834C + b _020D838C +_020D8364: + mov r7, #0 + mov r8, #1 +_020D836C: + add r0, r6, #0x18 + bl OS_SleepThread + ldr r0, [r6, #0xc] + tst r0, #1 + movne r0, r8 + moveq r0, r7 + cmp r0, #0 + bne _020D836C +_020D838C: + mov r0, r4 + bl OS_RestoreInterrupts + cmp r5, #0 + beq _020D83A8 + mov r0, r6 + bl FSi_ExecuteSyncCommand + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D83A8: + ldr r0, [r6, #0x14] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end FS_WaitAsync + + arm_func_start FS_ReadFileAsync +FS_ReadFileAsync: ; 0x020D83BC + ldr ip, _020D83C8 ; =FSi_ReadFileCore + mov r3, #1 + bx ip + .align 2, 0 +_020D83C8: .word FSi_ReadFileCore + arm_func_end FS_ReadFileAsync + + arm_func_start FS_ReadFile +FS_ReadFile: ; 0x020D83CC + ldr ip, _020D83D8 ; =FSi_ReadFileCore + mov r3, #0 + bx ip + .align 2, 0 +_020D83D8: .word FSi_ReadFileCore + arm_func_end FS_ReadFile + + arm_func_start FS_SeekFile +FS_SeekFile: ; 0x020D83DC + cmp r2, #0 + beq _020D83F8 + cmp r2, #1 + beq _020D8404 + cmp r2, #2 + beq _020D8410 + b _020D841C +_020D83F8: + ldr r2, [r0, #0x24] + add r1, r1, r2 + b _020D8424 +_020D8404: + ldr r2, [r0, #0x2c] + add r1, r1, r2 + b _020D8424 +_020D8410: + ldr r2, [r0, #0x28] + add r1, r1, r2 + b _020D8424 +_020D841C: + mov r0, #0 + bx lr +_020D8424: + ldr r2, [r0, #0x24] + cmp r1, r2 + movlt r1, r2 + ldr r2, [r0, #0x28] + cmp r1, r2 + movgt r1, r2 + str r1, [r0, #0x2c] + mov r0, #1 + bx lr + arm_func_end FS_SeekFile + + arm_func_start FS_ChangeDir +FS_ChangeDir: ; 0x020D8448 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x54 + mov r4, r0 + add r0, sp, #0xc + bl FS_InitFile + add r0, sp, #0xc + add r3, sp, #0 + mov r1, r4 + mov r2, #0 + bl FSi_FindPath + cmp r0, #0 + addeq sp, sp, #0x54 + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + ldr r3, _020D849C ; =_021E362C + add r0, sp, #0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #1 + add sp, sp, #0x54 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020D849C: .word _021E362C + arm_func_end FS_ChangeDir + + arm_func_start FSi_OnRomReadDone +FSi_OnRomReadDone: ; 0x020D84A0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl CARD_IsPulledOut + cmp r0, #0 + movne r1, #5 + moveq r1, #0 + mov r0, r4 + bl FS_NotifyArchiveAsyncEnd + ldmia sp!, {r4, pc} + arm_func_end FSi_OnRomReadDone + + arm_func_start FSi_ReadRomCallback +FSi_ReadRomCallback: ; 0x020D84C4 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr ip, _020D8504 ; =FSi_OnRomReadDone + mov lr, r1 + str ip, [sp] + str r0, [sp, #4] + mov r1, #1 + ldr r0, _020D8508 ; =_021E363C + str r1, [sp, #8] + mov r1, r2 + ldr r0, [r0, #4] + mov r2, lr + bl CARDi_ReadRom + mov r0, #6 + add sp, sp, #0xc + ldmia sp!, {pc} + .align 2, 0 +_020D8504: .word FSi_OnRomReadDone +_020D8508: .word _021E363C + arm_func_end FSi_ReadRomCallback + + arm_func_start FSi_WriteDummyCallback +FSi_WriteDummyCallback: ; 0x020D850C + mov r0, #1 + bx lr + arm_func_end FSi_WriteDummyCallback + + arm_func_start FSi_RomArchiveProc +FSi_RomArchiveProc: ; 0x020D8514 + stmdb sp!, {r3, lr} + cmp r1, #1 + beq _020D856C + cmp r1, #9 + beq _020D8534 + cmp r1, #0xa + beq _020D8550 + b _020D8574 +_020D8534: + ldr r0, _020D857C ; =_021E363C + ldr r0, [r0] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl CARD_LockRom + mov r0, #0 + ldmia sp!, {r3, pc} +_020D8550: + ldr r0, _020D857C ; =_021E363C + ldr r0, [r0] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl CARD_UnlockRom + mov r0, #0 + ldmia sp!, {r3, pc} +_020D856C: + mov r0, #4 + ldmia sp!, {r3, pc} +_020D8574: + mov r0, #8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020D857C: .word _021E363C + arm_func_end FSi_RomArchiveProc + + arm_func_start FSi_ReadDummyCallback +FSi_ReadDummyCallback: ; 0x020D8580 + mov r0, #1 + bx lr + arm_func_end FSi_ReadDummyCallback + + arm_func_start FSi_EmptyArchiveProc +FSi_EmptyArchiveProc: ; 0x020D8588 + mov r0, #4 + bx lr + arm_func_end FSi_EmptyArchiveProc + + arm_func_start FSi_InitRom +FSi_InitRom: ; 0x020D8590 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr r1, _020D86B0 ; =_021E363C + str r0, [r1, #4] + bl OS_GetLockID + ldr r1, _020D86B0 ; =_021E363C + mov r2, #0 + str r0, [r1] + str r2, [r1, #8] + str r2, [r1, #0xc] + str r2, [r1, #0x10] + str r2, [r1, #0x14] + bl CARD_Init + ldr r0, _020D86B4 ; =_021E3654 + bl FS_InitArchive + ldr r0, _020D86B4 ; =_021E3654 + ldr r1, _020D86B8 ; =_02110C9C + mov r2, #3 + bl FS_RegisterArchiveName + ldr r4, _020D86BC ; =0x027FFC40 + ldrh r0, [r4] + cmp r0, #2 + bne _020D8648 + ldr r3, _020D86B0 ; =_021E363C + mvn r2, #0 + str r2, [r3, #8] + mov ip, #0 + str ip, [r3, #0xc] + str r2, [r3, #0x10] + ldr r0, _020D86B4 ; =_021E3654 + ldr r1, _020D86C0 ; =FSi_EmptyArchiveProc + str ip, [r3, #0x14] + bl FS_SetArchiveProc + mov r1, #0 + str r1, [sp] + ldr r0, _020D86C4 ; =FSi_ReadDummyCallback + str r1, [sp, #4] + str r0, [sp, #8] + ldr ip, _020D86C8 ; =FSi_WriteDummyCallback + ldr r0, _020D86B4 ; =_021E3654 + mov r2, r1 + mov r3, r1 + str ip, [sp, #0xc] + bl FS_LoadArchive + add sp, sp, #0x10 + ldmia sp!, {r4, pc} +_020D8648: + ldr r0, _020D86B4 ; =_021E3654 + ldr r1, _020D86CC ; =FSi_RomArchiveProc + ldr r2, _020D86D0 ; =0x00000602 + bl FS_SetArchiveProc + ldr r1, [r4, #0x200] + mvn r0, #0 + cmp r1, r0 + cmpne r1, #0 + ldrne r2, [r4, #0x208] + cmpne r2, r0 + cmpne r2, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r4, pc} + str r1, [sp] + ldr r0, [r4, #0x204] + ldr r1, _020D86D4 ; =FSi_ReadRomCallback + str r0, [sp, #4] + ldr r0, _020D86C8 ; =FSi_WriteDummyCallback + str r1, [sp, #8] + str r0, [sp, #0xc] + ldr r3, [r4, #0x20c] + ldr r0, _020D86B4 ; =_021E3654 + mov r1, #0 + bl FS_LoadArchive + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .align 2, 0 +_020D86B0: .word _021E363C +_020D86B4: .word _021E3654 +_020D86B8: .word _02110C9C +_020D86BC: .word 0x027FFC40 +_020D86C0: .word FSi_EmptyArchiveProc +_020D86C4: .word FSi_ReadDummyCallback +_020D86C8: .word FSi_WriteDummyCallback +_020D86CC: .word FSi_RomArchiveProc +_020D86D0: .word 0x00000602 +_020D86D4: .word FSi_ReadRomCallback + arm_func_end FSi_InitRom + + arm_func_start FS_SetDefaultDMA +FS_SetDefaultDMA: ; 0x020D86D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r1, _020D8720 ; =_021E363C + ldr r0, _020D8724 ; =_021E3654 + ldr r5, [r1, #4] + bl FS_SuspendArchive + ldr r1, _020D8720 ; =_021E363C + cmp r0, #0 + str r6, [r1, #4] + beq _020D8710 + ldr r0, _020D8724 ; =_021E3654 + bl FS_ResumeArchive +_020D8710: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D8720: .word _021E363C +_020D8724: .word _021E3654 + arm_func_end FS_SetDefaultDMA + + arm_func_start FS_TryLoadTable +FS_TryLoadTable: ; 0x020D8728 + ldr ip, _020D8740 ; =FS_LoadArchiveTables + mov r3, r0 + mov r2, r1 + ldr r0, _020D8744 ; =_021E3654 + mov r1, r3 + bx ip + .align 2, 0 +_020D8740: .word FS_LoadArchiveTables +_020D8744: .word _021E3654 + arm_func_end FS_TryLoadTable + + arm_func_start FSi_GetOverlayBinarySize +FSi_GetOverlayBinarySize: ; 0x020D8748 + ldr r1, [r0, #0x1c] + mov r2, r1, lsr #0x18 + tst r2, #1 + movne r0, r1, lsl #8 + movne r0, r0, lsr #8 + ldreq r0, [r0, #8] + bx lr + arm_func_end FSi_GetOverlayBinarySize + + arm_func_start FS_ClearOverlayImage +FS_ClearOverlayImage: ; 0x020D8764 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, [r0, #0xc] + ldmib r0, {r4, r5} + add r6, r5, r1 + mov r0, r4 + mov r1, r6 + bl IC_InvalidateRange + mov r0, r4 + mov r1, r6 + bl DC_InvalidateRange + add r0, r4, r5 + sub r2, r6, r5 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end FS_ClearOverlayImage + + arm_func_start FS_GetOverlayFileID +FS_GetOverlayFileID: ; 0x020D87A0 + sub sp, sp, #8 + ldr r1, [r1, #0x18] + ldr r2, _020D87C4 ; =_021E3654 + str r1, [sp, #4] + str r2, [r0] + str r2, [sp] + str r1, [r0, #4] + add sp, sp, #8 + bx lr + .align 2, 0 +_020D87C4: .word _021E3654 + arm_func_end FS_GetOverlayFileID + + arm_func_start FSi_LoadOverlayInfoCore +FSi_LoadOverlayInfoCore: ; 0x020D87C8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x54 + movs sb, r1 + ldreq r7, [sp, #0x74] + ldreq r6, [sp, #0x70] + ldrne r7, [sp, #0x7c] + ldrne r6, [sp, #0x78] + cmp r7, r2, lsl #5 + mov r4, r0 + mov r8, r3 + mov r5, r2, lsl #5 + addls sp, sp, #0x54 + movls r0, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r0, sp, #0xc + bl FS_InitFile + mvn ip, #0 + add r0, sp, #0xc + mov r1, r8 + add r2, r6, r5 + add r3, r6, r7 + str ip, [sp] + bl FS_OpenFileDirect + cmp r0, #0 + addeq sp, sp, #0x54 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r0, sp, #0xc + mov r1, r4 + mov r2, #0x20 + bl FS_ReadFile + cmp r0, #0x20 + add r0, sp, #0xc + beq _020D8860 + bl FS_CloseFile + add sp, sp, #0x54 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_020D8860: + bl FS_CloseFile + add r0, sp, #4 + mov r1, r4 + str sb, [r4, #0x20] + bl FS_GetOverlayFileID + add r1, sp, #4 + add r0, sp, #0xc + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + addeq sp, sp, #0x54 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r1, [sp, #0x30] + add r0, sp, #0xc + str r1, [r4, #0x24] + ldr r2, [sp, #0x34] + ldr r1, [sp, #0x30] + sub r1, r2, r1 + str r1, [r4, #0x28] + bl FS_CloseFile + mov r0, #1 + add sp, sp, #0x54 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end FSi_LoadOverlayInfoCore + + arm_func_start FS_LoadOverlayInfo +FS_LoadOverlayInfo: ; 0x020D88C0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x60 + movs r4, r1 + mov r5, r0 + ldreq r0, _020D89AC ; =_021E3644 + ldrne r0, _020D89B0 ; =_021E364C + ldr ip, [r0] + cmp ip, #0 + beq _020D8970 + ldr r0, [r0, #4] + mov r3, r2, lsl #5 + cmp r0, r2, lsl #5 + addls sp, sp, #0x60 + movls r0, #0 + ldmlsia sp!, {r3, r4, r5, pc} + mov r1, r5 + add r0, ip, r3 + mov r2, #0x20 + bl MI_CpuCopy8 + add r0, sp, #0x18 + str r4, [r5, #0x20] + bl FS_InitFile + add r0, sp, #0x10 + mov r1, r5 + bl FS_GetOverlayFileID + add r1, sp, #0x10 + add r0, sp, #0x18 + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + addeq sp, sp, #0x60 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [sp, #0x3c] + add r0, sp, #0x18 + str r1, [r5, #0x24] + ldr r2, [sp, #0x40] + ldr r1, [sp, #0x3c] + sub r1, r2, r1 + str r1, [r5, #0x28] + bl FS_CloseFile + add sp, sp, #0x60 + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020D8970: + ldr ip, _020D89B4 ; =0x027FFE50 + ldr r3, _020D89B8 ; =_021E3654 + ldr r1, [ip] + mov r0, r5 + str r1, [sp] + ldr r5, [ip, #4] + mov r1, r4 + str r5, [sp, #4] + ldr r4, [ip, #8] + str r4, [sp, #8] + ldr r4, [ip, #0xc] + str r4, [sp, #0xc] + bl FSi_LoadOverlayInfoCore + add sp, sp, #0x60 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D89AC: .word _021E3644 +_020D89B0: .word _021E364C +_020D89B4: .word 0x027FFE50 +_020D89B8: .word _021E3654 + arm_func_end FS_LoadOverlayInfo + + arm_func_start FS_LoadOverlayImageAsync +FS_LoadOverlayImageAsync: ; 0x020D89BC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r1 + mov r6, r0 + mov r0, r5 + bl FS_InitFile + add r0, sp, #0 + mov r1, r6 + bl FS_GetOverlayFileID + add r1, sp, #0 + mov r0, r5 + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl FSi_GetOverlayBinarySize + mov r4, r0 + mov r0, r6 + bl FS_ClearOverlayImage + ldr r1, [r6, #4] + mov r0, r5 + mov r2, r4 + bl FS_ReadFileAsync + cmp r4, r0 + addeq sp, sp, #8 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl FS_CloseFile + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end FS_LoadOverlayImageAsync + + arm_func_start FS_LoadOverlayImage +FS_LoadOverlayImage: ; 0x020D8A48 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x50 + mov r5, r0 + add r0, sp, #8 + bl FS_InitFile + add r0, sp, #0 + mov r1, r5 + bl FS_GetOverlayFileID + add r1, sp, #0 + add r0, sp, #8 + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + addeq sp, sp, #0x50 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl FSi_GetOverlayBinarySize + mov r4, r0 + mov r0, r5 + bl FS_ClearOverlayImage + ldr r1, [r5, #4] + add r0, sp, #8 + mov r2, r4 + bl FS_ReadFile + cmp r4, r0 + add r0, sp, #8 + beq _020D8AC8 + bl FS_CloseFile + add sp, sp, #0x50 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020D8AC8: + bl FS_CloseFile + mov r0, #1 + add sp, sp, #0x50 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end FS_LoadOverlayImage + + arm_func_start FSi_CompareDigest +FSi_CompareDigest: ; 0x020D8AD8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x58 + mov r4, r0 + mov r6, r1 + mov r5, r2 + add r0, sp, #0x44 + mov r1, #0 + mov r2, #0x14 + bl MI_CpuFill8 + ldr r2, _020D8B68 ; =_02110CA0 + add r1, sp, #4 + ldmia r2, {r0, r2} + bl MI_CpuCopy8 + ldr r3, _020D8B68 ; =_02110CA0 + mov r1, r6 + ldr ip, [r3, #4] + mov r2, r5 + add r0, sp, #0x44 + add r3, sp, #4 + str ip, [sp] + bl DGT_Hash2CalcHmac + add r3, sp, #0x44 + mov r2, #0 +_020D8B34: + ldr r1, [r3] + ldr r0, [r4, r2] + cmp r1, r0 + bne _020D8B54 + add r2, r2, #4 + cmp r2, #0x14 + add r3, r3, #4 + blo _020D8B34 +_020D8B54: + cmp r2, #0x14 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x58 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020D8B68: .word _02110CA0 + arm_func_end FSi_CompareDigest + + arm_func_start FS_StartOverlay +FS_StartOverlay: ; 0x020D8B6C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl FSi_GetOverlayBinarySize + ldr r1, _020D8C50 ; =0x027FFC40 + mov r4, r0 + ldrh r0, [r1] + cmp r0, #2 + bne _020D8BFC + ldr r1, [r5, #0x1c] + mov r0, #0 + mov r1, r1, lsr #0x18 + tst r1, #2 + beq _020D8BDC + ldr r1, _020D8C54 ; =SDK_OVERLAY_DIGEST_END + ldr r3, _020D8C58 ; =SDK_OVERLAY_DIGEST + ldr r2, _020D8C5C ; =0x66666667 + sub ip, r1, r3 + smull r1, lr, r2, ip + mov r1, ip, lsr #0x1f + ldr r2, [r5] + add lr, r1, lr, asr #3 + cmp r2, lr + bhs _020D8BDC + mov r0, #0x14 + mla r0, r2, r0, r3 + ldr r1, [r5, #4] + mov r2, r4 + bl FSi_CompareDigest +_020D8BDC: + cmp r0, #0 + bne _020D8BFC + ldr r0, [r5, #4] + mov r2, r4 + mov r1, #0 + bl MI_CpuFill8 + bl OS_Terminate + ldmia sp!, {r3, r4, r5, pc} +_020D8BFC: + ldr r0, [r5, #0x1c] + mov r0, r0, lsr #0x18 + tst r0, #1 + beq _020D8C18 + ldr r0, [r5, #4] + add r0, r0, r4 + bl MIi_UncompressBackward +_020D8C18: + ldmib r5, {r0, r1} + bl DC_FlushRange + ldr r4, [r5, #0x10] + ldr r5, [r5, #0x14] + cmp r4, r5 + ldmhsia sp!, {r3, r4, r5, pc} +_020D8C30: + ldr r0, [r4] + cmp r0, #0 + beq _020D8C40 + blx r0 +_020D8C40: + add r4, r4, #4 + cmp r4, r5 + blo _020D8C30 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D8C50: .word 0x027FFC40 +_020D8C54: .word SDK_OVERLAY_DIGEST_END +_020D8C58: .word SDK_OVERLAY_DIGEST +_020D8C5C: .word 0x66666667 + arm_func_end FS_StartOverlay + + arm_func_start FS_EndOverlay +FS_EndOverlay: ; 0x020D8C60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov fp, r0 +_020D8C68: + ldr r1, [fp, #8] + ldr r0, [fp, #0xc] + mov r4, #0 + ldr r6, [fp, #4] + add r0, r1, r0 + mov r5, r4 + add r7, r6, r0 + bl OS_DisableInterrupts + ldr r1, _020D8D4C ; =__global_destructor_chain + mov ip, r4 + ldr lr, [r1] + mov r8, lr + cmp lr, #0 + beq _020D8D14 + mov r2, r4 +_020D8CA4: + ldr sl, [r8, #8] + ldr sb, [r8] + cmp sl, #0 + ldr r3, [r8, #4] + bne _020D8CC8 + cmp r3, r6 + blo _020D8CC8 + cmp r3, r7 + blo _020D8CD8 +_020D8CC8: + cmp sl, r6 + blo _020D8D04 + cmp sl, r7 + bhs _020D8D04 +_020D8CD8: + cmp r5, #0 + strne r8, [r5] + moveq r4, r8 + cmp lr, r8 + streq sb, [r1] + moveq lr, sb + str r2, [r8] + cmp ip, #0 + mov r5, r8 + strne sb, [ip] + b _020D8D08 +_020D8D04: + mov ip, r8 +_020D8D08: + mov r8, sb + cmp sb, #0 + bne _020D8CA4 +_020D8D14: + bl OS_RestoreInterrupts + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D8D20: + ldr r1, [r4, #4] + ldr r5, [r4] + cmp r1, #0 + beq _020D8D38 + ldr r0, [r4, #8] + blx r1 +_020D8D38: + mov r4, r5 + cmp r5, #0 + bne _020D8D20 + b _020D8C68 +_020D8D48: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D8D4C: .word __global_destructor_chain + arm_func_end FS_EndOverlay + + arm_func_start FS_UnloadOverlayImage +FS_UnloadOverlayImage: ; 0x020D8D50 + stmdb sp!, {r3, lr} + bl FS_EndOverlay + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end FS_UnloadOverlayImage + + arm_func_start FS_LoadOverlay +FS_LoadOverlay: ; 0x020D8D60 + stmdb sp!, {lr} + sub sp, sp, #0x2c + mov r3, r0 + mov r2, r1 + add r0, sp, #0 + mov r1, r3 + bl FS_LoadOverlayInfo + cmp r0, #0 + beq _020D8D94 + add r0, sp, #0 + bl FS_LoadOverlayImage + cmp r0, #0 + bne _020D8DA0 +_020D8D94: + add sp, sp, #0x2c + mov r0, #0 + ldmia sp!, {pc} +_020D8DA0: + add r0, sp, #0 + bl FS_StartOverlay + mov r0, #1 + add sp, sp, #0x2c + ldmia sp!, {pc} + arm_func_end FS_LoadOverlay + + arm_func_start FS_UnloadOverlay +FS_UnloadOverlay: ; 0x020D8DB4 + stmdb sp!, {lr} + sub sp, sp, #0x2c + mov r3, r0 + mov r2, r1 + add r0, sp, #0 + mov r1, r3 + bl FS_LoadOverlayInfo + cmp r0, #0 + beq _020D8DE8 + add r0, sp, #0 + bl FS_UnloadOverlayImage + cmp r0, #0 + bne _020D8DF4 +_020D8DE8: + add sp, sp, #0x2c + mov r0, #0 + ldmia sp!, {pc} +_020D8DF4: + mov r0, #1 + add sp, sp, #0x2c + ldmia sp!, {pc} + arm_func_end FS_UnloadOverlay + + arm_func_start DGT_Hash1Reset +DGT_Hash1Reset: ; 0x020D8E00 + ldr r2, _020D8E30 ; =0x67452301 + ldr r1, _020D8E34 ; =0xEFCDAB89 + str r2, [r0] + ldr r2, _020D8E38 ; =0x98BADCFE + str r1, [r0, #4] + ldr r1, _020D8E3C ; =0x10325476 + str r2, [r0, #8] + str r1, [r0, #0xc] + mov r1, #0 + str r1, [r0, #0x10] + str r1, [r0, #0x14] + bx lr + .align 2, 0 +_020D8E30: .word 0x67452301 +_020D8E34: .word 0xEFCDAB89 +_020D8E38: .word 0x98BADCFE +_020D8E3C: .word 0x10325476 + arm_func_end DGT_Hash1Reset + + arm_func_start DGT_Hash1SetSource +DGT_Hash1SetSource: ; 0x020D8E40 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + ldr r3, [r6, #0x10] + mov r4, r2 + and ip, r3, #0x3f + ldr r0, [r6, #0x14] + adds r3, r3, r4 + str r3, [r6, #0x10] + adc r0, r0, #0 + rsb r7, ip, #0x40 + mov r5, r1 + str r0, [r6, #0x14] + cmp r7, r4 + bls _020D8E94 + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r1, r6, #0x18 + mov r0, r5 + add r1, r1, ip + bl MI_CpuCopy8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020D8E94: + add r1, r6, #0x18 + mov r0, r5 + mov r2, r7 + add r1, r1, ip + bl MI_CpuCopy8 + mov r0, r6 + bl ProcessBlock + sub r4, r4, r7 + mov r8, r4, lsr #6 + cmp r8, #0 + add r7, r5, r7 + ble _020D8EF0 + mov r5, #0x40 +_020D8EC8: + mov r0, r7 + mov r2, r5 + add r1, r6, #0x18 + bl MI_CpuCopy8 + mov r0, r6 + add r7, r7, #0x40 + bl ProcessBlock + sub r8, r8, #1 + cmp r8, #0 + bgt _020D8EC8 +_020D8EF0: + ands r2, r4, #0x3f + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + add r1, r6, #0x18 + bl MI_CpuCopy8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end DGT_Hash1SetSource + + arm_func_start DGT_Hash1GetDigest_R +DGT_Hash1GetDigest_R: ; 0x020D8F08 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + ldr r1, [r4, #0x14] + ldr r3, [r4, #0x10] + mov r5, r0 + mov r6, r1, lsl #3 + ldr r1, _020D8FBC ; =_02110CA8 + mov r0, r4 + mov r2, #1 + orr r6, r6, r3, lsr #29 + mov r7, r3, lsl #3 + bl DGT_Hash1SetSource + ldr r0, [r4, #0x10] + mov r1, #0 + and r3, r0, #0x3f + rsb r2, r3, #0x40 + cmp r2, #8 + bhs _020D8F6C + add r0, r4, #0x18 + add r0, r0, r3 + bl MI_CpuFill8 + mov r0, r4 + bl ProcessBlock + mov r3, #0 + mov r2, #0x40 +_020D8F6C: + cmp r2, #8 + bls _020D8F88 + add r0, r4, #0x18 + add r0, r0, r3 + sub r2, r2, #8 + mov r1, #0 + bl MI_CpuFill8 +_020D8F88: + str r7, [r4, #0x50] + mov r0, r4 + str r6, [r4, #0x54] + bl ProcessBlock + mov r0, r4 + mov r1, r5 + mov r2, #0x10 + bl MI_CpuCopy8 + mov r0, r4 + mov r1, #0 + mov r2, #0x58 + bl MI_CpuFill8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D8FBC: .word _02110CA8 + arm_func_end DGT_Hash1GetDigest_R + + arm_func_start ProcessBlock +ProcessBlock: ; 0x020D8FC0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldmia r0, {r2, r3, ip, lr} + add r4, r0, #0x18 + ldr r5, _020D936C ; =_02110D6C + mov r7, r4 + mov r8, #0 +_020D8FD8: + mvn r1, r3 + and r6, r3, ip + and r1, r1, lr + orr r1, r6, r1 + ldr r6, [r7] + add r1, r2, r1 + ldr r2, [r5] + add r1, r6, r1 + add r2, r2, r1 + mov r1, r2, lsr #0x19 + orr r1, r1, r2, lsl #7 + add r2, r3, r1 + mvn r1, r2 + and r6, r2, r3 + and r1, r1, ip + orr r1, r6, r1 + ldr r6, [r7, #4] + add r1, lr, r1 + ldr sb, [r5, #4] + add r1, r6, r1 + add r6, sb, r1 + mov r1, r6, lsr #0x14 + orr r1, r1, r6, lsl #12 + add lr, r2, r1 + mvn r1, lr + and r6, lr, r2 + and r1, r1, r3 + orr r1, r6, r1 + ldr sb, [r7, #8] + add r6, ip, r1 + ldr r1, [r7, #0xc] + add sb, sb, r6 + ldr sl, [r5, #8] + ldr r6, [r5, #0xc] + add sl, sl, sb + mov sb, sl, lsr #0xf + orr sb, sb, sl, lsl #17 + add ip, lr, sb + add r5, r5, #0x10 + add r7, r7, #0x10 + and sl, ip, lr + mvn sb, ip + and sb, sb, r2 + orr sb, sl, sb + add r3, r3, sb + add r1, r1, r3 + add r3, r6, r1 + mov r1, r3, lsr #0xa + orr r1, r1, r3, lsl #22 + add r3, ip, r1 + add r8, r8, #1 + cmp r8, #4 + blt _020D8FD8 + ldr r1, _020D9370 ; =_02110CAC + mov r6, #0 +_020D90B4: + mvn r7, lr + ldr sb, [r1] + and r8, r3, lr + and r7, ip, r7 + orr r7, r8, r7 + ldr r8, [r4, sb, lsl #2] + add r2, r2, r7 + ldr r7, [r5] + add r2, r8, r2 + add r7, r7, r2 + mov r2, r7, lsr #0x1b + orr r2, r2, r7, lsl #5 + add r2, r3, r2 + mvn r8, ip + ldr r7, [r1, #4] + and sb, r2, ip + and r8, r3, r8 + orr sl, sb, r8 + mvn r8, r3 + ldr sb, [r1, #8] + ldr fp, [r4, r7, lsl #2] + add r7, lr, sl + add r7, fp, r7 + ldr sl, [r5, #4] + ldr sb, [r4, sb, lsl #2] + add sl, sl, r7 + ldr r7, [r1, #0xc] + and r8, r2, r8 + ldr r7, [r4, r7, lsl #2] + mov fp, sl, lsr #0x17 + orr sl, fp, sl, lsl #9 + add lr, r2, sl + ldr sl, [r5, #8] + and fp, lr, r3 + orr r8, fp, r8 + add r8, ip, r8 + add r8, sb, r8 + add sb, sl, r8 + mov r8, sb, lsr #0x12 + orr r8, r8, sb, lsl #14 + add ip, lr, r8 + mvn r8, r2 + and sb, lr, r8 + ldr r8, [r5, #0xc] + add r5, r5, #0x10 + add r1, r1, #0x10 + and sl, ip, r2 + orr sb, sl, sb + add r3, r3, sb + add r3, r7, r3 + add r7, r8, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r7, lsl #20 + add r3, ip, r3 + add r6, r6, #1 + cmp r6, #4 + blt _020D90B4 + mov r6, #0 +_020D919C: + ldr r8, [r1] + eor r7, r3, ip + eor r7, lr, r7 + ldr r8, [r4, r8, lsl #2] + add r2, r2, r7 + ldr r7, [r5] + add r2, r8, r2 + add r7, r7, r2 + mov r2, r7, lsr #0x1c + orr r2, r2, r7, lsl #4 + add r2, r3, r2 + ldr r8, [r1, #4] + eor r7, r2, r3 + eor r7, ip, r7 + ldr r8, [r4, r8, lsl #2] + add r7, lr, r7 + ldr sb, [r1, #8] + ldr sl, [r5, #4] + add r7, r8, r7 + add r8, sl, r7 + mov r7, r8, lsr #0x15 + orr r7, r7, r8, lsl #11 + add lr, r2, r7 + eor r8, lr, r2 + ldr r7, [r1, #0xc] + ldr sb, [r4, sb, lsl #2] + eor r8, r3, r8 + add r8, ip, r8 + add sb, sb, r8 + ldr sl, [r5, #8] + ldr r8, [r4, r7, lsl #2] + add sb, sl, sb + mov r7, sb, lsr #0x10 + orr r7, r7, sb, lsl #16 + add ip, lr, r7 + eor r7, ip, lr + eor r7, r2, r7 + add r3, r3, r7 + add r3, r8, r3 + ldr r7, [r5, #0xc] + add r5, r5, #0x10 + add r7, r7, r3 + add r1, r1, #0x10 + mov r3, r7, lsr #9 + orr r3, r3, r7, lsl #23 + add r3, ip, r3 + add r6, r6, #1 + cmp r6, #4 + blt _020D919C + mov r8, #0 +_020D9264: + mvn r6, lr + ldr r7, [r1] + orr r6, r3, r6 + eor r6, ip, r6 + ldr r7, [r4, r7, lsl #2] + add r2, r2, r6 + ldr r6, [r5] + add r2, r7, r2 + add r6, r6, r2 + mov r2, r6, lsr #0x1a + orr r2, r2, r6, lsl #6 + add r2, r3, r2 + mvn r6, ip + ldr sb, [r1, #4] + orr r6, r2, r6 + eor r7, r3, r6 + ldr r6, [r1, #8] + ldr sb, [r4, sb, lsl #2] + add r7, lr, r7 + ldr sl, [r5, #4] + add r7, sb, r7 + add sb, sl, r7 + mov r7, sb, lsr #0x16 + orr sb, r7, sb, lsl #10 + ldr r7, [r1, #0xc] + add lr, r2, sb + mvn sb, r3 + ldr r6, [r4, r6, lsl #2] + orr sb, lr, sb + eor sb, r2, sb + add sb, ip, sb + add sb, r6, sb + ldr sl, [r5, #8] + ldr r6, [r4, r7, lsl #2] + add sb, sl, sb + mov r7, sb, lsr #0x11 + orr sb, r7, sb, lsl #15 + ldr r7, [r5, #0xc] + add ip, lr, sb + add r5, r5, #0x10 + add r1, r1, #0x10 + mvn sb, r2 + orr sb, ip, sb + eor sb, lr, sb + add r3, r3, sb + add r3, r6, r3 + add r6, r7, r3 + mov r3, r6, lsr #0xb + orr r3, r3, r6, lsl #21 + add r3, ip, r3 + add r8, r8, #1 + cmp r8, #4 + blt _020D9264 + ldr r1, [r0] + add r1, r1, r2 + str r1, [r0] + ldr r1, [r0, #4] + add r1, r1, r3 + str r1, [r0, #4] + ldr r1, [r0, #8] + add r1, r1, ip + str r1, [r0, #8] + ldr r1, [r0, #0xc] + add r1, r1, lr + str r1, [r0, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D936C: .word _02110D6C +_020D9370: .word _02110CAC + arm_func_end ProcessBlock + + arm_func_start DGT_Hash2Reset +DGT_Hash2Reset: ; 0x020D9374 + ldr r1, _020D93B0 ; =0x67452301 + ldr r2, _020D93B4 ; =0xEFCDAB89 + str r1, [r0] + ldr r1, _020D93B8 ; =0x98BADCFE + str r2, [r0, #4] + ldr r2, _020D93BC ; =0x10325476 + str r1, [r0, #8] + ldr r1, _020D93C0 ; =0xC3D2E1F0 + str r2, [r0, #0xc] + str r1, [r0, #0x10] + mov r1, #0 + str r1, [r0, #0x14] + str r1, [r0, #0x18] + str r1, [r0, #0x1c] + bx lr + .align 2, 0 +_020D93B0: .word 0x67452301 +_020D93B4: .word 0xEFCDAB89 +_020D93B8: .word 0x98BADCFE +_020D93BC: .word 0x10325476 +_020D93C0: .word 0xC3D2E1F0 + arm_func_end DGT_Hash2Reset + + arm_func_start DGT_Hash2SetSource +DGT_Hash2SetSource: ; 0x020D93C4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + movs r8, r2 + mov sb, r1 + add r6, sl, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl, #0x14] + add r1, r0, r8, lsl #3 + cmp r1, r0 + ldrlo r0, [sl, #0x18] + addlo r0, r0, #1 + strlo r0, [sl, #0x18] + ldr r0, [sl, #0x18] + add r0, r0, r8, lsr #29 + str r0, [sl, #0x18] + str r1, [sl, #0x14] + ldr r1, [sl, #0x1c] + cmp r1, #0 + beq _020D947C + add r0, r1, r8 + cmp r0, #0x40 + blo _020D945C + rsb r4, r1, #0x40 + mov r0, sb + mov r2, r4 + add r1, r6, r1 + bl MI_CpuCopy8 + ldr r1, _020D9514 ; =_02110E70 + mov r0, sl + ldr r3, [r1] + mov r1, r6 + mov r2, #0x40 + sub r8, r8, r4 + add sb, sb, r4 + blx r3 + mov r0, #0 + str r0, [sl, #0x1c] + b _020D947C +_020D945C: + mov r0, sb + mov r2, r8 + add r1, r6, r1 + bl MI_CpuCopy8 + ldr r0, [sl, #0x1c] + add r0, r0, r8 + str r0, [sl, #0x1c] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020D947C: + cmp r8, #0x40 + blo _020D94F4 + bic r7, r8, #0x3f + tst sb, #3 + sub r8, r8, r7 + bne _020D94B4 + ldr r1, _020D9514 ; =_02110E70 + mov r0, sl + ldr r3, [r1] + mov r1, sb + mov r2, r7 + blx r3 + add sb, sb, r7 + b _020D94F4 +_020D94B4: + mov r5, #0x40 + ldr r4, _020D9514 ; =_02110E70 + mov fp, r5 +_020D94C0: + mov r0, sb + mov r1, r6 + mov r2, r5 + bl MI_CpuCopy8 + ldr r3, [r4] + mov r0, sl + mov r1, r6 + add sb, sb, #0x40 + mov r2, fp + blx r3 + sub r7, r7, #0x40 + cmp r7, #0 + bgt _020D94C0 +_020D94F4: + str r8, [sl, #0x1c] + cmp r8, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sb + mov r1, r6 + mov r2, r8 + bl MI_CpuCopy8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020D9514: .word _02110E70 + arm_func_end DGT_Hash2SetSource + + arm_func_start DGT_Hash2GetDigest +DGT_Hash2GetDigest: ; 0x020D9518 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + ldr r0, [sp, #0x10] + mov r6, r1 + ldr r3, [r0, #0x1c] + add r4, r0, #0x20 + tst r3, #3 + mov r2, r3, asr #2 + moveq r0, #0 + streq r0, [r4, r2, lsl #2] + ldr r1, [sp, #0x10] + mov r0, #0x80 + add r5, r1, #0x20 + strb r0, [r5, r3] + add r3, r3, #1 + tst r3, #3 + beq _020D9570 + mov r0, #0 +_020D9560: + strb r0, [r5, r3] + add r3, r3, #1 + tst r3, #3 + bne _020D9560 +_020D9570: + ldr r0, [sp, #0x10] + add r2, r2, #1 + ldr r0, [r0, #0x1c] + cmp r0, #0x38 + blt _020D95BC + cmp r2, #0x10 + bge _020D95A0 + mov r0, #0 +_020D9590: + str r0, [r4, r2, lsl #2] + add r2, r2, #1 + cmp r2, #0x10 + blt _020D9590 +_020D95A0: + ldr r1, _020D9710 ; =_02110E70 + ldr r0, [sp, #0x10] + ldr r3, [r1] + mov r1, r4 + mov r2, #0x40 + blx r3 + mov r2, #0 +_020D95BC: + cmp r2, #0xe + bge _020D95D8 + mov r0, #0 +_020D95C8: + str r0, [r4, r2, lsl #2] + add r2, r2, #1 + cmp r2, #0xe + blt _020D95C8 +_020D95D8: + ldr r0, [sp, #0x10] + ldr r3, _020D9710 ; =_02110E70 + ldr r2, [r0, #0x14] + mov r1, r4 + strb r2, [r5, #0x3f] + mov r0, r2, lsr #8 + strb r0, [r5, #0x3e] + mov r0, r2, lsr #0x10 + strb r0, [r5, #0x3d] + mov r0, r2, lsr #0x18 + strb r0, [r5, #0x3c] + ldr r0, [sp, #0x10] + mov r2, #0x40 + ldr r4, [r0, #0x18] + strb r4, [r5, #0x3b] + mov r0, r4, lsr #8 + strb r0, [r5, #0x3a] + mov r0, r4, lsr #0x10 + strb r0, [r5, #0x39] + mov r0, r4, lsr #0x18 + strb r0, [r5, #0x38] + ldr r0, [sp, #0x10] + ldr r3, [r3] + blx r3 + ldr r0, [sp, #0x10] + ldr r1, [r0] + mov r0, r1, lsr #0x18 + strb r0, [r6] + mov r0, r1, lsr #0x10 + strb r0, [r6, #1] + mov r0, r1, lsr #8 + strb r0, [r6, #2] + strb r1, [r6, #3] + ldr r0, [sp, #0x10] + ldr r1, [r0, #4] + mov r0, r1, lsr #0x18 + strb r0, [r6, #4] + mov r0, r1, lsr #0x10 + strb r0, [r6, #5] + mov r0, r1, lsr #8 + strb r0, [r6, #6] + strb r1, [r6, #7] + ldr r0, [sp, #0x10] + ldr r1, [r0, #8] + mov r0, r1, lsr #0x18 + strb r0, [r6, #8] + mov r0, r1, lsr #0x10 + strb r0, [r6, #9] + mov r0, r1, lsr #8 + strb r0, [r6, #0xa] + strb r1, [r6, #0xb] + ldr r0, [sp, #0x10] + ldr r1, [r0, #0xc] + mov r0, r1, lsr #0x18 + strb r0, [r6, #0xc] + mov r0, r1, lsr #0x10 + strb r0, [r6, #0xd] + mov r0, r1, lsr #8 + strb r0, [r6, #0xe] + strb r1, [r6, #0xf] + ldr r0, [sp, #0x10] + ldr r1, [r0, #0x10] + mov r0, r1, lsr #0x18 + strb r0, [r6, #0x10] + mov r0, r1, lsr #0x10 + strb r0, [r6, #0x11] + mov r0, r1, lsr #8 + strb r0, [r6, #0x12] + strb r1, [r6, #0x13] + ldr r3, [sp, #0x10] + mov r0, #0 + add r1, sp, #0x10 + mov r2, #4 + str r0, [r3, #0x1c] + bl MIi_CpuClear32 + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020D9710: .word _02110E70 + arm_func_end DGT_Hash2GetDigest + + arm_func_start DGT_Hash2CalcHmac +DGT_Hash2CalcHmac: ; 0x020D9714 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xa0 + ldr lr, _020D9798 ; =_0210E188 + add ip, sp, #8 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + mov r4, ip + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2} + stmia ip, {r0, r1, r2} + add lr, sp, #0x38 + add ip, sp, #0x24 + str lr, [sp, #0x10] + ldr lr, _020D979C ; =DGT_Hash2Reset + str ip, [sp, #0x14] + ldr ip, _020D97A0 ; =DGT_Hash2SetSource + str lr, [sp, #0x18] + ldr lr, _020D97A4 ; =DGT_Hash2GetDigest + str ip, [sp, #0x1c] + ldr ip, [sp, #0xb8] + str lr, [sp, #0x20] + str ip, [sp] + mov r3, r5 + mov r0, r8 + mov r1, r7 + mov r2, r6 + str r4, [sp, #4] + bl HmacCalc + add sp, sp, #0xa0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020D9798: .word _0210E188 +_020D979C: .word DGT_Hash2Reset +_020D97A0: .word DGT_Hash2SetSource +_020D97A4: .word DGT_Hash2GetDigest + arm_func_end DGT_Hash2CalcHmac + + arm_func_start HmacCalc +HmacCalc: ; 0x020D97A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc0 + ldr r5, [sp, #0xe0] + ldr r4, [sp, #0xe4] + mov r8, r1 + movs sb, r0 + mov r7, r2 + cmpne r8, #0 + mov r6, r3 + cmpne r7, #0 + cmpne r6, #0 + cmpne r5, #0 + cmpne r4, #0 + addeq sp, sp, #0xc0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [r4, #4] + cmp r5, r0 + ble _020D9828 + ldr r0, [r4, #8] + ldr r1, [r4, #0x10] + blx r1 + ldr r0, [r4, #8] + ldr r3, [r4, #0x14] + mov r1, r6 + mov r2, r5 + blx r3 + ldr r0, [r4, #8] + ldr r2, [r4, #0x18] + add r1, sp, #0x80 + blx r2 + ldr r5, [r4] + add r6, sp, #0x80 +_020D9828: + cmp r5, #0 + mov r2, #0 + ble _020D9850 + add r1, sp, #0x40 +_020D9838: + ldrb r0, [r6, r2] + add r2, r2, #1 + cmp r2, r5 + eor r0, r0, #0x36 + strb r0, [r1], #1 + blt _020D9838 +_020D9850: + ldr r0, [r4, #4] + cmp r2, r0 + bge _020D987C + add r0, sp, #0x40 + add r3, r0, r2 + mov r1, #0x36 +_020D9868: + strb r1, [r3], #1 + ldr r0, [r4, #4] + add r2, r2, #1 + cmp r2, r0 + blt _020D9868 +_020D987C: + ldr r0, [r4, #8] + ldr r1, [r4, #0x10] + blx r1 + ldr r0, [r4, #8] + ldr r2, [r4, #4] + ldr r3, [r4, #0x14] + add r1, sp, #0x40 + blx r3 + ldr r0, [r4, #8] + ldr r3, [r4, #0x14] + mov r1, r8 + mov r2, r7 + blx r3 + ldr r0, [r4, #8] + ldr r1, [r4, #0xc] + ldr r2, [r4, #0x18] + blx r2 + cmp r5, #0 + mov r3, #0 + ble _020D98E8 + add r1, sp, #0 +_020D98D0: + ldrb r0, [r6, r3] + add r3, r3, #1 + cmp r3, r5 + eor r0, r0, #0x5c + strb r0, [r1], #1 + blt _020D98D0 +_020D98E8: + ldr r0, [r4, #4] + cmp r3, r0 + bge _020D9914 + add r0, sp, #0 + add r2, r0, r3 + mov r1, #0x5c +_020D9900: + strb r1, [r2], #1 + ldr r0, [r4, #4] + add r3, r3, #1 + cmp r3, r0 + blt _020D9900 +_020D9914: + ldr r0, [r4, #8] + ldr r1, [r4, #0x10] + blx r1 + ldr r0, [r4, #8] + ldr r2, [r4, #4] + ldr r3, [r4, #0x14] + add r1, sp, #0 + blx r3 + ldr r0, [r4, #8] + ldr r1, [r4, #0xc] + ldr r2, [r4] + ldr r3, [r4, #0x14] + blx r3 + ldr r0, [r4, #8] + ldr r2, [r4, #0x18] + mov r1, sb + blx r2 + add sp, sp, #0xc0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 + arm_func_end HmacCalc + +_020D9960: .word 0x00FF00FF +_020D9964: .word 0x5A827999 +_020D9968: .word 0x6ED9EBA1 +_020D996C: .word 0x8F1BBCDC +_020D9970: .word 0xCA62C1D6 + + arm_func_start DGTi_hash2_arm4_small +DGTi_hash2_arm4_small: ; 0x020D9974 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, ip, lr} + ldmia r0, {r3, sb, sl, fp, ip} + sub sp, sp, #0x84 + str r2, [sp, #0x80] +_020D9984: + ldr r8, _020D9964 ; =0x5A827999 + ldr r7, _020D9960 ; =0x00FF00FF + mov r6, sp + mov r5, #0 +_020D9994: + ldr r4, [r1], #4 + add r2, r8, ip + add r2, r2, r3, ror #27 + and lr, r4, r7 + and r4, r7, r4, ror #24 + orr r4, r4, lr, ror #8 + str r4, [r6, #0x40] + str r4, [r6], #4 + add r2, r2, r4 + eor r4, sl, fp + and r4, r4, sb + eor r4, r4, fp + add r2, r2, r4 + mov sb, sb, ror #2 + mov ip, fp + mov fp, sl + mov sl, sb + mov sb, r3 + mov r3, r2 + add r5, r5, #4 + cmp r5, #0x40 + blt _020D9994 + mov r7, #0 + mov r6, sp +_020D99F4: + ldr r2, [r6] + ldr r5, [r6, #8] + ldr r4, [r6, #0x20] + ldr lr, [r6, #0x34] + eor r2, r2, r5 + eor r4, r4, lr + eor r2, r2, r4 + mov r2, r2, ror #0x1f + str r2, [r6, #0x40] + str r2, [r6], #4 + add r2, r2, ip + add r2, r2, r8 + add r2, r2, r3, ror #27 + eor r4, sl, fp + and r4, r4, sb + eor r4, r4, fp + add r2, r2, r4 + mov sb, sb, ror #2 + mov ip, fp + mov fp, sl + mov sl, sb + mov sb, r3 + mov r3, r2 + add r7, r7, #4 + cmp r7, #0x10 + blt _020D99F4 + ldr r8, _020D9968 ; =0x6ED9EBA1 + mov r7, #0 +_020D9A64: + ldr r2, [r6] + ldr r4, [r6, #8] + ldr lr, [r6, #0x20] + ldr r5, [r6, #0x34] + eor r2, r2, r4 + eor lr, lr, r5 + eor r2, r2, lr + mov r2, r2, ror #0x1f + str r2, [r6, #0x40] + str r2, [r6], #4 + add r2, r2, ip + add r2, r2, r8 + add r2, r2, r3, ror #27 + eor lr, sb, sl + eor lr, lr, fp + add r2, r2, lr + mov sb, sb, ror #2 + mov ip, fp + mov fp, sl + mov sl, sb + mov sb, r3 + mov r3, r2 + add r7, r7, #1 + cmp r7, #0xc + moveq r6, sp + cmp r7, #0x14 + blt _020D9A64 + ldr r8, _020D996C ; =0x8F1BBCDC + mov r7, #0 +_020D9AD8: + ldr r2, [r6] + ldr lr, [r6, #8] + ldr r5, [r6, #0x20] + ldr r4, [r6, #0x34] + eor r2, r2, lr + eor r5, r5, r4 + eor r2, r2, r5 + mov r2, r2, ror #0x1f + str r2, [r6, #0x40] + str r2, [r6], #4 + add r2, r2, ip + add r2, r2, r8 + add r2, r2, r3, ror #27 + orr r5, sb, sl + and r5, r5, fp + and r4, sb, sl + orr r5, r5, r4 + add r2, r2, r5 + mov sb, sb, ror #2 + mov ip, fp + mov fp, sl + mov sl, sb + mov sb, r3 + mov r3, r2 + add r7, r7, #1 + cmp r7, #8 + moveq r6, sp + cmp r7, #0x14 + blt _020D9AD8 + ldr r8, _020D9970 ; =0xCA62C1D6 + mov r7, #0 +_020D9B54: + ldr r2, [r6] + ldr r5, [r6, #8] + ldr r4, [r6, #0x20] + ldr lr, [r6, #0x34] + eor r2, r2, r5 + eor r4, r4, lr + eor r2, r2, r4 + mov r2, r2, ror #0x1f + str r2, [r6, #0x40] + str r2, [r6], #4 + add r2, r2, ip + add r2, r2, r8 + add r2, r2, r3, ror #27 + eor r4, sb, sl + eor r4, r4, fp + add r2, r2, r4 + mov sb, sb, ror #2 + mov ip, fp + mov fp, sl + mov sl, sb + mov sb, r3 + mov r3, r2 + add r7, r7, #1 + cmp r7, #4 + moveq r6, sp + cmp r7, #0x14 + blt _020D9B54 + ldmia r0, {r2, r4, r6, r7, lr} + add r3, r3, r2 + add sb, sb, r4 + add sl, sl, r6 + add fp, fp, r7 + add ip, ip, lr + stmia r0, {r3, sb, sl, fp, ip} + ldr lr, [sp, #0x80] + subs lr, lr, #0x40 + str lr, [sp, #0x80] + bgt _020D9984 + add sp, sp, #0x84 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, ip, pc} + arm_func_end DGTi_hash2_arm4_small + + arm_func_start CP_SaveContext +CP_SaveContext: ; 0x020D9BF4 + ldr r1, _020D9C30 ; =0x04000290 + stmdb sp!, {r4} + ldmia r1, {r2, r3, r4, ip} + stmia r0!, {r2, r3, r4, ip} + ldrh ip, [r1, #-0x10] + add r1, r1, #0x28 + ldmia r1, {r2, r3} + stmia r0!, {r2, r3} + and ip, ip, #3 + ldrh r2, [r1, #-8] + strh ip, [r0] + and r2, r2, #1 + strh r2, [r0, #2] + ldmia sp!, {r4} + bx lr + .align 2, 0 +_020D9C30: .word 0x04000290 + arm_func_end CP_SaveContext + + arm_func_start CPi_RestoreContext +CPi_RestoreContext: ; 0x020D9C34 + stmdb sp!, {r4} + ldr r1, _020D9C6C ; =0x04000290 + ldmia r0, {r2, r3, r4, ip} + stmia r1, {r2, r3, r4, ip} + ldrh r2, [r0, #0x18] + ldrh r3, [r0, #0x1a] + strh r2, [r1, #-0x10] + strh r3, [r1, #0x20] + add r0, r0, #0x10 + add r1, r1, #0x28 + ldmia r0, {r2, r3} + stmia r1, {r2, r3} + ldmia sp!, {r4} + bx lr + .align 2, 0 +_020D9C6C: .word 0x04000290 + arm_func_end CPi_RestoreContext + + arm_func_start TPi_TpCallback +TPi_TpCallback: ; 0x020D9C70 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r0, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + and r0, r3, #0x7f00 + mov r0, r0, lsl #8 + cmp r2, #0 + mov r0, r0, lsr #0x10 + beq _020D9CCC + ldr r1, _020D9EE8 ; =_021E36B0 + mov r2, #1 + ldrh r3, [r1, #0x38] + orr r2, r3, r2, lsl r0 + strh r2, [r1, #0x38] + ldr r3, [r1, #4] + cmp r3, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, #4 + mov r2, #0 + blx r3 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D9CCC: + cmp r0, #0x10 + bne _020D9D84 + ldr r1, _020D9EE8 ; =_021E36B0 + ldrh r2, [r1, #0x10] + add r2, r2, #1 + strh r2, [r1, #0x10] + ldrh r3, [r1, #0x10] + ldrh r2, [r1, #0x18] + cmp r3, r2 + movhs r2, #0 + strhsh r2, [r1, #0x10] + ldr r2, _020D9EEC ; =0x027FFFAA + ldr r1, _020D9EE8 ; =_021E36B0 + ldrh r3, [r2] + ldrh r2, [r2, #2] + ldrh lr, [r1, #0x10] + strh r3, [sp, #4] + strh r2, [sp, #6] + ldr r5, [sp, #4] + ldr r7, [r1, #0x14] + mov r2, r5, lsl #7 + mov r3, r2, lsr #0x1f + mov r4, r5, lsl #8 + mov r2, r5, lsl #5 + mov ip, r5, lsl #0x14 + mov r2, r2, lsr #0x1e + mov r6, lr, lsl #3 + mov r5, ip, lsr #0x14 + strh r5, [r7, r6] + add r5, r7, lr, lsl #3 + mov r4, r4, lsr #0x14 + strh r4, [r5, #2] + and r3, r3, #0xff + strh r3, [r5, #4] + and r2, r2, #0xff + strh r2, [r5, #6] + ldr r3, [r1, #4] + cmp r3, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r2, [r1, #0x10] + mov r1, #0 + and r2, r2, #0xff + blx r3 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D9D84: + tst r1, #0x1000000 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + and r1, r3, #0xff + cmp r1, #4 + addls pc, pc, r1, lsl #2 + b _020D9EDC +_020D9DA0: ; jump table + b _020D9DB4 ; case 0 + b _020D9EDC ; case 1 + b _020D9E88 ; case 2 + b _020D9E90 ; case 3 + b _020D9E80 ; case 4 +_020D9DB4: + cmp r0, #0 + beq _020D9DD8 + cmp r0, #1 + beq _020D9E38 + cmp r0, #2 + ldreq r1, _020D9EE8 ; =_021E36B0 + moveq r2, #0 + streqh r2, [r1, #0x36] + b _020D9E44 +_020D9DD8: + ldr r2, _020D9EEC ; =0x027FFFAA + ldr r1, _020D9EE8 ; =_021E36B0 + ldrh r4, [r2] + ldrh r3, [r2, #2] + mov r2, #0 + strh r4, [sp] + strh r3, [sp, #2] + ldr r4, [sp] + mov r3, r4, lsl #0x14 + mov r5, r3, lsr #0x14 + mov lr, r4, lsl #8 + mov r3, r4, lsl #7 + mov ip, r3, lsr #0x1f + mov r3, r4, lsl #5 + mov r3, r3, lsr #0x1e + strh r5, [r1, #8] + mov lr, lr, lsr #0x14 + strh lr, [r1, #0xa] + and ip, ip, #0xff + strh ip, [r1, #0xc] + and r3, r3, #0xff + strh r3, [r1, #0xe] + strh r2, [r1, #0x36] + b _020D9E44 +_020D9E38: + ldr r1, _020D9EE8 ; =_021E36B0 + mov r2, #2 + strh r2, [r1, #0x36] +_020D9E44: + ldr r1, _020D9EE8 ; =_021E36B0 + mov r2, #1 + ldrh r3, [r1, #0x3a] + mvn r2, r2, lsl r0 + and r2, r3, r2 + strh r2, [r1, #0x3a] + ldr r3, [r1, #4] + cmp r3, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, #0 + mov r2, r1 + blx r3 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D9E80: + mov r4, #3 + b _020D9E94 +_020D9E88: + mov r4, #1 + b _020D9E94 +_020D9E90: + mov r4, #2 +_020D9E94: + ldr r1, _020D9EE8 ; =_021E36B0 + mov ip, #1 + ldrh r3, [r1, #0x38] + mvn r2, ip, lsl r0 + orr r3, r3, ip, lsl r0 + strh r3, [r1, #0x38] + ldrh r3, [r1, #0x3a] + and r2, r3, r2 + strh r2, [r1, #0x3a] + ldr r3, [r1, #4] + cmp r3, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + and r1, r4, #0xff + mov r2, #0 + blx r3 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020D9EDC: + bl OS_Terminate + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020D9EE8: .word _021E36B0 +_020D9EEC: .word 0x027FFFAA + arm_func_end TPi_TpCallback + + arm_func_start TP_Init +TP_Init: ; 0x020D9EF0 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020D9F60 ; =_021E36B0 + ldrh r1, [r0] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + strh r1, [r0] + bl PXI_Init + ldr r0, _020D9F60 ; =_021E36B0 + mov r1, #0 + strh r1, [r0, #0x10] + str r1, [r0, #4] + str r1, [r0, #0x14] + strh r1, [r0, #0x36] + strh r1, [r0, #0x34] + strh r1, [r0, #0x3a] + strh r1, [r0, #0x38] + mov r5, #6 + mov r4, #1 +_020D9F3C: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020D9F3C + ldr r1, _020D9F64 ; =TPi_TpCallback + mov r0, #6 + bl PXI_SetFifoRecvCallback + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020D9F60: .word _021E36B0 +_020D9F64: .word TPi_TpCallback + arm_func_end TP_Init + + arm_func_start TP_GetUserInfo +TP_GetUserInfo: ; 0x020D9F68 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + ldr ip, _020D9FF8 ; =0x027FFC80 + mov r4, r0 + ldrh r1, [ip, #0x58] + ldrh r2, [ip, #0x5a] + ldrh r0, [ip, #0x5e] + cmp r1, #0 + ldrh lr, [ip, #0x60] + cmpeq r0, #0 + cmpeq r2, #0 + ldrb r3, [ip, #0x5c] + ldrb r5, [ip, #0x5d] + ldrb r6, [ip, #0x62] + ldrb ip, [ip, #0x63] + cmpeq lr, #0 + beq _020D9FCC + str r5, [sp] + stmib sp, {r0, lr} + str r6, [sp, #0xc] + mov r0, r4 + str ip, [sp, #0x10] + bl TP_CalcCalibrateParam + cmp r0, #0 + beq _020D9FEC +_020D9FCC: + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + add sp, sp, #0x14 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, pc} +_020D9FEC: + mov r0, #1 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020D9FF8: .word 0x027FFC80 + arm_func_end TP_GetUserInfo + + arm_func_start TP_SetCalibrateParam +TP_SetCalibrateParam: ; 0x020D9FFC + stmdb sp!, {r4, lr} + movs r4, r0 + bne _020DA018 + ldr r0, _020DA118 ; =_021E36B0 + mov r1, #0 + strh r1, [r0, #0x34] + ldmia sp!, {r4, pc} +_020DA018: + bl OS_DisableInterrupts + ldrsh r2, [r4, #4] + cmp r2, #0 + beq _020DA07C + ldr r3, _020DA11C ; =0x04000280 + mov r1, #0 + strh r1, [r3] + mov r1, #0x10000000 + str r1, [r3, #0x10] + str r2, [r3, #0x18] + mov r1, #0 + str r1, [r3, #0x1c] + ldrsh r2, [r4] + ldr r1, _020DA118 ; =_021E36B0 + str r2, [r1, #0x1c] + ldrsh r2, [r4, #4] + str r2, [r1, #0x20] +_020DA05C: + ldrh r1, [r3] + tst r1, #0x8000 + bne _020DA05C + ldr r2, _020DA120 ; =0x040002A0 + ldr r1, _020DA118 ; =_021E36B0 + ldr r2, [r2] + str r2, [r1, #0x24] + b _020DA090 +_020DA07C: + ldr r1, _020DA118 ; =_021E36B0 + mov r2, #0 + str r2, [r1, #0x1c] + str r2, [r1, #0x20] + str r2, [r1, #0x24] +_020DA090: + ldrsh r2, [r4, #6] + cmp r2, #0 + beq _020DA0F0 + ldr r3, _020DA11C ; =0x04000280 + mov r1, #0 + strh r1, [r3] + mov r1, #0x10000000 + str r1, [r3, #0x10] + str r2, [r3, #0x18] + mov r1, #0 + str r1, [r3, #0x1c] + ldrsh r2, [r4, #2] + ldr r1, _020DA118 ; =_021E36B0 + str r2, [r1, #0x28] + ldrsh r2, [r4, #6] + str r2, [r1, #0x2c] +_020DA0D0: + ldrh r1, [r3] + tst r1, #0x8000 + bne _020DA0D0 + ldr r2, _020DA120 ; =0x040002A0 + ldr r1, _020DA118 ; =_021E36B0 + ldr r2, [r2] + str r2, [r1, #0x30] + b _020DA104 +_020DA0F0: + ldr r1, _020DA118 ; =_021E36B0 + mov r2, #0 + str r2, [r1, #0x28] + str r2, [r1, #0x2c] + str r2, [r1, #0x30] +_020DA104: + bl OS_RestoreInterrupts + ldr r0, _020DA118 ; =_021E36B0 + mov r1, #1 + strh r1, [r0, #0x34] + ldmia sp!, {r4, pc} + .align 2, 0 +_020DA118: .word _021E36B0 +_020DA11C: .word 0x04000280 +_020DA120: .word 0x040002A0 + arm_func_end TP_SetCalibrateParam + + arm_func_start TP_RequestSamplingAsync +TP_RequestSamplingAsync: ; 0x020DA124 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #6 + mov r1, #0x3000000 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + cmp r0, #0 + bne _020DA18C + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, _020DA1B4 ; =_021E36B0 + ldrh r1, [r0, #0x38] + orr r1, r1, #1 + strh r1, [r0, #0x38] + ldr r3, [r0, #4] + cmp r3, #0 + ldmeqia sp!, {r4, pc} + mov r0, #0 + mov r2, r0 + mov r1, #4 + blx r3 + ldmia sp!, {r4, pc} +_020DA18C: + ldr r1, _020DA1B4 ; =_021E36B0 + mov r0, r4 + ldrh r2, [r1, #0x3a] + orr r2, r2, #1 + strh r2, [r1, #0x3a] + ldrh r2, [r1, #0x38] + bic r2, r2, #1 + strh r2, [r1, #0x38] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020DA1B4: .word _021E36B0 + arm_func_end TP_RequestSamplingAsync + + arm_func_start TP_WaitRawResult +TP_WaitRawResult: ; 0x020DA1B8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + bl TP_WaitBusy + ldr r1, _020DA204 ; =_021E36B0 + ldrh r0, [r1, #0x38] + tst r0, #1 + movne r0, #1 + ldmneia sp!, {r4, pc} + ldrh r3, [r1, #8] + ldrh r2, [r1, #0xa] + mov r0, #0 + strh r3, [r4] + strh r2, [r4, #2] + ldrh r2, [r1, #0xc] + ldrh r1, [r1, #0xe] + strh r2, [r4, #4] + strh r1, [r4, #6] + ldmia sp!, {r4, pc} + .align 2, 0 +_020DA204: .word _021E36B0 + arm_func_end TP_WaitRawResult + + arm_func_start TP_RequestAutoSamplingStartAsync +TP_RequestAutoSamplingStartAsync: ; 0x020DA208 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, _020DA304 ; =_021E36B0 + mov lr, #0 + str r2, [ip, #0x14] + mov r5, r1 + strh lr, [ip, #0x10] + strh r5, [ip, #0x12] + mov r4, r0 + strh r3, [ip, #0x18] + cmp r3, #0 + bls _020DA250 + mov r1, lr +_020DA238: + ldr r0, [ip, #0x14] + add r0, r0, lr, lsl #3 + add lr, lr, #1 + strh r1, [r0, #4] + cmp lr, r3 + blo _020DA238 +_020DA250: + bl OS_DisableInterrupts + and r1, r5, #0xff + orr r1, r1, #0x100 + mov r5, r0 + orr r1, r1, #0x2000000 + mov r0, #6 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + blt _020DA29C + orr r1, r4, #0x10000 + orr r1, r1, #0x1000000 + mov r0, #6 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + movge r0, #1 +_020DA29C: + tst r0, #0xff + bne _020DA2DC + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, _020DA304 ; =_021E36B0 + ldrh r1, [r0, #0x38] + orr r1, r1, #2 + strh r1, [r0, #0x38] + ldr r3, [r0, #4] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #1 + mov r1, #4 + mov r2, #0 + blx r3 + ldmia sp!, {r3, r4, r5, pc} +_020DA2DC: + ldr r1, _020DA304 ; =_021E36B0 + mov r0, r5 + ldrh r2, [r1, #0x3a] + orr r2, r2, #2 + strh r2, [r1, #0x3a] + ldrh r2, [r1, #0x38] + bic r2, r2, #2 + strh r2, [r1, #0x38] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DA304: .word _021E36B0 + arm_func_end TP_RequestAutoSamplingStartAsync + + arm_func_start TP_RequestAutoSamplingStopAsync +TP_RequestAutoSamplingStopAsync: ; 0x020DA308 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, r0 + ldr r1, _020DA398 ; =0x03000200 + mov r0, #6 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + cmp r0, #0 + bne _020DA370 + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, _020DA39C ; =_021E36B0 + ldrh r1, [r0, #0x38] + orr r1, r1, #4 + strh r1, [r0, #0x38] + ldr r3, [r0, #4] + cmp r3, #0 + ldmeqia sp!, {r4, pc} + mov r0, #2 + mov r1, #4 + mov r2, #0 + blx r3 + ldmia sp!, {r4, pc} +_020DA370: + ldr r1, _020DA39C ; =_021E36B0 + mov r0, r4 + ldrh r2, [r1, #0x3a] + orr r2, r2, #4 + strh r2, [r1, #0x3a] + ldrh r2, [r1, #0x38] + bic r2, r2, #4 + strh r2, [r1, #0x38] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020DA398: .word 0x03000200 +_020DA39C: .word _021E36B0 + arm_func_end TP_RequestAutoSamplingStopAsync + + arm_func_start TP_GetLatestRawPointInAuto +TP_GetLatestRawPointInAuto: ; 0x020DA3A0 + stmdb sp!, {r4, lr} + ldr ip, _020DA4E0 ; =_021E36B0 + mov r1, #3 + strh r1, [r0, #6] + ldrh r1, [ip, #0x12] + ldrh r2, [ip, #0x10] + cmp r1, #1 + ldrneh r1, [ip, #0x18] + cmpne r1, #1 + bne _020DA3FC + ldr r1, _020DA4E0 ; =_021E36B0 + mov ip, r2, lsl #3 + ldr r1, [r1, #0x14] + add r3, r1, r2, lsl #3 + ldrh r2, [r1, ip] + ldrh r1, [r3, #2] + strh r2, [r0] + strh r1, [r0, #2] + ldrh r2, [r3, #4] + ldrh r1, [r3, #6] + strh r2, [r0, #4] + strh r1, [r0, #6] + ldmia sp!, {r4, pc} +_020DA3FC: + mov r1, #0 + b _020DA4BC +_020DA404: + subs lr, r2, r1 + ldr r3, [ip, #0x14] + addmi lr, lr, r4 + add r3, r3, lr, lsl #3 + ldrh lr, [r3, #4] + cmp lr, #0 + bne _020DA444 + ldrh r2, [r3] + ldrh r1, [r3, #2] + strh r2, [r0] + strh r1, [r0, #2] + ldrh r2, [r3, #4] + ldrh r1, [r3, #6] + strh r2, [r0, #4] + strh r1, [r0, #6] + ldmia sp!, {r4, pc} +_020DA444: + ldrh lr, [r0, #6] + tst lr, #1 + beq _020DA474 + ldrh lr, [r3, #6] + tst lr, #1 + bne _020DA474 + ldrh lr, [r3] + cmp r1, #0 + strh lr, [r0] + ldrneh lr, [r0, #6] + bicne lr, lr, #1 + strneh lr, [r0, #6] +_020DA474: + ldrh lr, [r0, #6] + tst lr, #2 + beq _020DA4A4 + ldrh lr, [r3, #6] + tst lr, #2 + bne _020DA4A4 + ldrh r3, [r3, #2] + cmp r1, #0 + strh r3, [r0, #2] + ldrneh r3, [r0, #6] + bicne r3, r3, #2 + strneh r3, [r0, #6] +_020DA4A4: + ldrh r3, [r0, #6] + cmp r3, #0 + moveq r1, #1 + streqh r1, [r0, #4] + ldmeqia sp!, {r4, pc} + add r1, r1, #1 +_020DA4BC: + ldrh r3, [ip, #0x12] + cmp r1, r3 + ldrlth r4, [ip, #0x18] + sublt r3, r4, #1 + cmplt r1, r3 + blt _020DA404 + mov r1, #1 + strh r1, [r0, #4] + ldmia sp!, {r4, pc} + .align 2, 0 +_020DA4E0: .word _021E36B0 + arm_func_end TP_GetLatestRawPointInAuto + + arm_func_start TP_GetLatestIndexInAuto +TP_GetLatestIndexInAuto: ; 0x020DA4E4 + ldr r0, _020DA4F0 ; =_021E36B0 + ldrh r0, [r0, #0x10] + bx lr + .align 2, 0 +_020DA4F0: .word _021E36B0 + arm_func_end TP_GetLatestIndexInAuto + + arm_func_start TP_CalcCalibrateParam +TP_CalcCalibrateParam: ; 0x020DA4F4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + mov r8, r2 + cmp sb, #0x1000 + cmplo r8, #0x1000 + ldrloh r4, [sp, #0x2c] + mov r7, r3 + mov sl, r0 + cmplo r4, #0x1000 + ldrloh r3, [sp, #0x30] + cmplo r3, #0x1000 + movhs r0, #1 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0x100 + ldrloh r2, [sp, #0x34] + cmplo r2, #0x100 + ldrloh r1, [sp, #0x28] + cmplo r1, #0xc0 + ldrloh r0, [sp, #0x38] + cmplo r0, #0xc0 + movhs r0, #1 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, r2 + cmpne r1, r0 + cmpne sb, r4 + cmpne r8, r3 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl OS_DisableInterrupts + ldrh lr, [sp, #0x2c] + ldrh ip, [sp, #0x34] + ldr r3, _020DA6D8 ; =0x04000280 + sub r1, sb, lr + mov r2, #0 + ldrh r4, [sp, #0x38] + ldrh r5, [sp, #0x28] + ldrh r6, [sp, #0x30] + strh r2, [r3] + mov r1, r1, lsl #8 + str r1, [r3, #0x10] + sub r1, r7, ip + str r1, [r3, #0x18] + mov r1, r2 + sub r2, r5, r4 + str r1, [r3, #0x1c] + sub r1, r8, r6 + str r2, [sp] +_020DA5B0: + ldrh r2, [r3] + tst r2, #0x8000 + bne _020DA5B0 + mov fp, r1, lsl #8 + ldr r1, _020DA6DC ; =0x040002A0 + ldr r2, [r1] + mov r1, #0 + strh r1, [r3] + ldr r1, _020DA6DC ; =0x040002A0 + cmp r2, #0x8000 + str fp, [r1, #-0x10] + sub r3, r1, #8 + ldr r1, [sp] + mov fp, #0 + stmia r3, {r1, fp} + bge _020DA600 + mov r1, fp + sub r1, r1, #0x8000 + cmp r2, r1 + bge _020DA60C +_020DA600: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DA60C: + strh r2, [sl, #4] + ldrsh r2, [sl, #4] + add r1, r7, ip + add r3, sb, lr + mul r1, r2, r1 + rsb r1, r1, r3, lsl #8 + mov r1, r1, lsl #9 + mov r2, r1, asr #0x10 + cmp r2, #0x8000 + bge _020DA644 + mov r1, fp + sub r1, r1, #0x8000 + cmp r2, r1 + bge _020DA650 +_020DA644: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DA650: + ldr r1, _020DA6DC ; =0x040002A0 + strh r2, [sl] + sub r2, r1, #0x20 +_020DA65C: + ldrh r1, [r2] + tst r1, #0x8000 + bne _020DA65C + ldr r1, _020DA6DC ; =0x040002A0 + ldr r7, [r1] + bl OS_RestoreInterrupts + cmp r7, #0x8000 + bge _020DA68C + mov r1, #0x8000 + rsb r1, r1, #0 + cmp r7, r1 + bge _020DA694 +_020DA68C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DA694: + strh r7, [sl, #6] + ldrsh r2, [sl, #6] + add r0, r5, r4 + add r3, r8, r6 + mul r0, r2, r0 + rsb r0, r0, r3, lsl #8 + mov r0, r0, lsl #9 + mov r0, r0, asr #0x10 + cmp r0, #0x8000 + bge _020DA6C4 + cmp r0, r1 + bge _020DA6CC +_020DA6C4: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DA6CC: + strh r0, [sl, #2] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DA6D8: .word 0x04000280 +_020DA6DC: .word 0x040002A0 + arm_func_end TP_CalcCalibrateParam + + arm_func_start TP_GetCalibratedPoint +TP_GetCalibratedPoint: ; 0x020DA6E0 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020DA7FC ; =_021E36B0 + ldrh r2, [r2, #0x34] + cmp r2, #0 + bne _020DA718 + ldrh r3, [r1] + ldrh r2, [r1, #2] + strh r3, [r0] + strh r2, [r0, #2] + ldrh r2, [r1, #4] + ldrh r1, [r1, #6] + strh r2, [r0, #4] + strh r1, [r0, #6] + ldmia sp!, {r4, r5, r6, pc} +_020DA718: + ldrh r3, [r1, #4] + ldr r2, _020DA800 ; =_021E36CC + strh r3, [r0, #4] + ldrh r3, [r1, #6] + strh r3, [r0, #6] + ldrh r3, [r1, #4] + cmp r3, #0 + bne _020DA748 + mov r1, #0 + strh r1, [r0] + strh r1, [r0, #2] + ldmia sp!, {r4, r5, r6, pc} +_020DA748: + ldrh r4, [r1] + ldr r3, [r2] + ldr lr, [r2, #8] + mov r4, r4, lsl #2 + subs ip, r4, r3 + mov r3, r3, asr #0x1f + rsc r3, r3, r4, asr #31 + umull r6, r5, lr, ip + mla r5, lr, r3, r5 + mov r3, lr, asr #0x1f + mla r5, r3, ip, r5 + mov r3, r6, lsr #0x16 + orr r3, r3, r5, lsl #10 + strh r3, [r0] + ldrsh r3, [r0] + cmp r3, #0 + movlt r3, #0 + strlth r3, [r0] + blt _020DA7A0 + cmp r3, #0xff + movgt r3, #0xff + strgth r3, [r0] +_020DA7A0: + ldrh r3, [r1, #2] + ldr r1, [r2, #0xc] + ldr ip, [r2, #0x14] + mov r2, r3, lsl #2 + subs r3, r2, r1 + mov r1, r1, asr #0x1f + rsc r1, r1, r2, asr #31 + umull r4, lr, ip, r3 + mla lr, ip, r1, lr + mov r1, ip, asr #0x1f + mla lr, r1, r3, lr + mov r1, r4, lsr #0x16 + orr r1, r1, lr, lsl #10 + strh r1, [r0, #2] + ldrsh r1, [r0, #2] + cmp r1, #0 + movlt r1, #0 + strlth r1, [r0, #2] + ldmltia sp!, {r4, r5, r6, pc} + cmp r1, #0xbf + movgt r1, #0xbf + strgth r1, [r0, #2] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DA7FC: .word _021E36B0 +_020DA800: .word _021E36CC + arm_func_end TP_GetCalibratedPoint + + arm_func_start TP_WaitBusy +TP_WaitBusy: ; 0x020DA804 + ldr r1, _020DA818 ; =_021E36B0 +_020DA808: + ldrh r2, [r1, #0x3a] + tst r2, r0 + bne _020DA808 + bx lr + .align 2, 0 +_020DA818: .word _021E36B0 + arm_func_end TP_WaitBusy + + arm_func_start TP_CheckBusy +TP_CheckBusy: ; 0x020DA81C + ldr r1, _020DA82C ; =_021E36B0 + ldrh r1, [r1, #0x38] + and r0, r1, r0 + bx lr + .align 2, 0 +_020DA82C: .word _021E36B0 + arm_func_end TP_CheckBusy + + arm_func_start MIC_Init +MIC_Init: ; 0x020DA830 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020DA894 ; =_021E36EC + ldrh r1, [r0] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + strh r1, [r0] + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #8] + bl PXI_Init + mov r5, #9 + mov r4, #1 +_020DA864: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020DA864 + ldr r2, _020DA898 ; =0x027FFF90 + mov r3, #0 + ldr r1, _020DA89C ; =MicCommonCallback + mov r0, #9 + str r3, [r2] + bl PXI_SetFifoRecvCallback + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DA894: .word _021E36EC +_020DA898: .word 0x027FFF90 +_020DA89C: .word MicCommonCallback + arm_func_end MIC_Init + + arm_func_start MIC_StartAutoSamplingAsync +MIC_StartAutoSamplingAsync: ; 0x020DA8A0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r0, [r7, #4] + mov r6, r1 + tst r0, #0x1f + mov r5, r2 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #8] + tst r0, #0x1f + movne r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7, #0xc] + cmp r0, #0x400 + movlo r0, #2 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r7] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _020DA944 +_020DA8FC: ; jump table + b _020DA914 ; case 0 + b _020DA91C ; case 1 + b _020DA924 ; case 2 + b _020DA92C ; case 3 + b _020DA934 ; case 4 + b _020DA93C ; case 5 +_020DA914: + mov r1, #0 + b _020DA94C +_020DA91C: + mov r1, #1 + b _020DA94C +_020DA924: + mov r1, #2 + b _020DA94C +_020DA92C: + mov r1, #3 + b _020DA94C +_020DA934: + mov r1, #5 + b _020DA94C +_020DA93C: + mov r1, #7 + b _020DA94C +_020DA944: + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020DA94C: + ldr r0, [r7, #0x10] + cmp r0, #0 + orrne r0, r1, #0x10 + andne r0, r0, #0xff + andeq r0, r1, #0xff + and r4, r0, #0xff + bl OS_DisableInterrupts + ldr r1, _020DA9C8 ; =_021E36EC + ldr r2, [r1, #4] + cmp r2, #0 + beq _020DA984 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020DA984: + mov r2, #1 + str r2, [r1, #4] + bl OS_RestoreInterrupts + ldr r0, _020DA9C8 ; =_021E36EC + mov r3, r4 + str r6, [r0, #8] + str r5, [r0, #0xc] + ldr r1, [r7, #0x14] + str r1, [r0, #0x14] + ldr r1, [r7, #0x18] + str r1, [r0, #0x18] + ldmib r7, {r0, r1, r2} + bl MicStartAutoSampling + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DA9C8: .word _021E36EC + arm_func_end MIC_StartAutoSamplingAsync + + arm_func_start MIC_StartAutoSampling +MIC_StartAutoSampling: ; 0x020DA9CC + stmdb sp!, {r3, lr} + ldr r1, _020DA9FC ; =MicGetResultCallback + mov r2, #0 + bl MIC_StartAutoSamplingAsync + ldr r1, _020DAA00 ; =_021E36EC + cmp r0, #0 + str r0, [r1, #0x10] + bne _020DA9F0 + bl MicWaitBusy +_020DA9F0: + ldr r0, _020DAA00 ; =_021E36EC + ldr r0, [r0, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DA9FC: .word MicGetResultCallback +_020DAA00: .word _021E36EC + arm_func_end MIC_StartAutoSampling + + arm_func_start MIC_StopAutoSamplingAsync +MIC_StopAutoSamplingAsync: ; 0x020DAA04 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl OS_DisableInterrupts + ldr r1, _020DAA5C ; =_021E36EC + ldr r2, [r1, #4] + cmp r2, #0 + beq _020DAA30 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020DAA30: + mov r2, #1 + str r2, [r1, #4] + bl OS_RestoreInterrupts + ldr r0, _020DAA5C ; =_021E36EC + str r5, [r0, #8] + str r4, [r0, #0xc] + bl MicStopAutoSampling + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DAA5C: .word _021E36EC + arm_func_end MIC_StopAutoSamplingAsync + + arm_func_start MIC_StopAutoSampling +MIC_StopAutoSampling: ; 0x020DAA60 + stmdb sp!, {r3, lr} + ldr r0, _020DAA90 ; =MicGetResultCallback + mov r1, #0 + bl MIC_StopAutoSamplingAsync + ldr r1, _020DAA94 ; =_021E36EC + cmp r0, #0 + str r0, [r1, #0x10] + bne _020DAA84 + bl MicWaitBusy +_020DAA84: + ldr r0, _020DAA94 ; =_021E36EC + ldr r0, [r0, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DAA90: .word MicGetResultCallback +_020DAA94: .word _021E36EC + arm_func_end MIC_StopAutoSampling + + arm_func_start MIC_GetLastSamplingAddress +MIC_GetLastSamplingAddress: ; 0x020DAA98 + ldr r0, _020DAAA4 ; =0x027FFF90 + ldr r0, [r0] + bx lr + .align 2, 0 +_020DAAA4: .word 0x027FFF90 + arm_func_end MIC_GetLastSamplingAddress + + arm_func_start MicCommonCallback +MicCommonCallback: ; 0x020DAAA8 + stmdb sp!, {r4, lr} + mov r4, r1 + cmp r2, #0 + beq _020DAAF0 + ldr r0, _020DABC8 ; =_021E36EC + ldr r1, [r0, #4] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #4] + ldr r0, _020DABC8 ; =_021E36EC + ldr r2, [r0, #8] + cmp r2, #0 + beq _020DAAF0 + mov r1, #0 + str r1, [r0, #8] + ldr r1, [r0, #0xc] + mov r0, #6 + blx r2 +_020DAAF0: + and r0, r4, #0x7f00 + and r1, r4, #0xff + mov r0, r0, lsl #8 + cmp r1, #4 + mov r2, r0, lsr #0x10 + addls pc, pc, r1, lsl #2 + b _020DAB48 +_020DAB0C: ; jump table + b _020DAB20 ; case 0 + b _020DAB28 ; case 1 + b _020DAB30 ; case 2 + b _020DAB38 ; case 3 + b _020DAB40 ; case 4 +_020DAB20: + mov r0, #0 + b _020DAB4C +_020DAB28: + mov r0, #4 + b _020DAB4C +_020DAB30: + mov r0, #2 + b _020DAB4C +_020DAB38: + mov r0, #5 + b _020DAB4C +_020DAB40: + mov r0, #1 + b _020DAB4C +_020DAB48: + mov r0, #6 +_020DAB4C: + cmp r2, #0x51 + bne _020DAB70 + ldr r1, _020DABC8 ; =_021E36EC + ldr r2, [r1, #0x14] + cmp r2, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r1, #0x18] + blx r2 + ldmia sp!, {r4, pc} +_020DAB70: + cmp r2, #0x40 + bne _020DAB90 + ldr r1, _020DABC8 ; =_021E36EC + ldr r2, [r1, #0x1c] + cmp r2, #0 + ldrne r1, _020DABCC ; =0x027FFF94 + ldrneh r1, [r1] + strneh r1, [r2] +_020DAB90: + ldr r1, _020DABC8 ; =_021E36EC + ldr r2, [r1, #4] + cmp r2, #0 + movne r2, #0 + strne r2, [r1, #4] + ldr r1, _020DABC8 ; =_021E36EC + ldr r3, [r1, #8] + cmp r3, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0 + str r2, [r1, #8] + ldr r1, [r1, #0xc] + blx r3 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DABC8: .word _021E36EC +_020DABCC: .word 0x027FFF94 + arm_func_end MicCommonCallback + + arm_func_start MicStartAutoSampling +MicStartAutoSampling: ; 0x020DABD0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + orr r1, r3, #0x4100 + mov r6, r0 + mov r4, r2 + orr r1, r1, #0x2000000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + mov r0, r6, lsr #0x10 + orr r1, r0, #0x10000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + mov r0, r6, lsl #0x10 + mov r0, r0, lsr #0x10 + orr r1, r0, #0x20000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + mov r0, r5, lsr #0x10 + orr r1, r0, #0x30000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + orr r1, r0, #0x40000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + mov r0, r4, lsr #0x10 + orr r1, r0, #0x50000 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, pc} + ldr r1, _020DACD0 ; =0x01060000 + mov r0, r4, lsl #0x10 + orr r1, r1, r0, lsr #16 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DACD0: .word 0x01060000 + arm_func_end MicStartAutoSampling + + arm_func_start MicStopAutoSampling +MicStopAutoSampling: ; 0x020DACD4 + stmdb sp!, {r3, lr} + ldr r1, _020DACF8 ; =0x03004200 + mov r0, #9 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DACF8: .word 0x03004200 + arm_func_end MicStopAutoSampling + + arm_func_start MicGetResultCallback +MicGetResultCallback: ; 0x020DACFC + ldr r1, _020DAD08 ; =_021E36EC + str r0, [r1, #0x10] + bx lr + .align 2, 0 +_020DAD08: .word _021E36EC + arm_func_end MicGetResultCallback + + arm_func_start MicWaitBusy +MicWaitBusy: ; 0x020DAD0C + ldr ip, _020DAD20 ; =_021E36F0 +_020DAD10: + ldr r0, [ip] + cmp r0, #1 + beq _020DAD10 + bx lr + .align 2, 0 +_020DAD20: .word _021E36F0 + arm_func_end MicWaitBusy + + arm_func_start PMi_Lock +PMi_Lock: ; 0x020DAD24 + stmdb sp!, {r3, lr} + bl OS_DisableInterrupts + ldr r1, _020DAD5C ; =_021E370C + ldr r2, [r1, #0x1c] + cmp r2, #0 + beq _020DAD48 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, pc} +_020DAD48: + mov r2, #1 + str r2, [r1, #0x1c] + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DAD5C: .word _021E370C + arm_func_end PMi_Lock + + arm_func_start PMi_WaitBusy +PMi_WaitBusy: ; 0x020DAD60 + stmdb sp!, {r4, lr} + ldr r0, _020DAD98 ; =_021E370C + ldr r4, _020DAD9C ; =_021E3728 + ldr r0, [r0, #0x1c] + cmp r0, #0 + ldmeqia sp!, {r4, pc} +_020DAD78: + bl OS_GetCpsrIrq + cmp r0, #0x80 + bne _020DAD88 + bl PXIi_HandlerRecvFifoNotEmpty +_020DAD88: + ldr r0, [r4] + cmp r0, #0 + bne _020DAD78 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DAD98: .word _021E370C +_020DAD9C: .word _021E3728 + arm_func_end PMi_WaitBusy + + arm_func_start PMi_DummyCallback +PMi_DummyCallback: ; 0x020DADA0 + str r0, [r1] + bx lr + arm_func_end PMi_DummyCallback + + arm_func_start PMi_CallCallbackAndUnlock +PMi_CallCallbackAndUnlock: ; 0x020DADA8 + stmdb sp!, {r3, lr} + ldr r2, _020DADE4 ; =_021E370C + ldr r1, [r2, #0x1c] + ldr ip, [r2, #0x20] + cmp r1, #0 + ldr r1, [r2, #0x24] + movne r3, #0 + strne r3, [r2, #0x1c] + cmp ip, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _020DADE4 ; =_021E370C + mov r3, #0 + str r3, [r2, #0x20] + blx ip + ldmia sp!, {r3, pc} + .align 2, 0 +_020DADE4: .word _021E370C + arm_func_end PMi_CallCallbackAndUnlock + + arm_func_start PM_Init +PM_Init: ; 0x020DADE8 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020DAE78 ; =_021E370C + ldrh r1, [r0] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + strh r1, [r0] + mov r1, #0 + str r1, [r0, #0x1c] + str r1, [r0, #0x20] + bl PXI_Init + mov r5, #8 + mov r4, #1 +_020DAE1C: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020DAE1C + ldr r1, _020DAE7C ; =PMi_CommonCallback + mov r0, #8 + bl PXI_SetFifoRecvCallback + mov r3, #0 + ldr r0, _020DAE80 ; =_021E3750 + mov r2, r3 +_020DAE48: + mov r1, r3, lsl #3 + add r3, r3, #1 + strh r2, [r0, r1] + cmp r3, #5 + blt _020DAE48 + ldr r0, _020DAE84 ; =_021E3738 + bl OS_InitMutex + ldr r1, _020DAE88 ; =0x027FFC3C + ldr r0, _020DAE78 ; =_021E370C + ldr r1, [r1] + str r1, [r0, #0x10] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DAE78: .word _021E370C +_020DAE7C: .word PMi_CommonCallback +_020DAE80: .word _021E3750 +_020DAE84: .word _021E3738 +_020DAE88: .word 0x027FFC3C + arm_func_end PM_Init + + arm_func_start PMi_CommonCallback +PMi_CommonCallback: ; 0x020DAE8C + stmdb sp!, {r3, lr} + cmp r2, #0 + beq _020DAEA4 + mov r0, #2 + bl PMi_CallCallbackAndUnlock + ldmia sp!, {r3, pc} +_020DAEA4: + and r0, r1, #0x7f00 + mov r0, r0, lsl #8 + mov r2, r0, lsr #0x10 + and r0, r1, #0xff + cmp r2, #0x70 + blo _020DAEF4 + cmp r2, #0x74 + bhi _020DAEF4 + ldr r1, _020DAF48 ; =_021E3754 + sub r2, r2, #0x70 + ldr r1, [r1, r2, lsl #3] + and r0, r0, #0xff + cmp r1, #0 + strneh r0, [r1] + mov r1, r2, lsl #3 + ldr r0, _020DAF4C ; =_021E3750 + mov r2, #1 + strh r2, [r0, r1] + mov r0, #0 + b _020DAF40 +_020DAEF4: + cmp r2, #0x60 + bne _020DAF0C + ldr r1, _020DAF50 ; =_021E370C + mov r2, #1 + str r2, [r1, #4] + b _020DAF40 +_020DAF0C: + cmp r2, #0x62 + bne _020DAF24 + ldr r1, _020DAF50 ; =_021E370C + mov r2, #1 + str r2, [r1, #8] + b _020DAF40 +_020DAF24: + cmp r2, #0x67 + bne _020DAF40 + ldr r1, _020DAF50 ; =_021E370C + ldr r1, [r1, #0x28] + cmp r1, #0 + strne r0, [r1] + mov r0, #0 +_020DAF40: + bl PMi_CallCallbackAndUnlock + ldmia sp!, {r3, pc} + .align 2, 0 +_020DAF48: .word _021E3754 +_020DAF4C: .word _021E3750 +_020DAF50: .word _021E370C + arm_func_end PMi_CommonCallback + + arm_func_start PMi_SendSleepStart +PMi_SendSleepStart: ; 0x020DAF54 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _020DAFDC ; =_021E370C + mov r2, #0 + ldr r0, _020DAFE0 ; =0x03006000 + str r2, [r1, #4] + bl PMi_SendPxiData + ldr r0, _020DAFDC ; =_021E370C +_020DAF88: + ldr r1, [r0, #4] + cmp r1, #0 + beq _020DAF88 + ldr ip, _020DAFDC ; =_021E370C + mov r0, #0 + str r0, [ip, #4] + mov r2, r0 + mov r1, #2 + mov r3, #1 + str r0, [ip, #8] + bl PMi_SetLCDPower + and r0, r5, #0xff + orr r0, r0, #0x6100 + orr r0, r0, #0x2000000 + bl PMi_SendPxiData + ldr r1, _020DAFE4 ; =0x01010000 + mov r0, r4, lsl #0x10 + orr r0, r1, r0, lsr #16 + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DAFDC: .word _021E370C +_020DAFE0: .word 0x03006000 +_020DAFE4: .word 0x01010000 + arm_func_end PMi_SendSleepStart + + arm_func_start PM_SendUtilityCommandAsync +PM_SendUtilityCommandAsync: ; 0x020DAFE8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6, lsr #0x10 + and r0, r0, #0xff + ldr r1, _020DB040 ; =_021E370C + orr r0, r0, #0x6300 + str r5, [r1, #0x20] + orr r0, r0, #0x2000000 + str r4, [r1, #0x24] + bl PMi_SendPxiData + ldr r1, _020DB044 ; =0x01010000 + mov r0, r6, lsl #0x10 + orr r0, r1, r0, lsr #16 + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DB040: .word _021E370C +_020DB044: .word 0x01010000 + arm_func_end PM_SendUtilityCommandAsync + + arm_func_start PMi_ReadRegisterAsync +PMi_ReadRegisterAsync: ; 0x020DB048 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r4, r1 + mov r7, r2 + mov r6, r3 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _020DB0A8 ; =_021E370C + and r0, r5, #0xff + str r7, [r1, #0x20] + orr r0, r0, #0x6500 + ldr r2, _020DB0AC ; =_021E3750 + str r6, [r1, #0x24] + mov r3, r5, lsl #3 + mov ip, #0 + ldr r1, _020DB0B0 ; =_021E3754 + strh ip, [r2, r3] + orr r0, r0, #0x3000000 + str r4, [r1, r5, lsl #3] + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DB0A8: .word _021E370C +_020DB0AC: .word _021E3750 +_020DB0B0: .word _021E3754 + arm_func_end PMi_ReadRegisterAsync + + arm_func_start PMi_ReadRegister +PMi_ReadRegister: ; 0x020DB0B4 + stmdb sp!, {r3, lr} + ldr r2, _020DB0D8 ; =PMi_DummyCallback + add r3, sp, #0 + bl PMi_ReadRegisterAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB0D8: .word PMi_DummyCallback + arm_func_end PMi_ReadRegister + + arm_func_start PMi_WriteRegisterAsync +PMi_WriteRegisterAsync: ; 0x020DB0DC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + and r0, r7, #0xff + ldr r1, _020DB134 ; =_021E370C + orr r0, r0, #0x6400 + str r5, [r1, #0x20] + orr r0, r0, #0x2000000 + str r4, [r1, #0x24] + bl PMi_SendPxiData + ldr r1, _020DB138 ; =0x01010000 + mov r0, r6, lsl #0x10 + orr r0, r1, r0, lsr #16 + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DB134: .word _021E370C +_020DB138: .word 0x01010000 + arm_func_end PMi_WriteRegisterAsync + + arm_func_start PMi_WriteRegister +PMi_WriteRegister: ; 0x020DB13C + stmdb sp!, {r3, lr} + ldr r2, _020DB160 ; =PMi_DummyCallback + add r3, sp, #0 + bl PMi_WriteRegisterAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB160: .word PMi_DummyCallback + arm_func_end PMi_WriteRegister + + arm_func_start PMi_SetLEDAsync +PMi_SetLEDAsync: ; 0x020DB164 + stmdb sp!, {r3, lr} + cmp r0, #1 + beq _020DB184 + cmp r0, #2 + beq _020DB194 + cmp r0, #3 + beq _020DB18C + b _020DB19C +_020DB184: + mov r0, #1 + b _020DB1A0 +_020DB18C: + mov r0, #2 + b _020DB1A0 +_020DB194: + mov r0, #3 + b _020DB1A0 +_020DB19C: + mov r0, #0 +_020DB1A0: + cmp r0, #0 + ldreq r0, _020DB1B4 ; =0x0000FFFF + ldmeqia sp!, {r3, pc} + bl PM_SendUtilityCommandAsync + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB1B4: .word 0x0000FFFF + arm_func_end PMi_SetLEDAsync + + arm_func_start PMi_SetLED +PMi_SetLED: ; 0x020DB1B8 + stmdb sp!, {r3, lr} + ldr r1, _020DB1DC ; =PMi_DummyCallback + add r2, sp, #0 + bl PMi_SetLEDAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB1DC: .word PMi_DummyCallback + arm_func_end PMi_SetLED + + arm_func_start PM_SetBackLightAsync +PM_SetBackLightAsync: ; 0x020DB1E0 + stmdb sp!, {r3, lr} + cmp r0, #0 + mov ip, #0 + bne _020DB204 + cmp r1, #1 + moveq ip, #6 + cmp r1, #0 + moveq ip, #7 + b _020DB238 +_020DB204: + cmp r0, #1 + bne _020DB220 + cmp r1, #1 + moveq ip, #4 + cmp r1, #0 + moveq ip, #5 + b _020DB238 +_020DB220: + cmp r0, #2 + bne _020DB238 + cmp r1, #1 + moveq ip, #8 + cmp r1, #0 + moveq ip, #9 +_020DB238: + cmp ip, #0 + ldreq r0, _020DB258 ; =0x0000FFFF + ldmeqia sp!, {r3, pc} + mov r1, r2 + mov r0, ip + mov r2, r3 + bl PM_SendUtilityCommandAsync + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB258: .word 0x0000FFFF + arm_func_end PM_SetBackLightAsync + + arm_func_start PM_SetBackLight +PM_SetBackLight: ; 0x020DB25C + stmdb sp!, {r3, lr} + ldr r2, _020DB280 ; =PMi_DummyCallback + add r3, sp, #0 + bl PM_SetBackLightAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB280: .word PMi_DummyCallback + arm_func_end PM_SetBackLight + + arm_func_start PM_ForceToPowerOffAsync +PM_ForceToPowerOffAsync: ; 0x020DB284 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + ldr r0, _020DB32C ; =0x00996A00 + mov r6, r1 + bl OS_SpinWait + bl PM_GetLCDPower + cmp r0, #1 + beq _020DB314 + add r0, sp, #4 + add r1, sp, #0 + bl PM_GetBackLight + ldr r0, [sp, #4] + cmp r0, #0 + beq _020DB2CC + mov r0, #0 + mov r1, r0 + bl PM_SetBackLight +_020DB2CC: + ldr r0, [sp] + cmp r0, #0 + beq _020DB2E4 + mov r0, #1 + mov r1, #0 + bl PM_SetBackLight +_020DB2E4: + mov r0, #1 + bl PM_SetLCDPower + cmp r0, #0 + bne _020DB314 + ldr r5, _020DB32C ; =0x00996A00 + mov r4, #1 +_020DB2FC: + mov r0, r5 + bl OS_SpinWait + mov r0, r4 + bl PM_SetLCDPower + cmp r0, #0 + beq _020DB2FC +_020DB314: + mov r1, r7 + mov r2, r6 + mov r0, #0xe + bl PM_SendUtilityCommandAsync + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DB32C: .word 0x00996A00 + arm_func_end PM_ForceToPowerOffAsync + + arm_func_start PM_ForceToPowerOff +PM_ForceToPowerOff: ; 0x020DB330 + stmdb sp!, {r3, lr} + ldr r0, _020DB354 ; =PMi_DummyCallback + add r1, sp, #0 + bl PM_ForceToPowerOffAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB354: .word PMi_DummyCallback + arm_func_end PM_ForceToPowerOff + + arm_func_start PM_SetAmp +PM_SetAmp: ; 0x020DB358 + ldr r1, _020DB368 ; =_021E370C + ldr ip, _020DB36C ; =PMi_SetAmp + str r0, [r1, #0x14] + bx ip + .align 2, 0 +_020DB368: .word _021E370C +_020DB36C: .word PMi_SetAmp + arm_func_end PM_SetAmp + + arm_func_start PMi_SetAmp +PMi_SetAmp: ; 0x020DB370 + stmdb sp!, {r4, lr} + mov r4, r0 + bl PM_GetLCDPower + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, #2 + bl PMi_WriteRegister + ldmia sp!, {r4, pc} + arm_func_end PMi_SetAmp + + arm_func_start PM_SetAmpGain +PM_SetAmpGain: ; 0x020DB39C + ldr ip, _020DB3B0 ; =PMi_WriteRegister + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, #3 + bx ip + .align 2, 0 +_020DB3B0: .word PMi_WriteRegister + arm_func_end PM_SetAmpGain + + arm_func_start PM_GetBackLight +PM_GetBackLight: ; 0x020DB3B4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + add r1, sp, #0 + mov r0, #0 + bl PMi_ReadRegister + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r5, #0 + beq _020DB3F0 + ldrh r1, [sp] + tst r1, #8 + movne r1, #1 + moveq r1, #0 + str r1, [r5] +_020DB3F0: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrh r1, [sp] + tst r1, #4 + movne r1, #1 + moveq r1, #0 + str r1, [r4] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end PM_GetBackLight + + arm_func_start PMi_SendPxiData +PMi_SendPxiData: ; 0x020DB410 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, #8 + mov r4, #0 +_020DB420: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _020DB420 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end PMi_SendPxiData + + arm_func_start PM_GoSleepMode +PM_GoSleepMode: ; 0x020DB43C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + ldr r3, _020DB660 ; =_021E370C + mov sl, r0 + ldr r0, [r3, #0xc] + mov sb, r1 + mov fp, r2 + mov r4, #0 + bl PMi_ExecuteList + ldr r1, _020DB664 ; =0x04000208 + mov r0, r4 + ldrh r8, [r1] + strh r0, [r1] + bl OS_DisableInterrupts + str r0, [sp, #8] + ldr r0, _020DB668 ; =0x003FFFFF + bl OS_DisableIrqMask + str r0, [sp, #4] + bl OS_IsTickAvailable + cmp r0, #0 + movne r0, #8 + moveq r0, r4 + orr r0, r0, #0x40000 + bl OS_SetIrqMask + ldr r0, [sp, #8] + bl OS_RestoreInterrupts + ldr r2, _020DB664 ; =0x04000208 + mov r0, #1 + ldrh r1, [r2] + tst sl, #8 + strh r0, [r2] + beq _020DB4CC + ldr r0, _020DB66C ; =0x027FFC40 + ldrh r0, [r0] + cmp r0, #2 + biceq sl, sl, #8 +_020DB4CC: + tst sl, #0x10 + beq _020DB4E0 + bl CTRDG_IsExisting + cmp r0, #0 + biceq sl, sl, #0x10 +_020DB4E0: + mov r1, #0x4000000 + add r0, r1, #0x1000 + ldr r5, [r1] + ldr r6, [r0] + bl PM_GetLCDPower + str r0, [sp] + add r0, sp, #0x14 + add r1, sp, #0x10 + bl PM_GetBackLight + mov r0, #2 + mov r1, #0 + bl PM_SetBackLight + ldr r2, _020DB670 ; =0x027FFC3C + ldr r0, [r2] + str r0, [sp, #0xc] +_020DB51C: + ldr r1, [r2] + ldr r0, [sp, #0xc] + cmp r0, r1 + beq _020DB51C + ldr r0, [r2] + mov r2, #0x4000000 + str r0, [sp, #0xc] + ldr r0, [r2] + add r1, r2, #0x1000 + bic r0, r0, #0x30000 + str r0, [r2] + ldr r0, [r1] + bic r0, r0, #0x10000 + str r0, [r1] + ldr r2, _020DB670 ; =0x027FFC3C +_020DB558: + ldr r1, [r2] + ldr r0, [sp, #0xc] + cmp r0, r1 + beq _020DB558 + ldr r0, [r2] + str r0, [sp, #0xc] + ldr r2, _020DB670 ; =0x027FFC3C +_020DB574: + ldr r1, [r2] + ldr r0, [sp, #0xc] + cmp r0, r1 + beq _020DB574 + ldr r0, [sp, #0x14] + ldr r1, [sp, #0x10] + orr r0, sl, r0, lsl #5 + orr r0, r0, r1, lsl #6 + mov r0, r0, lsl #0x10 + mov r7, r0, lsr #0x10 + orr r0, sb, fp + mov r0, r0, lsl #0x10 + mov sb, r0, lsr #0x10 +_020DB5A8: + mov r0, r7 + mov r1, sb + bl PMi_SendSleepStart + cmp r0, #0 + bne _020DB5A8 + bl OS_Halt + tst sl, #8 + beq _020DB5D8 + ldr r0, _020DB674 ; =0x04000214 + ldr r0, [r0] + tst r0, #0x100000 + movne r4, #1 +_020DB5D8: + cmp r4, #0 + bne _020DB618 + ldr r0, [sp] + cmp r0, #1 + mov r0, #1 + bne _020DB604 + mov r1, r0 + mov r2, r0 + mov r3, r0 + bl PMi_SetLCDPower + b _020DB608 +_020DB604: + bl PMi_SetLED +_020DB608: + mov r0, #0x4000000 + str r5, [r0] + add r0, r0, #0x1000 + str r6, [r0] +_020DB618: + ldr r0, _020DB678 ; =0x00708100 + bl OS_SpinWait + bl OS_DisableInterrupts + ldr r0, [sp, #4] + bl OS_SetIrqMask + ldr r0, [sp, #8] + bl OS_RestoreInterrupts + ldr r1, _020DB664 ; =0x04000208 + cmp r4, #0 + ldrh r0, [r1] + strh r8, [r1] + beq _020DB64C + bl PM_ForceToPowerOff +_020DB64C: + ldr r0, _020DB660 ; =_021E370C + ldr r0, [r0, #0x18] + bl PMi_ExecuteList + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DB660: .word _021E370C +_020DB664: .word 0x04000208 +_020DB668: .word 0x003FFFFF +_020DB66C: .word 0x027FFC40 +_020DB670: .word 0x027FFC3C +_020DB674: .word 0x04000214 +_020DB678: .word 0x00708100 + arm_func_end PM_GoSleepMode + + arm_func_start PMi_SetLCDPower +PMi_SetLCDPower: ; 0x020DB67C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r4, r3 + cmp r0, #0 + beq _020DB70C + cmp r0, #1 + bne _020DB760 + cmp r2, #0 + bne _020DB6C0 + ldr r1, _020DB768 ; =0x027FFC3C + ldr r0, _020DB76C ; =_021E370C + ldr r1, [r1] + ldr r0, [r0, #0x10] + sub r0, r1, r0 + cmp r0, #7 + movls r0, #0 + ldmlsia sp!, {r3, r4, r5, pc} +_020DB6C0: + cmp r5, #0 + beq _020DB6EC + cmp r4, #0 + beq _020DB6DC + mov r0, r5 + bl PMi_SetLED + b _020DB6EC +_020DB6DC: + mov r1, #0 + mov r0, r5 + mov r2, r1 + bl PMi_SetLEDAsync +_020DB6EC: + ldr r2, _020DB770 ; =0x04000304 + ldr r0, _020DB76C ; =_021E370C + ldrh r1, [r2] + orr r1, r1, #1 + strh r1, [r2] + ldr r0, [r0, #0x14] + bl PMi_SetAmp + b _020DB760 +_020DB70C: + mov r0, #0 + bl PMi_SetAmp + ldr r3, _020DB770 ; =0x04000304 + ldr r1, _020DB768 ; =0x027FFC3C + ldrh r2, [r3] + ldr r0, _020DB76C ; =_021E370C + cmp r5, #0 + bic r2, r2, #1 + strh r2, [r3] + ldr r1, [r1] + str r1, [r0, #0x10] + beq _020DB760 + cmp r4, #0 + beq _020DB750 + mov r0, r5 + bl PMi_SetLED + b _020DB760 +_020DB750: + mov r1, #0 + mov r0, r5 + mov r2, r1 + bl PMi_SetLEDAsync +_020DB760: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DB768: .word 0x027FFC3C +_020DB76C: .word _021E370C +_020DB770: .word 0x04000304 + arm_func_end PMi_SetLCDPower + + arm_func_start PM_SetLCDPower +PM_SetLCDPower: ; 0x020DB774 + ldr ip, _020DB790 ; =PMi_SetLCDPower + mov r1, #0 + cmp r0, #1 + movne r0, #0 + mov r2, r1 + mov r3, #1 + bx ip + .align 2, 0 +_020DB790: .word PMi_SetLCDPower + arm_func_end PM_SetLCDPower + + arm_func_start PM_GetLCDPower +PM_GetLCDPower: ; 0x020DB794 + ldr r0, _020DB7AC ; =0x04000304 + ldrh r0, [r0] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + bx lr + .align 2, 0 +_020DB7AC: .word 0x04000304 + arm_func_end PM_GetLCDPower + + arm_func_start PMi_SendLEDPatternCommandAsync +PMi_SendLEDPatternCommandAsync: ; 0x020DB7B0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + and r0, r6, #0xff + ldr r1, _020DB7F4 ; =_021E370C + orr r0, r0, #0x6600 + str r5, [r1, #0x20] + orr r0, r0, #0x3000000 + str r4, [r1, #0x24] + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DB7F4: .word _021E370C + arm_func_end PMi_SendLEDPatternCommandAsync + + arm_func_start PMi_SendLEDPatternCommand +PMi_SendLEDPatternCommand: ; 0x020DB7F8 + stmdb sp!, {r3, lr} + ldr r1, _020DB81C ; =PMi_DummyCallback + add r2, sp, #0 + bl PMi_SendLEDPatternCommandAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB81C: .word PMi_DummyCallback + arm_func_end PMi_SendLEDPatternCommand + + arm_func_start PM_GetLEDPatternAsync +PM_GetLEDPatternAsync: ; 0x020DB820 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl PMi_Lock + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r1, _020DB860 ; =_021E370C + ldr r0, _020DB864 ; =0x03006700 + str r5, [r1, #0x20] + str r4, [r1, #0x24] + str r6, [r1, #0x28] + bl PMi_SendPxiData + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DB860: .word _021E370C +_020DB864: .word 0x03006700 + arm_func_end PM_GetLEDPatternAsync + + arm_func_start PM_GetLEDPattern +PM_GetLEDPattern: ; 0x020DB868 + stmdb sp!, {r3, lr} + ldr r1, _020DB88C ; =PMi_DummyCallback + add r2, sp, #0 + bl PM_GetLEDPatternAsync + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl PMi_WaitBusy + ldr r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DB88C: .word PMi_DummyCallback + arm_func_end PM_GetLEDPattern + + arm_func_start PMi_PrependList +PMi_PrependList: ; 0x020DB890 + cmp r0, #0 + ldrne r2, [r0] + strne r2, [r1, #8] + strne r1, [r0] + bx lr + arm_func_end PMi_PrependList + + arm_func_start PMi_AppendList +PMi_AppendList: ; 0x020DB8A4 + cmp r0, #0 + bxeq lr + ldr r2, [r0] + cmp r2, #0 + bne _020DB8C8 + mov r2, #0 + str r2, [r1, #8] + str r1, [r0] + bx lr +_020DB8C8: + ldr r0, [r2, #8] + cmp r0, #0 + beq _020DB8E4 +_020DB8D4: + mov r2, r0 + ldr r0, [r0, #8] + cmp r0, #0 + bne _020DB8D4 +_020DB8E4: + str r0, [r1, #8] + str r1, [r2, #8] + bx lr + arm_func_end PMi_AppendList + + arm_func_start PMi_DeleteList +PMi_DeleteList: ; 0x020DB8F0 + cmp r0, #0 + ldrne r2, [r0] + movne r3, r2 + cmpne r2, #0 + bxeq lr +_020DB904: + cmp r2, r1 + bne _020DB924 + cmp r2, r3 + ldreq r1, [r2, #8] + streq r1, [r0] + ldrne r0, [r2, #8] + strne r0, [r3, #8] + bx lr +_020DB924: + mov r3, r2 + ldr r2, [r2, #8] + cmp r2, #0 + bne _020DB904 + bx lr + arm_func_end PMi_DeleteList + + arm_func_start PMi_ExecuteList +PMi_ExecuteList: ; 0x020DB938 + stmdb sp!, {r4, lr} + movs r4, r0 + ldmeqia sp!, {r4, pc} +_020DB944: + ldr r0, [r4, #4] + ldr r1, [r4] + blx r1 + ldr r4, [r4, #8] + cmp r4, #0 + bne _020DB944 + ldmia sp!, {r4, pc} + arm_func_end PMi_ExecuteList + + arm_func_start PM_PrependPreSleepCallback +PM_PrependPreSleepCallback: ; 0x020DB960 + ldr ip, _020DB970 ; =PMi_PrependList + mov r1, r0 + ldr r0, _020DB974 ; =_021E3718 + bx ip + .align 2, 0 +_020DB970: .word PMi_PrependList +_020DB974: .word _021E3718 + arm_func_end PM_PrependPreSleepCallback + + arm_func_start PM_AppendPostSleepCallback +PM_AppendPostSleepCallback: ; 0x020DB978 + ldr ip, _020DB988 ; =PMi_AppendList + mov r1, r0 + ldr r0, _020DB98C ; =_021E3724 + bx ip + .align 2, 0 +_020DB988: .word PMi_AppendList +_020DB98C: .word _021E3724 + arm_func_end PM_AppendPostSleepCallback + + arm_func_start PM_DeletePreSleepCallback +PM_DeletePreSleepCallback: ; 0x020DB990 + ldr ip, _020DB9A0 ; =PMi_DeleteList + mov r1, r0 + ldr r0, _020DB9A4 ; =_021E3718 + bx ip + .align 2, 0 +_020DB9A0: .word PMi_DeleteList +_020DB9A4: .word _021E3718 + arm_func_end PM_DeletePreSleepCallback + + arm_func_start PM_DeletePostSleepCallback +PM_DeletePostSleepCallback: ; 0x020DB9A8 + ldr ip, _020DB9B8 ; =PMi_DeleteList + mov r1, r0 + ldr r0, _020DB9BC ; =_021E3724 + bx ip + .align 2, 0 +_020DB9B8: .word PMi_DeleteList +_020DB9BC: .word _021E3724 + arm_func_end PM_DeletePostSleepCallback + + arm_func_start RTC_Init +RTC_Init: ; 0x020DB9C0 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020DBA24 ; =_021E3778 + ldrh r1, [r0] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + strh r1, [r0] + mov r1, #0 + str r1, [r0, #0xc] + str r1, [r0, #0x10] + str r1, [r0, #0x28] + str r1, [r0, #0x14] + str r1, [r0, #0x18] + bl PXI_Init + mov r5, #5 + mov r4, #1 +_020DBA00: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020DBA00 + ldr r1, _020DBA28 ; =RtcCommonCallback + mov r0, #5 + bl PXI_SetFifoRecvCallback + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DBA24: .word _021E3778 +_020DBA28: .word RtcCommonCallback + arm_func_end RTC_Init + + arm_func_start RTC_GetDateAsync +RTC_GetDateAsync: ; 0x020DBA2C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl OS_DisableInterrupts + ldr r1, _020DBA98 ; =_021E3778 + ldr r2, [r1, #0xc] + cmp r2, #0 + beq _020DBA5C + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020DBA5C: + mov r2, #1 + str r2, [r1, #0xc] + bl OS_RestoreInterrupts + ldr r0, _020DBA98 ; =_021E3778 + mov r1, #0 + str r1, [r0, #0x20] + str r1, [r0, #0x24] + str r6, [r0, #0x14] + str r5, [r0, #0x10] + str r4, [r0, #0x1c] + bl RTCi_ReadRawDateAsync + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DBA98: .word _021E3778 + arm_func_end RTC_GetDateAsync + + arm_func_start RTC_GetDate +RTC_GetDate: ; 0x020DBA9C + stmdb sp!, {r3, lr} + ldr r1, _020DBACC ; =RtcGetResultCallback + mov r2, #0 + bl RTC_GetDateAsync + ldr r1, _020DBAD0 ; =_021E3778 + cmp r0, #0 + str r0, [r1, #0x2c] + bne _020DBAC0 + bl RtcWaitBusy +_020DBAC0: + ldr r0, _020DBAD0 ; =_021E3778 + ldr r0, [r0, #0x2c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DBACC: .word RtcGetResultCallback +_020DBAD0: .word _021E3778 + arm_func_end RTC_GetDate + + arm_func_start RTC_GetTimeAsync +RTC_GetTimeAsync: ; 0x020DBAD4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl OS_DisableInterrupts + ldr r1, _020DBB44 ; =_021E3778 + ldr r2, [r1, #0xc] + cmp r2, #0 + beq _020DBB04 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020DBB04: + mov r2, #1 + str r2, [r1, #0xc] + bl OS_RestoreInterrupts + ldr r0, _020DBB44 ; =_021E3778 + mov r1, #1 + str r1, [r0, #0x20] + mov r1, #0 + str r1, [r0, #0x24] + str r6, [r0, #0x14] + str r5, [r0, #0x10] + str r4, [r0, #0x1c] + bl RTCi_ReadRawTimeAsync + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DBB44: .word _021E3778 + arm_func_end RTC_GetTimeAsync + + arm_func_start RTC_GetTime +RTC_GetTime: ; 0x020DBB48 + stmdb sp!, {r3, lr} + ldr r1, _020DBB78 ; =RtcGetResultCallback + mov r2, #0 + bl RTC_GetTimeAsync + ldr r1, _020DBB7C ; =_021E3778 + cmp r0, #0 + str r0, [r1, #0x2c] + bne _020DBB6C + bl RtcWaitBusy +_020DBB6C: + ldr r0, _020DBB7C ; =_021E3778 + ldr r0, [r0, #0x2c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DBB78: .word RtcGetResultCallback +_020DBB7C: .word _021E3778 + arm_func_end RTC_GetTime + + arm_func_start RTC_GetDateTimeAsync +RTC_GetDateTimeAsync: ; 0x020DBB80 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl OS_DisableInterrupts + ldr r1, _020DBBF8 ; =_021E3778 + ldr r2, [r1, #0xc] + cmp r2, #0 + beq _020DBBB4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020DBBB4: + mov r2, #1 + str r2, [r1, #0xc] + bl OS_RestoreInterrupts + ldr r0, _020DBBF8 ; =_021E3778 + mov r1, #2 + str r1, [r0, #0x20] + mov r1, #0 + str r1, [r0, #0x24] + str r7, [r0, #0x14] + str r6, [r0, #0x18] + str r5, [r0, #0x10] + str r4, [r0, #0x1c] + bl RTCi_ReadRawDateTimeAsync + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DBBF8: .word _021E3778 + arm_func_end RTC_GetDateTimeAsync + + arm_func_start RTC_GetDateTime +RTC_GetDateTime: ; 0x020DBBFC + stmdb sp!, {r3, lr} + ldr r2, _020DBC2C ; =RtcGetResultCallback + mov r3, #0 + bl RTC_GetDateTimeAsync + ldr r1, _020DBC30 ; =_021E3778 + cmp r0, #0 + str r0, [r1, #0x2c] + bne _020DBC20 + bl RtcWaitBusy +_020DBC20: + ldr r0, _020DBC30 ; =_021E3778 + ldr r0, [r0, #0x2c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DBC2C: .word RtcGetResultCallback +_020DBC30: .word _021E3778 + arm_func_end RTC_GetDateTime + + arm_func_start RtcCommonCallback +RtcCommonCallback: ; 0x020DBC34 + stmdb sp!, {r3, r4, r5, lr} + cmp r2, #0 + beq _020DBC90 + ldr r0, _020DC174 ; =_021E3778 + ldr r1, [r0, #0x24] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #0x24] + ldr r0, _020DC174 ; =_021E3778 + ldr r1, [r0, #0xc] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #0xc] + ldr r0, _020DC174 ; =_021E3778 + ldr r2, [r0, #0x10] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, #0 + str r1, [r0, #0x10] + ldr r1, [r0, #0x1c] + mov r0, #6 + blx r2 + ldmia sp!, {r3, r4, r5, pc} +_020DBC90: + and r0, r1, #0x7f00 + mov r0, r0, lsr #8 + and r0, r0, #0xff + cmp r0, #0x30 + and r2, r1, #0xff + bne _020DBCC0 + ldr r0, _020DC174 ; =_021E3778 + ldr r0, [r0, #0x28] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + blx r0 + ldmia sp!, {r3, r4, r5, pc} +_020DBCC0: + cmp r2, #0 + bne _020DC0E4 + ldr r0, _020DC174 ; =_021E3778 + mov r4, #0 + ldr r1, [r0, #0x20] + cmp r1, #0xf + addls pc, pc, r1, lsl #2 + b _020DC0D0 +_020DBCE0: ; jump table + b _020DBD20 ; case 0 + b _020DBD7C ; case 1 + b _020DBDCC ; case 2 + b _020DC12C ; case 3 + b _020DC12C ; case 4 + b _020DC12C ; case 5 + b _020DBE74 ; case 6 + b _020DBEA4 ; case 7 + b _020DBEC8 ; case 8 + b _020DBF70 ; case 9 + b _020DC024 ; case 10 + b _020DC12C ; case 11 + b _020DC12C ; case 12 + b _020DC12C ; case 13 + b _020DC12C ; case 14 + b _020DC12C ; case 15 +_020DBD20: + ldr r1, _020DC178 ; =0x027FFDE8 + ldr r5, [r0, #0x14] + ldr r0, [r1] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x18 + bl RtcBCD2HEX + ldr r1, _020DC178 ; =0x027FFDE8 + str r0, [r5] + ldr r0, [r1] + mov r0, r0, lsl #0x13 + mov r0, r0, lsr #0x1b + bl RtcBCD2HEX + ldr r1, _020DC178 ; =0x027FFDE8 + str r0, [r5, #4] + ldr r0, [r1] + mov r0, r0, lsl #0xa + mov r0, r0, lsr #0x1a + bl RtcBCD2HEX + str r0, [r5, #8] + mov r0, r5 + bl RTC_GetDayOfWeek + str r0, [r5, #0xc] + b _020DC12C +_020DBD7C: + ldr r1, _020DC17C ; =0x027FFDEC + ldr r5, [r0, #0x14] + ldr r0, [r1] + mov r0, r0, lsl #0x1a + mov r0, r0, lsr #0x1a + bl RtcBCD2HEX + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5] + ldr r0, [r1] + mov r0, r0, lsl #0x11 + mov r0, r0, lsr #0x19 + bl RtcBCD2HEX + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5, #4] + ldr r0, [r1] + mov r0, r0, lsl #9 + mov r0, r0, lsr #0x19 + bl RtcBCD2HEX + str r0, [r5, #8] + b _020DC12C +_020DBDCC: + ldr r1, _020DC178 ; =0x027FFDE8 + ldr r5, [r0, #0x14] + ldr r0, [r1] + and r0, r0, #0xff + bl RtcBCD2HEX + ldr r1, _020DC178 ; =0x027FFDE8 + str r0, [r5] + ldr r0, [r1] + mov r0, r0, lsl #0x13 + mov r0, r0, lsr #0x1b + bl RtcBCD2HEX + ldr r1, _020DC178 ; =0x027FFDE8 + str r0, [r5, #4] + ldr r0, [r1] + mov r0, r0, lsl #0xa + mov r0, r0, lsr #0x1a + bl RtcBCD2HEX + str r0, [r5, #8] + mov r0, r5 + bl RTC_GetDayOfWeek + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5, #0xc] + ldr r0, [r1] + ldr r1, _020DC174 ; =_021E3778 + mov r0, r0, lsl #0x1a + mov r0, r0, lsr #0x1a + ldr r5, [r1, #0x18] + bl RtcBCD2HEX + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5] + ldr r0, [r1] + mov r0, r0, lsl #0x11 + mov r0, r0, lsr #0x19 + bl RtcBCD2HEX + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5, #4] + ldr r0, [r1] + mov r0, r0, lsl #9 + mov r0, r0, lsr #0x19 + bl RtcBCD2HEX + str r0, [r5, #8] + b _020DC12C +_020DBE74: + ldr r1, _020DC180 ; =0x027FFDEA + ldr r2, [r0, #0x14] + ldrh r0, [r1] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #4 + bne _020DBE9C + mov r0, #1 + str r0, [r2] + b _020DC12C +_020DBE9C: + str r4, [r2] + b _020DC12C +_020DBEA4: + ldr r1, _020DC180 ; =0x027FFDEA + ldr r2, [r0, #0x14] + ldrh r0, [r1] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + movne r0, #1 + strne r0, [r2] + streq r4, [r2] + b _020DC12C +_020DBEC8: + ldr r1, _020DC17C ; =0x027FFDEC + ldr r5, [r0, #0x14] + ldr r0, [r1] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1d + str r0, [r5] + ldr r0, [r1] + mov r0, r0, lsl #0x12 + mov r0, r0, lsr #0x1a + bl RtcBCD2HEX + ldr r1, _020DC17C ; =0x027FFDEC + str r0, [r5, #4] + ldr r0, [r1] + mov r0, r0, lsl #9 + mov r0, r0, lsr #0x19 + bl RtcBCD2HEX + str r0, [r5, #8] + mov r1, r4 + ldr r0, _020DC17C ; =0x027FFDEC + str r1, [r5, #0xc] + ldr r0, [r0] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1f + ldrne r0, [r5, #0xc] + addne r0, r0, #1 + strne r0, [r5, #0xc] + ldr r0, _020DC17C ; =0x027FFDEC + ldr r0, [r0] + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x1f + ldrne r0, [r5, #0xc] + addne r0, r0, #2 + strne r0, [r5, #0xc] + ldr r0, _020DC17C ; =0x027FFDEC + ldr r0, [r0] + mov r0, r0, lsl #8 + movs r0, r0, lsr #0x1f + beq _020DC12C + ldr r0, [r5, #0xc] + add r0, r0, #4 + str r0, [r5, #0xc] + b _020DC12C +_020DBF70: + ldr r3, [r0, #0x24] + cmp r3, #0 + bne _020DC01C + ldr r1, [r0, #0x14] + ldr r2, _020DC180 ; =0x027FFDEA + ldr r1, [r1] + cmp r1, #1 + ldrh r1, [r2] + bne _020DBFDC + mov r1, r1, lsl #0x1c + mov r1, r1, lsr #0x1c + cmp r1, #4 + beq _020DC12C + add r1, r3, #1 + str r1, [r0, #0x24] + ldrh r0, [r2] + bic r0, r0, #0xf + orr r0, r0, #4 + strh r0, [r2] + bl RTCi_WriteRawStatus2Async + cmp r0, #0 + bne _020DC12C + ldr r0, _020DC174 ; =_021E3778 + mov r1, r4 + str r1, [r0, #0x24] + mov r4, #3 + b _020DC12C +_020DBFDC: + mov r1, r1, lsl #0x1c + movs r1, r1, lsr #0x1c + beq _020DC12C + add r1, r3, #1 + str r1, [r0, #0x24] + ldrh r0, [r2] + bic r0, r0, #0xf + strh r0, [r2] + bl RTCi_WriteRawStatus2Async + cmp r0, #0 + bne _020DC12C + ldr r0, _020DC174 ; =_021E3778 + mov r1, r4 + str r1, [r0, #0x24] + mov r4, #3 + b _020DC12C +_020DC01C: + str r4, [r0, #0x24] + b _020DC12C +_020DC024: + ldr r3, [r0, #0x24] + cmp r3, #0 + bne _020DC0C8 + ldr r1, [r0, #0x14] + ldr r2, _020DC180 ; =0x027FFDEA + ldr r1, [r1] + cmp r1, #1 + ldrh r1, [r2] + bne _020DC088 + mov r1, r1, lsl #0x19 + movs r1, r1, lsr #0x1f + bne _020DC12C + add r1, r3, #1 + str r1, [r0, #0x24] + ldrh r0, [r2] + orr r0, r0, #0x40 + strh r0, [r2] + bl RTCi_WriteRawStatus2Async + cmp r0, #0 + bne _020DC12C + ldr r0, _020DC174 ; =_021E3778 + mov r1, r4 + str r1, [r0, #0x24] + mov r4, #3 + b _020DC12C +_020DC088: + mov r1, r1, lsl #0x19 + movs r1, r1, lsr #0x1f + beq _020DC12C + add r1, r3, #1 + str r1, [r0, #0x24] + ldrh r0, [r2] + bic r0, r0, #0x40 + strh r0, [r2] + bl RTCi_WriteRawStatus2Async + cmp r0, #0 + bne _020DC12C + ldr r0, _020DC174 ; =_021E3778 + mov r1, r4 + str r1, [r0, #0x24] + mov r4, #3 + b _020DC12C +_020DC0C8: + str r4, [r0, #0x24] + b _020DC12C +_020DC0D0: + ldr r0, _020DC174 ; =_021E3778 + mov r1, #0 + str r1, [r0, #0x24] + mov r4, #4 + b _020DC12C +_020DC0E4: + ldr r0, _020DC174 ; =_021E3778 + mov r1, #0 + str r1, [r0, #0x24] + cmp r2, #4 + addls pc, pc, r2, lsl #2 + b _020DC128 +_020DC0FC: ; jump table + b _020DC128 ; case 0 + b _020DC110 ; case 1 + b _020DC118 ; case 2 + b _020DC120 ; case 3 + b _020DC128 ; case 4 +_020DC110: + mov r4, #4 + b _020DC12C +_020DC118: + mov r4, #5 + b _020DC12C +_020DC120: + mov r4, #1 + b _020DC12C +_020DC128: + mov r4, #6 +_020DC12C: + ldr r0, _020DC174 ; =_021E3778 + ldr r1, [r0, #0x24] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r1, [r0, #0xc] + cmp r1, #0 + movne r1, #0 + strne r1, [r0, #0xc] + ldr r0, _020DC174 ; =_021E3778 + ldr r2, [r0, #0x10] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, #0 + str r1, [r0, #0x10] + ldr r1, [r0, #0x1c] + mov r0, r4 + blx r2 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DC174: .word _021E3778 +_020DC178: .word 0x027FFDE8 +_020DC17C: .word 0x027FFDEC +_020DC180: .word 0x027FFDEA + arm_func_end RtcCommonCallback + + arm_func_start RtcBCD2HEX +RtcBCD2HEX: ; 0x020DC184 + stmdb sp!, {r3, r4, r5, lr} + mov ip, #0 + mov r2, ip + mov r3, ip +_020DC194: + mov r1, r0, lsr r3 + and r1, r1, #0xf + cmp r1, #0xa + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, pc} + add r2, r2, #1 + cmp r2, #8 + add r3, r3, #4 + blt _020DC194 + mov r5, #0 + mov r4, r5 + mov lr, #1 + mov r2, #0xa +_020DC1C8: + mov r1, r0, lsr r4 + and r3, r1, #0xf + mul r1, lr, r2 + mla ip, lr, r3, ip + add r5, r5, #1 + mov lr, r1 + cmp r5, #8 + add r4, r4, #4 + blt _020DC1C8 + mov r0, ip + ldmia sp!, {r3, r4, r5, pc} + arm_func_end RtcBCD2HEX + + arm_func_start RtcGetResultCallback +RtcGetResultCallback: ; 0x020DC1F4 + ldr r1, _020DC200 ; =_021E3778 + str r0, [r1, #0x2c] + bx lr + .align 2, 0 +_020DC200: .word _021E3778 + arm_func_end RtcGetResultCallback + + arm_func_start RtcWaitBusy +RtcWaitBusy: ; 0x020DC204 + ldr ip, _020DC218 ; =_021E3784 +_020DC208: + ldr r0, [ip] + cmp r0, #1 + beq _020DC208 + bx lr + .align 2, 0 +_020DC218: .word _021E3784 + arm_func_end RtcWaitBusy + + arm_func_start RTCi_ReadRawDateTimeAsync +RTCi_ReadRawDateTimeAsync: ; 0x020DC21C + ldr ip, _020DC228 ; =RtcSendPxiCommand + mov r0, #0x10 + bx ip + .align 2, 0 +_020DC228: .word RtcSendPxiCommand + arm_func_end RTCi_ReadRawDateTimeAsync + + arm_func_start RTCi_ReadRawDateAsync +RTCi_ReadRawDateAsync: ; 0x020DC22C + ldr ip, _020DC238 ; =RtcSendPxiCommand + mov r0, #0x11 + bx ip + .align 2, 0 +_020DC238: .word RtcSendPxiCommand + arm_func_end RTCi_ReadRawDateAsync + + arm_func_start RTCi_ReadRawTimeAsync +RTCi_ReadRawTimeAsync: ; 0x020DC23C + ldr ip, _020DC248 ; =RtcSendPxiCommand + mov r0, #0x12 + bx ip + .align 2, 0 +_020DC248: .word RtcSendPxiCommand + arm_func_end RTCi_ReadRawTimeAsync + + arm_func_start RTCi_WriteRawStatus2Async +RTCi_WriteRawStatus2Async: ; 0x020DC24C + ldr ip, _020DC258 ; =RtcSendPxiCommand + mov r0, #0x27 + bx ip + .align 2, 0 +_020DC258: .word RtcSendPxiCommand + arm_func_end RTCi_WriteRawStatus2Async + + arm_func_start RtcSendPxiCommand +RtcSendPxiCommand: ; 0x020DC25C + stmdb sp!, {r3, lr} + mov r0, r0, lsl #8 + and r1, r0, #0x7f00 + mov r0, #5 + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + ldmia sp!, {r3, pc} + arm_func_end RtcSendPxiCommand + + arm_func_start RTC_ConvertDateToDay +RTC_ConvertDateToDay: ; 0x020DC284 + ldr r3, [r0] + cmp r3, #0x64 + bhs _020DC2D4 + ldr r2, [r0, #4] + cmp r2, #1 + blo _020DC2D4 + cmp r2, #0xc + bhi _020DC2D4 + ldr r1, [r0, #8] + cmp r1, #1 + blo _020DC2D4 + cmp r1, #0x1f + bhi _020DC2D4 + ldr r0, [r0, #0xc] + cmp r0, #7 + bge _020DC2D4 + cmp r2, #1 + blo _020DC2D4 + cmp r2, #0xc + bls _020DC2DC +_020DC2D4: + mvn r0, #0 + bx lr +_020DC2DC: + ldr r0, _020DC310 ; =_02110F88 - 4 + sub r1, r1, #1 + ldr r0, [r0, r2, lsl #2] + cmp r2, #3 + add r2, r1, r0 + blo _020DC2FC + tst r3, #3 + addeq r2, r2, #1 +_020DC2FC: + ldr r0, _020DC314 ; =0x0000016D + add r1, r3, #3 + mla r0, r3, r0, r2 + add r0, r0, r1, lsr #2 + bx lr + .align 2, 0 +_020DC310: .word _02110F88 - 4 +_020DC314: .word 0x0000016D + arm_func_end RTC_ConvertDateToDay + + arm_func_start RTCi_ConvertTimeToSecond +RTCi_ConvertTimeToSecond: ; 0x020DC318 + mov r1, #0x3c + ldmia r0, {r2, r3} + mla r3, r2, r1, r3 + ldr r0, [r0, #8] + mla r0, r3, r1, r0 + bx lr + arm_func_end RTCi_ConvertTimeToSecond + + arm_func_start RTC_ConvertDateTimeToSecond +RTC_ConvertDateTimeToSecond: ; 0x020DC330 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + bl RTC_ConvertDateToDay + mov r4, r0 + mvn r0, #0 + cmp r4, r0 + moveq r1, r0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl RTCi_ConvertTimeToSecond + mvn r2, #0 + cmp r0, r2 + moveq r1, r2 + beq _020DC388 + ldr r1, _020DC390 ; =0x00015180 + mov r2, #0 + umull ip, r3, r4, r1 + mla r3, r4, r2, r3 + mov r2, r4, asr #0x1f + mla r3, r2, r1, r3 + adds r2, r0, ip + adc r1, r3, r0, asr #31 +_020DC388: + mov r0, r2 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DC390: .word 0x00015180 + arm_func_end RTC_ConvertDateTimeToSecond + + arm_func_start RTC_ConvertDayToDate +RTC_ConvertDayToDate: ; 0x020DC394 + stmdb sp!, {r4, lr} + ldr r2, _020DC484 ; =0x00008EAC + cmp r1, #0 + movlt r1, #0 + cmp r1, r2 + movgt r1, r2 + ldr r3, _020DC488 ; =0x92492493 + add lr, r1, #6 + smull r2, r4, r3, lr + add r4, lr, r4 + mov r2, lr, lsr #0x1f + add r4, r2, r4, asr #2 + mov ip, #7 + smull r2, r3, ip, r4 + sub r4, lr, r2 + ldr r2, _020DC48C ; =0x0000016D + str r4, [r0, #0xc] + mov r3, #0 +_020DC3DC: + tst r3, #3 + addeq ip, r2, #1 + movne ip, r2 + mov r4, r1 + subs r1, r1, ip + movmi r1, r4 + bmi _020DC404 + add r3, r3, #1 + cmp r3, #0x63 + blo _020DC3DC +_020DC404: + ldr r2, _020DC48C ; =0x0000016D + str r3, [r0] + cmp r1, r2 + movgt r1, r2 + tst r3, #3 + bne _020DC448 + cmp r1, #0x3c + bge _020DC444 + cmp r1, #0x1f + movlt r2, #1 + subge r1, r1, #0x1f + movge r2, #2 + str r2, [r0, #4] + add r1, r1, #1 + str r1, [r0, #8] + ldmia sp!, {r4, pc} +_020DC444: + sub r1, r1, #1 +_020DC448: + ldr r3, _020DC490 ; =_02110F88 + mov r4, #0xb +_020DC450: + ldr r2, [r3, r4, lsl #2] + cmp r1, r2 + blt _020DC478 + add r2, r4, #1 + str r2, [r0, #4] + ldr r2, [r3, r4, lsl #2] + sub r1, r1, r2 + add r1, r1, #1 + str r1, [r0, #8] + ldmia sp!, {r4, pc} +_020DC478: + subs r4, r4, #1 + bpl _020DC450 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DC484: .word 0x00008EAC +_020DC488: .word 0x92492493 +_020DC48C: .word 0x0000016D +_020DC490: .word _02110F88 + arm_func_end RTC_ConvertDayToDate + + arm_func_start RTCi_ConvertSecondToTime +RTCi_ConvertSecondToTime: ; 0x020DC494 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020DC50C ; =0x0001517F + cmp r1, #0 + movlt r1, #0 + cmp r1, r2 + movgt r1, r2 + ldr lr, _020DC510 ; =0x88888889 + mov ip, r1, lsr #0x1f + smull r3, r2, lr, r1 + smull r3, r6, lr, r1 + add r2, r1, r2 + add r2, ip, r2, asr #5 + smull r3, r5, lr, r2 + smull r3, r4, lr, r2 + add r6, r1, r6 + add r6, ip, r6, asr #5 + mov lr, #0x3c + smull r3, ip, lr, r6 + sub r6, r1, r3 + add r5, r2, r5 + mov ip, r2, lsr #0x1f + add r5, ip, r5, asr #5 + smull r1, r3, lr, r5 + add r4, r2, r4 + str r6, [r0, #8] + sub r5, r2, r1 + str r5, [r0, #4] + add r4, ip, r4, asr #5 + str r4, [r0] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DC50C: .word 0x0001517F +_020DC510: .word 0x88888889 + arm_func_end RTCi_ConvertSecondToTime + + arm_func_start RTC_ConvertSecondToDateTime +RTC_ConvertSecondToDateTime: ; 0x020DC514 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r2 + mov r4, r3 + subs r2, r5, #0 + sbcs r2, r4, #0 + mov r2, #0 + mov r7, r0 + mov r6, r1 + movlt r5, r2 + movlt r4, r2 + blt _020DC554 + ldr r1, _020DC598 ; =0xBC19137F + subs r0, r1, r5 + sbcs r0, r2, r4 + movlt r5, r1 + movlt r4, r2 +_020DC554: + ldr r2, _020DC59C ; =0x00015180 + mov r0, r5 + mov r1, r4 + mov r3, #0 + bl _ll_mod + mov r1, r0 + mov r0, r6 + bl RTCi_ConvertSecondToTime + ldr r2, _020DC59C ; =0x00015180 + mov r0, r5 + mov r1, r4 + mov r3, #0 + bl _ll_sdiv + mov r1, r0 + mov r0, r7 + bl RTC_ConvertDayToDate + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DC598: .word 0xBC19137F +_020DC59C: .word 0x00015180 + arm_func_end RTC_ConvertSecondToDateTime + + arm_func_start RTC_GetDayOfWeek +RTC_GetDayOfWeek: ; 0x020DC5A0 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, [r0, #4] + ldr r2, [r0] + sub r1, r1, #2 + cmp r1, #1 + add ip, r2, #0x7d0 + sublt ip, ip, #1 + ldr r6, _020DC650 ; =0x51EB851F + ldr lr, [r0, #8] + smull r3, r2, r6, ip + smull r4, r3, r6, ip + mov r5, ip, lsr #0x1f + add r3, r5, r3, asr #5 + add r2, r5, r2, asr #5 + mov r5, #0x64 + smull r2, r4, r5, r2 + sub r2, ip, r2 + addlt r1, r1, #0xc + mov r0, #0x1a + mul r0, r1, r0 + sub r1, r0, #2 + ldr r0, _020DC654 ; =0x66666667 + mov r5, r1, lsr #0x1f + smull r1, ip, r0, r1 + add ip, r5, ip, asr #2 + mov r4, r2, asr #1 + add r0, lr, ip + add r1, r2, r4, lsr #30 + add r2, r2, r0 + mov r6, r3, asr #1 + add r0, r3, r6, lsr #30 + add r1, r2, r1, asr #2 + add r1, r1, r0, asr #2 + add r0, r3, r3, lsl #2 + add r4, r1, r0 + ldr r3, _020DC658 ; =0x92492493 + mov r1, r4, lsr #0x1f + smull r2, r0, r3, r4 + add r0, r4, r0 + add r0, r1, r0, asr #2 + mov r2, #7 + smull r0, r1, r2, r0 + sub r0, r4, r0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DC650: .word 0x51EB851F +_020DC654: .word 0x66666667 +_020DC658: .word 0x92492493 + arm_func_end RTC_GetDayOfWeek + + arm_func_start CARDi_SetTask +CARDi_SetTask: ; 0x020DC65C + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020DC694 ; =_021E3820 + mov r5, r0 + ldr r1, [r4, #0x108] + add r0, r4, #0x44 + bl OS_SetThreadPriority + ldr r1, [r4, #0x114] + add r0, r4, #0x44 + orr r1, r1, #8 + str r0, [r4, #0x104] + str r5, [r4, #0x40] + str r1, [r4, #0x114] + bl OS_WakeupThreadDirect + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DC694: .word _021E3820 + arm_func_end CARDi_SetTask + + arm_func_start CARDi_LockResource +CARDi_LockResource: ; 0x020DC698 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _020DC718 ; =_021E3820 + mov r8, r0 + mov r7, r1 + bl OS_DisableInterrupts + ldr r1, [r4, #8] + mov r5, r0 + cmp r1, r8 + bne _020DC6D0 + ldr r0, [r4, #0x18] + cmp r0, r7 + beq _020DC6F4 + bl OS_Terminate + b _020DC6F4 +_020DC6D0: + mvn r6, #2 + b _020DC6E0 +_020DC6D8: + add r0, r4, #0x10 + bl OS_SleepThread +_020DC6E0: + ldr r0, [r4, #8] + cmp r0, r6 + bne _020DC6D8 + str r8, [r4, #8] + str r7, [r4, #0x18] +_020DC6F4: + ldr r0, [r4, #0xc] + ldr r1, [r4] + add r2, r0, #1 + mov r0, r5 + str r2, [r4, #0xc] + mov r2, #0 + str r2, [r1] + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020DC718: .word _021E3820 + arm_func_end CARDi_LockResource + + arm_func_start CARDi_UnlockResource +CARDi_UnlockResource: ; 0x020DC71C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _020DC7A4 ; =_021E3820 + mov r7, r0 + mov r6, r1 + bl OS_DisableInterrupts + ldr r1, [r4, #8] + mov r5, r0 + cmp r1, r7 + bne _020DC74C + ldr r0, [r4, #0xc] + cmp r0, #0 + bne _020DC754 +_020DC74C: + bl OS_Terminate + b _020DC78C +_020DC754: + ldr r0, [r4, #0x18] + cmp r0, r6 + beq _020DC764 + bl OS_Terminate +_020DC764: + ldr r0, [r4, #0xc] + subs r0, r0, #1 + str r0, [r4, #0xc] + bne _020DC78C + mvn r2, #2 + mov r1, #0 + add r0, r4, #0x10 + str r2, [r4, #8] + str r1, [r4, #0x18] + bl OS_WakeupThread +_020DC78C: + ldr r1, [r4] + mov r2, #0 + mov r0, r5 + str r2, [r1] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DC7A4: .word _021E3820 + arm_func_end CARDi_UnlockResource + + arm_func_start CARDi_InitCommon +CARDi_InitCommon: ; 0x020DC7A8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, _020DC89C ; =_021E3820 + ldr r1, _020DC8A0 ; =_021E37C0 + mvn r2, #2 + mov r0, #0 + str r2, [r4, #8] + mov r2, #0x60 + str r0, [r4, #0xc] + str r0, [r4, #0x18] + str r1, [r4] + bl MIi_CpuClearFast + ldr r0, _020DC8A0 ; =_021E37C0 + mov r1, #0x60 + bl DC_FlushRange + mvn r1, #0 + ldr r0, _020DC8A4 ; =0x027FFC40 + str r1, [r4, #0x118] + str r1, [r4, #0x11c] + ldrh r0, [r0] + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + bne _020DC81C + ldr r0, _020DC8A8 ; =0x027FFE00 + mov r2, #0x160 + sub r1, r0, #0x380 + bl MI_CpuCopy8 +_020DC81C: + mov r2, #0 + mov r0, #4 + str r0, [r4, #0x108] + str r2, [r4, #0x14] + str r2, [r4, #0x10] + str r2, [r4, #0x110] + str r2, [r4, #0x10c] + mov r0, #0x400 + str r0, [sp] + ldr ip, [r4, #0x108] + ldr r1, _020DC8AC ; =CARDi_TaskThread + ldr r3, _020DC8B0 ; =_021E3E40 + add r0, r4, #0x44 + str ip, [sp, #4] + bl OS_CreateThread + add r0, r4, #0x44 + bl OS_WakeupThreadDirect + ldr r1, _020DC8B4 ; =CARDi_OnFifoRecv + mov r0, #0xb + bl PXI_SetFifoRecvCallback + ldr r0, _020DC8A4 ; =0x027FFC40 + ldrh r0, [r0] + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r4, pc} + mov r0, #1 + bl CARD_Enable + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DC89C: .word _021E3820 +_020DC8A0: .word _021E37C0 +_020DC8A4: .word 0x027FFC40 +_020DC8A8: .word 0x027FFE00 +_020DC8AC: .word CARDi_TaskThread +_020DC8B0: .word _021E3E40 +_020DC8B4: .word CARDi_OnFifoRecv + arm_func_end CARDi_InitCommon + + arm_func_start CARD_IsEnabled +CARD_IsEnabled: ; 0x020DC8B8 + ldr r0, _020DC8C4 ; =_021E37A8 + ldr r0, [r0] + bx lr + .align 2, 0 +_020DC8C4: .word _021E37A8 + arm_func_end CARD_IsEnabled + + arm_func_start CARD_CheckEnabled +CARD_CheckEnabled: ; 0x020DC8C8 + stmdb sp!, {r3, lr} + bl CARD_IsEnabled + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl OS_Terminate + ldmia sp!, {r3, pc} + arm_func_end CARD_CheckEnabled + + arm_func_start CARD_Enable +CARD_Enable: ; 0x020DC8E0 + ldr r1, _020DC8EC ; =_021E37A8 + str r0, [r1] + bx lr + .align 2, 0 +_020DC8EC: .word _021E37A8 + arm_func_end CARD_Enable + + arm_func_start CARDi_WaitAsync +CARDi_WaitAsync: ; 0x020DC8F0 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020DC938 ; =_021E3820 + bl OS_DisableInterrupts + mov r5, r0 + b _020DC90C +_020DC904: + add r0, r4, #0x10c + bl OS_SleepThread +_020DC90C: + ldr r0, [r4, #0x114] + tst r0, #4 + bne _020DC904 + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4] + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DC938: .word _021E3820 + arm_func_end CARDi_WaitAsync + + arm_func_start CARDi_TryWaitAsync +CARDi_TryWaitAsync: ; 0x020DC93C + ldr r0, _020DC954 ; =_021E3820 + ldr r0, [r0, #0x114] + tst r0, #4 + moveq r0, #1 + movne r0, #0 + bx lr + .align 2, 0 +_020DC954: .word _021E3820 + arm_func_end CARDi_TryWaitAsync + + arm_func_start CARD_GetResultCode +CARD_GetResultCode: ; 0x020DC958 + ldr r0, _020DC968 ; =_021E3820 + ldr r0, [r0] + ldr r0, [r0] + bx lr + .align 2, 0 +_020DC968: .word _021E3820 + arm_func_end CARD_GetResultCode + + arm_func_start CARD_LockRom +CARD_LockRom: ; 0x020DC96C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, #1 + bl CARDi_LockResource + mov r0, r4 + bl OS_LockCard + ldmia sp!, {r4, pc} + arm_func_end CARD_LockRom + + arm_func_start CARD_UnlockRom +CARD_UnlockRom: ; 0x020DC988 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_UnlockCard + mov r0, r4 + mov r1, #1 + bl CARDi_UnlockResource + ldmia sp!, {r4, pc} + arm_func_end CARD_UnlockRom + + arm_func_start CARD_LockBackup +CARD_LockBackup: ; 0x020DC9A4 + ldr ip, _020DC9B0 ; =CARDi_LockResource + mov r1, #2 + bx ip + .align 2, 0 +_020DC9B0: .word CARDi_LockResource + arm_func_end CARD_LockBackup + + arm_func_start CARD_UnlockBackup +CARD_UnlockBackup: ; 0x020DC9B4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl CARD_TryWaitBackupAsync + cmp r0, #0 + bne _020DC9CC + bl CARD_WaitBackupAsync +_020DC9CC: + mov r0, r4 + mov r1, #2 + bl CARDi_UnlockResource + ldmia sp!, {r4, pc} + arm_func_end CARD_UnlockBackup + + arm_func_start CARD_SetCacheFlushThreshold +CARD_SetCacheFlushThreshold: ; 0x020DC9DC + ldr r2, _020DC9EC ; =_021E3820 + str r0, [r2, #0x118] + str r1, [r2, #0x11c] + bx lr + .align 2, 0 +_020DC9EC: .word _021E3820 + arm_func_end CARD_SetCacheFlushThreshold + + arm_func_start CARDi_IdentifyBackupCore +CARDi_IdentifyBackupCore: ; 0x020DC9F0 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020DCD54 ; =_021E3820 + mov r5, r0 + ldr r4, [r1] + mov r1, #0 + add r0, r4, #0x18 + mov r2, #0x48 + bl MI_CpuFill8 + ldr r0, _020DCD58 ; =0x0000203F + str r5, [r4, #4] + str r0, [r4, #0x58] + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5, asr #8 + and r0, r0, #0xff + mov r3, #1 + mov ip, r3, lsl r0 + and r2, r5, #0xff + mov r1, r5, asr #0x10 + str ip, [r4, #0x18] + mov r0, #0xff + strb r0, [r4, #0x54] + cmp r2, #1 + and r0, r1, #0xff + bne _020DCB2C + cmp ip, #0x2000 + bhi _020DCA6C + bhs _020DCAA8 + cmp ip, #0x200 + beq _020DCA88 + b _020DCD34 +_020DCA6C: + cmp ip, #0x10000 + bhi _020DCA7C + beq _020DCACC + b _020DCD34 +_020DCA7C: + cmp ip, #0x20000 + beq _020DCAF0 + b _020DCD34 +_020DCA88: + mov r0, #0x10 + str r0, [r4, #0x24] + str r3, [r4, #0x28] + mov r0, #5 + str r0, [r4, #0x2c] + mov r0, #0xf0 + strb r0, [r4, #0x54] + b _020DCB10 +_020DCAA8: + mov r0, #0x20 + str r0, [r4, #0x24] + mov r0, #2 + str r0, [r4, #0x28] + mov r0, #5 + str r0, [r4, #0x2c] + mov r0, #0 + strb r0, [r4, #0x54] + b _020DCB10 +_020DCACC: + mov r0, #0x80 + str r0, [r4, #0x24] + mov r0, #2 + str r0, [r4, #0x28] + mov r0, #0xa + str r0, [r4, #0x2c] + mov r0, #0 + strb r0, [r4, #0x54] + b _020DCB10 +_020DCAF0: + mov r0, #0x100 + str r0, [r4, #0x24] + mov r0, #3 + str r0, [r4, #0x28] + mov r0, #5 + str r0, [r4, #0x2c] + mov r0, #0 + strb r0, [r4, #0x54] +_020DCB10: + ldr r0, [r4, #0x24] + str r0, [r4, #0x1c] + ldr r0, [r4, #0x58] + orr r0, r0, #0x40 + orr r0, r0, #0x4300 + str r0, [r4, #0x58] + ldmia sp!, {r3, r4, r5, pc} +_020DCB2C: + cmp r2, #2 + bne _020DCCF4 + cmp ip, #0x100000 + bhi _020DCB5C + bhs _020DCB80 + cmp ip, #0x40000 + bhi _020DCB50 + beq _020DCB80 + b _020DCD34 +_020DCB50: + cmp ip, #0x80000 + beq _020DCB80 + b _020DCD34 +_020DCB5C: + cmp ip, #0x400000 + bhi _020DCB74 + bhs _020DCBF8 + cmp ip, #0x200000 + beq _020DCBAC + b _020DCD34 +_020DCB74: + cmp ip, #0x800000 + beq _020DCC48 + b _020DCD34 +_020DCB80: + mov r0, #0x19 + str r0, [r4, #0x30] + mov r1, #0x12c + str r1, [r4, #0x34] + ldr r0, _020DCD5C ; =0x00001388 + str r1, [r4, #0x50] + str r0, [r4, #0x40] + ldr r0, [r4, #0x58] + orr r0, r0, #0x480 + str r0, [r4, #0x58] + b _020DCCC4 +_020DCBAC: + mov r0, #0x17 + str r0, [r4, #0x30] + mov r1, #0x12c + str r1, [r4, #0x34] + mov r1, #0x1f4 + ldr r0, _020DCD5C ; =0x00001388 + str r1, [r4, #0x40] + str r0, [r4, #0x44] + mov r1, r0, lsl #1 + ldr r0, _020DCD60 ; =0x0000EA60 + str r1, [r4, #0x38] + str r0, [r4, #0x3c] + mov r0, #0 + strb r0, [r4, #0x54] + ldr r0, [r4, #0x58] + orr r0, r0, #0x80 + orr r0, r0, #0x5400 + str r0, [r4, #0x58] + b _020DCCC4 +_020DCBF8: + mov r0, #0x258 + str r0, [r4, #0x40] + add r0, r0, #0x960 + str r0, [r4, #0x44] + mov r0, #0x46 + str r0, [r4, #0x48] + mov r0, #0x96 + str r0, [r4, #0x4c] + ldr r1, _020DCD64 ; =0x000059D8 + ldr r0, _020DCD68 ; =0x000C3500 + str r1, [r4, #0x38] + str r0, [r4, #0x3c] + mov r0, #0 + strb r0, [r4, #0x54] + mov r0, #0x1000 + str r0, [r4, #0x20] + ldr r0, [r4, #0x58] + orr r0, r0, #0xd000 + str r0, [r4, #0x58] + b _020DCCC4 +_020DCC48: + cmp r0, #0 + bne _020DCC88 + mov r0, #0x3e8 + str r0, [r4, #0x40] + add r0, r0, #0x7d0 + str r0, [r4, #0x44] + ldr r1, _020DCD6C ; =0x000109A0 + ldr r0, _020DCD70 ; =0x00027100 + str r1, [r4, #0x38] + str r0, [r4, #0x3c] + mov r0, #0 + strb r0, [r4, #0x54] + ldr r0, [r4, #0x58] + orr r0, r0, #0x5000 + str r0, [r4, #0x58] + b _020DCCC4 +_020DCC88: + cmp r0, #1 + bne _020DCCC4 + mov r0, #0x3e8 + str r0, [r4, #0x40] + add r0, r0, #0x7d0 + str r0, [r4, #0x44] + ldr r1, _020DCD6C ; =0x000109A0 + ldr r0, _020DCD70 ; =0x00027100 + str r1, [r4, #0x38] + str r0, [r4, #0x3c] + mov r0, #0x84 + strb r0, [r4, #0x54] + ldr r0, [r4, #0x58] + orr r0, r0, #0x5000 + str r0, [r4, #0x58] +_020DCCC4: + mov r0, #0x10000 + str r0, [r4, #0x1c] + mov r0, #0x100 + str r0, [r4, #0x24] + mov r0, #3 + str r0, [r4, #0x28] + mov r0, #5 + str r0, [r4, #0x2c] + ldr r0, [r4, #0x58] + orr r0, r0, #0xb40 + str r0, [r4, #0x58] + ldmia sp!, {r3, r4, r5, pc} +_020DCCF4: + cmp r2, #3 + bne _020DCD34 + cmp ip, #0x2000 + cmpne ip, #0x8000 + bne _020DCD34 + str ip, [r4, #0x24] + str ip, [r4, #0x1c] + mov r0, #2 + str r0, [r4, #0x28] + mov r0, #0 + strb r0, [r4, #0x54] + ldr r0, [r4, #0x58] + orr r0, r0, #0x40 + orr r0, r0, #0x4300 + str r0, [r4, #0x58] + ldmia sp!, {r3, r4, r5, pc} +_020DCD34: + mov r1, #0 + str r1, [r4, #4] + str r1, [r4, #0x18] + ldr r0, _020DCD54 ; =_021E3820 + mov r1, #3 + ldr r0, [r0] + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DCD54: .word _021E3820 +_020DCD58: .word 0x0000203F +_020DCD5C: .word 0x00001388 +_020DCD60: .word 0x0000EA60 +_020DCD64: .word 0x000059D8 +_020DCD68: .word 0x000C3500 +_020DCD6C: .word 0x000109A0 +_020DCD70: .word 0x00027100 + arm_func_end CARDi_IdentifyBackupCore + + arm_func_start CARDi_RequestStreamCommandCore +CARDi_RequestStreamCommandCore: ; 0x020DCD74 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r0 + ldr r7, [sb, #0x2c] + ldr r0, _020DCF5C ; =_version_NINTENDO_BACKUP + ldr r4, [sb, #0x34] + ldr sl, [sb, #0x30] + mov r5, #0x100 + bl OSi_ReferSymbol + cmp r7, #0xb + bne _020DCDA8 + bl CARD_GetBackupSectorSize + mov r5, r0 + b _020DCDB8 +_020DCDA8: + cmp r7, #0xf + ldreq r0, _020DCF60 ; =_021E3820 + ldreq r0, [r0] + ldreq r5, [r0, #0x20] +_020DCDB8: + add r6, sb, #0x120 + mov fp, #9 +_020DCDC0: + ldr r8, [sb, #0x24] + ldr r0, [sb] + cmp r5, r8 + movlo r8, r5 + str r8, [r0, #0x14] + ldr r0, [sb, #0x114] + tst r0, #0x40 + beq _020DCDFC + ldr r0, [sb, #0x114] + mov r1, #7 + bic r0, r0, #0x40 + str r0, [sb, #0x114] + ldr r0, [sb] + str r1, [r0] + b _020DCF08 +_020DCDFC: + cmp r4, #3 + addls pc, pc, r4, lsl #2 + b _020DCE8C +_020DCE08: ; jump table + b _020DCE18 ; case 0 + b _020DCE3C ; case 1 + b _020DCE3C ; case 2 + b _020DCE74 ; case 3 +_020DCE18: + mov r0, r6 + mov r1, r8 + bl DC_InvalidateRange + ldr r1, [sb, #0x1c] + ldr r0, [sb] + str r1, [r0, #0xc] + ldr r0, [sb] + str r6, [r0, #0x10] + b _020DCE8C +_020DCE3C: + ldr r0, [sb, #0x1c] + mov r1, r6 + mov r2, r8 + bl MI_CpuCopy8 + mov r0, r6 + mov r1, r8 + bl DC_FlushRange + bl DC_WaitWriteBufferEmpty + ldr r0, [sb] + str r6, [r0, #0xc] + ldr r1, [sb, #0x20] + ldr r0, [sb] + str r1, [r0, #0x10] + b _020DCE8C +_020DCE74: + ldr r1, [sb, #0x1c] + ldr r0, [sb] + str r1, [r0, #0xc] + ldr r1, [sb, #0x20] + ldr r0, [sb] + str r1, [r0, #0x10] +_020DCE8C: + mov r0, sb + mov r1, r7 + mov r2, sl + bl CARDi_Request + cmp r0, #0 + beq _020DCF08 + cmp r4, #2 + bne _020DCEC8 + mov r0, sb + mov r1, fp + mov r2, #1 + bl CARDi_Request + cmp r0, #0 + beq _020DCF08 + b _020DCEE0 +_020DCEC8: + cmp r4, #0 + bne _020DCEE0 + ldr r1, [sb, #0x20] + mov r0, r6 + mov r2, r8 + bl MI_CpuCopy8 +_020DCEE0: + ldr r0, [sb, #0x1c] + add r0, r0, r8 + str r0, [sb, #0x1c] + ldr r0, [sb, #0x20] + add r0, r0, r8 + str r0, [sb, #0x20] + ldr r0, [sb, #0x24] + subs r0, r0, r8 + str r0, [sb, #0x24] + bne _020DCDC0 +_020DCF08: + ldr r6, [sb, #0x38] + ldr r5, [sb, #0x3c] + bl OS_DisableInterrupts + ldr r1, [sb, #0x114] + mov r4, r0 + bic r0, r1, #0x4c + str r0, [sb, #0x114] + add r0, sb, #0x10c + bl OS_WakeupThread + ldr r0, [sb, #0x114] + tst r0, #0x10 + beq _020DCF40 + add r0, sb, #0x44 + bl OS_WakeupThreadDirect +_020DCF40: + mov r0, r4 + bl OS_RestoreInterrupts + cmp r6, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, r5 + blx r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DCF5C: .word _version_NINTENDO_BACKUP +_020DCF60: .word _021E3820 + arm_func_end CARDi_RequestStreamCommandCore + + arm_func_start CARDi_RequestStreamCommand +CARDi_RequestStreamCommand: ; 0x020DCF64 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r4, _020DD03C ; =_021E3820 + ldr r0, _020DD040 ; =_version_NINTENDO_BACKUP + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl OSi_ReferSymbol + bl OS_DisableInterrupts + ldr r1, [r4, #0x114] + mov r5, r0 + tst r1, #4 + beq _020DCFAC +_020DCF98: + add r0, r4, #0x10c + bl OS_SleepThread + ldr r0, [r4, #0x114] + tst r0, #4 + bne _020DCF98 +_020DCFAC: + ldr r0, [r4, #0x114] + ldr r1, [sp, #0x20] + orr r2, r0, #4 + mov r0, r5 + str r2, [r4, #0x114] + str r6, [r4, #0x38] + str r1, [r4, #0x3c] + bl OS_RestoreInterrupts + ldr r3, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r1, [sp, #0x30] + ldr r0, [sp, #0x24] + str sb, [r4, #0x1c] + str r8, [r4, #0x20] + str r7, [r4, #0x24] + str r3, [r4, #0x2c] + str r2, [r4, #0x30] + str r1, [r4, #0x34] + cmp r0, #0 + beq _020DD00C + ldr r0, _020DD044 ; =CARDi_RequestStreamCommandCore + bl CARDi_SetTask + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020DD00C: + ldr r0, _020DD048 ; =OSi_ThreadInfo + ldr r1, _020DD03C ; =_021E3820 + ldr r2, [r0, #4] + mov r0, r4 + str r2, [r1, #0x104] + bl CARDi_RequestStreamCommandCore + ldr r0, [r4] + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020DD03C: .word _021E3820 +_020DD040: .word _version_NINTENDO_BACKUP +_020DD044: .word CARDi_RequestStreamCommandCore +_020DD048: .word OSi_ThreadInfo + arm_func_end CARDi_RequestStreamCommand + + arm_func_start CARD_GetBackupSectorSize +CARD_GetBackupSectorSize: ; 0x020DD04C + ldr r0, _020DD05C ; =_021E3820 + ldr r0, [r0] + ldr r0, [r0, #0x1c] + bx lr + .align 2, 0 +_020DD05C: .word _021E3820 + arm_func_end CARD_GetBackupSectorSize + + arm_func_start CARD_IdentifyBackup +CARD_IdentifyBackup: ; 0x020DD060 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + ldr r0, _020DD18C ; =_version_NINTENDO_BACKUP + ldr r4, _020DD190 ; =_021E3820 + bl OSi_ReferSymbol + cmp r6, #0 + bne _020DD080 + bl OS_Terminate +_020DD080: + bl CARD_CheckEnabled + bl OS_DisableInterrupts + ldr r1, [r4, #0x114] + mov r5, r0 + tst r1, #4 + beq _020DD0AC +_020DD098: + add r0, r4, #0x10c + bl OS_SleepThread + ldr r0, [r4, #0x114] + tst r0, #4 + bne _020DD098 +_020DD0AC: + ldr r0, [r4, #0x114] + mov r1, #0 + orr r2, r0, #4 + mov r0, r5 + str r2, [r4, #0x114] + str r1, [r4, #0x38] + str r1, [r4, #0x3c] + bl OS_RestoreInterrupts + mov r0, r6 + bl CARDi_IdentifyBackupCore + ldr r0, _020DD194 ; =OSi_ThreadInfo + ldr r1, _020DD190 ; =_021E3820 + ldr r2, [r0, #4] + mov r0, r4 + str r2, [r1, #0x104] + mov r1, #2 + mov r2, #1 + bl CARDi_Request + ldr r0, [r4] + mov r1, #0 + str r1, [r0, #0xc] + ldr r0, [r4] + add r1, r4, #0x120 + str r1, [r0, #0x10] + ldr r1, [r4] + mov r2, #1 + mov r0, r4 + str r2, [r1, #0x14] + mov r1, #6 + bl CARDi_Request + ldr r7, [r4, #0x38] + ldr r6, [r4, #0x3c] + bl OS_DisableInterrupts + mov r5, r0 + ldr r1, [r4, #0x114] + add r0, r4, #0x10c + bic r1, r1, #0x4c + str r1, [r4, #0x114] + bl OS_WakeupThread + ldr r0, [r4, #0x114] + tst r0, #0x10 + beq _020DD15C + add r0, r4, #0x44 + bl OS_WakeupThreadDirect +_020DD15C: + mov r0, r5 + bl OS_RestoreInterrupts + cmp r7, #0 + beq _020DD174 + mov r0, r6 + blx r7 +_020DD174: + ldr r0, [r4] + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DD18C: .word _version_NINTENDO_BACKUP +_020DD190: .word _021E3820 +_020DD194: .word OSi_ThreadInfo + arm_func_end CARD_IdentifyBackup + + arm_func_start CARD_WaitBackupAsync +CARD_WaitBackupAsync: ; 0x020DD198 + ldr ip, _020DD1A0 ; =CARDi_WaitAsync + bx ip + .align 2, 0 +_020DD1A0: .word CARDi_WaitAsync + arm_func_end CARD_WaitBackupAsync + + arm_func_start CARD_TryWaitBackupAsync +CARD_TryWaitBackupAsync: ; 0x020DD1A4 + ldr ip, _020DD1AC ; =CARDi_TryWaitAsync + bx ip + .align 2, 0 +_020DD1AC: .word CARDi_TryWaitAsync + arm_func_end CARD_TryWaitBackupAsync + + arm_func_start CARD_CancelBackupAsync +CARD_CancelBackupAsync: ; 0x020DD1B0 + stmdb sp!, {r3, lr} + bl OS_DisableInterrupts + ldr r1, _020DD1D0 ; =_021E3820 + ldr r2, [r1, #0x114] + orr r2, r2, #0x40 + str r2, [r1, #0x114] + bl OS_RestoreInterrupts + ldmia sp!, {r3, pc} + .align 2, 0 +_020DD1D0: .word _021E3820 + arm_func_end CARD_CancelBackupAsync + + arm_func_start CARDi_ReadFromCache +CARDi_ReadFromCache: ; 0x020DD1D4 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020DD25C ; =_021E3820 + mov r1, #0x200 + ldr r3, [r4, #0x1c] + rsb r1, r1, #0 + ldr r2, [r0, #8] + and r3, r3, r1 + cmp r3, r2 + bne _020DD248 + ldr r2, [r4, #0x1c] + ldr r1, [r4, #0x24] + sub r3, r2, r3 + rsb r5, r3, #0x200 + cmp r5, r1 + movhi r5, r1 + add r0, r0, #0x20 + ldr r1, [r4, #0x20] + mov r2, r5 + add r0, r0, r3 + bl MI_CpuCopy8 + ldr r2, [r4, #0x1c] + ldr r1, [r4, #0x20] + ldr r0, [r4, #0x24] + add r2, r2, r5 + add r1, r1, r5 + sub r0, r0, r5 + str r2, [r4, #0x1c] + str r1, [r4, #0x20] + str r0, [r4, #0x24] +_020DD248: + ldr r0, [r4, #0x24] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DD25C: .word _021E3820 + arm_func_end CARDi_ReadFromCache + + arm_func_start CARDi_SetRomOp +CARDi_SetRomOp: ; 0x020DD260 + ldr r3, _020DD2B8 ; =0x040001A4 +_020DD264: + ldr r2, [r3] + tst r2, #0x80000000 + bne _020DD264 + ldr r3, _020DD2BC ; =0x040001A1 + mov r2, #0xc0 + strb r2, [r3] + mov r2, r0, lsr #0x18 + strb r2, [r3, #7] + mov r2, r0, lsr #0x10 + strb r2, [r3, #8] + mov r2, r0, lsr #8 + strb r2, [r3, #9] + strb r0, [r3, #0xa] + mov r0, r1, lsr #0x18 + strb r0, [r3, #0xb] + mov r0, r1, lsr #0x10 + strb r0, [r3, #0xc] + mov r0, r1, lsr #8 + strb r0, [r3, #0xd] + strb r1, [r3, #0xe] + bx lr + .align 2, 0 +_020DD2B8: .word 0x040001A4 +_020DD2BC: .word 0x040001A1 + arm_func_end CARDi_SetRomOp + + arm_func_start CARDi_SetCardDma +CARDi_SetCardDma: ; 0x020DD2C0 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020DD304 ; =_021E3820 + ldr r1, _020DD308 ; =0x04100010 + ldr r0, [r4, #0x28] + ldr r2, [r4, #0x20] + mov r3, #0x200 + ldr r5, _020DD30C ; =_021E3E60 + bl MIi_CardDmaCopy32 + ldr r1, [r4, #0x1c] + mov r0, r1, lsr #8 + orr r0, r0, #0xb7000000 + mov r1, r1, lsl #0x18 + bl CARDi_SetRomOp + ldr r1, [r5, #4] + ldr r0, _020DD310 ; =0x040001A4 + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DD304: .word _021E3820 +_020DD308: .word 0x04100010 +_020DD30C: .word _021E3E60 +_020DD310: .word 0x040001A4 + arm_func_end CARDi_SetCardDma + + arm_func_start CARDi_OnReadCard +CARDi_OnReadCard: ; 0x020DD314 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _020DD3E0 ; =_021E3820 + ldr r0, [r0, #0x28] + bl MI_StopDma + ldr r3, _020DD3E0 ; =_021E3820 + ldr r0, [r3, #0x24] + ldr r2, [r3, #0x1c] + ldr r1, [r3, #0x20] + subs r0, r0, #0x200 + str r0, [r3, #0x24] + movne r0, #1 + add r2, r2, #0x200 + add r1, r1, #0x200 + moveq r0, #0 + str r2, [r3, #0x1c] + str r1, [r3, #0x20] + cmp r0, #0 + bne _020DD3D8 + mov r0, #0x80000 + bl OS_DisableIrqMask + mov r0, #0x80000 + bl OS_ResetRequestIrqMask + ldr r4, _020DD3E0 ; =_021E3820 + bl CARDi_ReadRomIDCore + bl CARDi_CheckPulledOutCore + ldr r0, [r4] + mov r1, #0 + str r1, [r0] + ldr r5, [r4, #0x38] + ldr r6, [r4, #0x3c] + bl OS_DisableInterrupts + ldr r1, [r4, #0x114] + mov r7, r0 + bic r0, r1, #0x4c + str r0, [r4, #0x114] + add r0, r4, #0x10c + bl OS_WakeupThread + ldr r0, [r4, #0x114] + tst r0, #0x10 + beq _020DD3BC + add r0, r4, #0x44 + bl OS_WakeupThreadDirect +_020DD3BC: + mov r0, r7 + bl OS_RestoreInterrupts + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + blx r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020DD3D8: + bl CARDi_SetCardDma + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DD3E0: .word _021E3820 + arm_func_end CARDi_OnReadCard + + arm_func_start CARDi_TryReadCardDma +CARDi_TryReadCardDma: ; 0x020DD3E4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _020DD55C ; =_021E3820 + mov r6, #0 + ldr sb, [r4, #0x20] + mov fp, r0 + mov r7, r6 + mov r8, r6 + mov r1, r6 + ands sl, sb, #0x1f + ldr r5, [r4, #0x24] + bne _020DD41C + ldr r0, [r4, #0x28] + cmp r0, #3 + movls r1, #1 +_020DD41C: + cmp r1, #0 + beq _020DD470 + bl OS_GetDTCMAddress + ldr r1, _020DD560 ; =OS_IrqHandler + add r3, sb, r5 + cmp r3, r1 + mov r1, #1 + mov r2, #0 + bls _020DD448 + cmp sb, #0x2000000 + movlo r2, r1 +_020DD448: + cmp r2, #0 + bne _020DD468 + cmp r0, r3 + bhs _020DD464 + add r0, r0, #0x4000 + cmp r0, sb + bhi _020DD468 +_020DD464: + mov r1, #0 +_020DD468: + cmp r1, #0 + moveq r8, #1 +_020DD470: + cmp r8, #0 + beq _020DD48C + ldr r1, [r4, #0x1c] + ldr r0, _020DD564 ; =0x000001FF + orr r1, r1, r5 + tst r1, r0 + moveq r7, #1 +_020DD48C: + ldr r0, _020DD568 ; =_02110FB8 + cmp r7, #0 + ldr r0, [r0] + cmpne r5, #0 + ldr r0, [r0, #0x60] + movne r6, #1 + bic r0, r0, #0x7000000 + orr r0, r0, #0xa1000000 + cmp r6, #0 + str r0, [fp, #4] + beq _020DD554 + bl OS_DisableInterrupts + ldr r1, [r4, #0x118] + mov r7, r0 + cmp r5, r1 + bhs _020DD4DC + mov r0, sb + mov r1, r5 + bl IC_InvalidateRange + b _020DD4E0 +_020DD4DC: + bl IC_InvalidateAll +_020DD4E0: + ldr r0, [r4, #0x11c] + cmp r5, r0 + bhs _020DD528 + cmp sl, #0 + beq _020DD514 + sub sb, sb, sl + mov r0, sb + mov r1, #0x20 + bl DC_StoreRange + add r0, sb, r5 + mov r1, #0x20 + bl DC_StoreRange + add r5, r5, #0x20 +_020DD514: + mov r0, sb + mov r1, r5 + bl DC_InvalidateRange + bl DC_WaitWriteBufferEmpty + b _020DD52C +_020DD528: + bl DC_FlushAll +_020DD52C: + ldr r1, _020DD56C ; =CARDi_OnReadCard + mov r0, #0x80000 + bl OS_SetIrqFunction + mov r0, #0x80000 + bl OS_ResetRequestIrqMask + mov r0, #0x80000 + bl OS_EnableIrqMask + mov r0, r7 + bl OS_RestoreInterrupts + bl CARDi_SetCardDma +_020DD554: + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DD55C: .word _021E3820 +_020DD560: .word OS_IrqHandler +_020DD564: .word 0x000001FF +_020DD568: .word _02110FB8 +_020DD56C: .word CARDi_OnReadCard + arm_func_end CARDi_TryReadCardDma + + arm_func_start CARDi_ReadCard +CARDi_ReadCard: ; 0x020DD570 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _020DD654 ; =_021E3820 + mov r6, r0 +_020DD57C: + mov r0, #0x200 + ldr r1, [r4, #0x1c] + rsb r0, r0, #0 + and r2, r1, r0 + cmp r2, r1 + bne _020DD5AC + ldr r5, [r4, #0x20] + tst r5, #3 + bne _020DD5AC + ldr r0, [r4, #0x24] + cmp r0, #0x200 + bhs _020DD5B4 +_020DD5AC: + str r2, [r6, #8] + add r5, r6, #0x20 +_020DD5B4: + mov r0, r2, lsr #8 + orr r0, r0, #0xb7000000 + mov r1, r2, lsl #0x18 + bl CARDi_SetRomOp + mov ip, #0 + ldr r0, [r6, #4] + ldr r2, _020DD658 ; =0x040001A4 + mov lr, ip + str r0, [r2] + ldr r1, _020DD65C ; =0x04100010 +_020DD5DC: + ldr r3, [r2] + tst r3, #0x800000 + beq _020DD5FC + ldr r0, [r1] + cmp lr, #0x200 + strlo r0, [r5, ip, lsl #2] + addlo lr, lr, #4 + addlo ip, ip, #1 +_020DD5FC: + tst r3, #0x80000000 + bne _020DD5DC + ldr r0, [r4, #0x20] + cmp r5, r0 + bne _020DD640 + ldr r0, _020DD654 ; =_021E3820 + ldr r1, [r0, #0x1c] + add r1, r1, #0x200 + str r1, [r0, #0x1c] + ldr r1, [r0, #0x20] + add r1, r1, #0x200 + str r1, [r0, #0x20] + ldr r1, [r0, #0x24] + subs r1, r1, #0x200 + str r1, [r0, #0x24] + ldmeqia sp!, {r4, r5, r6, pc} + b _020DD57C +_020DD640: + mov r0, r6 + bl CARDi_ReadFromCache + cmp r0, #0 + bne _020DD57C + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DD654: .word _021E3820 +_020DD658: .word 0x040001A4 +_020DD65C: .word 0x04100010 + arm_func_end CARDi_ReadCard + + arm_func_start CARDi_ReadRomIDCore +CARDi_ReadRomIDCore: ; 0x020DD660 + stmdb sp!, {r3, lr} + mov r0, #0xb8000000 + mov r1, #0 + bl CARDi_SetRomOp + ldr r1, _020DD6B0 ; =_02110FB8 + mov r0, #0x2000 + ldr r1, [r1] + rsb r0, r0, #0 + ldr r2, [r1, #0x60] + ldr r1, _020DD6B4 ; =0x040001A4 + bic r2, r2, #0x7000000 + orr r2, r2, #0xa7000000 + and r0, r2, r0 + str r0, [r1] +_020DD698: + ldr r0, [r1] + tst r0, #0x800000 + beq _020DD698 + ldr r0, _020DD6B8 ; =0x04100010 + ldr r0, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DD6B0: .word _02110FB8 +_020DD6B4: .word 0x040001A4 +_020DD6B8: .word 0x04100010 + arm_func_end CARDi_ReadRomIDCore + + arm_func_start CARDi_ReadRomSyncCore +CARDi_ReadRomSyncCore: ; 0x020DD6BC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _020DD74C ; =_021E3E60 + mov r0, r4 + bl CARDi_ReadFromCache + cmp r0, #0 + beq _020DD6E0 + ldr r1, [r4] + mov r0, r4 + blx r1 +_020DD6E0: + ldr r4, _020DD750 ; =_021E3820 + bl CARDi_ReadRomIDCore + bl CARDi_CheckPulledOutCore + ldr r0, [r4] + mov r1, #0 + str r1, [r0] + ldr r5, [r4, #0x38] + ldr r6, [r4, #0x3c] + bl OS_DisableInterrupts + ldr r1, [r4, #0x114] + mov r7, r0 + bic r0, r1, #0x4c + str r0, [r4, #0x114] + add r0, r4, #0x10c + bl OS_WakeupThread + ldr r0, [r4, #0x114] + tst r0, #0x10 + beq _020DD730 + add r0, r4, #0x44 + bl OS_WakeupThreadDirect +_020DD730: + mov r0, r7 + bl OS_RestoreInterrupts + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + blx r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020DD74C: .word _021E3E60 +_020DD750: .word _021E3820 + arm_func_end CARDi_ReadRomSyncCore + + arm_func_start CARDi_ReadRom +CARDi_ReadRom: ; 0x020DD754 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r7, r3 + ldr r4, _020DD838 ; =_021E3E60 + ldr r5, _020DD83C ; =_021E3820 + bl CARD_CheckEnabled + bl OS_DisableInterrupts + mov r6, r0 + b _020DD788 +_020DD780: + add r0, r5, #0x10c + bl OS_SleepThread +_020DD788: + ldr r0, [r5, #0x114] + tst r0, #4 + bne _020DD780 + ldr r0, [r5, #0x114] + ldr r2, [sp, #0x20] + ldr r1, [sp, #0x24] + orr r3, r0, #4 + mov r0, r6 + str r3, [r5, #0x114] + str r2, [r5, #0x38] + str r1, [r5, #0x3c] + bl OS_RestoreInterrupts + ldr r0, _020DD840 ; =_021E3E40 + str sl, [r5, #0x28] + ldr r0, [r0] + str r8, [r5, #0x20] + add r0, sb, r0 + str r0, [r5, #0x1c] + str r7, [r5, #0x24] + cmp sl, #3 + bhi _020DD7E4 + mov r0, sl + bl MI_StopDma +_020DD7E4: + mov r0, r4 + bl CARDi_TryReadCardDma + cmp r0, #0 + beq _020DD808 + ldr r0, [sp, #0x28] + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + bl CARD_WaitRomAsync + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DD808: + ldr r0, [sp, #0x28] + cmp r0, #0 + beq _020DD820 + ldr r0, _020DD844 ; =CARDi_ReadRomSyncCore + bl CARDi_SetTask + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DD820: + ldr r1, _020DD848 ; =OSi_ThreadInfo + mov r0, r5 + ldr r1, [r1, #4] + str r1, [r5, #0x104] + bl CARDi_ReadRomSyncCore + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020DD838: .word _021E3E60 +_020DD83C: .word _021E3820 +_020DD840: .word _021E3E40 +_020DD844: .word CARDi_ReadRomSyncCore +_020DD848: .word OSi_ThreadInfo + arm_func_end CARDi_ReadRom + + arm_func_start CARD_Init +CARD_Init: ; 0x020DD84C + stmdb sp!, {r3, lr} + ldr ip, _020DD8A8 ; =_021E3820 + ldr r0, [ip, #0x114] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r2, #0 + ldr r0, _020DD8AC ; =_021E3E40 + sub r1, r2, #1 + mov r3, #1 + str r3, [ip, #0x114] + str r2, [ip, #0x24] + str r2, [ip, #0x20] + str r2, [ip, #0x1c] + str r1, [ip, #0x28] + str r2, [ip, #0x38] + str r2, [ip, #0x3c] + str r2, [r0] + bl CARDi_InitCommon + bl CARDi_GetRomAccessor + ldr r1, _020DD8B0 ; =_021E3E60 + str r0, [r1] + bl CARD_InitPulledOutCallback + ldmia sp!, {r3, pc} + .align 2, 0 +_020DD8A8: .word _021E3820 +_020DD8AC: .word _021E3E40 +_020DD8B0: .word _021E3E60 + arm_func_end CARD_Init + + arm_func_start CARD_WaitRomAsync +CARD_WaitRomAsync: ; 0x020DD8B4 + ldr ip, _020DD8BC ; =CARDi_WaitAsync + bx ip + .align 2, 0 +_020DD8BC: .word CARDi_WaitAsync + arm_func_end CARD_WaitRomAsync + + arm_func_start CARDi_GetRomAccessor +CARDi_GetRomAccessor: ; 0x020DD8C0 + ldr r0, _020DD8C8 ; =CARDi_ReadCard + bx lr + .align 2, 0 +_020DD8C8: .word CARDi_ReadCard + arm_func_end CARDi_GetRomAccessor + + arm_func_start CARDi_OnFifoRecv +CARDi_OnFifoRecv: ; 0x020DD8CC + stmdb sp!, {r3, lr} + cmp r0, #0xb + ldmneia sp!, {r3, pc} + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r2, _020DD8FC ; =_021E3820 + ldr r1, [r2, #0x114] + ldr r0, [r2, #0x104] + bic r1, r1, #0x20 + str r1, [r2, #0x114] + bl OS_WakeupThreadDirect + ldmia sp!, {r3, pc} + .align 2, 0 +_020DD8FC: .word _021E3820 + arm_func_end CARDi_OnFifoRecv + + arm_func_start CARDi_TaskThread +CARDi_TaskThread: ; 0x020DD900 + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _020DD94C ; =_021E3820 + mov r4, #0 +_020DD90C: + bl OS_DisableInterrupts + ldr r1, [r5, #0x114] + mov r6, r0 + tst r1, #8 + bne _020DD934 +_020DD920: + mov r0, r4 + bl OS_SleepThread + ldr r0, [r5, #0x114] + tst r0, #8 + beq _020DD920 +_020DD934: + mov r0, r6 + bl OS_RestoreInterrupts + ldr r1, [r5, #0x40] + mov r0, r5 + blx r1 + b _020DD90C + .align 2, 0 +_020DD94C: .word _021E3820 + arm_func_end CARDi_TaskThread + + arm_func_start CARDi_Request +CARDi_Request: ; 0x020DD950 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r0, [sl, #0x114] + mov sb, r1 + str r2, [sp] + tst r0, #2 + bne _020DD9C4 + ldr r1, [sl, #0x114] + mov r0, #0xb + orr r2, r1, #2 + mov r1, #1 + str r2, [sl, #0x114] + bl PXI_IsCallbackReady + cmp r0, #0 + bne _020DD9B4 + mov r6, #0x64 + mov r5, #0xb + mov r4, #1 +_020DD998: + mov r0, r6 + bl OS_SpinWait + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020DD998 +_020DD9B4: + mov r0, sl + mov r1, #0 + mov r2, #1 + bl CARDi_Request +_020DD9C4: + ldr r0, [sl] + mov r1, #0x60 + bl DC_FlushRange + bl DC_WaitWriteBufferEmpty + mov r7, #0xb + mov r6, #1 + mov r5, r7 + mov r4, r6 + mov fp, #0 +_020DD9E8: + str sb, [sl, #4] + ldr r0, [sl, #0x114] + orr r0, r0, #0x20 + str r0, [sl, #0x114] +_020DD9F8: + mov r0, r7 + mov r1, sb + mov r2, r6 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _020DD9F8 + cmp sb, #0 + bne _020DDA34 + ldr r8, [sl] +_020DDA1C: + mov r0, r5 + mov r1, r8 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _020DDA1C +_020DDA34: + bl OS_DisableInterrupts + ldr r1, [sl, #0x114] + mov r8, r0 + tst r1, #0x20 + beq _020DDA5C +_020DDA48: + mov r0, fp + bl OS_SleepThread + ldr r0, [sl, #0x114] + tst r0, #0x20 + bne _020DDA48 +_020DDA5C: + mov r0, r8 + bl OS_RestoreInterrupts + ldr r0, [sl] + mov r1, #0x60 + bl DC_InvalidateRange + ldr r0, [sl] + ldr r1, [r0] + cmp r1, #4 + bne _020DDA94 + ldr r0, [sp] + sub r0, r0, #1 + str r0, [sp] + cmp r0, #0 + bgt _020DD9E8 +_020DDA94: + cmp r1, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end CARDi_Request + + arm_func_start CARD_InitPulledOutCallback +CARD_InitPulledOutCallback: ; 0x020DDAA4 + stmdb sp!, {r3, lr} + bl PXI_Init + ldr r1, _020DDAC8 ; =CARDi_PulledOutCallback + mov r0, #0xe + bl PXI_SetFifoRecvCallback + ldr r0, _020DDACC ; =_021E4080 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DDAC8: .word CARDi_PulledOutCallback +_020DDACC: .word _021E4080 + arm_func_end CARD_InitPulledOutCallback + + arm_func_start CARDi_PulledOutCallback +CARDi_PulledOutCallback: ; 0x020DDAD0 + stmdb sp!, {r3, lr} + and r0, r1, #0x3f + cmp r0, #0x11 + bne _020DDB18 + ldr r1, _020DDB20 ; =_021E4080 + ldr r0, [r1] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + str r0, [r1] + ldr r1, [r1, #4] + cmp r1, #0 + beq _020DDB08 + blx r1 +_020DDB08: + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl CARD_TerminateForPulledOut + ldmia sp!, {r3, pc} +_020DDB18: + bl OS_Terminate + ldmia sp!, {r3, pc} + .align 2, 0 +_020DDB20: .word _021E4080 + arm_func_end CARDi_PulledOutCallback + + arm_func_start CARD_IsPulledOut +CARD_IsPulledOut: ; 0x020DDB24 + ldr r0, _020DDB30 ; =_021E4080 + ldr r0, [r0] + bx lr + .align 2, 0 +_020DDB30: .word _021E4080 + arm_func_end CARD_IsPulledOut + + arm_func_start CARD_TerminateForPulledOut +CARD_TerminateForPulledOut: ; 0x020DDB34 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #0 + mov r5, #1 + bl MI_StopDma + mov r0, r5 + bl MI_StopDma + mov r0, #2 + bl MI_StopDma + mov r0, #3 + bl MI_StopDma + ldr r0, _020DDBB8 ; =0x027FFFA8 + ldrh r0, [r0] + and r0, r0, #0x8000 + movs r0, r0, asr #0xf + beq _020DDB9C + bl PM_ForceToPowerOff + cmp r0, #4 + bne _020DDB94 + ldr r4, _020DDBBC ; =0x000A3A47 +_020DDB80: + mov r0, r4 + bl OS_SpinWait + bl PM_ForceToPowerOff + cmp r0, #4 + beq _020DDB80 +_020DDB94: + cmp r0, #0 + moveq r5, #0 +_020DDB9C: + cmp r5, #0 + beq _020DDBB0 + mov r0, #1 + mov r1, r0 + bl CARDi_SendtoPxi +_020DDBB0: + bl OS_Terminate + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020DDBB8: .word 0x027FFFA8 +_020DDBBC: .word 0x000A3A47 + arm_func_end CARD_TerminateForPulledOut + + arm_func_start CARDi_CheckPulledOutCore +CARDi_CheckPulledOutCore: ; 0x020DDBC0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r2, _020DDC1C ; =0x027FFC10 + ldrh r1, [r2] + cmp r1, #0 + subeq r1, r2, #0x410 + subne r1, r2, #0x10 + ldr r1, [r1] + str r1, [sp] + ldr r1, [sp] + cmp r0, r1 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #0xe + mov r1, #0x11 + mov r2, #0 + bl CARDi_PulledOutCallback + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020DDC1C: .word 0x027FFC10 + arm_func_end CARDi_CheckPulledOutCore + + arm_func_start CARDi_SendtoPxi +CARDi_SendtoPxi: ; 0x020DDC20 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r1, r7 + mov r0, #0xe + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r5, #0xe + mov r4, #0 +_020DDC4C: + mov r0, r6 + bl SVC_WaitByLoop + mov r0, r5 + mov r1, r7 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _020DDC4C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CARDi_SendtoPxi + + ; Functions presumably in libcard but not present in plat + + arm_func_start CARD_SetSpiReadWaitCycles +CARD_SetSpiReadWaitCycles: ; 0x020DDC70 + ldr r1, _020DDC7C ; =_021E4088 + strb r0, [r1, #2] + bx lr + .align 2, 0 +_020DDC7C: .word _021E4088 + arm_func_end CARD_SetSpiReadWaitCycles + + arm_func_start CARD_SetSpiWriteWaitCycles +CARD_SetSpiWriteWaitCycles: ; 0x020DDC80 + ldr r1, _020DDC8C ; =_021E4088 + strb r0, [r1, #1] + bx lr + .align 2, 0 +_020DDC8C: .word _021E4088 + arm_func_end CARD_SetSpiWriteWaitCycles + + arm_func_start CARDi_SpiDummyWait +CARDi_SpiDummyWait: ; 0x020DDC90 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bl OS_GetTick + mov r4, #0 + ldr r5, _020DDCEC ; =0x000082EA + ldr sl, _020DDCF0 ; =_021E4088 + mov r6, r0 + mov r7, r1 + mov sb, r4 + mov r8, #0xfa00 +_020DDCB4: + bl OS_GetTick + subs r3, r0, r6 + sbc r2, r1, r7 + umull r0, r1, r3, r8 + mla r1, r3, sb, r1 + mla r1, r2, r8, r1 + mov r2, r5 + mov r3, r4 + bl _ll_udiv + ldrb r2, [sl] + cmp r1, r2, asr #31 + cmpeq r0, r2 + blo _020DDCB4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020DDCEC: .word 0x000082EA +_020DDCF0: .word _021E4088 + arm_func_end CARDi_SpiDummyWait + + arm_func_start CARD_SpiWaitInit +CARD_SpiWaitInit: ; 0x020DDCF4 + stmdb sp!, {r3, lr} + ldr r1, _020DDD38 ; =_021E4088 + mov r0, #0x32 + strb r0, [r1, #2] + strb r0, [r1, #1] + strb r0, [r1] + mov r2, #1 + ldr r0, _020DDD3C ; =_02110FBC + str r2, [r1, #4] + ldrh r1, [r0] + ldr r0, _020DDD40 ; =0x0000FFFD + cmp r1, r0 + ldmneia sp!, {r3, pc} + bl OS_GetLockID + ldr r1, _020DDD3C ; =_02110FBC + strh r0, [r1] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DDD38: .word _021E4088 +_020DDD3C: .word _02110FBC +_020DDD40: .word 0x0000FFFD + arm_func_end CARD_SpiWaitInit + + arm_func_start CARDi_SpiWaitWriteByte +CARDi_SpiWaitWriteByte: ; 0x020DDD44 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r6, r0 + bl OS_GetTick + mov fp, #0 + ldr sl, _020DDDE4 ; =0x000082EA + ldr sb, _020DDDE8 ; =_021E4088 + mov r4, r0 + mov r5, r1 + mov r8, fp + mov r7, #0xfa00 +_020DDD6C: + bl OS_GetTick + subs lr, r0, r4 + sbc ip, r1, r5 + mov r2, sl + mov r3, fp + umull r0, r1, lr, r7 + mla r1, lr, r8, r1 + mla r1, ip, r7, r1 + bl _ll_udiv + ldrb r2, [sb, #1] + cmp r1, r2, asr #31 + cmpeq r0, r2 + blo _020DDD6C + ldr r0, [r6, #4] + ldr r1, _020DDDEC ; =0x040001A2 + ldrb r0, [r0] + strh r0, [r1] + ldr r0, [r6, #4] + sub r1, r1, #2 + add r0, r0, #1 + str r0, [r6, #4] +_020DDDC0: + ldrh r0, [r1] + tst r0, #0x80 + bne _020DDDC0 + ldr r0, _020DDDEC ; =0x040001A2 + ldrh r0, [r0] + strh r0, [sp] + ldrh r0, [sp] + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DDDE4: .word 0x000082EA +_020DDDE8: .word _021E4088 +_020DDDEC: .word 0x040001A2 + arm_func_end CARDi_SpiWaitWriteByte + + arm_func_start CARDi_SpiWaitReadByte +CARDi_SpiWaitReadByte: ; 0x020DDDF0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r6, r0 + bl OS_GetTick + mov fp, #0 + ldr sl, _020DDE88 ; =0x000082EA + ldr sb, _020DDE8C ; =_021E4088 + mov r4, r0 + mov r5, r1 + mov r8, fp + mov r7, #0xfa00 +_020DDE18: + bl OS_GetTick + subs lr, r0, r4 + sbc ip, r1, r5 + mov r2, sl + mov r3, fp + umull r0, r1, lr, r7 + mla r1, lr, r8, r1 + mla r1, ip, r7, r1 + bl _ll_udiv + ldrb r2, [sb, #2] + cmp r1, r2, asr #31 + cmpeq r0, r2 + blo _020DDE18 + ldr r0, _020DDE90 ; =0x040001A2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_020DDE5C: + ldrh r0, [r1] + tst r0, #0x80 + bne _020DDE5C + ldr r1, _020DDE90 ; =0x040001A2 + ldr r0, [r6, #8] + ldrh r1, [r1] + strb r1, [r0] + ldr r0, [r6, #8] + add r0, r0, #1 + str r0, [r6, #8] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DDE88: .word 0x000082EA +_020DDE8C: .word _021E4088 +_020DDE90: .word 0x040001A2 + arm_func_end CARDi_SpiWaitReadByte + + arm_func_start CARD_SpiWaitReadRange +CARD_SpiWaitReadRange: ; 0x020DDE94 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r2, _020DDFC4 ; =_021E409C + ldr r1, _020DDFC8 ; =_021E4088 + mov r6, r0 + str r2, [r1, #8] + str r6, [r1, #0xc] + mov r0, #1 + strb r0, [r2] + mov r1, #0 + ldr r0, _020DDFCC ; =_02110FBC + strb r1, [r6] + ldrh r0, [r0] + bl CARD_LockBackup + ldr r0, _020DDFCC ; =_02110FBC + ldrh r0, [r0] + bl OS_LockCard + ldr r2, _020DDFD0 ; =0x040001A0 +_020DDED8: + ldrh r0, [r2] + tst r0, #0x80 + bne _020DDED8 + ldr r1, _020DDFD4 ; =0x0000A042 + ldr r0, _020DDFD8 ; =_021E408C + strh r1, [r2] + bl CARDi_SpiWaitWriteByte + bl CARDi_SpiDummyWait + ldr r0, _020DDFD8 ; =_021E408C + bl CARDi_SpiWaitReadByte + bl CARDi_SpiDummyWait + ldrb r4, [r6] + ldr r0, _020DDFC8 ; =_021E4088 + mov r5, #0 + str r5, [r0, #8] + cmp r4, #0xb9 + movhi r4, #0 + str r6, [r0, #0xc] + strb r5, [r6] + cmp r4, #0 + beq _020DDF60 + sub sl, r4, #1 + ldr sb, _020DDFDC ; =0x0000A002 + ldr r8, _020DDFD0 ; =0x040001A0 + ldr r7, _020DDFD8 ; =_021E408C + b _020DDF54 +_020DDF40: + mov r0, r7 + cmp r5, sl + streqh sb, [r8] + bl CARDi_SpiWaitReadByte + add r5, r5, #1 +_020DDF54: + cmp r5, r4 + blt _020DDF40 + b _020DDF74 +_020DDF60: + ldr r2, _020DDFDC ; =0x0000A002 + ldr r1, _020DDFD0 ; =0x040001A0 + ldr r0, _020DDFD8 ; =_021E408C + strh r2, [r1] + bl CARDi_SpiWaitReadByte +_020DDF74: + mov r5, #0 + b _020DDF8C +_020DDF7C: + ldrb r0, [r6, r5] + eor r0, r0, #0xaa + strb r0, [r6, r5] + add r5, r5, #1 +_020DDF8C: + cmp r5, r4 + blt _020DDF7C + ldr r1, _020DDFD0 ; =0x040001A0 +_020DDF98: + ldrh r0, [r1] + tst r0, #0x80 + bne _020DDF98 + ldr r0, _020DDFCC ; =_02110FBC + ldrh r0, [r0] + bl OS_UnLockCard + ldr r0, _020DDFCC ; =_02110FBC + ldrh r0, [r0] + bl CARD_UnlockBackup + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020DDFC4: .word _021E409C +_020DDFC8: .word _021E4088 +_020DDFCC: .word _02110FBC +_020DDFD0: .word 0x040001A0 +_020DDFD4: .word 0x0000A042 +_020DDFD8: .word _021E408C +_020DDFDC: .word 0x0000A002 + arm_func_end CARD_SpiWaitReadRange + + arm_func_start CARD_SpiWaitWriteRange +CARD_SpiWaitWriteRange: ; 0x020DDFE0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r7, _020DE0AC ; =_021E4158 + ldr r3, _020DE0B0 ; =_021E4088 + mov r4, #0 + str r7, [r3, #8] + ldr r2, _020DE0B4 ; =_02110FBC + str r4, [r3, #0xc] + mov r6, r0 + mov r3, #2 + ldrh r0, [r2] + mov r5, r1 + strb r3, [r7] + bl CARD_LockBackup + ldr r0, _020DE0B4 ; =_02110FBC + ldrh r0, [r0] + bl OS_LockCard + ldr r2, _020DE0B8 ; =0x040001A0 +_020DE024: + ldrh r0, [r2] + tst r0, #0x80 + bne _020DE024 + ldr r1, _020DE0BC ; =0x0000A042 + ldr r0, _020DE0C0 ; =_021E408C + strh r1, [r2] + bl CARDi_SpiWaitWriteByte + bl CARDi_SpiDummyWait + ldr r0, _020DE0B0 ; =_021E4088 + mov r4, #0 + str r6, [r0, #8] + sub sb, r5, #1 + ldr r8, _020DE0C4 ; =0x0000A002 + ldr r7, _020DE0B8 ; =0x040001A0 + ldr r6, _020DE0C0 ; =_021E408C + b _020DE078 +_020DE064: + mov r0, r6 + cmp r4, sb + streqh r8, [r7] + bl CARDi_SpiWaitWriteByte + add r4, r4, #1 +_020DE078: + cmp r4, r5 + blt _020DE064 + ldr r1, _020DE0B8 ; =0x040001A0 +_020DE084: + ldrh r0, [r1] + tst r0, #0x80 + bne _020DE084 + ldr r0, _020DE0B4 ; =_02110FBC + ldrh r0, [r0] + bl OS_UnLockCard + ldr r0, _020DE0B4 ; =_02110FBC + ldrh r0, [r0] + bl CARD_UnlockBackup + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020DE0AC: .word _021E4158 +_020DE0B0: .word _021E4088 +_020DE0B4: .word _02110FBC +_020DE0B8: .word 0x040001A0 +_020DE0BC: .word 0x0000A042 +_020DE0C0: .word _021E408C +_020DE0C4: .word 0x0000A002 + arm_func_end CARD_SpiWaitWriteRange + + arm_func_start CARD_SpiWaitGetStatus +CARD_SpiWaitGetStatus: ; 0x020DE0C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r3, _020DE228 ; =_021E409C + ldr r1, _020DE22C ; =_021E4088 + add r2, sp, #0 + str r3, [r1, #8] + str r2, [r1, #0xc] + ldr r0, _020DE230 ; =_02110FBC + mov r1, #8 + ldrh r0, [r0] + strb r1, [r3] + bl CARD_LockBackup + ldr r0, _020DE230 ; =_02110FBC + ldrh r0, [r0] + bl OS_LockCard + bl OS_GetTick + mov fp, #0 + mov r4, r0 + mov r5, r1 + mov r6, #0x40 + mov r8, fp + mov r7, #0x3e8 + mov sl, fp + mov sb, #0x3c +_020DE124: + bl OS_GetTick + subs r0, r0, r4 + umull lr, ip, r0, r6 + mla ip, r0, fp, ip + sbc r1, r1, r5 + mla ip, r1, r6, ip + umull r0, r1, lr, r7 + mla r1, lr, r8, r1 + mla r1, ip, r7, r1 + ldr r2, _020DE234 ; =0x000082EA + mov r3, #0 + bl _ll_udiv + cmp r1, sl + cmpeq r0, sb + blo _020DE124 + ldr r2, _020DE238 ; =0x040001A0 +_020DE164: + ldrh r0, [r2] + tst r0, #0x80 + bne _020DE164 + ldr r1, _020DE23C ; =0x0000A042 + ldr r0, _020DE240 ; =_021E408C + strh r1, [r2] + bl CARDi_SpiWaitWriteByte + strb r0, [sp] + bl OS_GetTick + mov r4, r0 + mov r5, r1 + mov r6, #0x40 + mov r7, #0x3e8 + mov sb, #0 + mov r8, #0x32 +_020DE1A0: + bl OS_GetTick + subs r0, r0, r4 + mov r3, #0 + sbc ip, r1, r5 + mov r1, r3 + umull fp, sl, r0, r6 + mla sl, r0, r1, sl + mla sl, ip, r6, sl + mov ip, r3 + umull r0, r1, fp, r7 + mla r1, fp, ip, r1 + mla r1, sl, r7, r1 + ldr r2, _020DE234 ; =0x000082EA + bl _ll_udiv + cmp r1, sb + cmpeq r0, r8 + blo _020DE1A0 + ldr r2, _020DE244 ; =0x0000A002 + ldr r1, _020DE238 ; =0x040001A0 + ldr r0, _020DE240 ; =_021E408C + strh r2, [r1] + bl CARDi_SpiWaitReadByte + ldr r1, _020DE238 ; =0x040001A0 +_020DE1FC: + ldrh r0, [r1] + tst r0, #0x80 + bne _020DE1FC + ldr r0, _020DE230 ; =_02110FBC + ldrh r0, [r0] + bl OS_UnLockCard + ldr r0, _020DE230 ; =_02110FBC + ldrh r0, [r0] + bl CARD_UnlockBackup + ldrb r0, [sp] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DE228: .word _021E409C +_020DE22C: .word _021E4088 +_020DE230: .word _02110FBC +_020DE234: .word 0x000082EA +_020DE238: .word 0x040001A0 +_020DE23C: .word 0x0000A042 +_020DE240: .word _021E408C +_020DE244: .word 0x0000A002 + arm_func_end CARD_SpiWaitGetStatus + + ; libwm + + arm_func_start WM_Init +WM_Init: ; 0x020DE248 + stmdb sp!, {r3, lr} + mov r2, #0xf00 + bl WmInitCore + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r1, _020DE270 ; =_021E4220 + mov r2, #0 + ldr r1, [r1, #4] + strh r2, [r1, #0x16] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DE270: .word _021E4220 + arm_func_end WM_Init + + arm_func_start WmInitCore +WmInitCore: ; 0x020DE274 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r6, r0 + mov r4, r1 + mov r7, r2 + bl OS_DisableInterrupts + ldr r1, _020DE444 ; =_021E4220 + mov r5, r0 + ldrh r1, [r1] + cmp r1, #0 + beq _020DE2A8 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DE2A8: + cmp r6, #0 + bne _020DE2BC + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DE2BC: + cmp r4, #3 + bls _020DE2D0 + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DE2D0: + tst r6, #0x1f + beq _020DE2E4 + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DE2E4: + bl PXI_Init + mov r0, #0xa + mov r1, #1 + bl PXI_IsCallbackReady + cmp r0, #0 + bne _020DE30C + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020DE30C: + mov r0, r6 + mov r1, r7 + bl DC_InvalidateRange + mov r0, r4 + mov r1, r6 + mov r3, r7 + mov r2, #0 + bl MI_DmaFill32 + ldr r0, _020DE444 ; =_021E4220 + add r1, r6, #0x200 + str r6, [r0, #4] + str r1, [r6] + ldr r2, [r0, #4] + ldr r1, [r2] + add r1, r1, #0x300 + str r1, [r2, #4] + ldr r2, [r0, #4] + ldr r1, [r2, #4] + add r1, r1, #0x800 + str r1, [r2, #0xc] + ldr r1, [r0, #4] + ldr r0, [r1, #0xc] + add r0, r0, #0x100 + str r0, [r1, #0x10] + bl WmClearFifoRecvFlag + ldr r1, _020DE444 ; =_021E4220 + mov r3, #0 + ldr r0, [r1, #4] + mov r2, r3 + strh r4, [r0, #0x14] + ldr r0, [r1, #4] + str r3, [r0, #0x14c] + ldr r0, [r1, #4] + add r0, r0, #0x100 + strh r3, [r0, #0x50] + b _020DE3B8 +_020DE39C: + ldr r0, [r1, #4] + add r0, r0, r3, lsl #2 + str r2, [r0, #0xcc] + ldr r0, [r1, #4] + add r0, r0, r3, lsl #2 + str r2, [r0, #0x10c] + add r3, r3, #1 +_020DE3B8: + cmp r3, #0x10 + blt _020DE39C + ldr r0, _020DE448 ; =_021E4228 + ldr r1, _020DE44C ; =_021E4248 + mov r2, #0xa + bl OS_InitMessageQueue + mov r6, #0 + mov r4, #0x8000 + ldr sl, _020DE450 ; =_021E42C0 + mov sb, #2 + ldr r8, _020DE448 ; =_021E4228 + mov r7, #1 + b _020DE414 +_020DE3EC: + mov r2, r6, lsl #8 + mov r1, sb + add r0, sl, r6, lsl #8 + strh r4, [sl, r2] + bl DC_StoreRange + mov r0, r8 + mov r2, r7 + add r1, sl, r6, lsl #8 + bl OS_SendMessage + add r6, r6, #1 +_020DE414: + cmp r6, #0xa + blt _020DE3EC + ldr r1, _020DE454 ; =WmReceiveFifo + mov r0, #0xa + bl PXI_SetFifoRecvCallback + ldr r1, _020DE444 ; =_021E4220 + mov r2, #1 + mov r0, r5 + strh r2, [r1] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020DE444: .word _021E4220 +_020DE448: .word _021E4228 +_020DE44C: .word _021E4248 +_020DE450: .word _021E42C0 +_020DE454: .word WmReceiveFifo + arm_func_end WmInitCore + + arm_func_start WM_Finish +WM_Finish: ; 0x020DE458 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, r0 + bl WMi_CheckInitialized + cmp r0, #0 + beq _020DE480 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, pc} +_020DE480: + mov r0, #1 + mov r1, #0 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + bl WmClearFifoRecvFlag + mov r0, #0xa + mov r1, #0 + bl PXI_SetFifoRecvCallback + ldr r1, _020DE4C4 ; =_021E4220 + mov r2, #0 + str r2, [r1, #4] + mov r0, r4 + strh r2, [r1] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DE4C4: .word _021E4220 + arm_func_end WM_Finish + + arm_func_start WMi_SetCallbackTable +WMi_SetCallbackTable: ; 0x020DE4C8 + ldr r2, _020DE4DC ; =_021E4220 + ldr r2, [r2, #4] + add r0, r2, r0, lsl #2 + str r1, [r0, #0x18] + bx lr + .align 2, 0 +_020DE4DC: .word _021E4220 + arm_func_end WMi_SetCallbackTable + + arm_func_start WmGetCommandBuffer4Arm7 +WmGetCommandBuffer4Arm7: ; 0x020DE4E0 + stmdb sp!, {r3, lr} + ldr r0, _020DE534 ; =_021E4228 + add r1, sp, #0 + mov r2, #0 + bl OS_ReceiveMessage + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [sp] + mov r1, #2 + bl DC_InvalidateRange + ldr r1, [sp] + ldrh r0, [r1] + tst r0, #0x8000 + movne r0, r1 + ldmneia sp!, {r3, pc} + ldr r0, _020DE534 ; =_021E4228 + mov r2, #1 + bl OS_JamMessage + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DE534: .word _021E4228 + arm_func_end WmGetCommandBuffer4Arm7 + + arm_func_start WMi_SendCommand +WMi_SendCommand: ; 0x020DE538 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WmGetCommandBuffer4Arm7 + movs r4, r0 + moveq r0, #8 + ldmeqia sp!, {r3, r4, r5, lr} + addeq sp, sp, #0x10 + bxeq lr + strh r5, [r4] + ldrh r5, [sp, #0x14] + add r0, sp, #0x14 + bic r0, r0, #3 + mov r3, #0 + cmp r5, #0 + add r2, r0, #4 + ble _020DE598 +_020DE57C: + add r2, r2, #4 + ldr r1, [r2, #-4] + add r0, r4, r3, lsl #2 + add r3, r3, #1 + str r1, [r0, #4] + cmp r3, r5 + blt _020DE57C +_020DE598: + mov r0, r4 + mov r1, #0x100 + bl DC_StoreRange + mov r1, r4 + mov r0, #0xa + mov r2, #0 + bl PXI_SendWordByFifo + mov r5, r0 + ldr r0, _020DE5E0 ; =_021E4228 + mov r1, r4 + mov r2, #1 + bl OS_SendMessage + cmp r5, #0 + movlt r0, #8 + movge r0, #2 + ldmia sp!, {r3, r4, r5, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020DE5E0: .word _021E4228 + arm_func_end WMi_SendCommand + + arm_func_start WMi_SendCommandDirect +WMi_SendCommandDirect: ; 0x020DE5E4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r4, r1 + bl WmGetCommandBuffer4Arm7 + movs r5, r0 + moveq r0, #8 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl MI_CpuCopy8 + mov r0, r5 + mov r1, r4 + bl DC_StoreRange + mov r1, r5 + mov r0, #0xa + mov r2, #0 + bl PXI_SendWordByFifo + mov r4, r0 + ldr r0, _020DE650 ; =_021E4228 + mov r1, r5 + mov r2, #1 + bl OS_SendMessage + cmp r4, #0 + movlt r0, #8 + movge r0, #2 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020DE650: .word _021E4228 + arm_func_end WMi_SendCommandDirect + + arm_func_start WMi_GetSystemWork +WMi_GetSystemWork: ; 0x020DE654 + ldr r0, _020DE660 ; =_021E4220 + ldr r0, [r0, #4] + bx lr + .align 2, 0 +_020DE660: .word _021E4220 + arm_func_end WMi_GetSystemWork + + arm_func_start WMi_CheckInitialized +WMi_CheckInitialized: ; 0x020DE664 + ldr r0, _020DE67C ; =_021E4220 + ldrh r0, [r0] + cmp r0, #0 + movne r0, #0 + moveq r0, #3 + bx lr + .align 2, 0 +_020DE67C: .word _021E4220 + arm_func_end WMi_CheckInitialized + + arm_func_start WMi_CheckIdle +WMi_CheckIdle: ; 0x020DE680 + stmdb sp!, {r3, lr} + bl WMi_CheckInitialized + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _020DE6C4 ; =_021E4220 + mov r1, #2 + ldr r0, [r0, #4] + ldr r0, [r0, #4] + bl DC_InvalidateRange + ldr r0, _020DE6C4 ; =_021E4220 + ldr r0, [r0, #4] + ldr r0, [r0, #4] + ldrh r0, [r0] + cmp r0, #1 + movls r0, #3 + movhi r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DE6C4: .word _021E4220 + arm_func_end WMi_CheckIdle + + arm_func_start WMi_CheckStateEx +WMi_CheckStateEx: ; 0x020DE6C8 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + bl WMi_CheckInitialized + cmp r0, #0 + ldmneia sp!, {r3, lr} + addne sp, sp, #0x10 + bxne lr + ldr r0, _020DE758 ; =_021E4220 + mov r1, #2 + ldr r0, [r0, #4] + ldr r0, [r0, #4] + bl DC_InvalidateRange + ldr r0, _020DE758 ; =_021E4220 + ldr r3, [sp, #8] + ldr r0, [r0, #4] + add r1, sp, #8 + ldr r2, [r0, #4] + bic r0, r1, #3 + add ip, r0, #4 + ldrh lr, [r2] + cmp r3, #0 + mov r0, #3 + ldmeqia sp!, {r3, lr} + addeq sp, sp, #0x10 + bxeq lr + mov r1, #0 +_020DE730: + add ip, ip, #4 + ldr r2, [ip, #-4] + cmp r2, lr + moveq r0, r1 + subs r3, r3, #1 + str r3, [sp, #8] + bne _020DE730 + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020DE758: .word _021E4220 + arm_func_end WMi_CheckStateEx + + arm_func_start WmReceiveFifo +WmReceiveFifo: ; 0x020DE75C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r0, _020DEAF4 ; =_021E4220 + cmp r2, #0 + ldr r4, [r0, #4] + mov sl, r1 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #0x10] + mov r1, #0x100 + bl DC_InvalidateRange + ldrh r0, [r4, #0x16] + cmp r0, #0 + bne _020DE7A0 + ldr r0, [r4, #4] + mov r1, #0x800 + bl DC_InvalidateRange +_020DE7A0: + ldr r0, [r4, #0x10] + cmp sl, r0 + beq _020DE7B8 + mov r0, sl + mov r1, #0x100 + bl DC_InvalidateRange +_020DE7B8: + ldrh r0, [sl] + cmp r0, #0x2c + blo _020DE870 + cmp r0, #0x80 + bne _020DE7F4 + ldrh r0, [sl, #2] + cmp r0, #0x13 + bne _020DE7DC + bl OS_Terminate +_020DE7DC: + ldr r1, [r4, #0xc8] + cmp r1, #0 + beq _020DEAB4 + mov r0, sl + blx r1 + b _020DEAB4 +_020DE7F4: + cmp r0, #0x82 + bne _020DE848 + ldrh r0, [sl, #6] + add r1, r4, r0, lsl #2 + ldr r0, [r1, #0xcc] + cmp r0, #0 + beq _020DEAB4 + ldr r0, [r1, #0x10c] + str r0, [sl, #0x1c] + ldr r0, [r4, #0x14c] + strh r0, [sl, #0x22] + ldr r1, [r4, #4] + ldr r0, [sl, #8] + ldrh r1, [r1, #0x72] + bl DC_InvalidateRange + ldrh r1, [sl, #6] + mov r0, sl + add r1, r4, r1, lsl #2 + ldr r1, [r1, #0xcc] + blx r1 + b _020DEAB4 +_020DE848: + cmp r0, #0x81 + bne _020DEAB4 + mov r0, #0xf + strh r0, [sl] + ldr r1, [sl, #0x1c] + cmp r1, #0 + beq _020DEAB4 + mov r0, sl + blx r1 + b _020DEAB4 +_020DE870: + cmp r0, #0xe + bne _020DE8B0 + ldrh r0, [sl, #4] + add r0, r0, #0xf5 + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _020DE8B0 + ldrh r0, [sl, #2] + cmp r0, #0 + bne _020DE8B0 + ldr r1, [r4, #4] + ldr r0, [sl, #8] + ldrh r1, [r1, #0x72] + bl DC_InvalidateRange +_020DE8B0: + ldrh r1, [sl] + cmp r1, #2 + ldreqh r0, [sl, #2] + cmpeq r0, #0 + add r0, r4, r1, lsl #2 + bne _020DE8EC + ldr r4, [r0, #0x18] + bl WM_Finish + cmp r4, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + blx r4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DE8EC: + ldr r1, [r0, #0x18] + cmp r1, #0 + beq _020DE914 + mov r0, sl + blx r1 + ldr r0, _020DEAF4 ; =_021E4220 + ldrh r0, [r0] + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020DE914: + ldrh r0, [sl] + cmp r0, #8 + cmpne r0, #0xc + bne _020DEAB4 + cmp r0, #8 + bne _020DE958 + add r0, sl, #0xa + str r0, [sp] + ldrh r5, [sl, #8] + ldrh r6, [sl, #0x10] + ldrh r0, [sl, #0x12] + add fp, sl, #0x14 + mov r7, #0 + str r0, [sp, #4] + ldrh r8, [sl, #0x2c] + ldrh sb, [sl, #0x2e] + b _020DE988 +_020DE958: + cmp r0, #0xc + bne _020DE988 + ldrh r5, [sl, #8] + ldrh r7, [sl, #0xa] + ldrh r0, [sl, #0xc] + mov r6, #0 + mov fp, r6 + str r0, [sp, #4] + add r0, sl, #0x10 + ldrh r8, [sl, #0x16] + ldrh sb, [sl, #0x18] + str r0, [sp] +_020DE988: + cmp r5, #7 + cmpne r5, #9 + cmpne r5, #0x1a + bne _020DEAB4 + cmp r5, #7 + ldreq r1, [r4, #0x14c] + mov r0, #1 + orreq r0, r1, r0, lsl r6 + mvnne r0, r0, lsl r6 + ldrne r1, [r4, #0x14c] + add r3, r4, #0x100 + andne r0, r1, r0 + str r0, [r4, #0x14c] + ldr r0, _020DEAF8 ; =_021E4270 + mov r1, #0 + mov r2, #0x44 + strh r7, [r3, #0x50] + bl MI_CpuFill8 + ldr ip, _020DEAF4 ; =_021E4220 + mov r1, #0x82 + strh r1, [ip, #0x50] + mov r1, #0 + strh r1, [ip, #0x52] + strh r5, [ip, #0x54] + str r1, [ip, #0x58] + str r1, [ip, #0x5c] + strh r1, [ip, #0x60] + strh r6, [ip, #0x62] + strh r7, [ip, #0x70] + ldr r2, [r4, #0x14c] + ldr r1, _020DEAFC ; =0x0000FFFF + strh r2, [ip, #0x72] + strh r1, [ip, #0x6a] + ldr r3, [sp, #4] + ldr r0, [sp] + ldr r1, _020DEB00 ; =_021E4284 + mov r2, #6 + strh r3, [ip, #0x8c] + bl MI_CpuCopy8 + cmp fp, #0 + mov r2, #0x18 + beq _020DEA40 + ldr r1, _020DEB04 ; =_021E4294 + mov r0, fp + bl MIi_CpuCopy16 + b _020DEA4C +_020DEA40: + ldr r1, _020DEB04 ; =_021E4294 + mov r0, #0 + bl MIi_CpuClear16 +_020DEA4C: + cmp r7, #0 + moveq r1, r8 + movne r1, sb + cmp r7, #0 + ldr r0, _020DEAF4 ; =_021E4220 + ldr r7, _020DEAF4 ; =_021E4220 + strh r1, [r0, #0x90] + movne sb, r8 + ldr r5, _020DEAF8 ; =_021E4270 + mov r6, #0 + strh sb, [r7, #0x92] +_020DEA78: + strh r6, [r7, #0x56] + add r2, r4, r6, lsl #2 + ldr r0, [r2, #0xcc] + cmp r0, #0 + beq _020DEAA0 + ldr r1, [r2, #0x10c] + mov r0, r5 + str r1, [r7, #0x6c] + ldr r1, [r2, #0xcc] + blx r1 +_020DEAA0: + add r0, r6, #1 + mov r0, r0, lsl #0x10 + mov r6, r0, lsr #0x10 + cmp r6, #0x10 + blo _020DEA78 +_020DEAB4: + ldr r0, [r4, #0x10] + mov r1, #0x100 + bl DC_InvalidateRange + bl WmClearFifoRecvFlag + ldr r0, [r4, #0x10] + cmp sl, r0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrh r2, [sl] + mov r0, sl + mov r1, #0x100 + orr r2, r2, #0x8000 + strh r2, [sl] + bl DC_StoreRange + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020DEAF4: .word _021E4220 +_020DEAF8: .word _021E4270 +_020DEAFC: .word 0x0000FFFF +_020DEB00: .word _021E4284 +_020DEB04: .word _021E4294 + arm_func_end WmReceiveFifo + + arm_func_start WmClearFifoRecvFlag +WmClearFifoRecvFlag: ; 0x020DEB08 + ldr r1, _020DEB20 ; =0x027FFF96 + ldrh r0, [r1] + tst r0, #1 + bicne r0, r0, #1 + strneh r0, [r1] + bx lr + .align 2, 0 +_020DEB20: .word 0x027FFF96 + arm_func_end WmClearFifoRecvFlag + + arm_func_start WMi_GetStatusAddress +WMi_GetStatusAddress: ; 0x020DEB24 + stmdb sp!, {r3, lr} + bl WMi_CheckInitialized + cmp r0, #0 + movne r0, #0 + ldreq r0, _020DEB44 ; =_021E4220 + ldreq r0, [r0, #4] + ldreq r0, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DEB44: .word _021E4220 + arm_func_end WMi_GetStatusAddress + + arm_func_start WM_GetAID +WM_GetAID: ; 0x020DEB48 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020DEB74 ; =_021E4220 + ldr r1, [r1, #4] + cmp r1, #0 + addne r1, r1, #0x100 + ldrneh r4, [r1, #0x50] + moveq r4, #0 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DEB74: .word _021E4220 + arm_func_end WM_GetAID + + arm_func_start WM_GetConnectedAIDs +WM_GetConnectedAIDs: ; 0x020DEB78 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020DEBA4 ; =_021E4220 + ldr r1, [r1, #4] + cmp r1, #0 + ldrne r4, [r1, #0x14c] + moveq r4, #0 + bl OS_RestoreInterrupts + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, pc} + .align 2, 0 +_020DEBA4: .word _021E4220 + arm_func_end WM_GetConnectedAIDs + + arm_func_start WM_SetIndCallback +WM_SetIndCallback: ; 0x020DEBA8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl OS_DisableInterrupts + mov r5, r0 + bl WMi_CheckInitialized + movs r4, r0 + beq _020DEBD4 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} +_020DEBD4: + bl WMi_GetSystemWork + str r6, [r0, #0xc8] + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end WM_SetIndCallback + + arm_func_start WM_SetPortCallback +WM_SetPortCallback: ; 0x020DEBEC + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x44 + movs r5, r1 + mov r6, r0 + mov r4, r2 + beq _020DEC54 + add r0, sp, #0 + mov r1, #0 + mov r2, #0x44 + bl MI_CpuFill8 + mov r3, #0 + ldr r1, _020DECC0 ; =0x0000FFFF + mov r7, #0x82 + mov r2, #0x19 + add r0, sp, #0x14 + strh r7, [sp] + strh r3, [sp, #2] + strh r2, [sp, #4] + strh r6, [sp, #6] + str r3, [sp, #8] + str r3, [sp, #0xc] + strh r3, [sp, #0x10] + strh r1, [sp, #0x1a] + str r4, [sp, #0x1c] + strh r3, [sp, #0x12] + bl OS_GetMacAddress +_020DEC54: + bl OS_DisableInterrupts + mov r8, r0 + bl WMi_CheckInitialized + movs r7, r0 + beq _020DEC7C + mov r0, r8 + bl OS_RestoreInterrupts + add sp, sp, #0x44 + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020DEC7C: + bl WMi_GetSystemWork + add r0, r0, r6, lsl #2 + str r5, [r0, #0xcc] + str r4, [r0, #0x10c] + cmp r5, #0 + beq _020DECAC + bl WM_GetConnectedAIDs + strh r0, [sp, #0x22] + bl WM_GetAID + strh r0, [sp, #0x20] + add r0, sp, #0 + blx r5 +_020DECAC: + mov r0, r8 + bl OS_RestoreInterrupts + mov r0, #0 + add sp, sp, #0x44 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020DECC0: .word 0x0000FFFF + arm_func_end WM_SetPortCallback + + arm_func_start WM_ReadStatus +WM_ReadStatus: ; 0x020DECC4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WMi_GetSystemWork + mov r4, r0 + bl WMi_CheckInitialized + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r5, #0 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + mov r1, #0x7d0 + bl DC_InvalidateRange + ldr r0, [r4, #4] + mov r1, r5 + mov r2, #0x7d0 + bl MIi_CpuCopyFast + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_ReadStatus + + arm_func_start WM_GetMPSendBufferSize +WM_GetMPSendBufferSize: ; 0x020DED10 + stmdb sp!, {r4, lr} + bl WMi_GetSystemWork + mov r4, r0 + mov r0, #2 + mov r1, #7 + mov r2, #8 + bl WMi_CheckStateEx + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #4] + mov r1, #4 + add r0, r0, #0xc + bl DC_InvalidateRange + ldr r1, [r4, #4] + ldr r0, [r1, #0xc] + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r1, #0x3c + mov r1, #4 + bl DC_InvalidateRange + ldr r0, [r4, #4] + ldrh r0, [r0, #0x3c] + add r0, r0, #0x1f + bic r0, r0, #0x1f + ldmia sp!, {r4, pc} + arm_func_end WM_GetMPSendBufferSize + + arm_func_start WM_GetMPReceiveBufferSize +WM_GetMPReceiveBufferSize: ; 0x020DED7C + stmdb sp!, {r3, r4, r5, lr} + bl WMi_GetSystemWork + mov r4, r0 + mov r0, #2 + mov r1, #7 + mov r2, #8 + bl WMi_CheckStateEx + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + mov r1, #4 + add r0, r0, #0xc + bl DC_InvalidateRange + ldr r1, [r4, #4] + ldr r0, [r1, #0xc] + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r1, #0x188 + mov r1, #2 + bl DC_InvalidateRange + ldr r1, [r4, #4] + add r0, r1, #0x100 + ldrh r0, [r0, #0x88] + cmp r0, #0 + moveq r5, #1 + add r0, r1, #0x3e + mov r1, #2 + movne r5, #0 + bl DC_InvalidateRange + ldr r0, [r4, #4] + cmp r5, #1 + ldrh r5, [r0, #0x3e] + addne r0, r5, #0x51 + bicne r0, r0, #0x1f + movne r0, r0, lsl #1 + ldmneia sp!, {r3, r4, r5, pc} + add r0, r0, #0xf8 + mov r1, #2 + bl DC_InvalidateRange + ldr r0, [r4, #4] + add r1, r5, #0xc + ldrh r0, [r0, #0xf8] + mul r0, r1, r0 + add r0, r0, #0x29 + bic r0, r0, #0x1f + mov r0, r0, lsl #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_GetMPReceiveBufferSize + + arm_func_start WM_ReadMPData +WM_ReadMPData: ; 0x020DEE40 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x3c + mov r5, r0 + mov r4, r1 + bl WMi_GetSystemWork + mov r6, r0 + bl WMi_CheckInitialized + cmp r0, #0 + addne sp, sp, #0x3c + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + cmp r4, #1 + blo _020DEE7C + cmp r4, #0xf + bls _020DEE88 +_020DEE7C: + add sp, sp, #0x3c + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, pc} +_020DEE88: + ldr r0, [r6, #4] + mov r1, #2 + add r0, r0, #0x82 + add r0, r0, #0x100 + bl DC_InvalidateRange + ldr r0, [r6, #4] + mov r1, #1 + add r0, r0, #0x100 + ldrh r0, [r0, #0x82] + tst r0, r1, lsl r4 + addeq sp, sp, #0x3c + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldrh r0, [r5, #4] + cmp r0, #0 + addeq sp, sp, #0x3c + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r0, r5, #0xa + str r0, [sp] + mov r3, #0 + add r2, sp, #0 +_020DEEE0: + ldr r0, [r2, r3, lsl #2] + ldrh r1, [r0, #4] + cmp r4, r1 + addeq sp, sp, #0x3c + ldmeqia sp!, {r3, r4, r5, r6, pc} + add r3, r3, #1 + add r0, r2, r3, lsl #2 + ldrh r1, [r5, #6] + ldr r0, [r0, #-4] + add r0, r1, r0 + str r0, [r2, r3, lsl #2] + ldrh r0, [r5, #4] + cmp r3, r0 + blt _020DEEE0 + mov r0, #0 + add sp, sp, #0x3c + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end WM_ReadMPData + + arm_func_start WM_GetAllowedChannel +WM_GetAllowedChannel: ; 0x020DEF24 + stmdb sp!, {r3, lr} + bl WMi_CheckInitialized + cmp r0, #0 + movne r0, #0x8000 + ldreq r0, _020DEF40 ; =0x027FFCFA + ldreqh r0, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020DEF40: .word 0x027FFCFA + arm_func_end WM_GetAllowedChannel + + arm_func_start WM_GetLinkLevel +WM_GetLinkLevel: ; 0x020DEF44 + stmdb sp!, {r4, lr} + bl WMi_GetSystemWork + mov r4, r0 + bl WMi_CheckInitialized + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r0, [r4, #4] + mov r1, #2 + bl DC_InvalidateRange + ldr r1, [r4, #4] + ldrh r0, [r1] + cmp r0, #9 + beq _020DEF8C + cmp r0, #0xa + cmpne r0, #0xb + beq _020DEFB4 + b _020DEFCC +_020DEF8C: + add r0, r1, #0x82 + add r0, r0, #0x100 + mov r1, #2 + bl DC_InvalidateRange + ldr r1, [r4, #4] + add r0, r1, #0x100 + ldrh r0, [r0, #0x82] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} +_020DEFB4: + add r0, r1, #0xbc + mov r1, #2 + bl DC_InvalidateRange + ldr r0, [r4, #4] + ldrh r0, [r0, #0xbc] + ldmia sp!, {r4, pc} +_020DEFCC: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end WM_GetLinkLevel + + arm_func_start WM_GetDispersionBeaconPeriod +WM_GetDispersionBeaconPeriod: ; 0x020DEFD4 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r0, sp, #0 + bl OS_GetMacAddress + mov r2, #0 + add r3, sp, #0 + mov r1, r2 +_020DEFF0: + ldrb r0, [r3], #1 + add r2, r2, #1 + cmp r2, #6 + add r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + blt _020DEFF0 + ldr r0, _020DF05C ; =0x027FFC3C + ldr ip, _020DF060 ; =0x66666667 + ldr r0, [r0] + mov r3, #0x14 + add r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + rsb r0, r0, r0, lsl #3 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r1, r2, lsr #0x1f + smull r2, lr, ip, r2 + add lr, r1, lr, asr #3 + smull r1, r2, r3, lr + rsb lr, r1, r0, lsr #16 + add r0, lr, #0xc8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DF05C: .word 0x027FFC3C +_020DF060: .word 0x66666667 + arm_func_end WM_GetDispersionBeaconPeriod + + arm_func_start WM_GetDispersionScanPeriod +WM_GetDispersionScanPeriod: ; 0x020DF064 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r0, sp, #0 + bl OS_GetMacAddress + mov r1, #0 + add r3, sp, #0 + mov r2, r1 +_020DF080: + ldrb r0, [r3], #1 + add r1, r1, #1 + cmp r1, #6 + add r0, r2, r0 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + blt _020DF080 + ldr r0, _020DF0F0 ; =0x027FFC3C + mov r1, #0xd + ldr r0, [r0] + ldr r3, _020DF0F4 ; =0x66666667 + add r0, r2, r0 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + mul r0, r2, r1 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r1, r2, lsr #0x1f + smull r2, ip, r3, r2 + add ip, r1, ip, asr #2 + mov r3, #0xa + smull r1, r2, r3, ip + rsb ip, r1, r0, lsr #16 + add r0, ip, #0x1e + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020DF0F0: .word 0x027FFC3C +_020DF0F4: .word 0x66666667 + arm_func_end WM_GetDispersionScanPeriod + + arm_func_start WM_GetOtherElements +WM_GetOtherElements: ; 0x020DF0F8 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x84 + ldrh r2, [r1, #0x3c] + mov lr, r0 + cmp r2, #0 + beq _020DF140 + mov r0, #0 + add r5, sp, #0 + strb r0, [sp] + mov r4, #8 +_020DF120: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _020DF120 + ldr r0, [r5] + add sp, sp, #0x84 + str r0, [lr] + ldmia sp!, {r3, r4, r5, r6, pc} +_020DF140: + ldrh r0, [r1, #0x3e] + strb r0, [sp] + ands r0, r0, #0xff + bne _020DF178 + add r5, sp, #0 + mov r4, #8 +_020DF158: + ldmia r5!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _020DF158 + ldr r0, [r5] + add sp, sp, #0x84 + str r0, [lr] + ldmia sp!, {r3, r4, r5, r6, pc} +_020DF178: + cmp r0, #0x10 + movhi r0, #0x10 + strhib r0, [sp] + ldrh r2, [r1] + ldrb r0, [sp] + mov r3, #0 + mov r2, r2, lsl #1 + sub r4, r2, #0x40 + cmp r0, #0 + add r0, r1, #0x40 + mov r2, r3 + and r1, r4, #0xff + ble _020DF228 + add ip, sp, #0 +_020DF1B0: + ldrb r5, [r0] + add r6, ip, r2, lsl #3 + add r4, r0, #2 + strb r5, [r6, #4] + ldrb r5, [r0, #1] + strb r5, [r6, #5] + str r4, [r6, #8] + ldrb r4, [r6, #5] + add r4, r4, #2 + and r5, r4, #0xff + add r3, r3, r5 + and r3, r3, #0xff + cmp r3, r1 + bls _020DF214 + mov r0, #0 + strb r0, [sp] + mov r4, #8 +_020DF1F4: + ldmia ip!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs r4, r4, #1 + bne _020DF1F4 + ldr r0, [ip] + add sp, sp, #0x84 + str r0, [lr] + ldmia sp!, {r3, r4, r5, r6, pc} +_020DF214: + ldrb r4, [sp] + add r2, r2, #1 + add r0, r0, r5 + cmp r2, r4 + blt _020DF1B0 +_020DF228: + add r4, sp, #0 + mov ip, #8 +_020DF230: + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _020DF230 + ldr r0, [r4] + str r0, [lr] + add sp, sp, #0x84 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end WM_GetOtherElements + + arm_func_start WM_GetNextTgid +WM_GetNextTgid: ; 0x020DF250 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr r0, _020DF2C0 ; =_02110FC0 + ldr r0, [r0] + cmp r0, #0x10000 + bne _020DF298 + bl RTC_Init + add r0, sp, #0 + bl RTC_GetTime + cmp r0, #0 + bne _020DF298 + ldr r2, [sp, #8] + ldr r0, [sp, #4] + ldr r1, _020DF2C0 ; =_02110FC0 + add r0, r2, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [r1] +_020DF298: + ldr r1, _020DF2C0 ; =_02110FC0 + ldr r0, [r1] + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r2, lsl #0x10 + str r2, [r1] + mov r0, r0, lsr #0x10 + add sp, sp, #0xc + ldmia sp!, {pc} + .align 2, 0 +_020DF2C0: .word _02110FC0 + arm_func_end WM_GetNextTgid + + arm_func_start WM_Enable +WM_Enable: ; 0x020DF2C4 + ldr ip, _020DF2D0 ; =WMi_EnableEx + mov r1, #0 + bx ip + .align 2, 0 +_020DF2D0: .word WMi_EnableEx + arm_func_end WM_Enable + + arm_func_start WMi_EnableEx +WMi_EnableEx: ; 0x020DF2D4 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + mov r0, #1 + mov r1, #0 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #3 + bl WMi_SetCallbackTable + bl WMi_GetSystemWork + mov r3, r0 + ldr r1, [r3, #0x10] + mov r0, #3 + stmia sp, {r1, r4} + mov r1, #4 + ldmia r3, {r2, r3} + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WMi_EnableEx + + arm_func_start WM_Disable +WM_Disable: ; 0x020DF338 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, r0 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #4 + bl WMi_SetCallbackTable + mov r0, #4 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_Disable + + arm_func_start WM_PowerOn +WM_PowerOn: ; 0x020DF378 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, r0 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #5 + bl WMi_SetCallbackTable + mov r0, #5 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_PowerOn + + arm_func_start WM_PowerOff +WM_PowerOff: ; 0x020DF3B8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, #2 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #6 + bl WMi_SetCallbackTable + mov r0, #6 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_PowerOff + + arm_func_start WM_Initialize +WM_Initialize: ; 0x020DF3F8 + ldr ip, _020DF404 ; =WMi_InitializeEx + mov r3, #0 + bx ip + .align 2, 0 +_020DF404: .word WMi_InitializeEx + arm_func_end WM_Initialize + + arm_func_start WM_InitializeForListening +WM_InitializeForListening: ; 0x020DF408 + ldr ip, _020DF41C ; =WMi_InitializeEx + cmp r3, #0 + mov r3, #1 + orreq r3, r3, #2 + bx ip + .align 2, 0 +_020DF41C: .word WMi_InitializeEx + arm_func_end WM_InitializeForListening + + arm_func_start WMi_InitializeEx +WMi_InitializeEx: ; 0x020DF420 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r1 + mov r1, r2 + mov r4, r3 + bl WM_Init + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #0 + bl WMi_SetCallbackTable + bl WMi_GetSystemWork + mov r3, r0 + ldr r1, [r3, #0x10] + mov r0, #0 + stmia sp, {r1, r4} + mov r1, #4 + ldmia r3, {r2, r3} + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WMi_InitializeEx + + arm_func_start WM_Reset +WM_Reset: ; 0x020DF480 + stmdb sp!, {r4, lr} + mov r4, r0 + bl WMi_CheckIdle + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #1 + bl WMi_SetCallbackTable + mov r0, #1 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_Reset + + arm_func_start WM_End +WM_End: ; 0x020DF4B8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, #2 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #2 + bl WMi_SetCallbackTable + mov r0, #2 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_End + + arm_func_start WM_SetParentParameter +WM_SetParentParameter: ; 0x020DF4F8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, #1 + mov r1, #2 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} + ldrh r0, [r4, #4] + cmp r0, #0 + beq _020DF540 + ldr r0, [r4] + cmp r0, #0 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} +_020DF540: + ldrh r1, [r4, #0x14] + ldrh r0, [r4, #0x34] + cmp r1, #0 + movne r2, #0x2a + moveq r2, #0 + add r0, r0, r2 + cmp r0, #0x200 + bgt _020DF57C + ldrh r0, [r4, #0x36] + cmp r1, #0 + movne r1, #6 + moveq r1, #0 + add r0, r0, r1 + cmp r0, #0x200 + ble _020DF584 +_020DF57C: + mov r0, #6 + ldmia sp!, {r3, r4, r5, pc} +_020DF584: + mov r0, r4 + bl WmCheckParentParameter + mov r1, r5 + mov r0, #7 + bl WMi_SetCallbackTable + mov r0, r4 + mov r1, #0x40 + bl DC_StoreRange + ldrh r1, [r4, #4] + cmp r1, #0 + beq _020DF5B8 + ldr r0, [r4] + bl DC_StoreRange +_020DF5B8: + mov r2, r4 + mov r0, #7 + mov r1, #1 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_SetParentParameter + + arm_func_start WmCheckParentParameter +WmCheckParentParameter: ; 0x020DF5D4 + ldrh r1, [r0, #4] + cmp r1, #0x70 + movhi r0, #0 + bxhi lr + ldrh r1, [r0, #0x18] + cmp r1, #0xa + blo _020DF5F8 + cmp r1, #0x3e8 + bls _020DF600 +_020DF5F8: + mov r0, #0 + bx lr +_020DF600: + ldrh r0, [r0, #0x32] + cmp r0, #1 + blo _020DF614 + cmp r0, #0xe + bls _020DF61C +_020DF614: + mov r0, #0 + bx lr +_020DF61C: + mov r0, #1 + bx lr + arm_func_end WmCheckParentParameter + + arm_func_start WMi_StartParentEx +WMi_StartParentEx: ; 0x020DF624 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, #1 + mov r1, #2 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + bl WMi_GetSystemWork + add r1, r0, #0x100 + mov r2, #0 + strh r2, [r1, #0x50] + str r2, [r0, #0x14c] + mov r1, r5 + mov r0, #8 + bl WMi_SetCallbackTable + mov r2, r4 + mov r0, #8 + mov r1, #1 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WMi_StartParentEx + + arm_func_start WM_StartParent +WM_StartParent: ; 0x020DF680 + ldr ip, _020DF68C ; =WMi_StartParentEx + mov r1, #1 + bx ip + .align 2, 0 +_020DF68C: .word WMi_StartParentEx + arm_func_end WM_StartParent + + arm_func_start WM_EndParent +WM_EndParent: ; 0x020DF690 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, #7 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #9 + bl WMi_SetCallbackTable + mov r0, #9 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_EndParent + + arm_func_start WM_StartScan +WM_StartScan: ; 0x020DF6D0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + mov r5, r0 + mov r0, #3 + mov r4, r1 + mov r2, r0 + mov r1, #2 + mov r3, #5 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + addeq sp, sp, #0x10 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4] + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, pc} + ldrh r0, [r4, #4] + cmp r0, #1 + blo _020DF738 + cmp r0, #0xe + bls _020DF744 +_020DF738: + add sp, sp, #0x10 + mov r0, #6 + ldmia sp!, {r3, r4, r5, pc} +_020DF744: + mov r1, r5 + mov r0, #0xa + bl WMi_SetCallbackTable + mov r0, #0xa + strh r0, [sp] + ldrh r2, [r4, #4] + add r0, sp, #0 + mov r1, #0x10 + strh r2, [sp, #2] + ldr r2, [r4] + str r2, [sp, #4] + ldrh r2, [r4, #6] + strh r2, [sp, #8] + ldrb r2, [r4, #8] + strb r2, [sp, #0xa] + ldrb r2, [r4, #9] + strb r2, [sp, #0xb] + ldrb r2, [r4, #0xa] + strb r2, [sp, #0xc] + ldrb r2, [r4, #0xb] + strb r2, [sp, #0xd] + ldrb r2, [r4, #0xc] + strb r2, [sp, #0xe] + ldrb r2, [r4, #0xd] + strb r2, [sp, #0xf] + bl WMi_SendCommandDirect + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_StartScan + + arm_func_start WM_StartScanEx +WM_StartScanEx: ; 0x020DF7BC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x3c + mov r5, r0 + mov r0, #3 + mov r4, r1 + mov r2, r0 + mov r1, #2 + mov r3, #5 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x3c + ldmneia sp!, {r4, r5, pc} + cmp r4, #0 + addeq sp, sp, #0x3c + moveq r0, #6 + ldmeqia sp!, {r4, r5, pc} + ldr r0, [r4] + cmp r0, #0 + addeq sp, sp, #0x3c + moveq r0, #6 + ldmeqia sp!, {r4, r5, pc} + ldrh r0, [r4, #4] + cmp r0, #0x400 + addhi sp, sp, #0x3c + movhi r0, #6 + ldmhiia sp!, {r4, r5, pc} + ldrh r0, [r4, #0x12] + cmp r0, #0x20 + addhi sp, sp, #0x3c + movhi r0, #6 + ldmhiia sp!, {r4, r5, pc} + ldrh r0, [r4, #0x10] + cmp r0, #0 + cmpne r0, #1 + cmpne r0, #2 + cmpne r0, #3 + addne sp, sp, #0x3c + movne r0, #6 + ldmneia sp!, {r4, r5, pc} + add r0, r0, #0xfe + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _020DF884 + ldrh r0, [r4, #0x34] + cmp r0, #0x20 + addhi sp, sp, #0x3c + movhi r0, #6 + ldmhiia sp!, {r4, r5, pc} +_020DF884: + mov r1, r5 + mov r0, #0x26 + bl WMi_SetCallbackTable + mov r0, #0x26 + strh r0, [sp] + ldrh r2, [r4, #6] + add r1, sp, #0xc + add r0, r4, #0xa + strh r2, [sp, #2] + ldr r3, [r4] + mov r2, #6 + str r3, [sp, #4] + ldrh r3, [r4, #4] + strh r3, [sp, #8] + ldrh r3, [r4, #8] + strh r3, [sp, #0xa] + bl MI_CpuCopy8 + ldrh r2, [r4, #0x10] + add r1, sp, #0x16 + add r0, r4, #0x14 + strh r2, [sp, #0x12] + ldrh r3, [r4, #0x34] + mov r2, #0x20 + strh r3, [sp, #0x36] + ldrh r3, [r4, #0x12] + strh r3, [sp, #0x14] + bl MI_CpuCopy8 + add r0, sp, #0 + mov r1, #0x3c + bl WMi_SendCommandDirect + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x3c + ldmia sp!, {r4, r5, pc} + arm_func_end WM_StartScanEx + + arm_func_start WM_EndScan +WM_EndScan: ; 0x020DF90C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r1, #5 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r4, pc} + mov r1, r4 + mov r0, #0xb + bl WMi_SetCallbackTable + mov r0, #0xb + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, pc} + arm_func_end WM_EndScan + + arm_func_start WM_StartConnectEx +WM_StartConnectEx: ; 0x020DF94C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x28 + mov r7, r0 + mov r6, r1 + mov r0, #1 + mov r1, #2 + mov r5, r2 + mov r4, r3 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x28 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + addeq sp, sp, #0x28 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r1, [r6] + mov r0, r6 + mov r1, r1, lsl #1 + bl DC_StoreRange + bl WMi_GetSystemWork + add r1, r0, #0x100 + mov r2, #0 + strh r2, [r1, #0x50] + str r2, [r0, #0x14c] + mov r1, r7 + mov r0, #0xc + bl WMi_SetCallbackTable + mov r0, #0xc + strh r0, [sp] + str r6, [sp, #4] + cmp r5, #0 + mov r2, #0x18 + beq _020DF9E4 + add r1, sp, #8 + mov r0, r5 + bl MI_CpuCopy8 + b _020DF9F0 +_020DF9E4: + add r0, sp, #8 + mov r1, #0 + bl MI_CpuFill8 +_020DF9F0: + ldrh r2, [sp, #0x40] + add r0, sp, #0 + mov r1, #0x28 + str r4, [sp, #0x20] + strh r2, [sp, #0x26] + bl WMi_SendCommandDirect + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WM_StartConnectEx + + arm_func_start WM_Disconnect +WM_Disconnect: ; 0x020DFA18 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + bl WMi_GetSystemWork + mov r1, #0xa + mov r6, r0 + str r1, [sp] + mov ip, #0xb + mov r0, #5 + mov r1, #7 + mov r2, #9 + mov r3, #8 + str ip, [sp, #4] + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, [r6, #4] + ldrh r0, [r1] + cmp r0, #7 + cmpne r0, #9 + bne _020DFAC4 + cmp r4, #1 + blo _020DFA84 + cmp r4, #0xf + bls _020DFA90 +_020DFA84: + add sp, sp, #8 + mov r0, #6 + ldmia sp!, {r4, r5, r6, pc} +_020DFA90: + add r0, r1, #0x82 + add r0, r0, #0x100 + mov r1, #2 + bl DC_InvalidateRange + ldr r0, [r6, #4] + mov r1, #1 + add r0, r0, #0x100 + ldrh r0, [r0, #0x82] + tst r0, r1, lsl r4 + bne _020DFAD4 + add sp, sp, #8 + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020DFAC4: + cmp r4, #0 + addne sp, sp, #8 + movne r0, #6 + ldmneia sp!, {r4, r5, r6, pc} +_020DFAD4: + mov r1, r5 + mov r0, #0xd + bl WMi_SetCallbackTable + mov r1, #1 + mov r2, r1, lsl r4 + mov r0, #0xd + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end WM_Disconnect + + arm_func_start WMi_StartMP +WMi_StartMP: ; 0x020DFB00 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x40 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl WMi_GetSystemWork + ldr r4, [r0, #4] + mov r0, #2 + mov r1, #7 + mov r2, #8 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x40 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r4, #0x188 + mov r1, #2 + bl DC_InvalidateRange + add r0, r4, #0xc6 + mov r1, #2 + bl DC_InvalidateRange + add r0, r4, #0x100 + ldrh r0, [r0, #0x88] + cmp r0, #0 + ldrneh r0, [r4, #0xc6] + cmpne r0, #1 + addne sp, sp, #0x40 + movne r0, #3 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r4, #0xc + mov r1, #4 + bl DC_InvalidateRange + ldr r0, [r4, #0xc] + cmp r0, #1 + addeq sp, sp, #0x40 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + tst r6, #0x3f + addne sp, sp, #0x40 + movne r0, #6 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrh sb, [sp, #0x60] + tst sb, #0x1f + addne sp, sp, #0x40 + movne r0, #6 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, r4, #0x9c + mov r1, #2 + bl DC_InvalidateRange + ldrh r0, [r4, #0x9c] + cmp r0, #0 + bne _020DFBF8 + bl WM_GetMPReceiveBufferSize + cmp r6, r0 + addlt sp, sp, #0x40 + movlt r0, #6 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + bl WM_GetMPSendBufferSize + cmp sb, r0 + addlt sp, sp, #0x40 + movlt r0, #6 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020DFBF8: + mov r1, r8 + mov r0, #0xe + bl WMi_SetCallbackTable + add r1, sp, #0 + mov r0, #0 + mov r2, #0x40 + bl MIi_CpuClear32 + mov r4, r6, lsr #1 + ldrh r3, [sp, #0x60] + mov r6, #0xe + add r1, sp, #0x14 + mov r0, #0 + mov r2, #0x1c + strh r6, [sp] + str r7, [sp, #4] + str r4, [sp, #8] + str r5, [sp, #0xc] + str r3, [sp, #0x10] + bl MIi_CpuClear32 + ldr r0, [sp, #0x64] + add r1, sp, #0x30 + mov r2, #0x10 + bl MIi_CpuCopy32 + add r0, sp, #0 + mov r1, #0x40 + bl WMi_SendCommandDirect + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end WMi_StartMP + + arm_func_start WM_StartMPEx +WM_StartMPEx: ; 0x020DFC70 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x18 + mov r7, r1 + mov r8, r0 + mov r6, r2 + add r1, sp, #8 + mov r0, #0 + mov r2, #0x10 + mov r5, r3 + ldr r4, [sp, #0x34] + bl MIi_CpuClear32 + ldr r1, [sp, #0x48] + ldrh ip, [sp, #0x38] + ldr r0, [sp, #0x44] + ldr lr, _020DFD10 ; =0x00001E03 + ldr r3, [sp, #0x3c] + ldr r2, [sp, #0x40] + strb r1, [sp, #0x16] + cmp r0, #0 + cmpne r4, #0 + strb r3, [sp, #0x14] + strb r2, [sp, #0x15] + ldrh r1, [sp, #0x30] + str lr, [sp, #8] + orrne r0, lr, #4 + strne r0, [sp, #8] + strh ip, [sp, #0x12] + strh r4, [sp, #0xc] + strh r4, [sp, #0xe] + strneh r4, [sp, #0x10] + str r1, [sp] + add r4, sp, #8 + mov r0, r8 + mov r1, r7 + mov r2, r6 + mov r3, r5 + str r4, [sp, #4] + bl WMi_StartMP + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020DFD10: .word 0x00001E03 + arm_func_end WM_StartMPEx + + arm_func_start WM_StartMP +WM_StartMP: ; 0x020DFD14 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + mov r6, r1 + mov r7, r0 + mov r5, r2 + add r1, sp, #8 + mov r0, #0 + mov r2, #0x10 + mov r4, r3 + bl MIi_CpuClear32 + ldrh ip, [sp, #0x34] + mov r0, #3 + str r0, [sp, #8] + ldrh lr, [sp, #0x30] + strh ip, [sp, #0xc] + strh ip, [sp, #0xe] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + add ip, sp, #8 + str lr, [sp] + str ip, [sp, #4] + bl WMi_StartMP + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WM_StartMP + + arm_func_start WM_SetMPDataToPortEx +WM_SetMPDataToPortEx: ; 0x020DFD7C + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + mov sb, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + mov r4, #1 + bl WMi_GetSystemWork + ldr r5, [r0, #4] + mov r0, #2 + mov r1, #9 + mov r2, #0xa + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x14 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r0, r5, #0x188 + mov r1, #2 + bl DC_InvalidateRange + add r0, r5, #0x100 + ldrh r0, [r0, #0x88] + cmp r0, #0 + bne _020DFDFC + add r0, r5, #0x82 + add r0, r0, #0x100 + mov r1, #2 + bl DC_InvalidateRange + add r2, r5, #0x100 + add r0, r5, #0x86 + mov r1, #2 + ldrh r4, [r2, #0x82] + bl DC_InvalidateRange +_020DFDFC: + cmp r7, #0 + addeq sp, sp, #0x14 + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + cmp r4, #0 + addeq sp, sp, #0x14 + moveq r0, #7 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + add r0, r5, #0x7c + mov r1, #2 + bl DC_InvalidateRange + ldr r0, [r5, #0x7c] + cmp r7, r0 + addeq sp, sp, #0x14 + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + cmp r6, #0x200 + addhi sp, sp, #0x14 + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, r7, r8, sb, pc} + cmp r6, #0 + addeq sp, sp, #0x14 + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r0, r7 + mov r1, r6 + bl DC_StoreRange + ldrh r2, [sp, #0x30] + ldrh r1, [sp, #0x34] + ldrh r0, [sp, #0x38] + str r2, [sp] + str r1, [sp, #4] + str r0, [sp, #8] + str sb, [sp, #0xc] + mov r2, r7 + mov r3, r6 + mov r0, #0xf + mov r1, #7 + str r8, [sp, #0x10] + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end WM_SetMPDataToPortEx + + arm_func_start WM_EndMP +WM_EndMP: ; 0x020DFEAC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WMi_GetSystemWork + mov r4, r0 + mov r0, #2 + mov r1, #9 + mov r2, #0xa + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + mov r1, #4 + add r0, r0, #0xc + bl DC_InvalidateRange + ldr r0, [r4, #4] + ldr r0, [r0, #0xc] + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #0x10 + bl WMi_SetCallbackTable + mov r0, #0x10 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_EndMP + + arm_func_start WM_StartDCF +WM_StartDCF: ; 0x020DFF1C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl WMi_GetSystemWork + mov r4, r0 + mov r0, #1 + mov r1, #8 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #4] + mov r1, #4 + add r0, r0, #0x10 + bl DC_InvalidateRange + ldr r0, [r4, #4] + ldr r0, [r0, #0x10] + cmp r0, #1 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #0x10 + movlo r0, #6 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, r5 + bl DC_StoreRange + mov r1, r7 + mov r0, #0x11 + bl WMi_SetCallbackTable + mov r2, r6 + mov r3, r5 + mov r0, #0x11 + mov r1, #2 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WM_StartDCF + + arm_func_start WM_SetDCFData +WM_SetDCFData: ; 0x020DFFBC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl WMi_GetSystemWork + mov r8, r0 + mov r0, #1 + mov r1, #0xb + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [r8, #4] + mov r1, #4 + add r0, r0, #0x10 + bl DC_InvalidateRange + ldr r0, [r8, #4] + ldr r0, [r0, #0x10] + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #3 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, _020E0084 ; =0x000005E4 + cmp r4, r0 + addhi sp, sp, #0x10 + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r5 + mov r1, r4 + bl DC_StoreRange + mov r1, r7 + mov r0, #0x12 + bl WMi_SetCallbackTable + add r1, sp, #8 + mov r0, r6 + mov r2, #6 + bl MI_CpuCopy8 + str r5, [sp] + str r4, [sp, #4] + ldr r2, [sp, #8] + ldr r3, [sp, #0xc] + mov r0, #0x12 + mov r1, #4 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E0084: .word 0x000005E4 + arm_func_end WM_SetDCFData + + arm_func_start WM_EndDCF +WM_EndDCF: ; 0x020E0088 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WMi_GetSystemWork + mov r4, r0 + mov r0, #1 + mov r1, #0xb + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + mov r1, #4 + add r0, r0, #0x10 + bl DC_InvalidateRange + ldr r0, [r4, #4] + ldr r0, [r0, #0x10] + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #0x13 + bl WMi_SetCallbackTable + mov r0, #0x13 + mov r1, #0 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_EndDCF + + arm_func_start WM_StartDataSharing +WM_StartDataSharing: ; 0x020E00F4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sl, r0 + mov r7, r1 + mov r6, r2 + mov r0, #2 + mov r1, #9 + mov r2, #0xa + mov r5, r3 + mov r8, #1 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0x10 + addhs sp, sp, #0xc + movhs r0, #6 + ldmhsia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r6, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl WM_GetAID + movs r4, r0 + bne _020E0170 + bl WM_GetConnectedAIDs + mov r8, r0 +_020E0170: + mov r1, sl + mov r0, #0 + mov r2, #0x820 + bl MIi_CpuClearFast + add r0, sl, #0x800 + mov r2, #0 + strh r2, [r0, #8] + strh r2, [r0, #0xa] + strh r2, [r0, #0xc] + strh r5, [r0, #0x10] + strh r7, [r0, #0x16] + strh r2, [r0, #0xe] + mov r0, #1 + ldr r1, [sp, #0x30] + orr r0, r6, r0, lsl r4 + cmp r1, #0 + mov r0, r0, lsl #0x10 + movne r2, #1 + add r1, sl, #0x800 + strh r2, [r1, #0x18] + mov r0, r0, lsr #0x10 + strh r0, [r1, #0xe] + bl MATH_CountPopulation + add r3, sl, #0x800 + mul r1, r5, r0 + strh r0, [r3, #0x12] + strh r1, [r3, #0x14] + ldrh r0, [r3, #0x14] + cmp r0, #0x1fc + bls _020E01FC + mov r0, #0 + strh r0, [r3, #0xe] + add sp, sp, #0xc + mov r0, #6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E01FC: + add r0, r0, #4 + strh r0, [r3, #0x14] + mov r0, #1 + strh r0, [r3, #0x1c] + cmp r4, #0 + bne _020E0314 + orr r4, r8, #1 + mov r2, #0 +_020E021C: + ldrh r1, [r3, #0xe] + mov r0, r2, lsl #9 + add r2, r2, #1 + and r1, r1, r4 + strh r1, [sl, r0] + cmp r2, #4 + blt _020E021C + ldr r1, _020E0338 ; =WmDataSharingReceiveCallback_Parent + mov r0, r7 + mov r2, sl + bl WM_SetPortCallback + mov r7, sl + mov sb, #0 + add r4, sl, #0x800 + mov r6, #1 + ldr fp, _020E033C ; =WmDataSharingSetDataCallback + ldr r5, _020E0340 ; =0x0000FFFF + b _020E02F8 +_020E0264: + ldrh r2, [r4, #8] + mov r0, fp + mov r1, sl + add r2, r2, #1 + and r2, r2, #3 + strh r2, [r4, #8] + ldrh r3, [r4, #0xe] + mov r2, r7 + and r3, r3, r8 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + str r3, [sp] + ldrh r3, [r4, #0x16] + stmib sp, {r3, r6} + ldrh r3, [r4, #0x14] + bl WM_SetMPDataToPortEx + cmp r0, #7 + bne _020E02CC + add r0, sl, sb, lsl #1 + add r0, r0, #0x800 + strh r5, [r0] + ldrh r0, [r4, #0xa] + add r0, r0, #1 + and r0, r0, #3 + strh r0, [r4, #0xa] + b _020E02F0 +_020E02CC: + cmp r0, #0 + cmpne r0, #2 + beq _020E02F0 + add r0, sl, #0x800 + mov r1, #5 + strh r1, [r0, #0x1c] + add sp, sp, #0xc + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E02F0: + add r7, r7, #0x200 + add sb, sb, #1 +_020E02F8: + ldrh r0, [r4, #0x18] + cmp r0, #1 + movne r0, #1 + moveq r0, #2 + cmp sb, r0 + blt _020E0264 + b _020E032C +_020E0314: + ldr r1, _020E0344 ; =WmDataSharingReceiveCallback_Child + mov r4, #3 + mov r0, r7 + mov r2, sl + strh r4, [r3, #0xa] + bl WM_SetPortCallback +_020E032C: + mov r0, #0 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E0338: .word WmDataSharingReceiveCallback_Parent +_020E033C: .word WmDataSharingSetDataCallback +_020E0340: .word 0x0000FFFF +_020E0344: .word WmDataSharingReceiveCallback_Child + arm_func_end WM_StartDataSharing + + arm_func_start WM_EndDataSharing +WM_EndDataSharing: ; 0x020E0348 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #6 + ldmeqia sp!, {r4, pc} + add r0, r4, #0x800 + ldrh r1, [r0, #0xe] + cmp r1, #0 + moveq r0, #3 + ldmeqia sp!, {r4, pc} + ldrh r0, [r0, #0x16] + mov r1, #0 + mov r2, r1 + bl WM_SetPortCallback + add r1, r4, #0x800 + mov r0, #0 + strh r0, [r1, #0xe] + strh r0, [r1, #0x1c] + ldmia sp!, {r4, pc} + arm_func_end WM_EndDataSharing + + arm_func_start WM_StepDataSharing +WM_StepDataSharing: ; 0x020E0390 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r0, #2 + mov r1, #9 + mov r2, #0xa + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sb, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r8, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl WM_GetAID + movs r5, r0 + bne _020E0404 + bl WM_GetConnectedAIDs + mov r4, r0 +_020E0404: + add r0, sl, #0x800 + ldrh r0, [r0, #0x1c] + cmp r0, #5 + addeq sp, sp, #0xc + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #1 + cmpne r0, #4 + addne sp, sp, #0xc + movne r0, #3 + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r5, #0 + mov r7, #5 + bne _020E05C8 + mov r5, #0 + mov fp, r5 + cmp r0, #4 + bne _020E04EC + add ip, sl, #0x800 + mov r2, #1 + strh r2, [ip, #0x1c] + ldrh r3, [ip, #0xe] + ldrh r1, [ip, #8] + ldr r0, _020E06D0 ; =WmDataSharingSetDataCallback + and r3, r3, r4 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + str r3, [sp] + ldrh r3, [ip, #0x16] + add r1, r1, #3 + and r6, r1, #3 + str r3, [sp, #4] + str r2, [sp, #8] + ldrh r3, [ip, #0x14] + mov r1, sl + add r2, sl, r6, lsl #9 + bl WM_SetMPDataToPortEx + cmp r0, #7 + bne _020E04C8 + add r0, sl, r6, lsl #1 + ldr r1, _020E06D4 ; =0x0000FFFF + add r0, r0, #0x800 + strh r1, [r0] + add r0, sl, #0x800 + ldrh r1, [r0, #0xa] + add r1, r1, #1 + and r1, r1, #3 + strh r1, [r0, #0xa] + b _020E04EC +_020E04C8: + cmp r0, #0 + cmpne r0, #2 + beq _020E04EC + add r0, sl, #0x800 + mov r1, r7 + strh r1, [r0, #0x1c] + add sp, sp, #0xc + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020E04EC: + add r0, sl, #0x800 + ldrh r2, [r0, #0xc] + ldrh r1, [r0, #0xa] + cmp r2, r1 + beq _020E0584 + mov r5, r2, lsl #9 + ldrh r3, [sl, r5] + mov r1, r8 + mov r2, #0x200 + orr r3, r3, #1 + strh r3, [sl, r5] + ldrh r0, [r0, #0xc] + add r0, sl, r0, lsl #9 + bl MIi_CpuCopy16 + add r1, sl, #0x800 + ldrh r0, [r1, #0xc] + mov r5, #1 + mov r7, #0 + add r0, sl, r0, lsl #1 + add r0, r0, #0x800 + ldrh r0, [r0] + strh r0, [r1, #0x1a] + ldrh r0, [r1, #0xc] + add r0, r0, #1 + and r0, r0, #3 + strh r0, [r1, #0xc] + ldrh r0, [r1, #0x18] + cmp r0, #0 + bne _020E0580 + cmp r4, #0 + beq _020E0580 + ldrh r0, [r1, #8] + mov r0, r0, lsl #9 + ldrh r0, [sl, r0] + cmp r0, #1 + moveq fp, r5 + beq _020E0584 +_020E0580: + mov fp, #0 +_020E0584: + mov r0, sl + mov r1, #0 + bl WmDataSharingSendDataSet + cmp r5, #0 + beq _020E06C4 + mov r0, sl + mov r2, sb + mov r1, #0 + bl WmDataSharingReceiveData + add r0, sl, #0x800 + ldrh r0, [r0, #0x18] + cmp r0, #0 + bne _020E06C4 + mov r0, sl + mov r1, fp + bl WmDataSharingSendDataSet + b _020E06C4 +_020E05C8: + cmp r0, #4 + mov r0, #0 + add r1, sl, #0x800 + moveq r0, #1 + streqh r0, [r1, #0x1c] + beq _020E0648 + ldrh r2, [r1, #0xc] + ldrh r1, [r1, #8] + cmp r2, r1 + beq _020E0648 + mov r2, r2, lsl #9 + ldrh r1, [sl, r2] + tst r1, #1 + orreq r1, r1, #1 + streqh r1, [sl, r2] + beq _020E0648 + mov r1, r8 + add r0, sl, r2 + mov r2, #0x200 + bl MIi_CpuCopy16 + add r2, sl, #0x800 + ldrh r1, [r2, #0xc] + mov r0, #1 + mov r7, #0 + add r1, sl, r1, lsl #1 + add r1, r1, #0x800 + ldrh r1, [r1] + strh r1, [r2, #0x1a] + ldrh r1, [r2, #0xc] + add r1, r1, #1 + and r1, r1, #3 + strh r1, [r2, #0xc] +_020E0648: + cmp r0, #0 + beq _020E06C4 + add r0, sl, #0x800 + ldrh r1, [r0, #0xa] + ldrh r2, [r0, #0x10] + mov r0, sb + add r6, sl, r1, lsl #9 + add r1, r6, #0x20 + bl MIi_CpuCopy16 + add r3, sl, #0x800 + ldrh r1, [r3, #0xe] + mov r4, #1 + ldr r0, _020E06D0 ; =WmDataSharingSetDataCallback + str r1, [sp] + ldrh r5, [r3, #0x16] + mov r1, sl + add r2, r6, #0x20 + str r5, [sp, #4] + str r4, [sp, #8] + ldrh r3, [r3, #0x10] + bl WM_SetMPDataToPortEx + add r1, sl, #0x800 + ldrh r2, [r1, #0xa] + cmp r0, #2 + cmpne r0, #0 + add r2, r2, #1 + and r2, r2, #3 + strh r2, [r1, #0xa] + movne r0, #5 + strneh r0, [r1, #0x1c] + movne r7, r4 +_020E06C4: + mov r0, r7 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E06D0: .word WmDataSharingSetDataCallback +_020E06D4: .word 0x0000FFFF + arm_func_end WM_StepDataSharing + + arm_func_start WmDataSharingSetDataCallback +WmDataSharingSetDataCallback: ; 0x020E06D8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WMi_GetSystemWork + ldrh r2, [r5, #0xa] + ldr r1, _020E07A8 ; =WmDataSharingReceiveCallback_Parent + add r0, r0, r2, lsl #2 + ldr r2, [r0, #0xcc] + ldr r4, [r0, #0x10c] + cmp r2, r1 + ldrne r0, _020E07AC ; =WmDataSharingReceiveCallback_Child + cmpne r2, r0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x20] + cmp r4, r0 + ldmneia sp!, {r3, r4, r5, pc} + bl WM_GetAID + ldrh r1, [r5, #2] + cmp r1, #0 + bne _020E0764 + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + add r1, r4, #0x800 + ldrh r0, [r1, #0xa] + ldrh r2, [r5, #0x1a] + add r0, r4, r0, lsl #1 + mov r2, r2, asr #1 + add r0, r0, #0x800 + strh r2, [r0] + ldrh r0, [r1, #0xa] + add r0, r0, #1 + and r0, r0, #3 + strh r0, [r1, #0xa] + ldmia sp!, {r3, r4, r5, pc} +_020E0764: + cmp r1, #0xa + bne _020E0798 + cmp r0, #0 + beq _020E0788 + add r0, r4, #0x800 + ldrh r1, [r0, #0xa] + add r1, r1, #3 + and r1, r1, #3 + strh r1, [r0, #0xa] +_020E0788: + add r0, r4, #0x800 + mov r1, #4 + strh r1, [r0, #0x1c] + ldmia sp!, {r3, r4, r5, pc} +_020E0798: + add r0, r4, #0x800 + mov r1, #5 + strh r1, [r0, #0x1c] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E07A8: .word WmDataSharingReceiveCallback_Parent +_020E07AC: .word WmDataSharingReceiveCallback_Child + arm_func_end WmDataSharingSetDataCallback + + arm_func_start WmDataSharingReceiveCallback_Parent +WmDataSharingReceiveCallback_Parent: ; 0x020E07B0 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r0, #0x1c] + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldrh r1, [r0, #2] + cmp r1, #0 + bne _020E08CC + ldrh r1, [r0, #4] + cmp r1, #0x15 + bgt _020E07FC + bge _020E081C + cmp r1, #9 + ldmgtia sp!, {r4, r5, r6, pc} + cmp r1, #7 + ldmltia sp!, {r4, r5, r6, pc} + beq _020E083C + cmp r1, #9 + beq _020E084C + ldmia sp!, {r4, r5, r6, pc} +_020E07FC: + cmp r1, #0x1a + ldmgtia sp!, {r4, r5, r6, pc} + cmp r1, #0x19 + ldmltia sp!, {r4, r5, r6, pc} + ldmeqia sp!, {r4, r5, r6, pc} + cmp r1, #0x1a + beq _020E084C + ldmia sp!, {r4, r5, r6, pc} +_020E081C: + ldrh r1, [r0, #0x12] + ldr r2, [r0, #0xc] + mov r0, r4 + bl WmDataSharingReceiveData + mov r0, r4 + mov r1, #0 + bl WmDataSharingSendDataSet + ldmia sp!, {r4, r5, r6, pc} +_020E083C: + mov r0, r4 + mov r1, #0 + bl WmDataSharingSendDataSet + ldmia sp!, {r4, r5, r6, pc} +_020E084C: + ldrh r5, [r0, #0x12] + mov r6, #1 + bl OS_DisableInterrupts + add r1, r4, #0x800 + ldrh lr, [r1, #8] + mvn ip, r6, lsl r5 + mov r3, lr, lsl #9 + ldrh r2, [r4, r3] + and r2, r2, ip + strh r2, [r4, r3] + ldrh r1, [r1, #0x18] + cmp r1, #1 + bne _020E089C + add r1, lr, #1 + and r1, r1, #3 + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #7 + ldrh r1, [r4, r2] + and r1, r1, ip + strh r1, [r4, r2] +_020E089C: + bl OS_RestoreInterrupts + mov r0, r4 + mov r1, #0 + bl WmDataSharingSendDataSet + add r0, r4, #0x800 + ldrh r0, [r0, #0x18] + cmp r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r4 + mov r1, #0 + bl WmDataSharingSendDataSet + ldmia sp!, {r4, r5, r6, pc} +_020E08CC: + add r0, r4, #0x800 + mov r1, #5 + strh r1, [r0, #0x1c] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end WmDataSharingReceiveCallback_Parent + + arm_func_start WmDataSharingReceiveCallback_Child +WmDataSharingReceiveCallback_Child: ; 0x020E08DC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldr r4, [r8, #0x1c] + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrh r0, [r8, #2] + cmp r0, #0 + bne _020E09C0 + ldrh r0, [r8, #4] + cmp r0, #0x15 + bgt _020E0924 + bge _020E093C + cmp r0, #9 + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} + cmp r0, #7 + ldmltia sp!, {r4, r5, r6, r7, r8, pc} + cmpne r0, #9 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E0924: + cmp r0, #0x1a + ldmgtia sp!, {r4, r5, r6, r7, r8, pc} + cmp r0, #0x19 + ldmltia sp!, {r4, r5, r6, r7, r8, pc} + cmpne r0, #0x1a + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E093C: + ldr r7, [r8, #0xc] + ldrh r5, [r8, #0x10] + ldrh r6, [r7] + bl WM_GetAID + add r1, r4, #0x800 + ldrh r1, [r1, #0x14] + cmp r5, r1 + beq _020E0964 + cmp r5, #0x200 + movhi r5, #0x200 +_020E0964: + cmp r5, #4 + ldmloia sp!, {r4, r5, r6, r7, r8, pc} + mov r1, #1 + tst r6, r1, lsl r0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r4, #0x800 + ldrh r1, [r0, #8] + mov r0, r7 + mov r2, r5 + add r1, r4, r1, lsl #9 + bl MIi_CpuCopy16 + add r1, r4, #0x800 + ldrh r0, [r1, #8] + ldrh r2, [r8, #0x1a] + add r0, r4, r0, lsl #1 + mov r2, r2, asr #1 + add r0, r0, #0x800 + strh r2, [r0] + ldrh r0, [r1, #8] + add r0, r0, #1 + and r0, r0, #3 + strh r0, [r1, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020E09C0: + add r0, r4, #0x800 + mov r1, #5 + strh r1, [r0, #0x1c] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end WmDataSharingReceiveCallback_Child + + arm_func_start WmDataSharingReceiveData +WmDataSharingReceiveData: ; 0x020E09D0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r3, r1 + mov r1, #1 + mov r4, r1, lsl r3 + add r0, r6, #0x800 + ldrh r1, [r0, #0xe] + mov r7, r4, lsl #0x10 + mov r5, r2 + tst r1, r7, lsr #16 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r4, [r0, #8] + mov r2, r4, lsl #9 + ldrh r2, [r6, r2] + tst r2, r7, lsr #16 + bne _020E0A34 + ldrh r0, [r0, #0x18] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r0, r4, #1 + and r4, r0, #3 + mov r0, r4, lsl #9 + ldrh r0, [r6, r0] + tst r0, r7, lsr #16 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020E0A34: + add r2, r6, r4, lsl #9 + mov r0, r6 + add r2, r2, #4 + bl WmGetSharedDataAddress + mov r1, r0 + add r0, r6, #0x800 + cmp r5, #0 + ldrh r2, [r0, #0x10] + beq _020E0A64 + mov r0, r5 + bl MIi_CpuCopy16 + b _020E0A6C +_020E0A64: + mov r0, #0 + bl MIi_CpuClear16 +_020E0A6C: + bl OS_DisableInterrupts + mov r4, r4, lsl #9 + ldrh r3, [r6, r4] + mvn r1, r7, lsr #16 + add r2, r6, #2 + and r1, r3, r1 + strh r1, [r6, r4] + ldrh r1, [r2, r4] + orr r1, r1, r7, lsr #16 + strh r1, [r2, r4] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WmDataSharingReceiveData + + arm_func_start WmDataSharingSendDataSet +WmDataSharingSendDataSet: ; 0x020E0A9C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0xc + mov sl, r0 + mov sb, r1 + bl OS_DisableInterrupts + add r1, sl, #0x800 + ldrh r1, [r1, #8] + mov r4, r0 + mov r1, r1, lsl #9 + ldrh r1, [sl, r1] + cmp r1, #0 + bne _020E0BDC + bl WM_GetConnectedAIDs + add r1, sl, #0x800 + ldrh r6, [r1, #8] + ldrh r1, [r1, #0x18] + mov r7, r0 + add r0, r6, #1 + and r5, r0, #3 + cmp r1, #1 + addeq r0, r5, #1 + andeq r8, r0, #3 + movne r8, r5 + add r1, sl, r8, lsl #9 + mov r0, #0 + mov r2, #0x200 + bl MIi_CpuClear16 + add r0, sl, #0x800 + ldrh r3, [r0, #0xe] + orr r2, r7, #1 + mov r1, r8, lsl #9 + and r2, r3, r2 + strh r2, [sl, r1] + strh r5, [r0, #8] + ldrh r0, [r0, #0xe] + mov r1, r6, lsl #9 + cmp sb, #1 + strh r0, [sl, r1] + ldreqh r0, [sl, r1] + biceq r0, r0, #1 + streqh r0, [sl, r1] + mov r0, r4 + bl OS_RestoreInterrupts + add r3, sl, #0x800 + ldrh r1, [r3, #0xe] + mov r4, #1 + ldr r0, _020E0BE8 ; =WmDataSharingSetDataCallback + and r1, r1, r7 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + str r1, [sp] + ldrh r5, [r3, #0x16] + mov r1, sl + add r2, sl, r6, lsl #9 + str r5, [sp, #4] + str r4, [sp, #8] + ldrh r3, [r3, #0x14] + bl WM_SetMPDataToPortEx + cmp r0, #7 + bne _020E0BB8 + add r0, sl, r6, lsl #1 + ldr r1, _020E0BEC ; =0x0000FFFF + add r0, r0, #0x800 + strh r1, [r0] + add r0, sl, #0x800 + ldrh r1, [r0, #0xa] + add sp, sp, #0xc + add r1, r1, #1 + and r1, r1, #3 + strh r1, [r0, #0xa] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020E0BB8: + cmp r0, #0 + cmpne r0, #2 + addeq sp, sp, #0xc + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + add r0, sl, #0x800 + mov r1, #5 + strh r1, [r0, #0x1c] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020E0BDC: + bl OS_RestoreInterrupts + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020E0BE8: .word WmDataSharingSetDataCallback +_020E0BEC: .word 0x0000FFFF + arm_func_end WmDataSharingSendDataSet + + arm_func_start WM_GetSharedDataAddress +WM_GetSharedDataAddress: ; 0x020E0BF0 + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + cmp r0, #0 + ldrh r1, [lr] + ldrh ip, [lr, #2] + mov r2, #1 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + cmp lr, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + tst r1, r2, lsl r3 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + tst ip, r2, lsl r3 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + add r2, lr, #4 + bl WmGetSharedDataAddress + ldmia sp!, {r3, pc} + arm_func_end WM_GetSharedDataAddress + + arm_func_start WmGetSharedDataAddress +WmGetSharedDataAddress: ; 0x020E0C44 + stmdb sp!, {r3, r4, r5, lr} + mov ip, #1 + mov r3, ip, lsl r3 + sub r3, r3, #1 + mov r5, r0 + and r0, r1, r3 + mov r4, r2 + bl MATH_CountPopulation + add r1, r5, #0x800 + ldrh r1, [r1, #0x10] + mla r0, r1, r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WmGetSharedDataAddress + + arm_func_start WM_StartKeySharing +WM_StartKeySharing: ; 0x020E0C74 + stmdb sp!, {r3, lr} + mov ip, #1 + rsb r2, ip, #0x10000 + mov r3, #2 + str ip, [sp] + bl WM_StartDataSharing + ldmia sp!, {r3, pc} + arm_func_end WM_StartKeySharing + + arm_func_start WM_EndKeySharing +WM_EndKeySharing: ; 0x020E0C90 + ldr ip, _020E0C98 ; =WM_EndDataSharing + bx ip + .align 2, 0 +_020E0C98: .word WM_EndDataSharing + arm_func_end WM_EndKeySharing + + arm_func_start WM_SetWEPKey +WM_SetWEPKey: ; 0x020E0C9C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl WMi_CheckIdle + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + cmp r5, #3 + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, pc} + cmp r5, #0 + beq _020E0CE4 + cmp r4, #0 + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r4 + mov r1, #0x50 + bl DC_StoreRange +_020E0CE4: + mov r1, r6 + mov r0, #0x14 + bl WMi_SetCallbackTable + mov r2, r5 + mov r3, r4 + mov r0, #0x14 + mov r1, #2 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end WM_SetWEPKey + + arm_func_start WM_SetWEPKeyEx +WM_SetWEPKeyEx: ; 0x020E0D10 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl WMi_CheckIdle + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #3 + movhi r0, #6 + ldmhiia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + beq _020E0D5C + cmp r4, #0 + moveq r0, #6 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + mov r1, #0x50 + bl DC_StoreRange +_020E0D5C: + mov r1, r7 + mov r0, #0x27 + bl WMi_SetCallbackTable + mov r2, r6 + mov r3, r4 + mov r0, #0x27 + mov r1, #3 + str r5, [sp] + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WM_SetWEPKeyEx + + arm_func_start WM_SetGameInfo +WM_SetGameInfo: ; 0x020E0D8C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r0, #2 + mov r1, #7 + mov r2, #9 + mov r4, r3 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + cmp r6, #0 + addeq sp, sp, #0xc + moveq r0, #6 + ldmeqia sp!, {r4, r5, r6, r7, pc} + cmp r5, #0x70 + addhi sp, sp, #0xc + movhi r0, #6 + ldmhiia sp!, {r4, r5, r6, r7, pc} + ldr r1, _020E0E40 ; =_021E4CC0 + mov r0, r6 + mov r2, r5 + bl MIi_CpuCopy16 + ldr r0, _020E0E40 ; =_021E4CC0 + mov r1, r5 + bl DC_StoreRange + mov r1, r7 + mov r0, #0x18 + bl WMi_SetCallbackTable + ldrh r0, [sp, #0x20] + str r4, [sp] + ldrb r1, [sp, #0x24] + str r0, [sp, #4] + ldr r2, _020E0E40 ; =_021E4CC0 + str r1, [sp, #8] + mov r3, r5 + mov r0, #0x18 + mov r1, #5 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020E0E40: .word _021E4CC0 + arm_func_end WM_SetGameInfo + + arm_func_start WM_SetBeaconIndication +WM_SetBeaconIndication: ; 0x020E0E44 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl WMi_CheckIdle + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + cmpne r4, #1 + movne r0, #6 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #0x19 + bl WMi_SetCallbackTable + mov r2, r4 + mov r0, #0x19 + mov r1, #1 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_SetBeaconIndication + + arm_func_start WM_SetLifeTime +WM_SetLifeTime: ; 0x020E0E94 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl WMi_CheckIdle + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r7 + mov r0, #0x1d + bl WMi_SetCallbackTable + ldrh ip, [sp, #0x20] + mov r2, r6 + mov r3, r5 + mov r0, #0x1d + mov r1, #4 + stmia sp, {r4, ip} + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WM_SetLifeTime + + arm_func_start WM_MeasureChannel +WM_MeasureChannel: ; 0x020E0EF4 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xc + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl WMi_GetSystemWork + mov r0, #1 + mov r1, #2 + bl WMi_CheckStateEx + cmp r0, #0 + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, pc} + mov r1, r7 + mov r0, #0x1e + bl WMi_SetCallbackTable + ldrh r2, [sp, #0x20] + mov r3, #0x1e + add r0, sp, #0 + mov r1, #0xa + strh r3, [sp] + strh r6, [sp, #2] + strh r5, [sp, #4] + strh r4, [sp, #6] + strh r2, [sp, #8] + bl WMi_SendCommandDirect + cmp r0, #0 + moveq r0, #2 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end WM_MeasureChannel + + arm_func_start WM_SetEntry +WM_SetEntry: ; 0x020E0F6C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, #2 + mov r1, #7 + mov r2, #9 + bl WMi_CheckStateEx + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r0, #0x21 + bl WMi_SetCallbackTable + mov r2, r4 + mov r0, #0x21 + mov r1, #1 + bl WMi_SendCommand + cmp r0, #0 + moveq r0, #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WM_SetEntry + + arm_func_start CTRDGi_InitCommon +CTRDGi_InitCommon: ; 0x020E0FB8 + stmdb sp!, {r3, lr} + ldr r1, _020E0FE4 ; =_021E4D44 + mov r3, #0 + ldr r2, _020E0FE8 ; =0x05000001 + add r0, sp, #0 + str r3, [sp] + bl SVC_CpuSet + bl OS_GetLockID + ldr r1, _020E0FEC ; =_021E4D40 + strh r0, [r1, #6] + ldmia sp!, {r3, pc} + .align 2, 0 +_020E0FE4: .word _021E4D44 +_020E0FE8: .word 0x05000001 +_020E0FEC: .word _021E4D40 + arm_func_end CTRDGi_InitCommon + + arm_func_start CTRDG_IsAgbCartridge +CTRDG_IsAgbCartridge: ; 0x020E0FF0 + stmdb sp!, {r3, lr} + bl CTRDG_IsExisting + cmp r0, #0 + beq _020E1010 + bl CTRDGi_IsAgbCartridgeAtInit + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, pc} +_020E1010: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end CTRDG_IsAgbCartridge + + arm_func_start CTRDG_IsOptionCartridge +CTRDG_IsOptionCartridge: ; 0x020E1018 + stmdb sp!, {r3, lr} + bl CTRDG_IsExisting + cmp r0, #0 + beq _020E1038 + bl CTRDGi_IsAgbCartridgeAtInit + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} +_020E1038: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end CTRDG_IsOptionCartridge + + arm_func_start CTRDGi_IsAgbCartridgeAtInit +CTRDGi_IsAgbCartridgeAtInit: ; 0x020E1040 + ldr r0, _020E1054 ; =0x027FFC30 + ldrb r0, [r0, #5] + mov r0, r0, lsl #0x1f + mov r0, r0, lsr #0x1f + bx lr + .align 2, 0 +_020E1054: .word 0x027FFC30 + arm_func_end CTRDGi_IsAgbCartridgeAtInit + + arm_func_start CTRDG_GetAgbGameCode +CTRDG_GetAgbGameCode: ; 0x020E1058 + stmdb sp!, {r4, lr} + mov r4, #0 + bl CTRDG_IsExisting + cmp r0, #0 + beq _020E1074 + bl CTRDGi_GetAgbGameCodeAtInit + mov r4, r0 +_020E1074: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end CTRDG_GetAgbGameCode + + arm_func_start CTRDGi_GetAgbGameCodeAtInit +CTRDGi_GetAgbGameCodeAtInit: ; 0x020E107C + stmdb sp!, {r4, lr} + mov r4, #0 + bl CTRDGi_IsAgbCartridgeAtInit + cmp r0, #0 + ldrne r0, _020E109C ; =0x027FFC30 + ldrne r4, [r0, #8] + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020E109C: .word 0x027FFC30 + arm_func_end CTRDGi_GetAgbGameCodeAtInit + + arm_func_start CTRDG_GetAgbMakerCode +CTRDG_GetAgbMakerCode: ; 0x020E10A0 + stmdb sp!, {r4, lr} + mov r4, #0 + bl CTRDG_IsExisting + cmp r0, #0 + beq _020E10BC + bl CTRDGi_GetAgbMakerCodeAtInit + mov r4, r0 +_020E10BC: + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end CTRDG_GetAgbMakerCode + + arm_func_start CTRDGi_GetAgbMakerCodeAtInit +CTRDGi_GetAgbMakerCodeAtInit: ; 0x020E10C4 + stmdb sp!, {r4, lr} + mov r4, #0 + bl CTRDGi_IsAgbCartridgeAtInit + cmp r0, #0 + ldrne r0, _020E10E4 ; =0x027FFC30 + ldrneh r4, [r0, #6] + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020E10E4: .word 0x027FFC30 + arm_func_end CTRDGi_GetAgbMakerCodeAtInit + + arm_func_start CTRDG_IsPulledOut +CTRDG_IsPulledOut: ; 0x020E10E8 + stmdb sp!, {r3, lr} + ldr r2, _020E112C ; =0x027FFC30 + ldr r0, _020E1130 ; =0x0000FFFF + ldrh r1, [r2] + cmp r1, r0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1e + movs r0, r0, lsr #0x1f + bne _020E1118 + bl CTRDG_IsExisting +_020E1118: + ldr r0, _020E112C ; =0x027FFC30 + ldrb r0, [r0, #5] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1f + ldmia sp!, {r3, pc} + .align 2, 0 +_020E112C: .word 0x027FFC30 +_020E1130: .word 0x0000FFFF + arm_func_end CTRDG_IsPulledOut + + arm_func_start CTRDG_IsExisting +CTRDG_IsExisting: ; 0x020E1134 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr r2, _020E1234 ; =0x027FFC30 + mov r4, #1 + ldrh r1, [r2] + rsb r0, r4, #0x10000 + cmp r1, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1f + cmp r0, #1 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _020E1238 ; =_021E4D40 + add r1, sp, #8 + ldrh r0, [r0, #6] + bl CTRDGi_LockByProcessor + add r0, sp, #0 + bl CTRDGi_ChangeLatestAccessCycle + mov r0, #0x8000000 + ldrb r2, [r0, #0xb2] + cmp r2, #0x96 + bne _020E11B4 + ldr r1, _020E1234 ; =0x027FFC30 + ldrh r0, [r0, #0xbe] + ldrh r1, [r1] + cmp r1, r0 + bne _020E11FC +_020E11B4: + cmp r2, #0x96 + beq _020E11D4 + ldr r1, _020E1234 ; =0x027FFC30 + ldr r0, _020E123C ; =0x0801FFFE + ldrh r1, [r1] + ldrh r0, [r0] + cmp r1, r0 + bne _020E11FC +_020E11D4: + ldr r2, _020E1234 ; =0x027FFC30 + mov r0, #0x8000000 + ldr r1, [r2, #8] + ldr r0, [r0, #0xac] + cmp r1, r0 + beq _020E1210 + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _020E1210 +_020E11FC: + ldr r1, _020E1234 ; =0x027FFC30 + mov r4, #0 + ldrb r0, [r1, #5] + orr r0, r0, #2 + strb r0, [r1, #5] +_020E1210: + add r0, sp, #0 + bl CTRDGi_RestoreAccessCycle + ldr r0, _020E1238 ; =_021E4D40 + add r1, sp, #8 + ldrh r0, [r0, #6] + bl CTRDGi_UnlockByProcessor + mov r0, r4 + add sp, sp, #0x10 + ldmia sp!, {r4, pc} + .align 2, 0 +_020E1234: .word 0x027FFC30 +_020E1238: .word _021E4D40 +_020E123C: .word 0x0801FFFE + arm_func_end CTRDG_IsExisting + + arm_func_start CTRDGi_ChangeLatestAccessCycle +CTRDGi_ChangeLatestAccessCycle: ; 0x020E1240 + ldr r2, _020E1284 ; =0x04000204 + ldrh r1, [r2] + and r1, r1, #0xc + mov r1, r1, asr #2 + str r1, [r0] + ldrh r1, [r2] + and r1, r1, #0x10 + mov r1, r1, asr #4 + str r1, [r0, #4] + ldrh r0, [r2] + bic r0, r0, #0xc + orr r0, r0, #0xc + strh r0, [r2] + ldrh r0, [r2] + bic r0, r0, #0x10 + strh r0, [r2] + bx lr + .align 2, 0 +_020E1284: .word 0x04000204 + arm_func_end CTRDGi_ChangeLatestAccessCycle + + arm_func_start CTRDGi_RestoreAccessCycle +CTRDGi_RestoreAccessCycle: ; 0x020E1288 + ldr r3, _020E12B8 ; =0x04000204 + ldr r2, [r0] + ldrh r1, [r3] + bic r1, r1, #0xc + orr r1, r1, r2, lsl #2 + strh r1, [r3] + ldrh r1, [r3] + ldr r2, [r0, #4] + bic r0, r1, #0x10 + orr r0, r0, r2, lsl #4 + strh r0, [r3] + bx lr + .align 2, 0 +_020E12B8: .word 0x04000204 + arm_func_end CTRDGi_RestoreAccessCycle + + arm_func_start CTRDGi_LockByProcessor +CTRDGi_LockByProcessor: ; 0x020E12BC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, _020E1314 ; =0x027FFFE8 + mov r7, r0 + mov r6, r1 + mov r4, #1 +_020E12D0: + bl OS_DisableInterrupts + str r0, [r6, #4] + mov r0, r5 + bl OS_ReadOwnerOfLockWord + ands r0, r0, #0x40 + str r0, [r6] + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + bl OS_TryLockCartridge + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r6, #4] + bl OS_RestoreInterrupts + mov r0, r4 + bl SVC_WaitByLoop + b _020E12D0 +_020E1310: ; 0x020E1310 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E1314: .word 0x027FFFE8 + arm_func_end CTRDGi_LockByProcessor + + arm_func_start CTRDGi_UnlockByProcessor +CTRDGi_UnlockByProcessor: ; 0x020E1318 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, [r4] + cmp r1, #0 + bne _020E1330 + bl OS_UnLockCartridge +_020E1330: + ldr r0, [r4, #4] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + arm_func_end CTRDGi_UnlockByProcessor + + arm_func_start CTRDGi_SendtoPxi +CTRDGi_SendtoPxi: ; 0x020E133C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r1, r7 + mov r0, #0xd + mov r2, #0 + bl PXI_SendWordByFifo + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r6, #1 + mov r5, #0xd + mov r4, #0 +_020E1368: + mov r0, r6 + bl SVC_WaitByLoop + mov r0, r5 + mov r1, r7 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _020E1368 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CTRDGi_SendtoPxi + + arm_func_start CTRDG_CpuCopy8 +CTRDG_CpuCopy8: ; 0x020E138C + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + cmp lr, #0x8000000 + blo _020E13C4 + ldr r2, _020E13E0 ; =0x0A010000 + cmp lr, r2 + bhs _020E13C4 + mov ip, #1 + mov r2, r0 + mov r0, #0 + str ip, [sp] + bl CTRDGi_CopyCommon + ldmia sp!, {r3, pc} +_020E13C4: + mov ip, #1 + mov r1, r0 + mov r2, lr + mov r0, #0 + str ip, [sp] + bl CTRDGi_CopyCommon + ldmia sp!, {r3, pc} + .align 2, 0 +_020E13E0: .word 0x0A010000 + arm_func_end CTRDG_CpuCopy8 + + arm_func_start CTRDG_CpuCopy16 +CTRDG_CpuCopy16: ; 0x020E13E4 + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + mov ip, #0x11 + mov r1, r0 + mov r2, lr + mov r0, #0 + str ip, [sp] + bl CTRDGi_CopyCommon + ldmia sp!, {r3, pc} + arm_func_end CTRDG_CpuCopy16 + + arm_func_start CTRDG_CpuCopy32 +CTRDG_CpuCopy32: ; 0x020E140C + stmdb sp!, {r3, lr} + mov lr, r1 + mov r3, r2 + mov ip, #0x21 + mov r1, r0 + mov r2, lr + mov r0, #0 + str ip, [sp] + bl CTRDGi_CopyCommon + ldmia sp!, {r3, pc} + arm_func_end CTRDG_CpuCopy32 + + arm_func_start CTRDGi_CopyCommon +CTRDGi_CopyCommon: ; 0x020E1434 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl CTRDG_IsExisting + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl CTRDG_CheckEnabled + ldr r0, _020E156C ; =_021E4D40 + ldrh r0, [r0, #6] + bl OS_LockCartridge + ldr r0, [sp, #0x18] + tst r0, #1 + bne _020E1488 + mov r0, r7 + bl MI_StopDma + mov r0, r5 + mov r1, r4 + bl DC_FlushRange +_020E1488: + ldr r0, [sp, #0x18] + cmp r0, #0x11 + bhi _020E14B8 + cmp r0, #0x10 + blo _020E14AC + beq _020E14D4 + cmp r0, #0x11 + beq _020E1504 + b _020E154C +_020E14AC: + cmp r0, #1 + beq _020E152C + b _020E154C +_020E14B8: + cmp r0, #0x20 + bhi _020E14C8 + beq _020E14EC + b _020E154C +_020E14C8: + cmp r0, #0x21 + beq _020E1518 + b _020E154C +_020E14D4: + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl MI_DmaCopy16 + b _020E154C +_020E14EC: + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl MI_DmaCopy32 + b _020E154C +_020E1504: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl MIi_CpuCopy16 + b _020E154C +_020E1518: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl MIi_CpuCopy32 + b _020E154C +_020E152C: + cmp r4, #0 + mov r1, #0 + bls _020E154C +_020E1538: + ldrb r0, [r6], #1 + add r1, r1, #1 + cmp r1, r4 + strb r0, [r5], #1 + blo _020E1538 +_020E154C: + ldr r0, _020E156C ; =_021E4D40 + ldrh r0, [r0, #6] + bl OS_UnLockCartridge + bl CTRDG_IsExisting + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E156C: .word _021E4D40 + arm_func_end CTRDGi_CopyCommon + + arm_func_start CTRDG_Read32 +CTRDG_Read32: ; 0x020E1570 + ldr ip, _020E1584 ; =CTRDGi_AccessCommon + mov r2, r1 + mov r1, #0 + mov r3, #0x41 + bx ip + .align 2, 0 +_020E1584: .word CTRDGi_AccessCommon + arm_func_end CTRDG_Read32 + + arm_func_start CTRDGi_AccessCommon +CTRDGi_AccessCommon: ; 0x020E1588 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl CTRDG_IsExisting + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl CTRDG_CheckEnabled + ldr r0, _020E1664 ; =_021E4D40 + ldrh r0, [r0, #6] + bl OS_LockCartridge + cmp r4, #0x21 + bhi _020E15F4 + bhs _020E1620 + cmp r4, #0x11 + bhi _020E15E8 + cmp r4, #0x10 + blo _020E1644 + beq _020E1640 + cmp r4, #0x11 + beq _020E1610 + b _020E1644 +_020E15E8: + cmp r4, #0x20 + streqh r6, [r7] + b _020E1644 +_020E15F4: + cmp r4, #0x40 + bhi _020E1604 + streq r6, [r7] + b _020E1644 +_020E1604: + cmp r4, #0x41 + beq _020E1630 + b _020E1644 +_020E1610: + cmp r5, #0 + ldrneb r0, [r7] + strneb r0, [r5] + b _020E1644 +_020E1620: + cmp r5, #0 + ldrneh r0, [r7] + strneh r0, [r5] + b _020E1644 +_020E1630: + cmp r5, #0 + ldrne r0, [r7] + strne r0, [r5] + b _020E1644 +_020E1640: + strb r6, [r7] +_020E1644: + ldr r0, _020E1664 ; =_021E4D40 + ldrh r0, [r0, #6] + bl OS_UnLockCartridge + bl CTRDG_IsExisting + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E1664: .word _021E4D40 + arm_func_end CTRDGi_AccessCommon + + arm_func_start CTRDG_IsEnabled +CTRDG_IsEnabled: ; 0x020E1668 + ldr r0, _020E1674 ; =_021E4D40 + ldr r0, [r0] + bx lr + .align 2, 0 +_020E1674: .word _021E4D40 + arm_func_end CTRDG_IsEnabled + + arm_func_start CTRDG_Enable +CTRDG_Enable: ; 0x020E1678 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _020E16BC ; =_021E4D40 + mov r4, r0 + str r5, [r1] + bl CTRDG_IsOptionCartridge + cmp r0, #0 + bne _020E16B0 + cmp r5, #0 + movne r1, #0x1000 + moveq r1, #0x5000 + mov r0, #0xf000 + bl OS_SetDPermissionsForProtectionRegion +_020E16B0: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E16BC: .word _021E4D40 + arm_func_end CTRDG_Enable + + arm_func_start CTRDG_CheckEnabled +CTRDG_CheckEnabled: ; 0x020E16C0 + stmdb sp!, {r3, lr} + bl CTRDG_IsOptionCartridge + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl CTRDG_IsEnabled + cmp r0, #0 + ldmneia sp!, {r3, pc} + bl OS_Terminate + ldmia sp!, {r3, pc} + arm_func_end CTRDG_CheckEnabled + + arm_func_start CTRDG_Init +CTRDG_Init: ; 0x020E16E4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020E1784 ; =_021E4D60 + ldr r1, [r0, #8] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #1 + str r1, [r0, #8] + bl CTRDGi_InitCommon + ldr r0, _020E1784 ; =_021E4D60 + mov r1, #0 + str r1, [r0, #0xc] + bl PXI_Init + mov r5, #0xd + mov r4, #1 +_020E171C: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _020E171C + ldr r1, _020E1788 ; =CTRDGi_CallbackForInitModuleInfo + mov r0, #0xd + bl PXI_SetFifoRecvCallback + bl CTRDGi_InitModuleInfo + mov r0, #0xd + mov r1, #0 + bl PXI_SetFifoRecvCallback + ldr r1, _020E178C ; =CTRDGi_PulledOutCallback + mov r0, #0xd + bl PXI_SetFifoRecvCallback + ldr r1, _020E1784 ; =_021E4D60 + mov r2, #0 + ldr r0, _020E1790 ; =_021E4E40 + str r2, [r1, #0x18] + bl CTRDGi_InitTaskThread + ldr r1, _020E1794 ; =CTRDGi_CallbackForSetPhi + mov r0, #0x11 + bl PXI_SetFifoRecvCallback + mov r0, #0 + bl CTRDG_Enable + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E1784: .word _021E4D60 +_020E1788: .word CTRDGi_CallbackForInitModuleInfo +_020E178C: .word CTRDGi_PulledOutCallback +_020E1790: .word _021E4E40 +_020E1794: .word CTRDGi_CallbackForSetPhi + arm_func_end CTRDG_Init + + arm_func_start CTRDGi_InitModuleInfo +CTRDGi_InitModuleInfo: ; 0x020E1798 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + ldr r0, _020E1960 ; =_021E4D60 + ldr r1, [r0] + cmp r1, #0 + addne sp, sp, #0x10 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _020E1964 ; =0x04000300 + mov r2, #1 + ldrh r1, [r1] + str r2, [r0] + tst r1, #1 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0x40000 + bl OS_SetIrqMask + ldr r3, _020E1968 ; =0x04000208 + mov r2, #1 + ldrh r5, [r3] + ldr r1, _020E196C ; =_021E4D44 + mov r4, r0 + strh r2, [r3] + ldrh r0, [r1, #2] + add r1, sp, #8 + bl CTRDGi_LockByProcessor + ldr r1, _020E1970 ; =0x04000204 + add r0, sp, #0 + ldrh r1, [r1] + and r1, r1, #0x8000 + mov r6, r1, asr #0xf + bl CTRDGi_ChangeLatestAccessCycle + ldr r3, _020E1970 ; =0x04000204 + ldr r0, _020E1974 ; =_021E4D80 + ldrh r2, [r3] + add r0, r0, #0x80 + mov r1, #0x40 + bic r2, r2, #0x8000 + strh r2, [r3] + bl DC_InvalidateRange + ldr r2, _020E1974 ; =_021E4D80 + ldr r1, _020E1978 ; =0x08000080 + mov r0, #1 + mov r3, #0x40 + add r2, r2, #0x80 + bl MI_DmaCopy16 + ldr r2, _020E1970 ; =0x04000204 + add r0, sp, #0 + ldrh r1, [r2] + bic r1, r1, #0x8000 + orr r1, r1, r6, lsl #15 + strh r1, [r2] + bl CTRDGi_RestoreAccessCycle + ldr r0, _020E196C ; =_021E4D44 + add r1, sp, #8 + ldrh r0, [r0, #2] + bl CTRDGi_UnlockByProcessor + ldr r1, _020E197C ; =0x027FFF9B + ldrb r0, [r1] + cmp r0, #0 + bne _020E1894 + ldrb r0, [r1, #-1] + cmp r0, #0 + bne _020E18F8 +_020E1894: + ldr r3, _020E1974 ; =_021E4D80 + ldr r6, _020E1980 ; =0x027FFC30 + ldrh r0, [r3, #0xbe] + mov r2, #0 + strh r0, [r6] + b _020E18C0 +_020E18AC: + add r0, r3, r2 + ldrb r1, [r0, #0xb5] + add r0, r6, r2 + add r2, r2, #1 + strb r1, [r0, #2] +_020E18C0: + cmp r2, #3 + blt _020E18AC + ldrh r0, [r3, #0xb0] + strh r0, [r6, #6] + ldr r0, [r3, #0xac] + str r0, [r6, #8] + bl CTRDG_IsExisting + cmp r0, #0 + movne r2, #1 + ldr r1, _020E197C ; =0x027FFF9B + moveq r2, #0 + mov r0, #1 + strb r2, [r1] + strb r0, [r1, #-1] +_020E18F8: + ldr r0, _020E1984 ; =0xFFFF0020 + ldr r1, _020E1988 ; =_021E4D84 + mov r2, #0x9c + bl MIi_CpuCopy32 + bl DC_FlushAll + ldr r0, _020E1974 ; =_021E4D80 + add r0, r0, #0xfe000000 + mov r0, r0, lsr #5 + mov r0, r0, lsl #6 + orr r0, r0, #1 + bl CTRDGi_SendtoPxi + mov r7, #1 + ldr r6, _020E196C ; =_021E4D44 + b _020E1938 +_020E1930: + mov r0, r7 + bl SVC_WaitByLoop +_020E1938: + ldrh r0, [r6] + cmp r0, #1 + bne _020E1930 + ldr r2, _020E1968 ; =0x04000208 + mov r0, r4 + ldrh r1, [r2] + strh r5, [r2] + bl OS_SetIrqMask + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E1960: .word _021E4D60 +_020E1964: .word 0x04000300 +_020E1968: .word 0x04000208 +_020E196C: .word _021E4D44 +_020E1970: .word 0x04000204 +_020E1974: .word _021E4D80 +_020E1978: .word 0x08000080 +_020E197C: .word 0x027FFF9B +_020E1980: .word 0x027FFC30 +_020E1984: .word 0xFFFF0020 +_020E1988: .word _021E4D84 + arm_func_end CTRDGi_InitModuleInfo + + arm_func_start CTRDGi_CallbackForInitModuleInfo +CTRDGi_CallbackForInitModuleInfo: ; 0x020E198C + stmdb sp!, {r3, lr} + and r0, r1, #0x3f + cmp r0, #1 + bne _020E19AC + ldr r0, _020E19B4 ; =_021E4D44 + mov r1, #1 + strh r1, [r0] + ldmia sp!, {r3, pc} +_020E19AC: + bl OS_Terminate + ldmia sp!, {r3, pc} + .align 2, 0 +_020E19B4: .word _021E4D44 + arm_func_end CTRDGi_CallbackForInitModuleInfo + + arm_func_start CTRDGi_PulledOutCallback +CTRDGi_PulledOutCallback: ; 0x020E19B8 + stmdb sp!, {r3, lr} + and r0, r1, #0x3f + cmp r0, #0x11 + bne _020E1A08 + ldr r0, _020E1A10 ; =_021E4D60 + ldr r1, [r0, #0xc] + cmp r1, #0 + ldmneia sp!, {r3, pc} + ldr r1, [r0, #0x18] + mov r0, #0 + cmp r1, #0 + beq _020E19EC + blx r1 +_020E19EC: + cmp r0, #0 + beq _020E19F8 + bl CTRDG_TerminateForPulledOut +_020E19F8: + ldr r0, _020E1A10 ; =_021E4D60 + mov r1, #1 + str r1, [r0, #0xc] + ldmia sp!, {r3, pc} +_020E1A08: + bl OS_Terminate + ldmia sp!, {r3, pc} + .align 2, 0 +_020E1A10: .word _021E4D60 + arm_func_end CTRDGi_PulledOutCallback + + arm_func_start CTRDG_TerminateForPulledOut +CTRDG_TerminateForPulledOut: ; 0x020E1A14 + stmdb sp!, {r3, lr} + mov r0, #2 + bl CTRDGi_SendtoPxi + bl OS_Terminate + ldmia sp!, {r3, pc} + arm_func_end CTRDG_TerminateForPulledOut + + arm_func_start CTRDGi_CallbackForSetPhi +CTRDGi_CallbackForSetPhi: ; 0x020E1A28 + ldr r0, _020E1A38 ; =_021E4D60 + mov r1, #0 + str r1, [r0, #4] + bx lr + .align 2, 0 +_020E1A38: .word _021E4D60 + arm_func_end CTRDGi_CallbackForSetPhi + + arm_func_start CTRDG_IdentifyAgbBackup +CTRDG_IdentifyAgbBackup: ; 0x020E1A3C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + cmp r7, #1 + mov r0, #1 + bhi _020E1B8C + bl OS_GetLockID + ldr r1, _020E1BA8 ; =_021E4F2C + strh r0, [r1] + ldrh r0, [r1] + bl OS_LockCartridge + ldr r4, _020E1BAC ; =0x04000204 + ldr r1, _020E1BB0 ; =_0210E1DC + ldrh r3, [r4] + ldrh r2, [r4] + ldr r0, _020E1BB4 ; =_02110FC8 + and r6, r3, #3 + bic r2, r2, #3 + orr r2, r2, #3 + strh r2, [r4] + str r1, [r0] + bl CTRDGi_ReadFlashID + ldr r2, _020E1BAC ; =0x04000204 + mov r4, r0 + ldrh r1, [r2] + cmp r7, #0 + ldreq r5, _020E1BB8 ; =_0210E1EC + bic r1, r1, #3 + orr r1, r1, r6 + cmp r7, #1 + ldr r0, _020E1BA8 ; =_021E4F2C + strh r1, [r2] + ldrh r0, [r0] + ldreq r5, _020E1BBC ; =_0210E1E0 + bl OS_UnlockCartridge + ldr r3, [r5] + mov r0, #1 + ldrh r1, [r3, #0x38] + cmp r1, #0 + beq _020E1AFC + and r2, r4, #0xff +_020E1ADC: + ldrh r1, [r3, #0x38] + cmp r2, r1 + moveq r0, #0 + beq _020E1AFC + ldr r3, [r5, #4]! + ldrh r1, [r3, #0x38] + cmp r1, #0 + bne _020E1ADC +_020E1AFC: + ldr r2, [r3] + ldr r1, _020E1BC0 ; =_021E4F30 + ldr r3, _020E1BC4 ; =_021E4F44 + str r2, [r1] + ldr r1, [r5] + ldr r2, _020E1BC8 ; =_021E4F3C + ldr r4, [r1, #4] + ldr r1, _020E1BCC ; =_021E4F34 + str r4, [r3] + ldr r3, [r5] + ldr r6, _020E1BD0 ; =_021E4F38 + ldr r3, [r3, #8] + ldr r4, _020E1BD4 ; =_021E4F40 + str r3, [r2] + ldr r2, [r5] + ldr r3, _020E1BD8 ; =_021E4F5C + ldr r7, [r2, #0xc] + ldr r2, _020E1BB4 ; =_02110FC8 + str r7, [r1] + ldr r7, [r5] + ldr r1, _020E1BDC ; =_02110FC4 + ldr r7, [r7, #0x10] + str r7, [r6] + ldr r6, [r5] + ldr r6, [r6, #0x14] + str r6, [r4] + ldr r4, [r5] + ldr r4, [r4, #0x18] + str r4, [r3] + ldr r3, [r5] + ldr r3, [r3, #0x1c] + str r3, [r2] + ldr r2, [r5] + add r2, r2, #0x20 + str r2, [r1] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020E1B8C: + cmp r7, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl OS_GetLockID + ldr r1, _020E1BE0 ; =_021E4F60 + strh r0, [r1] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E1BA8: .word _021E4F2C +_020E1BAC: .word 0x04000204 +_020E1BB0: .word _0210E1DC +_020E1BB4: .word _02110FC8 +_020E1BB8: .word _0210E1EC +_020E1BBC: .word _0210E1E0 +_020E1BC0: .word _021E4F30 +_020E1BC4: .word _021E4F44 +_020E1BC8: .word _021E4F3C +_020E1BCC: .word _021E4F34 +_020E1BD0: .word _021E4F38 +_020E1BD4: .word _021E4F40 +_020E1BD8: .word _021E4F5C +_020E1BDC: .word _02110FC4 +_020E1BE0: .word _021E4F60 + arm_func_end CTRDG_IdentifyAgbBackup + + arm_func_start CTRDGi_SetFlashBankMx +CTRDGi_SetFlashBankMx: ; 0x020E1BE4 + ldr r3, _020E1C10 ; =0x0A005555 + mov r2, #0xaa + ldr r1, _020E1C14 ; =0x0A002AAA + strb r2, [r3] + mov r2, #0x55 + strb r2, [r1] + mov r1, #0xb0 + strb r1, [r3] + mov r1, #0xa000000 + strb r0, [r1] + bx lr + .align 2, 0 +_020E1C10: .word 0x0A005555 +_020E1C14: .word 0x0A002AAA + arm_func_end CTRDGi_SetFlashBankMx + + arm_func_start CTRDGi_ReadFlashID +CTRDGi_ReadFlashID: ; 0x020E1C18 + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _020E1D10 ; =0x04000208 + mov r0, #0 + ldrh r2, [r5] + ldr r1, _020E1D14 ; =_021E4F2C + ldr r4, _020E1D18 ; =0x0A005555 + strh r0, [r5] + str r2, [r1, #0x1c] + mov r3, #0xaa + ldr r2, _020E1D1C ; =0x0A002AAA + strb r3, [r4] + mov r3, #0x55 + strb r3, [r2] + mov r2, #0x90 + strb r2, [r4] + ldrh r2, [r5] + ldr r1, [r1, #0x1c] + strh r1, [r5] + bl StartFlashTimer + ldr r4, _020E1D14 ; =_021E4F2C + ldrh r0, [r4, #2] + cmp r0, #0 + bne _020E1C84 +_020E1C74: + bl CheckFlashTimer + ldrh r0, [r4, #2] + cmp r0, #0 + beq _020E1C74 +_020E1C84: + ldr r0, _020E1D20 ; =0x0A000001 + bl CTRDGi_ReadSrFunc + mov r4, r0, lsl #0x18 + mov r0, #0xa000000 + bl CTRDGi_ReadSrFunc + ldr ip, _020E1D10 ; =0x04000208 + orr r4, r0, r4, lsr #16 + ldrh r2, [ip] + mov r0, #0 + ldr r1, _020E1D14 ; =_021E4F2C + strh r0, [ip] + ldr r5, _020E1D18 ; =0x0A005555 + str r2, [r1, #0x1c] + mov r3, #0xaa + ldr r2, _020E1D1C ; =0x0A002AAA + strb r3, [r5] + mov r3, #0x55 + strb r3, [r2] + mov r2, #0xf0 + strb r2, [r5] + strb r2, [r5] + ldrh r2, [ip] + ldr r1, [r1, #0x1c] + strh r1, [ip] + bl StartFlashTimer + ldr r5, _020E1D14 ; =_021E4F2C + ldrh r0, [r5, #2] + cmp r0, #0 + bne _020E1D08 +_020E1CF8: + bl CheckFlashTimer + ldrh r0, [r5, #2] + cmp r0, #0 + beq _020E1CF8 +_020E1D08: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E1D10: .word 0x04000208 +_020E1D14: .word _021E4F2C +_020E1D18: .word 0x0A005555 +_020E1D1C: .word 0x0A002AAA +_020E1D20: .word 0x0A000001 + arm_func_end CTRDGi_ReadFlashID + + arm_func_start StartFlashTimer +StartFlashTimer: ; 0x020E1D24 + stmdb sp!, {r3, lr} + ldr r1, _020E1D64 ; =_02110FC4 + ldr r2, _020E1D68 ; =_021E4F2C + mov r3, #0 + ldr r1, [r1, #4] + strh r3, [r2, #2] + mov r0, r0, lsl #1 + ldrh r1, [r1, r0] + mov r0, r3 + str r1, [r2, #0x20] + str r0, [r2, #0x24] + bl OS_GetTick + ldr r2, _020E1D68 ; =_021E4F2C + str r0, [r2, #0x28] + str r1, [r2, #0x2c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020E1D64: .word _02110FC4 +_020E1D68: .word _021E4F2C + arm_func_end StartFlashTimer + + arm_func_start CheckFlashTimer +CheckFlashTimer: ; 0x020E1D6C + stmdb sp!, {r3, lr} + bl OS_GetTick + ldr r3, _020E1DC0 ; =_021E4F2C + ldr r2, _020E1DC4 ; =0x000082EA + ldr ip, [r3, #0x28] + ldr r3, [r3, #0x2c] + subs ip, r0, ip + sbc r0, r1, r3 + mov r1, r0, lsl #6 + orr r1, r1, ip, lsr #26 + mov r0, ip, lsl #6 + mov r3, #0 + bl _ll_udiv + ldr r2, _020E1DC0 ; =_021E4F2C + ldr r3, [r2, #0x24] + ldr ip, [r2, #0x20] + cmp r3, r1 + cmpeq ip, r0 + movls r0, #1 + strlsh r0, [r2, #2] + ldmia sp!, {r3, pc} + .align 2, 0 +_020E1DC0: .word _021E4F2C +_020E1DC4: .word 0x000082EA + arm_func_end CheckFlashTimer + + arm_func_start CTRDGi_ReadSrFunc +CTRDGi_ReadSrFunc: ; 0x020E1DC8 + ldrb r0, [r0] + bx lr + arm_func_end CTRDGi_ReadSrFunc + + arm_func_start CTRDGi_PollingSR512kCOMMON +CTRDGi_PollingSR512kCOMMON: ; 0x020E1DD0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r4, r0 + mov r8, r1 + mov r7, r2 + mov r6, #0 + bl StartFlashTimer + ldr r5, _020E1E54 ; =_021E4F2C +_020E1DEC: + mov r0, r8 + bl CTRDGi_ReadSrFunc + cmp r0, r7 + beq _020E1E40 + ldrh r0, [r5, #2] + cmp r0, #0 + beq _020E1DEC + mov r0, r8 + bl CTRDGi_ReadSrFunc + cmp r7, r0 + beq _020E1E40 + ldr r0, _020E1E58 ; =_02110FC4 + ldr r0, [r0] + ldrh r0, [r0, #0x18] + cmp r0, #0xc2 + ldreq r0, _020E1E5C ; =0x0A005555 + moveq r1, #0xf0 + streqb r1, [r0] + orr r0, r4, #0xc000 + mov r0, r0, lsl #0x10 + mov r6, r0, lsr #0x10 +_020E1E40: + bl CTRDG_IsExisting + cmp r0, #0 + moveq r6, #0x1000 + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E1E54: .word _021E4F2C +_020E1E58: .word _02110FC4 +_020E1E5C: .word 0x0A005555 + arm_func_end CTRDGi_PollingSR512kCOMMON + + arm_func_start CTRDGi_PollingSR1MCOMMON +CTRDGi_PollingSR1MCOMMON: ; 0x020E1E60 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, #0 + bl StartFlashTimer + ldr r4, _020E1F0C ; =_021E4F2C +_020E1E7C: + bl CheckFlashTimer + mov r0, r7 + bl CTRDGi_ReadSrFunc + cmp r0, r6 + beq _020E1EF8 + tst r0, #0x20 + beq _020E1EC4 + mov r0, r7 + bl CTRDGi_ReadSrFunc + cmp r6, r0 + beq _020E1EF8 + orr r0, r8, #0xa000 + mov r0, r0, lsl #0x10 + ldr r1, _020E1F10 ; =0x0A005555 + mov r2, #0xf0 + strb r2, [r1] + mov r5, r0, lsr #0x10 + b _020E1EF8 +_020E1EC4: + ldrh r0, [r4, #2] + cmp r0, #0 + beq _020E1E7C + mov r0, r7 + bl CTRDGi_ReadSrFunc + cmp r6, r0 + beq _020E1EF8 + orr r0, r8, #0xc000 + mov r0, r0, lsl #0x10 + ldr r1, _020E1F10 ; =0x0A005555 + mov r2, #0xf0 + strb r2, [r1] + mov r5, r0, lsr #0x10 +_020E1EF8: + bl CTRDG_IsExisting + cmp r0, #0 + moveq r5, #0x1000 + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E1F0C: .word _021E4F2C +_020E1F10: .word 0x0A005555 + arm_func_end CTRDGi_PollingSR1MCOMMON + + arm_func_start CTRDGi_ReadAgbFlashCore +CTRDGi_ReadAgbFlashCore: ; 0x020E1F14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E1FFC ; =_021E4F2C + ldr r1, [r5] + ldrh r0, [r0] + str r1, [r4] + ldrh r5, [sp, #0x20] + ldr r6, [sp, #0x14] + ldr r7, [sp, #0x1c] + ldr r8, [sp, #0x18] + bl OS_LockCartridge + ldr r3, _020E2000 ; =0x04000204 + ldr r0, _020E2004 ; =_02110FC4 + ldrh r2, [r3] + ldrh r1, [r3] + and r4, r2, #3 + bic r1, r1, #3 + orr r1, r1, #3 + strh r1, [r3] + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #0x20000 + bne _020E1F98 + mov r0, r5, lsl #0xc + mov r0, r0, lsr #0x10 + bl CTRDGi_SetFlashBankMx + and r5, r5, #0xf +_020E1F98: + ldr r0, _020E2004 ; =_02110FC4 + cmp r8, #0 + ldr r0, [r0] + sub r8, r8, #1 + ldrh r0, [r0, #8] + mov r0, r5, lsl r0 + add r0, r0, #0xa000000 + add r1, r6, r0 + beq _020E1FD0 +_020E1FBC: + ldrb r0, [r1], #1 + cmp r8, #0 + sub r8, r8, #1 + strb r0, [r7], #1 + bne _020E1FBC +_020E1FD0: + ldr r2, _020E2000 ; =0x04000204 + ldr r0, _020E1FFC ; =_021E4F2C + ldrh r1, [r2] + bic r1, r1, #3 + orr r1, r1, r4 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, #0 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E1FFC: .word _021E4F2C +_020E2000: .word 0x04000204 +_020E2004: .word _02110FC4 + arm_func_end CTRDGi_ReadAgbFlashCore + + arm_func_start CTRDGi_VerifyFlashSectorCore +CTRDGi_VerifyFlashSectorCore: ; 0x020E2008 + cmp r2, #0 + sub r2, r2, #1 + beq _020E2034 +_020E2014: + ldrb ip, [r1], #1 + ldrb r3, [r0], #1 + cmp ip, r3 + subne r0, r1, #1 + bxne lr + cmp r2, #0 + sub r2, r2, #1 + bne _020E2014 +_020E2034: + mov r0, #0 + bx lr + arm_func_end CTRDGi_VerifyFlashSectorCore + + arm_func_start CTRDGi_VerifyAgbFlashCore +CTRDGi_VerifyAgbFlashCore: ; 0x020E203C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E210C ; =_021E4F2C + ldr r1, [r5] + ldrh r0, [r0] + str r1, [r4] + ldrh r5, [sp, #0x20] + ldr r6, [sp, #0xc] + ldr r7, [sp, #0x18] + bl OS_LockCartridge + ldr r3, _020E2110 ; =0x04000204 + ldr r0, _020E2114 ; =_02110FC4 + ldrh r2, [r3] + ldrh r1, [r3] + and r4, r2, #3 + bic r1, r1, #3 + orr r1, r1, #3 + strh r1, [r3] + ldr r0, [r0] + ldr r0, [r0] + cmp r0, #0x20000 + bne _020E20BC + mov r0, r5, lsl #0xc + mov r0, r0, lsr #0x10 + bl CTRDGi_SetFlashBankMx + and r5, r5, #0xf +_020E20BC: + ldr r1, _020E2114 ; =_02110FC4 + mov r0, r6 + ldr r1, [r1] + mov r2, r7 + ldrh r1, [r1, #8] + mov r1, r5, lsl r1 + add r1, r1, #0xa000000 + bl CTRDGi_VerifyFlashSectorCore + ldr r3, _020E2110 ; =0x04000204 + ldr r1, _020E210C ; =_021E4F2C + ldrh r2, [r3] + mov r5, r0 + bic r0, r2, #3 + orr r0, r0, r4 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r5 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020E210C: .word _021E4F2C +_020E2110: .word 0x04000204 +_020E2114: .word _02110FC4 + arm_func_end CTRDGi_VerifyAgbFlashCore + + arm_func_start CTRDGi_WriteAndVerifyAgbFlashSectorCore +CTRDGi_WriteAndVerifyAgbFlashSectorCore: ; 0x020E2118 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x24 + mov r4, r0 + ldmia r4!, {r0, r1, r2, r3} + add ip, sp, #0 + stmia ip!, {r0, r1, r2, r3} + ldmia r4!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldr r0, [r4] + mov r4, #0 + str r0, [ip] + ldrh r5, [sp, #0x20] + ldr r6, [sp, #0xc] + ldr r7, [sp, #0x18] +_020E2150: + mov r0, r5 + mov r1, r6 + bl CTRDG_WriteAgbFlashSector + cmp r0, #0 + bne _020E2180 + mov r0, r5 + mov r1, r6 + mov r2, r7 + bl CTRDG_VerifyAgbFlash + cmp r0, #0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4, r5, r6, r7, pc} +_020E2180: + add r1, r4, #1 + mov r1, r1, lsl #0x10 + mov r4, r1, lsr #0x10 + cmp r4, #3 + blo _020E2150 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end CTRDGi_WriteAndVerifyAgbFlashSectorCore + + arm_func_start CTRDG_ReadAgbFlash +CTRDG_ReadAgbFlash: ; 0x020E219C + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0x14] + str r2, [sp, #0x1c] + str r3, [sp, #0x18] + bl CTRDGi_ReadAgbFlashCore + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDG_ReadAgbFlash + + arm_func_start CTRDG_WriteAgbFlashSector +CTRDG_WriteAgbFlashSector: ; 0x020E21C4 + stmdb sp!, {r3, lr} + ldr r2, _020E21D8 ; =_021E4F2C + ldr r2, [r2, #4] + blx r2 + ldmia sp!, {r3, pc} + .align 2, 0 +_020E21D8: .word _021E4F2C + arm_func_end CTRDG_WriteAgbFlashSector + + arm_func_start CTRDG_VerifyAgbFlash +CTRDG_VerifyAgbFlash: ; 0x020E21DC + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + str r2, [sp, #0x18] + bl CTRDGi_VerifyAgbFlashCore + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDG_VerifyAgbFlash + + arm_func_start CTRDG_WriteAndVerifyAgbFlashAsync +CTRDG_WriteAndVerifyAgbFlashAsync: + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + str r2, [sp, #0x18] + ldr r1, _020E222C ; =CTRDGi_WriteAndVerifyAgbFlashSectorCore + add r0, sp, #0 + mov r2, r3 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E222C: .word CTRDGi_WriteAndVerifyAgbFlashSectorCore + arm_func_end CTRDG_WriteAndVerifyAgbFlashAsync + + arm_func_start CTRDGi_EraseFlashChipCoreAT +CTRDGi_EraseFlashChipCoreAT: ; 0x020E2230 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020E22FC ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r0, _020E2300 ; =0x04000204 + ldr r1, _020E2304 ; =_02110FC4 + ldrh r3, [r0] + ldr r2, [r1] + ldrh r1, [r0] + ldr r4, [r2, #0x10] + mov r2, #0 + bic r1, r1, #3 + orr r1, r1, r4 + strh r1, [r0] + ldrh r4, [r0, #4] + ldr r1, _020E2308 ; =_021E4F48 + ldr lr, _020E230C ; =0x0A005555 + strh r2, [r0, #4] + str r4, [r1] + mov r5, #0xaa + ldr r4, _020E2310 ; =0x0A002AAA + strb r5, [lr] + mov ip, #0x55 + strb ip, [r4] + mov r2, #0x80 + strb r2, [lr] + strb r5, [lr] + strb ip, [r4] + mov r2, #0x10 + strb r2, [lr] + ldrh r2, [r0, #4] + ldr r2, [r1] + ldr r1, _020E2314 ; =_021E4F5C + strh r2, [r0, #4] + ldr r4, [r1] + mov r0, #3 + mov r1, #0xa000000 + mov r2, #0xff + and r5, r3, #3 + blx r4 + ldr r3, _020E2300 ; =0x04000204 + ldr r1, _020E22FC ; =_021E4F2C + ldrh r2, [r3] + mov r4, r0 + bic r0, r2, #3 + orr r0, r0, r5 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E22FC: .word _021E4F2C +_020E2300: .word 0x04000204 +_020E2304: .word _02110FC4 +_020E2308: .word _021E4F48 +_020E230C: .word 0x0A005555 +_020E2310: .word 0x0A002AAA +_020E2314: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashChipCoreAT + + arm_func_start CTRDGi_EraseFlashSectorCoreAT +CTRDGi_EraseFlashSectorCoreAT: ; 0x020E2318 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r1, [r5] + ldr r0, _020E2424 ; =_021E4F2C + str r1, [r4] + ldrh r1, [sp, #0x20] + ldrh r0, [r0] + mov r1, r1, lsl #7 + add r5, r1, #0xa000000 + bl OS_LockCartridge + ldr ip, _020E2428 ; =0x04000204 + ldr r1, _020E242C ; =_02110FC4 + ldrh r0, [ip] + ldr r1, [r1] + ldrh r2, [ip] + ldr r3, [r1, #0x10] + mov r1, #0 + bic r2, r2, #3 + orr r2, r2, r3 + strh r2, [ip] + ldrh r3, [ip, #4] + ldr r4, _020E2430 ; =0x0A005555 + mov r2, #0xaa + strh r1, [ip, #4] + strb r2, [r4] + ldr r1, _020E2434 ; =0x0A002AAA + mov r2, #0x55 + strb r2, [r1] + mov r1, #0xa0 + strb r1, [r4] + and r4, r0, #3 + mov r0, #0x80 + mov r2, #0xff +_020E23B4: + strb r2, [r5], #1 + subs r0, r0, #1 + bne _020E23B4 + ldr lr, _020E2438 ; =0x04000208 + ldr ip, _020E243C ; =_021E4F5C + ldrh r0, [lr] + sub r1, r5, #1 + strh r3, [lr] + ldr r3, [ip] + mov r0, #1 + blx r3 + movs r5, r0 + beq _020E23F8 + and r0, r5, #0xff00 + orr r0, r0, #2 + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 +_020E23F8: + ldr r2, _020E2428 ; =0x04000204 + ldr r0, _020E2424 ; =_021E4F2C + ldrh r1, [r2] + bic r1, r1, #3 + orr r1, r1, r4 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, r5 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020E2424: .word _021E4F2C +_020E2428: .word 0x04000204 +_020E242C: .word _02110FC4 +_020E2430: .word 0x0A005555 +_020E2434: .word 0x0A002AAA +_020E2438: .word 0x04000208 +_020E243C: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashSectorCoreAT + + arm_func_start CTRDGi_EraseFlash4KBCoreAT +CTRDGi_EraseFlash4KBCoreAT: ; 0x020E2440 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, [r5] + str r0, [r4] + ldrh r0, [sp, #0x20] + cmp r0, #0x10 + addhs sp, sp, #0x24 + ldrhs r0, _020E24E4 ; =0x000080FF + ldmhsia sp!, {r4, r5, r6, r7, pc} + mov r0, r0, lsl #0x15 + mov r6, r0, lsr #0x10 + mov r5, #0 + mov r4, #2 +_020E248C: + mov r7, r4 +_020E2490: + mov r0, r6 + bl CTRDGi_EraseFlashSectorAT + cmp r0, #0 + beq _020E24B0 + sub r1, r7, #1 + mov r1, r1, lsl #0x10 + movs r7, r1, lsr #0x10 + bne _020E2490 +_020E24B0: + add r1, r6, #1 + mov r1, r1, lsl #0x10 + cmp r0, #0 + mov r6, r1, lsr #0x10 + addne sp, sp, #0x24 + ldmneia sp!, {r4, r5, r6, r7, pc} + add r1, r5, #1 + mov r1, r1, lsl #0x10 + mov r5, r1, lsr #0x10 + cmp r5, #0x20 + blo _020E248C + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020E24E4: .word 0x000080FF + arm_func_end CTRDGi_EraseFlash4KBCoreAT + + arm_func_start CTRDGi_WriteFlashSectorCoreAT +CTRDGi_WriteFlashSectorCoreAT: ; 0x020E24E8 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E25E8 ; =_021E4F2C + ldr r1, [r5] + ldrh r0, [r0] + str r1, [r4] + ldr r5, [sp, #0xc] + bl OS_LockCartridge + ldr r1, _020E25EC ; =0x04000204 + ldr r2, _020E25F0 ; =_02110FC4 + ldrh r0, [r1] + ldr r3, [r2] + ldrh r2, [r1] + ldr r4, [r3, #0x10] + mov r3, #0 + bic r2, r2, #3 + orr r2, r2, r4 + strh r2, [r1] + ldrh ip, [sp, #0x20] + ldrh r2, [r1, #4] + ldr r4, _020E25F4 ; =0x0A005555 + mov ip, ip, lsl #7 + strh r3, [r1, #4] + mov r3, #0xaa + strb r3, [r4] + ldr r1, _020E25F8 ; =0x0A002AAA + mov r3, #0x55 + strb r3, [r1] + mov r1, #0xa0 + strb r1, [r4] + and r4, r0, #3 + add lr, ip, #0xa000000 + mov r1, #0x80 +_020E2584: + ldrb r0, [r5], #1 + subs r1, r1, #1 + strb r0, [lr], #1 + bne _020E2584 + ldr ip, _020E25FC ; =0x04000208 + ldr r3, _020E2600 ; =_021E4F5C + ldrh r0, [ip] + sub r1, lr, #1 + mov r0, #1 + strh r2, [ip] + ldrb r2, [r5, #-1] + ldr r3, [r3] + blx r3 + ldr r3, _020E25EC ; =0x04000204 + ldr r1, _020E25E8 ; =_021E4F2C + ldrh r2, [r3] + mov r5, r0 + bic r0, r2, #3 + orr r0, r0, r4 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r5 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020E25E8: .word _021E4F2C +_020E25EC: .word 0x04000204 +_020E25F0: .word _02110FC4 +_020E25F4: .word 0x0A005555 +_020E25F8: .word 0x0A002AAA +_020E25FC: .word 0x04000208 +_020E2600: .word _021E4F5C + arm_func_end CTRDGi_WriteFlashSectorCoreAT + + arm_func_start CTRDGi_WriteFlash4KBCoreAT +CTRDGi_WriteFlash4KBCoreAT: ; 0x020E2604 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, [r5] + str r0, [r4] + ldrh r0, [sp, #0x20] + ldr r6, [sp, #0xc] + cmp r0, #0x10 + addhs sp, sp, #0x24 + ldrhs r0, _020E26C0 ; =0x000080FF + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r7, _020E26C4 ; =_021E4F28 + mov r0, r0, lsl #0x15 + mov r1, #0x1000 + strh r1, [r7] + mov r5, r0, lsr #0x10 + mov r4, #2 +_020E265C: + mov r8, r4 +_020E2660: + mov r0, r5 + mov r1, r6 + bl CTRDGi_WriteFlashSectorAT + cmp r0, #0 + beq _020E2684 + sub r1, r8, #1 + mov r1, r1, lsl #0x10 + movs r8, r1, lsr #0x10 + bne _020E2660 +_020E2684: + cmp r0, #0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldrh r2, [r7] + add r1, r5, #1 + mov r1, r1, lsl #0x10 + sub r2, r2, #0x80 + strh r2, [r7] + ldrh r2, [r7] + add r6, r6, #0x80 + mov r5, r1, lsr #0x10 + cmp r2, #0 + bne _020E265C + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E26C0: .word 0x000080FF +_020E26C4: .word _021E4F28 + arm_func_end CTRDGi_WriteFlash4KBCoreAT + + arm_func_start CTRDGi_EraseFlashChipAT +CTRDGi_EraseFlashChipAT: ; 0x020E26C8 + stmdb sp!, {lr} + sub sp, sp, #0x24 + add r0, sp, #0 + bl CTRDGi_EraseFlashChipCoreAT + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashChipAT + + arm_func_start CTRDGi_EraseFlash4KBAT +CTRDGi_EraseFlash4KBAT: + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + bl CTRDGi_EraseFlash4KBCoreAT + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlash4KBAT + + arm_func_start CTRDGi_WriteFlash4KBAT +CTRDGi_WriteFlash4KBAT: + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + bl CTRDGi_WriteFlash4KBCoreAT + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_WriteFlash4KBAT + + arm_func_start CTRDGi_EraseFlashChipAsyncAT +CTRDGi_EraseFlashChipAsyncAT: + stmdb sp!, {lr} + sub sp, sp, #0x24 + ldr r1, _020E2754 ; =CTRDGi_EraseFlashChipCoreAT + mov r2, r0 + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2754: .word CTRDGi_EraseFlashChipCoreAT + arm_func_end CTRDGi_EraseFlashChipAsyncAT + + arm_func_start CTRDGi_EraseFlash4KBAsyncAT +CTRDGi_EraseFlash4KBAsyncAT: ; 0x020E2758 + stmdb sp!, {lr} + sub sp, sp, #0x24 + mov r2, r1 + strh r0, [sp, #0x20] + ldr r1, _020E277C ; =CTRDGi_EraseFlash4KBCoreAT + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E277C: .word CTRDGi_EraseFlash4KBCoreAT + arm_func_end CTRDGi_EraseFlash4KBAsyncAT + + arm_func_start CTRDGi_WriteFlash4KBAsyncAT +CTRDGi_WriteFlash4KBAsyncAT: ; 0x020E2780 + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + ldr r1, _020E27A4 ; =CTRDGi_WriteFlash4KBCoreAT + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E27A4: .word CTRDGi_WriteFlash4KBCoreAT + arm_func_end CTRDGi_WriteFlash4KBAsyncAT + + arm_func_start CTRDGi_EraseFlashSectorAT +CTRDGi_EraseFlashSectorAT: ; 0x020E27A8 + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + bl CTRDGi_EraseFlashSectorCoreAT + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashSectorAT + + arm_func_start CTRDGi_WriteFlashSectorAT +CTRDGi_WriteFlashSectorAT: ; 0x020E27CC + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + bl CTRDGi_WriteFlashSectorCoreAT + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_WriteFlashSectorAT + + arm_func_start CTRDGi_EraseFlashSectorAsyncAT +CTRDGi_EraseFlashSectorAsyncAT: + stmdb sp!, {lr} + sub sp, sp, #0x24 + mov r2, r1 + strh r0, [sp, #0x20] + ldr r1, _020E2818 ; =CTRDGi_EraseFlashSectorCoreAT + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2818: .word CTRDGi_EraseFlashSectorCoreAT + arm_func_end CTRDGi_EraseFlashSectorAsyncAT + + arm_func_start CTRDGi_WriteFlashSectorAsyncAT +CTRDGi_WriteFlashSectorAsyncAT: ; 0x020E281C + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + ldr r1, _020E2840 ; =CTRDGi_WriteFlashSectorCoreAT + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2840: .word CTRDGi_WriteFlashSectorCoreAT + arm_func_end CTRDGi_WriteFlashSectorAsyncAT + + arm_func_start CTRDGi_EraseFlashChipCoreLE +CTRDGi_EraseFlashChipCoreLE: ; 0x020E2844 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020E2910 ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r0, _020E2914 ; =0x04000204 + ldr r1, _020E2918 ; =_02110FC4 + ldrh r3, [r0] + ldr r2, [r1] + ldrh r1, [r0] + ldr r4, [r2, #0x10] + mov r2, #0 + bic r1, r1, #3 + orr r1, r1, r4 + strh r1, [r0] + ldrh r4, [r0, #4] + ldr r1, _020E291C ; =_021E4F48 + ldr lr, _020E2920 ; =0x0A005555 + strh r2, [r0, #4] + str r4, [r1] + mov r5, #0xaa + ldr r4, _020E2924 ; =0x0A002AAA + strb r5, [lr] + mov ip, #0x55 + strb ip, [r4] + mov r2, #0x80 + strb r2, [lr] + strb r5, [lr] + strb ip, [r4] + mov r2, #0x10 + strb r2, [lr] + ldrh r2, [r0, #4] + ldr r2, [r1] + ldr r1, _020E2928 ; =_021E4F5C + strh r2, [r0, #4] + ldr r4, [r1] + mov r0, #3 + mov r1, #0xa000000 + mov r2, #0xff + and r5, r3, #3 + blx r4 + ldr r3, _020E2914 ; =0x04000204 + ldr r1, _020E2910 ; =_021E4F2C + ldrh r2, [r3] + mov r4, r0 + bic r0, r2, #3 + orr r0, r0, r5 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E2910: .word _021E4F2C +_020E2914: .word 0x04000204 +_020E2918: .word _02110FC4 +_020E291C: .word _021E4F48 +_020E2920: .word 0x0A005555 +_020E2924: .word 0x0A002AAA +_020E2928: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashChipCoreLE + + arm_func_start CTRDGi_EraseFlashSectorCoreLE +CTRDGi_EraseFlashSectorCoreLE: ; 0x020E292C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, [r5] + str r0, [r4] + ldrh r4, [sp, #0x20] + cmp r4, #0x10 + addhs sp, sp, #0x24 + ldrhs r0, _020E2A40 ; =0x000080FF + ldmhsia sp!, {r3, r4, r5, r6, pc} + ldr r0, _020E2A44 ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r0, _020E2A48 ; =0x04000204 + ldr r1, _020E2A4C ; =_02110FC4 + ldrh r3, [r0] + ldr r5, [r1] + ldrh r2, [r0] + ldr r6, [r5, #0x10] + mov r5, #0 + bic r2, r2, #3 + orr r2, r2, r6 + strh r2, [r0] + ldr r2, [r1] + ldrh r1, [r0, #4] + ldrh ip, [r2, #8] + ldr r2, _020E2A50 ; =_021E4F48 + ldr lr, _020E2A54 ; =0x0A005555 + strh r5, [r0, #4] + mov r6, r4, lsl ip + str r1, [r2] + mov r5, #0xaa + ldr r4, _020E2A58 ; =0x0A002AAA + strb r5, [lr] + mov ip, #0x55 + strb ip, [r4] + mov r1, #0x80 + strb r1, [lr] + strb r5, [lr] + strb ip, [r4] + add r1, r6, #0xa000000 + mov r4, #0x30 + strb r4, [r1] + ldrh r4, [r0, #4] + ldr r4, [r2] + ldr r2, _020E2A5C ; =_021E4F5C + strh r4, [r0, #4] + ldr r4, [r2] + mov r0, #2 + mov r2, #0xff + and r5, r3, #3 + blx r4 + ldr r3, _020E2A48 ; =0x04000204 + ldr r1, _020E2A44 ; =_021E4F2C + ldrh r2, [r3] + mov r4, r0 + bic r0, r2, #3 + orr r0, r0, r5 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r4 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020E2A40: .word 0x000080FF +_020E2A44: .word _021E4F2C +_020E2A48: .word 0x04000204 +_020E2A4C: .word _02110FC4 +_020E2A50: .word _021E4F48 +_020E2A54: .word 0x0A005555 +_020E2A58: .word 0x0A002AAA +_020E2A5C: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashSectorCoreLE + + arm_func_start CTRDGi_ProgramFlashByteLE +CTRDGi_ProgramFlashByteLE: ; 0x020E2A60 + stmdb sp!, {r3, lr} + ldr ip, _020E2AA8 ; =0x0A005555 + mov r3, #0xaa + ldr r2, _020E2AAC ; =0x0A002AAA + strb r3, [ip] + mov r3, #0x55 + mov lr, r0 + strb r3, [r2] + mov r0, #0xa0 + strb r0, [ip] + ldrb r2, [lr] + ldr r3, _020E2AB0 ; =_021E4F5C + mov r0, #1 + strb r2, [r1] + ldrb r2, [lr] + ldr r3, [r3] + blx r3 + ldmia sp!, {r3, pc} + .align 2, 0 +_020E2AA8: .word 0x0A005555 +_020E2AAC: .word 0x0A002AAA +_020E2AB0: .word _021E4F5C + arm_func_end CTRDGi_ProgramFlashByteLE + + arm_func_start CTRDGi_WriteFlashSectorCoreLE +CTRDGi_WriteFlashSectorCoreLE: ; 0x020E2AB4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, [r5] + str r0, [r4] + ldrh r8, [sp, #0x20] + ldr r5, [sp, #0xc] + cmp r8, #0x10 + addhs sp, sp, #0x24 + ldrhs r0, _020E2C64 ; =0x000080FF + ldmhsia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, _020E2C68 ; =_02110FC4 + ldr r6, _020E2C6C ; =CTRDGi_VerifyFlashCoreFF + ldr r0, [r0] + mov sb, #0 + ldrh r0, [r0, #8] + mov r0, r8, lsl r0 + add r7, r0, #0xa000000 +_020E2B10: + mov r0, r8 + bl CTRDGi_EraseFlashSectorLE + movs r4, r0 + bne _020E2B38 + mov r0, r7 + mov r1, r6 + bl CTRDGi_VerifyFlashErase + mov r0, r0, lsl #0x10 + movs r4, r0, lsr #0x10 + beq _020E2B58 +_020E2B38: + add r0, sb, #1 + mov r0, r0, lsl #0x10 + cmp sb, #0x50 + mov sb, r0, lsr #0x10 + bne _020E2B10 + add sp, sp, #0x24 + mov r0, r4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_020E2B58: + mov r6, #1 + cmp sb, #0 + movne r6, #6 + cmp r6, #1 + mov sb, #1 + blo _020E2B8C +_020E2B70: + mov r0, r8 + bl CTRDGi_EraseFlashSectorLE + add r0, sb, #1 + mov r0, r0, lsl #0x10 + cmp r6, r0, lsr #16 + mov sb, r0, lsr #0x10 + bhs _020E2B70 +_020E2B8C: + ldr r0, _020E2C70 ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r1, _020E2C74 ; =0x04000204 + ldr r2, _020E2C68 ; =_02110FC4 + ldrh r0, [r1] + ldr r6, [r2] + ldrh r3, [r1] + ldr r8, [r6, #0x10] + ldr r6, _020E2C78 ; =_021E4F28 + bic r3, r3, #3 + orr r3, r3, r8 + strh r3, [r1] + ldr r2, [r2] + mov r3, #0 + ldr r8, [r2, #4] + ldr r2, _020E2C7C ; =_021E4F48 + strh r8, [r6] + ldrh sb, [r1, #4] + and r8, r0, #3 + strh r3, [r1, #4] + ldrh r0, [r6] + str sb, [r2] + cmp r0, #0 + beq _020E2C24 +_020E2BF0: + mov r0, r5 + mov r1, r7 + bl CTRDGi_ProgramFlashByteLE + movs r4, r0 + bne _020E2C24 + ldrh r0, [r6] + add r5, r5, #1 + add r7, r7, #1 + sub r0, r0, #1 + strh r0, [r6] + ldrh r0, [r6] + cmp r0, #0 + bne _020E2BF0 +_020E2C24: + ldr r3, _020E2C80 ; =0x04000208 + ldr r0, _020E2C7C ; =_021E4F48 + ldrh r1, [r3] + ldr r0, [r0] + sub r2, r3, #4 + strh r0, [r3] + ldrh r1, [r2] + ldr r0, _020E2C70 ; =_021E4F2C + bic r1, r1, #3 + orr r1, r1, r8 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, r4 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020E2C64: .word 0x000080FF +_020E2C68: .word _02110FC4 +_020E2C6C: .word CTRDGi_VerifyFlashCoreFF +_020E2C70: .word _021E4F2C +_020E2C74: .word 0x04000204 +_020E2C78: .word _021E4F28 +_020E2C7C: .word _021E4F48 +_020E2C80: .word 0x04000208 + arm_func_end CTRDGi_WriteFlashSectorCoreLE + + arm_func_start CTRDGi_VerifyFlashCoreFF +CTRDGi_VerifyFlashCoreFF: ; 0x020E2C84 + ldr r1, _020E2CB4 ; =_02110FC4 + ldr r1, [r1] + ldr r2, [r1, #4] + cmp r2, #0 + beq _020E2CAC +_020E2C98: + ldrb r1, [r0], #1 + cmp r1, #0xff + bne _020E2CAC + subs r2, r2, #1 + bne _020E2C98 +_020E2CAC: + mov r0, r2 + bx lr + .align 2, 0 +_020E2CB4: .word _02110FC4 + arm_func_end CTRDGi_VerifyFlashCoreFF + + arm_func_start CTRDGi_VerifyFlashErase +CTRDGi_VerifyFlashErase: ; 0x020E2CB8 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020E2D34 ; =_021E4F2C + mov r5, r0 + ldrh r0, [r2] + mov r4, r1 + bl OS_LockCartridge + ldr ip, _020E2D38 ; =0x04000204 + ldr r0, _020E2D3C ; =_02110FC4 + ldrh r3, [ip] + ldr r0, [r0] + ldrh r1, [ip] + ldr r2, [r0, #0x10] + mov r0, r5 + bic r1, r1, #3 + orr r1, r1, r2 + strh r1, [ip] + and r6, r3, #3 + mov r5, #0 + blx r4 + cmp r0, #0 + ldr r2, _020E2D38 ; =0x04000204 + ldr r0, _020E2D34 ; =_021E4F2C + ldrh r1, [r2] + ldrne r5, _020E2D40 ; =0x00008004 + bic r1, r1, #3 + orr r1, r1, r6 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020E2D34: .word _021E4F2C +_020E2D38: .word 0x04000204 +_020E2D3C: .word _02110FC4 +_020E2D40: .word 0x00008004 + arm_func_end CTRDGi_VerifyFlashErase + + arm_func_start CTRDGi_EraseFlashChipLE +CTRDGi_EraseFlashChipLE: ; 0x020E2D44 + stmdb sp!, {lr} + sub sp, sp, #0x24 + add r0, sp, #0 + bl CTRDGi_EraseFlashChipCoreLE + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashChipLE + + arm_func_start CTRDGi_EraseFlashSectorLE +CTRDGi_EraseFlashSectorLE: ; 0x020E2D64 + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + bl CTRDGi_EraseFlashSectorCoreLE + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashSectorLE + + arm_func_start CTRDGi_WriteFlashSectorLE +CTRDGi_WriteFlashSectorLE: + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + bl CTRDGi_WriteFlashSectorCoreLE + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_WriteFlashSectorLE + + arm_func_start CTRDGi_EraseFlashChipAsyncLE +CTRDGi_EraseFlashChipAsyncLE: + stmdb sp!, {lr} + sub sp, sp, #0x24 + ldr r1, _020E2DD0 ; =CTRDGi_EraseFlashChipCoreLE + mov r2, r0 + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2DD0: .word CTRDGi_EraseFlashChipCoreLE + arm_func_end CTRDGi_EraseFlashChipAsyncLE + + arm_func_start CTRDGi_EraseFlashSectorAsyncLE +CTRDGi_EraseFlashSectorAsyncLE: ; 0x020E2DD4 + stmdb sp!, {lr} + sub sp, sp, #0x24 + mov r2, r1 + strh r0, [sp, #0x20] + ldr r1, _020E2DF8 ; =CTRDGi_EraseFlashSectorCoreLE + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2DF8: .word CTRDGi_EraseFlashSectorCoreLE + arm_func_end CTRDGi_EraseFlashSectorAsyncLE + + arm_func_start CTRDGi_WriteFlashSectorAsyncLE +CTRDGi_WriteFlashSectorAsyncLE: ; 0x020E2DFC + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + ldr r1, _020E2E20 ; =CTRDGi_WriteFlashSectorCoreLE + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E2E20: .word CTRDGi_WriteFlashSectorCoreLE + arm_func_end CTRDGi_WriteFlashSectorAsyncLE + + arm_func_start CTRDGi_EraseFlashChipCoreMX +CTRDGi_EraseFlashChipCoreMX: ; 0x020E2E24 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020E2EF0 ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r0, _020E2EF4 ; =0x04000204 + ldr r1, _020E2EF8 ; =_02110FC4 + ldrh r3, [r0] + ldr r2, [r1] + ldrh r1, [r0] + ldr r4, [r2, #0x10] + mov r2, #0 + bic r1, r1, #3 + orr r1, r1, r4 + strh r1, [r0] + ldrh r4, [r0, #4] + ldr r1, _020E2EFC ; =_021E4F48 + ldr lr, _020E2F00 ; =0x0A005555 + strh r2, [r0, #4] + str r4, [r1] + mov r5, #0xaa + ldr r4, _020E2F04 ; =0x0A002AAA + strb r5, [lr] + mov ip, #0x55 + strb ip, [r4] + mov r2, #0x80 + strb r2, [lr] + strb r5, [lr] + strb ip, [r4] + mov r2, #0x10 + strb r2, [lr] + ldrh r2, [r0, #4] + ldr r2, [r1] + ldr r1, _020E2F08 ; =_021E4F5C + strh r2, [r0, #4] + ldr r4, [r1] + mov r0, #3 + mov r1, #0xa000000 + mov r2, #0xff + and r5, r3, #3 + blx r4 + ldr r3, _020E2EF4 ; =0x04000204 + ldr r1, _020E2EF0 ; =_021E4F2C + ldrh r2, [r3] + mov r4, r0 + bic r0, r2, #3 + orr r0, r0, r5 + strh r0, [r3] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E2EF0: .word _021E4F2C +_020E2EF4: .word 0x04000204 +_020E2EF8: .word _02110FC4 +_020E2EFC: .word _021E4F48 +_020E2F00: .word 0x0A005555 +_020E2F04: .word 0x0A002AAA +_020E2F08: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashChipCoreMX + + arm_func_start CTRDGi_EraseFlashSectorCoreMX +CTRDGi_EraseFlashSectorCoreMX: ; 0x020E2F0C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #4 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E3074 ; =_02110FC4 + ldr r1, [r5] + ldr r0, [r0] + str r1, [r4] + ldrh r4, [sp, #0x24] + ldrh r0, [r0, #0xa] + cmp r4, r0 + addhs sp, sp, #0x28 + ldrhs r0, _020E3078 ; =0x000080FF + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _020E307C ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r5, _020E3080 ; =0x04000204 + ldr r0, _020E3074 ; =_02110FC4 + ldrh r3, [r5] + ldr r2, [r0] + ldrh r1, [r5] + mov r0, r4, lsl #0xc + ldr r2, [r2, #0x10] + bic r1, r1, #3 + orr r1, r1, r2 + strh r1, [r5] + and r1, r3, #3 + mov r0, r0, lsr #0x10 + str r1, [sp] + bl CTRDGi_SetFlashBankMx + and sl, r4, #0xf + mov r8, #0 + add r7, r5, #4 + ldr r5, _020E3084 ; =0x0A005555 + ldr r4, _020E3088 ; =_021E4F48 + mov fp, r8 + mov r6, #0xaa +_020E2FB4: + ldr r0, _020E3074 ; =_02110FC4 + ldrh r3, [r7] + ldr r0, [r0] + mov sb, #0x55 + ldrh r1, [r0, #8] + mov r0, #2 + mov r2, #0xff + strh fp, [r7] + str r3, [r4] + ldr r3, _020E308C ; =0x0A002AAA + strb r6, [r5] + strb sb, [r3] + mov r3, #0x80 + strb r3, [r5] + mov r1, sl, lsl r1 + ldr r3, _020E308C ; =0x0A002AAA + strb r6, [r5] + strb sb, [r3] + add r1, r1, #0xa000000 + mov r3, #0x30 + strb r3, [r1] + ldrh r3, [r7] + ldr r3, [r4] + strh r3, [r7] + ldr r3, _020E3090 ; =_021E4F5C + ldr r3, [r3] + blx r3 + mov sb, r0 + tst sb, #0xa000 + beq _020E3044 + cmp r8, #0 + bne _020E3044 + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, lsr #0x10 + b _020E2FB4 +_020E3044: + ldr r2, _020E3080 ; =0x04000204 + ldr r1, _020E307C ; =_021E4F2C + ldrh r0, [r2] + bic r3, r0, #3 + ldr r0, [sp] + orr r0, r3, r0 + strh r0, [r2] + ldrh r0, [r1] + bl OS_UnlockCartridge + mov r0, sb + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E3074: .word _02110FC4 +_020E3078: .word 0x000080FF +_020E307C: .word _021E4F2C +_020E3080: .word 0x04000204 +_020E3084: .word 0x0A005555 +_020E3088: .word _021E4F48 +_020E308C: .word 0x0A002AAA +_020E3090: .word _021E4F5C + arm_func_end CTRDGi_EraseFlashSectorCoreMX + + arm_func_start CTRDGi_ProgramFlashByteMX +CTRDGi_ProgramFlashByteMX: ; 0x020E3094 + stmdb sp!, {r3, lr} + ldr ip, _020E30DC ; =0x0A005555 + mov r3, #0xaa + ldr r2, _020E30E0 ; =0x0A002AAA + strb r3, [ip] + mov r3, #0x55 + mov lr, r0 + strb r3, [r2] + mov r0, #0xa0 + strb r0, [ip] + ldrb r2, [lr] + ldr r3, _020E30E4 ; =_021E4F5C + mov r0, #1 + strb r2, [r1] + ldrb r2, [lr] + ldr r3, [r3] + blx r3 + ldmia sp!, {r3, pc} + .align 2, 0 +_020E30DC: .word 0x0A005555 +_020E30E0: .word 0x0A002AAA +_020E30E4: .word _021E4F5C + arm_func_end CTRDGi_ProgramFlashByteMX + + arm_func_start CTRDGi_WriteFlashSectorCoreMX +CTRDGi_WriteFlashSectorCoreMX: ; 0x020E30E8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E3244 ; =_02110FC4 + ldr r1, [r5] + ldr r0, [r0] + str r1, [r4] + ldrh r4, [sp, #0x20] + ldrh r0, [r0, #0xa] + ldr r7, [sp, #0xc] + cmp r4, r0 + addhs sp, sp, #0x24 + ldrhs r0, _020E3248 ; =0x000080FF + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r4 + bl CTRDGi_EraseFlashSectorMX + movs r6, r0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, _020E324C ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r5, _020E3250 ; =0x04000204 + ldr r0, _020E3244 ; =_02110FC4 + ldrh r3, [r5] + ldr r2, [r0] + ldrh r1, [r5] + mov r0, r4, lsl #0xc + ldr r2, [r2, #0x10] + bic r1, r1, #3 + orr r1, r1, r2 + strh r1, [r5] + mov r0, r0, lsr #0x10 + and r5, r3, #3 + bl CTRDGi_SetFlashBankMx + ldr r0, _020E3244 ; =_02110FC4 + ldr r8, _020E3254 ; =_021E4F28 + ldr r2, [r0] + ldr r1, _020E3258 ; =0x04000208 + ldr r0, [r2, #4] + and r4, r4, #0xf + strh r0, [r8] + ldrh r3, [r2, #8] + ldrh r2, [r1] + mov r0, #0 + mov r3, r4, lsl r3 + strh r0, [r1] + ldrh r1, [r8] + ldr r0, _020E325C ; =_021E4F48 + add r4, r3, #0xa000000 + str r2, [r0] + cmp r1, #0 + beq _020E3204 +_020E31D0: + mov r0, r7 + mov r1, r4 + bl CTRDGi_ProgramFlashByteMX + movs r6, r0 + bne _020E3204 + ldrh r0, [r8] + add r7, r7, #1 + add r4, r4, #1 + sub r0, r0, #1 + strh r0, [r8] + ldrh r0, [r8] + cmp r0, #0 + bne _020E31D0 +_020E3204: + ldr r3, _020E3258 ; =0x04000208 + ldr r0, _020E325C ; =_021E4F48 + ldrh r1, [r3] + ldr r0, [r0] + sub r2, r3, #4 + strh r0, [r3] + ldrh r1, [r2] + ldr r0, _020E324C ; =_021E4F2C + bic r1, r1, #3 + orr r1, r1, r5 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, r6 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E3244: .word _02110FC4 +_020E3248: .word 0x000080FF +_020E324C: .word _021E4F2C +_020E3250: .word 0x04000204 +_020E3254: .word _021E4F28 +_020E3258: .word 0x04000208 +_020E325C: .word _021E4F48 + arm_func_end CTRDGi_WriteFlashSectorCoreMX + + arm_func_start CTRDGi_EraseFlashChipMX +CTRDGi_EraseFlashChipMX: ; 0x020E3260 + stmdb sp!, {lr} + sub sp, sp, #0x24 + add r0, sp, #0 + bl CTRDGi_EraseFlashChipCoreMX + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashChipMX + + arm_func_start CTRDGi_EraseFlashSectorMX +CTRDGi_EraseFlashSectorMX: ; 0x020E3280 + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + bl CTRDGi_EraseFlashSectorCoreMX + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_EraseFlashSectorMX + + arm_func_start CTRDGi_WriteFlashSectorMX +CTRDGi_WriteFlashSectorMX: + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + bl CTRDGi_WriteFlashSectorCoreMX + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_WriteFlashSectorMX + + arm_func_start CTRDGi_EraseFlashChipAsyncMX +CTRDGi_EraseFlashChipAsyncMX: + stmdb sp!, {lr} + sub sp, sp, #0x24 + ldr r1, _020E32EC ; =CTRDGi_EraseFlashChipCoreMX + mov r2, r0 + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E32EC: .word CTRDGi_EraseFlashChipCoreMX + arm_func_end CTRDGi_EraseFlashChipAsyncMX + + arm_func_start CTRDGi_EraseFlashSectorAsyncMX +CTRDGi_EraseFlashSectorAsyncMX: ; 0x020E32F0 + stmdb sp!, {lr} + sub sp, sp, #0x24 + mov r2, r1 + strh r0, [sp, #0x20] + ldr r1, _020E3314 ; =CTRDGi_EraseFlashSectorCoreMX + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E3314: .word CTRDGi_EraseFlashSectorCoreMX + arm_func_end CTRDGi_EraseFlashSectorAsyncMX + + arm_func_start CTRDGi_WriteFlashSectorAsyncMX +CTRDGi_WriteFlashSectorAsyncMX: ; 0x020E3318 + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + ldr r1, _020E333C ; =CTRDGi_WriteFlashSectorCoreMX + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E333C: .word CTRDGi_WriteFlashSectorCoreMX + arm_func_end CTRDGi_WriteFlashSectorAsyncMX + + arm_func_start CTRDGi_WriteFlashSectorCoreMX5 +CTRDGi_WriteFlashSectorCoreMX5: ; 0x020E3340 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x24 + mov r5, r0 + ldmia r5!, {r0, r1, r2, r3} + add r4, sp, #0 + stmia r4!, {r0, r1, r2, r3} + ldmia r5!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldr r0, _020E345C ; =_02110FC4 + ldr r1, [r5] + ldr r0, [r0] + str r1, [r4] + ldrh r4, [sp, #0x20] + ldrh r0, [r0, #0xa] + ldr r7, [sp, #0xc] + cmp r4, r0 + addhs sp, sp, #0x24 + ldrhs r0, _020E3460 ; =0x000080FF + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r4 + bl CTRDGi_EraseFlashSectorLE + movs r6, r0 + addne sp, sp, #0x24 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, _020E3464 ; =_021E4F2C + ldrh r0, [r0] + bl OS_LockCartridge + ldr r5, _020E3468 ; =0x04000204 + ldr r0, _020E345C ; =_02110FC4 + ldrh r3, [r5] + ldr r2, [r0] + ldrh r1, [r5] + ldr r2, [r2, #0x10] + ldr r8, _020E346C ; =_021E4F28 + bic r1, r1, #3 + orr r1, r1, r2 + strh r1, [r5] + ldr r1, [r0] + and r5, r3, #3 + ldr r0, [r1, #4] + strh r0, [r8] + ldrh r1, [r1, #8] + ldrh r0, [r8] + mov r1, r4, lsl r1 + cmp r0, #0 + add r4, r1, #0xa000000 + beq _020E3430 +_020E33FC: + mov r0, r7 + mov r1, r4 + bl CTRDGi_ProgramFlashByteLE + movs r6, r0 + bne _020E3430 + ldrh r0, [r8] + add r7, r7, #1 + add r4, r4, #1 + sub r0, r0, #1 + strh r0, [r8] + ldrh r0, [r8] + cmp r0, #0 + bne _020E33FC +_020E3430: + ldr r2, _020E3468 ; =0x04000204 + ldr r0, _020E3464 ; =_021E4F2C + ldrh r1, [r2] + bic r1, r1, #3 + orr r1, r1, r5 + strh r1, [r2] + ldrh r0, [r0] + bl OS_UnlockCartridge + mov r0, r6 + add sp, sp, #0x24 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020E345C: .word _02110FC4 +_020E3460: .word 0x000080FF +_020E3464: .word _021E4F2C +_020E3468: .word 0x04000204 +_020E346C: .word _021E4F28 + arm_func_end CTRDGi_WriteFlashSectorCoreMX5 + + arm_func_start CTRDGi_WriteFlashSectorMX5 +CTRDGi_WriteFlashSectorMX5: ; 0x020E3470 + stmdb sp!, {lr} + sub sp, sp, #0x24 + strh r0, [sp, #0x20] + add r0, sp, #0 + str r1, [sp, #0xc] + bl CTRDGi_WriteFlashSectorCoreMX5 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add sp, sp, #0x24 + ldmia sp!, {pc} + arm_func_end CTRDGi_WriteFlashSectorMX5 + + arm_func_start CTRDGi_WriteFlashSectorAsyncMX5 +CTRDGi_WriteFlashSectorAsyncMX5: + stmdb sp!, {lr} + sub sp, sp, #0x24 + str r1, [sp, #0xc] + strh r0, [sp, #0x20] + ldr r1, _020E34BC ; =CTRDGi_WriteFlashSectorCoreMX5 + add r0, sp, #0 + bl CTRDGi_SetTask + add sp, sp, #0x24 + ldmia sp!, {pc} + .align 2, 0 +_020E34BC: .word CTRDGi_WriteFlashSectorCoreMX5 + arm_func_end CTRDGi_WriteFlashSectorAsyncMX5 + + arm_func_start CTRDGi_InitTaskThread +CTRDGi_InitTaskThread: ; 0x020E34C0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _020E353C ; =_021E4F68 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + bne _020E352C + add r0, r5, #0xc4 + str r5, [r1] + bl CTRDGi_InitTaskInfo + ldr r0, _020E3540 ; =_021E4F6C + bl CTRDGi_InitTaskInfo + mov r0, #0 + str r0, [r5, #0xc0] + mov r2, #0x400 + ldr r1, _020E3544 ; =CTRDGi_TaskThread + ldr r3, _020E3548 ; =_021E4F90 + 0x400 + mov r0, r5 + str r2, [sp] + mov r2, #0x14 + str r2, [sp, #4] + mov r2, r5 + bl OS_CreateThread + mov r0, r5 + bl OS_WakeupThreadDirect +_020E352C: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020E353C: .word _021E4F68 +_020E3540: .word _021E4F6C +_020E3544: .word CTRDGi_TaskThread +_020E3548: .word _021E4F90 + 0x400 + arm_func_end CTRDGi_InitTaskThread + + arm_func_start CTRDGi_IsTaskAvailable +CTRDGi_IsTaskAvailable: ; 0x020E354C + ldr r0, _020E3564 ; =_021E4F68 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + bx lr + .align 2, 0 +_020E3564: .word _021E4F68 + arm_func_end CTRDGi_IsTaskAvailable + + arm_func_start CTRDGi_InitTaskInfo +CTRDGi_InitTaskInfo: ; 0x020E3568 + ldr ip, _020E3578 ; =MI_CpuFill8 + mov r1, #0 + mov r2, #0x24 + bx ip + .align 2, 0 +_020E3578: .word MI_CpuFill8 + arm_func_end CTRDGi_InitTaskInfo + + arm_func_start CTRDGi_TaskThread +CTRDGi_TaskThread: ; 0x020E357C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov r4, #0 + mov r8, r0 + add r6, sp, #0 + mov sl, r4 + mov sb, r4 + mov r5, r4 + mov fp, #0x24 +_020E35A0: + mov r0, r6 + mov r1, r5 + mov r2, fp + bl MI_CpuFill8 + bl OS_DisableInterrupts + ldr r1, [r8, #0xc0] + mov r7, r0 + cmp r1, #0 + bne _020E35D8 +_020E35C4: + mov r0, r4 + bl OS_SleepThread + ldr r0, [r8, #0xc0] + cmp r0, #0 + beq _020E35C4 +_020E35D8: + ldr lr, [r8, #0xc0] + add ip, sp, #0 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldr r1, [lr] + mov r0, r7 + str r1, [ip] + bl OS_RestoreInterrupts + ldr r1, [sp] + cmp r1, #0 + beq _020E3618 + mov r0, r6 + blx r1 + str r0, [sp, #8] +_020E3618: + bl OS_DisableInterrupts + ldr r2, [sp, #4] + ldr r1, _020E3668 ; =_021E4F68 + mov r7, r0 + strb sl, [r1, #0x26] + cmp r2, #0 + beq _020E363C + mov r0, r6 + blx r2 +_020E363C: + ldr r0, _020E3668 ; =_021E4F68 + ldr r0, [r0] + cmp r0, #0 + beq _020E365C + mov r0, r7 + str sb, [r8, #0xc0] + bl OS_RestoreInterrupts + b _020E35A0 +_020E365C: + bl OS_ExitThread + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E3668: .word _021E4F68 + arm_func_end CTRDGi_TaskThread + + arm_func_start CTRDGi_SetTask +CTRDGi_SetTask: ; 0x020E366C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _020E370C ; =_021E4F68 + mov r7, r0 + mov r5, r1 + mov r6, r2 + ldr r4, [r3] + bl CTRDGi_IsTaskAvailable + cmp r0, #0 + bne _020E3694 + bl OS_Terminate +_020E3694: + ldr r0, _020E370C ; =_021E4F68 + ldrb r0, [r0, #0x26] + cmp r0, #0 + beq _020E36A8 + bl OS_Terminate +_020E36A8: + bl OS_DisableInterrupts + mov r1, #1 + strb r1, [r7, #0x22] + str r5, [r7] + add r1, r4, #0xc4 + cmp r7, r1 + mov r5, r0 + ldreq r0, _020E370C ; =_021E4F68 + str r6, [r7, #4] + moveq r1, #0 + streq r1, [r0] + ldr ip, _020E3710 ; =_021E4F6C + ldmia r7!, {r0, r1, r2, r3} + mov r6, ip + stmia ip!, {r0, r1, r2, r3} + ldmia r7!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldr r1, [r7] + mov r0, r4 + str r1, [ip] + str r6, [r4, #0xc0] + bl OS_WakeupThreadDirect + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020E370C: .word _021E4F68 +_020E3710: .word _021E4F6C + arm_func_end CTRDGi_SetTask + + arm_func_start MATH_CountPopulation +MATH_CountPopulation: ; 0x020E3714 + ldr r1, _020E374C ; =0x55555555 + ldr r2, _020E3750 ; =0x33333333 + and r1, r1, r0, lsr #1 + sub r0, r0, r1 + and r1, r0, r2 + and r0, r2, r0, lsr #2 + add r1, r1, r0 + ldr r0, _020E3754 ; =0x0F0F0F0F + add r1, r1, r1, lsr #4 + and r0, r1, r0 + add r0, r0, r0, lsr #8 + add r0, r0, r0, lsr #16 + and r0, r0, #0xff + bx lr + .align 2, 0 +_020E374C: .word 0x55555555 +_020E3750: .word 0x33333333 +_020E3754: .word 0x0F0F0F0F + arm_func_end MATH_CountPopulation + + arm_func_start MATH_CalcMD5 +MATH_CalcMD5: ; 0x020E3758 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x58 + mov r6, r0 + add r0, sp, #0 + mov r5, r1 + mov r4, r2 + bl DGT_Hash1Reset + add r0, sp, #0 + mov r1, r5 + mov r2, r4 + bl DGT_Hash1SetSource + add r1, sp, #0 + mov r0, r6 + bl DGT_Hash1GetDigest_R + add sp, sp, #0x58 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MATH_CalcMD5 + + arm_func_start MATH_CalcSHA1 +MATH_CalcSHA1: ; 0x020E3798 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x68 + mov r6, r0 + add r0, sp, #0 + mov r5, r1 + mov r4, r2 + bl DGT_Hash2Reset + add r0, sp, #0 + mov r1, r5 + mov r2, r4 + bl DGT_Hash2SetSource + add r0, sp, #0 + mov r1, r6 + bl DGT_Hash2GetDigest + add sp, sp, #0x68 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MATH_CalcSHA1 + + arm_func_start MATHi_CRC8InitTable +MATHi_CRC8InitTable: ; 0x020E37D8 + stmdb sp!, {r3, lr} + mov ip, #0 + mov r2, ip +_020E37E4: + mov r3, ip + mov lr, r2 +_020E37EC: + tst r3, #0x80 + eorne r3, r1, r3, lsl #1 + add lr, lr, #1 + moveq r3, r3, lsl #1 + cmp lr, #8 + blo _020E37EC + strb r3, [r0, ip] + add ip, ip, #1 + cmp ip, #0x100 + blo _020E37E4 + ldmia sp!, {r3, pc} + arm_func_end MATHi_CRC8InitTable + + arm_func_start MATHi_CRC8Update +MATHi_CRC8Update: ; 0x020E3818 + stmdb sp!, {r4, lr} + cmp r3, #0 + ldrb lr, [r1] + mov r4, #0 + bls _020E3848 +_020E382C: + ldrb ip, [r2], #1 + add r4, r4, #1 + cmp r4, r3 + eor ip, lr, ip + and ip, ip, #0xff + ldrb lr, [r0, ip] + blo _020E382C +_020E3848: + strb lr, [r1] + ldmia sp!, {r4, pc} + arm_func_end MATHi_CRC8Update + + arm_func_start MATHi_CRC16InitTable +MATHi_CRC16InitTable: ; 0x020E3850 + stmdb sp!, {r4, lr} + mov lr, #0 + mov r4, lr + mov r3, lr +_020E3860: + mov ip, r4 + mov r2, r3 +_020E3868: + tst ip, #0x8000 + eorne ip, r1, ip, lsl #1 + add r2, r2, #1 + moveq ip, ip, lsl #1 + cmp r2, #8 + blo _020E3868 + mov r2, lr, lsl #1 + add lr, lr, #1 + strh ip, [r0, r2] + cmp lr, #0x100 + add r4, r4, #0x100 + blo _020E3860 + ldmia sp!, {r4, pc} + arm_func_end MATHi_CRC16InitTable + + arm_func_start MATHi_CRC16InitTableRev +MATHi_CRC16InitTableRev: ; 0x020E389C + stmdb sp!, {r3, lr} + mov lr, #0 + mov r3, lr +_020E38A8: + mov ip, lr + mov r2, r3 +_020E38B0: + tst ip, #1 + eorne ip, r1, ip, lsr #1 + add r2, r2, #1 + moveq ip, ip, lsr #1 + cmp r2, #8 + blo _020E38B0 + mov r2, lr, lsl #1 + add lr, lr, #1 + strh ip, [r0, r2] + cmp lr, #0x100 + blo _020E38A8 + ldmia sp!, {r3, pc} + arm_func_end MATHi_CRC16InitTableRev + + arm_func_start MATHi_CRC16Update +MATHi_CRC16Update: ; 0x020E38E0 + stmdb sp!, {r4, lr} + cmp r3, #0 + ldrh lr, [r1] + mov r4, #0 + bls _020E3918 +_020E38F4: + ldrb ip, [r2], #1 + add r4, r4, #1 + cmp r4, r3 + eor ip, ip, lr, lsr #8 + mov ip, ip, lsl #0x18 + mov ip, ip, lsr #0x17 + ldrh ip, [r0, ip] + eor lr, ip, lr, lsl #8 + blo _020E38F4 +_020E3918: + strh lr, [r1] + ldmia sp!, {r4, pc} + arm_func_end MATHi_CRC16Update + + arm_func_start MATHi_CRC16UpdateRev +MATHi_CRC16UpdateRev: ; 0x020E3920 + stmdb sp!, {r4, lr} + cmp r3, #0 + ldrh lr, [r1] + mov r4, #0 + bls _020E3958 +_020E3934: + ldrb ip, [r2], #1 + add r4, r4, #1 + cmp r4, r3 + eor ip, lr, ip + mov ip, ip, lsl #0x18 + mov ip, ip, lsr #0x17 + ldrh ip, [r0, ip] + eor lr, ip, lr, lsr #8 + blo _020E3934 +_020E3958: + strh lr, [r1] + ldmia sp!, {r4, pc} + arm_func_end MATHi_CRC16UpdateRev + + arm_func_start MATHi_CRC32InitTableRev +MATHi_CRC32InitTableRev: ; 0x020E3960 + stmdb sp!, {r3, lr} + mov ip, #0 + mov r2, ip +_020E396C: + mov r3, ip + mov lr, r2 +_020E3974: + tst r3, #1 + eorne r3, r1, r3, lsr #1 + add lr, lr, #1 + moveq r3, r3, lsr #1 + cmp lr, #8 + blo _020E3974 + str r3, [r0, ip, lsl #2] + add ip, ip, #1 + cmp ip, #0x100 + blo _020E396C + ldmia sp!, {r3, pc} + arm_func_end MATHi_CRC32InitTableRev + + arm_func_start MATHi_CRC32UpdateRev +MATHi_CRC32UpdateRev: ; 0x020E39A0 + stmdb sp!, {r4, lr} + cmp r3, #0 + ldr lr, [r1] + mov r4, #0 + bls _020E39D4 +_020E39B4: + ldrb ip, [r2], #1 + add r4, r4, #1 + cmp r4, r3 + eor ip, lr, ip + and ip, ip, #0xff + ldr ip, [r0, ip, lsl #2] + eor lr, ip, lr, lsr #8 + blo _020E39B4 +_020E39D4: + str lr, [r1] + ldmia sp!, {r4, pc} + arm_func_end MATHi_CRC32UpdateRev + + arm_func_start MATH_CalcCRC8 +MATH_CalcCRC8: ; 0x020E39DC + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, #0 + mov r3, r2 + add r1, sp, #0 + mov r2, lr + strb ip, [sp] + bl MATHi_CRC8Update + ldrb r0, [sp] + ldmia sp!, {r3, pc} + arm_func_end MATH_CalcCRC8 + + arm_func_start MATH_CalcCRC16 +MATH_CalcCRC16: ; 0x020E3A04 + stmdb sp!, {r3, lr} + mov lr, r1 + mov ip, #0 + mov r3, r2 + add r1, sp, #0 + mov r2, lr + strh ip, [sp] + bl MATHi_CRC16UpdateRev + ldrh r0, [sp] + ldmia sp!, {r3, pc} + arm_func_end MATH_CalcCRC16 + + arm_func_start MATH_CalcCRC16CCITT +MATH_CalcCRC16CCITT: ; 0x020E3A2C + stmdb sp!, {r3, lr} + ldr ip, _020E3A54 ; =0x0000FFFF + mov lr, r1 + mov r3, r2 + add r1, sp, #0 + mov r2, lr + strh ip, [sp] + bl MATHi_CRC16Update + ldrh r0, [sp] + ldmia sp!, {r3, pc} + .align 2, 0 +_020E3A54: .word 0x0000FFFF + arm_func_end MATH_CalcCRC16CCITT + + arm_func_start MATH_CalcCRC32 +MATH_CalcCRC32: ; 0x020E3A58 + stmdb sp!, {r3, lr} + mov lr, r1 + mvn ip, #0 + mov r3, r2 + add r1, sp, #0 + mov r2, lr + str ip, [sp] + bl MATHi_CRC32UpdateRev + ldr r0, [sp] + mvn r0, r0 + ldmia sp!, {r3, pc} + arm_func_end MATH_CalcCRC32 + + arm_func_start MATH_QSort +MATH_QSort: ; 0x020E3A84 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + cmp r1, #1 + ble _020E3D6C + ldr r4, [sp, #0x24] + mov fp, r3 + mov r8, r2 + cmp r4, #0 + bne _020E3ABC + clz r2, r1 + rsb r2, r2, #0x20 + mov r2, r2, lsl #3 + sub sp, sp, r2 + mov r4, sp + str r2, [sp, #-4]! +_020E3ABC: + sub r1, r1, #1 + mla r1, r1, r8, r0 + mov r5, r4 + str r0, [r4], #4 + str r1, [r4], #4 + clz r2, r8 + rsb r2, r2, #0x20 + str r2, [sp, #-4]! +_020E3ADC: + cmp r4, r5 + beq _020E3D3C + ldr r7, [r4, #-4] + ldr r6, [r4, #-8]! + sub r2, r7, r6 + cmp r2, r8 + bne _020E3B50 + mov r0, r6 + mov r1, r7 + blx fp + cmp r0, #0 + ble _020E3ADC + mov r0, r8 + tst r0, #3 + beq _020E3B34 +_020E3B18: + ldrb r1, [r6] + subs r0, r0, #1 + swpb r1, r1, [r7] + add r7, r7, #1 + strb r1, [r6], #1 + bne _020E3B18 + b _020E3ADC +_020E3B34: + ldr r1, [r6] + subs r0, r0, #4 + swp r1, r1, [r7] + add r7, r7, #4 + str r1, [r6], #4 + bne _020E3B34 + b _020E3ADC +_020E3B50: + ldr r3, [sp] + sub r2, r7, r6 + mov r2, r2, lsr r3 + mla r2, r2, r8, r6 + mov r3, r6 + mov r0, r8 + mov r2, r2 + tst r0, #3 + beq _020E3B90 +_020E3B74: + ldrb r1, [r2] + subs r0, r0, #1 + swpb r1, r1, [r3] + add r3, r3, #1 + strb r1, [r2], #1 + bne _020E3B74 + b _020E3BA8 +_020E3B90: + ldr r1, [r2] + subs r0, r0, #4 + swp r1, r1, [r3] + add r3, r3, #4 + str r1, [r2], #4 + bne _020E3B90 +_020E3BA8: + mov sb, r6 + mov sl, r7 + add sb, sb, r8 +_020E3BB4: + cmp sb, r7 + bge _020E3BDC + mov r1, r6 + mov r0, sb + blx fp + cmp r0, #0 + blt _020E3BD4 + b _020E3BD8 +_020E3BD4: + add sb, sb, r8 +_020E3BD8: + blt _020E3BB4 +_020E3BDC: + mov r1, r6 + mov r0, sl + blx fp + cmp r0, #0 + bgt _020E3BF4 + b _020E3BF8 +_020E3BF4: + sub sl, sl, r8 +_020E3BF8: + bgt _020E3BDC + cmp sb, sl + bge _020E3C5C + mov r2, sb + mov r3, sl + mov r0, r8 + tst r0, #3 + beq _020E3C34 +_020E3C18: + ldrb r1, [r2] + subs r0, r0, #1 + swpb r1, r1, [r3] + add r3, r3, #1 + strb r1, [r2], #1 + bne _020E3C18 + b _020E3C4C +_020E3C34: + ldr r1, [r2] + subs r0, r0, #4 + swp r1, r1, [r3] + add r3, r3, #4 + str r1, [r2], #4 + bne _020E3C34 +_020E3C4C: + add sb, sb, r8 + sub sl, sl, r8 + cmp sb, sl + ble _020E3BB4 +_020E3C5C: + mov r2, r6 + mov r3, sl + mov r0, r8 + tst r0, #3 + beq _020E3C8C +_020E3C70: + ldrb r1, [r2] + subs r0, r0, #1 + swpb r1, r1, [r3] + add r3, r3, #1 + strb r1, [r2], #1 + bne _020E3C70 + b _020E3CA4 +_020E3C8C: + ldr r1, [r2] + subs r0, r0, #4 + swp r1, r1, [r3] + add r3, r3, #4 + str r1, [r2], #4 + bne _020E3C8C +_020E3CA4: + sub r2, sl, r6 + sub r3, r7, sl + cmp r2, r3 + ble _020E3CF8 + sub r2, sl, r8 + cmp r6, r2 + blt _020E3CC4 + b _020E3CC8 +_020E3CC4: + str r6, [r4], #4 +_020E3CC8: + blt _020E3CD0 + b _020E3CD4 +_020E3CD0: + str r2, [r4], #4 +_020E3CD4: + add r2, sl, r8 + cmp r2, r7 + blt _020E3CE4 + b _020E3CE8 +_020E3CE4: + str r2, [r4], #4 +_020E3CE8: + blt _020E3CF0 + b _020E3CF4 +_020E3CF0: + str r7, [r4], #4 +_020E3CF4: + b _020E3ADC +_020E3CF8: + add r2, sl, r8 + cmp r2, r7 + blt _020E3D08 + b _020E3D0C +_020E3D08: + str r2, [r4], #4 +_020E3D0C: + blt _020E3D14 + b _020E3D18 +_020E3D14: + str r7, [r4], #4 +_020E3D18: + sub r2, sl, r8 + cmp r6, r2 + blt _020E3D28 + b _020E3D2C +_020E3D28: + str r6, [r4], #4 +_020E3D2C: + blt _020E3D34 + b _020E3D38 +_020E3D34: + str r2, [r4], #4 +_020E3D38: + b _020E3ADC +_020E3D3C: + add sp, sp, #4 + sub r4, r4, #4 + cmp r4, sp + beq _020E3D50 + b _020E3D54 +_020E3D50: + ldr r0, [sp] +_020E3D54: + beq _020E3D5C + b _020E3D60 +_020E3D5C: + add r0, r0, #4 +_020E3D60: + beq _020E3D68 + b _020E3D6C +_020E3D68: + add sp, sp, r0 +_020E3D6C: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + arm_func_end MATH_QSort + + arm_func_start STD_CopyLString +STD_CopyLString: ; 0x020E3D74 + stmdb sp!, {r4, lr} + sub ip, r2, #1 + mov r4, r1 + cmp ip, #0 + mov lr, #0 + ble _020E3DB0 +_020E3D8C: + ldrsb r3, [r4] + strb r3, [r0, lr] + ldrsb r3, [r4] + cmp r3, #0 + beq _020E3DB0 + add lr, lr, #1 + cmp lr, ip + add r4, r4, #1 + blt _020E3D8C +_020E3DB0: + sub r3, r2, #1 + cmp lr, r3 + blt _020E3DC8 + cmp r2, #0 + movne r2, #0 + strneb r2, [r0, lr] +_020E3DC8: + mov r0, r1 + bl STD_GetStringLength + ldmia sp!, {r4, pc} + arm_func_end STD_CopyLString + + arm_func_start STD_GetStringLength +STD_GetStringLength: ; 0x020E3DD4 + ldrsb r1, [r0] + mov r2, #0 + cmp r1, #0 + beq _020E3DF4 +_020E3DE4: + add r2, r2, #1 + ldrsb r1, [r0, r2] + cmp r1, #0 + bne _020E3DE4 +_020E3DF4: + mov r0, r2 + bx lr + arm_func_end STD_GetStringLength + + arm_func_start STD_CompareString +STD_CompareString: ; 0x020E3DFC + b _020E3E08 +_020E3E00: + add r0, r0, #1 + add r1, r1, #1 +_020E3E08: + ldrsb r3, [r1] + ldrsb r2, [r0] + cmp r2, r3 + bne _020E3E20 + cmp r2, #0 + bne _020E3E00 +_020E3E20: + sub r0, r2, r3 + bx lr + arm_func_end STD_CompareString + + arm_func_start STD_CompareNString +STD_CompareNString: ; 0x020E3E28 + stmdb sp!, {r3, lr} + cmp r2, #0 + beq _020E3E60 + cmp r2, #0 + mov lr, #0 + ble _020E3E60 +_020E3E40: + ldrb ip, [r0, lr] + ldrb r3, [r1, lr] + cmp ip, r3 + subne r0, ip, r3 + ldmneia sp!, {r3, pc} + add lr, lr, #1 + cmp lr, r2 + blt _020E3E40 +_020E3E60: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end STD_CompareNString + + arm_func_start string_put_char +string_put_char: ; 0x020E3E68 + ldr r2, [r0] + cmp r2, #0 + beq _020E3E88 + ldr r2, [r0, #4] + strb r1, [r2] + ldr r1, [r0] + sub r1, r1, #1 + str r1, [r0] +_020E3E88: + ldr r1, [r0, #4] + add r1, r1, #1 + str r1, [r0, #4] + bx lr + arm_func_end string_put_char + + arm_func_start string_fill_char +string_fill_char: ; 0x020E3E98 + stmdb sp!, {r3, lr} + cmp r2, #0 + ldmleia sp!, {r3, pc} + ldr lr, [r0] + mov ip, #0 + cmp lr, r2 + movhi lr, r2 + cmp lr, #0 + bls _020E3ED0 +_020E3EBC: + ldr r3, [r0, #4] + strb r1, [r3, ip] + add ip, ip, #1 + cmp ip, lr + blo _020E3EBC +_020E3ED0: + ldr r1, [r0] + sub r1, r1, lr + str r1, [r0] + ldr r1, [r0, #4] + add r1, r1, r2 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + arm_func_end string_fill_char + + arm_func_start string_put_string +string_put_string: ; 0x020E3EEC + stmdb sp!, {r4, lr} + cmp r2, #0 + ldmleia sp!, {r4, pc} + ldr r4, [r0] + mov lr, #0 + cmp r4, r2 + movhi r4, r2 + cmp r4, #0 + bls _020E3F28 +_020E3F10: + ldrsb ip, [r1, lr] + ldr r3, [r0, #4] + strb ip, [r3, lr] + add lr, lr, #1 + cmp lr, r4 + blo _020E3F10 +_020E3F28: + ldr r1, [r0] + sub r1, r1, r4 + str r1, [r0] + ldr r1, [r0, #4] + add r1, r1, r2 + str r1, [r0, #4] + ldmia sp!, {r4, pc} + arm_func_end string_put_string + + arm_func_start STD_TVSNPrintf +STD_TVSNPrintf: ; 0x020E3F44 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + mov sb, r2 + str r1, [sp, #0xc] + str r0, [sp, #0x14] + str r0, [sp, #0x10] + ldrsb r0, [sb] + str r1, [sp] + mov fp, r3 + cmp r0, #0 + beq _020E4770 +_020E3F70: + ldrsb r1, [sb] + and r0, r1, #0xff + eor r0, r0, #0x20 + sub r0, r0, #0xa1 + cmp r0, #0x3c + bhs _020E3FAC + add r0, sp, #0xc + bl string_put_char + ldrsb r1, [sb, #1]! + cmp r1, #0 + beq _020E4764 + add r0, sp, #0xc + add sb, sb, #1 + bl string_put_char + b _020E4764 +_020E3FAC: + cmp r1, #0x25 + beq _020E3FC4 + add r0, sp, #0xc + add sb, sb, #1 + bl string_put_char + b _020E4764 +_020E3FC4: + mov r5, #0 + mov sl, r5 + mov r2, sb + sub r6, r5, #1 + mov r0, #0xa + mov r3, #0x57 +_020E3FDC: + ldrsb r4, [sb, #1]! + cmp r4, #0x20 + bgt _020E3FF0 + beq _020E402C + b _020E4044 +_020E3FF0: + cmp r4, #0x30 + bgt _020E4044 + cmp r4, #0x2b + blt _020E4044 + beq _020E4018 + cmp r4, #0x2d + beq _020E4034 + cmp r4, #0x30 + beq _020E403C + b _020E4044 +_020E4018: + ldrsb r1, [sb, #-1] + cmp r1, #0x20 + bne _020E4044 + orr r5, r5, #2 + b _020E3FDC +_020E402C: + orr r5, r5, #1 + b _020E3FDC +_020E4034: + orr r5, r5, #8 + b _020E3FDC +_020E403C: + orr r5, r5, #0x10 + b _020E3FDC +_020E4044: + cmp r4, #0x2a + bne _020E4068 + add fp, fp, #4 + ldr sl, [fp, #-4] + add sb, sb, #1 + cmp sl, #0 + rsblt sl, sl, #0 + orrlt r5, r5, #8 + b _020E4090 +_020E4068: + mov r1, #0xa + b _020E407C +_020E4070: + ldrsb r4, [sb], #1 + mla r4, sl, r1, r4 + sub sl, r4, #0x30 +_020E407C: + ldrsb r4, [sb] + cmp r4, #0x30 + blt _020E4090 + cmp r4, #0x39 + ble _020E4070 +_020E4090: + ldrsb r1, [sb] + cmp r1, #0x2e + bne _020E40EC + ldrsb r1, [sb, #1]! + mov r6, #0 + cmp r1, #0x2a + bne _020E40C4 + add fp, fp, #4 + ldr r6, [fp, #-4] + add sb, sb, #1 + cmp r6, #0 + mvnlt r6, #0 + b _020E40EC +_020E40C4: + mov r1, #0xa + b _020E40D8 +_020E40CC: + ldrsb r4, [sb], #1 + mla r4, r6, r1, r4 + sub r6, r4, #0x30 +_020E40D8: + ldrsb r4, [sb] + cmp r4, #0x30 + blt _020E40EC + cmp r4, #0x39 + ble _020E40CC +_020E40EC: + ldrsb r1, [sb] + cmp r1, #0x68 + beq _020E4104 + cmp r1, #0x6c + beq _020E411C + b _020E4130 +_020E4104: + ldrsb r1, [sb, #1]! + cmp r1, #0x68 + orrne r5, r5, #0x40 + addeq sb, sb, #1 + orreq r5, r5, #0x100 + b _020E4130 +_020E411C: + ldrsb r1, [sb, #1]! + cmp r1, #0x6c + orrne r5, r5, #0x20 + addeq sb, sb, #1 + orreq r5, r5, #0x80 +_020E4130: + ldrsb r1, [sb] + cmp r1, #0x69 + bgt _020E4174 + cmp r1, #0x63 + blt _020E4158 + beq _020E41E4 + cmp r1, #0x64 + cmpne r1, #0x69 + beq _020E439C + b _020E4380 +_020E4158: + cmp r1, #0x25 + bgt _020E4168 + beq _020E4364 + b _020E4380 +_020E4168: + cmp r1, #0x58 + beq _020E41D0 + b _020E4380 +_020E4174: + cmp r1, #0x6e + bgt _020E4184 + beq _020E430C + b _020E4380 +_020E4184: + sub r1, r1, #0x6f + cmp r1, #9 + addls pc, pc, r1, lsl #2 + b _020E4380 +_020E4194: ; jump table + b _020E41BC ; case 0 + b _020E41D8 ; case 1 + b _020E4380 ; case 2 + b _020E4380 ; case 3 + b _020E4258 ; case 4 + b _020E4380 ; case 5 + b _020E41C8 ; case 6 + b _020E4380 ; case 7 + b _020E4380 ; case 8 + b _020E4394 ; case 9 +_020E41BC: + orr r5, r5, #0x1000 + mov r0, #8 + b _020E439C +_020E41C8: + orr r5, r5, #0x1000 + b _020E439C +_020E41D0: + mov r3, #0x37 + b _020E4394 +_020E41D8: + orr r5, r5, #4 + mov r6, #8 + b _020E4394 +_020E41E4: + cmp r6, #0 + bge _020E4380 + add fp, fp, #4 + tst r5, #8 + ldr r4, [fp, #-4] + beq _020E4220 + mov r1, r4, lsl #0x18 + add r0, sp, #0xc + mov r1, r1, asr #0x18 + bl string_put_char + add r0, sp, #0xc + sub r2, sl, #1 + mov r1, #0x20 + bl string_fill_char + b _020E4250 +_020E4220: + tst r5, #0x10 + movne r0, #0x30 + moveq r0, #0x20 + mov r1, r0, lsl #0x18 + add r0, sp, #0xc + mov r1, r1, asr #0x18 + sub r2, sl, #1 + bl string_fill_char + mov r1, r4, lsl #0x18 + add r0, sp, #0xc + mov r1, r1, asr #0x18 + bl string_put_char +_020E4250: + add sb, sb, #1 + b _020E4764 +_020E4258: + add fp, fp, #4 + cmp r6, #0 + ldr r7, [fp, #-4] + mov r4, #0 + bge _020E4290 + ldrsb r0, [r7] + cmp r0, #0 + beq _020E42A4 +_020E4278: + add r4, r4, #1 + ldrsb r0, [r7, r4] + cmp r0, #0 + bne _020E4278 + b _020E42A4 +_020E428C: + add r4, r4, #1 +_020E4290: + cmp r4, r6 + bge _020E42A4 + ldrsb r0, [r7, r4] + cmp r0, #0 + bne _020E428C +_020E42A4: + tst r5, #8 + sub sl, sl, r4 + beq _020E42D4 + add r0, sp, #0xc + mov r1, r7 + mov r2, r4 + bl string_put_string + add r0, sp, #0xc + mov r2, sl + mov r1, #0x20 + bl string_fill_char + b _020E4304 +_020E42D4: + tst r5, #0x10 + movne r0, #0x30 + moveq r0, #0x20 + mov r1, r0, lsl #0x18 + add r0, sp, #0xc + mov r2, sl + mov r1, r1, asr #0x18 + bl string_fill_char + add r0, sp, #0xc + mov r1, r7 + mov r2, r4 + bl string_put_string +_020E4304: + add sb, sb, #1 + b _020E4764 +_020E430C: + ldr r1, [sp, #0x10] + ldr r0, [sp, #0x14] + tst r5, #0x100 + sub r2, r1, r0 + bne _020E435C + tst r5, #0x40 + beq _020E4338 + add fp, fp, #4 + ldr r0, [fp, #-4] + strh r2, [r0] + b _020E435C +_020E4338: + add fp, fp, #4 + tst r5, #0x80 + ldreq r0, [fp, #-4] + streq r2, [r0] + beq _020E435C + ldr r0, [fp, #-4] + mov r1, r2, asr #0x1f + str r2, [r0] + str r1, [r0, #4] +_020E435C: + add sb, sb, #1 + b _020E4764 +_020E4364: + add r0, r2, #1 + cmp r0, sb + bne _020E4380 + add r0, sp, #0xc + add sb, sb, #1 + bl string_put_char + b _020E4764 +_020E4380: + mov r1, r2 + add r0, sp, #0xc + sub r2, sb, r2 + bl string_put_string + b _020E4764 +_020E4394: + orr r5, r5, #0x1000 + mov r0, #0x10 +_020E439C: + tst r5, #8 + bicne r5, r5, #0x10 + cmp r6, #0 + bicge r5, r5, #0x10 + movlt r6, #1 + mov r4, #0 + tst r5, #0x1000 + beq _020E445C + tst r5, #0x100 + beq _020E43D4 + add fp, fp, #4 + ldrb r7, [fp, #-4] + mov r1, #0 + b _020E440C +_020E43D4: + tst r5, #0x40 + beq _020E43EC + add fp, fp, #4 + ldrh r7, [fp, #-4] + mov r1, #0 + b _020E440C +_020E43EC: + tst r5, #0x80 + addeq fp, fp, #4 + ldreq r7, [fp, #-4] + moveq r1, #0 + beq _020E440C + add fp, fp, #8 + ldr r7, [fp, #-8] + ldr r1, [fp, #-4] +_020E440C: + bic r5, r5, #3 + tst r5, #4 + beq _020E451C + cmp r0, #0x10 + bne _020E4444 + cmp r1, #0 + cmpeq r7, #0 + beq _020E451C + add r4, r3, #0x21 + mov r2, #0x30 + strb r4, [sp, #8] + strb r2, [sp, #9] + mov r4, #2 + b _020E451C +_020E4444: + cmp r0, #8 + bne _020E451C + mov r2, #0x30 + strb r2, [sp, #8] + mov r4, #1 + b _020E451C +_020E445C: + tst r5, #0x100 + beq _020E4474 + add fp, fp, #4 + ldrsb r7, [fp, #-4] + mov r1, r7, asr #0x1f + b _020E44AC +_020E4474: + tst r5, #0x40 + beq _020E448C + add fp, fp, #4 + ldrsh r7, [fp, #-4] + mov r1, r7, asr #0x1f + b _020E44AC +_020E448C: + tst r5, #0x80 + addeq fp, fp, #4 + ldreq r7, [fp, #-4] + moveq r1, r7, asr #0x1f + beq _020E44AC + add fp, fp, #8 + ldr r7, [fp, #-8] + ldr r1, [fp, #-4] +_020E44AC: + mov ip, #0 + and r2, ip, #0 + and r8, r1, #0x80000000 + cmp r2, #0 + cmpeq r8, #0 + beq _020E44E4 + mvn r4, r7 + mov r2, #0x2d + mvn r1, r1 + strb r2, [sp, #8] + adds r7, r4, #1 + adc r1, r1, ip + mov r4, #1 + b _020E451C +_020E44E4: + cmp r1, ip + cmpeq r7, ip + cmpeq r6, #0 + beq _020E451C + tst r5, #2 + beq _020E450C + mov r2, #0x2b + strb r2, [sp, #8] + mov r4, #1 + b _020E451C +_020E450C: + tst r5, #1 + movne r2, #0x20 + strneb r2, [sp, #8] + movne r4, #1 +_020E451C: + cmp r0, #8 + mov r8, #0 + beq _020E453C + cmp r0, #0xa + beq _020E4588 + cmp r0, #0x10 + beq _020E4620 + b _020E466C +_020E453C: + cmp r1, r8 + cmpeq r7, r8 + beq _020E466C + add r2, sp, #0x18 + mov r0, r8 + mov lr, #7 + mov ip, r8 +_020E4558: + and r3, r7, lr + add r3, r3, #0x30 + strb r3, [r2, r8] + mov r3, r1, lsr #3 + cmp r3, r0 + mov r7, r7, lsr #3 + orr r7, r7, r1, lsl #29 + mov r1, r3 + cmpeq r7, ip + add r8, r8, #1 + bne _020E4558 + b _020E466C +_020E4588: + mov r0, r8 + cmp r0, r8 + cmpeq r1, r8 + bne _020E45D4 + cmp r7, #0 + beq _020E466C + ldr ip, _020E47BC ; =0xCCCCCCCD + add r3, sp, #0x18 + mov r2, #0xa +_020E45AC: + umull r1, r0, r7, ip + movs r0, r0, lsr #3 + mul r1, r0, r2 + sub r1, r7, r1 + mov r7, r0 + add r0, r1, #0x30 + strb r0, [r3, r8] + add r8, r8, #1 + bne _020E45AC + b _020E466C +_020E45D4: + cmp r1, r8 + cmpeq r7, r8 + beq _020E466C +_020E45E0: + mov r0, r7 + mov r2, #0xa + mov r3, #0 + bl _ll_udiv + mov r2, #0xa + umull r3, r2, r0, r2 + subs r2, r7, r3 + add r3, r2, #0x30 + add r2, sp, #0x18 + strb r3, [r2, r8] + cmp r1, #0 + cmpeq r0, #0 + mov r7, r0 + add r8, r8, #1 + bne _020E45E0 + b _020E466C +_020E4620: + cmp r1, r8 + cmpeq r7, r8 + beq _020E466C + add ip, sp, #0x18 + mov lr, #0xf +_020E4634: + and r2, r7, lr + mov r7, r7, lsr #4 + mov r0, r1, lsr #4 + orr r7, r7, r1, lsl #28 + cmp r2, #0xa + mov r1, r0 + addlt r0, r2, #0x30 + addge r0, r2, r3 + strb r0, [ip, r8] + mov r0, #0 + cmp r1, r0 + cmpeq r7, r0 + add r8, r8, #1 + bne _020E4634 +_020E466C: + cmp r4, #0 + ble _020E4694 + ldrsb r0, [sp, #8] + cmp r0, #0x30 + bne _020E4694 + add r0, sp, #0x18 + mov r1, #0x30 + strb r1, [r0, r8] + add r8, r8, #1 + mov r4, #0 +_020E4694: + tst r5, #0x10 + sub r6, r6, r8 + beq _020E46B0 + sub r0, sl, r8 + sub r0, r0, r4 + cmp r6, r0 + movlt r6, r0 +_020E46B0: + cmp r6, #0 + subgt sl, sl, r6 + add r0, r4, r8 + sub sl, sl, r0 + ands r0, r5, #8 + str r0, [sp, #4] + bne _020E46DC + add r0, sp, #0xc + mov r2, sl + mov r1, #0x20 + bl string_fill_char +_020E46DC: + cmp r4, #0 + ble _020E4708 + add r0, sp, #8 + add r5, r0, r4 + add r7, sp, #0xc +_020E46F0: + ldrsb r1, [r5, #-1]! + mov r0, r7 + sub r4, r4, #1 + bl string_put_char + cmp r4, #0 + bgt _020E46F0 +_020E4708: + add r0, sp, #0xc + mov r2, r6 + mov r1, #0x30 + bl string_fill_char + cmp r8, #0 + ble _020E4744 + add r0, sp, #0x18 + add r5, r0, r8 + add r4, sp, #0xc +_020E472C: + ldrsb r1, [r5, #-1]! + mov r0, r4 + sub r8, r8, #1 + bl string_put_char + cmp r8, #0 + bgt _020E472C +_020E4744: + ldr r0, [sp, #4] + cmp r0, #0 + beq _020E4760 + add r0, sp, #0xc + mov r2, sl + mov r1, #0x20 + bl string_fill_char +_020E4760: + add sb, sb, #1 +_020E4764: + ldrsb r0, [sb] + cmp r0, #0 + bne _020E3F70 +_020E4770: + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _020E478C + ldr r0, [sp, #0x10] + mov r1, #0 + strb r1, [r0] + b _020E47A8 +_020E478C: + ldr r0, [sp] + cmp r0, #0 + beq _020E47A8 + ldr r1, [sp, #0x14] + mov r2, #0 + add r0, r1, r0 + strb r2, [r0, #-1] +_020E47A8: + ldr r1, [sp, #0x10] + ldr r0, [sp, #0x14] + sub r0, r1, r0 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020E47BC: .word 0xCCCCCCCD + arm_func_end STD_TVSNPrintf + + .rodata + +_0210D650: + .byte 0x00, 0x80, 0x2E, 0xFD, 0x2F, 0xFD, 0x75, 0xFD, 0xA7, 0xFD, 0xCE, 0xFD, 0xEE, 0xFD, 0x09, 0xFE + .byte 0x20, 0xFE, 0x34, 0xFE, 0x46, 0xFE, 0x57, 0xFE, 0x66, 0xFE, 0x74, 0xFE, 0x81, 0xFE, 0x8D, 0xFE + .byte 0x98, 0xFE, 0xA3, 0xFE, 0xAD, 0xFE, 0xB6, 0xFE, 0xBF, 0xFE, 0xC7, 0xFE, 0xCF, 0xFE, 0xD7, 0xFE + .byte 0xDF, 0xFE, 0xE6, 0xFE, 0xEC, 0xFE, 0xF3, 0xFE, 0xF9, 0xFE, 0xFF, 0xFE, 0x05, 0xFF, 0x0B, 0xFF + .byte 0x11, 0xFF, 0x16, 0xFF, 0x1B, 0xFF, 0x20, 0xFF, 0x25, 0xFF, 0x2A, 0xFF, 0x2E, 0xFF, 0x33, 0xFF + .byte 0x37, 0xFF, 0x3C, 0xFF, 0x40, 0xFF, 0x44, 0xFF, 0x48, 0xFF, 0x4C, 0xFF, 0x50, 0xFF, 0x53, 0xFF + .byte 0x57, 0xFF, 0x5B, 0xFF, 0x5E, 0xFF, 0x62, 0xFF, 0x65, 0xFF, 0x68, 0xFF, 0x6B, 0xFF, 0x6F, 0xFF + .byte 0x72, 0xFF, 0x75, 0xFF, 0x78, 0xFF, 0x7B, 0xFF, 0x7E, 0xFF, 0x81, 0xFF, 0x83, 0xFF, 0x86, 0xFF + .byte 0x89, 0xFF, 0x8C, 0xFF, 0x8E, 0xFF, 0x91, 0xFF, 0x93, 0xFF, 0x96, 0xFF, 0x99, 0xFF, 0x9B, 0xFF + .byte 0x9D, 0xFF, 0xA0, 0xFF, 0xA2, 0xFF, 0xA5, 0xFF, 0xA7, 0xFF, 0xA9, 0xFF, 0xAB, 0xFF, 0xAE, 0xFF + .byte 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0xFF, 0xB6, 0xFF, 0xB8, 0xFF, 0xBA, 0xFF, 0xBC, 0xFF, 0xBE, 0xFF + .byte 0xC0, 0xFF, 0xC2, 0xFF, 0xC4, 0xFF, 0xC6, 0xFF, 0xC8, 0xFF, 0xCA, 0xFF, 0xCC, 0xFF, 0xCE, 0xFF + .byte 0xCF, 0xFF, 0xD1, 0xFF, 0xD3, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD8, 0xFF, 0xDA, 0xFF, 0xDC, 0xFF + .byte 0xDD, 0xFF, 0xDF, 0xFF, 0xE1, 0xFF, 0xE2, 0xFF, 0xE4, 0xFF, 0xE5, 0xFF, 0xE7, 0xFF, 0xE9, 0xFF + .byte 0xEA, 0xFF, 0xEC, 0xFF, 0xED, 0xFF, 0xEF, 0xFF, 0xF0, 0xFF, 0xF2, 0xFF, 0xF3, 0xFF, 0xF5, 0xFF + .byte 0xF6, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, 0xFA, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00 + .public _0210D750 +_0210D750: + .byte 0x00, 0x80, 0x5B, 0xFE, 0x97, 0xFE, 0xBB, 0xFE, 0xD4, 0xFE, 0xE7, 0xFE, 0xF7, 0xFE, 0x04, 0xFF + .byte 0x10, 0xFF, 0x1A, 0xFF, 0x23, 0xFF, 0x2C, 0xFF, 0x33, 0xFF, 0x3A, 0xFF, 0x40, 0xFF, 0x46, 0xFF + .byte 0x4C, 0xFF, 0x51, 0xFF, 0x56, 0xFF, 0x5B, 0xFF, 0x5F, 0xFF, 0x64, 0xFF, 0x68, 0xFF, 0x6C, 0xFF + .byte 0x6F, 0xFF, 0x73, 0xFF, 0x76, 0xFF, 0x7A, 0xFF, 0x7D, 0xFF, 0x80, 0xFF, 0x83, 0xFF, 0x86, 0xFF + .byte 0x88, 0xFF, 0x8B, 0xFF, 0x8E, 0xFF, 0x90, 0xFF, 0x92, 0xFF, 0x95, 0xFF, 0x97, 0xFF, 0x99, 0xFF + .byte 0x9C, 0xFF, 0x9E, 0xFF, 0xA0, 0xFF, 0xA2, 0xFF, 0xA4, 0xFF, 0xA6, 0xFF, 0xA8, 0xFF, 0xAA, 0xFF + .byte 0xAB, 0xFF, 0xAD, 0xFF, 0xAF, 0xFF, 0xB1, 0xFF, 0xB2, 0xFF, 0xB4, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF + .byte 0xB9, 0xFF, 0xBA, 0xFF, 0xBC, 0xFF, 0xBD, 0xFF, 0xBF, 0xFF, 0xC0, 0xFF, 0xC2, 0xFF, 0xC3, 0xFF + .byte 0xC4, 0xFF, 0xC6, 0xFF, 0xC7, 0xFF, 0xC8, 0xFF, 0xCA, 0xFF, 0xCB, 0xFF, 0xCC, 0xFF, 0xCD, 0xFF + .byte 0xCF, 0xFF, 0xD0, 0xFF, 0xD1, 0xFF, 0xD2, 0xFF, 0xD3, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD7, 0xFF + .byte 0xD8, 0xFF, 0xD9, 0xFF, 0xDA, 0xFF, 0xDB, 0xFF, 0xDC, 0xFF, 0xDD, 0xFF, 0xDE, 0xFF, 0xDF, 0xFF + .byte 0xE0, 0xFF, 0xE1, 0xFF, 0xE2, 0xFF, 0xE3, 0xFF, 0xE4, 0xFF, 0xE5, 0xFF, 0xE6, 0xFF, 0xE7, 0xFF + .byte 0xE8, 0xFF, 0xE9, 0xFF, 0xE9, 0xFF, 0xEA, 0xFF, 0xEB, 0xFF, 0xEC, 0xFF, 0xED, 0xFF, 0xEE, 0xFF + .byte 0xEF, 0xFF, 0xEF, 0xFF, 0xF0, 0xFF, 0xF1, 0xFF, 0xF2, 0xFF, 0xF3, 0xFF, 0xF4, 0xFF, 0xF4, 0xFF + .byte 0xF5, 0xFF, 0xF6, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, 0xFA, 0xFF, 0xFA, 0xFF + .byte 0xFB, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00 + .byte 0x00, 0x00, 0x3B, 0x00, 0x76, 0x00, 0xB2, 0x00, 0xED, 0x00, 0x28, 0x01, 0x64, 0x01, 0x9F, 0x01 + .byte 0xDB, 0x01, 0x17, 0x02, 0x52, 0x02, 0x8E, 0x02, 0xCA, 0x02, 0x05, 0x03, 0x41, 0x03, 0x7D, 0x03 + .byte 0xB9, 0x03, 0xF5, 0x03, 0x31, 0x04, 0x6E, 0x04, 0xAA, 0x04, 0xE6, 0x04, 0x22, 0x05, 0x5F, 0x05 + .byte 0x9B, 0x05, 0xD8, 0x05, 0x14, 0x06, 0x51, 0x06, 0x8D, 0x06, 0xCA, 0x06, 0x07, 0x07, 0x43, 0x07 + .byte 0x80, 0x07, 0xBD, 0x07, 0xFA, 0x07, 0x37, 0x08, 0x74, 0x08, 0xB1, 0x08, 0xEF, 0x08, 0x2C, 0x09 + .byte 0x69, 0x09, 0xA7, 0x09, 0xE4, 0x09, 0x21, 0x0A, 0x5F, 0x0A, 0x9C, 0x0A, 0xDA, 0x0A, 0x18, 0x0B + .byte 0x56, 0x0B, 0x93, 0x0B, 0xD1, 0x0B, 0x0F, 0x0C, 0x4D, 0x0C, 0x8B, 0x0C, 0xC9, 0x0C, 0x07, 0x0D + .byte 0x45, 0x0D, 0x84, 0x0D, 0xC2, 0x0D, 0x00, 0x0E, 0x3F, 0x0E, 0x7D, 0x0E, 0xBC, 0x0E, 0xFA, 0x0E + .byte 0x39, 0x0F, 0x78, 0x0F, 0xB6, 0x0F, 0xF5, 0x0F, 0x34, 0x10, 0x73, 0x10, 0xB2, 0x10, 0xF1, 0x10 + .byte 0x30, 0x11, 0x6F, 0x11, 0xAE, 0x11, 0xEE, 0x11, 0x2D, 0x12, 0x6C, 0x12, 0xAC, 0x12, 0xEB, 0x12 + .byte 0x2B, 0x13, 0x6B, 0x13, 0xAA, 0x13, 0xEA, 0x13, 0x2A, 0x14, 0x6A, 0x14, 0xA9, 0x14, 0xE9, 0x14 + .byte 0x29, 0x15, 0x69, 0x15, 0xAA, 0x15, 0xEA, 0x15, 0x2A, 0x16, 0x6A, 0x16, 0xAB, 0x16, 0xEB, 0x16 + .byte 0x2C, 0x17, 0x6C, 0x17, 0xAD, 0x17, 0xED, 0x17, 0x2E, 0x18, 0x6F, 0x18, 0xB0, 0x18, 0xF0, 0x18 + .byte 0x31, 0x19, 0x72, 0x19, 0xB3, 0x19, 0xF5, 0x19, 0x36, 0x1A, 0x77, 0x1A, 0xB8, 0x1A, 0xFA, 0x1A + .byte 0x3B, 0x1B, 0x7D, 0x1B, 0xBE, 0x1B, 0x00, 0x1C, 0x41, 0x1C, 0x83, 0x1C, 0xC5, 0x1C, 0x07, 0x1D + .byte 0x48, 0x1D, 0x8A, 0x1D, 0xCC, 0x1D, 0x0E, 0x1E, 0x51, 0x1E, 0x93, 0x1E, 0xD5, 0x1E, 0x17, 0x1F + .byte 0x5A, 0x1F, 0x9C, 0x1F, 0xDF, 0x1F, 0x21, 0x20, 0x64, 0x20, 0xA6, 0x20, 0xE9, 0x20, 0x2C, 0x21 + .byte 0x6F, 0x21, 0xB2, 0x21, 0xF5, 0x21, 0x38, 0x22, 0x7B, 0x22, 0xBE, 0x22, 0x01, 0x23, 0x44, 0x23 + .byte 0x88, 0x23, 0xCB, 0x23, 0x0E, 0x24, 0x52, 0x24, 0x96, 0x24, 0xD9, 0x24, 0x1D, 0x25, 0x61, 0x25 + .byte 0xA4, 0x25, 0xE8, 0x25, 0x2C, 0x26, 0x70, 0x26, 0xB4, 0x26, 0xF8, 0x26, 0x3D, 0x27, 0x81, 0x27 + .byte 0xC5, 0x27, 0x0A, 0x28, 0x4E, 0x28, 0x92, 0x28, 0xD7, 0x28, 0x1C, 0x29, 0x60, 0x29, 0xA5, 0x29 + .byte 0xEA, 0x29, 0x2F, 0x2A, 0x74, 0x2A, 0xB9, 0x2A, 0xFE, 0x2A, 0x43, 0x2B, 0x88, 0x2B, 0xCD, 0x2B + .byte 0x13, 0x2C, 0x58, 0x2C, 0x9D, 0x2C, 0xE3, 0x2C, 0x28, 0x2D, 0x6E, 0x2D, 0xB4, 0x2D, 0xF9, 0x2D + .byte 0x3F, 0x2E, 0x85, 0x2E, 0xCB, 0x2E, 0x11, 0x2F, 0x57, 0x2F, 0x9D, 0x2F, 0xE3, 0x2F, 0x2A, 0x30 + .byte 0x70, 0x30, 0xB6, 0x30, 0xFD, 0x30, 0x43, 0x31, 0x8A, 0x31, 0xD0, 0x31, 0x17, 0x32, 0x5E, 0x32 + .byte 0xA5, 0x32, 0xEC, 0x32, 0x32, 0x33, 0x79, 0x33, 0xC1, 0x33, 0x08, 0x34, 0x4F, 0x34, 0x96, 0x34 + .byte 0xDD, 0x34, 0x25, 0x35, 0x6C, 0x35, 0xB4, 0x35, 0xFB, 0x35, 0x43, 0x36, 0x8B, 0x36, 0xD3, 0x36 + .byte 0x1A, 0x37, 0x62, 0x37, 0xAA, 0x37, 0xF2, 0x37, 0x3A, 0x38, 0x83, 0x38, 0xCB, 0x38, 0x13, 0x39 + .byte 0x5C, 0x39, 0xA4, 0x39, 0xED, 0x39, 0x35, 0x3A, 0x7E, 0x3A, 0xC6, 0x3A, 0x0F, 0x3B, 0x58, 0x3B + .byte 0xA1, 0x3B, 0xEA, 0x3B, 0x33, 0x3C, 0x7C, 0x3C, 0xC5, 0x3C, 0x0E, 0x3D, 0x58, 0x3D, 0xA1, 0x3D + .byte 0xEA, 0x3D, 0x34, 0x3E, 0x7D, 0x3E, 0xC7, 0x3E, 0x11, 0x3F, 0x5A, 0x3F, 0xA4, 0x3F, 0xEE, 0x3F + .byte 0x38, 0x40, 0x82, 0x40, 0xCC, 0x40, 0x16, 0x41, 0x61, 0x41, 0xAB, 0x41, 0xF5, 0x41, 0x40, 0x42 + .byte 0x8A, 0x42, 0xD5, 0x42, 0x1F, 0x43, 0x6A, 0x43, 0xB5, 0x43, 0x00, 0x44, 0x4B, 0x44, 0x95, 0x44 + .byte 0xE1, 0x44, 0x2C, 0x45, 0x77, 0x45, 0xC2, 0x45, 0x0D, 0x46, 0x59, 0x46, 0xA4, 0x46, 0xF0, 0x46 + .byte 0x3B, 0x47, 0x87, 0x47, 0xD3, 0x47, 0x1E, 0x48, 0x6A, 0x48, 0xB6, 0x48, 0x02, 0x49, 0x4E, 0x49 + .byte 0x9A, 0x49, 0xE6, 0x49, 0x33, 0x4A, 0x7F, 0x4A, 0xCB, 0x4A, 0x18, 0x4B, 0x64, 0x4B, 0xB1, 0x4B + .byte 0xFE, 0x4B, 0x4A, 0x4C, 0x97, 0x4C, 0xE4, 0x4C, 0x31, 0x4D, 0x7E, 0x4D, 0xCB, 0x4D, 0x18, 0x4E + .byte 0x66, 0x4E, 0xB3, 0x4E, 0x00, 0x4F, 0x4E, 0x4F, 0x9B, 0x4F, 0xE9, 0x4F, 0x36, 0x50, 0x84, 0x50 + .byte 0xD2, 0x50, 0x20, 0x51, 0x6E, 0x51, 0xBC, 0x51, 0x0A, 0x52, 0x58, 0x52, 0xA6, 0x52, 0xF4, 0x52 + .byte 0x43, 0x53, 0x91, 0x53, 0xE0, 0x53, 0x2E, 0x54, 0x7D, 0x54, 0xCC, 0x54, 0x1A, 0x55, 0x69, 0x55 + .byte 0xB8, 0x55, 0x07, 0x56, 0x56, 0x56, 0xA5, 0x56, 0xF4, 0x56, 0x44, 0x57, 0x93, 0x57, 0xE2, 0x57 + .byte 0x32, 0x58, 0x82, 0x58, 0xD1, 0x58, 0x21, 0x59, 0x71, 0x59, 0xC1, 0x59, 0x10, 0x5A, 0x60, 0x5A + .byte 0xB0, 0x5A, 0x01, 0x5B, 0x51, 0x5B, 0xA1, 0x5B, 0xF1, 0x5B, 0x42, 0x5C, 0x92, 0x5C, 0xE3, 0x5C + .byte 0x34, 0x5D, 0x84, 0x5D, 0xD5, 0x5D, 0x26, 0x5E, 0x77, 0x5E, 0xC8, 0x5E, 0x19, 0x5F, 0x6A, 0x5F + .byte 0xBB, 0x5F, 0x0D, 0x60, 0x5E, 0x60, 0xB0, 0x60, 0x01, 0x61, 0x53, 0x61, 0xA4, 0x61, 0xF6, 0x61 + .byte 0x48, 0x62, 0x9A, 0x62, 0xEC, 0x62, 0x3E, 0x63, 0x90, 0x63, 0xE2, 0x63, 0x34, 0x64, 0x87, 0x64 + .byte 0xD9, 0x64, 0x2C, 0x65, 0x7E, 0x65, 0xD1, 0x65, 0x24, 0x66, 0x76, 0x66, 0xC9, 0x66, 0x1C, 0x67 + .byte 0x6F, 0x67, 0xC2, 0x67, 0x15, 0x68, 0x69, 0x68, 0xBC, 0x68, 0x0F, 0x69, 0x63, 0x69, 0xB6, 0x69 + .byte 0x0A, 0x6A, 0x5E, 0x6A, 0xB1, 0x6A, 0x05, 0x6B, 0x59, 0x6B, 0xAD, 0x6B, 0x01, 0x6C, 0x55, 0x6C + .byte 0xAA, 0x6C, 0xFE, 0x6C, 0x52, 0x6D, 0xA7, 0x6D, 0xFB, 0x6D, 0x50, 0x6E, 0xA4, 0x6E, 0xF9, 0x6E + .byte 0x4E, 0x6F, 0xA3, 0x6F, 0xF8, 0x6F, 0x4D, 0x70, 0xA2, 0x70, 0xF7, 0x70, 0x4D, 0x71, 0xA2, 0x71 + .byte 0xF7, 0x71, 0x4D, 0x72, 0xA2, 0x72, 0xF8, 0x72, 0x4E, 0x73, 0xA4, 0x73, 0xFA, 0x73, 0x50, 0x74 + .byte 0xA6, 0x74, 0xFC, 0x74, 0x52, 0x75, 0xA8, 0x75, 0xFF, 0x75, 0x55, 0x76, 0xAC, 0x76, 0x02, 0x77 + .byte 0x59, 0x77, 0xB0, 0x77, 0x07, 0x78, 0x5E, 0x78, 0xB4, 0x78, 0x0C, 0x79, 0x63, 0x79, 0xBA, 0x79 + .byte 0x11, 0x7A, 0x69, 0x7A, 0xC0, 0x7A, 0x18, 0x7B, 0x6F, 0x7B, 0xC7, 0x7B, 0x1F, 0x7C, 0x77, 0x7C + .byte 0xCF, 0x7C, 0x27, 0x7D, 0x7F, 0x7D, 0xD7, 0x7D, 0x2F, 0x7E, 0x88, 0x7E, 0xE0, 0x7E, 0x38, 0x7F + .byte 0x91, 0x7F, 0xEA, 0x7F, 0x42, 0x80, 0x9B, 0x80, 0xF4, 0x80, 0x4D, 0x81, 0xA6, 0x81, 0xFF, 0x81 + .byte 0x59, 0x82, 0xB2, 0x82, 0x0B, 0x83, 0x65, 0x83, 0xBE, 0x83, 0x18, 0x84, 0x72, 0x84, 0xCB, 0x84 + .byte 0x25, 0x85, 0x7F, 0x85, 0xD9, 0x85, 0x33, 0x86, 0x8E, 0x86, 0xE8, 0x86, 0x42, 0x87, 0x9D, 0x87 + .byte 0xF7, 0x87, 0x52, 0x88, 0xAC, 0x88, 0x07, 0x89, 0x62, 0x89, 0xBD, 0x89, 0x18, 0x8A, 0x73, 0x8A + .byte 0xCE, 0x8A, 0x2A, 0x8B, 0x85, 0x8B, 0xE0, 0x8B, 0x3C, 0x8C, 0x97, 0x8C, 0xF3, 0x8C, 0x4F, 0x8D + .byte 0xAB, 0x8D, 0x07, 0x8E, 0x63, 0x8E, 0xBF, 0x8E, 0x1B, 0x8F, 0x77, 0x8F, 0xD4, 0x8F, 0x30, 0x90 + .byte 0x8C, 0x90, 0xE9, 0x90, 0x46, 0x91, 0xA2, 0x91, 0xFF, 0x91, 0x5C, 0x92, 0xB9, 0x92, 0x16, 0x93 + .byte 0x73, 0x93, 0xD1, 0x93, 0x2E, 0x94, 0x8C, 0x94, 0xE9, 0x94, 0x47, 0x95, 0xA4, 0x95, 0x02, 0x96 + .byte 0x60, 0x96, 0xBE, 0x96, 0x1C, 0x97, 0x7A, 0x97, 0xD8, 0x97, 0x36, 0x98, 0x95, 0x98, 0xF3, 0x98 + .byte 0x52, 0x99, 0xB0, 0x99, 0x0F, 0x9A, 0x6E, 0x9A, 0xCD, 0x9A, 0x2C, 0x9B, 0x8B, 0x9B, 0xEA, 0x9B + .byte 0x49, 0x9C, 0xA8, 0x9C, 0x08, 0x9D, 0x67, 0x9D, 0xC7, 0x9D, 0x26, 0x9E, 0x86, 0x9E, 0xE6, 0x9E + .byte 0x46, 0x9F, 0xA6, 0x9F, 0x06, 0xA0, 0x66, 0xA0, 0xC6, 0xA0, 0x27, 0xA1, 0x87, 0xA1, 0xE8, 0xA1 + .byte 0x48, 0xA2, 0xA9, 0xA2, 0x0A, 0xA3, 0x6B, 0xA3, 0xCC, 0xA3, 0x2D, 0xA4, 0x8E, 0xA4, 0xEF, 0xA4 + .byte 0x50, 0xA5, 0xB2, 0xA5, 0x13, 0xA6, 0x75, 0xA6, 0xD6, 0xA6, 0x38, 0xA7, 0x9A, 0xA7, 0xFC, 0xA7 + .byte 0x5E, 0xA8, 0xC0, 0xA8, 0x22, 0xA9, 0x84, 0xA9, 0xE7, 0xA9, 0x49, 0xAA, 0xAC, 0xAA, 0x0E, 0xAB + .byte 0x71, 0xAB, 0xD4, 0xAB, 0x37, 0xAC, 0x9A, 0xAC, 0xFD, 0xAC, 0x60, 0xAD, 0xC3, 0xAD, 0x27, 0xAE + .byte 0x8A, 0xAE, 0xED, 0xAE, 0x51, 0xAF, 0xB5, 0xAF, 0x19, 0xB0, 0x7C, 0xB0, 0xE0, 0xB0, 0x45, 0xB1 + .byte 0xA9, 0xB1, 0x0D, 0xB2, 0x71, 0xB2, 0xD6, 0xB2, 0x3A, 0xB3, 0x9F, 0xB3, 0x03, 0xB4, 0x68, 0xB4 + .byte 0xCD, 0xB4, 0x32, 0xB5, 0x97, 0xB5, 0xFC, 0xB5, 0x62, 0xB6, 0xC7, 0xB6, 0x2C, 0xB7, 0x92, 0xB7 + .byte 0xF7, 0xB7, 0x5D, 0xB8, 0xC3, 0xB8, 0x29, 0xB9, 0x8F, 0xB9, 0xF5, 0xB9, 0x5B, 0xBA, 0xC1, 0xBA + .byte 0x28, 0xBB, 0x8E, 0xBB, 0xF5, 0xBB, 0x5B, 0xBC, 0xC2, 0xBC, 0x29, 0xBD, 0x90, 0xBD, 0xF7, 0xBD + .byte 0x5E, 0xBE, 0xC5, 0xBE, 0x2C, 0xBF, 0x94, 0xBF, 0xFB, 0xBF, 0x63, 0xC0, 0xCA, 0xC0, 0x32, 0xC1 + .byte 0x9A, 0xC1, 0x02, 0xC2, 0x6A, 0xC2, 0xD2, 0xC2, 0x3A, 0xC3, 0xA2, 0xC3, 0x0B, 0xC4, 0x73, 0xC4 + .byte 0xDC, 0xC4, 0x44, 0xC5, 0xAD, 0xC5, 0x16, 0xC6, 0x7F, 0xC6, 0xE8, 0xC6, 0x51, 0xC7, 0xBB, 0xC7 + .byte 0x24, 0xC8, 0x8D, 0xC8, 0xF7, 0xC8, 0x60, 0xC9, 0xCA, 0xC9, 0x34, 0xCA, 0x9E, 0xCA, 0x08, 0xCB + .byte 0x72, 0xCB, 0xDC, 0xCB, 0x47, 0xCC, 0xB1, 0xCC, 0x1B, 0xCD, 0x86, 0xCD, 0xF1, 0xCD, 0x5B, 0xCE + .byte 0xC6, 0xCE, 0x31, 0xCF, 0x9C, 0xCF, 0x08, 0xD0, 0x73, 0xD0, 0xDE, 0xD0, 0x4A, 0xD1, 0xB5, 0xD1 + .byte 0x21, 0xD2, 0x8D, 0xD2, 0xF8, 0xD2, 0x64, 0xD3, 0xD0, 0xD3, 0x3D, 0xD4, 0xA9, 0xD4, 0x15, 0xD5 + .byte 0x82, 0xD5, 0xEE, 0xD5, 0x5B, 0xD6, 0xC7, 0xD6, 0x34, 0xD7, 0xA1, 0xD7, 0x0E, 0xD8, 0x7B, 0xD8 + .byte 0xE9, 0xD8, 0x56, 0xD9, 0xC3, 0xD9, 0x31, 0xDA, 0x9E, 0xDA, 0x0C, 0xDB, 0x7A, 0xDB, 0xE8, 0xDB + .byte 0x56, 0xDC, 0xC4, 0xDC, 0x32, 0xDD, 0xA0, 0xDD, 0x0F, 0xDE, 0x7D, 0xDE, 0xEC, 0xDE, 0x5B, 0xDF + .byte 0xC9, 0xDF, 0x38, 0xE0, 0xA7, 0xE0, 0x16, 0xE1, 0x86, 0xE1, 0xF5, 0xE1, 0x64, 0xE2, 0xD4, 0xE2 + .byte 0x43, 0xE3, 0xB3, 0xE3, 0x23, 0xE4, 0x93, 0xE4, 0x03, 0xE5, 0x73, 0xE5, 0xE3, 0xE5, 0x54, 0xE6 + .byte 0xC4, 0xE6, 0x35, 0xE7, 0xA5, 0xE7, 0x16, 0xE8, 0x87, 0xE8, 0xF8, 0xE8, 0x69, 0xE9, 0xDA, 0xE9 + .byte 0x4B, 0xEA, 0xBC, 0xEA, 0x2E, 0xEB, 0x9F, 0xEB, 0x11, 0xEC, 0x83, 0xEC, 0xF5, 0xEC, 0x66, 0xED + .byte 0xD9, 0xED, 0x4B, 0xEE, 0xBD, 0xEE, 0x2F, 0xEF, 0xA2, 0xEF, 0x14, 0xF0, 0x87, 0xF0, 0xFA, 0xF0 + .byte 0x6D, 0xF1, 0xE0, 0xF1, 0x53, 0xF2, 0xC6, 0xF2, 0x39, 0xF3, 0xAD, 0xF3, 0x20, 0xF4, 0x94, 0xF4 + .byte 0x07, 0xF5, 0x7B, 0xF5, 0xEF, 0xF5, 0x63, 0xF6, 0xD7, 0xF6, 0x4C, 0xF7, 0xC0, 0xF7, 0x34, 0xF8 + .byte 0xA9, 0xF8, 0x1E, 0xF9, 0x92, 0xF9, 0x07, 0xFA, 0x7C, 0xFA, 0xF1, 0xFA, 0x66, 0xFB, 0xDC, 0xFB + .byte 0x51, 0xFC, 0xC7, 0xFC, 0x3C, 0xFD, 0xB2, 0xFD, 0x28, 0xFE, 0x9E, 0xFE, 0x14, 0xFF, 0x8A, 0xFF + +_0210DE50: + .byte 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 + .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 + .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03 + .byte 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 + .byte 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 + .byte 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 + .byte 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05 + .byte 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 + .byte 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08 + .byte 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09 + .byte 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B + .byte 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E + .byte 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10 + .byte 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14 + .byte 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18 + .byte 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C + .byte 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22 + .byte 0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29 + .byte 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31 + .byte 0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B + .byte 0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47 + .byte 0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55 + .byte 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67 + .byte 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B + .byte 0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25 + .byte 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D + .byte 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36 + .byte 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40 + .byte 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D + .byte 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D + .byte 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70 + .byte 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43 + .byte 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51 + .byte 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61 + .byte 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75 + .byte 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46 + .byte 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55 + .byte 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66 + .byte 0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A + .byte 0x7C, 0x7D, 0x7E, 0x7F + +_0210E124: + .word FSi_ReadFileCommand + .word FSi_WriteFileCommand + .word FSi_SeekDirCommand + .word FSi_ReadDirCommand + .word FSi_FindPathCommand + .word FSi_GetPathCommand + .word FSi_OpenFileFastCommand + .word FSi_OpenFileDirectCommand + .word FSi_CloseFileCommand + +_0210E148: + .word 0xDEC00621 + +_0210E14C: + .byte 0xBA, 0x98, 0xCE, 0x3F + .byte 0xA6, 0x92, 0xE3, 0x9D, 0x46, 0xF2, 0xED, 0x01, 0x76, 0xE3, 0xCC, 0x08, 0x56, 0x23, 0x63, 0xFA + .byte 0xCA, 0xD4, 0xEC, 0xDF, 0x9A, 0x62, 0x78, 0x34, 0x8F, 0x6D, 0x63, 0x3C, 0xFE, 0x22, 0xCA, 0x92 + .byte 0x20, 0x88, 0x97, 0x23, 0xD2, 0xCF, 0xAE, 0xC2, 0x32, 0x67, 0x8D, 0xFE, 0xCA, 0x83, 0x64, 0x98 + .byte 0xAC, 0xFD, 0x3E, 0x37, 0x87, 0x46, 0x58, 0x24 + +_0210E188: + .byte 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +_0210E1DC: + .byte 0x14, 0x00, 0x00, 0x00 + +_0210E1E0: + .word _0210E348 + .word _0210E284 + .word _0210E384 + +_0210E1EC: + .word _0210E304 + .word _0210E204 + .word _0210E3C8 + .word _0210E2C8 + +_0210E1FC: + .byte 0x0A, 0x00, 0x28, 0x00 + .byte 0x00, 0x00, 0x28, 0x00 + +_0210E204: + .word CTRDGi_WriteFlash4KBAT + .word CTRDGi_EraseFlashChipAT + .word CTRDGi_EraseFlash4KBAT + .word CTRDGi_WriteFlash4KBAsyncAT + .word CTRDGi_EraseFlashChipAsyncAT + .word CTRDGi_EraseFlash4KBAsyncAT + .word CTRDGi_PollingSR512kCOMMON + .word _0210E1FC + .byte 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3D, 0x00 + +_0210E244: + .word CTRDGi_WriteFlashSectorAT + .word CTRDGi_EraseFlashChipAT + .word CTRDGi_EraseFlashSectorAT + .word CTRDGi_WriteFlashSectorAsyncAT + .word CTRDGi_EraseFlashChipAsyncAT + .word CTRDGi_EraseFlashSectorAsyncAT + .word CTRDGi_PollingSR512kCOMMON + .word _0210E1FC + .byte 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3D, 0x00 + +_0210E27C: + .byte 0x0A, 0x00, 0x0A, 0x00 + .byte 0xD0, 0x07, 0x88, 0x13 + +_0210E284: + .word CTRDGi_WriteFlashSectorMX + .word CTRDGi_EraseFlashChipMX + .word CTRDGi_EraseFlashSectorMX + .word CTRDGi_WriteFlashSectorAsyncMX + .word CTRDGi_EraseFlashChipAsyncMX + .word CTRDGi_EraseFlashSectorAsyncMX + .word CTRDGi_PollingSR1MCOMMON + .word _0210E27C + .byte 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x20, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x00, 0x13, 0x00 + +_0210E2C0: + .byte 0x0A, 0x00, 0x0A, 0x00, 0x28, 0x00, 0xC8, 0x00 + +_0210E2C8: + .word CTRDGi_WriteFlashSectorLE + .word CTRDGi_EraseFlashChipLE + .word CTRDGi_EraseFlashSectorLE + .word CTRDGi_WriteFlashSectorAsyncLE + .word CTRDGi_EraseFlashChipAsyncLE + .word CTRDGi_EraseFlashSectorAsyncLE + .word CTRDGi_PollingSR512kCOMMON + .word _0210E2C0 + .byte 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00 + .byte 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + +_0210E304: + .word CTRDGi_WriteFlashSectorLE + .word CTRDGi_EraseFlashChipLE + .word CTRDGi_EraseFlashSectorLE + .word CTRDGi_WriteFlashSectorAsyncLE + .word CTRDGi_EraseFlashChipAsyncLE + .word CTRDGi_EraseFlashSectorAsyncLE + .word CTRDGi_PollingSR512kCOMMON + .word _0210E2C0 + .byte 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xBF, 0x00, 0xD4, 0x00 + +_0210E340: + .byte 0x0A, 0x00, 0x0A, 0x00, 0xD0, 0x07, 0xD0, 0x07 + +_0210E348: + .word CTRDGi_WriteFlashSectorMX + .word CTRDGi_EraseFlashChipMX + .word CTRDGi_EraseFlashSectorMX + .word CTRDGi_WriteFlashSectorAsyncMX + .word CTRDGi_EraseFlashChipAsyncMX + .word CTRDGi_EraseFlashSectorAsyncMX + .word CTRDGi_PollingSR1MCOMMON + .word _0210E340 + .byte 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00 + .byte 0x0C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0xC2, 0x00, 0x09, 0x00 + +_0210E384: + .word CTRDGi_WriteFlashSectorMX + .word CTRDGi_EraseFlashChipMX + .word CTRDGi_EraseFlashSectorMX + .word CTRDGi_WriteFlashSectorAsyncMX + .word CTRDGi_EraseFlashChipAsyncMX + .word CTRDGi_EraseFlashSectorAsyncMX + .word CTRDGi_PollingSR1MCOMMON + .word _0210E340 + .byte 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x20, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +_0210E3C0: + .byte 0x0A, 0x00, 0x0A, 0x00, 0xF4, 0x01, 0xF4, 0x01 + +_0210E3C8: + .word CTRDGi_WriteFlashSectorMX5 + .word CTRDGi_EraseFlashChipLE + .word CTRDGi_EraseFlashSectorLE + .word CTRDGi_WriteFlashSectorAsyncMX5 + .word CTRDGi_EraseFlashChipAsyncLE + .word CTRDGi_EraseFlashSectorAsyncLE + .word CTRDGi_PollingSR512kCOMMON + .word _0210E3C0 + .byte 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00 + .byte 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x32, 0x00, 0x1B, 0x00 + + .data + + .balign 4, 0 +_02110C98: + .asciz ":/" + .balign 4, 0 +_02110C9C: + .asciz "rom" + .balign 4, 0 +_02110CA0: + .word _0210E148 + .byte 0x40, 0x00, 0x00, 0x00 +_02110CA8: + .byte 0x80, 0x00, 0x00, 0x00 +_02110CAC: + .byte 0x01, 0x00, 0x00, 0x00 + .byte 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00 + .byte 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00 + .byte 0x0E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00 + .byte 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00 + .byte 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00 + .byte 0x0C, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 + .byte 0x0F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 + .byte 0x0B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00 +_02110D6C: + .byte 0x78, 0xA4, 0x6A, 0xD7 + .byte 0x56, 0xB7, 0xC7, 0xE8, 0xDB, 0x70, 0x20, 0x24, 0xEE, 0xCE, 0xBD, 0xC1, 0xAF, 0x0F, 0x7C, 0xF5 + .byte 0x2A, 0xC6, 0x87, 0x47, 0x13, 0x46, 0x30, 0xA8, 0x01, 0x95, 0x46, 0xFD, 0xD8, 0x98, 0x80, 0x69 + .byte 0xAF, 0xF7, 0x44, 0x8B, 0xB1, 0x5B, 0xFF, 0xFF, 0xBE, 0xD7, 0x5C, 0x89, 0x22, 0x11, 0x90, 0x6B + .byte 0x93, 0x71, 0x98, 0xFD, 0x8E, 0x43, 0x79, 0xA6, 0x21, 0x08, 0xB4, 0x49, 0x62, 0x25, 0x1E, 0xF6 + .byte 0x40, 0xB3, 0x40, 0xC0, 0x51, 0x5A, 0x5E, 0x26, 0xAA, 0xC7, 0xB6, 0xE9, 0x5D, 0x10, 0x2F, 0xD6 + .byte 0x53, 0x14, 0x44, 0x02, 0x81, 0xE6, 0xA1, 0xD8, 0xC8, 0xFB, 0xD3, 0xE7, 0xE6, 0xCD, 0xE1, 0x21 + .byte 0xD6, 0x07, 0x37, 0xC3, 0x87, 0x0D, 0xD5, 0xF4, 0xED, 0x14, 0x5A, 0x45, 0x05, 0xE9, 0xE3, 0xA9 + .byte 0xF8, 0xA3, 0xEF, 0xFC, 0xD9, 0x02, 0x6F, 0x67, 0x8A, 0x4C, 0x2A, 0x8D, 0x42, 0x39, 0xFA, 0xFF + .byte 0x81, 0xF6, 0x71, 0x87, 0x22, 0x61, 0x9D, 0x6D, 0x0C, 0x38, 0xE5, 0xFD, 0x44, 0xEA, 0xBE, 0xA4 + .byte 0xA9, 0xCF, 0xDE, 0x4B, 0x60, 0x4B, 0xBB, 0xF6, 0x70, 0xBC, 0xBF, 0xBE, 0xC6, 0x7E, 0x9B, 0x28 + .byte 0xFA, 0x27, 0xA1, 0xEA, 0x85, 0x30, 0xEF, 0xD4, 0x05, 0x1D, 0x88, 0x04, 0x39, 0xD0, 0xD4, 0xD9 + .byte 0xE5, 0x99, 0xDB, 0xE6, 0xF8, 0x7C, 0xA2, 0x1F, 0x65, 0x56, 0xAC, 0xC4, 0x44, 0x22, 0x29, 0xF4 + .byte 0x97, 0xFF, 0x2A, 0x43, 0xA7, 0x23, 0x94, 0xAB, 0x39, 0xA0, 0x93, 0xFC, 0xC3, 0x59, 0x5B, 0x65 + .byte 0x92, 0xCC, 0x0C, 0x8F, 0x7D, 0xF4, 0xEF, 0xFF, 0xD1, 0x5D, 0x84, 0x85, 0x4F, 0x7E, 0xA8, 0x6F + .byte 0xE0, 0xE6, 0x2C, 0xFE, 0x14, 0x43, 0x01, 0xA3, 0xA1, 0x11, 0x08, 0x4E, 0x82, 0x7E, 0x53, 0xF7 + .byte 0x35, 0xF2, 0x3A, 0xBD, 0xBB, 0xD2, 0xD7, 0x2A, 0x91, 0xD3, 0x86, 0xEB +_02110E6C: + .byte 0x61, 0x00, 0x00, 0x00 +_02110E70: + .word DGTi_hash2_arm4_small + .word _02110ED8 + .word _02110EF0 + .word _02110EA8 + .word _02110EC0 + .word _02110EA4 + .word _02110F08 + .word _02110E6C + .word _02110F44 + .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0F, 0x00 + .byte 0x0A, 0x00, 0x00, 0x00 + +_02110EA4: + .byte 0x61, 0x62, 0x63, 0x00 + +_02110EA8: + .byte 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4 + .byte 0xF6, 0x1E, 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F, 0x00, 0x00, 0x00, 0x00 + +_02110EC0: + .byte 0xDE, 0xA3, 0x56, 0xA2, 0xCD, 0xDD, 0x90, 0xC7, 0xA7, 0xEC, 0xED, 0xC5, 0xEB, 0xB5, 0x63, 0x93 + .byte 0x4F, 0x46, 0x04, 0x52, 0x00, 0x00, 0x00, 0x00 + +_02110ED8: + .byte 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A + .byte 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D, 0x00, 0x00, 0x00, 0x00 + +_02110EF0: + .byte 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5 + .byte 0xE5, 0x46, 0x70, 0xF1, 0x00, 0x00, 0x00, 0x00 + +_02110F08: + .byte 0x61, 0x62, 0x63, 0x64, 0x62, 0x63, 0x64, 0x65 + .byte 0x63, 0x64, 0x65, 0x66, 0x64, 0x65, 0x66, 0x67, 0x65, 0x66, 0x67, 0x68, 0x66, 0x67, 0x68, 0x69 + .byte 0x67, 0x68, 0x69, 0x6A, 0x68, 0x69, 0x6A, 0x6B, 0x69, 0x6A, 0x6B, 0x6C, 0x6A, 0x6B, 0x6C, 0x6D + .byte 0x6B, 0x6C, 0x6D, 0x6E, 0x6C, 0x6D, 0x6E, 0x6F, 0x6D, 0x6E, 0x6F, 0x70, 0x6E, 0x6F, 0x70, 0x71 + .byte 0x00, 0x00, 0x00, 0x00 + +_02110F44: + .byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33 + .byte 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33 + .byte 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33 + .byte 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33 + .byte 0x34, 0x35, 0x36, 0x37, 0x00, 0x00, 0x00, 0x00 + +_02110F88: + .word 0 + .word 31 + .word 59 + .word 90 + .word 120 + .word 151 + .word 181 + .word 212 + .word 243 + .word 273 + .word 304 + .word 334 +_02110FB8: + .word 0x027FFE00 +_02110FBC: + .byte 0xFD, 0xFF, 0x00, 0x00 +_02110FC0: + .byte 0x00, 0x00, 0x01, 0x00 +_02110FC4: + .byte 0x00, 0x00, 0x00, 0x00 +_02110FC8: + .byte 0x00, 0x00, 0x00, 0x00 diff --git a/lib/asm/nnsys.s b/lib/asm/nnsys.s new file mode 100644 index 00000000..6232e246 --- /dev/null +++ b/lib/asm/nnsys.s @@ -0,0 +1,31811 @@ + .include "asm/macros.inc" + .include "nnsys.inc" + .include "global.inc" + + .public sIsDispOn + .public GXi_DmaId + + .bss + + .public _021D84B0 +_021D84B0: + .space 0x4 + + .public _021D84B4 +_021D84B4: + .space 0xC + + .public _021D84C0 +_021D84C0: + .space 0x4 + + .public _021D84C4 +_021D84C4: + .space 0xC + + .public _021D84D0 +_021D84D0: + .space 0x14 + + .public _021D84E4 +_021D84E4: + .space 0x4 + + .public _021D84E8 +_021D84E8: + .space 0x4 + + .public _021D84EC +_021D84EC: + .space 0x14 + + .public _021D8500 +_021D8500: + .space 0x4 + + .public _021D8504 +_021D8504: + .space 0x10 + + .public _021D8514 +_021D8514: + .space 0x4 + + .public _021D8518 +_021D8518: + .space 0x100 + + .public _021D8618 +_021D8618: + .space 0x400 + + .public _021D8A18 +_021D8A18: + .space 0x40 + + .public _021D8A58 +_021D8A58: + .space 0x100 + + .public _021D8B58 +_021D8B58: + .space 0x400 + + .public _021D8F58 +_021D8F58: + .space 0x40 + + .public _021D8F98 +_021D8F98: + .space 0x100 + + .public _021D9098 +_021D9098: + .space 0x400 + + .public _021D9498 +_021D9498: + .space 0x40 + + .public _021D94D8 +_021D94D8: + .space 0x10 + + .public _021D94E8 +_021D94E8: + .space 0x80 + + .public _021D9568 +_021D9568: + .space 0x4 + + .public _021D956C +_021D956C: + .space 0xFC + + .public _021D9668 +_021D9668: + .space 0x10 + + .public _021D9678 +_021D9678: + .space 0x4 + + .public _021D967C +_021D967C: + .space 0x2EC + + .public _021D9968 +_021D9968: + .space 0x300 + + .public _021D9C68 +_021D9C68: + .space 0x370 + + .public _021D9FD8 +_021D9FD8: + .space 0x90 + + .public _021DA068 +_021DA068: + .space 0x4 + + .public _021DA06C +_021DA06C: + .space 0x404 + + .public _021DA470 +_021DA470: + .space 0xC + + .public _021DA47C +_021DA47C: + .space 0x1C + + .public _021DA498 +_021DA498: + .space 0x4 + + .public NNS_G3dGlb +NNS_G3dGlb: ; 0x021DA49C + .space 0x264 + + .public _021DA700 +_021DA700: + .space 0x4 + + .public _021DA704 +_021DA704: + .space 0xE00 + + .public _021DB504 +_021DB504: + .space 0x4 + + .public _021DB508 +_021DB508: + .space 0x4 + + .public _021DB50C +_021DB50C: + .space 0x4 + + .public _021DB510 +_021DB510: + .space 0x4 + + .public _021DB514 +_021DB514: + .space 0x4 + + .public _021DB518 +_021DB518: + .space 0x5EC + + .public _021DBB04 +_021DBB04: + .space 0x40 + + .public _021DBB44 +_021DBB44: + .space 0x18C0 + + .public _021DD404 +_021DD404: + .space 0x4 + + .public _021DD408 +_021DD408: + .space 0x18 + + .public _021DD420 +_021DD420: + .space 0x10 + + .public _021DD430 +_021DD430: + .space 0xC + + .public _021DD43C +_021DD43C: + .space 0x24 + + .public _021DD460 +_021DD460: + .space 0x23C0 + + .public _021DF820 +_021DF820: + .space 0xC + + .public _021DF82C +_021DF82C: + .space 0x140 + + .public _021DF96C +_021DF96C: + .space 0xC + + .public _021DF978 +_021DF978: + .space 0xC + + .public _021DF984 +_021DF984: + .space 0x440 + + .public _021DFDC4 +_021DFDC4: + .space 0x8 + + .public _021DFDCC +_021DFDCC: + .space 0x10 + + .public _021DFDDC +_021DFDDC: + .space 0x4 + + .public _021DFDE0 +_021DFDE0: + .space 0x4 + + .public _021DFDE4 +_021DFDE4: + .space 0x460 + + .public _021E0244 +_021E0244: + .space 0x4 + + .public _021E0248 +_021E0248: + .space 0xC + + .public _021E0254 +_021E0254: + .space 0x40 + + .public _021E0294 +_021E0294: + .space 0x80 + + .public _021E0314 +_021E0314: + .space 0x8 + + .public _021E031C +_021E031C: + .space 0x40 + + .public _021E035C +_021E035C: + .space 0x5B4 + + .public _021E0910 +_021E0910: + .space 0x4 + + .public _021E0914 +_021E0914: + .space 0x3C + + .public _021E0950 +_021E0950: + .space 0xC + + .public _021E095C +_021E095C: + .space 0x66C + + .public _021E0FC8 +_021E0FC8: + .space 0x18 + + .public _021E0FE0 +_021E0FE0: + .space 0xC + + .public _021E0FEC +_021E0FEC: + .space 0x5D0 + + .text + + arm_func_start NNS_FndInitList +NNS_FndInitList: ; 0x020B4B68 + mov r2, #0 + str r2, [r0] + str r2, [r0, #4] + strh r2, [r0, #8] + strh r1, [r0, #0xa] + bx lr + arm_func_end NNS_FndInitList + + arm_func_start SetFirstObject +SetFirstObject: ; 0x020B4B80 + ldrh r3, [r0, #0xa] + mov r2, #0 + add ip, r1, r3 + str r2, [ip, #4] + str r2, [r1, r3] + str r1, [r0] + str r1, [r0, #4] + ldrh r1, [r0, #8] + add r1, r1, #1 + strh r1, [r0, #8] + bx lr + arm_func_end SetFirstObject + + arm_func_start NNS_FndAppendListObject +NNS_FndAppendListObject: ; 0x020B4BAC + stmdb sp!, {r3, lr} + ldr r2, [r0] + cmp r2, #0 + bne _020B4BC4 + bl SetFirstObject + ldmia sp!, {r3, pc} +_020B4BC4: + ldrh ip, [r0, #0xa] + ldr r3, [r0, #4] + mov r2, #0 + str r3, [r1, ip] + add r3, r1, ip + str r2, [r3, #4] + ldrh r2, [r0, #0xa] + ldr r3, [r0, #4] + add r2, r3, r2 + str r1, [r2, #4] + str r1, [r0, #4] + ldrh r1, [r0, #8] + add r1, r1, #1 + strh r1, [r0, #8] + ldmia sp!, {r3, pc} + arm_func_end NNS_FndAppendListObject + + arm_func_start NNS_FndPrependListObject +NNS_FndPrependListObject: ; 0x020B4C00 + stmdb sp!, {r3, lr} + ldr r2, [r0] + cmp r2, #0 + bne _020B4C18 + bl SetFirstObject + ldmia sp!, {r3, pc} +_020B4C18: + ldrh r3, [r0, #0xa] + mov r2, #0 + str r2, [r1, r3] + ldr r2, [r0] + add r3, r1, r3 + str r2, [r3, #4] + ldrh r2, [r0, #0xa] + ldr r3, [r0] + str r1, [r3, r2] + str r1, [r0] + ldrh r1, [r0, #8] + add r1, r1, #1 + strh r1, [r0, #8] + ldmia sp!, {r3, pc} + arm_func_end NNS_FndPrependListObject + + arm_func_start NNS_FndInsertListObject +NNS_FndInsertListObject: ; 0x020B4C50 + stmdb sp!, {r3, lr} + cmp r1, #0 + bne _020B4C68 + mov r1, r2 + bl NNS_FndAppendListObject + ldmia sp!, {r3, pc} +_020B4C68: + ldr r3, [r0] + cmp r1, r3 + bne _020B4C80 + mov r1, r2 + bl NNS_FndPrependListObject + ldmia sp!, {r3, pc} +_020B4C80: + ldrh lr, [r0, #0xa] + ldr r3, [r1, lr] + add ip, r2, lr + str r3, [r2, lr] + str r1, [ip, #4] + add r3, r3, lr + str r2, [r3, #4] + ldrh r3, [r0, #0xa] + str r2, [r1, r3] + ldrh r1, [r0, #8] + add r1, r1, #1 + strh r1, [r0, #8] + ldmia sp!, {r3, pc} + arm_func_end NNS_FndInsertListObject + + arm_func_start NNS_FndRemoveListObject +NNS_FndRemoveListObject: ; 0x020B4CB4 + stmdb sp!, {r3, lr} + ldrh ip, [r0, #0xa] + ldr r3, [r1, ip] + add lr, r1, ip + cmp r3, #0 + ldreq r1, [lr, #4] + streq r1, [r0] + ldrne r2, [lr, #4] + addne r1, r3, ip + strne r2, [r1, #4] + ldr r3, [lr, #4] + cmp r3, #0 + ldreq r1, [lr] + streq r1, [r0, #4] + ldrneh r1, [r0, #0xa] + ldrne r2, [lr] + strne r2, [r3, r1] + mov r1, #0 + str r1, [lr] + str r1, [lr, #4] + ldrh r1, [r0, #8] + sub r1, r1, #1 + strh r1, [r0, #8] + ldmia sp!, {r3, pc} + arm_func_end NNS_FndRemoveListObject + + arm_func_start NNS_FndGetNextListObject +NNS_FndGetNextListObject: ; 0x020B4D14 + cmp r1, #0 + ldreq r0, [r0] + ldrneh r0, [r0, #0xa] + addne r0, r1, r0 + ldrne r0, [r0, #4] + bx lr + arm_func_end NNS_FndGetNextListObject + + arm_func_start NNS_FndGetPrevListObject +NNS_FndGetPrevListObject: ; 0x020B4D2C + cmp r1, #0 + ldreq r0, [r0, #4] + ldrneh r0, [r0, #0xa] + ldrne r0, [r1, r0] + bx lr + arm_func_end NNS_FndGetPrevListObject + + arm_func_start FindContainHeap +FindContainHeap: ; 0x020B4D40 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r1, #0 + mov r6, r0 + bl NNS_FndGetNextListObject + movs r4, r0 + beq _020B4DA0 +_020B4D5C: + ldr r0, [r4, #0x18] + cmp r0, r5 + bhi _020B4D8C + ldr r0, [r4, #0x1c] + cmp r5, r0 + bhs _020B4D8C + mov r1, r5 + add r0, r4, #0xc + bl FindContainHeap + cmp r0, #0 + moveq r0, r4 + ldmia sp!, {r4, r5, r6, pc} +_020B4D8C: + mov r0, r6 + mov r1, r4 + bl NNS_FndGetNextListObject + movs r4, r0 + bne _020B4D5C +_020B4DA0: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end FindContainHeap + + arm_func_start FindListContainHeap +FindListContainHeap: ; 0x020B4DA8 + stmdb sp!, {r4, lr} + ldr r4, _020B4DCC ; =_021D84B4 + mov r1, r0 + mov r0, r4 + bl FindContainHeap + cmp r0, #0 + addne r4, r0, #0xc + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4DCC: .word _021D84B4 + arm_func_end FindListContainHeap + + arm_func_start NNSi_FndInitHeapHead +NNSi_FndInitHeapHead: ; 0x020B4DD0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [sp, #8] + str r1, [r4] + mov ip, #0 + str r2, [r4, #0x18] + bic r1, ip, #0xff + and r0, r0, #0xff + orr r2, r1, r0 + str r3, [r4, #0x1c] + add r0, r4, #0xc + mov r1, #4 + str r2, [r4, #0x20] + bl NNS_FndInitList + ldr r0, _020B4E44 ; =_021D84B0 + ldr r0, [r0] + cmp r0, #0 + bne _020B4E30 + ldr r0, _020B4E48 ; =_021D84B4 + mov r1, #4 + bl NNS_FndInitList + ldr r0, _020B4E44 ; =_021D84B0 + mov r1, #1 + str r1, [r0] +_020B4E30: + mov r0, r4 + bl FindListContainHeap + mov r1, r4 + bl NNS_FndAppendListObject + ldmia sp!, {r4, pc} + .align 2, 0 +_020B4E44: .word _021D84B0 +_020B4E48: .word _021D84B4 + arm_func_end NNSi_FndInitHeapHead + + arm_func_start NNSi_FndFinalizeHeap +NNSi_FndFinalizeHeap: ; 0x020B4E4C + stmdb sp!, {r4, lr} + mov r4, r0 + bl FindListContainHeap + mov r1, r4 + bl NNS_FndRemoveListObject + ldmia sp!, {r4, pc} + arm_func_end NNSi_FndFinalizeHeap + + arm_func_start GetRegionOfMBlock +GetRegionOfMBlock: ; 0x020B4E64 + ldrh r2, [r1, #2] + add r3, r1, #0x10 + mov r2, r2, asr #8 + and r2, r2, #0x7f + mov r2, r2, lsl #0x10 + sub r2, r1, r2, lsr #16 + str r2, [r0] + ldr r1, [r1, #4] + add r1, r1, r3 + str r1, [r0, #4] + bx lr + arm_func_end GetRegionOfMBlock + + arm_func_start RemoveMBlock +RemoveMBlock: ; 0x020B4E90 + ldr r2, [r1, #8] + ldr r1, [r1, #0xc] + cmp r2, #0 + strne r1, [r2, #0xc] + streq r1, [r0] + cmp r1, #0 + strne r2, [r1, #8] + streq r2, [r0, #4] + mov r0, r2 + bx lr + arm_func_end RemoveMBlock + + arm_func_start InsertMBlock +InsertMBlock: ; 0x020B4EB8 + str r2, [r1, #8] + cmp r2, #0 + ldrne r3, [r2, #0xc] + strne r1, [r2, #0xc] + ldreq r3, [r0] + streq r1, [r0] + str r3, [r1, #0xc] + cmp r3, #0 + strne r1, [r3, #8] + streq r1, [r0, #4] + mov r0, r1 + bx lr + arm_func_end InsertMBlock + + arm_func_start InitMBlock +InitMBlock: ; 0x020B4EE8 + ldr r3, [r0] + mov r2, #0 + strh r1, [r3] + strh r2, [r3, #2] + ldr r1, [r0, #4] + add r0, r3, #0x10 + sub r0, r1, r0 + stmib r3, {r0, r2} + mov r0, r3 + str r2, [r3, #0xc] + bx lr + arm_func_end InitMBlock + + arm_func_start InitExpHeap +InitExpHeap: ; 0x020B4F14 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r3, r1 + mov r4, r0 + str r2, [sp] + ldr r1, _020B4F80 ; =0x45585048 + add r2, r4, #0x38 + bl NNSi_FndInitHeapHead + mov r0, #0 + strh r0, [r4, #0x34] + bic r0, r0, #1 + strh r0, [r4, #0x36] + ldr r1, [r4, #0x18] + add r0, sp, #4 + str r1, [sp, #4] + ldr r2, [r4, #0x1c] + ldr r1, _020B4F84 ; =0x00004652 + str r2, [sp, #8] + bl InitMBlock + str r0, [r4, #0x24] + str r0, [r4, #0x28] + mov r1, #0 + str r1, [r4, #0x2c] + mov r0, r4 + str r1, [r4, #0x30] + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020B4F80: .word 0x45585048 +_020B4F84: .word 0x00004652 + arm_func_end InitExpHeap + + arm_func_start AllocUsedBlockFromFreeBlock +AllocUsedBlockFromFreeBlock: ; 0x020B4F88 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x18 + mov r7, r0 + add r0, sp, #0x10 + mov r8, r1 + mov r6, r2 + mov r4, r3 + bl GetRegionOfMBlock + ldr r3, [sp, #0x14] + sub r5, r6, #0x10 + add r2, r4, r6 + mov r0, r7 + mov r1, r8 + str r5, [sp, #0x14] + str r3, [sp, #0xc] + str r2, [sp, #8] + bl RemoveMBlock + ldr r2, [sp, #0x10] + ldr r1, [sp, #0x14] + mov r4, r0 + sub r0, r1, r2 + cmp r0, #0x14 + strlo r2, [sp, #0x14] + blo _020B5008 + ldr r1, _020B5100 ; =0x00004652 + add r0, sp, #0x10 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r4 + bl InsertMBlock + mov r4, r0 +_020B5008: + ldr r1, [sp, #0xc] + ldr r0, [sp, #8] + sub r0, r1, r0 + cmp r0, #0x14 + strlo r1, [sp, #8] + blo _020B503C + ldr r1, _020B5100 ; =0x00004652 + add r0, sp, #8 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r4 + bl InsertMBlock +_020B503C: + ldr r0, [r7, #-4] + ldr r1, [sp, #0x14] + ldr r2, [sp, #8] + and r0, r0, #0xff + tst r0, #1 + sub r2, r2, r1 + beq _020B5060 + mov r0, #0 + bl MIi_CpuClear32 +_020B5060: + ldr r2, [sp, #8] + ldr r1, _020B5104 ; =0x00005544 + add r0, sp, #0 + str r5, [sp] + str r2, [sp, #4] + bl InitMBlock + mov r1, r0 + ldrh r3, [r1, #2] + ldrh r2, [sp, #0x30] + add r0, r7, #8 + bic r3, r3, #0x8000 + strh r3, [r1, #2] + ldrh r3, [r1, #2] + mov r2, r2, lsl #0x1f + orr r2, r3, r2, lsr #16 + strh r2, [r1, #2] + ldrh r2, [r1, #2] + ldr r3, [sp, #0x14] + bic r2, r2, #0x7f00 + strh r2, [r1, #2] + sub r2, r1, r3 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + ldrh r3, [r1, #2] + mov r2, r2, lsl #0x19 + orr r2, r3, r2, lsr #17 + strh r2, [r1, #2] + ldrh r2, [r1, #2] + ldrh r3, [r7, #0x10] + bic r2, r2, #0xff + strh r2, [r1, #2] + ldrh r2, [r1, #2] + and r3, r3, #0xff + orr r2, r2, r3 + strh r2, [r1, #2] + ldr r2, [r7, #0xc] + bl InsertMBlock + mov r0, r6 + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020B5100: .word 0x00004652 +_020B5104: .word 0x00005544 + arm_func_end AllocUsedBlockFromFreeBlock + + arm_func_start AllocFromHead__ExpHeap +AllocFromHead__ExpHeap: ; 0x020B5108 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldrh r4, [r0, #0x36] + mov r3, r1 + ldr ip, [r0, #0x24] + and r1, r4, #1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + mov r1, #0 + moveq r6, #1 + movne r6, #0 + mov r4, r1 + cmp ip, #0 + sub lr, r1, #1 + beq _020B5198 + sub r2, r2, #1 + mvn r5, r2 +_020B5148: + add r8, ip, #0x10 + add r7, r2, r8 + and sb, r5, r7 + sub r7, sb, r8 + ldr r8, [ip, #4] + add r7, r3, r7 + cmp r8, r7 + blo _020B518C + cmp lr, r8 + bls _020B518C + mov r1, ip + mov lr, r8 + mov r4, sb + cmp r6, #0 + bne _020B5198 + cmp r8, r3 + beq _020B5198 +_020B518C: + ldr ip, [ip, #0xc] + cmp ip, #0 + bne _020B5148 +_020B5198: + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r5, #0 + mov r2, r4 + add r0, r0, #0x24 + str r5, [sp] + bl AllocUsedBlockFromFreeBlock + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end AllocFromHead__ExpHeap + + arm_func_start AllocFromTail__ExpHeap +AllocFromTail__ExpHeap: ; 0x020B51BC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldrh r4, [r0, #0x36] + mov r3, r1 + ldr ip, [r0, #0x28] + and r1, r4, #1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + mov r1, #0 + moveq r5, #1 + movne r5, #0 + mov r4, r1 + cmp ip, #0 + sub lr, r1, #1 + beq _020B5248 + sub r2, r2, #1 + mvn r2, r2 +_020B51FC: + ldr r8, [ip, #4] + add sb, ip, #0x10 + add r6, r8, sb + sub r6, r6, r3 + and r7, r2, r6 + subs r6, r7, sb + bmi _020B523C + cmp lr, r8 + bls _020B523C + mov r1, ip + mov lr, r8 + mov r4, r7 + cmp r5, #0 + bne _020B5248 + cmp r8, r3 + beq _020B5248 +_020B523C: + ldr ip, [ip, #8] + cmp ip, #0 + bne _020B51FC +_020B5248: + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r5, #1 + mov r2, r4 + add r0, r0, #0x24 + str r5, [sp] + bl AllocUsedBlockFromFreeBlock + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end AllocFromTail__ExpHeap + + arm_func_start RecycleRegion +RecycleRegion: ; 0x020B526C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r1 + ldr r2, [r5] + ldr r1, [r5, #4] + mov r6, r0 + str r2, [sp] + str r1, [sp, #4] + ldr r1, [r6] + mov r4, #0 + cmp r1, #0 + beq _020B52E0 + ldr r0, [r5] +_020B52A0: + cmp r1, r0 + movlo r4, r1 + blo _020B52D4 + ldr r0, [r5, #4] + cmp r1, r0 + bne _020B52E0 + ldr r2, [r1, #4] + add r0, r1, #0x10 + add r2, r2, r0 + mov r0, r6 + str r2, [sp, #4] + bl RemoveMBlock + b _020B52E0 +_020B52D4: + ldr r1, [r1, #0xc] + cmp r1, #0 + bne _020B52A0 +_020B52E0: + cmp r4, #0 + beq _020B5314 + ldr r2, [r4, #4] + add r1, r4, #0x10 + ldr r0, [r5] + add r1, r2, r1 + cmp r1, r0 + bne _020B5314 + mov r0, r6 + mov r1, r4 + str r4, [sp] + bl RemoveMBlock + mov r4, r0 +_020B5314: + ldr r1, [sp, #4] + ldr r0, [sp] + sub r0, r1, r0 + cmp r0, #0x10 + addlo sp, sp, #8 + movlo r0, #0 + ldmloia sp!, {r4, r5, r6, pc} + ldr r1, _020B5358 ; =0x00004652 + add r0, sp, #0 + bl InitMBlock + mov r1, r0 + mov r0, r6 + mov r2, r4 + bl InsertMBlock + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B5358: .word 0x00004652 + arm_func_end RecycleRegion + + arm_func_start NNS_FndCreateExpHeapEx +NNS_FndCreateExpHeapEx: ; 0x020B535C + stmdb sp!, {r3, lr} + add r1, r1, r0 + add r0, r0, #3 + bic r1, r1, #3 + bic r0, r0, #3 + cmp r0, r1 + bhi _020B5384 + sub r3, r1, r0 + cmp r3, #0x4c + bhs _020B538C +_020B5384: + mov r0, #0 + ldmia sp!, {r3, pc} +_020B538C: + bl InitExpHeap + ldmia sp!, {r3, pc} + arm_func_end NNS_FndCreateExpHeapEx + + arm_func_start NNS_FndDestroyExpHeap +NNS_FndDestroyExpHeap: ; 0x020B5394 + ldr ip, _020B539C ; =NNSi_FndFinalizeHeap + bx ip + .align 2, 0 +_020B539C: .word NNSi_FndFinalizeHeap + arm_func_end NNS_FndDestroyExpHeap + + arm_func_start NNS_FndAllocFromExpHeapEx +NNS_FndAllocFromExpHeapEx: ; 0x020B53A0 + stmdb sp!, {r3, lr} + cmp r1, #0 + moveq r1, #1 + add r1, r1, #3 + cmp r2, #0 + bic r1, r1, #3 + blt _020B53C4 + bl AllocFromHead__ExpHeap + ldmia sp!, {r3, pc} +_020B53C4: + rsb r2, r2, #0 + bl AllocFromTail__ExpHeap + ldmia sp!, {r3, pc} + arm_func_end NNS_FndAllocFromExpHeapEx + + arm_func_start NNS_FndResizeForMBlockExpHeap +NNS_FndResizeForMBlockExpHeap: ; 0x020B53D0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + mov r4, r1 + mov sb, r2 + sub r8, r4, #0x10 + add r1, sb, #3 + ldr r7, [r8, #4] + bic sb, r1, #3 + cmp sb, r7 + mov r5, r0 + addeq sp, sp, #0x10 + moveq r0, sb + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + bls _020B54F0 + ldr r6, [r5, #0x24] + add r0, r8, #0x10 + cmp r6, #0 + add r0, r7, r0 + beq _020B542C +_020B541C: + cmp r6, r0 + ldrne r6, [r6, #0xc] + cmpne r6, #0 + bne _020B541C +_020B542C: + cmp r6, #0 + beq _020B5448 + ldr r0, [r6, #4] + add r1, r7, #0x10 + add r0, r1, r0 + cmp sb, r0 + bls _020B5454 +_020B5448: + add sp, sp, #0x10 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B5454: + add r0, sp, #8 + mov r1, r6 + bl GetRegionOfMBlock + mov r1, r6 + add r0, r5, #0x24 + bl RemoveMBlock + ldr r2, [sp, #0xc] + add r3, sb, r4 + ldr r6, [sp, #8] + sub r1, r2, r3 + str r3, [sp, #8] + cmp r1, #0x10 + strlo r2, [sp, #8] + mov r7, r0 + ldr r0, [sp, #8] + sub r0, r0, r4 + str r0, [r8, #4] + ldr r1, [sp, #0xc] + ldr r0, [sp, #8] + sub r0, r1, r0 + cmp r0, #0x10 + blo _020B54C8 + ldr r1, _020B552C ; =0x00004652 + add r0, sp, #8 + bl InitMBlock + mov r1, r0 + mov r2, r7 + add r0, r5, #0x24 + bl InsertMBlock +_020B54C8: + ldr r0, [r5, #0x20] + ldr r1, [sp, #8] + and r0, r0, #0xff + tst r0, #1 + sub r2, r1, r6 + beq _020B5520 + mov r1, r6 + mov r0, #0 + bl MIi_CpuClear32 + b _020B5520 +_020B54F0: + add r0, sb, r4 + str r0, [sp] + ldr r1, [r8, #4] + add r0, r8, #0x10 + add r0, r1, r0 + str r0, [sp, #4] + add r1, sp, #0 + add r0, r5, #0x24 + str sb, [r8, #4] + bl RecycleRegion + cmp r0, #0 + streq r7, [r8, #4] +_020B5520: + ldr r0, [r8, #4] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B552C: .word 0x00004652 + arm_func_end NNS_FndResizeForMBlockExpHeap + + arm_func_start NNS_FndFreeToExpHeap +NNS_FndFreeToExpHeap: ; 0x020B5530 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + sub r4, r1, #0x10 + mov r5, r0 + add r0, sp, #0 + mov r1, r4 + bl GetRegionOfMBlock + mov r1, r4 + add r0, r5, #0x2c + bl RemoveMBlock + add r1, sp, #0 + add r0, r5, #0x24 + bl RecycleRegion + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_FndFreeToExpHeap + + arm_func_start NNS_FndGetTotalFreeSizeForExpHeap +NNS_FndGetTotalFreeSizeForExpHeap: ; 0x020B556C + ldr r2, [r0, #0x24] + mov r0, #0 + cmp r2, #0 + bxeq lr +_020B557C: + ldr r1, [r2, #4] + ldr r2, [r2, #0xc] + add r0, r0, r1 + cmp r2, #0 + bne _020B557C + bx lr + arm_func_end NNS_FndGetTotalFreeSizeForExpHeap + + arm_func_start NNS_FndSetGroupIDForExpHeap +NNS_FndSetGroupIDForExpHeap: ; 0x020B5594 + ldrh r2, [r0, #0x34] + strh r1, [r0, #0x34] + mov r0, r2 + bx lr + arm_func_end NNS_FndSetGroupIDForExpHeap + + arm_func_start NNS_FndGetSizeForMBlockExpHeap +NNS_FndGetSizeForMBlockExpHeap: ; 0x020B55A4 + ldr r0, [r0, #-0xc] + bx lr + arm_func_end NNS_FndGetSizeForMBlockExpHeap + + arm_func_start NNS_FndGetGroupIDForMBlockExpHeap +NNS_FndGetGroupIDForMBlockExpHeap: ; 0x020B55AC + ldrh r0, [r0, #-0xe] + and r0, r0, #0xff + bx lr + arm_func_end NNS_FndGetGroupIDForMBlockExpHeap + + arm_func_start InitFrameHeap +InitFrameHeap: ; 0x020B55B8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r3, r1 + mov r4, r0 + str r2, [sp] + ldr r1, _020B55FC ; =0x46524D48 + add r2, r4, #0x30 + bl NNSi_FndInitHeapHead + ldr r0, [r4, #0x18] + mov r1, #0 + str r0, [r4, #0x24] + ldr r2, [r4, #0x1c] + mov r0, r4 + str r2, [r4, #0x28] + str r1, [r4, #0x2c] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020B55FC: .word 0x46524D48 + arm_func_end InitFrameHeap + + arm_func_start AllocFromHead__FrameHeap +AllocFromHead__FrameHeap: ; 0x020B5600 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldr r3, [r4] + sub r0, r2, #1 + mvn r2, r0 + add r0, r0, r3 + and r5, r2, r0 + ldr r0, [r4, #4] + add r6, r1, r5 + cmp r6, r0 + movhi r0, #0 + ldmhiia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #-4] + sub r2, r6, r3 + and r0, r0, #0xff + tst r0, #1 + beq _020B5650 + mov r1, r3 + mov r0, #0 + bl MIi_CpuClear32 +_020B5650: + mov r0, r5 + str r6, [r4] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end AllocFromHead__FrameHeap + + arm_func_start AllocFromTail__FrameHeap +AllocFromTail__FrameHeap: ; 0x020B565C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r3, [r4, #4] + sub r0, r2, #1 + mvn r2, r0 + sub r1, r3, r1 + ldr r0, [r4] + and r5, r2, r1 + cmp r5, r0 + movlo r0, #0 + ldmloia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #-4] + sub r2, r3, r5 + and r0, r0, #0xff + tst r0, #1 + beq _020B56A8 + mov r1, r5 + mov r0, #0 + bl MIi_CpuClear32 +_020B56A8: + mov r0, r5 + str r5, [r4, #4] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end AllocFromTail__FrameHeap + + arm_func_start FreeHead__FrameHeap +FreeHead__FrameHeap: ; 0x020B56B4 + ldr r2, [r0, #0x18] + mov r1, #0 + str r2, [r0, #0x24] + str r1, [r0, #0x2c] + bx lr + arm_func_end FreeHead__FrameHeap + + arm_func_start FreeTail__FrameHeap +FreeTail__FrameHeap: ; 0x020B56C8 + ldr r2, [r0, #0x2c] + cmp r2, #0 + beq _020B56E8 +_020B56D4: + ldr r1, [r0, #0x1c] + str r1, [r2, #8] + ldr r2, [r2, #0xc] + cmp r2, #0 + bne _020B56D4 +_020B56E8: + ldr r1, [r0, #0x1c] + str r1, [r0, #0x28] + bx lr + arm_func_end FreeTail__FrameHeap + + arm_func_start NNS_FndCreateFrmHeapEx +NNS_FndCreateFrmHeapEx: ; 0x020B56F4 + stmdb sp!, {r3, lr} + add r1, r1, r0 + add r0, r0, #3 + bic r1, r1, #3 + bic r0, r0, #3 + cmp r0, r1 + bhi _020B571C + sub r3, r1, r0 + cmp r3, #0x30 + bhs _020B5724 +_020B571C: + mov r0, #0 + ldmia sp!, {r3, pc} +_020B5724: + bl InitFrameHeap + ldmia sp!, {r3, pc} + arm_func_end NNS_FndCreateFrmHeapEx + + arm_func_start NNS_FndDestroyFrmHeap +NNS_FndDestroyFrmHeap: ; 0x020B572C + ldr ip, _020B5734 ; =NNSi_FndFinalizeHeap + bx ip + .align 2, 0 +_020B5734: .word NNSi_FndFinalizeHeap + arm_func_end NNS_FndDestroyFrmHeap + + arm_func_start NNS_FndAllocFromFrmHeapEx +NNS_FndAllocFromFrmHeapEx: ; 0x020B5738 + stmdb sp!, {r3, lr} + cmp r1, #0 + moveq r1, #1 + add r1, r1, #3 + cmp r2, #0 + bic r1, r1, #3 + add r0, r0, #0x24 + blt _020B5760 + bl AllocFromHead__FrameHeap + ldmia sp!, {r3, pc} +_020B5760: + rsb r2, r2, #0 + bl AllocFromTail__FrameHeap + ldmia sp!, {r3, pc} + arm_func_end NNS_FndAllocFromFrmHeapEx + + arm_func_start NNS_FndFreeToFrmHeap +NNS_FndFreeToFrmHeap: ; 0x020B576C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + tst r4, #1 + beq _020B5784 + bl FreeHead__FrameHeap +_020B5784: + tst r4, #2 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl FreeTail__FrameHeap + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_FndFreeToFrmHeap + + arm_func_start NNS_FndGetAllocatableSizeForFrmHeapEx +NNS_FndGetAllocatableSizeForFrmHeapEx: ; 0x020B5798 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + bl abs + sub r1, r0, #1 + ldr r0, [r4, #0x24] + mvn r2, r1 + add r0, r1, r0 + ldr r1, [r4, #0x28] + and r0, r2, r0 + cmp r0, r1 + movhi r0, #0 + subls r0, r1, r0 + ldmia sp!, {r4, pc} + arm_func_end NNS_FndGetAllocatableSizeForFrmHeapEx + + arm_func_start NNS_FndRecordStateForFrmHeap +NNS_FndRecordStateForFrmHeap: ; 0x020B57D0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6, #0x24] + mov r5, r1 + add r0, r6, #0x24 + mov r1, #0x10 + mov r2, #4 + bl AllocFromHead__FrameHeap + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + str r5, [r0] + str r4, [r0, #4] + ldr r1, [r6, #0x28] + str r1, [r0, #8] + ldr r1, [r6, #0x2c] + str r1, [r0, #0xc] + str r0, [r6, #0x2c] + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_FndRecordStateForFrmHeap + + arm_func_start NNS_FndFreeByStateToFrmHeap +NNS_FndFreeByStateToFrmHeap: ; 0x020B5820 + ldr r3, [r0, #0x2c] + cmp r1, #0 + cmpne r3, #0 + beq _020B5844 +_020B5830: + ldr r2, [r3] + cmp r2, r1 + ldrne r3, [r3, #0xc] + cmpne r3, #0 + bne _020B5830 +_020B5844: + cmp r3, #0 + moveq r0, #0 + bxeq lr + ldr r1, [r3, #4] + str r1, [r0, #0x24] + ldr r1, [r3, #8] + str r1, [r0, #0x28] + ldr r1, [r3, #0xc] + str r1, [r0, #0x2c] + mov r0, #1 + bx lr + arm_func_end NNS_FndFreeByStateToFrmHeap + + arm_func_start PopMBlock__UnitHeap +PopMBlock__UnitHeap: ; 0x020B5870 + ldr r2, [r0] + cmp r2, #0 + ldrne r1, [r2] + strne r1, [r0] + mov r0, r2 + bx lr + arm_func_end PopMBlock__UnitHeap + + arm_func_start NNS_FndAllocFromUnitHeap +NNS_FndAllocFromUnitHeap: ; 0x020B5888 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + add r0, r5, #0x24 + bl PopMBlock__UnitHeap + movs r4, r0 + beq _020B58C0 + ldr r0, [r5, #0x20] + ldr r2, [r5, #0x28] + and r0, r0, #0xff + tst r0, #1 + beq _020B58C0 + mov r1, r4 + mov r0, #0 + bl MIi_CpuClear32 +_020B58C0: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_FndAllocFromUnitHeap + + arm_func_start NNS_FndFreeToUnitHeap +NNS_FndFreeToUnitHeap: ; 0x020B58C8 + ldr r2, [r0, #0x24] + str r2, [r1] + str r1, [r0, #0x24] + bx lr + arm_func_end NNS_FndFreeToUnitHeap + + arm_func_start AllocatorAllocForExpHeap +AllocatorAllocForExpHeap: ; 0x020B58D8 + ldr ip, _020B58E8 ; =NNS_FndAllocFromExpHeapEx + mov r2, r0 + ldmib r2, {r0, r2} + bx ip + .align 2, 0 +_020B58E8: .word NNS_FndAllocFromExpHeapEx + arm_func_end AllocatorAllocForExpHeap + + arm_func_start AllocatorFreeForExpHeap +AllocatorFreeForExpHeap: ; 0x020B58EC + ldr ip, _020B58F8 ; =NNS_FndFreeToExpHeap + ldr r0, [r0, #4] + bx ip + .align 2, 0 +_020B58F8: .word NNS_FndFreeToExpHeap + arm_func_end AllocatorFreeForExpHeap + + arm_func_start AllocatorAllocForFrmHeap +AllocatorAllocForFrmHeap: ; 0x020B58FC + ldr ip, _020B590C ; =NNS_FndAllocFromFrmHeapEx + mov r2, r0 + ldmib r2, {r0, r2} + bx ip + .align 2, 0 +_020B590C: .word NNS_FndAllocFromFrmHeapEx + arm_func_end AllocatorAllocForFrmHeap + + arm_func_start AllocatorFreeForFrmHeap +AllocatorFreeForFrmHeap: ; 0x020B5910 + bx lr + arm_func_end AllocatorFreeForFrmHeap + + arm_func_start AllocatorAllocForUnitHeap +AllocatorAllocForUnitHeap: ; 0x020B5914 + stmdb sp!, {r3, lr} + ldr r0, [r0, #4] + ldr r2, [r0, #0x28] + cmp r1, r2 + movhi r0, #0 + ldmhiia sp!, {r3, pc} + bl NNS_FndAllocFromUnitHeap + ldmia sp!, {r3, pc} + arm_func_end AllocatorAllocForUnitHeap + + arm_func_start AllocatorFreeForUnitHeap +AllocatorFreeForUnitHeap: ; 0x020B5934 + ldr ip, _020B5940 ; =NNS_FndFreeToUnitHeap + ldr r0, [r0, #4] + bx ip + .align 2, 0 +_020B5940: .word NNS_FndFreeToUnitHeap + arm_func_end AllocatorFreeForUnitHeap + + arm_func_start AllocatorAllocForSDKHeap +AllocatorAllocForSDKHeap: ; 0x020B5944 + ldr ip, _020B595C ; =OS_AllocFromHeap + mov r3, r0 + mov r2, r1 + ldr r0, [r3, #8] + ldr r1, [r3, #4] + bx ip + .align 2, 0 +_020B595C: .word OS_AllocFromHeap + arm_func_end AllocatorAllocForSDKHeap + + arm_func_start AllocatorFreeForSDKHeap +AllocatorFreeForSDKHeap: ; 0x020B5960 + ldr ip, _020B5978 ; =OS_FreeToHeap + mov r3, r0 + mov r2, r1 + ldr r0, [r3, #8] + ldr r1, [r3, #4] + bx ip + .align 2, 0 +_020B5978: .word OS_FreeToHeap + arm_func_end AllocatorFreeForSDKHeap + + arm_func_start NNS_FndAllocFromAllocator +NNS_FndAllocFromAllocator: ; 0x020B597C + stmdb sp!, {r3, lr} + ldr r2, [r0] + ldr r2, [r2] + blx r2 + ldmia sp!, {r3, pc} + arm_func_end NNS_FndAllocFromAllocator + + arm_func_start NNS_FndFreeToAllocator +NNS_FndFreeToAllocator: ; 0x020B5990 + stmdb sp!, {r3, lr} + ldr r2, [r0] + ldr r2, [r2, #4] + blx r2 + ldmia sp!, {r3, pc} + arm_func_end NNS_FndFreeToAllocator + + arm_func_start NNS_FndInitAllocatorForExpHeap +NNS_FndInitAllocatorForExpHeap: ; 0x020B59A4 + ldr ip, _020B59B8 ; =_02109200 + mov r3, #0 + str ip, [r0] + stmib r0, {r1, r2, r3} + bx lr + .align 2, 0 +_020B59B8: .word _02109200 + arm_func_end NNS_FndInitAllocatorForExpHeap + + arm_func_start AllocTexVram_ +AllocTexVram_: ; 0x020B59BC + mov r0, #0 + bx lr + arm_func_end AllocTexVram_ + + arm_func_start FreeTexVram_ +FreeTexVram_: ; 0x020B59C4 + mvn r0, #0 + bx lr + arm_func_end FreeTexVram_ + + arm_func_start AllocPlttVram_ +AllocPlttVram_: ; 0x020B59CC + mov r0, #0 + bx lr + arm_func_end AllocPlttVram_ + + arm_func_start FreePlttVram_ +FreePlttVram_: ; 0x020B59D4 + mvn r0, #0 + bx lr + arm_func_end FreePlttVram_ + + arm_func_start NNSi_GfdSetTexNrmSearchArray +NNSi_GfdSetTexNrmSearchArray: ; 0x020B59DC + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _020B5A1C ; =_02110950 + mov ip, #0x18 + mla r6, r0, ip, r5 + ldr lr, [sp, #0x10] + ldr r0, _020B5A20 ; =_02110934 + mla r4, r1, ip, r5 + str r6, [r0, #8] + mla r1, r2, ip, r5 + str r4, [r0, #0xc] + mla r2, r3, ip, r5 + str r1, [r0, #0x10] + mla r1, lr, ip, r5 + str r2, [r0, #0x14] + str r1, [r0, #0x18] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B5A1C: .word _02110950 +_020B5A20: .word _02110934 + arm_func_end NNSi_GfdSetTexNrmSearchArray + + arm_func_start NNS_GfdInitFrmTexVramManager +NNS_GfdInitFrmTexVramManager: ; 0x020B5A24 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + cmp r5, #2 + mov ip, #1 + mov r0, #4 + mov r1, #3 + bhi _020B5A58 + mov r2, #2 + mov r3, #0 + str ip, [sp] + bl NNSi_GfdSetTexNrmSearchArray + b _020B5A68 +_020B5A58: + mov r2, #0 + mov r3, #2 + str ip, [sp] + bl NNSi_GfdSetTexNrmSearchArray +_020B5A68: + ldr r0, _020B5A98 ; =_021D84C0 + strh r5, [r0] + bl NNS_GfdResetFrmTexVramState + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, _020B5A9C ; =NNS_GfdAllocFrmTexVram + ldr r1, _020B5AA0 ; =NNS_GfdDefaultFuncAllocTexVram + ldr r2, _020B5AA4 ; =NNS_GfdFreeFrmTexVram + ldr r0, _020B5AA8 ; =NNS_GfdDefaultFuncFreeTexVram + str r3, [r1] + str r2, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B5A98: .word _021D84C0 +_020B5A9C: .word NNS_GfdAllocFrmTexVram +_020B5AA0: .word NNS_GfdDefaultFuncAllocTexVram +_020B5AA4: .word NNS_GfdFreeFrmTexVram +_020B5AA8: .word NNS_GfdDefaultFuncFreeTexVram + arm_func_end NNS_GfdInitFrmTexVramManager + + arm_func_start NNS_GfdResetFrmTexVramState +NNS_GfdResetFrmTexVramState: ; 0x020B5AAC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _020B5B18 ; =_021D84C0 + mov r5, #0 + ldrh r7, [r0] + ldr r6, _020B5B1C ; =_02110950 + mov lr, r5 + cmp r7, #1 + addhi r7, r7, #1 + mov r4, #1 + mov r1, r5 + mov r0, #0x20000 + mov r3, r5 + mov r2, #0x10000 +_020B5AE0: + cmp r5, r7 + strlt r4, [r6, #8] + strge lr, [r6, #8] + ldr ip, [r6, #0xc] + add r5, r5, #1 + cmp ip, #0 + strne r3, [r6] + strne r2, [r6, #4] + streq r1, [r6] + streq r0, [r6, #4] + cmp r5, #5 + add r6, r6, #0x18 + blt _020B5AE0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B5B18: .word _021D84C0 +_020B5B1C: .word _02110950 + arm_func_end NNS_GfdResetFrmTexVramState + + arm_func_start NNS_GfdAllocFrmTexVram +NNS_GfdAllocFrmTexVram: ; 0x020B5B20 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + cmp r0, #0 + moveq r3, #0x10 + addne r0, r0, #0xf + bicne r3, r0, #0xf + ldr r0, _020B5C7C ; =0x0007FFF0 + cmp r3, r0 + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r1, #0 + beq _020B5C04 + mov r4, #0 + ldr r8, _020B5C80 ; =_02110980 + ldr sb, _020B5C84 ; =_02110968 + ldr r0, _020B5C88 ; =_02110934 + mov r7, r4 +_020B5B60: + ldr lr, [r0, r4, lsl #2] + ldr r5, [lr, #8] + cmp r5, #0 + beq _020B5BF0 + ldmia lr, {r5, r6} + sub r5, r6, r5 + cmp r5, r3 + blo _020B5BF0 + ldrh r5, [lr, #0x10] + cmp r5, #0 + beq _020B5B98 + cmp r5, #3 + beq _020B5BA0 + b _020B5BA8 +_020B5B98: + mov ip, sb + b _020B5BAC +_020B5BA0: + mov ip, r8 + b _020B5BAC +_020B5BA8: + mov ip, r7 +_020B5BAC: + ldr r5, [ip, #8] + cmp r5, #0 + beq _020B5BF0 + ldmia ip, {r5, r6} + sub r5, r6, r5 + cmp r5, r3, lsr #1 + blo _020B5BF0 + ldr r4, [lr] + mov r0, #1 + add r2, r4, r3 + str r2, [lr] + ldr r2, [ip] + add r2, r2, r3, lsr #1 + str r2, [ip] + ldr r2, [lr, #0x14] + add r2, r4, r2 + b _020B5C58 +_020B5BF0: + add r4, r4, #1 + cmp r4, #2 + blt _020B5B60 + mov r0, #0 + b _020B5C58 +_020B5C04: + ldr lr, _020B5C8C ; =_0211093C + mov r5, #0 +_020B5C0C: + ldr ip, [lr, r5, lsl #2] + ldr r0, [ip, #8] + cmp r0, #0 + beq _020B5C48 + ldmia ip, {r0, r4} + sub r0, r4, r0 + cmp r0, r3 + blo _020B5C48 + ldr r2, [ip, #4] + mov r0, #1 + sub r4, r2, r3 + str r4, [ip, #4] + ldr r2, [ip, #0x14] + add r2, r4, r2 + b _020B5C58 +_020B5C48: + add r5, r5, #1 + cmp r5, #5 + blt _020B5C0C + mov r0, #0 +_020B5C58: + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r2, lsl #0xd + mov r2, r3, lsr #4 + mov r0, r0, lsr #0x10 + orr r0, r0, r2, lsl #16 + orr r0, r0, r1, lsl #31 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B5C7C: .word 0x0007FFF0 +_020B5C80: .word _02110980 +_020B5C84: .word _02110968 +_020B5C88: .word _02110934 +_020B5C8C: .word _0211093C + arm_func_end NNS_GfdAllocFrmTexVram + + arm_func_start NNS_GfdFreeFrmTexVram +NNS_GfdFreeFrmTexVram: ; 0x020B5C90 + mov r0, #0 + bx lr + arm_func_end NNS_GfdFreeFrmTexVram + + arm_func_start NNS_GfdGetFrmTexVramState +NNS_GfdGetFrmTexVramState: ; 0x020B5C98 + stmdb sp!, {r3, lr} + mov r3, #0 + ldr ip, _020B5CD4 ; =_02110950 + mov lr, r3 +_020B5CA8: + ldr r1, [ip] + add r3, r3, #1 + str r1, [r0, lr, lsl #2] + ldr r2, [ip, #4] + add r1, r0, lr, lsl #2 + str r2, [r1, #4] + cmp r3, #5 + add ip, ip, #0x18 + add lr, lr, #2 + blt _020B5CA8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B5CD4: .word _02110950 + arm_func_end NNS_GfdGetFrmTexVramState + + arm_func_start NNS_GfdSetFrmTexVramState +NNS_GfdSetFrmTexVramState: ; 0x020B5CD8 + stmdb sp!, {r3, lr} + mov r3, #0 + ldr lr, _020B5D14 ; =_02110950 + mov ip, r3 +_020B5CE8: + ldr r2, [r0, ip, lsl #2] + add r1, r0, ip, lsl #2 + str r2, [lr] + ldr r1, [r1, #4] + add r3, r3, #1 + str r1, [lr, #4] + cmp r3, #5 + add ip, ip, #2 + add lr, lr, #0x18 + blt _020B5CE8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B5D14: .word _02110950 + arm_func_end NNS_GfdSetFrmTexVramState + + arm_func_start NNS_GfdInitFrmPlttVramManager +NNS_GfdInitFrmPlttVramManager: ; 0x020B5D18 + stmdb sp!, {r4, lr} + ldr r2, _020B5D50 ; =_021D84C4 + mov r4, r1 + str r0, [r2, #8] + bl NNS_GfdResetFrmPlttVramState + cmp r4, #0 + ldmeqia sp!, {r4, pc} + ldr r3, _020B5D54 ; =NNS_GfdAllocFrmPlttVram + ldr r1, _020B5D58 ; =NNS_GfdDefaultFuncAllocPlttVram + ldr r2, _020B5D5C ; =NNS_GfdFreeFrmPlttVram + ldr r0, _020B5D60 ; =NNS_GfdDefaultFuncFreePlttVram + str r3, [r1] + str r2, [r0] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B5D50: .word _021D84C4 +_020B5D54: .word NNS_GfdAllocFrmPlttVram +_020B5D58: .word NNS_GfdDefaultFuncAllocPlttVram +_020B5D5C: .word NNS_GfdFreeFrmPlttVram +_020B5D60: .word NNS_GfdDefaultFuncFreePlttVram + arm_func_end NNS_GfdInitFrmPlttVramManager + + arm_func_start NNS_GfdAllocFrmPlttVram +NNS_GfdAllocFrmPlttVram: ; 0x020B5D64 + stmdb sp!, {r4, lr} + cmp r0, #0 + moveq r0, #8 + addne r0, r0, #7 + ldr ip, _020B5E98 ; =0x0007FFF8 + bicne r0, r0, #7 + cmp r0, ip + mov r3, #0 + movhs r0, #0 + ldmhsia sp!, {r4, pc} + cmp r2, #1 + bne _020B5E10 + ldr r2, _020B5E9C ; =_021D84C4 + cmp r1, #0 + ldr lr, [r2] + andeq r2, lr, #0xf + rsbeq r2, r2, #0x10 + andeq r4, r2, #0xf + beq _020B5DBC + and r2, lr, #7 + rsb r2, r2, #8 + and r4, r2, #7 +_020B5DBC: + ldr r2, _020B5E9C ; =_021D84C4 + add ip, r0, r4 + ldr r2, [r2, #4] + sub r2, r2, lr + cmp r2, ip + blo _020B5E08 + cmp r1, #0 + add r1, lr, ip + beq _020B5DEC + cmp r1, #0x10000 + movhi lr, #0 + bhi _020B5E78 +_020B5DEC: + ldr r1, _020B5E9C ; =_021D84C4 + add r3, lr, r4 + ldr r2, [r1] + mov lr, #1 + add r2, r2, ip + str r2, [r1] + b _020B5E78 +_020B5E08: + mov lr, #0 + b _020B5E78 +_020B5E10: + ldr r2, _020B5E9C ; =_021D84C4 + ldr lr, [r2, #4] + cmp lr, r0 + blo _020B5E74 + sub r2, lr, r0 + cmp r1, #0 + andne r4, r2, #7 + andeq r4, r2, #0xf + ldr r2, _020B5E9C ; =_021D84C4 + add ip, r0, r4 + ldr r2, [r2] + sub r2, lr, r2 + cmp r2, ip + blo _020B5E74 + cmp r1, #0 + beq _020B5E5C + cmp lr, #0x10000 + movhi lr, #0 + bhi _020B5E78 +_020B5E5C: + ldr r1, _020B5E9C ; =_021D84C4 + mov lr, #1 + ldr r2, [r1, #4] + sub r3, r2, ip + str r3, [r1, #4] + b _020B5E78 +_020B5E74: + mov lr, #0 +_020B5E78: + cmp lr, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, r3, lsl #0xd + mov r2, r0, lsr #3 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B5E98: .word 0x0007FFF8 +_020B5E9C: .word _021D84C4 + arm_func_end NNS_GfdAllocFrmPlttVram + + arm_func_start NNS_GfdFreeFrmPlttVram +NNS_GfdFreeFrmPlttVram: ; 0x020B5EA0 + mov r0, #0 + bx lr + arm_func_end NNS_GfdFreeFrmPlttVram + + arm_func_start NNS_GfdGetFrmPlttVramState +NNS_GfdGetFrmPlttVramState: ; 0x020B5EA8 + ldr r1, _020B5EC0 ; =_021D84C4 + ldr r2, [r1] + str r2, [r0] + ldr r1, [r1, #4] + str r1, [r0, #4] + bx lr + .align 2, 0 +_020B5EC0: .word _021D84C4 + arm_func_end NNS_GfdGetFrmPlttVramState + + arm_func_start NNS_GfdSetFrmPlttVramState +NNS_GfdSetFrmPlttVramState: ; 0x020B5EC4 + ldr r2, [r0] + ldr r1, _020B5EDC ; =_021D84C4 + str r2, [r1] + ldr r0, [r0, #4] + str r0, [r1, #4] + bx lr + .align 2, 0 +_020B5EDC: .word _021D84C4 + arm_func_end NNS_GfdSetFrmPlttVramState + + arm_func_start NNS_GfdResetFrmPlttVramState +NNS_GfdResetFrmPlttVramState: ; 0x020B5EE0 + ldr r0, _020B5EF8 ; =_021D84C4 + mov r1, #0 + str r1, [r0] + ldr r1, [r0, #8] + str r1, [r0, #4] + bx lr + .align 2, 0 +_020B5EF8: .word _021D84C4 + arm_func_end NNS_GfdResetFrmPlttVramState + + arm_func_start GetNextIndex_ +GetNextIndex_: ; 0x020B5EFC + stmdb sp!, {r3, lr} + mov r2, r0 + add r0, r1, #1 + ldr r1, [r2, #4] + bl _u32_div_f + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r3, pc} + arm_func_end GetNextIndex_ + + arm_func_start IsVramTransferTaskQueueFull_ +IsVramTransferTaskQueueFull_: ; 0x020B5F1C + ldrh r1, [r0, #0xc] + ldr r0, [r0, #4] + cmp r1, r0 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end IsVramTransferTaskQueueFull_ + + arm_func_start IsVramTransferTaskQueueEmpty_ +IsVramTransferTaskQueueEmpty_: ; 0x020B5F34 + ldrh r0, [r0, #0xc] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end IsVramTransferTaskQueueEmpty_ + + arm_func_start DoTransfer3dTex +DoTransfer3dTex: ; 0x020B5F48 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GX_BeginLoadTex + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GX_LoadTex + bl GX_EndLoadTex + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer3dTex + + arm_func_start DoTransfer3dTexPltt +DoTransfer3dTexPltt: ; 0x020B5F74 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GX_BeginLoadTexPltt + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GX_LoadTexPltt + bl GX_EndLoadTexPltt + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer3dTexPltt + + arm_func_start DoTransfer3dClearImageColor +DoTransfer3dClearImageColor: ; 0x020B5FA0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r2 + bl GX_BeginLoadClearImage + mov r0, r5 + mov r1, r4 + bl GX_LoadClearImageColor + bl GX_EndLoadClearImage + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DoTransfer3dClearImageColor + + arm_func_start DoTransfer3dClearImageDepth +DoTransfer3dClearImageDepth: ; 0x020B5FC4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r2 + bl GX_BeginLoadClearImage + mov r0, r5 + mov r1, r4 + bl GX_LoadClearImageDepth + bl GX_EndLoadClearImage + ldmia sp!, {r3, r4, r5, pc} + arm_func_end DoTransfer3dClearImageDepth + + arm_func_start DoTransfer2dBG0CharMain +DoTransfer2dBG0CharMain: ; 0x020B5FE8 + ldr ip, _020B5FF0 ; =GX_LoadBG0Char + bx ip + .align 2, 0 +_020B5FF0: .word GX_LoadBG0Char + arm_func_end DoTransfer2dBG0CharMain + + arm_func_start DoTransfer2dBG1CharMain +DoTransfer2dBG1CharMain: ; 0x020B5FF4 + ldr ip, _020B5FFC ; =GX_LoadBG1Char + bx ip + .align 2, 0 +_020B5FFC: .word GX_LoadBG1Char + arm_func_end DoTransfer2dBG1CharMain + + arm_func_start DoTransfer2dBG2CharMain +DoTransfer2dBG2CharMain: ; 0x020B6000 + ldr ip, _020B6008 ; =GX_LoadBG2Char + bx ip + .align 2, 0 +_020B6008: .word GX_LoadBG2Char + arm_func_end DoTransfer2dBG2CharMain + + arm_func_start DoTransfer2dBG3CharMain +DoTransfer2dBG3CharMain: ; 0x020B600C + ldr ip, _020B6014 ; =GX_LoadBG3Char + bx ip + .align 2, 0 +_020B6014: .word GX_LoadBG3Char + arm_func_end DoTransfer2dBG3CharMain + + arm_func_start DoTransfer2dBG0ScrMain +DoTransfer2dBG0ScrMain: ; 0x020B6018 + ldr ip, _020B6020 ; =GX_LoadBG0Scr + bx ip + .align 2, 0 +_020B6020: .word GX_LoadBG0Scr + arm_func_end DoTransfer2dBG0ScrMain + + arm_func_start DoTransfer2dBG1ScrMain +DoTransfer2dBG1ScrMain: ; 0x020B6024 + ldr ip, _020B602C ; =GX_LoadBG1Scr + bx ip + .align 2, 0 +_020B602C: .word GX_LoadBG1Scr + arm_func_end DoTransfer2dBG1ScrMain + + arm_func_start DoTransfer2dBG2ScrMain +DoTransfer2dBG2ScrMain: ; 0x020B6030 + ldr ip, _020B6038 ; =GX_LoadBG2Scr + bx ip + .align 2, 0 +_020B6038: .word GX_LoadBG2Scr + arm_func_end DoTransfer2dBG2ScrMain + + arm_func_start DoTransfer2dBG3ScrMain +DoTransfer2dBG3ScrMain: ; 0x020B603C + ldr ip, _020B6044 ; =GX_LoadBG3Scr + bx ip + .align 2, 0 +_020B6044: .word GX_LoadBG3Scr + arm_func_end DoTransfer2dBG3ScrMain + + arm_func_start DoTransfer2dBG2BmpMain +DoTransfer2dBG2BmpMain: ; 0x020B6048 + ldr ip, _020B6050 ; =GX_LoadBG2Scr + bx ip + .align 2, 0 +_020B6050: .word GX_LoadBG2Scr + arm_func_end DoTransfer2dBG2BmpMain + + arm_func_start DoTransfer2dBG3BmpMain +DoTransfer2dBG3BmpMain: ; 0x020B6054 + ldr ip, _020B605C ; =GX_LoadBG3Scr + bx ip + .align 2, 0 +_020B605C: .word GX_LoadBG3Scr + arm_func_end DoTransfer2dBG3BmpMain + + arm_func_start DoTransfer2dObjPlttMain +DoTransfer2dObjPlttMain: ; 0x020B6060 + ldr ip, _020B6068 ; =GX_LoadOBJPltt + bx ip + .align 2, 0 +_020B6068: .word GX_LoadOBJPltt + arm_func_end DoTransfer2dObjPlttMain + + arm_func_start DoTransfer2dBGPlttMain +DoTransfer2dBGPlttMain: ; 0x020B606C + ldr ip, _020B6074 ; =GX_LoadBGPltt + bx ip + .align 2, 0 +_020B6074: .word GX_LoadBGPltt + arm_func_end DoTransfer2dBGPlttMain + + arm_func_start DoTransfer2dObjExtPlttMain +DoTransfer2dObjExtPlttMain: ; 0x020B6078 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GX_BeginLoadOBJExtPltt + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GX_LoadOBJExtPltt + bl GX_EndLoadOBJExtPltt + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer2dObjExtPlttMain + + arm_func_start DoTransfer2dBGExtPlttMain +DoTransfer2dBGExtPlttMain: ; 0x020B60A4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GX_BeginLoadBGExtPltt + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GX_LoadBGExtPltt + bl GX_EndLoadBGExtPltt + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer2dBGExtPlttMain + + arm_func_start DoTransfer2dObjOamMain +DoTransfer2dObjOamMain: ; 0x020B60D0 + ldr ip, _020B60D8 ; =GX_LoadOAM + bx ip + .align 2, 0 +_020B60D8: .word GX_LoadOAM + arm_func_end DoTransfer2dObjOamMain + + arm_func_start DoTransfer2dObjCharMain +DoTransfer2dObjCharMain: ; 0x020B60DC + ldr ip, _020B60E4 ; =GX_LoadOBJ + bx ip + .align 2, 0 +_020B60E4: .word GX_LoadOBJ + arm_func_end DoTransfer2dObjCharMain + + arm_func_start DoTransfer2dBG0CharSub +DoTransfer2dBG0CharSub: ; 0x020B60E8 + ldr ip, _020B60F0 ; =GXS_LoadBG0Char + bx ip + .align 2, 0 +_020B60F0: .word GXS_LoadBG0Char + arm_func_end DoTransfer2dBG0CharSub + + arm_func_start DoTransfer2dBG1CharSub +DoTransfer2dBG1CharSub: ; 0x020B60F4 + ldr ip, _020B60FC ; =GXS_LoadBG1Char + bx ip + .align 2, 0 +_020B60FC: .word GXS_LoadBG1Char + arm_func_end DoTransfer2dBG1CharSub + + arm_func_start DoTransfer2dBG2CharSub +DoTransfer2dBG2CharSub: ; 0x020B6100 + ldr ip, _020B6108 ; =GXS_LoadBG2Char + bx ip + .align 2, 0 +_020B6108: .word GXS_LoadBG2Char + arm_func_end DoTransfer2dBG2CharSub + + arm_func_start DoTransfer2dBG3CharSub +DoTransfer2dBG3CharSub: ; 0x020B610C + ldr ip, _020B6114 ; =GXS_LoadBG3Char + bx ip + .align 2, 0 +_020B6114: .word GXS_LoadBG3Char + arm_func_end DoTransfer2dBG3CharSub + + arm_func_start DoTransfer2dBG0ScrSub +DoTransfer2dBG0ScrSub: ; 0x020B6118 + ldr ip, _020B6120 ; =GXS_LoadBG0Scr + bx ip + .align 2, 0 +_020B6120: .word GXS_LoadBG0Scr + arm_func_end DoTransfer2dBG0ScrSub + + arm_func_start DoTransfer2dBG1ScrSub +DoTransfer2dBG1ScrSub: ; 0x020B6124 + ldr ip, _020B612C ; =GXS_LoadBG1Scr + bx ip + .align 2, 0 +_020B612C: .word GXS_LoadBG1Scr + arm_func_end DoTransfer2dBG1ScrSub + + arm_func_start DoTransfer2dBG2ScrSub +DoTransfer2dBG2ScrSub: ; 0x020B6130 + ldr ip, _020B6138 ; =GXS_LoadBG2Scr + bx ip + .align 2, 0 +_020B6138: .word GXS_LoadBG2Scr + arm_func_end DoTransfer2dBG2ScrSub + + arm_func_start DoTransfer2dBG3ScrSub +DoTransfer2dBG3ScrSub: ; 0x020B613C + ldr ip, _020B6144 ; =GXS_LoadBG3Scr + bx ip + .align 2, 0 +_020B6144: .word GXS_LoadBG3Scr + arm_func_end DoTransfer2dBG3ScrSub + + arm_func_start DoTransfer2dBG2BmpSub +DoTransfer2dBG2BmpSub: ; 0x020B6148 + ldr ip, _020B6150 ; =GXS_LoadBG2Scr + bx ip + .align 2, 0 +_020B6150: .word GXS_LoadBG2Scr + arm_func_end DoTransfer2dBG2BmpSub + + arm_func_start DoTransfer2dBG3BmpSub +DoTransfer2dBG3BmpSub: ; 0x020B6154 + ldr ip, _020B615C ; =GXS_LoadBG3Scr + bx ip + .align 2, 0 +_020B615C: .word GXS_LoadBG3Scr + arm_func_end DoTransfer2dBG3BmpSub + + arm_func_start DoTransfer2dObjPlttSub +DoTransfer2dObjPlttSub: ; 0x020B6160 + ldr ip, _020B6168 ; =GXS_LoadOBJPltt + bx ip + .align 2, 0 +_020B6168: .word GXS_LoadOBJPltt + arm_func_end DoTransfer2dObjPlttSub + + arm_func_start DoTransfer2dBGPlttSub +DoTransfer2dBGPlttSub: ; 0x020B616C + ldr ip, _020B6174 ; =GXS_LoadBGPltt + bx ip + .align 2, 0 +_020B6174: .word GXS_LoadBGPltt + arm_func_end DoTransfer2dBGPlttSub + + arm_func_start DoTransfer2dObjExtPlttSub +DoTransfer2dObjExtPlttSub: ; 0x020B6178 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GXS_BeginLoadOBJExtPltt + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GXS_LoadOBJExtPltt + bl GXS_EndLoadOBJExtPltt + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer2dObjExtPlttSub + + arm_func_start DoTransfer2dBGExtPlttSub +DoTransfer2dBGExtPlttSub: ; 0x020B61A4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GXS_BeginLoadBGExtPltt + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl GXS_LoadBGExtPltt + bl GXS_EndLoadBGExtPltt + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DoTransfer2dBGExtPlttSub + + arm_func_start DoTransfer2dObjOamSub +DoTransfer2dObjOamSub: ; 0x020B61D0 + ldr ip, _020B61D8 ; =GXS_LoadOAM + bx ip + .align 2, 0 +_020B61D8: .word GXS_LoadOAM + arm_func_end DoTransfer2dObjOamSub + + arm_func_start DoTransfer2dObjCharSub +DoTransfer2dObjCharSub: ; 0x020B61DC + ldr ip, _020B61E4 ; =GXS_LoadOBJ + bx ip + .align 2, 0 +_020B61E4: .word GXS_LoadOBJ + arm_func_end DoTransfer2dObjCharSub + + arm_func_start DoTransfer_ +DoTransfer_: ; 0x020B61E8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r3, [r5] + ldr r2, _020B6214 ; =_02109210 + ldr r0, [r5, #4] + ldr r1, [r5, #0xc] + ldr r4, [r2, r3, lsl #2] + bl DC_FlushRange + ldmib r5, {r0, r1, r2} + blx r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B6214: .word _02109210 + arm_func_end DoTransfer_ + + arm_func_start ResetTaskQueue_ +ResetTaskQueue_: ; 0x020B6218 + mov r1, #0 + strh r1, [r0, #0xa] + strh r1, [r0, #8] + strh r1, [r0, #0xc] + str r1, [r0, #0x10] + bx lr + arm_func_end ResetTaskQueue_ + + arm_func_start NNSi_GfdPushVramTransferTaskQueue +NNSi_GfdPushVramTransferTaskQueue: ; 0x020B6230 + stmdb sp!, {r4, lr} + mov r4, r0 + bl IsVramTransferTaskQueueFull_ + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldrh r1, [r4, #0xa] + mov r0, r4 + bl GetNextIndex_ + strh r0, [r4, #0xa] + ldrh r1, [r4, #0xc] + mov r0, #1 + add r1, r1, #1 + strh r1, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end NNSi_GfdPushVramTransferTaskQueue + + arm_func_start NNSi_GfdGetFrontVramTransferTaskQueue +NNSi_GfdGetFrontVramTransferTaskQueue: ; 0x020B626C + ldrh r1, [r0, #8] + ldr r0, [r0] + add r0, r0, r1, lsl #4 + bx lr + arm_func_end NNSi_GfdGetFrontVramTransferTaskQueue + + arm_func_start NNSi_GfdGetEndVramTransferTaskQueue +NNSi_GfdGetEndVramTransferTaskQueue: ; 0x020B627C + ldrh r1, [r0, #0xa] + ldr r0, [r0] + add r0, r0, r1, lsl #4 + bx lr + arm_func_end NNSi_GfdGetEndVramTransferTaskQueue + + arm_func_start NNSi_GfdPopVramTransferTaskQueue +NNSi_GfdPopVramTransferTaskQueue: ; 0x020B628C + stmdb sp!, {r4, lr} + mov r4, r0 + bl IsVramTransferTaskQueueEmpty_ + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldrh r1, [r4, #8] + mov r0, r4 + bl GetNextIndex_ + strh r0, [r4, #8] + ldrh r1, [r4, #0xc] + mov r0, #1 + sub r1, r1, #1 + strh r1, [r4, #0xc] + ldmia sp!, {r4, pc} + arm_func_end NNSi_GfdPopVramTransferTaskQueue + + arm_func_start NNS_GfdInitVramTransferManager +NNS_GfdInitVramTransferManager: ; 0x020B62C8 + ldr r2, _020B62E0 ; =_021D84D0 + ldr ip, _020B62E4 ; =ResetTaskQueue_ + str r0, [r2] + ldr r0, _020B62E8 ; =_021D84D0 + str r1, [r2, #4] + bx ip + .align 2, 0 +_020B62E0: .word _021D84D0 +_020B62E4: .word ResetTaskQueue_ +_020B62E8: .word _021D84D0 + arm_func_end NNS_GfdInitVramTransferManager + + arm_func_start NNS_GfdDoVramTransfer +NNS_GfdDoVramTransfer: ; 0x020B62EC + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020B6348 ; =_021D84D0 + mov r0, r4 + bl NNSi_GfdGetFrontVramTransferTaskQueue + mov r5, r0 + mov r0, r4 + bl NNSi_GfdPopVramTransferTaskQueue + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} +_020B6310: + mov r0, r5 + bl DoTransfer_ + ldr r2, [r4, #0x10] + ldr r1, [r5, #0xc] + mov r0, r4 + sub r1, r2, r1 + str r1, [r4, #0x10] + bl NNSi_GfdGetFrontVramTransferTaskQueue + mov r5, r0 + mov r0, r4 + bl NNSi_GfdPopVramTransferTaskQueue + cmp r0, #0 + bne _020B6310 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B6348: .word _021D84D0 + arm_func_end NNS_GfdDoVramTransfer + + arm_func_start NNS_GfdRegisterNewVramTransferTask +NNS_GfdRegisterNewVramTransferTask: ; 0x020B634C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r5, _020B63B0 ; =_021D84D0 + mov sb, r0 + mov r0, r5 + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl IsVramTransferTaskQueueFull_ + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r5 + bl NNSi_GfdGetEndVramTransferTaskQueue + mov r4, r0 + str sb, [r4] + stmib r4, {r7, r8} + mov r0, r5 + str r6, [r4, #0xc] + bl NNSi_GfdPushVramTransferTaskQueue + ldr r2, [r5, #0x10] + ldr r1, [r4, #0xc] + mov r0, #1 + add r1, r2, r1 + str r1, [r5, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B63B0: .word _021D84D0 + arm_func_end NNS_GfdRegisterNewVramTransferTask + + arm_func_start TryToMergeBlockRegion_ +TryToMergeBlockRegion_: ; 0x020B63B4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, [r0] + mov lr, #0 + cmp r3, #0 + beq _020B6490 + mov r8, lr + mov r4, lr +_020B63D0: + ldr r6, [r3] + ldr r5, [r2, #4] + ldr ip, [r3, #0xc] + cmp r6, r5 + bne _020B642C + ldr r5, [r3, #4] + orr lr, lr, #1 + add r5, r6, r5 + str r5, [r2, #4] + ldr r6, [r3, #8] + ldr r5, [r3, #0xc] + cmp r6, #0 + strne r5, [r6, #0xc] + streq r5, [r0] + cmp r5, #0 + strne r6, [r5, #8] + ldr r5, [r1] + cmp r5, #0 + strne r3, [r5, #8] + ldr r5, [r1] + str r5, [r3, #0xc] + str r8, [r3, #8] + str r3, [r1] +_020B642C: + ldr r7, [r3] + ldr r5, [r3, #4] + ldr r6, [r2] + add r5, r7, r5 + cmp r6, r5 + bne _020B6484 + str r7, [r2] + ldr r6, [r3, #8] + ldr r5, [r3, #0xc] + cmp r6, #0 + strne r5, [r6, #0xc] + streq r5, [r0] + cmp r5, #0 + strne r6, [r5, #8] + ldr r5, [r1] + orr lr, lr, #1 + cmp r5, #0 + strne r3, [r5, #8] + ldr r5, [r1] + str r5, [r3, #0xc] + str r4, [r3, #8] + str r3, [r1] +_020B6484: + mov r3, ip + cmp ip, #0 + bne _020B63D0 +_020B6490: + mov r0, lr + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end TryToMergeBlockRegion_ + + arm_func_start NNSi_GfdInitLnkVramMan +NNSi_GfdInitLnkVramMan: ; 0x020B6498 + mov r1, #0 + str r1, [r0] + bx lr + arm_func_end NNSi_GfdInitLnkVramMan + + arm_func_start NNSi_GfdInitLnkVramBlockPool +NNSi_GfdInitLnkVramBlockPool: ; 0x020B64A4 + stmdb sp!, {r4, lr} + subs lr, r1, #1 + mov r2, #0 + beq _020B64DC + mov r4, r0 +_020B64B8: + add r3, r2, #1 + add r2, r0, r2, lsl #4 + add ip, r0, r3, lsl #4 + str ip, [r2, #0xc] + str r4, [r2, #0x18] + mov r2, r3 + cmp r3, lr + add r4, r4, #0x10 + blo _020B64B8 +_020B64DC: + mov r2, #0 + str r2, [r0, #8] + add r1, r0, r1, lsl #4 + str r2, [r1, #-4] + ldmia sp!, {r4, pc} + arm_func_end NNSi_GfdInitLnkVramBlockPool + + arm_func_start NNSi_GfdAddNewFreeBlock +NNSi_GfdAddNewFreeBlock: ; 0x020B64F0 + stmdb sp!, {r3, lr} + ldr lr, [r1] + cmp lr, #0 + ldrne ip, [lr, #0xc] + strne ip, [r1] + cmp lr, #0 + beq _020B6544 + stmia lr, {r2, r3} + mov r1, #0 + str r1, [lr, #8] + str r1, [lr, #0xc] + ldr r1, [r0] + cmp r1, #0 + strne lr, [r1, #8] + ldr r2, [r0] + mov r1, #0 + str r2, [lr, #0xc] + str r1, [lr, #8] + str lr, [r0] + mov r0, #1 + ldmia sp!, {r3, pc} +_020B6544: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNSi_GfdAddNewFreeBlock + + arm_func_start NNSi_GfdAllocLnkVram +NNSi_GfdAllocLnkVram: ; 0x020B654C + stmdb sp!, {r3, lr} + mov ip, #0 + str ip, [sp] + bl NNSi_GfdAllocLnkVramAligned + ldmia sp!, {r3, pc} + arm_func_end NNSi_GfdAllocLnkVram + + arm_func_start NNSi_GfdAllocLnkVramAligned +NNSi_GfdAllocLnkVramAligned: ; 0x020B6560 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r7, [r0] + ldr sb, [sp, #0x28] + cmp r7, #0 + mov r6, #0 + beq _020B65C8 + sub ip, sb, #1 + mvn r8, ip + mov fp, r6 +_020B6584: + cmp sb, #1 + ldrls lr, [r7] + movls r5, fp + movls r4, r3 + bls _020B65AC + ldr r5, [r7] + add r4, r5, ip + and lr, r8, r4 + sub r5, lr, r5 + add r4, r3, r5 +_020B65AC: + ldr sl, [r7, #4] + cmp sl, r4 + movhs r6, r7 + bhs _020B65C8 + ldr r7, [r7, #0xc] + cmp r7, #0 + bne _020B6584 +_020B65C8: + cmp r6, #0 + beq _020B6694 + cmp r5, #0 + beq _020B6628 + ldr r8, [r1] + cmp r8, #0 + ldrne r3, [r8, #0xc] + strne r3, [r1] + cmp r8, #0 + beq _020B6694 + ldr r7, [r6] + mov r3, #0 + str r7, [r8] + str r5, [r8, #4] + str r3, [r8, #8] + str r3, [r8, #0xc] + ldr r3, [r0] + cmp r3, #0 + strne r8, [r3, #8] + ldr r5, [r0] + mov r3, #0 + str r5, [r8, #0xc] + str r3, [r8, #8] + str r8, [r0] +_020B6628: + ldr r3, [r6, #4] + sub r3, r3, r4 + str r3, [r6, #4] + ldr r3, [r6] + add r3, r3, r4 + str r3, [r6] + ldr r3, [r6, #4] + cmp r3, #0 + bne _020B6688 + ldr r4, [r6, #8] + ldr r3, [r6, #0xc] + cmp r4, #0 + strne r3, [r4, #0xc] + streq r3, [r0] + cmp r3, #0 + strne r4, [r3, #8] + ldr r0, [r1] + cmp r0, #0 + strne r6, [r0, #8] + ldr r3, [r1] + mov r0, #0 + str r3, [r6, #0xc] + str r0, [r6, #8] + str r6, [r1] +_020B6688: + str lr, [r2] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B6694: + mov r0, #0 + str r0, [r2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNSi_GfdAllocLnkVramAligned + + arm_func_start NNSi_GfdMergeAllFreeBlocks +NNSi_GfdMergeAllFreeBlocks: ; 0x020B66A0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + ldr r5, [r7] + mov r6, r1 + cmp r5, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r4, sp, #0 +_020B66C4: + ldr r1, [r5] + mov r0, r7 + str r1, [sp] + ldr r3, [r5] + ldr r2, [r5, #4] + mov r1, r6 + add r3, r3, r2 + mov r2, r4 + str r3, [sp, #4] + bl TryToMergeBlockRegion_ + cmp r0, #0 + ldreq r5, [r5, #0xc] + beq _020B6714 + ldr r0, [sp] + str r0, [r5] + ldr r1, [sp, #4] + ldr r0, [sp] + sub r0, r1, r0 + str r0, [r5, #4] + ldr r5, [r7] +_020B6714: + cmp r5, #0 + bne _020B66C4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_GfdMergeAllFreeBlocks + + arm_func_start NNSi_GfdFreeLnkVram +NNSi_GfdFreeLnkVram: ; 0x020B6724 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + add r3, r2, r3 + str r2, [sp] + add r2, sp, #0 + mov r5, r1 + str r3, [sp, #4] + mov r4, r0 + bl TryToMergeBlockRegion_ + ldr r3, [r5] + cmp r3, #0 + ldrne r0, [r3, #0xc] + strne r0, [r5] + cmp r3, #0 + addeq sp, sp, #8 + mov r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [sp] + str r1, [r3] + ldr r2, [sp, #4] + ldr r1, [sp] + sub r1, r2, r1 + str r1, [r3, #4] + str r0, [r3, #8] + str r0, [r3, #0xc] + ldr r0, [r4] + cmp r0, #0 + strne r3, [r0, #8] + ldr r1, [r4] + mov r0, #0 + str r1, [r3, #0xc] + str r0, [r3, #8] + str r3, [r4] + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_GfdFreeLnkVram + + arm_func_start NNS_GfdGetLnkTexVramManagerWorkSize +NNS_GfdGetLnkTexVramManagerWorkSize: ; 0x020B67B4 + mov r0, r0, lsl #4 + bx lr + arm_func_end NNS_GfdGetLnkTexVramManagerWorkSize + + arm_func_start NNS_GfdInitLnkTexVramManager +NNS_GfdInitLnkTexVramManager: ; 0x020B67BC + stmdb sp!, {r3, lr} + ldr ip, _020B6800 ; =_021D84E4 + str r0, [ip, #0xc] + str r1, [ip, #0x10] + str r2, [ip, #0x14] + str r3, [ip, #0x18] + bl NNS_GfdResetLnkTexVramState + ldr r0, [sp, #8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r3, _020B6804 ; =NNS_GfdAllocLnkTexVram + ldr r1, _020B6808 ; =NNS_GfdDefaultFuncAllocTexVram + ldr r2, _020B680C ; =NNS_GfdFreeLnkTexVram + ldr r0, _020B6810 ; =NNS_GfdDefaultFuncFreeTexVram + str r3, [r1] + str r2, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020B6800: .word _021D84E4 +_020B6804: .word NNS_GfdAllocLnkTexVram +_020B6808: .word NNS_GfdDefaultFuncAllocTexVram +_020B680C: .word NNS_GfdFreeLnkTexVram +_020B6810: .word NNS_GfdDefaultFuncFreeTexVram + arm_func_end NNS_GfdInitLnkTexVramManager + + arm_func_start NNS_GfdAllocLnkTexVram +NNS_GfdAllocLnkTexVram: ; 0x020B6814 + stmdb sp!, {r3, r4, r5, lr} + cmp r0, #0 + moveq r5, #0x10 + addne r0, r0, #0xf + bicne r5, r0, #0xf + ldr r0, _020B6894 ; =0x0007FFF0 + mov r4, r1 + cmp r5, r0 + movhs r0, #0 + ldmhsia sp!, {r3, r4, r5, pc} + cmp r4, #0 + add r2, sp, #0 + beq _020B685C + ldr r0, _020B6898 ; =_021D84E8 + ldr r1, _020B689C ; =_021D84EC + mov r3, r5 + bl NNSi_GfdAllocLnkVram + b _020B686C +_020B685C: + ldr r0, _020B68A0 ; =_021D84E4 + ldr r1, _020B689C ; =_021D84EC + mov r3, r5 + bl NNSi_GfdAllocLnkVram +_020B686C: + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [sp] + mov r1, r5, lsr #4 + mov r0, r0, lsl #0xd + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + orr r0, r0, r4, lsl #31 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B6894: .word 0x0007FFF0 +_020B6898: .word _021D84E8 +_020B689C: .word _021D84EC +_020B68A0: .word _021D84E4 + arm_func_end NNS_GfdAllocLnkTexVram + + arm_func_start NNS_GfdFreeLnkTexVram +NNS_GfdFreeLnkTexVram: ; 0x020B68A4 + stmdb sp!, {r3, lr} + ldr r1, _020B6908 ; =0x7FFF0000 + mov r2, r0, lsl #0x10 + and r1, r0, r1 + mov r1, r1, lsr #0x10 + and r0, r0, #0x80000000 + mov r2, r2, lsr #0xd + movs r3, r1, lsl #4 + mov r0, r0, lsr #0x1f + beq _020B6900 + cmp r0, #0 + beq _020B68E4 + ldr r0, _020B690C ; =_021D84E8 + ldr r1, _020B6910 ; =_021D84EC + bl NNSi_GfdFreeLnkVram + b _020B68F0 +_020B68E4: + ldr r0, _020B6914 ; =_021D84E4 + ldr r1, _020B6910 ; =_021D84EC + bl NNSi_GfdFreeLnkVram +_020B68F0: + cmp r0, #0 + movne r0, #0 + moveq r0, #1 + ldmia sp!, {r3, pc} +_020B6900: + mov r0, #2 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B6908: .word 0x7FFF0000 +_020B690C: .word _021D84E8 +_020B6910: .word _021D84EC +_020B6914: .word _021D84E4 + arm_func_end NNS_GfdFreeLnkTexVram + + arm_func_start NNS_GfdResetLnkTexVramState +NNS_GfdResetLnkTexVramState: ; 0x020B6918 + stmdb sp!, {r4, lr} + sub sp, sp, #0x30 + ldr lr, _020B6B00 ; =_021092A0 + add r4, sp, #0 + ldmia lr!, {r0, r1, r2, r3} + mov ip, r4 + stmia r4!, {r0, r1, r2, r3} + ldmia lr!, {r0, r1, r2, r3} + stmia r4!, {r0, r1, r2, r3} + ldmia lr, {r0, r1, r2, r3} + stmia r4, {r0, r1, r2, r3} + ldr r0, _020B6B04 ; =_021D84E4 + mov r3, #0 + ldr r2, [r0, #0x10] + ldr r1, [r0, #0xc] + add r0, r2, r2, lsr #1 + mov r4, r2, lsr #1 + sub r1, r1, r0 +_020B6960: + cmp r3, #0 + cmpne r3, #2 + bne _020B69A0 + ldr lr, [ip] + cmp lr, #0 + cmpne r2, #0 + beq _020B69A0 + ldr r0, [ip, #8] + cmp lr, r2 + movhi lr, r2 + add r0, r0, lr + str r0, [ip, #8] + ldr r0, [ip] + sub r2, r2, lr + sub r0, r0, lr + str r0, [ip] +_020B69A0: + add r3, r3, #1 + cmp r3, #4 + add ip, ip, #0xc + blo _020B6960 + ldr r0, [sp, #0xc] + add r2, sp, #0 + sub r0, r0, r4 + str r0, [sp, #0xc] + mov r3, #0 +_020B69C4: + ldr ip, [r2] + cmp ip, #0 + cmpne r1, #0 + beq _020B69F8 + ldr r0, [r2, #4] + cmp ip, r1 + movhi ip, r1 + add r0, r0, ip + str r0, [r2, #4] + ldr r0, [r2] + sub r1, r1, ip + sub r0, r0, ip + str r0, [r2] +_020B69F8: + add r3, r3, #1 + cmp r3, #4 + add r2, r2, #0xc + blo _020B69C4 + ldr r0, _020B6B08 ; =_021D84E4 + bl NNSi_GfdInitLnkVramMan + ldr r0, _020B6B0C ; =_021D84E8 + bl NNSi_GfdInitLnkVramMan + ldr r0, _020B6B04 ; =_021D84E4 + ldr r1, [r0, #0x18] + ldr r0, [r0, #0x14] + mov r1, r1, lsr #4 + bl NNSi_GfdInitLnkVramBlockPool + ldr r3, [sp, #8] + ldr r1, _020B6B04 ; =_021D84E4 + cmp r3, #0 + str r0, [r1, #8] + beq _020B6A50 + ldr r0, _020B6B0C ; =_021D84E8 + ldr r1, _020B6B10 ; =_021D84EC + mov r2, #0 + bl NNSi_GfdAddNewFreeBlock +_020B6A50: + ldr r3, [sp, #4] + ldr r2, [sp, #8] + cmp r3, #0 + beq _020B6A6C + ldr r0, _020B6B08 ; =_021D84E4 + ldr r1, _020B6B10 ; =_021D84EC + bl NNSi_GfdAddNewFreeBlock +_020B6A6C: + ldr r3, [sp, #0x20] + cmp r3, #0 + beq _020B6A88 + ldr r0, _020B6B0C ; =_021D84E8 + ldr r1, _020B6B10 ; =_021D84EC + mov r2, #0x40000 + bl NNSi_GfdAddNewFreeBlock +_020B6A88: + ldr r3, [sp, #0x1c] + ldr r2, [sp, #0x20] + cmp r3, #0 + beq _020B6AA8 + ldr r0, _020B6B08 ; =_021D84E4 + ldr r1, _020B6B10 ; =_021D84EC + add r2, r2, #0x40000 + bl NNSi_GfdAddNewFreeBlock +_020B6AA8: + ldr r3, [sp, #0x28] + cmp r3, #0 + beq _020B6AC4 + ldr r0, _020B6B08 ; =_021D84E4 + ldr r1, _020B6B10 ; =_021D84EC + mov r2, #0x60000 + bl NNSi_GfdAddNewFreeBlock +_020B6AC4: + ldr r3, [sp, #0x10] + cmp r3, #0 + beq _020B6AE0 + ldr r0, _020B6B08 ; =_021D84E4 + ldr r1, _020B6B10 ; =_021D84EC + add r2, r4, #0x20000 + bl NNSi_GfdAddNewFreeBlock +_020B6AE0: + ldr r0, _020B6B08 ; =_021D84E4 + ldr r1, _020B6B10 ; =_021D84EC + bl NNSi_GfdMergeAllFreeBlocks + ldr r0, _020B6B0C ; =_021D84E8 + ldr r1, _020B6B10 ; =_021D84EC + bl NNSi_GfdMergeAllFreeBlocks + add sp, sp, #0x30 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B6B00: .word _021092A0 +_020B6B04: .word _021D84E4 +_020B6B08: .word _021D84E4 +_020B6B0C: .word _021D84E8 +_020B6B10: .word _021D84EC + arm_func_end NNS_GfdResetLnkTexVramState + + arm_func_start NNS_GfdGetLnkPlttVramManagerWorkSize +NNS_GfdGetLnkPlttVramManagerWorkSize: ; 0x020B6B14 + mov r0, r0, lsl #4 + bx lr + arm_func_end NNS_GfdGetLnkPlttVramManagerWorkSize + + arm_func_start NNS_GfdInitLnkPlttVramManager +NNS_GfdInitLnkPlttVramManager: ; 0x020B6B1C + stmdb sp!, {r4, lr} + ldr ip, _020B6B5C ; =_021D8500 + mov r4, r3 + str r0, [ip, #8] + str r1, [ip, #0xc] + str r2, [ip, #0x10] + bl NNS_GfdResetLnkPlttVramState + cmp r4, #0 + ldmeqia sp!, {r4, pc} + ldr r3, _020B6B60 ; =NNS_GfdAllocLnkPlttVram + ldr r1, _020B6B64 ; =NNS_GfdDefaultFuncAllocPlttVram + ldr r2, _020B6B68 ; =NNS_GfdFreeLnkPlttVram + ldr r0, _020B6B6C ; =NNS_GfdDefaultFuncFreePlttVram + str r3, [r1] + str r2, [r0] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B6B5C: .word _021D8500 +_020B6B60: .word NNS_GfdAllocLnkPlttVram +_020B6B64: .word NNS_GfdDefaultFuncAllocPlttVram +_020B6B68: .word NNS_GfdFreeLnkPlttVram +_020B6B6C: .word NNS_GfdDefaultFuncFreePlttVram + arm_func_end NNS_GfdInitLnkPlttVramManager + + arm_func_start NNS_GfdAllocLnkPlttVram +NNS_GfdAllocLnkPlttVram: ; 0x020B6B70 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + cmp r0, #0 + moveq r4, #8 + addne r0, r0, #7 + bicne r4, r0, #7 + ldr r0, _020B6C30 ; =0x0007FFF8 + cmp r4, r0 + addhs sp, sp, #8 + movhs r0, #0 + ldmhsia sp!, {r4, pc} + cmp r1, #0 + add r2, sp, #4 + beq _020B6BEC + mov ip, #8 + ldr r0, _020B6C34 ; =_021D8500 + ldr r1, _020B6C38 ; =_021D8504 + mov r3, r4 + str ip, [sp] + bl NNSi_GfdAllocLnkVramAligned + ldr r2, [sp, #4] + add r1, r2, r4 + cmp r1, #0x10000 + bls _020B6C04 + ldr r0, _020B6C34 ; =_021D8500 + ldr r1, _020B6C38 ; =_021D8504 + mov r3, r4 + bl NNSi_GfdFreeLnkVram + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, pc} +_020B6BEC: + ldr r0, _020B6C34 ; =_021D8500 + mov ip, #0x10 + ldr r1, _020B6C38 ; =_021D8504 + mov r3, r4 + str ip, [sp] + bl NNSi_GfdAllocLnkVramAligned +_020B6C04: + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [sp, #4] + mov r1, r4, lsr #3 + mov r0, r0, lsl #0xd + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B6C30: .word 0x0007FFF8 +_020B6C34: .word _021D8500 +_020B6C38: .word _021D8504 + arm_func_end NNS_GfdAllocLnkPlttVram + + arm_func_start NNS_GfdFreeLnkPlttVram +NNS_GfdFreeLnkPlttVram: ; 0x020B6C3C + stmdb sp!, {r3, lr} + mov r1, #0x10000 + rsb r1, r1, #0 + and r1, r0, r1 + mov r2, r0, lsl #0x10 + mov r3, r1, lsr #0x10 + ldr r0, _020B6C78 ; =_021D8500 + ldr r1, _020B6C7C ; =_021D8504 + mov r2, r2, lsr #0xd + mov r3, r3, lsl #3 + bl NNSi_GfdFreeLnkVram + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B6C78: .word _021D8500 +_020B6C7C: .word _021D8504 + arm_func_end NNS_GfdFreeLnkPlttVram + + arm_func_start NNS_GfdResetLnkPlttVramState +NNS_GfdResetLnkPlttVramState: ; 0x020B6C80 + stmdb sp!, {r3, lr} + ldr r0, _020B6CD0 ; =_021D8500 + ldr r1, [r0, #0x10] + ldr r0, [r0, #0xc] + mov r1, r1, lsr #4 + bl NNSi_GfdInitLnkVramBlockPool + ldr r1, _020B6CD0 ; =_021D8500 + str r0, [r1, #4] + ldr r0, _020B6CD4 ; =_021D8500 + bl NNSi_GfdInitLnkVramMan + ldr r1, _020B6CD0 ; =_021D8500 + ldr r0, _020B6CD4 ; =_021D8500 + ldr r3, [r1, #8] + ldr r1, _020B6CD8 ; =_021D8504 + mov r2, #0 + bl NNSi_GfdAddNewFreeBlock + ldr r0, _020B6CD4 ; =_021D8500 + ldr r1, _020B6CD8 ; =_021D8504 + bl NNSi_GfdMergeAllFreeBlocks + ldmia sp!, {r3, pc} + .align 2, 0 +_020B6CD0: .word _021D8500 +_020B6CD4: .word _021D8500 +_020B6CD8: .word _021D8504 + arm_func_end NNS_GfdResetLnkPlttVramState + + arm_func_start GetUnpackedAnimBankImpl_ +GetUnpackedAnimBankImpl_: ; 0x020B6CDC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B6D14 ; =0x41424E4B + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackNAN + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B6D14: .word 0x41424E4B + arm_func_end GetUnpackedAnimBankImpl_ + + arm_func_start NNS_G2dGetUnpackedAnimBank +NNS_G2dGetUnpackedAnimBank: ; 0x020B6D18 + ldr ip, _020B6D20 ; =GetUnpackedAnimBankImpl_ + bx ip + .align 2, 0 +_020B6D20: .word GetUnpackedAnimBankImpl_ + arm_func_end NNS_G2dGetUnpackedAnimBank + + arm_func_start NNS_G2dGetUnpackedMCAnimBank +NNS_G2dGetUnpackedMCAnimBank: ; 0x020B6D24 + ldr ip, _020B6D2C ; =GetUnpackedAnimBankImpl_ + bx ip + .align 2, 0 +_020B6D2C: .word GetUnpackedAnimBankImpl_ + arm_func_end NNS_G2dGetUnpackedMCAnimBank + + arm_func_start NNS_G2dUnpackNAN +NNS_G2dUnpackNAN: ; 0x020B6D30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r1, [r0, #4] + mov ip, #0 + add r1, r1, r0 + str r1, [r0, #4] + ldr r1, [r0, #8] + add r1, r1, r0 + str r1, [r0, #8] + ldr r1, [r0, #0xc] + add r6, r1, r0 + str r6, [r0, #0xc] + ldrh r1, [r0] + ldmib r0, {r4, r5} + cmp r1, #0 + bls _020B6DD4 + mov r1, ip +_020B6D70: + add r2, r4, ip, lsl #4 + ldr r7, [r2, #0xc] + mov r3, ip, lsl #4 + add r7, r5, r7 + str r7, [r2, #0xc] + ldrh r7, [r4, r3] + mov lr, r1 + cmp r7, #0 + bls _020B6DBC +_020B6D94: + ldr sb, [r2, #0xc] + add r7, lr, #1 + ldr r8, [sb, lr, lsl #3] + mov r7, r7, lsl #0x10 + add r8, r6, r8 + str r8, [sb, lr, lsl #3] + ldrh r8, [r4, r3] + mov lr, r7, lsr #0x10 + cmp r8, r7, lsr #16 + bhi _020B6D94 +_020B6DBC: + ldrh r3, [r0] + add r2, ip, #1 + mov r2, r2, lsl #0x10 + cmp r3, r2, lsr #16 + mov ip, r2, lsr #0x10 + bhi _020B6D70 +_020B6DD4: + ldr r1, [r0, #0x14] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r2, r1, r0 + str r2, [r0, #0x14] + add r4, r2, #8 + ldr r1, [r4, #4] + mov r0, #0 + add r1, r1, r4 + str r1, [r4, #4] + ldrh r1, [r2, #8] + cmp r1, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r3, r0 + mov r7, r0 +_020B6E10: + ldr r6, [r4, #4] + mov r1, r7 + add r2, r6, r3 + ldr r5, [r2, #4] + add r5, r5, r4 + str r5, [r2, #4] + ldr r5, [r2, #8] + add r5, r5, r4 + str r5, [r2, #8] + ldrh r5, [r6, r3] + cmp r5, #0 + bls _020B6E68 + mov r8, r7 +_020B6E44: + ldr r6, [r2, #8] + add r1, r1, #1 + ldr r5, [r6, r8] + add r5, r5, r4 + str r5, [r6, r8] + ldrh r5, [r2] + add r8, r8, #4 + cmp r1, r5 + blo _020B6E44 +_020B6E68: + ldrh r1, [r4] + add r0, r0, #1 + add r3, r3, #0xc + cmp r0, r1 + blo _020B6E10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end NNS_G2dUnpackNAN + + arm_func_start NNS_G2dGetAnimSequenceByIdx +NNS_G2dGetAnimSequenceByIdx: ; 0x020B6E80 + ldrh r2, [r0] + cmp r2, r1 + ldrhi r0, [r0, #4] + addhi r0, r0, r1, lsl #4 + movls r0, #0 + bx lr + arm_func_end NNS_G2dGetAnimSequenceByIdx + + arm_func_start GetPtrOamArrayHead_ +GetPtrOamArrayHead_: ; 0x020B6E98 + ldrh r1, [r0, #2] + tst r1, #1 + ldrh r1, [r0] + ldrne r0, [r0, #4] + addne r0, r0, r1, lsl #4 + ldreq r0, [r0, #4] + addeq r0, r0, r1, lsl #3 + bx lr + arm_func_end GetPtrOamArrayHead_ + + arm_func_start UnPackExtendedData_ +UnPackExtendedData_: ; 0x020B6EB8 + ldr ip, _020B6EC4 ; =NNSi_G2dUnpackUserExCellAttrBank + add r0, r0, #8 + bx ip + .align 2, 0 +_020B6EC4: .word NNSi_G2dUnpackUserExCellAttrBank + arm_func_end UnPackExtendedData_ + + arm_func_start NNS_G2dGetUnpackedCellBank +NNS_G2dGetUnpackedCellBank: ; 0x020B6EC8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B6F00 ; =0x4345424B + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackNCE + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B6F00: .word 0x4345424B + arm_func_end NNS_G2dGetUnpackedCellBank + + arm_func_start NNS_G2dGetCellDataByIdx +NNS_G2dGetCellDataByIdx: ; 0x020B6F04 + ldrh r2, [r0] + cmp r1, r2 + movhs r0, #0 + bxhs lr + ldrh r2, [r0, #2] + ldr r0, [r0, #4] + tst r2, #1 + addne r0, r0, r1, lsl #4 + addeq r0, r0, r1, lsl #3 + bx lr + arm_func_end NNS_G2dGetCellDataByIdx + + arm_func_start NNS_G2dUnpackNCE +NNS_G2dUnpackNCE: ; 0x020B6F2C + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + ldr r1, [r5, #4] + add r1, r1, r5 + str r1, [r5, #4] + bl GetPtrOamArrayHead_ + ldrh r1, [r5] + mov r4, r0 + mov r6, #0 + cmp r1, #0 + bls _020B6F88 +_020B6F58: + mov r0, r5 + mov r1, r6 + bl NNS_G2dGetCellDataByIdx + ldr r2, [r0, #4] + add r1, r6, #1 + add r2, r2, r4 + str r2, [r0, #4] + mov r0, r1, lsl #0x10 + ldrh r1, [r5] + mov r6, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020B6F58 +_020B6F88: + ldr r0, [r5, #0xc] + cmp r0, #0 + beq _020B6FAC + add r1, r0, r5 + str r1, [r5, #0xc] + ldr r0, [r1, #4] + add r0, r0, r1 + str r0, [r1, #4] + str r1, [r5, #0xc] +_020B6FAC: + ldr r0, [r5, #0x14] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, r0, r5 + str r0, [r5, #0x14] + bl UnPackExtendedData_ + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G2dUnpackNCE + + arm_func_start NNS_G2dGetUnpackedMultiCellBank +NNS_G2dGetUnpackedMultiCellBank: ; 0x020B6FC8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B7000 ; =0x4D43424B + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackNMC + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B7000: .word 0x4D43424B + arm_func_end NNS_G2dGetUnpackedMultiCellBank + + arm_func_start UnpackExtendedData_ +UnpackExtendedData_: ; 0x020B7004 + ldr ip, _020B7010 ; =NNSi_G2dUnpackUserExCellAttrBank + add r0, r0, #8 + bx ip + .align 2, 0 +_020B7010: .word NNSi_G2dUnpackUserExCellAttrBank + arm_func_end UnpackExtendedData_ + + arm_func_start NNS_G2dUnpackNMC +NNS_G2dUnpackNMC: ; 0x020B7014 + stmdb sp!, {r4, lr} + ldr r1, [r0, #4] + mov lr, #0 + add r1, r1, r0 + str r1, [r0, #4] + ldr r1, [r0, #8] + add r1, r1, r0 + str r1, [r0, #8] + ldrh r1, [r0] + ldr r4, [r0, #4] + cmp r1, #0 + bls _020B7070 +_020B7044: + add r3, r4, lr, lsl #3 + ldr ip, [r0, #8] + ldr r2, [r3, #4] + add r1, lr, #1 + add r2, ip, r2 + str r2, [r3, #4] + ldrh r2, [r0] + mov r1, r1, lsl #0x10 + mov lr, r1, lsr #0x10 + cmp r2, r1, lsr #16 + bhi _020B7044 +_020B7070: + ldr r1, [r0, #0x10] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + add r1, r1, r0 + str r1, [r0, #0x10] + mov r0, r1 + bl UnpackExtendedData_ + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dUnpackNMC + + arm_func_start NNS_G2dGetMultiCellDataByIdx +NNS_G2dGetMultiCellDataByIdx: ; 0x020B7090 + ldrh r2, [r0] + cmp r1, r2 + ldrlo r0, [r0, #4] + addlo r0, r0, r1, lsl #3 + movhs r0, #0 + bx lr + arm_func_end NNS_G2dGetMultiCellDataByIdx + + arm_func_start NNS_G2dGetUnpackedCharacterData +NNS_G2dGetUnpackedCharacterData: ; 0x020B70A8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B70E0 ; =0x43484152 + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackNCG + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B70E0: .word 0x43484152 + arm_func_end NNS_G2dGetUnpackedCharacterData + + arm_func_start NNS_G2dUnpackNCG +NNS_G2dUnpackNCG: ; 0x020B70E4 + ldr r1, [r0, #0x14] + add r1, r1, r0 + str r1, [r0, #0x14] + bx lr + arm_func_end NNS_G2dUnpackNCG + + arm_func_start NNS_G2dGetUnpackedBGCharacterData +NNS_G2dGetUnpackedBGCharacterData: ; 0x020B70F4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B712C ; =0x43484152 + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackBGNCG + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B712C: .word 0x43484152 + arm_func_end NNS_G2dGetUnpackedBGCharacterData + + arm_func_start NNS_G2dUnpackBGNCG +NNS_G2dUnpackBGNCG: ; 0x020B7130 + ldr r1, [r0, #0x14] + add r1, r1, r0 + str r1, [r0, #0x14] + bx lr + arm_func_end NNS_G2dUnpackBGNCG + + arm_func_start NNS_G2dGetUnpackedPaletteData +NNS_G2dGetUnpackedPaletteData: ; 0x020B7140 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B7178 ; =0x504C5454 + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNS_G2dUnpackNCL + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B7178: .word 0x504C5454 + arm_func_end NNS_G2dGetUnpackedPaletteData + + arm_func_start NNS_G2dGetUnpackedPaletteCompressInfo +NNS_G2dGetUnpackedPaletteCompressInfo: ; 0x020B717C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + ldr r1, _020B71B4 ; =0x50434D50 + bl NNS_G2dFindBinaryBlock + movs r4, r0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r3, r4, r5, pc} + add r0, r4, #8 + bl NNSi_G2dUnpackNCLCmpInfo + add r0, r4, #8 + str r0, [r5] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B71B4: .word 0x50434D50 + arm_func_end NNS_G2dGetUnpackedPaletteCompressInfo + + arm_func_start NNSi_G2dUnpackNCLCmpInfo +NNSi_G2dUnpackNCLCmpInfo: ; 0x020B71B8 + ldr r1, [r0, #4] + add r1, r1, r0 + str r1, [r0, #4] + bx lr + arm_func_end NNSi_G2dUnpackNCLCmpInfo + + arm_func_start NNS_G2dUnpackNCL +NNS_G2dUnpackNCL: ; 0x020B71C8 + ldr r1, [r0, #0xc] + add r1, r1, r0 + str r1, [r0, #0xc] + bx lr + arm_func_end NNS_G2dUnpackNCL + + arm_func_start NNS_G2dGetUnpackedScreenData +NNS_G2dGetUnpackedScreenData: ; 0x020B71D8 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, _020B7208 ; =0x5343524E + bl NNS_G2dFindBinaryBlock + cmp r0, #0 + moveq r0, #0 + streq r0, [r4] + ldmeqia sp!, {r4, pc} + add r0, r0, #8 + str r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B7208: .word 0x5343524E + arm_func_end NNS_G2dGetUnpackedScreenData + + arm_func_start NNS_G2dFindBinaryBlock +NNS_G2dFindBinaryBlock: ; 0x020B720C + ldrh r2, [r0, #0xc] + ldrh ip, [r0, #0xe] + mov r3, #0 + add r0, r0, r2 + cmp ip, #0 + bls _020B724C +_020B7224: + ldr r2, [r0] + cmp r2, r1 + bxeq lr + add r2, r3, #1 + mov r2, r2, lsl #0x10 + ldr r3, [r0, #4] + cmp ip, r2, lsr #16 + add r0, r0, r3 + mov r3, r2, lsr #0x10 + bhi _020B7224 +_020B724C: + mov r0, #0 + bx lr + arm_func_end NNS_G2dFindBinaryBlock + + arm_func_start NNSi_G2dUnpackUserExCellAttrBank +NNSi_G2dUnpackUserExCellAttrBank: ; 0x020B7254 + ldr r1, [r0, #4] + mov ip, #0 + add r1, r1, r0 + str r1, [r0, #4] + ldrh r1, [r0] + cmp r1, #0 + bxls lr +_020B7270: + ldr r3, [r0, #4] + add r1, ip, #1 + ldr r2, [r3, ip, lsl #2] + mov r1, r1, lsl #0x10 + add r2, r0, r2 + str r2, [r3, ip, lsl #2] + ldrh r2, [r0] + mov ip, r1, lsr #0x10 + cmp r2, r1, lsr #16 + bhi _020B7270 + bx lr + arm_func_end NNSi_G2dUnpackUserExCellAttrBank + + arm_func_start DrawOneQuad_ +DrawOneQuad_: ; 0x020B729C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov ip, r3, lsl #8 + mov r0, r0, lsl #8 + ldr r3, _020B734C ; =0x04000500 + mov r4, ip, asr #0x10 + mov r0, r0, asr #0x10 + mov lr, r4, lsl #0x10 + mov r4, r0, lsl #0x10 + mov r0, r1, lsl #8 + mov ip, #1 + mov r0, r0, asr #0x10 + mov r5, r0, lsl #0x10 + mov r0, #0x10000000 + mov r1, r2, lsl #8 + mov r1, r1, asr #0x10 + mov r2, r1, lsl #0x10 + mov r7, lr, lsr #0x10 + mov r1, r4, lsr #0x10 + mov r5, r5, lsr #0x10 + mov r2, r2, lsr #0x10 + str ip, [r3] + orr r4, r1, r7, lsl #16 + sub r6, r3, #0x78 + str r4, [r6] + sub lr, r3, #0x74 + str r0, [lr] + mov ip, #0 + str ip, [lr] + orr r4, r5, r7, lsl #16 + str r4, [r6] + add r0, r0, #0x1000 + str r0, [lr] + str ip, [lr] + orr r0, r5, r2, lsl #16 + str r0, [r6] + mov r0, #0x1000 + str r0, [lr] + str ip, [lr] + orr r0, r1, r2, lsl #16 + str r0, [r6] + str ip, [lr] + str ip, [lr] + str ip, [r3, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B734C: .word 0x04000500 + arm_func_end DrawOneQuad_ + + arm_func_start NNS_G2dSetupSoftwareSpriteCamera +NNS_G2dSetupSoftwareSpriteCamera: ; 0x020B7350 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x38 + ldr r2, _020B7400 ; =0xBFFF0000 + ldr r1, _020B7404 ; =0x04000580 + mov r0, r2, lsl #6 + str r2, [r1] + str r0, [sp] + mov r1, #0x400000 + str r1, [sp, #4] + mov r0, #0 + str r1, [sp, #8] + mov r1, #1 + str r1, [sp, #0xc] + mov r2, r0 + mov r1, #0xc0000 + mov r3, #0x100000 + str r0, [sp, #0x10] + bl G3i_OrthoW_ + ldr r1, _020B7408 ; =0x0400044C + mov r5, #0 + ldr r0, _020B740C ; =_021092E0 + str r5, [r1] + add r4, sp, #0x2c + ldr ip, _020B7410 ; =_021092EC + add lr, sp, #0x20 + ldmia r0, {r0, r1, r2} + stmia lr, {r0, r1, r2} + add r3, sp, #0x14 + ldmia ip, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r2, r3 + str r5, [r4] + str r5, [r4, #4] + str r5, [r4, #8] + mov r0, r4 + mov r1, lr + mov r3, #1 + str r5, [sp] + bl G3i_LookAt_ + ldr r0, _020B7414 ; =0x04000440 + mov r1, #1 + str r1, [r0] + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B7400: .word 0xBFFF0000 +_020B7404: .word 0x04000580 +_020B7408: .word 0x0400044C +_020B740C: .word _021092E0 +_020B7410: .word _021092EC +_020B7414: .word 0x04000440 + arm_func_end NNS_G2dSetupSoftwareSpriteCamera + + arm_func_start NNS_G2dDrawSpriteFast +NNS_G2dDrawSpriteFast: ; 0x020B7418 + stmdb sp!, {r4, lr} + ldr lr, _020B747C ; =0x04000470 + mov r0, r0, lsl #0xc + str r0, [lr] + mov r4, r1, lsl #0xc + ldr ip, [sp, #8] + str r4, [lr] + mov r4, r2, lsl #0xc + ldr r0, [sp, #0xc] + ldr r1, [sp, #0x14] + ldr r2, [sp, #0x10] + str r4, [lr] + mov r4, r3, lsl #0xc + ldr r3, [sp, #0x18] + mov ip, ip, lsl #0xc + str r4, [lr, #-4]! + str ip, [lr] + mov ip, #0x1000 + mov r0, r0, lsl #0xc + mov r1, r1, lsl #0xc + mov r2, r2, lsl #0xc + mov r3, r3, lsl #0xc + str ip, [lr] + bl DrawOneQuad_ + ldmia sp!, {r4, pc} + .align 2, 0 +_020B747C: .word 0x04000470 + arm_func_end NNS_G2dDrawSpriteFast + + arm_func_start SequenceEdgeHandle_ +SequenceEdgeHandle_: ; 0x020B7480 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x18] + cmp r0, #0 + ldreq r0, [r4, #0x1c] + ldreq r0, [r0, #8] + cmp r0, #3 + cmpne r0, #4 + bne _020B751C + ldr r0, [r4, #8] + eor r0, r0, #1 + str r0, [r4, #8] + ldr r1, [r4, #0x1c] + ldr r2, [r4] + ldrh r0, [r1, #2] + ldr r1, [r1, #0xc] + add r0, r1, r0, lsl #3 + sub r0, r0, #8 + cmp r2, r0 + bhi _020B7564 + ldr r0, [r4, #0x20] + cmp r0, #1 + bne _020B74EC + ldr r0, [r4, #0x24] + ldr r1, [r4, #0x10] + ldr r2, [r4, #0x28] + blx r2 +_020B74EC: + ldr r0, [r4, #0x18] + cmp r0, #0 + ldreq r0, [r4, #0x1c] + ldreq r0, [r0, #8] + cmp r0, #2 + cmpne r0, #4 + movne r0, #0 + strne r0, [r4, #0xc] + bne _020B7564 + mov r0, r4 + bl NNS_G2dResetAnimCtrlState + b _020B7564 +_020B751C: + ldr r0, [r4, #0x20] + cmp r0, #1 + bne _020B7538 + ldr r0, [r4, #0x24] + ldr r1, [r4, #0x10] + ldr r2, [r4, #0x28] + blx r2 +_020B7538: + ldr r0, [r4, #0x18] + cmp r0, #0 + ldreq r0, [r4, #0x1c] + ldreq r0, [r0, #8] + cmp r0, #2 + cmpne r0, #4 + movne r0, #0 + strne r0, [r4, #0xc] + bne _020B7564 + mov r0, r4 + bl NNS_G2dResetAnimCtrlState +_020B7564: + ldr r1, [r4, #0x1c] + ldr r2, [r4] + ldrh r0, [r1] + ldr r1, [r1, #0xc] + add r0, r1, r0, lsl #3 + sub r0, r0, #8 + cmp r2, r0 + strhi r0, [r4] + ldmhiia sp!, {r4, pc} + cmp r2, r1 + strlo r1, [r4] + ldmia sp!, {r4, pc} + arm_func_end SequenceEdgeHandle_ + + arm_func_start SetAnimCtrlCurrentFrameImpl_ +SetAnimCtrlCurrentFrameImpl_: ; 0x020B7594 + ldr r3, [r0, #0x1c] + ldrh r2, [r3] + cmp r1, r2 + bhs _020B75C4 + ldr r2, [r3, #0xc] + add r2, r2, r1, lsl #3 + str r2, [r0] + ldrh r1, [r2, #4] + cmp r1, #0 + strne r2, [r0, #4] + mov r0, #1 + bx lr +_020B75C4: + mov r0, #0 + bx lr + arm_func_end SetAnimCtrlCurrentFrameImpl_ + + arm_func_start NNS_G2dGetAnimCtrlCurrentElement +NNS_G2dGetAnimCtrlCurrentElement: ; 0x020B75CC + ldr r0, [r0, #4] + ldr r0, [r0] + bx lr + arm_func_end NNS_G2dGetAnimCtrlCurrentElement + + arm_func_start NNS_G2dTickAnimCtrl +NNS_G2dTickAnimCtrl: ; 0x020B75D8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r0, [sl, #0xc] + mov sb, #0 + cmp r0, #1 + movne r0, sb + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl, #0x14] + smull r2, r1, r0, r1 + adds r0, r2, #0x800 + adc r1, r1, sb + mov r0, r0, lsr #0xc + orr r0, r0, r1, lsl #20 + bl abs + mov r4, #1 + ldr r1, [sl, #0x10] + mov fp, sb + add r0, r1, r0 + str r0, [sl, #0x10] + mov r8, r4 + mov r7, sb + mov r5, sb + mov r6, r4 + b _020B7754 +_020B7638: + ldr r0, [sl] + ldr r1, [sl, #0x10] + ldrh r0, [r0, #4] + mov sb, r8 + sub r0, r1, r0, lsl #12 + str r0, [sl, #0x10] + ldr r0, [sl, #0x14] + cmp r0, #0 + movgt r1, r8 + ldr r0, [sl, #8] + movle r1, r7 + teq r1, r0 + ldr r0, [sl] + addne r0, r0, #8 + subeq r0, r0, #8 + str r0, [sl] + ldr r1, [sl, #0x14] + ldr r0, [sl] + cmp r1, #0 + movgt r2, r6 + ldr r1, [sl, #8] + movle r2, r5 + teq r2, r1 + ldr r1, [sl, #0x1c] + ldr r2, [r1, #0xc] + beq _020B76B8 + ldrh r1, [r1] + add r1, r2, r1, lsl #3 + cmp r0, r1 + movhs r0, r4 + movlo r0, fp + b _020B76D0 +_020B76B8: + ldrh r1, [r1, #2] + add r1, r2, r1, lsl #3 + sub r1, r1, #8 + cmp r0, r1 + movls r0, #1 + movhi r0, #0 +_020B76D0: + cmp r0, #0 + beq _020B76E0 + mov r0, sl + bl SequenceEdgeHandle_ +_020B76E0: + ldr r1, [sl] + ldrh r0, [r1, #4] + cmp r0, #0 + strne r1, [sl, #4] + ldr r0, [sl, #0x20] + cmp r0, #0 + beq _020B7754 + ldr r0, [sl, #0x1c] + ldr r2, [sl, #0x20] + ldr r0, [r0, #0xc] + cmp r2, #2 + ldr r1, [sl] + sub r0, r1, r0 + mov r0, r0, lsl #0xd + mov r1, r0, lsr #0x10 + beq _020B772C + cmp r2, #3 + beq _020B7748 + b _020B7754 +_020B772C: + ldrh r0, [sl, #0x2c] + cmp r1, r0 + bne _020B7754 + ldr r0, [sl, #0x24] + ldr r2, [sl, #0x28] + blx r2 + b _020B7754 +_020B7748: + ldr r0, [sl, #0x24] + ldr r2, [sl, #0x28] + blx r2 +_020B7754: + ldr r0, [sl, #0xc] + cmp r0, #0 + beq _020B7778 + ldr r0, [sl] + ldr r1, [sl, #0x10] + ldrh r0, [r0, #4] + cmp r1, r0, lsl #12 + movge r0, #1 + bge _020B777C +_020B7778: + mov r0, #0 +_020B777C: + cmp r0, #0 + bne _020B7638 + mov r0, sb + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G2dTickAnimCtrl + + arm_func_start NNS_G2dSetAnimCtrlCurrentFrame +NNS_G2dSetAnimCtrlCurrentFrame: ; 0x020B778C + stmdb sp!, {r4, lr} + mov r4, r0 + bl SetAnimCtrlCurrentFrameImpl_ + cmp r0, #0 + movne r1, #0 + strne r1, [r4, #0x10] + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dSetAnimCtrlCurrentFrame + + arm_func_start NNS_G2dGetAnimCtrlCurrentFrame +NNS_G2dGetAnimCtrlCurrentFrame: ; 0x020B77A8 + ldr r1, [r0, #0x1c] + ldr r2, [r0] + ldr r0, [r1, #0xc] + sub r0, r2, r0 + mov r0, r0, lsl #0xd + mov r0, r0, lsr #0x10 + bx lr + arm_func_end NNS_G2dGetAnimCtrlCurrentFrame + + arm_func_start NNS_G2dInitAnimCtrl +NNS_G2dInitAnimCtrl: ; 0x020B77C4 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x20 + bl NNS_G2dInitAnimCallBackFunctor + mov r1, #0 + str r1, [r4] + str r1, [r4, #4] + str r1, [r4, #8] + mov r0, #1 + str r0, [r4, #0xc] + str r1, [r4, #0x10] + mov r0, #0x1000 + str r0, [r4, #0x14] + str r1, [r4, #0x18] + str r1, [r4, #0x1c] + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dInitAnimCtrl + + arm_func_start NNS_G2dInitAnimCallBackFunctor +NNS_G2dInitAnimCallBackFunctor: ; 0x020B7804 + mov r1, #0 + str r1, [r0] + str r1, [r0, #4] + str r1, [r0, #8] + strh r1, [r0, #0xc] + bx lr + arm_func_end NNS_G2dInitAnimCallBackFunctor + + arm_func_start NNS_G2dResetAnimCtrlState +NNS_G2dResetAnimCtrlState: ; 0x020B781C + ldr r1, [r0, #0x14] + cmp r1, #0 + movgt r2, #1 + ldr r1, [r0, #8] + movle r2, #0 + teq r2, r1 + ldr r2, [r0, #0x1c] + beq _020B784C + ldrh r1, [r2, #2] + ldr r2, [r2, #0xc] + add r1, r2, r1, lsl #3 + b _020B785C +_020B784C: + ldrh r1, [r2] + ldr r2, [r2, #0xc] + add r1, r2, r1, lsl #3 + sub r1, r1, #8 +_020B785C: + str r1, [r0] + ldr r2, [r0] + ldr ip, _020B7878 ; =NNS_G2dTickAnimCtrl + mov r1, #0 + str r2, [r0, #4] + str r1, [r0, #0x10] + bx ip + .align 2, 0 +_020B7878: .word NNS_G2dTickAnimCtrl + arm_func_end NNS_G2dResetAnimCtrlState + + arm_func_start NNS_G2dBindAnimCtrl +NNS_G2dBindAnimCtrl: ; 0x020B787C + ldr ip, _020B7888 ; =NNS_G2dResetAnimCtrlState + str r1, [r0, #0x1c] + bx ip + .align 2, 0 +_020B7888: .word NNS_G2dResetAnimCtrlState + arm_func_end NNS_G2dBindAnimCtrl + + arm_func_start NNSi_G2dIsAnimCtrlLoopAnim +NNSi_G2dIsAnimCtrlLoopAnim: ; 0x020B788C + ldr r1, [r0, #0x18] + cmp r1, #0 + ldreq r0, [r0, #0x1c] + ldreq r1, [r0, #8] + cmp r1, #2 + cmpne r1, #4 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end NNSi_G2dIsAnimCtrlLoopAnim + + arm_func_start CpuLoadOAMSub_ +CpuLoadOAMSub_: ; 0x020B78B0 + ldr ip, _020B78C0 ; =MIi_CpuCopy16 + add r1, r1, #0x400 + add r1, r1, #0x7000000 + bx ip + .align 2, 0 +_020B78C0: .word MIi_CpuCopy16 + arm_func_end CpuLoadOAMSub_ + + arm_func_start CpuLoadOAMMain_ +CpuLoadOAMMain_: ; 0x020B78C4 + ldr ip, _020B78D0 ; =MIi_CpuCopy16 + add r1, r1, #0x7000000 + bx ip + .align 2, 0 +_020B78D0: .word MIi_CpuCopy16 + arm_func_end CpuLoadOAMMain_ + + arm_func_start NNS_G2dInitOamManagerModule +NNS_G2dInitOamManagerModule: ; 0x020B78D4 + stmdb sp!, {r3, lr} + ldr r1, _020B796C ; =_021D8618 + mov r0, #0xc0 + mov r2, #0x400 + bl MIi_CpuClear16 + ldr r1, _020B7970 ; =_021D8B58 + mov r0, #0xc0 + mov r2, #0x400 + bl MIi_CpuClear16 + ldr r1, _020B7974 ; =_021D9098 + mov r0, #0xc0 + mov r2, #0x400 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B797C ; =_021D8518 + mov r2, #0x100 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B7980 ; =_021D8A58 + mov r2, #0x100 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B7984 ; =_021D8F98 + mov r2, #0x100 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B7988 ; =_021D8A18 + mov r2, #0x40 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B798C ; =_021D8F58 + mov r2, #0x40 + bl MIi_CpuClear16 + ldr r0, _020B7978 ; =0x0000FFFF + ldr r1, _020B7990 ; =_021D9498 + mov r2, #0x40 + bl MIi_CpuClear16 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B796C: .word _021D8618 +_020B7970: .word _021D8B58 +_020B7974: .word _021D9098 +_020B7978: .word 0x0000FFFF +_020B797C: .word _021D8518 +_020B7980: .word _021D8A58 +_020B7984: .word _021D8F98 +_020B7988: .word _021D8A18 +_020B798C: .word _021D8F58 +_020B7990: .word _021D9498 + arm_func_end NNS_G2dInitOamManagerModule + + arm_func_start NNS_G2dGetNewOamManagerInstance +NNS_G2dGetNewOamManagerInstance: ; 0x020B7994 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, [sp, #0x1c] + ldr r6, _020B7B04 ; =_021D8518 + mov r4, #0x540 + mla r4, r5, r4, r6 + mov ip, r1 + sub r1, r2, #1 + add r1, ip, r1 + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x10 + add lr, r4, ip, lsl #1 + add r7, r4, r2, lsl #1 + mov r6, r0 + mov r5, r3 + cmp lr, r7 + bhi _020B79F4 + ldr r0, _020B7B08 ; =0x0000FFFF +_020B79D8: + ldrh r1, [lr] + cmp r1, r0 + movne r0, #0 + bne _020B79F8 + add lr, lr, #2 + cmp lr, r7 + bls _020B79D8 +_020B79F4: + mov r0, #1 +_020B79F8: + cmp r0, #0 + beq _020B7A3C + ldr r0, _020B7B0C ; =_021D8514 + sub r1, r2, ip + ldrh r7, [r0] + add r3, r1, #1 + add r1, r4, ip, lsl #1 + add lr, r7, #1 + strh lr, [r0] + strh r7, [r6, #0x10] + strh ip, [r6, #4] + strh r2, [r6, #6] + strh ip, [r6, #8] + ldrh r0, [r6, #0x10] + mov r2, r3, lsl #1 + bl MIi_CpuClear16 + b _020B7A44 +_020B7A3C: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B7A44: + ldrh r0, [sp, #0x18] + add r3, r4, #0x500 + cmp r0, #0 + bne _020B7A70 + mov r0, #0x20 + strh r0, [r6, #0xa] + mov r0, #0 + strh r0, [r6, #0xc] + ldrh r0, [r6, #0xa] + strh r0, [r6, #0xe] + b _020B7AEC +_020B7A70: + sub r0, r0, #1 + add r0, r5, r0 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + add r7, r3, r5, lsl #1 + add r4, r3, r2, lsl #1 + cmp r7, r4 + bhi _020B7AB0 + ldr r0, _020B7B08 ; =0x0000FFFF +_020B7A94: + ldrh r1, [r7] + cmp r1, r0 + movne r0, #0 + bne _020B7AB4 + add r7, r7, #2 + cmp r7, r4 + bls _020B7A94 +_020B7AB0: + mov r0, #1 +_020B7AB4: + cmp r0, #0 + beq _020B7AE4 + strh r5, [r6, #0xa] + strh r2, [r6, #0xc] + strh r5, [r6, #0xe] + sub r0, r2, r5 + add r2, r0, #1 + ldrh r0, [r6, #0x10] + add r1, r3, r5, lsl #1 + mov r2, r2, lsl #1 + bl MIi_CpuClear16 + b _020B7AEC +_020B7AE4: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B7AEC: + mov r1, #0 + ldr r0, [sp, #0x1c] + str r1, [r6, #0x14] + str r0, [r6] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B7B04: .word _021D8518 +_020B7B08: .word 0x0000FFFF +_020B7B0C: .word _021D8514 + arm_func_end NNS_G2dGetNewOamManagerInstance + + arm_func_start NNS_G2dEntryOamManagerOamWithAffineIdx +NNS_G2dEntryOamManagerOamWithAffineIdx: ; 0x020B7B10 + stmdb sp!, {r4, lr} + ldrh lr, [r0, #6] + ldrh ip, [r0, #8] + mov r4, #0 + add r3, lr, #1 + cmp ip, r3 + bgt _020B7B38 + ldrh r3, [r0, #4] + cmp r3, lr + movls r4, #1 +_020B7B38: + cmp r4, #0 + moveq r3, #0 + beq _020B7B54 + sub r3, lr, ip + add r3, r3, #1 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 +_020B7B54: + cmp r3, #1 + movhs r3, #1 + movlo r3, #0 + cmp r3, #0 + beq _020B7BE4 + ldr r4, [r0] + ldr ip, _020B7BEC ; =_021D8518 + mov r3, #0x540 + mla ip, r4, r3, ip + ldrh r3, [r0, #8] + add r4, ip, #0x100 + ldrh ip, [r1] + mov lr, r3, lsl #3 + add r3, r4, r3, lsl #3 + strh ip, [r4, lr] + ldrh lr, [r1, #2] + ldr ip, _020B7BF0 ; =0x0000FFFE + strh lr, [r3, #2] + ldrh r1, [r1, #4] + cmp r2, ip + strh r1, [r3, #4] + beq _020B7BD0 + ldr r1, [r3] + mov ip, r1, lsl #0x16 + mov ip, ip, lsr #0x1e + tst ip, #1 + beq _020B7BD0 + bic ip, r1, #0x3e000000 + mov r1, r2, lsl #0x1b + orr r1, ip, r1, lsr #2 + str r1, [r3] +_020B7BD0: + ldrh r1, [r0, #8] + add r1, r1, #1 + strh r1, [r0, #8] + mov r0, #1 + ldmia sp!, {r4, pc} +_020B7BE4: + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020B7BEC: .word _021D8518 +_020B7BF0: .word 0x0000FFFE + arm_func_end NNS_G2dEntryOamManagerOamWithAffineIdx + + arm_func_start NNS_G2dEntryOamManagerAffine +NNS_G2dEntryOamManagerAffine: ; 0x020B7BF4 + stmdb sp!, {r3, lr} + ldrh lr, [r0, #0xc] + ldrh ip, [r0, #0xe] + mov r3, #0 + add r2, lr, #1 + cmp ip, r2 + bgt _020B7C1C + ldrh r2, [r0, #0xa] + cmp r2, lr + movls r3, #1 +_020B7C1C: + cmp r3, #0 + moveq r2, #0 + beq _020B7C38 + sub r2, lr, ip + add r2, r2, #1 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 +_020B7C38: + cmp r2, #1 + movhs r2, #1 + movlo r2, #0 + cmp r2, #0 + ldreq r0, _020B7CB0 ; =0x0000FFFE + ldmeqia sp!, {r3, pc} + ldr lr, [r0] + ldr r3, _020B7CB4 ; =_021D8518 + mov r2, #0x540 + mla ip, lr, r2, r3 + ldr r3, [r1] + ldrh r2, [r0, #0xe] + add ip, ip, #0x100 + mov r3, r3, asr #4 + add ip, ip, r2, lsl #5 + strh r3, [ip, #6] + ldr r3, [r1, #4] + mov r3, r3, asr #4 + strh r3, [ip, #0xe] + ldr r3, [r1, #8] + mov r3, r3, asr #4 + strh r3, [ip, #0x16] + ldr r1, [r1, #0xc] + mov r1, r1, asr #4 + strh r1, [ip, #0x1e] + ldrh r1, [r0, #0xe] + add r1, r1, #1 + strh r1, [r0, #0xe] + mov r0, r2 + ldmia sp!, {r3, pc} + .align 2, 0 +_020B7CB0: .word 0x0000FFFE +_020B7CB4: .word _021D8518 + arm_func_end NNS_G2dEntryOamManagerAffine + + arm_func_start NNS_G2dApplyOamManagerToHW +NNS_G2dApplyOamManagerToHW: ; 0x020B7CB8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r7, r0 + ldr r0, [r7, #0x14] + cmp r0, #0 + beq _020B7D4C + ldr r6, [r7] + ldr r1, _020B7EB4 ; =_021D8518 + mov r0, #0x540 + mla r1, r6, r0, r1 + ldrh r3, [r7, #4] + ldrh r0, [r7, #6] + add r5, r1, #0x100 + mov r4, r3, lsl #3 + sub r0, r0, r3 + add r0, r0, #1 + mov r0, r0, lsl #0x13 + mov r8, r0, lsr #0x10 + mov r2, r4, lsl #0x10 + mov r1, r8 + add r0, r5, r3, lsl #3 + mov r7, r2, lsr #0x10 + bl DC_FlushRange + cmp r6, #0 + beq _020B7D24 + cmp r6, #1 + beq _020B7D38 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B7D24: + mov r1, r7 + mov r2, r8 + add r0, r5, r4 + bl GX_LoadOAM + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B7D38: + mov r1, r7 + mov r2, r8 + add r0, r5, r4 + bl GXS_LoadOAM + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B7D4C: + ldr r0, [r7] + ldr r2, _020B7EB4 ; =_021D8518 + mov r1, #0x540 + mla r2, r0, r1, r2 + ldrh r5, [r7, #4] + ldrh r1, [r7, #6] + ldr r3, _020B7EB8 ; =_021109C8 + add r4, r2, #0x100 + sub r1, r1, r5 + add r1, r1, #1 + mov r1, r1, lsl #0x10 + mov r2, r5, lsl #0x13 + add r6, r4, r5, lsl #3 + movs r5, r1, lsr #0x10 + mov r4, r2, lsr #0x10 + ldr sb, [r3, r0, lsl #2] + mov sl, #0 + beq _020B7DCC + mov r8, #6 +_020B7D98: + mov r0, r6 + mov r1, r4 + mov r2, r8 + blx sb + add r2, r4, #8 + add r0, sl, #1 + mov r1, r0, lsl #0x10 + mov r0, r2, lsl #0x10 + cmp r5, r1, lsr #16 + mov r4, r0, lsr #0x10 + add r6, r6, #8 + mov sl, r1, lsr #0x10 + bhi _020B7D98 +_020B7DCC: + ldrh r2, [r7, #0xc] + ldrh r1, [r7, #0xe] + mov r3, #0 + add r0, r2, #1 + cmp r1, r0 + bgt _020B7DF0 + ldrh r0, [r7, #0xa] + cmp r0, r2 + movls r3, #1 +_020B7DF0: + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r7] + ldr r2, _020B7EB4 ; =_021D8518 + mov r1, #0x540 + mla r2, r0, r1, r2 + ldr r3, _020B7EB8 ; =_021109C8 + ldrh r5, [r7, #0xa] + ldrh r1, [r7, #0xc] + add r4, r2, #0x100 + mov r2, r5, lsl #0x15 + sub r1, r1, r5 + add r1, r1, #1 + mov r1, r1, lsl #0x10 + ldr r6, [r3, r0, lsl #2] + add sl, r4, r5, lsl #5 + movs sb, r1, lsr #0x10 + mov r8, r2, lsr #0x10 + mov r7, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r5, #2 + mov r4, r5 + mov fp, r5 +_020B7E4C: + mov r2, r5 + add r0, sl, #6 + add r1, r8, #6 + blx r6 + mov r2, r4 + add r0, sl, #0xe + add r1, r8, #0xe + blx r6 + add r0, sl, #0x16 + add r1, r8, #0x16 + mov r2, fp + blx r6 + add r0, sl, #0x1e + add r1, r8, #0x1e + mov r2, #2 + blx r6 + add r0, r8, #0x20 + mov r0, r0, lsl #0x10 + mov r8, r0, lsr #0x10 + add r0, r7, #1 + mov r0, r0, lsl #0x10 + add sl, sl, #0x20 + cmp sb, r0, lsr #16 + mov r7, r0, lsr #0x10 + bhi _020B7E4C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B7EB4: .word _021D8518 +_020B7EB8: .word _021109C8 + arm_func_end NNS_G2dApplyOamManagerToHW + + arm_func_start NNS_G2dResetOamManagerBuffer +NNS_G2dResetOamManagerBuffer: ; 0x020B7EBC + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + ldr r0, [r5, #0x14] + cmp r0, #0 + beq _020B7F74 + ldrh r3, [r5, #6] + ldrh r1, [r5, #8] + mov r2, #0 + add r0, r3, #1 + cmp r1, r0 + bgt _020B7EF4 + ldrh r0, [r5, #4] + cmp r0, r3 + movls r2, #1 +_020B7EF4: + cmp r2, #0 + moveq r4, #0 + beq _020B7F14 + ldrh r0, [r5, #4] + sub r0, r3, r0 + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0xd +_020B7F14: + ldr r2, [r5] + ldr r1, _020B7FDC ; =_021D8518 + mov r0, #0x540 + mla r1, r2, r0, r1 + add r2, r1, #0x100 + ldrh r0, [r5, #4] + mov r1, r4 + add r6, r2, r0, lsl #3 + mov r0, r6 + bl DC_InvalidateRange + ldr r0, _020B7FE0 ; =GXi_DmaId + mvn r1, #0 + ldr r0, [r0] + cmp r0, r1 + mov r1, r6 + beq _020B7F64 + mov r3, r4 + mov r2, #0xc0 + bl MI_DmaFill32 + b _020B7FC8 +_020B7F64: + mov r2, r4 + mov r0, #0xc0 + bl MIi_CpuClear32 + b _020B7FC8 +_020B7F74: + ldr r2, [r5] + ldr r1, _020B7FDC ; =_021D8518 + mov r0, #0x540 + mla r1, r2, r0, r1 + ldrh r2, [r5, #4] + ldrh r0, [r5, #6] + add r1, r1, #0x100 + add r3, r1, r2, lsl #3 + sub r0, r0, r2 + add r0, r0, #1 + mov r0, r0, lsl #0x10 + movs r2, r0, lsr #0x10 + mov r0, #0 + beq _020B7FC8 + mov r1, #0xc0 +_020B7FB0: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + cmp r2, r0, lsr #16 + strh r1, [r3], #8 + mov r0, r0, lsr #0x10 + bhi _020B7FB0 +_020B7FC8: + ldrh r0, [r5, #4] + strh r0, [r5, #8] + ldrh r0, [r5, #0xa] + strh r0, [r5, #0xe] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B7FDC: .word _021D8518 +_020B7FE0: .word GXi_DmaId + arm_func_end NNS_G2dResetOamManagerBuffer + + arm_func_start NNS_G2dApplyAndResetOamManagerBuffer +NNS_G2dApplyAndResetOamManagerBuffer: ; 0x020B7FE4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl NNS_G2dApplyOamManagerToHW + mov r0, r4 + bl NNS_G2dResetOamManagerBuffer + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dApplyAndResetOamManagerBuffer + + arm_func_start NNS_G2dGetPaletteTableValue +NNS_G2dGetPaletteTableValue: ; 0x020B7FFC + mov r1, r1, lsl #1 + ldrh r0, [r0, r1] + bx lr + arm_func_end NNS_G2dGetPaletteTableValue + + arm_func_start NNS_G2dInitImageProxy +NNS_G2dInitImageProxy: ; 0x020B8008 + mov r2, #0 + mvn r1, #0 +_020B8010: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #3 + blt _020B8010 + bx lr + arm_func_end NNS_G2dInitImageProxy + + arm_func_start NNS_G2dSetImageLocation +NNS_G2dSetImageLocation: ; 0x020B8024 + str r2, [r0, r1, lsl #2] + bx lr + arm_func_end NNS_G2dSetImageLocation + + arm_func_start NNS_G2dGetImageLocation +NNS_G2dGetImageLocation: ; 0x020B802C + ldr r0, [r0, r1, lsl #2] + bx lr + arm_func_end NNS_G2dGetImageLocation + + arm_func_start NNS_G2dIsImageReadyToUse +NNS_G2dIsImageReadyToUse: ; 0x020B8034 + ldr r1, [r0, r1, lsl #2] + mvn r0, #0 + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end NNS_G2dIsImageReadyToUse + + arm_func_start NNS_G2dInitImagePaletteProxy +NNS_G2dInitImagePaletteProxy: ; 0x020B804C + mov r3, #0 + mvn r2, #0 +_020B8054: + add r1, r0, r3, lsl #2 + add r3, r3, #1 + str r2, [r1, #8] + cmp r3, #3 + blt _020B8054 + bx lr + arm_func_end NNS_G2dInitImagePaletteProxy + + arm_func_start NNS_G2dSetImagePaletteLocation +NNS_G2dSetImagePaletteLocation: ; 0x020B806C + add r0, r0, r1, lsl #2 + str r2, [r0, #8] + bx lr + arm_func_end NNS_G2dSetImagePaletteLocation + + arm_func_start NNS_G2dGetImagePaletteLocation +NNS_G2dGetImagePaletteLocation: ; 0x020B8078 + add r0, r0, r1, lsl #2 + ldr r0, [r0, #8] + bx lr + arm_func_end NNS_G2dGetImagePaletteLocation + + arm_func_start NNS_G2dIsImagePaletteReadyToUse +NNS_G2dIsImagePaletteReadyToUse: ; 0x020B8084 + add r0, r0, r1, lsl #2 + ldr r1, [r0, #8] + mvn r0, #0 + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end NNS_G2dIsImagePaletteReadyToUse + + arm_func_start NNS_G2dLoadImage1DMapping +NNS_G2dLoadImage1DMapping: ; 0x020B80A0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + movs r5, r2 + mov r6, r1 + mov r4, r3 + ldr r0, [r7, #8] + beq _020B8104 + cmp r5, #1 + beq _020B80D0 + cmp r5, #2 + beq _020B80EC + b _020B8104 +_020B80D0: + mov r3, #0x4000000 + ldr r2, [r3] + ldr r1, _020B82C4 ; =0xFFCFFFEF + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] + b _020B8104 +_020B80EC: + ldr r3, _020B82C8 ; =0x04001000 + ldr r1, _020B82C4 ; =0xFFCFFFEF + ldr r2, [r3] + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] +_020B8104: + ldr r0, [r7, #0x14] + ldr r1, [r7, #0x10] + bl DC_FlushRange + cmp r5, #0 + beq _020B812C + cmp r5, #1 + beq _020B8148 + cmp r5, #2 + beq _020B815C + b _020B816C +_020B812C: + bl GX_BeginLoadTex + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GX_LoadTex + bl GX_EndLoadTex + b _020B816C +_020B8148: + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GX_LoadOBJ + b _020B816C +_020B815C: + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GXS_LoadOBJ +_020B816C: + ldr r0, [r7, #8] + cmp r0, #0 + ldrh r0, [r7, #2] + bne _020B8284 + cmp r0, #0x10 + bgt _020B81B8 + bge _020B81E4 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B81F4 +_020B8194: ; jump table + b _020B81F4 ; case 0 + b _020B81C4 ; case 1 + b _020B81CC ; case 2 + b _020B81F4 ; case 3 + b _020B81D4 ; case 4 + b _020B81F4 ; case 5 + b _020B81F4 ; case 6 + b _020B81F4 ; case 7 + b _020B81DC ; case 8 +_020B81B8: + cmp r0, #0x20 + beq _020B81EC + b _020B81F4 +_020B81C4: + mov r0, #0 + b _020B81F8 +_020B81CC: + mov r0, #1 + b _020B81F8 +_020B81D4: + mov r0, #2 + b _020B81F8 +_020B81DC: + mov r0, #3 + b _020B81F8 +_020B81E4: + mov r0, #4 + b _020B81F8 +_020B81EC: + mov r0, #5 + b _020B81F8 +_020B81F4: + mov r0, #0 +_020B81F8: + str r0, [r4, #0xc] + ldrh r0, [r7] + cmp r0, #0x10 + bgt _020B823C + bge _020B8268 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B8278 +_020B8218: ; jump table + b _020B8278 ; case 0 + b _020B8248 ; case 1 + b _020B8250 ; case 2 + b _020B8278 ; case 3 + b _020B8258 ; case 4 + b _020B8278 ; case 5 + b _020B8278 ; case 6 + b _020B8278 ; case 7 + b _020B8260 ; case 8 +_020B823C: + cmp r0, #0x20 + beq _020B8270 + b _020B8278 +_020B8248: + mov r0, #0 + b _020B827C +_020B8250: + mov r0, #1 + b _020B827C +_020B8258: + mov r0, #2 + b _020B827C +_020B8260: + mov r0, #3 + b _020B827C +_020B8268: + mov r0, #4 + b _020B827C +_020B8270: + mov r0, #5 + b _020B827C +_020B8278: + mov r0, #0 +_020B827C: + str r0, [r4, #0x10] + b _020B8290 +_020B8284: + str r0, [r4, #0xc] + ldrh r0, [r7] + str r0, [r4, #0x10] +_020B8290: + ldr r1, [r7, #4] + mov r0, #0 + str r1, [r4, #0x14] + str r0, [r4, #0x18] + mov r0, #1 + str r0, [r4, #0x1c] + ldr r3, [r7, #8] + mov r0, r4 + mov r1, r5 + mov r2, r6 + str r3, [r4, #0x20] + bl NNS_G2dSetImageLocation + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B82C4: .word 0xFFCFFFEF +_020B82C8: .word 0x04001000 + arm_func_end NNS_G2dLoadImage1DMapping + + arm_func_start NNS_G2dLoadImage2DMapping +NNS_G2dLoadImage2DMapping: ; 0x020B82CC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + movs r5, r2 + mov r6, r1 + mov r4, r3 + ldr r0, [r7, #8] + beq _020B8330 + cmp r5, #1 + beq _020B82FC + cmp r5, #2 + beq _020B8318 + b _020B8330 +_020B82FC: + mov r3, #0x4000000 + ldr r2, [r3] + ldr r1, _020B84F0 ; =0xFFCFFFEF + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] + b _020B8330 +_020B8318: + ldr r3, _020B84F4 ; =0x04001000 + ldr r1, _020B84F0 ; =0xFFCFFFEF + ldr r2, [r3] + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] +_020B8330: + ldr r0, [r7, #0x14] + ldr r1, [r7, #0x10] + bl DC_FlushRange + cmp r5, #0 + beq _020B8358 + cmp r5, #1 + beq _020B8374 + cmp r5, #2 + beq _020B8388 + b _020B8398 +_020B8358: + bl GX_BeginLoadTex + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GX_LoadTex + bl GX_EndLoadTex + b _020B8398 +_020B8374: + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GX_LoadOBJ + b _020B8398 +_020B8388: + ldr r0, [r7, #0x14] + ldr r2, [r7, #0x10] + mov r1, r6 + bl GXS_LoadOBJ +_020B8398: + ldr r0, [r7, #8] + cmp r0, #0 + ldrh r0, [r7, #2] + bne _020B84B0 + cmp r0, #0x10 + bgt _020B83E4 + bge _020B8410 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B8420 +_020B83C0: ; jump table + b _020B8420 ; case 0 + b _020B83F0 ; case 1 + b _020B83F8 ; case 2 + b _020B8420 ; case 3 + b _020B8400 ; case 4 + b _020B8420 ; case 5 + b _020B8420 ; case 6 + b _020B8420 ; case 7 + b _020B8408 ; case 8 +_020B83E4: + cmp r0, #0x20 + beq _020B8418 + b _020B8420 +_020B83F0: + mov r0, #0 + b _020B8424 +_020B83F8: + mov r0, #1 + b _020B8424 +_020B8400: + mov r0, #2 + b _020B8424 +_020B8408: + mov r0, #3 + b _020B8424 +_020B8410: + mov r0, #4 + b _020B8424 +_020B8418: + mov r0, #5 + b _020B8424 +_020B8420: + mov r0, #0 +_020B8424: + str r0, [r4, #0xc] + ldrh r0, [r7] + cmp r0, #0x10 + bgt _020B8468 + bge _020B8494 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B84A4 +_020B8444: ; jump table + b _020B84A4 ; case 0 + b _020B8474 ; case 1 + b _020B847C ; case 2 + b _020B84A4 ; case 3 + b _020B8484 ; case 4 + b _020B84A4 ; case 5 + b _020B84A4 ; case 6 + b _020B84A4 ; case 7 + b _020B848C ; case 8 +_020B8468: + cmp r0, #0x20 + beq _020B849C + b _020B84A4 +_020B8474: + mov r0, #0 + b _020B84A8 +_020B847C: + mov r0, #1 + b _020B84A8 +_020B8484: + mov r0, #2 + b _020B84A8 +_020B848C: + mov r0, #3 + b _020B84A8 +_020B8494: + mov r0, #4 + b _020B84A8 +_020B849C: + mov r0, #5 + b _020B84A8 +_020B84A4: + mov r0, #0 +_020B84A8: + str r0, [r4, #0x10] + b _020B84BC +_020B84B0: + str r0, [r4, #0xc] + ldrh r0, [r7] + str r0, [r4, #0x10] +_020B84BC: + ldr r1, [r7, #4] + mov r0, #0 + str r1, [r4, #0x14] + str r0, [r4, #0x18] + mov r0, #1 + str r0, [r4, #0x1c] + ldr r3, [r7, #8] + mov r0, r4 + mov r1, r5 + mov r2, r6 + str r3, [r4, #0x20] + bl NNS_G2dSetImageLocation + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B84F0: .word 0xFFCFFFEF +_020B84F4: .word 0x04001000 + arm_func_end NNS_G2dLoadImage2DMapping + + arm_func_start NNS_G2dLoadImageVramTransfer +NNS_G2dLoadImageVramTransfer: ; 0x020B84F8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + ldr r0, [r7, #0x14] + ldr r1, [r7, #0x10] + mov r5, r2 + mov r4, r3 + bl DC_FlushRange + cmp r5, #0 + ldr r0, [r7, #8] + beq _020B856C + cmp r5, #1 + beq _020B8538 + cmp r5, #2 + beq _020B8554 + b _020B856C +_020B8538: + mov r3, #0x4000000 + ldr r2, [r3] + ldr r1, _020B86C4 ; =0xFFCFFFEF + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] + b _020B856C +_020B8554: + ldr r3, _020B86C8 ; =0x04001000 + ldr r1, _020B86C4 ; =0xFFCFFFEF + ldr r2, [r3] + and r1, r2, r1 + orr r0, r1, r0 + str r0, [r3] +_020B856C: + ldr r0, [r7, #8] + cmp r0, #0 + ldrh r0, [r7, #2] + bne _020B8684 + cmp r0, #0x10 + bgt _020B85B8 + bge _020B85E4 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B85F4 +_020B8594: ; jump table + b _020B85F4 ; case 0 + b _020B85C4 ; case 1 + b _020B85CC ; case 2 + b _020B85F4 ; case 3 + b _020B85D4 ; case 4 + b _020B85F4 ; case 5 + b _020B85F4 ; case 6 + b _020B85F4 ; case 7 + b _020B85DC ; case 8 +_020B85B8: + cmp r0, #0x20 + beq _020B85EC + b _020B85F4 +_020B85C4: + mov r0, #0 + b _020B85F8 +_020B85CC: + mov r0, #1 + b _020B85F8 +_020B85D4: + mov r0, #2 + b _020B85F8 +_020B85DC: + mov r0, #3 + b _020B85F8 +_020B85E4: + mov r0, #4 + b _020B85F8 +_020B85EC: + mov r0, #5 + b _020B85F8 +_020B85F4: + mov r0, #0 +_020B85F8: + str r0, [r4, #0xc] + ldrh r0, [r7] + cmp r0, #0x10 + bgt _020B863C + bge _020B8668 + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B8678 +_020B8618: ; jump table + b _020B8678 ; case 0 + b _020B8648 ; case 1 + b _020B8650 ; case 2 + b _020B8678 ; case 3 + b _020B8658 ; case 4 + b _020B8678 ; case 5 + b _020B8678 ; case 6 + b _020B8678 ; case 7 + b _020B8660 ; case 8 +_020B863C: + cmp r0, #0x20 + beq _020B8670 + b _020B8678 +_020B8648: + mov r0, #0 + b _020B867C +_020B8650: + mov r0, #1 + b _020B867C +_020B8658: + mov r0, #2 + b _020B867C +_020B8660: + mov r0, #3 + b _020B867C +_020B8668: + mov r0, #4 + b _020B867C +_020B8670: + mov r0, #5 + b _020B867C +_020B8678: + mov r0, #0 +_020B867C: + str r0, [r4, #0x10] + b _020B8690 +_020B8684: + str r0, [r4, #0xc] + ldrh r0, [r7] + str r0, [r4, #0x10] +_020B8690: + ldr r1, [r7, #4] + mov r0, #0 + str r1, [r4, #0x14] + str r0, [r4, #0x18] + mov r0, #1 + str r0, [r4, #0x1c] + ldr r3, [r7, #8] + mov r0, r4 + mov r1, r5 + mov r2, r6 + str r3, [r4, #0x20] + bl NNS_G2dSetImageLocation + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B86C4: .word 0xFFCFFFEF +_020B86C8: .word 0x04001000 + arm_func_end NNS_G2dLoadImageVramTransfer + + arm_func_start NNS_G2dLoadPalette +NNS_G2dLoadPalette: ; 0x020B86CC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r4, [sb, #0xc] + ldr r5, [sb, #8] + mov r8, r1 + mov r7, r2 + mov r0, r4 + mov r1, r5 + mov r6, r3 + bl DC_FlushRange + cmp r7, #0 + beq _020B8788 + cmp r7, #1 + beq _020B8710 + cmp r7, #2 + beq _020B874C + b _020B87A0 +_020B8710: + ldr r0, [sb, #4] + cmp r0, #0 + beq _020B8738 + bl GX_BeginLoadOBJExtPltt + mov r0, r4 + mov r1, r8 + mov r2, r5 + bl GX_LoadOBJExtPltt + bl GX_EndLoadOBJExtPltt + b _020B87A0 +_020B8738: + mov r0, r4 + mov r1, r8 + mov r2, r5 + bl GX_LoadOBJPltt + b _020B87A0 +_020B874C: + ldr r0, [sb, #4] + cmp r0, #0 + beq _020B8774 + bl GXS_BeginLoadOBJExtPltt + mov r0, r4 + mov r1, r8 + mov r2, r5 + bl GXS_LoadOBJExtPltt + bl GXS_EndLoadOBJExtPltt + b _020B87A0 +_020B8774: + mov r0, r4 + mov r1, r8 + mov r2, r5 + bl GXS_LoadOBJPltt + b _020B87A0 +_020B8788: + bl GX_BeginLoadTexPltt + mov r0, r4 + mov r1, r8 + mov r2, r5 + bl GX_LoadTexPltt + bl GX_EndLoadTexPltt +_020B87A0: + ldr r1, [sb] + mov r0, r6 + str r1, [r6] + ldr r3, [sb, #4] + mov r1, r7 + mov r2, r8 + str r3, [r6, #4] + bl NNS_G2dSetImagePaletteLocation + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end NNS_G2dLoadPalette + + arm_func_start NNS_G2dLoadPaletteEx +NNS_G2dLoadPaletteEx: ; 0x020B87C4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + ldr r0, [sl] + str r1, [sp] + cmp r0, #3 + ldr r0, [sp, #0x30] + moveq r8, #0x20 + str r0, [sp, #0x30] + ldr r0, [sp] + mov sb, r2 + ldrh r0, [r0] + mov fp, r3 + movne r8, #0x200 + str r0, [sp, #4] + mov r7, #0 + movs r0, r0 + beq _020B88F8 +_020B880C: + ldr r0, [sp] + ldr r5, [sl, #0xc] + ldr r1, [r0, #4] + mov r0, r7, lsl #1 + ldrh r0, [r1, r0] + mul r4, r8, r7 + mul r6, r8, r0 + ldr r1, [sl, #8] + mov r0, r5 + bl DC_FlushRange + cmp fp, #0 + beq _020B88C8 + cmp fp, #1 + beq _020B8850 + cmp fp, #2 + beq _020B888C + b _020B88E0 +_020B8850: + ldr r0, [sl, #4] + cmp r0, #0 + beq _020B8878 + bl GX_BeginLoadOBJExtPltt + add r0, r5, r4 + mov r2, r8 + add r1, sb, r6 + bl GX_LoadOBJExtPltt + bl GX_EndLoadOBJExtPltt + b _020B88E0 +_020B8878: + mov r2, r8 + add r0, r5, r4 + add r1, sb, r6 + bl GX_LoadOBJPltt + b _020B88E0 +_020B888C: + ldr r0, [sl, #4] + cmp r0, #0 + beq _020B88B4 + bl GXS_BeginLoadOBJExtPltt + add r0, r5, r4 + mov r2, r8 + add r1, sb, r6 + bl GXS_LoadOBJExtPltt + bl GXS_EndLoadOBJExtPltt + b _020B88E0 +_020B88B4: + mov r2, r8 + add r0, r5, r4 + add r1, sb, r6 + bl GXS_LoadOBJPltt + b _020B88E0 +_020B88C8: + bl GX_BeginLoadTexPltt + add r0, r5, r4 + mov r2, r8 + add r1, sb, r6 + bl GX_LoadTexPltt + bl GX_EndLoadTexPltt +_020B88E0: + add r0, r7, #1 + mov r1, r0, lsl #0x10 + ldr r0, [sp, #4] + mov r7, r1, lsr #0x10 + cmp r0, r1, lsr #16 + bhi _020B880C +_020B88F8: + ldr r0, [sp, #0x30] + ldr r2, [sl] + mov r1, r0 + str r2, [r1] + ldr r4, [sl, #4] + mov r3, r0 + mov r1, fp + mov r2, sb + str r4, [r3, #4] + bl NNS_G2dSetImagePaletteLocation + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G2dLoadPaletteEx + + arm_func_start NNSi_G2dInitializeVRamLocation +NNSi_G2dInitializeVRamLocation: ; 0x020B8928 + mov r2, #0 + mvn r1, #0 +_020B8930: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #3 + blt _020B8930 + bx lr + arm_func_end NNSi_G2dInitializeVRamLocation + + arm_func_start NNSi_G2dSetVramLocation +NNSi_G2dSetVramLocation: ; 0x020B8944 + str r2, [r0, r1, lsl #2] + bx lr + arm_func_end NNSi_G2dSetVramLocation + + arm_func_start NNSi_G2dGetVramLocation +NNSi_G2dGetVramLocation: ; 0x020B894C + ldr r0, [r0, r1, lsl #2] + bx lr + arm_func_end NNSi_G2dGetVramLocation + + arm_func_start NNSi_G2dSrtcSetTrans +NNSi_G2dSrtcSetTrans: ; 0x020B8954 + ldr r3, [r0] + cmp r3, #1 + bxne lr + ldrh r3, [r0, #0x12] + orr r3, r3, #8 + strh r3, [r0, #0x12] + strh r1, [r0, #0xc] + strh r2, [r0, #0xe] + bx lr + arm_func_end NNSi_G2dSrtcSetTrans + + arm_func_start NNSi_G2dSrtcSetSRTRotZ +NNSi_G2dSrtcSetSRTRotZ: ; 0x020B8978 + ldr r2, [r0] + cmp r2, #1 + bxne lr + ldrh r2, [r0, #0x12] + orr r2, r2, #4 + strh r2, [r0, #0x12] + strh r1, [r0, #0x10] + bx lr + arm_func_end NNSi_G2dSrtcSetSRTRotZ + + arm_func_start NNSi_G2dSrtcSetSRTScale +NNSi_G2dSrtcSetSRTScale: ; 0x020B8998 + ldr r3, [r0] + cmp r3, #1 + bxne lr + ldrh r3, [r0, #0x12] + orr r3, r3, #2 + strh r3, [r0, #0x12] + stmib r0, {r1, r2} + bx lr + arm_func_end NNSi_G2dSrtcSetSRTScale + + arm_func_start NNSi_G2dSrtcInitControl +NNSi_G2dSrtcInitControl: ; 0x020B89B8 + ldr ip, _020B89C4 ; =NNSi_G2dSrtcSetInitialValue + str r1, [r0] + bx ip + .align 2, 0 +_020B89C4: .word NNSi_G2dSrtcSetInitialValue + arm_func_end NNSi_G2dSrtcInitControl + + arm_func_start NNSi_G2dSrtcSetInitialValue +NNSi_G2dSrtcSetInitialValue: ; 0x020B89C8 + stmdb sp!, {r4, lr} + mov r4, r0 + add r1, r4, #4 + mov r0, #0 + mov r2, #0x18 + bl MIi_CpuClear16 + mov r0, #0x1000 + str r0, [r4, #4] + str r0, [r4, #8] + ldmia sp!, {r4, pc} + arm_func_end NNSi_G2dSrtcSetInitialValue + + arm_func_start NNSi_G2dInitializeNode +NNSi_G2dInitializeNode: ; 0x020B89F0 + mov r2, #0 + str r2, [r0] + str r1, [r0, #4] + mov r1, #1 + str r1, [r0, #8] + ldr ip, _020B8A10 ; =NNSi_G2dSrtcInitControl + add r0, r0, #0xc + bx ip + .align 2, 0 +_020B8A10: .word NNSi_G2dSrtcInitControl + arm_func_end NNSi_G2dInitializeNode + + arm_func_start ApplyCurrentAnimResult_ +ApplyCurrentAnimResult_: ; 0x020B8A14 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldr r1, [r4, #4] + ldrh r1, [r1, #4] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl NNS_G2dGetAnimCtrlCurrentElement + mov r0, r4 + bl NNS_G2dGetAnimCtrlCurrentElement + mov r5, r0 + ldr r6, [r4, #0x34] + ldrh r1, [r5] + mov r0, r6 + bl NNS_G2dGetCellDataByIdx + str r0, [r4, #0x30] + ldr r1, [r4, #0x1c] + add r0, r4, #0x3c + ldr r2, [r1, #4] + mov r1, #1 + and r7, r2, #0xff + bl NNSi_G2dSrtcInitControl + cmp r7, #0 + beq _020B8AB4 + cmp r7, #2 + bne _020B8A8C + ldrsh r1, [r5, #4] + ldrsh r2, [r5, #6] + add r0, r4, #0x3c + bl NNSi_G2dSrtcSetTrans + b _020B8AB4 +_020B8A8C: + add r0, r4, #0x3c + ldmib r5, {r1, r2} + bl NNSi_G2dSrtcSetSRTScale + ldrh r1, [r5, #2] + add r0, r4, #0x3c + bl NNSi_G2dSrtcSetSRTRotZ + ldrsh r1, [r5, #0xc] + ldrsh r2, [r5, #0xe] + add r0, r4, #0x3c + bl NNSi_G2dSrtcSetTrans +_020B8AB4: + ldr r2, [r6, #0xc] + cmp r2, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #0x38] + mvn r0, #0 + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r1, [r5] + ldr r2, [r2, #4] + ldr r0, [r4, #0x38] + add r3, r2, r1, lsl #3 + ldmia r3, {r1, r2} + bl NNS_G2dSetCellTransferStateRequested + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ApplyCurrentAnimResult_ + + arm_func_start NNS_G2dInitCellAnimation +NNS_G2dInitCellAnimation: ; 0x020B8B04 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + str r2, [r5, #0x34] + mvn r2, #0 + add r0, r5, #0x3c + mov r1, #1 + str r2, [r5, #0x38] + bl NNSi_G2dSrtcInitControl + mov r0, r5 + bl NNS_G2dInitAnimCtrl + mov r0, r5 + mov r1, r4 + bl NNS_G2dSetCellAnimationSequence + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G2dInitCellAnimation + + arm_func_start NNS_G2dInitCellAnimationVramTransfered +NNS_G2dInitCellAnimationVramTransfered: ; 0x020B8B40 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r4, r2 + ldr r2, [r4, #0xc] + mov r5, r1 + ldr r1, [r2] + ldr r2, [sp, #0x34] + str r1, [sp] + ldr r1, [sp, #0x38] + str r2, [sp, #4] + mov r6, r3 + mov r7, r0 + ldr ip, [sp, #0x3c] + str r1, [sp, #8] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + mov r0, r6 + str ip, [sp, #0xc] + bl NNSi_G2dInitCellTransferState + str r6, [r7, #0x38] + str r4, [r7, #0x34] + add r0, r7, #0x3c + mov r1, #1 + str r6, [r7, #0x38] + bl NNSi_G2dSrtcInitControl + mov r0, r7 + bl NNS_G2dInitAnimCtrl + mov r0, r7 + mov r1, r5 + bl NNS_G2dSetCellAnimationSequence + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G2dInitCellAnimationVramTransfered + + arm_func_start NNS_G2dSetCellAnimationSequence +NNS_G2dSetCellAnimationSequence: ; 0x020B8BC4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl NNS_G2dBindAnimCtrl + mov r0, r4 + bl ApplyCurrentAnimResult_ + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dSetCellAnimationSequence + + arm_func_start NNS_G2dTickCellAnimation +NNS_G2dTickCellAnimation: ; 0x020B8BDC + stmdb sp!, {r4, lr} + mov r4, r0 + bl NNS_G2dTickAnimCtrl + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ApplyCurrentAnimResult_ + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dTickCellAnimation + + arm_func_start NNS_G2dSetCellAnimationCurrentFrame +NNS_G2dSetCellAnimationCurrentFrame: ; 0x020B8BFC + stmdb sp!, {r4, lr} + mov r4, r0 + bl NNS_G2dSetAnimCtrlCurrentFrame + cmp r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl ApplyCurrentAnimResult_ + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dSetCellAnimationCurrentFrame + + arm_func_start SetMCDataToMCInstanceImpl_ +SetMCDataToMCInstanceImpl_: ; 0x020B8C1C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r1 + str r0, [sp] + str sl, [r0] + ldr r0, [r0, #8] + mov sb, r2 + cmp r0, #1 + bne _020B8D84 + ldrh r1, [sl, #2] + ldr r0, [sp] + mov r4, #0 + ldr r5, [r0, #0xc] + cmp r1, #0 + bls _020B8C7C + mov r3, r4 + mov r0, #0x5c +_020B8C5C: + mla r1, r4, r0, r5 + str r3, [r1, #0x58] + ldrh r2, [sl, #2] + add r1, r4, #1 + mov r1, r1, lsl #0x10 + cmp r2, r1, lsr #16 + mov r4, r1, lsr #0x10 + bhi _020B8C5C +_020B8C7C: + ldrh r0, [sl] + mov r8, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B8C8C: + ldr r0, [sl, #4] + mov r1, #0x5c + add r6, r0, r8, lsl #3 + ldrh r0, [r6, #6] + and r0, r0, #0xff00 + mov r0, r0, lsl #8 + mov r0, r0, lsr #0x10 + mla r7, r0, r1, r5 + ldr r0, [r7, #0x58] + cmp r0, #0 + bne _020B8D68 + ldr r0, [sp] + ldrh r1, [r6] + ldr r0, [r0, #4] + bl NNS_G2dGetAnimSequenceByIdx + mov r4, r0 + mov r0, r7 + mov r1, r4 + bl NNS_G2dSetCellAnimationSequence + mov r0, #1 + str r0, [r7, #0xc] + ldrh r0, [r6, #6] + and r0, r0, #0xf + cmp r0, #1 + bne _020B8D60 + ldrh r3, [r4] + mov r6, #0 + mov r1, r6 + cmp r3, #0 + bls _020B8D20 + ldr r2, [r4, #0xc] +_020B8D08: + add r0, r2, r1, lsl #3 + ldrh r0, [r0, #4] + add r1, r1, #1 + cmp r1, r3 + add r6, r6, r0 + blo _020B8D08 +_020B8D20: + mov r0, r7 + bl NNSi_G2dIsAnimCtrlLoopAnim + cmp r0, #0 + beq _020B8D4C + mov r0, sb + mov r1, r6 + bl _u32_div_f + mov r0, r7 + mov r1, r1, lsl #0xc + bl NNS_G2dTickCellAnimation + b _020B8D60 +_020B8D4C: + cmp sb, r6 + movlo r6, sb + mov r0, r7 + mov r1, r6, lsl #0xc + bl NNS_G2dTickCellAnimation +_020B8D60: + mov r0, #1 + str r0, [r7, #0x58] +_020B8D68: + ldrh r1, [sl] + add r0, r8, #1 + mov r0, r0, lsl #0x10 + cmp r1, r0, lsr #16 + mov r8, r0, lsr #0x10 + bhi _020B8C8C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B8D84: + ldr r0, [sp] + ldrh r1, [sl] + ldr fp, [r0, #0xc] + mov r7, #0 + cmp r1, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B8D9C: + mov r0, #0x28 + mul r2, r7, r0 + ldr r3, [sl, #4] + mov r0, r7, lsl #3 + ldrh r1, [r3, r0] + ldr r0, [sp] + ldr r6, [fp, r2] + ldr r0, [r0, #4] + add r5, r3, r7, lsl #3 + bl NNS_G2dGetAnimSequenceByIdx + mov r4, r0 + mov r0, r6 + mov r1, r4 + bl NNS_G2dSetCellAnimationSequence + mov r0, #1 + str r0, [r6, #0xc] + ldrh r0, [r5, #6] + and r0, r0, #0xf + cmp r0, #1 + bne _020B8E5C + ldrh r3, [r4] + mov r8, #0 + mov r1, r8 + cmp r3, #0 + bls _020B8E1C + ldr r2, [r4, #0xc] +_020B8E04: + add r0, r2, r1, lsl #3 + ldrh r0, [r0, #4] + add r1, r1, #1 + cmp r1, r3 + add r8, r8, r0 + blo _020B8E04 +_020B8E1C: + mov r0, r6 + bl NNSi_G2dIsAnimCtrlLoopAnim + cmp r0, #0 + beq _020B8E48 + mov r0, sb + mov r1, r8 + bl _u32_div_f + mov r0, r6 + mov r1, r1, lsl #0xc + bl NNS_G2dTickCellAnimation + b _020B8E5C +_020B8E48: + cmp sb, r8 + movlo r8, sb + mov r0, r6 + mov r1, r8, lsl #0xc + bl NNS_G2dTickCellAnimation +_020B8E5C: + mov r0, #0x28 + mla r3, r7, r0, fp + mov r0, #1 + str r0, [r3, #8] + ldrsh r1, [r5, #2] + ldrsh r2, [r5, #4] + add r0, r3, #0xc + bl NNSi_G2dSrtcSetTrans + add r0, r7, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [sl] + mov r7, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020B8D9C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end SetMCDataToMCInstanceImpl_ + + arm_func_start NNS_G2dSetAnimSequenceToMCAnimation +NNS_G2dSetAnimSequenceToMCAnimation: ; 0x020B8E98 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + bl NNS_G2dBindAnimCtrl + mov r0, #0 + strh r0, [r4, #0x30] + ldr r0, [r4, #4] + ldrh r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + bl NNS_G2dGetAnimCtrlCurrentElement + mov r5, r0 + ldrh r1, [r5] + ldr r0, [r4, #0x44] + bl NNS_G2dGetMultiCellDataByIdx + ldr r1, [r4, #0x1c] + mov r7, r0 + ldr r1, [r1, #4] + add r0, r4, #0x48 + and r6, r1, #0xff + mov r1, #1 + bl NNSi_G2dSrtcInitControl + cmp r6, #0 + beq _020B8F3C + cmp r6, #2 + bne _020B8F14 + ldrsh r1, [r5, #4] + ldrsh r2, [r5, #6] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans + b _020B8F3C +_020B8F14: + add r0, r4, #0x48 + ldmib r5, {r1, r2} + bl NNSi_G2dSrtcSetSRTScale + ldrh r1, [r5, #2] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetSRTRotZ + ldrsh r1, [r5, #0xc] + ldrsh r2, [r5, #0xe] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans +_020B8F3C: + ldrh r2, [r4, #0x30] + mov r1, r7 + add r0, r4, #0x34 + bl SetMCDataToMCInstanceImpl_ + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G2dSetAnimSequenceToMCAnimation + + arm_func_start NNS_G2dGetMCBankNumNodesRequired +NNS_G2dGetMCBankNumNodesRequired: ; 0x020B8F50 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldrh r0, [r4] + mov r5, #0 + mov r6, r5 + cmp r0, #0 + bls _020B8F9C +_020B8F6C: + mov r0, r4 + mov r1, r6 + bl NNS_G2dGetMultiCellDataByIdx + ldrh r0, [r0] + ldrh r1, [r4] + cmp r0, r5 + movhi r5, r0 + add r0, r6, #1 + mov r0, r0, lsl #0x10 + cmp r1, r0, lsr #16 + mov r6, r0, lsr #0x10 + bhi _020B8F6C +_020B8F9C: + mov r0, r5 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G2dGetMCBankNumNodesRequired + + arm_func_start NNS_G2dTickMCInstance +NNS_G2dTickMCInstance: ; 0x020B8FA4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + ldr r0, [r7, #8] + mov r6, r1 + cmp r0, #1 + ldr r0, [r7] + mov r4, #0 + ldr r5, [r7, #0xc] + bne _020B9004 + ldrh r0, [r0, #2] + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} + mov r8, #0x5c +_020B8FD8: + mla r0, r4, r8, r5 + mov r1, r6 + bl NNS_G2dTickCellAnimation + ldr r1, [r7] + add r0, r4, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r1, #2] + mov r4, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020B8FD8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020B9004: + ldrh r0, [r0] + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} + mov r8, #0x28 +_020B9014: + mul r0, r4, r8 + ldr r0, [r5, r0] + mov r1, r6 + bl NNS_G2dTickCellAnimation + ldr r1, [r7] + add r0, r4, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r1] + mov r4, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020B9014 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_G2dTickMCInstance + + arm_func_start NNS_G2dTickMCAnimation +NNS_G2dTickMCAnimation: ; 0x020B9044 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldr r2, [r4] + mov r6, r1 + ldrh r5, [r2, #4] + bl NNS_G2dTickAnimCtrl + cmp r0, #0 + beq _020B9114 + ldrh r0, [r4, #0x30] + add r0, r0, r5 + strh r0, [r4, #0x30] + ldr r0, [r4, #4] + ldrh r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + bl NNS_G2dGetAnimCtrlCurrentElement + mov r5, r0 + ldrh r1, [r5] + ldr r0, [r4, #0x44] + bl NNS_G2dGetMultiCellDataByIdx + ldr r1, [r4, #0x1c] + mov r7, r0 + ldr r1, [r1, #4] + add r0, r4, #0x48 + and r6, r1, #0xff + mov r1, #1 + bl NNSi_G2dSrtcInitControl + cmp r6, #0 + beq _020B9100 + cmp r6, #2 + bne _020B90D8 + ldrsh r1, [r5, #4] + ldrsh r2, [r5, #6] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans + b _020B9100 +_020B90D8: + add r0, r4, #0x48 + ldmib r5, {r1, r2} + bl NNSi_G2dSrtcSetSRTScale + ldrh r1, [r5, #2] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetSRTRotZ + ldrsh r1, [r5, #0xc] + ldrsh r2, [r5, #0xe] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans +_020B9100: + ldrh r2, [r4, #0x30] + mov r1, r7 + add r0, r4, #0x34 + bl SetMCDataToMCInstanceImpl_ + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B9114: + mov r1, r6 + add r0, r4, #0x34 + bl NNS_G2dTickMCInstance + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G2dTickMCAnimation + + arm_func_start NNS_G2dSetMCAnimationCurrentFrame +NNS_G2dSetMCAnimationCurrentFrame: ; 0x020B9124 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + bl NNS_G2dSetAnimCtrlCurrentFrame + cmp r0, #0 + ldrne r0, [r4, #4] + ldrneh r0, [r0, #4] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r4 + bl NNS_G2dGetAnimCtrlCurrentElement + mov r5, r0 + ldrh r1, [r5] + ldr r0, [r4, #0x44] + bl NNS_G2dGetMultiCellDataByIdx + ldr r1, [r4, #0x1c] + mov r7, r0 + ldr r1, [r1, #4] + add r0, r4, #0x48 + and r6, r1, #0xff + mov r1, #1 + bl NNSi_G2dSrtcInitControl + cmp r6, #0 + beq _020B91C4 + cmp r6, #2 + bne _020B919C + ldrsh r1, [r5, #4] + ldrsh r2, [r5, #6] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans + b _020B91C4 +_020B919C: + add r0, r4, #0x48 + ldmib r5, {r1, r2} + bl NNSi_G2dSrtcSetSRTScale + ldrh r1, [r5, #2] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetSRTRotZ + ldrsh r1, [r5, #0xc] + ldrsh r2, [r5, #0xe] + add r0, r4, #0x48 + bl NNSi_G2dSrtcSetTrans +_020B91C4: + ldrh r2, [r4, #0x30] + mov r1, r7 + add r0, r4, #0x34 + bl SetMCDataToMCInstanceImpl_ + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G2dSetMCAnimationCurrentFrame + + arm_func_start NNS_G2dInitMCAnimation +NNS_G2dInitMCAnimation: ; 0x020B91D8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r5, #0 + str r5, [r0, #0x3c] + ldr r7, [sp, #0x28] + str r5, [r0, #0x34] + mov sl, r1 + str r7, [r0, #0x38] + str r0, [sp] + movs r8, r3 + mov sb, r2 + str sl, [r0, #0x40] + ldr fp, [sp, #0x2c] + beq _020B925C +_020B920C: + mov r0, #0x28 + mul r4, r5, r0 + mov r1, #1 + add r0, sl, r4 + bl NNSi_G2dInitializeNode + mov r0, #0x58 + mla r6, r5, r0, sb + mov r0, r7 + mov r1, #0 + str r6, [sl, r4] + bl NNS_G2dGetAnimSequenceByIdx + mov r1, r0 + mov r0, r6 + mov r2, fp + bl NNS_G2dInitCellAnimation + add r0, r5, #1 + mov r0, r0, lsl #0x10 + cmp r8, r0, lsr #16 + mov r5, r0, lsr #0x10 + bhi _020B920C +_020B925C: + ldr r0, [sp] + bl NNS_G2dInitAnimCtrl + ldr r0, [sp] + ldr r3, [sp, #0x30] + ldr r2, [sp] + add r0, r0, #0x48 + mov r1, #1 + str r3, [r2, #0x44] + bl NNSi_G2dSrtcInitControl + ldr r0, [sp] + mov r1, #0 + strh r1, [r0, #0x30] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G2dInitMCAnimation + + arm_func_start NNSi_G2dIdentity +NNSi_G2dIdentity: ; 0x020B9290 + stmdb sp!, {r4, lr} + ldr r0, _020B9318 ; =_021D94D8 + ldr ip, [r0, #0xc] + ldr r1, [r0, #4] + mov r0, #0x18 + mul r3, ip, r0 + cmp r1, #0 + beq _020B92C8 + ldr r1, _020B931C ; =_021D9678 + mov r2, #0 + ldr r0, _020B9320 ; =_021D967C + str r2, [r1, r3] + str r2, [r0, r3] + b _020B9308 +_020B92C8: + ldr r1, _020B9324 ; =_021D9668 + mov r2, #0x1000 + str r2, [r1, r3] + add r4, r1, r3 + mov r1, #0 + str r1, [r4, #4] + ldr r0, _020B9328 ; =_021D9968 + str r1, [r4, #8] + str r2, [r4, #0xc] + str r1, [r4, #0x10] + add lr, r0, r3 + str r1, [r4, #0x14] + ldmia r4!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + ldmia r4, {r0, r1} + stmia lr, {r0, r1} +_020B9308: + ldr r0, _020B932C ; =_021D94E8 + mov r1, #0 + str r1, [r0, ip, lsl #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_020B9318: .word _021D94D8 +_020B931C: .word _021D9678 +_020B9320: .word _021D967C +_020B9324: .word _021D9668 +_020B9328: .word _021D9968 +_020B932C: .word _021D94E8 + arm_func_end NNSi_G2dIdentity + + arm_func_start NNSi_G2dMCMStoreCurrentMtxToMtxCache +NNSi_G2dMCMStoreCurrentMtxToMtxCache: ; 0x020B9330 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020B9454 ; =_021D94D8 + ldr r1, _020B9458 ; =_021D9568 + ldr r0, [r0, #0xc] + mov r2, #1 + mov r0, r0, lsl #0x10 + add r3, r1, r0, lsr #13 + ldrh r0, [r3, #4] + cmp r0, #1 + cmpne r0, #2 + movne r2, #0 + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _020B9454 ; =_021D94D8 + ldrh r4, [r3, #2] + ldrh r5, [r0] + mov r2, #0x10 + cmp r5, #0x1f + addlo r1, r5, #1 + strloh r1, [r0] + ldr r0, _020B945C ; =_021D9C68 + strh r5, [r3] + add r0, r0, r5, lsl #5 + add r1, r0, #0x10 + mvn r0, #0 + bl MIi_CpuClearFast + ldr r0, _020B9454 ; =_021D94D8 + ldr r1, [r0, #4] + ldr ip, [r0, #0xc] + cmp r1, #0 + ldreq r1, _020B9460 ; =_021D9968 + mov r0, #0x18 + mlaeq r1, ip, r0, r1 + beq _020B93DC + mul r3, ip, r0 + ldr r1, _020B9464 ; =_021D9678 + ldr r0, _020B9468 ; =_021109DC + ldr r2, [r1, r3] + ldr r1, _020B946C ; =_021D967C + str r2, [r0, #0x18] + ldr r2, [r1, r3] + ldr r1, _020B9470 ; =_021109E4 + str r2, [r0, #0x1c] +_020B93DC: + mov r2, ip, lsl #0x10 + ldr r0, _020B9458 ; =_021D9568 + mov r2, r2, lsr #0xd + ldrh ip, [r0, r2] + ldr lr, _020B945C ; =_021D9C68 + ldr r3, [r1] + ldr r2, _020B9454 ; =_021D94D8 + str r3, [lr, ip, lsl #5] + ldr r3, [r1, #4] + add ip, lr, ip, lsl #5 + str r3, [ip, #4] + ldr r3, [r1, #8] + ldr r2, [r2, #0xc] + str r3, [ip, #8] + ldr r3, [r1, #0xc] + mov r1, r2, lsl #0x10 + str r3, [ip, #0xc] + movs lr, r1, lsr #0x10 + ldmmiia sp!, {r3, r4, r5, pc} + mov r1, #3 +_020B942C: + add r3, r0, lr, lsl #3 + ldrh r2, [r3, #2] + mov ip, lr, lsl #3 + cmp r4, r2 + ldmneia sp!, {r3, r4, r5, pc} + strh r1, [r3, #4] + strh r5, [r0, ip] + subs lr, lr, #1 + bpl _020B942C + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B9454: .word _021D94D8 +_020B9458: .word _021D9568 +_020B945C: .word _021D9C68 +_020B9460: .word _021D9968 +_020B9464: .word _021D9678 +_020B9468: .word _021109DC +_020B946C: .word _021D967C +_020B9470: .word _021109E4 + arm_func_end NNSi_G2dMCMStoreCurrentMtxToMtxCache + + arm_func_start RndCoreCBFuncBeforeCell_ +RndCoreCBFuncBeforeCell_: ; 0x020B9474 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020B9570 ; =_021D94D8 + mov r6, r0 + ldr r0, [r2, #8] + mov r5, r1 + ldr r4, [r0, #0x74] + ldr r0, [r4, #0x34] + cmp r0, #0 + beq _020B9504 + ldr r0, [r2, #4] + cmp r0, #0 + ldreq r2, [r2, #0xc] + ldreq r1, _020B9574 ; =_021D9668 + mov r0, #0x18 + mlaeq r1, r2, r0, r1 + beq _020B94DC + ldr r1, [r2, #0xc] + mul r3, r1, r0 + ldr r1, _020B9578 ; =_021D9678 + ldr r0, _020B957C ; =_021109DC + ldr r2, [r1, r3] + ldr r1, _020B9580 ; =_021D967C + str r2, [r0, #0x18] + ldr r2, [r1, r3] + ldr r1, _020B9584 ; =_021109E4 + str r2, [r0, #0x1c] +_020B94DC: + ldr r3, [r4, #0x34] + mov r0, r5 + mov r2, r4 + blx r3 + cmp r0, #0 + moveq r0, #0 + streq r0, [r6, #0x30] + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #1 + str r0, [r6, #0x30] +_020B9504: + ldr r0, [r4, #0x38] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _020B9570 ; =_021D94D8 + ldr r1, [r0, #4] + cmp r1, #0 + ldr r1, [r0, #0xc] + ldreq r2, _020B9574 ; =_021D9668 + mov r0, #0x18 + mlaeq r3, r1, r0, r2 + beq _020B9554 + mul r3, r1, r0 + ldr r1, _020B9578 ; =_021D9678 + ldr r0, _020B957C ; =_021109DC + ldr r2, [r1, r3] + ldr r1, _020B9580 ; =_021D967C + str r2, [r0, #0x18] + ldr r1, [r1, r3] + ldr r3, _020B9584 ; =_021109E4 + str r1, [r0, #0x1c] +_020B9554: + ldr r0, _020B9570 ; =_021D94D8 + ldr r6, [r4, #0x38] + ldr r0, [r0, #8] + mov r1, r4 + mov r2, r5 + blx r6 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020B9570: .word _021D94D8 +_020B9574: .word _021D9668 +_020B9578: .word _021D9678 +_020B957C: .word _021109DC +_020B9580: .word _021D967C +_020B9584: .word _021109E4 + arm_func_end RndCoreCBFuncBeforeCell_ + + arm_func_start RndCoreCBFuncAfterCell_ +RndCoreCBFuncAfterCell_: ; 0x020B9588 + stmdb sp!, {r4, lr} + ldr r3, _020B95F4 ; =_021D94D8 + mov r2, r1 + ldr r0, [r3, #8] + ldr r1, [r0, #0x74] + ldr r4, [r1, #0x3c] + cmp r4, #0 + ldmeqia sp!, {r4, pc} + ldr r4, [r3, #4] + ldr ip, [r3, #0xc] + cmp r4, #0 + ldreq lr, _020B95F8 ; =_021D9668 + mov r3, #0x18 + mlaeq r3, ip, r3, lr + beq _020B95E8 + mul r4, ip, r3 + ldr r3, _020B95FC ; =_021D9678 + ldr ip, _020B9600 ; =_021109DC + ldr lr, [r3, r4] + ldr r3, _020B9604 ; =_021D967C + str lr, [ip, #0x18] + ldr lr, [r3, r4] + ldr r3, _020B9608 ; =_021109E4 + str lr, [ip, #0x1c] +_020B95E8: + ldr ip, [r1, #0x3c] + blx ip + ldmia sp!, {r4, pc} + .align 2, 0 +_020B95F4: .word _021D94D8 +_020B95F8: .word _021D9668 +_020B95FC: .word _021D9678 +_020B9600: .word _021109DC +_020B9604: .word _021D967C +_020B9608: .word _021109E4 + arm_func_end RndCoreCBFuncAfterCell_ + + arm_func_start RndCoreCBFuncBeforeOBJ_ +RndCoreCBFuncBeforeOBJ_: ; 0x020B960C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r3, _020B97E0 ; =_021D94D8 + mov r6, r0 + ldr r0, [r3, #8] + mov r5, r1 + mov r4, r2 + bl NNS_G2dGetRendererPaletteTbl + cmp r0, #0 + beq _020B965C + ldrh r1, [r6, #0x3c] + and r1, r1, #0xf000 + mov r1, r1, lsl #4 + mov r1, r1, lsr #0x10 + bl NNS_G2dGetPaletteTableValue + ldr r1, [r6, #0x3c] + mov r0, r0, lsl #0x1c + bic r1, r1, #0xf000 + orr r0, r1, r0, lsr #16 + str r0, [r6, #0x3c] +_020B965C: + ldr r0, _020B97E0 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r0, [r1, #0x84] + cmp r0, #0 + beq _020B9768 + ldr r0, [r1, #0x84] + tst r0, #1 + beq _020B9694 + ldrh r0, [r1, #0x88] + ldr r1, [r6, #0x3c] + bic r1, r1, #0xc00 + mov r0, r0, lsl #0x1e + orr r0, r1, r0, lsr #20 + str r0, [r6, #0x3c] +_020B9694: + ldr r0, _020B97E0 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r0, [r1, #0x84] + tst r0, #2 + beq _020B96C0 + ldrh r0, [r1, #0x8a] + ldr r1, [r6, #0x3c] + bic r1, r1, #0xf000 + mov r0, r0, lsl #0x1c + orr r0, r1, r0, lsr #16 + str r0, [r6, #0x3c] +_020B96C0: + ldr r0, _020B97E0 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r0, [r1, #0x84] + tst r0, #0x10 + beq _020B96F4 + ldr r2, [r6, #0x3c] + ldrh r0, [r1, #0x94] + mov r1, r2, lsl #0x10 + bic r2, r2, #0xf000 + add r0, r0, r1, lsr #28 + mov r0, r0, lsl #0x1c + orr r0, r2, r0, lsr #16 + str r0, [r6, #0x3c] +_020B96F4: + ldr r0, _020B97E0 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r0, [r1, #0x84] + tst r0, #4 + beq _020B9724 + ldr r0, [r1, #0x90] + cmp r0, #0 + ldr r0, [r6, #0x38] + orrne r0, r0, #0x1000 + strne r0, [r6, #0x38] + biceq r0, r0, #0x1000 + streq r0, [r6, #0x38] +_020B9724: + ldr r0, _020B97E0 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r0, [r1, #0x84] + tst r0, #8 + beq _020B9768 + ldr r0, [r6, #0x38] + ldrh r2, [r6, #0x3c] + ldr r1, [r1, #0x8c] + bic r0, r0, #0xc00 + orr r0, r0, r1, lsl #10 + str r0, [r6, #0x38] + ldrh r0, [r6, #0x3c] + and r1, r2, #0xf000 + mov r1, r1, asr #0xc + bic r0, r0, #0xf000 + orr r0, r0, r1, lsl #12 + strh r0, [r6, #0x3c] +_020B9768: + ldr r2, _020B97E0 ; =_021D94D8 + ldr r0, [r2, #8] + ldr r1, [r0, #0x74] + ldr r3, [r1, #0x40] + cmp r3, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r3, [r2, #4] + cmp r3, #0 + ldr r3, [r2, #0xc] + ldreq r6, _020B97E4 ; =_021D9668 + mov r2, #0x18 + mlaeq r6, r3, r2, r6 + beq _020B97C4 + mul ip, r3, r2 + ldr r3, _020B97E8 ; =_021D9678 + ldr r2, _020B97EC ; =_021109DC + ldr r6, [r3, ip] + ldr r3, _020B97F0 ; =_021D967C + str r6, [r2, #0x18] + ldr r3, [r3, ip] + ldr r6, _020B97F4 ; =_021109E4 + str r3, [r2, #0x1c] +_020B97C4: + str r6, [sp] + ldr r6, [r1, #0x40] + mov r2, r5 + mov r3, r4 + blx r6 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020B97E0: .word _021D94D8 +_020B97E4: .word _021D9668 +_020B97E8: .word _021D9678 +_020B97EC: .word _021109DC +_020B97F0: .word _021D967C +_020B97F4: .word _021109E4 + arm_func_end RndCoreCBFuncBeforeOBJ_ + + arm_func_start RndCoreCBFuncAfterOBJ_ +RndCoreCBFuncAfterOBJ_: ; 0x020B97F8 + stmdb sp!, {r3, r4, r5, lr} + ldr lr, _020B9874 ; =_021D94D8 + mov ip, r1 + ldr r0, [lr, #8] + mov r3, r2 + ldr r1, [r0, #0x74] + ldr r2, [r1, #0x44] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [lr, #4] + cmp r2, #0 + ldreq lr, [lr, #0xc] + ldreq r4, _020B9878 ; =_021D9668 + mov r2, #0x18 + mlaeq r5, lr, r2, r4 + beq _020B9860 + ldr r4, [lr, #0xc] + mul r5, r4, r2 + ldr r4, _020B987C ; =_021D9678 + ldr r2, _020B9880 ; =_021109DC + ldr lr, [r4, r5] + ldr r4, _020B9884 ; =_021D967C + str lr, [r2, #0x18] + ldr r4, [r4, r5] + ldr r5, _020B9888 ; =_021109E4 + str r4, [r2, #0x1c] +_020B9860: + str r5, [sp] + ldr lr, [r1, #0x44] + mov r2, ip + blx lr + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020B9874: .word _021D94D8 +_020B9878: .word _021D9668 +_020B987C: .word _021D9678 +_020B9880: .word _021109DC +_020B9884: .word _021D967C +_020B9888: .word _021109E4 + arm_func_end RndCoreCBFuncAfterOBJ_ + + arm_func_start DrawCellImpl_ +DrawCellImpl_: ; 0x020B988C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r7, _020B9CA8 ; =_021D94D8 + mov r4, r0 + ldr fp, [r7, #8] + ldr r0, [fp, #0x7c] + ldr sb, [fp, #0x70] + tst r0, #2 + beq _020B9A7C + ldr r0, [sb, #0x14] + cmp r0, #0 + beq _020B99EC + ldr r0, [r7, #4] + mov r1, #0 + cmp r0, #0 + bne _020B98E0 + ldr r2, _020B9CAC ; =_021109DC + ldr r0, _020B9CB0 ; =0x0000FFFE + ldrh r2, [r2] + cmp r2, r0 + movne r0, #1 + bne _020B98E4 +_020B98E0: + mov r0, #0 +_020B98E4: + cmp r0, #0 + beq _020B9970 + ldr r0, _020B9CA8 ; =_021D94D8 + ldr r0, [r0, #0xf94] + cmp r0, #0 + beq _020B994C + ldr r0, _020B9CB4 ; =_021D9FD8 + ldr r1, _020B9CB8 ; =_021DA06C + ldrh r0, [r0, #0x90] + ldr r1, [r1, r0, lsl #2] + cmp r1, #0 + bne _020B9970 + bl NNSi_G2dMCMStoreCurrentMtxToMtxCache + ldr r0, _020B9CA8 ; =_021D94D8 + ldr r2, _020B9CBC ; =_021D9568 + ldr r0, [r0, #0xc] + ldr r1, _020B9CB4 ; =_021D9FD8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0xd + ldrh r3, [r2, r0] + ldr r5, _020B9CC0 ; =_021D9C68 + ldrh r2, [r1, #0x90] + ldr r0, _020B9CB8 ; =_021DA06C + add r1, r5, r3, lsl #5 + str r1, [r0, r2, lsl #2] + b _020B9970 +_020B994C: + bl NNSi_G2dMCMStoreCurrentMtxToMtxCache + ldr r0, _020B9CA8 ; =_021D94D8 + ldr r1, _020B9CBC ; =_021D9568 + ldr r0, [r0, #0xc] + ldr r2, _020B9CC0 ; =_021D9C68 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0xd + ldrh r0, [r1, r0] + add r1, r2, r0, lsl #5 +_020B9970: + ldr r0, _020B9CA8 ; =_021D94D8 + ldr r2, [r0, #4] + cmp r2, #0 + ldr r2, [r0, #0xc] + ldreq r3, _020B9CC4 ; =_021D9668 + mov r0, #0x18 + mlaeq r0, r2, r0, r3 + beq _020B99B4 + mul r5, r2, r0 + ldr r0, _020B9CC8 ; =_021D9678 + ldr r2, _020B9CAC ; =_021109DC + ldr r3, [r0, r5] + ldr r0, _020B9CCC ; =_021D967C + str r3, [r2, #0x18] + ldr r3, [r0, r5] + ldr r0, _020B9CD0 ; =_021109E4 + str r3, [r2, #0x1c] +_020B99B4: + bl NNS_G2dSetRndCoreCurrentMtx2D + ldr r1, _020B9CAC ; =_021109DC + mvn r0, #0 + ldr r1, [r1, #4] + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + mov r0, r4 + beq _020B99E4 + bl NNS_G2dRndCoreDrawCellVramTransfer + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B99E4: + bl NNS_G2dRndCoreDrawCell + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B99EC: + ldr r2, [r7, #0xc] + ldr r1, _020B9CD4 ; =_021D94E8 + mov r0, fp + ldr r1, [r1, r2, lsl #2] + bl NNS_G2dSetRndCore3DSoftSpriteZvalue + mov r0, r7 + ldr r1, [r0, #4] + cmp r1, #0 + ldr r1, [r0, #0xc] + ldreq r2, _020B9CC4 ; =_021D9668 + mov r0, #0x18 + mlaeq r0, r1, r0, r2 + beq _020B9A44 + mul r3, r1, r0 + ldr r0, _020B9CC8 ; =_021D9678 + ldr r1, _020B9CAC ; =_021109DC + ldr r2, [r0, r3] + ldr r0, _020B9CCC ; =_021D967C + str r2, [r1, #0x18] + ldr r2, [r0, r3] + ldr r0, _020B9CD0 ; =_021109E4 + str r2, [r1, #0x1c] +_020B9A44: + bl NNS_G2dSetRndCoreCurrentMtx3D + ldr r1, _020B9CAC ; =_021109DC + mvn r0, #0 + ldr r1, [r1, #4] + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + mov r0, r4 + beq _020B9A74 + bl NNS_G2dRndCoreDrawCellVramTransfer + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B9A74: + bl NNS_G2dRndCoreDrawCell + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020B9A7C: + cmp sb, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r8, _020B9CC4 ; =_021D9668 + ldr r6, _020B9CAC ; =_021109DC + mvn r5, #0 +_020B9A90: + ldr r0, [sb, #0x10] + cmp r0, #0 + beq _020B9C98 + ldr r0, [sb, #0x14] + ldr sl, [r7, #8] + cmp r0, #0 + mov r1, sb + beq _020B9BFC + str sb, [sl, #0x74] + mov r0, sl + bl NNS_G2dSetRndCoreSurface + ldr r1, [sb, #0x28] + ldr r2, [sb, #0x2c] + mov r0, sl + bl NNS_G2dSetRndCoreOamRegisterFunc + mov r0, sl + bl NNS_G2dRndCoreBeginRendering + ldr r0, [r7, #4] + mov r1, #0 + cmp r0, #0 + bne _020B9AF8 + ldrh r2, [r6] + ldr r0, _020B9CB0 ; =0x0000FFFE + cmp r2, r0 + movne r0, #1 + bne _020B9AFC +_020B9AF8: + mov r0, #0 +_020B9AFC: + cmp r0, #0 + beq _020B9B84 + ldr r0, [r7, #0xf94] + cmp r0, #0 + beq _020B9B64 + ldr r0, _020B9CB4 ; =_021D9FD8 + ldrh r1, [r0, #0x90] + ldr r0, _020B9CD8 ; =_021DA068 + add r0, r0, r1, lsl #2 + ldr r1, [r0, #4] + cmp r1, #0 + bne _020B9B84 + bl NNSi_G2dMCMStoreCurrentMtxToMtxCache + ldr r0, _020B9CB4 ; =_021D9FD8 + ldr r2, [r7, #0xc] + ldrh r1, [r0, #0x90] + mov r0, r2, lsl #0x10 + mov r2, r0, lsr #0xd + ldr r0, _020B9CBC ; =_021D9568 + ldrh r3, [r0, r2] + ldr r0, _020B9CD8 ; =_021DA068 + add r2, r0, r1, lsl #2 + ldr r0, _020B9CC0 ; =_021D9C68 + add r1, r0, r3, lsl #5 + str r1, [r2, #4] + b _020B9B84 +_020B9B64: + bl NNSi_G2dMCMStoreCurrentMtxToMtxCache + ldr r0, [r7, #0xc] + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0xd + ldr r0, _020B9CBC ; =_021D9568 + ldrh r1, [r0, r1] + ldr r0, _020B9CC0 ; =_021D9C68 + add r1, r0, r1, lsl #5 +_020B9B84: + ldr r0, [r7, #4] + cmp r0, #0 + ldreq r2, [r7, #0xc] + moveq r0, #0x18 + mlaeq r0, r2, r0, r8 + beq _020B9BBC + ldr r3, [r7, #0xc] + mov r2, #0x18 + mla sl, r3, r2, r8 + ldr r2, [sl, #0x10] + ldr r0, _020B9CD0 ; =_021109E4 + str r2, [r6, #0x18] + ldr r2, [sl, #0x14] + str r2, [r6, #0x1c] +_020B9BBC: + bl NNS_G2dSetRndCoreCurrentMtx2D + ldr r1, [r6, #4] + cmp r1, r5 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + mov r0, r4 + beq _020B9BE4 + bl NNS_G2dRndCoreDrawCellVramTransfer + b _020B9BE8 +_020B9BE4: + bl NNS_G2dRndCoreDrawCell +_020B9BE8: + ldr r1, [r7, #8] + mov r0, #0 + str r0, [r1, #0x74] + bl NNS_G2dRndCoreEndRendering + b _020B9C98 +_020B9BFC: + mov r0, sl + str sb, [sl, #0x74] + bl NNS_G2dSetRndCoreSurface + mov r0, sl + bl NNS_G2dRndCoreBeginRendering + ldr r2, [r7, #0xc] + ldr r1, _020B9CD4 ; =_021D94E8 + mov r0, fp + ldr r1, [r1, r2, lsl #2] + bl NNS_G2dSetRndCore3DSoftSpriteZvalue + ldr r0, [r7, #4] + cmp r0, #0 + ldreq r1, [r7, #0xc] + moveq r0, #0x18 + mlaeq r0, r1, r0, r8 + beq _020B9C5C + ldr r2, [r7, #0xc] + mov r1, #0x18 + mla r3, r2, r1, r8 + ldr r1, [r3, #0x10] + ldr r0, _020B9CD0 ; =_021109E4 + str r1, [r6, #0x18] + ldr r1, [r3, #0x14] + str r1, [r6, #0x1c] +_020B9C5C: + bl NNS_G2dSetRndCoreCurrentMtx3D + ldr r1, [r6, #4] + cmp r1, r5 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + mov r0, r4 + beq _020B9C84 + bl NNS_G2dRndCoreDrawCellVramTransfer + b _020B9C88 +_020B9C84: + bl NNS_G2dRndCoreDrawCell +_020B9C88: + ldr r1, [r7, #8] + mov r0, #0 + str r0, [r1, #0x74] + bl NNS_G2dRndCoreEndRendering +_020B9C98: + ldr sb, [sb, #0x30] + cmp sb, #0 + bne _020B9A90 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020B9CA8: .word _021D94D8 +_020B9CAC: .word _021109DC +_020B9CB0: .word 0x0000FFFE +_020B9CB4: .word _021D9FD8 +_020B9CB8: .word _021DA06C +_020B9CBC: .word _021D9568 +_020B9CC0: .word _021D9C68 +_020B9CC4: .word _021D9668 +_020B9CC8: .word _021D9678 +_020B9CCC: .word _021D967C +_020B9CD0: .word _021109E4 +_020B9CD4: .word _021D94E8 +_020B9CD8: .word _021DA068 + arm_func_end DrawCellImpl_ + + arm_func_start DrawCellAnimationImpl_ +DrawCellAnimationImpl_: ; 0x020B9CDC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + ldrh r0, [r5, #0x4e] + ldr r4, [r5, #0x30] + cmp r0, #0 + bne _020B9D3C + ldr r2, [r5, #0x38] + mvn r0, #0 + cmp r2, r0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020B9D30 + ldr r1, _020B9E2C ; =_021109DC + mov r0, r4 + str r2, [r1, #4] + bl DrawCellImpl_ + ldr r0, _020B9E2C ; =_021109DC + mvn r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B9D30: + mov r0, r4 + bl DrawCellImpl_ + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020B9D3C: + bl NNS_G2dPushMtx + ldrh r0, [r5, #0x4e] + tst r0, #8 + beq _020B9D8C + ldr r0, _020B9E30 ; =_021D94D8 + ldrsh r7, [r5, #0x4a] + ldr r0, [r0, #8] + ldrsh r6, [r5, #0x48] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, _020B9E30 ; =_021D94D8 + rsbne r6, r6, #0 + ldr r0, [r0, #8] + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + rsbne r7, r7, #0 + mov r0, r6, lsl #0xc + mov r1, r7, lsl #0xc + mov r2, #0 + bl NNS_G2dTranslate +_020B9D8C: + ldrh r0, [r5, #0x4e] + tst r0, #4 + beq _020B9DC0 + ldrh r0, [r5, #0x4c] + ldr r2, _020B9E34 ; =FX_SinCosTable_ + mov r0, r0, asr #4 + mov r1, r0, lsl #1 + add r0, r1, #1 + mov r3, r1, lsl #1 + mov r1, r0, lsl #1 + ldrsh r0, [r2, r3] + ldrsh r1, [r2, r1] + bl NNS_G2dRotZ +_020B9DC0: + ldrh r0, [r5, #0x4e] + tst r0, #2 + beq _020B9DDC + ldr r0, [r5, #0x40] + ldr r1, [r5, #0x44] + mov r2, #0x1000 + bl NNS_G2dScale +_020B9DDC: + ldr r2, [r5, #0x38] + mvn r0, #0 + cmp r2, r0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020B9E18 + ldr r1, _020B9E2C ; =_021109DC + mov r0, r4 + str r2, [r1, #4] + bl DrawCellImpl_ + ldr r0, _020B9E2C ; =_021109DC + mvn r1, #0 + str r1, [r0, #4] + b _020B9E20 +_020B9E18: + mov r0, r4 + bl DrawCellImpl_ +_020B9E20: + mov r0, #1 + bl NNS_G2dPopMtx + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B9E2C: .word _021109DC +_020B9E30: .word _021D94D8 +_020B9E34: .word FX_SinCosTable_ + arm_func_end DrawCellAnimationImpl_ + + arm_func_start DrawNode_ +DrawNode_: ; 0x020B9E38 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + ldr r0, [r5, #8] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r4, [r5] + bl NNS_G2dPushMtx + ldrh r0, [r5, #0x1e] + tst r0, #8 + beq _020B9EA0 + ldr r0, _020B9F04 ; =_021D94D8 + ldrsh r7, [r5, #0x1a] + ldr r0, [r0, #8] + ldrsh r6, [r5, #0x18] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, _020B9F04 ; =_021D94D8 + rsbne r6, r6, #0 + ldr r0, [r0, #8] + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + rsbne r7, r7, #0 + mov r0, r6, lsl #0xc + mov r1, r7, lsl #0xc + mov r2, #0 + bl NNS_G2dTranslate +_020B9EA0: + ldrh r0, [r5, #0x1e] + tst r0, #4 + beq _020B9ED4 + ldrh r0, [r5, #0x1c] + ldr r2, _020B9F08 ; =FX_SinCosTable_ + mov r0, r0, asr #4 + mov r1, r0, lsl #1 + add r0, r1, #1 + mov r3, r1, lsl #1 + mov r1, r0, lsl #1 + ldrsh r0, [r2, r3] + ldrsh r1, [r2, r1] + bl NNS_G2dRotZ +_020B9ED4: + ldrh r0, [r5, #0x1e] + tst r0, #2 + beq _020B9EF0 + ldr r0, [r5, #0x10] + ldr r1, [r5, #0x14] + mov r2, #0x1000 + bl NNS_G2dScale +_020B9EF0: + mov r0, r4 + bl DrawCellAnimationImpl_ + mov r0, #1 + bl NNS_G2dPopMtx + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B9F04: .word _021D94D8 +_020B9F08: .word FX_SinCosTable_ + arm_func_end DrawNode_ + + arm_func_start NNS_G2dInitRenderer +NNS_G2dInitRenderer: ; 0x020B9F0C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + bl NNS_G2dInitRndCore + mov r6, #0 + str r6, [r4, #0x70] + str r6, [r4, #0x74] + str r6, [r4, #0x78] + str r6, [r4, #0x7c] + str r6, [r4, #0x80] + str r6, [r4, #0x84] + strh r6, [r4, #0x88] + strh r6, [r4, #0x8a] + str r6, [r4, #0x8c] + str r6, [r4, #0x90] + strh r6, [r4, #0x94] + ldr r1, _020B9FB4 ; =_021D94D8 + ldr r2, _020B9FB8 ; =0x0000FFFE + ldr r0, _020B9FBC ; =_021109DC + ldr r7, _020B9FC0 ; =_021D9C68 + str r6, [r1, #0xc] + strh r2, [r0] + mvn r5, #0 + mov r4, #0x10 +_020B9F68: + mov r0, r5 + mov r2, r4 + add r1, r7, #0x10 + bl MIi_CpuClearFast + add r6, r6, #1 + cmp r6, #0x20 + add r7, r7, #0x20 + blt _020B9F68 + ldr r3, _020B9FB4 ; =_021D94D8 + mov r0, #0 + strh r0, [r3] + ldr r1, _020B9FC4 ; =_021D9568 + mov r2, #0x100 + strh r0, [r3, #2] + bl MIi_CpuClearFast + ldr r0, _020B9FB4 ; =_021D94D8 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020B9FB4: .word _021D94D8 +_020B9FB8: .word 0x0000FFFE +_020B9FBC: .word _021109DC +_020B9FC0: .word _021D9C68 +_020B9FC4: .word _021D9568 + arm_func_end NNS_G2dInitRenderer + + arm_func_start NNS_G2dAddRendererTargetSurface +NNS_G2dAddRendererTargetSurface: ; 0x020B9FC8 + ldr r2, [r0, #0x70] + str r2, [r1, #0x30] + str r1, [r0, #0x70] + bx lr + arm_func_end NNS_G2dAddRendererTargetSurface + + arm_func_start NNS_G2dInitRenderSurface +NNS_G2dInitRenderSurface: ; 0x020B9FD8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, r4 + mov r0, #0 + mov r2, #0x48 + bl MIi_CpuClear16 + mov r0, #1 + str r0, [r4, #0x10] + mov r0, #3 + ldr r1, _020BA024 ; =RndCoreCBFuncBeforeCell_ + str r0, [r4, #0x14] + ldr r0, _020BA028 ; =RndCoreCBFuncAfterCell_ + str r1, [r4, #0x18] + ldr r1, _020BA02C ; =RndCoreCBFuncBeforeOBJ_ + str r0, [r4, #0x1c] + ldr r0, _020BA030 ; =RndCoreCBFuncAfterOBJ_ + str r1, [r4, #0x20] + str r0, [r4, #0x24] + ldmia sp!, {r4, pc} + .align 2, 0 +_020BA024: .word RndCoreCBFuncBeforeCell_ +_020BA028: .word RndCoreCBFuncAfterCell_ +_020BA02C: .word RndCoreCBFuncBeforeOBJ_ +_020BA030: .word RndCoreCBFuncAfterOBJ_ + arm_func_end NNS_G2dInitRenderSurface + + arm_func_start NNS_G2dBeginRendering +NNS_G2dBeginRendering: ; 0x020BA034 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r5, _020BA0C4 ; =_021D94D8 + mov r4, #0 + str r0, [r5, #8] + ldr r1, _020BA0C8 ; =0x0000FFFE + ldr r0, _020BA0CC ; =_021109DC + str r4, [r5, #0xc] + strh r1, [r0] + ldrh r0, [r5] + cmp r0, #0 + ble _020BA090 + ldr r8, _020BA0D0 ; =_021D9C68 + mvn r7, #0 + mov r6, #0x10 +_020BA06C: + mov r0, r7 + mov r2, r6 + add r1, r8, #0x10 + bl MIi_CpuClearFast + ldrh r0, [r5] + add r4, r4, #1 + add r8, r8, #0x20 + cmp r4, r0 + blt _020BA06C +_020BA090: + ldr r3, _020BA0C4 ; =_021D94D8 + mov r0, #0 + strh r0, [r3] + ldr r1, _020BA0D4 ; =_021D9568 + mov r2, #0x100 + strh r0, [r3, #2] + bl MIi_CpuClearFast + ldr r0, _020BA0D8 ; =0x04000444 + mov r1, #0 + str r1, [r0] + str r1, [r0, #0x10] + bl NNSi_G2dIdentity + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020BA0C4: .word _021D94D8 +_020BA0C8: .word 0x0000FFFE +_020BA0CC: .word _021109DC +_020BA0D0: .word _021D9C68 +_020BA0D4: .word _021D9568 +_020BA0D8: .word 0x04000444 + arm_func_end NNS_G2dBeginRendering + + arm_func_start NNS_G2dEndRendering +NNS_G2dEndRendering: ; 0x020BA0DC + stmdb sp!, {r3, lr} + ldr r1, _020BA140 ; =0x04000448 + mov r2, #1 + ldr r0, _020BA144 ; =_021D94D8 + str r2, [r1] + ldr r3, [r0, #8] + ldr r2, [r3, #0x7c] + cmp r2, #0 + beq _020BA130 + tst r2, #1 + movne r1, #0 + strne r1, [r0, #4] + tst r2, #2 + beq _020BA120 + mov r0, #0 + str r0, [r3, #0x74] + bl NNS_G2dRndCoreEndRendering +_020BA120: + ldr r0, _020BA144 ; =_021D94D8 + mov r1, #0 + ldr r0, [r0, #8] + str r1, [r0, #0x7c] +_020BA130: + ldr r0, _020BA144 ; =_021D94D8 + mov r1, #0 + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020BA140: .word 0x04000448 +_020BA144: .word _021D94D8 + arm_func_end NNS_G2dEndRendering + + arm_func_start NNS_G2dDrawCellAnimation +NNS_G2dDrawCellAnimation: ; 0x020BA148 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020BA1AC ; =_021D94D8 + mov r5, r0 + ldr r1, [r1, #8] + ldr r1, [r1, #0x80] + cmp r1, #0 + beq _020BA1A4 + bl NNSi_G2dGetOamSoftEmuAutoZOffsetStep + mov r4, r0 + mov r0, #1 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + ldr r0, _020BA1AC ; =_021D94D8 + ldr r0, [r0, #8] + ldr r0, [r0, #0x80] + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + mov r0, r5 + bl DrawCellAnimationImpl_ + mov r0, #0 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + mov r0, r4 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + bl NNSi_G2dResetOamSoftEmuAutoZOffset + ldmia sp!, {r3, r4, r5, pc} +_020BA1A4: + bl DrawCellAnimationImpl_ + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BA1AC: .word _021D94D8 + arm_func_end NNS_G2dDrawCellAnimation + + arm_func_start NNS_G2dDrawMultiCell +NNS_G2dDrawMultiCell: ; 0x020BA1B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r5, r0 + ldr r0, [r5, #8] + cmp r0, #1 + bne _020BA3AC + ldr r0, [r5] + mov r2, #0 + ldrh r0, [r0, #2] + cmp r0, #0 + bls _020BA204 + ldr r3, _020BA478 ; =_021DA068 + mov r4, r2 +_020BA1E0: + add r0, r3, r2, lsl #2 + str r4, [r0, #4] + ldr r0, [r5] + add r2, r2, #1 + ldrh r1, [r0, #2] + mov r0, r2, lsl #0x10 + mov r2, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020BA1E0 +_020BA204: + ldr r6, _020BA47C ; =_021D94D8 + mov r0, #1 + str r0, [r6, #0xf94] + ldr r0, [r6, #8] + mov sl, #0 + ldr r0, [r0, #0x80] + cmp r0, #0 + beq _020BA2FC + bl NNSi_G2dGetOamSoftEmuAutoZOffsetStep + str r0, [sp] + mov r0, #1 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + mov r0, r6 + ldr r0, [r0, #8] + ldr r0, [r0, #0x80] + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + ldr r2, [r5] + ldrh r0, [r2] + cmp r0, #0 + bls _020BA2E4 + ldr fp, _020BA480 ; =_021D9FD8 +_020BA258: + ldr r0, [r2, #4] + ldr r8, [r5, #0xc] + add r7, r0, sl, lsl #3 + ldrh r0, [r7, #6] + and r0, r0, #0xff00 + mov r0, r0, lsl #8 + mov sb, r0, lsr #0x10 + strh sb, [fp, #0x90] + bl NNS_G2dPushMtx + ldrsh r4, [r7, #4] + ldr r0, [r6, #8] + ldrsh r7, [r7, #2] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, [r6, #8] + rsbne r7, r7, #0 + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + rsbne r4, r4, #0 + mov r2, #0 + mov r0, r7, lsl #0xc + mov r1, r4, lsl #0xc + bl NNS_G2dTranslate + mov r0, #0x5c + mla r0, sb, r0, r8 + bl DrawCellAnimationImpl_ + mov r0, #1 + bl NNS_G2dPopMtx + ldr r2, [r5] + add r0, sl, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r2] + mov sl, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020BA258 +_020BA2E4: + mov r0, #0 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + ldr r0, [sp] + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + bl NNSi_G2dResetOamSoftEmuAutoZOffset + b _020BA39C +_020BA2FC: + ldr r2, [r5] + ldrh r0, [r2] + cmp r0, #0 + bls _020BA39C + ldr fp, _020BA480 ; =_021D9FD8 +_020BA310: + ldr r0, [r2, #4] + ldr r8, [r5, #0xc] + add r7, r0, sl, lsl #3 + ldrh r0, [r7, #6] + and r0, r0, #0xff00 + mov r0, r0, lsl #8 + mov sb, r0, lsr #0x10 + strh sb, [fp, #0x90] + bl NNS_G2dPushMtx + ldrsh r4, [r7, #4] + ldr r0, [r6, #8] + ldrsh r7, [r7, #2] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, [r6, #8] + rsbne r7, r7, #0 + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + rsbne r4, r4, #0 + mov r2, #0 + mov r0, r7, lsl #0xc + mov r1, r4, lsl #0xc + bl NNS_G2dTranslate + mov r0, #0x5c + mla r0, sb, r0, r8 + bl DrawCellAnimationImpl_ + mov r0, #1 + bl NNS_G2dPopMtx + ldr r2, [r5] + add r0, sl, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r2] + mov sl, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020BA310 +_020BA39C: + ldr r0, _020BA47C ; =_021D94D8 + mov r1, #0 + str r1, [r0, #0xf94] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BA3AC: + ldr r0, _020BA47C ; =_021D94D8 + ldr r4, [r5, #0xc] + ldr r0, [r0, #8] + ldr r0, [r0, #0x80] + cmp r0, #0 + beq _020BA438 + bl NNSi_G2dGetOamSoftEmuAutoZOffsetStep + mov r6, r0 + mov r0, #1 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + ldr r0, _020BA47C ; =_021D94D8 + ldr r0, [r0, #8] + ldr r0, [r0, #0x80] + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + ldr r0, [r5] + mov r7, #0 + ldrh r0, [r0] + cmp r0, #0 + bls _020BA420 + mov r8, #0x28 +_020BA3FC: + mla r0, r7, r8, r4 + bl DrawNode_ + ldr r1, [r5] + add r0, r7, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r1] + mov r7, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020BA3FC +_020BA420: + mov r0, #0 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + mov r0, r6 + bl NNSi_G2dSetOamSoftEmuAutoZOffsetStep + bl NNSi_G2dResetOamSoftEmuAutoZOffset + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BA438: + ldr r0, [r5] + mov r6, #0 + ldrh r0, [r0] + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r7, #0x28 +_020BA450: + mla r0, r6, r7, r4 + bl DrawNode_ + ldr r1, [r5] + add r0, r6, #1 + mov r0, r0, lsl #0x10 + ldrh r1, [r1] + mov r6, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bhi _020BA450 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020BA478: .word _021DA068 +_020BA47C: .word _021D94D8 +_020BA480: .word _021D9FD8 + arm_func_end NNS_G2dDrawMultiCell + + arm_func_start NNS_G2dDrawMultiCellAnimation +NNS_G2dDrawMultiCellAnimation: ; 0x020BA484 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldrh r0, [r4, #0x5a] + cmp r0, #0 + bne _020BA4A4 + add r0, r4, #0x34 + bl NNS_G2dDrawMultiCell + ldmia sp!, {r4, r5, r6, pc} +_020BA4A4: + bl NNS_G2dPushMtx + ldrh r0, [r4, #0x5a] + tst r0, #8 + beq _020BA4F4 + ldr r0, _020BA558 ; =_021D94D8 + ldrsh r6, [r4, #0x56] + ldr r0, [r0, #8] + ldrsh r5, [r4, #0x54] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, _020BA558 ; =_021D94D8 + rsbne r5, r5, #0 + ldr r0, [r0, #8] + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + rsbne r6, r6, #0 + mov r0, r5, lsl #0xc + mov r1, r6, lsl #0xc + mov r2, #0 + bl NNS_G2dTranslate +_020BA4F4: + ldrh r0, [r4, #0x5a] + tst r0, #4 + beq _020BA528 + ldrh r0, [r4, #0x58] + ldr r2, _020BA55C ; =FX_SinCosTable_ + mov r0, r0, asr #4 + mov r1, r0, lsl #1 + add r0, r1, #1 + mov r3, r1, lsl #1 + mov r1, r0, lsl #1 + ldrsh r0, [r2, r3] + ldrsh r1, [r2, r1] + bl NNS_G2dRotZ +_020BA528: + ldrh r0, [r4, #0x5a] + tst r0, #2 + beq _020BA544 + ldr r0, [r4, #0x4c] + ldr r1, [r4, #0x50] + mov r2, #0x1000 + bl NNS_G2dScale +_020BA544: + add r0, r4, #0x34 + bl NNS_G2dDrawMultiCell + mov r0, #1 + bl NNS_G2dPopMtx + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020BA558: .word _021D94D8 +_020BA55C: .word FX_SinCosTable_ + arm_func_end NNS_G2dDrawMultiCellAnimation + + arm_func_start NNS_G2dPushMtx +NNS_G2dPushMtx: ; 0x020BA560 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _020BA764 ; =_021D94D8 + ldr r1, [r0, #8] + ldr r1, [r1, #0x7c] + tst r1, #1 + bne _020BA6A0 + ldr r1, [r0, #0xc] + mov r0, r1, lsl #0x10 + add r6, r1, #1 + cmp r6, #0x20 + mov r5, r0, lsr #0x10 + movlt r0, #1 + movge r0, #0 + cmp r0, #0 + beq _020BA640 + ldr r0, _020BA764 ; =_021D94D8 + ldr r1, [r0, #4] + cmp r1, #0 + beq _020BA5E4 + ldr r3, [r0, #0xc] + mov r0, #0x18 + mul r8, r3, r0 + ldr r4, _020BA768 ; =_021D9678 + ldr r1, _020BA76C ; =_021D94E8 + mul r7, r6, r0 + ldr r2, [r4, r8] + ldr r0, [r1, r3, lsl #2] + ldr r3, _020BA770 ; =_021D967C + str r2, [r4, r7] + ldr r2, [r3, r8] + str r0, [r1, r6, lsl #2] + str r2, [r3, r7] + b _020BA638 +_020BA5E4: + ldr r4, [r0, #0xc] + mov r0, #0x18 + mul lr, r4, r0 + ldr r1, _020BA774 ; =_021D9668 + mul ip, r6, r0 + ldr r8, _020BA778 ; =_021D9968 + add sl, r1, lr + ldr r7, _020BA76C ; =_021D94E8 + add sb, r1, ip + ldmia sl!, {r0, r1, r2, r3} + stmia sb!, {r0, r1, r2, r3} + ldmia sl, {r0, r1} + stmia sb, {r0, r1} + add sb, r8, lr + ldr r4, [r7, r4, lsl #2] + add r8, r8, ip + ldmia sb!, {r0, r1, r2, r3} + stmia r8!, {r0, r1, r2, r3} + str r4, [r7, r6, lsl #2] + ldmia sb, {r0, r1} + stmia r8, {r0, r1} +_020BA638: + ldr r0, _020BA764 ; =_021D94D8 + str r6, [r0, #0xc] +_020BA640: + ldr r0, _020BA764 ; =_021D94D8 + ldr r2, _020BA77C ; =_021D9568 + ldr r0, [r0, #0xc] + mov r6, r5, lsl #3 + mov r0, r0, lsl #0x10 + add r4, r2, r5, lsl #3 + mov r3, r0, lsr #0x10 + mov r5, r3, lsl #3 + ldrh r1, [r2, r6] + ldrh r0, [r4, #2] + add r3, r2, r3, lsl #3 + strh r1, [r2, r5] + strh r0, [r3, #2] + ldrh r2, [r4, #4] + ldrh r0, [r4, #6] + ldr r1, _020BA780 ; =_021D956C + strh r2, [r3, #4] + strh r0, [r3, #6] + ldrh r0, [r1, r6] + cmp r0, #1 + moveq r0, #2 + streqh r0, [r1, r5] + strneh r0, [r1, r5] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020BA6A0: + ldr r0, [r0, #0xc] + add r4, r0, #1 + cmp r4, #0x20 + movlt r0, #1 + movge r0, #0 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, _020BA764 ; =_021D94D8 + ldr r1, [r0, #4] + cmp r1, #0 + beq _020BA704 + ldr r3, [r0, #0xc] + mov r0, #0x18 + mul r7, r3, r0 + ldr r5, _020BA768 ; =_021D9678 + ldr r1, _020BA76C ; =_021D94E8 + mul r6, r4, r0 + ldr r2, [r5, r7] + ldr r0, [r1, r3, lsl #2] + ldr r3, _020BA770 ; =_021D967C + str r2, [r5, r6] + ldr r2, [r3, r7] + str r0, [r1, r4, lsl #2] + str r2, [r3, r6] + b _020BA758 +_020BA704: + ldr sb, [r0, #0xc] + mov r0, #0x18 + mul lr, sb, r0 + ldr r1, _020BA774 ; =_021D9668 + mul r8, r4, r0 + ldr ip, _020BA778 ; =_021D9968 + add r5, r1, lr + ldr r6, _020BA76C ; =_021D94E8 + add r7, r1, r8 + ldmia r5!, {r0, r1, r2, r3} + stmia r7!, {r0, r1, r2, r3} + ldmia r5, {r0, r1} + ldr r5, [r6, sb, lsl #2] + add lr, ip, lr + stmia r7, {r0, r1} + add ip, ip, r8 + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1} + stmia ip, {r0, r1} + str r5, [r6, r4, lsl #2] +_020BA758: + ldr r0, _020BA764 ; =_021D94D8 + str r4, [r0, #0xc] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020BA764: .word _021D94D8 +_020BA768: .word _021D9678 +_020BA76C: .word _021D94E8 +_020BA770: .word _021D967C +_020BA774: .word _021D9668 +_020BA778: .word _021D9968 +_020BA77C: .word _021D9568 +_020BA780: .word _021D956C + arm_func_end NNS_G2dPushMtx + + arm_func_start NNS_G2dPopMtx +NNS_G2dPopMtx: ; 0x020BA784 + ldr r0, _020BA7C8 ; =_021D94D8 + ldr r0, [r0, #0xc] + cmp r0, #0 + movle r0, #1 + movgt r0, #0 + cmp r0, #0 + bxne lr + ldr r1, _020BA7C8 ; =_021D94D8 + ldr r0, _020BA7CC ; =_021109DC + ldr r3, [r1, #0xc] + ldrh r2, [r0] + sub r3, r3, #1 + str r3, [r1, #0xc] + cmp r2, r3 + ldrgt r1, _020BA7D0 ; =0x0000FFFE + strgth r1, [r0] + bx lr + .align 2, 0 +_020BA7C8: .word _021D94D8 +_020BA7CC: .word _021109DC +_020BA7D0: .word 0x0000FFFE + arm_func_end NNS_G2dPopMtx + + arm_func_start NNS_G2dTranslate +NNS_G2dTranslate: ; 0x020BA7D4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + ldr r3, _020BA8B8 ; =_021D94D8 + mov r4, r2 + ldr r2, [r3, #4] + cmp r2, #0 + beq _020BA834 + ldr r2, [r3, #0xc] + mov r3, #0x18 + mul r6, r2, r3 + ldr r5, _020BA8BC ; =_021D9678 + ldr r3, _020BA8C0 ; =_021D94E8 + ldr ip, [r5, r6] + ldr lr, _020BA8C4 ; =_021D967C + add r0, ip, r0 + str r0, [r5, r6] + ldr r0, [r3, r2, lsl #2] + ldr ip, [lr, r6] + add r0, r0, r4 + add r1, ip, r1 + str r0, [r3, r2, lsl #2] + add sp, sp, #0x18 + str r1, [lr, r6] + ldmia sp!, {r4, r5, r6, pc} +_020BA834: + mov ip, #0x1000 + mov r2, #0 + str r0, [sp, #0x10] + str ip, [sp] + str r2, [sp, #4] + str r2, [sp, #8] + str ip, [sp, #0xc] + str r1, [sp, #0x14] + ldr r1, [r3, #0xc] + mov r0, #0x18 + mul r3, r1, r0 + ldr r2, _020BA8C8 ; =_021D9668 + add r0, sp, #0 + add r1, r2, r3 + add r2, r2, r3 + bl NNSi_G2dMtxConcat32 + ldr r1, _020BA8B8 ; =_021D94D8 + mov r0, #0x18 + ldr r1, [r1, #0xc] + ldr r2, _020BA8CC ; =_021D9968 + mul r3, r1, r0 + add r1, r2, r3 + add r0, sp, #0 + add r2, r2, r3 + bl NNSi_G2dMtxConcat32 + ldr r0, _020BA8B8 ; =_021D94D8 + ldr r2, _020BA8C0 ; =_021D94E8 + ldr r1, [r0, #0xc] + ldr r0, [r2, r1, lsl #2] + add r0, r0, r4 + str r0, [r2, r1, lsl #2] + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020BA8B8: .word _021D94D8 +_020BA8BC: .word _021D9678 +_020BA8C0: .word _021D94E8 +_020BA8C4: .word _021D967C +_020BA8C8: .word _021D9668 +_020BA8CC: .word _021D9968 + arm_func_end NNS_G2dTranslate + + arm_func_start NNS_G2dScale +NNS_G2dScale: ; 0x020BA8D0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x18 + ldr r2, _020BAA0C ; =_021D94D8 + mov lr, #0 + ldr r3, [r2, #0xc] + mov r2, #0x18 + mul ip, r3, r2 + mov r5, r0 + mov r4, r1 + ldr r2, _020BAA10 ; =_021D9668 + add r0, sp, #0 + add r1, r2, ip + add r2, r2, ip + str r5, [sp] + str lr, [sp, #4] + str lr, [sp, #8] + str r4, [sp, #0xc] + str lr, [sp, #0x10] + str lr, [sp, #0x14] + bl NNSi_G2dMtxConcat32 + mov r0, r5 + bl FX_Inv + mov r1, #0 + str r0, [sp] + mov r0, r4 + str r1, [sp, #4] + str r1, [sp, #8] + bl FX_Inv + mov ip, #0 + ldr r1, _020BAA0C ; =_021D94D8 + str r0, [sp, #0xc] + ldr r1, [r1, #0xc] + mov r0, #0x18 + mul r3, r1, r0 + ldr r2, _020BAA14 ; =_021D9968 + add r0, sp, #0 + add r1, r2, r3 + add r2, r2, r3 + str ip, [sp, #0x10] + str ip, [sp, #0x14] + bl NNSi_G2dMtxConcat32 + ldr r0, _020BAA0C ; =_021D94D8 + ldr r0, [r0, #4] + cmp r0, #0 + bne _020BA99C + ldr r1, _020BAA18 ; =_021109DC + ldr r0, _020BAA1C ; =0x0000FFFE + ldrh r1, [r1] + cmp r1, r0 + movne r0, #1 + bne _020BA9A0 +_020BA99C: + mov r0, #0 +_020BA9A0: + cmp r0, #0 + bne _020BA9B8 + ldr r1, _020BAA0C ; =_021D94D8 + ldr r0, _020BAA18 ; =_021109DC + ldr r1, [r1, #0xc] + strh r1, [r0] +_020BA9B8: + ldr r1, _020BAA0C ; =_021D94D8 + ldr r2, _020BAA20 ; =_021D9568 + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x10 + add ip, r2, r0, lsr #13 + ldrh r0, [ip, #4] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020BAA04 +_020BA9DC: ; jump table + b _020BA9EC ; case 0 + b _020BAA04 ; case 1 + b _020BA9EC ; case 2 + b _020BA9EC ; case 3 +_020BA9EC: + ldrh r3, [r1, #2] + mov r0, #1 + add r2, r3, #1 + strh r2, [r1, #2] + strh r3, [ip, #2] + strh r0, [ip, #4] +_020BAA04: + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BAA0C: .word _021D94D8 +_020BAA10: .word _021D9668 +_020BAA14: .word _021D9968 +_020BAA18: .word _021109DC +_020BAA1C: .word 0x0000FFFE +_020BAA20: .word _021D9568 + arm_func_end NNS_G2dScale + + arm_func_start NNS_G2dRotZ +NNS_G2dRotZ: ; 0x020BAA24 + stmdb sp!, {r3, lr} + sub sp, sp, #0x18 + ldr r2, _020BAB2C ; =_021D94D8 + mov lr, #0 + ldr r3, [r2, #0xc] + mov r2, #0x18 + mul ip, r3, r2 + rsb r3, r0, #0 + str r0, [sp, #4] + ldr r2, _020BAB30 ; =_021D9668 + add r0, sp, #0 + str r1, [sp] + str r1, [sp, #0xc] + add r1, r2, ip + add r2, r2, ip + str r3, [sp, #8] + str lr, [sp, #0x10] + str lr, [sp, #0x14] + bl NNSi_G2dMtxConcat32 + ldr r1, _020BAB2C ; =_021D94D8 + mov r0, #0x18 + ldr r1, [r1, #0xc] + ldr r2, _020BAB34 ; =_021D9968 + mul r3, r1, r0 + add r1, r2, r3 + add r0, sp, #0 + add r2, r2, r3 + bl NNSi_G2dMtxConcat32 + ldr r0, _020BAB2C ; =_021D94D8 + ldr r0, [r0, #4] + cmp r0, #0 + bne _020BAABC + ldr r1, _020BAB38 ; =_021109DC + ldr r0, _020BAB3C ; =0x0000FFFE + ldrh r1, [r1] + cmp r1, r0 + movne r0, #1 + bne _020BAAC0 +_020BAABC: + mov r0, #0 +_020BAAC0: + cmp r0, #0 + bne _020BAAD8 + ldr r1, _020BAB2C ; =_021D94D8 + ldr r0, _020BAB38 ; =_021109DC + ldr r1, [r1, #0xc] + strh r1, [r0] +_020BAAD8: + ldr r1, _020BAB2C ; =_021D94D8 + ldr r2, _020BAB40 ; =_021D9568 + ldr r0, [r1, #0xc] + mov r0, r0, lsl #0x10 + add ip, r2, r0, lsr #13 + ldrh r0, [ip, #4] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020BAB24 +_020BAAFC: ; jump table + b _020BAB0C ; case 0 + b _020BAB24 ; case 1 + b _020BAB0C ; case 2 + b _020BAB0C ; case 3 +_020BAB0C: + ldrh r3, [r1, #2] + mov r0, #1 + add r2, r3, #1 + strh r2, [r1, #2] + strh r3, [ip, #2] + strh r0, [ip, #4] +_020BAB24: + add sp, sp, #0x18 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BAB2C: .word _021D94D8 +_020BAB30: .word _021D9668 +_020BAB34: .word _021D9968 +_020BAB38: .word _021109DC +_020BAB3C: .word 0x0000FFFE +_020BAB40: .word _021D9568 + arm_func_end NNS_G2dRotZ + + arm_func_start NNS_G2dGetRendererPaletteTbl +NNS_G2dGetRendererPaletteTbl: ; 0x020BAB44 + ldr r0, [r0, #0x78] + bx lr + arm_func_end NNS_G2dGetRendererPaletteTbl + + arm_func_start NNS_G2dSetRendererImageProxy +NNS_G2dSetRendererImageProxy: ; 0x020BAB4C + ldr ip, _020BAB54 ; =NNS_G2dSetRndCoreImageProxy + bx ip + .align 2, 0 +_020BAB54: .word NNS_G2dSetRndCoreImageProxy + arm_func_end NNS_G2dSetRendererImageProxy + + arm_func_start NNSi_G2dMtxConcat32 +NNSi_G2dMtxConcat32: ; 0x020BAB58 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + ldr r4, [r0, #4] + ldr r3, [r1, #8] + mov ip, r2 + smull r6, r5, r4, r3 + ldr r4, [r0] + ldr r3, [r1] + cmp ip, r1 + smlal r6, r5, r4, r3 + mov r3, r6, lsr #0xc + addeq r2, sp, #0 + orr r3, r3, r5, lsl #20 + str r3, [r2] + ldr r4, [r0, #4] + ldr r3, [r1, #0xc] + ldr r5, [r0] + smull r7, r6, r4, r3 + ldr r3, [r1, #4] + add lr, sp, #0 + smlal r7, r6, r5, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + str r3, [r2, #4] + ldr r4, [r0, #0xc] + ldr r3, [r1, #8] + ldr r5, [r0, #8] + smull r7, r6, r4, r3 + ldr r3, [r1] + cmp r2, lr + smlal r7, r6, r5, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + str r3, [r2, #8] + ldr r4, [r0, #0xc] + ldr r3, [r1, #0xc] + ldr r5, [r0, #8] + smull r7, r6, r4, r3 + ldr r3, [r1, #4] + addne sp, sp, #0x18 + smlal r7, r6, r5, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + str r3, [r2, #0xc] + ldr r4, [r0, #0x14] + ldr r3, [r1, #8] + ldr r5, [r0, #0x10] + smull r7, r6, r4, r3 + ldr r3, [r1] + ldr r4, [r1, #0x10] + smlal r7, r6, r5, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r6, lsl #20 + add r3, r4, r3 + str r3, [r2, #0x10] + ldr r4, [r0, #0x14] + ldr r3, [r1, #0xc] + ldr r5, [r0, #0x10] + ldr r0, [r1, #4] + smull r6, r3, r4, r3 + smlal r6, r3, r5, r0 + mov r0, r6, lsr #0xc + ldr r1, [r1, #0x14] + orr r0, r0, r3, lsl #20 + add r0, r1, r0 + str r0, [r2, #0x14] + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldmia lr!, {r0, r1, r2, r3} + stmia ip!, {r0, r1, r2, r3} + ldmia lr, {r0, r1} + stmia ip, {r0, r1} + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_G2dMtxConcat32 + + arm_func_start NNSi_G2dGetCellTransferState +NNSi_G2dGetCellTransferState: ; 0x020BAC7C + ldr r2, _020BAC90 ; =_021DA470 + mov r1, #0x30 + ldr r2, [r2, #8] + mla r0, r1, r0, r2 + bx lr + .align 2, 0 +_020BAC90: .word _021DA470 + arm_func_end NNSi_G2dGetCellTransferState + + arm_func_start NNSi_G2dInitCellTransferState +NNSi_G2dInitCellTransferState: ; 0x020BAC94 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, _020BAD34 ; =_021DA470 + mov r4, #0x30 + ldr ip, [ip, #8] + mov r7, r1 + mla r4, r0, r4, ip + mov r0, r4 + mov r6, r2 + mov r5, r3 + bl NNSi_G2dInitializeVRamLocation + mvn r0, #0 + cmp r7, r0 + beq _020BACD8 + mov r0, r4 + mov r2, r7 + mov r1, #0 + bl NNSi_G2dSetVramLocation +_020BACD8: + mvn r0, #0 + cmp r6, r0 + beq _020BACF4 + mov r0, r4 + mov r2, r6 + mov r1, #1 + bl NNSi_G2dSetVramLocation +_020BACF4: + mvn r0, #0 + cmp r5, r0 + beq _020BAD10 + mov r0, r4 + mov r2, r5 + mov r1, #2 + bl NNSi_G2dSetVramLocation +_020BAD10: + ldr r1, [sp, #0x18] + ldr r0, [sp, #0x1c] + str r1, [r4, #0xc] + ldr r1, [sp, #0x20] + str r0, [r4, #0x10] + ldr r0, [sp, #0x24] + str r1, [r4, #0x14] + str r0, [r4, #0x18] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020BAD34: .word _021DA470 + arm_func_end NNSi_G2dInitCellTransferState + + arm_func_start NNS_G2dInitCellTransferStateManager +NNS_G2dInitCellTransferStateManager: ; 0x020BAD38 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _020BAD98 ; =_021DA470 + movs r6, r1 + mov r7, r0 + mov r5, #0 + stmia r3, {r2, r6, r7} + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r4, r5 +_020BAD58: + mov r0, r7 + bl NNSi_G2dInitializeVRamLocation + str r4, [r7, #0xc] + str r4, [r7, #0x10] + str r4, [r7, #0x14] + str r4, [r7, #0x18] + str r4, [r7, #0x1c] + str r4, [r7, #0x20] + str r4, [r7, #0x24] + str r4, [r7, #0x28] + add r5, r5, #1 + str r4, [r7, #0x2c] + cmp r5, r6 + add r7, r7, #0x30 + blo _020BAD58 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020BAD98: .word _021DA470 + arm_func_end NNS_G2dInitCellTransferStateManager + + arm_func_start NNS_G2dUpdateCellTransferStateManager +NNS_G2dUpdateCellTransferStateManager: ; 0x020BAD9C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r1, _020BAEB8 ; =_021DA470 + mov r0, #0 + str r0, [sp, #4] + ldr r0, [r1, #4] + cmp r0, #0 + addls sp, sp, #8 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #4] + str r0, [sp] +_020BADC8: + ldr r4, _020BAEB8 ; =_021DA470 + ldr r0, [sp] + ldr r1, [r4, #8] + add r8, r1, r0 + ldr r0, [r8, #0x1c] + cmp r0, #0 + beq _020BAE84 + mov r7, #0 + cmp r7, #3 + bge _020BAE7C + ldr r5, _020BAEBC ; =_02109328 + mov fp, r7 + mov r6, #1 +_020BADFC: + ldr r0, [r8, #0x24] + mov r1, fp + tst r0, r6, lsl r7 + beq _020BAE18 + ldr r0, [r8, #0x20] + tst r0, r6, lsl r7 + movne r1, r6 +_020BAE18: + cmp r1, #0 + beq _020BAE70 + cmp r7, #0 + ldreq sl, [r8, #0x14] + ldr sb, [r5, r7, lsl #2] + mov r0, r8 + mov r1, r7 + ldrne sl, [r8, #0x10] + bl NNSi_G2dGetVramLocation + ldr r2, [r8, #0x28] + mov r1, r0 + mov r0, sb + ldr r3, [r8, #0x2c] + ldr sb, [r4] + add r2, sl, r2 + blx sb + cmp r0, #0 + beq _020BAE70 + mvn r0, r6, lsl r7 + ldr r1, [r8, #0x24] + and r0, r1, r0 + str r0, [r8, #0x24] +_020BAE70: + add r7, r7, #1 + cmp r7, #3 + blt _020BADFC +_020BAE7C: + mov r0, #0 + str r0, [r8, #0x20] +_020BAE84: + ldr r0, [sp, #4] + ldr r1, _020BAEB8 ; =_021DA470 + add r0, r0, #1 + str r0, [sp, #4] + ldr r0, [sp] + ldr r1, [r1, #4] + add r0, r0, #0x30 + str r0, [sp] + ldr r0, [sp, #4] + cmp r0, r1 + blo _020BADC8 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020BAEB8: .word _021DA470 +_020BAEBC: .word _02109328 + arm_func_end NNS_G2dUpdateCellTransferStateManager + + arm_func_start NNS_G2dSetCellTransferStateRequested +NNS_G2dSetCellTransferStateRequested: ; 0x020BAEC0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r4, r2 + bl NNSi_G2dGetCellTransferState + mvn r1, #0 + str r1, [r0, #0x24] + str r5, [r0, #0x28] + str r4, [r0, #0x2c] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G2dSetCellTransferStateRequested + + arm_func_start NNS_G2dGetNewCellTransferStateHandle +NNS_G2dGetNewCellTransferStateHandle: ; 0x020BAEE4 + ldr r1, _020BAF38 ; =_021DA470 + mov r0, #0 + ldr r3, [r1, #4] + cmp r3, #0 + bls _020BAF30 + ldr ip, [r1, #8] + mov r2, ip +_020BAF00: + ldr r1, [r2, #0x1c] + cmp r1, #1 + beq _020BAF20 + mov r1, #0x30 + mla r1, r0, r1, ip + mov r2, #1 + str r2, [r1, #0x1c] + bx lr +_020BAF20: + add r0, r0, #1 + cmp r0, r3 + add r2, r2, #0x30 + blo _020BAF00 +_020BAF30: + mvn r0, #0 + bx lr + .align 2, 0 +_020BAF38: .word _021DA470 + arm_func_end NNS_G2dGetNewCellTransferStateHandle + + arm_func_start NNS_G2dFreeCellTransferStateHandle +NNS_G2dFreeCellTransferStateHandle: ; 0x020BAF3C + stmdb sp!, {r4, lr} + ldr r2, _020BAF84 ; =_021DA470 + mov r1, #0x30 + ldr r2, [r2, #8] + mla r4, r0, r1, r2 + mov r0, r4 + bl NNSi_G2dInitializeVRamLocation + mov r0, #0 + str r0, [r4, #0xc] + str r0, [r4, #0x10] + str r0, [r4, #0x14] + str r0, [r4, #0x18] + str r0, [r4, #0x1c] + str r0, [r4, #0x20] + str r0, [r4, #0x24] + str r0, [r4, #0x28] + str r0, [r4, #0x2c] + ldmia sp!, {r4, pc} + .align 2, 0 +_020BAF84: .word _021DA470 + arm_func_end NNS_G2dFreeCellTransferStateHandle + + arm_func_start CalcSpriteParams_ +CalcSpriteParams_: ; 0x020BAF88 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r6, r0 + ldr r0, _020BB1C8 ; =0xC000C000 + ldmia r6, {r4, r5} + and r0, r4, r0 + and r4, r0, #0xc0000000 + mov lr, r4, lsr #0x1e + and r0, r0, #0xc000 + mov r5, r5, lsl #0x16 + mov ip, r0, asr #0xe + mov r5, r5, lsr #0x16 + ldr r4, _020BB1CC ; =_02109310 + mov r7, r5, lsl #0x10 + ldr r0, _020BB1D0 ; =_021092F8 + add r5, r4, ip, lsl #3 + mov r8, lr, lsl #1 + add r4, r0, ip, lsl #3 + ldrh r5, [r8, r5] + ldr r0, [sp, #0x20] + ldrh r4, [r8, r4] + str r5, [r0, #0x10] + mov r5, r1 + str r4, [r0, #0x14] + ldr r8, [r5, #0x14] + mov r4, r3 + cmp r8, #0 + mov r1, r7, lsr #0x10 + bne _020BB068 + ldr r3, [r5, #8] + ldr r7, [r5] + mov r3, r3, lsl #0x1a + orr r2, r3, r2, lsr #3 + orr r2, r2, #0x40000000 + orr r2, r2, r7, lsl #20 + ldr r3, [r5, #4] + ldr r7, [r5, #0x10] + orr r3, r2, r3, lsl #23 + ldr r2, _020BB1D4 ; =0x040004A8 + orr r3, r3, r7, lsl #29 + str r3, [r2] + ldr r2, [r5, #8] + ldr r3, [r5] + cmp r2, #4 + ldr r2, _020BB1D8 ; =_02109344 + moveq r1, r1, lsl #0xf + ldr r2, [r2, r3, lsl #2] + moveq r1, r1, lsr #0x10 + sub r2, r2, #1 + and r2, r1, r2 + mov r2, r2, lsl #0xf + str r2, [r0] + ldr r2, [r5] + mov r1, r1, asr r2 + mov r1, r1, lsl #0xf + b _020BB0D0 +_020BB068: + and r3, r8, #0x700000 + mov r3, r3, asr #0x14 + add r7, r3, #5 + mov r3, ip, lsl #0x10 + add ip, r2, r1, lsl r7 + mov r1, lr, lsl #0x10 + mov r8, r3, lsr #0x10 + ldr r7, _020BB1DC ; =_02109364 + ldr lr, [r5, #8] + mov r3, ip, lsr #3 + orr ip, r3, lr, lsl #26 + ldr r2, _020BB1E0 ; =_02109394 + mov lr, r1, lsr #0x10 + add r1, r2, r8, lsl #4 + add r3, r7, r8, lsl #4 + ldr r2, [r3, lr, lsl #2] + orr r3, ip, #0x40000000 + orr r2, r3, r2, lsl #20 + ldr r1, [r1, lr, lsl #2] + ldr r3, [r5, #0x10] + orr r2, r2, r1, lsl #23 + ldr r1, _020BB1D4 ; =0x040004A8 + orr r2, r2, r3, lsl #29 + str r2, [r1] + mov r1, #0 + str r1, [r0] +_020BB0D0: + str r1, [r0, #4] + ldr r2, [r0] + ldr r1, [r0, #0x10] + add r1, r2, r1, lsl #12 + str r1, [r0, #8] + ldr r2, [r0, #4] + ldr r1, [r0, #0x14] + add r1, r2, r1, lsl #12 + str r1, [r0, #0xc] + ldr r1, [r6] + mov r2, r1, lsl #2 + mov r1, r1, lsl #3 + mov ip, r2, lsr #0x1f + movs r3, r1, lsr #0x1f + beq _020BB11C + ldr r2, [r0] + ldr r1, [r0, #8] + str r1, [r0] + str r2, [r0, #8] +_020BB11C: + cmp ip, #0 + beq _020BB134 + ldr r2, [r0, #4] + ldr r1, [r0, #0xc] + str r1, [r0, #4] + str r2, [r0, #0xc] +_020BB134: + ldr r1, _020BB1E4 ; =_021DA47C + ldr r7, [r1] + cmp r7, #0 + beq _020BB15C + str r3, [sp] + add r1, r0, #4 + add r2, r0, #8 + add r3, r0, #0xc + str ip, [sp, #4] + blx r7 +_020BB15C: + ldr r0, [r6, #4] + ldr r1, [r6] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x1c + mov r3, r1, lsl #0x12 + ldr r1, [r5, #0xc] + mov r0, r0, lsl #0x10 + ldr r2, _020BB1E8 ; =_0210933C + mov r3, r3, lsr #0x1f + cmp r1, #0 + mov r0, r0, lsr #0x10 + ldr r1, [r2, r3, lsl #2] + movne r0, r0, lsl #9 + bne _020BB1A0 + cmp r1, #4 + moveq r0, #0 + movne r0, r0, lsl #5 +_020BB1A0: + cmp r1, #2 + moveq r2, #1 + movne r2, #0 + add r1, r4, r0 + rsb r0, r2, #4 + mov r1, r1, lsr r0 + ldr r0, _020BB1EC ; =0x040004AC + str r1, [r0] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020BB1C8: .word 0xC000C000 +_020BB1CC: .word _02109310 +_020BB1D0: .word _021092F8 +_020BB1D4: .word 0x040004A8 +_020BB1D8: .word _02109344 +_020BB1DC: .word _02109364 +_020BB1E0: .word _02109394 +_020BB1E4: .word _021DA47C +_020BB1E8: .word _0210933C +_020BB1EC: .word 0x040004AC + arm_func_end CalcSpriteParams_ + + arm_func_start NNSi_G2dSetOamSoftEmuAutoZOffsetFlag +NNSi_G2dSetOamSoftEmuAutoZOffsetFlag: ; 0x020BB1F0 + ldr r1, _020BB1FC ; =_021DA47C + str r0, [r1, #8] + bx lr + .align 2, 0 +_020BB1FC: .word _021DA47C + arm_func_end NNSi_G2dSetOamSoftEmuAutoZOffsetFlag + + arm_func_start NNSi_G2dResetOamSoftEmuAutoZOffset +NNSi_G2dResetOamSoftEmuAutoZOffset: ; 0x020BB200 + ldr r0, _020BB210 ; =_021DA47C + mov r1, #0 + str r1, [r0, #4] + bx lr + .align 2, 0 +_020BB210: .word _021DA47C + arm_func_end NNSi_G2dResetOamSoftEmuAutoZOffset + + arm_func_start NNSi_G2dSetOamSoftEmuAutoZOffsetStep +NNSi_G2dSetOamSoftEmuAutoZOffsetStep: ; 0x020BB214 + ldr r1, _020BB220 ; =_021109FC + str r0, [r1] + bx lr + .align 2, 0 +_020BB220: .word _021109FC + arm_func_end NNSi_G2dSetOamSoftEmuAutoZOffsetStep + + arm_func_start NNSi_G2dGetOamSoftEmuAutoZOffsetStep +NNSi_G2dGetOamSoftEmuAutoZOffsetStep: ; 0x020BB224 + ldr r0, _020BB230 ; =_021109FC + ldr r0, [r0] + bx lr + .align 2, 0 +_020BB230: .word _021109FC + arm_func_end NNSi_G2dGetOamSoftEmuAutoZOffsetStep + + arm_func_start NNS_G2dDrawOneOam3DDirectWithPosFast +NNS_G2dDrawOneOam3DDirectWithPosFast: ; 0x020BB234 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + add ip, sp, #4 + mov r5, r1 + mov r4, r2 + mov r7, r3 + mov r6, r0 + ldr r1, [sp, #0x30] + ldr r2, [sp, #0x34] + ldr r3, [sp, #0x38] + mov r0, r7 + str ip, [sp] + bl CalcSpriteParams_ + ldr r2, [r7] + and r1, r2, #0x300 + cmp r1, #0x100 + cmpne r1, #0x300 + andne r0, r2, #0x30000000 + orrne r1, r1, r0 + cmp r1, #0x300 + bne _020BB2F8 + ldr r0, _020BB468 ; =0xC000C000 + ldr r3, _020BB46C ; =_02109310 + and r2, r2, r0 + and r0, r2, #0xc0000000 + and r2, r2, #0xc000 + mov ip, r2, asr #0xe + mov lr, r0, lsr #0x1e + ldr r1, _020BB470 ; =_021DA47C + ldr r2, _020BB474 ; =_021092F8 + ldr r0, [r1, #8] + mov lr, lr, lsl #1 + cmp r0, #0 + ldrne r0, [r1, #4] + add r3, r3, ip, lsl #3 + add r2, r2, ip, lsl #3 + ldrh ip, [lr, r3] + ldrh r3, [lr, r2] + addne r4, r0, r4, lsl #12 + add r2, r6, ip, asr #1 + add r0, r5, r3, asr #1 + ldr r1, _020BB478 ; =0x04000470 + mov r2, r2, lsl #0xc + str r2, [r1] + mov r0, r0, lsl #0xc + moveq r4, r4, lsl #0xc + str r0, [r1] + str r4, [r1] + b _020BB328 +_020BB2F8: + ldr r0, _020BB470 ; =_021DA47C + ldr r1, [r0, #8] + cmp r1, #0 + ldrne r0, [r0, #4] + ldr r1, _020BB478 ; =0x04000470 + addne r2, r0, r4, lsl #12 + mov r0, r6, lsl #0xc + str r0, [r1] + mov r0, r5, lsl #0xc + moveq r2, r4, lsl #0xc + str r0, [r1] + str r2, [r1] +_020BB328: + ldr r0, [sp, #0x14] + ldr r2, [sp, #0x18] + ldr r1, _020BB47C ; =0x0400046C + mov r0, r0, lsl #0xc + str r0, [r1] + mov r0, r2, lsl #0xc + str r0, [r1] + mov r0, #0x1000 + str r0, [r1] + mov r0, #1 + str r0, [r1, #0x94] + ldr r0, [sp, #0x10] + ldr r3, [sp, #4] + mov r0, r0, lsl #8 + mov r2, r0, asr #0x10 + mov r0, r3, lsl #8 + mov r2, r2, lsl #0x10 + mov r4, r0, asr #0x10 + mov r3, r2, lsr #0x10 + mov r2, r4, lsl #0x10 + mov r3, r3, lsl #0x10 + orr r2, r3, r2, lsr #16 + mov r0, #0x10000 + str r2, [r1, #0x1c] + str r0, [r1, #0x24] + ldr r2, [sp, #0x10] + ldr r4, [sp, #0xc] + mov r2, r2, lsl #8 + mov r3, r2, asr #0x10 + mov r2, r4, lsl #8 + mov r3, r3, lsl #0x10 + mov r2, r2, asr #0x10 + mov r3, r3, lsr #0x10 + mov r2, r2, lsl #0x10 + mov r3, r3, lsl #0x10 + orr r2, r3, r2, lsr #16 + str r2, [r1, #0x1c] + add r0, r0, #0x40 + str r0, [r1, #0x24] + ldr r0, [sp, #8] + ldr r3, [sp, #0xc] + mov r0, r0, lsl #8 + mov r2, r0, asr #0x10 + mov r0, r3, lsl #8 + mov r2, r2, lsl #0x10 + mov r0, r0, asr #0x10 + mov r2, r2, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r2, r2, lsl #0x10 + orr r0, r2, r0, lsr #16 + str r0, [r1, #0x1c] + mov r0, #0x40 + str r0, [r1, #0x24] + ldr r0, [sp, #8] + ldr r3, [sp, #4] + mov r0, r0, lsl #8 + mov r2, r0, asr #0x10 + mov r0, r3, lsl #8 + mov r2, r2, lsl #0x10 + mov r0, r0, asr #0x10 + mov r2, r2, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r2, r2, lsl #0x10 + orr r0, r2, r0, lsr #16 + str r0, [r1, #0x1c] + mov r0, #0 + str r0, [r1, #0x24] + ldr r2, _020BB470 ; =_021DA47C + str r0, [r1, #0x98] + ldr r0, [r2, #8] + cmp r0, #0 + addeq sp, sp, #0x1c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, _020BB480 ; =_021109FC + ldr r1, [r2, #4] + ldr r0, [r0] + add r0, r1, r0 + str r0, [r2, #4] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020BB468: .word 0xC000C000 +_020BB46C: .word _02109310 +_020BB470: .word _021DA47C +_020BB474: .word _021092F8 +_020BB478: .word 0x04000470 +_020BB47C: .word 0x0400046C +_020BB480: .word _021109FC + arm_func_end NNS_G2dDrawOneOam3DDirectWithPosFast + + arm_func_start DoAffineTransforme_ +DoAffineTransforme_: ; 0x020BB484 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + ldr r4, [r1] + ldr r3, _020BB728 ; =0x01FF0000 + and r3, r4, r3 + mov r3, r3, lsr #0x10 + mov r3, r3, lsl #0x10 + mov r3, r3, asr #0x10 + cmp r3, #0xff + orrgt r3, r3, #0xff00 + movgt r3, r3, lsl #0x10 + movgt r3, r3, asr #0x10 + mov r3, r3, lsl #0xc + str r3, [sp, #8] + ldr r3, [r1] + and r3, r3, #0xff + cmp r3, #0x7f + orrgt r3, r3, #0xff00 + movgt r3, r3, lsl #0x10 + movgt r3, r3, asr #0x10 + mov r3, r3, lsl #0xc + str r3, [sp, #0xc] + ldr r5, [r1] + and r4, r5, #0x300 + cmp r4, #0x100 + cmpne r4, #0x300 + andne r3, r5, #0x30000000 + orrne r4, r4, r3 + cmp r4, #0x300 + bne _020BB548 + ldr r3, _020BB72C ; =0xC000C000 + ldr r4, _020BB730 ; =_02109310 + and r3, r5, r3 + and r5, r3, #0xc0000000 + and r3, r3, #0xc000 + mov r6, r5, lsr #0x1e + mov r5, r3, asr #0xe + ldr r3, _020BB734 ; =_021092F8 + mov r6, r6, lsl #1 + add r4, r4, r5, lsl #3 + add r3, r3, r5, lsl #3 + ldrh r5, [r6, r4] + ldr r7, [sp, #8] + ldrh r3, [r6, r3] + ldr r4, [sp, #0xc] + add r5, r7, r5, lsl #11 + add r3, r4, r3, lsl #11 + str r5, [sp, #8] + str r3, [sp, #0xc] +_020BB548: + ldr r6, [r0, #8] + ldr r4, [sp, #0xc] + add r3, sp, #8 + smull r4, r7, r6, r4 + cmp r3, r3 + addeq r3, sp, #0 + adds r8, r4, #0x1000 + ldr r5, [r0] + ldr r4, [sp, #8] + adc r6, r7, #0 + smlal r8, r6, r5, r4 + mov r4, r8, lsr #0xc + orr r4, r4, r6, lsl #20 + str r4, [r3] + ldr r6, [r0, #0xc] + ldr r4, [sp, #0xc] + ldr r5, [r0, #4] + smull r4, r7, r6, r4 + adds r8, r4, #0x1000 + ldr r4, [sp, #8] + adc r6, r7, #0 + smlal r8, r6, r5, r4 + mov r5, r8, lsr #0xc + add r4, sp, #0 + orr r5, r5, r6, lsl #20 + str r5, [r3, #4] + cmp r3, r4 + bne _020BB5C8 + ldr r4, [sp] + ldr r3, [sp, #4] + str r4, [sp, #8] + str r3, [sp, #0xc] +_020BB5C8: + ldr r3, _020BB738 ; =_021DA498 + ldr r3, [r3] + ldr r3, [r3, #4] + cmp r3, #0 + beq _020BB610 + cmp r3, #2 + moveq r5, #0x300 + movne r5, #0x100 + ldr r4, [r1] + ldr r3, _020BB73C ; =0xC1FFFCFF + cmp r5, #0x100 + andeq r3, r4, r3 + orreq r3, r3, r5 + streq r3, [r1] + beq _020BB610 + and r3, r4, r3 + orr r3, r3, r5 + str r3, [r1] +_020BB610: + ldr r6, [r1] + ldr r5, _020BB730 ; =_02109310 + and r4, r6, #0x300 + cmp r4, #0x100 + cmpne r4, #0x300 + andne r3, r6, #0x30000000 + orrne r4, r4, r3 + ldr r3, _020BB72C ; =0xC000C000 + ldr r8, _020BB734 ; =_021092F8 + and r3, r6, r3 + and r6, r3, #0xc0000000 + and r3, r3, #0xc000 + mov lr, r3, asr #0xe + mov r6, r6, lsr #0x1e + mov r3, r6, lsl #1 + add r5, r5, lr, lsl #3 + ldrh r5, [r3, r5] + add lr, r8, lr, lsl #3 + ldrh r3, [r3, lr] + mov ip, r5, asr #1 + mov r5, ip, lsl #0xc + ldr r6, [r0] + rsb r7, r5, #0 + mla r7, r6, ip, r7 + ldr r6, [r0, #8] + mov r3, r3, asr #1 + mla r7, r6, r3, r7 + ldr lr, [sp, #8] + cmp r4, #0x300 + add r6, lr, r7 + str r6, [sp, #8] + mov lr, r3, lsl #0xc + ldr r6, [r0, #4] + rsb r7, lr, #0 + mla r7, r6, ip, r7 + ldr r0, [r0, #0xc] + ldr r6, [sp, #0xc] + mla r3, r0, r3, r7 + add r0, r6, r3 + str r0, [sp, #0xc] + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + beq _020BB6D8 + ldr r3, [sp, #8] + ldr r0, [sp, #0xc] + sub r3, r3, r5 + sub r0, r0, lr + str r3, [sp, #8] + str r0, [sp, #0xc] +_020BB6D8: + ldr r4, [sp, #8] + ldr r0, [r2] + ldr r3, [sp, #0xc] + add r4, r4, r0 + str r4, [sp, #8] + ldr r0, [r2, #4] + mov r4, r4, asr #0xc + add r0, r3, r0 + str r0, [sp, #0xc] + mov r2, r0, asr #0xc + ldr r3, [r1] + ldr r0, _020BB740 ; =0xFE00FF00 + and r2, r2, #0xff + and r0, r3, r0 + mov r3, r4, lsl #0x17 + orr r0, r0, r2 + orr r0, r0, r3, lsr #7 + str r0, [r1] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020BB728: .word 0x01FF0000 +_020BB72C: .word 0xC000C000 +_020BB730: .word _02109310 +_020BB734: .word _021092F8 +_020BB738: .word _021DA498 +_020BB73C: .word 0xC1FFFCFF +_020BB740: .word 0xFE00FF00 + arm_func_end DoAffineTransforme_ + + arm_func_start DrawCellToSurface2D_ +DrawCellToSurface2D_: ; 0x020BB744 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + ldr r2, _020BBB44 ; =_021DA498 + mov r6, r0 + ldr r4, [r2] + ldr r0, _020BBB44 ; =_021DA498 + ldr r5, [r4, #0x2c] + mov fp, r1 + cmp r5, #0 + ldreq r5, _020BBB48 ; =_021093CC + ldr r2, [r0] + ldr r3, [r5, #0x10] + str r3, [sp, #0x18] + ldr r1, [r5, #0x14] + str r1, [sp, #0x1c] + ldr r0, [r6] + sub r0, r3, r0 + str r0, [sp, #0x18] + ldr r0, [r6, #4] + sub r0, r1, r0 + str r0, [sp, #0x1c] + ldr r1, [r2, #0x24] + ldr r0, [r2, #0x10] + cmp r1, #0 + str r0, [sp, #0xc] + bne _020BB7C0 + ldr r0, [r2, #0x28] + cmp r0, #0 + movne r0, #1 + strne r0, [sp] + bne _020BB7C8 +_020BB7C0: + mov r0, #0 + str r0, [sp] +_020BB7C8: + ldrh r0, [fp] + mov r8, #0 + cmp r0, #0 + addls sp, sp, #0x40 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #0x400 + str r0, [sp, #0x10] + ldr r0, _020BBB4C ; =0x0000FFFE + ldr r7, _020BBB44 ; =_021DA498 + add r0, r0, #1 + str r0, [sp, #0x14] + ldr r0, [sp, #0x10] + rsb r0, r0, #0 + str r0, [sp, #0x10] +_020BB800: + mov r0, #6 + mul r1, r8, r0 + ldr r2, [r7] + mov r0, #1 + str r0, [r2, #0x30] + ldr r0, [fp, #4] + add r2, r0, r1 + ldrh r0, [r0, r1] + strh r0, [r4, #0x38] + ldrh r0, [r2, #2] + strh r0, [r4, #0x3a] + ldrh r0, [r2, #4] + strh r0, [r4, #0x3c] + ldr r3, [r6, #0x20] + cmp r3, #0 + beq _020BB850 + ldr r0, [r7] + mov r1, fp + mov r2, r8 + blx r3 +_020BB850: + ldr r0, [r7] + ldr r0, [r0, #0x30] + cmp r0, #0 + beq _020BBB24 + ldr r0, [sp] + ldr r1, [r4, #0x3c] + cmp r0, #0 + ldr r0, [sp, #0x10] + and r2, r1, r0 + ldr r0, [sp, #0xc] + mov r1, r1, lsl #0x16 + add r1, r0, r1, lsr #22 + ldr r0, [sp, #0x10] + and r0, r1, r0, lsr #22 + orr r0, r2, r0 + str r0, [r4, #0x3c] + beq _020BB994 + ldr r0, [r4, #0x38] + ldr lr, [r7] + mov r1, r0, lsl #2 + mov r0, r0, lsl #3 + mov r1, r1, lsr #0x1f + mov r0, r0, lsr #0x1f + orr sl, r0, r1, lsl #1 + ldr sb, [lr, #0x28] + ldr r1, [r6, #0x14] + add r0, sb, sl, lsl #2 + add r0, r0, r1, lsl #1 + ldrh r1, [r0, #0xe] + ldr r0, [sp, #0x14] + str r1, [sp, #8] + cmp r1, r0 + bne _020BB960 + cmp sl, #0 + bne _020BB8F0 + ldr r1, [lr, #0x20] + mov r0, sb + blx r1 + str r0, [sp, #8] + b _020BB94C +_020BB8F0: + add ip, sp, #0x20 + ldmia sb, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + tst sl, #1 + beq _020BB91C + ldr r1, [sp, #0x20] + ldr r0, [sp, #0x24] + rsb r1, r1, #0 + str r1, [sp, #0x20] + rsb r0, r0, #0 + str r0, [sp, #0x24] +_020BB91C: + tst sl, #2 + beq _020BB93C + ldr r1, [sp, #0x28] + ldr r0, [sp, #0x2c] + rsb r1, r1, #0 + str r1, [sp, #0x28] + rsb r0, r0, #0 + str r0, [sp, #0x2c] +_020BB93C: + ldr r1, [lr, #0x20] + add r0, sp, #0x20 + blx r1 + str r0, [sp, #8] +_020BB94C: + ldr r1, [r6, #0x14] + add r0, sb, sl, lsl #2 + add r1, r0, r1, lsl #1 + ldr r0, [sp, #8] + strh r0, [r1, #0xe] +_020BB960: + ldr r1, [r5] + add r0, sp, #0x30 + str r1, [sp, #0x30] + ldr r2, [r5, #4] + add r1, r4, #0x38 + str r2, [sp, #0x34] + ldr r3, [r5, #8] + add r2, sp, #0x18 + str r3, [sp, #0x38] + ldr r3, [r5, #0xc] + str r3, [sp, #0x3c] + bl DoAffineTransforme_ + b _020BBAE4 +_020BB994: + ldr r0, _020BBB4C ; =0x0000FFFE + str r0, [sp, #8] + ldr r0, [r7] + ldr r1, [r0, #0x24] + cmp r1, #0 + beq _020BBA9C + ldr r2, [r4, #0x38] + ldr r1, _020BBB50 ; =0xC000C000 + mov sl, r2, lsl #3 + and sb, r2, r1 + bl NNS_G2dIsRndCoreFlipH + eor r0, r0, sl, lsr #31 + ldr r1, [r4, #0x38] + str r0, [sp, #4] + ldr r0, [r7] + mov sl, r1, lsl #2 + bl NNS_G2dIsRndCoreFlipV + eor r2, r0, sl, lsr #31 + ldr r0, [r4, #0x38] + bic r1, r0, #0x10000000 + ldr r0, [sp, #4] + orr r0, r1, r0, lsl #28 + bic r0, r0, #0x20000000 + orr r0, r0, r2, lsl #29 + str r0, [r4, #0x38] + ldr r0, [r7] + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + beq _020BBA4C + and r1, sb, #0xc000 + mov r2, r1, asr #0xe + ldr r1, _020BBB54 ; =_02109310 + and r3, sb, #0xc0000000 + mov r3, r3, lsr #0x1e + add r2, r1, r2, lsl #3 + mov r3, r3, lsl #1 + ldr r0, [r4, #0x38] + ldr r1, _020BBB58 ; =0xFE00FFFF + ldrh r2, [r3, r2] + and r1, r0, r1 + mov r0, r0, lsl #7 + add r0, r2, r0, lsr #23 + rsb r0, r0, #0 + mov r0, r0, lsl #0x17 + orr r0, r1, r0, lsr #7 + str r0, [r4, #0x38] +_020BBA4C: + ldr r0, [r7] + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + beq _020BBA9C + and r1, sb, #0xc000 + mov r3, r1, asr #0xe + and r1, sb, #0xc0000000 + mov r1, r1, lsr #0x1e + mov r2, r1, lsl #1 + ldr r1, _020BBB5C ; =_021092F8 + ldr r0, [r4, #0x38] + add r1, r1, r3, lsl #3 + ldrh r1, [r2, r1] + bic r2, r0, #0xff + mov r0, r0, lsl #0x18 + add r0, r1, r0, lsr #24 + rsb r0, r0, #0 + and r0, r0, #0xff + orr r0, r2, r0 + str r0, [r4, #0x38] +_020BBA9C: + ldr r2, [r4, #0x38] + ldr r0, _020BBB58 ; =0xFE00FFFF + ldr r1, [sp, #0x18] + and r3, r2, r0 + mov r2, r2, lsl #7 + mov r0, r1, asr #0xc + add r0, r0, r2, lsr #23 + mov r0, r0, lsl #0x17 + orr r0, r3, r0, lsr #7 + str r0, [r4, #0x38] + bic r2, r0, #0xff + mov r1, r0, lsl #0x18 + ldr r0, [sp, #0x1c] + mov r0, r0, asr #0xc + add r0, r0, r1, lsr #24 + and r0, r0, #0xff + orr r0, r2, r0 + str r0, [r4, #0x38] +_020BBAE4: + ldr r3, [r7] + ldr r1, [sp, #8] + ldr r3, [r3, #0x1c] + add r0, r4, #0x38 + mov r2, #0 + blx r3 + cmp r0, #1 + addne sp, sp, #0x40 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r3, [r6, #0x24] + cmp r3, #0 + beq _020BBB24 + ldr r0, [r7] + mov r1, fp + mov r2, r8 + blx r3 +_020BBB24: + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, lsr #0x10 + ldrh r1, [fp] + cmp r1, r0, lsr #16 + bhi _020BB800 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020BBB44: .word _021DA498 +_020BBB48: .word _021093CC +_020BBB4C: .word 0x0000FFFE +_020BBB50: .word 0xC000C000 +_020BBB54: .word _02109310 +_020BBB58: .word 0xFE00FFFF +_020BBB5C: .word _021092F8 + arm_func_end DrawCellToSurface2D_ + + arm_func_start DrawOamToSurface3D_ +DrawOamToSurface3D_: ; 0x020BBB60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + ldr r1, _020BBD94 ; =_021DA498 + mov r7, r0 + ldr r0, [r1] + add r0, r0, #0x40 + bl G3_LoadMtx43 + ldr r0, _020BBD94 ; =_021DA498 + ldr r0, [r0] + ldr r1, [r0, #0x24] + cmp r1, #0 + beq _020BBD24 + ldr r2, [r7] + ldr r1, _020BBD98 ; =0xC000C000 + and r4, r2, r1 + bl NNS_G2dIsRndCoreFlipH + cmp r0, #0 + ldr r0, [r7] + beq _020BBBF0 + mov r0, r0, lsl #7 + mov r3, r0, lsr #0x17 + and r2, r4, #0xc000 + and r1, r4, #0xc0000000 + mov r1, r1, lsr #0x1e + ldr r0, _020BBD9C ; =_02109310 + mov r2, r2, asr #0xe + mov r1, r1, lsl #1 + add r0, r0, r2, lsl #3 + cmp r3, #0xff + ldrh r1, [r1, r0] + orrgt r0, r3, #0xff00 + movgt r0, r0, lsl #0x10 + movgt r3, r0, asr #0x10 + add r0, r3, r1 + rsb r0, r0, #0 + b _020BBC08 +_020BBBF0: + mov r0, r0, lsl #7 + mov r0, r0, lsr #0x17 + cmp r0, #0xff + orrgt r0, r0, #0xff00 + movgt r0, r0, lsl #0x10 + movgt r0, r0, asr #0x10 +_020BBC08: + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + ldr r0, _020BBD94 ; =_021DA498 + mov r1, r1, lsl #0x10 + ldr r0, [r0] + mov r5, r1, asr #0x10 + bl NNS_G2dIsRndCoreFlipV + cmp r0, #0 + ldr r0, [r7] + beq _020BBC74 + mov r0, r0, lsl #0x18 + mov r3, r0, lsr #0x18 + and r2, r4, #0xc000 + and r1, r4, #0xc0000000 + mov r1, r1, lsr #0x1e + ldr r0, _020BBDA0 ; =_021092F8 + mov r2, r2, asr #0xe + mov r1, r1, lsl #1 + add r0, r0, r2, lsl #3 + cmp r3, #0x7f + ldrh r1, [r1, r0] + orrgt r0, r3, #0xff00 + movgt r0, r0, lsl #0x10 + movgt r3, r0, asr #0x10 + add r0, r3, r1 + rsb r0, r0, #0 + b _020BBC8C +_020BBC74: + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x18 + cmp r0, #0x7f + orrgt r0, r0, #0xff00 + movgt r0, r0, lsl #0x10 + movgt r0, r0, asr #0x10 +_020BBC8C: + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + ldr r0, _020BBD94 ; =_021DA498 + ldr r1, [r7] + ldr r0, [r0] + mov r6, r1, lsl #3 + bl NNS_G2dIsRndCoreFlipH + ldr r2, [r7] + ldr r1, _020BBD94 ; =_021DA498 + eor r6, r0, r6, lsr #31 + ldr r0, [r1] + mov r8, r2, lsl #2 + bl NNS_G2dIsRndCoreFlipV + ldr r1, [r7] + eor r3, r0, r8, lsr #31 + bic r2, r1, #0x10000000 + orr r2, r2, r6, lsl #28 + bic r2, r2, #0x20000000 + mov r1, r4, lsl #0x10 + orr r3, r2, r3, lsl #29 + str r2, [r7] + str r3, [r7] + ldr r2, _020BBD94 ; =_021DA498 + mov r0, r5 + ldr r5, [r2] + mov r1, r1, asr #0x10 + ldr r4, [r5, #8] + mov r3, r7 + add r4, r4, #0xc + str r4, [sp] + ldr r4, [r5, #0x14] + mvn r2, #0 + str r4, [sp, #4] + ldr r4, [r5, #0x18] + str r4, [sp, #8] + bl NNS_G2dDrawOneOam3DDirectWithPosFast + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020BBD24: + ldr r2, _020BBD94 ; =_021DA498 + ldr r0, [r7] + ldr r5, [r2] + mov r0, r0, lsl #7 + ldr r1, [r7] + ldr r4, [r5, #8] + mov r0, r0, lsr #0x17 + cmp r0, #0xff + orrgt r0, r0, #0xff00 + mov r1, r1, lsl #0x18 + add r4, r4, #0xc + movgt r0, r0, lsl #0x10 + str r4, [sp] + ldr r4, [r5, #0x14] + mov r1, r1, lsr #0x18 + movgt r0, r0, asr #0x10 + cmp r1, #0x7f + orrgt r1, r1, #0xff00 + movgt r1, r1, lsl #0x10 + str r4, [sp, #4] + ldr r4, [r5, #0x18] + movgt r1, r1, asr #0x10 + mov r3, r7 + mvn r2, #0 + str r4, [sp, #8] + bl NNS_G2dDrawOneOam3DDirectWithPosFast + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020BBD94: .word _021DA498 +_020BBD98: .word 0xC000C000 +_020BBD9C: .word _02109310 +_020BBDA0: .word _021092F8 + arm_func_end DrawOamToSurface3D_ + + arm_func_start DrawCellToSurface3D_ +DrawCellToSurface3D_: ; 0x020BBDA4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sb, r1 + ldr r5, _020BBE68 ; =_021DA498 + ldrh r1, [sb] + ldr r7, [r5] + mov sl, r0 + mov r8, #0 + cmp r1, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r6, #1 + mov r4, #6 +_020BBDD0: + mul r1, r8, r4 + ldr r0, [r5] + str r6, [r0, #0x30] + ldr r2, [sb, #4] + ldrh r0, [r2, r1] + add r1, r2, r1 + strh r0, [r7, #0x38] + ldrh r0, [r1, #2] + strh r0, [r7, #0x3a] + ldrh r0, [r1, #4] + strh r0, [r7, #0x3c] + ldr r3, [sl, #0x20] + cmp r3, #0 + beq _020BBE18 + ldr r0, [r5] + mov r1, sb + mov r2, r8 + blx r3 +_020BBE18: + ldr r0, [r5] + ldr r0, [r0, #0x30] + cmp r0, #0 + beq _020BBE30 + add r0, r7, #0x38 + bl DrawOamToSurface3D_ +_020BBE30: + ldr r3, [sl, #0x24] + cmp r3, #0 + beq _020BBE4C + ldr r0, [r5] + mov r1, sb + mov r2, r8 + blx r3 +_020BBE4C: + ldrh r1, [sb] + add r0, r8, #1 + mov r0, r0, lsl #0x10 + cmp r1, r0, lsr #16 + mov r8, r0, lsr #0x10 + bhi _020BBDD0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020BBE68: .word _021DA498 + arm_func_end DrawCellToSurface3D_ + + arm_func_start NNS_G2dInitRndCore +NNS_G2dInitRndCore: ; 0x020BBE6C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r1, r4 + mov r0, #0 + mov r2, #0x70 + bl MIi_CpuClear16 + mov r1, #0 + str r1, [r4] + mov r0, #2 + stmib r4, {r0, r1} + str r1, [r4, #0xc] + str r1, [r4, #0x24] + mov r0, #1 + str r0, [r4, #0x30] + str r1, [r4, #0x28] + ldmia sp!, {r4, pc} + arm_func_end NNS_G2dInitRndCore + + arm_func_start NNS_G2dSetRndCoreImageProxy +NNS_G2dSetRndCoreImageProxy: ; 0x020BBEAC + str r1, [r0, #8] + str r2, [r0, #0xc] + bx lr + arm_func_end NNS_G2dSetRndCoreImageProxy + + arm_func_start NNS_G2dSetRndCoreOamRegisterFunc +NNS_G2dSetRndCoreOamRegisterFunc: ; 0x020BBEB8 + str r1, [r0, #0x1c] + str r2, [r0, #0x20] + bx lr + arm_func_end NNS_G2dSetRndCoreOamRegisterFunc + + arm_func_start NNS_G2dSetRndCoreAffineOverwriteMode +NNS_G2dSetRndCoreAffineOverwriteMode: ; 0x020BBEC4 + str r1, [r0, #4] + bx lr + arm_func_end NNS_G2dSetRndCoreAffineOverwriteMode + + arm_func_start NNS_G2dSetRndCoreCurrentMtx3D +NNS_G2dSetRndCoreCurrentMtx3D: ; 0x020BBECC + ldr r1, _020BBF30 ; =_021DA498 + mov r3, #0 + ldr ip, [r1] + mov r1, #0x1000 + str r0, [ip, #0x2c] + ldr r2, [r0] + str r2, [ip, #0x40] + ldr r2, [r0, #4] + str r2, [ip, #0x44] + str r3, [ip, #0x48] + ldr r2, [r0, #8] + str r2, [ip, #0x4c] + ldr r2, [r0, #0xc] + str r2, [ip, #0x50] + str r3, [ip, #0x54] + str r3, [ip, #0x58] + str r3, [ip, #0x5c] + str r1, [ip, #0x60] + ldr r1, [r0, #0x10] + str r1, [ip, #0x64] + ldr r0, [r0, #0x14] + str r0, [ip, #0x68] + ldr r0, [ip, #0x34] + str r0, [ip, #0x6c] + bx lr + .align 2, 0 +_020BBF30: .word _021DA498 + arm_func_end NNS_G2dSetRndCoreCurrentMtx3D + + arm_func_start NNS_G2dSetRndCoreCurrentMtx2D +NNS_G2dSetRndCoreCurrentMtx2D: ; 0x020BBF34 + ldr r2, _020BBF48 ; =_021DA498 + ldr r2, [r2] + str r0, [r2, #0x2c] + str r1, [r2, #0x28] + bx lr + .align 2, 0 +_020BBF48: .word _021DA498 + arm_func_end NNS_G2dSetRndCoreCurrentMtx2D + + arm_func_start NNS_G2dSetRndCore3DSoftSpriteZvalue +NNS_G2dSetRndCore3DSoftSpriteZvalue: ; 0x020BBF4C + str r1, [r0, #0x34] + bx lr + arm_func_end NNS_G2dSetRndCore3DSoftSpriteZvalue + + arm_func_start NNS_G2dSetRndCoreSurface +NNS_G2dSetRndCoreSurface: ; 0x020BBF54 + str r1, [r0] + bx lr + arm_func_end NNS_G2dSetRndCoreSurface + + arm_func_start NNS_G2dIsRndCoreFlipH +NNS_G2dIsRndCoreFlipH: ; 0x020BBF5C + ldr r0, [r0, #0x24] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end NNS_G2dIsRndCoreFlipH + + arm_func_start NNS_G2dIsRndCoreFlipV +NNS_G2dIsRndCoreFlipV: ; 0x020BBF70 + ldr r0, [r0, #0x24] + tst r0, #2 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end NNS_G2dIsRndCoreFlipV + + arm_func_start NNS_G2dSetRndCoreFlipMode +NNS_G2dSetRndCoreFlipMode: ; 0x020BBF84 + cmp r1, #0 + ldr r1, [r0, #0x24] + orrne r1, r1, #1 + biceq r1, r1, #1 + str r1, [r0, #0x24] + ldr r1, [r0, #0x24] + cmp r2, #0 + orrne r1, r1, #2 + biceq r1, r1, #2 + str r1, [r0, #0x24] + bx lr + arm_func_end NNS_G2dSetRndCoreFlipMode + + arm_func_start NNS_G2dRndCoreBeginRendering +NNS_G2dRndCoreBeginRendering: ; 0x020BBFB0 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _020BC0B4 ; =_021DA498 + mov r4, r0 + str r4, [r2] + ldr r0, [r4] + ldr r5, [r0, #0x14] + cmp r5, #0 + bne _020BC068 + ldr lr, _020BC0B8 ; =0x04000440 + mov r1, #0 + str r1, [lr] + str r1, [lr, #4] + ldr ip, [r4] + mov r0, #1 + ldmia ip, {r3, ip} + rsb r3, r3, #0 + str r3, [lr, #0x30] + rsb r3, ip, #0 + str r3, [lr, #0x30] + str r1, [lr, #0x30] + str r0, [lr] + ldr r0, [r2] + ldr r5, [r0, #8] + mov r0, r5 + bl NNS_G2dIsImageReadyToUse + cmp r0, #0 + moveq r0, #0 + beq _020BC02C + mov r0, r5 + mov r1, #0 + bl NNS_G2dGetImageLocation +_020BC02C: + ldr r1, _020BC0B4 ; =_021DA498 + str r0, [r4, #0x14] + ldr r0, [r1] + mov r1, #0 + ldr r5, [r0, #0xc] + mov r0, r5 + bl NNS_G2dIsImagePaletteReadyToUse + cmp r0, #0 + moveq r0, #0 + beq _020BC060 + mov r0, r5 + mov r1, #0 + bl NNS_G2dGetImagePaletteLocation +_020BC060: + str r0, [r4, #0x18] + ldmia sp!, {r3, r4, r5, pc} +_020BC068: + ldr r4, [r4, #8] + mov r1, r5 + mov r0, r4 + bl NNS_G2dIsImageReadyToUse + cmp r0, #0 + moveq r1, #0 + beq _020BC0A4 + mov r0, r4 + mov r1, r5 + bl NNS_G2dGetImageLocation + ldr r1, [r4, #0x20] + and r1, r1, #0x700000 + mov r1, r1, asr #0x14 + add r1, r1, #5 + mov r1, r0, lsr r1 +_020BC0A4: + ldr r0, _020BC0B4 ; =_021DA498 + ldr r0, [r0] + str r1, [r0, #0x10] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BC0B4: .word _021DA498 +_020BC0B8: .word 0x04000440 + arm_func_end NNS_G2dRndCoreBeginRendering + + arm_func_start NNS_G2dRndCoreEndRendering +NNS_G2dRndCoreEndRendering: ; 0x020BC0BC + ldr r0, _020BC118 ; =_021DA498 + ldr r3, [r0] + ldr r1, [r3] + ldr r1, [r1, #0x14] + cmp r1, #0 + bne _020BC0F0 + ldr r1, _020BC11C ; =0x04000440 + mov r0, #0 + str r0, [r1] + mov r0, #1 + str r0, [r1, #8] + str r0, [r1] + b _020BC108 +_020BC0F0: + mov r2, #0 + str r2, [r3, #0x10] + ldr r1, [r0] + str r2, [r1, #0x2c] + ldr r0, [r0] + str r2, [r0, #0x28] +_020BC108: + ldr r0, _020BC118 ; =_021DA498 + mov r1, #0 + str r1, [r0] + bx lr + .align 2, 0 +_020BC118: .word _021DA498 +_020BC11C: .word 0x04000440 + arm_func_end NNS_G2dRndCoreEndRendering + + arm_func_start NNS_G2dRndCoreDrawCell +NNS_G2dRndCoreDrawCell: ; 0x020BC120 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020BC1D0 ; =_021DA498 + mov r5, r0 + ldr r2, [r1] + ldr r4, [r2] + ldr r0, [r4, #0x10] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #1 + str r0, [r2, #0x30] + ldr r2, [r4, #0x18] + cmp r2, #0 + beq _020BC160 + ldr r0, [r1] + mov r1, r5 + blx r2 +_020BC160: + ldr r0, _020BC1D0 ; =_021DA498 + ldr r0, [r0] + ldr r0, [r0, #0x30] + cmp r0, #0 + beq _020BC1B0 + ldr r0, [r4, #0x14] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020BC1B0 +_020BC184: ; jump table + b _020BC194 ; case 0 + b _020BC1A4 ; case 1 + b _020BC1A4 ; case 2 + b _020BC1B0 ; case 3 +_020BC194: + mov r0, r4 + mov r1, r5 + bl DrawCellToSurface3D_ + b _020BC1B0 +_020BC1A4: + mov r0, r4 + mov r1, r5 + bl DrawCellToSurface2D_ +_020BC1B0: + ldr r2, [r4, #0x1c] + cmp r2, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _020BC1D0 ; =_021DA498 + mov r1, r5 + ldr r0, [r0] + blx r2 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BC1D0: .word _021DA498 + arm_func_end NNS_G2dRndCoreDrawCell + + arm_func_start NNS_G2dRndCoreDrawCellVramTransfer +NNS_G2dRndCoreDrawCellVramTransfer: ; 0x020BC1D4 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020BC2B8 ; =_021DA498 + mov r6, r0 + ldr r3, [r2] + mov r4, r1 + ldr r5, [r3] + ldr r0, [r5, #0x10] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #1 + str r0, [r3, #0x30] + ldr r3, [r5, #0x18] + cmp r3, #0 + beq _020BC218 + ldr r0, [r2] + mov r1, r6 + blx r3 +_020BC218: + ldr r0, _020BC2B8 ; =_021DA498 + ldr r0, [r0] + ldr r0, [r0, #0x30] + cmp r0, #0 + beq _020BC298 + mvn r0, #0 + cmp r4, r0 + beq _020BC25C + mov r0, r4 + ldr r4, [r5, #0x14] + bl NNSi_G2dGetCellTransferState + mov r3, #1 + mvn r1, r3, lsl r4 + ldr r2, [r0, #0x20] + and r1, r2, r1 + orr r1, r1, r3, lsl r4 + str r1, [r0, #0x20] +_020BC25C: + ldr r0, [r5, #0x14] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020BC298 +_020BC26C: ; jump table + b _020BC27C ; case 0 + b _020BC28C ; case 1 + b _020BC28C ; case 2 + b _020BC298 ; case 3 +_020BC27C: + mov r0, r5 + mov r1, r6 + bl DrawCellToSurface3D_ + b _020BC298 +_020BC28C: + mov r0, r5 + mov r1, r6 + bl DrawCellToSurface2D_ +_020BC298: + ldr r2, [r5, #0x1c] + cmp r2, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _020BC2B8 ; =_021DA498 + mov r1, r6 + ldr r0, [r0] + blx r2 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020BC2B8: .word _021DA498 + arm_func_end NNS_G2dRndCoreDrawCellVramTransfer + + arm_func_start GetGlyphIndex +GetGlyphIndex: ; 0x020BC2BC + stmdb sp!, {r3, lr} + ldrh r3, [r0, #4] + ldr r2, _020BC380 ; =0x0000FFFF + cmp r3, #0 + beq _020BC2E4 + cmp r3, #1 + beq _020BC300 + cmp r3, #2 + beq _020BC314 + b _020BC378 +_020BC2E4: + ldrh r2, [r0] + ldrh r3, [r0, #0xc] + sub r0, r1, r2 + add r0, r3, r0 + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x10 + b _020BC378 +_020BC300: + ldrh r2, [r0] + sub r1, r1, r2 + add r0, r0, r1, lsl #1 + ldrh r2, [r0, #0xc] + b _020BC378 +_020BC314: + ldrh r3, [r0, #0xc] + add ip, r0, #0xe + sub r0, r3, #1 + add lr, ip, r0, lsl #2 + cmp ip, lr + bhi _020BC378 +_020BC32C: + sub r3, lr, ip + mov r0, r3, asr #1 + add r0, r3, r0, lsr #30 + mov r0, r0, asr #2 + add r0, r0, r0, lsr #31 + mov r3, r0, asr #1 + mov r0, r3, lsl #2 + ldrh r0, [ip, r0] + add r3, ip, r3, lsl #2 + cmp r0, r1 + addlo ip, r3, #4 + blo _020BC370 + cmp r1, r0 + sublo lr, r3, #4 + blo _020BC370 + ldrh r2, [r3, #2] + b _020BC378 +_020BC370: + cmp ip, lr + bls _020BC32C +_020BC378: + mov r0, r2 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BC380: .word 0x0000FFFF + arm_func_end GetGlyphIndex + + arm_func_start NNS_G2dFontInitUTF16 +NNS_G2dFontInitUTF16: ; 0x020BC384 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + mov r1, r4 + bl NNSi_G2dGetUnpackedFont + ldr r0, _020BC3A4 ; =NNSi_G2dSplitCharUTF16 + str r0, [r4, #4] + ldmia sp!, {r4, pc} + .align 2, 0 +_020BC3A4: .word NNSi_G2dSplitCharUTF16 + arm_func_end NNS_G2dFontInitUTF16 + + arm_func_start NNS_G2dFontFindGlyphIndex +NNS_G2dFontFindGlyphIndex: ; 0x020BC3A8 + stmdb sp!, {r3, lr} + ldr r0, [r0] + ldr r0, [r0, #0x10] + cmp r0, #0 + beq _020BC3E4 +_020BC3BC: + ldrh r2, [r0] + cmp r2, r1 + ldrlsh r2, [r0, #2] + cmpls r1, r2 + bhi _020BC3D8 + bl GetGlyphIndex + ldmia sp!, {r3, pc} +_020BC3D8: + ldr r0, [r0, #8] + cmp r0, #0 + bne _020BC3BC +_020BC3E4: + ldr r0, _020BC3EC ; =0x0000FFFF + ldmia sp!, {r3, pc} + .align 2, 0 +_020BC3EC: .word 0x0000FFFF + arm_func_end NNS_G2dFontFindGlyphIndex + + arm_func_start NNS_G2dFontGetCharWidthsFromIndex +NNS_G2dFontGetCharWidthsFromIndex: ; 0x020BC3F0 + ldr ip, [r0] + ldr r3, [ip, #0xc] + cmp r3, #0 + beq _020BC434 +_020BC400: + ldrh r2, [r3] + cmp r2, r1 + ldrlsh r0, [r3, #2] + cmpls r1, r0 + bhi _020BC428 + sub r0, r1, r2 + add r1, r3, #8 + add r0, r0, r0, lsl #1 + add r0, r1, r0 + bx lr +_020BC428: + ldr r3, [r3, #4] + cmp r3, #0 + bne _020BC400 +_020BC434: + add r0, ip, #4 + bx lr + arm_func_end NNS_G2dFontGetCharWidthsFromIndex + + arm_func_start NNSi_G2dFontGetStringWidth +NNSi_G2dFontGetStringWidth: ; 0x020BC43C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r8, r0 + str r2, [sp] + ldr r5, [r8, #4] + add r0, sp, #0 + mov r7, r1 + mov r6, r3 + mov r4, #0 + blx r5 + movs r1, r0 + beq _020BC4B8 + ldr sb, _020BC4E4 ; =0x0000FFFF + add sl, sp, #0 +_020BC474: + cmp r1, #0xa + beq _020BC4B8 + mov r0, r8 + bl NNS_G2dFontFindGlyphIndex + mov r1, r0 + cmp r1, sb + ldreq r0, [r8] + ldreqh r1, [r0, #2] + mov r0, r8 + bl NNS_G2dFontGetCharWidthsFromIndex + ldrsb r1, [r0, #2] + mov r0, sl + add r1, r7, r1 + add r4, r4, r1 + blx r5 + movs r1, r0 + bne _020BC474 +_020BC4B8: + cmp r6, #0 + beq _020BC4D0 + cmp r1, #0xa + ldreq r0, [sp] + movne r0, #0 + str r0, [r6] +_020BC4D0: + cmp r4, #0 + subgt r4, r4, r7 + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020BC4E4: .word 0x0000FFFF + arm_func_end NNSi_G2dFontGetStringWidth + + arm_func_start NNSi_G2dFontGetTextHeight +NNSi_G2dFontGetTextHeight: ; 0x020BC4E8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + add r4, sp, #0 + mov r3, #0 + mov r8, r0 + str r2, [sp, #8] + str r3, [r4] + str r3, [r4, #4] + ldr r7, [r8, #4] + add r0, sp, #8 + mov r4, r1 + mov r6, #1 + blx r7 + cmp r0, #0 + beq _020BC540 + add r5, sp, #8 +_020BC528: + cmp r0, #0xa + mov r0, r5 + addeq r6, r6, #1 + blx r7 + cmp r0, #0 + bne _020BC528 +_020BC540: + ldr r0, [r8] + ldrsb r0, [r0, #1] + add r0, r4, r0 + mul r0, r6, r0 + sub r0, r0, r4 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G2dFontGetTextHeight + + arm_func_start NNSi_G2dFontGetTextRect +NNSi_G2dFontGetTextRect: ; 0x020BC55C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r6, r2 + ldr r2, [sp, #0x28] + add sb, sp, #0 + mov r4, #0 + mov r8, r0 + mov r7, r1 + mov r5, r3 + str r4, [sb] + str r4, [sb, #4] + cmp r2, #0 + mov r4, #1 + beq _020BC5C4 + add sb, sp, #0x28 +_020BC598: + mov r0, r7 + mov r1, r6 + mov r3, sb + bl NNSi_G2dFontGetStringWidth + ldr r1, [sp] + ldr r2, [sp, #0x28] + cmp r0, r1 + strgt r0, [sp] + add r4, r4, #1 + cmp r2, #0 + bne _020BC598 +_020BC5C4: + ldr r0, [r7] + sub r2, r4, #1 + ldrsb r1, [r0, #1] + ldr r0, [sp] + add r1, r5, r1 + mul r1, r2, r1 + sub r1, r1, r5 + str r1, [sp, #4] + stmia r8, {r0, r1} + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end NNSi_G2dFontGetTextRect + + arm_func_start GetCharIndex1D +GetCharIndex1D: ; 0x020BC5F0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, #3 + ldr r7, [sp, #0x20] + ldr r6, [sp, #0x24] + ldr r8, _020BC6E4 ; =_02109414 + mov r5, #0 + mov sb, sl + mvn r4, #0 +_020BC610: + and ip, r3, r4, lsl r6 + cmp ip, r1 + and lr, r2, r4, lsl r7 + bhi _020BC654 + mla r5, r2, ip, r5 + cmp lr, r0 + bhi _020BC644 + sub r3, r3, ip + mla r5, lr, r3, r5 + sub r0, r0, lr + sub r1, r1, ip + sub r2, r2, lr + b _020BC69C +_020BC644: + mov r2, lr + sub r1, r1, ip + sub r3, r3, ip + b _020BC69C +_020BC654: + cmp lr, r0 + mvn r3, r4, lsl r6 + bhi _020BC674 + mla r5, lr, ip, r5 + mov r3, ip + sub r0, r0, lr + sub r2, r2, lr + b _020BC69C +_020BC674: + and r2, r1, r4, lsl r6 + mla r5, lr, r2, r5 + and r2, r0, r4, lsl r7 + mvn r4, r4, lsl r7 + add r2, r5, r2, lsl r6 + and r1, r1, r3 + add r1, r2, r1, lsl r7 + and r0, r0, r4 + add r0, r1, r0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020BC69C: + cmp r2, #8 + movge r6, sl + movlt r6, r2 + clzlt r6, r6 + rsblt r6, r6, #0x1f + cmp r3, #8 + movge r7, sb + movlt r7, r3 + clzlt r7, r7 + rsblt r7, r7, #0x1f + add r7, r8, r7, lsl #3 + add ip, r7, r6, lsl #1 + ldrb r7, [r7, r6, lsl #1] + ldrb r6, [ip, #1] + str r7, [sp, #0x20] + str r6, [sp, #0x24] + b _020BC610 +_020BC6E0: ; 0x020BC6E0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020BC6E4: .word _02109414 + arm_func_end GetCharIndex1D + + arm_func_start OBJSizeToShape +OBJSizeToShape: ; 0x020BC6E8 + ldrb r3, [r0, #1] + ldr r2, _020BC700 ; =_02109434 + ldrb r1, [r0] + add r0, r2, r3, lsl #4 + ldr r0, [r0, r1, lsl #2] + bx lr + .align 2, 0 +_020BC700: .word _02109434 + arm_func_end OBJSizeToShape + + arm_func_start ClearChar +ClearChar: ; 0x020BC704 + stmdb sp!, {r3, r4, r5, lr} + cmp r3, #8 + ldreq r4, [sp, #0x10] + mov ip, r0 + ldr r0, [sp, #0x14] + cmpeq r4, #8 + bne _020BC734 + ldr r2, [sp, #0x18] + mov r1, ip + mov r2, r2, lsl #3 + bl MIi_CpuClearFast + ldmia sp!, {r3, r4, r5, pc} +_020BC734: + ldr r4, [sp, #0x18] + cmp r4, #4 + bne _020BC794 + mov r5, r1, lsl #2 + add r4, r5, r3, lsl #2 + mvn r3, #0 + rsb r4, r4, #0x20 + mov r3, r3, lsr r5 + add r1, r4, r1, lsl #2 + mov r3, r3, lsl r1 + ldr r1, [sp, #0x10] + add r2, ip, r2, lsl #2 + add r5, r2, r1, lsl #2 + and r1, r0, r3, lsr r4 + mvn r3, r3, lsr r4 + cmp r2, r5 + ldmhsia sp!, {r3, r4, r5, pc} +_020BC778: + ldr r0, [r2] + and r0, r0, r3 + orr r0, r1, r0 + str r0, [r2], #4 + cmp r2, r5 + blo _020BC778 + ldmia sp!, {r3, r4, r5, pc} +_020BC794: + mov r1, r1, lsl #3 + mvn r4, #0 + add r3, r1, r3, lsl #3 + rsb r3, r3, #0x40 + mov r5, r4, lsr r1 + cmp r3, #0x20 + movlo r5, r5, lsl r1 + blo _020BC7C4 + sub lr, r3, #0x20 + add r4, r1, lr + mov r4, r5, lsl r4 + mov r5, r4, lsr lr +_020BC7C4: + mvn lr, #0 + mov r4, lr, lsl r3 + cmp r1, #0x20 + movlo r3, r4, lsr r3 + blo _020BC7E8 + sub lr, r1, #0x20 + add r1, lr, r3 + mov r1, r4, lsr r1 + mov r3, r1, lsl lr +_020BC7E8: + ldr r1, [sp, #0x10] + add r4, ip, r2, lsl #3 + add ip, r4, r1, lsl #3 + and r1, r0, r5 + and r2, r0, r3 + mvn r5, r5 + mvn r3, r3 + cmp r4, ip + ldmhsia sp!, {r3, r4, r5, pc} +_020BC80C: + ldr r0, [r4] + and r0, r0, r5 + orr r0, r1, r0 + str r0, [r4] + ldr r0, [r4, #4] + and r0, r0, r3 + orr r0, r2, r0 + str r0, [r4, #4] + add r4, r4, #8 + cmp r4, ip + blo _020BC80C + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ClearChar + + arm_func_start LetterChar +LetterChar: ; 0x020BC83C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 + ldr r5, [r0, #8] + ldr r4, [r0, #0xc] + cmp r5, #0 + strge r5, [sp] + movlt r1, #0 + strlt r1, [sp] + ldr r1, [r0, #0x10] + cmp r4, #0 + add sl, r5, r1 + ldr r1, [r0, #0x14] + movge r2, r4 + movlt r2, #0 + cmp sl, #8 + add r3, r4, r1 + movge sl, #8 + cmp r3, #8 + movge r3, #8 + cmp r4, #0 + movgt r4, #0 + cmp r5, #0 + ldr r7, [r0, #0x20] + movgt r5, #0 + rsb r1, r4, #0 + mul r6, sl, r7 + ldr r8, [r0, #0x1c] + rsb r4, r5, #0 + mul sb, r8, r4 + ldr r4, [r0, #0x18] + mov sl, r6 + str r4, [sp, #0x10] + ldr r4, [sp] + cmp r7, #4 + mul r5, r4, r7 + ldr r4, [sp, #0x10] + str r5, [sp] + mla r4, r1, r4, sb + ldr r1, [r0, #4] + str r1, [sp, #0x14] + ldr r1, [r0] + bne _020BC9AC + ldr r7, [r0, #0x24] + add r0, r1, r2, lsl #2 + str r0, [sp, #0xc] + add r0, r1, r3, lsl #2 + ldr r1, [sp, #0xc] + str r0, [sp, #8] + cmp r1, r0 + addhs sp, sp, #0x28 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov fp, #0xf + add r5, sp, #0x20 +_020BC910: + ldr r0, [sp, #0xc] + mov r1, r4, lsr #0x1f + ldr sb, [r0] + ldr r0, [sp, #0x14] + rsb r2, r1, r4, lsl #29 + add r0, r0, r4, lsr #3 + str r0, [sp, #0x20] + mov r0, #0 + strb r0, [sp, #0x24] + strb r0, [sp, #0x25] + mov r0, r5 + add r1, r1, r2, ror #29 + bl NNSi_G2dBitReaderRead + ldr r6, [sp] + mov r0, r6 + cmp r0, sl + bhs _020BC984 +_020BC954: + mov r0, r5 + mov r1, r8 + bl NNSi_G2dBitReaderRead + cmp r0, #0 + beq _020BC978 + add r0, r7, r0 + mvn r1, fp, lsl r6 + and r1, sb, r1 + orr sb, r1, r0, lsl r6 +_020BC978: + add r6, r6, #4 + cmp r6, sl + blo _020BC954 +_020BC984: + ldr r1, [sp, #0xc] + ldr r0, [sp, #8] + str sb, [r1], #4 + cmp r1, r0 + ldr r0, [sp, #0x10] + str r1, [sp, #0xc] + add r4, r4, r0 + blo _020BC910 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BC9AC: + ldr r5, [r0, #0x24] + add r0, r1, r3, lsl #3 + add fp, r1, r2, lsl #3 + str r0, [sp, #4] + cmp fp, r0 + addhs sp, sp, #0x28 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BC9C8: + mov r1, r4, lsr #0x1f + rsb r0, r1, r4, lsl #29 + add r1, r1, r0, ror #29 + ldr r0, [sp, #0x14] + ldmia fp, {r6, r7} + mov r2, #0 + add r0, r0, r4, lsr #3 + str r0, [sp, #0x18] + add r0, sp, #0x18 + strb r2, [sp, #0x1c] + strb r2, [sp, #0x1d] + bl NNSi_G2dBitReaderRead + ldr sb, [sp] + mov r0, sb + cmp r0, sl + bhs _020BCA58 +_020BCA08: + add r0, sp, #0x18 + mov r1, r8 + bl NNSi_G2dBitReaderRead + cmp r0, #0 + beq _020BCA4C + add r1, r5, r0 + cmp sb, #0x20 + mov r0, #0xff + bhs _020BCA3C + mvn r0, r0, lsl sb + and r0, r6, r0 + orr r6, r0, r1, lsl sb + b _020BCA4C +_020BCA3C: + sub r2, sb, #0x20 + mvn r0, r0, lsl r2 + and r0, r7, r0 + orr r7, r0, r1, lsl r2 +_020BCA4C: + add sb, sb, #8 + cmp sb, sl + blo _020BCA08 +_020BCA58: + ldr r0, [sp, #4] + stmia fp, {r6, r7} + add fp, fp, #8 + cmp fp, r0 + ldr r0, [sp, #0x10] + add r4, r4, r0 + blo _020BC9C8 + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end LetterChar + + arm_func_start DrawGlyphLine +DrawGlyphLine: ; 0x020BCA7C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + ldr r4, [sp, #0x54] + ldrb r6, [r0, #0xc] + str r4, [sp, #0x54] + ldr r4, [r4] + ldr r5, [r1] + mov r7, r6, lsl #6 + ldrb r4, [r4, #1] + mov r6, r7, asr #2 + add r6, r7, r6, lsr #29 + cmp r4, #0 + ldr r5, [r5, #8] + mov sl, r2 + mov sb, r3 + mov r8, r6, asr #3 + addeq sp, sp, #0x2c + ldmib r0, {fp, ip} + ldr lr, [r0] + ldrb r2, [r5, #1] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + adds r7, sl, r4 + addmi sp, sp, #0x2c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + adds r3, sb, r2 + addmi sp, sp, #0x2c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + movle r5, #0 + movgt r5, sl, lsr #3 + cmp sb, #0 + movle r6, #0 + add r7, r7, #7 + movgt r6, sb, lsr #3 + cmp fp, r7, lsr #3 + mov r7, r7, lsr #3 + add r3, r3, #7 + movls r7, fp + mov fp, r3, lsr #3 + cmp ip, r3, lsr #3 + movls fp, ip + subs r3, r7, r5 + sub fp, fp, r6 + addmi sp, sp, #0x2c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp fp, #0 + addlt sp, sp, #0x2c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r7, [r0, #0x10] + cmp sl, #0 + mla r6, r7, r6, r5 + sub r5, r7, r3 + mul r5, r8, r5 + str r5, [sp] + ldr r5, [sp, #0x54] + mla r7, r8, r6, lr + ldr ip, [r5, #4] + ldr r6, [sp, #0x50] + str ip, [sp, #8] + sub r5, r6, #1 + str r4, [sp, #0x14] + str r5, [sp, #0x28] + str r2, [sp, #0x18] + ldr r2, [r1] + andge sl, sl, #7 + ldr r2, [r2, #8] + cmp sb, #0 + ldrb r2, [r2, #6] + andge sb, sb, #7 + sub fp, sb, fp, lsl #3 + str r2, [sp, #0x20] + ldrb r0, [r0, #0xc] + cmp sb, fp + sub r6, sl, r3, lsl #3 + str r0, [sp, #0x24] + ldr r0, [r1] + ldr r0, [r0, #8] + ldrb r0, [r0] + smulbb r0, r2, r0 + str r0, [sp, #0x1c] + addle sp, sp, #0x2c + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r4, sp, #4 +_020BCBC8: + mov r5, sl + str sb, [sp, #0x10] + cmp sl, r6 + ble _020BCBF8 +_020BCBD8: + mov r0, r4 + str r7, [sp, #4] + str r5, [sp, #0xc] + bl LetterChar + sub r5, r5, #8 + cmp r5, r6 + add r7, r7, r8 + bgt _020BCBD8 +_020BCBF8: + ldr r0, [sp] + sub sb, sb, #8 + cmp sb, fp + add r7, r7, r0 + bgt _020BCBC8 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end DrawGlyphLine + + arm_func_start DrawGlyph1D +DrawGlyph1D: ; 0x020BCC14 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x4c + ldr r6, [sp, #0x74] + ldrb r5, [r0, #0xc] + ldr r4, [r6] + ldr r7, [r1] + mov r8, r5, lsl #6 + ldrb r4, [r4, #1] + mov r5, r8, asr #2 + add r5, r8, r5, lsr #29 + ldr r7, [r7, #8] + str r2, [sp, #8] + str r3, [sp, #0xc] + cmp r4, #0 + mov sb, r5, asr #3 + addeq sp, sp, #0x4c + ldmib r0, {r3, r5} + ldrb r2, [r7, #1] + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r7, [sp, #8] + adds r7, r7, r4 + addmi sp, sp, #0x4c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r8, [sp, #0xc] + adds r8, r8, r2 + addmi sp, sp, #0x4c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr sl, [sp, #8] + add r7, r7, #7 + cmp sl, #0 + movle sl, #0 + strle sl, [sp, #0x10] + movgt sl, sl, lsr #3 + strgt sl, [sp, #0x10] + ldr sl, [sp, #0xc] + cmp sl, #0 + movle sl, #0 + movgt sl, sl, lsr #3 + cmp r3, r7, lsr #3 + mov r7, r7, lsr #3 + movls r7, r3 + add r3, r8, #7 + cmp r5, r3, lsr #3 + mov r8, r3, lsr #3 + ldr r3, [sp, #0x10] + movls r8, r5 + subs r5, r7, r3 + sub r7, r8, sl + addmi sp, sp, #0x4c + ldmmiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r7, #0 + addlt sp, sp, #0x4c + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r3, [sp, #8] + ldr fp, [r0] + cmp r3, #0 + andge r3, r3, #7 + strge r3, [sp, #8] + ldr r3, [sp, #0xc] + ldr r8, [sp, #8] + ldr r6, [r6, #4] + cmp r3, #0 + andge r3, r3, #7 + strge r3, [sp, #0xc] + ldr r3, [sp, #0x70] + sub r5, r8, r5, lsl #3 + ldr r8, [sp, #0xc] + sub r3, r3, #1 + str r3, [sp, #0x48] + sub r7, r8, r7, lsl #3 + str r2, [sp, #0x38] + str r6, [sp, #0x28] + str r4, [sp, #0x34] + ldr r4, [r1] + mov r3, r8 + mov r2, r7 + cmp r3, r2 + ldr r2, [r4, #8] + str r7, [sp, #0x1c] + ldrb r3, [r2, #6] + str r3, [sp, #0x40] + ldrb r2, [r0, #0xc] + str r2, [sp, #0x44] + ldr r1, [r1] + ldr r1, [r1, #8] + ldrb r1, [r1] + smulbb r1, r3, r1 + str r1, [sp, #0x3c] + ldr r3, [r0, #0x10] + ldr r1, [r0, #4] + ldr r0, [r0, #8] + str r1, [sp, #0x14] + mov r2, r3, lsl #0x18 + mov r1, r3, lsl #0x10 + str r3, [sp, #0x20] + str r0, [sp, #0x18] + mov r8, r2, lsr #0x18 + mov r7, r1, lsr #0x18 + addle sp, sp, #0x4c + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BCDA4: + ldr r0, [sp, #0xc] + ldr r6, [sp, #0x10] + str r0, [sp, #0x30] + ldr r0, [sp, #8] + cmp r0, r5 + mov r4, r0 + ble _020BCE00 +_020BCDC0: + ldr r2, [sp, #0x14] + str r8, [sp] + ldr r3, [sp, #0x18] + mov r0, r6 + mov r1, sl + str r7, [sp, #4] + bl GetCharIndex1D + mla r1, r0, sb, fp + add r0, sp, #0x24 + str r4, [sp, #0x2c] + str r1, [sp, #0x24] + bl LetterChar + sub r4, r4, #8 + add r6, r6, #1 + cmp r4, r5 + bgt _020BCDC0 +_020BCE00: + ldr r0, [sp, #0xc] + add sl, sl, #1 + sub r1, r0, #8 + ldr r0, [sp, #0x1c] + str r1, [sp, #0xc] + cmp r1, r0 + bgt _020BCDA4 + add sp, sp, #0x4c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end DrawGlyph1D + + arm_func_start ClearContinuous +ClearContinuous: ; 0x020BCE24 + stmdb sp!, {r3, lr} + mov r3, r0 + ldrb r2, [r3, #0xc] + ldr ip, [r3, #4] + cmp r2, #4 + orreq r0, r1, r1, lsl #4 + orreq r0, r0, r0, lsl #8 + orrne r0, r1, r1, lsl #8 + orr r1, r0, r0, lsl #16 + ldr r0, [r3, #8] + mov r2, r2, lsl #6 + mul lr, ip, r0 + mov r0, r2, asr #2 + add r0, r2, r0, lsr #29 + mov r2, r0, asr #3 + mov r0, r1 + mul r2, lr, r2 + ldr r1, [r3] + bl MIi_CpuClearFast + ldmia sp!, {r3, pc} + arm_func_end ClearContinuous + + arm_func_start ClearLine +ClearLine: ; 0x020BCE74 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r0 + ldrb r2, [r7, #0xc] + mov r6, r1 + ldr sb, [r7] + cmp r2, #4 + orreq r0, r6, r6, lsl #4 + orreq r0, r0, r0, lsl #8 + orrne r0, r6, r6, lsl #8 + mov r1, r2, lsl #6 + orr r6, r0, r0, lsl #16 + mov r0, r1, asr #2 + add r0, r1, r0, lsr #29 + mov r3, r0, asr #3 + ldr r2, [r7, #0x10] + ldr r1, [r7, #4] + ldr r0, [r7, #8] + mul r5, r3, r2 + mul r4, r3, r1 + mov r8, #0 + cmp r0, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020BCECC: + mov r0, r6 + mov r1, sb + mov r2, r4 + bl MIi_CpuClearFast + ldr r0, [r7, #8] + add r8, r8, #1 + cmp r8, r0 + add sb, sb, r5 + blt _020BCECC + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end ClearLine + + arm_func_start ClearAreaLine +ClearAreaLine: ; 0x020BCEF4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + ldr r4, [sp, #0x58] + mov sb, r2 + ldrb fp, [r0, #0xc] + mov sl, r1 + add r1, sb, r4 + str r1, [sp, #0x28] + ldr r2, [sp, #0x5c] + mov r1, r3 + add r1, r1, r2 + cmp fp, #4 + str r1, [sp, #0x24] + orreq r1, sl, sl, lsl #4 + orreq r1, r1, r1, lsl #8 + orrne r1, sl, sl, lsl #8 + str r3, [sp, #0xc] + orr sl, r1, r1, lsl #16 + ldr r1, [sp, #0xc] + mov r6, fp, lsl #6 + bic r1, r1, #7 + mov r4, r6, asr #2 + mov r2, r1, asr #2 + str r1, [sp, #0x2c] + add r1, r1, r2, lsr #29 + ldr r2, [r0, #0x10] + mov r3, r1, asr #3 + mul r1, r3, r2 + bic r3, sb, #7 + mov r5, r3, asr #2 + add r4, r6, r4, lsr #29 + str r3, [sp, #0x18] + add r5, r3, r5, lsr #29 + mov r3, r4, asr #3 + str r3, [sp, #0x14] + add r4, r1, r5, asr #3 + ldr r3, [sp, #0x24] + ldr r5, [r0] + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x28] + mla r4, r1, r4, r5 + add r3, r3, #7 + bic r1, r3, #7 + str r1, [sp, #0x20] + ldr r1, [sp, #0x14] + add r0, r0, #7 + mul r1, r2, r1 + str r1, [sp, #0x10] + ldr r2, [sp, #0x2c] + ldr r1, [sp, #0x20] + str r4, [sp, #0x1c] + cmp r2, r1 + bic r6, r0, #7 + addge sp, sp, #0x30 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BCFD0: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0xc] + cmp r1, r0 + movge r8, #0 + bge _020BCFF0 + mov r1, r0 + ldr r0, [sp, #0x2c] + sub r8, r1, r0 +_020BCFF0: + ldr r1, [sp, #0x24] + ldr r0, [sp, #0x2c] + ldr r7, [sp, #0x1c] + sub r0, r1, r0 + cmp r0, #8 + movgt r0, #8 + sub r5, r0, r8 + ldr r0, [sp, #0x18] + cmp r0, r6 + mov r4, r0 + bge _020BD060 +_020BD01C: + ldr r0, [sp, #0x28] + cmp r4, sb + sublt r1, sb, r4 + sub r0, r0, r4 + movge r1, #0 + cmp r0, #8 + movgt r0, #8 + sub r3, r0, r1 + mov r0, r7 + mov r2, r8 + stmia sp, {r5, sl, fp} + bl ClearChar + ldr r0, [sp, #0x14] + add r4, r4, #8 + add r7, r7, r0 + cmp r4, r6 + blt _020BD01C +_020BD060: + ldr r1, [sp, #0x1c] + ldr r0, [sp, #0x10] + add r0, r1, r0 + str r0, [sp, #0x1c] + ldr r0, [sp, #0x2c] + add r1, r0, #8 + ldr r0, [sp, #0x20] + str r1, [sp, #0x2c] + cmp r1, r0 + blt _020BCFD0 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ClearAreaLine + + arm_func_start ClearArea1D +ClearArea1D: ; 0x020BD090 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x48 + ldrb r4, [r0, #0xc] + mov sl, r2 + mov fp, r1 + str r4, [sp, #0x10] + ldr r1, [sp, #0x10] + ldr r4, [sp, #0x70] + cmp r1, #4 + add r1, sl, r4 + str r1, [sp, #0x3c] + ldr r2, [sp, #0x74] + mov r1, r3 + add r1, r1, r2 + bic r2, sl, #7 + str r1, [sp, #0x38] + str r3, [sp, #0xc] + str r2, [sp, #0x28] + ldr r2, [sp, #0xc] + orreq r1, fp, fp, lsl #4 + bic r2, r2, #7 + str r2, [sp, #0x40] + ldr r2, [sp, #0x10] + orreq r1, r1, r1, lsl #8 + mov r5, r2, lsl #6 + ldr r2, [sp, #0x38] + mov r3, r5, asr #2 + add r6, r2, #7 + ldr r2, [sp, #0x28] + add r3, r5, r3, lsr #29 + mov r4, r2, asr #2 + ldr r2, [sp, #0x40] + orrne r1, fp, fp, lsl #8 + mov r5, r2, asr #2 + bic r2, r6, #7 + str r2, [sp, #0x34] + mov r2, r3, asr #3 + str r2, [sp, #0x14] + ldr r2, [sp, #0x28] + orr fp, r1, r1, lsl #16 + add r2, r2, r4, lsr #29 + mov r2, r2, asr #3 + str r2, [sp, #0x2c] + ldr r2, [sp, #0x40] + ldr r1, [r0, #0x10] + add r2, r2, r5, lsr #29 + mov r8, r2, asr #3 + ldr r3, [sp, #0x40] + ldr r2, [sp, #0x34] + str r1, [sp, #0x44] + cmp r3, r2 + ldr r2, [sp, #0x3c] + add r2, r2, #7 + bic r7, r2, #7 + ldr r2, [r0, #4] + str r2, [sp, #0x18] + ldr r2, [r0, #8] + ldr r0, [r0] + str r2, [sp, #0x1c] + str r0, [sp, #0x30] + mov r0, r1, lsl #0x18 + mov r0, r0, lsr #0x18 + str r0, [sp, #0x20] + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x18 + str r0, [sp, #0x24] + addge sp, sp, #0x48 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BD1A0: + ldr r1, [sp, #0x40] + ldr r0, [sp, #0xc] + cmp r1, r0 + movge sb, #0 + bge _020BD1C0 + mov r1, r0 + ldr r0, [sp, #0x40] + sub sb, r1, r0 +_020BD1C0: + ldr r1, [sp, #0x38] + ldr r0, [sp, #0x40] + ldr r6, [sp, #0x2c] + sub r0, r1, r0 + cmp r0, #8 + movgt r0, #8 + sub r5, r0, sb + ldr r0, [sp, #0x28] + cmp r0, r7 + mov r4, r0 + bge _020BD260 +_020BD1EC: + ldr r0, [sp, #0x20] + ldr r2, [sp, #0x18] + str r0, [sp] + ldr r0, [sp, #0x24] + ldr r3, [sp, #0x1c] + str r0, [sp, #4] + mov r0, r6 + mov r1, r8 + bl GetCharIndex1D + ldr r2, [sp, #0x3c] + cmp r4, sl + sublt r1, sl, r4 + sub r2, r2, r4 + movge r1, #0 + cmp r2, #8 + movgt r2, #8 + stmia sp, {r5, fp} + sub r3, r2, r1 + ldr r2, [sp, #0x10] + ldr ip, [sp, #0x14] + str r2, [sp, #8] + ldr r2, [sp, #0x30] + mla r0, ip, r0, r2 + mov r2, sb + bl ClearChar + add r4, r4, #8 + add r6, r6, #1 + cmp r4, r7 + blt _020BD1EC +_020BD260: + ldr r0, [sp, #0x40] + add r8, r8, #1 + add r1, r0, #8 + ldr r0, [sp, #0x34] + str r1, [sp, #0x40] + cmp r1, r0 + blt _020BD1A0 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end ClearArea1D + + arm_func_start InitCharCanvas +InitCharCanvas: ; 0x020BD284 + str r2, [r0, #4] + ldr r2, [sp] + str r3, [r0, #8] + strb r2, [r0, #0xc] + ldr r2, [sp, #4] + str r1, [r0] + ldr r1, [sp, #8] + str r2, [r0, #0x14] + str r1, [r0, #0x10] + bx lr + arm_func_end InitCharCanvas + + arm_func_start NNS_G2dCharCanvasDrawChar +NNS_G2dCharCanvasDrawChar: ; 0x020BD2AC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r7, r1 + ldrh r1, [sp, #0x2c] + mov r8, r0 + mov r0, r7 + mov r6, r2 + mov r5, r3 + bl NNS_G2dFontFindGlyphIndex + ldr r1, _020BD3CC ; =0x0000FFFF + mov r4, r0 + cmp r4, r1 + ldreq r0, [r7] + ldreqh r4, [r0, #2] + mov r0, r7 + mov r1, r4 + bl NNS_G2dFontGetCharWidthsFromIndex + str r0, [sp, #8] + ldr r1, [r7] + ldr r2, [r1, #8] + ldrh r1, [r2, #2] + add r2, r2, #8 + mla r1, r4, r1, r2 + str r1, [sp, #0xc] + ldr r1, [r7] + ldr r3, [r1, #8] + ldrb r1, [r3, #7] + cmp r1, #7 + addls pc, pc, r1, lsl #2 + b _020BD390 +_020BD324: ; jump table + b _020BD344 ; case 0 + b _020BD350 ; case 1 + b _020BD350 ; case 2 + b _020BD364 ; case 3 + b _020BD364 ; case 4 + b _020BD380 ; case 5 + b _020BD380 ; case 6 + b _020BD344 ; case 7 +_020BD344: + ldrsb r0, [r0] + add r6, r6, r0 + b _020BD390 +_020BD350: + ldrb r1, [r3] + ldrsb r0, [r0] + sub r6, r6, r1 + add r5, r5, r0 + b _020BD390 +_020BD364: + ldrsb r2, [r0] + ldrb r1, [r0, #1] + ldrb r0, [r3, #1] + add r1, r2, r1 + sub r6, r6, r1 + sub r5, r5, r0 + b _020BD390 +_020BD380: + ldrsb r1, [r0] + ldrb r0, [r3, #1] + add r0, r1, r0 + sub r5, r5, r0 +_020BD390: + ldr r1, [sp, #0x28] + add r0, sp, #8 + str r1, [sp] + str r0, [sp, #4] + ldr r1, [r8, #0x14] + mov r0, r8 + ldr r4, [r1] + mov r1, r7 + mov r2, r6 + mov r3, r5 + blx r4 + ldr r0, [sp, #8] + ldrsb r0, [r0, #2] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020BD3CC: .word 0x0000FFFF + arm_func_end NNS_G2dCharCanvasDrawChar + + arm_func_start NNS_G2dCharCanvasInitForBG +NNS_G2dCharCanvasInitForBG: ; 0x020BD3D0 + stmdb sp!, {lr} + sub sp, sp, #0xc + ldr lr, [sp, #0x10] + ldr ip, _020BD3F8 ; =_021093FC + str lr, [sp] + str ip, [sp, #4] + str r2, [sp, #8] + bl InitCharCanvas + add sp, sp, #0xc + ldmia sp!, {pc} + .align 2, 0 +_020BD3F8: .word _021093FC + arm_func_end NNS_G2dCharCanvasInitForBG + + arm_func_start NNS_G2dCharCanvasInitForOBJ1D +NNS_G2dCharCanvasInitForOBJ1D: ; 0x020BD3FC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + cmp r2, #8 + movlt r4, r2 + movge ip, #3 + clzlt r4, r4 + rsblt ip, r4, #0x1f + cmp r3, #8 + movlt r4, r3 + movge r5, #3 + clzlt r4, r4 + rsblt r5, r4, #0x1f + ldr r4, _020BD47C ; =_02109414 + ldr lr, [sp, #0xc] + add r5, r4, r5, lsl #3 + add r4, r5, ip, lsl #1 + ldrb ip, [r5, ip, lsl #1] + bic r5, lr, #0xff + ldrb r4, [r4, #1] + ldr lr, [sp, #0x20] + orr r5, r5, ip + str lr, [sp] + ldr ip, _020BD480 ; =_02109408 + bic lr, r5, #0xff00 + mov r4, r4, lsl #0x18 + orr r4, lr, r4, lsr #16 + str ip, [sp, #4] + str r4, [sp, #0xc] + str r4, [sp, #8] + bl InitCharCanvas + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BD47C: .word _02109414 +_020BD480: .word _02109408 + arm_func_end NNS_G2dCharCanvasInitForOBJ1D + + arm_func_start NNS_G2dMapScrToCharText +NNS_G2dMapScrToCharText: ; 0x020BD484 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r5, [sp, #0x24] + ldr lr, [sp, #0x20] + cmp r5, #0x20 + ldr ip, [sp, #0x28] + bgt _020BD4C0 + mla r4, r5, lr, r3 + ldr lr, [sp, #0x2c] + mov r3, r5 + add r0, r0, r4, lsl #1 + stmia sp, {ip, lr} + bl NNS_G2dMapScrToChar256x16Pltt + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020BD4C0: + add r6, lr, r2 + ldr r4, [sp, #0x2c] + cmp lr, r6 + add r5, r3, r1 + addge sp, sp, #8 + mov r1, r4, lsl #0x1c + ldmgeia sp!, {r4, r5, r6, r7, r8, pc} +_020BD4DC: + cmp lr, #0x20 + movlt r2, lr + addge r2, lr, #0x20 + mov r7, r3 + cmp r3, r5 + add r8, r0, r2, lsl #6 + bge _020BD520 +_020BD4F8: + cmp r7, #0x20 + movlt r2, r7 + addge r2, r7, #0x3e0 + orr r4, ip, r1, lsr #16 + mov r2, r2, lsl #1 + add r7, r7, #1 + strh r4, [r8, r2] + cmp r7, r5 + add ip, ip, #1 + blt _020BD4F8 +_020BD520: + add lr, lr, #1 + cmp lr, r6 + blt _020BD4DC + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_G2dMapScrToCharText + + arm_func_start NNS_G2dMapScrToChar256x16Pltt +NNS_G2dMapScrToChar256x16Pltt: ; 0x020BD534 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, [sp, #0x1c] + ldr r8, [sp, #0x18] + mov r6, #0 + cmp r2, #0 + mov ip, r4, lsl #0x1c + ldmleia sp!, {r4, r5, r6, r7, r8, pc} + mov r4, r6 +_020BD554: + mov r7, r0 + mov r5, r4 + cmp r1, #0 + ble _020BD57C +_020BD564: + orr lr, r8, ip, lsr #16 + add r5, r5, #1 + cmp r5, r1 + add r8, r8, #1 + strh lr, [r7], #2 + blt _020BD564 +_020BD57C: + add r6, r6, #1 + cmp r6, r2 + add r0, r0, r3, lsl #1 + blt _020BD554 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_G2dMapScrToChar256x16Pltt + + arm_func_start NNSi_G2dCalcRequiredOBJ +NNSi_G2dCalcRequiredOBJ: ; 0x020BD590 + stmdb sp!, {r3, r4, r5, lr} + mov r3, r0, lsr #3 + mov r5, r1, lsr #3 + mov r2, #0 + mla lr, r3, r5, r2 + and r4, r0, #2 + and r2, r0, #1 + add r2, r2, r4, lsr #1 + and r0, r0, #4 + mov ip, r2, lsl #1 + add ip, ip, r0, lsr #2 + mla ip, r5, ip, lr + and r4, r1, #2 + and lr, r1, #1 + add r4, lr, r4, lsr #1 + and lr, r1, #4 + mov r1, r4, lsl #1 + add r1, r1, lr, lsr #2 + mla ip, r3, r1, ip + add r1, r2, r0, lsr #2 + add r0, r4, lr, lsr #2 + mla r0, r1, r0, ip + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_G2dCalcRequiredOBJ + + arm_func_start NNS_G2dArrangeOBJ1D +NNS_G2dArrangeOBJ1D: ; 0x020BD5EC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x38 + mov r7, r0 + mov r0, r1 + cmp r0, #8 + ldr r0, [sp, #0x60] + str r1, [sp, #0x10] + str r0, [sp, #0x60] + str r2, [sp, #0x14] + ldrlt r0, [sp, #0x10] + str r3, [sp, #0x34] + ldr r6, [sp, #0x64] + ldr r5, [sp, #0x68] + ldr r4, [sp, #0x6c] + movge r2, #3 + clzlt r0, r0 + rsblt r2, r0, #0x1f + ldr r0, [sp, #0x14] + cmp r0, #8 + ldrlt r0, [sp, #0x14] + movge r1, #3 + clzlt r0, r0 + rsblt r1, r0, #0x1f + ldr r0, _020BD8D8 ; =_02109414 + mvn r3, #0 + add r1, r0, r1, lsl #3 + add r0, r1, r2, lsl #1 + ldrb fp, [r1, r2, lsl #1] + ldrb r1, [r0, #1] + ldr r2, [sp, #0x14] + cmp r6, #0 + str r1, [sp, #0x30] + ldr r1, [sp, #0x10] + and r1, r1, r3, lsl fp + str r1, [sp, #0x2c] + ldr r1, [sp, #0x30] + and r1, r2, r3, lsl r1 + str r1, [sp, #0x28] + moveq r1, #1 + streq r1, [sp, #0x18] + movne r1, #2 + strne r1, [sp, #0x18] + mov r1, #0 + str r1, [sp, #0x24] + bl OBJSizeToShape + ldr r1, [sp, #0x10] + ldr r2, [sp, #0x14] + mov sb, r1, asr fp + ldr r1, [sp, #0x30] + mov r1, r2, asr r1 + str r1, [sp, #0x20] + ldr r1, [sp, #0x18] + mov r2, r1, lsl fp + ldr r1, [sp, #0x30] + mov r8, r2, lsl r1 + mov r1, #0 + str r1, [sp, #0x1c] + b _020BD76C +_020BD6D4: + ldr r2, [sp, #0x1c] + ldr r1, [sp, #0x30] + mov sl, #0 + mov r2, r2, lsl r1 + ldr r1, [sp, #0x60] + add r1, r1, r2, lsl #3 + mov r2, #0x400 + and r3, r1, #0xff + rsb r2, r2, #0 + b _020BD758 +_020BD6FC: + mov ip, sl, lsl fp + ldr r1, [sp, #0x34] + add sl, sl, #1 + add r1, r1, ip, lsl #3 + mov lr, r1, lsl #0x17 + ldr ip, [r7] + ldr r1, _020BD8DC ; =0xFE00FF00 + and r1, ip, r1 + orr r1, r1, r3 + orr ip, r1, lr, lsr #7 + ldr r1, _020BD8E0 ; =0x3FFF3FFF + and r1, ip, r1 + orr r1, r1, r0 + str r1, [r7] + ldrh r1, [r7, #4] + and r1, r1, r2 + orr r1, r1, r5 + strh r1, [r7, #4] + ldr r1, [r7] + add r5, r5, r8, asr r4 + bic r1, r1, #0x2000 + orr r1, r1, r6, lsl #13 + str r1, [r7], #8 +_020BD758: + cmp sl, sb + blt _020BD6FC + ldr r1, [sp, #0x1c] + add r1, r1, #1 + str r1, [sp, #0x1c] +_020BD76C: + ldr r2, [sp, #0x1c] + ldr r1, [sp, #0x20] + cmp r2, r1 + blt _020BD6D4 + ldr r0, [sp, #0x24] + mla r0, sb, r1, r0 + str r0, [sp, #0x24] + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x10] + cmp r1, r0 + bhs _020BD7F4 + ldr r0, [sp, #0x60] + ldr r1, [sp, #0x10] + stmia sp, {r0, r6} + ldr r0, [sp, #0x2c] + ldr r2, [sp, #0x2c] + sub r8, r1, r0 + ldr r1, [sp, #0x34] + str r5, [sp, #8] + add r3, r1, r2, lsl #3 + ldr r2, [sp, #0x28] + mov r0, r7 + mov r1, r8 + str r4, [sp, #0xc] + bl NNS_G2dArrangeOBJ1D + ldr r1, [sp, #0x18] + add r7, r7, r0, lsl #3 + mul r2, r1, r8 + ldr r1, [sp, #0x28] + mul r2, r1, r2 + ldr r1, [sp, #0x24] + add r5, r5, r2, lsr r4 + add r0, r1, r0 + str r0, [sp, #0x24] +_020BD7F4: + ldr r1, [sp, #0x28] + ldr r0, [sp, #0x14] + cmp r1, r0 + bhs _020BD860 + ldr r1, [sp, #0x60] + ldr r0, [sp, #0x28] + ldr r3, [sp, #0x34] + add r0, r1, r0, lsl #3 + stmia sp, {r0, r6} + str r5, [sp, #8] + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x28] + str r4, [sp, #0xc] + sub r8, r1, r0 + ldr r1, [sp, #0x2c] + mov r0, r7 + mov r2, r8 + bl NNS_G2dArrangeOBJ1D + ldr r2, [sp, #0x18] + ldr r1, [sp, #0x2c] + add r7, r7, r0, lsl #3 + mul r1, r2, r1 + mul r1, r8, r1 + add r5, r5, r1, lsr r4 + ldr r1, [sp, #0x24] + add r0, r1, r0 + str r0, [sp, #0x24] +_020BD860: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x10] + cmp r1, r0 + ldrlo r1, [sp, #0x28] + ldrlo r0, [sp, #0x14] + cmplo r1, r0 + bhs _020BD8CC + ldr r1, [sp, #0x60] + ldr r0, [sp, #0x28] + ldr r2, [sp, #0x10] + add r0, r1, r0, lsl #3 + stmia sp, {r0, r6} + str r5, [sp, #8] + ldr r1, [sp, #0x2c] + ldr r3, [sp, #0x14] + sub r1, r2, r1 + ldr r2, [sp, #0x28] + ldr r5, [sp, #0x2c] + sub r2, r3, r2 + ldr r3, [sp, #0x34] + mov r0, r7 + add r3, r3, r5, lsl #3 + str r4, [sp, #0xc] + bl NNS_G2dArrangeOBJ1D + ldr r1, [sp, #0x24] + add r0, r1, r0 + str r0, [sp, #0x24] +_020BD8CC: + ldr r0, [sp, #0x24] + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020BD8D8: .word _02109414 +_020BD8DC: .word 0xFE00FF00 +_020BD8E0: .word 0x3FFF3FFF + arm_func_end NNS_G2dArrangeOBJ1D + + arm_func_start NNSi_G2dTextCanvasDrawString +NNSi_G2dTextCanvasDrawString: ; 0x020BD8E4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + mov fp, r0 + ldr r4, [fp, #8] + ldr r5, [fp, #4] + ldr r6, [sp, #0x38] + add r0, sp, #0xc + str r6, [sp, #0xc] + ldr r6, [r5, #4] + mov sl, r1 + mov sb, r2 + str r3, [sp, #8] + ldrsb r8, [sp, #0x41] + blx r6 + cmp r0, #0 + beq _020BD96C + ldrsb r7, [sp, #0x40] +_020BD928: + cmp r0, #0xa + beq _020BD96C + ldr r1, [sp, #8] + mov r2, sl + str r1, [sp] + str r0, [sp, #4] + ldr r0, [fp] + mov r1, r5 + mov r3, sb + bl NNS_G2dCharCanvasDrawChar + add r0, r4, r0 + mla sl, r0, r7, sl + mla sb, r0, r8, sb + add r0, sp, #0xc + blx r6 + cmp r0, #0 + bne _020BD928 +_020BD96C: + ldr r1, [sp, #0x3c] + cmp r1, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #0xa + ldreq r1, [sp, #0xc] + ldr r0, [sp, #0x3c] + movne r1, #0 + str r1, [r0] + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNSi_G2dTextCanvasDrawString + + arm_func_start NNSi_G2dTextCanvasDrawTextAlign +NNSi_G2dTextCanvasDrawTextAlign: ; 0x020BD998 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + mov sl, r0 + ldr r0, [sl, #4] + ldr r4, [sp, #0x60] + ldr r0, [r0] + ldrsb r8, [sp, #0x65] + ldrsb r0, [r0, #1] + ldr r5, [sl, #0xc] + ldrsb sb, [sp, #0x64] + add r5, r5, r0 + rsb r0, r8, #0 + mul r0, r5, r0 + str r0, [sp, #0x20] + mul r0, r5, sb + str r0, [sp, #0x1c] + ldr r0, [sp, #0x58] + str r1, [sp, #0xc] + str r2, [sp, #0x10] + mov fp, r3 + str r4, [sp, #0x30] + cmp r4, #0 + str r0, [sp, #0x58] + addeq sp, sp, #0x34 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [sp, #0x5c] + mov r6, #0 + and r0, r2, #0x800 + add r1, fp, #1 + str r0, [sp, #0x18] + add r0, r1, r1, lsr #31 + str r0, [sp, #0x2c] + and r0, r2, #0x400 + str r0, [sp, #0x14] + ldrb r0, [sp, #0x64] + mov r7, r6 + str r0, [sp, #0x24] + ldrb r0, [sp, #0x65] + str r0, [sp, #0x28] +_020BDA34: + ldr r0, [sp, #0x18] + cmp r0, #0 + ldr r0, [sp, #0xc] + add r4, r0, r6 + ldr r0, [sp, #0x10] + add r5, r0, r7 + beq _020BDA70 + ldr r2, [sp, #0x30] + mov r3, #0 + ldmib sl, {r0, r1} + bl NNSi_G2dFontGetStringWidth + sub r0, fp, r0 + mla r4, r0, sb, r4 + mla r5, r0, r8, r5 + b _020BDAA8 +_020BDA70: + ldr r0, [sp, #0x14] + cmp r0, #0 + beq _020BDAA8 + ldr r2, [sp, #0x30] + mov r3, #0 + ldmib sl, {r0, r1} + bl NNSi_G2dFontGetStringWidth + add r0, r0, #1 + add r0, r0, r0, lsr #31 + mov r1, r0, asr #1 + ldr r0, [sp, #0x2c] + rsb r0, r1, r0, asr #1 + mla r4, r0, sb, r4 + mla r5, r0, r8, r5 +_020BDAA8: + ldr r3, [sp, #0x30] + mov r1, r4 + str r3, [sp] + add r3, sp, #0x30 + str r3, [sp, #4] + ldr r3, [sp, #0x24] + mov r2, r5 + strb r3, [sp, #8] + ldr r3, [sp, #0x28] + mov r0, sl + strb r3, [sp, #9] + ldr r3, [sp, #0x58] + bl NNSi_G2dTextCanvasDrawString + ldr r0, [sp, #0x20] + add r6, r6, r0 + ldr r0, [sp, #0x1c] + add r7, r7, r0 + ldr r0, [sp, #0x30] + cmp r0, #0 + bne _020BDA34 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNSi_G2dTextCanvasDrawTextAlign + + arm_func_start NNSi_G2dTextCanvasDrawText +NNSi_G2dTextCanvasDrawText: ; 0x020BDB00 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x28 + ldr r4, [sp, #0x44] + mov r8, r0 + str r4, [sp] + add r0, sp, #0x18 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldmib r8, {r1, r2, r3} + ldr r4, [sp, #0x40] + bl NNSi_G2dFontGetTextRect + ldr r2, [sp, #0x18] + ldr r0, [sp, #0x1c] + str r2, [sp, #0x10] + str r0, [sp, #0x14] + str r2, [sp, #0x20] + str r0, [sp, #0x24] + tst r4, #0x10 + beq _020BDB74 + add r0, r2, #1 + rsb r0, r0, #0 + add r0, r0, r0, lsr #31 + ldrsb r1, [sp, #0x48] + mov r2, r0, asr #1 + ldrsb r0, [sp, #0x49] + mla r7, r2, r1, r7 + mla r6, r2, r0, r6 + b _020BDB90 +_020BDB74: + tst r4, #0x20 + beq _020BDB90 + ldrsb r1, [sp, #0x48] + ldrsb r0, [sp, #0x49] + rsb r2, r2, #0 + mla r7, r2, r1, r7 + mla r6, r2, r0, r6 +_020BDB90: + tst r4, #2 + beq _020BDBC4 + ldr r0, [sp, #0x24] + ldrsb r2, [sp, #0x49] + add r0, r0, #1 + rsb r0, r0, #0 + add r0, r0, r0, lsr #31 + ldrsb r1, [sp, #0x48] + mov r3, r0, asr #1 + rsb r0, r2, #0 + mla r7, r3, r0, r7 + mla r6, r3, r1, r6 + b _020BDBE8 +_020BDBC4: + tst r4, #4 + beq _020BDBE8 + ldrsb r1, [sp, #0x49] + ldr r2, [sp, #0x24] + ldrsb r0, [sp, #0x48] + rsb r2, r2, #0 + rsb r1, r1, #0 + mla r7, r2, r1, r7 + mla r6, r2, r0, r6 +_020BDBE8: + str r5, [sp] + ldr r1, [sp, #0x44] + str r4, [sp, #4] + ldrb r0, [sp, #0x48] + str r1, [sp, #8] + ldrb r4, [sp, #0x49] + strb r0, [sp, #0xc] + ldr r3, [sp, #0x20] + mov r0, r8 + mov r1, r7 + mov r2, r6 + strb r4, [sp, #0xd] + bl NNSi_G2dTextCanvasDrawTextAlign + add sp, sp, #0x28 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G2dTextCanvasDrawText + + arm_func_start NNSi_G2dTextCanvasDrawTextRect +NNSi_G2dTextCanvasDrawTextRect: ; 0x020BDC24 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + ldr ip, [sp, #0x30] + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + tst ip, #0x100 + beq _020BDC78 + ldr r0, [r7, #4] + ldr r1, [r7, #0xc] + ldr r2, [sp, #0x34] + bl NNSi_G2dFontGetTextHeight + ldrsb r2, [sp, #0x39] + ldr r3, [sp, #0x28] + ldrsb r1, [sp, #0x38] + sub r3, r3, r0 + rsb r0, r2, #0 + mla r6, r3, r0, r6 + mla r5, r3, r1, r5 + b _020BDCC0 +_020BDC78: + tst ip, #0x80 + beq _020BDCC0 + ldr r0, [r7, #4] + ldr r1, [r7, #0xc] + ldr r2, [sp, #0x34] + bl NNSi_G2dFontGetTextHeight + ldr r1, [sp, #0x28] + add r0, r0, #1 + ldrsb r3, [sp, #0x39] + add ip, r1, #1 + add r1, r0, r0, lsr #31 + ldrsb r2, [sp, #0x38] + add r0, ip, ip, lsr #31 + mov r1, r1, asr #1 + rsb r1, r1, r0, asr #1 + rsb r0, r3, #0 + mla r6, r1, r0, r6 + mla r5, r1, r2, r5 +_020BDCC0: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x30] + str r1, [sp] + ldr r1, [sp, #0x34] + str r0, [sp, #4] + ldrb r0, [sp, #0x38] + str r1, [sp, #8] + ldrb ip, [sp, #0x39] + strb r0, [sp, #0xc] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + strb ip, [sp, #0xd] + bl NNSi_G2dTextCanvasDrawTextAlign + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_G2dTextCanvasDrawTextRect + + arm_func_start NNSi_G2dGetUnpackedFont +NNSi_G2dGetUnpackedFont: ; 0x020BDD04 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r0 + mov r5, r1 + mov r4, #0 + beq _020BDD7C + cmp r6, #0 + beq _020BDD34 + ldr r1, [r6] + ldr r0, _020BDE4C ; =0x4E465452 + cmp r1, r0 + moveq r0, #1 + beq _020BDD38 +_020BDD34: + mov r0, #0 +_020BDD38: + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020BDD80 + cmp r6, #0 + beq _020BDD68 + ldrh r1, [r6, #6] + ldr r0, _020BDE50 ; =0x00000101 + cmp r1, r0 + movhs r0, #1 + bhs _020BDD6C +_020BDD68: + mov r0, #0 +_020BDD6C: + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + b _020BDD80 +_020BDD7C: + mov r0, r4 +_020BDD80: + cmp r0, #0 + bne _020BDE00 + cmp r6, #0 + beq _020BDDEC + beq _020BDDA8 + ldr r1, [r6] + ldr r0, _020BDE4C ; =0x4E465452 + cmp r1, r0 + moveq r0, #1 + beq _020BDDAC +_020BDDA8: + mov r0, #0 +_020BDDAC: + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + cmp r0, #0 + beq _020BDDF0 + cmp r6, #0 + beq _020BDDD8 + ldrh r0, [r6, #6] + cmp r0, #0x100 + movhs r0, #1 + bhs _020BDDDC +_020BDDD8: + mov r0, #0 +_020BDDDC: + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + b _020BDDF0 +_020BDDEC: + mov r0, #0 +_020BDDF0: + cmp r0, #0 + bne _020BDDFC + bl OS_Terminate +_020BDDFC: + mov r4, #1 +_020BDE00: + mov r0, r6 + bl NNSi_G2dUnpackNFT + ldr r1, _020BDE54 ; =0x46494E46 + mov r0, r6 + bl NNS_G2dFindBinaryBlock + cmp r0, #0 + moveq r0, #0 + streq r0, [r5] + ldmeqia sp!, {r4, r5, r6, pc} + add r0, r0, #8 + str r0, [r5] + cmp r4, #0 + beq _020BDE44 + ldr r0, [r5] + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #7] +_020BDE44: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020BDE4C: .word 0x4E465452 +_020BDE50: .word 0x00000101 +_020BDE54: .word 0x46494E46 + arm_func_end NNSi_G2dGetUnpackedFont + + arm_func_start NNSi_G2dUnpackNFT +NNSi_G2dUnpackNFT: ; 0x020BDE58 + stmdb sp!, {r4, r5, r6, lr} + ldrh r1, [r0, #0xc] + ldrh r3, [r0, #0xe] + mov r2, #0 + add r1, r0, r1 + cmp r3, #0 + ldmleia sp!, {r4, r5, r6, pc} + ldr r3, _020BDF24 ; =0x46494E46 + ldr ip, _020BDF28 ; =0x43574448 + ldr r4, _020BDF2C ; =0x434D4150 + ldr lr, _020BDF30 ; =0x43474C50 +_020BDE84: + ldr r5, [r1] + cmp r5, r4 + bhi _020BDE9C + bhs _020BDEF8 + cmp r5, lr + b _020BDF08 +_020BDE9C: + cmp r5, ip + bhi _020BDEAC + beq _020BDEE4 + b _020BDF08 +_020BDEAC: + cmp r5, r3 + bne _020BDF08 + ldr r5, [r1, #0x10] + add r5, r5, r0 + str r5, [r1, #0x10] + ldr r5, [r1, #0x14] + cmp r5, #0 + addne r5, r5, r0 + strne r5, [r1, #0x14] + ldr r5, [r1, #0x18] + cmp r5, #0 + addne r5, r5, r0 + strne r5, [r1, #0x18] + b _020BDF08 +_020BDEE4: + ldr r5, [r1, #0xc] + cmp r5, #0 + addne r5, r5, r0 + strne r5, [r1, #0xc] + b _020BDF08 +_020BDEF8: + ldr r5, [r1, #0x10] + cmp r5, #0 + addne r5, r5, r0 + strne r5, [r1, #0x10] +_020BDF08: + ldrh r5, [r0, #0xe] + ldr r6, [r1, #4] + add r2, r2, #1 + cmp r2, r5 + add r1, r1, r6 + blt _020BDE84 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020BDF24: .word 0x46494E46 +_020BDF28: .word 0x43574448 +_020BDF2C: .word 0x434D4150 +_020BDF30: .word 0x43474C50 + arm_func_end NNSi_G2dUnpackNFT + + arm_func_start NNSi_G2dBitReaderRead +NNSi_G2dBitReaderRead: ; 0x020BDF34 + stmdb sp!, {r4, r5, r6, lr} + ldrsb r3, [r0, #4] + ldrb r4, [r0, #5] + mov r5, r1 + cmp r3, r5 + subge r1, r3, r5 + movge r2, r4, lsr r1 + strgeb r1, [r0, #4] + bge _020BDF84 + ldr r2, [r0] + sub r6, r5, r3 + add r1, r2, #1 + str r1, [r0] + ldrb r3, [r2] + mov r1, r6 + mov r2, #8 + strb r3, [r0, #5] + strb r2, [r0, #4] + bl NNSi_G2dBitReaderRead + orr r2, r0, r4, lsl r6 +_020BDF84: + rsb r0, r5, #8 + mov r1, #0xff + and r0, r2, r1, asr r0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_G2dBitReaderRead + + arm_func_start NNSi_G2dSplitCharUTF16 +NNSi_G2dSplitCharUTF16: ; 0x020BDF94 + ldr r1, [r0] + ldrh r2, [r1], #2 + str r1, [r0] + mov r0, r2 + bx lr + arm_func_end NNSi_G2dSplitCharUTF16 + + arm_func_start NNS_G3dAnmObjCalcSizeRequired +NNS_G3dAnmObjCalcSizeRequired: ; 0x020BDFA8 + cmp r0, #0 + cmpne r1, #0 + moveq r0, #0 + bxeq lr + ldrb r0, [r0] + cmp r0, #0x4a + beq _020BDFEC + cmp r0, #0x4d + beq _020BDFD8 + cmp r0, #0x56 + beq _020BDFEC + b _020BE000 +_020BDFD8: + ldrb r0, [r1, #0x18] + mov r0, r0, lsl #1 + add r0, r0, #0x1c + bic r0, r0, #3 + bx lr +_020BDFEC: + ldrb r0, [r1, #0x17] + mov r0, r0, lsl #1 + add r0, r0, #0x1c + bic r0, r0, #3 + bx lr +_020BE000: + mov r0, #0 + bx lr + arm_func_end NNS_G3dAnmObjCalcSizeRequired + + arm_func_start NNS_G3dAnmObjInit +NNS_G3dAnmObjInit: ; 0x020BE008 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov ip, #0 + str ip, [r0] + str r1, [r0, #8] + str ip, [r0, #0x10] + mov r4, #0x7f + strb r4, [r0, #0x18] + mov r4, #0x1000 + str r4, [r0, #4] + str r3, [r0, #0x14] + strb ip, [r0, #0x19] + ldr r3, _020BE09C ; =_02110A00 + str ip, [r0, #0xc] + ldr r7, [r3] + cmp r7, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r6, [r1] + ldr r4, _020BE0A0 ; =_02110A24 +_020BE050: + ldrb r3, [r4, ip, lsl #3] + mov r5, ip, lsl #3 + cmp r6, r3 + bne _020BE08C + add r3, r4, r5 + ldrh lr, [r1, #2] + ldrh r3, [r3, #2] + cmp lr, r3 + bne _020BE08C + ldr r3, _020BE0A4 ; =_02110A28 + ldr r3, [r3, r5] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + blx r3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020BE08C: + add ip, ip, #1 + cmp ip, r7 + blo _020BE050 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020BE09C: .word _02110A00 +_020BE0A0: .word _02110A24 +_020BE0A4: .word _02110A28 + arm_func_end NNS_G3dAnmObjInit + + arm_func_start NNS_G3dAnmObjEnableID +NNS_G3dAnmObjEnableID: ; 0x020BE0A8 + cmp r1, #0 + bxlt lr + ldrb r2, [r0, #0x19] + cmp r1, r2 + bxge lr + add r2, r0, r1, lsl #1 + ldrh r2, [r2, #0x1a] + mov r3, r1, lsl #1 + tst r2, #0x100 + bxeq lr + add r1, r0, #0x1a + ldrh r0, [r1, r3] + bic r0, r0, #0x200 + strh r0, [r1, r3] + bx lr + arm_func_end NNS_G3dAnmObjEnableID + + arm_func_start NNS_G3dAnmObjDisableID +NNS_G3dAnmObjDisableID: ; 0x020BE0E4 + cmp r1, #0 + bxlt lr + ldrb r2, [r0, #0x19] + cmp r1, r2 + bxge lr + add r2, r0, r1, lsl #1 + ldrh r2, [r2, #0x1a] + mov r3, r1, lsl #1 + tst r2, #0x100 + bxeq lr + add r1, r0, #0x1a + ldrh r0, [r1, r3] + orr r0, r0, #0x200 + strh r0, [r1, r3] + bx lr + arm_func_end NNS_G3dAnmObjDisableID + + arm_func_start NNS_G3dRenderObjInit +NNS_G3dRenderObjInit: ; 0x020BE120 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r1, r5 + mov r0, #0 + mov r2, #0x54 + bl MIi_CpuClear32 + ldr r0, _020BE168 ; =_02110A20 + ldr r1, _020BE16C ; =_02110A1C + ldr r2, [r0] + ldr r0, _020BE170 ; =_02110A18 + str r2, [r5, #0xc] + ldr r1, [r1] + str r1, [r5, #0x14] + ldr r0, [r0] + str r0, [r5, #0x1c] + str r4, [r5, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BE168: .word _02110A20 +_020BE16C: .word _02110A1C +_020BE170: .word _02110A18 + arm_func_end NNS_G3dRenderObjInit + + arm_func_start addLink_ +addLink_: ; 0x020BE174 + ldr ip, [r0] + cmp ip, #0 + streq r1, [r0] + bxeq lr + ldr r2, [ip, #0x10] + cmp r2, #0 + bne _020BE1D4 + ldrb r3, [ip, #0x18] + ldrb r2, [r1, #0x18] + cmp r3, r2 + bls _020BE1CC + ldr r2, [r1, #0x10] + mov r3, r1 + cmp r2, #0 + beq _020BE1C0 +_020BE1B0: + ldr r3, [r3, #0x10] + ldr r2, [r3, #0x10] + cmp r2, #0 + bne _020BE1B0 +_020BE1C0: + str ip, [r3, #0x10] + str r1, [r0] + bx lr +_020BE1CC: + str r1, [ip, #0x10] + bx lr +_020BE1D4: + beq _020BE224 + ldrb r3, [r1, #0x18] +_020BE1DC: + ldrb r0, [r2, #0x18] + cmp r0, r3 + blo _020BE214 + ldr r0, [r1, #0x10] + mov r3, r1 + cmp r0, #0 + beq _020BE208 +_020BE1F8: + ldr r3, [r3, #0x10] + ldr r0, [r3, #0x10] + cmp r0, #0 + bne _020BE1F8 +_020BE208: + str r1, [ip, #0x10] + str r2, [r3, #0x10] + bx lr +_020BE214: + mov ip, r2 + ldr r2, [r2, #0x10] + cmp r2, #0 + bne _020BE1DC +_020BE224: + str r1, [ip, #0x10] + bx lr + arm_func_end addLink_ + + arm_func_start updateHintVec_ +updateHintVec_: ; 0x020BE22C + stmdb sp!, {r3, r4, r5, lr} + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r3, #1 + mov r4, #0 +_020BE240: + ldrb r2, [r1, #0x19] + mov r5, r4 + cmp r2, #0 + ble _020BE284 +_020BE250: + add r2, r1, r5, lsl #1 + ldrh r2, [r2, #0x1a] + tst r2, #0x100 + beq _020BE274 + mov lr, r5, asr #5 + ldr ip, [r0, lr, lsl #2] + and r2, r5, #0x1f + orr r2, ip, r3, lsl r2 + str r2, [r0, lr, lsl #2] +_020BE274: + ldrb r2, [r1, #0x19] + add r5, r5, #1 + cmp r5, r2 + blt _020BE250 +_020BE284: + ldr r1, [r1, #0x10] + cmp r1, #0 + bne _020BE240 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end updateHintVec_ + + arm_func_start NNS_G3dRenderObjAddAnmObj +NNS_G3dRenderObjAddAnmObj: ; 0x020BE294 + stmdb sp!, {r3, r4, r5, lr} + movs r4, r1 + mov r5, r0 + ldrne r0, [r4, #8] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r0] + cmp r0, #0x4a + beq _020BE2E4 + cmp r0, #0x4d + beq _020BE2CC + cmp r0, #0x56 + beq _020BE2FC + ldmia sp!, {r3, r4, r5, pc} +_020BE2CC: + add r0, r5, #0x3c + bl updateHintVec_ + mov r1, r4 + add r0, r5, #8 + bl addLink_ + ldmia sp!, {r3, r4, r5, pc} +_020BE2E4: + add r0, r5, #0x44 + bl updateHintVec_ + mov r1, r4 + add r0, r5, #0x10 + bl addLink_ + ldmia sp!, {r3, r4, r5, pc} +_020BE2FC: + add r0, r5, #0x4c + bl updateHintVec_ + mov r1, r4 + add r0, r5, #0x18 + bl addLink_ + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G3dRenderObjAddAnmObj + + arm_func_start removeLink_ +removeLink_: ; 0x020BE314 + ldr r3, [r0] + cmp r3, #0 + moveq r0, #0 + bxeq lr + cmp r3, r1 + bne _020BE344 + ldr r3, [r3, #0x10] + mov r2, #0 + str r3, [r0] + str r2, [r1, #0x10] + mov r0, #1 + bx lr +_020BE344: + ldr r2, [r3, #0x10] + cmp r2, #0 + beq _020BE380 +_020BE350: + cmp r2, r1 + bne _020BE370 + ldr r1, [r2, #0x10] + mov r0, #0 + str r1, [r3, #0x10] + str r0, [r2, #0x10] + mov r0, #1 + bx lr +_020BE370: + mov r3, r2 + ldr r2, [r2, #0x10] + cmp r2, #0 + bne _020BE350 +_020BE380: + mov r0, #0 + bx lr + arm_func_end removeLink_ + + arm_func_start NNS_G3dRenderObjRemoveAnmObj +NNS_G3dRenderObjRemoveAnmObj: ; 0x020BE388 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + add r0, r5, #8 + mov r4, r1 + bl removeLink_ + cmp r0, #0 + bne _020BE3CC + mov r1, r4 + add r0, r5, #0x10 + bl removeLink_ + cmp r0, #0 + bne _020BE3CC + mov r1, r4 + add r0, r5, #0x18 + bl removeLink_ + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} +_020BE3CC: + ldr r0, [r5] + orr r0, r0, #0x10 + str r0, [r5] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G3dRenderObjRemoveAnmObj + + arm_func_start NNS_G3dTexGetRequiredSize +NNS_G3dTexGetRequiredSize: ; 0x020BE3DC + cmp r0, #0 + ldrneh r0, [r0, #0xc] + movne r0, r0, lsl #3 + moveq r0, #0 + bx lr + arm_func_end NNS_G3dTexGetRequiredSize + + arm_func_start NNS_G3dTex4x4GetRequiredSize +NNS_G3dTex4x4GetRequiredSize: ; 0x020BE3F0 + cmp r0, #0 + ldrneh r0, [r0, #0x1c] + movne r0, r0, lsl #3 + moveq r0, #0 + bx lr + arm_func_end NNS_G3dTex4x4GetRequiredSize + + arm_func_start NNS_G3dTexSetTexKey +NNS_G3dTexSetTexKey: ; 0x020BE404 + cmp r1, #0 + strne r1, [r0, #8] + cmp r2, #0 + strne r2, [r0, #0x18] + bx lr + arm_func_end NNS_G3dTexSetTexKey + + arm_func_start NNS_G3dTexLoad +NNS_G3dTexLoad: ; 0x020BE418 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r8, r1 + mov sb, r0 + beq _020BE42C + bl GX_BeginLoadTex +_020BE42C: + ldrh r0, [sb, #0xc] + movs r2, r0, lsl #3 + beq _020BE45C + ldr r0, [sb, #8] + ldr r3, [sb, #0x14] + mov r1, r0, lsl #0x10 + add r0, sb, r3 + mov r1, r1, lsr #0xd + bl GX_LoadTex + ldrh r0, [sb, #0x10] + orr r0, r0, #1 + strh r0, [sb, #0x10] +_020BE45C: + ldrh r0, [sb, #0x1c] + movs r6, r0, lsl #3 + beq _020BE4BC + ldr r1, [sb, #0x18] + ldr r0, [sb, #0x24] + mov r4, r1, lsl #0x10 + mov r7, r4, lsr #0xd + mov r1, r7 + mov r2, r6 + add r0, sb, r0 + ldr r5, [sb, #0x28] + bl GX_LoadTex + ldr r0, _020BE4CC ; =0x0001FFFF + and r1, r7, #0x40000 + and r0, r0, r4, lsr #13 + mov r0, r0, lsr #1 + add r2, r0, #0x20000 + add r0, sb, r5 + add r1, r2, r1, lsr #2 + mov r2, r6, lsr #1 + bl GX_LoadTex + ldrh r0, [sb, #0x20] + orr r0, r0, #1 + strh r0, [sb, #0x20] +_020BE4BC: + cmp r8, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + bl GX_EndLoadTex + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020BE4CC: .word 0x0001FFFF + arm_func_end NNS_G3dTexLoad + + arm_func_start NNS_G3dTexReleaseTexKey +NNS_G3dTexReleaseTexKey: ; 0x020BE4D0 + cmp r1, #0 + beq _020BE4F4 + ldrh ip, [r0, #0x10] + mov r3, #0 + bic ip, ip, #1 + strh ip, [r0, #0x10] + ldr ip, [r0, #8] + str ip, [r1] + str r3, [r0, #8] +_020BE4F4: + cmp r2, #0 + bxeq lr + ldrh r3, [r0, #0x20] + mov r1, #0 + bic r3, r3, #1 + strh r3, [r0, #0x20] + ldr r3, [r0, #0x18] + str r3, [r2] + str r1, [r0, #0x18] + bx lr + arm_func_end NNS_G3dTexReleaseTexKey + + arm_func_start NNS_G3dPlttGetRequiredSize +NNS_G3dPlttGetRequiredSize: ; 0x020BE51C + cmp r0, #0 + ldrneh r0, [r0, #0x30] + movne r0, r0, lsl #3 + moveq r0, #0 + bx lr + arm_func_end NNS_G3dPlttGetRequiredSize + + arm_func_start NNS_G3dPlttSetPlttKey +NNS_G3dPlttSetPlttKey: ; 0x020BE530 + str r1, [r0, #0x2c] + bx lr + arm_func_end NNS_G3dPlttSetPlttKey + + arm_func_start NNS_G3dPlttLoad +NNS_G3dPlttLoad: ; 0x020BE538 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r1 + mov r4, r0 + beq _020BE54C + bl GX_BeginLoadTexPltt +_020BE54C: + ldr r0, [r4, #0x2c] + ldrh r2, [r4, #0x30] + mov r1, r0, lsl #0x10 + ldr r3, [r4, #0x38] + mov r1, r1, lsr #0xd + add r0, r4, r3 + mov r2, r2, lsl #3 + bl GX_LoadTexPltt + ldrh r0, [r4, #0x32] + cmp r5, #0 + orr r0, r0, #1 + strh r0, [r4, #0x32] + ldmeqia sp!, {r3, r4, r5, pc} + bl GX_EndLoadTexPltt + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G3dPlttLoad + + arm_func_start NNS_G3dPlttReleasePlttKey +NNS_G3dPlttReleasePlttKey: ; 0x020BE588 + ldrh r2, [r0, #0x32] + mov r1, #0 + bic r2, r2, #1 + strh r2, [r0, #0x32] + ldr r2, [r0, #0x2c] + str r1, [r0, #0x2c] + mov r0, r2 + bx lr + arm_func_end NNS_G3dPlttReleasePlttKey + + arm_func_start bindMdlTex_Internal_ +bindMdlTex_Internal_: ; 0x020BE5A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + mov r8, r3 + ldr r1, [r8] + mov sl, r0 + and r0, r1, #0x1c000000 + ldrh r3, [sb] + cmp r0, #0x14000000 + mov r5, #0 + add r0, sl, r3 + str r0, [sp] + ldrne r0, [r2, #8] + ldreq r0, [r2, #0x18] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bic fp, r0, #0xe0000000 + ldrb r0, [sb, #2] + cmp r0, #0 + bls _020BE6C4 + add r4, sl, #4 +_020BE5F8: + ldr r0, [sp] + cmp sl, #0 + ldrb r2, [r0, r5] + beq _020BE648 + cmp r4, #0 + beq _020BE634 + ldrb r0, [sl, #5] + cmp r2, r0 + bhs _020BE634 + ldrh r0, [sl, #0xa] + add r1, r4, r0 + add r1, r1, #4 + ldrh r0, [r4, r0] + mla r1, r0, r2, r1 + b _020BE638 +_020BE634: + mov r1, #0 +_020BE638: + cmp r1, #0 + ldrne r0, [r1] + addne r7, sl, r0 + bne _020BE64C +_020BE648: + mov r7, #0 +_020BE64C: + ldr r0, [r8] + ldr r1, [r7, #0x14] + add r0, r0, fp + orr r0, r1, r0 + str r0, [r7, #0x14] + ldr r3, [r8, #4] + ldr r0, _020BE6D4 ; =0x000007FF + ldrh r1, [r7, #0x20] + and r2, r3, r0 + and r0, r3, r0, lsl #11 + mov r6, r0, lsr #0xb + cmp r2, r1 + moveq r0, #0x1000 + beq _020BE690 + mov r0, r2, lsl #0xc + mov r1, r1, lsl #0xc + bl FX_Div +_020BE690: + str r0, [r7, #0x24] + ldrh r1, [r7, #0x22] + cmp r6, r1 + moveq r0, #0x1000 + beq _020BE6B0 + mov r0, r6, lsl #0xc + mov r1, r1, lsl #0xc + bl FX_Div +_020BE6B0: + str r0, [r7, #0x28] + ldrb r0, [sb, #2] + add r5, r5, #1 + cmp r5, r0 + blo _020BE5F8 +_020BE6C4: + ldrb r0, [sb, #3] + orr r0, r0, #1 + strb r0, [sb, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020BE6D4: .word 0x000007FF + arm_func_end bindMdlTex_Internal_ + + arm_func_start releaseMdlTex_Internal_ +releaseMdlTex_Internal_: ; 0x020BE6D8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldrh r3, [r1] + ldrb r2, [r1, #2] + mov lr, #0 + add ip, r0, r3 + cmp r2, #0 + bls _020BE77C + ldr r4, _020BE78C ; =0xC00F0000 + add r2, r0, #4 + mov r7, lr + mov r6, lr + mov r5, #0x1000 +_020BE708: + cmp r0, #0 + ldrb r3, [ip, lr] + beq _020BE754 + cmp r2, #0 + beq _020BE740 + ldrb r8, [r0, #5] + cmp r3, r8 + bhs _020BE740 + ldrh sb, [r0, #0xa] + ldrh r8, [r2, sb] + add sb, r2, sb + add sb, sb, #4 + mla r3, r8, r3, sb + b _020BE744 +_020BE740: + mov r3, r7 +_020BE744: + cmp r3, #0 + ldrne r3, [r3] + addne r8, r0, r3 + bne _020BE758 +_020BE754: + mov r8, r6 +_020BE758: + ldr r3, [r8, #0x14] + add lr, lr, #1 + and r3, r3, r4 + str r3, [r8, #0x14] + str r5, [r8, #0x24] + str r5, [r8, #0x28] + ldrb r3, [r1, #2] + cmp lr, r3 + blo _020BE708 +_020BE77C: + ldrb r0, [r1, #3] + bic r0, r0, #1 + strb r0, [r1, #3] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020BE78C: .word 0xC00F0000 + arm_func_end releaseMdlTex_Internal_ + + arm_func_start NNS_G3dBindMdlTex +NNS_G3dBindMdlTex: ; 0x020BE790 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r1 + cmp r0, #0 + ldrne r1, [r0, #8] + mov r7, #1 + cmpne r1, #0 + addne r8, r0, r1 + moveq r8, #0 + ldrh r0, [r8] + mov r6, #0 + add r5, r8, r0 + ldrb r0, [r5, #1] + cmp r0, #0 + bls _020BE888 + mov sb, r6 + mov r4, r6 + mov fp, r6 +_020BE7D4: + cmp r5, #0 + beq _020BE800 + ldrb r0, [r5, #1] + cmp r6, r0 + bhs _020BE800 + ldrh r0, [r5, #6] + add r1, r5, r0 + ldrh r0, [r1, #2] + add r0, r1, r0 + add r1, r0, sb + b _020BE804 +_020BE800: + mov r1, r4 +_020BE804: + cmp sl, #0 + moveq r3, fp + beq _020BE81C + add r0, sl, #0x3c + bl NNS_G3dGetResDataByName + mov r3, r0 +_020BE81C: + cmp r3, #0 + beq _020BE870 + cmp r5, #0 + beq _020BE850 + ldrb r0, [r5, #1] + cmp r6, r0 + bhs _020BE850 + ldrh r1, [r5, #6] + ldrh r0, [r5, r1] + add r1, r5, r1 + add r1, r1, #4 + mla r1, r0, r6, r1 + b _020BE854 +_020BE850: + mov r1, #0 +_020BE854: + ldrb r0, [r1, #3] + tst r0, #1 + bne _020BE874 + mov r0, r8 + mov r2, sl + bl bindMdlTex_Internal_ + b _020BE874 +_020BE870: + mov r7, #0 +_020BE874: + ldrb r0, [r5, #1] + add r6, r6, #1 + add sb, sb, #0x10 + cmp r6, r0 + blo _020BE7D4 +_020BE888: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G3dBindMdlTex + + arm_func_start NNS_G3dForceBindMdlTex +NNS_G3dForceBindMdlTex: ; 0x020BE890 + stmdb sp!, {r3, r4, r5, lr} + mov ip, r1 + cmp r0, #0 + ldrne r1, [r0, #8] + cmpne r1, #0 + addne r0, r0, r1 + moveq r0, #0 + ldrh r1, [r0] + cmp ip, #0 + add r1, r0, r1 + beq _020BE8F0 + adds r5, ip, #0x3c + beq _020BE8E8 + ldrb r4, [ip, #0x3d] + cmp r3, r4 + bhs _020BE8E8 + ldrh lr, [ip, #0x42] + ldrh r4, [r5, lr] + add lr, r5, lr + add lr, lr, #4 + mla r3, r4, r3, lr + b _020BE8F4 +_020BE8E8: + mov r3, #0 + b _020BE8F4 +_020BE8F0: + mov r3, #0 +_020BE8F4: + cmp r1, #0 + beq _020BE920 + ldrb r4, [r1, #1] + cmp r2, r4 + bhs _020BE920 + ldrh r4, [r1, #6] + ldrh lr, [r1, r4] + add r1, r1, r4 + add r1, r1, #4 + mla r1, lr, r2, r1 + b _020BE924 +_020BE920: + mov r1, #0 +_020BE924: + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r2, ip + bl bindMdlTex_Internal_ + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G3dForceBindMdlTex + + arm_func_start NNS_G3dReleaseMdlTex +NNS_G3dReleaseMdlTex: ; 0x020BE940 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + cmp r0, #0 + ldrne r1, [r0, #8] + mov r5, #0 + cmpne r1, #0 + addne r6, r0, r1 + moveq r6, #0 + ldrh r0, [r6] + add r4, r6, r0 + ldrb r0, [r4, #1] + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, pc} + mov r7, r5 +_020BE974: + cmp r4, #0 + beq _020BE9A0 + ldrb r0, [r4, #1] + cmp r5, r0 + bhs _020BE9A0 + ldrh r1, [r4, #6] + ldrh r0, [r4, r1] + add r1, r4, r1 + add r1, r1, #4 + mla r1, r0, r5, r1 + b _020BE9A4 +_020BE9A0: + mov r1, r7 +_020BE9A4: + ldrb r0, [r1, #3] + tst r0, #1 + beq _020BE9B8 + mov r0, r6 + bl releaseMdlTex_Internal_ +_020BE9B8: + ldrb r0, [r4, #1] + add r5, r5, #1 + cmp r5, r0 + blo _020BE974 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G3dReleaseMdlTex + + arm_func_start bindMdlPltt_Internal_ +bindMdlPltt_Internal_: ; 0x020BE9CC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r2, [r2, #0x2c] + ldrh r5, [r1] + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + ldrh r4, [r3, #2] + bic r2, r2, #0xe0000000 + mov r2, r2, lsl #0x10 + tst r4, #1 + add ip, r0, r5 + mov r5, r2, lsr #0x10 + ldrh r4, [r3] + bne _020BEA10 + mov r2, r4, lsl #0xf + mov r3, r5, lsl #0xf + mov r4, r2, lsr #0x10 + mov r5, r3, lsr #0x10 +_020BEA10: + ldrb r2, [r1, #2] + mov r3, #0 + cmp r2, #0 + bls _020BEA9C + add r2, r4, r5 + mov lr, r2, lsl #0x10 + add r2, r0, #4 + mov r4, lr, lsr #0x10 + mov r6, r3 + mov r5, r3 +_020BEA38: + cmp r0, #0 + ldrb r8, [ip, r3] + beq _020BEA84 + cmp r2, #0 + beq _020BEA70 + ldrb r7, [r0, #5] + cmp r8, r7 + bhs _020BEA70 + ldrh r7, [r0, #0xa] + ldrh lr, [r2, r7] + add r7, r2, r7 + add r7, r7, #4 + mla r7, lr, r8, r7 + b _020BEA74 +_020BEA70: + mov r7, r6 +_020BEA74: + cmp r7, #0 + ldrne lr, [r7] + addne r7, r0, lr + bne _020BEA88 +_020BEA84: + mov r7, r5 +_020BEA88: + strh r4, [r7, #0x1c] + ldrb lr, [r1, #2] + add r3, r3, #1 + cmp r3, lr + blo _020BEA38 +_020BEA9C: + ldrb r0, [r1, #3] + orr r0, r0, #1 + strb r0, [r1, #3] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end bindMdlPltt_Internal_ + + arm_func_start NNS_G3dBindMdlPltt +NNS_G3dBindMdlPltt: ; 0x020BEAAC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r1 + cmp r0, #0 + ldrne r1, [r0, #8] + mov r7, #1 + cmpne r1, #0 + addne r8, r0, r1 + moveq r8, #0 + ldrh r0, [r8, #2] + mov r6, #0 + add r5, r8, r0 + ldrb r0, [r5, #1] + cmp r0, #0 + bls _020BEBAC + mov sb, r6 + mov r4, r6 + mov fp, r6 +_020BEAF0: + cmp r5, #0 + beq _020BEB1C + ldrb r0, [r5, #1] + cmp r6, r0 + bhs _020BEB1C + ldrh r0, [r5, #6] + add r1, r5, r0 + ldrh r0, [r1, #2] + add r0, r1, r0 + add r1, r0, sb + b _020BEB20 +_020BEB1C: + mov r1, r4 +_020BEB20: + cmp sl, #0 + ldrneh r0, [sl, #0x34] + cmpne r0, #0 + moveq r3, fp + beq _020BEB40 + add r0, sl, r0 + bl NNS_G3dGetResDataByName + mov r3, r0 +_020BEB40: + cmp r3, #0 + beq _020BEB94 + cmp r5, #0 + beq _020BEB74 + ldrb r0, [r5, #1] + cmp r6, r0 + bhs _020BEB74 + ldrh r1, [r5, #6] + ldrh r0, [r5, r1] + add r1, r5, r1 + add r1, r1, #4 + mla r1, r0, r6, r1 + b _020BEB78 +_020BEB74: + mov r1, #0 +_020BEB78: + ldrb r0, [r1, #3] + tst r0, #1 + bne _020BEB98 + mov r0, r8 + mov r2, sl + bl bindMdlPltt_Internal_ + b _020BEB98 +_020BEB94: + mov r7, #0 +_020BEB98: + ldrb r0, [r5, #1] + add r6, r6, #1 + add sb, sb, #0x10 + cmp r6, r0 + blo _020BEAF0 +_020BEBAC: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G3dBindMdlPltt + + arm_func_start NNS_G3dForceBindMdlPltt +NNS_G3dForceBindMdlPltt: ; 0x020BEBB4 + stmdb sp!, {r3, r4, r5, lr} + mov ip, r1 + cmp r0, #0 + ldrne r1, [r0, #8] + cmpne r1, #0 + addne r0, r0, r1 + moveq r0, #0 + ldrh r1, [r0, #2] + cmp ip, #0 + ldrneh r4, [ip, #0x34] + add r1, r0, r1 + cmpne r4, #0 + beq _020BEC1C + adds r5, ip, r4 + beq _020BEC14 + ldrb r4, [r5, #1] + cmp r3, r4 + bhs _020BEC14 + ldrh lr, [r5, #6] + ldrh r4, [r5, lr] + add lr, r5, lr + add lr, lr, #4 + mla r3, r4, r3, lr + b _020BEC20 +_020BEC14: + mov r3, #0 + b _020BEC20 +_020BEC1C: + mov r3, #0 +_020BEC20: + cmp r1, #0 + beq _020BEC4C + ldrb r4, [r1, #1] + cmp r2, r4 + bhs _020BEC4C + ldrh r4, [r1, #6] + ldrh lr, [r1, r4] + add r1, r1, r4 + add r1, r1, #4 + mla r1, lr, r2, r1 + b _020BEC50 +_020BEC4C: + mov r1, #0 +_020BEC50: + cmp r1, #0 + beq _020BEC74 + ldrb r2, [r1, #3] + tst r2, #1 + bne _020BEC74 + mov r2, ip + bl bindMdlPltt_Internal_ + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020BEC74: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_G3dForceBindMdlPltt + + arm_func_start NNS_G3dReleaseMdlPltt +NNS_G3dReleaseMdlPltt: ; 0x020BEC7C + cmp r0, #0 + ldrne r1, [r0, #8] + mov ip, #0 + cmpne r1, #0 + addne r1, r0, r1 + moveq r1, #0 + ldrh r0, [r1, #2] + add r3, r1, r0 + ldrb r0, [r3, #1] + cmp r0, #0 + bxls lr + mov r1, ip +_020BECAC: + cmp r3, #0 + beq _020BECD8 + ldrb r0, [r3, #1] + cmp ip, r0 + bhs _020BECD8 + ldrh r2, [r3, #6] + ldrh r0, [r3, r2] + add r2, r3, r2 + add r2, r2, #4 + mla r2, r0, ip, r2 + b _020BECDC +_020BECD8: + mov r2, r1 +_020BECDC: + ldrb r0, [r2, #3] + add ip, ip, #1 + tst r0, #1 + bicne r0, r0, #1 + strneb r0, [r2, #3] + ldrb r0, [r3, #1] + cmp ip, r0 + blo _020BECAC + bx lr + arm_func_end NNS_G3dReleaseMdlPltt + + arm_func_start NNS_G3dBindMdlSet +NNS_G3dBindMdlSet: ; 0x020BED00 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldrb r0, [sl, #9] + mov sb, r1 + mov r7, #1 + cmp r0, #0 + mov r6, #0 + bls _020BEDA8 + add r5, sl, #8 + mov r4, r6 + mov fp, r6 +_020BED2C: + cmp sl, #0 + beq _020BED74 + cmp r5, #0 + beq _020BED60 + ldrb r0, [sl, #9] + cmp r6, r0 + bhs _020BED60 + ldrh r1, [sl, #0xe] + ldrh r0, [r5, r1] + add r1, r5, r1 + add r1, r1, #4 + mla r1, r0, r6, r1 + b _020BED64 +_020BED60: + mov r1, r4 +_020BED64: + cmp r1, #0 + ldrne r0, [r1] + addne r8, sl, r0 + bne _020BED78 +_020BED74: + mov r8, fp +_020BED78: + mov r0, r8 + mov r1, sb + bl NNS_G3dBindMdlTex + and r7, r7, r0 + mov r0, r8 + mov r1, sb + bl NNS_G3dBindMdlPltt + ldrb r1, [sl, #9] + add r6, r6, #1 + and r7, r7, r0 + cmp r6, r1 + blo _020BED2C +_020BEDA8: + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G3dBindMdlSet + + arm_func_start NNS_G3dReleaseMdlSet +NNS_G3dReleaseMdlSet: ; 0x020BEDB0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r6, r0 + ldrb r0, [r6, #9] + mov r5, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r4, r6, #8 + mov r8, r5 + mov r7, r5 +_020BEDD4: + cmp r6, #0 + beq _020BEE1C + cmp r4, #0 + beq _020BEE08 + ldrb r0, [r6, #9] + cmp r5, r0 + bhs _020BEE08 + ldrh r1, [r6, #0xe] + ldrh r0, [r4, r1] + add r1, r4, r1 + add r1, r1, #4 + mla r1, r0, r5, r1 + b _020BEE0C +_020BEE08: + mov r1, r8 +_020BEE0C: + cmp r1, #0 + ldrne r0, [r1] + addne sb, r6, r0 + bne _020BEE20 +_020BEE1C: + mov sb, r7 +_020BEE20: + mov r0, sb + bl NNS_G3dReleaseMdlTex + mov r0, sb + bl NNS_G3dReleaseMdlPltt + ldrb r0, [r6, #9] + add r5, r5, #1 + cmp r5, r0 + blo _020BEDD4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end NNS_G3dReleaseMdlSet + + arm_func_start NNS_G3dGlbInit +NNS_G3dGlbInit: ; 0x020BEE44 + stmdb sp!, {r3, lr} + ldr r2, _020BEF58 ; =0x17101610 + ldr r1, _020BEF5C ; =NNS_G3dGlb + mov r0, #0 + str r2, [r1] + str r0, [r1, #4] + mov r2, #2 + ldr r0, _020BEF60 ; =0x32323232 + str r2, [r1, #0x48] + ldr r2, _020BEF64 ; =0x60293130 + str r0, [r1, #0x7c] + ldr r0, _020BEF68 ; =0x33333333 + str r2, [r1, #0x90] + ldr r2, _020BEF6C ; =0x002A1B19 + str r0, [r1, #0xa4] + ldr r0, _020BEF70 ; =NNS_G3dGlb + 0x4C + str r2, [r1, #0xb8] + bl MTX_Identity43_ + ldr r0, _020BEF74 ; =NNS_G3dGlb + 0x8 + bl MTX_Identity44_ + ldr ip, _020BEF78 ; =0x40000200 + ldr r3, _020BEF7C ; =0xC0080000 + ldr r2, _020BEF80 ; =0x2D8B62D8 + ldr r1, _020BEF5C ; =NNS_G3dGlb + sub r0, ip, #0xc0000001 + str r2, [r1, #0x80] + str ip, [r1, #0x84] + str r0, [r1, #0x88] + ldr r2, _020BEF84 ; =0x4210C210 + str r3, [r1, #0x8c] + str r2, [r1, #0x94] + ldr r0, _020BEF88 ; =0x001F008F + str r2, [r1, #0x98] + str r0, [r1, #0x9c] + sub r2, r3, #0x90000 + ldr r0, _020BEF8C ; =0x00007FFF + str r2, [r1, #0xa0] + str r0, [r1, #0xa8] + mov r2, #0x4000001f + ldr r0, _020BEF90 ; =0x800003E0 + str r2, [r1, #0xac] + str r0, [r1, #0xb0] + rsb r0, ip, #0x7e00 + str r0, [r1, #0xb4] + mov r2, #0 + str r2, [r1, #0xe0] + str r2, [r1, #0xe4] + ldr r0, _020BEF94 ; =NNS_G3dGlb + 0xBC + str r2, [r1, #0xe8] + bl MTX_Identity33_ + mov r1, #0 + ldr r0, _020BEF5C ; =NNS_G3dGlb + mov r2, #0x1000 + str r2, [r0, #0xec] + str r2, [r0, #0xf0] + str r2, [r0, #0xf4] + str r1, [r0, #0xf8] + str r1, [r0, #0xfc] + str r1, [r0, #0x248] + str r1, [r0, #0x244] + str r1, [r0, #0x240] + str r1, [r0, #0x254] + str r1, [r0, #0x24c] + str r2, [r0, #0x250] + str r1, [r0, #0x25c] + str r1, [r0, #0x258] + sub r1, r1, #0x1000 + str r1, [r0, #0x260] + ldmia sp!, {r3, pc} + .align 2, 0 +_020BEF58: .word 0x17101610 +_020BEF5C: .word NNS_G3dGlb +_020BEF60: .word 0x32323232 +_020BEF64: .word 0x60293130 +_020BEF68: .word 0x33333333 +_020BEF6C: .word 0x002A1B19 +_020BEF70: .word NNS_G3dGlb + 0x4C +_020BEF74: .word NNS_G3dGlb + 0x8 +_020BEF78: .word 0x40000200 +_020BEF7C: .word 0xC0080000 +_020BEF80: .word 0x2D8B62D8 +_020BEF84: .word 0x4210C210 +_020BEF88: .word 0x001F008F +_020BEF8C: .word 0x00007FFF +_020BEF90: .word 0x800003E0 +_020BEF94: .word NNS_G3dGlb + 0xBC + arm_func_end NNS_G3dGlbInit + + arm_func_start NNS_G3dGlbFlushP +NNS_G3dGlbFlushP: ; 0x020BEF98 + stmdb sp!, {r3, lr} + ldr r0, _020BEFCC ; =NNS_G3dGlb + ldr r1, _020BEFD0 ; =NNS_G3dGlb + ldr r0, [r0] + add r1, r1, #4 + mov r2, #0x3e + bl NNS_G3dGeBufferOP_N + ldr r0, _020BEFCC ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + bic r1, r1, #1 + bic r1, r1, #2 + str r1, [r0, #0xfc] + ldmia sp!, {r3, pc} + .align 2, 0 +_020BEFCC: .word NNS_G3dGlb +_020BEFD0: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbFlushP + + arm_func_start NNS_G3dGlbSetBaseTrans +NNS_G3dGlbSetBaseTrans: ; 0x020BEFD4 + cmp r0, #0 + bxeq lr + ldr r3, _020BEFFC ; =NNS_G3dGlb + 0xE0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r0, _020BF000 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + bic r1, r1, #0xa4 + str r1, [r0, #0xfc] + bx lr + .align 2, 0 +_020BEFFC: .word NNS_G3dGlb + 0xE0 +_020BF000: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbSetBaseTrans + + arm_func_start NNS_G3dGlbSetBaseScale +NNS_G3dGlbSetBaseScale: ; 0x020BF004 + cmp r0, #0 + bxeq lr + ldr r3, _020BF02C ; =NNS_G3dGlb + 0xEC + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldr r0, _020BF030 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + bic r1, r1, #0xa4 + str r1, [r0, #0xfc] + bx lr + .align 2, 0 +_020BF02C: .word NNS_G3dGlb + 0xEC +_020BF030: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbSetBaseScale + + arm_func_start NNS_G3dGlbLightVector +NNS_G3dGlbLightVector: ; 0x020BF034 + stmdb sp!, {r3, lr} + ldr ip, _020BF068 ; =0x000003FF + mov r2, r2, asr #3 + mov lr, r3, asr #3 + and r3, ip, r1, asr #3 + mov r1, r2, lsl #0x16 + mov r2, lr, lsl #0x16 + orr r1, r3, r1, lsr #12 + orr r2, r1, r2, lsr #2 + ldr r1, _020BF06C ; =NNS_G3dGlb + 0x80 + orr r2, r2, r0, lsl #30 + str r2, [r1, r0, lsl #2] + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF068: .word 0x000003FF +_020BF06C: .word NNS_G3dGlb + 0x80 + arm_func_end NNS_G3dGlbLightVector + + arm_func_start NNS_G3dGlbLightColor +NNS_G3dGlbLightColor: ; 0x020BF070 + ldr r2, _020BF080 ; =NNS_G3dGlb + 0xA8 + orr r1, r1, r0, lsl #30 + str r1, [r2, r0, lsl #2] + bx lr + .align 2, 0 +_020BF080: .word NNS_G3dGlb + 0xA8 + arm_func_end NNS_G3dGlbLightColor + + arm_func_start NNS_G3dGlbMaterialColorDiffAmb +NNS_G3dGlbMaterialColorDiffAmb: ; 0x020BF084 + cmp r2, #0 + movne r2, #1 + orr r1, r0, r1, lsl #16 + moveq r2, #0 + ldr r0, _020BF0A4 ; =NNS_G3dGlb + orr r1, r1, r2, lsl #15 + str r1, [r0, #0x94] + bx lr + .align 2, 0 +_020BF0A4: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbMaterialColorDiffAmb + + arm_func_start NNS_G3dGlbMaterialColorSpecEmi +NNS_G3dGlbMaterialColorSpecEmi: ; 0x020BF0A8 + cmp r2, #0 + movne r2, #1 + orr r1, r0, r1, lsl #16 + moveq r2, #0 + ldr r0, _020BF0C8 ; =NNS_G3dGlb + orr r1, r1, r2, lsl #15 + str r1, [r0, #0x98] + bx lr + .align 2, 0 +_020BF0C8: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbMaterialColorSpecEmi + + arm_func_start NNS_G3dGlbPolygonAttr +NNS_G3dGlbPolygonAttr: ; 0x020BF0CC + orr r0, r0, r1, lsl #4 + ldr r1, [sp, #4] + orr r0, r0, r2, lsl #6 + orr r0, r1, r0 + ldr r2, [sp] + orr r1, r0, r3, lsl #24 + ldr r0, _020BF0F4 ; =NNS_G3dGlb + orr r1, r1, r2, lsl #16 + str r1, [r0, #0x9c] + bx lr + .align 2, 0 +_020BF0F4: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbPolygonAttr + + arm_func_start NNS_G3dGlbGetInvV +NNS_G3dGlbGetInvV: ; 0x020BF0F8 + stmdb sp!, {r3, lr} + ldr r0, _020BF130 ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #8 + bne _020BF128 + ldr r0, _020BF134 ; =NNS_G3dGlb + 0x4C + ldr r1, _020BF138 ; =NNS_G3dGlb + 0x100 + bl MTX_Inverse43 + ldr r0, _020BF130 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + orr r1, r1, #8 + str r1, [r0, #0xfc] +_020BF128: + ldr r0, _020BF138 ; =NNS_G3dGlb + 0x100 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF130: .word NNS_G3dGlb +_020BF134: .word NNS_G3dGlb + 0x4C +_020BF138: .word NNS_G3dGlb + 0x100 + arm_func_end NNS_G3dGlbGetInvV + + arm_func_start mtx_inverse44 +mtx_inverse44: ; 0x020BF13C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x48 + str r1, [sp] + add r1, sp, #8 + bl MI_Copy64B + ldr r0, [sp] + bl MTX_Identity44_ + mov fp, #0 +_020BF15C: + mov r3, fp + mov r1, fp + cmp fp, #4 + mov r2, #0 + bge _020BF19C + add r0, sp, #8 + add r0, r0, fp, lsl #2 +_020BF178: + ldr r4, [r0, r1, lsl #4] + cmp r4, #0 + rsblt r4, r4, #0 + cmp r4, r2 + movgt r3, r1 + add r1, r1, #1 + movgt r2, r4 + cmp r1, #4 + blt _020BF178 +_020BF19C: + cmp r2, #0 + addeq sp, sp, #0x48 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r3, fp + beq _020BF1FC + ldr r1, [sp] + add r2, sp, #8 + mov r0, #0 + add r4, r1, fp, lsl #4 + add r6, r2, fp, lsl #4 + add r5, r2, r3, lsl #4 + add r2, r1, r3, lsl #4 +_020BF1D0: + ldr r3, [r6, r0, lsl #2] + ldr r1, [r5, r0, lsl #2] + str r1, [r6, r0, lsl #2] + str r3, [r5, r0, lsl #2] + ldr r3, [r4, r0, lsl #2] + ldr r1, [r2, r0, lsl #2] + str r1, [r4, r0, lsl #2] + str r3, [r2, r0, lsl #2] + add r0, r0, #1 + cmp r0, #4 + blt _020BF1D0 +_020BF1FC: + add r0, sp, #8 + add r0, r0, fp, lsl #4 + ldr r0, [r0, fp, lsl #2] + bl FX_InvFx64c + ldr r2, [sp] + mov r3, #0 + mov lr, #0x80000000 + add r4, sp, #8 + add sb, r2, fp, lsl #4 + add r2, r4, fp, lsl #4 + mov r4, r3 + mov r6, r3 + mov r5, lr +_020BF230: + ldr r8, [r2, r3, lsl #2] + mov r7, r8, asr #0x1f + umull ip, sl, r0, r8 + adds ip, ip, lr + mla sl, r0, r7, sl + mla sl, r1, r8, sl + adc r7, sl, r4 + str r7, [r2, r3, lsl #2] + ldr r8, [sb, r3, lsl #2] + mov r7, r8, asr #0x1f + umull ip, sl, r0, r8 + adds ip, ip, r5 + mla sl, r0, r7, sl + mla sl, r1, r8, sl + adc r7, sl, r6 + str r7, [sb, r3, lsl #2] + add r3, r3, #1 + cmp r3, #4 + blt _020BF230 + ldr r0, [sp] + add r1, sp, #8 + add r6, r0, fp, lsl #4 + add r0, sp, #8 + add r1, r1, fp, lsl #2 + mov ip, #0 + add r0, r0, fp, lsl #4 + str r1, [sp, #4] +_020BF29C: + cmp ip, fp + beq _020BF320 + ldr r1, [sp, #4] + ldr r4, [sp] + ldr r3, [r1, ip, lsl #4] + add r1, sp, #8 + mov lr, #0 + mov r2, r3, asr #0x1f + add r1, r1, ip, lsl #4 + add sl, r4, ip, lsl #4 +_020BF2C4: + ldr r5, [r0, lr, lsl #2] + ldr sb, [r1, lr, lsl #2] + mov r4, r5, asr #0x1f + umull r8, r7, r3, r5 + mla r7, r3, r4, r7 + mla r7, r2, r5, r7 + mov r4, r8, lsr #0xc + orr r4, r4, r7, lsl #20 + sub r4, sb, r4 + str r4, [r1, lr, lsl #2] + ldr sb, [sl, lr, lsl #2] + ldr r5, [r6, lr, lsl #2] + mov r4, r5, asr #0x1f + umull r8, r7, r3, r5 + mla r7, r3, r4, r7 + mla r7, r2, r5, r7 + mov r4, r8, lsr #0xc + orr r4, r4, r7, lsl #20 + sub r4, sb, r4 + str r4, [sl, lr, lsl #2] + add lr, lr, #1 + cmp lr, #4 + blt _020BF2C4 +_020BF320: + add ip, ip, #1 + cmp ip, #4 + blt _020BF29C + add fp, fp, #1 + cmp fp, #4 + blt _020BF15C + mov r0, #0 + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end mtx_inverse44 + + arm_func_start NNS_G3dGlbGetInvP +NNS_G3dGlbGetInvP: ; 0x020BF344 + stmdb sp!, {r3, lr} + ldr r0, _020BF37C ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #0x10 + bne _020BF374 + ldr r0, _020BF380 ; =NNS_G3dGlb + 0x8 + ldr r1, _020BF384 ; =NNS_G3dGlb + 0x1C0 + bl mtx_inverse44 + ldr r0, _020BF37C ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + orr r1, r1, #0x10 + str r1, [r0, #0xfc] +_020BF374: + ldr r0, _020BF384 ; =NNS_G3dGlb + 0x1C0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF37C: .word NNS_G3dGlb +_020BF380: .word NNS_G3dGlb + 0x8 +_020BF384: .word NNS_G3dGlb + 0x1C0 + arm_func_end NNS_G3dGlbGetInvP + + arm_func_start calcSrtCameraMtx_ +calcSrtCameraMtx_: ; 0x020BF388 + stmdb sp!, {r3, lr} + ldr r0, _020BF3CC ; =NNS_G3dGlb + 0xBC + ldr r1, _020BF3D0 ; =NNS_G3dGlb + 0x4C + ldr r2, _020BF3D4 ; =NNS_G3dGlb + 0x130 + bl MTX_Concat43 + ldr r3, _020BF3D8 ; =NNS_G3dGlb + ldr r0, _020BF3D4 ; =NNS_G3dGlb + 0x130 + ldr r2, [r3, #0xf4] + mov r1, r0 + str r2, [sp] + ldr r2, [r3, #0xec] + ldr r3, [r3, #0xf0] + bl MTX_ScaleApply43 + ldr r0, _020BF3D4 ; =NNS_G3dGlb + 0x130 + ldr r1, _020BF3DC ; =NNS_G3dGlb + 0x160 + bl MTX_Inverse43 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF3CC: .word NNS_G3dGlb + 0xBC +_020BF3D0: .word NNS_G3dGlb + 0x4C +_020BF3D4: .word NNS_G3dGlb + 0x130 +_020BF3D8: .word NNS_G3dGlb +_020BF3DC: .word NNS_G3dGlb + 0x160 + arm_func_end calcSrtCameraMtx_ + + arm_func_start NNS_G3dGlbGetWV +NNS_G3dGlbGetWV: ; 0x020BF3E0 + stmdb sp!, {r3, lr} + ldr r0, _020BF410 ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #0x80 + bne _020BF408 + bl calcSrtCameraMtx_ + ldr r0, _020BF410 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + orr r1, r1, #0x80 + str r1, [r0, #0xfc] +_020BF408: + ldr r0, _020BF414 ; =NNS_G3dGlb + 0x130 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF410: .word NNS_G3dGlb +_020BF414: .word NNS_G3dGlb + 0x130 + arm_func_end NNS_G3dGlbGetWV + + arm_func_start NNS_G3dGlbGetInvWV +NNS_G3dGlbGetInvWV: ; 0x020BF418 + stmdb sp!, {r3, lr} + ldr r0, _020BF448 ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #0x80 + bne _020BF440 + bl calcSrtCameraMtx_ + ldr r0, _020BF448 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + orr r1, r1, #0x80 + str r1, [r0, #0xfc] +_020BF440: + ldr r0, _020BF44C ; =NNS_G3dGlb + 0x160 + ldmia sp!, {r3, pc} + .align 2, 0 +_020BF448: .word NNS_G3dGlb +_020BF44C: .word NNS_G3dGlb + 0x160 + arm_func_end NNS_G3dGlbGetInvWV + + arm_func_start NNS_G3dGlbGetInvVP +NNS_G3dGlbGetInvVP: ; 0x020BF450 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x40 + ldr r0, _020BF4B0 ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #0x40 + bne _020BF4A4 + bl NNS_G3dGlbGetInvV + mov r5, r0 + bl NNS_G3dGlbGetInvP + mov r4, r0 + add r1, sp, #0 + mov r0, r5 + bl MTX_Copy43To44_ + ldr r2, _020BF4B4 ; =NNS_G3dGlb + 0x200 + add r1, sp, #0 + mov r0, r4 + bl MTX_Concat44 + ldr r0, _020BF4B0 ; =NNS_G3dGlb + ldr r1, [r0, #0xfc] + orr r1, r1, #0x40 + str r1, [r0, #0xfc] +_020BF4A4: + ldr r0, _020BF4B4 ; =NNS_G3dGlb + 0x200 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BF4B0: .word NNS_G3dGlb +_020BF4B4: .word NNS_G3dGlb + 0x200 + arm_func_end NNS_G3dGlbGetInvVP + + arm_func_start NNS_G3dGlbGetViewPort +NNS_G3dGlbGetViewPort: ; 0x020BF4B8 + cmp r0, #0 + beq _020BF4D0 + ldr ip, _020BF528 ; =NNS_G3dGlb + ldr ip, [ip, #0xa0] + and ip, ip, #0xff + str ip, [r0] +_020BF4D0: + cmp r1, #0 + beq _020BF4EC + ldr r0, _020BF528 ; =NNS_G3dGlb + ldr r0, [r0, #0xa0] + mov r0, r0, lsr #8 + and r0, r0, #0xff + str r0, [r1] +_020BF4EC: + cmp r2, #0 + beq _020BF508 + ldr r0, _020BF528 ; =NNS_G3dGlb + ldr r0, [r0, #0xa0] + mov r0, r0, lsr #0x10 + and r0, r0, #0xff + str r0, [r2] +_020BF508: + cmp r3, #0 + bxeq lr + ldr r0, _020BF528 ; =NNS_G3dGlb + ldr r0, [r0, #0xa0] + mov r0, r0, lsr #0x18 + and r0, r0, #0xff + str r0, [r3] + bx lr + .align 2, 0 +_020BF528: .word NNS_G3dGlb + arm_func_end NNS_G3dGlbGetViewPort + + arm_func_start NNSi_G3dAnmBlendMat +NNSi_G3dAnmBlendMat: ; 0x020BF52C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + movs r5, r1 + mov r4, r2 + mov r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r7, #1 +_020BF548: + ldrb r1, [r5, #0x19] + cmp r4, r1 + bhs _020BF588 + add r1, r5, r4, lsl #1 + ldrh r2, [r1, #0x1a] + and r1, r2, #0x300 + cmp r1, #0x100 + bne _020BF588 + ldr r3, [r5, #0xc] + cmp r3, #0 + beq _020BF588 + mov r0, r6 + mov r1, r5 + and r2, r2, #0xff + blx r3 + mov r0, r7 +_020BF588: + ldr r5, [r5, #0x10] + cmp r5, #0 + bne _020BF548 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_G3dAnmBlendMat + + arm_func_start blendScaleVec_ +blendScaleVec_: ; 0x020BF598 + cmp r3, #0 + beq _020BF5C8 + ldr r1, [r0] + add r1, r1, r2 + str r1, [r0] + ldr r1, [r0, #4] + add r1, r1, r2 + str r1, [r0, #4] + ldr r1, [r0, #8] + add r1, r1, r2 + str r1, [r0, #8] + bx lr +_020BF5C8: + ldr r3, [r1] + ldr ip, [r0] + mul r3, r2, r3 + add r3, ip, r3, asr #12 + str r3, [r0] + ldr r3, [r1, #4] + ldr ip, [r0, #4] + mul r3, r2, r3 + add r3, ip, r3, asr #12 + str r3, [r0, #4] + ldr r1, [r1, #8] + ldr r3, [r0, #8] + mul r1, r2, r1 + add r1, r3, r1, asr #12 + str r1, [r0, #8] + bx lr + arm_func_end blendScaleVec_ + + arm_func_start NNSi_G3dAnmBlendJnt +NNSi_G3dAnmBlendJnt: ; 0x020BF608 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x70 + movs sb, r1 + mov sl, r0 + mov r8, r2 + addeq sp, sp, #0x70 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r2, [sb, #0x10] + cmp r2, #0 + bne _020BF694 + ldrb r2, [sb, #0x19] + cmp r8, r2 + bhs _020BF688 + add r2, sb, r8, lsl #1 + ldrh r4, [r2, #0x1a] + and r2, r4, #0x300 + cmp r2, #0x100 + bne _020BF67C + ldr r3, [sb, #0xc] + cmp r3, #0 + addeq sp, sp, #0x70 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + and r2, r4, #0xff + blx r3 + add sp, sp, #0x70 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BF67C: + add sp, sp, #0x70 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BF688: + add sp, sp, #0x70 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BF694: + mov r5, #0 + mov r3, r5 + mov r6, r5 + mov r2, sb +_020BF6A4: + ldrb r0, [r2, #0x19] + cmp r8, r0 + bhs _020BF6E4 + add r0, r2, r8, lsl #1 + ldrh r0, [r0, #0x1a] + and r0, r0, #0x300 + cmp r0, #0x100 + bne _020BF6E4 + ldr r0, [r2, #4] + cmp r0, #0x1000 + addgt r5, r5, #0x1000 + bgt _020BF6DC + cmp r0, #0 + addgt r5, r5, r0 +_020BF6DC: + mov r1, r2 + add r3, r3, #1 +_020BF6E4: + ldr r2, [r2, #0x10] + cmp r2, #0 + bne _020BF6A4 + cmp r5, #0 + addeq sp, sp, #0x70 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r3, #1 + bne _020BF73C + ldr r3, [r1, #0xc] + add r0, r1, r8, lsl #1 + cmp r3, #0 + ldrh r2, [r0, #0x1a] + addeq sp, sp, #0x70 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + and r2, r2, #0xff + blx r3 + add sp, sp, #0x70 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020BF73C: + mov r1, sl + mov r0, #0 + mov r2, #0x58 + bl MIi_CpuClearFast + mvn r0, #0 + str r0, [sl] + add fp, sp, #0x40 + add r4, sp, #0x18 +_020BF75C: + ldrb r0, [sb, #0x19] + cmp r8, r0 + bhs _020BF940 + add r0, sb, r8, lsl #1 + ldrh r1, [r0, #0x1a] + and r0, r1, #0x300 + cmp r0, #0x100 + bne _020BF940 + ldr r0, [sb, #4] + cmp r0, #0 + ble _020BF940 + ldr r3, [sb, #0xc] + cmp r3, #0 + beq _020BF940 + and r2, r1, #0xff + mov r0, r4 + mov r1, sb + blx r3 + cmp r6, #0 + bne _020BF7CC + mov r0, fp + add r1, sp, #0xc + mov r2, #0xc + bl MIi_CpuCopy32 + add r0, sp, #0x58 + add r1, sp, #0 + mov r2, #0xc + bl MIi_CpuCopy32 +_020BF7CC: + cmp r5, #0x1000 + ldreq r7, [sb, #4] + beq _020BF7E8 + ldr r0, [sb, #4] + mov r1, r5 + bl FX_Div + mov r7, r0 +_020BF7E8: + ldr r3, [sp, #0x18] + add r0, sl, #4 + add r1, sp, #0x1c + mov r2, r7 + and r3, r3, #1 + bl blendScaleVec_ + ldr r3, [sp, #0x18] + add r0, sl, #0x10 + add r1, sp, #0x28 + mov r2, r7 + and r3, r3, #8 + bl blendScaleVec_ + ldr r3, [sp, #0x18] + add r0, sl, #0x1c + add r1, sp, #0x34 + mov r2, r7 + and r3, r3, #0x10 + bl blendScaleVec_ + ldr r0, [sp, #0x18] + tst r0, #4 + bne _020BF890 + ldr r2, [sl, #0x4c] + ldr r0, [sp, #0x64] + smull r1, r0, r7, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + add r0, r2, r1 + str r0, [sl, #0x4c] + ldr r2, [sl, #0x50] + ldr r0, [sp, #0x68] + smull r1, r0, r7, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + add r0, r2, r1 + str r0, [sl, #0x50] + ldr r2, [sl, #0x54] + ldr r0, [sp, #0x6c] + smull r1, r0, r7, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + add r0, r2, r1 + str r0, [sl, #0x54] +_020BF890: + ldr r0, [sp, #0x18] + tst r0, #2 + bne _020BF918 + ldr r1, [sl, #0x28] + ldr r0, [sp, #0x40] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x28] + ldr r1, [sl, #0x2c] + ldr r0, [sp, #0x44] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x2c] + ldr r1, [sl, #0x30] + ldr r0, [sp, #0x48] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x30] + ldr r1, [sl, #0x34] + ldr r0, [sp, #0x4c] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x34] + ldr r1, [sl, #0x38] + ldr r0, [sp, #0x50] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x38] + ldr r1, [sl, #0x3c] + ldr r0, [sp, #0x54] + mul r0, r7, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x3c] + b _020BF930 +_020BF918: + ldr r0, [sl, #0x28] + add r0, r0, r7 + str r0, [sl, #0x28] + ldr r0, [sl, #0x38] + add r0, r0, r7 + str r0, [sl, #0x38] +_020BF930: + ldr r1, [sl] + ldr r0, [sp, #0x18] + and r0, r1, r0 + str r0, [sl] +_020BF940: + ldr sb, [sb, #0x10] + add r6, r6, #1 + cmp sb, #0 + bne _020BF75C + add r0, sl, #0x28 + add r1, sl, #0x34 + add r2, sl, #0x40 + bl VEC_CrossProduct + ldr r0, [sl, #0x28] + cmp r0, #0 + ldreq r0, [sl, #0x2c] + cmpeq r0, #0 + ldreq r0, [sl, #0x30] + cmpeq r0, #0 + bne _020BF990 + add r0, sp, #0xc + add r1, sl, #0x28 + mov r2, #0xc + bl MIi_CpuCopy32 + b _020BF99C +_020BF990: + add r0, sl, #0x28 + mov r1, r0 + bl VEC_Normalize +_020BF99C: + ldr r0, [sl, #0x40] + cmp r0, #0 + ldreq r0, [sl, #0x44] + cmpeq r0, #0 + ldreq r0, [sl, #0x48] + cmpeq r0, #0 + bne _020BF9CC + add r0, sp, #0 + add r1, sl, #0x40 + mov r2, #0xc + bl MIi_CpuCopy32 + b _020BF9D8 +_020BF9CC: + add r0, sl, #0x40 + mov r1, r0 + bl VEC_Normalize +_020BF9D8: + add r0, sl, #0x40 + add r1, sl, #0x28 + add r2, sl, #0x34 + bl VEC_CrossProduct + mov r0, #1 + add sp, sp, #0x70 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNSi_G3dAnmBlendJnt + + arm_func_start NNSi_G3dAnmBlendVis +NNSi_G3dAnmBlendVis: ; 0x020BF9F4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r7, r0 + mov r0, #0 + mov r6, r1 + mov r5, r2 + str r0, [r7] + add r4, sp, #0 + mov r8, #1 +_020BFA18: + ldrb r1, [r6, #0x19] + cmp r5, r1 + bhs _020BFA68 + add r1, r6, r5, lsl #1 + ldrh r2, [r1, #0x1a] + and r1, r2, #0x300 + cmp r1, #0x100 + bne _020BFA68 + ldr r3, [r6, #0xc] + cmp r3, #0 + beq _020BFA68 + mov r0, r4 + mov r1, r6 + and r2, r2, #0xff + blx r3 + ldr r2, [r7] + ldr r1, [sp] + mov r0, r8 + orr r1, r2, r1 + str r1, [r7] +_020BFA68: + ldr r6, [r6, #0x10] + cmp r6, #0 + bne _020BFA18 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G3dAnmBlendVis + + arm_func_start G3dDrawInternal_Loop_ +G3dDrawInternal_Loop_: ; 0x020BFA7C + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _020BFAC0 ; =_02110B9C + mov r4, r0 +_020BFA88: + ldr r1, [r4, #8] + mov r0, r4 + bic r1, r1, #0x40 + str r1, [r4, #8] + ldr r1, [r4] + ldrb r3, [r1] + and r1, r3, #0x1f + ldr r2, [r5, r1, lsl #2] + and r1, r3, #0xe0 + blx r2 + ldr r0, [r4, #8] + tst r0, #0x20 + beq _020BFA88 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BFAC0: .word _02110B9C + arm_func_end G3dDrawInternal_Loop_ + + arm_func_start G3dDrawInternal_ +G3dDrawInternal_: ; 0x020BFAC4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r1, r5 + mov r0, #0 + mov r2, #0x188 + bl MIi_CpuClearFast + mov r0, #1 + str r0, [r5, #0xc4] + str r0, [r5, #8] + ldr r0, [r4, #0x30] + ldr r2, _020BFC54 ; =_02110A80 + cmp r0, #0 + ldreq r1, [r4, #4] + ldreq r0, [r1, #4] + addeq r0, r1, r0 + str r0, [r5] + str r4, [r5, #4] + ldr r0, [r4, #4] + cmp r0, #0 + addne r0, r0, #0x40 + moveq r0, #0 + str r0, [r5, #0xd4] + ldr r1, [r4, #4] + cmp r1, #0 + ldrne r0, [r1, #8] + cmpne r0, #0 + addne r0, r1, r0 + moveq r0, #0 + str r0, [r5, #0xd8] + ldr r1, [r4, #4] + cmp r1, #0 + ldrne r0, [r1, #0xc] + cmpne r0, #0 + addne r0, r1, r0 + moveq r0, #0 + str r0, [r5, #0xdc] + ldr r0, [r4, #4] + ldr r1, _020BFC58 ; =_02110A74 + ldrb r3, [r0, #0x15] + ldr r0, _020BFC5C ; =_02110A8C + ldr r2, [r2, r3, lsl #2] + str r2, [r5, #0xe8] + ldr r2, [r4, #4] + ldrb r2, [r2, #0x15] + ldr r1, [r1, r2, lsl #2] + str r1, [r5, #0xec] + ldr r1, [r4, #4] + ldrb r1, [r1, #0x16] + ldr r0, [r0, r1, lsl #2] + str r0, [r5, #0xf0] + ldr r0, [r4, #4] + ldr r0, [r0, #0x1c] + str r0, [r5, #0xe0] + ldr r0, [r4, #4] + ldr r0, [r0, #0x20] + str r0, [r5, #0xe4] + ldr r1, [r4, #0x20] + cmp r1, #0 + beq _020BFBD8 + ldrb r0, [r4, #0x24] + cmp r0, #0x20 + bhs _020BFBD8 + add r0, r5, r0, lsl #2 + str r1, [r0, #0xc] + ldrb r0, [r4, #0x24] + ldrb r1, [r4, #0x25] + add r0, r5, r0 + strb r1, [r0, #0x8c] +_020BFBD8: + ldr r0, [r4] + tst r0, #1 + ldrne r0, [r5, #8] + orrne r0, r0, #0x80 + strne r0, [r5, #8] + ldr r0, [r4] + tst r0, #2 + ldrne r0, [r5, #8] + orrne r0, r0, #0x100 + strne r0, [r5, #8] + ldr r0, [r4] + tst r0, #4 + ldrne r0, [r5, #8] + orrne r0, r0, #0x200 + strne r0, [r5, #8] + ldr r0, [r4] + tst r0, #8 + ldrne r0, [r5, #8] + orrne r0, r0, #0x400 + strne r0, [r5, #8] + ldr r1, [r4, #0x28] + cmp r1, #0 + beq _020BFC3C + mov r0, r5 + blx r1 +_020BFC3C: + mov r0, r5 + bl G3dDrawInternal_Loop_ + ldr r0, [r4] + bic r0, r0, #1 + str r0, [r4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020BFC54: .word _02110A80 +_020BFC58: .word _02110A74 +_020BFC5C: .word _02110A8C + arm_func_end G3dDrawInternal_ + + arm_func_start updateHintVec___g3d +updateHintVec___g3d: ; 0x020BFC60 + stmdb sp!, {r3, r4, r5, lr} + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r3, #1 + mov r4, #0 +_020BFC74: + ldrb r2, [r1, #0x19] + mov r5, r4 + cmp r2, #0 + ble _020BFCB8 +_020BFC84: + add r2, r1, r5, lsl #1 + ldrh r2, [r2, #0x1a] + tst r2, #0x100 + beq _020BFCA8 + mov lr, r5, asr #5 + ldr ip, [r0, lr, lsl #2] + and r2, r5, #0x1f + orr r2, ip, r3, lsl r2 + str r2, [r0, lr, lsl #2] +_020BFCA8: + ldrb r2, [r1, #0x19] + add r5, r5, #1 + cmp r5, r2 + blt _020BFC84 +_020BFCB8: + ldr r1, [r1, #0x10] + cmp r1, #0 + bne _020BFC74 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end updateHintVec___g3d + + arm_func_start NNS_G3dDraw +NNS_G3dDraw: ; 0x020BFCC8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x188 + mov r4, r0 + ldr r0, [r4] + and r0, r0, #0x10 + cmp r0, #0x10 + bne _020BFD5C + add r1, r4, #0x3c + mov r0, #0 + mov r2, #8 + bl MIi_CpuClear32 + add r1, r4, #0x44 + mov r0, #0 + mov r2, #8 + bl MIi_CpuClear32 + add r1, r4, #0x4c + mov r0, #0 + mov r2, #8 + bl MIi_CpuClear32 + ldr r1, [r4, #8] + cmp r1, #0 + beq _020BFD28 + add r0, r4, #0x3c + bl updateHintVec___g3d +_020BFD28: + ldr r1, [r4, #0x10] + cmp r1, #0 + beq _020BFD3C + add r0, r4, #0x44 + bl updateHintVec___g3d +_020BFD3C: + ldr r1, [r4, #0x18] + cmp r1, #0 + beq _020BFD50 + add r0, r4, #0x4c + bl updateHintVec___g3d +_020BFD50: + ldr r0, [r4] + bic r0, r0, #0x10 + str r0, [r4] +_020BFD5C: + ldr r2, _020BFDA0 ; =_021DA700 + ldr r0, [r2] + cmp r0, #0 + beq _020BFD7C + mov r1, r4 + bl G3dDrawInternal_ + add sp, sp, #0x188 + ldmia sp!, {r4, pc} +_020BFD7C: + add r0, sp, #0 + mov r1, r4 + str r0, [r2] + bl G3dDrawInternal_ + ldr r0, _020BFDA0 ; =_021DA700 + mov r1, #0 + str r1, [r0] + add sp, sp, #0x188 + ldmia sp!, {r4, pc} + .align 2, 0 +_020BFDA0: .word _021DA700 + arm_func_end NNS_G3dDraw + + arm_func_start NNSi_G3dFuncSbc_NOP +NNSi_G3dFuncSbc_NOP: ; 0x020BFDA4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0xc] + cmp r1, #0 + beq _020BFDBC + blx r1 +_020BFDBC: + ldr r0, [r4] + add r0, r0, #1 + str r0, [r4] + ldmia sp!, {r4, pc} + arm_func_end NNSi_G3dFuncSbc_NOP + + arm_func_start NNSi_G3dFuncSbc_RET +NNSi_G3dFuncSbc_RET: ; 0x020BFDCC + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x10] + cmp r1, #0 + beq _020BFDE4 + blx r1 +_020BFDE4: + ldr r0, [r4, #8] + orr r0, r0, #0x20 + str r0, [r4, #8] + ldmia sp!, {r4, pc} + arm_func_end NNSi_G3dFuncSbc_RET + + arm_func_start NNSi_G3dFuncSbc_NODE +NNSi_G3dFuncSbc_NODE: ; 0x020BFDF4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r0, [r6, #8] + tst r0, #0x200 + bne _020BFF60 + ldr r1, [r6] + add r0, r6, #0x184 + ldrb r4, [r1, #1] + strb r4, [r6, #0xac] + ldr r1, [r6, #8] + orr r1, r1, #4 + str r1, [r6, #8] + str r0, [r6, #0xb8] + ldr r0, [r6, #0x14] + cmp r0, #0 + ldrneb r5, [r6, #0x8e] + moveq r5, #0 + cmp r5, #1 + bne _020BFE74 + ldr r1, [r6, #8] + mov r0, r6 + bic r1, r1, #0x40 + str r1, [r6, #8] + ldr r1, [r6, #0x14] + blx r1 + ldr r0, [r6, #0x14] + cmp r0, #0 + ldrneb r5, [r6, #0x8e] + ldr r0, [r6, #8] + moveq r5, #0 + and r0, r0, #0x40 + b _020BFE78 +_020BFE74: + mov r0, #0 +_020BFE78: + cmp r0, #0 + bne _020BFED8 + ldr ip, [r6, #4] + ldr r1, [ip, #0x18] + cmp r1, #0 + beq _020BFEC4 + mov r0, r4, lsr #5 + add r0, ip, r0, lsl #2 + ldr r0, [r0, #0x4c] + and r2, r4, #0x1f + mov r3, #1 + tst r0, r3, lsl r2 + beq _020BFEC4 + ldr r0, [r6, #0xb8] + ldr r3, [ip, #0x1c] + mov r2, r4 + blx r3 + cmp r0, #0 + bne _020BFED8 +_020BFEC4: + ldr r1, [r6] + ldr r0, [r6, #0xb8] + ldrb r1, [r1, #2] + and r1, r1, #1 + str r1, [r0] +_020BFED8: + cmp r5, #2 + bne _020BFF14 + ldr r1, [r6, #8] + mov r0, r6 + bic r1, r1, #0x40 + str r1, [r6, #8] + ldr r1, [r6, #0x14] + blx r1 + ldr r0, [r6, #0x14] + cmp r0, #0 + ldrneb r5, [r6, #0x8e] + ldr r0, [r6, #8] + moveq r5, #0 + and r0, r0, #0x40 + b _020BFF18 +_020BFF14: + mov r0, #0 +_020BFF18: + cmp r0, #0 + bne _020BFF40 + ldr r0, [r6, #0xb8] + ldr r0, [r0] + cmp r0, #0 + ldr r0, [r6, #8] + orrne r0, r0, #1 + strne r0, [r6, #8] + biceq r0, r0, #1 + streq r0, [r6, #8] +_020BFF40: + cmp r5, #3 + bne _020BFF60 + ldr r1, [r6, #8] + mov r0, r6 + bic r1, r1, #0x40 + str r1, [r6, #8] + ldr r1, [r6, #0x14] + blx r1 +_020BFF60: + ldr r0, [r6] + add r0, r0, #3 + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_G3dFuncSbc_NODE + + arm_func_start NNSi_G3dFuncSbc_MTX +NNSi_G3dFuncSbc_MTX: ; 0x020BFF70 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r0, [r4, #8] + tst r0, #0x200 + bne _020C002C + tst r0, #1 + beq _020C002C + ldr r0, [r4, #0x18] + cmp r0, #0 + ldrneb r5, [r4, #0x8f] + moveq r5, #0 + cmp r5, #1 + bne _020BFFD8 + ldr r1, [r4, #8] + mov r0, r4 + bic r1, r1, #0x40 + str r1, [r4, #8] + ldr r1, [r4, #0x18] + blx r1 + ldr r0, [r4, #0x18] + cmp r0, #0 + ldrneb r5, [r4, #0x8f] + ldr r0, [r4, #8] + moveq r5, #0 + and r0, r0, #0x40 + b _020BFFDC +_020BFFD8: + mov r0, #0 +_020BFFDC: + cmp r0, #0 + bne _020C000C + ldr r0, [r4] + ldrb r0, [r0, #1] + str r0, [sp] + ldr r0, [r4, #8] + tst r0, #0x100 + bne _020C000C + add r1, sp, #0 + mov r0, #0x14 + mov r2, #1 + bl NNS_G3dGeBufferOP_N +_020C000C: + cmp r5, #3 + bne _020C002C + ldr r1, [r4, #8] + mov r0, r4 + bic r1, r1, #0x40 + str r1, [r4, #8] + ldr r1, [r4, #0x18] + blx r1 +_020C002C: + ldr r0, [r4] + add r0, r0, #2 + str r0, [r4] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_G3dFuncSbc_MTX + + arm_func_start NNSi_G3dFuncSbc_MAT_InternalDefault +NNSi_G3dFuncSbc_MAT_InternalDefault: ; 0x020C003C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x1c + mov r7, r0 + mov r5, r3 + strb r5, [r7, #0xad] + ldr r3, [r7, #8] + add r0, r7, #0xf4 + orr r3, r3, #8 + str r3, [r7, #8] + str r0, [r7, #0xb0] + ldr r0, [r7, #0x1c] + mov r8, r1 + cmp r0, #0 + ldrneb r4, [r7, #0x90] + mov r6, r2 + moveq r4, #0 + cmp r4, #1 + bne _020C00B8 + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x1c] + blx r1 + ldr r0, [r7, #0x1c] + cmp r0, #0 + ldrneb r4, [r7, #0x90] + ldr r0, [r7, #8] + moveq r4, #0 + and r0, r0, #0x40 + b _020C00BC +_020C00B8: + mov r0, #0 +_020C00BC: + cmp r0, #0 + bne _020C039C + ldr r0, [r7, #4] + ldr r0, [r0, #0x38] + cmp r0, #0 + beq _020C00E8 + ldr r1, [r7, #8] + tst r1, #0x80 + moveq r1, #0x38 + mlaeq r8, r5, r1, r0 + beq _020C0398 +_020C00E8: + cmp r8, #0x20 + cmpne r8, #0x40 + bne _020C0130 + mov r1, r5, lsr #5 + add r1, r7, r1, lsl #2 + ldr r1, [r1, #0xbc] + and r2, r5, #0x1f + mov r3, #1 + tst r1, r3, lsl r2 + beq _020C0130 + cmp r0, #0 + movne r1, #0x38 + mlane r8, r5, r1, r0 + bne _020C0398 + ldr r1, _020C04B0 ; =_021DA704 + mov r0, #0x38 + mla r8, r5, r0, r1 + b _020C0398 +_020C0130: + cmp r0, #0 + beq _020C0168 + add r8, r7, #0xbc + mov r3, r5, lsr #5 + ldr r2, [r8, r3, lsl #2] + and r0, r5, #0x1f + mov r1, #1 + orr r0, r2, r1, lsl r0 + str r0, [r8, r3, lsl #2] + ldr r1, [r7, #4] + mov r0, #0x38 + ldr r1, [r1, #0x38] + mla r8, r5, r0, r1 + b _020C019C +_020C0168: + cmp r8, #0x40 + addne r8, r7, #0xf4 + bne _020C019C + add lr, r7, #0xbc + mov ip, r5, lsr #5 + ldr r1, _020C04B0 ; =_021DA704 + ldr r8, [lr, ip, lsl #2] + mov r0, #0x38 + and r2, r5, #0x1f + mov r3, #1 + orr r2, r8, r3, lsl r2 + mla r8, r5, r0, r1 + str r2, [lr, ip, lsl #2] +_020C019C: + mov r0, #0 + str r0, [r8] + ldr r3, [r7, #0xd8] + cmp r3, #0 + beq _020C01F0 + adds r2, r3, #4 + beq _020C01DC + ldrb r0, [r3, #5] + cmp r5, r0 + bhs _020C01DC + ldrh r1, [r3, #0xa] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r5, r1 + b _020C01E0 +_020C01DC: + mov r1, #0 +_020C01E0: + cmp r1, #0 + ldrne r0, [r1] + addne r0, r3, r0 + bne _020C01F4 +_020C01F0: + mov r0, #0 +_020C01F4: + ldrh r0, [r0, #0x1e] + ldr r1, _020C04B4 ; =NNS_G3dGlb + tst r0, #0x20 + ldrne r0, [r8] + orrne r0, r0, #0x20 + strne r0, [r8] + ldrh r2, [r6, #0x1e] + ldr r0, _020C04B8 ; =_02109474 + ldr ip, [r1, #0x94] + mov r2, r2, asr #6 + and r2, r2, #7 + ldr lr, [r0, r2, lsl #2] + ldr r2, [r6, #4] + mvn r3, lr + and r3, ip, r3 + and r2, r2, lr + orr r2, r3, r2 + str r2, [r8, #4] + ldrh ip, [r6, #0x1e] + ldr r3, [r1, #0x98] + ldr r2, [r6, #8] + mov ip, ip, asr #9 + and ip, ip, #7 + ldr ip, [r0, ip, lsl #2] + mvn r0, ip + and r3, r3, r0 + and r0, r2, ip + orr r0, r3, r0 + str r0, [r8, #8] + ldr r3, [r6, #0x10] + ldr r0, [r6, #0xc] + ldr r2, [r1, #0x9c] + mvn r1, r3 + and r1, r2, r1 + and r0, r0, r3 + orr r0, r1, r0 + str r0, [r8, #0xc] + ldr r0, [r6, #0x14] + str r0, [r8, #0x10] + ldrh r0, [r6, #0x1c] + str r0, [r8, #0x14] + ldrh r0, [r6, #0x1e] + tst r0, #1 + beq _020C0330 + tst r0, #2 + ldrne r1, [r8] + add r0, r6, #0x2c + orrne r1, r1, #1 + strne r1, [r8] + bne _020C02D0 + ldr r1, [r0] + str r1, [r8, #0x18] + ldr r1, [r0, #4] + add r0, r0, #8 + str r1, [r8, #0x1c] +_020C02D0: + ldrh r1, [r6, #0x1e] + tst r1, #4 + ldrne r1, [r8] + orrne r1, r1, #2 + strne r1, [r8] + bne _020C02FC + ldrsh r1, [r0] + strh r1, [r8, #0x20] + ldrsh r1, [r0, #2] + add r0, r0, #4 + strh r1, [r8, #0x22] +_020C02FC: + ldrh r1, [r6, #0x1e] + tst r1, #8 + ldrne r0, [r8] + orrne r0, r0, #4 + strne r0, [r8] + bne _020C0324 + ldr r1, [r0] + str r1, [r8, #0x24] + ldr r0, [r0, #4] + str r0, [r8, #0x28] +_020C0324: + ldr r0, [r8] + orr r0, r0, #8 + str r0, [r8] +_020C0330: + ldr ip, [r7, #4] + ldr r1, [ip, #8] + cmp r1, #0 + beq _020C036C + mov r0, r5, lsr #5 + add r0, ip, r0, lsl #2 + ldr r0, [r0, #0x3c] + and r2, r5, #0x1f + mov r3, #1 + tst r0, r3, lsl r2 + beq _020C036C + ldr r3, [ip, #0xc] + mov r0, r8 + mov r2, r5 + blx r3 +_020C036C: + ldr r0, [r8] + tst r0, #0x18 + beq _020C0398 + ldrh r0, [r6, #0x20] + strh r0, [r8, #0x2c] + ldrh r0, [r6, #0x22] + strh r0, [r8, #0x2e] + ldr r0, [r6, #0x24] + str r0, [r8, #0x30] + ldr r0, [r6, #0x28] + str r0, [r8, #0x34] +_020C0398: + str r8, [r7, #0xb0] +_020C039C: + cmp r4, #2 + bne _020C03D8 + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x1c] + blx r1 + ldr r0, [r7, #0x1c] + cmp r0, #0 + ldrneb r4, [r7, #0x90] + ldr r0, [r7, #8] + moveq r4, #0 + and r0, r0, #0x40 + b _020C03DC +_020C03D8: + mov r0, #0 +_020C03DC: + cmp r0, #0 + bne _020C0484 + ldr r5, [r7, #0xb0] + ldr r1, [r5, #0xc] + tst r1, #0x1f0000 + beq _020C0478 + ldr r0, [r5] + tst r0, #0x20 + bicne r0, r1, #0x1f0000 + strne r0, [r5, #0xc] + ldr r0, [r7, #8] + bic r0, r0, #2 + str r0, [r7, #8] + tst r0, #0x100 + bne _020C0484 + ldr r0, _020C04BC ; =0x00293130 + ldr r3, _020C04C0 ; =0x00002B2A + str r0, [sp] + ldr r2, [r5, #4] + add r1, sp, #4 + str r2, [sp, #4] + ldr r6, [r5, #8] + mov r2, #6 + str r6, [sp, #8] + ldr r6, [r5, #0xc] + str r6, [sp, #0xc] + str r3, [sp, #0x10] + ldr r3, [r5, #0x10] + str r3, [sp, #0x14] + ldr r3, [r5, #0x14] + str r3, [sp, #0x18] + bl NNS_G3dGeBufferOP_N + ldr r0, [r5] + tst r0, #0x18 + beq _020C0484 + ldr r1, [r7, #0xf0] + mov r0, r5 + blx r1 + b _020C0484 +_020C0478: + ldr r0, [r7, #8] + orr r0, r0, #2 + str r0, [r7, #8] +_020C0484: + cmp r4, #3 + addne sp, sp, #0x1c + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x1c] + blx r1 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C04B0: .word _021DA704 +_020C04B4: .word NNS_G3dGlb +_020C04B8: .word _02109474 +_020C04BC: .word 0x00293130 +_020C04C0: .word 0x00002B2A + arm_func_end NNSi_G3dFuncSbc_MAT_InternalDefault + + arm_func_start NNSi_G3dFuncSbc_MAT +NNSi_G3dFuncSbc_MAT: ; 0x020C04C4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, [r4, #8] + tst r2, #0x200 + bne _020C0560 + ldr r0, [r4] + tst r2, #1 + ldrb r3, [r0, #1] + bne _020C04FC + tst r2, #8 + beq _020C04FC + ldrb r0, [r4, #0xad] + cmp r3, r0 + beq _020C0560 +_020C04FC: + ldr lr, [r4, #0xd8] + cmp lr, #0 + beq _020C0548 + adds ip, lr, #4 + beq _020C0534 + ldrb r0, [lr, #5] + cmp r3, r0 + bhs _020C0534 + ldrh r2, [lr, #0xa] + ldrh r0, [ip, r2] + add r2, ip, r2 + add r2, r2, #4 + mla r2, r0, r3, r2 + b _020C0538 +_020C0534: + mov r2, #0 +_020C0538: + cmp r2, #0 + ldrne r0, [r2] + addne r2, lr, r0 + bne _020C054C +_020C0548: + mov r2, #0 +_020C054C: + ldrh lr, [r2] + ldr ip, _020C0570 ; =_02110AAC + mov r0, r4 + ldr ip, [ip, lr, lsl #2] + blx ip +_020C0560: + ldr r0, [r4] + add r0, r0, #2 + str r0, [r4] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C0570: .word _02110AAC + arm_func_end NNSi_G3dFuncSbc_MAT + + arm_func_start NNSi_G3dFuncSbc_SHP_InternalDefault +NNSi_G3dFuncSbc_SHP_InternalDefault: ; 0x020C0574 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + ldr r0, [r5, #0x20] + mov r4, r2 + cmp r0, #0 + ldrneb r6, [r5, #0x91] + moveq r6, #0 + cmp r6, #1 + bne _020C05CC + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x20] + blx r1 + ldr r0, [r5, #0x20] + cmp r0, #0 + ldrneb r6, [r5, #0x91] + ldr r0, [r5, #8] + moveq r6, #0 + and r0, r0, #0x40 + b _020C05D0 +_020C05CC: + mov r0, #0 +_020C05D0: + cmp r0, #0 + bne _020C05F4 + ldr r0, [r5, #8] + tst r0, #0x100 + bne _020C05F4 + ldr r0, [r4, #8] + ldr r1, [r4, #0xc] + add r0, r4, r0 + bl NNS_G3dGeSendDL +_020C05F4: + cmp r6, #2 + bne _020C0624 + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x20] + blx r1 + ldr r0, [r5, #0x20] + cmp r0, #0 + ldrneb r6, [r5, #0x91] + moveq r6, #0 +_020C0624: + cmp r6, #3 + ldmneia sp!, {r4, r5, r6, pc} + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x20] + blx r1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_G3dFuncSbc_SHP_InternalDefault + + arm_func_start NNSi_G3dFuncSbc_SHP +NNSi_G3dFuncSbc_SHP: ; 0x020C0648 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + tst r0, #0x200 + bne _020C06D4 + tst r0, #1 + beq _020C06D4 + tst r0, #2 + bne _020C06D4 + ldr r0, [r4] + ldr ip, [r4, #0xdc] + ldrb r3, [r0, #1] + cmp ip, #0 + beq _020C06BC + beq _020C06A8 + ldrb r0, [ip, #1] + cmp r3, r0 + bhs _020C06A8 + ldrh r2, [ip, #6] + ldrh r0, [ip, r2] + add r2, ip, r2 + add r2, r2, #4 + mla r2, r0, r3, r2 + b _020C06AC +_020C06A8: + mov r2, #0 +_020C06AC: + cmp r2, #0 + ldrne r0, [r2] + addne r2, ip, r0 + bne _020C06C0 +_020C06BC: + mov r2, #0 +_020C06C0: + ldrh lr, [r2] + ldr ip, _020C06E4 ; =_02110ABC + mov r0, r4 + ldr ip, [ip, lr, lsl #2] + blx ip +_020C06D4: + ldr r0, [r4] + add r0, r0, #2 + str r0, [r4] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C06E4: .word _02110ABC + arm_func_end NNSi_G3dFuncSbc_SHP + + arm_func_start NNSi_G3dFuncSbc_NODEDESC +NNSi_G3dFuncSbc_NODEDESC: ; 0x020C06E8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov sl, r0 + ldr r0, [sl] + mov sb, r1 + ldrb r6, [r0, #1] + mov r4, #4 + strb r6, [sl, #0xae] + ldr r0, [sl, #8] + orr r0, r0, #0x10 + str r0, [sl, #8] + tst r0, #0x400 + beq _020C0770 + cmp sb, #0x40 + cmpne sb, #0x60 + addeq r4, r4, #1 + cmp sb, #0x20 + cmpne sb, #0x60 + bne _020C075C + tst r0, #0x100 + add r4, r4, #1 + bne _020C075C + ldr r0, [sl] + add r1, sp, #0x10 + ldrb r3, [r0, #4] + mov r0, #0x14 + mov r2, #1 + str r3, [sp, #0x10] + bl NNS_G3dGeBufferOP_N +_020C075C: + ldr r0, [sl] + add sp, sp, #0x14 + add r0, r0, r4 + str r0, [sl] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C0770: + cmp sb, #0x40 + cmpne sb, #0x60 + bne _020C07B4 + ldr r0, [sl] + cmp sb, #0x40 + ldreqb r0, [r0, #4] + add r4, r4, #1 + streq r0, [sp, #0xc] + ldrneb r0, [r0, #5] + strne r0, [sp, #0xc] + ldr r0, [sl, #8] + tst r0, #0x100 + bne _020C07B4 + add r1, sp, #0xc + mov r0, #0x14 + mov r2, #1 + bl NNS_G3dGeBufferOP_N +_020C07B4: + add r0, sl, #0x12c + str r0, [sl, #0xb4] + ldr r0, [sl, #0x24] + cmp r0, #0 + ldrneb r8, [sl, #0x92] + moveq r8, #0 + cmp r8, #1 + bne _020C0808 + ldr r1, [sl, #8] + mov r0, sl + bic r1, r1, #0x40 + str r1, [sl, #8] + ldr r1, [sl, #0x24] + blx r1 + ldr r0, [sl, #0x24] + cmp r0, #0 + ldrneb r8, [sl, #0x92] + ldr r0, [sl, #8] + moveq r8, #0 + and r0, r0, #0x40 + b _020C080C +_020C0808: + mov r0, #0 +_020C080C: + cmp r0, #0 + bne _020C0A54 + ldr r0, [sl, #4] + ldr r1, [r0, #0x34] + cmp r1, #0 + beq _020C0840 + mov r0, #0x58 + mla r5, r6, r0, r1 + ldr r0, [sl, #8] + tst r0, #0x80 + moveq r0, #1 + movne r0, #0 + b _020C0848 +_020C0840: + add r5, sl, #0x12c + mov r0, #0 +_020C0848: + cmp r0, #0 + bne _020C0A50 + mov r0, #0 + str r0, [r5] + ldr r0, [sl, #4] + ldr r1, [r0, #0x10] + cmp r1, #0 + beq _020C0880 + ldr r3, [r0, #0x14] + mov r0, r5 + mov r2, r6 + blx r3 + cmp r0, #0 + bne _020C0A50 +_020C0880: + ldr r2, [sl, #0xd4] + cmp r2, #0 + beq _020C08C8 + beq _020C08B4 + ldrb r0, [r2, #1] + cmp r6, r0 + bhs _020C08B4 + ldrh r1, [r2, #6] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r6, r1 + b _020C08B8 +_020C08B4: + mov r1, #0 +_020C08B8: + cmp r1, #0 + ldrne r0, [r1] + addne r7, r2, r0 + bne _020C08CC +_020C08C8: + mov r7, #0 +_020C08CC: + ldrh r0, [r7] + add r6, r7, #4 + tst r0, #1 + beq _020C08EC + ldr r0, [r5] + orr r0, r0, #4 + str r0, [r5] + b _020C0908 +_020C08EC: + ldr r0, [r6] + str r0, [r5, #0x4c] + ldr r0, [r6, #4] + str r0, [r5, #0x50] + ldr r0, [r6, #8] + add r6, r6, #0xc + str r0, [r5, #0x54] +_020C0908: + ldrh r0, [r7] + tst r0, #2 + beq _020C0924 + ldr r0, [r5] + orr r0, r0, #2 + str r0, [r5] + b _020C0A38 +_020C0924: + tst r0, #8 + beq _020C09EC + and r1, r0, #0xf0 + mov fp, r1, asr #4 + ldrsh r1, [r6] + add r0, r5, #0x28 + str r1, [sp] + ldrsh r1, [r6, #2] + str r1, [sp, #4] + bl MI_Zero36B + ldrh r0, [r7] + ldr r2, _020C0B38 ; =_02109494 + ldr r1, _020C0B3C ; =_02109494 + 1 + tst r0, #0x100 + mov r0, #0x1000 + ldrb r2, [r2, fp, lsl #2] + ldrb r1, [r1, fp, lsl #2] + rsbne r0, r0, #0 + add r3, r5, fp, lsl #2 + str r0, [r3, #0x28] + ldr r0, [sp] + add r2, r5, r2, lsl #2 + str r0, [r2, #0x28] + ldr r0, [sp, #4] + add r1, r5, r1, lsl #2 + str r0, [r1, #0x28] + ldrh r0, [r7] + tst r0, #0x200 + beq _020C09A4 + ldr r0, [sp, #4] + rsb r0, r0, #0 + str r0, [sp, #4] +_020C09A4: + ldr r0, _020C0B40 ; =_02109494 + 2 + ldrb r0, [r0, fp, lsl #2] + add r1, r5, r0, lsl #2 + ldr r0, [sp, #4] + str r0, [r1, #0x28] + ldrh r0, [r7] + tst r0, #0x400 + beq _020C09D0 + ldr r0, [sp] + rsb r0, r0, #0 + str r0, [sp] +_020C09D0: + ldr r0, _020C0B44 ; =_02109494 + 3 + add r6, r6, #4 + ldrb r0, [r0, fp, lsl #2] + add r1, r5, r0, lsl #2 + ldr r0, [sp] + str r0, [r1, #0x28] + b _020C0A38 +_020C09EC: + ldrsh r0, [r7, #2] + str r0, [r5, #0x28] + ldrsh r0, [r6] + str r0, [r5, #0x2c] + ldrsh r0, [r6, #2] + str r0, [r5, #0x30] + ldrsh r0, [r6, #4] + str r0, [r5, #0x34] + ldrsh r0, [r6, #6] + str r0, [r5, #0x38] + ldrsh r0, [r6, #8] + str r0, [r5, #0x3c] + ldrsh r0, [r6, #0xa] + str r0, [r5, #0x40] + ldrsh r0, [r6, #0xc] + str r0, [r5, #0x44] + ldrsh r0, [r6, #0xe] + add r6, r6, #0x10 + str r0, [r5, #0x48] +_020C0A38: + ldrh r3, [r7] + ldr r2, [sl] + ldr r7, [sl, #0xe8] + mov r0, r5 + mov r1, r6 + blx r7 +_020C0A50: + str r5, [sl, #0xb4] +_020C0A54: + cmp r8, #2 + bne _020C0A90 + ldr r1, [sl, #8] + mov r0, sl + bic r1, r1, #0x40 + str r1, [sl, #8] + ldr r1, [sl, #0x24] + blx r1 + ldr r0, [sl, #0x24] + cmp r0, #0 + ldrneb r8, [sl, #0x92] + ldr r0, [sl, #8] + moveq r8, #0 + and r0, r0, #0x40 + b _020C0A94 +_020C0A90: + mov r0, #0 +_020C0A94: + cmp r0, #0 + bne _020C0AB4 + ldr r0, [sl, #8] + tst r0, #0x100 + bne _020C0AB4 + ldr r0, [sl, #0xb4] + ldr r1, [sl, #0xec] + blx r1 +_020C0AB4: + mov r0, #0 + str r0, [sl, #0xb4] + cmp r8, #3 + bne _020C0AE4 + ldr r1, [sl, #8] + mov r0, sl + bic r1, r1, #0x40 + str r1, [sl, #8] + ldr r1, [sl, #0x24] + blx r1 + ldr r0, [sl, #8] + and r0, r0, #0x40 +_020C0AE4: + cmp sb, #0x20 + cmpne sb, #0x60 + bne _020C0B24 + cmp r0, #0 + add r4, r4, #1 + bne _020C0B24 + ldr r0, [sl, #8] + tst r0, #0x100 + bne _020C0B24 + ldr r0, [sl] + add r1, sp, #8 + ldrb r3, [r0, #4] + mov r0, #0x13 + mov r2, #1 + str r3, [sp, #8] + bl NNS_G3dGeBufferOP_N +_020C0B24: + ldr r0, [sl] + add r0, r0, r4 + str r0, [sl] + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C0B38: .word _02109494 +_020C0B3C: .word _02109494 + 1 +_020C0B40: .word _02109494 + 2 +_020C0B44: .word _02109494 + 3 + arm_func_end NNSi_G3dFuncSbc_NODEDESC + + arm_func_start NNSi_G3dFuncSbc_BB +NNSi_G3dFuncSbc_BB: ; 0x020C0B48 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0xc8 + mov sb, r0 + ldr r0, [sb, #8] + mov r8, r1 + tst r0, #0x200 + mov r4, #2 + ldr r5, _020C0E24 ; =_02110B3C + ldr r6, _020C0E28 ; =_02110B48 + beq _020C0B9C + cmp r8, #0x40 + cmpne r8, #0x60 + addeq r4, r4, #1 + cmp r8, #0x20 + cmpne r8, #0x60 + ldr r0, [sb] + addeq r4, r4, #1 + add r0, r0, r4 + add sp, sp, #0xc8 + str r0, [sb] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C0B9C: + cmp r8, #0x40 + cmpne r8, #0x60 + bne _020C0BDC + tst r0, #0x100 + add r4, r4, #1 + bne _020C0BDC + ldr r0, [sb] + cmp r8, #0x40 + ldreqb r0, [r0, #2] + add r1, sp, #4 + mov r2, #1 + streq r0, [sp, #4] + ldrneb r0, [r0, #3] + strne r0, [sp, #4] + mov r0, #0x14 + bl NNS_G3dGeBufferOP_N +_020C0BDC: + ldr r0, [sb, #0x28] + cmp r0, #0 + ldrneb r7, [sb, #0x93] + moveq r7, #0 + cmp r7, #1 + bne _020C0C28 + ldr r1, [sb, #8] + mov r0, sb + bic r1, r1, #0x40 + str r1, [sb, #8] + ldr r1, [sb, #0x28] + blx r1 + ldr r0, [sb, #0x28] + cmp r0, #0 + ldrneb r7, [sb, #0x93] + ldr r0, [sb, #8] + moveq r7, #0 + and r1, r0, #0x40 + b _020C0C2C +_020C0C28: + mov r1, #0 +_020C0C2C: + ldr r0, [sb, #8] + tst r0, #0x100 + cmpeq r1, #0 + bne _020C0DA4 + bl NNS_G3dGeFlushBuffer + ldr r2, _020C0E2C ; =0x00151110 + ldr r1, _020C0E30 ; =0x04000400 + mov r0, #0 + str r2, [r1] + str r0, [r1] + str r0, [r1] + add sl, sp, #0x88 +_020C0C5C: + mov r0, sl + bl G3X_GetClipMtx + cmp r0, #0 + bne _020C0C5C + ldr r0, _020C0E34 ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #1 + beq _020C0C9C + bl NNS_G3dGlbGetWV + add r1, sp, #0x48 + bl MTX_Copy43To44_ + add r0, sp, #0x88 + add r1, sp, #0x48 + mov r2, r0 + bl MTX_Concat44 + b _020C0CC0 +_020C0C9C: + tst r0, #2 + beq _020C0CC0 + ldr r0, _020C0E38 ; =NNS_G3dGlb + 0x4C + add r1, sp, #8 + bl MTX_Copy43To44_ + add r0, sp, #0x88 + add r1, sp, #8 + mov r2, r0 + bl MTX_Concat44 +_020C0CC0: + ldr r3, [sp, #0xb8] + ldr r2, [sp, #0xbc] + ldr r1, [sp, #0xc0] + add r0, sp, #0x88 + str r3, [r5] + str r2, [r5, #4] + str r1, [r5, #8] + bl VEC_Mag + str r0, [r6] + add r0, sp, #0x98 + bl VEC_Mag + str r0, [r6, #4] + add r0, sp, #0xa8 + bl VEC_Mag + ldr r1, _020C0E34 ; =NNS_G3dGlb + str r0, [r6, #8] + ldr r0, [r1, #0xfc] + ldr r1, _020C0E30 ; =0x04000400 + tst r0, #1 + beq _020C0D50 + ldr r3, _020C0E3C ; =0x00171012 + ldr r0, _020C0E40 ; =_02110B10 + mov r2, #8 + str r3, [r1] + bl MIi_CpuSend32 + bl NNS_G3dGlbGetInvWV + ldr r1, _020C0E30 ; =0x04000400 + mov r2, #0x30 + bl MIi_CpuSend32 + ldr r2, _020C0E44 ; =0x00001B19 + ldr r1, _020C0E30 ; =0x04000400 + ldr r0, _020C0E48 ; =_02110B18 + str r2, [r1] + mov r2, #0x3c + bl MIi_CpuSend32 + b _020C0DA4 +_020C0D50: + tst r0, #2 + beq _020C0D98 + ldr r3, _020C0E3C ; =0x00171012 + ldr r0, _020C0E40 ; =_02110B10 + mov r2, #8 + str r3, [r1] + bl MIi_CpuSend32 + bl NNS_G3dGlbGetInvV + ldr r1, _020C0E30 ; =0x04000400 + mov r2, #0x30 + bl MIi_CpuSend32 + ldr r2, _020C0E44 ; =0x00001B19 + ldr r1, _020C0E30 ; =0x04000400 + ldr r0, _020C0E48 ; =_02110B18 + str r2, [r1] + mov r2, #0x3c + bl MIi_CpuSend32 + b _020C0DA4 +_020C0D98: + ldr r0, _020C0E4C ; =_02110B0C + mov r2, #0x48 + bl MIi_CpuSend32 +_020C0DA4: + cmp r7, #3 + movne r0, #0 + bne _020C0DD0 + ldr r1, [sb, #8] + mov r0, sb + bic r1, r1, #0x40 + str r1, [sb, #8] + ldr r1, [sb, #0x28] + blx r1 + ldr r0, [sb, #8] + and r0, r0, #0x40 +_020C0DD0: + cmp r8, #0x20 + cmpne r8, #0x60 + bne _020C0E10 + cmp r0, #0 + add r4, r4, #1 + bne _020C0E10 + ldr r0, [sb, #8] + tst r0, #0x100 + bne _020C0E10 + ldr r0, [sb] + add r1, sp, #0 + ldrb r3, [r0, #2] + mov r0, #0x13 + mov r2, #1 + str r3, [sp] + bl NNS_G3dGeBufferOP_N +_020C0E10: + ldr r0, [sb] + add r0, r0, r4 + str r0, [sb] + add sp, sp, #0xc8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020C0E24: .word _02110B3C +_020C0E28: .word _02110B48 +_020C0E2C: .word 0x00151110 +_020C0E30: .word 0x04000400 +_020C0E34: .word NNS_G3dGlb +_020C0E38: .word NNS_G3dGlb + 0x4C +_020C0E3C: .word 0x00171012 +_020C0E40: .word _02110B10 +_020C0E44: .word 0x00001B19 +_020C0E48: .word _02110B18 +_020C0E4C: .word _02110B0C + arm_func_end NNSi_G3dFuncSbc_BB + + arm_func_start NNSi_G3dFuncSbc_BBY +NNSi_G3dFuncSbc_BBY: ; 0x020C0E50 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc8 + mov sl, r0 + ldr r0, [sl, #8] + mov sb, r1 + tst r0, #0x200 + mov r5, #2 + ldr fp, _020C1188 ; =_02110B84 + ldr r6, _020C118C ; =_02110B90 + ldr r7, _020C1190 ; =_02110B60 + beq _020C0EA8 + cmp sb, #0x40 + cmpne sb, #0x60 + addeq r5, r5, #1 + cmp sb, #0x20 + cmpne sb, #0x60 + ldr r0, [sl] + addeq r5, r5, #1 + add r0, r0, r5 + add sp, sp, #0xc8 + str r0, [sl] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C0EA8: + cmp sb, #0x40 + cmpne sb, #0x60 + bne _020C0EE8 + tst r0, #0x100 + add r5, r5, #1 + bne _020C0EE8 + ldr r0, [sl] + cmp sb, #0x40 + ldreqb r0, [r0, #2] + add r1, sp, #4 + mov r2, #1 + streq r0, [sp, #4] + ldrneb r0, [r0, #3] + strne r0, [sp, #4] + mov r0, #0x14 + bl NNS_G3dGeBufferOP_N +_020C0EE8: + ldr r0, [sl, #0x2c] + cmp r0, #0 + ldrneb r8, [sl, #0x94] + moveq r8, #0 + cmp r8, #1 + bne _020C0F34 + ldr r1, [sl, #8] + mov r0, sl + bic r1, r1, #0x40 + str r1, [sl, #8] + ldr r1, [sl, #0x2c] + blx r1 + ldr r0, [sl, #0x2c] + cmp r0, #0 + ldrneb r8, [sl, #0x94] + ldr r0, [sl, #8] + moveq r8, #0 + and r1, r0, #0x40 + b _020C0F38 +_020C0F34: + mov r1, #0 +_020C0F38: + ldr r0, [sl, #8] + tst r0, #0x100 + cmpeq r1, #0 + bne _020C1108 + bl NNS_G3dGeFlushBuffer + ldr r2, _020C1194 ; =0x00151110 + ldr r1, _020C1198 ; =0x04000400 + mov r0, #0 + str r2, [r1] + str r0, [r1] + str r0, [r1] + add r4, sp, #0x88 +_020C0F68: + mov r0, r4 + bl G3X_GetClipMtx + cmp r0, #0 + bne _020C0F68 + ldr r0, _020C119C ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #1 + beq _020C0FA8 + bl NNS_G3dGlbGetWV + add r1, sp, #0x48 + bl MTX_Copy43To44_ + add r0, sp, #0x88 + add r1, sp, #0x48 + mov r2, r0 + bl MTX_Concat44 + b _020C0FCC +_020C0FA8: + tst r0, #2 + beq _020C0FCC + ldr r0, _020C11A0 ; =NNS_G3dGlb + 0x4C + add r1, sp, #8 + bl MTX_Copy43To44_ + add r0, sp, #0x88 + add r1, sp, #8 + mov r2, r0 + bl MTX_Concat44 +_020C0FCC: + ldr r3, [sp, #0xb8] + ldr r2, [sp, #0xbc] + ldr r1, [sp, #0xc0] + add r0, sp, #0x88 + str r3, [fp] + str r2, [fp, #4] + str r1, [fp, #8] + bl VEC_Mag + str r0, [r6] + add r0, sp, #0x98 + bl VEC_Mag + str r0, [r6, #4] + add r0, sp, #0xa8 + bl VEC_Mag + ldr r1, [sp, #0x9c] + str r0, [r6, #8] + cmp r1, #0 + ldreq r0, [sp, #0xa0] + cmpeq r0, #0 + beq _020C1040 + add r0, sp, #0x98 + add r1, r7, #0xc + bl VEC_Normalize + ldr r1, [r7, #0x14] + ldr r0, [r7, #0x10] + rsb r1, r1, #0 + str r1, [r7, #0x1c] + str r0, [r7, #0x20] + b _020C1060 +_020C1040: + add r0, sp, #0xa8 + add r1, r7, #0x18 + bl VEC_Normalize + ldr r1, [r7, #0x1c] + ldr r0, [r7, #0x20] + rsb r1, r1, #0 + str r1, [r7, #0x14] + str r0, [r7, #0x10] +_020C1060: + ldr r0, _020C119C ; =NNS_G3dGlb + ldr r1, _020C1198 ; =0x04000400 + ldr r0, [r0, #0xfc] + tst r0, #1 + beq _020C10B4 + ldr r3, _020C11A4 ; =0x00171012 + ldr r0, _020C11A8 ; =_02110B58 + mov r2, #8 + str r3, [r1] + bl MIi_CpuSend32 + bl NNS_G3dGlbGetInvWV + ldr r1, _020C1198 ; =0x04000400 + mov r2, #0x30 + bl MIi_CpuSend32 + ldr r2, _020C11AC ; =0x00001B19 + ldr r1, _020C1198 ; =0x04000400 + ldr r0, _020C1190 ; =_02110B60 + str r2, [r1] + mov r2, #0x3c + bl MIi_CpuSend32 + b _020C1108 +_020C10B4: + tst r0, #2 + beq _020C10FC + ldr r3, _020C11A4 ; =0x00171012 + ldr r0, _020C11A8 ; =_02110B58 + mov r2, #8 + str r3, [r1] + bl MIi_CpuSend32 + bl NNS_G3dGlbGetInvV + ldr r1, _020C1198 ; =0x04000400 + mov r2, #0x30 + bl MIi_CpuSend32 + ldr r2, _020C11AC ; =0x00001B19 + ldr r1, _020C1198 ; =0x04000400 + ldr r0, _020C1190 ; =_02110B60 + str r2, [r1] + mov r2, #0x3c + bl MIi_CpuSend32 + b _020C1108 +_020C10FC: + ldr r0, _020C11B0 ; =_02110B54 + mov r2, #0x48 + bl MIi_CpuSend32 +_020C1108: + cmp r8, #3 + movne r0, #0 + bne _020C1134 + ldr r1, [sl, #8] + mov r0, sl + bic r1, r1, #0x40 + str r1, [sl, #8] + ldr r1, [sl, #0x2c] + blx r1 + ldr r0, [sl, #8] + and r0, r0, #0x40 +_020C1134: + cmp sb, #0x20 + cmpne sb, #0x60 + bne _020C1174 + cmp r0, #0 + add r5, r5, #1 + bne _020C1174 + ldr r0, [sl, #8] + tst r0, #0x100 + bne _020C1174 + ldr r0, [sl] + add r1, sp, #0 + ldrb r3, [r0, #2] + mov r0, #0x13 + mov r2, #1 + str r3, [sp] + bl NNS_G3dGeBufferOP_N +_020C1174: + ldr r0, [sl] + add r0, r0, r5 + str r0, [sl] + add sp, sp, #0xc8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C1188: .word _02110B84 +_020C118C: .word _02110B90 +_020C1190: .word _02110B60 +_020C1194: .word 0x00151110 +_020C1198: .word 0x04000400 +_020C119C: .word NNS_G3dGlb +_020C11A0: .word NNS_G3dGlb + 0x4C +_020C11A4: .word 0x00171012 +_020C11A8: .word _02110B58 +_020C11AC: .word 0x00001B19 +_020C11B0: .word _02110B54 + arm_func_end NNSi_G3dFuncSbc_BBY + + arm_func_start NNSi_G3dFuncSbc_NODEMIX +NNSi_G3dFuncSbc_NODEMIX: ; 0x020C11B4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x104 + ldr r1, [r0, #4] + ldr r6, [r0] + ldr r7, [r1, #4] + ldrb r2, [r6, #2] + ldr r3, [r7, #0x10] + mov r5, #0 + str r0, [sp] + str r2, [sp, #0x10] + add r3, r7, r3 + add r1, sp, #0xb0 + mov r0, r5 + mov r2, #0x54 + mov r4, r5 + str r3, [sp, #0x14] + add r6, r6, #3 + bl MIi_CpuClearFast + bl NNS_G3dGeFlushBuffer + mov r0, r5 + ldr r1, _020C1900 ; =0x04000440 + str r0, [sp, #0xc] + str r0, [r1] + mov r0, #1 + str r0, [r1, #0xc] + ldr r0, [sp, #0xc] + str r0, [r1, #0x14] + mov r0, #2 + str r0, [r1] + ldr r0, [sp, #0x10] + cmp r0, #0 + bls _020C16A4 +_020C1234: + ldrb fp, [r6, #1] + mov r1, #0x64 + ldr r0, [sp] + smulbb r1, fp, r1 + mov r2, fp, lsr #5 + str r1, [sp, #4] + add r0, r0, r2, lsl #2 + ldr r3, _020C1904 ; =_021DBB04 + ldr r2, [sp, #4] + ldr sb, [r0, #0xcc] + add r7, r3, r2 + and r1, fp, #0x1f + mov r2, #1 + ands r3, sb, r2, lsl r1 + str r3, [sp, #8] + bne _020C12A0 + ldr sb, [r0, #0xcc] + ldr r3, _020C1908 ; =0x04000450 + orr r1, sb, r2, lsl r1 + str r1, [r0, #0xcc] + ldr r0, [sp, #0x14] + mov r1, #0x54 + mla r0, fp, r1, r0 + ldrb sb, [r6] + str sb, [r3] + str r2, [r3, #-0x10] + bl G3_MultMtx43 +_020C12A0: + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _020C14C8 + ldr r0, [sp, #0xe0] + ldmia r8, {sb, lr} + str r0, [sp, #0x18] + mov r0, sb, asr #0x1f + str r0, [sp, #0x20] + ldr r0, [sp, #0xe4] + ldr ip, [r8, #8] + str r0, [sp, #0x24] + mov r0, lr, asr #0x1f + str r0, [sp, #0x28] + ldr r0, [sp, #0xe8] + ldr r3, [r8, #0xc] + str r0, [sp, #0x2c] + ldr r0, [sp, #0xec] + ldr r2, [r8, #0x10] + str r0, [sp, #0x34] + mov r0, ip, asr #0x1f + str r0, [sp, #0x30] + ldr r0, [sp, #0xf0] + ldr r1, [r8, #0x14] + str r0, [sp, #0x3c] + mov r0, r3, asr #0x1f + str r0, [sp, #0x38] + ldr r0, [sp, #0xf4] + str r0, [sp, #0x44] + mov r0, r2, asr #0x1f + str r0, [sp, #0x40] + ldr r0, [sp, #0xf8] + str r0, [sp, #0x4c] + mov r0, r1, asr #0x1f + str r0, [sp, #0x48] + ldr r0, [r8, #0x18] + str r0, [sp, #0x50] + ldr r0, [sp, #0xfc] + str r0, [sp, #0x58] + ldr r0, [sp, #0x50] + mov r0, r0, asr #0x1f + str r0, [sp, #0x54] + ldr r0, [r8, #0x1c] + str r0, [sp, #0xa8] + ldr r0, [r8, #0x20] + ldr r8, [sp, #0xa8] + mov r8, r8, asr #0x1f + str r8, [sp, #0x5c] + ldr r8, [sp, #0x100] + str r8, [sp, #0x60] + mov r8, r0, asr #0x1f + str r8, [sp, #0x64] + umull sl, r8, r5, sb + str sl, [sp, #0x1c] + ldr sl, [sp, #0x20] + mla r8, r5, sl, r8 + mla r8, r4, sb, r8 + ldr sb, [sp, #0x1c] + mov sb, sb, lsr #0xc + orr sb, sb, r8, lsl #20 + ldr r8, [sp, #0x18] + adds r8, r8, sb + str r8, [sp, #0xe0] + umull sl, sb, r5, lr + ldr r8, [sp, #0x28] + mov sl, sl, lsr #0xc + mla sb, r5, r8, sb + mla sb, r4, lr, sb + ldr r8, [sp, #0x24] + orr sl, sl, sb, lsl #20 + adds r8, r8, sl + str r8, [sp, #0xe4] + umull sl, sb, r5, ip + ldr r8, [sp, #0x30] + mov sl, sl, lsr #0xc + mla sb, r5, r8, sb + mla sb, r4, ip, sb + ldr r8, [sp, #0x2c] + orr sl, sl, sb, lsl #20 + adds r8, r8, sl + str r8, [sp, #0xe8] + ldr r8, [sp, #0x38] + umull sl, sb, r5, r3 + mla sb, r5, r8, sb + mla sb, r4, r3, sb + mov r8, sl, lsr #0xc + ldr r3, [sp, #0x34] + orr r8, r8, sb, lsl #20 + adds r3, r3, r8 + str r3, [sp, #0xec] + ldr r3, [sp, #0x40] + umull sb, r8, r5, r2 + mla r8, r5, r3, r8 + mla r8, r4, r2, r8 + mov r3, sb, lsr #0xc + ldr r2, [sp, #0x3c] + orr r3, r3, r8, lsl #20 + adds r2, r2, r3 + str r2, [sp, #0xf0] + ldr r2, [sp, #0x48] + umull r8, r3, r5, r1 + mla r3, r5, r2, r3 + mla r3, r4, r1, r3 + mov r2, r8, lsr #0xc + ldr r1, [sp, #0x44] + orr r2, r2, r3, lsl #20 + adds r1, r1, r2 + str r1, [sp, #0xf4] + ldr r1, [sp, #0x50] + umull r3, r2, r5, r1 + ldr r1, [sp, #0x54] + mov r3, r3, lsr #0xc + mla r2, r5, r1, r2 + ldr r1, [sp, #0x50] + mla r2, r4, r1, r2 + ldr r1, [sp, #0x4c] + orr r3, r3, r2, lsl #20 + adds r1, r1, r3 + str r1, [sp, #0xf8] + ldr r1, [sp, #0xa8] + umull r3, r2, r5, r1 + ldr r1, [sp, #0x5c] + mov r3, r3, lsr #0xc + mla r2, r5, r1, r2 + ldr r1, [sp, #0xa8] + mla r2, r4, r1, r2 + ldr r1, [sp, #0x58] + orr r3, r3, r2, lsl #20 + adds r1, r1, r3 + str r1, [sp, #0xfc] + ldr r1, [sp, #0x64] + umull r3, r2, r5, r0 + mla r2, r5, r1, r2 + mla r2, r4, r0, r2 + mov r1, r3, lsr #0xc + ldr r0, [sp, #0x60] + orr r1, r1, r2, lsl #20 + adds r0, r0, r1 + str r0, [sp, #0x100] +_020C14C8: + ldr r0, [sp, #8] + cmp r0, #0 + bne _020C1504 +_020C14D4: + mov r0, r7 + bl G3X_GetClipMtx + cmp r0, #0 + bne _020C14D4 + ldr r0, [sp, #0x14] + mov r1, #0x54 + mla r0, fp, r1, r0 + ldr r1, _020C1900 ; =0x04000440 + mov r2, #2 + add r0, r0, #0x30 + str r2, [r1] + bl G3_MultMtx33 +_020C1504: + ldrb r0, [r6, #2] + ldr r2, [r7] + ldr r1, [r7, #4] + mov r5, r0, lsl #4 + ldr r0, [r7, #8] + ldr r4, [r7, #0x10] + ldr r3, [r7, #0x14] + smull r2, r8, r5, r2 + mov r2, r2, lsr #0xc + orr r2, r2, r8, lsl #20 + smull r1, r8, r5, r1 + mov r1, r1, lsr #0xc + orr r1, r1, r8, lsl #20 + smull r0, r8, r5, r0 + mov r0, r0, lsr #0xc + orr r0, r0, r8, lsl #20 + smull r8, r4, r5, r4 + mov sb, r8, lsr #0xc + orr sb, sb, r4, lsl #20 + smull r4, r3, r5, r3 + mov r8, r4, lsr #0xc + orr r8, r8, r3, lsl #20 + mov r4, r5, asr #0x1f + ldr sl, [sp, #0xb0] + ldr r3, [sp, #0xb4] + adds r2, sl, r2 + adds r1, r3, r1 + str r2, [sp, #0xb0] + str r1, [sp, #0xb4] + ldr r2, [sp, #0xb8] + ldr r1, [sp, #0xbc] + adds r2, r2, r0 + adds r0, r1, sb + str r2, [sp, #0xb8] + str r0, [sp, #0xbc] + ldr r0, [sp, #0xc0] + ldr r2, [sp, #0xc4] + adds r0, r0, r8 + str r0, [sp, #0xc0] + ldr r0, [r7, #0x18] + ldr r3, [sp, #0xc8] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + adds r0, r2, r1 + str r0, [sp, #0xc4] + ldr r0, [r7, #0x20] + ldr r2, [sp, #0xcc] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + adds r0, r3, r1 + str r0, [sp, #0xc8] + ldr r0, [r7, #0x24] + ldr r3, [sp, #0xd0] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + adds r0, r2, r1 + str r0, [sp, #0xcc] + ldr r0, [r7, #0x28] + ldr r2, [sp, #0xd4] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + adds r0, r3, r1 + str r0, [sp, #0xd0] + ldr r0, [r7, #0x30] + ldr r3, [sp, #0xd8] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + adds r0, r2, r1 + str r0, [sp, #0xd4] + ldr r1, [r7, #0x34] + ldr r0, [r7, #0x38] + smull r2, r1, r5, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + adds r1, r3, r2 + str r1, [sp, #0xd8] + smull r1, r0, r5, r0 + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + ldr r0, [sp, #0xdc] + adds r0, r0, r1 + str r0, [sp, #0xdc] + ldr r1, _020C190C ; =_021DBB44 + ldr r0, [sp, #8] + cmp r0, #0 + add r6, r6, #3 + ldr r0, [sp, #4] + add r8, r1, r0 + bne _020C168C +_020C167C: + mov r0, r8 + bl G3X_GetVectorMtx + cmp r0, #0 + bne _020C167C +_020C168C: + ldr r0, [sp, #0xc] + add r1, r0, #1 + ldr r0, [sp, #0x10] + str r1, [sp, #0xc] + cmp r1, r0 + blo _020C1234 +_020C16A4: + ldmia r8, {r0, fp} + ldr sl, [r8, #8] + ldr sb, [r8, #0xc] + ldr r7, [r8, #0x10] + ldr r6, [r8, #0x14] + ldr r3, [r8, #0x18] + ldr r2, [r8, #0x1c] + ldr r1, [r8, #0x20] + umull ip, r8, r5, r0 + mov lr, ip, lsr #0xc + ldr ip, [sp, #0xe0] + str ip, [sp, #0x68] + mov ip, r0, asr #0x1f + mla r8, r5, ip, r8 + mla r8, r4, r0, r8 + orr lr, lr, r8, lsl #20 + umull ip, r8, r5, fp + ldr r0, [sp, #0x68] + str ip, [sp, #0x6c] + adds r0, r0, lr + str r0, [sp, #0xe0] + mov r0, fp, asr #0x1f + str r0, [sp, #0xac] + ldr ip, [sp, #0xac] + ldr r0, [sp, #0xe8] + mla r8, r5, ip, r8 + mla r8, r4, fp, r8 + ldr fp, [sp, #0x6c] + str r0, [sp, #0x70] + mov fp, fp, lsr #0xc + mov r0, sl, asr #0x1f + str r0, [sp, #0x74] + ldr r0, [sp, #0xec] + ldr lr, [sp, #0xe4] + orr fp, fp, r8, lsl #20 + adds r8, lr, fp + str r8, [sp, #0xe4] + str r0, [sp, #0x78] + mov r0, sb, asr #0x1f + str r0, [sp, #0x7c] + ldr r0, [sp, #0xf0] + ldr r8, [sp, #0x74] + umull ip, fp, r5, sl + mla fp, r5, r8, fp + mla fp, r4, sl, fp + mov sl, ip, lsr #0xc + str r0, [sp, #0x80] + mov r0, r7, asr #0x1f + str r0, [sp, #0x84] + ldr r0, [sp, #0xf4] + ldr r8, [sp, #0x70] + orr sl, sl, fp, lsl #20 + adds r8, r8, sl + str r8, [sp, #0xe8] + str r0, [sp, #0x88] + mov r0, r6, asr #0x1f + str r0, [sp, #0x8c] + ldr r0, [sp, #0xf8] + ldr r8, [sp, #0x7c] + umull fp, sl, r5, sb + mla sl, r5, r8, sl + mla sl, r4, sb, sl + mov sb, fp, lsr #0xc + str r0, [sp, #0x90] + mov r0, r3, asr #0x1f + str r0, [sp, #0x94] + ldr r0, [sp, #0xfc] + ldr r8, [sp, #0x78] + orr sb, sb, sl, lsl #20 + adds r8, r8, sb + str r8, [sp, #0xec] + str r0, [sp, #0x98] + mov r0, r2, asr #0x1f + str r0, [sp, #0x9c] + ldr r0, [sp, #0x100] + ldr r8, [sp, #0x84] + umull sl, sb, r5, r7 + mla sb, r5, r8, sb + mla sb, r4, r7, sb + mov r8, sl, lsr #0xc + str r0, [sp, #0xa0] + mov r0, r1, asr #0x1f + str r0, [sp, #0xa4] + ldr r7, [sp, #0x80] + orr r8, r8, sb, lsl #20 + adds r7, r7, r8 + str r7, [sp, #0xf0] + ldr r7, [sp, #0x8c] + umull sb, r8, r5, r6 + mla r8, r5, r7, r8 + mla r8, r4, r6, r8 + mov r7, sb, lsr #0xc + ldr r6, [sp, #0x88] + orr r7, r7, r8, lsl #20 + adds r6, r6, r7 + str r6, [sp, #0xf4] + ldr r6, [sp, #0x94] + umull r8, r7, r5, r3 + mla r7, r5, r6, r7 + mla r7, r4, r3, r7 + mov r6, r8, lsr #0xc + ldr r3, [sp, #0x90] + orr r6, r6, r7, lsl #20 + adds r3, r3, r6 + str r3, [sp, #0xf8] + ldr r3, [sp, #0x9c] + umull r7, r6, r5, r2 + mla r6, r5, r3, r6 + mla r6, r4, r2, r6 + mov r3, r7, lsr #0xc + ldr r2, [sp, #0x98] + orr r3, r3, r6, lsl #20 + adds r2, r2, r3 + str r2, [sp, #0xfc] + ldr r2, [sp, #0xa4] + umull r6, r3, r5, r1 + mla r3, r5, r2, r3 + mla r3, r4, r1, r3 + mov r2, r6, lsr #0xc + ldr r1, [sp, #0xa0] + orr r2, r2, r3, lsl #20 + adds r1, r1, r2 + add r0, sp, #0xe0 + str r1, [sp, #0x100] + bl G3_LoadMtx43 + ldr r1, _020C1900 ; =0x04000440 + mov r2, #1 + add r0, sp, #0xb0 + str r2, [r1] + bl G3_LoadMtx43 + ldr r1, _020C1900 ; =0x04000440 + mov r2, #0 + mov r0, #1 + str r2, [r1] + str r0, [r1, #0x10] + mov r0, #2 + str r0, [r1] + ldr r0, [sp] + ldr r0, [r0] + ldrb r0, [r0, #1] + str r0, [r1, #0xc] + ldr r0, [sp] + ldr r1, [r0] + ldrb r0, [r1, #2] + add r0, r0, #1 + add r0, r0, r0, lsl #1 + add r1, r1, r0 + ldr r0, [sp] + str r1, [r0] + add sp, sp, #0x104 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C1900: .word 0x04000440 +_020C1904: .word _021DBB04 +_020C1908: .word 0x04000450 +_020C190C: .word _021DBB44 + arm_func_end NNSi_G3dFuncSbc_NODEMIX + + arm_func_start NNSi_G3dFuncSbc_CALLDL +NNSi_G3dFuncSbc_CALLDL: ; 0x020C1910 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + ldr r0, [r5, #0x34] + cmp r0, #0 + ldrneb r4, [r5, #0x96] + moveq r4, #0 + cmp r4, #1 + bne _020C1964 + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x34] + blx r1 + ldr r0, [r5, #0x34] + cmp r0, #0 + ldrneb r4, [r5, #0x96] + ldr r0, [r5, #8] + moveq r4, #0 + and r1, r0, #0x40 + b _020C1968 +_020C1964: + mov r1, #0 +_020C1968: + ldr r0, [r5, #8] + tst r0, #0x100 + cmpeq r1, #0 + bne _020C19BC + ldr r0, [r5] + ldrb ip, [r0, #1] + ldrb r3, [r0, #2] + ldrb lr, [r0, #3] + ldrb r2, [r0, #5] + ldrb r1, [r0, #6] + orr r3, ip, r3, lsl #8 + ldrb r6, [r0, #4] + orr ip, r3, lr, lsl #16 + ldrb r3, [r0, #7] + orr r1, r2, r1, lsl #8 + orr r6, ip, r6, lsl #24 + ldrb r2, [r0, #8] + orr r1, r1, r3, lsl #16 + add r0, r0, r6 + orr r1, r1, r2, lsl #24 + bl NNS_G3dGeSendDL +_020C19BC: + cmp r4, #3 + bne _020C19DC + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x34] + blx r1 +_020C19DC: + ldr r0, [r5] + add r0, r0, #9 + str r0, [r5] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_G3dFuncSbc_CALLDL + + arm_func_start NNSi_G3dFuncSbc_POSSCALE +NNSi_G3dFuncSbc_POSSCALE: ; 0x020C19EC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + ldr r0, [r4, #8] + tst r0, #0x100 + bne _020C1A48 + tst r0, #0x200 + bne _020C1A48 + cmp r1, #0 + bne _020C1A28 + ldr r0, [r4, #0xe0] + str r0, [sp, #8] + str r0, [sp, #4] + str r0, [sp] + b _020C1A38 +_020C1A28: + ldr r0, [r4, #0xe4] + str r0, [sp, #8] + str r0, [sp, #4] + str r0, [sp] +_020C1A38: + add r1, sp, #0 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C1A48: + ldr r0, [r4] + add r0, r0, #1 + str r0, [r4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + arm_func_end NNSi_G3dFuncSbc_POSSCALE + + arm_func_start NNSi_G3dFuncSbc_ENVMAP +NNSi_G3dFuncSbc_ENVMAP: ; 0x020C1A5C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r7, r0 + ldr r0, [r7, #8] + tst r0, #0x200 + bne _020C1D78 + tst r0, #1 + beq _020C1D78 + ldr r2, [r7, #0xb0] + ldr r0, [r2, #0x10] + and r1, r0, #0xc0000000 + cmp r1, #0x80000000 + beq _020C1AC8 + bic r0, r0, #0xc0000000 + str r0, [r2, #0x10] + ldr r3, [r7, #0xb0] + ldr r0, _020C1D8C ; =_02110A9C + ldr r2, [r3, #0x10] + ldr r1, _020C1D90 ; =_02110AA8 + orr r2, r2, #0x80000000 + str r2, [r3, #0x10] + ldr r3, [r7, #0xb0] + mov r2, #1 + ldr r3, [r3, #0x10] + str r3, [r0, #0xc] + ldr r0, [r0, #8] + bl NNS_G3dGeBufferOP_N +_020C1AC8: + mov r0, #3 + str r0, [sp, #0x10] + add r1, sp, #0x10 + mov r0, #0x10 + mov r2, #1 + bl NNS_G3dGeBufferOP_N + ldr r0, [r7, #0x3c] + cmp r0, #0 + ldrneb r6, [r7, #0x98] + moveq r6, #0 + cmp r6, #1 + bne _020C1B2C + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x3c] + blx r1 + ldr r0, [r7, #0x3c] + cmp r0, #0 + ldrneb r6, [r7, #0x98] + ldr r0, [r7, #8] + moveq r6, #0 + and r0, r0, #0x40 + b _020C1B30 +_020C1B2C: + mov r0, #0 +_020C1B30: + cmp r0, #0 + bne _020C1BA8 + ldr r0, [r7, #0xb0] + add r1, sp, #0x14 + ldrh r5, [r0, #0x2e] + ldrh r4, [r0, #0x2c] + mov r3, #0x10000 + rsb r0, r5, #0 + mov ip, r0, lsl #0xf + mov lr, r4, lsl #0xf + mov r0, #0x1b + mov r2, #3 + str lr, [sp, #0x14] + str ip, [sp, #0x18] + str r3, [sp, #0x1c] + bl NNS_G3dGeBufferOP_N + mov r0, r5, lsl #0x13 + mov r1, r0, asr #0x10 + mov r0, r4, lsl #0x13 + mov r1, r1, lsl #0x10 + mov r0, r0, asr #0x10 + mov r1, r1, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r1, r1, lsl #0x10 + orr r3, r1, r0, lsr #16 + add r1, sp, #0xc + mov r0, #0x22 + mov r2, #1 + str r3, [sp, #0xc] + bl NNS_G3dGeBufferOP_N +_020C1BA8: + cmp r6, #2 + bne _020C1BE4 + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x3c] + blx r1 + ldr r0, [r7, #0x3c] + cmp r0, #0 + ldrneb r6, [r7, #0x98] + ldr r0, [r7, #8] + moveq r6, #0 + and r0, r0, #0x40 + b _020C1BE8 +_020C1BE4: + mov r0, #0 +_020C1BE8: + cmp r0, #0 + bne _020C1C7C + ldr r0, [r7] + ldr r4, [r7, #0xd8] + ldrb r3, [r0, #1] + cmp r4, #0 + beq _020C1C44 + adds r2, r4, #4 + beq _020C1C30 + ldrb r0, [r4, #5] + cmp r3, r0 + bhs _020C1C30 + ldrh r1, [r4, #0xa] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r3, r1 + b _020C1C34 +_020C1C30: + mov r1, #0 +_020C1C34: + cmp r1, #0 + ldrne r0, [r1] + addne r0, r4, r0 + bne _020C1C48 +_020C1C44: + mov r0, #0 +_020C1C48: + ldrh r2, [r0, #0x1e] + tst r2, #0x2000 + beq _020C1C7C + add r1, r0, #0x2c + tst r2, #2 + addeq r1, r1, #8 + tst r2, #4 + addeq r1, r1, #4 + tst r2, #8 + addeq r1, r1, #8 + mov r0, #0x18 + mov r2, #0x10 + bl NNS_G3dGeBufferOP_N +_020C1C7C: + cmp r6, #3 + movne r0, #0 + bne _020C1CA8 + ldr r1, [r7, #8] + mov r0, r7 + bic r1, r1, #0x40 + str r1, [r7, #8] + ldr r1, [r7, #0x3c] + blx r1 + ldr r0, [r7, #8] + and r0, r0, #0x40 +_020C1CA8: + cmp r0, #0 + bne _020C1D60 + mov r3, #2 + add r1, sp, #8 + mov r0, #0x10 + mov r2, #1 + str r3, [sp, #8] + bl NNS_G3dGeBufferOP_N + add r1, sp, #0x20 + mov r0, #0 + bl NNS_G3dGetCurrentMtx + mov r3, #3 + add r1, sp, #4 + mov r0, #0x10 + mov r2, #1 + str r3, [sp, #4] + bl NNS_G3dGeBufferOP_N + ldr r0, _020C1D94 ; =NNS_G3dGlb + mov r2, #9 + ldr r0, [r0, #0xfc] + tst r0, #1 + beq _020C1D30 + ldr r1, _020C1D98 ; =NNS_G3dGlb + 0x4C + mov r0, #0x1a + bl NNS_G3dGeBufferOP_N + ldr r1, _020C1D9C ; =NNS_G3dGlb + 0xBC + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + add r1, sp, #0x20 + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + b _020C1D60 +_020C1D30: + tst r0, #2 + mov r0, #0x1a + beq _020C1D58 + ldr r1, _020C1D98 ; =NNS_G3dGlb + 0x4C + bl NNS_G3dGeBufferOP_N + add r1, sp, #0x20 + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + b _020C1D60 +_020C1D58: + add r1, sp, #0x20 + bl NNS_G3dGeBufferOP_N +_020C1D60: + mov r3, #2 + add r1, sp, #0 + mov r0, #0x10 + mov r2, #1 + str r3, [sp] + bl NNS_G3dGeBufferOP_N +_020C1D78: + ldr r0, [r7] + add r0, r0, #3 + str r0, [r7] + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020C1D8C: .word _02110A9C +_020C1D90: .word _02110AA8 +_020C1D94: .word NNS_G3dGlb +_020C1D98: .word NNS_G3dGlb + 0x4C +_020C1D9C: .word NNS_G3dGlb + 0xBC + arm_func_end NNSi_G3dFuncSbc_ENVMAP + + arm_func_start NNSi_G3dFuncSbc_PRJMAP +NNSi_G3dFuncSbc_PRJMAP: ; 0x020C1DA0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x80 + mov r5, r0 + ldr r0, [r5, #8] + tst r0, #0x200 + bne _020C211C + tst r0, #1 + beq _020C211C + add r0, sp, #0x50 + mov r1, #0 + bl NNS_G3dGetCurrentMtx + mov r0, #0x1e + str r0, [sp, #0xc] + add r1, sp, #0xc + mov r0, #0x13 + mov r2, #1 + bl NNS_G3dGeBufferOP_N + ldr r2, [r5, #0xb0] + ldr r0, [r2, #0x10] + and r1, r0, #0xc0000000 + cmp r1, #0xc0000000 + beq _020C1E30 + bic r0, r0, #0xc0000000 + str r0, [r2, #0x10] + ldr r3, [r5, #0xb0] + ldr r0, _020C2130 ; =_02110A9C + ldr r2, [r3, #0x10] + ldr r1, _020C2134 ; =_02110AA0 + orr r2, r2, #0xc0000000 + str r2, [r3, #0x10] + ldr r3, [r5, #0xb0] + mov r2, #1 + ldr r3, [r3, #0x10] + str r3, [r0, #4] + ldr r0, [r0] + bl NNS_G3dGeBufferOP_N +_020C1E30: + ldr r0, [r5, #0x40] + cmp r0, #0 + ldrneb r4, [r5, #0x99] + moveq r4, #0 + cmp r4, #1 + bne _020C1E7C + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x40] + blx r1 + ldr r0, [r5, #0x40] + cmp r0, #0 + ldrneb r4, [r5, #0x99] + ldr r0, [r5, #8] + moveq r4, #0 + and r0, r0, #0x40 + b _020C1E80 +_020C1E7C: + mov r0, #0 +_020C1E80: + cmp r0, #0 + bne _020C1EC8 + ldr r0, [r5, #0xb0] + ldr r3, _020C2130 ; =_02110A9C + ldrh ip, [r0, #0x2e] + ldrh r2, [r0, #0x2c] + ldr r1, _020C2138 ; =_02110ACC + rsb r0, ip, #0 + mov r2, r2, lsl #0xf + str r2, [r3, #0x30] + mov r0, r0, lsl #0xf + str r0, [r3, #0x44] + str r2, [r3, #0x60] + mov ip, ip, lsl #0xf + mov r0, #0x16 + mov r2, #0x10 + str ip, [r3, #0x64] + bl NNS_G3dGeBufferOP_N +_020C1EC8: + cmp r4, #2 + bne _020C1F04 + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x40] + blx r1 + ldr r0, [r5, #0x40] + cmp r0, #0 + ldrneb r4, [r5, #0x99] + ldr r0, [r5, #8] + moveq r4, #0 + and r0, r0, #0x40 + b _020C1F08 +_020C1F04: + mov r0, #0 +_020C1F08: + cmp r0, #0 + bne _020C1F9C + ldr r0, [r5] + ldr ip, [r5, #0xd8] + ldrb r3, [r0, #1] + cmp ip, #0 + beq _020C1F64 + adds r2, ip, #4 + beq _020C1F50 + ldrb r0, [ip, #5] + cmp r3, r0 + bhs _020C1F50 + ldrh r1, [ip, #0xa] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r3, r1 + b _020C1F54 +_020C1F50: + mov r1, #0 +_020C1F54: + cmp r1, #0 + ldrne r0, [r1] + addne r0, ip, r0 + bne _020C1F68 +_020C1F64: + mov r0, #0 +_020C1F68: + ldrh r2, [r0, #0x1e] + tst r2, #0x2000 + beq _020C1F9C + add r1, r0, #0x2c + tst r2, #2 + addeq r1, r1, #8 + tst r2, #4 + addeq r1, r1, #4 + tst r2, #8 + addeq r1, r1, #8 + mov r0, #0x18 + mov r2, #0x10 + bl NNS_G3dGeBufferOP_N +_020C1F9C: + cmp r4, #3 + movne r0, #0 + bne _020C1FC8 + ldr r1, [r5, #8] + mov r0, r5 + bic r1, r1, #0x40 + str r1, [r5, #8] + ldr r1, [r5, #0x40] + blx r1 + ldr r0, [r5, #8] + and r0, r0, #0x40 +_020C1FC8: + cmp r0, #0 + bne _020C20EC + ldr r0, _020C213C ; =NNS_G3dGlb + ldr r0, [r0, #0xfc] + tst r0, #1 + beq _020C2014 + ldr r1, _020C2140 ; =NNS_G3dGlb + 0xE0 + mov r0, #0x1c + mov r2, #3 + bl NNS_G3dGeBufferOP_N + ldr r1, _020C2144 ; =NNS_G3dGlb + 0xBC + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + add r1, sp, #0x50 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + b _020C2054 +_020C2014: + tst r0, #2 + beq _020C2030 + add r1, sp, #0x50 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + b _020C2054 +_020C2030: + bl NNS_G3dGlbGetInvV + mov r1, r0 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + add r1, sp, #0x50 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N +_020C2054: + bl NNS_G3dGeFlushBuffer + ldr r0, _020C2148 ; =0x04000440 + mov r1, #0 + str r1, [r0] + str r1, [r0, #4] + str r1, [r0, #0x14] + add r4, sp, #0x10 +_020C2070: + mov r0, r4 + bl G3X_GetClipMtx + cmp r0, #0 + bne _020C2070 + ldr r2, _020C214C ; =0x04000448 + mov r0, #1 + str r0, [r2] + mov r0, #3 + str r0, [r2, #-8] + add r1, sp, #0x10 + mov r0, #0x16 + mov r2, #0x10 + bl NNS_G3dGeBufferOP_N + ldr r0, [sp, #0x44] + ldr r1, [sp, #0x40] + mov r0, r0, asr #4 + mov r0, r0, lsl #8 + mov r2, r1, asr #4 + mov r1, r0, asr #0x10 + mov r0, r2, lsl #8 + mov r1, r1, lsl #0x10 + mov r0, r0, asr #0x10 + mov r1, r1, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r1, r1, lsl #0x10 + orr r3, r1, r0, lsr #16 + add r1, sp, #8 + mov r0, #0x22 + mov r2, #1 + str r3, [sp, #8] + bl NNS_G3dGeBufferOP_N +_020C20EC: + mov r3, #2 + add r1, sp, #4 + mov r0, #0x10 + mov r2, #1 + str r3, [sp, #4] + bl NNS_G3dGeBufferOP_N + mov r3, #0x1e + add r1, sp, #0 + mov r0, #0x14 + mov r2, #1 + str r3, [sp] + bl NNS_G3dGeBufferOP_N +_020C211C: + ldr r0, [r5] + add r0, r0, #3 + str r0, [r5] + add sp, sp, #0x80 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C2130: .word _02110A9C +_020C2134: .word _02110AA0 +_020C2138: .word _02110ACC +_020C213C: .word NNS_G3dGlb +_020C2140: .word NNS_G3dGlb + 0xE0 +_020C2144: .word NNS_G3dGlb + 0xBC +_020C2148: .word 0x04000440 +_020C214C: .word 0x04000448 + arm_func_end NNSi_G3dFuncSbc_PRJMAP + + arm_func_start NNS_G3dDraw1Mat1Shp +NNS_G3dDraw1Mat1Shp: ; 0x020C2150 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x6c + mov r6, r0 + ldr ip, [r6, #0x1c] + mov r4, r1 + mov r5, r2 + mov r7, r3 + cmp ip, #0x1000 + beq _020C2190 + add r1, sp, #0xc + mov r0, #0x1b + mov r2, #3 + str ip, [sp, #0xc] + str ip, [sp, #0x10] + str ip, [sp, #0x14] + bl NNS_G3dGeBufferOP_N +_020C2190: + cmp r7, #0 + beq _020C233C + ldrb r0, [r6, #0x18] + cmp r4, r0 + bhs _020C233C + cmp r6, #0 + ldrne r0, [r6, #8] + cmpne r0, #0 + addne r3, r6, r0 + moveq r3, #0 + cmp r3, #0 + beq _020C2200 + adds r2, r3, #4 + beq _020C21EC + ldrb r0, [r3, #5] + cmp r4, r0 + bhs _020C21EC + ldrh r1, [r3, #0xa] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r4, r1 + b _020C21F0 +_020C21EC: + mov r1, #0 +_020C21F0: + cmp r1, #0 + ldrne r0, [r1] + addne r4, r3, r0 + bne _020C2204 +_020C2200: + mov r4, #0 +_020C2204: + ldr r0, [r4, #0xc] + tst r0, #0x1f0000 + addeq sp, sp, #0x6c + ldmeqia sp!, {r4, r5, r6, r7, pc} + ldr r0, _020C23E8 ; =0x00293130 + str r0, [sp, #0x50] + ldr r0, [r4, #4] + str r0, [sp, #0x54] + ldr r0, [r4, #8] + str r0, [sp, #0x58] + ldr r1, [r4, #0xc] + str r1, [sp, #0x5c] + ldrh r0, [r4, #0x1e] + tst r0, #0x20 + bicne r0, r1, #0x1f0000 + ldr r1, _020C23EC ; =0x00002B2A + strne r0, [sp, #0x5c] + str r1, [sp, #0x60] + ldr r2, [r4, #0x14] + ldr r0, [sp, #0x50] + str r2, [sp, #0x64] + ldrh r3, [r4, #0x1c] + add r1, sp, #0x54 + mov r2, #6 + str r3, [sp, #0x68] + bl NNS_G3dGeBufferOP_N + ldrh r0, [r4, #0x1e] + tst r0, #1 + beq _020C233C + mov r2, #8 + str r2, [sp, #0x18] + ldrh r1, [r4, #0x20] + add r0, r4, #0x2c + strh r1, [sp, #0x44] + ldrh r1, [r4, #0x22] + strh r1, [sp, #0x46] + ldr r1, [r4, #0x24] + str r1, [sp, #0x48] + ldr r1, [r4, #0x28] + str r1, [sp, #0x4c] + ldrh r1, [r4, #0x1e] + tst r1, #2 + orrne r1, r2, #1 + strne r1, [sp, #0x18] + bne _020C22CC + ldr r1, [r0] + str r1, [sp, #0x30] + ldr r1, [r0, #4] + add r0, r0, #8 + str r1, [sp, #0x34] +_020C22CC: + ldrh r1, [r4, #0x1e] + tst r1, #4 + ldrne r1, [sp, #0x18] + orrne r1, r1, #2 + strne r1, [sp, #0x18] + bne _020C22F8 + ldrsh r1, [r0] + strh r1, [sp, #0x38] + ldrsh r1, [r0, #2] + add r0, r0, #4 + strh r1, [sp, #0x3a] +_020C22F8: + ldrh r1, [r4, #0x1e] + tst r1, #8 + ldrne r0, [sp, #0x18] + orrne r0, r0, #4 + strne r0, [sp, #0x18] + bne _020C2320 + ldr r1, [r0] + str r1, [sp, #0x3c] + ldr r0, [r0, #4] + str r0, [sp, #0x40] +_020C2320: + ldrb r1, [r6, #0x16] + ldr r0, _020C23F0 ; =_02110A8C + ldr r1, [r0, r1, lsl #2] + cmp r1, #0 + beq _020C233C + add r0, sp, #0x18 + blx r1 +_020C233C: + ldrb r0, [r6, #0x19] + cmp r5, r0 + bhs _020C23B4 + cmp r6, #0 + ldrne r0, [r6, #0xc] + cmpne r0, #0 + addne r2, r6, r0 + moveq r2, #0 + cmp r2, #0 + beq _020C23A0 + beq _020C238C + ldrb r0, [r2, #1] + cmp r5, r0 + bhs _020C238C + ldrh r1, [r2, #6] + ldrh r0, [r2, r1] + add r1, r2, r1 + add r1, r1, #4 + mla r1, r0, r5, r1 + b _020C2390 +_020C238C: + mov r1, #0 +_020C2390: + cmp r1, #0 + ldrne r0, [r1] + addne r2, r2, r0 + bne _020C23A4 +_020C23A0: + mov r2, #0 +_020C23A4: + ldr r0, [r2, #8] + ldr r1, [r2, #0xc] + add r0, r2, r0 + bl NNS_G3dGeSendDL +_020C23B4: + ldr r3, [r6, #0x20] + cmp r3, #0x1000 + addeq sp, sp, #0x6c + ldmeqia sp!, {r4, r5, r6, r7, pc} + add r1, sp, #0 + mov r0, #0x1b + mov r2, #3 + str r3, [sp] + str r3, [sp, #4] + str r3, [sp, #8] + bl NNS_G3dGeBufferOP_N + add sp, sp, #0x6c + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_020C23E8: .word 0x00293130 +_020C23EC: .word 0x00002B2A +_020C23F0: .word _02110A8C + arm_func_end NNS_G3dDraw1Mat1Shp + + arm_func_start NNS_G3dGeFlushBuffer +NNS_G3dGeFlushBuffer: ; 0x020C23F4 + stmdb sp!, {r3, lr} + ldr r0, _020C2448 ; =_021DD404 + ldr r0, [r0, #4] + cmp r0, #0 + beq _020C240C + bl NNS_G3dGeWaitSendDL +_020C240C: + ldr r0, _020C2448 ; =_021DD404 + ldr r0, [r0] + cmp r0, #0 + ldrne r2, [r0] + cmpne r2, #0 + ldmeqia sp!, {r3, pc} + ldr r1, _020C244C ; =0x04000400 + add r0, r0, #4 + mov r2, r2, lsl #2 + bl MIi_CpuSend32 + ldr r0, _020C2448 ; =_021DD404 + mov r1, #0 + ldr r0, [r0] + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020C2448: .word _021DD404 +_020C244C: .word 0x04000400 + arm_func_end NNS_G3dGeFlushBuffer + + arm_func_start NNS_G3dGeWaitSendDL +NNS_G3dGeWaitSendDL: ; 0x020C2450 + ldr r0, _020C2464 ; =_021DD404 +_020C2454: + ldr r1, [r0, #4] + cmp r1, #0 + bne _020C2454 + bx lr + .align 2, 0 +_020C2464: .word _021DD404 + arm_func_end NNS_G3dGeWaitSendDL + + arm_func_start simpleUnlock_ +simpleUnlock_: ; 0x020C2468 + mov r1, #0 + str r1, [r0] + bx lr + arm_func_end simpleUnlock_ + + arm_func_start NNS_G3dGeSendDL +NNS_G3dGeSendDL: ; 0x020C2474 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + cmp r4, #0x100 + blo _020C249C + ldr r1, _020C2518 ; =GXi_DmaId + mvn r0, #0 + ldr r1, [r1] + cmp r1, r0 + bne _020C24B4 +_020C249C: + mov r2, r4, lsr #2 + ldr r0, [r5] + add r1, r5, #4 + sub r2, r2, #1 + bl NNS_G3dGeBufferOP_N + ldmia sp!, {r3, r4, r5, pc} +_020C24B4: + bl NNS_G3dGeFlushBuffer + ldr r0, _020C251C ; =_021DD404 + mov r1, #1 + str r1, [r0, #4] + ldr r0, [r0, #8] + cmp r0, #0 + beq _020C24F4 + ldr r1, _020C2520 ; =_021DD408 + ldr r0, _020C2518 ; =GXi_DmaId + str r1, [sp] + ldr r0, [r0] + ldr r3, _020C2524 ; =simpleUnlock_ + mov r1, r5 + mov r2, r4 + bl MI_SendGXCommandAsyncFast + ldmia sp!, {r3, r4, r5, pc} +_020C24F4: + ldr r1, _020C2520 ; =_021DD408 + ldr r0, _020C2518 ; =GXi_DmaId + str r1, [sp] + ldr r0, [r0] + ldr r3, _020C2524 ; =simpleUnlock_ + mov r1, r5 + mov r2, r4 + bl MI_SendGXCommandAsync + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C2518: .word GXi_DmaId +_020C251C: .word _021DD404 +_020C2520: .word _021DD408 +_020C2524: .word simpleUnlock_ + arm_func_end NNS_G3dGeSendDL + + arm_func_start NNS_G3dGeBufferOP_N +NNS_G3dGeBufferOP_N: ; 0x020C2528 + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _020C2604 ; =_021DD404 + mov r6, r0 + ldr ip, [r3] + mov r5, r1 + mov r4, r2 + cmp ip, #0 + beq _020C25DC + ldr r0, [r3, #4] + cmp r0, #0 + beq _020C25B0 + ldr r2, [ip] + add r0, r2, #1 + add r1, r0, r4 + cmp r1, #0xc0 + bhi _020C25B0 + str r0, [ip] + ldr r0, [r3] + cmp r4, #0 + add r0, r0, r2, lsl #2 + str r6, [r0, #4] + ldmeqia sp!, {r4, r5, r6, pc} + ldr r2, [r3] + mov r0, r5 + ldr r1, [r2], #4 + add r1, r2, r1, lsl #2 + mov r2, r4, lsl #2 + bl MIi_CpuCopyFast + ldr r0, _020C2604 ; =_021DD404 + ldr r1, [r0] + ldr r0, [r1] + add r0, r0, r4 + str r0, [r1] + ldmia sp!, {r4, r5, r6, pc} +_020C25B0: + ldr r0, [ip] + cmp r0, #0 + beq _020C25C4 + bl NNS_G3dGeFlushBuffer + b _020C25EC +_020C25C4: + ldr r0, _020C2604 ; =_021DD404 + ldr r0, [r0, #4] + cmp r0, #0 + beq _020C25EC + bl NNS_G3dGeWaitSendDL + b _020C25EC +_020C25DC: + ldr r0, [r3, #4] + cmp r0, #0 + beq _020C25EC + bl NNS_G3dGeWaitSendDL +_020C25EC: + ldr r1, _020C2608 ; =0x04000400 + mov r0, r5 + mov r2, r4, lsl #2 + str r6, [r1] + bl MIi_CpuSend32 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C2604: .word _021DD404 +_020C2608: .word 0x04000400 + arm_func_end NNS_G3dGeBufferOP_N + + arm_func_start NNS_G3dGetCurrentMtx +NNS_G3dGetCurrentMtx: ; 0x020C260C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x40 + mov r6, r0 + mov r5, r1 + bl NNS_G3dGeFlushBuffer + ldr r0, _020C2690 ; =0x04000440 + mov r1, #0 + str r1, [r0] + str r1, [r0, #4] + str r1, [r0, #0x14] + cmp r6, #0 + beq _020C265C + add r4, sp, #0 +_020C2640: + mov r0, r4 + bl G3X_GetClipMtx + cmp r0, #0 + bne _020C2640 + add r0, sp, #0 + mov r1, r6 + bl MTX_Copy44To43_ +_020C265C: + cmp r5, #0 + beq _020C2674 +_020C2664: + mov r0, r5 + bl G3X_GetVectorMtx + cmp r0, #0 + bne _020C2664 +_020C2674: + ldr r1, _020C2694 ; =0x04000448 + mov r0, #1 + str r0, [r1] + mov r0, #2 + str r0, [r1, #-8] + add sp, sp, #0x40 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C2690: .word 0x04000440 +_020C2694: .word 0x04000448 + arm_func_end NNS_G3dGetCurrentMtx + + arm_func_start NNS_G3dInit +NNS_G3dInit: ; 0x020C2698 + stmdb sp!, {r3, lr} + bl G3X_Init + bl NNS_G3dGlbInit + ldr r1, _020C26BC ; =0x04000600 + ldr r0, [r1] + bic r0, r0, #0xc0000000 + orr r0, r0, #0x80000000 + str r0, [r1] + ldmia sp!, {r3, pc} + .align 2, 0 +_020C26BC: .word 0x04000600 + arm_func_end NNS_G3dInit + + arm_func_start NNS_G3dResDefaultSetup +NNS_G3dResDefaultSetup: ; 0x020C26C0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldr r2, [sl] + ldr r1, _020C28DC ; =0x30415642 + cmp r2, r1 + bhi _020C270C + bhs _020C28CC + sub r0, r1, #0x900 + cmp r2, r0 + bhi _020C26FC + bhs _020C28CC + sub r0, r1, #0x1300 + cmp r2, r0 + beq _020C28CC + b _020C28D4 +_020C26FC: + sub r0, r1, #0x200 + cmp r2, r0 + beq _020C28CC + b _020C28D4 +_020C270C: + ldr r0, _020C28E0 ; =0x30505442 + cmp r2, r0 + bhi _020C272C + bhs _020C28CC + ldr r0, _020C28E4 ; =0x30444D42 + cmp r2, r0 + beq _020C2738 + b _020C28D4 +_020C272C: + add r0, r0, #0x80000 + cmp r2, r0 + bne _020C28D4 +_020C2738: + mov r5, #1 + mov r0, sl + mov r6, r5 + mov r7, r5 + bl NNS_G3dGetTex + movs r4, r0 + beq _020C289C + bl NNS_G3dTexGetRequiredSize + mov sb, r0 + mov r0, r4 + bl NNS_G3dTex4x4GetRequiredSize + mov r8, r0 + mov r0, r4 + bl NNS_G3dPlttGetRequiredSize + str r0, [sp] + cmp sb, #0 + beq _020C27A0 + ldr r0, _020C28E8 ; =NNS_GfdDefaultFuncAllocTexVram + mov r1, #0 + ldr r3, [r0] + mov r0, sb + mov r2, r1 + blx r3 + movs fp, r0 + moveq r5, #0 + b _020C27A4 +_020C27A0: + mov fp, #0 +_020C27A4: + cmp r8, #0 + beq _020C27D0 + ldr r1, _020C28E8 ; =NNS_GfdDefaultFuncAllocTexVram + mov r0, r8 + ldr r3, [r1] + mov r1, #1 + mov r2, #0 + blx r3 + movs r8, r0 + moveq r6, #0 + b _020C27D4 +_020C27D0: + mov r8, #0 +_020C27D4: + ldr r0, [sp] + cmp r0, #0 + beq _020C2804 + ldr r1, _020C28EC ; =NNS_GfdDefaultFuncAllocPlttVram + ldrh r2, [r4, #0x20] + ldr r3, [r1] + and r1, r2, #0x8000 + mov r2, #0 + blx r3 + movs sb, r0 + moveq r7, #0 + b _020C2808 +_020C2804: + mov sb, #0 +_020C2808: + cmp r5, #0 + cmpne r6, #0 + cmpne r7, #0 + bne _020C2868 + cmp r7, #0 + beq _020C2830 + ldr r1, _020C28F0 ; =NNS_GfdDefaultFuncFreePlttVram + mov r0, sb + ldr r1, [r1] + blx r1 +_020C2830: + cmp r6, #0 + beq _020C2848 + ldr r1, _020C28F4 ; =NNS_GfdDefaultFuncFreeTexVram + mov r0, r8 + ldr r1, [r1] + blx r1 +_020C2848: + cmp r5, #0 + beq _020C2860 + ldr r1, _020C28F4 ; =NNS_GfdDefaultFuncFreeTexVram + mov r0, fp + ldr r1, [r1] + blx r1 +_020C2860: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C2868: + mov r0, r4 + mov r1, fp + mov r2, r8 + bl NNS_G3dTexSetTexKey + mov r0, r4 + mov r1, sb + bl NNS_G3dPlttSetPlttKey + mov r0, r4 + mov r1, #1 + bl NNS_G3dTexLoad + mov r0, r4 + mov r1, #1 + bl NNS_G3dPlttLoad +_020C289C: + ldr r1, [sl] + ldr r0, _020C28E4 ; =0x30444D42 + cmp r1, r0 + bne _020C28C4 + mov r0, sl + bl NNS_G3dGetMdlSet + cmp r4, #0 + beq _020C28C4 + mov r1, r4 + bl NNS_G3dBindMdlSet +_020C28C4: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C28CC: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C28D4: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C28DC: .word 0x30415642 +_020C28E0: .word 0x30505442 +_020C28E4: .word 0x30444D42 +_020C28E8: .word NNS_GfdDefaultFuncAllocTexVram +_020C28EC: .word NNS_GfdDefaultFuncAllocPlttVram +_020C28F0: .word NNS_GfdDefaultFuncFreePlttVram +_020C28F4: .word NNS_GfdDefaultFuncFreeTexVram + arm_func_end NNS_G3dResDefaultSetup + + arm_func_start NNS_G3dScrPosToWorldLine +NNS_G3dScrPosToWorldLine: ; 0x020C28F8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov r7, r0 + mov r6, r1 + mov fp, r2 + mov r4, r3 + add r0, sp, #0x20 + add r1, sp, #0x1c + add r2, sp, #0x18 + add r3, sp, #0x14 + bl NNS_G3dGlbGetViewPort + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x1c] + ldr r2, [sp, #0x20] + sub r5, r1, r0 + ldr r1, [sp, #0x18] + sub r0, r7, r2 + sub r1, r1, r2 + mov r0, r0, lsl #0xc + mov r1, r1, lsl #0xc + bl FX_Div + rsb r1, r5, #0 + mov r5, r0 + ldr r0, [sp, #0x1c] + mov r1, r1, lsl #0xc + add r0, r6, r0 + sub r0, r0, #0xbf + mov r0, r0, lsl #0xc + bl FX_Div + cmp r5, #0 + cmpge r0, #0 + blt _020C2984 + cmp r5, #0x1000 + cmple r0, #0x1000 + ble _020C2990 +_020C2984: + mvn r1, #0 + str r1, [sp, #0x10] + b _020C2998 +_020C2990: + mov r1, #0 + str r1, [sp, #0x10] +_020C2998: + sub r1, r5, #0x800 + sub r0, r0, #0x800 + mov r8, r1, lsl #1 + mov sl, r0, lsl #1 + bl NNS_G3dGlbGetInvVP + mov r5, r0 + ldr r0, [r5, #0x1c] + ldr r1, [r5, #0xc] + smull r2, r0, sl, r0 + smlal r2, r0, r8, r1 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + ldr r0, [r5, #0x3c] + ldr r1, [r5, #0x2c] + add r0, r0, r2 + str r0, [sp, #0xc] + sub r0, r0, r1 + bl FX_InvAsync + ldr r0, [r5, #0x10] + ldr r2, [r5] + smull r3, r0, sl, r0 + smlal r3, r0, r8, r2 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + ldr r6, [r5, #0x30] + ldr r3, [r5, #4] + add r6, r6, r2 + ldr r2, [r5, #0x14] + ldr r1, [r5, #0x34] + smull r7, r2, sl, r2 + smlal r7, r2, r8, r3 + mov r3, r7, lsr #0xc + orr r3, r3, r2, lsl #20 + add r7, r1, r3 + ldr r1, [r5, #0x18] + ldr r2, [r5, #8] + smull r3, r1, sl, r1 + smlal r3, r1, r8, r2 + mov r2, r3, lsr #0xc + ldr r0, [r5, #0x38] + orr r2, r2, r1, lsl #20 + cmp r4, #0 + add r8, r0, r2 + beq _020C2A78 + ldr r0, [r5, #0x20] + ldr r3, [r5, #0x24] + add r0, r6, r0 + str r0, [sp, #4] + add r0, r7, r3 + str r0, [sp] + ldr r2, [r5, #0x28] + ldr r1, [r5, #0x2c] + ldr r0, [sp, #0xc] + add sb, r8, r2 + add r0, r0, r1 + str r0, [sp, #8] +_020C2A78: + ldr r2, [r5, #0x20] + ldr r1, [r5, #0x24] + ldr r0, [r5, #0x28] + sub r6, r6, r2 + sub r7, r7, r1 + sub r8, r8, r0 + bl FX_GetDivResultFx64c + mov r5, r0 + mov sl, r1 + cmp r4, #0 + beq _020C2AAC + ldr r0, [sp, #8] + bl FX_InvAsync +_020C2AAC: + mov r0, r6, asr #0x1f + umull r2, r1, r5, r6 + adds r2, r2, #0x80000000 + mla r1, r5, r0, r1 + mla r1, sl, r6, r1 + adc r2, r1, #0 + umull r0, r1, r5, r7 + str r2, [fp] + adds r0, r0, #0x80000000 + mov r0, r7, asr #0x1f + mla r1, r5, r0, r1 + mla r1, sl, r7, r1 + adc r0, r1, #0 + str r0, [fp, #4] + umull r0, r1, r5, r8 + adds r0, r0, #0x80000000 + mov r0, r8, asr #0x1f + mla r1, r5, r0, r1 + mla r1, sl, r8, r1 + adc r0, r1, #0 + str r0, [fp, #8] + cmp r4, #0 + beq _020C2B70 + bl FX_GetDivResultFx64c + ldr r2, [sp, #4] + umull r6, r5, r0, r2 + mov r2, r2, asr #0x1f + mla r5, r0, r2, r5 + ldr r2, [sp] + adds r6, r6, #0x80000000 + mov r7, r2, asr #0x1f + umull r3, r2, r0, r2 + mla r2, r0, r7, r2 + mov r7, sb, asr #0x1f + umull r8, r6, r0, sb + mla r6, r0, r7, r6 + ldr r0, [sp, #4] + mla r6, r1, sb, r6 + mla r5, r1, r0, r5 + adc r0, r5, #0 + str r0, [r4] + ldr r0, [sp] + mla r2, r1, r0, r2 + adds r0, r3, #0x80000000 + adc r2, r2, #0 + adds r0, r8, #0x80000000 + str r2, [r4, #4] + adc r0, r6, #0 + str r0, [r4, #8] +_020C2B70: + ldr r0, [sp, #0x10] + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNS_G3dScrPosToWorldLine + + arm_func_start NNS_G3dAllocAnmObj +NNS_G3dAllocAnmObj: ; 0x020C2B7C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + mov r1, r2 + bl NNS_G3dAnmObjCalcSizeRequired + mov r1, r0 + mov r0, r4 + bl NNS_FndAllocFromAllocator + ldmia sp!, {r4, pc} + arm_func_end NNS_G3dAllocAnmObj + + arm_func_start NNS_G3dFreeAnmObj +NNS_G3dFreeAnmObj: ; 0x020C2BA0 + ldr ip, _020C2BA8 ; =NNS_FndFreeToAllocator + bx ip + .align 2, 0 +_020C2BA8: .word NNS_FndFreeToAllocator + arm_func_end NNS_G3dFreeAnmObj + + arm_func_start NNSi_G3dModifyMatFlag +NNSi_G3dModifyMatFlag: ; 0x020C2BAC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + cmp r0, #0 + ldrne r4, [r0, #8] + ldrb r3, [r0, #0x18] + cmpne r4, #0 + addne lr, r0, r4 + moveq lr, #0 + cmp r3, #0 + mov ip, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} + mvn r4, r2 + add r0, lr, #4 + mov r7, ip + mov r6, ip +_020C2BE4: + cmp lr, #0 + beq _020C2C2C + cmp r0, #0 + beq _020C2C18 + ldrb r5, [lr, #5] + cmp ip, r5 + bhs _020C2C18 + ldrh r8, [lr, #0xa] + ldrh r5, [r0, r8] + add r8, r0, r8 + add r8, r8, #4 + mla r8, r5, ip, r8 + b _020C2C1C +_020C2C18: + mov r8, r7 +_020C2C1C: + cmp r8, #0 + ldrne r5, [r8] + addne r8, lr, r5 + bne _020C2C30 +_020C2C2C: + mov r8, r6 +_020C2C30: + ldrh r5, [r8, #0x1e] + cmp r1, #0 + add ip, ip, #1 + orrne r5, r5, r2 + andeq r5, r5, r4 + strh r5, [r8, #0x1e] + cmp ip, r3 + blo _020C2BE4 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G3dModifyMatFlag + + arm_func_start NNSi_G3dModifyPolygonAttrMask +NNSi_G3dModifyPolygonAttrMask: ; 0x020C2C54 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + cmp r0, #0 + ldrne r4, [r0, #8] + ldrb r3, [r0, #0x18] + cmpne r4, #0 + addne lr, r0, r4 + moveq lr, #0 + cmp r3, #0 + mov ip, #0 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} + mvn r4, r2 + add r0, lr, #4 + mov r7, ip + mov r6, ip +_020C2C8C: + cmp lr, #0 + beq _020C2CD4 + cmp r0, #0 + beq _020C2CC0 + ldrb r5, [lr, #5] + cmp ip, r5 + bhs _020C2CC0 + ldrh r8, [lr, #0xa] + ldrh r5, [r0, r8] + add r8, r0, r8 + add r8, r8, #4 + mla r8, r5, ip, r8 + b _020C2CC4 +_020C2CC0: + mov r8, r7 +_020C2CC4: + cmp r8, #0 + ldrne r5, [r8] + addne r8, lr, r5 + bne _020C2CD8 +_020C2CD4: + mov r8, r6 +_020C2CD8: + ldr r5, [r8, #0x10] + cmp r1, #0 + orrne r5, r5, r2 + andeq r5, r5, r4 + add ip, ip, #1 + str r5, [r8, #0x10] + cmp ip, r3 + blo _020C2C8C + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G3dModifyPolygonAttrMask + + arm_func_start NNS_G3dMdlSetMdlDiff +NNS_G3dMdlSetMdlDiff: ; 0x020C2CFC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2D5C + adds ip, lr, #4 + beq _020C2D48 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2D48 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2D4C +_020C2D48: + mov r1, #0 +_020C2D4C: + cmp r1, #0 + ldrne r0, [r1] + addne r3, lr, r0 + bne _020C2D60 +_020C2D5C: + mov r3, #0 +_020C2D60: + mov r0, #0x8000 + ldr r1, [r3, #4] + rsb r0, r0, #0 + and r0, r1, r0 + orr r0, r0, r2 + str r0, [r3, #4] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlDiff + + arm_func_start NNS_G3dMdlSetMdlAmb +NNS_G3dMdlSetMdlAmb: ; 0x020C2D7C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2DDC + adds ip, lr, #4 + beq _020C2DC8 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2DC8 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2DCC +_020C2DC8: + mov r1, #0 +_020C2DCC: + cmp r1, #0 + ldrne r0, [r1] + addne r3, lr, r0 + bne _020C2DE0 +_020C2DDC: + mov r3, #0 +_020C2DE0: + ldr r1, [r3, #4] + ldr r0, _020C2DF8 ; =0x8000FFFF + and r0, r1, r0 + orr r0, r0, r2, lsl #16 + str r0, [r3, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020C2DF8: .word 0x8000FFFF + arm_func_end NNS_G3dMdlSetMdlAmb + + arm_func_start NNS_G3dMdlSetMdlSpec +NNS_G3dMdlSetMdlSpec: ; 0x020C2DFC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2E5C + adds ip, lr, #4 + beq _020C2E48 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2E48 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2E4C +_020C2E48: + mov r1, #0 +_020C2E4C: + cmp r1, #0 + ldrne r0, [r1] + addne r3, lr, r0 + bne _020C2E60 +_020C2E5C: + mov r3, #0 +_020C2E60: + mov r0, #0x8000 + ldr r1, [r3, #8] + rsb r0, r0, #0 + and r0, r1, r0 + orr r0, r0, r2 + str r0, [r3, #8] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlSpec + + arm_func_start NNS_G3dMdlSetMdlEmi +NNS_G3dMdlSetMdlEmi: ; 0x020C2E7C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2EDC + adds ip, lr, #4 + beq _020C2EC8 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2EC8 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2ECC +_020C2EC8: + mov r1, #0 +_020C2ECC: + cmp r1, #0 + ldrne r0, [r1] + addne r3, lr, r0 + bne _020C2EE0 +_020C2EDC: + mov r3, #0 +_020C2EE0: + ldr r1, [r3, #8] + ldr r0, _020C2EF8 ; =0x8000FFFF + and r0, r1, r0 + orr r0, r0, r2, lsl #16 + str r0, [r3, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020C2EF8: .word 0x8000FFFF + arm_func_end NNS_G3dMdlSetMdlEmi + + arm_func_start NNS_G3dMdlSetMdlLightEnableFlag +NNS_G3dMdlSetMdlLightEnableFlag: ; 0x020C2EFC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2F5C + adds ip, lr, #4 + beq _020C2F48 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2F48 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2F4C +_020C2F48: + mov r1, #0 +_020C2F4C: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C2F60 +_020C2F5C: + mov r1, #0 +_020C2F60: + ldr r0, [r1, #0xc] + bic r0, r0, #0xf + orr r0, r0, r2 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlLightEnableFlag + + arm_func_start NNS_G3dMdlSetMdlPolygonMode +NNS_G3dMdlSetMdlPolygonMode: ; 0x020C2F74 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C2FD4 + adds ip, lr, #4 + beq _020C2FC0 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C2FC0 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C2FC4 +_020C2FC0: + mov r1, #0 +_020C2FC4: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C2FD8 +_020C2FD4: + mov r1, #0 +_020C2FD8: + ldr r0, [r1, #0xc] + bic r0, r0, #0x30 + orr r0, r0, r2, lsl #4 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlPolygonMode + + arm_func_start NNS_G3dMdlSetMdlCullMode +NNS_G3dMdlSetMdlCullMode: ; 0x020C2FEC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C304C + adds ip, lr, #4 + beq _020C3038 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C3038 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C303C +_020C3038: + mov r1, #0 +_020C303C: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C3050 +_020C304C: + mov r1, #0 +_020C3050: + ldr r0, [r1, #0xc] + bic r0, r0, #0xc0 + orr r0, r0, r2, lsl #6 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlCullMode + + arm_func_start NNS_G3dMdlSetMdlPolygonID +NNS_G3dMdlSetMdlPolygonID: ; 0x020C3064 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C30C4 + adds ip, lr, #4 + beq _020C30B0 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C30B0 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C30B4 +_020C30B0: + mov r1, #0 +_020C30B4: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C30C8 +_020C30C4: + mov r1, #0 +_020C30C8: + ldr r0, [r1, #0xc] + bic r0, r0, #0x3f000000 + orr r0, r0, r2, lsl #24 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlPolygonID + + arm_func_start NNS_G3dMdlSetMdlAlpha +NNS_G3dMdlSetMdlAlpha: ; 0x020C30DC + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C313C + adds ip, lr, #4 + beq _020C3128 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C3128 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C312C +_020C3128: + mov r1, #0 +_020C312C: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C3140 +_020C313C: + mov r1, #0 +_020C3140: + ldr r0, [r1, #0xc] + bic r0, r0, #0x1f0000 + orr r0, r0, r2, lsl #16 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlAlpha + + arm_func_start NNS_G3dMdlSetMdlFogEnableFlag +NNS_G3dMdlSetMdlFogEnableFlag: ; 0x020C3154 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C31B4 + adds ip, lr, #4 + beq _020C31A0 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C31A0 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C31A4 +_020C31A0: + mov r1, #0 +_020C31A4: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C31B8 +_020C31B4: + mov r1, #0 +_020C31B8: + ldr r0, [r1, #0xc] + cmp r2, #0 + orrne r0, r0, #0x8000 + biceq r0, r0, #0x8000 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlFogEnableFlag + + arm_func_start NNS_G3dMdlSetMdlDepthTestCond +NNS_G3dMdlSetMdlDepthTestCond: ; 0x020C31D0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C3230 + adds ip, lr, #4 + beq _020C321C + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C321C + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C3220 +_020C321C: + mov r1, #0 +_020C3220: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C3234 +_020C3230: + mov r1, #0 +_020C3234: + ldr r0, [r1, #0xc] + cmp r2, #0 + orrne r0, r0, #0x4000 + biceq r0, r0, #0x4000 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlDepthTestCond + + arm_func_start NNS_G3dMdlSetMdl1Dot +NNS_G3dMdlSetMdl1Dot: ; 0x020C324C + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C32AC + adds ip, lr, #4 + beq _020C3298 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C3298 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C329C +_020C3298: + mov r1, #0 +_020C329C: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C32B0 +_020C32AC: + mov r1, #0 +_020C32B0: + ldr r0, [r1, #0xc] + cmp r2, #0 + orrne r0, r0, #0x2000 + biceq r0, r0, #0x2000 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdl1Dot + + arm_func_start NNS_G3dMdlSetMdlFarClip +NNS_G3dMdlSetMdlFarClip: ; 0x020C32C8 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C3328 + adds ip, lr, #4 + beq _020C3314 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C3314 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C3318 +_020C3314: + mov r1, #0 +_020C3318: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C332C +_020C3328: + mov r1, #0 +_020C332C: + ldr r0, [r1, #0xc] + cmp r2, #0 + orrne r0, r0, #0x1000 + biceq r0, r0, #0x1000 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlFarClip + + arm_func_start NNS_G3dMdlSetMdlXLDepthUpdate +NNS_G3dMdlSetMdlXLDepthUpdate: ; 0x020C3344 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldrne r3, [r0, #8] + cmpne r3, #0 + addne lr, r0, r3 + moveq lr, #0 + cmp lr, #0 + beq _020C33A4 + adds ip, lr, #4 + beq _020C3390 + ldrb r0, [lr, #5] + cmp r1, r0 + bhs _020C3390 + ldrh r3, [lr, #0xa] + ldrh r0, [ip, r3] + add r3, ip, r3 + add r3, r3, #4 + mla r1, r0, r1, r3 + b _020C3394 +_020C3390: + mov r1, #0 +_020C3394: + cmp r1, #0 + ldrne r0, [r1] + addne r1, lr, r0 + bne _020C33A8 +_020C33A4: + mov r1, #0 +_020C33A8: + ldr r0, [r1, #0xc] + cmp r2, #0 + orrne r0, r0, #0x800 + biceq r0, r0, #0x800 + str r0, [r1, #0xc] + ldmia sp!, {r3, pc} + arm_func_end NNS_G3dMdlSetMdlXLDepthUpdate + + arm_func_start NNS_G3dMdlGetMdlLightEnableFlag +NNS_G3dMdlGetMdlLightEnableFlag: ; 0x020C33C0 + cmp r0, #0 + ldrne r2, [r0, #8] + cmpne r2, #0 + addne ip, r0, r2 + moveq ip, #0 + cmp ip, #0 + beq _020C341C + adds r3, ip, #4 + beq _020C3408 + ldrb r0, [ip, #5] + cmp r1, r0 + bhs _020C3408 + ldrh r2, [ip, #0xa] + ldrh r0, [r3, r2] + add r2, r3, r2 + add r2, r2, #4 + mla r1, r0, r1, r2 + b _020C340C +_020C3408: + mov r1, #0 +_020C340C: + cmp r1, #0 + ldrne r0, [r1] + addne r0, ip, r0 + bne _020C3420 +_020C341C: + mov r0, #0 +_020C3420: + ldr r0, [r0, #0xc] + and r0, r0, #0xf + bx lr + arm_func_end NNS_G3dMdlGetMdlLightEnableFlag + + arm_func_start NNS_G3dMdlGetMdlFogEnableFlag +NNS_G3dMdlGetMdlFogEnableFlag: ; 0x020C342C + cmp r0, #0 + ldrne r2, [r0, #8] + cmpne r2, #0 + addne ip, r0, r2 + moveq ip, #0 + cmp ip, #0 + beq _020C3488 + adds r3, ip, #4 + beq _020C3474 + ldrb r0, [ip, #5] + cmp r1, r0 + bhs _020C3474 + ldrh r2, [ip, #0xa] + ldrh r0, [r3, r2] + add r2, r3, r2 + add r2, r2, #4 + mla r1, r0, r1, r2 + b _020C3478 +_020C3474: + mov r1, #0 +_020C3478: + cmp r1, #0 + ldrne r0, [r1] + addne r0, ip, r0 + bne _020C348C +_020C3488: + mov r0, #0 +_020C348C: + ldr r0, [r0, #0xc] + and r0, r0, #0x8000 + bx lr + arm_func_end NNS_G3dMdlGetMdlFogEnableFlag + + arm_func_start NNS_G3dMdlSetMdlDiffAll +NNS_G3dMdlSetMdlDiffAll: ; 0x020C3498 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C34B4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlDiff + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C34B4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlDiffAll + + arm_func_start NNS_G3dMdlSetMdlAmbAll +NNS_G3dMdlSetMdlAmbAll: ; 0x020C34D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C34F4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlAmb + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C34F4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlAmbAll + + arm_func_start NNS_G3dMdlSetMdlSpecAll +NNS_G3dMdlSetMdlSpecAll: ; 0x020C3518 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3534: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlSpec + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3534 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlSpecAll + + arm_func_start NNS_G3dMdlSetMdlEmiAll +NNS_G3dMdlSetMdlEmiAll: ; 0x020C3558 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3574: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlEmi + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3574 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlEmiAll + + arm_func_start NNS_G3dMdlSetMdlLightEnableFlagAll +NNS_G3dMdlSetMdlLightEnableFlagAll: ; 0x020C3598 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C35B4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlLightEnableFlag + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C35B4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlLightEnableFlagAll + + arm_func_start NNS_G3dMdlSetMdlPolygonModeAll +NNS_G3dMdlSetMdlPolygonModeAll: ; 0x020C35D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C35F4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlPolygonMode + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C35F4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlPolygonModeAll + + arm_func_start NNS_G3dMdlSetMdlCullModeAll +NNS_G3dMdlSetMdlCullModeAll: ; 0x020C3618 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3634: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlCullMode + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3634 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlCullModeAll + + arm_func_start NNS_G3dMdlSetMdlPolygonIDAll +NNS_G3dMdlSetMdlPolygonIDAll: ; 0x020C3658 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3674: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlPolygonID + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3674 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlPolygonIDAll + + arm_func_start NNS_G3dMdlSetMdlAlphaAll +NNS_G3dMdlSetMdlAlphaAll: ; 0x020C3698 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C36B4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlAlpha + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C36B4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlAlphaAll + + arm_func_start NNS_G3dMdlSetMdlFogEnableFlagAll +NNS_G3dMdlSetMdlFogEnableFlagAll: ; 0x020C36D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C36F4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlFogEnableFlag + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C36F4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlFogEnableFlagAll + + arm_func_start NNS_G3dMdlSetMdlDepthTestCondAll +NNS_G3dMdlSetMdlDepthTestCondAll: ; 0x020C3718 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3734: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlDepthTestCond + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3734 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlDepthTestCondAll + + arm_func_start NNS_G3dMdlSetMdl1DotAll +NNS_G3dMdlSetMdl1DotAll: ; 0x020C3758 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C3774: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdl1Dot + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C3774 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdl1DotAll + + arm_func_start NNS_G3dMdlSetMdlFarClipAll +NNS_G3dMdlSetMdlFarClipAll: ; 0x020C3798 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C37B4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlFarClip + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C37B4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlFarClipAll + + arm_func_start NNS_G3dMdlSetMdlXLDepthUpdateAll +NNS_G3dMdlSetMdlXLDepthUpdateAll: ; 0x020C37D8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrb r0, [r6, #0x18] + mov r5, r1 + mov r4, #0 + cmp r0, #0 + ldmlsia sp!, {r4, r5, r6, pc} +_020C37F4: + mov r0, r6 + mov r1, r4 + mov r2, r5 + bl NNS_G3dMdlSetMdlXLDepthUpdate + ldrb r0, [r6, #0x18] + add r4, r4, #1 + cmp r4, r0 + blo _020C37F4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_G3dMdlSetMdlXLDepthUpdateAll + + arm_func_start NNS_G3dGetResDataByName +NNS_G3dGetResDataByName: ; 0x020C3818 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r5, [r0, #1] + cmp r5, #0x10 + bhs _020C38E8 + ldmia r1, {r2, r3, ip, lr} + cmp r5, #0 + mov r1, #0 + bls _020C39D0 + mov r4, r1 + mov r7, r1 +_020C384C: + cmp r0, #0 + beq _020C3878 + ldrb r6, [r0, #1] + cmp r1, r6 + bhs _020C3878 + ldrh r6, [r0, #6] + add r8, r0, r6 + ldrh r6, [r8, #2] + add r6, r8, r6 + add r8, r6, r4 + b _020C387C +_020C3878: + mov r8, r7 +_020C387C: + ldr r6, [r8] + cmp r6, r2 + ldreq r6, [r8, #4] + cmpeq r6, r3 + ldreq r6, [r8, #8] + cmpeq r6, ip + ldreq r6, [r8, #0xc] + cmpeq r6, lr + bne _020C38D0 + cmp r0, #0 + beq _020C38C8 + cmp r1, r5 + bhs _020C38C8 + ldrh r3, [r0, #6] + ldrh r2, [r0, r3] + add r0, r0, r3 + add r0, r0, #4 + mla r0, r2, r1, r0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C38C8: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C38D0: + ldrb r6, [r0, #1] + add r1, r1, #1 + add r4, r4, #0x10 + cmp r1, r6 + blo _020C384C + b _020C39D0 +_020C38E8: + add r4, r0, #8 + ldrb r3, [r4, #1] + cmp r3, #0 + beq _020C39D0 + ldrb r7, [r4, r3, lsl #2] + ldrb r2, [r4] + add r6, r4, r3, lsl #2 + cmp r2, r7 + bls _020C393C +_020C390C: + mov r2, r7, asr #5 + ldr r3, [r1, r2, lsl #2] + and r2, r7, #0x1f + mov r2, r3, lsr r2 + and r2, r2, #1 + add r2, r6, r2 + ldrb r3, [r2, #1] + ldrb r2, [r6] + ldrb r7, [r4, r3, lsl #2] + add r6, r4, r3, lsl #2 + cmp r2, r7 + bhi _020C390C +_020C393C: + cmp r0, #0 + ldrb r2, [r6, #3] + beq _020C3968 + cmp r2, r5 + bhs _020C3968 + ldrh r3, [r0, #6] + add r4, r0, r3 + ldrh r3, [r4, #2] + add r3, r4, r3 + add r6, r3, r2, lsl #4 + b _020C396C +_020C3968: + mov r6, #0 +_020C396C: + ldr r4, [r6] + ldr r3, [r1] + cmp r4, r3 + ldreq r4, [r6, #4] + ldreq r3, [r1, #4] + cmpeq r4, r3 + ldreq r4, [r6, #8] + ldreq r3, [r1, #8] + cmpeq r4, r3 + ldreq r3, [r6, #0xc] + ldreq r1, [r1, #0xc] + cmpeq r3, r1 + bne _020C39D0 + cmp r0, #0 + beq _020C39C8 + cmp r2, r5 + bhs _020C39C8 + ldrh r3, [r0, #6] + ldrh r1, [r0, r3] + add r0, r0, r3 + add r0, r0, #4 + mla r0, r1, r2, r0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C39C8: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C39D0: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_G3dGetResDataByName + + arm_func_start NNS_G3dGetResDictIdxByName +NNS_G3dGetResDictIdxByName: ; 0x020C39D8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + cmp r1, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r2, [r0, #1] + cmp r2, #0x10 + bhs _020C3A7C + cmp r2, #0 + ldmia r1, {r2, r3, ip, lr} + mov r1, #0 + bls _020C3B38 + mov r4, r1 + mov r6, r1 +_020C3A0C: + cmp r0, #0 + beq _020C3A38 + ldrb r5, [r0, #1] + cmp r1, r5 + bhs _020C3A38 + ldrh r5, [r0, #6] + add r7, r0, r5 + ldrh r5, [r7, #2] + add r5, r7, r5 + add r7, r5, r4 + b _020C3A3C +_020C3A38: + mov r7, r6 +_020C3A3C: + ldr r5, [r7] + cmp r5, r2 + ldreq r5, [r7, #4] + cmpeq r5, r3 + ldreq r5, [r7, #8] + cmpeq r5, ip + ldreq r5, [r7, #0xc] + cmpeq r5, lr + moveq r0, r1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r5, [r0, #1] + add r1, r1, #1 + add r4, r4, #0x10 + cmp r1, r5 + blo _020C3A0C + b _020C3B38 +_020C3A7C: + add r5, r0, #8 + ldrb r4, [r5, #1] + cmp r4, #0 + beq _020C3B38 + ldrb r7, [r5, r4, lsl #2] + ldrb r3, [r5] + add r6, r5, r4, lsl #2 + cmp r3, r7 + bls _020C3AD0 +_020C3AA0: + mov r3, r7, asr #5 + ldr r4, [r1, r3, lsl #2] + and r3, r7, #0x1f + mov r3, r4, lsr r3 + and r3, r3, #1 + add r3, r6, r3 + ldrb r4, [r3, #1] + ldrb r3, [r6] + ldrb r7, [r5, r4, lsl #2] + add r6, r5, r4, lsl #2 + cmp r3, r7 + bhi _020C3AA0 +_020C3AD0: + cmp r0, #0 + ldrb r3, [r6, #3] + beq _020C3AFC + cmp r3, r2 + bhs _020C3AFC + ldrh r2, [r0, #6] + add r2, r0, r2 + ldrh r0, [r2, #2] + add r0, r2, r0 + add r4, r0, r3, lsl #4 + b _020C3B00 +_020C3AFC: + mov r4, #0 +_020C3B00: + ldr r2, [r4] + ldr r0, [r1] + cmp r2, r0 + ldreq r2, [r4, #4] + ldreq r0, [r1, #4] + cmpeq r2, r0 + ldreq r2, [r4, #8] + ldreq r0, [r1, #8] + cmpeq r2, r0 + ldreq r2, [r4, #0xc] + ldreq r0, [r1, #0xc] + cmpeq r2, r0 + moveq r0, r3 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020C3B38: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_G3dGetResDictIdxByName + + arm_func_start NNS_G3dGetMdlSet +NNS_G3dGetMdlSet: ; 0x020C3B40 + ldrh r1, [r0, #0xc] + ldr r1, [r0, r1] + add r0, r0, r1 + bx lr + arm_func_end NNS_G3dGetMdlSet + + arm_func_start NNS_G3dGetTex +NNS_G3dGetTex: ; 0x020C3B50 + ldrh r2, [r0, #0xc] + ldrh r1, [r0, #0xe] + add r3, r0, r2 + cmp r1, #1 + bne _020C3B80 + ldr r2, [r0] + ldr r1, _020C3B8C ; =0x30585442 + cmp r2, r1 + ldreq r1, [r3] + addeq r0, r0, r1 + movne r0, #0 + bx lr +_020C3B80: + ldr r1, [r3, #4] + add r0, r0, r1 + bx lr + .align 2, 0 +_020C3B8C: .word 0x30585442 + arm_func_end NNS_G3dGetTex + + arm_func_start NNS_G3dGetAnmByIdx +NNS_G3dGetAnmByIdx: ; 0x020C3B90 + cmp r0, #0 + beq _020C3BE4 + ldrh r2, [r0, #0xc] + ldr r2, [r0, r2] + add ip, r0, r2 + adds r3, ip, #8 + beq _020C3BD0 + ldrb r0, [ip, #9] + cmp r1, r0 + bhs _020C3BD0 + ldrh r2, [ip, #0xe] + ldrh r0, [r3, r2] + add r2, r3, r2 + add r2, r2, #4 + mla r1, r0, r1, r2 + b _020C3BD4 +_020C3BD0: + mov r1, #0 +_020C3BD4: + cmp r1, #0 + ldrne r0, [r1] + addne r0, ip, r0 + bxne lr +_020C3BE4: + mov r0, #0 + bx lr + arm_func_end NNS_G3dGetAnmByIdx + + arm_func_start NNSi_G3dGetTexPatAnmTexNameByIdx +NNSi_G3dGetTexPatAnmTexNameByIdx: ; 0x020C3BEC + cmp r0, #0 + beq _020C3C10 + ldrb r2, [r0, #6] + cmp r1, r2 + bhs _020C3C10 + ldrh r2, [r0, #8] + add r0, r0, r2 + add r0, r0, r1, lsl #4 + bx lr +_020C3C10: + mov r0, #0 + bx lr + arm_func_end NNSi_G3dGetTexPatAnmTexNameByIdx + + arm_func_start NNSi_G3dGetTexPatAnmPlttNameByIdx +NNSi_G3dGetTexPatAnmPlttNameByIdx: ; 0x020C3C18 + cmp r0, #0 + beq _020C3C3C + ldrb r2, [r0, #7] + cmp r1, r2 + bhs _020C3C3C + ldrh r2, [r0, #0xa] + add r0, r0, r2 + add r0, r0, r1, lsl #4 + bx lr +_020C3C3C: + mov r0, #0 + bx lr + arm_func_end NNSi_G3dGetTexPatAnmPlttNameByIdx + + arm_func_start NNSi_G3dGetTexPatAnmFV +NNSi_G3dGetTexPatAnmFV: ; 0x020C3C44 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r2 + bl NNSi_G3dGetTexPatAnmDataByIdx + ldrsh r1, [r0, #4] + ldrh r3, [r0, #6] + mul r2, r1, r4 + add r3, r5, r3 + mov r2, r2, lsr #0xc + b _020C3C70 +_020C3C6C: + sub r2, r2, #1 +_020C3C70: + cmp r2, #0 + beq _020C3C88 + mov r1, r2, lsl #2 + ldrh r1, [r3, r1] + cmp r1, r4 + bhs _020C3C6C +_020C3C88: + ldrh r1, [r0] + b _020C3C94 +_020C3C90: + add r2, r2, #1 +_020C3C94: + add r0, r2, #1 + cmp r0, r1 + bhs _020C3CB0 + add r0, r3, r2, lsl #2 + ldrh r0, [r0, #4] + cmp r0, r4 + bls _020C3C90 +_020C3CB0: + add r0, r3, r2, lsl #2 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_G3dGetTexPatAnmFV + + arm_func_start NNSi_G3dGetTexPatAnmDataByIdx +NNSi_G3dGetTexPatAnmDataByIdx: ; 0x020C3CB8 + adds r3, r0, #0xc + beq _020C3CE4 + ldrb r2, [r0, #0xd] + cmp r1, r2 + bhs _020C3CE4 + ldrh r0, [r0, #0x12] + ldrh r2, [r3, r0] + add r0, r3, r0 + add r0, r0, #4 + mla r0, r2, r1, r0 + bx lr +_020C3CE4: + mov r0, #0 + bx lr + arm_func_end NNSi_G3dGetTexPatAnmDataByIdx + + arm_func_start NNSi_G3dAnmObjInitNsBca +NNSi_G3dAnmObjInitNsBca: ; 0x020C3CEC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr r0, _020C3D64 ; =_02110A08 + str r4, [r5, #8] + ldr r0, [r0] + add r1, r5, #0x1a + str r0, [r5, #0xc] + ldrb r2, [r2, #0x17] + mov r0, #0 + strb r2, [r5, #0x19] + mov r2, r2, lsl #1 + bl MIi_CpuClear16 + ldrh r0, [r4, #6] + add r3, r4, #0x14 + mov r2, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, pc} +_020C3D34: + mov r0, r2, lsl #1 + ldrh r1, [r3, r0] + add r0, r5, r2, lsl #1 + add r2, r2, #1 + ldr r1, [r4, r1] + mov r1, r1, lsr #0x18 + orr r1, r1, #0x100 + strh r1, [r0, #0x1a] + ldrh r0, [r4, #6] + cmp r2, r0 + blo _020C3D34 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C3D64: .word _02110A08 + arm_func_end NNSi_G3dAnmObjInitNsBca + + arm_func_start NNSi_G3dAnmCalcNsBca +NNSi_G3dAnmCalcNsBca: ; 0x020C3D68 + stmdb sp!, {r3, lr} + mov r3, r0 + ldr r0, [r1, #8] + ldr ip, [r1] + ldrh r1, [r0, #4] + cmp ip, r1, lsl #12 + mov r1, r1, lsl #0xc + subge ip, r1, #1 + bge _020C3D94 + cmp ip, #0 + movlt ip, #0 +_020C3D94: + mov r1, r2 + mov r2, ip + bl getJntSRTAnmResult_ + ldmia sp!, {r3, pc} + arm_func_end NNSi_G3dAnmCalcNsBca + + arm_func_start getMdlTrans_ +getMdlTrans_: ; 0x020C3DA4 + ldr r1, _020C3E38 ; =_021DA700 + ldr r2, [r1] + ldr r1, [r2] + ldr ip, [r2, #0xd4] + ldrb r3, [r1, #1] + cmp ip, #0 + beq _020C3DFC + beq _020C3DE8 + ldrb r1, [ip, #1] + cmp r3, r1 + bhs _020C3DE8 + ldrh r2, [ip, #6] + ldrh r1, [ip, r2] + add r2, ip, r2 + add r2, r2, #4 + mla r2, r1, r3, r2 + b _020C3DEC +_020C3DE8: + mov r2, #0 +_020C3DEC: + cmp r2, #0 + ldrne r1, [r2] + addne r2, ip, r1 + bne _020C3E00 +_020C3DFC: + mov r2, #0 +_020C3E00: + ldrh r1, [r2] + tst r1, #1 + beq _020C3E1C + ldr r1, [r0] + orr r1, r1, #4 + str r1, [r0] + bx lr +_020C3E1C: + ldr r1, [r2, #4] + str r1, [r0, #0x4c] + ldr r1, [r2, #8] + str r1, [r0, #0x50] + ldr r1, [r2, #0xc] + str r1, [r0, #0x54] + bx lr + .align 2, 0 +_020C3E38: .word _021DA700 + arm_func_end getMdlTrans_ + + arm_func_start getMdlScale_ +getMdlScale_: ; 0x020C3E3C + stmdb sp!, {r4, lr} + ldr r1, _020C3EC8 ; =_021DA700 + ldr ip, [r1] + ldr r2, [ip] + ldr r4, [ip, #0xd4] + ldrb lr, [r2, #1] + cmp r4, #0 + beq _020C3E98 + beq _020C3E84 + ldrb r1, [r4, #1] + cmp lr, r1 + bhs _020C3E84 + ldrh r3, [r4, #6] + ldrh r1, [r4, r3] + add r3, r4, r3 + add r3, r3, #4 + mla r3, r1, lr, r3 + b _020C3E88 +_020C3E84: + mov r3, #0 +_020C3E88: + cmp r3, #0 + ldrne r1, [r3] + addne r1, r4, r1 + bne _020C3E9C +_020C3E98: + mov r1, #0 +_020C3E9C: + ldrh r3, [r1], #4 + tst r3, #1 + addeq r1, r1, #0xc + tst r3, #2 + bne _020C3EBC + tst r3, #8 + addne r1, r1, #4 + addeq r1, r1, #0x10 +_020C3EBC: + ldr ip, [ip, #0xe8] + blx ip + ldmia sp!, {r4, pc} + .align 2, 0 +_020C3EC8: .word _021DA700 + arm_func_end getMdlScale_ + + arm_func_start getMdlRot_ +getMdlRot_: ; 0x020C3ECC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _020C4038 ; =_021DA700 + mov r8, r0 + ldr r1, [r1] + ldr r0, [r1] + ldr r3, [r1, #0xd4] + ldrb r2, [r0, #1] + cmp r3, #0 + beq _020C3F2C + beq _020C3F18 + ldrb r0, [r3, #1] + cmp r2, r0 + bhs _020C3F18 + ldrh r1, [r3, #6] + ldrh r0, [r3, r1] + add r1, r3, r1 + add r1, r1, #4 + mla r1, r0, r2, r1 + b _020C3F1C +_020C3F18: + mov r1, #0 +_020C3F1C: + cmp r1, #0 + ldrne r0, [r1] + addne r5, r3, r0 + bne _020C3F30 +_020C3F2C: + mov r5, #0 +_020C3F30: + ldrh r0, [r5] + add r1, r5, #4 + tst r0, #1 + addeq r1, r1, #0xc + tst r0, #2 + bne _020C4028 + tst r0, #8 + beq _020C3FDC + and r2, r0, #0xf0 + add r0, r8, #0x28 + mov r4, r2, asr #4 + ldrsh r7, [r1] + ldrsh r6, [r1, #2] + bl MI_Zero36B + ldrh r0, [r5] + ldr r1, _020C403C ; =_021094B8 + mov r3, #0x1000 + tst r0, #0x100 + ldr r0, _020C4040 ; =_021094B8 + 1 + ldrb r1, [r1, r4, lsl #2] + ldrb r0, [r0, r4, lsl #2] + rsbne r3, r3, #0 + add r2, r8, r4, lsl #2 + str r3, [r2, #0x28] + add r1, r8, r1, lsl #2 + str r7, [r1, #0x28] + add r0, r8, r0, lsl #2 + str r6, [r0, #0x28] + ldrh r0, [r5] + tst r0, #0x200 + ldr r0, _020C4044 ; =_021094B8 + 2 + rsbne r6, r6, #0 + ldrb r0, [r0, r4, lsl #2] + add r0, r8, r0, lsl #2 + str r6, [r0, #0x28] + ldrh r0, [r5] + tst r0, #0x400 + ldr r0, _020C4048 ; =_021094B8 + 3 + rsbne r7, r7, #0 + ldrb r0, [r0, r4, lsl #2] + add r0, r8, r0, lsl #2 + str r7, [r0, #0x28] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C3FDC: + ldrsh r0, [r5, #2] + str r0, [r8, #0x28] + ldrsh r0, [r1] + str r0, [r8, #0x2c] + ldrsh r0, [r1, #2] + str r0, [r8, #0x30] + ldrsh r0, [r1, #4] + str r0, [r8, #0x34] + ldrsh r0, [r1, #6] + str r0, [r8, #0x38] + ldrsh r0, [r1, #8] + str r0, [r8, #0x3c] + ldrsh r0, [r1, #0xa] + str r0, [r8, #0x40] + ldrsh r0, [r1, #0xc] + str r0, [r8, #0x44] + ldrsh r0, [r1, #0xe] + str r0, [r8, #0x48] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C4028: + ldr r0, [r8] + orr r0, r0, #2 + str r0, [r8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C4038: .word _021DA700 +_020C403C: .word _021094B8 +_020C4040: .word _021094B8 + 1 +_020C4044: .word _021094B8 + 2 +_020C4048: .word _021094B8 + 3 + arm_func_end getMdlRot_ + + arm_func_start getJntSRTAnmResult_ +getJntSRTAnmResult_: ; 0x020C404C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + mov sb, r0 + add r0, sb, r1, lsl #1 + ldrh r0, [r0, #0x14] + mov r7, r3 + mov r8, r2 + ldr r4, [sb, r0] + add r1, sb, r0 + tst r4, #1 + movne r0, #7 + strne r0, [r7] + bne _020C43C4 + ldr r0, _020C43F8 ; =0x00000FFF + add r5, r1, #4 + tst r8, r0 + beq _020C40A0 + ldr r0, [sb, #8] + tst r0, #1 + movne r6, #1 + bne _020C40A4 +_020C40A0: + mov r6, #0 +_020C40A4: + mov r0, #0 + str r0, [r7] + tst r4, #6 + bne _020C4184 + tst r4, #8 + bne _020C40F0 + cmp r6, #0 + mov r1, r8 + mov r2, r5 + beq _020C40DC + mov r3, sb + add r0, r7, #0x4c + bl getTransDataEx_ + b _020C40E8 +_020C40DC: + mov r3, sb + add r0, r7, #0x4c + bl getTransData_ +_020C40E8: + add r5, r5, #8 + b _020C40F8 +_020C40F0: + ldr r0, [r5], #4 + str r0, [r7, #0x4c] +_020C40F8: + tst r4, #0x10 + bne _020C4134 + cmp r6, #0 + mov r1, r8 + mov r2, r5 + beq _020C4120 + mov r3, sb + add r0, r7, #0x50 + bl getTransDataEx_ + b _020C412C +_020C4120: + mov r3, sb + add r0, r7, #0x50 + bl getTransData_ +_020C412C: + add r5, r5, #8 + b _020C413C +_020C4134: + ldr r0, [r5], #4 + str r0, [r7, #0x50] +_020C413C: + tst r4, #0x20 + bne _020C4178 + cmp r6, #0 + mov r1, r8 + mov r2, r5 + beq _020C4164 + mov r3, sb + add r0, r7, #0x54 + bl getTransDataEx_ + b _020C4170 +_020C4164: + mov r3, sb + add r0, r7, #0x54 + bl getTransData_ +_020C4170: + add r5, r5, #8 + b _020C41A4 +_020C4178: + ldr r0, [r5], #4 + str r0, [r7, #0x54] + b _020C41A4 +_020C4184: + tst r4, #2 + beq _020C419C + ldr r0, [r7] + orr r0, r0, #4 + str r0, [r7] + b _020C41A4 +_020C419C: + mov r0, r7 + bl getMdlTrans_ +_020C41A4: + tst r4, #0xc0 + bne _020C4268 + tst r4, #0x100 + bne _020C41E8 + cmp r6, #0 + mov r1, r8 + mov r2, r5 + beq _020C41D4 + mov r3, sb + add r0, r7, #0x28 + bl getRotDataEx_ + b _020C41E0 +_020C41D4: + mov r3, sb + add r0, r7, #0x28 + bl getRotData_ +_020C41E0: + add r5, r5, #8 + b _020C4288 +_020C41E8: + ldr r1, [sb, #0xc] + ldr r2, [sb, #0x10] + ldr r3, [r5] + add r0, r7, #0x28 + add r1, sb, r1 + add r2, sb, r2 + bl getRotDataByIdx_ + cmp r0, #0 + beq _020C4260 + ldr ip, [r7, #0x3c] + ldr r0, [r7, #0x2c] + ldr r3, [r7, #0x28] + ldr fp, [r7, #0x38] + ldr r1, [r7, #0x30] + ldr r2, [r7, #0x34] + mul sl, r0, ip + mul lr, r1, fp + sub sl, sl, lr + mov sl, sl, asr #0xc + mul lr, r1, r2 + mul r1, r3, ip + sub r1, lr, r1 + mul fp, r3, fp + mul r2, r0, r2 + sub r0, fp, r2 + str sl, [r7, #0x40] + mov r1, r1, asr #0xc + str r1, [r7, #0x44] + mov r0, r0, asr #0xc + str r0, [r7, #0x48] +_020C4260: + add r5, r5, #4 + b _020C4288 +_020C4268: + tst r4, #0x40 + beq _020C4280 + ldr r0, [r7] + orr r0, r0, #2 + str r0, [r7] + b _020C4288 +_020C4280: + mov r0, r7 + bl getMdlRot_ +_020C4288: + tst r4, #0x600 + bne _020C439C + tst r4, #0x800 + bne _020C42D8 + cmp r6, #0 + add r0, sp, #0x10 + mov r1, r8 + beq _020C42B8 + mov r2, r5 + mov r3, sb + bl getScaleDataEx_ + b _020C42C4 +_020C42B8: + mov r2, r5 + mov r3, sb + bl getScaleData_ +_020C42C4: + ldr r1, [sp, #0x10] + ldr r0, [sp, #0x14] + str r1, [sp, #0x18] + str r0, [sp, #0x24] + b _020C42E8 +_020C42D8: + ldr r0, [r5] + str r0, [sp, #0x18] + ldr r0, [r5, #4] + str r0, [sp, #0x24] +_020C42E8: + tst r4, #0x1000 + bne _020C4330 + cmp r6, #0 + add r0, sp, #8 + mov r1, r8 + beq _020C4310 + mov r3, sb + add r2, r5, #8 + bl getScaleDataEx_ + b _020C431C +_020C4310: + mov r3, sb + add r2, r5, #8 + bl getScaleData_ +_020C431C: + ldr r1, [sp, #8] + ldr r0, [sp, #0xc] + str r1, [sp, #0x1c] + str r0, [sp, #0x28] + b _020C4340 +_020C4330: + ldr r0, [r5, #8] + str r0, [sp, #0x1c] + ldr r0, [r5, #0xc] + str r0, [sp, #0x28] +_020C4340: + tst r4, #0x2000 + bne _020C4388 + cmp r6, #0 + add r0, sp, #0 + mov r1, r8 + beq _020C4368 + mov r3, sb + add r2, r5, #0x10 + bl getScaleDataEx_ + b _020C4374 +_020C4368: + mov r3, sb + add r2, r5, #0x10 + bl getScaleData_ +_020C4374: + ldr r1, [sp] + ldr r0, [sp, #4] + str r1, [sp, #0x20] + str r0, [sp, #0x2c] + b _020C43C4 +_020C4388: + ldr r0, [r5, #0x10] + str r0, [sp, #0x20] + ldr r0, [r5, #0x14] + str r0, [sp, #0x2c] + b _020C43C4 +_020C439C: + tst r4, #0x200 + beq _020C43B4 + ldr r0, [r7] + orr r0, r0, #1 + str r0, [r7] + b _020C43C4 +_020C43B4: + mov r0, r7 + bl getMdlScale_ + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C43C4: + ldr r0, [r7] + add r1, sp, #0x18 + tst r0, #1 + ldr r0, _020C43FC ; =_021DA700 + movne r3, #4 + ldr r4, [r0] + moveq r3, #0 + ldr r2, [r4] + ldr r4, [r4, #0xe8] + mov r0, r7 + blx r4 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C43F8: .word 0x00000FFF +_020C43FC: .word _021DA700 + arm_func_end getJntSRTAnmResult_ + + arm_func_start getTransData_ +getTransData_: ; 0x020C4400 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [r2, #4] + ldr ip, [r2] + mov r5, r1, asr #0xc + tst ip, #0xc0000000 + add r1, r3, r4 + beq _020C453C + ldr r2, _020C455C ; =0x1FFF0000 + tst ip, #0x40000000 + and r2, ip, r2 + mov r3, r2, lsr #0x10 + beq _020C4458 + tst r5, #1 + beq _020C4450 + cmp r5, r3 + movhi r2, r3, lsr #1 + addhi r5, r2, #1 + bhi _020C453C + mov r4, r5, lsr #1 + b _020C44FC +_020C4450: + mov r5, r5, lsr #1 + b _020C453C +_020C4458: + ands r2, r5, #3 + beq _020C44F4 + cmp r5, r3 + addhi r5, r2, r3, lsr #2 + bhi _020C453C + tst r5, #1 + beq _020C44EC + tst r5, #2 + movne r5, r5, lsr #2 + addne r2, r5, #1 + moveq r2, r5, lsr #2 + addeq r5, r2, #1 + tst ip, #0x20000000 + beq _020C44B4 + mov r3, r2, lsl #1 + mov r2, r5, lsl #1 + ldrsh r3, [r1, r3] + ldrsh r1, [r1, r2] + add r2, r3, r3, lsl #1 + add r1, r2, r1 + mov r1, r1, asr #2 + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} +_020C44B4: + ldr ip, [r1, r2, lsl #2] + mov r2, #3 + mov r3, #0 + umull r4, lr, ip, r2 + mla lr, ip, r3, lr + mov r3, ip, asr #0x1f + mla lr, r3, r2, lr + ldr r1, [r1, r5, lsl #2] + adds r2, r4, r1 + adc r1, lr, r1, asr #31 + mov r2, r2, lsr #2 + orr r2, r2, r1, lsl #30 + str r2, [r0] + ldmia sp!, {r3, r4, r5, pc} +_020C44EC: + mov r4, r5, lsr #2 + b _020C44FC +_020C44F4: + mov r5, r5, lsr #2 + b _020C453C +_020C44FC: + tst ip, #0x20000000 + beq _020C4520 + mov r3, r4, lsl #1 + add r2, r1, r4, lsl #1 + ldrsh r3, [r1, r3] + ldrsh r1, [r2, #2] + add r1, r3, r1 + mov r1, r1, asr #1 + b _020C4534 +_020C4520: + add r2, r1, r4, lsl #2 + ldr r2, [r2, #4] + ldr r3, [r1, r4, lsl #2] + mov r1, r2, asr #1 + add r1, r1, r3, asr #1 +_020C4534: + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} +_020C453C: + tst ip, #0x20000000 + ldreq r1, [r1, r5, lsl #2] + streq r1, [r0] + ldmeqia sp!, {r3, r4, r5, pc} + mov r2, r5, lsl #1 + ldrsh r1, [r1, r2] + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C455C: .word 0x1FFF0000 + arm_func_end getTransData_ + + arm_func_start getTransDataEx_ +getTransDataEx_: ; 0x020C4560 + stmdb sp!, {r3, r4, r5, lr} + ldrh r4, [r3, #4] + ldr ip, [r2, #4] + mov lr, r1, asr #0xc + sub r4, r4, #1 + cmp r4, r1, asr #12 + add ip, r3, ip + ldr r2, [r2] + bne _020C45FC + tst r2, #0xc0000000 + beq _020C45A0 + tst r2, #0x40000000 + andne r4, lr, #1 + addne lr, r4, lr, lsr #1 + andeq r4, lr, #3 + addeq lr, r4, lr, lsr #2 +_020C45A0: + ldr r3, [r3, #8] + tst r3, #2 + beq _020C45E4 + ldr r3, _020C46B0 ; =0x00000FFF + tst r2, #0x20000000 + and r2, r1, r3 + ldreq r3, [ip, lr, lsl #2] + ldreq r1, [ip] + beq _020C45D0 + mov r1, lr, lsl #1 + ldrsh r3, [ip, r1] + ldrsh r1, [ip] +_020C45D0: + sub r1, r1, r3 + mul r1, r2, r1 + add r1, r3, r1, asr #12 + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} +_020C45E4: + tst r2, #0x20000000 + movne r1, lr, lsl #1 + ldrnesh r1, [ip, r1] + ldreq r1, [ip, lr, lsl #2] + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} +_020C45FC: + tst r2, #0xc0000000 + beq _020C4660 + ldr r3, _020C46B4 ; =0x1FFF0000 + tst r2, #0x40000000 + and r4, r2, r3 + mov r4, r4, lsr #0x10 + beq _020C4638 + cmp lr, r4 + movhs lr, r4, lsr #1 + bhs _020C4660 + mov lr, lr, lsr #1 + and r1, r1, r3, lsr #16 + mov r4, #2 + mov r5, #1 + b _020C4670 +_020C4638: + cmp lr, r4 + andhs r3, lr, #3 + addhs lr, r3, lr, lsr #2 + bhs _020C4660 + ldr r3, _020C46B8 ; =0x00003FFF + mov lr, lr, lsr #2 + and r1, r1, r3 + mov r4, #4 + mov r5, #2 + b _020C4670 +_020C4660: + ldr r3, _020C46B0 ; =0x00000FFF + mov r4, #1 + and r1, r1, r3 + mov r5, #0 +_020C4670: + tst r2, #0x20000000 + addeq r2, ip, lr, lsl #2 + ldreq ip, [ip, lr, lsl #2] + ldreq r2, [r2, #4] + beq _020C4694 + add r2, ip, lr, lsl #1 + mov r3, lr, lsl #1 + ldrsh ip, [ip, r3] + ldrsh r2, [r2, #2] +_020C4694: + sub r2, r2, ip + mul r3, ip, r4 + mul r2, r1, r2 + add r1, r3, r2, asr #12 + mov r1, r1, asr r5 + str r1, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C46B0: .word 0x00000FFF +_020C46B4: .word 0x1FFF0000 +_020C46B8: .word 0x00003FFF + arm_func_end getTransDataEx_ + + arm_func_start getScaleData_ +getScaleData_: ; 0x020C46BC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, [r2, #4] + ldr r5, [r2] + mov r6, r1, asr #0xc + tst r5, #0xc0000000 + add r1, r3, r4 + beq _020C4808 + ldr r2, _020C48AC ; =0x1FFF0000 + tst r5, #0x40000000 + and r2, r5, r2 + mov r3, r2, lsr #0x10 + beq _020C4714 + tst r6, #1 + beq _020C470C + cmp r6, r3 + movhi r2, r3, lsr #1 + addhi r6, r2, #1 + bhi _020C4808 + mov r4, r6, lsr #1 + b _020C4840 +_020C470C: + mov r6, r6, lsr #1 + b _020C4808 +_020C4714: + ands r2, r6, #3 + beq _020C4804 + cmp r6, r3 + addhi r6, r2, r3, lsr #2 + bhi _020C4808 + tst r6, #1 + beq _020C47FC + tst r6, #2 + movne r3, r6, lsr #2 + addne r2, r3, #1 + moveq r2, r6, lsr #2 + addeq r3, r2, #1 + tst r5, #0x20000000 + beq _020C4790 + mov r5, r2, lsl #2 + mov r4, r3, lsl #2 + ldrsh r6, [r1, r5] + ldrsh r5, [r1, r4] + add r2, r1, r2, lsl #2 + add r4, r6, r6, lsl #1 + add r4, r5, r4 + mov r4, r4, asr #2 + str r4, [r0] + add r1, r1, r3, lsl #2 + ldrsh r3, [r2, #2] + ldrsh r2, [r1, #2] + add r1, r3, r3, lsl #1 + add r1, r2, r1 + mov r1, r1, asr #2 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C4790: + ldr r4, [r1, r2, lsl #3] + mov ip, #3 + mov lr, #0 + umull r6, r5, r4, ip + mla r5, r4, lr, r5 + mov r4, r4, asr #0x1f + ldr r7, [r1, r3, lsl #3] + add r2, r1, r2, lsl #3 + mla r5, r4, ip, r5 + adds r6, r6, r7 + adc r4, r5, r7, asr #31 + mov r5, r6, lsr #2 + orr r5, r5, r4, lsl #30 + str r5, [r0] + add r1, r1, r3, lsl #3 + ldr r2, [r2, #4] + ldr r1, [r1, #4] + umull r4, r3, r2, ip + mla r3, r2, lr, r3 + mov r2, r2, asr #0x1f + mla r3, r2, ip, r3 + adds r4, r4, r1 + adc r1, r3, r1, asr #31 + mov r2, r4, lsr #2 + orr r2, r2, r1, lsl #30 + str r2, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C47FC: + mov r4, r6, lsr #2 + b _020C4840 +_020C4804: + mov r6, r6, lsr #2 +_020C4808: + tst r5, #0x20000000 + beq _020C4828 + mov r2, r6, lsl #2 + ldrsh r2, [r1, r2] + add r1, r1, r6, lsl #2 + str r2, [r0] + ldrsh r1, [r1, #2] + b _020C4838 +_020C4828: + ldr r2, [r1, r6, lsl #3] + add r1, r1, r6, lsl #3 + str r2, [r0] + ldr r1, [r1, #4] +_020C4838: + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C4840: + tst r5, #0x20000000 + beq _020C487C + mov r2, r4, lsl #2 + add r3, r1, r4, lsl #2 + ldrsh r2, [r1, r2] + ldrsh r1, [r3, #4] + add r1, r2, r1 + mov r1, r1, asr #1 + str r1, [r0] + ldrsh r2, [r3, #2] + ldrsh r1, [r3, #6] + add r1, r2, r1 + mov r1, r1, asr #1 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C487C: + add r3, r1, r4, lsl #3 + ldr r2, [r1, r4, lsl #3] + ldr r1, [r3, #8] + add r1, r2, r1 + mov r1, r1, asr #1 + str r1, [r0] + ldr r2, [r3, #4] + ldr r1, [r3, #0xc] + add r1, r2, r1 + mov r1, r1, asr #1 + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C48AC: .word 0x1FFF0000 + arm_func_end getScaleData_ + + arm_func_start getScaleDataEx_ +getScaleDataEx_: ; 0x020C48B0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldrh r4, [r3, #4] + ldr r5, [r2, #4] + mov lr, r1, asr #0xc + sub r4, r4, #1 + cmp r4, r1, asr #12 + add ip, r3, r5 + ldr r2, [r2] + bne _020C4938 + tst r2, #0xc0000000 + beq _020C48F0 + tst r2, #0x40000000 + andne r4, lr, #1 + addne lr, r4, lr, lsr #1 + andeq r4, lr, #3 + addeq lr, r4, lr, lsr #2 +_020C48F0: + ldr r3, [r3, #8] + tst r3, #2 + movne r3, #0 + bne _020C49B4 + tst r2, #0x20000000 + beq _020C4920 + mov r1, lr, lsl #2 + ldrsh r2, [ip, r1] + add r1, ip, lr, lsl #2 + str r2, [r0] + ldrsh r1, [r1, #2] + b _020C4930 +_020C4920: + ldr r2, [ip, lr, lsl #3] + add r1, ip, lr, lsl #3 + str r2, [r0] + ldr r1, [r1, #4] +_020C4930: + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C4938: + tst r2, #0xc0000000 + beq _020C49B0 + ldr r4, _020C4A38 ; =0x1FFF0000 + tst r2, #0x40000000 + and r3, r2, r4 + mov r3, r3, lsr #0x10 + beq _020C497C + cmp lr, r3 + movhs lr, r3, lsr #1 + addhs r3, lr, #1 + bhs _020C49B4 + mov lr, lr, lsr #1 + add r3, lr, #1 + and r1, r1, r4, lsr #16 + mov r4, #2 + mov r5, #1 + b _020C49C4 +_020C497C: + cmp lr, r3 + blo _020C4994 + and r3, lr, #3 + add lr, r3, lr, lsr #2 + add r3, lr, #1 + b _020C49B4 +_020C4994: + ldr r4, _020C4A3C ; =0x00003FFF + mov lr, lr, lsr #2 + add r3, lr, #1 + and r1, r1, r4 + mov r4, #4 + mov r5, #2 + b _020C49C4 +_020C49B0: + add r3, lr, #1 +_020C49B4: + ldr r5, _020C4A40 ; =0x00000FFF + mov r4, #1 + and r1, r1, r5 + mov r5, #0 +_020C49C4: + tst r2, #0x20000000 + beq _020C49F0 + mov r2, lr, lsl #2 + add r7, ip, lr, lsl #2 + mov r6, r3, lsl #2 + add r3, ip, r3, lsl #2 + ldrsh r2, [ip, r2] + ldrsh lr, [r7, #2] + ldrsh r7, [ip, r6] + ldrsh r3, [r3, #2] + b _020C4A04 +_020C49F0: + add r7, ip, lr, lsl #3 + ldmia r7, {r2, lr} + add r6, ip, r3, lsl #3 + ldr r7, [ip, r3, lsl #3] + ldr r3, [r6, #4] +_020C4A04: + sub ip, r7, r2 + sub r3, r3, lr + mul r6, r2, r4 + mul r2, r1, ip + add r2, r6, r2, asr #12 + mov r6, r2, asr r5 + mul r4, lr, r4 + mul r2, r1, r3 + add r1, r4, r2, asr #12 + mov r1, r1, asr r5 + str r6, [r0] + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C4A38: .word 0x1FFF0000 +_020C4A3C: .word 0x00003FFF +_020C4A40: .word 0x00000FFF + arm_func_end getScaleDataEx_ + + arm_func_start getRotData_ +getRotData_: ; 0x020C4A44 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x48 + ldr sb, [r2] + mov r4, r3 + ldr r2, [r2, #4] + mov r5, r0 + tst sb, #0xc0000000 + mov r3, r1, asr #0xc + add r8, r4, r2 + ldr r7, [r4, #0xc] + ldr r6, [r4, #0x10] + beq _020C4DC8 + ldr r0, _020C4E58 ; =0x1FFF0000 + tst sb, #0x40000000 + and r0, sb, r0 + mov r1, r0, lsr #0x10 + beq _020C4AB0 + tst r3, #1 + beq _020C4AA8 + cmp r3, r1 + movhi r0, r1, lsr #1 + addhi r3, r0, #1 + bhi _020C4DC8 + mov sb, r3, lsr #1 + b _020C4C70 +_020C4AA8: + mov r3, r3, lsr #1 + b _020C4DC8 +_020C4AB0: + ands r0, r3, #3 + beq _020C4C68 + cmp r3, r1 + addhi r3, r0, r1, lsr #2 + bhi _020C4DC8 + tst r3, #1 + beq _020C4C60 + tst r3, #2 + movne sb, r3, lsr #2 + addne r0, sb, #1 + moveq r0, r3, lsr #2 + addeq sb, r0, #1 + mov r0, r0, lsl #1 + ldrh r3, [r8, r0] + mov r0, r5 + add r1, r4, r7 + add r2, r4, r6 + mov sl, #0 + bl getRotDataByIdx_ + mov r1, sb, lsl #1 + ldrh r3, [r8, r1] + orr sl, sl, r0 + add r0, sp, #0x24 + add r1, r4, r7 + add r2, r4, r6 + bl getRotDataByIdx_ + ldr r1, [r5] + ldr r2, [sp, #0x24] + add r1, r1, r1, lsl #1 + add r1, r2, r1 + str r1, [r5] + ldr r1, [r5, #4] + ldr r2, [sp, #0x28] + add r1, r1, r1, lsl #1 + add r1, r2, r1 + str r1, [r5, #4] + ldr r1, [r5, #8] + ldr r2, [sp, #0x2c] + add r1, r1, r1, lsl #1 + add r1, r2, r1 + str r1, [r5, #8] + ldr r1, [r5, #0xc] + ldr r2, [sp, #0x30] + add r1, r1, r1, lsl #1 + add r1, r2, r1 + str r1, [r5, #0xc] + ldr r1, [r5, #0x10] + orr sl, sl, r0 + ldr r2, [sp, #0x34] + add r0, r1, r1, lsl #1 + add r0, r2, r0 + str r0, [r5, #0x10] + ldr r0, [r5, #0x14] + ldr r1, [sp, #0x38] + add r0, r0, r0, lsl #1 + add r2, r1, r0 + mov r0, r5 + mov r1, r5 + str r2, [r5, #0x14] + bl VEC_Normalize + add r0, r5, #0xc + mov r1, r0 + bl VEC_Normalize + cmp sl, #0 + bne _020C4C04 + ldr r0, [r5, #0x18] + ldr r1, [sp, #0x3c] + add r0, r0, r0, lsl #1 + add r0, r1, r0 + str r0, [r5, #0x18] + ldr r0, [r5, #0x1c] + ldr r1, [sp, #0x40] + add r0, r0, r0, lsl #1 + add r0, r1, r0 + str r0, [r5, #0x1c] + ldr r0, [r5, #0x20] + ldr r1, [sp, #0x44] + add r0, r0, r0, lsl #1 + add r2, r1, r0 + add r0, r5, #0x18 + mov r1, r0 + str r2, [r5, #0x20] + bl VEC_Normalize + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C4C04: + ldr sb, [r5, #0x14] + ldr r6, [r5, #4] + ldr r4, [r5, #0x10] + ldr r2, [r5, #8] + mul r1, r6, sb + mul r0, r2, r4 + sub r0, r1, r0 + ldr r7, [r5, #0xc] + ldr r8, [r5] + mov r3, r0, asr #0xc + mul r1, r2, r7 + mul r0, r8, sb + sub r2, r1, r0 + mul r1, r8, r4 + mul r0, r6, r7 + sub r0, r1, r0 + str r3, [r5, #0x18] + mov r1, r2, asr #0xc + str r1, [r5, #0x1c] + mov r0, r0, asr #0xc + add sp, sp, #0x48 + str r0, [r5, #0x20] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C4C60: + mov sb, r3, lsr #2 + b _020C4C70 +_020C4C68: + mov r3, r3, lsr #2 + b _020C4DC8 +_020C4C70: + mov r0, sb, lsl #1 + ldrh r3, [r8, r0] + mov r0, r5 + add r1, r4, r7 + add r2, r4, r6 + bl getRotDataByIdx_ + add r1, r8, sb, lsl #1 + ldrh r3, [r1, #2] + orr r8, r0, #0 + add r0, sp, #0 + add r1, r4, r7 + add r2, r4, r6 + bl getRotDataByIdx_ + ldr r2, [r5] + ldr r1, [sp] + orr r8, r8, r0 + add r0, r2, r1 + str r0, [r5] + ldr r2, [r5, #4] + ldr r1, [sp, #4] + mov r0, r5 + add r1, r2, r1 + str r1, [r5, #4] + ldr r3, [r5, #8] + ldr r2, [sp, #8] + mov r1, r5 + add r2, r3, r2 + str r2, [r5, #8] + ldr r3, [r5, #0xc] + ldr r2, [sp, #0xc] + add r2, r3, r2 + str r2, [r5, #0xc] + ldr r3, [r5, #0x10] + ldr r2, [sp, #0x10] + add r2, r3, r2 + str r2, [r5, #0x10] + ldr r3, [r5, #0x14] + ldr r2, [sp, #0x14] + add r2, r3, r2 + str r2, [r5, #0x14] + bl VEC_Normalize + add r0, r5, #0xc + mov r1, r0 + bl VEC_Normalize + cmp r8, #0 + bne _020C4D6C + ldr r2, [r5, #0x18] + ldr r1, [sp, #0x18] + add r0, r5, #0x18 + add r1, r2, r1 + str r1, [r5, #0x18] + ldr r3, [r5, #0x1c] + ldr r2, [sp, #0x1c] + mov r1, r0 + add r2, r3, r2 + str r2, [r5, #0x1c] + ldr r3, [r5, #0x20] + ldr r2, [sp, #0x20] + add r2, r3, r2 + str r2, [r5, #0x20] + bl VEC_Normalize + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C4D6C: + ldr sb, [r5, #0x14] + ldr r6, [r5, #4] + ldr r4, [r5, #0x10] + ldr r2, [r5, #8] + mul r1, r6, sb + mul r0, r2, r4 + sub r0, r1, r0 + ldr r7, [r5, #0xc] + ldr r8, [r5] + mov r3, r0, asr #0xc + mul r1, r2, r7 + mul r0, r8, sb + sub r2, r1, r0 + mul r1, r8, r4 + mul r0, r6, r7 + sub r0, r1, r0 + str r3, [r5, #0x18] + mov r1, r2, asr #0xc + str r1, [r5, #0x1c] + mov r0, r0, asr #0xc + add sp, sp, #0x48 + str r0, [r5, #0x20] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C4DC8: + mov r0, r3, lsl #1 + ldrh r3, [r8, r0] + mov r0, r5 + add r1, r4, r7 + add r2, r4, r6 + bl getRotDataByIdx_ + cmp r0, #0 + beq _020C4E44 + ldr sb, [r5, #0x14] + ldr r6, [r5, #4] + ldr r4, [r5, #0x10] + ldr r2, [r5, #8] + mul r1, r6, sb + mul r0, r2, r4 + sub r0, r1, r0 + ldr r7, [r5, #0xc] + ldr r8, [r5] + mov r3, r0, asr #0xc + mul r1, r2, r7 + mul r0, r8, sb + sub r2, r1, r0 + mul r1, r8, r4 + mul r0, r6, r7 + sub r0, r1, r0 + str r3, [r5, #0x18] + mov r1, r2, asr #0xc + str r1, [r5, #0x1c] + mov r0, r0, asr #0xc + add sp, sp, #0x48 + str r0, [r5, #0x20] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C4E44: + add r0, r5, #0x18 + mov r1, r0 + bl VEC_Normalize + add sp, sp, #0x48 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020C4E58: .word 0x1FFF0000 + arm_func_end getRotData_ + + arm_func_start getRotDataEx_ +getRotDataEx_: ; 0x020C4E5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x48 + mov sb, r3 + ldrh r3, [sb, #4] + ldr r4, [r2, #4] + mov sl, r0 + sub r0, r3, #1 + cmp r0, r1, asr #12 + add r8, sb, r4 + mov r0, r1, asr #0xc + ldr r4, [sb, #0xc] + ldr fp, [sb, #0x10] + ldr r3, [r2] + bne _020C4F50 + tst r3, #0xc0000000 + beq _020C4EB0 + tst r3, #0x40000000 + andne r2, r0, #1 + addne r0, r2, r0, lsr #1 + andeq r2, r0, #3 + addeq r0, r2, r0, lsr #2 +_020C4EB0: + ldr r2, [sb, #8] + tst r2, #2 + movne r5, #0 + bne _020C4FC4 + mov r0, r0, lsl #1 + ldrh r3, [r8, r0] + mov r0, sl + add r1, sb, r4 + add r2, sb, fp + bl getRotDataByIdx_ + cmp r0, #0 + beq _020C4F3C + ldr r8, [sl, #0x14] + ldr r5, [sl, #4] + ldr r4, [sl, #0x10] + ldr r2, [sl, #8] + mul r1, r5, r8 + mul r0, r2, r4 + sub r0, r1, r0 + ldr r6, [sl, #0xc] + ldr r7, [sl] + mov r3, r0, asr #0xc + mul r1, r2, r6 + mul r0, r7, r8 + sub r2, r1, r0 + mul r1, r7, r4 + mul r0, r5, r6 + sub r0, r1, r0 + str r3, [sl, #0x18] + mov r1, r2, asr #0xc + str r1, [sl, #0x1c] + mov r0, r0, asr #0xc + add sp, sp, #0x48 + str r0, [sl, #0x20] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C4F3C: + add r0, sl, #0x18 + mov r1, r0 + bl VEC_Normalize + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C4F50: + tst r3, #0xc0000000 + beq _020C4FC0 + ldr r2, _020C5194 ; =0x1FFF0000 + tst r3, #0x40000000 + and r3, r3, r2 + mov r3, r3, lsr #0x10 + beq _020C4F90 + cmp r0, r3 + movhs r0, r3, lsr #1 + addhs r5, r0, #1 + bhs _020C4FC4 + mov r0, r0, lsr #1 + add r5, r0, #1 + and r6, r1, r2, lsr #16 + mov r7, #2 + b _020C4FD0 +_020C4F90: + cmp r0, r3 + blo _020C4FA8 + and r2, r0, #3 + add r0, r2, r0, lsr #2 + add r5, r0, #1 + b _020C4FC4 +_020C4FA8: + ldr r2, _020C5198 ; =0x00003FFF + mov r0, r0, lsr #2 + add r5, r0, #1 + and r6, r1, r2 + mov r7, #4 + b _020C4FD0 +_020C4FC0: + add r5, r0, #1 +_020C4FC4: + ldr r2, _020C519C ; =0x00000FFF + mov r7, #1 + and r6, r1, r2 +_020C4FD0: + mov r0, r0, lsl #1 + ldrh r3, [r8, r0] + add r0, sp, #0x24 + add r1, sb, r4 + add r2, sb, fp + bl getRotDataByIdx_ + mov r1, r5, lsl #1 + ldrh r3, [r8, r1] + orr r5, r0, #0 + add r0, sp, #0 + add r1, sb, r4 + add r2, sb, fp + bl getRotDataByIdx_ + ldr r3, [sp, #0x24] + ldr r1, [sp] + mul r2, r3, r7 + sub r1, r1, r3 + mul r1, r6, r1 + add r1, r2, r1, asr #12 + str r1, [sl] + ldr r3, [sp, #0x28] + ldr r1, [sp, #4] + mul r2, r3, r7 + sub r1, r1, r3 + mul r1, r6, r1 + add r1, r2, r1, asr #12 + str r1, [sl, #4] + ldr r3, [sp, #0x2c] + ldr r1, [sp, #8] + mul r2, r3, r7 + sub r1, r1, r3 + mul r1, r6, r1 + add r1, r2, r1, asr #12 + str r1, [sl, #8] + ldr r3, [sp, #0x30] + ldr r1, [sp, #0xc] + mul r2, r3, r7 + sub r1, r1, r3 + mul r1, r6, r1 + add r1, r2, r1, asr #12 + str r1, [sl, #0xc] + ldr r2, [sp, #0x34] + ldr r1, [sp, #0x10] + orr r5, r5, r0 + sub r0, r1, r2 + mul r1, r2, r7 + mul r0, r6, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x10] + ldr r2, [sp, #0x38] + ldr r0, [sp, #0x14] + mul r1, r2, r7 + sub r0, r0, r2 + mul r0, r6, r0 + add r2, r1, r0, asr #12 + mov r0, sl + mov r1, sl + str r2, [sl, #0x14] + bl VEC_Normalize + add r0, sl, #0xc + mov r1, r0 + bl VEC_Normalize + cmp r5, #0 + bne _020C5138 + ldr r2, [sp, #0x3c] + ldr r0, [sp, #0x18] + mul r1, r2, r7 + sub r0, r0, r2 + mul r0, r6, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x18] + ldr r2, [sp, #0x40] + ldr r0, [sp, #0x1c] + mul r1, r2, r7 + sub r0, r0, r2 + mul r0, r6, r0 + add r0, r1, r0, asr #12 + str r0, [sl, #0x1c] + ldr r2, [sp, #0x44] + ldr r0, [sp, #0x20] + mul r1, r2, r7 + sub r0, r0, r2 + mul r0, r6, r0 + add r2, r1, r0, asr #12 + add r0, sl, #0x18 + mov r1, r0 + str r2, [sl, #0x20] + bl VEC_Normalize + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C5138: + ldr r8, [sl, #0x14] + ldr r5, [sl, #4] + ldr r7, [sl] + ldr r4, [sl, #0x10] + ldr r2, [sl, #8] + ldr r6, [sl, #0xc] + mul r1, r5, r8 + mul r0, r2, r4 + sub r0, r1, r0 + mov r3, r0, asr #0xc + mul r1, r2, r6 + mul r0, r7, r8 + sub r2, r1, r0 + mul r1, r7, r4 + mul r0, r5, r6 + sub r0, r1, r0 + str r3, [sl, #0x18] + mov r1, r2, asr #0xc + str r1, [sl, #0x1c] + mov r0, r0, asr #0xc + str r0, [sl, #0x20] + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C5194: .word 0x1FFF0000 +_020C5198: .word 0x00003FFF +_020C519C: .word 0x00000FFF + arm_func_end getRotDataEx_ + + arm_func_start getRotDataByIdx_ +getRotDataByIdx_: ; 0x020C51A0 + stmdb sp!, {r3, r4, r5, lr} + tst r3, #0x8000 + beq _020C5258 + mov r4, #0 + str r4, [r0, #0x20] + str r4, [r0, #0x1c] + str r4, [r0, #0x18] + str r4, [r0, #0x14] + str r4, [r0, #0x10] + ldr r2, _020C52F8 ; =0x00007FFF + str r4, [r0, #0xc] + str r4, [r0, #8] + and r2, r3, r2 + add r3, r2, r2, lsl #1 + str r4, [r0, #4] + add r2, r1, r3, lsl #1 + str r4, [r0] + mov r3, r3, lsl #1 + ldrsh r1, [r1, r3] + ldrsh ip, [r2, #2] + ldrsh r3, [r2, #4] + tst r1, #0x10 + subne r5, r4, #0x1000 + ldr r4, _020C52FC ; =_021094B8 + and r1, r1, #0xf + ldr lr, _020C5300 ; =_021094B8 + 1 + moveq r5, #0x1000 + ldrb r4, [r4, r1, lsl #2] + str r5, [r0, r1, lsl #2] + ldrb lr, [lr, r1, lsl #2] + str ip, [r0, r4, lsl #2] + str r3, [r0, lr, lsl #2] + ldrsh lr, [r2] + tst lr, #0x20 + ldr lr, _020C5304 ; =_021094B8 + 2 + rsbne r3, r3, #0 + ldrb lr, [lr, r1, lsl #2] + str r3, [r0, lr, lsl #2] + ldrsh r2, [r2] + tst r2, #0x40 + ldr r2, _020C5308 ; =_021094B8 + 3 + rsbne ip, ip, #0 + ldrb r1, [r2, r1, lsl #2] + str ip, [r0, r1, lsl #2] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020C5258: + ldr r1, _020C52F8 ; =0x00007FFF + and r1, r3, r1 + add r3, r1, r1, lsl #2 + add r1, r2, r3, lsl #1 + ldrsh lr, [r1, #8] + mov ip, r3, lsl #1 + mov r3, lr, asr #3 + str r3, [r0, #0x10] + ldrsh ip, [r2, ip] + and r2, lr, #7 + mov r2, r2, lsl #0x10 + mov r3, ip, asr #3 + str r3, [r0] + ldrsh r3, [r1, #2] + and ip, ip, #7 + orr lr, ip, r2, asr #13 + mov r2, r3, asr #3 + str r2, [r0, #4] + ldrsh ip, [r1, #4] + mov r2, lr, lsl #0x10 + and lr, r3, #7 + mov r3, ip, asr #3 + str r3, [r0, #8] + ldrsh r3, [r1, #6] + orr r1, lr, r2, asr #13 + mov r1, r1, lsl #0x10 + and r2, ip, #7 + orr r1, r2, r1, asr #13 + mov r1, r1, lsl #0x10 + and r2, r3, #7 + orr r1, r2, r1, asr #13 + mov r1, r1, lsl #0x10 + mov r1, r1, asr #0x10 + mov r2, r3, asr #3 + mov r1, r1, lsl #0x13 + str r2, [r0, #0xc] + mov r1, r1, asr #0x13 + str r1, [r0, #0x14] + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C52F8: .word 0x00007FFF +_020C52FC: .word _021094B8 +_020C5300: .word _021094B8 + 1 +_020C5304: .word _021094B8 + 2 +_020C5308: .word _021094B8 + 3 + arm_func_end getRotDataByIdx_ + + arm_func_start GetMatColAnmValue_ +GetMatColAnmValue_: ; 0x020C530C + tst r1, #0x20000000 + movne r0, r1, lsl #0x10 + movne r0, r0, lsr #0x10 + bxne lr + mov r3, r1, lsl #0x10 + tst r1, #0xc0000000 + add r0, r0, r3, lsr #16 + moveq r1, r2, lsl #1 + ldreqh r0, [r0, r1] + bxeq lr + ldr r3, _020C546C ; =0x1FFF0000 + tst r1, #0x40000000 + and r1, r1, r3 + mov r3, r1, lsr #0x10 + beq _020C537C + tst r2, #1 + beq _020C5370 + cmp r2, r3 + bls _020C5368 + bic r1, r3, #1 + add r0, r0, r1 + ldrh r0, [r0, #2] + bx lr +_020C5368: + mov r1, r2, lsr #1 + b _020C5424 +_020C5370: + bic r1, r2, #1 + ldrh r0, [r0, r1] + bx lr +_020C537C: + ands r1, r2, #3 + beq _020C5414 + cmp r2, r3 + bls _020C53A0 + mov r2, r3, lsr #2 + mov r1, r1, lsl #1 + add r0, r0, r2, lsl #1 + ldrh r0, [r1, r0] + bx lr +_020C53A0: + tst r2, #1 + beq _020C540C + tst r2, #2 + movne r3, r2, lsr #2 + addne r1, r3, #1 + moveq r1, r2, lsr #2 + mov r2, r1, lsl #1 + addeq r3, r1, #1 + mov r1, r3, lsl #1 + ldrh r2, [r0, r2] + ldrh ip, [r0, r1] + ldr r0, _020C5470 ; =0x00007C1F + and r1, r2, #0x3e0 + and r3, r2, r0 + add r2, r1, r1, lsl #1 + and r1, ip, #0x3e0 + add r1, r2, r1 + add r3, r3, r3, lsl #1 + and r2, ip, r0 + add r2, r3, r2 + mov r1, r1, lsr #2 + and r2, r0, r2, lsr #2 + and r0, r1, #0x3e0 + orr r0, r2, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr +_020C540C: + mov r1, r2, lsr #2 + b _020C5424 +_020C5414: + mov r1, r2, lsr #2 + mov r1, r1, lsl #1 + ldrh r0, [r0, r1] + bx lr +_020C5424: + mov r2, r1, lsl #1 + add r1, r0, r1, lsl #1 + ldrh r3, [r0, r2] + ldrh ip, [r1, #2] + ldr r0, _020C5470 ; =0x00007C1F + and r2, r3, #0x3e0 + and r1, ip, #0x3e0 + add r1, r2, r1 + mov r1, r1, lsr #1 + and r3, r3, r0 + and r2, ip, r0 + add r2, r3, r2 + and r2, r0, r2, lsr #1 + and r0, r1, #0x3e0 + orr r0, r2, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + .align 2, 0 +_020C546C: .word 0x1FFF0000 +_020C5470: .word 0x00007C1F + arm_func_end GetMatColAnmValue_ + + arm_func_start GetMatColAnmuAlphaValue_ +GetMatColAnmuAlphaValue_: ; 0x020C5474 + tst r1, #0x20000000 + movne r0, r1, lsl #0x10 + movne r0, r0, lsr #0x10 + bxne lr + mov r3, r1, lsl #0x10 + add r3, r0, r3, lsr #16 + tst r1, #0xc0000000 + ldreqb r0, [r3, r2] + bxeq lr + ldr r0, _020C555C ; =0x1FFF0000 + tst r1, #0x40000000 + and r0, r1, r0 + mov r0, r0, lsr #0x10 + beq _020C54E8 + tst r2, #1 + beq _020C54E0 + cmp r2, r0 + addhi r0, r3, r0, lsr #1 + ldrhib r0, [r0, #1] + bxhi lr + add r0, r3, r2, lsr #1 + ldrb r1, [r3, r2, lsr #1] + ldrb r0, [r0, #1] + add r0, r1, r0 + mov r0, r0, lsl #0xf + mov r0, r0, lsr #0x10 + bx lr +_020C54E0: + ldrb r0, [r3, r2, lsr #1] + bx lr +_020C54E8: + ands r1, r2, #3 + beq _020C5554 + cmp r2, r0 + addhi r0, r3, r0, lsr #2 + ldrhib r0, [r1, r0] + bxhi lr + tst r2, #1 + beq _020C5538 + tst r2, #2 + movne r2, r2, lsr #2 + addne r0, r2, #1 + moveq r0, r2, lsr #2 + ldrb r1, [r3, r0] + addeq r2, r0, #1 + ldrb r0, [r3, r2] + add r1, r1, r1, lsl #1 + add r0, r1, r0 + mov r0, r0, lsl #0xe + mov r0, r0, lsr #0x10 + bx lr +_020C5538: + add r0, r3, r2, lsr #2 + ldrb r1, [r3, r2, lsr #2] + ldrb r0, [r0, #1] + add r0, r1, r0 + mov r0, r0, lsl #0xf + mov r0, r0, lsr #0x10 + bx lr +_020C5554: + ldrb r0, [r3, r2, lsr #2] + bx lr + .align 2, 0 +_020C555C: .word 0x1FFF0000 + arm_func_end GetMatColAnmuAlphaValue_ + + arm_func_start NNSi_G3dAnmObjInitNsBma +NNSi_G3dAnmObjInitNsBma: ; 0x020C5560 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + cmp r2, #0 + ldrne r0, [r2, #8] + mov sb, r1 + cmpne r0, #0 + addne r7, r2, r0 + ldr r0, _020C5630 ; =_02110A14 + add r1, sl, #0x1a + ldr r3, [r0] + mov r0, #0 + str r3, [sl, #0xc] + ldrb r2, [r2, #0x18] + moveq r7, #0 + strb r2, [sl, #0x19] + mov r2, r2, lsl #1 + bl MIi_CpuClear16 + ldrb r0, [sb, #9] + mov r6, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r8, r6 + add r5, sb, #8 + mov fp, r6 + mvn r4, #0 +_020C55C4: + cmp r5, #0 + beq _020C55F0 + ldrb r0, [sb, #9] + cmp r6, r0 + bhs _020C55F0 + ldrh r0, [sb, #0xe] + add r1, r5, r0 + ldrh r0, [r1, #2] + add r0, r1, r0 + add r1, r0, r8 + b _020C55F4 +_020C55F0: + mov r1, fp +_020C55F4: + cmp r7, #0 + moveq r0, r4 + beq _020C5608 + add r0, r7, #4 + bl NNS_G3dGetResDictIdxByName +_020C5608: + cmp r0, #0 + orrge r1, r6, #0x100 + addge r0, sl, r0, lsl #1 + strgeh r1, [r0, #0x1a] + ldrb r0, [sb, #9] + add r6, r6, #1 + add r8, r8, #0x10 + cmp r6, r0 + blo _020C55C4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C5630: .word _02110A14 + arm_func_end NNSi_G3dAnmObjInitNsBma + + arm_func_start NNSi_G3dAnmCalcNsBma +NNSi_G3dAnmCalcNsBma: ; 0x020C5634 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, [r1, #8] + ldr r1, [r1] + mov r7, r0 + mov r5, r1, asr #0xc + adds r3, r4, #8 + beq _020C567C + ldrb r1, [r4, #9] + mov r0, r2, lsl #0x10 + mov r2, r0, lsr #0x10 + cmp r1, r0, lsr #16 + bls _020C567C + ldrh r1, [r4, #0xe] + ldrh r0, [r3, r1] + add r1, r3, r1 + add r1, r1, #4 + mla r6, r0, r2, r1 + b _020C5680 +_020C567C: + mov r6, #0 +_020C5680: + ldr r1, [r6] + mov r0, r4 + mov r2, r5 + bl GetMatColAnmValue_ + mov r8, r0 + ldr r1, [r6, #4] + mov r0, r4 + mov r2, r5 + bl GetMatColAnmValue_ + ldr r1, [r7, #4] + orr r0, r8, r0, lsl #16 + tst r1, #0x8000 + movne r1, #1 + moveq r1, #0 + orr r0, r0, r1, lsl #15 + str r0, [r7, #4] + ldr r1, [r6, #0xc] + mov r0, r4 + mov r2, r5 + bl GetMatColAnmValue_ + mov r8, r0 + ldr r1, [r6, #8] + mov r0, r4 + mov r2, r5 + bl GetMatColAnmValue_ + ldr r1, [r7, #8] + orr r0, r0, r8, lsl #16 + tst r1, #0x8000 + movne r1, #1 + moveq r1, #0 + orr r0, r0, r1, lsl #15 + str r0, [r7, #8] + ldr r1, [r6, #0x10] + mov r0, r4 + mov r2, r5 + bl GetMatColAnmuAlphaValue_ + ldr r1, [r7, #0xc] + bic r1, r1, #0x1f0000 + orr r0, r1, r0, lsl #16 + str r0, [r7, #0xc] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_G3dAnmCalcNsBma + + arm_func_start GetTexSRTAnmVectorVal_ +GetTexSRTAnmVectorVal_: ; 0x020C5724 + tst r1, #0x20000000 + movne r0, r2 + bxne lr + tst r1, #0xc0000000 + add r0, r0, r2 + beq _020C57E0 + mov r2, r1, lsl #0x10 + tst r1, #0x40000000 + mov ip, r2, lsr #0x10 + beq _020C5774 + tst r3, #1 + beq _020C576C + cmp r3, ip + movhi r2, ip, lsr #1 + addhi r3, r2, #1 + bhi _020C57E0 + mov r3, r3, lsr #1 + b _020C57F4 +_020C576C: + mov r3, r3, lsr #1 + b _020C57E0 +_020C5774: + ands r2, r3, #3 + beq _020C57DC + cmp r3, ip + addhi r3, r2, ip, lsr #2 + bhi _020C57E0 + tst r3, #1 + beq _020C57D4 + tst r3, #2 + movne r3, r3, lsr #2 + addne r2, r3, #1 + moveq r2, r3, lsr #2 + addeq r3, r2, #1 + tst r1, #0x10000000 + ldreq r2, [r0, r2, lsl #2] + ldreq r1, [r0, r3, lsl #2] + beq _020C57C4 + mov r2, r2, lsl #1 + mov r1, r3, lsl #1 + ldrsh r2, [r0, r2] + ldrsh r1, [r0, r1] +_020C57C4: + add r0, r2, r2, lsl #1 + add r0, r0, r1 + mov r0, r0, asr #2 + bx lr +_020C57D4: + mov r3, r3, lsr #2 + b _020C57F4 +_020C57DC: + mov r3, r3, lsr #2 +_020C57E0: + tst r1, #0x10000000 + movne r1, r3, lsl #1 + ldrnesh r0, [r0, r1] + ldreq r0, [r0, r3, lsl #2] + bx lr +_020C57F4: + tst r1, #0x10000000 + addeq r1, r0, r3, lsl #2 + ldreq r0, [r0, r3, lsl #2] + ldreq r1, [r1, #4] + beq _020C5818 + add r1, r0, r3, lsl #1 + mov r2, r3, lsl #1 + ldrsh r0, [r0, r2] + ldrsh r1, [r1, #2] +_020C5818: + add r0, r0, r1 + mov r0, r0, asr #1 + bx lr + arm_func_end GetTexSRTAnmVectorVal_ + + arm_func_start GetTexSRTAnmSinCosVal_ +GetTexSRTAnmSinCosVal_: ; 0x020C5824 + tst r1, #0x20000000 + movne r0, r2 + bxne lr + tst r1, #0xc0000000 + add r0, r0, r2 + beq _020C58F4 + mov r2, r1, lsl #0x10 + tst r1, #0x40000000 + mov r2, r2, lsr #0x10 + beq _020C5874 + tst r3, #1 + beq _020C586C + cmp r3, r2 + movhi r1, r2, lsr #1 + addhi r3, r1, #1 + bhi _020C58F4 + mov r1, r3, lsr #1 + b _020C58FC +_020C586C: + mov r3, r3, lsr #1 + b _020C58F4 +_020C5874: + ands r1, r3, #3 + beq _020C58F0 + cmp r3, r2 + addhi r3, r1, r2, lsr #2 + bhi _020C58F4 + tst r3, #1 + beq _020C58E8 + tst r3, #2 + movne r3, r3, lsr #2 + addne r1, r3, #1 + moveq r1, r3, lsr #2 + add r2, r0, r1, lsl #2 + mov ip, r1, lsl #2 + addeq r3, r1, #1 + add r1, r0, r3, lsl #2 + ldrsh r2, [r2, #2] + mov r3, r3, lsl #2 + ldrsh ip, [r0, ip] + ldrsh r1, [r1, #2] + ldrsh r3, [r0, r3] + add r2, r2, r2, lsl #1 + add r0, r2, r1 + add ip, ip, ip, lsl #1 + mov r1, r0, asr #2 + add r2, ip, r3 + mov r0, r2, lsl #0xe + mov r1, r1, lsl #0x10 + orr r0, r1, r0, lsr #16 + bx lr +_020C58E8: + mov r1, r3, lsr #2 + b _020C58FC +_020C58F0: + mov r3, r3, lsr #2 +_020C58F4: + ldr r0, [r0, r3, lsl #2] + bx lr +_020C58FC: + add r3, r0, r1, lsl #2 + mov ip, r1, lsl #2 + ldrsh r2, [r3, #2] + ldrsh r1, [r3, #6] + ldrsh ip, [r0, ip] + ldrsh r3, [r3, #4] + add r0, r2, r1 + mov r1, r0, asr #1 + add r0, ip, r3 + mov r0, r0, lsl #0xf + mov r1, r1, lsl #0x10 + orr r0, r1, r0, lsr #16 + bx lr + arm_func_end GetTexSRTAnmSinCosVal_ + + arm_func_start GetTexSRTAnm_ +GetTexSRTAnm_: ; 0x020C5930 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r0 + mov r6, r2 + mov r5, r3 + adds r3, r7, #8 + beq _020C596C + ldrb r0, [r7, #9] + cmp r1, r0 + bhs _020C596C + ldrh r2, [r7, #0xe] + ldrh r0, [r3, r2] + add r2, r3, r2 + add r2, r2, #4 + mla r4, r0, r1, r2 + b _020C5970 +_020C596C: + mov r4, #0 +_020C5970: + ldr r1, [r4, #0x18] + ldr r2, [r4, #0x1c] + mov r0, r7 + mov r3, r6 + ldr r8, [r5] + bl GetTexSRTAnmVectorVal_ + mov sb, r0 + ldr r1, [r4, #0x20] + ldr r2, [r4, #0x24] + mov r0, r7 + mov r3, r6 + bl GetTexSRTAnmVectorVal_ + cmp sb, #0 + cmpeq r0, #0 + strne sb, [r5, #0x24] + strne r0, [r5, #0x28] + orreq r8, r8, #4 + ldr r1, [r4, #0x10] + ldr r2, [r4, #0x14] + bicne r8, r8, #4 + mov r0, r7 + mov r3, r6 + bl GetTexSRTAnmSinCosVal_ + cmp r0, #0x10000000 + orreq r8, r8, #2 + beq _020C59E8 + strh r0, [r5, #0x20] + mov r0, r0, lsr #0x10 + strh r0, [r5, #0x22] + bic r8, r8, #2 +_020C59E8: + mov r0, r7 + mov r3, r6 + ldmia r4, {r1, r2} + bl GetTexSRTAnmVectorVal_ + mov sb, r0 + ldr r1, [r4, #8] + ldr r2, [r4, #0xc] + mov r0, r7 + mov r3, r6 + bl GetTexSRTAnmVectorVal_ + cmp sb, #0x1000 + cmpeq r0, #0x1000 + orreq r8, r8, #1 + strne sb, [r5, #0x18] + strne r0, [r5, #0x1c] + bicne r8, r8, #1 + str r8, [r5] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end GetTexSRTAnm_ + + arm_func_start NNSi_G3dAnmObjInitNsBta +NNSi_G3dAnmObjInitNsBta: ; 0x020C5A30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + cmp r2, #0 + ldrne r0, [r2, #8] + mov sb, r1 + cmpne r0, #0 + addne r7, r2, r0 + ldr r0, _020C5B00 ; =_02110A0C + add r1, sl, #0x1a + ldr r3, [r0] + mov r0, #0 + str r3, [sl, #0xc] + ldrb r2, [r2, #0x18] + moveq r7, #0 + strb r2, [sl, #0x19] + mov r2, r2, lsl #1 + bl MIi_CpuClear16 + ldrb r0, [sb, #9] + mov r6, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r8, r6 + add r5, sb, #8 + mov fp, r6 + mvn r4, #0 +_020C5A94: + cmp r5, #0 + beq _020C5AC0 + ldrb r0, [sb, #9] + cmp r6, r0 + bhs _020C5AC0 + ldrh r0, [sb, #0xe] + add r1, r5, r0 + ldrh r0, [r1, #2] + add r0, r1, r0 + add r1, r0, r8 + b _020C5AC4 +_020C5AC0: + mov r1, fp +_020C5AC4: + cmp r7, #0 + moveq r0, r4 + beq _020C5AD8 + add r0, r7, #4 + bl NNS_G3dGetResDictIdxByName +_020C5AD8: + cmp r0, #0 + orrge r1, r6, #0x100 + addge r0, sl, r0, lsl #1 + strgeh r1, [r0, #0x1a] + ldrb r0, [sb, #9] + add r6, r6, #1 + add r8, r8, #0x10 + cmp r6, r0 + blo _020C5A94 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C5B00: .word _02110A0C + arm_func_end NNSi_G3dAnmObjInitNsBta + + arm_func_start NNSi_G3dAnmCalcNsBta +NNSi_G3dAnmCalcNsBta: ; 0x020C5B04 + stmdb sp!, {r4, lr} + ldr ip, [r1] + mov r4, r0 + mov r2, r2, lsl #0x10 + ldr r0, [r1, #8] + mov r1, r2, lsr #0x10 + mov r3, r4 + mov r2, ip, asr #0xc + bl GetTexSRTAnm_ + ldr r0, [r4, #0x10] + bic r0, r0, #0xc0000000 + orr r0, r0, #0x40000000 + str r0, [r4, #0x10] + ldr r0, [r4] + orr r0, r0, #8 + str r0, [r4] + ldmia sp!, {r4, pc} + arm_func_end NNSi_G3dAnmCalcNsBta + + arm_func_start NNSi_G3dAnmObjInitNsBtp +NNSi_G3dAnmObjInitNsBtp: ; 0x020C5B48 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + cmp r2, #0 + ldrne r0, [r2, #8] + mov sb, r1 + cmpne r0, #0 + addne r7, r2, r0 + ldr r0, _020C5C20 ; =_02110A10 + add r1, sl, #0x1a + ldr r3, [r0] + mov r0, #0 + str r3, [sl, #0xc] + ldrb r2, [r2, #0x18] + moveq r7, #0 + strb r2, [sl, #0x19] + str sb, [sl, #8] + ldrb r2, [sl, #0x19] + mov r2, r2, lsl #1 + bl MIi_CpuClear16 + ldrb r0, [sb, #0xd] + mov r6, #0 + cmp r0, #0 + ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r8, r6 + add r5, sb, #0xc + mov fp, r6 + mvn r4, #0 +_020C5BB4: + cmp r5, #0 + beq _020C5BE0 + ldrb r0, [sb, #0xd] + cmp r6, r0 + bhs _020C5BE0 + ldrh r0, [sb, #0x12] + add r1, r5, r0 + ldrh r0, [r1, #2] + add r0, r1, r0 + add r1, r0, r8 + b _020C5BE4 +_020C5BE0: + mov r1, fp +_020C5BE4: + cmp r7, #0 + moveq r0, r4 + beq _020C5BF8 + add r0, r7, #4 + bl NNS_G3dGetResDictIdxByName +_020C5BF8: + cmp r0, #0 + orrge r1, r6, #0x100 + addge r0, sl, r0, lsl #1 + strgeh r1, [r0, #0x1a] + ldrb r0, [sb, #0xd] + add r6, r6, #1 + add r8, r8, #0x10 + cmp r6, r0 + blo _020C5BB4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C5C20: .word _02110A10 + arm_func_end NNSi_G3dAnmObjInitNsBtp + + arm_func_start SetTexParamaters_ +SetTexParamaters_: ; 0x020C5C24 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r2 + moveq r0, #0 + beq _020C5C40 + add r0, r5, #0x3c + bl NNS_G3dGetResDataByName +_020C5C40: + ldr r1, [r0] + ldr r3, [r4, #0x10] + and r1, r1, #0x1c000000 + cmp r1, #0x14000000 + ldrne r1, [r5, #8] + ldr r2, _020C5CF4 ; =0x000007FF + ldreq r1, [r5, #0x18] + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bic r5, r1, #0xe0000000 + ldr r1, _020C5CF8 ; =0xC00F0000 + and r3, r3, r1 + str r3, [r4, #0x10] + ldr r1, [r0] + add r1, r1, r5 + orr r1, r3, r1 + str r1, [r4, #0x10] + ldr r1, [r0, #4] + and r1, r1, r2 + strh r1, [r4, #0x2c] + ldr r1, [r0, #4] + and r1, r1, r2, lsl #11 + mov r1, r1, lsr #0xb + strh r1, [r4, #0x2e] + ldr r0, [r0, #4] + ldrh r1, [r4, #0x2c] + and r3, r0, r2 + and r0, r0, r2, lsl #11 + cmp r3, r1 + mov r5, r0, lsr #0xb + moveq r0, #0x1000 + beq _020C5CCC + mov r0, r3, lsl #0xc + mov r1, r1, lsl #0xc + bl FX_Div +_020C5CCC: + str r0, [r4, #0x30] + ldrh r1, [r4, #0x2e] + cmp r5, r1 + moveq r0, #0x1000 + beq _020C5CEC + mov r0, r5, lsl #0xc + mov r1, r1, lsl #0xc + bl FX_Div +_020C5CEC: + str r0, [r4, #0x34] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C5CF4: .word 0x000007FF +_020C5CF8: .word 0xC00F0000 + arm_func_end SetTexParamaters_ + + arm_func_start SetPlttParamaters_ +SetPlttParamaters_: ; 0x020C5CFC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + ldrneh r0, [r5, #0x34] + mov r4, r2 + cmpne r0, #0 + moveq r0, #0 + beq _020C5D20 + add r0, r5, r0 + bl NNS_G3dGetResDataByName +_020C5D20: + ldr r1, [r5, #0x2c] + ldrh r2, [r0, #2] + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bic r1, r1, #0xe0000000 + mov r1, r1, lsl #0x10 + tst r2, #1 + mov r1, r1, lsr #0x10 + ldrh r0, [r0] + bne _020C5D58 + mov r0, r0, lsl #0xf + mov r1, r1, lsl #0xf + mov r0, r0, lsr #0x10 + mov r1, r1, lsr #0x10 +_020C5D58: + add r0, r0, r1 + str r0, [r4, #0x14] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SetPlttParamaters_ + + arm_func_start NNSi_G3dAnmCalcNsBtp +NNSi_G3dAnmCalcNsBtp: ; 0x020C5D64 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + ldr r3, [r6] + ldr r5, [r6, #8] + mov r1, r2, lsl #0x10 + mov r2, r3, lsl #4 + mov r7, r0 + mov r0, r5 + mov r1, r1, lsr #0x10 + mov r2, r2, lsr #0x10 + bl NNSi_G3dGetTexPatAnmFV + mov r4, r0 + ldrb r1, [r4, #2] + mov r0, r5 + bl NNSi_G3dGetTexPatAnmTexNameByIdx + mov r1, r0 + ldr r0, [r6, #0x14] + mov r2, r7 + bl SetTexParamaters_ + ldrb r1, [r4, #3] + cmp r1, #0xff + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r5 + bl NNSi_G3dGetTexPatAnmPlttNameByIdx + mov r1, r0 + ldr r0, [r6, #0x14] + mov r2, r7 + bl SetPlttParamaters_ + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_G3dAnmCalcNsBtp + + arm_func_start NNSi_G3dAnmObjInitNsBva +NNSi_G3dAnmObjInitNsBva: ; 0x020C5DD8 + ldr r3, _020C5E20 ; =_02110A04 + mov ip, #0 + ldr r3, [r3] + str r3, [r0, #0xc] + ldrb r2, [r2, #0x17] + strb r2, [r0, #0x19] + str r1, [r0, #8] + ldrb r1, [r0, #0x19] + cmp r1, #0 + bxls lr +_020C5E00: + orr r2, ip, #0x100 + add r1, r0, ip, lsl #1 + strh r2, [r1, #0x1a] + ldrb r1, [r0, #0x19] + add ip, ip, #1 + cmp ip, r1 + blo _020C5E00 + bx lr + .align 2, 0 +_020C5E20: .word _02110A04 + arm_func_end NNSi_G3dAnmObjInitNsBva + + arm_func_start NNSi_G3dAnmCalcNsBva +NNSi_G3dAnmCalcNsBva: ; 0x020C5E24 + stmdb sp!, {r3, lr} + ldr lr, [r1, #8] + ldr r3, [r1] + ldrh r1, [lr, #6] + mov ip, r3, asr #0xc + mov r3, #1 + mla r2, ip, r1, r2 + mov r1, r2, lsr #5 + add r1, lr, r1, lsl #2 + ldr r1, [r1, #0xc] + and r2, r2, #0x1f + and r1, r1, r3, lsl r2 + str r1, [r0] + ldmia sp!, {r3, pc} + arm_func_end NNSi_G3dAnmCalcNsBva + + arm_func_start NNSi_G3dSendJointSRTBasic +NNSi_G3dSendJointSRTBasic: ; 0x020C5E5C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4] + tst r0, #4 + bne _020C5EA0 + tst r0, #2 + bne _020C5E8C + add r1, r4, #0x28 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + b _020C5EB8 +_020C5E8C: + add r1, r4, #0x4c + mov r0, #0x1c + mov r2, #3 + bl NNS_G3dGeBufferOP_N + b _020C5EB8 +_020C5EA0: + tst r0, #2 + bne _020C5EB8 + add r1, r4, #0x28 + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N +_020C5EB8: + ldr r0, [r4] + tst r0, #1 + ldmneia sp!, {r4, pc} + add r1, r4, #4 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N + ldmia sp!, {r4, pc} + arm_func_end NNSi_G3dSendJointSRTBasic + + arm_func_start NNSi_G3dGetJointScaleBasic +NNSi_G3dGetJointScaleBasic: ; 0x020C5ED8 + tst r3, #4 + beq _020C5EF0 + ldr r1, [r0] + orr r1, r1, #1 + str r1, [r0] + b _020C5F08 +_020C5EF0: + ldr r2, [r1] + str r2, [r0, #4] + ldr r2, [r1, #4] + str r2, [r0, #8] + ldr r1, [r1, #8] + str r1, [r0, #0xc] +_020C5F08: + ldr r1, [r0] + orr r1, r1, #0x18 + str r1, [r0] + bx lr + arm_func_end NNSi_G3dGetJointScaleBasic + + arm_func_start NNSi_G3dSendJointSRTMaya +NNSi_G3dSendJointSRTMaya: ; 0x020C5F18 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5] + mov r4, #0 + tst r0, #4 + moveq r4, #1 + tst r0, #0x20 + beq _020C5F6C + tst r0, #8 + bne _020C5F6C + cmp r4, #0 + beq _020C5F5C + add r1, r5, #0x4c + mov r0, #0x1c + mov r2, #3 + bl NNS_G3dGeBufferOP_N + mov r4, #0 +_020C5F5C: + add r1, r5, #0x10 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C5F6C: + ldr r0, [r5] + tst r0, #2 + bne _020C5FA4 + cmp r4, #0 + add r1, r5, #0x28 + beq _020C5F94 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + b _020C5FBC +_020C5F94: + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + b _020C5FBC +_020C5FA4: + cmp r4, #0 + beq _020C5FBC + add r1, r5, #0x4c + mov r0, #0x1c + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C5FBC: + ldr r0, [r5] + tst r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + add r1, r5, #4 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_G3dSendJointSRTMaya + + arm_func_start NNSi_G3dGetJointScaleMaya +NNSi_G3dGetJointScaleMaya: ; 0x020C5FDC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov ip, r0 + tst r3, #4 + ldrb r0, [r2, #3] + beq _020C6030 + ldr r1, [ip] + tst r0, #2 + orr r1, r1, #1 + str r1, [ip] + beq _020C60A8 + ldr r1, _020C611C ; =_021DA700 + ldrb r7, [r2, #1] + ldr r1, [r1] + mov r3, #1 + add r6, r1, #0xc4 + mov r5, r7, lsr #5 + ldr r4, [r6, r5, lsl #2] + and r1, r7, #0x1f + orr r1, r4, r3, lsl r1 + str r1, [r6, r5, lsl #2] + b _020C60A8 +_020C6030: + ldr r3, [r1] + tst r0, #2 + str r3, [ip, #4] + ldr r3, [r1, #4] + str r3, [ip, #8] + ldr r3, [r1, #8] + str r3, [ip, #0xc] + beq _020C60A8 + ldr r3, _020C611C ; =_021DA700 + ldrb r8, [r2, #1] + ldr r4, [r3] + mov r3, #0x18 + add r7, r4, #0xc4 + mov r6, r8, lsr #5 + and r4, r8, #0x1f + mov r5, #1 + mvn r4, r5, lsl r4 + ldr lr, [r7, r6, lsl #2] + smulbb r5, r8, r3 + and r3, lr, r4 + str r3, [r7, r6, lsl #2] + ldr r4, [r1, #0xc] + ldr r3, _020C6120 ; =_021DB510 + ldr lr, _020C6124 ; =_021DB514 + str r4, [r3, r5] + ldr r4, [r1, #0x10] + ldr r3, _020C6128 ; =_021DB518 + str r4, [lr, r5] + ldr r1, [r1, #0x14] + str r1, [r3, r5] +_020C60A8: + tst r0, #1 + beq _020C610C + ldrb r3, [r2, #2] + ldr r1, [ip] + ldr r0, _020C611C ; =_021DA700 + orr r1, r1, #0x20 + str r1, [ip] + ldr r1, [r0] + mov r0, r3, lsr #5 + add r0, r1, r0, lsl #2 + ldr r0, [r0, #0xc4] + and r1, r3, #0x1f + mov r2, #1 + tst r0, r2, lsl r1 + beq _020C60F4 + ldr r0, [ip] + orr r0, r0, #8 + str r0, [ip] + b _020C610C +_020C60F4: + ldr r1, _020C6120 ; =_021DB510 + mov r0, #0x18 + mla r0, r3, r0, r1 + add r3, ip, #0x10 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} +_020C610C: + ldr r0, [ip] + orr r0, r0, #0x10 + str r0, [ip] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C611C: .word _021DA700 +_020C6120: .word _021DB510 +_020C6124: .word _021DB514 +_020C6128: .word _021DB518 + arm_func_end NNSi_G3dGetJointScaleMaya + + arm_func_start texmtxCalc_flag_ +texmtxCalc_flag_: ; 0x020C612C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldrh r2, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + mov sl, r0 + mov r8, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, r8 + bl FX_DivAsync + ldrsh r5, [sb, #0x22] + ldr r3, [sb, #0x18] + ldrsh r0, [sb, #0x20] + ldr r4, [sb, #0x1c] + smull r2, r1, r3, r5 + mov r6, r2, lsr #0xc + orr r6, r6, r1, lsl #20 + smull r2, r1, r3, r0 + mov r7, r2, lsr #0xc + orr r7, r7, r1, lsl #20 + smull r3, r2, r4, r0 + smull r1, r0, r4, r5 + mov r5, r3, lsr #0xc + orr r5, r5, r2, lsl #20 + mov r4, r1, lsr #0xc + orr r4, r4, r0, lsl #20 + str r6, [sl] + str r4, [sl, #0x14] + bl FX_GetDivResult + mov r1, fp + rsb r2, r5, #0 + mul r0, r2, r0 + mov r0, r0, asr #0xc + str r0, [sl, #4] + mov r0, r8 + bl FX_DivAsync + sub r0, r5, r4 + add r1, r7, r6 + ldr r5, [sb, #0x18] + ldrh r4, [sb, #0x2c] + sub r2, r5, r1 + ldr r1, [sb, #0x24] + mul r3, r4, r2 + smull r2, r1, r5, r1 + mov r2, r2, lsr #8 + orr r2, r2, r1, lsl #24 + mul r1, r4, r2 + rsb r1, r1, r3, lsl #3 + str r1, [sl, #0x30] + ldr r4, [sb, #0x1c] + ldrh r3, [sb, #0x2e] + sub r0, r0, r4 + add r0, r0, #0x2000 + mul r2, r3, r0 + ldr r0, [sb, #0x28] + smull r1, r0, r4, r0 + mov r1, r1, lsr #8 + orr r1, r1, r0, lsl #24 + mul r0, r3, r1 + add r0, r0, r2, lsl #3 + str r0, [sl, #0x34] + bl FX_GetDivResult + mul r0, r7, r0 + mov r0, r0, asr #0xc + str r0, [sl, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flag_ + + arm_func_start texmtxCalc_flagS_ +texmtxCalc_flagS_: ; 0x020C6234 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + rsb r2, r2, #0 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrsh r2, [r5, #0x20] + ldrsh r1, [r5, #0x22] + ldrh r3, [r5, #0x2c] + ldr r0, [r5, #0x24] + add r1, r2, r1 + rsb r1, r1, #0 + add r2, r1, #0x1000 + mul r1, r0, r3 + mul r2, r3, r2 + mov r0, r1, lsl #4 + rsb r0, r0, r2, lsl #3 + str r0, [r6, #0x30] + ldrsh r2, [r5, #0x20] + ldrsh r1, [r5, #0x22] + ldrh r3, [r5, #0x2e] + ldr r0, [r5, #0x28] + sub r1, r2, r1 + add r2, r1, #0x1000 + mul r1, r0, r3 + mul r2, r3, r2 + mov r0, r1, lsl #4 + add r0, r0, r2, lsl #3 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagS_ + + arm_func_start texmtxCalc_flagR_ +texmtxCalc_flagR_: ; 0x020C6304 + stmdb sp!, {r4, lr} + ldr r3, [r1, #0x18] + mov r2, #0 + str r3, [r0] + ldr r3, [r1, #0x1c] + str r3, [r0, #0x14] + str r2, [r0, #4] + ldr r4, [r1, #0x18] + ldr r3, [r1, #0x24] + ldrh lr, [r1, #0x2c] + smull ip, r3, r4, r3 + mov r4, ip, lsr #8 + orr r4, r4, r3, lsl #24 + rsb r3, r4, #0 + mul r3, lr, r3 + str r3, [r0, #0x30] + ldr r4, [r1, #0x1c] + ldr ip, [r1, #0x28] + mov r3, r4, lsl #1 + smull lr, ip, r4, ip + rsb r4, r3, #0 + mov r3, lr, lsr #8 + ldrh lr, [r1, #0x2e] + add r1, r4, #0x2000 + orr r3, r3, ip, lsl #24 + mul r4, lr, r1 + mul r1, lr, r3 + add r1, r1, r4, lsl #3 + str r1, [r0, #0x34] + str r2, [r0, #0x10] + ldmia sp!, {r4, pc} + arm_func_end texmtxCalc_flagR_ + + arm_func_start texmtxCalc_flagRS_ +texmtxCalc_flagRS_: ; 0x020C6380 + mov r2, #0x1000 + str r2, [r0] + str r2, [r0, #0x14] + mov ip, #0 + str ip, [r0, #4] + ldrh r2, [r1, #0x2c] + ldr r3, [r1, #0x24] + mul r2, r3, r2 + rsb r2, r2, #0 + mov r2, r2, lsl #4 + str r2, [r0, #0x30] + ldrh r2, [r1, #0x2e] + ldr r1, [r1, #0x28] + mul r2, r1, r2 + mov r1, r2, lsl #4 + str r1, [r0, #0x34] + str ip, [r0, #0x10] + bx lr + arm_func_end texmtxCalc_flagRS_ + + arm_func_start texmtxCalc_flagT_ +texmtxCalc_flagT_: ; 0x020C63C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldrh r2, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + mov sl, r0 + mov r8, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, r8 + bl FX_DivAsync + ldrsh r5, [sb, #0x22] + ldr r3, [sb, #0x18] + ldrsh r0, [sb, #0x20] + ldr r4, [sb, #0x1c] + smull r2, r1, r3, r5 + mov r6, r2, lsr #0xc + orr r6, r6, r1, lsl #20 + smull r2, r1, r3, r0 + mov r7, r2, lsr #0xc + orr r7, r7, r1, lsl #20 + smull r3, r2, r4, r0 + smull r1, r0, r4, r5 + mov r5, r3, lsr #0xc + orr r5, r5, r2, lsl #20 + mov r4, r1, lsr #0xc + orr r4, r4, r0, lsl #20 + str r6, [sl] + str r4, [sl, #0x14] + bl FX_GetDivResult + mov r1, fp + rsb r2, r5, #0 + mul r0, r2, r0 + mov r0, r0, asr #0xc + str r0, [sl, #4] + mov r0, r8 + bl FX_DivAsync + sub r1, r5, r4 + add r0, r7, r6 + ldrh r3, [sb, #0x2c] + ldr r2, [sb, #0x18] + sub r0, r2, r0 + mul r0, r3, r0 + mov r0, r0, lsl #3 + str r0, [sl, #0x30] + ldrh r2, [sb, #0x2e] + ldr r0, [sb, #0x1c] + sub r0, r1, r0 + add r0, r0, #0x2000 + mul r0, r2, r0 + mov r0, r0, lsl #3 + str r0, [sl, #0x34] + bl FX_GetDivResult + mul r0, r7, r0 + mov r0, r0, asr #0xc + str r0, [sl, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flagT_ + + arm_func_start texmtxCalc_flagTS_ +texmtxCalc_flagTS_: ; 0x020C64A8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + rsb r2, r2, #0 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrsh r1, [r5, #0x20] + ldrsh r0, [r5, #0x22] + ldrh r2, [r5, #0x2c] + add r0, r1, r0 + rsb r0, r0, #0 + add r0, r0, #0x1000 + mul r0, r2, r0 + mov r0, r0, lsl #3 + str r0, [r6, #0x30] + ldrsh r1, [r5, #0x20] + ldrsh r0, [r5, #0x22] + ldrh r2, [r5, #0x2e] + sub r0, r1, r0 + add r0, r0, #0x1000 + mul r0, r2, r0 + mov r0, r0, lsl #3 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagTS_ + + arm_func_start texmtxCalc_flagTR_ +texmtxCalc_flagTR_: ; 0x020C6560 + ldr r2, [r1, #0x18] + mov ip, #0 + str r2, [r0] + ldr r2, [r1, #0x1c] + str r2, [r0, #0x14] + str ip, [r0, #4] + str ip, [r0, #0x30] + ldr r2, [r1, #0x1c] + ldrh r3, [r1, #0x2e] + mov r1, r2, lsl #1 + rsb r1, r1, #0 + add r1, r1, #0x2000 + mul r1, r3, r1 + mov r1, r1, lsl #3 + str r1, [r0, #0x34] + str ip, [r0, #0x10] + bx lr + arm_func_end texmtxCalc_flagTR_ + + arm_func_start texmtxCalc_flagTRS_ +texmtxCalc_flagTRS_: ; 0x020C65A4 + mov r2, #0x1000 + str r2, [r0] + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #0x10] + str r2, [r0, #0x14] + str r1, [r0, #0x30] + str r1, [r0, #0x34] + bx lr + arm_func_end texmtxCalc_flagTRS_ + + arm_func_start NNSi_G3dSendTexSRTMaya +NNSi_G3dSendTexSRTMaya: ; 0x020C65C8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x4c + mov r4, r0 + ldr r0, [r4] + mov r1, #0 + tst r0, #8 + ldrne r0, _020C6704 ; =0x00101610 + mov r3, #3 + strne r0, [sp] + ldreq r0, _020C6708 ; =0x00101810 + mov r2, #2 + streq r0, [sp] + mov r0, #0x1000 + str r0, [sp, #0x44] + str r3, [sp, #4] + str r2, [sp, #0x48] + str r1, [sp, #0x40] + str r1, [sp, #0x34] + str r1, [sp, #0x30] + str r1, [sp, #0x2c] + str r1, [sp, #0x28] + str r1, [sp, #0x24] + str r1, [sp, #0x20] + str r1, [sp, #0x14] + str r1, [sp, #0x10] + ldr r1, [r4] + ldr r0, _020C670C ; =_02110C1C + and r1, r1, #7 + ldr r2, [r0, r1, lsl #2] + add r0, sp, #8 + mov r1, r4 + blx r2 + ldr r3, [r4, #0x30] + cmp r3, #0x1000 + beq _020C6698 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #8] + ldr r2, [r4, #0x30] + ldr r0, [sp, #0x38] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0xc] + ldr r1, [r4, #0x30] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x38] +_020C6698: + ldr r3, [r4, #0x34] + cmp r3, #0x1000 + beq _020C66E8 + ldr r0, [sp, #0x18] + ldr r1, [sp, #0x1c] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #0x18] + ldr r2, [r4, #0x34] + ldr r0, [sp, #0x3c] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x1c] + ldr r1, [r4, #0x34] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x3c] +_020C66E8: + add r1, sp, #0 + ldr r0, [sp] + add r1, r1, #4 + mov r2, #0x12 + bl NNS_G3dGeBufferOP_N + add sp, sp, #0x4c + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020C6704: .word 0x00101610 +_020C6708: .word 0x00101810 +_020C670C: .word _02110C1C + arm_func_end NNSi_G3dSendTexSRTMaya + + arm_func_start NNSi_G3dSendJointSRTSi3d +NNSi_G3dSendJointSRTSi3d: ; 0x020C6710 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r6, r0 + ldr r0, [r6] + mov r4, #0 + ands r5, r0, #0x18 + bne _020C673C + add r1, r6, #0x1c + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C673C: + ldr r0, [r6] + tst r0, #4 + bne _020C67AC + cmp r5, #0 + movne r4, #1 + bne _020C67AC + ldr r2, [r6, #0x4c] + ldr r0, [r6, #0x10] + add r1, sp, #0 + smull r3, r0, r2, r0 + mov r2, r3, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp] + ldr r3, [r6, #0x50] + ldr r2, [r6, #0x14] + mov r0, #0x1c + smull ip, r2, r3, r2 + mov r3, ip, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sp, #4] + ldr ip, [r6, #0x54] + ldr r3, [r6, #0x18] + mov r2, #3 + smull lr, r3, ip, r3 + mov ip, lr, lsr #0xc + orr ip, ip, r3, lsl #20 + str ip, [sp, #8] + bl NNS_G3dGeBufferOP_N +_020C67AC: + ldr r0, [r6] + tst r0, #2 + bne _020C67E4 + cmp r4, #0 + add r1, r6, #0x28 + beq _020C67D4 + mov r0, #0x19 + mov r2, #0xc + bl NNS_G3dGeBufferOP_N + b _020C67FC +_020C67D4: + mov r0, #0x1a + mov r2, #9 + bl NNS_G3dGeBufferOP_N + b _020C67FC +_020C67E4: + cmp r4, #0 + beq _020C67FC + add r1, r6, #0x4c + mov r0, #0x1c + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C67FC: + cmp r5, #0 + bne _020C6814 + add r1, r6, #0x10 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N +_020C6814: + ldr r0, [r6] + tst r0, #1 + addne sp, sp, #0xc + ldmneia sp!, {r3, r4, r5, r6, pc} + add r1, r6, #4 + mov r0, #0x1b + mov r2, #3 + bl NNS_G3dGeBufferOP_N + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end NNSi_G3dSendJointSRTSi3d + + arm_func_start NNSi_G3dGetJointScaleSi3d +NNSi_G3dGetJointScaleSi3d: ; 0x020C683C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r0 + tst r3, #4 + ldrb r4, [r2, #1] + ldrb r0, [r2, #2] + beq _020C68D8 + ldr r2, [r5] + ldr r1, _020C6A3C ; =_021DA700 + orr r2, r2, #1 + str r2, [r5] + ldr r3, [r1] + mov r1, r0, lsr #5 + add r1, r3, r1, lsl #2 + ldr r1, [r1, #0xc4] + and r2, r0, #0x1f + mov r6, #1 + tst r1, r6, lsl r2 + beq _020C68AC + add r3, r3, #0xc4 + mov r2, r4, lsr #5 + ldr r1, [r3, r2, lsl #2] + and r0, r4, #0x1f + orr r0, r1, r6, lsl r0 + str r0, [r3, r2, lsl #2] + ldr r0, [r5] + orr r0, r0, #0x18 + str r0, [r5] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C68AC: + mov r2, #0x18 + ldr r7, _020C6A40 ; =_021DB504 + mul r6, r0, r2 + mla r1, r4, r2, r7 + add r0, r7, r6 + bl MIi_CpuCopy32 + add r0, r7, r6 + add r1, r5, #0x10 + mov r2, #0x18 + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C68D8: + ldr r3, [r1] + ldr r2, _020C6A3C ; =_021DA700 + str r3, [r5, #4] + ldr r3, [r1, #4] + mov r7, r0, lsr #5 + str r3, [r5, #8] + ldr r3, [r1, #8] + and r8, r0, #0x1f + str r3, [r5, #0xc] + ldr r6, [r2] + mov r3, #1 + add r2, r6, r7, lsl #2 + ldr r2, [r2, #0xc4] + tst r2, r3, lsl r8 + mov r2, #0x18 + beq _020C6960 + ldr r3, _020C6A40 ; =_021DB504 + mov r0, r1 + mla r1, r4, r2, r3 + bl MIi_CpuCopy32 + ldr r0, _020C6A3C ; =_021DA700 + mov r2, r4, lsr #5 + ldr r1, [r0] + and r0, r4, #0x1f + add r3, r1, #0xc4 + mov r1, #1 + mvn r0, r1, lsl r0 + ldr r1, [r3, r2, lsl #2] + and r0, r1, r0 + str r0, [r3, r2, lsl #2] + ldr r0, [r5] + orr r0, r0, #0x18 + str r0, [r5] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020C6960: + mul ip, r0, r2 + and r7, r4, #0x1f + mvn r7, r3, lsl r7 + add r6, r6, #0xc4 + mov lr, r4, lsr #5 + ldr r8, [r6, lr, lsl #2] + mul r3, r4, r2 + and r4, r8, r7 + str r4, [r6, lr, lsl #2] + ldr r0, _020C6A40 ; =_021DB504 + ldr r7, [r1] + ldr r4, [r0, ip] + ldr r6, _020C6A44 ; =_021DB508 + smull r8, r4, r7, r4 + mov r7, r8, lsr #0xc + orr r7, r7, r4, lsl #20 + str r7, [r0, r3] + ldr r8, [r1, #4] + ldr r4, [r6, ip] + ldr r7, _020C6A48 ; =_021DB50C + smull lr, r4, r8, r4 + mov r8, lr, lsr #0xc + orr r8, r8, r4, lsl #20 + str r8, [r6, r3] + ldr r8, [r1, #8] + ldr r4, [r7, ip] + ldr r6, _020C6A4C ; =_021DB510 + smull lr, r4, r8, r4 + mov r8, lr, lsr #0xc + orr r8, r8, r4, lsl #20 + str r8, [r7, r3] + ldr r7, [r1, #0xc] + ldr r4, [r6, ip] + ldr lr, _020C6A50 ; =_021DB514 + smull r8, r4, r7, r4 + mov r7, r8, lsr #0xc + orr r7, r7, r4, lsl #20 + str r7, [r6, r3] + ldr r7, [r1, #0x10] + ldr r6, [lr, ip] + ldr r4, _020C6A54 ; =_021DB518 + smull r8, r6, r7, r6 + mov r7, r8, lsr #0xc + orr r7, r7, r6, lsl #20 + str r7, [lr, r3] + ldr r6, [r1, #0x14] + ldr r1, [r4, ip] + add r0, r0, ip + smull ip, r1, r6, r1 + mov r6, ip, lsr #0xc + orr r6, r6, r1, lsl #20 + add r1, r5, #0x10 + str r6, [r4, r3] + bl MIi_CpuCopy32 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C6A3C: .word _021DA700 +_020C6A40: .word _021DB504 +_020C6A44: .word _021DB508 +_020C6A48: .word _021DB50C +_020C6A4C: .word _021DB510 +_020C6A50: .word _021DB514 +_020C6A54: .word _021DB518 + arm_func_end NNSi_G3dGetJointScaleSi3d + + arm_func_start NNSi_G3dSendTexSRTSi3d +NNSi_G3dSendTexSRTSi3d: ; 0x020C6A58 + stmdb sp!, {lr} + sub sp, sp, #0x3c + ldr r1, [r0] + mov r2, #0 + tst r1, #8 + ldrne r1, _020C6C1C ; =0x00101710 + mov r3, #3 + strne r1, [sp] + ldreq r1, _020C6C20 ; =0x00101910 + str r3, [sp, #4] + streq r1, [sp] + mov r1, #2 + str r2, [sp, #0x34] + str r2, [sp, #0x28] + str r2, [sp, #0x24] + str r2, [sp, #0x20] + str r2, [sp, #0x1c] + str r2, [sp, #0x14] + str r2, [sp, #0x10] + str r2, [sp, #0xc] + str r1, [sp, #0x38] + ldr r1, [r0] + tst r1, #4 + beq _020C6AF0 + str r2, [sp, #0x2c] + str r2, [sp, #0x30] + ldr r1, [r0] + tst r1, #1 + beq _020C6ADC + mov r1, #0x1000 + str r1, [sp, #8] + str r1, [sp, #0x18] + b _020C6B90 +_020C6ADC: + ldr r1, [r0, #0x18] + str r1, [sp, #8] + ldr r1, [r0, #0x1c] + str r1, [sp, #0x18] + b _020C6B90 +_020C6AF0: + tst r1, #1 + beq _020C6B38 + ldr r2, [r0, #0x24] + ldrh r1, [r0, #0x2c] + mov r2, r2, lsl #4 + rsb r2, r2, #0 + mul r1, r2, r1 + str r1, [sp, #0x2c] + ldr r2, [r0, #0x28] + ldrh r1, [r0, #0x2e] + mov r2, r2, lsl #4 + rsb r2, r2, #0 + mul r3, r2, r1 + mov r1, #0x1000 + str r3, [sp, #0x30] + str r1, [sp, #8] + str r1, [sp, #0x18] + b _020C6B90 +_020C6B38: + ldr r2, [r0, #0x18] + ldr r1, [r0, #0x24] + ldrh ip, [r0, #0x2c] + smull r3, r1, r2, r1 + mov r2, r3, lsr #8 + orr r2, r2, r1, lsl #24 + rsb r1, r2, #0 + mul r1, ip, r1 + str r1, [sp, #0x2c] + ldr r2, [r0, #0x1c] + ldr r1, [r0, #0x28] + ldrh ip, [r0, #0x2e] + smull r3, r1, r2, r1 + mov r2, r3, lsr #8 + orr r2, r2, r1, lsl #24 + rsb r1, r2, #0 + mul r1, ip, r1 + str r1, [sp, #0x30] + ldr r1, [r0, #0x18] + str r1, [sp, #8] + ldr r1, [r0, #0x1c] + str r1, [sp, #0x18] +_020C6B90: + ldr ip, [r0, #0x30] + cmp ip, #0x1000 + beq _020C6BC8 + ldr r2, [sp, #8] + ldr r1, [sp, #0x2c] + smull r3, r2, ip, r2 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sp, #8] + ldr r2, [r0, #0x30] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x2c] +_020C6BC8: + ldr ip, [r0, #0x34] + cmp ip, #0x1000 + beq _020C6C00 + ldr r2, [sp, #0x18] + ldr r1, [sp, #0x30] + smull r3, r2, ip, r2 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + str r3, [sp, #0x18] + ldr r0, [r0, #0x34] + smull r2, r1, r0, r1 + mov r0, r2, lsr #0xc + orr r0, r0, r1, lsl #20 + str r0, [sp, #0x30] +_020C6C00: + add r1, sp, #0 + ldr r0, [sp] + add r1, r1, #4 + mov r2, #0xe + bl NNS_G3dGeBufferOP_N + add sp, sp, #0x3c + ldmia sp!, {pc} + .align 2, 0 +_020C6C1C: .word 0x00101710 +_020C6C20: .word 0x00101910 + arm_func_end NNSi_G3dSendTexSRTSi3d + + arm_func_start texmtxCalc_flag___3dsmax +texmtxCalc_flag___3dsmax: ; 0x020C6C24 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldrh r2, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + mov sl, r0 + mov r8, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, r8 + bl FX_DivAsync + ldrsh r0, [sb, #0x22] + ldr r3, [sb, #0x18] + ldrsh r5, [sb, #0x20] + ldr r4, [sb, #0x1c] + smull r2, r1, r3, r0 + mov r7, r2, lsr #0xc + orr r7, r7, r1, lsl #20 + smull r2, r1, r3, r5 + mov r6, r2, lsr #0xc + orr r6, r6, r1, lsl #20 + smull r3, r2, r4, r0 + smull r1, r0, r4, r5 + mov r5, r3, lsr #0xc + orr r5, r5, r2, lsl #20 + mov r4, r1, lsr #0xc + orr r4, r4, r0, lsl #20 + str r7, [sl] + str r5, [sl, #0x14] + bl FX_GetDivResult + mov r1, fp + mul r0, r4, r0 + mov r0, r0, asr #0xc + str r0, [sl, #4] + mov r0, r8 + bl FX_DivAsync + ldrh r1, [sb, #0x2c] + ldrh r8, [sb, #0x2e] + ldr r2, [sb, #0x28] + rsb r0, r1, #0 + mul r3, r2, r8 + rsb r2, r8, #0 + add r8, r3, r2, lsl #11 + smull r3, r2, r5, r8 + smull r8, r5, r6, r8 + ldr fp, [sb, #0x24] + mul ip, fp, r1 + rsb r0, ip, r0, lsl #11 + smlal r3, r2, r4, r0 + smull r4, r0, r7, r0 + subs r4, r4, r8 + sbc r0, r0, r5 + mov r4, r4, lsr #8 + orr r4, r4, r0, lsl #24 + add r0, r4, r1, lsl #15 + str r0, [sl, #0x30] + ldrh r1, [sb, #0x2e] + mov r0, r3, lsr #8 + orr r0, r0, r2, lsl #24 + add r0, r0, r1, lsl #15 + str r0, [sl, #0x34] + bl FX_GetDivResult + rsb r1, r6, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [sl, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flag___3dsmax + + arm_func_start texmtxCalc_flagS___3dsmax +texmtxCalc_flagS___3dsmax: ; 0x020C6D2C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrh r2, [r5, #0x2c] + ldrh r4, [r5, #0x2e] + ldr r1, [r5, #0x28] + ldr r0, [r5, #0x24] + mul r3, r1, r4 + rsb r1, r4, #0 + mul r4, r0, r2 + rsb r0, r2, #0 + add r1, r3, r1, lsl #11 + ldrsh r3, [r5, #0x20] + rsb r0, r4, r0, lsl #11 + ldrsh lr, [r5, #0x22] + smull ip, r4, r3, r1 + smull r7, r3, lr, r0 + subs r7, r7, ip + sbc r3, r3, r4 + mov r4, r7, lsr #8 + orr r4, r4, r3, lsl #24 + add r2, r4, r2, lsl #15 + str r2, [r6, #0x30] + ldrsh r2, [r5, #0x22] + ldrsh r3, [r5, #0x20] + ldrh ip, [r5, #0x2e] + smull r4, r1, r2, r1 + smlal r4, r1, r3, r0 + mov r0, r4, lsr #8 + orr r0, r0, r1, lsl #24 + add r0, r0, ip, lsl #15 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + rsb r1, r1, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagS___3dsmax + + arm_func_start texmtxCalc_flagR___3dsmax +texmtxCalc_flagR___3dsmax: ; 0x020C6E14 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, [r1, #0x18] + mov r3, #0 + str r2, [r0] + ldr r2, [r1, #0x1c] + str r2, [r0, #0x14] + str r3, [r0, #4] + ldrh r5, [r1, #0x2c] + ldr ip, [r1, #0x24] + ldrh r2, [r1, #0x2e] + mul lr, ip, r5 + rsb ip, r5, #0 + ldr r4, [r1, #0x18] + rsb ip, lr, ip, lsl #11 + smull lr, ip, r4, ip + ldr r6, [r1, #0x28] + mov r4, lr, lsr #8 + orr r4, r4, ip, lsl #24 + add r4, r4, r5, lsl #15 + str r4, [r0, #0x30] + mul r4, r6, r2 + rsb r5, r2, #0 + ldr r2, [r1, #0x1c] + add r4, r4, r5, lsl #11 + smull lr, ip, r2, r4 + mov r2, lr, lsr #8 + ldrh r1, [r1, #0x2e] + orr r2, r2, ip, lsl #24 + add r1, r2, r1, lsl #15 + str r1, [r0, #0x34] + str r3, [r0, #0x10] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end texmtxCalc_flagR___3dsmax + + arm_func_start texmtxCalc_flagRS___3dsmax +texmtxCalc_flagRS___3dsmax: ; 0x020C6E94 + mov r2, #0x1000 + str r2, [r0] + str r2, [r0, #0x14] + mov ip, #0 + str ip, [r0, #4] + ldr r3, [r1, #0x24] + ldrh r2, [r1, #0x2c] + rsb r3, r3, #0 + mul r2, r3, r2 + mov r2, r2, lsl #4 + str r2, [r0, #0x30] + ldrh r2, [r1, #0x2e] + ldr r1, [r1, #0x28] + mul r2, r1, r2 + mov r1, r2, lsl #4 + str r1, [r0, #0x34] + str ip, [r0, #0x10] + bx lr + arm_func_end texmtxCalc_flagRS___3dsmax + + arm_func_start texmtxCalc_flagT___3dsmax +texmtxCalc_flagT___3dsmax: ; 0x020C6EDC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldrh r2, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + mov sl, r0 + mov r8, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, r8 + bl FX_DivAsync + ldrsh r0, [sb, #0x22] + ldr r3, [sb, #0x18] + ldrsh r5, [sb, #0x20] + ldr r4, [sb, #0x1c] + smull r2, r1, r3, r0 + mov r7, r2, lsr #0xc + orr r7, r7, r1, lsl #20 + smull r2, r1, r3, r5 + mov r6, r2, lsr #0xc + orr r6, r6, r1, lsl #20 + smull r3, r2, r4, r0 + smull r1, r0, r4, r5 + mov r5, r3, lsr #0xc + orr r5, r5, r2, lsl #20 + mov r4, r1, lsr #0xc + orr r4, r4, r0, lsl #20 + str r7, [sl] + str r5, [sl, #0x14] + bl FX_GetDivResult + mov r1, fp + mul r0, r4, r0 + mov r0, r0, asr #0xc + str r0, [sl, #4] + mov r0, r8 + bl FX_DivAsync + ldrh r3, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + rsb r0, r3, #0 + rsb r1, r1, #0 + mov r2, r1, lsl #0xb + mov fp, r0, lsl #0xb + smull r1, r0, r7, fp + smull r8, r7, r5, r2 + smlal r8, r7, r4, fp + mov r4, r8, lsr #8 + orr r4, r4, r7, lsl #24 + smull r5, r2, r6, r2 + subs r1, r1, r5 + sbc r0, r0, r2 + mov r1, r1, lsr #8 + orr r1, r1, r0, lsl #24 + add r0, r1, r3, lsl #15 + str r0, [sl, #0x30] + ldrh r0, [sb, #0x2e] + add r0, r4, r0, lsl #15 + str r0, [sl, #0x34] + bl FX_GetDivResult + rsb r1, r6, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [sl, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flagT___3dsmax + + arm_func_start texmtxCalc_flagTS___3dsmax +texmtxCalc_flagTS___3dsmax: ; 0x020C6FD4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + ldrsh r4, [r5, #0x22] + rsb r0, r2, #0 + rsb r1, r1, #0 + mov r0, r0, lsl #0xb + ldrsh r3, [r5, #0x20] + mov r1, r1, lsl #0xb + smull r7, lr, r4, r0 + smull ip, r4, r3, r1 + subs r7, r7, ip + sbc r3, lr, r4 + mov r4, r7, lsr #8 + orr r4, r4, r3, lsl #24 + add r2, r4, r2, lsl #15 + str r2, [r6, #0x30] + ldrsh r2, [r5, #0x22] + ldrsh r3, [r5, #0x20] + ldrh ip, [r5, #0x2e] + smull r4, r1, r2, r1 + smlal r4, r1, r3, r0 + mov r0, r4, lsr #8 + orr r0, r0, r1, lsl #24 + add r0, r0, ip, lsl #15 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + rsb r1, r1, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagTS___3dsmax + + arm_func_start texmtxCalc_flagTR___3dsmax +texmtxCalc_flagTR___3dsmax: ; 0x020C70AC + ldr r2, [r1, #0x18] + mov ip, #0 + str r2, [r0] + ldr r2, [r1, #0x1c] + str r2, [r0, #0x14] + str ip, [r0, #4] + ldr r3, [r1, #0x18] + ldrh r2, [r1, #0x2c] + rsb r3, r3, #0x1000 + mul r2, r3, r2 + mov r2, r2, lsl #3 + str r2, [r0, #0x30] + ldr r2, [r1, #0x1c] + ldrh r1, [r1, #0x2e] + rsb r2, r2, #0x1000 + mul r1, r2, r1 + mov r1, r1, lsl #3 + str r1, [r0, #0x34] + str ip, [r0, #0x10] + bx lr + arm_func_end texmtxCalc_flagTR___3dsmax + + arm_func_start texmtxCalc_flagTRS___3dsmax +texmtxCalc_flagTRS___3dsmax: ; 0x020C70FC + mov r2, #0x1000 + str r2, [r0] + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #0x10] + str r2, [r0, #0x14] + str r1, [r0, #0x30] + str r1, [r0, #0x34] + bx lr + arm_func_end texmtxCalc_flagTRS___3dsmax + + arm_func_start NNSi_G3dSendTexSRT3dsMax +NNSi_G3dSendTexSRT3dsMax: ; 0x020C7120 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x4c + mov r4, r0 + ldr r0, [r4] + mov r1, #0 + tst r0, #8 + ldrne r0, _020C725C ; =0x00101610 + mov r3, #3 + strne r0, [sp] + ldreq r0, _020C7260 ; =0x00101810 + mov r2, #2 + streq r0, [sp] + mov r0, #0x1000 + str r0, [sp, #0x44] + str r3, [sp, #4] + str r2, [sp, #0x48] + str r1, [sp, #0x40] + str r1, [sp, #0x34] + str r1, [sp, #0x30] + str r1, [sp, #0x2c] + str r1, [sp, #0x28] + str r1, [sp, #0x24] + str r1, [sp, #0x20] + str r1, [sp, #0x14] + str r1, [sp, #0x10] + ldr r1, [r4] + ldr r0, _020C7264 ; =_02110C3C + and r1, r1, #7 + ldr r2, [r0, r1, lsl #2] + add r0, sp, #8 + mov r1, r4 + blx r2 + ldr r3, [r4, #0x30] + cmp r3, #0x1000 + beq _020C71F0 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #8] + ldr r2, [r4, #0x30] + ldr r0, [sp, #0x38] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0xc] + ldr r1, [r4, #0x30] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x38] +_020C71F0: + ldr r3, [r4, #0x34] + cmp r3, #0x1000 + beq _020C7240 + ldr r0, [sp, #0x18] + ldr r1, [sp, #0x1c] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #0x18] + ldr r2, [r4, #0x34] + ldr r0, [sp, #0x3c] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x1c] + ldr r1, [r4, #0x34] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x3c] +_020C7240: + add r1, sp, #0 + ldr r0, [sp] + add r1, r1, #4 + mov r2, #0x12 + bl NNS_G3dGeBufferOP_N + add sp, sp, #0x4c + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020C725C: .word 0x00101610 +_020C7260: .word 0x00101810 +_020C7264: .word _02110C3C + arm_func_end NNSi_G3dSendTexSRT3dsMax + + arm_func_start texmtxCalc_flag___xsi +texmtxCalc_flag___xsi: ; 0x020C7268 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r6, r1 + ldrh r2, [r6, #0x2c] + ldrh r1, [r6, #0x2e] + mov r7, r0 + mov sl, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, sl + bl FX_DivAsync + ldrsh r3, [r6, #0x22] + ldr r0, [r6, #0x18] + ldrsh sb, [r6, #0x20] + smull r2, r1, r0, r3 + mov r2, r2, lsr #0xc + ldr r8, [r6, #0x1c] + orr r2, r2, r1, lsl #20 + str r2, [r7] + smull r2, r1, r8, r3 + mov r4, r2, lsr #0xc + orr r4, r4, r1, lsl #20 + smull r2, r1, r0, sb + mov r5, r2, lsr #0xc + orr r5, r5, r1, lsl #20 + str r4, [r7, #0x14] + bl FX_GetDivResult + smull r2, r1, r8, sb + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + mul r0, r2, r0 + mov r0, r0, asr #0xc + str r0, [r7, #4] + mov r0, sl + mov r1, fp + bl FX_DivAsync + ldr lr, [r6, #0x1c] + ldrsh r2, [r6, #0x20] + ldr r8, [r6, #0x24] + ldr r0, [r6, #0x28] + smull sl, sb, r8, r2 + ldrh r1, [r6, #0x2c] + smull r3, r2, r0, r2 + ldrsh ip, [r6, #0x22] + str r1, [sp] + mov fp, lr, asr #0x1f + smlal r3, r2, r8, ip + smull r8, ip, r0, ip + subs r8, sl, r8 + sbc r0, sb, ip + mov sb, r8, lsr #0xc + mov ip, r3, lsr #0xc + orr sb, sb, r0, lsl #20 + mov r3, r2, asr #0xc + orr ip, ip, r2, lsl #20 + umull sl, r2, sb, lr + mla r2, sb, fp, r2 + mov r8, r0, asr #0xc + mla r2, r8, lr, r2 + ldr r1, [r6, #0x18] + mov r8, sl, lsr #0xc + orr r8, r8, r2, lsl #20 + add r2, r4, r8 + mov r0, r1, asr #0x1f + umull r8, r4, ip, r1 + mla r4, ip, r0, r4 + mla r4, r3, r1, r4 + mov r0, r8, lsr #0xc + orr r0, r0, r4, lsl #20 + sub r1, r5, r0 + ldr r0, [sp] + sub r2, r2, #0x1000 + mul r1, r0, r1 + mov r0, r1, lsl #4 + str r0, [r7, #0x30] + ldrh r0, [r6, #0x2e] + rsb r0, r0, #0 + mul r1, r0, r2 + mov r0, r1, lsl #4 + str r0, [r7, #0x34] + bl FX_GetDivResult + rsb r1, r5, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r7, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flag___xsi + + arm_func_start texmtxCalc_flagS___xsi +texmtxCalc_flagS___xsi: ; 0x020C73BC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrsh lr, [r5, #0x20] + ldr r4, [r5, #0x28] + ldrsh r0, [r5, #0x22] + ldr ip, [r5, #0x24] + smull r3, r2, r4, lr + smlal r3, r2, ip, r0 + smull r1, r0, r4, r0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #20 + sub r4, lr, r3 + smull r3, r2, ip, lr + subs r1, r3, r1 + sbc r0, r2, r0 + ldrh r2, [r5, #0x2c] + mov r1, r1, lsr #0xc + orr r1, r1, r0, lsl #20 + mul r0, r2, r4 + mov r0, r0, lsl #4 + str r0, [r6, #0x30] + ldrsh r0, [r5, #0x22] + ldrh r2, [r5, #0x2e] + add r0, r0, r1 + rsb r1, r2, #0 + sub r0, r0, #0x1000 + mul r0, r1, r0 + mov r0, r0, lsl #4 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + rsb r1, r1, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagS___xsi + + arm_func_start texmtxCalc_flagR___xsi +texmtxCalc_flagR___xsi: ; 0x020C749C + stmdb sp!, {r4, lr} + ldr r3, [r1, #0x18] + mov r2, #0 + str r3, [r0] + ldr r3, [r1, #0x1c] + str r3, [r0, #0x14] + str r2, [r0, #4] + ldr ip, [r1, #0x24] + ldr r3, [r1, #0x18] + ldr r4, [r1, #0x28] + smull lr, r3, ip, r3 + mov ip, lr, lsr #0xc + orr ip, ip, r3, lsl #20 + ldrh lr, [r1, #0x2c] + rsb r3, ip, #0 + ldr ip, [r1, #0x1c] + rsb r4, r4, #0 + mul r3, lr, r3 + smull lr, ip, r4, ip + mov r3, r3, lsl #4 + str r3, [r0, #0x30] + mov r4, lr, lsr #0xc + ldrh r3, [r1, #0x2e] + ldr r1, [r1, #0x1c] + orr r4, r4, ip, lsl #20 + add r1, r1, r4 + rsb r3, r3, #0 + sub r1, r1, #0x1000 + mul r1, r3, r1 + mov r1, r1, lsl #4 + str r1, [r0, #0x34] + str r2, [r0, #0x10] + ldmia sp!, {r4, pc} + arm_func_end texmtxCalc_flagR___xsi + + arm_func_start texmtxCalc_flagRS___xsi +texmtxCalc_flagRS___xsi: ; 0x020C7520 + stmdb sp!, {r3, lr} + mov r2, #0x1000 + str r2, [r0] + str r2, [r0, #0x14] + mov lr, #0 + str lr, [r0, #4] + ldr r2, [r1, #0x24] + ldrh r3, [r1, #0x2c] + rsb r2, r2, #0 + ldr ip, [r1, #0x28] + mul r2, r3, r2 + mov r2, r2, lsl #4 + str r2, [r0, #0x30] + ldrh r1, [r1, #0x2e] + rsb r2, ip, #0 + rsb r1, r1, #0 + mul r2, r1, r2 + mov r1, r2, lsl #4 + str r1, [r0, #0x34] + str lr, [r0, #0x10] + ldmia sp!, {r3, pc} + arm_func_end texmtxCalc_flagRS___xsi + + arm_func_start texmtxCalc_flagT___xsi +texmtxCalc_flagT___xsi: ; 0x020C7574 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + ldrh r2, [sb, #0x2c] + ldrh r1, [sb, #0x2e] + mov sl, r0 + mov r8, r2, lsl #0xc + mov fp, r1, lsl #0xc + mov r0, fp + mov r1, r8 + bl FX_DivAsync + ldrsh r3, [sb, #0x22] + ldr r0, [sb, #0x18] + ldrsh r7, [sb, #0x20] + ldr r5, [sb, #0x1c] + smull r2, r1, r0, r3 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sl] + smull r2, r1, r5, r3 + mov r4, r2, lsr #0xc + orr r4, r4, r1, lsl #20 + smull r2, r1, r0, r7 + mov r6, r2, lsr #0xc + orr r6, r6, r1, lsl #20 + str r4, [sl, #0x14] + bl FX_GetDivResult + smull r2, r1, r5, r7 + mov r2, r2, lsr #0xc + orr r2, r2, r1, lsl #20 + mul r0, r2, r0 + mov r0, r0, asr #0xc + str r0, [sl, #4] + mov r0, r8 + mov r1, fp + bl FX_DivAsync + sub r0, r4, #0x1000 + ldrh r1, [sb, #0x2c] + mul r2, r1, r6 + mov r1, r2, lsl #4 + str r1, [sl, #0x30] + ldrh r1, [sb, #0x2e] + rsb r1, r1, #0 + mul r0, r1, r0 + mov r0, r0, lsl #4 + str r0, [sl, #0x34] + bl FX_GetDivResult + rsb r1, r6, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [sl, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end texmtxCalc_flagT___xsi + + arm_func_start texmtxCalc_flagTS___xsi +texmtxCalc_flagTS___xsi: ; 0x020C7640 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrh r2, [r5, #0x2c] + ldrh r1, [r5, #0x2e] + mov r6, r0 + mov r4, r2, lsl #0xc + mov r7, r1, lsl #0xc + mov r0, r7 + mov r1, r4 + bl FX_DivAsync + ldrsh r0, [r5, #0x22] + str r0, [r6] + ldrsh r0, [r5, #0x22] + str r0, [r6, #0x14] + bl FX_GetDivResult + ldrsh r2, [r5, #0x20] + mov r1, r7 + mul r0, r2, r0 + mov r2, r0, asr #0xc + mov r0, r4 + str r2, [r6, #4] + bl FX_DivAsync + ldrh r1, [r5, #0x2c] + ldrsh r0, [r5, #0x20] + mul r0, r1, r0 + mov r0, r0, lsl #4 + str r0, [r6, #0x30] + ldrh r1, [r5, #0x2e] + ldrsh r0, [r5, #0x22] + rsb r1, r1, #0 + sub r0, r0, #0x1000 + mul r0, r1, r0 + mov r0, r0, lsl #4 + str r0, [r6, #0x34] + bl FX_GetDivResult + ldrsh r1, [r5, #0x20] + rsb r1, r1, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xc + str r0, [r6, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end texmtxCalc_flagTS___xsi + + arm_func_start texmtxCalc_flagTR___xsi +texmtxCalc_flagTR___xsi: ; 0x020C76E4 + ldr r2, [r1, #0x18] + mov r3, #0 + str r2, [r0] + ldr r2, [r1, #0x1c] + str r2, [r0, #0x14] + str r3, [r0, #4] + str r3, [r0, #0x30] + ldrh r2, [r1, #0x2e] + ldr r1, [r1, #0x1c] + rsb r2, r2, #0 + sub r1, r1, #0x1000 + mul r1, r2, r1 + mov r1, r1, lsl #4 + str r1, [r0, #0x34] + str r3, [r0, #0x10] + bx lr + arm_func_end texmtxCalc_flagTR___xsi + + arm_func_start texmtxCalc_flagTRS___xsi +texmtxCalc_flagTRS___xsi: ; 0x020C7724 + mov r2, #0x1000 + str r2, [r0] + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #0x10] + str r2, [r0, #0x14] + str r1, [r0, #0x30] + str r1, [r0, #0x34] + bx lr + arm_func_end texmtxCalc_flagTRS___xsi + + arm_func_start NNSi_G3dSendTexSRTXsi +NNSi_G3dSendTexSRTXsi: ; 0x020C7748 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x4c + mov r4, r0 + ldr r0, [r4] + mov r3, #3 + tst r0, #8 + ldrne r0, _020C78C4 ; =0x00101610 + mov r2, #2 + strne r0, [sp] + ldreq r0, _020C78C8 ; =0x00101810 + mov r1, #0x1000 + streq r0, [sp] + mov r0, #0 + str r3, [sp, #4] + str r2, [sp, #0x48] + str r1, [sp, #0x44] + str r0, [sp, #0x40] + str r0, [sp, #0x34] + str r0, [sp, #0x30] + str r0, [sp, #0x2c] + str r0, [sp, #0x28] + str r0, [sp, #0x24] + str r0, [sp, #0x20] + str r0, [sp, #0x14] + str r0, [sp, #0x10] + ldr r0, [r4] + tst r0, #1 + strne r1, [r4, #0x1c] + strne r1, [r4, #0x18] + ldr r0, [r4] + tst r0, #2 + beq _020C77D8 + mov r0, #0x1000 + strh r0, [r4, #0x22] + mov r0, #0 + strh r0, [r4, #0x20] +_020C77D8: + ldr r0, [r4] + tst r0, #4 + movne r0, #0 + strne r0, [r4, #0x28] + strne r0, [r4, #0x24] + ldr r1, [r4] + ldr r0, _020C78CC ; =_02110C5C + and r1, r1, #7 + ldr r2, [r0, r1, lsl #2] + add r0, sp, #8 + mov r1, r4 + blx r2 + ldr r3, [r4, #0x30] + cmp r3, #0x1000 + beq _020C7858 + ldr r0, [sp, #8] + ldr r1, [sp, #0xc] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #8] + ldr r2, [r4, #0x30] + ldr r0, [sp, #0x38] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0xc] + ldr r1, [r4, #0x30] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x38] +_020C7858: + ldr r3, [r4, #0x34] + cmp r3, #0x1000 + beq _020C78A8 + ldr r0, [sp, #0x18] + ldr r1, [sp, #0x1c] + smull r2, r0, r3, r0 + mov r2, r2, lsr #0xc + orr r2, r2, r0, lsl #20 + str r2, [sp, #0x18] + ldr r2, [r4, #0x34] + ldr r0, [sp, #0x3c] + smull r3, r1, r2, r1 + mov r2, r3, lsr #0xc + orr r2, r2, r1, lsl #20 + str r2, [sp, #0x1c] + ldr r1, [r4, #0x34] + smull r2, r0, r1, r0 + mov r1, r2, lsr #0xc + orr r1, r1, r0, lsl #20 + str r1, [sp, #0x3c] +_020C78A8: + add r1, sp, #0 + ldr r0, [sp] + add r1, r1, #4 + mov r2, #0x12 + bl NNS_G3dGeBufferOP_N + add sp, sp, #0x4c + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020C78C4: .word 0x00101610 +_020C78C8: .word 0x00101810 +_020C78CC: .word _02110C5C + arm_func_end NNSi_G3dSendTexSRTXsi + + arm_func_start NNS_SndInit +NNS_SndInit: ; 0x020C78D0 + stmdb sp!, {r3, lr} + ldr r0, _020C7944 ; =_021DD420 + ldr r1, [r0, #0xc] + cmp r1, #0 + ldmneia sp!, {r3, pc} + mov r1, #1 + str r1, [r0, #0xc] + bl SND_Init + ldr r0, _020C7948 ; =BeginSleep + ldr r1, _020C7944 ; =_021DD420 + mov r2, #0 + str r0, [r1, #0x10] + ldr r0, _020C794C ; =EndSleep + str r2, [r1, #0x14] + str r0, [r1, #0x1c] + ldr r0, _020C7950 ; =_021DD430 + str r2, [r1, #0x20] + bl PM_PrependPreSleepCallback + ldr r0, _020C7954 ; =_021DD43C + bl PM_AppendPostSleepCallback + bl NNSi_SndInitResourceMgr + bl NNSi_SndCaptureInit + bl NNSi_SndPlayerInit + ldr r0, _020C7944 ; =_021DD420 + mvn r1, #0 + strb r1, [r0] + mov r1, #1 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020C7944: .word _021DD420 +_020C7948: .word BeginSleep +_020C794C: .word EndSleep +_020C7950: .word _021DD430 +_020C7954: .word _021DD43C + arm_func_end NNS_SndInit + + arm_func_start NNS_SndMain +NNS_SndMain: ; 0x020C7958 + stmdb sp!, {r4, lr} + mov r4, #0 +_020C7960: + mov r0, r4 + bl SND_RecvCommandReply + cmp r0, #0 + bne _020C7960 + bl NNSi_SndPlayerMain + bl NNSi_SndCaptureMain + bl NNSi_SndArcStrmMain + mov r0, #0 + bl SND_FlushCommand + ldmia sp!, {r4, pc} + arm_func_end NNS_SndMain + + arm_func_start NNS_SndSetMasterVolume +NNS_SndSetMasterVolume: ; 0x020C7988 + ldr ip, _020C7990 ; =SND_SetMasterVolume + bx ip + .align 2, 0 +_020C7990: .word SND_SetMasterVolume + arm_func_end NNS_SndSetMasterVolume + + arm_func_start NNS_SndSetMonoFlag +NNS_SndSetMonoFlag: ; 0x020C7994 + stmdb sp!, {r3, lr} + cmp r0, #0 + beq _020C79AC + mov r0, #0x40 + bl SND_SetMasterPan + ldmia sp!, {r3, pc} +_020C79AC: + bl SND_ResetMasterPan + ldmia sp!, {r3, pc} + arm_func_end NNS_SndSetMonoFlag + + arm_func_start NNS_SndUpdateDriverInfo +NNS_SndUpdateDriverInfo: ; 0x020C79B4 + stmdb sp!, {r4, lr} + ldr r0, _020C7A88 ; =_021DD420 + ldr r0, [r0, #4] + cmp r0, #0 + bne _020C7A68 + mov r4, #0 +_020C79CC: + mov r0, r4 + bl SND_RecvCommandReply + cmp r0, #0 + bne _020C79CC + ldr r0, _020C7A88 ; =_021DD420 + ldr r0, [r0, #8] + bl SND_IsFinishedCommandTag + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _020C7A88 ; =_021DD420 + ldr r2, _020C7A8C ; =_021DD460 + ldrsb r1, [r0] + cmp r1, #0 + movlt r1, #1 + strltb r1, [r0] + ldr r0, _020C7A88 ; =_021DD420 + ldrsb r1, [r0] + ldr r0, _020C7A90 ; =0x000011E0 + mla r0, r1, r0, r2 + bl SND_ReadDriverInfo + bl SND_GetCurrentCommandTag + ldr r1, _020C7A88 ; =_021DD420 + ldr r3, _020C7A8C ; =_021DD460 + str r0, [r1, #8] + ldrsb r0, [r1] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + strb r0, [r1] + ldr r0, _020C7A88 ; =_021DD420 + ldr r1, _020C7A90 ; =0x000011E0 + ldrsb r2, [r0] + mla r0, r2, r1, r3 + bl DC_InvalidateRange + mov r0, #0 + bl SND_FlushCommand + mov r0, #1 + ldmia sp!, {r4, pc} +_020C7A68: + ldr r0, _020C7A8C ; =_021DD460 + bl SND_ReadDriverInfo + bl SND_GetCurrentCommandTag + ldr r1, _020C7A88 ; =_021DD420 + str r0, [r1, #8] + mov r0, #0 + str r0, [r1, #4] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C7A88: .word _021DD420 +_020C7A8C: .word _021DD460 +_020C7A90: .word 0x000011E0 + arm_func_end NNS_SndUpdateDriverInfo + + arm_func_start NNS_SndReadDriverChannelInfo +NNS_SndReadDriverChannelInfo: ; 0x020C7A94 + stmdb sp!, {r3, lr} + ldr r2, _020C7AD4 ; =_021DD420 + mov ip, r0 + ldrsb r3, [r2] + mov r2, r1 + cmp r3, #0 + movlt r0, #0 + ldrge r1, _020C7AD8 ; =_021DD460 + ldrge r0, _020C7ADC ; =0x000011E0 + mlage r0, r3, r0, r1 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + mov r1, ip + bl SND_ReadChannelInfo + ldmia sp!, {r3, pc} + .align 2, 0 +_020C7AD4: .word _021DD420 +_020C7AD8: .word _021DD460 +_020C7ADC: .word 0x000011E0 + arm_func_end NNS_SndReadDriverChannelInfo + + arm_func_start NNSi_SndReadDriverTrackInfo +NNSi_SndReadDriverTrackInfo: ; 0x020C7AE0 + stmdb sp!, {r4, lr} + ldr r3, _020C7B28 ; =_021DD420 + mov r4, r0 + ldrsb ip, [r3] + mov lr, r1 + mov r3, r2 + cmp ip, #0 + movlt r0, #0 + ldrge r1, _020C7B2C ; =_021DD460 + ldrge r0, _020C7B30 ; =0x000011E0 + mlage r0, ip, r0, r1 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r1, r4 + mov r2, lr + bl SND_ReadTrackInfo + ldmia sp!, {r4, pc} + .align 2, 0 +_020C7B28: .word _021DD420 +_020C7B2C: .word _021DD460 +_020C7B30: .word 0x000011E0 + arm_func_end NNSi_SndReadDriverTrackInfo + + arm_func_start BeginSleep +BeginSleep: ; 0x020C7B34 + stmdb sp!, {r4, lr} + bl NNSi_SndCaptureBeginSleep + mov r0, #0 + mov r1, r0 + mov r2, r0 + mov r3, r0 + bl SND_StopTimer + bl SND_GetCurrentCommandTag + mov r4, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r4 + bl SND_WaitForCommandProc + ldmia sp!, {r4, pc} + arm_func_end BeginSleep + + arm_func_start EndSleep +EndSleep: ; 0x020C7B6C + ldr ip, _020C7B74 ; =NNSi_SndCaptureEndSleep + bx ip + .align 2, 0 +_020C7B74: .word NNSi_SndCaptureEndSleep + arm_func_end EndSleep + + arm_func_start NNS_SndLockChannel +NNS_SndLockChannel: ; 0x020C7B78 + stmdb sp!, {r4, lr} + movs r4, r0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + ldr r1, _020C7BBC ; =_021DF820 + ldr r1, [r1, #8] + tst r4, r1 + movne r0, #0 + ldmneia sp!, {r4, pc} + mov r1, #0 + bl SND_LockChannel + ldr r1, _020C7BBC ; =_021DF820 + mov r0, #1 + ldr r2, [r1, #8] + orr r2, r2, r4 + str r2, [r1, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C7BBC: .word _021DF820 + arm_func_end NNS_SndLockChannel + + arm_func_start NNS_SndUnlockChannel +NNS_SndUnlockChannel: ; 0x020C7BC0 + stmdb sp!, {r4, lr} + movs r4, r0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + bl SND_UnlockChannel + ldr r0, _020C7BEC ; =_021DF820 + mvn r1, r4 + ldr r2, [r0, #8] + and r1, r2, r1 + str r1, [r0, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C7BEC: .word _021DF820 + arm_func_end NNS_SndUnlockChannel + + arm_func_start NNS_SndUnlockCapture +NNS_SndUnlockCapture: ; 0x020C7BF0 + ldr r1, _020C7C08 ; =_021DF820 + mvn r0, r0 + ldr r2, [r1] + and r0, r2, r0 + str r0, [r1] + bx lr + .align 2, 0 +_020C7C08: .word _021DF820 + arm_func_end NNS_SndUnlockCapture + + arm_func_start NNS_SndAllocAlarm +NNS_SndAllocAlarm: ; 0x020C7C0C + ldr r0, _020C7C50 ; =_021DF820 + mov r3, #1 + ldr r1, [r0, #4] + mov r0, #0 +_020C7C1C: + tst r1, r3 + bne _020C7C38 + ldr r1, _020C7C50 ; =_021DF820 + ldr r2, [r1, #4] + orr r2, r2, r3 + str r2, [r1, #4] + bx lr +_020C7C38: + add r0, r0, #1 + cmp r0, #8 + mov r3, r3, lsl #1 + blt _020C7C1C + mvn r0, #0 + bx lr + .align 2, 0 +_020C7C50: .word _021DF820 + arm_func_end NNS_SndAllocAlarm + + arm_func_start NNS_SndFreeAlarm +NNS_SndFreeAlarm: ; 0x020C7C54 + ldr r1, _020C7C70 ; =_021DF820 + mov r2, #1 + mvn r0, r2, lsl r0 + ldr r2, [r1, #4] + and r0, r2, r0 + str r0, [r1, #4] + bx lr + .align 2, 0 +_020C7C70: .word _021DF820 + arm_func_end NNS_SndFreeAlarm + + arm_func_start NNSi_SndInitResourceMgr +NNSi_SndInitResourceMgr: ; 0x020C7C74 + ldr r0, _020C7C8C ; =_021DF820 + mov r1, #0 + str r1, [r0, #8] + str r1, [r0] + str r1, [r0, #4] + bx lr + .align 2, 0 +_020C7C8C: .word _021DF820 + arm_func_end NNSi_SndInitResourceMgr + + arm_func_start NNS_SndWaveOutAllocChannel +NNS_SndWaveOutAllocChannel: ; 0x020C7C90 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #1 + mov r0, r0, lsl r4 + bl NNS_SndLockChannel + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, #0x14 + mul r0, r4, r0 + ldr r2, _020C7CD0 ; =_021DF82C + mov r1, #0 + str r4, [r2, r0] + add r0, r2, r0 + str r1, [r0, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C7CD0: .word _021DF82C + arm_func_end NNS_SndWaveOutAllocChannel + + arm_func_start NNS_SndWaveOutFreeChannel +NNS_SndWaveOutFreeChannel: ; 0x020C7CD4 + ldr r0, [r0] + mov r1, #1 + ldr ip, _020C7CE8 ; =NNS_SndUnlockChannel + mov r0, r1, lsl r0 + bx ip + .align 2, 0 +_020C7CE8: .word NNS_SndUnlockChannel + arm_func_end NNS_SndWaveOutFreeChannel + + arm_func_start NNS_SndWaveOutStart +NNS_SndWaveOutStart: ; 0x020C7CEC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x18 + movs r8, r1 + mov sb, r0 + mov r7, r2 + mov r6, r3 + beq _020C7D14 + cmp r8, #1 + beq _020C7D28 + b _020C7D38 +_020C7D14: + ldr r1, [sp, #0x38] + ldr r0, [sp, #0x3c] + mov r4, r1, asr #2 + rsb r5, r4, r0, asr #2 + b _020C7D38 +_020C7D28: + ldr r1, [sp, #0x38] + ldr r0, [sp, #0x3c] + mov r4, r1, asr #1 + rsb r5, r4, r0, asr #1 +_020C7D38: + ldr r2, [sp, #0x40] + ldr r0, _020C7E04 ; =0xD87F8000 + mov r3, r2, asr #0x1f + mov r1, #0x7f + bl _ll_udiv + ldr r2, [sp, #0x48] + mov r3, r2, asr #0x1f + bl _ll_udiv + cmp r1, #0 + mov r2, #0x10 + cmpeq r0, #0x10 + mov r3, #0 + movlo r0, r2 + blo _020C7D80 + ldr r2, _020C7E08 ; =0x0000FFFF + cmp r1, r3 + cmpeq r0, r2 + movhi r0, r2 +_020C7D80: + ldr r1, [sp, #0x44] + stmia sp, {r4, r5} + str r1, [sp, #8] + mov r1, #0 + str r1, [sp, #0xc] + cmp r6, #0 + movne r3, #1 + ldr r1, [sp, #0x4c] + str r0, [sp, #0x10] + str r1, [sp, #0x14] + ldr r0, [sb] + moveq r3, #2 + mov r1, r8 + mov r2, r7 + bl SND_SetupChannelPcm + mov r1, #0 + ldr r0, [sb] + mov r2, #1 + mov r0, r2, lsl r0 + mov r2, r1 + mov r3, r1 + bl SND_StartTimer + mov r0, #1 + str r0, [sb, #8] + mov r0, #0 + str r0, [sb, #0xc] + bl SND_GetCurrentCommandTag + str r0, [sb, #0x10] + ldr r1, [sp, #0x40] + mov r0, #1 + str r1, [sb, #4] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020C7E04: .word 0xD87F8000 +_020C7E08: .word 0x0000FFFF + arm_func_end NNS_SndWaveOutStart + + arm_func_start NNS_SndWaveOutStop +NNS_SndWaveOutStop: ; 0x020C7E0C + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4] + mov r2, #1 + mov r1, #0 + mov r0, r2, lsl r0 + mov r2, r1 + mov r3, r1 + bl SND_StopTimer + mov r0, #0 + str r0, [r4, #8] + ldmia sp!, {r4, pc} + arm_func_end NNS_SndWaveOutStop + + arm_func_start NNS_SndWaveOutSetVolume +NNS_SndWaveOutSetVolume: ; 0x020C7E48 + stmdb sp!, {r3, lr} + ldr r2, [r0, #8] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + mov r2, #1 + mov r0, r2, lsl r0 + mov r2, #0 + bl SND_SetChannelVolume + ldmia sp!, {r3, pc} + arm_func_end NNS_SndWaveOutSetVolume + + arm_func_start NNS_SndWaveOutSetSpeed +NNS_SndWaveOutSetSpeed: ; 0x020C7E70 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #8] + mov r4, r1 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [r5, #4] + ldr r0, _020C7EEC ; =0xD87F8000 + mov r3, r2, asr #0x1f + mov r1, #0x7f + bl _ll_udiv + mov r2, r4 + mov r3, r4, asr #0x1f + bl _ll_udiv + mov r3, r0 + cmp r1, #0 + mov r0, #0x10 + cmpeq r3, #0x10 + mov r2, #0 + movlo r3, r0 + blo _020C7ED4 + ldr r0, _020C7EF0 ; =0x0000FFFF + cmp r1, r2 + cmpeq r3, r0 + movhi r3, r0 +_020C7ED4: + ldr r0, [r5] + mov r1, #1 + mov r0, r1, lsl r0 + mov r1, r3 + bl SND_SetChannelTimer + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C7EEC: .word 0xD87F8000 +_020C7EF0: .word 0x0000FFFF + arm_func_end NNS_SndWaveOutSetSpeed + + arm_func_start NNS_SndWaveOutSetPan +NNS_SndWaveOutSetPan: ; 0x020C7EF4 + stmdb sp!, {r3, lr} + ldr r2, [r0, #8] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + mov r2, #1 + mov r0, r2, lsl r0 + bl SND_SetChannelPan + ldmia sp!, {r3, pc} + arm_func_end NNS_SndWaveOutSetPan + + arm_func_start NNS_SndWaveOutIsPlaying +NNS_SndWaveOutIsPlaying: ; 0x020C7F18 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + bne _020C7F54 + ldr r0, [r4, #0x10] + bl SND_IsFinishedCommandTag + cmp r0, #0 + mov r0, #1 + ldmeqia sp!, {r4, pc} + str r0, [r4, #0xc] +_020C7F54: + bl SND_GetChannelStatus + ldr r1, [r4] + mov r2, #1 + tst r0, r2, lsl r1 + movne r0, r2 + moveq r0, #0 + streq r0, [r4, #8] + ldmia sp!, {r4, pc} + arm_func_end NNS_SndWaveOutIsPlaying + + arm_func_start NNS_SndPlayerSetPlayerVolume +NNS_SndPlayerSetPlayerVolume: ; 0x020C7F74 + mov r2, #0x24 + mul r2, r0, r2 + ldr r0, _020C7F88 ; =_021DFDE4 + strb r1, [r0, r2] + bx lr + .align 2, 0 +_020C7F88: .word _021DFDE4 + arm_func_end NNS_SndPlayerSetPlayerVolume + + arm_func_start NNS_SndPlayerSetPlayableSeqCount +NNS_SndPlayerSetPlayableSeqCount: ; 0x020C7F8C + mov r2, #0x24 + mul r2, r0, r2 + mov r0, r1, lsl #0x10 + ldr r1, _020C7FA8 ; =_021DFDDC + mov r0, r0, lsr #0x10 + str r0, [r1, r2] + bx lr + .align 2, 0 +_020C7FA8: .word _021DFDDC + arm_func_end NNS_SndPlayerSetPlayableSeqCount + + arm_func_start NNS_SndPlayerSetAllocatableChannel +NNS_SndPlayerSetAllocatableChannel: ; 0x020C7FAC + mov r2, #0x24 + mul r2, r0, r2 + ldr r0, _020C7FC0 ; =_021DFDE0 + str r1, [r0, r2] + bx lr + .align 2, 0 +_020C7FC0: .word _021DFDE0 + arm_func_end NNS_SndPlayerSetAllocatableChannel + + arm_func_start NNS_SndPlayerCreateHeap +NNS_SndPlayerCreateHeap: ; 0x020C7FC4 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r2 + mov r6, r0 + mov r0, r1 + mov r3, #0 + ldr r2, _020C8050 ; =PlayerHeapDisposeCallback + add r1, r5, #0x14 + str r3, [sp] + bl NNS_SndHeapAlloc + movs r4, r0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r2, #0 + str r2, [r4, #0xc] + str r6, [r4, #0x10] + mov r1, r5 + add r0, r4, #0x14 + str r2, [r4, #8] + bl NNS_SndHeapCreate + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r2, _020C8054 ; =_021DFDC4 + mov r1, #0x24 + mla r2, r6, r1, r2 + str r0, [r4, #8] + mov r1, r4 + add r0, r2, #0xc + bl NNS_FndAppendListObject + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020C8050: .word PlayerHeapDisposeCallback +_020C8054: .word _021DFDC4 + arm_func_end NNS_SndPlayerCreateHeap + + arm_func_start NNS_SndPlayerStopSeq +NNS_SndPlayerStopSeq: ; 0x020C8058 + ldr ip, _020C8064 ; =NNSi_SndPlayerStopSeq + ldr r0, [r0] + bx ip + .align 2, 0 +_020C8064: .word NNSi_SndPlayerStopSeq + arm_func_end NNS_SndPlayerStopSeq + + arm_func_start NNS_SndPlayerStopSeqByPlayerNo +NNS_SndPlayerStopSeqByPlayerNo: ; 0x020C8068 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _020C80BC ; =_021DFDC4 + mov r2, #0x24 + mla r6, r0, r2, r3 + ldr r5, _020C80C0 ; =_021DF984 + mov r7, r1 + mov r4, #0 +_020C8084: + ldrb r0, [r5, #0x2c] + cmp r0, #0 + beq _020C80A8 + ldr r0, [r5, #4] + cmp r0, r6 + bne _020C80A8 + mov r0, r5 + mov r1, r7 + bl NNSi_SndPlayerStopSeq +_020C80A8: + add r4, r4, #1 + cmp r4, #0x10 + add r5, r5, #0x44 + blt _020C8084 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C80BC: .word _021DFDC4 +_020C80C0: .word _021DF984 + arm_func_end NNS_SndPlayerStopSeqByPlayerNo + + arm_func_start NNS_SndPlayerStopSeqBySeqNo +NNS_SndPlayerStopSeqBySeqNo: ; 0x020C80C4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, _020C8118 ; =_021DF984 + mov r7, r0 + mov r6, r1 + mov r4, #0 +_020C80D8: + ldrb r0, [r5, #0x2c] + cmp r0, #0 + beq _020C8104 + ldrh r0, [r5, #0x34] + cmp r0, #1 + ldreqh r0, [r5, #0x38] + cmpeq r0, r7 + bne _020C8104 + mov r0, r5 + mov r1, r6 + bl NNSi_SndPlayerStopSeq +_020C8104: + add r4, r4, #1 + cmp r4, #0x10 + add r5, r5, #0x44 + blt _020C80D8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C8118: .word _021DF984 + arm_func_end NNS_SndPlayerStopSeqBySeqNo + + arm_func_start NNS_SndPlayerStopSeqAll +NNS_SndPlayerStopSeqAll: ; 0x020C811C + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _020C8158 ; =_021DF984 + mov r6, r0 + mov r4, #0 +_020C812C: + ldrb r0, [r5, #0x2c] + cmp r0, #0 + beq _020C8144 + mov r0, r5 + mov r1, r6 + bl NNSi_SndPlayerStopSeq +_020C8144: + add r4, r4, #1 + cmp r4, #0x10 + add r5, r5, #0x44 + blt _020C812C + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C8158: .word _021DF984 + arm_func_end NNS_SndPlayerStopSeqAll + + arm_func_start NNS_SndPlayerPause +NNS_SndPlayerPause: ; 0x020C815C + ldr ip, _020C8168 ; =NNSi_SndPlayerPause + ldr r0, [r0] + bx ip + .align 2, 0 +_020C8168: .word NNSi_SndPlayerPause + arm_func_end NNS_SndPlayerPause + + arm_func_start NNS_SndPlayerPauseByPlayerNo +NNS_SndPlayerPauseByPlayerNo: ; 0x020C816C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r2, #0x24 + mul r6, r0, r2 + ldr r5, _020C81C0 ; =_021DFDC4 + mov r8, r1 + add r0, r5, r6 + mov r1, #0 + bl NNS_FndGetNextListObject + movs r7, r0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_020C8194: + mov r1, r7 + add r0, r5, r6 + bl NNS_FndGetNextListObject + mov r4, r0 + mov r0, r7 + mov r1, r8 + bl NNSi_SndPlayerPause + mov r7, r4 + cmp r4, #0 + bne _020C8194 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C81C0: .word _021DFDC4 + arm_func_end NNS_SndPlayerPauseByPlayerNo + + arm_func_start NNS_SndHandleInit +NNS_SndHandleInit: ; 0x020C81C4 + mov r1, #0 + str r1, [r0] + bx lr + arm_func_end NNS_SndHandleInit + + arm_func_start NNS_SndHandleReleaseSeq +NNS_SndHandleReleaseSeq: ; 0x020C81D0 + ldr r1, [r0] + cmp r1, #0 + bxeq lr + ldr r1, [r0] + mov r2, #0 + str r2, [r1] + str r2, [r0] + bx lr + arm_func_end NNS_SndHandleReleaseSeq + + arm_func_start NNS_SndPlayerCountPlayingSeqByPlayerNo +NNS_SndPlayerCountPlayingSeqByPlayerNo: ; 0x020C81F0 + mov r1, #0x24 + mul r1, r0, r1 + ldr r0, _020C8204 ; =_021DFDCC + ldrh r0, [r0, r1] + bx lr + .align 2, 0 +_020C8204: .word _021DFDCC + arm_func_end NNS_SndPlayerCountPlayingSeqByPlayerNo + + arm_func_start NNS_SndPlayerSetVolume +NNS_SndPlayerSetVolume: ; 0x020C8208 + ldr r2, [r0] + cmp r2, #0 + ldrne r0, [r0] + strneb r1, [r0, #0x41] + bx lr + arm_func_end NNS_SndPlayerSetVolume + + arm_func_start NNS_SndPlayerSetInitialVolume +NNS_SndPlayerSetInitialVolume: ; 0x020C821C + ldr r2, [r0] + cmp r2, #0 + ldrne r0, [r0] + strneb r1, [r0, #0x40] + bx lr + arm_func_end NNS_SndPlayerSetInitialVolume + + arm_func_start NNS_SndPlayerMoveVolume +NNS_SndPlayerMoveVolume: ; 0x020C8230 + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + ldrne r3, [r0] + ldrneb r0, [r3, #0x2c] + cmpne r0, #2 + ldmeqia sp!, {r3, pc} + add r0, r3, #0x1c + mov r1, r1, lsl #8 + bl NNSi_SndFaderSet + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerMoveVolume + + arm_func_start NNS_SndPlayerSetChannelPriority +NNS_SndPlayerSetChannelPriority: ; 0x020C825C + stmdb sp!, {r3, lr} + ldr r2, [r0] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl SND_SetPlayerChannelPriority + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerSetChannelPriority + + arm_func_start NNS_SndPlayerSetTrackPitch +NNS_SndPlayerSetTrackPitch: ; 0x020C827C + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl SND_SetTrackPitch + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerSetTrackPitch + + arm_func_start NNS_SndPlayerSetTrackPan +NNS_SndPlayerSetTrackPan: ; 0x020C829C + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl SND_SetTrackPan + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerSetTrackPan + + arm_func_start NNS_SndPlayerSetTrackAllocatableChannel +NNS_SndPlayerSetTrackAllocatableChannel: ; 0x020C82BC + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl SND_SetTrackAllocatableChannel + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerSetTrackAllocatableChannel + + arm_func_start NNS_SndPlayerSetTempoRatio +NNS_SndPlayerSetTempoRatio: ; 0x020C82DC + stmdb sp!, {r3, lr} + ldr r2, [r0] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl SND_SetPlayerTempoRatio + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerSetTempoRatio + + arm_func_start NNS_SndPlayerSetSeqNo +NNS_SndPlayerSetSeqNo: ; 0x020C82FC + ldr r2, [r0] + cmp r2, #0 + bxeq lr + ldr r2, [r0] + mov r3, #1 + strh r3, [r2, #0x34] + ldr r0, [r0] + strh r1, [r0, #0x38] + bx lr + arm_func_end NNS_SndPlayerSetSeqNo + + arm_func_start NNS_SndPlayerSetSeqArcNo +NNS_SndPlayerSetSeqArcNo: ; 0x020C8320 + ldr r3, [r0] + cmp r3, #0 + bxeq lr + ldr r3, [r0] + mov ip, #2 + strh ip, [r3, #0x34] + ldr r3, [r0] + strh r1, [r3, #0x38] + ldr r0, [r0] + strh r2, [r0, #0x3a] + bx lr + arm_func_end NNS_SndPlayerSetSeqArcNo + + arm_func_start NNS_SndPlayerGetSeqNo +NNS_SndPlayerGetSeqNo: ; 0x020C834C + ldr r1, [r0] + cmp r1, #0 + mvneq r0, #0 + bxeq lr + ldr r1, [r0] + ldrh r0, [r1, #0x34] + cmp r0, #1 + mvnne r0, #0 + ldreqh r0, [r1, #0x38] + bx lr + arm_func_end NNS_SndPlayerGetSeqNo + + arm_func_start NNS_SndPlayerReadVariable +NNS_SndPlayerReadVariable: ; 0x020C8374 + stmdb sp!, {r4, lr} + ldr r3, [r0] + mov r4, r2 + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r2, [r0] + ldrb r0, [r2, #0x2d] + cmp r0, #0 + bne _020C83AC + mvn r0, #0 + strh r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} +_020C83AC: + ldrb r0, [r2, #0x3c] + bl SND_GetPlayerLocalVariable + strh r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end NNS_SndPlayerReadVariable + + arm_func_start NNS_SndPlayerReadDriverTrackInfo +NNS_SndPlayerReadDriverTrackInfo: ; 0x020C83C0 + stmdb sp!, {r3, lr} + ldr r3, [r0] + cmp r3, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + ldrb r0, [r0, #0x3c] + bl NNSi_SndReadDriverTrackInfo + ldmia sp!, {r3, pc} + arm_func_end NNS_SndPlayerReadDriverTrackInfo + + arm_func_start NNSi_SndPlayerInit +NNSi_SndPlayerInit: ; 0x020C83E4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _020C8488 ; =_021DF978 + mov r1, #0x14 + bl NNS_FndInitList + ldr r0, _020C848C ; =_021DF96C + mov r1, #0x14 + bl NNS_FndInitList + mov r6, #0 + ldr r7, _020C8490 ; =_021DF984 + ldr r4, _020C848C ; =_021DF96C + mov r5, r6 +_020C8410: + strb r5, [r7, #0x2c] + mov r0, r4 + mov r1, r7 + strb r6, [r7, #0x3c] + bl NNS_FndAppendListObject + add r6, r6, #1 + cmp r6, #0x10 + add r7, r7, #0x44 + blt _020C8410 + mov sl, #0 + ldr sb, _020C8494 ; =_021DFDC4 + mov r8, #0xc + mov r7, sl + mov r6, #0x7f + mov r5, #1 + mov r4, sl +_020C8450: + mov r0, sb + mov r1, r8 + bl NNS_FndInitList + mov r1, r7 + add r0, sb, #0xc + bl NNS_FndInitList + strb r6, [sb, #0x20] + str r5, [sb, #0x18] + add sl, sl, #1 + str r4, [sb, #0x1c] + cmp sl, #0x20 + add sb, sb, #0x24 + blt _020C8450 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020C8488: .word _021DF978 +_020C848C: .word _021DF96C +_020C8490: .word _021DF984 +_020C8494: .word _021DFDC4 + arm_func_end NNSi_SndPlayerInit + + arm_func_start NNSi_SndPlayerMain +NNSi_SndPlayerMain: ; 0x020C8498 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bl SND_GetPlayerStatus + mov fp, r0 + ldr r0, _020C85F0 ; =_021DF978 + mov r1, #0 + bl NNS_FndGetNextListObject + movs r6, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r4, #0x8000 + ldr r5, _020C85F4 ; =_0210D750 + rsb r4, r4, #0 +_020C84C4: + ldr r0, _020C85F0 ; =_021DF978 + mov r1, r6 + bl NNS_FndGetNextListObject + ldrb r1, [r6, #0x2d] + mov r7, r0 + cmp r1, #0 + bne _020C84F4 + ldr r0, [r6, #0x30] + bl SND_IsFinishedCommandTag + cmp r0, #0 + movne r0, #1 + strneb r0, [r6, #0x2d] +_020C84F4: + ldrb r0, [r6, #0x2d] + cmp r0, #0 + beq _020C851C + ldrb r1, [r6, #0x3c] + mov r0, #1 + tst fp, r0, lsl r1 + bne _020C851C + mov r0, r6 + bl ShutdownPlayer + b _020C85E0 +_020C851C: + add r0, r6, #0x1c + bl NNSi_SndFaderUpdate + ldr r0, [r6, #4] + ldrb r2, [r6, #0x41] + ldrb r0, [r0, #0x20] + ldrb r1, [r6, #0x40] + mov r2, r2, lsl #1 + mov r0, r0, lsl #1 + mov r1, r1, lsl #1 + ldrsh sl, [r5, r0] + add r0, r6, #0x1c + ldrsh r8, [r5, r2] + ldrsh sb, [r5, r1] + bl NNSi_SndFaderGet + mov r0, r0, asr #8 + mov r0, r0, lsl #1 + add r1, sb, r8 + ldrsh r0, [r5, r0] + add r1, sl, r1 + add r8, r0, r1 + cmp r8, r4 + movlt r8, r4 + blt _020C8584 + ldr r0, _020C85F8 ; =0x00007FFF + cmp r8, r0 + movgt r8, r0 +_020C8584: + ldrsh r0, [r6, #0x3e] + cmp r8, r0 + beq _020C85A0 + ldrb r0, [r6, #0x3c] + mov r1, r8 + bl SND_SetPlayerVolume + strh r8, [r6, #0x3e] +_020C85A0: + ldrb r0, [r6, #0x2c] + cmp r0, #2 + bne _020C85C4 + add r0, r6, #0x1c + bl NNSi_SndFaderIsFinished + cmp r0, #0 + beq _020C85C4 + mov r0, r6 + bl ForceStopSeq +_020C85C4: + ldrb r0, [r6, #0x2f] + cmp r0, #0 + beq _020C85E0 + ldrb r0, [r6, #0x3c] + bl SND_StartPreparedSeq + mov r0, #0 + strb r0, [r6, #0x2f] +_020C85E0: + mov r6, r7 + cmp r7, #0 + bne _020C84C4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C85F0: .word _021DF978 +_020C85F4: .word _0210D750 +_020C85F8: .word 0x00007FFF + arm_func_end NNSi_SndPlayerMain + + arm_func_start NNSi_SndPlayerAllocSeqPlayer +NNSi_SndPlayerAllocSeqPlayer: ; 0x020C85FC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, _020C8690 ; =_021DFDC4 + mov r3, #0x24 + mov r4, r0 + ldr r5, [r4] + mla r6, r1, r3, ip + mov r7, r2 + cmp r5, #0 + beq _020C8624 + bl NNS_SndHandleReleaseSeq +_020C8624: + ldrh r1, [r6, #8] + ldr r0, [r6, #0x18] + cmp r1, r0 + blo _020C8660 + mov r0, r6 + mov r1, #0 + bl NNS_FndGetNextListObject + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r0, #0x3d] + cmp r7, r1 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + bl ForceStopSeq +_020C8660: + mov r0, r7 + bl AllocSeqPlayer + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, r5 + bl InsertPlayerList + str r4, [r5] + mov r0, r5 + str r5, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C8690: .word _021DFDC4 + arm_func_end NNSi_SndPlayerAllocSeqPlayer + + arm_func_start NNSi_SndPlayerFreeSeqPlayer +NNSi_SndPlayerFreeSeqPlayer: ; 0x020C8694 + ldr ip, _020C869C ; =ShutdownPlayer + bx ip + .align 2, 0 +_020C869C: .word ShutdownPlayer + arm_func_end NNSi_SndPlayerFreeSeqPlayer + + arm_func_start NNSi_SndPlayerStartSeq +NNSi_SndPlayerStartSeq: ; 0x020C86A0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r0, [r5, #0x3c] + ldr r4, [r5, #4] + bl SND_PrepareSeq + ldr r2, [r4, #0x1c] + cmp r2, #0 + beq _020C86CC + ldrb r0, [r5, #0x3c] + ldr r1, _020C86EC ; =0x0000FFFF + bl SND_SetTrackAllocatableChannel +_020C86CC: + mov r0, r5 + bl InitPlayer + bl SND_GetCurrentCommandTag + str r0, [r5, #0x30] + mov r0, #1 + strb r0, [r5, #0x2f] + strb r0, [r5, #0x2c] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C86EC: .word 0x0000FFFF + arm_func_end NNSi_SndPlayerStartSeq + + arm_func_start NNSi_SndPlayerStopSeq +NNSi_SndPlayerStopSeq: ; 0x020C86F0 + stmdb sp!, {r4, lr} + movs r4, r0 + mov r2, r1 + ldrneb r1, [r4, #0x2c] + cmpne r1, #0 + ldmeqia sp!, {r4, pc} + cmp r2, #0 + bne _020C8718 + bl ForceStopSeq + ldmia sp!, {r4, pc} +_020C8718: + add r0, r4, #0x1c + mov r1, #0 + bl NNSi_SndFaderSet + mov r0, r4 + mov r1, #0 + bl SetPlayerPriority + mov r0, #2 + strb r0, [r4, #0x2c] + ldmia sp!, {r4, pc} + arm_func_end NNSi_SndPlayerStopSeq + + arm_func_start NNSi_SndPlayerPause +NNSi_SndPlayerPause: ; 0x020C873C + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + ldrneb r0, [r5, #0x2e] + mov r4, r1 + cmpne r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r5, #0x3c] + bl SND_PauseSeq + strb r4, [r5, #0x2e] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNSi_SndPlayerPause + + arm_func_start NNSi_SndPlayerAllocHeap +NNSi_SndPlayerAllocHeap: ; 0x020C8764 + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _020C87B4 ; =_021DFDC4 + mov r2, #0x24 + mla r5, r0, r2, r3 + mov r6, r1 + add r0, r5, #0xc + mov r1, #0 + bl NNS_FndGetNextListObject + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r1, r4 + add r0, r5, #0xc + bl NNS_FndRemoveListObject + str r6, [r4, #0xc] + str r4, [r6, #8] + ldr r0, [r4, #8] + bl NNS_SndHeapClear + ldr r0, [r4, #8] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C87B4: .word _021DFDC4 + arm_func_end NNSi_SndPlayerAllocHeap + + arm_func_start InitPlayer +InitPlayer: ; 0x020C87B8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + strb r0, [r4, #0x2e] + strb r0, [r4, #0x2d] + strb r0, [r4, #0x2f] + strh r0, [r4, #0x34] + strh r0, [r4, #0x3e] + mov r1, #0x7f + strb r1, [r4, #0x40] + add r0, r4, #0x1c + strb r1, [r4, #0x41] + bl NNSi_SndFaderInit + add r0, r4, #0x1c + mov r1, #0x7f00 + mov r2, #1 + bl NNSi_SndFaderSet + ldmia sp!, {r4, pc} + arm_func_end InitPlayer + + arm_func_start InsertPlayerList +InsertPlayerList: ; 0x020C8800 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, #0 + mov r5, r0 + bl NNS_FndGetNextListObject + movs r1, r0 + beq _020C883C +_020C881C: + ldrb r2, [r4, #0x3d] + ldrb r0, [r1, #0x3d] + cmp r2, r0 + blo _020C883C + mov r0, r5 + bl NNS_FndGetNextListObject + movs r1, r0 + bne _020C881C +_020C883C: + mov r0, r5 + mov r2, r4 + bl NNS_FndInsertListObject + str r5, [r4, #4] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end InsertPlayerList + + arm_func_start InsertPrioList +InsertPrioList: ; 0x020C8850 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, _020C88A0 ; =_021DF978 + mov r1, #0 + bl NNS_FndGetNextListObject + movs r1, r0 + beq _020C8890 + ldr r4, _020C88A0 ; =_021DF978 +_020C8870: + ldrb r2, [r5, #0x3d] + ldrb r0, [r1, #0x3d] + cmp r2, r0 + blo _020C8890 + mov r0, r4 + bl NNS_FndGetNextListObject + movs r1, r0 + bne _020C8870 +_020C8890: + ldr r0, _020C88A0 ; =_021DF978 + mov r2, r5 + bl NNS_FndInsertListObject + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C88A0: .word _021DF978 + arm_func_end InsertPrioList + + arm_func_start ForceStopSeq +ForceStopSeq: ; 0x020C88A4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrb r0, [r4, #0x2c] + cmp r0, #2 + bne _020C88C4 + ldrb r0, [r4, #0x3c] + ldr r1, _020C88D8 ; =0xFFFFFD2D + bl SND_SetPlayerVolume +_020C88C4: + ldrb r0, [r4, #0x3c] + bl SND_StopSeq + mov r0, r4 + bl ShutdownPlayer + ldmia sp!, {r4, pc} + .align 2, 0 +_020C88D8: .word 0xFFFFFD2D + arm_func_end ForceStopSeq + + arm_func_start AllocSeqPlayer +AllocSeqPlayer: ; 0x020C88DC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, _020C893C ; =_021DF96C + mov r1, #0 + bl NNS_FndGetNextListObject + movs r4, r0 + bne _020C891C + ldr r0, _020C8940 ; =_021DF978 + mov r1, #0 + bl NNS_FndGetNextListObject + mov r4, r0 + ldrb r1, [r4, #0x3d] + cmp r5, r1 + movlt r0, #0 + ldmltia sp!, {r3, r4, r5, pc} + bl ForceStopSeq +_020C891C: + ldr r0, _020C893C ; =_021DF96C + mov r1, r4 + bl NNS_FndRemoveListObject + mov r0, r4 + strb r5, [r4, #0x3d] + bl InsertPrioList + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C893C: .word _021DF96C +_020C8940: .word _021DF978 + arm_func_end AllocSeqPlayer + + arm_func_start ShutdownPlayer +ShutdownPlayer: ; 0x020C8944 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r1, [r4] + cmp r1, #0 + movne r0, #0 + strne r0, [r1] + strne r0, [r4] + ldr r5, [r4, #4] + mov r1, r4 + mov r0, r5 + bl NNS_FndRemoveListObject + mov r0, #0 + str r0, [r4, #4] + ldr r1, [r4, #8] + cmp r1, #0 + beq _020C899C + add r0, r5, #0xc + bl NNS_FndAppendListObject + ldr r0, [r4, #8] + mov r1, #0 + str r1, [r0, #0xc] + str r1, [r4, #8] +_020C899C: + ldr r0, _020C89C0 ; =_021DF978 + mov r1, r4 + bl NNS_FndRemoveListObject + ldr r0, _020C89C4 ; =_021DF96C + mov r1, r4 + bl NNS_FndAppendListObject + mov r0, #0 + strb r0, [r4, #0x2c] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C89C0: .word _021DF978 +_020C89C4: .word _021DF96C + arm_func_end ShutdownPlayer + + arm_func_start PlayerHeapDisposeCallback +PlayerHeapDisposeCallback: ; 0x020C89C8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #8] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl NNS_SndHeapDestroy + ldr r1, [r4, #0xc] + cmp r1, #0 + movne r0, #0 + strne r0, [r1, #8] + ldmneia sp!, {r4, pc} + ldr r1, [r4, #0x10] + ldr r2, _020C8A14 ; =_021DFDC4 + mov r0, #0x24 + mla r0, r1, r0, r2 + mov r1, r4 + add r0, r0, #0xc + bl NNS_FndRemoveListObject + ldmia sp!, {r4, pc} + .align 2, 0 +_020C8A14: .word _021DFDC4 + arm_func_end PlayerHeapDisposeCallback + + arm_func_start SetPlayerPriority +SetPlayerPriority: ; 0x020C8A18 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldr r4, [r6, #4] + mov r5, r1 + cmp r4, #0 + beq _020C8A44 + mov r0, r4 + mov r1, r6 + bl NNS_FndRemoveListObject + mov r0, #0 + str r0, [r6, #4] +_020C8A44: + ldr r0, _020C8A74 ; =_021DF978 + mov r1, r6 + bl NNS_FndRemoveListObject + strb r5, [r6, #0x3d] + cmp r4, #0 + beq _020C8A68 + mov r0, r4 + mov r1, r6 + bl InsertPlayerList +_020C8A68: + mov r0, r6 + bl InsertPrioList + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C8A74: .word _021DF978 + arm_func_end SetPlayerPriority + + arm_func_start NNS_SndStrmInit +NNS_SndStrmInit: ; 0x020C8A78 + stmdb sp!, {r4, lr} + ldr r1, _020C8AE0 ; =_021E0244 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + bne _020C8AA8 + ldr r0, _020C8AE4 ; =_021E0248 + mov r1, #0 + bl NNS_FndInitList + ldr r0, _020C8AE0 ; =_021E0244 + mov r1, #1 + str r1, [r0] +_020C8AA8: + ldr r1, _020C8AE8 ; =BeginSleep__Strm + ldr r0, _020C8AEC ; =EndSleep__Strm + str r1, [r4, #8] + str r4, [r4, #0xc] + str r0, [r4, #0x14] + str r4, [r4, #0x18] + mov r0, #0 + str r0, [r4, #0x44] + str r0, [r4, #0x48] + ldr r0, [r4, #0x24] + bic r0, r0, #1 + bic r0, r0, #2 + str r0, [r4, #0x24] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C8AE0: .word _021E0244 +_020C8AE4: .word _021E0248 +_020C8AE8: .word BeginSleep__Strm +_020C8AEC: .word EndSleep__Strm + arm_func_end NNS_SndStrmInit + + arm_func_start NNS_SndStrmAllocChannel +NNS_SndStrmAllocChannel: ; 0x020C8AF0 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r1 + mov r6, #0 + mov r5, r0 + mov ip, r6 + cmp r4, #0 + ble _020C8B30 + mov r1, #1 +_020C8B10: + ldrb r3, [r2, ip] + add r0, r5, ip + strb r3, [r0, #0x4c] + ldrb r0, [r2, ip] + add ip, ip, #1 + cmp ip, r4 + orr r6, r6, r1, lsl r0 + blt _020C8B10 +_020C8B30: + mov r0, r6 + bl NNS_SndLockChannel + cmp r0, #0 + moveq r0, #0 + strne r4, [r5, #0x48] + strne r6, [r5, #0x44] + movne r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNS_SndStrmAllocChannel + + arm_func_start NNS_SndStrmFreeChannel +NNS_SndStrmFreeChannel: ; 0x020C8B50 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x44] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + bl NNS_SndUnlockChannel + mov r0, #0 + str r0, [r4, #0x44] + str r0, [r4, #0x48] + ldmia sp!, {r4, pc} + arm_func_end NNS_SndStrmFreeChannel + + arm_func_start NNS_SndStrmSetup +NNS_SndStrmSetup: ; 0x020C8B78 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + mov sl, r0 + ldr r4, [sl, #0x24] + mov sb, r1 + mov r1, r4, lsl #0x1f + mov r8, r2 + mov r4, r3 + movs r1, r1, asr #0x1f + ldr fp, [sp, #0x44] + beq _020C8BA8 + bl NNS_SndStrmStop +_020C8BA8: + ldr r2, [sl, #0x48] + mov r0, fp, lsl #5 + mul r1, r2, r0 + mov r0, r4 + bl _u32_div_f + mul r1, r0, fp + mov r0, r1, lsl #5 + ldr r2, [sp, #0x40] + str r0, [sl, #0x28] + cmp sb, #1 + moveq r0, r0, lsr #1 + mul r0, r2, r0 + mov r1, fp + bl _u32_div_f + str r0, [sp, #0x18] + bl NNS_SndAllocAlarm + cmp r0, #0 + str r0, [sl, #0x40] + addlt sp, sp, #0x1c + movlt r0, #0 + ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sl, #0x48] + mov r6, #0 + cmp r0, #0 + ble _020C8C80 + ldr r0, [sp, #0x40] + ldr r5, _020C8D0C ; =_021E0294 + mov r7, r0, lsl #5 + mov r4, r6 +_020C8C1C: + ldr r1, [sl, #0x28] + add r0, sl, r6 + mla r2, r1, r6, r8 + ldrb r0, [r0, #0x4c] + mov r3, #1 + str r2, [r5, r0, lsl #3] + add r1, r5, r0, lsl #3 + str r4, [r1, #4] + str r4, [sp] + ldr r2, [sl, #0x28] + mov r1, sb + mov r2, r2, lsr #2 + str r2, [sp, #4] + mov r2, #0x7f + str r2, [sp, #8] + str r4, [sp, #0xc] + str r7, [sp, #0x10] + mov r2, #0x40 + str r2, [sp, #0x14] + ldr r2, [r5, r0, lsl #3] + bl SND_SetupChannelPcm + ldr r0, [sl, #0x48] + add r6, r6, #1 + cmp r6, r0 + blt _020C8C1C +_020C8C80: + str sl, [sp] + ldr r1, [sp, #0x18] + ldr r0, [sl, #0x40] + ldr r3, _020C8D10 ; =AlarmCallback + mov r2, r1 + bl SND_SetupAlarm + ldr r0, _020C8D14 ; =_021E0248 + mov r1, sl + bl NNS_FndAppendListObject + str sb, [sl, #0x20] + ldr r1, [sp, #0x48] + str fp, [sl, #0x2c] + ldr r0, [sp, #0x4c] + str r1, [sl, #0x30] + str r0, [sl, #0x34] + mov r0, #0 + str r0, [sl, #0x38] + str r0, [sl, #0x3c] + ldr r0, [sl, #0x24] + bic r0, r0, #1 + orr r0, r0, #1 + str r0, [sl, #0x24] + bl OS_DisableInterrupts + mov r4, r0 + mov r2, #1 + mov r0, sl + mov r1, #0 + str r2, [sl, #0x2c] + bl StrmCallback + mov r0, r4 + str fp, [sl, #0x2c] + bl OS_RestoreInterrupts + mov r0, #1 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C8D0C: .word _021E0294 +_020C8D10: .word AlarmCallback +_020C8D14: .word _021E0248 + arm_func_end NNS_SndStrmSetup + + arm_func_start NNS_SndStrmStart +NNS_SndStrmStart: ; 0x020C8D18 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x40] + mov r2, #1 + mov r1, #0 + mov r2, r2, lsl r0 + ldr r0, [r4, #0x44] + mov r3, r1 + bl SND_StartTimer + ldr r0, [r4, #0x24] + mov r0, r0, lsl #0x1e + movs r0, r0, asr #0x1f + ldmneia sp!, {r4, pc} + add r0, r4, #8 + bl PM_PrependPreSleepCallback + add r0, r4, #0x14 + bl PM_AppendPostSleepCallback + ldr r0, [r4, #0x24] + orr r0, r0, #2 + str r0, [r4, #0x24] + ldmia sp!, {r4, pc} + arm_func_end NNS_SndStrmStart + + arm_func_start NNS_SndStrmStop +NNS_SndStrmStop: ; 0x020C8D6C + stmdb sp!, {r3, lr} + ldr r1, [r0, #0x24] + mov r1, r1, lsl #0x1f + movs r1, r1, asr #0x1f + ldmeqia sp!, {r3, pc} + bl ForceStopStrm + ldmia sp!, {r3, pc} + arm_func_end NNS_SndStrmStop + + arm_func_start NNS_SndStrmSetVolume +NNS_SndStrmSetVolume: ; 0x020C8D88 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + str r1, [r7, #0x3c] + ldr r0, [r7, #0x48] + mov r6, #0 + cmp r0, #0 + ldmleia sp!, {r4, r5, r6, r7, r8, pc} + ldr r4, _020C8DF0 ; =_021E0294 + mov r8, #1 +_020C8DAC: + add r0, r7, r6 + ldrb r5, [r0, #0x4c] + ldr r1, [r7, #0x3c] + add r0, r4, r5, lsl #3 + ldr r0, [r0, #4] + add r0, r1, r0 + bl SND_CalcChannelVolume + mov r2, r0 + mov r0, r8, lsl r5 + and r1, r2, #0xff + mov r2, r2, asr #8 + bl SND_SetChannelVolume + ldr r0, [r7, #0x48] + add r6, r6, #1 + cmp r6, r0 + blt _020C8DAC + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020C8DF0: .word _021E0294 + arm_func_end NNS_SndStrmSetVolume + + arm_func_start ForceStopStrm +ForceStopStrm: ; 0x020C8DF4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r0, [r4, #0x24] + mov r0, r0, lsl #0x1e + movs r0, r0, asr #0x1f + beq _020C8E5C + ldr r0, [r4, #0x40] + mov r2, #1 + mov r1, #0 + mov r2, r2, lsl r0 + ldr r0, [r4, #0x44] + mov r3, r1 + bl SND_StopTimer + add r0, r4, #8 + bl PM_DeletePreSleepCallback + add r0, r4, #0x14 + bl PM_DeletePostSleepCallback + ldr r0, [r4, #0x24] + bic r0, r0, #2 + str r0, [r4, #0x24] + bl SND_GetCurrentCommandTag + mov r5, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r5 + bl SND_WaitForCommandProc +_020C8E5C: + mov r0, r4 + bl ShutdownStrm + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ForceStopStrm + + arm_func_start ShutdownStrm +ShutdownStrm: ; 0x020C8E68 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, [r4, #0x40] + bl NNS_SndFreeAlarm + ldr r0, _020C8E94 ; =_021E0248 + mov r1, r4 + bl NNS_FndRemoveListObject + ldr r0, [r4, #0x24] + bic r0, r0, #1 + str r0, [r4, #0x24] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C8E94: .word _021E0248 + arm_func_end ShutdownStrm + + arm_func_start AlarmCallback +AlarmCallback: ; 0x020C8E98 + ldr ip, _020C8EA4 ; =StrmCallback + mov r1, #1 + bx ip + .align 2, 0 +_020C8EA4: .word StrmCallback + arm_func_end AlarmCallback + + arm_func_start StrmCallback +StrmCallback: ; 0x020C8EA8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + ldr r0, [r5, #0x28] + ldr r1, [r5, #0x2c] + bl _u32_div_f + ldr r1, [r5, #0x48] + ldr r2, [r5, #0x38] + mov r3, r0 + mul ip, r3, r2 + cmp r1, #0 + mov lr, #0 + ble _020C8F0C + ldr r2, _020C8F50 ; =_021E0294 + ldr r0, _020C8F54 ; =_021E0254 +_020C8EE8: + add r1, r5, lr + ldrb r1, [r1, #0x4c] + ldr r1, [r2, r1, lsl #3] + add r1, r1, ip + str r1, [r0, lr, lsl #2] + ldr r1, [r5, #0x48] + add lr, lr, #1 + cmp lr, r1 + blt _020C8EE8 +_020C8F0C: + ldr r0, [r5, #0x20] + ldr r2, _020C8F54 ; =_021E0254 + str r0, [sp] + ldr ip, [r5, #0x34] + mov r0, r4 + str ip, [sp, #4] + ldr r4, [r5, #0x30] + blx r4 + ldr r0, [r5, #0x38] + add r1, r0, #1 + str r1, [r5, #0x38] + ldr r0, [r5, #0x2c] + cmp r1, r0 + movge r0, #0 + strge r0, [r5, #0x38] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C8F50: .word _021E0294 +_020C8F54: .word _021E0254 + arm_func_end StrmCallback + + arm_func_start BeginSleep__Strm +BeginSleep__Strm: ; 0x020C8F58 + stmdb sp!, {r4, lr} + ldr r1, [r0, #0x24] + mov r1, r1, lsl #0x1e + movs r1, r1, asr #0x1f + ldmeqia sp!, {r4, pc} + ldr r2, [r0, #0x40] + mov r3, #1 + mov r1, #0 + mov r2, r3, lsl r2 + ldr r0, [r0, #0x44] + mov r3, r1 + bl SND_StopTimer + bl SND_GetCurrentCommandTag + mov r4, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r4 + bl SND_WaitForCommandProc + ldmia sp!, {r4, pc} + arm_func_end BeginSleep__Strm + + arm_func_start EndSleep__Strm +EndSleep__Strm: ; 0x020C8FA4 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + ldr r0, [r4, #0x24] + mov r0, r0, lsl #0x1e + movs r0, r0, asr #0x1f + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #0x38] + cmp r0, #0 + beq _020C8FF4 + mov r5, #1 +_020C8FCC: + bl OS_DisableInterrupts + mov r6, r0 + mov r0, r4 + mov r1, r5 + bl StrmCallback + mov r0, r6 + bl OS_RestoreInterrupts + ldr r0, [r4, #0x38] + cmp r0, #0 + bne _020C8FCC +_020C8FF4: + ldr r0, [r4, #0x40] + mov r2, #1 + mov r1, #0 + mov r2, r2, lsl r0 + ldr r0, [r4, #0x44] + mov r3, r1 + bl SND_StartTimer + ldmia sp!, {r4, r5, r6, pc} + arm_func_end EndSleep__Strm + + arm_func_start NNS_SndCaptureStopReverb +NNS_SndCaptureStopReverb: ; 0x020C9014 + stmdb sp!, {r4, lr} + ldr r1, _020C9064 ; =_021E0314 + mov r2, r0 + ldr r0, [r1, #0x48] + ldr r4, _020C9068 ; =_021E035C + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #4] + cmp r0, #0 + ldmneia sp!, {r4, pc} + cmp r2, #0 + bne _020C904C + bl NNSi_SndCaptureStop + ldmia sp!, {r4, pc} +_020C904C: + add r0, r4, #0x3c + mov r1, #0 + bl NNSi_SndFaderSet + mov r0, #1 + str r0, [r4, #0x4c] + ldmia sp!, {r4, pc} + .align 2, 0 +_020C9064: .word _021E0314 +_020C9068: .word _021E035C + arm_func_end NNS_SndCaptureStopReverb + + arm_func_start NNS_SndCaptureIsActive +NNS_SndCaptureIsActive: ; 0x020C906C + ldr r0, _020C9078 ; =_021E0314 + ldr r0, [r0, #0x48] + bx lr + .align 2, 0 +_020C9078: .word _021E0314 + arm_func_end NNS_SndCaptureIsActive + + arm_func_start NNS_SndCaptureGetCaptureType +NNS_SndCaptureGetCaptureType: ; 0x020C907C + ldr r0, _020C9088 ; =_021E0314 + ldr r0, [r0, #0x4c] + bx lr + .align 2, 0 +_020C9088: .word _021E0314 + arm_func_end NNS_SndCaptureGetCaptureType + + arm_func_start NNSi_SndCaptureInit +NNSi_SndCaptureInit: ; 0x020C908C + ldr r0, _020C90A0 ; =_021E0314 + mov r1, #0 + str r1, [r0] + str r1, [r0, #0x48] + bx lr + .align 2, 0 +_020C90A0: .word _021E0314 + arm_func_end NNSi_SndCaptureInit + + arm_func_start NNSi_SndCaptureMain +NNSi_SndCaptureMain: ; 0x020C90A4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020C9124 ; =_021E0314 + ldr r4, _020C9128 ; =_021E035C + ldr r0, [r0, #0x48] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #4] + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + add r0, r4, #0x3c + bl NNSi_SndFaderUpdate + ldr r0, [r4, #0x4c] + cmp r0, #0 + beq _020C90F4 + add r0, r4, #0x3c + bl NNSi_SndFaderIsFinished + cmp r0, #0 + beq _020C90F4 + bl NNSi_SndCaptureStop + ldmia sp!, {r3, r4, r5, pc} +_020C90F4: + add r0, r4, #0x3c + bl NNSi_SndFaderGet + ldr r1, [r4, #0x50] + mov r5, r0, asr #8 + cmp r5, r1 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0x24] + mov r1, r5 + mov r2, #0 + bl SND_SetChannelVolume + str r5, [r4, #0x50] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C9124: .word _021E0314 +_020C9128: .word _021E035C + arm_func_end NNSi_SndCaptureMain + + arm_func_start NNSi_SndCaptureStop +NNSi_SndCaptureStop: ; 0x020C912C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _020C9210 ; =_021E0314 + ldr r4, _020C9214 ; =_021E035C + ldr r0, [r0, #0x48] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #0x2c] + mov r3, #0 + cmp r1, #0 + movge r7, #1 + movlt r7, #0 + cmp r7, #0 + movne r0, #1 + movne r2, r0, lsl r1 + ldr r0, [r4, #0x24] + ldr r1, [r4, #0x28] + moveq r2, #0 + bl SND_StopTimer + cmp r7, #0 + beq _020C91B4 + bl SND_GetCurrentCommandTag + mov r5, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r5 + bl SND_WaitForCommandProc + ldr r6, _020C9218 ; =_021E031C + mov r5, #0 +_020C919C: + mov r0, r6 + mov r1, r5 + mov r2, r5 + bl OS_ReceiveMessage + cmp r0, #0 + bne _020C919C +_020C91B4: + ldr r0, [r4, #0x28] + cmp r0, #0 + beq _020C91C4 + bl NNS_SndUnlockCapture +_020C91C4: + ldr r0, [r4, #0x20] + cmp r0, #0 + beq _020C91D4 + bl NNS_SndUnlockChannel +_020C91D4: + cmp r7, #0 + beq _020C91E4 + ldr r0, [r4, #0x2c] + bl NNS_SndFreeAlarm +_020C91E4: + ldr r0, [r4, #4] + cmp r0, #1 + bne _020C9204 + mov r0, #0 + mov r1, r0 + mov r2, r0 + mov r3, r0 + bl SND_SetOutputSelector +_020C9204: + mov r0, #0 + str r0, [r4] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020C9210: .word _021E0314 +_020C9214: .word _021E035C +_020C9218: .word _021E031C + arm_func_end NNSi_SndCaptureStop + + arm_func_start NNSi_SndCaptureBeginSleep +NNSi_SndCaptureBeginSleep: ; 0x020C921C + stmdb sp!, {r4, lr} + ldr r0, _020C9274 ; =_021E0314 + ldr r3, _020C9278 ; =_021E035C + ldr r0, [r0, #0x48] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r3, #0x2c] + cmp r1, #0 + movge r0, #1 + movge r2, r0, lsl r1 + ldr r0, [r3, #0x24] + ldr r1, [r3, #0x28] + movlt r2, #0 + mov r3, #0 + bl SND_StopTimer + bl SND_GetCurrentCommandTag + mov r4, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r4 + bl SND_WaitForCommandProc + ldmia sp!, {r4, pc} + .align 2, 0 +_020C9274: .word _021E0314 +_020C9278: .word _021E035C + arm_func_end NNSi_SndCaptureBeginSleep + + arm_func_start NNSi_SndCaptureEndSleep +NNSi_SndCaptureEndSleep: ; 0x020C927C + stmdb sp!, {r4, lr} + ldr r0, _020C92F8 ; =_021E0314 + ldr r4, _020C92FC ; =_021E035C + ldr r0, [r0, #0x48] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r4, #0xc] + mov r0, #0 + ldr r2, [r4, #0x14] + str r0, [r4, #0x1c] + bl MIi_CpuClear32 + ldr r1, [r4, #0x10] + ldr r2, [r4, #0x14] + mov r0, #0 + bl MIi_CpuClear32 + ldr r0, [r4, #0xc] + ldr r1, [r4, #0x14] + bl DC_FlushRange + ldr r0, [r4, #0x10] + ldr r1, [r4, #0x14] + bl DC_FlushRange + ldr r1, [r4, #0x2c] + mov r3, #0 + cmp r1, #0 + movge r0, #1 + movge r2, r0, lsl r1 + ldr r0, [r4, #0x24] + ldr r1, [r4, #0x28] + movlt r2, #0 + bl SND_StartTimer + ldmia sp!, {r4, pc} + .align 2, 0 +_020C92F8: .word _021E0314 +_020C92FC: .word _021E035C + arm_func_end NNSi_SndCaptureEndSleep + + arm_func_start NNS_SndArcInit +NNS_SndArcInit: ; 0x020C9300 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov ip, #0 + str ip, [r6, #0x8c] + str ip, [r6, #0x84] + str ip, [r6, #0x88] + add r0, r6, #0x7c + mov r5, r2 + mov r4, r3 + str ip, [r6, #0x90] + bl FS_ConvertPathToFileID + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, r6, #0x34 + bl FS_InitFile + add r1, r6, #0x7c + add r0, r6, #0x34 + ldmia r1, {r1, r2} + bl FS_OpenFileFast + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r3, #1 + mov r0, r6 + mov r1, r5 + mov r2, r4 + str r3, [r6, #0x30] + bl NNS_SndArcSetup + cmp r0, #0 + ldrne r0, _020C937C ; =_021E0910 + strne r6, [r0] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020C937C: .word _021E0910 + arm_func_end NNS_SndArcInit + + arm_func_start NNS_SndArcSetup +NNS_SndArcSetup: ; 0x020C9380 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r0 + mov r4, r1 + mov r1, #0 + mov r6, r2 + mov r2, r1 + add r0, r5, #0x34 + bl FS_SeekFile + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r1, r5 + add r0, r5, #0x34 + mov r2, #0x30 + bl FS_ReadFile + cmp r0, #0x30 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + cmp r4, #0 + beq _020C9540 + mov r0, #0 + str r0, [sp] + ldr r1, [r5, #0x1c] + ldr r2, _020C954C ; =InfoDisposeCallback + mov r0, r4 + mov r3, r5 + bl NNS_SndHeapAlloc + cmp r0, #0 + str r0, [r5, #0x8c] + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x18] + add r0, r5, #0x34 + mov r2, #0 + bl FS_SeekFile + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x8c] + ldr r2, [r5, #0x1c] + add r0, r5, #0x34 + bl FS_ReadFile + ldr r1, [r5, #0x1c] + cmp r0, r1 + addne sp, sp, #4 + mov r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + str r0, [sp] + ldr r1, [r5, #0x24] + ldr r2, _020C9550 ; =FatDisposeCallback + mov r0, r4 + mov r3, r5 + bl NNS_SndHeapAlloc + cmp r0, #0 + str r0, [r5, #0x84] + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x20] + add r0, r5, #0x34 + mov r2, #0 + bl FS_SeekFile + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x84] + ldr r2, [r5, #0x24] + add r0, r5, #0x34 + bl FS_ReadFile + ldr r1, [r5, #0x24] + cmp r0, r1 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} + cmp r6, #0 + ldrne r1, [r5, #0x14] + cmpne r1, #0 + beq _020C9540 + ldr r2, _020C9554 ; =SymbolDisposeCallback + mov ip, #0 + mov r0, r4 + mov r3, r5 + str ip, [sp] + bl NNS_SndHeapAlloc + cmp r0, #0 + str r0, [r5, #0x88] + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x10] + add r0, r5, #0x34 + mov r2, #0 + bl FS_SeekFile + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [r5, #0x88] + ldr r2, [r5, #0x14] + add r0, r5, #0x34 + bl FS_ReadFile + ldr r1, [r5, #0x14] + cmp r0, r1 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, pc} +_020C9540: + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020C954C: .word InfoDisposeCallback +_020C9550: .word FatDisposeCallback +_020C9554: .word SymbolDisposeCallback + arm_func_end NNS_SndArcSetup + + arm_func_start NNS_SndArcInitOnMemory +NNS_SndArcInitOnMemory: ; 0x020C9558 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, r4 + mov r1, r5 + mov r2, #0x30 + bl MIi_CpuCopy32 + ldr r0, [r5, #0x18] + mov r3, #0 + cmp r0, #0 + moveq r0, #0 + addne r0, r4, r0 + str r0, [r5, #0x8c] + ldr r0, [r5, #0x20] + cmp r0, #0 + moveq r0, #0 + addne r0, r4, r0 + str r0, [r5, #0x84] + ldr r0, [r5, #0x10] + cmp r0, #0 + moveq r0, #0 + addne r0, r4, r0 + str r0, [r5, #0x88] + str r3, [r5, #0x90] + ldr r2, [r5, #0x84] + ldr r0, [r2, #8] + cmp r0, #0 + bls _020C9604 + mov ip, r3 + mov r1, r3 +_020C95D0: + add r2, r2, #0xc + ldr r0, [r2, ip] + add r2, r2, ip + cmp r0, #0 + moveq r0, r1 + addne r0, r4, r0 + str r0, [r2, #8] + ldr r2, [r5, #0x84] + add r3, r3, #1 + ldr r0, [r2, #8] + add ip, ip, #0x10 + cmp r3, r0 + blo _020C95D0 +_020C9604: + mov r1, #0 + ldr r0, _020C9618 ; =_021E0910 + str r1, [r5, #0x30] + str r5, [r0] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020C9618: .word _021E0910 + arm_func_end NNS_SndArcInitOnMemory + + arm_func_start NNS_SndArcSetCurrent +NNS_SndArcSetCurrent: ; 0x020C961C + ldr r1, _020C9630 ; =_021E0910 + ldr r2, [r1] + str r0, [r1] + mov r0, r2 + bx lr + .align 2, 0 +_020C9630: .word _021E0910 + arm_func_end NNS_SndArcSetCurrent + + arm_func_start NNS_SndArcGetCurrent +NNS_SndArcGetCurrent: ; 0x020C9634 + ldr r0, _020C9640 ; =_021E0910 + ldr r0, [r0] + bx lr + .align 2, 0 +_020C9640: .word _021E0910 + arm_func_end NNS_SndArcGetCurrent + + arm_func_start NNS_SndArcGetSeqParam +NNS_SndArcGetSeqParam: ; 0x020C9644 + stmdb sp!, {r3, lr} + bl NNS_SndArcGetSeqInfo + cmp r0, #0 + moveq r0, #0 + addne r0, r0, #4 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcGetSeqParam + + arm_func_start NNS_SndArcGetSeqInfo +NNS_SndArcGetSeqInfo: ; 0x020C965C + ldr r1, _020C96BC ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #8] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C96BC: .word _021E0910 + arm_func_end NNS_SndArcGetSeqInfo + + arm_func_start NNS_SndArcGetSeqArcInfo +NNS_SndArcGetSeqArcInfo: ; 0x020C96C0 + ldr r1, _020C9720 ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #0xc] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C9720: .word _021E0910 + arm_func_end NNS_SndArcGetSeqArcInfo + + arm_func_start NNS_SndArcGetBankInfo +NNS_SndArcGetBankInfo: ; 0x020C9724 + ldr r1, _020C9784 ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #0x10] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C9784: .word _021E0910 + arm_func_end NNS_SndArcGetBankInfo + + arm_func_start NNS_SndArcGetWaveArcInfo +NNS_SndArcGetWaveArcInfo: ; 0x020C9788 + ldr r1, _020C97E8 ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #0x14] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C97E8: .word _021E0910 + arm_func_end NNS_SndArcGetWaveArcInfo + + arm_func_start NNS_SndArcGetStrmInfo +NNS_SndArcGetStrmInfo: ; 0x020C97EC + ldr r1, _020C984C ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #0x18] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C984C: .word _021E0910 + arm_func_end NNS_SndArcGetStrmInfo + + arm_func_start NNS_SndArcGetGroupInfo +NNS_SndArcGetGroupInfo: ; 0x020C9850 + ldr r1, _020C98B0 ; =_021E0910 + ldr r3, [r1] + ldr r2, [r3, #0x8c] + ldr r1, [r2, #0x1c] + cmp r1, #0 + moveq r2, #0 + addne r2, r2, r1 + cmp r2, #0 + moveq r0, #0 + bxeq lr + cmp r0, #0 + movlt r0, #0 + bxlt lr + ldr r1, [r2] + cmp r0, r1 + movhs r0, #0 + bxhs lr + add r0, r2, r0, lsl #2 + ldr r1, [r0, #4] + ldr r0, [r3, #0x8c] + cmp r1, #0 + moveq r0, #0 + addne r0, r0, r1 + bx lr + .align 2, 0 +_020C98B0: .word _021E0910 + arm_func_end NNS_SndArcGetGroupInfo + + arm_func_start NNS_SndArcGetFileSize +NNS_SndArcGetFileSize: ; 0x020C98B4 + ldr r1, _020C98D8 ; =_021E0910 + ldr r1, [r1] + ldr r2, [r1, #0x84] + ldr r1, [r2, #8] + cmp r0, r1 + movhs r0, #0 + addlo r0, r2, r0, lsl #4 + ldrlo r0, [r0, #0x10] + bx lr + .align 2, 0 +_020C98D8: .word _021E0910 + arm_func_end NNS_SndArcGetFileSize + + arm_func_start NNS_SndArcReadFile +NNS_SndArcReadFile: ; 0x020C98DC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _020C99A0 ; =_021E0910 + mov sb, r2 + ldr r7, [r4] + mov sl, r1 + ldr r2, [r7, #0x84] + mov r8, r3 + ldr r1, [r2, #8] + cmp r0, r1 + mvnhs r0, #0 + ldmhsia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, [r7, #0x90] + add r1, r2, #0xc + cmp r5, #0 + moveq r5, sb + add fp, r1, r0, lsl #4 + cmp sb, #0 + mov r4, #0 + ble _020C9998 +_020C9928: + ldr r0, [fp, #4] + sub r6, sb, r4 + cmp r6, r5 + movgt r6, r5 + sub r0, r0, r8 + cmp r6, r0 + movhi r6, r0 + cmp r6, #0 + beq _020C9998 + ldr r1, [fp] + mov r2, #0 + add r0, r7, #0x34 + add r1, r1, r8 + bl FS_SeekFile + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r1, sl + mov r2, r6 + add r0, r7, #0x34 + bl FS_ReadFile + cmp r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r4, r4, r0 + cmp r4, sb + add r8, r8, r0 + add sl, sl, r0 + blt _020C9928 +_020C9998: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020C99A0: .word _021E0910 + arm_func_end NNS_SndArcReadFile + + arm_func_start NNS_SndArcGetFileAddress +NNS_SndArcGetFileAddress: ; 0x020C99A4 + ldr r1, _020C99C8 ; =_021E0910 + ldr r1, [r1] + ldr r2, [r1, #0x84] + ldr r1, [r2, #8] + cmp r0, r1 + movhs r0, #0 + addlo r0, r2, r0, lsl #4 + ldrlo r0, [r0, #0x14] + bx lr + .align 2, 0 +_020C99C8: .word _021E0910 + arm_func_end NNS_SndArcGetFileAddress + + arm_func_start NNS_SndArcSetFileAddress +NNS_SndArcSetFileAddress: ; 0x020C99CC + ldr r2, _020C99E4 ; =_021E0910 + ldr r2, [r2] + ldr r2, [r2, #0x84] + add r0, r2, r0, lsl #4 + str r1, [r0, #0x14] + bx lr + .align 2, 0 +_020C99E4: .word _021E0910 + arm_func_end NNS_SndArcSetFileAddress + + arm_func_start InfoDisposeCallback +InfoDisposeCallback: ; 0x020C99E8 + mov r0, #0 + str r0, [r2, #0x8c] + bx lr + arm_func_end InfoDisposeCallback + + arm_func_start FatDisposeCallback +FatDisposeCallback: ; 0x020C99F4 + mov r0, #0 + str r0, [r2, #0x84] + bx lr + arm_func_end FatDisposeCallback + + arm_func_start SymbolDisposeCallback +SymbolDisposeCallback: ; 0x020C9A00 + mov r0, #0 + str r0, [r2, #0x88] + bx lr + arm_func_end SymbolDisposeCallback + + arm_func_start NNS_SndHeapCreate +NNS_SndHeapCreate: ; 0x020C9A0C + stmdb sp!, {r3, r4, r5, lr} + add r2, r0, #3 + add r0, r0, r1 + bic r5, r2, #3 + cmp r5, r0 + movhi r0, #0 + ldmhiia sp!, {r3, r4, r5, pc} + sub r1, r0, r5 + cmp r1, #0x10 + movlo r0, #0 + ldmloia sp!, {r3, r4, r5, pc} + add r0, r5, #0x10 + sub r1, r1, #0x10 + mov r2, #0 + bl NNS_FndCreateFrmHeapEx + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl InitHeap + cmp r0, #0 + movne r0, r5 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r4 + bl NNS_FndDestroyFrmHeap + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NNS_SndHeapCreate + + arm_func_start NNS_SndHeapDestroy +NNS_SndHeapDestroy: ; 0x020C9A7C + stmdb sp!, {r4, lr} + mov r4, r0 + bl NNS_SndHeapClear + ldr r0, [r4] + bl NNS_FndDestroyFrmHeap + ldmia sp!, {r4, pc} + arm_func_end NNS_SndHeapDestroy + + arm_func_start NNS_SndHeapClear +NNS_SndHeapClear: ; 0x020C9A94 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, r0 + mov r6, #0 + mov r1, r6 + add r0, r8, #4 + bl NNS_FndGetPrevListObject + movs r5, r0 + beq _020C9B2C + mov sl, #1 + mov sb, r6 + mov r4, r6 +_020C9AC0: + mov r0, r5 + mov r1, r4 + bl NNS_FndGetPrevListObject + movs r7, r0 + beq _020C9B0C +_020C9AD4: + ldr ip, [r7, #0xc] + cmp ip, #0 + beq _020C9AF8 + ldr r1, [r7, #8] + ldr r2, [r7, #0x10] + ldr r3, [r7, #0x14] + add r0, r7, #0x20 + blx ip + mov r6, sl +_020C9AF8: + mov r0, r5 + mov r1, r7 + bl NNS_FndGetPrevListObject + movs r7, r0 + bne _020C9AD4 +_020C9B0C: + mov r1, r5 + add r0, r8, #4 + bl NNS_FndRemoveListObject + mov r1, sb + add r0, r8, #4 + bl NNS_FndGetPrevListObject + movs r5, r0 + bne _020C9AC0 +_020C9B2C: + ldr r0, [r8] + mov r1, #3 + bl NNS_FndFreeToFrmHeap + cmp r6, #0 + beq _020C9B44 + bl EraseSync +_020C9B44: + mov r0, r8 + bl NewSection + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end NNS_SndHeapClear + + arm_func_start NNS_SndHeapAlloc +NNS_SndHeapAlloc: ; 0x020C9B50 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r8, r0 + add r0, r7, #0x1f + bic r1, r0, #0x1f + mov r6, r2 + ldr r0, [r8] + add r1, r1, #0x20 + mov r2, #0x20 + mov r5, r3 + bl NNS_FndAllocFromFrmHeapEx + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r8, #4 + mov r1, #0 + bl NNS_FndGetPrevListObject + str r7, [r4, #8] + str r6, [r4, #0xc] + ldr r2, [sp, #0x18] + str r5, [r4, #0x10] + mov r1, r4 + str r2, [r4, #0x14] + bl NNS_FndAppendListObject + add r0, r4, #0x20 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_SndHeapAlloc + + arm_func_start NNS_SndHeapSaveState +NNS_SndHeapSaveState: ; 0x020C9BB8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r1, [r4, #0xc] + ldr r0, [r4] + bl NNS_FndRecordStateForFrmHeap + cmp r0, #0 + mvneq r0, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl NewSection + cmp r0, #0 + ldrneh r0, [r4, #0xc] + subne r0, r0, #1 + ldmneia sp!, {r4, pc} + ldr r0, [r4] + mov r1, #0 + bl NNS_FndFreeByStateToFrmHeap + mvn r0, #0 + ldmia sp!, {r4, pc} + arm_func_end NNS_SndHeapSaveState + + arm_func_start NNS_SndHeapLoadState +NNS_SndHeapLoadState: ; 0x020C9C04 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r8, #0 + movs sb, r1 + mov sl, r0 + mov r7, r8 + bne _020C9C24 + bl NNS_SndHeapClear + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_020C9C24: + ldrh r0, [sl, #0xc] + cmp sb, r0 + bge _020C9CA8 + mov r4, #1 + mov r5, r8 +_020C9C38: + mov r1, r5 + add r0, sl, #4 + bl NNS_FndGetPrevListObject + mov r1, r8 + mov r6, r0 + bl NNS_FndGetPrevListObject + movs r8, r0 + beq _020C9C90 +_020C9C58: + ldr ip, [r8, #0xc] + cmp ip, #0 + beq _020C9C7C + ldr r1, [r8, #8] + ldr r2, [r8, #0x10] + ldr r3, [r8, #0x14] + add r0, r8, #0x20 + blx ip + mov r7, r4 +_020C9C7C: + mov r0, r6 + mov r1, r8 + bl NNS_FndGetPrevListObject + movs r8, r0 + bne _020C9C58 +_020C9C90: + mov r1, r6 + add r0, sl, #4 + bl NNS_FndRemoveListObject + ldrh r0, [sl, #0xc] + cmp sb, r0 + blt _020C9C38 +_020C9CA8: + ldr r0, [sl] + mov r1, sb + bl NNS_FndFreeByStateToFrmHeap + cmp r7, #0 + beq _020C9CC0 + bl EraseSync +_020C9CC0: + ldrh r1, [sl, #0xc] + ldr r0, [sl] + bl NNS_FndRecordStateForFrmHeap + mov r0, sl + bl NewSection + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end NNS_SndHeapLoadState + + arm_func_start NNS_SndHeapGetSize +NNS_SndHeapGetSize: ; 0x020C9CD8 + ldr r1, [r0] + ldr r0, [r1, #0x1c] + sub r0, r0, r1 + bx lr + arm_func_end NNS_SndHeapGetSize + + arm_func_start NNS_SndHeapGetFreeSize +NNS_SndHeapGetFreeSize: ; 0x020C9CE8 + stmdb sp!, {r3, lr} + ldr r0, [r0] + mov r1, #0x20 + bl NNS_FndGetAllocatableSizeForFrmHeapEx + cmp r0, #0x20 + movlo r0, #0 + subhs r0, r0, #0x20 + bichs r0, r0, #0x1f + ldmia sp!, {r3, pc} + arm_func_end NNS_SndHeapGetFreeSize + + arm_func_start InitHeapSection +InitHeapSection: ; 0x020C9D0C + ldr ip, _020C9D18 ; =NNS_FndInitList + mov r1, #0 + bx ip + .align 2, 0 +_020C9D18: .word NNS_FndInitList + arm_func_end InitHeapSection + + arm_func_start InitHeap +InitHeap: ; 0x020C9D1C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + add r0, r5, #4 + mov r1, #0xc + bl NNS_FndInitList + mov r0, r5 + str r4, [r5] + bl NewSection + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end InitHeap + + arm_func_start NewSection +NewSection: ; 0x020C9D50 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5] + mov r1, #0x14 + mov r2, #4 + bl NNS_FndAllocFromFrmHeapEx + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + bl InitHeapSection + mov r1, r4 + add r0, r5, #4 + bl NNS_FndAppendListObject + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end NewSection + + arm_func_start EraseSync +EraseSync: ; 0x020C9D8C + stmdb sp!, {r4, lr} + bl SND_GetCurrentCommandTag + mov r4, r0 + mov r0, #1 + bl SND_FlushCommand + mov r0, r4 + bl SND_WaitForCommandProc + ldmia sp!, {r4, pc} + arm_func_end EraseSync + + arm_func_start NNS_SndArcLoadGroup +NNS_SndArcLoadGroup: ; 0x020C9DAC + stmdb sp!, {r3, lr} + bl NNSi_SndArcLoadGroup + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcLoadGroup + + arm_func_start NNS_SndArcLoadSeq +NNS_SndArcLoadSeq: ; 0x020C9DC4 + stmdb sp!, {r3, lr} + mov r2, r1 + mov ip, #0 + mov r1, #0xff + mov r3, #1 + str ip, [sp] + bl NNSi_SndArcLoadSeq + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcLoadSeq + + arm_func_start NNS_SndArcLoadBank +NNS_SndArcLoadBank: ; 0x020C9DF0 + stmdb sp!, {r3, lr} + mov r2, r1 + mov ip, #0 + mov r1, #0xff + mov r3, #1 + str ip, [sp] + bl NNSi_SndArcLoadBank + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcLoadBank + + arm_func_start NNS_SndArcLoadWaveArc +NNS_SndArcLoadWaveArc: ; 0x020C9E1C + stmdb sp!, {r3, lr} + mov r2, r1 + mov ip, #0 + mov r1, #0xff + mov r3, #1 + str ip, [sp] + bl NNSi_SndArcLoadWaveArc + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcLoadWaveArc + + arm_func_start NNS_SndArcLoadSeqEx +NNS_SndArcLoadSeqEx: ; 0x020C9E48 + stmdb sp!, {r3, lr} + mov ip, #0 + mov r3, #1 + str ip, [sp] + bl NNSi_SndArcLoadSeq + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, pc} + arm_func_end NNS_SndArcLoadSeqEx + + arm_func_start NNSi_SndArcLoadGroup +NNSi_SndArcLoadGroup: ; 0x020C9E6C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + bl NNS_SndArcGetGroupInfo + movs r6, r0 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r6] + mov r7, #0 + cmp r0, #0 + bls _020C9F68 + add r8, r6, #4 + mov fp, r7 + mov sl, r7 + mov r4, r7 + mov r5, r7 +_020C9EA8: + ldrb r0, [r8] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _020C9F54 +_020C9EB8: ; jump table + b _020C9EC8 ; case 0 + b _020C9F10 ; case 1 + b _020C9F34 ; case 2 + b _020C9EEC ; case 3 +_020C9EC8: + str r5, [sp] + ldrb r1, [r8, #1] + ldr r0, [r8, #4] + mov r2, sb + mov r3, #1 + bl NNSi_SndArcLoadSeq + cmp r0, #0 + beq _020C9F54 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C9EEC: + str r4, [sp] + ldrb r1, [r8, #1] + ldr r0, [r8, #4] + mov r2, sb + mov r3, #1 + bl NNSi_SndArcLoadSeqArc + cmp r0, #0 + beq _020C9F54 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C9F10: + str sl, [sp] + ldrb r1, [r8, #1] + ldr r0, [r8, #4] + mov r2, sb + mov r3, #1 + bl NNSi_SndArcLoadBank + cmp r0, #0 + beq _020C9F54 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C9F34: + str fp, [sp] + ldrb r1, [r8, #1] + ldr r0, [r8, #4] + mov r2, sb + mov r3, #1 + bl NNSi_SndArcLoadWaveArc + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020C9F54: + ldr r0, [r6] + add r7, r7, #1 + cmp r7, r0 + add r8, r8, #8 + blo _020C9EA8 +_020C9F68: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end NNSi_SndArcLoadGroup + + arm_func_start NNSi_SndArcLoadSeq +NNSi_SndArcLoadSeq: ; 0x020C9F70 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl NNS_SndArcGetSeqInfo + movs r4, r0 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + str r0, [sp] + ldrh r0, [r4, #4] + mov r1, r7 + mov r2, r6 + mov r3, r5 + bl NNSi_SndArcLoadBank + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + tst r7, #1 + ldr r0, [r4] + beq _020C9FDC + mov r1, r6 + mov r2, r5 + bl LoadSeq + cmp r0, #0 + bne _020C9FE0 + mov r0, #6 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020C9FDC: + bl NNS_SndArcGetFileAddress +_020C9FE0: + ldr r1, [sp, #0x18] + cmp r1, #0 + strne r0, [r1] + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNSi_SndArcLoadSeq + + arm_func_start NNSi_SndArcLoadSeqArc +NNSi_SndArcLoadSeqArc: ; 0x020C9FF4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl NNS_SndArcGetSeqArcInfo + cmp r0, #0 + moveq r0, #3 + ldmeqia sp!, {r4, r5, r6, pc} + tst r6, #8 + ldr r0, [r0] + beq _020CA03C + mov r1, r5 + mov r2, r4 + bl LoadSeqArc + cmp r0, #0 + bne _020CA040 + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020CA03C: + bl NNS_SndArcGetFileAddress +_020CA040: + ldr r1, [sp, #0x10] + cmp r1, #0 + strne r0, [r1] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_SndArcLoadSeqArc + + arm_func_start NNSi_SndArcLoadBank +NNSi_SndArcLoadBank: ; 0x020CA054 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r1 + mov sb, r2 + mov fp, r3 + bl NNS_SndArcGetBankInfo + movs r5, r0 + addeq sp, sp, #8 + moveq r0, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + tst sl, #2 + ldr r0, [r5] + beq _020CA0A8 + mov r1, sb + mov r2, fp + bl LoadBank + movs r6, r0 + bne _020CA0B0 + add sp, sp, #8 + mov r0, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020CA0A8: + bl NNS_SndArcGetFileAddress + mov r6, r0 +_020CA0B0: + and r8, sl, #4 + mov r7, #0 +_020CA0B8: + add r0, r5, r7, lsl #1 + ldrh r0, [r0, #4] + ldr r1, _020CA190 ; =0x0000FFFF + cmp r0, r1 + beq _020CA16C + bl NNS_SndArcGetWaveArcInfo + movs r4, r0 + addeq sp, sp, #8 + moveq r0, #5 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r0, sp, #4 + str r0, [sp] + add r0, r5, r7, lsl #1 + ldrh r0, [r0, #4] + mov r1, sl + mov r2, sb + mov r3, fp + bl NNSi_SndArcLoadWaveArc + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4] + mov r0, r0, lsr #0x18 + tst r0, #1 + cmpne r8, #0 + beq _020CA150 + str sb, [sp] + ldr r1, [r4] + ldr r0, [sp, #4] + mov r3, r1, lsl #8 + mov r1, r6 + mov r2, r7 + mov r3, r3, lsr #8 + bl LoadSingleWaves + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #9 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020CA150: + cmp r6, #0 + ldrne r2, [sp, #4] + cmpne r2, #0 + beq _020CA16C + mov r0, r6 + mov r1, r7 + bl SND_AssignWaveArc +_020CA16C: + add r7, r7, #1 + cmp r7, #4 + blt _020CA0B8 + ldr r0, [sp, #0x30] + cmp r0, #0 + strne r6, [r0] + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020CA190: .word 0x0000FFFF + arm_func_end NNSi_SndArcLoadBank + + arm_func_start NNSi_SndArcLoadWaveArc +NNSi_SndArcLoadWaveArc: ; 0x020CA194 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl NNS_SndArcGetWaveArcInfo + cmp r0, #0 + moveq r0, #5 + ldmeqia sp!, {r4, r5, r6, pc} + tst r6, #4 + ldr r0, [r0] + beq _020CA200 + mov r1, r0, lsr #0x18 + tst r1, #1 + mov r0, r0, lsl #8 + mov r1, r5 + beq _020CA1E4 + mov r2, r4 + mov r0, r0, lsr #8 + bl LoadWaveArcTable + b _020CA1F0 +_020CA1E4: + mov r2, r4 + mov r0, r0, lsr #8 + bl LoadWaveArc +_020CA1F0: + cmp r0, #0 + bne _020CA20C + mov r0, #9 + ldmia sp!, {r4, r5, r6, pc} +_020CA200: + mov r0, r0, lsl #8 + mov r0, r0, lsr #8 + bl NNS_SndArcGetFileAddress +_020CA20C: + ldr r1, [sp, #0x10] + cmp r1, #0 + strne r0, [r1] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_SndArcLoadWaveArc + + arm_func_start NNSi_SndArcLoadFile +NNSi_SndArcLoadFile: ; 0x020CA220 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r4, r3 + bl NNS_SndArcGetFileSize + movs r5, r0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #0x20] + cmp r0, #0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r2, r7 + mov r3, r6 + add r1, r5, #0x20 + str r4, [sp] + bl NNS_SndHeapAlloc + movs r4, r0 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r8 + mov r1, r4 + mov r2, r5 + mov r3, #0 + bl NNS_SndArcReadFile + cmp r5, r0 + addne sp, sp, #4 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r4 + mov r1, r5 + bl DC_StoreRange + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end NNSi_SndArcLoadFile + + arm_func_start LoadSeq +LoadSeq: ; 0x020CA2C0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl NNS_SndArcGetFileAddress + movs r4, r0 + bne _020CA320 + cmp r5, #0 + moveq r2, #0 + beq _020CA2F0 + bl NNS_SndArcGetCurrent + mov r2, r0 +_020CA2F0: + ldr r1, _020CA328 ; =SeqDisposeCallback + mov r0, r7 + mov r3, r7 + str r6, [sp] + bl NNSi_SndArcLoadFile + mov r4, r0 + cmp r5, #0 + cmpne r4, #0 + beq _020CA320 + mov r0, r7 + mov r1, r4 + bl NNS_SndArcSetFileAddress +_020CA320: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020CA328: .word SeqDisposeCallback + arm_func_end LoadSeq + + arm_func_start LoadSeqArc +LoadSeqArc: ; 0x020CA32C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl NNS_SndArcGetFileAddress + movs r4, r0 + bne _020CA38C + cmp r5, #0 + moveq r2, #0 + beq _020CA35C + bl NNS_SndArcGetCurrent + mov r2, r0 +_020CA35C: + ldr r1, _020CA394 ; =SeqDisposeCallback + mov r0, r7 + mov r3, r7 + str r6, [sp] + bl NNSi_SndArcLoadFile + mov r4, r0 + cmp r5, #0 + cmpne r4, #0 + beq _020CA38C + mov r0, r7 + mov r1, r4 + bl NNS_SndArcSetFileAddress +_020CA38C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020CA394: .word SeqDisposeCallback + arm_func_end LoadSeqArc + + arm_func_start LoadBank +LoadBank: ; 0x020CA398 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl NNS_SndArcGetFileAddress + movs r4, r0 + bne _020CA3F8 + cmp r5, #0 + moveq r2, #0 + beq _020CA3C8 + bl NNS_SndArcGetCurrent + mov r2, r0 +_020CA3C8: + ldr r1, _020CA400 ; =BankDisposeCallback + mov r0, r7 + mov r3, r7 + str r6, [sp] + bl NNSi_SndArcLoadFile + mov r4, r0 + cmp r5, #0 + cmpne r4, #0 + beq _020CA3F8 + mov r0, r7 + mov r1, r4 + bl NNS_SndArcSetFileAddress +_020CA3F8: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020CA400: .word BankDisposeCallback + arm_func_end LoadBank + + arm_func_start LoadWaveArc +LoadWaveArc: ; 0x020CA404 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl NNS_SndArcGetFileAddress + movs r4, r0 + bne _020CA464 + cmp r5, #0 + moveq r2, #0 + beq _020CA434 + bl NNS_SndArcGetCurrent + mov r2, r0 +_020CA434: + ldr r1, _020CA46C ; =WaveArcDisposeCallback + mov r0, r7 + mov r3, r7 + str r6, [sp] + bl NNSi_SndArcLoadFile + mov r4, r0 + cmp r5, #0 + cmpne r4, #0 + beq _020CA464 + mov r0, r7 + mov r1, r4 + bl NNS_SndArcSetFileAddress +_020CA464: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020CA46C: .word WaveArcDisposeCallback + arm_func_end LoadWaveArc + + arm_func_start LoadWaveArcTable +LoadWaveArcTable: ; 0x020CA470 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r8, r1 + mov r7, r2 + bl NNS_SndArcGetFileAddress + movs r5, r0 + bne _020CA564 + ldr r1, _020CA56C ; =_021E0914 + mov r0, sb + mov r2, #0x3c + mov r3, #0 + bl NNS_SndArcReadFile + cmp r0, #0x3c + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, _020CA570 ; =_021E0914 + cmp r8, #0 + ldr r0, [r0, #0x38] + mov r6, r0, lsl #2 + mov r4, r6, lsl #1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + cmp r7, #0 + moveq r3, #0 + beq _020CA4DC + bl NNS_SndArcGetCurrent + mov r3, r0 +_020CA4DC: + ldr r2, _020CA574 ; =WaveArcTableDisposeCallback + mov r0, r8 + add r1, r4, #0x5c + str sb, [sp] + bl NNS_SndHeapAlloc + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, sb + mov r1, r5 + add r2, r6, #0x3c + mov r3, #0 + bl NNS_SndArcReadFile + add r1, r6, #0x3c + cmp r0, r1 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r1, [r5, #0x38] + add r0, r5, #0x3c + mov r2, r6 + add r1, r0, r1, lsl #2 + bl MI_CpuCopy8 + mov r2, r6 + add r0, r5, #0x3c + mov r1, #0 + bl MI_CpuFill8 + mov r0, r5 + add r1, r4, #0x3c + bl DC_StoreRange + cmp r7, #0 + beq _020CA564 + mov r0, sb + mov r1, r5 + bl NNS_SndArcSetFileAddress +_020CA564: + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020CA56C: .word _021E0914 +_020CA570: .word _021E0914 +_020CA574: .word WaveArcTableDisposeCallback + arm_func_end LoadWaveArcTable + + arm_func_start DisposeCallback +DisposeCallback: ; 0x020CA578 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r4, r1 + mov r7, r0 + mov r6, r2 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl OS_DisableInterrupts + mov r5, r0 + mov r0, r4 + bl NNS_SndArcSetCurrent + mov r4, r0 + mov r0, r6 + bl NNS_SndArcGetFileAddress + cmp r7, r0 + bne _020CA5BC + mov r0, r6 + mov r1, #0 + bl NNS_SndArcSetFileAddress +_020CA5BC: + mov r0, r4 + bl NNS_SndArcSetCurrent + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end DisposeCallback + + arm_func_start SeqDisposeCallback +SeqDisposeCallback: ; 0x020CA5D0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, r2 + mov r5, r0 + mov r2, r3 + bl DisposeCallback + mov r0, r5 + add r1, r5, r4 + bl SND_InvalidateSeqData + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SeqDisposeCallback + + arm_func_start BankDisposeCallback +BankDisposeCallback: ; 0x020CA5F8 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, r2 + mov r5, r0 + mov r2, r3 + bl DisposeCallback + mov r0, r5 + add r1, r5, r4 + bl SND_InvalidateBankData + mov r0, r5 + bl SND_DestroyBank + ldmia sp!, {r3, r4, r5, pc} + arm_func_end BankDisposeCallback + + arm_func_start WaveArcDisposeCallback +WaveArcDisposeCallback: ; 0x020CA628 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r1, r2 + mov r5, r0 + mov r2, r3 + bl DisposeCallback + mov r0, r5 + add r1, r5, r4 + bl SND_InvalidateWaveData + mov r0, r5 + bl SND_DestroyWaveArc + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WaveArcDisposeCallback + + arm_func_start WaveArcTableDisposeCallback +WaveArcTableDisposeCallback: ; 0x020CA658 + stmdb sp!, {r4, lr} + mov r1, r2 + mov r4, r0 + mov r2, r3 + bl DisposeCallback + mov r0, r4 + bl SND_DestroyWaveArc + ldmia sp!, {r4, pc} + arm_func_end WaveArcTableDisposeCallback + + arm_func_start SingleWaveDisposeCallback +SingleWaveDisposeCallback: ; 0x020CA678 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r2 + mov r7, r0 + mov r4, r3 + mov r6, r1 + mov r0, r5 + mov r1, r4 + bl SND_GetWaveDataAddress + cmp r7, r0 + bne _020CA6B0 + mov r0, r5 + mov r1, r4 + mov r2, #0 + bl SND_SetWaveDataAddress +_020CA6B0: + mov r0, r7 + add r1, r7, r6 + bl SND_InvalidateWaveData + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SingleWaveDisposeCallback + + arm_func_start LoadSingleWave +LoadSingleWave: ; 0x020CA6C0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl SND_GetWaveDataAddress + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r8 + bl SND_GetWaveDataCount + ldr r1, [r8, #0x38] + sub r0, r0, #1 + add r1, r1, r7 + add r1, r8, r1, lsl #2 + cmp r7, r0 + ldrlo r0, [r1, #0x40] + ldr r4, [r1, #0x3c] + ldrhs r0, [r8, #8] + cmp r5, #0 + sub sb, r0, r4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r2, _020CA784 ; =SingleWaveDisposeCallback + mov r0, r5 + mov r3, r8 + add r1, sb, #0x20 + str r7, [sp] + bl NNS_SndHeapAlloc + movs r5, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r6 + mov r1, r5 + mov r2, sb + mov r3, r4 + bl NNS_SndArcReadFile + cmp sb, r0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r5 + mov r1, sb + bl DC_StoreRange + mov r0, r8 + mov r1, r7 + mov r2, r5 + bl SND_SetWaveDataAddress + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020CA784: .word SingleWaveDisposeCallback + arm_func_end LoadSingleWave + + arm_func_start LoadSingleWaves +LoadSingleWaves: ; 0x020CA788 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x1c + mov r8, r0 + add r0, sp, #0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldr r4, [sp, #0x40] + bl SND_GetFirstInstDataPos + ldr r1, [sp] + ldr r0, [sp, #4] + str r1, [sp, #8] + str r0, [sp, #0xc] + cmp r7, #0 + add r2, sp, #8 + addeq sp, sp, #0x1c + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + add r1, sp, #0x10 + mov r0, r7 + bl SND_GetNextInstData + cmp r0, #0 + beq _020CA83C + add sl, sp, #0x10 + add sb, sp, #8 +_020CA7EC: + ldrb r0, [sp, #0x10] + cmp r0, #1 + ldreqh r0, [sp, #0x14] + cmpeq r6, r0 + bne _020CA824 + ldrh r1, [sp, #0x12] + mov r0, r8 + mov r2, r5 + mov r3, r4 + bl LoadSingleWave + cmp r0, #0 + addeq sp, sp, #0x1c + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} +_020CA824: + mov r0, r7 + mov r1, sl + mov r2, sb + bl SND_GetNextInstData + cmp r0, #0 + bne _020CA7EC +_020CA83C: + mov r0, #1 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end LoadSingleWaves + + arm_func_start NNS_SndArcPlayerSetup +NNS_SndArcPlayerSetup: ; 0x020CA848 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r4, r0 + bl NNS_SndArcGetCurrent + mov r6, #0 + mov r5, r6 +_020CA85C: + mov r0, r6 + bl NNS_SndArcGetStrmInfo + movs r7, r0 + beq _020CA8D0 + ldrb r1, [r7] + mov r0, r6 + bl NNS_SndPlayerSetPlayableSeqCount + ldrh r1, [r7, #2] + mov r0, r6 + bl NNS_SndPlayerSetAllocatableChannel + ldr r0, [r7, #4] + cmp r0, #0 + cmpne r4, #0 + beq _020CA8D0 + ldrb r0, [r7] + mov r8, r5 + cmp r0, #0 + ble _020CA8D0 +_020CA8A4: + ldr r2, [r7, #4] + mov r0, r6 + mov r1, r4 + bl NNS_SndPlayerCreateHeap + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r0, [r7] + add r8, r8, #1 + cmp r8, r0 + blt _020CA8A4 +_020CA8D0: + add r6, r6, #1 + cmp r6, #0x20 + blt _020CA85C + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end NNS_SndArcPlayerSetup + + arm_func_start NNS_SndArcPlayerStartSeqEx +NNS_SndArcPlayerStartSeqEx: ; 0x020CA8E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + ldr r0, [sp, #0x20] + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl NNS_SndArcGetSeqInfo + cmp r0, #0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #0 + ldrltb r4, [r0, #8] + cmp r5, #0 + ldrlth r5, [r0, #4] + cmp r6, #0 + ldrltb r6, [r0, #9] + ldr ip, [sp, #0x20] + mov r2, r5 + str r0, [sp] + mov r0, r7 + mov r1, r6 + mov r3, r4 + str ip, [sp, #4] + bl StartSeq + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_SndArcPlayerStartSeqEx + + arm_func_start NNS_SndArcPlayerStartSeqArc +NNS_SndArcPlayerStartSeqArc: ; 0x020CA954 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x10 + mov r6, r1 + mov r7, r0 + mov r0, r6 + mov r5, r2 + bl NNS_SndArcGetSeqArcInfo + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r0] + bl NNS_SndArcGetFileAddress + movs r4, r0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r1, r5 + bl NNSi_SndSeqArcGetSeqInfo + cmp r0, #0 + addeq sp, sp, #0x10 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + stmia sp, {r0, r4, r6} + str r5, [sp, #0xc] + ldrb r1, [r0, #9] + ldrh r2, [r0, #4] + ldrb r3, [r0, #8] + mov r0, r7 + bl StartSeqArc + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end NNS_SndArcPlayerStartSeqArc + + arm_func_start StartSeq +StartSeq: ; 0x020CA9D4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + mov r8, r2 + mov r2, r3 + ldr r5, [sp, #0x28] + mov r6, r0 + mov r7, r1 + bl NNSi_SndPlayerAllocSeqPlayer + movs r4, r0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r0, r7 + mov r1, r4 + bl NNSi_SndPlayerAllocHeap + mov r7, r0 + add ip, sp, #4 + mov r0, r8 + mov r2, r7 + mov r1, #6 + mov r3, #0 + str ip, [sp] + bl NNSi_SndArcLoadBank + cmp r0, #0 + beq _020CAA4C + mov r0, r4 + bl NNSi_SndPlayerFreeSeqPlayer + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020CAA4C: + ldr r0, [sp, #0x2c] + add ip, sp, #8 + mov r2, r7 + mov r1, #1 + mov r3, #0 + str ip, [sp] + bl NNSi_SndArcLoadSeq + cmp r0, #0 + beq _020CAA84 + mov r0, r4 + bl NNSi_SndPlayerFreeSeqPlayer + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020CAA84: + ldr r2, [sp, #8] + ldr r3, [sp, #4] + ldr r1, [r2, #0x18] + mov r0, r4 + add r1, r2, r1 + mov r2, #0 + bl NNSi_SndPlayerStartSeq + ldrb r1, [r5, #6] + mov r0, r6 + bl NNS_SndPlayerSetInitialVolume + ldrb r1, [r5, #7] + mov r0, r6 + bl NNS_SndPlayerSetChannelPriority + ldr r1, [sp, #0x2c] + mov r0, r6 + bl NNS_SndPlayerSetSeqNo + mov r0, #1 + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end StartSeq + + arm_func_start StartSeqArc +StartSeqArc: ; 0x020CAAD0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r7, r2 + mov r2, r3 + ldr r6, [sp, #0x20] + mov r4, r0 + mov r8, r1 + bl NNSi_SndPlayerAllocSeqPlayer + movs r5, r0 + addeq sp, sp, #8 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r8 + mov r1, r5 + bl NNSi_SndPlayerAllocHeap + add ip, sp, #4 + mov r2, r0 + mov r0, r7 + mov r1, #6 + mov r3, #0 + str ip, [sp] + bl NNSi_SndArcLoadBank + cmp r0, #0 + beq _020CAB44 + mov r0, r5 + bl NNSi_SndPlayerFreeSeqPlayer + add sp, sp, #8 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020CAB44: + ldr ip, [sp, #0x24] + ldr r2, [r6] + ldr r1, [ip, #0x18] + ldr r3, [sp, #4] + mov r0, r5 + add r1, ip, r1 + bl NNSi_SndPlayerStartSeq + ldrb r1, [r6, #6] + mov r0, r4 + bl NNS_SndPlayerSetInitialVolume + ldrb r1, [r6, #7] + mov r0, r4 + bl NNS_SndPlayerSetChannelPriority + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + mov r0, r4 + bl NNS_SndPlayerSetSeqArcNo + mov r0, #1 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end StartSeqArc + + arm_func_start NNSi_SndArcStrmMain +NNSi_SndArcStrmMain: ; 0x020CAB94 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r7, _020CAC9C ; =_021E0FEC + ldr r4, _020CACA0 ; =_0210D750 + mov r5, #0 +_020CABA4: + ldr r1, [r7, #0x110] + mov r0, r1, lsl #0x1f + movs r0, r0, asr #0x1f + beq _020CAC88 + ldr r0, [r7, #0x114] + cmp r0, #0 + bne _020CABCC + mov r0, r7 + bl ForceStopStrm__SndArc + b _020CAC88 +_020CABCC: + mov r0, r1, lsl #0x1d + movs r0, r0, asr #0x1f + ldrne r0, [r7, #0x118] + cmpne r0, #0 + beq _020CABF8 + mov r0, r7 + bl NNS_SndStrmStart + ldr r0, [r7, #0x110] + orr r0, r0, #2 + bic r0, r0, #4 + str r0, [r7, #0x110] +_020CABF8: + ldr r0, [r7, #0x110] + mov r0, r0, lsl #0x1e + movs r0, r0, asr #0x1f + beq _020CAC88 + add r0, r7, #0xe8 + bl NNSi_SndFaderUpdate + ldr r1, [r7, #0x154] + add r0, r7, #0xe8 + mov r1, r1, lsl #1 + ldrsh r6, [r4, r1] + bl NNSi_SndFaderGet + mov r0, r0, asr #8 + ldr r1, [r7, #0x158] + mov r0, r0, lsl #1 + mov r2, r1, lsl #1 + ldrsh r1, [r4, r0] + ldrsh r2, [r4, r2] + ldr r0, [r7, #0x15c] + add r1, r1, r6 + add r6, r2, r1 + cmp r6, r0 + beq _020CAC60 + mov r0, r7 + mov r1, r6 + bl NNS_SndStrmSetVolume + str r6, [r7, #0x15c] +_020CAC60: + ldr r0, [r7, #0x110] + mov r0, r0, lsl #0x1c + movs r0, r0, asr #0x1f + beq _020CAC88 + add r0, r7, #0xe8 + bl NNSi_SndFaderIsFinished + cmp r0, #0 + beq _020CAC88 + mov r0, r7 + bl ForceStopStrm__SndArc +_020CAC88: + add r5, r5, #1 + cmp r5, #4 + add r7, r7, #0x174 + blt _020CABA4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020CAC9C: .word _021E0FEC +_020CACA0: .word _0210D750 + arm_func_end NNSi_SndArcStrmMain + + arm_func_start FreePlayer +FreePlayer: ; 0x020CACA4 + ldr r2, [r0, #0x14c] + cmp r2, #0 + movne r1, #0 + strne r1, [r2] + strne r1, [r0, #0x14c] + ldr r1, [r0, #0x110] + bic r2, r1, #1 + bic r1, r2, #4 + bic r1, r1, #2 + str r1, [r0, #0x110] + bx lr + arm_func_end FreePlayer + + arm_func_start ForceStopStrm__SndArc +ForceStopStrm__SndArc: ; 0x020CACD0 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _020CAD60 ; =_021E0FC8 + bl OS_LockMutex + ldr r0, _020CAD64 ; =_021E0950 + ldr r0, [r0, #4] + cmp r0, #0 + beq _020CACFC + add r0, r0, #0xc8 + add r0, r0, #0x400 + bl OS_LockMutex +_020CACFC: + ldr r0, [r4, #0x110] + mov r0, r0, lsl #0x1e + movs r0, r0, asr #0x1f + beq _020CAD14 + mov r0, r4 + bl NNS_SndStrmStop +_020CAD14: + ldr r0, [r4, #0x110] + mov r0, r0, lsl #0x1f + movs r0, r0, asr #0x1f + beq _020CAD30 + ldr r1, [r4, #0x170] + mov r0, r4 + blx r1 +_020CAD30: + mov r0, r4 + bl ShutdownPlayer__SndArc + ldr r0, _020CAD60 ; =_021E0FC8 + bl OS_UnlockMutex + ldr r0, _020CAD64 ; =_021E0950 + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r0, r0, #0xc8 + add r0, r0, #0x400 + bl OS_UnlockMutex + ldmia sp!, {r4, pc} + .align 2, 0 +_020CAD60: .word _021E0FC8 +_020CAD64: .word _021E0950 + arm_func_end ForceStopStrm__SndArc + + arm_func_start ShutdownPlayer__SndArc +ShutdownPlayer__SndArc: ; 0x020CAD68 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x110] + mov r1, r1, lsl #0x1f + movs r1, r1, asr #0x1f + ldmeqia sp!, {r4, pc} + bl FreeChannel + ldr r1, [r4, #0x168] + mov r0, r4 + blx r1 + ldr r0, _020CADC4 ; =_021E0FE0 + mov r1, r4 + bl RemoveCommandByPlayer + ldr r0, _020CADC8 ; =_021E0950 + ldr r0, [r0, #4] + cmp r0, #0 + beq _020CADB8 + mov r1, r4 + add r0, r0, #0x4e0 + bl RemoveCommandByPlayer +_020CADB8: + mov r0, r4 + bl FreePlayer + ldmia sp!, {r4, pc} + .align 2, 0 +_020CADC4: .word _021E0FE0 +_020CADC8: .word _021E0950 + arm_func_end ShutdownPlayer__SndArc + + arm_func_start FreeChannel +FreeChannel: ; 0x020CADCC + stmdb sp!, {r3, lr} + ldr r1, [r0, #0x120] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + subs r1, r1, #1 + str r1, [r0, #0x120] + ldmneia sp!, {r3, pc} + bl NNS_SndStrmFreeChannel + ldmia sp!, {r3, pc} + arm_func_end FreeChannel + + arm_func_start RemoveCommandByPlayer +RemoveCommandByPlayer: ; 0x020CADF0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, r8 + mov r1, #0 + bl NNS_FndGetNextListObject + movs r5, r0 + beq _020CAE54 +_020CAE18: + mov r0, r8 + mov r1, r5 + bl NNS_FndGetNextListObject + ldr r1, [r5, #8] + mov r6, r0 + cmp r1, r7 + bne _020CAE48 + mov r0, r8 + mov r1, r5 + bl NNS_FndRemoveListObject + mov r0, r5 + bl FreeCommandBuffer +_020CAE48: + mov r5, r6 + cmp r6, #0 + bne _020CAE18 +_020CAE54: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end RemoveCommandByPlayer + + arm_func_start FreeCommandBuffer +FreeCommandBuffer: ; 0x020CAE60 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _020CAE88 ; =_021E095C + mov r1, r5 + bl NNS_FndAppendListObject + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020CAE88: .word _021E095C + arm_func_end FreeCommandBuffer + + arm_func_start NNSi_SndSeqArcGetSeqInfo +NNSi_SndSeqArcGetSeqInfo: ; 0x020CAE8C + cmp r1, #0 + movlt r0, #0 + bxlt lr + ldr r2, [r0, #0x1c] + cmp r1, r2 + movhs r0, #0 + bxhs lr + mov r2, #0xc + mul r3, r1, r2 + add ip, r0, #0x20 + ldr r1, [ip, r3] + sub r0, r2, #0xd + cmp r1, r0 + add r0, ip, r3 + moveq r0, #0 + bx lr + arm_func_end NNSi_SndSeqArcGetSeqInfo + + arm_func_start NNSi_SndFaderInit +NNSi_SndFaderInit: ; 0x020CAECC + mov r1, #0 + str r1, [r0, #4] + str r1, [r0] + str r1, [r0, #0xc] + str r1, [r0, #8] + bx lr + arm_func_end NNSi_SndFaderInit + + arm_func_start NNSi_SndFaderSet +NNSi_SndFaderSet: ; 0x020CAEE4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl NNSi_SndFaderGet + stmia r6, {r0, r5} + str r4, [r6, #0xc] + mov r0, #0 + str r0, [r6, #8] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end NNSi_SndFaderSet + + arm_func_start NNSi_SndFaderGet +NNSi_SndFaderGet: ; 0x020CAF0C + stmdb sp!, {r4, lr} + ldr r1, [r0, #0xc] + ldr r2, [r0, #8] + cmp r2, r1 + ldrge r0, [r0, #4] + ldmgeia sp!, {r4, pc} + ldr r4, [r0] + ldr r0, [r0, #4] + sub r0, r0, r4 + mul r0, r2, r0 + bl _s32_div_f + add r0, r4, r0 + ldmia sp!, {r4, pc} + arm_func_end NNSi_SndFaderGet + + arm_func_start NNSi_SndFaderUpdate +NNSi_SndFaderUpdate: ; 0x020CAF40 + ldr r2, [r0, #8] + ldr r1, [r0, #0xc] + cmp r2, r1 + addlt r1, r2, #1 + strlt r1, [r0, #8] + bx lr + arm_func_end NNSi_SndFaderUpdate + + arm_func_start NNSi_SndFaderIsFinished +NNSi_SndFaderIsFinished: ; 0x020CAF58 + ldr r1, [r0, #8] + ldr r0, [r0, #0xc] + cmp r1, r0 + movge r0, #1 + movlt r0, #0 + bx lr + arm_func_end NNSi_SndFaderIsFinished + + .rodata + +_02109200: + .word AllocatorAllocForExpHeap + .word AllocatorFreeForExpHeap + .word AllocatorAllocForSDKHeap + .word AllocatorFreeForSDKHeap +_02109210: + .word DoTransfer3dTex + .word DoTransfer3dTexPltt + .word DoTransfer3dClearImageColor + .word DoTransfer3dClearImageDepth + .word DoTransfer2dBG0CharMain + .word DoTransfer2dBG1CharMain + .word DoTransfer2dBG2CharMain + .word DoTransfer2dBG3CharMain + .word DoTransfer2dBG0ScrMain + .word DoTransfer2dBG1ScrMain + .word DoTransfer2dBG2ScrMain + .word DoTransfer2dBG3ScrMain + .word DoTransfer2dBG2BmpMain + .word DoTransfer2dBG3BmpMain + .word DoTransfer2dObjPlttMain + .word DoTransfer2dBGPlttMain + .word DoTransfer2dObjExtPlttMain + .word DoTransfer2dBGExtPlttMain + .word DoTransfer2dObjOamMain + .word DoTransfer2dObjCharMain + .word DoTransfer2dBG0CharSub + .word DoTransfer2dBG1CharSub + .word DoTransfer2dBG2CharSub + .word DoTransfer2dBG3CharSub + .word DoTransfer2dBG0ScrSub + .word DoTransfer2dBG1ScrSub + .word DoTransfer2dBG2ScrSub + .word DoTransfer2dBG3ScrSub + .word DoTransfer2dBG2BmpSub + .word DoTransfer2dBG3BmpSub + .word DoTransfer2dObjPlttSub + .word DoTransfer2dBGPlttSub + .word DoTransfer2dObjExtPlttSub + .word DoTransfer2dBGExtPlttSub + .word DoTransfer2dObjOamSub + .word DoTransfer2dObjCharSub +_021092A0: + .byte 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00 +_021092E0: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_021092EC: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF +_021092F8: + .byte 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00 + .byte 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00 +_02109310: + .byte 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00 + .byte 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00 +_02109328: + .byte 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00 + .byte 0x23, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 +_0210933C: + .byte 0x03, 0x00, 0x00, 0x00 + .byte 0x04, 0x00, 0x00, 0x00 +_02109344: + .byte 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 + .byte 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + .byte 0x80, 0x00, 0x00, 0x00 +_02109364: + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x02, 0x00, 0x00, 0x00 +_02109394: + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +_021093CC: + .byte 0x00, 0x10, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +_021093F0: + .word DrawGlyphLine, ClearLine, ClearAreaLine +_021093FC: + .word DrawGlyphLine, ClearContinuous, ClearAreaLine +_02109408: + .word DrawGlyph1D, ClearContinuous, ClearArea1D +_02109414: + .byte 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01 + .byte 0x02, 0x01, 0x02, 0x01, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x00, 0x02, 0x01, 0x02 + .byte 0x02, 0x03, 0x03, 0x03 +_02109434: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80 + .byte 0x00, 0x40, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0 + .byte 0x00, 0x00, 0x00, 0xC0 +_02109474: + .byte 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F + .byte 0xFF, 0x7F, 0xFF, 0x7F, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x7F + .byte 0xFF, 0xFF, 0xFF, 0x7F +_02109494: + .byte 0x04, 0x05, 0x07, 0x08, 0x03, 0x05, 0x06, 0x08, 0x03, 0x04, 0x06, 0x07 + .byte 0x01, 0x02, 0x07, 0x08, 0x00, 0x02, 0x06, 0x08, 0x00, 0x01, 0x06, 0x07, 0x01, 0x02, 0x04, 0x05 + .byte 0x00, 0x02, 0x03, 0x05, 0x00, 0x01, 0x03, 0x04 +_021094B8: + .byte 0x04, 0x05, 0x07, 0x08, 0x03, 0x05, 0x06, 0x08 + .byte 0x03, 0x04, 0x06, 0x07, 0x01, 0x02, 0x07, 0x08, 0x00, 0x02, 0x06, 0x08, 0x00, 0x01, 0x06, 0x07 + .byte 0x01, 0x02, 0x04, 0x05, 0x00, 0x02, 0x03, 0x05, 0x00, 0x01, 0x03, 0x04 + .public FX_SinCosTable_ +FX_SinCosTable_: ; fx16 sin/cos lookup table? there's too many of these + .short 0x0000, 0x1000 + .short 0x0006, 0x1000 + .short 0x000D, 0x1000 + .short 0x0013, 0x1000 + .short 0x0019, 0x1000 + .short 0x001F, 0x1000 + .short 0x0026, 0x1000 + .short 0x002C, 0x1000 + .short 0x0032, 0x1000 + .short 0x0039, 0x1000 + .short 0x003F, 0x1000 + .short 0x0045, 0x0FFF + .short 0x004B, 0x0FFF + .short 0x0052, 0x0FFF + .short 0x0058, 0x0FFF + .short 0x005E, 0x0FFF + .short 0x0065, 0x0FFF + .short 0x006B, 0x0FFF + .short 0x0071, 0x0FFE + .short 0x0077, 0x0FFE + .short 0x007E, 0x0FFE + .short 0x0084, 0x0FFE + .short 0x008A, 0x0FFE + .short 0x0090, 0x0FFD + .short 0x0097, 0x0FFD + .short 0x009D, 0x0FFD + .short 0x00A3, 0x0FFD + .short 0x00AA, 0x0FFC + .short 0x00B0, 0x0FFC + .short 0x00B6, 0x0FFC + .short 0x00BC, 0x0FFC + .short 0x00C3, 0x0FFB + .short 0x00C9, 0x0FFB + .short 0x00CF, 0x0FFB + .short 0x00D6, 0x0FFA + .short 0x00DC, 0x0FFA + .short 0x00E2, 0x0FFA + .short 0x00E8, 0x0FF9 + .short 0x00EF, 0x0FF9 + .short 0x00F5, 0x0FF9 + .short 0x00FB, 0x0FF8 + .short 0x0101, 0x0FF8 + .short 0x0108, 0x0FF8 + .short 0x010E, 0x0FF7 + .short 0x0114, 0x0FF7 + .short 0x011B, 0x0FF6 + .short 0x0121, 0x0FF6 + .short 0x0127, 0x0FF5 + .short 0x012D, 0x0FF5 + .short 0x0134, 0x0FF4 + .short 0x013A, 0x0FF4 + .short 0x0140, 0x0FF3 + .short 0x0146, 0x0FF3 + .short 0x014D, 0x0FF2 + .short 0x0153, 0x0FF2 + .short 0x0159, 0x0FF1 + .short 0x015F, 0x0FF1 + .short 0x0166, 0x0FF0 + .short 0x016C, 0x0FF0 + .short 0x0172, 0x0FEF + .short 0x0178, 0x0FEF + .short 0x017F, 0x0FEE + .short 0x0185, 0x0FED + .short 0x018B, 0x0FED + .short 0x0191, 0x0FEC + .short 0x0198, 0x0FEC + .short 0x019E, 0x0FEB + .short 0x01A4, 0x0FEA + .short 0x01AA, 0x0FEA + .short 0x01B1, 0x0FE9 + .short 0x01B7, 0x0FE8 + .short 0x01BD, 0x0FE8 + .short 0x01C3, 0x0FE7 + .short 0x01CA, 0x0FE6 + .short 0x01D0, 0x0FE6 + .short 0x01D6, 0x0FE5 + .short 0x01DC, 0x0FE4 + .short 0x01E3, 0x0FE3 + .short 0x01E9, 0x0FE3 + .short 0x01EF, 0x0FE2 + .short 0x01F5, 0x0FE1 + .short 0x01FC, 0x0FE0 + .short 0x0202, 0x0FE0 + .short 0x0208, 0x0FDF + .short 0x020E, 0x0FDE + .short 0x0215, 0x0FDD + .short 0x021B, 0x0FDC + .short 0x0221, 0x0FDC + .short 0x0227, 0x0FDB + .short 0x022D, 0x0FDA + .short 0x0234, 0x0FD9 + .short 0x023A, 0x0FD8 + .short 0x0240, 0x0FD7 + .short 0x0246, 0x0FD6 + .short 0x024D, 0x0FD5 + .short 0x0253, 0x0FD5 + .short 0x0259, 0x0FD4 + .short 0x025F, 0x0FD3 + .short 0x0265, 0x0FD2 + .short 0x026C, 0x0FD1 + .short 0x0272, 0x0FD0 + .short 0x0278, 0x0FCF + .short 0x027E, 0x0FCE + .short 0x0284, 0x0FCD + .short 0x028B, 0x0FCC + .short 0x0291, 0x0FCB + .short 0x0297, 0x0FCA + .short 0x029D, 0x0FC9 + .short 0x02A3, 0x0FC8 + .short 0x02AA, 0x0FC7 + .short 0x02B0, 0x0FC6 + .short 0x02B6, 0x0FC5 + .short 0x02BC, 0x0FC4 + .short 0x02C2, 0x0FC3 + .short 0x02C9, 0x0FC2 + .short 0x02CF, 0x0FC0 + .short 0x02D5, 0x0FBF + .short 0x02DB, 0x0FBE + .short 0x02E1, 0x0FBD + .short 0x02E8, 0x0FBC + .short 0x02EE, 0x0FBB + .short 0x02F4, 0x0FBA + .short 0x02FA, 0x0FB8 + .short 0x0300, 0x0FB7 + .short 0x0306, 0x0FB6 + .short 0x030D, 0x0FB5 + .short 0x0313, 0x0FB4 + .short 0x0319, 0x0FB3 + .short 0x031F, 0x0FB1 + .short 0x0325, 0x0FB0 + .short 0x032B, 0x0FAF + .short 0x0332, 0x0FAE + .short 0x0338, 0x0FAC + .short 0x033E, 0x0FAB + .short 0x0344, 0x0FAA + .short 0x034A, 0x0FA8 + .short 0x0350, 0x0FA7 + .short 0x0356, 0x0FA6 + .short 0x035D, 0x0FA5 + .short 0x0363, 0x0FA3 + .short 0x0369, 0x0FA2 + .short 0x036F, 0x0FA1 + .short 0x0375, 0x0F9F + .short 0x037B, 0x0F9E + .short 0x0381, 0x0F9C + .short 0x0388, 0x0F9B + .short 0x038E, 0x0F9A + .short 0x0394, 0x0F98 + .short 0x039A, 0x0F97 + .short 0x03A0, 0x0F95 + .short 0x03A6, 0x0F94 + .short 0x03AC, 0x0F93 + .short 0x03B2, 0x0F91 + .short 0x03B9, 0x0F90 + .short 0x03BF, 0x0F8E + .short 0x03C5, 0x0F8D + .short 0x03CB, 0x0F8B + .short 0x03D1, 0x0F8A + .short 0x03D7, 0x0F88 + .short 0x03DD, 0x0F87 + .short 0x03E3, 0x0F85 + .short 0x03E9, 0x0F84 + .short 0x03EF, 0x0F82 + .short 0x03F6, 0x0F81 + .short 0x03FC, 0x0F7F + .short 0x0402, 0x0F7D + .short 0x0408, 0x0F7C + .short 0x040E, 0x0F7A + .short 0x0414, 0x0F79 + .short 0x041A, 0x0F77 + .short 0x0420, 0x0F76 + .short 0x0426, 0x0F74 + .short 0x042C, 0x0F72 + .short 0x0432, 0x0F71 + .short 0x0438, 0x0F6F + .short 0x043E, 0x0F6D + .short 0x0444, 0x0F6C + .short 0x044B, 0x0F6A + .short 0x0451, 0x0F68 + .short 0x0457, 0x0F67 + .short 0x045D, 0x0F65 + .short 0x0463, 0x0F63 + .short 0x0469, 0x0F61 + .short 0x046F, 0x0F60 + .short 0x0475, 0x0F5E + .short 0x047B, 0x0F5C + .short 0x0481, 0x0F5A + .short 0x0487, 0x0F59 + .short 0x048D, 0x0F57 + .short 0x0493, 0x0F55 + .short 0x0499, 0x0F53 + .short 0x049F, 0x0F51 + .short 0x04A5, 0x0F50 + .short 0x04AB, 0x0F4E + .short 0x04B1, 0x0F4C + .short 0x04B7, 0x0F4A + .short 0x04BD, 0x0F48 + .short 0x04C3, 0x0F46 + .short 0x04C9, 0x0F45 + .short 0x04CF, 0x0F43 + .short 0x04D5, 0x0F41 + .short 0x04DB, 0x0F3F + .short 0x04E1, 0x0F3D + .short 0x04E7, 0x0F3B + .short 0x04ED, 0x0F39 + .short 0x04F3, 0x0F37 + .short 0x04F9, 0x0F35 + .short 0x04FF, 0x0F33 + .short 0x0505, 0x0F31 + .short 0x050B, 0x0F2F + .short 0x0511, 0x0F2D + .short 0x0517, 0x0F2B + .short 0x051D, 0x0F29 + .short 0x0523, 0x0F27 + .short 0x0529, 0x0F25 + .short 0x052F, 0x0F23 + .short 0x0534, 0x0F21 + .short 0x053A, 0x0F1F + .short 0x0540, 0x0F1D + .short 0x0546, 0x0F1B + .short 0x054C, 0x0F19 + .short 0x0552, 0x0F17 + .short 0x0558, 0x0F15 + .short 0x055E, 0x0F13 + .short 0x0564, 0x0F11 + .short 0x056A, 0x0F0E + .short 0x0570, 0x0F0C + .short 0x0576, 0x0F0A + .short 0x057C, 0x0F08 + .short 0x0581, 0x0F06 + .short 0x0587, 0x0F04 + .short 0x058D, 0x0F02 + .short 0x0593, 0x0EFF + .short 0x0599, 0x0EFD + .short 0x059F, 0x0EFB + .short 0x05A5, 0x0EF9 + .short 0x05AB, 0x0EF7 + .short 0x05B1, 0x0EF4 + .short 0x05B6, 0x0EF2 + .short 0x05BC, 0x0EF0 + .short 0x05C2, 0x0EEE + .short 0x05C8, 0x0EEB + .short 0x05CE, 0x0EE9 + .short 0x05D4, 0x0EE7 + .short 0x05DA, 0x0EE4 + .short 0x05DF, 0x0EE2 + .short 0x05E5, 0x0EE0 + .short 0x05EB, 0x0EDD + .short 0x05F1, 0x0EDB + .short 0x05F7, 0x0ED9 + .short 0x05FD, 0x0ED6 + .short 0x0602, 0x0ED4 + .short 0x0608, 0x0ED2 + .short 0x060E, 0x0ECF + .short 0x0614, 0x0ECD + .short 0x061A, 0x0ECB + .short 0x061F, 0x0EC8 + .short 0x0625, 0x0EC6 + .short 0x062B, 0x0EC3 + .short 0x0631, 0x0EC1 + .short 0x0637, 0x0EBF + .short 0x063C, 0x0EBC + .short 0x0642, 0x0EBA + .short 0x0648, 0x0EB7 + .short 0x064E, 0x0EB5 + .short 0x0654, 0x0EB2 + .short 0x0659, 0x0EB0 + .short 0x065F, 0x0EAD + .short 0x0665, 0x0EAB + .short 0x066B, 0x0EA8 + .short 0x0670, 0x0EA6 + .short 0x0676, 0x0EA3 + .short 0x067C, 0x0EA1 + .short 0x0682, 0x0E9E + .short 0x0687, 0x0E9B + .short 0x068D, 0x0E99 + .short 0x0693, 0x0E96 + .short 0x0699, 0x0E94 + .short 0x069E, 0x0E91 + .short 0x06A4, 0x0E8F + .short 0x06AA, 0x0E8C + .short 0x06AF, 0x0E89 + .short 0x06B5, 0x0E87 + .short 0x06BB, 0x0E84 + .short 0x06C1, 0x0E81 + .short 0x06C6, 0x0E7F + .short 0x06CC, 0x0E7C + .short 0x06D2, 0x0E79 + .short 0x06D7, 0x0E77 + .short 0x06DD, 0x0E74 + .short 0x06E3, 0x0E71 + .short 0x06E8, 0x0E6F + .short 0x06EE, 0x0E6C + .short 0x06F4, 0x0E69 + .short 0x06F9, 0x0E66 + .short 0x06FF, 0x0E64 + .short 0x0705, 0x0E61 + .short 0x070A, 0x0E5E + .short 0x0710, 0x0E5B + .short 0x0715, 0x0E59 + .short 0x071B, 0x0E56 + .short 0x0721, 0x0E53 + .short 0x0726, 0x0E50 + .short 0x072C, 0x0E4D + .short 0x0732, 0x0E4B + .short 0x0737, 0x0E48 + .short 0x073D, 0x0E45 + .short 0x0742, 0x0E42 + .short 0x0748, 0x0E3F + .short 0x074E, 0x0E3C + .short 0x0753, 0x0E3A + .short 0x0759, 0x0E37 + .short 0x075E, 0x0E34 + .short 0x0764, 0x0E31 + .short 0x076A, 0x0E2E + .short 0x076F, 0x0E2B + .short 0x0775, 0x0E28 + .short 0x077A, 0x0E25 + .short 0x0780, 0x0E22 + .short 0x0785, 0x0E1F + .short 0x078B, 0x0E1C + .short 0x0790, 0x0E19 + .short 0x0796, 0x0E16 + .short 0x079B, 0x0E13 + .short 0x07A1, 0x0E10 + .short 0x07A6, 0x0E0D + .short 0x07AC, 0x0E0A + .short 0x07B2, 0x0E07 + .short 0x07B7, 0x0E04 + .short 0x07BD, 0x0E01 + .short 0x07C2, 0x0DFE + .short 0x07C8, 0x0DFB + .short 0x07CD, 0x0DF8 + .short 0x07D2, 0x0DF5 + .short 0x07D8, 0x0DF2 + .short 0x07DD, 0x0DEF + .short 0x07E3, 0x0DEC + .short 0x07E8, 0x0DE9 + .short 0x07EE, 0x0DE6 + .short 0x07F3, 0x0DE3 + .short 0x07F9, 0x0DDF + .short 0x07FE, 0x0DDC + .short 0x0804, 0x0DD9 + .short 0x0809, 0x0DD6 + .short 0x080E, 0x0DD3 + .short 0x0814, 0x0DD0 + .short 0x0819, 0x0DCC + .short 0x081F, 0x0DC9 + .short 0x0824, 0x0DC6 + .short 0x082A, 0x0DC3 + .short 0x082F, 0x0DC0 + .short 0x0834, 0x0DBC + .short 0x083A, 0x0DB9 + .short 0x083F, 0x0DB6 + .short 0x0845, 0x0DB3 + .short 0x084A, 0x0DB0 + .short 0x084F, 0x0DAC + .short 0x0855, 0x0DA9 + .short 0x085A, 0x0DA6 + .short 0x085F, 0x0DA2 + .short 0x0865, 0x0D9F + .short 0x086A, 0x0D9C + .short 0x086F, 0x0D99 + .short 0x0875, 0x0D95 + .short 0x087A, 0x0D92 + .short 0x087F, 0x0D8F + .short 0x0885, 0x0D8B + .short 0x088A, 0x0D88 + .short 0x088F, 0x0D85 + .short 0x0895, 0x0D81 + .short 0x089A, 0x0D7E + .short 0x089F, 0x0D7A + .short 0x08A5, 0x0D77 + .short 0x08AA, 0x0D74 + .short 0x08AF, 0x0D70 + .short 0x08B4, 0x0D6D + .short 0x08BA, 0x0D69 + .short 0x08BF, 0x0D66 + .short 0x08C4, 0x0D62 + .short 0x08C9, 0x0D5F + .short 0x08CF, 0x0D5C + .short 0x08D4, 0x0D58 + .short 0x08D9, 0x0D55 + .short 0x08DE, 0x0D51 + .short 0x08E4, 0x0D4E + .short 0x08E9, 0x0D4A + .short 0x08EE, 0x0D47 + .short 0x08F3, 0x0D43 + .short 0x08F8, 0x0D40 + .short 0x08FE, 0x0D3C + .short 0x0903, 0x0D39 + .short 0x0908, 0x0D35 + .short 0x090D, 0x0D32 + .short 0x0912, 0x0D2E + .short 0x0918, 0x0D2A + .short 0x091D, 0x0D27 + .short 0x0922, 0x0D23 + .short 0x0927, 0x0D20 + .short 0x092C, 0x0D1C + .short 0x0931, 0x0D18 + .short 0x0937, 0x0D15 + .short 0x093C, 0x0D11 + .short 0x0941, 0x0D0E + .short 0x0946, 0x0D0A + .short 0x094B, 0x0D06 + .short 0x0950, 0x0D03 + .short 0x0955, 0x0CFF + .short 0x095A, 0x0CFB + .short 0x095F, 0x0CF8 + .short 0x0965, 0x0CF4 + .short 0x096A, 0x0CF0 + .short 0x096F, 0x0CED + .short 0x0974, 0x0CE9 + .short 0x0979, 0x0CE5 + .short 0x097E, 0x0CE1 + .short 0x0983, 0x0CDE + .short 0x0988, 0x0CDA + .short 0x098D, 0x0CD6 + .short 0x0992, 0x0CD2 + .short 0x0997, 0x0CCF + .short 0x099C, 0x0CCB + .short 0x09A1, 0x0CC7 + .short 0x09A6, 0x0CC3 + .short 0x09AB, 0x0CC0 + .short 0x09B0, 0x0CBC + .short 0x09B5, 0x0CB8 + .short 0x09BA, 0x0CB4 + .short 0x09BF, 0x0CB0 + .short 0x09C4, 0x0CAC + .short 0x09C9, 0x0CA9 + .short 0x09CE, 0x0CA5 + .short 0x09D3, 0x0CA1 + .short 0x09D8, 0x0C9D + .short 0x09DD, 0x0C99 + .short 0x09E2, 0x0C95 + .short 0x09E7, 0x0C91 + .short 0x09EC, 0x0C8E + .short 0x09F1, 0x0C8A + .short 0x09F6, 0x0C86 + .short 0x09FB, 0x0C82 + .short 0x09FF, 0x0C7E + .short 0x0A04, 0x0C7A + .short 0x0A09, 0x0C76 + .short 0x0A0E, 0x0C72 + .short 0x0A13, 0x0C6E + .short 0x0A18, 0x0C6A + .short 0x0A1D, 0x0C66 + .short 0x0A22, 0x0C62 + .short 0x0A26, 0x0C5E + .short 0x0A2B, 0x0C5A + .short 0x0A30, 0x0C56 + .short 0x0A35, 0x0C52 + .short 0x0A3A, 0x0C4E + .short 0x0A3F, 0x0C4A + .short 0x0A44, 0x0C46 + .short 0x0A48, 0x0C42 + .short 0x0A4D, 0x0C3E + .short 0x0A52, 0x0C3A + .short 0x0A57, 0x0C36 + .short 0x0A5C, 0x0C32 + .short 0x0A60, 0x0C2E + .short 0x0A65, 0x0C2A + .short 0x0A6A, 0x0C26 + .short 0x0A6F, 0x0C22 + .short 0x0A73, 0x0C1E + .short 0x0A78, 0x0C19 + .short 0x0A7D, 0x0C15 + .short 0x0A82, 0x0C11 + .short 0x0A86, 0x0C0D + .short 0x0A8B, 0x0C09 + .short 0x0A90, 0x0C05 + .short 0x0A95, 0x0C01 + .short 0x0A99, 0x0BFC + .short 0x0A9E, 0x0BF8 + .short 0x0AA3, 0x0BF4 + .short 0x0AA7, 0x0BF0 + .short 0x0AAC, 0x0BEC + .short 0x0AB1, 0x0BE8 + .short 0x0AB5, 0x0BE3 + .short 0x0ABA, 0x0BDF + .short 0x0ABF, 0x0BDB + .short 0x0AC3, 0x0BD7 + .short 0x0AC8, 0x0BD2 + .short 0x0ACD, 0x0BCE + .short 0x0AD1, 0x0BCA + .short 0x0AD6, 0x0BC6 + .short 0x0ADB, 0x0BC1 + .short 0x0ADF, 0x0BBD + .short 0x0AE4, 0x0BB9 + .short 0x0AE8, 0x0BB5 + .short 0x0AED, 0x0BB0 + .short 0x0AF2, 0x0BAC + .short 0x0AF6, 0x0BA8 + .short 0x0AFB, 0x0BA3 + .short 0x0AFF, 0x0B9F + .short 0x0B04, 0x0B9B + .short 0x0B08, 0x0B97 + .short 0x0B0D, 0x0B92 + .short 0x0B11, 0x0B8E + .short 0x0B16, 0x0B89 + .short 0x0B1B, 0x0B85 + .short 0x0B1F, 0x0B81 + .short 0x0B24, 0x0B7C + .short 0x0B28, 0x0B78 + .short 0x0B2D, 0x0B74 + .short 0x0B31, 0x0B6F + .short 0x0B36, 0x0B6B + .short 0x0B3A, 0x0B66 + .short 0x0B3E, 0x0B62 + .short 0x0B43, 0x0B5E + .short 0x0B47, 0x0B59 + .short 0x0B4C, 0x0B55 + .short 0x0B50, 0x0B50 + .short 0x0B55, 0x0B4C + .short 0x0B59, 0x0B47 + .short 0x0B5E, 0x0B43 + .short 0x0B62, 0x0B3E + .short 0x0B66, 0x0B3A + .short 0x0B6B, 0x0B36 + .short 0x0B6F, 0x0B31 + .short 0x0B74, 0x0B2D + .short 0x0B78, 0x0B28 + .short 0x0B7C, 0x0B24 + .short 0x0B81, 0x0B1F + .short 0x0B85, 0x0B1B + .short 0x0B89, 0x0B16 + .short 0x0B8E, 0x0B11 + .short 0x0B92, 0x0B0D + .short 0x0B97, 0x0B08 + .short 0x0B9B, 0x0B04 + .short 0x0B9F, 0x0AFF + .short 0x0BA3, 0x0AFB + .short 0x0BA8, 0x0AF6 + .short 0x0BAC, 0x0AF2 + .short 0x0BB0, 0x0AED + .short 0x0BB5, 0x0AE8 + .short 0x0BB9, 0x0AE4 + .short 0x0BBD, 0x0ADF + .short 0x0BC1, 0x0ADB + .short 0x0BC6, 0x0AD6 + .short 0x0BCA, 0x0AD1 + .short 0x0BCE, 0x0ACD + .short 0x0BD2, 0x0AC8 + .short 0x0BD7, 0x0AC3 + .short 0x0BDB, 0x0ABF + .short 0x0BDF, 0x0ABA + .short 0x0BE3, 0x0AB5 + .short 0x0BE8, 0x0AB1 + .short 0x0BEC, 0x0AAC + .short 0x0BF0, 0x0AA7 + .short 0x0BF4, 0x0AA3 + .short 0x0BF8, 0x0A9E + .short 0x0BFC, 0x0A99 + .short 0x0C01, 0x0A95 + .short 0x0C05, 0x0A90 + .short 0x0C09, 0x0A8B + .short 0x0C0D, 0x0A86 + .short 0x0C11, 0x0A82 + .short 0x0C15, 0x0A7D + .short 0x0C19, 0x0A78 + .short 0x0C1E, 0x0A73 + .short 0x0C22, 0x0A6F + .short 0x0C26, 0x0A6A + .short 0x0C2A, 0x0A65 + .short 0x0C2E, 0x0A60 + .short 0x0C32, 0x0A5C + .short 0x0C36, 0x0A57 + .short 0x0C3A, 0x0A52 + .short 0x0C3E, 0x0A4D + .short 0x0C42, 0x0A48 + .short 0x0C46, 0x0A44 + .short 0x0C4A, 0x0A3F + .short 0x0C4E, 0x0A3A + .short 0x0C52, 0x0A35 + .short 0x0C56, 0x0A30 + .short 0x0C5A, 0x0A2B + .short 0x0C5E, 0x0A26 + .short 0x0C62, 0x0A22 + .short 0x0C66, 0x0A1D + .short 0x0C6A, 0x0A18 + .short 0x0C6E, 0x0A13 + .short 0x0C72, 0x0A0E + .short 0x0C76, 0x0A09 + .short 0x0C7A, 0x0A04 + .short 0x0C7E, 0x09FF + .short 0x0C82, 0x09FB + .short 0x0C86, 0x09F6 + .short 0x0C8A, 0x09F1 + .short 0x0C8E, 0x09EC + .short 0x0C91, 0x09E7 + .short 0x0C95, 0x09E2 + .short 0x0C99, 0x09DD + .short 0x0C9D, 0x09D8 + .short 0x0CA1, 0x09D3 + .short 0x0CA5, 0x09CE + .short 0x0CA9, 0x09C9 + .short 0x0CAC, 0x09C4 + .short 0x0CB0, 0x09BF + .short 0x0CB4, 0x09BA + .short 0x0CB8, 0x09B5 + .short 0x0CBC, 0x09B0 + .short 0x0CC0, 0x09AB + .short 0x0CC3, 0x09A6 + .short 0x0CC7, 0x09A1 + .short 0x0CCB, 0x099C + .short 0x0CCF, 0x0997 + .short 0x0CD2, 0x0992 + .short 0x0CD6, 0x098D + .short 0x0CDA, 0x0988 + .short 0x0CDE, 0x0983 + .short 0x0CE1, 0x097E + .short 0x0CE5, 0x0979 + .short 0x0CE9, 0x0974 + .short 0x0CED, 0x096F + .short 0x0CF0, 0x096A + .short 0x0CF4, 0x0965 + .short 0x0CF8, 0x095F + .short 0x0CFB, 0x095A + .short 0x0CFF, 0x0955 + .short 0x0D03, 0x0950 + .short 0x0D06, 0x094B + .short 0x0D0A, 0x0946 + .short 0x0D0E, 0x0941 + .short 0x0D11, 0x093C + .short 0x0D15, 0x0937 + .short 0x0D18, 0x0931 + .short 0x0D1C, 0x092C + .short 0x0D20, 0x0927 + .short 0x0D23, 0x0922 + .short 0x0D27, 0x091D + .short 0x0D2A, 0x0918 + .short 0x0D2E, 0x0912 + .short 0x0D32, 0x090D + .short 0x0D35, 0x0908 + .short 0x0D39, 0x0903 + .short 0x0D3C, 0x08FE + .short 0x0D40, 0x08F8 + .short 0x0D43, 0x08F3 + .short 0x0D47, 0x08EE + .short 0x0D4A, 0x08E9 + .short 0x0D4E, 0x08E4 + .short 0x0D51, 0x08DE + .short 0x0D55, 0x08D9 + .short 0x0D58, 0x08D4 + .short 0x0D5C, 0x08CF + .short 0x0D5F, 0x08C9 + .short 0x0D62, 0x08C4 + .short 0x0D66, 0x08BF + .short 0x0D69, 0x08BA + .short 0x0D6D, 0x08B4 + .short 0x0D70, 0x08AF + .short 0x0D74, 0x08AA + .short 0x0D77, 0x08A5 + .short 0x0D7A, 0x089F + .short 0x0D7E, 0x089A + .short 0x0D81, 0x0895 + .short 0x0D85, 0x088F + .short 0x0D88, 0x088A + .short 0x0D8B, 0x0885 + .short 0x0D8F, 0x087F + .short 0x0D92, 0x087A + .short 0x0D95, 0x0875 + .short 0x0D99, 0x086F + .short 0x0D9C, 0x086A + .short 0x0D9F, 0x0865 + .short 0x0DA2, 0x085F + .short 0x0DA6, 0x085A + .short 0x0DA9, 0x0855 + .short 0x0DAC, 0x084F + .short 0x0DB0, 0x084A + .short 0x0DB3, 0x0845 + .short 0x0DB6, 0x083F + .short 0x0DB9, 0x083A + .short 0x0DBC, 0x0834 + .short 0x0DC0, 0x082F + .short 0x0DC3, 0x082A + .short 0x0DC6, 0x0824 + .short 0x0DC9, 0x081F + .short 0x0DCC, 0x0819 + .short 0x0DD0, 0x0814 + .short 0x0DD3, 0x080E + .short 0x0DD6, 0x0809 + .short 0x0DD9, 0x0804 + .short 0x0DDC, 0x07FE + .short 0x0DDF, 0x07F9 + .short 0x0DE3, 0x07F3 + .short 0x0DE6, 0x07EE + .short 0x0DE9, 0x07E8 + .short 0x0DEC, 0x07E3 + .short 0x0DEF, 0x07DD + .short 0x0DF2, 0x07D8 + .short 0x0DF5, 0x07D2 + .short 0x0DF8, 0x07CD + .short 0x0DFB, 0x07C8 + .short 0x0DFE, 0x07C2 + .short 0x0E01, 0x07BD + .short 0x0E04, 0x07B7 + .short 0x0E07, 0x07B2 + .short 0x0E0A, 0x07AC + .short 0x0E0D, 0x07A6 + .short 0x0E10, 0x07A1 + .short 0x0E13, 0x079B + .short 0x0E16, 0x0796 + .short 0x0E19, 0x0790 + .short 0x0E1C, 0x078B + .short 0x0E1F, 0x0785 + .short 0x0E22, 0x0780 + .short 0x0E25, 0x077A + .short 0x0E28, 0x0775 + .short 0x0E2B, 0x076F + .short 0x0E2E, 0x076A + .short 0x0E31, 0x0764 + .short 0x0E34, 0x075E + .short 0x0E37, 0x0759 + .short 0x0E3A, 0x0753 + .short 0x0E3C, 0x074E + .short 0x0E3F, 0x0748 + .short 0x0E42, 0x0742 + .short 0x0E45, 0x073D + .short 0x0E48, 0x0737 + .short 0x0E4B, 0x0732 + .short 0x0E4D, 0x072C + .short 0x0E50, 0x0726 + .short 0x0E53, 0x0721 + .short 0x0E56, 0x071B + .short 0x0E59, 0x0715 + .short 0x0E5B, 0x0710 + .short 0x0E5E, 0x070A + .short 0x0E61, 0x0705 + .short 0x0E64, 0x06FF + .short 0x0E66, 0x06F9 + .short 0x0E69, 0x06F4 + .short 0x0E6C, 0x06EE + .short 0x0E6F, 0x06E8 + .short 0x0E71, 0x06E3 + .short 0x0E74, 0x06DD + .short 0x0E77, 0x06D7 + .short 0x0E79, 0x06D2 + .short 0x0E7C, 0x06CC + .short 0x0E7F, 0x06C6 + .short 0x0E81, 0x06C1 + .short 0x0E84, 0x06BB + .short 0x0E87, 0x06B5 + .short 0x0E89, 0x06AF + .short 0x0E8C, 0x06AA + .short 0x0E8F, 0x06A4 + .short 0x0E91, 0x069E + .short 0x0E94, 0x0699 + .short 0x0E96, 0x0693 + .short 0x0E99, 0x068D + .short 0x0E9B, 0x0687 + .short 0x0E9E, 0x0682 + .short 0x0EA1, 0x067C + .short 0x0EA3, 0x0676 + .short 0x0EA6, 0x0670 + .short 0x0EA8, 0x066B + .short 0x0EAB, 0x0665 + .short 0x0EAD, 0x065F + .short 0x0EB0, 0x0659 + .short 0x0EB2, 0x0654 + .short 0x0EB5, 0x064E + .short 0x0EB7, 0x0648 + .short 0x0EBA, 0x0642 + .short 0x0EBC, 0x063C + .short 0x0EBF, 0x0637 + .short 0x0EC1, 0x0631 + .short 0x0EC3, 0x062B + .short 0x0EC6, 0x0625 + .short 0x0EC8, 0x061F + .short 0x0ECB, 0x061A + .short 0x0ECD, 0x0614 + .short 0x0ECF, 0x060E + .short 0x0ED2, 0x0608 + .short 0x0ED4, 0x0602 + .short 0x0ED6, 0x05FD + .short 0x0ED9, 0x05F7 + .short 0x0EDB, 0x05F1 + .short 0x0EDD, 0x05EB + .short 0x0EE0, 0x05E5 + .short 0x0EE2, 0x05DF + .short 0x0EE4, 0x05DA + .short 0x0EE7, 0x05D4 + .short 0x0EE9, 0x05CE + .short 0x0EEB, 0x05C8 + .short 0x0EEE, 0x05C2 + .short 0x0EF0, 0x05BC + .short 0x0EF2, 0x05B6 + .short 0x0EF4, 0x05B1 + .short 0x0EF7, 0x05AB + .short 0x0EF9, 0x05A5 + .short 0x0EFB, 0x059F + .short 0x0EFD, 0x0599 + .short 0x0EFF, 0x0593 + .short 0x0F02, 0x058D + .short 0x0F04, 0x0587 + .short 0x0F06, 0x0581 + .short 0x0F08, 0x057C + .short 0x0F0A, 0x0576 + .short 0x0F0C, 0x0570 + .short 0x0F0E, 0x056A + .short 0x0F11, 0x0564 + .short 0x0F13, 0x055E + .short 0x0F15, 0x0558 + .short 0x0F17, 0x0552 + .short 0x0F19, 0x054C + .short 0x0F1B, 0x0546 + .short 0x0F1D, 0x0540 + .short 0x0F1F, 0x053A + .short 0x0F21, 0x0534 + .short 0x0F23, 0x052F + .short 0x0F25, 0x0529 + .short 0x0F27, 0x0523 + .short 0x0F29, 0x051D + .short 0x0F2B, 0x0517 + .short 0x0F2D, 0x0511 + .short 0x0F2F, 0x050B + .short 0x0F31, 0x0505 + .short 0x0F33, 0x04FF + .short 0x0F35, 0x04F9 + .short 0x0F37, 0x04F3 + .short 0x0F39, 0x04ED + .short 0x0F3B, 0x04E7 + .short 0x0F3D, 0x04E1 + .short 0x0F3F, 0x04DB + .short 0x0F41, 0x04D5 + .short 0x0F43, 0x04CF + .short 0x0F45, 0x04C9 + .short 0x0F46, 0x04C3 + .short 0x0F48, 0x04BD + .short 0x0F4A, 0x04B7 + .short 0x0F4C, 0x04B1 + .short 0x0F4E, 0x04AB + .short 0x0F50, 0x04A5 + .short 0x0F51, 0x049F + .short 0x0F53, 0x0499 + .short 0x0F55, 0x0493 + .short 0x0F57, 0x048D + .short 0x0F59, 0x0487 + .short 0x0F5A, 0x0481 + .short 0x0F5C, 0x047B + .short 0x0F5E, 0x0475 + .short 0x0F60, 0x046F + .short 0x0F61, 0x0469 + .short 0x0F63, 0x0463 + .short 0x0F65, 0x045D + .short 0x0F67, 0x0457 + .short 0x0F68, 0x0451 + .short 0x0F6A, 0x044B + .short 0x0F6C, 0x0444 + .short 0x0F6D, 0x043E + .short 0x0F6F, 0x0438 + .short 0x0F71, 0x0432 + .short 0x0F72, 0x042C + .short 0x0F74, 0x0426 + .short 0x0F76, 0x0420 + .short 0x0F77, 0x041A + .short 0x0F79, 0x0414 + .short 0x0F7A, 0x040E + .short 0x0F7C, 0x0408 + .short 0x0F7D, 0x0402 + .short 0x0F7F, 0x03FC + .short 0x0F81, 0x03F6 + .short 0x0F82, 0x03EF + .short 0x0F84, 0x03E9 + .short 0x0F85, 0x03E3 + .short 0x0F87, 0x03DD + .short 0x0F88, 0x03D7 + .short 0x0F8A, 0x03D1 + .short 0x0F8B, 0x03CB + .short 0x0F8D, 0x03C5 + .short 0x0F8E, 0x03BF + .short 0x0F90, 0x03B9 + .short 0x0F91, 0x03B2 + .short 0x0F93, 0x03AC + .short 0x0F94, 0x03A6 + .short 0x0F95, 0x03A0 + .short 0x0F97, 0x039A + .short 0x0F98, 0x0394 + .short 0x0F9A, 0x038E + .short 0x0F9B, 0x0388 + .short 0x0F9C, 0x0381 + .short 0x0F9E, 0x037B + .short 0x0F9F, 0x0375 + .short 0x0FA1, 0x036F + .short 0x0FA2, 0x0369 + .short 0x0FA3, 0x0363 + .short 0x0FA5, 0x035D + .short 0x0FA6, 0x0356 + .short 0x0FA7, 0x0350 + .short 0x0FA8, 0x034A + .short 0x0FAA, 0x0344 + .short 0x0FAB, 0x033E + .short 0x0FAC, 0x0338 + .short 0x0FAE, 0x0332 + .short 0x0FAF, 0x032B + .short 0x0FB0, 0x0325 + .short 0x0FB1, 0x031F + .short 0x0FB3, 0x0319 + .short 0x0FB4, 0x0313 + .short 0x0FB5, 0x030D + .short 0x0FB6, 0x0306 + .short 0x0FB7, 0x0300 + .short 0x0FB8, 0x02FA + .short 0x0FBA, 0x02F4 + .short 0x0FBB, 0x02EE + .short 0x0FBC, 0x02E8 + .short 0x0FBD, 0x02E1 + .short 0x0FBE, 0x02DB + .short 0x0FBF, 0x02D5 + .short 0x0FC0, 0x02CF + .short 0x0FC2, 0x02C9 + .short 0x0FC3, 0x02C2 + .short 0x0FC4, 0x02BC + .short 0x0FC5, 0x02B6 + .short 0x0FC6, 0x02B0 + .short 0x0FC7, 0x02AA + .short 0x0FC8, 0x02A3 + .short 0x0FC9, 0x029D + .short 0x0FCA, 0x0297 + .short 0x0FCB, 0x0291 + .short 0x0FCC, 0x028B + .short 0x0FCD, 0x0284 + .short 0x0FCE, 0x027E + .short 0x0FCF, 0x0278 + .short 0x0FD0, 0x0272 + .short 0x0FD1, 0x026C + .short 0x0FD2, 0x0265 + .short 0x0FD3, 0x025F + .short 0x0FD4, 0x0259 + .short 0x0FD5, 0x0253 + .short 0x0FD5, 0x024D + .short 0x0FD6, 0x0246 + .short 0x0FD7, 0x0240 + .short 0x0FD8, 0x023A + .short 0x0FD9, 0x0234 + .short 0x0FDA, 0x022D + .short 0x0FDB, 0x0227 + .short 0x0FDC, 0x0221 + .short 0x0FDC, 0x021B + .short 0x0FDD, 0x0215 + .short 0x0FDE, 0x020E + .short 0x0FDF, 0x0208 + .short 0x0FE0, 0x0202 + .short 0x0FE0, 0x01FC + .short 0x0FE1, 0x01F5 + .short 0x0FE2, 0x01EF + .short 0x0FE3, 0x01E9 + .short 0x0FE3, 0x01E3 + .short 0x0FE4, 0x01DC + .short 0x0FE5, 0x01D6 + .short 0x0FE6, 0x01D0 + .short 0x0FE6, 0x01CA + .short 0x0FE7, 0x01C3 + .short 0x0FE8, 0x01BD + .short 0x0FE8, 0x01B7 + .short 0x0FE9, 0x01B1 + .short 0x0FEA, 0x01AA + .short 0x0FEA, 0x01A4 + .short 0x0FEB, 0x019E + .short 0x0FEC, 0x0198 + .short 0x0FEC, 0x0191 + .short 0x0FED, 0x018B + .short 0x0FED, 0x0185 + .short 0x0FEE, 0x017F + .short 0x0FEF, 0x0178 + .short 0x0FEF, 0x0172 + .short 0x0FF0, 0x016C + .short 0x0FF0, 0x0166 + .short 0x0FF1, 0x015F + .short 0x0FF1, 0x0159 + .short 0x0FF2, 0x0153 + .short 0x0FF2, 0x014D + .short 0x0FF3, 0x0146 + .short 0x0FF3, 0x0140 + .short 0x0FF4, 0x013A + .short 0x0FF4, 0x0134 + .short 0x0FF5, 0x012D + .short 0x0FF5, 0x0127 + .short 0x0FF6, 0x0121 + .short 0x0FF6, 0x011B + .short 0x0FF7, 0x0114 + .short 0x0FF7, 0x010E + .short 0x0FF8, 0x0108 + .short 0x0FF8, 0x0101 + .short 0x0FF8, 0x00FB + .short 0x0FF9, 0x00F5 + .short 0x0FF9, 0x00EF + .short 0x0FF9, 0x00E8 + .short 0x0FFA, 0x00E2 + .short 0x0FFA, 0x00DC + .short 0x0FFA, 0x00D6 + .short 0x0FFB, 0x00CF + .short 0x0FFB, 0x00C9 + .short 0x0FFB, 0x00C3 + .short 0x0FFC, 0x00BC + .short 0x0FFC, 0x00B6 + .short 0x0FFC, 0x00B0 + .short 0x0FFC, 0x00AA + .short 0x0FFD, 0x00A3 + .short 0x0FFD, 0x009D + .short 0x0FFD, 0x0097 + .short 0x0FFD, 0x0090 + .short 0x0FFE, 0x008A + .short 0x0FFE, 0x0084 + .short 0x0FFE, 0x007E + .short 0x0FFE, 0x0077 + .short 0x0FFE, 0x0071 + .short 0x0FFF, 0x006B + .short 0x0FFF, 0x0065 + .short 0x0FFF, 0x005E + .short 0x0FFF, 0x0058 + .short 0x0FFF, 0x0052 + .short 0x0FFF, 0x004B + .short 0x0FFF, 0x0045 + .short 0x1000, 0x003F + .short 0x1000, 0x0039 + .short 0x1000, 0x0032 + .short 0x1000, 0x002C + .short 0x1000, 0x0026 + .short 0x1000, 0x001F + .short 0x1000, 0x0019 + .short 0x1000, 0x0013 + .short 0x1000, 0x000D + .short 0x1000, 0x0006 + .short 0x1000, 0x0000 + .short 0x1000, 0xFFFA + .short 0x1000, 0xFFF3 + .short 0x1000, 0xFFED + .short 0x1000, 0xFFE7 + .short 0x1000, 0xFFE1 + .short 0x1000, 0xFFDA + .short 0x1000, 0xFFD4 + .short 0x1000, 0xFFCE + .short 0x1000, 0xFFC7 + .short 0x1000, 0xFFC1 + .short 0x0FFF, 0xFFBB + .short 0x0FFF, 0xFFB5 + .short 0x0FFF, 0xFFAE + .short 0x0FFF, 0xFFA8 + .short 0x0FFF, 0xFFA2 + .short 0x0FFF, 0xFF9B + .short 0x0FFF, 0xFF95 + .short 0x0FFE, 0xFF8F + .short 0x0FFE, 0xFF89 + .short 0x0FFE, 0xFF82 + .short 0x0FFE, 0xFF7C + .short 0x0FFE, 0xFF76 + .short 0x0FFD, 0xFF70 + .short 0x0FFD, 0xFF69 + .short 0x0FFD, 0xFF63 + .short 0x0FFD, 0xFF5D + .short 0x0FFC, 0xFF56 + .short 0x0FFC, 0xFF50 + .short 0x0FFC, 0xFF4A + .short 0x0FFC, 0xFF44 + .short 0x0FFB, 0xFF3D + .short 0x0FFB, 0xFF37 + .short 0x0FFB, 0xFF31 + .short 0x0FFA, 0xFF2A + .short 0x0FFA, 0xFF24 + .short 0x0FFA, 0xFF1E + .short 0x0FF9, 0xFF18 + .short 0x0FF9, 0xFF11 + .short 0x0FF9, 0xFF0B + .short 0x0FF8, 0xFF05 + .short 0x0FF8, 0xFEFF + .short 0x0FF8, 0xFEF8 + .short 0x0FF7, 0xFEF2 + .short 0x0FF7, 0xFEEC + .short 0x0FF6, 0xFEE5 + .short 0x0FF6, 0xFEDF + .short 0x0FF5, 0xFED9 + .short 0x0FF5, 0xFED3 + .short 0x0FF4, 0xFECC + .short 0x0FF4, 0xFEC6 + .short 0x0FF3, 0xFEC0 + .short 0x0FF3, 0xFEBA + .short 0x0FF2, 0xFEB3 + .short 0x0FF2, 0xFEAD + .short 0x0FF1, 0xFEA7 + .short 0x0FF1, 0xFEA1 + .short 0x0FF0, 0xFE9A + .short 0x0FF0, 0xFE94 + .short 0x0FEF, 0xFE8E + .short 0x0FEF, 0xFE88 + .short 0x0FEE, 0xFE81 + .short 0x0FED, 0xFE7B + .short 0x0FED, 0xFE75 + .short 0x0FEC, 0xFE6F + .short 0x0FEC, 0xFE68 + .short 0x0FEB, 0xFE62 + .short 0x0FEA, 0xFE5C + .short 0x0FEA, 0xFE56 + .short 0x0FE9, 0xFE4F + .short 0x0FE8, 0xFE49 + .short 0x0FE8, 0xFE43 + .short 0x0FE7, 0xFE3D + .short 0x0FE6, 0xFE36 + .short 0x0FE6, 0xFE30 + .short 0x0FE5, 0xFE2A + .short 0x0FE4, 0xFE24 + .short 0x0FE3, 0xFE1D + .short 0x0FE3, 0xFE17 + .short 0x0FE2, 0xFE11 + .short 0x0FE1, 0xFE0B + .short 0x0FE0, 0xFE04 + .short 0x0FE0, 0xFDFE + .short 0x0FDF, 0xFDF8 + .short 0x0FDE, 0xFDF2 + .short 0x0FDD, 0xFDEB + .short 0x0FDC, 0xFDE5 + .short 0x0FDC, 0xFDDF + .short 0x0FDB, 0xFDD9 + .short 0x0FDA, 0xFDD3 + .short 0x0FD9, 0xFDCC + .short 0x0FD8, 0xFDC6 + .short 0x0FD7, 0xFDC0 + .short 0x0FD6, 0xFDBA + .short 0x0FD5, 0xFDB3 + .short 0x0FD5, 0xFDAD + .short 0x0FD4, 0xFDA7 + .short 0x0FD3, 0xFDA1 + .short 0x0FD2, 0xFD9B + .short 0x0FD1, 0xFD94 + .short 0x0FD0, 0xFD8E + .short 0x0FCF, 0xFD88 + .short 0x0FCE, 0xFD82 + .short 0x0FCD, 0xFD7C + .short 0x0FCC, 0xFD75 + .short 0x0FCB, 0xFD6F + .short 0x0FCA, 0xFD69 + .short 0x0FC9, 0xFD63 + .short 0x0FC8, 0xFD5D + .short 0x0FC7, 0xFD56 + .short 0x0FC6, 0xFD50 + .short 0x0FC5, 0xFD4A + .short 0x0FC4, 0xFD44 + .short 0x0FC3, 0xFD3E + .short 0x0FC2, 0xFD37 + .short 0x0FC0, 0xFD31 + .short 0x0FBF, 0xFD2B + .short 0x0FBE, 0xFD25 + .short 0x0FBD, 0xFD1F + .short 0x0FBC, 0xFD18 + .short 0x0FBB, 0xFD12 + .short 0x0FBA, 0xFD0C + .short 0x0FB8, 0xFD06 + .short 0x0FB7, 0xFD00 + .short 0x0FB6, 0xFCFA + .short 0x0FB5, 0xFCF3 + .short 0x0FB4, 0xFCED + .short 0x0FB3, 0xFCE7 + .short 0x0FB1, 0xFCE1 + .short 0x0FB0, 0xFCDB + .short 0x0FAF, 0xFCD5 + .short 0x0FAE, 0xFCCE + .short 0x0FAC, 0xFCC8 + .short 0x0FAB, 0xFCC2 + .short 0x0FAA, 0xFCBC + .short 0x0FA8, 0xFCB6 + .short 0x0FA7, 0xFCB0 + .short 0x0FA6, 0xFCAA + .short 0x0FA5, 0xFCA3 + .short 0x0FA3, 0xFC9D + .short 0x0FA2, 0xFC97 + .short 0x0FA1, 0xFC91 + .short 0x0F9F, 0xFC8B + .short 0x0F9E, 0xFC85 + .short 0x0F9C, 0xFC7F + .short 0x0F9B, 0xFC78 + .short 0x0F9A, 0xFC72 + .short 0x0F98, 0xFC6C + .short 0x0F97, 0xFC66 + .short 0x0F95, 0xFC60 + .short 0x0F94, 0xFC5A + .short 0x0F93, 0xFC54 + .short 0x0F91, 0xFC4E + .short 0x0F90, 0xFC47 + .short 0x0F8E, 0xFC41 + .short 0x0F8D, 0xFC3B + .short 0x0F8B, 0xFC35 + .short 0x0F8A, 0xFC2F + .short 0x0F88, 0xFC29 + .short 0x0F87, 0xFC23 + .short 0x0F85, 0xFC1D + .short 0x0F84, 0xFC17 + .short 0x0F82, 0xFC11 + .short 0x0F81, 0xFC0A + .short 0x0F7F, 0xFC04 + .short 0x0F7D, 0xFBFE + .short 0x0F7C, 0xFBF8 + .short 0x0F7A, 0xFBF2 + .short 0x0F79, 0xFBEC + .short 0x0F77, 0xFBE6 + .short 0x0F76, 0xFBE0 + .short 0x0F74, 0xFBDA + .short 0x0F72, 0xFBD4 + .short 0x0F71, 0xFBCE + .short 0x0F6F, 0xFBC8 + .short 0x0F6D, 0xFBC2 + .short 0x0F6C, 0xFBBC + .short 0x0F6A, 0xFBB5 + .short 0x0F68, 0xFBAF + .short 0x0F67, 0xFBA9 + .short 0x0F65, 0xFBA3 + .short 0x0F63, 0xFB9D + .short 0x0F61, 0xFB97 + .short 0x0F60, 0xFB91 + .short 0x0F5E, 0xFB8B + .short 0x0F5C, 0xFB85 + .short 0x0F5A, 0xFB7F + .short 0x0F59, 0xFB79 + .short 0x0F57, 0xFB73 + .short 0x0F55, 0xFB6D + .short 0x0F53, 0xFB67 + .short 0x0F51, 0xFB61 + .short 0x0F50, 0xFB5B + .short 0x0F4E, 0xFB55 + .short 0x0F4C, 0xFB4F + .short 0x0F4A, 0xFB49 + .short 0x0F48, 0xFB43 + .short 0x0F46, 0xFB3D + .short 0x0F45, 0xFB37 + .short 0x0F43, 0xFB31 + .short 0x0F41, 0xFB2B + .short 0x0F3F, 0xFB25 + .short 0x0F3D, 0xFB1F + .short 0x0F3B, 0xFB19 + .short 0x0F39, 0xFB13 + .short 0x0F37, 0xFB0D + .short 0x0F35, 0xFB07 + .short 0x0F33, 0xFB01 + .short 0x0F31, 0xFAFB + .short 0x0F2F, 0xFAF5 + .short 0x0F2D, 0xFAEF + .short 0x0F2B, 0xFAE9 + .short 0x0F29, 0xFAE3 + .short 0x0F27, 0xFADD + .short 0x0F25, 0xFAD7 + .short 0x0F23, 0xFAD1 + .short 0x0F21, 0xFACC + .short 0x0F1F, 0xFAC6 + .short 0x0F1D, 0xFAC0 + .short 0x0F1B, 0xFABA + .short 0x0F19, 0xFAB4 + .short 0x0F17, 0xFAAE + .short 0x0F15, 0xFAA8 + .short 0x0F13, 0xFAA2 + .short 0x0F11, 0xFA9C + .short 0x0F0E, 0xFA96 + .short 0x0F0C, 0xFA90 + .short 0x0F0A, 0xFA8A + .short 0x0F08, 0xFA84 + .short 0x0F06, 0xFA7F + .short 0x0F04, 0xFA79 + .short 0x0F02, 0xFA73 + .short 0x0EFF, 0xFA6D + .short 0x0EFD, 0xFA67 + .short 0x0EFB, 0xFA61 + .short 0x0EF9, 0xFA5B + .short 0x0EF7, 0xFA55 + .short 0x0EF4, 0xFA4F + .short 0x0EF2, 0xFA4A + .short 0x0EF0, 0xFA44 + .short 0x0EEE, 0xFA3E + .short 0x0EEB, 0xFA38 + .short 0x0EE9, 0xFA32 + .short 0x0EE7, 0xFA2C + .short 0x0EE4, 0xFA26 + .short 0x0EE2, 0xFA21 + .short 0x0EE0, 0xFA1B + .short 0x0EDD, 0xFA15 + .short 0x0EDB, 0xFA0F + .short 0x0ED9, 0xFA09 + .short 0x0ED6, 0xFA03 + .short 0x0ED4, 0xF9FE + .short 0x0ED2, 0xF9F8 + .short 0x0ECF, 0xF9F2 + .short 0x0ECD, 0xF9EC + .short 0x0ECB, 0xF9E6 + .short 0x0EC8, 0xF9E1 + .short 0x0EC6, 0xF9DB + .short 0x0EC3, 0xF9D5 + .short 0x0EC1, 0xF9CF + .short 0x0EBF, 0xF9C9 + .short 0x0EBC, 0xF9C4 + .short 0x0EBA, 0xF9BE + .short 0x0EB7, 0xF9B8 + .short 0x0EB5, 0xF9B2 + .short 0x0EB2, 0xF9AC + .short 0x0EB0, 0xF9A7 + .short 0x0EAD, 0xF9A1 + .short 0x0EAB, 0xF99B + .short 0x0EA8, 0xF995 + .short 0x0EA6, 0xF990 + .short 0x0EA3, 0xF98A + .short 0x0EA1, 0xF984 + .short 0x0E9E, 0xF97E + .short 0x0E9B, 0xF979 + .short 0x0E99, 0xF973 + .short 0x0E96, 0xF96D + .short 0x0E94, 0xF967 + .short 0x0E91, 0xF962 + .short 0x0E8F, 0xF95C + .short 0x0E8C, 0xF956 + .short 0x0E89, 0xF951 + .short 0x0E87, 0xF94B + .short 0x0E84, 0xF945 + .short 0x0E81, 0xF93F + .short 0x0E7F, 0xF93A + .short 0x0E7C, 0xF934 + .short 0x0E79, 0xF92E + .short 0x0E77, 0xF929 + .short 0x0E74, 0xF923 + .short 0x0E71, 0xF91D + .short 0x0E6F, 0xF918 + .short 0x0E6C, 0xF912 + .short 0x0E69, 0xF90C + .short 0x0E66, 0xF907 + .short 0x0E64, 0xF901 + .short 0x0E61, 0xF8FB + .short 0x0E5E, 0xF8F6 + .short 0x0E5B, 0xF8F0 + .short 0x0E59, 0xF8EB + .short 0x0E56, 0xF8E5 + .short 0x0E53, 0xF8DF + .short 0x0E50, 0xF8DA + .short 0x0E4D, 0xF8D4 + .short 0x0E4B, 0xF8CE + .short 0x0E48, 0xF8C9 + .short 0x0E45, 0xF8C3 + .short 0x0E42, 0xF8BE + .short 0x0E3F, 0xF8B8 + .short 0x0E3C, 0xF8B2 + .short 0x0E3A, 0xF8AD + .short 0x0E37, 0xF8A7 + .short 0x0E34, 0xF8A2 + .short 0x0E31, 0xF89C + .short 0x0E2E, 0xF896 + .short 0x0E2B, 0xF891 + .short 0x0E28, 0xF88B + .short 0x0E25, 0xF886 + .short 0x0E22, 0xF880 + .short 0x0E1F, 0xF87B + .short 0x0E1C, 0xF875 + .short 0x0E19, 0xF870 + .short 0x0E16, 0xF86A + .short 0x0E13, 0xF865 + .short 0x0E10, 0xF85F + .short 0x0E0D, 0xF85A + .short 0x0E0A, 0xF854 + .short 0x0E07, 0xF84E + .short 0x0E04, 0xF849 + .short 0x0E01, 0xF843 + .short 0x0DFE, 0xF83E + .short 0x0DFB, 0xF838 + .short 0x0DF8, 0xF833 + .short 0x0DF5, 0xF82E + .short 0x0DF2, 0xF828 + .short 0x0DEF, 0xF823 + .short 0x0DEC, 0xF81D + .short 0x0DE9, 0xF818 + .short 0x0DE6, 0xF812 + .short 0x0DE3, 0xF80D + .short 0x0DDF, 0xF807 + .short 0x0DDC, 0xF802 + .short 0x0DD9, 0xF7FC + .short 0x0DD6, 0xF7F7 + .short 0x0DD3, 0xF7F2 + .short 0x0DD0, 0xF7EC + .short 0x0DCC, 0xF7E7 + .short 0x0DC9, 0xF7E1 + .short 0x0DC6, 0xF7DC + .short 0x0DC3, 0xF7D6 + .short 0x0DC0, 0xF7D1 + .short 0x0DBC, 0xF7CC + .short 0x0DB9, 0xF7C6 + .short 0x0DB6, 0xF7C1 + .short 0x0DB3, 0xF7BB + .short 0x0DB0, 0xF7B6 + .short 0x0DAC, 0xF7B1 + .short 0x0DA9, 0xF7AB + .short 0x0DA6, 0xF7A6 + .short 0x0DA2, 0xF7A1 + .short 0x0D9F, 0xF79B + .short 0x0D9C, 0xF796 + .short 0x0D99, 0xF791 + .short 0x0D95, 0xF78B + .short 0x0D92, 0xF786 + .short 0x0D8F, 0xF781 + .short 0x0D8B, 0xF77B + .short 0x0D88, 0xF776 + .short 0x0D85, 0xF771 + .short 0x0D81, 0xF76B + .short 0x0D7E, 0xF766 + .short 0x0D7A, 0xF761 + .short 0x0D77, 0xF75B + .short 0x0D74, 0xF756 + .short 0x0D70, 0xF751 + .short 0x0D6D, 0xF74C + .short 0x0D69, 0xF746 + .short 0x0D66, 0xF741 + .short 0x0D62, 0xF73C + .short 0x0D5F, 0xF737 + .short 0x0D5C, 0xF731 + .short 0x0D58, 0xF72C + .short 0x0D55, 0xF727 + .short 0x0D51, 0xF722 + .short 0x0D4E, 0xF71C + .short 0x0D4A, 0xF717 + .short 0x0D47, 0xF712 + .short 0x0D43, 0xF70D + .short 0x0D40, 0xF708 + .short 0x0D3C, 0xF702 + .short 0x0D39, 0xF6FD + .short 0x0D35, 0xF6F8 + .short 0x0D32, 0xF6F3 + .short 0x0D2E, 0xF6EE + .short 0x0D2A, 0xF6E8 + .short 0x0D27, 0xF6E3 + .short 0x0D23, 0xF6DE + .short 0x0D20, 0xF6D9 + .short 0x0D1C, 0xF6D4 + .short 0x0D18, 0xF6CF + .short 0x0D15, 0xF6C9 + .short 0x0D11, 0xF6C4 + .short 0x0D0E, 0xF6BF + .short 0x0D0A, 0xF6BA + .short 0x0D06, 0xF6B5 + .short 0x0D03, 0xF6B0 + .short 0x0CFF, 0xF6AB + .short 0x0CFB, 0xF6A6 + .short 0x0CF8, 0xF6A1 + .short 0x0CF4, 0xF69B + .short 0x0CF0, 0xF696 + .short 0x0CED, 0xF691 + .short 0x0CE9, 0xF68C + .short 0x0CE5, 0xF687 + .short 0x0CE1, 0xF682 + .short 0x0CDE, 0xF67D + .short 0x0CDA, 0xF678 + .short 0x0CD6, 0xF673 + .short 0x0CD2, 0xF66E + .short 0x0CCF, 0xF669 + .short 0x0CCB, 0xF664 + .short 0x0CC7, 0xF65F + .short 0x0CC3, 0xF65A + .short 0x0CC0, 0xF655 + .short 0x0CBC, 0xF650 + .short 0x0CB8, 0xF64B + .short 0x0CB4, 0xF646 + .short 0x0CB0, 0xF641 + .short 0x0CAC, 0xF63C + .short 0x0CA9, 0xF637 + .short 0x0CA5, 0xF632 + .short 0x0CA1, 0xF62D + .short 0x0C9D, 0xF628 + .short 0x0C99, 0xF623 + .short 0x0C95, 0xF61E + .short 0x0C91, 0xF619 + .short 0x0C8E, 0xF614 + .short 0x0C8A, 0xF60F + .short 0x0C86, 0xF60A + .short 0x0C82, 0xF605 + .short 0x0C7E, 0xF601 + .short 0x0C7A, 0xF5FC + .short 0x0C76, 0xF5F7 + .short 0x0C72, 0xF5F2 + .short 0x0C6E, 0xF5ED + .short 0x0C6A, 0xF5E8 + .short 0x0C66, 0xF5E3 + .short 0x0C62, 0xF5DE + .short 0x0C5E, 0xF5DA + .short 0x0C5A, 0xF5D5 + .short 0x0C56, 0xF5D0 + .short 0x0C52, 0xF5CB + .short 0x0C4E, 0xF5C6 + .short 0x0C4A, 0xF5C1 + .short 0x0C46, 0xF5BC + .short 0x0C42, 0xF5B8 + .short 0x0C3E, 0xF5B3 + .short 0x0C3A, 0xF5AE + .short 0x0C36, 0xF5A9 + .short 0x0C32, 0xF5A4 + .short 0x0C2E, 0xF5A0 + .short 0x0C2A, 0xF59B + .short 0x0C26, 0xF596 + .short 0x0C22, 0xF591 + .short 0x0C1E, 0xF58D + .short 0x0C19, 0xF588 + .short 0x0C15, 0xF583 + .short 0x0C11, 0xF57E + .short 0x0C0D, 0xF57A + .short 0x0C09, 0xF575 + .short 0x0C05, 0xF570 + .short 0x0C01, 0xF56B + .short 0x0BFC, 0xF567 + .short 0x0BF8, 0xF562 + .short 0x0BF4, 0xF55D + .short 0x0BF0, 0xF559 + .short 0x0BEC, 0xF554 + .short 0x0BE8, 0xF54F + .short 0x0BE3, 0xF54B + .short 0x0BDF, 0xF546 + .short 0x0BDB, 0xF541 + .short 0x0BD7, 0xF53D + .short 0x0BD2, 0xF538 + .short 0x0BCE, 0xF533 + .short 0x0BCA, 0xF52F + .short 0x0BC6, 0xF52A + .short 0x0BC1, 0xF525 + .short 0x0BBD, 0xF521 + .short 0x0BB9, 0xF51C + .short 0x0BB5, 0xF518 + .short 0x0BB0, 0xF513 + .short 0x0BAC, 0xF50E + .short 0x0BA8, 0xF50A + .short 0x0BA3, 0xF505 + .short 0x0B9F, 0xF501 + .short 0x0B9B, 0xF4FC + .short 0x0B97, 0xF4F8 + .short 0x0B92, 0xF4F3 + .short 0x0B8E, 0xF4EF + .short 0x0B89, 0xF4EA + .short 0x0B85, 0xF4E5 + .short 0x0B81, 0xF4E1 + .short 0x0B7C, 0xF4DC + .short 0x0B78, 0xF4D8 + .short 0x0B74, 0xF4D3 + .short 0x0B6F, 0xF4CF + .short 0x0B6B, 0xF4CA + .short 0x0B66, 0xF4C6 + .short 0x0B62, 0xF4C2 + .short 0x0B5E, 0xF4BD + .short 0x0B59, 0xF4B9 + .short 0x0B55, 0xF4B4 + .short 0x0B50, 0xF4B0 + .short 0x0B4C, 0xF4AB + .short 0x0B47, 0xF4A7 + .short 0x0B43, 0xF4A2 + .short 0x0B3E, 0xF49E + .short 0x0B3A, 0xF49A + .short 0x0B36, 0xF495 + .short 0x0B31, 0xF491 + .short 0x0B2D, 0xF48C + .short 0x0B28, 0xF488 + .short 0x0B24, 0xF484 + .short 0x0B1F, 0xF47F + .short 0x0B1B, 0xF47B + .short 0x0B16, 0xF477 + .short 0x0B11, 0xF472 + .short 0x0B0D, 0xF46E + .short 0x0B08, 0xF469 + .short 0x0B04, 0xF465 + .short 0x0AFF, 0xF461 + .short 0x0AFB, 0xF45D + .short 0x0AF6, 0xF458 + .short 0x0AF2, 0xF454 + .short 0x0AED, 0xF450 + .short 0x0AE8, 0xF44B + .short 0x0AE4, 0xF447 + .short 0x0ADF, 0xF443 + .short 0x0ADB, 0xF43F + .short 0x0AD6, 0xF43A + .short 0x0AD1, 0xF436 + .short 0x0ACD, 0xF432 + .short 0x0AC8, 0xF42E + .short 0x0AC3, 0xF429 + .short 0x0ABF, 0xF425 + .short 0x0ABA, 0xF421 + .short 0x0AB5, 0xF41D + .short 0x0AB1, 0xF418 + .short 0x0AAC, 0xF414 + .short 0x0AA7, 0xF410 + .short 0x0AA3, 0xF40C + .short 0x0A9E, 0xF408 + .short 0x0A99, 0xF404 + .short 0x0A95, 0xF3FF + .short 0x0A90, 0xF3FB + .short 0x0A8B, 0xF3F7 + .short 0x0A86, 0xF3F3 + .short 0x0A82, 0xF3EF + .short 0x0A7D, 0xF3EB + .short 0x0A78, 0xF3E7 + .short 0x0A73, 0xF3E2 + .short 0x0A6F, 0xF3DE + .short 0x0A6A, 0xF3DA + .short 0x0A65, 0xF3D6 + .short 0x0A60, 0xF3D2 + .short 0x0A5C, 0xF3CE + .short 0x0A57, 0xF3CA + .short 0x0A52, 0xF3C6 + .short 0x0A4D, 0xF3C2 + .short 0x0A48, 0xF3BE + .short 0x0A44, 0xF3BA + .short 0x0A3F, 0xF3B6 + .short 0x0A3A, 0xF3B2 + .short 0x0A35, 0xF3AE + .short 0x0A30, 0xF3AA + .short 0x0A2B, 0xF3A6 + .short 0x0A26, 0xF3A2 + .short 0x0A22, 0xF39E + .short 0x0A1D, 0xF39A + .short 0x0A18, 0xF396 + .short 0x0A13, 0xF392 + .short 0x0A0E, 0xF38E + .short 0x0A09, 0xF38A + .short 0x0A04, 0xF386 + .short 0x09FF, 0xF382 + .short 0x09FB, 0xF37E + .short 0x09F6, 0xF37A + .short 0x09F1, 0xF376 + .short 0x09EC, 0xF372 + .short 0x09E7, 0xF36F + .short 0x09E2, 0xF36B + .short 0x09DD, 0xF367 + .short 0x09D8, 0xF363 + .short 0x09D3, 0xF35F + .short 0x09CE, 0xF35B + .short 0x09C9, 0xF357 + .short 0x09C4, 0xF354 + .short 0x09BF, 0xF350 + .short 0x09BA, 0xF34C + .short 0x09B5, 0xF348 + .short 0x09B0, 0xF344 + .short 0x09AB, 0xF340 + .short 0x09A6, 0xF33D + .short 0x09A1, 0xF339 + .short 0x099C, 0xF335 + .short 0x0997, 0xF331 + .short 0x0992, 0xF32E + .short 0x098D, 0xF32A + .short 0x0988, 0xF326 + .short 0x0983, 0xF322 + .short 0x097E, 0xF31F + .short 0x0979, 0xF31B + .short 0x0974, 0xF317 + .short 0x096F, 0xF313 + .short 0x096A, 0xF310 + .short 0x0965, 0xF30C + .short 0x095F, 0xF308 + .short 0x095A, 0xF305 + .short 0x0955, 0xF301 + .short 0x0950, 0xF2FD + .short 0x094B, 0xF2FA + .short 0x0946, 0xF2F6 + .short 0x0941, 0xF2F2 + .short 0x093C, 0xF2EF + .short 0x0937, 0xF2EB + .short 0x0931, 0xF2E8 + .short 0x092C, 0xF2E4 + .short 0x0927, 0xF2E0 + .short 0x0922, 0xF2DD + .short 0x091D, 0xF2D9 + .short 0x0918, 0xF2D6 + .short 0x0912, 0xF2D2 + .short 0x090D, 0xF2CE + .short 0x0908, 0xF2CB + .short 0x0903, 0xF2C7 + .short 0x08FE, 0xF2C4 + .short 0x08F8, 0xF2C0 + .short 0x08F3, 0xF2BD + .short 0x08EE, 0xF2B9 + .short 0x08E9, 0xF2B6 + .short 0x08E4, 0xF2B2 + .short 0x08DE, 0xF2AF + .short 0x08D9, 0xF2AB + .short 0x08D4, 0xF2A8 + .short 0x08CF, 0xF2A4 + .short 0x08C9, 0xF2A1 + .short 0x08C4, 0xF29E + .short 0x08BF, 0xF29A + .short 0x08BA, 0xF297 + .short 0x08B4, 0xF293 + .short 0x08AF, 0xF290 + .short 0x08AA, 0xF28C + .short 0x08A5, 0xF289 + .short 0x089F, 0xF286 + .short 0x089A, 0xF282 + .short 0x0895, 0xF27F + .short 0x088F, 0xF27B + .short 0x088A, 0xF278 + .short 0x0885, 0xF275 + .short 0x087F, 0xF271 + .short 0x087A, 0xF26E + .short 0x0875, 0xF26B + .short 0x086F, 0xF267 + .short 0x086A, 0xF264 + .short 0x0865, 0xF261 + .short 0x085F, 0xF25E + .short 0x085A, 0xF25A + .short 0x0855, 0xF257 + .short 0x084F, 0xF254 + .short 0x084A, 0xF250 + .short 0x0845, 0xF24D + .short 0x083F, 0xF24A + .short 0x083A, 0xF247 + .short 0x0834, 0xF244 + .short 0x082F, 0xF240 + .short 0x082A, 0xF23D + .short 0x0824, 0xF23A + .short 0x081F, 0xF237 + .short 0x0819, 0xF234 + .short 0x0814, 0xF230 + .short 0x080E, 0xF22D + .short 0x0809, 0xF22A + .short 0x0804, 0xF227 + .short 0x07FE, 0xF224 + .short 0x07F9, 0xF221 + .short 0x07F3, 0xF21D + .short 0x07EE, 0xF21A + .short 0x07E8, 0xF217 + .short 0x07E3, 0xF214 + .short 0x07DD, 0xF211 + .short 0x07D8, 0xF20E + .short 0x07D2, 0xF20B + .short 0x07CD, 0xF208 + .short 0x07C8, 0xF205 + .short 0x07C2, 0xF202 + .short 0x07BD, 0xF1FF + .short 0x07B7, 0xF1FC + .short 0x07B2, 0xF1F9 + .short 0x07AC, 0xF1F6 + .short 0x07A6, 0xF1F3 + .short 0x07A1, 0xF1F0 + .short 0x079B, 0xF1ED + .short 0x0796, 0xF1EA + .short 0x0790, 0xF1E7 + .short 0x078B, 0xF1E4 + .short 0x0785, 0xF1E1 + .short 0x0780, 0xF1DE + .short 0x077A, 0xF1DB + .short 0x0775, 0xF1D8 + .short 0x076F, 0xF1D5 + .short 0x076A, 0xF1D2 + .short 0x0764, 0xF1CF + .short 0x075E, 0xF1CC + .short 0x0759, 0xF1C9 + .short 0x0753, 0xF1C6 + .short 0x074E, 0xF1C4 + .short 0x0748, 0xF1C1 + .short 0x0742, 0xF1BE + .short 0x073D, 0xF1BB + .short 0x0737, 0xF1B8 + .short 0x0732, 0xF1B5 + .short 0x072C, 0xF1B3 + .short 0x0726, 0xF1B0 + .short 0x0721, 0xF1AD + .short 0x071B, 0xF1AA + .short 0x0715, 0xF1A7 + .short 0x0710, 0xF1A5 + .short 0x070A, 0xF1A2 + .short 0x0705, 0xF19F + .short 0x06FF, 0xF19C + .short 0x06F9, 0xF19A + .short 0x06F4, 0xF197 + .short 0x06EE, 0xF194 + .short 0x06E8, 0xF191 + .short 0x06E3, 0xF18F + .short 0x06DD, 0xF18C + .short 0x06D7, 0xF189 + .short 0x06D2, 0xF187 + .short 0x06CC, 0xF184 + .short 0x06C6, 0xF181 + .short 0x06C1, 0xF17F + .short 0x06BB, 0xF17C + .short 0x06B5, 0xF179 + .short 0x06AF, 0xF177 + .short 0x06AA, 0xF174 + .short 0x06A4, 0xF171 + .short 0x069E, 0xF16F + .short 0x0699, 0xF16C + .short 0x0693, 0xF16A + .short 0x068D, 0xF167 + .short 0x0687, 0xF165 + .short 0x0682, 0xF162 + .short 0x067C, 0xF15F + .short 0x0676, 0xF15D + .short 0x0670, 0xF15A + .short 0x066B, 0xF158 + .short 0x0665, 0xF155 + .short 0x065F, 0xF153 + .short 0x0659, 0xF150 + .short 0x0654, 0xF14E + .short 0x064E, 0xF14B + .short 0x0648, 0xF149 + .short 0x0642, 0xF146 + .short 0x063C, 0xF144 + .short 0x0637, 0xF141 + .short 0x0631, 0xF13F + .short 0x062B, 0xF13D + .short 0x0625, 0xF13A + .short 0x061F, 0xF138 + .short 0x061A, 0xF135 + .short 0x0614, 0xF133 + .short 0x060E, 0xF131 + .short 0x0608, 0xF12E + .short 0x0602, 0xF12C + .short 0x05FD, 0xF12A + .short 0x05F7, 0xF127 + .short 0x05F1, 0xF125 + .short 0x05EB, 0xF123 + .short 0x05E5, 0xF120 + .short 0x05DF, 0xF11E + .short 0x05DA, 0xF11C + .short 0x05D4, 0xF119 + .short 0x05CE, 0xF117 + .short 0x05C8, 0xF115 + .short 0x05C2, 0xF112 + .short 0x05BC, 0xF110 + .short 0x05B6, 0xF10E + .short 0x05B1, 0xF10C + .short 0x05AB, 0xF109 + .short 0x05A5, 0xF107 + .short 0x059F, 0xF105 + .short 0x0599, 0xF103 + .short 0x0593, 0xF101 + .short 0x058D, 0xF0FE + .short 0x0587, 0xF0FC + .short 0x0581, 0xF0FA + .short 0x057C, 0xF0F8 + .short 0x0576, 0xF0F6 + .short 0x0570, 0xF0F4 + .short 0x056A, 0xF0F2 + .short 0x0564, 0xF0EF + .short 0x055E, 0xF0ED + .short 0x0558, 0xF0EB + .short 0x0552, 0xF0E9 + .short 0x054C, 0xF0E7 + .short 0x0546, 0xF0E5 + .short 0x0540, 0xF0E3 + .short 0x053A, 0xF0E1 + .short 0x0534, 0xF0DF + .short 0x052F, 0xF0DD + .short 0x0529, 0xF0DB + .short 0x0523, 0xF0D9 + .short 0x051D, 0xF0D7 + .short 0x0517, 0xF0D5 + .short 0x0511, 0xF0D3 + .short 0x050B, 0xF0D1 + .short 0x0505, 0xF0CF + .short 0x04FF, 0xF0CD + .short 0x04F9, 0xF0CB + .short 0x04F3, 0xF0C9 + .short 0x04ED, 0xF0C7 + .short 0x04E7, 0xF0C5 + .short 0x04E1, 0xF0C3 + .short 0x04DB, 0xF0C1 + .short 0x04D5, 0xF0BF + .short 0x04CF, 0xF0BD + .short 0x04C9, 0xF0BB + .short 0x04C3, 0xF0BA + .short 0x04BD, 0xF0B8 + .short 0x04B7, 0xF0B6 + .short 0x04B1, 0xF0B4 + .short 0x04AB, 0xF0B2 + .short 0x04A5, 0xF0B0 + .short 0x049F, 0xF0AF + .short 0x0499, 0xF0AD + .short 0x0493, 0xF0AB + .short 0x048D, 0xF0A9 + .short 0x0487, 0xF0A7 + .short 0x0481, 0xF0A6 + .short 0x047B, 0xF0A4 + .short 0x0475, 0xF0A2 + .short 0x046F, 0xF0A0 + .short 0x0469, 0xF09F + .short 0x0463, 0xF09D + .short 0x045D, 0xF09B + .short 0x0457, 0xF099 + .short 0x0451, 0xF098 + .short 0x044B, 0xF096 + .short 0x0444, 0xF094 + .short 0x043E, 0xF093 + .short 0x0438, 0xF091 + .short 0x0432, 0xF08F + .short 0x042C, 0xF08E + .short 0x0426, 0xF08C + .short 0x0420, 0xF08A + .short 0x041A, 0xF089 + .short 0x0414, 0xF087 + .short 0x040E, 0xF086 + .short 0x0408, 0xF084 + .short 0x0402, 0xF083 + .short 0x03FC, 0xF081 + .short 0x03F6, 0xF07F + .short 0x03EF, 0xF07E + .short 0x03E9, 0xF07C + .short 0x03E3, 0xF07B + .short 0x03DD, 0xF079 + .short 0x03D7, 0xF078 + .short 0x03D1, 0xF076 + .short 0x03CB, 0xF075 + .short 0x03C5, 0xF073 + .short 0x03BF, 0xF072 + .short 0x03B9, 0xF070 + .short 0x03B2, 0xF06F + .short 0x03AC, 0xF06D + .short 0x03A6, 0xF06C + .short 0x03A0, 0xF06B + .short 0x039A, 0xF069 + .short 0x0394, 0xF068 + .short 0x038E, 0xF066 + .short 0x0388, 0xF065 + .short 0x0381, 0xF064 + .short 0x037B, 0xF062 + .short 0x0375, 0xF061 + .short 0x036F, 0xF05F + .short 0x0369, 0xF05E + .short 0x0363, 0xF05D + .short 0x035D, 0xF05B + .short 0x0356, 0xF05A + .short 0x0350, 0xF059 + .short 0x034A, 0xF058 + .short 0x0344, 0xF056 + .short 0x033E, 0xF055 + .short 0x0338, 0xF054 + .short 0x0332, 0xF052 + .short 0x032B, 0xF051 + .short 0x0325, 0xF050 + .short 0x031F, 0xF04F + .short 0x0319, 0xF04D + .short 0x0313, 0xF04C + .short 0x030D, 0xF04B + .short 0x0306, 0xF04A + .short 0x0300, 0xF049 + .short 0x02FA, 0xF048 + .short 0x02F4, 0xF046 + .short 0x02EE, 0xF045 + .short 0x02E8, 0xF044 + .short 0x02E1, 0xF043 + .short 0x02DB, 0xF042 + .short 0x02D5, 0xF041 + .short 0x02CF, 0xF040 + .short 0x02C9, 0xF03E + .short 0x02C2, 0xF03D + .short 0x02BC, 0xF03C + .short 0x02B6, 0xF03B + .short 0x02B0, 0xF03A + .short 0x02AA, 0xF039 + .short 0x02A3, 0xF038 + .short 0x029D, 0xF037 + .short 0x0297, 0xF036 + .short 0x0291, 0xF035 + .short 0x028B, 0xF034 + .short 0x0284, 0xF033 + .short 0x027E, 0xF032 + .short 0x0278, 0xF031 + .short 0x0272, 0xF030 + .short 0x026C, 0xF02F + .short 0x0265, 0xF02E + .short 0x025F, 0xF02D + .short 0x0259, 0xF02C + .short 0x0253, 0xF02B + .short 0x024D, 0xF02B + .short 0x0246, 0xF02A + .short 0x0240, 0xF029 + .short 0x023A, 0xF028 + .short 0x0234, 0xF027 + .short 0x022D, 0xF026 + .short 0x0227, 0xF025 + .short 0x0221, 0xF024 + .short 0x021B, 0xF024 + .short 0x0215, 0xF023 + .short 0x020E, 0xF022 + .short 0x0208, 0xF021 + .short 0x0202, 0xF020 + .short 0x01FC, 0xF020 + .short 0x01F5, 0xF01F + .short 0x01EF, 0xF01E + .short 0x01E9, 0xF01D + .short 0x01E3, 0xF01D + .short 0x01DC, 0xF01C + .short 0x01D6, 0xF01B + .short 0x01D0, 0xF01A + .short 0x01CA, 0xF01A + .short 0x01C3, 0xF019 + .short 0x01BD, 0xF018 + .short 0x01B7, 0xF018 + .short 0x01B1, 0xF017 + .short 0x01AA, 0xF016 + .short 0x01A4, 0xF016 + .short 0x019E, 0xF015 + .short 0x0198, 0xF014 + .short 0x0191, 0xF014 + .short 0x018B, 0xF013 + .short 0x0185, 0xF013 + .short 0x017F, 0xF012 + .short 0x0178, 0xF011 + .short 0x0172, 0xF011 + .short 0x016C, 0xF010 + .short 0x0166, 0xF010 + .short 0x015F, 0xF00F + .short 0x0159, 0xF00F + .short 0x0153, 0xF00E + .short 0x014D, 0xF00E + .short 0x0146, 0xF00D + .short 0x0140, 0xF00D + .short 0x013A, 0xF00C + .short 0x0134, 0xF00C + .short 0x012D, 0xF00B + .short 0x0127, 0xF00B + .short 0x0121, 0xF00A + .short 0x011B, 0xF00A + .short 0x0114, 0xF009 + .short 0x010E, 0xF009 + .short 0x0108, 0xF008 + .short 0x0101, 0xF008 + .short 0x00FB, 0xF008 + .short 0x00F5, 0xF007 + .short 0x00EF, 0xF007 + .short 0x00E8, 0xF007 + .short 0x00E2, 0xF006 + .short 0x00DC, 0xF006 + .short 0x00D6, 0xF006 + .short 0x00CF, 0xF005 + .short 0x00C9, 0xF005 + .short 0x00C3, 0xF005 + .short 0x00BC, 0xF004 + .short 0x00B6, 0xF004 + .short 0x00B0, 0xF004 + .short 0x00AA, 0xF004 + .short 0x00A3, 0xF003 + .short 0x009D, 0xF003 + .short 0x0097, 0xF003 + .short 0x0090, 0xF003 + .short 0x008A, 0xF002 + .short 0x0084, 0xF002 + .short 0x007E, 0xF002 + .short 0x0077, 0xF002 + .short 0x0071, 0xF002 + .short 0x006B, 0xF001 + .short 0x0065, 0xF001 + .short 0x005E, 0xF001 + .short 0x0058, 0xF001 + .short 0x0052, 0xF001 + .short 0x004B, 0xF001 + .short 0x0045, 0xF001 + .short 0x003F, 0xF000 + .short 0x0039, 0xF000 + .short 0x0032, 0xF000 + .short 0x002C, 0xF000 + .short 0x0026, 0xF000 + .short 0x001F, 0xF000 + .short 0x0019, 0xF000 + .short 0x0013, 0xF000 + .short 0x000D, 0xF000 + .short 0x0006, 0xF000 + .short 0x0000, 0xF000 + .short 0xFFFA, 0xF000 + .short 0xFFF3, 0xF000 + .short 0xFFED, 0xF000 + .short 0xFFE7, 0xF000 + .short 0xFFE1, 0xF000 + .short 0xFFDA, 0xF000 + .short 0xFFD4, 0xF000 + .short 0xFFCE, 0xF000 + .short 0xFFC7, 0xF000 + .short 0xFFC1, 0xF000 + .short 0xFFBB, 0xF001 + .short 0xFFB5, 0xF001 + .short 0xFFAE, 0xF001 + .short 0xFFA8, 0xF001 + .short 0xFFA2, 0xF001 + .short 0xFF9B, 0xF001 + .short 0xFF95, 0xF001 + .short 0xFF8F, 0xF002 + .short 0xFF89, 0xF002 + .short 0xFF82, 0xF002 + .short 0xFF7C, 0xF002 + .short 0xFF76, 0xF002 + .short 0xFF70, 0xF003 + .short 0xFF69, 0xF003 + .short 0xFF63, 0xF003 + .short 0xFF5D, 0xF003 + .short 0xFF56, 0xF004 + .short 0xFF50, 0xF004 + .short 0xFF4A, 0xF004 + .short 0xFF44, 0xF004 + .short 0xFF3D, 0xF005 + .short 0xFF37, 0xF005 + .short 0xFF31, 0xF005 + .short 0xFF2A, 0xF006 + .short 0xFF24, 0xF006 + .short 0xFF1E, 0xF006 + .short 0xFF18, 0xF007 + .short 0xFF11, 0xF007 + .short 0xFF0B, 0xF007 + .short 0xFF05, 0xF008 + .short 0xFEFF, 0xF008 + .short 0xFEF8, 0xF008 + .short 0xFEF2, 0xF009 + .short 0xFEEC, 0xF009 + .short 0xFEE5, 0xF00A + .short 0xFEDF, 0xF00A + .short 0xFED9, 0xF00B + .short 0xFED3, 0xF00B + .short 0xFECC, 0xF00C + .short 0xFEC6, 0xF00C + .short 0xFEC0, 0xF00D + .short 0xFEBA, 0xF00D + .short 0xFEB3, 0xF00E + .short 0xFEAD, 0xF00E + .short 0xFEA7, 0xF00F + .short 0xFEA1, 0xF00F + .short 0xFE9A, 0xF010 + .short 0xFE94, 0xF010 + .short 0xFE8E, 0xF011 + .short 0xFE88, 0xF011 + .short 0xFE81, 0xF012 + .short 0xFE7B, 0xF013 + .short 0xFE75, 0xF013 + .short 0xFE6F, 0xF014 + .short 0xFE68, 0xF014 + .short 0xFE62, 0xF015 + .short 0xFE5C, 0xF016 + .short 0xFE56, 0xF016 + .short 0xFE4F, 0xF017 + .short 0xFE49, 0xF018 + .short 0xFE43, 0xF018 + .short 0xFE3D, 0xF019 + .short 0xFE36, 0xF01A + .short 0xFE30, 0xF01A + .short 0xFE2A, 0xF01B + .short 0xFE24, 0xF01C + .short 0xFE1D, 0xF01D + .short 0xFE17, 0xF01D + .short 0xFE11, 0xF01E + .short 0xFE0B, 0xF01F + .short 0xFE04, 0xF020 + .short 0xFDFE, 0xF020 + .short 0xFDF8, 0xF021 + .short 0xFDF2, 0xF022 + .short 0xFDEB, 0xF023 + .short 0xFDE5, 0xF024 + .short 0xFDDF, 0xF024 + .short 0xFDD9, 0xF025 + .short 0xFDD3, 0xF026 + .short 0xFDCC, 0xF027 + .short 0xFDC6, 0xF028 + .short 0xFDC0, 0xF029 + .short 0xFDBA, 0xF02A + .short 0xFDB3, 0xF02B + .short 0xFDAD, 0xF02B + .short 0xFDA7, 0xF02C + .short 0xFDA1, 0xF02D + .short 0xFD9B, 0xF02E + .short 0xFD94, 0xF02F + .short 0xFD8E, 0xF030 + .short 0xFD88, 0xF031 + .short 0xFD82, 0xF032 + .short 0xFD7C, 0xF033 + .short 0xFD75, 0xF034 + .short 0xFD6F, 0xF035 + .short 0xFD69, 0xF036 + .short 0xFD63, 0xF037 + .short 0xFD5D, 0xF038 + .short 0xFD56, 0xF039 + .short 0xFD50, 0xF03A + .short 0xFD4A, 0xF03B + .short 0xFD44, 0xF03C + .short 0xFD3E, 0xF03D + .short 0xFD37, 0xF03E + .short 0xFD31, 0xF040 + .short 0xFD2B, 0xF041 + .short 0xFD25, 0xF042 + .short 0xFD1F, 0xF043 + .short 0xFD18, 0xF044 + .short 0xFD12, 0xF045 + .short 0xFD0C, 0xF046 + .short 0xFD06, 0xF048 + .short 0xFD00, 0xF049 + .short 0xFCFA, 0xF04A + .short 0xFCF3, 0xF04B + .short 0xFCED, 0xF04C + .short 0xFCE7, 0xF04D + .short 0xFCE1, 0xF04F + .short 0xFCDB, 0xF050 + .short 0xFCD5, 0xF051 + .short 0xFCCE, 0xF052 + .short 0xFCC8, 0xF054 + .short 0xFCC2, 0xF055 + .short 0xFCBC, 0xF056 + .short 0xFCB6, 0xF058 + .short 0xFCB0, 0xF059 + .short 0xFCAA, 0xF05A + .short 0xFCA3, 0xF05B + .short 0xFC9D, 0xF05D + .short 0xFC97, 0xF05E + .short 0xFC91, 0xF05F + .short 0xFC8B, 0xF061 + .short 0xFC85, 0xF062 + .short 0xFC7F, 0xF064 + .short 0xFC78, 0xF065 + .short 0xFC72, 0xF066 + .short 0xFC6C, 0xF068 + .short 0xFC66, 0xF069 + .short 0xFC60, 0xF06B + .short 0xFC5A, 0xF06C + .short 0xFC54, 0xF06D + .short 0xFC4E, 0xF06F + .short 0xFC47, 0xF070 + .short 0xFC41, 0xF072 + .short 0xFC3B, 0xF073 + .short 0xFC35, 0xF075 + .short 0xFC2F, 0xF076 + .short 0xFC29, 0xF078 + .short 0xFC23, 0xF079 + .short 0xFC1D, 0xF07B + .short 0xFC17, 0xF07C + .short 0xFC11, 0xF07E + .short 0xFC0A, 0xF07F + .short 0xFC04, 0xF081 + .short 0xFBFE, 0xF083 + .short 0xFBF8, 0xF084 + .short 0xFBF2, 0xF086 + .short 0xFBEC, 0xF087 + .short 0xFBE6, 0xF089 + .short 0xFBE0, 0xF08A + .short 0xFBDA, 0xF08C + .short 0xFBD4, 0xF08E + .short 0xFBCE, 0xF08F + .short 0xFBC8, 0xF091 + .short 0xFBC2, 0xF093 + .short 0xFBBC, 0xF094 + .short 0xFBB5, 0xF096 + .short 0xFBAF, 0xF098 + .short 0xFBA9, 0xF099 + .short 0xFBA3, 0xF09B + .short 0xFB9D, 0xF09D + .short 0xFB97, 0xF09F + .short 0xFB91, 0xF0A0 + .short 0xFB8B, 0xF0A2 + .short 0xFB85, 0xF0A4 + .short 0xFB7F, 0xF0A6 + .short 0xFB79, 0xF0A7 + .short 0xFB73, 0xF0A9 + .short 0xFB6D, 0xF0AB + .short 0xFB67, 0xF0AD + .short 0xFB61, 0xF0AF + .short 0xFB5B, 0xF0B0 + .short 0xFB55, 0xF0B2 + .short 0xFB4F, 0xF0B4 + .short 0xFB49, 0xF0B6 + .short 0xFB43, 0xF0B8 + .short 0xFB3D, 0xF0BA + .short 0xFB37, 0xF0BB + .short 0xFB31, 0xF0BD + .short 0xFB2B, 0xF0BF + .short 0xFB25, 0xF0C1 + .short 0xFB1F, 0xF0C3 + .short 0xFB19, 0xF0C5 + .short 0xFB13, 0xF0C7 + .short 0xFB0D, 0xF0C9 + .short 0xFB07, 0xF0CB + .short 0xFB01, 0xF0CD + .short 0xFAFB, 0xF0CF + .short 0xFAF5, 0xF0D1 + .short 0xFAEF, 0xF0D3 + .short 0xFAE9, 0xF0D5 + .short 0xFAE3, 0xF0D7 + .short 0xFADD, 0xF0D9 + .short 0xFAD7, 0xF0DB + .short 0xFAD1, 0xF0DD + .short 0xFACC, 0xF0DF + .short 0xFAC6, 0xF0E1 + .short 0xFAC0, 0xF0E3 + .short 0xFABA, 0xF0E5 + .short 0xFAB4, 0xF0E7 + .short 0xFAAE, 0xF0E9 + .short 0xFAA8, 0xF0EB + .short 0xFAA2, 0xF0ED + .short 0xFA9C, 0xF0EF + .short 0xFA96, 0xF0F2 + .short 0xFA90, 0xF0F4 + .short 0xFA8A, 0xF0F6 + .short 0xFA84, 0xF0F8 + .short 0xFA7F, 0xF0FA + .short 0xFA79, 0xF0FC + .short 0xFA73, 0xF0FE + .short 0xFA6D, 0xF101 + .short 0xFA67, 0xF103 + .short 0xFA61, 0xF105 + .short 0xFA5B, 0xF107 + .short 0xFA55, 0xF109 + .short 0xFA4F, 0xF10C + .short 0xFA4A, 0xF10E + .short 0xFA44, 0xF110 + .short 0xFA3E, 0xF112 + .short 0xFA38, 0xF115 + .short 0xFA32, 0xF117 + .short 0xFA2C, 0xF119 + .short 0xFA26, 0xF11C + .short 0xFA21, 0xF11E + .short 0xFA1B, 0xF120 + .short 0xFA15, 0xF123 + .short 0xFA0F, 0xF125 + .short 0xFA09, 0xF127 + .short 0xFA03, 0xF12A + .short 0xF9FE, 0xF12C + .short 0xF9F8, 0xF12E + .short 0xF9F2, 0xF131 + .short 0xF9EC, 0xF133 + .short 0xF9E6, 0xF135 + .short 0xF9E1, 0xF138 + .short 0xF9DB, 0xF13A + .short 0xF9D5, 0xF13D + .short 0xF9CF, 0xF13F + .short 0xF9C9, 0xF141 + .short 0xF9C4, 0xF144 + .short 0xF9BE, 0xF146 + .short 0xF9B8, 0xF149 + .short 0xF9B2, 0xF14B + .short 0xF9AC, 0xF14E + .short 0xF9A7, 0xF150 + .short 0xF9A1, 0xF153 + .short 0xF99B, 0xF155 + .short 0xF995, 0xF158 + .short 0xF990, 0xF15A + .short 0xF98A, 0xF15D + .short 0xF984, 0xF15F + .short 0xF97E, 0xF162 + .short 0xF979, 0xF165 + .short 0xF973, 0xF167 + .short 0xF96D, 0xF16A + .short 0xF967, 0xF16C + .short 0xF962, 0xF16F + .short 0xF95C, 0xF171 + .short 0xF956, 0xF174 + .short 0xF951, 0xF177 + .short 0xF94B, 0xF179 + .short 0xF945, 0xF17C + .short 0xF93F, 0xF17F + .short 0xF93A, 0xF181 + .short 0xF934, 0xF184 + .short 0xF92E, 0xF187 + .short 0xF929, 0xF189 + .short 0xF923, 0xF18C + .short 0xF91D, 0xF18F + .short 0xF918, 0xF191 + .short 0xF912, 0xF194 + .short 0xF90C, 0xF197 + .short 0xF907, 0xF19A + .short 0xF901, 0xF19C + .short 0xF8FB, 0xF19F + .short 0xF8F6, 0xF1A2 + .short 0xF8F0, 0xF1A5 + .short 0xF8EB, 0xF1A7 + .short 0xF8E5, 0xF1AA + .short 0xF8DF, 0xF1AD + .short 0xF8DA, 0xF1B0 + .short 0xF8D4, 0xF1B3 + .short 0xF8CE, 0xF1B5 + .short 0xF8C9, 0xF1B8 + .short 0xF8C3, 0xF1BB + .short 0xF8BE, 0xF1BE + .short 0xF8B8, 0xF1C1 + .short 0xF8B2, 0xF1C4 + .short 0xF8AD, 0xF1C6 + .short 0xF8A7, 0xF1C9 + .short 0xF8A2, 0xF1CC + .short 0xF89C, 0xF1CF + .short 0xF896, 0xF1D2 + .short 0xF891, 0xF1D5 + .short 0xF88B, 0xF1D8 + .short 0xF886, 0xF1DB + .short 0xF880, 0xF1DE + .short 0xF87B, 0xF1E1 + .short 0xF875, 0xF1E4 + .short 0xF870, 0xF1E7 + .short 0xF86A, 0xF1EA + .short 0xF865, 0xF1ED + .short 0xF85F, 0xF1F0 + .short 0xF85A, 0xF1F3 + .short 0xF854, 0xF1F6 + .short 0xF84E, 0xF1F9 + .short 0xF849, 0xF1FC + .short 0xF843, 0xF1FF + .short 0xF83E, 0xF202 + .short 0xF838, 0xF205 + .short 0xF833, 0xF208 + .short 0xF82E, 0xF20B + .short 0xF828, 0xF20E + .short 0xF823, 0xF211 + .short 0xF81D, 0xF214 + .short 0xF818, 0xF217 + .short 0xF812, 0xF21A + .short 0xF80D, 0xF21D + .short 0xF807, 0xF221 + .short 0xF802, 0xF224 + .short 0xF7FC, 0xF227 + .short 0xF7F7, 0xF22A + .short 0xF7F2, 0xF22D + .short 0xF7EC, 0xF230 + .short 0xF7E7, 0xF234 + .short 0xF7E1, 0xF237 + .short 0xF7DC, 0xF23A + .short 0xF7D6, 0xF23D + .short 0xF7D1, 0xF240 + .short 0xF7CC, 0xF244 + .short 0xF7C6, 0xF247 + .short 0xF7C1, 0xF24A + .short 0xF7BB, 0xF24D + .short 0xF7B6, 0xF250 + .short 0xF7B1, 0xF254 + .short 0xF7AB, 0xF257 + .short 0xF7A6, 0xF25A + .short 0xF7A1, 0xF25E + .short 0xF79B, 0xF261 + .short 0xF796, 0xF264 + .short 0xF791, 0xF267 + .short 0xF78B, 0xF26B + .short 0xF786, 0xF26E + .short 0xF781, 0xF271 + .short 0xF77B, 0xF275 + .short 0xF776, 0xF278 + .short 0xF771, 0xF27B + .short 0xF76B, 0xF27F + .short 0xF766, 0xF282 + .short 0xF761, 0xF286 + .short 0xF75B, 0xF289 + .short 0xF756, 0xF28C + .short 0xF751, 0xF290 + .short 0xF74C, 0xF293 + .short 0xF746, 0xF297 + .short 0xF741, 0xF29A + .short 0xF73C, 0xF29E + .short 0xF737, 0xF2A1 + .short 0xF731, 0xF2A4 + .short 0xF72C, 0xF2A8 + .short 0xF727, 0xF2AB + .short 0xF722, 0xF2AF + .short 0xF71C, 0xF2B2 + .short 0xF717, 0xF2B6 + .short 0xF712, 0xF2B9 + .short 0xF70D, 0xF2BD + .short 0xF708, 0xF2C0 + .short 0xF702, 0xF2C4 + .short 0xF6FD, 0xF2C7 + .short 0xF6F8, 0xF2CB + .short 0xF6F3, 0xF2CE + .short 0xF6EE, 0xF2D2 + .short 0xF6E8, 0xF2D6 + .short 0xF6E3, 0xF2D9 + .short 0xF6DE, 0xF2DD + .short 0xF6D9, 0xF2E0 + .short 0xF6D4, 0xF2E4 + .short 0xF6CF, 0xF2E8 + .short 0xF6C9, 0xF2EB + .short 0xF6C4, 0xF2EF + .short 0xF6BF, 0xF2F2 + .short 0xF6BA, 0xF2F6 + .short 0xF6B5, 0xF2FA + .short 0xF6B0, 0xF2FD + .short 0xF6AB, 0xF301 + .short 0xF6A6, 0xF305 + .short 0xF6A1, 0xF308 + .short 0xF69B, 0xF30C + .short 0xF696, 0xF310 + .short 0xF691, 0xF313 + .short 0xF68C, 0xF317 + .short 0xF687, 0xF31B + .short 0xF682, 0xF31F + .short 0xF67D, 0xF322 + .short 0xF678, 0xF326 + .short 0xF673, 0xF32A + .short 0xF66E, 0xF32E + .short 0xF669, 0xF331 + .short 0xF664, 0xF335 + .short 0xF65F, 0xF339 + .short 0xF65A, 0xF33D + .short 0xF655, 0xF340 + .short 0xF650, 0xF344 + .short 0xF64B, 0xF348 + .short 0xF646, 0xF34C + .short 0xF641, 0xF350 + .short 0xF63C, 0xF354 + .short 0xF637, 0xF357 + .short 0xF632, 0xF35B + .short 0xF62D, 0xF35F + .short 0xF628, 0xF363 + .short 0xF623, 0xF367 + .short 0xF61E, 0xF36B + .short 0xF619, 0xF36F + .short 0xF614, 0xF372 + .short 0xF60F, 0xF376 + .short 0xF60A, 0xF37A + .short 0xF605, 0xF37E + .short 0xF601, 0xF382 + .short 0xF5FC, 0xF386 + .short 0xF5F7, 0xF38A + .short 0xF5F2, 0xF38E + .short 0xF5ED, 0xF392 + .short 0xF5E8, 0xF396 + .short 0xF5E3, 0xF39A + .short 0xF5DE, 0xF39E + .short 0xF5DA, 0xF3A2 + .short 0xF5D5, 0xF3A6 + .short 0xF5D0, 0xF3AA + .short 0xF5CB, 0xF3AE + .short 0xF5C6, 0xF3B2 + .short 0xF5C1, 0xF3B6 + .short 0xF5BC, 0xF3BA + .short 0xF5B8, 0xF3BE + .short 0xF5B3, 0xF3C2 + .short 0xF5AE, 0xF3C6 + .short 0xF5A9, 0xF3CA + .short 0xF5A4, 0xF3CE + .short 0xF5A0, 0xF3D2 + .short 0xF59B, 0xF3D6 + .short 0xF596, 0xF3DA + .short 0xF591, 0xF3DE + .short 0xF58D, 0xF3E2 + .short 0xF588, 0xF3E7 + .short 0xF583, 0xF3EB + .short 0xF57E, 0xF3EF + .short 0xF57A, 0xF3F3 + .short 0xF575, 0xF3F7 + .short 0xF570, 0xF3FB + .short 0xF56B, 0xF3FF + .short 0xF567, 0xF404 + .short 0xF562, 0xF408 + .short 0xF55D, 0xF40C + .short 0xF559, 0xF410 + .short 0xF554, 0xF414 + .short 0xF54F, 0xF418 + .short 0xF54B, 0xF41D + .short 0xF546, 0xF421 + .short 0xF541, 0xF425 + .short 0xF53D, 0xF429 + .short 0xF538, 0xF42E + .short 0xF533, 0xF432 + .short 0xF52F, 0xF436 + .short 0xF52A, 0xF43A + .short 0xF525, 0xF43F + .short 0xF521, 0xF443 + .short 0xF51C, 0xF447 + .short 0xF518, 0xF44B + .short 0xF513, 0xF450 + .short 0xF50E, 0xF454 + .short 0xF50A, 0xF458 + .short 0xF505, 0xF45D + .short 0xF501, 0xF461 + .short 0xF4FC, 0xF465 + .short 0xF4F8, 0xF469 + .short 0xF4F3, 0xF46E + .short 0xF4EF, 0xF472 + .short 0xF4EA, 0xF477 + .short 0xF4E5, 0xF47B + .short 0xF4E1, 0xF47F + .short 0xF4DC, 0xF484 + .short 0xF4D8, 0xF488 + .short 0xF4D3, 0xF48C + .short 0xF4CF, 0xF491 + .short 0xF4CA, 0xF495 + .short 0xF4C6, 0xF49A + .short 0xF4C2, 0xF49E + .short 0xF4BD, 0xF4A2 + .short 0xF4B9, 0xF4A7 + .short 0xF4B4, 0xF4AB + .short 0xF4B0, 0xF4B0 + .short 0xF4AB, 0xF4B4 + .short 0xF4A7, 0xF4B9 + .short 0xF4A2, 0xF4BD + .short 0xF49E, 0xF4C2 + .short 0xF49A, 0xF4C6 + .short 0xF495, 0xF4CA + .short 0xF491, 0xF4CF + .short 0xF48C, 0xF4D3 + .short 0xF488, 0xF4D8 + .short 0xF484, 0xF4DC + .short 0xF47F, 0xF4E1 + .short 0xF47B, 0xF4E5 + .short 0xF477, 0xF4EA + .short 0xF472, 0xF4EF + .short 0xF46E, 0xF4F3 + .short 0xF469, 0xF4F8 + .short 0xF465, 0xF4FC + .short 0xF461, 0xF501 + .short 0xF45D, 0xF505 + .short 0xF458, 0xF50A + .short 0xF454, 0xF50E + .short 0xF450, 0xF513 + .short 0xF44B, 0xF518 + .short 0xF447, 0xF51C + .short 0xF443, 0xF521 + .short 0xF43F, 0xF525 + .short 0xF43A, 0xF52A + .short 0xF436, 0xF52F + .short 0xF432, 0xF533 + .short 0xF42E, 0xF538 + .short 0xF429, 0xF53D + .short 0xF425, 0xF541 + .short 0xF421, 0xF546 + .short 0xF41D, 0xF54B + .short 0xF418, 0xF54F + .short 0xF414, 0xF554 + .short 0xF410, 0xF559 + .short 0xF40C, 0xF55D + .short 0xF408, 0xF562 + .short 0xF404, 0xF567 + .short 0xF3FF, 0xF56B + .short 0xF3FB, 0xF570 + .short 0xF3F7, 0xF575 + .short 0xF3F3, 0xF57A + .short 0xF3EF, 0xF57E + .short 0xF3EB, 0xF583 + .short 0xF3E7, 0xF588 + .short 0xF3E2, 0xF58D + .short 0xF3DE, 0xF591 + .short 0xF3DA, 0xF596 + .short 0xF3D6, 0xF59B + .short 0xF3D2, 0xF5A0 + .short 0xF3CE, 0xF5A4 + .short 0xF3CA, 0xF5A9 + .short 0xF3C6, 0xF5AE + .short 0xF3C2, 0xF5B3 + .short 0xF3BE, 0xF5B8 + .short 0xF3BA, 0xF5BC + .short 0xF3B6, 0xF5C1 + .short 0xF3B2, 0xF5C6 + .short 0xF3AE, 0xF5CB + .short 0xF3AA, 0xF5D0 + .short 0xF3A6, 0xF5D5 + .short 0xF3A2, 0xF5DA + .short 0xF39E, 0xF5DE + .short 0xF39A, 0xF5E3 + .short 0xF396, 0xF5E8 + .short 0xF392, 0xF5ED + .short 0xF38E, 0xF5F2 + .short 0xF38A, 0xF5F7 + .short 0xF386, 0xF5FC + .short 0xF382, 0xF601 + .short 0xF37E, 0xF605 + .short 0xF37A, 0xF60A + .short 0xF376, 0xF60F + .short 0xF372, 0xF614 + .short 0xF36F, 0xF619 + .short 0xF36B, 0xF61E + .short 0xF367, 0xF623 + .short 0xF363, 0xF628 + .short 0xF35F, 0xF62D + .short 0xF35B, 0xF632 + .short 0xF357, 0xF637 + .short 0xF354, 0xF63C + .short 0xF350, 0xF641 + .short 0xF34C, 0xF646 + .short 0xF348, 0xF64B + .short 0xF344, 0xF650 + .short 0xF340, 0xF655 + .short 0xF33D, 0xF65A + .short 0xF339, 0xF65F + .short 0xF335, 0xF664 + .short 0xF331, 0xF669 + .short 0xF32E, 0xF66E + .short 0xF32A, 0xF673 + .short 0xF326, 0xF678 + .short 0xF322, 0xF67D + .short 0xF31F, 0xF682 + .short 0xF31B, 0xF687 + .short 0xF317, 0xF68C + .short 0xF313, 0xF691 + .short 0xF310, 0xF696 + .short 0xF30C, 0xF69B + .short 0xF308, 0xF6A1 + .short 0xF305, 0xF6A6 + .short 0xF301, 0xF6AB + .short 0xF2FD, 0xF6B0 + .short 0xF2FA, 0xF6B5 + .short 0xF2F6, 0xF6BA + .short 0xF2F2, 0xF6BF + .short 0xF2EF, 0xF6C4 + .short 0xF2EB, 0xF6C9 + .short 0xF2E8, 0xF6CF + .short 0xF2E4, 0xF6D4 + .short 0xF2E0, 0xF6D9 + .short 0xF2DD, 0xF6DE + .short 0xF2D9, 0xF6E3 + .short 0xF2D6, 0xF6E8 + .short 0xF2D2, 0xF6EE + .short 0xF2CE, 0xF6F3 + .short 0xF2CB, 0xF6F8 + .short 0xF2C7, 0xF6FD + .short 0xF2C4, 0xF702 + .short 0xF2C0, 0xF708 + .short 0xF2BD, 0xF70D + .short 0xF2B9, 0xF712 + .short 0xF2B6, 0xF717 + .short 0xF2B2, 0xF71C + .short 0xF2AF, 0xF722 + .short 0xF2AB, 0xF727 + .short 0xF2A8, 0xF72C + .short 0xF2A4, 0xF731 + .short 0xF2A1, 0xF737 + .short 0xF29E, 0xF73C + .short 0xF29A, 0xF741 + .short 0xF297, 0xF746 + .short 0xF293, 0xF74C + .short 0xF290, 0xF751 + .short 0xF28C, 0xF756 + .short 0xF289, 0xF75B + .short 0xF286, 0xF761 + .short 0xF282, 0xF766 + .short 0xF27F, 0xF76B + .short 0xF27B, 0xF771 + .short 0xF278, 0xF776 + .short 0xF275, 0xF77B + .short 0xF271, 0xF781 + .short 0xF26E, 0xF786 + .short 0xF26B, 0xF78B + .short 0xF267, 0xF791 + .short 0xF264, 0xF796 + .short 0xF261, 0xF79B + .short 0xF25E, 0xF7A1 + .short 0xF25A, 0xF7A6 + .short 0xF257, 0xF7AB + .short 0xF254, 0xF7B1 + .short 0xF250, 0xF7B6 + .short 0xF24D, 0xF7BB + .short 0xF24A, 0xF7C1 + .short 0xF247, 0xF7C6 + .short 0xF244, 0xF7CC + .short 0xF240, 0xF7D1 + .short 0xF23D, 0xF7D6 + .short 0xF23A, 0xF7DC + .short 0xF237, 0xF7E1 + .short 0xF234, 0xF7E7 + .short 0xF230, 0xF7EC + .short 0xF22D, 0xF7F2 + .short 0xF22A, 0xF7F7 + .short 0xF227, 0xF7FC + .short 0xF224, 0xF802 + .short 0xF221, 0xF807 + .short 0xF21D, 0xF80D + .short 0xF21A, 0xF812 + .short 0xF217, 0xF818 + .short 0xF214, 0xF81D + .short 0xF211, 0xF823 + .short 0xF20E, 0xF828 + .short 0xF20B, 0xF82E + .short 0xF208, 0xF833 + .short 0xF205, 0xF838 + .short 0xF202, 0xF83E + .short 0xF1FF, 0xF843 + .short 0xF1FC, 0xF849 + .short 0xF1F9, 0xF84E + .short 0xF1F6, 0xF854 + .short 0xF1F3, 0xF85A + .short 0xF1F0, 0xF85F + .short 0xF1ED, 0xF865 + .short 0xF1EA, 0xF86A + .short 0xF1E7, 0xF870 + .short 0xF1E4, 0xF875 + .short 0xF1E1, 0xF87B + .short 0xF1DE, 0xF880 + .short 0xF1DB, 0xF886 + .short 0xF1D8, 0xF88B + .short 0xF1D5, 0xF891 + .short 0xF1D2, 0xF896 + .short 0xF1CF, 0xF89C + .short 0xF1CC, 0xF8A2 + .short 0xF1C9, 0xF8A7 + .short 0xF1C6, 0xF8AD + .short 0xF1C4, 0xF8B2 + .short 0xF1C1, 0xF8B8 + .short 0xF1BE, 0xF8BE + .short 0xF1BB, 0xF8C3 + .short 0xF1B8, 0xF8C9 + .short 0xF1B5, 0xF8CE + .short 0xF1B3, 0xF8D4 + .short 0xF1B0, 0xF8DA + .short 0xF1AD, 0xF8DF + .short 0xF1AA, 0xF8E5 + .short 0xF1A7, 0xF8EB + .short 0xF1A5, 0xF8F0 + .short 0xF1A2, 0xF8F6 + .short 0xF19F, 0xF8FB + .short 0xF19C, 0xF901 + .short 0xF19A, 0xF907 + .short 0xF197, 0xF90C + .short 0xF194, 0xF912 + .short 0xF191, 0xF918 + .short 0xF18F, 0xF91D + .short 0xF18C, 0xF923 + .short 0xF189, 0xF929 + .short 0xF187, 0xF92E + .short 0xF184, 0xF934 + .short 0xF181, 0xF93A + .short 0xF17F, 0xF93F + .short 0xF17C, 0xF945 + .short 0xF179, 0xF94B + .short 0xF177, 0xF951 + .short 0xF174, 0xF956 + .short 0xF171, 0xF95C + .short 0xF16F, 0xF962 + .short 0xF16C, 0xF967 + .short 0xF16A, 0xF96D + .short 0xF167, 0xF973 + .short 0xF165, 0xF979 + .short 0xF162, 0xF97E + .short 0xF15F, 0xF984 + .short 0xF15D, 0xF98A + .short 0xF15A, 0xF990 + .short 0xF158, 0xF995 + .short 0xF155, 0xF99B + .short 0xF153, 0xF9A1 + .short 0xF150, 0xF9A7 + .short 0xF14E, 0xF9AC + .short 0xF14B, 0xF9B2 + .short 0xF149, 0xF9B8 + .short 0xF146, 0xF9BE + .short 0xF144, 0xF9C4 + .short 0xF141, 0xF9C9 + .short 0xF13F, 0xF9CF + .short 0xF13D, 0xF9D5 + .short 0xF13A, 0xF9DB + .short 0xF138, 0xF9E1 + .short 0xF135, 0xF9E6 + .short 0xF133, 0xF9EC + .short 0xF131, 0xF9F2 + .short 0xF12E, 0xF9F8 + .short 0xF12C, 0xF9FE + .short 0xF12A, 0xFA03 + .short 0xF127, 0xFA09 + .short 0xF125, 0xFA0F + .short 0xF123, 0xFA15 + .short 0xF120, 0xFA1B + .short 0xF11E, 0xFA21 + .short 0xF11C, 0xFA26 + .short 0xF119, 0xFA2C + .short 0xF117, 0xFA32 + .short 0xF115, 0xFA38 + .short 0xF112, 0xFA3E + .short 0xF110, 0xFA44 + .short 0xF10E, 0xFA4A + .short 0xF10C, 0xFA4F + .short 0xF109, 0xFA55 + .short 0xF107, 0xFA5B + .short 0xF105, 0xFA61 + .short 0xF103, 0xFA67 + .short 0xF101, 0xFA6D + .short 0xF0FE, 0xFA73 + .short 0xF0FC, 0xFA79 + .short 0xF0FA, 0xFA7F + .short 0xF0F8, 0xFA84 + .short 0xF0F6, 0xFA8A + .short 0xF0F4, 0xFA90 + .short 0xF0F2, 0xFA96 + .short 0xF0EF, 0xFA9C + .short 0xF0ED, 0xFAA2 + .short 0xF0EB, 0xFAA8 + .short 0xF0E9, 0xFAAE + .short 0xF0E7, 0xFAB4 + .short 0xF0E5, 0xFABA + .short 0xF0E3, 0xFAC0 + .short 0xF0E1, 0xFAC6 + .short 0xF0DF, 0xFACC + .short 0xF0DD, 0xFAD1 + .short 0xF0DB, 0xFAD7 + .short 0xF0D9, 0xFADD + .short 0xF0D7, 0xFAE3 + .short 0xF0D5, 0xFAE9 + .short 0xF0D3, 0xFAEF + .short 0xF0D1, 0xFAF5 + .short 0xF0CF, 0xFAFB + .short 0xF0CD, 0xFB01 + .short 0xF0CB, 0xFB07 + .short 0xF0C9, 0xFB0D + .short 0xF0C7, 0xFB13 + .short 0xF0C5, 0xFB19 + .short 0xF0C3, 0xFB1F + .short 0xF0C1, 0xFB25 + .short 0xF0BF, 0xFB2B + .short 0xF0BD, 0xFB31 + .short 0xF0BB, 0xFB37 + .short 0xF0BA, 0xFB3D + .short 0xF0B8, 0xFB43 + .short 0xF0B6, 0xFB49 + .short 0xF0B4, 0xFB4F + .short 0xF0B2, 0xFB55 + .short 0xF0B0, 0xFB5B + .short 0xF0AF, 0xFB61 + .short 0xF0AD, 0xFB67 + .short 0xF0AB, 0xFB6D + .short 0xF0A9, 0xFB73 + .short 0xF0A7, 0xFB79 + .short 0xF0A6, 0xFB7F + .short 0xF0A4, 0xFB85 + .short 0xF0A2, 0xFB8B + .short 0xF0A0, 0xFB91 + .short 0xF09F, 0xFB97 + .short 0xF09D, 0xFB9D + .short 0xF09B, 0xFBA3 + .short 0xF099, 0xFBA9 + .short 0xF098, 0xFBAF + .short 0xF096, 0xFBB5 + .short 0xF094, 0xFBBC + .short 0xF093, 0xFBC2 + .short 0xF091, 0xFBC8 + .short 0xF08F, 0xFBCE + .short 0xF08E, 0xFBD4 + .short 0xF08C, 0xFBDA + .short 0xF08A, 0xFBE0 + .short 0xF089, 0xFBE6 + .short 0xF087, 0xFBEC + .short 0xF086, 0xFBF2 + .short 0xF084, 0xFBF8 + .short 0xF083, 0xFBFE + .short 0xF081, 0xFC04 + .short 0xF07F, 0xFC0A + .short 0xF07E, 0xFC11 + .short 0xF07C, 0xFC17 + .short 0xF07B, 0xFC1D + .short 0xF079, 0xFC23 + .short 0xF078, 0xFC29 + .short 0xF076, 0xFC2F + .short 0xF075, 0xFC35 + .short 0xF073, 0xFC3B + .short 0xF072, 0xFC41 + .short 0xF070, 0xFC47 + .short 0xF06F, 0xFC4E + .short 0xF06D, 0xFC54 + .short 0xF06C, 0xFC5A + .short 0xF06B, 0xFC60 + .short 0xF069, 0xFC66 + .short 0xF068, 0xFC6C + .short 0xF066, 0xFC72 + .short 0xF065, 0xFC78 + .short 0xF064, 0xFC7F + .short 0xF062, 0xFC85 + .short 0xF061, 0xFC8B + .short 0xF05F, 0xFC91 + .short 0xF05E, 0xFC97 + .short 0xF05D, 0xFC9D + .short 0xF05B, 0xFCA3 + .short 0xF05A, 0xFCAA + .short 0xF059, 0xFCB0 + .short 0xF058, 0xFCB6 + .short 0xF056, 0xFCBC + .short 0xF055, 0xFCC2 + .short 0xF054, 0xFCC8 + .short 0xF052, 0xFCCE + .short 0xF051, 0xFCD5 + .short 0xF050, 0xFCDB + .short 0xF04F, 0xFCE1 + .short 0xF04D, 0xFCE7 + .short 0xF04C, 0xFCED + .short 0xF04B, 0xFCF3 + .short 0xF04A, 0xFCFA + .short 0xF049, 0xFD00 + .short 0xF048, 0xFD06 + .short 0xF046, 0xFD0C + .short 0xF045, 0xFD12 + .short 0xF044, 0xFD18 + .short 0xF043, 0xFD1F + .short 0xF042, 0xFD25 + .short 0xF041, 0xFD2B + .short 0xF040, 0xFD31 + .short 0xF03E, 0xFD37 + .short 0xF03D, 0xFD3E + .short 0xF03C, 0xFD44 + .short 0xF03B, 0xFD4A + .short 0xF03A, 0xFD50 + .short 0xF039, 0xFD56 + .short 0xF038, 0xFD5D + .short 0xF037, 0xFD63 + .short 0xF036, 0xFD69 + .short 0xF035, 0xFD6F + .short 0xF034, 0xFD75 + .short 0xF033, 0xFD7C + .short 0xF032, 0xFD82 + .short 0xF031, 0xFD88 + .short 0xF030, 0xFD8E + .short 0xF02F, 0xFD94 + .short 0xF02E, 0xFD9B + .short 0xF02D, 0xFDA1 + .short 0xF02C, 0xFDA7 + .short 0xF02B, 0xFDAD + .short 0xF02B, 0xFDB3 + .short 0xF02A, 0xFDBA + .short 0xF029, 0xFDC0 + .short 0xF028, 0xFDC6 + .short 0xF027, 0xFDCC + .short 0xF026, 0xFDD3 + .short 0xF025, 0xFDD9 + .short 0xF024, 0xFDDF + .short 0xF024, 0xFDE5 + .short 0xF023, 0xFDEB + .short 0xF022, 0xFDF2 + .short 0xF021, 0xFDF8 + .short 0xF020, 0xFDFE + .short 0xF020, 0xFE04 + .short 0xF01F, 0xFE0B + .short 0xF01E, 0xFE11 + .short 0xF01D, 0xFE17 + .short 0xF01D, 0xFE1D + .short 0xF01C, 0xFE24 + .short 0xF01B, 0xFE2A + .short 0xF01A, 0xFE30 + .short 0xF01A, 0xFE36 + .short 0xF019, 0xFE3D + .short 0xF018, 0xFE43 + .short 0xF018, 0xFE49 + .short 0xF017, 0xFE4F + .short 0xF016, 0xFE56 + .short 0xF016, 0xFE5C + .short 0xF015, 0xFE62 + .short 0xF014, 0xFE68 + .short 0xF014, 0xFE6F + .short 0xF013, 0xFE75 + .short 0xF013, 0xFE7B + .short 0xF012, 0xFE81 + .short 0xF011, 0xFE88 + .short 0xF011, 0xFE8E + .short 0xF010, 0xFE94 + .short 0xF010, 0xFE9A + .short 0xF00F, 0xFEA1 + .short 0xF00F, 0xFEA7 + .short 0xF00E, 0xFEAD + .short 0xF00E, 0xFEB3 + .short 0xF00D, 0xFEBA + .short 0xF00D, 0xFEC0 + .short 0xF00C, 0xFEC6 + .short 0xF00C, 0xFECC + .short 0xF00B, 0xFED3 + .short 0xF00B, 0xFED9 + .short 0xF00A, 0xFEDF + .short 0xF00A, 0xFEE5 + .short 0xF009, 0xFEEC + .short 0xF009, 0xFEF2 + .short 0xF008, 0xFEF8 + .short 0xF008, 0xFEFF + .short 0xF008, 0xFF05 + .short 0xF007, 0xFF0B + .short 0xF007, 0xFF11 + .short 0xF007, 0xFF18 + .short 0xF006, 0xFF1E + .short 0xF006, 0xFF24 + .short 0xF006, 0xFF2A + .short 0xF005, 0xFF31 + .short 0xF005, 0xFF37 + .short 0xF005, 0xFF3D + .short 0xF004, 0xFF44 + .short 0xF004, 0xFF4A + .short 0xF004, 0xFF50 + .short 0xF004, 0xFF56 + .short 0xF003, 0xFF5D + .short 0xF003, 0xFF63 + .short 0xF003, 0xFF69 + .short 0xF003, 0xFF70 + .short 0xF002, 0xFF76 + .short 0xF002, 0xFF7C + .short 0xF002, 0xFF82 + .short 0xF002, 0xFF89 + .short 0xF002, 0xFF8F + .short 0xF001, 0xFF95 + .short 0xF001, 0xFF9B + .short 0xF001, 0xFFA2 + .short 0xF001, 0xFFA8 + .short 0xF001, 0xFFAE + .short 0xF001, 0xFFB5 + .short 0xF001, 0xFFBB + .short 0xF000, 0xFFC1 + .short 0xF000, 0xFFC7 + .short 0xF000, 0xFFCE + .short 0xF000, 0xFFD4 + .short 0xF000, 0xFFDA + .short 0xF000, 0xFFE1 + .short 0xF000, 0xFFE7 + .short 0xF000, 0xFFED + .short 0xF000, 0xFFF3 + .short 0xF000, 0xFFFA + .short 0xF000, 0x0000 + .short 0xF000, 0x0006 + .short 0xF000, 0x000D + .short 0xF000, 0x0013 + .short 0xF000, 0x0019 + .short 0xF000, 0x001F + .short 0xF000, 0x0026 + .short 0xF000, 0x002C + .short 0xF000, 0x0032 + .short 0xF000, 0x0039 + .short 0xF000, 0x003F + .short 0xF001, 0x0045 + .short 0xF001, 0x004B + .short 0xF001, 0x0052 + .short 0xF001, 0x0058 + .short 0xF001, 0x005E + .short 0xF001, 0x0065 + .short 0xF001, 0x006B + .short 0xF002, 0x0071 + .short 0xF002, 0x0077 + .short 0xF002, 0x007E + .short 0xF002, 0x0084 + .short 0xF002, 0x008A + .short 0xF003, 0x0090 + .short 0xF003, 0x0097 + .short 0xF003, 0x009D + .short 0xF003, 0x00A3 + .short 0xF004, 0x00AA + .short 0xF004, 0x00B0 + .short 0xF004, 0x00B6 + .short 0xF004, 0x00BC + .short 0xF005, 0x00C3 + .short 0xF005, 0x00C9 + .short 0xF005, 0x00CF + .short 0xF006, 0x00D6 + .short 0xF006, 0x00DC + .short 0xF006, 0x00E2 + .short 0xF007, 0x00E8 + .short 0xF007, 0x00EF + .short 0xF007, 0x00F5 + .short 0xF008, 0x00FB + .short 0xF008, 0x0101 + .short 0xF008, 0x0108 + .short 0xF009, 0x010E + .short 0xF009, 0x0114 + .short 0xF00A, 0x011B + .short 0xF00A, 0x0121 + .short 0xF00B, 0x0127 + .short 0xF00B, 0x012D + .short 0xF00C, 0x0134 + .short 0xF00C, 0x013A + .short 0xF00D, 0x0140 + .short 0xF00D, 0x0146 + .short 0xF00E, 0x014D + .short 0xF00E, 0x0153 + .short 0xF00F, 0x0159 + .short 0xF00F, 0x015F + .short 0xF010, 0x0166 + .short 0xF010, 0x016C + .short 0xF011, 0x0172 + .short 0xF011, 0x0178 + .short 0xF012, 0x017F + .short 0xF013, 0x0185 + .short 0xF013, 0x018B + .short 0xF014, 0x0191 + .short 0xF014, 0x0198 + .short 0xF015, 0x019E + .short 0xF016, 0x01A4 + .short 0xF016, 0x01AA + .short 0xF017, 0x01B1 + .short 0xF018, 0x01B7 + .short 0xF018, 0x01BD + .short 0xF019, 0x01C3 + .short 0xF01A, 0x01CA + .short 0xF01A, 0x01D0 + .short 0xF01B, 0x01D6 + .short 0xF01C, 0x01DC + .short 0xF01D, 0x01E3 + .short 0xF01D, 0x01E9 + .short 0xF01E, 0x01EF + .short 0xF01F, 0x01F5 + .short 0xF020, 0x01FC + .short 0xF020, 0x0202 + .short 0xF021, 0x0208 + .short 0xF022, 0x020E + .short 0xF023, 0x0215 + .short 0xF024, 0x021B + .short 0xF024, 0x0221 + .short 0xF025, 0x0227 + .short 0xF026, 0x022D + .short 0xF027, 0x0234 + .short 0xF028, 0x023A + .short 0xF029, 0x0240 + .short 0xF02A, 0x0246 + .short 0xF02B, 0x024D + .short 0xF02B, 0x0253 + .short 0xF02C, 0x0259 + .short 0xF02D, 0x025F + .short 0xF02E, 0x0265 + .short 0xF02F, 0x026C + .short 0xF030, 0x0272 + .short 0xF031, 0x0278 + .short 0xF032, 0x027E + .short 0xF033, 0x0284 + .short 0xF034, 0x028B + .short 0xF035, 0x0291 + .short 0xF036, 0x0297 + .short 0xF037, 0x029D + .short 0xF038, 0x02A3 + .short 0xF039, 0x02AA + .short 0xF03A, 0x02B0 + .short 0xF03B, 0x02B6 + .short 0xF03C, 0x02BC + .short 0xF03D, 0x02C2 + .short 0xF03E, 0x02C9 + .short 0xF040, 0x02CF + .short 0xF041, 0x02D5 + .short 0xF042, 0x02DB + .short 0xF043, 0x02E1 + .short 0xF044, 0x02E8 + .short 0xF045, 0x02EE + .short 0xF046, 0x02F4 + .short 0xF048, 0x02FA + .short 0xF049, 0x0300 + .short 0xF04A, 0x0306 + .short 0xF04B, 0x030D + .short 0xF04C, 0x0313 + .short 0xF04D, 0x0319 + .short 0xF04F, 0x031F + .short 0xF050, 0x0325 + .short 0xF051, 0x032B + .short 0xF052, 0x0332 + .short 0xF054, 0x0338 + .short 0xF055, 0x033E + .short 0xF056, 0x0344 + .short 0xF058, 0x034A + .short 0xF059, 0x0350 + .short 0xF05A, 0x0356 + .short 0xF05B, 0x035D + .short 0xF05D, 0x0363 + .short 0xF05E, 0x0369 + .short 0xF05F, 0x036F + .short 0xF061, 0x0375 + .short 0xF062, 0x037B + .short 0xF064, 0x0381 + .short 0xF065, 0x0388 + .short 0xF066, 0x038E + .short 0xF068, 0x0394 + .short 0xF069, 0x039A + .short 0xF06B, 0x03A0 + .short 0xF06C, 0x03A6 + .short 0xF06D, 0x03AC + .short 0xF06F, 0x03B2 + .short 0xF070, 0x03B9 + .short 0xF072, 0x03BF + .short 0xF073, 0x03C5 + .short 0xF075, 0x03CB + .short 0xF076, 0x03D1 + .short 0xF078, 0x03D7 + .short 0xF079, 0x03DD + .short 0xF07B, 0x03E3 + .short 0xF07C, 0x03E9 + .short 0xF07E, 0x03EF + .short 0xF07F, 0x03F6 + .short 0xF081, 0x03FC + .short 0xF083, 0x0402 + .short 0xF084, 0x0408 + .short 0xF086, 0x040E + .short 0xF087, 0x0414 + .short 0xF089, 0x041A + .short 0xF08A, 0x0420 + .short 0xF08C, 0x0426 + .short 0xF08E, 0x042C + .short 0xF08F, 0x0432 + .short 0xF091, 0x0438 + .short 0xF093, 0x043E + .short 0xF094, 0x0444 + .short 0xF096, 0x044B + .short 0xF098, 0x0451 + .short 0xF099, 0x0457 + .short 0xF09B, 0x045D + .short 0xF09D, 0x0463 + .short 0xF09F, 0x0469 + .short 0xF0A0, 0x046F + .short 0xF0A2, 0x0475 + .short 0xF0A4, 0x047B + .short 0xF0A6, 0x0481 + .short 0xF0A7, 0x0487 + .short 0xF0A9, 0x048D + .short 0xF0AB, 0x0493 + .short 0xF0AD, 0x0499 + .short 0xF0AF, 0x049F + .short 0xF0B0, 0x04A5 + .short 0xF0B2, 0x04AB + .short 0xF0B4, 0x04B1 + .short 0xF0B6, 0x04B7 + .short 0xF0B8, 0x04BD + .short 0xF0BA, 0x04C3 + .short 0xF0BB, 0x04C9 + .short 0xF0BD, 0x04CF + .short 0xF0BF, 0x04D5 + .short 0xF0C1, 0x04DB + .short 0xF0C3, 0x04E1 + .short 0xF0C5, 0x04E7 + .short 0xF0C7, 0x04ED + .short 0xF0C9, 0x04F3 + .short 0xF0CB, 0x04F9 + .short 0xF0CD, 0x04FF + .short 0xF0CF, 0x0505 + .short 0xF0D1, 0x050B + .short 0xF0D3, 0x0511 + .short 0xF0D5, 0x0517 + .short 0xF0D7, 0x051D + .short 0xF0D9, 0x0523 + .short 0xF0DB, 0x0529 + .short 0xF0DD, 0x052F + .short 0xF0DF, 0x0534 + .short 0xF0E1, 0x053A + .short 0xF0E3, 0x0540 + .short 0xF0E5, 0x0546 + .short 0xF0E7, 0x054C + .short 0xF0E9, 0x0552 + .short 0xF0EB, 0x0558 + .short 0xF0ED, 0x055E + .short 0xF0EF, 0x0564 + .short 0xF0F2, 0x056A + .short 0xF0F4, 0x0570 + .short 0xF0F6, 0x0576 + .short 0xF0F8, 0x057C + .short 0xF0FA, 0x0581 + .short 0xF0FC, 0x0587 + .short 0xF0FE, 0x058D + .short 0xF101, 0x0593 + .short 0xF103, 0x0599 + .short 0xF105, 0x059F + .short 0xF107, 0x05A5 + .short 0xF109, 0x05AB + .short 0xF10C, 0x05B1 + .short 0xF10E, 0x05B6 + .short 0xF110, 0x05BC + .short 0xF112, 0x05C2 + .short 0xF115, 0x05C8 + .short 0xF117, 0x05CE + .short 0xF119, 0x05D4 + .short 0xF11C, 0x05DA + .short 0xF11E, 0x05DF + .short 0xF120, 0x05E5 + .short 0xF123, 0x05EB + .short 0xF125, 0x05F1 + .short 0xF127, 0x05F7 + .short 0xF12A, 0x05FD + .short 0xF12C, 0x0602 + .short 0xF12E, 0x0608 + .short 0xF131, 0x060E + .short 0xF133, 0x0614 + .short 0xF135, 0x061A + .short 0xF138, 0x061F + .short 0xF13A, 0x0625 + .short 0xF13D, 0x062B + .short 0xF13F, 0x0631 + .short 0xF141, 0x0637 + .short 0xF144, 0x063C + .short 0xF146, 0x0642 + .short 0xF149, 0x0648 + .short 0xF14B, 0x064E + .short 0xF14E, 0x0654 + .short 0xF150, 0x0659 + .short 0xF153, 0x065F + .short 0xF155, 0x0665 + .short 0xF158, 0x066B + .short 0xF15A, 0x0670 + .short 0xF15D, 0x0676 + .short 0xF15F, 0x067C + .short 0xF162, 0x0682 + .short 0xF165, 0x0687 + .short 0xF167, 0x068D + .short 0xF16A, 0x0693 + .short 0xF16C, 0x0699 + .short 0xF16F, 0x069E + .short 0xF171, 0x06A4 + .short 0xF174, 0x06AA + .short 0xF177, 0x06AF + .short 0xF179, 0x06B5 + .short 0xF17C, 0x06BB + .short 0xF17F, 0x06C1 + .short 0xF181, 0x06C6 + .short 0xF184, 0x06CC + .short 0xF187, 0x06D2 + .short 0xF189, 0x06D7 + .short 0xF18C, 0x06DD + .short 0xF18F, 0x06E3 + .short 0xF191, 0x06E8 + .short 0xF194, 0x06EE + .short 0xF197, 0x06F4 + .short 0xF19A, 0x06F9 + .short 0xF19C, 0x06FF + .short 0xF19F, 0x0705 + .short 0xF1A2, 0x070A + .short 0xF1A5, 0x0710 + .short 0xF1A7, 0x0715 + .short 0xF1AA, 0x071B + .short 0xF1AD, 0x0721 + .short 0xF1B0, 0x0726 + .short 0xF1B3, 0x072C + .short 0xF1B5, 0x0732 + .short 0xF1B8, 0x0737 + .short 0xF1BB, 0x073D + .short 0xF1BE, 0x0742 + .short 0xF1C1, 0x0748 + .short 0xF1C4, 0x074E + .short 0xF1C6, 0x0753 + .short 0xF1C9, 0x0759 + .short 0xF1CC, 0x075E + .short 0xF1CF, 0x0764 + .short 0xF1D2, 0x076A + .short 0xF1D5, 0x076F + .short 0xF1D8, 0x0775 + .short 0xF1DB, 0x077A + .short 0xF1DE, 0x0780 + .short 0xF1E1, 0x0785 + .short 0xF1E4, 0x078B + .short 0xF1E7, 0x0790 + .short 0xF1EA, 0x0796 + .short 0xF1ED, 0x079B + .short 0xF1F0, 0x07A1 + .short 0xF1F3, 0x07A6 + .short 0xF1F6, 0x07AC + .short 0xF1F9, 0x07B2 + .short 0xF1FC, 0x07B7 + .short 0xF1FF, 0x07BD + .short 0xF202, 0x07C2 + .short 0xF205, 0x07C8 + .short 0xF208, 0x07CD + .short 0xF20B, 0x07D2 + .short 0xF20E, 0x07D8 + .short 0xF211, 0x07DD + .short 0xF214, 0x07E3 + .short 0xF217, 0x07E8 + .short 0xF21A, 0x07EE + .short 0xF21D, 0x07F3 + .short 0xF221, 0x07F9 + .short 0xF224, 0x07FE + .short 0xF227, 0x0804 + .short 0xF22A, 0x0809 + .short 0xF22D, 0x080E + .short 0xF230, 0x0814 + .short 0xF234, 0x0819 + .short 0xF237, 0x081F + .short 0xF23A, 0x0824 + .short 0xF23D, 0x082A + .short 0xF240, 0x082F + .short 0xF244, 0x0834 + .short 0xF247, 0x083A + .short 0xF24A, 0x083F + .short 0xF24D, 0x0845 + .short 0xF250, 0x084A + .short 0xF254, 0x084F + .short 0xF257, 0x0855 + .short 0xF25A, 0x085A + .short 0xF25E, 0x085F + .short 0xF261, 0x0865 + .short 0xF264, 0x086A + .short 0xF267, 0x086F + .short 0xF26B, 0x0875 + .short 0xF26E, 0x087A + .short 0xF271, 0x087F + .short 0xF275, 0x0885 + .short 0xF278, 0x088A + .short 0xF27B, 0x088F + .short 0xF27F, 0x0895 + .short 0xF282, 0x089A + .short 0xF286, 0x089F + .short 0xF289, 0x08A5 + .short 0xF28C, 0x08AA + .short 0xF290, 0x08AF + .short 0xF293, 0x08B4 + .short 0xF297, 0x08BA + .short 0xF29A, 0x08BF + .short 0xF29E, 0x08C4 + .short 0xF2A1, 0x08C9 + .short 0xF2A4, 0x08CF + .short 0xF2A8, 0x08D4 + .short 0xF2AB, 0x08D9 + .short 0xF2AF, 0x08DE + .short 0xF2B2, 0x08E4 + .short 0xF2B6, 0x08E9 + .short 0xF2B9, 0x08EE + .short 0xF2BD, 0x08F3 + .short 0xF2C0, 0x08F8 + .short 0xF2C4, 0x08FE + .short 0xF2C7, 0x0903 + .short 0xF2CB, 0x0908 + .short 0xF2CE, 0x090D + .short 0xF2D2, 0x0912 + .short 0xF2D6, 0x0918 + .short 0xF2D9, 0x091D + .short 0xF2DD, 0x0922 + .short 0xF2E0, 0x0927 + .short 0xF2E4, 0x092C + .short 0xF2E8, 0x0931 + .short 0xF2EB, 0x0937 + .short 0xF2EF, 0x093C + .short 0xF2F2, 0x0941 + .short 0xF2F6, 0x0946 + .short 0xF2FA, 0x094B + .short 0xF2FD, 0x0950 + .short 0xF301, 0x0955 + .short 0xF305, 0x095A + .short 0xF308, 0x095F + .short 0xF30C, 0x0965 + .short 0xF310, 0x096A + .short 0xF313, 0x096F + .short 0xF317, 0x0974 + .short 0xF31B, 0x0979 + .short 0xF31F, 0x097E + .short 0xF322, 0x0983 + .short 0xF326, 0x0988 + .short 0xF32A, 0x098D + .short 0xF32E, 0x0992 + .short 0xF331, 0x0997 + .short 0xF335, 0x099C + .short 0xF339, 0x09A1 + .short 0xF33D, 0x09A6 + .short 0xF340, 0x09AB + .short 0xF344, 0x09B0 + .short 0xF348, 0x09B5 + .short 0xF34C, 0x09BA + .short 0xF350, 0x09BF + .short 0xF354, 0x09C4 + .short 0xF357, 0x09C9 + .short 0xF35B, 0x09CE + .short 0xF35F, 0x09D3 + .short 0xF363, 0x09D8 + .short 0xF367, 0x09DD + .short 0xF36B, 0x09E2 + .short 0xF36F, 0x09E7 + .short 0xF372, 0x09EC + .short 0xF376, 0x09F1 + .short 0xF37A, 0x09F6 + .short 0xF37E, 0x09FB + .short 0xF382, 0x09FF + .short 0xF386, 0x0A04 + .short 0xF38A, 0x0A09 + .short 0xF38E, 0x0A0E + .short 0xF392, 0x0A13 + .short 0xF396, 0x0A18 + .short 0xF39A, 0x0A1D + .short 0xF39E, 0x0A22 + .short 0xF3A2, 0x0A26 + .short 0xF3A6, 0x0A2B + .short 0xF3AA, 0x0A30 + .short 0xF3AE, 0x0A35 + .short 0xF3B2, 0x0A3A + .short 0xF3B6, 0x0A3F + .short 0xF3BA, 0x0A44 + .short 0xF3BE, 0x0A48 + .short 0xF3C2, 0x0A4D + .short 0xF3C6, 0x0A52 + .short 0xF3CA, 0x0A57 + .short 0xF3CE, 0x0A5C + .short 0xF3D2, 0x0A60 + .short 0xF3D6, 0x0A65 + .short 0xF3DA, 0x0A6A + .short 0xF3DE, 0x0A6F + .short 0xF3E2, 0x0A73 + .short 0xF3E7, 0x0A78 + .short 0xF3EB, 0x0A7D + .short 0xF3EF, 0x0A82 + .short 0xF3F3, 0x0A86 + .short 0xF3F7, 0x0A8B + .short 0xF3FB, 0x0A90 + .short 0xF3FF, 0x0A95 + .short 0xF404, 0x0A99 + .short 0xF408, 0x0A9E + .short 0xF40C, 0x0AA3 + .short 0xF410, 0x0AA7 + .short 0xF414, 0x0AAC + .short 0xF418, 0x0AB1 + .short 0xF41D, 0x0AB5 + .short 0xF421, 0x0ABA + .short 0xF425, 0x0ABF + .short 0xF429, 0x0AC3 + .short 0xF42E, 0x0AC8 + .short 0xF432, 0x0ACD + .short 0xF436, 0x0AD1 + .short 0xF43A, 0x0AD6 + .short 0xF43F, 0x0ADB + .short 0xF443, 0x0ADF + .short 0xF447, 0x0AE4 + .short 0xF44B, 0x0AE8 + .short 0xF450, 0x0AED + .short 0xF454, 0x0AF2 + .short 0xF458, 0x0AF6 + .short 0xF45D, 0x0AFB + .short 0xF461, 0x0AFF + .short 0xF465, 0x0B04 + .short 0xF469, 0x0B08 + .short 0xF46E, 0x0B0D + .short 0xF472, 0x0B11 + .short 0xF477, 0x0B16 + .short 0xF47B, 0x0B1B + .short 0xF47F, 0x0B1F + .short 0xF484, 0x0B24 + .short 0xF488, 0x0B28 + .short 0xF48C, 0x0B2D + .short 0xF491, 0x0B31 + .short 0xF495, 0x0B36 + .short 0xF49A, 0x0B3A + .short 0xF49E, 0x0B3E + .short 0xF4A2, 0x0B43 + .short 0xF4A7, 0x0B47 + .short 0xF4AB, 0x0B4C + .short 0xF4B0, 0x0B50 + .short 0xF4B4, 0x0B55 + .short 0xF4B9, 0x0B59 + .short 0xF4BD, 0x0B5E + .short 0xF4C2, 0x0B62 + .short 0xF4C6, 0x0B66 + .short 0xF4CA, 0x0B6B + .short 0xF4CF, 0x0B6F + .short 0xF4D3, 0x0B74 + .short 0xF4D8, 0x0B78 + .short 0xF4DC, 0x0B7C + .short 0xF4E1, 0x0B81 + .short 0xF4E5, 0x0B85 + .short 0xF4EA, 0x0B89 + .short 0xF4EF, 0x0B8E + .short 0xF4F3, 0x0B92 + .short 0xF4F8, 0x0B97 + .short 0xF4FC, 0x0B9B + .short 0xF501, 0x0B9F + .short 0xF505, 0x0BA3 + .short 0xF50A, 0x0BA8 + .short 0xF50E, 0x0BAC + .short 0xF513, 0x0BB0 + .short 0xF518, 0x0BB5 + .short 0xF51C, 0x0BB9 + .short 0xF521, 0x0BBD + .short 0xF525, 0x0BC1 + .short 0xF52A, 0x0BC6 + .short 0xF52F, 0x0BCA + .short 0xF533, 0x0BCE + .short 0xF538, 0x0BD2 + .short 0xF53D, 0x0BD7 + .short 0xF541, 0x0BDB + .short 0xF546, 0x0BDF + .short 0xF54B, 0x0BE3 + .short 0xF54F, 0x0BE8 + .short 0xF554, 0x0BEC + .short 0xF559, 0x0BF0 + .short 0xF55D, 0x0BF4 + .short 0xF562, 0x0BF8 + .short 0xF567, 0x0BFC + .short 0xF56B, 0x0C01 + .short 0xF570, 0x0C05 + .short 0xF575, 0x0C09 + .short 0xF57A, 0x0C0D + .short 0xF57E, 0x0C11 + .short 0xF583, 0x0C15 + .short 0xF588, 0x0C19 + .short 0xF58D, 0x0C1E + .short 0xF591, 0x0C22 + .short 0xF596, 0x0C26 + .short 0xF59B, 0x0C2A + .short 0xF5A0, 0x0C2E + .short 0xF5A4, 0x0C32 + .short 0xF5A9, 0x0C36 + .short 0xF5AE, 0x0C3A + .short 0xF5B3, 0x0C3E + .short 0xF5B8, 0x0C42 + .short 0xF5BC, 0x0C46 + .short 0xF5C1, 0x0C4A + .short 0xF5C6, 0x0C4E + .short 0xF5CB, 0x0C52 + .short 0xF5D0, 0x0C56 + .short 0xF5D5, 0x0C5A + .short 0xF5DA, 0x0C5E + .short 0xF5DE, 0x0C62 + .short 0xF5E3, 0x0C66 + .short 0xF5E8, 0x0C6A + .short 0xF5ED, 0x0C6E + .short 0xF5F2, 0x0C72 + .short 0xF5F7, 0x0C76 + .short 0xF5FC, 0x0C7A + .short 0xF601, 0x0C7E + .short 0xF605, 0x0C82 + .short 0xF60A, 0x0C86 + .short 0xF60F, 0x0C8A + .short 0xF614, 0x0C8E + .short 0xF619, 0x0C91 + .short 0xF61E, 0x0C95 + .short 0xF623, 0x0C99 + .short 0xF628, 0x0C9D + .short 0xF62D, 0x0CA1 + .short 0xF632, 0x0CA5 + .short 0xF637, 0x0CA9 + .short 0xF63C, 0x0CAC + .short 0xF641, 0x0CB0 + .short 0xF646, 0x0CB4 + .short 0xF64B, 0x0CB8 + .short 0xF650, 0x0CBC + .short 0xF655, 0x0CC0 + .short 0xF65A, 0x0CC3 + .short 0xF65F, 0x0CC7 + .short 0xF664, 0x0CCB + .short 0xF669, 0x0CCF + .short 0xF66E, 0x0CD2 + .short 0xF673, 0x0CD6 + .short 0xF678, 0x0CDA + .short 0xF67D, 0x0CDE + .short 0xF682, 0x0CE1 + .short 0xF687, 0x0CE5 + .short 0xF68C, 0x0CE9 + .short 0xF691, 0x0CED + .short 0xF696, 0x0CF0 + .short 0xF69B, 0x0CF4 + .short 0xF6A1, 0x0CF8 + .short 0xF6A6, 0x0CFB + .short 0xF6AB, 0x0CFF + .short 0xF6B0, 0x0D03 + .short 0xF6B5, 0x0D06 + .short 0xF6BA, 0x0D0A + .short 0xF6BF, 0x0D0E + .short 0xF6C4, 0x0D11 + .short 0xF6C9, 0x0D15 + .short 0xF6CF, 0x0D18 + .short 0xF6D4, 0x0D1C + .short 0xF6D9, 0x0D20 + .short 0xF6DE, 0x0D23 + .short 0xF6E3, 0x0D27 + .short 0xF6E8, 0x0D2A + .short 0xF6EE, 0x0D2E + .short 0xF6F3, 0x0D32 + .short 0xF6F8, 0x0D35 + .short 0xF6FD, 0x0D39 + .short 0xF702, 0x0D3C + .short 0xF708, 0x0D40 + .short 0xF70D, 0x0D43 + .short 0xF712, 0x0D47 + .short 0xF717, 0x0D4A + .short 0xF71C, 0x0D4E + .short 0xF722, 0x0D51 + .short 0xF727, 0x0D55 + .short 0xF72C, 0x0D58 + .short 0xF731, 0x0D5C + .short 0xF737, 0x0D5F + .short 0xF73C, 0x0D62 + .short 0xF741, 0x0D66 + .short 0xF746, 0x0D69 + .short 0xF74C, 0x0D6D + .short 0xF751, 0x0D70 + .short 0xF756, 0x0D74 + .short 0xF75B, 0x0D77 + .short 0xF761, 0x0D7A + .short 0xF766, 0x0D7E + .short 0xF76B, 0x0D81 + .short 0xF771, 0x0D85 + .short 0xF776, 0x0D88 + .short 0xF77B, 0x0D8B + .short 0xF781, 0x0D8F + .short 0xF786, 0x0D92 + .short 0xF78B, 0x0D95 + .short 0xF791, 0x0D99 + .short 0xF796, 0x0D9C + .short 0xF79B, 0x0D9F + .short 0xF7A1, 0x0DA2 + .short 0xF7A6, 0x0DA6 + .short 0xF7AB, 0x0DA9 + .short 0xF7B1, 0x0DAC + .short 0xF7B6, 0x0DB0 + .short 0xF7BB, 0x0DB3 + .short 0xF7C1, 0x0DB6 + .short 0xF7C6, 0x0DB9 + .short 0xF7CC, 0x0DBC + .short 0xF7D1, 0x0DC0 + .short 0xF7D6, 0x0DC3 + .short 0xF7DC, 0x0DC6 + .short 0xF7E1, 0x0DC9 + .short 0xF7E7, 0x0DCC + .short 0xF7EC, 0x0DD0 + .short 0xF7F2, 0x0DD3 + .short 0xF7F7, 0x0DD6 + .short 0xF7FC, 0x0DD9 + .short 0xF802, 0x0DDC + .short 0xF807, 0x0DDF + .short 0xF80D, 0x0DE3 + .short 0xF812, 0x0DE6 + .short 0xF818, 0x0DE9 + .short 0xF81D, 0x0DEC + .short 0xF823, 0x0DEF + .short 0xF828, 0x0DF2 + .short 0xF82E, 0x0DF5 + .short 0xF833, 0x0DF8 + .short 0xF838, 0x0DFB + .short 0xF83E, 0x0DFE + .short 0xF843, 0x0E01 + .short 0xF849, 0x0E04 + .short 0xF84E, 0x0E07 + .short 0xF854, 0x0E0A + .short 0xF85A, 0x0E0D + .short 0xF85F, 0x0E10 + .short 0xF865, 0x0E13 + .short 0xF86A, 0x0E16 + .short 0xF870, 0x0E19 + .short 0xF875, 0x0E1C + .short 0xF87B, 0x0E1F + .short 0xF880, 0x0E22 + .short 0xF886, 0x0E25 + .short 0xF88B, 0x0E28 + .short 0xF891, 0x0E2B + .short 0xF896, 0x0E2E + .short 0xF89C, 0x0E31 + .short 0xF8A2, 0x0E34 + .short 0xF8A7, 0x0E37 + .short 0xF8AD, 0x0E3A + .short 0xF8B2, 0x0E3C + .short 0xF8B8, 0x0E3F + .short 0xF8BE, 0x0E42 + .short 0xF8C3, 0x0E45 + .short 0xF8C9, 0x0E48 + .short 0xF8CE, 0x0E4B + .short 0xF8D4, 0x0E4D + .short 0xF8DA, 0x0E50 + .short 0xF8DF, 0x0E53 + .short 0xF8E5, 0x0E56 + .short 0xF8EB, 0x0E59 + .short 0xF8F0, 0x0E5B + .short 0xF8F6, 0x0E5E + .short 0xF8FB, 0x0E61 + .short 0xF901, 0x0E64 + .short 0xF907, 0x0E66 + .short 0xF90C, 0x0E69 + .short 0xF912, 0x0E6C + .short 0xF918, 0x0E6F + .short 0xF91D, 0x0E71 + .short 0xF923, 0x0E74 + .short 0xF929, 0x0E77 + .short 0xF92E, 0x0E79 + .short 0xF934, 0x0E7C + .short 0xF93A, 0x0E7F + .short 0xF93F, 0x0E81 + .short 0xF945, 0x0E84 + .short 0xF94B, 0x0E87 + .short 0xF951, 0x0E89 + .short 0xF956, 0x0E8C + .short 0xF95C, 0x0E8F + .short 0xF962, 0x0E91 + .short 0xF967, 0x0E94 + .short 0xF96D, 0x0E96 + .short 0xF973, 0x0E99 + .short 0xF979, 0x0E9B + .short 0xF97E, 0x0E9E + .short 0xF984, 0x0EA1 + .short 0xF98A, 0x0EA3 + .short 0xF990, 0x0EA6 + .short 0xF995, 0x0EA8 + .short 0xF99B, 0x0EAB + .short 0xF9A1, 0x0EAD + .short 0xF9A7, 0x0EB0 + .short 0xF9AC, 0x0EB2 + .short 0xF9B2, 0x0EB5 + .short 0xF9B8, 0x0EB7 + .short 0xF9BE, 0x0EBA + .short 0xF9C4, 0x0EBC + .short 0xF9C9, 0x0EBF + .short 0xF9CF, 0x0EC1 + .short 0xF9D5, 0x0EC3 + .short 0xF9DB, 0x0EC6 + .short 0xF9E1, 0x0EC8 + .short 0xF9E6, 0x0ECB + .short 0xF9EC, 0x0ECD + .short 0xF9F2, 0x0ECF + .short 0xF9F8, 0x0ED2 + .short 0xF9FE, 0x0ED4 + .short 0xFA03, 0x0ED6 + .short 0xFA09, 0x0ED9 + .short 0xFA0F, 0x0EDB + .short 0xFA15, 0x0EDD + .short 0xFA1B, 0x0EE0 + .short 0xFA21, 0x0EE2 + .short 0xFA26, 0x0EE4 + .short 0xFA2C, 0x0EE7 + .short 0xFA32, 0x0EE9 + .short 0xFA38, 0x0EEB + .short 0xFA3E, 0x0EEE + .short 0xFA44, 0x0EF0 + .short 0xFA4A, 0x0EF2 + .short 0xFA4F, 0x0EF4 + .short 0xFA55, 0x0EF7 + .short 0xFA5B, 0x0EF9 + .short 0xFA61, 0x0EFB + .short 0xFA67, 0x0EFD + .short 0xFA6D, 0x0EFF + .short 0xFA73, 0x0F02 + .short 0xFA79, 0x0F04 + .short 0xFA7F, 0x0F06 + .short 0xFA84, 0x0F08 + .short 0xFA8A, 0x0F0A + .short 0xFA90, 0x0F0C + .short 0xFA96, 0x0F0E + .short 0xFA9C, 0x0F11 + .short 0xFAA2, 0x0F13 + .short 0xFAA8, 0x0F15 + .short 0xFAAE, 0x0F17 + .short 0xFAB4, 0x0F19 + .short 0xFABA, 0x0F1B + .short 0xFAC0, 0x0F1D + .short 0xFAC6, 0x0F1F + .short 0xFACC, 0x0F21 + .short 0xFAD1, 0x0F23 + .short 0xFAD7, 0x0F25 + .short 0xFADD, 0x0F27 + .short 0xFAE3, 0x0F29 + .short 0xFAE9, 0x0F2B + .short 0xFAEF, 0x0F2D + .short 0xFAF5, 0x0F2F + .short 0xFAFB, 0x0F31 + .short 0xFB01, 0x0F33 + .short 0xFB07, 0x0F35 + .short 0xFB0D, 0x0F37 + .short 0xFB13, 0x0F39 + .short 0xFB19, 0x0F3B + .short 0xFB1F, 0x0F3D + .short 0xFB25, 0x0F3F + .short 0xFB2B, 0x0F41 + .short 0xFB31, 0x0F43 + .short 0xFB37, 0x0F45 + .short 0xFB3D, 0x0F46 + .short 0xFB43, 0x0F48 + .short 0xFB49, 0x0F4A + .short 0xFB4F, 0x0F4C + .short 0xFB55, 0x0F4E + .short 0xFB5B, 0x0F50 + .short 0xFB61, 0x0F51 + .short 0xFB67, 0x0F53 + .short 0xFB6D, 0x0F55 + .short 0xFB73, 0x0F57 + .short 0xFB79, 0x0F59 + .short 0xFB7F, 0x0F5A + .short 0xFB85, 0x0F5C + .short 0xFB8B, 0x0F5E + .short 0xFB91, 0x0F60 + .short 0xFB97, 0x0F61 + .short 0xFB9D, 0x0F63 + .short 0xFBA3, 0x0F65 + .short 0xFBA9, 0x0F67 + .short 0xFBAF, 0x0F68 + .short 0xFBB5, 0x0F6A + .short 0xFBBC, 0x0F6C + .short 0xFBC2, 0x0F6D + .short 0xFBC8, 0x0F6F + .short 0xFBCE, 0x0F71 + .short 0xFBD4, 0x0F72 + .short 0xFBDA, 0x0F74 + .short 0xFBE0, 0x0F76 + .short 0xFBE6, 0x0F77 + .short 0xFBEC, 0x0F79 + .short 0xFBF2, 0x0F7A + .short 0xFBF8, 0x0F7C + .short 0xFBFE, 0x0F7D + .short 0xFC04, 0x0F7F + .short 0xFC0A, 0x0F81 + .short 0xFC11, 0x0F82 + .short 0xFC17, 0x0F84 + .short 0xFC1D, 0x0F85 + .short 0xFC23, 0x0F87 + .short 0xFC29, 0x0F88 + .short 0xFC2F, 0x0F8A + .short 0xFC35, 0x0F8B + .short 0xFC3B, 0x0F8D + .short 0xFC41, 0x0F8E + .short 0xFC47, 0x0F90 + .short 0xFC4E, 0x0F91 + .short 0xFC54, 0x0F93 + .short 0xFC5A, 0x0F94 + .short 0xFC60, 0x0F95 + .short 0xFC66, 0x0F97 + .short 0xFC6C, 0x0F98 + .short 0xFC72, 0x0F9A + .short 0xFC78, 0x0F9B + .short 0xFC7F, 0x0F9C + .short 0xFC85, 0x0F9E + .short 0xFC8B, 0x0F9F + .short 0xFC91, 0x0FA1 + .short 0xFC97, 0x0FA2 + .short 0xFC9D, 0x0FA3 + .short 0xFCA3, 0x0FA5 + .short 0xFCAA, 0x0FA6 + .short 0xFCB0, 0x0FA7 + .short 0xFCB6, 0x0FA8 + .short 0xFCBC, 0x0FAA + .short 0xFCC2, 0x0FAB + .short 0xFCC8, 0x0FAC + .short 0xFCCE, 0x0FAE + .short 0xFCD5, 0x0FAF + .short 0xFCDB, 0x0FB0 + .short 0xFCE1, 0x0FB1 + .short 0xFCE7, 0x0FB3 + .short 0xFCED, 0x0FB4 + .short 0xFCF3, 0x0FB5 + .short 0xFCFA, 0x0FB6 + .short 0xFD00, 0x0FB7 + .short 0xFD06, 0x0FB8 + .short 0xFD0C, 0x0FBA + .short 0xFD12, 0x0FBB + .short 0xFD18, 0x0FBC + .short 0xFD1F, 0x0FBD + .short 0xFD25, 0x0FBE + .short 0xFD2B, 0x0FBF + .short 0xFD31, 0x0FC0 + .short 0xFD37, 0x0FC2 + .short 0xFD3E, 0x0FC3 + .short 0xFD44, 0x0FC4 + .short 0xFD4A, 0x0FC5 + .short 0xFD50, 0x0FC6 + .short 0xFD56, 0x0FC7 + .short 0xFD5D, 0x0FC8 + .short 0xFD63, 0x0FC9 + .short 0xFD69, 0x0FCA + .short 0xFD6F, 0x0FCB + .short 0xFD75, 0x0FCC + .short 0xFD7C, 0x0FCD + .short 0xFD82, 0x0FCE + .short 0xFD88, 0x0FCF + .short 0xFD8E, 0x0FD0 + .short 0xFD94, 0x0FD1 + .short 0xFD9B, 0x0FD2 + .short 0xFDA1, 0x0FD3 + .short 0xFDA7, 0x0FD4 + .short 0xFDAD, 0x0FD5 + .short 0xFDB3, 0x0FD5 + .short 0xFDBA, 0x0FD6 + .short 0xFDC0, 0x0FD7 + .short 0xFDC6, 0x0FD8 + .short 0xFDCC, 0x0FD9 + .short 0xFDD3, 0x0FDA + .short 0xFDD9, 0x0FDB + .short 0xFDDF, 0x0FDC + .short 0xFDE5, 0x0FDC + .short 0xFDEB, 0x0FDD + .short 0xFDF2, 0x0FDE + .short 0xFDF8, 0x0FDF + .short 0xFDFE, 0x0FE0 + .short 0xFE04, 0x0FE0 + .short 0xFE0B, 0x0FE1 + .short 0xFE11, 0x0FE2 + .short 0xFE17, 0x0FE3 + .short 0xFE1D, 0x0FE3 + .short 0xFE24, 0x0FE4 + .short 0xFE2A, 0x0FE5 + .short 0xFE30, 0x0FE6 + .short 0xFE36, 0x0FE6 + .short 0xFE3D, 0x0FE7 + .short 0xFE43, 0x0FE8 + .short 0xFE49, 0x0FE8 + .short 0xFE4F, 0x0FE9 + .short 0xFE56, 0x0FEA + .short 0xFE5C, 0x0FEA + .short 0xFE62, 0x0FEB + .short 0xFE68, 0x0FEC + .short 0xFE6F, 0x0FEC + .short 0xFE75, 0x0FED + .short 0xFE7B, 0x0FED + .short 0xFE81, 0x0FEE + .short 0xFE88, 0x0FEF + .short 0xFE8E, 0x0FEF + .short 0xFE94, 0x0FF0 + .short 0xFE9A, 0x0FF0 + .short 0xFEA1, 0x0FF1 + .short 0xFEA7, 0x0FF1 + .short 0xFEAD, 0x0FF2 + .short 0xFEB3, 0x0FF2 + .short 0xFEBA, 0x0FF3 + .short 0xFEC0, 0x0FF3 + .short 0xFEC6, 0x0FF4 + .short 0xFECC, 0x0FF4 + .short 0xFED3, 0x0FF5 + .short 0xFED9, 0x0FF5 + .short 0xFEDF, 0x0FF6 + .short 0xFEE5, 0x0FF6 + .short 0xFEEC, 0x0FF7 + .short 0xFEF2, 0x0FF7 + .short 0xFEF8, 0x0FF8 + .short 0xFEFF, 0x0FF8 + .short 0xFF05, 0x0FF8 + .short 0xFF0B, 0x0FF9 + .short 0xFF11, 0x0FF9 + .short 0xFF18, 0x0FF9 + .short 0xFF1E, 0x0FFA + .short 0xFF24, 0x0FFA + .short 0xFF2A, 0x0FFA + .short 0xFF31, 0x0FFB + .short 0xFF37, 0x0FFB + .short 0xFF3D, 0x0FFB + .short 0xFF44, 0x0FFC + .short 0xFF4A, 0x0FFC + .short 0xFF50, 0x0FFC + .short 0xFF56, 0x0FFC + .short 0xFF5D, 0x0FFD + .short 0xFF63, 0x0FFD + .short 0xFF69, 0x0FFD + .short 0xFF70, 0x0FFD + .short 0xFF76, 0x0FFE + .short 0xFF7C, 0x0FFE + .short 0xFF82, 0x0FFE + .short 0xFF89, 0x0FFE + .short 0xFF8F, 0x0FFE + .short 0xFF95, 0x0FFF + .short 0xFF9B, 0x0FFF + .short 0xFFA2, 0x0FFF + .short 0xFFA8, 0x0FFF + .short 0xFFAE, 0x0FFF + .short 0xFFB5, 0x0FFF + .short 0xFFBB, 0x0FFF + .short 0xFFC1, 0x1000 + .short 0xFFC7, 0x1000 + .short 0xFFCE, 0x1000 + .short 0xFFD4, 0x1000 + .short 0xFFDA, 0x1000 + .short 0xFFE1, 0x1000 + .short 0xFFE7, 0x1000 + .short 0xFFED, 0x1000 + .short 0xFFF3, 0x1000 + .short 0xFFFA, 0x1000 + + .data + + .public NNS_GfdDefaultFuncAllocTexVram +NNS_GfdDefaultFuncAllocTexVram: + .word AllocTexVram_ + .public NNS_GfdDefaultFuncFreeTexVram +NNS_GfdDefaultFuncFreeTexVram: + .word FreeTexVram_ + .public NNS_GfdDefaultFuncAllocPlttVram +NNS_GfdDefaultFuncAllocPlttVram: + .word AllocPlttVram_ + .public NNS_GfdDefaultFuncFreePlttVram +NNS_GfdDefaultFuncFreePlttVram: + .word FreePlttVram_ +_02110934: + .word _02110950 + .word _02110998 +_0211093C: + .word _021109B0 + .word _02110998 + .word _02110950 + .word _02110980 + .word _02110968 +_02110950: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 +_02110968: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00 +_02110980: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + .byte 0x02, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x00 +_02110998: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00 +_021109B0: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x04, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x06, 0x00 +_021109C8: + .word CpuLoadOAMMain_ + .word CpuLoadOAMSub_ + .word 0 + .word 0 + .word 0 +_021109DC: + .byte 0xFE, 0xFF, 0x00, 0x00 + .byte 0xFF, 0xFF, 0xFF, 0xFF +_021109E4: + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_021109FC: + .byte 0x00, 0xF0, 0xFF, 0xFF +_02110A00: + .byte 0x05, 0x00, 0x00, 0x00 +_02110A04: + .word NNSi_G3dAnmCalcNsBva +_02110A08: + .word NNSi_G3dAnmCalcNsBca + .public _02110A0C +_02110A0C: + .word NNSi_G3dAnmCalcNsBta +_02110A10: + .word NNSi_G3dAnmCalcNsBtp +_02110A14: + .word NNSi_G3dAnmCalcNsBma +_02110A18: + .word NNSi_G3dAnmBlendVis +_02110A1C: + .word NNSi_G3dAnmBlendJnt +_02110A20: + .word NNSi_G3dAnmBlendMat +_02110A24: + .byte 0x4D, 0x00, 0x41, 0x4D +_02110A28: + .word NNSi_G3dAnmObjInitNsBma + .byte 0x4D, 0x00, 0x50, 0x54 + .word NNSi_G3dAnmObjInitNsBtp + .byte 0x4D, 0x00, 0x41, 0x54 + .word NNSi_G3dAnmObjInitNsBta + .byte 0x56, 0x00, 0x41, 0x56 + .word NNSi_G3dAnmObjInitNsBva + .byte 0x4A, 0x00, 0x41, 0x43 + .word NNSi_G3dAnmObjInitNsBca + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 +_02110A74: + .word NNSi_G3dSendJointSRTBasic + .word NNSi_G3dSendJointSRTMaya + .word NNSi_G3dSendJointSRTSi3d +_02110A80: + .word NNSi_G3dGetJointScaleBasic + .word NNSi_G3dGetJointScaleMaya + .word NNSi_G3dGetJointScaleSi3d +_02110A8C: + .word NNSi_G3dSendTexSRTMaya + .word NNSi_G3dSendTexSRTSi3d + .word NNSi_G3dSendTexSRT3dsMax + .word NNSi_G3dSendTexSRTXsi +_02110A9C: + .byte 0x2A, 0x00, 0x00, 0x00 +_02110AA0: + .byte 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00 +_02110AA8: + .byte 0x00, 0x00, 0x00, 0x00 +_02110AAC: + .word NNSi_G3dFuncSbc_MAT_InternalDefault + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110ABC: + .word NNSi_G3dFuncSbc_SHP_InternalDefault + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110ACC: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 +_02110B0C: + .byte 0x12, 0x10, 0x17, 0x1B +_02110B10: + .byte 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 +_02110B18: + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 +_02110B3C: + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110B48: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 +_02110B54: + .byte 0x12, 0x10, 0x17, 0x1B +_02110B58: + .byte 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 +_02110B60: + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x10, 0x00, 0x00 +_02110B84: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110B90: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110B9C: + .word NNSi_G3dFuncSbc_NOP + .word NNSi_G3dFuncSbc_RET + .word NNSi_G3dFuncSbc_NODE + .word NNSi_G3dFuncSbc_MTX + .word NNSi_G3dFuncSbc_MAT + .word NNSi_G3dFuncSbc_SHP + .word NNSi_G3dFuncSbc_NODEDESC + .word NNSi_G3dFuncSbc_BB + .word NNSi_G3dFuncSbc_BBY + .word NNSi_G3dFuncSbc_NODEMIX + .word NNSi_G3dFuncSbc_CALLDL + .word NNSi_G3dFuncSbc_POSSCALE + .word NNSi_G3dFuncSbc_ENVMAP + .word NNSi_G3dFuncSbc_PRJMAP + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 + .word 0x00000000 +_02110C1C: + .word texmtxCalc_flag_ + .word texmtxCalc_flagS_ + .word texmtxCalc_flagR_ + .word texmtxCalc_flagRS_ + .word texmtxCalc_flagT_ + .word texmtxCalc_flagTS_ + .word texmtxCalc_flagTR_ + .word texmtxCalc_flagTRS_ +_02110C3C: + .word texmtxCalc_flag___3dsmax + .word texmtxCalc_flagS___3dsmax + .word texmtxCalc_flagR___3dsmax + .word texmtxCalc_flagRS___3dsmax + .word texmtxCalc_flagT___3dsmax + .word texmtxCalc_flagTS___3dsmax + .word texmtxCalc_flagTR___3dsmax + .word texmtxCalc_flagTRS___3dsmax +_02110C5C: + .word texmtxCalc_flag___xsi + .word texmtxCalc_flagS___xsi + .word texmtxCalc_flagR___xsi + .word texmtxCalc_flagRS___xsi + .word texmtxCalc_flagT___xsi + .word texmtxCalc_flagTS___xsi + .word texmtxCalc_flagTR___xsi + .word texmtxCalc_flagTRS___xsi diff --git a/lib/asm/overlay_123.s b/lib/asm/overlay_123.s new file mode 100644 index 00000000..f9273b64 --- /dev/null +++ b/lib/asm/overlay_123.s @@ -0,0 +1,2049 @@ + .include "asm/macros.inc" + .include "overlay_123.inc" + .include "global.inc" + + ; This overlay has multiple levels of encryption for some reason. + ; Note to future decompilers using asmdiff: you will need to + ; compare against the *decrypted* version of this overlay's SBIN + ; should you hit any nonmatches. + + .text + .balign 4, 0 + + arm_func_start ov123_0225F020 +ov123_0225F020: ; 0x0225F020 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + ldr r2, [pc, #156] ; _0225F0CC + ldr r1, [pc, #156] ; _0225F0D0 + mov sl, #0 + adds r2, r2, #800 ; 0x320 + add r1, r1, #800 ; 0x320 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + beq _0225F0A0 + ldr r4, [pc, #116] ; _0225F0D4 + mov r5, sl + mov r6, #1 + add r7, sp, #0 +_0225F068: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F068 +_0225F0A0: + and r0, r8, sl + movs r0, r0, asr #1 + movne r4, #1 + moveq r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F0C0 + blx fp +_0225F0C0: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F0CC: .word ov123_0226068C + 0x1300 +_0225F0D0: .word ov123_0225FC14 + 0x1300 +_0225F0D4: .word 0xFFFFE9E0 + arm_func_end ov123_0225F020 + + arm_func_start ov123_0225F0D8 +ov123_0225F0D8: ; 0x0225F0D8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + ldr r2, [pc, #156] ; _0225F184 + ldr r1, [pc, #156] ; _0225F188 + mov sl, #0 + adds r2, r2, #800 ; 0x320 + add r1, r1, #800 ; 0x320 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + beq _0225F158 + ldr r4, [pc, #116] ; _0225F18C + mov r5, sl + mov r6, #1 + add r7, sp, #0 +_0225F120: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F120 +_0225F158: + mov r0, r8, asr #1 + cmp r0, sl, asr #1 + moveq r4, #1 + movne r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F178 + blx fp +_0225F178: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F184: .word ov123_02260704 + 0x1300 +_0225F188: .word ov123_0225FC8C + 0x1300 +_0225F18C: .word 0xFFFFE9E0 + arm_func_end ov123_0225F0D8 + + arm_func_start ov123_0225F190 +ov123_0225F190: ; 0x0225F190 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + ldr r2, [pc, #156] ; _0225F23C + ldr r1, [pc, #156] ; _0225F240 + mov sl, #0 + adds r2, r2, #800 ; 0x320 + add r1, r1, #800 ; 0x320 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + beq _0225F210 + ldr r4, [pc, #116] ; _0225F244 + mov r5, sl + mov r6, #1 + add r7, sp, #0 +_0225F1D8: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F1D8 +_0225F210: + and r0, r8, sl + movs r0, r0, asr #1 + movne r4, #1 + moveq r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F230 + blx fp +_0225F230: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F23C: .word ov123_02260148 + 0x1300 +_0225F240: .word ov123_0225FB24 + 0x1300 +_0225F244: .word 0xFFFFE9E0 + arm_func_end ov123_0225F190 + + arm_func_start ov123_0225F248 +ov123_0225F248: ; 0x0225F248 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + ldr r2, [pc, #156] ; _0225F2F4 + ldr r1, [pc, #156] ; _0225F2F8 + mov sl, #0 + adds r2, r2, #800 ; 0x320 + add r1, r1, #800 ; 0x320 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp, #8] + str r2, [sp] + str r1, [sp, #4] + beq _0225F2C8 + ldr r4, [pc, #116] ; _0225F2FC + mov r5, sl + mov r6, #1 + add r7, sp, #0 +_0225F290: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F290 +_0225F2C8: + mov r0, r8, asr #1 + cmp r0, sl, asr #1 + moveq r4, #1 + movne r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F2E8 + blx fp +_0225F2E8: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F2F4: .word ov123_022601C0 + 0x1300 +_0225F2F8: .word ov123_0225FB9C + 0x1300 +_0225F2FC: .word 0xFFFFE9E0 + arm_func_end ov123_0225F248 + + arm_func_start ov123_0225F300 +ov123_0225F300: ; 0x0225F300 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + movs sl, #0 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp] + beq _0225F368 + ldr r4, [pc, #108] ; _0225F394 + mov r5, #0 + mov r6, #1 + add r7, sp, #0 +_0225F330: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F330 +_0225F368: + and r0, r8, sl + movs r0, r0, asr #1 + movne r4, #1 + moveq r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F388 + blx fp +_0225F388: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F394: .word 0xFFFFE9E0 + arm_func_end ov123_0225F300 + + arm_func_start ov123_0225F398 +ov123_0225F398: ; 0x0225F398 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #128 ; 0x80 + movs sl, #0 + mov fp, r0 + mov r8, sl + mov r9, sl + str sl, [sp] + beq _0225F400 + ldr r4, [pc, #108] ; _0225F42C + mov r5, #0 + mov r6, #1 + add r7, sp, #0 +_0225F3C8: + ldr r0, [r7, r9, lsl #2] + add r0, r0, r4 + blx r0 + cmp r0, #0 + movne r1, r6 + add r9, r9, #1 + moveq r1, r5 + add r2, r8, r1 + ldr r0, [r7, r9, lsl #2] + add r1, sl, #1 + cmp r0, #0 + mov r8, r2, lsl #1 + mov sl, r1, lsl #1 + bne _0225F3C8 +_0225F400: + mov r0, r8, asr #1 + cmp r0, sl, asr #1 + moveq r4, #1 + movne r4, #0 + cmp fp, #0 + cmpne r4, #0 + beq _0225F420 + blx fp +_0225F420: + mov r0, r4 + add sp, sp, #128 ; 0x80 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_0225F42C: .word 0xFFFFE9E0 + arm_func_end ov123_0225F398 + + arm_func_start ov123_0225F430 +ov123_0225F430: ; 0x0225F430 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F4A4 + adr r3, _0225F498 + str lr, [r3] + ldr r2, _0225F49C + ldr r0, _0225F4A0 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F4A4 + ldr r2, _0225F49C + ldr r0, _0225F4A0 + bl ov123_0225FF30 + str r0, _0225F4A0 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F498 + str pc, _0225F498 + bx lr +_0225F498: .word _02260C00+1 +_0225F49C: .word 0xAC +_0225F4A0: .word 0x6AB2 +_0225F4A4: .word ov123_0225F020 + arm_func_end ov123_0225F430 + + arm_func_start ov123_0225F4A8 +ov123_0225F4A8: ; 0x0225F4A8 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F51C + adr r3, _0225F510 + str lr, [r3] + ldr r2, _0225F514 + ldr r0, _0225F518 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F51C + ldr r2, _0225F514 + ldr r0, _0225F518 + bl ov123_0225FF30 + str r0, _0225F518 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F510 + str pc, _0225F510 + bx lr +_0225F510: .word _02260C00+1 +_0225F514: .word 0xAC +_0225F518: .word 0x6AB2 +_0225F51C: .word ov123_0225F0D8 + arm_func_end ov123_0225F4A8 + + arm_func_start ov123_0225F520 +ov123_0225F520: ; 0x0225F520 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F594 + adr r3, _0225F588 + str lr, [r3] + ldr r2, _0225F58C + ldr r0, _0225F590 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F594 + ldr r2, _0225F58C + ldr r0, _0225F590 + bl ov123_0225FF30 + str r0, _0225F590 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F588 + str pc, _0225F588 + bx lr +_0225F588: .word _02260C00+1 +_0225F58C: .word 0xAC +_0225F590: .word 0x6AB2 +_0225F594: .word ov123_0225F190 + arm_func_end ov123_0225F520 + + arm_func_start ov123_0225F598 +ov123_0225F598: ; 0x0225F598 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F60C + adr r3, _0225F600 + str lr, [r3] + ldr r2, _0225F604 + ldr r0, _0225F608 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F60C + ldr r2, _0225F604 + ldr r0, _0225F608 + bl ov123_0225FF30 + str r0, _0225F608 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F600 + str pc, _0225F600 + bx lr +_0225F600: .word _02260C00+1 +_0225F604: .word 0xAC +_0225F608: .word 0x6AB2 +_0225F60C: .word ov123_0225F248 + arm_func_end ov123_0225F598 + + arm_func_start ov123_0225F610 +ov123_0225F610: ; 0x0225F610 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F684 + adr r3, _0225F678 + str lr, [r3] + ldr r2, _0225F67C + ldr r0, _0225F680 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F684 + ldr r2, _0225F67C + ldr r0, _0225F680 + bl ov123_0225FF30 + str r0, _0225F680 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F678 + str pc, _0225F678 + bx lr +_0225F678: .word _02260C00+1 +_0225F67C: .word 0x94 +_0225F680: .word 0x6AB2 +_0225F684: .word ov123_0225F300 + arm_func_end ov123_0225F610 + + arm_func_start ov123_0225F688 +ov123_0225F688: ; 0x0225F688 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225F6FC + adr r3, _0225F6F0 + str lr, [r3] + ldr r2, _0225F6F4 + ldr r0, _0225F6F8 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225F6FC + ldr r2, _0225F6F4 + ldr r0, _0225F6F8 + bl ov123_0225FF30 + str r0, _0225F6F8 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225F6F0 + str pc, _0225F6F0 + bx lr +_0225F6F0: .word _02260C00+1 +_0225F6F4: .word 0x94 +_0225F6F8: .word 0x6AB2 +_0225F6FC: .word ov123_0225F398 + arm_func_end ov123_0225F688 + + arm_func_start ov123_0225F700 +ov123_0225F700: ; 0x0225F700 + stmdb sp!, {lr} + adr r0, _0225F710 + bl ov123_0225FD98 + ldmia sp!, {pc} +_0225F710: + .word ov123_0225F430, 0x68 + .word ov123_0225F4A8, 0x68 + .word ov123_0225F520, 0x68 + .word ov123_0225F598, 0x68 + .word ov123_0225F610, 0x68 + .word ov123_0225F688, 0x68 + .word 0, 0 + arm_func_end ov123_0225F700 + +_0225F748: + .word ov123_02260BBC + 0x1300 + + arm_func_start ov123_0225F74C +ov123_0225F74C: ; 0x0225F74C + ldr r0, [pc, #204] ; _0225F820 + sub r0, r0, #9728 ; 0x2600 + add r1, r0, #4096 ; 0x1000 + ldrb r2, [r1, #768] ; 0x300 + add r0, r0, #1 + cmp r2, #240 ; 0xf0 + bxne lr + ldrb r2, [r1, #769] ; 0x301 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #770] ; 0x302 + cmp r2, #45 ; 0x2d + bxne lr + ldrb r2, [r1, #771] ; 0x303 + cmp r2, #233 ; 0xe9 + bxne lr + ldrb r2, [r1, #772] ; 0x304 + cmp r2, #15 + bxne lr + ldrb r2, [r1, #773] ; 0x305 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #774] ; 0x306 + cmp r2, #45 ; 0x2d + bxne lr + ldrb r2, [r1, #775] ; 0x307 + cmp r2, #233 ; 0xe9 + bxne lr + ldrb r2, [r1, #776] ; 0x308 + cmp r2, #240 ; 0xf0 + bxne lr + ldrb r2, [r1, #777] ; 0x309 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #778] ; 0x30a + cmp r2, #189 ; 0xbd + bxne lr + ldrb r2, [r1, #779] ; 0x30b + cmp r2, #232 ; 0xe8 + bxne lr + ldrb r2, [r1, #780] ; 0x30c + cmp r2, #96 ; 0x60 + bxne lr + ldrb r2, [r1, #781] ; 0x30d + cmp r2, #16 + bxne lr + ldrb r2, [r1, #782] ; 0x30e + cmp r2, #159 ; 0x9f + bxne lr + ldrb r1, [r1, #783] ; 0x30f + cmp r1, #229 ; 0xe5 + moveq r0, #0 + bx lr +_0225F820: .word ov123_02260148 + 0x1300 + arm_func_end ov123_0225F74C + + arm_func_start ov123_0225F824 +ov123_0225F824: ; 0x0225F824 + ldr r0, [pc, #264] ; _0225F934 + sub r0, r0, #9728 ; 0x2600 + add r1, r0, #4096 ; 0x1000 + ldrb r2, [r1, #768] ; 0x300 + cmp r2, #240 ; 0xf0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #769] ; 0x301 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #770] ; 0x302 + cmp r2, #45 ; 0x2d + movne r0, #0 + bxne lr + ldrb r2, [r1, #771] ; 0x303 + cmp r2, #233 ; 0xe9 + movne r0, #0 + bxne lr + ldrb r2, [r1, #772] ; 0x304 + cmp r2, #15 + movne r0, #0 + bxne lr + ldrb r2, [r1, #773] ; 0x305 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #774] ; 0x306 + cmp r2, #45 ; 0x2d + movne r0, #0 + bxne lr + ldrb r2, [r1, #775] ; 0x307 + cmp r2, #233 ; 0xe9 + movne r0, #0 + bxne lr + ldrb r2, [r1, #776] ; 0x308 + cmp r2, #240 ; 0xf0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #777] ; 0x309 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #778] ; 0x30a + cmp r2, #189 ; 0xbd + movne r0, #0 + bxne lr + ldrb r2, [r1, #779] ; 0x30b + cmp r2, #232 ; 0xe8 + movne r0, #0 + bxne lr + ldrb r2, [r1, #780] ; 0x30c + cmp r2, #96 ; 0x60 + movne r0, #0 + bxne lr + ldrb r2, [r1, #781] ; 0x30d + cmp r2, #16 + movne r0, #0 + bxne lr + ldrb r2, [r1, #782] ; 0x30e + cmp r2, #159 ; 0x9f + movne r0, #0 + bxne lr + ldrb r1, [r1, #783] ; 0x30f + cmp r1, #229 ; 0xe5 + movne r0, #0 + addeq r0, r0, #1 + bx lr +_0225F934: .word ov123_022601C0 + 0x1300 + arm_func_end ov123_0225F824 + + arm_func_start ov123_0225F938 +ov123_0225F938: ; 0x0225F938 + ldr r0, [pc, #204] ; _0225FA0C + sub r0, r0, #9728 ; 0x2600 + add r1, r0, #4096 ; 0x1000 + ldrb r2, [r1, #768] ; 0x300 + add r0, r0, #1 + cmp r2, #240 ; 0xf0 + bxne lr + ldrb r2, [r1, #769] ; 0x301 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #770] ; 0x302 + cmp r2, #45 ; 0x2d + bxne lr + ldrb r2, [r1, #771] ; 0x303 + cmp r2, #233 ; 0xe9 + bxne lr + ldrb r2, [r1, #772] ; 0x304 + cmp r2, #15 + bxne lr + ldrb r2, [r1, #773] ; 0x305 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #774] ; 0x306 + cmp r2, #45 ; 0x2d + bxne lr + ldrb r2, [r1, #775] ; 0x307 + cmp r2, #233 ; 0xe9 + bxne lr + ldrb r2, [r1, #776] ; 0x308 + cmp r2, #240 ; 0xf0 + bxne lr + ldrb r2, [r1, #777] ; 0x309 + cmp r2, #0 + bxne lr + ldrb r2, [r1, #778] ; 0x30a + cmp r2, #189 ; 0xbd + bxne lr + ldrb r2, [r1, #779] ; 0x30b + cmp r2, #232 ; 0xe8 + bxne lr + ldrb r2, [r1, #780] ; 0x30c + cmp r2, #96 ; 0x60 + bxne lr + ldrb r2, [r1, #781] ; 0x30d + cmp r2, #16 + bxne lr + ldrb r2, [r1, #782] ; 0x30e + cmp r2, #159 ; 0x9f + bxne lr + ldrb r1, [r1, #783] ; 0x30f + cmp r1, #229 ; 0xe5 + moveq r0, #0 + bx lr +_0225FA0C: .word ov123_0226068C + 0x1300 + arm_func_end ov123_0225F938 + + arm_func_start ov123_0225FA10 +ov123_0225FA10: ; 0x0225FA10 + ldr r0, [pc, #264] ; _0225FB20 + sub r0, r0, #9728 ; 0x2600 + add r1, r0, #4096 ; 0x1000 + ldrb r2, [r1, #768] ; 0x300 + cmp r2, #240 ; 0xf0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #769] ; 0x301 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #770] ; 0x302 + cmp r2, #45 ; 0x2d + movne r0, #0 + bxne lr + ldrb r2, [r1, #771] ; 0x303 + cmp r2, #233 ; 0xe9 + movne r0, #0 + bxne lr + ldrb r2, [r1, #772] ; 0x304 + cmp r2, #15 + movne r0, #0 + bxne lr + ldrb r2, [r1, #773] ; 0x305 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #774] ; 0x306 + cmp r2, #45 ; 0x2d + movne r0, #0 + bxne lr + ldrb r2, [r1, #775] ; 0x307 + cmp r2, #233 ; 0xe9 + movne r0, #0 + bxne lr + ldrb r2, [r1, #776] ; 0x308 + cmp r2, #240 ; 0xf0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #777] ; 0x309 + cmp r2, #0 + movne r0, #0 + bxne lr + ldrb r2, [r1, #778] ; 0x30a + cmp r2, #189 ; 0xbd + movne r0, #0 + bxne lr + ldrb r2, [r1, #779] ; 0x30b + cmp r2, #232 ; 0xe8 + movne r0, #0 + bxne lr + ldrb r2, [r1, #780] ; 0x30c + cmp r2, #96 ; 0x60 + movne r0, #0 + bxne lr + ldrb r2, [r1, #781] ; 0x30d + cmp r2, #16 + movne r0, #0 + bxne lr + ldrb r2, [r1, #782] ; 0x30e + cmp r2, #159 ; 0x9f + movne r0, #0 + bxne lr + ldrb r1, [r1, #783] ; 0x30f + cmp r1, #229 ; 0xe5 + movne r0, #0 + addeq r0, r0, #1 + bx lr +_0225FB20: .word ov123_02260704 + 0x1300 + arm_func_end ov123_0225FA10 + + arm_func_start ov123_0225FB24 +ov123_0225FB24: ; 0x0225FB24 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225FB98 + adr r3, _0225FB8C + str lr, [r3] + ldr r2, _0225FB90 + ldr r0, _0225FB94 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225FB98 + ldr r2, _0225FB90 + ldr r0, _0225FB94 + bl ov123_0225FF30 + str r0, _0225FB94 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225FB8C + str pc, _0225FB8C + bx lr +_0225FB8C: .word _02260C00+1 +_0225FB90: .word 0xD4 +_0225FB94: .word 0x9785 +_0225FB98: .word ov123_0225F74C + arm_func_end ov123_0225FB24 + + arm_func_start ov123_0225FB9C +ov123_0225FB9C: ; 0x0225FB9C + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225FC10 + adr r3, _0225FC04 + str lr, [r3] + ldr r2, _0225FC08 + ldr r0, _0225FC0C + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225FC10 + ldr r2, _0225FC08 + ldr r0, _0225FC0C + bl ov123_0225FF30 + str r0, _0225FC0C + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225FC04 + str pc, _0225FC04 + bx lr +_0225FC04: .word _02260C00+1 +_0225FC08: .word 0x110 +_0225FC0C: .word 0x9785 +_0225FC10: .word ov123_0225F824 + arm_func_end ov123_0225FB9C + + arm_func_start ov123_0225FC14 +ov123_0225FC14: ; 0x0225FC14 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225FC88 + adr r3, _0225FC7C + str lr, [r3] + ldr r2, _0225FC80 + ldr r0, _0225FC84 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225FC88 + ldr r2, _0225FC80 + ldr r0, _0225FC84 + bl ov123_0225FF30 + str r0, _0225FC84 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225FC7C + str pc, _0225FC7C + bx lr +_0225FC7C: .word _02260C00+1 +_0225FC80: .word 0xD4 +_0225FC84: .word 0x9785 +_0225FC88: .word ov123_0225F938 + arm_func_end ov123_0225FC14 + + arm_func_start ov123_0225FC8C +ov123_0225FC8C: ; 0x0225FC8C + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _0225FD00 + adr r3, _0225FCF4 + str lr, [r3] + ldr r2, _0225FCF8 + ldr r0, _0225FCFC + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _0225FD00 + ldr r2, _0225FCF8 + ldr r0, _0225FCFC + bl ov123_0225FF30 + str r0, _0225FCFC + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0225FCF4 + str pc, _0225FCF4 + bx lr +_0225FCF4: .word _02260C00+1 +_0225FCF8: .word 0x110 +_0225FCFC: .word 0x9785 +_0225FD00: .word ov123_0225FA10 + arm_func_end ov123_0225FC8C + + arm_func_start ov123_0225FD04 +ov123_0225FD04: ; 0x0225FD04 + stmdb sp!, {lr} + adr r0, _0225FD14 + bl ov123_0225FD98 + ldmia sp!, {pc} +_0225FD14: + .word ov123_0225FB24, 0x68 + .word ov123_0225FB9C, 0x68 + .word ov123_0225FC14, 0x68 + .word ov123_0225FC8C, 0x68 + .word 0, 0 + arm_func_end ov123_0225FD04 + + arm_func_start ov123_0225FD3C +ov123_0225FD3C: ; 0x0225FD3C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl DC_FlushRange + mov r0, r5 + mov r1, r4 + bl IC_InvalidateRange + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov123_0225FD3C + + arm_func_start ov123_0225FD5C +ov123_0225FD5C: ; 0x0225FD5C + mov r0, r0, lsr #0x18 + and r1, r0, #0xff + and r0, r1, #0xe + cmp r0, #0xa + bne _0225FD90 + and r0, r1, #0xf0 + cmp r0, #0xf0 + moveq r0, #1 + bxeq lr + tst r1, #1 + movne r0, #2 + moveq r0, #3 + bx lr +_0225FD90: + mov r0, #0 + bx lr + arm_func_end ov123_0225FD5C + + arm_func_start ov123_0225FD98 +ov123_0225FD98: ; 0x0225FD98 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs r8, r0 + ldrne r1, [r8] + cmpne r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r6, _0225FEA0 ; =SDK_OVERLAY_OV_123_BSS_START +_0225FDB0: + ldr r0, [r8, #4] + cmp r1, #0 + sub r0, r0, r6 + sub r4, r0, #0x1300 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + sub r7, r1, #0x1300 + bic r0, r4, #3 + add r5, r7, r0 + cmp r7, r5 + bhs _0225FE80 + ldr sb, _0225FEA4 ; =0xFFFFFB3E +_0225FDDC: + ldr r0, [r7] + bl ov123_0225FD5C + cmp r0, #1 + cmpne r0, #2 + beq _0225FDFC + cmp r0, #3 + beq _0225FE20 + b _0225FE44 +_0225FDFC: + ldr r1, [r7] + bic r0, r1, #0xff000000 + and r1, r1, #0xff000000 + sub r0, r0, #0x1300 + eor r1, r1, #0x1000000 + bic r0, r0, #0xff000000 + orr r0, r1, r0 + str r0, [r7] + b _0225FE74 +_0225FE20: + ldr r1, [r7] + bic r0, r1, #0xff000000 + and r1, r1, #0xff000000 + add r0, r0, sb + eor r1, r1, #0x1000000 + bic r0, r0, #0xff000000 + orr r0, r1, r0 + str r0, [r7] + b _0225FE74 +_0225FE44: + ldrb r2, [r7] + ldrb r1, [r7, #1] + ldrb r3, [r7, #2] + ldrb r0, [r7, #3] + eor r2, r2, #0x56 + eor r1, r1, #0x65 + eor r3, r3, #0x56 + orr r1, r2, r1, lsl #8 + eor r2, r0, #0xf0 + orr r0, r1, r3, lsl #16 + orr r0, r0, r2, lsl #24 + str r0, [r7] +_0225FE74: + add r7, r7, #4 + cmp r7, r5 + blo _0225FDDC +_0225FE80: + ldr r0, [r8] + mov r1, r4 + sub r0, r0, #0x1300 + bl ov123_0225FD3C + ldr r1, [r8, #8]! + cmp r1, #0 + bne _0225FDB0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .balign 4, 0 +_0225FEA0: .word _02260C00 +_0225FEA4: .word 0xFFFFFB3E + arm_func_end ov123_0225FD98 + + arm_func_start ov123_0225FEA8 +ov123_0225FEA8: ; 0x0225FEA8 + stmdb sp!, {r3-r7, lr} + sub sp, sp, #0x10 + ldr r3, _0225FF2C + mov r5, r1 + add r1, r3, #0x1300 + sub r6, r0, r1 + mov r4, r2 + sub r4, r4, r1 + mov r2, r6, lsr #0x18 + mov r0, r6, lsr #0x8 + orr r0, r0, r6, lsl #0x18 + eor ip, r4, r0 + eor r7, r6, r4 + mov r1, r6, lsr #0x10 + orr r3, r2, r6, lsl #0x8 + orr r2, r1, r6, lsl #0x10 + eor r6, r4, r3 + eor lr, r4, r2 + sub r1, r5, #0x1300 + add r0, sp, #0 + mov r2, r1 + mov r3, r4 + str r7, [sp] + str r6, [sp, #4] + str lr, [sp, #8] + str ip, [sp, #12] + bl ov123_02260B14 + mov r1, r4 + sub r0, r5, #0x1300 + bl ov123_0225FD3C + sub r0, r5, #0x1300 + add sp, sp, #0x10 + ldmfd sp!, {r3-r7, pc} +_0225FF2C: .word _02260C00 + arm_func_end ov123_0225FEA8 + + arm_func_start ov123_0225FF30 +ov123_0225FF30: ; 0x0225FF30 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #16 + ldr r3, [pc, #124] ; _0225FFBC + mov r7, r0 + add r4, r3, #4864 ; 0x1300 + mov r6, r1 + sub r0, r7, r4 + add r7, r0, r6, lsr #20 + mov r5, r2 + mov r2, r7, lsr #24 + sub r5, r5, r4 + mov r0, r7, lsr #8 + orr r3, r2, r7, lsl #8 + mov r1, r7, lsr #16 + orr r2, r1, r7, lsl #16 + eor lr, r5, r3 + eor ip, r7, r5 + eor r3, r5, r2 + sub r1, r6, #4864 ; 0x1300 + str r3, [sp, #8] + orr r0, r0, r7, lsl #24 + str ip, [sp] + eor ip, r5, r0 + add r0, sp, #0 + mov r2, r1 + mov r3, r5 + str lr, [sp, #4] + str ip, [sp, #12] + bl ov123_02260ABC + mov r1, r5 + sub r0, r6, #4864 ; 0x1300 + bl ov123_0225FD3C + add r0, r7, r4 + add sp, sp, #16 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_0225FFBC: .word _02260C00 + arm_func_end ov123_0225FF30 + + arm_func_start ov123_0225FFC0 +ov123_0225FFC0: ; 0x0225FFC0 + stmdb sp!, {lr} + adr r0, _0225FFD0 + bl ov123_0225FD98 + ldmia sp!, {pc} +_0225FFD0: + .word ov123_0225FF30, 0x8C + .word ov123_0225FEA8, 0x84 + .word 0, 0 + arm_func_end ov123_0225FFC0 + + arm_func_start ov123_0225FFE8 +ov123_0225FFE8: ; 0x0225FFE8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #92 ; 0x5c + add r0, sp, #0 + bl OS_GetMacAddress + ldr r3, [pc, #148] ; _02260094 + add r2, sp, #0 + mov r4, #0 +_02260004: + ldrb r0, [r2] + ldrb r1, [r3] + eor r0, r0, #255 ; 0xff + cmp r1, r0 + bne _0226002C + add r4, r4, #1 + cmp r4, #6 + add r2, r2, #1 + add r3, r3, #1 + blt _02260004 +_0226002C: + add r0, sp, #6 + bl OS_GetOwnerInfo + cmp r4, #6 + ldreqb r0, [sp, #8] + cmpeq r0, #1 + ldreqb r0, [sp, #9] + cmpeq r0, #1 + ldreqh r0, [sp, #32] + cmpeq r0, #0 + addeq sp, sp, #92 ; 0x5c + moveq r0, #1 + ldmeqia sp!, {r3, r4, pc} + add r1, sp, #0 + mov r2, #0 +_02260064: + ldrb r0, [r1] + cmp r0, #0 + addne sp, sp, #92 ; 0x5c + movne r0, #0 + ldmneia sp!, {r3, r4, pc} + add r2, r2, #1 + cmp r2, #6 + add r1, r1, #1 + blt _02260064 + mov r0, #1 + add sp, sp, #92 ; 0x5c + ldmia sp!, {r3, r4, pc} +_02260094: .word _02260BD4 + arm_func_end ov123_0225FFE8 + + arm_func_start ov123_02260098 +ov123_02260098: ; 0x02260098 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #92 ; 0x5c + add r0, sp, #0 + bl OS_GetMacAddress + ldr r3, [pc, #148] ; _02260144 + add r2, sp, #0 + mov r4, #0 +_022600B4: + ldrb r0, [r2] + ldrb r1, [r3] + eor r0, r0, #255 ; 0xff + cmp r1, r0 + bne _022600DC + add r4, r4, #1 + cmp r4, #6 + add r2, r2, #1 + add r3, r3, #1 + blt _022600B4 +_022600DC: + add r0, sp, #6 + bl OS_GetOwnerInfo + cmp r4, #6 + ldreqb r0, [sp, #8] + cmpeq r0, #1 + ldreqb r0, [sp, #9] + cmpeq r0, #1 + ldreqh r0, [sp, #32] + cmpeq r0, #0 + addeq sp, sp, #92 ; 0x5c + moveq r0, #0 + ldmeqia sp!, {r3, r4, pc} + add r1, sp, #0 + mov r2, #0 +_02260114: + ldrb r0, [r1] + cmp r0, #0 + addne sp, sp, #92 ; 0x5c + movne r0, #1 + ldmneia sp!, {r3, r4, pc} + add r2, r2, #1 + cmp r2, #6 + add r1, r1, #1 + blt _02260114 + mov r0, #0 + add sp, sp, #92 ; 0x5c + ldmia sp!, {r3, r4, pc} +_02260144: .word _02260BD4 + arm_func_end ov123_02260098 + + arm_func_start ov123_02260148 +ov123_02260148: ; 0x02260148 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _022601BC + adr r3, _022601B0 + str lr, [r3] + ldr r2, _022601B4 + ldr r0, _022601B8 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _022601BC + ldr r2, _022601B4 + ldr r0, _022601B8 + bl ov123_0225FF30 + str r0, _022601B8 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _022601B0 + str pc, _022601B0 + bx lr +_022601B0: .word _02260C00+1 +_022601B4: .word 0xAC +_022601B8: .word 0x982 +_022601BC: .word ov123_0225FFE8 + arm_func_end ov123_02260148 + + arm_func_start ov123_022601C0 +ov123_022601C0: ; 0x022601C0 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _02260234 + adr r3, _02260228 + str lr, [r3] + ldr r2, _0226022C + ldr r0, _02260230 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _02260234 + ldr r2, _0226022C + ldr r0, _02260230 + bl ov123_0225FF30 + str r0, _02260230 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _02260228 + str pc, _02260228 + bx lr +_02260228: .word _02260C00+1 +_0226022C: .word 0xAC +_02260230: .word 0x982 +_02260234: .word ov123_02260098 + arm_func_end ov123_022601C0 + + arm_func_start ov123_02260238 +ov123_02260238: ; 0x02260238 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #8 + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl OS_GetLockID + mov r0, r0, lsl #16 + mov fp, r0, lsr #16 + mov r0, fp + bl CARD_LockRom + ldr r7, [pc, #332] ; _022603B4 + mov r0, #1 + ldrh lr, [r7] + ldrh r1, [r7] + mov r3, r0, lsl #26 + mov r0, #5 + bic r2, r1, #2048 ; 0x800 + mov r1, r0, lsl #18 + strh r2, [r7] + add r0, r3, #16384 ; 0x4000 + ldrb r0, [r0] + sub r1, r1, #13 + tst r0, #1 + orrne r1, r1, #262144 ; 0x40000 + mov r0, r1, lsl #5 + ldr r1, [r0] + ldr r0, [pc, #272] ; 0x22603b8 + bic r1, r1, #117440512 ; 0x7000000 + and r0, r5, r0 + orr r7, r1, #-1593835520 ; 0xa1000000 + rsb ip, r0, #0 +_022602B4: + ldr r0, [r3, #420] ; 0x1a4 + tst r0, #-2147483648 ; 0x80000000 + bne _022602B4 + mov r0, #128 ; 0x80 + add r2, sp, #0 + strb r0, [r3, #417] ; 0x1a1 + mov r1, #0 +_022602D0: + add r0, r1, #67108864 ; 0x4000000 + ldrb r0, [r0, #424] ; 0x1a8 + add r1, r1, #1 + cmp r1, #8 + strb r0, [r2], #1 + blt _022602D0 + cmp ip, r4 + add r5, r5, ip + bge _02260374 + mov r8, r5, lsr #8 + add r9, r3, #1048576 ; 0x100000 + mov r2, #183 ; 0xb7 + mov r1, #67108864 ; 0x4000000 + mov r0, #0 +_02260308: + strb r2, [r1, #424] ; 0x1a8 + mov sl, r5, lsr #24 + strb sl, [r1, #425] ; 0x1a9 + mov sl, r5, lsr #16 + strb sl, [r1, #426] ; 0x1aa + strb r8, [r1, #427] ; 0x1ab + strb r5, [r1, #428] ; 0x1ac + strb r0, [r1, #429] ; 0x1ad + strb r0, [r1, #430] ; 0x1ae + strb r0, [r1, #431] ; 0x1af + str r7, [r3, #420] ; 0x1a4 +_02260334: + ldr sl, [r3, #420] ; 0x1a4 + tst sl, #8388608 ; 0x800000 + beq _02260358 + cmp ip, #0 + ldr sl, [r9, #16] + blt _02260354 + cmp ip, r4 + strlt sl, [r6, ip] +_02260354: + add ip, ip, #4 +_02260358: + ldr sl, [r3, #420] ; 0x1a4 + tst sl, #-2147483648 ; 0x80000000 + bne _02260334 + cmp ip, r4 + add r8, r8, #2 + add r5, r5, #512 ; 0x200 + blt _02260308 +_02260374: + add r2, sp, #0 + mov r4, #0 +_0226037C: + ldrb r1, [r2], #1 + add r0, r4, #67108864 ; 0x4000000 + add r4, r4, #1 + strb r1, [r0, #424] ; 0x1a8 + cmp r4, #8 + blt _0226037C + add r1, r3, #512 ; 0x200 + mov r0, fp + strh lr, [r1, #4] + bl CARD_UnlockRom + mov r0, fp + bl OS_ReleaseLockID + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_022603B4: .word 0x04000204 +_022603B8: .word 0x000001FF + arm_func_end ov123_02260238 + + arm_func_start ov123_022603BC +ov123_022603BC: ; 0x022603BC + ; crc32? + stmdb sp!, {r4, lr} + cmp r1, #0 + sub r1, r1, #1 + mvn r4, #0 + beq _02260408 + ldr r2, [pc, #56] ; _02260410 + mov r3, #0 +_022603D8: + ldrb ip, [r0], #1 + mov lr, r3 + eor r4, r4, ip +_022603E4: + tst r4, #1 + movne r4, r4, lsr #1 + add lr, lr, #1 + eoreq r4, r2, r4, lsr #1 + cmp lr, #8 + blt _022603E4 + cmp r1, #0 + sub r1, r1, #1 + bne _022603D8 +_02260408: + mvn r0, r4 + ldmia sp!, {r4, pc} +_02260410: + .word 0xEDB88320 + arm_func_end ov123_022603BC + + arm_func_start ov123_02260414 +ov123_02260414: ; 0x02260414 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _02260488 + adr r3, _0226047C + str lr, [r3] + ldr r2, _02260480 + ldr r0, _02260484 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _02260488 + ldr r2, _02260480 + ldr r0, _02260484 + bl ov123_0225FF30 + str r0, _02260484 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0226047C + str pc, _0226047C + bx lr +_0226047C: .word _02260C00+1 +_02260480: .word 0x17C +_02260484: .word 0x982 +_02260488: .word ov123_02260238 + arm_func_end ov123_02260414 + + arm_func_start ov123_0226048C +ov123_0226048C: ; 0x0226048C + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _02260500 + adr r3, _022604F4 + str lr, [r3] + ldr r2, _022604F8 + ldr r0, _022604FC + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _02260500 + ldr r2, _022604F8 + ldr r0, _022604FC + bl ov123_0225FF30 + str r0, _022604FC + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _022604F4 + str pc, _022604F4 + bx lr +_022604F4: .word _02260C00+1 +_022604F8: .word 0x54 +_022604FC: .word 0x982 +_02260500: .word ov123_022603BC + arm_func_end ov123_0226048C + + arm_func_start ov123_02260504 +ov123_02260504: ; 0x02260504 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, lr} + sub sp, sp, #540 ; 0x21c + mov r0, #1 + mov r9, #512 ; 0x200 + mov r4, #4096 ; 0x1000 + mov r5, #0 + mov r6, r0, lsl #15 + add sl, sp, #28 + mov r8, r9 + add r7, sp, #0 +_0226052C: + mov r0, sl + mov r1, r4 + mov r2, r9 + bl ov123_02260414 + mov r0, sl + mov r1, r8 + bl ov123_0226048C + cmp r5, #2 + str r0, [r7, r5, lsl #2] + moveq r4, r6 + add r5, r5, #1 + addne r4, r4, #512 ; 0x200 + cmp r5, #6 + blt _0226052C + ldr r2, [sp, #12] + mov r3, #0 + add r1, sp, #0 +_02260570: + ldr r0, [r1, r3, lsl #2] + cmp r2, r0 + movne r0, #1 + bne _022605A4 + add r3, r3, #1 + cmp r3, #3 + blt _02260570 + ldr r0, [sp, #16] + cmp r2, r0 + ldreq r0, [sp, #20] + cmpeq r2, r0 + moveq r0, #1 + movne r0, #0 +_022605A4: + mov r3, #0 + add r2, sp, #28 + mov r1, r3 +_022605B0: + add r3, r3, #1 + cmp r3, #512 ; 0x200 + strb r1, [r2], #1 + blt _022605B0 + add sp, sp, #540 ; 0x21c + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, pc} + arm_func_end ov123_02260504 + + arm_func_start ov123_022605C8 +ov123_022605C8: ; 0x022605C8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, lr} + sub sp, sp, #540 ; 0x21c + mov r0, #1 + mov r9, #512 ; 0x200 + mov r4, #4096 ; 0x1000 + mov r5, #0 + mov r6, r0, lsl #15 + add sl, sp, #28 + mov r8, r9 + add r7, sp, #0 +_022605F0: + mov r0, sl + mov r1, r4 + mov r2, r9 + bl ov123_02260414 + mov r0, sl + mov r1, r8 + bl ov123_0226048C + cmp r5, #2 + str r0, [r7, r5, lsl #2] + moveq r4, r6 + add r5, r5, #1 + addne r4, r4, #512 ; 0x200 + cmp r5, #6 + blt _022605F0 + ldr r2, [sp, #12] + mov r3, #0 + add r1, sp, #0 +_02260634: + ldr r0, [r1, r3, lsl #2] + cmp r2, r0 + movne r0, #0 + bne _02260668 + add r3, r3, #1 + cmp r3, #3 + blt _02260634 + ldr r0, [sp, #16] + cmp r2, r0 + ldreq r0, [sp, #20] + cmpeq r2, r0 + moveq r0, #0 + movne r0, #1 +_02260668: + mov r3, #0 + add r2, sp, #28 + mov r1, r3 +_02260674: + add r3, r3, #1 + cmp r3, #512 ; 0x200 + strb r1, [r2], #1 + blt _02260674 + add sp, sp, #540 ; 0x21c + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, pc} + arm_func_end ov123_022605C8 + + arm_func_start ov123_0226068C +ov123_0226068C: ; 0x0226068C + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _02260700 + adr r3, _022606F4 + str lr, [r3] + ldr r2, _022606F8 + ldr r0, _022606FC + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _02260700 + ldr r2, _022606F8 + ldr r0, _022606FC + bl ov123_0225FF30 + str r0, _022606FC + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _022606F4 + str pc, _022606F4 + bx lr +_022606F4: .word _02260C00+1 +_022606F8: .word 0xC4 +_022606FC: .word 0x982 +_02260700: .word ov123_02260504 + arm_func_end ov123_0226068C + + arm_func_start ov123_02260704 +ov123_02260704: ; 0x02260704 + stmfd sp!, {r4-r7} + stmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + ldr r1, _02260778 + adr r3, _0226076C + str lr, [r3] + ldr r2, _02260770 + ldr r0, _02260774 + bl ov123_0225FEA8 + mov ip, r0 + stmfd sp!, {r4-r7} + ldmfd sp!, {r0-r3} + ldmfd sp!, {r4-r7} + blx ip + stmfd sp!, {r4} + mov r4, r0 + ldr r1, _02260778 + ldr r2, _02260770 + ldr r0, _02260774 + bl ov123_0225FF30 + str r0, _02260774 + mov r0, r4 + ldmfd sp!, {r4} + ldr lr, _0226076C + str pc, _0226076C + bx lr +_0226076C: .word _02260C00+1 +_02260770: .word 0xC4 +_02260774: .word 0x982 +_02260778: .word ov123_022605C8 + arm_func_end ov123_02260704 + + arm_func_start ov123_0226077C +ov123_0226077C: ; 0x0226077C + stmdb sp!, {lr} + adr r0, _0226078C + bl ov123_0225FD98 + ldmia sp!, {pc} +_0226078C: + .word ov123_0226068C, 0x68 + .word ov123_02260704, 0x68 + .word ov123_02260148, 0x68 + .word ov123_022601C0, 0x68 + .word ov123_02260414, 0x68 + .word ov123_0226048C, 0x68 + .word 0, 0 + arm_func_end ov123_0226077C + + arm_func_start ov123_022607C4 +ov123_022607C4: ; 0x022607C4 + stmfd sp!, {r4-r8, lr} + mov r6, #0 + str r6, [r0] + mov r7, r6 + mov r4, r6 + str r6, [r0, #4] +_022607DC: + add r3, r0, r4 + strb r4, [r3, #8] + add r4, r4, #1 + cmp r4, #0x100 + blt _022607DC + mov r8, #0xFF + mov r3, #0 +_022607F8: + ldrb ip, [r1, r6] + add r5, r0, r8 + ldrb r4, [r5, #8] + add ip, r7, ip + add r6, r6, #1 + add ip, r4, ip + and r7, ip, #0xFF + add lr, r0, r7 + ldrb ip, [lr, #8] + cmp r6, r2 + movcs r6, r3 + strb r4, [lr, #8] + strb ip, [r5, #8] + subs r8, r8, #1 + bpl _022607F8 + ldmfd sp!, {r4-r8, pc} + arm_func_end ov123_022607C4 + + arm_func_start ov123_02260838 +ov123_02260838: ; 0x02260838 + stmfd sp!, {r4, lr} + ldr r1, [r0] + add lr, r0, #8 + add r1, r1, #1 + and r4, r1, #0xFF + ldrb ip, [lr, r4] + ldr r1, [r0, #4] + add r1, ip, r1 + and r3, r1, #0xFF + ldrb r2, [lr, r3] + str r4, [r0] + str r3, [r0, #4] + add r1, ip, r2 + strb ip, [lr, r3] + and r1, r1, #0xFF + strb r2, [lr, r4] + add r0, r0, r1 + ldrb r0, [r0, #8] + ldmfd sp!, {r4, pc} + arm_func_end ov123_02260838 + + arm_func_start ov123_02260884 +ov123_02260884: ; 0x02260884 + mov r2, #0 +_02260888: + and r1, r2, #0xFF + eor r1, r1, #1 + strb r1, [r0, r2] + add r2, r2, #1 + cmp r2, #0x100 + blt _02260888 + mov r0, #0 + bx lr + arm_func_end ov123_02260884 + + arm_func_start ov123_022608A8 +ov123_022608A8: ; 0x022608A8 + ; s32 ov123_022608A8(UnkStruct *obj, void *dest, void *src, u32 size) + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #256 ; 0x100 + mov r7, r3 + tst r7, #3 + mov sl, r0 + mov r9, r1 + mov r8, r2 + addne sp, sp, #256 ; 0x100 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + add r0, sp, #0 + bl ov123_02260884 + cmp r7, #0 + mov r4, #0 + bls _022609A4 + add fp, sp, #0 +_022608E8: + ldr r0, [r9, r4] + add r6, r9, r4 + bl ov123_0225FD5C + cmp r0, #1 + cmpne r0, #2 + beq _0226090C + cmp r0, #3 + beq _02260934 + b _02260958 +_0226090C: + ldr r2, [r6] + bic r0, r2, #-16777216 ; 0xff000000 + add r0, r0, #194 ; 0xc2 + and r1, r2, #-16777216 ; 0xff000000 + add r0, r0, #1024 ; 0x400 + eor r1, r1, #16777216 ; 0x1000000 + bic r0, r0, #-16777216 ; 0xff000000 + orr r0, r1, r0 + str r0, [r8, r4] + b _02260998 +_02260934: + ldr r2, [r6] + bic r0, r2, #-16777216 ; 0xff000000 + and r1, r2, #-16777216 ; 0xff000000 + add r0, r0, #4864 ; 0x1300 + eor r1, r1, #16777216 ; 0x1000000 + bic r0, r0, #-16777216 ; 0xff000000 + orr r0, r1, r0 + str r0, [r8, r4] + b _02260998 +_02260958: + mov r0, sl + add r5, r8, r4 + bl ov123_02260838 + ldrb r1, [r6] + eor r1, r1, r0 + mov r0, sl + strb r1, [r8, r4] + bl ov123_02260838 + ldrb r1, [r6, #1] + eor r0, r1, r0 + strb r0, [r5, #1] + ldrb r0, [r6, #2] + ldrb r0, [fp, r0] + strb r0, [r5, #2] + ldrb r0, [r6, #3] + strb r0, [r5, #3] +_02260998: + add r4, r4, #4 + cmp r4, r7 + bcc _022608E8 +_022609A4: + mov r0, #0 + add sp, sp, #256 ; 0x100 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + arm_func_end ov123_022608A8 + + arm_func_start ov123_022609B0 +ov123_022609B0: ; 0x022609B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #256 ; 0x100 + mov r7, r3 + tst r7, #3 + mov sl, r0 + mov r9, r1 + mov r8, r2 + addne sp, sp, #256 ; 0x100 + mvnne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + add r0, sp, #0 + bl ov123_02260884 + cmp r7, #0 + mov r4, #0 + bls _02260AAC + add fp, sp, #0 +_022609F0: + ldr r0, [r9, r4] + add r6, r9, r4 + bl ov123_0225FD5C + cmp r0, #1 + cmpne r0, #2 + beq _02260A14 + cmp r0, #3 + beq _02260A38 + b _02260A60 +_02260A14: + ldr r2, [r6] + bic r0, r2, #-16777216 ; 0xff000000 + and r1, r2, #-16777216 ; 0xff000000 + sub r0, r0, #4864 ; 0x1300 + eor r1, r1, #16777216 ; 0x1000000 + bic r0, r0, #-16777216 ; 0xff000000 + orr r0, r1, r0 + str r0, [r8, r4] + b _02260AA0 +_02260A38: + ldr r3, [r6] + ldr r0, [pc, #116] ; 0x2260ab8 + bic r1, r3, #-16777216 ; 0xff000000 + add r0, r1, r0 + and r2, r3, #-16777216 ; 0xff000000 + eor r1, r2, #16777216 ; 0x1000000 + bic r0, r0, #-16777216 ; 0xff000000 + orr r0, r1, r0 + str r0, [r8, r4] + b _02260AA0 +_02260A60: + mov r0, sl + add r5, r8, r4 + bl ov123_02260838 + ldrb r1, [r6] + eor r1, r1, r0 + mov r0, sl + strb r1, [r8, r4] + bl ov123_02260838 + ldrb r1, [r6, #1] + eor r0, r1, r0 + strb r0, [r5, #1] + ldrb r0, [r6, #2] + ldrb r0, [fp, r0] + strb r0, [r5, #2] + ldrb r0, [r6, #3] + strb r0, [r5, #3] +_02260AA0: + add r4, r4, #4 + cmp r4, r7 + bcc _022609F0 +_02260AAC: + mov r0, #0 + add sp, sp, #256 ; 0x100 + ldmia sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} +_02260AB8: .word 0xFFFFFB3E ; ; instruction: 0xfffffb3e + arm_func_end ov123_022609B0 + + arm_func_start ov123_02260ABC +ov123_02260ABC: ; 0x02260ABC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #264 ; 0x108 + mov r4, r0 + mov r6, r1 + mov r5, r2 + mov r1, r4 + add r0, sp, #0 + mov r2, #16 + mov r4, r3 + bl ov123_022607C4 + add r0, sp, #0 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov123_022608A8 + mvn r1, #0 + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + rsb r0, r0, #0 + add sp, sp, #264 ; 0x108 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov123_02260ABC + + arm_func_start ov123_02260B14 +ov123_02260B14: ; 0x02260B14 + stmfd sp!, {r4, r5, r6, lr} + sub sp, sp, #264 ; 0x108 + mov r4, r0 + mov r6, r1 + mov r5, r2 + mov r1, r4 + add r0, sp, #0 + mov r2, #16 + mov r4, r3 + bl ov123_022607C4 + add r0, sp, #0 + mov r1, r6 + mov r2, r5 + mov r3, r4 + bl ov123_022609B0 + mvn r1, #0 + cmp r0, r1 + moveq r0, #1 + movne r0, #0 + rsb r0, r0, #0 + add sp, sp, #264 ; 0x108 + ldmfd sp!, {r4, r5, r6, pc} + arm_func_end ov123_02260B14 + + arm_func_start ov123_02260B6C +ov123_02260B6C: ; 0x02260B6C + stmdb sp!, {lr} + adr r0, _02260B7C + bl ov123_0225FD98 + ldmia sp!, {pc} +_02260B7C: + .word ov123_022607C4, 0x74 + .word ov123_02260838, 0x4C + .word ov123_02260884, 0x24 + .word ov123_022608A8, 0x108 + .word ov123_022609B0, 0x108 + .word ov123_02260ABC, 0x58 + .word ov123_02260B14, 0x58 + .word 0, 0 + arm_func_end ov123_02260B6C + + arm_func_start ov123_02260BBC +ov123_02260BBC: ; unreferenced + .word 0xEBAA0113 + .word 0xE4064EC7 + .word 0xEF013596 + .word 0xE5212F83 + .word 0xE7EE335B + .word 0xE83B197C + arm_func_end ov123_02260BBC + + .rodata + +_02260BD4: ; MAC address + .byte 0xFF, 0xF6, 0x40, 0xFF, 0xFF, 0xCE + + .section .sinit,4 + + .word ov123_0225F700 + .word ov123_0225FD04 + .word ov123_0225FFC0 + .word ov123_0226077C + .word ov123_02260B6C + + .bss + +_02260C00: + .space 0x20 diff --git a/lib/asm/wifi.s b/lib/asm/wifi.s new file mode 100644 index 00000000..76af49e0 --- /dev/null +++ b/lib/asm/wifi.s @@ -0,0 +1,19120 @@ + .include "asm/macros.inc" + .include "wifi.inc" + .include "global.inc" + + .bss + + .public _021D4420 +_021D4420: + .space 0x4 + +_021D4424: ; 0x021D4424 + .space 0x4 + +_021D4428: ; 0x021D4428 + .space 0x4 + +_021D442C: ; 0x021D442C + .space 0x4 + +_021D4430: ; 0x021D4430 + .space 0x30 + +_021D4460: ; 0x021D4460 + .space 0x4 + +_021D4464: ; 0x021D4464 + .space 0x20 + +_021D4484: ; 0x021D4484 + .space 0x8 + +_021D448C: ; 0x021D448C + .space 0x4 + +_021D4490: ; 0x021D4490 + .space 0x4 + +_021D4494: ; 0x021D4494 + .space 0x18 + +_021D44AC: ; 0x021D44AC + .space 0x8 + +_021D44B4: ; 0x021D44B4 + .space 0x20 + +_021D44D4: ; 0x021D44D4 + .space 0x38 + +_021D450C: ; 0x021D450C + .space 0x10 + +_021D451C: ; 0x021D451C + .space 0x104 + +_021D4620: ; 0x021D4620 + .space 0x14 + +_021D4634: ; 0x021D4634 + .space 0x8 + +_021D463C: ; 0x021D463C + .space 0x10 + +_021D464C: ; 0x021D464C + .space 0x14 + +_021D4660: ; 0x021D4660 + .space 0x10 + + .public _021D4670 +_021D4670: ; 0x021D4670 + .space 0x10 + +_021D4680: ; 0x021D4680 + .space 0x8 + +_021D4688: ; 0x021D4688 + .space 0x18 + +_021D46A0: ; 0x021D46A0 + .space 0xA + +_021D46AA: ; 0x021D46AA + .space 0x56 + +_021D4700: ; 0x021D4700 + .space 0x20 + +_021D4720: ; 0x021D4720 + .space 0x44 + +_021D4764: ; 0x021D4764 + .space 0x64 + +_021D47C8: ; 0x021D47C8 + .space 0xC0 + +_021D4888: ; 0x021D4888 + .space 0xC0 + +_021D4948: ; 0x021D4948 + .space 0x1C0 + +_021D4B08: ; 0x021D4B08 + .space 0x2A + +_021D4B32: ; 0x021D4B32 + .space 0x1A + +_021D4B4C: ; 0x021D4B4C + .space 0x2A + +_021D4B76: ; 0x021D4B76 + .space 0x156 + +_021D4CCC: ; 0x021D4CCC + .space 0x994 + +_021D5660: ; 0x021D5660 + .space 0x800 + +_021D5E60: ; 0x021D5E60 + .space 0x8 + +_021D5E68: ; 0x021D5E68 + .space 0x170 + +_021D5FD8: ; 0x021D5FD8 + .space 0x13 + +_021D5FEB: ; 0x021D5FEB + .space 0x1 + +_021D5FEC: ; 0x021D5FEC + .space 0x4 + +_021D5FF0: ; 0x021D5FF0 + .space 0x4 + +_021D5FF4: ; 0x021D5FF4 + .space 0x8 + +_021D5FFC: ; 0x021D5FFC + .space 0x20 + +_021D601C: ; 0x021D601C + .space 0x4 + +_021D6020: ; 0x021D6020 + .space 0x20 + + .text + + ; NitroWiFi: libsoc.a + + arm_func_start SOCL_Startup +SOCL_Startup: ; 0x020A0804 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _020A0838 ; =_version_NINTENDO_WiFi + bl OSi_ReferSymbol + ldr r0, _020A083C ; =_02110628 + ldr r1, [r0] + cmp r1, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + str r4, [r0] + bl SOCLi_StartupCPS + bl SOCLi_StartupSOCL + ldmia sp!, {r4, pc} + .align 2, 0 +_020A0838: .word _version_NINTENDO_WiFi +_020A083C: .word _02110628 + arm_func_end SOCL_Startup + + arm_func_start SOCLi_StartupSOCL +SOCLi_StartupSOCL: ; 0x020A0840 + stmdb sp!, {r4, lr} + ldr r0, _020A0874 ; =_02110628 + ldr r0, [r0] + ldr r0, [r0, #0x20] + bl SOCLi_StartupCommandPacketQueue + movs r4, r0 + bmi _020A086C + ldr r0, _020A0878 ; =_02110660 + bl SOCL_CreateSocket + ldr r1, _020A087C ; =_021D4420 + str r0, [r1, #0xc] +_020A086C: + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A0874: .word _02110628 +_020A0878: .word _02110660 +_020A087C: .word _021D4420 + arm_func_end SOCLi_StartupSOCL + + arm_func_start SOCLi_StartupCPS +SOCLi_StartupCPS: ; 0x020A0880 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020A09B4 ; =_02110628 + ldr r4, _020A09B8 ; =_021D4430 + ldr r5, [r0] + mov r0, r4 + mov r1, #0 + mov r2, #0x30 + bl MI_CpuFill8 + ldr r1, [r5, #0x18] + ldr r0, _020A09BC ; =_021D4420 + ldr r2, _020A09C0 ; =SOCL_LinkIsOn + str r1, [r0, #0x14] + ldr r3, [r5, #0x1c] + mov r1, #0 + str r3, [r0, #0x18] + str r2, [r0, #0x20] + str r1, [r0, #0x24] + str r1, [r0, #0x28] + ldr r1, [r0] + str r1, [r0, #0x3c] + ldr r0, [r5, #0x24] + cmp r0, #0 + moveq r0, #0x4000 + str r0, [r4, #0x20] + ldr r0, [r5, #0x28] + cmp r0, #0 + bne _020A0900 + ldr r1, _020A09B4 ; =_02110628 + ldr r0, [r4, #0x20] + ldr r1, [r1] + ldr r1, [r1, #0x18] + blx r1 +_020A0900: + str r0, [r4, #0x1c] + ldr r1, [r5, #0x30] + ldr lr, [r5, #0x34] + cmp r1, #0 + moveq r1, #0x240 + sub ip, r1, #0x28 + cmp lr, #0 + moveq lr, #0x10c0 + ldr r2, _020A09C4 ; =_02110648 + add r0, lr, lr, lsr #31 + ldr r1, _020A09C8 ; =_021D4670 + mov r3, #0 + strh lr, [r2, #2] + mov r0, r0, asr #1 + strh r0, [r2, #4] + str ip, [r4, #0x24] + str r3, [r1] + ldr r0, [r5] + mov r2, #1 + cmp r0, #0 + beq _020A0974 + ldr r1, _020A09CC ; =SOCLi_DhcpTimeout + ldr r0, _020A09BC ; =_021D4420 + str r3, [r4] + str r1, [r4, #0xc] + str r2, [r0, #8] + ldr r0, [r0, #4] + str r0, [r4, #0x28] + b _020A0988 +_020A0974: + ldr r0, _020A09BC ; =_021D4420 + ldr r1, _020A09D0 ; =SOCLi_SetMyIP + str r3, [r0, #8] + str r2, [r4] + str r1, [r4, #0xc] +_020A0988: + ldr r0, [r5, #0x2c] + cmp r0, #0 + moveq r0, #0xb + bl CPS_SetThreadPriority + ldr r0, _020A09D4 ; =CPSi_RecvCallbackFunc + bl WCM_SetRecvDCFCallback + ldr r0, _020A09D8 ; =SOCLi_TrashSocket + bl CPS_SetScavengerCallback + mov r0, r4 + bl CPS_Startup + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A09B4: .word _02110628 +_020A09B8: .word _021D4430 +_020A09BC: .word _021D4420 +_020A09C0: .word SOCL_LinkIsOn +_020A09C4: .word _02110648 +_020A09C8: .word _021D4670 +_020A09CC: .word SOCLi_DhcpTimeout +_020A09D0: .word SOCLi_SetMyIP +_020A09D4: .word CPSi_RecvCallbackFunc +_020A09D8: .word SOCLi_TrashSocket + arm_func_end SOCLi_StartupCPS + + arm_func_start SOCLi_SetMyIP +SOCLi_SetMyIP: ; 0x020A09DC + ldr r0, _020A0A30 ; =_02110628 + ldr r1, _020A0A34 ; =_021D4670 + ldr ip, [r0] + ldr r0, _020A0A38 ; =_021D463C + ldr r3, [ip, #4] + ldr r2, _020A0A3C ; =_021D464C + str r3, [r1] + ldr r3, [ip, #8] + ldr r1, _020A0A40 ; =_021D4680 + str r3, [r0] + ldr r3, [ip, #0xc] + ldr r0, _020A0A44 ; =_021D4420 + str r3, [r2] + ldr r2, [ip, #0x10] + str r2, [r1] + ldr r2, [ip, #0x14] + str r2, [r1, #4] + ldr r1, [r0, #8] + orr r1, r1, #2 + str r1, [r0, #8] + bx lr + .align 2, 0 +_020A0A30: .word _02110628 +_020A0A34: .word _021D4670 +_020A0A38: .word _021D463C +_020A0A3C: .word _021D464C +_020A0A40: .word _021D4680 +_020A0A44: .word _021D4420 + arm_func_end SOCLi_SetMyIP + + arm_func_start SOCLi_DhcpTimeout +SOCLi_DhcpTimeout: ; 0x020A0A48 + ldr r0, _020A0A5C ; =_021D4420 + ldr r1, [r0, #8] + orr r1, r1, #2 + str r1, [r0, #8] + bx lr + .align 2, 0 +_020A0A5C: .word _021D4420 + arm_func_end SOCLi_DhcpTimeout + + arm_func_start SOCL_LinkIsOn +SOCL_LinkIsOn: ; 0x020A0A60 + stmdb sp!, {r3, lr} + bl WCM_GetApMacAddress + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + arm_func_end SOCL_LinkIsOn + + arm_func_start SOCLi_StartupCommandPacketQueue +SOCLi_StartupCommandPacketQueue: ; 0x020A0A78 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r0, #0x2c + mul r1, r4, r0 + ldr r0, _020A0B00 ; =_02110628 + mov r2, r4, lsl #2 + add r2, r2, #3 + ldr r0, [r0] + add r1, r1, #3 + bic r5, r2, #3 + bic r2, r1, #3 + ldr r1, [r0, #0x18] + add r0, r2, r5 + blx r1 + movs r6, r0 + mvneq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _020A0B04 ; =_021D4464 + mov r1, r6 + mov r2, r4 + bl OS_InitMessageQueue + cmp r4, #0 + add r5, r6, r5 + ble _020A0AF0 +_020A0AD8: + mov r0, r5 + bl SOCLi_FreeCommandPacket + sub r4, r4, #1 + cmp r4, #0 + add r5, r5, #0x2c + bgt _020A0AD8 +_020A0AF0: + ldr r1, _020A0B08 ; =_021D4460 + mov r0, #0 + str r6, [r1] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A0B00: .word _02110628 +_020A0B04: .word _021D4464 +_020A0B08: .word _021D4460 + arm_func_end SOCLi_StartupCommandPacketQueue + + arm_func_start SOCLi_CleanupCommandPacketQueue +SOCLi_CleanupCommandPacketQueue: ; 0x020A0B0C + stmdb sp!, {r3, lr} + ldr r0, _020A0B4C ; =_021D4460 + ldr r2, [r0, #0x20] + ldr r1, [r0, #0x18] + cmp r2, r1 + mvnlt r0, #0 + ldmltia sp!, {r3, pc} + ldr r1, _020A0B50 ; =_02110628 + ldr r0, [r0] + ldr r1, [r1] + ldr r1, [r1, #0x1c] + blx r1 + ldr r1, _020A0B4C ; =_021D4460 + mov r0, #0 + str r0, [r1] + ldmia sp!, {r3, pc} + .align 2, 0 +_020A0B4C: .word _021D4460 +_020A0B50: .word _02110628 + arm_func_end SOCLi_CleanupCommandPacketQueue + + arm_func_start SOCLi_AllocCommandPacket +SOCLi_AllocCommandPacket: ; 0x020A0B54 + stmdb sp!, {r3, lr} + mov r2, r0 + ldr r0, _020A0B78 ; =_021D4464 + add r1, sp, #0 + bl OS_ReceiveMessage + cmp r0, #0 + ldrne r0, [sp] + moveq r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A0B78: .word _021D4464 + arm_func_end SOCLi_AllocCommandPacket + + arm_func_start SOCLi_CreateCommandPacket +SOCLi_CreateCommandPacket: ; 0x020A0B7C + stmdb sp!, {r4, r5, r6, lr} + mov r4, r2 + mov r6, r0 + mov r0, r4 + mov r5, r1 + bl SOCLi_AllocCommandPacket + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + str r6, [r0] + str r5, [r0, #4] + mov r1, #0 + str r1, [r0, #8] + ldrsb r1, [r5, #0x73] + strb r1, [r0, #0xc] + strb r4, [r0, #0xd] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SOCLi_CreateCommandPacket + + arm_func_start SOCLi_FreeCommandPacket +SOCLi_FreeCommandPacket: ; 0x020A0BBC + stmdb sp!, {r3, lr} + movs r1, r0 + ldmeqia sp!, {r3, pc} + ldr r0, _020A0BD8 ; =_021D4464 + mov r2, #0 + bl OS_SendMessage + ldmia sp!, {r3, pc} + .align 2, 0 +_020A0BD8: .word _021D4464 + arm_func_end SOCLi_FreeCommandPacket + + arm_func_start SOCLi_GetCtrlPipe +SOCLi_GetCtrlPipe: ; 0x020A0BDC + ldr r1, [r0, #0x64] + cmp r1, #0 + ldreq r1, [r0, #0x68] + mov r0, r1 + bx lr + arm_func_end SOCLi_GetCtrlPipe + + arm_func_start SOCLi_SendCommandPacket +SOCLi_SendCommandPacket: ; 0x020A0BF0 + stmdb sp!, {r3, r4, r5, lr} + movs r5, r1 + beq _020A0C08 + ldrsb r1, [r5, #0xd] + tst r1, #1 + beq _020A0C10 +_020A0C08: + mov r2, #1 + b _020A0C14 +_020A0C10: + mov r2, #0 +_020A0C14: + mov r1, r5 + bl OS_SendMessage + movs r4, r0 + bne _020A0C2C + mov r0, r5 + bl SOCLi_FreeCommandPacket +_020A0C2C: + cmp r4, #0 + movne r0, #0 + mvneq r0, #0x29 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_SendCommandPacket + + arm_func_start SOCLi_SendCommandPacketToCtrlPipe +SOCLi_SendCommandPacketToCtrlPipe: ; 0x020A0C3C + stmdb sp!, {r4, lr} + mov r4, r1 + bl SOCLi_GetCtrlPipe + mov r1, r4 + bl SOCLi_SendCommandPacket + ldmia sp!, {r4, pc} + arm_func_end SOCLi_SendCommandPacketToCtrlPipe + + arm_func_start SOCLi_ExecCommandPacket +SOCLi_ExecCommandPacket: ; 0x020A0C54 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + mov r4, r1 + ldrsb r2, [r4, #0xd] + mov r5, r0 + cmp r2, #1 + bne _020A0CA8 + add r0, sp, #8 + add r1, sp, #0 + mov r2, #1 + bl OS_InitMessageQueue + add r2, sp, #8 + mov r0, r5 + mov r1, r4 + str r2, [r4, #8] + bl SOCLi_SendCommandPacket + add r0, sp, #8 + add r1, sp, #4 + mov r2, #1 + bl OS_ReceiveMessage + b _020A0CB8 +_020A0CA8: + mov r2, #0 + str r2, [r4, #8] + bl SOCLi_SendCommandPacket + str r0, [sp, #4] +_020A0CB8: + ldr r0, [sp, #4] + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_ExecCommandPacket + + arm_func_start SOCLi_ExecCommandPacketInRecvPipe +SOCLi_ExecCommandPacketInRecvPipe: ; 0x020A0CC4 + ldr ip, _020A0CD0 ; =SOCLi_ExecCommandPacket + ldr r0, [r0, #0x64] + bx ip + .align 2, 0 +_020A0CD0: .word SOCLi_ExecCommandPacket + arm_func_end SOCLi_ExecCommandPacketInRecvPipe + + arm_func_start SOCLi_ExecCommandPacketInSendPipe +SOCLi_ExecCommandPacketInSendPipe: ; 0x020A0CD4 + ldr ip, _020A0CE0 ; =SOCLi_ExecCommandPacket + ldr r0, [r0, #0x68] + bx ip + .align 2, 0 +_020A0CE0: .word SOCLi_ExecCommandPacket + arm_func_end SOCLi_ExecCommandPacketInSendPipe + + arm_func_start SOCLi_ExecCommandPacketInCtrlPipe +SOCLi_ExecCommandPacketInCtrlPipe: ; 0x020A0CE4 + stmdb sp!, {r4, lr} + mov r4, r1 + bl SOCLi_GetCtrlPipe + mov r1, r4 + bl SOCLi_ExecCommandPacket + ldmia sp!, {r4, pc} + arm_func_end SOCLi_ExecCommandPacketInCtrlPipe + + arm_func_start SOCLi_CommandPacketHandler +SOCLi_CommandPacketHandler: ; 0x020A0CFC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r4, #0 + mov sb, r0 + mov sl, r4 + add r6, sp, #0 + mov r5, #1 +_020A0D18: + mov r0, sb + mov r1, r6 + mov r2, r5 + bl OS_ReadMessage + ldr r0, [sp] + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + ldr r1, [r0] + blx r1 + mov r8, r0 + bl OS_DisableInterrupts + mov r7, r0 + bl OS_DisableScheduler + mov r0, sb + mov r1, r4 + mov r2, r4 + bl OS_ReceiveMessage + ldr r0, [sp] + ldr r0, [r0, #4] + cmp r0, #0 + strne r8, [r0, #0x6c] + ldr r0, [sp] + ldr r0, [r0, #8] + cmp r0, #0 + beq _020A0D8C + mov r1, r8 + mov r2, sl + bl OS_SendMessage +_020A0D8C: + ldr r0, [sp] + bl SOCLi_FreeCommandPacket + bl OS_EnableScheduler + mov r0, r7 + bl OS_RestoreInterrupts + b _020A0D18 +_020A0DA4: ; 0x020A0DA4 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end SOCLi_CommandPacketHandler + + arm_func_start SOCL_CreateSocket +SOCL_CreateSocket: ; 0x020A0DAC + stmdb sp!, {r4, lr} + bl SOCLi_StartupSocket + movs r4, r0 + mvneq r0, #0x30 + ldmeqia sp!, {r4, pc} + ldr r0, _020A0DE4 ; =SOCLi_CreateSocketCallBack + mov r1, r4 + mov r2, #1 + bl SOCLi_CreateCommandPacket + mov r1, r0 + mov r0, r4 + bl SOCLi_ExecCommandPacketInCtrlPipe + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A0DE4: .word SOCLi_CreateSocketCallBack + arm_func_end SOCL_CreateSocket + + arm_func_start SOCLi_CreateSocketCallBack +SOCLi_CreateSocketCallBack: ; 0x020A0DE8 + stmdb sp!, {r4, lr} + ldr r4, [r0, #4] + mov r0, r4 + bl CPS_SocRegister + ldrsb r0, [r4, #0x73] + ldr r1, [r4, #0x68] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _020A0E48 +_020A0E0C: ; jump table + b _020A0E20 ; case 0 + b _020A0E30 ; case 1 + b _020A0E44 ; case 2 + b _020A0E48 ; case 3 + b _020A0E20 ; case 4 +_020A0E20: + add r0, r1, #0x20 + bl CPS_SocDup + bl CPS_SocUse + b _020A0E48 +_020A0E30: + bl CPS_SocUse + bl CPS_SocDatagramMode + ldr r0, _020A0E58 ; =SOCLi_UdpRecvCallback + bl CPS_SetUdpCallback + b _020A0E48 +_020A0E44: + bl CPS_SocDatagramMode +_020A0E48: + mov r0, #1 + strh r0, [r4, #0x70] + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A0E58: .word SOCLi_UdpRecvCallback + arm_func_end SOCLi_CreateSocketCallBack + + arm_func_start SOCLi_StartupSocket +SOCLi_StartupSocket: ; 0x020A0E5C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + bl SOCLi_GetSizeSocket + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020A0EC0 ; =_02110628 + mov r6, r0 + ldr r1, [r1] + mov r0, r4 + ldr r1, [r1, #0x18] + blx r1 + movs r5, r0 + beq _020A0EB0 + mov r2, r4 + mov r1, #0 + bl MI_CpuFill8 + mov r0, r5 + mov r1, r7 + bl SOCLi_InitSocket + mov r0, r5 + bl SOCLi_SocketRegister +_020A0EB0: + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A0EC0: .word _02110628 + arm_func_end SOCLi_StartupSocket + + arm_func_start SOCLi_GetSizeSocket +SOCLi_GetSizeSocket: ; 0x020A0EC4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrh r0, [r5, #2] + mov r4, #0x80 + cmp r0, #0 + beq _020A0F00 + add r4, r4, #0x114 + bl SOCLi_RoundUp4 + add r4, r4, r0 + ldrh r0, [r5, #8] + bl SOCLi_RoundUp4 + add r4, r4, r0 + add r0, r5, #0x10 + bl SOCLi_GetSizeCommandPipe + add r4, r4, r0 +_020A0F00: + ldrh r0, [r5, #6] + cmp r0, #0 + beq _020A0F3C + add r4, r4, #0x110 + bl SOCLi_RoundUp4 + add r4, r4, r0 + ldrh r0, [r5, #0xa] + bl SOCLi_RoundUp4 + add r4, r4, r0 + ldrh r0, [r5, #0xc] + bl SOCLi_RoundUp4 + add r4, r4, r0 + add r0, r5, #0x14 + bl SOCLi_GetSizeCommandPipe + add r4, r4, r0 +_020A0F3C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_GetSizeSocket + + arm_func_start SOCLi_GetSizeCommandPipe +SOCLi_GetSizeCommandPipe: ; 0x020A0F44 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r0, [r5, #3] + mov r0, r0, lsl #2 + bl SOCLi_RoundUp4 + mov r4, r0 + ldrh r0, [r5] + bl SOCLi_RoundUp4 + add r0, r4, r0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_GetSizeCommandPipe + + arm_func_start SOCLi_InitSocket +SOCLi_InitSocket: ; 0x020A0F6C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + ldrsb r1, [r5] + mov r6, r0 + add r4, r6, #0x80 + strb r1, [r6, #0x73] + ldrsb r0, [r5, #1] + strb r0, [r6, #0x72] + ldrh r0, [r5, #2] + cmp r0, #0 + beq _020A0FEC + str r4, [r6, #0x64] + ldrh r2, [r5, #4] + mov r1, r4 + add r0, r4, #0x114 + strh r2, [r4, #0xfc] + add r2, r5, #0x10 + mov r7, r4 + bl SOCLi_InitCommandPipe + ldrh r2, [r5, #2] + add r1, r6, #0x3c + bl SOCLi_InitSocketBuffer + ldrh r2, [r5, #8] + add r1, r6, #0x50 + bl SOCLi_InitSocketBuffer + ldrh r3, [r5, #0xe] + add r1, r7, #0x100 + mov r2, #0 + strh r3, [r1, #0xa] + str r2, [r7, #0x110] + mov r4, r0 + str r2, [r7, #0x10c] +_020A0FEC: + ldrh r0, [r5, #6] + cmp r0, #0 + beq _020A104C + str r4, [r6, #0x68] + mov r1, r4 + str r6, [r4, #0x10c] + add r0, r4, #0x110 + add r2, r5, #0x14 + mov r7, r4 + bl SOCLi_InitCommandPipe + ldrh r2, [r5, #6] + add r1, r6, #0x48 + bl SOCLi_InitSocketBuffer + ldrh r2, [r5, #0xa] + add r1, r6, #0x58 + bl SOCLi_InitSocketBuffer + ldrh r2, [r5, #0xc] + add r1, r4, #0xf8 + bl SOCLi_InitSocketBuffer + mov r1, #0 + str r1, [r7, #0x108] + mov r4, r0 + str r1, [r7, #0x104] + b _020A105C +_020A104C: + ldr r0, _020A1064 ; =_021D442C + ldr r0, [r0] + ldr r0, [r0, #0x68] + str r0, [r6, #0x68] +_020A105C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A1064: .word _021D442C + arm_func_end SOCLi_InitSocket + + arm_func_start SOCLi_InitSocketBuffer +SOCLi_InitSocketBuffer: ; 0x020A1068 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r2, #0 + moveq r0, #0 + str r0, [r1, #4] + mov r0, r2 + str r2, [r1] + bl SOCLi_RoundUp4 + add r0, r4, r0 + ldmia sp!, {r4, pc} + arm_func_end SOCLi_InitSocketBuffer + + arm_func_start SOCLi_InitCommandPipe +SOCLi_InitCommandPipe: ; 0x020A1090 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r5, r2 + mov r7, r0 + mov r0, r5 + mov r6, r1 + bl SOCLi_GetSizeCommandPipe + mov r4, r0 + ldrb r2, [r5, #3] + mov r0, r6 + mov r1, r7 + bl OS_InitMessageQueue + add r0, r6, #0xe0 + bl OS_InitMutex + ldrh r2, [r5] + add r0, r6, #0x20 + ldr r1, _020A1100 ; =SOCLi_CommandPacketHandler + str r2, [sp] + ldrb ip, [r5, #2] + mov r2, r6 + add r3, r7, r4 + str ip, [sp, #4] + bl OS_CreateThread + add r0, r6, #0x20 + bl OS_WakeupThreadDirect + add r0, r7, r4 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A1100: .word SOCLi_CommandPacketHandler + arm_func_end SOCLi_InitCommandPipe + + arm_func_start SOCL_Listen +SOCL_Listen: ; 0x020A1104 + stmdb sp!, {r4, lr} + mov r4, r0 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r4, pc} + cmp r4, #0 + mov r1, #0 + beq _020A1134 + ldrsh r0, [r4, #0x70] + tst r0, #1 + movne r1, #1 +_020A1134: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r4, pc} + ldrsh r0, [r4, #0x70] + tst r0, #2 + mvnne r0, #0x1b + ldmneia sp!, {r4, pc} + ldrsb r0, [r4, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + mvneq r0, #0x1b + ldmeqia sp!, {r4, pc} + ldrsb r0, [r4, #0x72] + cmp r0, #1 + moveq r0, #0 + mvnne r0, #5 + ldmia sp!, {r4, pc} + arm_func_end SOCL_Listen + + arm_func_start SOCL_Accept +SOCL_Accept: ; 0x020A1184 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r6, #0 + mov r1, #0 + beq _020A11BC + ldrsh r0, [r6, #0x70] + tst r0, #1 + movne r1, #1 +_020A11BC: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r6, #0x70] + tst r0, #2 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrsb r0, [r6, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + mvneq r0, #0x1b + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrsb r0, [r6, #0x72] + cmp r0, #1 + mvnne r0, #5 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _020A1244 ; =_02110648 + bl SOCL_CreateSocket + movs r7, r0 + ldmmiia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r1, [r6, #0x74] + bl SOCL_Bind + cmp r0, #0 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl SOCL_ListenAccept + cmp r0, #0 + movge r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A1244: .word _02110648 + arm_func_end SOCL_Accept + + arm_func_start SOCL_ListenAccept +SOCL_ListenAccept: ; 0x020A1248 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r4, r5, r6, pc} + cmp r6, #0 + mov r1, #0 + beq _020A1280 + ldrsh r0, [r6, #0x70] + tst r0, #1 + movne r1, #1 +_020A1280: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r4, r5, r6, pc} + ldrsh r0, [r6, #0x70] + tst r0, #2 + mvnne r0, #0x1b + ldmneia sp!, {r4, r5, r6, pc} + ldrsb r0, [r6, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + mvneq r0, #0x1b + ldmeqia sp!, {r4, r5, r6, pc} + ldrsb r2, [r6, #0x72] + cmp r2, #1 + mvnne r0, #5 + ldmneia sp!, {r4, r5, r6, pc} + ldrh r0, [r6, #0x74] + cmp r0, #0 + mvneq r0, #0x1b + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, _020A1314 ; =SOCLi_ListenAcceptCallBack + mov r1, r6 + bl SOCLi_CreateCommandPacket + mov r1, r0 + ldrh r2, [r6, #0x74] + mov r0, r6 + strh r2, [r1, #0x10] + str r5, [r1, #0x14] + str r4, [r1, #0x18] + ldrsh r2, [r6, #0x70] + orr r2, r2, #2 + strh r2, [r6, #0x70] + bl SOCLi_ExecCommandPacketInRecvPipe + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A1314: .word SOCLi_ListenAcceptCallBack + arm_func_end SOCL_ListenAccept + + arm_func_start SOCLi_ListenAcceptCallBack +SOCLi_ListenAcceptCallBack: ; 0x020A1318 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r6, r0 + ldr r4, [r6, #4] + ldr r5, [r4, #0x64] + add r0, r5, #0xe0 + bl OS_LockMutex + mov r1, #0 + ldrh r0, [r6, #0x10] + mov r2, r1 + bl CPS_SocBind + bl CPS_TcpListen + mov r2, #0 + add r0, sp, #0 + add r1, sp, #4 + str r2, [r5, #0xf8] + bl CPS_SocWho + ldrh r2, [sp] + ldr r1, [r6, #0x14] + strh r2, [r1] + ldr r1, [r6, #0x18] + str r0, [r1] + ldrsh r1, [r4, #0x70] + add r0, r5, #0xe0 + orr r1, r1, #4 + strh r1, [r4, #0x70] + bl OS_UnlockMutex + mov r0, #0 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SOCLi_ListenAcceptCallBack + + arm_func_start SOCL_Bind +SOCL_Bind: ; 0x020A1390 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, pc} + cmp r5, #0 + mov r1, #0 + beq _020A13C4 + ldrsh r0, [r5, #0x70] + tst r0, #1 + movne r1, #1 +_020A13C4: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsh r0, [r5, #0x70] + tst r0, #2 + mvnne r0, #6 + ldmneia sp!, {r3, r4, r5, pc} + strh r4, [r5, #0x74] + ldrsb r0, [r5, #0x73] + cmp r0, #1 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl SOCLi_ExecBindCommand + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCL_Bind + + arm_func_start SOCL_Connect +SOCL_Connect: ; 0x020A1400 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl SOCL_SocketIsInvalid + cmp r0, #0 + bne _020A1428 + ldrsh r0, [r6, #0x70] + tst r0, #8 + beq _020A1430 +_020A1428: + mvn r0, #0x1b + ldmia sp!, {r4, r5, r6, pc} +_020A1430: + cmp r6, #0 + mov r1, #0 + beq _020A1448 + ldrsh r0, [r6, #0x70] + tst r0, #1 + movne r1, #1 +_020A1448: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r4, r5, r6, pc} + ldrsb r0, [r6, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A14D4 + ldrsh r0, [r6, #0x70] + tst r0, #4 + beq _020A1490 + ldrsb r0, [r6, #0x72] + cmp r0, #1 + mvneq r0, #0x1d + movne r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020A1490: + ldrsh r0, [r6, #0x70] + tst r0, #2 + beq _020A14B4 + ldrsh r0, [r6, #0x70] + tst r0, #0x40 + ldrne r0, [r6, #0x6c] + ldreq r0, _020A14E4 ; =_0211062C + ldreq r0, [r0] + ldmia sp!, {r4, r5, r6, pc} +_020A14B4: + strh r5, [r6, #0x76] + mov r0, r6 + str r4, [r6, #0x78] + bl SOCLi_ExecBindCommand + ldrsb r1, [r6, #0x72] + cmp r1, #1 + mvnne r0, #0x19 + ldmia sp!, {r4, r5, r6, pc} +_020A14D4: + strh r5, [r6, #0x76] + str r4, [r6, #0x78] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A14E4: .word _0211062C + arm_func_end SOCL_Connect + + arm_func_start SOCLi_ExecBindCommand +SOCLi_ExecBindCommand: ; 0x020A14E8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrsb r2, [r4, #0x72] + ldr r0, _020A153C ; =SOCLi_BindCallBack + mov r1, r4 + bl SOCLi_CreateCommandPacket + movs r1, r0 + mvneq r0, #0x20 + ldmeqia sp!, {r4, pc} + ldrh r2, [r4, #0x74] + mov r0, r4 + strh r2, [r1, #0x10] + ldrh r2, [r4, #0x76] + strh r2, [r1, #0x12] + ldr r2, [r4, #0x78] + str r2, [r1, #0x14] + ldrsh r2, [r4, #0x70] + orr r2, r2, #2 + strh r2, [r4, #0x70] + bl SOCLi_ExecCommandPacketInRecvPipe + ldmia sp!, {r4, pc} + .align 2, 0 +_020A153C: .word SOCLi_BindCallBack + arm_func_end SOCLi_ExecBindCommand + + arm_func_start SOCLi_BindCallBack +SOCLi_BindCallBack: ; 0x020A1540 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r4, [r7, #4] + mov r6, #0 + ldr r5, [r4, #0x64] + add r0, r5, #0xe0 + bl OS_LockMutex + ldrh r0, [r7, #0x10] + ldrh r1, [r7, #0x12] + ldr r2, [r7, #0x14] + bl CPS_SocBind + mov r0, r6 + str r0, [r5, #0xf8] + ldrsb r0, [r7, #0xc] + cmp r0, #0 + cmpne r0, #4 + bne _020A158C + bl CPS_TcpConnect + mov r6, r0 +_020A158C: + add r0, r5, #0xe0 + bl OS_UnlockMutex + cmp r6, #0 + beq _020A15B0 + ldrsh r1, [r4, #0x70] + mvn r0, #0x4b + orr r1, r1, #0x40 + strh r1, [r4, #0x70] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A15B0: + ldrsh r1, [r4, #0x70] + mov r0, #0 + orr r1, r1, #4 + strh r1, [r4, #0x70] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SOCLi_BindCallBack + + arm_func_start SOCL_ReadFrom +SOCL_ReadFrom: ; 0x020A15C4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + mov sb, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl SOCL_SocketIsInvalid + cmp r0, #0 + addne sp, sp, #0xc + mvnne r0, #0x1b + ldmneia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sp, #0x2c] + tst r0, #4 + bne _020A1608 + ldrsb r0, [sb, #0x72] + cmp r0, #0 + bne _020A1624 +_020A1608: + ldrsb r0, [sb, #0x73] + cmp r0, #4 + addeq sp, sp, #0xc + mvneq r0, #0x1b + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r5, #0 + b _020A163C +_020A1624: + bl OS_GetProcMode + cmp r0, #0x12 + addeq sp, sp, #0xc + mvneq r0, #0x1b + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + mov r5, #1 +_020A163C: + cmp sb, #0 + mov r1, #0 + beq _020A1654 + ldrsh r0, [sb, #0x70] + tst r0, #1 + movne r1, #1 +_020A1654: + cmp r1, #0 + addeq sp, sp, #0xc + mvneq r0, #0x26 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, pc} + ldrsb r0, [sb, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A16A4 + ldrsh r0, [sb, #0x70] + tst r0, #4 + beq _020A1698 + ldrsh r0, [sb, #0x70] + tst r0, #8 + beq _020A16A4 +_020A1698: + add sp, sp, #0xc + mvn r0, #0x37 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_020A16A4: + ldr r4, [sb, #0x64] + tst r5, #1 + add r0, r4, #0xe0 + bne _020A16CC + bl OS_TryLockMutex + cmp r0, #0 + bne _020A16D0 + add sp, sp, #0xc + mvn r0, #5 + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} +_020A16CC: + bl OS_LockMutex +_020A16D0: + ldr r0, [sp, #0x28] + ldr ip, [sp, #0x2c] + str r0, [sp] + mov r0, sb + mov r1, r8 + mov r2, r7 + mov r3, r6 + stmib sp, {r5, ip} + bl SOCLi_ReadAndConsumeBuffer + mov r5, r0 + add r0, r4, #0xe0 + bl OS_UnlockMutex + mov r0, r5 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} + arm_func_end SOCL_ReadFrom + + arm_func_start SOCLi_ReadAndConsumeBuffer +SOCLi_ReadAndConsumeBuffer: ; 0x020A170C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + ldr r4, [sp, #0x28] + mov r7, r0 + tst r4, #2 + ldr r4, [r7, #0x64] + cmpne r4, #0 + movne r6, #1 + moveq r6, #0 + cmp r6, #0 + ldrnesb r5, [r4, #0xfe] + movne r0, #1 + strneb r0, [r4, #0xfe] + ldrsb r0, [r7, #0x73] + cmp r0, #1 + bne _020A176C + ldr r0, [sp, #0x20] + ldr ip, [sp, #0x24] + str r0, [sp] + mov r0, r7 + str ip, [sp, #4] + bl SOCLi_ReadUdpBuffer + mov r8, r0 + b _020A1794 +_020A176C: + ldr r0, [sp, #0x20] + ldr ip, [sp, #0x24] + str r0, [sp] + mov r0, r7 + str ip, [sp, #4] + bl SOCLi_ReadBuffer + movs r8, r0 + bmi _020A1794 + mov r0, r7 + bl SOCLi_ConsumeBuffer +_020A1794: + cmp r6, #0 + strneb r5, [r4, #0xfe] + mov r0, r8 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end SOCLi_ReadAndConsumeBuffer + + arm_func_start SOCLi_ReadBuffer +SOCLi_ReadBuffer: ; 0x020A17A8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldrsb ip, [r7, #0x73] + mov r6, r1 + mov r5, r2 + mov r4, r3 + cmp ip, #4 + bne _020A17D8 + ldr r4, [sp, #0x18] + str r4, [sp] + bl SOCLi_ExecReadCommand + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A17D8: + ldr ip, [sp, #0x18] + str ip, [sp] + bl SOCLi_CopyCPSBuffer + mvn r1, #5 + cmp r0, r1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [sp, #0x1c] + tst r1, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr ip, [sp, #0x18] + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, r4 + str ip, [sp] + bl SOCLi_ExecReadCommand + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SOCLi_ReadBuffer + + arm_func_start SOCLi_CopyCPSBuffer +SOCLi_CopyCPSBuffer: ; 0x020A181C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + mov sb, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl OS_DisableInterrupts + add r1, sp, #8 + mov r4, r0 + str r1, [sp] + add r1, sp, #0xc + mov r0, sb + add r2, sp, #6 + add r3, sp, #4 + bl SOCLi_ReadCPSBuffer + cmp r0, #0 + beq _020A18BC + ldr r5, [sp, #0xc] + cmp r5, #0 + mvneq r5, #5 + beq _020A18D8 + ldrsb r1, [sb, #0x73] + cmp r7, r5 + mov r2, #1 + movgt r7, r5 + cmp r1, #0 + cmpne r1, #4 + movne r2, #0 + cmp r2, #0 + mov r1, r8 + mov r2, r7 + movne r5, r7 + bl MI_CpuCopy8 + ldr r1, [sb, #0x64] + ldrsb r0, [r1, #0xfe] + cmp r0, #0 + ldreq r0, [r1, #0xf8] + addeq r0, r0, r5 + streq r0, [r1, #0xf8] + b _020A18D8 +_020A18BC: + ldr r0, [sp, #0xc] + cmp r0, #0 + ldrsh r0, [sb, #0x70] + moveq r5, #0 + mvnne r5, #0x1b + bic r0, r0, #6 + strh r0, [sb, #0x70] +_020A18D8: + cmp r5, #0 + blt _020A1910 + cmp r6, #0 + ldrne r1, [sp, #0x30] + cmpne r1, #0 + beq _020A1900 + ldrh r0, [sp, #4] + strh r0, [r6] + ldr r0, [sp, #8] + str r0, [r1] +_020A1900: + ldrh r0, [sb, #0x74] + cmp r0, #0 + ldreqh r0, [sp, #6] + streqh r0, [sb, #0x74] +_020A1910: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end SOCLi_CopyCPSBuffer + + arm_func_start SOCLi_ReadCPSBuffer +SOCLi_ReadCPSBuffer: ; 0x020A1924 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, [r0, #0x64] + ldr r4, [r0, #0xc4] + ldr r5, [r0, #0xf8] + ldr r0, [r4, #0x44] + subs lr, r0, r5 + bmi _020A197C + ldrh ip, [r4, #0xa] + ldr r0, [sp, #0x10] + cmp lr, #0 + strh ip, [r2] + ldrh r2, [r4, #0x18] + strh r2, [r3] + ldr r2, [r4, #0x1c] + str r2, [r0] + str lr, [r1] + bne _020A198C + ldrb r0, [r4, #8] + cmp r0, #4 + beq _020A198C + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020A197C: + mvn r0, #0 + str r0, [r1] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020A198C: + ldr r0, [r4, #0x40] + add r0, r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_ReadCPSBuffer + + arm_func_start SOCLi_ExecReadCommand +SOCLi_ExecReadCommand: ; 0x020A1998 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + ldr r0, _020A19E0 ; =SOCLi_ReadCallBack + mov r1, r7 + mov r2, #1 + mov r4, r3 + bl SOCLi_CreateCommandPacket + mov r1, r0 + str r6, [r1, #0x10] + str r5, [r1, #0x14] + ldr r2, [sp, #0x18] + str r4, [r1, #0x18] + mov r0, r7 + str r2, [r1, #0x1c] + bl SOCLi_ExecCommandPacketInRecvPipe + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A19E0: .word SOCLi_ReadCallBack + arm_func_end SOCLi_ExecReadCommand + + arm_func_start SOCLi_ReadCallBack +SOCLi_ReadCallBack: ; 0x020A19E4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r7, [r0, #4] + ldr r1, [r0, #0x10] + ldr r8, [r7, #0x64] + str r1, [sp, #0xc] + ldr r1, [r0, #0x18] + ldr sl, [r0, #0x14] + ldr r0, [r0, #0x1c] + ldr sb, [r8, #0xf8] + str r1, [sp, #8] + str r0, [sp, #4] + mov r4, #0 + mov r5, #1 + mov fp, #0xa + add r6, sp, #0x10 +_020A1A24: + mov r0, r6 + bl CPS_SocRead + cmp r0, #0 + beq _020A1A78 + ldr r1, [sp, #0x10] + sub r1, r1, sb + cmp r1, #0 + bgt _020A1A78 + ldrsb r0, [r7, #0x73] + mov r1, r5 + cmp r0, #0 + cmpne r0, #4 + movne r1, r4 + cmp r1, #0 + ldrneb r0, [r7, #8] + cmpne r0, #4 + movne r0, #0 + bne _020A1A78 + mov r0, fp + bl OS_Sleep + b _020A1A24 +_020A1A78: + ldrsh r1, [r7, #0x70] + tst r1, #0x80 + addne sp, sp, #0x14 + mvnne r0, #0xe + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrsb r1, [r7, #0x73] + cmp r1, #4 + bne _020A1AD4 + cmp r0, #0 + addeq sp, sp, #0x14 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #0x10] + cmp sl, r1 + movhi sl, r1 + ldr r1, [sp, #0xc] + mov r2, sl + bl MI_CpuCopy8 + mov r0, sl + bl CPS_SocConsume + add sp, sp, #0x14 + mov r0, sl + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020A1AD4: + cmp r0, #0 + moveq r4, #0 + beq _020A1B00 + ldr r4, [sp, #4] + ldr r1, [sp, #0xc] + ldr r3, [sp, #8] + mov r0, r7 + mov r2, sl + str r4, [sp] + bl SOCLi_CopyCPSBuffer + mov r4, r0 +_020A1B00: + cmp r4, #0 + addle sp, sp, #0x14 + movle r0, r4 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrh r0, [r8, #0xfc] + ldr r1, [r8, #0xf8] + cmp r1, r0 + blt _020A1B28 + mov r0, r7 + bl SOCLi_ConsumeCPSBuffer +_020A1B28: + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end SOCLi_ReadCallBack + + arm_func_start SOCLi_ConsumeBuffer +SOCLi_ConsumeBuffer: ; 0x020A1B34 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r1, [r4, #0x64] + ldrh r0, [r1, #0xfc] + ldr r1, [r1, #0xf8] + cmp r1, r0 + movlt r0, #0 + ldmltia sp!, {r4, pc} + ldr r0, _020A1B7C ; =SOCLi_ConsumeCallBack + mov r1, r4 + mov r2, #0 + bl SOCLi_CreateCommandPacket + movs r1, r0 + mvneq r0, #0x20 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl SOCLi_ExecCommandPacketInRecvPipe + ldmia sp!, {r4, pc} + .align 2, 0 +_020A1B7C: .word SOCLi_ConsumeCallBack + arm_func_end SOCLi_ConsumeBuffer + + arm_func_start SOCLi_ConsumeCallBack +SOCLi_ConsumeCallBack: ; 0x020A1B80 + ldr ip, _020A1B8C ; =SOCLi_ConsumeCPSBuffer + ldr r0, [r0, #4] + bx ip + .align 2, 0 +_020A1B8C: .word SOCLi_ConsumeCPSBuffer + arm_func_end SOCLi_ConsumeCallBack + + arm_func_start SOCLi_ConsumeCPSBuffer +SOCLi_ConsumeCPSBuffer: ; 0x020A1B90 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, [r0, #0x64] + bl OS_DisableInterrupts + ldr r6, [r4, #0xf8] + mov r5, r0 + cmp r6, #0 + beq _020A1BBC + mov r1, #0 + mov r0, r6 + str r1, [r4, #0xf8] + bl CPS_SocConsume +_020A1BBC: + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, r6 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SOCLi_ConsumeCPSBuffer + + arm_func_start SOCLi_ReadUdpBuffer +SOCLi_ReadUdpBuffer: ; 0x020A1BCC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sl, r0 + ldr r6, [sl, #0x64] + str r1, [sp] + ldr r0, [r6, #0x104] + str r2, [sp, #4] + mov fp, r3 + bl OS_DisableInterrupts + ldr r7, [r6, #0x104] + str r0, [sp, #8] + cmp r7, #0 + bne _020A1C68 + ldr r0, [sp, #0x34] + mov r4, #1 + and sb, r0, #1 + mov r5, #0 +_020A1C10: + cmp sb, #0 + mvneq r8, #5 + beq _020A1C68 + add r0, r6, #0x10c + bl OS_SleepThread + mov r0, sl + bl SOCL_SocketIsInvalid + cmp r0, #0 + bne _020A1C54 + mov r1, r5 + cmp sl, #0 + beq _020A1C4C + ldrsh r0, [sl, #0x70] + tst r0, #1 + movne r1, r4 +_020A1C4C: + cmp r1, #0 + bne _020A1C5C +_020A1C54: + mvn r8, #0x37 + b _020A1C68 +_020A1C5C: + ldr r7, [r6, #0x104] + cmp r7, #0 + beq _020A1C10 +_020A1C68: + cmp r7, #0 + beq _020A1CF8 + ldrh r1, [r7, #4] + ldr r0, [sp, #4] + cmp r0, r1 + strgt r1, [sp, #4] + ldr r1, [sp] + ldr r2, [sp, #4] + add r0, r7, #0xc + bl MI_CpuCopy8 + cmp fp, #0 + ldrneh r0, [r7, #6] + ldr r1, [sp, #0x30] + strneh r0, [fp] + cmp r1, #0 + ldrne r0, [r7, #8] + strne r0, [r1] + ldrsb r0, [r6, #0xfe] + ldrh r8, [r7, #4] + cmp r0, #0 + bne _020A1CF8 + ldr r0, [r7] + ldr r1, _020A1D0C ; =_02110628 + str r0, [r6, #0x104] + ldr r0, [r7] + cmp r0, #0 + moveq r0, #0 + streq r0, [r6, #0x100] + ldr r1, [r1] + mov r0, r7 + ldr r1, [r1, #0x1c] + blx r1 + add r0, r6, #0x100 + ldrh r1, [r0, #8] + sub r1, r1, r8 + strh r1, [r0, #8] +_020A1CF8: + ldr r0, [sp, #8] + bl OS_RestoreInterrupts + mov r0, r8 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A1D0C: .word _02110628 + arm_func_end SOCLi_ReadUdpBuffer + + arm_func_start SOCLi_UdpRecvCallback +SOCLi_UdpRecvCallback: ; 0x020A1D10 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r2 + ldr r4, [r7, #0x64] + mov sb, r0 + mov r8, r1 + bl OS_DisableInterrupts + add r1, r4, #0x100 + ldrh r2, [r1, #8] + ldrh r1, [r1, #0xa] + mov r6, r0 + add r0, r2, r8 + cmp r1, r0 + blo _020A1DD4 + ldr r1, _020A1E1C ; =_02110628 + add r0, r8, #0xc + ldr r1, [r1] + ldr r1, [r1, #0x18] + blx r1 + movs r5, r0 + beq _020A1DC0 + add r1, r4, #0x100 + ldrh r3, [r1, #8] + mov r2, #0 + mov r0, sb + add r3, r3, r8 + strh r3, [r1, #8] + str r2, [r5] + strh r8, [r5, #4] + ldrh r3, [r7, #0x18] + mov r2, r8 + add r1, r5, #0xc + strh r3, [r5, #6] + ldr r3, [r7, #0x1c] + str r3, [r5, #8] + bl MI_CpuCopy8 + ldr r0, [r4, #0x100] + cmp r0, #0 + ldrne r0, [r4, #0x100] + strne r5, [r0] + str r5, [r4, #0x100] + ldr r0, [r4, #0x104] + cmp r0, #0 + streq r5, [r4, #0x104] + b _020A1DE4 +_020A1DC0: + ldr r0, _020A1E20 ; =_021D4484 + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + b _020A1DE4 +_020A1DD4: + ldr r0, _020A1E20 ; =_021D4484 + ldr r1, [r0, #4] + add r1, r1, #1 + str r1, [r0, #4] +_020A1DE4: + ldrh r0, [r7, #0x74] + cmp r0, #0 + ldreqh r0, [r7, #0xa] + streqh r0, [r7, #0x74] + ldrh r1, [r7, #0x1a] + add r0, r4, #0x10c + strh r1, [r7, #0x18] + ldr r1, [r7, #0x20] + str r1, [r7, #0x1c] + bl OS_WakeupThread + mov r0, r6 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A1E1C: .word _02110628 +_020A1E20: .word _021D4484 + arm_func_end SOCLi_UdpRecvCallback + + arm_func_start SOCL_WriteTo +SOCL_WriteTo: ; 0x020A1E24 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl SOCL_SocketIsInvalid + cmp r0, #0 + addne sp, sp, #8 + mvnne r0, #0x1b + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + cmp r8, #0 + mov r1, #0 + beq _020A1E68 + ldrsh r0, [r8, #0x70] + tst r0, #1 + movne r1, #1 +_020A1E68: + cmp r1, #0 + addeq sp, sp, #8 + mvneq r0, #0x26 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrsb r0, [r8, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A1EB8 + ldrsh r0, [r8, #0x70] + tst r0, #4 + beq _020A1EAC + ldrsh r0, [r8, #0x70] + tst r0, #8 + beq _020A1EB8 +_020A1EAC: + add sp, sp, #8 + mvn r0, #0x37 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A1EB8: + ldr r0, [sp, #0x24] + ldr r4, [r8, #0x68] + tst r0, #4 + bne _020A1ED4 + ldrsb r0, [r8, #0x72] + cmp r0, #0 + bne _020A1EF4 +_020A1ED4: + add r0, r4, #0xe0 + bl OS_TryLockMutex + cmp r0, #0 + addeq sp, sp, #8 + mvneq r0, #5 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov ip, #0 + b _020A1F00 +_020A1EF4: + add r0, r4, #0xe0 + bl OS_LockMutex + mov ip, #1 +_020A1F00: + ldr r1, [sp, #0x20] + mov r0, r8 + str r1, [sp] + mov r1, r7 + mov r2, r6 + mov r3, r5 + str ip, [sp, #4] + bl SOCLi_WriteBuffer + mov r5, r0 + add r0, r4, #0xe0 + bl OS_UnlockMutex + mov r0, r5 + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end SOCL_WriteTo + + arm_func_start SOCLi_WriteBuffer +SOCLi_WriteBuffer: ; 0x020A1F38 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sl, r0 + ldr r4, [sl, #0x68] + ldrsb r0, [sl, #0x73] + ldr r4, [r4, #0x10c] + mov sb, r1 + str r3, [sp, #0xc] + cmp r0, #1 + mov r8, r2 + ldr r7, [sp, #0x40] + ldr r6, [sp, #0x44] + ldr r0, [r4, #0x48] + mov r5, #0 + bne _020A1F90 + sub r0, r0, #0x2a + cmp r8, r0 + addgt sp, sp, #0x18 + subgt r0, r5, #0x23 + ldmgtia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + str r8, [sp, #0x10] + b _020A1FA0 +_020A1F90: + sub r0, r0, #0x36 + str r0, [sp, #0x10] + cmp r8, r0 + strle r8, [sp, #0x10] +_020A1FA0: + cmp r8, #0 + ble _020A2030 + and fp, r6, #1 +_020A1FAC: + ldr r2, [sp, #0x10] + mov r0, sl + mov r1, r8 + add r3, sp, #0x14 + str r6, [sp] + bl SOCLi_AllocWriteBuffer + mov r4, r0 + cmp r4, #0 + ble _020A200C + ldr r0, [sp, #0xc] + mov r1, sb + stmia sp, {r0, r7} + str r6, [sp, #8] + ldr r3, [sp, #0x14] + mov r0, sl + mov r2, r4 + bl SOCLi_ExecWriteCommand + cmp r0, #0 + addle sp, sp, #0x18 + mvnle r0, #5 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add sb, sb, r4 + sub r8, r8, r4 + add r5, r5, r4 +_020A200C: + cmp fp, #0 + bne _020A2028 + cmp r4, #0 + bgt _020A2030 + add sp, sp, #0x18 + mvn r0, #5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020A2028: + cmp r8, #0 + bgt _020A1FAC +_020A2030: + mov r0, r5 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end SOCLi_WriteBuffer + + arm_func_start SOCLi_AllocWriteBuffer +SOCLi_AllocWriteBuffer: ; 0x020A203C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + cmp r8, sb + mov r7, r3 + ldr r4, [sl, #0x68] + movgt r8, sb + bl OS_DisableInterrupts + ldr r1, [sp, #0x28] + mov fp, r0 + and r6, r1, #1 +_020A206C: + mov r0, sl + bl SOCLi_GetWriteBufferFreeSize + mov r5, r0 + cmp r5, r8 + blt _020A2098 + add r0, r4, #0x100 + ldrh r0, [r0] + cmp r5, sb + movge r5, sb + str r0, [r7] + b _020A20B0 +_020A2098: + cmp r6, #0 + moveq r5, #0 + beq _020A20B0 + add r0, r4, #0x104 + bl OS_SleepThread + b _020A206C +_020A20B0: + mov r0, fp + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end SOCLi_AllocWriteBuffer + + arm_func_start SOCLi_GetWriteBufferFreeSize +SOCLi_GetWriteBufferFreeSize: ; 0x020A20C0 + ldr r2, [r0, #0x68] + add r0, r2, #0x100 + ldrh r1, [r0] + ldrh r0, [r0, #2] + ldr r2, [r2, #0xf8] + sub r0, r0, r1 + subs r0, r0, #1 + addmi r0, r0, r2 + bx lr + arm_func_end SOCLi_GetWriteBufferFreeSize + + arm_func_start SOCLi_ExecWriteCommand +SOCLi_ExecWriteCommand: ; 0x020A20E4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r4, [sb, #0x68] + mov r6, r1 + mov r8, r2 + ldr r1, [r4, #0x10c] + ldr r2, [sp, #0x28] + ldr r0, _020A2254 ; =SOCLi_WriteCallBack + mov r7, r3 + bl SOCLi_CreateCommandPacket + movs r5, r0 + mvneq r0, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r0, [sp, #0x28] + add r1, r7, r8 + tst r0, #1 + ldrnesb r0, [sb, #0x73] + cmpne r0, #1 + movne r0, #3 + strneb r0, [r5, #0xd] + moveq r0, #0 + streqb r0, [r5, #0xd] + ldr r3, [r4, #0xfc] + ldr r2, [r4, #0xf8] + add r0, r3, r7 + cmp r1, r2 + str r0, [r5, #0x10] + bge _020A216C + str r8, [r5, #0x14] + mov r0, #0 + str r0, [r5, #0x18] + mov r7, r1 + str r0, [r5, #0x1c] + b _020A2198 +_020A216C: + sub r0, r2, r7 + str r0, [r5, #0x14] + str r3, [r5, #0x18] + ldr r0, [r5, #0x14] + sub r7, r8, r0 + str r7, [r5, #0x1c] + ldr r0, [r5, #0x14] + ldr r1, [r5, #0x18] + mov r2, r7 + add r0, r6, r0 + bl MI_CpuCopy8 +_020A2198: + ldr r1, [r5, #0x10] + ldr r2, [r5, #0x14] + mov r0, r6 + bl MI_CpuCopy8 + add r0, r4, #0x100 + ldrh r6, [r0] + strh r7, [r5, #0x20] + ldrh r1, [r5, #0x20] + strh r1, [r0] + ldrsb r0, [sb, #0x73] + cmp r0, #1 + bne _020A2228 + ldrh r0, [sb, #0x74] + cmp r0, #0 + bne _020A21E4 + bl CPS_SocGetEport + strh r0, [sb, #0x74] + ldrh r0, [sb, #0x74] + strh r0, [sb, #0xa] +_020A21E4: + ldrh r0, [sb, #0x74] + strh r0, [r5, #0x24] + ldr r1, [sb, #0x78] + cmp r1, #0 + beq _020A2204 + ldr r0, [sp, #0x24] + cmp r0, #0 + beq _020A2218 +_020A2204: + ldr r1, [sp, #0x24] + ldrh r0, [sp, #0x20] + str r1, [r5, #0x28] + strh r0, [r5, #0x26] + b _020A2230 +_020A2218: + str r1, [r5, #0x28] + ldrh r0, [sb, #0x76] + strh r0, [r5, #0x26] + b _020A2230 +_020A2228: + mov r0, #0 + str r0, [r5, #0x28] +_020A2230: + ldr r0, [r4, #0x10c] + mov r1, r5 + bl SOCLi_ExecCommandPacketInSendPipe + cmp r0, #0 + addne r0, r4, #0x100 + movne r8, #0 + strneh r6, [r0] + mov r0, r8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A2254: .word SOCLi_WriteCallBack + arm_func_end SOCLi_ExecWriteCommand + + arm_func_start SOCLi_WriteCallBack +SOCLi_WriteCallBack: ; 0x020A2258 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sb, r0 + ldr r5, [sb, #4] + mov r7, #0 + ldrsb r0, [r5, #0x73] + mov r1, #1 + ldr r6, [r5, #0x68] + cmp r0, #0 + cmpne r0, #4 + movne r1, r7 + cmp r1, #0 + beq _020A2294 + ldrsh r0, [r5, #0x70] + tst r0, #4 + beq _020A2368 +_020A2294: + ldr r2, [sb, #0x28] + cmp r2, #0 + beq _020A22AC + ldrh r0, [sb, #0x24] + ldrh r1, [sb, #0x26] + bl CPS_SocBind +_020A22AC: + ldrsb r1, [r5, #0x73] + mov r0, #1 + ldr r4, [r5, #0x4c] + cmp r1, #0 + cmpne r1, #4 + movne r0, #0 + cmp r0, #0 + movne r8, #0x36 + moveq r8, #0x2a + cmp r1, #0 + cmpne r1, #4 + ldrne r0, [r5, #0x48] + subne sl, r0, r8 + bne _020A22F4 + ldr r0, [r5, #0x48] + sub r0, r0, r8 + bl SOCLi_GetOptimumSendBufLen + mov sl, r0 +_020A22F4: + mov r1, sl + mov r2, sb + add r0, r4, r8 + bl SOCLi_MemCpy + mov r1, r0 + cmp r1, #0 + ble _020A236C + add r0, r4, r8 + bl CPS_SocWrite + cmp r0, #0 + bgt _020A2360 + ldrsb r0, [r5, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A2358 + ldrsh r0, [r5, #0x70] + bic r0, r0, #0xe + strh r0, [r5, #0x70] + ldrsh r0, [r5, #0x70] + orr r0, r0, #0x80 + strh r0, [r5, #0x70] + bl CPS_TcpClose +_020A2358: + mvn r7, #0x4b + b _020A236C +_020A2360: + add r7, r7, r0 + b _020A22F4 +_020A2368: + mvn r7, #0x4b +_020A236C: + ldrh r2, [sb, #0x20] + add r1, r6, #0x100 + add r0, r6, #0x104 + strh r2, [r1, #2] + bl OS_WakeupThread + mov r0, r7 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end SOCLi_WriteCallBack + + arm_func_start SOCLi_GetOptimumSendBufLen +SOCLi_GetOptimumSendBufLen: ; 0x020A2388 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020A2424 ; =OSi_ThreadInfo + mov r4, r0 + ldr r0, [r1, #4] + ldr r5, [r0, #0xa4] + bl OS_DisableInterrupts + cmp r5, #0 + beq _020A23EC + ldrh r3, [r5, #0x2e] + cmp r3, #0 + ldrneh r2, [r5, #0x2c] + cmpne r2, #0 + beq _020A23DC + ldr r1, _020A2428 ; =_021D4430 + cmp r3, r2 + ldr r1, [r1, #0x24] + movgt r3, r2 + cmp r3, r1 + movgt r3, r1 + mov r5, r3, lsl #1 + b _020A23F8 +_020A23DC: + ldr r1, _020A2428 ; =_021D4430 + ldr r1, [r1, #0x24] + mov r5, r1, lsl #1 + b _020A23F8 +_020A23EC: + ldr r1, _020A2428 ; =_021D4430 + ldr r1, [r1, #0x24] + mov r5, r1, lsl #1 +_020A23F8: + bl OS_RestoreInterrupts + cmp r5, #0 + ble _020A241C + mov r0, r4 + mov r1, r5 + bl _s32_div_f + cmp r0, #0 + mulgt r0, r5, r0 + ldmgtia sp!, {r3, r4, r5, pc} +_020A241C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A2424: .word OSi_ThreadInfo +_020A2428: .word _021D4430 + arm_func_end SOCLi_GetOptimumSendBufLen + + arm_func_start SOCLi_MemCpy +SOCLi_MemCpy: ; 0x020A242C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r2 + ldr r4, [r6, #0x14] + ldr r5, [r6, #0x1c] + cmp r4, r1 + mov r7, r0 + movgt r4, r1 + movgt r5, #0 + bgt _020A245C + sub r0, r1, r4 + cmp r5, r0 + movgt r5, r0 +_020A245C: + cmp r4, #0 + ble _020A248C + ldr r0, [r6, #0x10] + mov r1, r7 + mov r2, r4 + bl MI_CpuCopy8 + ldr r0, [r6, #0x10] + add r0, r0, r4 + str r0, [r6, #0x10] + ldr r0, [r6, #0x14] + sub r0, r0, r4 + str r0, [r6, #0x14] +_020A248C: + cmp r5, #0 + ble _020A24BC + ldr r0, [r6, #0x18] + mov r2, r5 + add r1, r7, r4 + bl MI_CpuCopy8 + ldr r0, [r6, #0x18] + add r0, r0, r5 + str r0, [r6, #0x18] + ldr r0, [r6, #0x1c] + sub r0, r0, r5 + str r0, [r6, #0x1c] +_020A24BC: + add r0, r4, r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SOCLi_MemCpy + + arm_func_start SOCL_Shutdown +SOCL_Shutdown: ; 0x020A24C4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, pc} + cmp r4, #0 + mov r1, #0 + beq _020A24F4 + ldrsh r0, [r4, #0x70] + tst r0, #1 + movne r1, #1 +_020A24F4: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsh r0, [r4, #0x70] + tst r0, #4 + beq _020A2518 + ldrsh r0, [r4, #0x70] + tst r0, #8 + beq _020A2520 +_020A2518: + mvn r0, #0x37 + ldmia sp!, {r3, r4, r5, pc} +_020A2520: + ldrsh r0, [r4, #0x70] + orr r0, r0, #8 + strh r0, [r4, #0x70] + ldr r5, [r4, #0x68] + cmp r5, #0 + ldrne r1, [r5, #0x10c] + cmpne r1, #0 + beq _020A2564 + ldrsb r2, [r4, #0x72] + ldr r0, _020A256C ; =SOCLi_ShutdownCallBack + bl SOCLi_CreateCommandPacket + movs r1, r0 + mvneq r0, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x10c] + bl SOCLi_ExecCommandPacketInSendPipe + ldmia sp!, {r3, r4, r5, pc} +_020A2564: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A256C: .word SOCLi_ShutdownCallBack + arm_func_end SOCL_Shutdown + + arm_func_start SOCLi_ShutdownCallBack +SOCLi_ShutdownCallBack: ; 0x020A2570 + stmdb sp!, {r3, lr} + ldr r0, [r0, #4] + mov r1, #1 + ldrsb r0, [r0, #0x73] + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A2598 + bl CPS_TcpShutdown +_020A2598: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end SOCLi_ShutdownCallBack + + arm_func_start SOCL_IsClosed +SOCL_IsClosed: ; 0x020A25A0 + stmdb sp!, {r4, lr} + movs r4, r0 + bmi _020A25CC + bl SOCL_SocketIsInvalid + cmp r0, #0 + beq _020A25CC + mov r0, r4 + bl SOCL_SocketIsInTrash + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, pc} +_020A25CC: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end SOCL_IsClosed + + arm_func_start SOCL_Close +SOCL_Close: ; 0x020A25D4 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r4, #0 + mvnle r0, #0x1b + ldmleia sp!, {r4, pc} + bl SOCL_SocketIsInTrash + cmp r0, #0 + mvnne r0, #0x19 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl SOCL_SocketIsInvalid + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, pc} + cmp r4, #0 + mov r1, #0 + beq _020A2624 + ldrsh r0, [r4, #0x70] + tst r0, #1 + movne r1, #1 +_020A2624: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r4, pc} + ldrsh r0, [r4, #0x70] + tst r0, #0x10 + mvnne r0, #0x19 + ldmneia sp!, {r4, pc} + ldrsh r0, [r4, #0x70] + mov r1, #1 + orr r0, r0, #0x18 + strh r0, [r4, #0x70] + ldrsb r0, [r4, #0x73] + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A2674 + ldr r0, [r4, #0x68] + mov r1, #0 + bl SOCLi_SendCommandPacket +_020A2674: + ldr r0, _020A26A0 ; =SOCLi_CloseCallBack + mov r1, r4 + mov r2, #1 + bl SOCLi_CreateCommandPacket + mov r1, r0 + mov r2, #0 + mov r0, r4 + str r2, [r1, #8] + bl SOCLi_SendCommandPacketToCtrlPipe + mov r0, #0 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A26A0: .word SOCLi_CloseCallBack + arm_func_end SOCL_Close + + arm_func_start SOCLi_CloseCallBack +SOCLi_CloseCallBack: ; 0x020A26A4 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [r0, #4] + mov r1, #1 + ldrsb r0, [r4, #0x73] + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A26E0 + ldr r0, [r4, #0x68] + add r0, r0, #0x20 + bl OS_JoinThread + bl CPS_TcpShutdown + bl CPS_TcpClose + bl CPS_SocRelease +_020A26E0: + bl CPS_SocUnRegister + ldrsh r0, [r4, #0x70] + mov r1, #0 + bic r0, r0, #6 + strh r0, [r4, #0x70] + ldrsb r0, [r4, #0x73] + cmp r0, #2 + ldreq r0, [r4, #0x68] + ldrne r0, [r4, #0x64] + bl SOCLi_SendCommandPacket + bl OS_DisableInterrupts + mov r5, r0 + mov r0, r4 + bl SOCLi_SocketUnregister + mov r0, r4 + bl SOCLi_SocketRegisterTrash + mov r0, r5 + bl OS_RestoreInterrupts + ldrsh r1, [r4, #0x70] + mov r0, #0 + orr r1, r1, #0x20 + strh r1, [r4, #0x70] + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCLi_CloseCallBack + + arm_func_start SOCLi_CleanupSocket +SOCLi_CleanupSocket: ; 0x020A273C + stmdb sp!, {r4, r5, r6, lr} + movs r4, r0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #0 + strh r0, [r4, #0x70] + ldrsb r2, [r4, #0x73] + mov r1, #1 + cmp r2, #0 + cmpne r2, #4 + movne r1, r0 + cmp r1, #0 + beq _020A2780 + ldr r0, [r4, #0x68] + bl SOCLi_FreeCommandPipe + ldr r0, [r4, #0x64] + bl SOCLi_FreeCommandPipe + b _020A2800 +_020A2780: + cmp r2, #1 + bne _020A27F0 + ldr r0, [r4, #0x64] + ldr r0, [r0, #0x104] + cmp r0, #0 + beq _020A27B8 + ldr r5, _020A2838 ; =_02110628 +_020A279C: + ldr r1, [r5] + ldr r6, [r0] + ldr r1, [r1, #0x1c] + blx r1 + mov r0, r6 + cmp r6, #0 + bne _020A279C +_020A27B8: + ldr r0, [r4, #0x64] + mov r1, #0 + add r0, r0, #0x100 + strh r1, [r0, #8] + ldr r0, [r4, #0x64] + str r1, [r0, #0x100] + ldr r0, [r4, #0x64] + str r1, [r0, #0x104] + ldr r0, [r4, #0x64] + add r0, r0, #0x10c + bl OS_WakeupThread + ldr r0, [r4, #0x64] + bl SOCLi_FreeCommandPipe + b _020A2800 +_020A27F0: + cmp r2, #2 + bne _020A2800 + ldr r0, [r4, #0x68] + bl SOCLi_FreeCommandPipe +_020A2800: + bl OS_DisableInterrupts + mov r5, r0 + mov r0, r4 + bl SOCLi_SocketUnregister + mov r0, r4 + bl SOCLi_SocketUnregisterTrash + ldr r1, _020A2838 ; =_02110628 + mov r0, r4 + ldr r1, [r1] + ldr r1, [r1, #0x1c] + blx r1 + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A2838: .word _02110628 + arm_func_end SOCLi_CleanupSocket + + arm_func_start SOCLi_FreeCommandPipe +SOCLi_FreeCommandPipe: ; 0x020A283C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + movs sb, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r0, sb, #0x20 + bl OS_JoinThread + bl OS_DisableInterrupts + mov r8, r0 + bl OS_DisableScheduler + add r1, sp, #0 + mov r0, sb + mov r2, #0 + bl OS_ReceiveMessage + cmp r0, #0 + beq _020A28C8 + mov r6, #0 + mvn r7, #0xa + add r5, sp, #0 + mov r4, r6 +_020A2884: + ldr r0, [sp] + cmp r0, #0 + beq _020A28B0 + ldr r0, [r0, #8] + cmp r0, #0 + beq _020A28A8 + mov r1, r7 + mov r2, r6 + bl OS_SendMessage +_020A28A8: + ldr r0, [sp] + bl SOCLi_FreeCommandPacket +_020A28B0: + mov r0, sb + mov r1, r5 + mov r2, r4 + bl OS_ReceiveMessage + cmp r0, #0 + bne _020A2884 +_020A28C8: + bl OS_EnableScheduler + bl OS_RescheduleThread + mov r0, r8 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end SOCLi_FreeCommandPipe + + arm_func_start SOCLi_TrashSocket +SOCLi_TrashSocket: ; 0x020A28DC + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + ldr r4, _020A2914 ; =_021D4490 + mov r5, r0 + ldr r0, [r4] + cmp r0, #0 + beq _020A2908 +_020A28F8: + bl SOCLi_CleanupSocket + ldr r0, [r4] + cmp r0, #0 + bne _020A28F8 +_020A2908: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A2914: .word _021D4490 + arm_func_end SOCLi_TrashSocket + + arm_func_start SOCL_Cleanup +SOCL_Cleanup: ; 0x020A2918 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _020A29AC ; =_021D4424 + ldr r0, [r1] + cmp r0, #0 + ldreq r0, _020A29B0 ; =_021D4670 + ldreq r0, [r0] + streq r0, [r1] + bl SOCL_CalmDown + mvn r4, #0x19 + cmp r0, r4 + bne _020A295C + mov r5, #0x64 +_020A2948: + mov r0, r5 + bl OS_Sleep + bl SOCL_CalmDown + cmp r0, r4 + beq _020A2948 +_020A295C: + bl SOCLi_CleanupCommandPacketQueue + movs r4, r0 + bmi _020A29A4 + bl CPS_Cleanup + mov r0, #0 + bl CPS_SetScavengerCallback + ldr r0, _020A29B4 ; =_02110628 + ldr r1, [r0] + ldr r0, [r1, #0x28] + cmp r0, #0 + bne _020A2998 + ldr r0, _020A29B8 ; =_021D4430 + ldr r1, [r1, #0x1c] + ldr r0, [r0, #0x1c] + blx r1 +_020A2998: + ldr r0, _020A29B4 ; =_02110628 + mov r1, #0 + str r1, [r0] +_020A29A4: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A29AC: .word _021D4424 +_020A29B0: .word _021D4670 +_020A29B4: .word _02110628 +_020A29B8: .word _021D4430 + arm_func_end SOCL_Cleanup + + arm_func_start SOCL_CloseAll +SOCL_CloseAll: ; 0x020A29BC + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _020A2A58 ; =_021D442C + ldr r5, _020A2A5C ; =_021D448C +_020A29C8: + bl OS_DisableInterrupts + ldr r6, [r5] + cmp r6, #0 + beq _020A29FC + ldr r2, [r4] +_020A29DC: + cmp r6, r2 + beq _020A29F0 + ldrsh r1, [r6, #0x70] + tst r1, #0x10 + beq _020A29FC +_020A29F0: + ldr r6, [r6, #0x7c] + cmp r6, #0 + bne _020A29DC +_020A29FC: + bl OS_RestoreInterrupts + cmp r6, #0 + beq _020A2A14 + mov r0, r6 + bl SOCL_Close + b _020A29C8 +_020A2A14: + ldr r0, _020A2A5C ; =_021D448C + ldr r1, [r0] + cmp r1, #0 + beq _020A2A3C + ldr r0, _020A2A58 ; =_021D442C + ldr r0, [r0] + cmp r1, r0 + ldreq r0, [r1, #0x7c] + cmpeq r0, #0 + bne _020A2A50 +_020A2A3C: + ldr r0, _020A2A60 ; =_021D4490 + ldr r0, [r0] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_020A2A50: + mvn r0, #0x19 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A2A58: .word _021D442C +_020A2A5C: .word _021D448C +_020A2A60: .word _021D4490 + arm_func_end SOCL_CloseAll + + arm_func_start SOCL_CalmDown +SOCL_CalmDown: ; 0x020A2A64 + stmdb sp!, {r4, lr} + ldr r0, _020A2ADC ; =_021D442C + ldr r0, [r0] + cmp r0, #0 + beq _020A2AB8 + bl SOCL_CloseAll + movs r4, r0 + bne _020A2AB0 + ldr r0, _020A2ADC ; =_021D442C + ldr r0, [r0] + bl SOCL_Close + ldr r0, _020A2ADC ; =_021D442C + ldr r0, [r0] + bl SOCL_IsClosed + cmp r0, #0 + ldrne r0, _020A2ADC ; =_021D442C + movne r1, #0 + strne r1, [r0] + mvn r4, #0x19 +_020A2AB0: + bl SOCLi_TrashSocket + b _020A2AD4 +_020A2AB8: + bl CPS_CalmDown + cmp r0, #0 + mvneq r4, #0x19 + beq _020A2AD4 + mov r0, #0 + bl WCM_SetRecvDCFCallback + mov r4, #0 +_020A2AD4: + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A2ADC: .word _021D442C + arm_func_end SOCL_CalmDown + + arm_func_start SOCL_Resolve +SOCL_Resolve: ; 0x020A2AE0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x64 + movs r5, r0 + addeq sp, sp, #0x64 + moveq r0, #0 + ldmeqia sp!, {r4, r5, pc} + ldr r1, _020A2B84 ; =_02110628 + mov r0, #0xfd0 + ldr r1, [r1] + ldr r1, [r1, #0x18] + blx r1 + movs r4, r0 + addeq sp, sp, #0x64 + moveq r0, #0 + ldmeqia sp!, {r4, r5, pc} + add r0, sp, #0 + mov r1, #0 + mov r2, #0x64 + bl MI_CpuFill8 + add r0, r4, #0x368 + add r2, r0, #0x800 + ldr r3, _020A2B88 ; =0x00000B68 + ldr r1, _020A2B8C ; =0x00000466 + add r0, sp, #0 + str r4, [sp, #0x40] + str r3, [sp, #0x3c] + str r2, [sp, #0x4c] + str r1, [sp, #0x48] + bl CPS_SocRegister + mov r0, r5 + bl CPS_Resolve + mov r5, r0 + bl CPS_SocUnRegister + ldr r1, _020A2B84 ; =_02110628 + mov r0, r4 + ldr r1, [r1] + ldr r1, [r1, #0x1c] + blx r1 + mov r0, r5 + add sp, sp, #0x64 + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_020A2B84: .word _02110628 +_020A2B88: .word 0x00000B68 +_020A2B8C: .word 0x00000466 + arm_func_end SOCL_Resolve + + arm_func_start SOCL_InetAtoH +SOCL_InetAtoH: ; 0x020A2B90 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020A2BD8 ; =_021D4680 + mov r5, r0 + ldmia r1, {r6, r7} + mov r2, #0 + str r2, [r1] + mov r0, r4 + str r2, [r1, #4] + bl CPS_Resolve + ldr r1, _020A2BD8 ; =_021D4680 + mov r4, r0 + mov r0, r5 + stmia r1, {r6, r7} + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A2BD8: .word _021D4680 + arm_func_end SOCL_InetAtoH + + arm_func_start SOCL_SetResolver +SOCL_SetResolver: ; 0x020A2BDC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl SOCL_GetHostID + cmp r0, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, _020A2C0C ; =_021D4680 + mov r0, #0 + str r5, [r1] + str r4, [r1, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A2C0C: .word _021D4680 + arm_func_end SOCL_SetResolver + + arm_func_start SOCL_GetHostID +SOCL_GetHostID: ; 0x020A2C10 + stmdb sp!, {r3, lr} + ldr r0, _020A2C6C ; =_021D4670 + ldr r2, [r0] + cmp r2, #0 + bne _020A2C50 + ldr r0, _020A2C70 ; =_021D4428 + ldr r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _020A2C60 + bl OS_GetProcMode + cmp r0, #0x12 + beq _020A2C60 + mov r0, #0xa + bl OS_Sleep + b _020A2C60 +_020A2C50: + ldr r0, _020A2C74 ; =_021D4424 + ldr r1, [r0] + cmp r1, #0 + streq r2, [r0] +_020A2C60: + ldr r0, _020A2C6C ; =_021D4670 + ldr r0, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_020A2C6C: .word _021D4670 +_020A2C70: .word _021D4428 +_020A2C74: .word _021D4424 + arm_func_end SOCL_GetHostID + + arm_func_start SOCL_GetStatus +SOCL_GetStatus: ; 0x020A2C78 + stmdb sp!, {r4, r5, r6, lr} + mov r4, #0 + mov r5, r0 + bl SOCL_SocketIsInvalid + cmp r0, #0 + orrne r4, r4, #0x80 + bne _020A2D40 + ldrsh r0, [r5, #0x70] + tst r0, #0x40 + ldrsb r0, [r5, #0x73] + orrne r4, r4, #0x20 + cmp r0, #1 + beq _020A2CB8 + ldrsh r0, [r5, #0x70] + tst r0, #4 + beq _020A2CE8 +_020A2CB8: + bl OS_DisableInterrupts + mov r6, r0 + mov r0, r5 + bl SOCLi_GetReadBufferOccpiedSize + cmp r0, #0 + mov r0, r5 + orrgt r4, r4, #1 + bl SOCLi_GetWriteBufferFreeSize + cmp r0, #0 + mov r0, r6 + orrgt r4, r4, #8 + bl OS_RestoreInterrupts +_020A2CE8: + ldrsb r0, [r5, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + beq _020A2D40 + ldrsh r0, [r5, #0x70] + tst r0, #4 + ldrneb r0, [r5, #8] + cmpne r0, #4 + beq _020A2D28 + tst r4, #1 + ldreqsh r0, [r5, #0x70] + biceq r0, r0, #6 + streqh r0, [r5, #0x70] +_020A2D28: + ldrsh r0, [r5, #0x70] + tst r0, #2 + bne _020A2D40 + ldrsh r0, [r5, #0x70] + tst r0, #4 + orreq r4, r4, #0x40 +_020A2D40: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SOCL_GetStatus + + arm_func_start SOCLi_GetReadBufferOccpiedSize +SOCLi_GetReadBufferOccpiedSize: ; 0x020A2D48 + ldr r2, [r0, #0x64] + mov r3, #0 + cmp r2, #0 + beq _020A2D88 + ldrsb r1, [r0, #0x73] + cmp r1, #1 + bne _020A2D74 + ldr r0, [r2, #0x104] + cmp r0, #0 + ldrneh r3, [r0, #4] + b _020A2D88 +_020A2D74: + cmp r1, #0 + cmpne r1, #4 + ldreq r1, [r0, #0x44] + ldreq r0, [r2, #0xf8] + subeq r3, r1, r0 +_020A2D88: + mov r0, r3 + bx lr + arm_func_end SOCLi_GetReadBufferOccpiedSize + + arm_func_start SOCLi_RoundUp4 +SOCLi_RoundUp4: ; 0x020A2D90 + add r0, r0, #3 + bic r0, r0, #3 + bx lr + arm_func_end SOCLi_RoundUp4 + + arm_func_start SOCLi_SocketRegister +SOCLi_SocketRegister: ; 0x020A2D9C + ldr ip, _020A2DAC ; =SOCLi_SocketRegisterList + mov r1, r0 + ldr r0, _020A2DB0 ; =_021D448C + bx ip + .align 2, 0 +_020A2DAC: .word SOCLi_SocketRegisterList +_020A2DB0: .word _021D448C + arm_func_end SOCLi_SocketRegister + + arm_func_start SOCLi_SocketRegisterList +SOCLi_SocketRegisterList: ; 0x020A2DB4 + ldr r2, [r0] + str r2, [r1, #0x7c] + str r1, [r0] + bx lr + arm_func_end SOCLi_SocketRegisterList + + arm_func_start SOCLi_SocketRegisterTrash +SOCLi_SocketRegisterTrash: ; 0x020A2DC4 + ldr ip, _020A2DD4 ; =SOCLi_SocketRegisterList + mov r1, r0 + ldr r0, _020A2DD8 ; =_021D4490 + bx ip + .align 2, 0 +_020A2DD4: .word SOCLi_SocketRegisterList +_020A2DD8: .word _021D4490 + arm_func_end SOCLi_SocketRegisterTrash + + arm_func_start SOCLi_SocketUnregister +SOCLi_SocketUnregister: ; 0x020A2DDC + ldr ip, _020A2DEC ; =SOCLi_SocketUnregisterList + mov r1, r0 + ldr r0, _020A2DF0 ; =_021D448C + bx ip + .align 2, 0 +_020A2DEC: .word SOCLi_SocketUnregisterList +_020A2DF0: .word _021D448C + arm_func_end SOCLi_SocketUnregister + + arm_func_start SOCLi_SocketUnregisterList +SOCLi_SocketUnregisterList: ; 0x020A2DF4 + stmdb sp!, {r4, lr} + mov r4, r1 + bl SOCLi_SocketGetNextPtr + cmp r0, #0 + ldrne r1, [r4, #0x7c] + strne r1, [r0] + ldmia sp!, {r4, pc} + arm_func_end SOCLi_SocketUnregisterList + + arm_func_start SOCLi_SocketGetNextPtr +SOCLi_SocketGetNextPtr: ; 0x020A2E10 + ldr r2, [r0] + cmp r2, #0 + beq _020A2E34 +_020A2E1C: + cmp r2, r1 + bxeq lr + add r0, r2, #0x7c + ldr r2, [r2, #0x7c] + cmp r2, #0 + bne _020A2E1C +_020A2E34: + mov r0, #0 + bx lr + arm_func_end SOCLi_SocketGetNextPtr + + arm_func_start SOCLi_SocketUnregisterTrash +SOCLi_SocketUnregisterTrash: ; 0x020A2E3C + ldr ip, _020A2E4C ; =SOCLi_SocketUnregisterList + mov r1, r0 + ldr r0, _020A2E50 ; =_021D4490 + bx ip + .align 2, 0 +_020A2E4C: .word SOCLi_SocketUnregisterList +_020A2E50: .word _021D4490 + arm_func_end SOCLi_SocketUnregisterTrash + + arm_func_start SOCL_SocketIsInvalid +SOCL_SocketIsInvalid: ; 0x020A2E54 + stmdb sp!, {r3, lr} + mov r1, r0 + cmp r1, #0 + ble _020A2E74 + ldr r0, _020A2E84 ; =_021D448C + bl SOCLi_SocketGetNextPtr + cmp r0, #0 + bne _020A2E7C +_020A2E74: + mov r0, #1 + ldmia sp!, {r3, pc} +_020A2E7C: + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A2E84: .word _021D448C + arm_func_end SOCL_SocketIsInvalid + + arm_func_start SOCL_SocketIsInTrash +SOCL_SocketIsInTrash: ; 0x020A2E88 + stmdb sp!, {r3, lr} + mov r1, r0 + ldr r0, _020A2EA8 ; =_021D4490 + bl SOCLi_SocketGetNextPtr + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A2EA8: .word _021D4490 + arm_func_end SOCL_SocketIsInTrash + + arm_func_start SOC_Socket +SOC_Socket: ; 0x020A2EAC + stmdb sp!, {r3, lr} + cmp r1, #1 + bne _020A2EC4 + ldr r0, _020A2ED0 ; =_02110648 + bl SOCL_CreateSocket + ldmia sp!, {r3, pc} +_020A2EC4: + ldr r0, _020A2ED4 ; =_02110630 + bl SOCL_CreateSocket + ldmia sp!, {r3, pc} + .align 2, 0 +_020A2ED0: .word _02110648 +_020A2ED4: .word _02110630 + arm_func_end SOC_Socket + + arm_func_start SOC_Bind +SOC_Bind: ; 0x020A2ED8 + ldrh r1, [r1, #2] + ldr ip, _020A2F00 ; =SOCL_Bind + mov r2, r1, asr #8 + mov r1, r1, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bx ip + .align 2, 0 +_020A2F00: .word SOCL_Bind + arm_func_end SOC_Bind + + arm_func_start SOC_Connect +SOC_Connect: ; 0x020A2F04 + stmdb sp!, {r4, lr} + ldrh r2, [r1, #2] + ldr lr, [r1, #4] + mov r4, r2, asr #8 + mov r1, r2, lsl #8 + mov r3, lr, lsr #0x18 + mov r2, lr, lsr #8 + mov ip, lr, lsl #8 + mov lr, lr, lsl #0x18 + and r4, r4, #0xff + and r1, r1, #0xff00 + orr r1, r4, r1 + mov r1, r1, lsl #0x10 + and r3, r3, #0xff + and r2, r2, #0xff00 + and ip, ip, #0xff0000 + orr r2, r3, r2 + and r3, lr, #0xff000000 + orr r2, ip, r2 + mov r1, r1, lsr #0x10 + orr r2, r3, r2 + bl SOCL_Connect + ldmia sp!, {r4, pc} + arm_func_end SOC_Connect + + arm_func_start SOC_Recv +SOC_Recv: ; 0x020A2F60 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov ip, #0 + str ip, [sp] + str r3, [sp, #4] + mov r3, ip + bl SOCL_ReadFrom + add sp, sp, #8 + ldmia sp!, {r3, pc} + arm_func_end SOC_Recv + + arm_func_start SOC_RecvFrom +SOC_RecvFrom: ; 0x020A2F84 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + add ip, sp, #0xc + str ip, [sp] + str r3, [sp, #4] + add r3, sp, #8 + bl SOCL_ReadFrom + cmp r0, #0 + addlt sp, sp, #0x10 + ldmltia sp!, {r3, pc} + ldr r1, [sp, #0x18] + cmp r1, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, pc} + ldrh r2, [sp, #8] + mov r3, r2, asr #8 + mov r2, r2, lsl #8 + and r3, r3, #0xff + and r2, r2, #0xff00 + orr r2, r3, r2 + strh r2, [r1, #2] + ldr lr, [sp, #0xc] + mov r3, lr, lsr #0x18 + mov r2, lr, lsr #8 + mov ip, lr, lsl #8 + mov lr, lr, lsl #0x18 + and r3, r3, #0xff + and r2, r2, #0xff00 + and ip, ip, #0xff0000 + orr r2, r3, r2 + and r3, lr, #0xff000000 + orr r2, ip, r2 + orr r2, r3, r2 + str r2, [r1, #4] + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + arm_func_end SOC_RecvFrom + + arm_func_start SOC_Send +SOC_Send: ; 0x020A3014 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov ip, #0 + str ip, [sp] + str r3, [sp, #4] + mov r3, ip + bl SOCL_WriteTo + add sp, sp, #8 + ldmia sp!, {r3, pc} + arm_func_end SOC_Send + + arm_func_start SOC_SendTo +SOC_SendTo: ; 0x020A3038 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r5, [sp, #0x20] + cmp r5, #0 + moveq r5, #0 + moveq r4, r5 + beq _020A30A4 + ldrh r4, [r5, #2] + ldr r6, [r5, #4] + mov r7, r4, asr #8 + mov ip, r4, lsl #8 + mov r4, r6, lsr #0x18 + mov lr, r6, lsr #8 + mov r5, r6, lsl #8 + mov r6, r6, lsl #0x18 + and r7, r7, #0xff + and ip, ip, #0xff00 + orr r7, r7, ip + and r4, r4, #0xff + and lr, lr, #0xff00 + and r5, r5, #0xff0000 + orr r4, r4, lr + mov ip, r7, lsl #0x10 + orr r4, r5, r4 + and r6, r6, #0xff000000 + mov r5, ip, lsr #0x10 + orr r4, r6, r4 +_020A30A4: + str r4, [sp] + str r3, [sp, #4] + mov r3, r5 + bl SOCL_WriteTo + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SOC_SendTo + + arm_func_start SOC_Shutdown +SOC_Shutdown: ; 0x020A30BC + ldr ip, _020A30C4 ; =SOCL_Shutdown + bx ip + .align 2, 0 +_020A30C4: .word SOCL_Shutdown + arm_func_end SOC_Shutdown + + arm_func_start SOC_Close +SOC_Close: ; 0x020A30C8 + ldr ip, _020A30D0 ; =SOCL_Close + bx ip + .align 2, 0 +_020A30D0: .word SOCL_Close + arm_func_end SOC_Close + + arm_func_start SOC_GetHostByName +SOC_GetHostByName: ; 0x020A30D4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl SOCL_Resolve + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _020A317C ; =_021D451C + ldr r2, _020A3180 ; =0x00000101 + mov r1, #0 + bl MI_CpuFill8 + ldr r0, _020A317C ; =_021D451C + ldr r2, _020A3180 ; =0x00000101 + mov r1, r5 + bl STD_CopyLString + mov r3, r4, lsr #0x18 + mov r2, r4, lsr #8 + mov ip, r4, lsl #8 + mov lr, r4, lsl #0x18 + ldr r4, _020A317C ; =_021D451C + ldr r1, _020A3184 ; =_021D4494 + mov r0, #0 + str r4, [r1, #0x20] + str r0, [r1, #0x24] + mov r4, #2 + strh r4, [r1, #0x28] + mov r4, #4 + ldr r5, _020A3188 ; =_021D44AC + strh r4, [r1, #0x2a] + and r3, r3, #0xff + and r2, r2, #0xff00 + ldr r4, _020A318C ; =_021D4494 + str r5, [r1, #0x2c] + str r4, [r1, #0x18] + and ip, ip, #0xff0000 + orr r2, r3, r2 + and r3, lr, #0xff000000 + orr r2, ip, r2 + str r0, [r1, #0x1c] + orr r2, r3, r2 + ldr r0, _020A3190 ; =_021D44B4 + str r2, [r1] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A317C: .word _021D451C +_020A3180: .word 0x00000101 +_020A3184: .word _021D4494 +_020A3188: .word _021D44AC +_020A318C: .word _021D4494 +_020A3190: .word _021D44B4 + arm_func_end SOC_GetHostByName + + arm_func_start SOC_GetSockName +SOC_GetSockName: ; 0x020A3194 + stmdb sp!, {r4, r5, r6, lr} + movs r5, r0 + mov r4, r1 + mvneq r0, #0x26 + ldmeqia sp!, {r4, r5, r6, pc} + bl SOCL_GetHostID + cmp r5, #0 + ldrneh r1, [r5, #0x74] + mov r2, r0, lsr #0x18 + mov r6, #8 + moveq r1, #0 + cmp r0, #0 + moveq r1, #0 + mov r1, r1, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r5, r3, asr #8 + mov lr, r3, lsl #8 + strb r6, [r4] + mov r6, #2 + mov r1, r0, lsr #8 + mov r3, r0, lsl #8 + mov ip, r0, lsl #0x18 + and r0, r1, #0xff00 + and r2, r2, #0xff + orr r0, r2, r0 + and r1, r3, #0xff0000 + and r5, r5, #0xff + and lr, lr, #0xff00 + strb r6, [r4, #1] + orr r3, r5, lr + and r2, ip, #0xff000000 + orr r0, r1, r0 + strh r3, [r4, #2] + orr r0, r2, r0 + str r0, [r4, #4] + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SOC_GetSockName + + arm_func_start SOC_GetHostID +SOC_GetHostID: ; 0x020A3228 + stmdb sp!, {r3, lr} + bl SOCL_GetHostID + mov r2, r0, lsr #0x18 + mov r1, r0, lsr #8 + mov r3, r0, lsl #8 + mov ip, r0, lsl #0x18 + and r2, r2, #0xff + and r0, r1, #0xff00 + and r1, r3, #0xff0000 + orr r0, r2, r0 + and r2, ip, #0xff000000 + orr r0, r1, r0 + orr r0, r2, r0 + ldmia sp!, {r3, pc} + arm_func_end SOC_GetHostID + + arm_func_start SOC_SetResolver +SOC_SetResolver: ; 0x020A3260 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, [r1] + ldr r0, [r0] + mov r2, ip, lsr #0x18 + mov r4, r0, lsr #0x18 + mov lr, r0, lsr #8 + mov r1, ip, lsr #8 + mov r5, r0, lsl #8 + mov r3, ip, lsl #8 + mov r0, r0, lsl #0x18 + mov ip, ip, lsl #0x18 + and r4, r4, #0xff + and lr, lr, #0xff00 + and r2, r2, #0xff + and r1, r1, #0xff00 + and r5, r5, #0xff0000 + orr r4, r4, lr + and r3, r3, #0xff0000 + orr r1, r2, r1 + and lr, r0, #0xff000000 + orr r0, r5, r4 + and r2, ip, #0xff000000 + orr r1, r3, r1 + orr r0, lr, r0 + orr r1, r2, r1 + bl SOCL_SetResolver + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOC_SetResolver + + arm_func_start SOC_Listen +SOC_Listen: ; 0x020A32CC + ldr ip, _020A32D4 ; =SOCL_Listen + bx ip + .align 2, 0 +_020A32D4: .word SOCL_Listen + arm_func_end SOC_Listen + + arm_func_start SOC_Accept +SOC_Accept: ; 0x020A32D8 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r1 + add r1, sp, #0 + add r2, sp, #4 + bl SOCL_Accept + cmp r0, #0 + addlt sp, sp, #8 + ldmltia sp!, {r4, pc} + ldrh r1, [sp] + mov r2, r1, asr #8 + mov r1, r1, lsl #8 + and r2, r2, #0xff + and r1, r1, #0xff00 + orr r1, r2, r1 + strh r1, [r4, #2] + ldr ip, [sp, #4] + mov r2, ip, lsr #0x18 + mov r1, ip, lsr #8 + mov r3, ip, lsl #8 + mov ip, ip, lsl #0x18 + and r2, r2, #0xff + and r1, r1, #0xff00 + and r3, r3, #0xff0000 + orr r1, r2, r1 + and r2, ip, #0xff000000 + orr r1, r3, r1 + orr r1, r2, r1 + str r1, [r4, #4] + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end SOC_Accept + + arm_func_start SOC_Fcntl +SOC_Fcntl: ; 0x020A3354 + cmp r0, #0 + mvneq r0, #0 + bxeq lr + cmp r1, #3 + beq _020A3374 + cmp r1, #4 + beq _020A3388 + b _020A339C +_020A3374: + ldrsb r0, [r0, #0x72] + cmp r0, #1 + moveq r0, #0 + movne r0, #4 + bx lr +_020A3388: + tst r2, #4 + movne r1, #0 + strneb r1, [r0, #0x72] + moveq r1, #1 + streqb r1, [r0, #0x72] +_020A339C: + mov r0, #0 + bx lr + arm_func_end SOC_Fcntl + + arm_func_start AllocFunc_SOCL +AllocFunc_SOCL: ; 0x020A33A4 + stmdb sp!, {r4, lr} + ldr r1, _020A33CC ; =_021D4494 + add r4, r0, #4 + ldr r2, [r1, #0xc] + mov r1, r4 + mov r0, #0 + blx r2 + cmp r0, #0 + strne r4, [r0], #4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A33CC: .word _021D4494 + arm_func_end AllocFunc_SOCL + + arm_func_start FreeFunc_SOCL +FreeFunc_SOCL: ; 0x020A33D0 + stmdb sp!, {r3, lr} + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r1, _020A33F8 ; =_021D4494 + ldr r2, [r0, #-4] + ldr r3, [r1, #4] + sub r1, r0, #4 + mov r0, #0 + blx r3 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A33F8: .word _021D4494 + arm_func_end FreeFunc_SOCL + + arm_func_start SOC_Startup +SOC_Startup: ; 0x020A33FC + stmdb sp!, {r4, r5, r6, lr} + ldr r1, [r0, #0xc] + ldr ip, _020A3560 ; =AllocFunc_SOCL + cmp r1, #1 + moveq r2, #1 + ldr r1, _020A3564 ; =_021D4494 + movne r2, #0 + str r2, [r1, #0x40] + ldr r6, [r0, #0x10] + ldr r3, _020A3568 ; =FreeFunc_SOCL + mov r4, r6, lsr #0x18 + mov r2, r6, lsr #8 + mov r5, r6, lsl #8 + and r4, r4, #0xff + and r2, r2, #0xff00 + mov r6, r6, lsl #0x18 + orr r2, r4, r2 + and r5, r5, #0xff0000 + and r4, r6, #0xff000000 + orr r2, r5, r2 + orr r2, r4, r2 + str r2, [r1, #0x44] + ldr lr, [r0, #0x14] + mov r2, #0x40 + mov r5, lr, lsr #0x18 + mov r4, lr, lsr #8 + mov r6, lr, lsl #8 + and r5, r5, #0xff + and r4, r4, #0xff00 + mov lr, lr, lsl #0x18 + orr r4, r5, r4 + and r6, r6, #0xff0000 + and r5, lr, #0xff000000 + orr r4, r6, r4 + orr r4, r5, r4 + str r4, [r1, #0x48] + ldr lr, [r0, #0x18] + mov r5, lr, lsr #0x18 + mov r4, lr, lsr #8 + mov r6, lr, lsl #8 + and r5, r5, #0xff + and r4, r4, #0xff00 + mov lr, lr, lsl #0x18 + orr r4, r5, r4 + and r6, r6, #0xff0000 + and r5, lr, #0xff000000 + orr r4, r6, r4 + orr r4, r5, r4 + str r4, [r1, #0x4c] + ldr lr, [r0, #0x1c] + mov r5, lr, lsr #0x18 + mov r4, lr, lsr #8 + mov r6, lr, lsl #8 + and r5, r5, #0xff + and r4, r4, #0xff00 + mov lr, lr, lsl #0x18 + orr r4, r5, r4 + and r6, r6, #0xff0000 + and r5, lr, #0xff000000 + orr r4, r6, r4 + orr r4, r5, r4 + str r4, [r1, #0x50] + ldr r6, [r0, #0x20] + mov r4, r6, lsr #0x18 + mov lr, r6, lsr #8 + mov r5, r6, lsl #8 + mov r6, r6, lsl #0x18 + and r4, r4, #0xff + and lr, lr, #0xff00 + and r5, r5, #0xff0000 + orr r4, r4, lr + and r6, r6, #0xff000000 + orr r4, r5, r4 + orr r4, r6, r4 + str r4, [r1, #0x54] + str ip, [r1, #0x58] + str r3, [r1, #0x5c] + ldr r3, [r0, #4] + str r3, [r1, #0xc] + ldr r3, [r0, #8] + str r3, [r1, #4] + str r2, [r1, #0x60] + ldr r2, [r0, #0x2c] + str r2, [r1, #0x70] + ldr r2, [r0, #0x30] + ldr r0, _020A356C ; =_021D44D4 + str r2, [r1, #0x74] + bl SOCL_Startup + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A3560: .word AllocFunc_SOCL +_020A3564: .word _021D4494 +_020A3568: .word FreeFunc_SOCL +_020A356C: .word _021D44D4 + arm_func_end SOC_Startup + + arm_func_start SOC_Cleanup +SOC_Cleanup: ; 0x020A3570 + ldr ip, _020A3578 ; =SOCL_Cleanup + bx ip + .align 2, 0 +_020A3578: .word SOCL_Cleanup + arm_func_end SOC_Cleanup + + arm_func_start SOC_InetNtoA +SOC_InetNtoA: ; 0x020A357C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + ldr r2, _020A35A8 ; =_021D450C + add r1, sp, #8 + mov r0, #2 + mov r3, #0x10 + bl SOC_InetNtoP + ldr r0, _020A35A8 ; =_021D450C + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_020A35A8: .word _021D450C + arm_func_end SOC_InetNtoA + + arm_func_start SOC_InetAtoN +SOC_InetAtoN: ; 0x020A35AC + stmdb sp!, {r4, lr} + mov r4, r1 + bl SOCL_InetAtoH + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, r0, lsr #0x18 + mov r1, r0, lsr #8 + mov r3, r0, lsl #8 + mov ip, r0, lsl #0x18 + and r2, r2, #0xff + and r0, r1, #0xff00 + and r1, r3, #0xff0000 + orr r0, r2, r0 + and r2, ip, #0xff000000 + orr r0, r1, r0 + orr r0, r2, r0 + str r0, [r4] + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end SOC_InetAtoN + + arm_func_start SOC_InetNtoP +SOC_InetNtoP: ; 0x020A35FC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x14 + cmp r0, #2 + mov r4, r2 + addne sp, sp, #0x14 + movne r0, #0 + ldmneia sp!, {r3, r4, pc} + cmp r3, #0x10 + addlo sp, sp, #0x14 + movlo r0, #0 + ldmloia sp!, {r3, r4, pc} + mov r0, r1 + add r1, sp, #0x10 + mov r2, #4 + bl MI_CpuCopy8 + ldr r0, [sp, #0x10] + add r1, sp, #0xc + bl SOC_U32to4U8 + ldrb r1, [sp, #0xe] + ldr r2, _020A367C ; =_02110678 + mov r0, r4 + str r1, [sp] + ldrb r3, [sp, #0xd] + mov r1, #0x10 + str r3, [sp, #4] + ldrb r3, [sp, #0xc] + str r3, [sp, #8] + ldrb r3, [sp, #0xf] + bl OS_SNPrintf + mov r0, r4 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020A367C: .word _02110678 + arm_func_end SOC_InetNtoP + + arm_func_start SOC_U32to4U8 +SOC_U32to4U8: ; 0x020A3680 + mov r2, r0, lsr #0x18 + strb r2, [r1] + mov r2, r0, lsr #0x10 + strb r2, [r1, #1] + mov r2, r0, lsr #8 + strb r2, [r1, #2] + strb r0, [r1, #3] + bx lr + arm_func_end SOC_U32to4U8 + + arm_func_start SOC_Poll +SOC_Poll: ; 0x020A36A0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r2 + mov r8, r3 + mvn r2, #0 + cmp r8, r2 + cmpeq sb, r2 + movne fp, #1 + str r0, [sp] + mov sl, r1 + moveq fp, #0 +_020A36C8: + mov r6, #0 + ldr r4, [sp] + mov r5, r6 + cmp sl, #0 + bls _020A3708 +_020A36DC: + ldrsh r1, [r4, #4] + ldr r0, [r4] + orr r7, r1, #0xe0 + bl SOCL_GetStatus + ands r0, r7, r0 + strh r0, [r4, #6] + add r5, r5, #1 + addne r6, r6, #1 + add r4, r4, #8 + cmp r5, sl + blo _020A36DC +_020A3708: + cmp r6, #0 + bgt _020A3748 + cmp fp, #0 + beq _020A372C + mov r0, #0 + subs r0, r0, sb + mov r0, #0 + sbcs r0, r0, r8 + bge _020A3748 +_020A372C: + mov r0, #1 + bl OS_Sleep + ldr r0, _020A3750 ; =0x0000020B + subs sb, sb, r0 + mov r0, #0 + sbc r8, r8, r0 + b _020A36C8 +_020A3748: + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A3750: .word 0x0000020B + arm_func_end SOC_Poll + + arm_func_start SOCL_EnableSsl +SOCL_EnableSsl: ; 0x020A3754 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl SOCL_SocketIsInvalid + cmp r0, #0 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, pc} + ldrsb r0, [r5, #0x73] + mov r1, #1 + cmp r0, #0 + cmpne r0, #4 + movne r1, #0 + cmp r1, #0 + mvneq r0, #0x1b + ldmeqia sp!, {r3, r4, r5, pc} + cmp r5, #0 + mov r1, #0 + beq _020A37A8 + ldrsh r0, [r5, #0x70] + tst r0, #1 + movne r1, #1 +_020A37A8: + cmp r1, #0 + mvneq r0, #0x26 + ldmeqia sp!, {r3, r4, r5, pc} + ldrsh r0, [r5, #0x70] + tst r0, #2 + mvnne r0, #0x1b + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl SOCLi_ExecEnableSslCommand + ldmia sp!, {r3, r4, r5, pc} + arm_func_end SOCL_EnableSsl + + arm_func_start SOCLi_ExecEnableSslCommand +SOCLi_ExecEnableSslCommand: ; 0x020A37D4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr r0, _020A380C ; =SOCLi_EnableSslCallBack + mov r1, r5 + mov r2, #1 + bl SOCLi_CreateCommandPacket + movs r1, r0 + mvneq r0, #0x20 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + str r4, [r1, #0x10] + bl SOCLi_ExecCommandPacketInRecvPipe + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A380C: .word SOCLi_EnableSslCallBack + arm_func_end SOCLi_ExecEnableSslCommand + + arm_func_start SOCLi_EnableSslCallBack +SOCLi_EnableSslCallBack: ; 0x020A3810 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r4, [r7, #4] + ldr r5, [r4, #0x64] + add r0, r5, #0xe0 + ldr r6, [r5, #0xc4] + bl OS_LockMutex + ldr r1, [r7, #0x10] + cmp r1, #0 + beq _020A3850 + mov r0, #1 + str r1, [r6, #0xc] + bl CPS_SetSsl + mov r0, #4 + strb r0, [r4, #0x73] + b _020A3864 +_020A3850: + mov r0, #0 + strb r0, [r4, #0x73] + bl CPS_SetSsl + mov r0, #0 + str r0, [r6, #0xc] +_020A3864: + add r0, r5, #0xe0 + bl OS_UnlockMutex + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end SOCLi_EnableSslCallBack + + ; NitroWiFi: libcps.a + + arm_func_start reset_network_vars +reset_network_vars: ; 0x020A3874 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _020A3968 ; =_021D4620 + ldr r2, _020A3968 ; =_021D4620 + ldr r1, [r1, #0x50] + str r0, [r2, #0xc] + cmp r1, #0 + mov r1, #0 + str r1, [r2, #0x50] + str r1, [r2, #0x1c] + str r1, [r2, #0x2c] + str r1, [r2, #0x60] + movne r3, #1 + str r1, [r2, #0x64] + moveq r3, #0 + str r1, [r2, #0x20] + cmp r3, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, _020A396C ; =_021D46A0 + mov r2, #0x60 + bl MI_CpuFill8 + ldr r0, _020A3970 ; =OSi_ThreadInfo + ldr r6, [r0, #8] + cmp r6, #0 + beq _020A3924 + mov r5, #0 + mov r4, r5 +_020A38DC: + ldr r1, [r6, #0xa4] + cmp r1, #0 + ldrne r0, [r1] + cmpne r0, #0 + beq _020A3918 + ldrb r0, [r1, #8] + cmp r0, #0xa + cmpne r0, #0xb + strneb r5, [r1, #8] + ldr r0, [r1, #4] + cmp r0, #0 + beq _020A3918 + str r4, [r1, #4] + ldr r0, [r1] + bl OS_WakeupThreadDirect +_020A3918: + ldr r6, [r6, #0x68] + cmp r6, #0 + bne _020A38DC +_020A3924: + mov r6, #0 + ldr r7, _020A3974 ; =_021D4948 + ldr r4, _020A3968 ; =_021D4620 + mov r5, r6 +_020A3934: + ldrh r0, [r7, #4] + cmp r0, #0 + beq _020A3950 + ldr r0, [r7, #0x34] + ldr r1, [r4, #0x40] + blx r1 + strh r5, [r7, #4] +_020A3950: + add r6, r6, #1 + cmp r6, #8 + add r7, r7, #0x38 + blt _020A3934 + bl CPSi_SslCleanup + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A3968: .word _021D4620 +_020A396C: .word _021D46A0 +_020A3970: .word OSi_ThreadInfo +_020A3974: .word _021D4948 + arm_func_end reset_network_vars + + arm_func_start OS_YieldThread__ +OS_YieldThread__: ; 0x020A3978 + stmdb sp!, {r3, lr} + ldr r0, _020A399C ; =_021D4620 + ldr r0, [r0, #0x24] + cmp r0, #0 + bne _020A3994 + bl OS_YieldThread + ldmia sp!, {r3, pc} +_020A3994: + bl OS_Sleep + ldmia sp!, {r3, pc} + .align 2, 0 +_020A399C: .word _021D4620 + arm_func_end OS_YieldThread__ + + arm_func_start empty_func +empty_func: ; 0x020A39A0 + bx lr + arm_func_end empty_func + + arm_func_start default_link_is_on +default_link_is_on: ; 0x020A39A4 + mov r0, #1 + bx lr + arm_func_end default_link_is_on + + arm_func_start CPS_Startup +CPS_Startup: ; 0x020A39AC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r4, r0 + ldr r0, _020A3BA4 ; =_version_UBIQUITOUS_CPS + bl OSi_ReferSymbol + ldr r3, [r4, #0x18] + ldr r5, [r4, #0x14] + cmp r3, #0 + cmpeq r5, #0 + mov r1, #0 + beq _020A3A04 + ldr r0, _020A3BA8 ; =_021D4620 + ldr r2, _020A3BAC ; =0x6C078965 + str r5, [r0, #0x68] + str r3, [r0, #0x6c] + ldr r3, _020A3BB0 ; =0x5D588B65 + str r2, [r0, #0x70] + ldr r2, _020A3BB4 ; =0x00269EC3 + str r3, [r0, #0x74] + str r2, [r0, #0x78] + str r1, [r0, #0x7c] + b _020A3A34 +_020A3A04: + bl OS_GetTick + ldr r2, _020A3BA8 ; =_021D4620 + ldr r3, _020A3BAC ; =0x6C078965 + str r0, [r2, #0x68] + str r1, [r2, #0x6c] + ldr r1, _020A3BB0 ; =0x5D588B65 + str r3, [r2, #0x70] + ldr r0, _020A3BB4 ; =0x00269EC3 + str r1, [r2, #0x74] + str r0, [r2, #0x78] + mov r0, #0 + str r0, [r2, #0x7c] +_020A3A34: + ldr r1, [r4, #4] + cmp r1, #0 + ldrne r0, [r4, #8] + cmpne r0, #0 + beq _020A3A58 + ldr r0, _020A3BA8 ; =_021D4620 + str r1, [r0, #0x14] + ldr r1, [r4, #8] + b _020A3A64 +_020A3A58: + ldr r1, _020A3BB8 ; =empty_func + ldr r0, _020A3BA8 ; =_021D4620 + str r1, [r0, #0x14] +_020A3A64: + str r1, [r0, #0x40] + ldr r1, [r4] + ldr r0, _020A3BA8 ; =_021D4620 + ldr r2, _020A3BA8 ; =_021D4620 + str r1, [r0, #0x10] + ldr r1, [r4, #0x24] + cmp r1, #0 + ldreq r1, _020A3BBC ; =0x000005B4 + strh r1, [r0, #2] + ldr r1, [r4, #0x28] + ldr r0, _020A3BA8 ; =_021D4620 + str r1, [r0, #0x34] + ldr r1, [r4, #0x2c] + str r1, [r0, #0x24] + ldr r1, [r4, #0xc] + cmp r1, #0 + ldreq r1, _020A3BB8 ; =empty_func + str r1, [r0, #0x18] + ldr r1, [r4, #0x10] + cmp r1, #0 + ldrne r0, _020A3BA8 ; =_021D4620 + ldreq r1, _020A3BC0 ; =default_link_is_on + ldreq r0, _020A3BA8 ; =_021D4620 + str r1, [r0, #0x48] + ldr r1, [r4, #0x1c] + mov r0, #0 + str r1, [r2, #0x58] + ldr r3, [r4, #0x20] + ldr r1, _020A3BC4 ; =0x00000F88 + str r3, [r2, #0x5c] + str r0, [r2, #0x30] + str r0, [r2, #0x28] + ldr ip, [r2, #0x70] + ldr r4, [r2, #0x68] + ldr r3, [r2, #0x6c] + umull r5, lr, ip, r4 + mla lr, ip, r3, lr + ldr r3, [r2, #0x74] + ldr ip, [r2, #0x78] + mla lr, r3, r4, lr + ldr r3, [r2, #0x7c] + adds ip, ip, r5 + adc r5, r3, lr + umull r3, r4, r5, r1 + mla r4, r5, r0, r4 + mla r4, r0, r1, r4 + str ip, [r2, #0x68] + ldr r0, _020A3BC8 ; =_021D4B08 + str r5, [r2, #0x6c] + add r1, r4, #0x400 + strh r1, [r2, #8] + bl OS_GetMacAddress + ldr r0, _020A3BA8 ; =_021D4620 + mov r2, #0 + strb r2, [r0, #1] + mov r1, #0x800 + str r1, [sp] + ldr r0, _020A3BCC ; =_02110684 + ldr r1, _020A3BD0 ; =tcpip + ldr r4, [r0] + ldr r0, _020A3BD4 ; =_021D4888 + ldr r3, _020A3BD8 ; =_021D5E60 + str r4, [sp, #4] + bl OS_CreateThread + mov r1, #0x800 + ldr r0, _020A3BCC ; =_02110684 + str r1, [sp] + ldr r1, [r0] + ldr r0, _020A3BDC ; =_021D47C8 + str r1, [sp, #4] + ldr r1, _020A3BE0 ; =scavenger + ldr r3, _020A3BE4 ; =_021D5660 + mov r2, #0 + bl OS_CreateThread + ldr r0, _020A3BD4 ; =_021D4888 + bl OS_WakeupThreadDirect + ldr r0, _020A3BDC ; =_021D47C8 + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A3BA4: .word _version_UBIQUITOUS_CPS +_020A3BA8: .word _021D4620 +_020A3BAC: .word 0x6C078965 +_020A3BB0: .word 0x5D588B65 +_020A3BB4: .word 0x00269EC3 +_020A3BB8: .word empty_func +_020A3BBC: .word 0x000005B4 +_020A3BC0: .word default_link_is_on +_020A3BC4: .word 0x00000F88 +_020A3BC8: .word _021D4B08 +_020A3BCC: .word _02110684 +_020A3BD0: .word tcpip +_020A3BD4: .word _021D4888 +_020A3BD8: .word _021D5E60 +_020A3BDC: .word _021D47C8 +_020A3BE0: .word scavenger +_020A3BE4: .word _021D5660 + arm_func_end CPS_Startup + + arm_func_start CPS_CalmDown +CPS_CalmDown: ; 0x020A3BE8 + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _020A3C30 ; =_021D47C8 + bl OS_IsThreadTerminated + movs r5, r0 + ldreq r1, _020A3C34 ; =_021D4620 + ldreq r0, [r1, #0x44] + cmpeq r0, #0 + bne _020A3C20 + ldr r0, _020A3C30 ; =_021D47C8 + mov r2, #1 + str r2, [r1, #0x44] + bl OS_WakeupThreadDirect +_020A3C20: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A3C30: .word _021D47C8 +_020A3C34: .word _021D4620 + arm_func_end CPS_CalmDown + + arm_func_start CPS_SetScavengerCallback +CPS_SetScavengerCallback: ; 0x020A3C38 + ldr r1, _020A3C44 ; =_021D4620 + str r0, [r1, #0x3c] + bx lr + .align 2, 0 +_020A3C44: .word _021D4620 + arm_func_end CPS_SetScavengerCallback + + arm_func_start CPS_Cleanup +CPS_Cleanup: ; 0x020A3C48 + stmdb sp!, {r3, lr} + bl CPS_CalmDown + ldr r0, _020A3C84 ; =_021D47C8 + bl OS_JoinThread + ldr r0, _020A3C88 ; =_021D4888 + bl OS_DestroyThread + ldr r1, _020A3C8C ; =_021D4620 + mov r0, #0 + str r0, [r1, #0x54] + bl reset_network_vars + ldr r0, _020A3C8C ; =_021D4620 + mov r1, #0 + str r1, [r0, #0x58] + str r1, [r0, #0x5c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020A3C84: .word _021D47C8 +_020A3C88: .word _021D4888 +_020A3C8C: .word _021D4620 + arm_func_end CPS_Cleanup + + arm_func_start CPS_SetThreadPriority +CPS_SetThreadPriority: ; 0x020A3C90 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, _020A3CBC ; =_02110684 + ldr r0, _020A3CC0 ; =_021D4888 + mov r1, r4 + str r4, [r2] + bl OS_SetThreadPriority + ldr r0, _020A3CC4 ; =_021D47C8 + mov r1, r4 + bl OS_SetThreadPriority + ldmia sp!, {r4, pc} + .align 2, 0 +_020A3CBC: .word _02110684 +_020A3CC0: .word _021D4888 +_020A3CC4: .word _021D47C8 + arm_func_end CPS_SetThreadPriority + + arm_func_start calc_checksum_do +calc_checksum_do: ; 0x020A3CC8 + tst r0, #1 + beq _020A3D00 + cmp r1, #1 + bls _020A3D50 +_020A3CD8: + ldrb ip, [r0] + ldrb r3, [r0, #1] + sub r1, r1, #2 + cmp r1, #1 + orr r3, r3, ip, lsl #8 + mov r3, r3, lsl #0x10 + add r2, r2, r3, lsr #16 + add r0, r0, #2 + bhi _020A3CD8 + b _020A3D50 +_020A3D00: + mov r2, r2, lsl #0x10 + mov r3, r2, lsr #0x10 + mov r2, r3, lsl #8 + orr r2, r2, r3, asr #8 + mov r2, r2, lsl #0x10 + cmp r1, #1 + mov r2, r2, lsr #0x10 + bls _020A3D34 +_020A3D20: + ldrh r3, [r0], #2 + sub r1, r1, #2 + cmp r1, #1 + add r2, r2, r3 + bhi _020A3D20 +_020A3D34: + ldr r3, _020A3D78 ; =0x00FF00FF + mov ip, r3, lsl #8 + and r3, r3, r2, lsr #8 + and r2, ip, r2, lsl #8 + orr r3, r3, r2 + mov r2, r3, lsl #0x10 + orr r2, r2, r3, lsr #16 +_020A3D50: + cmp r1, #0 + ldrneb r0, [r0] + addne r2, r2, r0, lsl #8 + mov r0, r2, lsl #0x10 + mov r1, r2, lsr #0x10 + add r0, r1, r0, lsr #16 + add r0, r0, r0, lsr #16 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx lr + .align 2, 0 +_020A3D78: .word 0x00FF00FF + arm_func_end calc_checksum_do + + arm_func_start invert_checksum +invert_checksum: ; 0x020A3D7C + ldr r1, _020A3D94 ; =0x0000FFFF + eor r0, r0, r1 + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x10 + moveq r0, r1 + bx lr + .align 2, 0 +_020A3D94: .word 0x0000FFFF + arm_func_end invert_checksum + + arm_func_start calc_checksum +calc_checksum: ; 0x020A3D98 + stmdb sp!, {r3, lr} + mov r2, #0 + bl calc_checksum_do + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl invert_checksum + ldmia sp!, {r3, pc} + arm_func_end calc_checksum + + arm_func_start check_tcpudpsum +check_tcpudpsum: ; 0x020A3DB4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r2 + mov r2, r3 + mov r5, r1 + bl calc_checksum_do + mov r2, r0 + add r0, r4, #0xc + mov r1, #8 + bl calc_checksum_do + add r1, r0, r5 + tst r1, #0x10000 + addne r0, r1, #1 + movne r0, r0, lsl #0x10 + movne r1, r0, lsr #0x10 + ldr r0, _020A3E00 ; =0x0000FFFF + cmp r1, r0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A3E00: .word 0x0000FFFF + arm_func_end check_tcpudpsum + + arm_func_start ip_islocal +ip_islocal: ; 0x020A3E04 + mov ip, #1 + sub r1, ip, #2 + cmp r0, r1 + subne r1, ip, #0x81000000 + cmpne r0, r1 + beq _020A3E38 + ldr r1, _020A3E40 ; =_021D4620 + ldr r3, [r1, #0x1c] + ldr r1, [r1, #0x50] + and r2, r0, r3 + and r0, r1, r3 + cmp r2, r0 + movne ip, #0 +_020A3E38: + mov r0, ip + bx lr + .align 2, 0 +_020A3E40: .word _021D4620 + arm_func_end ip_islocal + + arm_func_start get_targetip +get_targetip: ; 0x020A3E44 + stmdb sp!, {r4, lr} + mov r4, r0 + bl ip_islocal + cmp r0, #0 + ldreq r0, _020A3E64 ; =_021D4620 + ldreq r4, [r0, #0x2c] + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A3E64: .word _021D4620 + arm_func_end get_targetip + + arm_func_start is_broadcast +is_broadcast: ; 0x020A3E68 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, #0 + bl ip_islocal + cmp r0, #0 + beq _020A3E98 + ldr r0, _020A3EA0 ; =_021D4620 + ldr r0, [r0, #0x1c] + mvn r1, r0 + and r0, r1, r5 + cmp r1, r0 + moveq r4, #1 +_020A3E98: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A3EA0: .word _021D4620 + arm_func_end is_broadcast + + arm_func_start is_multicast +is_multicast: ; 0x020A3EA4 + and r0, r0, #0xf0000000 + cmp r0, #0xe0000000 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end is_multicast + + arm_func_start ip_isme +ip_isme: ; 0x020A3EB8 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _020A3F30 ; =_021D4620 + mov r4, #1 + ldr r1, [r1, #0x50] + mov r6, r0 + cmp r1, #0 + mov r0, r4 + cmpne r6, r1 + movne r0, #0 + mov r5, r4 + mov r2, r4 + cmp r0, #0 + bne _020A3EF8 + ldr r0, _020A3F34 ; =0x7F000001 + cmp r6, r0 + movne r2, #0 +_020A3EF8: + cmp r2, #0 + bne _020A3F10 + mov r0, r6 + bl is_broadcast + cmp r0, #0 + moveq r5, #0 +_020A3F10: + cmp r5, #0 + bne _020A3F28 + mov r0, r6 + bl is_multicast + cmp r0, #0 + moveq r4, #0 +_020A3F28: + mov r0, r4 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A3F30: .word _021D4620 +_020A3F34: .word 0x7F000001 + arm_func_end ip_isme + + arm_func_start maccmp +maccmp: ; 0x020A3F38 + mov ip, #0 +_020A3F3C: + ldrh r3, [r0], #2 + ldrh r2, [r1], #2 + cmp r3, r2 + movne r0, #1 + bxne lr + add ip, ip, #1 + cmp ip, #3 + blt _020A3F3C + mov r0, #0 + bx lr + arm_func_end maccmp + + arm_func_start send_packet +send_packet: ; 0x020A3F64 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + ldr r0, _020A3FB8 ; =_02110690 + add r1, r7, #6 + mov r2, #6 + mov r4, r3 + bl MI_CpuCopy8 + mov r0, r7 + mov r3, r5 + add r1, r7, #6 + sub r2, r6, #6 + str r4, [sp] + bl WCM_SendDCFDataEx + cmp r0, #0 + movlt r1, #1 + ldr r0, _020A3FBC ; =_021D4620 + movge r1, #0 + strb r1, [r0] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A3FB8: .word _02110690 +_020A3FBC: .word _021D4620 + arm_func_end send_packet + + arm_func_start put_in_buffer +put_in_buffer: ; 0x020A3FC0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _020A41A8 ; =_021D4620 + mov r7, r0 + ldr ip, [r4, #0x58] + mov r6, r2 + cmp ip, #0 + ldrne r0, [r4, #0x5c] + mov r5, r3 + cmpne r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldr r0, [sp, #0x1c] + add r0, r5, r0 + cmp r0, #8 + ldmloia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _020A41AC ; =0x000005E4 + cmp r0, r2 + ldmhiia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _020A41B0 ; =_02110690 + ldrb r4, [r6] + ldrb r3, [r2] + cmp r4, r3 + ldreqb r4, [r6, #1] + ldreqb r3, [r2, #1] + cmpeq r4, r3 + ldreqb r3, [r6, #2] + ldreqb r2, [r2, #2] + cmpeq r3, r2 + ldreqb r2, [r6, #6] + cmpeq r2, #8 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r2, [r6, #7] + cmp r2, #0 + cmpne r2, #6 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldr r2, _020A41A8 ; =_021D4620 + add r0, r0, #9 + bic r0, r0, #1 + ldr r8, [r2, #0x28] + mov r0, r0, lsl #0x10 + ldr lr, [r2, #0x28] + ldr r4, [r2, #0x30] + mov r3, r0, lsr #0x10 + cmp lr, r4 + add r4, r8, r0, lsr #16 + bhs _020A4080 + ldr r0, [r2, #0x30] + cmp r0, r4 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} +_020A4080: + ldr r0, _020A41A8 ; =_021D4620 + ldr r2, [r0, #0x5c] + cmp r4, r2 + bne _020A40A4 + ldr r0, [r0, #0x30] + mov r4, #0 + cmp r0, #0 + bne _020A40C0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A40A4: + ldr r2, [r0, #0x5c] + cmp r4, r2 + bls _020A40C0 + ldr r0, [r0, #0x30] + mov r4, r3 + cmp r0, r3 + ldmlsia sp!, {r4, r5, r6, r7, r8, pc} +_020A40C0: + ldr r0, _020A41A8 ; =_021D4620 + ldr lr, [r0, #0x28] + ldr r2, [r0, #0x5c] + add lr, lr, r3 + cmp lr, r2 + bls _020A4100 + ldr lr, [r0, #0x5c] + ldr r2, [r0, #0x28] + sub r2, lr, r2 + cmp r2, #2 + ldrhs r0, [r0, #0x28] + movhs r2, #0 + strhsh r2, [ip, r0] + ldr r0, _020A41A8 ; =_021D4620 + mov r2, #0 + str r2, [r0, #0x28] +_020A4100: + ldr ip, _020A41A8 ; =_021D4620 + mov r0, r1 + ldr lr, [ip, #0x58] + ldr r1, [ip, #0x28] + mov r2, #6 + strh r3, [lr, r1] + ldr r3, [ip, #0x58] + ldr r1, [ip, #0x28] + add r1, r3, r1 + add r1, r1, #2 + bl MI_CpuCopy8 + ldr r1, _020A41A8 ; =_021D4620 + mov r0, r7 + ldr r3, [r1, #0x58] + ldr r1, [r1, #0x28] + mov r2, #6 + add r1, r3, r1 + add r1, r1, #8 + bl MI_CpuCopy8 + ldr r1, _020A41A8 ; =_021D4620 + add r0, r6, #6 + ldr r3, [r1, #0x58] + ldr r1, [r1, #0x28] + sub r2, r5, #6 + add r1, r3, r1 + add r1, r1, #0xe + bl MI_CpuCopy8 + ldr r0, [sp, #0x18] + cmp r0, #0 + ldrne r2, [sp, #0x1c] + cmpne r2, #0 + beq _020A419C + ldr r1, _020A41A8 ; =_021D4620 + ldr r3, [r1, #0x58] + ldr r1, [r1, #0x28] + add r1, r3, r1 + add r1, r1, #8 + add r1, r1, r5 + bl MI_CpuCopy8 +_020A419C: + ldr r0, _020A41A8 ; =_021D4620 + str r4, [r0, #0x28] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A41A8: .word _021D4620 +_020A41AC: .word 0x000005E4 +_020A41B0: .word _02110690 + arm_func_end put_in_buffer + + arm_func_start CPSi_RecvCallbackFunc +CPSi_RecvCallbackFunc: ; 0x020A41B4 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + mov ip, #0 + str ip, [sp] + str ip, [sp, #4] + bl put_in_buffer + ldr r0, _020A4208 ; =_021D4620 + ldr r1, [r0, #0x54] + cmp r1, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, pc} + ldr r0, [r0, #0x54] + bl OS_IsThreadTerminated + cmp r0, #0 + addne sp, sp, #8 + ldmneia sp!, {r3, pc} + ldr r0, _020A4208 ; =_021D4620 + ldr r0, [r0, #0x54] + bl OS_WakeupThreadDirect + add sp, sp, #8 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A4208: .word _021D4620 + arm_func_end CPSi_RecvCallbackFunc + + arm_func_start receive_packet +receive_packet: ; 0x020A420C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r0 + bl OS_DisableInterrupts + ldr sb, _020A42C4 ; =_021D4620 + mov r6, r0 + ldr r1, [sb, #0x30] + ldr r0, [sb, #0x28] + cmp r1, r0 + bne _020A4260 + mov r5, #0 + ldr r8, _020A42C8 ; =OSi_ThreadInfo + mov r4, r5 +_020A423C: + ldr r1, [r8, #4] + mov r0, r5 + str r1, [sb, #0x54] + bl OS_SleepThread + str r4, [sb, #0x54] + ldr r1, [sb, #0x30] + ldr r0, [sb, #0x28] + cmp r1, r0 + beq _020A423C +_020A4260: + mov r0, r6 + bl OS_RestoreInterrupts + ldr r0, _020A42C4 ; =_021D4620 + mov r3, #0 + ldr r5, [r0, #0x58] + mov r1, r3 +_020A4278: + ldr r4, [r0, #0x5c] + ldr r2, [r0, #0x30] + sub r2, r4, r2 + cmp r2, #2 + strlo r3, [r0, #0x30] + ldr r2, [r0, #0x30] + ldrh r2, [r5, r2] + cmp r2, #0 + streq r1, [r0, #0x30] + cmp r2, #0 + beq _020A4278 + sub r1, r2, #2 + ldr r0, _020A42C4 ; =_021D4620 + str r1, [r7] + ldr r1, [r0, #0x58] + ldr r0, [r0, #0x30] + add r0, r1, r0 + add r0, r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A42C4: .word _021D4620 +_020A42C8: .word OSi_ThreadInfo + arm_func_end receive_packet + + arm_func_start throw_packet +throw_packet: ; 0x020A42CC + stmdb sp!, {r3, lr} + bl OS_DisableInterrupts + ldr r1, _020A430C ; =_021D4620 + ldr ip, [r1, #0x30] + ldr r3, [r1, #0x58] + ldr r2, [r1, #0x30] + ldrh r2, [r3, r2] + add r2, ip, r2 + str r2, [r1, #0x30] + ldr r3, [r1, #0x30] + ldr r2, [r1, #0x5c] + cmp r3, r2 + movhs r2, #0 + strhs r2, [r1, #0x30] + bl OS_RestoreInterrupts + ldmia sp!, {r3, pc} + .align 2, 0 +_020A430C: .word _021D4620 + arm_func_end throw_packet + + arm_func_start inq_arpcache +inq_arpcache: ; 0x020A4310 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _020A43C8 ; =0x7F000001 + mov r4, r0 + cmp r5, r1 + ldrne r0, _020A43CC ; =_021D4620 + mov r7, #0 + ldrne r0, [r0, #0x50] + cmpne r5, r0 + ldreq r7, _020A43D0 ; =_021D4B08 + beq _020A43B8 + mov r0, r5 + bl is_broadcast + cmp r0, #0 + bne _020A4360 + mov r0, r5 + bl is_multicast + cmp r0, #0 + beq _020A4368 +_020A4360: + ldr r7, _020A43D4 ; =_02110688 + b _020A43B8 +_020A4368: + ldr r1, _020A43D8 ; =_021D46A0 + mov r6, r7 +_020A4370: + ldr r0, [r1] + cmp r5, r0 + bne _020A43A8 + bl OS_GetTick + mov r2, #0xc + mul r3, r6, r2 + ldr r2, _020A43D8 ; =_021D46A0 + mov r5, r0, lsr #0x10 + add r0, r2, r3 + ldr r2, _020A43DC ; =_021D46AA + orr r5, r5, r1, lsl #16 + strh r5, [r2, r3] + add r7, r0, #4 + b _020A43B8 +_020A43A8: + add r6, r6, #1 + cmp r6, #8 + add r1, r1, #0xc + blo _020A4370 +_020A43B8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A43C8: .word 0x7F000001 +_020A43CC: .word _021D4620 +_020A43D0: .word _021D4B08 +_020A43D4: .word _02110688 +_020A43D8: .word _021D46A0 +_020A43DC: .word _021D46AA + arm_func_end inq_arpcache + + arm_func_start send_arprequest +send_arprequest: ; 0x020A43E0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x2c + mov r4, r0 + add r0, sp, #0 + mov r1, #0 + mov r2, #0x2a + bl MI_CpuFill8 + add r0, sp, #0 + mov r1, #0xff + mov r2, #6 + bl MI_CpuFill8 + ldr r0, _020A44CC ; =_021D4B08 + add r1, sp, #6 + mov r2, #6 + bl MI_CpuCopy8 + mov r0, #1 + ldr r1, _020A44D0 ; =0x00000608 + strb r0, [sp, #0xf] + strh r1, [sp, #0xc] + strb r0, [sp, #0x15] + mov r0, #8 + ldr r1, _020A44D4 ; =0x00000406 + strb r0, [sp, #0x10] + strh r1, [sp, #0x12] + ldr r0, _020A44CC ; =_021D4B08 + add r1, sp, #0x16 + mov r2, #6 + bl MI_CpuCopy8 + ldr r0, _020A44D8 ; =_021D4620 + mov r1, r4, lsr #0x10 + ldr r3, [r0, #0x50] + mov r0, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r4, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, r3, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + mov r0, r3, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r4, lsl #8 + orr r0, r0, r4, asr #8 + strh r0, [sp, #0x1c] + mov r0, r3, lsl #8 + orr r0, r0, r3, asr #8 + strh r0, [sp, #0x1e] + mov r0, r2, lsl #8 + orr r0, r0, r2, asr #8 + strh r0, [sp, #0x26] + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + mov r2, #0 + strh r0, [sp, #0x28] + add r0, sp, #0 + mov r1, #0x2a + mov r3, r2 + bl send_packet + add sp, sp, #0x2c + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020A44CC: .word _021D4B08 +_020A44D0: .word 0x00000608 +_020A44D4: .word 0x00000406 +_020A44D8: .word _021D4620 + arm_func_end send_arprequest + + arm_func_start arprequest +arprequest: ; 0x020A44DC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, #0 + ldr r4, _020A4548 ; =_021D4620 + mov sb, r0 + mov r5, #0x64 + mov r6, r7 +_020A44F4: + mov r0, sb + bl send_arprequest + mov r8, r6 +_020A4500: + ldr r0, [r4, #0x50] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r5 + bl OS_Sleep + mov r0, sb + bl inq_arpcache + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + add r8, r8, #1 + cmp r8, #0x14 + blo _020A4500 + add r7, r7, #1 + cmp r7, #8 + blo _020A44F4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A4548: .word _021D4620 + arm_func_end arprequest + + arm_func_start reg_arpcache +reg_arpcache: ; 0x020A454C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _020A4678 ; =0x7F000001 + mov r6, r1 + mov r7, r0 + cmp r6, r3 + ldrne r0, _020A467C ; =_021D4620 + mov r5, r2 + ldrne r0, [r0, #0x50] + cmpne r6, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + bl ip_islocal + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + bl is_multicast + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + mov r0, r0, lsl #0x10 + ldr r2, _020A4680 ; =_021D46A0 + mov r4, r0, lsr #0x10 + mov r1, #0 +_020A45B0: + ldr r0, [r2] + cmp r6, r0 + bne _020A45E8 + mov r0, #0xc + mul r5, r1, r0 + ldr r0, _020A4680 ; =_021D46A0 + ldr r3, _020A4684 ; =_021D46AA + add r1, r0, r5 + mov r0, r7 + add r1, r1, #4 + mov r2, #6 + strh r4, [r3, r5] + bl MI_CpuCopy8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A45E8: + add r1, r1, #1 + cmp r1, #8 + add r2, r2, #0xc + blo _020A45B0 + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r2, #0 + ldr r3, _020A4680 ; =_021D46A0 + mov r1, r2 + mov r5, r2 +_020A4610: + ldr r0, [r3] + cmp r0, #0 + moveq r1, r5 + beq _020A4648 + ldrh r0, [r3, #0xa] + add r3, r3, #0xc + sub r0, r4, r0 + mov r0, r0, lsl #0x10 + cmp r2, r0, asr #16 + movlt r1, r5 + add r5, r5, #1 + movlt r2, r0, lsr #0x10 + cmp r5, #8 + blo _020A4610 +_020A4648: + mov r0, #0xc + mul r5, r1, r0 + ldr r3, _020A4680 ; =_021D46A0 + mov r0, r7 + add r1, r3, r5 + add r1, r1, #4 + mov r2, #6 + str r6, [r3, r5] + bl MI_CpuCopy8 + ldr r0, _020A4684 ; =_021D46AA + strh r4, [r0, r5] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A4678: .word 0x7F000001 +_020A467C: .word _021D4620 +_020A4680: .word _021D46A0 +_020A4684: .word _021D46AA + arm_func_end reg_arpcache + + arm_func_start send_ether +send_ether: ; 0x020A4688 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldrh r5, [sp, #0x1c] + ldr r4, [sp, #0x18] + mov r8, r0 + mov r0, r5, lsl #8 + orr ip, r0, r5, asr #8 + mov r0, r4 + mov r7, r1 + mov r6, r2 + mov r5, r3 + strh ip, [r8, #-2] + bl is_multicast + cmp r0, #0 + bne _020A46FC + mov r0, r4 + bl get_targetip + movs r4, r0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + bl inq_arpcache + cmp r0, #0 + bne _020A46E4 + mov r0, r4 + bl arprequest +_020A46E4: + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + sub r1, r8, #0xe + mov r2, #6 + bl MI_CpuCopy8 + b _020A472C +_020A46FC: + mov r0, #1 + strb r0, [r8, #-0xe] + mov r1, #0 + mov r0, r4, lsr #0x10 + strb r1, [r8, #-0xd] + mov r1, #0x5e + strb r1, [r8, #-0xc] + and r0, r0, #0x7f + strb r0, [r8, #-0xb] + mov r0, r4, lsr #8 + strb r0, [r8, #-0xa] + strb r4, [r8, #-9] +_020A472C: + ldr r0, _020A4754 ; =_021D4B08 + sub r1, r8, #8 + mov r2, #6 + bl MI_CpuCopy8 + mov r2, r6 + mov r3, r5 + sub r0, r8, #0xe + add r1, r7, #0xe + bl send_packet + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A4754: .word _021D4B08 + arm_func_end send_ether + + arm_func_start send_ip_frag +send_ip_frag: ; 0x020A4758 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #8 + mov r7, r1 + mov r5, r3 + add r1, r7, #0x14 + add r1, r1, r5 + mov r1, r1, lsl #0x10 + ldr r3, [sp, #0x24] + mov r4, r1, lsr #0x10 + mov r1, r3, lsl #0x10 + mov r3, r4, lsl #8 + orr r3, r3, r4, asr #8 + mov r8, r0 + mov r1, r1, lsr #0x10 + mov r0, r1, lsl #8 + strh r3, [r8, #-0x12] + orr r0, r0, r1, asr #8 + strh r0, [r8, #-0xe] + mov r3, #0 + sub r0, r8, #0x14 + mov r1, #0x14 + mov r6, r2 + strh r3, [r8, #-0xa] + ldr r4, [sp, #0x20] + bl calc_checksum + mov r2, r0, lsl #8 + ldr r1, _020A4870 ; =0x7F000001 + orr r0, r2, r0, asr #8 + strh r0, [r8, #-0xa] + cmp r4, r1 + ldrne r0, _020A4874 ; =_021D4620 + ldrne r0, [r0, #0x50] + cmpne r4, r0 + beq _020A4800 + mov r2, r6 + mov r3, r5 + str r4, [sp] + mov ip, #0x800 + sub r0, r8, #0x14 + add r1, r7, #0x14 + str ip, [sp, #4] + bl send_ether +_020A4800: + ldr r0, _020A4870 ; =0x7F000001 + cmp r4, r0 + ldrne r0, _020A4874 ; =_021D4620 + ldrne r0, [r0, #0x50] + cmpne r4, r0 + beq _020A482C + mov r0, r4 + bl is_multicast + cmp r0, #0 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_020A482C: + ldr r0, _020A4878 ; =_02110690 + sub r1, r8, #0x1c + mov r2, #8 + bl MI_CpuCopy8 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _020A487C ; =_021D4B08 + str r6, [sp] + mov r1, r0 + str r5, [sp, #4] + sub r2, r8, #0x1c + add r3, r7, #0x1c + bl put_in_buffer + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A4870: .word 0x7F000001 +_020A4874: .word _021D4620 +_020A4878: .word _02110690 +_020A487C: .word _021D4B08 + arm_func_end send_ip_frag + + arm_func_start send_ip +send_ip: ; 0x020A4880 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + mov r0, #0x45 + strb r0, [sl, #-0x14] + mov r4, #0 + ldr r7, _020A4A70 ; =_021D4620 + strb r4, [sl, #-0x13] + ldrh r0, [r7, #6] + ldr r6, [sp, #0x30] + ldrb r5, [sp, #0x34] + add r0, r0, #1 + strh r0, [r7, #6] + ldrh fp, [r7, #6] + mov r0, r6, lsr #0x10 + mov r8, #0x80 + mov sb, fp, lsl #8 + orr sb, sb, fp, asr #8 + strh sb, [sl, #-0x10] + strb r8, [sl, #-0xc] + strb r5, [sl, #-0xb] + ldr r8, [r7, #0x50] + mov r5, r0, lsl #0x10 + mov r0, r8, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r8, r0, lsr #0x10 + mov r0, r8, lsl #8 + orr r0, r0, r8, asr #8 + strh r0, [sl, #-8] + ldr r0, [r7, #0x50] + mov r8, r5, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r7, r0, lsr #0x10 + mov r5, r7, lsl #8 + mov r0, r6, lsl #0x10 + orr sb, r5, r7, asr #8 + mov r7, r8, lsl #8 + mov r5, r0, lsr #0x10 + mov r0, r5, lsl #8 + strh sb, [sl, #-6] + orr r7, r7, r8, asr #8 + ldr fp, _020A4A74 ; =0x000005C8 + mov sb, r1 + strh r7, [sl, #-4] + orr r0, r0, r5, asr #8 + mov r8, r2 + mov r7, r3 + strh r0, [sl, #-2] + cmp sb, fp + bls _020A49EC + mov r5, sl + bls _020A4990 +_020A4950: + mov r0, sl + mov r1, #0 + mov r2, r5 + mov r3, fp + str r6, [sp] + orr ip, r4, #0x2000 + str ip, [sp, #4] + bl send_ip_frag + add r1, r4, #0xb9 + add r0, r5, #0x1c8 + sub sb, sb, fp + mov r1, r1, lsl #0x10 + cmp sb, fp + add r5, r0, #0x400 + mov r4, r1, lsr #0x10 + bhi _020A4950 +_020A4990: + cmp sb, #0 + beq _020A49EC + cmp r7, #0 + mov r1, #0 + beq _020A49C4 + mov r2, r5 + mov r0, sl + mov r3, sb + str r6, [sp] + orr r5, r4, #0x2000 + str r5, [sp, #4] + bl send_ip_frag + b _020A49DC +_020A49C4: + str r6, [sp] + mov r0, sl + mov r2, r5 + mov r3, sb + str r4, [sp, #4] + bl send_ip_frag +_020A49DC: + add r0, r4, sb, lsr #3 + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + mov sb, #0 +_020A49EC: + ldr fp, _020A4A74 ; =0x000005C8 + add r0, sb, r7 + cmp r0, fp + bls _020A4A40 +_020A49FC: + sub r5, fp, sb + mov r1, sb + mov r0, sl + mov r2, r8 + mov r3, r5 + str r6, [sp] + orr sb, r4, #0x2000 + str sb, [sp, #4] + bl send_ip_frag + add r0, r4, #0xb9 + sub r7, r7, r5 + mov r0, r0, lsl #0x10 + mov sb, #0 + cmp r7, fp + add r8, r8, r5 + mov r4, r0, lsr #0x10 + bhi _020A49FC +_020A4A40: + adds r0, sb, r7 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + str r6, [sp] + mov r0, sl + mov r1, sb + mov r2, r8 + mov r3, r7 + str r4, [sp, #4] + bl send_ip_frag + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A4A70: .word _021D4620 +_020A4A74: .word 0x000005C8 + arm_func_end send_ip + + arm_func_start send_ping +send_ping: ; 0x020A4A78 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r5, r2 + ldr r4, [r5, #0x4c] + mov r6, r1 + mov r1, #8 + ldr r3, _020A4B20 ; =_021D4620 + ldr r2, _020A4B24 ; =OSi_ThreadInfo + strh r1, [r4, #0x22] + ldr r2, [r2, #4] + ldrh lr, [r3, #4] + mov r7, r0 + strh r2, [r4, #0x26] + mov r2, #0 + strh r2, [r4, #0x24] + strh lr, [r5, #0xa] + add ip, lr, #1 + add r0, r4, #0x22 + strh ip, [r3, #4] + strh lr, [r4, #0x28] + bl calc_checksum_do + mov r2, r0 + mov r0, r7 + mov r1, r6 + bl calc_checksum_do + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl invert_checksum + mov r2, r7 + mov r3, r6 + mov r1, r0, lsl #8 + orr r0, r1, r0, asr #8 + strh r0, [r4, #0x24] + ldr r1, [r5, #0x1c] + add r0, r4, #0x22 + str r1, [sp] + mov r1, #1 + str r1, [sp, #4] + mov r1, #8 + bl send_ip + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A4B20: .word _021D4620 +_020A4B24: .word OSi_ThreadInfo + arm_func_end send_ping + + arm_func_start send_udp +send_udp: ; 0x020A4B28 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r7, _020A4C60 ; =_021D4620 + mov r5, r2 + ldr r2, [r7, #0x50] + mov r6, r1 + mov r1, r2, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x10 + ldr r3, [r5, #0x4c] + mov r1, r2, lsl #8 + add r4, r3, #0x22 + orr r1, r1, r2, asr #8 + strh r1, [r4, #-0xc] + ldr r1, [r7, #0x50] + add r2, r6, #8 + mov r1, r1, lsl #0x10 + mov r7, r1, lsr #0x10 + mov r1, r7, lsl #8 + orr r1, r1, r7, asr #8 + strh r1, [r4, #-0xa] + ldr r1, [r5, #0x1c] + mov r2, r2, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r7, r1, lsr #0x10 + mov r1, r7, lsl #8 + orr r1, r1, r7, asr #8 + strh r1, [r4, #-8] + ldr r1, [r5, #0x1c] + mov r2, r2, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r7, r1, lsr #0x10 + mov r1, r7, lsl #8 + orr r7, r1, r7, asr #8 + mov r1, r2, lsl #8 + strh r7, [r4, #-6] + mov r7, #0x1100 + strh r7, [r4, #-4] + orr r1, r1, r2, asr #8 + strh r1, [r4, #4] + ldrh r1, [r4, #4] + mov r7, r0 + sub r0, r4, #0xc + strh r1, [r4, #-2] + ldrh lr, [r5, #0x18] + mov r2, #0 + mov r1, #0x14 + mov ip, lr, lsl #8 + orr ip, ip, lr, asr #8 + strh ip, [r4, #2] + ldrh lr, [r5, #0xa] + mov ip, lr, lsl #8 + orr ip, ip, lr, asr #8 + strh ip, [r3, #0x22] + strh r2, [r4, #6] + bl calc_checksum_do + mov r2, r0 + mov r0, r7 + mov r1, r6 + bl calc_checksum_do + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl invert_checksum + mov r2, r7 + mov r3, r6 + mov r1, r0, lsl #8 + orr r0, r1, r0, asr #8 + strh r0, [r4, #6] + ldr r1, [r5, #0x1c] + mov r0, r4 + str r1, [sp] + mov r1, #0x11 + str r1, [sp, #4] + mov r1, #8 + bl send_ip + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A4C60: .word _021D4620 + arm_func_end send_udp + + arm_func_start send_tcp +send_tcp: ; 0x020A4C64 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + mov r7, r2 + ldrb r2, [r7, #8] + mov sb, r0 + mov r8, r1 + cmp r2, #0 + mov r6, r3 + addeq sp, sp, #8 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r0, _020A4EC8 ; =OSi_ThreadInfo + ldr r1, _020A4ECC ; =_021D4888 + ldr r0, [r0, #4] + cmp r0, r1 + ldreq r4, _020A4ED0 ; =_021D4B32 + ldrne r0, [r7, #0x4c] + addne r4, r0, #0x22 + ldr r0, _020A4ED4 ; =_021D4620 + ands r2, r6, #2 + movne r5, #0x18 + moveq r5, #0x14 + add r1, r5, r8 + ldr sl, [r0, #0x50] + mov r3, r1, lsl #0x10 + mov r1, sl, lsr #0x10 + mov r1, r1, lsl #0x10 + mov sl, r1, lsr #0x10 + mov r1, sl, lsl #8 + orr r1, r1, sl, asr #8 + strh r1, [r4, #-0xc] + mov r1, r3, lsr #0x10 + ldr sl, [r0, #0x50] + mov lr, r1, lsl #8 + mov r3, sl, lsl #0x10 + mov sl, r3, lsr #0x10 + mov r3, sl, lsl #8 + orr r3, r3, sl, asr #8 + strh r3, [r4, #-0xa] + ldr r3, [r7, #0x1c] + orr r1, lr, r1, asr #8 + mov r3, r3, lsr #0x10 + mov r3, r3, lsl #0x10 + mov sl, r3, lsr #0x10 + mov r3, sl, lsl #8 + orr r3, r3, sl, asr #8 + strh r3, [r4, #-8] + ldr r3, [r7, #0x1c] + mov ip, r5, lsr #2 + mov r3, r3, lsl #0x10 + mov sl, r3, lsr #0x10 + mov r3, sl, lsl #8 + orr r3, r3, sl, asr #8 + strh r3, [r4, #-6] + mov r3, #0x600 + strh r3, [r4, #-4] + strh r1, [r4, #-2] + ldrh lr, [r7, #0xa] + mov r3, ip, lsl #4 + cmp r2, #0 + mov r1, lr, lsl #8 + orr r1, r1, lr, asr #8 + strh r1, [r4] + ldrh ip, [r7, #0x18] + mov r1, ip, lsl #8 + orr r1, r1, ip, asr #8 + strh r1, [r4, #2] + ldr r1, [r7, #0x28] + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov ip, r1, lsr #0x10 + mov r1, ip, lsl #8 + orr r1, r1, ip, asr #8 + strh r1, [r4, #4] + ldr r1, [r7, #0x28] + mov r1, r1, lsl #0x10 + mov ip, r1, lsr #0x10 + mov r1, ip, lsl #8 + orr r1, r1, ip, asr #8 + strh r1, [r4, #6] + ldr r1, [r7, #0x24] + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov ip, r1, lsr #0x10 + mov r1, ip, lsl #8 + orr r1, r1, ip, asr #8 + strh r1, [r4, #8] + ldr r1, [r7, #0x24] + mov r1, r1, lsl #0x10 + mov ip, r1, lsr #0x10 + mov r1, ip, lsl #8 + orr r1, r1, ip, asr #8 + strh r1, [r4, #0xa] + strb r3, [r4, #0xc] + strb r6, [r4, #0xd] + ldr r3, [r7, #0x3c] + ldr r1, [r7, #0x44] + sub r1, r3, r1 + mov r1, r1, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + strh r1, [r4, #0xe] + mov r1, #0 + strh r1, [r4, #0x10] + strh r1, [r4, #0x12] + beq _020A4E48 + ldrh r1, [r0, #2] + add r1, r1, #0x2040000 + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r2, r1, lsr #0x10 + mov r1, r2, lsl #8 + orr r1, r1, r2, asr #8 + strh r1, [r4, #0x14] + ldrh r0, [r0, #2] + add r0, r0, #0x2040000 + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + strh r0, [r4, #0x16] +_020A4E48: + sub r0, r4, #0xc + add r1, r5, #0xc + mov r2, #0 + bl calc_checksum_do + mov r2, r0 + mov r0, sb + mov r1, r8 + bl calc_checksum_do + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl invert_checksum + mov r3, r0, lsl #8 + orr r0, r3, r0, asr #8 + strh r0, [r4, #0x10] + mov r0, r4 + ldr r4, [r7, #0x1c] + mov r3, #6 + str r4, [sp] + str r3, [sp, #4] + mov r1, r5 + mov r2, sb + mov r3, r8 + bl send_ip + ldr r0, [r7, #0x28] + tst r6, #3 + add r0, r0, r8 + str r0, [r7, #0x28] + ldrne r0, [r7, #0x28] + addne r0, r0, #1 + strne r0, [r7, #0x28] + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020A4EC8: .word OSi_ThreadInfo +_020A4ECC: .word _021D4888 +_020A4ED0: .word _021D4B32 +_020A4ED4: .word _021D4620 + arm_func_end send_tcp + + arm_func_start reply_arp +reply_arp: ; 0x020A4ED8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r3, #0x200 + add r0, r4, #8 + add r1, r4, #0x12 + mov r2, #0xa + strh r3, [r4, #6] + bl MI_CpuCopy8 + ldr r0, _020A4F78 ; =_021D4B08 + add r1, r4, #8 + mov r2, #6 + bl MI_CpuCopy8 + ldr r3, _020A4F7C ; =_021D4620 + add r0, r4, #0x12 + ldr r2, [r3, #0x50] + sub r1, r4, #0xe + mov r2, r2, lsr #0x10 + mov r2, r2, lsl #0x10 + mov ip, r2, lsr #0x10 + mov r2, ip, lsl #8 + orr r2, r2, ip, asr #8 + strh r2, [r4, #0xe] + ldr r3, [r3, #0x50] + mov r2, #6 + mov r3, r3, lsl #0x10 + mov ip, r3, lsr #0x10 + mov r3, ip, lsl #8 + orr r3, r3, ip, asr #8 + strh r3, [r4, #0x10] + bl MI_CpuCopy8 + ldr r0, _020A4F78 ; =_021D4B08 + sub r1, r4, #8 + mov r2, #6 + bl MI_CpuCopy8 + sub r0, r4, #0xe + mov r1, #0x2a + mov r2, #0 + mov r3, r2 + bl send_packet + ldmia sp!, {r4, pc} + .align 2, 0 +_020A4F78: .word _021D4B08 +_020A4F7C: .word _021D4620 + arm_func_end reply_arp + + arm_func_start dispatch_arp +dispatch_arp: ; 0x020A4F80 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + cmp r1, #0x1c + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _020A50B8 ; =_021D4B08 + add r0, r6, #8 + bl maccmp + cmp r0, #0 + ldrne r0, _020A50BC ; =_021D4620 + ldrne r0, [r0, #0x50] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r6] + cmp r0, #0x100 + ldreqh r0, [r6, #2] + cmpeq r0, #8 + ldreqh r1, [r6, #4] + ldreq r0, _020A50C0 ; =0x00000406 + cmpeq r1, r0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r1, [r6, #6] + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + cmp r4, #1 + cmpne r4, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r5, [r6, #0x10] + ldrh r3, [r6, #0xe] + ldrh lr, [r6, #0x1a] + mov r0, r5, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, r5, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + ldrh ip, [r6, #0x18] + ldr r2, _020A50BC ; =_021D4620 + mov r3, r0, lsr #0x10 + mov r1, r1, lsr #0x10 + ldr r0, [r2, #0x50] + orr r1, r1, r3, lsl #16 + mov r3, ip, lsl #8 + cmp r1, r0 + moveq r5, #1 + mov r2, lr, lsl #8 + orr ip, r3, ip, asr #8 + orr r3, r2, lr, asr #8 + mov r2, ip, lsl #0x10 + mov r3, r3, lsl #0x10 + mov ip, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, ip, lsl #16 + movne r5, #0 + cmp r0, r2 + moveq r7, #1 + movne r7, #0 + cmp r5, #0 + bne _020A507C + mov r2, r7 + add r0, r6, #8 + bl reg_arpcache +_020A507C: + cmp r4, #1 + bne _020A5098 + cmp r7, #0 + beq _020A5098 + mov r0, r6 + bl reply_arp + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5098: + cmp r4, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + cmp r7, #0 + cmpne r5, #0 + ldrne r0, _020A50BC ; =_021D4620 + movne r1, #1 + strneb r1, [r0, #1] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A50B8: .word _021D4B08 +_020A50BC: .word _021D4620 +_020A50C0: .word 0x00000406 + arm_func_end dispatch_arp + + arm_func_start reply_icmp +reply_icmp: ; 0x020A50C4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r6, r0 + ldrh r4, [r6, #0xe] + ldrh r3, [r6, #0xc] + mov r5, r1 + mov r0, r4, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, r4, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r3, lsl #16 + mov r4, r2 + bl get_targetip + movs r7, r0 + addeq sp, sp, #8 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + bl inq_arpcache + cmp r0, #0 + bne _020A5130 + mov r0, r7 + bl send_arprequest + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5130: + mov r2, #0 + strb r2, [r5] + mov r0, r5 + mov r1, r4 + strh r2, [r5, #2] + bl calc_checksum + mov r1, r0, lsl #8 + orr r0, r1, r0, asr #8 + strh r0, [r5, #2] + ldrh ip, [r6, #0xe] + ldrh r3, [r6, #0xc] + mov r2, #0 + mov r0, ip, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, ip, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r6, r0, r3, lsl #16 + mov r0, r5 + mov r1, r4 + mov r3, r2 + str r6, [sp] + mov r4, #1 + str r4, [sp, #4] + bl send_ip + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end reply_icmp + + arm_func_start process_icmp_reply +process_icmp_reply: ; 0x020A51A8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + bl OS_DisableInterrupts + ldr r1, _020A52A4 ; =OSi_ThreadInfo + mov r5, r0 + ldr r1, [r1, #8] + cmp r1, #0 + beq _020A5298 +_020A51D0: + ldr r4, [r1, #0xa4] + cmp r4, #0 + ldrne r3, [r4] + cmpne r3, #0 + beq _020A528C + ldrb r0, [r4, #8] + cmp r0, #0xb + ldreqh r2, [r7, #4] + moveq r0, r3, lsl #0x10 + cmpeq r2, r0, lsr #16 + ldreqh r2, [r4, #0xa] + ldreqh r0, [r7, #6] + cmpeq r2, r0 + ldreq r0, [r4, #0x44] + cmpeq r0, #0 + bne _020A528C + ldrh lr, [r8, #0xe] + ldrh ip, [r8, #0xc] + ldr r0, [r4, #0x1c] + mov r2, lr, lsl #8 + mov r3, ip, lsl #8 + orr ip, r3, ip, asr #8 + orr r3, r2, lr, asr #8 + mov r2, ip, lsl #0x10 + mov r3, r3, lsl #0x10 + mov ip, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, ip, lsl #16 + cmp r0, r2 + bne _020A528C + ldr r1, [r4, #0x3c] + sub r0, r6, #8 + cmp r0, r1 + strhi r1, [r4, #0x44] + strls r0, [r4, #0x44] + ldr r1, [r4, #0x40] + ldr r2, [r4, #0x44] + add r0, r7, #8 + bl MI_CpuCopy8 + ldr r0, [r4, #4] + cmp r0, #3 + bne _020A5298 + mov r0, #0 + str r0, [r4, #4] + ldr r0, [r4] + bl OS_WakeupThreadDirect + b _020A5298 +_020A528C: + ldr r1, [r1, #0x68] + cmp r1, #0 + bne _020A51D0 +_020A5298: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A52A4: .word OSi_ThreadInfo + arm_func_end process_icmp_reply + + arm_func_start valid_IP +valid_IP: ; 0x020A52A8 + cmp r0, #0 + mvnne r2, #0 + cmpne r0, r2 + cmpne r1, #0 + cmpne r1, r2 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end valid_IP + + arm_func_start dispatch_icmp +dispatch_icmp: ; 0x020A52C8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r1 + mov r4, r2 + mov r6, r0 + mov r0, r5 + mov r1, r4 + bl calc_checksum + ldr r1, _020A5394 ; =0x0000FFFF + cmp r0, r1 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldrh r0, [r6, #0x12] + ldrh r8, [r6, #0x10] + ldrh r7, [r6, #0xe] + ldrh lr, [r6, #0xc] + mov r2, r8, lsl #8 + orr r2, r2, r8, asr #8 + mov ip, lr, lsl #8 + mov r2, r2, lsl #0x10 + mov r3, r7, lsl #8 + orr lr, ip, lr, asr #8 + mov r1, r0, lsl #8 + orr ip, r3, r7, asr #8 + orr r3, r1, r0, asr #8 + mov r0, lr, lsl #0x10 + mov r1, ip, lsl #0x10 + mov ip, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + mov r3, r3, lsl #0x10 + mov r2, r2, lsr #0x10 + mov r1, r3, lsr #0x10 + orr r0, r0, ip, lsl #16 + orr r1, r1, r2, lsl #16 + bl valid_IP + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r0, [r5] + cmp r0, #0 + beq _020A536C + cmp r0, #8 + beq _020A5380 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A536C: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl process_icmp_reply + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A5380: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl reply_icmp + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A5394: .word 0x0000FFFF + arm_func_end dispatch_icmp + + arm_func_start check_listener +check_listener: ; 0x020A5398 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _020A5468 ; =OSi_ThreadInfo + ldr ip, [r2, #8] + cmp ip, #0 + beq _020A5460 +_020A53AC: + ldr r3, [ip, #0xa4] + cmp r3, #0 + ldrne r2, [r3] + cmpne r2, #0 + beq _020A5454 + ldrb r2, [r3, #8] + cmp r2, #1 + bne _020A5454 + ldrh r5, [r1, #2] + ldrh r4, [r3, #0xa] + mov r2, r5, lsl #8 + orr r2, r2, r5, asr #8 + mov r2, r2, lsl #0x10 + cmp r4, r2, lsr #16 + bne _020A5454 + ldrh r5, [r3, #0x18] + cmp r5, #0 + beq _020A540C + ldrh r4, [r1] + mov r2, r4, lsl #8 + orr r2, r2, r4, asr #8 + mov r2, r2, lsl #0x10 + cmp r5, r2, lsr #16 + bne _020A5454 +_020A540C: + ldr r2, [r3, #0x1c] + cmp r2, #0 + beq _020A544C + ldrh r6, [r0, #0xe] + ldrh r5, [r0, #0xc] + mov r4, r6, lsl #8 + mov lr, r5, lsl #8 + orr lr, lr, r5, asr #8 + orr r4, r4, r6, asr #8 + mov lr, lr, lsl #0x10 + mov r4, r4, lsl #0x10 + mov lr, lr, lsr #0x10 + mov r4, r4, lsr #0x10 + orr r4, r4, lr, lsl #16 + cmp r2, r4 + bne _020A5454 +_020A544C: + mov r0, r3 + ldmia sp!, {r4, r5, r6, pc} +_020A5454: + ldr ip, [ip, #0x68] + cmp ip, #0 + bne _020A53AC +_020A5460: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A5468: .word OSi_ThreadInfo + arm_func_end check_listener + + arm_func_start check_socket +check_socket: ; 0x020A546C + stmdb sp!, {r4, r5, r6, lr} + ldrb r4, [r2, #8] + mov r3, #0 + mov r5, r3 + cmp r4, #0xa + cmpne r4, #0xb + movne r5, #1 + mov ip, r3 + mov r6, r3 + cmp r5, #0 + beq _020A54B4 + ldrh lr, [r1, #2] + ldrh r5, [r2, #0xa] + mov r4, lr, lsl #8 + orr r4, r4, lr, asr #8 + mov lr, r4, lsl #0x10 + cmp r5, lr, lsr #16 + moveq r6, #1 +_020A54B4: + cmp r6, #0 + beq _020A54D8 + ldrh lr, [r1] + ldrh r4, [r2, #0x18] + mov r1, lr, lsl #8 + orr r1, r1, lr, asr #8 + mov r1, r1, lsl #0x10 + cmp r4, r1, lsr #16 + moveq ip, #1 +_020A54D8: + cmp ip, #0 + beq _020A5518 + ldrh lr, [r0, #0xc] + ldrh r4, [r0, #0xe] + ldr ip, [r2, #0x1c] + mov r1, lr, lsl #8 + mov r0, r4, lsl #8 + orr r2, r1, lr, asr #8 + orr r1, r0, r4, asr #8 + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + cmp ip, r0 + moveq r3, #1 +_020A5518: + mov r0, r3 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end check_socket + + arm_func_start find_socket +find_socket: ; 0x020A5520 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _020A5580 ; =OSi_ThreadInfo + mov r7, r0 + ldr r5, [r2, #8] + mov r6, r1 + cmp r5, #0 + beq _020A5578 +_020A553C: + ldr r4, [r5, #0xa4] + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + beq _020A556C + mov r0, r7 + mov r1, r6 + mov r2, r4 + bl check_socket + cmp r0, #0 + movne r0, r4 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_020A556C: + ldr r5, [r5, #0x68] + cmp r5, #0 + bne _020A553C +_020A5578: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A5580: .word OSi_ThreadInfo + arm_func_end find_socket + + arm_func_start parse_mss +parse_mss: ; 0x020A5584 + mov r2, #0x218 + strh r2, [r1, #0x2e] + ldrb r2, [r0, #0xc] + add r3, r0, #0x14 + and r2, r2, #0xf0 + mov r0, r2, asr #1 + add r0, r2, r0, lsr #30 + mov r0, r0, asr #2 + subs r0, r0, #0x14 + sub ip, r0, #1 + bxeq lr +_020A55B0: + ldrb r0, [r3], #1 + cmp r0, #0 + bxeq lr + cmp r0, #1 + beq _020A55F8 + cmp r0, #2 + bne _020A55E8 + ldrb r2, [r3, #1] + ldrb r0, [r3, #2] + add r3, r3, #3 + sub ip, ip, #3 + orr r0, r0, r2, lsl #8 + strh r0, [r1, #0x2e] + b _020A55F8 +_020A55E8: + ldrb r0, [r3] + sub r0, r0, #1 + sub ip, ip, r0 + add r3, r3, r0 +_020A55F8: + cmp ip, #0 + sub ip, ip, #1 + bne _020A55B0 + bx lr + arm_func_end parse_mss + + arm_func_start no_need_inq +no_need_inq: ; 0x020A5608 + stmdb sp!, {r3, lr} + bl get_targetip + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r3, pc} + bl inq_arpcache + ldmia sp!, {r3, pc} + arm_func_end no_need_inq + + arm_func_start tcp_send_handshake +tcp_send_handshake: ; 0x020A5624 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + ldr r0, [r6, #0x1c] + mov r5, r1 + mov r4, r2 + bl no_need_inq + cmp r0, #0 + bne _020A565C + ldr r0, _020A5690 ; =OSi_ThreadInfo + ldr r1, _020A5694 ; =_021D4888 + ldr r0, [r0, #4] + cmp r0, r1 + beq _020A567C +_020A565C: + mov r0, #0 + mov r1, r0 + mov r2, r6 + mov r3, r5 + str r4, [sp] + bl send_tcp + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} +_020A567C: + ldr r0, [r6, #0x1c] + bl get_targetip + bl send_arprequest + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020A5690: .word OSi_ThreadInfo +_020A5694: .word _021D4888 + arm_func_end tcp_send_handshake + + arm_func_start tcp_send_ack +tcp_send_ack: ; 0x020A5698 + ldr ip, _020A56A8 ; =tcp_send_handshake + mov r2, r1 + mov r1, #0x10 + bx ip + .align 2, 0 +_020A56A8: .word tcp_send_handshake + arm_func_end tcp_send_ack + + arm_func_start tcp_send_finack +tcp_send_finack: ; 0x020A56AC + ldr ip, _020A56BC ; =tcp_send_handshake + mov r2, r1 + mov r1, #0x11 + bx ip + .align 2, 0 +_020A56BC: .word tcp_send_handshake + arm_func_end tcp_send_finack + + arm_func_start tcp_send_rst +tcp_send_rst: ; 0x020A56C0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _020A57F0 ; =_021D4764 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r0, r4 + mov r1, #0 + mov r2, #0x64 + mov r5, r3 + bl MI_CpuFill8 + ldrh r3, [r7, #2] + ldr r0, _020A57F4 ; =_021D4720 + ldr r2, _020A57F8 ; =_021D4620 + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + strh r1, [r0, #0x4e] + ldrh r3, [r7] + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + strh r1, [r0, #0x5c] + ldrh ip, [r8, #0xe] + ldrh r3, [r8, #0xc] + mov r0, ip, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, ip, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r3, lsl #16 + str r0, [r2, #0x160] + ldrb r0, [r7, #0xd] + tst r0, #0x10 + beq _020A5790 + ldrh r6, [r7, #0xa] + ldrh r3, [r7, #8] + mov r0, r4 + mov r1, r6, lsl #8 + mov r2, r3, lsl #8 + orr r3, r2, r3, asr #8 + orr r2, r1, r6, asr #8 + mov r1, r3, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r2, lsr #0x10 + orr r3, r1, r3, lsl #16 + mov r2, r5 + mov r1, #4 + str r3, [r4, #0x28] + bl tcp_send_handshake + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A5790: + mov r0, #0 + str r0, [r4, #0x28] + ldrh r3, [r7, #6] + ldrh r2, [r7, #4] + mov r0, r3, lsl #8 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + orr r1, r0, r3, asr #8 + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + add r1, r6, r0 + str r1, [r4, #0x24] + ldrb r0, [r7, #0xd] + mov r2, r5 + tst r0, #3 + addne r0, r1, #1 + strne r0, [r4, #0x24] + mov r0, r4 + mov r1, #0x14 + bl tcp_send_handshake + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A57F0: .word _021D4764 +_020A57F4: .word _021D4720 +_020A57F8: .word _021D4620 + arm_func_end tcp_send_rst + + arm_func_start dt_syn_LISTEN +dt_syn_LISTEN: ; 0x020A57FC + stmdb sp!, {r4, r5, r6, lr} + mov r4, r2 + mov r2, #3 + mov r6, r0 + mov r5, r1 + strb r2, [r4, #8] + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [r4, #0x10] + ldrh r2, [r6, #0x12] + ldrh r3, [r6, #0x10] + mov r0, r5 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + mov r1, r1, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r2, lsr #0x10 + orr r1, r1, r3, lsl #16 + str r1, [r4, #0x14] + ldrh r3, [r5] + mov r1, r4 + mov r2, r3, lsl #8 + orr r2, r2, r3, asr #8 + strh r2, [r4, #0x18] + ldrh r3, [r6, #0xe] + ldrh r6, [r6, #0xc] + mov r2, r3, lsl #8 + orr r3, r2, r3, asr #8 + mov r2, r6, lsl #8 + orr r2, r2, r6, asr #8 + mov r2, r2, lsl #0x10 + mov r3, r3, lsl #0x10 + mov r6, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, r6, lsl #16 + str r2, [r4, #0x1c] + ldrh r6, [r5, #6] + ldrh r5, [r5, #4] + mov r2, r6, lsl #8 + mov r3, r5, lsl #8 + orr r5, r3, r5, asr #8 + orr r3, r2, r6, asr #8 + mov r2, r5, lsl #0x10 + mov r3, r3, lsl #0x10 + mov r5, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, r5, lsl #16 + add r2, r2, #1 + str r2, [r4, #0x24] + bl parse_mss + mov r0, r4 + mov r1, #0x12 + mov r2, #0 + bl tcp_send_handshake + ldmia sp!, {r4, r5, r6, pc} + arm_func_end dt_syn_LISTEN + + arm_func_start find_specific_socket +find_specific_socket: ; 0x020A58E8 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl find_socket + movs r2, r0 + beq _020A5968 + ldrb r0, [r2, #8] + cmp r0, #1 + bne _020A5920 + mov r0, r6 + mov r1, r5 + bl dt_syn_LISTEN + b _020A5960 +_020A5920: + add r0, r0, #0xfd + and r0, r0, #0xff + cmp r0, #1 + bhi _020A594C + ldr r1, [r2, #0x28] + mov r0, r6 + sub r3, r1, #1 + mov r1, r5 + str r3, [r2, #0x28] + bl dt_syn_LISTEN + b _020A5960 +_020A594C: + mov r0, r6 + mov r1, r5 + mov r2, r4 + mov r3, #0 + bl tcp_send_rst +_020A5960: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020A5968: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end find_specific_socket + + arm_func_start dt_syn +dt_syn: ; 0x020A5970 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r4, r0 + ldrh r0, [r4, #0x12] + ldrh r8, [r4, #0x10] + ldrh r7, [r4, #0xe] + ldrh r6, [r4, #0xc] + mov ip, r8, lsl #8 + orr ip, ip, r8, asr #8 + mov r5, r6, lsl #8 + mov ip, ip, lsl #0x10 + mov lr, r7, lsl #8 + orr r6, r5, r6, asr #8 + mov r3, r0, lsl #8 + orr r5, lr, r7, asr #8 + orr lr, r3, r0, asr #8 + mov r0, r6, lsl #0x10 + mov r3, r5, lsl #0x10 + mov r5, r0, lsr #0x10 + mov r0, r3, lsr #0x10 + mov lr, lr, lsl #0x10 + orr r0, r0, r5, lsl #16 + mov ip, ip, lsr #0x10 + mov r3, lr, lsr #0x10 + mov r6, r1 + orr r1, r3, ip, lsl #16 + mov r5, r2 + bl valid_IP + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl find_specific_socket + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + mov r1, r6 + bl check_listener + movs r2, r0 + beq _020A5A20 + mov r0, r4 + mov r1, r6 + bl dt_syn_LISTEN + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A5A20: + bl OS_YieldThread + mov r0, r4 + mov r1, r6 + bl check_listener + movs r2, r0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + mov r1, r6 + bl dt_syn_LISTEN + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end dt_syn + + arm_func_start dt_synack +dt_synack: ; 0x020A5A48 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r5, r1 + mov r6, r2 + bl find_socket + movs r4, r0 + beq _020A5A70 + ldrb r0, [r4, #8] + cmp r0, #2 + beq _020A5A88 +_020A5A70: + mov r0, r7 + mov r1, r5 + mov r2, r6 + mov r3, #0 + bl tcp_send_rst + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5A88: + bl OS_YieldThread + ldrh ip, [r5, #6] + ldrh r3, [r5, #4] + mov r0, r5 + mov r1, ip, lsl #8 + mov r2, r3, lsl #8 + orr r3, r2, r3, asr #8 + orr r2, r1, ip, asr #8 + mov r1, r3, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r2, lsr #0x10 + orr r1, r1, r3, lsl #16 + add r1, r1, #1 + str r1, [r4, #0x24] + ldrh lr, [r5, #0xa] + ldrh ip, [r5, #8] + mov r1, r4 + mov r2, lr, lsl #8 + mov r3, ip, lsl #8 + orr ip, r3, ip, asr #8 + orr r3, r2, lr, asr #8 + mov r2, ip, lsl #0x10 + mov r3, r3, lsl #0x10 + mov ip, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, ip, lsl #16 + str r2, [r4, #0x30] + ldrh r3, [r5, #0xe] + mov r2, r3, lsl #8 + orr r2, r2, r3, asr #8 + strh r2, [r4, #0x2c] + bl parse_mss + mov r0, r4 + mov r1, #0 + bl tcp_send_ack + mov r0, #4 + strb r0, [r4, #8] + ldr r0, [r4, #4] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #0 + str r0, [r4, #4] + ldr r0, [r4] + bl OS_WakeupThreadDirect + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end dt_synack + + arm_func_start dt_ack +dt_ack: ; 0x020A5B40 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r4, r0 + mov sb, r1 + mov r8, r2 + bl find_socket + movs r5, r0 + bne _020A5B74 + mov r0, r4 + mov r1, sb + mov r2, r8 + mov r3, #0 + bl tcp_send_rst + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020A5B74: + ldrh r6, [sb, #0xa] + ldrh r3, [sb, #8] + ldr r2, [r5, #0x30] + mov r0, r6, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, r6, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r1, r0, r3, lsl #16 + sub r0, r1, r2 + ldrb r6, [sb, #0xd] + cmp r0, #0 + strgt r1, [r5, #0x30] + ldrh r7, [sb, #6] + ldrh r3, [sb, #4] + ldrb r2, [r5, #8] + mov r0, r7, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, r7, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + cmp r2, #4 + orr r1, r0, r3, lsl #16 + bne _020A5C08 + ldr r0, [r5, #0x24] + cmp r0, r1 + beq _020A5C08 + mov r0, r5 + mov r1, #0 + bl tcp_send_ack + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020A5C08: + ldrh r1, [sb, #0xe] + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + strh r0, [r5, #0x2c] + ldrb r0, [r5, #8] + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _020A5E34 +_020A5C28: ; jump table + b _020A5C50 ; case 0 + b _020A5E34 ; case 1 + b _020A5C50 ; case 2 + b _020A5C68 ; case 3 + b _020A5C94 ; case 4 + b _020A5E34 ; case 5 + b _020A5E10 ; case 6 + b _020A5D9C ; case 7 + b _020A5D9C ; case 8 + b _020A5E10 ; case 9 +_020A5C50: + mov r0, r4 + mov r1, sb + mov r2, r8 + mov r3, #0 + bl tcp_send_rst + b _020A5E50 +_020A5C68: + mov r0, #4 + strb r0, [r5, #8] + ldr r0, [r5, #4] + cmp r0, #1 + bne _020A5C8C + mov r0, #0 + str r0, [r5, #4] + ldr r0, [r5] + bl OS_WakeupThreadDirect +_020A5C8C: + cmp r8, #0 + beq _020A5E50 +_020A5C94: + ldr r0, [r5, #0x34] + add r0, r0, #1 + str r0, [r5, #0x34] + ldr r1, [r5, #0x3c] + ldr r0, [r5, #0x44] + sub r0, r1, r0 + cmp r8, r0 + movhi r7, #0 + movhi r8, r0 + movls r7, #1 + cmp r8, #0 + beq _020A5D30 + bl OS_DisableInterrupts + ldrb r1, [sb, #0xc] + ldr ip, [r5, #0x40] + ldr r3, [r5, #0x44] + and r2, r1, #0xf0 + mov r1, r2, asr #1 + add r1, r2, r1, lsr #30 + mov r4, r0 + mov r2, r8 + add r0, sb, r1, asr #2 + add r1, ip, r3 + bl MI_CpuCopy8 + ldr r1, [r5, #0x44] + mov r0, r4 + add r1, r1, r8 + str r1, [r5, #0x44] + ldr r1, [r5, #0x24] + add r1, r1, r8 + str r1, [r5, #0x24] + bl OS_RestoreInterrupts + ldr r0, [r5, #4] + cmp r0, #2 + bne _020A5D30 + mov r0, #0 + str r0, [r5, #4] + ldr r0, [r5] + bl OS_WakeupThreadDirect +_020A5D30: + cmp r7, #0 + beq _020A5D84 + tst r6, #1 + beq _020A5D84 + mov r0, #6 + strb r0, [r5, #8] + ldr r1, [r5, #0x24] + mov r0, r5 + add r2, r1, #1 + mov r1, #0 + str r2, [r5, #0x24] + bl tcp_send_finack + cmp r8, #0 + ldreq r0, [r5, #4] + cmpeq r0, #2 + bne _020A5E50 + mov r0, #0 + str r0, [r5, #4] + ldr r0, [r5] + bl OS_WakeupThreadDirect + b _020A5E50 +_020A5D84: + cmp r8, #0 + beq _020A5E50 + mov r0, r5 + mov r1, #0 + bl tcp_send_ack + b _020A5E50 +_020A5D9C: + tst r6, #1 + beq _020A5DE4 + ldr r1, [r5, #0x24] + add r0, r8, #1 + add r2, r1, r0 + mov r0, r5 + mov r1, #0 + str r2, [r5, #0x24] + bl tcp_send_ack + mov r1, #0 + strb r1, [r5, #8] + ldr r0, [r5, #4] + cmp r0, #2 + bne _020A5E50 + str r1, [r5, #4] + ldr r0, [r5] + bl OS_WakeupThreadDirect + b _020A5E50 +_020A5DE4: + cmp r8, #0 + beq _020A5E04 + ldr r1, [r5, #0x24] + mov r0, r5 + add r2, r1, r8 + mov r1, #0 + str r2, [r5, #0x24] + bl tcp_send_ack +_020A5E04: + mov r0, #8 + strb r0, [r5, #8] + b _020A5E50 +_020A5E10: + mov r1, #0 + strb r1, [r5, #8] + ldr r0, [r5, #4] + cmp r0, #2 + bne _020A5E50 + str r1, [r5, #4] + ldr r0, [r5] + bl OS_WakeupThreadDirect + b _020A5E50 +_020A5E34: + tst r6, #1 + ldrne r0, [r5, #0x24] + mov r1, #0 + addne r0, r0, #1 + strne r0, [r5, #0x24] + mov r0, r5 + bl tcp_send_ack +_020A5E50: + bl OS_YieldThread + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end dt_ack + + arm_func_start dt_fin +dt_fin: ; 0x020A5E58 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl find_socket + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r4, #8] + cmp r1, #4 + beq _020A5EEC + cmp r1, #7 + beq _020A5E94 + cmp r1, #8 + beq _020A5EB4 + b _020A5F0C +_020A5E94: + ldr r2, [r4, #0x24] + mov r1, #0 + add r2, r2, #1 + str r2, [r4, #0x24] + bl tcp_send_ack + mov r0, #9 + strb r0, [r4, #8] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5EB4: + ldr r2, [r4, #0x24] + mov r1, #0 + add r2, r2, #1 + str r2, [r4, #0x24] + bl tcp_send_ack + mov r1, #0 + strb r1, [r4, #8] + ldr r0, [r4, #4] + cmp r0, #2 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + str r1, [r4, #4] + ldr r0, [r4] + bl OS_WakeupThreadDirect + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5EEC: + ldr r2, [r4, #0x24] + mov r1, #0 + add r2, r2, #1 + str r2, [r4, #0x24] + bl tcp_send_finack + mov r0, #6 + strb r0, [r4, #8] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A5F0C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov r3, #0 + bl tcp_send_rst + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end dt_fin + + arm_func_start dt_rst +dt_rst: ; 0x020A5F24 + stmdb sp!, {r4, lr} + bl find_socket + movs r4, r0 + ldmeqia sp!, {r4, pc} + bl OS_YieldThread + mov r1, #0 + strb r1, [r4, #8] + ldr r0, [r4, #4] + sub r0, r0, #1 + cmp r0, #1 + ldmhiia sp!, {r4, pc} + str r1, [r4, #4] + ldr r0, [r4] + bl OS_WakeupThreadDirect + ldmia sp!, {r4, pc} + arm_func_end dt_rst + + arm_func_start dispatch_tcp +dispatch_tcp: ; 0x020A5F60 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + mov r0, r5 + mov r1, r4 + mov r2, r6 + mov r3, #6 + bl check_tcpudpsum + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + ldrb r0, [r5, #0xc] + ldrb r2, [r5, #0xd] + and r1, r0, #0xf0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + and r1, r2, #0x17 + cmp r1, #0x10 + sub r4, r4, r0, asr #2 + bgt _020A5FD8 + cmp r1, #0x10 + bge _020A6030 + cmp r1, #2 + bgt _020A6058 + cmp r1, #1 + blt _020A6058 + beq _020A6044 + cmp r1, #2 + beq _020A5FF8 + b _020A6058 +_020A5FD8: + cmp r1, #0x12 + bgt _020A6058 + cmp r1, #0x11 + blt _020A6058 + beq _020A6030 + cmp r1, #0x12 + beq _020A6014 + b _020A6058 +_020A5FF8: + tst r2, #0x28 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl dt_syn + ldmia sp!, {r4, r5, r6, pc} +_020A6014: + tst r2, #0x28 + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl dt_synack + ldmia sp!, {r4, r5, r6, pc} +_020A6030: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl dt_ack + ldmia sp!, {r4, r5, r6, pc} +_020A6044: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl dt_fin + ldmia sp!, {r4, r5, r6, pc} +_020A6058: + tst r2, #4 + mov r0, r6 + mov r1, r5 + beq _020A6070 + bl dt_rst + ldmia sp!, {r4, r5, r6, pc} +_020A6070: + mov r2, r4 + mov r3, #0 + bl tcp_send_rst + ldmia sp!, {r4, r5, r6, pc} + arm_func_end dispatch_tcp + + arm_func_start dispatch_udp +dispatch_udp: ; 0x020A6080 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r1 + ldrh r1, [r7, #6] + mov r8, r0 + mov r6, r2 + cmp r1, #0 + beq _020A60B8 + mov r0, r7 + mov r1, r6 + mov r2, r8 + mov r3, #0x11 + bl check_tcpudpsum + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020A60B8: + bl OS_DisableInterrupts + ldr r1, _020A6288 ; =OSi_ThreadInfo + mov r5, r0 + ldr r1, [r1, #8] + cmp r1, #0 + beq _020A627C + mvn ip, #0 +_020A60D4: + ldr r4, [r1, #0xa4] + cmp r4, #0 + ldrne r0, [r4] + cmpne r0, #0 + beq _020A6270 + ldrb r0, [r4, #8] + cmp r0, #0xa + bne _020A6270 + ldrh r3, [r7, #2] + ldrh r2, [r4, #0xa] + mov r0, r3, lsl #8 + orr r0, r0, r3, asr #8 + mov r0, r0, lsl #0x10 + cmp r2, r0, lsr #16 + bne _020A6270 + ldrh r3, [r4, #0x18] + cmp r3, #0 + beq _020A6134 + ldrh r2, [r7] + mov r0, r2, lsl #8 + orr r0, r0, r2, asr #8 + mov r0, r0, lsl #0x10 + cmp r3, r0, lsr #16 + bne _020A6270 +_020A6134: + ldr r0, [r4, #0x1c] + cmp r0, #0 + cmpne r0, ip + beq _020A6178 + ldrh sb, [r8, #0xe] + ldrh lr, [r8, #0xc] + mov r2, sb, lsl #8 + mov r3, lr, lsl #8 + orr lr, r3, lr, asr #8 + orr r3, r2, sb, asr #8 + mov r2, lr, lsl #0x10 + mov r3, r3, lsl #0x10 + mov lr, r2, lsr #0x10 + mov r2, r3, lsr #0x10 + orr r2, r2, lr, lsl #16 + cmp r0, r2 + bne _020A6270 +_020A6178: + ldrh r3, [r8, #0x12] + ldrh r2, [r8, #0x10] + mov r0, r3, lsl #8 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + orr r1, r0, r3, asr #8 + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + str r0, [r4, #0x14] + ldr r0, [r4, #0x1c] + cmp r0, #0 + bne _020A61F4 + ldrh r3, [r8, #0xe] + ldrh r2, [r8, #0xc] + mov r0, r3, lsl #8 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + orr r1, r0, r3, asr #8 + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r0, r0, r2, lsl #16 + str r0, [r4, #0x1c] + ldrh r1, [r7] + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + strh r0, [r4, #0x18] +_020A61F4: + ldr r0, [r4, #0x44] + cmp r0, #0 + bne _020A627C + ldr r1, [r4, #0x3c] + sub r0, r6, #8 + cmp r0, r1 + strhi r1, [r4, #0x44] + strls r0, [r4, #0x44] + ldr r1, [r4, #0x40] + ldr r2, [r4, #0x44] + add r0, r7, #8 + bl MI_CpuCopy8 + ldr r0, [r4, #4] + cmp r0, #3 + bne _020A6244 + mov r0, #0 + str r0, [r4, #4] + ldr r0, [r4] + bl OS_WakeupThreadDirect + b _020A627C +_020A6244: + ldr r3, [r4, #0x38] + cmp r3, #0 + beq _020A627C + ldr r0, [r4, #0x40] + ldr r1, [r4, #0x44] + mov r2, r4 + blx r3 + cmp r0, #0 + movne r0, #0 + strne r0, [r4, #0x44] + b _020A627C +_020A6270: + ldr r1, [r1, #0x68] + cmp r1, #0 + bne _020A60D4 +_020A627C: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A6288: .word OSi_ThreadInfo + arm_func_end dispatch_udp + + arm_func_start check_frag +check_frag: ; 0x020A628C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov r6, #0 + mov sl, r0 + str r6, [r1] + ldrh r3, [sl, #6] + str r1, [sp] + ldr r2, _020A6548 ; =0x00003FFF + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + str r1, [sp, #8] + tst r1, r2 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrh r3, [sl, #0xe] + ldrh r2, [sl, #0xc] + ldrb r4, [sl] + mov r0, r3, lsl #8 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + orr r1, r0, r3, asr #8 + mov r3, r4, lsl #0x1c + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r1, r1, lsr #0x10 + ldrh r4, [sl, #4] + ldr r7, _020A654C ; =_021D4948 + mov r0, r6 + mov r5, r3, lsr #0x1a + orr sb, r1, r2, lsl #16 +_020A6310: + ldrh r2, [r7, #4] + cmp r2, #0 + beq _020A6330 + ldr r1, [r7] + cmp r1, sb + ldreqh r1, [r7, #6] + cmpeq r1, r4 + beq _020A634C +_020A6330: + add r0, r0, #1 + cmp r2, #0 + cmpeq r6, #0 + moveq r6, r7 + cmp r0, #8 + add r7, r7, #0x38 + blo _020A6310 +_020A634C: + ldrh r2, [sl, #2] + cmp r0, #8 + ldr r1, _020A6550 ; =0x00001FFF + mov r0, r2, lsl #8 + orr r0, r0, r2, asr #8 + mov r0, r0, lsl #0x10 + rsb r0, r5, r0, lsr #16 + str r0, [sp, #4] + ldr r0, [sp, #8] + and fp, r0, r1 + ldr r0, [sp, #4] + add r8, r0, fp, lsl #3 + bne _020A6408 + cmp r6, #0 + beq _020A6390 + cmp r8, #0x1000 + bls _020A639C +_020A6390: + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020A639C: + ldr r1, _020A6554 ; =_021D4620 + add r0, r5, #0xe + ldr r1, [r1, #0x14] + add r0, r0, #0x1000 + mov r7, r6 + blx r1 + cmp r0, #0 + str r0, [r6, #0x34] + addeq sp, sp, #0xc + mov r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + str sb, [r6] + strh r4, [r6, #6] + strh r0, [r6, #8] + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [r6, #0x2c] + ldr r1, [r6, #0x34] + mov r0, sl + add r1, r1, #0xe + add r1, r1, r5 + str r1, [r6, #0x30] + ldr r1, [r6, #0x34] + mov r2, r5 + add r1, r1, #0xe + bl MI_CpuCopy8 +_020A6408: + ldrh r0, [r7, #4] + cmp r0, #8 + beq _020A641C + cmp r8, #0x1000 + bls _020A6440 +_020A641C: + ldr r1, _020A6554 ; =_021D4620 + mov r0, #0 + strh r0, [r7, #4] + ldr r0, [r7, #0x34] + ldr r1, [r1, #0x40] + blx r1 + add sp, sp, #0xc + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020A6440: + ldr r0, [sp, #4] + ldr r2, [sp, #4] + add r1, r0, #7 + ldr r0, [sp, #8] + add r3, fp, r1, lsr #3 + tst r0, #0x2000 + streqh r8, [r7, #0xa] + streqh r3, [r7, #8] + ldrh r1, [r7, #4] + add r0, sl, r5 + add r1, r7, r1, lsl #1 + strh fp, [r1, #0xc] + ldrh r1, [r7, #4] + add r1, r7, r1, lsl #1 + strh r3, [r1, #0x1c] + ldrh r1, [r7, #4] + add r1, r1, #1 + strh r1, [r7, #4] + ldr r1, [r7, #0x30] + add r1, r1, fp, lsl #3 + bl MI_CpuCopy8 + ldrh r4, [r7, #8] + cmp r4, #0 + addeq sp, sp, #0xc + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldrh r3, [r7, #4] + mov r6, #0 + mov r5, r6 + cmp r3, #0 + bls _020A64F0 + mov r0, r6 +_020A64C0: + add r2, r7, r5, lsl #1 + ldrh r1, [r2, #0xc] + cmp r1, r6 + bhi _020A64E4 + ldrh r1, [r2, #0x1c] + cmp r6, r1 + movlo r6, r1 + movlo r5, r0 + blo _020A64E8 +_020A64E4: + add r5, r5, #1 +_020A64E8: + cmp r5, r3 + blo _020A64C0 +_020A64F0: + cmp r6, r4 + addlo sp, sp, #0xc + movlo r0, #0 + ldmloia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, [r7, #0x34] + ldrh r3, [r7, #0xa] + ldrb r0, [r4, #0xe] + mov r2, #0 + mov r1, #1 + mov r0, r0, lsl #0x1c + add r0, r3, r0, lsr #26 + mov r0, r0, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r3, lsl #8 + orr r0, r0, r3, asr #8 + strh r0, [r4, #0x10] + ldr r0, [sp] + strh r2, [r7, #4] + str r1, [r0] + add r0, r4, #0xe + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A6548: .word 0x00003FFF +_020A654C: .word _021D4948 +_020A6550: .word 0x00001FFF +_020A6554: .word _021D4620 + arm_func_end check_frag + + arm_func_start dispatch_ip +dispatch_ip: ; 0x020A6558 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + ldrh r7, [r4, #0xe] + ldrh r6, [r4, #0xc] + ldrh lr, [r4, #0x12] + ldrh r5, [r4, #0x10] + mov r2, r6, lsl #8 + mov r3, lr, lsl #8 + mov ip, r5, lsl #8 + mov r0, r7, lsl #8 + orr r5, ip, r5, asr #8 + orr lr, r3, lr, asr #8 + orr r3, r2, r6, asr #8 + orr ip, r0, r7, asr #8 + mov r0, r5, lsl #0x10 + mov r2, lr, lsl #0x10 + mov r3, r3, lsl #0x10 + mov ip, ip, lsl #0x10 + mov lr, r0, lsr #0x10 + mov r0, r2, lsr #0x10 + mov r3, r3, lsr #0x10 + mov r2, ip, lsr #0x10 + orr r0, r0, lr, lsl #16 + orr r2, r2, r3, lsl #16 + mov r5, r1 + cmp r0, r2 + beq _020A667C + bl ip_isme + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r1, [r4, #2] + mov r0, r1, lsl #8 + orr r0, r0, r1, asr #8 + mov r0, r0, lsl #0x10 + cmp r5, r0, lsr #16 + ldmloia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r1, [r4] + mov r0, r4 + mov r1, r1, lsl #0x1c + mov r1, r1, lsr #0x1a + bl calc_checksum + ldr r1, _020A6714 ; =0x0000FFFF + cmp r0, r1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrh ip, [r4, #0x12] + ldrh r3, [r4, #0x10] + ldr r2, _020A6718 ; =_021D4620 + mov r0, ip, lsl #8 + mov r1, r3, lsl #8 + orr r3, r1, r3, asr #8 + orr r1, r0, ip, asr #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r3, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + ldr r1, [r2, #0x50] + orr r0, r0, r3, lsl #16 + cmp r1, r0 + bne _020A667C + ldrh ip, [r4, #0xe] + ldrh r3, [r4, #0xc] + sub r0, r4, #8 + mov r1, ip, lsl #8 + mov r2, r3, lsl #8 + orr r3, r2, r3, asr #8 + orr r2, r1, ip, asr #8 + mov r1, r3, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r2, lsr #0x10 + orr r1, r1, r3, lsl #16 + mov r2, #1 + bl reg_arpcache +_020A667C: + add r1, sp, #0 + mov r0, r4 + bl check_frag + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r2, [r4, #2] + ldrb r3, [r4] + ldrb ip, [r4, #9] + mov r1, r2, lsl #8 + orr r1, r1, r2, asr #8 + mov r1, r1, lsl #0x10 + mov r3, r3, lsl #0x1c + mov r2, r1, lsr #0x10 + cmp ip, #0x11 + add r1, r4, r3, lsr #26 + sub r2, r2, r3, lsr #26 + bne _020A66C8 + bl dispatch_udp + b _020A66F4 +_020A66C8: + ldr r3, _020A6718 ; =_021D4620 + ldr r3, [r3, #0x50] + cmp r3, #0 + beq _020A66F4 + cmp ip, #1 + bne _020A66E8 + bl dispatch_icmp + b _020A66F4 +_020A66E8: + cmp ip, #6 + bne _020A66F4 + bl dispatch_tcp +_020A66F4: + ldr r0, [sp] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, _020A6718 ; =_021D4620 + sub r0, r4, #0xe + ldr r1, [r1, #0x40] + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A6714: .word 0x0000FFFF +_020A6718: .word _021D4620 + arm_func_end dispatch_ip + + arm_func_start tcpip +tcpip: ; 0x020A671C + stmdb sp!, {r3, r4, r5, lr} + ldr r5, _020A6788 ; =0x00000806 + add r4, sp, #0 +_020A6728: + mov r0, r4 + bl receive_packet + ldr r3, [sp] + cmp r3, #0x22 + bls _020A6780 + ldrh r2, [r0, #0xc] + mov r1, r2, lsl #8 + orr r1, r1, r2, asr #8 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + cmp r1, #0x800 + beq _020A6764 + cmp r1, r5 + beq _020A6774 + b _020A6780 +_020A6764: + add r0, r0, #0xe + sub r1, r3, #0xe + bl dispatch_ip + b _020A6780 +_020A6774: + add r0, r0, #0xe + sub r1, r3, #0xe + bl dispatch_arp +_020A6780: + bl throw_packet + b _020A6728 + .align 2, 0 +_020A6788: .word 0x00000806 + arm_func_end tcpip + + arm_func_start CPS_SocGetEport +CPS_SocGetEport: ; 0x020A678C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r0, _020A6828 ; =OSi_ThreadInfo + ldr r2, _020A682C ; =_021D4620 + ldr r0, [r0, #8] + ldr r1, _020A6830 ; =0x00001388 + mov r4, #0x400 + mov r3, #1 + mov r5, #0 +_020A67AC: + ldrh ip, [r2, #8] + mov r6, r5 + add ip, ip, #1 + strh ip, [r2, #8] + ldrh ip, [r2, #8] + cmp ip, #0x400 + blo _020A67D0 + cmp ip, r1 + blo _020A67D4 +_020A67D0: + strh r4, [r2, #8] +_020A67D4: + mov r7, r0 + cmp r0, #0 + beq _020A6814 + ldrh r8, [r2, #8] +_020A67E4: + ldr lr, [r7, #0xa4] + cmp lr, #0 + ldrne ip, [lr] + cmpne ip, #0 + beq _020A6808 + ldrh ip, [lr, #0xa] + cmp ip, r8 + moveq r6, r3 + beq _020A6814 +_020A6808: + ldr r7, [r7, #0x68] + cmp r7, #0 + bne _020A67E4 +_020A6814: + cmp r6, #0 + bne _020A67AC + ldr r0, _020A682C ; =_021D4620 + ldrh r0, [r0, #8] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A6828: .word OSi_ThreadInfo +_020A682C: .word _021D4620 +_020A6830: .word 0x00001388 + arm_func_end CPS_SocGetEport + + arm_func_start get_seqno +get_seqno: ; 0x020A6834 + stmdb sp!, {r3, lr} + ldr r1, _020A6874 ; =_021D4620 + ldr r3, [r1, #0x70] + ldr r2, [r1, #0x68] + ldr r0, [r1, #0x6c] + umull lr, ip, r3, r2 + mla ip, r3, r0, ip + ldr r0, [r1, #0x74] + ldr r3, [r1, #0x78] + mla ip, r0, r2, ip + ldr r0, [r1, #0x7c] + adds r2, r3, lr + str r2, [r1, #0x68] + adc r0, r0, ip + str r0, [r1, #0x6c] + ldmia sp!, {r3, pc} + .align 2, 0 +_020A6874: .word _021D4620 + arm_func_end get_seqno + + arm_func_start CPS_SocRegister +CPS_SocRegister: ; 0x020A6878 + ldr r1, _020A6888 ; =OSi_ThreadInfo + ldr r1, [r1, #4] + str r0, [r1, #0xa4] + bx lr + .align 2, 0 +_020A6888: .word OSi_ThreadInfo + arm_func_end CPS_SocRegister + + arm_func_start CPS_SocUnRegister +CPS_SocUnRegister: ; 0x020A688C + ldr r0, _020A68A0 ; =OSi_ThreadInfo + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0xa4] + bx lr + .align 2, 0 +_020A68A0: .word OSi_ThreadInfo + arm_func_end CPS_SocUnRegister + + arm_func_start CPS_SocDatagramMode +CPS_SocDatagramMode: ; 0x020A68A4 + ldr r0, _020A68CC ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r1, [r0, #0xa4] + cmp r1, #0 + bxeq lr + mov r0, #0xa + strb r0, [r1, #8] + mov r0, #0 + str r0, [r1, #0x44] + bx lr + .align 2, 0 +_020A68CC: .word OSi_ThreadInfo + arm_func_end CPS_SocDatagramMode + + arm_func_start CPS_SocBind +CPS_SocBind: ; 0x020A68D0 + stmdb sp!, {r4, lr} + ldr r3, _020A6924 ; =OSi_ThreadInfo + ldr r3, [r3, #4] + ldr r4, [r3, #0xa4] + cmp r4, #0 + ldmeqia sp!, {r4, pc} + ldr r3, _020A6928 ; =0x7F000001 + cmp r2, r3 + ldreq r2, _020A692C ; =_021D4620 + ldreq r2, [r2, #0x50] + cmp r0, #0 + strh r1, [r4, #0x1a] + ldrh r1, [r4, #0x1a] + strh r1, [r4, #0x18] + str r2, [r4, #0x20] + str r2, [r4, #0x1c] + strneh r0, [r4, #0xa] + ldmneia sp!, {r4, pc} + bl CPS_SocGetEport + strh r0, [r4, #0xa] + ldmia sp!, {r4, pc} + .align 2, 0 +_020A6924: .word OSi_ThreadInfo +_020A6928: .word 0x7F000001 +_020A692C: .word _021D4620 + arm_func_end CPS_SocBind + + arm_func_start CPS_SocUse +CPS_SocUse: ; 0x020A6930 + ldr r0, _020A6960 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r1, [r0, #0xa4] + cmp r1, #0 + bxeq lr + str r0, [r1] + mov r0, #0 + strb r0, [r1, #8] + str r0, [r1, #0x44] + str r0, [r1, #0x60] + str r0, [r1, #0x38] + bx lr + .align 2, 0 +_020A6960: .word OSi_ThreadInfo + arm_func_end CPS_SocUse + + arm_func_start CPS_SocRelease +CPS_SocRelease: ; 0x020A6964 + ldr r0, _020A6980 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r1, [r0, #0xa4] + cmp r1, #0 + movne r0, #0 + strne r0, [r1] + bx lr + .align 2, 0 +_020A6980: .word OSi_ThreadInfo + arm_func_end CPS_SocRelease + + arm_func_start CPS_SocDup +CPS_SocDup: ; 0x020A6984 + ldr r1, _020A6998 ; =OSi_ThreadInfo + ldr r1, [r1, #4] + ldr r1, [r1, #0xa4] + str r1, [r0, #0xa4] + bx lr + .align 2, 0 +_020A6998: .word OSi_ThreadInfo + arm_func_end CPS_SocDup + + arm_func_start CPSi_TcpListenRaw +CPSi_TcpListenRaw: ; 0x020A699C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl get_seqno + str r0, [r5, #0x28] + str r0, [r5, #0x30] + mov r0, #1 + strb r0, [r5, #8] + bl OS_DisableInterrupts + mov r4, r0 + mov r1, #1 + mov r0, #0 + str r1, [r5, #4] + bl OS_SleepThread + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + arm_func_end CPSi_TcpListenRaw + + arm_func_start CPS_SetUdpCallback +CPS_SetUdpCallback: ; 0x020A69DC + ldr r1, _020A69F4 ; =OSi_ThreadInfo + ldr r1, [r1, #4] + ldr r1, [r1, #0xa4] + cmp r1, #0 + strne r0, [r1, #0x38] + bx lr + .align 2, 0 +_020A69F4: .word OSi_ThreadInfo + arm_func_end CPS_SetUdpCallback + + arm_func_start CPS_TcpListen +CPS_TcpListen: ; 0x020A69F8 + stmdb sp!, {r3, lr} + ldr r0, _020A6A2C ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r0, [r0, #0xa4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldrb r1, [r0, #9] + cmp r1, #0 + beq _020A6A24 + bl CPSi_SslListen + ldmia sp!, {r3, pc} +_020A6A24: + bl CPSi_TcpListenRaw + ldmia sp!, {r3, pc} + .align 2, 0 +_020A6A2C: .word OSi_ThreadInfo + arm_func_end CPS_TcpListen + + arm_func_start CPSi_TcpConnectRaw +CPSi_TcpConnectRaw: ; 0x020A6A30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl get_seqno + mov r6, #2 + ldr r4, _020A6AE0 ; =_021D4620 + mov r8, r0 + mov r7, #0 + mov r5, #1 + mov fp, r6 +_020A6A54: + str r8, [sl, #0x28] + strb r6, [sl, #8] + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [sl, #0x10] + mov r0, sl + mov r1, fp + mov r2, #0x18 + bl tcp_send_handshake + bl OS_DisableInterrupts + mov sb, r0 + ldrb r0, [sl, #8] + cmp r0, #2 + bne _020A6AA8 + ldr r0, [r4, #0x50] + cmp r0, #0 + beq _020A6AA8 + mov r0, #0 + str r5, [sl, #4] + bl OS_SleepThread +_020A6AA8: + mov r0, sb + bl OS_RestoreInterrupts + ldrb r0, [sl, #8] + cmp r0, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #0x50] + cmp r0, #0 + beq _020A6AD8 + add r7, r7, #1 + cmp r7, #3 + blo _020A6A54 +_020A6AD8: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A6AE0: .word _021D4620 + arm_func_end CPSi_TcpConnectRaw + + arm_func_start CPS_TcpConnect +CPS_TcpConnect: ; 0x020A6AE4 + stmdb sp!, {r3, lr} + ldr r0, _020A6B20 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r0, [r0, #0xa4] + cmp r0, #0 + beq _020A6B18 + ldrb r1, [r0, #9] + cmp r1, #0 + beq _020A6B10 + bl CPSi_SslConnect + ldmia sp!, {r3, pc} +_020A6B10: + bl CPSi_TcpConnectRaw + ldmia sp!, {r3, pc} +_020A6B18: + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A6B20: .word OSi_ThreadInfo + arm_func_end CPS_TcpConnect + + arm_func_start CPS_SocWho +CPS_SocWho: ; 0x020A6B24 + ldr r2, _020A6B70 ; =OSi_ThreadInfo + ldr r2, [r2, #4] + ldr r3, [r2, #0xa4] + cmp r3, #0 + beq _020A6B68 + ldrb r2, [r3, #8] + cmp r2, #4 + cmpne r2, #0xa + bne _020A6B68 + cmp r0, #0 + ldrneh r2, [r3, #0x18] + strneh r2, [r0] + cmp r1, #0 + ldrne r0, [r3, #0x14] + strne r0, [r1] + ldr r0, [r3, #0x1c] + bx lr +_020A6B68: + mov r0, #0 + bx lr + .align 2, 0 +_020A6B70: .word OSi_ThreadInfo + arm_func_end CPS_SocWho + + arm_func_start CPSi_TcpShutdownRaw +CPSi_TcpShutdownRaw: ; 0x020A6B74 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_YieldThread + ldrb r1, [r4, #8] + add r0, r1, #0xfd + and r0, r0, #0xff + cmp r0, #1 + bhi _020A6BAC + mov r0, r4 + mov r1, #0x19 + bl tcp_send_finack + mov r0, #7 + strb r0, [r4, #8] + ldmia sp!, {r4, pc} +_020A6BAC: + cmp r1, #0 + ldmeqia sp!, {r4, pc} + mov r0, r4 + mov r1, #0x1a + bl tcp_send_ack + ldmia sp!, {r4, pc} + arm_func_end CPSi_TcpShutdownRaw + + arm_func_start CPS_TcpShutdown +CPS_TcpShutdown: ; 0x020A6BC4 + stmdb sp!, {r4, lr} + ldr r0, _020A6BFC ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r4, [r0, #0xa4] + cmp r4, #0 + ldmeqia sp!, {r4, pc} + ldrb r0, [r4, #9] + cmp r0, #0 + beq _020A6BF0 + mov r0, r4 + bl CPSi_SslShutdown +_020A6BF0: + mov r0, r4 + bl CPSi_TcpShutdownRaw + ldmia sp!, {r4, pc} + .align 2, 0 +_020A6BFC: .word OSi_ThreadInfo + arm_func_end CPS_TcpShutdown + + arm_func_start CPS_TcpClose +CPS_TcpClose: ; 0x020A6C00 + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _020A6C80 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r4, [r0, #0xa4] + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + ldrb r0, [r4, #9] + cmp r0, #0 + beq _020A6C2C + mov r0, r4 + bl CPSi_SslClose +_020A6C2C: + bl OS_GetTick + mov r6, r0, lsr #0x10 + orr r6, r6, r1, lsl #16 + ldr r5, _020A6C84 ; =_021D4620 + b _020A6C44 +_020A6C40: + bl OS_YieldThread__ +_020A6C44: + ldr r0, [r5, #0x48] + blx r0 + cmp r0, #0 + ldrneb r0, [r4, #8] + cmpne r0, #0 + beq _020A6C74 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r6 + cmp r0, #0x27 + blt _020A6C40 +_020A6C74: + mov r0, #0 + strb r0, [r4, #8] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A6C80: .word OSi_ThreadInfo +_020A6C84: .word _021D4620 + arm_func_end CPS_TcpClose + + arm_func_start udp_read_raw +udp_read_raw: ; 0x020A6C88 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r1 + mov sb, r0 + bl OS_DisableInterrupts + ldr r6, [r8, #0x44] + mov r7, r0 + cmp r6, #0 + bne _020A6CC8 + mov r5, #3 + mov r4, #0 +_020A6CB0: + mov r0, r4 + str r5, [r8, #4] + bl OS_SleepThread + ldr r6, [r8, #0x44] + cmp r6, #0 + beq _020A6CB0 +_020A6CC8: + mov r0, r7 + bl OS_RestoreInterrupts + str r6, [sb] + ldr r0, [r8, #0x40] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end udp_read_raw + + arm_func_start CPSi_TcpReadRaw +CPSi_TcpReadRaw: ; 0x020A6CDC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r4, r1 + ldr r1, [r4, #0x44] + mov r5, r0 + cmp r1, #0 + ldreqb r0, [r4, #8] + cmpeq r0, #4 + bne _020A6D3C + bl OS_DisableInterrupts + mov r8, r0 + mov r7, #2 + mov r6, #0 + b _020A6D1C +_020A6D10: + mov r0, r6 + str r7, [r4, #4] + bl OS_SleepThread +_020A6D1C: + ldr r0, [r4, #0x44] + cmp r0, #0 + ldreqb r0, [r4, #8] + cmpeq r0, #4 + beq _020A6D10 + mov r0, r8 + bl OS_RestoreInterrupts + b _020A6D40 +_020A6D3C: + bl OS_YieldThread +_020A6D40: + ldr r0, [r4, #0x44] + str r0, [r5] + cmp r0, #0 + ldrne r0, [r4, #0x40] + moveq r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end CPSi_TcpReadRaw + + arm_func_start CPS_SocRead +CPS_SocRead: ; 0x020A6D58 + stmdb sp!, {r3, lr} + ldr r1, _020A6DB8 ; =OSi_ThreadInfo + ldr r1, [r1, #4] + ldr r1, [r1, #0xa4] + cmp r1, #0 + beq _020A6DA8 + ldrb r2, [r1, #8] + add r2, r2, #0xf6 + and r2, r2, #0xff + cmp r2, #1 + bhi _020A6D8C + bl udp_read_raw + ldmia sp!, {r3, pc} +_020A6D8C: + ldrb r2, [r1, #9] + cmp r2, #0 + beq _020A6DA0 + bl CPSi_SslRead + ldmia sp!, {r3, pc} +_020A6DA0: + bl CPSi_TcpReadRaw + ldmia sp!, {r3, pc} +_020A6DA8: + mov r1, #0 + str r1, [r0] + mov r0, r1 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A6DB8: .word OSi_ThreadInfo + arm_func_end CPS_SocRead + + arm_func_start CPSi_SocConsumeRaw +CPSi_SocConsumeRaw: ; 0x020A6DBC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + mov r7, r0 + bl OS_DisableInterrupts + ldr r2, [r4, #0x44] + ldr r1, [r4, #0x3c] + mov r5, r0 + cmp r2, r1 + mov r6, #0 + bne _020A6DEC + cmp r7, #0 + movne r6, #1 +_020A6DEC: + cmp r7, r2 + movhs r0, #0 + strhs r0, [r4, #0x44] + bhs _020A6E10 + ldr r0, [r4, #0x40] + sub r2, r2, r7 + add r1, r0, r7 + str r2, [r4, #0x44] + bl memmove +_020A6E10: + mov r0, r5 + bl OS_RestoreInterrupts + ldrb r0, [r4, #8] + cmp r0, #0xa + cmpne r0, #0xb + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0x44] + cmp r0, #0 + beq _020A6E3C + cmp r6, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020A6E3C: + mov r0, r4 + mov r1, #0x1b + bl tcp_send_ack + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CPSi_SocConsumeRaw + + arm_func_start CPS_SocConsume +CPS_SocConsume: ; 0x020A6E4C + stmdb sp!, {r3, lr} + ldr r1, _020A6E80 ; =OSi_ThreadInfo + ldr r1, [r1, #4] + ldr r1, [r1, #0xa4] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + ldrb r2, [r1, #9] + cmp r2, #0 + beq _020A6E78 + bl CPSi_SslConsume + ldmia sp!, {r3, pc} +_020A6E78: + bl CPSi_SocConsumeRaw + ldmia sp!, {r3, pc} + .align 2, 0 +_020A6E80: .word OSi_ThreadInfo + arm_func_end CPS_SocConsume + + arm_func_start tcp_write_do +tcp_write_do: ; 0x020A6E84 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r8, r2 + ldr r6, [r8, #0x34] + movs fp, r3 + mov sl, r0 + movne r5, #1 + mov r0, r6, lsl #1 + mov sb, r1 + ldreqh r5, [r8, #0x2c] + add r7, r0, #4 + b _020A6F28 +_020A6EB0: + ldr r0, _020A6F44 ; =_021D4620 + ldrh r4, [r8, #0x2e] + ldrh r0, [r0, #2] + ldr r1, [r8, #0x34] + cmp r4, r5 + movhs r4, r5 + cmp r0, r4 + movlo r4, r0 + cmp fp, #0 + biceq r4, r4, #1 + cmp sb, r4 + sub r0, r1, r6 + movlo r4, sb + adds r0, r7, r0 + moveq r4, #0 + mov r6, r1 + sub r7, r0, #1 + cmp r4, #0 + beq _020A6F3C + mov r2, #0 + str r2, [sp] + mov r0, sl + mov r1, r4 + mov r2, r8 + mov r3, #0x18 + sub r5, r5, r4 + bl send_tcp + bl OS_YieldThread + add sl, sl, r4 + sub sb, sb, r4 +_020A6F28: + cmp sb, #0 + beq _020A6F3C + ldrb r0, [r8, #8] + cmp r0, #4 + beq _020A6EB0 +_020A6F3C: + mov r0, r4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A6F44: .word _021D4620 + arm_func_end tcp_write_do + + arm_func_start tcp_write_do2 +tcp_write_do2: ; 0x020A6F48 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r2 + mov r4, r3 + ldr r2, [sp, #0x10] + ldr r3, [sp, #0x14] + bl tcp_write_do + cmp r0, #0 + cmpne r4, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r2, [sp, #0x10] + mov r0, r5 + mov r1, r4 + mov r3, #0 + bl tcp_write_do + ldmia sp!, {r3, r4, r5, pc} + arm_func_end tcp_write_do2 + + arm_func_start CPSi_TcpWrite2Raw +CPSi_TcpWrite2Raw: ; 0x020A6F84 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + mov r4, #0 + mov fp, r0 + ldr r8, [sp, #0x38] + mov r0, r4 + str r4, [sp, #0x10] + mov sl, r1 + mov sb, r2 + str r3, [sp, #8] + mov r6, r4 + str r0, [r8, #0x34] + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [sp, #0xc] + b _020A713C +_020A6FC8: + ldr r7, [r8, #0x28] + ldr r3, [sp, #8] + str r8, [sp] + mov r0, fp + mov r1, sl + mov r2, sb + str r6, [sp, #4] + bl tcp_write_do2 + bl OS_GetTick + mov r5, r0, lsr #0x10 + ldr r4, _020A7188 ; =_021D4620 + orr r5, r5, r1, lsl #16 +_020A6FF8: + bl OS_YieldThread__ + ldr r0, [r4, #0x48] + blx r0 + cmp r0, #0 + beq _020A7050 + ldrb r0, [r8, #8] + cmp r0, #4 + bne _020A7050 + ldr r1, [r8, #0x28] + ldr r0, [r8, #0x30] + cmp r1, r0 + beq _020A7050 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r5 + cmp r0, #0xf + bge _020A7050 + cmp r6, #0 + ldrneh r0, [r8, #0x2c] + cmpne r0, #0 + beq _020A6FF8 +_020A7050: + ldr r1, [r8, #0x30] + ldr r0, [r8, #0x28] + sub r5, r1, r7 + sub r0, r0, r7 + cmp r5, r0 + movhi r5, #0 + ldr r0, [sp, #0x10] + cmp r5, #0 + add r0, r0, r5 + str r0, [sp, #0x10] + beq _020A708C + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [sp, #0xc] +_020A708C: + ldr r0, [r8, #0x30] + str r0, [r8, #0x28] + ldrb r0, [r8, #8] + cmp r0, #4 + ldreqh r0, [r8, #0x2c] + cmpeq r0, #0 + cmpeq r5, #0 + bne _020A7110 + cmp r6, #0 + bne _020A7114 + bl OS_GetTick + mov r7, r0, lsr #0x10 + orr r7, r7, r1, lsl #16 + ldr r4, _020A7188 ; =_021D4620 + b _020A70D8 +_020A70C8: + bl OS_YieldThread__ + ldrh r0, [r8, #0x2c] + cmp r0, #0 + bne _020A7100 +_020A70D8: + ldr r0, [r4, #0x48] + blx r0 + cmp r0, #0 + beq _020A7100 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r7 + cmp r0, #0xf + blt _020A70C8 +_020A7100: + ldrh r0, [r8, #0x2c] + cmp r0, #0 + moveq r6, #1 + b _020A7114 +_020A7110: + mov r6, #0 +_020A7114: + cmp r5, sl + addlo fp, fp, r5 + sublo sl, sl, r5 + blo _020A713C + sub r1, r5, sl + ldr r0, [sp, #8] + add fp, sb, r1 + mov sb, #0 + sub sl, r0, r1 + str sb, [sp, #8] +_020A713C: + ldr r0, _020A7188 ; =_021D4620 + ldr r0, [r0, #0x48] + blx r0 + cmp r0, #0 + cmpne sl, #0 + beq _020A717C + ldrb r0, [r8, #8] + cmp r0, #4 + bne _020A717C + bl OS_GetTick + mov r2, r0, lsr #0x10 + ldr r0, [sp, #0xc] + orr r2, r2, r1, lsl #16 + sub r0, r2, r0 + cmp r0, #0x9f + blt _020A6FC8 +_020A717C: + ldr r0, [sp, #0x10] + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A7188: .word _021D4620 + arm_func_end CPSi_TcpWrite2Raw + + arm_func_start CPSi_SocWrite2 +CPSi_SocWrite2: ; 0x020A718C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr ip, _020A7258 ; =OSi_ThreadInfo + mov r7, r1 + ldr ip, [ip, #4] + mov r6, r2 + ldr r4, [ip, #0xa4] + mov r5, r3 + cmp r4, #0 + beq _020A7250 + ldrb ip, [r4, #8] + cmp ip, #0xa + bne _020A71EC + cmp r7, #0 + beq _020A71CC + mov r2, r4 + bl send_udp +_020A71CC: + cmp r5, #0 + beq _020A71E4 + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl send_udp +_020A71E4: + add r0, r7, r5 + b _020A7240 +_020A71EC: + cmp ip, #0xb + bne _020A7224 + cmp r7, #0 + beq _020A7204 + mov r2, r4 + bl send_ping +_020A7204: + cmp r5, #0 + beq _020A721C + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl send_ping +_020A721C: + add r0, r7, r5 + b _020A7240 +_020A7224: + ldrb ip, [r4, #9] + cmp ip, #0 + str r4, [sp] + beq _020A723C + bl CPSi_SslWrite2 + b _020A7240 +_020A723C: + bl CPSi_TcpWrite2Raw +_020A7240: + ldr r1, _020A725C ; =_021D4620 + ldrb r1, [r1] + cmp r1, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_020A7250: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A7258: .word OSi_ThreadInfo +_020A725C: .word _021D4620 + arm_func_end CPSi_SocWrite2 + + arm_func_start CPS_SocWrite +CPS_SocWrite: ; 0x020A7260 + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _020A72F4 ; =OSi_ThreadInfo + mov r2, r0 + ldr r4, [r3, #4] + mov r3, r1 + ldr r5, [r4, #0xa4] + cmp r5, #0 + beq _020A72EC + ldr r4, [r5, #0x60] + cmp r4, #0 + beq _020A72DC + ldr r0, [r5, #0x5c] + mov r1, r4 + bl CPSi_SocWrite2 + ldr r1, [r5, #0x60] + mov r4, r0 + cmp r4, r1 + bhs _020A72CC + ldr r0, [r5, #0x5c] + sub r2, r1, r4 + add r1, r0, r4 + bl memmove + ldr r1, [r5, #0x60] + mov r0, #0 + sub r1, r1, r4 + str r1, [r5, #0x60] + ldmia sp!, {r3, r4, r5, pc} +_020A72CC: + mov r0, #0 + str r0, [r5, #0x60] + sub r0, r4, r1 + ldmia sp!, {r3, r4, r5, pc} +_020A72DC: + mov r2, #0 + mov r3, r2 + bl CPSi_SocWrite2 + ldmia sp!, {r3, r4, r5, pc} +_020A72EC: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A72F4: .word OSi_ThreadInfo + arm_func_end CPS_SocWrite + + arm_func_start CPS_SocGetLength +CPS_SocGetLength: ; 0x020A72F8 + stmdb sp!, {r3, lr} + ldr r0, _020A7364 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r0, [r0, #0xa4] + cmp r0, #0 + beq _020A735C + ldrb r1, [r0, #9] + cmp r1, #0 + beq _020A7324 + bl CPSi_SslGetLength + ldmia sp!, {r3, pc} +_020A7324: + ldr r1, [r0, #0x44] + cmp r1, #0 + bne _020A734C + ldrb r0, [r0, #8] + cmp r0, #4 + beq _020A734C + add r0, r0, #0xf6 + and r0, r0, #0xff + cmp r0, #1 + bhi _020A7354 +_020A734C: + mov r0, r1 + ldmia sp!, {r3, pc} +_020A7354: + mvn r0, #0 + ldmia sp!, {r3, pc} +_020A735C: + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020A7364: .word OSi_ThreadInfo + arm_func_end CPS_SocGetLength + + arm_func_start CPS_SocFlush +CPS_SocFlush: ; 0x020A7368 + stmdb sp!, {r4, lr} + ldr r0, _020A73A4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r4, [r0, #0xa4] + cmp r4, #0 + ldrne r1, [r4, #0x60] + cmpne r1, #0 + ldmeqia sp!, {r4, pc} + mov r2, #0 + ldr r0, [r4, #0x5c] + mov r3, r2 + bl CPSi_SocWrite2 + mov r0, #0 + str r0, [r4, #0x60] + ldmia sp!, {r4, pc} + .align 2, 0 +_020A73A4: .word OSi_ThreadInfo + arm_func_end CPS_SocFlush + + arm_func_start set_fixed_ip +set_fixed_ip: ; 0x020A73A8 + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _020A7444 ; =_021D4620 + ldr r0, [r0, #0x18] + blx r0 + ldr r0, _020A7444 ; =_021D4620 + ldr r0, [r0, #0x50] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl send_arprequest + mov r0, #0x64 + bl OS_Sleep + ldr r0, _020A7444 ; =_021D4620 + ldr r0, [r0, #0x50] + bl send_arprequest + bl OS_GetTick + mov r6, r0, lsr #0x10 + orr r6, r6, r1, lsl #16 + mov r5, #0x64 + ldr r4, _020A7444 ; =_021D4620 + b _020A7418 +_020A73F8: + ldrb r0, [r4, #1] + cmp r0, #0 + beq _020A7410 + mov r0, #4 + bl reset_network_vars + ldmia sp!, {r4, r5, r6, pc} +_020A7410: + mov r0, r5 + bl OS_Sleep +_020A7418: + ldr r0, [r4, #0x48] + blx r0 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r6 + cmp r0, #0x17 + blt _020A73F8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020A7444: .word _021D4620 + arm_func_end set_fixed_ip + + arm_func_start scavenger +scavenger: ; 0x020A7448 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r3, _020A7798 ; =_021D4620 + mov r1, #0 + ldr r0, _020A779C ; =_021D4700 + mov r2, #0x64 + str r1, [r3, #0x44] + bl MI_CpuFill8 + ldr r1, _020A7798 ; =_021D4620 + mov r3, #0x180 + ldr r0, _020A77A0 ; =_021D4CCC + str r3, [r1, #0x11c] + str r0, [r1, #0x120] + ldr r2, _020A77A4 ; =_021D4B4C + str r3, [r1, #0x128] + ldr r0, _020A779C ; =_021D4700 + str r2, [r1, #0x12c] + bl CPS_SocRegister + mov sl, #1 + ldr r0, _020A7798 ; =_021D4620 + mov fp, sl + str sl, [sp] + str sl, [r0, #0xc] + mov r4, #0 +_020A74A4: + mov r0, #0x3e8 + bl OS_Sleep + ldr r0, _020A7798 ; =_021D4620 + ldr r1, [r0, #0x44] + cmp r1, #0 + bne _020A7778 + bl OS_GetTick + ldr r2, _020A7798 ; =_021D4620 + mov r5, r0, lsr #0x10 + ldr r0, [r2, #0x48] + orr r5, r5, r1, lsl #16 + blx r0 + cmp r0, #0 + beq _020A75D0 + ldr r0, [sp] + subs r0, r0, #1 + str r0, [sp] + bne _020A75E4 + ldr r0, _020A7798 ; =_021D4620 + ldr r1, [r0, #0x10] + tst r1, #1 + beq _020A7510 + cmp r4, #0 + bne _020A75E4 + bl set_fixed_ip + mov r4, #1 + b _020A75E4 +_020A7510: + cmp r4, #3 + addls pc, pc, r4, lsl #2 + b _020A75E4 +_020A751C: ; jump table + b _020A752C ; case 0 + b _020A7570 ; case 1 + b _020A7594 ; case 2 + b _020A75E4 ; case 3 +_020A752C: + cmp fp, #0 + movne r1, #2 + strne r1, [r0, #0xc] + movne fp, #0 + bl dhcp_discover_server + cmp r0, #0 + beq _020A755C + add r0, sp, #0 + mov r1, #0 + bl dhcp_request_server + cmp r0, #0 + bne _020A7568 +_020A755C: + bl set_fixed_ip + mov r4, #3 + b _020A75E4 +_020A7568: + mov r4, #1 + b _020A75E4 +_020A7570: + add r0, sp, #0 + mov r1, #1 + bl dhcp_request_server + cmp r0, #0 + bne _020A75E4 + ldr r0, [sp] + cmp r0, #0x3c + movlo r4, #2 + b _020A75E4 +_020A7594: + add r0, sp, #0 + mov r1, #2 + bl dhcp_request_server + cmp r0, #0 + movne r4, #1 + bne _020A75E4 + ldr r0, [sp] + cmp r0, #0x3c + bhs _020A75E4 + mov r0, #3 + bl reset_network_vars + mov sl, #1 + str sl, [sp] + mov r4, #0 + b _020A75E4 +_020A75D0: + mov r0, #1 + bl reset_network_vars + mov sl, #1 + str sl, [sp] + mov r4, #0 +_020A75E4: + mov r3, #0 + ldr r6, _020A77A8 ; =_021D46A0 + ldr r1, _020A77AC ; =0x000003BD + mov r2, r3 +_020A75F4: + ldr r0, [r6] + cmp r0, #0 + beq _020A7614 + ldrh r0, [r6, #0xa] + sub r0, r5, r0 + mov r0, r0, lsl #0x10 + cmp r1, r0, asr #16 + strlt r2, [r6] +_020A7614: + add r3, r3, #1 + cmp r3, #8 + add r6, r6, #0xc + blt _020A75F4 + ldr r0, _020A7798 ; =_021D4620 + ldr r0, [r0, #0x2c] + cmp r0, #0 + beq _020A7644 + subs sl, sl, #1 + bne _020A7644 + bl send_arprequest + mov sl, #0x69 +_020A7644: + ldr r0, _020A77B0 ; =OSi_ThreadInfo + ldr sb, [r0, #8] + cmp sb, #0 + beq _020A770C + mov r6, #0 + mov r7, r6 + mov r8, #1 +_020A7660: + ldr r0, [sb, #0xa4] + cmp r0, #0 + ldrne r1, [r0] + cmpne r1, #0 + beq _020A7700 + ldrb r1, [r0, #8] + cmp r1, #3 + bne _020A76A8 + ldr r2, [r0, #0x10] + sub r2, r5, r2 + cmp r2, #0x27 + ble _020A76A8 + strb r8, [r0, #8] + ldrh r1, [r0, #0x1a] + strh r1, [r0, #0x18] + ldr r1, [r0, #0x20] + str r1, [r0, #0x1c] + b _020A7700 +_020A76A8: + cmp r1, #2 + bne _020A76E0 + ldr r2, [r0, #0x10] + sub r2, r5, r2 + cmp r2, #0x27 + ble _020A76E0 + ldr r1, [r0, #4] + cmp r1, #1 + bne _020A7700 + strb r7, [r0, #8] + str r7, [r0, #4] + ldr r0, [r0] + bl OS_WakeupThreadDirect + b _020A7700 +_020A76E0: + cmp r1, #4 + beq _020A7700 + ldr r1, [r0, #4] + cmp r1, #2 + bne _020A7700 + str r6, [r0, #4] + ldr r0, [r0] + bl OS_WakeupThreadDirect +_020A7700: + ldr sb, [sb, #0x68] + cmp sb, #0 + bne _020A7660 +_020A770C: + mov sb, #0 + ldr r8, _020A77B4 ; =_021D4948 + ldr r6, _020A7798 ; =_021D4620 + mov r7, sb +_020A771C: + ldrh r0, [r8, #4] + cmp r0, #0 + beq _020A7748 + ldr r0, [r8, #0x2c] + sub r0, r5, r0 + cmp r0, #0xef + ble _020A7748 + ldr r0, [r8, #0x34] + ldr r1, [r6, #0x40] + blx r1 + strh r7, [r8, #4] +_020A7748: + add sb, sb, #1 + cmp sb, #8 + add r8, r8, #0x38 + blt _020A771C + mov r0, r5 + bl CPSi_SslPeriodical + ldr r0, _020A7798 ; =_021D4620 + ldr r0, [r0, #0x3c] + cmp r0, #0 + beq _020A74A4 + blx r0 + b _020A74A4 +_020A7778: + ldr r0, [r0, #0x10] + tst r0, #1 + bne _020A7790 + cmp r4, #3 + beq _020A7790 + bl dhcp_release_server +_020A7790: + bl CPS_SocUnRegister + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A7798: .word _021D4620 +_020A779C: .word _021D4700 +_020A77A0: .word _021D4CCC +_020A77A4: .word _021D4B4C +_020A77A8: .word _021D46A0 +_020A77AC: .word 0x000003BD +_020A77B0: .word OSi_ThreadInfo +_020A77B4: .word _021D4948 + arm_func_end scavenger + + arm_func_start dhcp_setcommon +dhcp_setcommon: ; 0x020A77B8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r1 + mov r4, r2 + mov r1, #0 + mov r2, #0xec + mov r6, r0 + bl MI_CpuFill8 + ldr r0, _020A7928 ; =0x00000101 + mov r1, #6 + strh r0, [r6] + ldr r0, _020A792C ; =_021D4620 + strb r1, [r6, #2] + ldr r3, [r0, #0x70] + ldr r2, [r0, #0x68] + ldr r1, [r0, #0x6c] + umull lr, ip, r3, r2 + mla ip, r3, r1, ip + ldr r1, [r0, #0x74] + ldr r7, [r0, #0x78] + mla ip, r1, r2, ip + ldr r3, [r0, #0x7c] + adds r7, r7, lr + adc r1, r3, ip + str r7, [r0, #0x68] + str r1, [r0, #0x6c] + mov r0, r1, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r3, r0, lsr #0x10 + cmp r4, #0 + mov r2, r3, lsl #8 + mov r0, r1, lsl #0x10 + strne r1, [r4] + mov r1, r0, lsr #0x10 + orr r2, r2, r3, asr #8 + mov r0, r1, lsl #8 + strh r2, [r6, #4] + orr r0, r0, r1, asr #8 + strh r0, [r6, #6] + ldr r2, _020A792C ; =_021D4620 + ldr r0, _020A7930 ; =_021D4B08 + ldr r1, [r2, #0x50] + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r3, r1, lsr #0x10 + mov r1, r3, lsl #8 + orr r1, r1, r3, asr #8 + strh r1, [r6, #0xc] + ldr r2, [r2, #0x50] + add r1, r6, #0x1c + mov r2, r2, lsl #0x10 + mov r3, r2, lsr #0x10 + mov r2, r3, lsl #8 + orr r3, r2, r3, asr #8 + mov r2, #6 + strh r3, [r6, #0xe] + bl MI_CpuCopy8 + ldr r0, _020A7934 ; =0x00008263 + ldr r1, _020A7938 ; =0x00006353 + strh r0, [r6, #0xec] + strh r1, [r6, #0xee] + ldr r0, _020A793C ; =0x00000135 + mov r1, #7 + strh r0, [r6, #0xf0] + strb r5, [r6, #0xf2] + mov r0, #0x3d + strb r0, [r6, #0xf3] + strb r1, [r6, #0xf4] + mov r3, #1 + ldr r0, _020A7930 ; =_021D4B08 + add r1, r6, #0xf6 + mov r2, #6 + strb r3, [r6, #0xf5] + bl MI_CpuCopy8 + mov r1, #0xc + strb r1, [r6, #0xfc] + mov r2, #0xa + ldr r0, _020A7940 ; =_0211069C + add r1, r6, #0xfe + strb r2, [r6, #0xfd] + bl MI_CpuCopy8 + mov r1, #0x37 + strb r1, [r6, #0x108] + mov r2, #3 + add r0, r6, #0xd + strb r2, [r6, #0x109] + mov r1, #1 + strb r1, [r6, #0x10a] + strb r2, [r6, #0x10b] + mov r1, #6 + strb r1, [r6, #0x10c] + add r0, r0, #0x100 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A7928: .word 0x00000101 +_020A792C: .word _021D4620 +_020A7930: .word _021D4B08 +_020A7934: .word 0x00008263 +_020A7938: .word 0x00006353 +_020A793C: .word 0x00000135 +_020A7940: .word _0211069C + arm_func_end dhcp_setcommon + + arm_func_start pad_mem +pad_mem: ; 0x020A7944 + stmdb sp!, {r3, r4, r5, lr} + mov ip, r0 + mov r5, r2 + cmp r3, r1 + bhs _020A7970 + sub r4, r1, r3 + mov r0, r5 + mov r1, ip + mov r2, r4 + bl MI_CpuFill8 + add r5, r5, r4 +_020A7970: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end pad_mem + + arm_func_start dhcp_send_discover +dhcp_send_discover: ; 0x020A7978 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r4, _020A7A34 ; =_021D4B76 + add r2, sp, #0 + mov r0, r4 + mov r1, #1 + bl dhcp_setcommon + ldr r1, _020A7A38 ; =_021D4620 + mov ip, r0 + ldr r0, [r1, #0x34] + cmp r0, #0 + beq _020A79FC + mov r0, #0x32 + strb r0, [ip] + mov r0, #4 + strb r0, [ip, #1] + ldr r0, [r1, #0x34] + mov r0, r0, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r0, r0, asr #8 + strb r0, [ip, #2] + ldr r0, [r1, #0x34] + mov r0, r0, lsr #0x10 + strb r0, [ip, #3] + ldr r0, [r1, #0x34] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r0, r0, asr #8 + strb r0, [ip, #4] + ldr r0, [r1, #0x34] + strb r0, [ip, #5] + add ip, ip, #6 +_020A79FC: + add r2, ip, #1 + mov lr, #0xff + sub r3, r2, r4 + mov r0, #0 + mov r1, #0x12c + strb lr, [ip] + bl pad_mem + mov r1, r0 + mov r0, r4 + sub r1, r1, r4 + bl CPS_SocWrite + ldr r0, [sp] + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020A7A34: .word _021D4B76 +_020A7A38: .word _021D4620 + arm_func_end dhcp_send_discover + + arm_func_start dhcp_send_request +dhcp_send_request: ; 0x020A7A3C + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _020A7B3C ; =_021D4B76 + mov r5, r0 + add r2, sp, #0 + mov r0, r4 + mov r1, #3 + bl dhcp_setcommon + mov ip, r0 + cmp r5, #0 + bne _020A7B08 + mov r0, #0x32 + strb r0, [ip] + mov r0, #4 + ldr r2, _020A7B40 ; =_021D4620 + strb r0, [ip, #1] + ldr r1, [r2, #0x34] + mov r3, #0x36 + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r1, r1, asr #8 + strb r1, [ip, #2] + ldr r1, [r2, #0x34] + mov r1, r1, lsr #0x10 + strb r1, [ip, #3] + ldr r1, [r2, #0x34] + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + mov r1, r1, asr #8 + strb r1, [ip, #4] + ldr r1, [r2, #0x34] + strb r1, [ip, #5] + strb r3, [ip, #6] + strb r0, [ip, #7] + ldr r0, [r2, #0x20] + mov r0, r0, lsr #0x10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r0, r0, asr #8 + strb r0, [ip, #8] + ldr r0, [r2, #0x20] + mov r0, r0, lsr #0x10 + strb r0, [ip, #9] + ldr r0, [r2, #0x20] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r0, r0, asr #8 + strb r0, [ip, #0xa] + ldr r0, [r2, #0x20] + strb r0, [ip, #0xb] + add ip, ip, #0xc +_020A7B08: + add r2, ip, #1 + mov lr, #0xff + sub r3, r2, r4 + mov r0, #0 + mov r1, #0x12c + strb lr, [ip] + bl pad_mem + mov r1, r0 + mov r0, r4 + sub r1, r1, r4 + bl CPS_SocWrite + ldr r0, [sp] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A7B3C: .word _021D4B76 +_020A7B40: .word _021D4620 + arm_func_end dhcp_send_request + + arm_func_start dhcp_analyze_response +dhcp_analyze_response: ; 0x020A7B44 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + add r1, r1, #1 + str r0, [sp] + rsb fp, r1, r1, lsl #4 + bl OS_GetTick + mov r4, r0, lsr #0x10 + orr r4, r4, r1, lsl #16 + mov r5, #0 + b _020A7E4C +_020A7B6C: + bl CPS_SocGetLength + cmp r0, #0 + bne _020A7B80 + bl OS_YieldThread__ + b _020A7E4C +_020A7B80: + add r0, sp, #4 + bl CPS_SocRead + ldr r1, [sp, #4] + mov r6, r0 + cmp r1, #0xf0 + bls _020A7E44 + ldrb r0, [r6] + cmp r0, #2 + bne _020A7E44 + ldrh r3, [r6, #6] + ldrh r2, [r6, #4] + mov r0, r3, lsl #8 + mov r1, r2, lsl #8 + orr r2, r1, r2, asr #8 + orr r1, r0, r3, asr #8 + mov r0, r2, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r1, r0, r2, lsl #16 + ldr r0, [sp] + cmp r0, r1 + bne _020A7E44 + ldr r1, _020A7E8C ; =_021D4B08 + add r0, r6, #0x1c + bl maccmp + cmp r0, #0 + bne _020A7E44 + ldrb r3, [r6, #0x10] + ldrb r2, [r6, #0x11] + ldrb r1, [r6, #0x12] + ldrb r0, [r6, #0x13] + orr r3, r2, r3, lsl #8 + ldrb r2, [r6, #0xec] + orr r1, r0, r1, lsl #8 + mov r0, r3, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r5, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + cmp r2, #0x63 + orr r2, r0, r5, lsl #16 + ldreqb r0, [r6, #0xed] + ldr r3, [sp, #4] + mov r5, #3 + cmpeq r0, #0x82 + ldreqb r0, [r6, #0xee] + add r1, r6, r3 + cmpeq r0, #0x53 + ldreqb r0, [r6, #0xef] + addeq r3, r6, #0xf0 + cmpeq r0, #0x63 + bne _020A7E44 + mov r0, #0 + mov sb, #2 + mov sl, #1 + ldr ip, _020A7E90 ; =_021D4620 + b _020A7E30 +_020A7C64: + cmp r6, #0 + beq _020A7E30 + cmp r6, #0x33 + bgt _020A7CA0 + bge _020A7D98 + cmp r6, #6 + bgt _020A7E24 + cmp r6, #1 + blt _020A7E24 + beq _020A7CBC + cmp r6, #3 + beq _020A7CF0 + cmp r6, #6 + beq _020A7D24 + b _020A7E24 +_020A7CA0: + cmp r6, #0x35 + bgt _020A7CB0 + beq _020A7DCC + b _020A7E24 +_020A7CB0: + cmp r6, #0x36 + beq _020A7DF4 + b _020A7E24 +_020A7CBC: + ldrb lr, [r3, #1] + ldrb r8, [r3, #2] + ldrb r7, [r3, #3] + ldrb r6, [r3, #4] + orr r8, r8, lr, lsl #8 + mov r8, r8, lsl #0x10 + orr r6, r6, r7, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r8, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x1c] + b _020A7E24 +_020A7CF0: + ldrb lr, [r3, #1] + ldrb r8, [r3, #2] + ldrb r7, [r3, #3] + ldrb r6, [r3, #4] + orr r8, r8, lr, lsl #8 + mov r8, r8, lsl #0x10 + orr r6, r6, r7, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r8, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x2c] + b _020A7E24 +_020A7D24: + ldrb r6, [r3] + cmp r6, #8 + strlo r0, [ip, #0x64] + blo _020A7D64 + ldrb lr, [r3, #5] + ldrb r8, [r3, #6] + ldrb r7, [r3, #7] + ldrb r6, [r3, #8] + orr r8, r8, lr, lsl #8 + mov r8, r8, lsl #0x10 + orr r6, r6, r7, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r8, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x64] +_020A7D64: + ldrb lr, [r3, #1] + ldrb r8, [r3, #2] + ldrb r7, [r3, #3] + ldrb r6, [r3, #4] + orr r8, r8, lr, lsl #8 + mov r8, r8, lsl #0x10 + orr r6, r6, r7, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r8, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x60] + b _020A7E24 +_020A7D98: + ldrb lr, [r3, #1] + ldrb r8, [r3, #2] + ldrb r7, [r3, #3] + ldrb r6, [r3, #4] + orr r8, r8, lr, lsl #8 + mov r8, r8, lsl #0x10 + orr r6, r6, r7, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r8, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x4c] + b _020A7E24 +_020A7DCC: + ldrb r6, [r3, #1] + cmp r6, #2 + beq _020A7DE8 + cmp r6, #5 + moveq r5, sb + streq r2, [ip, #0x50] + b _020A7E24 +_020A7DE8: + mov r5, sl + str r2, [ip, #0x34] + b _020A7E24 +_020A7DF4: + ldrb r8, [r3, #1] + ldrb r7, [r3, #2] + ldrb r6, [r3, #3] + ldrb lr, [r3, #4] + orr r7, r7, r8, lsl #8 + mov r7, r7, lsl #0x10 + orr r6, lr, r6, lsl #8 + mov r6, r6, lsl #0x10 + mov r7, r7, lsr #0x10 + mov r6, r6, lsr #0x10 + orr r6, r6, r7, lsl #16 + str r6, [ip, #0x20] +_020A7E24: + ldrb r6, [r3] + add r6, r6, #1 + add r3, r3, r6 +_020A7E30: + cmp r3, r1 + bhs _020A7E44 + ldrb r6, [r3], #1 + cmp r6, #0xff + bne _020A7C64 +_020A7E44: + ldr r0, [sp, #4] + bl CPS_SocConsume +_020A7E4C: + ldr r0, _020A7E90 ; =_021D4620 + ldr r0, [r0, #0x48] + blx r0 + cmp r0, #0 + beq _020A7E80 + cmp r5, #0 + bne _020A7E80 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r4 + cmp r0, fp + blt _020A7B6C +_020A7E80: + mov r0, r5 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A7E8C: .word _021D4B08 +_020A7E90: .word _021D4620 + arm_func_end dhcp_analyze_response + + arm_func_start dhcp_discover_server +dhcp_discover_server: ; 0x020A7E94 + stmdb sp!, {r3, r4, r5, lr} + bl CPS_SocUse + bl CPS_SocDatagramMode + mov r1, #0x43 + sub r2, r1, #0x44 + mov r0, #0x44 + bl CPS_SocBind + mov r5, #0 +_020A7EB4: + bl dhcp_send_discover + mov r1, r5 + bl dhcp_analyze_response + mov r4, r0 + cmp r4, #1 + beq _020A7ED8 + add r5, r5, #1 + cmp r5, #4 + blt _020A7EB4 +_020A7ED8: + bl CPS_SocRelease + cmp r4, #1 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end dhcp_discover_server + + arm_func_start dhcp_request_server +dhcp_request_server: ; 0x020A7EEC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + mov r5, r0 + bl CPS_SocUse + bl CPS_SocDatagramMode + cmp r4, #1 + mov r0, #0x44 + bne _020A7F20 + ldr r1, _020A7FE4 ; =_021D4620 + ldr r2, [r1, #0x20] + mov r1, #0x43 + bl CPS_SocBind + b _020A7F2C +_020A7F20: + mov r1, #0x43 + sub r2, r1, #0x44 + bl CPS_SocBind +_020A7F2C: + mov r7, #0 +_020A7F30: + mov r0, r4 + bl dhcp_send_request + mov r1, r7 + bl dhcp_analyze_response + movs r6, r0 + bne _020A7F54 + add r7, r7, #1 + cmp r7, #4 + blt _020A7F30 +_020A7F54: + bl CPS_SocRelease + cmp r6, #2 + bne _020A7F88 + ldr r1, _020A7FE4 ; =_021D4620 + mov r0, #1 + ldr r2, [r1, #0x4c] + mov r2, r2, lsr #1 + str r2, [r5] + ldr r2, [r1, #0x4c] + add r2, r2, r2, lsl #1 + mov r2, r2, lsr #3 + str r2, [r1, #0x38] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020A7F88: + ldr r0, _020A7FE4 ; =_021D4620 + cmp r4, #1 + ldr r1, [r0, #0x38] + mov r1, r1, lsr #1 + str r1, [r0, #0x38] + str r1, [r5] + beq _020A7FB0 + cmp r4, #2 + beq _020A7FD0 + b _020A7FDC +_020A7FB0: + cmp r1, #0x3c + bhs _020A7FDC + mov r1, #1 + str r1, [r5] + ldr r1, [r0, #0x4c] + mov r1, r1, lsr #3 + str r1, [r0, #0x38] + b _020A7FDC +_020A7FD0: + cmp r1, #0x3c + movlo r0, #1 + strlo r0, [r5] +_020A7FDC: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A7FE4: .word _021D4620 + arm_func_end dhcp_request_server + + arm_func_start dhcp_release_server +dhcp_release_server: ; 0x020A7FE8 + stmdb sp!, {r4, lr} + bl CPS_SocUse + bl CPS_SocDatagramMode + ldr r1, _020A804C ; =_021D4620 + mov r0, #0x44 + ldr r2, [r1, #0x20] + mov r1, #0x43 + bl CPS_SocBind + ldr r4, _020A8050 ; =_021D4B76 + mov r1, #7 + mov r0, r4 + mov r2, #0 + bl dhcp_setcommon + mov r1, #0xff + add r2, r0, #1 + strb r1, [r0] + mov r0, #0 + mov r1, #0x12c + sub r3, r2, r4 + bl pad_mem + sub r1, r0, r4 + mov r0, r4 + bl CPS_SocWrite + bl CPS_SocRelease + ldmia sp!, {r4, pc} + .align 2, 0 +_020A804C: .word _021D4620 +_020A8050: .word _021D4B76 + arm_func_end dhcp_release_server + + arm_func_start dns_skipname +dns_skipname: ; 0x020A8054 + ldrb r2, [r0], #1 + cmp r2, #0 + bxeq lr +_020A8060: + and r1, r2, #0xc0 + cmp r1, #0xc0 + addeq r0, r0, #1 + bxeq lr + add r0, r0, r2 + ldrb r2, [r0], #1 + cmp r2, #0 + bne _020A8060 + bx lr + arm_func_end dns_skipname + + arm_func_start resolve_common +resolve_common: ; 0x020A8084 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + mov sb, r2 + mov r2, sb, lsl #8 + mov sl, r1 + orr r1, r2, sb, asr #8 + strh r1, [sp, #4] + cmp sl, #0x20 + mov r6, #0 + movne r1, #1 + strneh r1, [sp, #6] + ldreq r1, _020A8324 ; =0x00001001 + strh r6, [sp, #0xa] + streqh r1, [sp, #6] + mov r1, #0x100 + strh r1, [sp, #8] + add r1, sp, #0x10 + strh r6, [sp, #0xc] + strh r6, [sp, #0xe] + str r6, [sp] + ldrb r7, [r0], #1 + mov fp, r3 + ldr r8, [sp, #0x68] + add r2, r1, #1 + cmp r7, #0 + beq _020A814C + mov r4, r6 + add r5, sp, #4 + mov r3, r6 +_020A80F8: + cmp r7, #0x2e + beq _020A8128 + sub r6, r2, r5 + cmp r6, #0x3c + addge sp, sp, #0x40 + mvnge r0, #0 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r6, r4, #1 + mov r4, r6 + str r6, [sp] + strb r7, [r2], #1 + b _020A8140 +_020A8128: + strb r6, [r1] + mov r1, r2 + mov r4, r3 + mov r6, r3 + str r3, [sp] + add r2, r2, #1 +_020A8140: + ldrb r7, [r0], #1 + cmp r7, #0 + bne _020A80F8 +_020A814C: + ldr r0, [sp] + mov r3, #0 + strb r0, [r1] + strb r3, [r2] + mov r0, sl, lsr #8 + strb r0, [r2, #1] + strb sl, [r2, #2] + strb r3, [r2, #3] + mov r3, #1 + add r0, sp, #4 + add r1, r2, #5 + sub r1, r1, r0 + strb r3, [r2, #4] + bl CPS_SocWrite + mov r4, #0 + bl OS_GetTick + mov r5, r0, lsr #0x10 + orr r5, r5, r1, lsl #16 + b _020A82E4 +_020A8198: + bl CPS_SocGetLength + cmp r0, #0 + bne _020A81AC + bl OS_YieldThread__ + b _020A82E4 +_020A81AC: + add r0, sp, #0 + bl CPS_SocRead + ldr r1, [sp] + cmp r1, #0xc + bls _020A82DC + ldrh r3, [r0] + mov r2, r3, lsl #8 + orr r2, r2, r3, asr #8 + mov r2, r2, lsl #0x10 + cmp sb, r2, lsr #16 + bne _020A82DC + ldrb r2, [r0, #3] + and r2, r2, #0xf + cmp r2, #3 + mvneq r4, #0 + beq _020A82DC + cmp r2, #0 + bne _020A82DC + ldrb r3, [r0, #4] + ldrb r2, [r0, #5] + add r6, r0, r1 + add r0, r0, #0xc + orr r1, r2, r3, lsl #8 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + sub r7, r1, #1 + beq _020A822C +_020A8218: + bl dns_skipname + cmp r7, #0 + add r0, r0, #4 + sub r7, r7, #1 + bne _020A8218 +_020A822C: + cmp r0, r6 + bhs _020A82DC +_020A8234: + bl dns_skipname + ldrb r7, [r0, #8] + ldrb r1, [r0, #9] + ldrb r3, [r0] + ldrb r2, [r0, #1] + orr r1, r1, r7, lsl #8 + mov r1, r1, lsl #0x10 + orr r2, r2, r3, lsl #8 + mov r2, r2, lsl #0x10 + cmp sl, r2, lsr #16 + mov r2, r1, lsr #0x10 + bne _020A82CC + cmp sl, #0xc + beq _020A82AC + add r4, r0, #8 + add r0, r0, #6 + add r6, r4, r2 + add r1, r0, r2 + ldrb r3, [r0, r2] + ldrb r0, [r1, #1] + ldrb r2, [r4, r2] + ldrb r1, [r6, #1] + orr r0, r0, r3, lsl #8 + mov r0, r0, lsl #0x10 + orr r1, r1, r2, lsl #8 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r0, r1, lsr #0x10 + orr r4, r0, r2, lsl #16 + b _020A82DC +_020A82AC: + cmp r2, r8 + movhi r4, #2 + bhi _020A82DC + mov r1, fp + add r0, r0, #0xa + bl MI_CpuCopy8 + mov r4, #1 + b _020A82DC +_020A82CC: + add r1, r2, #0xa + add r0, r0, r1 + cmp r0, r6 + blo _020A8234 +_020A82DC: + ldr r0, [sp] + bl CPS_SocConsume +_020A82E4: + ldr r0, _020A8328 ; =_021D4620 + ldr r0, [r0, #0x48] + blx r0 + cmp r0, #0 + beq _020A8318 + cmp r4, #0 + bne _020A8318 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + sub r0, r0, r5 + cmp r0, #0xf + blt _020A8198 +_020A8318: + mov r0, r4 + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A8324: .word 0x00001001 +_020A8328: .word _021D4620 + arm_func_end resolve_common + + arm_func_start strtol10 +strtol10: ; 0x020A832C + str r0, [r1] + mov ip, #0 + mov r2, #0xa +_020A8338: + ldrb r3, [r0] + sub r3, r3, #0x30 + and r3, r3, #0xff + cmp r3, #9 + mlals ip, r2, ip, r3 + addls r0, r0, #1 + strls r0, [r1] + bls _020A8338 + mov r0, ip + bx lr + arm_func_end strtol10 + + arm_func_start rawip +rawip: ; 0x020A8360 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r5, #0 + mov r8, r0 + mov r7, r1 + mov r6, r5 + add r4, sp, #0 +_020A837C: + mov r0, r8 + mov r1, r4 + bl strtol10 + ldr r2, [sp] + cmp r8, r2 + addeq sp, sp, #4 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + mov r8, r2 + cmp r0, #0xff + bhi _020A83D0 + cmp r6, #3 + ldrneb r1, [r2] + addne r8, r2, #1 + cmpne r1, #0x2e + bne _020A83D0 + cmp r6, #3 + bne _020A83DC + ldrb r1, [r8] + cmp r1, #0 + beq _020A83DC +_020A83D0: + add sp, sp, #4 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020A83DC: + add r6, r6, #1 + cmp r6, #4 + orr r5, r0, r5, lsl #8 + blt _020A837C + str r5, [r7] + mov r0, #1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + arm_func_end rawip + + arm_func_start resolve_sub +resolve_sub: ; 0x020A83FC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + movs r5, r1 + mov r6, r0 + mov r4, r2 + addeq sp, sp, #4 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, pc} + bl CPS_SocUse + bl CPS_SocDatagramMode + mov r2, r5 + mov r0, #0 + mov r1, #0x35 + bl CPS_SocBind + mov r0, r6 + mov r2, r4 + mov r3, #0 + str r3, [sp] + mov r1, #1 + bl resolve_common + mov r4, r0 + bl CPS_SocRelease + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end resolve_sub + + arm_func_start CPS_Resolve +CPS_Resolve: ; 0x020A8460 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r2, _020A8590 ; =_021D4620 + mov r6, #0 + ldr r5, [r2, #0x70] + ldr r3, [r2, #0x68] + ldr r1, [r2, #0x6c] + umull r8, r7, r5, r3 + ldr sb, [r2, #0x78] + mla r7, r5, r1, r7 + ldr r4, [r2, #0x74] + adds fp, sb, r8 + mla r7, r4, r3, r7 + ldr r8, [r2, #0x7c] + umull r3, r1, r5, fp + adc sl, r8, r7 + mla r1, r5, sl, r1 + str fp, [r2, #0x68] + mov r7, r6, lsl #0x10 + adds r5, sb, r3 + mla r1, r4, fp, r1 + str sl, [r2, #0x6c] + orr r7, r7, sl, lsr #16 + adc r4, r8, r1 + mov r3, r6, lsl #0x10 + str r5, [r2, #0x68] + orr r3, r3, r4, lsr #16 + add r1, sp, #8 + mov sl, r0 + strh r7, [sp, #2] + str r4, [r2, #0x6c] + strh r3, [sp, #4] + bl rawip + cmp r0, #0 + ldrne r0, [sp, #8] + addne sp, sp, #0xc + ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #1 + mov fp, r6 + ldr r7, _020A8594 ; =_021D4680 + strb r0, [sp] + strb r0, [sp, #1] + add r6, sp, #2 + mov r5, fp + mvn r4, #0 +_020A8514: + mov r8, #0 + add sb, sp, #0 +_020A851C: + ldrb r0, [sb] + cmp r0, #0 + beq _020A8554 + mov r0, r8, lsl #1 + ldrh r2, [r6, r0] + ldr r1, [r7, r8, lsl #2] + mov r0, sl + bl resolve_sub + cmp r0, #0 + str r0, [sp, #8] + cmpne r0, r4 + bne _020A8570 + cmp r0, r4 + streqb r5, [sb] +_020A8554: + add r8, r8, #1 + cmp r8, #2 + add sb, sb, #1 + blt _020A851C + add fp, fp, #1 + cmp fp, #3 + blt _020A8514 +_020A8570: + ldr r1, [sp, #8] + mvn r0, #0 + cmp r1, r0 + moveq r0, #0 + streq r0, [sp, #8] + ldr r0, [sp, #8] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A8590: .word _021D4620 +_020A8594: .word _021D4680 + arm_func_end CPS_Resolve + + ; NitroWiFi: libssl.a + + arm_func_start find_session_from_id +find_session_from_id: ; 0x020A8598 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r0 + bl OS_DisableInterrupts + mov r4, #0 + ldr r6, _020A8628 ; =_021D5E68 + mov r5, r0 + strb r4, [r7, #0x30] + mov r8, #0x20 +_020A85B8: + ldrb r0, [r6, #0x5a] + cmp r0, #0 + beq _020A860C + ldr r0, [r6, #0x54] + cmp r0, #0 + ldreqh r0, [r6, #0x58] + cmpeq r0, #0 + bne _020A860C + mov r0, r6 + mov r2, r8 + add r1, r7, #0x74 + bl memcmp + cmp r0, #0 + bne _020A860C + mov r1, r7 + add r0, r6, #0x20 + mov r2, #0x30 + bl MI_CpuCopy8 + mov r0, #1 + strb r0, [r7, #0x30] + b _020A861C +_020A860C: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #0x5c + blt _020A85B8 +_020A861C: + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A8628: .word _021D5E68 + arm_func_end find_session_from_id + + arm_func_start find_session_from_IP +find_session_from_IP: ; 0x020A862C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + bl OS_DisableInterrupts + mov r1, #0 + ldr r5, _020A86C8 ; =_021D5E68 + mov r4, r0 + strb r1, [r8, #0x30] +_020A8650: + ldrb r0, [r5, #0x5a] + cmp r0, #0 + beq _020A86AC + ldr r0, [r5, #0x54] + cmp r0, r7 + ldreqh r0, [r5, #0x58] + cmpeq r0, r6 + bne _020A86AC + mov r0, r5 + add r1, r8, #0x74 + mov r2, #0x20 + bl MI_CpuCopy8 + mov r1, r8 + add r0, r5, #0x20 + mov r2, #0x30 + bl MI_CpuCopy8 + bl OS_GetTick + mov r0, r0, lsr #0x10 + orr r0, r0, r1, lsl #16 + str r0, [r5, #0x50] + mov r0, #1 + strb r0, [r8, #0x30] + b _020A86BC +_020A86AC: + add r1, r1, #1 + cmp r1, #4 + add r5, r5, #0x5c + blt _020A8650 +_020A86BC: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A86C8: .word _021D5E68 + arm_func_end find_session_from_IP + + arm_func_start cache_session +cache_session: ; 0x020A86CC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + bl OS_DisableInterrupts + mov r4, r0 + bl OS_GetTick + ldr sb, _020A87B4 ; =_021D5E68 + mov r5, r0, lsr #0x10 + mov r2, #0 + mov r0, r2 + mov r3, sb + orr r5, r5, r1, lsl #16 + mvn ip, #0 +_020A8704: + ldrb lr, [r3, #0x5a] + cmp lr, #0 + cmpne r7, #0 + beq _020A8738 + ldr r1, [r3, #0x54] + cmp r7, r1 + bne _020A8738 + cmp r6, #0 + beq _020A8738 + ldrh r1, [r3, #0x58] + cmp r6, r1 + moveq sb, r3 + beq _020A8774 +_020A8738: + cmp r2, ip + beq _020A8764 + cmp lr, #0 + moveq r2, ip + moveq sb, r3 + beq _020A8764 + ldr r1, [r3, #0x50] + sub r1, r5, r1 + cmp r1, r2 + movhi r2, r1 + movhi sb, r3 +_020A8764: + add r0, r0, #1 + cmp r0, #4 + add r3, r3, #0x5c + blt _020A8704 +_020A8774: + mov r1, sb + add r0, r8, #0x74 + mov r2, #0x20 + bl MI_CpuCopy8 + mov r0, r8 + add r1, sb, #0x20 + mov r2, #0x30 + bl MI_CpuCopy8 + str r5, [sb, #0x50] + mov r0, #1 + strb r0, [sb, #0x5a] + str r7, [sb, #0x54] + mov r0, r4 + strh r6, [sb, #0x58] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020A87B4: .word _021D5E68 + arm_func_end cache_session + + arm_func_start purge_session +purge_session: ; 0x020A87B8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + bl OS_DisableInterrupts + ldr r7, _020A881C ; =_021D5E68 + mov r6, r0 + mov r5, #0 + mov r4, #0x20 +_020A87D4: + ldrb r0, [r7, #0x5a] + cmp r0, #0 + beq _020A8800 + mov r0, r7 + mov r2, r4 + add r1, r8, #0x74 + bl memcmp + cmp r0, #0 + moveq r0, #0 + streqb r0, [r7, #0x5a] + beq _020A8810 +_020A8800: + add r5, r5, #1 + cmp r5, #4 + add r7, r7, #0x5c + blt _020A87D4 +_020A8810: + mov r0, r6 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A881C: .word _021D5E68 + arm_func_end purge_session + + arm_func_start date2sec +date2sec: ; 0x020A8820 + stmdb sp!, {lr} + sub sp, sp, #0x1c + add r0, sp, #0xc + bl RTC_GetDate + add r0, sp, #0 + bl RTC_GetTime + add r0, sp, #0xc + add r1, sp, #0 + bl RTC_ConvertDateTimeToSecond + ldr r1, _020A8854 ; =0x386D4380 + add r0, r0, r1 + add sp, sp, #0x1c + ldmia sp!, {pc} + .align 2, 0 +_020A8854: .word 0x386D4380 + arm_func_end date2sec + + arm_func_start CPS_GetSslHandshakePriority +CPS_GetSslHandshakePriority: ; 0x020A8858 + ldr r0, _020A8864 ; =_021106B0 + ldr r0, [r0, #4] + bx lr + .align 2, 0 +_020A8864: .word _021106B0 + arm_func_end CPS_GetSslHandshakePriority + + arm_func_start CPS_SetSslHandshakePriority +CPS_SetSslHandshakePriority: ; 0x020A8868 + ldr r1, _020A8874 ; =_021106B0 + str r0, [r1, #4] + bx lr + .align 2, 0 +_020A8874: .word _021106B0 + arm_func_end CPS_SetSslHandshakePriority + + arm_func_start enter_computebound +enter_computebound: ; 0x020A8878 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _020A88BC ; =_021106B0 + ldr r0, [r0, #4] + cmp r0, #0x20 + mvnhs r0, #0 + ldmhsia sp!, {r3, r4, r5, pc} + ldr r0, _020A88C0 ; =OSi_ThreadInfo + ldr r5, [r0, #4] + mov r0, r5 + bl OS_GetThreadPriority + ldr r1, _020A88BC ; =_021106B0 + mov r4, r0 + ldr r1, [r1, #4] + mov r0, r5 + bl OS_SetThreadPriority + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A88BC: .word _021106B0 +_020A88C0: .word OSi_ThreadInfo + arm_func_end enter_computebound + + arm_func_start exit_computebound +exit_computebound: ; 0x020A88C4 + stmdb sp!, {r3, lr} + mov r1, r0 + cmp r1, #0x20 + ldmhsia sp!, {r3, pc} + ldr r0, _020A88E4 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + bl OS_SetThreadPriority + ldmia sp!, {r3, pc} + .align 2, 0 +_020A88E4: .word OSi_ThreadInfo + arm_func_end exit_computebound + + arm_func_start CPS_SetRootCa +CPS_SetRootCa: ; 0x020A88E8 + ldr r2, _020A890C ; =OSi_ThreadInfo + ldr r2, [r2, #4] + ldr r2, [r2, #0xa4] + cmp r2, #0 + ldrne r2, [r2, #0xc] + cmpne r2, #0 + strne r0, [r2, #0x814] + strne r1, [r2, #0x818] + bx lr + .align 2, 0 +_020A890C: .word OSi_ThreadInfo + arm_func_end CPS_SetRootCa + + arm_func_start get_rootCA +get_rootCA: ; 0x020A8910 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r6, [r0, #0x818] + mov r8, r1 + cmp r6, #0 + mov r4, #0 + ble _020A8954 + ldr r5, [r0, #0x814] +_020A892C: + ldr r7, [r5, r4, lsl #2] + mov r1, r8 + ldr r0, [r7] + bl strcmp + cmp r0, #0 + moveq r0, r7 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r4, r4, #1 + cmp r4, r6 + blt _020A892C +_020A8954: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end get_rootCA + + arm_func_start cert_item_len +cert_item_len: ; 0x020A895C + ldr r1, [r0] + ldrb r2, [r1] + add r3, r1, #1 + tst r2, #0x80 + beq _020A89A0 + ands r1, r2, #0x7f + sub ip, r1, #1 + mov r2, #0 + beq _020A89A0 +_020A8980: + tst r2, #0xff000000 + mvnne r0, #0 + bxne lr + ldrb r1, [r3], #1 + cmp ip, #0 + sub ip, ip, #1 + add r2, r1, r2, lsl #8 + bne _020A8980 +_020A89A0: + str r3, [r0] + mov r0, r2 + bx lr + arm_func_end cert_item_len + + arm_func_start make_dn +make_dn: ; 0x020A89AC + ldrsb r3, [r0] + mov ip, r0 + cmp r3, #0 + beq _020A89F4 +_020A89BC: + ldrsb r3, [r0, #1]! + cmp r3, #0 + bne _020A89BC + sub r3, r0, ip + cmp r3, #0xff + bxge lr + mov r3, #0x2c + strb r3, [r0] + mov r3, #0x20 + strb r3, [r0, #1] + add r0, r0, #2 + b _020A89F4 +_020A89EC: + ldrsb r3, [r1], #1 + strb r3, [r0], #1 +_020A89F4: + cmp r2, #0 + sub r2, r2, #1 + beq _020A8A0C + sub r3, r0, ip + cmp r3, #0xff + blt _020A89EC +_020A8A0C: + mov r1, #0 + strb r1, [r0] + bx lr + arm_func_end make_dn + + arm_func_start parse_time +parse_time: ; 0x020A8A18 + stmdb sp!, {r4, lr} + ldrb ip, [r0, #1] + ldrb r3, [r0], #2 + mov r2, #0xa + cmp r1, #0x17 + mla r1, r3, r2, ip + sub lr, r1, #0x210 + bne _020A8A4C + cmp lr, #0x32 + addlo r4, lr, #0x7d0 + addhs r1, lr, #0x36c + addhs r4, r1, #0x400 + b _020A8A64 +_020A8A4C: + ldrb ip, [r0, #1] + ldrb r3, [r0], #2 + mov r1, #0x64 + mla r2, r3, r2, ip + sub r2, r2, #0x210 + mla r4, lr, r1, r2 +_020A8A64: + ldrb ip, [r0, #1] + ldrb r3, [r0] + mov r1, #0xa + ldrb r2, [r0, #3] + ldrb r0, [r0, #2] + mla ip, r3, r1, ip + mla r1, r0, r1, r2 + sub r0, ip, #0x210 + mov r0, r0, lsl #8 + add r2, r0, r4, lsl #16 + sub r0, r1, #0x210 + add r0, r2, r0 + ldmia sp!, {r4, pc} + arm_func_end parse_time + + arm_func_start cert_item +cert_item: ; 0x020A8A98 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov fp, r1 + ldr r1, [fp] + mov sb, r0 + add r0, r1, #1 + str r0, [sp, #4] + add r0, sp, #4 + mov r7, r2 + mov r6, r3 + ldr r8, [sp, #0x30] + ldrb r5, [r1] + bl cert_item_len + movs r4, r0 + bmi _020A8ADC + cmp r4, #0x7d0 + ble _020A8AE8 +_020A8ADC: + add sp, sp, #8 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020A8AE8: + and r1, r5, #0x1f + cmp r1, #0x18 + addls pc, pc, r1, lsl #2 + b _020A8F0C +_020A8AF8: ; jump table + b _020A8F0C ; case 0 + b _020A8F0C ; case 1 + b _020A8B5C ; case 2 + b _020A8C54 ; case 3 + b _020A8F0C ; case 4 + b _020A8F0C ; case 5 + b _020A8CD4 ; case 6 + b _020A8F0C ; case 7 + b _020A8F0C ; case 8 + b _020A8F0C ; case 9 + b _020A8F0C ; case 10 + b _020A8F0C ; case 11 + b _020A8D6C ; case 12 + b _020A8F0C ; case 13 + b _020A8F0C ; case 14 + b _020A8F0C ; case 15 + b _020A8E3C ; case 16 + b _020A8EBC ; case 17 + b _020A8F0C ; case 18 + b _020A8D6C ; case 19 + b _020A8D6C ; case 20 + b _020A8F0C ; case 21 + b _020A8D6C ; case 22 + b _020A8DEC ; case 23 + b _020A8DEC ; case 24 +_020A8B5C: + ldrb r0, [sb, #0x5ad] + cmp r0, #0 + beq _020A8C44 + cmp r6, #0 + bne _020A8BDC + ldr r0, [sp, #4] + ldrb r1, [r0] + cmp r1, #0 + bne _020A8B98 +_020A8B80: + add r0, r0, #1 + str r0, [sp, #4] + ldrb r1, [r0] + sub r4, r4, #1 + cmp r1, #0 + beq _020A8B80 +_020A8B98: + cmp r8, #0 + beq _020A8BAC + cmp r8, #2 + beq _020A8BCC + b _020A8C44 +_020A8BAC: + cmp r4, #0x100 + bgt _020A8C44 + add r1, sb, #0x94 + mov r2, r4 + add r1, r1, #0x400 + bl MI_CpuCopy8 + str r4, [sb, #0x594] + b _020A8C44 +_020A8BCC: + str r4, [sb, #0x484] + ldr r0, [sp, #4] + str r0, [sb, #0x488] + b _020A8C44 +_020A8BDC: + cmp r6, #1 + bne _020A8C44 + ldr r0, [sp, #4] + ldrb r1, [r0] + cmp r1, #0 + bne _020A8C0C +_020A8BF4: + add r0, r0, #1 + str r0, [sp, #4] + ldrb r1, [r0] + sub r4, r4, #1 + cmp r1, #0 + beq _020A8BF4 +_020A8C0C: + cmp r8, #0 + beq _020A8C28 + cmp r8, #2 + streq r4, [sb, #0x48c] + ldreq r0, [sp, #4] + streq r0, [sb, #0x490] + b _020A8C44 +_020A8C28: + cmp r4, #8 + bgt _020A8C44 + add r1, sb, #0x198 + mov r2, r4 + add r1, r1, #0x400 + bl MI_CpuCopy8 + str r4, [sb, #0x5a0] +_020A8C44: + ldr r0, [sp, #4] + add r0, r0, r4 + str r0, [sp, #4] + b _020A8F70 +_020A8C54: + cmp r7, #1 + bne _020A8C78 + cmp r8, #2 + beq _020A8C78 + ldr r1, [sp, #4] + sub r0, r4, #1 + add r1, r1, #1 + str r1, [sb, #0x5a4] + str r0, [sb, #0x5a8] +_020A8C78: + ldrb r0, [sb, #0x5ad] + cmp r0, #0 + beq _020A8CC4 + ldr r0, [sp, #4] + add r1, sp, #4 + add r0, r0, #1 + str r0, [sp, #4] + mov r0, sb + mov r2, r7 + mov r3, #0 + str r8, [sp] + bl cert_item + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #0 + strb r0, [sb, #0x5ad] + b _020A8F70 +_020A8CC4: + ldr r0, [sp, #4] + add r0, r0, r4 + str r0, [sp, #4] + b _020A8F70 +_020A8CD4: + ldr r6, [sp, #4] + ldr sl, _020A8F84 ; =_021106B8 + mov r5, #0 +_020A8CE0: + ldr r7, [sl, r5, lsl #2] + mov r0, r7 + bl strlen + mov r2, r0 + mov r0, r6 + mov r1, r7 + bl memcmp + cmp r0, #0 + bne _020A8D50 + cmp r5, #5 + addls pc, pc, r5, lsl #2 + b _020A8D5C +_020A8D10: ; jump table + b _020A8D5C ; case 0 + b _020A8D28 ; case 1 + b _020A8D28 ; case 2 + b _020A8D38 ; case 3 + b _020A8D38 ; case 4 + b _020A8D44 ; case 5 +_020A8D28: + cmp r8, #0 + streq r5, [sb, #0x45c] + strb r5, [sb, #0x5ad] + b _020A8D5C +_020A8D38: + cmp r8, #2 + strne r5, [sb, #0x458] + b _020A8D5C +_020A8D44: + cmp r8, #2 + strneb r5, [sb, #0x5ae] + b _020A8D5C +_020A8D50: + add r5, r5, #1 + cmp r5, #6 + blt _020A8CE0 +_020A8D5C: + ldr r0, [sp, #4] + add r0, r0, r4 + str r0, [sp, #4] + b _020A8F70 +_020A8D6C: + cmp r8, #2 + beq _020A8DD4 + ldrb r0, [sb, #0x5ac] + cmp r0, #0 + beq _020A8DC4 + ldr r1, [sp, #4] + mov r2, r4 + add r0, sb, #0x6b0 + bl make_dn + ldrb r0, [sb, #0x5ae] + cmp r0, #5 + bne _020A8DD4 + cmp r4, #0x4f + bgt _020A8DD4 + ldr r0, [sp, #4] + mov r2, r4 + add r1, sb, #0x7b0 + bl MI_CpuCopy8 + add r0, sb, r4 + mov r1, #0 + strb r1, [r0, #0x7b0] + b _020A8DD4 +_020A8DC4: + ldr r1, [sp, #4] + mov r2, r4 + add r0, sb, #0x5b0 + bl make_dn +_020A8DD4: + mov r0, #0 + strb r0, [sb, #0x5ae] + ldr r0, [sp, #4] + add r0, r0, r4 + str r0, [sp, #4] + b _020A8F70 +_020A8DEC: + cmp r8, #2 + beq _020A8E24 + ldr r0, [sp, #4] + bl parse_time + cmp r6, #0 + ldr r1, [sb, #0x80c] + bne _020A8E18 + cmp r1, r0 + movhs r0, #1 + strhsb r0, [sb, #0x5af] + b _020A8E24 +_020A8E18: + cmp r1, r0 + movhi r0, #0 + strhib r0, [sb, #0x5af] +_020A8E24: + ldr r1, [sp, #4] + mov r0, #1 + add r1, r1, r4 + str r1, [sp, #4] + strb r0, [sb, #0x5ac] + b _020A8F70 +_020A8E3C: + cmp r7, #0 + cmpeq r6, #0 + bne _020A8E54 + cmp r8, #2 + ldrne r0, [sp, #4] + strne r0, [sb, #0x460] +_020A8E54: + ldr r0, [sp, #4] + mov r5, #0 + add sl, r0, r4 + cmp r0, sl + bhs _020A8EA4 + add r4, sp, #4 +_020A8E6C: + mov r0, sb + mov r1, r4 + mov r3, r5 + add r2, r7, #1 + str r8, [sp] + bl cert_item + cmp r0, #0 + add r5, r5, #1 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #4] + cmp r0, sl + blo _020A8E6C +_020A8EA4: + cmp r7, #1 + cmpeq r6, #0 + bne _020A8F70 + cmp r8, #2 + strne r0, [sb, #0x464] + b _020A8F70 +_020A8EBC: + ldr r0, [sp, #4] + add r6, r0, r4 + cmp r0, r6 + bhs _020A8F70 + add r5, sp, #4 + mov r4, #0 +_020A8ED4: + mov r0, sb + mov r1, r5 + mov r3, r4 + add r2, r7, #1 + str r8, [sp] + bl cert_item + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #4] + cmp r0, r6 + blo _020A8ED4 + b _020A8F70 +_020A8F0C: + cmp r5, #0xa0 + bne _020A8F64 + ldr r0, [sp, #4] + add r6, r0, r4 + cmp r0, r6 + bhs _020A8F70 + add r5, sp, #4 + mov r4, #0 +_020A8F2C: + mov r0, sb + mov r1, r5 + mov r3, r4 + add r2, r7, #1 + str r8, [sp] + bl cert_item + cmp r0, #0 + addne sp, sp, #8 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [sp, #4] + cmp r0, r6 + blo _020A8F2C + b _020A8F70 +_020A8F64: + ldr r0, [sp, #4] + add r0, r0, r4 + str r0, [sp, #4] +_020A8F70: + ldr r1, [sp, #4] + mov r0, #0 + str r1, [fp] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A8F84: .word _021106B8 + arm_func_end cert_item + + arm_func_start validate_signature +validate_signature: ; 0x020A8F88 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r8, r0 + ldr r0, [r8, #0x5a4] + mov r7, r1 + cmp r0, #0 + ldrne r0, [r8, #0x5a8] + cmpne r0, #0 + ldrne r0, [r7, #0x10] + cmpne r0, #0 + ldrne r0, [r7, #0xc] + cmpne r0, #0 + ldrne r0, [r7, #8] + cmpne r0, #0 + ldrne r0, [r7, #4] + cmpne r0, #0 + addeq sp, sp, #4 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, r0, lsl #1 + ldr r1, _020A9128 ; =_021D4634 + add r0, r0, r0, lsr #31 + mov r5, r0, asr #1 + ldr r1, [r1] + mov r0, r5, lsl #3 + blx r1 + movs r4, r0 + addeq sp, sp, #4 + moveq r0, #2 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + add r6, r4, r5, lsl #1 + add sb, r6, r5, lsl #1 + ldr r1, [r8, #0x5a4] + ldr r2, [r8, #0x5a8] + mov r0, r6 + mov r3, r5 + add sl, sb, r5, lsl #1 + bl CPSi_big_from_char + ldr r1, [r7, #0x10] + ldr r2, [r7, #0xc] + mov r0, sb + mov r3, r5 + bl CPSi_big_from_char + ldr r1, [r7, #8] + ldr r2, [r7, #4] + mov r0, sl + mov r3, r5 + bl CPSi_big_from_char + bl enter_computebound + mov r2, sb + mov sb, r0 + mov r0, r4 + mov r1, r6 + mov r3, r5 + str sl, [sp] + bl CPSi_big_power + mov r0, sb + bl exit_computebound + ldr r2, [r7, #4] + mov r0, r6 + mov r1, r4 + mov r3, r5 + bl CPSi_char_from_big + ldrb r0, [r4, r5, lsl #1] + mov r5, #0 + cmp r0, #0 + ldreqb r0, [r6, #1] + cmpeq r0, #1 + movne r5, #2 + bne _020A910C + ldr r3, [r7, #4] + mov r2, #2 + cmp r3, #2 + ble _020A90C8 +_020A90B0: + ldrb r0, [r6, r2] + cmp r0, #0xff + bne _020A90C8 + add r2, r2, #1 + cmp r2, r3 + blt _020A90B0 +_020A90C8: + add r1, r2, #1 + cmp r1, r3 + bge _020A9108 + ldrb r0, [r6, r2] + cmp r0, #0 + ldreqb r0, [r6, r1] + cmpeq r0, #0x30 + bne _020A9108 + ldr r2, [r8, #0x47c] + add r0, r8, #0x68 + add r1, r6, r3 + add r0, r0, #0x400 + sub r1, r1, r2 + bl memcmp + cmp r0, #0 + beq _020A910C +_020A9108: + mov r5, #2 +_020A910C: + ldr r1, _020A912C ; =_021D4660 + mov r0, r4 + ldr r1, [r1] + blx r1 + mov r0, r5 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_020A9128: .word _021D4634 +_020A912C: .word _021D4660 + arm_func_end validate_signature + + arm_func_start auth_cert +auth_cert: ; 0x020A9130 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r0, [r5, #0x5af] + ldr r1, [r5, #0x45c] + cmp r0, #0 + movne r4, #0 + moveq r4, #0x8000 + mvn r0, #0 + cmp r1, r0 + orreq r0, r4, #4 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r5, #0x458] + cmp r0, #3 + beq _020A9174 + cmp r0, #4 + beq _020A91AC + b _020A91E4 +_020A9174: + add r0, r5, #0x3fc + bl CPSi_md5_init + ldr r1, [r5, #0x460] + ldr r2, [r5, #0x464] + add r0, r5, #0x3fc + sub r2, r2, r1 + bl CPSi_md5_calc + add r1, r5, #0x68 + add r0, r5, #0x3fc + add r1, r1, #0x400 + bl CPSi_md5_result + mov r0, #0x10 + str r0, [r5, #0x47c] + b _020A91EC +_020A91AC: + add r0, r5, #0x348 + bl CPSi_sha1_init + ldr r1, [r5, #0x460] + ldr r2, [r5, #0x464] + add r0, r5, #0x348 + sub r2, r2, r1 + bl CPSi_sha1_calc + add r1, r5, #0x68 + add r0, r5, #0x348 + add r1, r1, #0x400 + bl CPSi_sha1_result + mov r0, #0x14 + str r0, [r5, #0x47c] + b _020A91EC +_020A91E4: + orr r0, r4, #3 + ldmia sp!, {r3, r4, r5, pc} +_020A91EC: + mov r0, r5 + add r1, r5, #0x5b0 + bl get_rootCA + movs r1, r0 + orreq r0, r4, #1 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl validate_signature + orr r0, r4, r0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end auth_cert + + arm_func_start chars_till_end +chars_till_end: ; 0x020A9214 + mov r2, r0 + b _020A9220 +_020A921C: + add r0, r0, #1 +_020A9220: + ldrsb r1, [r0] + cmp r1, #0x2e + cmpne r1, #0 + bne _020A921C + sub r0, r0, r2 + bx lr + arm_func_end chars_till_end + + arm_func_start compare_fqdn +compare_fqdn: ; 0x020A9238 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + b _020A9254 +_020A9248: + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} +_020A9254: + ldrsb r0, [r5], #1 + ldrsb r1, [r6], #1 + cmp r1, r0 + beq _020A9248 + cmp r0, #0x2a + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + sub r6, r6, #1 + mov r0, r6 + bl chars_till_end + mov r4, r0 + mov r0, r5 + bl chars_till_end + cmp r0, r4 + movgt r0, #1 + ldmgtia sp!, {r4, r5, r6, pc} + sub r0, r4, r0 + add r6, r6, r0 + b _020A9254 +_020A92A0: ; 0x020A92A0 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end compare_fqdn + + arm_func_start rcv_certificate +rcv_certificate: ; 0x020A92A4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + ldr r1, [sp, #0x44] + mov sl, r0 + ldrb r4, [r1, #2] + ldrb r3, [r1] + ldrb r2, [r1, #1] + add r0, r1, #3 + mvn r1, #0 + str r0, [sp, #0x44] + add r2, r2, r3, lsl #8 + add r0, sp, #8 + str r1, [sl, #0x45c] + add r8, r4, r2, lsl #8 + bl RTC_GetDate + mov r6, #0 + ldr r1, [sp, #8] + ldr r0, [sp, #0xc] + add r1, r1, #0x7d0 + mov r0, r0, lsl #8 + ldr r2, [sp, #0x10] + add r0, r0, r1, lsl #16 + add r0, r2, r0 + str r0, [sl, #0x80c] + strb r6, [sl, #0x6b0] + str r6, [sl, #0x5a0] + mov sb, r6 + str r6, [sl, #0x594] + mov fp, #2 + mvn r5, #0 + mov r4, r6 +_020A9324: + ldr r1, [sp, #0x44] + mov r0, sl + ldrb r2, [r1, #2] + ldrb ip, [r1] + ldrb r3, [r1, #1] + add r7, r1, #3 + add r1, sp, #0x44 + str r7, [sp, #0x44] + str r5, [sl, #0x458] + strb r4, [sl, #0x5ad] + strb r4, [sl, #0x5ac] + strb r4, [sl, #0x5af] + strb r4, [sl, #0x6b0] + strb r4, [sl, #0x5b0] + strb r4, [sl, #0x7b0] + add r3, r3, ip, lsl #8 + ldr r7, [sp, #0x44] + add r3, r2, r3, lsl #8 + add r2, r3, #3 + str r7, [sl, #0x804] + str r3, [sl, #0x808] + sub r8, r8, r2 + mov r2, r4 + mov r3, r4 + str r6, [sp] + bl cert_item + cmp r0, #0 + bne _020A93AC + ldr r0, [sl, #0x594] + cmp r0, #0x33 + blo _020A93AC + ldr r0, [sl, #0x5a0] + cmp r0, #0 + bne _020A93C4 +_020A93AC: + mov r0, #9 + add sp, sp, #0x18 + strb r0, [sl, #0x455] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr +_020A93C4: + mov r0, sl + bl auth_cert + mov r7, r0 + cmp sb, #0 + bne _020A93F4 + ldr r0, [sl, #0x800] + cmp r0, #0 + beq _020A93F4 + add r1, sl, #0x7b0 + bl compare_fqdn + cmp r0, #0 + orrne r7, r7, #0x4000 +_020A93F4: + and r6, r7, #0xff + cmp r6, #1 + bne _020A9464 + cmp r8, #0 + beq _020A9464 + ldr r1, [sp, #0x44] + mov r2, #0 + add r1, r1, #3 + str r1, [sp, #4] + mov r1, #0 + strb r1, [sl, #0x5ad] + mov r0, sl + add r1, sp, #4 + mov r3, r2 + str fp, [sp] + bl cert_item + cmp r0, #0 + movne r0, #9 + addne sp, sp, #0x18 + strneb r0, [sl, #0x455] + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + addne sp, sp, #0x10 + bxne lr + mov r0, sl + add r1, sl, #0x480 + bl validate_signature + bic r1, r7, #0xff + orr r7, r1, r0 +_020A9464: + ldr r3, [sl, #0x810] + cmp r3, #0 + beq _020A9484 + mov r0, r7 + mov r1, sl + mov r2, sb + blx r3 + mov r7, r0 +_020A9484: + cmp r6, #0 + add sb, sb, #1 + beq _020A94A4 + cmp r7, #0 + bne _020A94A4 + cmp r8, #0 + movne r6, #1 + bne _020A9324 +_020A94A4: + cmp r7, #0 + moveq r0, #3 + streqb r0, [sl, #0x455] + movne r0, #9 + strneb r0, [sl, #0x455] + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + arm_func_end rcv_certificate + + arm_func_start rcv_server_hello +rcv_server_hello: ; 0x020A94C8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r0 + mov r5, r1 + add r0, r5, #2 + add r1, r6, #0x54 + mov r2, #0x20 + bl MI_CpuCopy8 + ldrb r7, [r6, #0x30] + ldrb r4, [r5, #0x22] + add r5, r5, #0x23 + cmp r7, #0 + beq _020A9520 + cmp r4, #0x20 + bne _020A9520 + mov r1, r5 + add r0, r6, #0x74 + mov r2, #0x20 + bl memcmp + cmp r0, #0 + moveq r0, #1 + streqb r0, [r6, #0x31] + beq _020A955C +_020A9520: + cmp r7, #0 + beq _020A9530 + mov r0, r6 + bl purge_session +_020A9530: + cmp r4, #0 + moveq r0, #0 + beq _020A9550 + mov r0, r5 + add r1, r6, #0x74 + mov r2, #0x20 + bl MI_CpuCopy8 + mov r0, #1 +_020A9550: + strb r0, [r6, #0x30] + mov r0, #0 + strb r0, [r6, #0x31] +_020A955C: + add r0, r5, r4 + ldrb r2, [r5, r4] + ldrb r1, [r0, #1] + mov r0, #2 + add r1, r1, r2, lsl #8 + strh r1, [r6, #0x32] + strb r0, [r6, #0x455] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end rcv_server_hello + + arm_func_start has_method +has_method: ; 0x020A957C + stmdb sp!, {r4, lr} + cmp r1, #0 + mov r4, #0 + ble _020A95C0 +_020A958C: + ldrb lr, [r0] + ldrb ip, [r0, #1] + cmp r2, #3 + add lr, ip, lr, lsl #8 + ldreqb ip, [r0, #2] + addeq lr, ip, lr, lsl #8 + cmp lr, r3 + moveq r0, #1 + ldmeqia sp!, {r4, pc} + add r4, r4, #1 + cmp r4, r1 + add r0, r0, r2 + blt _020A958C +_020A95C0: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end has_method + + arm_func_start select_method +select_method: ; 0x020A95C8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _020A9624 ; =_021106B0 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, #0 +_020A95E0: + mov r0, r5, lsl #1 + ldrh r3, [r4, r0] + mov r0, r8 + mov r1, r7 + mov r2, r6 + bl has_method + cmp r0, #0 + beq _020A9610 + ldr r0, _020A9624 ; =_021106B0 + mov r1, r5, lsl #1 + ldrh r0, [r0, r1] + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_020A9610: + add r5, r5, #1 + cmp r5, #2 + blo _020A95E0 + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020A9624: .word _021106B0 + arm_func_end select_method + + arm_func_start version_ok +version_ok: ; 0x020A9628 + cmp r0, #3 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end version_ok + + arm_func_start client_hello_v2 +client_hello_v2: ; 0x020A9638 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + ldrb r0, [r6] + ldrb r1, [r6, #1] + bl version_ok + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + ldrb r2, [r6, #2] + ldrb r1, [r6, #3] + ldr r3, _020A96FC ; =0x55555556 + add r0, r6, #8 + add r4, r1, r2, lsl #8 + smull r2, r1, r3, r4 + add r1, r1, r4, lsr #31 + mov r2, #3 + bl select_method + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x10 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + strh r0, [r7, #0x32] + ldrb r5, [r6, #4] + ldrb r3, [r6, #5] + ldrb r2, [r6, #6] + ldrb r0, [r6, #7] + mov r1, #0 + add r3, r3, r5, lsl #8 + add r5, r0, r2, lsl #8 + add r0, r4, #8 + strb r1, [r7, #0x30] + cmp r5, #0x20 + add r4, r0, r3 + blt _020A96D0 + add r0, r6, r4 + add r1, r7, #0x34 + mov r2, #0x20 + bl MI_CpuCopy8 + b _020A96F0 +_020A96D0: + add r0, r7, #0x34 + rsb r2, r5, #0x20 + bl MI_CpuFill8 + add r1, r7, #0x54 + mov r2, r5 + add r0, r6, r4 + sub r1, r1, r5 + bl MI_CpuCopy8 +_020A96F0: + mov r0, #1 + strb r0, [r7, #0x455] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020A96FC: .word 0x55555556 + arm_func_end client_hello_v2 + + arm_func_start client_hello +client_hello: ; 0x020A9700 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r4, r0 + ldrb r0, [r6] + ldrb r1, [r6, #1] + bl version_ok + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + add r0, r6, #2 + add r1, r4, #0x34 + mov r2, #0x20 + bl MI_CpuCopy8 + ldrb r5, [r6, #0x22] + add r6, r6, #0x23 + cmp r5, #0x20 + movne r0, #0 + strneb r0, [r4, #0x30] + bne _020A9760 + mov r0, r6 + add r1, r4, #0x74 + mov r2, #0x20 + bl MI_CpuCopy8 + mov r0, r4 + bl find_session_from_id +_020A9760: + add r0, r6, r5 + ldrb r1, [r0, #1] + ldrb r3, [r6, r5] + add r0, r0, #2 + mov r2, #2 + add r1, r1, r3, lsl #8 + add r1, r1, r1, lsr #31 + mov r1, r1, asr #1 + bl select_method + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x10 + strh r0, [r4, #0x32] + movne r0, #1 + strneb r0, [r4, #0x455] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end client_hello + + arm_func_start decrypt_premaster_secret +decrypt_premaster_secret: ; 0x020A979C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + movs sl, r2 + str r0, [sp, #8] + ldrne r0, [sl] + mov fp, r1 + cmpne r0, #0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, r0, lsl #1 + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + add r4, r0, #1 + mov r0, #0x14 + mul r0, r4, r0 + ldr r1, _020A99D4 ; =_021D4634 + ldr r1, [r1] + blx r1 + movs r5, r0 + addeq sp, sp, #0x18 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + add r6, r5, r4, lsl #1 + add r7, r6, r4, lsl #1 + add r1, r7, r4, lsl #1 + str r1, [sp, #0x10] + add r1, r1, r4, lsl #1 + add r8, r1, r4, lsl #1 + str r1, [sp, #0xc] + ldr r2, [sl] + add sb, r8, r4, lsl #1 + mov r1, fp + mov r3, r4 + add fp, sb, r4, lsl #1 + bl CPSi_big_from_char + ldr r1, [sl, #0x1c] + ldr r2, [sl, #0x18] + mov r0, r6 + mov r3, r4 + bl CPSi_big_from_char + ldr r1, [sl, #0xc] + ldr r2, [sl, #8] + mov r0, r8 + mov r3, r4 + bl CPSi_big_from_char + bl enter_computebound + str r0, [sp, #0x14] + ldr r0, [sp, #0x10] + str r8, [sp] + mov r1, r5 + mov r2, r6 + mov r3, r4 + bl CPSi_big_montpower + ldr r1, [sl, #0x24] + ldr r2, [sl, #0x20] + mov r0, r6 + mov r3, r4 + bl CPSi_big_from_char + ldr r1, [sl, #0x14] + ldr r2, [sl, #0x10] + mov r0, r8 + mov r3, r4 + bl CPSi_big_from_char + ldr r0, [sp, #0xc] + mov r1, r5 + mov r2, r6 + mov r3, r4 + str r8, [sp] + bl CPSi_big_montpower + ldr r0, [sp, #0x14] + bl exit_computebound + ldr r1, [sp, #0x10] + ldr r2, [sp, #0xc] + mov r0, r5 + mov r3, r4 + bl CPSi_big_sub + ldr r1, [sl, #0x2c] + ldr r2, [sl, #0x28] + mov r0, r6 + mov r3, r4 + bl CPSi_big_from_char + mov r0, r7 + mov r1, r5 + mov r2, r6 + mov r3, r4 + bl CPSi_big_mult + ldr r1, [sl, #0x14] + ldr r2, [sl, #0x10] + mov r0, r6 + mov r3, r4 + bl CPSi_big_from_char + mov r0, r5 + mov r1, r7 + mov r2, r6 + mov r3, r4 + bl CPSi_big_mult + ldr r2, [sp, #0xc] + mov r0, r7 + mov r1, r5 + mov r3, r4 + bl CPSi_big_add + ldr r1, [sl, #4] + ldr r2, [sl] + mov r0, r6 + mov r3, r4 + bl CPSi_big_from_char + mov r0, r7 + mov r1, r4 + bl CPSi_big_sign + cmp r0, #0 + bge _020A9990 + mov r0, r7 + mov r1, r4 + bl CPSi_big_negate + mov r1, r7 + mov r2, r6 + mov r3, sb + mov r0, #0 + stmia sp, {r4, fp} + bl CPSi_big_div + mov r0, sb + mov r1, r6 + mov r2, sb + mov r3, r4 + bl CPSi_big_sub + b _020A99A8 +_020A9990: + mov r1, r7 + mov r2, r6 + mov r3, sb + mov r0, #0 + stmia sp, {r4, fp} + bl CPSi_big_div +_020A99A8: + ldr r0, [sp, #8] + mov r1, sb + mov r3, r4 + mov r2, #0x30 + bl CPSi_char_from_big + ldr r1, _020A99D8 ; =_021D4660 + mov r0, r5 + ldr r1, [r1] + blx r1 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020A99D4: .word _021D4634 +_020A99D8: .word _021D4660 + arm_func_end decrypt_premaster_secret + + arm_func_start create_ms_sub +create_ms_sub: ; 0x020A99DC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x14 + mov r4, r2 + mov r6, r0 + mov r5, r1 + add r0, r4, #0x348 + bl CPSi_sha1_init + mov r0, r5 + bl strlen + mov r2, r0 + mov r1, r5 + add r0, r4, #0x348 + bl CPSi_sha1_calc + add r0, r4, #0x348 + mov r1, r4 + mov r2, #0x30 + bl CPSi_sha1_calc + add r0, r4, #0x348 + add r1, r4, #0x34 + mov r2, #0x40 + bl CPSi_sha1_calc + add r0, r4, #0x348 + add r1, sp, #0 + bl CPSi_sha1_result + add r0, r4, #0x3fc + bl CPSi_md5_init + add r0, r4, #0x3fc + mov r1, r4 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r4, #0x3fc + add r1, sp, #0 + mov r2, #0x14 + bl CPSi_md5_calc + add r0, r4, #0x3fc + mov r1, r6 + bl CPSi_md5_result + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end create_ms_sub + + arm_func_start create_master_secret +create_master_secret: ; 0x020A9A78 + stmdb sp!, {r4, lr} + sub sp, sp, #0x30 + mov r4, r0 + ldr r1, _020A9ACC ; =_021106FC + add r0, sp, #0 + mov r2, r4 + bl create_ms_sub + ldr r1, _020A9AD0 ; =_02110700 + add r0, sp, #0x10 + mov r2, r4 + bl create_ms_sub + ldr r1, _020A9AD4 ; =_02110704 + add r0, sp, #0x20 + mov r2, r4 + bl create_ms_sub + add r0, sp, #0 + mov r1, r4 + mov r2, #0x30 + bl MI_CpuCopy8 + add sp, sp, #0x30 + ldmia sp!, {r4, pc} + .align 2, 0 +_020A9ACC: .word _021106FC +_020A9AD0: .word _02110700 +_020A9AD4: .word _02110704 + arm_func_end create_master_secret + + arm_func_start create_key_block +create_key_block: ; 0x020A9AD8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov sl, r0 + ldrh r0, [sl, #0x32] + cmp r0, #4 + beq _020A9AFC + cmp r0, #5 + beq _020A9B10 + b _020A9B24 +_020A9AFC: + mov r0, #0x10 + str r0, [sp, #4] + str r0, [sp] + mov r2, #0 + b _020A9B24 +_020A9B10: + mov r0, #0x14 + str r0, [sp, #4] + mov r0, #0x10 + str r0, [sp] + mov r2, #0 +_020A9B24: + ldr r1, [sp, #4] + ldr r0, [sp] + mov r7, #0 + add r0, r1, r0 + add r0, r2, r0 + mov fp, r0, lsl #1 + cmp fp, #0 + ble _020A9C18 + add r0, sl, #0x74 + mov sb, r7 + str r0, [sp, #8] + add r5, sp, #0xc + mov r4, #1 +_020A9B58: + add r0, sl, #0x348 + bl CPSi_sha1_init + add r0, r7, #0x41 + add r6, r7, #1 + strb r0, [sp, #0xc] + mov r8, #0 + cmp r6, #0 + ble _020A9B94 +_020A9B78: + add r0, sl, #0x348 + mov r1, r5 + mov r2, r4 + bl CPSi_sha1_calc + add r8, r8, #1 + cmp r8, r6 + blt _020A9B78 +_020A9B94: + add r0, sl, #0x348 + mov r1, sl + mov r2, #0x30 + bl CPSi_sha1_calc + add r0, sl, #0x348 + add r1, sl, #0x54 + mov r2, #0x20 + bl CPSi_sha1_calc + add r0, sl, #0x348 + add r1, sl, #0x34 + mov r2, #0x20 + bl CPSi_sha1_calc + add r0, sl, #0x348 + add r1, sp, #0xd + bl CPSi_sha1_result + add r0, sl, #0x3fc + bl CPSi_md5_init + add r0, sl, #0x3fc + mov r1, sl + mov r2, #0x30 + bl CPSi_md5_calc + add r0, sl, #0x3fc + add r1, sp, #0xd + mov r2, #0x14 + bl CPSi_md5_calc + ldr r1, [sp, #8] + add r0, sl, #0x3fc + add r1, r1, sb + bl CPSi_md5_result + add sb, sb, #0x10 + cmp sb, fp + add r7, r7, #1 + blt _020A9B58 +_020A9C18: + ldrb r0, [sl, #0x454] + add r3, sl, #0x74 + cmp r0, #0 + beq _020A9C54 + ldr r0, [sp, #4] + str r3, [sl, #0x1d4] + add r2, r3, r0 + add r1, r2, r0 + add r0, r3, r0, lsl #1 + str r0, [sl, #0x1d8] + ldr r0, [sp] + str r2, [sl, #0xbc] + add r0, r1, r0 + str r0, [sl, #0xc0] + b _020A9C7C +_020A9C54: + ldr r0, [sp, #4] + str r3, [sl, #0xbc] + add r2, r3, r0 + add r1, r2, r0 + add r0, r3, r0, lsl #1 + str r0, [sl, #0xc0] + ldr r0, [sp] + str r2, [sl, #0x1d4] + add r0, r1, r0 + str r0, [sl, #0x1d8] +_020A9C7C: + ldr r1, [sl, #0x1d8] + add r0, sl, #0x1e0 + mov r2, #0x10 + bl CPSi_rc4_init + ldr r1, [sl, #0xc0] + add r0, sl, #0xc8 + mov r2, #0x10 + bl CPSi_rc4_init + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end create_key_block + + arm_func_start rcv_client_key_exchange +rcv_client_key_exchange: ; 0x020A9CA4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r2, [r4, #0x81c] + bl decrypt_premaster_secret + mov r0, r4 + bl create_master_secret + mov r1, #0 + mov r0, r4 + mov r2, r1 + bl cache_session + mov r0, r4 + bl create_key_block + mov r0, #5 + strb r0, [r4, #0x455] + ldmia sp!, {r4, pc} + arm_func_end rcv_client_key_exchange + + arm_func_start finished_md5 +finished_md5: ; 0x020A9CE0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x30 + mov r5, r0 + ldrb r0, [r5, #0x454] + mov r4, r1 + teq r0, r2 + mov r2, #4 + beq _020A9D10 + ldr r1, _020A9DB4 ; =_02110708 + add r0, r5, #0x3a4 + bl CPSi_md5_calc + b _020A9D1C +_020A9D10: + ldr r1, _020A9DB8 ; =_02110710 + add r0, r5, #0x3a4 + bl CPSi_md5_calc +_020A9D1C: + mov r1, r5 + add r0, r5, #0x3a4 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x30 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r5, #0x3a4 + mov r2, #0x30 + bl CPSi_md5_calc + mov r1, r4 + add r0, r5, #0x3a4 + bl CPSi_md5_result + add r0, r5, #0x3a4 + bl CPSi_md5_init + add r0, r5, #0x3a4 + mov r1, r5 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x30 + bl MI_CpuFill8 + add r0, r5, #0x3a4 + add r1, sp, #0 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r5, #0x3a4 + mov r1, r4 + mov r2, #0x10 + bl CPSi_md5_calc + add r0, r5, #0x3a4 + mov r1, r4 + bl CPSi_md5_result + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A9DB4: .word _02110708 +_020A9DB8: .word _02110710 + arm_func_end finished_md5 + + arm_func_start finished_sha1 +finished_sha1: ; 0x020A9DBC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x28 + mov r5, r0 + ldrb r0, [r5, #0x454] + mov r4, r1 + teq r0, r2 + mov r2, #4 + beq _020A9DEC + ldr r1, _020A9E90 ; =_02110708 + add r0, r5, #0x2ec + bl CPSi_sha1_calc + b _020A9DF8 +_020A9DEC: + ldr r1, _020A9E94 ; =_02110710 + add r0, r5, #0x2ec + bl CPSi_sha1_calc +_020A9DF8: + mov r1, r5 + add r0, r5, #0x2ec + mov r2, #0x30 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x28 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r5, #0x2ec + mov r2, #0x28 + bl CPSi_sha1_calc + mov r1, r4 + add r0, r5, #0x2ec + bl CPSi_sha1_result + add r0, r5, #0x2ec + bl CPSi_sha1_init + add r0, r5, #0x2ec + mov r1, r5 + mov r2, #0x30 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x28 + bl MI_CpuFill8 + add r0, r5, #0x2ec + add r1, sp, #0 + mov r2, #0x28 + bl CPSi_sha1_calc + add r0, r5, #0x2ec + mov r1, r4 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, r5, #0x2ec + mov r1, r4 + bl CPSi_sha1_result + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020A9E90: .word _02110708 +_020A9E94: .word _02110710 + arm_func_end finished_sha1 + + arm_func_start rcv_finished +rcv_finished: ; 0x020A9E98 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x14 + mov r5, r0 + mov r4, r1 + add r0, r5, #0x3a4 + add r1, r5, #0x3fc + mov r2, #0x58 + bl MI_CpuCopy8 + add r1, sp, #0 + mov r0, r5 + mov r2, #1 + bl finished_md5 + add r0, r5, #0x3fc + add r1, r5, #0x3a4 + mov r2, #0x58 + bl MI_CpuCopy8 + add r1, sp, #0 + mov r0, r4 + mov r2, #0x10 + bl memcmp + cmp r0, #0 + movne r0, #9 + addne sp, sp, #0x14 + strneb r0, [r5, #0x455] + ldmneia sp!, {r4, r5, pc} + add r0, r5, #0x2ec + add r1, r5, #0x348 + mov r2, #0x5c + bl MI_CpuCopy8 + add r1, sp, #0 + mov r0, r5 + mov r2, #1 + bl finished_sha1 + add r0, r5, #0x348 + add r1, r5, #0x2ec + mov r2, #0x5c + bl MI_CpuCopy8 + add r1, sp, #0 + add r0, r4, #0x10 + mov r2, #0x14 + bl memcmp + cmp r0, #0 + movne r0, #9 + strneb r0, [r5, #0x455] + moveq r0, #6 + streqb r0, [r5, #0x455] + add sp, sp, #0x14 + ldmia sp!, {r4, r5, pc} + arm_func_end rcv_finished + + arm_func_start add1_be8 +add1_be8: ; 0x020A9F58 + mov r2, #8 +_020A9F5C: + ldrb r1, [r0, #-1]! + add r1, r1, #1 + ands r1, r1, #0xff + strb r1, [r0] + bxne lr + subs r2, r2, #1 + bne _020A9F5C + bx lr + arm_func_end add1_be8 + + arm_func_start decrypt +decrypt: ; 0x020A9F7C + stmdb sp!, {r4, lr} + add r0, r0, #0x1e0 + mov r4, r2 + bl CPSi_rc4_crypt + mov r0, r4 + ldmia sp!, {r4, pc} + arm_func_end decrypt + + arm_func_start make_plaintext +make_plaintext: ; 0x020A9F94 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x44 + mov r6, r1 + ldrb r3, [r6, #3] + ldrb r2, [r6, #4] + mov r7, r0 + add r1, r6, #5 + add r2, r2, r3, lsl #8 + bl decrypt + ldrh r1, [r7, #0x32] + mov r4, r0 + cmp r1, #4 + beq _020A9FD4 + cmp r1, #5 + beq _020AA0B4 + b _020AA190 +_020A9FD4: + sub r4, r4, #0x10 + mov r0, r4, asr #8 + strb r0, [r6, #3] + strb r4, [r6, #4] + add r0, r7, #0x3fc + bl CPSi_md5_init + ldr r1, [r7, #0x1d4] + add r0, r7, #0x3fc + mov r2, #0x10 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x30 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r7, #0x3fc + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r7, #0x3fc + add r1, r7, #0x2e4 + mov r2, #8 + bl CPSi_md5_calc + add r0, r7, #0x3fc + mov r1, r6 + mov r2, #1 + bl CPSi_md5_calc + add r0, r7, #0x3fc + add r1, r6, #3 + add r2, r4, #2 + bl CPSi_md5_calc + add r0, r7, #0x3fc + add r1, sp, #0x30 + bl CPSi_md5_result + add r0, r7, #0x3fc + bl CPSi_md5_init + ldr r1, [r7, #0x1d4] + add r0, r7, #0x3fc + mov r2, #0x10 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x30 + bl MI_CpuFill8 + add r0, r7, #0x3fc + add r1, sp, #0 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r7, #0x3fc + add r1, sp, #0x30 + mov r2, #0x10 + bl CPSi_md5_calc + add r0, r7, #0x3fc + add r1, sp, #0x30 + bl CPSi_md5_result + mov r5, #0x10 + b _020AA190 +_020AA0B4: + sub r4, r4, #0x14 + mov r0, r4, asr #8 + strb r0, [r6, #3] + strb r4, [r6, #4] + add r0, r7, #0x348 + bl CPSi_sha1_init + ldr r1, [r7, #0x1d4] + add r0, r7, #0x348 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x28 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r7, #0x348 + mov r2, #0x28 + bl CPSi_sha1_calc + add r0, r7, #0x348 + add r1, r7, #0x2e4 + mov r2, #8 + bl CPSi_sha1_calc + add r0, r7, #0x348 + mov r1, r6 + mov r2, #1 + bl CPSi_sha1_calc + add r0, r7, #0x348 + add r1, r6, #3 + add r2, r4, #2 + bl CPSi_sha1_calc + add r0, r7, #0x348 + add r1, sp, #0x30 + bl CPSi_sha1_result + add r0, r7, #0x348 + bl CPSi_sha1_init + ldr r1, [r7, #0x1d4] + add r0, r7, #0x348 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x28 + bl MI_CpuFill8 + add r0, r7, #0x348 + add r1, sp, #0 + mov r2, #0x28 + bl CPSi_sha1_calc + add r0, r7, #0x348 + add r1, sp, #0x30 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, r7, #0x348 + add r1, sp, #0x30 + bl CPSi_sha1_result + mov r5, #0x14 +_020AA190: + add r0, r6, #5 + add r1, sp, #0x30 + mov r2, r5 + add r0, r0, r4 + bl memcmp + cmp r0, #0 + movne r0, #9 + strneb r0, [r7, #0x455] + add r0, r7, #0x2ec + bl add1_be8 + add r0, r4, #5 + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end make_plaintext + + arm_func_start make_ciphertext +make_ciphertext: ; 0x020AA1C4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x30 + mov r4, r1 + mov r5, r0 + ldrh r0, [r5, #0x32] + ldrb r2, [r4, #3] + ldrb r1, [r4, #4] + cmp r0, #4 + add r6, r4, #5 + add r7, r1, r2, lsl #8 + beq _020AA1FC + cmp r0, #5 + beq _020AA2CC + b _020AA398 +_020AA1FC: + add r0, r5, #0x3fc + bl CPSi_md5_init + ldr r1, [r5, #0xbc] + add r0, r5, #0x3fc + mov r2, #0x10 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x30 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r5, #0x3fc + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r5, #0x3fc + add r1, r5, #0x1cc + mov r2, #8 + bl CPSi_md5_calc + add r0, r5, #0x3fc + mov r1, r4 + mov r2, #1 + bl CPSi_md5_calc + add r0, r5, #0x3fc + add r1, r4, #3 + add r2, r7, #2 + bl CPSi_md5_calc + add r0, r5, #0x3fc + add r1, r6, r7 + bl CPSi_md5_result + add r0, r5, #0x3fc + bl CPSi_md5_init + ldr r1, [r5, #0xbc] + add r0, r5, #0x3fc + mov r2, #0x10 + bl CPSi_md5_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x30 + bl MI_CpuFill8 + add r0, r5, #0x3fc + add r1, sp, #0 + mov r2, #0x30 + bl CPSi_md5_calc + add r0, r5, #0x3fc + add r1, r6, r7 + mov r2, #0x10 + bl CPSi_md5_calc + add r1, r6, r7 + add r0, r5, #0x3fc + bl CPSi_md5_result + add r7, r7, #0x10 + b _020AA398 +_020AA2CC: + add r0, r5, #0x348 + bl CPSi_sha1_init + ldr r1, [r5, #0xbc] + add r0, r5, #0x348 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x36 + mov r2, #0x28 + bl MI_CpuFill8 + add r1, sp, #0 + add r0, r5, #0x348 + mov r2, #0x28 + bl CPSi_sha1_calc + add r0, r5, #0x348 + add r1, r5, #0x1cc + mov r2, #8 + bl CPSi_sha1_calc + add r0, r5, #0x348 + mov r1, r4 + mov r2, #1 + bl CPSi_sha1_calc + add r0, r5, #0x348 + add r1, r4, #3 + add r2, r7, #2 + bl CPSi_sha1_calc + add r0, r5, #0x348 + add r1, r6, r7 + bl CPSi_sha1_result + add r0, r5, #0x348 + bl CPSi_sha1_init + ldr r1, [r5, #0xbc] + add r0, r5, #0x348 + mov r2, #0x14 + bl CPSi_sha1_calc + add r0, sp, #0 + mov r1, #0x5c + mov r2, #0x28 + bl MI_CpuFill8 + add r0, r5, #0x348 + add r1, sp, #0 + mov r2, #0x28 + bl CPSi_sha1_calc + add r0, r5, #0x348 + add r1, r6, r7 + mov r2, #0x14 + bl CPSi_sha1_calc + add r1, r6, r7 + add r0, r5, #0x348 + bl CPSi_sha1_result + add r7, r7, #0x14 +_020AA398: + mov r0, r7, asr #8 + strb r0, [r4, #3] + mov r2, r7 + add r0, r5, #0xc8 + add r1, r4, #5 + strb r7, [r4, #4] + bl CPSi_rc4_crypt + add r0, r5, #0x1d4 + bl add1_be8 + add r0, r7, #5 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end make_ciphertext + + arm_func_start tcp_read_raw_nbytes +tcp_read_raw_nbytes: ; 0x020AA3C8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + add r4, sp, #0 +_020AA3DC: + mov r0, r4 + mov r1, r5 + bl CPSi_TcpReadRaw + ldr r1, [sp] + cmp r1, #0 + mvneq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, r6 + strhi r6, [sp] + ldr r2, [sp] + mov r1, r7 + bl MI_CpuCopy8 + ldr r0, [sp] + mov r1, r5 + bl CPSi_SocConsumeRaw + ldr r0, [sp] + sub r6, r6, r0 + cmp r6, #0 + add r7, r7, r0 + bgt _020AA3DC + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end tcp_read_raw_nbytes + + arm_func_start update_digest +update_digest: ; 0x020AA434 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + add r0, r6, #0x2ec + bl CPSi_sha1_calc + mov r1, r5 + mov r2, r4 + add r0, r6, #0x3a4 + bl CPSi_md5_calc + ldmia sp!, {r4, r5, r6, pc} + arm_func_end update_digest + + arm_func_start parse_record_in_buf +parse_record_in_buf: ; 0x020AA460 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r0 + ldrb r2, [sb, #0x455] + mov r8, r1 + cmp r2, #9 + bne _020AA48C + ldr r1, _020AA6DC ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020AA48C: + ldrb r3, [r8, #3] + ldrb r1, [r8, #4] + add r0, r2, #0xf9 + and r0, r0, #0xff + add r1, r1, r3, lsl #8 + cmp r0, #1 + add r6, r1, #5 + ldrb r4, [r8] + bhi _020AA4B8 + cmp r4, #0x15 + bne _020AA4C8 +_020AA4B8: + cmp r4, #0x15 + bne _020AA4F8 + cmp r6, #7 + bls _020AA4F8 +_020AA4C8: + mov r0, sb + mov r1, r8 + bl make_plaintext + ldrb r2, [sb, #0x455] + mov r6, r0 + cmp r2, #9 + bne _020AA4F8 + ldr r1, _020AA6DC ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020AA4F8: + sub r0, r4, #0x14 + cmp r0, #3 + add r5, r8, #5 + sub r6, r6, #5 + addls pc, pc, r0, lsl #2 + b _020AA6C0 +_020AA510: ; jump table + b _020AA520 ; case 0 + b _020AA550 ; case 1 + b _020AA564 ; case 2 + b _020AA6A0 ; case 3 +_020AA520: + ldr r0, [sb, #0x1d4] + cmp r0, #0 + moveq r0, #9 + streqb r0, [sb, #0x455] + beq _020AA6C8 + add r0, sb, #0x2e4 + mov r1, #0 + mov r2, #8 + bl MI_CpuFill8 + mov r0, #7 + strb r0, [sb, #0x455] + b _020AA6C8 +_020AA550: + ldrb r0, [r5] + cmp r0, #2 + moveq r0, #9 + streqb r0, [sb, #0x455] + b _020AA6C8 +_020AA564: + mov fp, #4 + mov sl, #1 + mov r4, #0 +_020AA570: + ldrb r7, [r5, #2] + ldrb r0, [r5, #1] + ldrb r3, [r5] + ldrb r1, [r5, #3] + mov r7, r7, lsl #8 + add r0, r7, r0, lsl #16 + cmp r3, #0xb + add r7, r1, r0 + add r5, r5, #4 + bgt _020AA5C0 + cmp r3, #0xb + bge _020AA634 + cmp r3, #2 + bgt _020AA668 + cmp r3, #1 + blt _020AA668 + beq _020AA5F0 + cmp r3, #2 + beq _020AA624 + b _020AA668 +_020AA5C0: + sub r0, r3, #0xd + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _020AA668 +_020AA5D0: ; jump table + b _020AA648 ; case 0 + b _020AA650 ; case 1 + b _020AA668 ; case 2 + b _020AA614 ; case 3 + b _020AA668 ; case 4 + b _020AA668 ; case 5 + b _020AA668 ; case 6 + b _020AA658 ; case 7 +_020AA5F0: + ldrb r0, [sb, #0x454] + cmp r0, #0 + beq _020AA670 + cmp r2, #0 + bne _020AA670 + mov r0, sb + mov r1, r5 + bl client_hello + b _020AA670 +_020AA614: + mov r0, sb + mov r1, r5 + bl rcv_client_key_exchange + b _020AA670 +_020AA624: + mov r0, sb + mov r1, r5 + bl rcv_server_hello + b _020AA670 +_020AA634: + mov r0, sb + mov r1, r5 + bl rcv_certificate + strb r4, [sb, #0x5ac] + b _020AA670 +_020AA648: + strb sl, [sb, #0x5ac] + b _020AA670 +_020AA650: + strb fp, [sb, #0x455] + b _020AA670 +_020AA658: + mov r0, sb + mov r1, r5 + bl rcv_finished + b _020AA670 +_020AA668: + mov r0, #9 + strb r0, [sb, #0x455] +_020AA670: + mov r0, sb + sub r1, r5, #4 + add r2, r7, #4 + bl update_digest + add r0, r7, #4 + add r5, r5, r7 + subs r6, r6, r0 + beq _020AA6C8 + ldrb r2, [sb, #0x455] + cmp r2, #9 + bne _020AA570 + b _020AA6C8 +_020AA6A0: + str r8, [sb, #0x824] + mov r0, #5 + str r0, [sb, #0x82c] + add r0, r6, #5 + str r0, [sb, #0x828] + mov r0, #1 + strb r0, [sb, #0x456] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020AA6C0: + mov r0, #9 + strb r0, [sb, #0x455] +_020AA6C8: + ldr r1, _020AA6DC ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AA6DC: .word _021D4660 + arm_func_end parse_record_in_buf + + arm_func_start parse_record +parse_record: ; 0x020AA6E0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r0 + ldr r4, [r5, #0xc] + add r6, sp, #0 +_020AA6F4: + mov r0, r6 + mov r1, r5 + bl CPSi_TcpReadRaw + ldr r1, [sp] + cmp r1, #0 + moveq r0, #9 + addeq sp, sp, #4 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, pc} + cmp r1, #5 + blo _020AA6F4 + ldrb r1, [r0] + cmp r1, #0x80 + bne _020AA7DC + ldrb r1, [r4, #0x454] + cmp r1, #0 + beq _020AA7D0 + ldrb r1, [r4, #0x455] + cmp r1, #0 + bne _020AA7D0 + ldrb r2, [r0, #1] + mov r1, r5 + mov r0, #2 + str r2, [sp] + bl CPSi_SocConsumeRaw + ldr r1, _020AA874 ; =_021D4634 + ldr r0, [sp] + ldr r1, [r1] + blx r1 + movs r6, r0 + moveq r0, #9 + addeq sp, sp, #4 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [sp] + mov r2, r5 + bl tcp_read_raw_nbytes + cmp r0, #0 + ldreqb r0, [r6] + cmpeq r0, #1 + movne r0, #9 + strneb r0, [r4, #0x455] + bne _020AA7AC + mov r0, r4 + add r1, r6, #1 + bl client_hello_v2 +_020AA7AC: + ldr r2, [sp] + mov r0, r4 + mov r1, r6 + bl update_digest + ldr r1, _020AA878 ; =_021D4660 + mov r0, r6 + ldr r1, [r1] + blx r1 + b _020AA868 +_020AA7D0: + mov r0, #9 + strb r0, [r4, #0x455] + b _020AA868 +_020AA7DC: + ldrb r2, [r0, #3] + ldrb r0, [r0, #4] + ldr r1, _020AA87C ; =0x00004805 + add r0, r0, r2, lsl #8 + add r0, r0, #5 + str r0, [sp] + cmp r0, r1 + movhi r0, #9 + addhi sp, sp, #4 + strhib r0, [r4, #0x455] + ldmhiia sp!, {r3, r4, r5, r6, pc} + ldr r1, _020AA874 ; =_021D4634 + ldr r1, [r1] + blx r1 + movs r6, r0 + moveq r0, #9 + addeq sp, sp, #4 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [sp] + mov r2, r5 + bl tcp_read_raw_nbytes + cmp r0, #0 + beq _020AA85C + ldr r1, _020AA878 ; =_021D4660 + mov r0, r6 + ldr r1, [r1] + blx r1 + mov r0, #9 + add sp, sp, #4 + strb r0, [r4, #0x455] + ldmia sp!, {r3, r4, r5, r6, pc} +_020AA85C: + mov r0, r4 + mov r1, r6 + bl parse_record_in_buf +_020AA868: + ldrb r0, [r4, #0x455] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020AA874: .word _021D4634 +_020AA878: .word _021D4660 +_020AA87C: .word 0x00004805 + arm_func_end parse_record + + arm_func_start set_random +set_random: ; 0x020AA880 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x74 + ldr r2, _020AA9A0 ; =_021D5E60 + mov sl, r0 + ldrb r0, [r2] + mov sb, r1 + cmp r0, #0 + bne _020AA8E4 + ldr r2, _020AA9A4 ; =_021D4688 + add r0, sp, #0 + ldr r3, [r2] + ldmib r2, {r1, r4} + umull r6, r5, r4, r3 + mla r5, r4, r1, r5 + ldr r1, [r2, #0xc] + ldr r4, [r2, #0x10] + mla r5, r1, r3, r5 + ldr r1, [r2, #0x14] + adds r4, r4, r6 + adc r3, r1, r5 + str r4, [r2] + mov r1, #4 + str r3, [r2, #4] + str r3, [sp] + bl CPS_SslAddRandomSeed +_020AA8E4: + cmp sb, #0 + mov r8, #0 + addle sp, sp, #0x74 + mov r1, #0x14 + ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r5, _020AA9A8 ; =_021D5FD8 + add r6, sp, #0x18 + mov fp, r1 + add r4, sp, #4 +_020AA908: + cmp r1, #0x14 + bne _020AA97C + mov r0, r6 + bl CPSi_sha1_init + bl OS_DisableInterrupts + mov r7, r0 + mov r0, r6 + mov r1, r5 + mov r2, fp + bl CPSi_sha1_calc + mov r0, r6 + mov r1, r4 + bl CPSi_sha1_result_prng + ldr lr, _020AA9AC ; =_021D5FEB + mov r3, #1 + mov r2, #0x13 + add ip, sp, #0x17 +_020AA94C: + ldrb r1, [lr] + ldrb r0, [ip], #-1 + subs r2, r2, #1 + add r0, r1, r0 + add r0, r3, r0 + strb r0, [lr], #-1 + mov r3, r0, lsr #8 + bpl _020AA94C + str r0, [sp] + mov r0, r7 + bl OS_RestoreInterrupts + mov r1, #0 +_020AA97C: + ldrb r0, [r4, r1] + add r1, r1, #1 + cmp r0, #0 + strneb r0, [sl, r8] + addne r8, r8, #1 + cmp r8, sb + blt _020AA908 + add sp, sp, #0x74 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AA9A0: .word _021D5E60 +_020AA9A4: .word _021D4688 +_020AA9A8: .word _021D5FD8 +_020AA9AC: .word _021D5FEB + arm_func_end set_random + + arm_func_start CPS_SslAddRandomSeed +CPS_SslAddRandomSeed: ; 0x020AA9B0 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x5c + mov r6, r0 + add r0, sp, #0 + mov r5, r1 + bl CPSi_sha1_init + bl OS_DisableInterrupts + mov r4, r0 + ldr r1, _020AAA18 ; =_021D5FD8 + add r0, sp, #0 + mov r2, #0x14 + bl CPSi_sha1_calc + mov r1, r6 + mov r2, r5 + add r0, sp, #0 + bl CPSi_sha1_calc + ldr r1, _020AAA18 ; =_021D5FD8 + add r0, sp, #0 + bl CPSi_sha1_result + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, _020AAA1C ; =_021D5E60 + mov r1, #1 + strb r1, [r0] + add sp, sp, #0x5c + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020AAA18: .word _021D5FD8 +_020AAA1C: .word _021D5E60 + arm_func_end CPS_SslAddRandomSeed + + arm_func_start send_server_hello +send_server_hello: ; 0x020AAA20 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + ldr r4, [sb, #0xc] + ldr r7, [r4, #0x820] + cmp r7, #0 + ldrne r8, [r7] + moveq r8, #0 + bl date2sec + mov r1, r0, lsr #0x18 + strb r1, [r4, #0x54] + mov r1, r0, lsr #0x10 + strb r1, [r4, #0x55] + mov r1, r0, lsr #8 + strb r1, [r4, #0x56] + strb r0, [r4, #0x57] + add r0, r4, #0x58 + mov r1, #0x1c + bl set_random + ldr r1, _020AAC74 ; =_021D4634 + add r0, r8, #0x9d + ldr r1, [r1] + blx r1 + movs r5, r0 + bne _020AAA90 + mov r0, #9 + strb r0, [r4, #0x455] + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020AAA90: + mov r0, #2 + strb r0, [r5, #5] + mov r3, #0 + strb r3, [r5, #6] + strb r3, [r5, #7] + mov r0, #0x46 + strb r0, [r5, #8] + mov r0, #3 + strb r0, [r5, #9] + add r0, r4, #0x54 + add r1, r5, #0xb + mov r2, #0x20 + strb r3, [r5, #0xa] + bl MI_CpuCopy8 + mov r2, #0x20 + strb r2, [r5, #0x2b] + ldrb r0, [r4, #0x30] + cmp r0, #0 + beq _020AAAF8 + add r0, r4, #0x74 + add r1, r5, #0x2c + bl MI_CpuCopy8 + mov r0, #1 + strb r0, [r4, #0x31] + add r6, r5, #0x4c + b _020AAB54 +_020AAAF8: + add r0, r5, #0x2c + mov r1, #0x1c + bl set_random + ldr r0, _020AAC78 ; =_021D5E60 + add r6, r5, #0x4c + ldr r3, [r0, #4] + sub r0, r6, #0x20 + mov r1, r3, lsr #0x18 + strb r1, [r5, #0x48] + mov r1, r3, lsr #0x10 + strb r1, [r5, #0x49] + mov r1, r3, lsr #8 + strb r1, [r5, #0x4a] + add r1, r4, #0x74 + mov r2, #0x20 + strb r3, [r5, #0x4b] + bl MI_CpuCopy8 + ldr r0, _020AAC78 ; =_021D5E60 + mov r1, #0 + ldr r2, [r0, #4] + strb r1, [r4, #0x31] + add r1, r2, #1 + str r1, [r0, #4] +_020AAB54: + ldrh r1, [r4, #0x32] + mov r0, #0 + mov r1, r1, asr #8 + strb r1, [r6] + ldrh r1, [r4, #0x32] + strb r1, [r6, #1] + strb r0, [r6, #2] + ldrb r0, [r4, #0x31] + add r6, r6, #3 + cmp r0, #0 + bne _020AAC08 + cmp r8, #0 + beq _020AABEC + add r2, r8, #6 + mov r0, #0xb + strb r0, [r6] + add r1, r8, #3 + mov r0, r2, asr #0x10 + strb r0, [r6, #1] + mov r0, r2, asr #8 + strb r0, [r6, #2] + strb r2, [r6, #3] + mov r0, r1, asr #0x10 + strb r0, [r6, #4] + mov r0, r1, asr #8 + strb r0, [r6, #5] + strb r1, [r6, #6] + mov r0, r8, asr #0x10 + strb r0, [r6, #7] + mov r0, r8, asr #8 + strb r0, [r6, #8] + strb r8, [r6, #9] + add r6, r6, #0xa + ldr r0, [r7, #4] + mov r1, r6 + mov r2, r8 + bl MI_CpuCopy8 + add r6, r6, r8 +_020AABEC: + mov r0, #0xe + strb r0, [r6] + mov r0, #0 + strb r0, [r6, #1] + strb r0, [r6, #2] + strb r0, [r6, #3] + add r6, r6, #4 +_020AAC08: + mov r0, #0x16 + sub r1, r6, r5 + sub r6, r1, #5 + strb r0, [r5] + mov r0, #3 + strb r0, [r5, #1] + mov r0, #0 + strb r0, [r5, #2] + mov r0, r6, asr #8 + strb r0, [r5, #3] + mov r0, r4 + mov r2, r6 + add r1, r5, #5 + strb r6, [r5, #4] + bl update_digest + mov r2, #0 + mov r0, r5 + mov r3, r2 + add r1, r6, #5 + str sb, [sp] + bl CPSi_TcpWrite2Raw + ldr r1, _020AAC7C ; =_021D4660 + mov r0, r5 + ldr r1, [r1] + blx r1 + ldrb r0, [r4, #0x31] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020AAC74: .word _021D4634 +_020AAC78: .word _021D5E60 +_020AAC7C: .word _021D4660 + arm_func_end send_server_hello + + arm_func_start send_change_cipher_spec_and_finished +send_change_cipher_spec_and_finished: ; 0x020AAC80 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r1, _020AADD0 ; =_021D4634 + mov r6, r0 + ldr r1, [r1] + mov r0, #0x83 + ldr r5, [r6, #0xc] + blx r1 + movs r4, r0 + moveq r0, #9 + addeq sp, sp, #4 + streqb r0, [r5, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, pc} + mov r0, #0x14 + strb r0, [r4] + mov r0, #3 + strb r0, [r4, #1] + mov r1, #0 + strb r1, [r4, #2] + strb r1, [r4, #3] + mov r3, #1 + strb r3, [r4, #4] + add r0, r5, #0x1cc + mov r2, #8 + strb r3, [r4, #5] + bl MI_CpuFill8 + mov r0, #0x16 + strb r0, [r4, #6] + mov r0, #3 + strb r0, [r4, #7] + mov r1, #0 + strb r1, [r4, #8] + strb r1, [r4, #9] + mov r0, #0x28 + strb r0, [r4, #0xa] + mov r0, #0x14 + strb r0, [r4, #0xb] + strb r1, [r4, #0xc] + strb r1, [r4, #0xd] + mov r3, #0x24 + add r0, r5, #0x3a4 + add r1, r5, #0x3fc + mov r2, #0x58 + strb r3, [r4, #0xe] + bl MI_CpuCopy8 + mov r0, r5 + add r1, r4, #0xf + mov r2, #0 + bl finished_md5 + add r0, r5, #0x3fc + add r1, r5, #0x3a4 + mov r2, #0x58 + bl MI_CpuCopy8 + add r0, r5, #0x2ec + add r1, r5, #0x348 + mov r2, #0x5c + bl MI_CpuCopy8 + mov r0, r5 + add r1, r4, #0x1f + mov r2, #0 + bl finished_sha1 + add r0, r5, #0x348 + add r1, r5, #0x2ec + mov r2, #0x5c + bl MI_CpuCopy8 + mov r0, r5 + add r1, r4, #0xb + mov r2, #0x28 + bl update_digest + mov r0, r5 + add r1, r4, #6 + bl make_ciphertext + mov r2, #0 + add r1, r0, #6 + mov r0, r4 + mov r3, r2 + str r6, [sp] + bl CPSi_TcpWrite2Raw + ldr r1, _020AADD4 ; =_021D4660 + mov r0, r4 + ldr r1, [r1] + blx r1 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020AADD0: .word _021D4634 +_020AADD4: .word _021D4660 + arm_func_end send_change_cipher_spec_and_finished + + arm_func_start send_client_hello +send_client_hello: ; 0x020AADD8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _020AAF60 ; =_021D4634 + mov r7, r0 + ldr r1, [r1] + mov r0, #0x98 + ldr r4, [r7, #0xc] + blx r1 + movs r5, r0 + moveq r0, #9 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, #3 + strb r0, [r5, #9] + mov r0, #0 + strb r0, [r5, #0xa] + bl date2sec + mov r1, r0, lsr #0x18 + strb r1, [r4, #0x34] + mov r1, r0, lsr #0x10 + strb r1, [r4, #0x35] + mov r1, r0, lsr #8 + strb r1, [r4, #0x36] + strb r0, [r4, #0x37] + add r0, r4, #0x38 + mov r1, #0x1c + bl set_random + add r0, r4, #0x34 + add r1, r5, #0xb + mov r2, #0x20 + bl MI_CpuCopy8 + ldrh r2, [r7, #0x18] + ldr r1, [r7, #0x1c] + mov r0, r4 + bl find_session_from_IP + ldrb r0, [r4, #0x30] + cmp r0, #0 + moveq r0, #0 + streqb r0, [r5, #0x2b] + addeq r0, r5, #0x2c + beq _020AAE90 + mov r2, #0x20 + add r0, r4, #0x74 + add r1, r5, #0x2c + strb r2, [r5, #0x2b] + bl MI_CpuCopy8 + add r0, r5, #0x4c +_020AAE90: + mov r6, #0 + strb r6, [r0] + mov r1, #4 + strb r1, [r0, #1] + ldr r2, _020AAF64 ; =_021106B0 + add r0, r0, #2 +_020AAEA8: + mov r3, r6, lsl #1 + ldrh r1, [r2, r3] + add r6, r6, #1 + cmp r6, #2 + mov r1, r1, asr #8 + strb r1, [r0] + ldrh r1, [r2, r3] + strb r1, [r0, #1] + add r0, r0, #2 + blo _020AAEA8 + mov r3, #1 + mov r2, #0 + strb r3, [r0] + add r1, r0, #2 + sub r1, r1, r5 + sub r6, r1, #5 + strb r2, [r0, #1] + sub r1, r6, #4 + mov r0, #0x16 + strb r0, [r5] + mov r0, #3 + strb r0, [r5, #1] + strb r2, [r5, #2] + mov r0, r6, asr #8 + strb r0, [r5, #3] + strb r6, [r5, #4] + strb r3, [r5, #5] + mov r0, r1, asr #0x10 + strb r0, [r5, #6] + mov r0, r1, asr #8 + strb r0, [r5, #7] + strb r1, [r5, #8] + mov r0, r5 + mov r3, r2 + add r1, r6, #5 + str r7, [sp] + bl CPSi_TcpWrite2Raw + mov r0, r4 + mov r2, r6 + add r1, r5, #5 + bl update_digest + ldr r1, _020AAF68 ; =_021D4660 + mov r0, r5 + ldr r1, [r1] + blx r1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020AAF60: .word _021D4634 +_020AAF64: .word _021106B0 +_020AAF68: .word _021D4660 + arm_func_end send_client_hello + + arm_func_start send_client_key_exchange +send_client_key_exchange: ; 0x020AAF6C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + ldr r4, [sl, #0xc] + ldrb r0, [r4, #0x5ac] + cmp r0, #0 + beq _020AAFA0 + mov r2, #0 + ldr r0, _020AB220 ; =_02108FB8 + mov r3, r2 + mov r1, #7 + str sl, [sp] + bl CPSi_TcpWrite2Raw +_020AAFA0: + mov r0, #3 + strb r0, [r4] + mov r0, #0 + strb r0, [r4, #1] + add r0, r4, #2 + mov r1, #0x2e + bl set_random + ldr sb, [r4, #0x594] + ldr r0, _020AB224 ; =_021D4634 + mov r1, sb, lsl #1 + ldr r2, [r0] + add r1, r1, r1, lsr #31 + mov r0, sb + mov r7, r1, asr #1 + blx r2 + movs r8, r0 + moveq r0, #9 + addeq sp, sp, #8 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, #0 + strb r0, [r8] + mov r2, #2 + add r0, r8, #2 + sub r1, sb, #0x33 + strb r2, [r8, #1] + bl set_random + add r1, r8, sb + mov r0, r4 + sub r3, sb, #0x31 + mov r5, #0 + sub r1, r1, #0x30 + mov r2, #0x30 + strb r5, [r8, r3] + bl MI_CpuCopy8 + ldr r1, _020AB224 ; =_021D4634 + mov r0, r7, lsl #3 + ldr r1, [r1] + blx r1 + movs r5, r0 + bne _020AB064 + ldr r1, _020AB228 ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + mov r0, #9 + add sp, sp, #8 + strb r0, [r4, #0x455] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020AB064: + add r0, r5, r7, lsl #1 + add fp, r0, r7, lsl #1 + mov r1, r8 + mov r2, sb + mov r3, r7 + str r0, [sp, #4] + add r6, fp, r7, lsl #1 + bl CPSi_big_from_char + add r0, r4, #0x198 + add r1, r0, #0x400 + ldr r2, [r4, #0x5a0] + mov r0, fp + mov r3, r7 + bl CPSi_big_from_char + add r1, r4, #0x94 + mov r0, r6 + add r1, r1, #0x400 + mov r2, sb + mov r3, r7 + bl CPSi_big_from_char + bl enter_computebound + str r6, [sp] + mov r6, r0 + ldr r1, [sp, #4] + mov r2, fp + mov r3, r7 + mov r0, r5 + bl CPSi_big_power + mov r0, r6 + bl exit_computebound + ldr r1, _020AB224 ; =_021D4634 + add r0, sb, #0x49 + ldr r1, [r1] + blx r1 + movs r6, r0 + bne _020AB124 + ldr r1, _020AB228 ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + ldr r1, _020AB228 ; =_021D4660 + mov r0, r5 + ldr r1, [r1] + blx r1 + mov r0, #9 + add sp, sp, #8 + strb r0, [r4, #0x455] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020AB124: + mov r0, #0x16 + strb r0, [r6] + mov r1, #3 + add r0, sb, #4 + strb r1, [r6, #1] + mov r1, #0 + strb r1, [r6, #2] + mov r1, r0, asr #8 + strb r1, [r6, #3] + strb r0, [r6, #4] + mov r0, #0x10 + strb r0, [r6, #5] + mov r0, sb, asr #0x10 + strb r0, [r6, #6] + mov r0, sb, asr #8 + strb r0, [r6, #7] + strb sb, [r6, #8] + tst sb, #1 + add r0, r6, #9 + beq _020AB18C + add r0, sb, sb, lsr #31 + mov r0, r0, asr #1 + mov r0, r0, lsl #1 + ldrh r1, [r5, r0] + add r0, r6, #0xa + strb r1, [r6, #9] +_020AB18C: + add r1, sb, sb, lsr #31 + mov r1, r1, asr #1 + subs r3, r1, #1 + bmi _020AB1C0 +_020AB19C: + mov r2, r3, lsl #1 + ldrh r1, [r5, r2] + subs r3, r3, #1 + mov r1, r1, asr #8 + strb r1, [r0] + ldrh r1, [r5, r2] + strb r1, [r0, #1] + add r0, r0, #2 + bpl _020AB19C +_020AB1C0: + mov r2, #0 + mov r0, r6 + mov r3, r2 + add r1, sb, #9 + str sl, [sp] + bl CPSi_TcpWrite2Raw + mov r0, r4 + add r1, r6, #5 + add r2, sb, #4 + bl update_digest + ldr r1, _020AB228 ; =_021D4660 + mov r0, r6 + ldr r1, [r1] + blx r1 + ldr r1, _020AB228 ; =_021D4660 + mov r0, r5 + ldr r1, [r1] + blx r1 + ldr r1, _020AB228 ; =_021D4660 + mov r0, r8 + ldr r1, [r1] + blx r1 + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AB220: .word _02108FB8 +_020AB224: .word _021D4634 +_020AB228: .word _021D4660 + arm_func_end send_client_key_exchange + + arm_func_start mustget_change_cipher_spec_and_finished +mustget_change_cipher_spec_and_finished: ; 0x020AB22C + stmdb sp!, {r4, lr} + mov r4, r0 + bl parse_record + cmp r0, #7 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl parse_record + cmp r0, #6 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r4, pc} + arm_func_end mustget_change_cipher_spec_and_finished + + arm_func_start ssl_listen_try +ssl_listen_try: ; 0x020AB25C + stmdb sp!, {r4, lr} + mov r4, r0 + bl parse_record + cmp r0, #1 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl send_server_hello + cmp r0, #0 + beq _020AB2AC + ldr r0, [r4, #0xc] + bl create_key_block + mov r0, r4 + bl send_change_cipher_spec_and_finished + mov r0, r4 + bl mustget_change_cipher_spec_and_finished + cmp r0, #0 + beq _020AB2DC + mov r0, #1 + ldmia sp!, {r4, pc} +_020AB2AC: + mov r0, r4 + bl parse_record + cmp r0, #5 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl mustget_change_cipher_spec_and_finished + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r0, r4 + bl send_change_cipher_spec_and_finished +_020AB2DC: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ssl_listen_try + + arm_func_start CPSi_SslListen +CPSi_SslListen: ; 0x020AB2E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + ldr r6, [r7, #0xc] + mov r5, #0 + mov r4, #1 +_020AB2F8: + mov r0, r7 + bl CPSi_TcpListenRaw + strb r5, [r6, #0x455] + str r5, [r6, #0x1d4] + add r0, r6, #0x2ec + strb r4, [r6, #0x454] + bl CPSi_sha1_init + add r0, r6, #0x3a4 + bl CPSi_md5_init + mov r0, r7 + bl ssl_listen_try + cmp r0, #0 + moveq r0, #8 + streqb r0, [r6, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r7 + bl CPSi_TcpShutdownRaw + ldrh r0, [r7, #0x1a] + strh r0, [r7, #0x18] + ldr r0, [r7, #0x20] + str r0, [r7, #0x1c] + b _020AB2F8 +_020AB350: ; 0x020AB350 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CPSi_SslListen + + arm_func_start ssl_connect_try +ssl_connect_try: ; 0x020AB354 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5, #0xc] + bl send_client_hello +_020AB364: + mov r0, r5 + bl parse_record + cmp r0, #9 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #4 + beq _020AB38C + ldrb r0, [r4, #0x31] + cmp r0, #0 + beq _020AB364 +_020AB38C: + ldrb r0, [r4, #0x31] + cmp r0, #0 + beq _020AB3C0 + mov r0, r4 + bl create_key_block + mov r0, r5 + bl mustget_change_cipher_spec_and_finished + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl send_change_cipher_spec_and_finished + b _020AB410 +_020AB3C0: + mov r0, r5 + bl send_client_key_exchange + mov r0, r4 + bl create_master_secret + ldrb r0, [r4, #0x30] + cmp r0, #0 + beq _020AB3EC + ldrh r2, [r5, #0x18] + ldr r1, [r5, #0x1c] + mov r0, r4 + bl cache_session +_020AB3EC: + mov r0, r4 + bl create_key_block + mov r0, r5 + bl send_change_cipher_spec_and_finished + mov r0, r5 + bl mustget_change_cipher_spec_and_finished + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} +_020AB410: + mov r0, #8 + strb r0, [r4, #0x455] + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ssl_connect_try + + arm_func_start CPSi_SslConnect +CPSi_SslConnect: ; 0x020AB420 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrb r1, [r5, #8] + ldr r4, [r5, #0xc] + cmp r1, #4 + beq _020AB448 + bl CPSi_TcpConnectRaw + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} +_020AB448: + mov r1, #0 + strb r1, [r4, #0x455] + str r1, [r4, #0x1d4] + add r0, r4, #0x2ec + strb r1, [r4, #0x454] + bl CPSi_sha1_init + add r0, r4, #0x3a4 + bl CPSi_md5_init + mov r0, r5 + bl ssl_connect_try + ldmia sp!, {r3, r4, r5, pc} + arm_func_end CPSi_SslConnect + + arm_func_start CPSi_SslRead +CPSi_SslRead: ; 0x020AB474 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + ldr r4, [r5, #0xc] + mov r6, r0 + ldr ip, [r4, #0x824] + cmp ip, #0 + beq _020AB4F8 + ldrb r0, [r4, #0x456] + cmp r0, #0 + bne _020AB4F8 + ldr r3, [r4, #0x82c] + ldr r1, [r4, #0x828] + mov r2, r5 + add r0, ip, r3 + sub r1, r1, r3 + bl tcp_read_raw_nbytes + cmp r0, #0 + beq _020AB4DC + ldr r1, _020AB548 ; =_021D4660 + ldr r0, [r4, #0x824] + ldr r1, [r1] + blx r1 + mov r0, #0 + str r0, [r4, #0x824] + str r0, [r6] + ldmia sp!, {r4, r5, r6, pc} +_020AB4DC: + ldr r1, [r4, #0x824] + mov r0, r4 + bl parse_record_in_buf + ldrb r0, [r4, #0x456] + cmp r0, #0 + moveq r0, #0 + streq r0, [r4, #0x824] +_020AB4F8: + ldr r0, [r4, #0x824] + cmp r0, #0 + bne _020AB528 +_020AB504: + mov r0, r5 + bl parse_record + cmp r0, #9 + moveq r0, #0 + streq r0, [r6] + ldmeqia sp!, {r4, r5, r6, pc} + ldr r0, [r4, #0x824] + cmp r0, #0 + beq _020AB504 +_020AB528: + ldr r1, [r4, #0x828] + ldr r0, [r4, #0x82c] + sub r0, r1, r0 + str r0, [r6] + ldr r1, [r4, #0x824] + ldr r0, [r4, #0x82c] + add r0, r1, r0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020AB548: .word _021D4660 + arm_func_end CPSi_SslRead + + arm_func_start CPSi_SslConsume +CPSi_SslConsume: ; 0x020AB54C + stmdb sp!, {r4, lr} + ldr r4, [r1, #0xc] + ldr r2, [r4, #0x828] + ldr r1, [r4, #0x82c] + sub r2, r2, r1 + cmp r0, r2 + blo _020AB58C + ldr r0, [r4, #0x824] + cmp r0, #0 + beq _020AB580 + ldr r1, _020AB598 ; =_021D4660 + ldr r1, [r1] + blx r1 +_020AB580: + mov r0, #0 + str r0, [r4, #0x824] + ldmia sp!, {r4, pc} +_020AB58C: + add r0, r1, r0 + str r0, [r4, #0x82c] + ldmia sp!, {r4, pc} + .align 2, 0 +_020AB598: .word _021D4660 + arm_func_end CPSi_SslConsume + + arm_func_start try_fill_record +try_fill_record: ; 0x020AB59C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r0 + ldr r4, [r5, #0xc] + ldr r0, [r4, #0x824] + cmp r0, #0 + ldr r0, [r5, #0x44] + bne _020AB63C + cmp r0, #5 + addlo sp, sp, #4 + ldmloia sp!, {r3, r4, r5, r6, pc} + add r0, sp, #0 + mov r1, r5 + bl CPSi_TcpReadRaw + ldrb r2, [r0, #3] + ldrb r0, [r0, #4] + ldr r1, _020AB6D8 ; =0x00004805 + add r0, r0, r2, lsl #8 + add r0, r0, #5 + str r0, [sp] + cmp r0, r1 + movhi r0, #9 + addhi sp, sp, #4 + strhib r0, [r4, #0x455] + ldmhiia sp!, {r3, r4, r5, r6, pc} + ldr r1, _020AB6DC ; =_021D4634 + ldr r1, [r1] + blx r1 + cmp r0, #0 + str r0, [r4, #0x824] + moveq r0, #9 + addeq sp, sp, #4 + streqb r0, [r4, #0x455] + ldmeqia sp!, {r3, r4, r5, r6, pc} + ldr r1, [sp] + mov r0, #0 + str r1, [r4, #0x828] + str r0, [r4, #0x82c] + strb r0, [r4, #0x456] + b _020AB648 +_020AB63C: + cmp r0, #0 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, pc} +_020AB648: + add r0, sp, #0 + mov r1, r5 + bl CPSi_TcpReadRaw + ldr r3, [r4, #0x828] + ldr r2, [r4, #0x82c] + ldr r1, [sp] + sub r2, r3, r2 + cmp r1, r2 + strhs r2, [sp] + movhs r6, #1 + ldr r3, [r4, #0x824] + ldr r1, [r4, #0x82c] + ldr r2, [sp] + add r1, r3, r1 + movlo r6, #0 + bl MI_CpuCopy8 + ldr r0, [sp] + mov r1, r5 + bl CPSi_SocConsumeRaw + cmp r6, #0 + beq _020AB6C0 + ldr r1, [r4, #0x824] + mov r0, r4 + bl parse_record_in_buf + ldrb r0, [r4, #0x456] + add sp, sp, #4 + cmp r0, #0 + moveq r0, #0 + streq r0, [r4, #0x824] + ldmia sp!, {r3, r4, r5, r6, pc} +_020AB6C0: + ldr r1, [r4, #0x82c] + ldr r0, [sp] + add r0, r1, r0 + str r0, [r4, #0x82c] + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020AB6D8: .word 0x00004805 +_020AB6DC: .word _021D4634 + arm_func_end try_fill_record + + arm_func_start CPSi_SslGetLength +CPSi_SslGetLength: ; 0x020AB6E0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5, #0xc] + ldr r0, [r4, #0x824] + cmp r0, #0 + ldrneb r0, [r4, #0x456] + cmpne r0, #0 + bne _020AB708 + mov r0, r5 + bl try_fill_record +_020AB708: + ldr r1, [r4, #0x824] + cmp r1, #0 + ldrneb r0, [r4, #0x456] + cmpne r0, #0 + beq _020AB72C + ldr r1, [r4, #0x828] + ldr r0, [r4, #0x82c] + sub r0, r1, r0 + ldmia sp!, {r3, r4, r5, pc} +_020AB72C: + cmp r1, #0 + bne _020AB754 + ldrb r0, [r5, #8] + cmp r0, #4 + bne _020AB74C + ldrb r0, [r4, #0x455] + cmp r0, #9 + bne _020AB754 +_020AB74C: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AB754: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end CPSi_SslGetLength + + arm_func_start CPSi_SslWrite2 +CPSi_SslWrite2: ; 0x020AB75C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, [sp, #0x30] + mov sb, r1 + mov r1, r4 + ldr r1, [r1, #0xc] + mov sl, r0 + mov r0, #0 + str r4, [sp, #0x30] + str r1, [sp, #8] + mov r8, r2 + add r5, sb, r3 + str r0, [sp, #4] +_020AB790: + ldr r0, _020AB884 ; =0x00000B4F + ldr r1, _020AB888 ; =_021D4634 + cmp r5, r0 + movgt r6, r0 + movle r6, r5 + ldr r1, [r1] + add r0, r6, #0x19 + blx r1 + movs r4, r0 + beq _020AB878 + cmp sb, r6 + movhs r7, r6 + movlo r7, sb + mov r0, sl + add r1, r4, #5 + mov r2, r7 + sub fp, r6, r7 + bl MI_CpuCopy8 + add r1, r4, #5 + mov r0, r8 + add r1, r1, r7 + mov r2, fp + add sl, sl, r7 + sub sb, sb, r7 + bl MI_CpuCopy8 + mov r0, #0x17 + strb r0, [r4] + mov r0, #3 + strb r0, [r4, #1] + mov r0, #0 + strb r0, [r4, #2] + mov r0, r6, asr #8 + strb r0, [r4, #3] + ldr r0, [sp, #8] + mov r1, r4 + add r8, r8, fp + strb r6, [r4, #4] + bl make_ciphertext + ldr r1, [sp, #0x30] + mov r7, r0 + mov r2, #0 + str r1, [sp] + mov r0, r4 + mov r1, r7 + mov r3, r2 + bl CPSi_TcpWrite2Raw + cmp r0, r7 + ldr r1, _020AB88C ; =_021D4660 + mov r0, r4 + ldr r1, [r1] + movlo r6, #0 + blx r1 + ldr r0, [sp, #4] + subs r5, r5, r6 + add r0, r0, r6 + str r0, [sp, #4] + cmpne r6, #0 + bne _020AB790 +_020AB878: + ldr r0, [sp, #4] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AB884: .word 0x00000B4F +_020AB888: .word _021D4634 +_020AB88C: .word _021D4660 + arm_func_end CPSi_SslWrite2 + + arm_func_start CPSi_SslShutdown +CPSi_SslShutdown: ; 0x020AB890 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x20 + mov r5, r0 + ldr r4, [r5, #0xc] + ldrb r0, [r4, #0x455] + cmp r0, #8 + bne _020AB900 + mov ip, #0 + mov r6, #0x15 + mov lr, #3 + mov r3, #2 + mov r2, #1 + add r1, sp, #4 + mov r0, r4 + strb r6, [sp, #4] + strb lr, [sp, #5] + strb ip, [sp, #6] + strb ip, [sp, #7] + strb r3, [sp, #8] + strb r2, [sp, #9] + strb ip, [sp, #0xa] + bl make_ciphertext + mov r2, #0 + mov r1, r0 + add r0, sp, #4 + mov r3, r2 + str r5, [sp] + bl CPSi_TcpWrite2Raw +_020AB900: + mov r0, #0 + strb r0, [r4, #0x455] + add sp, sp, #0x20 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end CPSi_SslShutdown + + arm_func_start CPSi_SslClose +CPSi_SslClose: ; 0x020AB910 + stmdb sp!, {r4, lr} + ldr r4, [r0, #0xc] + mov r0, #0 + strb r0, [r4, #0x455] + ldr r0, [r4, #0x824] + cmp r0, #0 + beq _020AB938 + ldr r1, _020AB944 ; =_021D4660 + ldr r1, [r1] + blx r1 +_020AB938: + mov r0, #0 + str r0, [r4, #0x824] + ldmia sp!, {r4, pc} + .align 2, 0 +_020AB944: .word _021D4660 + arm_func_end CPSi_SslClose + + arm_func_start CPS_SetSsl +CPS_SetSsl: ; 0x020AB948 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _020AB970 ; =_version_UBIQUITOUS_SSL + bl OSi_ReferSymbol + ldr r0, _020AB974 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r0, [r0, #0xa4] + cmp r0, #0 + strneb r4, [r0, #9] + ldmia sp!, {r4, pc} + .align 2, 0 +_020AB970: .word _version_UBIQUITOUS_SSL +_020AB974: .word OSi_ThreadInfo + arm_func_end CPS_SetSsl + + arm_func_start CPSi_SslPeriodical +CPSi_SslPeriodical: ; 0x020AB978 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl OS_DisableInterrupts + mov r4, #0 + ldr r6, _020ABA4C ; =_021D5E68 + ldr r1, _020ABA50 ; =0x000003BD + mov r2, r4 +_020AB994: + ldrb r3, [r6, #0x5a] + cmp r3, #0 + beq _020AB9B0 + ldr r3, [r6, #0x50] + sub r3, r5, r3 + cmp r3, r1 + strgtb r2, [r6, #0x5a] +_020AB9B0: + add r4, r4, #1 + cmp r4, #4 + add r6, r6, #0x5c + blt _020AB994 + bl OS_RestoreInterrupts + ldr r0, _020ABA54 ; =OSi_ThreadInfo + ldr r4, [r0, #8] + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r6, #0 +_020AB9D8: + ldr r1, [r4, #0xa4] + cmp r1, #0 + ldrne r0, [r1] + cmpne r0, #0 + ldrneb r0, [r1, #9] + cmpne r0, #0 + beq _020ABA3C + ldrb r0, [r1, #8] + cmp r0, #4 + bne _020ABA3C + ldr r0, [r1, #0xc] + ldrb r0, [r0, #0x455] + cmp r0, #8 + bhs _020ABA3C + ldr r0, [r1, #0x10] + sub r0, r5, r0 + cmp r0, #0xef + ble _020ABA3C + ldr r0, [r1, #4] + cmp r0, #2 + bne _020ABA3C + strb r6, [r1, #8] + str r6, [r1, #4] + ldr r0, [r1] + bl OS_WakeupThreadDirect +_020ABA3C: + ldr r4, [r4, #0x68] + cmp r4, #0 + bne _020AB9D8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020ABA4C: .word _021D5E68 +_020ABA50: .word 0x000003BD +_020ABA54: .word OSi_ThreadInfo + arm_func_end CPSi_SslPeriodical + + arm_func_start CPSi_SslCleanup +CPSi_SslCleanup: ; 0x020ABA58 + ldr ip, _020ABA6C ; =MI_CpuFill8 + ldr r0, _020ABA70 ; =_021D5E68 + mov r1, #0 + mov r2, #0x170 + bx ip + .align 2, 0 +_020ABA6C: .word MI_CpuFill8 +_020ABA70: .word _021D5E68 + arm_func_end CPSi_SslCleanup + + arm_func_start char_from_long +char_from_long: ; 0x020ABA74 + ldr ip, _020ABA88 ; =MI_CpuCopy8 + mov r3, r0 + mov r0, r1 + mov r1, r3 + bx ip + .align 2, 0 +_020ABA88: .word MI_CpuCopy8 + arm_func_end char_from_long + + arm_func_start long_from_char +long_from_char: ; 0x020ABA8C + ldr ip, _020ABAA0 ; =MI_CpuCopy8 + mov r3, r0 + mov r0, r1 + mov r1, r3 + bx ip + .align 2, 0 +_020ABAA0: .word MI_CpuCopy8 + arm_func_end long_from_char + + arm_func_start CPSi_md5_block +CPSi_md5_block: ; 0x020ABAA4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x44 + str r0, [sp] + ldr r3, [sp] + add r0, sp, #4 + mov r2, #0x40 + ldmia r3, {r4, r5, r6, r7} + bl long_from_char + mov r3, #0 + ldr lr, _020ABEB8 ; =_02110718 + mov ip, r3 + add r2, sp, #4 +_020ABAD4: + ldr r1, _020ABEBC ; =_02110798 + ldrb r0, [lr] + add sb, r1, r3, lsl #2 + eor r1, r6, r7 + and r8, r5, r1 + ldr r1, _020ABEBC ; =_02110798 + ldr r0, [r2, r0, lsl #2] + ldr sl, [r1, r3, lsl #2] + eor r1, r7, r8 + add r0, r1, r0 + add r0, sl, r0 + add r1, r4, r0 + mov r0, r1, lsr #0x19 + orr r0, r0, r1, lsl #7 + ldrb r1, [lr, #1] + add r4, r5, r0 + eor r0, r5, r6 + and r0, r4, r0 + ldr sl, [r2, r1, lsl #2] + eor r0, r6, r0 + add r0, r0, sl + ldr r8, [sb, #4] + ldrb sl, [lr, #2] + add r0, r8, r0 + add r7, r7, r0 + mov r0, r7, lsr #0x14 + orr r0, r0, r7, lsl #12 + add r7, r4, r0 + eor r0, r4, r5 + and r0, r7, r0 + ldr r1, [sb, #8] + ldrb fp, [lr, #3] + ldr sl, [r2, sl, lsl #2] + eor r0, r5, r0 + add r0, r0, sl + add r0, r1, r0 + add r6, r6, r0 + mov r1, r6, lsr #0xf + orr r1, r1, r6, lsl #17 + add ip, ip, #1 + eor r8, r7, r4 + add r6, r7, r1 + and r1, r6, r8 + ldr r0, [r2, fp, lsl #2] + eor r1, r4, r1 + ldr sb, [sb, #0xc] + add r0, r1, r0 + add r0, sb, r0 + add r1, r5, r0 + mov r0, r1, lsr #0xa + orr r0, r0, r1, lsl #22 + add lr, lr, #4 + add r5, r6, r0 + add r3, r3, #4 + cmp ip, #4 + blt _020ABAD4 + ldr r0, _020ABEB8 ; =_02110718 + ldr lr, _020ABEBC ; =_02110798 + mov fp, #0 + add sl, r0, r3 + add sb, sp, #4 +_020ABBC8: + ldrb r0, [sl] + add ip, lr, r3, lsl #2 + eor r1, r5, r6 + and r1, r7, r1 + ldr r8, [lr, r3, lsl #2] + eor r1, r6, r1 + ldr r0, [sb, r0, lsl #2] + ldr r2, [ip, #4] + add r0, r1, r0 + add r0, r8, r0 + add r1, r4, r0 + mov r0, r1, lsr #0x1b + orr r1, r0, r1, lsl #5 + ldrb r0, [sl, #1] + add r4, r5, r1 + eor r1, r4, r5 + and r1, r6, r1 + eor r1, r5, r1 + ldr r0, [sb, r0, lsl #2] + ldr r8, [ip, #8] + add r0, r1, r0 + add r0, r2, r0 + add r2, r7, r0 + ldr r0, [ip, #0xc] + mov r1, r2, lsr #0x17 + orr r1, r1, r2, lsl #9 + add r7, r4, r1 + eor r1, r7, r4 + and r1, r5, r1 + eor r2, r4, r1 + ldrb r1, [sl, #2] + ldrb ip, [sl, #3] + add sl, sl, #4 + ldr r1, [sb, r1, lsl #2] + ldr ip, [sb, ip, lsl #2] + add r1, r2, r1 + add r1, r8, r1 + add r2, r6, r1 + mov r1, r2, lsr #0x12 + orr r1, r1, r2, lsl #14 + add r6, r7, r1 + eor r1, r6, r7 + and r1, r4, r1 + eor r1, r7, r1 + add r1, r1, ip + add r0, r0, r1 + add r1, r5, r0 + mov r0, r1, lsr #0xc + orr r0, r0, r1, lsl #20 + add r5, r6, r0 + add r3, r3, #4 + add fp, fp, #1 + cmp fp, #4 + blt _020ABBC8 + ldr r0, _020ABEB8 ; =_02110718 + ldr r1, _020ABEBC ; =_02110798 + add r2, r0, r3 + mov r8, #0 + add r0, sp, #4 +_020ABCB4: + ldrb sb, [r2] + add fp, r1, r3, lsl #2 + eor ip, r5, r6 + ldr sl, [r0, sb, lsl #2] + eor ip, r7, ip + ldr sb, [r1, r3, lsl #2] + add sl, ip, sl + add sb, sb, sl + add sb, r4, sb + mov r4, sb, lsr #0x1c + ldrb sl, [r2, #1] + orr r4, r4, sb, lsl #4 + add r4, r5, r4 + eor sb, r4, r5 + eor sb, r6, sb + ldr ip, [r0, sl, lsl #2] + ldr sl, [fp, #4] + add sb, sb, ip + add sb, sl, sb + add sb, r7, sb + mov r7, sb, lsr #0x15 + orr r7, r7, sb, lsl #11 + ldrb sb, [r2, #2] + add r7, r4, r7 + ldr sl, [fp, #8] + ldr ip, [r0, sb, lsl #2] + ldr sb, [fp, #0xc] + eor fp, r7, r4 + eor fp, r5, fp + add fp, fp, ip + add sl, sl, fp + add sl, r6, sl + mov r6, sl, lsr #0x10 + orr r6, r6, sl, lsl #16 + add r6, r7, r6 + eor sl, r6, r7 + eor fp, r4, sl + ldrb sl, [r2, #3] + add r2, r2, #4 + add r3, r3, #4 + ldr sl, [r0, sl, lsl #2] + add r8, r8, #1 + add sl, fp, sl + add sb, sb, sl + add sb, r5, sb + cmp r8, #4 + mov r5, sb, lsr #9 + orr r5, r5, sb, lsl #23 + add r5, r6, r5 + blt _020ABCB4 + ldr r0, _020ABEB8 ; =_02110718 + mov sb, #0 + add r8, r0, r3 + add r2, sp, #4 +_020ABD8C: + ldr r1, _020ABEBC ; =_02110798 + ldrb r0, [r8] + add fp, r1, r3, lsl #2 + mvn r1, r7 + orr sl, r5, r1 + ldr r1, _020ABEBC ; =_02110798 + ldr r0, [r2, r0, lsl #2] + ldr ip, [r1, r3, lsl #2] + eor r1, r6, sl + add r0, r1, r0 + add r0, ip, r0 + add r1, r4, r0 + mov r0, r1, lsr #0x1a + orr r0, r0, r1, lsl #6 + ldrb r1, [r8, #1] + add r4, r5, r0 + mvn r0, r6 + orr r0, r4, r0 + ldr ip, [r2, r1, lsl #2] + eor r0, r5, r0 + add r0, r0, ip + ldr sl, [fp, #4] + ldrb ip, [r8, #2] + add r0, sl, r0 + add r7, r7, r0 + mov r0, r7, lsr #0x16 + orr r0, r0, r7, lsl #10 + add r7, r4, r0 + mvn r0, r5 + orr r0, r7, r0 + ldr r1, [fp, #8] + ldrb lr, [r8, #3] + ldr ip, [r2, ip, lsl #2] + eor r0, r4, r0 + add r0, r0, ip + add r0, r1, r0 + add r6, r6, r0 + mov r1, r6, lsr #0x11 + orr r1, r1, r6, lsl #15 + add sb, sb, #1 + mvn sl, r4 + add r6, r7, r1 + orr r1, r6, sl + ldr r0, [r2, lr, lsl #2] + eor r1, r7, r1 + ldr fp, [fp, #0xc] + add r0, r1, r0 + add r0, fp, r0 + add r1, r5, r0 + mov r0, r1, lsr #0xb + orr r0, r0, r1, lsl #21 + add r8, r8, #4 + add r5, r6, r0 + add r3, r3, #4 + cmp sb, #4 + blt _020ABD8C + ldr r0, [sp] + ldr r0, [r0] + add r1, r0, r4 + ldr r0, [sp] + str r1, [r0] + ldr r0, [r0, #4] + add r1, r0, r5 + ldr r0, [sp] + str r1, [r0, #4] + ldr r0, [r0, #8] + add r1, r0, r6 + ldr r0, [sp] + str r1, [r0, #8] + ldr r0, [r0, #0xc] + add r1, r0, r7 + ldr r0, [sp] + str r1, [r0, #0xc] + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020ABEB8: .word _02110718 +_020ABEBC: .word _02110798 + arm_func_end CPSi_md5_block + + arm_func_start CPSi_md5_init +CPSi_md5_init: ; 0x020ABEC0 + stmdb sp!, {r4, lr} + mov r1, #0 + mov r2, #0x58 + mov r4, r0 + bl MI_CpuFill8 + ldr r1, _020ABEF8 ; =0x67452301 + ldr r0, _020ABEFC ; =0xEFCDAB89 + str r1, [r4] + ldr r1, _020ABF00 ; =0x98BADCFE + str r0, [r4, #4] + ldr r0, _020ABF04 ; =0x10325476 + str r1, [r4, #8] + str r0, [r4, #0xc] + ldmia sp!, {r4, pc} + .align 2, 0 +_020ABEF8: .word 0x67452301 +_020ABEFC: .word 0xEFCDAB89 +_020ABF00: .word 0x98BADCFE +_020ABF04: .word 0x10325476 + arm_func_end CPSi_md5_init + + arm_func_start CPSi_md5_calc +CPSi_md5_calc: ; 0x020ABF08 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldr r3, [r8, #0x10] + mov r6, r2 + add r0, r3, r6, lsl #3 + str r0, [r8, #0x10] + cmp r0, r6, lsl #3 + ldrlo r0, [r8, #0x14] + mov r2, r3, lsr #3 + addlo r0, r0, #1 + strlo r0, [r8, #0x14] + ldr r0, [r8, #0x14] + and r4, r2, #0x3f + rsb r5, r4, #0x40 + add r0, r0, r6, lsr #29 + mov r7, r1 + str r0, [r8, #0x14] + cmp r6, r5 + blo _020ABFA4 + add r1, r8, #0x18 + mov r0, r7 + mov r2, r5 + add r1, r1, r4 + bl MI_CpuCopy8 + mov r0, r8 + add r1, r8, #0x18 + mov r4, #0 + bl CPSi_md5_block + add r0, r5, #0x3f + cmp r0, r6 + bhs _020ABFA8 +_020ABF84: + mov r0, r8 + add r1, r7, r5 + bl CPSi_md5_block + add r5, r5, #0x40 + add r0, r5, #0x3f + cmp r0, r6 + blo _020ABF84 + b _020ABFA8 +_020ABFA4: + mov r5, #0 +_020ABFA8: + add r1, r8, #0x18 + add r0, r7, r5 + add r1, r1, r4 + sub r2, r6, r5 + bl MI_CpuCopy8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end CPSi_md5_calc + + arm_func_start CPSi_md5_result +CPSi_md5_result: ; 0x020ABFC0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, r4 + add r1, r5, #0x10 + mov r2, #8 + bl char_from_long + ldr r0, [r5, #0x10] + ldr r1, _020AC024 ; =_02110758 + mov r0, r0, lsr #3 + and r0, r0, #0x3f + cmp r0, #0x38 + rsblt r2, r0, #0x38 + rsbge r2, r0, #0x78 + mov r0, r5 + bl CPSi_md5_calc + mov r0, r5 + mov r1, r4 + mov r2, #8 + bl CPSi_md5_calc + mov r0, r4 + mov r1, r5 + mov r2, #0x10 + bl char_from_long + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AC024: .word _02110758 + arm_func_end CPSi_md5_result + + arm_func_start R +R: ; 0x020AC028 + add r2, r0, #0xd + add ip, r0, #2 + and r3, r2, #0xf + eor r2, r0, #8 + and ip, ip, #0xf + ldr r3, [r1, r3, lsl #2] + ldr r2, [r1, r2, lsl #2] + ldr ip, [r1, ip, lsl #2] + eor r2, r3, r2 + ldr r3, [r1, r0, lsl #2] + eor r2, ip, r2 + eor r3, r3, r2 + mov r2, r3, lsr #0x1f + orr r2, r2, r3, lsl #1 + str r2, [r1, r0, lsl #2] + mov r0, r2 + bx lr + arm_func_end R + + arm_func_start char_from_long__sha1 +char_from_long__sha1: ; 0x020AC06C + stmdb sp!, {r3, lr} + movs r2, r2, lsr #2 + mov lr, #0 + ldmeqia sp!, {r3, pc} +_020AC07C: + ldr ip, [r1], #4 + add lr, lr, #1 + mov r3, ip, lsr #0x18 + strb r3, [r0] + mov r3, ip, lsr #0x10 + strb r3, [r0, #1] + mov r3, ip, lsr #8 + strb r3, [r0, #2] + strb ip, [r0, #3] + cmp lr, r2 + add r0, r0, #4 + blo _020AC07C + ldmia sp!, {r3, pc} + arm_func_end char_from_long__sha1 + + arm_func_start long_from_char__sha1 +long_from_char__sha1: ; 0x020AC0B0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 + cmp r2, #0 + ldmlsia sp!, {r3, r4, r5, pc} +_020AC0C0: + add r4, r1, r5 + ldrb r3, [r4, #1] + ldrb ip, [r1, r5] + ldrb lr, [r4, #2] + mov r3, r3, lsl #0x10 + orr r3, r3, ip, lsl #24 + ldrb ip, [r4, #3] + orr r3, r3, lr, lsl #8 + add r5, r5, #4 + orr r3, ip, r3 + cmp r5, r2 + str r3, [r0], #4 + blo _020AC0C0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end long_from_char__sha1 + + arm_func_start CPSi_sha1_block +CPSi_sha1_block: ; 0x020AC0F8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x50 + str r0, [sp] + ldr r3, [sp] + add r0, sp, #0x10 + ldmia r3, {r4, r5, r7, r8, sb} + mov r2, #0x40 + bl long_from_char__sha1 + mov r0, #0 + ldr r3, _020AC770 ; =0x5A827999 + mov r2, r0 + add r1, sp, #0x10 +_020AC128: + eor r6, r7, r8 + mov sl, r4, lsr #0x1b + and r6, r5, r6 + orr fp, sl, r4, lsl #5 + eor r6, r8, r6 + mov sl, r5, lsr #2 + orr sl, sl, r5, lsl #30 + add r5, r1, r0, lsl #2 + add r6, fp, r6 + ldr ip, [r1, r0, lsl #2] + ldr fp, [r5, #4] + add r6, ip, r6 + add r6, r6, r3 + add sb, sb, r6 + mov r6, sb, lsr #0x1b + orr r6, r6, sb, lsl #5 + eor ip, sl, r7 + and ip, r4, ip + eor ip, r7, ip + add r6, r6, ip + add r6, fp, r6 + add r6, r6, r3 + add r8, r8, r6 + mov r6, r4, lsr #2 + orr r4, r6, r4, lsl #30 + ldr fp, [r5, #8] + mov r6, r8, lsr #0x1b + orr r6, r6, r8, lsl #5 + eor ip, r4, sl + and ip, sb, ip + eor ip, sl, ip + add r6, r6, ip + add r6, fp, r6 + add r6, r6, r3 + add r6, r7, r6 + mov r7, sb, lsr #2 + orr sb, r7, sb, lsl #30 + ldr r7, [r5, #0xc] + ldr fp, [r5, #0x10] + mov r5, r6, lsr #0x1b + orr r5, r5, r6, lsl #5 + eor ip, sb, r4 + and ip, r8, ip + eor ip, r4, ip + add r5, r5, ip + add r5, r7, r5 + add r5, r5, r3 + add r5, sl, r5 + mov r7, r8, lsr #2 + orr r8, r7, r8, lsl #30 + mov r7, r5, lsr #0x1b + orr r7, r7, r5, lsl #5 + eor sl, r8, sb + and sl, r6, sl + eor sl, sb, sl + add r7, r7, sl + add r7, fp, r7 + add r7, r7, r3 + add r4, r4, r7 + mov r7, r6, lsr #2 + orr r7, r7, r6, lsl #30 + add r0, r0, #5 + add r2, r2, #1 + cmp r2, #3 + blt _020AC128 + eor r0, r7, r8 + mov r2, r4, lsr #0x1b + and r0, r5, r0 + orr r3, r2, r4, lsl #5 + eor r0, r8, r0 + add r3, r3, r0 + ldr r6, [sp, #0x4c] + ldr r0, _020AC770 ; =0x5A827999 + add r3, r6, r3 + add r3, r3, r0 + mov r2, r5, lsr #2 + orr r6, r2, r5, lsl #30 + mov r0, #0 + add sb, sb, r3 + bl R + eor r1, r6, r7 + mov r3, sb, lsr #0x1b + and r1, r4, r1 + mov r2, r4, lsr #2 + orr r3, r3, sb, lsl #5 + eor r1, r7, r1 + add r1, r3, r1 + add r3, r1, r0 + ldr r0, _020AC770 ; =0x5A827999 + add r1, sp, #0x10 + add r3, r3, r0 + orr r5, r2, r4, lsl #30 + mov r0, #1 + add r8, r8, r3 + bl R + eor r1, r5, r6 + mov r2, r8, lsr #0x1b + and r1, sb, r1 + orr r2, r2, r8, lsl #5 + eor r1, r6, r1 + add r1, r2, r1 + add r2, r1, r0 + ldr r0, _020AC770 ; =0x5A827999 + mov r1, sb, lsr #2 + add r0, r2, r0 + orr sb, r1, sb, lsl #30 + add r7, r7, r0 + add r1, sp, #0x10 + mov r0, #2 + bl R + mov r1, r7, lsr #0x1b + orr r2, r1, r7, lsl #5 + eor r1, sb, r5 + and r1, r8, r1 + eor r1, r5, r1 + add r1, r2, r1 + add r2, r1, r0 + ldr r0, _020AC770 ; =0x5A827999 + mov r1, r8, lsr #2 + add r0, r2, r0 + orr r8, r1, r8, lsl #30 + add r6, r6, r0 + mov r0, #3 + add r1, sp, #0x10 + bl R + mov r1, r6, lsr #0x1b + orr r2, r1, r6, lsl #5 + eor r1, r8, sb + and r1, r7, r1 + eor r1, sb, r1 + add r1, r2, r1 + add r2, r1, r0 + ldr r0, _020AC770 ; =0x5A827999 + mov r1, r7, lsr #2 + add r0, r2, r0 + add r5, r5, r0 + mov r0, #0 + ldr r4, _020AC774 ; =0x6ED9EBA1 + orr r7, r1, r7, lsl #30 + mov sl, #4 + str r0, [sp, #4] + add fp, sp, #0x10 +_020AC360: + mov r0, sl + mov r1, fp + bl R + mov r2, r5, lsr #0x1b + eor r1, r6, r7 + orr r2, r2, r5, lsl #5 + eor r1, r8, r1 + add r1, r2, r1 + add r0, r1, r0 + add r1, r0, r4 + mov r0, r6, lsr #2 + add sb, sb, r1 + orr r6, r0, r6, lsl #30 + add r0, sl, #1 + mov r1, fp + bl R + mov r1, sb, lsr #0x1b + orr r2, r1, sb, lsl #5 + eor r1, r5, r6 + eor r1, r7, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r8, r8, r0 + mov r0, r5, lsr #2 + orr r5, r0, r5, lsl #30 + add r0, sl, #2 + and sl, r0, #0xf + mov r0, sl + mov r1, fp + bl R + mov r1, r8, lsr #0x1b + orr r2, r1, r8, lsl #5 + eor r1, sb, r5 + eor r1, r6, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r7, r7, r0 + mov r0, sb, lsr #2 + orr sb, r0, sb, lsl #30 + add r0, sl, #1 + mov r1, fp + bl R + mov r1, r7, lsr #0x1b + orr r2, r1, r7, lsl #5 + eor r1, r8, sb + eor r1, r5, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r6, r6, r0 + mov r0, r8, lsr #2 + orr r8, r0, r8, lsl #30 + add r0, sl, #2 + mov r1, fp + bl R + mov r1, r6, lsr #0x1b + orr r2, r1, r6, lsl #5 + eor r1, r7, r8 + eor r1, sb, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r5, r5, r0 + mov r1, r7, lsr #2 + ldr r0, [sp, #4] + add r0, r0, #1 + str r0, [sp, #4] + cmp r0, #4 + orr r7, r1, r7, lsl #30 + add sl, sl, #3 + blt _020AC360 + mov r0, #0 + ldr r4, _020AC778 ; =0x8F1BBCDC + str r0, [sp, #8] + add fp, sp, #0x10 +_020AC494: + mov r0, sl + mov r1, fp + bl R + orr r2, r7, r8 + mov r1, r5, lsr #0x1b + orr r1, r1, r5, lsl #5 + and r3, r6, r2 + and r2, r7, r8 + orr r2, r3, r2 + add r1, r1, r2 + add r1, r1, r0 + mov r0, r6, lsr #2 + add r1, r1, r4 + add sb, sb, r1 + orr r6, r0, r6, lsl #30 + add r0, sl, #1 + mov r1, fp + bl R + mov r1, sb, lsr #0x1b + orr r1, r1, sb, lsl #5 + orr r2, r6, r7 + and r3, r5, r2 + and r2, r6, r7 + orr r2, r3, r2 + add r1, r1, r2 + add r0, r1, r0 + add r0, r0, r4 + add r8, r8, r0 + mov r0, r5, lsr #2 + orr r5, r0, r5, lsl #30 + add r0, sl, #2 + mov r1, fp + bl R + mov r1, r8, lsr #0x1b + orr r1, r1, r8, lsl #5 + orr r2, r5, r6 + and r3, sb, r2 + and r2, r5, r6 + orr r2, r3, r2 + add r1, r1, r2 + add r0, r1, r0 + add r0, r0, r4 + add r7, r7, r0 + mov r0, sb, lsr #2 + orr sb, r0, sb, lsl #30 + add r0, sl, #3 + and sl, r0, #0xf + mov r0, sl + mov r1, fp + bl R + mov r1, r7, lsr #0x1b + orr r1, r1, r7, lsl #5 + orr r2, sb, r5 + and r3, r8, r2 + and r2, sb, r5 + orr r2, r3, r2 + add r1, r1, r2 + add r0, r1, r0 + add r0, r0, r4 + add r6, r6, r0 + mov r0, r8, lsr #2 + orr r8, r0, r8, lsl #30 + add r0, sl, #1 + mov r1, fp + bl R + mov r1, r6, lsr #0x1b + orr r1, r1, r6, lsl #5 + orr r2, r8, sb + and r3, r7, r2 + and r2, r8, sb + orr r2, r3, r2 + add r1, r1, r2 + add r0, r1, r0 + add r0, r0, r4 + add r5, r5, r0 + mov r1, r7, lsr #2 + ldr r0, [sp, #8] + add r0, r0, #1 + str r0, [sp, #8] + cmp r0, #4 + orr r7, r1, r7, lsl #30 + add sl, sl, #2 + blt _020AC494 + mov r0, #0 + ldr r4, _020AC77C ; =0xCA62C1D6 + str r0, [sp, #0xc] + add fp, sp, #0x10 +_020AC5F0: + mov r0, sl + mov r1, fp + bl R + mov r2, r5, lsr #0x1b + eor r1, r6, r7 + orr r2, r2, r5, lsl #5 + eor r1, r8, r1 + add r1, r2, r1 + add r0, r1, r0 + add r1, r0, r4 + mov r0, r6, lsr #2 + add sb, sb, r1 + orr r6, r0, r6, lsl #30 + add r0, sl, #1 + mov r1, fp + bl R + mov r1, sb, lsr #0x1b + orr r2, r1, sb, lsl #5 + eor r1, r5, r6 + eor r1, r7, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r8, r8, r0 + mov r0, r5, lsr #2 + orr r5, r0, r5, lsl #30 + add r0, sl, #2 + mov r1, fp + bl R + mov r1, r8, lsr #0x1b + orr r2, r1, r8, lsl #5 + eor r1, sb, r5 + eor r1, r6, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r7, r7, r0 + mov r0, sb, lsr #2 + orr sb, r0, sb, lsl #30 + add r0, sl, #3 + mov r1, fp + bl R + mov r1, r7, lsr #0x1b + orr r2, r1, r7, lsl #5 + eor r1, r8, sb + eor r1, r5, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r6, r6, r0 + mov r0, r8, lsr #2 + orr r8, r0, r8, lsl #30 + add r0, sl, #4 + and sl, r0, #0xf + mov r0, sl + mov r1, fp + bl R + mov r1, r6, lsr #0x1b + orr r2, r1, r6, lsl #5 + eor r1, r7, r8 + eor r1, sb, r1 + add r1, r2, r1 + add r0, r1, r0 + add r0, r0, r4 + add r5, r5, r0 + mov r1, r7, lsr #2 + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + cmp r0, #4 + orr r7, r1, r7, lsl #30 + add sl, sl, #1 + blt _020AC5F0 + ldr r0, [sp] + ldr r0, [r0] + add r1, r0, r5 + ldr r0, [sp] + str r1, [r0] + ldr r0, [r0, #4] + add r1, r0, r6 + ldr r0, [sp] + str r1, [r0, #4] + ldr r0, [r0, #8] + add r1, r0, r7 + ldr r0, [sp] + str r1, [r0, #8] + ldr r0, [r0, #0xc] + add r1, r0, r8 + ldr r0, [sp] + str r1, [r0, #0xc] + ldr r0, [r0, #0x10] + add r1, r0, sb + ldr r0, [sp] + str r1, [r0, #0x10] + add sp, sp, #0x50 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AC770: .word 0x5A827999 +_020AC774: .word 0x6ED9EBA1 +_020AC778: .word 0x8F1BBCDC +_020AC77C: .word 0xCA62C1D6 + arm_func_end CPSi_sha1_block + + arm_func_start CPSi_sha1_init +CPSi_sha1_init: ; 0x020AC780 + stmdb sp!, {r4, lr} + mov r1, #0 + mov r2, #0x5c + mov r4, r0 + bl MI_CpuFill8 + ldr r0, _020AC7C0 ; =0x67452301 + ldr r1, _020AC7C4 ; =0xEFCDAB89 + str r0, [r4] + ldr r0, _020AC7C8 ; =0x98BADCFE + str r1, [r4, #4] + ldr r1, _020AC7CC ; =0x10325476 + str r0, [r4, #8] + ldr r0, _020AC7D0 ; =0xC3D2E1F0 + str r1, [r4, #0xc] + str r0, [r4, #0x10] + ldmia sp!, {r4, pc} + .align 2, 0 +_020AC7C0: .word 0x67452301 +_020AC7C4: .word 0xEFCDAB89 +_020AC7C8: .word 0x98BADCFE +_020AC7CC: .word 0x10325476 +_020AC7D0: .word 0xC3D2E1F0 + arm_func_end CPSi_sha1_init + + arm_func_start CPSi_sha1_calc +CPSi_sha1_calc: ; 0x020AC7D4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldr r3, [r8, #0x18] + mov r6, r2 + add r0, r3, r6, lsl #3 + str r0, [r8, #0x18] + cmp r0, r6, lsl #3 + ldrlo r0, [r8, #0x14] + mov r2, r3, lsr #3 + addlo r0, r0, #1 + strlo r0, [r8, #0x14] + ldr r0, [r8, #0x14] + and r4, r2, #0x3f + rsb r5, r4, #0x40 + add r0, r0, r6, lsr #29 + mov r7, r1 + str r0, [r8, #0x14] + cmp r6, r5 + blo _020AC870 + add r1, r8, #0x1c + mov r0, r7 + mov r2, r5 + add r1, r1, r4 + bl MI_CpuCopy8 + mov r0, r8 + add r1, r8, #0x1c + mov r4, #0 + bl CPSi_sha1_block + add r0, r5, #0x3f + cmp r0, r6 + bhs _020AC874 +_020AC850: + mov r0, r8 + add r1, r7, r5 + bl CPSi_sha1_block + add r5, r5, #0x40 + add r0, r5, #0x3f + cmp r0, r6 + blo _020AC850 + b _020AC874 +_020AC870: + mov r5, #0 +_020AC874: + add r1, r8, #0x1c + add r0, r7, r5 + add r1, r1, r4 + sub r2, r6, r5 + bl MI_CpuCopy8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end CPSi_sha1_calc + + arm_func_start CPSi_sha1_result +CPSi_sha1_result: ; 0x020AC88C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r0, r4 + add r1, r5, #0x14 + mov r2, #8 + bl char_from_long__sha1 + ldr r0, [r5, #0x18] + ldr r1, _020AC8F0 ; =_02110898 + mov r0, r0, lsr #3 + and r0, r0, #0x3f + cmp r0, #0x38 + rsblt r2, r0, #0x38 + rsbge r2, r0, #0x78 + mov r0, r5 + bl CPSi_sha1_calc + mov r0, r5 + mov r1, r4 + mov r2, #8 + bl CPSi_sha1_calc + mov r0, r4 + mov r1, r5 + mov r2, #0x14 + bl char_from_long__sha1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AC8F0: .word _02110898 + arm_func_end CPSi_sha1_result + + arm_func_start CPSi_sha1_result_prng +CPSi_sha1_result_prng: ; 0x020AC8F4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldr r1, _020AC920 ; =_02110899 + mov r5, r0 + mov r2, #0x2c + bl CPSi_sha1_calc + mov r0, r4 + mov r1, r5 + mov r2, #0x14 + bl char_from_long__sha1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AC920: .word _02110899 + arm_func_end CPSi_sha1_result_prng + + arm_func_start CPSi_rc4_init +CPSi_rc4_init: ; 0x020AC924 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r3, #0 + strb r3, [r0] + strb r3, [r0, #1] + add r4, r0, #2 +_020AC938: + strb r3, [r4, r3] + add r3, r3, #1 + cmp r3, #0x100 + blt _020AC938 + mov r6, #0 + mov r5, r6 + mov r7, r6 + mov r0, r6 +_020AC958: + ldrb lr, [r4, r7] + ldrb ip, [r1, r6] + add r3, r6, #1 + and r6, r3, #0xff + add r3, lr, ip + add r3, r5, r3 + and r5, r3, #0xff + ldrb r3, [r4, r5] + cmp r6, r2 + movge r6, r0 + strb r3, [r4, r7] + add r7, r7, #1 + strb lr, [r4, r5] + cmp r7, #0x100 + blt _020AC958 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CPSi_rc4_init + + arm_func_start CPSi_rc4_crypt +CPSi_rc4_crypt: ; 0x020AC998 + stmdb sp!, {r4, r5, r6, lr} + cmp r2, #0 + add r4, r0, #2 + ldrb ip, [r0] + ldrb lr, [r0, #1] + mov r3, #0 + ble _020AC9F8 +_020AC9B4: + add r5, ip, #1 + and ip, r5, #0xff + ldrb r6, [r4, ip] + add r5, lr, r6 + and lr, r5, #0xff + ldrb r5, [r4, lr] + strb r5, [r4, ip] + add r5, r6, r5 + strb r6, [r4, lr] + and r5, r5, #0xff + ldrb r6, [r1, r3] + ldrb r5, [r4, r5] + eor r5, r6, r5 + strb r5, [r1, r3] + add r3, r3, #1 + cmp r3, r2 + blt _020AC9B4 +_020AC9F8: + strb ip, [r0] + strb lr, [r0, #1] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end CPSi_rc4_crypt + + arm_func_start count_digits +count_digits: ; 0x020ACA04 + b _020ACA0C +_020ACA08: + sub r1, r1, #1 +_020ACA0C: + cmp r1, #0 + beq _020ACA24 + add r2, r0, r1, lsl #1 + ldrh r2, [r2, #-2] + cmp r2, #0 + beq _020ACA08 +_020ACA24: + mov r0, r1 + bx lr + arm_func_end count_digits + + arm_func_start CPSi_big_sign +CPSi_big_sign: ; 0x020ACA2C + stmdb sp!, {r3, lr} + sub r2, r1, #1 + mov r2, r2, lsl #1 + ldrh r2, [r0, r2] + tst r2, #0x8000 + mvnne r0, #0 + ldmneia sp!, {r3, pc} + bl count_digits + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + ldmia sp!, {r3, pc} + arm_func_end CPSi_big_sign + + arm_func_start CPSi_big_add +CPSi_big_add: ; 0x020ACA5C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r5, r3 + mov r8, r0 + mov r6, r2 + mov r0, r7 + mov r1, r5 + bl count_digits + mov r4, r0 + mov r0, r6 + mov r1, r5 + bl count_digits + cmp r4, r0 + movlt r4, r0 + cmp r4, r5 + addne r4, r4, #1 + mov ip, #0 + mov r3, ip + cmp r4, #0 + ble _020ACAD4 +_020ACAAC: + mov r2, r3, lsl #1 + ldrh r1, [r7, r2] + ldrh r0, [r6, r2] + add r3, r3, #1 + cmp r3, r4 + add r0, r1, r0 + add r0, ip, r0 + strh r0, [r8, r2] + mov ip, r0, lsr #0x10 + blt _020ACAAC +_020ACAD4: + cmp r8, r7 + cmpne r8, r6 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + sub r1, r5, r3 + add r0, r8, r3, lsl #1 + mov r2, r1, lsl #1 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end CPSi_big_add + + arm_func_start CPSi_big_add_small +CPSi_big_add_small: ; 0x020ACAF8 + stmdb sp!, {r4, lr} + cmp r3, #0 + mov r4, #0 + ble _020ACB2C +_020ACB08: + mov lr, r4, lsl #1 + ldrh ip, [r1, lr] + add r2, r2, ip + strh r2, [r0, lr] + movs r2, r2, lsr #0x10 + beq _020ACB2C + add r4, r4, #1 + cmp r4, r3 + blt _020ACB08 +_020ACB2C: + cmp r0, r1 + ldmeqia sp!, {r4, pc} + add r4, r4, #1 + cmp r4, r3 + ldmgeia sp!, {r4, pc} +_020ACB40: + mov ip, r4, lsl #1 + ldrh r2, [r1, ip] + add r4, r4, #1 + cmp r4, r3 + strh r2, [r0, ip] + blt _020ACB40 + ldmia sp!, {r4, pc} + arm_func_end CPSi_big_add_small + + arm_func_start CPSi_big_negate +CPSi_big_negate: ; 0x020ACB5C + stmdb sp!, {r3, lr} + mov r3, r1 + cmp r3, #0 + mov ip, #0 + ble _020ACB8C +_020ACB70: + mov r2, ip, lsl #1 + ldrh r1, [r0, r2] + add ip, ip, #1 + cmp ip, r3 + mvn r1, r1 + strh r1, [r0, r2] + blt _020ACB70 +_020ACB8C: + mov r1, r0 + mov r2, #1 + bl CPSi_big_add_small + ldmia sp!, {r3, pc} + arm_func_end CPSi_big_negate + + arm_func_start CPSi_big_sub +CPSi_big_sub: ; 0x020ACB9C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r5, r3 + mov r8, r0 + mov r6, r2 + mov r0, r7 + mov r1, r5 + bl count_digits + mov r4, r0 + mov r0, r6 + mov r1, r5 + bl count_digits + cmp r4, r0 + movlt r4, r0 + mov ip, #0 + cmp r4, r5 + addne r4, r4, #1 + mov r3, ip + b _020ACC08 +_020ACBE8: + mov r2, r3, lsl #1 + ldrh r1, [r7, r2] + ldrh r0, [r6, r2] + add r3, r3, #1 + sub r0, r1, r0 + add r0, ip, r0 + strh r0, [r8, r2] + mov ip, r0, asr #0x10 +_020ACC08: + cmp r3, r4 + blt _020ACBE8 + cmp r3, r5 + bge _020ACC20 + cmp ip, #0 + bne _020ACBE8 +_020ACC20: + cmp r8, r7 + cmpne r8, r6 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + sub r1, r5, r3 + add r0, r8, r3, lsl #1 + mov r2, r1, lsl #1 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end CPSi_big_sub + + arm_func_start CPSi_big_sub_small +CPSi_big_sub_small: ; 0x020ACC44 + stmdb sp!, {r4, lr} + cmp r3, #0 + mov r4, #0 + ble _020ACC7C +_020ACC54: + mov lr, r4, lsl #1 + ldrh ip, [r1, lr] + sub ip, ip, r2 + mov r2, ip, lsr #0x10 + strh ip, [r0, lr] + ands r2, r2, #1 + beq _020ACC7C + add r4, r4, #1 + cmp r4, r3 + blt _020ACC54 +_020ACC7C: + cmp r0, r1 + ldmeqia sp!, {r4, pc} + add r4, r4, #1 + cmp r4, r3 + ldmgeia sp!, {r4, pc} +_020ACC90: + mov ip, r4, lsl #1 + ldrh r2, [r1, ip] + add r4, r4, #1 + cmp r4, r3 + strh r2, [r0, ip] + blt _020ACC90 + ldmia sp!, {r4, pc} + arm_func_end CPSi_big_sub_small + + arm_func_start CPSi_big_compare +CPSi_big_compare: ; 0x020ACCAC + subs ip, r2, #1 + bmi _020ACCDC +_020ACCB4: + mov r2, ip, lsl #1 + ldrh r3, [r1, r2] + ldrh r2, [r0, r2] + cmp r2, r3 + movhi r0, #1 + bxhi lr + mvnlo r0, #0 + bxlo lr + subs ip, ip, #1 + bpl _020ACCB4 +_020ACCDC: + mov r0, #0 + bx lr + arm_func_end CPSi_big_compare + + arm_func_start CPSi_big_add_part +CPSi_big_add_part: ; 0x020ACCE4 + stmdb sp!, {r3, lr} + b _020ACD04 +_020ACCEC: + mov lr, r2, lsl #1 + ldrh ip, [r0, lr] + add r2, r2, #1 + add r1, r1, ip + strh r1, [r0, lr] + mov r1, r1, lsr #0x10 +_020ACD04: + cmp r1, #0 + ldmeqia sp!, {r3, pc} + cmp r2, r3 + blt _020ACCEC + ldmia sp!, {r3, pc} + arm_func_end CPSi_big_add_part + + arm_func_start CPSi_big_mult +CPSi_big_mult: ; 0x020ACD18 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r8, r3 + mov sl, r1 + mov sb, r2 + mov r2, r8, lsl #1 + mov r1, #0 + str r0, [sp] + bl MI_CpuFill8 + mov r0, sl + mov r1, r8 + bl count_digits + mov fp, r0 + mov r0, sb + mov r1, r8 + bl count_digits + str r0, [sp, #4] + cmp r0, #0 + mov r5, #0 + addle sp, sp, #8 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020ACD6C: + mov r6, #0 + sub r7, r8, r5 + mov r4, r5, lsl #1 + b _020ACDA0 +_020ACD7C: + mov r0, r6, lsl #1 + ldrh r3, [sl, r0] + ldrh r1, [sb, r4] + ldr r0, [sp] + add r2, r5, r6 + mul r1, r3, r1 + mov r3, r8 + bl CPSi_big_add_part + add r6, r6, #1 +_020ACDA0: + cmp r6, fp + cmplt r6, r7 + blt _020ACD7C + ldr r0, [sp, #4] + add r5, r5, #1 + cmp r5, r0 + blt _020ACD6C + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end CPSi_big_mult + + arm_func_start CPSi_big_mult_small +CPSi_big_mult_small: ; 0x020ACDC4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r4, r3 + mov r7, r0 + mov r0, r6 + mov r1, r4 + mov r5, r2 + bl count_digits + mov r3, #0 + mov ip, r3 + cmp r0, #0 + ble _020ACE14 +_020ACDF4: + mov r2, ip, lsl #1 + ldrh r1, [r6, r2] + add ip, ip, #1 + cmp ip, r0 + mla r1, r5, r1, r3 + strh r1, [r7, r2] + mov r3, r1, lsr #0x10 + blt _020ACDF4 +_020ACE14: + cmp ip, r4 + movlt r0, ip, lsl #1 + addlt ip, ip, #1 + sub r1, r4, ip + strlth r3, [r7, r0] + mov r2, r1, lsl #1 + add r0, r7, ip, lsl #1 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CPSi_big_mult_small + + arm_func_start CPSi_big_sqr +CPSi_big_sqr: ; 0x020ACE3C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, r1 + mov r8, r2 + mov sl, r0 + mov r0, sb + mov r1, r8 + bl count_digits + mov fp, r0 + cmp r8, fp, lsl #1 + mov r0, fp, lsl #1 + ble _020ACE7C + sub r1, r8, r0 + add r0, sl, r0, lsl #1 + mov r2, r1, lsl #1 + mov r1, #0 + bl MI_CpuFill8 +_020ACE7C: + cmp fp, #0 + mov r4, #0 + ble _020ACED0 + mov r5, r4 + sub r2, r8, #1 +_020ACE90: + cmp r5, r8 + bge _020ACED0 + mov r0, r4, lsl #1 + ldrh r3, [sb, r0] + mov r0, r5, lsl #1 + cmp r5, r2 + mul r1, r3, r3 + strh r1, [sl, r0] + beq _020ACED0 + add r4, r4, #1 + mov r1, r1, lsr #0x10 + add r0, sl, r0 + strh r1, [r0, #2] + cmp r4, fp + add r5, r5, #2 + blt _020ACE90 +_020ACED0: + mov r6, #0 + cmp fp, #0 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_020ACEDC: + mov r0, r6, lsl #1 + add r4, r6, #1 + str r0, [sp] + b _020ACF4C +_020ACEEC: + mov r0, r4, lsl #1 + ldrh r1, [sb, r0] + ldr r0, [sp] + ldrh r0, [sb, r0] + mul r7, r1, r0 + ldr r0, _020ACF6C ; =0x7FFF8000 + cmp r7, r0 + mov r0, sl + bhi _020ACF24 + mov r2, r5 + mov r3, r8 + mov r1, r7, lsl #1 + bl CPSi_big_add_part + b _020ACF48 +_020ACF24: + mov r1, r7 + mov r2, r5 + mov r3, r8 + bl CPSi_big_add_part + mov r1, r7 + mov r2, r5 + mov r0, sl + mov r3, r8 + bl CPSi_big_add_part +_020ACF48: + add r4, r4, #1 +_020ACF4C: + cmp r4, fp + addlt r5, r6, r4 + cmplt r5, r8 + blt _020ACEEC + add r6, r6, #1 + cmp r6, fp + blt _020ACEDC + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020ACF6C: .word 0x7FFF8000 + arm_func_end CPSi_big_sqr + + arm_func_start get48bits_1 +get48bits_1: ; 0x020ACF70 + ldrh r1, [r0] + mov r0, #0 + bx lr + arm_func_end get48bits_1 + + arm_func_start get48bits_2 +get48bits_2: ; 0x020ACF7C + ldrh r1, [r0] + ldrh r0, [r0, #-2] + mov r0, r0, lsl #0x10 + bx lr + arm_func_end get48bits_2 + + arm_func_start get48bits_3 +get48bits_3: ; 0x020ACF8C + ldrh r1, [r0] + ldrh r2, [r0, #-2] + ldrh r3, [r0, #-4] + orr r0, r3, r2, lsl #16 + bx lr + arm_func_end get48bits_3 + + arm_func_start get64bits +get64bits: ; 0x020ACFA0 + ldrh r2, [r0] + ldrh r3, [r0, #-2] + orr r1, r3, r2, lsl #16 + ldrh r2, [r0, #-4] + ldrh r3, [r0, #-6] + orr r0, r3, r2, lsl #16 + bx lr + arm_func_end get64bits + + arm_func_start CPSi_big_div +CPSi_big_div: ; 0x020ACFBC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x20 + ldr sb, [sp, #0x48] + ldr r8, [sp, #0x4c] + str r1, [sp, #4] + add r6, r8, sb, lsl #1 + str r0, [sp] + mov sl, r2 + mov r0, r6 + mov r2, sb, lsl #2 + mov r1, #0 + str r3, [sp, #8] + add r7, r6, sb, lsl #1 + bl MI_CpuFill8 + ldr r0, [sp, #4] + mov r1, sb + bl count_digits + mov fp, r0 + mov r0, sl + mov r1, sb + bl count_digits + mov r5, r0 + cmp fp, #0 + cmpgt r5, #0 + ble _020AD154 + sub r0, sb, fp + add r0, r5, r0 + sub r4, r0, #1 + cmp r4, sb + blt _020AD048 + ldr r0, [sp, #4] + mov r1, r7 + mov r2, sb, lsl #1 + bl MI_CpuCopy8 + b _020AD154 +_020AD048: + ldr r0, [sp, #4] + add r1, r6, r4, lsl #1 + mov r2, fp, lsl #1 + bl MI_CpuCopy8 + cmp r5, #2 + ble _020AD07C + add r0, sl, r5, lsl #1 + sub r0, r0, #2 + mov fp, r5, lsl #1 + bl get48bits_3 + str r0, [sp, #0x18] + str r1, [sp, #0x10] + b _020AD0B0 +_020AD07C: + add r0, sl, r5, lsl #1 + cmp r5, #1 + sub r0, r0, #2 + ble _020AD0A0 + mov fp, r5, lsl #1 + bl get48bits_2 + str r0, [sp, #0x18] + str r1, [sp, #0x10] + b _020AD0B0 +_020AD0A0: + mov fp, r5, lsl #1 + bl get48bits_1 + str r0, [sp, #0x18] + str r1, [sp, #0x10] +_020AD0B0: + cmp r4, sb + bge _020AD154 + mov r0, sb, lsl #1 + sub r0, r0, #1 + mov r0, r0, lsl #1 + str r0, [sp, #0x14] +_020AD0C8: + ldr r2, [sp, #0x14] + mov r1, r6 + add r0, r6, #2 + bl memmove + add r0, r7, fp + bl get64bits + ldr r2, [sp, #0x18] + ldr r3, [sp, #0x10] + bl _ll_udiv + mov r5, r0 + ldr r0, _020AD198 ; =0x0000FFFF + cmp r5, r0 + movhi r5, r0 +_020AD0FC: + mov r2, r5, lsl #0x10 + mov r0, r8 + mov r1, sl + mov r2, r2, lsr #0x10 + mov r3, sb + bl CPSi_big_mult_small + mov r0, r7 + mov r1, r8 + mov r2, sb + bl CPSi_big_compare + cmp r0, #0 + sublt r5, r5, #1 + blt _020AD0FC + mov r0, r7 + mov r1, r7 + mov r2, r8 + mov r3, sb + bl CPSi_big_sub + strh r5, [r6] + add r4, r4, #1 + cmp r4, sb + blt _020AD0C8 +_020AD154: + ldr r0, [sp] + cmp r0, #0 + beq _020AD170 + ldr r1, [sp] + mov r0, r6 + mov r2, sb, lsl #1 + bl MI_CpuCopy8 +_020AD170: + ldr r0, [sp, #8] + cmp r0, #0 + addeq sp, sp, #0x20 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sp, #8] + mov r0, r7 + mov r2, sb, lsl #1 + bl MI_CpuCopy8 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AD198: .word 0x0000FFFF + arm_func_end CPSi_big_div + + arm_func_start CPSi_big_power +CPSi_big_power: ; 0x020AD19C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, _020AD328 ; =_021D4634 + mov r8, r3 + ldr r3, [r4] + mov sl, r0 + mov r0, r8, lsl #3 + ldr r7, [sp, #0x30] + str r1, [sp, #8] + mov sb, r2 + blx r3 + movs r4, r0 + addeq sp, sp, #0xc + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + sub r1, r8, #1 + add r0, sl, #2 + mov r2, r1, lsl #1 + mov r1, #0 + add r5, r4, r8, lsl #1 + bl MI_CpuFill8 + mov r2, #1 + mov r0, sb + mov r1, r8 + strh r2, [sl] + bl count_digits + sub r0, r8, r0 + mov r6, r0, lsl #4 + cmp r6, r8, lsl #4 + bhs _020AD250 + mov r2, #0x8000 +_020AD214: + sub r0, r8, r6, asr #4 + add r0, sb, r0, lsl #1 + ldrh r0, [r0, #-2] + and r1, r6, #0xf + tst r0, r2, lsr r1 + beq _020AD244 + ldr r0, [sp, #8] + mov r1, sl + mov r2, r8, lsl #1 + bl MI_CpuCopy8 + add r6, r6, #1 + b _020AD250 +_020AD244: + add r6, r6, #1 + cmp r6, r8, lsl #4 + blo _020AD214 +_020AD250: + cmp r6, r8, lsl #4 + bhs _020AD310 + mov fp, r8, lsl #1 +_020AD25C: + mov r0, r4 + mov r1, sl + mov r2, r8 + bl CPSi_big_sqr + mov r0, r4 + mov r1, sl + mov r2, fp + bl MI_CpuCopy8 + cmp r7, #0 + beq _020AD2A0 + str r8, [sp] + mov r0, #0 + mov r1, sl + mov r2, r7 + mov r3, sl + str r5, [sp, #4] + bl CPSi_big_div +_020AD2A0: + sub r0, r8, r6, asr #4 + add r0, sb, r0, lsl #1 + ldrh r1, [r0, #-2] + and r2, r6, #0xf + mov r0, #0x8000 + tst r1, r0, lsr r2 + beq _020AD304 + ldr r2, [sp, #8] + mov r0, r4 + mov r1, sl + mov r3, r8 + bl CPSi_big_mult + mov r0, r4 + mov r1, sl + mov r2, fp + bl MI_CpuCopy8 + cmp r7, #0 + beq _020AD304 + str r8, [sp] + mov r0, #0 + mov r1, sl + mov r2, r7 + mov r3, sl + str r5, [sp, #4] + bl CPSi_big_div +_020AD304: + add r6, r6, #1 + cmp r6, r8, lsl #4 + blo _020AD25C +_020AD310: + ldr r1, _020AD32C ; =_021D4660 + mov r0, r4 + ldr r1, [r1] + blx r1 + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AD328: .word _021D4634 +_020AD32C: .word _021D4660 + arm_func_end CPSi_big_power + + arm_func_start CPSi_big_modinv +CPSi_big_modinv: ; 0x020AD330 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr sb, [sp, #0x38] + mov sl, r3 + add fp, sb, sl, lsl #1 + add r4, fp, sl, lsl #1 + add r5, r4, sl, lsl #1 + add r6, r5, sl, lsl #1 + add r7, r6, sl, lsl #1 + str r0, [sp, #8] + mov r0, r1 + add r1, r7, sl, lsl #1 + str r1, [sp, #0x10] + mov r8, sl, lsl #1 + str r2, [sp, #0xc] + mov r1, sb + mov r2, r8 + bl MI_CpuCopy8 + ldr r0, [sp, #0xc] + mov r1, r4 + mov r2, r8 + bl MI_CpuCopy8 + mov r0, #1 + strh r0, [r4, r8] + mov r0, sb + mov r1, sl + bl CPSi_big_sign + cmp r0, #0 + ble _020AD440 +_020AD3A4: + ldr r3, [sp, #0x10] + str sl, [sp] + str r3, [sp, #4] + mov r0, fp + mov r1, r4 + mov r2, sb + mov r3, r7 + bl CPSi_big_div + mov r0, sb + mov r1, r4 + mov r2, r8 + bl MI_CpuCopy8 + mov r0, r7 + mov r1, sb + mov r2, r8 + bl MI_CpuCopy8 + mov r0, r7 + mov r1, fp + mov r2, r5 + mov r3, sl + bl CPSi_big_mult + mov r0, r7 + mov r1, r6 + mov r2, r7 + mov r3, sl + bl CPSi_big_sub + mov r0, r5 + mov r1, r6 + mov r2, r8 + bl MI_CpuCopy8 + mov r0, r7 + mov r1, r5 + mov r2, r8 + bl MI_CpuCopy8 + mov r0, sb + mov r1, sl + bl CPSi_big_sign + cmp r0, #0 + bgt _020AD3A4 +_020AD440: + ldr r2, [sp, #0xc] + mov r0, r6 + mov r1, r6 + mov r3, sl + bl CPSi_big_add + ldr r2, [sp, #0xc] + ldr r3, [sp, #8] + ldr r4, [sp, #0x10] + str sl, [sp] + mov r1, r6 + mov r0, #0 + str r4, [sp, #4] + bl CPSi_big_div + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end CPSi_big_modinv + + arm_func_start CPSi_big_montmult +CPSi_big_montmult: ; 0x020AD47C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r6, r3 + mov r4, r6, lsl #1 + mov r8, r2 + mov r2, r4 + mov r7, r0 + mov sb, r1 + ldr r5, [sp, #0x20] + bl MI_CpuCopy8 + cmp r8, #1 + bne _020AD4BC + mov r0, r7 + mov r1, sb + mov r2, r6 + bl CPSi_big_sqr + b _020AD4D8 +_020AD4BC: + cmp r8, #0 + beq _020AD4D8 + mov r0, r7 + mov r1, sb + mov r2, r8 + mov r3, r6 + bl CPSi_big_mult +_020AD4D8: + ldr r0, [sp, #0x2c] + ldr r2, [sp, #0x28] + mov r1, r7 + mov r3, r5 + bl CPSi_big_mult + sub r1, r6, r5 + ldr r0, [sp, #0x2c] + mov r8, r1, lsl #1 + mov r2, r8 + add r0, r0, r5, lsl #1 + mov r1, #0 + bl MI_CpuFill8 + ldr r0, [sp, #0x30] + ldr r1, [sp, #0x2c] + ldr r2, [sp, #0x24] + mov r3, r6 + bl CPSi_big_mult + mov r0, r7 + mov r1, r7 + ldr r2, [sp, #0x30] + mov r3, r6 + bl CPSi_big_add + mov r2, r8 + mov r0, r7 + add r1, r7, r5, lsl #1 + bl memmove + add r0, r7, r6, lsl #1 + sub r0, r0, r5, lsl #1 + mov r2, r5, lsl #1 + mov r1, #0 + bl MI_CpuFill8 + mov r0, r7 + ldr r1, [sp, #0x24] + mov r2, r6 + bl CPSi_big_compare + cmp r0, #0 + beq _020AD578 + cmp r0, #1 + beq _020AD58C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020AD578: + mov r0, r7 + mov r2, r4 + mov r1, #0 + bl MI_CpuFill8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020AD58C: + ldr r2, [sp, #0x24] + mov r0, r7 + mov r1, r7 + mov r3, r6 + bl CPSi_big_sub + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + arm_func_end CPSi_big_montmult + + arm_func_start CPSi_big_montpower +CPSi_big_montpower: ; 0x020AD5A4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + mov sl, r3 + mov r3, #0x16 + mul r4, sl, r3 + ldr r3, _020AD7A8 ; =_021D4634 + mov fp, r0 + ldr r3, [r3] + mov r0, r4 + ldr sb, [sp, #0x50] + str r1, [sp, #0x14] + str r2, [sp, #0x18] + blx r3 + str r0, [sp, #0x28] + cmp r0, #0 + addeq sp, sp, #0x2c + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r2, r4 + mov r1, #0 + bl MI_CpuFill8 + ldr r0, [sp, #0x28] + mov r1, sl + add r6, r0, sl, lsl #1 + add r0, r6, sl, lsl #1 + add r7, r0, sl, lsl #1 + add r8, r7, sl, lsl #1 + str r0, [sp, #0x24] + add r0, r8, sl, lsl #1 + str r0, [sp, #0x20] + add r5, r0, sl, lsl #1 + mov r0, sb + bl count_digits + mov r4, r0 + ldr r0, [sp, #0x28] + mov r2, #1 + mov r1, r4, lsl #1 + strh r2, [r0, r1] + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + str r0, [sp] + mov r0, r6 + mov r2, sb + mov r3, sl + bl CPSi_big_modinv + ldr r1, [sp, #0x28] + mov r0, r7 + mov r2, r6 + mov r3, sl + bl CPSi_big_mult + mov r0, r6 + mov r1, r7 + mov r2, #1 + mov r3, sl + bl CPSi_big_sub_small + str sl, [sp] + mov r0, r6 + mov r1, r6 + mov r2, sb + mov r3, #0 + str r5, [sp, #4] + bl CPSi_big_div + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x24] + ldr r2, [sp, #0x28] + mov r3, sl + bl CPSi_big_mult + ldr r1, [sp, #0x24] + str sl, [sp] + mov r0, #0 + mov r2, sb + mov r3, r1 + str r5, [sp, #4] + bl CPSi_big_div + str sl, [sp] + ldr r1, [sp, #0x28] + mov r0, #0 + mov r2, sb + mov r3, fp + str r5, [sp, #4] + bl CPSi_big_div + movs r0, r4, lsl #4 + mov r5, #0 + str r0, [sp, #0x1c] + beq _020AD76C +_020AD6F4: + stmia sp, {r4, sb} + str r6, [sp, #8] + str r7, [sp, #0xc] + ldr r1, [sp, #0x20] + mov r0, fp + mov r2, #1 + mov r3, sl + str r8, [sp, #0x10] + bl CPSi_big_montmult + ldr r1, [sp, #0x18] + sub r2, r4, r5, asr #4 + add r1, r1, r2, lsl #1 + ldrh r2, [r1, #-2] + and r0, r5, #0xf + mov r1, #0x8000 + tst r2, r1, lsr r0 + beq _020AD75C + stmia sp, {r4, sb} + str r6, [sp, #8] + str r7, [sp, #0xc] + ldr r1, [sp, #0x20] + ldr r2, [sp, #0x24] + mov r0, fp + mov r3, sl + str r8, [sp, #0x10] + bl CPSi_big_montmult +_020AD75C: + ldr r0, [sp, #0x1c] + add r5, r5, #1 + cmp r5, r0 + blo _020AD6F4 +_020AD76C: + stmia sp, {r4, sb} + str r6, [sp, #8] + str r7, [sp, #0xc] + ldr r1, [sp, #0x20] + mov r0, fp + mov r3, sl + mov r2, #0 + str r8, [sp, #0x10] + bl CPSi_big_montmult + ldr r1, _020AD7AC ; =_021D4660 + ldr r0, [sp, #0x28] + ldr r1, [r1] + blx r1 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020AD7A8: .word _021D4634 +_020AD7AC: .word _021D4660 + arm_func_end CPSi_big_montpower + + arm_func_start CPSi_big_from_char +CPSi_big_from_char: ; 0x020AD7B0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r2 + mov r2, r3, lsl #1 + mov r1, #0 + mov r4, r0 + bl MI_CpuFill8 + sub r0, r5, #1 + cmp r5, #1 + add r6, r6, r0 + ble _020AD7FC +_020AD7DC: + ldrb r1, [r6] + ldrb r0, [r6, #-1] + sub r5, r5, #2 + cmp r5, #1 + add r0, r1, r0, lsl #8 + strh r0, [r4], #2 + sub r6, r6, #2 + bgt _020AD7DC +_020AD7FC: + cmp r5, #0 + ldrgtb r0, [r6] + strgth r0, [r4] + ldmia sp!, {r4, r5, r6, pc} + arm_func_end CPSi_big_from_char + + arm_func_start CPSi_char_from_big +CPSi_char_from_big: ; 0x020AD80C + sub r3, r2, #1 + cmp r2, #1 + add r0, r0, r3 + ble _020AD840 +_020AD81C: + ldrh r3, [r1] + sub ip, r0, #1 + sub r2, r2, #2 + strb r3, [r0], #-2 + ldrh r3, [r1], #2 + cmp r2, #1 + mov r3, r3, asr #8 + strb r3, [ip] + bgt _020AD81C +_020AD840: + cmp r2, #0 + ldrgth r1, [r1] + strgtb r1, [r0] + bx lr + arm_func_end CPSi_char_from_big + + ; NitroWiFi: libwcm.a + + arm_func_start WCM_Init +WCM_Init: ; 0x020AD850 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl OS_DisableInterrupts + ldr r2, _020AD964 ; =_021D5FEC + mov r4, r0 + ldr r1, [r2] + cmp r1, #0 + beq _020AD880 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020AD880: + cmp r6, #0 + bne _020AD894 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020AD894: + tst r6, #0x1f + beq _020AD8A8 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020AD8A8: + cmp r5, #0x2300 + bhs _020AD8BC + bl OS_RestoreInterrupts + mov r0, #6 + ldmia sp!, {r4, r5, r6, pc} +_020AD8BC: + str r6, [r2] + add r0, r6, #0x2000 + mov r1, #1 + str r1, [r0, #0x260] + ldr r1, [r2] + mov r0, #0 + add r1, r1, #0x2200 + strh r0, [r1, #0x80] + ldr r1, [r2] + add r1, r1, #0x2200 + strh r0, [r1, #0x68] + ldr r1, [r2] + add r1, r1, #0x2000 + strb r0, [r1, #0x26a] + ldr r1, [r2] + add r1, r1, #0x2000 + strb r0, [r1, #0x26b] + ldr r1, [r2] + add r1, r1, #0x2200 + strh r0, [r1, #0x82] + ldr r1, [r2] + add r1, r1, #0x2200 + strh r0, [r1, #0xf8] + bl WcmInitOption + bl WCMi_InitCpsif + bl OS_IsTickAvailable + cmp r0, #0 + bne _020AD930 + bl OS_InitTick +_020AD930: + bl OS_IsAlarmAvailable + cmp r0, #0 + bne _020AD940 + bl OS_InitAlarm +_020AD940: + ldr r0, _020AD964 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2cc + add r0, r0, #0x2000 + bl OS_CreateAlarm + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020AD964: .word _021D5FEC + arm_func_end WCM_Init + + arm_func_start WCM_Finish +WCM_Finish: ; 0x020AD968 + stmdb sp!, {r3, lr} + bl OS_DisableInterrupts + ldr r2, _020AD9BC ; =_021D5FEC + ldr r1, [r2] + cmp r1, #0 + bne _020AD98C + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, pc} +_020AD98C: + add r1, r1, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #1 + beq _020AD9A8 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, pc} +_020AD9A8: + mov r1, #0 + str r1, [r2] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_020AD9BC: .word _021D5FEC + arm_func_end WCM_Finish + + arm_func_start WCM_StartupAsync +WCM_StartupAsync: ; 0x020AD9C0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + bl OS_DisableInterrupts + ldr r1, _020ADBB8 ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020AD9F0 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020AD9F0: + add r1, r1, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #1 + beq _020ADA14 + cmp r1, #2 + beq _020ADA24 + cmp r1, #3 + beq _020ADA30 + b _020ADA3C +_020ADA14: + mov r0, r6 + mov r1, r5 + bl WcmConfigure + b _020ADA48 +_020ADA24: + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r4, r5, r6, pc} +_020ADA30: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020ADA3C: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020ADA48: + ldr r0, _020ADBB8 ; =_021D5FEC + ldr r0, [r0] + add r1, r0, #0x2000 + ldr r1, [r1, #0x26c] + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bl WM_Init + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _020ADAB4 +_020ADA70: ; jump table + b _020ADACC ; case 0 + b _020ADAB4 ; case 1 + b _020ADAB4 ; case 2 + b _020ADA8C ; case 3 + b _020ADAA4 ; case 4 + b _020ADAB4 ; case 5 + b _020ADAB4 ; case 6 +_020ADA8C: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020ADAA4: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #5 + ldmia sp!, {r4, r5, r6, pc} +_020ADAB4: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020ADACC: + bl WM_GetAllowedChannel + cmp r0, #0 + bne _020ADB0C + bl WM_Finish + cmp r0, #0 + beq _020ADAFC + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020ADAFC: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #5 + ldmia sp!, {r4, r5, r6, pc} +_020ADB0C: + ldr r0, _020ADBBC ; =WcmWmcbIndication + bl WM_SetIndCallback + cmp r0, #0 + beq _020ADB34 + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020ADB34: + ldr r0, _020ADBC0 ; =WcmWmcbCommon + bl WM_Enable + cmp r0, #2 + beq _020ADB58 + cmp r0, #3 + beq _020ADB90 + cmp r0, #8 + beq _020ADB78 + b _020ADB90 +_020ADB58: + mov r0, #2 + bl WcmSetPhase + ldr r0, _020ADBB8 ; =_021D5FEC + mov r1, #1 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020ADBA8 +_020ADB78: + mov r0, #0xc + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} +_020ADB90: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, r5, r6, pc} +_020ADBA8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_020ADBB8: .word _021D5FEC +_020ADBBC: .word WcmWmcbIndication +_020ADBC0: .word WcmWmcbCommon + arm_func_end WCM_StartupAsync + + arm_func_start WCM_CleanupAsync +WCM_CleanupAsync: ; 0x020ADBC4 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020ADCAC ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020ADBEC + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020ADBEC: + add r1, r1, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #1 + beq _020ADC18 + cmp r1, #3 + beq _020ADC30 + cmp r1, #4 + bne _020ADC24 + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r4, pc} +_020ADC18: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} +_020ADC24: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020ADC30: + ldr r0, _020ADCB0 ; =WcmWmcbCommon + bl WM_PowerOff + cmp r0, #2 + beq _020ADC54 + cmp r0, #3 + beq _020ADC84 + cmp r0, #8 + beq _020ADC74 + b _020ADC84 +_020ADC54: + mov r0, #4 + bl WcmSetPhase + ldr r0, _020ADCAC ; =_021D5FEC + mov r1, #2 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020ADC9C +_020ADC74: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r4, pc} +_020ADC84: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, pc} +_020ADC9C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, pc} + .align 2, 0 +_020ADCAC: .word _021D5FEC +_020ADCB0: .word WcmWmcbCommon + arm_func_end WCM_CleanupAsync + + arm_func_start WCM_SearchAsync +WCM_SearchAsync: ; 0x020ADCB4 + stmdb sp!, {r3, lr} + cmp r0, #0 + cmpne r1, #0 + bne _020ADCCC + bl WCM_EndSearchAsync + ldmia sp!, {r3, pc} +_020ADCCC: + bl WCM_BeginSearchAsync + ldmia sp!, {r3, pc} + arm_func_end WCM_SearchAsync + + arm_func_start WCM_BeginSearchAsync +WCM_BeginSearchAsync: ; 0x020ADCD4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl OS_DisableInterrupts + ldr r1, _020ADE44 ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020ADD08 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADD08: + add r1, r1, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #3 + beq _020ADD78 + cmp r1, #5 + beq _020ADD2C + cmp r1, #6 + beq _020ADD4C + b _020ADD6C +_020ADD2C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl WcmEditScanExParam + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADD4C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl WcmEditScanExParam + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADD6C: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADD78: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl WcmEditScanExParam + ldr r0, _020ADE44 ; =_021D5FEC + ldr r0, [r0] + add r1, r0, #0x2200 + add r0, r0, #0x2000 + ldrh r1, [r1, #0x8c] + ldr r0, [r0, #0x288] + bl DC_InvalidateRange + ldr r2, _020ADE44 ; =_021D5FEC + ldr r0, _020ADE48 ; =WcmWmcbScanEx + ldr r1, [r2] + add r1, r1, #0x2000 + ldr r3, [r1, #0x284] + add r3, r3, #1 + str r3, [r1, #0x284] + ldr r1, [r2] + add r1, r1, #0x288 + add r1, r1, #0x2000 + bl WM_StartScanEx + cmp r0, #2 + beq _020ADDEC + cmp r0, #3 + beq _020ADE1C + cmp r0, #8 + beq _020ADE0C + b _020ADE1C +_020ADDEC: + mov r0, #5 + bl WcmSetPhase + ldr r0, _020ADE44 ; =_021D5FEC + mov r1, #3 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020ADE34 +_020ADE0C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADE1C: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADE34: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020ADE44: .word _021D5FEC +_020ADE48: .word WcmWmcbScanEx + arm_func_end WCM_BeginSearchAsync + + arm_func_start WCM_EndSearchAsync +WCM_EndSearchAsync: ; 0x020ADE4C + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020ADEEC ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020ADE74 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020ADE74: + add r1, r1, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #3 + beq _020ADEC4 + cmp r1, #6 + beq _020ADE98 + cmp r1, #7 + beq _020ADEB8 + b _020ADED0 +_020ADE98: + mov r0, #7 + bl WcmSetPhase + ldr r0, _020ADEEC ; =_021D5FEC + mov r1, #4 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020ADEDC +_020ADEB8: + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r4, pc} +_020ADEC4: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} +_020ADED0: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020ADEDC: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, pc} + .align 2, 0 +_020ADEEC: .word _021D5FEC + arm_func_end WCM_EndSearchAsync + + arm_func_start WCM_ConnectAsync +WCM_ConnectAsync: ; 0x020ADEF0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl OS_DisableInterrupts + ldr r2, _020AE0E8 ; =_021D5FEC + mov r4, r0 + ldr ip, [r2] + cmp ip, #0 + bne _020ADF24 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADF24: + add r1, ip, #0x2000 + ldr r3, [r1, #0x260] + cmp r3, #3 + beq _020ADF48 + cmp r3, #8 + beq _020AE038 + cmp r3, #9 + beq _020AE044 + b _020AE050 +_020ADF48: + cmp r7, #0 + bne _020ADF5C + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADF5C: + ldrh r3, [r7, #0x3c] + cmp r3, #0 + beq _020ADF74 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADF74: + cmp r6, #0 + beq _020ADFEC + ldrb r3, [r6] + cmp r3, #4 + ldrlob r0, [r6, #1] + cmplo r0, #4 + blo _020ADFA0 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020ADFA0: + strb r3, [r1, #0x250] + ldr r0, [r2] + ldrb r1, [r6, #1] + add r0, r0, #0x2000 + strb r1, [r0, #0x251] + ldr r1, [r2] + mov r2, #0x50 + add r0, r1, #0x2000 + ldrb r0, [r0, #0x250] + cmp r0, #0 + bne _020ADFDC + add r0, r1, #0x2200 + mov r1, #0 + bl MI_CpuFill8 + b _020ADFFC +_020ADFDC: + add r0, r6, #2 + add r1, r1, #0x2200 + bl MI_CpuCopy8 + b _020ADFFC +_020ADFEC: + add r0, ip, #0x2200 + mov r1, #0 + mov r2, #0x52 + bl MI_CpuFill8 +_020ADFFC: + ldr r1, _020AE0E8 ; =_021D5FEC + mov r0, r7 + ldr r1, [r1] + mov r2, #0xc0 + add r1, r1, #0x2140 + bl MI_CpuCopy8 + ldr r1, _020AE0E8 ; =_021D5FEC + mov r0, r5 + ldr r1, [r1] + add r1, r1, #0x2100 + ldrh r2, [r1, #0x6e] + orr r2, r2, #3 + strh r2, [r1, #0x70] + bl WCM_UpdateOption + b _020AE05C +_020AE038: + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020AE044: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020AE050: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020AE05C: + ldr r1, _020AE0EC ; =0x0000FFFF + ldr r0, _020AE0F0 ; =WcmWmcbCommon + mov r3, r1 + mov r2, #0x50 + str r1, [sp] + bl WM_SetLifeTime + cmp r0, #2 + beq _020AE090 + cmp r0, #3 + beq _020AE0C0 + cmp r0, #8 + beq _020AE0B0 + b _020AE0C0 +_020AE090: + mov r0, #8 + bl WcmSetPhase + ldr r0, _020AE0E8 ; =_021D5FEC + mov r1, #5 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020AE0D8 +_020AE0B0: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020AE0C0: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_020AE0D8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020AE0E8: .word _021D5FEC +_020AE0EC: .word 0x0000FFFF +_020AE0F0: .word WcmWmcbCommon + arm_func_end WCM_ConnectAsync + + arm_func_start WCM_DisconnectAsync +WCM_DisconnectAsync: ; 0x020AE0F4 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020AE208 ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020AE11C + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020AE11C: + add r1, r1, #0x2000 + ldr r2, [r1, #0x260] + cmp r2, #3 + beq _020AE148 + cmp r2, #9 + beq _020AE160 + cmp r2, #0xa + bne _020AE154 + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r4, pc} +_020AE148: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r4, pc} +_020AE154: + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r4, pc} +_020AE160: + ldrb r0, [r1, #0x26b] + cmp r0, #1 + bne _020AE18C + mov r0, #0xa + bl WcmSetPhase + ldr r0, _020AE208 ; =_021D5FEC + mov r1, #6 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020AE1F8 +_020AE18C: + ldr r0, _020AE20C ; =WcmWmcbEndDCF + bl WM_EndDCF + cmp r0, #2 + beq _020AE1B0 + cmp r0, #3 + beq _020AE1E0 + cmp r0, #8 + beq _020AE1D0 + b _020AE1E0 +_020AE1B0: + mov r0, #0xa + bl WcmSetPhase + ldr r0, _020AE208 ; =_021D5FEC + mov r1, #6 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020AE1F8 +_020AE1D0: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r4, pc} +_020AE1E0: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r4, pc} +_020AE1F8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r4, pc} + .align 2, 0 +_020AE208: .word _021D5FEC +_020AE20C: .word WcmWmcbEndDCF + arm_func_end WCM_DisconnectAsync + + arm_func_start WCM_TerminateAsync +WCM_TerminateAsync: ; 0x020AE210 + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + ldr r1, _020AE414 ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + cmp r1, #0 + bne _020AE238 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020AE238: + add r1, r1, #0x2000 + ldr r2, [r1, #0x260] + cmp r2, #0xd + addls pc, pc, r2, lsl #2 + b _020AE2C8 +_020AE24C: ; jump table + b _020AE2C8 ; case 0 + b _020AE290 ; case 1 + b _020AE2C8 ; case 2 + b _020AE2D8 ; case 3 + b _020AE2C8 ; case 4 + b _020AE2C8 ; case 5 + b _020AE29C ; case 6 + b _020AE2C8 ; case 7 + b _020AE2C8 ; case 8 + b _020AE2D8 ; case 9 + b _020AE2C8 ; case 10 + b _020AE2C8 ; case 11 + b _020AE2D8 ; case 12 + b _020AE284 ; case 13 +_020AE284: + bl OS_RestoreInterrupts + mov r0, #2 + ldmia sp!, {r3, r4, r5, pc} +_020AE290: + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AE29C: + mov r0, #0xd + bl WcmSetPhase + ldr r1, _020AE414 ; =_021D5FEC + mov r2, #9 + ldr r1, [r1] + mov r0, r4 + add r1, r1, #0x2200 + strh r2, [r1, #0x80] + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r3, r4, r5, pc} +_020AE2C8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_020AE2D8: + ldrb r0, [r1, #0x26b] + cmp r0, #1 + bne _020AE304 + mov r0, #0xd + bl WcmSetPhase + ldr r0, _020AE414 ; =_021D5FEC + mov r1, #9 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020AE404 +_020AE304: + bl WMi_GetStatusAddress + mov r5, r0 + mov r1, #2 + bl DC_InvalidateRange + ldrh r0, [r5] + cmp r0, #0 + beq _020AE334 + cmp r0, #1 + beq _020AE36C + cmp r0, #2 + beq _020AE378 + b _020AE384 +_020AE334: + bl WM_Finish + cmp r0, #0 + bne _020AE3A0 + mov r0, #1 + bl WcmSetPhase + ldr r1, _020AE414 ; =_021D5FEC + mov r2, #0 + ldr r1, [r1] + mov r0, r4 + add r1, r1, #0x2200 + strh r2, [r1, #0x80] + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AE36C: + ldr r0, _020AE418 ; =WcmWmcbCommon + bl WM_Disable + b _020AE3A0 +_020AE378: + ldr r0, _020AE418 ; =WcmWmcbCommon + bl WM_PowerOff + b _020AE3A0 +_020AE384: + ldr r1, _020AE414 ; =_021D5FEC + ldr r0, _020AE41C ; =WcmWmcbReset + ldr r1, [r1] + mov r2, #1 + add r1, r1, #0x2000 + strb r2, [r1, #0x26b] + bl WM_Reset +_020AE3A0: + cmp r0, #2 + beq _020AE3BC + cmp r0, #3 + beq _020AE3EC + cmp r0, #8 + beq _020AE3DC + b _020AE3EC +_020AE3BC: + mov r0, #0xd + bl WcmSetPhase + ldr r0, _020AE414 ; =_021D5FEC + mov r1, #9 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x80] + b _020AE404 +_020AE3DC: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #4 + ldmia sp!, {r3, r4, r5, pc} +_020AE3EC: + mov r0, #0xb + bl WcmSetPhase + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #7 + ldmia sp!, {r3, r4, r5, pc} +_020AE404: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #3 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE414: .word _021D5FEC +_020AE418: .word WcmWmcbCommon +_020AE41C: .word WcmWmcbReset + arm_func_end WCM_TerminateAsync + + arm_func_start WCM_GetPhase +WCM_GetPhase: ; 0x020AE420 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r1, _020AE44C ; =_021D5FEC + mov r4, #0 + ldr r1, [r1] + cmp r1, #0 + addne r1, r1, #0x2000 + ldrne r4, [r1, #0x260] + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020AE44C: .word _021D5FEC + arm_func_end WCM_GetPhase + + arm_func_start WCM_UpdateOption +WCM_UpdateOption: ; 0x020AE450 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _020AE4E4 ; =_021D5FEC + mov r2, #0 + ldr r3, [r1] + add r1, r3, #0x2000 + cmp r3, #0 + ldr r4, [r1, #0x264] + bne _020AE484 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AE484: + tst r5, #0x8000 + beq _020AE4A4 + ldr r1, _020AE4E8 ; =0x00003FFE + orr r2, r2, #0xfe + tst r5, r1 + orreq r5, r5, #0x82 + orr r2, r2, #0x3f00 + orreq r5, r5, #0xa000 +_020AE4A4: + tst r5, #0x20000 + orrne r2, r2, #0x10000 + tst r5, #0x80000 + orrne r2, r2, #0x40000 + tst r5, #0x200000 + orrne r2, r2, #0x100000 + tst r5, #0x800000 + orrne r2, r2, #0x400000 + mvn r1, r2 + and r1, r4, r1 + orr r2, r5, r1 + add r1, r3, #0x2000 + str r2, [r1, #0x264] + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE4E4: .word _021D5FEC +_020AE4E8: .word 0x00003FFE + arm_func_end WCM_UpdateOption + + arm_func_start WCMi_GetSystemWork +WCMi_GetSystemWork: ; 0x020AE4EC + ldr r0, _020AE4F8 ; =_021D5FEC + ldr r0, [r0] + bx lr + .align 2, 0 +_020AE4F8: .word _021D5FEC + arm_func_end WCMi_GetSystemWork + + arm_func_start WcmConfigure +WcmConfigure: ; 0x020AE4FC + stmdb sp!, {r3, r4, r5, lr} + movs r5, r0 + mov r4, r1 + bne _020AE54C + ldr r1, _020AE618 ; =_021D5FEC + mov r3, #3 + ldr r0, [r1] + mov r2, #0 + add r0, r0, #0x2000 + str r3, [r0, #0x26c] + ldr r0, [r1] + add r0, r0, #0x2000 + str r2, [r0, #0x270] + ldr r0, [r1] + add r0, r0, #0x2000 + str r2, [r0, #0x274] + ldr r0, [r1] + add r0, r0, #0x2000 + str r2, [r0, #0x278] + b _020AE604 +_020AE54C: + ldr r1, _020AE618 ; =_021D5FEC + ldr r2, [r5] + ldr r0, [r1] + and r2, r2, #3 + add r0, r0, #0x2000 + str r2, [r0, #0x26c] + ldr r3, [r5, #4] + ldr r0, [r5, #8] + and r2, r3, #3 + rsb r2, r2, #4 + and r2, r2, #3 + add r2, r2, #0xc + cmp r2, r0 + ldr r0, [r1] + bls _020AE5A4 + mov r2, #0 + add r0, r0, #0x2000 + str r2, [r0, #0x270] + ldr r0, [r1] + add r0, r0, #0x2000 + str r2, [r0, #0x274] + b _020AE5F0 +_020AE5A4: + add r2, r3, #3 + bic r2, r2, #3 + add r0, r0, #0x2000 + str r2, [r0, #0x270] + ldr r2, [r5, #4] + ldr r0, [r1] + and r2, r2, #3 + rsb r2, r2, #4 + ldr r3, [r5, #8] + and r2, r2, #3 + sub r2, r3, r2 + add r0, r0, #0x2000 + str r2, [r0, #0x274] + ldr r0, [r1] + mov r1, #0 + add r2, r0, #0x2000 + ldr r0, [r2, #0x270] + ldr r2, [r2, #0x274] + bl MI_CpuFill8 +_020AE5F0: + ldr r0, _020AE618 ; =_021D5FEC + ldr r1, [r5, #0xc] + ldr r0, [r0] + add r0, r0, #0x2000 + str r1, [r0, #0x278] +_020AE604: + ldr r0, _020AE618 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + str r4, [r0, #0x27c] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE618: .word _021D5FEC + arm_func_end WcmConfigure + + arm_func_start WcmEditScanExParam +WcmEditScanExParam: ; 0x020AE61C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, r2 + mov r4, r1 + bl WCM_UpdateOption + ldr r2, _020AE7A8 ; =_021D5FEC + mov r3, #0x400 + ldr r1, [r2] + mov r0, #0 + add ip, r1, #0x1500 + add r1, r1, #0x2000 + str ip, [r1, #0x288] + ldr r1, [r2] + add r1, r1, #0x2200 + strh r3, [r1, #0x8c] + bl WcmGetNextScanChannel + ldr r1, _020AE7A8 ; =_021D5FEC + mov r2, #1 + mov r2, r2, lsl r0 + ldr r0, [r1] + mov r2, r2, asr #1 + add r0, r0, #0x2200 + strh r2, [r0, #0x8e] + ldr r0, [r1] + add r0, r0, #0x2200 + ldrh r0, [r0, #0x68] + cmp r0, #0 + bne _020AE690 + bl WM_GetDispersionScanPeriod +_020AE690: + ldr r2, _020AE7A8 ; =_021D5FEC + ldr r1, [r2] + add r1, r1, #0x2200 + strh r0, [r1, #0x90] + ldr r1, [r2] + add r0, r1, #0x2000 + ldr r0, [r0, #0x264] + and r0, r0, #0x300000 + cmp r0, #0x300000 + movne r2, #1 + moveq r2, #0 + add r0, r1, #0x2200 + strh r2, [r0, #0x98] + cmp r5, #0 + mov r2, #6 + bne _020AE6EC + ldr r1, _020AE7A8 ; =_021D5FEC + ldr r0, _020AE7AC ; =_02108FC0 + ldr r1, [r1] + add r1, r1, #0x92 + add r1, r1, #0x2200 + bl MI_CpuCopy8 + b _020AE704 +_020AE6EC: + ldr r1, _020AE7A8 ; =_021D5FEC + mov r0, r5 + ldr r1, [r1] + add r1, r1, #0x92 + add r1, r1, #0x2200 + bl MI_CpuCopy8 +_020AE704: + cmp r4, #0 + ldrne r0, _020AE7B0 ; =_02108FC8 + mov r2, #0x20 + cmpne r4, r0 + bne _020AE748 + ldr r1, _020AE7A8 ; =_021D5FEC + ldr r0, _020AE7B0 ; =_02108FC8 + ldr r1, [r1] + add r1, r1, #0x29c + add r1, r1, #0x2000 + bl MI_CpuCopy8 + ldr r0, _020AE7A8 ; =_021D5FEC + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x9a] + b _020AE790 +_020AE748: + ldr r1, _020AE7A8 ; =_021D5FEC + mov r0, r4 + ldr r1, [r1] + add r1, r1, #0x29c + add r1, r1, #0x2000 + bl MI_CpuCopy8 + mov r1, #0 +_020AE764: + ldrb r0, [r4] + cmp r0, #0 + beq _020AE780 + add r1, r1, #1 + cmp r1, #0x20 + add r4, r4, #1 + blt _020AE764 +_020AE780: + ldr r0, _020AE7A8 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0x9a] +_020AE790: + ldr r0, _020AE7A8 ; =_021D5FEC + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x2000 + str r1, [r0, #0x284] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE7A8: .word _021D5FEC +_020AE7AC: .word _02108FC0 +_020AE7B0: .word _02108FC8 + arm_func_end WcmEditScanExParam + + arm_func_start WcmInitOption +WcmInitOption: ; 0x020AE7B4 + ldr r0, _020AE7CC ; =_021D5FEC + ldr r1, _020AE7D0 ; =0x00AAA082 + ldr r0, [r0] + add r0, r0, #0x2000 + str r1, [r0, #0x264] + bx lr + .align 2, 0 +_020AE7CC: .word _021D5FEC +_020AE7D0: .word 0x00AAA082 + arm_func_end WcmInitOption + + arm_func_start WcmGetNextScanChannel +WcmGetNextScanChannel: ; 0x020AE7D4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _020AE85C ; =_021D5FEC + ldr lr, _020AE860 ; =0x4EC4EC4F + ldr r2, [r2] + mov r1, r0 + add r2, r2, #0x2000 + ldr r7, [r2, #0x264] + mov r6, #0 + mov r5, #1 + mov ip, #0xd +_020AE7FC: + mov r2, r1, lsr #0x1f + smull r3, r4, lr, r1 + add r4, r2, r4, asr #2 + smull r2, r3, ip, r4 + sub r4, r1, r2 + add r2, r4, #1 + tst r7, r5, lsl r2 + bne _020AE82C + add r6, r6, #1 + cmp r6, #0xd + add r1, r1, #1 + blt _020AE7FC +_020AE82C: + add r3, r0, r6 + ldr r2, _020AE860 ; =0x4EC4EC4F + mov r0, r3, lsr #0x1f + smull r1, ip, r2, r3 + add ip, r0, ip, asr #2 + mov r2, #0xd + smull r0, r1, r2, ip + sub ip, r3, r0 + add r0, ip, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_020AE85C: .word _021D5FEC +_020AE860: .word 0x4EC4EC4F + arm_func_end WcmGetNextScanChannel + + arm_func_start WcmNotify +WcmNotify: ; 0x020AE864 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, _020AE8A4 ; =_021D5FEC + mov r5, r0 + ldr r0, [ip] + mov r4, r1 + add r1, r0, #0x2200 + ldrsh r0, [r1, #0x80] + mov ip, #0 + mov lr, r2 + strh ip, [r1, #0x80] + str r3, [sp] + mov r1, r5 + mov r2, r4 + mov r3, lr + bl WcmNotifyEx + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE8A4: .word _021D5FEC + arm_func_end WcmNotify + + arm_func_start WcmNotifyEx +WcmNotifyEx: ; 0x020AE8A8 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr ip, _020AE8F8 ; =_021D5FEC + ldr ip, [ip] + add ip, ip, #0x2000 + ldr lr, [ip, #0x27c] + cmp lr, #0 + addeq sp, sp, #0x10 + ldmeqia sp!, {r3, pc} + ldr lr, [sp, #0x18] + strh r0, [sp] + str r2, [sp, #4] + str r3, [sp, #8] + str lr, [sp, #0xc] + strh r1, [sp, #2] + ldr r1, [ip, #0x27c] + add r0, sp, #0 + blx r1 + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .align 2, 0 +_020AE8F8: .word _021D5FEC + arm_func_end WcmNotifyEx + + arm_func_start WcmSetPhase +WcmSetPhase: ; 0x020AE8FC + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _020AE988 ; =_021D5FEC + mov r4, r0 + ldr r1, [r1] + add r0, r1, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #9 + bne _020AE938 + cmp r5, #9 + beq _020AE938 + add r0, r1, #0x2cc + add r0, r0, #0x2000 + bl OS_CancelAlarm +_020AE938: + ldr r0, _020AE988 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r1, [r0, #0x260] + cmp r1, #0xb + strne r5, [r0, #0x260] + cmp r5, #9 + bne _020AE97C + mov r2, #0 + ldr r0, _020AE988 ; =_021D5FEC + str r2, [sp] + ldr r0, [r0] + ldr r1, _020AE98C ; =0x022F5341 + add r0, r0, #0x2cc + ldr r3, _020AE990 ; =WcmKeepAliveAlarm + add r0, r0, #0x2000 + bl OS_SetAlarm +_020AE97C: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020AE988: .word _021D5FEC +_020AE98C: .word 0x022F5341 +_020AE990: .word WcmKeepAliveAlarm + arm_func_end WcmSetPhase + + arm_func_start WCMi_ResetKeepAliveAlarm +WCMi_ResetKeepAliveAlarm: ; 0x020AE994 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + bl OS_DisableInterrupts + ldr r1, _020AE9FC ; =_021D5FEC + mov r4, r0 + ldr r0, [r1] + add r0, r0, #0x2cc + add r0, r0, #0x2000 + bl OS_CancelAlarm + ldr r0, _020AE9FC ; =_021D5FEC + ldr r1, [r0] + add r0, r1, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #9 + bne _020AE9EC + add r0, r1, #0x2cc + mov r2, #0 + ldr r1, _020AEA00 ; =0x022F5341 + ldr r3, _020AEA04 ; =WcmKeepAliveAlarm + add r0, r0, #0x2000 + str r2, [sp] + bl OS_SetAlarm +_020AE9EC: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020AE9FC: .word _021D5FEC +_020AEA00: .word 0x022F5341 +_020AEA04: .word WcmKeepAliveAlarm + arm_func_end WCMi_ResetKeepAliveAlarm + + arm_func_start WcmKeepAliveAlarm +WcmKeepAliveAlarm: ; 0x020AEA08 + stmdb sp!, {r3, lr} + bl WCMi_CpsifSendNullPacket + bl WCMi_ResetKeepAliveAlarm + ldmia sp!, {r3, pc} + arm_func_end WcmKeepAliveAlarm + + arm_func_start WcmCountBits +WcmCountBits: ; 0x020AEA18 + mov r1, r0 + mov r0, #0 + mov r3, #1 +_020AEA24: + clz r2, r1 + rsbs r2, r2, #0x1f + blo _020AEA34 + b _020AEA38 +_020AEA34: + bx lr +_020AEA38: + bic r1, r1, r3, lsl r2 + add r0, r0, #1 + b _020AEA24 + arm_func_end WcmCountBits + + arm_func_start WcmCountLeadingZero +WcmCountLeadingZero: ; 0x020AEA44 + clz r0, r0 + bx lr + arm_func_end WcmCountLeadingZero + + arm_func_start WcmWmReset +WcmWmReset: ; 0x020AEA4C + stmdb sp!, {r3, lr} + ldr r0, _020AEAA0 ; =_021D5FEC + ldr r0, [r0] + add r1, r0, #0x2000 + ldrb r0, [r1, #0x26b] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r2, #1 + ldr r0, _020AEAA4 ; =WcmWmcbReset + strb r2, [r1, #0x26b] + bl WM_Reset + cmp r0, #2 + ldmeqia sp!, {r3, pc} + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + mov r2, r1 + mov r0, #7 + mov r3, #0x610 + bl WcmNotify + ldmia sp!, {r3, pc} + .align 2, 0 +_020AEAA0: .word _021D5FEC +_020AEAA4: .word WcmWmcbReset + arm_func_end WcmWmReset + + arm_func_start WcmWmcbIndication +WcmWmcbIndication: ; 0x020AEAA8 + stmdb sp!, {r3, lr} + ldrh r1, [r0, #2] + cmp r1, #8 + ldreqh r1, [r0, #4] + cmpeq r1, #0x16 + ldreqh r0, [r0, #6] + cmpeq r0, #0x25 + ldmneia sp!, {r3, pc} + ldr r0, _020AEB1C ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r0, [r0, #0x260] + sub r0, r0, #8 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r3, pc} +_020AEAE8: ; jump table + b _020AEAFC ; case 0 + b _020AEB08 ; case 1 + b _020AEB10 ; case 2 + ldmia sp!, {r3, pc} ; case 3 + b _020AEB08 ; case 4 +_020AEAFC: + mov r0, #0xc + bl WcmSetPhase + ldmia sp!, {r3, pc} +_020AEB08: + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AEB10: + mov r0, #0xc + bl WcmSetPhase + ldmia sp!, {r3, pc} + .align 2, 0 +_020AEB1C: .word _021D5FEC + arm_func_end WcmWmcbIndication + + arm_func_start WcmWmcbCommon +WcmWmcbCommon: ; 0x020AEB20 + stmdb sp!, {r3, lr} + ldrh r1, [r0, #2] + mov r2, #0x14 + cmp r1, #4 + addls pc, pc, r1, lsl #2 + b _020AED80 +_020AEB38: ; jump table + b _020AEB4C ; case 0 + b _020AED48 ; case 1 + b _020AED80 ; case 2 + b _020AED80 ; case 3 + b _020AED80 ; case 4 +_020AEB4C: + ldrh r0, [r0] + cmp r0, #0x19 + bgt _020AEB84 + bge _020AEC48 + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _020AECC0 +_020AEB68: ; jump table + b _020AECC0 ; case 0 + b _020AECC0 ; case 1 + b _020AECC0 ; case 2 + b _020AEBA0 ; case 3 + b _020AEBB0 ; case 4 + b _020AEC04 ; case 5 + b _020AEC24 ; case 6 +_020AEB84: + cmp r0, #0x1d + bgt _020AEB94 + beq _020AEC34 + b _020AECC0 +_020AEB94: + cmp r0, #0x27 + beq _020AEC70 + b _020AECC0 +_020AEBA0: + ldr r0, _020AEDB8 ; =WcmWmcbCommon + bl WM_PowerOn + mov r2, r0 + b _020AECC0 +_020AEBB0: + bl WM_Finish + cmp r0, #0 + beq _020AEBC4 + cmp r0, #4 + b _020AEBE4 +_020AEBC4: + mov r0, #1 + bl WcmSetPhase + mov r0, #0 + ldr r3, _020AEDBC ; =0x00000663 + mov r1, r0 + mov r2, r0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AEBE4: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AEDC0 ; =0x0000066C + mov r2, r1 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AEC04: + mov r0, #3 + bl WcmSetPhase + mov r0, #0 + ldr r3, _020AEDC4 ; =0x00000673 + mov r1, r0 + mov r2, r0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AEC24: + ldr r0, _020AEDB8 ; =WcmWmcbCommon + bl WM_Disable + mov r2, r0 + b _020AECC0 +_020AEC34: + ldr r0, _020AEDB8 ; =WcmWmcbCommon + mov r1, #0 + bl WM_SetBeaconIndication + mov r2, r0 + b _020AECC0 +_020AEC48: + ldr r1, _020AEDC8 ; =_021D5FEC + ldr r0, _020AEDB8 ; =WcmWmcbCommon + ldr r3, [r1] + add r2, r3, #0x2000 + ldrb r1, [r2, #0x250] + ldrb r2, [r2, #0x251] + add r3, r3, #0x2200 + bl WM_SetWEPKeyEx + mov r2, r0 + b _020AECC0 +_020AEC70: + ldr r0, _020AEDC8 ; =_021D5FEC + ldr r2, [r0] + add r0, r2, #0x2000 + ldr r1, [r0, #0x264] + and r0, r1, #0xc0000 + cmp r0, #0xc0000 + moveq r0, #1 + movne r0, #0 + mov r0, r0, lsl #0x10 + mov ip, r0, lsr #0x10 + and r1, r1, #0x30000 + cmp r1, #0x30000 + movne r3, #1 + add r1, r2, #0x2140 + ldr r0, _020AEDCC ; =WcmWmcbConnect + moveq r3, #0 + mov r2, #0 + str ip, [sp] + bl WM_StartConnectEx + mov r2, r0 +_020AECC0: + cmp r2, #2 + ldmeqia sp!, {r3, pc} + cmp r2, #3 + beq _020AED10 + cmp r2, #8 + bne _020AED10 + mov r0, #0xc + bl WcmSetPhase + ldr r0, _020AEDC8 ; =_021D5FEC + mov r2, #0 + ldr r1, [r0] + add r0, r1, #0x2200 + ldrsh r0, [r0, #0x80] + cmp r0, #5 + addeq r1, r1, #0x2140 + mov r0, #1 + movne r1, #0 + rsb r3, r0, #0x6b0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AED10: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AEDC8 ; =_021D5FEC + ldr r3, _020AEDD0 ; =0x000006B8 + ldr r1, [r0] + mov r2, #0 + add r0, r1, #0x2200 + ldrsh r0, [r0, #0x80] + cmp r0, #5 + addeq r1, r1, #0x2140 + movne r1, #0 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AED48: + mov r0, #0xc + bl WcmSetPhase + ldr r0, _020AEDC8 ; =_021D5FEC + ldr r3, _020AEDD4 ; =0x000006DE + ldr r1, [r0] + mov r2, #0 + add r0, r1, #0x2200 + ldrsh r0, [r0, #0x80] + cmp r0, #5 + addeq r1, r1, #0x2140 + movne r1, #0 + mov r0, #1 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AED80: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AEDC8 ; =_021D5FEC + ldr r3, _020AEDD8 ; =0x000006E8 + ldr r1, [r0] + mov r2, #0 + add r0, r1, #0x2200 + ldrsh r0, [r0, #0x80] + cmp r0, #5 + addeq r1, r1, #0x2140 + movne r1, #0 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r3, pc} + .align 2, 0 +_020AEDB8: .word WcmWmcbCommon +_020AEDBC: .word 0x00000663 +_020AEDC0: .word 0x0000066C +_020AEDC4: .word 0x00000673 +_020AEDC8: .word _021D5FEC +_020AEDCC: .word WcmWmcbConnect +_020AEDD0: .word 0x000006B8 +_020AEDD4: .word 0x000006DE +_020AEDD8: .word 0x000006E8 + arm_func_end WcmWmcbCommon + + arm_func_start WcmWmcbScanEx +WcmWmcbScanEx: ; 0x020AEDDC + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r5, r0 + ldrh r0, [r5, #2] + mov r4, #0x14 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _020AF074 +_020AEDFC: ; jump table + b _020AEE10 ; case 0 + b _020AF068 ; case 1 + b _020AF074 ; case 2 + b _020AF074 ; case 3 + b _020AF074 ; case 4 +_020AEE10: + ldr r0, _020AF098 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #5 + bne _020AEE44 + mov r0, #6 + bl WcmSetPhase + mov r0, #0 + ldr r3, _020AF09C ; =0x00000704 + mov r1, r0 + mov r2, r0 + bl WcmNotify +_020AEE44: + ldr r1, _020AF098 ; =_021D5FEC + ldr r2, [r1] + add r0, r2, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #6 + beq _020AEE70 + cmp r0, #7 + beq _020AEFE8 + cmp r0, #0xd + beq _020AEFF8 + b _020AF004 +_020AEE70: + add r0, r2, #0x2200 + mov r2, #7 + strh r2, [r0, #0x80] + ldrh r0, [r5, #8] + cmp r0, #5 + bne _020AEEFC + ldr r0, [r1] + add r1, r0, #0x2200 + add r0, r0, #0x2000 + ldrh r1, [r1, #0x8c] + ldr r0, [r0, #0x288] + bl DC_InvalidateRange + ldrh r0, [r5, #0xe] + mov r4, #0 + cmp r0, #0 + ble _020AEEFC + ldr r8, _020AF0A0 ; =0x0000071A + mov r7, #7 + mov r6, r4 +_020AEEBC: + add r0, r5, r4, lsl #1 + add r2, r5, r4, lsl #2 + ldrh r1, [r0, #0x50] + ldr r0, [r2, #0x10] + bl WCMi_EntryApList + str r8, [sp] + add r0, r5, r4, lsl #2 + ldr r2, [r0, #0x10] + mov r0, r7 + mov r1, r6 + mov r3, r5 + bl WcmNotifyEx + ldrh r0, [r5, #0xe] + add r4, r4, #1 + cmp r4, r0 + blt _020AEEBC +_020AEEFC: + ldr r0, _020AF098 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r1, [r0, #0x264] + and r0, r1, #0xc00000 + cmp r0, #0xc00000 + bne _020AEF68 + ldr r0, _020AF0A4 ; =0x00003FFE + and r0, r1, r0 + bl WcmCountBits + movs r1, r0 + beq _020AEF68 + ldr r0, _020AF098 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r6, [r0, #0x284] + mov r0, r6 + bl _u32_div_f + cmp r1, #0 + bne _020AEF68 + ldr r4, _020AF0A8 ; =0x00000728 + mov r1, #0 + mov r2, r6 + mov r3, r1 + mov r0, #8 + str r4, [sp] + bl WcmNotifyEx +_020AEF68: + ldrh r0, [r5, #0xa] + bl WcmCountLeadingZero + rsb r0, r0, #0x20 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WcmGetNextScanChannel + ldr r1, _020AF098 ; =_021D5FEC + mov r2, #1 + mov r2, r2, lsl r0 + ldr r0, [r1] + mov r2, r2, asr #1 + add r0, r0, #0x2200 + strh r2, [r0, #0x8e] + ldr r0, [r1] + add r1, r0, #0x2200 + add r0, r0, #0x2000 + ldrh r1, [r1, #0x8c] + ldr r0, [r0, #0x288] + bl DC_InvalidateRange + ldr r2, _020AF098 ; =_021D5FEC + ldr r0, _020AF0AC ; =WcmWmcbScanEx + ldr r1, [r2] + add r1, r1, #0x2000 + ldr r3, [r1, #0x284] + add r3, r3, #1 + str r3, [r1, #0x284] + ldr r1, [r2] + add r1, r1, #0x288 + add r1, r1, #0x2000 + bl WM_StartScanEx + mov r4, r0 + b _020AF004 +_020AEFE8: + ldr r0, _020AF0B0 ; =WcmWmcbEndScan + bl WM_EndScan + mov r4, r0 + b _020AF004 +_020AEFF8: + bl WcmWmReset + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020AF004: + cmp r4, #2 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc} + cmp r4, #3 + beq _020AF044 + cmp r4, #8 + bne _020AF044 + mov r0, #0xc + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF0B4 ; =0x00000753 + mov r2, r1 + mov r0, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020AF044: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF0B8 ; =0x0000075C + mov r2, r1 + mov r0, #7 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020AF068: + bl WcmWmReset + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} +_020AF074: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF0BC ; =0x0000076D + mov r2, r1 + mov r0, #7 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020AF098: .word _021D5FEC +_020AF09C: .word 0x00000704 +_020AF0A0: .word 0x0000071A +_020AF0A4: .word 0x00003FFE +_020AF0A8: .word 0x00000728 +_020AF0AC: .word WcmWmcbScanEx +_020AF0B0: .word WcmWmcbEndScan +_020AF0B4: .word 0x00000753 +_020AF0B8: .word 0x0000075C +_020AF0BC: .word 0x0000076D + arm_func_end WcmWmcbScanEx + + arm_func_start WcmWmcbEndScan +WcmWmcbEndScan: ; 0x020AF0C0 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _020AF110 +_020AF0D4: ; jump table + b _020AF0E8 ; case 0 + b _020AF108 ; case 1 + b _020AF110 ; case 2 + b _020AF110 ; case 3 + b _020AF110 ; case 4 +_020AF0E8: + mov r0, #3 + bl WcmSetPhase + mov r0, #0 + ldr r3, _020AF130 ; =0x00000783 + mov r1, r0 + mov r2, r0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AF108: + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF110: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF134 ; =0x00000793 + mov r2, r1 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r3, pc} + .align 2, 0 +_020AF130: .word 0x00000783 +_020AF134: .word 0x00000793 + arm_func_end WcmWmcbEndScan + + arm_func_start WcmWmcbConnect +WcmWmcbConnect: ; 0x020AF138 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4, #2] + cmp r0, #0xc + addls pc, pc, r0, lsl #2 + b _020AF358 +_020AF150: ; jump table + b _020AF184 ; case 0 + b _020AF334 ; case 1 + b _020AF358 ; case 2 + b _020AF358 ; case 3 + b _020AF358 ; case 4 + b _020AF358 ; case 5 + b _020AF348 ; case 6 + b _020AF358 ; case 7 + b _020AF358 ; case 8 + b _020AF358 ; case 9 + b _020AF358 ; case 10 + b _020AF348 ; case 11 + b _020AF348 ; case 12 +_020AF184: + ldrh r0, [r4, #8] + cmp r0, #9 + bgt _020AF1C4 + cmp r0, #0 + addge pc, pc, r0, lsl #2 + b _020AF30C +_020AF19C: ; jump table + b _020AF30C ; case 0 + b _020AF30C ; case 1 + b _020AF30C ; case 2 + b _020AF30C ; case 3 + b _020AF30C ; case 4 + b _020AF30C ; case 5 + ldmia sp!, {r4, pc} ; case 6 + b _020AF240 ; case 7 + b _020AF1D0 ; case 8 + b _020AF1D0 ; case 9 +_020AF1C4: + cmp r0, #0x1a + ldmeqia sp!, {r4, pc} + b _020AF30C +_020AF1D0: + ldr r1, _020AF380 ; =_021D5FEC + ldr r2, [r1] + add r0, r2, #0x2000 + ldr r0, [r0, #0x260] + sub r0, r0, #8 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + ldmia sp!, {r4, pc} +_020AF1F0: ; jump table + b _020AF210 ; case 0 + b _020AF21C ; case 1 + b _020AF204 ; case 2 + ldmia sp!, {r4, pc} ; case 3 + b _020AF238 ; case 4 +_020AF204: + add r0, r2, #0x2200 + mov r1, #0 + strh r1, [r0, #0x82] +_020AF210: + mov r0, #0xc + bl WcmSetPhase + ldmia sp!, {r4, pc} +_020AF21C: + add r0, r2, #0x2200 + mov r2, #0 + strh r2, [r0, #0x82] + ldr r0, [r1] + mov r1, #6 + add r0, r0, #0x2200 + strh r1, [r0, #0x80] +_020AF238: + bl WcmWmReset + ldmia sp!, {r4, pc} +_020AF240: + ldr r1, _020AF380 ; =_021D5FEC + ldr r3, [r1] + add r0, r3, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #0xc + bne _020AF268 + mov r0, #8 + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r4, pc} +_020AF268: + ldrh r2, [r4, #0xa] + cmp r2, #1 + blo _020AF304 + ldr r0, _020AF384 ; =0x000007D7 + cmp r2, r0 + bhi _020AF304 + add r0, r3, #0x2200 + strh r2, [r0, #0x82] + ldr r1, [r1] + ldr r0, _020AF388 ; =WcmWmcbStartDCF + add r1, r1, #0x1500 + mov r2, #0x620 + bl WM_StartDCF + cmp r0, #2 + ldmeqia sp!, {r4, pc} + cmp r0, #3 + beq _020AF2DC + cmp r0, #8 + bne _020AF2DC + mov r0, #0xc + bl WcmSetPhase + ldr r0, _020AF380 ; =_021D5FEC + ldr r3, _020AF38C ; =0x000007ED + ldr r1, [r0] + mov r0, #1 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r4, pc} +_020AF2DC: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF380 ; =_021D5FEC + ldr r3, _020AF390 ; =0x000007F6 + ldr r1, [r0] + mov r0, #7 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r4, pc} +_020AF304: + bl WcmWmReset + ldmia sp!, {r4, pc} +_020AF30C: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF380 ; =_021D5FEC + ldrh r2, [r4, #8] + ldr r0, [r0] + ldr r3, _020AF394 ; =0x00000804 + add r1, r0, #0x2140 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r4, pc} +_020AF334: + ldr r0, _020AF380 ; =_021D5FEC + ldrh r1, [r4, #0xe] + ldr r0, [r0] + add r0, r0, #0x2200 + strh r1, [r0, #0xf8] +_020AF348: + mov r0, #8 + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r4, pc} +_020AF358: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF380 ; =_021D5FEC + ldr r3, _020AF398 ; =0x0000081B + ldr r1, [r0] + mov r0, #7 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r4, pc} + .align 2, 0 +_020AF380: .word _021D5FEC +_020AF384: .word 0x000007D7 +_020AF388: .word WcmWmcbStartDCF +_020AF38C: .word 0x000007ED +_020AF390: .word 0x000007F6 +_020AF394: .word 0x00000804 +_020AF398: .word 0x0000081B + arm_func_end WcmWmcbConnect + + arm_func_start WcmWmcbDisconnect +WcmWmcbDisconnect: ; 0x020AF39C + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _020AF430 +_020AF3B0: ; jump table + b _020AF3C4 ; case 0 + b _020AF420 ; case 1 + b _020AF430 ; case 2 + b _020AF420 ; case 3 + b _020AF430 ; case 4 +_020AF3C4: + ldr r0, _020AF458 ; =_021D5FEC + ldr r1, [r0] + add r0, r1, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #0xc + bne _020AF3EC + mov r0, #0xa + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF3EC: + add r1, r1, #0x2200 + mov r2, #0 + mov r0, #3 + strh r2, [r1, #0x82] + bl WcmSetPhase + ldr r1, _020AF458 ; =_021D5FEC + mov r0, #0 + ldr r1, [r1] + ldr r3, _020AF45C ; =0x0000083D + mov r2, r0 + add r1, r1, #0x2140 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AF420: + mov r0, #0xa + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF430: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF458 ; =_021D5FEC + ldr r3, _020AF460 ; =0x0000084F + ldr r1, [r0] + mov r0, #7 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r3, pc} + .align 2, 0 +_020AF458: .word _021D5FEC +_020AF45C: .word 0x0000083D +_020AF460: .word 0x0000084F + arm_func_end WcmWmcbDisconnect + + arm_func_start WcmWmcbStartDCF +WcmWmcbStartDCF: ; 0x020AF464 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4, #2] + cmp r0, #0 + beq _020AF480 + cmp r0, #4 + b _020AF53C +_020AF480: + ldrh r0, [r4, #4] + cmp r0, #0xe + beq _020AF498 + cmp r0, #0xf + beq _020AF4E8 + b _020AF514 +_020AF498: + ldr r0, _020AF564 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #0xc + bne _020AF4C0 + mov r0, #8 + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r4, pc} +_020AF4C0: + mov r0, #9 + bl WcmSetPhase + ldr r1, _020AF564 ; =_021D5FEC + mov r0, #0 + ldr r1, [r1] + ldr r3, _020AF568 ; =0x00000872 + mov r2, r0 + add r1, r1, #0x2140 + bl WcmNotify + ldmia sp!, {r4, pc} +_020AF4E8: + ldr r0, [r4, #8] + ldrh r0, [r0, #0xe] + mov r0, r0, asr #8 + and r0, r0, #0xff + bl WCMi_ShelterRssi + ldr r0, [r4, #8] + mov r1, #0x620 + bl DC_InvalidateRange + ldr r0, [r4, #8] + bl WCMi_CpsifRecvCallback + ldmia sp!, {r4, pc} +_020AF514: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF564 ; =_021D5FEC + ldrh r2, [r4, #4] + ldr r0, [r0] + ldr r3, _020AF56C ; =0x00000881 + add r1, r0, #0x2140 + mov r0, #7 + bl WcmNotify + ldmia sp!, {r4, pc} +_020AF53C: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF564 ; =_021D5FEC + ldr r3, _020AF570 ; =0x0000088C + ldr r1, [r0] + mov r0, #7 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r4, pc} + .align 2, 0 +_020AF564: .word _021D5FEC +_020AF568: .word 0x00000872 +_020AF56C: .word 0x00000881 +_020AF570: .word 0x0000088C + arm_func_end WcmWmcbStartDCF + + arm_func_start WcmWmcbEndDCF +WcmWmcbEndDCF: ; 0x020AF574 + stmdb sp!, {r3, lr} + ldrh r0, [r0, #2] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _020AF658 +_020AF588: ; jump table + b _020AF59C ; case 0 + b _020AF648 ; case 1 + b _020AF658 ; case 2 + b _020AF648 ; case 3 + b _020AF658 ; case 4 +_020AF59C: + ldr r0, _020AF680 ; =_021D5FEC + ldr r0, [r0] + add r0, r0, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #0xc + bne _020AF5C4 + mov r0, #0xa + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF5C4: + ldr r0, _020AF684 ; =WcmWmcbDisconnect + mov r1, #0 + bl WM_Disconnect + cmp r0, #2 + ldmeqia sp!, {r3, pc} + cmp r0, #3 + beq _020AF610 + cmp r0, #8 + bne _020AF620 + mov r0, #0xc + bl WcmSetPhase + ldr r0, _020AF680 ; =_021D5FEC + ldr r3, _020AF688 ; =0x000008B4 + ldr r1, [r0] + mov r0, #1 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AF610: + mov r0, #0xa + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF620: + mov r0, #0xb + bl WcmSetPhase + ldr r1, _020AF680 ; =_021D5FEC + mov r0, #7 + ldr r1, [r1] + mov r2, #0 + add r1, r1, #0x2140 + mov r3, #0x8c0 + bl WcmNotify + ldmia sp!, {r3, pc} +_020AF648: + mov r0, #0xa + bl WcmSetPhase + bl WcmWmReset + ldmia sp!, {r3, pc} +_020AF658: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF680 ; =_021D5FEC + ldr r3, _020AF68C ; =0x000008D3 + ldr r1, [r0] + mov r0, #7 + add r1, r1, #0x2140 + mov r2, #0 + bl WcmNotify + ldmia sp!, {r3, pc} + .align 2, 0 +_020AF680: .word _021D5FEC +_020AF684: .word WcmWmcbDisconnect +_020AF688: .word 0x000008B4 +_020AF68C: .word 0x000008D3 + arm_func_end WcmWmcbEndDCF + + arm_func_start WcmWmcbReset +WcmWmcbReset: ; 0x020AF690 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldrh r0, [r0, #2] + cmp r0, #0 + bne _020AF968 + ldr r2, _020AF98C ; =_021D5FEC + mov r0, #0 + ldr r1, [r2] + add r1, r1, #0x2000 + strb r0, [r1, #0x26b] + ldr r1, [r2] + add r1, r1, #0x2200 + strh r0, [r1, #0x82] + ldr r3, [r2] + add r1, r3, #0x2000 + ldr r1, [r1, #0x260] + cmp r1, #0xd + addls pc, pc, r1, lsl #2 + b _020AF938 +_020AF6DC: ; jump table + b _020AF938 ; case 0 + b _020AF938 ; case 1 + b _020AF938 ; case 2 + b _020AF938 ; case 3 + b _020AF938 ; case 4 + b _020AF714 ; case 5 + b _020AF714 ; case 6 + b _020AF738 ; case 7 + b _020AF75C ; case 8 + b _020AF874 ; case 9 + b _020AF8A0 ; case 10 + b _020AF938 ; case 11 + b _020AF874 ; case 12 + b _020AF8CC ; case 13 +_020AF714: + mov r0, #3 + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF990 ; =0x000008F5 + mov r2, r1 + mov r0, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF738: + mov r0, #3 + bl WcmSetPhase + mov r0, #0 + ldr r3, _020AF994 ; =0x000008FB + mov r1, r0 + mov r2, r0 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF75C: + add r1, r3, #0x2200 + ldrh r4, [r1, #0xf8] + strh r0, [r1, #0xf8] + cmp r4, #0x12 + bne _020AF848 + ldr r1, [r2] + add r1, r1, #0x2100 + ldrh r3, [r1, #0x70] + and ip, r3, #0x24 + cmp ip, #0x24 + beq _020AF848 + orr r3, r3, #0x24 + strh r3, [r1, #0x70] + ldr lr, [r2] + add r1, lr, #0x2000 + ldr r2, [r1, #0x264] + and r1, r2, #0xc0000 + cmp r1, #0xc0000 + moveq r0, #1 + and r1, r2, #0x30000 + cmp r1, #0x30000 + mov r0, r0, lsl #0x10 + mov ip, r0, lsr #0x10 + movne r3, #1 + ldr r0, _020AF998 ; =WcmWmcbConnect + moveq r3, #0 + add r1, lr, #0x2140 + mov r2, #0 + str ip, [sp] + bl WM_StartConnectEx + cmp r0, #2 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + cmp r0, #3 + beq _020AF81C + cmp r0, #8 + bne _020AF81C + mov r0, #0xc + bl WcmSetPhase + ldr r0, _020AF98C ; =_021D5FEC + ldr r3, _020AF99C ; =0x0000091C + ldr r0, [r0] + mov r2, r4 + add r1, r0, #0x2140 + mov r0, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF81C: + mov r0, #0xb + bl WcmSetPhase + ldr r0, _020AF98C ; =_021D5FEC + ldr r3, _020AF9A0 ; =0x00000925 + ldr r0, [r0] + mov r2, r4 + add r1, r0, #0x2140 + mov r0, #7 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF848: + mov r0, #3 + bl WcmSetPhase + ldr r0, _020AF98C ; =_021D5FEC + ldr r3, _020AF9A4 ; =0x0000092D + ldr r0, [r0] + mov r2, r4 + add r1, r0, #0x2140 + mov r0, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF874: + mov r0, #3 + bl WcmSetPhase + ldr r0, _020AF98C ; =_021D5FEC + ldr r3, _020AF9A8 ; =0x00000935 + ldr r1, [r0] + mov r0, #0 + add r1, r1, #0x2140 + mov r2, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF8A0: + mov r0, #3 + bl WcmSetPhase + ldr r1, _020AF98C ; =_021D5FEC + mov r0, #0 + ldr r1, [r1] + ldr r3, _020AF9AC ; =0x0000093C + mov r2, r0 + add r1, r1, #0x2140 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF8CC: + ldr r0, _020AF9B0 ; =WcmWmcbCommon + bl WM_PowerOff + cmp r0, #2 + addeq sp, sp, #4 + ldmeqia sp!, {r3, r4, pc} + cmp r0, #3 + beq _020AF914 + cmp r0, #8 + bne _020AF914 + mov r0, #0xc + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF9B4 ; =0x0000094A + mov r2, r1 + mov r0, #1 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF914: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + ldr r3, _020AF9B8 ; =0x00000953 + mov r2, r1 + mov r0, #7 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF938: + mov r0, #0xb + bl WcmSetPhase + ldr r1, _020AF98C ; =_021D5FEC + mov r0, #7 + ldr r1, [r1] + rsb r3, r0, #0x960 + add r1, r1, #0x2000 + ldr r2, [r1, #0x260] + mov r1, #0 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} +_020AF968: + mov r0, #0xb + bl WcmSetPhase + mov r1, #0 + mov r2, r1 + mov r0, #7 + mov r3, #0x960 + bl WcmNotify + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_020AF98C: .word _021D5FEC +_020AF990: .word 0x000008F5 +_020AF994: .word 0x000008FB +_020AF998: .word WcmWmcbConnect +_020AF99C: .word 0x0000091C +_020AF9A0: .word 0x00000925 +_020AF9A4: .word 0x0000092D +_020AF9A8: .word 0x00000935 +_020AF9AC: .word 0x0000093C +_020AF9B0: .word WcmWmcbCommon +_020AF9B4: .word 0x0000094A +_020AF9B8: .word 0x00000953 + arm_func_end WcmWmcbReset + + arm_func_start WCM_ClearApList +WCM_ClearApList: ; 0x020AF9BC + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + bne _020AF9E0 + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} +_020AF9E0: + add r1, r0, #0x2000 + ldr r0, [r1, #0x270] + cmp r0, #0 + beq _020AFA04 + ldr r2, [r1, #0x274] + cmp r2, #0 + ble _020AFA04 + mov r1, #0 + bl MI_CpuFill8 +_020AFA04: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + arm_func_end WCM_ClearApList + + arm_func_start WCM_CountApList +WCM_CountApList: ; 0x020AFA10 + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + mov r4, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + mov r5, #0 + bne _020AFA3C + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} +_020AFA3C: + add r0, r0, #0x2000 + ldr r1, [r0, #0x270] + cmp r1, #0 + beq _020AFA58 + ldr r0, [r0, #0x274] + cmp r0, #0xc + ldrhi r5, [r1] +_020AFA58: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WCM_CountApList + + arm_func_start WCM_LockApList +WCM_LockApList: ; 0x020AFA68 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + bne _020AFA94 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AFA94: + add r1, r0, #0x2000 + cmp r5, #0 + ldrb r1, [r1, #0x26a] + beq _020AFABC + cmp r1, #0 + movne r5, #1 + moveq r5, #0 + add r0, r0, #0x2000 + mov r1, #1 + b _020AFAD0 +_020AFABC: + cmp r1, #0 + movne r5, #1 + moveq r5, #0 + add r0, r0, #0x2000 + mov r1, #0 +_020AFAD0: + strb r1, [r0, #0x26a] + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WCM_LockApList + + arm_func_start WCM_PointApList +WCM_PointApList: ; 0x020AFAE4 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl OS_DisableInterrupts + mov r5, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + bne _020AFB10 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AFB10: + mov r0, r4 + bl WcmSearchIndexedApList + movs r4, r0 + mov r0, r5 + bne _020AFB30 + bl OS_RestoreInterrupts + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_020AFB30: + bl OS_RestoreInterrupts + add r0, r4, #0x10 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WCM_PointApList + + arm_func_start WCMi_EntryApList +WCMi_EntryApList: ; 0x020AFB3C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r4, r1 + bl WCMi_GetSystemWork + movs r6, r0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, r6, #0x2000 + ldrb r0, [r0, #0x26a] + cmp r0, #0 + ldreqh r0, [r5, #0x3c] + cmpeq r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + add r0, r5, #4 + bl WcmSearchApList + movs r7, r0 + bne _020AFB84 + bl WcmAllocApList + mov r7, r0 +_020AFB84: + cmp r7, #0 + addeq r0, r6, #0x2000 + ldreq r0, [r0, #0x278] + cmpeq r0, #1 + bne _020AFBA0 + bl WcmGetOldestApList + mov r7, r0 +_020AFBA0: + cmp r7, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r5 + add r1, r7, #0x10 + mov r2, #0xc0 + strh r4, [r7, #2] + bl MIi_CpuCopyFast + mov r0, r7 + bl WcmAppendApList + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WCMi_EntryApList + + arm_func_start WcmAllocApList +WcmAllocApList: ; 0x020AFBC8 + stmdb sp!, {r4, lr} + bl WCMi_GetSystemWork + add r2, r0, #0x2000 + ldr r1, [r2, #0x270] + mov r0, #0 + cmp r1, #0 + ldmeqia sp!, {r4, pc} + ldr r3, [r2, #0x274] + cmp r3, #0xc + ldmlsia sp!, {r4, pc} + ldr r2, _020AFC90 ; =0x4EC4EC4F + sub r3, r3, #0xc + umull r2, ip, r3, r2 + movs ip, ip, lsr #6 + ldmeqia sp!, {r4, pc} + ldr r2, [r1] + cmp ip, r2 + ldmlsia sp!, {r4, pc} + mov lr, r0 + cmp ip, #0 + bls _020AFC44 + add r4, r1, #0xc + mov r2, #0xd0 +_020AFC24: + mul r0, lr, r2 + ldrb r3, [r4, r0] + add r0, r4, r0 + cmp r3, #0 + beq _020AFC44 + add lr, lr, #1 + cmp lr, ip + blo _020AFC24 +_020AFC44: + cmp lr, ip + ldmhsia sp!, {r4, pc} + mov r2, #1 + strb r2, [r0] + ldr r3, [r1] + mov r2, #0 + str r3, [r0, #4] + str r2, [r0, #0xc] + ldr r2, [r1, #8] + str r2, [r0, #8] + str r0, [r1, #8] + ldr r2, [r0, #8] + cmp r2, #0 + strne r0, [r2, #0xc] + streq r0, [r1, #4] + ldr r2, [r1] + add r2, r2, #1 + str r2, [r1] + ldmia sp!, {r4, pc} + .align 2, 0 +_020AFC90: .word 0x4EC4EC4F + arm_func_end WcmAllocApList + + arm_func_start WcmGetOldestApList +WcmGetOldestApList: ; 0x020AFC94 + stmdb sp!, {r3, lr} + bl WCMi_GetSystemWork + add r0, r0, #0x2000 + ldr r1, [r0, #0x270] + cmp r1, #0 + beq _020AFCBC + ldr r0, [r0, #0x274] + cmp r0, #0xc + ldrhi r0, [r1, #4] + ldmhiia sp!, {r3, pc} +_020AFCBC: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end WcmGetOldestApList + + arm_func_start WcmSearchApList +WcmSearchApList: ; 0x020AFCC4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WCMi_GetSystemWork + add r0, r0, #0x2000 + mov r4, #0 + cmp r5, #0 + ldr r1, [r0, #0x270] + moveq r0, r4 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r1, #0 + beq _020AFD28 + ldr r0, [r0, #0x274] + cmp r0, #0xc + bls _020AFD28 + ldr r4, [r1, #4] + cmp r4, #0 + beq _020AFD28 +_020AFD08: + mov r1, r5 + add r0, r4, #0x14 + bl WCM_CompareBssID + cmp r0, #0 + bne _020AFD28 + ldr r4, [r4, #0xc] + cmp r4, #0 + bne _020AFD08 +_020AFD28: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WcmSearchApList + + arm_func_start WcmSearchIndexedApList +WcmSearchIndexedApList: ; 0x020AFD30 + stmdb sp!, {r4, lr} + mov r4, r0 + bl WCMi_GetSystemWork + add r1, r0, #0x2000 + ldr r2, [r1, #0x270] + mov r0, #0 + cmp r2, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r1, #0x274] + cmp r1, #0xc + ldmlsia sp!, {r4, pc} + ldr r0, [r2, #4] + cmp r0, #0 + ldmeqia sp!, {r4, pc} +_020AFD68: + ldr r1, [r0, #4] + cmp r1, r4 + ldrne r0, [r0, #0xc] + cmpne r0, #0 + bne _020AFD68 + ldmia sp!, {r4, pc} + arm_func_end WcmSearchIndexedApList + + arm_func_start WcmAppendApList +WcmAppendApList: ; 0x020AFD80 + stmdb sp!, {r4, lr} + mov r4, r0 + bl WCMi_GetSystemWork + add r1, r0, #0x2000 + ldr r0, [r1, #0x270] + cmp r4, #0 + cmpne r0, #0 + ldmeqia sp!, {r4, pc} + ldr r1, [r1, #0x274] + cmp r1, #0xc + ldmlsia sp!, {r4, pc} + ldr r3, [r0, #4] + cmp r3, #0 + beq _020AFDF8 +_020AFDB8: + cmp r3, r4 + bne _020AFDEC + ldr r2, [r3, #8] + ldr r1, [r3, #0xc] + cmp r2, #0 + strne r1, [r2, #0xc] + streq r1, [r0, #4] + ldr r2, [r3, #0xc] + ldr r1, [r3, #8] + cmp r2, #0 + strne r1, [r2, #8] + streq r1, [r0, #8] + b _020AFDF8 +_020AFDEC: + ldr r3, [r3, #0xc] + cmp r3, #0 + bne _020AFDB8 +_020AFDF8: + mov r1, #0 + str r1, [r4, #0xc] + ldr r1, [r0, #8] + str r1, [r4, #8] + str r4, [r0, #8] + ldr r1, [r4, #8] + cmp r1, #0 + strne r4, [r1, #0xc] + streq r4, [r0, #4] + cmp r3, #0 + ldmneia sp!, {r4, pc} + ldr r1, [r0] + str r1, [r4, #4] + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + ldmia sp!, {r4, pc} + arm_func_end WcmAppendApList + + arm_func_start WCMi_InitCpsif +WCMi_InitCpsif: ; 0x020AFE3C + stmdb sp!, {r3, lr} + ldr r1, _020AFE74 ; =_021D5FF0 + ldrb r0, [r1] + cmp r0, #0 + ldmneia sp!, {r3, pc} + mov r0, #1 + strb r0, [r1] + mov r2, #0 + str r2, [r1, #0x24] + str r2, [r1, #8] + ldr r0, _020AFE78 ; =_021D5FFC + str r2, [r1, #4] + bl OS_InitMutex + ldmia sp!, {r3, pc} + .align 2, 0 +_020AFE74: .word _021D5FF0 +_020AFE78: .word _021D5FFC + arm_func_end WCMi_InitCpsif + + arm_func_start WCMi_CpsifRecvCallback +WCMi_CpsifRecvCallback: ; 0x020AFE7C + stmdb sp!, {r3, lr} + ldr r1, _020AFEAC ; =_021D5FF0 + mov r2, r0 + ldr ip, [r1, #0x28] + cmp ip, #0 + ldmeqia sp!, {r3, pc} + ldrh r3, [r2, #6] + add r0, r2, #0x1e + add r1, r2, #0x18 + add r2, r2, #0x2c + blx ip + ldmia sp!, {r3, pc} + .align 2, 0 +_020AFEAC: .word _021D5FF0 + arm_func_end WCMi_CpsifRecvCallback + + arm_func_start WCMi_CpsifSendNullPacket +WCMi_CpsifSendNullPacket: ; 0x020AFEB0 + stmdb sp!, {r4, lr} + bl WCMi_GetSystemWork + movs r4, r0 + ldmeqia sp!, {r4, pc} + add r0, r4, #0x2000 + ldr r1, [r0, #0x260] + cmp r1, #9 + ldmneia sp!, {r4, pc} + ldrb r0, [r0, #0x26b] + cmp r0, #1 + ldmeqia sp!, {r4, pc} + ldr r0, _020AFF18 ; =_021D5FFC + bl WcmCpsifTryLockMutexInIRQ + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r1, r4, #0x144 + ldr r0, _020AFF1C ; =WcmCpsifKACallback + add r1, r1, #0x2000 + add r2, r4, #0xf00 + mov r3, #0 + bl WM_SetDCFData + cmp r0, #2 + ldmeqia sp!, {r4, pc} + ldr r0, _020AFF18 ; =_021D5FFC + bl WcmCpsifUnlockMutexInIRQ + ldmia sp!, {r4, pc} + .align 2, 0 +_020AFF18: .word _021D5FFC +_020AFF1C: .word WcmCpsifKACallback + arm_func_end WCMi_CpsifSendNullPacket + + arm_func_start WCM_GetApMacAddress +WCM_GetApMacAddress: ; 0x020AFF20 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 + bl WCMi_GetSystemWork + mov r4, r0 + bl OS_DisableInterrupts + cmp r4, #0 + beq _020AFF58 + add r1, r4, #0x2000 + ldr r2, [r1, #0x260] + cmp r2, #9 + ldreqb r1, [r1, #0x26b] + cmpeq r1, #0 + addeq r1, r4, #0x144 + addeq r5, r1, #0x2000 +_020AFF58: + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WCM_GetApMacAddress + + arm_func_start WCM_GetApEssid +WCM_GetApEssid: ; 0x020AFF64 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, #0 + mov r5, r0 + mov r4, r7 + bl WCMi_GetSystemWork + mov r6, r0 + bl OS_DisableInterrupts + cmp r6, #0 + beq _020AFFB0 + add r1, r6, #0x2000 + ldr r2, [r1, #0x260] + cmp r2, #9 + ldreqb r1, [r1, #0x26b] + cmpeq r1, #0 + bne _020AFFB0 + add r1, r6, #0x2100 + ldrh r4, [r1, #0x4a] + add r1, r6, #0x14c + add r7, r1, #0x2000 +_020AFFB0: + bl OS_RestoreInterrupts + cmp r5, #0 + strneh r4, [r5] + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end WCM_GetApEssid + + arm_func_start WCM_SetRecvDCFCallback +WCM_SetRecvDCFCallback: ; 0x020AFFC4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _020AFFE0 ; =_021D5FF0 + str r4, [r1, #0x28] + bl OS_RestoreInterrupts + ldmia sp!, {r4, pc} + .align 2, 0 +_020AFFE0: .word _021D5FF0 + arm_func_end WCM_SetRecvDCFCallback + + arm_func_start WCM_SendDCFDataEx +WCM_SendDCFDataEx: ; 0x020AFFE4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r4, r0 + mov sb, r1 + mov r8, r2 + mov r6, r3 + bl OS_DisableInterrupts + mov r5, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + bne _020B001C + mov r0, r5 + bl OS_RestoreInterrupts + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B001C: + ldr r0, _020B015C ; =_021D5FFC + bl OS_LockMutex + bl WCMi_GetSystemWork + movs r7, r0 + bne _020B0048 + ldr r0, _020B015C ; =_021D5FFC + bl OS_UnlockMutex + mov r0, r5 + bl OS_RestoreInterrupts + mvn r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B0048: + add r0, r7, #0x2000 + ldr r1, [r0, #0x260] + cmp r1, #9 + bne _020B0064 + ldrb r0, [r0, #0x26b] + cmp r0, #1 + bne _020B007C +_020B0064: + ldr r0, _020B015C ; =_021D5FFC + bl OS_UnlockMutex + mov r0, r5 + bl OS_RestoreInterrupts + mvn r0, #3 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B007C: + mov r0, sb + mov r2, r8 + add r1, r7, #0xf00 + bl MI_CpuCopy8 + ldr r2, [sp, #0x20] + cmp r2, #0 + ble _020B00A8 + add r1, r7, #0xf00 + mov r0, r6 + add r1, r1, r8 + bl MI_CpuCopy8 +_020B00A8: + ldr r1, [sp, #0x20] + ldr r0, _020B0160 ; =WcmCpsifWmCallback + add r6, r8, r1 + mov r3, r6, lsl #0x10 + mov r1, r4 + add r2, r7, #0xf00 + mov r3, r3, lsr #0x10 + bl WM_SetDCFData + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020B00F8 +_020B00D4: ; jump table + b _020B00F8 ; case 0 + b _020B00F8 ; case 1 + b _020B0110 ; case 2 + b _020B00F8 ; case 3 + b _020B00F8 ; case 4 + b _020B00F8 ; case 5 + b _020B00F8 ; case 6 + b _020B00F8 ; case 7 + b _020B00F8 ; case 8 +_020B00F8: + ldr r0, _020B015C ; =_021D5FFC + bl OS_UnlockMutex + mov r0, r5 + bl OS_RestoreInterrupts + mvn r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B0110: + ldr r0, _020B0164 ; =_021D5FF4 + bl OS_SleepThread + ldr r0, _020B0168 ; =_021D5FF0 + ldr r0, [r0, #0x24] + cmp r0, #0 + beq _020B0144 + cmp r0, #1 + ldr r0, _020B015C ; =_021D5FFC + bl OS_UnlockMutex + mov r0, r5 + bl OS_RestoreInterrupts + mvn r0, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_020B0144: + ldr r0, _020B015C ; =_021D5FFC + bl OS_UnlockMutex + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_020B015C: .word _021D5FFC +_020B0160: .word WcmCpsifWmCallback +_020B0164: .word _021D5FF4 +_020B0168: .word _021D5FF0 + arm_func_end WCM_SendDCFDataEx + + arm_func_start WcmCpsifWmCallback +WcmCpsifWmCallback: ; 0x020B016C + stmdb sp!, {r3, lr} + ldrh r1, [r0] + cmp r1, #0x12 + ldmneia sp!, {r3, pc} + ldrh r2, [r0, #2] + ldr r1, _020B01A4 ; =_021D5FF0 + str r2, [r1, #0x24] + ldrh r0, [r0, #2] + cmp r0, #0 + bne _020B0198 + bl WCMi_ResetKeepAliveAlarm +_020B0198: + ldr r0, _020B01A8 ; =_021D5FF4 + bl OS_WakeupThread + ldmia sp!, {r3, pc} + .align 2, 0 +_020B01A4: .word _021D5FF0 +_020B01A8: .word _021D5FF4 + arm_func_end WcmCpsifWmCallback + + arm_func_start WcmCpsifKACallback +WcmCpsifKACallback: ; 0x020B01AC + ldr ip, _020B01B8 ; =WcmCpsifUnlockMutexInIRQ + ldr r0, _020B01BC ; =_021D5FFC + bx ip + .align 2, 0 +_020B01B8: .word WcmCpsifUnlockMutexInIRQ +_020B01BC: .word _021D5FFC + arm_func_end WcmCpsifKACallback + + arm_func_start WcmCpsifTryLockMutexInIRQ +WcmCpsifTryLockMutexInIRQ: ; 0x020B01C0 + ldr r2, [r0, #8] + cmp r2, #0 + bne _020B01E8 + ldr r1, _020B020C ; =OS_IrqHandler + str r1, [r0, #8] + ldr r1, [r0, #0xc] + add r1, r1, #1 + str r1, [r0, #0xc] + mov r0, #1 + bx lr +_020B01E8: + ldr r1, _020B020C ; =OS_IrqHandler + cmp r2, r1 + movne r0, #0 + bxne lr + ldr r1, [r0, #0xc] + add r1, r1, #1 + str r1, [r0, #0xc] + mov r0, #1 + bx lr + .align 2, 0 +_020B020C: .word OS_IrqHandler + arm_func_end WcmCpsifTryLockMutexInIRQ + + arm_func_start WcmCpsifUnlockMutexInIRQ +WcmCpsifUnlockMutexInIRQ: ; 0x020B0210 + stmdb sp!, {r3, lr} + ldr r2, [r0, #8] + ldr r1, _020B0244 ; =OS_IrqHandler + cmp r2, r1 + ldmneia sp!, {r3, pc} + ldr r1, [r0, #0xc] + subs r1, r1, #1 + str r1, [r0, #0xc] + ldmneia sp!, {r3, pc} + mov r1, #0 + str r1, [r0, #8] + bl OS_WakeupThread + ldmia sp!, {r3, pc} + .align 2, 0 +_020B0244: .word OS_IrqHandler + arm_func_end WcmCpsifUnlockMutexInIRQ + + arm_func_start WCM_CompareBssID +WCM_CompareBssID: ; 0x020B0248 + mov ip, #0 +_020B024C: + ldrb r3, [r0, ip] + ldrb r2, [r1, ip] + cmp r3, r2 + movne r0, #0 + bxne lr + add ip, ip, #1 + cmp ip, #6 + blt _020B024C + mov r0, #1 + bx lr + arm_func_end WCM_CompareBssID + + arm_func_start WCM_GetLinkLevel +WCM_GetLinkLevel: ; 0x020B0274 + stmdb sp!, {r3, r4, r5, lr} + bl OS_DisableInterrupts + mov r4, r0 + bl WCMi_GetSystemWork + cmp r0, #0 + mov r5, #0 + beq _020B02A8 + add r0, r0, #0x2000 + ldr r0, [r0, #0x260] + cmp r0, #9 + bne _020B02A8 + bl WcmGetLinkLevel + mov r5, r0 +_020B02A8: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end WCM_GetLinkLevel + + arm_func_start WCMi_GetRssiAverage +WCMi_GetRssiAverage: ; 0x020B02B8 + stmdb sp!, {r3, lr} + ldr r1, _020B0330 ; =_021D601C + mov r0, #0 + ldrb r1, [r1] + cmp r1, #0x10 + bls _020B02FC + ldr r3, _020B0334 ; =_021D6020 + mov r2, r0 +_020B02D8: + ldrb r1, [r3], #1 + add r2, r2, #1 + cmp r2, #0x10 + add r0, r0, r1 + blt _020B02D8 + mov r1, r0, asr #3 + add r0, r0, r1, lsr #28 + mov r0, r0, asr #4 + b _020B0328 +_020B02FC: + cmp r1, #0 + beq _020B0328 + mov ip, r0 + ble _020B0324 + ldr r3, _020B0334 ; =_021D6020 +_020B0310: + ldrb r2, [r3], #1 + add ip, ip, #1 + cmp ip, r1 + add r0, r0, r2 + blt _020B0310 +_020B0324: + bl _s32_div_f +_020B0328: + and r0, r0, #0xff + ldmia sp!, {r3, pc} + .align 2, 0 +_020B0330: .word _021D601C +_020B0334: .word _021D6020 + arm_func_end WCMi_GetRssiAverage + + arm_func_start WcmGetLinkLevel +WcmGetLinkLevel: ; 0x020B0338 + stmdb sp!, {r3, lr} + bl WCMi_GetRssiAverage + mov r1, #0 + cmp r0, #0x1c + movhs r1, #3 + bhs _020B0364 + cmp r0, #0x16 + movhs r1, #2 + bhs _020B0364 + cmp r0, #0x10 + movhs r1, #1 +_020B0364: + mov r0, r1 + ldmia sp!, {r3, pc} + arm_func_end WcmGetLinkLevel + + arm_func_start WCMi_ShelterRssi +WCMi_ShelterRssi: ; 0x020B036C + stmdb sp!, {r3, lr} + ldr r2, _020B03C4 ; =_021D601C + tst r0, #2 + ldrb ip, [r2] + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + mov r1, ip, lsr #0x1f + and lr, r0, #0xff + rsb r0, r1, ip, lsl #28 + ldr r3, _020B03C8 ; =_021D6020 + add r0, r1, r0, ror #28 + strb lr, [r3, r0] + add r0, ip, #1 + cmp ip, #0x10 + strlob r0, [r2] + ldmloia sp!, {r3, pc} + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #28 + add r0, r1, r0, ror #28 + add r0, r0, #0x10 + strb r0, [r2] + ldmia sp!, {r3, pc} + .align 2, 0 +_020B03C4: .word _021D601C +_020B03C8: .word _021D6020 + arm_func_end WCMi_ShelterRssi + + ; NitroWiFi: libstubsmd5.a + + arm_func_start MD5Init +MD5Init: ; 0x020B03CC + ldr ip, _020B03D4 ; =DGT_Hash1Reset + bx ip + .align 2, 0 +_020B03D4: .word DGT_Hash1Reset + arm_func_end MD5Init + + arm_func_start MD5Update +MD5Update: ; 0x020B03D8 + ldr ip, _020B03E0 ; =DGT_Hash1SetSource + bx ip + .align 2, 0 +_020B03E0: .word DGT_Hash1SetSource + arm_func_end MD5Update + + arm_func_start MD5Final +MD5Final: ; 0x020B03E4 + ldr ip, _020B03EC ; =DGT_Hash1GetDigest_R + bx ip + .align 2, 0 +_020B03EC: .word DGT_Hash1GetDigest_R + arm_func_end MD5Final + + .rodata + +_02108FB8: + .byte 0x15, 0x03, 0x00, 0x00, 0x02, 0x01, 0x29, 0x00 + .public _02108FC8 +_02108FC0: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00 + .public _02108FC8 +_02108FC8: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + + .data + +_02110628: + .byte 0x00, 0x00, 0x00, 0x00 +_0211062C: + .byte 0xE6, 0xFF, 0xFF, 0xFF +_02110630: + .byte 0x01, 0x01, 0xC0, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 + .byte 0x00, 0x08, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00 +_02110648: + .byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x66, 0x04 + .byte 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x20, 0x00, 0x08, 0x0D, 0x20 +_02110660: + .byte 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x05, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x06, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0D, 0x20 +_02110678: + .asciz "%d.%d.%d.%d" + .balign 4, 0 +_02110684: + .byte 0x10, 0x00, 0x00, 0x00 +_02110688: + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00 +_02110690: + .byte 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 +_0211069C: + .asciz "NintendoDS" + .balign 4, 0 +_021106A8: + .byte 0x55, 0x04, 0x03, 0x00 +_021106AC: + .byte 0xFF, 0xFF, 0xFF, 0x00 +_021106B0: + .byte 0x04, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0xFF, 0xFF +_021106B8: + .word _021106AC + .word _021106D8 + .word _021106D0 + .word _021106E4 + .word _021106F0 + .word _021106A8 +_021106D0: + .byte 0x55, 0x08, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00 +_021106D8: + .byte 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01 + .byte 0x01, 0x00, 0x00, 0x00 +_021106E4: + .byte 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x04, 0x00, 0x00, 0x00 +_021106F0: + .byte 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x00, 0x00, 0x00 + .balign 4, 0 +_021106FC: + .asciz "A" + .balign 4, 0 +_02110700: + .asciz "BB" + .balign 4, 0 +_02110704: + .asciz "CCC" + .balign 4, 0 +_02110708: + .asciz "SRVR" + .balign 4, 0 +_02110710: + .asciz "CLNT" + .balign 4, 0 +_02110718: + .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 + .byte 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x06, 0x0B, 0x00, 0x05, 0x0A, 0x0F, 0x04 + .byte 0x09, 0x0E, 0x03, 0x08, 0x0D, 0x02, 0x07, 0x0C, 0x05, 0x08, 0x0B, 0x0E, 0x01, 0x04, 0x07, 0x0A + .byte 0x0D, 0x00, 0x03, 0x06, 0x09, 0x0C, 0x0F, 0x02, 0x00, 0x07, 0x0E, 0x05, 0x0C, 0x03, 0x0A, 0x01 + .byte 0x08, 0x0F, 0x06, 0x0D, 0x04, 0x0B, 0x02, 0x09 +_02110758: + .byte 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +_02110798: + .byte 0x78, 0xA4, 0x6A, 0xD7, 0x56, 0xB7, 0xC7, 0xE8 + .byte 0xDB, 0x70, 0x20, 0x24, 0xEE, 0xCE, 0xBD, 0xC1, 0xAF, 0x0F, 0x7C, 0xF5, 0x2A, 0xC6, 0x87, 0x47 + .byte 0x13, 0x46, 0x30, 0xA8, 0x01, 0x95, 0x46, 0xFD, 0xD8, 0x98, 0x80, 0x69, 0xAF, 0xF7, 0x44, 0x8B + .byte 0xB1, 0x5B, 0xFF, 0xFF, 0xBE, 0xD7, 0x5C, 0x89, 0x22, 0x11, 0x90, 0x6B, 0x93, 0x71, 0x98, 0xFD + .byte 0x8E, 0x43, 0x79, 0xA6, 0x21, 0x08, 0xB4, 0x49, 0x62, 0x25, 0x1E, 0xF6, 0x40, 0xB3, 0x40, 0xC0 + .byte 0x51, 0x5A, 0x5E, 0x26, 0xAA, 0xC7, 0xB6, 0xE9, 0x5D, 0x10, 0x2F, 0xD6, 0x53, 0x14, 0x44, 0x02 + .byte 0x81, 0xE6, 0xA1, 0xD8, 0xC8, 0xFB, 0xD3, 0xE7, 0xE6, 0xCD, 0xE1, 0x21, 0xD6, 0x07, 0x37, 0xC3 + .byte 0x87, 0x0D, 0xD5, 0xF4, 0xED, 0x14, 0x5A, 0x45, 0x05, 0xE9, 0xE3, 0xA9, 0xF8, 0xA3, 0xEF, 0xFC + .byte 0xD9, 0x02, 0x6F, 0x67, 0x8A, 0x4C, 0x2A, 0x8D, 0x42, 0x39, 0xFA, 0xFF, 0x81, 0xF6, 0x71, 0x87 + .byte 0x22, 0x61, 0x9D, 0x6D, 0x0C, 0x38, 0xE5, 0xFD, 0x44, 0xEA, 0xBE, 0xA4, 0xA9, 0xCF, 0xDE, 0x4B + .byte 0x60, 0x4B, 0xBB, 0xF6, 0x70, 0xBC, 0xBF, 0xBE, 0xC6, 0x7E, 0x9B, 0x28, 0xFA, 0x27, 0xA1, 0xEA + .byte 0x85, 0x30, 0xEF, 0xD4, 0x05, 0x1D, 0x88, 0x04, 0x39, 0xD0, 0xD4, 0xD9, 0xE5, 0x99, 0xDB, 0xE6 + .byte 0xF8, 0x7C, 0xA2, 0x1F, 0x65, 0x56, 0xAC, 0xC4, 0x44, 0x22, 0x29, 0xF4, 0x97, 0xFF, 0x2A, 0x43 + .byte 0xA7, 0x23, 0x94, 0xAB, 0x39, 0xA0, 0x93, 0xFC, 0xC3, 0x59, 0x5B, 0x65, 0x92, 0xCC, 0x0C, 0x8F + .byte 0x7D, 0xF4, 0xEF, 0xFF, 0xD1, 0x5D, 0x84, 0x85, 0x4F, 0x7E, 0xA8, 0x6F, 0xE0, 0xE6, 0x2C, 0xFE + .byte 0x14, 0x43, 0x01, 0xA3, 0xA1, 0x11, 0x08, 0x4E, 0x82, 0x7E, 0x53, 0xF7, 0x35, 0xF2, 0x3A, 0xBD + .byte 0xBB, 0xD2, 0xD7, 0x2A, 0x91, 0xD3, 0x86, 0xEB +_02110898: + .byte 0x80 +_02110899: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/lib/include/ansi_params.h b/lib/include/ansi_params.h new file mode 100644 index 00000000..45f5522e --- /dev/null +++ b/lib/include/ansi_params.h @@ -0,0 +1,16 @@ +#ifndef _MSL_MSLEXTERN_H +#define _MSL_MSLEXTERN_H + +#ifdef __cplusplus +#define _MSL_BEGIN_NAMESPACE_STD namespace std { +#define _MSL_BEGIN_EXTERN_C extern "C" { +#define _MSL_END_EXTERN_C } +#define _MSL_END_NAMESPACE_STD } +#else +#define _MSL_BEGIN_NAMESPACE_STD +#define _MSL_BEGIN_EXTERN_C +#define _MSL_END_EXTERN_C +#define _MSL_END_NAMESPACE_STD +#endif //__cplusplus + +#endif //_MSL_MSLEXTERN_H diff --git a/lib/include/assert.h b/lib/include/assert.h new file mode 100644 index 00000000..a96a4d8a --- /dev/null +++ b/lib/include/assert.h @@ -0,0 +1,17 @@ +#ifndef _MSL_ASSERT_H_ +#define _MSL_ASSERT_H_ + +#define assert(expr) ((expr) ? (void)0 : __msl_assertion_failed(#expr, __FILE__, __func__, __LINE__)) + +// For matching +#define assert_ex(expr, file, line) ((expr) ? (void)0 : __msl_assertion_failed(#expr, file, __func__, line)) + +// Assertion (%s) failed in "%s", function "%s", line %d +extern void __msl_assertion_failed( + const char *expr, + const char *file, + const char *func, + int line +); + +#endif //_MSL_ASSERT_H_ diff --git a/lib/include/cw.h b/lib/include/cw.h new file mode 100644 index 00000000..b39e2e36 --- /dev/null +++ b/lib/include/cw.h @@ -0,0 +1,6 @@ +#ifndef GUARD_CW_H +#define GUARD_CW_H + +#include + +#endif //GUARD_CW_H diff --git a/lib/include/cw/function_target.h b/lib/include/cw/function_target.h new file mode 100644 index 00000000..a1760945 --- /dev/null +++ b/lib/include/cw/function_target.h @@ -0,0 +1,17 @@ +#ifndef GUARD_CW_FUNCTION_TARGET_H +#define GUARD_CW_FUNCTION_TARGET_H + +#define ARM_FUNC _Pragma("thumb off") +#define THUMB_FUNC _Pragma("thumb on") + +#define ENUMS_ALWAYS_INT_ON _Pragma("enumsalwaysint on") +#define ENUMS_ALWAYS_INT_OFF _Pragma("enumsalwaysint off") +#define ENUMS_ALWAYS_INT_RESET _Pragma("enumsalwaysint reset") + +#define ALIGN(num) __attribute__ ((aligned(num))) + +#ifdef __CLION_IDE__ +#define asm +#endif //__CLION_IDE__ + +#endif //GUARD_CW_FUNCTION_TARGET_H diff --git a/lib/include/nitro.h b/lib/include/nitro.h new file mode 100644 index 00000000..1379eefc --- /dev/null +++ b/lib/include/nitro.h @@ -0,0 +1,24 @@ +#ifndef NITRO_H_ +#define NITRO_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif //NITRO_H_ diff --git a/lib/include/nitro/card.h b/lib/include/nitro/card.h new file mode 100644 index 00000000..3914b68d --- /dev/null +++ b/lib/include/nitro/card.h @@ -0,0 +1,9 @@ +#ifndef NITRO_CARD_H_ +#define NITRO_CARD_H_ + +#include +#include + +void CARD_Init(void); + +#endif //NITRO_CARD_H_ diff --git a/lib/include/nitro/card/backup.h b/lib/include/nitro/card/backup.h new file mode 100644 index 00000000..8280b2e7 --- /dev/null +++ b/lib/include/nitro/card/backup.h @@ -0,0 +1,47 @@ +#ifndef NITRO_CARD_BACKUP_BACKUP_H_ +#define NITRO_CARD_BACKUP_BACKUP_H_ + +BOOL CARD_TryWaitBackupAsync(void); +void CARD_CancelBackupAsync(void); + +BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async, CARDRequest req_type, int req_retry, CARDRequestMode req_mode); + +static inline BOOL CARDi_ReadBackup(u32 src, void *dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async) { + return CARDi_RequestStreamCommand((u32)src, (u32)dst, len, callback, arg, is_async, CARD_REQ_READ_BACKUP, 1, CARD_REQUEST_MODE_RECV); +} + +static inline void CARD_ReadBackupAsync(u32 src, void *dst, u32 len, MIDmaCallback callback, void *arg) { + CARDi_ReadBackup(src, dst, len, callback, arg, TRUE); +} + +BOOL CARD_WaitBackupAsync(void); + +static inline BOOL CARD_ReadBackup(u32 src, void *dst, u32 len) { + return CARDi_ReadBackup(src, dst, len, NULL, NULL, FALSE); +} + +static inline BOOL CARDi_WriteBackup(u32 dst, const void *src, u32 len, MIDmaCallback callback, void *arg, BOOL is_async) { + return CARDi_RequestStreamCommand((u32)src, (u32)dst, len, callback, arg, is_async, CARD_REQ_WRITE_BACKUP, CARD_RETRY_COUNT_MAX, CARD_REQUEST_MODE_SEND); +} + +static inline void CARD_WriteBackupAsync(u32 dst, const void *src, u32 len, MIDmaCallback callback, void *arg) { + CARDi_WriteBackup(dst, src, len, callback, arg, TRUE); +} + +static inline BOOL CARD_WriteBackup(u32 dst, const void *src, u32 len) { + return CARDi_WriteBackup(dst, src, len, NULL, NULL, FALSE); +} + +static inline BOOL CARDi_WriteAndVerifyBackup(u32 dst, const void *src, u32 len, MIDmaCallback callback, void *arg, BOOL is_async) { + return CARDi_RequestStreamCommand((u32)src, (u32)dst, len, callback, arg, is_async, CARD_REQ_WRITE_BACKUP, CARD_RETRY_COUNT_MAX, CARD_REQUEST_MODE_SEND_VERIFY); +} + +static inline void CARD_WriteAndVerifyBackupAsync(u32 dst, const void *src, u32 len, MIDmaCallback callback, void *arg) { + CARDi_WriteAndVerifyBackup(dst, src, len, callback, arg, TRUE); +} + +static inline BOOL CARD_WriteAndVerifyBackup(u32 dst, const void *src, u32 len) { + return CARDi_WriteAndVerifyBackup(dst, src, len, NULL, NULL, FALSE); +} + +#endif //NITRO_CARD_BACKUP_BACKUP_H_ diff --git a/lib/include/nitro/card/common.h b/lib/include/nitro/card/common.h new file mode 100644 index 00000000..a22dfddb --- /dev/null +++ b/lib/include/nitro/card/common.h @@ -0,0 +1,239 @@ +#ifndef NITRO_CARD_COMMON_H_ +#define NITRO_CARD_COMMON_H_ + +#include +#include +#include +#include +#include + +#define CARD_PXI_COMMAND_MASK 0x3f +#define CARD_PXI_COMMAND_PULLED_OUT 0x0011 +#define CARD_PXI_COMMAND_TERMINATE 0x0001 + +#define CARD_THREAD_PRIORITY_DEFAULT 4 + +#define CARD_BACKUP_TYPE_DEVICE_SHIFT 0 +#define CARD_BACKUP_TYPE_DEVICE_MASK 0xFF +#define CARD_BACKUP_TYPE_DEVICE_EEPROM 1 +#define CARD_BACKUP_TYPE_DEVICE_FLASH 2 +#define CARD_BACKUP_TYPE_DEVICE_FRAM 3 +#define CARD_BACKUP_TYPE_SIZEBIT_SHIFT 8 +#define CARD_BACKUP_TYPE_SIZEBIT_MASK 0xFF +#define CARD_BACKUP_TYPE_VENDER_SHIFT 16 +#define CARD_BACKUP_TYPE_DEFINE(type, size, vender) \ + (((CARD_BACKUP_TYPE_DEVICE_ ## type) << CARD_BACKUP_TYPE_DEVICE_SHIFT) | \ + ((size) << CARD_BACKUP_TYPE_SIZEBIT_SHIFT) | \ + ((vender) << CARD_BACKUP_TYPE_VENDER_SHIFT)) + +#define ALIGN_MASK(a) ((a) - 1) +#define CARD_ALIGN_HI_BIT(n) (((u32)(n)) & ~ALIGN_MASK(CARD_ROM_PAGE_SIZE)) +#define CARD_ALIGN_LO_BIT(n) (((u32)(n)) & ALIGN_MASK(CARD_ROM_PAGE_SIZE)) + +#define CARD_BACKUP_CAPS_AVAILABLE (u32)(CARD_BACKUP_CAPS_READ - 1) +#define CARD_BACKUP_CAPS_READ (u32)(1 << CARD_REQ_READ_BACKUP) +#define CARD_BACKUP_CAPS_WRITE (u32)(1 << CARD_REQ_WRITE_BACKUP) +#define CARD_BACKUP_CAPS_PROGRAM (u32)(1 << CARD_REQ_PROGRAM_BACKUP) +#define CARD_BACKUP_CAPS_VERIFY (u32)(1 << CARD_REQ_VERIFY_BACKUP) +#define CARD_BACKUP_CAPS_ERASE_PAGE (u32)(1 << CARD_REQ_ERASE_PAGE_BACKUP) +#define CARD_BACKUP_CAPS_ERASE_SECTOR (u32)(1 << CARD_REQ_ERASE_SECTOR_BACKUP) +#define CARD_BACKUP_CAPS_ERASE_CHIP (u32)(1 << CARD_REQ_ERASE_CHIP_BACKUP) + +typedef enum +{ + CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0), + CARD_BACKUP_TYPE_EEPROM_64KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 13, 0), + CARD_BACKUP_TYPE_EEPROM_512KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 16, 0), + CARD_BACKUP_TYPE_FLASH_2MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 18, 0), + CARD_BACKUP_TYPE_FLASH_4MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 19, 0), + CARD_BACKUP_TYPE_FLASH_8MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 20, 0), + CARD_BACKUP_TYPE_FRAM_256KBITS = CARD_BACKUP_TYPE_DEFINE(FRAM, 15, 0), + CARD_BACKUP_TYPE_NOT_USE = 0 +} CARDBackupType; + +#define CARD_BACKUP_TYPE_FLASH_4MBITS_EX (CARDBackupType)(CARD_BACKUP_TYPE_FLASH_4MBITS | (255<callback; + void *const arg = p->callback_arg; + + { + OSIntrMode bak_psr = OS_DisableInterrupts(); + + p->flag &= ~(CARD_STAT_BUSY | CARD_STAT_TASK | CARD_STAT_CANCEL); + OS_WakeupThread(p->busy_q); + if ((p->flag & CARD_STAT_RECV) != 0) + { + OS_WakeupThreadDirect(p->thread); + } + (void)OS_RestoreInterrupts(bak_psr); + } + + if (is_own_task && func) + { + (*func)(arg); + } +} + +static inline void CARDi_WaitTask(CARDiCommon *p, MIDmaCallback callback, void *callback_arg) +{ + OSIntrMode bak_psr = OS_DisableInterrupts(); + while ((p->flag & CARD_STAT_BUSY) != 0) + { + OS_SleepThread(p->busy_q); + } + p->flag |= CARD_STAT_BUSY; + p->callback = callback; + p->callback_arg = callback_arg; + (void)OS_RestoreInterrupts(bak_psr); +} + +void CARDi_SetTask(void (*task) (CARDiCommon *)); +void CARDi_InitCommon(void); +BOOL CARD_IsEnabled(void); +void CARD_CheckEnabled(void); +void CARD_Enable(BOOL enable); +BOOL CARDi_WaitAsync(void); +BOOL CARDi_TryWaitAsync(void); +CARDResult CARD_GetResultCode(void); +void CARD_LockRom(u16 lock_id); +void CARD_UnlockRom(u16 lock_id); +void CARD_UnlockBackup(u16 lock_id); + +#define CARD_RETRY_COUNT_MAX 10 + +static inline void CARDi_SendPxi(u32 data) +{ + while (PXI_SendWordByFifo(PXI_FIFO_TAG_FS, data, TRUE) < 0) + ; +} + +void CARD_SetCacheFlushThreshold(u32 icache, u32 dcache); +BOOL CARD_IdentifyBackup(CARDBackupType type); +void CARD_LockBackup(u16 lock_id); +void CARD_UnlockBackup(u16 lock_id); + +#endif //NITRO_CARD_COMMON_H_ diff --git a/lib/include/nitro/card/pullOut.h b/lib/include/nitro/card/pullOut.h new file mode 100644 index 00000000..4a64f5ae --- /dev/null +++ b/lib/include/nitro/card/pullOut.h @@ -0,0 +1,6 @@ +#ifndef NITRO_CARD_PULLOUT_H_ +#define NITRO_CARD_PULLOUT_H_ + +BOOL CARD_IsPulledOut(void); + +#endif //NITRO_CARD_PULLOUT_H_ diff --git a/lib/include/nitro/card/rom.h b/lib/include/nitro/card/rom.h new file mode 100644 index 00000000..49b0ef81 --- /dev/null +++ b/lib/include/nitro/card/rom.h @@ -0,0 +1,101 @@ +#ifndef NITRO_CARD_ROM_H_ +#define NITRO_CARD_ROM_H_ + +#include +#include +#include +#include + +#define CARD_ROM_PAGE_SIZE 512 + +#define CARDMST_SEL_ROM 0x00 +#define CARDMST_IF_ENABLE 0x40 +#define CARDMST_ENABLE 0x80 + +#define CARD_DATA_READY 0x00800000 +#define CARD_COMMAND_PAGE 0x01000000 +#define CARD_COMMAND_ID 0x07000000 +#define CARD_COMMAND_MASK 0x07000000 +#define CARD_RESET_HI 0x20000000 +#define CARD_READ_MODE 0x00000000 +#define CARD_START 0x80000000 +#define CARD_LATENCY1_MASK 0x00001FFF + +#define MROMOP_G_READ_PAGE 0xB7000000 +#define MROMOP_G_READ_ID 0xB8000000 + +extern CARDiCommon cardi_common; + +typedef struct +{ + u32 offset; + u32 length; +} +CARDRomRegion; + +typedef struct CARDRomStat +{ + void (*read_func) (struct CARDRomStat *); + u32 ctrl; + u8 *cache_page; + u32 dummy[5]; + u8 cache_buf[CARD_ROM_PAGE_SIZE]; +} CARDRomStat; + +static inline const CARDRomRegion * CARD_GetRomRegionOVT(MIProcessor target) +{ + return (target == MI_PROCESSOR_ARM9) + ? (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x50) + : (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x58); +} + +BOOL CARDi_TryReadCardDma(CARDRomStat *p); +void CARDi_ReadCard(CARDRomStat *p); +u32 CARDi_ReadRomIDCore(void); +void CARDi_CheckPulledOutCore(u32 id); +void CARDi_ReadRom(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async); +void CARD_Init(void); +void CARD_WaitRomAsync(void); +void (*CARDi_GetRomAccessor(void)) (CARDRomStat *); + +static inline void CARD_ReadRomAsync(u32 dma, const void * src, void * dst, u32 len, MIDmaCallback callback, void * arg) +{ + CARDi_ReadRom(dma, src, dst, len, callback, arg, TRUE); +} + +static inline const CARDRomRegion * CARD_GetRomRegionFNT() { + return (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x40); +} + +static inline const CARDRomRegion * CARD_GetRomRegionFAT() { + return (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x48); +} + +static inline void CARDi_ReadEnd(void) +{ + CARDiCommon *const p = &cardi_common; + CARDi_CheckPulledOutCore(CARDi_ReadRomIDCore()); + p->cmd->result = CARD_RESULT_SUCCESS; + CARDi_EndTask(p, TRUE); +} + +#ifdef SDK_ARM9 +static inline BOOL CARDi_IsInTcm(u32 buf, u32 len) +{ + const u32 i = (u32)HW_ITCM; + const u32 d = OS_GetDTCMAddress(); + return ((i < buf + len) && (i + HW_ITCM_SIZE > buf)) || + ((d < buf + len) && (d + HW_DTCM_SIZE > buf)); +} +#endif + +extern u32 cardi_rom_header_addr; + +static inline u32 CARDi_GetRomFlag(u32 flag) +{ + const u32 rom_ctrl = *(vu32 *)(cardi_rom_header_addr + 0x60); + return (u32)((rom_ctrl & ~CARD_COMMAND_MASK) | flag | + CARD_READ_MODE | CARD_START | CARD_RESET_HI); +} + +#endif //NITRO_CARD_ROM_H_ diff --git a/lib/include/nitro/code16.h b/lib/include/nitro/code16.h new file mode 100644 index 00000000..2f9a8e9f --- /dev/null +++ b/lib/include/nitro/code16.h @@ -0,0 +1,17 @@ +#pragma thumb on +// Prepare to switch the definition of FX_Mul +#ifdef FX_Mul +#undef FX_Mul +#endif +// Prepare to switch the definition of FX_MulFx64c +#ifdef FX_Mul32x64c +#undef FX_Mul32x64c +#endif +// Prepare to switch the definition of MATH_CountLeadingZeros +#ifdef MATH_CountLeadingZeros +#undef MATH_CountLeadingZeros +#endif +// Because CPU is in THUMB mode, function versions are used. +#define FX_Mul(v1, v2) FX_MulFunc(v1, v2) +#define FX_Mul32x64c(v32, v64c) FX_Mul32x64cFunc(v32, v64c) +#define MATH_CountLeadingZeros(x) MATH_CountLeadingZerosFunc(x) diff --git a/lib/include/nitro/code32.h b/lib/include/nitro/code32.h new file mode 100644 index 00000000..c699204e --- /dev/null +++ b/lib/include/nitro/code32.h @@ -0,0 +1,17 @@ +#pragma thumb off +// Prepare to switch the definition of FX_Mul +#ifdef FX_Mul +#undef FX_Mul +#endif +// Prepare to switch the definition of FX_MulFx64c +#ifdef FX_Mul32x64c +#undef FX_Mul32x64c +#endif +// Prepare to switch the definition of MATH_CountLeadingZeros +#ifdef MATH_CountLeadingZeros +#undef MATH_CountLeadingZeros +#endif +// Because CPU is in ARM mode, inline versions are used. +#define FX_Mul(v1, v2) FX_MulInline(v1, v2) +#define FX_Mul32x64c(v32, v64c) FX_Mul32x64cInline(v32, v64c) +#define MATH_CountLeadingZeros(x) MATH_CountLeadingZerosInline(x) diff --git a/lib/include/nitro/codereset.h b/lib/include/nitro/codereset.h new file mode 100644 index 00000000..90e578e7 --- /dev/null +++ b/lib/include/nitro/codereset.h @@ -0,0 +1,5 @@ +#ifdef SDK_CODE_ARM +#include +#else +#include +#endif diff --git a/lib/include/nitro/cp.h b/lib/include/nitro/cp.h new file mode 100644 index 00000000..b2262024 --- /dev/null +++ b/lib/include/nitro/cp.h @@ -0,0 +1,6 @@ +#ifndef NITRO_CP_H_ +#define NITRO_CP_H_ + +#include + +#endif //NITRO_CP_H_ diff --git a/lib/include/nitro/cp/context.h b/lib/include/nitro/cp/context.h new file mode 100644 index 00000000..9c8fac7b --- /dev/null +++ b/lib/include/nitro/cp/context.h @@ -0,0 +1,17 @@ +#ifndef NITRO_CP_CONTEXT_H_ +#define NITRO_CP_CONTEXT_H_ + +#include + +typedef struct CPContext { + u64 div_numer; + u64 div_denom; + u64 sqrt; + u16 div_mode; + u16 sqrt_mode; +} CPContext; + +void CP_SaveContext(register CPContext *context); +void CPi_RestoreContext(register CPContext *context); + +#endif //NITRO_CP_CONTEXT_H_ diff --git a/lib/include/nitro/ctrdg.h b/lib/include/nitro/ctrdg.h new file mode 100644 index 00000000..c2c524e6 --- /dev/null +++ b/lib/include/nitro/ctrdg.h @@ -0,0 +1,12 @@ +#ifndef NITRO_CTRDG_H_ +#define NITRO_CTRDG_H_ + +#include + +#ifdef SDK_ARM7 +#include +#endif //SDK_ARM7 + +void CTRDG_Init(void); + +#endif //NITRO_CTRDG_H_ diff --git a/lib/include/nitro/ctrdg/ARM7/vibrate.h b/lib/include/nitro/ctrdg/ARM7/vibrate.h new file mode 100644 index 00000000..68c4f8c1 --- /dev/null +++ b/lib/include/nitro/ctrdg/ARM7/vibrate.h @@ -0,0 +1,6 @@ +#ifndef NITRO_CTRDG_ARM7_VIBRATE_H_ +#define NITRO_CTRDG_ARM7_VIBRATE_H_ + +void CTRDG_VibPulseEdgeUpdate(int value); + +#endif //NITRO_CTRDG_ARM7_VIBRATE_H_ diff --git a/lib/include/nitro/ctrdg/common/ctrdg_common.h b/lib/include/nitro/ctrdg/common/ctrdg_common.h new file mode 100644 index 00000000..f0e237be --- /dev/null +++ b/lib/include/nitro/ctrdg/common/ctrdg_common.h @@ -0,0 +1,6 @@ +#ifndef NITRO_CTRDG_COMMON_CTRDG_COMMON_H +#define NITRO_CTRDG_COMMON_CTRDG_COMMON_H + +BOOL CTRDG_IsPulledOut(void); + +#endif //NITRO_CTRDG_COMMON_CTRDG_COMMON_H diff --git a/lib/include/nitro/dgt/common.h b/lib/include/nitro/dgt/common.h new file mode 100644 index 00000000..08a49dc0 --- /dev/null +++ b/lib/include/nitro/dgt/common.h @@ -0,0 +1,11 @@ +#ifndef NITRO_DGT_COMMON_H_ +#define NITRO_DGT_COMMON_H_ + +#define DGT_HASH1_DIGEST_SIZE (128/8) +#define DGT_HASH2_DIGEST_SIZE (160/8) +#define DGT_HASH_DIGEST_SIZE_MAX DGT_HASH2_DIGEST_SIZE +#define DGT_HASH_BLOCK_SIZE (512/8) + + + +#endif //NITRO_DGT_COMMON_H_ diff --git a/lib/include/nitro/dtcm_begin.h b/lib/include/nitro/dtcm_begin.h new file mode 100644 index 00000000..ec8c5c15 --- /dev/null +++ b/lib/include/nitro/dtcm_begin.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section DTCM begin +#endif diff --git a/lib/include/nitro/dtcm_end.h b/lib/include/nitro/dtcm_end.h new file mode 100644 index 00000000..796bb7ae --- /dev/null +++ b/lib/include/nitro/dtcm_end.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section DTCM end +#endif diff --git a/lib/include/nitro/exi.h b/lib/include/nitro/exi.h new file mode 100644 index 00000000..2c0c4236 --- /dev/null +++ b/lib/include/nitro/exi.h @@ -0,0 +1,8 @@ +#ifndef GUARD_EXI_H +#define GUARD_EXI_H + +#ifdef SDK_ARM7 +#include +#endif //SDK_ARM7 + +#endif //GUARD_EXI_H diff --git a/lib/include/nitro/exi/ARM7/genPort.h b/lib/include/nitro/exi/ARM7/genPort.h new file mode 100644 index 00000000..76f1735c --- /dev/null +++ b/lib/include/nitro/exi/ARM7/genPort.h @@ -0,0 +1,16 @@ +#ifndef NITRO_EXI_GENPORT_H_ +#define NITRO_EXI_GENPORT_H_ + +#include + +typedef enum { + EXI_GPIOIF_SERIAL = 0x0000, + EXI_GPIOIF_UNDEF = REG_EXI_RCNT0_L_RE0_MASK, + EXI_GPIOIF_GPIO = REG_EXI_RCNT0_L_RE1_MASK, + EXI_GPIOIF_JOY = REG_EXI_RCNT0_L_RE1_MASK | REG_EXI_RCNT0_L_RE0_MASK +} EXIGpioIF; + +void EXIi_SetBitRcnt0L(u16 mask, u16 data); +void EXIi_SelectRcnt(EXIGpioIF type); + +#endif //NITRO_EXI_GENPORT_H_ diff --git a/lib/include/nitro/fs.h b/lib/include/nitro/fs.h new file mode 100644 index 00000000..81ca52bd --- /dev/null +++ b/lib/include/nitro/fs.h @@ -0,0 +1,8 @@ +#ifndef NITRO_FS_H_ +#define NITRO_FS_H_ + +#include +#include +#include + +#endif //NITRO_FS_H_ diff --git a/lib/include/nitro/fs/archive.h b/lib/include/nitro/fs/archive.h new file mode 100644 index 00000000..84fad269 --- /dev/null +++ b/lib/include/nitro/fs/archive.h @@ -0,0 +1,218 @@ +#ifndef NITRO_FS_ARCHIVE_H_ +#define NITRO_FS_ARCHIVE_H_ + +#include + +struct FSFile; +struct FSArchive; + +#define FS_ARCHIVE_NAME_LEN_MAX 3 + +#define FS_ARCHIVE_FLAG_REGISTER 0x00000001 +#define FS_ARCHIVE_FLAG_LOADED 0x00000002 +#define FS_ARCHIVE_FLAG_TABLE_LOAD 0x00000004 +#define FS_ARCHIVE_FLAG_SUSPEND 0x00000008 +#define FS_ARCHIVE_FLAG_RUNNING 0x00000010 +#define FS_ARCHIVE_FLAG_CANCELING 0x00000020 +#define FS_ARCHIVE_FLAG_SUSPENDING 0x00000040 +#define FS_ARCHIVE_FLAG_UNLOADING 0x00000080 +#define FS_ARCHIVE_FLAG_IS_ASYNC 0x00000100 +#define FS_ARCHIVE_FLAG_IS_SYNC 0x00000200 + +typedef enum { + FS_COMMAND_ASYNC_BEGIN = 0, + FS_COMMAND_READFILE = FS_COMMAND_ASYNC_BEGIN, + FS_COMMAND_WRITEFILE, + FS_COMMAND_ASYNC_END, + + FS_COMMAND_SYNC_BEGIN = FS_COMMAND_ASYNC_END, + FS_COMMAND_SEEKDIR = FS_COMMAND_SYNC_BEGIN, + FS_COMMAND_READDIR, + FS_COMMAND_FINDPATH, + FS_COMMAND_GETPATH, + FS_COMMAND_OPENFILEFAST, + FS_COMMAND_OPENFILEDIRECT, + FS_COMMAND_CLOSEFILE, + FS_COMMAND_SYNC_END, + + FS_COMMAND_STATUS_BEGIN = FS_COMMAND_SYNC_END, + FS_COMMAND_ACTIVATE = FS_COMMAND_STATUS_BEGIN, + FS_COMMAND_IDLE, + FS_COMMAND_SUSPEND, + FS_COMMAND_RESUME, + FS_COMMAND_STATUS_END, + + FS_COMMAND_INVALID +} FSCommandType; + +/* Asynchronous commands*/ +#define FS_ARCHIVE_PROC_READFILE (1 << FS_COMMAND_READFILE) +#define FS_ARCHIVE_PROC_WRITEFILE (1 << FS_COMMAND_WRITEFILE) +/* All asynchronous commands*/ +#define FS_ARCHIVE_PROC_ASYNC \ + (FS_ARCHIVE_PROC_READFILE | FS_ARCHIVE_PROC_WRITEFILE) + +/* Synchronous commands*/ +#define FS_ARCHIVE_PROC_SEEKDIR (1 << FS_COMMAND_SEEKDIR) +#define FS_ARCHIVE_PROC_READDIR (1 << FS_COMMAND_READDIR) +#define FS_ARCHIVE_PROC_FINDPATH (1 << FS_COMMAND_FINDPATH) +#define FS_ARCHIVE_PROC_GETPATH (1 << FS_COMMAND_GETPATH) +#define FS_ARCHIVE_PROC_OPENFILEFAST (1 << FS_COMMAND_OPENFILEFAST) +#define FS_ARCHIVE_PROC_OPENFILEDIRECT (1 << FS_COMMAND_OPENFILEDIRECT) +#define FS_ARCHIVE_PROC_CLOSEFILE (1 << FS_COMMAND_CLOSEFILE) +/* All synchronous commands*/ +#define FS_ARCHIVE_PROC_SYNC \ + (FS_ARCHIVE_PROC_SEEKDIR | FS_ARCHIVE_PROC_READDIR | \ + FS_ARCHIVE_PROC_FINDPATH | FS_ARCHIVE_PROC_GETPATH | \ + FS_ARCHIVE_PROC_OPENFILEFAST | FS_ARCHIVE_PROC_OPENFILEDIRECT | FS_ARCHIVE_PROC_CLOSEFILE) + +/* Messages when status changes*/ +#define FS_ARCHIVE_PROC_ACTIVATE (1 << FS_COMMAND_ACTIVATE) +#define FS_ARCHIVE_PROC_IDLE (1 << FS_COMMAND_IDLE) +#define FS_ARCHIVE_PROC_SUSPENDING (1 << FS_COMMAND_SUSPEND) +#define FS_ARCHIVE_PROC_RESUME (1 << FS_COMMAND_RESUME) +/* All messages when status changes*/ +#define FS_ARCHIVE_PROC_STATUS \ + (FS_ARCHIVE_PROC_ACTIVATE | FS_ARCHIVE_PROC_IDLE | \ + FS_ARCHIVE_PROC_SUSPENDING | FS_ARCHIVE_PROC_RESUME) + +#define FS_ARCHIVE_PROC_ALL (~0) + +typedef enum { + FS_RESULT_SUCCESS = 0, + FS_RESULT_FAILURE, + FS_RESULT_BUSY, + FS_RESULT_CANCELED, + FS_RESULT_CANCELLED = FS_RESULT_CANCELED, // SDK alias + FS_RESULT_UNSUPPORTED, + FS_RESULT_ERROR, + FS_RESULT_PROC_ASYNC, + FS_RESULT_PROC_DEFAULT, + FS_RESULT_PROC_UNKNOWN +} +FSResult; + +typedef FSResult (*FS_ARCHIVE_READ_FUNC) (struct FSArchive *p, void *dst, u32 pos, u32 size); +typedef FSResult (*FS_ARCHIVE_WRITE_FUNC) (struct FSArchive *p, const void *src, u32 pos, u32 size); +typedef FSResult (*FS_ARCHIVE_PROC_FUNC) (struct FSFile *, FSCommandType); + +typedef struct +{ + struct FSFile * prev; + struct FSFile * next; +} +FSFileLink; + +typedef struct +{ + u32 start; + u16 index; + u16 parent; +} FSArchiveFNT; + +typedef struct +{ + u32 top; + u32 bottom; +} FSArchiveFAT; + +typedef struct FSArchive +{ + union + { + char ptr[4]; + u32 pack; + } name; + struct FSArchive * next; + struct FSArchive * prev; + OSThreadQueue sync_q; + OSThreadQueue stat_q; + u32 flag; + FSFileLink list; + u32 base; + u32 fat; + u32 fat_size; + u32 fnt; + u32 fnt_size; + u32 fat_bak; + u32 fnt_bak; + void * load_mem; + FS_ARCHIVE_READ_FUNC read_func; + FS_ARCHIVE_WRITE_FUNC write_func; + FS_ARCHIVE_READ_FUNC table_func; + FS_ARCHIVE_PROC_FUNC proc; + u32 proc_flag; +} FSArchive; + +static inline BOOL FS_IsArchiveLoaded(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_LOADED) ? TRUE : FALSE; +} + +static inline u32 FS_GetArchiveOffset(const FSArchive * p_arc, u32 pos) +{ + return p_arc->base + pos; +} + +static inline BOOL FSi_IsArchiveCanceling(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_CANCELING) != 0; +} + +static inline BOOL FS_IsArchiveSuspended(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_SUSPEND) ? TRUE : FALSE; +} + +static inline BOOL FSi_IsArchiveSuspending(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_SUSPENDING) != 0; +} + +static inline BOOL FSi_IsArchiveRunning(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_RUNNING) != 0; +} + +static inline BOOL FSi_IsArchiveUnloading(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_UNLOADING) != 0; +} + +static inline BOOL FSi_IsArchiveAsync(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_IS_ASYNC) != 0; +} + +static inline BOOL FSi_IsArchiveSync(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_IS_SYNC) != 0; +} + +static inline BOOL FS_IsArchiveTableLoaded(volatile const FSArchive * p_arc) +{ + return (p_arc->flag & FS_ARCHIVE_FLAG_TABLE_LOAD) ? TRUE : FALSE; +} + +u32 FSi_GetPackedName(const char * name, int name_len); +FSResult FSi_ReadMemCallback(struct FSArchive * p_arc, void * dest, u32 pos, u32 size); +FSResult FSi_WriteMemCallback(struct FSArchive * p_arc, const void * src, u32 pos, u32 size); +FSResult FSi_ReadMemoryCore(struct FSArchive * p_arc, void * dest, u32 pos, u32 size); +struct FSFile * FSi_NextCommand(struct FSArchive * p_arc); +void FSi_ExecuteAsyncCommand(struct FSFile * p_file); +BOOL FSi_ExecuteSyncCommand(struct FSFile * file); +BOOL FSi_SendCommand(struct FSFile * file, FSCommandType command); +void FS_InitArchive(struct FSArchive * p_arc); +struct FSArchive * const FS_FindArchive(const char * path, int offset); +BOOL FS_RegisterArchiveName(struct FSArchive * p_arc, const char * name, int name_len); +void FS_ReleaseArchiveName(struct FSArchive * p_arc); +BOOL FS_LoadArchive(struct FSArchive * p_arc, u32 base, u32 fat, u32 fat_size, u32 fnt, u32 fnt_size, FS_ARCHIVE_READ_FUNC read_func, FS_ARCHIVE_WRITE_FUNC write_func); +BOOL FS_UnloadArchive(struct FSArchive * p_arc); +u32 FS_LoadArchiveTables(struct FSArchive *p_arc, void *p_mem, u32 max_size); +void * FS_UnloadArchiveTables(struct FSArchive * p_arc); +BOOL FS_SuspendArchive(struct FSArchive * p_arc); +BOOL FS_ResumeArchive(struct FSArchive * p_arc); +void FS_SetArchiveProc(struct FSArchive * p_arc, FS_ARCHIVE_PROC_FUNC proc, u32 flags); +void FS_NotifyArchiveAsyncEnd(struct FSArchive *p_arc, FSResult ret); + +#endif //NITRO_FS_ARCHIVE_H_ diff --git a/lib/include/nitro/fs/file.h b/lib/include/nitro/fs/file.h new file mode 100644 index 00000000..2079566a --- /dev/null +++ b/lib/include/nitro/fs/file.h @@ -0,0 +1,227 @@ +#ifndef NITRO_FS_FILE_H_ +#define NITRO_FS_FILE_H_ + +#include + +#define FS_FILE_STATUS_BUSY 0x00000001 +#define FS_FILE_STATUS_CANCEL 0x00000002 +#define FS_FILE_STATUS_SYNC 0x00000004 +#define FS_FILE_STATUS_ASYNC 0x00000008 +#define FS_FILE_STATUS_IS_FILE 0x00000010 +#define FS_FILE_STATUS_IS_DIR 0x00000020 +#define FS_FILE_STATUS_OPERATING 0x00000040 + +#define FS_FILE_NAME_MAX 127 + +typedef enum FSSeekFileMode +{ + FS_SEEK_SET = 0, + FS_SEEK_CUR, + FS_SEEK_END +} FSSeekFileMode; + +struct FSFile; + +#define FS_DMA_NOT_USE ((u32)~0) + +typedef struct FSDirPos +{ + struct FSArchive *arc; + u16 own_id; + u16 index; + u32 pos; +} +FSDirPos; // size = 0xC + +typedef struct FSFileID +{ + struct FSArchive *arc; + u32 file_id; +} +FSFileID; + +typedef struct +{ + union + { + FSFileID file_id; + FSDirPos dir_id; + }; + u32 is_directory; + u32 name_len; + char name[128]; +} +FSDirEntry; + + +typedef struct +{ + FSDirPos pos; +} +FSSeekDirInfo; + + +typedef struct +{ + FSDirEntry *p_entry; + BOOL skip_string; +} +FSReadDirInfo; + + +typedef struct +{ + FSDirPos pos; + const char *path; + BOOL find_directory; + union + { + FSFileID *file; + FSDirPos *dir; + } + result; +} +FSFindPathInfo; + + +typedef struct +{ + u8 *buf; + u32 buf_len; + u16 total_len; + u16 dir_id; +} +FSGetPathInfo; + + +typedef struct +{ + FSFileID id; +} +FSOpenFileFastInfo; + + +typedef struct +{ + u32 top; + u32 bottom; + u32 index; +} +FSOpenFileDirectInfo; + + +typedef struct +{ + u32 reserved; +} +FSCloseFileInfo; + + +typedef struct +{ + void *dst; + u32 len_org; + u32 len; +} +FSReadFileInfo; + + +typedef struct +{ + const void *src; + u32 len_org; + u32 len; +} +FSWriteFileInfo; + +typedef struct FSFile +{ + FSFileLink link; // 0x00 + struct FSArchive *arc; // 0x08 + u32 stat; // 0xC + FSCommandType command; // 0x10 + FSResult error; // 0x14 + OSThreadQueue queue[1]; // 0x18 + union { + struct + { + u32 own_id; // 0x20 + u32 top; // 0x24 + u32 bottom; // 0x28 + u32 pos; // 0x2C + } file; + struct + { + FSDirPos pos; // 0x20 + u32 parent; // 0x2C + } dir; + } prop; // 0x20 + + union { + FSReadFileInfo readfile; // 0x30 + FSWriteFileInfo writefile; // 0x30 + + FSSeekDirInfo seekdir; // 0x30 + FSReadDirInfo readdir; // 0x30 + FSFindPathInfo findpath; // 0x30 + FSGetPathInfo getpath; // 0x30 + FSOpenFileFastInfo openfilefast; // 0x30 + FSOpenFileDirectInfo openfiledirect; // 0x30 + FSCloseFileInfo closefile; // 0x30 + } arg; // 0x30 +} +FSFile; // size = 0x50 + +void FS_Init(u32 default_dma_no); +BOOL FS_IsAvailable(void); +void FS_InitFile(FSFile * p_file); +int FSi_ReadFileCore(FSFile * p_file, void * dst, s32 len, BOOL async); +BOOL FS_ConvertPathToFileID(FSFileID * p_file_id, const char * path); +BOOL FS_OpenFileDirect(FSFile * p_file, FSArchive * p_arc, u32 image_top, u32 image_bottom, u32 file_index); +BOOL FS_OpenFileFast(FSFile * p_file, FSFileID file_id); +BOOL FS_OpenFile(FSFile * p_file, const char * path); +BOOL FS_CloseFile(FSFile * p_file); +BOOL FS_WaitAsync(FSFile * p_file); +int FS_ReadFileAsync(FSFile * p_file, void * dst, s32 len); +int FS_ReadFile(FSFile * p_file, void * dst, s32 len); +BOOL FS_SeekFile(FSFile * p_file, s32 offset, FSSeekFileMode origin); +BOOL FS_ChangeDir(const char * path); +u32 FS_SetDefaultDMA(u32 dma_no); + +static inline u32 const FS_GetFileImageTop(volatile const FSFile * p_file) { + return p_file->prop.file.top; +} + +static inline u32 const FS_GetLength(volatile const FSFile * p_file) +{ + return p_file->prop.file.bottom - p_file->prop.file.top; +} + +static inline BOOL FS_IsCanceling(volatile const FSFile * p_file) +{ + return (p_file->stat & FS_FILE_STATUS_CANCEL) ? TRUE : FALSE; +} + +static inline BOOL FS_IsFileSyncMode(volatile const FSFile * p_file) +{ + return (p_file->stat & FS_FILE_STATUS_SYNC) ? TRUE : FALSE; +} + +static inline BOOL FS_IsBusy(volatile const FSFile * p_file) +{ + return p_file->stat & FS_FILE_STATUS_BUSY ? TRUE : FALSE; +} + +static inline BOOL FS_IsSucceeded(volatile const FSFile * p_file) +{ + return (p_file->error == FS_RESULT_SUCCESS) ? TRUE : FALSE; +} + +static inline BOOL FS_IsDir(volatile const FSFile * p_file) +{ + return (p_file->stat & FS_FILE_STATUS_IS_DIR) ? TRUE : FALSE; +} + +u32 FS_TryLoadTable(void *p_mem, u32 maxsize); + +#endif //NITRO_FS_FILE_H_ diff --git a/lib/include/nitro/fs/overlay.h b/lib/include/nitro/fs/overlay.h new file mode 100644 index 00000000..7bca17f6 --- /dev/null +++ b/lib/include/nitro/fs/overlay.h @@ -0,0 +1,77 @@ +#ifndef NITRO_FS_OVERLAY_H_ +#define NITRO_FS_OVERLAY_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef SDK_ASM +#define FS_EXTERN_OVERLAY(name) .public SDK_OVERLAY_##name##_ID +#define FS_OVERLAY_ID(name) SDK_OVERLAY_##name##_ID +#else +#include +#include +#include + +typedef u32 FSOverlayID; + +#define FS_EXTERN_OVERLAY(name) extern u32 SDK_OVERLAY_ ## name ## _ID[1] +#define FS_OVERLAY_ID(name) ((u32)&(SDK_OVERLAY_ ## name ## _ID)) + +typedef void (*FSOverlayInitFunc)(void); + +typedef struct FSOverlayInfoHeader +{ + u32 id; + u8 *ram_address; + u32 ram_size; + u32 bss_size; + FSOverlayInitFunc *sinit_init; + FSOverlayInitFunc *sinit_init_end; + u32 file_id; + u32 compressed: 24; + u32 flag: 8; +} FSOverlayInfoHeader; + +typedef struct FSOverlayInfo +{ + FSOverlayInfoHeader header; + MIProcessor target; + CARDRomRegion file_pos; +} FSOverlayInfo; + +static inline u8 *const FS_GetOverlayAddress(FSOverlayInfo *p_ovi) +{ + return p_ovi->header.ram_address; +} + +static inline u32 const FS_GetOverlayImageSize(FSOverlayInfo *p_ovi) +{ + return p_ovi->header.ram_size; +} + +static inline u32 const FS_GetOverlayTotalSize(FSOverlayInfo *p_ovi) +{ + return p_ovi->header.ram_size + p_ovi->header.bss_size; +} + +u32 FSi_GetOverlayBinarySize(FSOverlayInfo * p_ovi); +void FS_ClearOverlayImage(FSOverlayInfo * p_ovi); +FSFileID FS_GetOverlayFileID(FSOverlayInfo * p_ovi); +BOOL FSi_LoadOverlayInfoCore(FSOverlayInfo * p_ovi, MIProcessor target, FSOverlayID id, FSArchive * arc, u32 offset_arm9, u32 len_arm9, u32 offset_arm7, u32 len_arm7); +BOOL FS_LoadOverlayInfo(FSOverlayInfo *p_ovi, MIProcessor target, FSOverlayID id); +BOOL FS_LoadOverlayImageAsync(FSOverlayInfo *p_ovi, FSFile *p_file); +BOOL FS_LoadOverlayImage(FSOverlayInfo *p_ovi); +BOOL FSi_CompareDigest(const u8 *spec_digest, void *src, u32 len); +void FS_StartOverlay(FSOverlayInfo *p_ovi); +void FS_EndOverlay(FSOverlayInfo *p_ovi); +BOOL FS_UnloadOverlayImage(FSOverlayInfo * p_ovi); +BOOL FS_LoadOverlay(MIProcessor target, FSOverlayID id); +BOOL FS_UnloadOverlay(MIProcessor target, FSOverlayID id); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif //NITRO_FS_OVERLAY_H_ diff --git a/lib/include/nitro/fx.h b/lib/include/nitro/fx.h new file mode 100644 index 00000000..3e53474b --- /dev/null +++ b/lib/include/nitro/fx.h @@ -0,0 +1,11 @@ +#ifndef NITRO_FX_H_ +#define NITRO_FX_H_ + +#include +#include +#include +#include +#include +#include + +#endif //NITRO_FX_H_ diff --git a/lib/include/nitro/fx/.gitignore b/lib/include/nitro/fx/.gitignore new file mode 100644 index 00000000..e0c047f4 --- /dev/null +++ b/lib/include/nitro/fx/.gitignore @@ -0,0 +1 @@ +fx_const.h diff --git a/lib/include/nitro/fx/fx.h b/lib/include/nitro/fx/fx.h new file mode 100644 index 00000000..fe70c575 --- /dev/null +++ b/lib/include/nitro/fx/fx.h @@ -0,0 +1,186 @@ +#ifndef NITRO_FX_FX_H_ +#define NITRO_FX_FX_H_ + +// 19.12 +typedef s32 fx32; +#define FX32_SHIFT 12 +#define FX32_INT_SIZE 19 +#define FX32_DEC_SIZE 12 + +#define FX32_INT_MASK 0x7ffff000 +#define FX32_DEC_MASK 0x00000fff +#define FX32_SIGN_MASK 0x80000000 + +#define FX32_MAX ((fx32)0x7fffffff) +#define FX32_MIN ((fx32)0x80000000) + +#define FX_MUL(v1, v2) FX32_CAST(((fx64)(v1) * (v2) + 0x800LL) >> FX32_SHIFT) +#define FX_MUL32x64C(v1, v2) FX32_CAST(((v2) * (v1) + 0x80000000LL) >> 32) + +#define FX_FX32_TO_F32(x) ((f32)((x) / (f32)(1 << FX32_SHIFT))) +#define FX_F32_TO_FX32(x) ((fx32)(((x) > 0) ? \ + ((x) * (1 << FX32_SHIFT) + 0.5f ) : \ + ((x) * (1 << FX32_SHIFT) - 0.5f ))) + +#define FX32_CONST(x) FX_F32_TO_FX32(x) + +// 51.12 +typedef s64 fx64; +#define FX64_SHIFT 12 +#define FX64_INT_SIZE 51 +#define FX64_DEC_SIZE 12 + +#define FX64_INT_MASK ((fx64)0x7ffffffffffff000) +#define FX64_DEC_MASK ((fx64)0x0000000000000fff) +#define FX64_SIGN_MASK ((fx64)0x8000000000000000) + +#define FX64_MAX ((fx64)0x7fffffffffffffff) +#define FX64_MIN ((fx64)0x8000000000000000) + +#define FX_FX64_TO_F32(x) ((f32)((x) / (f32)(1 << FX64_SHIFT))) +#define FX_F32_TO_FX64(x) ((fx64)(((x) > 0) ? \ + ((x) * (1 << FX32_SHIFT) + 0.5f ) : \ + ((x) * (1 << FX32_SHIFT) - 0.5f ))) + +#define FX64_CONST(x) FX_F32_TO_FX64(x) + +// 31.32 +typedef s64 fx64c; +#define FX64C_SHIFT 32 +#define FX64C_INT_SIZE 31 +#define FX64C_DEC_SIZE 32 + +#define FX64C_INT_MASK ((fx64c)0x7fffffff00000000) +#define FX64C_DEC_MASK ((fx64c)0x00000000ffffffff) +#define FX64C_SIGN_MASK ((fx64c)0x8000000000000000) + +#define FX64C_MAX ((fx64c)0x7fffffffffffffff) +#define FX64C_MIN ((fx64c)0x8000000000000000) + +#define FX_FX64C_TO_F32(x) ((f32)((x) / (f32)((fx64c)1 << FX64C_SHIFT))) +#define FX_F32_TO_FX64C(x) ((fx64c)(((x) > 0) ? \ + ((x) * ((fx64c)1 << FX64C_SHIFT) + 0.5f ) : \ + ((x) * ((fx64c)1 << FX64C_SHIFT) - 0.5f ))) + +#define FX64C_CONST(x) FX_F32_TO_FX64C(x) + +// 3.12 +typedef s16 fx16; +#define FX16_SHIFT 12 +#define FX16_INT_SIZE 3 +#define FX16_DEC_SIZE 12 + +#define FX16_INT_MASK 0x7000 +#define FX16_DEC_MASK 0x0fff +#define FX16_SIGN_MASK 0x8000 + +/* 7.999759 */ +#define FX16_MAX ((fx16)0x7fff) +/* -8 */ +#define FX16_MIN ((fx16)0x8000) + +#define FX_FX16_TO_F32(x) ((f32)((x) / (f32)(1 << FX16_SHIFT))) +#define FX_F32_TO_FX16(x) ((fx16)(((x) > 0) ? \ + (fx16)((x) * (1 << FX16_SHIFT) + 0.5f ) : \ + (fx16)((x) * (1 << FX16_SHIFT) - 0.5f ))) + +#define FX16_CONST(x) FX_F32_TO_FX16(x) + +// Vectors +typedef struct { + fx32 x; + fx32 y; + fx32 z; +} VecFx32; + +typedef struct { + fx16 x; + fx16 y; + fx16 z; +} VecFx16; + +// Matrices +typedef union { + struct { + fx32 _00, _01, _02, _03; + fx32 _10, _11, _12, _13; + fx32 _20, _21, _22, _23; + fx32 _30, _31, _32, _33; + }; + fx32 m[4][4]; + fx32 a[16]; +} MtxFx44; + +typedef union { + struct { + fx32 _00, _01, _02; + fx32 _10, _11, _12; + fx32 _20, _21, _22; + fx32 _30, _31, _32; + }; + fx32 m[4][3]; + fx32 a[12]; +} MtxFx43; + +typedef union { + struct { + fx32 _00, _01, _02; + fx32 _10, _11, _12; + fx32 _20, _21, _22; + }; + fx32 m[3][3]; + fx32 a[9]; +} MtxFx33; + +typedef union { + struct { + fx32 _00, _01; + fx32 _10, _11; + }; + fx32 m[2][2]; + fx32 a[4]; +} MtxFx22; + +static inline s32 FX_Whole(fx32 v) { + return v >> FX32_SHIFT; +} + +static inline fx32 FX_Floor(fx32 v) { + return v & (FX32_INT_MASK | FX32_SIGN_MASK); +} + +static inline fx32 FX32_CAST(s64 res) { + return (fx32)res; +} + +fx32 FX_MulFunc(fx32 v1, fx32 v2); +static inline fx32 FX_MulInline(fx32 v1, fx32 v2) { + return ((s64)v1 * v2 + 0x800LL) >> FX32_SHIFT; +} + +fx32 FX_Mul32x64cFunc(fx32 v32, fx64c v64c); +static inline fx32 FX_Mul32x64cInline(fx32 v32, fx64c v64c) { + fx64c tmp = v64c * v32 + 0x80000000LL; // for better precision + return FX32_CAST(tmp >> FX64C_SHIFT); +} + +// ARM uses the inline version, THUMB uses the function version +#ifndef FX_Mul +#ifdef SDK_CODE_ARM +#define FX_Mul(v1, v2) FX_MulInline(v1, v2) +#else +#define FX_Mul(v1, v2) FX_MulFunc(v1, v2) +#endif //SDK_CODE_ARM +#endif //FX_Mul + +#ifndef FX_Mul32x64c +#ifdef SDK_CODE_ARM +#define FX_Mul32x64c(v32, v64c) FX_Mul32x64cInline(v32, v64c) +#else +#define FX_Mul32x64c(v32, v64c) FX_Mul32x64cFunc(v32, v64c) +#endif //SDK_CODE_ARM +#endif //FX_Mul32x64c + +void FX_Init(void); + +#endif //NITRO_FX_FX_H_ diff --git a/lib/include/nitro/fx/fx_mtx22.h b/lib/include/nitro/fx/fx_mtx22.h new file mode 100644 index 00000000..b1b3dfc9 --- /dev/null +++ b/lib/include/nitro/fx/fx_mtx22.h @@ -0,0 +1,9 @@ +#ifndef NITR_FX_FX_MTX22_H_ +#define NITR_FX_FX_MTX22_H_ + +#include + +void MTX_Rot22_(MtxFx22 *mtx, fx16 x, fx16 y); +void MTX_ScaleApply22(MtxFx22 *a, MtxFx22 *b, fx32 x, fx32 y); + +#endif //NITR_FX_FX_MTX22_H_ diff --git a/lib/include/nitro/fx/fx_mtx33.h b/lib/include/nitro/fx/fx_mtx33.h new file mode 100644 index 00000000..f7ae99bd --- /dev/null +++ b/lib/include/nitro/fx/fx_mtx33.h @@ -0,0 +1,26 @@ +#ifndef NITRO_FX_FX_MTX33_H_ +#define NITRO_FX_FX_MTX33_H_ + +static inline void MTX_Copy33(const MtxFx33 *pSrc, MtxFx33 *pDst) { + MI_Copy36B(pSrc, pDst); +} + +void MTX_Identity33_(register MtxFx33 *pDst); +void MTX_RotX33_(register MtxFx33 *pDst, register fx32 sinVal, register fx32 cosVal); +void MTX_RotY33_(register MtxFx33 *pDst, register fx32 sinVal, register fx32 cosVal); +void MTX_Concat33(const MtxFx33 *a, const MtxFx33 *b, MtxFx33 *ab); +void MTX_MultVec33(const VecFx32 *vec, const MtxFx33 *m, VecFx32 *dst); + +static inline void MTX_Identity33(MtxFx33 *pDst) { + MTX_Identity33_(pDst); +} + +static inline void MTX_RotY33(MtxFx33 *pDst, fx32 sinVal, fx32 cosVal) { + MTX_RotY33_(pDst, sinVal, cosVal); +} + +static inline void MTX_RotX33(MtxFx33 *pDst, fx32 sinVal, fx32 cosVal) { + MTX_RotX33_(pDst, sinVal, cosVal); +} + +#endif //NITRO_FX_FX_MTX33_H_ diff --git a/lib/include/nitro/fx/fx_mtx43.h b/lib/include/nitro/fx/fx_mtx43.h new file mode 100644 index 00000000..000b5f53 --- /dev/null +++ b/lib/include/nitro/fx/fx_mtx43.h @@ -0,0 +1,27 @@ +#ifndef NITRO_FX_FX_MTX43_H_ +#define NITRO_FX_FX_MTX43_H_ + +void MTX_Identity43_(register MtxFx43 *pDst); +void MTX_TransApply43(const MtxFx43 *pSrc, MtxFx43 *pDst, fx32 x, fx32 y, fx32 z); +void MTX_Concat43(const MtxFx43 *a, const MtxFx43 *b, MtxFx43 *ab); +void MTX_RotX43_(register MtxFx43 *pDst, register fx32 sinVal, register fx32 cosVal); +void MTX_RotY43_(register MtxFx43 *pDst, register fx32 sinVal, register fx32 cosVal); +void MTX_Scale43_(register MtxFx43 *pDst, register fx32 x, register fx32 y, register fx32 z); + +static inline void MTX_Identity43(MtxFx43 *pDst) { + MTX_Identity43_(pDst); +} + +static inline void MTX_RotX43(MtxFx43 *pDst, fx32 sinVal, fx32 cosVal) { + MTX_RotX43_(pDst, sinVal, cosVal); +} + +static inline void MTX_RotY43(MtxFx43 *pDst, fx32 sinVal, fx32 cosVal) { + MTX_RotY43_(pDst, sinVal, cosVal); +} + +static inline void MTX_Scale43(MtxFx43 *pDst, fx32 x, fx32 y, fx32 z) { + MTX_Scale43_(pDst, x, y, z); +} + +#endif //NITRO_FX_FX_MTX43_H_ diff --git a/lib/include/nitro/fx/fx_trig.h b/lib/include/nitro/fx/fx_trig.h new file mode 100644 index 00000000..d55eb496 --- /dev/null +++ b/lib/include/nitro/fx/fx_trig.h @@ -0,0 +1,27 @@ +#ifndef NITRO_FX_FX_TRIG_H_ +#define NITRO_FX_FX_TRIG_H_ + +#include + +// deg must be in fx32/fx16 format +#define FX_DEG_TO_RAD(deg) ((fx32)((FX64C_TWOPI_360 * (deg) + 0x80000000LL) >> 32)) +#define FX_DEG_TO_IDX(deg) ((u16) ((FX64C_65536_360 * (deg) + 0x80000000000LL) >> 44)) + +// rad must be in fx32/fx16 format +#define FX_RAD_TO_DEG(rad) ((fx32)((FX64C_360_TWOPI * (rad) + 0x80000000LL) >> 32)) +#define FX_RAD_TO_IDX(rad) ((u16)((FX64C_65536_TWOPI * (rad) + 0x80000000000LL) >> 44)) + +#define FX_IDX_TO_RAD(idx) ((fx32)((FX64C_TWOPI_65536 * (idx) + 0x80000LL) >> 20)) +#define FX_IDX_TO_DEG(idx) ((fx32)((FX64C_360_65536 * (idx) + 0x80000LL) >> 20)) + +extern const fx16 FX_SinCosTable_[]; + +static inline fx16 FX_SinIdx(int idx) { + return FX_SinCosTable_[((idx >> 4) << 1)]; +} + +static inline fx16 FX_CosIdx(int idx) { + return FX_SinCosTable_[((idx >> 4) << 1) + 1]; +} + +#endif //NITRO_FX_FX_TRIG_H_ diff --git a/lib/include/nitro/fx/fx_vec.h b/lib/include/nitro/fx/fx_vec.h new file mode 100644 index 00000000..4c697f53 --- /dev/null +++ b/lib/include/nitro/fx/fx_vec.h @@ -0,0 +1,7 @@ +#ifndef NITRO_FX_FX_VEC_H_ +#define NITRO_FX_FX_VEC_H_ + +void VEC_Add(const VecFx32 *a, const VecFx32 *b, VecFx32 *ab); +void VEC_Subtract(const VecFx32 *a, const VecFx32 *b, VecFx32 *ab); + +#endif //NITRO_FX_FX_VEC_H_ diff --git a/lib/include/nitro/gx.h b/lib/include/nitro/gx.h new file mode 100644 index 00000000..c8596224 --- /dev/null +++ b/lib/include/nitro/gx.h @@ -0,0 +1,18 @@ +#ifndef NITRO_GX_H_ +#define NITRO_GX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SDK_ARM9 +#include +#endif //SDK_ARM9 + +#endif //NITRO_GX_H_ diff --git a/lib/include/nitro/gx/g2.h b/lib/include/nitro/gx/g2.h new file mode 100644 index 00000000..842ab3fd --- /dev/null +++ b/lib/include/nitro/gx/g2.h @@ -0,0 +1,121 @@ +#ifndef NITRO_GX_GX_G2_H_ +#define NITRO_GX_GX_G2_H_ + +void G2x_SetBGyAffine_(u32 addr, const MtxFx22 *mtx, fx32 a, fx32 b, fx32 c, fx32 d); +void G2x_SetBlendAlpha_(u32 addr, int plane1, int plane2, int ev1, int ev2); +void G2x_SetBlendBrightness_(u16 *ptr, fx32 a, fx32 brightness); +void G2x_SetBlendBrightnessExt_(u16 *ptr, fx32 a, fx32 b, fx32 c, fx32 d, fx32 brightness); +void G2x_ChangeBlendBrightness_(u16 *ptr, fx32 brightness); + +typedef struct { + u8 planeMask:5; + u8 effect:1; + u8 _reserve:2; +} GXWndPlane; + +typedef enum { + GX_BLEND_PLANEMASK_NONE = 0x0000, + GX_BLEND_PLANEMASK_BG0 = 0x0001, + GX_BLEND_PLANEMASK_BG1 = 0x0002, + GX_BLEND_PLANEMASK_BG2 = 0x0004, + GX_BLEND_PLANEMASK_BG3 = 0x0008, + GX_BLEND_PLANEMASK_OBJ = 0x0010, + GX_BLEND_PLANEMASK_BD = 0x0020 +} GXBlendPlaneMask; + +typedef enum { + GX_WND_PLANEMASK_NONE = 0x0000, + GX_WND_PLANEMASK_BG0 = 0x0001, + GX_WND_PLANEMASK_BG1 = 0x0002, + GX_WND_PLANEMASK_BG2 = 0x0004, + GX_WND_PLANEMASK_BG3 = 0x0008, + GX_WND_PLANEMASK_OBJ = 0x0010 +} GXWndPlaneMask; + +static inline void G2_SetWndOutsidePlane(int wnd, BOOL effect) { + u32 tmp; + + tmp = ((reg_G2_WINOUT & ~REG_G2_WINOUT_WINOUT_MASK) | ((u32)wnd << REG_G2_WINOUT_WINOUT_SHIFT)); + + if (effect) { + tmp |= (0x20 << REG_G2_WINOUT_WINOUT_SHIFT); // EFCT + } + + reg_G2_WINOUT = (u16)tmp; +} + +static inline void G2_SetBG0Offset(int hOffset, int vOffset) { + reg_G2_BG0OFS = (u32)(((hOffset << REG_G2_BG0OFS_HOFFSET_SHIFT) & REG_G2_BG0OFS_HOFFSET_MASK) | + ((vOffset << REG_G2_BG0OFS_VOFFSET_SHIFT) & REG_G2_BG0OFS_VOFFSET_MASK)); +} + +static inline void G2_SetBG1Offset(int hOffset, int vOffset) { + reg_G2_BG1OFS = (u32)(((hOffset << REG_G2_BG1OFS_HOFFSET_SHIFT) & REG_G2_BG1OFS_HOFFSET_MASK) | + ((vOffset << REG_G2_BG1OFS_VOFFSET_SHIFT) & REG_G2_BG1OFS_VOFFSET_MASK)); +} + +static inline void G2_SetBG2Offset(int hOffset, int vOffset) { + reg_G2_BG2OFS = (u32)(((hOffset << REG_G2_BG2OFS_HOFFSET_SHIFT) & REG_G2_BG2OFS_HOFFSET_MASK) | + ((vOffset << REG_G2_BG2OFS_VOFFSET_SHIFT) & REG_G2_BG2OFS_VOFFSET_MASK)); +} + +static inline void G2_SetBG3Offset(int hOffset, int vOffset) { + reg_G2_BG3OFS = (u32)(((hOffset << REG_G2_BG3OFS_HOFFSET_SHIFT) & REG_G2_BG3OFS_HOFFSET_MASK) | + ((vOffset << REG_G2_BG3OFS_VOFFSET_SHIFT) & REG_G2_BG3OFS_VOFFSET_MASK)); +} + +static inline void G2S_SetBG0Offset(int hOffset, int vOffset) { + reg_G2S_DB_BG0OFS = (u32)(((hOffset << REG_G2S_DB_BG0OFS_HOFFSET_SHIFT) & REG_G2S_DB_BG0OFS_HOFFSET_MASK) | + ((vOffset << REG_G2S_DB_BG0OFS_VOFFSET_SHIFT) & REG_G2S_DB_BG0OFS_VOFFSET_MASK)); +} + +static inline void G2S_SetBG1Offset(int hOffset, int vOffset) { + reg_G2S_DB_BG1OFS = (u32)(((hOffset << REG_G2S_DB_BG1OFS_HOFFSET_SHIFT) & REG_G2S_DB_BG1OFS_HOFFSET_MASK) | + ((vOffset << REG_G2S_DB_BG1OFS_VOFFSET_SHIFT) & REG_G2S_DB_BG1OFS_VOFFSET_MASK)); +} + +static inline void G2S_SetBG2Offset(int hOffset, int vOffset) { + reg_G2S_DB_BG2OFS = (u32)(((hOffset << REG_G2S_DB_BG2OFS_HOFFSET_SHIFT) & REG_G2S_DB_BG2OFS_HOFFSET_MASK) | + ((vOffset << REG_G2S_DB_BG2OFS_VOFFSET_SHIFT) & REG_G2S_DB_BG2OFS_VOFFSET_MASK)); +} + +static inline void G2S_SetBG3Offset(int hOffset, int vOffset) { + reg_G2S_DB_BG3OFS = (u32)(((hOffset << REG_G2S_DB_BG3OFS_HOFFSET_SHIFT) & REG_G2S_DB_BG3OFS_HOFFSET_MASK) | + ((vOffset << REG_G2S_DB_BG3OFS_VOFFSET_SHIFT) & REG_G2S_DB_BG3OFS_VOFFSET_MASK)); +} + +static inline void G2_SetBG2Affine(const MtxFx22 *mtx, int centerX, int centerY, int x1, int y1) { + G2x_SetBGyAffine_((u32)®_G2_BG2PA, mtx, centerX, centerY, x1, y1); +} + +static inline void G2_SetBG3Affine(const MtxFx22 *mtx, int centerX, int centerY, int x1, int y1) { + G2x_SetBGyAffine_((u32)®_G2_BG3PA, mtx, centerX, centerY, x1, y1); +} + +static inline void G2S_SetBG2Affine(const MtxFx22 *mtx, int centerX, int centerY, int x1, int y1) { + G2x_SetBGyAffine_((u32)®_G2S_DB_BG2PA, mtx, centerX, centerY, x1, y1); +} + +static inline void G2S_SetBG3Affine(const MtxFx22 *mtx, int centerX, int centerY, int x1, int y1) { + G2x_SetBGyAffine_((u32)®_G2S_DB_BG3PA, mtx, centerX, centerY, x1, y1); +} + +static inline void G2_BlendNone(void) { + reg_G2_BLDCNT = 0; +} + +static inline void G2S_BlendNone(void) { + reg_G2S_DB_BLDCNT = 0; +} + +static inline void G2_SetBlendAlpha(int plane1, int plane2, int ev1, int ev2) { + G2x_SetBlendAlpha_((u32)®_G2_BLDCNT, plane1, plane2, ev1, ev2); +} + +static inline void G2S_SetBlendAlpha(int plane1, int plane2, int ev1, int ev2) { + G2x_SetBlendAlpha_((u32)®_G2S_DB_BLDCNT, plane1, plane2, ev1, ev2); +} + +//The g2 and g2_oam headers contain a lot of inline functions and enums that may want to be ported over at some point + +#endif //NITRO_GX_GX_G2_H_ diff --git a/lib/include/nitro/gx/g2_oam.h b/lib/include/nitro/gx/g2_oam.h new file mode 100644 index 00000000..d1b2a9f8 --- /dev/null +++ b/lib/include/nitro/gx/g2_oam.h @@ -0,0 +1,52 @@ +#ifndef NITRO_GX_G2_OAM_H_ +#define NITRO_GX_G2_OAM_H_ + +typedef struct { + union { + u32 attr01; + struct { + u16 attr0; + u16 attr1; + }; + struct { + u32 y:8; + u32 rsMode:2; + u32 objMode:2; + u32 mosaic:1; + u32 colorMode:1; + u32 shape:2; + + u32 x:9; + u32 rsParam:5; + u32 size:2; + }; + struct { + u32 _0:28; + u32 flipH:1; + u32 flipV:1; + u32 _1:2; + }; + }; + union { + struct { + u16 attr2; + u16 _3; + }; + u32 attr23; + struct { + u32 charNo:10; + u32 priority:2; + u32 cParam:4; + u32 _2:16; + }; + }; +} GXOamAttr; + +typedef enum { + GX_OAM_MODE_NORMAL = 0, + GX_OAM_MODE_XLU = 1, + GX_OAM_MODE_OBJWND = 2, + GX_OAM_MODE_BITMAPOBJ = 3 +} GXOamMode; + +#endif //NITRO_GX_G2_OAM_H_ diff --git a/lib/include/nitro/gx/g3.h b/lib/include/nitro/gx/g3.h new file mode 100644 index 00000000..6c8916e7 --- /dev/null +++ b/lib/include/nitro/gx/g3.h @@ -0,0 +1,152 @@ +#ifndef NITRO_GX_G3_H_ +#define NITRO_GX_G3_H_ + +#define G3OP_NOP 0x00 + +#define G3OP_MTX_MODE 0x10 +#define G3OP_MTX_PUSH 0x11 +#define G3OP_MTX_POP 0x12 +#define G3OP_MTX_STORE 0x13 +#define G3OP_MTX_RESTORE 0x14 +#define G3OP_MTX_IDENTITY 0x15 +#define G3OP_MTX_LOAD_4x4 0x16 +#define G3OP_MTX_LOAD_4x3 0x17 +#define G3OP_MTX_MULT_4x4 0x18 +#define G3OP_MTX_MULT_4x3 0x19 +#define G3OP_MTX_MULT_3x3 0x1a +#define G3OP_MTX_SCALE 0x1b +#define G3OP_MTX_TRANS 0x1c + +#define G3OP_COLOR 0x20 +#define G3OP_NORMAL 0x21 +#define G3OP_TEXCOORD 0x22 +#define G3OP_VTX_16 0x23 +#define G3OP_VTX_10 0x24 +#define G3OP_VTX_XY 0x25 +#define G3OP_VTX_XZ 0x26 +#define G3OP_VTX_YZ 0x27 +#define G3OP_VTX_DIFF 0x28 +#define G3OP_POLYGON_ATTR 0x29 +#define G3OP_TEXIMAGE_PARAM 0x2a +#define G3OP_TEXPLTT_BASE 0x2b + +#define G3OP_DIF_AMB 0x30 +#define G3OP_SPE_EMI 0x31 +#define G3OP_LIGHT_VECTOR 0x32 +#define G3OP_LIGHT_COLOR 0x33 +#define G3OP_SHININESS 0x34 + +#define G3OP_BEGIN 0x40 +#define G3OP_END 0x41 + +#define G3OP_SWAP_BUFFERS 0x50 + +#define G3OP_VIEWPORT 0x60 + +#define G3OP_BOX_TEST 0x70 +#define G3OP_POS_TEST 0x71 +#define G3OP_VEC_TEST 0x72 + +#define G3OP_DUMMY_COMMAND 0xFF + +#define G3OP_NOP_NPARAMS 0 + +#define G3OP_MTX_MODE_NPARAMS 1 +#define G3OP_MTX_PUSH_NPARAMS 0 +#define G3OP_MTX_POP_NPARAMS 1 +#define G3OP_MTX_STORE_NPARAMS 1 +#define G3OP_MTX_RESTORE_NPARAMS 1 +#define G3OP_MTX_IDENTITY_NPARAMS 0 +#define G3OP_MTX_LOAD_4x4_NPARAMS 16 +#define G3OP_MTX_LOAD_4x3_NPARAMS 12 +#define G3OP_MTX_MULT_4x4_NPARAMS 16 +#define G3OP_MTX_MULT_4x3_NPARAMS 12 +#define G3OP_MTX_MULT_3x3_NPARAMS 9 +#define G3OP_MTX_SCALE_NPARAMS 3 +#define G3OP_MTX_TRANS_NPARAMS 3 + +#define G3OP_COLOR_NPARAMS 1 +#define G3OP_NORMAL_NPARAMS 1 +#define G3OP_TEXCOORD_NPARAMS 1 +#define G3OP_VTX_16_NPARAMS 2 +#define G3OP_VTX_10_NPARAMS 1 +#define G3OP_VTX_XY_NPARAMS 1 +#define G3OP_VTX_XZ_NPARAMS 1 +#define G3OP_VTX_YZ_NPARAMS 1 +#define G3OP_VTX_DIFF_NPARAMS 1 +#define G3OP_POLYGON_ATTR_NPARAMS 1 +#define G3OP_TEXIMAGE_PARAM_NPARAMS 1 +#define G3OP_TEXPLTT_BASE_NPARAMS 1 + +#define G3OP_DIF_AMB_NPARAMS 1 +#define G3OP_SPE_EMI_NPARAMS 1 +#define G3OP_LIGHT_VECTOR_NPARAMS 1 +#define G3OP_LIGHT_COLOR_NPARAMS 1 +#define G3OP_SHININESS_NPARAMS 32 + +#define G3OP_BEGIN_NPARAMS 1 +#define G3OP_END_NPARAMS 0 + +#define G3OP_SWAP_BUFFERS_NPARAMS 1 + +#define G3OP_VIEWPORT_NPARAMS 1 + +#define G3OP_BOX_TEST_NPARAMS 3 +#define G3OP_POS_TEST_NPARAMS 2 +#define G3OP_VEC_TEST_NPARAMS 1 + +typedef enum { + GX_TEXSIZE_S8 = 0, + GX_TEXSIZE_S16 = 1, + GX_TEXSIZE_S32 = 2, + GX_TEXSIZE_S64 = 3, + GX_TEXSIZE_S128 = 4, + GX_TEXSIZE_S256 = 5, + GX_TEXSIZE_S512 = 6, + GX_TEXSIZE_S1024 = 7 +} GXTexSizeS; + +typedef enum { + GX_TEXSIZE_T8 = 0, + GX_TEXSIZE_T16 = 1, + GX_TEXSIZE_T32 = 2, + GX_TEXSIZE_T64 = 3, + GX_TEXSIZE_T128 = 4, + GX_TEXSIZE_T256 = 5, + GX_TEXSIZE_T512 = 6, + GX_TEXSIZE_T1024 = 7 +} GXTexSizeT; + +typedef enum { + GX_TEXFMT_NONE = 0, + GX_TEXFMT_A3I5 = 1, + GX_TEXFMT_PLTT4 = 2, + GX_TEXFMT_PLTT16 = 3, + GX_TEXFMT_PLTT256 = 4, + GX_TEXFMT_COMP4x4 = 5, + GX_TEXFMT_A5I3 = 6, + GX_TEXFMT_DIRECT = 7 +} GXTexFmt; + +typedef enum { + GX_TEXPLTTCOLOR0_USE = 0, + GX_TEXPLTTCOLOR0_TRNS = 1 +} GXTexPlttColor0; + +typedef enum { + GX_LIGHTID_0 = 0, + GX_LIGHTID_1 = 1, + GX_LIGHTID_2 = 2, + GX_LIGHTID_3 = 3 +} GXLightId; + +typedef enum { + GX_MTXMODE_PROJECTION = 0, + GX_MTXMODE_POSITION = 1, + GX_MTXMODE_POSITION_VECTOR = 2, + GX_MTXMODE_TEXTURE = 3 +} GXMtxMode; + +#define GX_PACK_VIEWPORT_PARAM(x1, y1, x2, y2) ((u32)((x1) | ((y1) << 8) | ((x2) << 16) | ((y2) << 24))) + +#endif //NITRO_GX_G3_H_ diff --git a/lib/include/nitro/gx/g3imm.h b/lib/include/nitro/gx/g3imm.h new file mode 100644 index 00000000..92858ae4 --- /dev/null +++ b/lib/include/nitro/gx/g3imm.h @@ -0,0 +1,26 @@ +#ifndef NITRO_GX_G3IMM_H_ +#define NITRO_GX_G3IMM_H_ + +typedef enum { + GX_SORTMODE_AUTO = 0, + GX_SORTMODE_MANUAL = 1 +} GXSortMode; + +typedef enum { + GX_BUFFERMODE_Z = 0, + GX_BUFFERMODE_W = 1 +} GXBufferMode; + +#define GX_PACK_SWAPBUFFERS_PARAM(am, zw) \ + ((u32) (((am) << REG_G3_SWAP_BUFFERS_XS_SHIFT) | \ + ((zw) << REG_G3_SWAP_BUFFERS_DP_SHIFT))) + +static inline void G3_SwapBuffers(GXSortMode am, GXBufferMode zw) { + reg_G3_SWAP_BUFFERS = GX_PACK_SWAPBUFFERS_PARAM(am, zw); +} + +static inline void G3_ViewPort(int x1, int y1, int x2, int y2) { + reg_G3_VIEWPORT = GX_PACK_VIEWPORT_PARAM(x1, y1, x2, y2); +} + +#endif //NITRO_GX_G3IMM_H_ diff --git a/lib/include/nitro/gx/g3x.h b/lib/include/nitro/gx/g3x.h new file mode 100644 index 00000000..9095b194 --- /dev/null +++ b/lib/include/nitro/gx/g3x.h @@ -0,0 +1,87 @@ +#ifndef NITRO_GX_G3X_H_ +#define NITRO_GX_G3X_H_ + +typedef enum { + GX_SHADING_TOON = 0, + GX_SHADING_HIGHLIGHT = 1 +} GXShading; + +typedef enum { + GX_FOGBLEND_COLOR_ALPHA = 0, + GX_FOGBLEND_ALPHA = 1 +} GXFogBlend; + +typedef enum { + GX_FOGSLOPE_0x8000 = 0, + GX_FOGSLOPE_0x4000 = 1, + GX_FOGSLOPE_0x2000 = 2, + GX_FOGSLOPE_0x1000 = 3, + GX_FOGSLOPE_0x0800 = 4, + GX_FOGSLOPE_0x0400 = 5, + GX_FOGSLOPE_0x0200 = 6, + GX_FOGSLOPE_0x0100 = 7, + GX_FOGSLOPE_0x0080 = 8, + GX_FOGSLOPE_0x0040 = 9, + GX_FOGSLOPE_0x0020 = 10 +} GXFogSlope; + +void G3X_Init(void); +void G3X_InitMtxStack(void); +void G3X_ResetMtxStack(void); +void G3X_InitTable(void); +void G3X_Reset(void); +void G3X_SetFog(BOOL enable, GXFogBlend fogMode, GXFogSlope fogSlope, int fogOffset); +void G3X_SetClearColor(GXRgb rgb, int alpha, int depth, int polygonID, BOOL fog); + +static inline void G3X_SetShading(GXShading shading) { + reg_G3X_DISP3DCNT = (u16)((reg_G3X_DISP3DCNT & ~(REG_G3X_DISP3DCNT_THS_MASK | REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK)) | (shading << REG_G3X_DISP3DCNT_THS_SHIFT)); +} + +static inline void G3X_AlphaTest(BOOL enable, int ref) { + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_ATE_MASK); + reg_G3X_ALPHA_TEST_REF = (u16)ref; + } else { + reg_G3X_DISP3DCNT &= (u16)~(REG_G3X_DISP3DCNT_ATE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_AlphaBlend(BOOL enable) { + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_ABE_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16)~(REG_G3X_DISP3DCNT_ABE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_AntiAlias(BOOL enable) { + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_AAE_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16)~(REG_G3X_DISP3DCNT_AAE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_EdgeMarking(BOOL enable) { + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_EME_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16)~(REG_G3X_DISP3DCNT_EME_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +void G3X_SetEdgeColorTable(const GXRgb *rgb_8); + +#endif //NITRO_GX_G3X_H_ diff --git a/lib/include/nitro/gx/gx.h b/lib/include/nitro/gx/gx.h new file mode 100644 index 00000000..07499da7 --- /dev/null +++ b/lib/include/nitro/gx/gx.h @@ -0,0 +1,157 @@ +#ifndef NITRO_GX_GX_H_ +#define NITRO_GX_GX_H_ + +#include + +typedef enum { + GX_DISPMODE_GRAPHICS = 0x01, + GX_DISPMODE_VRAM_A = 0x02, + GX_DISPMODE_VRAM_B = 0x06, + GX_DISPMODE_VRAM_C = 0x0a, + GX_DISPMODE_VRAM_D = 0x0e, + GX_DISPMODE_MMEM = 0x03 +} GXDispMode; + +typedef enum { + GX_BGMODE_0 = 0, + GX_BGMODE_1 = 1, + GX_BGMODE_2 = 2, + GX_BGMODE_3 = 3, + GX_BGMODE_4 = 4, + GX_BGMODE_5 = 5, + GX_BGMODE_6 = 6 +} GXBGMode; + +typedef enum { + GX_BG0_AS_2D = 0, + GX_BG0_AS_3D = 1 +} GXBG0As; + +typedef enum { + GX_BGSCROFFSET_0x00000 = 0x00, + GX_BGSCROFFSET_0x10000 = 0x01, + GX_BGSCROFFSET_0x20000 = 0x02, + GX_BGSCROFFSET_0x30000 = 0x03, + GX_BGSCROFFSET_0x40000 = 0x04, + GX_BGSCROFFSET_0x50000 = 0x05, + GX_BGSCROFFSET_0x60000 = 0x06, + GX_BGSCROFFSET_0x70000 = 0x07 +} GXBGScrOffset; + +typedef enum { + GX_BGCHAROFFSET_0x00000 = 0x00, + GX_BGCHAROFFSET_0x10000 = 0x01, + GX_BGCHAROFFSET_0x20000 = 0x02, + GX_BGCHAROFFSET_0x30000 = 0x03, + GX_BGCHAROFFSET_0x40000 = 0x04, + GX_BGCHAROFFSET_0x50000 = 0x05, + GX_BGCHAROFFSET_0x60000 = 0x06, + GX_BGCHAROFFSET_0x70000 = 0x07 +} GXBGCharOffset; + +typedef enum { + GX_OBJVRAMMODE_CHAR_2D = (0 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_32K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_64K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (1 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_128K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (2 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_256K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (3 << REG_GX_DISPCNT_EXOBJ_SHIFT) +} GXOBJVRamModeChar; + +typedef enum { + GX_POWER_OFF = 0, + + GX_POWER_2D_MAIN = 1 << REG_GX_POWCNT_E2DG_SHIFT, + GX_POWER_2D_SUB = 1 << REG_GX_POWCNT_E2DGB_SHIFT, + + GX_POWER_RE = 1 << REG_GX_POWCNT_RE_SHIFT, + GX_POWER_GE = 1 << REG_GX_POWCNT_GE_SHIFT, + + GX_POWER_2D = GX_POWER_2D_MAIN | GX_POWER_2D_SUB, + GX_POWER_3D = GX_POWER_RE | GX_POWER_GE, + + GX_POWER_ALL = GX_POWER_2D | GX_POWER_3D +} GXPower; + +typedef enum { + GX_DISP_SELECT_SUB_MAIN = 0, + GX_DISP_SELECT_MAIN_SUB = 1 +} GXDispSelect; + +void GX_SetGraphicsMode(GXDispMode dispMode, GXBGMode bgMode, GXBG0As bg0_2d3d); +void GXS_SetGraphicsMode(GXBGMode bgMode); + +static inline s32 GX_GetVCount() { + return reg_GX_VCOUNT; +} + +static inline s32 GX_GetVCountEqVal(void) { + u16 val = reg_GX_DISPSTAT; + return ((val >> 8) & 0x00ff) | ((val << 1) & 0x0100); +} + +static inline void GX_VCountEqIntr(BOOL enable) { + if (enable) { + reg_GX_DISPSTAT |= REG_GX_DISPSTAT_VQI_MASK; + } else { + reg_GX_DISPSTAT &= ~REG_GX_DISPSTAT_VQI_MASK; + } +} + +static inline void GX_SetVCountEqVal(s32 val) { + reg_GX_DISPSTAT = (u16)(reg_GX_DISPSTAT & (REG_GX_DISPSTAT_VBLK_MASK | REG_GX_DISPSTAT_HBLK_MASK | REG_GX_DISPSTAT_LYC_MASK | REG_GX_DISPSTAT_VBI_MASK | REG_GX_DISPSTAT_HBI_MASK | REG_GX_DISPSTAT_VQI_MASK) | ((val & 0xFF) << 8) | ((val & 0x100) >> 1)); +} + +static inline void GX_SetBGScrOffset(GXBGScrOffset offset) +{ + reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_BGSCREENOFFSET_MASK) | + (offset << REG_GX_DISPCNT_BGSCREENOFFSET_SHIFT)); +} + +static inline void GX_SetBGCharOffset(GXBGCharOffset offset) { + reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_BGCHAROFFSET_MASK) | + (offset << REG_GX_DISPCNT_BGCHAROFFSET_SHIFT)); +} + +s32 GX_VBlankIntr(BOOL enable); +s32 GX_HBlankIntr(BOOL enable); +void GX_Init(void); +void GX_DispOff(void); +void GX_DispOn(void); + +static inline void GX_SetPower(GXPower gxbit_power) { + reg_GX_POWCNT = (reg_GX_POWCNT & ~GX_POWER_ALL) | gxbit_power; +} + +static inline void GXS_DispOff(void) { + reg_GXS_DB_DISPCNT &= ~REG_GXS_DB_DISPCNT_MODE_MASK; +} + +static inline void GXS_DispOn(void) { + reg_GXS_DB_DISPCNT |= REG_GXS_DB_DISPCNT_MODE_MASK; +} + +static inline void GX_SetDispSelect(GXDispSelect sel) { + reg_GX_POWCNT = (reg_GX_POWCNT & ~REG_GX_POWCNT_DSEL_MASK) | (sel << REG_GX_POWCNT_DSEL_SHIFT); +} + +static inline void GX_SetVisiblePlane(int plane) { + reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_DISPLAY_MASK) | (plane << REG_GX_DISPCNT_DISPLAY_SHIFT)); +} + +static inline void GXS_SetVisiblePlane(int plane) { + reg_GXS_DB_DISPCNT = (u32)((reg_GXS_DB_DISPCNT & ~REG_GXS_DB_DISPCNT_DISPLAY_MASK) | (plane << REG_GXS_DB_DISPCNT_DISPLAY_SHIFT)); +} + +static inline void GX_SetVisibleWnd(int window) { + reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~(REG_GX_DISPCNT_W0_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_OW_MASK)) | (window << REG_GX_DISPCNT_W0_SHIFT)); +} + +static inline void GXS_SetVisibleWnd(int window) { + reg_GXS_DB_DISPCNT = (u32)((reg_GXS_DB_DISPCNT & ~(REG_GXS_DB_DISPCNT_W0_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_OW_MASK)) | (window << REG_GXS_DB_DISPCNT_W0_SHIFT)); +} + +#endif //NITRO_GX_GX_H_ diff --git a/lib/include/nitro/gx/gx_bgcnt.h b/lib/include/nitro/gx/gx_bgcnt.h new file mode 100644 index 00000000..cefd4ae3 --- /dev/null +++ b/lib/include/nitro/gx/gx_bgcnt.h @@ -0,0 +1,614 @@ +#ifndef NITRO_GX_GX_BGCNT_H +#define NITRO_GX_GX_BGCNT_H + +void *G2_GetBG0ScrPtr(); +void *G2S_GetBG0ScrPtr(); +void *G2_GetBG1ScrPtr(); +void *G2S_GetBG1ScrPtr(); +void *G2_GetBG2ScrPtr(); +void *G2S_GetBG2ScrPtr(); +void *G2_GetBG3ScrPtr(); +void *G2S_GetBG3ScrPtr(); +void *G2_GetBG0CharPtr(); +void *G2S_GetBG0CharPtr(); +void *G2_GetBG1CharPtr(); +void *G2S_GetBG1CharPtr(); +void *G2_GetBG2CharPtr(); +void *G2S_GetBG2CharPtr(); +void *G2_GetBG3CharPtr(); +void *G2S_GetBG3CharPtr(); + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 charBase:4; + u16 mosaic:1; + u16 colorMode:1; + u16 screenBase:5; + u16 bgExtPltt:1; + u16 screenSize:2; + }; +} GXBg01Control; + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 charBase:4; + u16 mosaic:1; + u16 colorMode:1; + u16 screenBase:5; + u16 _reserve:1; + u16 screenSize:2; + }; +} GXBg23ControlText; + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 charBase:4; + u16 mosaic:1; + u16 _reserve:1; + u16 screenBase:5; + u16 areaOver:1; + u16 screenSize:2; + }; +} GXBg23ControlAffine; + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 _reserve1:1; + u16 charBase:3; + u16 mosaic:1; + u16 _reserve2:1; + u16 screenBase:5; + u16 areaOver:1; + u16 screenSize:2; + }; +} GXBg23Control256x16Pltt; + + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 _reserve1:4; + u16 mosaic:1; + u16 _reserve2:1; + u16 screenBase:5; + u16 areaOver:1; + u16 screenSize:2; + }; +} + GXBg23Control256Bmp, GXBg23ControlDCBmp; + +typedef union { + u16 raw; + struct { + u16 priority:2; + u16 _reserve1:4; + u16 mosaic:1; + u16 _reserve2:6; + u16 areaOver:1; + u16 screenSize:2; + }; +} GXBg2ControlLargeBmp; + + + +typedef enum { + GX_BG_SCRSIZE_TEXT_256x256 = 0, + GX_BG_SCRSIZE_TEXT_512x256 = 1, + GX_BG_SCRSIZE_TEXT_256x512 = 2, + GX_BG_SCRSIZE_TEXT_512x512 = 3 +} GXBGScrSizeText; + +typedef enum { + GX_BG_SCRSIZE_AFFINE_128x128 = 0, + GX_BG_SCRSIZE_AFFINE_256x256 = 1, + GX_BG_SCRSIZE_AFFINE_512x512 = 2, + GX_BG_SCRSIZE_AFFINE_1024x1024 = 3 +} GXBGScrSizeAffine; + +typedef enum { + GX_BG_SCRSIZE_256x16PLTT_128x128 = 0, + GX_BG_SCRSIZE_256x16PLTT_256x256 = 1, + GX_BG_SCRSIZE_256x16PLTT_512x512 = 2, + GX_BG_SCRSIZE_256x16PLTT_1024x1024 = 3 +} GXBGScrSize256x16Pltt; + +typedef enum { + GX_BG_SCRSIZE_256BMP_128x128 = 0, + GX_BG_SCRSIZE_256BMP_256x256 = 1, + GX_BG_SCRSIZE_256BMP_512x256 = 2, + GX_BG_SCRSIZE_256BMP_512x512 = 3 +} GXBGScrSize256Bmp; + +typedef enum { + GX_BG_SCRSIZE_DCBMP_128x128 = 0, + GX_BG_SCRSIZE_DCBMP_256x256 = 1, + GX_BG_SCRSIZE_DCBMP_512x256 = 2, + GX_BG_SCRSIZE_DCBMP_512x512 = 3 +} GXBGScrSizeDcBmp; + +typedef enum { + GX_BG_SCRSIZE_LARGEBMP_512x1024 = 0, + GX_BG_SCRSIZE_LARGEBMP_1024x512 = 1 +} GXBGScrSizeLargeBmp; + +typedef enum { + GX_BG_COLORMODE_16 = 0, + GX_BG_COLORMODE_256 = 1 +} GXBGColorMode; + +typedef enum { + GX_BG_AREAOVER_XLU = 0, + GX_BG_AREAOVER_REPEAT = 1 +} GXBGAreaOver; + +typedef enum { + GX_BG_CHARBASE_0x00000 = 0, + GX_BG_CHARBASE_0x04000 = 1, + GX_BG_CHARBASE_0x08000 = 2, + GX_BG_CHARBASE_0x0c000 = 3, + GX_BG_CHARBASE_0x10000 = 4, + GX_BG_CHARBASE_0x14000 = 5, + GX_BG_CHARBASE_0x18000 = 6, + GX_BG_CHARBASE_0x1c000 = 7, + GX_BG_CHARBASE_0x20000 = 8, + GX_BG_CHARBASE_0x24000 = 9, + GX_BG_CHARBASE_0x28000 = 10, + GX_BG_CHARBASE_0x2c000 = 11, + GX_BG_CHARBASE_0x30000 = 12, + GX_BG_CHARBASE_0x34000 = 13, + GX_BG_CHARBASE_0x38000 = 14, + GX_BG_CHARBASE_0x3c000 = 15 +} GXBGCharBase; + +typedef enum { + GX_BG_SCRBASE_0x0000 = 0, + GX_BG_SCRBASE_0x0800 = 1, + GX_BG_SCRBASE_0x1000 = 2, + GX_BG_SCRBASE_0x1800 = 3, + GX_BG_SCRBASE_0x2000 = 4, + GX_BG_SCRBASE_0x2800 = 5, + GX_BG_SCRBASE_0x3000 = 6, + GX_BG_SCRBASE_0x3800 = 7, + GX_BG_SCRBASE_0x4000 = 8, + GX_BG_SCRBASE_0x4800 = 9, + GX_BG_SCRBASE_0x5000 = 10, + GX_BG_SCRBASE_0x5800 = 11, + GX_BG_SCRBASE_0x6000 = 12, + GX_BG_SCRBASE_0x6800 = 13, + GX_BG_SCRBASE_0x7000 = 14, + GX_BG_SCRBASE_0x7800 = 15, + GX_BG_SCRBASE_0x8000 = 16, + GX_BG_SCRBASE_0x8800 = 17, + GX_BG_SCRBASE_0x9000 = 18, + GX_BG_SCRBASE_0x9800 = 19, + GX_BG_SCRBASE_0xa000 = 20, + GX_BG_SCRBASE_0xa800 = 21, + GX_BG_SCRBASE_0xb000 = 22, + GX_BG_SCRBASE_0xb800 = 23, + GX_BG_SCRBASE_0xc000 = 24, + GX_BG_SCRBASE_0xc800 = 25, + GX_BG_SCRBASE_0xd000 = 26, + GX_BG_SCRBASE_0xd800 = 27, + GX_BG_SCRBASE_0xe000 = 28, + GX_BG_SCRBASE_0xe800 = 29, + GX_BG_SCRBASE_0xf000 = 30, + GX_BG_SCRBASE_0xf800 = 31 +} GXBGScrBase; + +typedef enum { + GX_BG_BMPSCRBASE_0x00000 = 0, + GX_BG_BMPSCRBASE_0x04000 = 1, + GX_BG_BMPSCRBASE_0x08000 = 2, + GX_BG_BMPSCRBASE_0x0c000 = 3, + GX_BG_BMPSCRBASE_0x10000 = 4, + GX_BG_BMPSCRBASE_0x14000 = 5, + GX_BG_BMPSCRBASE_0x18000 = 6, + GX_BG_BMPSCRBASE_0x1c000 = 7, + GX_BG_BMPSCRBASE_0x20000 = 8, + GX_BG_BMPSCRBASE_0x24000 = 9, + GX_BG_BMPSCRBASE_0x28000 = 10, + GX_BG_BMPSCRBASE_0x2c000 = 11, + GX_BG_BMPSCRBASE_0x30000 = 12, + GX_BG_BMPSCRBASE_0x34000 = 13, + GX_BG_BMPSCRBASE_0x38000 = 14, + GX_BG_BMPSCRBASE_0x3c000 = 15, + GX_BG_BMPSCRBASE_0x40000 = 16, + GX_BG_BMPSCRBASE_0x44000 = 17, + GX_BG_BMPSCRBASE_0x48000 = 18, + GX_BG_BMPSCRBASE_0x4c000 = 19, + GX_BG_BMPSCRBASE_0x50000 = 20, + GX_BG_BMPSCRBASE_0x54000 = 21, + GX_BG_BMPSCRBASE_0x58000 = 22, + GX_BG_BMPSCRBASE_0x5c000 = 23, + GX_BG_BMPSCRBASE_0x60000 = 24, + GX_BG_BMPSCRBASE_0x64000 = 25, + GX_BG_BMPSCRBASE_0x68000 = 26, + GX_BG_BMPSCRBASE_0x6c000 = 27, + GX_BG_BMPSCRBASE_0x70000 = 28, + GX_BG_BMPSCRBASE_0x74000 = 29, + GX_BG_BMPSCRBASE_0x78000 = 30, + GX_BG_BMPSCRBASE_0x7c000 = 31 +} GXBGBmpScrBase; + +typedef enum { + GX_BG_EXTPLTT_01 = 0, + GX_BG_EXTPLTT_23 = 1 +} GXBGExtPltt; + +typedef enum { + GX_BG_EXTMODE_256x16PLTT = (0 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (0 << REG_G2_BG2CNT_COLORMODE_SHIFT), + GX_BG_EXTMODE_256BITMAP = (0 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (1 << REG_G2_BG2CNT_COLORMODE_SHIFT), + GX_BG_EXTMODE_DCBITMAP = (1 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (1 << REG_G2_BG2CNT_COLORMODE_SHIFT) +} GXBGExtMode; + +//GX_capture +typedef enum { + GX_CAPTURE_DEST_VRAM_A_0x00000 = 0, + GX_CAPTURE_DEST_VRAM_B_0x00000 = 1, + GX_CAPTURE_DEST_VRAM_C_0x00000 = 2, + GX_CAPTURE_DEST_VRAM_D_0x00000 = 3, + + GX_CAPTURE_DEST_VRAM_A_0x08000 = 4, + GX_CAPTURE_DEST_VRAM_B_0x08000 = 5, + GX_CAPTURE_DEST_VRAM_C_0x08000 = 6, + GX_CAPTURE_DEST_VRAM_D_0x08000 = 7, + + GX_CAPTURE_DEST_VRAM_A_0x10000 = 8, + GX_CAPTURE_DEST_VRAM_B_0x10000 = 9, + GX_CAPTURE_DEST_VRAM_C_0x10000 = 10, + GX_CAPTURE_DEST_VRAM_D_0x10000 = 11, + + GX_CAPTURE_DEST_VRAM_A_0x18000 = 12, + GX_CAPTURE_DEST_VRAM_B_0x18000 = 13, + GX_CAPTURE_DEST_VRAM_C_0x18000 = 14, + GX_CAPTURE_DEST_VRAM_D_0x18000 = 15 +} GXCaptureDest; + +typedef enum { + GX_CAPTURE_SIZE_128x128 = 0, + GX_CAPTURE_SIZE_256x64 = 1, + GX_CAPTURE_SIZE_256x128 = 2, + GX_CAPTURE_SIZE_256x192 = 3 +} GXCaptureSize; + +typedef enum { + GX_CAPTURE_SRCA_2D3D = 0, + GX_CAPTURE_SRCA_3D = 1 +} GXCaptureSrcA; + +typedef enum { + GX_CAPTURE_SRCB_VRAM_0x00000 = 0, + GX_CAPTURE_SRCB_MRAM = 1, + GX_CAPTURE_SRCB_VRAM_0x08000 = 2, + GX_CAPTURE_SRCB_VRAM_0x10000 = 4, + GX_CAPTURE_SRCB_VRAM_0x18000 = 6 +} GXCaptureSrcB; + +typedef enum { + GX_CAPTURE_MODE_A = 0, + GX_CAPTURE_MODE_B = 1, + GX_CAPTURE_MODE_AB = 2 +} GXCaptureMode; + +static inline void G2_SetBG0Control(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt) { + reg_G2_BG0CNT = (u16)((reg_G2_BG0CNT & (REG_G2_BG0CNT_PRIORITY_MASK | REG_G2_BG0CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG0CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2_BG0CNT_COLORMODE_SHIFT) | (screenBase << REG_G2_BG0CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG0CNT_CHARBASE_SHIFT) | (bgExtPltt << REG_G2_BG0CNT_BGPLTTSLOT_SHIFT)); +} + +static inline void G2S_SetBG0Control(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt) { + reg_G2S_DB_BG0CNT = (u16)((reg_G2S_DB_BG0CNT & (REG_G2S_DB_BG0CNT_PRIORITY_MASK | REG_G2S_DB_BG0CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG0CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2S_DB_BG0CNT_COLORMODE_SHIFT) | (screenBase << REG_G2S_DB_BG0CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG0CNT_CHARBASE_SHIFT) | (bgExtPltt << REG_G2S_DB_BG0CNT_BGPLTTSLOT_SHIFT)); +} + +static inline void G2_SetBG1Control(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt) { + reg_G2_BG1CNT = (u16)((reg_G2_BG1CNT & (REG_G2_BG1CNT_PRIORITY_MASK | REG_G2_BG1CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG1CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2_BG1CNT_COLORMODE_SHIFT) | (screenBase << REG_G2_BG1CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG1CNT_CHARBASE_SHIFT) | (bgExtPltt << REG_G2_BG1CNT_BGPLTTSLOT_SHIFT)); +} + +static inline void G2S_SetBG1Control(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt) { + reg_G2S_DB_BG1CNT = (u16)((reg_G2S_DB_BG1CNT & (REG_G2S_DB_BG1CNT_PRIORITY_MASK | REG_G2S_DB_BG1CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG1CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2S_DB_BG1CNT_COLORMODE_SHIFT) | (screenBase << REG_G2S_DB_BG1CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG1CNT_CHARBASE_SHIFT) | (bgExtPltt << REG_G2S_DB_BG1CNT_BGPLTTSLOT_SHIFT)); +} + +static inline void G2_SetBG2ControlText(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & ((REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK))) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2_BG2CNT_COLORMODE_SHIFT) | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG2CNT_CHARBASE_SHIFT)); +} + +static inline void G2S_SetBG2ControlText(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & ((REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK))) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2S_DB_BG2CNT_COLORMODE_SHIFT) | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG2CNT_CHARBASE_SHIFT)); +} + +static inline void G2_SetBG2ControlAffine(GXBGScrSizeAffine screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & ((REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK))) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG2CNT_CHARBASE_SHIFT) | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG2ControlAffine(GXBGScrSizeAffine screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & ((REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK))) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG2CNT_CHARBASE_SHIFT) | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG2Control256x16Pltt(GXBGScrSize256x16Pltt screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (charBase << REG_G2_BG2CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG2Control256x16Pltt(GXBGScrSize256x16Pltt screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | (charBase << REG_G2S_DB_BG2CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG2Control256Bmp(GXBGScrSize256Bmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG2Control256Bmp(GXBGScrSize256Bmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG2ControlDCBmp(GXBGScrSizeDcBmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG2ControlDCBmp(GXBGScrSizeDcBmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG2ControlLargeBmp(GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG2ControlLargeBmp(GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG3ControlText(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & ((REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK))) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2_BG3CNT_COLORMODE_SHIFT) | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG3CNT_CHARBASE_SHIFT)); +} + +static inline void G2S_SetBG3ControlText(GXBGScrSizeText screenSize, GXBGColorMode colorMode, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & ((REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK))) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | (colorMode << REG_G2S_DB_BG3CNT_COLORMODE_SHIFT) | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG3CNT_CHARBASE_SHIFT)); +} + +static inline void G2_SetBG3ControlAffine(GXBGScrSizeAffine screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & ((REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK))) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (charBase << REG_G2_BG3CNT_CHARBASE_SHIFT) | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG3ControlAffine(GXBGScrSizeAffine screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & ((REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK))) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (charBase << REG_G2S_DB_BG3CNT_CHARBASE_SHIFT) | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG3Control256x16Pltt(GXBGScrSize256x16Pltt screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (charBase << REG_G2_BG3CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG3Control256x16Pltt(GXBGScrSize256x16Pltt screenSize, GXBGAreaOver areaOver, GXBGScrBase screenBase, GXBGCharBase charBase) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | (charBase << REG_G2S_DB_BG3CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG3Control256Bmp(GXBGScrSize256Bmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG3Control256Bmp(GXBGScrSize256Bmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG3ControlDCBmp(GXBGScrSizeDcBmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG3ControlDCBmp(GXBGScrSizeDcBmp screenSize, GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2_SetBG3ControlLargeBmp(GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2S_SetBG3ControlLargeBmp(GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline void G2_BG0Mosaic(BOOL enable) { + if (enable) { + reg_G2_BG0CNT |= REG_G2_BG0CNT_MOSAIC_MASK; + } else { + reg_G2_BG0CNT &= ~REG_G2_BG0CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG0Mosaic(BOOL enable) { + if (enable) { + reg_G2S_DB_BG0CNT |= REG_G2S_DB_BG0CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG0CNT &= ~REG_G2S_DB_BG0CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG1Mosaic(BOOL enable) { + if (enable) { + reg_G2_BG1CNT |= REG_G2_BG1CNT_MOSAIC_MASK; + } else { + reg_G2_BG1CNT &= ~REG_G2_BG1CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG1Mosaic(BOOL enable) { + if (enable) { + reg_G2S_DB_BG1CNT |= REG_G2S_DB_BG1CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG1CNT &= ~REG_G2S_DB_BG1CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG2Mosaic(BOOL enable) { + if (enable) { + reg_G2_BG2CNT |= REG_G2_BG2CNT_MOSAIC_MASK; + } else { + reg_G2_BG2CNT &= ~REG_G2_BG2CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG2Mosaic(BOOL enable) { + if (enable) { + reg_G2S_DB_BG2CNT |= REG_G2S_DB_BG2CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG2CNT &= ~REG_G2S_DB_BG2CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG3Mosaic(BOOL enable) { + if (enable) { + reg_G2_BG3CNT |= REG_G2_BG3CNT_MOSAIC_MASK; + } else { + reg_G2_BG3CNT &= ~REG_G2_BG3CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG3Mosaic(BOOL enable) { + if (enable) { + reg_G2S_DB_BG3CNT |= REG_G2S_DB_BG3CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG3CNT &= ~REG_G2S_DB_BG3CNT_MOSAIC_MASK; + } +} + +static inline void G2_SetBG0Priority(int priority) { + reg_G2_BG0CNT = (u16)((reg_G2_BG0CNT & ~REG_G2_BG0CNT_PRIORITY_MASK) | (priority << REG_G2_BG0CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG0Priority(int priority) { + reg_G2S_DB_BG0CNT = (u16)((reg_G2S_DB_BG0CNT & ~REG_G2S_DB_BG0CNT_PRIORITY_MASK) | (priority << REG_G2S_DB_BG0CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG1Priority(int priority) { + reg_G2_BG1CNT = (u16)((reg_G2_BG1CNT & ~REG_G2_BG1CNT_PRIORITY_MASK) | (priority << REG_G2_BG1CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG1Priority(int priority) { + reg_G2S_DB_BG1CNT = (u16)((reg_G2S_DB_BG1CNT & ~REG_G2S_DB_BG1CNT_PRIORITY_MASK) | (priority << REG_G2S_DB_BG1CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG2Priority(int priority) { + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & ~REG_G2_BG2CNT_PRIORITY_MASK) | (priority << REG_G2_BG2CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG2Priority(int priority) { + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & ~REG_G2S_DB_BG2CNT_PRIORITY_MASK) | (priority << REG_G2S_DB_BG2CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG3Priority(int priority) { + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & ~REG_G2_BG3CNT_PRIORITY_MASK) | (priority << REG_G2_BG3CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG3Priority(int priority) { + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & ~REG_G2S_DB_BG3CNT_PRIORITY_MASK) | (priority << REG_G2S_DB_BG3CNT_PRIORITY_SHIFT)); +} + +static inline GXBg01Control G2_GetBG0Control(void) { + return *(volatile GXBg01Control *)®_G2_BG0CNT; +} + +static inline GXBg01Control G2S_GetBG0Control(void) { + return *(volatile GXBg01Control *)®_G2S_DB_BG0CNT; +} + +static inline GXBg01Control G2_GetBG1Control(void) { + return *(volatile GXBg01Control *)®_G2_BG1CNT; +} + +static inline GXBg01Control G2S_GetBG1Control(void) { + return *(volatile GXBg01Control *)®_G2S_DB_BG1CNT; +} + +static inline GXBg23ControlText G2_GetBG2ControlText(void) { + return *(volatile GXBg23ControlText *)®_G2_BG2CNT; +} + +static inline GXBg23ControlText G2S_GetBG2ControlText(void) { + return *(volatile GXBg23ControlText *)®_G2S_DB_BG2CNT; +} + +static inline GXBg23ControlAffine G2_GetBG2ControlAffine(void) { + return *(volatile GXBg23ControlAffine *)®_G2_BG2CNT; +} + +static inline GXBg23ControlAffine G2S_GetBG2ControlAffine(void) { + return *(volatile GXBg23ControlAffine *)®_G2S_DB_BG2CNT; +} + +static inline GXBg23Control256x16Pltt G2_GetBG2Control256x16Pltt(void) { + return *(volatile GXBg23Control256x16Pltt *)®_G2_BG2CNT; +} + +static inline GXBg23Control256x16Pltt G2S_GetBG2Control256x16Pltt(void) { + return *(volatile GXBg23Control256x16Pltt *)®_G2S_DB_BG2CNT; +} + +static inline GXBg23Control256Bmp G2_GetBG2Control256Bmp(void) { + return *(volatile GXBg23Control256Bmp *)®_G2_BG2CNT; +} + +static inline GXBg23Control256Bmp G2S_GetBG2Control256Bmp(void) { + return *(volatile GXBg23Control256Bmp *)®_G2S_DB_BG2CNT; +} + +static inline GXBg23ControlDCBmp G2_GetBG2ControlDCBmp(void) { + return *(volatile GXBg23ControlDCBmp *)®_G2_BG2CNT; +} + +static inline GXBg23ControlDCBmp G2S_GetBG2ControlDCBmp(void) { + return *(volatile GXBg23ControlDCBmp *)®_G2S_DB_BG2CNT; +} + +static inline GXBg2ControlLargeBmp G2_GetBG2ControlLargeBmp(void) { + return *(volatile GXBg2ControlLargeBmp *)®_G2_BG2CNT; +} + +static inline GXBg2ControlLargeBmp G2S_GetBG2ControlLargeBmp(void) { + return *(volatile GXBg2ControlLargeBmp *)®_G2S_DB_BG2CNT; +} + +static inline GXBg23ControlText G2_GetBG3ControlText(void) { + return *(volatile GXBg23ControlText *)®_G2_BG3CNT; +} + +static inline GXBg23ControlText G2S_GetBG3ControlText(void) { + return *(volatile GXBg23ControlText *)®_G2S_DB_BG3CNT; +} + +static inline GXBg23ControlAffine G2_GetBG3ControlAffine(void) { + return *(volatile GXBg23ControlAffine *)®_G2_BG3CNT; +} + +static inline GXBg23ControlAffine G2S_GetBG3ControlAffine(void) { + return *(volatile GXBg23ControlAffine *)®_G2S_DB_BG3CNT; +} + +static inline GXBg23Control256x16Pltt G2_GetBG3Control256x16Pltt(void) { + return *(volatile GXBg23Control256x16Pltt *)®_G2_BG3CNT; +} + +static inline GXBg23Control256x16Pltt G2S_GetBG3Control256x16Pltt(void) { + return *(volatile GXBg23Control256x16Pltt *)®_G2S_DB_BG3CNT; +} + +static inline GXBg23Control256Bmp G2_GetBG3Control256Bmp(void) { + return *(volatile GXBg23Control256Bmp *)®_G2_BG3CNT; +} + +static inline GXBg23Control256Bmp G2S_GetBG3Control256Bmp(void) { + return *(volatile GXBg23Control256Bmp *)®_G2S_DB_BG3CNT; +} + +static inline GXBg23ControlDCBmp G2_GetBG3ControlDCBmp(void) { + return *(volatile GXBg23ControlDCBmp *)®_G2_BG3CNT; +} + +static inline GXBg23ControlDCBmp G2S_GetBG3ControlDCBmp(void) { + return *(volatile GXBg23ControlDCBmp *)®_G2S_DB_BG3CNT; +} + +#endif //NITRO_GX_GX_BGCNT_H diff --git a/lib/include/nitro/gx/gx_load.h b/lib/include/nitro/gx/gx_load.h new file mode 100644 index 00000000..ef6744fb --- /dev/null +++ b/lib/include/nitro/gx/gx_load.h @@ -0,0 +1,43 @@ +#ifndef NITRO_GX_GX_LOAD_H_ +#define NITRO_GX_GX_LOAD_H_ + +void GX_LoadBG0Scr(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG1Scr(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG2Scr(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG3Scr(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG0Scr(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG1Scr(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG2Scr(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG3Scr(const void *pSrc, u32 offset, u32 szByte); + +void GX_LoadBG0Char(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG1Char(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG2Char(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBG3Char(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG0Char(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG1Char(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG2Char(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBG3Char(const void *pSrc, u32 offset, u32 szByte); + +void GX_BeginLoadBGExtPltt(void); +void GX_EndLoadBGExtPltt(void); +void GXS_BeginLoadBGExtPltt(void); +void GXS_EndLoadBGExtPltt(void); +void GX_BeginLoadOBJExtPltt(void); +void GX_EndLoadOBJExtPltt(void); +void GXS_BeginLoadOBJExtPltt(void); +void GXS_EndLoadOBJExtPltt(void); + +void GX_LoadBGPltt(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadOBJPltt(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadBGExtPltt(const void *pSrc, u32 offset, u32 szByte); +void GX_LoadOBJExtPltt(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBGPltt(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadOBJPltt(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadBGExtPltt(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadOBJExtPltt(const void *pSrc, u32 offset, u32 szByte); + +void GX_LoadOBJ(const void *pSrc, u32 offset, u32 szByte); +void GXS_LoadOBJ(const void *pSrc, u32 offset, u32 szByte); + +#endif //NITRO_GX_GX_LOAD_H_ diff --git a/lib/include/nitro/gx/gx_vramcnt.h b/lib/include/nitro/gx/gx_vramcnt.h new file mode 100644 index 00000000..f148ad84 --- /dev/null +++ b/lib/include/nitro/gx/gx_vramcnt.h @@ -0,0 +1,213 @@ +#ifndef NITRO_GX_GX_VRAMCNT_H_ +#define NITRO_GX_GX_VRAMCNT_H_ + +typedef enum { + GX_VRAM_A = OS_VRAM_BANK_ID_A,// VRAM-A + GX_VRAM_B = OS_VRAM_BANK_ID_B,// VRAM-B + GX_VRAM_C = OS_VRAM_BANK_ID_C,// VRAM-C + GX_VRAM_D = OS_VRAM_BANK_ID_D,// VRAM-D + GX_VRAM_E = OS_VRAM_BANK_ID_E,// VRAM-E + GX_VRAM_F = OS_VRAM_BANK_ID_F,// VRAM-F + GX_VRAM_G = OS_VRAM_BANK_ID_G,// VRAM-G + GX_VRAM_H = OS_VRAM_BANK_ID_H,// VRAM-H + GX_VRAM_I = OS_VRAM_BANK_ID_I,// VRAM-I + GX_VRAM_ALL = OS_VRAM_BANK_ID_ALL +} GXVRam; + +typedef enum { + GX_VRAM_LCDC_NONE = 0x0000, + GX_VRAM_LCDC_A = GX_VRAM_A, + GX_VRAM_LCDC_B = GX_VRAM_B, + GX_VRAM_LCDC_C = GX_VRAM_C, + GX_VRAM_LCDC_D = GX_VRAM_D, + GX_VRAM_LCDC_E = GX_VRAM_E, + GX_VRAM_LCDC_F = GX_VRAM_F, + GX_VRAM_LCDC_G = GX_VRAM_G, + GX_VRAM_LCDC_H = GX_VRAM_H, + GX_VRAM_LCDC_I = GX_VRAM_I, + GX_VRAM_LCDC_ALL = GX_VRAM_ALL +} GXVRamLCDC; + +typedef enum { + GX_VRAM_BG_NONE = 0x0000, + GX_VRAM_BG_16_F = GX_VRAM_F, + GX_VRAM_BG_16_G = GX_VRAM_G, + GX_VRAM_BG_32_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_BG_64_E = GX_VRAM_E, + GX_VRAM_BG_80_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_BG_96_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G, + GX_VRAM_BG_128_A = GX_VRAM_A, + GX_VRAM_BG_128_B = GX_VRAM_B, + GX_VRAM_BG_128_C = GX_VRAM_C, + GX_VRAM_BG_128_D = GX_VRAM_D, + GX_VRAM_BG_256_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_BG_256_BC = GX_VRAM_B | GX_VRAM_C, + GX_VRAM_BG_256_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_384_ABC = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C, + GX_VRAM_BG_384_BCD = GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_512_ABCD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_80_EG = GX_VRAM_E | GX_VRAM_G, + GX_VRAM_BG_256_AC = GX_VRAM_A | GX_VRAM_C, + GX_VRAM_BG_256_AD = GX_VRAM_A | GX_VRAM_D, + GX_VRAM_BG_256_BD = GX_VRAM_B | GX_VRAM_D, + GX_VRAM_BG_384_ABD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_D, + GX_VRAM_BG_384_ACD = GX_VRAM_A | GX_VRAM_C | GX_VRAM_D +} GXVRamBG; + +typedef enum { + GX_VRAM_OBJ_NONE = 0x0000, + GX_VRAM_OBJ_16_F = GX_VRAM_F, + GX_VRAM_OBJ_16_G = GX_VRAM_G, + GX_VRAM_OBJ_32_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_OBJ_64_E = GX_VRAM_E, + GX_VRAM_OBJ_80_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_OBJ_80_EG = GX_VRAM_E | GX_VRAM_G, + GX_VRAM_OBJ_96_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G, + GX_VRAM_OBJ_128_A = GX_VRAM_A, + GX_VRAM_OBJ_128_B = GX_VRAM_B, + GX_VRAM_OBJ_256_AB = GX_VRAM_A | GX_VRAM_B +} GXVRamOBJ; + +typedef enum { + GX_VRAM_TEX_NONE = 0x0000, + GX_VRAM_TEX_0_A = GX_VRAM_A, + GX_VRAM_TEX_0_B = GX_VRAM_B, + GX_VRAM_TEX_0_C = GX_VRAM_C, + GX_VRAM_TEX_0_D = GX_VRAM_D, + GX_VRAM_TEX_01_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_TEX_01_BC = GX_VRAM_B | GX_VRAM_C, + GX_VRAM_TEX_01_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_012_ABC = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C, + GX_VRAM_TEX_012_BCD = GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_0123_ABCD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_01_AC = GX_VRAM_A | GX_VRAM_C, + GX_VRAM_TEX_01_AD = GX_VRAM_A | GX_VRAM_D, + GX_VRAM_TEX_01_BD = GX_VRAM_B | GX_VRAM_D, + GX_VRAM_TEX_012_ABD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_D, + GX_VRAM_TEX_012_ACD = GX_VRAM_A | GX_VRAM_C | GX_VRAM_D +} GXVRamTex; + +typedef enum { + GX_VRAM_CLEARIMAGE_NONE = 0x0000, + GX_VRAM_CLEARIMAGE_256_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_CLEARIMAGE_256_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_CLEARDEPTH_128_A = GX_VRAM_A, + GX_VRAM_CLEARDEPTH_128_B = GX_VRAM_B, + GX_VRAM_CLEARDEPTH_128_C = GX_VRAM_C, + GX_VRAM_CLEARDEPTH_128_D = GX_VRAM_D +} GXVRamClearImage; + +typedef enum { + GX_VRAM_TEXPLTT_NONE = 0x0000, + GX_VRAM_TEXPLTT_0_F = GX_VRAM_F, + GX_VRAM_TEXPLTT_0_G = GX_VRAM_G, + GX_VRAM_TEXPLTT_01_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_TEXPLTT_0123_E = GX_VRAM_E, + GX_VRAM_TEXPLTT_01234_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_TEXPLTT_012345_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G +} GXVRamTexPltt; + +typedef enum { + GX_VRAM_BGEXTPLTT_NONE = 0x0000, + GX_VRAM_BGEXTPLTT_01_F = GX_VRAM_F, + GX_VRAM_BGEXTPLTT_23_G = GX_VRAM_G, + GX_VRAM_BGEXTPLTT_0123_E = GX_VRAM_E, + GX_VRAM_BGEXTPLTT_0123_FG = GX_VRAM_F | GX_VRAM_G +} GXVRamBGExtPltt; + +typedef enum { + GX_VRAM_OBJEXTPLTT_NONE = 0, + GX_VRAM_OBJEXTPLTT_0_F = GX_VRAM_F, + GX_VRAM_OBJEXTPLTT_0_G = GX_VRAM_G +} GXVRamOBJExtPltt; + +typedef enum { + GX_VRAM_SUB_BG_NONE = 0x0000, + GX_VRAM_SUB_BG_128_C = GX_VRAM_C, + GX_VRAM_SUB_BG_32_H = GX_VRAM_H, + GX_VRAM_SUB_BG_48_HI = GX_VRAM_H | GX_VRAM_I +} GXVRamSubBG; + +typedef enum { + GX_VRAM_SUB_OBJ_NONE = 0x0000, + GX_VRAM_SUB_OBJ_128_D = GX_VRAM_D, + GX_VRAM_SUB_OBJ_16_I = GX_VRAM_I +} GXVRamSubOBJ; + +typedef enum { + GX_VRAM_SUB_BGEXTPLTT_NONE = 0x0000, + GX_VRAM_SUB_BGEXTPLTT_0123_H = GX_VRAM_H +} GXVRamSubBGExtPltt; + +typedef enum { + GX_VRAM_SUB_OBJEXTPLTT_NONE = 0x0000, + GX_VRAM_SUB_OBJEXTPLTT_0_I = GX_VRAM_I +} GXVRamSubOBJExtPltt; + +void GX_SetBankForLCDC(GXVRamLCDC lcdc); +GXVRamLCDC GX_DisableBankForLCDC(void); + +void GX_SetBankForBG(GXVRamBG bank); +BOOL GX_TrySetBankForBG(GXVRamBG bank); +void GX_SetBankForOBJ(GXVRamOBJ bank); +BOOL GX_TrySetBankForOBJ(GXVRamOBJ bank); +void GX_SetBankForBGExtPltt(GXVRamBGExtPltt bank); +BOOL GX_TrySetBankForBGExtPltt(GXVRamBGExtPltt bank); +void GX_SetBankForOBJExtPltt(GXVRamOBJExtPltt bank); +BOOL GX_TrySetBankForOBJExtPltt(GXVRamOBJExtPltt bank); +void GX_SetBankForTex(GXVRamTex bank); +BOOL GX_TrySetBankForTex(GXVRamTex bank); +void GX_SetBankForTexPltt(GXVRamTexPltt bank); +BOOL GX_TrySetBankForTexPltt(GXVRamTexPltt bank); +void GX_SetBankForClearImage(GXVRamClearImage bank); +BOOL GX_TrySetBankForClearImage(GXVRamClearImage bank); + +GXVRamBG GX_GetBankForBG(void); +GXVRamOBJ GX_GetBankForOBJ(void); +GXVRamBGExtPltt GX_GetBankForBGExtPltt(void); +GXVRamOBJExtPltt GX_GetBankForOBJExtPltt(void); +GXVRamTex GX_GetBankForTex(void); +GXVRamTexPltt GX_GetBankForTexPltt(void); +GXVRamClearImage GX_GetBankForClearImage(void); + +GXVRamBG GX_ResetBankForBG(void); +GXVRamOBJ GX_ResetBankForOBJ(void); +GXVRamBGExtPltt GX_ResetBankForBGExtPltt(void); +GXVRamOBJExtPltt GX_ResetBankForOBJExtPltt(void); +GXVRamTex GX_ResetBankForTex(void); +GXVRamTexPltt GX_ResetBankForTexPltt(void); +GXVRamClearImage GX_ResetBankForClearImage(void); + +GXVRamBG GX_DisableBankForBG(void); +GXVRamOBJ GX_DisableBankForOBJ(void); +GXVRamBGExtPltt GX_DisableBankForBGExtPltt(void); +GXVRamOBJExtPltt GX_DisableBankForOBJExtPltt(void); +GXVRamTex GX_DisableBankForTex(void); +GXVRamTexPltt GX_DisableBankForTexPltt(void); +GXVRamClearImage GX_DisableBankForClearImage(void); + +void GX_SetBankForSubBG(GXVRamSubBG bank); +BOOL GX_TrySetBankForSubBG(GXVRamSubBG bank); +void GX_SetBankForSubOBJ(GXVRamSubOBJ bank); +BOOL GX_TrySetBankForSubOBJ(GXVRamSubOBJ bank); +void GX_SetBankForSubBGExtPltt(GXVRamSubBGExtPltt bank); +BOOL GX_TrySetBankForSubBGExtPltt(GXVRamSubBGExtPltt bank); +void GX_SetBankForSubOBJExtPltt(GXVRamSubOBJExtPltt bank); +BOOL GX_TrySetBankForSubOBJExtPltt(GXVRamSubOBJExtPltt bank); + +GXVRamSubBG GX_GetBankForSubBG(void); +GXVRamSubOBJ GX_GetBankForSubOBJ(void); +GXVRamSubBGExtPltt GX_GetBankForSubBGExtPltt(void); +GXVRamSubOBJExtPltt GX_GetBankForSubOBJExtPltt(void); + +GXVRamSubBG GX_ResetBankForSubBG(void); +GXVRamSubOBJ GX_ResetBankForSubOBJ(void); +GXVRamSubBGExtPltt GX_ResetBankForSubBGExtPltt(void); +GXVRamSubOBJExtPltt GX_ResetBankForSubOBJExtPltt(void); + +GXVRamSubBG GX_DisableBankForSubBG(void); +GXVRamSubOBJ GX_DisableBankForSubOBJ(void); +GXVRamSubBGExtPltt GX_DisableBankForSubBGExtPltt(void); +GXVRamSubOBJExtPltt GX_DisableBankForSubOBJExtPltt(void); + +#endif //NITRO_GX_GX_VRAMCNT_H_ diff --git a/lib/include/nitro/gx/gxcommon.h b/lib/include/nitro/gx/gxcommon.h new file mode 100644 index 00000000..9e387d30 --- /dev/null +++ b/lib/include/nitro/gx/gxcommon.h @@ -0,0 +1,22 @@ +#ifndef NITRO_GX_GXCOMMON_H_ +#define NITRO_GX_GXCOMMON_H_ + +#ifndef SDK_ASM +typedef u16 GXRgb; +#endif + +#define GX_RGB_R_SHIFT (0) +#define GX_RGB_R_MASK (0x001f) +#define GX_RGB_G_SHIFT (5) +#define GX_RGB_G_MASK (0x03e0) +#define GX_RGB_B_SHIFT (10) +#define GX_RGB_B_MASK (0x7c00) +#ifdef SDK_ASM +#define GX_RGB(r, g, b) ((((r) << GX_RGB_R_SHIFT) | ((g) << GX_RGB_G_SHIFT) | ((b) << GX_RGB_B_SHIFT))) +#else +#define GX_RGB(r, g, b) ((GXRgb)(((r) << GX_RGB_R_SHIFT) | ((g) << GX_RGB_G_SHIFT) | ((b) << GX_RGB_B_SHIFT))) +#endif + +#define GX_DEFAULT_DMAID 3 + +#endif //NITRO_GX_GXCOMMON_H_ diff --git a/lib/include/nitro/hw/ARM7/io_reg.h b/lib/include/nitro/hw/ARM7/io_reg.h new file mode 100644 index 00000000..b7356171 --- /dev/null +++ b/lib/include/nitro/hw/ARM7/io_reg.h @@ -0,0 +1,211 @@ +#ifndef NITRO_HW_ARM7_IO_REG_H_ +#define NITRO_HW_ARM7_IO_REG_H_ + +#define REG_MAINPINTF_OFFSET 0x180 +#define REG_MAINPINTF_ADDR (HW_REG_BASE + REG_MAINPINTF_OFFSET) +#define reg_PXI_MAINPINTF (*( REGType16v *) REG_MAINPINTF_ADDR) + +#define REG_MAINP_FIFO_CNT_OFFSET (0x184) +#define REG_MAINP_FIFO_CNT_ADDR (HW_REG_BASE + REG_MAINP_FIFO_CNT_OFFSET) +#define reg_PXI_MAINP_FIFO_CNT (*(REGType16v *)REG_MAINP_FIFO_CNT_ADDR) + +#define REG_SEND_FIFO_OFFSET 0x188 +#define REG_SEND_FIFO_ADDR (HW_REG_BASE + REG_SEND_FIFO_OFFSET) +#define reg_PXI_SEND_FIFO (*( REGType32v *) REG_SEND_FIFO_ADDR) + +/* RECV_FIFO */ + +#define REG_RECV_FIFO_OFFSET 0x100000 +#define REG_RECV_FIFO_ADDR (HW_REG_BASE + REG_RECV_FIFO_OFFSET) +#define reg_PXI_RECV_FIFO (*( REGType32v *) REG_RECV_FIFO_ADDR) + +#define REG_PXI_MAINPINTF_I_SHIFT 14 +#define REG_PXI_MAINPINTF_I_SIZE 1 +#define REG_PXI_MAINPINTF_I_MASK 0x4000 + +#define REG_PXI_MAINPINTF_IREQ_SHIFT 13 +#define REG_PXI_MAINPINTF_IREQ_SIZE 1 +#define REG_PXI_MAINPINTF_IREQ_MASK 0x2000 + +#define REG_PXI_MAINPINTF_A7STATUS_SHIFT 8 +#define REG_PXI_MAINPINTF_A7STATUS_SIZE 4 +#define REG_PXI_MAINPINTF_A7STATUS_MASK 0x0f00 + +#define REG_PXI_MAINPINTF_A9STATUS_SHIFT 0 +#define REG_PXI_MAINPINTF_A9STATUS_SIZE 4 +#define REG_PXI_MAINPINTF_A9STATUS_MASK 0x000f + +#ifndef SDK_ASM +#define REG_PXI_MAINPINTF_FIELD( i, ireq, a7status, a9status ) \ + (u16)( \ + ((u32)(i) << REG_PXI_MAINPINTF_I_SHIFT) | \ + ((u32)(ireq) << REG_PXI_MAINPINTF_IREQ_SHIFT) | \ + ((u32)(a7status) << REG_PXI_MAINPINTF_A7STATUS_SHIFT) | \ + ((u32)(a9status) << REG_PXI_MAINPINTF_A9STATUS_SHIFT)) +#endif + +#define REG_PXI_MAINP_FIFO_CNT_E_SHIFT 15 +#define REG_PXI_MAINP_FIFO_CNT_E_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_E_MASK 0x8000 + +#define REG_PXI_MAINP_FIFO_CNT_ERR_SHIFT 14 +#define REG_PXI_MAINP_FIFO_CNT_ERR_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_ERR_MASK 0x4000 + +#define REG_PXI_MAINP_FIFO_CNT_RECV_RI_SHIFT 10 +#define REG_PXI_MAINP_FIFO_CNT_RECV_RI_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_RECV_RI_MASK 0x0400 + +#define REG_PXI_MAINP_FIFO_CNT_RECV_FULL_SHIFT 9 +#define REG_PXI_MAINP_FIFO_CNT_RECV_FULL_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_RECV_FULL_MASK 0x0200 + +#define REG_PXI_MAINP_FIFO_CNT_RECV_EMP_SHIFT 8 +#define REG_PXI_MAINP_FIFO_CNT_RECV_EMP_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_RECV_EMP_MASK 0x0100 + +#define REG_PXI_MAINP_FIFO_CNT_SEND_CL_SHIFT 3 +#define REG_PXI_MAINP_FIFO_CNT_SEND_CL_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_SEND_CL_MASK 0x0008 + +#define REG_PXI_MAINP_FIFO_CNT_SEND_TI_SHIFT 2 +#define REG_PXI_MAINP_FIFO_CNT_SEND_TI_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_SEND_TI_MASK 0x0004 + +#define REG_PXI_MAINP_FIFO_CNT_SEND_FULL_SHIFT 1 +#define REG_PXI_MAINP_FIFO_CNT_SEND_FULL_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_SEND_FULL_MASK 0x0002 + +#define REG_PXI_MAINP_FIFO_CNT_SEND_EMP_SHIFT 0 +#define REG_PXI_MAINP_FIFO_CNT_SEND_EMP_SIZE 1 +#define REG_PXI_MAINP_FIFO_CNT_SEND_EMP_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_PXI_MAINP_FIFO_CNT_FIELD( e, err, recv_ri, recv_full, recv_emp, send_cl, send_ti, send_full, send_emp ) \ + (u16)( \ + ((u32)(e) << REG_PXI_MAINP_FIFO_CNT_E_SHIFT) | \ + ((u32)(err) << REG_PXI_MAINP_FIFO_CNT_ERR_SHIFT) | \ + ((u32)(recv_ri) << REG_PXI_MAINP_FIFO_CNT_RECV_RI_SHIFT) | \ + ((u32)(recv_full) << REG_PXI_MAINP_FIFO_CNT_RECV_FULL_SHIFT) | \ + ((u32)(recv_emp) << REG_PXI_MAINP_FIFO_CNT_RECV_EMP_SHIFT) | \ + ((u32)(send_cl) << REG_PXI_MAINP_FIFO_CNT_SEND_CL_SHIFT) | \ + ((u32)(send_ti) << REG_PXI_MAINP_FIFO_CNT_SEND_TI_SHIFT) | \ + ((u32)(send_full) << REG_PXI_MAINP_FIFO_CNT_SEND_FULL_SHIFT) | \ + ((u32)(send_emp) << REG_PXI_MAINP_FIFO_CNT_SEND_EMP_SHIFT)) +#endif + + +#define REG_RCNT0_L_OFFSET 0x134 +#define REG_RCNT0_L_ADDR (HW_REG_BASE + REG_RCNT0_L_OFFSET) +#define reg_EXI_RCNT0_L (*(REGType16v *)REG_RCNT0_L_ADDR) + +#define REG_RCNT0_H_OFFSET 0x136 +#define REG_RCNT0_H_ADDR (HW_REG_BASE + REG_RCNT0_H_OFFSET) +#define reg_EXI_RCNT0_H (*(REGType16v *)REG_RCNT0_H_ADDR) + +#define REG_EXI_RCNT0_L_RE1_SHIFT 15 +#define REG_EXI_RCNT0_L_RE1_SIZE 1 +#define REG_EXI_RCNT0_L_RE1_MASK 0x8000 + +#define REG_EXI_RCNT0_L_RE0_SHIFT 14 +#define REG_EXI_RCNT0_L_RE0_SIZE 1 +#define REG_EXI_RCNT0_L_RE0_MASK 0x4000 + +#define REG_EXI_RCNT0_L_I_SHIFT 8 +#define REG_EXI_RCNT0_L_I_SIZE 1 +#define REG_EXI_RCNT0_L_I_MASK 0x0100 + +#define REG_EXI_RCNT0_L_DIR_SO_SHIFT 7 +#define REG_EXI_RCNT0_L_DIR_SO_SIZE 1 +#define REG_EXI_RCNT0_L_DIR_SO_MASK 0x0080 + +#define REG_EXI_RCNT0_L_DIR_SI_SHIFT 6 +#define REG_EXI_RCNT0_L_DIR_SI_SIZE 1 +#define REG_EXI_RCNT0_L_DIR_SI_MASK 0x0040 + +#define REG_EXI_RCNT0_L_DIR_SD_SHIFT 5 +#define REG_EXI_RCNT0_L_DIR_SD_SIZE 1 +#define REG_EXI_RCNT0_L_DIR_SD_MASK 0x0020 + +#define REG_EXI_RCNT0_L_DIR_SC_SHIFT 4 +#define REG_EXI_RCNT0_L_DIR_SC_SIZE 1 +#define REG_EXI_RCNT0_L_DIR_SC_MASK 0x0010 + +#define REG_EXI_RCNT0_L_DATA_SO_SHIFT 3 +#define REG_EXI_RCNT0_L_DATA_SO_SIZE 1 +#define REG_EXI_RCNT0_L_DATA_SO_MASK 0x0008 + +#define REG_EXI_RCNT0_L_DATA_SI_SHIFT 2 +#define REG_EXI_RCNT0_L_DATA_SI_SIZE 1 +#define REG_EXI_RCNT0_L_DATA_SI_MASK 0x0004 + +#define REG_EXI_RCNT0_L_DATA_SD_SHIFT 1 +#define REG_EXI_RCNT0_L_DATA_SD_SIZE 1 +#define REG_EXI_RCNT0_L_DATA_SD_MASK 0x0002 + +#define REG_EXI_RCNT0_L_DATA_SC_SHIFT 0 +#define REG_EXI_RCNT0_L_DATA_SC_SIZE 1 +#define REG_EXI_RCNT0_L_DATA_SC_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_EXI_RCNT0_L_FIELD( re1, re0, i, dir_so, dir_si, dir_sd, dir_sc, data_so, data_si, data_sd, data_sc ) \ + (u16)( \ + ((u32)(re1) << REG_EXI_RCNT0_L_RE1_SHIFT) | \ + ((u32)(re0) << REG_EXI_RCNT0_L_RE0_SHIFT) | \ + ((u32)(i) << REG_EXI_RCNT0_L_I_SHIFT) | \ + ((u32)(dir_so) << REG_EXI_RCNT0_L_DIR_SO_SHIFT) | \ + ((u32)(dir_si) << REG_EXI_RCNT0_L_DIR_SI_SHIFT) | \ + ((u32)(dir_sd) << REG_EXI_RCNT0_L_DIR_SD_SHIFT) | \ + ((u32)(dir_sc) << REG_EXI_RCNT0_L_DIR_SC_SHIFT) | \ + ((u32)(data_so) << REG_EXI_RCNT0_L_DATA_SO_SHIFT) | \ + ((u32)(data_si) << REG_EXI_RCNT0_L_DATA_SI_SHIFT) | \ + ((u32)(data_sd) << REG_EXI_RCNT0_L_DATA_SD_SHIFT) | \ + ((u32)(data_sc) << REG_EXI_RCNT0_L_DATA_SC_SHIFT)) +#endif + +#define REG_EXI_RCNT0_H_DATA_R7_SHIFT 7 +#define REG_EXI_RCNT0_H_DATA_R7_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R7_MASK 0x0080 + +#define REG_EXI_RCNT0_H_DATA_R6_SHIFT 6 +#define REG_EXI_RCNT0_H_DATA_R6_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R6_MASK 0x0040 + +#define REG_EXI_RCNT0_H_DATA_R5_SHIFT 5 +#define REG_EXI_RCNT0_H_DATA_R5_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R5_MASK 0x0020 + +#define REG_EXI_RCNT0_H_DATA_R4_SHIFT 4 +#define REG_EXI_RCNT0_H_DATA_R4_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R4_MASK 0x0010 + +#define REG_EXI_RCNT0_H_DATA_R3_SHIFT 3 +#define REG_EXI_RCNT0_H_DATA_R3_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R3_MASK 0x0008 + +#define REG_EXI_RCNT0_H_DATA_R2_SHIFT 2 +#define REG_EXI_RCNT0_H_DATA_R2_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R2_MASK 0x0004 + +#define REG_EXI_RCNT0_H_DATA_R1_SHIFT 1 +#define REG_EXI_RCNT0_H_DATA_R1_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R1_MASK 0x0002 + +#define REG_EXI_RCNT0_H_DATA_R0_SHIFT 0 +#define REG_EXI_RCNT0_H_DATA_R0_SIZE 1 +#define REG_EXI_RCNT0_H_DATA_R0_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_EXI_RCNT0_H_FIELD( data_r7, data_r6, data_r5, data_r4, data_r3, data_r2, data_r1, data_r0 ) \ + (u16)( \ + ((u32)(data_r7) << REG_EXI_RCNT0_H_DATA_R7_SHIFT) | \ + ((u32)(data_r6) << REG_EXI_RCNT0_H_DATA_R6_SHIFT) | \ + ((u32)(data_r5) << REG_EXI_RCNT0_H_DATA_R5_SHIFT) | \ + ((u32)(data_r4) << REG_EXI_RCNT0_H_DATA_R4_SHIFT) | \ + ((u32)(data_r3) << REG_EXI_RCNT0_H_DATA_R3_SHIFT) | \ + ((u32)(data_r2) << REG_EXI_RCNT0_H_DATA_R2_SHIFT) | \ + ((u32)(data_r1) << REG_EXI_RCNT0_H_DATA_R1_SHIFT) | \ + ((u32)(data_r0) << REG_EXI_RCNT0_H_DATA_R0_SHIFT)) +#endif + +#endif //NITRO_HW_ARM7_IO_REG_H_ diff --git a/lib/include/nitro/hw/ARM7/mmap.h b/lib/include/nitro/hw/ARM7/mmap.h new file mode 100644 index 00000000..4275c0f4 --- /dev/null +++ b/lib/include/nitro/hw/ARM7/mmap.h @@ -0,0 +1,32 @@ +#ifndef NITRO_HW_ARM7_MMAP_H +#define NITRO_HW_ARM7_MMAP_H + +#define HW_WRAM_END 0x03800000 +#define HW_PRV_WRAM 0x03800000 +#define HW_PRV_WRAM_END 0x03810000 + +#define HW_PRV_WRAM_SIZE (HW_PRV_WRAM_END-HW_PRV_WRAM) + +#define HW_PRV_WRAM_SYSRV_SIZE 0x40 + +#define HW_MAIN_MEM_SUB_SIZE (HW_MAIN_MEM_SIZE - HW_MAIN_MEM_MAIN_SIZE - HW_MAIN_MEM_SHARED_SIZE) + +#define HW_MAIN_MEM_SUB (HW_MAIN_MEM_MAIN_END + 0x400000) +#define HW_MAIN_MEM_SUB_END (HW_MAIN_MEM_SUB + HW_MAIN_MEM_SUB_SIZE) +#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer + +#define HW_PRV_WRAM_IRQ_STACK_END (HW_PRV_WRAM_SVC_STACK) +#define HW_PRV_WRAM_SVC_STACK (HW_PRV_WRAM_SVC_STACK_END - HW_SVC_STACK_SIZE) +#define HW_PRV_WRAM_SVC_STACK_END (HW_PRV_WRAM_SYSRV) + +#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE) + +#define HW_INTR_CHECK_BUF (HW_PRV_WRAM_SYSRV + 0x38) +#define HW_INTR_VECTOR_BUF (HW_PRV_WRAM_SYSRV + 0x3C) + +#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c) +#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8) + +#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007FFFE0) + +#endif //NITRO_HW_ARM7_MMAP_H diff --git a/lib/include/nitro/hw/ARM9/io_reg.h b/lib/include/nitro/hw/ARM9/io_reg.h new file mode 100644 index 00000000..5fbd3499 --- /dev/null +++ b/lib/include/nitro/hw/ARM9/io_reg.h @@ -0,0 +1,11 @@ +#ifndef NITRO_HW_ARM9_IO_REG_H_ +#define NITRO_HW_ARM9_IO_REG_H_ + +#define REG_SUBPINTF_ADDR 0x4000180 +#define reg_PXI_SUBPINTF (*(REGType16v *)REG_SUBPINTF_ADDR) +#define reg_PXI_SUBP_FIFO_CNT (*(REGType16v *)0x4000184) +#define reg_PXI_SEND_FIFO (*(REGType32v *)0x4000188) + +#define reg_PXI_RECV_FIFO (*(REGType32v *)0x4100000) + +#endif //NITRO_HW_ARM9_IO_REG_H_ diff --git a/lib/include/nitro/hw/ARM9/mmap.h b/lib/include/nitro/hw/ARM9/mmap.h new file mode 100644 index 00000000..94a84700 --- /dev/null +++ b/lib/include/nitro/hw/ARM9/mmap.h @@ -0,0 +1,114 @@ +#ifndef NITRO_HW_ARM9_MMAP_H +#define NITRO_HW_ARM9_MMAP_H + +extern u32 SDK_AUTOLOAD_DTCM_START[]; + +#define HW_MAIN_MEM_EX_SIZE 0x00800000 +#define HW_MAIN_MEM_DEBUGGER_OFFSET 0x00700000 + +#define HW_ITCM_IMAGE 0x01000000 +#define HW_ITCM 0x01FF8000 +#define HW_ITCM_SIZE 0x00008000 +#define HW_ITCM_END (HW_ITCM + HW_ITCM_SIZE) + +#define HW_IOREG 0x04000000 +#define HW_CTRDG_ROM 0x08000000 +#define HW_BIOS 0xffff0000 + +#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START) +#define HW_DTCM_SIZE 0x00004000 +#define HW_DTCM_END (HW_DTCM + HW_DTCM_SIZE) + +#define HW_DTCM_SYSRV (HW_DTCM + 0x00003fc0) +#define HW_INTR_CHECK_BUF (HW_DTCM_SYSRV + 0x38) +#define HW_EXCP_VECTOR_BUF (HW_DTCM_SYSRV + 0x1C) + + +#define HW_CARD_ROM_HEADER_SIZE 0x00000160 +#define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020 + +#define HW_CHECK_DEBUGGER_SW 0x027ffc10 +#define HW_CARD_ROM_HEADER (HW_MAIN_MEM + 0x007ffa80) +#define HW_BOOT_CHECK_INFO_BUF (HW_MAIN_MEM + 0x007ffc00) +#define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM + 0x007ffc20) +#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c) +#define HW_CTRDG_MODULE_INFO_BUF (HW_MAIN_MEM + 0x007ffc30) +#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer +#define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory +#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) +#define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE) +#define HW_DTCM_SVC_STACK_END (HW_DTCM + 0x00003fc0) +#define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE) +#define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK) + +#define HW_MAIN_MEM_SUB (HW_MAIN_MEM_MAIN_END + 0x400000) + +#define HW_BIOS_EXCP_STACK_MAIN (HW_MAIN_MEM + 0x007ffd80) +#define HW_EXCP_VECTOR_MAIN (HW_MAIN_MEM + 0x007ffd9c) + +#define HW_PXI_SIGNAL_PARAM_ARM9 (HW_MAIN_MEM + 0x007fff80) + +#define HW_WM_RSSI_POOL (HW_MAIN_MEM + 0x007fff98) + +#define HW_COMPONENT_PARAM (HW_MAIN_MEM + 0x007fff9c) + +#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM + 0x007fffb0) +#define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0) +#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0) + +extern void SDK_SECTION_ARENA_EX_START(void); +#define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END) +#define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET) +#define OSi_MAINEX_ARENA_LO_DEFAULT ((u32)SDK_SECTION_ARENA_EX_START) +#define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE) +#define HW_SHARED_ARENA_HI_DEFAULT (HW_RED_RESERVED - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE) +#define HW_SHARED_ARENA_LO_DEFAULT (HW_MAIN_MEM_SHARED) +#define OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM) +#define OSi_WRAM_MAIN_ARENA_LO_DEFAULT (HW_WRAM) + +#define HW_BG_PLTT 0x05000000 +#define HW_BG_PLTT_END 0x05000200 +#define HW_BG_PLTT_SIZE (HW_BG_PLTT_END-HW_BG_PLTT) +#define HW_OBJ_PLTT 0x05000200 +#define HW_OBJ_PLTT_END 0x05000400 +#define HW_OBJ_PLTT_SIZE (HW_OBJ_PLTT_END-HW_OBJ_PLTT) +#define HW_PLTT HW_BG_PLTT +#define HW_PLTT_END HW_OBJ_PLTT_END +#define HW_PLTT_SIZE (HW_PLTT_END-HW_PLTT) +#define HW_DB_BG_PLTT 0x05000400 +#define HW_DB_BG_PLTT_END 0x05000600 +#define HW_DB_BG_PLTT_SIZE (HW_DB_BG_PLTT_END-HW_DB_BG_PLTT) +#define HW_DB_OBJ_PLTT 0x05000600 +#define HW_DB_OBJ_PLTT_END 0x05000800 +#define HW_DB_OBJ_PLTT_SIZE (HW_DB_OBJ_PLTT_END-HW_DB_OBJ_PLTT) +#define HW_DB_PLTT HW_DB_BG_PLTT +#define HW_DB_PLTT_END HW_DB_OBJ_PLTT_END +#define HW_DB_PLTT_SIZE (HW_DB_PLTT_END-HW_DB_PLTT) +#define HW_BG_VRAM 0x06000000 +#define HW_BG_VRAM_END 0x06080000 +#define HW_BG_VRAM_SIZE (HW_BG_VRAM_END-HW_BG_VRAM) +#define HW_DB_BG_VRAM 0x06200000 +#define HW_DB_BG_VRAM_END 0x06220000 +#define HW_DB_BG_VRAM_SIZE (HW_DB_BG_VRAM_END-HW_DB_BG_VRAM) +#define HW_OBJ_VRAM 0x06400000 +#define HW_OBJ_VRAM_END 0x06440000 +#define HW_OBJ_VRAM_SIZE (HW_OBJ_VRAM_END-HW_OBJ_VRAM) +#define HW_DB_OBJ_VRAM 0x06600000 +#define HW_DB_OBJ_VRAM_END 0x06620000 +#define HW_DB_OBJ_VRAM_SIZE (HW_DB_OBJ_VRAM_END-HW_DB_OBJ_VRAM) +#define HW_LCDC_VRAM 0x6800000 +#define HW_LCDC_VRAM_END 0x68a4000 +#define HW_LCDC_VRAM_SIZE (HW_LCDC_VRAM_END - HW_LCDC_VRAM) +#define HW_OAM 0x07000000 +#define HW_OAM_END 0x07000400 +#define HW_OAM_SIZE (HW_OAM_END-HW_OAM) +#define HW_DB_OAM 0x07000400 +#define HW_DB_OAM_END 0x07000800 +#define HW_DB_OAM_SIZE (HW_DB_OAM_END-HW_DB_OAM) + +#define HW_CTRDG_RAM_END 0x0a010000 + +#define HW_DTCM_SYSRV_OFS_INTR_VECTOR 0x3c +#define HW_RESET_VECTOR 0xffff0000 + +#endif //NITRO_HW_ARM9_MMAP_H diff --git a/lib/include/nitro/hw/common/io_reg.h b/lib/include/nitro/hw/common/io_reg.h new file mode 100644 index 00000000..ea996f7f --- /dev/null +++ b/lib/include/nitro/hw/common/io_reg.h @@ -0,0 +1,1205 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +#ifndef NITRO_HW_IO_REG_SHARED_H_ +#define NITRO_HW_IO_REG_SHARED_H_ + +#define HW_REG_BASE 0x04000000 + +#define REG_TM0CNT_L_OFFSET 0x100 +#define REG_TM0CNT_L_ADDR (HW_REG_BASE + REG_TM0CNT_L_OFFSET) +#define reg_OS_TM0CNT_L (*(REGType16v *)REG_TM0CNT_L_ADDR) + +#define REG_TM0CNT_H_OFFSET 0x102 +#define REG_TM0CNT_H_ADDR (HW_REG_BASE + REG_TM0CNT_H_OFFSET) +#define reg_OS_TM0CNT_H (*(REGType16v *)REG_TM0CNT_H_ADDR) + +#define REG_TM1CNT_L_OFFSET 0x104 +#define REG_TM1CNT_L_ADDR (HW_REG_BASE + REG_TM1CNT_L_OFFSET) +#define reg_OS_TM1CNT_L (*(REGType16v *)REG_TM1CNT_L_ADDR) + +#define REG_TM1CNT_H_OFFSET 0x106 +#define REG_TM1CNT_H_ADDR (HW_REG_BASE + REG_TM1CNT_H_OFFSET) +#define reg_OS_TM1CNT_H (*(REGType16v *)REG_TM1CNT_H_ADDR) + +#define REG_TM2CNT_L_OFFSET 0x108 +#define REG_TM2CNT_L_ADDR (HW_REG_BASE + REG_TM2CNT_L_OFFSET) +#define reg_OS_TM2CNT_L (*(REGType16v *)REG_TM2CNT_L_ADDR) + +#define REG_TM2CNT_H_OFFSET 0x10A +#define REG_TM2CNT_H_ADDR (HW_REG_BASE + REG_TM2CNT_H_OFFSET) +#define reg_OS_TM2CNT_H (*(REGType16v *)REG_TM2CNT_H_ADDR) + +#define REG_TM3CNT_L_OFFSET 0x10C +#define REG_TM3CNT_L_ADDR (HW_REG_BASE + REG_TM3CNT_L_OFFSET) +#define reg_OS_TM3CNT_L (*(REGType16v *)REG_TM3CNT_L_ADDR) + +#define REG_TM3CNT_H_OFFSET 0x10E +#define REG_TM3CNT_H_ADDR (HW_REG_BASE + REG_TM3CNT_H_OFFSET) +#define reg_OS_TM3CNT_H (*(REGType16v *)REG_TM3CNT_H_ADDR) + +#define REG_IE_OFFSET 0x210 +#define REG_IE_ADDR (HW_REG_BASE + REG_IE_OFFSET) +#define reg_OS_IE (*(REGType32v *)REG_IE_ADDR) + +#define REG_IME_OFFSET 0x208 +#define REG_IME_ADDR (HW_REG_BASE + REG_IME_OFFSET) +#define reg_OS_IME (*(REGType16v *)REG_IME_ADDR) + +#define REG_IF_OFFSET 0x214 +#define REG_IF_ADDR (HW_REG_BASE + REG_IF_OFFSET) +#define reg_OS_IF (*(REGType32v *)REG_IF_ADDR) + +#ifdef SDK_ARM7 +#define REG_MAINPINTF_OFFSET 0x180 +#define REG_MAINPINTF_ADDR (HW_REG_BASE + REG_MAINPINTF_OFFSET) +#define reg_OS_MAININTF (*(REGType16v *)REG_MAINPINTF_ADDR) +#else +#define REG_SUBINTF_OFFSET 0x180 +#define REG_SUBINTF_ADDR (HW_REG_BASE + REG_SUBINTF_OFFSET) +#define reg_OS_SUBINTF (*(REGType16v *)REG_SUBINTF_ADDR) +#endif //SDK_ARM7 + +#define REG_OS_TM0CNT_H_PS_SHIFT 0 + +#define REG_VCOUNT_OFFSET 0x6 + +#define reg_GX_DISPCNT (*(REGType32v *)0x4000000) +#define reg_GX_DISPSTAT (*(REGType16v *)0x4000004) +#define reg_GX_VCOUNT (*(REGType16v *)(HW_REG_BASE + REG_VCOUNT_OFFSET)) + +#define reg_G2_BG0CNT (*(REGType16v *)0x4000008) +#define reg_G2_BG1CNT (*(REGType16v *)0x400000a) +#define reg_G2_BG2CNT (*(REGType16v *)0x400000c) +#define reg_G2_BG3CNT (*(REGType16v *)0x400000e) +#define reg_G2_BG0OFS (*(REGType32v *)0x4000010) +#define reg_G2_BG0HOFS (*(REGType16v *)0x4000010) +#define reg_G2_BG0VOFS (*(REGType16v *)0x4000012) +#define reg_G2_BG1OFS (*(REGType32v *)0x4000014) +#define reg_G2_BG1HOFS (*(REGType16v *)0x4000014) +#define reg_G2_BG1VOFS (*(REGType16v *)0x4000016) +#define reg_G2_BG2OFS (*(REGType32v *)0x4000018) +#define reg_G2_BG2HOFS (*(REGType16v *)0x4000018) +#define reg_G2_BG2VOFS (*(REGType16v *)0x400001a) +#define reg_G2_BG3OFS (*(REGType32v *)0x400001c) +#define reg_G2_BG3HOFS (*(REGType16v *)0x400001c) +#define reg_G2_BG3VOFS (*(REGType16v *)0x400001e) +#define reg_G2_BG2PA (*(REGType16v *)0x4000020) +#define reg_G2_BG2PB (*(REGType16v *)0x4000022) +#define reg_G2_BG2PC (*(REGType16v *)0x4000024) +#define reg_G2_BG2PD (*(REGType16v *)0x4000026) +#define reg_G2_BG2X (*(REGType32v *)0x4000028) +#define reg_G2_BG2Y (*(REGType32v *)0x400002c) +#define reg_G2_BG3PA (*(REGType16v *)0x4000030) +#define reg_G2_BG3PB (*(REGType16v *)0x4000032) +#define reg_G2_BG3PC (*(REGType16v *)0x4000034) +#define reg_G2_BG3PD (*(REGType16v *)0x4000036) +#define reg_G2_BG3X (*(REGType32v *)0x4000038) +#define reg_G2_BG3Y (*(REGType32v *)0x400003c) +#define reg_G2_WIN0H (*(REGType16v *)0x4000040) +#define reg_G2_WIN1H (*(REGType16v *)0x4000042) +#define reg_G2_WIN0V (*(REGType16v *)0x4000044) +#define reg_G2_WIN1V (*(REGType16v *)0x4000046) +#define reg_G2_WININ (*(REGType16v *)0x4000048) +#define reg_G2_WINOUT (*(REGType16v *)0x400004a) +#define reg_G2_MOSAIC (*(REGType16v *)0x400004c) +#define reg_G2_BLDCNT (*(REGType16v *)0x4000050) +#define reg_G2_BLDALPHA (*(REGType16v *)0x4000052) +#define reg_G2_BLDY (*(REGType16v *)0x4000054) + +#define reg_G3X_DISP3DCNT (*(REGType16v *)0x4000060) + +#define reg_GX_DISPCAPCNT (*(REGType32v *)0x4000064) +#define reg_GX_DISP_MMEM_FIFO (*(REGType32v *)0x4000068) +#define reg_GX_DISP_MMEM_FIFO_L (*(REGType16v *)0x4000068) +#define reg_GX_DISP_MMEM_FIFO_H (*(REGType16v *)0x400006a) +#define reg_GX_MASTER_BRIGHT (*(REGType16v *)0x400006c) +#define reg_GX_TVOUTCNT (*(REGType16v *)0x4000070) + +#define reg_MI_DMA0SAD (*(REGType32v *)0x40000b0) +#define reg_MI_DMA0DAD (*(REGType32v *)0x40000b4) +#define reg_MI_DMA0CNT (*(REGType32v *)0x40000b8) +#define reg_MI_DMA1SAD (*(REGType32v *)0x40000bc) +#define reg_MI_DMA1DAD (*(REGType32v *)0x40000c0) +#define reg_MI_DMA1CNT (*(REGType32v *)0x40000c4) +#define reg_MI_DMA2SAD (*(REGType32v *)0x40000c8) +#define reg_MI_DMA2DAD (*(REGType32v *)0x40000cc) +#define reg_MI_DMA2CNT (*(REGType32v *)0x40000d0) +#define reg_MI_DMA3SAD (*(REGType32v *)0x40000d4) +#define reg_MI_DMA3DAD (*(REGType32v *)0x40000d8) +#define reg_MI_DMA3CNT (*(REGType32v *)0x40000dc) +#define reg_MI_DMA0_CLR_DATA (*(REGType32v *)0x40000e0) +#define reg_MI_DMA1_CLR_DATA (*(REGType32v *)0x40000e4) +#define reg_MI_DMA2_CLR_DATA (*(REGType32v *)0x40000e8) +#define reg_MI_DMA3_CLR_DATA (*(REGType32v *)0x40000ec) + +#define reg_EXI_SIODATA32 (*(REGType32v *)0x4000120) +#define reg_EXI_SIOCNT (*(REGType16v *)0x4000128) +#define reg_EXI_SIOSEL (*(REGType32v *)0x400012c) + +#define reg_PAD_KEYINPUT (*(REGType16v *)0x4000130) +#define reg_PAD_KEYCNT (*(REGType16v *)0x4000132) + +#define reg_MI_MCCNT0 (*(REGType16v *)0x40001a0) +#define reg_CARD_MASTERCNT (*(REGType8v *)0x40001a1) //? +#define reg_MI_MCD0 (*(REGType16v *)0x40001a2) +#define reg_MI_MCCNT1 (*(REGType32v *)0x40001a4) +#define reg_CARD_CNT (*(REGType32v *)0x40001a4) //? +#define reg_MI_MCCMD0 (*(REGType32v *)0x40001a8) +#define reg_CARD_CMD (*(REGType8v *)0x40001a8) //? +#define reg_MI_MCCMD1 (*(REGType32v *)0x40001ac) +#define reg_MI_EXMEMCNT (*(REGType16v *)0x4000204) + +#define reg_OS_PAUSE (*(REGType16v *)0x4000300) + +#define reg_GX_VRAMCNT (*(REGType32v *)0x4000240) +#define reg_GX_VRAMCNT_A (*(REGType8v *)0x4000240) +#define reg_GX_VRAMCNT_B (*(REGType8v *)0x4000241) +#define reg_GX_VRAMCNT_C (*(REGType8v *)0x4000242) +#define reg_GX_VRAMCNT_D (*(REGType8v *)0x4000243) +#define reg_GX_WVRAMCNT (*(REGType32v *)0x4000244) +#define reg_GX_VRAMCNT_E (*(REGType8v *)0x4000244) +#define reg_GX_VRAMCNT_F (*(REGType8v *)0x4000245) +#define reg_GX_VRAMCNT_G (*(REGType8v *)0x4000246) +#define reg_GX_VRAMCNT_WRAM (*(REGType8v *)0x4000247) +#define reg_GX_VRAM_HI_CNT (*(REGType16v *)0x4000248) +#define reg_GX_VRAMCNT_H (*(REGType8v *)0x4000248) +#define reg_GX_VRAMCNT_I (*(REGType8v *)0x4000249) + +#define reg_CP_DIVCNT (*(REGType16v *)0x4000280) + +#define REG_DIV_NUMER_ADDR 0x4000290 +#define reg_CP_DIV_NUMER (*(REGType64v *)REG_DIV_NUMER_ADDR) +#define reg_CP_DIV_NUMER_L (*(REGType32v *)REG_DIV_NUMER_ADDR) +#define reg_CP_DIV_NUMER_H (*(REGType32v *)0x4000294) +#define reg_CP_DIV_DENOM (*(REGType64v *)0x4000298) +#define reg_CP_DIV_DENOM_L (*(REGType32v *)0x4000298) +#define reg_CP_DIV_DENOM_H (*(REGType32v *)0x400029c) +#define reg_CP_DIV_RESULT (*(REGType64v *)0x40002A0) +#define reg_CP_DIV_RESULT_L (*(REGType32v *)0x40002A0) +#define reg_CP_DIV_RESULT_H (*(REGType32v *)0x40002A4) +#define reg_CP_DIVREM_RESULT (*(REGType64v *)0x40002A8) +#define reg_CP_DIVREM_RESULT_L (*(REGType32v *)0x40002A8) +#define reg_CP_DIVREM_RESULT_H (*(REGType32v *)0x40002Ac) +#define reg_CP_SQRTCNT (*(REGType16v *)0x40002B0) +#define reg_CP_SQRT_RESULT (*(REGType32v *)0x40002B4) +#define reg_CP_SQRT_PARAM (*(REGType64v *)0x40002B8) +#define reg_CP_SQRT_PARAM_L (*(REGType32v *)0x40002B8) +#define reg_CP_SQRT_PARAM_H (*(REGType32v *)0x40002Bc) + +#define reg_GX_POWCNT (*(REGType16v *)0x4000304) + +#define reg_G3X_RDLINES_COUNT (*(const REGType16v *)0x4000320) +#define reg_G3X_EDGE_COLOR_0 (*(REGType32v *)0x4000330) +#define reg_G3X_EDGE_COLOR_0_L (*(REGType16v *)0x4000330) +#define reg_G3X_EDGE_COLOR_0_H (*(REGType16v *)0x4000332) +#define reg_G3X_EDGE_COLOR_1 (*(REGType32v *)0x4000334) +#define reg_G3X_EDGE_COLOR_1_L (*(REGType16v *)0x4000334) +#define reg_G3X_EDGE_COLOR_1_H (*(REGType16v *)0x4000336) +#define reg_G3X_EDGE_COLOR_2 (*(REGType32v *)0x4000338) +#define reg_G3X_EDGE_COLOR_2_L (*(REGType16v *)0x4000338) +#define reg_G3X_EDGE_COLOR_2_H (*(REGType16v *)0x400033a) +#define reg_G3X_EDGE_COLOR_3 (*(REGType32v *)0x400033c) +#define reg_G3X_EDGE_COLOR_3_L (*(REGType16v *)0x400033c) +#define reg_G3X_EDGE_COLOR_3_H (*(REGType16v *)0x400033e) +#define reg_G3X_ALPHA_TEST_REF (*(REGType16v *)0x4000340) +#define reg_G3X_CLEAR_COLOR (*(REGType32v *)0x4000350) +#define reg_G3X_CLEAR_DEPTH (*(REGType16v *)0x4000354) +#define reg_G3X_CLRIMAGE_OFFSET (*(REGType16v *)0x4000356) +#define reg_G3X_FOG_COLOR (*(REGType32v *)0x4000358) +#define reg_G3X_FOG_OFFSET (*(REGType16v *)0x400035c) +#define reg_G3X_FOG_TABLE_0 (*(REGType32v *)0x4000360) +#define reg_G3X_FOG_TABLE_0_L (*(REGType16v *)0x4000360) +#define reg_G3X_FOG_TABLE_0_H (*(REGType16v *)0x4000362) +#define reg_G3X_FOG_TABLE_1 (*(REGType32v *)0x4000364) +#define reg_G3X_FOG_TABLE_1_L (*(REGType16v *)0x4000364) +#define reg_G3X_FOG_TABLE_1_H (*(REGType16v *)0x4000366) +#define reg_G3X_FOG_TABLE_2 (*(REGType32v *)0x4000368) +#define reg_G3X_FOG_TABLE_2_L (*(REGType16v *)0x4000368) +#define reg_G3X_FOG_TABLE_2_H (*(REGType16v *)0x400036a) +#define reg_G3X_FOG_TABLE_3 (*(REGType32v *)0x400036c) +#define reg_G3X_FOG_TABLE_3_L (*(REGType16v *)0x400036c) +#define reg_G3X_FOG_TABLE_3_H (*(REGType16v *)0x400036e) +#define reg_G3X_FOG_TABLE_4 (*(REGType32v *)0x4000370) +#define reg_G3X_FOG_TABLE_4_L (*(REGType16v *)0x4000370) +#define reg_G3X_FOG_TABLE_4_H (*(REGType16v *)0x4000372) +#define reg_G3X_FOG_TABLE_5 (*(REGType32v *)0x4000374) +#define reg_G3X_FOG_TABLE_5_L (*(REGType16v *)0x4000374) +#define reg_G3X_FOG_TABLE_5_H (*(REGType16v *)0x4000376) +#define reg_G3X_FOG_TABLE_6 (*(REGType32v *)0x4000378) +#define reg_G3X_FOG_TABLE_6_L (*(REGType16v *)0x4000378) +#define reg_G3X_FOG_TABLE_6_H (*(REGType16v *)0x400037a) +#define reg_G3X_FOG_TABLE_7 (*(REGType32v *)0x400037c) +#define reg_G3X_FOG_TABLE_7_L (*(REGType16v *)0x400037c) +#define reg_G3X_FOG_TABLE_7_H (*(REGType16v *)0x400037e) +#define reg_G3X_TOON_TABLE_0 (*(REGType32v *)0x4000380) +#define reg_G3X_TOON_TABLE_0_L (*(REGType16v *)0x4000380) +#define reg_G3X_TOON_TABLE_0_H (*(REGType16v *)0x4000382) +#define reg_G3X_TOON_TABLE_1 (*(REGType32v *)0x4000384) +#define reg_G3X_TOON_TABLE_1_L (*(REGType16v *)0x4000384) +#define reg_G3X_TOON_TABLE_1_H (*(REGType16v *)0x4000386) +#define reg_G3X_TOON_TABLE_2 (*(REGType32v *)0x4000388) +#define reg_G3X_TOON_TABLE_2_L (*(REGType16v *)0x4000388) +#define reg_G3X_TOON_TABLE_2_H (*(REGType16v *)0x400038a) +#define reg_G3X_TOON_TABLE_3 (*(REGType32v *)0x400038c) +#define reg_G3X_TOON_TABLE_3_L (*(REGType16v *)0x400038c) +#define reg_G3X_TOON_TABLE_3_H (*(REGType16v *)0x400038e) +#define reg_G3X_TOON_TABLE_4 (*(REGType32v *)0x4000390) +#define reg_G3X_TOON_TABLE_4_L (*(REGType16v *)0x4000390) +#define reg_G3X_TOON_TABLE_4_H (*(REGType16v *)0x4000392) +#define reg_G3X_TOON_TABLE_5 (*(REGType32v *)0x4000394) +#define reg_G3X_TOON_TABLE_5_L (*(REGType16v *)0x4000394) +#define reg_G3X_TOON_TABLE_5_H (*(REGType16v *)0x4000396) +#define reg_G3X_TOON_TABLE_7 (*(REGType32v *)0x400039c) +#define reg_G3X_TOON_TABLE_7_L (*(REGType16v *)0x400039c) +#define reg_G3X_TOON_TABLE_7_H (*(REGType16v *)0x400039e) +#define reg_G3X_TOON_TABLE_8 (*(REGType32v *)0x40003a0) +#define reg_G3X_TOON_TABLE_8_L (*(REGType16v *)0x40003a0) +#define reg_G3X_TOON_TABLE_8_H (*(REGType16v *)0x40003a2) +#define reg_G3X_TOON_TABLE_9 (*(REGType32v *)0x40003a4) +#define reg_G3X_TOON_TABLE_9_L (*(REGType16v *)0x40003a4) +#define reg_G3X_TOON_TABLE_9_H (*(REGType16v *)0x40003a6) +#define reg_G3X_TOON_TABLE_10 (*(REGType32v *)0x40003a8) +#define reg_G3X_TOON_TABLE_10_L (*(REGType16v *)0x40003a8) +#define reg_G3X_TOON_TABLE_10_H (*(REGType16v *)0x40003aa) +#define reg_G3X_TOON_TABLE_11 (*(REGType32v *)0x40003ac) +#define reg_G3X_TOON_TABLE_11_L (*(REGType16v *)0x40003ac) +#define reg_G3X_TOON_TABLE_11_H (*(REGType16v *)0x40003ae) +#define reg_G3X_TOON_TABLE_12 (*(REGType32v *)0x40003b0) +#define reg_G3X_TOON_TABLE_12_L (*(REGType16v *)0x40003b0) +#define reg_G3X_TOON_TABLE_12_H (*(REGType16v *)0x40003b2) +#define reg_G3X_TOON_TABLE_13 (*(REGType32v *)0x40003b4) +#define reg_G3X_TOON_TABLE_13_L (*(REGType16v *)0x40003b4) +#define reg_G3X_TOON_TABLE_13_H (*(REGType16v *)0x40003b6) +#define reg_G3X_TOON_TABLE_14 (*(REGType32v *)0x40003b8) +#define reg_G3X_TOON_TABLE_14_L (*(REGType16v *)0x40003b8) +#define reg_G3X_TOON_TABLE_14_H (*(REGType16v *)0x40003ba) +#define reg_G3X_TOON_TABLE_15 (*(REGType32v *)0x40003bc) +#define reg_G3X_TOON_TABLE_15_L (*(REGType16v *)0x40003bc) +#define reg_G3X_TOON_TABLE_15_H (*(REGType16v *)0x40003be) +#define reg_G3X_GXFIFO (*(REGType32v *)0x4000400) + +#define reg_G3_MTX_MODE (*(REGType32v *)0x4000440) +#define reg_G3_MTX_PUSH (*(REGType32v *)0x4000444) +#define reg_G3_MTX_POP (*(REGType32v *)0x4000448) +#define reg_G3_MTX_STORE (*(REGType32v *)0x400044c) +#define reg_G3_MTX_RESTORE (*(REGType32v *)0x4000450) +#define reg_G3_MTX_IDENTITY (*(REGType32v *)0x4000454) +#define reg_G3_MTX_LOAD_4x4 (*(REGType32v *)0x4000458) +#define reg_G3_MTX_LOAD_4x3 (*(REGType32v *)0x400045c) +#define reg_G3_MTX_MULT_4x4 (*(REGType32v *)0x4000460) +#define reg_G3_MTX_MULT_4x3 (*(REGType32v *)0x4000464) +#define reg_G3_MTX_MULT_3x3 (*(REGType32v *)0x4000468) +#define reg_G3_MTX_SCALE (*(REGType32v *)0x400046c) +#define reg_G3_MTX_TRANS (*(REGType32v *)0x4000470) +#define reg_G3_COLOR (*(REGType32v *)0x4000480) +#define reg_G3_NORMAL (*(REGType32v *)0x4000484) +#define reg_G3_TEXCOORD (*(REGType32v *)0x4000488) +#define reg_G3_VTX_16 (*(REGType32v *)0x400048c) +#define reg_G3_VTX_10 (*(REGType32v *)0x4000490) +#define reg_G3_VTX_XY (*(REGType32v *)0x4000494) +#define reg_G3_VTX_XZ (*(REGType32v *)0x4000498) +#define reg_G3_VTX_YZ (*(REGType32v *)0x400049c) +#define reg_G3_VTX_DIFF (*(REGType32v *)0x40004a0) +#define reg_G3_POLYGON_ATTR (*(REGType32v *)0x40004a4) +#define reg_G3_TEXIMAGE_PARAM (*(REGType32v *)0x40004a8) +#define reg_G3_TEXPLTT_BASE (*(REGType32v *)0x40004ac) +#define reg_G3_DIF_AMB (*(REGType32v *)0x40004c0) +#define reg_G3_SPE_EMI (*(REGType32v *)0x40004c4) +#define reg_G3_LIGHT_VECTOR (*(REGType32v *)0x40004c8) +#define reg_G3_LIGHT_COLOR (*(REGType32v *)0x40004cc) +#define reg_G3_SHININESS (*(REGType32v *)0x40004d0) +#define reg_G3_BEGIN_VTXS (*(REGType32v *)0x4000500) +#define reg_G3_END_VTXS (*(REGType32v *)0x4000504) +#define reg_G3_SWAP_BUFFERS (*(REGType32v *)0x4000540) +#define reg_G3_VIEWPORT (*(REGType32v *)0x4000580) +#define reg_G3_BOX_TEST (*(REGType32v *)0x40005c0) +#define reg_G3_POS_TEST (*(REGType32v *)0x40005c4) +#define reg_G3_VEC_TEST (*(REGType32v *)0x40005c8) + +#define reg_G3X_GXSTAT (*(REGType32v *)0x4000600) +#define reg_G3X_LISTRAM_COUNT (*(REGType16v *)0x4000604) +#define reg_G3X_VTXRAM_COUNT (*(REGType16v *)0x4000606) +#define reg_G3X_DISP_1DOT_DEPTH (*(REGType16v *)0x4000610) +#define reg_G3X_POS_RESULT_X (*(const REGType32v *)0x4000620) +#define reg_G3X_POS_RESULT_Y (*(const REGType32v *)0x4000624) +#define reg_G3X_POS_RESULT_Z (*(const REGType32v *)0x4000628) +#define reg_G3X_POS_RESULT_W (*(const REGType32v *)0x400062c) +#define reg_G3X_VEC_RESULT_X (*(const REGType16v *)0x4000630) +#define reg_G3X_VEC_RESULT_Y (*(const REGType16v *)0x4000632) +#define reg_G3X_VEC_RESULT_Z (*(const REGType16v *)0x4000634) +#define reg_G3X_CLIPMTX_RESULT_0 (*(const REGType32v *)0x4000640) +#define reg_G3X_CLIPMTX_RESULT_1 (*(const REGType32v *)0x4000644) +#define reg_G3X_CLIPMTX_RESULT_2 (*(const REGType32v *)0x4000648) +#define reg_G3X_CLIPMTX_RESULT_3 (*(const REGType32v *)0x400064c) +#define reg_G3X_CLIPMTX_RESULT_4 (*(const REGType32v *)0x4000650) +#define reg_G3X_CLIPMTX_RESULT_5 (*(const REGType32v *)0x4000654) +#define reg_G3X_CLIPMTX_RESULT_6 (*(const REGType32v *)0x4000658) +#define reg_G3X_CLIPMTX_RESULT_7 (*(const REGType32v *)0x400065c) +#define reg_G3X_CLIPMTX_RESULT_8 (*(const REGType32v *)0x4000660) +#define reg_G3X_CLIPMTX_RESULT_9 (*(const REGType32v *)0x4000664) +#define reg_G3X_CLIPMTX_RESULT_10 (*(const REGType32v *)0x4000668) +#define reg_G3X_CLIPMTX_RESULT_11 (*(const REGType32v *)0x400066c) +#define reg_G3X_CLIPMTX_RESULT_12 (*(const REGType32v *)0x4000670) +#define reg_G3X_CLIPMTX_RESULT_13 (*(const REGType32v *)0x4000674) +#define reg_G3X_CLIPMTX_RESULT_14 (*(const REGType32v *)0x4000678) +#define reg_G3X_CLIPMTX_RESULT_15 (*(const REGType32v *)0x400067c) +#define reg_G3X_VECMTX_RESULT_0 (*(const REGType32v *)0x4000680) +#define reg_G3X_VECMTX_RESULT_1 (*(const REGType32v *)0x4000684) +#define reg_G3X_VECMTX_RESULT_2 (*(const REGType32v *)0x4000688) +#define reg_G3X_VECMTX_RESULT_3 (*(const REGType32v *)0x400068c) +#define reg_G3X_VECMTX_RESULT_4 (*(const REGType32v *)0x4000690) +#define reg_G3X_VECMTX_RESULT_5 (*(const REGType32v *)0x4000694) +#define reg_G3X_VECMTX_RESULT_6 (*(const REGType32v *)0x4000698) +#define reg_G3X_VECMTX_RESULT_7 (*(const REGType32v *)0x400069c) +#define reg_G3X_VECMTX_RESULT_8 (*(const REGType32v *)0x40006a0) + +#define reg_GXS_DB_DISPCNT (*(REGType32v *)0x4001000) + +#define reg_G2S_DB_BG0CNT (*(REGType16v *)0x4001008) +#define reg_G2S_DB_BG1CNT (*(REGType16v *)0x400100a) +#define reg_G2S_DB_BG2CNT (*(REGType16v *)0x400100c) +#define reg_G2S_DB_BG3CNT (*(REGType16v *)0x400100e) +#define reg_G2S_DB_BG0OFS (*(REGType32v *)0x4001010) +#define reg_G2S_DB_BG0HOFS (*(REGType16v *)0x4001010) +#define reg_G2S_DB_BG0VOFS (*(REGType16v *)0x4001012) +#define reg_G2S_DB_BG1OFS (*(REGType32v *)0x4001014) +#define reg_G2S_DB_BG1HOFS (*(REGType16v *)0x4001014) +#define reg_G2S_DB_BG1VOFS (*(REGType16v *)0x4001016) +#define reg_G2S_DB_BG2OFS (*(REGType32v *)0x4001018) +#define reg_G2S_DB_BG2HOFS (*(REGType16v *)0x4001018) +#define reg_G2S_DB_BG2VOFS (*(REGType16v *)0x400101a) +#define reg_G2S_DB_BG3OFS (*(REGType32v *)0x400101c) +#define reg_G2S_DB_BG3HOFS (*(REGType16v *)0x400101c) +#define reg_G2S_DB_BG3VOFS (*(REGType16v *)0x400101e) +#define reg_G2S_DB_BG2PA (*(REGType16v *)0x4001020) +#define reg_G2S_DB_BG2PB (*(REGType16v *)0x4001022) +#define reg_G2S_DB_BG2PC (*(REGType16v *)0x4001024) +#define reg_G2S_DB_BG2PD (*(REGType16v *)0x4001026) +#define reg_G2S_DB_BG2X (*(REGType32v *)0x4001028) +#define reg_G2S_DB_BG2Y (*(REGType32v *)0x400102c) +#define reg_G2S_DB_BG3PA (*(REGType16v *)0x4001030) +#define reg_G2S_DB_BG3PB (*(REGType16v *)0x4001032) +#define reg_G2S_DB_BG3PC (*(REGType16v *)0x4001034) +#define reg_G2S_DB_BG3PD (*(REGType16v *)0x4001036) +#define reg_G2S_DB_BG3X (*(REGType32v *)0x4001038) +#define reg_G2S_DB_BG3Y (*(REGType32v *)0x400103c) +#define reg_G2S_DB_WIN0H (*(REGType16v *)0x4001040) +#define reg_G2S_DB_WIN1H (*(REGType16v *)0x4001042) +#define reg_G2S_DB_WIN0V (*(REGType16v *)0x4001044) +#define reg_G2S_DB_WIN1V (*(REGType16v *)0x4001046) +#define reg_G2S_DB_WININ (*(REGType16v *)0x4001048) +#define reg_G2S_DB_WINOUT (*(REGType16v *)0x400104a) +#define reg_G2S_DB_MOSAIC (*(REGType16v *)0x400104c) +#define reg_G2S_DB_BLDCNT (*(REGType16v *)0x4001050) +#define reg_G2S_DB_BLDALPHA (*(REGType16v *)0x4001052) +#define reg_G2S_DB_BLDY (*(REGType16v *)0x4001054) + +#define reg_GXS_DB_MASTER_BRIGHT (*(REGType16v *)0x400106c) + +#define reg_MI_MCD1 (*(REGType32v *)0x4100010) +#define reg_CARD_DATA (*(REGType32v *)0x4100010) //? + +#define REG_OS_IE_VB_SHIFT 0 +#define REG_OS_IE_HB_SHIFT 1 +#define REG_OS_IE_VE_SHIFT 2 +#define REG_OS_IE_T0_SHIFT 3 +#define REG_OS_IE_T1_SHIFT 4 +#define REG_OS_IE_T2_SHIFT 5 +#define REG_OS_IE_T3_SHIFT 6 +#define REG_OS_IE_D0_SHIFT 8 +#define REG_OS_IE_D1_SHIFT 9 +#define REG_OS_IE_D2_SHIFT 10 +#define REG_OS_IE_D3_SHIFT 11 +#define REG_OS_IE_K_SHIFT 12 +#define REG_OS_IE_I_D_SHIFT 13 +#define REG_OS_IE_A7_SHIFT 16 +#define REG_OS_IE_IFE_SHIFT 17 +#define REG_OS_IE_IFN_SHIFT 18 +#define REG_OS_IE_MC_SHIFT 19 +#define REG_OS_IE_MI_SHIFT 20 +#define REG_OS_IE_PM_SHIFT 22 +#define REG_OS_IE_SPI_SHIFT 23 +#define REG_OS_IE_WL_SHIFT 24 + +#define REG_PAD_KEYINPUT_L_SHIFT 9 +#define REG_PAD_KEYINPUT_L_SIZE 1 +#define REG_PAD_KEYINPUT_L_MASK 0x0200 + +#define REG_PAD_KEYINPUT_R_SHIFT 8 +#define REG_PAD_KEYINPUT_R_SIZE 1 +#define REG_PAD_KEYINPUT_R_MASK 0x0100 + +#define REG_PAD_KEYINPUT_DOWN_SHIFT 7 +#define REG_PAD_KEYINPUT_DOWN_SIZE 1 +#define REG_PAD_KEYINPUT_DOWN_MASK 0x0080 + +#define REG_PAD_KEYINPUT_UP_SHIFT 6 +#define REG_PAD_KEYINPUT_UP_SIZE 1 +#define REG_PAD_KEYINPUT_UP_MASK 0x0040 + +#define REG_PAD_KEYINPUT_LEFT_SHIFT 5 +#define REG_PAD_KEYINPUT_LEFT_SIZE 1 +#define REG_PAD_KEYINPUT_LEFT_MASK 0x0020 + +#define REG_PAD_KEYINPUT_RIGHT_SHIFT 4 +#define REG_PAD_KEYINPUT_RIGHT_SIZE 1 +#define REG_PAD_KEYINPUT_RIGHT_MASK 0x0010 + +#define REG_PAD_KEYINPUT_START_SHIFT 3 +#define REG_PAD_KEYINPUT_START_SIZE 1 +#define REG_PAD_KEYINPUT_START_MASK 0x0008 + +#define REG_PAD_KEYINPUT_SEL_SHIFT 2 +#define REG_PAD_KEYINPUT_SEL_SIZE 1 +#define REG_PAD_KEYINPUT_SEL_MASK 0x0004 + +#define REG_PAD_KEYINPUT_B_SHIFT 1 +#define REG_PAD_KEYINPUT_B_SIZE 1 +#define REG_PAD_KEYINPUT_B_MASK 0x0002 + +#define REG_PAD_KEYINPUT_A_SHIFT 0 +#define REG_PAD_KEYINPUT_A_SIZE 1 +#define REG_PAD_KEYINPUT_A_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_PAD_KEYINPUT_FIELD( l, r, down, up, left, right, start, sel, b, a ) \ + (u16)( \ + ((u32)(l) << REG_PAD_KEYINPUT_L_SHIFT) | \ + ((u32)(r) << REG_PAD_KEYINPUT_R_SHIFT) | \ + ((u32)(down) << REG_PAD_KEYINPUT_DOWN_SHIFT) | \ + ((u32)(up) << REG_PAD_KEYINPUT_UP_SHIFT) | \ + ((u32)(left) << REG_PAD_KEYINPUT_LEFT_SHIFT) | \ + ((u32)(right) << REG_PAD_KEYINPUT_RIGHT_SHIFT) | \ + ((u32)(start) << REG_PAD_KEYINPUT_START_SHIFT) | \ + ((u32)(sel) << REG_PAD_KEYINPUT_SEL_SHIFT) | \ + ((u32)(b) << REG_PAD_KEYINPUT_B_SHIFT) | \ + ((u32)(a) << REG_PAD_KEYINPUT_A_SHIFT)) +#endif + +#define REG_PAD_KEYCNT_LOGIC_SHIFT 15 +#define REG_PAD_KEYCNT_LOGIC_SIZE 1 +#define REG_PAD_KEYCNT_LOGIC_MASK 0x8000 + +#define REG_PAD_KEYCNT_INTR_SHIFT 14 +#define REG_PAD_KEYCNT_INTR_SIZE 1 +#define REG_PAD_KEYCNT_INTR_MASK 0x4000 + +#define REG_PAD_KEYCNT_L_SHIFT 9 +#define REG_PAD_KEYCNT_L_SIZE 1 +#define REG_PAD_KEYCNT_L_MASK 0x0200 + +#define REG_PAD_KEYCNT_R_SHIFT 8 +#define REG_PAD_KEYCNT_R_SIZE 1 +#define REG_PAD_KEYCNT_R_MASK 0x0100 + +#define REG_PAD_KEYCNT_DOWN_SHIFT 7 +#define REG_PAD_KEYCNT_DOWN_SIZE 1 +#define REG_PAD_KEYCNT_DOWN_MASK 0x0080 + +#define REG_PAD_KEYCNT_UP_SHIFT 6 +#define REG_PAD_KEYCNT_UP_SIZE 1 +#define REG_PAD_KEYCNT_UP_MASK 0x0040 + +#define REG_PAD_KEYCNT_LEFT_SHIFT 5 +#define REG_PAD_KEYCNT_LEFT_SIZE 1 +#define REG_PAD_KEYCNT_LEFT_MASK 0x0020 + +#define REG_PAD_KEYCNT_RIGHT_SHIFT 4 +#define REG_PAD_KEYCNT_RIGHT_SIZE 1 +#define REG_PAD_KEYCNT_RIGHT_MASK 0x0010 + +#define REG_PAD_KEYCNT_START_SHIFT 3 +#define REG_PAD_KEYCNT_START_SIZE 1 +#define REG_PAD_KEYCNT_START_MASK 0x0008 + +#define REG_PAD_KEYCNT_SEL_SHIFT 2 +#define REG_PAD_KEYCNT_SEL_SIZE 1 +#define REG_PAD_KEYCNT_SEL_MASK 0x0004 + +#define REG_PAD_KEYCNT_B_SHIFT 1 +#define REG_PAD_KEYCNT_B_SIZE 1 +#define REG_PAD_KEYCNT_B_MASK 0x0002 + +#define REG_PAD_KEYCNT_A_SHIFT 0 +#define REG_PAD_KEYCNT_A_SIZE 1 +#define REG_PAD_KEYCNT_A_MASK 0x0001 + +#define REG_G2_WINOUT_OBJWININ_SHIFT 8 +#define REG_G2_WINOUT_OBJWININ_SIZE 6 +#define REG_G2_WINOUT_OBJWININ_MASK 0x3f00 + +#define REG_G2_WINOUT_WINOUT_SHIFT 0 +#define REG_G2_WINOUT_WINOUT_SIZE 6 +#define REG_G2_WINOUT_WINOUT_MASK 0x003f + +#define REG_G2_WINOUT_FIELD( objwinin, winout ) \ + (u16)( \ + ((u32)(objwinin) << REG_G2_WINOUT_OBJWININ_SHIFT) | \ + ((u32)(winout) << REG_G2_WINOUT_WINOUT_SHIFT)) + +#ifndef SDK_ASM +#define REG_PAD_KEYCNT_FIELD( logic, intr, l, r, down, up, left, right, start, sel, b, a ) \ + (u16)( \ + ((u32)(logic) << REG_PAD_KEYCNT_LOGIC_SHIFT) | \ + ((u32)(intr) << REG_PAD_KEYCNT_INTR_SHIFT) | \ + ((u32)(l) << REG_PAD_KEYCNT_L_SHIFT) | \ + ((u32)(r) << REG_PAD_KEYCNT_R_SHIFT) | \ + ((u32)(down) << REG_PAD_KEYCNT_DOWN_SHIFT) | \ + ((u32)(up) << REG_PAD_KEYCNT_UP_SHIFT) | \ + ((u32)(left) << REG_PAD_KEYCNT_LEFT_SHIFT) | \ + ((u32)(right) << REG_PAD_KEYCNT_RIGHT_SHIFT) | \ + ((u32)(start) << REG_PAD_KEYCNT_START_SHIFT) | \ + ((u32)(sel) << REG_PAD_KEYCNT_SEL_SHIFT) | \ + ((u32)(b) << REG_PAD_KEYCNT_B_SHIFT) | \ + ((u32)(a) << REG_PAD_KEYCNT_A_SHIFT)) +#endif + +#define REG_GX_POWCNT_GE_SHIFT 3 +#define REG_GX_POWCNT_GE_SIZE 1 +#define REG_GX_POWCNT_GE_MASK 0x0008 + +#define REG_GX_POWCNT_RE_SHIFT 2 +#define REG_GX_POWCNT_RE_SIZE 1 +#define REG_GX_POWCNT_RE_MASK 0x0004 + +#define REG_GX_POWCNT_E2DG_SHIFT 1 +#define REG_GX_POWCNT_E2DG_SIZE 1 +#define REG_GX_POWCNT_E2DG_MASK 0x0002 + +#define REG_GX_POWCNT_LCD_SHIFT 0 +#define REG_GX_POWCNT_LCD_SIZE 1 +#define REG_GX_POWCNT_LCD_MASK 0x0001 + +#define REG_GX_POWCNT_LCDB_SHIFT 8 +#define REG_GX_POWCNT_LCDB_SIZE 1 +#define REG_GX_POWCNT_LCDB_MASK 0x0100 + +#define REG_GX_POWCNT_E2DGB_SHIFT 9 +#define REG_GX_POWCNT_E2DGB_SIZE 1 +#define REG_GX_POWCNT_E2DGB_MASK 0x0200 + +#define REG_GX_POWCNT_DSEL_SHIFT 15 +#define REG_GX_POWCNT_DSEL_SIZE 1 +#define REG_GX_POWCNT_DSEL_MASK 0x8000 + +// GX_DISPCNT +#define REG_GX_DISPCNT_O_SHIFT 31 +#define REG_GX_DISPCNT_O_SIZE 1 +#define REG_GX_DISPCNT_O_MASK 0x80000000 + +#define REG_GX_DISPCNT_BG_SHIFT 30 +#define REG_GX_DISPCNT_BG_SIZE 1 +#define REG_GX_DISPCNT_BG_MASK 0x40000000 + +#define REG_GX_DISPCNT_BGSCREENOFFSET_SHIFT 27 +#define REG_GX_DISPCNT_BGSCREENOFFSET_SIZE 3 +#define REG_GX_DISPCNT_BGSCREENOFFSET_MASK 0x38000000 + +#define REG_GX_DISPCNT_BGCHAROFFSET_SHIFT 24 +#define REG_GX_DISPCNT_BGCHAROFFSET_SIZE 3 +#define REG_GX_DISPCNT_BGCHAROFFSET_MASK 0x07000000 + +#define REG_GX_DISPCNT_OH_SHIFT 23 +#define REG_GX_DISPCNT_OH_SIZE 1 +#define REG_GX_DISPCNT_OH_MASK 0x00800000 + +#define REG_GX_DISPCNT_EXOBJ_SHIFT 20 +#define REG_GX_DISPCNT_EXOBJ_SIZE 3 +#define REG_GX_DISPCNT_EXOBJ_MASK 0x00700000 + +#define REG_GX_DISPCNT_VRAM_SHIFT 18 +#define REG_GX_DISPCNT_VRAM_SIZE 2 +#define REG_GX_DISPCNT_VRAM_MASK 0x000c0000 + +#define REG_GX_DISPCNT_MODE_SHIFT 16 +#define REG_GX_DISPCNT_MODE_SIZE 2 +#define REG_GX_DISPCNT_MODE_MASK 0x00030000 + +#define REG_GX_DISPCNT_OW_SHIFT 15 +#define REG_GX_DISPCNT_OW_SIZE 1 +#define REG_GX_DISPCNT_OW_MASK 0x00008000 + +#define REG_GX_DISPCNT_W1_SHIFT 14 +#define REG_GX_DISPCNT_W1_SIZE 1 +#define REG_GX_DISPCNT_W1_MASK 0x00004000 + +#define REG_GX_DISPCNT_W0_SHIFT 13 +#define REG_GX_DISPCNT_W0_SIZE 1 +#define REG_GX_DISPCNT_W0_MASK 0x00002000 + +#define REG_GX_DISPCNT_DISPLAY_SHIFT 8 +#define REG_GX_DISPCNT_DISPLAY_SIZE 5 +#define REG_GX_DISPCNT_DISPLAY_MASK 0x00001f00 + +#define REG_GX_DISPCNT_BLANK_SHIFT 7 +#define REG_GX_DISPCNT_BLANK_SIZE 1 +#define REG_GX_DISPCNT_BLANK_MASK 0x00000080 + +#define REG_GX_DISPCNT_OBJMAP_SHIFT 4 +#define REG_GX_DISPCNT_OBJMAP_SIZE 3 +#define REG_GX_DISPCNT_OBJMAP_MASK 0x00000070 + +#define REG_GX_DISPCNT_BG02D3D_SHIFT 3 +#define REG_GX_DISPCNT_BG02D3D_SIZE 1 +#define REG_GX_DISPCNT_BG02D3D_MASK 0x00000008 + +#define REG_GX_DISPCNT_BGMODE_SHIFT 0 +#define REG_GX_DISPCNT_BGMODE_SIZE 3 +#define REG_GX_DISPCNT_BGMODE_MASK 0x00000007 + +#define REG_GX_DISPCNT_OBJMAP_CH_SHIFT 4 +#define REG_GX_DISPCNT_OBJMAP_CH_SIZE 1 +#define REG_GX_DISPCNT_OBJMAP_CH_MASK 0x00000010 + +#define REG_GX_DISPCNT_OBJMAP_BM_SHIFT 5 +#define REG_GX_DISPCNT_OBJMAP_BM_SIZE 2 +#define REG_GX_DISPCNT_OBJMAP_BM_MASK 0x00000060 + +#define REG_GX_DISPCNT_EXOBJ_CH_SHIFT 20 +#define REG_GX_DISPCNT_EXOBJ_CH_SIZE 2 +#define REG_GX_DISPCNT_EXOBJ_CH_MASK 0x00300000 + +#define REG_GX_DISPCNT_EXOBJ_BM_SHIFT 22 +#define REG_GX_DISPCNT_EXOBJ_BM_SIZE 1 +#define REG_GX_DISPCNT_EXOBJ_BM_MASK 0x00400000 + +// GXS_DB_DISPCNT +#define REG_GXS_DB_DISPCNT_O_SHIFT 31 +#define REG_GXS_DB_DISPCNT_O_SIZE 1 +#define REG_GXS_DB_DISPCNT_O_MASK 0x80000000 + +#define REG_GXS_DB_DISPCNT_BG_SHIFT 30 +#define REG_GXS_DB_DISPCNT_BG_SIZE 1 +#define REG_GXS_DB_DISPCNT_BG_MASK 0x40000000 + +#define REG_GXS_DB_DISPCNT_OH_SHIFT 23 +#define REG_GXS_DB_DISPCNT_OH_SIZE 1 +#define REG_GXS_DB_DISPCNT_OH_MASK 0x00800000 + +#define REG_GXS_DB_DISPCNT_EXOBJ_SHIFT 20 +#define REG_GXS_DB_DISPCNT_EXOBJ_SIZE 2 +#define REG_GXS_DB_DISPCNT_EXOBJ_MASK 0x00300000 + +#define REG_GXS_DB_DISPCNT_MODE_SHIFT 16 +#define REG_GXS_DB_DISPCNT_MODE_SIZE 1 +#define REG_GXS_DB_DISPCNT_MODE_MASK 0x00010000 + +#define REG_GXS_DB_DISPCNT_OW_SHIFT 15 +#define REG_GXS_DB_DISPCNT_OW_SIZE 1 +#define REG_GXS_DB_DISPCNT_OW_MASK 0x00008000 + +#define REG_GXS_DB_DISPCNT_W1_SHIFT 14 +#define REG_GXS_DB_DISPCNT_W1_SIZE 1 +#define REG_GXS_DB_DISPCNT_W1_MASK 0x00004000 + +#define REG_GXS_DB_DISPCNT_W0_SHIFT 13 +#define REG_GXS_DB_DISPCNT_W0_SIZE 1 +#define REG_GXS_DB_DISPCNT_W0_MASK 0x00002000 + +#define REG_GXS_DB_DISPCNT_DISPLAY_SHIFT 8 +#define REG_GXS_DB_DISPCNT_DISPLAY_SIZE 5 +#define REG_GXS_DB_DISPCNT_DISPLAY_MASK 0x00001f00 + +#define REG_GXS_DB_DISPCNT_BLANK_SHIFT 7 +#define REG_GXS_DB_DISPCNT_BLANK_SIZE 1 +#define REG_GXS_DB_DISPCNT_BLANK_MASK 0x00000080 + +#define REG_GXS_DB_DISPCNT_OBJMAP_SHIFT 4 +#define REG_GXS_DB_DISPCNT_OBJMAP_SIZE 3 +#define REG_GXS_DB_DISPCNT_OBJMAP_MASK 0x00000070 + +#define REG_GXS_DB_DISPCNT_BGMODE_SHIFT 0 +#define REG_GXS_DB_DISPCNT_BGMODE_SIZE 3 +#define REG_GXS_DB_DISPCNT_BGMODE_MASK 0x00000007 + +#define REG_GXS_DB_DISPCNT_OBJMAP_CH_SHIFT 4 +#define REG_GXS_DB_DISPCNT_OBJMAP_CH_SIZE 1 +#define REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK 0x00000010 + +#define REG_GXS_DB_DISPCNT_OBJMAP_BM_SHIFT 5 +#define REG_GXS_DB_DISPCNT_OBJMAP_BM_SIZE 2 +#define REG_GXS_DB_DISPCNT_OBJMAP_BM_MASK 0x00000060 + +#define REG_GXS_DB_DISPCNT_EXOBJ_CH_SHIFT 20 +#define REG_GXS_DB_DISPCNT_EXOBJ_CH_SIZE 2 +#define REG_GXS_DB_DISPCNT_EXOBJ_CH_MASK 0x00300000 + +// MASTER BRIGHT +#define REG_GX_MASTER_BRIGHT_E_MOD_SHIFT 14 +#define REG_GX_MASTER_BRIGHT_E_MOD_SIZE 2 +#define REG_GX_MASTER_BRIGHT_E_MOD_MASK 0xc000 + +#define REG_GX_MASTER_BRIGHT_E_VALUE_SHIFT 0 +#define REG_GX_MASTER_BRIGHT_E_VALUE_SIZE 5 +#define REG_GX_MASTER_BRIGHT_E_VALUE_MASK 0x001f + +// DISPSTAT +#define REG_GX_DISPSTAT_VCOUNTER_SHIFT 7 +#define REG_GX_DISPSTAT_VCOUNTER_SIZE 9 +#define REG_GX_DISPSTAT_VCOUNTER_MASK 0xff80 + +#define REG_GX_DISPSTAT_VQI_SHIFT 5 +#define REG_GX_DISPSTAT_VQI_SIZE 1 +#define REG_GX_DISPSTAT_VQI_MASK 0x0020 + +#define REG_GX_DISPSTAT_HBI_SHIFT 4 +#define REG_GX_DISPSTAT_HBI_SIZE 1 +#define REG_GX_DISPSTAT_HBI_MASK 0x0010 + +#define REG_GX_DISPSTAT_VBI_SHIFT 3 +#define REG_GX_DISPSTAT_VBI_SIZE 1 +#define REG_GX_DISPSTAT_VBI_MASK 0x0008 + +#define REG_GX_DISPSTAT_LYC_SHIFT 2 +#define REG_GX_DISPSTAT_LYC_SIZE 1 +#define REG_GX_DISPSTAT_LYC_MASK 0x0004 + +#define REG_GX_DISPSTAT_HBLK_SHIFT 1 +#define REG_GX_DISPSTAT_HBLK_SIZE 1 +#define REG_GX_DISPSTAT_HBLK_MASK 0x0002 + +#define REG_GX_DISPSTAT_VBLK_SHIFT 0 +#define REG_GX_DISPSTAT_VBLK_SIZE 1 +#define REG_GX_DISPSTAT_VBLK_MASK 0x0001 + +// G2_BG0CNT +#define REG_G2_BG0CNT_SCREENSIZE_SHIFT 14 +#define REG_G2_BG0CNT_SCREENSIZE_SIZE 2 +#define REG_G2_BG0CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2_BG0CNT_BGPLTTSLOT_SHIFT 13 +#define REG_G2_BG0CNT_BGPLTTSLOT_SIZE 1 +#define REG_G2_BG0CNT_BGPLTTSLOT_MASK 0x2000 + +#define REG_G2_BG0CNT_SCREENBASE_SHIFT 8 +#define REG_G2_BG0CNT_SCREENBASE_SIZE 5 +#define REG_G2_BG0CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2_BG0CNT_COLORMODE_SHIFT 7 +#define REG_G2_BG0CNT_COLORMODE_SIZE 1 +#define REG_G2_BG0CNT_COLORMODE_MASK 0x0080 + +#define REG_G2_BG0CNT_MOSAIC_SHIFT 6 +#define REG_G2_BG0CNT_MOSAIC_SIZE 1 +#define REG_G2_BG0CNT_MOSAIC_MASK 0x0040 + +#define REG_G2_BG0CNT_CHARBASE_SHIFT 2 +#define REG_G2_BG0CNT_CHARBASE_SIZE 4 +#define REG_G2_BG0CNT_CHARBASE_MASK 0x003c + +#define REG_G2_BG0CNT_PRIORITY_SHIFT 0 +#define REG_G2_BG0CNT_PRIORITY_SIZE 2 +#define REG_G2_BG0CNT_PRIORITY_MASK 0x0003 + +// G2_BG1CNT +#define REG_G2_BG1CNT_SCREENSIZE_SHIFT 14 +#define REG_G2_BG1CNT_SCREENSIZE_SIZE 2 +#define REG_G2_BG1CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2_BG1CNT_BGPLTTSLOT_SHIFT 13 +#define REG_G2_BG1CNT_BGPLTTSLOT_SIZE 1 +#define REG_G2_BG1CNT_BGPLTTSLOT_MASK 0x2000 + +#define REG_G2_BG1CNT_SCREENBASE_SHIFT 8 +#define REG_G2_BG1CNT_SCREENBASE_SIZE 5 +#define REG_G2_BG1CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2_BG1CNT_COLORMODE_SHIFT 7 +#define REG_G2_BG1CNT_COLORMODE_SIZE 1 +#define REG_G2_BG1CNT_COLORMODE_MASK 0x0080 + +#define REG_G2_BG1CNT_MOSAIC_SHIFT 6 +#define REG_G2_BG1CNT_MOSAIC_SIZE 1 +#define REG_G2_BG1CNT_MOSAIC_MASK 0x0040 + +#define REG_G2_BG1CNT_CHARBASE_SHIFT 2 +#define REG_G2_BG1CNT_CHARBASE_SIZE 4 +#define REG_G2_BG1CNT_CHARBASE_MASK 0x003c + +#define REG_G2_BG1CNT_PRIORITY_SHIFT 0 +#define REG_G2_BG1CNT_PRIORITY_SIZE 2 +#define REG_G2_BG1CNT_PRIORITY_MASK 0x0003 + +// G2_BG2CNT +#define REG_G2_BG2CNT_SCREENSIZE_SHIFT 14 +#define REG_G2_BG2CNT_SCREENSIZE_SIZE 2 +#define REG_G2_BG2CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2_BG2CNT_AREAOVER_SHIFT 13 +#define REG_G2_BG2CNT_AREAOVER_SIZE 1 +#define REG_G2_BG2CNT_AREAOVER_MASK 0x2000 + +#define REG_G2_BG2CNT_SCREENBASE_SHIFT 8 +#define REG_G2_BG2CNT_SCREENBASE_SIZE 5 +#define REG_G2_BG2CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2_BG2CNT_COLORMODE_SHIFT 7 +#define REG_G2_BG2CNT_COLORMODE_SIZE 1 +#define REG_G2_BG2CNT_COLORMODE_MASK 0x0080 + +#define REG_G2_BG2CNT_MOSAIC_SHIFT 6 +#define REG_G2_BG2CNT_MOSAIC_SIZE 1 +#define REG_G2_BG2CNT_MOSAIC_MASK 0x0040 + +#define REG_G2_BG2CNT_CHARBASE_SHIFT 2 +#define REG_G2_BG2CNT_CHARBASE_SIZE 4 +#define REG_G2_BG2CNT_CHARBASE_MASK 0x003c + +#define REG_G2_BG2CNT_PRIORITY_SHIFT 0 +#define REG_G2_BG2CNT_PRIORITY_SIZE 2 +#define REG_G2_BG2CNT_PRIORITY_MASK 0x0003 + +// G2_BG3CNT +#define REG_G2_BG3CNT_SCREENSIZE_SHIFT 14 +#define REG_G2_BG3CNT_SCREENSIZE_SIZE 2 +#define REG_G2_BG3CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2_BG3CNT_AREAOVER_SHIFT 13 +#define REG_G2_BG3CNT_AREAOVER_SIZE 1 +#define REG_G2_BG3CNT_AREAOVER_MASK 0x2000 + +#define REG_G2_BG3CNT_SCREENBASE_SHIFT 8 +#define REG_G2_BG3CNT_SCREENBASE_SIZE 5 +#define REG_G2_BG3CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2_BG3CNT_COLORMODE_SHIFT 7 +#define REG_G2_BG3CNT_COLORMODE_SIZE 1 +#define REG_G2_BG3CNT_COLORMODE_MASK 0x0080 + +#define REG_G2_BG3CNT_MOSAIC_SHIFT 6 +#define REG_G2_BG3CNT_MOSAIC_SIZE 1 +#define REG_G2_BG3CNT_MOSAIC_MASK 0x0040 + +#define REG_G2_BG3CNT_CHARBASE_SHIFT 2 +#define REG_G2_BG3CNT_CHARBASE_SIZE 4 +#define REG_G2_BG3CNT_CHARBASE_MASK 0x003c + +#define REG_G2_BG3CNT_PRIORITY_SHIFT 0 +#define REG_G2_BG3CNT_PRIORITY_SIZE 2 +#define REG_G2_BG3CNT_PRIORITY_MASK 0x0003 + +// G2S_DB_BG0CNT +#define REG_G2S_DB_BG0CNT_SCREENSIZE_SHIFT 14 +#define REG_G2S_DB_BG0CNT_SCREENSIZE_SIZE 2 +#define REG_G2S_DB_BG0CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2S_DB_BG0CNT_BGPLTTSLOT_SHIFT 13 +#define REG_G2S_DB_BG0CNT_BGPLTTSLOT_SIZE 1 +#define REG_G2S_DB_BG0CNT_BGPLTTSLOT_MASK 0x2000 + +#define REG_G2S_DB_BG0CNT_SCREENBASE_SHIFT 8 +#define REG_G2S_DB_BG0CNT_SCREENBASE_SIZE 5 +#define REG_G2S_DB_BG0CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2S_DB_BG0CNT_COLORMODE_SHIFT 7 +#define REG_G2S_DB_BG0CNT_COLORMODE_SIZE 1 +#define REG_G2S_DB_BG0CNT_COLORMODE_MASK 0x0080 + +#define REG_G2S_DB_BG0CNT_MOSAIC_SHIFT 6 +#define REG_G2S_DB_BG0CNT_MOSAIC_SIZE 1 +#define REG_G2S_DB_BG0CNT_MOSAIC_MASK 0x0040 + +#define REG_G2S_DB_BG0CNT_CHARBASE_SHIFT 2 +#define REG_G2S_DB_BG0CNT_CHARBASE_SIZE 4 +#define REG_G2S_DB_BG0CNT_CHARBASE_MASK 0x003c + +#define REG_G2S_DB_BG0CNT_PRIORITY_SHIFT 0 +#define REG_G2S_DB_BG0CNT_PRIORITY_SIZE 2 +#define REG_G2S_DB_BG0CNT_PRIORITY_MASK 0x0003 + +// G2S_DB_BG1CNT +#define REG_G2S_DB_BG1CNT_SCREENSIZE_SHIFT 14 +#define REG_G2S_DB_BG1CNT_SCREENSIZE_SIZE 2 +#define REG_G2S_DB_BG1CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2S_DB_BG1CNT_BGPLTTSLOT_SHIFT 13 +#define REG_G2S_DB_BG1CNT_BGPLTTSLOT_SIZE 1 +#define REG_G2S_DB_BG1CNT_BGPLTTSLOT_MASK 0x2000 + +#define REG_G2S_DB_BG1CNT_SCREENBASE_SHIFT 8 +#define REG_G2S_DB_BG1CNT_SCREENBASE_SIZE 5 +#define REG_G2S_DB_BG1CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2S_DB_BG1CNT_COLORMODE_SHIFT 7 +#define REG_G2S_DB_BG1CNT_COLORMODE_SIZE 1 +#define REG_G2S_DB_BG1CNT_COLORMODE_MASK 0x0080 + +#define REG_G2S_DB_BG1CNT_MOSAIC_SHIFT 6 +#define REG_G2S_DB_BG1CNT_MOSAIC_SIZE 1 +#define REG_G2S_DB_BG1CNT_MOSAIC_MASK 0x0040 + +#define REG_G2S_DB_BG1CNT_CHARBASE_SHIFT 2 +#define REG_G2S_DB_BG1CNT_CHARBASE_SIZE 4 +#define REG_G2S_DB_BG1CNT_CHARBASE_MASK 0x003c + +#define REG_G2S_DB_BG1CNT_PRIORITY_SHIFT 0 +#define REG_G2S_DB_BG1CNT_PRIORITY_SIZE 2 +#define REG_G2S_DB_BG1CNT_PRIORITY_MASK 0x0003 + +// G2S_DB_BG2CNT +#define REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT 14 +#define REG_G2S_DB_BG2CNT_SCREENSIZE_SIZE 2 +#define REG_G2S_DB_BG2CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2S_DB_BG2CNT_AREAOVER_SHIFT 13 +#define REG_G2S_DB_BG2CNT_AREAOVER_SIZE 1 +#define REG_G2S_DB_BG2CNT_AREAOVER_MASK 0x2000 + +#define REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT 8 +#define REG_G2S_DB_BG2CNT_SCREENBASE_SIZE 5 +#define REG_G2S_DB_BG2CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2S_DB_BG2CNT_COLORMODE_SHIFT 7 +#define REG_G2S_DB_BG2CNT_COLORMODE_SIZE 1 +#define REG_G2S_DB_BG2CNT_COLORMODE_MASK 0x0080 + +#define REG_G2S_DB_BG2CNT_MOSAIC_SHIFT 6 +#define REG_G2S_DB_BG2CNT_MOSAIC_SIZE 1 +#define REG_G2S_DB_BG2CNT_MOSAIC_MASK 0x0040 + +#define REG_G2S_DB_BG2CNT_CHARBASE_SHIFT 2 +#define REG_G2S_DB_BG2CNT_CHARBASE_SIZE 4 +#define REG_G2S_DB_BG2CNT_CHARBASE_MASK 0x003c + +#define REG_G2S_DB_BG2CNT_PRIORITY_SHIFT 0 +#define REG_G2S_DB_BG2CNT_PRIORITY_SIZE 2 +#define REG_G2S_DB_BG2CNT_PRIORITY_MASK 0x0003 + +// G2S_DB_BG3CNT +#define REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT 14 +#define REG_G2S_DB_BG3CNT_SCREENSIZE_SIZE 2 +#define REG_G2S_DB_BG3CNT_SCREENSIZE_MASK 0xc000 + +#define REG_G2S_DB_BG3CNT_AREAOVER_SHIFT 13 +#define REG_G2S_DB_BG3CNT_AREAOVER_SIZE 1 +#define REG_G2S_DB_BG3CNT_AREAOVER_MASK 0x2000 + +#define REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT 8 +#define REG_G2S_DB_BG3CNT_SCREENBASE_SIZE 5 +#define REG_G2S_DB_BG3CNT_SCREENBASE_MASK 0x1f00 + +#define REG_G2S_DB_BG3CNT_COLORMODE_SHIFT 7 +#define REG_G2S_DB_BG3CNT_COLORMODE_SIZE 1 +#define REG_G2S_DB_BG3CNT_COLORMODE_MASK 0x0080 + +#define REG_G2S_DB_BG3CNT_MOSAIC_SHIFT 6 +#define REG_G2S_DB_BG3CNT_MOSAIC_SIZE 1 +#define REG_G2S_DB_BG3CNT_MOSAIC_MASK 0x0040 + +#define REG_G2S_DB_BG3CNT_CHARBASE_SHIFT 2 +#define REG_G2S_DB_BG3CNT_CHARBASE_SIZE 4 +#define REG_G2S_DB_BG3CNT_CHARBASE_MASK 0x003c + +#define REG_G2S_DB_BG3CNT_PRIORITY_SHIFT 0 +#define REG_G2S_DB_BG3CNT_PRIORITY_SIZE 2 +#define REG_G2S_DB_BG3CNT_PRIORITY_MASK 0x0003 + +// G2_BG0OFS +#define REG_G2_BG0OFS_VOFFSET_SHIFT 16 +#define REG_G2_BG0OFS_VOFFSET_SIZE 9 +#define REG_G2_BG0OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2_BG0OFS_HOFFSET_SHIFT 0 +#define REG_G2_BG0OFS_HOFFSET_SIZE 9 +#define REG_G2_BG0OFS_HOFFSET_MASK 0x000001ff + +// G2_BG1OFS +#define REG_G2_BG1OFS_VOFFSET_SHIFT 16 +#define REG_G2_BG1OFS_VOFFSET_SIZE 9 +#define REG_G2_BG1OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2_BG1OFS_HOFFSET_SHIFT 0 +#define REG_G2_BG1OFS_HOFFSET_SIZE 9 +#define REG_G2_BG1OFS_HOFFSET_MASK 0x000001ff + +// G2_BG2OFS +#define REG_G2_BG2OFS_VOFFSET_SHIFT 16 +#define REG_G2_BG2OFS_VOFFSET_SIZE 9 +#define REG_G2_BG2OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2_BG2OFS_HOFFSET_SHIFT 0 +#define REG_G2_BG2OFS_HOFFSET_SIZE 9 +#define REG_G2_BG2OFS_HOFFSET_MASK 0x000001ff + +// G2_BG3OFS +#define REG_G2_BG3OFS_VOFFSET_SHIFT 16 +#define REG_G2_BG3OFS_VOFFSET_SIZE 9 +#define REG_G2_BG3OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2_BG3OFS_HOFFSET_SHIFT 0 +#define REG_G2_BG3OFS_HOFFSET_SIZE 9 +#define REG_G2_BG3OFS_HOFFSET_MASK 0x000001ff + +// G2S_DB_BG0OFS +#define REG_G2S_DB_BG0OFS_VOFFSET_SHIFT 16 +#define REG_G2S_DB_BG0OFS_VOFFSET_SIZE 9 +#define REG_G2S_DB_BG0OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2S_DB_BG0OFS_HOFFSET_SHIFT 0 +#define REG_G2S_DB_BG0OFS_HOFFSET_SIZE 9 +#define REG_G2S_DB_BG0OFS_HOFFSET_MASK 0x000001ff + +// G2S_DB_BG1OFS +#define REG_G2S_DB_BG1OFS_VOFFSET_SHIFT 16 +#define REG_G2S_DB_BG1OFS_VOFFSET_SIZE 9 +#define REG_G2S_DB_BG1OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2S_DB_BG1OFS_HOFFSET_SHIFT 0 +#define REG_G2S_DB_BG1OFS_HOFFSET_SIZE 9 +#define REG_G2S_DB_BG1OFS_HOFFSET_MASK 0x000001ff + +// G2S_DB_BG2OFS +#define REG_G2S_DB_BG2OFS_VOFFSET_SHIFT 16 +#define REG_G2S_DB_BG2OFS_VOFFSET_SIZE 9 +#define REG_G2S_DB_BG2OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2S_DB_BG2OFS_HOFFSET_SHIFT 0 +#define REG_G2S_DB_BG2OFS_HOFFSET_SIZE 9 +#define REG_G2S_DB_BG2OFS_HOFFSET_MASK 0x000001ff + +// G2S_DB_BG3OFS +#define REG_G2S_DB_BG3OFS_VOFFSET_SHIFT 16 +#define REG_G2S_DB_BG3OFS_VOFFSET_SIZE 9 +#define REG_G2S_DB_BG3OFS_VOFFSET_MASK 0x01ff0000 + +#define REG_G2S_DB_BG3OFS_HOFFSET_SHIFT 0 +#define REG_G2S_DB_BG3OFS_HOFFSET_SIZE 9 +#define REG_G2S_DB_BG3OFS_HOFFSET_MASK 0x000001ff + +// Timer control + +#define REG_OS_TM0CNT_L_TIMER0CNT_SHIFT 0 +#define REG_OS_TM0CNT_L_TIMER0CNT_SIZE 16 +#define REG_OS_TM0CNT_L_TIMER0CNT_MASK 0xffff + +#define REG_OS_TM0CNT_H_E_SHIFT 7 +#define REG_OS_TM0CNT_H_E_SIZE 1 +#define REG_OS_TM0CNT_H_E_MASK 0x0080 + +#define REG_OS_TM0CNT_H_I_SHIFT 6 +#define REG_OS_TM0CNT_H_I_SIZE 1 +#define REG_OS_TM0CNT_H_I_MASK 0x0040 + +#define REG_OS_TM0CNT_H_PS_SHIFT 0 +#define REG_OS_TM0CNT_H_PS_SIZE 2 +#define REG_OS_TM0CNT_H_PS_MASK 0x0003 + +#define REG_OS_TM1CNT_L_TIMER0CNT_SHIFT 0 +#define REG_OS_TM1CNT_L_TIMER0CNT_SIZE 16 +#define REG_OS_TM1CNT_L_TIMER0CNT_MASK 0xffff + +#define REG_OS_TM1CNT_H_E_SHIFT 7 +#define REG_OS_TM1CNT_H_E_SIZE 1 +#define REG_OS_TM1CNT_H_E_MASK 0x0080 + +#define REG_OS_TM1CNT_H_I_SHIFT 6 +#define REG_OS_TM1CNT_H_I_SIZE 1 +#define REG_OS_TM1CNT_H_I_MASK 0x0040 + +#define REG_OS_TM1CNT_H_PS_SHIFT 0 +#define REG_OS_TM1CNT_H_PS_SIZE 2 +#define REG_OS_TM1CNT_H_PS_MASK 0x0003 + +#define REG_OS_TM2CNT_L_TIMER0CNT_SHIFT 0 +#define REG_OS_TM2CNT_L_TIMER0CNT_SIZE 16 +#define REG_OS_TM2CNT_L_TIMER0CNT_MASK 0xffff + +#define REG_OS_TM2CNT_H_E_SHIFT 7 +#define REG_OS_TM2CNT_H_E_SIZE 1 +#define REG_OS_TM2CNT_H_E_MASK 0x0080 + +#define REG_OS_TM2CNT_H_I_SHIFT 6 +#define REG_OS_TM2CNT_H_I_SIZE 1 +#define REG_OS_TM2CNT_H_I_MASK 0x0040 + +#define REG_OS_TM2CNT_H_PS_SHIFT 0 +#define REG_OS_TM2CNT_H_PS_SIZE 2 +#define REG_OS_TM2CNT_H_PS_MASK 0x0003 + +#define REG_OS_TM3CNT_L_TIMER0CNT_SHIFT 0 +#define REG_OS_TM3CNT_L_TIMER0CNT_SIZE 16 +#define REG_OS_TM3CNT_L_TIMER0CNT_MASK 0xffff + +#define REG_OS_TM3CNT_H_E_SHIFT 7 +#define REG_OS_TM3CNT_H_E_SIZE 1 +#define REG_OS_TM3CNT_H_E_MASK 0x0080 + +#define REG_OS_TM3CNT_H_I_SHIFT 6 +#define REG_OS_TM3CNT_H_I_SIZE 1 +#define REG_OS_TM3CNT_H_I_MASK 0x0040 + +#define REG_OS_TM3CNT_H_PS_SHIFT 0 +#define REG_OS_TM3CNT_H_PS_SIZE 2 +#define REG_OS_TM3CNT_H_PS_MASK 0x0003 + +#define REG_G3X_DISP3DCNT_PRI_SHIFT 14 +#define REG_G3X_DISP3DCNT_PRI_SIZE 1 +#define REG_G3X_DISP3DCNT_PRI_MASK 0x4000 + +#define REG_G3X_DISP3DCNT_GO_SHIFT 13 +#define REG_G3X_DISP3DCNT_GO_SIZE 1 +#define REG_G3X_DISP3DCNT_GO_MASK 0x2000 + +#define REG_G3X_DISP3DCNT_RO_SHIFT 12 +#define REG_G3X_DISP3DCNT_RO_SIZE 1 +#define REG_G3X_DISP3DCNT_RO_MASK 0x1000 + +#define REG_G3X_DISP3DCNT_FOG_SHIFT_SHIFT 8 +#define REG_G3X_DISP3DCNT_FOG_SHIFT_SIZE 4 +#define REG_G3X_DISP3DCNT_FOG_SHIFT_MASK 0x0f00 + +#define REG_G3X_DISP3DCNT_FME_SHIFT 7 +#define REG_G3X_DISP3DCNT_FME_SIZE 1 +#define REG_G3X_DISP3DCNT_FME_MASK 0x0080 + +#define REG_G3X_DISP3DCNT_FMOD_SHIFT 6 +#define REG_G3X_DISP3DCNT_FMOD_SIZE 1 +#define REG_G3X_DISP3DCNT_FMOD_MASK 0x0040 + +#define REG_G3X_DISP3DCNT_EME_SHIFT 5 +#define REG_G3X_DISP3DCNT_EME_SIZE 1 +#define REG_G3X_DISP3DCNT_EME_MASK 0x0020 + +#define REG_G3X_DISP3DCNT_AAE_SHIFT 4 +#define REG_G3X_DISP3DCNT_AAE_SIZE 1 +#define REG_G3X_DISP3DCNT_AAE_MASK 0x0010 + +#define REG_G3X_DISP3DCNT_ABE_SHIFT 3 +#define REG_G3X_DISP3DCNT_ABE_SIZE 1 +#define REG_G3X_DISP3DCNT_ABE_MASK 0x0008 + +#define REG_G3X_DISP3DCNT_ATE_SHIFT 2 +#define REG_G3X_DISP3DCNT_ATE_SIZE 1 +#define REG_G3X_DISP3DCNT_ATE_MASK 0x0004 + +#define REG_G3X_DISP3DCNT_THS_SHIFT 1 +#define REG_G3X_DISP3DCNT_THS_SIZE 1 +#define REG_G3X_DISP3DCNT_THS_MASK 0x0002 + +#define REG_G3X_DISP3DCNT_TME_SHIFT 0 +#define REG_G3X_DISP3DCNT_TME_SIZE 1 +#define REG_G3X_DISP3DCNT_TME_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_G3X_DISP3DCNT_FIELD( pri, go, ro, fog_shift, fme, fmod, eme, aae, abe, ate, ths, tme ) \ + (u16)( \ + ((u32)(pri) << REG_G3X_DISP3DCNT_PRI_SHIFT) | \ + ((u32)(go) << REG_G3X_DISP3DCNT_GO_SHIFT) | \ + ((u32)(ro) << REG_G3X_DISP3DCNT_RO_SHIFT) | \ + ((u32)(fog_shift) << REG_G3X_DISP3DCNT_FOG_SHIFT_SHIFT) | \ + ((u32)(fme) << REG_G3X_DISP3DCNT_FME_SHIFT) | \ + ((u32)(fmod) << REG_G3X_DISP3DCNT_FMOD_SHIFT) | \ + ((u32)(eme) << REG_G3X_DISP3DCNT_EME_SHIFT) | \ + ((u32)(aae) << REG_G3X_DISP3DCNT_AAE_SHIFT) | \ + ((u32)(abe) << REG_G3X_DISP3DCNT_ABE_SHIFT) | \ + ((u32)(ate) << REG_G3X_DISP3DCNT_ATE_SHIFT) | \ + ((u32)(ths) << REG_G3X_DISP3DCNT_THS_SHIFT) | \ + ((u32)(tme) << REG_G3X_DISP3DCNT_TME_SHIFT)) +#endif + +#endif //NITRO_HW_IO_REG_SHARED_H_ diff --git a/lib/include/nitro/hw/consts.h b/lib/include/nitro/hw/consts.h new file mode 100644 index 00000000..fbd4ac31 --- /dev/null +++ b/lib/include/nitro/hw/consts.h @@ -0,0 +1,68 @@ +#ifndef NITRO_HW_CONSTS_H_ +#define NITRO_HW_CONSTS_H_ + +#include +#include +#include +#include + +#define HW_C5_PERMIT_MASK 0xf + +#define HW_C5_PERMIT_RO 5 +#define HW_C5_PERMIT_RW 1 + +#define HW_C5_PR3_SFT 12 + +#define HW_C6_PR_4KB 0x16 +#define HW_C6_PR_8KB 0x18 +#define HW_C6_PR_16KB 0x1a +#define HW_C6_PR_32KB 0x1c +#define HW_C6_PR_64KB 0x1e +#define HW_C6_PR_128KB 0x20 +#define HW_C6_PR_256KB 0x22 +#define HW_C6_PR_512KB 0x24 +#define HW_C6_PR_1MB 0x26 +#define HW_C6_PR_2MB 0x28 +#define HW_C6_PR_4MB 0x2a +#define HW_C6_PR_8MB 0x2c +#define HW_C6_PR_16MB 0x2e +#define HW_C6_PR_32MB 0x30 +#define HW_C6_PR_64MB 0x32 +#define HW_C6_PR_128MB 0x34 +#define HW_C6_PR_256MB 0x36 +#define HW_C6_PR_512MB 0x38 +#define HW_C6_PR_1GB 0x3a +#define HW_C6_PR_2GB 0x3c +#define HW_C6_PR_4GB 0x3e + +#define HW_C6_PR_ENABLE 1 + +#define HW_C9_TCMR_16KB 0x0a +#define HW_C9_TCMR_32MB 0x20 + +#define HW_ICACHE_SIZE 0x2000 +#define HW_DCACHE_SIZE 0x1000 +#define HW_CACHE_LINE_SIZE 32 + +#define OSi_CONSOLE_NOT_DETECT 0xffffffff + +#define OS_CONSOLE_NITRO 0x80000000 +#define OS_CONSOLE_DEV_CARD 0x02000000 +#define OS_CONSOLE_SIZE_MASK 0x00000003 +#define OS_CONSOLE_SIZE_4MB 0x00000001 + +#define OSi_TCM_REGION_BASE_MASK 0xfffff000 + +#define OS_IE_V_BLANK (1UL << 0) +#define OS_IE_H_BLANK (1UL << 1) + +#define HW_CPU_CLOCK_ARM9 67027964 + +#define REG_PXI_SUBP_FIFO_CNT_E_MASK 0x8000 +#define REG_PXI_SUBP_FIFO_CNT_ERR_MASK 0x4000 +#define REG_PXI_SUBP_FIFO_CNT_RECV_RI_MASK 0x0400 +#define REG_PXI_SUBP_FIFO_CNT_RECV_EMP_MASK 0x0100 +#define REG_PXI_SUBP_FIFO_CNT_SEND_CL_MASK 0x0008 +#define REG_PXI_SUBP_FIFO_CNT_SEND_FULL_MASK 0x0002 + +#endif //NITRO_HW_CONSTS_H_ diff --git a/lib/include/nitro/hw/consts_shared.h b/lib/include/nitro/hw/consts_shared.h new file mode 100644 index 00000000..d93e33ad --- /dev/null +++ b/lib/include/nitro/hw/consts_shared.h @@ -0,0 +1,42 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include consts.h from the specific proc's lib + */ + +#ifndef NITRO_HW_CONSTS_SHARED_H_ +#define NITRO_HW_CONSTS_SHARED_H_ + +#include +#include + +//Shared Consts + +#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode + +#define HW_PSR_DISABLE_FIQ 0x40 // Disable FIQ +#define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ +#define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ + +#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) +#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) +#define OSi_InRange(targ, a, b) ((u32)(a) <= (u32)(targ) && (u32)(targ) < (u32)(b)) +#define OSi_OFFSET(n, a) (((u32) (n)) & ((a) - 1)) + +#define OS_THREAD_SPECIFIC_MAX 0x03 + +#define OS_THREAD_LAUNCHER_PRIORITY 0x10 +#define OS_THREAD_PRIORITY_MIN 0x00 +#define OS_THREAD_PRIORITY_MAX 0x1F + +#define HW_SYSTEM_CLOCK 33514000 + +#define OSi_GetArenaInfo() (*(OSArenaInfo*)HW_ARENA_INFO_BUF) + +#endif //NITRO_HW_CONSTS_SHARED_H_ diff --git a/lib/include/nitro/hw/io_reg.h b/lib/include/nitro/hw/io_reg.h new file mode 100644 index 00000000..8349c772 --- /dev/null +++ b/lib/include/nitro/hw/io_reg.h @@ -0,0 +1,121 @@ +#ifndef NITRO_IO_REG_H_ +#define NITRO_IO_REG_H_ + +#include + +#ifdef SDK_ARM9 +#include +#else +#include +#endif + +#define REG_OS_IME_IME_SHIFT 0 +#define REG_OS_IME_IME_SIZE 1 +#define REG_OS_IME_IME_MASK 0x0001 + +#define REG_INTF_OFFSET (0x180) +#define REG_INTF_ADDR (HW_REG_BASE + REG_INTF_OFFSET) +#define reg_PXI_INTF (*(REGType16v *)REG_INTF_ADDR) + +#define REG_FIFO_CNT_OFFSET (0x184) +#define REG_FIFO_CNT_ADDR (HW_REG_BASE + REG_FIFO_CNT_OFFSET) +#define reg_PXI_FIFO_CNT (*(REGType16v *)REG_FIFO_CNT_ADDR) + +#define REG_PXI_INTF_I_SHIFT 14 +#define REG_PXI_INTF_I_SIZE 1 +#define REG_PXI_INTF_I_MASK 0x4000 + +#define REG_PXI_INTF_IREQ_SHIFT 13 +#define REG_PXI_INTF_IREQ_SIZE 1 +#define REG_PXI_INTF_IREQ_MASK 0x2000 + +#define REG_PXI_INTF_A7STATUS_SHIFT 8 +#define REG_PXI_INTF_A7STATUS_SIZE 4 +#define REG_PXI_INTF_A7STATUS_MASK 0x0f00 + +#define REG_PXI_INTF_A9STATUS_SHIFT 0 +#define REG_PXI_INTF_A9STATUS_SIZE 4 +#define REG_PXI_INTF_A9STATUS_MASK 0x000f + +#ifndef SDK_ASM +#define REG_PXI_INTF_FIELD( i, ireq, a7status, a9status ) \ + (u16)( \ + ((u32)(i) << REG_PXI_INTF_I_SHIFT) | \ + ((u32)(ireq) << REG_PXI_INTF_IREQ_SHIFT) | \ + ((u32)(a7status) << REG_PXI_INTF_A7STATUS_SHIFT) | \ + ((u32)(a9status) << REG_PXI_INTF_A9STATUS_SHIFT)) +#endif + +#define REG_PXI_FIFO_CNT_E_SHIFT 15 +#define REG_PXI_FIFO_CNT_E_SIZE 1 +#define REG_PXI_FIFO_CNT_E_MASK 0x8000 + +#define REG_PXI_FIFO_CNT_ERR_SHIFT 14 +#define REG_PXI_FIFO_CNT_ERR_SIZE 1 +#define REG_PXI_FIFO_CNT_ERR_MASK 0x4000 + +#define REG_PXI_FIFO_CNT_RECV_RI_SHIFT 10 +#define REG_PXI_FIFO_CNT_RECV_RI_SIZE 1 +#define REG_PXI_FIFO_CNT_RECV_RI_MASK 0x0400 + +#define REG_PXI_FIFO_CNT_RECV_FULL_SHIFT 9 +#define REG_PXI_FIFO_CNT_RECV_FULL_SIZE 1 +#define REG_PXI_FIFO_CNT_RECV_FULL_MASK 0x0200 + +#define REG_PXI_FIFO_CNT_RECV_EMP_SHIFT 8 +#define REG_PXI_FIFO_CNT_RECV_EMP_SIZE 1 +#define REG_PXI_FIFO_CNT_RECV_EMP_MASK 0x0100 + +#define REG_PXI_FIFO_CNT_SEND_CL_SHIFT 3 +#define REG_PXI_FIFO_CNT_SEND_CL_SIZE 1 +#define REG_PXI_FIFO_CNT_SEND_CL_MASK 0x0008 + +#define REG_PXI_FIFO_CNT_SEND_TI_SHIFT 2 +#define REG_PXI_FIFO_CNT_SEND_TI_SIZE 1 +#define REG_PXI_FIFO_CNT_SEND_TI_MASK 0x0004 + +#define REG_PXI_FIFO_CNT_SEND_FULL_SHIFT 1 +#define REG_PXI_FIFO_CNT_SEND_FULL_SIZE 1 +#define REG_PXI_FIFO_CNT_SEND_FULL_MASK 0x0002 + +#define REG_PXI_FIFO_CNT_SEND_EMP_SHIFT 0 +#define REG_PXI_FIFO_CNT_SEND_EMP_SIZE 1 +#define REG_PXI_FIFO_CNT_SEND_EMP_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_PXI_FIFO_CNT_FIELD( e, err, recv_ri, recv_full, recv_emp, send_cl, send_ti, send_full, send_emp ) \ + (u16)( \ + ((u32)(e) << REG_PXI_FIFO_CNT_E_SHIFT) | \ + ((u32)(err) << REG_PXI_FIFO_CNT_ERR_SHIFT) | \ + ((u32)(recv_ri) << REG_PXI_FIFO_CNT_RECV_RI_SHIFT) | \ + ((u32)(recv_full) << REG_PXI_FIFO_CNT_RECV_FULL_SHIFT) | \ + ((u32)(recv_emp) << REG_PXI_FIFO_CNT_RECV_EMP_SHIFT) | \ + ((u32)(send_cl) << REG_PXI_FIFO_CNT_SEND_CL_SHIFT) | \ + ((u32)(send_ti) << REG_PXI_FIFO_CNT_SEND_TI_SHIFT) | \ + ((u32)(send_full) << REG_PXI_FIFO_CNT_SEND_FULL_SHIFT) | \ + ((u32)(send_emp) << REG_PXI_FIFO_CNT_SEND_EMP_SHIFT)) +#endif + +#define REG_G3_SWAP_BUFFERS_DP_SHIFT 1 +#define REG_G3_SWAP_BUFFERS_DP_SIZE 1 +#define REG_G3_SWAP_BUFFERS_DP_MASK 0x00000002 + +#define REG_G3_SWAP_BUFFERS_XS_SHIFT 0 +#define REG_G3_SWAP_BUFFERS_XS_SIZE 1 +#define REG_G3_SWAP_BUFFERS_XS_MASK 0x00000001 +#define REG_G3_SWAP_BUFFERS_DP_SHIFT 1 +#define REG_G3_SWAP_BUFFERS_DP_SIZE 1 +#define REG_G3_SWAP_BUFFERS_DP_MASK 0x00000002 + +#define REG_G3_SWAP_BUFFERS_XS_SHIFT 0 +#define REG_G3_SWAP_BUFFERS_XS_SIZE 1 +#define REG_G3_SWAP_BUFFERS_XS_MASK 0x00000001 + +#ifndef SDK_ASM +#define REG_G3_SWAP_BUFFERS_FIELD( dp, xs ) \ + (u32)( \ + ((u32)(dp) << REG_G3_SWAP_BUFFERS_DP_SHIFT) | \ + ((u32)(xs) << REG_G3_SWAP_BUFFERS_XS_SHIFT)) +#endif + +#endif //NITRO_IO_REG_H_ diff --git a/lib/include/nitro/hw/mmap.h b/lib/include/nitro/hw/mmap.h new file mode 100644 index 00000000..8fe32548 --- /dev/null +++ b/lib/include/nitro/hw/mmap.h @@ -0,0 +1,13 @@ +#ifndef NITRO_HW_MMAP_H_ +#define NITRO_HW_MMAP_H_ + +#include +#include + +#ifdef SDK_ARM7 +#include +#else //ARM9 +#include +#endif + +#endif //NITRO_HW_MMAP_H_ diff --git a/lib/include/nitro/hw/mmap_shared.h b/lib/include/nitro/hw/mmap_shared.h new file mode 100644 index 00000000..693dd317 --- /dev/null +++ b/lib/include/nitro/hw/mmap_shared.h @@ -0,0 +1,40 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include mmap.h from the specific proc's lib + */ + +#ifndef NITRO_HW_MMAP_SHARED_H_ +#define NITRO_HW_MMAP_SHARED_H_ + +#define HW_MAIN_MEM 0x02000000 +#define HW_MAIN_MEM_SIZE 0x00400000 +#define HW_MAIN_MEM_MAIN_SIZE 0x003E0000 +#define HW_MAIN_MEM_SHARED_SIZE 0x00001000 + +#define HW_WRAM 0x037F8000 + +#define HW_MAIN_MEM_SYSTEM (HW_MAIN_MEM + 0x007ffc00) +#define HW_WM_BOOT_BUF (HW_MAIN_MEM + 0x007ffc40) +#define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) +#define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM + 0x007fffe8) +#define HW_INIT_LOCK_BUF (HW_MAIN_MEM + 0x007ffff0) +#define HW_MAIN_MEM_MAIN (HW_MAIN_MEM) +#define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE) + +#define HW_SVC_STACK_SIZE 0x00000040 + +#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007FFFA8) + +#define HW_PXI_SIGNAL_PARAM_ARM9 (HW_MAIN_MEM + 0x007fff80) +#define HW_PXI_SIGNAL_PARAM_ARM7 (HW_MAIN_MEM + 0x007fff84) +#define HW_PXI_HANDLE_CHECKER_ARM9 (HW_MAIN_MEM + 0x007fff88) +#define HW_PXI_HANDLE_CHECKER_ARM7 (HW_MAIN_MEM + 0x007fff8c) + +#endif //NITRO_HW_MMAP_SHARED_H_ diff --git a/lib/include/nitro/itcm_begin.h b/lib/include/nitro/itcm_begin.h new file mode 100644 index 00000000..582c8bcf --- /dev/null +++ b/lib/include/nitro/itcm_begin.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section ITCM begin +#endif diff --git a/lib/include/nitro/itcm_end.h b/lib/include/nitro/itcm_end.h new file mode 100644 index 00000000..ad3474e0 --- /dev/null +++ b/lib/include/nitro/itcm_end.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section ITCM end +#endif diff --git a/lib/include/nitro/math.h b/lib/include/nitro/math.h new file mode 100644 index 00000000..72ac0f43 --- /dev/null +++ b/lib/include/nitro/math.h @@ -0,0 +1,7 @@ +#ifndef NITRO_MATH_H_ +#define NITRO_MATH_H_ + +#include +#include + +#endif //NITRO_MATH_H_ diff --git a/lib/include/nitro/math/crc.h b/lib/include/nitro/math/crc.h new file mode 100644 index 00000000..60abf72c --- /dev/null +++ b/lib/include/nitro/math/crc.h @@ -0,0 +1,97 @@ +#ifndef NITRO_MATH_CRC_H_ +#define NITRO_MATH_CRC_H_ + +#define MATH_CRC8_STANDARD_POLY 0x07 +#define MATH_CRC8_STANDARD_INIT 0 + +#define MATH_CRC16_STANDARD_POLY 0xa001 +#define MATH_CRC16_STANDARD_INIT 0 +#define MATH_CRC16_CCITT_POLY 0x1021 +#define MATH_CRC16_CCITT_INIT 0xffff + +#define MATH_CRC32_STANDARD_POLY 0xedb88320 +#define MATH_CRC32_STANDARD_INIT 0xffffffff +#define MATH_CRC32_POSIX_POLY 0x04c11db7 +#define MATH_CRC32_POSIX_INIT 0 + +typedef u8 MATHCRC8Context; +typedef u16 MATHCRC16Context; +typedef u32 MATHCRC32Context; + +typedef struct MATHCRC8Table { + u8 table[256]; +} MATHCRC8Table; + +typedef struct MATHCRC16Table { + u16 table[256]; +} MATHCRC16Table; + +typedef struct MATHCRC32Table { + u32 table[256]; +} MATHCRC32Table; + +void MATHi_CRC8InitTable(MATHCRC8Table *table, u8 poly); +void MATHi_CRC8InitTableRev(MATHCRC8Table *table, u8 poly); + +static inline void MATHi_CRC8Init(MATHCRC8Context *context, u8 init) { + *context = init; +} + +void MATHi_CRC8Update(const MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length); +static inline void MATHi_CRC8UpdateRev(const MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) { + MATHi_CRC8Update(table, context, input, length); +} + +static inline u8 MATHi_CRC8GetHash(MATHCRC8Context *context) { + return *context; +} + +static inline void MATH_CRC8InitTable(MATHCRC8Table *table) { + MATHi_CRC8InitTable(table, MATH_CRC8_STANDARD_POLY); +} + +static inline void MATH_CRC8Init(MATHCRC8Context *context) { + MATHi_CRC8Init(context, MATH_CRC8_STANDARD_INIT); +} + +static inline void MATH_CRC8Update(const MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) { + MATHi_CRC8Update(table, context, input, length); +} + +static inline u8 MATH_CRC8GetHash(MATHCRC8Context *context) { + return MATHi_CRC8GetHash(context); +} + +void MATHi_CRC16InitTable(MATHCRC16Table *table, u16 poly); +void MATHi_CRC16InitTableRev(MATHCRC16Table *table, u16 poly); + +static inline void MATHi_CRC16Init(MATHCRC16Context *context, u16 init) { + *context = init; +} + +void MATHi_CRC16Update(const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); +void MATHi_CRC16UpdateRev(const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length); + +static inline u16 MATHi_CRC16GetHash(MATHCRC16Context *context) { + return *context; +} + +static inline void MATH_CRC16InitTable(MATHCRC16Table *table) { + MATHi_CRC16InitTable(table, MATH_CRC16_CCITT_POLY); +} + +static inline void MATH_CRC16Init(MATHCRC16Context *context) { + MATHi_CRC16Init(context, MATH_CRC16_CCITT_INIT); +} + +static inline void MATH_CRC16Update(const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) { + MATHi_CRC16Update(table, context, input, length); +} + +static inline u16 MATH_CRC16GetHash(MATHCRC16Context *context) { + return MATHi_CRC16GetHash(context); +} + +u16 MATH_CalcCRC16CCITT(const MATHCRC16Table *table, const void *input, u32 length); + +#endif //NITRO_MATH_CRC_H_ diff --git a/lib/include/nitro/math/dgt.h b/lib/include/nitro/math/dgt.h new file mode 100644 index 00000000..54dfcbb1 --- /dev/null +++ b/lib/include/nitro/math/dgt.h @@ -0,0 +1,14 @@ +#ifndef NITRO_MATH_DGT_H_ +#define NITRO_MATH_DGT_H_ + +#include + +#define MATH_MD5_DIGEST_SIZE DGT_HASH1_DIGEST_SIZE +#define MATH_SHA1_DIGEST_SIZE DGT_HASH2_DIGEST_SIZE +#define MATH_MD5_BLOCK_SIZE DGT_HASH_BLOCK_SIZE +#define MATH_SHA1_BLOCK_SIZE DGT_HASH_BLOCK_SIZE + +void MATH_CalcMD5(void *digest, const void *data, u32 dataLength); +void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength); + +#endif //NITRO_MATH_DGT_H_ diff --git a/lib/include/nitro/mb.h b/lib/include/nitro/mb.h new file mode 100644 index 00000000..1eff81b8 --- /dev/null +++ b/lib/include/nitro/mb.h @@ -0,0 +1,42 @@ +#ifndef NITRO_MB_H_ +#define NITRO_MB_H_ + +#define MB_TYPE_ILLEGAL 0 +#define MB_TYPE_NORMAL 1 +#define MB_TYPE_MULTIBOOT 2 + +typedef struct { + u16 length; + u16 rssi; + u16 bssid[3]; + u16 ssidLength; + u8 ssid[32]; + u16 capaInfo; + struct { + u16 basic; + u16 support; + } rateSet; + u16 beaconPeriod; + u16 dtimPeriod; + u16 channel; + u16 cfpPeriod; + u16 cfpMaxDuration; +} +MBParentBssDesc; + +typedef struct { + u16 boot_type; + MBParentBssDesc parent_bss_desc; +} MBParam; + +static inline const MBParam *MB_GetMultiBootParam(void) +{ + return (const MBParam *)HW_WM_BOOT_BUF; +} + +static inline BOOL MB_IsMultiBootChild(void) +{ + return MB_GetMultiBootParam()->boot_type == MB_TYPE_MULTIBOOT; +} + +#endif //NITRO_MB_H_ diff --git a/lib/include/nitro/mi.h b/lib/include/nitro/mi.h new file mode 100644 index 00000000..31e16bcd --- /dev/null +++ b/lib/include/nitro/mi.h @@ -0,0 +1,12 @@ +#ifndef NITRO_MI_H_ +#define NITRO_MI_H_ + +#include +#include +#include +#include +#include + +void MI_Init(void); + +#endif //NITRO_MI_H_ diff --git a/lib/include/nitro/mi/dma.h b/lib/include/nitro/mi/dma.h new file mode 100644 index 00000000..283a85ff --- /dev/null +++ b/lib/include/nitro/mi/dma.h @@ -0,0 +1,80 @@ +#ifndef NITRO_MI_DMA_H_ +#define NITRO_MI_DMA_H_ + +#include +#include +#include + +typedef void (*MIDmaCallback)(void *); + +#define MI_DMA_MAX_NUM 3 + +#define REG_ADDR_DMA0CNT 0x40000b8 +#define REG_ADDR_DMA0_CLR_DATA 0x40000e0 + +#define MI_CNT_CLEAR32(size) (0x85000000 | ((size)/4)) +#define MI_CNT_CLEAR32_IF(size) (0xc5000000 | ((size)/4)) +#define MI_CNT_COPY32(size) (0x84000000 | ((size)/4)) +#define MI_CNT_COPY32_IF(size) (0xc4000000 | ((size)/4)) +#define MI_CNT_COPY16(size) (0x80000000 | ((size)/2)) + +#define MI_DMA_SRC_FIX (2UL << 23) +#define MI_DMA_SRC_INC (0UL << 23) + +#define MI_DMA_16BIT_BUS (0UL << 26) +#define MI_DMA_32BIT_BUS (1UL << 26) + +#define MIi_DMA_TIMING_ANY (u32)(~0) +#define MI_DMA_TIMING_H_BLANK (2UL << 27) + +typedef union +{ + u32 b32; + u16 b16; +} MIiDmaClearSrc; + +void MI_DmaFill32(u32 dmaNo, void *dest, u32 data, u32 size); +void MI_DmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size); +void MI_DmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size); +void MI_DmaFill32Async(u32 dmaNo, void *dest, u32 data, u32 size, MIDmaCallback callback, void *arg); +void MI_DmaCopy32Async(u32 dmaNo, const void *src, void *dest, u32 size, MIDmaCallback callback, void *arg); +void MI_WaitDma(u32 dmaNo); +void MI_StopDma(u32 dmaNo); +void MIi_CheckAnotherAutoDMA(u32 dmaNo, u32 dmaType); +void MIi_CheckDma0SourceAddress(u32 dmaNo, u32 src, u32 size, u32 dir); +void MIi_DmaSetParams(u32 dmaNo, u32 src, u32 dest, u32 ctrl); +void MIi_DmaSetParams_wait(u32 dmaNo, u32 src, u32 dest, u32 ctrl); +void MIi_DmaSetParams_noInt(u32 dmaNo, u32 src, u32 dest, u32 ctrl); +void MIi_DmaSetParams_wait_noInt(u32 dmaNo, u32 src, u32 dest, u32 ctrl); + +static inline void MIi_DmaSetParams_wait_src32(u32 dmaNo, u32 data, u32 dest, u32 ctrl) +{ + OSIntrMode lastIntrMode = OS_DisableInterrupts(); + + MIiDmaClearSrc *scrp = (MIiDmaClearSrc *) ((u32)REG_ADDR_DMA0_CLR_DATA + dmaNo * 4); + scrp->b32 = data; + MIi_DmaSetParams_wait_noInt(dmaNo, (u32)scrp, dest, ctrl); + + (void)OS_RestoreInterrupts(lastIntrMode); +} + +static inline void MIi_DmaSetParams_src32(u32 dmaNo, u32 data, u32 dest, u32 ctrl) +{ + OSIntrMode lastIntrMode = OS_DisableInterrupts(); + + MIiDmaClearSrc *srcp = (MIiDmaClearSrc *) ((u32)REG_ADDR_DMA0_CLR_DATA + dmaNo * 4); + srcp->b32 = data; + MIi_DmaSetParams_noInt(dmaNo, (u32)srcp, dest, ctrl); + + (void)OS_RestoreInterrupts(lastIntrMode); +} + +static inline void MIi_CallCallback(MIDmaCallback callback, void *arg) +{ + if (callback) + { + (callback) (arg); + } +} + +#endif //NITRO_MI_DMA_H_ diff --git a/lib/include/nitro/mi/dma_shared.h b/lib/include/nitro/mi/dma_shared.h new file mode 100644 index 00000000..e839417a --- /dev/null +++ b/lib/include/nitro/mi/dma_shared.h @@ -0,0 +1,37 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include MI_dma.h from the specific proc's lib + */ + +#ifndef GUARD_DMA_SHARED_H +#define GUARD_DMA_SHARED_H + +#define REG_ADDR_DMA0SAD 0x040000b0 + +#define DMA_DEST_INC 0x0000 +#define DMA_DEST_DEC 0x0020 +#define DMA_DEST_FIXED 0x0040 +#define DMA_DEST_RELOAD 0x0060 +#define DMA_SRC_INC 0x0000 +#define DMA_SRC_DEC 0x0080 +#define DMA_SRC_FIXED 0x0100 +#define DMA_REPEAT 0x0200 +#define DMA_16BIT 0x0000 +#define DMA_32BIT 0x0400 +#define DMA_DREQ_ON 0x0800 +#define DMA_START_NOW 0x0000 +#define DMA_START_VBLANK 0x1000 +#define DMA_START_HBLANK 0x2000 +#define DMA_START_SPECIAL 0x3000 +#define DMA_START_MASK 0x3000 +#define DMA_INTR_ENABLE 0x4000 +#define DMA_ENABLE 0x8000 + +#endif diff --git a/lib/include/nitro/mi/exMemory.h b/lib/include/nitro/mi/exMemory.h new file mode 100644 index 00000000..47c0a331 --- /dev/null +++ b/lib/include/nitro/mi/exMemory.h @@ -0,0 +1,75 @@ +#ifndef NITRO_MI_EXMEMORY_H_ +#define NITRO_MI_EXMEMORY_H_ + +#include + +typedef enum { + MI_PROCESSOR_ARM9 = 0, + MI_PROCESSOR_ARM7 = 1 +} MIProcessor; + +typedef enum +{ + MI_CTRDG_ROMCYCLE1_10 = 0, + MI_CTRDG_ROMCYCLE1_8 = 1, + MI_CTRDG_ROMCYCLE1_6 = 2, + MI_CTRDG_ROMCYCLE1_18 = 3 +} MICartridgeRomCycle1st; + +typedef enum +{ + MI_CTRDG_ROMCYCLE2_6 = 0, + MI_CTRDG_ROMCYCLE2_4 = 1 +} MICartridgeRomCycle2nd; + +typedef enum +{ + MI_CTRDG_RAMCYCLE_10 = 0, + MI_CTRDG_RAMCYCLE_8 = 1, + MI_CTRDG_RAMCYCLE_6 = 2, + MI_CTRDG_RAMCYCLE_18 = 3 +} MICartridgeRamCycle; + +static inline void MIi_SetCardProcessor(MIProcessor proc) +{ + reg_MI_EXMEMCNT = + (u16)((reg_MI_EXMEMCNT & ~0x0800) | (proc << 11)); +} + +static inline void MIi_SetCartridgeProcessor(MIProcessor proc) +{ + reg_MI_EXMEMCNT = + (u16)((reg_MI_EXMEMCNT & ~0x0080) | (proc << 7)); +} + +static inline MICartridgeRomCycle1st MI_GetCartridgeRomCycle1st(void) +{ + return (MICartridgeRomCycle1st)((reg_MI_EXMEMCNT & 0xc) >> 2); +} + +static inline MICartridgeRomCycle2nd MI_GetCartridgeRomCycle2nd(void) +{ + return (MICartridgeRomCycle2nd)((reg_MI_EXMEMCNT & 0x10) >> 4); +} + +static inline void MI_SetCartridgeRomCycle1st(MICartridgeRomCycle1st c1) +{ + reg_MI_EXMEMCNT = (u16)((reg_MI_EXMEMCNT & ~0xc) | (c1 << 2)); +} + +static inline void MI_SetCartridgeRomCycle2nd(MICartridgeRomCycle2nd c2) +{ + reg_MI_EXMEMCNT = (u16)((reg_MI_EXMEMCNT & ~0x10) | (c2 << 4)); +} + +static inline void MI_SetCartridgeRamCycle(MICartridgeRamCycle c) +{ + reg_MI_EXMEMCNT = (u16)((reg_MI_EXMEMCNT & ~3) | (c << 0)); +} + +static inline MICartridgeRamCycle MI_GetCartridgeRamCycle(void) +{ + return (MICartridgeRamCycle)((reg_MI_EXMEMCNT & 3) >> 0); +} + +#endif //NITRO_MI_EXMEMORY_H_ diff --git a/lib/include/nitro/mi/memory.h b/lib/include/nitro/mi/memory.h new file mode 100644 index 00000000..bd53141e --- /dev/null +++ b/lib/include/nitro/mi/memory.h @@ -0,0 +1,57 @@ +#ifndef NITRO_MI_MEMORY_H +#define NITRO_MI_MEMORY_H + +#include + +void MIi_CpuClear16(register u16 value, register u16 * dst, register u32 size); +void MIi_CpuCopy16(const register u16 * src, register u16 * dst, register u32 size); +void MIi_CpuClear32(register u32 value, register u32 * dst, register u32 size); +void MIi_CpuCopy32(const register u32 * src, register u32 * dst, register u32 size); +void MIi_CpuClearFast(register u32 value, register u32 * dst, register u32 size); +void MIi_CpuCopyFast(const register u32 * src, register u32 * dst, register u32 size); +void MI_CpuFill8(void *dest, u8 data, u32 size); +void MI_CpuCopy8(const void * src, void * dst, u32 size); + +static inline void MI_CpuCopy16(const void *src, void *dst, u32 size) { + MIi_CpuCopy16(src, dst, size); +} + +static inline void MI_CpuClear16(void *dest, u32 size) { + MIi_CpuClear16(0, dest, size); +} + +static inline void MI_CpuFill16(void *dest, u16 data, u32 size) { + MIi_CpuClear16(data, dest, size); +} + +static inline void MI_CpuFill32(void *dest, u32 data, u32 size) { + MIi_CpuClear32(data, dest, size); +} + +static inline void MI_CpuClear32(void *dest, u32 size) { + MI_CpuFill32(dest, 0, size); +} + +static inline void MI_CpuCopy32(const void *src, void *dst, u32 size) { + MIi_CpuCopy32((u32 *)src, (u32 *)dst, size); +} + +static inline void MI_CpuClearFast(void *dst, u32 size) { + MIi_CpuClearFast(0, dst, size); +} + +static inline void MI_CpuCopyFast(const void *src, void *dst, u32 size) { + MIi_CpuCopyFast(src, dst, size); +} + +static inline void MI_CpuFillFast(void *dst, int data, u32 size) { + MIi_CpuClearFast(data, dst, size); +} + +static inline void MI_CpuClear8(void *dst, u32 size) { + MI_CpuFill8(dst, 0, size); +} + +void MI_Copy36B(const void *pSrc, void *pDst); + +#endif //NITRO_MI_MEMORY_H diff --git a/lib/include/nitro/mi/swap.h b/lib/include/nitro/mi/swap.h new file mode 100644 index 00000000..51c44d0b --- /dev/null +++ b/lib/include/nitro/mi/swap.h @@ -0,0 +1,7 @@ +#ifndef NITRO_SWAP_H_ +#define NITRO_SWAP_H_ + +u32 MI_SwapWord(u32 setData, vu32 *destp); +u8 MI_SwapByte(u32 setData, vu8 *destp); + +#endif //NITRO_SWAP_H_ diff --git a/lib/include/nitro/mi/uncompress.h b/lib/include/nitro/mi/uncompress.h new file mode 100644 index 00000000..0ad7aa70 --- /dev/null +++ b/lib/include/nitro/mi/uncompress.h @@ -0,0 +1,10 @@ +#ifndef NITRO_MI_UNCOMPRESS_H_ +#define NITRO_MI_UNCOMPRESS_H_ + +void MI_UncompressLZ8(const void *srcp, void *destp); + +static inline u32 MI_GetUncompressedSize(const void *srcp) { + return (*(u32 *)srcp >> 8); +} + +#endif //NITRO_MI_UNCOMPRESS_H_ diff --git a/lib/include/nitro/os.h b/lib/include/nitro/os.h new file mode 100644 index 00000000..96a89a80 --- /dev/null +++ b/lib/include/nitro/os.h @@ -0,0 +1,46 @@ +#ifndef NITRO_OS_H_ +#define NITRO_OS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SDK_ARM9 +#include +#include +#include +#include +#include +#endif //SDK_ARM9 + +#endif //NITRO_OS_H_ diff --git a/lib/include/nitro/os/ARM7/alarm.h b/lib/include/nitro/os/ARM7/alarm.h new file mode 100644 index 00000000..05a2cfe1 --- /dev/null +++ b/lib/include/nitro/os/ARM7/alarm.h @@ -0,0 +1,16 @@ +/* + * NOTE: + * This file is specific to ARM7 + * DO NOT PUT SHARED/ARM9 CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include instead! + */ + +#ifndef NITRO_OS_ARM7_ALARM_H +#define NITRO_OS_ARM7_ALARM_H + +#endif //NITRO_OS_ARM7_ALARM_H diff --git a/lib/include/nitro/os/ARM7/interrupt.h b/lib/include/nitro/os/ARM7/interrupt.h new file mode 100644 index 00000000..81bd0b34 --- /dev/null +++ b/lib/include/nitro/os/ARM7/interrupt.h @@ -0,0 +1,28 @@ +/* + * NOTE: + * This file is specific to ARM7 + * DO NOT PUT SHARED/ARM9 CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include instead! + */ + +#ifndef NITRO_OS_ARM7_INTERRUPT_H +#define NITRO_OS_ARM7_INTERRUPT_H + +#include + +extern OSIrqFunction OS_IRQTable[]; +extern OSIrqCallbackInfo OSi_IrqCallbackInfo[9]; + +#define OS_IE_FIFO_RECV (1UL << REG_OS_IE_IFN_SHIFT) + +static inline void OSi_SetVBlankCount(u32 count) +{ + *(u32 *)HW_VBLANK_COUNT_BUF = count; +} + +#endif //NITRO_OS_ARM7_INTERRUPT_H diff --git a/lib/include/nitro/os/ARM7/system.h b/lib/include/nitro/os/ARM7/system.h new file mode 100644 index 00000000..0d333e12 --- /dev/null +++ b/lib/include/nitro/os/ARM7/system.h @@ -0,0 +1,10 @@ +#ifndef NITRO_OS_ARM7_SYSTEM_H +#define NITRO_OS_ARM7_SYSTEM_H + +#include + +static inline void OS_Halt(void) { + SVC_Halt(); +} + +#endif //NITRO_OS_ARM7_SYSTEM_H diff --git a/lib/include/nitro/os/ARM9/system.h b/lib/include/nitro/os/ARM9/system.h new file mode 100644 index 00000000..2a716fc6 --- /dev/null +++ b/lib/include/nitro/os/ARM9/system.h @@ -0,0 +1,6 @@ +#ifndef NITRO_OS_ARM9_SYSTEM_H +#define NITRO_OS_ARM9_SYSTEM_H + +extern void OS_Halt(void); + +#endif //NITRO_OS_ARM9_SYSTEM_H diff --git a/lib/include/nitro/os/ARM9/vramExclusive.h b/lib/include/nitro/os/ARM9/vramExclusive.h new file mode 100644 index 00000000..6284fec5 --- /dev/null +++ b/lib/include/nitro/os/ARM9/vramExclusive.h @@ -0,0 +1,22 @@ +#ifndef NITRO_OS_VRAMEXCLUSIVE_H_ +#define NITRO_OS_VRAMEXCLUSIVE_H_ + +#define OS_VRAM_BANK_ID_A 0x0001 +#define OS_VRAM_BANK_ID_B 0x0002 +#define OS_VRAM_BANK_ID_C 0x0004 +#define OS_VRAM_BANK_ID_D 0x0008 +#define OS_VRAM_BANK_ID_E 0x0010 +#define OS_VRAM_BANK_ID_F 0x0020 +#define OS_VRAM_BANK_ID_G 0x0040 +#define OS_VRAM_BANK_ID_H 0x0080 +#define OS_VRAM_BANK_ID_I 0x0100 +#define OS_VRAM_BANK_ID_ALL 0x01ff + +#define OS_VRAM_BANK_KINDS 9 + +u32 OsCountZeroBits(u32 bitmap); +void OSi_InitVramExclusive(void); +BOOL OSi_TryLockVram(u16 bank, u16 lockId); +void OSi_UnlockVram(u16 bank, u16 lockId); + +#endif //NITRO_OS_VRAMEXCLUSIVE_H_ diff --git a/lib/include/nitro/os/alarm.h b/lib/include/nitro/os/alarm.h new file mode 100644 index 00000000..bd9a326d --- /dev/null +++ b/lib/include/nitro/os/alarm.h @@ -0,0 +1,22 @@ +#ifndef NITRO_OS_ALARM_H +#define NITRO_OS_ALARM_H + +#include +#include + +#ifdef SDK_ARM7 +#include +#endif + +struct OSiAlarmQueue +{ + OSAlarm *head; + OSAlarm *tail; +}; +struct OSiAlarmQueue *OSi_GetAlarmQueue(void); + +void OSi_SetTimer(OSAlarm *alarm); +void OS_InitAlarm(void); +void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire); + +#endif //NITRO_OS_ALARM_H diff --git a/lib/include/nitro/os/alloc.h b/lib/include/nitro/os/alloc.h new file mode 100644 index 00000000..eb0ecb92 --- /dev/null +++ b/lib/include/nitro/os/alloc.h @@ -0,0 +1,17 @@ +#ifndef NITRO_OS_ALLOC_H +#define NITRO_OS_ALLOC_H + +#include +#include + +Cell *DLExtract(Cell *list, Cell *cell); +Cell *DLInsert(Cell *list, Cell *cell); +void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size); +void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr); +OSHeapHandle OS_SetCurrentHeap(OSArenaId id, OSHeapHandle heap); +void *OS_InitAlloc(OSArenaId id, void *arenaStart, void *arenaEnd, s32 maxHeaps); +void OS_ClearAlloc(OSArenaId id); +OSHeapHandle OS_CreateHeap(OSArenaId id, void *start, void *end); +s32 OS_CheckHeap(OSArenaId id, OSHeapHandle heap); + +#endif //NITRO_OS_ALLOC_H diff --git a/lib/include/nitro/os/arena.h b/lib/include/nitro/os/arena.h new file mode 100644 index 00000000..a67f642e --- /dev/null +++ b/lib/include/nitro/os/arena.h @@ -0,0 +1,17 @@ +#ifndef NITRO_OS_ARENA_H +#define NITRO_OS_ARENA_H + +#include + +void OS_InitArena(void); +void OS_InitArenaHiAndLo(OSArenaId id); +void* OS_GetArenaHi(OSArenaId id); +void* OS_GetArenaLo(OSArenaId id); +void* OS_GetInitArenaHi(OSArenaId id); +void* OS_GetInitArenaLo(OSArenaId id); +void OS_SetArenaHi(OSArenaId id, void* newHi); +void OS_SetArenaLo(OSArenaId id, void* newLo); +void *OS_AllocFromArenaHi(OSArenaId arena, u32 size, u32 align); +void *OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align); + +#endif //NITRO_OS_ARENA_H diff --git a/lib/include/nitro/os/cache.h b/lib/include/nitro/os/cache.h new file mode 100644 index 00000000..a6a62cd2 --- /dev/null +++ b/lib/include/nitro/os/cache.h @@ -0,0 +1,14 @@ +#ifndef NITRO_OS_CACHE_H_ +#define NITRO_OS_CACHE_H_ + +void DC_FlushAll(void); +void DC_InvalidateRange(register void * startAddr, register u32 nBytes); +void DC_StoreRange(register void * startAddr, register u32 nBytes); +void DC_InvalidateAll(void); +void DC_StoreAll(void); +void IC_InvalidateAll(void); +void IC_InvalidateRange(register void *startAddr, register u32 nBytes); +void DC_WaitWriteBufferEmpty(void); +void DC_FlushRange(const void *data, u32 size); + +#endif //NITRO_OS_CACHE_H_ diff --git a/lib/include/nitro/os/common/alarm_shared.h b/lib/include/nitro/os/common/alarm_shared.h new file mode 100644 index 00000000..d7836ed2 --- /dev/null +++ b/lib/include/nitro/os/common/alarm_shared.h @@ -0,0 +1,42 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_alarm.h from the specific proc's lib + */ + +#ifndef NITRO_OS_ALARM_SHARED_H +#define NITRO_OS_ALARM_SHARED_H + +#include +#include +#include + +typedef void (*OSAlarmHandler) (void *); + +struct OSiAlarm +{ + OSAlarmHandler handler; + void *arg; + + u32 tag; + OSTick fire; + OSAlarm *prev; + OSAlarm *next; + + OSTick period; + OSTick start; +}; + +void OS_CreateAlarm(OSAlarm *alarm); +void OS_CancelAlarm(OSAlarm *alarm); +BOOL OS_IsAlarmAvailable(void); +void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg); +void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg); + +#endif //NITRO_OS_ALARM_SHARED_H diff --git a/lib/include/nitro/os/common/alloc_shared.h b/lib/include/nitro/os/common/alloc_shared.h new file mode 100644 index 00000000..875ed3fe --- /dev/null +++ b/lib/include/nitro/os/common/alloc_shared.h @@ -0,0 +1,42 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_alloc.h from the specific proc's lib + */ + +#ifndef NITRO_OS_ALLOC_SHARED_H +#define NITRO_OS_ALLOC_SHARED_H + +#include + +typedef s32 OSHeapHandle; + +typedef struct Cell Cell; + +struct Cell { + Cell* prev; + Cell* next; + long size; +}; + +typedef struct { + long size; + Cell *free; + Cell *allocated; +} HeapDesc; + +typedef struct { + volatile OSHeapHandle currentHeap; + int numHeaps; + void* arenaStart; + void* arenaEnd; + HeapDesc* heapArray; +} OSHeapInfo; + +#endif //NITRO_OS_ALLOC_SHARED_H diff --git a/lib/include/nitro/os/common/arena_shared.h b/lib/include/nitro/os/common/arena_shared.h new file mode 100644 index 00000000..a9a1d04a --- /dev/null +++ b/lib/include/nitro/os/common/arena_shared.h @@ -0,0 +1,39 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_arena.h from the specific proc's lib + */ + +#ifndef NITRO_OS_ARENA_SHARED_H +#define NITRO_OS_ARENA_SHARED_H + +#include +#include + +typedef enum { + OS_ARENA_MAIN = 0, + OS_ARENA_MAIN_SUBPRIV = 1, + OS_ARENA_MAINEX = 2, + OS_ARENA_ITCM = 3, + OS_ARENA_DTCM = 4, + OS_ARENA_SHARED = 5, + OS_ARENA_WRAM_MAIN = 6, + OS_ARENA_WRAM_SUB = 7, + OS_ARENA_WRAM_SUBPRIV = 8, + OS_ARENA_MAX = 9 +} OSArenaId; + +typedef struct { + void* lo[OS_ARENA_MAX]; + void* hi[OS_ARENA_MAX]; + u16 initialized; + u8 padding[2]; +} OSArenaInfo; + +#endif //NITRO_OS_ARENA_SHARED_H diff --git a/lib/include/nitro/os/common/armArch.h b/lib/include/nitro/os/common/armArch.h new file mode 100644 index 00000000..c831af44 --- /dev/null +++ b/lib/include/nitro/os/common/armArch.h @@ -0,0 +1,37 @@ +#ifndef NITRO_OS_COMMON_ARMARCH_H_ +#define NITRO_OS_COMMON_ARMARCH_H_ + +#define HW_PSR_CPU_MODE_MASK 0x1f + +#define HW_PSR_USER_MODE 0x10 +#define HW_PSR_FIQ_MODE 0x11 +#define HW_PSR_IRQ_MODE 0x12 +#define HW_PSR_SVC_MODE 0x13 +#define HW_PSR_ABORT_MODE 0x17 +#define HW_PSR_UNDEF_MODE 0x1b +#define HW_PSR_SYS_MODE 0x1f + +#define HW_PSR_ARM_STATE 0x0 +#define HW_PSR_THUMB_STATE 0x20 + +#define HW_PSR_FIQ_DISABLE 0x40 +#define HW_PSR_IRQ_DISABLE 0x80 +#define HW_PSR_IRQ_FIQ_DISABLE 0xc0 + +#define HW_PSR_Q_FLAG 0x08000000 +#define HW_PSR_V_FLAG 0x10000000 +#define HW_PSR_C_FLAG 0x20000000 +#define HW_PSR_Z_FLAG 0x40000000 +#define HW_PSR_N_FLAG 0x80000000 + +#define HW_C7_ICACHE_INDEX_MASK 0x00000fe0 +#define HW_C7_DCACHE_INDEX_MASK 0x000003e0 +#define HW_C7_CACHE_SET_NO_MASK 0xc0000000 + +#define HW_C7_CACHE_INDEX_SHIFT 5 +#define HW_C7_CACHE_SET_NO_SHIFT 30 + +#define HW_CPU_CLOCK_ARM7 33513982 +#define HW_CPU_CLOCK_ARM9 67027964 + +#endif //NITRO_OS_COMMON_ARMARCH_H_ diff --git a/lib/include/nitro/os/common/entropy.h b/lib/include/nitro/os/common/entropy.h new file mode 100644 index 00000000..47d81fe7 --- /dev/null +++ b/lib/include/nitro/os/common/entropy.h @@ -0,0 +1,7 @@ +#ifndef NITRO_OS_COMMON_ENTROPY_H_ +#define NITRO_OS_COMMON_ENTROPY_H_ + +#define OS_LOW_ENTROPY_DATA_SIZE 32 +void OS_GetLowEntropyData(u32 buffer[OS_LOW_ENTROPY_DATA_SIZE / sizeof(u32)]); + +#endif //NITRO_OS_COMMON_ENTROPY_H_ diff --git a/lib/include/nitro/os/common/interrupt_shared.h b/lib/include/nitro/os/common/interrupt_shared.h new file mode 100644 index 00000000..c5b6093d --- /dev/null +++ b/lib/include/nitro/os/common/interrupt_shared.h @@ -0,0 +1,49 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_interrupt.h from the specific proc's lib + */ + +#ifndef NITRO_OS_INTERRUPT_SHARED_H +#define NITRO_OS_INTERRUPT_SHARED_H + +#include + +typedef u32 OSIrqMask; + +typedef void (*OSIrqFunction) (void); + +#define OS_IE_VBLANK (1UL << REG_OS_IE_VB_SHIFT) +#define OS_IE_HBLANK (1UL << REG_OS_IE_HB_SHIFT) +#define OS_IE_V_COUNT (1UL << REG_OS_IE_VE_SHIFT) +#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT) +#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT) +#define OS_IE_TIMER2 (1UL << REG_OS_IE_T2_SHIFT) +#define OS_IE_TIMER3 (1UL << REG_OS_IE_T3_SHIFT) +#define OS_IE_SIO (1UL << 7 ) +#define OS_IE_DMA0 (1UL << REG_OS_IE_D0_SHIFT) +#define OS_IE_DMA1 (1UL << REG_OS_IE_D1_SHIFT) +#define OS_IE_DMA2 (1UL << REG_OS_IE_D2_SHIFT) +#define OS_IE_DMA3 (1UL << REG_OS_IE_D3_SHIFT) +#define OS_IE_KEY (1UL << REG_OS_IE_K_SHIFT) +#define OS_IE_CARTRIDGE (1UL << REG_OS_IE_I_D_SHIFT) +#define OS_IE_SUBP (1UL << REG_OS_IE_A7_SHIFT) +#define OS_IE_SPFIFO_SEND (1UL << REG_OS_IE_IFE_SHIFT) +#define OS_IE_SPFIFO_RECV (1UL << REG_OS_IE_IFN_SHIFT) +#define OS_IE_CARD_DATA (1UL << REG_OS_IE_MC_SHIFT) +#define OS_IE_CARD_IREQ (1UL << REG_OS_IE_MI_SHIFT) + +typedef struct +{ + void (*func) (void *); + u32 enable; + void* arg; +} OSIrqCallbackInfo; + +#endif //NITRO_OS_INTERRUPT_SHARED_H diff --git a/lib/include/nitro/os/common/message_shared.h b/lib/include/nitro/os/common/message_shared.h new file mode 100644 index 00000000..87167916 --- /dev/null +++ b/lib/include/nitro/os/common/message_shared.h @@ -0,0 +1,34 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_message.h from the specific proc's lib + */ + +#ifndef NITRO_OS_MESSAGE_SHARED_H +#define NITRO_OS_MESSAGE_SHARED_H + +#include +#include + +typedef void *OSMessage; + +#define OS_MESSAGE_NOBLOCK 0 +#define OS_MESSAGE_BLOCK 1 + +typedef struct OSMessageQueue +{ + OSThreadQueue queueSend; + OSThreadQueue queueReceive; + OSMessage *msgArray; + s32 msgCount; + s32 firstIndex; + s32 usedCount; +} OSMessageQueue; + +#endif //NITRO_OS_MESSAGE_SHARED_H diff --git a/lib/include/nitro/os/common/mutex_shared.h b/lib/include/nitro/os/common/mutex_shared.h new file mode 100644 index 00000000..3cbabefc --- /dev/null +++ b/lib/include/nitro/os/common/mutex_shared.h @@ -0,0 +1,26 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_mutex.h from the specific proc's lib + */ + +#ifndef NITRO_OS_MUTEX_SHARED_H +#define NITRO_OS_MUTEX_SHARED_H + +#include +#include + +struct OSMutex { + OSThreadQueue queue; + OSThread *thread; + s32 count; + OSMutexLink link; +}; + +#endif //NITRO_OS_MUTEX_SHARED_H diff --git a/lib/include/nitro/os/common/reset_shared.h b/lib/include/nitro/os/common/reset_shared.h new file mode 100644 index 00000000..414e51e4 --- /dev/null +++ b/lib/include/nitro/os/common/reset_shared.h @@ -0,0 +1,23 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_reset.h from the specific proc's lib + */ + +#ifndef NITRO_OS_RESET_SHARED_H +#define NITRO_OS_RESET_SHARED_H + +#define OS_PXI_COMMAND_MASK 0x7f00 +#define OS_PXI_COMMAND_SHIFT 8 +#define OS_PXI_COMMAND_RESET 0x10 + +#define OS_PXI_DATA_MASK 0xFF +#define OS_PXI_DATA_SHIFT 0 + +#endif //NITRO_OS_RESET_SHARED_H diff --git a/lib/include/nitro/os/common/spinLock_shared.h b/lib/include/nitro/os/common/spinLock_shared.h new file mode 100644 index 00000000..3f8d7663 --- /dev/null +++ b/lib/include/nitro/os/common/spinLock_shared.h @@ -0,0 +1,24 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_spinLock.h from the specific proc's lib + */ + +#ifndef NITRO_OS_SPINLOCK_SHARED_H_ +#define NITRO_OS_SPINLOCK_SHARED_H_ + +#include + +typedef volatile struct OSLockWord { + u32 lockFlag; + u16 ownerID; + u16 extension; +} OSLockWord; + +#endif //NITRO_OS_SPINLOCK_SHARED_H_ diff --git a/lib/include/nitro/os/common/systemWork_shared.h b/lib/include/nitro/os/common/systemWork_shared.h new file mode 100644 index 00000000..8ab3f57f --- /dev/null +++ b/lib/include/nitro/os/common/systemWork_shared.h @@ -0,0 +1,65 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include consts.h from the specific proc's lib + */ + +#ifndef NITRO_OS_SYSTEMWORK_SHARED_H_ +#define NITRO_OS_SYSTEMWORK_SHARED_H_ + +#include +#include +#include + +typedef struct { + u8 bootCheckInfo[0x20]; // 000-01f: 32byte boot check info + u32 resetParameter; // 020-023: 4byte reset parameter + u8 padding5[0x8]; // 024-02c: (8byte) + u32 romBaseOffset; // 02c-02f: 4byte ROM offset of own program + u8 cartridgeModuleInfo[12]; // 030-03b: 12byte cartridge module info + u32 vblankCount; // 03c-03f: 4byte V-Blank Count + u8 wmBootBuf[0x40]; // 040-07f: 64byte WM multiboot buffer + u8 nvramUserInfo[0x100]; // 080-17f: 256bytes NVRAM user info + u8 isd_reserved1[0x20]; // 180-19f: 32bytes ISDebugger reserved + u8 arenaInfo[0x48]; // 1a0-1e7: 72byte Arena information + u8 real_time_clock[8]; // 1e8-1ef: 8bytes RTC + u32 dmaClearBuf[4]; // 1f0-1ff: 16bytes DMA clear information buffer (for ARM9-TEG) + u8 rom_header[0x160]; // 200-35f: 352bytes ROM registration area info storage buffer + u8 isd_reserved2[32]; // 360-37f: 32bytes ISDebugger reserved + u32 pxiSignalParam[2]; // 380-387: 8bytes Param for PXI Signal + u32 pxiHandleChecker[2]; // 388-38f: 8bytes Flag for PXI Command Handler Installed + u32 mic_last_address; // 390-393: 4bytes MIC latest sampling result storage address + u16 mic_sampling_data; // 394-395: 2bytes MIC sampling result + u16 wm_callback_control; // 396-397: 2bytes Parameter for WM callback synchronization + u16 wm_rssi_pool; // 398-399: 2bytes Random number source depends on WM received signal intensity + u8 padding3[2]; // 39a-39b: (2bytes) + u32 component_param; // 39c-39f: 4bytes Parameter for Component synchronization + OSThreadInfo *threadinfo_mainp; // 3a0-3a3: 4bytes Verify that the pointer to ARM9 thread information is initial value 0 + OSThreadInfo *threadinfo_subp; // 3a4-3a7: 4bytes Verify that the pointer to ARM7 thread information is initial value 0 + u16 button_XY; // 3a8-3a9: 2bytes XY button information storage location + u8 touch_panel[4]; // 3aa-3ad: 4bytes Touch Screen information storage location + u16 autoloadSync; // 3ae-3af: 2bytes autoload sync between processors + u32 lockIDFlag_mainp[2]; // 3b0-3b7: 8bytes lockID management flag (ARM9) + u32 lockIDFlag_subp[2]; // 3b8-3bf: 8bytes lockID management flag (ARM7) + struct OSLockWord lock_VRAM_C; // 3c0-3c7: 8bytes C - lock buffer + struct OSLockWord lock_VRAM_D; // 3c8-3cf: 8bytes VRAM-D - lock buffer + struct OSLockWord lock_WRAM_BLOCK0; // 3d0-3d7: 8bytes Block0 - lock buffer + struct OSLockWord lock_WRAM_BLOCK1; // 3d8-3df: 8bytes CPU internal work RAM - Block1 - lock buffer + struct OSLockWord lock_CARD; // 3e0-3e7: 8bytes Game Card - lock buffer + struct OSLockWord lock_CARTRIDGE; // 3e8-3ef: 8bytes DS Pak - lock buffer + struct OSLockWord lock_INIT; // 3f0-3f7: 8bytes Initialization lock buffer + u16 mmem_checker_mainp; // 3f8-3f9: 2bytes MainMomory Size Checker for System processor + u16 mmem_checker_subp; // 3fa-3fb: 2bytes MainMomory Size Checker for Sub processor + u8 padding4[2]; // 3fc-3fd: (2bytes) + u16 command_area; // 3fe-3ff: 2bytes Command Area +} OSSystemWork; //0x027FFC00 + +#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM) + +#endif //NITRO_OS_SYSTEMWORK_SHARED_H_ diff --git a/lib/include/nitro/os/common/system_shared.h b/lib/include/nitro/os/common/system_shared.h new file mode 100644 index 00000000..2352a3b9 --- /dev/null +++ b/lib/include/nitro/os/common/system_shared.h @@ -0,0 +1,39 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_system.h from the specific proc's lib + */ + +#ifndef NITRO_OS_SYSTEM_SHARED_H_ +#define NITRO_OS_SYSTEM_SHARED_H_ + +#include + +typedef enum { + OS_PROCMODE_USER=16, + OS_PROCMODE_FIQ=17, + OS_PROCMODE_IRQ=18, + OS_PROCMODE_SVC=19, + OS_PROCMODE_ABORT=23, + OS_PROCMODE_UNDEF=27, + OS_PROCMODE_SYS=31 +} OSProcMode; + +typedef enum { + OS_INTRMODE_DISABLE_IRQ = HW_PSR_DISABLE_IRQ, + OS_INTRMODE_DISABLE_FIQ = HW_PSR_DISABLE_FIQ, + OS_INTRMODE_ENABLE = 0 +} OSIntrMode; + +typedef enum { + OS_INTRMODE_IRQ_DISABLE = HW_PSR_DISABLE_IRQ, + OS_INTRMODE_IRQ_ENABLE = 0 +} OSIntrMode_Irq; + +#endif //NITRO_OS_SYSTEM_SHARED_H_ diff --git a/lib/include/nitro/os/common/thread_shared.h b/lib/include/nitro/os/common/thread_shared.h new file mode 100644 index 00000000..c6f39766 --- /dev/null +++ b/lib/include/nitro/os/common/thread_shared.h @@ -0,0 +1,126 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_thread.h from the specific proc's lib + */ + +#ifndef NITRO_OS_THREAD_SHARED_H_ +#define NITRO_OS_THREAD_SHARED_H_ + +typedef struct OSiAlarm OSAlarm; + +typedef struct _OSThread OSThread; + +typedef struct _OSThreadQueue OSThreadQueue; +typedef struct _OSThreadLink OSThreadLink; +typedef struct _OSMutexQueue OSMutexQueue; +typedef struct _OSMutexLink OSMutexLink; +typedef struct OSMutex OSMutex; + +struct _OSThreadQueue +{ + OSThread *head; + OSThread *tail; +}; + +struct _OSThreadLink +{ + OSThread *prev; + OSThread *next; +}; + +struct _OSMutexQueue +{ + OSMutex *head; + OSMutex *tail; +}; + +struct _OSMutexLink +{ + OSMutex *next; + OSMutex *prev; +}; + +typedef struct OSThreadInfo { + u16 isNeedRescheduling; + u16 irqDepth; + OSThread* current; + OSThread* list; + void* switchCallback; // type: OSSwitchThreadCallback +} OSThreadInfo; + +typedef enum { + OS_THREAD_STATE_WAITING = 0, + OS_THREAD_STATE_READY = 1, + OS_THREAD_STATE_TERMINATED = 2 +} OSThreadState; + +typedef void (*OSSwitchThreadCallback) (OSThread *from, OSThread *to); + +typedef void (*OSThreadDestructor) (void *); + +struct _OSThread +{ + OSContext context; + OSThreadState state; + OSThread *next; + u32 id; + u32 priority; + void *profiler; + + OSThreadQueue *queue; + OSThreadLink link; + + OSMutex *mutex; + OSMutexQueue mutexQueue; + + u32 stackTop; + u32 stackBottom; + u32 stackWarningOffset; + + OSThreadQueue joinQueue; + + void *specific[3]; + OSAlarm *alarmForSleep; + OSThreadDestructor destructor; + void *userParameter; + + u32 systemErrno; +}; + +extern OSThreadInfo OSi_ThreadInfo; + +static inline OSThreadInfo *OS_GetThreadInfo(void) +{ + return &OSi_ThreadInfo; +} + +static inline BOOL OS_IsThreadRunnable(const OSThread *thread) +{ + return thread->state == OS_THREAD_STATE_READY; +} + +static inline void OS_InitThreadQueue(OSThreadQueue * queue) +{ + queue->head = queue->tail = NULL; +} + +static inline OSThread *OS_GetCurrentThread(void) +{ + return OS_GetThreadInfo()->current; +} + +static inline void OS_SetCurrentThread(OSThread *thread) +{ + OS_GetThreadInfo()->current = thread; +} + +#define OSi_GetCurrentThread() (*OSi_CurrentThreadPtr) + +#endif //NITRO_OS_THREAD_SHARED_H_ diff --git a/lib/include/nitro/os/common/tick_shared.h b/lib/include/nitro/os/common/tick_shared.h new file mode 100644 index 00000000..8135c728 --- /dev/null +++ b/lib/include/nitro/os/common/tick_shared.h @@ -0,0 +1,24 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_tick.h from the specific proc's lib + */ + +#ifndef NITRO_OS_TICK_SHARED_H +#define NITRO_OS_TICK_SHARED_H + +#include + +typedef u64 OSTick; + +#define OS_SYSTEM_CLOCK HW_SYSTEM_CLOCK + +#define OS_MilliSecondsToTicks(msec) ((OSTick)(((OS_SYSTEM_CLOCK/1000) * (u64)(msec)) / 64)) + +#endif //NITRO_OS_TICK_SHARED_H diff --git a/lib/include/nitro/os/common/timer_shared.h b/lib/include/nitro/os/common/timer_shared.h new file mode 100644 index 00000000..48d5485f --- /dev/null +++ b/lib/include/nitro/os/common/timer_shared.h @@ -0,0 +1,32 @@ +#ifndef NITRO_OS_TIMER_SHARED_H +#define NITRO_OS_TIMER_SHARED_H + +#include + +typedef enum +{ + OS_TIMER_PRESCALER_1 = (0UL << REG_OS_TM0CNT_H_PS_SHIFT), + OS_TIMER_PRESCALER_64 = (1UL << REG_OS_TM0CNT_H_PS_SHIFT), + OS_TIMER_PRESCALER_256 = (2UL << REG_OS_TM0CNT_H_PS_SHIFT), + OS_TIMER_PRESCALER_1024 = (3UL << REG_OS_TM0CNT_H_PS_SHIFT) +} OSTimerPrescaler; + +typedef enum +{ + OS_TIMER_0 = 0, + OS_TIMER_1 = 1, + OS_TIMER_2 = 2, + OS_TIMER_3 = 3 +} OSTimer; + +static inline void OS_SetTimerCount(OSTimer id, u16 count) +{ + *((REGType16 *)((u32)®_OS_TM0CNT_L + id * 4)) = count; +} + +static inline void OS_SetTimerControl(OSTimer id, u16 control) +{ + *((REGType16 *)((u32)®_OS_TM0CNT_H + id * 4)) = control; +} + +#endif //NITRO_OS_TIMER_SHARED_H diff --git a/lib/include/nitro/os/context.h b/lib/include/nitro/os/context.h new file mode 100644 index 00000000..d9e79024 --- /dev/null +++ b/lib/include/nitro/os/context.h @@ -0,0 +1,67 @@ +#ifndef NITRO_OS_CONTEXT_H_ +#define NITRO_OS_CONTEXT_H_ + +#include + +#ifdef SDK_ARM9 +#include +#endif + +#define SDK_CONTEXT_HAS_SP_SVC + +// All the context functions are plain ASM, +// so these offsets are defined for readibility. +#define OS_CONTEXT_CPSR 0 +#define OS_CONTEXT_R0 4 +#define OS_CONTEXT_R1 8 +#define OS_CONTEXT_R2 12 +#define OS_CONTEXT_R3 16 +#define OS_CONTEXT_R4 20 +#define OS_CONTEXT_R5 24 +#define OS_CONTEXT_R6 28 +#define OS_CONTEXT_R7 32 +#define OS_CONTEXT_R8 36 +#define OS_CONTEXT_R9 40 +#define OS_CONTEXT_R10 44 +#define OS_CONTEXT_R11 48 +#define OS_CONTEXT_R12 52 +#define OS_CONTEXT_R13 56 +#define OS_CONTEXT_R14 60 +#define OS_CONTEXT_PC_PLUS4 64 + +#define OS_CONTEXT_SP OS_CONTEXT_R13 +#define OS_CONTEXT_LR OS_CONTEXT_R14 + +#ifdef SDK_CONTEXT_HAS_SP_SVC +#define OS_CONTEXT_R13_SVC 68 +#define OS_CONTEXT_SP_SVC OS_CONTEXT_R13_SVC +#endif + +#ifdef SDK_ARM9 +#ifdef SDK_CONTEXT_HAS_SP_SVC +#define OS_CONTEXT_CP_CONTEXT 72 +#else +#define OS_CONTEXT_CP_CONTEXT 68 +#endif +#endif + +typedef struct OSContext +{ + u32 cpsr; + u32 r[13]; + u32 sp; + u32 lr; + u32 pc_plus4; +#ifdef SDK_CONTEXT_HAS_SP_SVC + u32 sp_svc; +#endif +#ifdef SDK_ARM9 + CPContext cp_context; +#endif +} OSContext; + +void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp); +BOOL OS_SaveContext(register OSContext *context); +void OS_LoadContext(register OSContext *context); + +#endif //NITRO_OS_CONTEXT_H_ diff --git a/lib/include/nitro/os/emulator.h b/lib/include/nitro/os/emulator.h new file mode 100644 index 00000000..de01fdd5 --- /dev/null +++ b/lib/include/nitro/os/emulator.h @@ -0,0 +1,7 @@ +#ifndef NITRO_OS_EMULATOR_H_ +#define NITRO_OS_EMULATOR_H_ + +BOOL OS_IsRunOnEmulator(void); +u32 OS_GetConsoleType(void); + +#endif //NITRO_OS_EMULATOR_H_ diff --git a/lib/include/nitro/os/exception.h b/lib/include/nitro/os/exception.h new file mode 100644 index 00000000..a211e3c8 --- /dev/null +++ b/lib/include/nitro/os/exception.h @@ -0,0 +1,8 @@ +#ifndef NITRO_OS_EXCEPTION_H_ +#define NITRO_OS_EXCEPTION_H_ + +typedef void (*OSExceptionHandler) (u32, void *); + +void OS_InitException(void); + +#endif //NITRO_OS_EXCEPTION_H_ diff --git a/lib/include/nitro/os/init.h b/lib/include/nitro/os/init.h new file mode 100644 index 00000000..f3a02d01 --- /dev/null +++ b/lib/include/nitro/os/init.h @@ -0,0 +1,23 @@ +#ifndef NITRO_SUB_OS_INIT_H +#define NITRO_SUB_OS_INIT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void OSi_WaitVCount0(void); +void OS_Init(void); +void OS_InitArenaEx(void); + +#endif //NITRO_SUB_OS_INIT_H diff --git a/lib/include/nitro/os/interrupt.h b/lib/include/nitro/os/interrupt.h new file mode 100644 index 00000000..d5101e2d --- /dev/null +++ b/lib/include/nitro/os/interrupt.h @@ -0,0 +1,88 @@ +#ifndef NITRO_SUB_OS_INTERRUPT_H +#define NITRO_SUB_OS_INTERRUPT_H + +#include +#include + +#define OS_IME_DISABLE (0UL << REG_OS_IME_IME_SHIFT) +#define OS_IME_ENABLE (1UL << REG_OS_IME_IME_SHIFT) + +#ifdef SDK_ARM7 +#include +#define OS_IRQ_TABLE_MAX 25 +#else // SDK_ARM9 +//#include +#define OS_IRQ_TABLE_MAX 22 +#endif //SDK_ARM7 SDK_ARM9 + +#define OSi_IRQCALLBACK_NO_DMA0 0 +#define OSi_IRQCALLBACK_NO_DMA1 1 +#define OSi_IRQCALLBACK_NO_DMA2 2 +#define OSi_IRQCALLBACK_NO_DMA3 3 +#define OSi_IRQCALLBACK_NO_TIMER0 4 +#define OSi_IRQCALLBACK_NO_TIMER1 5 +#define OSi_IRQCALLBACK_NO_TIMER2 6 +#define OSi_IRQCALLBACK_NO_TIMER3 7 +#ifdef SDK_ARM7 +#define OSi_IRQCALLBACK_NO_VBLANK 8 +#endif //SDK_ARM7 +#ifdef SDK_ARM9 +#define OSi_IRQCALLBACK_NUM (7+1) +#else // SDK_ARM7 +#define OSi_IRQCALLBACK_NUM (8+1) +#endif // SDK_ARM9 SDK_ARM7 + +extern OSIrqFunction OS_IRQTable[]; +extern OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM]; + +static inline void OS_ClearIrqCheckFlag(OSIrqMask intr) { + *(vu32 *)HW_INTR_CHECK_BUF &= (u32)~intr; +} + +static inline u32 OS_GetIrqCheckFlag(void) { + return *(vu32 *)HW_INTR_CHECK_BUF; +} + +static inline void OS_SetIrqCheckFlag(OSIrqMask intr) { + *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr; +} + +static inline BOOL OS_EnableIrq(void) { + u16 prep = reg_OS_IME; + reg_OS_IME = OS_IME_ENABLE; + return (BOOL)prep; +} + +#ifdef SDK_ARM9 +static inline BOOL OS_DisableIrq(void) { + BOOL ime = reg_OS_IME; + reg_OS_IME = OS_IME_DISABLE; + return ime; +} +#else +BOOL OS_DisableIrq(void); +#endif + +static inline BOOL OS_RestoreIrq(BOOL enable) { + BOOL ime = reg_OS_IME; + reg_OS_IME = enable; + return ime; +} + +static inline OSIrqMask OS_GetIrqMask(void) { + return reg_OS_IE; +} + +void OS_InitIrqTable(void); +void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function); +void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg); +OSIrqMask OS_SetIrqMask(OSIrqMask mask); +OSIrqMask OS_EnableIrqMask(OSIrqMask mask); +OSIrqMask OS_DisableIrqMask(OSIrqMask mask); +OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask); +void OS_SetIrqStackChecker(void); +void OS_WaitIrq(BOOL clear, OSIrqMask irqFlags); +OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit); +void OSi_EnterDmaCallback(u32 dmaNo, void (*callback)(void * arg), void * arg); + +#endif //NITRO_SUB_OS_INTERRUPT_H diff --git a/lib/include/nitro/os/irqHandler.h b/lib/include/nitro/os/irqHandler.h new file mode 100644 index 00000000..9dc0823e --- /dev/null +++ b/lib/include/nitro/os/irqHandler.h @@ -0,0 +1,9 @@ +#ifndef NITRO_OS_IRQHANDLER_H +#define NITRO_OS_IRQHANDLER_H + +#include + +void OS_IrqHandler(register OSIrqMask irq); +void OS_IrqHandler_ThreadSwitch(void); + +#endif //NITRO_OS_IRQHANDLER_H diff --git a/lib/include/nitro/os/irqTable.h b/lib/include/nitro/os/irqTable.h new file mode 100644 index 00000000..0a7bff89 --- /dev/null +++ b/lib/include/nitro/os/irqTable.h @@ -0,0 +1,19 @@ +#ifndef NITRO_OS_IRQTABLE_H +#define NITRO_OS_IRQTABLE_H + +#include +#include + +void OS_IrqDummy(void); +void OSi_IrqCallback(s32 index); +void OSi_IrqDma0(void); +void OSi_IrqDma1(void); +void OSi_IrqDma2(void); +void OSi_IrqDma3(void); +void OSi_IrqTimer0(void); +void OSi_IrqTimer1(void); +void OSi_IrqTimer2(void); +void OSi_IrqTimer3(void); +void OSi_IrqVBlank(void); + +#endif //NITRO_OS_IRQTABLE_H diff --git a/lib/include/nitro/os/message.h b/lib/include/nitro/os/message.h new file mode 100644 index 00000000..96dcaf7f --- /dev/null +++ b/lib/include/nitro/os/message.h @@ -0,0 +1,15 @@ +#ifndef NITRO_OS_MESSAGE_H +#define NITRO_OS_MESSAGE_H + +#include +#include +#include +#include + +void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount); +BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags); +BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags); +BOOL OS_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags); +BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags); + +#endif //NITRO_OS_MESSAGE_H diff --git a/lib/include/nitro/os/mutex.h b/lib/include/nitro/os/mutex.h new file mode 100644 index 00000000..b432014e --- /dev/null +++ b/lib/include/nitro/os/mutex.h @@ -0,0 +1,15 @@ +#ifndef NITRO_OS_MUTEX_H +#define NITRO_OS_MUTEX_H + +#include +#include + +void OSi_DequeueItem(OSThread * thread, OSMutex * mutex); +void OSi_EnqueueTail(OSThread * thread, OSMutex * mutex); +void OS_InitMutex(OSMutex* mutex); +void OS_LockMutex(OSMutex* mutex); +void OS_UnlockMutex(OSMutex* mutex); +void OSi_UnlockAllMutex(OSThread * thread); +BOOL OS_TryLockMutex(OSMutex *mtx); + +#endif //NITRO_OS_MUTEX_H diff --git a/lib/include/nitro/os/ownerInfo.h b/lib/include/nitro/os/ownerInfo.h new file mode 100644 index 00000000..44a00407 --- /dev/null +++ b/lib/include/nitro/os/ownerInfo.h @@ -0,0 +1,23 @@ +#ifndef NITRO_OS_OWNERINFO_H_ +#define NITRO_OS_OWNERINFO_H_ + +typedef struct OSBirthday { + u8 month; + u8 day; +} OSBirthday; + +typedef struct OSOwnerInfo { + u8 language; + u8 favoriteColor; + OSBirthday birthday; + u16 nickName[11]; + u16 nickNameLength; + u16 comment[27]; + u16 commentLength; +} OSOwnerInfo; + +void OS_GetMacAddress(u8 *macAddr); +void OS_GetOwnerInfo(OSOwnerInfo *info); +s64 OS_GetOwnerRtcOffset(void); + +#endif //NITRO_OS_OWNERINFO_H_ diff --git a/lib/include/nitro/os/printf.h b/lib/include/nitro/os/printf.h new file mode 100644 index 00000000..49bc43f9 --- /dev/null +++ b/lib/include/nitro/os/printf.h @@ -0,0 +1,17 @@ +#ifndef NITRO_OS_PRINTF_H_ +#define NITRO_OS_PRINTF_H_ + +#include +#include + +int OS_SPrintf(char * dest, const char * format, ...); +int OS_SNPrintf(char * dest, u32 len, const char * format, ...); +int OS_VSPrintf(char * dest, const char * format, va_list va); +int OS_VSNPrintf(char * dest, u32 len, const char * format, va_list va); + +void OS_Terminate(); + +#define OS_Panic(...) OS_Terminate() +#define OS_Printf(...) + +#endif //NITRO_OS_PRINTF_H_ diff --git a/lib/include/nitro/os/protectionRegion.h b/lib/include/nitro/os/protectionRegion.h new file mode 100644 index 00000000..9e0c758a --- /dev/null +++ b/lib/include/nitro/os/protectionRegion.h @@ -0,0 +1,61 @@ +#ifndef NITRO_OS_PROTECTIONREGION_H_ +#define NITRO_OS_PROTECTIONREGION_H_ + +typedef enum +{ + OSi_PR_BASE_MASK_4KB = 0xfffff000, + OSi_PR_BASE_MASK_8KB = 0xffffe000, + OSi_PR_BASE_MASK_16KB = 0xffffc000, + OSi_PR_BASE_MASK_32KB = 0xffff8000, + OSi_PR_BASE_MASK_64KB = 0xffff0000, + OSi_PR_BASE_MASK_128KB = 0xfffe0000, + OSi_PR_BASE_MASK_256KB = 0xfffc0000, + OSi_PR_BASE_MASK_512KB = 0xfff80000, + OSi_PR_BASE_MASK_1MB = 0xfff00000, + OSi_PR_BASE_MASK_2MB = 0xffe00000, + OSi_PR_BASE_MASK_4MB = 0xffc00000, + OSi_PR_BASE_MASK_8MB = 0xff800000, + OSi_PR_BASE_MASK_16MB = 0xff000000, + OSi_PR_BASE_MASK_32MB = 0xfe000000, + OSi_PR_BASE_MASK_64MB = 0xfc000000, + OSi_PR_BASE_MASK_128MB = 0xf8000000, + OSi_PR_BASE_MASK_256MB = 0xf0000000, + OSi_PR_BASE_MASK_512MB = 0xe0000000, + OSi_PR_BASE_MASK_1GB = 0xc0000000, + OSi_PR_BASE_MASK_2GB = 0x80000000, + OSi_PR_BASE_MASK_4GB = 0x00000000 +} +OSiProtectionRegionBaseMask; + +static inline u32 OSi_CalcPRParam(u32 address, u32 size, OSiProtectionRegionBaseMask mask) +{ + return ((address & mask) | size); +} + +void OS_SetDPermissionsForProtectionRegion(register u32 setMask, register u32 flags); +void OS_SetProtectionRegion0(u32 param); +void OS_SetProtectionRegion1(u32 param); +void OS_SetProtectionRegion2(u32 param); +void OS_SetProtectionRegion3(u32 param); +void OS_SetProtectionRegion4(u32 param); +void OS_SetProtectionRegion5(u32 param); +void OS_SetProtectionRegion6(u32 param); +void OS_SetProtectionRegion7(u32 param); + +#define OS_SetProtectionRegionParam( regionNo, param ) OSi_SetPR##regionNo##_param( param ) + +#define OSi_SetPR0_param( param ) OS_SetProtectionRegion0( param ) +#define OSi_SetPR1_param( param ) OS_SetProtectionRegion1( param ) +#define OSi_SetPR2_param( param ) OS_SetProtectionRegion2( param ) +#define OSi_SetPR3_param( param ) OS_SetProtectionRegion3( param ) +#define OSi_SetPR4_param( param ) OS_SetProtectionRegion4( param ) +#define OSi_SetPR5_param( param ) OS_SetProtectionRegion5( param ) +#define OSi_SetPR6_param( param ) OS_SetProtectionRegion6( param ) +#define OSi_SetPR7_param( param ) OS_SetProtectionRegion7( param ) + + +#define OS_SetProtectionRegion( regionNo, address, sizeStr ) \ + OSi_SetPR##regionNo##_param( OSi_CalcPRParam( address, HW_C6_PR_##sizeStr, OSi_PR_BASE_MASK_##sizeStr ) \ + | HW_C6_PR_ENABLE ) + +#endif //NITRO_OS_PROTECTIONREGION_H_ diff --git a/lib/include/nitro/os/protectionUnit.h b/lib/include/nitro/os/protectionUnit.h new file mode 100644 index 00000000..eef7af8b --- /dev/null +++ b/lib/include/nitro/os/protectionUnit.h @@ -0,0 +1,7 @@ +#ifndef NITRO_OS_PROTECTIONUNIT_H_ +#define NITRO_OS_PROTECTIONUNIT_H_ + +void OS_DisableProtectionUnit(void); +void OS_EnableProtectionUnit(void); + +#endif //NITRO_OS_PROTECTIONUNIT_H_ diff --git a/lib/include/nitro/os/reset.h b/lib/include/nitro/os/reset.h new file mode 100644 index 00000000..a6db1d91 --- /dev/null +++ b/lib/include/nitro/os/reset.h @@ -0,0 +1,23 @@ +#ifndef NITRO_OS_RESET_H +#define NITRO_OS_RESET_H + +#include +#include +#include + +void OS_InitReset(void); +BOOL OS_IsResetOccurred(void); +void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err); +void OSi_SendToPxi(u16 data); + +#ifdef SDK_ARM9 +void OS_ResetSystem(u32 parameter); + +static inline u32 OS_GetResetParameter(void) { + return *(u32 *)HW_RESET_PARAMETER_BUF; +} +#else +void OS_ResetSystem(void); +#endif + +#endif //NITRO_OS_RESET_H diff --git a/lib/include/nitro/os/spinLock.h b/lib/include/nitro/os/spinLock.h new file mode 100644 index 00000000..8fcdf2f2 --- /dev/null +++ b/lib/include/nitro/os/spinLock.h @@ -0,0 +1,36 @@ +#ifndef NITRO_OS_SPINLOCK_H +#define NITRO_OS_SPINLOCK_H + +#include +#include + +#define OS_MAINP_SYSTEM_LOCK_ID 0x7F +#define OS_SUBP_SYSTEM_LOCK_ID 0xBF + +#define OS_MAINP_LOCK_ID_START 0x40 +#define OS_SUBP_LOCK_ID_START 0x80 + +#define OS_LOCK_ID_ERROR (-3) + +void OS_InitLock(void); +void FUN_037F8CB4(s32 ct); +s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); +s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFIQ); +s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); +s32 OS_LockCartridge(u16 lockID); +s32 OS_UnlockCartridge(u16 lockID); +s32 OS_TryLockCartridge(u16 lockID); +void OSi_AllocateCartridgeBus(void); +void OSi_FreeCartridgeBus(void); +s32 OS_LockCard(u16 lockID); +s32 OS_UnlockCard(u16 lockID); +s32 OS_UnLockCard(u16 lockID); +BOOL OS_TryLockCard(u16 lockID); +u16 OS_ReadOwnerOfLockWord(OSLockWord * lock); +s32 OS_UnLockCartridge(u16 lockID); +s32 OS_GetLockID(void); +void OS_ReleaseLockID(register u16 lockID); +s32 OS_LockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); +s32 OS_UnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void)); + +#endif //NITRO_OS_SPINLOCK_H diff --git a/lib/include/nitro/os/system.h b/lib/include/nitro/os/system.h new file mode 100644 index 00000000..5ebeda92 --- /dev/null +++ b/lib/include/nitro/os/system.h @@ -0,0 +1,25 @@ +#ifndef NITRO_OS_SYSTEM_H_ +#define NITRO_OS_SYSTEM_H_ + +#include +#include +#include +#include + +#ifdef SDK_ARM9 +#include +#else +#include +#endif //SDK_ARM9 + +OSIntrMode OS_EnableInterrupts(void); +OSIntrMode OS_DisableInterrupts(void); +OSIntrMode OS_RestoreInterrupts(OSIntrMode state); +OSIntrMode OS_DisableInterrupts_IrqAndFiq(void); +OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state); +OSIntrMode_Irq OS_GetCpsrIrq(void); +OSProcMode OS_GetProcMode(void); +void OS_SpinWait(u32 cycles); +void OS_WaitVBlankIntr(void); + +#endif //NITRO_OS_SYSTEM_H_ diff --git a/lib/include/nitro/os/systemCall.h b/lib/include/nitro/os/systemCall.h new file mode 100644 index 00000000..3920984b --- /dev/null +++ b/lib/include/nitro/os/systemCall.h @@ -0,0 +1,7 @@ +#ifndef NITRO_OS_SYSTEMCALL_H_ +#define NITRO_OS_SYSTEMCALL_H_ + +void SVC_Halt(void); +void SVC_WaitByLoop(s32 count); + +#endif //NITRO_OS_SYSTEMCALL_H_ diff --git a/lib/include/nitro/os/systemWork.h b/lib/include/nitro/os/systemWork.h new file mode 100644 index 00000000..7d40d257 --- /dev/null +++ b/lib/include/nitro/os/systemWork.h @@ -0,0 +1,7 @@ +#ifndef NITRO_OS_SYSTEMWORK_H_ +#define NITRO_OS_SYSTEMWORK_H_ + +#include +#include + +#endif //NITRO_OS_SYSTEMWORK_H_ diff --git a/lib/include/nitro/os/tcm.h b/lib/include/nitro/os/tcm.h new file mode 100644 index 00000000..be3c91b6 --- /dev/null +++ b/lib/include/nitro/os/tcm.h @@ -0,0 +1,12 @@ +// +// Created by red031000 on 2020-05-05. +// + +#ifndef NITRO_OS_TCM_H +#define NITRO_OS_TCM_H + +#include + +u32 OS_GetDTCMAddress(void); + +#endif //NITRO_OS_TCM_H diff --git a/lib/include/nitro/os/terminate_proc.h b/lib/include/nitro/os/terminate_proc.h new file mode 100644 index 00000000..5d331024 --- /dev/null +++ b/lib/include/nitro/os/terminate_proc.h @@ -0,0 +1,6 @@ +#ifndef NITRO_OS_TERMINATE_PROC_H +#define NITRO_OS_TERMINATE_PROC_H + +void OS_Terminate(void); + +#endif //NITRO_OS_TERMINATE_PROC_H diff --git a/lib/include/nitro/os/thread.h b/lib/include/nitro/os/thread.h new file mode 100644 index 00000000..85b5c648 --- /dev/null +++ b/lib/include/nitro/os/thread.h @@ -0,0 +1,41 @@ +#ifndef NITRO_OS_THREAD_H_ +#define NITRO_OS_THREAD_H_ + +#include +#include + +#define SDK_THREAD_INFINITY + +s32 OSi_GetUnusedThreadId(void); +OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue); +OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread); +OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue); +void OSi_InsertThreadToList(OSThread *thread); +void OSi_RemoveThreadFromList(OSThread *thread); +void OSi_RescheduleThread(void); +void OS_InitThread(void); +BOOL OS_IsThreadAvailable(void); +void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio); +void OS_ExitThread(void); +void OS_DestroyThread(OSThread *thread); +void OS_KillThread(OSThread *thread, void *arg); +void OS_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio); +void OSi_CancelThreadAlarmForSleep(OSThread *thread); +void OS_JoinThread(OSThread *thread); +BOOL OS_IsThreadTerminated(const OSThread *thread); +void OS_SleepThread(OSThreadQueue *queue); +void OS_WakeupThread(OSThreadQueue *queue); +void OS_WakeupThreadDirect(OSThread *thread); +OSThread *OS_SelectThread(void); +void OS_RescheduleThread(void); +void OS_YieldThread(void); +BOOL OS_SetThreadPriority(OSThread *thread, u32 prio); +u32 OS_GetThreadPriority(const OSThread *thread); +void OS_Sleep(u32 msec); +OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback); +u32 OS_DisableScheduler(void); +u32 OS_EnableScheduler(void); +void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor); +void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread); + +#endif //NITRO_OS_THREAD_H_ diff --git a/lib/include/nitro/os/tick.h b/lib/include/nitro/os/tick.h new file mode 100644 index 00000000..66f1968e --- /dev/null +++ b/lib/include/nitro/os/tick.h @@ -0,0 +1,15 @@ +#ifndef NITRO_OS_TICK_H +#define NITRO_OS_TICK_H + +#include + +void OS_InitTick(void); +BOOL OS_IsTickAvailable(void); +void OSi_CountUpTick(void); +OSTick OS_GetTick(void); +u16 OS_GetTickLo(void); +void OS_SetTick(OSTick tick); + +extern vu64 OSi_TickCounter; + +#endif //NITRO_OS_TICK_H diff --git a/lib/include/nitro/os/timer.h b/lib/include/nitro/os/timer.h new file mode 100644 index 00000000..456f32ec --- /dev/null +++ b/lib/include/nitro/os/timer.h @@ -0,0 +1,9 @@ +#ifndef NITRO_OS_TIMER_H +#define NITRO_OS_TIMER_H + +#include +#include + +void OSi_SetTimerReserved(s32 timerNum); + +#endif //NITRO_OS_TIMER_H diff --git a/lib/include/nitro/os/valarm.h b/lib/include/nitro/os/valarm.h new file mode 100644 index 00000000..2b7b8e3a --- /dev/null +++ b/lib/include/nitro/os/valarm.h @@ -0,0 +1,33 @@ +#ifndef NITRO_OS_VALARM_H_ +#define NITRO_OS_VALARM_H_ + +typedef void (*OSVAlarmHandler)(void *); + +typedef struct OSiVAlarm OSVAlarm; + +struct OSiVAlarm { + OSVAlarmHandler handler; + void *arg; + u32 tag; + u32 frame; + s16 fire; + s16 delay; + OSVAlarm *prev; + OSVAlarm *next; + BOOL period; + BOOL finish; + BOOL canceled; +}; + +void OS_InitVAlarm(void); +BOOL OS_IsVAlarmAvailable(void); +void OSi_InsertVAlarm(OSVAlarm *alarm); +void OSi_DetachVAlarm(OSVAlarm *alarm); +void OS_CreateVAlarm(OSVAlarm *alarm); +void OS_SetVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg); +void OS_SetPeriodicVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg); +void OS_SetVAlarmTag(OSVAlarm *alarm, u32 tag); +void OS_CancelVAlarm(OSVAlarm *alarm); +void OS_CancelVAlarms(u32 tag); + +#endif //NITRO_OS_VALARM_H_ diff --git a/lib/include/nitro/pad.h b/lib/include/nitro/pad.h new file mode 100644 index 00000000..af110259 --- /dev/null +++ b/lib/include/nitro/pad.h @@ -0,0 +1,9 @@ +#ifndef NITRO_PAD_H_ +#define NITRO_PAD_H_ + +#include +#ifdef SDK_ARM7 +#include +#endif + +#endif //NITRO_PAD_H_ diff --git a/lib/include/nitro/pad/ARM7/xyButton.h b/lib/include/nitro/pad/ARM7/xyButton.h new file mode 100644 index 00000000..9bd59a55 --- /dev/null +++ b/lib/include/nitro/pad/ARM7/xyButton.h @@ -0,0 +1,7 @@ +#ifndef NITRO_PAD_XYBUTTON_H_ +#define NITRO_PAD_XYBUTTON_H_ + +extern BOOL PADi_XYButtonAvailable; +BOOL PAD_InitXYButton(void); + +#endif //NITRO_PAD_XYBUTTON_H_ diff --git a/lib/include/nitro/pad/common/pad.h b/lib/include/nitro/pad/common/pad.h new file mode 100644 index 00000000..e375be9a --- /dev/null +++ b/lib/include/nitro/pad/common/pad.h @@ -0,0 +1,38 @@ +#ifndef NITRO_PAD_PAD_H_ +#define NITRO_PAD_PAD_H_ + +#include + +#define PAD_PLUS_KEY_MASK 0x00f0 +#define PAD_BUTTON_MASK 0x2f0f +#define PAD_DEBUG_BUTTON_MASK 0x2000 +#define PAD_ALL_MASK 0x2fff +#define PAD_RCNTPORT_MASK 0x2c00 +#define PAD_KEYPORT_MASK 0x03ff + +#define PAD_DETECT_FOLD_MASK 0x8000 + +#define PAD_BUTTON_A 0x0001 +#define PAD_BUTTON_B 0x0002 +#define PAD_BUTTON_SELECT 0x0004 +#define PAD_BUTTON_START 0x0008 +#define PAD_KEY_RIGHT 0x0010 +#define PAD_KEY_LEFT 0x0020 +#define PAD_KEY_UP 0x0040 +#define PAD_KEY_DOWN 0x0080 +#define PAD_BUTTON_R 0x0100 +#define PAD_BUTTON_L 0x0200 +#define PAD_BUTTON_X 0x0400 +#define PAD_BUTTON_Y 0x0800 +#define PAD_BUTTON_DEBUG 0x2000 + +static inline u16 PAD_Read(void) { + return (u16)(((reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF) ^ + (PAD_PLUS_KEY_MASK | PAD_BUTTON_MASK)) & (PAD_PLUS_KEY_MASK | PAD_BUTTON_MASK)); +} + +static inline BOOL PAD_DetectFold(void) { + return (BOOL)((*(vu16 *)HW_BUTTON_XY_BUF & PAD_DETECT_FOLD_MASK) >> 15); +} + +#endif //NITRO_PAD_PAD_H_ diff --git a/lib/include/nitro/pxi.h b/lib/include/nitro/pxi.h new file mode 100644 index 00000000..8c494087 --- /dev/null +++ b/lib/include/nitro/pxi.h @@ -0,0 +1,6 @@ +#ifndef NITRO_PXI_H_ +#define NITRO_PXI_H_ + +void PXI_Init(void); + +#endif //NITRO_PXI_H_ diff --git a/lib/include/nitro/pxi/fifo.h b/lib/include/nitro/pxi/fifo.h new file mode 100644 index 00000000..e8e35ea9 --- /dev/null +++ b/lib/include/nitro/pxi/fifo.h @@ -0,0 +1,35 @@ +#ifndef NITRO_PXI_FIFO_H_ +#define NITRO_PXI_FIFO_H_ + +#include + +typedef enum +{ + PXI_FIFO_SUCCESS = 0, + PXI_FIFO_FAIL_SEND_ERR = -1, + PXI_FIFO_FAIL_SEND_FULL = -2, + PXI_FIFO_FAIL_RECV_ERR = -3, + PXI_FIFO_FAIL_RECV_EMPTY = -4, + PXI_FIFO_NO_CALLBACK_ENTRY = -5 +} PXIFifoStatus; + +typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err); + +typedef union +{ + struct + { + u32 tag:5; + u32 err:1; + u32 data:26; + } e; + u32 raw; +} PXIFifoMessage; + +void PXI_InitFifo(void); +void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback); +BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc); +s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err); +void PXIi_HandlerRecvFifoNotEmpty(void); + +#endif //NITRO_PXI_FIFO_H_ diff --git a/lib/include/nitro/pxi/fifo_shared.h b/lib/include/nitro/pxi/fifo_shared.h new file mode 100644 index 00000000..b8e457b2 --- /dev/null +++ b/lib/include/nitro/pxi/fifo_shared.h @@ -0,0 +1,43 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include PXI_fifo.h from the specific proc's lib + */ + +#ifndef NITRO_PXI_FIFO_SHARED_H_ +#define NITRO_PXI_FIFO_SHARED_H_ + +typedef enum +{ + PXI_PROC_ARM9 = 0, + PXI_PROC_ARM7 = 1 +} PXIProc; + +typedef enum { + PXI_FIFO_TAG_EX = 0, // Extension format + PXI_FIFO_TAG_USER_0, // for application programmer, use it in free + PXI_FIFO_TAG_USER_1, // for application programmer, use it in free + PXI_FIFO_TAG_SYSTEM, // SDK inner usage + PXI_FIFO_TAG_NVRAM, // NVRAM + PXI_FIFO_TAG_RTC, // RTC + PXI_FIFO_TAG_TOUCHPANEL, // Touch Panel + PXI_FIFO_TAG_SOUND, // Sound + PXI_FIFO_TAG_PM, // Power Management + PXI_FIFO_TAG_MIC, // Microphone + PXI_FIFO_TAG_WM, // Wireless Manager + PXI_FIFO_TAG_FS, // File System + PXI_FIFO_TAG_OS, // OS + PXI_FIFO_TAG_CTRDG, // Cartridge + PXI_FIFO_TAG_CARD, // Card + PXI_FIFO_TAG_WVR, // Control driving wireless library + PXI_FIFO_TAG_CTRDG_Ex, // Cartridge Ex + PXI_MAX_FIFO_TAG = 32 // MAX FIFO TAG +} PXIFifoTag; + +#endif //NITRO_PXI_FIFO_SHARED_H_ diff --git a/lib/include/nitro/rtc.h b/lib/include/nitro/rtc.h new file mode 100644 index 00000000..0a90f41a --- /dev/null +++ b/lib/include/nitro/rtc.h @@ -0,0 +1,9 @@ +#ifndef NITRO_RTC_H_ +#define NITRO_RTC_H_ + +#ifdef SDK_ARM9 +#include +#include +#endif //SDK_ARM9 + +#endif //NITRO_RTC_H_ diff --git a/lib/include/nitro/rtc/ARM9/api.h b/lib/include/nitro/rtc/ARM9/api.h new file mode 100644 index 00000000..4dd074ed --- /dev/null +++ b/lib/include/nitro/rtc/ARM9/api.h @@ -0,0 +1,45 @@ +#ifndef NITRO_RTC_API_H_ +#define NITRO_RTC_API_H_ + +typedef enum RTCWeek { + RTC_WEEK_SUNDAY = 0, + RTC_WEEK_MONDAY, + RTC_WEEK_TUESDAY, + RTC_WEEK_WEDNESDAY, + RTC_WEEK_THURSDAY, + RTC_WEEK_FRIDAY, + RTC_WEEK_SATURDAY, + RTC_WEEK_MAX +} RTCWeek; + +typedef enum RTCResult +{ + RTC_RESULT_SUCCESS = 0, + RTC_RESULT_BUSY, + RTC_RESULT_ILLEGAL_PARAMETER, + RTC_RESULT_SEND_ERROR, + RTC_RESULT_INVALID_COMMAND, + RTC_RESULT_ILLEGAL_STATUS, + RTC_RESULT_FATAL_ERROR, + RTC_RESULT_MAX +} RTCResult; + +typedef struct RTCDate { + u32 year; + u32 month; + u32 day; + RTCWeek week; +} RTCDate; + +typedef struct RTCTime { + u32 hour; + u32 minute; + u32 second; +} RTCTime; + +typedef void (*RTCCallback)(RTCResult result, void *arg); + +void RTC_Init(void); +RTCResult RTC_GetDateTimeAsync(RTCDate *date, RTCTime *time, RTCCallback callback, void *arg); + +#endif //NITRO_RTC_API_H_ diff --git a/lib/include/nitro/rtc/ARM9/convert.h b/lib/include/nitro/rtc/ARM9/convert.h new file mode 100644 index 00000000..55a4cb7b --- /dev/null +++ b/lib/include/nitro/rtc/ARM9/convert.h @@ -0,0 +1,8 @@ +#ifndef NITRO_RTC_CONVERT_H_ +#define NITRO_RTC_CONVERT_H_ + +s64 RTC_ConvertDateTimeToSecond(const RTCDate *date, const RTCTime *time); +s32 RTC_ConvertDateToDay(const RTCDate *date); +void RTC_ConvertSecondToDateTime(RTCDate *date, RTCTime *time, s64 sec); + +#endif //NITRO_RTC_CONVERT_H_ diff --git a/lib/include/nitro/section.h b/lib/include/nitro/section.h new file mode 100644 index 00000000..d3318a46 --- /dev/null +++ b/lib/include/nitro/section.h @@ -0,0 +1,14 @@ +#ifndef NITRO_SECTION_H_ +#define NITRO_SECTION_H_ + +#ifdef SDK_ARM9 +#pragma define_section ITCM ".itcm" ".itcm.bss" abs32 RWX +#pragma define_section DTCM ".dtcm" ".dtcm.bss" abs32 RWX +#else +#pragma define_section WRAM ".wram" ".wram.bss" abs32 RWX +#endif + +#pragma define_section PARENT ".parent" abs32 RWX +#pragma define_section VERSION ".version" abs32 RWX + +#endif //NITRO_SECTION_H_ diff --git a/lib/include/nitro/snd.h b/lib/include/nitro/snd.h new file mode 100644 index 00000000..cc7bdb1a --- /dev/null +++ b/lib/include/nitro/snd.h @@ -0,0 +1,10 @@ +#ifndef NITRO_SND_H_ +#define NITRO_SND_H_ + +#include +#include +#include +#include +#include + +#endif //NITRO_SND_H_ diff --git a/lib/include/nitro/snd/common/channel.h b/lib/include/nitro/snd/common/channel.h new file mode 100644 index 00000000..c7987fd8 --- /dev/null +++ b/lib/include/nitro/snd/common/channel.h @@ -0,0 +1,6 @@ +#ifndef NITRO_SND_CHANNEL_H_ +#define NITRO_SND_CHANNEL_H_ + +#define SND_CHANNEL_NUM 16 + +#endif //NITRO_SND_CHANNEL_H_ diff --git a/lib/include/nitro/snd/common/data.h b/lib/include/nitro/snd/common/data.h new file mode 100644 index 00000000..60404fc7 --- /dev/null +++ b/lib/include/nitro/snd/common/data.h @@ -0,0 +1,18 @@ +#ifndef NITRO_SND_DATA_H_ +#define NITRO_SND_DATA_H_ + +typedef struct SNDBinaryFileHeader { + char signature[4]; + u16 byteOrder; + u16 version; + u32 fileSize; + u16 headerSize; + u16 dataBlocks; +} SNDBinaryFileHeader; + +typedef struct SNDBinaryBlockHeader { + u32 kind; + u32 size; +} SNDBinaryBlockHeader; + +#endif //NITRO_SND_DATA_H_ diff --git a/lib/include/nitro/snd/common/exchannel.h b/lib/include/nitro/snd/common/exchannel.h new file mode 100644 index 00000000..3c8ee664 --- /dev/null +++ b/lib/include/nitro/snd/common/exchannel.h @@ -0,0 +1,11 @@ +#ifndef NITRO_SND_EXCHANNEL_H_ +#define NITRO_SND_EXCHANNEL_H_ + +typedef enum SNDEnvStatus { + SND_ENV_ATTACK, + SND_ENV_DECAY, + SND_ENV_SUSTAIN, + SND_ENV_RELEASE +} SNDEnvStatus; + +#endif //NITRO_SND_EXCHANNEL_H_ diff --git a/lib/include/nitro/snd/common/global.h b/lib/include/nitro/snd/common/global.h new file mode 100644 index 00000000..97959750 --- /dev/null +++ b/lib/include/nitro/snd/common/global.h @@ -0,0 +1,6 @@ +#ifndef NITRO_SND_GLOBAL_H_ +#define NITRO_SND_GLOBAL_H_ + +void SND_Shutdown(void); + +#endif //NITRO_SND_GLOBAL_H_ diff --git a/lib/include/nitro/snd/common/work.h b/lib/include/nitro/snd/common/work.h new file mode 100644 index 00000000..462ddb13 --- /dev/null +++ b/lib/include/nitro/snd/common/work.h @@ -0,0 +1,26 @@ +#ifndef NITRO_SND_WORK_H_ +#define NITRO_SND_WORK_H_ + +typedef struct SNDChannelInfo { + BOOL activeFlag: 1; + BOOL lockFlag: 1; + u16 volume; + u8 pan; + u8 pad_; + SNDEnvStatus envStatus; +} SNDChannelInfo; + +typedef struct SNDTrackInfo { + u16 prgNo; + u8 volume; + u8 volume2; + s8 pitchBend; + u8 bendRange; + u8 pan; + s8 transpose; + u8 pad_; + u8 chCount; + u8 channel[SND_CHANNEL_NUM]; +} SNDTrackInfo; + +#endif //NITRO_SND_WORK_H_ diff --git a/lib/include/nitro/spi.h b/lib/include/nitro/spi.h new file mode 100644 index 00000000..3dfa4712 --- /dev/null +++ b/lib/include/nitro/spi.h @@ -0,0 +1,12 @@ +#ifndef NITRO_SPI_H_ +#define NITRO_SPI_H_ + +#include +#include +#ifdef SDK_ARM9 +#include +#include +#include +#endif //SDK_ARM9 + +#endif //NITRO_SPI_H_ diff --git a/lib/include/nitro/spi/ARM9/mic.h b/lib/include/nitro/spi/ARM9/mic.h new file mode 100644 index 00000000..d9977b39 --- /dev/null +++ b/lib/include/nitro/spi/ARM9/mic.h @@ -0,0 +1,50 @@ +#ifndef NITRO_SPI_ARM9_MIC_H_ +#define NITRO_SPI_ARM9_MIC_H_ + +#include + +typedef enum MICResult { + MIC_RESULT_SUCCESS = 0, + MIC_RESULT_BUSY, + MIC_RESULT_ILLEGAL_PARAMETER, + MIC_RESULT_SEND_ERROR, + MIC_RESULT_INVALID_COMMAND, + MIC_RESULT_ILLEGAL_STATUS, + MIC_RESULT_FATAL_ERROR, + MIC_RESULT_MAX +} MICResult; + +typedef enum MICSamplingType { + MIC_SAMPLING_TYPE_8BIT = 0, + MIC_SAMPLING_TYPE_12BIT, + MIC_SAMPLING_TYPE_SIGNED_8BIT, + MIC_SAMPLING_TYPE_SIGNED_12BIT, + MIC_SAMPLING_TYPE_12BIT_FILTER_OFF, + MIC_SAMPLING_TYPE_SIGNED_12BIT_FILTER_OFF, + MIC_SAMPLING_TYPE_MAX +} MICSamplingType; + +typedef enum MICSamplingRate { + MIC_SAMPLING_RATE_8K = (HW_CPU_CLOCK_ARM7 / 8000), + MIC_SAMPLING_RATE_11K = (HW_CPU_CLOCK_ARM7 / 11025), + MIC_SAMPLING_RATE_16K = (HW_CPU_CLOCK_ARM7 / 16000), + MIC_SAMPLING_RATE_22K = (HW_CPU_CLOCK_ARM7 / 22050), + MIC_SAMPLING_RATE_32K = (HW_CPU_CLOCK_ARM7 / 32000), + MIC_SAMPLING_RATE_LIMIT = 1024 +} MICSamplingRate; + +typedef void (*MICCallback)(MICResult result, void *arg); + +typedef struct MICAutoParam { + MICSamplingType type; + void *buffer; + u32 size; + u32 rate; + BOOL loop_enable; + MICCallback full_callback; + void *full_arg; +} MICAutoParam; + +void MIC_Init(void); + +#endif //NITRO_SPI_ARM9_MIC_H_ diff --git a/lib/include/nitro/spi/ARM9/pm.h b/lib/include/nitro/spi/ARM9/pm.h new file mode 100644 index 00000000..f58914d2 --- /dev/null +++ b/lib/include/nitro/spi/ARM9/pm.h @@ -0,0 +1,37 @@ +#ifndef NITRO_SPI_ARM9_PM_H_ +#define NITRO_SPI_ARM9_PM_H_ + +typedef enum { + PM_BACKLIGHT_OFF = 0, + PM_BACKLIGHT_ON = 1 +} PMBackLightSwitch; + +typedef enum { + PM_AMP_OFF = 0, + PM_AMP_ON = 1 +} PMAmpSwitch; + +typedef enum { + PM_AMPGAIN_20 = 0, + PM_AMPGAIN_40 = 1, + PM_AMPGAIN_80 = 2, + PM_AMPGAIN_160 = 3, + PM_AMPGAIN_DEFAULT = PM_AMPGAIN_40 +} PMAmpGain; + +typedef enum { + PM_LCD_TOP = 0, + PM_LCD_BOTTOM = 1, + PM_LCD_ALL = 2 +} PMLCDTarget; + + +void PM_Init(void); +u32 PM_SetAmp(PMAmpSwitch sw); +u32 PM_SetAmpGain(PMAmpGain gain); +void PM_GetBackLight(PMBackLightSwitch *top, PMBackLightSwitch *bottom); +void PM_GoSleepMode(PMWakeUpTrigger trigger, PMLogic logic, u16 keyPattern); +u32 PM_ForceToPowerOff(void); +u32 PM_SetBackLight(PMLCDTarget target, PMBackLightSwitch status); + +#endif //NITRO_SPI_ARM9_PM_H_ diff --git a/lib/include/nitro/spi/ARM9/tp.h b/lib/include/nitro/spi/ARM9/tp.h new file mode 100644 index 00000000..4b475394 --- /dev/null +++ b/lib/include/nitro/spi/ARM9/tp.h @@ -0,0 +1,39 @@ +#ifndef NITRO_SPI_ARM9_TP_H +#define NITRO_SPI_ARM9_TP_H + +#define TP_TOUCH_OFF 0 +#define TP_TOUCH_ON 1 + +#define TP_VALIDITY_VALID 0 +#define TP_VALIDITY_INVALID_X 1 +#define TP_VALIDITY_INVALID_Y 2 +#define TP_VALIDITY_INVALID_XY (TP_VALIDITY_INVALID_X | TP_VALIDITY_INVALID_Y) + +typedef struct { + u16 x; + u16 y; + u16 touch; + u16 validity; +} TPData; + +typedef struct NvTpData { + s16 x0; + s16 y0; + s16 xDotSize; + s16 yDotSize; +} TPCalibrateParam; + +void TP_Init(void); +void TP_SetCalibrateParam(const TPCalibrateParam *param); +BOOL TP_GetUserInfo(TPCalibrateParam *param); +void TP_RequestSamplingAsync(void); +u32 TP_WaitRawResult(TPData *result); +void TP_GetLatestRawPointInAuto(TPData *result); +void TP_GetCalibratedPoint(TPData *calib, const TPData *raw); + +static inline u32 TP_RequestRawSampling(TPData *result) { + TP_RequestSamplingAsync(); + return TP_WaitRawResult(result); +} + +#endif //NITRO_SPI_ARM9_TP_H diff --git a/lib/include/nitro/spi/common/pm_common.h b/lib/include/nitro/spi/common/pm_common.h new file mode 100644 index 00000000..b328e2e8 --- /dev/null +++ b/lib/include/nitro/spi/common/pm_common.h @@ -0,0 +1,15 @@ +#ifndef NITRO_SPI_COMMON_PM_COMMON_H_ +#define NITRO_SPI_COMMON_PM_COMMON_H_ + +#define PM_TRIGGER_KEY (1 << 0) +#define PM_TRIGGER_RTC_ALARM (1 << 1) +#define PM_TRIGGER_COVER_OPEN (1 << 2) +#define PM_TRIGGER_CARD (1 << 3) +#define PM_TRIGGER_CARTRIDGE (1 << 4) +typedef u32 PMWakeUpTrigger; + +#define PM_PAD_LOGIC_OR (0 << REG_PAD_KEYCNT_LOGIC_SHIFT) +#define PM_PAD_LOGIC_AND (1 << REG_PAD_KEYCNT_LOGIC_SHIFT) +typedef u32 PMLogic; + +#endif //NITRO_SPI_COMMON_PM_COMMON_H_ diff --git a/lib/include/nitro/spi/userInfo.h b/lib/include/nitro/spi/userInfo.h new file mode 100644 index 00000000..3319ce27 --- /dev/null +++ b/lib/include/nitro/spi/userInfo.h @@ -0,0 +1,92 @@ +#ifndef NITRO_SPI_USERINFO_H_ +#define NITRO_SPI_USERINFO_H_ + +typedef struct NVRAMConfigDate +{ + u8 month; //0x00 + u8 day; //0x01 +} NVRAMConfigDate; //0x02 + +typedef struct NVRAMConfigNickname +{ + u16 str[10]; //0x00 + u8 length; //0x14 + u8 rsv; //0x15 +} NVRAMConfigNickname; //0x16 + +typedef struct NVRAMConfigComment +{ + u16 str[26]; //0x00 + u8 length; //0x34 + u8 rsv; //0x35 +} NVRAMConfigComment; //0x36 + +typedef struct NVRAMConfigOwnerInfo +{ + u8 favouriteColour:4; //0x00 (0-3) + u8 rsv:4; //0x00 (4-7) + NVRAMConfigDate birthday; //0x01 + u8 pad; //0x03 + NVRAMConfigNickname nickname; //0x04 + NVRAMConfigComment comment; //0x1a +} NVRAMConfigOwnerInfo; //0x50 + +typedef struct NVRAMConfigAlarm +{ + u8 hour; //0x00 + u8 minute; //0x01 + u8 second; //0x02 + u8 pad; //0x03 + u16 enableWeek:7; //0x04 (0-6) + u16 alarmOn:1; //0x04 (7) + u16 rsv:8; //0x04 (8-15) +} NVRAMConfigAlarm; //0x06 + +typedef struct NVRAMConfigTpCalibData +{ + u16 raw_x1; //0x00 + u16 raw_y1; //0x02 + u8 dx1; //0x04 + u8 dy1; //0x05 + u16 raw_x2; //0x06 + u16 raw_y2; //0x08 + u8 dx2; //0x0a + u8 dy2; //0x0b +} NVRAMConfigTpCalibData; //0x0c + +typedef struct NVRAMConfigOption +{ + u16 language:3; //0x00 (0-2) + u16 agbLcd:1; //0x00 (3) + u16 detectPullOutCardFlag:1; //0x00 (4) + u16 detectPullOutCtrdgFlag:1; //0x00 (5) + u16 autoBootFlag:1; //0x00 (6) + u16 rsv:4; //0x00 (7-10) + u16 input_favouriteColour:1; //0x00 (11) + u16 input_tp:1; //0x00 (12) + u16 input_language:1; //0x00 (13) + u16 input_rtc:1; //0x00 (14) + u16 input_nickname:1; //0x00 (15) + u8 timeZone; //0x02 + u8 rtcClockAdjust; //0x03 + s64 rtcOffset; //0x04 +} NVRAMConfigOption; //0x0c + +typedef struct NVRAMConfigData +{ + u8 version; //0x00 + u8 pad; //0x01 + NVRAMConfigOwnerInfo owner; //0x02 + NVRAMConfigAlarm alarm; //0x52 + NVRAMConfigTpCalibData tp; //0x58 + NVRAMConfigOption option; //0x64 +} NVRAMConfigData; //0x70 + +typedef struct NVRAMConfig +{ + NVRAMConfigData ncd; //0x00 + u16 saveCount; //0x70 + u16 crc16; //0x72 +} NVRAMConfig; //0x74 + +#endif //NITRO_SPI_USERINFO_H_ diff --git a/lib/include/nitro/std.h b/lib/include/nitro/std.h new file mode 100644 index 00000000..4ad59b0e --- /dev/null +++ b/lib/include/nitro/std.h @@ -0,0 +1,6 @@ +#ifndef NITRO_STD_H_ +#define NITRO_STD_H_ + +#include + +#endif //NITRO_STD_H_ diff --git a/lib/include/nitro/std/string.h b/lib/include/nitro/std/string.h new file mode 100644 index 00000000..b7db894f --- /dev/null +++ b/lib/include/nitro/std/string.h @@ -0,0 +1,8 @@ +#ifndef NITRO_STD_STRING_H_ +#define NITRO_STD_STRING_H_ + +#include + +int STD_TVSNPrintf(char * dest, u32 len, const char * format, va_list va); + +#endif //NITRO_STD_STRING_H_ diff --git a/lib/include/nitro/types.h b/lib/include/nitro/types.h new file mode 100644 index 00000000..a8211470 --- /dev/null +++ b/lib/include/nitro/types.h @@ -0,0 +1,56 @@ +#ifndef NITRO_TYPES_H_ +#define NITRO_TYPES_H_ + +#ifndef SDK_ASM +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned long u32; + +typedef signed char s8; +typedef signed short int s16; +typedef signed long s32; + +typedef unsigned long long int u64; +typedef signed long long int s64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; + +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef volatile f32 vf32; + +typedef u8 REGType8; +typedef u16 REGType16; +typedef u32 REGType32; +typedef u64 REGType64; + +typedef vu8 REGType8v; +typedef vu16 REGType16v; +typedef vu32 REGType32v; +typedef vu64 REGType64v; + +typedef int BOOL; +#endif + +#define TRUE 1 +#define FALSE 0 + +#ifndef SDK_ASM +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else // __cplusplus +#define NULL ((void *)0) +#endif // __cplusplus +#endif + +#define SDK_FORCE_EXPORT __declspec(force_export) +#endif //SDK_ASM +#endif //NITRO_TYPES_H_ diff --git a/lib/include/nitro/wram_begin.h b/lib/include/nitro/wram_begin.h new file mode 100644 index 00000000..175389d8 --- /dev/null +++ b/lib/include/nitro/wram_begin.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM7 +#pragma section WRAM begin +#endif //SDK_ARM7 diff --git a/lib/include/nitro/wram_end.h b/lib/include/nitro/wram_end.h new file mode 100644 index 00000000..6a95467a --- /dev/null +++ b/lib/include/nitro/wram_end.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM7 +#pragma section WRAM end +#endif //SDK_ARM7 diff --git a/lib/include/nnsys.h b/lib/include/nnsys.h new file mode 100644 index 00000000..ee210c14 --- /dev/null +++ b/lib/include/nnsys.h @@ -0,0 +1,10 @@ +#ifndef NNSYS_H_ +#define NNSYS_H_ + +#include +#include +#include +#include +#include + +#endif //NNSYS_H_ diff --git a/lib/include/nnsys/fnd.h b/lib/include/nnsys/fnd.h new file mode 100644 index 00000000..e0190779 --- /dev/null +++ b/lib/include/nnsys/fnd.h @@ -0,0 +1,9 @@ +#ifndef NNSYS_FND_H_ +#define NNSYS_FND_H_ + +#include +#include +#include +#include + +#endif //NNSYS_FND_H_ diff --git a/lib/include/nnsys/fnd/allocator.h b/lib/include/nnsys/fnd/allocator.h new file mode 100644 index 00000000..d9143b57 --- /dev/null +++ b/lib/include/nnsys/fnd/allocator.h @@ -0,0 +1,27 @@ +#ifndef NNSYS_FND_ALLOCATOR_H_ +#define NNSYS_FND_ALLOCATOR_H_ + +#include + +typedef struct NNSFndAllocator NNSFndAllocator; + +typedef void *(*NNSFndFuncAllocatorAlloc)(NNSFndAllocator *pAllocator, u32 size); +typedef void (*NNSFndFuncAllocatorFree)(NNSFndAllocator *pAllocator,void *memBlock); + +typedef struct NNSFndAllocatorFunc NNSFndAllocatorFunc; + +struct NNSFndAllocatorFunc { + NNSFndFuncAllocatorAlloc pfAlloc; + NNSFndFuncAllocatorFree pfFree; +}; + +struct NNSFndAllocator { + NNSFndAllocatorFunc const * pFunc; + void *pHeap; + u32 heapParam1; + u32 heapParam2; +}; + +void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator *pAllocator, NNSFndHeapHandle heap, int alignment); + +#endif //NNSYS_FND_ALLOCATOR_H_ diff --git a/lib/include/nnsys/fnd/expheap.h b/lib/include/nnsys/fnd/expheap.h new file mode 100644 index 00000000..a223bebc --- /dev/null +++ b/lib/include/nnsys/fnd/expheap.h @@ -0,0 +1,16 @@ +#ifndef NNSYS_FND_EXPHEAP_H_ +#define NNSYS_FND_EXPHEAP_H_ + +#include + +#define NNS_FndCreateExpHeap(startAddress, size) NNS_FndCreateExpHeapEx(startAddress, size, 0) + +NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag); +void *NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle heap, u32 size, int alignment); +void NNS_FndDestroyExpHeap(NNSFndHeapHandle heap); +void NNS_FndFreeToExpHeap(NNSFndHeapHandle heap, void *memBlock); +u32 NNS_FndGetTotalFreeSizeForExpHeap(NNSFndHeapHandle heap); +u32 NNS_FndGetSizeForMBlockExpHeap(const void *memBlock); +u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); + +#endif //NNSYS_FND_EXPHEAP_H_ diff --git a/lib/include/nnsys/fnd/heapcommon.h b/lib/include/nnsys/fnd/heapcommon.h new file mode 100644 index 00000000..232b40b6 --- /dev/null +++ b/lib/include/nnsys/fnd/heapcommon.h @@ -0,0 +1,23 @@ +#ifndef NNSYS_FND_HEAPCOMMON_H_ +#define NNSYS_FND_HEAPCOMMON_H_ + +#include + +typedef struct NNSiFndHeapHead NNSiFndHeapHead; + +struct NNSiFndHeapHead +{ + u32 signature; + + NNSFndLink link; + NNSFndList childList; + + void *heapStart; + void *heapEnd; + + u32 attribute; +}; + +typedef NNSiFndHeapHead* NNSFndHeapHandle; + +#endif //NNSYS_FND_HEAPCOMMON_H_ diff --git a/lib/include/nnsys/fnd/list.h b/lib/include/nnsys/fnd/list.h new file mode 100644 index 00000000..bb7c9d3c --- /dev/null +++ b/lib/include/nnsys/fnd/list.h @@ -0,0 +1,18 @@ +#ifndef NNSYS_FND_LIST_H_ +#define NNSYS_FND_LIST_H_ + +typedef struct { + void *prevObject; + void *nextObject; + +} NNSFndLink; + +typedef struct { + void *headObject; + void *tailObject; + u16 numObjects; + u16 offset; + +} NNSFndList; + +#endif //NNSYS_FND_LIST_H_ diff --git a/lib/include/nnsys/g2d.h b/lib/include/nnsys/g2d.h new file mode 100644 index 00000000..e027283c --- /dev/null +++ b/lib/include/nnsys/g2d.h @@ -0,0 +1,25 @@ +#ifndef NNSYS_G2D_H_ +#define NNSYS_G2D_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif //NNSYS_G2D_H_ diff --git a/lib/include/nnsys/g2d/fmt/g2d_Anim_data.h b/lib/include/nnsys/g2d/fmt/g2d_Anim_data.h new file mode 100644 index 00000000..60d8d6e7 --- /dev/null +++ b/lib/include/nnsys/g2d/fmt/g2d_Anim_data.h @@ -0,0 +1,39 @@ +#ifndef NNSYS_G2D_FMT_G2D_ANIM_DATA_H_ +#define NNSYS_G2D_FMT_G2D_ANIM_DATA_H_ + +typedef enum NNSG2dAnimationPlayMode { + NNS_G2D_ANIMATIONPLAYMODE_INVALID = 0x0, + NNS_G2D_ANIMATIONPLAYMODE_FORWARD, + NNS_G2D_ANIMATIONPLAYMODE_FORWARD_LOOP, + NNS_G2D_ANIMATIONPLAYMODE_REVERSE, + NNS_G2D_ANIMATIONPLAYMODE_REVERSE_LOOP, + NNS_G2D_ANIMATIONPLAYMODE_MAX +} NNSG2dAnimationPlayMode; + +typedef struct NNSG2dAnimFrameData { + void* pContent; + u16 frames; + u16 pad16; + +} NNSG2dAnimFrameData; + +typedef struct NNSG2dAnimSequenceData { + u16 numFrames; + u16 loopStartFrameIdx; + u32 animType; + NNSG2dAnimationPlayMode playMode; + NNSG2dAnimFrameData *pAnmFrameArray; + +} NNSG2dAnimSequenceData; + +typedef struct NNSG2dAnimBankData { + u16 numSequences; + u16 numTotalFrames; + NNSG2dAnimSequenceData* pSequenceArrayHead; + NNSG2dAnimFrameData* pFrameArrayHead; + void* pAnimContents; + void* pStringBank; + void* pExtendedData; +} NNSG2dAnimBankData; + +#endif //NNSYS_G2D_FMT_G2D_ANIM_DATA_H_ diff --git a/lib/include/nnsys/g2d/fmt/g2d_Cell_data.h b/lib/include/nnsys/g2d/fmt/g2d_Cell_data.h new file mode 100644 index 00000000..0cdff439 --- /dev/null +++ b/lib/include/nnsys/g2d/fmt/g2d_Cell_data.h @@ -0,0 +1,39 @@ +#ifndef NNSYS_G2D_FMT_G2D_CELL_DATA_H_ +#define NNSYS_G2D_FMT_G2D_CELL_DATA_H_ + +typedef struct NNSG2dCellOAMAttrData { + u16 attr0; + u16 attr1; + u16 attr2; + +} NNSG2dCellOAMAttrData; + +typedef struct NNSG2dCellData { + u16 numOAMAttrs; + u16 cellAttr; + NNSG2dCellOAMAttrData* pOamAttrArray; +} NNSG2dCellData; + +typedef struct NNSG2dCellVramTransferData { + u32 srcDataOffset; + u32 szByte; + +} NNSG2dCellVramTransferData; + +typedef struct NNSG2dVramTransferData { + u32 szByteMax; + NNSG2dCellVramTransferData* pCellTransferDataArray; + +} NNSG2dVramTransferData; + +typedef struct NNSG2dCellDataBank { + u16 numCells; + u16 cellBankAttr; + NNSG2dCellData* pCellDataArrayHead; + NNSG2dCharacterDataMapingType mappingMode; + NNSG2dVramTransferData* pVramTransferData; + void* pStringBank; + void* pExtendedData; +} NNSG2dCellDataBank; + +#endif //NNSYS_G2D_FMT_G2D_CELL_DATA_H_ diff --git a/lib/include/nnsys/g2d/fmt/g2d_Character_data.h b/lib/include/nnsys/g2d/fmt/g2d_Character_data.h new file mode 100644 index 00000000..33bc315d --- /dev/null +++ b/lib/include/nnsys/g2d/fmt/g2d_Character_data.h @@ -0,0 +1,36 @@ +#ifndef NNSYS_G2D_FMT_G2D_CHARACTER_DATA_H_ +#define NNSYS_G2D_FMT_G2D_CHARACTER_DATA_H_ + +typedef enum NNSG2dCharacterDataMapingType { + NNS_G2D_CHARACTERMAPING_1D_32, + NNS_G2D_CHARACTERMAPING_1D_64, + NNS_G2D_CHARACTERMAPING_1D_128, + NNS_G2D_CHARACTERMAPING_1D_256, + NNS_G2D_CHARACTERMAPING_2D, + NNS_G2D_CHARACTERMAPING_MAX +} NNSG2dCharacterDataMapingType; + +typedef struct NNSG2dCharacterData { + u16 H; + u16 W; + GXTexFmt pixelFmt; + GXOBJVRamModeChar mapingType; + u32 characterFmt; + u32 szByte; + void* pRawData; +} NNSG2dCharacterData; + +typedef struct NNSG2dPaletteCompressInfo { + u16 numPalette; + u16 pad16; + void* pPlttIdxTbl; +} NNSG2dPaletteCompressInfo; + +typedef struct NNSG2dPaletteData { + GXTexFmt fmt; + BOOL bExtendedPlt; + u32 szByte; + void* pRawData; +} NNSG2dPaletteData; + +#endif //NNSYS_G2D_FMT_G2D_CHARACTER_DATA_H_ diff --git a/lib/include/nnsys/g2d/fmt/g2d_MultiCell_data.h b/lib/include/nnsys/g2d/fmt/g2d_MultiCell_data.h new file mode 100644 index 00000000..18d8f607 --- /dev/null +++ b/lib/include/nnsys/g2d/fmt/g2d_MultiCell_data.h @@ -0,0 +1,26 @@ +#ifndef NNSYS_G2D_FMT_G2D_MULTICELL_DATA_H_ +#define NNSYS_G2D_FMT_G2D_MULTICELL_DATA_H_ + +typedef struct NNSG2dMultiCellHierarchyData { + u16 animSequenceIdx; + s16 posX; + s16 posY; + u16 nodeAttr; +} NNSG2dMultiCellHierarchyData; + +typedef struct NNSG2dMultiCellData { + u16 numNodes; + u16 numCellAnim; + NNSG2dMultiCellHierarchyData* pHierDataArray; +} NNSG2dMultiCellData; + +typedef struct NNSG2dMultiCellDataBank { + u16 numMultiCellData; + u16 pad16; + NNSG2dMultiCellData* pMultiCellDataArray; + NNSG2dMultiCellHierarchyData* pHierarchyDataArray; + void* pStringBank; + void* pExtendedData; +} NNSG2dMultiCellDataBank; + +#endif //NNSYS_G2D_FMT_G2D_MULTICELL_DATA_H_ diff --git a/lib/include/nnsys/g2d/fmt/g2d_Screen_data.h b/lib/include/nnsys/g2d/fmt/g2d_Screen_data.h new file mode 100644 index 00000000..b4aa2c71 --- /dev/null +++ b/lib/include/nnsys/g2d/fmt/g2d_Screen_data.h @@ -0,0 +1,13 @@ +#ifndef NNSYS_G2D_FMT_G2D_SCREEN_DATA_H_ +#define NNSYS_G2D_FMT_G2D_SCREEN_DATA_H_ + +typedef struct NNSG2dScreenData { + u16 screenWidth; + u16 screenHeight; + u16 colorMode; + u16 screenFormat; + u32 szByte; + u32 rawData[1]; +} NNSG2dScreenData; + +#endif //NNSYS_G2D_FMT_G2D_SCREEN_DATA_H_ diff --git a/lib/include/nnsys/g2d/g2d_CellAnimation.h b/lib/include/nnsys/g2d/g2d_CellAnimation.h new file mode 100644 index 00000000..3ffbcdab --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_CellAnimation.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_G2D_CELLANIMATION_H_ +#define NNSYS_G2D_G2D_CELLANIMATION_H_ + +typedef NNSG2dAnimBankData NNSG2dCellAnimBankData; + +#endif //NNSYS_G2D_G2D_CELLANIMATION_H_ diff --git a/lib/include/nnsys/g2d/g2d_Image.h b/lib/include/nnsys/g2d/g2d_Image.h new file mode 100644 index 00000000..71b0226c --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_Image.h @@ -0,0 +1,42 @@ +#ifndef NNSYS_G2D_G2D_IMAGE_H_ +#define NNSYS_G2D_G2D_IMAGE_H_ + +typedef enum NNS_G2D_VRAM_TYPE { + NNS_G2D_VRAM_TYPE_3DMAIN = 0, + NNS_G2D_VRAM_TYPE_2DMAIN = 1, + NNS_G2D_VRAM_TYPE_2DSUB = 2, + NNS_G2D_VRAM_TYPE_MAX = 3 +} NNS_G2D_VRAM_TYPE; + +typedef struct NNSG2dVRamLocation { + u32 baseAddrOfVram[ NNS_G2D_VRAM_TYPE_MAX ]; +} NNSG2dVRamLocation; + +typedef struct NNSG2dImageAttr { + GXTexSizeS sizeS; + GXTexSizeT sizeT; + GXTexFmt fmt; + BOOL bExtendedPlt; + GXTexPlttColor0 plttUse; + GXOBJVRamModeChar mappingType; +} NNSG2dImageAttr; + +typedef struct NNSG2dImageProxy { + NNSG2dVRamLocation vramLocation; + NNSG2dImageAttr attr; +} NNSG2dImageProxy; + +typedef struct NNSG2dImagePaletteProxy { + GXTexFmt fmt; + BOOL bExtendedPlt; + NNSG2dVRamLocation vramLocation; +} NNSG2dImagePaletteProxy; + +void NNS_G2dLoadPaletteEx(const NNSG2dPaletteData* pSrcData, const NNSG2dPaletteCompressInfo* pCmpInfo, u32 addr, NNS_G2D_VRAM_TYPE type, NNSG2dImagePaletteProxy* pPltProxy); +void NNS_G2dLoadPalette(const NNSG2dPaletteData* pSrcData, u32 addr, NNS_G2D_VRAM_TYPE type, NNSG2dImagePaletteProxy* pPltProxy); +void NNS_G2dLoadImage1DMapping(const NNSG2dCharacterData* pSrcData, u32 baseAddr, NNS_G2D_VRAM_TYPE type, NNSG2dImageProxy* pImgProxy); +void NNS_G2dLoadImage2DMapping(const NNSG2dCharacterData* pSrcData, u32 baseAddr, NNS_G2D_VRAM_TYPE type, NNSG2dImageProxy* pImgProxy); +u32 NNS_G2dGetImageLocation (const NNSG2dImageProxy* pImg, NNS_G2D_VRAM_TYPE type); +u32 NNS_G2dGetImagePaletteLocation(const NNSG2dImagePaletteProxy* pImg, NNS_G2D_VRAM_TYPE type); + +#endif //NNSYS_G2D_G2D_IMAGE_H_ diff --git a/lib/include/nnsys/g2d/g2d_MultiCellAnimation.h b/lib/include/nnsys/g2d/g2d_MultiCellAnimation.h new file mode 100644 index 00000000..c4779a32 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_MultiCellAnimation.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_G2D_MULTICELLANIMATION_H_ +#define NNSYS_G2D_G2D_MULTICELLANIMATION_H_ + +typedef NNSG2dAnimBankData NNSG2dMultiCellAnimBankData; + +#endif //NNSYS_G2D_G2D_MULTICELLANIMATION_H_ diff --git a/lib/include/nnsys/g2d/g2d_OAM.h b/lib/include/nnsys/g2d/g2d_OAM.h new file mode 100644 index 00000000..35242de6 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_OAM.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_G2D_OAM_H_ +#define NNSYS_G2D_G2D_OAM_H_ + +void NNS_G2dInitOamManagerModule(); + +#endif //NNSYS_G2D_G2D_OAM_H_ diff --git a/lib/include/nnsys/g2d/g2d_PaletteTable.h b/lib/include/nnsys/g2d/g2d_PaletteTable.h new file mode 100644 index 00000000..c69b6117 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_PaletteTable.h @@ -0,0 +1,10 @@ +#ifndef NNSYS_G2D_G2D_PALETTE_TABLE_H_ +#define NNSYS_G2D_G2D_PALETTE_TABLE_H_ + +#define NNS_G2D_NUM_COLOR_PALETTE 16 + +typedef struct NNSG2dPaletteSwapTable { + u16 paletteIndex[NNS_G2D_NUM_COLOR_PALETTE]; +} NNSG2dPaletteSwapTable; + +#endif //NNSYS_G2D_G2D_PALETTE_TABLE_H_ diff --git a/lib/include/nnsys/g2d/g2d_Renderer.h b/lib/include/nnsys/g2d/g2d_Renderer.h new file mode 100644 index 00000000..ca74c7d5 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_Renderer.h @@ -0,0 +1,52 @@ +#ifndef NNSYS_G2D_G2D_RENDERER_H_ +#define NNSYS_G2D_G2D_RENDERER_H_ + +struct NNSG2dRendererInstance; +struct NNSG2dRenderSurface; + +typedef BOOL(*NNSG2dRndCellCullingFunction)(const NNSG2dCellData* pCell, const MtxFx32* pMtx, const NNSG2dViewRect* pViewRec); + +typedef void(*NNSG2dRndDrawCellCallBack)(struct NNSG2dRendererInstance* pRend, struct NNSG2dRenderSurface* pSurface, const NNSG2dCellData* pCell, const MtxFx32* pMtx); + +typedef void(*NNSG2dRndDrawOamCallBack)(struct NNSG2dRendererInstance* pRend, struct NNSG2dRenderSurface* pSurface, const NNSG2dCellData* pCell, u16 oamIdx, const MtxFx32* pMtx); + +typedef struct NNSG2dRenderSurface { + union { + NNSG2dRndCoreSurface coreSurface; + struct { + NNSG2dViewRect viewRect; + BOOL bActive; + NNSG2dSurfaceType type; + NNSG2dRndCoreDrawCellCallBack pBeforeCoreDrawCellBack; + NNSG2dRndCoreDrawCellCallBack pAfterCoreDrawCellBack; + NNSG2dRndCoreDrawOamCallBack pBeforeCoreDrawOamBack; + NNSG2dRndCoreDrawOamCallBack pAfterCoreDrawOamBack; + }; + }; + NNSG2dOamRegisterFunction pFuncOamRegister; + NNSG2dAffineRegisterFunction pFuncOamAffineRegister; + void* pNextSurface; + NNSG2dRndCellCullingFunction pFuncVisibilityCulling; + NNSG2dRndDrawCellCallBack pBeforeDrawCellBackFunc; + NNSG2dRndDrawCellCallBack pAfterDrawCellBackFunc; + NNSG2dRndDrawOamCallBack pBeforeDrawOamBackFunc; + NNSG2dRndDrawOamCallBack pAfterDrawOamBackFunc; +} NNSG2dRenderSurface; + +typedef struct NNSG2dRendererInstance { + NNSG2dRndCoreInstance rendererCore; + NNSG2dRenderSurface* pTargetSurfaceList; + NNSG2dRenderSurface* pCurrentSurface; + const NNSG2dPaletteSwapTable* pPaletteSwapTbl; + u32 opzHint; + fx32 spriteZoffsetStep; + u32 overwriteEnableFlag; + u16 overwritePriority; + u16 overwritePlttNo; + GXOamMode overwriteObjMode; + BOOL overwriteMosaicFlag; + u16 overwritePlttNoOffset; + u16 pad16_; +} NNSG2dRendererInstance; + +#endif //NNSYS_G2D_G2D_RENDERER_H_ diff --git a/lib/include/nnsys/g2d/g2d_RendererCore.h b/lib/include/nnsys/g2d/g2d_RendererCore.h new file mode 100644 index 00000000..45e8c38d --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_RendererCore.h @@ -0,0 +1,72 @@ +#ifndef NNSYS_G2D_G2D_RENDERERCORE_H_ +#define NNSYS_G2D_G2D_RENDERERCORE_H_ + +#define MtxCache_NOT_AVAILABLE 0xFFFF +#define MtxCache_NOT_AVAILABLE_ForMemFill 0xFFFFFFFF +#define NNS_G2D_NUMBER_OF_2DGRAPHICS_ENGINE 2 +#define NNS_G2D_RNDCORE_INTERNAL_OAMBUFFER_SIZE 128 +#define NNS_G2D_OAMFLIP_PATTERN_NUM 0x04 + +struct NNSG2dRndCoreInstance; + +typedef struct NNSG2dRndCore2DMtxCache { + MtxFx22 m22; + u16 affineIndex[NNS_G2D_OAMFLIP_PATTERN_NUM][NNS_G2D_NUMBER_OF_2DGRAPHICS_ENGINE]; +} NNSG2dRndCore2DMtxCache; + +typedef struct NNSG2dViewRect { + NNSG2dFVec2 posTopLeft; + NNSG2dFVec2 sizeView; +} NNSG2dViewRect; + +typedef enum NNSG2dSurfaceType { + NNS_G2D_SURFACETYPE_MAIN3D = 0x00, + NNS_G2D_SURFACETYPE_MAIN2D = 0x01, + NNS_G2D_SURFACETYPE_SUB2D = 0x02, + NNS_G2D_SURFACETYPE_MAX = 0x03 +} NNSG2dSurfaceType; + +typedef enum NNSG2dRendererAffineTypeOverwiteMode { + NNS_G2D_RND_AFFINE_OVERWRITE_NONE, + NNS_G2D_RND_AFFINE_OVERWRITE_NORMAL, + NNS_G2D_RND_AFFINE_OVERWRITE_DOUBLE +} NNSG2dRendererAffineTypeOverwiteMode; + +typedef void(*NNSG2dRndCoreDrawCellCallBack)(struct NNSG2dRndCoreInstance* pRend, const NNSG2dCellData* pCell); + +typedef void(*NNSG2dRndCoreDrawOamCallBack)(struct NNSG2dRndCoreInstance* pRend, const NNSG2dCellData* pCell, u16 oamIdx); + +typedef BOOL (*NNSG2dOamRegisterFunction) (const GXOamAttr* pOam, u16 affineIndex, BOOL bDoubleAffine); + +typedef u16 (*NNSG2dAffineRegisterFunction) (const MtxFx22* mtx); + +typedef struct NNSG2dRndCoreSurface { + NNSG2dViewRect viewRect; + BOOL bActive; + NNSG2dSurfaceType type; + NNSG2dRndCoreDrawCellCallBack pBeforeDrawCellBackFunc; + NNSG2dRndCoreDrawCellCallBack pAfterDrawCellBackFunc; + NNSG2dRndCoreDrawOamCallBack pBeforeDrawOamBackFunc; + NNSG2dRndCoreDrawOamCallBack pAfterDrawOamBackFunc; +} NNSG2dRndCoreSurface; + +typedef struct NNSG2dRndCoreInstance { + NNSG2dRndCoreSurface* pCurrentTargetSurface; + NNSG2dRendererAffineTypeOverwiteMode affineOverwriteMode; + const struct NNSG2dImageProxy* pImgProxy; + const struct NNSG2dImagePaletteProxy* pPltProxy; + u32 base2DCharOffset; + u32 baseTexAddr3D; + u32 basePltAddr3D; + NNSG2dOamRegisterFunction pFuncOamRegister; + NNSG2dAffineRegisterFunction pFuncOamAffineRegister; + u32 flipFlag; + NNSG2dRndCore2DMtxCache* pCurrentMtxCacheFor2D; + const MtxFx32* pCurrentMxt; + BOOL bDrawEnable; + fx32 zFor3DSoftwareSprite; + GXOamAttr currentOam; + MtxFx43 mtxFor3DGE; +} NNSG2dRndCoreInstance; + +#endif //NNSYS_G2D_G2D_RENDERERCORE_H_ diff --git a/lib/include/nnsys/g2d/g2d_Sprite.h b/lib/include/nnsys/g2d/g2d_Sprite.h new file mode 100644 index 00000000..1b150146 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_Sprite.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_G2D_SPRITE_H +#define NNSYS_G2D_G2D_SPRITE_H + +void NNS_G2dSetupSoftwareSpriteCamera(void); + +#endif diff --git a/lib/include/nnsys/g2d/g2d_Vec_data.h b/lib/include/nnsys/g2d/g2d_Vec_data.h new file mode 100644 index 00000000..0109afe9 --- /dev/null +++ b/lib/include/nnsys/g2d/g2d_Vec_data.h @@ -0,0 +1,19 @@ +#ifndef NNSYS_G2D_G2D_VEC_DATA_H_ +#define NNSYS_G2D_G2D_VEC_DATA_H_ + +typedef struct NNSG2dFVec2 { + fx32 x; + fx32 y; +} NNSG2dFVec2; + +typedef union { + struct { + fx32 _00, _01; + fx32 _10, _11; + fx32 _20, _21; + }; + fx32 m[3][2]; + fx32 a[6]; +} MtxFx32; + +#endif //NNSYS_G2D_G2D_VEC_DATA_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NAN_load.h b/lib/include/nnsys/g2d/load/g2d_NAN_load.h new file mode 100644 index 00000000..f59b57da --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NAN_load.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NAN_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NAN_LOAD_H_ + +BOOL NNS_G2dGetUnpackedAnimBank(void *pNanrFile, NNSG2dAnimBankData **ppAnimBank); +BOOL NNS_G2dGetUnpackedMCAnimBank(void* pNanrFile, NNSG2dAnimBankData** ppAnimBank); + +#endif //NNSYS_G2D_LOAD_G2D_NAN_LOAD_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NCE_load.h b/lib/include/nnsys/g2d/load/g2d_NCE_load.h new file mode 100644 index 00000000..05d566cf --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NCE_load.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NCE_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NCE_LOAD_H_ + +BOOL NNS_G2dGetUnpackedCellBank(void *pNcerFile, NNSG2dCellDataBank **ppCellBank); + +#endif //NNSYS_G2D_LOAD_G2D_NCE_LOAD_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NCG_load.h b/lib/include/nnsys/g2d/load/g2d_NCG_load.h new file mode 100644 index 00000000..a8089ed8 --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NCG_load.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NCG_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NCG_LOAD_H_ + +BOOL NNS_G2dGetUnpackedBGCharacterData(void *pNcgrFile, NNSG2dCharacterData **ppCharData); +BOOL NNS_G2dGetUnpackedCharacterData(void *pNcgrFile, NNSG2dCharacterData **ppCharData); + +#endif //NNSYS_G2D_LOAD_G2D_NCG_LOAD_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NCL_load.h b/lib/include/nnsys/g2d/load/g2d_NCL_load.h new file mode 100644 index 00000000..471ae04f --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NCL_load.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NCL_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NCL_LOAD_H_ + +BOOL NNS_G2dGetUnpackedPaletteData(void *pNclrFile, NNSG2dPaletteData** ppPlttData); +BOOL NNS_G2dGetUnpackedPaletteCompressInfo(void *pNclrFile, NNSG2dPaletteCompressInfo** ppPltCmpInfo); + +#endif //NNSYS_G2D_LOAD_G2D_NCL_LOAD_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NMC_load.h b/lib/include/nnsys/g2d/load/g2d_NMC_load.h new file mode 100644 index 00000000..65873703 --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NMC_load.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NMC_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NMC_LOAD_H_ + +BOOL NNS_G2dGetUnpackedMultiCellBank (void* pNmcrFile, NNSG2dMultiCellDataBank** ppMCBank); + +#endif //NNSYS_G2D_LOAD_G2D_NMC_LOAD_H_ diff --git a/lib/include/nnsys/g2d/load/g2d_NSC_load.h b/lib/include/nnsys/g2d/load/g2d_NSC_load.h new file mode 100644 index 00000000..00739f79 --- /dev/null +++ b/lib/include/nnsys/g2d/load/g2d_NSC_load.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G2D_LOAD_G2D_NSC_LOAD_H_ +#define NNSYS_G2D_LOAD_G2D_NSC_LOAD_H_ + +BOOL NNS_G2dGetUnpackedScreenData(void* pNscrFile, NNSG2dScreenData** ppScrData); + +#endif //NNSYS_G2D_LOAD_G2D_NSC_LOAD_H_ diff --git a/lib/include/nnsys/g3d.h b/lib/include/nnsys/g3d.h new file mode 100644 index 00000000..2ed7c5df --- /dev/null +++ b/lib/include/nnsys/g3d.h @@ -0,0 +1,18 @@ +#ifndef NNSYS_G3D_H_ +#define NNSYS_G3D_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif //NNSYS_G3D_H_ diff --git a/lib/include/nnsys/g3d/binres/res_struct.h b/lib/include/nnsys/g3d/binres/res_struct.h new file mode 100644 index 00000000..bd6b2fc4 --- /dev/null +++ b/lib/include/nnsys/g3d/binres/res_struct.h @@ -0,0 +1,146 @@ +#ifndef NNSYS_G3D_BINRES_RES_STRUCT_H_ +#define NNSYS_G3D_BINRES_RES_STRUCT_H_ + +typedef struct NNSG3dResDataBlockHeader_ { + union { + u32 kind; + char chr[4]; + }; + u32 size; +} NNSG3dResDataBlockHeader; + +typedef struct NNSG3dResTexInfo_ { + NNSGfdTexKey vramKey; + u16 sizeTex; + u16 ofsDict; + u16 flag; + u16 dummy_; + u32 ofsTex; +} NNSG3dResTexInfo; + +typedef struct NNSG3dResTex4x4Info_ { + NNSGfdTexKey vramKey; + u16 sizeTex; + u16 ofsDict; + u16 flag; + u16 dummy_; + u32 ofsTex; + u32 ofsTexPlttIdx; +} NNSG3dResTex4x4Info; + +typedef struct NNSG3dResPlttInfo_ { + NNSGfdTexKey vramKey; + u16 sizePltt; + u16 flag; + u16 ofsDict; + u16 dummy_; + u32 ofsPlttData; +} NNSG3dResPlttInfo; + +typedef struct NNSG3dResMdlInfo_ { + u8 sbcType; + u8 scalingRule; + u8 texMtxMode; + u8 numNode; + u8 numMat; + u8 numShp; + u8 firstUnusedMtxStackID; + u8 dummy_; + fx32 posScale; + fx32 invPosScale; + u16 numVertex; + u16 numPolygon; + u16 numTriangle; + u16 numQuad; + fx16 boxX, boxY, boxZ; + fx16 boxW, boxH, boxD; + fx32 boxPosScale; + fx32 boxInvPosScale; +} NNSG3dResMdlInfo; + +typedef struct NNSG3dResDictTreeNode_ { + u8 refBit; + u8 idxLeft; + u8 idxRight; + u8 idxEntry; +} NNSG3dResDictTreeNode; + +typedef struct NNSG3dResDict_ { + u8 revision; + u8 numEntry; + u16 sizeDictBlk; + u16 dummy_; + u16 ofsEntry; + NNSG3dResDictTreeNode node[1]; +} NNSG3dResDict; + + +#define NNS_G3D_RESNAME_SIZE (16) +#define NNS_G3D_RESNAME_VALSIZE (NNS_G3D_RESNAME_SIZE / sizeof(u32)) +typedef union NNSG3dResName_ { + char name[NNS_G3D_RESNAME_SIZE]; + u32 val[NNS_G3D_RESNAME_VALSIZE]; +} NNSG3dResName; + +typedef struct NNSG3dResNodeInfo_ { + NNSG3dResDict dict; +} NNSG3dResNodeInfo; + +typedef struct NNSG3dResTex_ { + NNSG3dResDataBlockHeader header; + NNSG3dResTexInfo texInfo; + NNSG3dResTex4x4Info tex4x4Info; + NNSG3dResPlttInfo plttInfo; + NNSG3dResDict dict; +} NNSG3dResTex; + +typedef struct NNSG3dResMdl_ { + u32 size; + u32 ofsSbc; + u32 ofsMat; + u32 ofsShp; + u32 ofsEvpMtx; + NNSG3dResMdlInfo info; + NNSG3dResNodeInfo nodeInfo; +} NNSG3dResMdl; + +typedef struct NNSG3dResFileHeader_ { + union { + char signature[4]; + u32 sigVal; + }; + u16 byteOrder; + u16 version; + u32 fileSize; + u16 headerSize; + u16 dataBlocks; +} NNSG3dResFileHeader; + +typedef struct NNSG3dResMdlSet_ { + NNSG3dResDataBlockHeader header; + NNSG3dResDict dict; +} NNSG3dResMdlSet; + +typedef struct NNSG3dResAnmHeader_ { + u8 category0; + u8 revision; + u16 category1; +} NNSG3dResAnmHeader; + +typedef struct { + NNSG3dResAnmHeader anmHeader; + u16 numFrame; + u16 dummy_; +} NNSG3dResAnmCommon; + +typedef struct NNSG3dResDictEntryHeader_ { + u16 sizeUnit; + u16 ofsName; + u8 data[4]; +} NNSG3dResDictEntryHeader; + +typedef struct NNSG3dResDictMdlSetData_ { + u32 offset; +} NNSG3dResDictMdlSetData; + +#endif //NNSYS_G3D_BINRES_RES_STRUCT_H_ diff --git a/lib/include/nnsys/g3d/binres/res_struct_accessor.h b/lib/include/nnsys/g3d/binres/res_struct_accessor.h new file mode 100644 index 00000000..9bb4f276 --- /dev/null +++ b/lib/include/nnsys/g3d/binres/res_struct_accessor.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_H +#define NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_H + +NNSG3dResMdlSet* NNS_G3dGetMdlSet(const NNSG3dResFileHeader* header); +NNSG3dResTex* NNS_G3dGetTex(const NNSG3dResFileHeader* header); + +#endif //NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_H diff --git a/lib/include/nnsys/g3d/binres/res_struct_accessor_anm.h b/lib/include/nnsys/g3d/binres/res_struct_accessor_anm.h new file mode 100644 index 00000000..44bd6cd9 --- /dev/null +++ b/lib/include/nnsys/g3d/binres/res_struct_accessor_anm.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G3D_RES_STRUCT_ACCESSOR_ANM_H_ +#define NNSYS_G3D_RES_STRUCT_ACCESSOR_ANM_H_ + +void* NNS_G3dGetAnmByIdx(const void* pRes, u32 idx); + +#endif //NNSYS_G3D_RES_STRUCT_ACCESSOR_ANM_H_ diff --git a/lib/include/nnsys/g3d/binres/res_struct_accessor_inline.h b/lib/include/nnsys/g3d/binres/res_struct_accessor_inline.h new file mode 100644 index 00000000..06d9c11a --- /dev/null +++ b/lib/include/nnsys/g3d/binres/res_struct_accessor_inline.h @@ -0,0 +1,27 @@ +#ifndef NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_INLINE_H_ +#define NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_INLINE_H_ + +static inline void* NNS_G3dGetResDataByIdx(const NNSG3dResDict* dict, u32 idx) { + NNSG3dResDictEntryHeader* hdr; + + if (dict != NULL && idx < dict->numEntry) { + hdr = (NNSG3dResDictEntryHeader*)((u8*)dict + dict->ofsEntry); + return (void*)(&hdr->data[0] + hdr->sizeUnit * idx); + } else { + return NULL; + } +} + +static inline NNSG3dResMdl* NNS_G3dGetMdlByIdx(const NNSG3dResMdlSet* mdlSet, u32 idx) { + NNSG3dResDictMdlSetData* data; + + if (mdlSet) { + data = (NNSG3dResDictMdlSetData*)NNS_G3dGetResDataByIdx(&mdlSet->dict, idx); + if (data) { + return (NNSG3dResMdl*)((u8*)mdlSet + data->offset); + } + } + return NULL; +} + +#endif //NNSYS_G3D_BINRES_RES_STRUCT_ACCESSOR_INLINE_H_ diff --git a/lib/include/nnsys/g3d/config.h b/lib/include/nnsys/g3d/config.h new file mode 100644 index 00000000..5e9b2291 --- /dev/null +++ b/lib/include/nnsys/g3d/config.h @@ -0,0 +1,16 @@ +#ifndef NNSYS_G3D_CONFIG_H_ +#define NNSYS_G3D_CONFIG_H_ + +#ifndef NNS_G3D_SIZE_JNT_MAX +#define NNS_G3D_SIZE_JNT_MAX 64 +#endif + +#ifndef NNS_G3D_SIZE_MAT_MAX +#define NNS_G3D_SIZE_MAT_MAX 64 +#endif + +#ifndef NNS_G3D_SIZE_SHP_MAX +#define NNS_G3D_SIZE_SHP_MAX 64 +#endif + +#endif //NNSYS_G3D_CONFIG_H_ diff --git a/lib/include/nnsys/g3d/gecom.h b/lib/include/nnsys/g3d/gecom.h new file mode 100644 index 00000000..5edf2db2 --- /dev/null +++ b/lib/include/nnsys/g3d/gecom.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_G3D_GECOM_H_ +#define NNSYS_G3D_GECOM_H_ + +void NNS_G3dGeBufferOP_N(u32 op, const u32* args, u32 num); + +#endif //NNSYS_G3D_GECOM_H_ diff --git a/lib/include/nnsys/g3d/gecom_inline.h b/lib/include/nnsys/g3d/gecom_inline.h new file mode 100644 index 00000000..69c44845 --- /dev/null +++ b/lib/include/nnsys/g3d/gecom_inline.h @@ -0,0 +1,20 @@ +#ifndef NNSYS_G3D_GECOM_INLINE_H_ +#define NNSYS_G3D_GECOM_INLINE_H_ + +static inline void NNS_G3dGeMtxMode(GXMtxMode mode) { + NNS_G3dGeBufferOP_N(G3OP_MTX_MODE, (u32*)&mode, G3OP_MTX_MODE_NPARAMS); +} + +static inline void NNS_G3dGePushMtx(void) { + NNS_G3dGeBufferOP_N(G3OP_MTX_PUSH, NULL, G3OP_MTX_PUSH_NPARAMS); +} + +static inline void NNS_G3dGePopMtx(int num) { + NNS_G3dGeBufferOP_N(G3OP_MTX_POP, (u32*)&num, G3OP_MTX_POP_NPARAMS); +} + +static inline void NNS_G3dGeMultMtx43(const MtxFx43* m) { + NNS_G3dGeBufferOP_N(G3OP_MTX_MULT_4x3, (u32*) m, G3OP_MTX_MULT_4x3_NPARAMS); +} + +#endif //NNSYS_G3D_GECOM_INLINE_H_ diff --git a/lib/include/nnsys/g3d/glbstate.h b/lib/include/nnsys/g3d/glbstate.h new file mode 100644 index 00000000..b4684901 --- /dev/null +++ b/lib/include/nnsys/g3d/glbstate.h @@ -0,0 +1,63 @@ +#ifndef NNSYS_G3D_GLBSTATE_H_ +#define NNSYS_G3D_GLBSTATE_H_ + +typedef enum { + NNS_G3D_GLB_FLAG_FLUSH_WVP = 0x00000001, + NNS_G3D_GLB_FLAG_FLUSH_VP = 0x00000002, + NNS_G3D_GLB_FLAG_INVBASE_UPTODATE = 0x00000004, + NNS_G3D_GLB_FLAG_INVCAMERA_UPTODATE = 0x00000008, + NNS_G3D_GLB_FLAG_INVPROJ_UPTODATE = 0x00000010, + NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE = 0x00000020, + NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE = 0x00000040, + + NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE = 0x00000080, + + NNS_G3D_GLB_FLAG_SRTCAMERA_UPTODATE = NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE, + NNS_G3D_GLB_FLAG_FLUSH_ALT = NNS_G3D_GLB_FLAG_FLUSH_WVP +} NNSG3dGlbFlag; + +typedef struct { + u32 cmd0; + u32 mtxmode_proj; + MtxFx44 projMtx; + u32 mtxmode_posvec; + MtxFx43 cameraMtx; + u32 cmd1; + u32 lightVec[4]; + u32 cmd2; + u32 prmMatColor0; + u32 prmMatColor1; + u32 prmPolygonAttr; + u32 prmViewPort; + u32 cmd3; + u32 lightColor[4]; + u32 cmd4; + MtxFx33 prmBaseRot; + VecFx32 prmBaseTrans; + VecFx32 prmBaseScale; + u32 prmTexImageParam; + u32 flag; + MtxFx43 invCameraMtx; + MtxFx43 srtCameraMtx; + MtxFx43 invSrtCameraMtx; + MtxFx43 invBaseMtx; + MtxFx44 invProjMtx; + MtxFx44 invCameraProjMtx; + VecFx32 camPos; + VecFx32 camUp; + VecFx32 camTarget; +} NNSG3dGlb; + +extern NNSG3dGlb NNS_G3dGlb; + +void NNS_G3dGlbSetBaseTrans(const VecFx32 *pTrans); + +void NNS_G3dGlbSetBaseScale(const VecFx32 *pScale); +void NNS_G3dGlbFlushP(void); +void NNS_G3dDraw(NNSG3dRenderObj *pRenderObj); +void NNS_G3dGlbLightVector(GXLightId lightID, fx16 x, fx16 y, fx16 z); +void NNS_G3dGlbLightColor(GXLightId lightID, GXRgb rgb); +void NNS_G3dGlbMaterialColorDiffAmb(GXRgb diffuse, GXRgb ambient, BOOL IsSetVtxColor); +void NNS_G3dGlbMaterialColorSpecEmi(GXRgb specular, GXRgb emission, BOOL IsShininess); + +#endif //NNSYS_G3D_GLBSTATE_H_ diff --git a/lib/include/nnsys/g3d/glbstate_inline.h b/lib/include/nnsys/g3d/glbstate_inline.h new file mode 100644 index 00000000..0c568cd3 --- /dev/null +++ b/lib/include/nnsys/g3d/glbstate_inline.h @@ -0,0 +1,13 @@ +#ifndef NNSYS_G3D_GLBSTATE_INLINE_H_ +#define NNSYS_G3D_GLBSTATE_INLINE_H_ + +static inline void NNS_G3dGlbSetBaseRot(const MtxFx33 *pRot) { + MI_Copy36B(pRot, &NNS_G3dGlb.prmBaseRot); + NNS_G3dGlb.flag &= ~(NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE | NNS_G3D_GLB_FLAG_INVBASE_UPTODATE | NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE); +} + +static inline void NNS_G3dGlbFlush(void) { + NNS_G3dGlbFlushP(); +} + +#endif //NNSYS_G3D_GLBSTATE_INLINE_H_ diff --git a/lib/include/nnsys/g3d/kernel.h b/lib/include/nnsys/g3d/kernel.h new file mode 100644 index 00000000..9c16cfbb --- /dev/null +++ b/lib/include/nnsys/g3d/kernel.h @@ -0,0 +1,54 @@ +#ifndef NNSYS_G3D_KERNEL_H_ +#define NNSYS_G3D_KERNEL_H_ + +typedef struct NNSG3dAnmObj_ { + fx32 frame; + fx32 ratio; + void* resAnm; + void* funcAnm; + struct NNSG3dAnmObj_* next; + const NNSG3dResTex* resTex; + u8 priority; + u8 numMapData; + u16 mapData[1]; +} NNSG3dAnmObj; + +struct NNSG3dMatAnmResult_; +struct NNSG3dJntAnmResult_; +struct NNSG3dVisAnmResult_; + +typedef BOOL (*NNSG3dFuncAnmBlendMat)(struct NNSG3dMatAnmResult_*, const NNSG3dAnmObj*, u32); +typedef BOOL (*NNSG3dFuncAnmBlendJnt)(struct NNSG3dJntAnmResult_*, const NNSG3dAnmObj*, u32); +typedef BOOL (*NNSG3dFuncAnmBlendVis)(struct NNSG3dVisAnmResult_*, const NNSG3dAnmObj*, u32); + +struct NNSG3dRS_; +typedef void (*NNSG3dSbcCallBackFunc)(struct NNSG3dRS_*); + +typedef struct NNSG3dRenderObj_ { + u32 flag; + NNSG3dResMdl* resMdl; + NNSG3dAnmObj* anmMat; + NNSG3dFuncAnmBlendMat funcBlendMat; + NNSG3dAnmObj* anmJnt; // 10 + NNSG3dFuncAnmBlendJnt funcBlendJnt; + NNSG3dAnmObj* anmVis; + NNSG3dFuncAnmBlendVis funcBlendVis; + NNSG3dSbcCallBackFunc cbFunc; // 20 + u8 cbCmd; + u8 cbTiming; + u16 dummy_; + NNSG3dSbcCallBackFunc cbInitFunc; + void* ptrUser; + u8* ptrUserSbc; // 30 + struct NNSG3dJntAnmResult_* recJntAnm; + struct NNSG3dMatAnmResult_* recMatAnm; + u32 hintMatAnmExist[NNS_G3D_SIZE_MAT_MAX / 32]; + u32 hintJntAnmExist[NNS_G3D_SIZE_JNT_MAX / 32]; + u32 hintVisAnmExist[NNS_G3D_SIZE_JNT_MAX / 32]; +} NNSG3dRenderObj; // size=0x54 + +void NNS_G3dRenderObjAddAnmObj(NNSG3dRenderObj* pRenderObj, NNSG3dAnmObj* pAnmObj); +void NNS_G3dRenderObjRemoveAnmObj(NNSG3dRenderObj* pRenderObj, NNSG3dAnmObj* pAnmObj); +void NNS_G3dRenderObjInit(NNSG3dRenderObj* pRenderObj, NNSG3dResMdl* pResMdl); +void NNS_G3dAnmObjInit(NNSG3dAnmObj* pAnmObj, void* pResAnm, const NNSG3dResMdl* pResMdl, const NNSG3dResTex* pResTex); +#endif //NNSYS_G3D_KERNEL_H_ diff --git a/lib/include/nnsys/g3d/kernel_inline.h b/lib/include/nnsys/g3d/kernel_inline.h new file mode 100644 index 00000000..0361a588 --- /dev/null +++ b/lib/include/nnsys/g3d/kernel_inline.h @@ -0,0 +1,14 @@ +#ifndef NNSYS_G3D_KERNEL_INLINE_H_ +#define NNSYS_G3D_KERNEL_INLINE_H_ + +static inline void NNS_G3dAnmObjSetFrame(NNSG3dAnmObj* pAnmObj, fx32 frame) { + pAnmObj->frame = frame; +} + +static inline fx32 NNS_G3dAnmObjGetNumFrame(const NNSG3dAnmObj* pAnmObj) { + const NNSG3dResAnmCommon* p; + p = (const NNSG3dResAnmCommon*) pAnmObj->resAnm; + return p->numFrame * FX32_ONE; +} + +#endif //NNSYS_G3D_KERNEL_INLINE_H_ diff --git a/lib/include/nnsys/g3d/mem.h b/lib/include/nnsys/g3d/mem.h new file mode 100644 index 00000000..08ed6f38 --- /dev/null +++ b/lib/include/nnsys/g3d/mem.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_G3D_MEM_H_ +#define NNSYS_G3D_MEM_H_ + +NNSG3dAnmObj* NNS_G3dAllocAnmObj(NNSFndAllocator* pAlloc, const void* pAnm, const NNSG3dResMdl* pMdl); +void NNS_G3dFreeAnmObj(NNSFndAllocator* pAlloc, NNSG3dAnmObj* pAnmObj); + +#endif //NNSYS_G3D_MEM_H_ diff --git a/lib/include/nnsys/g3d/util.h b/lib/include/nnsys/g3d/util.h new file mode 100644 index 00000000..93ad5987 --- /dev/null +++ b/lib/include/nnsys/g3d/util.h @@ -0,0 +1,7 @@ +#ifndef NNS_G3D_UTIL_H_ +#define NNS_G3D_UTIL_H_ + +void NNS_G3dInit(void); +int NNS_G3dScrPosToWorldLine(int px, int py, VecFx32* pNear, VecFx32* pFar); + +#endif //NNS_G3D_UTIL_H_ diff --git a/lib/include/nnsys/gfd.h b/lib/include/nnsys/gfd.h new file mode 100644 index 00000000..48aed99c --- /dev/null +++ b/lib/include/nnsys/gfd.h @@ -0,0 +1,12 @@ +#ifndef NNSYS_GFD_H +#define NNSYS_GFD_H + +#include +#include +#include +#include +#include +#include +#include + +#endif //NNSYS_GFD_H diff --git a/lib/include/nnsys/gfd/VramManager/gfd_FramePlttVramMan.h b/lib/include/nnsys/gfd/VramManager/gfd_FramePlttVramMan.h new file mode 100644 index 00000000..cb8de059 --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_FramePlttVramMan.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_FRAMEPLTTVRAMMAN_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_FRAMEPLTTVRAMMAN_H_ + +void NNS_GfdInitFrmPlttVramManager(u32 szByte, BOOL useAsDefault); + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_FRAMEPLTTVRAMMAN_H_ diff --git a/lib/include/nnsys/gfd/VramManager/gfd_FrameTexVramMan.h b/lib/include/nnsys/gfd/VramManager/gfd_FrameTexVramMan.h new file mode 100644 index 00000000..de7ad093 --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_FrameTexVramMan.h @@ -0,0 +1,6 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_FRAMETEXVRAMMANAGER_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_FRAMETEXVRAMMANAGER_H_ + +void NNS_GfdInitFrmTexVramManager(u16 numSlot, BOOL useAsDefault); + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_FRAMETEXVRAMMANAGER_H_ diff --git a/lib/include/nnsys/gfd/VramManager/gfd_LinkedListPlttVramMan.h b/lib/include/nnsys/gfd/VramManager/gfd_LinkedListPlttVramMan.h new file mode 100644 index 00000000..8654468b --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_LinkedListPlttVramMan.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTPLTTVRAMMAN_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTPLTTVRAMMAN_H_ + +u32 NNS_GfdGetLnkPlttVramManagerWorkSize(u32 numMemBlk); +void NNS_GfdInitLnkPlttVramManager(u32 szByte, void *pManagementWork, u32 szByteManagementWork, BOOL useAsDefault); + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTPLTTVRAMMAN_H_ diff --git a/lib/include/nnsys/gfd/VramManager/gfd_LinkedListTexVramMan.h b/lib/include/nnsys/gfd/VramManager/gfd_LinkedListTexVramMan.h new file mode 100644 index 00000000..16bd257b --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_LinkedListTexVramMan.h @@ -0,0 +1,7 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTTEXVRAMMAN_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTTEXVRAMMAN_H_ + +u32 NNS_GfdGetLnkTexVramManagerWorkSize( u32 numMemBlk ); +void NNS_GfdInitLnkTexVramManager(u32 szByte, u32 szByteFor4x4, void *pManagementWork, u32 szByteManagementWork, BOOL useAsDefault); + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_LINKEDLISTTEXVRAMMAN_H_ diff --git a/lib/include/nnsys/gfd/VramManager/gfd_PlttVramMan_Types.h b/lib/include/nnsys/gfd/VramManager/gfd_PlttVramMan_Types.h new file mode 100644 index 00000000..8cdc6b20 --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_PlttVramMan_Types.h @@ -0,0 +1,20 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_PLTTVRAMMAN_TYPES_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_PLTTVRAMMAN_TYPES_H_ + +typedef u32 NNSGfdPlttKey; + +#define NNS_GFD_ALLOC_ERROR_PLTTKEY (u32)0x0 + +#define NNS_GFD_PLTTKEY_ADDR_SHIFT 3 + +typedef NNSGfdPlttKey (*NNSGfdFuncAllocPlttVram)(u32 szByte, BOOL is4pltt, u32 opt); +typedef int (*NNSGfdFuncFreePlttVram)(NNSGfdPlttKey plttKey); + +extern NNSGfdFuncAllocPlttVram NNS_GfdDefaultFuncAllocPlttVram; +extern NNSGfdFuncFreePlttVram NNS_GfdDefaultFuncFreePlttVram; + +static inline u32 NNS_GfdGetPlttKeyAddr(NNSGfdPlttKey plttKey) { + return (u32)((0x0000FFFF & plttKey) << NNS_GFD_PLTTKEY_ADDR_SHIFT); +} + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_PLTTVRAMMAN_TYPES_H_ diff --git a/lib/include/nnsys/gfd/VramManager/gfd_TexVramMan_Types.h b/lib/include/nnsys/gfd/VramManager/gfd_TexVramMan_Types.h new file mode 100644 index 00000000..24d4a069 --- /dev/null +++ b/lib/include/nnsys/gfd/VramManager/gfd_TexVramMan_Types.h @@ -0,0 +1,20 @@ +#ifndef NNSYS_GFD_VRAMMANAGER_GFD_TEXVRAMMAN_TYPES_H_ +#define NNSYS_GFD_VRAMMANAGER_GFD_TEXVRAMMAN_TYPES_H_ + +typedef u32 NNSGfdTexKey; + +#define NNS_GFD_ALLOC_ERROR_TEXKEY (u32)0x0 + +#define NNS_GFD_TEXKEY_ADDR_SHIFT 3 + +typedef NNSGfdTexKey (*NNSGfdFuncAllocTexVram)(u32 szByte, BOOL is4x4comp, u32 opt); +typedef int (*NNSGfdFuncFreeTexVram)(NNSGfdTexKey key); + +extern NNSGfdFuncAllocTexVram NNS_GfdDefaultFuncAllocTexVram; +extern NNSGfdFuncFreeTexVram NNS_GfdDefaultFuncFreeTexVram; + +static inline u32 NNS_GfdGetTexKeyAddr(NNSGfdTexKey memKey) { + return (u32)((0x0000FFFF & memKey) << NNS_GFD_TEXKEY_ADDR_SHIFT); +} + +#endif //NNSYS_GFD_VRAMMANAGER_GFD_TEXVRAMMAN_TYPES_H_ diff --git a/lib/include/nnsys/gfd/VramTransferMan/gfd_VramTransferManager.h b/lib/include/nnsys/gfd/VramTransferMan/gfd_VramTransferManager.h new file mode 100644 index 00000000..cc17411e --- /dev/null +++ b/lib/include/nnsys/gfd/VramTransferMan/gfd_VramTransferManager.h @@ -0,0 +1,58 @@ +#ifndef NNSYS_GFD_VRAMTRANSFERMAN_GFD_VRAMTRANSFERMANAGER_H_ +#define NNSYS_GFD_VRAMTRANSFERMAN_GFD_VRAMTRANSFERMANAGER_H_ + +typedef enum NNS_GFD_DST_TYPE { + NNS_GFD_DST_3D_TEX_VRAM = 0, + NNS_GFD_DST_3D_TEX_PLTT, + NNS_GFD_DST_3D_CLRIMG_COLOR, + NNS_GFD_DST_3D_CLRIMG_DEPTH, + + NNS_GFD_DST_2D_BG0_CHAR_MAIN, + NNS_GFD_DST_2D_BG1_CHAR_MAIN, + NNS_GFD_DST_2D_BG2_CHAR_MAIN, + NNS_GFD_DST_2D_BG3_CHAR_MAIN, + NNS_GFD_DST_2D_BG0_SCR_MAIN, + NNS_GFD_DST_2D_BG1_SCR_MAIN, + NNS_GFD_DST_2D_BG2_SCR_MAIN, + NNS_GFD_DST_2D_BG3_SCR_MAIN, + NNS_GFD_DST_2D_BG2_BMP_MAIN, + NNS_GFD_DST_2D_BG3_BMP_MAIN, + NNS_GFD_DST_2D_OBJ_PLTT_MAIN, + NNS_GFD_DST_2D_BG_PLTT_MAIN, + NNS_GFD_DST_2D_OBJ_EXTPLTT_MAIN, + NNS_GFD_DST_2D_BG_EXTPLTT_MAIN, + NNS_GFD_DST_2D_OBJ_OAM_MAIN, + NNS_GFD_DST_2D_OBJ_CHAR_MAIN, + + NNS_GFD_DST_2D_BG0_CHAR_SUB, + NNS_GFD_DST_2D_BG1_CHAR_SUB, + NNS_GFD_DST_2D_BG2_CHAR_SUB, + NNS_GFD_DST_2D_BG3_CHAR_SUB, + NNS_GFD_DST_2D_BG0_SCR_SUB, + NNS_GFD_DST_2D_BG1_SCR_SUB, + NNS_GFD_DST_2D_BG2_SCR_SUB, + NNS_GFD_DST_2D_BG3_SCR_SUB, + NNS_GFD_DST_2D_BG2_BMP_SUB, + NNS_GFD_DST_2D_BG3_BMP_SUB, + NNS_GFD_DST_2D_OBJ_PLTT_SUB, + NNS_GFD_DST_2D_BG_PLTT_SUB, + NNS_GFD_DST_2D_OBJ_EXTPLTT_SUB, + NNS_GFD_DST_2D_BG_EXTPLTT_SUB, + NNS_GFD_DST_2D_OBJ_OAM_SUB, + NNS_GFD_DST_2D_OBJ_CHAR_SUB, + + NNS_GFD_DST_MAX +} NNS_GFD_DST_TYPE; + +typedef struct NNSGfdVramTransferTask { + NNS_GFD_DST_TYPE type; + void* pSrc; + u32 dstAddr; + u32 szByte; +} NNSGfdVramTransferTask; + +void NNS_GfdInitVramTransferManager (NNSGfdVramTransferTask* pTaskArray, u32 lengthOfArray); +BOOL NNS_GfdRegisterNewVramTransferTask (NNS_GFD_DST_TYPE type, u32 dstAddr, void* pSrc, u32 szByte); +void NNS_GfdDoVramTransfer(void); + +#endif //NNSYS_GFD_VRAMTRANSFERMAN_GFD_VRAMTRANSFERMANAGER_H_ diff --git a/lib/include/nnsys/snd.h b/lib/include/nnsys/snd.h new file mode 100644 index 00000000..154cd51f --- /dev/null +++ b/lib/include/nnsys/snd.h @@ -0,0 +1,13 @@ +#ifndef NNSYS_SND_H_ +#define NNSYS_SND_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif //NNSYS_SND_H_ diff --git a/lib/include/nnsys/snd/heap.h b/lib/include/nnsys/snd/heap.h new file mode 100644 index 00000000..af3edf8c --- /dev/null +++ b/lib/include/nnsys/snd/heap.h @@ -0,0 +1,13 @@ +#ifndef NNSYS_SND_HEAP_H_ +#define NNSYS_SND_HEAP_H_ + +struct NNSSndHeap; +typedef struct NNSSndHeap* NNSSndHeapHandle; + +NNSSndHeapHandle NNS_SndHeapCreate(void *buf, u32 maxsize); +int NNS_SndHeapSaveState(NNSSndHeapHandle heap); +int NNS_SndHeapLoadState(NNSSndHeapHandle heap, int level); +u32 NNS_SndHeapGetSize(NNSSndHeapHandle heap); +u32 NNS_SndHeapGetFreeSize(NNSSndHeapHandle heap); + +#endif //NNSYS_SND_HEAP_H_ diff --git a/lib/include/nnsys/snd/main.h b/lib/include/nnsys/snd/main.h new file mode 100644 index 00000000..65342413 --- /dev/null +++ b/lib/include/nnsys/snd/main.h @@ -0,0 +1,10 @@ +#ifndef NNSYS_SND_MAIN_H_ +#define NNSYS_SND_MAIN_H_ + +void NNS_SndInit(void); +void NNS_SndMain(void); +BOOL NNS_SndUpdateDriverInfo(void); +BOOL NNS_SndReadDriverChannelInfo(int chNo, SNDChannelInfo* info); +BOOL NNS_SndPlayerReadDriverTrackInfo(NNSSndHandle* handle, int trackNo, struct SNDTrackInfo* info); + +#endif //NNSYS_SND_MAIN_H_ diff --git a/lib/include/nnsys/snd/player.h b/lib/include/nnsys/snd/player.h new file mode 100644 index 00000000..ad185ed9 --- /dev/null +++ b/lib/include/nnsys/snd/player.h @@ -0,0 +1,18 @@ +#ifndef GUARD_PLAYER_H +#define GUARD_PLAYER_H + +typedef struct NNSSndHandle +{ + struct NNSSndSeqPlayer* player; +} NNSSndHandle; + +void NNS_SndHandleInit(NNSSndHandle *handle); +void NNS_SndHandleReleaseSeq(NNSSndHandle *handle); +void NNS_SndPlayerStopSeqByPlayerNo(int playerNo, int fadeFrame); +void NNS_SndPlayerSetAllocatableChannel(int playerNo, u32 chBitFlag); +void NNS_SndPlayerSetPlayableSeqCount(int playerNo, int seqCount); +BOOL NNS_SndPlayerCreateHeap(int playerNo, NNSSndHeapHandle heap, u32 size); +void NNS_SndPlayerPauseByPlayerNo(int playerNo, BOOL flag); +int NNS_SndPlayerCountPlayingSeqByPlayerNo(int playerNo); + +#endif //GUARD_PLAYER_H diff --git a/lib/include/nnsys/snd/seqdata.h b/lib/include/nnsys/snd/seqdata.h new file mode 100644 index 00000000..2f6b0418 --- /dev/null +++ b/lib/include/nnsys/snd/seqdata.h @@ -0,0 +1,13 @@ +#ifndef GUARD_SEQDATA_H +#define GUARD_SEQDATA_H + +typedef struct NNSSndSeqParam { + u16 bankNo; + u8 volume; + u8 channelPrio; + u8 playerPrio; + u8 playerNo; + u16 reserved; +} NNSSndSeqParam; + +#endif //GUARD_SEQDATA_H diff --git a/lib/include/nnsys/snd/sndarc.h b/lib/include/nnsys/snd/sndarc.h new file mode 100644 index 00000000..041fd1ba --- /dev/null +++ b/lib/include/nnsys/snd/sndarc.h @@ -0,0 +1,79 @@ +#ifndef NNSYS_SND_SNDARC_H_ +#define NNSYS_SND_SNDARC_H_ + +typedef struct NNSSndArcFileInfo +{ + u32 offset; + u32 size; + void* mem; + u32 reserved; +} NNSSndArcFileInfo; + +typedef struct NNSSndArcFat +{ + struct SNDBinaryBlockHeader blockHeader; + + u32 count; + NNSSndArcFileInfo files[0]; +} NNSSndArcFat; + +typedef struct NNSSndArcInfo +{ + struct SNDBinaryBlockHeader blockHeader; + + u32 seqOffset; + u32 seqArcOffset; + u32 bankOffset; + u32 waveArcOffset; + u32 playerInfoOffset; + u32 groupInfoOffset; + u32 strmPlayerInfoOffset; + u32 strmOffset; +} NNSSndArcInfo; + +typedef struct NNSSndArcSymbol +{ + struct SNDBinaryBlockHeader blockHeader; + + u32 seqOffset; + u32 seqArcOffset; + u32 bankOffset; + u32 waveArcOffset; + u32 playerOffset; + u32 groupOffset; + u32 strmPlayerOffset; + u32 strmOffset; +} NNSSndArcSymbol; + +typedef struct NNSSndArcHeader +{ + struct SNDBinaryFileHeader fileHeader; + u32 symbolDataOffset; + u32 symbolDataSize; + u32 infoOffset; + u32 infoSize; + u32 fatOffset; + u32 fatSize; + u32 fileImageOffset; + u32 fileImageSize; +} NNSSndArcHeader; + +typedef struct NNSSndArc +{ + NNSSndArcHeader header; + BOOL file_open; +#ifndef NNS_FROM_TOOL + FSFile file; + FSFileID fileId; +#endif // NNS_FROM_TOOL + struct NNSSndArcFat* fat; + struct NNSSndArcSymbol* symbol; + struct NNSSndArcInfo* info; + s32 loadBlockSize; +} NNSSndArc; + +void NNS_SndArcInit(NNSSndArc *arc, const char *filePath, NNSSndHeapHandle heap, BOOL symbolLoadFlag); + +const NNSSndSeqParam* NNS_SndArcGetSeqParam(int seqNo); + +#endif //NNSYS_SND_SNDARC_H_ diff --git a/lib/include/nnsys/snd/sndarc_loader.h b/lib/include/nnsys/snd/sndarc_loader.h new file mode 100644 index 00000000..274bfb8f --- /dev/null +++ b/lib/include/nnsys/snd/sndarc_loader.h @@ -0,0 +1,11 @@ +#ifndef NNSYS_SND_SNDARC_LOADER_H_ +#define NNSYS_SND_SNDARC_LOADER_H_ + +BOOL NNS_SndArcLoadGroup(int groupNo, NNSSndHeapHandle heap); +BOOL NNS_SndArcLoadSeq(int seqNo, NNSSndHeapHandle heap); +BOOL NNS_SndArcLoadBank(int bankNo, NNSSndHeapHandle heap); +BOOL NNS_SndArcLoadWaveArc(int waveArcNo, NNSSndHeapHandle heap); +BOOL NNS_SndArcLoadSeqEx(int seqNo, u32 loadFlag, NNSSndHeapHandle heap); +BOOL NNS_SndArcLoadBankEx(int bankNo, u32 loadFlag, NNSSndHeapHandle heap); + +#endif //NNSYS_SND_SNDARC_LOADER_H_ diff --git a/lib/include/nnsys/snd/sndarc_player.h b/lib/include/nnsys/snd/sndarc_player.h new file mode 100644 index 00000000..9ac5fd4e --- /dev/null +++ b/lib/include/nnsys/snd/sndarc_player.h @@ -0,0 +1,9 @@ +#ifndef NNSYS_SND_SNDARC_PLAYER_H_ +#define NNSYS_SND_SNDARC_PLAYER_H_ + +struct NNSSndHandle; + +BOOL NNS_SndArcPlayerSetup(NNSSndHeapHandle heap); +BOOL NNS_SndArcPlayerStartSeqEx(struct NNSSndHandle* handle, int playerNo, int bankNo, int playerPrio, int seqNo); + +#endif //NNSYS_SND_SNDARC_PLAYER_H_ diff --git a/lib/include/nnsys/snd/waveout.h b/lib/include/nnsys/snd/waveout.h new file mode 100644 index 00000000..c2b8c205 --- /dev/null +++ b/lib/include/nnsys/snd/waveout.h @@ -0,0 +1,12 @@ +#ifndef NNSYS_SND_WAVEOUT_H_ +#define NNSYS_SND_WAVEOUT_H_ + +typedef enum NNSSndWaveFormat { + NNS_SND_WAVE_FORMAT_PCM8, + NNS_SND_WAVE_FORMAT_PCM16 +} NNSSndWaveFormat; + +struct NNSSndWaveOut; +typedef struct NNSSndWaveOut* NNSSndWaveOutHandle; + +#endif //NNSYS_SND_WAVEOUT_H_ diff --git a/lib/include/size_t.h b/lib/include/size_t.h new file mode 100644 index 00000000..78277f50 --- /dev/null +++ b/lib/include/size_t.h @@ -0,0 +1,14 @@ +#ifndef _MSL_SIZE_T_H +#define _MSL_SIZE_T_H + +#include + +_MSL_BEGIN_NAMESPACE_STD +_MSL_BEGIN_EXTERN_C + +typedef __typeof__(sizeof(0)) size_t; + +_MSL_END_EXTERN_C +_MSL_END_NAMESPACE_STD + +#endif //_MSL_SIZE_T_H diff --git a/lib/include/stdarg.h b/lib/include/stdarg.h new file mode 100644 index 00000000..bbdf0171 --- /dev/null +++ b/lib/include/stdarg.h @@ -0,0 +1,23 @@ +#ifndef MSL_STDARG_H +#define MSL_STDARG_H + +#include + +_MSL_BEGIN_NAMESPACE_STD +_MSL_BEGIN_EXTERN_C + +#ifndef _MSL_VA_LIST_TYPE +#define _MSL_VA_LIST_TYPE char* +#endif //_MSL_VA_LIST_TYPE +#ifndef _MSL_VA_LIST_DEFINED +typedef _MSL_VA_LIST_TYPE va_list; +#define _MSL_VA_LIST_DEFINED +#endif + +#define va_start(list, arg) ({ list = (va_list)(((u32)&(arg) & ~3) + 4); }) +#define va_end(list) ((void)0) + +_MSL_END_EXTERN_C +_MSL_END_NAMESPACE_STD + +#endif //MSL_STDARG_H diff --git a/lib/include/stddef.h b/lib/include/stddef.h new file mode 100644 index 00000000..a111ec5e --- /dev/null +++ b/lib/include/stddef.h @@ -0,0 +1,14 @@ +#ifndef MSL_STDDEF_H_ +#define MSL_STDDEF_H_ + +#include + +_MSL_BEGIN_NAMESPACE_STD +_MSL_BEGIN_EXTERN_C + +#define offsetof(type, field) ((size_t)&((type *)0)->field) + +_MSL_END_EXTERN_C +_MSL_END_NAMESPACE_STD + +#endif //MSL_STDDEF_H_ diff --git a/lib/include/string.h b/lib/include/string.h new file mode 100644 index 00000000..e9222d2a --- /dev/null +++ b/lib/include/string.h @@ -0,0 +1,28 @@ +#ifndef MSL_STRING_H_ +#define MSL_STRING_H_ + +#include +#include + +_MSL_BEGIN_NAMESPACE_STD +_MSL_BEGIN_EXTERN_C + +void *memset(void *data, int value, size_t size); +void *memmove(void *dest, const void *src, size_t size); +void *memcpy(void *dest, const void *src, size_t size); +void *memchr(const void *arr, int value, size_t size); +int memcmp(const void *a, const void *b, size_t size); +char *strcpy(char *dest, const char *src); +unsigned strlen(const char *str); +char *strncpy(char *dest, const char *src, size_t n); +int strcmp(const char *a, const char *b); +char *strcat(char *dest, const char *src); +char *strncat(char *dest, const char *src, size_t n); +unsigned strspn(const char *a, const char *b); +char *strtok(char *str, const char *sep); +char *strstr(const char *haystack, const char *needle); + +_MSL_END_EXTERN_C +_MSL_END_NAMESPACE_STD + +#endif //MSL_STRING_H_ diff --git a/lib/syscall/Makefile b/lib/syscall/Makefile new file mode 100644 index 00000000..2d1a0dd8 --- /dev/null +++ b/lib/syscall/Makefile @@ -0,0 +1,32 @@ +GAME_CODE ?= arm9 +MWCCVER := 2.0/sp2p3 +PROC := arm946e +PROC_S := arm5te +PROC_LD := v5te +BUILD_DIR := build/$(GAME_CODE) + +include ../../common.mk + +MWLDFLAGS := -library -nodead -w off -proc $(PROC_LD) +LIB := $(BUILD_DIR)/libsyscall.a + +.PHONY: all install + +INSTALL_PREFIX ?= $(WORK_DIR)/lib/ARM9-TS +INSTALL_LIBDIR := $(INSTALL_PREFIX)/lib + +all: $(LIB) + +ASM_SRCS := asm/_secure_$(GAME_CODE).s + +$(LIB): $(ALL_OBJS) + cd $(BUILD_DIR) && LM_LICENSE_FILE=$(BACK_REL)/$(LM_LICENSE_FILE) $(WINE) $(MWLD) $(MWLDFLAGS) -o $(BACK_REL)/$(LIB) $(ALL_OBJS:$(BUILD_DIR)/%=%) + +install: all + $(shell mkdir -p $(INSTALL_LIBDIR)) + cp $(LIB) $(INSTALL_LIBDIR)/ + +tidy: + $(RM) -r $(BUILD_DIR) + +clean: tidy diff --git a/lib/syscall/asm/_secure_IPGE.s b/lib/syscall/asm/_secure_IPGE.s new file mode 100644 index 00000000..23da8830 --- /dev/null +++ b/lib/syscall/asm/_secure_IPGE.s @@ -0,0 +1,272 @@ + .include "asm/macros.inc" + .text + +_secure: ; 0x02000000 + .byte 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0x93, 0x4A + .byte 0x56, 0xEC, 0x27, 0x76, 0x10, 0xCC, 0x56, 0xA3, 0xAF, 0x5C, 0xB6, 0x92, 0xFE, 0xEF, 0xCB, 0xCB + .byte 0x0B, 0x23, 0x3B, 0x70, 0x3F, 0xBE, 0xA5, 0x5C, 0x24, 0xE9, 0x63, 0x26, 0x50, 0x1B, 0xE5, 0xC4 + .byte 0x7B, 0x54, 0xBF, 0xBE, 0xBC, 0xE3, 0x2C, 0x92, 0xEB, 0x96, 0x68, 0xDC, 0xA8, 0xEE, 0xD2, 0xE6 + .byte 0x39, 0x99, 0x7A, 0xB1, 0xAC, 0x97, 0x07, 0x4A, 0xD1, 0x1B, 0x69, 0x13, 0x11, 0xB3, 0xEE, 0x12 + .byte 0xE5, 0xE7, 0x1E, 0x39, 0x2B, 0x8C, 0xCC, 0xB3, 0x1B, 0x24, 0xA0, 0x62, 0x97, 0xB0, 0x81, 0x9F + .byte 0x7B, 0x12, 0x8C, 0x72, 0xCE, 0x1D, 0xEA, 0xD0, 0x96, 0x28, 0xB4, 0x13, 0xDA, 0x53, 0x37, 0x64 + .byte 0x70, 0x57, 0x42, 0x99, 0xFF, 0xC0, 0xE9, 0xDA, 0x91, 0xDB, 0x00, 0x20, 0x90, 0x37, 0x15, 0x61 + + non_word_aligned_thumb_func_start SVC_WaitVBlankIntr +SVC_WaitVBlankIntr: ; 0x02000080 + mov r2, #0 + swi 5 + bx lr + thumb_func_end SVC_WaitVBlankIntr +_02000086: + .byte 0xD3, 0xB8, 0x1C, 0xE1, 0x4E, 0x6E, 0x49, 0xE9, 0x01, 0x41 + .byte 0x2D, 0xAC, 0x56, 0x58, 0x28, 0x5B, 0xED, 0xA2, 0x0A, 0x17, 0x0E, 0x51, 0x13, 0xCB, 0x45, 0x6B + .byte 0x7A, 0xCF, 0xE2, 0x73, 0x61, 0x2A, 0xC9, 0x3D, 0xB6, 0x3B, 0xB0, 0x46, 0x82, 0xBE, 0xBE, 0x40 + .byte 0x8E, 0xD6, 0x7E, 0xE6, 0x53, 0x28, 0xAA, 0xDA, 0x58, 0x73, 0xE6, 0xEA, 0xFF, 0x6C, 0x7E, 0xA2 + .byte 0x90, 0xC9, 0x2E, 0xDC, 0xEA, 0xB9, 0x21, 0x93, 0xBD, 0x94, 0x55, 0x8D, 0x2C, 0x1E, 0x3F, 0x4D + .byte 0x88, 0x73, 0xE6, 0xD0, 0xE1, 0x6B, 0xB2, 0xD8, 0x76, 0x81, 0xD3, 0xC3, 0xAE, 0x51, 0x3B, 0xB4 + .byte 0xC5, 0x2E, 0x13, 0x05, 0x23, 0x23 + + non_word_aligned_thumb_func_start SVC_SoftReset +SVC_SoftReset: ; 0x020000E6 + swi 0 + bx lr + thumb_func_end SVC_SoftReset +_020000EA: + .byte 0xE9, 0x8E, 0x1C, 0x11, 0x58, 0xB4 + .byte 0x48, 0x86, 0xD8, 0xFC, 0x24, 0x82, 0x53, 0x2E, 0x89, 0x0A, 0x8D, 0xD2, 0xD0, 0x29, 0x60, 0xD3 + .byte 0x60, 0x23, 0x4C, 0x62, 0xAB, 0x3B, 0xBA, 0x53, 0x23, 0x83, 0xE2, 0x66, 0x40, 0xBA, 0x6B, 0x85 + .byte 0x18, 0x35, 0xD1, 0x67, 0xEB, 0xCC, 0x78, 0xB8, 0xE4, 0x0A, 0xB7, 0x04, 0x3C, 0xCD, 0x0A, 0x37 + .byte 0x09, 0xF6, 0x48, 0x30, 0x75, 0x73, 0x3B, 0xFE, 0x9F, 0x33, 0x33, 0x6D, 0x7C, 0xB4, 0xEE, 0x50 + .byte 0x6B, 0x62, 0x26, 0x66, 0xA8, 0xB4, 0x7F, 0x99, 0x4C, 0x6D, 0xFE, 0x90, 0x6D, 0x39, 0xDB, 0xF5 + .byte 0xD2, 0x61, 0xD2, 0x92, 0x30, 0x49, 0xFE, 0xBC, 0x7C, 0xDC, 0xFA, 0xA6, 0x9A, 0xBB, 0xAB, 0x48 + .byte 0xD6, 0xCF, 0x9B, 0xA9, 0x64, 0x05, 0x6C, 0xC4, 0x4D, 0x2B, 0xE6, 0x1A, 0x8B, 0x97, 0x4C, 0x48 + .byte 0x6F, 0x36 + + non_word_aligned_thumb_func_start SVC_CpuSet +SVC_CpuSet: ; 0x02000162 + swi 0xb + bx lr + thumb_func_end SVC_CpuSet +_02000166: + .byte 0x13, 0x90, 0x6F, 0x76, 0x6C, 0xCD, 0x5A, 0xD3, 0x8C, 0x6C + .byte 0x5C, 0xA7, 0xC9, 0x16, 0x29, 0xB4, 0xC4, 0x16, 0x10, 0x20, 0xF7, 0x72, 0xC8, 0xC7, 0x36, 0x58 + .byte 0x02, 0xA7, 0x83, 0xBE, 0xC9, 0xAA, 0x05, 0xB2, 0xDE, 0x7F, 0x06, 0x5E, 0x47, 0xB3, 0xDA, 0x9B + .byte 0x78, 0xEA, 0xB7, 0xAB, 0xB5, 0xE5, 0x11, 0x70, 0xCA, 0x1B, 0x00, 0x43, 0xAF, 0xE6, 0xE9, 0x12 + .byte 0xD4, 0x3F, 0x73, 0x8E, 0x8C, 0xA7, 0x8D, 0xA1, 0xF4, 0x76, 0xAE, 0xA5, 0x1C, 0x65, 0xC0, 0x5E + .byte 0x09, 0x41, 0xD6, 0x3F, 0xC3, 0xA9, 0x4D, 0xC1, 0x42, 0x06, 0xBE, 0xCE, 0xCD, 0x42, 0x65, 0x66 + .byte 0x11, 0xBA, 0x05, 0xC1, 0xBB, 0x55, 0x2C, 0x09, 0x2B, 0x73, 0x5A, 0x2B, 0x4C, 0x2C, 0x3A, 0xCC + .byte 0xE8, 0x0B, 0x1C, 0xD7, 0x8B, 0x13 + + non_word_aligned_thumb_func_start SVC_Sqrt +SVC_Sqrt: ; 0x020001D6 + swi 0xd + bx lr + thumb_func_end SVC_Sqrt +_020001DA: + .byte 0xE0, 0xB0, 0x2E, 0x70, 0x52, 0x8A + .byte 0x90, 0xD9, 0xB4, 0x92, 0xB3, 0xAD, 0x50, 0xCE, 0xBD, 0x74, 0xA2, 0x8A, 0xE7, 0xF9, 0xF5, 0x03 + .byte 0xCF, 0xD3, 0x45, 0xAE, 0x31, 0x64, 0xF5, 0x80, 0x71, 0x17, 0x78, 0x7D, 0x22, 0x0C, 0xE3, 0xC7 + .byte 0x4C, 0x0D, 0xB1, 0xD2, 0x87, 0xE6, 0x1E, 0x38, 0x06, 0x9A, 0x62, 0x65, 0x95, 0xF0, 0x51, 0x47 + .byte 0x5E, 0x20, 0x7E, 0x79, 0xD8, 0xF1, 0x81, 0x51, 0x6F, 0xB9, 0x2E, 0xF2, 0x82, 0x07, 0x98, 0xB7 + .byte 0x3D, 0xE6, 0x46, 0xD3, 0x62, 0x93, 0xE0, 0xB0, 0x31, 0x05, 0x8F, 0x2A, 0x33, 0x33, 0x8B, 0x3E + .byte 0x4B, 0x4D, 0x65, 0xE3, 0x35, 0x8E, 0x22, 0x28, 0xF3, 0xC8, 0xC4, 0x5E, 0x75, 0x84, 0xF6, 0xEF + .byte 0xB3, 0x3B, 0xFD, 0xE7, 0x7C, 0x28, 0x9D, 0xAA, 0x3D, 0x77, 0xD2, 0xF3, 0x1E, 0x45, 0xFF, 0x68 + .byte 0x0C, 0xFD, 0x98, 0x71, 0xE5, 0xDD, 0x28, 0xE7, 0x8F, 0xC1, 0x51, 0x78, 0x19, 0x0A, 0xB0, 0x37 + .byte 0x42, 0xB7, 0xA2, 0x84, 0x92, 0x70, 0x09, 0x9C + + non_word_aligned_thumb_func_start SVC_UnpackBits +SVC_UnpackBits: ; 0x02000268 + swi 0x10 + bx lr + thumb_func_end SVC_UnpackBits +_0200026C: + .byte 0x4F, 0xC8, 0x11, 0x6A + .byte 0x88, 0x86, 0x94, 0x97, 0xED, 0x70, 0x50, 0x62, 0x9B, 0xD9, 0xA5, 0x2C, 0xF4, 0x98, 0xBA, 0xC2 + .byte 0xF1, 0x4E, 0x73, 0xA1, 0x09, 0x39, 0xD4, 0x14, 0x71, 0x23, 0x6C, 0xE1, 0x45, 0x25, 0x65, 0x7F + .byte 0x05, 0xFB, 0x78, 0xA4, 0xD8, 0xA7, 0x31, 0x3C, 0x5A, 0x42, 0xF3, 0x0C, 0xA5, 0x20, 0x40, 0xDD + .byte 0xED, 0x2B, 0x7E, 0x0B, 0xE6, 0x20, 0x39, 0x09, 0x38, 0x5F, 0x9E, 0xF5, 0x09, 0x4D, 0x74, 0x9E + .byte 0x6D, 0x69, 0x29, 0x91, 0x72, 0x0A, 0x66, 0xB7, 0xFE, 0x1B, 0x47, 0x99, 0x3B, 0x5B, 0x20, 0x87 + .byte 0x87, 0x65, 0x18, 0x25, 0x42, 0x88, 0xA6, 0xF2, 0xE6, 0x32, 0xB1, 0xE0, 0x2B, 0x38, 0x00, 0xAD + .byte 0xD1, 0xDF, 0x87, 0x8D, 0x1A, 0xEF, 0xCF, 0xB6, 0xCE, 0x1E, 0x12, 0x10, 0x0B, 0x60, 0xDF, 0xB6 + .byte 0xB0, 0x58, 0xF3, 0x70, 0x19, 0xD7 + + non_word_aligned_thumb_func_start SVC_DivRem +SVC_DivRem: ; 0x020002E6 + swi 9 + add r0, r1, #0 + bx lr + thumb_func_end SVC_DivRem +_020002EC: + .byte 0x70, 0x0E, 0xE6, 0x59 + .byte 0x8D, 0xDA, 0xE7, 0xF7, 0x6E, 0xDB, 0x2B, 0x9F, 0x01, 0xFB, 0x42, 0xDF, 0x9A, 0xDE, 0x13, 0x52 + .byte 0x9A, 0xA3, 0x17, 0x5C, 0x2F, 0x12, 0xB8, 0x49, 0xB4, 0xC0, 0x96, 0x64, 0x51, 0x79, 0x45, 0xD3 + .byte 0xB9, 0x6F, 0x38, 0x07, 0xA8, 0xCC, 0xE3, 0x55, 0xA6, 0x0D, 0xC6, 0xE3, 0x75, 0xD9, 0xEB, 0xBD + .byte 0x64, 0x41, 0x6E, 0x67, 0xD6, 0xD2, 0xC7, 0x0A, 0x19, 0x49, 0x9A, 0x9B, 0x8E, 0x56, 0x07, 0x84 + .byte 0xE5, 0x18, 0xEB, 0x6D, 0x98, 0x35, 0x44, 0x78, 0x72, 0x82, 0x8B, 0x31, 0x07, 0x41, 0x19, 0x67 + .byte 0x40, 0x8D, 0xDB, 0x3D, 0x41, 0x1D, 0xC8, 0xA0, 0x08, 0x51, 0xFB, 0x01, 0x77, 0x6D, 0x0E, 0xF9 + .byte 0x59, 0x29, 0x8B, 0xDD, 0x9B, 0xF9, 0x99, 0x6F + + non_word_aligned_thumb_func_start SVC_UncompressLZ16FromDevice +SVC_UncompressLZ16FromDevice: ; 0x02000358 + swi 0x12 + bx lr + thumb_func_end SVC_UncompressLZ16FromDevice +_0200035C: + .byte 0x6D, 0x7A, 0x32, 0xFC + .byte 0xC3, 0x9F, 0x2D, 0xB1, 0xD9, 0x61, 0x21, 0x81, 0xEF, 0x75, 0xCB, 0xE6, 0x55, 0x78, 0x7B, 0xB1 + .byte 0x23, 0x8A, 0x07, 0x49, 0x00, 0xE2, 0x2F, 0x64, 0x80, 0x2E, 0x04, 0xB5, 0x1B, 0x26, 0xD9, 0xCD + .byte 0xA6, 0xDF, 0x07, 0xA9, 0xFC, 0x20, 0x68, 0xFD, 0x01, 0xA8, 0xB3, 0x6E, 0x05, 0x4E, 0x7B, 0xC4 + .byte 0x80, 0x6D, 0x2A, 0x37, 0x6C, 0x7A, 0xF9, 0x0F, 0x04, 0x8D, 0xBF, 0xF3, 0xEE, 0x54, 0x04, 0x02 + .byte 0xD1, 0x24, 0xF6, 0xDA, 0xC4, 0xFE, 0xCF, 0x50, 0x59, 0x53, 0xC9, 0x85, 0xEB, 0x34, 0xBB, 0xF7 + .byte 0xF9, 0x95, 0xFB, 0x0C, 0x88, 0x67, 0x5F, 0x34, 0x52, 0x90 + + non_word_aligned_thumb_func_start SVC_Div +SVC_Div: ; 0x020003BA + swi 9 + bx lr + thumb_func_end SVC_Div +_020003BE: + .byte 0xC3, 0x91 + .byte 0xC5, 0x21, 0xD8, 0x22, 0x56, 0xBF, 0xCF, 0x49, 0x3F, 0x95, 0x35, 0x87, 0x8F, 0x43, 0x0D, 0xB0 + .byte 0xD2, 0x96, 0xB9, 0xA0, 0xF1, 0xDE, 0x92, 0x3A, 0x8E, 0xFE, 0xA1, 0xE9, 0xBD, 0x7F, 0x5A, 0x00 + .byte 0xB8, 0x00, 0xE0, 0x98, 0x20, 0x6E, 0xB2, 0xE0, 0xAF, 0x34, 0xDD, 0xD4, 0xC7, 0xC1, 0x7B, 0x84 + .byte 0xB8, 0xFD, 0x9B, 0xC2, 0xD9, 0x84, 0x11, 0x92, 0xCC, 0xC4, 0x2C, 0x4B, 0x87, 0x73, 0x40, 0x46 + .byte 0x07, 0x64, 0x1E, 0x93, 0x62, 0x67, 0xD7, 0xA8, 0xAE, 0xE5, 0x66, 0x86, 0xA8, 0x17, 0x37, 0xB7 + .byte 0xCA, 0x3C, 0xF9, 0xB1, 0xAD, 0xEB, 0x1B, 0x20, 0x38, 0x08, 0x6B, 0xEC, 0xBC, 0x1F + + non_word_aligned_thumb_func_start SVC_UncompressHuffmanFromDevice +SVC_UncompressHuffmanFromDevice: ; 0x0200041E + swi 0x13 + bx lr + thumb_func_end SVC_UncompressHuffmanFromDevice +_02000422: + .byte 0xDA, 0xDE, 0x2D, 0x61, 0xA4, 0x47, 0xAB, 0x36, 0x7D, 0xCC, 0x20, 0x4C, 0x71, 0x48 + .byte 0xBD, 0x1F, 0x5C, 0x91, 0x3E, 0x23, 0x34, 0x2D, 0x3E, 0x08, 0x81, 0x1B, 0x40, 0x77, 0x30, 0x39 + .byte 0xD1, 0x46, 0xA7, 0x12, 0xB2, 0xC9, 0x5A, 0x1D, 0xA9, 0xA3, 0x31, 0x85, 0x88, 0xCA, 0x80, 0xC7 + .byte 0x88, 0xBC, 0x6E, 0xE2, 0x23, 0xDC, 0x8F, 0x29, 0xA8, 0x08, 0x86, 0x2B, 0x76, 0x0A, 0xCC, 0xE1 + .byte 0x5F, 0x54, 0x33, 0x98, 0xBE, 0x41, 0xED, 0x74, 0x22, 0x3B, 0xBE, 0x1E, 0x6E, 0x73, 0xA1, 0x22 + .byte 0xB2, 0xE2, 0x45, 0x99, 0x56, 0x9E, 0xDB, 0x45, 0xB4, 0x6A, 0xBC, 0x53 + + non_word_aligned_thumb_func_start SVC_Halt +SVC_Halt: ; 0x0200047C + swi 6 + bx lr + thumb_func_end SVC_Halt +_02000480: + .byte 0xDB, 0xDF, 0xC0, 0x2D, 0x41, 0x13, 0x50, 0x38, 0x01, 0xCB, 0x49, 0xF3, 0x34, 0x30, 0x21, 0x08 + .byte 0xE9, 0x60, 0x0E, 0xE1, 0x3A, 0x28, 0x2A, 0x72, 0x90, 0xB4, 0x5D, 0xFE, 0xD2, 0x17, 0x8B, 0xD4 + .byte 0x74, 0x38, 0xC0, 0x91, 0x1F, 0x0F, 0x46, 0xBF, 0x35, 0xB8, 0xC6, 0x3A, 0xA0, 0xD5, 0xD1, 0xF1 + .byte 0x19, 0x0A, 0x86, 0x15, 0x24, 0x82, 0x4F, 0xAE, 0x87, 0x00, 0x39, 0x79, 0x69, 0xAC, 0x9E, 0xDE + .byte 0x0B, 0x61, 0x09, 0x03, 0xB4, 0xA4, 0xF4, 0x1F, 0x84, 0x5C + + non_word_aligned_thumb_func_start SVC_WaitIntr +SVC_WaitIntr: ; 0x020004CA + mov r2, #0 + swi 4 + bx lr + thumb_func_end SVC_WaitIntr +_020004D0: + .byte 0x7D, 0x4D, 0x22, 0xDC, 0x29, 0xDC, 0x8A, 0xCC, 0xA2, 0x14, 0xD9, 0xE2, 0xAF, 0x1C, 0x34, 0x81 + .byte 0x5D, 0xBF, 0xC5, 0x27, 0x9C, 0x10, 0xCB, 0x9C, 0x17, 0x8F, 0x45, 0x70, 0xD9, 0x48, 0x75, 0x61 + .byte 0x3B, 0x6C, 0x6F, 0xAF, 0x09, 0x47, 0x27, 0x6A, 0x4F, 0xE7, 0xCA, 0x9A, 0xB2, 0xF6, 0xAF, 0xF9 + .byte 0x35, 0x0E, 0x87, 0x12, 0x85, 0x7E, 0x22, 0x3A, 0x9C, 0x7D, 0x67, 0x78, 0xE8, 0xC8, 0xFD, 0x57 + .byte 0x0D, 0xE0, 0x65, 0x23, 0xFB, 0xD2, 0x46, 0x12, 0x08, 0x26, 0x02, 0x5A, 0x2D, 0x1E, 0xA8, 0xE7 + .byte 0xD5, 0x9B, 0xDD, 0xFB, 0xE6, 0x74, 0x5E, 0xE7, 0x54, 0xB6, 0x64, 0x57, 0x6B, 0x32, 0x27, 0x08 + .byte 0xE0, 0xA9 + + non_word_aligned_thumb_func_start IsMmemExpanded +IsMmemExpanded: ; 0x02000532 + swi 0xf + bx lr + thumb_func_end IsMmemExpanded +_02000536: + .byte 0x82, 0x8E, 0xF9, 0x03, 0x73, 0x84, 0x41, 0xFD, 0x17, 0xA2 + .byte 0x03, 0x49, 0x90, 0x18, 0xEF, 0xEC, 0x81, 0xB7, 0x36, 0x2D, 0x89, 0x0C, 0x67, 0x32, 0x4B, 0x4F + .byte 0xCB, 0x5D, 0xEE, 0x7C, 0x89, 0x17, 0x90, 0xC4, 0x73, 0x86, 0x60, 0x89, 0xEE, 0xED, 0x54, 0x6B + .byte 0x51, 0x3F, 0x4D, 0x8E, 0xF7, 0x71, 0x3F, 0x31, 0xDC, 0xD8, 0x24, 0xBF, 0x9D, 0xFD, 0xC6, 0xEE + .byte 0x7C, 0x6E, 0xAD, 0xC7, 0x22, 0x61, 0xA5, 0x2F, 0xE6, 0x2B, 0x1E, 0x16, 0xC9, 0x98, 0x70, 0x5C + + non_word_aligned_thumb_func_start SVC_GetCRC16 +SVC_GetCRC16: ; 0x02000580 + swi 0xe + bx lr + thumb_func_end SVC_GetCRC16 +_02000584: + .byte 0x5D, 0x7C, 0xF3, 0xCF, 0x85, 0x00, 0xF7, 0xAB, 0xAF, 0x05, 0x6B, 0xCD + .byte 0xF4, 0xB4, 0x25, 0xF6, 0x9F, 0xD9, 0x1C, 0xCF, 0x89, 0xD9, 0x88, 0x09, 0x88, 0x93, 0xA7, 0x2D + .byte 0x8D, 0x64, 0x73, 0xC5, 0x84, 0x9D, 0x99, 0x51, 0xE5, 0xF4, 0x6C, 0x1B, 0x52, 0x26, 0x63, 0x45 + .byte 0x74, 0x06, 0xF1, 0xA8, 0xF7, 0xCF, 0xD0, 0x39, 0x5E, 0xE0, 0x25, 0xE2, 0xAD, 0x07, 0x91, 0xAC + .byte 0x70, 0x80, 0x92, 0x31, 0x61, 0x29, 0x17, 0x6B, 0xD2, 0x67, 0x9C, 0x3A + + non_word_aligned_thumb_func_start SVC_UncompressLZ8 +SVC_UncompressLZ8: ; 0x020005CC + swi 0x11 + bx lr + thumb_func_end SVC_UncompressLZ8 +_020005D0: + .byte 0x00, 0x00, 0x86, 0x41, 0x99, 0xEB, 0x4D, 0xBB, 0x7F, 0xB8, 0xCD, 0x59, 0x62, 0x50, 0xAF, 0x4D + .byte 0xC6, 0xE8, 0xD4, 0x60, 0x67, 0x56, 0x15, 0x2A, 0x89, 0x6E, 0x47, 0x0D, 0xA3, 0x69, 0xC5, 0xBD + .byte 0x0B, 0x10, 0x2B, 0xBB, 0x68, 0x56, 0x9B, 0xAA, 0x2A, 0x86, 0xBF, 0x5B, 0xF1, 0x22, 0xFE, 0xDF + .byte 0xB8, 0xC0, 0x3F, 0x91, 0x44, 0x5F, 0x14, 0xC4, 0x42, 0x8D, 0x1B, 0x37, 0x06, 0xFA, 0x48, 0xDC + .byte 0x6D, 0xE9, 0x2D, 0xD0, 0xCB, 0x1F, 0x14, 0x62, 0x45, 0xF4, 0xB0, 0x55, 0xE0, 0x4C, 0xB0, 0x12 + .byte 0xBE, 0x89, 0x20, 0xFB, 0xA3, 0x9B, 0x22, 0xBA, 0x2B, 0xB0, 0x25, 0x99, 0x40, 0x24, 0x43, 0x36 + .byte 0x74, 0x14, 0x98, 0x1E, 0x2D, 0xB5 + + non_word_aligned_thumb_func_start SVC_UncompressRL16FromDevice +SVC_UncompressRL16FromDevice: ; 0x02000636 + swi 0x15 + bx lr + thumb_func_end SVC_UncompressRL16FromDevice +_0200063A: + .byte 0xD9, 0x8B, 0x82, 0x7A, 0xDC, 0x28 + .byte 0xAC, 0xFD, 0x54, 0x96, 0x0A, 0x19, 0xAA, 0x1F, 0x6D, 0x11, 0x81, 0x3F, 0x69, 0x25, 0x59, 0x37 + .byte 0x89, 0x15, 0xD1, 0x17, 0xD7, 0x72, 0xCF, 0x19, 0x7C, 0x54, 0x79, 0xDA, 0x25, 0x84, 0x76, 0xAB + .byte 0xE9, 0x0F, 0x09, 0xF3, 0xEC, 0x55, 0x65, 0xCA, 0xBF, 0x69, 0x61, 0x8B, 0x05, 0x70, 0x22, 0x3E + .byte 0x71, 0x0A, 0xA9, 0xF9, 0x2A, 0x9C, 0x7C, 0x0D, 0xFF, 0x00, 0x84, 0x4D, 0xFB, 0xE6, 0xDD, 0xCA + .byte 0xFA, 0xC7, 0xF3, 0xE0, 0x8E, 0x97, 0x05, 0x5A, 0xB8, 0x84, 0x91, 0x47, 0x44, 0x8C, 0x19, 0x4E + .byte 0x26, 0x47, 0xE6, 0x9C, 0x17, 0x3D, 0xCE, 0x8F, 0x42, 0x1E, 0xC3, 0x91, 0xAA, 0xCB, 0xFF, 0xB0 + .byte 0x11, 0x4C, 0x11, 0x14, 0xE4, 0x26, 0x92, 0xC3, 0xAD, 0x78, 0x8D, 0xE8, 0x53, 0xF1 + + non_word_aligned_thumb_func_start SVC_UncompressRL8 +SVC_UncompressRL8: ; 0x020006AE + swi 0x14 + bx lr + thumb_func_end SVC_UncompressRL8 +; 0x020006B2 + .byte 0xDF, 0x40, 0x5C, 0xEC, 0x29, 0x14, 0x84, 0xF4, 0x75, 0x47, 0xBE, 0xAF, 0x26, 0x16 + .byte 0x09, 0x95, 0xA9, 0x6F, 0xA5, 0x8A, 0xF7, 0x0A, 0x42, 0x99, 0x34, 0x8D, 0xCC, 0x7B, 0xAF, 0xBD + .byte 0x0E, 0x8F, 0x7C, 0xE5, 0xD2, 0x7B, 0x88, 0xC7, 0x64, 0x3E, 0x65, 0xC5, 0x37, 0x29, 0x13, 0xF3 + .byte 0x91, 0xFE, 0x5A, 0x31, 0xC6, 0x3D, 0x5E, 0x5A, 0x1E, 0xB5, 0x0F, 0x62, 0x79, 0xC6, 0x21, 0xC8 + .byte 0x93, 0x26, 0x59, 0xEB, 0x63, 0x4F, 0xE7, 0xB6, 0x58, 0x1D, 0x92, 0x90, 0xE5, 0x7D, 0x82, 0x6C + .byte 0x0A, 0x9C, 0xB7, 0x7A, 0x62, 0x84, 0x15, 0x24, 0xF6, 0x66, 0x04, 0x1D, 0x56, 0x36, 0x38, 0x97 + .byte 0xE3, 0x20, 0xBA, 0x1F, 0x97, 0x5D, 0xE3, 0x0A, 0x50, 0x08, 0xC3, 0xE4, 0x26, 0x21, 0xDD, 0xD3 + .byte 0x69, 0x3E, 0x64, 0x18, 0x3B, 0x8F, 0x29, 0x4D, 0x2B, 0xFC + + non_word_aligned_thumb_func_start SVC_CpuSetFast +SVC_CpuSetFast: ; 0x0200072A + swi 0xc + bx lr + thumb_func_end SVC_CpuSetFast +_0200072E: + .byte 0x85, 0x6C + .byte 0x96, 0x6C, 0xD6, 0x39, 0x18, 0x7B, 0x7A, 0xF6, 0x5C, 0x02, 0x6E, 0x9A, 0xAC, 0x19, 0xA1, 0xD4 + .byte 0x40, 0x27, 0xFF, 0xCB, 0x5D, 0xC7, 0x59, 0x24, 0x89, 0xF5, 0xC2, 0x34, 0xEB, 0x7F, 0xCF, 0x89 + .byte 0x9B, 0x37, 0xDF, 0xF9, 0xAE, 0x9C, 0x46, 0xF1, 0xE2, 0xB0, 0x2C, 0xD0, 0x27, 0xC4, 0x0E, 0xCE + .byte 0x79, 0x9D, 0xF4, 0xD7, 0x99, 0xCF, 0x3F, 0xCB, 0x0C, 0x3E, 0xFC, 0x1B, 0x1D, 0xF3, 0x95, 0xB2 + .byte 0x2D, 0x31, 0x87, 0x3D, 0xFB, 0xEE, 0x47, 0x76, 0x74, 0x32, 0x60, 0x6A, 0xD2, 0x52, 0x92, 0x12 + .byte 0xC3, 0xFE, 0x9A, 0x4D, 0x4E, 0x00, 0x8A, 0x5C + + non_word_aligned_thumb_func_start SVC_WaitByLoop +SVC_WaitByLoop: ; 0x02000788 + swi 3 + bx lr + thumb_func_end SVC_WaitByLoop +_0200078C: + .byte 0x9B, 0xA9, 0xB0, 0xED + .byte 0x08, 0x59, 0x11, 0xB3, 0xE3, 0xBE, 0xE2, 0x9C, 0x5A, 0xF6, 0xD4, 0xA0, 0xD3, 0x5A, 0x42, 0x6A + .byte 0xCF, 0xF0, 0x21, 0x8A, 0x47, 0x49, 0xA0, 0xF3, 0x7E, 0x7A, 0x06, 0x3C, 0xF5, 0xAC, 0x13, 0x71 + .byte 0x58, 0x90, 0x74, 0xCE, 0x74, 0x7F, 0xAD, 0x4D, 0xC1, 0xA2, 0x4D, 0x26, 0x58, 0x45, 0x95, 0xEF + .byte 0xB4, 0xC1, 0xE5, 0x45, 0xF8, 0x6B, 0x73, 0xA1, 0x70, 0x5E, 0xD4, 0xF3, 0x30, 0x00, 0x84, 0x52 + .byte 0x9C, 0xDF, 0x59, 0x76, 0x6C, 0xCD, 0x3C, 0xEC, 0x07, 0x63, 0x3B, 0x50, 0x02, 0x74, 0xE5, 0xED + .byte 0x9C, 0x20, 0x08, 0x03, 0x9C, 0xE9, 0x2A, 0x30, 0x95, 0xA8, 0x2E, 0x77, 0x32, 0x0D, 0x71, 0x39 + .byte 0xA9, 0xE1, 0xD1, 0x4F, 0x3D, 0x26, 0xD2, 0xBB, 0x5B, 0xB0, 0x70, 0x76, 0x14, 0x2A, 0x00, 0x00 diff --git a/lib/syscall/asm/_secure_IPKE.s b/lib/syscall/asm/_secure_IPKE.s new file mode 100644 index 00000000..f5ee05d4 --- /dev/null +++ b/lib/syscall/asm/_secure_IPKE.s @@ -0,0 +1,271 @@ + .include "asm/macros.inc" + .text + +_secure: ; 0x02000000 + .byte 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xE2, 0x31 + .byte 0xA3, 0xE9, 0xAE, 0x7B, 0x92, 0x75, 0x75, 0xB1, 0x69, 0x82, 0x1D, 0xE3, 0x22, 0xCB, 0x55, 0xAE + .byte 0xCE, 0xDC, 0x4D, 0x18, 0x1B, 0x3A, 0x9E, 0x4D, 0x42, 0x9F, 0x0C, 0xFF, 0xDF, 0x85, 0x90, 0x80 + .byte 0xFC, 0xF6, 0xBE, 0xE9, 0x74, 0x88, 0x1D, 0xE2, 0x39, 0x0B, 0xA0, 0x65, 0xCB, 0x7A, 0x61, 0x3B + .byte 0x8D, 0xAD, 0x12, 0x65, 0x19, 0x5C, 0xCA, 0x77, 0x43, 0xD1, 0x5E, 0xA4, 0x29, 0x0F, 0xF5, 0xDC + .byte 0x3E, 0xB5, 0x56, 0x6F, 0x5E, 0xCC, 0x41, 0x1F, 0x60, 0x01, 0xA0, 0x8C, 0x33, 0x0E, 0x56, 0x34 + .byte 0x87, 0x78, 0xFA, 0xE1, 0x87, 0xD4, 0xDE, 0x01, 0x70, 0x0E, 0x3C, 0xE5, 0x2F, 0x62, 0xDD, 0xAB + .byte 0x8F, 0xB2, 0x7D, 0x3F, 0x00, 0xEF, 0x10, 0x4E, 0xDE, 0x36, 0x0A, 0x5B, 0x70, 0x23, 0x45, 0x5F + .byte 0xD1, 0x90, 0xBB, 0xDF, 0x9E, 0x69, 0xC9, 0x5C, 0x2F, 0xE3 + + non_word_aligned_thumb_func_start SVC_DivRem +SVC_DivRem: ; 0x0200008A + swi 9 + add r0, r1, #0 + bx lr + thumb_func_end SVC_DivRem +_02000090: + .byte 0xEC, 0x4E, 0xB6, 0xEC, 0xE6, 0xB3, 0xFD, 0x76, 0x95, 0x7C, 0x06, 0x89, 0x0F, 0x08, 0xC1, 0x9D + .byte 0x32, 0x10, 0xBE, 0x63, 0xE6, 0x0D, 0x9E, 0x9D, 0x93, 0x67, 0x7B, 0x9B, 0x9D, 0xD1, 0xD6, 0xE4 + .byte 0xF3, 0x4C, 0xA6, 0xF0, 0xE6, 0xCD, 0xBD, 0xE3, 0x13, 0x9B, 0x3B, 0x88, 0x0F, 0x8D, 0xE1, 0x82 + .byte 0xD4, 0xAD, 0x89, 0xE0, 0xA1, 0x33, 0x5D, 0x89, 0x37, 0xA9, 0x4F, 0x34 + + thumb_func_start SVC_UncompressLZ8 +SVC_UncompressLZ8: ; 0x020000CC + swi 0x11 + bx lr + thumb_func_end SVC_UncompressLZ8 +_020000D0: + .byte 0xE8, 0x6B, 0x87, 0x9A, 0x54, 0x5D, 0xB1, 0xA4, 0x1C, 0x52, 0xE0, 0xDC, 0xCD, 0x9A, 0x8A, 0x5A + .byte 0xEA, 0x09, 0xC1, 0x5A, 0x30, 0xB8, 0x1A, 0x0A, 0xB8, 0x70, 0x2C, 0x2E, 0x0B, 0x77, 0xF2, 0x05 + .byte 0x12, 0xFC, 0xCF, 0xF2, 0x4A, 0x93, 0x27, 0x71, 0xE8, 0x88, 0x5E, 0xEA, 0x90, 0x3A, 0x94, 0x9E + .byte 0x25, 0xA2, 0x92, 0x81, 0x04, 0x8C, 0xAB, 0x4E, 0xFF, 0x82, 0x0D, 0x1E, 0xDB, 0x0F, 0x3F, 0x4D + .byte 0xCE, 0x7C, 0x4D, 0x1C, 0x18, 0x1F, 0x5B, 0x07, 0x84, 0x68, 0xED, 0xF3, 0x67, 0x7A, 0xEF, 0x9A + .byte 0x35, 0x8B, 0xCE, 0x52, 0xB8, 0x16, 0x9F, 0xD9, 0x02, 0x22, 0xA6, 0xB5, 0x17, 0x61, 0x20, 0xAB + .byte 0x42, 0x62, 0xFF, 0xFD, 0x8D, 0xCD, 0x6B, 0xBB, 0x63, 0xB0, 0xF4, 0x8A, 0x52, 0x8C + + non_word_aligned_thumb_func_start SVC_UnpackBits +SVC_UnpackBits: ; 0x0200013E + swi 0x10 + bx lr + thumb_func_end SVC_UnpackBits +_02000142: + .byte 0xD3, 0xE4, 0x3A, 0x28, 0x25, 0xE3, 0x88, 0x6A, 0x4B, 0x9D, 0x72, 0x4B, 0xF0, 0x3B + .byte 0xC3, 0xA6, 0xB5, 0x19, 0x85, 0x01, 0xE5, 0x27, 0xA6, 0x30, 0x29, 0xEC, 0x40, 0x34, 0xEC, 0x13 + .byte 0x1D, 0x8B, 0x0E, 0xE8, 0xC2, 0xA4, 0x88, 0x13, 0xD9, 0x40, 0x5A, 0x2A, 0xA2, 0x09, 0x56, 0x03 + .byte 0xAE, 0x00, 0xF9, 0x59, 0xA8, 0xA0, 0x86, 0x15, 0x48, 0x4B, 0x6C, 0xE2, 0xE6, 0x6C, 0x0A, 0x2F + .byte 0x36, 0xBD, 0x85, 0x0D, 0x6D, 0x13, 0xD3, 0xDA, 0x43, 0x9E, 0x5A, 0xD1, 0xA9, 0xC9, 0xA3, 0xCD + .byte 0x65, 0x36, 0x0B, 0x90, 0xFB, 0xCB, 0x30, 0x0D, 0x21, 0xC0, 0x20, 0xE0, 0x75, 0xAA, 0xDE, 0x8D + .byte 0x5E, 0x78, 0x4E, 0x3D, 0x58, 0xE7, 0xFC, 0xFB, 0x1F, 0x30, 0x6C, 0x0D, 0xEC, 0x8A, 0xB4, 0xFF + .byte 0xDD, 0x25, 0xF4, 0x04, 0xD4, 0x1F, 0x24, 0xB2, 0xEA, 0x40 + + non_word_aligned_thumb_func_start SVC_CpuSet +SVC_CpuSet: ; 0x020001BA + swi 0xb + bx lr + thumb_func_end SVC_CpuSet +_020001BE: + .byte 0xB1, 0x82 + .byte 0x1C, 0x5A, 0xC0, 0xBC, 0x96, 0x71, 0x03, 0xA2, 0x8D, 0x34, 0x87, 0x56, 0x54, 0x17, 0x73, 0xF6 + .byte 0x90, 0xAE, 0x66, 0xAB, 0x18, 0x1F, 0xC7, 0xCB, 0x4D, 0x79, 0x30, 0xF8, 0x10, 0x8E, 0xA3, 0x44 + .byte 0x5B, 0x44, 0x8D, 0xBC, 0x98, 0xAD, 0xF6, 0x3E, 0x08, 0x16, 0x02, 0x74, 0x34, 0x51, 0x17, 0x11 + .byte 0x23, 0x63, 0x13, 0x48, 0xF2, 0xE9, 0xEB, 0xC7, 0x10, 0xF3, 0x88, 0xC2, 0x1B, 0xF3, 0xE8, 0xB0 + .byte 0x24, 0x3B, 0xD4, 0x2A, 0x37, 0x00, 0xFA, 0x1C, 0x94, 0x11, 0xCF, 0x9C, 0x35, 0x87, 0x41, 0xD4 + .byte 0x9F, 0x72, 0x8C, 0xA3, 0x40, 0x26, 0x89, 0xCC, 0xBE, 0x6E, 0x05, 0x8C, 0xB8, 0x1F, 0x7C, 0xBA + .byte 0x3C, 0x25, 0xDE, 0x03 + + thumb_func_start SVC_Halt +SVC_Halt: ; 0x02000224 + swi 6 + bx lr + thumb_func_end SVC_Halt +_02000228: + .byte 0x11, 0x48, 0x74, 0x75, 0xE9, 0x38, 0xAA, 0xB2 + .byte 0x4C, 0xE7, 0x90, 0xCE, 0x9B, 0xE9, 0x5E, 0x7C, 0x0C, 0x8F, 0x8F, 0x65, 0xE8, 0xB9, 0x76, 0x76 + .byte 0x1E, 0xC3, 0xFC, 0x7B, 0x9E, 0x8D, 0xB2, 0x7B, 0x2C, 0x39, 0x0C, 0x0C, 0x6C, 0xAB, 0x86, 0x0A + .byte 0x78, 0x6E, 0x6E, 0x07, 0xAD, 0xAB, 0xA9, 0x8D, 0x11, 0xAE, 0xCD, 0x03, 0x20, 0x88, 0x3E, 0x31 + .byte 0x73, 0x55, 0x9B, 0x33, 0x42, 0xDE, 0xDD, 0xB7, 0xF8, 0x2F, 0x4C, 0x0E, 0x47, 0x46, 0x56, 0x08 + .byte 0x9F, 0xA0, 0x3A, 0x36, 0x01, 0x02, 0x65, 0xC1, 0x01, 0x18, 0xB4, 0xC0, 0xD9, 0xB8, 0x92, 0x65 + .byte 0xA2, 0xF8, 0x90, 0x72 + + thumb_func_start SVC_CpuSetFast +SVC_CpuSetFast: ; 0x02000284 + swi 0xc + bx lr + thumb_func_end SVC_CpuSetFast +_02000288: + .byte 0x48, 0xEE, 0xCB, 0x4A, 0xCA, 0xE4, 0x5B, 0xA3 + .byte 0x9B, 0x86, 0xFD, 0x37, 0xDE, 0x99, 0xC1, 0x5F, 0x35, 0xB7, 0x33, 0x63, 0x4C, 0x77, 0xC0, 0x49 + .byte 0x46, 0x77, 0x78, 0xFB, 0x67, 0xEA, 0x83, 0x85, 0x31, 0x0A, 0xCD, 0x46, 0x1D, 0xB1, 0xD8, 0x4B + .byte 0x17, 0x19, 0x84, 0x6C, 0x1F, 0x92, 0x6D, 0x23, 0xFF, 0x37, 0xBA, 0x84, 0x1E, 0x60, 0x73, 0x6A + .byte 0x06, 0xFB, 0x3A, 0x4B, 0xEC, 0x73, 0xA9, 0x71, 0xF0, 0x55, 0x27, 0xAE, 0xD9, 0x83, 0x40, 0x2C + + thumb_func_start SVC_GetCRC16 +SVC_GetCRC16: ; 0x020002D0 + swi 0xe + bx lr + thumb_func_end SVC_GetCRC16 +_020002D4: + .byte 0xFB, 0xB6, 0x8A, 0x9C, 0xAB, 0xAA, 0xB3, 0x7C, 0xFD, 0xE5, 0x6E, 0x10 + .byte 0xB4, 0x9C, 0xC5, 0x6F, 0x8F, 0x1F, 0x8A, 0x47, 0xDE, 0xF3, 0xD4, 0xD6, 0x3F, 0xAC, 0x3A, 0x10 + .byte 0xA5, 0xA9, 0x9B, 0x98, 0xAA, 0xE9, 0x65, 0x61, 0xA6, 0xBD, 0x9D, 0x1E, 0x53, 0xF2, 0x74, 0xCC + .byte 0x04, 0x47, 0xD1, 0x61, 0xB5, 0x63, 0x5D, 0xC3, 0xB0, 0xB1, 0x17, 0x48, 0x6D, 0x4C, 0x0B, 0x5B + .byte 0xFD, 0x11, 0x66, 0xE9, 0x70, 0xAD, 0xF4, 0x5C, 0x45, 0xA7, 0xE3, 0x9C, 0x3D, 0x29, 0xA2, 0x78 + .byte 0xE4, 0xDA, 0xD9, 0x1A, 0x9E, 0x55, 0x83, 0x72, 0x5B, 0x0F, 0x64, 0x27, 0x82, 0x54, 0xE7, 0x16 + .byte 0xAD, 0x88 + + non_word_aligned_thumb_func_start SVC_UncompressRL16FromDevice +SVC_UncompressRL16FromDevice: ; 0x02000332 + swi 0x15 + bx lr + thumb_func_end SVC_UncompressRL16FromDevice +_02000336: + .byte 0xE9, 0x99, 0xB1, 0x39, 0x72, 0x17, 0x25, 0x9F, 0xA6, 0x3D + .byte 0xA4, 0xF2, 0xAF, 0xEE, 0xE3, 0xF2, 0xB4, 0x1E, 0x15, 0x32, 0x41, 0x60, 0xDC, 0x19, 0x06, 0x07 + .byte 0xDE, 0xA3, 0x74, 0x91, 0x52, 0x9A, 0x03, 0x0C, 0x4B, 0xE2, 0xCB, 0x8B, 0x48, 0x79, 0x00, 0x77 + .byte 0xE5, 0xF5, 0x39, 0xA7, 0xFE, 0xF2, 0x4F, 0x7B, 0x7E, 0x36, 0x51, 0xF0, 0x31, 0xCA, 0x3A, 0xAF + .byte 0xC0, 0x2E, 0xA4, 0x84, 0x57, 0xFD, 0x03, 0x08, 0xC9, 0x40, 0xEA, 0x75, 0xCE, 0x1E, 0x70, 0x47 + .byte 0xDA, 0x5B, 0x55, 0xCC, 0x5F, 0x4B, 0x45, 0xA4, 0xD7, 0x5E, 0x3A, 0x49, 0x91, 0xE3, 0xFB, 0x0D + .byte 0xDE, 0xCF, 0x0A, 0x3E, 0x5D, 0x6B + + non_word_aligned_thumb_func_start SVC_Div +SVC_Div: ; 0x02000396 + swi 9 + bx lr + thumb_func_end SVC_Div +_0200039A: + .byte 0x9A, 0xC3, 0x05, 0x3C, 0x9A, 0xFF + .byte 0x18, 0x1D, 0x2E, 0x0B, 0x90, 0x30, 0xFD, 0x4E, 0x87, 0x05, 0xA4, 0xFB, 0x49, 0x51, 0x33, 0x7E + .byte 0xCA, 0x19, 0x85, 0x88, 0x99, 0x06, 0x84, 0x64, 0xB9, 0x50, 0x11, 0xDC, 0xD6, 0x4A, 0xCB, 0x0A + .byte 0xF0, 0x32, 0x46, 0x61, 0x0B, 0x9D, 0x8C, 0x48, 0x35, 0x5D, 0x34, 0x57, 0x4F, 0xAF, 0x49, 0x13 + .byte 0xA1, 0x41, 0x63, 0x13, 0xB1, 0x61, 0x21, 0x3F, 0x44, 0xFA, 0xB2, 0x1F, 0xA8, 0x2C, 0x68, 0x72 + .byte 0x57, 0xEC, 0x5F, 0xF0, 0x7F, 0xDE, 0x02, 0x88, 0x86, 0xDD, 0x77, 0x4C, 0x0D, 0x44, 0x29, 0x2B + .byte 0xE2, 0x23, 0x58, 0xA5, 0x6D, 0x0B, 0xEF, 0x4E, 0x68, 0xA9, 0x4D, 0xDA, 0xEA, 0xB5, 0x04, 0x81 + .byte 0x30, 0xAA, 0x0E, 0xAE, 0xE4, 0xC2, 0x1D, 0xDC, 0x80, 0xF1 + + non_word_aligned_thumb_func_start SVC_UncompressRL8 +SVC_UncompressRL8: + swi 0x14 + bx lr + thumb_func_end SVC_UncompressRL8 + .byte 0x54, 0x13 + .byte 0xE2, 0x2C, 0x4F, 0x7C, 0x73, 0x45, 0x19, 0xC6, 0xCC, 0x58, 0xDB, 0xB4, 0x68, 0x81, 0x59, 0x57 + .byte 0x4A, 0x6A, 0xDB, 0xD9, 0x72, 0x35, 0x80, 0xAE, 0x20, 0xD8, 0x26, 0x1D, 0xF6, 0xA7, 0x31, 0x53 + .byte 0x87, 0x44, 0x9D, 0x69, 0x32, 0xE5, 0x1E, 0x87, 0x79, 0x4D, 0x50, 0xCB, 0x26, 0xA1, 0xCD, 0xE1 + .byte 0xF3, 0x38, 0x7A, 0x36, 0xE3, 0xAD, 0x36, 0x06, 0x0B, 0x24, 0x60, 0xFD, 0xA7, 0x4F, 0x24, 0xE8 + .byte 0x0C, 0xB0, 0xCC, 0xC0, 0xBC, 0xA0, 0xA1, 0x34, 0x59, 0x63, 0x0B, 0x6B, 0x4F, 0xF1, 0xE9, 0x44 + .byte 0xFA, 0xE6, 0x14, 0x1E, 0x55, 0xDE, 0xD6, 0x8B, 0x13, 0x6E, 0xDE, 0x0A, 0x43, 0xA6, 0x41, 0xEC + .byte 0xD7, 0x9B, 0x80, 0x1B, 0x1A, 0x85, 0x9F, 0x23, 0xC3, 0xF5, 0x05, 0x90, 0xFB, 0x81, 0x4D, 0x42 + .byte 0x2A, 0xE2, 0x33, 0x74, 0x05, 0xA2, 0xCE, 0xF1, 0x35, 0x66 + + non_word_aligned_thumb_func_start SVC_Sqrt +SVC_Sqrt: ; 0x0200048A + swi 0xd + bx lr + thumb_func_end SVC_Sqrt +_0200048E: + .byte 0x7D, 0x41 + .byte 0x10, 0x29, 0x8A, 0x9B, 0xB9, 0xBE, 0xD5, 0x48, 0xDC, 0xFD, 0x02, 0x68, 0xC6, 0x3A, 0x5D, 0x13 + .byte 0x61, 0x7D, 0x4E, 0x5E, 0x5D, 0xB2, 0x15, 0xDB, 0x6E, 0x17, 0x2C, 0x3C, 0x24, 0x33, 0x5F, 0x35 + .byte 0x96, 0x74, 0xA1, 0xCD, 0x4E, 0x57, 0x49, 0x8F, 0xA3, 0xF2, 0x7B, 0x45, 0x23, 0x7C, 0x53, 0x04 + .byte 0x60, 0xFB, 0x9F, 0x8B, 0x1F, 0x2A, 0x40, 0x40, 0xF5, 0x46, 0x92, 0x25, 0xB0, 0xE3, 0x1D, 0x1C + .byte 0xE4, 0xD6, 0x52, 0x5C, 0x3B, 0xE0, 0xB6, 0xC2, 0x19, 0x2C, 0xF9, 0x3B, 0xB7, 0x1D, 0x10, 0x2C + .byte 0x4F, 0x37, 0xB0, 0x22, 0xEA, 0xB9, 0x47, 0x3B, 0x4C, 0xDC, 0x36, 0x37, 0xED, 0x76, 0xB7, 0x64 + .byte 0xAE, 0x78, 0x59, 0x54, 0x0A, 0xDB, 0x29, 0x67, 0xAD, 0x7E, 0x6E, 0xEF, 0x69, 0xCE, 0x5D, 0xAA + .byte 0x00, 0xFA + + non_word_aligned_thumb_func_start SVC_WaitIntr +SVC_WaitIntr: ; 0x02000502 + mov r2, #0 + swi 4 + bx lr + thumb_func_end SVC_WaitIntr +_02000508: + .byte 0x46, 0x81, 0x53, 0x54, 0x41, 0xE6, 0x2A, 0x04 + .byte 0x77, 0x51, 0x24, 0x13, 0xEB, 0xBE, 0xBC, 0x69, 0x1D, 0x73, 0xB8, 0x0B, 0x02, 0x87, 0xC2, 0xB8 + .byte 0xB1, 0x36, 0x8A, 0xEA, 0xA0, 0x9F, 0x88, 0x39, 0x46, 0x0B, 0xC4, 0xFC, 0xFB, 0xE6, 0x5B, 0xCC + .byte 0x92, 0xA5, 0x0C, 0x23, 0x68, 0x8F, 0xB2, 0x45, 0x6D, 0x6D, 0x26, 0xE0, 0xFF, 0x92, 0x6B, 0x6B + .byte 0x5D, 0xC9, 0xBE, 0x61, 0xA4, 0xCC, 0x88, 0x3A, 0x6E, 0xCC, 0x19, 0x44, 0xD6, 0xB1, 0x62, 0x86 + .byte 0xC7, 0xE6, 0xF4, 0x6C, 0xC0, 0x9D, 0xE5, 0xD0, 0x28, 0x9A, 0xEE, 0x4E, 0x79, 0x03, 0xDE, 0x6D + .byte 0xDA, 0xD3, 0x31, 0x6C, 0x65, 0x8B, 0x07, 0x11, 0x95, 0xD8, 0xBF, 0x6C, 0xEB, 0xD3, 0x54, 0x4D + .byte 0x7E, 0x84 + + non_word_aligned_thumb_func_start IsMmemExpanded +IsMmemExpanded: ; 0x02000572 + swi 0xf + bx lr + thumb_func_end IsMmemExpanded +_02000576: + .byte 0x02, 0x1C, 0x1B, 0xF9, 0x04, 0x6B, 0x64, 0x43, 0x95, 0xE8 + .byte 0xF4, 0x00, 0x0B, 0x2D, 0xDF, 0xB8, 0x2D, 0x70, 0xEA, 0xB0, 0x34, 0x5E, 0x06, 0x5F, 0xE4, 0xF9 + .byte 0x1E, 0xB6, 0x1E, 0xE8, 0x92, 0xB5, 0x87, 0x32, 0x76, 0x62, 0xF6, 0x6A, 0x49, 0x2A, 0x34, 0xE2 + .byte 0x27, 0xC7, 0x03, 0x3D, 0x92, 0x57, 0x09, 0x13, 0xC8, 0x18, 0xE8, 0x3B, 0x05, 0x44, 0x13, 0x48 + .byte 0xCB, 0xAD, 0x39, 0xA0, 0x70, 0x68, 0x55, 0x1B, 0xD8, 0x97, 0xB9, 0xCE, 0x2A, 0x26, 0x3E, 0x88 + .byte 0xC3, 0x93, 0x4E, 0x3D, 0xB1, 0x0E, 0xDD, 0x0A, 0xB1, 0x85, 0x80, 0x6F, 0x45, 0x9F, 0x8F, 0x46 + .byte 0xB5, 0x78, 0x47, 0xD8, 0x05, 0x21, 0x34, 0xDE, 0x1E, 0x52, 0x99, 0xDC, 0xF4, 0x34, 0xCC, 0x1E + .byte 0xEC, 0x35, 0x73, 0x95, 0xC0, 0x76, 0x6A, 0x11, 0xAA, 0xEB, 0xC2, 0xCE, 0x03, 0x6A + + non_word_aligned_thumb_func_start SVC_SoftReset +SVC_SoftReset: ; 0x020005EE + swi 0 + bx lr + thumb_func_end SVC_SoftReset +_020005F2: + .byte 0x02, 0xE0, 0xE1, 0x40, 0xF7, 0xE9, 0x95, 0x60, 0x45, 0x7E, 0x70, 0x9D, 0xAD, 0x87 + .byte 0xF2, 0xF9, 0x30, 0x54, 0x0C, 0xA5, 0xFB, 0x9F, 0x20, 0x0F, 0xB6, 0x91, 0x8F, 0x28, 0xE1, 0xE0 + .byte 0x65, 0x76, 0xDA, 0x77, 0x7E, 0xDA, 0xAE, 0xCE, 0x7E, 0xB3, 0x04, 0x4A, 0x39, 0x21, 0x7A, 0x88 + .byte 0x3C, 0x18, 0x18, 0x15, 0x9B, 0x51, 0x6C, 0x17, 0x8A, 0x50, 0x72, 0x2E, 0x52, 0xF6, 0x63, 0xD9 + .byte 0x10, 0x90, 0xAE, 0xAC, 0xA6, 0xD4, 0x95, 0x1D, 0x12, 0xBF, 0x40, 0x0B, 0x64, 0xF7, 0xF7, 0x91 + .byte 0x09, 0x4F + + non_word_aligned_thumb_func_start SVC_UncompressHuffmanFromDevice +SVC_UncompressHuffmanFromDevice: ; 0x02000642 + swi 0x13 + bx lr + thumb_func_end SVC_UncompressHuffmanFromDevice +_02000646: + .byte 0xB8, 0xBD, 0xAD, 0x13, 0x43, 0xE7, 0x15, 0x99, 0xC9, 0x67 + .byte 0x73, 0xA2, 0x13, 0x46, 0xA6, 0x3B, 0x74, 0x23, 0x8E, 0x58, 0xA6, 0x94, 0x26, 0x77, 0x6E, 0x4D + .byte 0x90, 0xEA, 0xDD, 0xAD, 0x92, 0x7F, 0x2A, 0xAA, 0x86, 0xBC, 0x55, 0x8E, 0xFC, 0xD7, 0x3E, 0x4C + .byte 0x4C, 0xE7, 0x07, 0xC6, 0xB0, 0xAB, 0x6E, 0xC7, 0x23, 0xC0, 0x71, 0x25, 0x76, 0x52, 0x5F, 0x60 + .byte 0xBA, 0x1B, 0x10, 0x9C, 0x0E, 0xFD, 0x6E, 0xD9, 0x03, 0xF2, 0x50, 0x7F, 0xCD, 0x22, 0xFB, 0x02 + .byte 0xF8, 0x59, 0x69, 0xE4, 0x4F, 0x5F, 0xE7, 0x58, 0x34, 0x47, 0x2B, 0x01, 0xB9, 0xCC, 0x69, 0xF2 + .byte 0xA4, 0x6C, 0xB3, 0x6B, 0x94, 0xA0, 0xAB, 0xC0, 0x98, 0x66, 0x16, 0xFC, 0xDE, 0x28, 0xDA, 0x5B + .byte 0x69, 0x8F, 0x81, 0xB4, 0xF3, 0xA7, 0x05, 0x64 + + thumb_func_start SVC_WaitVBlankIntr +SVC_WaitVBlankIntr: ; 0x020006B8 + mov r2, #0 + swi 5 + bx lr + thumb_func_end SVC_WaitVBlankIntr +_020006BE: + .byte 0xC8, 0xBF + .byte 0x87, 0xB7, 0x93, 0x0E, 0xCD, 0x5B, 0xA8, 0x91, 0xE0, 0x90, 0x20, 0xB6, 0x7B, 0x2C, 0x25, 0xDE + .byte 0x15, 0x98, 0x44, 0xA3, 0x32, 0x11, 0x32, 0x60, 0x11, 0xF9, 0x9C, 0x36, 0x63, 0xB9, 0x38, 0x0F + .byte 0x6B, 0xB1, 0xBC, 0x1C, 0x26, 0x58, 0x1C, 0x2A, 0x3E, 0x17, 0xC1, 0x3D, 0x50, 0x22, 0x7F, 0x04 + .byte 0x8D, 0x55, 0x66, 0x28, 0x6F, 0x08, 0x80, 0xE1, 0x4C, 0xDC, 0x6F, 0x4F, 0x30, 0x37, 0xBC, 0x9C + .byte 0xA5, 0x62, 0x98, 0x68, 0xE8, 0x54, 0x87, 0xDB, 0x92, 0xB6, 0xFE, 0x32, 0x97, 0x06, 0x5D, 0x60 + .byte 0x69, 0x64, 0x02, 0xFC, 0x31, 0x0A, 0xE3, 0x35, 0x48, 0xA4, 0x5D, 0x87, 0x9E, 0xFB, 0x15, 0xCF + .byte 0x8F, 0x49, 0x5B, 0xCE, 0xCD, 0xBF, 0x82, 0xCA, 0x9A, 0x1D + + non_word_aligned_thumb_func_start SVC_UncompressLZ16FromDevice +SVC_UncompressLZ16FromDevice: + swi 0x12 + bx lr + thumb_func_end SVC_UncompressLZ16FromDevice + .byte 0x5B, 0xA8 + .byte 0xB8, 0x25, 0xCD, 0xFB, 0x2E, 0xA5, 0xDD, 0x1A, 0xEA, 0x5A, 0xBC, 0xB9, 0x57, 0xB2, 0x45, 0xA2 + .byte 0x22, 0x6E, 0xB3, 0x6E, 0xCA, 0x7A, 0x23, 0x56, 0x36, 0x93, 0xE2, 0xD6, 0x3A, 0x77, 0xCE, 0x1A + .byte 0xF6, 0xE0, 0xA9, 0x73, 0xEC, 0xE3, 0x70, 0x9D, 0x19, 0xFB, 0x41, 0x5F, 0x92, 0x58, 0xBC, 0xC8 + .byte 0x79, 0xE1, 0xD8, 0x8E, 0x46, 0x39, 0x7F, 0x42, 0x7B, 0xCF, 0xD2, 0xC6, 0x73, 0xA3, 0x9D, 0x02 + .byte 0x93, 0xED, 0x19, 0xAD, 0x8F, 0xD7, 0xC2, 0x6D, 0xE6, 0x2F, 0xD1, 0xA3, 0x0E, 0xD1, 0x76, 0xB0 + .byte 0xB4, 0x7F, 0xB9, 0x09, 0x37, 0x1C, 0xDE, 0x4F, 0xB2, 0xF9, 0x02, 0xC7, 0xC2, 0x39, 0x46, 0xDD + .byte 0x63, 0xA7, 0xAE, 0xFB, 0x20, 0x24, 0x7D, 0x23, 0x10, 0x8C, 0x62, 0x5C, 0x00, 0xD7 + + non_word_aligned_thumb_func_start SVC_WaitByLoop +SVC_WaitByLoop: ; 0x0200079E + swi 3 + bx lr + thumb_func_end SVC_WaitByLoop +_020007A2: + .byte 0x17, 0xE1, 0xC2, 0x4D, 0xCE, 0xC6, 0x16, 0xA9, 0x57, 0xD5, 0x29, 0xA4, 0x43, 0xE1 + .byte 0x4B, 0x09, 0xE9, 0xE4, 0x1D, 0xC4, 0x1D, 0xCE, 0x4B, 0xB8, 0x5B, 0x06, 0x2F, 0x46, 0x70, 0x05 + .byte 0x19, 0xE6, 0x88, 0x29, 0x4E, 0xCC, 0xFF, 0xB5, 0x24, 0x10, 0x37, 0x36, 0xE9, 0x30, 0xAC, 0xF6 + .byte 0x0F, 0xAC, 0xCD, 0x25, 0x35, 0x57, 0x8F, 0xB0, 0x56, 0xC3, 0x98, 0x6B, 0x96, 0x96, 0x92, 0x11 + .byte 0x69, 0x81, 0x4B, 0x60, 0x42, 0x67, 0x27, 0x40, 0xA9, 0xF9, 0xE3, 0x8C, 0x8B, 0x8F, 0xA0, 0x55 + .byte 0x80, 0x23, 0xB6, 0x63, 0x4F, 0xBF, 0x2F, 0x02, 0x54, 0x8B, 0xAB, 0x1F, 0x3A, 0x09, 0x00, 0x00 diff --git a/lib/syscall/asm/include/_secure_IPGE.inc b/lib/syscall/asm/include/_secure_IPGE.inc new file mode 100644 index 00000000..e3d02996 --- /dev/null +++ b/lib/syscall/asm/include/_secure_IPGE.inc @@ -0,0 +1,20 @@ +#include +#pragma once +.public SVC_DivRem +.public SVC_UncompressLZ8 +.public SVC_UnpackBits +.public SVC_CpuSet +.public SVC_Halt +.public SVC_CpuSetFast +.public SVC_GetCRC16 +.public SVC_UncompressRL16FromDevice +.public SVC_Div +.public SVC_UncompressRL8 +.public SVC_Sqrt +.public SVC_WaitIntr +.public IsMmemExpanded +.public SVC_SoftReset +.public SVC_UncompressHuffmanFromDevice +.public SVC_WaitVBlankIntr +.public SVC_UncompressLZ16FromDevice +.public SVC_WaitByLoop diff --git a/lib/syscall/asm/include/_secure_IPKE.inc b/lib/syscall/asm/include/_secure_IPKE.inc new file mode 100644 index 00000000..e3d02996 --- /dev/null +++ b/lib/syscall/asm/include/_secure_IPKE.inc @@ -0,0 +1,20 @@ +#include +#pragma once +.public SVC_DivRem +.public SVC_UncompressLZ8 +.public SVC_UnpackBits +.public SVC_CpuSet +.public SVC_Halt +.public SVC_CpuSetFast +.public SVC_GetCRC16 +.public SVC_UncompressRL16FromDevice +.public SVC_Div +.public SVC_UncompressRL8 +.public SVC_Sqrt +.public SVC_WaitIntr +.public IsMmemExpanded +.public SVC_SoftReset +.public SVC_UncompressHuffmanFromDevice +.public SVC_WaitVBlankIntr +.public SVC_UncompressLZ16FromDevice +.public SVC_WaitByLoop diff --git a/lib/syscall/asm/macros.inc b/lib/syscall/asm/macros.inc new file mode 100644 index 00000000..156b2b09 --- /dev/null +++ b/lib/syscall/asm/macros.inc @@ -0,0 +1 @@ + .include "asm/macros/function.inc" diff --git a/lib/syscall/asm/macros/function.inc b/lib/syscall/asm/macros/function.inc new file mode 100644 index 00000000..6b9e5f40 --- /dev/null +++ b/lib/syscall/asm/macros/function.inc @@ -0,0 +1,24 @@ + .macro arm_func_start name + .balign 4, 0 + .global \name + .arm + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .balign 4, 0 + .global \name + .thumb + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .thumb + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/main.lsf b/main.lsf new file mode 100644 index 00000000..a9735065 --- /dev/null +++ b/main.lsf @@ -0,0 +1,106 @@ +######################################################################### +### Linker spec file for Pokemon Mystery Dungeon: Explorers of Sky US ### +### Pass this to the SDK's makelcf.exe utility ### +### along with the ARM9-TS template. ### +### WIP ### +######################################################################### + +Static main +{ + Address 0x02000000 + StackSize 0 2048 + + ### Vendor libraries ### + Object asm/middleware.o + Object lib/asm/jn_spl.o + Object lib/NitroSDK/asm/wvr.o + Object lib/NitroDWC/asm/dwcbm.o + Object lib/NitroDWC/asm/dwcaccount.o + Object lib/asm/wifi.o + Object lib/asm/libVCT.o + Object lib/asm/nnsys.o + + ### NitroSDK ### + Object lib/NitroSDK/asm/fx_sincos.o + Object lib/NitroSDK/asm/fx_mtx22.o + Object lib/NitroSDK/asm/fx_mtx33.o + Object lib/NitroSDK/asm/fx_mtx43.o + Object lib/NitroSDK/asm/fx_mtx44.o + Object lib/NitroSDK/asm/fx_cp.o + Object lib/NitroSDK/asm/fx_vec.o + Object lib/NitroSDK/asm/fx_trig.o + Object lib/NitroSDK/asm/fx_atanidx.o + Object lib/NitroSDK/asm/fx.o + Object lib/NitroSDK/asm/gx.o + Object lib/NitroSDK/asm/gxstate.o + Object lib/NitroSDK/asm/gx_vramcnt.o + Object lib/NitroSDK/asm/gx_bgcnt.o + Object lib/NitroSDK/asm/g2.o + Object lib/NitroSDK/asm/g3b.o + Object lib/NitroSDK/asm/g3imm.o + Object lib/NitroSDK/asm/g3x.o + Object lib/NitroSDK/asm/g3_util.o + Object lib/NitroSDK/asm/gx_load2d.o + Object lib/NitroSDK/asm/gx_load3d.o + Object lib/NitroSDK/asm/g3.o + Object lib/NitroSDK/asm/gxasm.o + Object lib/NitroSDK/src/os/os_irqHandler.o + Object lib/NitroSDK/src/os/os_irqTable.o + Object lib/NitroSDK/src/os/os_interrupt.o + Object lib/NitroSDK/src/os/os_spinLock.o + Object lib/NitroSDK/src/os/os_printf.o + Object lib/NitroSDK/src/os/os_thread.o + Object lib/NitroSDK/src/os/os_context.o + Object lib/NitroSDK/src/os/os_emulator.o + Object lib/NitroSDK/src/os/os_message.o + Object lib/NitroSDK/src/os/os_mutex.o + Object lib/NitroSDK/src/os/os_cache.o + Object lib/NitroSDK/src/os/os_init.o + Object lib/NitroSDK/src/os/os_arena.o + Object lib/NitroSDK/src/os/os_alloc.o + Object lib/NitroSDK/src/os/os_tcm.o + Object lib/NitroSDK/src/os/os_protectionUnit.o + Object lib/NitroSDK/src/os/os_protectionRegion.o + Object lib/NitroSDK/src/os/os_exception.o + Object lib/NitroSDK/src/os/os_timer.o + Object lib/NitroSDK/src/os/os_tick.o + Object lib/NitroSDK/src/os/os_alarm.o + Object lib/NitroSDK/src/os/os_valarm.o + Object lib/NitroSDK/src/os/os_system.o + Object lib/NitroSDK/src/os/os_reset.o + Object lib/NitroSDK/src/os/os_ownerInfo.o + Object lib/NitroSDK/src/os/os_vramExclusive.o + Object lib/NitroSDK/src/os/os_entropy.o + Object lib/NitroSDK/src/os/os_terminate_proc.o + Object lib/NitroSDK/asm/mi_wram.o + Object lib/NitroSDK/asm/mi_dma.o + Object lib/NitroSDK/asm/mi_dma_hblank.o + Object lib/NitroSDK/asm/mi_dma_gxcommand.o + Object lib/NitroSDK/asm/mi_memory.o + Object lib/NitroSDK/asm/mi_swap.o + Object lib/NitroSDK/asm/mi_uncompress.o + Object lib/NitroSDK/asm/mi_dma_card.o + Object lib/NitroSDK/asm/mi_compress.o + Object lib/NitroSDK/asm/mi_init.o + Object lib/asm/nitro.o + Object lib/asm/msl.o +} + +Autoload ITCM +{ + Address 0x01FF8000 + Object lib/NitroSDK/src/os/os_irqHandler.o (.itcm) + Object lib/NitroSDK/src/os/os_reset.o (.itcm) + Object lib/NitroSDK/asm/mi_dma.o (.itcm) + Object lib/NitroSDK/asm/mi_dma_gxcommand.o (.itcm) + Object lib/asm/nitro.o (.itcm) +} + +Autoload DTCM +{ + Address 0x027E0000 + Object lib/NitroSDK/src/os/os_irqHandler.o (.dtcm) + Object lib/NitroSDK/src/os/os_irqTable.o (.dtcm) + Object lib/NitroSDK/src/os/os_irqHandler.o (.dtcm.bss) + Object lib/NitroSDK/src/os/os_irqTable.o (.dtcm.bss) +} diff --git a/platform.mk b/platform.mk new file mode 100644 index 00000000..dc45cf02 --- /dev/null +++ b/platform.mk @@ -0,0 +1,38 @@ + +WSLENV ?= no +ifeq ($(WSLENV),no) +NOWINE = 0 +else +NOWINE = 1 +endif + +ifeq ($(OS),Windows_NT) +EXE := .exe +WINE := +GREP := grep -P +SED := sed -r +SHA1SUM := sha1sum +MKTEMP := mktemp +else +EXE := +WINE := wine +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Darwin) +GREP := grep -E +SED := gsed -r +SHA1SUM := shasum +MKTEMP := gmktemp +else +GREP := grep -P +SED := sed -r +SHA1SUM := sha1sum +MKTEMP := mktemp +endif +endif + +ifeq ($(NOWINE),1) +WINE := +WINPATH := wslpath +else +WINPATH := winepath +endif diff --git a/pmdsky.us/banner.bsf b/pmdsky.us/banner.bsf new file mode 100644 index 00000000..b09b0058 Binary files /dev/null and b/pmdsky.us/banner.bsf differ diff --git a/pmdsky.us/filesystem.sha1 b/pmdsky.us/filesystem.sha1 new file mode 100644 index 00000000..e69de29b diff --git a/pmdsky.us/icon.png b/pmdsky.us/icon.png new file mode 100644 index 00000000..5bb0cf6f Binary files /dev/null and b/pmdsky.us/icon.png differ diff --git a/pmdsky.us/main.sha1 b/pmdsky.us/main.sha1 new file mode 100644 index 00000000..e69de29b diff --git a/pmdsky.us/rom.sha1 b/pmdsky.us/rom.sha1 new file mode 100644 index 00000000..41f9a138 --- /dev/null +++ b/pmdsky.us/rom.sha1 @@ -0,0 +1 @@ +5fa96ca8d8dd6405d6cd2bad73ed68bc73a9d152 *build/pmdsky.us/pmdsky.us.nds diff --git a/rom.rsf b/rom.rsf new file mode 100644 index 00000000..98593f7d --- /dev/null +++ b/rom.rsf @@ -0,0 +1,33 @@ +Arm9 +{ + Static $(BUILD_DIR)/main.sbin_LZ + OverlayDefs $(BUILD_DIR)/main_defs.sbin_LZ + OverlayTable $(BUILD_DIR)/main_table.sbin_LZ + Nef $(BUILD_DIR)/main.nef +} + +Arm7 +{ + Static sub/build/ichneumon_sub.sbin + OverlayDefs sub/build/ichneumon_sub_defs.sbin + Nef sub/build/ichneumon_sub.nef +} + +Property +{ + RomHeaderTemplate "$(HEADER_TEMPLATE)" + TitleName "$(TITLE_NAME)" + MakerCode "01" + RemasterVersion 0 + RomSpeedType 1TROM + RomSize 1G + RomFootPadding TRUE + BannerFile $(BNR) +} + +RomSpec +{ + Segment All + HostRoot files/ + File $(NITROFS_FILES) +} diff --git a/sub/Makefile b/sub/Makefile new file mode 100644 index 00000000..3a82e7f5 --- /dev/null +++ b/sub/Makefile @@ -0,0 +1,25 @@ +BUILD_DIR := build +# Because mwldarm expects absolute paths to be WIN32 paths, +# all paths referring up from BUILD_DIR must be relative. +BACK_REL := .. +TOOLSDIR := ../tools +NEFNAME := ichneumon_sub +MWCCVER := 2.0/sp2p3 +PROC := arm7tdmi +PROC_S := arm4t +PROC_LD := v4t +LCF_TEMPLATE := ARM7-TS.lcf.template +OPTFLAGS := -O4,s +GLB_DEFINES := -DSDK_ARM7 + +include ../common.mk + +tidy: + $(RM) -r $(BUILD_DIR) + +clean: tidy + +all: $(SBIN) $(ELF) + +compare: COMPARE := 1 +compare: all diff --git a/sub/asm/libsyscall.s b/sub/asm/libsyscall.s new file mode 100644 index 00000000..e9acec1c --- /dev/null +++ b/sub/asm/libsyscall.s @@ -0,0 +1,165 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + thumb_func_start SVC_SoftReset +SVC_SoftReset: ; 0x038008A4 + swi 0 + bx lr + thumb_func_end SVC_SoftReset + + thumb_func_start SVC_WaitByLoop +SVC_WaitByLoop: ; 0x038008A8 + swi 3 + bx lr + thumb_func_end SVC_WaitByLoop + + thumb_func_start SVC_WaitIntr +SVC_WaitIntr: ; 0x038008AC + ldr r2, _038008B8 ; =0x04000000 + mov ip, r2 + mov r2, #0 + swi 4 + bx lr + .align 2, 0 +_038008B8: .word 0x04000000 + thumb_func_end SVC_WaitIntr + + thumb_func_start SVC_WaitVBlankIntr +SVC_WaitVBlankIntr: ; 0x038008BC + mov r2, #0 + swi 5 + bx lr + thumb_func_end SVC_WaitVBlankIntr + + non_word_aligned_thumb_func_start SVC_Halt +SVC_Halt: ; 0x038008C2 + swi 6 + bx lr + thumb_func_end SVC_Halt + + non_word_aligned_thumb_func_start SVC_Sleep +SVC_Sleep: ; 0x038008C6 + swi 7 + bx lr + thumb_func_end SVC_Sleep + + non_word_aligned_thumb_func_start SVC_ChangeSoundBias +SVC_ChangeSoundBias: ; 0x038008CA + swi 8 + bx lr + thumb_func_end SVC_ChangeSoundBias + + non_word_aligned_thumb_func_start SVC_SetSoundBias +SVC_SetSoundBias: ; 0x038008CE + add r1, r0, #0 + mov r0, #1 + swi 8 + bx lr + thumb_func_end SVC_SetSoundBias + + non_word_aligned_thumb_func_start SVC_ResetSoundBias +SVC_ResetSoundBias: ; 0x038008D6 + add r1, r0, #0 + mov r0, #0 + swi 8 + bx lr + thumb_func_end SVC_ResetSoundBias + + non_word_aligned_thumb_func_start SVC_Div +SVC_Div: ; 0x038008DE + swi 9 + bx lr + thumb_func_end SVC_Div + + non_word_aligned_thumb_func_start SVC_DivRem +SVC_DivRem: ; 0x038008E2 + swi 9 + add r0, r1, #0 + bx lr + thumb_func_end SVC_DivRem + + thumb_func_start SVC_CpuSet +SVC_CpuSet: ; 0x038008E8 + swi 0xb + bx lr + thumb_func_end SVC_CpuSet + + thumb_func_start SVC_CpuSetFast +SVC_CpuSetFast: ; 0x038008EC + swi 0xc + bx lr + thumb_func_end SVC_CpuSetFast + + thumb_func_start SVC_Sqrt +SVC_Sqrt: ; 0x038008F0 + swi 0xd + bx lr + thumb_func_end SVC_Sqrt + + thumb_func_start SVC_GetCRC16 +SVC_GetCRC16: ; 0x038008F4 + swi 0xe + bx lr + thumb_func_end SVC_GetCRC16 + + thumb_func_start IsMmemExpanded +IsMmemExpanded: ; 0x038008F8 + swi 0xf + bx lr + thumb_func_end IsMmemExpanded + + thumb_func_start SVC_UnpackBits +SVC_UnpackBits: ; 0x038008FC + swi 0x10 + bx lr + thumb_func_end SVC_UnpackBits + + thumb_func_start SVC_UncompressLZ8 +SVC_UncompressLZ8: ; 0x03800900 + swi 0x11 + bx lr + thumb_func_end SVC_UncompressLZ8 + + thumb_func_start SVC_UncompressLZ16FromDevice +SVC_UncompressLZ16FromDevice: ; 0x03800904 + swi 0x12 + bx lr + thumb_func_end SVC_UncompressLZ16FromDevice + + thumb_func_start SVC_UncompressHuffmanFromDevice +SVC_UncompressHuffmanFromDevice: ; 0x03800908 + swi 0x13 + bx lr + thumb_func_end SVC_UncompressHuffmanFromDevice + + thumb_func_start SVC_UncompressRL8 +SVC_UncompressRL8: ; 0x0380090C + swi 0x14 + bx lr + thumb_func_end SVC_UncompressRL8 + + thumb_func_start SVC_UncompressRL16FromDevice +SVC_UncompressRL16FromDevice: ; 0x03800910 + swi 0x15 + bx lr + thumb_func_end SVC_UncompressRL16FromDevice + + thumb_func_start SVC_GetSinTable +SVC_GetSinTable: ; 0x03800914 + swi 0x1a + bx lr + thumb_func_end SVC_GetSinTable + + thumb_func_start SVC_GetPitchTable +SVC_GetPitchTable: ; 0x03800918 + swi 0x1b + bx lr + thumb_func_end SVC_GetPitchTable + + thumb_func_start SVC_GetVolumeTable +SVC_GetVolumeTable: ; 0x0380091C + swi 0x1c + bx lr + thumb_func_end SVC_GetVolumeTable diff --git a/sub/asm/macros.inc b/sub/asm/macros.inc new file mode 100644 index 00000000..156b2b09 --- /dev/null +++ b/sub/asm/macros.inc @@ -0,0 +1 @@ + .include "asm/macros/function.inc" diff --git a/sub/asm/macros/function.inc b/sub/asm/macros/function.inc new file mode 100644 index 00000000..6b9e5f40 --- /dev/null +++ b/sub/asm/macros/function.inc @@ -0,0 +1,24 @@ + .macro arm_func_start name + .balign 4, 0 + .global \name + .arm + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .balign 4, 0 + .global \name + .thumb + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .thumb + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/sub/asm/sp_main.s b/sub/asm/sp_main.s new file mode 100644 index 00000000..76175ac6 --- /dev/null +++ b/sub/asm/sp_main.s @@ -0,0 +1,339 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + .public GetRomValidLanguage + .public VBlankIntr + + arm_func_start NitroSpMain +NitroSpMain: ; 0x037F8000 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x210 + bl WVR_ShelterExtWram + bl OS_Init + bl OS_InitThread + add r2, sp, #4 + mov r0, #0x20 + mov r1, #2 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + add r2, sp, #0x10 + mov r0, r0, lsl #3 + str r0, [sp, #4] + mov r1, #0x100 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + mov r1, #0x100 + add r0, r0, #0x100 + add r2, sp, #0x110 + bl NVRAM_ReadDataBytes + mov r0, #0x1d + mov r1, #1 + add r2, sp, #0 + mov r6, #0 + bl NVRAM_ReadDataBytes + ldrb r0, [sp] + cmp r0, #0xff + moveq r0, r6 + beq _037F8080 + tst r0, #0x50 + movne r0, #1 + moveq r0, r6 +_037F8080: + cmp r0, #0 + beq _037F8154 + bl GetRomValidLanguage + mov r8, r0 + mov fp, #1 + and r7, r8, #0x40 + mov sl, #0 + add r5, sp, #0x10 + mov r4, fp + b _037F8148 +_037F80A8: + ldr r0, _037F8458 ; =0x0000FFFF + add sb, r5, sl, lsl #8 + mov r1, sb + mov r2, #0x70 + bl __Veneer_SVC_GetCRC16 + mov r2, sb + ldrh r1, [r2, #0x72] + cmp r0, r1 + bne _037F813C + ldrh r0, [r2, #0x70] + cmp r0, #0x80 + bhs _037F813C + ldr r0, _037F8458 ; =0x0000FFFF + mov r2, #0x8a + add r1, sb, #0x74 + bl __Veneer_SVC_GetCRC16 + mov r2, sb + ldrh r1, [r2, #0xfe] + cmp r0, r1 + bne _037F813C + ldrh r1, [r2, #0x76] + ldrb r0, [r2, #0x75] + tst r1, r4, lsl r0 + beq _037F813C + tst r8, r1 + ldrneh r1, [sb, #0x64] + andne r0, r0, #7 + bicne r1, r1, #7 + orrne r0, r1, r0 + strneh r0, [sb, #0x64] + add r0, r5, sl, lsl #8 + ldrh r0, [r0, #0x76] + mvn r0, r0 + tst r7, r0 + movne r6, #3 + bne _037F81F4 + orr r6, r6, fp, lsl sl +_037F813C: + add r0, sl, #1 + mov r0, r0, lsl #0x10 + mov sl, r0, lsr #0x10 +_037F8148: + cmp sl, #2 + blo _037F80A8 + b _037F81B8 +_037F8154: + bl GetRomValidLanguage + tst r0, #0x40 + movne r6, #3 + bne _037F81F4 + ldr r8, _037F8458 ; =0x0000FFFF + mov sb, #0 + add r7, sp, #0x10 + mov r4, #1 + mov r5, #0x70 +_037F8178: + mov r0, r8 + mov r2, r5 + add r1, r7, sb, lsl #8 + bl __Veneer_SVC_GetCRC16 + add r2, r7, sb, lsl #8 + ldrh r1, [r2, #0x72] + cmp r0, r1 + bne _037F81A4 + ldrh r0, [r2, #0x70] + cmp r0, #0x80 + orrlo r6, r6, r4, lsl sb +_037F81A4: + add r0, sb, #1 + mov r0, r0, lsl #0x10 + mov sb, r0, lsr #0x10 + cmp sb, #2 + blo _037F8178 +_037F81B8: + cmp r6, #1 + cmpne r6, #2 + beq _037F81F4 + cmp r6, #3 + bne _037F81F0 + ldrh r1, [sp, #0x80] + add r0, sp, #0x100 + add r1, r1, #1 + ldrh r0, [r0, #0x80] + and r1, r1, #0x7f + cmp r1, r0 + moveq r6, #2 + movne r6, #1 + b _037F81F4 +_037F81F0: + mov r6, #0 +_037F81F4: + cmp r6, #3 + blt _037F8210 + ldr r1, _037F845C ; =0x027FFC80 + mvn r0, #0 + mov r2, #0x74 + bl MIi_CpuClear32 + b _037F82CC +_037F8210: + cmp r6, #0 + beq _037F82BC + ldr r0, _037F8460 ; =0xFFFFFF2A + mov r1, r6, lsl #8 + add r0, sp, r0 + ldrb r0, [r0, r6, lsl #8] + cmp r0, #0xa + bhs _037F825C + add r0, sp, #0x10 + mov r3, #0xa + mov r2, #0 + add r1, r0, r1 + b _037F8250 +_037F8244: + add r0, r1, r3, lsl #1 + strh r2, [r0, #-0xfc] + sub r3, r3, #1 +_037F8250: + ldrb r0, [r1, #-0xe6] + cmp r3, r0 + bgt _037F8244 +_037F825C: + ldr r0, _037F8464 ; =0xFFFFFF60 + mov r1, r6, lsl #8 + add r0, sp, r0 + ldrb r0, [r0, r6, lsl #8] + cmp r0, #0x1a + bhs _037F82A0 + add r0, sp, #0x10 + mov r3, #0x1a + mov r2, #0 + add r1, r0, r1 + b _037F8294 +_037F8288: + add r0, r1, r3, lsl #1 + strh r2, [r0, #-0xe6] + sub r3, r3, #1 +_037F8294: + ldrb r0, [r1, #-0xb0] + cmp r3, r0 + bgt _037F8288 +_037F82A0: + ldr r1, _037F845C ; =0x027FFC80 + add r2, sp, #0x10 + sub r0, r6, #1 + add r0, r2, r0, lsl #8 + mov r2, #0x74 + bl MIi_CpuCopy32 + b _037F82CC +_037F82BC: + ldr r1, _037F845C ; =0x027FFC80 + mov r0, #0 + mov r2, #0x74 + bl MIi_CpuClear32 +_037F82CC: + add r2, sp, #8 + mov r0, #0x36 + mov r1, #6 + bl NVRAM_ReadDataBytes + ldr r4, _037F845C ; =0x027FFC80 + add r0, sp, #8 + add r1, r4, #0x74 + mov r2, #6 + bl MI_CpuCopy8 + add r2, sp, #2 + mov r0, #0x3c + mov r1, #2 + bl NVRAM_ReadDataBytes + ldrh r0, [sp, #2] + mov r0, r0, lsl #0xf + mov r0, r0, lsr #0x10 + bl WMSP_GetAllowedChannel + strh r0, [r4, #0x7a] + bl PXI_Init + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r2, r4 + mov r0, #8 + mov r3, #1 + bl OS_InitAlloc + mov r4, r0 + mov r0, #8 + bl OS_GetArenaHi + sub r2, r0, r4 + mov r0, r4 + mov r1, #0 + bl MI_CpuFill8 + mov r1, r4 + mov r0, #8 + bl OS_SetArenaLo + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r2, r4 + mov r0, #8 + bl OS_CreateHeap + movs r4, r0 + bpl _037F8398 + bl OS_Terminate +_037F8398: + mov r1, r4 + mov r0, #8 + bl OS_SetCurrentHeap + mov r1, r4 + mov r0, #8 + bl OS_CheckHeap + cmp r0, #0x2100 + bhs _037F83BC + bl OS_Terminate +_037F83BC: + mov r0, #6 + bl SND_Init + bl PAD_InitXYButton + ldr r1, _037F8468 ; =VBlankIntr + mov r0, #1 + bl OS_SetIrqFunction + mov r0, #1 + bl OS_EnableIrqMask + ldr r3, _037F846C ; =0x04000004 + mov r0, #1 + ldrh r1, [r3] + ldrh r1, [r3] + add r2, r3, #0x204 + orr r1, r1, #8 + strh r1, [r3] + ldrh r1, [r2] + strh r0, [r2] + bl OS_EnableInterrupts + mvn r0, #0 + bl FS_Init + mov r0, #0xf + bl CARD_SetThreadPriority + mov r0, #0xc + bl RTC_Init + mov r0, r4 + bl WVR_Init + mov r0, #2 + bl SPI_Init + mov r4, #0 +_037F8430: + bl SVC_Halt + bl OS_IsResetOccurred + cmp r0, #0 + beq _037F844C + mov r0, r4 + bl CTRDG_VibPulseEdgeUpdate + bl OS_ResetSystem + ; noreturn +_037F844C: + bl CTRDG_CheckPullOut_Polling + bl CARD_CheckPullOut_Polling + b _037F8430 + .align 2, 0 +_037F8458: .word 0x0000FFFF +_037F845C: .word 0x027FFC80 +_037F8460: .word 0xFFFFFF2A +_037F8464: .word 0xFFFFFF60 +_037F8468: .word VBlankIntr +_037F846C: .word 0x04000004 + arm_func_end NitroSpMain + + ; Routine generated by linktime interworking + ; Defined explicitly to force order in ASM + .arm + .balign 4, 0 +__Veneer_SVC_GetCRC16: ; 0x037F8470 + ldr ip, _037F8478 ; =SVC_GetCRC16 + bx ip + .align 2, 0 +_037F8478: .word SVC_GetCRC16 + arm_func_end __Veneer_SVC_GetCRC16 + +; ; Routine generated by linktime interworking +; arm_func_start SVC_Halt +; SVC_Halt: ; 0x037F847C +; ldr ip, _037F8484 ; =SVC_Halt +; bx ip +; .align 2, 0 +; _037F8484: .word SVC_Halt +; arm_func_end SVC_Halt diff --git a/sub/asm/sp_main_help.s b/sub/asm/sp_main_help.s new file mode 100644 index 00000000..a481880a --- /dev/null +++ b/sub/asm/sp_main_help.s @@ -0,0 +1,42 @@ + .include "asm/macros.inc" + .include "global.inc" + + .public PMi_Initialized + + .text + + ; Merge into sp_main.c when decompiling + + arm_func_start GetRomValidLanguage +GetRomValidLanguage: ; 0x037F8488 + ldr r1, _037F84BC ; =0x027FFE1D + mov r0, #0 + ldrb r1, [r1] + cmp r1, #0x80 + orreq r0, r0, #0x40 + moveq r0, r0, lsl #0x10 + moveq r0, r0, lsr #0x10 + bxeq lr + cmp r1, #0x40 + orreq r0, r0, #0x80 + moveq r0, r0, lsl #0x10 + moveq r0, r0, lsr #0x10 + bx lr + .align 2, 0 +_037F84BC: .word 0x027FFE1D + arm_func_end GetRomValidLanguage + + arm_func_start VBlankIntr +VBlankIntr: ; 0x037F84C0 + stmdb sp!, {r3, lr} + ldr r0, _037F84E0 ; =PMi_Initialized + ldr r0, [r0] + cmp r0, #0 + beq _037F84D8 + bl PM_SelfBlinkProc +_037F84D8: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037F84E0: .word PMi_Initialized + arm_func_end VBlankIntr diff --git a/sub/asm/sub.ext.s b/sub/asm/sub.ext.s new file mode 100644 index 00000000..f5d32d4f --- /dev/null +++ b/sub/asm/sub.ext.s @@ -0,0 +1,87 @@ + .include "asm/macros.inc" + .include "global.inc" + + .public SDK_AUTOLOAD_START + .public SDK_AUTOLOAD_LIST + .public SDK_AUTOLOAD_LIST_END + .public SDK_AUTOLOAD_WRAM_SIZE + .public SDK_AUTOLOAD_WRAM_BSS_SIZE + .public SDK_AUTOLOAD_MAIN_BSS_END + .public SDK_SUBPRIV_ARENA_LO + + ; Temporary until ARM7 bss is defined + .public WVR_BSS_START + .set o_wvrStatus, 0x0 + .set o_wvrVramImageBuf, 0x4 + .set o_wvrHeapHandle, 0x8 + .set o_wvrVramImageBufSize, 0xC + .set o_wvrThread, 0x10 + .set o_wvrWlStaElement, 0xB4 + .set o_wvrThreadStack, 0x274 + .set o_wvrWlStack, 0x674 + .set o_wvrWlWork, 0xC74 + + .text + + arm_func_start WVR_ShelterExtWram +WVR_ShelterExtWram: ; 0x027E0000 + stmdb sp!, {r4, r5, r6, lr} + ldr r6, _027E00A4 ; =SDK_AUTOLOAD_START + ldr r2, _027E00A8 ; =SDK_AUTOLOAD_LIST + ldr r0, _027E00AC ; =SDK_AUTOLOAD_LIST_END + b _027E0094 +_027E0014: + ldmia r2, {r1, r4, r5} + cmp r1, #0x6000000 + add r2, r2, #0xc + bne _027E0090 + ldr r1, _027E00B0 ; =SDK_AUTOLOAD_MAIN_BSS_END + ldr r0, _027E00B4 ; =WVR_BSS_START + add r3, r4, r5 + str r1, [r0, #o_wvrVramImageBuf] + ldr r2, _027E00B8 ; =SDK_SUBPRIV_ARENA_LO + add r1, r1, r3 + str r3, [r0, #o_wvrVramImageBufSize] + cmp r2, r1 + beq _027E004C + bl OS_Terminate +_027E004C: + ldr r0, _027E00B4 ; =WVR_BSS_START + mov r1, #0 + ldr r2, [r0, #o_wvrVramImageBuf] + b _027E0068 +_027E005C: + ldr r0, [r6], #4 + add r1, r1, #1 + str r0, [r2], #4 +_027E0068: + cmp r1, r4, lsr #2 + blo _027E005C + mov r1, #0 + mov r0, r1 + b _027E0084 +_027E007C: + str r0, [r2], #4 + add r1, r1, #1 +_027E0084: + cmp r1, r5, lsr #2 + blo _027E007C + b _027E009C +_027E0090: + add r6, r6, r4 +_027E0094: + cmp r2, r0 + bne _027E0014 +_027E009C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_027E00A4: .word SDK_AUTOLOAD_START +_027E00A8: .word SDK_AUTOLOAD_LIST +_027E00AC: .word SDK_AUTOLOAD_LIST_END +_027E00B0: .word SDK_AUTOLOAD_MAIN_BSS_END +_027E00B4: .word WVR_BSS_START +_027E00B8: .word SDK_SUBPRIV_ARENA_LO + + .section .wram,4,1,5 + diff --git a/sub/asm/sub.ext_wram.s b/sub/asm/sub.ext_wram.s new file mode 100644 index 00000000..c046ef88 --- /dev/null +++ b/sub/asm/sub.ext_wram.s @@ -0,0 +1,29182 @@ + .include "asm/macros.inc" + .include "global.inc" + + .public wmspIndicateThread + .public wmspMPAckAlarm + .public wmspMPIntervalAlarm + .public wmspRequestThread + .public wmspVAlarm + + .text + + arm_func_start WMSP_Init +WMSP_Init: ; 0x06000000 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r4, r1 + ldr r1, [r4] + ldr r3, _0600018C ; =wmspW + 0x1000 + mov r5, r0 + str r1, [r3, #0x540] + ldr r1, [r5, #0x24] + ldr r0, _06000190 ; =wmspW + str r1, [r3, #0x544] + ldr r2, [r5, #0x28] + ldr r1, _06000194 ; =wmspW + 0x20 + str r2, [r3, #0x548] + mov ip, #0 + str ip, [r3, #0x54c] + mov r2, #2 + str ip, [r3, #0x550] + bl __VENEER_OS_InitMessageQueue + ldr r0, _06000198 ; =wmspW + 0x28 + ldr r1, _0600019C ; =wmspW + 0x48 + mov r2, #4 + bl __VENEER_OS_InitMessageQueue + ldr r0, _060001A0 ; =wmspW + 0x58 + ldr r1, _060001A4 ; =wmspW + 0x78 + mov r2, #4 + bl __VENEER_OS_InitMessageQueue + ldr r0, _060001A8 ; =wmspW + 0x88 + ldr r1, _060001AC ; =wmspW + 0xA8 + mov r2, #0x20 + bl __VENEER_OS_InitMessageQueue + ldr r1, _06000190 ; =wmspW + ldr r0, _06000198 ; =wmspW + 0x28 + str r1, [r5, #0x10] + str r0, [r5, #0x14] + ldr r2, [r4, #8] + ldr r1, _0600018C ; =wmspW + 0x1000 + ldr r0, _060001B0 ; =wmspW + 0x1528 + str r2, [r1, #0x578] + ldr r2, [r4, #0x18] + str r2, [r1, #0x57c] + ldr r2, [r4, #0x10] + str r2, [r1, #0x580] + ldr r2, [r4, #4] + str r2, [r1, #0x584] + ldr r2, [r4, #0x14] + str r2, [r1, #0x588] + ldr r2, [r4, #0xc] + str r2, [r1, #0x58c] + bl __VENEER_OS_InitMutex + mov r0, #0x400 + str r0, [sp] + ldr r1, [r4, #4] + ldr r0, _060001B4 ; =wmspIndicateThread + str r1, [sp, #4] + ldr r1, _060001B8 ; =WMSP_IndicateThread + ldr r3, _060001B0 ; =wmspW + 0x1528 + mov r2, #0 + bl __VENEER_OS_CreateThread + ldr r0, _060001B4 ; =wmspIndicateThread + bl __VENEER_OS_WakeupThreadDirect + mov r0, #0x1000 + str r0, [sp] + ldr r1, [r4, #0xc] + ldr r0, _060001BC ; =wmspRequestThread + str r1, [sp, #4] + ldr r1, _060001C0 ; =WMSP_RequestThread + ldr r3, _060001C4 ; =wmspW + 0x1128 + mov r2, #0 + bl __VENEER_OS_CreateThread + ldr r0, _060001BC ; =wmspRequestThread + bl __VENEER_OS_WakeupThreadDirect + mov r3, #0 + ldr r1, _06000190 ; =wmspW + mov r2, r3 +_06000128: + add r0, r1, r3 + add r0, r0, #0x1000 + add r3, r3, #1 + strb r2, [r0, #0x554] + cmp r3, #0x20 + blt _06000128 + ldr r0, _0600018C ; =wmspW + 0x1000 + str r2, [r0, #0x574] + bl __VENEER_OS_IsVAlarmAvailable + cmp r0, #0 + bne _06000158 + bl __VENEER_OS_InitVAlarm +_06000158: + bl __VENEER_PXI_Init + ldr r1, _060001C8 ; =WmspPxiCallback + mov r0, #0xa + bl __VENEER_PXI_SetFifoRecvCallback + mov r0, #2 + str r0, [r5, #0x18] + ldr r1, [r4, #0x14] + mov r0, r5 + str r1, [r5, #0xc] + bl WL_InitDriver + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600018C: .word wmspW + 0x1000 +_06000190: .word wmspW +_06000194: .word wmspW + 0x20 +_06000198: .word wmspW + 0x28 +_0600019C: .word wmspW + 0x48 +_060001A0: .word wmspW + 0x58 +_060001A4: .word wmspW + 0x78 +_060001A8: .word wmspW + 0x88 +_060001AC: .word wmspW + 0xA8 +_060001B0: .word wmspW + 0x1528 +_060001B4: .word wmspIndicateThread +_060001B8: .word WMSP_IndicateThread +_060001BC: .word wmspRequestThread +_060001C0: .word WMSP_RequestThread +_060001C4: .word wmspW + 0x1128 +_060001C8: .word WmspPxiCallback + arm_func_end WMSP_Init + + arm_func_start __VENEER_OS_InitMessageQueue +__VENEER_OS_InitMessageQueue: ; 0x060001CC + ldr pc, _060001D0 ; =OS_InitMessageQueue + .align 2, 0 +_060001D0: .word OS_InitMessageQueue + arm_func_end __VENEER_OS_InitMessageQueue + + arm_func_start __VENEER_OS_InitMutex +__VENEER_OS_InitMutex: ; 0x060001D4 + ldr pc, _060001D8 ; =OS_InitMutex + .align 2, 0 +_060001D8: .word OS_InitMutex + arm_func_end __VENEER_OS_InitMutex + + arm_func_start __VENEER_OS_CreateThread +__VENEER_OS_CreateThread: ; 0x060001DC + ldr pc, _060001E0 ; =OS_CreateThread + .align 2, 0 +_060001E0: .word OS_CreateThread + arm_func_end __VENEER_OS_CreateThread + + arm_func_start __VENEER_OS_WakeupThreadDirect +__VENEER_OS_WakeupThreadDirect: ; 0x060001E4 + ldr pc, _060001E8 ; =OS_WakeupThreadDirect + .align 2, 0 +_060001E8: .word OS_WakeupThreadDirect + arm_func_end __VENEER_OS_WakeupThreadDirect + + arm_func_start __VENEER_OS_IsVAlarmAvailable +__VENEER_OS_IsVAlarmAvailable: ; 0x060001EC + ldr pc, _060001F0 ; =OS_IsVAlarmAvailable + .align 2, 0 +_060001F0: .word OS_IsVAlarmAvailable + arm_func_end __VENEER_OS_IsVAlarmAvailable + + arm_func_start __VENEER_OS_InitVAlarm +__VENEER_OS_InitVAlarm: ; 0x060001F4 + ldr pc, _060001F8 ; =OS_InitVAlarm + .align 2, 0 +_060001F8: .word OS_InitVAlarm + arm_func_end __VENEER_OS_InitVAlarm + + arm_func_start __VENEER_PXI_Init +__VENEER_PXI_Init: ; 0x060001FC + ldr pc, _06000200 ; =PXI_Init + .align 2, 0 +_06000200: .word PXI_Init + arm_func_end __VENEER_PXI_Init + + arm_func_start __VENEER_PXI_SetFifoRecvCallback +__VENEER_PXI_SetFifoRecvCallback: ; 0x06000204 + ldr pc, _06000208 ; =PXI_SetFifoRecvCallback + .align 2, 0 +_06000208: .word PXI_SetFifoRecvCallback + arm_func_end __VENEER_PXI_SetFifoRecvCallback + + arm_func_start WMSP_WlRequest +WMSP_WlRequest: ; 0x0600020C + stmdb sp!, {r3, lr} + mov r1, r0 + ldr r0, _0600027C ; =wmspW + mov r2, #1 + bl __VENEER_OS_SendMessage + ldr r0, _06000280 ; =wmspW + 0x58 + add r1, sp, #0 + mov r2, #1 + bl __VENEER_OS_ReceiveMessage + ldr r1, [sp] + ldrh r0, [r1, #0xe] + add r0, r1, r0, lsl #1 + ldrh r0, [r0, #0x14] + cmp r0, #0xe + bne _06000270 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #0x13 + strh r1, [r0, #2] + mov r1, #0x18 + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + bl __VENEER_SND_BeginSleep + bl __VENEER_OS_Terminate +_06000270: + ldr r0, [sp] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600027C: .word wmspW +_06000280: .word wmspW + 0x58 + arm_func_end WMSP_WlRequest + + arm_func_start __VENEER_OS_SendMessage +__VENEER_OS_SendMessage: ; 0x06000284 + ldr pc, _06000288 ; =OS_SendMessage + .align 2, 0 +_06000288: .word OS_SendMessage + arm_func_end __VENEER_OS_SendMessage + + arm_func_start __VENEER_OS_ReceiveMessage +__VENEER_OS_ReceiveMessage: ; 0x0600028C + ldr pc, _06000290 ; =OS_ReceiveMessage + .align 2, 0 +_06000290: .word OS_ReceiveMessage + arm_func_end __VENEER_OS_ReceiveMessage + + arm_func_start __VENEER_WMSP_GetBuffer4Callback2Wm9 +__VENEER_WMSP_GetBuffer4Callback2Wm9: ; 0x06000294 + ldr pc, _06000298 ; =WMSP_GetBuffer4Callback2Wm9 + .align 2, 0 +_06000298: .word WMSP_GetBuffer4Callback2Wm9 + arm_func_end __VENEER_WMSP_GetBuffer4Callback2Wm9 + + arm_func_start __VENEER_WMSP_ReturnResult2Wm9 +__VENEER_WMSP_ReturnResult2Wm9: ; 0x0600029C + ldr pc, _060002A0 ; =WMSP_ReturnResult2Wm9 + .align 2, 0 +_060002A0: .word WMSP_ReturnResult2Wm9 + arm_func_end __VENEER_WMSP_ReturnResult2Wm9 + + arm_func_start __VENEER_SND_BeginSleep +__VENEER_SND_BeginSleep: ; 0x060002A4 + ldr pc, _060002A8 ; =SND_BeginSleep + .align 2, 0 +_060002A8: .word SND_BeginSleep + arm_func_end __VENEER_SND_BeginSleep + + arm_func_start __VENEER_OS_Terminate +__VENEER_OS_Terminate: ; 0x060002AC + ldr pc, _060002B0 ; =OS_Terminate + .align 2, 0 +_060002B0: .word OS_Terminate + arm_func_end __VENEER_OS_Terminate + + arm_func_start WmspPxiCallback +WmspPxiCallback: ; 0x060002B4 + stmdb sp!, {r4, lr} + mov r4, r1 + cmp r2, #0 + bne _0600030C + ldr r0, _06000314 ; =wmspW + 0x88 + mov r2, #0 + bl __VENEER_OS_SendMessage + cmp r0, #0 + bne _0600030C + ldr r0, _06000318 ; =wmspW + 0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + beq _0600030C + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + ldrh r2, [r4] + mov r1, #8 + strh r2, [r0] + strh r1, [r0, #2] + mov r1, #0 + strh r1, [r0, #4] + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_0600030C: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06000314: .word wmspW + 0x88 +_06000318: .word wmspW + 0x1000 + arm_func_end WmspPxiCallback + + arm_func_start WMSP_CheckMacAddress +WMSP_CheckMacAddress: ; 0x0600031C + ldr r1, _06000378 ; =wmspW + 0x1000 + ldrb r2, [r0] + ldr r3, [r1, #0x550] + ldrb r1, [r3, #0xe0] + cmp r2, r1 + ldreqb r2, [r0, #1] + ldreqb r1, [r3, #0xe1] + cmpeq r2, r1 + ldreqb r2, [r0, #2] + ldreqb r1, [r3, #0xe2] + cmpeq r2, r1 + ldreqb r2, [r0, #3] + ldreqb r1, [r3, #0xe3] + cmpeq r2, r1 + ldreqb r2, [r0, #4] + ldreqb r1, [r3, #0xe4] + cmpeq r2, r1 + ldreqb r1, [r0, #5] + ldreqb r0, [r3, #0xe5] + cmpeq r1, r0 + moveq r0, #1 + movne r0, #0 + bx lr + .align 2, 0 +_06000378: .word wmspW + 0x1000 + arm_func_end WMSP_CheckMacAddress + + arm_func_start WMSP_CopyParentParam +WMSP_CopyParentParam: ; 0x0600037C + stmdb sp!, {r3, lr} + ldr r3, [r1, #8] + mov r2, r0 + str r3, [r2, #4] + ldrh r0, [r1, #0xc] + strh r0, [r2, #8] + ldrh r0, [r1, #0x12] + cmp r0, #0 + movne r3, #2 + ldrh r0, [r1, #0xe] + moveq r3, #0 + cmp r0, #0 + movne ip, #1 + ldrh r0, [r1, #0x14] + moveq ip, #0 + cmp r0, #0 + movne lr, #4 + moveq lr, #0 + orr r0, ip, r3 + orr r0, lr, r0 + strb r0, [r2, #0xb] + ldrh r3, [r1, #4] + mov r0, #1 + strb r3, [r2, #0xa] + strh r0, [r2] + strb r0, [r2, #2] + mov r0, #0 + strb r0, [r2, #3] + ldrh r0, [r1, #0x34] + strh r0, [r2, #0xc] + ldrh r0, [r1, #0x12] + cmp r0, #0 + beq _06000410 + ldrh r0, [r1, #0x36] + cmp r0, #8 + movhs r0, #8 + bhs _06000414 +_06000410: + ldrh r0, [r1, #0x36] +_06000414: + strh r0, [r2, #0xe] + ldrb r3, [r2, #0xa] + cmp r3, #0 + beq _06000438 + ldr r0, [r1] + add r3, r3, #1 + add r1, r2, #0x10 + bic r2, r3, #1 + bl __VENEER_MI_CpuCopy8 +_06000438: + ldmia sp!, {r3, lr} + bx lr + arm_func_end WMSP_CopyParentParam + + arm_func_start __VENEER_MI_CpuCopy8 +__VENEER_MI_CpuCopy8: ; 0x06000440 + ldr pc, _06000444 ; =MI_CpuCopy8 + .align 2, 0 +_06000444: .word MI_CpuCopy8 + arm_func_end __VENEER_MI_CpuCopy8 + + arm_func_start WMSP_SetAllParams +WMSP_SetAllParams: ; 0x06000448 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _06000590 ; =wmspW + 0x1000 + mov r5, r1 + ldr r4, [r2, #0x550] + mov r6, r0 + add r0, r4, #0xe0 + add r1, r5, #0x10 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + mov r0, #7 + strh r0, [r5, #0x16] + add r0, r4, #0x100 + ldrh r1, [r0, #0xf4] + strh r1, [r5, #0x18] + ldrh r1, [r0, #0xec] + strh r1, [r5, #0x1e] + ldrh r1, [r4, #0xe6] + strh r1, [r5, #0x1c] + ldr r1, [r4, #0x198] + cmp r1, #0 + bne _060004BC + mov r0, #0 + strh r0, [r5, #0x20] + add r1, r5, #0x24 + mov r2, #0x50 + strh r0, [r5, #0x22] + bl __VENEER_MIi_CpuClear16 + mov r0, #0 + b _060004E0 +_060004BC: + ldrh r1, [r0, #0x96] + add r0, r4, #0x19c + strh r1, [r5, #0x20] + ldrh r2, [r4, #0xc4] + add r1, r5, #0x24 + strh r2, [r5, #0x22] + mov r2, #0x50 + bl __VENEER_MI_CpuCopy8 + mov r0, #1 +_060004E0: + strh r0, [r5, #0x9e] + mov r0, #1 + strh r0, [r5, #0x74] + strh r0, [r5, #0x76] + ldrh r0, [r4, #0xe6] + add r1, r5, #0x7c + cmp r0, #1 + moveq r0, #0 + movne r0, #0x10 + strh r0, [r5, #0x78] + mov r0, #0xa + strh r0, [r5, #0x7a] + cmp r6, #0x26 + mov r0, #0 + bne _06000528 + mov r2, #0x20 + bl __VENEER_MIi_CpuClear16 + b _06000540 +_06000528: + mov r2, #8 + bl __VENEER_MIi_CpuClear16 + ldr r0, _06000594 ; =0x0000FFFF + add r1, r5, #0x84 + mov r2, #0x18 + bl __VENEER_MIi_CpuClear16 +_06000540: + add r0, r4, #0x100 + ldrh r1, [r0, #0xee] + mov r0, r5 + strh r1, [r5, #0x9c] + bl WMSP_WL_ParamSetAll + ldrh r4, [r0, #4] + cmp r4, #0 + moveq r0, #1 + beq _06000588 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + strh r6, [r0] + mov r1, #1 + strh r1, [r0, #2] + mov r1, #0x200 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + mov r0, #0 +_06000588: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06000590: .word wmspW + 0x1000 +_06000594: .word 0x0000FFFF + arm_func_end WMSP_SetAllParams + + arm_func_start __VENEER_MIi_CpuClear16 +__VENEER_MIi_CpuClear16: ; 0x06000598 + ldr pc, _0600059C ; =MIi_CpuClear16 + .align 2, 0 +_0600059C: .word MIi_CpuClear16 + arm_func_end __VENEER_MIi_CpuClear16 + + arm_func_start WMSP_AddRssiToList +WMSP_AddRssiToList: ; 0x060005A0 + ldr r1, _060005D8 ; =wmspW + 0x1000 + ldr r3, _060005DC ; =wmspW + 0x1554 + ldr ip, [r1, #0x574] + ldr r2, _060005E0 ; =0x027FFF98 + strb r0, [r3, ip] + ldr r3, [r1, #0x574] + add r3, r3, #1 + and r3, r3, #0x1f + str r3, [r1, #0x574] + ldrh r1, [r2] + eor r0, r0, r1, lsl #1 + eor r0, r0, r0, lsr #16 + strh r0, [r2] + bx lr + .align 2, 0 +_060005D8: .word wmspW + 0x1000 +_060005DC: .word wmspW + 0x1554 +_060005E0: .word 0x027FFF98 + arm_func_end WMSP_AddRssiToList + + arm_func_start WMSP_FillRssiIntoList +WMSP_FillRssiIntoList: ; 0x060005E4 + ldr r2, _06000614 ; =wmspW + mov r3, #0 +_060005EC: + add r1, r2, r3 + add r1, r1, #0x1000 + add r3, r3, #1 + strb r0, [r1, #0x554] + cmp r3, #0x20 + blt _060005EC + ldr r0, _06000618 ; =wmspW + 0x1000 + mov r1, #0 + str r1, [r0, #0x574] + bx lr + .align 2, 0 +_06000614: .word wmspW +_06000618: .word wmspW + 0x1000 + arm_func_end WMSP_FillRssiIntoList + + arm_func_start WMSP_GetAverageLinkLevel +WMSP_GetAverageLinkLevel: ; 0x0600061C + ldr r1, _06000650 ; =wmspW + mov r3, #0 + mov r2, r3 +_06000628: + add r0, r1, r2 + add r0, r0, #0x1000 + ldrb r0, [r0, #0x554] + add r2, r2, #1 + cmp r2, #0x20 + add r3, r3, r0 + blt _06000628 + ldr ip, _06000654 ; =WMSP_GetLinkLevel + mov r0, r3, lsr #5 + bx ip + .align 2, 0 +_06000650: .word wmspW +_06000654: .word WMSP_GetLinkLevel + arm_func_end WMSP_GetAverageLinkLevel + + arm_func_start WMSP_GetLinkLevel +WMSP_GetLinkLevel: ; 0x06000658 + ldr r1, _060006BC ; =wmspW + 0x1000 + ldr r1, [r1, #0x54c] + ldrb r1, [r1, #0x53] + cmp r1, #8 + bne _06000694 + cmp r0, #0x16 + movlo r0, #0 + bxlo lr + cmp r0, #0x1c + movlo r0, #1 + bxlo lr + cmp r0, #0x22 + movlo r0, #2 + movhs r0, #3 + bx lr +_06000694: + cmp r0, #8 + movlo r0, #0 + bxlo lr + cmp r0, #0xe + movlo r0, #1 + bxlo lr + cmp r0, #0x14 + movlo r0, #2 + movhs r0, #3 + bx lr + .align 2, 0 +_060006BC: .word wmspW + 0x1000 + arm_func_end WMSP_GetLinkLevel + + arm_func_start WMSP_SetThreadPriorityLow +WMSP_SetThreadPriorityLow: ; 0x060006C0 + stmdb sp!, {r4, lr} + bl __VENEER_OS_DisableInterrupts + mov r4, r0 + bl __VENEER_OS_DisableScheduler + ldr r1, _06000714 ; =wmspW + 0x1000 + ldr r0, _06000718 ; =wmspRequestThread + ldr r1, [r1, #0x58c] + bl __VENEER_OS_SetThreadPriority + bl WL_GetThreadStruct + ldr r1, _06000714 ; =wmspW + 0x1000 + ldr r1, [r1, #0x588] + bl __VENEER_OS_SetThreadPriority + ldr r1, _06000714 ; =wmspW + 0x1000 + ldr r0, _0600071C ; =wmspIndicateThread + ldr r1, [r1, #0x584] + bl __VENEER_OS_SetThreadPriority + bl __VENEER_OS_EnableScheduler + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06000714: .word wmspW + 0x1000 +_06000718: .word wmspRequestThread +_0600071C: .word wmspIndicateThread + arm_func_end WMSP_SetThreadPriorityLow + + arm_func_start __VENEER_OS_DisableInterrupts +__VENEER_OS_DisableInterrupts: ; 0x06000720 + ldr pc, _06000724 ; =OS_DisableInterrupts + .align 2, 0 +_06000724: .word OS_DisableInterrupts + arm_func_end __VENEER_OS_DisableInterrupts + + arm_func_start __VENEER_OS_DisableScheduler +__VENEER_OS_DisableScheduler: ; 0x06000728 + ldr pc, _0600072C ; =OS_DisableScheduler + .align 2, 0 +_0600072C: .word OS_DisableScheduler + arm_func_end __VENEER_OS_DisableScheduler + + arm_func_start __VENEER_OS_SetThreadPriority +__VENEER_OS_SetThreadPriority: ; 0x06000730 + ldr pc, _06000734 ; =OS_SetThreadPriority + .align 2, 0 +_06000734: .word OS_SetThreadPriority + arm_func_end __VENEER_OS_SetThreadPriority + + arm_func_start __VENEER_OS_EnableScheduler +__VENEER_OS_EnableScheduler: ; 0x06000738 + ldr pc, _0600073C ; =OS_EnableScheduler + .align 2, 0 +_0600073C: .word OS_EnableScheduler + arm_func_end __VENEER_OS_EnableScheduler + + arm_func_start __VENEER_OS_RestoreInterrupts +__VENEER_OS_RestoreInterrupts: ; 0x06000740 + ldr pc, _06000744 ; =OS_RestoreInterrupts + .align 2, 0 +_06000744: .word OS_RestoreInterrupts + arm_func_end __VENEER_OS_RestoreInterrupts + + arm_func_start WMSP_SetThreadPriorityHigh +WMSP_SetThreadPriorityHigh: ; 0x06000748 + stmdb sp!, {r4, lr} + bl __VENEER_OS_DisableInterrupts + mov r4, r0 + bl __VENEER_OS_DisableScheduler + ldr r1, _0600079C ; =wmspW + 0x1000 + ldr r0, _060007A0 ; =wmspIndicateThread + ldr r1, [r1, #0x578] + bl __VENEER_OS_SetThreadPriority + bl WL_GetThreadStruct + ldr r1, _0600079C ; =wmspW + 0x1000 + ldr r1, [r1, #0x57c] + bl __VENEER_OS_SetThreadPriority + ldr r1, _0600079C ; =wmspW + 0x1000 + ldr r0, _060007A4 ; =wmspRequestThread + ldr r1, [r1, #0x580] + bl __VENEER_OS_SetThreadPriority + bl __VENEER_OS_EnableScheduler + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600079C: .word wmspW + 0x1000 +_060007A0: .word wmspIndicateThread +_060007A4: .word wmspRequestThread + arm_func_end WMSP_SetThreadPriorityHigh + + arm_func_start WMSP_GetRequestThread +WMSP_GetRequestThread: ; 0x060007A8 + ldr r0, _060007B0 ; =wmspRequestThread + bx lr + .align 2, 0 +_060007B0: .word wmspRequestThread + arm_func_end WMSP_GetRequestThread + + arm_func_start WMSP_GetIndicateThread +WMSP_GetIndicateThread: ; 0x060007B4 + ldr r0, _060007BC ; =wmspIndicateThread + bx lr + .align 2, 0 +_060007BC: .word wmspIndicateThread + arm_func_end WMSP_GetIndicateThread + + arm_func_start WMSP_GetInternalRequestBuf +WMSP_GetInternalRequestBuf: ; 0x060007C0 + stmdb sp!, {r4, lr} + mov r4, #0 + bl __VENEER_OS_DisableInterrupts + ldr r1, _06000828 ; =wmspW + 0x1000 + ldr r2, [r1, #0x54c] + cmp r2, #0 + beq _06000818 + mov r3, r4 + b _06000810 +_060007E4: + add r1, r2, r3, lsl #4 + ldr r1, [r1, #0xd0] + tst r1, #0x8000 + beq _0600080C + add r2, r2, #0xd0 + ldr r1, [r2, r3, lsl #4] + add r4, r2, r3, lsl #4 + bic r1, r1, #0x8000 + str r1, [r2, r3, lsl #4] + b _06000818 +_0600080C: + add r3, r3, #1 +_06000810: + cmp r3, #0x20 + blt _060007E4 +_06000818: + bl __VENEER_OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06000828: .word wmspW + 0x1000 + arm_func_end WMSP_GetInternalRequestBuf + + arm_func_start WMSP_ResetSizeVars +WMSP_ResetSizeVars: ; 0x0600082C + ldr r0, _0600085C ; =wmspW + 0x1000 + mov r1, #0 + ldr r0, [r0, #0x550] + strh r1, [r0, #0x38] + strh r1, [r0, #0x3a] + strh r1, [r0, #0x30] + strh r1, [r0, #0x32] + strh r1, [r0, #0x3c] + strh r1, [r0, #0x3e] + strh r1, [r0, #0x34] + strh r1, [r0, #0x36] + bx lr + .align 2, 0 +_0600085C: .word wmspW + 0x1000 + arm_func_end WMSP_ResetSizeVars + + arm_func_start WMSP_SetParentMaxSize +WMSP_SetParentMaxSize: ; 0x06000860 + ldr r1, _060008AC ; =wmspW + 0x1000 + cmp r0, #0x200 + ldr r2, [r1, #0x550] + movhi r0, #0x200 + strh r0, [r2, #0x30] + strh r0, [r2, #0x34] + add r1, r2, #0x100 + ldrh r1, [r1, #0x88] + add r0, r0, #4 + cmp r1, #0 + moveq r0, r0, lsl #0x10 + moveq r0, r0, lsr #0x10 + streqh r0, [r2, #0x3c] + streqh r0, [r2, #0x38] + movne r0, r0, lsl #0x10 + movne r0, r0, lsr #0x10 + strneh r0, [r2, #0x3e] + strneh r0, [r2, #0x3a] + bx lr + .align 2, 0 +_060008AC: .word wmspW + 0x1000 + arm_func_end WMSP_SetParentMaxSize + + arm_func_start WMSP_SetChildMaxSize +WMSP_SetChildMaxSize: ; 0x060008B0 + ldr r1, _060008FC ; =wmspW + 0x1000 + cmp r0, #0x200 + ldr r2, [r1, #0x550] + movhi r0, #0x200 + strh r0, [r2, #0x36] + strh r0, [r2, #0x32] + add r1, r2, #0x100 + ldrh r1, [r1, #0x88] + add r0, r0, #2 + cmp r1, #0 + moveq r0, r0, lsl #0x10 + moveq r0, r0, lsr #0x10 + streqh r0, [r2, #0x3e] + streqh r0, [r2, #0x3a] + movne r0, r0, lsl #0x10 + movne r0, r0, lsr #0x10 + strneh r0, [r2, #0x3c] + strneh r0, [r2, #0x38] + bx lr + .align 2, 0 +_060008FC: .word wmspW + 0x1000 + arm_func_end WMSP_SetChildMaxSize + + arm_func_start WMSP_SetParentSize +WMSP_SetParentSize: ; 0x06000900 + ldr r1, _06000928 ; =wmspW + 0x1000 + ldr r2, [r1, #0x550] + strh r0, [r2, #0x30] + add r1, r2, #0x100 + ldrh r1, [r1, #0x88] + add r0, r0, #4 + cmp r1, #0 + streqh r0, [r2, #0x38] + strneh r0, [r2, #0x3a] + bx lr + .align 2, 0 +_06000928: .word wmspW + 0x1000 + arm_func_end WMSP_SetParentSize + + arm_func_start WMSP_SetChildSize +WMSP_SetChildSize: ; 0x0600092C + ldr r1, _06000954 ; =wmspW + 0x1000 + ldr r2, [r1, #0x550] + strh r0, [r2, #0x32] + add r1, r2, #0x100 + ldrh r1, [r1, #0x88] + add r0, r0, #2 + cmp r1, #0 + streqh r0, [r2, #0x3a] + strneh r0, [r2, #0x38] + bx lr + .align 2, 0 +_06000954: .word wmspW + 0x1000 + arm_func_end WMSP_SetChildSize + + arm_func_start WMSP_IndicateThread +WMSP_IndicateThread: ; 0x06000958 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x28 +_06000960: + ldr r0, _060017D4 ; =wmspW + add r1, sp, #0x24 + add r0, r0, #0x28 + mov r2, #1 + bl __VENEER_OS_ReceiveMessage + ldr sb, [sp, #0x24] + cmp sb, #0 + bne _06000988 + bl __VENEER_OS_ExitThread + b _06001AD4 +_06000988: + ldrh r1, [sb, #0xc] + and r0, r1, #0xff00 + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x10 + and r1, r1, #0xff + cmpne r0, #0x100 + bne _06001ABC + tst r1, #0x80 + beq _06001ABC + ldr r0, _060017D8 ; =wmspW + 0x1000 + ldr r1, [r0, #0x54c] + cmp r1, #0 + ldrne r8, [r0, #0x550] + ldrneh r3, [r8] + cmpne r3, #1 + beq _06000960 + ldrh r2, [sb, #0xc] + ldr r1, _060017DC ; =0x00000182 + cmp r2, r1 + bgt _06000A24 + bge _060010DC + cmp r2, #0x8d + bgt _06000A18 + subs r0, r2, #0x84 + addpl pc, pc, r0, lsl #2 + b _06001AB0 +_060009F0: ; jump table + b _06000A50 ; case 0 + b _06000A74 ; case 1 + b _06000D00 ; case 2 + b _06000E64 ; case 3 + b _06000E88 ; case 4 + b _06001AB0 ; case 5 + b _06001AB0 ; case 6 + b _06000EAC ; case 7 + b _06000EDC ; case 8 + b _06000F0C ; case 9 +_06000A18: + cmp r2, #0x180 + beq _06001024 + b _06001AB0 +_06000A24: + add r0, r1, #3 + cmp r2, r0 + bgt _06000A40 + bge _06001754 + cmp r2, #0x184 + beq _060013D4 + b _06001AB0 +_06000A40: + add r0, r1, #4 + cmp r2, r0 + beq _060019B8 + b _06001AB0 +_06000A50: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x13 + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000A74: + cmp r3, #7 + cmpne r3, #9 + bne _06000BFC + add r1, sp, #0x1c + add r0, sb, #0x10 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + mov r6, #0 + mov r5, r6 + add r4, r8, #0x100 + mov sl, #1 + b _06000B74 +_06000AA4: + bl __VENEER_OS_DisableInterrupts + ldrh r2, [r4, #0x82] + add r1, r5, #1 + mov r7, r0 + tst r2, sl, lsl r1 + beq _06000B68 + mov r0, #6 + mul r2, r5, r0 + add r0, r8, r2 + ldrb fp, [sp, #0x1c] + ldrb r3, [r0, #0x128] + cmp fp, r3 + ldreqb fp, [sp, #0x1d] + ldreqb r3, [r0, #0x129] + cmpeq fp, r3 + ldreqb fp, [sp, #0x1e] + ldreqb r3, [r0, #0x12a] + cmpeq fp, r3 + ldreqb fp, [sp, #0x1f] + ldreqb r3, [r0, #0x12b] + cmpeq fp, r3 + ldreqb fp, [sp, #0x20] + ldreqb r3, [r0, #0x12c] + cmpeq fp, r3 + ldreqb r3, [sp, #0x21] + ldreqb r0, [r0, #0x12d] + cmpeq r3, r0 + bne _06000B68 + add r3, r8, #0x100 + mov r0, r1, lsl #0x10 + mov r6, r0, lsr #0x10 + ldrh r0, [r3, #0x82] + mvn r1, sl, lsl r6 + and r0, r0, r1 + strh r0, [r3, #0x82] + ldrh r0, [r8, #0x86] + add r3, r8, r6, lsl #3 + and r1, r0, r1 + add r0, r8, #0x128 + strh r1, [r8, #0x86] + mov r1, #0 + str r1, [r3, #0x738] + add r0, r0, r2 + mov r2, #6 + str r1, [r3, #0x73c] + bl __VENEER_MI_CpuFill8 + mov r0, r7 + bl __VENEER_OS_RestoreInterrupts + b _06000B7C +_06000B68: + mov r0, r7 + bl __VENEER_OS_RestoreInterrupts + add r5, r5, #1 +_06000B74: + cmp r5, #0xf + blt _06000AA4 +_06000B7C: + cmp r6, #0 + beq _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #8 + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #9 + strh r0, [r4, #8] + ldrh r1, [sb, #0x16] + add r0, sb, #0x10 + strh r1, [r4, #0x12] + strh r6, [r4, #0x10] + add r1, r4, #0xa + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [r8, #0x30] + mov r0, r4 + strh r1, [r4, #0x2c] + ldrh r1, [r8, #0x32] + strh r1, [r4, #0x2e] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldr r0, [r8, #0xc] + cmp r0, #1 + bne _06001AB0 + mov r0, #1 + mov r0, r0, lsl r6 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_CleanSendQueue + b _06001AB0 +_06000BFC: + mov r5, #0 + bl __VENEER_OS_DisableInterrupts + add r1, r8, #0x100 + ldrh r1, [r1, #0x82] + mov r4, r0 + cmp r1, #0 + bne _06000C20 + bl __VENEER_OS_RestoreInterrupts + b _06001AB0 +_06000C20: + ldr r0, [r8, #0xc] + cmp r0, #1 + bne _06000C40 + mov r0, r5 + str r0, [r8, #0xc] + mov r5, #1 + bl WMSP_CancelVAlarm + bl WMSP_SetThreadPriorityLow +_06000C40: + add r0, r8, #0x100 + mov r1, #0 + strh r1, [r0, #0x82] + strh r1, [r8, #0x86] + str r1, [r8, #0x14] + str r1, [r8, #0x10] + str r1, [r8, #0x1c] + str r1, [r8, #0x198] + strh r1, [r0, #0x96] + add r0, r8, #0x19c + mov r2, #0x50 + bl __VENEER_MI_CpuFill8 + bl WMSP_ResetSizeVars + mov r0, #0 + strh r0, [r8, #0xc2] + mov r1, #3 + mov r0, r4 + strh r1, [r8] + bl __VENEER_OS_RestoreInterrupts + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0xc + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #9 + strh r0, [r4, #8] + ldrh r1, [sb, #0x16] + add r0, r8, #0x100 + strh r1, [r4, #0xc] + ldrh r1, [r0, #0x88] + add r0, r8, #0x8a + strh r1, [r4, #0xa] + add r0, r0, #0x100 + add r1, r4, #0x10 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [r8, #0x30] + mov r0, r4 + strh r1, [r4, #0x16] + ldrh r1, [r8, #0x32] + strh r1, [r4, #0x18] + bl __VENEER_WMSP_ReturnResult2Wm9 + cmp r5, #0 + beq _06001AB0 + mov r0, #1 + bl WMSP_CleanSendQueue + b _06001AB0 +_06000D00: + ldrh r5, [sb, #0x16] + cmp r5, #0 + beq _06001AB0 + cmp r5, #0x10 + bhs _06001AB0 + ldrh r0, [r8, #0xf6] + cmp r0, #0 + bne _06000D8C + bl WMSP_GetInternalRequestBuf + movs r4, r0 + moveq r0, #0 + beq _06000D58 + mov r3, #0x22 + add r0, sb, #0x10 + add r1, r4, #4 + mov r2, #6 + str r3, [r4] + bl __VENEER_MI_CpuCopy8 + ldr r0, _060017E0 ; =wmspW + 0x88 + mov r1, r4 + mov r2, #0 + bl __VENEER_OS_SendMessage +_06000D58: + cmp r0, #0 + bne _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x22 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000D8C: + bl __VENEER_OS_DisableInterrupts + add r1, r8, #0x100 + mov r4, #1 + ldrh r3, [r1, #0x82] + mvn r2, r4, lsl r5 + orr r3, r3, r4, lsl r5 + strh r3, [r1, #0x82] + ldrh r1, [r8, #0x86] + mov r4, r0 + and r0, r1, r2 + strh r0, [r8, #0x86] + bl __VENEER_OS_GetTick + orr r2, r0, #1 + add r0, r8, r5, lsl #3 + add r3, r8, #0x128 + str r2, [r0, #0x738] + orr r1, r1, #0 + str r1, [r0, #0x73c] + sub r0, r5, #1 + mov r2, #6 + mla r1, r0, r2, r3 + add r0, sb, #0x10 + bl __VENEER_MI_CpuCopy8 + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + mov r0, #1 + add r1, r8, #0x1f8 + add r1, r1, r5, lsl #4 + mov r2, #0x10 + bl __VENEER_MIi_CpuClear16 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #8 + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #7 + strh r0, [r4, #8] + add r0, sb, #0x10 + add r1, r4, #0xa + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + strh r5, [r4, #0x10] + add r0, sb, #0x22 + add r1, r4, #0x14 + mov r2, #0x18 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r8, #0x30] + mov r0, r4 + strh r1, [r4, #0x2c] + ldrh r1, [r8, #0x32] + strh r1, [r4, #0x2e] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000E64: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x12 + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000E88: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x11 + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000EAC: + ldrh r0, [r8, #0xc2] + cmp r0, #0 + beq _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #8 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000EDC: + ldrh r0, [r8, #0xc2] + cmp r0, #0 + beq _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #8 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #2 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000F0C: + ldrb r0, [sb, #0x1f] + bl WMSP_GetRssi8_06001B5C + ldr r2, _060017E4 ; =0x027FFF98 + ldrh r1, [r2] + eor r0, r0, r1, lsl #1 + eor r0, r0, r0, lsr #16 + strh r0, [r2] + ldrh r0, [r8] + cmp r0, #8 + cmpne r0, #0xa + bne _06001AB0 + ldrh r1, [r8, #0xba] + ldrh r0, [sb, #0x44] + cmp r1, r0 + beq _06000FB0 + bl WMSP_GetInternalRequestBuf + movs r1, r0 + moveq r0, #0 + beq _06000F7C + mov r0, #0x25 + str r0, [r1] + mov r0, #1 + ldr r3, _060017E8 ; =0x00008002 + str r0, [r1, #4] + ldr r0, _060017E0 ; =wmspW + 0x88 + mov r2, #0 + str r3, [r1, #8] + bl __VENEER_OS_SendMessage +_06000F7C: + cmp r0, #0 + bne _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x25 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06000FB0: + ldr r0, _060017D8 ; =wmspW + 0x1000 + ldr r0, [r0, #0x550] + ldrh r0, [r0, #0xc2] + cmp r0, #0 + beq _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0x80 + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #0x10 + strh r0, [r4, #4] + ldrh r0, [sb, #0x44] + strh r0, [r4, #6] + ldrh r0, [r8] + strh r0, [r4, #8] + ldrh r0, [sb, #0x16] + strh r0, [r4, #0xa] + cmp r0, #0x80 + bhi _06001018 + add r2, r0, #1 + add r0, sb, #0x3c + add r1, r4, #0xc + bic r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_06001018: + mov r0, r4 + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06001024: + ldr r0, [r8, #0x10] + cmp r0, #0 + beq _06001AB0 + ldrb r0, [sb, #0x1f] + bl WMSP_GetRssi8_06001B5C + bl WMSP_AddRssiToList + bl WMSP_GetAverageLinkLevel + strh r0, [r8, #0xbc] + add r0, sb, #0x2e + bl WMSP_CheckMacAddress + cmp r0, #1 + beq _06001AB0 + ldrh r1, [sb, #0x16] + ldr r0, _060017EC ; =0x000005E4 + cmp r1, r0 + bhi _06001AB0 + ldrh r1, [r8, #0xae] + add r0, sb, #0x10 + eor r1, r1, #1 + strh r1, [r8, #0xae] + ldrh r2, [r8, #0xae] + ldrh r1, [sb, #0x16] + add r2, r8, r2, lsl #2 + ldr r4, [r2, #0xb0] + add r2, r1, #0x2d + mov r1, r4 + bic r2, r2, #1 + bl __VENEER_MI_CpuCopy8 + add r0, sb, #0x28 + add r1, r4, #0x18 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, sb, #0x2e + add r1, r4, #0x1e + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x11 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0xf + strh r1, [r0, #4] + str r4, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_060010DC: + ldrb r0, [sb, #0x1f] + bl WMSP_GetRssi8_06001B5C + ldrh r1, [r8, #0xbe] + cmp r1, r0 + strhih r0, [r8, #0xbe] + ldr r0, [r8, #0xc] + cmp r0, #0 + beq _06001AB0 + ldrh r0, [r8, #0x60] + cmp r0, #1 + moveq r0, #0 + streqh r0, [r8, #0x60] + ldrh r0, [r8, #0x70] + ldrh sl, [r8, #0x8e] + eor r0, r0, #1 + strh r0, [r8, #0x70] + ldrh r0, [r8, #0x70] + ldrh r1, [sb, #0x16] + add r3, r8, r0, lsl #2 + ldrh r0, [r8, #0x72] + add r2, r1, #0x30 + ldr r4, [r3, #0x74] + cmp r0, r2 + movlo r2, r0 + mov r1, r4 + add r0, sb, #0x10 + bl __VENEER_MI_CpuCopy8 + bl __VENEER_OS_DisableInterrupts + ldrh r1, [r8, #0x84] + mov fp, r0 + cmp r1, #1 + mov r5, #0 + bne _0600116C + ldr r0, _060017F0 ; =wmspMPAckAlarm + mov r5, #1 + bl __VENEER_OS_CancelAlarm +_0600116C: + mov r7, #1 + strh r7, [r8, #0x84] + ldrh r0, [r4, #0xa] + ldr r2, _060017F4 ; =0x000082EA + strh r0, [r8, #0x82] + ldrh r6, [sb, #0x18] + mov r0, #0 + tst r6, #0x2000 + moveq r7, #0 + strh r7, [r8, #0x90] + str r0, [sp] + ldrh r1, [r4, #0xa] + ldrh r0, [r4, #0xc] + sub r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add r0, r0, #0x80 + mov r3, r0, lsl #4 + umull r1, r0, r3, r2 + mov r3, r3, asr #0x1f + mla r0, r3, r2, r0 + mov r1, r1, lsr #6 + orr r1, r1, r0, lsl #26 + mov r3, r0, lsr #6 + mov r1, r1, lsr #0xa + ldr r0, _060017F0 ; =wmspMPAckAlarm + mov r2, r3, lsr #0xa + orr r1, r1, r3, lsl #22 + ldr r3, _060017F8 ; =WmspMaMultiPollAckAlarmCallback + bl __VENEER_OS_SetAlarm + and r0, r6, #0x2800 + cmp r0, #0x2800 + moveq r1, #1 + and r0, r6, #0x6000 + movne r1, #0 + cmp r0, #0x6000 + moveq r2, #1 + movne r2, #0 + cmp r2, #0 + movne r0, #0 + strneh r0, [r8, #0x8a] + cmp r1, #0 + movne r0, #1 + moveq r0, #0 + strh r0, [r8, #0x8e] + cmp r2, #0 + movne r0, #1 + moveq r0, #0 + strh r0, [r8, #0x8c] + cmp r7, #0 + beq _06001274 + ldrh r0, [r4, #0x2c] + sub r1, r0, #0x66 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r0, r0, asr #2 + subs r1, r0, #0x20 + bmi _06001274 + ldrh r0, [r8, #0x32] + cmp r1, #0x200 + movgt r1, #0x200 + cmp r1, r0 + beq _06001274 + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SetChildSize +_06001274: + mov r0, fp + bl __VENEER_OS_RestoreInterrupts + cmp r5, #0 + beq _060012C0 + cmp sl, #1 + bne _06001298 + mov r0, r5 + mov r1, #0 + bl WMSP_FlushSendQueue +_06001298: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + mov r1, #9 + strh r1, [r0, #2] + mov r1, #0xd + strh r1, [r0, #4] + mov r1, #0 + str r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060012C0: + cmp r7, #0 + bne _060012EC + ldrh r0, [r4, #6] + cmp r0, #2 + blo _06001AB0 + ldrh r0, [r4, #0x30] + tst r0, #0x8000 + movne r0, #1 + moveq r0, #0 + strh r0, [r8, #0x5e] + b _06001AB0 +_060012EC: + add r0, sb, #0x28 + add r1, r4, #0x18 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, sb, #0x2e + add r1, r4, #0x1e + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [r4, #6] + cmp r0, #2 + blo _0600137C + sub r0, r0, #2 + strh r0, [r4, #6] + ldrh r0, [r4, #0x30] + tst r0, #0x8000 + movne r0, #1 + moveq r0, #0 + strh r0, [r8, #0x5e] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0xc + strh r1, [r0, #4] + str r4, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldrh r3, [r4, #6] + cmp r3, #0 + beq _060013A8 + str r4, [sp] + ldrh r1, [r4, #0x30] + add r2, r4, #0x32 + mov r0, #0 + bl WMSP_ParsePortPacket + b _060013A8 +_0600137C: + mov r0, #0 + strh r0, [r4, #6] + strh r0, [r8, #0x5e] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + strh r1, [r0, #2] + mov r1, #0xc + strh r1, [r0, #4] + str r4, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060013A8: + ldr r0, [r8, #0x7bc] + ldr r1, [r8, #0x7b8] + cmp r0, #0 + cmpeq r1, #0 + beq _06001AB0 + bl __VENEER_OS_GetTick + orr r0, r0, #1 + str r0, [r8, #0x738] + orr r0, r1, #0 + str r0, [r8, #0x73c] + b _06001AB0 +_060013D4: + ldr r1, [r8, #0xc] + mov r0, #0 + str r0, [sp, #0x10] + cmp r1, #0 + beq _06001AB0 + ldrh r0, [sb, #0x12] + cmp r0, #0 + bne _0600140C + ldrh r1, [r8, #0x66] + cmp r1, #1 + bne _06001414 + ldrh r0, [sb, #0x10] + cmp r0, #0 + beq _06001414 +_0600140C: + bl WMSP_RequestResumeMP + b _06001AB0 +_06001414: + cmp r1, #0 + movne r0, #0 + strneh r0, [r8, #0x66] + ldrh r1, [sb, #0x16] + ldrh r0, [sb, #0x14] + ldrh r3, [r8, #0x70] + mul r2, r1, r0 + add r1, r8, r3, lsl #2 + ldr r6, [r1, #0x74] + ldrh r0, [r8, #0x72] + add r2, r2, #0xa + cmp r0, r2 + movlo r2, r0 + mov r1, r6 + add r0, sb, #0x10 + bl __VENEER_MI_CpuCopy8 + ldr r0, _060017D8 ; =wmspW + 0x1000 + ldrh r1, [r6] + ldr r7, [r0, #0x550] + cmp r1, #0 + ldrh r4, [r7, #0xbe] + bne _060014B0 + ldrh r0, [sb, #0x14] + cmp r0, #1 + blo _060014B0 + add sl, sb, #0x1a + mov r5, #0 + b _060014A0 +_06001484: + ldrh r1, [sb, #0x16] + mla r0, r1, r5, sl + ldrb r0, [r0, #3] + bl WMSP_GetRssi8_06001B5C + cmp r0, r4 + movlo r4, r0 + add r5, r5, #1 +_060014A0: + ldrh r0, [sb, #0x14] + cmp r5, r0 + blt _06001484 + strh r4, [r7, #0xbe] +_060014B0: + bl __VENEER_OS_GetTick + orr r0, r0, #1 + str r0, [sp, #8] + ldrh fp, [r6] + mov r0, #0 + str r0, [sp, #0x14] + ldr r0, _060017FC ; =0x00008001 + orr r1, r1, #0 + rsb r0, r0, #0x18000 + mov r4, #0 + str r1, [sp, #0xc] + add sl, r6, #0xa + str r0, [sp, #0x18] + mov r5, r4 + b _0600165C +_060014EC: + ldrh r7, [sl, #4] + ldrh r1, [sl] + cmp r7, #1 + blo _06001640 + cmp r7, #0xf + bhi _06001640 + cmp r1, #2 + blo _06001568 + ldr r0, [sp, #0x18] + cmp r1, r0 + beq _06001568 + sub r0, r1, #2 + mov r0, r0, lsl #0x10 + movs r3, r0, lsr #0x10 + strh r3, [sl] + ldrh r2, [r8, #0x86] + mov r1, #1 + orr r1, r2, r1, lsl r7 + strh r1, [r8, #0x86] + ldr r1, [sp, #8] + add r0, r8, r7, lsl #3 + str r1, [r0, #0x738] + ldr r1, [sp, #0xc] + str r1, [r0, #0x73c] + beq _06001640 + mov r0, r7 + str r6, [sp] + ldrh r1, [sl, #8] + add r2, sl, #0xa + bl WMSP_ParsePortPacket + b _06001640 +_06001568: + cmp r1, #0 + bne _06001640 + add r0, r8, r7, lsl #3 + ldr r2, [r0, #0x738] + ldr r1, [r0, #0x73c] + mov r0, #1 + mov r0, r0, lsl r7 + str r0, [sp, #4] + mov r0, #1 + orr fp, fp, r0, lsl r7 + ldr ip, [r8, #0x7bc] + ldr r0, [r8, #0x7b8] + cmp ip, #0 + mov r3, #0 + cmpeq r0, r5 + beq _06001640 + cmp r1, r3 + cmpeq r2, r4 + beq _06001640 + ldr r3, [sp, #8] + subs r3, r3, r2 + ldr r2, [sp, #0xc] + sbc r1, r2, r1 + cmp r1, ip + cmpeq r3, r0 + bls _06001640 + bl WMSP_GetInternalRequestBuf + movs r1, r0 + add r2, r8, r7, lsl #3 + mov r0, #0 + str r0, [r2, #0x738] + str r0, [r2, #0x73c] + beq _06001610 + mov r0, #0x25 + str r0, [r1] + ldr r0, [sp, #4] + mov r2, #0 + str r0, [r1, #4] + ldr r0, _060017FC ; =0x00008001 + str r0, [r1, #8] + ldr r0, _060017E0 ; =wmspW + 0x88 + bl __VENEER_OS_SendMessage +_06001610: + cmp r0, #0 + bne _06001640 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x25 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001640: + ldr r0, [sp, #0x14] + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [sp, #0x14] + ldrh r0, [r6, #6] + add sl, sl, r0 +_0600165C: + ldrh r1, [r6, #4] + ldr r0, [sp, #0x14] + cmp r0, r1 + blo _060014EC + mov r0, fp, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, #0 + bl WMSP_FlushSendQueue + ldrh r0, [r6] + cmp r0, #0 + movne r0, #1 + strne r0, [sp, #0x10] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0xb + strh r1, [r0, #4] + str r6, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldrh r0, [r8, #0x70] + eor r0, r0, #1 + strh r0, [r8, #0x70] + bl __VENEER_OS_DisableInterrupts + ldr r1, [sp, #0x10] + cmp r1, #0 + ldreqsh r1, [r8, #0x62] + subeq r1, r1, #1 + streqh r1, [r8, #0x62] + ldrsh r1, [r8, #0x64] + cmp r1, #0 + subgt r1, r1, #1 + strgth r1, [r8, #0x64] + ldrsh r1, [r8, #0x62] + cmp r1, #0 + ldrgtsh r1, [r8, #0x64] + cmpgt r1, #0 + movgt r4, #1 + movle r4, #0 + bl __VENEER_OS_RestoreInterrupts + cmp r4, #0 + beq _06001AB0 + ldr r0, [sp, #0x10] + cmp r0, #1 + ldreqh r4, [sb, #0x10] + ldrh r0, [r8, #0x44] + ldrne r4, _06001800 ; =0x0000FFFF + cmp r0, #0 + beq _06001748 + ldr r0, _06001804 ; =wmspMPIntervalAlarm + bl __VENEER_OS_CancelAlarm + str r4, [sp] + ldr r1, [r8, #0x48] + ldr r2, [r8, #0x4c] + ldr r0, _06001804 ; =wmspMPIntervalAlarm + ldr r3, _06001808 ; =WmspMPParentIntervalAlarmCallback + bl __VENEER_OS_SetAlarm + b _06001AB0 +_06001748: + mov r0, r4 + bl WmspKickMPParent + b _06001AB0 +_06001754: + ldr r0, [r8, #0xc] + mov r5, #0 + cmp r0, #0 + beq _06001AB0 + ldrh r0, [sb, #0xe] + cmp r0, #0 + bne _060017B4 + ldr r1, _0600180C ; =0x048080F8 + mov r4, #1 + ldrh r0, [r1] + ldrh r3, [r1, #2] + ldrh r2, [r1] + cmp r0, r2 + ldrhih r3, [r1, #2] + mov r0, r2, asr #4 + orr r0, r0, r3, lsl #12 + ldrh r1, [r8, #0x82] + mov r0, r0, lsl #0x10 + rsb r0, r1, r0, lsr #16 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + cmp r0, #0 + ble _06001AB0 + b _060017B8 +_060017B4: + mov r4, r5 +_060017B8: + bl __VENEER_OS_DisableInterrupts + ldrh r1, [r8, #0x84] + mov r7, r0 + cmp r1, #0 + bne _06001810 + bl __VENEER_OS_RestoreInterrupts + b _06001AB0 + .align 2, 0 +_060017D4: .word wmspW +_060017D8: .word wmspW + 0x1000 +_060017DC: .word 0x00000182 +_060017E0: .word wmspW + 0x88 +_060017E4: .word 0x027FFF98 +_060017E8: .word 0x00008002 +_060017EC: .word 0x000005E4 +_060017F0: .word wmspMPAckAlarm +_060017F4: .word 0x000082EA +_060017F8: .word WmspMaMultiPollAckAlarmCallback +_060017FC: .word 0x00008001 +_06001800: .word 0x0000FFFF +_06001804: .word wmspMPIntervalAlarm +_06001808: .word WmspMPParentIntervalAlarmCallback +_0600180C: .word 0x048080F8 +_06001810: + ldr r0, _060017F0 ; =wmspMPAckAlarm + mov r1, #0 + strh r1, [r8, #0x84] + ldrh r6, [r8, #0x90] + bl __VENEER_OS_CancelAlarm + mov r0, r7 + bl __VENEER_OS_RestoreInterrupts + ldrh r3, [r8, #0x8c] + mov r2, #1 + cmp r3, #0 + beq _0600185C + cmp r4, #0 + bne _06001858 + add r0, r8, #0x100 + ldrh r1, [sb, #0x3e] + ldrh r0, [r0, #0x88] + tst r1, r2, lsl r0 + bne _0600185C +_06001858: + mov r2, #0 +_0600185C: + cmp r3, #0 + movne r0, #0 + strneh r0, [r8, #0x8c] + ldrh r0, [r8, #0x8e] + cmp r0, #0 + beq _06001898 + mov r0, #0 + strh r0, [r8, #0x8e] + cmp r2, #0 + movne r0, #1 + mov r1, r0, lsl #0x10 + mov r0, r4 + mov r1, r1, lsr #0x10 + bl WMSP_FlushSendQueue + mov r5, r0 +_06001898: + cmp r6, #0 + beq _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r7, r0 + mov r0, #0xe + strh r0, [r7] + cmp r4, #0 + movne r0, #9 + strneh r0, [r7, #2] + bne _060018E4 + add r0, r8, #0x100 + ldrh r2, [sb, #0x3e] + ldrh r0, [r0, #0x88] + mov r1, #1 + tst r2, r1, lsl r0 + movne r0, #0xf + strneh r0, [r7, #2] + moveq r0, #0 + streqh r0, [r7, #2] +_060018E4: + mov r0, #0xd + strh r0, [r7, #4] + mov r0, #0 + str r0, [r7, #8] + cmp r4, #0 + bne _06001944 + ldrh r1, [sb, #0x1c] + add r0, sb, #0x28 + strh r1, [r7, #0xc] + ldrh r2, [sb, #0x1e] + add r1, r7, #0x10 + strh r2, [r7, #0xe] + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, sb, #0x2e + add r1, r7, #0x16 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [sb, #0x3a] + strh r0, [r7, #0x1c] + ldrh r0, [sb, #0x3c] + strh r0, [r7, #0x1e] + ldrh r0, [sb, #0x3e] + strh r0, [r7, #0x20] +_06001944: + mov r0, r7 + bl __VENEER_WMSP_ReturnResult2Wm9 + cmp r6, #0 + beq _06001AB0 + cmp r5, #1 + ldrneh r0, [r8, #0x5e] + cmpne r0, #0 + bne _060019A0 + ldrh r0, [r8, #0x46] + cmp r0, #0 + beq _06001998 + ldr r0, _06001804 ; =wmspMPIntervalAlarm + bl __VENEER_OS_CancelAlarm + mov r0, #0 + str r0, [sp] + ldr r1, [r8, #0x50] + ldr r2, [r8, #0x54] + ldr r0, _06001804 ; =wmspMPIntervalAlarm + ldr r3, _06001AE0 ; =WmspMPChildIntervalAlarmCallback + bl __VENEER_OS_SetAlarm + b _06001AB0 +_06001998: + bl WmspKickMPChild + b _06001AB0 +_060019A0: + mov r1, #0 + strh r1, [r8, #0x5e] + mov r0, #1 + strh r0, [r8, #0x60] + strh r1, [r8, #0x88] + b _06001AB0 +_060019B8: + add r0, r8, #0x700 + ldrh r0, [r0, #0xcc] + cmp r0, #1 + ldreqh r0, [sb, #0x10] + cmpeq r0, #0x20 + bne _06001A2C + bl __VENEER_OS_DisableInterrupts + mov r4, r0 + ldr r0, _060017F0 ; =wmspMPAckAlarm + bl __VENEER_OS_CancelAlarm + mov r1, #0 + mov r0, r4 + strh r1, [r8, #0x84] + bl __VENEER_OS_RestoreInterrupts + mov r1, #0 + strh r1, [r8, #0x8a] + mov r0, #1 + bl WMSP_FlushSendQueue + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x17 + strh r1, [r0, #4] + mov r1, #1 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06001AB0 +_06001A2C: + bl WMSP_GetInternalRequestBuf + movs r1, r0 + moveq r0, #0 + beq _06001A80 + ldr r0, _06001AE4 ; =0x00008003 + mov r2, #0x25 + str r2, [r1] + str r0, [r1, #8] + ldrh r0, [r8] + cmp r0, #9 + cmpne r0, #7 + ldreq r0, _06001AE8 ; =0x00007FFE + streq r0, [r1, #4] + beq _06001A74 + cmp r0, #0xa + cmpne r0, #8 + moveq r0, #1 + streq r0, [r1, #4] +_06001A74: + ldr r0, _060017E0 ; =wmspW + 0x88 + mov r2, #0 + bl __VENEER_OS_SendMessage +_06001A80: + cmp r0, #0 + bne _06001AB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x25 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001AB0: + mov r0, sb + bl WmspFreeBufOfWL + b _06000960 +_06001ABC: + ldr r0, _060017D4 ; =wmspW + mov r1, sb + add r0, r0, #0x58 + mov r2, #1 + bl __VENEER_OS_SendMessage + b _06000960 +_06001AD4: + add sp, sp, #0x28 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06001AE0: .word WmspMPChildIntervalAlarmCallback +_06001AE4: .word 0x00008003 +_06001AE8: .word 0x00007FFE + arm_func_end WMSP_IndicateThread + + arm_func_start __VENEER_OS_ExitThread +__VENEER_OS_ExitThread: ; 0x06001AEC + ldr pc, _06001AF0 ; =OS_ExitThread + .align 2, 0 +_06001AF0: .word OS_ExitThread + arm_func_end __VENEER_OS_ExitThread + + arm_func_start __VENEER_MI_CpuFill8 +__VENEER_MI_CpuFill8: ; 0x06001AF4 + ldr pc, _06001AF8 ; =MI_CpuFill8 + .align 2, 0 +_06001AF8: .word MI_CpuFill8 + arm_func_end __VENEER_MI_CpuFill8 + + arm_func_start __VENEER_OS_GetTick +__VENEER_OS_GetTick: ; 0x06001AFC + ldr pc, _06001B00 ; =OS_GetTick + .align 2, 0 +_06001B00: .word OS_GetTick + arm_func_end __VENEER_OS_GetTick + + arm_func_start __VENEER_MIi_CpuCopy16 +__VENEER_MIi_CpuCopy16: ; 0x06001B04 + ldr pc, _06001B08 ; =MIi_CpuCopy16 + .align 2, 0 +_06001B08: .word MIi_CpuCopy16 + arm_func_end __VENEER_MIi_CpuCopy16 + + arm_func_start __VENEER_OS_CancelAlarm +__VENEER_OS_CancelAlarm: ; 0x06001B0C + ldr pc, _06001B10 ; =OS_CancelAlarm + .align 2, 0 +_06001B10: .word OS_CancelAlarm + arm_func_end __VENEER_OS_CancelAlarm + + arm_func_start __VENEER_OS_SetAlarm +__VENEER_OS_SetAlarm: ; 0x06001B14 + ldr pc, _06001B18 ; =OS_SetAlarm + .align 2, 0 +_06001B18: .word OS_SetAlarm + arm_func_end __VENEER_OS_SetAlarm + + arm_func_start WmspFreeBufOfWL +WmspFreeBufOfWL: ; 0x06001B1C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl __VENEER_OS_DisableInterrupts + ldr r1, _06001B50 ; =wmspW + 0x1000 + mov r4, r0 + ldr r0, [r1, #0x544] + ldr r1, [r1, #0x548] + mov r2, r5 + bl __VENEER_OS_FreeToHeap + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06001B50: .word wmspW + 0x1000 + arm_func_end WmspFreeBufOfWL + + arm_func_start __VENEER_OS_FreeToHeap +__VENEER_OS_FreeToHeap: ; 0x06001B54 + ldr pc, _06001B58 ; =OS_FreeToHeap + .align 2, 0 +_06001B58: .word OS_FreeToHeap + arm_func_end __VENEER_OS_FreeToHeap + + arm_func_start WMSP_GetRssi8_06001B5C +WMSP_GetRssi8_06001B5C: ; 0x06001B5C + tst r0, #2 + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + and r0, r0, #0xff + bx lr + arm_func_end WMSP_GetRssi8_06001B5C + + arm_func_start WMSP_RequestResumeMP +WMSP_RequestResumeMP: ; 0x06001B70 + stmdb sp!, {r4, lr} + ldr r0, _06001BE8 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + bl WMSP_GetInternalRequestBuf + movs r1, r0 + moveq r0, #0 + beq _06001BA8 + mov r0, #0x2d + str r0, [r1] + ldrh r3, [r4, #0x68] + ldr r0, _06001BEC ; =wmspW + 0x88 + mov r2, #0 + str r3, [r1, #4] + bl __VENEER_OS_SendMessage +_06001BA8: + cmp r0, #0 + movne r0, #1 + strneh r0, [r4, #0x66] + bne _06001BE0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x2d + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001BE0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06001BE8: .word wmspW + 0x1000 +_06001BEC: .word wmspW + 0x88 + arm_func_end WMSP_RequestResumeMP + + arm_func_start WmspMPParentIntervalAlarmCallback +WmspMPParentIntervalAlarmCallback: ; 0x06001BF0 + ldr ip, _06001C00 ; =WmspKickMPParent + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bx ip + .align 2, 0 +_06001C00: .word WmspKickMPParent + arm_func_end WmspMPParentIntervalAlarmCallback + + arm_func_start WmspKickMPParent +WmspKickMPParent: ; 0x06001C04 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl WMSP_GetInternalRequestBuf + movs r1, r0 + ldr r4, _06001C80 ; =wmspW + moveq r0, #0 + beq _06001C38 + mov r0, #0x2b + str r0, [r1] + add r0, r4, #0x88 + mov r2, #0 + str r5, [r1, #4] + bl __VENEER_OS_SendMessage +_06001C38: + cmp r0, #0 + bne _06001C78 + add r0, r4, #0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + beq _06001C78 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x2b + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001C78: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06001C80: .word wmspW + arm_func_end WmspKickMPParent + + arm_func_start WmspMaMultiPollAckAlarmCallback +WmspMaMultiPollAckAlarmCallback: ; 0x06001C84 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06001D0C ; =wmspW + 0x1000 + mov r2, #0x40 + ldr r0, [r1, #0x544] + ldr r1, [r1, #0x548] + ldr r5, _06001D10 ; =wmspW + bl __VENEER_OS_AllocFromHeap + mov r4, r0 + ldr r1, _06001D14 ; =0x00000185 + ldr r0, _06001D18 ; =wmspW + 0x28 + strh r1, [r4, #0xc] + mov r2, #0 + mov r1, r4 + strh r2, [r4, #0xe] + bl __VENEER_OS_SendMessage + cmp r0, #0 + bne _06001D04 + mov r0, r4 + bl WmspFreeBufOfWL + add r0, r5, #0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + beq _06001D04 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x80 + strh r2, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + strh r2, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001D04: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06001D0C: .word wmspW + 0x1000 +_06001D10: .word wmspW +_06001D14: .word 0x00000185 +_06001D18: .word wmspW + 0x28 + arm_func_end WmspMaMultiPollAckAlarmCallback + + arm_func_start __VENEER_OS_AllocFromHeap +__VENEER_OS_AllocFromHeap: ; 0x06001D1C + ldr pc, _06001D20 ; =OS_AllocFromHeap + .align 2, 0 +_06001D20: .word OS_AllocFromHeap + arm_func_end __VENEER_OS_AllocFromHeap + + arm_func_start WmspMPChildIntervalAlarmCallback +WmspMPChildIntervalAlarmCallback: ; 0x06001D24 + ldr ip, _06001D2C ; =WmspKickMPChild + bx ip + .align 2, 0 +_06001D2C: .word WmspKickMPChild + arm_func_end WmspMPChildIntervalAlarmCallback + + arm_func_start WmspKickMPChild +WmspKickMPChild: ; 0x06001D30 + stmdb sp!, {r4, lr} + bl WMSP_GetInternalRequestBuf + ldr r2, _06001DB8 ; =wmspW + 0x1000 + movs r1, r0 + ldr r0, [r2, #0x550] + mov r2, #0 + strh r2, [r0, #0x5e] + strh r2, [r0, #0x60] + ldr r4, _06001DBC ; =wmspW + strh r2, [r0, #0x88] + beq _06001D70 + mov r3, #0x2c + add r0, r4, #0x88 + str r3, [r1] + bl __VENEER_OS_SendMessage + mov r2, r0 +_06001D70: + cmp r2, #0 + bne _06001DB0 + add r0, r4, #0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + beq _06001DB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x2c + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06001DB0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06001DB8: .word wmspW + 0x1000 +_06001DBC: .word wmspW + arm_func_end WmspKickMPChild + + arm_func_start WMSP_InitAlarm +WMSP_InitAlarm: ; 0x06001DC0 + stmdb sp!, {r3, lr} + ldr r0, _06001DDC ; =wmspMPIntervalAlarm + bl __VENEER_OS_CreateAlarm + ldr r0, _06001DE0 ; =wmspMPAckAlarm + bl __VENEER_OS_CreateAlarm + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06001DDC: .word wmspMPIntervalAlarm +_06001DE0: .word wmspMPAckAlarm + arm_func_end WMSP_InitAlarm + + arm_func_start __VENEER_OS_CreateAlarm +__VENEER_OS_CreateAlarm: ; 0x06001DE4 + ldr pc, _06001DE8 ; =OS_CreateAlarm + .align 2, 0 +_06001DE8: .word OS_CreateAlarm + arm_func_end __VENEER_OS_CreateAlarm + + arm_func_start WMSP_CancelAllAlarms +WMSP_CancelAllAlarms: ; 0x06001DEC + stmdb sp!, {r3, lr} + ldr r0, _06001E08 ; =wmspMPIntervalAlarm + bl __VENEER_OS_CancelAlarm + ldr r0, _06001E0C ; =wmspMPAckAlarm + bl __VENEER_OS_CancelAlarm + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06001E08: .word wmspMPIntervalAlarm +_06001E0C: .word wmspMPAckAlarm + arm_func_end WMSP_CancelAllAlarms + + arm_func_start WMSP_RequestThread +WMSP_RequestThread: ; 0x06001E10 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r0, _06001EA8 ; =wmspW + 0x1000 + mov r6, #1 + ldr r8, _06001EAC ; =wmspW + ldr sb, [r0, #0x550] + ldr r5, _06001EB0 ; =WmspRequestFuncTable + add r7, sp, #0 + mov r4, #0 + mov fp, r6 +_06001E34: + mov r1, r7 + mov r2, fp + add r0, r8, #0x88 + bl __VENEER_OS_ReceiveMessage + ldr r0, [sp] + cmp r0, #0 + bne _06001E58 + bl __VENEER_OS_ExitThread + b _06001EA0 +_06001E58: + ldrh sl, [r0] + tst sl, #0x8000 + bicne r0, sl, #0x8000 + movne r0, r0, lsl #0x10 + movne sl, r0, lsr #0x10 + cmp sl, #0x2e + bhs _06001E90 + str r6, [sb, #4] + strh sl, [sb, #2] + ldr r0, [sp] + ldr r1, [r5, sl, lsl #2] + mov lr, pc + bx r1 + str r4, [sb, #4] +_06001E90: + ldr r0, [sp] + orr r1, sl, #0x8000 + strh r1, [r0] + b _06001E34 +_06001EA0: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06001EA8: .word wmspW + 0x1000 +_06001EAC: .word wmspW +_06001EB0: .word WmspRequestFuncTable + arm_func_end WMSP_RequestThread + + arm_func_start WmspRequestFuncDummy +WmspRequestFuncDummy: ; 0x06001EB4 + bx lr + arm_func_end WmspRequestFuncDummy + + arm_func_start WMSP_WL_MlmeReset +WMSP_WL_MlmeReset: ; 0x06001EB8 + stmdb sp!, {r4, lr} + mov r2, #0 + strh r2, [r0] + strh r2, [r0, #2] + strh r2, [r0, #4] + strh r2, [r0, #6] + strh r2, [r0, #8] + strh r2, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_WL_MlmeReset + + arm_func_start WMSP_WL_MlmePowerManagement +WMSP_WL_MlmePowerManagement: ; 0x06001F0C + stmdb sp!, {r4, lr} + mov r4, #0 + strh r4, [r0] + strh r4, [r0, #2] + strh r4, [r0, #4] + strh r4, [r0, #6] + strh r4, [r0, #8] + strh r4, [r0, #0xa] + mov ip, #1 + strh ip, [r0, #0xc] + mov r4, #3 + strh r4, [r0, #0xe] + strh r1, [r0, #0x10] + strh r2, [r0, #0x12] + strh r3, [r0, #0x14] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh ip, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_WL_MlmePowerManagement + + arm_func_start WMSP_WL_MlmeScan +WMSP_WL_MlmeScan: ; 0x06001F6C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + strh r0, [r4, #0xa] + mov r5, #2 + mov r7, r1 + mov r0, r2 + strh r5, [r4, #0xc] + mov r5, #0x1f + add r1, r4, #0x10 + mov r2, #6 + mov r6, r3 + strh r5, [r4, #0xe] + bl __VENEER_MIi_CpuCopy16 + ldr r0, [sp, #0x18] + add r1, r4, #0x18 + mov r2, #0x20 + strh r6, [r4, #0x16] + bl __VENEER_MIi_CpuCopy16 + ldrh r2, [sp, #0x1c] + ldr r0, [sp, #0x20] + add r1, r4, #0x3a + strh r2, [r4, #0x38] + mov r2, #0x10 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [sp, #0x24] + mov r0, r7, lsr #1 + strh r1, [r4, #0x4a] + mov r1, #0 + strh r1, [r4, #0x4c] + ldrh r2, [r4, #0xe] + ldrh r1, [r4, #0xc] + add r5, r4, r2, lsl #1 + strh r1, [r5, #0x10] + sub r1, r0, #0x2c + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end WMSP_WL_MlmeScan + + arm_func_start WMSP_WL_MlmeJoin +WMSP_WL_MlmeJoin: ; 0x06002024 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r3, #0 + strh r3, [r4] + strh r3, [r4, #2] + strh r3, [r4, #4] + strh r3, [r4, #6] + strh r3, [r4, #8] + strh r3, [r4, #0xa] + mov r0, #3 + strh r0, [r4, #0xc] + mov r0, #0x22 + strh r0, [r4, #0xe] + strh r1, [r4, #0x10] + mov r0, r2 + strh r3, [r4, #0x12] + add r1, r4, #0x14 + mov r2, #0x44 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #5 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_WL_MlmeJoin + + arm_func_start WMSP_WL_MlmeAuthenticate +WMSP_WL_MlmeAuthenticate: ; 0x0600209C + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + strh r0, [r4, #0xa] + mov r0, #4 + strh r0, [r4, #0xc] + mov r5, #5 + mov r6, r2 + mov r0, r1 + strh r5, [r4, #0xe] + add r1, r4, #0x10 + mov r2, #6 + mov r5, r3 + bl __VENEER_MIi_CpuCopy16 + strh r6, [r4, #0x16] + strh r5, [r4, #0x18] + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #6 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end WMSP_WL_MlmeAuthenticate + + arm_func_start WMSP_WL_MlmeDeAuthenticate +WMSP_WL_MlmeDeAuthenticate: ; 0x0600211C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + strh r0, [r4, #0xa] + mov r0, #5 + strh r0, [r4, #0xc] + mov r3, #4 + mov r5, r2 + mov r0, r1 + strh r3, [r4, #0xe] + add r1, r4, #0x10 + mov r2, #6 + bl __VENEER_MIi_CpuCopy16 + strh r5, [r4, #0x16] + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #4 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_WL_MlmeDeAuthenticate + + arm_func_start WMSP_WL_MlmeAssociate +WMSP_WL_MlmeAssociate: ; 0x06002194 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + mov r6, r2 + strh r0, [r4, #0xa] + mov r2, #6 + mov r0, r1 + strh r2, [r4, #0xc] + mov r1, #5 + strh r1, [r4, #0xe] + add r1, r4, #0x10 + mov r5, r3 + bl __VENEER_MIi_CpuCopy16 + strh r6, [r4, #0x16] + strh r5, [r4, #0x18] + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #3 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end WMSP_WL_MlmeAssociate + + arm_func_start WMSP_WL_MlmeStart +WMSP_WL_MlmeStart: ; 0x06002210 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov ip, #0 + strh ip, [r4] + strh ip, [r4, #2] + strh ip, [r4, #4] + strh ip, [r4, #6] + ldrh r0, [sp, #0x20] + strh ip, [r4, #8] + add r0, r0, #1 + add r0, r0, r0, lsr #31 + mov r5, r0, asr #1 + mov r0, r2 + strh ip, [r4, #0xa] + mov r2, #9 + strh r2, [r4, #0xc] + add r2, r5, #0x17 + strh r2, [r4, #0xe] + strh r1, [r4, #0x10] + add r1, r4, #0x12 + mov r2, #0x20 + mov r5, r3 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [sp, #0x10] + strh r5, [r4, #0x32] + ldrh r0, [sp, #0x14] + strh r1, [r4, #0x34] + ldrh r1, [sp, #0x18] + strh r0, [r4, #0x36] + ldrh r0, [sp, #0x1c] + strh r1, [r4, #0x38] + ldrh r2, [sp, #0x20] + strh r0, [r4, #0x3a] + ldr r0, [sp, #0x24] + strh r2, [r4, #0x3c] + add r1, r4, #0x3e + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #1 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_WL_MlmeStart + + arm_func_start WMSP_WL_MlmeMeasureChannel +WMSP_WL_MlmeMeasureChannel: ; 0x060022D0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, #0 + strh r5, [r4] + strh r5, [r4, #2] + strh r5, [r4, #4] + strh r5, [r4, #6] + strh r5, [r4, #8] + strh r5, [r4, #0xa] + mov r0, #0xa + strh r0, [r4, #0xc] + mov r0, #0xc + strh r0, [r4, #0xe] + strh r5, [r4, #0x10] + strh r1, [r4, #0x12] + strh r2, [r4, #0x14] + ldr r0, [sp, #0x10] + strh r3, [r4, #0x16] + add r1, r4, #0x18 + mov r2, #0x10 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #0x12 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_WL_MlmeMeasureChannel + + arm_func_start WMSP_WL_MaData +WMSP_WL_MaData: ; 0x06002350 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + strh r0, [r4, #0xa] + mov r5, r1 + mov r0, #0x100 + strh r0, [r4, #0xc] + mov r1, #0x18 + mov r0, r5 + strh r1, [r4, #0xe] + add r1, r4, #0x10 + mov r2, #0x30 + bl __VENEER_MIi_CpuCopy16 + mov r0, #0 + strh r0, [r5, #2] + strh r0, [r5, #4] + strh r0, [r5, #8] + strh r0, [r5, #0xa] + strh r0, [r5, #0xc] + strh r0, [r5, #0x10] + strh r0, [r5, #0x12] + strh r0, [r5, #0x14] + strh r0, [r5, #0x16] + strh r0, [r5, #0x24] + strh r0, [r5, #0x26] + strh r0, [r5, #0x28] + strh r0, [r5, #0x2a] + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #2 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_WL_MaData + + arm_func_start WMSP_WL_MaKeyData +WMSP_WL_MaKeyData: ; 0x060023FC + stmdb sp!, {r4, lr} + mov ip, #0 + strh ip, [r0] + strh ip, [r0, #2] + strh ip, [r0, #4] + strh ip, [r0, #6] + strh ip, [r0, #8] + ldr r4, _06002460 ; =0x00000101 + strh ip, [r0, #0xa] + strh r4, [r0, #0xc] + mov r4, #4 + strh r4, [r0, #0xe] + strh r1, [r0, #0x10] + strh r2, [r0, #0x12] + str r3, [r0, #0x14] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + mov r1, #1 + strh r1, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06002460: .word 0x00000101 + arm_func_end WMSP_WL_MaKeyData + + arm_func_start WMSP_WL_MaMp +WMSP_WL_MaMp: ; 0x06002464 + stmdb sp!, {r4, lr} + mov ip, #0 + strh ip, [r0] + strh ip, [r0, #2] + strh ip, [r0, #4] + strh ip, [r0, #6] + strh ip, [r0, #8] + ldr r4, _060024F8 ; =0x00000102 + strh ip, [r0, #0xa] + strh r4, [r0, #0xc] + mov r4, #0xa + strh r4, [r0, #0xe] + strh r1, [r0, #0x10] + strh r2, [r0, #0x12] + ldrh r2, [sp, #8] + strh r3, [r0, #0x14] + ldrh r1, [sp, #0xc] + strh r2, [r0, #0x16] + ldrh r2, [sp, #0x10] + strh r1, [r0, #0x18] + ldrh r1, [sp, #0x14] + strh r2, [r0, #0x1a] + ldrh r2, [sp, #0x18] + strh r1, [r0, #0x1c] + ldr r1, [sp, #0x1c] + strh r2, [r0, #0x1e] + str r1, [r0, #0x20] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + mov r1, #1 + strh r1, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060024F8: .word 0x00000102 + arm_func_end WMSP_WL_MaMp + + arm_func_start WMSP_WL_MaClearData +WMSP_WL_MaClearData: ; 0x060024FC + stmdb sp!, {r4, lr} + mov r2, #0 + strh r2, [r0] + strh r2, [r0, #2] + strh r2, [r0, #4] + strh r2, [r0, #6] + strh r2, [r0, #8] + strh r2, [r0, #0xa] + mov r2, #0x104 + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_WL_MaClearData + + arm_func_start WMSP_WL_ParamSetAll +WMSP_WL_ParamSetAll: ; 0x06002554 + stmdb sp!, {r4, lr} + mov r1, #0 + strh r1, [r0] + strh r1, [r0, #2] + strh r1, [r0, #4] + strh r1, [r0, #6] + strh r1, [r0, #8] + strh r1, [r0, #0xa] + mov r1, #0x200 + mov r2, #0x48 + strh r1, [r0, #0xc] + strh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + mov r1, #1 + strh r1, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_WL_ParamSetAll + + arm_func_start WMSP_WL_ParamSetWepKeyId +WMSP_WL_ParamSetWepKeyId: ; 0x060025A8 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _06002600 ; =0x00000207 + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06002600: .word 0x00000207 + arm_func_end WMSP_WL_ParamSetWepKeyId + + arm_func_start WMSP_WL_ParamSetBeaconLostThreshold +WMSP_WL_ParamSetBeaconLostThreshold: ; 0x06002604 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _0600265C ; =0x0000020B + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600265C: .word 0x0000020B + arm_func_end WMSP_WL_ParamSetBeaconLostThreshold + + arm_func_start WMSP_WL_ParamSetSsidMask +WMSP_WL_ParamSetSsidMask: ; 0x06002660 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r0, #0 + strh r0, [r4] + strh r0, [r4, #2] + strh r0, [r4, #4] + strh r0, [r4, #6] + strh r0, [r4, #8] + ldr r2, _060026D0 ; =0x0000020D + strh r0, [r4, #0xa] + mov r0, r1 + strh r2, [r4, #0xc] + mov r1, #0x10 + strh r1, [r4, #0xe] + add r1, r4, #0x10 + mov r2, #0x20 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #1 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060026D0: .word 0x0000020D + arm_func_end WMSP_WL_ParamSetSsidMask + + arm_func_start WMSP_WL_ParamSetPreambleType +WMSP_WL_ParamSetPreambleType: ; 0x060026D4 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _0600272C ; =0x0000020E + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600272C: .word 0x0000020E + arm_func_end WMSP_WL_ParamSetPreambleType + + arm_func_start WMSP_WL_ParamSetLifeTime +WMSP_WL_ParamSetLifeTime: ; 0x06002730 + stmdb sp!, {r4, lr} + mov ip, #0 + strh ip, [r0] + strh ip, [r0, #2] + strh ip, [r0, #4] + strh ip, [r0, #6] + strh ip, [r0, #8] + ldr r4, _06002794 ; =0x00000211 + strh ip, [r0, #0xa] + strh r4, [r0, #0xc] + mov r4, #3 + strh r4, [r0, #0xe] + strh r1, [r0, #0x10] + strh r2, [r0, #0x12] + strh r3, [r0, #0x14] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + mov r1, #1 + strh r1, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06002794: .word 0x00000211 + arm_func_end WMSP_WL_ParamSetLifeTime + + arm_func_start WMSP_WL_ParamSetMaxConnectableChild +WMSP_WL_ParamSetMaxConnectableChild: ; 0x06002798 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _060027F0 ; =0x00000212 + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060027F0: .word 0x00000212 + arm_func_end WMSP_WL_ParamSetMaxConnectableChild + + arm_func_start WMSP_WL_ParamSetBeaconSendRecvInd +WMSP_WL_ParamSetBeaconSendRecvInd: ; 0x060027F4 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _0600284C ; =0x00000215 + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600284C: .word 0x00000215 + arm_func_end WMSP_WL_ParamSetBeaconSendRecvInd + + arm_func_start WMSP_WL_ParamSetNullKeyResponseMode +WMSP_WL_ParamSetNullKeyResponseMode: ; 0x06002850 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _060028A8 ; =0x00000216 + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060028A8: .word 0x00000216 + arm_func_end WMSP_WL_ParamSetNullKeyResponseMode + + arm_func_start WMSP_WL_ParamSetBeaconPeriod +WMSP_WL_ParamSetBeaconPeriod: ; 0x060028AC + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + ldr r2, _06002904 ; =0x00000242 + strh r3, [r0, #0xa] + strh r2, [r0, #0xc] + mov r3, #1 + strh r3, [r0, #0xe] + strh r1, [r0, #0x10] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + strh r3, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06002904: .word 0x00000242 + arm_func_end WMSP_WL_ParamSetBeaconPeriod + + arm_func_start WMSP_WL_ParamSetGameInfo +WMSP_WL_ParamSetGameInfo: ; 0x06002908 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov ip, #0 + strh ip, [r4] + strh ip, [r4, #2] + strh ip, [r4, #4] + strh ip, [r4, #6] + strh ip, [r4, #8] + add r0, r1, #1 + add r0, r0, r0, lsr #31 + mov r3, r0, asr #1 + mov r0, r2 + ldr r5, _06002988 ; =0x00000245 + strh ip, [r4, #0xa] + strh r5, [r4, #0xc] + add r2, r3, #1 + strh r2, [r4, #0xe] + strh r1, [r4, #0x10] + mov r2, r1 + add r1, r4, #0x12 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r5, r4, r1, lsl #1 + strh r0, [r5, #0x10] + mov r1, #1 + mov r0, r4 + strh r1, [r5, #0x12] + bl WMSP_WlRequest + add r0, r5, #0x10 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06002988: .word 0x00000245 + arm_func_end WMSP_WL_ParamSetGameInfo + + arm_func_start WMSP_WL_ParamGetMacAddress +WMSP_WL_ParamGetMacAddress: ; 0x0600298C + ldr ip, _0600299C ; =WMSPi_WL_NoArg + ldr r1, _060029A0 ; =0x00000281 + mov r2, #4 + bx ip + .align 2, 0 +_0600299C: .word WMSPi_WL_NoArg +_060029A0: .word 0x00000281 + arm_func_end WMSP_WL_ParamGetMacAddress + + arm_func_start WMSP_WL_ParamGetEnableChannel +WMSP_WL_ParamGetEnableChannel: ; 0x060029A4 + ldr ip, _060029B4 ; =WMSPi_WL_NoArg + ldr r1, _060029B8 ; =0x00000283 + mov r2, #3 + bx ip + .align 2, 0 +_060029B4: .word WMSPi_WL_NoArg +_060029B8: .word 0x00000283 + arm_func_end WMSP_WL_ParamGetEnableChannel + + arm_func_start WMSP_WL_ParamGetMode +WMSP_WL_ParamGetMode: ; 0x060029BC + ldr ip, _060029CC ; =WMSPi_WL_NoArg + mov r1, #0x284 + mov r2, #2 + bx ip + .align 2, 0 +_060029CC: .word WMSPi_WL_NoArg + arm_func_end WMSP_WL_ParamGetMode + + arm_func_start WMSP_WL_DevShutdown +WMSP_WL_DevShutdown: ; 0x060029D0 + ldr ip, _060029E0 ; =WMSPi_WL_NoArg + ldr r1, _060029E4 ; =0x00000301 + mov r2, #1 + bx ip + .align 2, 0 +_060029E0: .word WMSPi_WL_NoArg +_060029E4: .word 0x00000301 + arm_func_end WMSP_WL_DevShutdown + + arm_func_start WMSP_WL_DevIdle +WMSP_WL_DevIdle: ; 0x060029E8 + ldr ip, _060029F8 ; =WMSPi_WL_NoArg + ldr r1, _060029FC ; =0x00000302 + mov r2, #1 + bx ip + .align 2, 0 +_060029F8: .word WMSPi_WL_NoArg +_060029FC: .word 0x00000302 + arm_func_end WMSP_WL_DevIdle + + arm_func_start WMSP_WL_DevClass1 +WMSP_WL_DevClass1: ; 0x06002A00 + ldr ip, _06002A10 ; =WMSPi_WL_NoArg + ldr r1, _06002A14 ; =0x00000303 + mov r2, #1 + bx ip + .align 2, 0 +_06002A10: .word WMSPi_WL_NoArg +_06002A14: .word 0x00000303 + arm_func_end WMSP_WL_DevClass1 + + arm_func_start WMSP_WL_DevRestart +WMSP_WL_DevRestart: ; 0x06002A18 + ldr ip, _06002A28 ; =WMSPi_WL_NoArg + mov r1, #0x304 + mov r2, #1 + bx ip + .align 2, 0 +_06002A28: .word WMSPi_WL_NoArg + arm_func_end WMSP_WL_DevRestart + + arm_func_start WMSP_WL_DevSetInitializeWirelessCounter +WMSP_WL_DevSetInitializeWirelessCounter: ; 0x06002A2C + ldr ip, _06002A3C ; =WMSPi_WL_NoArg + ldr r1, _06002A40 ; =0x00000305 + mov r2, #1 + bx ip + .align 2, 0 +_06002A3C: .word WMSPi_WL_NoArg +_06002A40: .word 0x00000305 + arm_func_end WMSP_WL_DevSetInitializeWirelessCounter + + arm_func_start WMSP_WL_DevGetVersion +WMSP_WL_DevGetVersion: ; 0x06002A44 + ldr ip, _06002A54 ; =WMSPi_WL_NoArg + ldr r1, _06002A58 ; =0x00000306 + mov r2, #9 + bx ip + .align 2, 0 +_06002A54: .word WMSPi_WL_NoArg +_06002A58: .word 0x00000306 + arm_func_end WMSP_WL_DevGetVersion + + arm_func_start WMSP_WL_DevGetWirelessCounter +WMSP_WL_DevGetWirelessCounter: ; 0x06002A5C + ldr ip, _06002A6C ; =WMSPi_WL_NoArg + ldr r1, _06002A70 ; =0x00000307 + mov r2, #0x5c + bx ip + .align 2, 0 +_06002A6C: .word WMSPi_WL_NoArg +_06002A70: .word 0x00000307 + arm_func_end WMSP_WL_DevGetWirelessCounter + + arm_func_start WMSP_WL_DevGetStationState +WMSP_WL_DevGetStationState: ; 0x06002A74 + ldr ip, _06002A84 ; =WMSPi_WL_NoArg + mov r1, #0x308 + mov r2, #2 + bx ip + .align 2, 0 +_06002A84: .word WMSPi_WL_NoArg + arm_func_end WMSP_WL_DevGetStationState + + arm_func_start WMSP_WL_DevTestSignal +WMSP_WL_DevTestSignal: ; 0x06002A88 + stmdb sp!, {r4, lr} + mov ip, #0 + strh ip, [r0] + strh ip, [r0, #2] + strh ip, [r0, #4] + strh ip, [r0, #6] + strh ip, [r0, #8] + ldr r4, _06002AF4 ; =0x00000309 + strh ip, [r0, #0xa] + strh r4, [r0, #0xc] + mov r4, #4 + strh r4, [r0, #0xe] + strh r1, [r0, #0x10] + strh r2, [r0, #0x12] + ldrh r1, [sp, #8] + strh r3, [r0, #0x14] + strh r1, [r0, #0x16] + ldrh r2, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r2, lsl #1 + strh r1, [r4, #0x10] + mov r1, #1 + strh r1, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06002AF4: .word 0x00000309 + arm_func_end WMSP_WL_DevTestSignal + + arm_func_start WMSPi_WL_NoArg +WMSPi_WL_NoArg: ; 0x06002AF8 + stmdb sp!, {r4, lr} + mov r3, #0 + strh r3, [r0] + strh r3, [r0, #2] + strh r3, [r0, #4] + strh r3, [r0, #6] + strh r3, [r0, #8] + strh r3, [r0, #0xa] + strh r1, [r0, #0xc] + strh r3, [r0, #0xe] + ldrh r1, [r0, #0xc] + add r4, r0, r3, lsl #1 + strh r1, [r4, #0x10] + strh r2, [r4, #0x12] + bl WMSP_WlRequest + add r0, r4, #0x10 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSPi_WL_NoArg + + arm_func_start WMSP_Initialize +WMSP_Initialize: ; 0x06002B40 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r4, [r0, #4] + ldr r1, _06002BDC ; =wmspW + 0x1000 + str r4, [r1, #0x54c] + ldr r2, [r0, #8] + str r2, [r1, #0x550] + str r2, [r4] + ldr r1, [r0, #0xc] + str r1, [r4, #8] + ldr r0, [r0, #0x10] + bl WMSPi_CommonInit + add r0, sp, #2 + add r1, sp, #0 + bl WMSPi_CommonWlIdle + cmp r0, #0 + bne _06002BB0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + ldrh r1, [sp, #2] + strh r1, [r0, #4] + ldrh r1, [sp] + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06002BD0 +_06002BB0: + ldr r0, [r4] + mov r1, #2 + strh r1, [r0] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0 + strh r1, [r0] + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06002BD0: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_06002BDC: .word wmspW + 0x1000 + arm_func_end WMSP_Initialize + + arm_func_start WMSP_Reset +WMSP_Reset: ; 0x06002BE0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x210 + ldr r0, _06002FAC ; =wmspW + 0x1000 + mov r4, #0 + ldr r8, [r0, #0x550] + bl __VENEER_OS_DisableInterrupts + ldr r1, [r8, #0xc] + mov r5, r0 + cmp r1, #1 + bne _06002C3C + mov r0, r4 + str r0, [r8, #0xc] + mov r4, #1 + bl WMSP_CancelVAlarm + bl WMSP_SetThreadPriorityLow + ldrh r0, [r8] + cmp r0, #0xa + moveq r0, #8 + streqh r0, [r8] + beq _06002C3C + cmp r0, #9 + moveq r0, #7 + streqh r0, [r8] +_06002C3C: + ldrh r1, [r8] + add r0, r1, #0xf9 + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _06002C70 + add r0, r8, #0x100 + cmp r1, #7 + moveq sl, #1 + ldrh sb, [r0, #0x82] + movne sl, #0 + b _06002C74 +_06002C70: + mov sb, #0 +_06002C74: + add r0, r8, #0x100 + mov r1, #0 + strh r1, [r0, #0x82] + strh r1, [r8, #0x86] + str r1, [r8, #0x14] + str r1, [r8, #0x10] + str r1, [r8, #0x1c] + mov r0, r5 + strh r1, [r8, #0xc2] + bl __VENEER_OS_RestoreInterrupts + cmp r4, #0 + beq _06002CAC + ldr r0, _06002FB0 ; =0x0000FFFF + bl WMSP_CleanSendQueue +_06002CAC: + cmp sl, #0 + movne r0, #0 + strneh r0, [r8, #0xf6] + cmp sb, #0 + beq _06002D08 + mov r7, #0 + add r5, r8, #0x128 + add r4, r8, #0x8a + mov r6, #1 + mov fp, #6 +_06002CD4: + tst sb, r6, lsl r7 + beq _06002CFC + cmp r7, #0 + addeq r2, r4, #0x100 + subne r0, r7, #1 + mlane r2, r0, fp, r5 + mov r1, r7, lsl #0x10 + mov r0, sl + mov r1, r1, lsr #0x10 + bl WMSP_IndicateDisconnectionFromMyself +_06002CFC: + add r7, r7, #1 + cmp r7, #0x10 + blt _06002CD4 +_06002D08: + add r0, r8, #0x128 + mov r1, #0 + mov r2, #0x5a + bl __VENEER_MI_CpuFill8 + add r0, sp, #0x10 + bl WMSP_WL_DevGetStationState + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002D38 + mov r0, #0x308 + bl WmspError_06002FC0 + b _06002FA0 +_06002D38: + ldrh r4, [r0, #6] + add r0, sp, #0x10 + bl WMSP_WL_ParamGetMode + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002D5C + mov r0, #0x284 + bl WmspError_06002FC0 + b _06002FA0 +_06002D5C: + ldrh r1, [r0, #6] + cmp r4, #0x20 + bgt _06002DA0 + bge _06002E74 + cmp r4, #0 + bgt _06002D7C + beq _06002E98 + b _06002F78 +_06002D7C: + cmp r4, #0x12 + bgt _06002F78 + cmp r4, #0x10 + blt _06002F78 + beq _06002EB8 + cmp r4, #0x11 + cmpne r4, #0x12 + beq _06002F10 + b _06002F78 +_06002DA0: + cmp r4, #0x30 + bgt _06002DB0 + beq _06002DB8 + b _06002F78 +_06002DB0: + cmp r4, #0x40 + bne _06002F78 +_06002DB8: + add r0, r1, #0xfe + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _06002E3C + add r0, r8, #0x8a + add r1, sp, #0xa + add r0, r0, #0x100 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + mov r6, #0 + add r5, sp, #0xa + mov r4, #3 + b _06002E30 +_06002DF4: + add r0, sp, #0x10 + mov r1, r5 + mov r2, r4 + bl WMSP_WL_MlmeDeAuthenticate + ldrh r0, [r0, #4] + cmp r0, #0 + beq _06002E20 + cmp r0, #7 + cmpne r0, #0xc + beq _06002E2C + b _06002E74 +_06002E20: + mov r0, #3 + strh r0, [r8] + b _06002E74 +_06002E2C: + add r6, r6, #1 +_06002E30: + cmp r6, #2 + blt _06002DF4 + b _06002E74 +_06002E3C: + cmp r1, #1 + bne _06002E74 + add r0, sp, #4 + mov r1, #0xff + mov r2, #6 + bl __VENEER_MI_CpuFill8 + add r1, sp, #4 + add r0, sp, #0x10 + mov r2, #3 + bl WMSP_WL_MlmeDeAuthenticate + ldrh r0, [r0, #4] + cmp r0, #0 + moveq r0, #3 + streqh r0, [r8] +_06002E74: + add r0, sp, #0x10 + mov r1, #1 + bl WMSP_WL_MlmeReset + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002E98 + mov r0, #0 + bl WmspError_06002FC0 + b _06002FA0 +_06002E98: + add r0, sp, #0x10 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002EB8 + ldr r0, _06002FB4 ; =0x00000302 + bl WmspError_06002FC0 + b _06002FA0 +_06002EB8: + add r0, r8, #0x100 + ldrh r0, [r0, #0xee] + cmp r0, #0 + bne _06002EF8 + add r0, sp, #0x10 + mov r1, #1 + bl WMSP_WL_ParamSetPreambleType + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002EEC + ldr r0, _06002FB8 ; =0x0000020E + bl WmspError_06002FC0 + b _06002FA0 +_06002EEC: + add r0, r8, #0x100 + mov r1, #1 + strh r1, [r0, #0xee] +_06002EF8: + mov r0, #2 + strh r0, [r8] + mov r0, #0 + str r0, [r8, #0x198] + bl WMSP_ResetSizeVars + b _06002F88 +_06002F10: + cmp r1, #0 + bne _06002F4C + mov r0, #1 + mov r1, #0 + str r0, [sp] + add r0, sp, #0x10 + mov r2, r1 + mov r3, #0x14 + bl WMSP_WL_DevTestSignal + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002F4C + ldr r0, _06002FBC ; =0x00000309 + bl WmspError_06002FC0 + b _06002FA0 +_06002F4C: + add r0, sp, #0x10 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06002F6C + ldr r0, _06002FB4 ; =0x00000302 + bl WmspError_06002FC0 + b _06002FA0 +_06002F6C: + mov r0, #2 + strh r0, [r8] + b _06002F88 +_06002F78: + mov r0, #0x308 + mov r1, #0 + bl WmspError_06002FC0 + b _06002FA0 +_06002F88: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #1 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06002FA0: + add sp, sp, #0x210 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06002FAC: .word wmspW + 0x1000 +_06002FB0: .word 0x0000FFFF +_06002FB4: .word 0x00000302 +_06002FB8: .word 0x0000020E +_06002FBC: .word 0x00000309 + arm_func_end WMSP_Reset + + arm_func_start WmspError_06002FC0 +WmspError_06002FC0: ; 0x06002FC0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #1 + strh r1, [r0] + strh r1, [r0, #2] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_06002FC0 + + arm_func_start WMSP_End +WMSP_End: ; 0x06002FF0 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x200 + ldr r0, _0600309C ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + ldrh r0, [r4] + cmp r0, #2 + beq _06003028 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #2 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003090 +_06003028: + add r0, sp, #0 + bl WMSP_WL_DevShutdown + ldrh r5, [r0, #4] + cmp r5, #0 + beq _06003064 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #2 + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + add r1, r1, #0x300 + strh r1, [r0, #4] + strh r5, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003090 +_06003064: + mov r0, #1 + strh r0, [r4] + bl __VENEER_PM_SetLEDPattern + mov r0, #0 + strh r0, [r4] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #2 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06003090: + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600309C: .word wmspW + 0x1000 + arm_func_end WMSP_End + + arm_func_start __VENEER_PM_SetLEDPattern +__VENEER_PM_SetLEDPattern: ; 0x060030A0 + ldr pc, _060030A4 ; =PM_SetLEDPattern + .align 2, 0 +_060030A4: .word PM_SetLEDPattern + arm_func_end __VENEER_PM_SetLEDPattern + + arm_func_start WMSP_SetParentParam +WMSP_SetParentParam: ; 0x060030A8 + stmdb sp!, {r4, lr} + sub sp, sp, #0x200 + ldr r1, _06003160 ; =wmspW + 0x1000 + ldr r0, [r0, #4] + ldr r4, [r1, #0x550] + mov r2, #0x40 + add r1, r4, #0xe8 + bl __VENEER_MI_CpuCopy8 + add r0, r4, #0x100 + ldrh r1, [r0, #0x1a] + ldrh r0, [r0, #0xf4] + mov r2, #1 + tst r0, r2, lsl r1 + bne _060030FC + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #7 + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003154 +_060030FC: + ldrh r1, [r4, #0xf8] + add r0, sp, #0 + bl WMSP_WL_ParamSetMaxConnectableChild + ldrh r4, [r0, #4] + cmp r4, #0 + beq _0600313C + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #7 + strh r1, [r0] + mov r2, #1 + ldr r1, _06003164 ; =0x00000212 + strh r2, [r0, #2] + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003154 +_0600313C: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #7 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06003154: + add sp, sp, #0x200 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06003160: .word wmspW + 0x1000 +_06003164: .word 0x00000212 + arm_func_end WMSP_SetParentParam + + arm_func_start WMSP_StartParent +WMSP_StartParent: ; 0x06003168 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x2b8 + ldr r1, _060033EC ; =wmspW + 0x1000 + add r5, sp, #0xb8 + ldr r4, [r1, #0x550] + ldrh r1, [r4] + cmp r1, #2 + bne _06003194 + ldr r1, [r4, #0xc8] + tst r1, #1 + beq _060031B8 +_06003194: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #8 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #0 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060033E0 +_060031B8: + add r1, r4, #0x100 + ldrh r2, [r1, #0x1a] + mov r3, #1 + ldrh ip, [r1, #0xf6] + mov r2, r3, lsl r2 + ldr r6, [r0, #4] + tst ip, r2, asr #1 + bne _060031FC + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #8 + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + mov r1, #0 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060033E0 +_060031FC: + strh r3, [r4, #0xe6] + mov r0, #0 + strh r0, [r1, #0x88] + bl __VENEER_OS_DisableInterrupts + add r1, r4, #0x100 + mov r2, #0 + strh r2, [r1, #0x82] + strh r2, [r4, #0x86] + bl __VENEER_OS_RestoreInterrupts + mov r1, r5 + add r2, r4, #0x100 + mov r3, #1 + mov r0, #8 + strh r3, [r2, #0xee] + bl WMSP_SetAllParams + cmp r0, #0 + beq _060033E0 + mov r0, r5 + bl WMSP_WL_DevClass1 + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003260 + ldr r0, _060033F0 ; =0x00000303 + bl WmspError_060033F4 + b _060033E0 +_06003260: + cmp r6, #0 + movne r0, #1 + moveq r0, #0 + mov r0, r0, lsl #0x10 + mov r6, r0, lsr #0x10 + mov r0, r5 + mov r1, r6 + mov r2, #0 + mov r3, #1 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060032A0 + mov r0, #1 + bl WmspError_060033F4 + b _060033E0 +_060032A0: + strh r6, [r4, #0xc6] + add r1, sp, #0x38 + mov r0, #0 + mov r2, #0x80 + add r6, r4, #0xe8 + bl __VENEER_MIi_CpuClear16 + add r0, sp, #0x38 + mov r1, r6 + bl WMSP_CopyParentParam + add r1, sp, #0x18 + mov r0, #0 + mov r2, #0x20 + bl __VENEER_MIi_CpuClear16 + ldr r1, [r6, #8] + mov r0, r5 + strh r1, [sp, #0x18] + ldr r2, [r6, #8] + mov r3, #0 + mov r2, r2, lsr #0x10 + strh r2, [sp, #0x1a] + ldrh r5, [r6, #0xc] + mov r2, #2 + strh r5, [sp, #0x1c] + strh r3, [sp, #0x1e] + str r2, [sp] + ldrh r3, [r6, #0x32] + mov r2, #3 + str r3, [sp, #4] + str r2, [sp, #8] + str r2, [sp, #0xc] + ldrh r2, [r6, #4] + add r3, sp, #0x38 + add r2, r2, #0x10 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + str r2, [sp, #0x10] + str r3, [sp, #0x14] + ldrh r3, [r6, #0x18] + mov r1, #0x20 + add r2, sp, #0x18 + bl WMSP_WL_MlmeStart + ldrh r1, [r0, #4] + cmp r1, #0 + beq _0600335C + mov r0, #9 + bl WmspError_060033F4 + b _060033E0 +_0600335C: + ldrh r0, [r6, #0x14] + cmp r0, #0 + ldrh r0, [r6, #0x34] + movne r1, #0x2a + moveq r1, #0 + add r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SetParentMaxSize + ldrh r0, [r6, #0x14] + cmp r0, #0 + movne r1, #6 + ldrh r0, [r6, #0x36] + moveq r1, #0 + add r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SetChildMaxSize + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #7 + strh r1, [r4] + mov r1, #8 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + strh r1, [r0, #8] + ldrh r1, [r4, #0x30] + strh r1, [r0, #0x2c] + ldrh r1, [r4, #0x32] + strh r1, [r0, #0x2e] + bl __VENEER_WMSP_ReturnResult2Wm9 + mov r0, #1 + strh r0, [r4, #0xc2] +_060033E0: + add sp, sp, #0x2b8 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060033EC: .word wmspW + 0x1000 +_060033F0: .word 0x00000303 + arm_func_end WMSP_StartParent + + arm_func_start WmspError_060033F4 +WmspError_060033F4: ; 0x060033F4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #8 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + mov r1, #0 + strh r1, [r0, #8] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_060033F4 + + arm_func_start WMSP_EndParent +WMSP_EndParent: ; 0x06003430 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x208 + ldr r0, _060035EC ; =wmspW + 0x1000 + ldr sl, [r0, #0x550] + ldrh r0, [sl] + cmp r0, #7 + beq _06003468 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #9 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060035E0 +_06003468: + mov r0, #0 + strh r0, [sl, #0xf6] + mov r8, #1 +_06003474: + add r0, sl, #0x100 + ldrh r0, [r0, #0x82] + mov r7, #1 + tst r0, r7, lsl r8 + beq _06003544 + add r0, sl, #0x128 + sub r1, r8, #1 + mov r2, #6 + mla r0, r1, r2, r0 + add r1, sp, #0 + bl __VENEER_MI_CpuCopy8 + mov sb, #0 + add r6, sp, #8 + add r5, sp, #0 + mov r4, #3 + b _060034E0 +_060034B4: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl WMSP_WL_MlmeDeAuthenticate + ldrh r0, [r0, #4] + cmp r0, #0 + beq _060034E8 + cmp r0, #7 + cmpne r0, #0xc + bne _060034E8 + add sb, sb, #1 +_060034E0: + cmp sb, #2 + blt _060034B4 +_060034E8: + bl __VENEER_OS_DisableInterrupts + add r1, sl, #0x100 + ldrh r2, [r1, #0x82] + tst r2, r7, lsl r8 + beq _06003540 + mvn r3, r7, lsl r8 + and r2, r2, r3 + strh r2, [r1, #0x82] + ldrh r2, [sl, #0x86] + add r1, sl, r8, lsl #3 + and r2, r2, r3 + strh r2, [sl, #0x86] + mov r2, #0 + str r2, [r1, #0x738] + str r2, [r1, #0x73c] + bl __VENEER_OS_RestoreInterrupts + mov r0, r8, lsl #0x10 + mov r1, r0, lsr #0x10 + add r2, sp, #0 + mov r0, #1 + bl WMSP_IndicateDisconnectionFromMyself + b _06003544 +_06003540: + bl __VENEER_OS_RestoreInterrupts +_06003544: + add r8, r8, #1 + cmp r8, #0x10 + blt _06003474 + add r0, sp, #8 + mov r1, #1 + bl WMSP_WL_MlmeReset + ldrh r1, [r0, #4] + mov r0, #0 + cmp r1, #0 + beq _06003574 + bl WmspError_060035F4 + b _060035E0 +_06003574: + strh r0, [sl, #0xc2] + mov r1, #3 + strh r1, [sl] + add r0, sp, #8 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060035A0 + ldr r0, _060035F0 ; =0x00000302 + bl WmspError_060035F4 + b _060035E0 +_060035A0: + mov r0, #2 + strh r0, [sl] + mov r1, #0 + str r1, [sl, #0x198] + add r0, sl, #0x100 + strh r1, [r0, #0x96] + add r0, sl, #0x19c + mov r2, #0x50 + bl __VENEER_MI_CpuFill8 + bl WMSP_ResetSizeVars + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #9 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060035E0: + add sp, sp, #0x208 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_060035EC: .word wmspW + 0x1000 +_060035F0: .word 0x00000302 + arm_func_end WMSP_EndParent + + arm_func_start WmspError_060035F4 +WmspError_060035F4: ; 0x060035F4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #9 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_060035F4 + + arm_func_start WMSP_StartScan +WMSP_StartScan: ; 0x06003628 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x248 + ldr r1, _06003978 ; =wmspW + 0x1000 + add r4, sp, #0x48 + ldr r7, [r1, #0x550] + ldrh r1, [r7] + cmp r1, #2 + cmpne r1, #3 + cmpne r1, #5 + beq _06003674 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xa + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _0600396C +_06003674: + ldr r1, [r0, #4] + add r2, r7, #0x100 + str r1, [r7, #0x184] + ldrh r5, [r0, #2] + add r1, sp, #0x10 + strh r5, [r2, #0x90] + ldrh r6, [r0, #8] + add r0, r0, #0xa + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [sp, #0x10] + ldr r0, _0600397C ; =0x0000FFFF + cmp r1, r0 + beq _060036B8 + tst r1, #1 + bicne r0, r1, #1 + strneh r0, [sp, #0x10] +_060036B8: + cmp r5, #0 + bne _060036E4 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xa + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _0600396C +_060036E4: + add r0, r7, #0x100 + ldrh r0, [r0, #0xf4] + mov r1, #1 + tst r0, r1, lsl r5 + bne _0600371C + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xa + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _0600396C +_0600371C: + mov r0, #2 + strh r0, [r7, #0xe6] + mov r0, r4 + bl WMSP_WL_DevGetStationState + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003748 + mov r0, #0x308 + mov r2, #0 + bl WmspError_06003ED4 + b _0600396C +_06003748: + ldrh r0, [r0, #6] + cmp r0, #0x10 + bne _060037C4 + mov r1, r4 + mov r0, #0xa + bl WMSP_SetAllParams + cmp r0, #0 + beq _0600396C + mov r0, r4 + bl WMSP_WL_DevClass1 + ldrh r1, [r0, #4] + mov r2, #0 + cmp r1, #0 + beq _0600378C + ldr r0, _06003980 ; =0x00000303 + bl WmspError_06003ED4 + b _0600396C +_0600378C: + mov r0, #3 + mov r1, #1 + strh r0, [r7] + mov r0, r4 + mov r3, r1 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + mov r0, #1 + cmp r1, #0 + beq _060037C0 + mov r2, #0 + bl WmspError_06003ED4 + b _0600396C +_060037C0: + strh r0, [r7, #0xc6] +_060037C4: + ldr r0, _0600397C ; =0x0000FFFF + mov r3, #5 + strh r3, [r7] + add r1, sp, #0x26 + mov r2, #0x20 + bl __VENEER_MIi_CpuClear16 + add r0, sp, #0x17 + mov r1, #0 + mov r2, #0xf + strb r5, [sp, #0x16] + bl __VENEER_MI_CpuFill8 + add r1, sp, #0x26 + str r1, [sp] + mov r1, #1 + str r1, [sp, #4] + add r0, sp, #0x16 + str r0, [sp, #8] + ldr r1, _06003984 ; =0x0000011E + add r2, sp, #0x10 + str r6, [sp, #0xc] + mov r0, r4 + mov r3, #0 + bl WMSP_WL_MlmeScan + mov r4, r0 + ldrh r1, [r4, #4] + cmp r1, #0 + beq _06003840 + mov r0, #2 + mov r2, #0 + bl WmspError_06003ED4 + b _0600396C +_06003840: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + ldrh r1, [r4, #8] + mov r6, r0 + cmp r1, #0 + bne _06003878 + mov r0, #0xa + strh r0, [r6] + mov r1, #0 + strh r1, [r6, #2] + mov r0, #4 + strh r0, [r6, #8] + strh r5, [r6, #0x10] + strh r1, [r6, #0x12] + b _06003964 +_06003878: + ldr r1, [r7, #0x184] + mov r0, #0 + add r1, r1, #0x40 + mov r2, #0x80 + bl __VENEER_MIi_CpuClear16 + ldrh r2, [r4, #0xa] + ldr r1, [r7, #0x184] + add r0, r4, #0xa + mov r2, r2, lsl #1 + bl __VENEER_MI_CpuCopy8 + mov r0, #0xa + strh r0, [r6] + mov r0, #0 + strh r0, [r6, #2] + mov r0, #5 + strh r0, [r6, #8] + ldrh r0, [r4, #0x40] + strh r0, [r6, #0x10] + ldrh r0, [r4, #0xc] + and r0, r0, #0xff + bl WMSP_GetRssi8_06003988 + mov r7, r0 + bl WMSP_GetLinkLevel + strh r0, [r6, #0x12] + mov r0, r7 + bl WMSP_AddRssiToRandomPool + ldrh r1, [r4, #0x14] + add r0, r4, #0xe + strh r1, [r6, #0x14] + add r1, r6, #0xa + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, r4, #0x16 + add r1, r6, #0x16 + mov r2, #0x20 + bl __VENEER_MIi_CpuCopy16 + ldrh r0, [r4, #0x46] + strh r0, [r6, #0x36] + cmp r0, #0x80 + bls _0600393C + mov r0, #0xa + strh r0, [r6] + mov r1, #0 + strh r1, [r6, #2] + mov r0, #4 + strh r0, [r6, #8] + strh r5, [r6, #0x10] + strh r1, [r6, #0x12] + b _06003964 +_0600393C: + add r1, r6, #0x38 + mov r0, #0 + mov r2, #0x80 + bl __VENEER_MIi_CpuClear16 + ldrh r1, [r6, #0x36] + add r0, r4, #0x4a + add r2, r1, #1 + add r1, r6, #0x38 + bic r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_06003964: + mov r0, r6 + bl __VENEER_WMSP_ReturnResult2Wm9 +_0600396C: + add sp, sp, #0x248 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06003978: .word wmspW + 0x1000 +_0600397C: .word 0x0000FFFF +_06003980: .word 0x00000303 +_06003984: .word 0x0000011E + arm_func_end WMSP_StartScan + + arm_func_start WMSP_GetRssi8_06003988 +WMSP_GetRssi8_06003988: ; 0x06003988 + tst r0, #2 + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + and r0, r0, #0xff + bx lr + arm_func_end WMSP_GetRssi8_06003988 + + arm_func_start WMSP_AddRssiToRandomPool +WMSP_AddRssiToRandomPool: ; 0x0600399C + ldr r2, _060039B4 ; =0x027FFF98 + ldrh r1, [r2] + eor r0, r0, r1, lsl #1 + eor r0, r0, r0, lsr #16 + strh r0, [r2] + bx lr + .align 2, 0 +_060039B4: .word 0x027FFF98 + arm_func_end WMSP_AddRssiToRandomPool + + arm_func_start WMSP_StartScanEx +WMSP_StartScanEx: ; 0x060039B8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc8 + sub sp, sp, #0x400 + ldr r1, _06003EB8 ; =wmspW + 0x1000 + mov sb, r0 + ldr r8, [r1, #0x550] + ldrh r0, [r8] + cmp r0, #2 + cmpne r0, #3 + cmpne r0, #5 + beq _06003A08 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x26 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003EA8 +_06003A08: + ldr r0, [sb, #4] + add r1, sp, #0x18 + str r0, [r8, #0x184] + ldrh sl, [sb, #2] + add r0, r8, #0x100 + strh sl, [r0, #0x90] + ldrh r3, [sb, #0xa] + add r0, sb, #0xc + str r3, [sp, #0x10] + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r5, [sb, #0x12] + ldrh fp, [sb, #0x36] + cmp r5, #2 + beq _06003A50 + cmp r5, #3 + beq _06003A5C + b _06003A68 +_06003A50: + mov r6, #1 + mov r5, #0 + b _06003A6C +_06003A5C: + mov r6, #1 + mov r5, r6 + b _06003A6C +_06003A68: + mov r6, #0 +_06003A6C: + add r1, sp, #0x4e + add r0, sb, #0x16 + mov r2, #0x20 + ldrh r4, [sb, #0x14] + bl __VENEER_MI_CpuCopy8 + ldrh r1, [sp, #0x18] + ldr r0, _06003EBC ; =0x0000FFFF + ldrh r7, [sb, #8] + cmp r1, r0 + beq _06003AA0 + tst r1, #1 + bicne r0, r1, #1 + strneh r0, [sp, #0x18] +_06003AA0: + add r0, r8, #0x100 + ldrh r1, [r0, #0xf4] + mov r0, sl, lsl #0x11 + ands sl, r1, r0, lsr #16 + beq _06003AE4 + ldr r0, [r8, #0xc8] + tst r0, #1 + cmpne r5, #1 + bne _06003AE4 + ldr r0, [sb, #4] + cmp r0, #0 + beq _06003AE4 + tst r0, #3 + bne _06003AE4 + ldrh r0, [sb, #8] + cmp r0, #0x40 + bhs _06003B08 +_06003AE4: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x26 + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003EA8 +_06003B08: + mov r0, #2 + strh r0, [r8, #0xe6] + add r0, sp, #0x70 + bl WMSP_WL_DevGetStationState + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003B34 + mov r0, #0x308 + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003B34: + ldrh r0, [r0, #6] + cmp r0, #0x10 + bne _06003BB4 + add r1, sp, #0x70 + mov r0, #0x26 + bl WMSP_SetAllParams + cmp r0, #0 + beq _06003EA8 + add r0, sp, #0x70 + bl WMSP_WL_DevClass1 + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003B78 + ldr r0, _06003EC0 ; =0x00000303 + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003B78: + mov r0, #3 + mov r1, #1 + strh r0, [r8] + add r0, sp, #0x70 + mov r3, r1 + mov r2, #0 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + mov r0, #1 + cmp r1, #0 + beq _06003BB0 + mov r2, r0 + bl WmspError_06003ED4 + b _06003EA8 +_06003BB0: + strh r0, [r8, #0xc6] +_06003BB4: + add r0, r8, #0x100 + ldrh r0, [r0, #0xee] + cmp r5, #0 + bne _06003C04 + cmp r0, #1 + bne _06003C40 + add r0, sp, #0x70 + mov r1, #0 + bl WMSP_WL_ParamSetPreambleType + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003BF4 + ldr r0, _06003EC4 ; =0x0000020E + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003BF4: + add r0, r8, #0x100 + mov r1, #0 + strh r1, [r0, #0xee] + b _06003C40 +_06003C04: + cmp r0, #0 + bne _06003C40 + add r0, sp, #0x70 + mov r1, #1 + bl WMSP_WL_ParamSetPreambleType + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003C34 + ldr r0, _06003EC4 ; =0x0000020E + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003C34: + add r0, r8, #0x100 + mov r1, #1 + strh r1, [r0, #0xee] +_06003C40: + cmp r6, #1 + bne _06003C98 + add r0, sp, #0x2e + mov r1, #0xff + mov r2, #0x20 + bl __VENEER_MI_CpuFill8 + cmp fp, #0x20 + bhi _06003C70 + add r0, sp, #0x2e + mov r2, fp + mov r1, #0 + bl __VENEER_MI_CpuFill8 +_06003C70: + add r1, sp, #0x2e + add r0, sp, #0x70 + bl WMSP_WL_ParamSetSsidMask + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003C98 + ldr r0, _06003EC8 ; =0x0000020D + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003C98: + mov r6, #0 + mov r3, #5 + add r0, sp, #0x1e + mov r1, r6 + mov r2, #0x10 + strh r3, [r8] + bl __VENEER_MI_CpuFill8 + mov r3, #1 + add r1, sp, #0x1e + mov r2, r3 +_06003CC0: + tst sl, r2, lsl r3 + addne r0, r6, #1 + movne r0, r0, lsl #0x10 + strneb r3, [r1, r6] + movne r6, r0, lsr #0x10 + add r0, r3, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, lsr #0x10 + cmp r3, #0xf + blo _06003CC0 + sub r0, r7, #0x40 + mov r1, #0x42 + bl __VENEER__u32_div_f + add r2, sp, #0x4e + stmia sp, {r2, r5} + add r1, sp, #0x1e + str r1, [sp, #8] + ldr r1, [sp, #0x10] + sub r5, r7, r0, lsl #1 + str r1, [sp, #0xc] + add r2, sp, #0x18 + add r0, sp, #0x70 + mov r3, r4 + add r1, r5, #0x5e + bl WMSP_WL_MlmeScan + mov r5, r0 + ldrh r1, [r5, #4] + cmp r1, #0 + beq _06003D44 + mov r0, #2 + mov r2, #1 + bl WmspError_06003ED4 + b _06003EA8 +_06003D44: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + ldrh r1, [r5, #8] + mov r6, r0 + cmp r1, #0 + bne _06003D80 + mov r0, #0x26 + strh r0, [r6] + mov r1, #0 + strh r1, [r6, #2] + mov r0, #4 + strh r0, [r6, #8] + strh r1, [r6, #0xe] + mov r0, sl, asr #1 + strh r0, [r6, #0xa] + b _06003EA0 +_06003D80: + ldr sb, [r8, #0x184] + mov r2, r7 + mov r1, sb + mov r0, #0 + add r8, r5, #0xa + bl __VENEER_MIi_CpuClear16 + mov r7, #0 + b _06003E6C +_06003DA0: + ldrh r1, [r8] + mov r0, r8 + mov r1, r1, lsl #0x11 + mov fp, r1, lsr #0x10 + mov r1, sb + mov r2, fp + bl __VENEER_MI_CpuCopy8 + cmp r4, #0 + beq _06003E28 + ldrh r2, [sb, #0xa] + cmp r2, #0 + moveq r0, #0 + beq _06003E0C + cmp r2, #0x20 + movhi r0, #0 + bhi _06003E0C + mov r1, #0 + b _06003E00 +_06003DE8: + add r0, sb, r1 + ldrb r0, [r0, #0xc] + cmp r0, #0 + movne r0, #1 + bne _06003E0C + add r1, r1, #1 +_06003E00: + cmp r1, r2 + blt _06003DE8 + mov r0, #0 +_06003E0C: + cmp r0, #0 + bne _06003E28 + add r0, sp, #0x4e + add r1, sb, #0xc + mov r2, #0x20 + strh r4, [sb, #0xa] + bl __VENEER_MI_CpuCopy8 +_06003E28: + add r0, r6, r7, lsl #2 + str sb, [r0, #0x10] + ldrh r0, [r8, #2] + and r0, r0, #0xff + bl WMSP_GetRssi8_06003988 + str r0, [sp, #0x14] + bl WMSP_GetLinkLevel + add r1, r6, r7, lsl #1 + strh r0, [r1, #0x50] + ldr r0, [sp, #0x14] + bl WMSP_AddRssiToRandomPool + add sb, sb, fp + tst sb, #2 + addne r0, sb, #2 + add r8, r8, fp + bicne sb, r0, #3 + add r7, r7, #1 +_06003E6C: + ldrh r0, [r5, #8] + cmp r7, r0 + blt _06003DA0 + mov r0, #0x26 + strh r0, [r6] + mov r0, #0 + strh r0, [r6, #2] + mov r0, #5 + strh r0, [r6, #8] + ldrh r1, [r5, #8] + mov r0, sl, asr #1 + strh r1, [r6, #0xe] + strh r0, [r6, #0xa] +_06003EA0: + mov r0, r6 + bl __VENEER_WMSP_ReturnResult2Wm9 +_06003EA8: + add sp, sp, #0xc8 + add sp, sp, #0x400 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06003EB8: .word wmspW + 0x1000 +_06003EBC: .word 0x0000FFFF +_06003EC0: .word 0x00000303 +_06003EC4: .word 0x0000020E +_06003EC8: .word 0x0000020D + arm_func_end WMSP_StartScanEx + + arm_func_start __VENEER__u32_div_f +__VENEER__u32_div_f: ; 0x06003ECC + ldr pc, _06003ED0 ; =_u32_div_f + .align 2, 0 +_06003ED0: .word _u32_div_f + arm_func_end __VENEER__u32_div_f + + arm_func_start WmspError_06003ED4 +WmspError_06003ED4: ; 0x06003ED4 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r2 + mov r6, r0 + mov r5, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + cmp r4, #0 + movne r1, #0x26 + moveq r1, #0xa + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + mov r1, #4 + strh r1, [r0, #8] + strh r6, [r0, #4] + strh r5, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end WmspError_06003ED4 + + arm_func_start WMSP_EndScan +WMSP_EndScan: ; 0x06003F1C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x200 + ldr r0, _06003FE4 ; =wmspW + 0x1000 + add r4, sp, #0 + ldr r5, [r0, #0x550] + ldrh r0, [r5] + cmp r0, #5 + beq _06003F58 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xb + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06003FD8 +_06003F58: + mov r0, r4 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003F78 + ldr r0, _06003FE8 ; =0x00000302 + bl WmspError_06003FF0 + b _06003FD8 +_06003F78: + mov r0, #2 + strh r0, [r5] + add r0, r5, #0x100 + ldrh r0, [r0, #0xee] + cmp r0, #0 + bne _06003FC0 + mov r0, r4 + mov r1, #1 + bl WMSP_WL_ParamSetPreambleType + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06003FB4 + ldr r0, _06003FEC ; =0x0000020E + bl WmspError_06003FF0 + b _06003FD8 +_06003FB4: + add r0, r5, #0x100 + mov r1, #1 + strh r1, [r0, #0xee] +_06003FC0: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xb + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06003FD8: + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06003FE4: .word wmspW + 0x1000 +_06003FE8: .word 0x00000302 +_06003FEC: .word 0x0000020E + arm_func_end WMSP_EndScan + + arm_func_start WmspError_06003FF0 +WmspError_06003FF0: ; 0x06003FF0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xb + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_06003FF0 + + arm_func_start WMSP_StartConnectEx +WMSP_StartConnectEx: ; 0x06004024 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x250 + ldr r1, _060045B4 ; =wmspW + 0x1000 + add r4, sp, #0x50 + ldr r7, [r1, #0x550] + ldr r5, [r1, #0x54c] + ldrh r1, [r7] + mov r6, r0 + cmp r1, #2 + bne _06004058 + ldr r0, [r7, #0xc8] + tst r0, #1 + beq _0600407C +_06004058: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #6 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060045A8 +_0600407C: + ldr r0, [r6, #4] + add r1, r5, #0x10 + mov r2, #0xc0 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [r5, #0x4c] + cmp r0, #0x10 + blo _060040C8 + ldrb r0, [r5, #0x5b] + tst r0, #1 + bne _060040C8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #0xb + strh r1, [r0, #2] + mov r1, #6 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060045A8 +_060040C8: + ldrh r1, [r5, #0x46] + add r0, r7, #0x100 + mov r2, #1 + ldrh r0, [r0, #0xf4] + mov r1, r2, lsl r1 + tst r1, r0 + beq _060040F0 + rsb r0, r2, #0x2000 + tst r0, r1, asr #1 + bne _06004110 +_060040F0: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #6 + strh r1, [r0, #2] + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060045A8 +_06004110: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #6 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + add r0, r7, #0x100 + ldrh r1, [r0, #0xec] + cmp r1, #1 + ldrh r1, [r5, #0x3e] + bne _06004158 + tst r1, #1 + movne r1, #1 + strneh r1, [r0, #0xec] + moveq r1, #2 + b _06004168 +_06004158: + tst r1, #2 + movne r1, #2 + strneh r1, [r0, #0xec] + moveq r1, #1 +_06004168: + streqh r1, [r0, #0xec] + ldrh r0, [r5, #0x3c] + tst r0, #0x20 + movne r1, #1 + add r0, r7, #0x100 + moveq r1, #0 + strh r1, [r0, #0xee] + ldrh r0, [r5, #0x4c] + mov r1, r4 + cmp r0, #0 + moveq r0, #3 + movne r0, #2 + strh r0, [r7, #0xe6] + mov r0, #0xc + bl WMSP_SetAllParams + cmp r0, #0 + beq _060045A8 + mov r0, r4 + mov r1, #0 + bl WMSP_WL_ParamSetNullKeyResponseMode + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060041D4 + ldr r0, _060045B8 ; =0x00000216 + mov r2, #0 + bl WmspError_060045D0 + b _060045A8 +_060041D4: + ldrh r0, [r5, #0x4c] + cmp r0, #0x10 + bhs _06004230 + ldrh r1, [r5, #0x42] + cmp r1, #0 + moveq r0, #1 + beq _060041FC + ldr r0, _060045BC ; =0x00002710 + bl __VENEER__s32_div_f + add r0, r0, #1 +_060041FC: + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + cmp r1, #0xff + movhi r1, #0xff + mov r0, r4 + bl WMSP_WL_ParamSetBeaconLostThreshold + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06004230 + ldr r0, _060045C0 ; =0x0000020B + mov r2, #0 + bl WmspError_060045D0 + b _060045A8 +_06004230: + mov r0, r4 + bl WMSP_WL_DevClass1 + ldrh r1, [r0, #4] + mov r2, #0 + cmp r1, #0 + beq _06004254 + ldr r0, _060045C4 ; =0x00000303 + bl WmspError_060045D0 + b _060045A8 +_06004254: + mov r0, #3 + strh r0, [r7] + ldr r0, [r6, #0x20] + mov r3, #1 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + mov r0, r0, lsl #0x10 + mov r8, r0, lsr #0x10 + mov r0, r4 + mov r1, r8 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060042A0 + mov r0, #1 + mov r2, #0 + bl WmspError_060045D0 + b _060045A8 +_060042A0: + strh r8, [r7, #0xc6] + add r1, sp, #0xc + add r0, r5, #0x10 + mov r2, #0x40 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [r7, #0xe6] + cmp r0, #2 + bne _060042FC + mov r0, #0x20 + strh r0, [sp, #0x16] + ldr r0, [r5, #0x54] + add r1, sp, #0x20 + strh r0, [sp, #0x18] + ldr r2, [r5, #0x54] + add r0, r6, #8 + mov r2, r2, lsr #0x10 + strh r2, [sp, #0x1a] + ldrh ip, [r5, #0x58] + mov r3, #0 + mov r2, #0x18 + strh ip, [sp, #0x1c] + strh r3, [sp, #0x1e] + bl __VENEER_MI_CpuCopy8 +_060042FC: + add r2, sp, #0xc + mov r0, r4 + mov r1, #0x7d0 + bl WMSP_WL_MlmeJoin + ldrh r1, [r0, #4] + cmp r1, #0 + ldreqh r2, [r0, #6] + cmpeq r2, #0 + beq _06004330 + ldrh r2, [r0, #6] + mov r0, #3 + bl WmspError_060045D0 + b _060045A8 +_06004330: + add r1, r7, #0x8a + add r0, r0, #8 + add r1, r1, #0x100 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, r7, #0x8a + add r1, sp, #6 + add r0, r0, #0x100 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r2, [r6, #0x26] + add r1, sp, #6 + mov r0, r4 + mov r3, #0x7d0 + bl WMSP_WL_MlmeAuthenticate + ldrh r1, [r0, #4] + cmp r1, #0xc + ldreqh r2, [r0, #6] + cmpeq r2, #0x13 + bne _060043A0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + strh r1, [r0, #2] + mov r1, #6 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060045A8 +_060043A0: + cmp r1, #0 + ldreqh r2, [r0, #6] + cmpeq r2, #0 + beq _060043C0 + ldrh r2, [r0, #6] + mov r0, #4 + bl WmspError_060045D0 + b _060045A8 +_060043C0: + add r0, r7, #0x8a + add r1, sp, #0 + add r0, r0, #0x100 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r1, sp, #0 + mov r0, r4 + mov r2, #1 + mov r3, #0x7d0 + bl WMSP_WL_MlmeAssociate + mov r4, r0 + bl __VENEER_OS_DisableInterrupts + ldrh r2, [r4, #4] + mov r6, r0 + cmp r2, #0xc + ldreqh r1, [r4, #6] + cmpeq r1, #0x13 + bne _0600442C + bl __VENEER_OS_RestoreInterrupts + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + strh r1, [r0, #2] + mov r1, #6 + strh r1, [r0, #8] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060045A8 +_0600442C: + cmp r2, #0 + ldreqh r0, [r4, #6] + cmpeq r0, #0 + beq _06004458 + mov r0, r6 + bl __VENEER_OS_RestoreInterrupts + ldrh r1, [r4, #4] + ldrh r2, [r4, #6] + mov r0, #6 + bl WmspError_060045D0 + b _060045A8 +_06004458: + ldrh r1, [r4, #8] + add r0, r7, #0x100 + strh r1, [r0, #0x88] + ldrh r0, [r5, #0x58] + add r1, r7, #0x1f8 + strh r0, [r7, #0xba] + mov r0, #1 + mov r2, #0x10 + bl __VENEER_MIi_CpuClear16 + ldrh r0, [r5, #0x12] + and r0, r0, #0xff + tst r0, #2 + mov r0, r0, asr #2 + addeq r0, r0, #0x19 + and r4, r0, #0xff + mov r0, r4 + bl WMSP_GetLinkLevel + strh r0, [r7, #0xbc] + mov r0, r4 + bl WMSP_FillRssiIntoList + bl __VENEER_OS_DisableInterrupts + add r1, r7, #0x100 + mov r2, #1 + strh r2, [r1, #0x82] + strh r2, [r7, #0x86] + ldr r1, [r7, #0x7bc] + ldr r2, [r7, #0x7b8] + cmp r1, #0 + mov r4, r0 + cmpeq r2, #0 + beq _060044E8 + bl __VENEER_OS_GetTick + orr r0, r0, #1 + str r0, [r7, #0x738] + orr r0, r1, #0 + str r0, [r7, #0x73c] +_060044E8: + mov r0, #8 + strh r0, [r7] + ldrb r0, [r5, #0x5b] + tst r0, #4 + movne r1, #0x2a + ldrh r0, [r5, #0x5c] + moveq r1, #0 + add r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SetParentMaxSize + ldrb r0, [r5, #0x5b] + tst r0, #4 + movne r1, #6 + ldrh r0, [r5, #0x5e] + moveq r1, #0 + add r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SetChildMaxSize + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + mov r0, #1 + strh r0, [r7, #0xc2] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0xc + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #7 + strh r0, [r4, #8] + add r0, r7, #0x100 + ldrh r2, [r0, #0x88] + add r1, r7, #0x8a + strh r2, [r4, #0xa] + add r0, r1, #0x100 + add r1, r4, #0x10 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [r7, #0x30] + mov r0, r4 + strh r1, [r4, #0x16] + ldrh r1, [r7, #0x32] + strh r1, [r4, #0x18] + bl __VENEER_WMSP_ReturnResult2Wm9 + mov r0, r6 + bl __VENEER_OS_RestoreInterrupts +_060045A8: + add sp, sp, #0x250 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_060045B4: .word wmspW + 0x1000 +_060045B8: .word 0x00000216 +_060045BC: .word 0x00002710 +_060045C0: .word 0x0000020B +_060045C4: .word 0x00000303 + arm_func_end WMSP_StartConnectEx + + arm_func_start __VENEER__s32_div_f +__VENEER__s32_div_f: ; 0x060045C8 + ldr pc, _060045CC ; =_s32_div_f + .align 2, 0 +_060045CC: .word _s32_div_f + arm_func_end __VENEER__s32_div_f + + arm_func_start WmspError_060045D0 +WmspError_060045D0: ; 0x060045D0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xc + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r6, [r0, #4] + strh r5, [r0, #6] + strh r4, [r0, #0xe] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end WmspError_060045D0 + + arm_func_start WMSP_Disconnect +WMSP_Disconnect: ; 0x0600460C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r1, [r0, #4] + add r2, sp, #0 + mov r3, r1, lsl #0x10 + mov r1, #0 + mov r4, r3, lsr #0x10 + bl WMSP_DisconnectCore + cmp r0, #1 + bne _06004658 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xd + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + strh r4, [r0, #8] + ldrh r1, [sp] + strh r1, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06004658: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end WMSP_Disconnect + + arm_func_start WMSP_DisconnectCore +WMSP_DisconnectCore: ; 0x06004664 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x220 + ldr r3, _06004BE8 ; =wmspW + 0x1000 + ldr r4, [r0, #4] + movs sl, r1 + ldrne r0, [r0, #8] + mov r1, r4, lsl #0x10 + moveq r0, #0 + mov r0, r0, lsl #0x10 + mov fp, #0 + ldr r7, [r3, #0x550] + mov r8, r1, lsr #0x10 + ldrh r1, [r7] + mov r0, r0, lsr #0x10 + cmp r1, #9 + str r2, [sp] + mov r5, fp + str r0, [sp, #8] + cmpne r1, #7 + bne _060046C4 + ldr r0, [r7, #0xc] + cmp r0, #1 + moveq r5, #1 + b _060047BC +_060046C4: + cmp r1, #0xa + cmpne r1, #8 + bne _06004780 + bl __VENEER_OS_DisableInterrupts + add r1, r7, #0x100 + ldrh r1, [r1, #0x82] + mov r4, r0 + cmp r1, #0 + bne _06004728 + bl __VENEER_OS_RestoreInterrupts + cmp sl, #0 + bne _06004720 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xd + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #0 + strh r1, [r0, #4] + strh r1, [r0, #6] + strh r8, [r0, #8] + strh r1, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06004720: + mov r0, #0 + b _06004BDC +_06004728: + ldr r0, [r7, #0xc] + cmp r0, #1 + bne _06004758 + mov r0, #0 + str r0, [r7, #0xc] + mov r5, #1 + bl WMSP_CancelVAlarm + bl WMSP_SetThreadPriorityLow + ldrh r0, [r7] + cmp r0, #0xa + moveq r0, #8 + streqh r0, [r7] +_06004758: + add r0, r7, #0x100 + mov r1, #0 + strh r1, [r0, #0x82] + strh r1, [r7, #0x86] + str r1, [r7, #0x14] + str r1, [r7, #0x10] + mov r0, r4 + str r1, [r7, #0x1c] + bl __VENEER_OS_RestoreInterrupts + b _060047BC +_06004780: + cmp sl, #0 + bne _060047B4 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xd + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, fp + strh r1, [r0, #4] + strh r1, [r0, #6] + strh r8, [r0, #8] + strh r1, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060047B4: + mov r0, #0 + b _06004BDC +_060047BC: + ldrh r0, [r7] + cmp r0, #0xa + cmpne r0, #8 + bne _060049E4 + add r0, r7, #0x8a + add r1, sp, #0x1a + add r0, r0, #0x100 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + mov sb, #0 + add r6, sp, #0x1a + mov r4, #3 + b _06004874 +_060047F0: + add r0, sp, #0x20 + mov r1, r6 + mov r2, r4 + bl WMSP_WL_MlmeDeAuthenticate + ldrh r1, [r0, #4] + cmp r1, #7 + bgt _0600482C + bge _06004834 + cmp r1, #1 + bgt _0600483C + cmp r1, #0 + blt _0600483C + cmpne r1, #1 + beq _0600487C + b _0600483C +_0600482C: + cmp r1, #0xc + bne _0600483C +_06004834: + add sb, sb, #1 + b _06004874 +_0600483C: + cmp sl, #0 + mov r2, r8 + mov r0, #5 + mov r3, #0 + beq _06004858 + bl WmspIndError + b _0600485C +_06004858: + bl WmspError_06004CB4 +_0600485C: + cmp r5, #0 + beq _0600486C + mov r0, #1 + bl WMSP_CleanSendQueue +_0600486C: + mov r0, #0 + b _06004BDC +_06004874: + cmp sb, #2 + blt _060047F0 +_0600487C: + mov r0, #0 + strh r0, [r7, #0xc2] + mov r0, #3 + mov fp, #1 + strh r0, [r7] + add r0, sp, #0x20 + mov r1, fp + bl WMSP_WL_MlmeReset + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060048E0 + cmp sl, #0 + mov r2, r8 + mov r0, #0 + mov r3, fp + beq _060048C4 + bl WmspIndError + b _060048C8 +_060048C4: + bl WmspError_06004CB4 +_060048C8: + cmp r5, #0 + beq _060048D8 + mov r0, #1 + bl WMSP_CleanSendQueue +_060048D8: + mov r0, #0 + b _06004BDC +_060048E0: + add r0, sp, #0x20 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06004930 + ldr r0, _06004BEC ; =0x00000302 + cmp sl, #0 + mov r2, r8 + beq _06004910 + mov r3, fp + bl WmspIndError + b _06004918 +_06004910: + mov r3, fp + bl WmspError_06004CB4 +_06004918: + cmp r5, #0 + beq _06004928 + mov r0, #1 + bl WMSP_CleanSendQueue +_06004928: + mov r0, #0 + b _06004BDC +_06004930: + mov r0, #2 + strh r0, [r7] + mov r1, #0 + str r1, [r7, #0x198] + add r3, r7, #0x100 + add r0, r7, #0x19c + mov r2, #0x50 + strh r1, [r3, #0x96] + bl __VENEER_MI_CpuFill8 + bl WMSP_ResetSizeVars + cmp sl, #1 + bne _060049C0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0xc + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #9 + strh r0, [r4, #8] + ldr r0, [sp, #8] + mov r2, #6 + strh r0, [r4, #0xc] + add r0, r7, #0x100 + ldrh r1, [r0, #0x88] + add r0, sp, #0x1a + strh r1, [r4, #0xa] + add r1, r4, #0x10 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [r7, #0x30] + mov r0, r4 + strh r1, [r4, #0x16] + ldrh r1, [r7, #0x32] + strh r1, [r4, #0x18] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060049D0 +_060049C0: + mov r0, #0 + add r2, sp, #0x1a + mov r1, r0 + bl WMSP_IndicateDisconnectionFromMyself +_060049D0: + cmp r5, #0 + beq _06004BCC + mov r0, #1 + bl WMSP_CleanSendQueue + b _06004BCC +_060049E4: + mov r6, #1 + b _06004BC4 +_060049EC: + add r0, r7, #0x100 + ldrh r0, [r0, #0x82] + mov r1, #1 + mov sb, r1, lsl r6 + and r0, r0, r8 + tst sb, r0 + beq _06004BC0 + sub r1, r6, #1 + mov r2, #6 + mul r0, r1, r2 + str r0, [sp, #0x10] + add r0, r7, #0x128 + str r0, [sp, #0xc] + mov r0, r6, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [sp, #4] + ldr r1, [sp, #0xc] + ldr r0, [sp, #0x10] + add r0, r1, r0 + add r1, sp, #0x14 + bl __VENEER_MI_CpuCopy8 + mov r4, #0 + b _06004AB0 +_06004A48: + add r0, sp, #0x20 + add r1, sp, #0x14 + mov r2, #3 + bl WMSP_WL_MlmeDeAuthenticate + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06004AB8 + cmp r1, #7 + cmpne r1, #0xc + bne _06004A78 + add r4, r4, #1 + b _06004AB0 +_06004A78: + cmp sl, #0 + mov r2, r8 + mov r0, #5 + mov r3, fp + beq _06004A94 + bl WmspIndError + b _06004A98 +_06004A94: + bl WmspError_06004CB4 +_06004A98: + cmp r5, #0 + beq _06004AA8 + mov r0, #1 + bl WMSP_CleanSendQueue +_06004AA8: + mov r0, #0 + b _06004BDC +_06004AB0: + cmp r4, #2 + blt _06004A48 +_06004AB8: + bl __VENEER_OS_DisableInterrupts + mov r4, r0 + add r1, r7, #0x100 + ldrh r3, [r1, #0x82] + tst r3, sb + beq _06004BBC + ldr r2, [sp, #0xc] + ldr r0, [sp, #0x10] + mov ip, #1 + add r0, r2, r0 + ldr r2, [sp, #4] + orr r2, fp, ip, lsl r2 + mov r2, r2, lsl #0x10 + mov fp, r2, lsr #0x10 + mvn r2, sb + and r3, r3, r2 + strh r3, [r1, #0x82] + ldrh r3, [r7, #0x86] + mov r1, #0 + and r2, r3, r2 + strh r2, [r7, #0x86] + ldr r2, [sp, #4] + add r2, r7, r2, lsl #3 + str r1, [r2, #0x738] + str r1, [r2, #0x73c] + mov r2, #6 + bl __VENEER_MI_CpuFill8 + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + cmp sl, #1 + bne _06004B90 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #8 + strh r0, [r4] + mov r0, #0 + strh r0, [r4, #2] + mov r0, #9 + strh r0, [r4, #8] + ldr r0, [sp, #8] + add r1, r4, #0xa + strh r0, [r4, #0x12] + ldr r0, [sp, #4] + mov r2, #6 + strh r0, [r4, #0x10] + add r0, sp, #0x14 + bl __VENEER_MI_CpuCopy8 + ldrh r1, [r7, #0x30] + mov r0, r4 + strh r1, [r4, #0x2c] + ldrh r1, [r7, #0x32] + strh r1, [r4, #0x2e] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06004BA4 +_06004B90: + mov r0, r6, lsl #0x10 + mov r1, r0, lsr #0x10 + add r2, sp, #0x14 + mov r0, #1 + bl WMSP_IndicateDisconnectionFromMyself +_06004BA4: + cmp r5, #0 + beq _06004BC0 + mov r0, sb, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_CleanSendQueue + b _06004BC0 +_06004BBC: + bl __VENEER_OS_RestoreInterrupts +_06004BC0: + add r6, r6, #1 +_06004BC4: + cmp r6, #0x10 + blt _060049EC +_06004BCC: + ldr r0, [sp] + cmp r0, #0 + strneh fp, [r0] + mov r0, #1 +_06004BDC: + add sp, sp, #0x220 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06004BE8: .word wmspW + 0x1000 +_06004BEC: .word 0x00000302 + arm_func_end WMSP_DisconnectCore + + arm_func_start WMSP_IndicateDisconnectionFromMyself +WMSP_IndicateDisconnectionFromMyself: ; 0x06004BF0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, _06004CAC ; =wmspW + 0x1000 + mov r8, r0 + ldr r5, [r3, #0x550] + mov r7, r1 + mov r6, r2 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0 + strh r0, [r4, #2] + cmp r8, #0 + mov r1, #0x1a + mov r2, #6 + beq _06004C60 + mov r0, #8 + strh r0, [r4] + strh r1, [r4, #8] + ldr r0, _06004CB0 ; =0x0000F001 + add r1, r4, #0xa + strh r0, [r4, #0x12] + strh r7, [r4, #0x10] + mov r0, r6 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [r5, #0x30] + strh r0, [r4, #0x2c] + ldrh r0, [r5, #0x32] + strh r0, [r4, #0x2e] + b _06004C9C +_06004C60: + mov r0, #0xc + strh r0, [r4] + ldr r0, _06004CB0 ; =0x0000F001 + strh r1, [r4, #8] + strh r0, [r4, #0xc] + add r0, r5, #0x100 + ldrh r1, [r0, #0x88] + mov r0, r6 + strh r1, [r4, #0xa] + add r1, r4, #0x10 + bl __VENEER_MI_CpuCopy8 + ldrh r0, [r5, #0x30] + strh r0, [r4, #0x16] + ldrh r0, [r5, #0x32] + strh r0, [r4, #0x18] +_06004C9C: + mov r0, r4 + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_06004CAC: .word wmspW + 0x1000 +_06004CB0: .word 0x0000F001 + arm_func_end WMSP_IndicateDisconnectionFromMyself + + arm_func_start WmspError_06004CB4 +WmspError_06004CB4: ; 0x06004CB4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xd + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r7, [r0, #4] + strh r6, [r0, #6] + strh r5, [r0, #8] + strh r4, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end WmspError_06004CB4 + + arm_func_start WmspIndError +WmspIndError: ; 0x06004CF8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x25 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r7, [r0, #4] + strh r6, [r0, #6] + strh r5, [r0, #8] + strh r4, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end WmspIndError + + arm_func_start WMSP_StartMP +WMSP_StartMP: ; 0x06004D3C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x204 + ldr r1, _060050C4 ; =wmspW + 0x1000 + mov sl, r0 + ldr r8, [r1, #0x550] + ldr fp, [sl, #4] + ldrh r1, [r8, #0x9c] + ldr r4, [sl, #8] + ldr r5, [sl, #0xc] + ldr r6, [sl, #0x10] + ldr r0, _060050C8 ; =wmspW + cmp r1, #0 + mov r7, #0 + bne _06004DC0 + ldrh r1, [r8, #0x3c] + add r1, r1, #0x1f + bic r1, r1, #0x1f + cmp r6, r1 + add r1, r8, #0x100 + ldrh r1, [r1, #0x88] + movlo r7, #6 + cmp r1, #0 + ldrneh r1, [r8, #0x3e] + addne r1, r1, #0x51 + bne _06004DB4 + ldrh r2, [r8, #0x3e] + ldrh r1, [r8, #0xf8] + add r2, r2, #0xc + mul r1, r2, r1 + add r1, r1, #0x29 +_06004DB4: + bic r1, r1, #0x1f + cmp r4, r1 + movlo r7, #6 +_06004DC0: + ldrh r1, [r8, #0xe6] + cmp r1, #2 + bne _06004DF0 + add r0, r0, #0x1000 + ldr r1, [r0, #0x54c] + add r0, r8, #0x100 + ldrh r1, [r1, #0x46] + ldrh r3, [r0, #0xf6] + mov r2, #1 + mov r0, r2, lsl r1 + tst r3, r0, asr #1 + moveq r7, #6 +_06004DF0: + cmp r7, #0 + beq _06004E18 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + strh r7, [r0, #2] + mov r1, #0xa + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060050B8 +_06004E18: + ldr r0, [r8, #0xc] + mov r1, #0 + cmp r0, #0 + strne r1, [r8, #0xc] + movne r1, #1 + cmp r1, #0 + beq _06004E3C + ldr r0, _060050CC ; =0x0000FFFF + bl WMSP_CleanSendQueue +_06004E3C: + bl WMSP_InitSendQueue + bl __VENEER_OS_DisableInterrupts + str r0, [sp] + add r0, sl, #0x14 + mov r1, #0 + bl WMSP_SetMPParameterCore + ldr r0, _060050C4 ; =wmspW + 0x1000 + ldr r7, [sl, #0x30] + ldr sb, [r0, #0x550] + ldrh r0, [sb] + cmp r0, #9 + cmpne r0, #0xa + beq _06004F30 + bl __VENEER_OS_DisableInterrupts + tst r7, #4 + ldrneh r2, [sl, #0x38] + add r1, sb, #0x700 + ldreqh r2, [sb, #0x5c] + cmp r2, #0 + moveq r2, #0x10 + tst r7, #1 + ldrneh r3, [sl, #0x34] + ldreqh r3, [sb, #0x58] + cmp r3, #0 + moveq r3, #0x10 + cmp r3, r2 + movhi r3, r2 + tst r7, #2 + ldrneh ip, [sl, #0x36] + ldreqh ip, [sb, #0x5a] + strh r2, [r1, #0xc4] + cmp ip, #0 + moveq ip, #0x10 + cmp ip, r2 + strh r3, [r1, #0xc0] + movhi ip, r2 + strh ip, [r1, #0xc2] + ldrsh r1, [sb, #0x62] + cmp r1, r2 + strgth r2, [sb, #0x62] + tst r7, #0x200 + ldrneh r2, [sl, #0x3a] + add r1, sb, #0x700 + ldreqh r2, [sb, #0x98] + tst r7, #0x400 + strh r2, [r1, #0xca] + ldrneb r2, [sl, #0x3c] + add r1, sb, #0x700 + ldreqh r2, [sb, #0x92] + tst r7, #0x800 + strh r2, [r1, #0xc6] + ldrneb r2, [sl, #0x3d] + add r1, sb, #0x700 + ldreqh r2, [sb, #0x94] + tst r7, #0x1000 + strh r2, [r1, #0xc8] + ldrneb r2, [sl, #0x3e] + add r1, sb, #0x700 + ldreqh r2, [sb, #0x9a] + strh r2, [r1, #0xcc] + bl __VENEER_OS_RestoreInterrupts +_06004F30: + ldrh r0, [r8] + add r0, r0, #0xf9 + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _06005090 + mov r2, #0 + strh r2, [r8, #0x84] + strh r2, [r8, #0x5e] + mov r1, #1 + strh r1, [r8, #0x60] + strh r2, [r8, #0x88] + strh r2, [r8, #0x9e] + mov r0, #0x3c + strh r0, [r8, #0xa0] + str r2, [r8, #0x734] + strh r2, [r8, #0x8a] + strh r2, [r8, #0x8c] + strh r2, [r8, #0x8e] + strh r2, [r8, #0x90] + strh r2, [r8, #0x66] + str fp, [r8, #0x74] + strh r4, [r8, #0x72] + add r0, fp, r4 + str r0, [r8, #0x78] + strh r2, [r8, #0x70] + str r5, [r8, #0x7c] + strh r6, [r8, #0x80] + strh r2, [r8, #0x62] + strh r2, [r8, #0x64] + strh r2, [r8, #0x68] + strh r2, [r8, #0x6a] + rsb r0, r1, #0x10000 + strh r0, [r8, #0xbe] + strh r1, [r8, #0xc0] + bl __VENEER_OS_GetTick + orr r1, r1, #0 + orr r2, r0, #1 + mov r3, #0 +_06004FD0: + add r0, r8, r3, lsl #3 + str r2, [r0, #0x738] + add r3, r3, #1 + str r1, [r0, #0x73c] + cmp r3, #0x10 + blt _06004FD0 + bl WMSP_SetThreadPriorityHigh + mov r0, #0 + strh r0, [r8, #0xce] + bl WMSP_SetVAlarm + ldrh r0, [r8] + cmp r0, #8 + moveq r0, #0xa + streqh r0, [r8] + beq _06005018 + cmp r0, #7 + moveq r0, #9 + streqh r0, [r8] +_06005018: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0xa + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + mov r1, #1 + ldr r0, [sp] + str r1, [r8, #0xc] + bl __VENEER_OS_RestoreInterrupts + add r0, sp, #4 + mov r1, #1 + bl WMSP_WL_ParamSetNullKeyResponseMode + mov r4, r0 + ldrh r0, [r4, #4] + cmp r0, #0 + beq _060050B8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0xe + strh r2, [r0] + mov r1, #1 + strh r1, [r0, #2] + add r1, r2, #0x208 + strh r1, [r0, #4] + ldrh r1, [r4, #4] + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060050B8 +_06005090: + ldr r0, [sp] + bl __VENEER_OS_RestoreInterrupts + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0xe + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + mov r1, #0xa + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060050B8: + add sp, sp, #0x204 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_060050C4: .word wmspW + 0x1000 +_060050C8: .word wmspW +_060050CC: .word 0x0000FFFF + arm_func_end WMSP_StartMP + + arm_func_start WMSP_SetMPData +WMSP_SetMPData: ; 0x060050D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r1, _06005204 ; =wmspW + 0x1000 + ldr r2, [r0, #0x10] + ldr sl, [r1, #0x550] + ldr r5, [r0, #8] + add r4, sl, #0x100 + ldr r3, [r0, #0x14] + ldrh r8, [r4, #0x88] + mov r1, r5, lsl #0x10 + ldrh sb, [r4, #0x82] + ldr fp, [r0, #4] + ldr r5, [r0, #0xc] + cmp r8, #0 + ldr r6, [r0, #0x18] + ldr r7, [r0, #0x1c] + mov r2, r2, lsl #0x10 + mov r0, r2, lsr #0x10 + str r0, [sp, #0x10] + ldr r0, [sl, #0xc] + movne r5, #1 + cmp r0, #0 + mov r3, r3, lsl #0x10 + mov r4, r1, lsr #0x10 + mov r1, r3, lsr #0x10 + moveq r8, #3 + beq _06005164 + tst r5, sb + moveq r8, #0 + beq _06005164 + str fp, [sp] + stmib sp, {r4, r6, r7} + ldr r2, [sp, #0x10] + mov r0, sb + mov r3, r5 + bl WMSP_PutSendQueue + mov r8, r0 +_06005164: + cmp r8, #2 + beq _060051F8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x81 + strh r1, [r0] + strh r8, [r0, #2] + mov r1, #0x14 + strh r1, [r0, #8] + ldr r1, [sp, #0x10] + cmp r8, #0xa + strh r1, [r0, #0xa] + andeq r1, r5, sb + strh r5, [r0, #0xc] + movne r1, #0 + strh r1, [r0, #0xe] + mov r1, #0 + strh r1, [r0, #0x10] + strh r4, [r0, #0x18] + str fp, [r0, #0x14] + str r6, [r0, #0x1c] + ldr r1, _06005208 ; =0x0000FFFF + str r7, [r0, #0x20] + strh r1, [r0, #0x1a] + add r1, sl, #0x100 + ldrh r1, [r1, #0x88] + ldrh r2, [sl, #0x30] + cmp r1, #0 + ldrh r3, [sl, #0x32] + moveq r1, r2 + movne r1, r3 + strh r1, [r0, #0x24] + add r1, sl, #0x100 + ldrh r1, [r1, #0x88] + cmp r1, #0 + movne r3, r2 + strh r3, [r0, #0x26] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060051F8: + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06005204: .word wmspW + 0x1000 +_06005208: .word 0x0000FFFF + arm_func_end WMSP_SetMPData + + arm_func_start WMSP_EndMP +WMSP_EndMP: ; 0x0600520C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x200 + ldr r0, _0600531C ; =wmspW + 0x1000 + mov r4, #0 + ldr r6, [r0, #0x550] + ldrh r0, [r6] + cmp r0, #9 + cmpne r0, #0xa + beq _0600524C + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x10 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06005310 +_0600524C: + bl __VENEER_OS_DisableInterrupts + ldr r1, [r6, #0xc] + mov r5, r0 + mov r0, #0 + cmp r1, #1 + str r0, [r6, #0xc] + moveq r4, #1 + bl WMSP_CancelVAlarm + bl WMSP_SetThreadPriorityLow + ldrh r0, [r6] + cmp r0, #0xa + moveq r0, #8 + streqh r0, [r6] + beq _06005290 + cmp r0, #9 + moveq r0, #7 + streqh r0, [r6] +_06005290: + mov r0, r5 + bl __VENEER_OS_RestoreInterrupts + add r0, sp, #0 + mov r1, #0 + bl WMSP_WL_ParamSetNullKeyResponseMode + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060052BC + ldr r0, _06005320 ; =0x00000216 + bl WmspError_06005328 + b _06005310 +_060052BC: + add r0, sp, #0 + mov r1, #7 + bl WMSP_WL_MaClearData + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060052E0 + mov r0, #0x104 + bl WmspError_06005328 + b _06005310 +_060052E0: + mov r0, #0 + strh r0, [r6, #0x8a] + cmp r4, #0 + beq _060052F8 + ldr r0, _06005324 ; =0x0000FFFF + bl WMSP_CleanSendQueue +_060052F8: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x10 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005310: + add sp, sp, #0x200 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600531C: .word wmspW + 0x1000 +_06005320: .word 0x00000216 +_06005324: .word 0x0000FFFF + arm_func_end WMSP_EndMP + + arm_func_start WmspError_06005328 +WmspError_06005328: ; 0x06005328 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x10 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_06005328 + + arm_func_start WMSP_StartDCF +WMSP_StartDCF: ; 0x0600535C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _060053E4 ; =wmspW + 0x1000 + ldr r2, [r0, #8] + ldr r4, [r1, #0x550] + mov r5, r2, lsl #0x10 + ldr r6, [r0, #4] + mov r7, r5, lsr #0x10 + bl __VENEER_OS_DisableInterrupts + str r6, [r4, #0xb0] + strh r7, [r4, #0xb8] + add r1, r6, r5, lsr #16 + str r1, [r4, #0xb4] + mov r1, #0 + strh r1, [r4, #0xae] + str r1, [r4, #0xa8] + strh r1, [r4, #0xac] + str r1, [r4, #0x18] + mov r1, #0xb + strh r1, [r4] + mov r5, r0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x11 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0xe + strh r1, [r0, #4] + bl __VENEER_WMSP_ReturnResult2Wm9 + mov r1, #1 + mov r0, r5 + str r1, [r4, #0x10] + bl __VENEER_OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_060053E4: .word wmspW + 0x1000 + arm_func_end WMSP_StartDCF + + arm_func_start WMSP_SetDCFData +WMSP_SetDCFData: ; 0x060053E8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x230 + ldr r1, _060054DC ; =wmspW + 0x1000 + mov r5, r0 + ldr r4, [r1, #0x550] + add r0, r5, #4 + add r1, r4, #0xa2 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldr r0, [r5, #0xc] + add r1, sp, #0 + str r0, [r4, #0xa8] + ldr r2, [r5, #0x10] + mov r0, #1 + strh r2, [r4, #0xac] + str r0, [r4, #0x18] + mov r0, #0 + mov r2, #0x30 + bl __VENEER_MIi_CpuClear16 + mov r0, #0 + strh r0, [sp] + ldr r1, [r5, #0x10] + add r0, r4, #0x100 + strh r1, [sp, #6] + ldrh r0, [r0, #0xec] + add r1, sp, #0x18 + cmp r0, #2 + moveq r3, #0x14 + movne r3, #0xa + add r0, r5, #4 + mov r2, #6 + strb r3, [sp, #0xe] + bl __VENEER_MI_CpuCopy8 + add r1, sp, #0x1e + add r0, r4, #0xe0 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + ldr r2, [r5, #0xc] + add r0, sp, #0x30 + add r1, sp, #0 + str r2, [sp, #0x2c] + bl WMSP_WL_MaData + mov r4, r0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x12 + strh r1, [r0] + ldrh r1, [r4, #4] + cmp r1, #0 + moveq r1, #0 + movne r1, #1 + strh r1, [r0, #2] + ldrh r1, [r4, #4] + cmp r1, #0 + movne r1, #0x100 + strneh r1, [r0, #4] + ldrneh r1, [r4, #4] + strneh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x230 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060054DC: .word wmspW + 0x1000 + arm_func_end WMSP_SetDCFData + + arm_func_start WMSP_EndDCF +WMSP_EndDCF: ; 0x060054E0 + stmdb sp!, {r4, lr} + sub sp, sp, #0x200 + ldr r0, _06005598 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + bl __VENEER_OS_DisableInterrupts + ldrh r1, [r4] + cmp r1, #0xb + beq _06005520 + bl __VENEER_OS_RestoreInterrupts + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x13 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _0600558C +_06005520: + mov r1, #0 + str r1, [r4, #0x10] + mov r1, #8 + strh r1, [r4] + bl __VENEER_OS_RestoreInterrupts + add r0, sp, #0 + mov r1, #7 + bl WMSP_WL_MaClearData + ldrh r4, [r0, #4] + cmp r4, #0 + beq _06005574 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x13 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + mov r1, #0x104 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _0600558C +_06005574: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x13 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_0600558C: + add sp, sp, #0x200 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06005598: .word wmspW + 0x1000 + arm_func_end WMSP_EndDCF + + arm_func_start WMSP_SetWEPKey +WMSP_SetWEPKey: ; 0x0600559C + stmdb sp!, {r3, lr} + ldr r1, _06005640 ; =wmspW + 0x1000 + ldr r2, [r0, #4] + ldr r3, [r1, #0x550] + add r1, r3, #0x100 + strh r2, [r1, #0x96] + ldrh r1, [r1, #0x96] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _060055EC +_060055C4: ; jump table + b _060055D4 ; case 0 + b _060055E0 ; case 1 + b _060055E0 ; case 2 + b _060055E0 ; case 3 +_060055D4: + mov r1, #0 + str r1, [r3, #0x198] + b _060055F4 +_060055E0: + mov r1, #1 + str r1, [r3, #0x198] + b _060055F4 +_060055EC: + mov r1, #0 + str r1, [r3, #0x198] +_060055F4: + ldr r1, [r3, #0x198] + mov r2, #0x50 + cmp r1, #1 + bne _06005614 + ldr r0, [r0, #8] + add r1, r3, #0x19c + bl __VENEER_MI_CpuCopy8 + b _06005620 +_06005614: + add r0, r3, #0x19c + mov r1, #0 + bl __VENEER_MI_CpuFill8 +_06005620: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x14 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06005640: .word wmspW + 0x1000 + arm_func_end WMSP_SetWEPKey + + arm_func_start WMSP_SetWEPKeyEx +WMSP_SetWEPKeyEx: ; 0x06005644 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x200 + ldr r1, _06005738 ; =wmspW + 0x1000 + mov r5, r0 + ldr r4, [r1, #0x550] + ldr r1, [r5, #4] + add r0, r4, #0x100 + strh r1, [r0, #0x96] + ldrh r0, [r0, #0x96] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0600569C +_06005674: ; jump table + b _06005684 ; case 0 + b _06005690 ; case 1 + b _06005690 ; case 2 + b _06005690 ; case 3 +_06005684: + mov r0, #0 + str r0, [r4, #0x198] + b _060056A4 +_06005690: + mov r0, #1 + str r0, [r4, #0x198] + b _060056A4 +_0600569C: + mov r0, #0 + str r0, [r4, #0x198] +_060056A4: + ldr r0, [r4, #0x198] + mov r2, #0x50 + cmp r0, #1 + bne _060056C4 + ldr r0, [r5, #8] + add r1, r4, #0x19c + bl __VENEER_MI_CpuCopy8 + b _060056D0 +_060056C4: + add r0, r4, #0x19c + mov r1, #0 + bl __VENEER_MI_CpuFill8 +_060056D0: + ldr r1, [r5, #0xc] + add r0, sp, #0 + strh r1, [r4, #0xc4] + ldrh r1, [r4, #0xc4] + bl WMSP_WL_ParamSetWepKeyId + ldrh r4, [r0, #4] + cmp r4, #0 + beq _06005714 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x14 + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + rsb r1, r1, #0x208 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005714: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x27 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06005738: .word wmspW + 0x1000 + arm_func_end WMSP_SetWEPKeyEx + + arm_func_start WMSP_SetGameInfo +WMSP_SetGameInfo: ; 0x0600573C + stmdb sp!, {r4, lr} + sub sp, sp, #0x280 + ldr r1, _06005828 ; =wmspW + 0x1000 + ldr r2, [r0, #4] + ldr r4, [r1, #0x550] + str r2, [r4, #0xe8] + ldr r1, [r0, #8] + strh r1, [r4, #0xec] + ldr r1, [r0, #0xc] + str r1, [r4, #0xf0] + ldr r1, [r0, #0x10] + strh r1, [r4, #0xf4] + ldr r0, [r0, #0x14] + and r0, r0, #0xff + tst r0, #1 + movne r1, #1 + moveq r1, #0 + strh r1, [r4, #0xf6] + tst r0, #2 + movne r1, #1 + moveq r1, #0 + strh r1, [r4, #0xfa] + tst r0, #4 + movne r1, #1 + moveq r1, #0 + tst r0, #8 + strh r1, [r4, #0xfc] + movne r1, #1 + moveq r1, #0 + strh r1, [r4, #0xfe] + add r0, sp, #0 + add r1, r4, #0xe8 + bl WMSP_CopyParentParam + ldrh r1, [r4, #0xec] + add r0, sp, #0x80 + add r1, r1, #0x10 + mov r1, r1, lsl #0x10 + add r2, sp, #0 + mov r1, r1, lsr #0x10 + bl WMSP_WL_ParamSetGameInfo + mov r4, r0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x18 + strh r1, [r0] + ldrh r1, [r4, #4] + cmp r1, #0 + moveq r1, #0 + movne r1, #1 + strh r1, [r0, #2] + ldrh r1, [r4, #4] + cmp r1, #0 + ldrne r1, _0600582C ; =0x00000245 + strneh r1, [r0, #4] + ldrneh r1, [r4, #4] + strneh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x280 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06005828: .word wmspW + 0x1000 +_0600582C: .word 0x00000245 + arm_func_end WMSP_SetGameInfo + + arm_func_start WMSP_SetBeaconTxRxInd +WMSP_SetBeaconTxRxInd: ; 0x06005830 + stmdb sp!, {r4, lr} + sub sp, sp, #0x200 + ldr r1, [r0, #4] + add r0, sp, #0 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bl WMSP_WL_ParamSetBeaconSendRecvInd + ldrh r4, [r0, #4] + cmp r4, #0 + beq _06005880 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x19 + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + add r1, r1, #0x214 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06005898 +_06005880: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x19 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005898: + add sp, sp, #0x200 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_SetBeaconTxRxInd + + arm_func_start WMSP_StartTestMode +WMSP_StartTestMode: ; 0x060058A4 + stmdb sp!, {r3, lr} + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1a + strh r1, [r0] + mov r1, #4 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + arm_func_end WMSP_StartTestMode + + arm_func_start WMSP_StopTestMode +WMSP_StopTestMode: ; 0x060058C8 + stmdb sp!, {r3, lr} + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1b + strh r1, [r0] + mov r1, #4 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + arm_func_end WMSP_StopTestMode + + arm_func_start WMSP_SetLifeTime +WMSP_SetLifeTime: ; 0x060058EC + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x200 + ldmib r0, {r1, r2, r3} + ldr r0, [r0, #0x10] + mov r1, r1, lsl #0x10 + mov r4, r0, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r3, lsl #0x10 + ldr ip, _06005A04 ; =wmspW + 0x1000 + mov r5, r4, lsr #0x10 + add r0, sp, #0 + mov r1, r1, lsr #0x10 + mov r2, r2, lsr #0x10 + mov r3, r3, lsr #0x10 + ldr r4, [ip, #0x550] + bl WMSP_WL_ParamSetLifeTime + ldrh r6, [r0, #4] + cmp r6, #0 + beq _06005960 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x1d + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + add r1, r1, #0x210 + strh r1, [r0, #4] + strh r6, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060059F8 +_06005960: + ldr r0, _06005A08 ; =0x0000FFFF + cmp r5, r0 + beq _060059AC + cmp r5, #0 + moveq r1, #1 + moveq r0, #0 + beq _060059A0 + mov r0, #0x64 + mul r2, r5, r0 + ldr r0, _06005A0C ; =0x000082EA + mov r1, r2, asr #0x1f + umull ip, r3, r2, r0 + mla r3, r1, r0, r3 + mov r1, ip, lsr #6 + mov r0, r3, lsr #6 + orr r1, r1, r3, lsl #26 +_060059A0: + str r1, [r4, #0x7b8] + str r0, [r4, #0x7bc] + b _060059B8 +_060059AC: + mov r0, #0 + str r0, [r4, #0x7b8] + str r0, [r4, #0x7bc] +_060059B8: + bl __VENEER_OS_GetTick + orr r1, r1, #0 + orr r2, r0, #1 + mov r3, #0 +_060059C8: + add r0, r4, r3, lsl #3 + str r2, [r0, #0x738] + add r3, r3, #1 + str r1, [r0, #0x73c] + cmp r3, #0x10 + blt _060059C8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1d + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060059F8: + add sp, sp, #0x200 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06005A04: .word wmspW + 0x1000 +_06005A08: .word 0x0000FFFF +_06005A0C: .word 0x000082EA + arm_func_end WMSP_SetLifeTime + + arm_func_start WMSP_MeasureChannel +WMSP_MeasureChannel: ; 0x06005A10 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x214 + ldr r1, _06005BAC ; =wmspW + 0x1000 + mov r7, r0 + ldr r6, [r1, #0x550] + add r4, sp, #0x14 + ldrh r0, [r6] + cmp r0, #2 + beq _06005A50 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1e + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06005BA0 +_06005A50: + mov r0, r4 + bl WMSP_WL_DevGetStationState + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06005A70 + mov r0, #0x308 + bl WmspError_06005BB8 + b _06005BA0 +_06005A70: + ldrh r1, [r0, #6] + mov r0, #2 + strh r0, [r6, #0xe6] + cmp r1, #0x10 + bne _06005AF0 + mov r1, r4 + mov r0, #0xa + bl WMSP_SetAllParams + cmp r0, #0 + beq _06005BA0 + mov r0, r4 + bl WMSP_WL_DevClass1 + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06005AB8 + ldr r0, _06005BB0 ; =0x00000303 + bl WmspError_06005BB8 + b _06005BA0 +_06005AB8: + mov r0, #3 + mov r1, #1 + strh r0, [r6] + mov r0, r4 + mov r3, r1 + mov r2, #0 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + mov r0, #1 + cmp r1, #0 + beq _06005AEC + bl WmspError_06005BB8 + b _06005BA0 +_06005AEC: + strh r0, [r6, #0xc6] +_06005AF0: + ldrh r8, [r7, #2] + ldrh sb, [r7, #4] + ldrh r5, [r7, #6] + ldrh r7, [r7, #8] + add r0, sp, #4 + mov r1, #0 + mov r2, #0x10 + bl __VENEER_MI_CpuFill8 + strb r5, [sp, #4] + add r0, sp, #4 + str r0, [sp] + mov r0, r4 + mov r1, r8 + mov r2, sb + mov r3, r7 + bl WMSP_WL_MlmeMeasureChannel + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06005B48 + mov r0, #0xa + bl WmspError_06005BB8 + b _06005BA0 +_06005B48: + ldrh r1, [r0, #8] + mov r0, r4 + and r4, r1, #0xff + mov r1, r1, lsl #8 + mov r5, r1, lsr #0x10 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06005B78 + ldr r0, _06005BB4 ; =0x00000302 + bl WmspError_06005BB8 + b _06005BA0 +_06005B78: + mov r0, #2 + strh r0, [r6] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1e + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + strh r4, [r0, #8] + strh r5, [r0, #0xa] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005BA0: + add sp, sp, #0x214 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_06005BAC: .word wmspW + 0x1000 +_06005BB0: .word 0x00000303 +_06005BB4: .word 0x00000302 + arm_func_end WMSP_MeasureChannel + + arm_func_start WmspError_06005BB8 +WmspError_06005BB8: ; 0x06005BB8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1e + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + strh r5, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WmspError_06005BB8 + + arm_func_start WMSP_InitWirelessCounter +WMSP_InitWirelessCounter: ; 0x06005BEC + stmdb sp!, {r4, lr} + sub sp, sp, #0x200 + add r0, sp, #0 + bl WMSP_WL_DevSetInitializeWirelessCounter + ldrh r4, [r0, #4] + cmp r4, #0 + beq _06005C30 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x1f + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + add r1, r1, #0x304 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06005C48 +_06005C30: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x1f + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005C48: + add sp, sp, #0x200 + ldmia sp!, {r4, lr} + bx lr + arm_func_end WMSP_InitWirelessCounter + + arm_func_start WMSP_GetWirelessCounter +WMSP_GetWirelessCounter: ; 0x06005C54 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x200 + add r0, sp, #0 + bl WMSP_WL_DevGetWirelessCounter + mov r5, r0 + ldrh r4, [r5, #4] + cmp r4, #0 + beq _06005C9C + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #0x20 + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + rsb r1, r1, #0x308 + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06005CCC +_06005C9C: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0x20 + strh r0, [r4] + mov r3, #0 + add r0, r5, #8 + add r1, r4, #8 + mov r2, #0xb4 + strh r3, [r4, #2] + bl __VENEER_MIi_CpuCopy16 + mov r0, r4 + bl __VENEER_WMSP_ReturnResult2Wm9 +_06005CCC: + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end WMSP_GetWirelessCounter + + arm_func_start WMSP_InitVAlarm +WMSP_InitVAlarm: ; 0x06005CD8 + ldr ip, _06005CE4 ; =OS_CreateVAlarm + ldr r0, _06005CE8 ; =wmspVAlarm + bx ip + .align 2, 0 +_06005CE4: .word OS_CreateVAlarm +_06005CE8: .word wmspVAlarm + arm_func_end WMSP_InitVAlarm + + arm_func_start WMSP_CancelVAlarm +WMSP_CancelVAlarm: ; 0x06005CEC + ldr ip, _06005CF8 ; =OS_CancelVAlarm + ldr r0, _06005CFC ; =wmspVAlarm + bx ip + .align 2, 0 +_06005CF8: .word OS_CancelVAlarm +_06005CFC: .word wmspVAlarm + arm_func_end WMSP_CancelVAlarm + + arm_func_start WMSP_SetVAlarm +WMSP_SetVAlarm: ; 0x06005D00 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r1, _06005DA0 ; =wmspW + 0x1000 + ldr r0, _06005DA4 ; =wmspVAlarm + ldr r4, [r1, #0x550] + ldrh r1, [r4, #0xe6] + cmp r1, #1 + bne _06005D50 + ldr r1, [r0] + cmp r1, #0 + beq _06005D30 + bl __VENEER_OS_CancelVAlarm +_06005D30: + ldr r0, _06005DA4 ; =wmspVAlarm + mov r1, #0xcb + mov ip, #3 + ldr r3, _06005DA8 ; =WmspParentAdjustVSync + add r2, r1, #0x3c + str ip, [sp] + bl __VENEER_OS_SetVAlarm + b _06005D94 +_06005D50: + cmp r1, #2 + bne _06005D94 + mov r1, #0 + str r1, [r4, #0x1c] + ldr r1, [r0] + cmp r1, #0 + beq _06005D70 + bl __VENEER_OS_CancelVAlarm +_06005D70: + ldr r0, _06005DA4 ; =wmspVAlarm + mov r2, #1 + mov r1, #0xc8 + ldr r3, _06005DAC ; =WmspChildAdjustVSync1 + str r2, [sp] + add r2, r1, #0x3f + bl __VENEER_OS_SetVAlarm + mov r0, #0 + str r0, [r4, #0xd8] +_06005D94: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_06005DA0: .word wmspW + 0x1000 +_06005DA4: .word wmspVAlarm +_06005DA8: .word WmspParentAdjustVSync +_06005DAC: .word WmspChildAdjustVSync1 + arm_func_end WMSP_SetVAlarm + + arm_func_start __VENEER_OS_CancelVAlarm +__VENEER_OS_CancelVAlarm: ; 0x06005DB0 + ldr pc, _06005DB4 ; =OS_CancelVAlarm + .align 2, 0 +_06005DB4: .word OS_CancelVAlarm + arm_func_end __VENEER_OS_CancelVAlarm + + arm_func_start __VENEER_OS_SetVAlarm +__VENEER_OS_SetVAlarm: ; 0x06005DB8 + ldr pc, _06005DBC ; =OS_SetVAlarm + .align 2, 0 +_06005DBC: .word OS_SetVAlarm + arm_func_end __VENEER_OS_SetVAlarm + + arm_func_start WmspChildAdjustVSync1 +WmspChildAdjustVSync1: ; 0x06005DC0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r1, _06005EFC ; =wmspW + 0x1000 + ldr r2, _06005F00 ; =0x0380FFF0 + ldr r0, [r1, #0x550] + ldrh r3, [r2] + str r3, [r0, #0xd0] + ldr r2, [r0, #0xd4] + cmp r2, r3 + beq _06005EA0 + str r3, [r0, #0xd4] + ldr r1, [r1, #0x550] + ldr r3, _06005F04 ; =0x048080F8 + ldr r2, [r1, #0xd0] + mov r2, r2, lsl #6 + str r2, [r1, #0xd0] + ldrh r2, [r3] + ldrh lr, [r3, #2] + ldrh r4, [r3] + cmp r2, r4 + ldrhih lr, [r3, #2] + ldr r3, _06005F08 ; =0x04000006 + ldr r2, _06005F0C ; =0x00000107 + ldrh ip, [r3] + ldr r3, _06005F10 ; =0x003FFFC0 + sub ip, r2, ip + orr lr, r4, lr, lsl #16 + ldr r2, [r1, #0xd0] + and lr, lr, r3 + rsb ip, ip, ip, lsl #7 + add ip, ip, lr, lsl #1 + and lr, r3, ip, lsr #1 + cmp r2, lr + movhi r2, #0 + strhi r2, [r1, #0xd8] + bhi _06005EA0 + mov ip, #1 + b _06005E90 +_06005E58: + ldr r2, [r1, #0xd0] + add r2, r2, #0x4b + add r3, r2, #0x4100 + str r3, [r1, #0xd0] + cmp r3, lr + bls _06005E8C + ldr r2, _06005F14 ; =0x0000400E + sub r3, r3, lr + cmp r3, r2 + str r3, [r1, #0xd8] + movhi r2, #0 + strhi r2, [r1, #0xd8] + b _06005EA0 +_06005E8C: + add ip, ip, #1 +_06005E90: + cmp ip, #0x1e + blt _06005E58 + mov r2, #0 + str r2, [r1, #0xd8] +_06005EA0: + ldr r1, [r0, #0xd8] + cmp r1, #0x7f + bls _06005ECC + ldr r0, _06005F18 ; =wmspVAlarm + mov r1, #0xd0 + mov ip, #2 + ldr r3, _06005F1C ; =WmspChildAdjustVSync2 + add r2, r1, #0x37 + str ip, [sp] + bl __VENEER_OS_SetVAlarm + b _06005EF0 +_06005ECC: + mov r2, #1 + str r2, [r0, #0x1c] + mov r1, #4 + str r1, [sp] + ldrsh r1, [r0, #0x42] + ldr r0, _06005F18 ; =wmspVAlarm + ldr r3, _06005F20 ; =WmspChildVAlarmMP + rsb r2, r2, #0x108 + bl __VENEER_OS_SetVAlarm +_06005EF0: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_06005EFC: .word wmspW + 0x1000 +_06005F00: .word 0x0380FFF0 +_06005F04: .word 0x048080F8 +_06005F08: .word 0x04000006 +_06005F0C: .word 0x00000107 +_06005F10: .word 0x003FFFC0 +_06005F14: .word 0x0000400E +_06005F18: .word wmspVAlarm +_06005F1C: .word WmspChildAdjustVSync2 +_06005F20: .word WmspChildVAlarmMP + arm_func_end WmspChildAdjustVSync1 + + arm_func_start WmspChildAdjustVSync2 +WmspChildAdjustVSync2: ; 0x06005F24 + stmdb sp!, {r3, lr} + ldr r1, _06005FD0 ; =0x04000006 + ldr r0, _06005FD4 ; =wmspW + 0x1000 + ldrh ip, [r1] + ldr r0, [r0, #0x550] + cmp ip, #0xd0 + blt _06005F9C + cmp ip, #0xd2 + bge _06005F9C + ldr r1, [r0, #0xd8] + cmp r1, #0x7f + blo _06005F9C + mov r3, #1 + b _06005F74 +_06005F5C: + ldr r2, [r0, #0xd8] + rsb r1, r3, r3, lsl #6 + add r1, r1, #0x7f + cmp r2, r1 + blo _06005F7C + add r3, r3, #1 +_06005F74: + cmp r3, #7 + blt _06005F5C +_06005F7C: + ldr r1, _06005FD0 ; =0x04000006 + rsb r2, r3, #1 + add r2, ip, r2 + strh r2, [r1] + ldr r2, [r0, #0xd8] + rsb r1, r3, r3, lsl #6 + sub r1, r2, r1 + str r1, [r0, #0xd8] +_06005F9C: + ldr r1, [r0, #0xd8] + ldr r2, _06005FD8 ; =0x00000107 + cmp r1, #0x7f + movhs r1, #0 + strhs r1, [r0, #0x1c] + mov r1, #4 + str r1, [sp] + ldrsh r1, [r0, #0x42] + ldr r0, _06005FDC ; =wmspVAlarm + ldr r3, _06005FE0 ; =WmspChildVAlarmMP + bl __VENEER_OS_SetVAlarm + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06005FD0: .word 0x04000006 +_06005FD4: .word wmspW + 0x1000 +_06005FD8: .word 0x00000107 +_06005FDC: .word wmspVAlarm +_06005FE0: .word WmspChildVAlarmMP + arm_func_end WmspChildAdjustVSync2 + + arm_func_start WmspChildVAlarmMP +WmspChildVAlarmMP: ; 0x06005FE4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _060060E8 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + ldr r0, [r4, #0xc] + cmp r0, #1 + bne _060060DC + ldr r0, _060060EC ; =wmspVAlarm + mov r2, #1 + mov r1, #0xc8 + ldr r3, _060060F0 ; =WmspChildAdjustVSync1 + str r2, [sp] + add r2, r1, #0x3f + bl __VENEER_OS_SetVAlarm + ldr r0, [r4, #0x7bc] + ldr r1, [r4, #0x7b8] + cmp r0, #0 + cmpeq r1, #0 + beq _060060D8 + bl __VENEER_OS_GetTick + ldr r3, [r4, #0x73c] + ldr ip, [r4, #0x738] + cmp r3, #0 + cmpeq ip, #0 + orr lr, r1, #0 + orr r1, r0, #1 + mov r0, #0 + beq _060060D8 + ldr r2, [r4, #0x7b8] + subs ip, r1, ip + ldr r1, [r4, #0x7bc] + sbc r3, lr, r3 + cmp r3, r1 + cmpeq ip, r2 + bls _060060D8 + str r0, [r4, #0x738] + str r0, [r4, #0x73c] + bl WMSP_GetInternalRequestBuf + movs r1, r0 + moveq r0, #0 + beq _060060A4 + mov r0, #0x25 + str r0, [r1] + ldr r3, _060060F4 ; =0x00008001 + mov r2, #0 + ldr r0, _060060F8 ; =wmspW + 0x88 + stmib r1, {r2, r3} + bl __VENEER_OS_SendMessage +_060060A4: + cmp r0, #0 + bne _060060DC + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x25 + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060060DC +_060060D8: + bl WmspFromVAlarmToWmspThread +_060060DC: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_060060E8: .word wmspW + 0x1000 +_060060EC: .word wmspVAlarm +_060060F0: .word WmspChildAdjustVSync1 +_060060F4: .word 0x00008001 +_060060F8: .word wmspW + 0x88 + arm_func_end WmspChildVAlarmMP + + arm_func_start WmspParentAdjustVSync +WmspParentAdjustVSync: ; 0x060060FC + stmdb sp!, {r3, lr} + ldr r0, _0600619C ; =wmspW + 0x1000 + ldr r0, [r0, #0x550] + ldrh r1, [r0, #0xdc] + cmp r1, #0x3c + blo _06006138 + ldr r2, _060061A0 ; =0x04000006 + ldrh r1, [r2] + cmp r1, #0xcb + blt _06006140 + cmp r1, #0xd2 + strlth r1, [r2] + movlt r1, #0 + strlth r1, [r0, #0xdc] + b _06006140 +_06006138: + add r1, r1, #1 + strh r1, [r0, #0xdc] +_06006140: + ldr r1, _060061A0 ; =0x04000006 + ldr r2, _060061A4 ; =0x048080F8 + ldrh lr, [r1] + ldrh r1, [r2] + ldrh r3, [r2, #2] + ldrh ip, [r2] + cmp r1, ip + ldrhih r3, [r2, #2] + ldr r1, _060061A8 ; =0x0380FFF0 + orr r3, ip, r3, lsl #16 + rsb r2, lr, lr, lsl #7 + rsb r2, r2, r3, lsl #1 + mov r3, r2, lsr #7 + strh r3, [r1] + mov r2, #5 + str r2, [sp] + ldrsh r1, [r0, #0x40] + ldr r0, _060061AC ; =wmspVAlarm + ldr r3, _060061B0 ; =WmspParentVAlarmMP + rsb r2, r2, #0x10c + bl __VENEER_OS_SetVAlarm + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600619C: .word wmspW + 0x1000 +_060061A0: .word 0x04000006 +_060061A4: .word 0x048080F8 +_060061A8: .word 0x0380FFF0 +_060061AC: .word wmspVAlarm +_060061B0: .word WmspParentVAlarmMP + arm_func_end WmspParentAdjustVSync + + arm_func_start WmspParentVAlarmMP +WmspParentVAlarmMP: ; 0x060061B4 + stmdb sp!, {r3, lr} + ldr r0, _060061F4 ; =wmspW + 0x1000 + ldr r0, [r0, #0x550] + ldr r0, [r0, #0xc] + cmp r0, #1 + bne _060061EC + ldr r0, _060061F8 ; =wmspVAlarm + mov r1, #0xcb + mov ip, #3 + ldr r3, _060061FC ; =WmspParentAdjustVSync + add r2, r1, #0x3c + str ip, [sp] + bl __VENEER_OS_SetVAlarm + bl WmspFromVAlarmToWmspThread +_060061EC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060061F4: .word wmspW + 0x1000 +_060061F8: .word wmspVAlarm +_060061FC: .word WmspParentAdjustVSync + arm_func_end WmspParentVAlarmMP + + arm_func_start WmspFromVAlarmToWmspThread +WmspFromVAlarmToWmspThread: ; 0x06006200 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _060062A8 ; =wmspW + 0x1000 + ldr r4, _060062AC ; =wmspW + ldr r5, [r0, #0x550] + bl __VENEER_OS_DisableInterrupts + ldrh r1, [r5, #0xce] + cmp r1, #1 + bne _06006228 + bl __VENEER_OS_RestoreInterrupts + b _060062A0 +_06006228: + mov r1, #1 + strh r1, [r5, #0xce] + bl __VENEER_OS_RestoreInterrupts + bl WMSP_GetInternalRequestBuf + movs r1, r0 + moveq r0, #0 + beq _06006258 + mov r3, #0x1c + add r0, r4, #0x88 + mov r2, #0 + str r3, [r1] + bl __VENEER_OS_SendMessage +_06006258: + cmp r0, #0 + bne _060062A0 + mov r0, #0 + strh r0, [r5, #0xce] + add r0, r4, #0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + beq _060062A0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x80 + strh r1, [r0] + mov r1, #8 + strh r1, [r0, #2] + mov r1, #0x16 + strh r1, [r0, #4] + mov r1, #0x1c + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060062A0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060062A8: .word wmspW + 0x1000 +_060062AC: .word wmspW + arm_func_end WmspFromVAlarmToWmspThread + + arm_func_start WMSP_VAlarmSetMPData +WMSP_VAlarmSetMPData: ; 0x060062B0 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _06006448 ; =wmspW + 0x1000 + mov r1, #0 + ldr r4, [r0, #0x550] + mov r2, #1 + strh r1, [r4, #0xce] + strh r2, [r4, #0x88] + ldrh r0, [r4, #0xc0] + sub r0, r0, #1 + strh r0, [r4, #0xc0] + ldrh r0, [r4, #0xc0] + cmp r0, #0 + bne _0600631C + ldrh r1, [r4, #0xbe] + rsb r0, r2, #0x10000 + cmp r1, r0 + moveq r0, #4 + streqh r0, [r4, #0xbe] + ldrh r0, [r4, #0xbe] + and r0, r0, #0xff + bl WMSP_AddRssiToList + bl WMSP_GetAverageLinkLevel + strh r0, [r4, #0xbc] + ldr r1, _0600644C ; =0x0000FFFF + mov r0, #1 + strh r1, [r4, #0xbe] + strh r0, [r4, #0xc0] +_0600631C: + ldrh r0, [r4] + cmp r0, #9 + bne _0600640C + bl __VENEER_OS_DisableInterrupts + add r1, r4, #0x100 + ldrh r1, [r1, #0x82] + cmp r1, #0 + bne _0600634C + mov r1, #0 + strh r1, [r4, #0x62] + bl __VENEER_OS_RestoreInterrupts + b _06006440 +_0600634C: + ldrsh r2, [r4, #0x62] + mov r3, #1 + cmp r2, #0 + ldrgtsh r1, [r4, #0x64] + cmpgt r1, #0 + movgt r3, #0 + cmp r2, #0 + movlt r1, #0 + strlth r1, [r4, #0x62] + add r1, r4, #0x700 + ldrsh r2, [r4, #0x62] + ldrsh r1, [r1, #0xc2] + add r1, r2, r1 + strh r1, [r4, #0x62] + ldrsh r1, [r4, #0x62] + cmp r1, #0x100 + movgt r1, #0x100 + strgth r1, [r4, #0x62] + add r1, r4, #0x700 + ldrh r1, [r1, #0xc4] + cmp r3, #0 + strh r1, [r4, #0x64] + beq _060063C0 + ldrsh r1, [r4, #0x62] + cmp r1, #0 + ldrgtsh r1, [r4, #0x64] + cmpgt r1, #0 + movgt r5, #1 + bgt _060063C4 +_060063C0: + mov r5, #0 +_060063C4: + bl __VENEER_OS_RestoreInterrupts + cmp r5, #0 + beq _060063D8 + ldr r0, _0600644C ; =0x0000FFFF + bl WMSP_SendMaMP +_060063D8: + add r0, r4, #0x700 + ldrh r0, [r0, #0xc6] + cmp r0, #1 + ldreqh r0, [r4, #0xa0] + subeq r0, r0, #1 + streqh r0, [r4, #0xa0] + ldreqh r0, [r4, #0xa0] + cmpeq r0, #0 + moveq r0, #1 + streqh r0, [r4, #0x9e] + moveq r0, #0x3c + streqh r0, [r4, #0xa0] + b _06006440 +_0600640C: + cmp r0, #0xa + bne _06006440 + mov r5, #0 + bl __VENEER_OS_DisableInterrupts + ldr r1, [r4, #0x734] + cmp r1, #1 + movne r1, r5 + movne r5, #1 + strneh r1, [r4, #0x60] + bl __VENEER_OS_RestoreInterrupts + cmp r5, #1 + bne _06006440 + bl WMSP_SendMaKeyData +_06006440: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06006448: .word wmspW + 0x1000 +_0600644C: .word 0x0000FFFF + arm_func_end WMSP_VAlarmSetMPData + + arm_func_start WMSP_KickNextMP_Parent +WMSP_KickNextMP_Parent: ; 0x06006450 + stmdb sp!, {r3, lr} + ldr r1, _06006480 ; =wmspW + 0x1000 + ldr r1, [r1, #0x550] + ldrh r1, [r1] + cmp r1, #9 + bne _06006478 + ldr r0, [r0, #4] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_SendMaMP +_06006478: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06006480: .word wmspW + 0x1000 + arm_func_end WMSP_KickNextMP_Parent + + arm_func_start WMSP_KickNextMP_Child +WMSP_KickNextMP_Child: ; 0x06006484 + stmdb sp!, {r3, lr} + ldr r0, _060064A8 ; =wmspW + 0x1000 + ldr r0, [r0, #0x550] + ldrh r0, [r0] + cmp r0, #0xa + bne _060064A0 + bl WMSP_SendMaKeyData +_060064A0: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060064A8: .word wmspW + 0x1000 + arm_func_end WMSP_KickNextMP_Child + + arm_func_start WMSP_KickNextMP_Resume +WMSP_KickNextMP_Resume: ; 0x060064AC + stmdb sp!, {r3, lr} + ldr r1, _060064DC ; =wmspW + 0x1000 + ldr r1, [r1, #0x550] + ldrh r1, [r1] + cmp r1, #9 + bne _060064D4 + ldr r0, [r0, #4] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WMSP_ResumeMaMP +_060064D4: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060064DC: .word wmspW + 0x1000 + arm_func_end WMSP_KickNextMP_Resume + + arm_func_start WMSP_InitSendQueue +WMSP_InitSendQueue: ; 0x060064E0 + stmdb sp!, {r4, lr} + ldr r0, _06006590 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + add r0, r4, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_LockMutex + add r1, r4, #0x2f8 + mov r0, #0 + mov r2, #0x400 + bl __VENEER_MIi_CpuClear16 + mov r3, #0 +_0600650C: + add r0, r3, #1 + mov r0, r0, lsl #0x10 + add r1, r4, r3, lsl #5 + mov r3, r0, lsr #0x10 + add r0, r1, #0x200 + strh r3, [r0, #0xf8] + cmp r3, #0x1f + blo _0600650C + ldr r2, _06006594 ; =0x0000FFFF + add r0, r4, r3, lsl #5 + add r0, r0, #0x200 + strh r2, [r0, #0xf8] + add r0, r4, #0x600 + mov ip, #0 + strh ip, [r0, #0xf8] + strh r3, [r0, #0xfa] +_0600654C: + add r1, r4, ip, lsl #2 + add r0, r1, #0x700 + strh r2, [r0, #0xc] + strh r2, [r0, #0xe] + add r0, r1, #0x600 + add r1, ip, #1 + strh r2, [r0, #0xfc] + mov r1, r1, lsl #0x10 + mov ip, r1, lsr #0x10 + strh r2, [r0, #0xfe] + cmp ip, #4 + blo _0600654C + add r0, r4, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06006590: .word wmspW + 0x1000 +_06006594: .word 0x0000FFFF + arm_func_end WMSP_InitSendQueue + + arm_func_start __VENEER_OS_LockMutex +__VENEER_OS_LockMutex: ; 0x06006598 + ldr pc, _0600659C ; =OS_LockMutex + .align 2, 0 +_0600659C: .word OS_LockMutex + arm_func_end __VENEER_OS_LockMutex + + arm_func_start __VENEER_OS_UnlockMutex +__VENEER_OS_UnlockMutex: ; 0x060065A0 + ldr pc, _060065A4 ; =OS_UnlockMutex + .align 2, 0 +_060065A4: .word OS_UnlockMutex + arm_func_end __VENEER_OS_UnlockMutex + + arm_func_start WMSP_SendMaKeyData +WMSP_SendMaKeyData: ; 0x060065A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x260 + ldr r1, _06006A98 ; =wmspW + 0x1000 + ldr fp, [r1, #0x550] + add r0, fp, #0x100 + ldrh r0, [r0, #0x82] + cmp r0, #0 + beq _06006A8C + mov r0, #1 + strh r0, [fp, #0x8a] + str r0, [sp, #0x14] + mov r0, #0 + strh r0, [sp, #0x5c] + ldr r8, [r1, #0x550] + add r1, sp, #0x5c + ldrh sb, [r8, #0x38] + str r1, [sp, #0x34] + add r1, sb, #0x1f + ldrh r2, [r8, #0x80] + bic r1, r1, #0x1f + ldr r7, [r8, #0x7c] + cmp r2, r1 + blt _06006A38 + add r1, r8, #0x100 + ldrh r1, [r1, #0x88] + cmp r1, #0x10 + bhs _06006A38 + ldrh r1, [r8] + cmp r1, #9 + beq _0600662C + cmp r1, #0xa + streq r0, [sp, #0x14] + bne _06006A38 +_0600662C: + ldr r0, [sp, #0x34] + mov r6, #0 + strh r6, [r0] + mov r0, #1 + cmp sb, #0 + strlt r0, [sp, #0x14] + blt _06006A38 + str r0, [sp, #0x18] + ldr r0, [sp, #0x14] + cmp r0, #0 + beq _0600666C + add r0, r8, #0x700 + ldrh r0, [r0, #0xc6] + cmp r0, #0 + strne r6, [sp, #0x18] + b _06006670 +_0600666C: + str r6, [sp, #0x18] +_06006670: + add r0, r8, #0x31c + mov r1, #0 + str r1, [sp, #0xc] + mov r1, #1 + add r0, r0, #0x400 + str r1, [sp, #0x10] + bl __VENEER_OS_LockMutex + ldr r0, [r8, #0x734] + cmp r0, #1 + bne _060066B0 + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + mov r0, #1 + str r0, [sp, #0x14] + b _06006A38 +_060066B0: + mov r0, #1 + str r0, [r8, #0x734] + add r0, r8, #0x2f8 + str r0, [sp, #0x1c] + mov r5, #0 + b _06006A14 +_060066C8: + add r0, r8, #0x30c + add r0, r0, #0x400 + mov r1, r5, lsl #2 + ldrh sl, [r0, r1] + add r0, r0, r5, lsl #2 + str r0, [sp, #0x20] + add r0, r8, #0x2fc + add r0, r0, #0x400 + add r0, r0, r5, lsl #2 + str r0, [sp, #0x24] + ldr r0, [sp, #0x20] + str r0, [sp, #0x28] + ldr r0, _06006A9C ; =0x0000FFFF + str r0, [sp, #0x2c] + str r0, [sp, #0x38] + str r0, [sp, #0x3c] + add r0, r8, #0x100 + str r0, [sp, #0x40] + ldr r0, [sp, #0x2c] + sub r0, r0, #0x8000 + str r0, [sp, #0x44] + ldr r0, [sp, #0x2c] + str r0, [sp, #0x48] + add r0, r8, #0x700 + str r0, [sp, #0x4c] + ldr r0, [sp, #0x2c] + str r0, [sp, #0x50] + str r0, [sp, #0x54] + str r0, [sp, #0x58] + b _060069FC +_06006740: + ldr r0, [sp, #0x1c] + ldr r2, [sp, #0xc] + add r4, r0, sl, lsl #5 + ldrh r0, [r4, #2] + mov r1, #1 + str r0, [sp, #8] + tst r2, r1, lsl r0 + bne _060069C0 + ldr r0, [sp, #0x18] + cmp r0, #0 + ldr r0, [sp, #8] + orr r0, r2, r1, lsl r0 + str r0, [sp, #0xc] + ldrh r0, [r4, #6] + and r1, r0, r1 + str r1, [sp, #0x30] + beq _0600678C + bics r1, r1, #1 + bne _060069C0 +_0600678C: + ldr r1, [sp, #8] + tst r1, #8 + movne r1, #1 + strne r1, [sp, #4] + moveq r1, #0 + streq r1, [sp, #4] + ldr r1, [sp, #0x14] + cmp r1, #0 + orrne r1, r0, #1 + ldrne r0, [sp, #0x3c] + cmpne r1, r0 + movne r0, #1 + strne r0, [sp] + moveq r0, #0 + streq r0, [sp] + ldrh r0, [r4, #0xe] + and r1, r0, #1 + cmp r1, #1 + addeq r0, r0, #1 + streqh r0, [r4, #0xe] + ldr r0, [sp, #4] + ldr r1, [sp, #0x10] + cmp r0, #0 + movne r0, #2 + moveq r0, #0 + cmp r1, #0 + movne r3, #0 + ldr r1, [sp] + moveq r3, #2 + ldrh r2, [r4, #0xe] + cmp r1, #0 + movne r1, #2 + add r2, r2, r3 + moveq r1, #0 + add r0, r2, r0 + add r0, r1, r0 + cmp r0, sb + bgt _060069C0 + ldr r0, [sp, #0x10] + cmp r0, #0 + streq r7, [sp, #0x34] + moveq r0, #0 + streqh r0, [r7], #2 + ldr r0, [sp, #0x34] + ldrh r2, [r4, #2] + ldrh r1, [r4, #0xe] + mov r2, r2, lsl #8 + mov r1, r1, lsr #1 + ldrh r0, [r0] + and r2, r2, #0xf00 + and r1, r1, #0xff + orr r1, r2, r1 + orr r1, r0, r1 + ldr r0, [sp, #0x34] + addeq r6, r6, #2 + strh r1, [r0] + ldr r0, [r4, #0x14] + ldrh r2, [r4, #0xe] + mov r1, r7 + subeq sb, sb, #2 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldr r0, [sp, #4] + add r6, r6, r1 + cmp r0, #1 + bic r0, r1, #1 + add r7, r7, r0 + sub sb, sb, r1 + bne _060068F4 + ldrh r0, [r4, #0x10] + tst r0, #1 + moveq r2, r0, asr #1 + beq _060068E0 + ldr r0, [sp, #0x40] + ldrh r1, [r4, #2] + ldrh r0, [r0, #0x88] + mov r1, r1, lsl #0x1d + add r0, r8, r0, lsl #4 + add r0, r0, r1, lsr #28 + add r0, r0, #0x100 + ldrh r2, [r0, #0xf8] + add r1, r2, #1 + strh r1, [r0, #0xf8] + mov r0, r2, lsl #1 + strh r0, [r4, #0x10] +_060068E0: + ldr r0, [sp, #0x44] + add r6, r6, #2 + and r0, r2, r0 + strh r0, [r7], #2 + sub sb, sb, #2 +_060068F4: + ldr r0, [sp] + cmp r0, #1 + bne _06006924 + ldr r0, [sp, #0x34] + add r6, r6, #2 + ldrh r0, [r0] + sub sb, sb, #2 + orr r1, r0, #0x1000 + ldr r0, [sp, #0x34] + strh r1, [r0] + ldrh r0, [r4, #6] + strh r0, [r7], #2 +_06006924: + ldr r0, [sp, #0x10] + cmp r0, #1 + moveq r0, #0 + streq r0, [sp, #0x10] + ldr r0, [sp, #0x20] + ldrh r0, [r0, #2] + cmp r0, sl + ldreq r1, [sp, #0x2c] + ldreq r0, [sp, #0x20] + streqh r1, [r0, #2] + ldrh r1, [r4] + ldr r0, [sp, #0x28] + strh r1, [r0] + ldr r0, [sp, #0x38] + strh r0, [r4] + ldr r0, [sp, #0x24] + ldrh r1, [r0, #2] + ldr r0, [sp, #0x48] + cmp r1, r0 + ldreq r0, [sp, #0x24] + movne r1, r1, lsl #5 + streqh sl, [r0] + ldrne r0, [sp, #0x1c] + strneh sl, [r0, r1] + ldr r0, [sp, #8] + mov r1, #1 + mvn r1, r1, lsl r0 + ldr r0, [sp, #0xc] + and r0, r0, r1 + str r0, [sp, #0xc] + ldr r0, [sp, #0x24] + strh sl, [r0, #2] + ldr r0, [sp, #0x30] + ldr sl, [sp, #0x2c] + strh r0, [r4, #0xa] + ldr r0, [sp, #0x4c] + ldrh r0, [r0, #0xc8] + cmp r0, #1 + beq _06006A24 +_060069C0: + ldr r0, [sp, #0x50] + str sl, [sp, #0x2c] + cmp sl, r0 + ldrne r0, [sp, #0x1c] + addne r0, r0, sl, lsl #5 + strne r0, [sp, #0x28] + ldreq r0, [sp, #0x20] + streq r0, [sp, #0x28] + ldr r0, [sp, #0x54] + cmp sl, r0 + ldrne r0, [sp, #0x1c] + movne r1, sl, lsl #5 + ldrneh sl, [r0, r1] + ldreq r0, [sp, #0x20] + ldreqh sl, [r0] +_060069FC: + ldr r0, [sp, #0x58] + cmp sl, r0 + beq _06006A10 + cmp sb, #2 + bgt _06006740 +_06006A10: + add r5, r5, #1 +_06006A14: + cmp r5, #4 + bhs _06006A24 + cmp sb, #2 + bgt _060066C8 +_06006A24: + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + mov r0, #0 + str r0, [sp, #0x14] +_06006A38: + ldr r0, [sp, #0x14] + cmp r0, #1 + moveq r0, #0 + streqh r0, [fp, #0x8a] + beq _06006A8C + ldr r0, [fp, #0x1c] + mov r1, r6, lsl #0x10 + cmp r0, #1 + ldreqh r0, [sp, #0x5c] + mov r1, r1, lsr #0x10 + orreq r0, r0, #0x8000 + streqh r0, [sp, #0x5c] + ldrh r2, [sp, #0x5c] + ldr r3, [fp, #0x7c] + add r0, sp, #0x60 + bl WMSP_WL_MaKeyData + ldrh r0, [r0, #4] + cmp r0, #0 + cmpne r0, #8 + movne r0, #0 + strneh r0, [fp, #0x8a] +_06006A8C: + add sp, sp, #0x260 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06006A98: .word wmspW + 0x1000 +_06006A9C: .word 0x0000FFFF + arm_func_end WMSP_SendMaKeyData + + arm_func_start WMSP_SendMaMP +WMSP_SendMaMP: ; 0x06006AA0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c8 + ldr r1, _06007438 ; =wmspW + 0x1000 + str r0, [sp, #0x18] + ldr r7, [r1, #0x550] + bl __VENEER_OS_DisableInterrupts + add r1, r7, #0x100 + ldrh r1, [r1, #0x82] + ldrh r4, [r7, #0x86] + str r1, [sp, #0x74] + bl __VENEER_OS_RestoreInterrupts + mov r1, #0 + strh r1, [sp, #0xc4] + ldrh r0, [r7, #0x88] + cmp r0, #1 + ldreq r0, _0600743C ; =0x0000FFFF + streq r0, [sp, #0x18] + streqh r1, [r7, #0x88] + ldrh r0, [r7, #0x9e] + cmp r0, #0 + bne _06007388 + ldr r1, _06007438 ; =wmspW + 0x1000 + ldrh r0, [r7, #0x3a] + ldr r8, [r1, #0x550] + str r0, [sp, #0x24] + add r0, sp, #0xc4 + ldrh sb, [r8, #0x38] + str r0, [sp, #0x70] + add r0, sb, #0x1f + ldrh r1, [r8, #0x80] + bic r0, r0, #0x1f + cmp r1, r0 + ldr r6, [r8, #0x7c] + movlt r0, #1 + blt _06006FC8 + add r0, r8, #0x100 + ldrh r0, [r0, #0x88] + cmp r0, #0x10 + movhs r0, #1 + bhs _06006FC8 + ldrh r0, [r8] + cmp r0, #9 + moveq r0, #1 + streq r0, [sp, #0x48] + beq _06006B6C + cmp r0, #0xa + moveq r0, #0 + streq r0, [sp, #0x48] + beq _06006B6C + mov r0, #1 + b _06006FC8 +_06006B6C: + ldr r0, [sp, #0x70] + mov r5, #0 + mov sl, r5 + mov fp, r5 + strh r5, [r0] + cmp sb, #0 + movlt r0, #1 + blt _06006FC8 + ldr r0, [sp, #0x48] + str r4, [sp, #0x50] + cmp r0, #0 + mov r0, #1 + str r0, [sp, #0x4c] + beq _06006BC0 + add r0, r8, #0x700 + ldrh r0, [r0, #0xc6] + cmp r0, #0 + ldrne r0, [sp, #0x74] + strne r5, [sp, #0x4c] + strne r0, [sp, #0x50] + b _06006BC4 +_06006BC0: + str r5, [sp, #0x4c] +_06006BC4: + ldr r0, [sp, #0x18] + and r4, r4, r0 + mov r0, #0 + str r0, [sp, #0x40] + mov r0, #1 + str r0, [sp, #0x44] + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_LockMutex + ldr r0, [r8, #0x734] + cmp r0, #1 + bne _06006C08 + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + mov r0, #1 + b _06006FC8 +_06006C08: + mvn r0, r4 + str r0, [sp, #0x2c] + mov r0, #1 + str r0, [r8, #0x734] + add r0, r8, #0x2f8 + str r0, [sp, #0x54] + mov r0, #0 + str r0, [sp, #0x58] + b _06006FA0 +_06006C2C: + ldr r0, [sp, #0x58] + mov r2, r0, lsl #2 + add r0, r8, #0x30c + add r1, r0, #0x400 + ldr r0, [sp, #0x58] + ldrh sl, [r1, r2] + add r0, r1, r0, lsl #2 + str r0, [sp, #0x5c] + add r0, r8, #0x2fc + add r1, r0, #0x400 + ldr r0, [sp, #0x58] + add r0, r1, r0, lsl #2 + str r0, [sp, #0x60] + ldr r0, [sp, #0x5c] + str r0, [sp, #0x64] + ldr r0, _0600743C ; =0x0000FFFF + str r0, [sp, #0x68] + str r0, [sp, #0x78] + str r0, [sp, #0x8c] + add r0, r8, #0x100 + str r0, [sp, #0x90] + ldr r0, [sp, #0x68] + sub r0, r0, #0x8000 + str r0, [sp, #0x94] + ldr r0, [sp, #0x68] + str r0, [sp, #0x98] + add r0, r8, #0x700 + str r0, [sp, #0x9c] + ldr r0, [sp, #0x68] + str r0, [sp, #0xa0] + str r0, [sp, #0xa4] + str r0, [sp, #0xa8] + b _06006F80 +_06006CB0: + ldr r0, [sp, #0x54] + ldr r2, [sp, #0x40] + add r4, r0, sl, lsl #5 + ldrh r0, [r4, #2] + mov r1, #1 + str r0, [sp, #0x28] + tst r2, r1, lsl r0 + bne _06006F44 + ldr r0, [sp, #0x4c] + cmp r0, #0 + ldr r0, [sp, #0x28] + orr r0, r2, r1, lsl r0 + str r0, [sp, #0x40] + ldrh r0, [r4, #6] + ldr r1, [sp, #0x50] + and r1, r0, r1 + str r1, [sp, #0x6c] + beq _06006D08 + mov r2, r1 + ldr r1, [sp, #0x2c] + tst r2, r1 + bne _06006F44 +_06006D08: + ldr r1, [sp, #0x28] + tst r1, #8 + movne r1, #1 + strne r1, [sp, #0x20] + moveq r1, #0 + streq r1, [sp, #0x20] + ldr r1, [sp, #0x48] + cmp r1, #0 + orrne r1, r0, #1 + ldrne r0, [sp, #0x8c] + cmpne r1, r0 + movne r0, #1 + strne r0, [sp, #0x1c] + moveq r0, #0 + streq r0, [sp, #0x1c] + ldrh r0, [r4, #0xe] + and r1, r0, #1 + cmp r1, #1 + addeq r0, r0, #1 + streqh r0, [r4, #0xe] + ldr r0, [sp, #0x20] + ldr r1, [sp, #0x44] + cmp r0, #0 + movne r0, #2 + moveq r0, #0 + cmp r1, #0 + movne r3, #0 + ldr r1, [sp, #0x1c] + moveq r3, #2 + ldrh r2, [r4, #0xe] + cmp r1, #0 + movne r1, #2 + add r2, r2, r3 + moveq r1, #0 + add r0, r2, r0 + add r0, r1, r0 + cmp r0, sb + bgt _06006F44 + ldr r0, [sp, #0x44] + cmp r0, #0 + streq r6, [sp, #0x70] + moveq r0, #0 + streqh r0, [r6], #2 + ldr r0, [sp, #0x70] + ldrh r2, [r4, #2] + ldrh r1, [r4, #0xe] + mov r2, r2, lsl #8 + mov r1, r1, lsr #1 + ldrh r0, [r0] + and r2, r2, #0xf00 + and r1, r1, #0xff + orr r1, r2, r1 + orr r1, r0, r1 + ldr r0, [sp, #0x70] + addeq fp, fp, #2 + strh r1, [r0] + ldr r0, [r4, #0x14] + ldrh r2, [r4, #0xe] + mov r1, r6 + subeq sb, sb, #2 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + ldr r0, [sp, #0x20] + add fp, fp, r1 + cmp r0, #1 + bic r0, r1, #1 + add r6, r6, r0 + sub sb, sb, r1 + bne _06006E70 + ldrh r0, [r4, #0x10] + tst r0, #1 + moveq r2, r0, asr #1 + beq _06006E5C + ldr r0, [sp, #0x90] + ldrh r1, [r4, #2] + ldrh r0, [r0, #0x88] + mov r1, r1, lsl #0x1d + add r0, r8, r0, lsl #4 + add r0, r0, r1, lsr #28 + add r0, r0, #0x100 + ldrh r2, [r0, #0xf8] + add r1, r2, #1 + strh r1, [r0, #0xf8] + mov r0, r2, lsl #1 + strh r0, [r4, #0x10] +_06006E5C: + ldr r0, [sp, #0x94] + add fp, fp, #2 + and r0, r2, r0 + strh r0, [r6], #2 + sub sb, sb, #2 +_06006E70: + ldr r0, [sp, #0x1c] + cmp r0, #1 + bne _06006EA0 + ldr r0, [sp, #0x70] + add fp, fp, #2 + ldrh r0, [r0] + sub sb, sb, #2 + orr r1, r0, #0x1000 + ldr r0, [sp, #0x70] + strh r1, [r0] + ldrh r0, [r4, #6] + strh r0, [r6], #2 +_06006EA0: + ldr r0, [sp, #0x44] + cmp r0, #1 + moveq r0, #0 + streq r0, [sp, #0x44] + ldr r0, [sp, #0x5c] + ldrh r0, [r0, #2] + cmp r0, sl + ldreq r1, [sp, #0x68] + ldreq r0, [sp, #0x5c] + streqh r1, [r0, #2] + ldrh r1, [r4] + ldr r0, [sp, #0x64] + strh r1, [r0] + ldr r0, [sp, #0x78] + strh r0, [r4] + ldr r0, [sp, #0x60] + ldrh r1, [r0, #2] + ldr r0, [sp, #0x98] + cmp r1, r0 + ldreq r0, [sp, #0x60] + movne r1, r1, lsl #5 + streqh sl, [r0] + ldrne r0, [sp, #0x54] + strneh sl, [r0, r1] + ldr r0, [sp, #0x28] + mov r1, #1 + mvn r1, r1, lsl r0 + ldr r0, [sp, #0x40] + and r0, r0, r1 + str r0, [sp, #0x40] + ldr r0, [sp, #0x60] + strh sl, [r0, #2] + ldr r0, [sp, #0x6c] + ldr sl, [sp, #0x68] + strh r0, [r4, #0xa] + ldrh r0, [r4, #4] + orr r5, r5, r0 + ldr r0, [sp, #0x9c] + ldrh r0, [r0, #0xc8] + cmp r0, #1 + beq _06006FB4 +_06006F44: + ldr r0, [sp, #0xa0] + str sl, [sp, #0x68] + cmp sl, r0 + ldrne r0, [sp, #0x54] + addne r0, r0, sl, lsl #5 + strne r0, [sp, #0x64] + ldreq r0, [sp, #0x5c] + streq r0, [sp, #0x64] + ldr r0, [sp, #0xa4] + cmp sl, r0 + ldrne r0, [sp, #0x54] + movne r1, sl, lsl #5 + ldrneh sl, [r0, r1] + ldreq r0, [sp, #0x5c] + ldreqh sl, [r0] +_06006F80: + ldr r0, [sp, #0xa8] + cmp sl, r0 + beq _06006F94 + cmp sb, #2 + bgt _06006CB0 +_06006F94: + ldr r0, [sp, #0x58] + add r0, r0, #1 + str r0, [sp, #0x58] +_06006FA0: + ldr r0, [sp, #0x58] + cmp r0, #4 + bhs _06006FB4 + cmp sb, #2 + bgt _06006C2C +_06006FB4: + add r0, r8, #0x31c + add r0, r0, #0x400 + mov sl, fp + bl __VENEER_OS_UnlockMutex + mov r0, #0 +_06006FC8: + cmp r0, #1 + moveq r0, #0 + streqh r0, [r7, #0x62] + streqh r0, [r7, #0x64] + beq _0600742C + add r0, r7, #0x700 + ldrh r1, [r0, #0xc6] + ldr r0, [sp, #0x24] + cmp r1, #1 + add r4, r0, #2 + ldrne r5, [sp, #0x18] + ldr r0, [sp, #0x74] + and r5, r5, r0 + mov r0, r5 + bl __VENEER_MATH_CountPopulation + ldr r1, [sp, #0x24] + add r1, r1, #0xc + mul r0, r1, r0 + add r0, r0, #0x29 + ldrh r1, [r7, #0x72] + bic r0, r0, #0x1f + cmp r1, r0 + bge _06007348 + ldr r0, _06007438 ; =wmspW + 0x1000 + ldr sb, [r0, #0x550] + ldrh r0, [sb] + add r8, sb, #0x2f8 + cmp r0, #9 + moveq r4, #1 + beq _0600704C + cmp r0, #0xa + bne _06007338 + mov r4, #0 +_0600704C: + add r0, sb, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_LockMutex + ldr r0, [sb, #0x734] + cmp r0, #0 + bne _06007074 + add r0, sb, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + b _06007338 +_06007074: + cmp r4, #0 + moveq r0, #1 + streq r0, [sp, #0x3c] + beq _06007098 + bl __VENEER_OS_DisableInterrupts + add r1, sb, #0x100 + ldrh r1, [r1, #0x82] + str r1, [sp, #0x3c] + bl __VENEER_OS_RestoreInterrupts +_06007098: + mov r0, r5, lsl #0x10 + mvn r0, r0, lsr #16 + str r0, [sp, #0x30] + mov sl, #0 +_060070A8: + ldr r0, _0600743C ; =0x0000FFFF + add fp, sb, #0x600 + str r0, [sp, #0x38] + add r0, sb, #0x2fc + add r1, r0, #0x400 + mov r0, sl, lsl #2 + ldrh r5, [r1, r0] + ldr r0, [sp, #0x38] + add r6, r1, sl, lsl #2 + str r0, [sp, #0x34] + ldr r0, [sp, #0x38] + str r0, [sp, #0x7c] + str r0, [sp, #0x80] + str r0, [sp, #0x84] + str r0, [sp, #0x88] + str r0, [sp, #0xac] + str r0, [sp, #0xb0] + add r0, sb, #0x100 + str r0, [sp, #0xb4] + ldr r0, [sp, #0x38] + str r0, [sp, #0xb8] + str r0, [sp, #0xbc] + str r0, [sp, #0xc0] + b _060072C4 +_06007108: + add r4, r8, r5, lsl #5 + ldrh r1, [r4, #0xa] + ldr r0, [sp, #0x30] + ldrh r2, [r4, #8] + and r0, r1, r0 + orr r0, r2, r0 + strh r0, [r4, #8] + ldrh r0, [r4, #8] + ldrh r1, [r4, #6] + mvn r0, r0 + and r0, r1, r0 + strh r0, [r4, #6] + ldrh r1, [r4, #6] + ldr r0, [sp, #0x3c] + and r0, r1, r0 + strh r0, [r4, #6] + mov r0, #0 + strh r0, [r4, #0xa] + ldrh r0, [r4, #6] + cmp r0, #0 + beq _060071D8 + ldrh r0, [r4, #2] + tst r0, #8 + ldreqh r0, [r4, #0x12] + cmpeq r0, #0 + beq _060071D8 + ldrh r0, [r4, #0x12] + cmp r0, #0 + subne r0, r0, #1 + strneh r0, [r4, #0x12] + ldrh r1, [r4] + ldr r0, [sp, #0xac] + cmp r1, r0 + ldreq r0, [sp, #0x7c] + streqh r0, [r6, #2] + ldr r1, [sp, #0x38] + ldr r0, [sp, #0xb0] + cmp r1, r0 + ldrh r0, [r4] + strh r0, [r6] + ldr r0, [sp, #0x80] + strh r0, [r4] + moveq r0, r5, lsl #0x10 + moveq r0, r0, lsr #0x10 + streq r0, [sp, #0x34] + ldrne r0, [sp, #0x38] + movne r0, r0, lsl #5 + strneh r5, [r8, r0] + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [sp, #0x38] + b _060072C0 +_060071D8: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x81 + strh r1, [r0] + ldrh r1, [r4, #6] + ldr r3, [sp, #0xb4] + cmp r1, #0 + moveq r1, #0 + movne r1, #0xf + strh r1, [r0, #2] + mov r1, #0x14 + strh r1, [r0, #8] + ldrh r1, [r4, #2] + strh r1, [r0, #0xa] + ldrh r1, [r4, #4] + strh r1, [r0, #0xc] + ldrh r1, [r4, #6] + strh r1, [r0, #0xe] + ldrh r1, [r4, #8] + strh r1, [r0, #0x10] + ldrh r1, [r4, #0xe] + strh r1, [r0, #0x18] + ldr r1, [r4, #0x14] + str r1, [r0, #0x14] + ldr r1, [r4, #0x18] + str r1, [r0, #0x1c] + ldr r1, [r4, #0x1c] + str r1, [r0, #0x20] + ldrh r1, [r4, #0x10] + strh r1, [r0, #0x1a] + ldrh r3, [r3, #0x88] + ldrh r1, [sb, #0x30] + cmp r3, #0 + ldrh r2, [sb, #0x32] + moveq r3, r1 + movne r3, r2 + strh r3, [r0, #0x24] + ldr r3, [sp, #0xb4] + ldrh r3, [r3, #0x88] + cmp r3, #0 + movne r2, r1 + strh r2, [r0, #0x26] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldrh r1, [r4] + ldr r0, [sp, #0xb8] + cmp r1, r0 + ldreq r0, [sp, #0x84] + streqh r0, [r6, #2] + ldrh r0, [r4] + strh r0, [r6] + ldr r0, [sp, #0x88] + strh r0, [r4] + ldrh r1, [fp, #0xfa] + ldr r0, [sp, #0xbc] + cmp r1, r0 + streqh r5, [fp, #0xf8] + movne r0, r1, lsl #5 + strneh r5, [r8, r0] + strh r5, [fp, #0xfa] +_060072C0: + ldrh r5, [r6] +_060072C4: + ldr r0, [sp, #0xc0] + cmp r5, r0 + bne _06007108 + ldr r2, _0600743C ; =0x0000FFFF + ldr r0, [sp, #0x38] + cmp r0, r2 + beq _06007318 + add r0, sb, sl, lsl #2 + add r1, r0, #0x700 + ldr r0, [sp, #0x38] + ldrh r3, [r1, #0xc] + mov r0, r0, lsl #5 + strh r3, [r8, r0] + ldrh r0, [r1, #0xe] + cmp r0, r2 + ldreq r0, [sp, #0x38] + streqh r0, [r1, #0xe] + add r0, sb, sl, lsl #2 + add r1, r0, #0x700 + ldr r0, [sp, #0x34] + strh r0, [r1, #0xc] +_06007318: + add sl, sl, #1 + cmp sl, #4 + blt _060070A8 + add r0, sb, #0x31c + mov r1, #0 + add r0, r0, #0x400 + str r1, [sb, #0x734] + bl __VENEER_OS_UnlockMutex +_06007338: + mov r0, #0 + strh r0, [r7, #0x62] + strh r0, [r7, #0x64] + b _0600742C +_06007348: + ldrsh r0, [r7, #0x62] + cmp r0, #1 + ldrnesh r0, [r7, #0x64] + cmpne r0, #1 + movne r6, #0 + bne _060073C8 + ldrh r3, [r7, #0x40] + mov r0, sl + mov r1, r4 + mov r2, r5 + bl WmspGetTmptt + ldrh r1, [sp, #0xc4] + mov r6, r0 + orr r0, r1, #0x8000 + strh r0, [sp, #0xc4] + b _060073C8 +_06007388: + mov r6, #0 + strh r6, [r7, #0x9e] + ldrh r0, [sp, #0xc4] + ldr r5, [sp, #0x74] + bic r0, r0, #0x8000 + strh r0, [sp, #0xc4] + mov sl, r6 + ldr r4, _06007440 ; =0x000080D6 + bl __VENEER_OS_DisableInterrupts + ldrsh r1, [r7, #0x62] + add r1, r1, #1 + strh r1, [r7, #0x62] + ldrsh r1, [r7, #0x64] + add r1, r1, #1 + strh r1, [r7, #0x64] + bl __VENEER_OS_RestoreInterrupts +_060073C8: + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + str r0, [sp] + ldr r0, _06007444 ; =0x048080F8 + str r6, [sp, #4] + ldrh r1, [r0] + mov r0, sl, lsl #0x10 + str r1, [sp, #8] + mov r0, r0, lsr #0x10 + str r0, [sp, #0xc] + ldrh r0, [sp, #0xc4] + mov r3, r4, lsl #0x10 + str r0, [sp, #0x10] + ldr r2, [r7, #0x7c] + mov r1, #0 + str r2, [sp, #0x14] + add r0, sp, #0xc8 + mov r2, r1 + mov r3, r3, lsr #0x10 + bl WMSP_WL_MaMp + strh r5, [r7, #0x68] + ldrh r0, [sp, #0xc4] + strh r0, [r7, #0x6a] + strh r4, [r7, #0x6c] + strh sl, [r7, #0x6e] +_0600742C: + add sp, sp, #0x2c8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06007438: .word wmspW + 0x1000 +_0600743C: .word 0x0000FFFF +_06007440: .word 0x000080D6 +_06007444: .word 0x048080F8 + arm_func_end WMSP_SendMaMP + + arm_func_start __VENEER_MATH_CountPopulation +__VENEER_MATH_CountPopulation: ; 0x06007448 + ldr pc, _0600744C ; =MATH_CountPopulation + .align 2, 0 +_0600744C: .word MATH_CountPopulation + arm_func_end __VENEER_MATH_CountPopulation + + arm_func_start WMSP_ResumeMaMP +WMSP_ResumeMaMP: ; 0x06007450 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x218 + ldr r1, _06007534 ; =wmspW + 0x1000 + mov r4, r0 + ldr r7, [r1, #0x550] + bl __VENEER_OS_DisableInterrupts + bl __VENEER_OS_RestoreInterrupts + add r0, r7, #0x100 + ldrh r0, [r0, #0x82] + ldr r1, _06007538 ; =0x048080F8 + and r4, r4, r0 + ldrh r8, [r7, #0x3a] + mov r0, r4 + ldrh r5, [r1] + ldrh r6, [r7, #0x6a] + bl __VENEER_MATH_CountPopulation + add r1, r8, #0xc + mul r0, r1, r0 + add r0, r0, #0x29 + ldrh r1, [r7, #0x72] + bic r0, r0, #0x1f + cmp r1, r0 + bge _060074BC + mov r0, #2 + bl __VENEER_OS_Sleep + bl WMSP_RequestResumeMP + b _06007528 +_060074BC: + ldrsh r0, [r7, #0x62] + cmp r0, #1 + ldrnesh r0, [r7, #0x64] + cmpne r0, #1 + bicne r6, r6, #0x8000 + movne r0, #0 + bne _060074F0 + ldrh r0, [r7, #0x6e] + ldrh r1, [r7, #0x6c] + ldrh r3, [r7, #0x40] + mov r2, r4 + bl WmspGetTmptt + orr r6, r6, #0x8000 +_060074F0: + mov r1, r4, lsl #0x10 + mov r1, r1, lsr #0x10 + str r1, [sp] + stmib sp, {r0, r5} + mov r2, #0 + mov r0, r6, lsl #0x10 + str r2, [sp, #0xc] + mov r0, r0, lsr #0x10 + str r0, [sp, #0x10] + ldr r1, _0600753C ; =0x0000800C + add r0, sp, #0x18 + mov r3, r2 + str r2, [sp, #0x14] + bl WMSP_WL_MaMp +_06007528: + add sp, sp, #0x218 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_06007534: .word wmspW + 0x1000 +_06007538: .word 0x048080F8 +_0600753C: .word 0x0000800C + arm_func_end WMSP_ResumeMaMP + + arm_func_start __VENEER_OS_Sleep +__VENEER_OS_Sleep: ; 0x06007540 + ldr pc, _06007544 ; =OS_Sleep + .align 2, 0 +_06007544: .word OS_Sleep + arm_func_end __VENEER_OS_Sleep + + arm_func_start WMSP_PutSendQueue +WMSP_PutSendQueue: ; 0x06007548 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r4, _06007674 ; =wmspW + 0x1000 + ldrh r8, [sp, #0x24] + ldr r4, [r4, #0x550] + mov r7, r0 + add r0, r4, #0x30c + add r0, r0, #0x400 + cmp r8, #0 + add sb, r0, r1, lsl #2 + mov r6, r2 + mov r5, r3 + add r8, r4, #0x2f8 + moveq r0, #6 + beq _0600766C + ldrh r0, [sp, #0x24] + tst r6, #8 + movne r1, #2 + moveq r1, #0 + add r0, r0, r1 + cmp r0, #0x204 + movgt r0, #6 + bgt _0600766C + add r0, r4, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_LockMutex + add r2, r4, #0x600 + ldrh r1, [r2, #0xf8] + ldr r3, _06007678 ; =0x0000FFFF + cmp r1, r3 + bne _060075D4 + add r0, r4, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + mov r0, #0xa + b _0600766C +_060075D4: + mov r0, r1, lsl #5 + ldrh ip, [r8, r0] + add r0, r8, r1, lsl #5 + strh ip, [r2, #0xf8] + ldrh ip, [r2, #0xfa] + cmp ip, r1 + streqh r3, [r2, #0xfa] + strh r6, [r0, #2] + strh r5, [r0, #4] + and r2, r5, r7 + strh r2, [r0, #6] + mov r2, #0 + strh r2, [r0, #8] + strh r2, [r0, #0xa] + ldr r3, [sp, #0x20] + ldrh r2, [sp, #0x24] + str r3, [r0, #0x14] + strh r2, [r0, #0xe] + ldr r3, [sp, #0x28] + ldr r2, [sp, #0x2c] + str r3, [r0, #0x18] + str r2, [r0, #0x1c] + ldr r3, _06007678 ; =0x0000FFFF + add r2, r4, #0x700 + strh r3, [r0] + strh r3, [r0, #0x10] + ldrh r2, [r2, #0xca] + strh r2, [r0, #0x12] + ldrh r0, [sb, #2] + cmp r0, r3 + streqh r1, [sb] + movne r0, r0, lsl #5 + strneh r1, [r8, r0] + add r0, r4, #0x31c + add r0, r0, #0x400 + strh r1, [sb, #2] + bl __VENEER_OS_UnlockMutex + mov r0, #2 +_0600766C: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_06007674: .word wmspW + 0x1000 +_06007678: .word 0x0000FFFF + arm_func_end WMSP_PutSendQueue + + arm_func_start WMSP_FlushSendQueue +WMSP_FlushSendQueue: ; 0x0600767C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3c + ldr r2, _060079A4 ; =wmspW + 0x1000 + str r0, [sp] + ldr r8, [r2, #0x550] + mov r5, r1 + ldrh r1, [r8] + mov r0, #0 + cmp r1, #9 + add r4, r8, #0x2f8 + str r0, [sp, #0xc] + moveq r6, #1 + beq _060076BC + cmp r1, #0xa + moveq r6, r0 + bne _06007998 +_060076BC: + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_LockMutex + ldr r0, [r8, #0x734] + cmp r0, #0 + bne _060076E8 + add r0, r8, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + mov r0, #0 + b _06007998 +_060076E8: + cmp r6, #0 + moveq r0, #1 + streq r0, [sp, #0x10] + beq _0600770C + bl __VENEER_OS_DisableInterrupts + add r1, r8, #0x100 + ldrh r1, [r1, #0x82] + str r1, [sp, #0x10] + bl __VENEER_OS_RestoreInterrupts +_0600770C: + mvn r0, r5 + str r0, [sp, #4] + mov sl, #0 +_06007718: + add r0, r8, #0x2fc + add r1, r0, #0x400 + ldr sb, _060079A8 ; =0x0000FFFF + mov r0, sl, lsl #2 + ldrh r5, [r1, r0] + add r0, r8, #0x100 + str sb, [sp, #8] + add r6, r1, sl, lsl #2 + str sb, [sp, #0x14] + str sb, [sp, #0x18] + str sb, [sp, #0x1c] + str sb, [sp, #0x20] + str sb, [sp, #0x24] + str sb, [sp, #0x28] + str r0, [sp, #0x2c] + str sb, [sp, #0x30] + add fp, r8, #0x600 + str sb, [sp, #0x34] + str sb, [sp, #0x38] + b _0600792C +_06007768: + ldr r0, [sp] + add r7, r4, r5, lsl #5 + cmp r0, #0 + bne _060077A4 + ldrh r1, [r7, #0xa] + ldr r0, [sp, #4] + ldrh r2, [r7, #8] + and r0, r1, r0 + orr r0, r2, r0 + strh r0, [r7, #8] + ldrh r0, [r7, #8] + ldrh r1, [r7, #6] + mvn r0, r0 + and r0, r1, r0 + strh r0, [r7, #6] +_060077A4: + ldrh r1, [r7, #6] + ldr r0, [sp, #0x10] + and r0, r1, r0 + strh r0, [r7, #6] + mov r0, #0 + strh r0, [r7, #0xa] + ldrh r0, [r7, #6] + cmp r0, #0 + beq _06007840 + ldrh r0, [r7, #2] + tst r0, #8 + ldreqh r0, [r7, #0x12] + cmpeq r0, #0 + beq _06007840 + mov r0, #1 + str r0, [sp, #0xc] + ldrh r0, [r7, #0x12] + cmp r0, #0 + subne r0, r0, #1 + strneh r0, [r7, #0x12] + ldrh r1, [r7] + ldr r0, [sp, #0x24] + cmp r1, r0 + ldreq r0, [sp, #0x14] + streqh r0, [r6, #2] + ldr r0, [sp, #0x28] + cmp sb, r0 + ldrh r0, [r7] + strh r0, [r6] + ldr r0, [sp, #0x18] + strh r0, [r7] + moveq r0, r5, lsl #0x10 + moveq r0, r0, lsr #0x10 + streq r0, [sp, #8] + movne r0, sb, lsl #5 + strneh r5, [r4, r0] + mov r0, r5, lsl #0x10 + mov sb, r0, lsr #0x10 + b _06007928 +_06007840: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x81 + strh r1, [r0] + ldrh r1, [r7, #6] + ldr r3, [sp, #0x2c] + cmp r1, #0 + moveq r1, #0 + movne r1, #0xf + strh r1, [r0, #2] + mov r1, #0x14 + strh r1, [r0, #8] + ldrh r1, [r7, #2] + strh r1, [r0, #0xa] + ldrh r1, [r7, #4] + strh r1, [r0, #0xc] + ldrh r1, [r7, #6] + strh r1, [r0, #0xe] + ldrh r1, [r7, #8] + strh r1, [r0, #0x10] + ldrh r1, [r7, #0xe] + strh r1, [r0, #0x18] + ldr r1, [r7, #0x14] + str r1, [r0, #0x14] + ldr r1, [r7, #0x18] + str r1, [r0, #0x1c] + ldr r1, [r7, #0x1c] + str r1, [r0, #0x20] + ldrh r1, [r7, #0x10] + strh r1, [r0, #0x1a] + ldrh r3, [r3, #0x88] + ldrh r1, [r8, #0x30] + cmp r3, #0 + ldrh r2, [r8, #0x32] + moveq r3, r1 + movne r3, r2 + strh r3, [r0, #0x24] + ldr r3, [sp, #0x2c] + ldrh r3, [r3, #0x88] + cmp r3, #0 + movne r2, r1 + strh r2, [r0, #0x26] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldrh r1, [r7] + ldr r0, [sp, #0x30] + cmp r1, r0 + ldreq r0, [sp, #0x1c] + streqh r0, [r6, #2] + ldrh r0, [r7] + strh r0, [r6] + ldr r0, [sp, #0x20] + strh r0, [r7] + ldrh r1, [fp, #0xfa] + ldr r0, [sp, #0x34] + cmp r1, r0 + streqh r5, [fp, #0xf8] + movne r0, r1, lsl #5 + strneh r5, [r4, r0] + strh r5, [fp, #0xfa] +_06007928: + ldrh r5, [r6] +_0600792C: + ldr r0, [sp, #0x38] + cmp r5, r0 + bne _06007768 + ldr r1, _060079A8 ; =0x0000FFFF + cmp sb, r1 + beq _06007974 + add r0, r8, sl, lsl #2 + add r0, r0, #0x700 + ldrh r3, [r0, #0xc] + mov r2, sb, lsl #5 + strh r3, [r4, r2] + ldrh r2, [r0, #0xe] + cmp r2, r1 + streqh sb, [r0, #0xe] + add r0, r8, sl, lsl #2 + add r1, r0, #0x700 + ldr r0, [sp, #8] + strh r0, [r1, #0xc] +_06007974: + add sl, sl, #1 + cmp sl, #4 + blt _06007718 + add r0, r8, #0x31c + mov r1, #0 + add r0, r0, #0x400 + str r1, [r8, #0x734] + bl __VENEER_OS_UnlockMutex + ldr r0, [sp, #0xc] +_06007998: + add sp, sp, #0x3c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_060079A4: .word wmspW + 0x1000 +_060079A8: .word 0x0000FFFF + arm_func_end WMSP_FlushSendQueue + + arm_func_start WMSP_CleanSendQueue +WMSP_CleanSendQueue: ; 0x060079AC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r1, _06007B98 ; =wmspW + 0x1000 + mvn r2, r0 + ldr sb, [r1, #0x550] + add r0, sb, #0x100 + ldrh r1, [r0, #0x82] + add r0, sb, #0x31c + add r0, r0, #0x400 + add r5, sb, #0x2f8 + and fp, r2, r1 + bl __VENEER_OS_LockMutex + add r0, sb, #0x30c + add r0, r0, #0x400 + str r0, [sp, #8] + mov r0, #0 + str r0, [sp, #0xc] +_060079F0: + add r0, sb, #0x100 + str r0, [sp, #0x10] + mov r6, #0 + add r4, sb, #0x600 +_06007A00: + ldr r0, [sp, #8] + mov r1, r6, lsl #2 + add r7, r0, r6, lsl #2 + ldrh sl, [r0, r1] + ldr r0, _06007B9C ; =0x0000FFFF + str r7, [sp, #4] + str r0, [sp] + b _06007B54 +_06007A20: + add r8, r5, sl, lsl #5 + ldrh r0, [r8, #6] + and r0, r0, fp + strh r0, [r8, #6] + ldrh r0, [r8, #0xa] + and r0, r0, fp + strh r0, [r8, #0xa] + ldrh r0, [r8, #6] + cmp r0, #0 + bne _06007B28 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x81 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x14 + strh r1, [r0, #8] + ldrh r1, [r8, #2] + ldr r3, [sp, #0x10] + strh r1, [r0, #0xa] + ldrh r1, [r8, #4] + strh r1, [r0, #0xc] + ldrh r1, [r8, #6] + strh r1, [r0, #0xe] + ldrh r1, [r8, #8] + strh r1, [r0, #0x10] + ldrh r1, [r8, #0xe] + strh r1, [r0, #0x18] + ldr r1, [r8, #0x14] + str r1, [r0, #0x14] + ldr r1, [r8, #0x18] + str r1, [r0, #0x1c] + ldr r1, [r8, #0x1c] + str r1, [r0, #0x20] + ldrh r1, [r8, #0x10] + strh r1, [r0, #0x1a] + ldrh r3, [r3, #0x88] + ldrh r1, [sb, #0x30] + cmp r3, #0 + ldrh r2, [sb, #0x32] + moveq r3, r1 + movne r3, r2 + strh r3, [r0, #0x24] + ldr r3, [sp, #0x10] + ldrh r3, [r3, #0x88] + cmp r3, #0 + movne r2, r1 + strh r2, [r0, #0x26] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldrh r1, [r8] + ldr r0, _06007B9C ; =0x0000FFFF + cmp r1, r0 + ldreq r0, [sp] + streqh r0, [r7, #2] + ldrh r1, [r8] + ldr r0, [sp, #4] + strh r1, [r0] + ldr r0, _06007B9C ; =0x0000FFFF + strh r0, [r8] + ldrh r1, [r4, #0xfa] + cmp r1, r0 + streqh sl, [r4, #0xf8] + movne r0, r1, lsl #5 + strneh sl, [r5, r0] + strh sl, [r4, #0xfa] + ldr sl, [sp] +_06007B28: + ldr r0, _06007B9C ; =0x0000FFFF + str sl, [sp] + cmp sl, r0 + addne r0, r5, sl, lsl #5 + strne r0, [sp, #4] + ldr r0, _06007B9C ; =0x0000FFFF + streq r7, [sp, #4] + cmp sl, r0 + movne r0, sl, lsl #5 + ldrneh sl, [r5, r0] + ldreqh sl, [r7] +_06007B54: + ldr r0, _06007B9C ; =0x0000FFFF + cmp sl, r0 + bne _06007A20 + add r6, r6, #1 + cmp r6, #4 + blt _06007A00 + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + cmp r0, #2 + blt _060079F0 + add r0, sb, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_UnlockMutex + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06007B98: .word wmspW + 0x1000 +_06007B9C: .word 0x0000FFFF + arm_func_end WMSP_CleanSendQueue + + arm_func_start WMSP_ParsePortPacket +WMSP_ParsePortPacket: ; 0x06007BA0 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, _06007D9C ; =wmspW + 0x1000 + ldr r1, [sp, #0x40] + ldr r5, [r4, #0x550] + movs sb, r3 + str r1, [sp, #0x40] + mov sl, r0 + str r2, [sp] + beq _06007D8C + cmp sb, #0x204 + bhi _06007D8C + add r4, r5, #0x100 + ldrh r0, [r4, #0x88] + cmp sl, r0 + beq _06007D8C + cmp sl, #0x10 + bhs _06007D8C + tst sb, #1 + bne _06007D8C + add r0, r5, #0x1f8 + add r8, r0, sl, lsl #4 + mov r0, #1 + str r0, [sp, #8] + b _06007D84 +_06007C08: + ldr r0, [sp, #8] + ldr r7, _06007DA0 ; =0x0000FFFF + cmp r0, #1 + addeq r1, sp, #0x34 + moveq r0, #0 + ldrne r1, [sp] + streq r0, [sp, #8] + movne r0, r1 + addne r0, r0, #2 + ldrh r1, [r1] + strne r0, [sp] + mov r0, r1, lsl #0x18 + subne sb, sb, #2 + movs r6, r0, lsr #0x17 + moveq r6, #0x200 + tst r1, #0x1000 + movne r2, #1 + moveq r2, #0 + tst r1, #0x800 + movne r3, #1 + moveq r3, #0 + cmp r2, #0 + movne fp, #2 + moveq fp, #0 + cmp r3, #0 + movne r0, #2 + moveq r0, #0 + add r0, r6, r0 + add r0, r0, fp + subs sb, sb, r0 + bmi _06007D8C + and r1, r1, #0xf00 + cmp r3, #1 + mov r1, r1, lsl #8 + ldr r3, [sp] + mov fp, r1, lsr #0x10 + ldr r1, [sp] + add r0, r3, r0 + str r1, [sp, #4] + add r1, r1, r6 + str r0, [sp] + bne _06007CEC + mov r0, fp, lsl #0x1d + mov r0, r0, lsr #0x1c + ldrh r3, [r8, r0] + ldrh r7, [r1], #2 + tst r3, #1 + movne r3, r7, lsl #1 + strneh r3, [r8, r0] + bne _06007CEC + mov r7, r7, lsl #1 + sub r3, r3, r7 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + cmp r3, #0x100 + blo _06007D84 + strh r7, [r8, r0] +_06007CEC: + cmp r2, #1 + bne _06007D08 + ldrh r2, [r1] + ldrh r1, [r4, #0x88] + mov r0, #1 + tst r2, r0, lsl r1 + beq _06007D84 +_06007D08: + cmp r6, #0 + ble _06007D84 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x82 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + mov r1, #0x15 + strh r1, [r0, #4] + ldr r1, [sp, #0x40] + strh fp, [r0, #6] + str r1, [r0, #8] + ldr r1, [sp, #4] + str r1, [r0, #0xc] + strh r6, [r0, #0x10] + strh sl, [r0, #0x12] + ldrh r1, [r4, #0x88] + strh r1, [r0, #0x20] + strh r7, [r0, #0x1a] + ldrh r1, [r4, #0x88] + ldrh r2, [r5, #0x30] + cmp r1, #0 + ldrh r3, [r5, #0x32] + moveq r1, r2 + movne r1, r3 + strh r1, [r0, #0x40] + ldrh r1, [r4, #0x88] + cmp r1, #0 + movne r3, r2 + strh r3, [r0, #0x42] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06007D84: + cmp sb, #0 + bgt _06007C08 +_06007D8C: + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_06007D9C: .word wmspW + 0x1000 +_06007DA0: .word 0x0000FFFF + arm_func_end WMSP_ParsePortPacket + + arm_func_start WmspGetTmptt +WmspGetTmptt: ; 0x06007DA4 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r5, r0 + tst r6, #0x8000 + ldrne r0, _06007E40 ; =0x00007FFF + mov r4, r3 + andne r6, r6, r0 + addeq r0, r6, #0x1c + moveq r0, r0, lsl #2 + addeq r6, r0, #0x66 + mov r0, r2 + bl __VENEER_MATH_CountPopulation + mul r2, r6, r0 + ldr r1, _06007E44 ; =0x04000006 + add r0, r5, #0x22 + mov r3, r0, lsl #2 + ldrh r1, [r1] + sub r0, r4, #2 + add r3, r3, #0x60 + add r2, r2, #0x388 + add r4, r3, r2 + subs r3, r0, r1 + bpl _06007E0C +_06007E00: + add r0, r3, #7 + adds r3, r0, #0x100 + bmi _06007E00 +_06007E0C: + ldr r2, _06007E48 ; =0x66666667 + rsb r1, r3, r3, lsl #7 + mov r0, r1, lsr #0x1f + smull r1, r3, r2, r1 + add r3, r0, r3, asr #3 + mov r0, #0xa + mul r0, r3, r0 + cmp r0, r4 + movlo r3, #0 + mov r0, r3, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06007E40: .word 0x00007FFF +_06007E44: .word 0x04000006 +_06007E48: .word 0x66666667 + arm_func_end WmspGetTmptt + + arm_func_start WMSP_SetEntry +WMSP_SetEntry: ; 0x06007E4C + stmdb sp!, {r4, lr} + sub sp, sp, #0x280 + ldr r1, _06007ED8 ; =wmspW + 0x1000 + ldr r2, [r0, #4] + ldr r4, [r1, #0x550] + add r0, sp, #0 + strh r2, [r4, #0xf6] + add r1, r4, #0xe8 + bl WMSP_CopyParentParam + ldrh r1, [r4, #0xec] + add r0, sp, #0x80 + add r1, r1, #0x10 + mov r1, r1, lsl #0x10 + add r2, sp, #0 + mov r1, r1, lsr #0x10 + bl WMSP_WL_ParamSetGameInfo + mov r4, r0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x21 + strh r1, [r0] + ldrh r1, [r4, #4] + cmp r1, #0 + moveq r1, #0 + streqh r1, [r0, #2] + beq _06007EC8 + mov r1, #1 + strh r1, [r0, #2] + add r1, r1, #0x244 + strh r1, [r0, #4] + ldrh r1, [r4, #4] + strh r1, [r0, #6] +_06007EC8: + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x280 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06007ED8: .word wmspW + 0x1000 + arm_func_end WMSP_SetEntry + + arm_func_start WMSP_AutoDeAuth +WMSP_AutoDeAuth: ; 0x06007EDC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x208 + add r1, sp, #0 + add r0, r0, #4 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + mov r8, #0 + add r7, sp, #8 + add r6, sp, #0 + mov r5, #0x13 + b _06007F38 +_06007F08: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl WMSP_WL_MlmeDeAuthenticate + mov r4, r0 + ldrh r0, [r4, #4] + cmp r0, #0 + beq _06007F40 + cmp r0, #7 + cmpne r0, #0xc + bne _06007F40 + add r8, r8, #1 +_06007F38: + cmp r8, #2 + blt _06007F08 +_06007F40: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x22 + strh r1, [r0] + ldrh r1, [r4, #4] + cmp r1, #0 + moveq r1, #0 + streqh r1, [r0, #2] + beq _06007F78 + mov r1, #1 + strh r1, [r0, #2] + mov r1, #5 + strh r1, [r0, #4] + ldrh r1, [r4, #4] + strh r1, [r0, #6] +_06007F78: + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x208 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + arm_func_end WMSP_AutoDeAuth + + arm_func_start WMSP_Enable +WMSP_Enable: ; 0x06007F88 + stmdb sp!, {r3, lr} + ldr r3, [r0, #4] + ldr r1, _06007FD4 ; =wmspW + 0x1000 + str r3, [r1, #0x54c] + ldr r2, [r0, #8] + str r2, [r1, #0x550] + str r2, [r3] + ldr r1, [r0, #0xc] + str r1, [r3, #8] + ldr r0, [r0, #0x10] + bl WMSPi_CommonInit + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #3 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06007FD4: .word wmspW + 0x1000 + arm_func_end WMSP_Enable + + arm_func_start WMSPi_CommonInit +WMSPi_CommonInit: ; 0x06007FD8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _06008178 ; =wmspW + 0x1000 + mov r8, r0 + ldr r7, [r1, #0x550] + ldr r4, [r1, #0x54c] + mov r5, #0 + bl __VENEER_OS_DisableInterrupts + ldr r1, [r7, #0xc] + mov r6, r0 + cmp r1, #1 + bne _06008018 + mov r0, r5 + str r0, [r7, #0xc] + mov r5, #1 + bl WMSP_CancelVAlarm + bl WMSP_SetThreadPriorityLow +_06008018: + add ip, r7, #0x100 + mov r1, #0 + strh r1, [ip, #0x82] + strh r1, [r7, #0x86] + str r1, [r7, #0x14] + str r1, [r7, #0x10] + str r1, [r7, #0x1c] + strh r1, [r7, #0xce] + strh r1, [r7, #0xc2] + mov r0, #1 + strh r0, [r7, #0x58] + strh r0, [r7, #0x5a] + mov r0, #6 + strh r0, [r7, #0x5c] + strh r1, [r7, #0x98] + strh r1, [r7, #0x92] + strh r1, [r7, #0x94] + strh r1, [r7, #0x9a] + strh r1, [r7, #0x9c] + ldrh r0, [r7, #0x58] + add r3, r7, #0x700 + strh r0, [r3, #0xc0] + ldrh r2, [r7, #0x5a] + add r0, r7, #0x19c + strh r2, [r3, #0xc2] + ldrh lr, [r7, #0x5c] + mov r2, #0x50 + strh lr, [r3, #0xc4] + ldrh lr, [r7, #0x98] + strh lr, [r3, #0xca] + ldrh lr, [r7, #0x92] + strh lr, [r3, #0xc6] + ldrh lr, [r7, #0x94] + strh lr, [r3, #0xc8] + ldrh lr, [r7, #0x9a] + strh lr, [r3, #0xcc] + str r1, [r7, #0x198] + strh r1, [ip, #0x96] + bl __VENEER_MI_CpuFill8 + bl WMSP_ResetSizeVars + mov r0, #0x104 + strh r0, [r7, #0x40] + mov r0, #0xf0 + strh r0, [r7, #0x42] + mov r0, #0x3e8 + strh r0, [r7, #0x44] + mov r1, #0 + ldr r0, _0600817C ; =0x0000020B + strh r1, [r7, #0x46] + str r0, [r7, #0x48] + str r1, [r7, #0x4c] + str r1, [r7, #0x50] + str r1, [r7, #0x54] + strh r1, [r7, #0xc6] + add r0, r7, #0x100 + mov r1, #1 + strh r1, [r0, #0xee] + mov r0, r6 + str r8, [r7, #0xc8] + bl __VENEER_OS_RestoreInterrupts + cmp r5, #0 + beq _06008118 + ldr r0, _06008180 ; =0x0000FFFF + bl WMSP_CleanSendQueue +_06008118: + mov r2, #0 + mov r1, #0x8000 +_06008120: + add r0, r4, r2, lsl #4 + add r2, r2, #1 + str r1, [r0, #0xd0] + cmp r2, #0x20 + blt _06008120 + add r1, r7, #0x1f8 + mov r0, #1 + mov r2, #0x100 + bl __VENEER_MIi_CpuClear16 + bl WMSP_InitAlarm + add r0, r7, #0x31c + add r0, r0, #0x400 + bl __VENEER_OS_InitMutex + bl WMSP_InitVAlarm + tst r8, #2 + bne _06008168 + mov r0, #0xf + bl __VENEER_PM_SetLEDPattern +_06008168: + mov r0, #1 + strh r0, [r7] + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_06008178: .word wmspW + 0x1000 +_0600817C: .word 0x0000020B +_06008180: .word 0x0000FFFF + arm_func_end WMSPi_CommonInit + + arm_func_start WMSP_Disable +WMSP_Disable: ; 0x06008184 + stmdb sp!, {r4, lr} + ldr r0, _060081E8 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + ldrh r0, [r4] + cmp r0, #1 + beq _060081B8 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #4 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _060081E0 +_060081B8: + mov r0, #1 + bl __VENEER_PM_SetLEDPattern + mov r0, #0 + strh r0, [r4] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #4 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_060081E0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060081E8: .word wmspW + 0x1000 + arm_func_end WMSP_Disable + + arm_func_start WMSP_PowerOn +WMSP_PowerOn: ; 0x060081EC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + ldr r0, _06008290 ; =wmspW + 0x1000 + ldr r4, [r0, #0x550] + ldrh r0, [r4] + cmp r0, #1 + beq _06008224 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #5 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008284 +_06008224: + add r0, sp, #2 + add r1, sp, #0 + bl WMSPi_CommonWlIdle + cmp r0, #0 + bne _06008264 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #5 + strh r1, [r0] + mov r1, #1 + strh r1, [r0, #2] + ldrh r1, [sp, #2] + strh r1, [r0, #4] + ldrh r1, [sp] + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008284 +_06008264: + mov r0, #2 + strh r0, [r4] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #5 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06008284: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_06008290: .word wmspW + 0x1000 + arm_func_end WMSP_PowerOn + + arm_func_start WMSPi_CommonWlIdle +WMSPi_CommonWlIdle: ; 0x06008294 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x200 + ldr r2, _0600847C ; =wmspW + 0x1000 + mov r7, r0 + add r0, sp, #0 + mov r6, r1 + ldr r5, [r2, #0x550] + bl WMSP_WL_DevRestart + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060082D8 + mov r1, #0x304 + strh r1, [r7] + ldrh r1, [r0, #4] + mov r0, #0 + strh r1, [r6] + b _06008470 +_060082D8: + add r0, sp, #0 + bl WMSP_WL_DevIdle + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06008304 + ldr r1, _06008480 ; =0x00000302 + strh r1, [r7] + ldrh r1, [r0, #4] + mov r0, #0 + strh r1, [r6] + b _06008470 +_06008304: + ldr r2, _06008484 ; =0x04808124 + mov r0, #0xc8 + strh r0, [r2] + mov r0, #0x7d0 + strh r0, [r2, #4] + ldr r1, _06008488 ; =0x00000202 + add r0, sp, #0 + strh r1, [r2, #0x2c] + bl WMSP_WL_ParamGetEnableChannel + ldrh r1, [r0, #4] + cmp r1, #0 + beq _0600834C + ldr r1, _0600848C ; =0x00000283 + strh r1, [r7] + ldrh r1, [r0, #4] + mov r0, #0 + strh r1, [r6] + b _06008470 +_0600834C: + ldrh r2, [r0, #6] + add r0, r5, #0x100 + mov r1, r2, lsl #0xf + strh r2, [r0, #0xf4] + mov r0, r1, lsr #0x10 + bl __VENEER_WMSP_GetAllowedChannel + add r1, r5, #0x100 + strh r0, [r1, #0xf6] + ldr r1, _06008490 ; =0x0000FFFF + add r0, sp, #0 + mov r2, #0x28 + mov r3, #5 + bl WMSP_WL_ParamSetLifeTime + ldr r1, _06008494 ; =0x001FF621 + mov r0, #0 + str r1, [r5, #0x7b8] + str r0, [r5, #0x7bc] + add r1, r5, #0x100 + mov r2, #2 + strh r2, [r1, #0xec] + mov r2, #1 + add r0, sp, #0 + strh r2, [r1, #0xee] + bl WMSP_WL_DevGetVersion + mov r4, r0 + ldrh r0, [r4, #4] + cmp r0, #0 + beq _060083D4 + ldr r1, _06008498 ; =0x00000306 + mov r0, #0 + strh r1, [r7] + ldrh r1, [r4, #4] + strh r1, [r6] + b _06008470 +_060083D4: + add r0, r4, #6 + add r1, r5, #0x20 + mov r2, #8 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0xe] + add r0, sp, #0 + strh r1, [r5, #0x28] + ldrh r1, [r4, #0x10] + strh r1, [r5, #0x2c] + ldrh r1, [r4, #0x12] + strh r1, [r5, #0x2e] + ldrh r1, [r4, #0x14] + strh r1, [r5, #0x2a] + bl WMSP_WL_ParamGetMacAddress + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06008430 + ldr r1, _0600849C ; =0x00000281 + strh r1, [r7] + ldrh r1, [r0, #4] + mov r0, #0 + strh r1, [r6] + b _06008470 +_06008430: + add r0, r0, #6 + add r1, r5, #0xe0 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, sp, #0 + mov r1, #1 + bl WMSP_WL_ParamSetBeaconSendRecvInd + ldrh r1, [r0, #4] + cmp r1, #0 + moveq r0, #1 + beq _06008470 + ldr r1, _060084A0 ; =0x00000215 + strh r1, [r7] + ldrh r1, [r0, #4] + mov r0, #0 + strh r1, [r6] +_06008470: + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600847C: .word wmspW + 0x1000 +_06008480: .word 0x00000302 +_06008484: .word 0x04808124 +_06008488: .word 0x00000202 +_0600848C: .word 0x00000283 +_06008490: .word 0x0000FFFF +_06008494: .word 0x001FF621 +_06008498: .word 0x00000306 +_0600849C: .word 0x00000281 +_060084A0: .word 0x00000215 + arm_func_end WMSPi_CommonWlIdle + + arm_func_start __VENEER_WMSP_GetAllowedChannel +__VENEER_WMSP_GetAllowedChannel: ; 0x060084A4 + ldr pc, _060084A8 ; =WMSP_GetAllowedChannel + .align 2, 0 +_060084A8: .word WMSP_GetAllowedChannel + arm_func_end __VENEER_WMSP_GetAllowedChannel + + arm_func_start WMSP_PowerOff +WMSP_PowerOff: ; 0x060084AC + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x200 + ldr r0, _06008554 ; =wmspW + 0x1000 + ldr r5, [r0, #0x550] + ldrh r0, [r5] + cmp r0, #2 + beq _060084E4 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #6 + strh r1, [r0] + mov r1, #3 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008548 +_060084E4: + add r0, sp, #0 + bl WMSP_WL_DevShutdown + mov r4, r0 + ldrh r0, [r4, #4] + cmp r0, #0 + beq _06008528 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r2, #6 + mov r1, #1 + strh r2, [r0] + strh r1, [r0, #2] + add r1, r1, #0x300 + strh r1, [r0, #4] + ldrh r1, [r4, #4] + strh r1, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008548 +_06008528: + mov r0, #1 + strh r0, [r5] + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #6 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06008548: + add sp, sp, #0x200 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06008554: .word wmspW + 0x1000 + arm_func_end WMSP_PowerOff + + arm_func_start WMSP_SetMPParameter +WMSP_SetMPParameter: ; 0x06008558 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x1c + mov r6, r0 + add r1, sp, #0 + add r0, r6, #4 + bl WMSP_SetMPParameterCore + mov r5, r0 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r0, #0x23 + strh r0, [r4] + strh r5, [r4, #2] + ldr r3, [r6, #4] + add r0, sp, #0 + add r1, r4, #8 + mov r2, #0x1c + str r3, [r4, #4] + bl __VENEER_MI_CpuCopy8 + mov r0, r4 + bl __VENEER_WMSP_ReturnResult2Wm9 + add sp, sp, #0x1c + ldmia sp!, {r3, r4, r5, r6, lr} + bx lr + arm_func_end WMSP_SetMPParameter + + arm_func_start WMSP_SetMPParameterCore +WMSP_SetMPParameterCore: ; 0x060085B4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _060088AC ; =wmspW + 0x1000 + mov sb, r0 + ldr r7, [r2, #0x550] + ldr r6, [sb] + ldrh r0, [r7] + mov r8, r1 + add r0, r0, #0xf7 + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + mov r5, #0 + bhi _060085F8 + tst r6, #0x2c00 + bicne r6, r6, #0x2c00 + movne r5, #3 +_060085F8: + bl __VENEER_OS_DisableInterrupts + mov r4, r0 + cmp r8, #0 + beq _06008680 + ldr r0, _060088B0 ; =0x00003FFF + str r0, [r8] + ldrh r0, [r7, #0x58] + strh r0, [r8, #4] + ldrh r0, [r7, #0x5a] + strh r0, [r8, #6] + ldrh r0, [r7, #0x5c] + strh r0, [r8, #8] + ldrh r0, [r7, #0x30] + strh r0, [r8, #0xa] + ldrh r0, [r7, #0x32] + strh r0, [r8, #0xc] + ldrh r0, [r7, #0x44] + strh r0, [r8, #0xe] + ldrh r0, [r7, #0x46] + strh r0, [r8, #0x10] + ldrh r0, [r7, #0x40] + strh r0, [r8, #0x12] + ldrh r0, [r7, #0x42] + strh r0, [r8, #0x14] + ldrh r0, [r7, #0x98] + strh r0, [r8, #0x16] + ldrh r0, [r7, #0x92] + strb r0, [r8, #0x18] + ldrh r0, [r7, #0x94] + strb r0, [r8, #0x19] + ldrh r0, [r7, #0x9a] + strb r0, [r8, #0x1a] + ldrh r0, [r7, #0x9c] + strb r0, [r8, #0x1b] +_06008680: + tst r6, #1 + beq _060086A0 + ldrh r1, [sb, #4] + add r0, r7, #0x700 + cmp r1, #0 + moveq r1, #0x10 + strh r1, [r7, #0x58] + strh r1, [r0, #0xc0] +_060086A0: + tst r6, #2 + beq _060086CC + ldrh r1, [sb, #6] + add r0, r7, #0x700 + cmp r1, #0 + moveq r1, #0x10 + strh r1, [r7, #0x5a] + strh r1, [r0, #0xc2] + ldrsh r0, [r7, #0x62] + cmp r0, r1 + strgth r1, [r7, #0x62] +_060086CC: + tst r6, #4 + beq _060086F8 + ldrh r1, [sb, #8] + add r0, r7, #0x700 + cmp r1, #0 + moveq r1, #0x10 + strh r1, [r7, #0x5c] + strh r1, [r0, #0xc4] + ldrsh r0, [r7, #0x62] + cmp r0, r1 + strgth r1, [r7, #0x62] +_060086F8: + tst r6, #8 + beq _06008724 + ldrh r0, [sb, #0xa] + ldrh r2, [r7, #0x34] + add r1, r0, #1 + bic r1, r1, #1 + mov r1, r1, lsl #0x10 + cmp r2, r1, lsr #16 + movlo r5, #6 + blo _06008724 + bl WMSP_SetParentSize +_06008724: + tst r6, #0x10 + beq _06008750 + ldrh r0, [sb, #0xc] + add r1, r0, #1 + bic r1, r1, #1 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + cmp r1, #0x200 + movhi r5, #6 + bhi _06008750 + bl WMSP_SetChildSize +_06008750: + tst r6, #0x20 + beq _06008798 + ldrh r2, [sb, #0xe] + ldr r0, _060088B4 ; =0x00002710 + cmp r2, r0 + movhi r5, #6 + bhi _06008798 + ldr r0, _060088B8 ; =0x000082EA + strh r2, [r7, #0x44] + umull r1, r0, r2, r0 + mov r1, r1, lsr #6 + orr r1, r1, r0, lsl #26 + mov r0, r0, lsr #6 + mov r1, r1, lsr #0xa + orr r1, r1, r0, lsl #22 + str r1, [r7, #0x48] + mov r0, r0, lsr #0xa + str r0, [r7, #0x4c] +_06008798: + tst r6, #0x40 + beq _060087E0 + ldrh r2, [sb, #0x10] + ldr r0, _060088B4 ; =0x00002710 + cmp r2, r0 + movhi r5, #6 + bhi _060087E0 + ldr r0, _060088B8 ; =0x000082EA + strh r2, [r7, #0x46] + umull r1, r0, r2, r0 + mov r1, r1, lsr #6 + orr r1, r1, r0, lsl #26 + mov r0, r0, lsr #6 + mov r1, r1, lsr #0xa + orr r1, r1, r0, lsl #22 + str r1, [r7, #0x50] + mov r0, r0, lsr #0xa + str r0, [r7, #0x54] +_060087E0: + tst r6, #0x80 + beq _06008814 + ldrh r1, [sb, #0x12] + cmp r1, #0xbe + bls _06008808 + cmp r1, #0xdc + blo _06008810 + ldr r0, _060088BC ; =0x00000106 + cmp r1, r0 + bhi _06008810 +_06008808: + strh r1, [r7, #0x40] + b _06008814 +_06008810: + mov r5, #6 +_06008814: + tst r6, #0x100 + beq _06008848 + ldrh r1, [sb, #0x14] + cmp r1, #0xbe + bls _0600883C + cmp r1, #0xdc + blo _06008844 + ldr r0, _060088BC ; =0x00000106 + cmp r1, r0 + bhi _06008844 +_0600883C: + strh r1, [r7, #0x42] + b _06008848 +_06008844: + mov r5, #6 +_06008848: + tst r6, #0x200 + ldrneh r1, [sb, #0x16] + addne r0, r7, #0x700 + strneh r1, [r7, #0x98] + strneh r1, [r0, #0xca] + tst r6, #0x400 + ldrneb r0, [sb, #0x18] + strneh r0, [r7, #0x92] + tst r6, #0x800 + ldrneb r0, [sb, #0x19] + strneh r0, [r7, #0x94] + tst r6, #0x1000 + ldrneb r1, [sb, #0x1a] + addne r0, r7, #0x700 + strneh r1, [r7, #0x9a] + ldrneh r1, [r7, #0x9a] + strneh r1, [r0, #0xcc] + tst r6, #0x2000 + ldrneb r0, [sb, #0x1b] + strneh r0, [r7, #0x9c] + mov r0, r4 + bl __VENEER_OS_RestoreInterrupts + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_060088AC: .word wmspW + 0x1000 +_060088B0: .word 0x00003FFF +_060088B4: .word 0x00002710 +_060088B8: .word 0x000082EA +_060088BC: .word 0x00000106 + arm_func_end WMSP_SetMPParameterCore + + arm_func_start WMSP_SetBeaconPeriod +WMSP_SetBeaconPeriod: ; 0x060088C0 + stmdb sp!, {r4, lr} + sub sp, sp, #0x200 + ldr r1, [r0, #4] + add r0, sp, #0 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + bl WMSP_WL_ParamSetBeaconPeriod + ldrh r4, [r0, #4] + cmp r4, #0 + beq _06008910 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x24 + strh r1, [r0] + mov r2, #1 + ldr r1, _06008934 ; =0x00000242 + strh r2, [r0, #2] + strh r1, [r0, #4] + strh r4, [r0, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008928 +_06008910: + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x24 + strh r1, [r0] + mov r1, #0 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06008928: + add sp, sp, #0x200 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06008934: .word 0x00000242 + arm_func_end WMSP_SetBeaconPeriod + + arm_func_start WMSP_AutoDisconnect +WMSP_AutoDisconnect: ; 0x06008938 + ldr ip, _06008948 ; =WMSP_DisconnectCore + mov r1, #1 + mov r2, #0 + bx ip + .align 2, 0 +_06008948: .word WMSP_DisconnectCore + arm_func_end WMSP_AutoDisconnect + + arm_func_start WMSP_SetPowerSaveMode +WMSP_SetPowerSaveMode: ; 0x0600894C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x230 + ldr r1, _06008AC8 ; =wmspW + 0x1000 + mov r7, r0 + ldr r6, [r1, #0x550] + add r5, sp, #0x30 + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r4, r0 + mov r1, #0x28 + strh r1, [r4] + ldrh r1, [r6] + cmp r1, #0xb + beq _06008990 + mov r1, #3 + strh r1, [r4, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008ABC +_06008990: + ldr r0, [r7, #4] + mov r2, #0 + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + mov r1, r0, lsl #0x10 + mov r0, r5 + mov r1, r1, lsr #0x10 + mov r3, #1 + bl WMSP_WL_MlmePowerManagement + ldrh r1, [r0, #4] + cmp r1, #0 + beq _060089E4 + mov r1, #1 + strh r1, [r4, #2] + strh r1, [r4, #4] + ldrh r1, [r0, #4] + mov r0, r4 + strh r1, [r4, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008ABC +_060089E4: + ldr r0, _06008AC8 ; =wmspW + 0x1000 + mov r2, #6 + ldr r5, [r0, #0x550] + add r0, r5, #0x8a + add r0, r0, #0x100 + add r1, r5, #0xa2 + bl __VENEER_MI_CpuCopy8 + add r1, sp, #0x30 + str r1, [r5, #0xa8] + mov r0, #0 + strh r0, [r5, #0xac] + mov r2, #1 + str r2, [r5, #0x18] + add r1, sp, #0 + mov r2, #0x30 + bl __VENEER_MIi_CpuClear16 + mov r0, #0 + strh r0, [sp] + strh r0, [sp, #6] + add r0, r5, #0x100 + ldrh r0, [r0, #0xec] + add r1, sp, #0x18 + cmp r0, #2 + moveq r3, #0x14 + add r0, r5, #0x8a + movne r3, #0xa + add r0, r0, #0x100 + mov r2, #6 + strb r3, [sp, #0xe] + bl __VENEER_MI_CpuCopy8 + add r1, sp, #0x1e + add r0, r5, #0xe0 + mov r2, #6 + bl __VENEER_MI_CpuCopy8 + add r0, sp, #0x30 + str r0, [sp, #0x2c] + add r1, sp, #0 + bl WMSP_WL_MaData + ldrh r1, [r0, #4] + cmp r1, #0 + beq _06008AAC + mov r1, #1 + strh r1, [r4, #2] + mov r1, #0x100 + strh r1, [r4, #4] + ldrh r1, [r0, #4] + mov r0, r4 + strh r1, [r4, #6] + bl __VENEER_WMSP_ReturnResult2Wm9 + b _06008ABC +_06008AAC: + mov r1, #0 + mov r0, r4 + strh r1, [r4, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 +_06008ABC: + add sp, sp, #0x230 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06008AC8: .word wmspW + 0x1000 + arm_func_end WMSP_SetPowerSaveMode + + arm_func_start WMSP_StartTestRxMode +WMSP_StartTestRxMode: ; 0x06008ACC + stmdb sp!, {r3, lr} + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x29 + strh r1, [r0] + mov r1, #4 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + arm_func_end WMSP_StartTestRxMode + + arm_func_start WMSP_StopTestRxMode +WMSP_StopTestRxMode: ; 0x06008AF0 + stmdb sp!, {r3, lr} + bl __VENEER_WMSP_GetBuffer4Callback2Wm9 + mov r1, #0x2a + strh r1, [r0] + mov r1, #4 + strh r1, [r0, #2] + bl __VENEER_WMSP_ReturnResult2Wm9 + ldmia sp!, {r3, lr} + bx lr + arm_func_end WMSP_StopTestRxMode + + arm_func_start WlessLibReboot +WlessLibReboot: ; 0x06008B14 + stmdb sp!, {r3, lr} + bl ClearTimeOut + bl WShutdown + bl InitMac + bl ReleaseAllWlHeapBuf + bl InitializeTask + ldr r0, _06008B5C ; =0x0380FFF4 + ldr r0, [r0] + add r1, r0, #0x300 + ldr r0, [r0, #0x31c] + ldrh r1, [r1, #0x20] + bl InitializeParam + bl InitializeCmdIf + bl InitializeMLME + bl InitializeCAM + bl WSetDefaultParameters + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06008B5C: .word 0x0380FFF4 + arm_func_end WlessLibReboot + + arm_func_start WL_InitDriver +WL_InitDriver: ; 0x06008B60 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + mov r4, r0 + ldr r1, [r4] + ldr r3, _06008D20 ; =0x0380FFF4 + ldr r2, _06008D24 ; =0x00000694 + mov r0, #0 + str r1, [r3] + bl __VENEER_MIi_CpuClearFast + bl __VENEER_OS_GetLockID + ldr r2, _06008D20 ; =0x0380FFF4 + ldr r1, [r2] + str r0, [r1, #0x314] + ldr r1, [r4, #0x18] + ldr r0, [r2] + str r1, [r0, #0x30c] + ldr r1, [r4, #0x1c] + ldr r0, [r2] + mov r1, r1, lsr #1 + str r1, [r0, #0x310] + ldr r1, [r2] + ldr r0, [r1, #0x310] + cmp r0, #0 + mvneq r0, #0 + streq r0, [r1, #0x310] + add r0, r4, #0x20 + bl InitializeHeapBuf + bl FLASH_MakeImage + ldr r3, _06008D28 ; =0x04000304 + ldr r1, _06008D20 ; =0x0380FFF4 + ldrh r2, [r3] + mov r0, #0x30 + orr r2, r2, #2 + strh r2, [r3] + strh r0, [r3, #-0xfe] + ldr r0, [r1] + mov r2, #3 + str r2, [r0, #0x68c] + ldr r1, [r1] + mov r0, #0x3c + add r1, r1, #0x92 + add r2, r1, #0x600 + mov r1, #2 + bl FLASH_Read + ldr r1, _06008D20 ; =0x0380FFF4 + mov r0, #0x3e + ldr r2, [r1] + mov r1, #2 + add r2, r2, #0x690 + bl FLASH_Read + ldr r2, _06008D20 ; =0x0380FFF4 + ldr r3, [r4, #0x10] + ldr r0, [r2] + mov r1, #0x1c + str r3, [r0, #0x308] + ldr r0, [r2] + ldr r2, [r4, #0x14] + str r2, [r0, #0x304] + ldr r0, [r4, #0x30] + bl __VENEER__u32_div_f + mov r1, r0 + ldr r0, [r4, #0x2c] + bl InitializeParam + bl InitializeTask + bl InitializeCmdIf + bl InitializeMLME + bl InitializeCAM + bl InitializeAlarm + add r0, sp, #8 + bl FLASH_VerifyCheckSum + cmp r0, #0 + beq _06008C9C + ldr r0, _06008D20 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3e] + orr r1, r1, #0x80 + strh r1, [r0, #0x3e] + b _06008CC4 +_06008C9C: + bl WConfigDevice + bl DiagMacRegister + bl WWakeUp + bl InitMac + bl InitRF + bl DiagMacMemory + bl DiagBaseBand + bl InitBaseBand + bl WSetDefaultParameters + bl WShutdown +_06008CC4: + ldr r1, [r4, #8] + ldr r0, _06008D20 ; =0x0380FFF4 + str r1, [sp] + ldr r2, [r4, #0xc] + ldr r1, _06008D2C ; =MainTaskRoutine + str r2, [sp, #4] + ldr r0, [r0] + ldr r3, [r4, #4] + add r0, r0, #0x18 + mov r2, #0 + bl __VENEER_OS_CreateThread + ldr r0, _06008D20 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x18 + bl __VENEER_OS_WakeupThreadDirect + bl InitializeIntr + ldr r0, _06008D20 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x3e] + add sp, sp, #0xc + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_06008D20: .word 0x0380FFF4 +_06008D24: .word 0x00000694 +_06008D28: .word 0x04000304 +_06008D2C: .word MainTaskRoutine + arm_func_end WL_InitDriver + + arm_func_start __VENEER_MIi_CpuClearFast +__VENEER_MIi_CpuClearFast: ; 0x06008D30 + ldr pc, _06008D34 ; =MIi_CpuClearFast + .align 2, 0 +_06008D34: .word MIi_CpuClearFast + arm_func_end __VENEER_MIi_CpuClearFast + + arm_func_start __VENEER_OS_GetLockID +__VENEER_OS_GetLockID: ; 0x06008D38 + ldr pc, _06008D3C ; =OS_GetLockID + .align 2, 0 +_06008D3C: .word OS_GetLockID + arm_func_end __VENEER_OS_GetLockID + + arm_func_start WL_GetThreadStruct +WL_GetThreadStruct: ; 0x06008D40 + ldr r0, _06008D50 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x18 + bx lr + .align 2, 0 +_06008D50: .word 0x0380FFF4 + arm_func_end WL_GetThreadStruct + + arm_func_start WL_Terminate +WL_Terminate: ; 0x06008D54 + stmdb sp!, {r4, lr} + ldr r0, _06008D9C ; =0x0380FFF4 + ldr r4, [r0] + add r0, r4, #0x18 + bl __VENEER_OS_IsThreadTerminated + cmp r0, #1 + beq _06008D94 + mov r0, #2 + mov r1, #0x16 + bl AddTask + add r0, r4, #0x18 + bl __VENEER_OS_JoinThread +_06008D84: + add r0, r4, #0x18 + bl __VENEER_OS_IsThreadTerminated + cmp r0, #0 + beq _06008D84 +_06008D94: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06008D9C: .word 0x0380FFF4 + arm_func_end WL_Terminate + + arm_func_start __VENEER_OS_IsThreadTerminated +__VENEER_OS_IsThreadTerminated: ; 0x06008DA0 + ldr pc, _06008DA4 ; =OS_IsThreadTerminated + .align 2, 0 +_06008DA4: .word OS_IsThreadTerminated + arm_func_end __VENEER_OS_IsThreadTerminated + + arm_func_start __VENEER_OS_JoinThread +__VENEER_OS_JoinThread: ; 0x06008DA8 + ldr pc, _06008DAC ; =OS_JoinThread + .align 2, 0 +_06008DAC: .word OS_JoinThread + arm_func_end __VENEER_OS_JoinThread + + arm_func_start InitializeTask +InitializeTask: ; 0x06008DB0 + stmdb sp!, {r4, lr} + ldr r0, _06008E30 ; =0x0380FFF4 + mov r3, #0 + ldr lr, [r0] + ldr r2, _06008E34 ; =0x0000FFFF + strh r3, [lr, #0x10] + strh r3, [lr, #0x12] +_06008DCC: + add r0, lr, r3, lsl #1 + strh r2, [r0, #8] + ldrh r0, [r0, #8] + mov r1, r3, lsl #1 + add r3, r3, #1 + strh r0, [lr, r1] + cmp r3, #4 + blo _06008DCC + ldr ip, _06008E34 ; =0x0000FFFF + mov r4, #0 + ldr r1, _06008E38 ; =pTaskFunc + mov r2, r4 +_06008DFC: + add r3, lr, r4, lsl #3 + strh ip, [r3, #0xbc] + ldr r0, [r1, r4, lsl #2] + strh r2, [r3, #0xbe] + add r4, r4, #1 + str r0, [r3, #0xc0] + cmp r4, #0x18 + blo _06008DFC + mov r0, #3 + mov r1, #0xc + bl AddTask + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06008E30: .word 0x0380FFF4 +_06008E34: .word 0x0000FFFF +_06008E38: .word pTaskFunc + arm_func_end InitializeTask + + arm_func_start MainTaskRoutine +MainTaskRoutine: ; 0x06008E3C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r7, _06008EE8 ; =0x0380FFF4 + mov r0, #0 + ldr r8, [r7] + ldr r4, _06008EEC ; =0x01000010 + strh r0, [r8, #0x10] + ldr sb, _06008EF0 ; =0x0000FFFF + strh r0, [r8, #0x14] + add r6, sp, #0 + mov r5, r0 +_06008E64: + ldr r0, [r7] + mov r1, r6 + ldr r0, [r0, #0x308] + mov r2, r5 + bl __VENEER_OS_ReceiveMessage + cmp r0, #0 + beq _06008E88 + mov r0, r6 + bl ExecuteMessage +_06008E88: + mov r0, r4 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r8, #0x10] + strh r1, [r8, #0x12] + mov r1, r1, lsl #1 + ldrh r1, [r8, r1] + cmp r1, sb + bne _06008EBC + ldrh r1, [r8, #0x10] + add r1, r1, #1 + strh r1, [r8, #0x10] + bl __VENEER_OS_EnableIrqMask + b _06008E64 +_06008EBC: + bl __VENEER_OS_EnableIrqMask + ldrh r0, [r8, #0x12] + bl DeleteTask + strh r0, [r8, #0x14] + ldrh r0, [r8, #0x14] + add r0, r8, r0, lsl #3 + ldr r0, [r0, #0xc0] + mov lr, pc + bx r0 + strh sb, [r8, #0x14] + b _06008E64 + .align 2, 0 +_06008EE8: .word 0x0380FFF4 +_06008EEC: .word 0x01000010 +_06008EF0: .word 0x0000FFFF + arm_func_end MainTaskRoutine + + arm_func_start __VENEER_OS_DisableIrqMask +__VENEER_OS_DisableIrqMask: ; 0x06008EF4 + ldr pc, _06008EF8 ; =OS_DisableIrqMask + .align 2, 0 +_06008EF8: .word OS_DisableIrqMask + arm_func_end __VENEER_OS_DisableIrqMask + + arm_func_start __VENEER_OS_EnableIrqMask +__VENEER_OS_EnableIrqMask: ; 0x06008EFC + ldr pc, _06008F00 ; =OS_EnableIrqMask + .align 2, 0 +_06008F00: .word OS_EnableIrqMask + arm_func_end __VENEER_OS_EnableIrqMask + + arm_func_start AddTask +AddTask: ; 0x06008F04 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _06008FB4 ; =0x0380FFF4 + mov r7, r0 + ldr r4, [r2] + ldr r0, _06008FB8 ; =0x01000010 + mov r6, r1 + add r5, r4, #0xbc + bl __VENEER_OS_DisableIrqMask + add r2, r5, r6, lsl #3 + ldrh r1, [r2, #2] + mov ip, r6, lsl #3 + cmp r1, #0 + bne _06008F7C + mov r3, #1 + strh r3, [r2, #2] + rsb r1, r3, #0x10000 + strh r1, [r5, ip] + add r1, r4, r7, lsl #1 + ldrh r2, [r1, #8] + rsb r1, r3, #0x10000 + cmp r2, r1 + mov r1, r7, lsl #1 + streqh r6, [r4, r1] + addne r1, r4, r2, lsl #3 + strneh r6, [r1, #0xbc] + add r1, r4, r7, lsl #1 + strh r6, [r1, #8] + ldrh r1, [r4, #0x10] + cmp r7, r1 + strlth r7, [r4, #0x10] +_06008F7C: + bl __VENEER_OS_EnableIrqMask + cmp r7, #3 + beq _06008FAC + ldrh r0, [r4, #0x12] + cmp r0, #3 + bne _06008FAC + ldr r0, _06008FB4 ; =0x0380FFF4 + mov r1, #0 + ldr r0, [r0] + mov r2, r1 + ldr r0, [r0, #0x308] + bl __VENEER_OS_SendMessage +_06008FAC: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06008FB4: .word 0x0380FFF4 +_06008FB8: .word 0x01000010 + arm_func_end AddTask + + arm_func_start DeleteTask +DeleteTask: ; 0x06008FBC + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06009028 ; =0x0380FFF4 + mov r5, r0 + ldr r0, _0600902C ; =0x01000010 + ldr r4, [r1] + bl __VENEER_OS_DisableIrqMask + mov lr, r5, lsl #1 + ldrh r5, [r4, lr] + ldr r2, _06009030 ; =0x0000FFFF + cmp r5, r2 + beq _06009018 + add ip, r4, #0xbc + add r1, ip, r5, lsl #3 + mov r3, #0 + strh r3, [r1, #2] + mov r3, r5, lsl #3 + ldrh r1, [ip, r3] + cmp r1, r2 + streqh r2, [r4, lr] + addeq r1, r4, lr + streqh r2, [r1, #8] + strneh r1, [r4, lr] + strneh r2, [ip, r3] +_06009018: + bl __VENEER_OS_EnableIrqMask + mov r0, r5 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06009028: .word 0x0380FFF4 +_0600902C: .word 0x01000010 +_06009030: .word 0x0000FFFF + arm_func_end DeleteTask + + arm_func_start LowestIdleTask +LowestIdleTask: ; 0x06009034 + stmdb sp!, {r3, lr} + ldr r0, _0600906C ; =0x0380FFF4 + add r1, sp, #0 + ldr r0, [r0] + mov r2, #1 + ldr r0, [r0, #0x308] + bl __VENEER_OS_ReceiveMessage + add r0, sp, #0 + bl ExecuteMessage + mov r0, #3 + mov r1, #0xc + bl AddTask + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600906C: .word 0x0380FFF4 + arm_func_end LowestIdleTask + + arm_func_start ExecuteMessage +ExecuteMessage: ; 0x06009070 + stmdb sp!, {r3, lr} + ldr r1, [r0] + cmp r1, #0 + beq _0600909C + ldr r0, _060090A4 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x200 + bl NewHeapBuf + mov r0, #2 + mov r1, #0xb + bl AddTask +_0600909C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060090A4: .word 0x0380FFF4 + arm_func_end ExecuteMessage + + arm_func_start AllocateHeapBuf +AllocateHeapBuf: ; 0x060090A8 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600913C ; =0x0380FFF4 + movs r3, r1 + ldr r1, [r2] + mov r5, r0 + moveq r0, #0 + beq _06009134 + ldr r0, [r1, #0x17c] + cmp r0, #0 + beq _060090DC + cmp r0, #1 + beq _060090F4 + b _06009108 +_060090DC: + ldr r0, [r1, #0x180] + ldr r1, [r1, #0x184] + add r2, r3, #0xc + bl __VENEER_OS_AllocFromHeap + mov r4, r0 + b _06009108 +_060090F4: + ldr r1, [r1, #0x180] + add r0, r3, #0xc + mov lr, pc + bx r1 + mov r4, r0 +_06009108: + cmp r4, #0 + moveq r0, #0 + beq _06009134 + ldr r1, _06009140 ; =0x0000BF1D + mov r0, r5 + strh r1, [r4, #0xa] + mov r2, #0 + mov r1, r4 + strh r2, [r4, #8] + bl AddHeapBuf + mov r0, r4 +_06009134: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600913C: .word 0x0380FFF4 +_06009140: .word 0x0000BF1D + arm_func_end AllocateHeapBuf + + arm_func_start ReleaseHeapBuf +ReleaseHeapBuf: ; 0x06009144 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r1 + ldr r5, _060091BC ; =0x0380FFF4 + ldrh r3, [r4, #0xa] + ldr r2, _060091C0 ; =0x0000BF1D + ldr r5, [r5] + cmp r3, r2 + movne r0, #1 + bne _060091B4 + bl DeleteHeapBuf + movs r6, r0 + bne _060091B0 + ldr r0, [r5, #0x17c] + cmp r0, #0 + beq _0600918C + cmp r0, #1 + beq _060091A0 + b _060091B0 +_0600918C: + ldr r0, [r5, #0x180] + ldr r1, [r5, #0x184] + mov r2, r4 + bl __VENEER_OS_FreeToHeap + b _060091B0 +_060091A0: + ldr r1, [r5, #0x184] + mov r0, r4 + mov lr, pc + bx r1 +_060091B0: + mov r0, r6 +_060091B4: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060091BC: .word 0x0380FFF4 +_060091C0: .word 0x0000BF1D + arm_func_end ReleaseHeapBuf + + arm_func_start MoveHeapBuf +MoveHeapBuf: ; 0x060091C4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r2 + ldrh r3, [r6, #0xa] + ldr r2, _0600922C ; =0x0000BF1D + mov r4, r0 + cmp r3, r2 + mov r7, r1 + movne r0, #1 + bne _06009224 + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + mov r5, r0 + mov r0, r4 + mov r1, r6 + bl DeleteHeapBuf + movs r4, r0 + bne _06009218 + mov r0, r7 + mov r1, r6 + bl AddHeapBuf + mov r4, r0 +_06009218: + mov r0, r5 + bl __VENEER_OS_EnableIrqMask + mov r0, r4 +_06009224: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600922C: .word 0x0000BF1D + arm_func_end MoveHeapBuf + + arm_func_start NewHeapBuf +NewHeapBuf: ; 0x06009230 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r0, #0x1000000 + mov r4, r1 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r5, #8] + cmp r1, #0 + mvneq r1, #0 + streq r1, [r4] + streq r4, [r5] + ldrne r1, [r5, #4] + strne r1, [r4] + strne r4, [r1, #4] + mvn r1, #0 + str r1, [r4, #4] + ldrh r2, [r5, #0xa] + ldr r1, _0600929C ; =0x0000BF1D + strh r2, [r4, #8] + strh r1, [r4, #0xa] + str r4, [r5, #4] + ldrh r1, [r5, #8] + add r1, r1, #1 + strh r1, [r5, #8] + bl __VENEER_OS_EnableIrqMask + mov r0, #0 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600929C: .word 0x0000BF1D + arm_func_end NewHeapBuf + + arm_func_start AddHeapBuf +AddHeapBuf: ; 0x060092A0 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldrh r2, [r4, #0xa] + ldr r1, _06009328 ; =0x0000BF1D + mov r5, r0 + cmp r2, r1 + movne r0, #1 + bne _06009320 + ldrh r0, [r4, #8] + cmp r0, #0 + movne r0, #2 + bne _06009320 + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r5, #8] + cmp r1, #0 + mvneq r1, #0 + streq r1, [r4] + streq r4, [r5] + ldrne r1, [r5, #4] + strne r1, [r4] + strne r4, [r1, #4] + mvn r1, #0 + str r1, [r4, #4] + ldrh r1, [r5, #0xa] + strh r1, [r4, #8] + str r4, [r5, #4] + ldrh r1, [r5, #8] + add r1, r1, #1 + strh r1, [r5, #8] + bl __VENEER_OS_EnableIrqMask + mov r0, #0 +_06009320: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06009328: .word 0x0000BF1D + arm_func_end AddHeapBuf + + arm_func_start DeleteHeapBuf +DeleteHeapBuf: ; 0x0600932C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldrh r2, [r4, #0xa] + ldr r1, _060093E8 ; =0x0000BF1D + mov r5, r0 + cmp r2, r1 + movne r0, #1 + bne _060093E0 + ldrh r1, [r4, #8] + ldrh r0, [r5, #0xa] + cmp r1, r0 + movne r0, #2 + bne _060093E0 + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r5, #8] + sub r1, r1, #1 + strh r1, [r5, #8] + ldrh r1, [r5, #8] + cmp r1, #0 + mvneq r1, #0 + streq r1, [r5] + streq r1, [r5, #4] + beq _060093D0 + ldr r1, [r5] + cmp r4, r1 + ldreq r2, [r4, #4] + mvneq r1, #0 + streq r2, [r5] + streq r1, [r2] + beq _060093D0 + ldr r1, [r5, #4] + ldr r2, [r4] + cmp r4, r1 + streq r2, [r5, #4] + mvneq r1, #0 + streq r1, [r2, #4] + ldrne r1, [r4, #4] + strne r2, [r1] + ldmneia r4, {r1, r2} + strne r2, [r1, #4] +_060093D0: + mov r1, #0 + strh r1, [r4, #8] + bl __VENEER_OS_EnableIrqMask + mov r0, #0 +_060093E0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060093E8: .word 0x0000BF1D + arm_func_end DeleteHeapBuf + + arm_func_start GetHeapBufNextAdrs +GetHeapBufNextAdrs: ; 0x060093EC + ldr r0, [r0, #4] + bx lr + arm_func_end GetHeapBufNextAdrs + + arm_func_start InitHeapBufMan +InitHeapBufMan: ; 0x060093F4 + mvn r2, #0 + str r2, [r0] + str r2, [r0, #4] + mov r2, #0 + strh r2, [r0, #8] + strh r1, [r0, #0xa] + bx lr + arm_func_end InitHeapBufMan + + arm_func_start InitializeHeapBuf +InitializeHeapBuf: ; 0x06009410 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _060094E4 ; =0x0380FFF4 + ldr r2, [r0] + ldr r4, [r1] + mov r1, #2 + str r2, [r4, #0x17c] + ldr r2, [r0, #4] + add r5, r4, #0x344 + str r2, [r4, #0x180] + ldr r2, [r0, #8] + add r0, r4, #0x188 + str r2, [r4, #0x184] + bl InitHeapBufMan + add r0, r4, #0x194 + mov r1, #3 + bl InitHeapBufMan + add r0, r4, #0x1a0 + mov r1, #4 + bl InitHeapBufMan + add r0, r4, #0x1ac + mov r1, #5 + bl InitHeapBufMan + add r0, r4, #0x1b8 + mov r1, #6 + bl InitHeapBufMan + add r0, r4, #0x1c4 + mov r1, #7 + bl InitHeapBufMan + add r0, r4, #0x1d0 + mov r1, #8 + bl InitHeapBufMan + add r0, r4, #0x1dc + mov r1, #9 + bl InitHeapBufMan + add r0, r4, #0x1e8 + mov r1, #0xa + bl InitHeapBufMan + add r0, r4, #0x1f4 + mov r1, #0xb + bl InitHeapBufMan + add r0, r4, #0x200 + mov r1, #0xc + bl InitHeapBufMan + add r0, r4, #0x188 + mov r1, #0x81 + bl AllocateHeapBuf + add r0, r0, #0xc + str r0, [r5, #0x9c] + mov r0, #0 + strh r0, [r5, #0xa0] + strh r0, [r5, #0xa4] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060094E4: .word 0x0380FFF4 + arm_func_end InitializeHeapBuf + + arm_func_start ReleaseAllWlHeapBuf +ReleaseAllWlHeapBuf: ; 0x060094E8 + stmdb sp!, {r4, lr} + ldr r0, _0600953C ; =0x0380FFF4 + ldr r4, [r0] + add r0, r4, #0x194 + bl ReleaseAllHeapBuf + add r0, r4, #0x1a0 + bl ReleaseAllHeapBuf + add r0, r4, #0x1ac + bl ReleaseAllHeapBuf + add r0, r4, #0x1b8 + bl ReleaseAllHeapBuf + add r0, r4, #0x1c4 + bl ReleaseAllHeapBuf + add r0, r4, #0x1d0 + bl ReleaseAllHeapBuf + add r0, r4, #0x1dc + bl ReleaseAllHeapBuf + add r0, r4, #0x1e8 + bl ReleaseAllHeapBuf + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600953C: .word 0x0380FFF4 + arm_func_end ReleaseAllWlHeapBuf + + arm_func_start ReleaseAllHeapBuf +ReleaseAllHeapBuf: ; 0x06009540 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrh r0, [r6, #8] + ldr r1, [r6] + cmp r0, #0 + beq _06009578 + mvn r4, #0 + b _06009570 +_06009560: + ldr r5, [r1, #4] + mov r0, r6 + bl ReleaseHeapBuf + mov r1, r5 +_06009570: + cmp r1, r4 + bne _06009560 +_06009578: + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end ReleaseAllHeapBuf + + arm_func_start InitializeParam +InitializeParam: ; 0x06009580 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _060095FC ; =0x0380FFF4 + mov r5, r0 + ldr r3, [r2] + mov r6, r1 + add r1, r3, #0x31c + mov r0, #0 + mov r2, #0x28 + ldr r4, [r3, #0x3e0] + bl __VENEER_MIi_CpuClear16 + ldr r1, _060095FC ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + mov r2, #0xc0 + add r1, r1, #0x344 + bl __VENEER_MIi_CpuClear16 + ldr r3, _060095FC ; =0x0380FFF4 + mov r0, r6, lsl #0x10 + ldr r2, [r3] + mov r1, r0, lsr #0x10 + str r5, [r2, #0x31c] + ldr r0, [r3] + add r0, r0, #0x300 + strh r1, [r0, #0x20] + ldr r0, [r3] + add r0, r0, #0x300 + strh r1, [r0, #0x22] + ldr r0, [r3] + str r4, [r0, #0x3e0] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060095FC: .word 0x0380FFF4 + arm_func_end InitializeParam + + arm_func_start WSetMacAdrs +WSetMacAdrs: ; 0x06009600 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4] + tst r0, #1 + movne r0, #5 + bne _06009650 + ldr r0, _06009658 ; =0x0380FFF4 + mov r1, r4 + ldr r0, [r0] + add r0, r0, #0x324 + bl WSetMacAdrs1 + ldr r0, _0600965C ; =0x04808018 + mov r1, r4 + bl WSetMacAdrs1 + ldr r1, _06009658 ; =0x0380FFF4 + mov r0, #0 + ldr r2, [r1] + ldr r1, [r2, #0x340] + orr r1, r1, #2 + str r1, [r2, #0x340] +_06009650: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06009658: .word 0x0380FFF4 +_0600965C: .word 0x04808018 + arm_func_end WSetMacAdrs + + arm_func_start WSetRetryLimit +WSetRetryLimit: ; 0x06009660 + cmp r0, #0xff + movhi r0, #5 + bxhi lr + ldr r1, _0600968C ; =0x0380FFF4 + ldr r2, _06009690 ; =0x0480802C + ldr r1, [r1] + add r1, r1, #0x300 + strh r0, [r1, #0x2a] + strh r0, [r2] + mov r0, #0 + bx lr + .align 2, 0 +_0600968C: .word 0x0380FFF4 +_06009690: .word 0x0480802C + arm_func_end WSetRetryLimit + + arm_func_start WSetEnableChannel +WSetEnableChannel: ; 0x06009694 + ldr r1, _060096CC ; =0x00007FFE + tst r0, r1 + moveq r0, #5 + bxeq lr + ldr r2, _060096D0 ; =0x0380FFF4 + ldr r1, [r2] + add r1, r1, #0x300 + strh r0, [r1, #0x2c] + ldr r2, [r2] + mov r0, #0 + ldr r1, [r2, #0x340] + orr r1, r1, #4 + str r1, [r2, #0x340] + bx lr + .align 2, 0 +_060096CC: .word 0x00007FFE +_060096D0: .word 0x0380FFF4 + arm_func_end WSetEnableChannel + + arm_func_start WSetMode +WSetMode: ; 0x060096D4 + stmdb sp!, {r3, lr} + cmp r0, #3 + movhi r0, #5 + bhi _06009740 + ldr ip, _06009748 ; =0x0380FFF4 + ldr r3, _0600974C ; =0x04808006 + ldr r1, [ip] + ldr r2, _06009750 ; =0x0000FFF8 + add r1, r1, #0x300 + strh r0, [r1, #0x2e] + ldr r1, [ip] + add r1, r1, #0x300 + strh r0, [r1, #0x50] + ldrh r1, [r3] + and r1, r1, r2 + orr r0, r1, r0 + strh r0, [r3] + ldr r0, [ip] + add r0, r0, #0x300 + ldrh r0, [r0, #0x52] + bl WSetPowerMgtMode + ldr r1, _06009748 ; =0x0380FFF4 + mov r0, #0 + ldr r2, [r1] + ldr r1, [r2, #0x340] + orr r1, r1, #8 + str r1, [r2, #0x340] +_06009740: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06009748: .word 0x0380FFF4 +_0600974C: .word 0x04808006 +_06009750: .word 0x0000FFF8 + arm_func_end WSetMode + + arm_func_start WSetRate +WSetRate: ; 0x06009754 + stmdb sp!, {r3, lr} + cmp r0, #2 + movhi r0, #5 + bhi _0600977C + ldr r1, _06009784 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x300 + strh r0, [r1, #0x30] + bl WSetTxTimeStampOffset + mov r0, #0 +_0600977C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06009784: .word 0x0380FFF4 + arm_func_end WSetRate + + arm_func_start WSetWepMode +WSetWepMode: ; 0x06009788 + ldr r1, _0600981C ; =0x0380FFF4 + cmp r0, #3 + ldr r1, [r1] + movhi r0, #5 + add r2, r1, #0x344 + bxhi lr + add r1, r1, #0x300 + strh r0, [r1, #0x34] + ldrh r1, [r2, #0x7c] + cmp r0, #0 + biceq r1, r1, #0x10 + streqh r1, [r2, #0x7c] + ldreqh r1, [r2, #0x8a] + ldr r3, _06009820 ; =0x04808006 + biceq r1, r1, #0x4000 + orrne r1, r1, #0x10 + strneh r1, [r2, #0x7c] + ldrneh r1, [r2, #0x8a] + orrne r1, r1, #0x4000 + strh r1, [r2, #0x8a] + ldrh r1, [r2, #8] + cmp r1, #0x40 + cmpeq r0, #1 + ldreq r1, _0600981C ; =0x0380FFF4 + ldreqh r2, [r2, #0x7c] + ldreq r1, [r1] + ldreq r1, [r1, #0x4ac] + streqh r2, [r1, #0x2e] + cmp r0, #0 + ldr r1, _06009824 ; =0x0000FFC7 + ldrh r2, [r3] + moveq r0, #1 + and r1, r2, r1 + orr r0, r1, r0, lsl #3 + strh r0, [r3] + mov r0, #0 + bx lr + .align 2, 0 +_0600981C: .word 0x0380FFF4 +_06009820: .word 0x04808006 +_06009824: .word 0x0000FFC7 + arm_func_end WSetWepMode + + arm_func_start WSetWepKeyId +WSetWepKeyId: ; 0x06009828 + cmp r0, #3 + ldrls r1, _06009848 ; =0x0380FFF4 + movhi r0, #5 + ldrls r1, [r1] + addls r1, r1, #0x300 + strlsh r0, [r1, #0x36] + movls r0, #0 + bx lr + .align 2, 0 +_06009848: .word 0x0380FFF4 + arm_func_end WSetWepKeyId + + arm_func_start WSetWepKey +WSetWepKey: ; 0x0600984C + stmdb sp!, {r4, lr} + ldr r1, _0600989C ; =0x04805F80 + mov r2, #0x14 + mov r4, r0 + bl __VENEER_MIi_CpuCopy16 + ldr r1, _060098A0 ; =0x04805FA0 + add r0, r4, #0x14 + mov r2, #0x14 + bl __VENEER_MIi_CpuCopy16 + ldr r1, _060098A4 ; =0x04805FC0 + add r0, r4, #0x28 + mov r2, #0x14 + bl __VENEER_MIi_CpuCopy16 + ldr r1, _060098A8 ; =0x04805FE0 + add r0, r4, #0x3c + mov r2, #0x14 + bl __VENEER_MIi_CpuCopy16 + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600989C: .word 0x04805F80 +_060098A0: .word 0x04805FA0 +_060098A4: .word 0x04805FC0 +_060098A8: .word 0x04805FE0 + arm_func_end WSetWepKey + + arm_func_start WSetBeaconType +WSetBeaconType: ; 0x060098AC + cmp r0, #1 + movhi r0, #5 + bxhi lr + ldr r1, _060098E0 ; =0x0380FFF4 + and r2, r0, #1 + ldr r1, [r1] + mov r0, #0 + add r1, r1, #0x300 + ldrh r3, [r1, #0x3a] + bic r3, r3, #1 + orr r2, r3, r2 + strh r2, [r1, #0x3a] + bx lr + .align 2, 0 +_060098E0: .word 0x0380FFF4 + arm_func_end WSetBeaconType + + arm_func_start WSetBcSsidResponse +WSetBcSsidResponse: ; 0x060098E4 + cmp r0, #1 + movhi r0, #5 + bxhi lr + ldr r1, _06009918 ; =0x0380FFF4 + mov r2, r0, lsl #0x1f + ldr r1, [r1] + mov r0, #0 + add r1, r1, #0x300 + ldrh r3, [r1, #0x3a] + bic r3, r3, #2 + orr r2, r3, r2, lsr #30 + strh r2, [r1, #0x3a] + bx lr + .align 2, 0 +_06009918: .word 0x0380FFF4 + arm_func_end WSetBcSsidResponse + + arm_func_start WSetBeaconLostThreshold +WSetBeaconLostThreshold: ; 0x0600991C + cmp r0, #0xff + movhi r0, #5 + bxhi lr + ldr r2, _06009950 ; =0x0380FFF4 + mov r3, #0 + ldr r1, [r2] + add r1, r1, #0x300 + strh r3, [r1, #0xc4] + ldr r1, [r2] + add r1, r1, #0x300 + strh r0, [r1, #0xc2] + mov r0, r3 + bx lr + .align 2, 0 +_06009950: .word 0x0380FFF4 + arm_func_end WSetBeaconLostThreshold + + arm_func_start WSetActiveZoneTime +WSetActiveZoneTime: ; 0x06009954 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + cmp r4, #0xa + movlo r0, #5 + blo _060099F4 + ldr r0, _060099FC ; =0x0380FFF4 + cmp r1, #0 + ldr r0, [r0] + add r0, r0, #0x300 + strh r4, [r0, #0x3c] + ldrne r0, _06009A00 ; =0x04808134 + strneh r4, [r0] + ldr r0, _060099FC ; =0x0380FFF4 + ldr r1, [r0] + add r0, r1, #0x400 + ldrh r0, [r0, #0xa4] + cmp r0, #0 + beq _060099F0 + ldr r2, [r1, #0x4ac] + add r0, r1, #0x300 + ldrh r1, [r0, #0x52] + ldrh r0, [r0, #0xda] + add r2, r2, #0x24 + add r5, r2, r0 + cmp r1, #1 + add r0, r5, #6 + bne _060099DC + and r1, r4, #0xff + bl WL_WriteByte + mov r1, r4, asr #8 + add r0, r5, #7 + and r1, r1, #0xff + bl WL_WriteByte + b _060099F0 +_060099DC: + mov r1, #0xff + bl WL_WriteByte + add r0, r5, #7 + mov r1, #0xff + bl WL_WriteByte +_060099F0: + mov r0, #0 +_060099F4: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060099FC: .word 0x0380FFF4 +_06009A00: .word 0x04808134 + arm_func_end WSetActiveZoneTime + + arm_func_start WSetSsidMask +WSetSsidMask: ; 0x06009A04 + ldr r1, _06009A30 ; =0x0380FFF4 + mov r2, #0 + ldr r1, [r1] + add r3, r1, #0x384 +_06009A14: + ldrh r1, [r0], #2 + add r2, r2, #1 + cmp r2, #0x10 + strh r1, [r3], #2 + blo _06009A14 + mov r0, #0 + bx lr + .align 2, 0 +_06009A30: .word 0x0380FFF4 + arm_func_end WSetSsidMask + + arm_func_start WSetPreambleType +WSetPreambleType: ; 0x06009A34 + stmdb sp!, {r3, lr} + ldr r1, _06009AD4 ; =0x0380FFF4 + cmp r0, #1 + ldr r2, [r1] + movhi r0, #5 + add r1, r2, #0x344 + bhi _06009ACC + add r2, r2, #0x300 + ldrh ip, [r2, #0x3a] + mov r3, r0, lsl #0x1f + bic ip, ip, #4 + orr r3, ip, r3, lsr #29 + strh r3, [r2, #0x3a] + ldrh r2, [r1, #0x7c] + cmp r0, #0 + biceq r2, r2, #0x20 + orrne r2, r2, #0x20 + strh r2, [r1, #0x7c] + ldrh r2, [r1, #8] + cmp r2, #0x40 + ldreq r2, _06009AD4 ; =0x0380FFF4 + ldreq r3, [r2] + addeq r2, r3, #0x300 + ldreqh r2, [r2, #0x2e] + cmpeq r2, #1 + ldreqh r2, [r1, #0x7c] + ldreq r1, [r3, #0x4ac] + streqh r2, [r1, #0x2e] + ldr r1, _06009AD8 ; =0x048080BC + cmp r0, #0 + ldreqh r0, [r1] + biceq r0, r0, #6 + streqh r0, [r1] + ldrneh r0, [r1] + orrne r0, r0, #6 + strneh r0, [r1] + bl WSetTxTimeStampOffset + mov r0, #0 +_06009ACC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06009AD4: .word 0x0380FFF4 +_06009AD8: .word 0x048080BC + arm_func_end WSetPreambleType + + arm_func_start WSetAuthAlgo +WSetAuthAlgo: ; 0x06009ADC + cmp r0, #1 + ldrls r1, _06009AFC ; =0x0380FFF4 + movhi r0, #5 + ldrls r1, [r1] + addls r1, r1, #0x300 + strlsh r0, [r1, #0x32] + movls r0, #0 + bx lr + .align 2, 0 +_06009AFC: .word 0x0380FFF4 + arm_func_end WSetAuthAlgo + + arm_func_start WSetCCA_ED +WSetCCA_ED: ; 0x06009B00 + stmdb sp!, {r4, lr} + cmp r0, #3 + mov r4, r1 + movhi r0, #5 + bhi _06009B3C + cmp r4, #0x3f + movhi r0, #5 + bhi _06009B3C + mov r1, r0 + mov r0, #0x13 + bl BBP_Write + mov r1, r4 + mov r0, #0x35 + bl BBP_Write + mov r0, #0 +_06009B3C: + ldmia sp!, {r4, lr} + bx lr + arm_func_end WSetCCA_ED + + arm_func_start WSetMainAntenna +WSetMainAntenna: ; 0x06009B44 + cmp r0, #1 + movhi r0, #5 + bxhi lr + ldr r3, _06009BA4 ; =0x0380FFF4 + mov r0, r0, lsl #0x10 + ldr r2, [r3] + mov r1, r0, lsr #0x10 + add r0, r2, #0x300 + ldrh r2, [r0, #0x3a] + mov r1, r1, lsl #0x1f + bic r2, r2, #8 + orr r1, r2, r1, lsr #28 + strh r1, [r0, #0x3a] + ldr r0, [r3] + ldr r1, _06009BA8 ; =0x04808290 + add r0, r0, #0x300 + ldrh r3, [r0, #0x3a] + mov r0, #0 + mov r2, r3, lsl #0x1c + mov r3, r3, lsl #0x1a + mov r2, r2, lsr #0x1f + eor r2, r2, r3, lsr #31 + strh r2, [r1] + bx lr + .align 2, 0 +_06009BA4: .word 0x0380FFF4 +_06009BA8: .word 0x04808290 + arm_func_end WSetMainAntenna + + arm_func_start WSetDiversity +WSetDiversity: ; 0x06009BAC + cmp r0, #1 + cmpls r1, #1 + movhi r0, #5 + bxhi lr + cmp r0, #0 + beq _06009BD0 + cmp r0, #1 + beq _06009BFC + b _06009C24 +_06009BD0: + ldr r2, _06009C78 ; =0x0380FFF4 + mov r1, r1, lsl #0x10 + ldr r3, [r2] + mov r2, r1, lsr #0x10 + add r1, r3, #0x300 + ldrh r3, [r1, #0x3a] + mov r2, r2, lsl #0x1f + bic r3, r3, #0x20 + orr r2, r3, r2, lsr #26 + strh r2, [r1, #0x3a] + b _06009C24 +_06009BFC: + ldr r1, _06009C78 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r2, [r1, #0x2e] + cmp r2, #1 + movne r0, #0xb + bxne lr + ldrh r2, [r1, #0x3a] + bic r2, r2, #0x20 + strh r2, [r1, #0x3a] +_06009C24: + ldr r3, _06009C78 ; =0x0380FFF4 + mov r0, r0, lsl #0x10 + ldr r2, [r3] + mov r1, r0, lsr #0x10 + add r0, r2, #0x300 + ldrh r2, [r0, #0x3a] + mov r1, r1, lsl #0x1f + bic r2, r2, #0x10 + orr r1, r2, r1, lsr #27 + strh r1, [r0, #0x3a] + ldr r0, [r3] + ldr r1, _06009C7C ; =0x04808290 + add r0, r0, #0x300 + ldrh r3, [r0, #0x3a] + mov r0, #0 + mov r2, r3, lsl #0x1c + mov r3, r3, lsl #0x1a + mov r2, r2, lsr #0x1f + eor r2, r2, r3, lsr #31 + strh r2, [r1] + bx lr + .align 2, 0 +_06009C78: .word 0x0380FFF4 +_06009C7C: .word 0x04808290 + arm_func_end WSetDiversity + + arm_func_start WSetBeaconSendRecvIndicate +WSetBeaconSendRecvIndicate: ; 0x06009C80 + cmp r0, #1 + movhi r0, #5 + bxhi lr + ldr r1, _06009CBC ; =0x0380FFF4 + mov r0, r0, lsl #0x10 + ldr r2, [r1] + mov r1, r0, lsr #0x10 + add r0, r2, #0x300 + ldrh r2, [r0, #0x3a] + mov r1, r1, lsl #0x1f + bic r2, r2, #0x40 + orr r1, r2, r1, lsr #25 + strh r1, [r0, #0x3a] + mov r0, #0 + bx lr + .align 2, 0 +_06009CBC: .word 0x0380FFF4 + arm_func_end WSetBeaconSendRecvIndicate + + arm_func_start WSetNullKeyMode +WSetNullKeyMode: ; 0x06009CC0 + cmp r0, #1 + movhi r0, #5 + bxhi lr + ldr r2, _06009D08 ; =0x0380FFF4 + mov r1, r0, lsl #0x10 + ldr r3, [r2] + mov r2, r1, lsr #0x10 + add r1, r3, #0x300 + ldrh r3, [r1, #0x3a] + mov r2, r2, lsl #0x1f + bic r3, r3, #0x80 + orr r2, r3, r2, lsr #24 + strh r2, [r1, #0x3a] + ldreq r1, _06009D0C ; =0x0480802A + ldreqh r0, [r1] + streqh r0, [r1, #-2] + mov r0, #0 + bx lr + .align 2, 0 +_06009D08: .word 0x0380FFF4 +_06009D0C: .word 0x0480802A + arm_func_end WSetNullKeyMode + + arm_func_start WSetBssid +WSetBssid: ; 0x06009D10 + stmdb sp!, {r4, lr} + ldr r1, _06009D68 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + mov r1, r4 + add r0, r0, #0x3a8 + bl WSetMacAdrs1 + ldr r0, _06009D6C ; =0x04808020 + mov r1, r4 + bl WSetMacAdrs1 + ldrh r0, [r4] + ldr r1, _06009D70 ; =0x048080D0 + tst r0, #1 + ldrneh r0, [r1] + bicne r0, r0, #0x400 + strneh r0, [r1] + ldreqh r0, [r1] + orreq r0, r0, #0x400 + streqh r0, [r1] + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06009D68: .word 0x0380FFF4 +_06009D6C: .word 0x04808020 +_06009D70: .word 0x048080D0 + arm_func_end WSetBssid + + arm_func_start WSetSsid +WSetSsid: ; 0x06009D74 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _06009E80 ; =0x0380FFF4 + mov r8, r0 + ldr r2, [r2] + cmp r8, #0x20 + mov r7, r1 + add r4, r2, #0x344 + mov r6, #0 + movhi r0, #5 + bhi _06009E78 + ldrh r0, [r4, #8] + cmp r0, #0x40 + addeq r0, r2, #0x300 + ldreqh r0, [r0, #0x2e] + cmpeq r0, #1 + bne _06009DD0 + ldrh r0, [r4, #0x1e] + cmp r0, r8 + movne r0, #6 + bne _06009E78 + ldrh r0, [r4, #0x92] + cmp r0, #0 + movne r6, #1 +_06009DD0: + mov r5, #0 + add sb, r4, #0x20 + b _06009DF8 +_06009DDC: + mov r0, r7 + bl WL_ReadByte + mov r1, r0 + add r0, sb, r5 + bl WL_WriteByte + add r7, r7, #1 + add r5, r5, #1 +_06009DF8: + cmp r5, r8 + blo _06009DDC + add sb, r4, #0x20 + mov r7, #0 + b _06009E1C +_06009E0C: + mov r1, r7 + add r0, sb, r5 + bl WL_WriteByte + add r5, r5, #1 +_06009E1C: + cmp r5, #0x20 + blo _06009E0C + strh r8, [r4, #0x1e] + cmp r6, #0 + beq _06009E74 + ldr r1, _06009E80 ; =0x0380FFF4 + ldrh r0, [r4, #0x92] + ldr r1, [r1] + mov r5, #0 + ldr r1, [r1, #0x4ac] + add r4, r4, #0x20 + add r1, r1, #0x26 + add r6, r1, r0 + b _06009E6C +_06009E54: + add r0, r4, r5 + bl WL_ReadByte + mov r1, r0 + add r0, r6, r5 + bl WL_WriteByte + add r5, r5, #1 +_06009E6C: + cmp r5, r8 + blo _06009E54 +_06009E74: + mov r0, #0 +_06009E78: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_06009E80: .word 0x0380FFF4 + arm_func_end WSetSsid + + arm_func_start WSetBeaconPeriod +WSetBeaconPeriod: ; 0x06009E84 + stmdb sp!, {r3, lr} + cmp r0, #0xa + blo _06009E98 + cmp r0, #0x3e8 + bls _06009EA0 +_06009E98: + mov r0, #5 + b _06009ECC +_06009EA0: + ldr r3, _06009ED4 ; =0x0380FFF4 + ldr r2, _06009ED8 ; =0x0480808C + ldr r1, [r3] + add r1, r1, #0x300 + strh r0, [r1, #0xb2] + strh r0, [r2] + ldr r0, [r3] + add r0, r0, #0x300 + ldrh r0, [r0, #0x38] + bl WSetFrameLifeTime + mov r0, #0 +_06009ECC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06009ED4: .word 0x0380FFF4 +_06009ED8: .word 0x0480808C + arm_func_end WSetBeaconPeriod + + arm_func_start WSetDTIMPeriod +WSetDTIMPeriod: ; 0x06009EDC + cmp r0, #1 + blo _06009EEC + cmp r0, #0xff + bls _06009EF4 +_06009EEC: + mov r0, #5 + bx lr +_06009EF4: + ldr r1, _06009F18 ; =0x0380FFF4 + ldr r2, _06009F1C ; =0x0480808E + ldr r1, [r1] + add r1, r1, #0x300 + strh r0, [r1, #0xb8] + strh r0, [r2] + mov r0, #0 + strh r0, [r2, #-6] + bx lr + .align 2, 0 +_06009F18: .word 0x0380FFF4 +_06009F1C: .word 0x0480808E + arm_func_end WSetDTIMPeriod + + arm_func_start WSetListenInterval +WSetListenInterval: ; 0x06009F20 + cmp r0, #1 + blo _06009F30 + cmp r0, #0xff + bls _06009F38 +_06009F30: + mov r0, #5 + bx lr +_06009F38: + ldr r1, _06009F50 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x300 + strh r0, [r1, #0xb4] + mov r0, #0 + bx lr + .align 2, 0 +_06009F50: .word 0x0380FFF4 + arm_func_end WSetListenInterval + + arm_func_start WSetDefaultParameters +WSetDefaultParameters: ; 0x06009F54 + stmdb sp!, {r3, lr} + sub sp, sp, #8 + add r2, sp, #2 + mov r0, #0x36 + mov r1, #6 + bl FLASH_Read + add r2, sp, #0 + mov r0, #0x3c + mov r1, #2 + bl FLASH_Read + add r0, sp, #2 + bl WSetMacAdrs + mov r0, #7 + bl WSetRetryLimit + ldrh r1, [sp] + ldr r0, _0600A088 ; =0x00007FFE + and r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WSetEnableChannel + mov r0, #2 + bl WSetMode + mov r0, #0 + bl WSetRate + mov r0, #0 + bl WSetWepMode + mov r0, #0 + bl WSetWepKeyId + ldr r0, _0600A08C ; =def_WepKey + bl WSetWepKey + mov r0, #0x1f4 + bl WSetBeaconPeriod + mov r0, #0 + bl WSetBeaconType + mov r0, #0 + bl WSetBcSsidResponse + mov r0, #0x10 + bl WSetBeaconLostThreshold + ldr r0, _0600A090 ; =0x0000FFFF + mov r1, #0 + bl WSetActiveZoneTime + ldr r0, _0600A094 ; =def_SsidMask + bl WSetSsidMask + mov r0, #1 + bl WSetPreambleType + mov r0, #0 + bl WSetAuthAlgo + ldr r0, _0600A098 ; =c_RateSet$4351 + bl WSetRateSet + mov r0, #0 + mov r1, #0x1f + bl WSetCCA_ED + mov r0, #5 + bl WSetFrameLifeTime + mov r0, #0 + mov r1, r0 + bl WSetDiversity + mov r0, #0 + bl WSetMainAntenna + mov r0, #0 + bl WSetBeaconSendRecvIndicate + mov r0, #0 + bl WSetNullKeyMode + ldr r1, _0600A09C ; =0x04808044 + ldrh r2, [r1] + ldrh r0, [r1] + ldrh r1, [r1] + add r0, r2, r0, lsl #8 + bl RND_Init + ldr r0, _0600A0A0 ; =0x0380FFF4 + mov r1, #1 + ldr r0, [r0] + add r0, r0, #0x300 + strh r1, [r0, #0x58] + add sp, sp, #8 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A088: .word 0x00007FFE +_0600A08C: .word def_WepKey +_0600A090: .word 0x0000FFFF +_0600A094: .word def_SsidMask +_0600A098: .word c_RateSet$4351 +_0600A09C: .word 0x04808044 +_0600A0A0: .word 0x0380FFF4 + arm_func_end WSetDefaultParameters + + arm_func_start WSetChannel +WSetChannel: ; 0x0600A0A4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov sl, r0 + ldr r0, _0600A320 ; =0x0380FFF4 + cmp r1, #0 + ldr r0, [r0] + ldrne sb, _0600A324 ; =FLASH_DirectRead + add r0, r0, #0x300 + ldrh r0, [r0, #0x2c] + ldreq sb, _0600A328 ; =FLASH_Read + mov r2, #1 + tst r0, r2, lsl sl + moveq r0, #5 + beq _0600A314 + ldr r1, _0600A32C ; =0x04808040 + add r0, r2, #0x8000 + ldrh r6, [r1] + strh r0, [r1] + sub r3, r1, #4 + add r1, r1, #0x1d4 +_0600A0F4: + ldrh r2, [r3] + ldrh r0, [r1] + mov r2, r2, asr #8 + cmp r2, #2 + bne _0600A0F4 + cmp r0, #0 + cmpne r0, #9 + bne _0600A0F4 + ldr r5, _0600A320 ; =0x0380FFF4 + ldr r0, [r5] + add r0, r0, #0x300 + strh sl, [r0, #0xbe] + ldr r0, [r5] + add r0, r0, #0x500 + ldrh r1, [r0, #0xf8] + cmp r1, #2 + beq _0600A148 + cmp r1, #3 + beq _0600A218 + cmp r1, #5 + bne _0600A300 +_0600A148: + sub r4, sl, #1 + mov r0, #6 + mul r5, r4, r0 + mov r0, #0 + str r0, [sp, #4] + add r2, sp, #4 + add r0, r5, #0xf2 + mov r1, #3 + mov lr, pc + bx sb + ldr r0, [sp, #4] + bl RF_Write + add r2, sp, #4 + add r0, r5, #0xf5 + mov r1, #3 + mov lr, pc + bx sb + ldr r0, [sp, #4] + bl RF_Write + mov r1, #0 + ldr r0, _0600A320 ; =0x0380FFF4 + str r1, [sp, #4] + ldr r0, [r0] + ldr r0, [r0, #0x604] + tst r0, #0x10000 + beq _0600A1F0 + tst r0, #0x8000 + bne _0600A300 + add r2, sp, #4 + add r0, r4, #0x154 + mov r1, #1 + mov lr, pc + bx sb + ldr r1, _0600A320 ; =0x0380FFF4 + ldr r0, [sp, #4] + ldr r1, [r1] + mov r0, r0, lsl #0x1b + ldr r1, [r1, #0x604] + orr r0, r1, r0, lsr #17 + str r0, [sp, #4] + bl RF_Write + b _0600A300 +_0600A1F0: + add r0, r4, #0x46 + add r2, sp, #4 + add r0, r0, #0x100 + mov r1, #1 + mov lr, pc + bx sb + ldr r1, [sp, #4] + mov r0, #0x1e + bl BBP_Write + b _0600A300 +_0600A218: + ldrh r0, [r0, #0xfc] + mov r8, #0 + add r7, r0, #0xcf + mov r4, r8 + mov fp, #1 + b _0600A274 +_0600A230: + mov r0, r7 + mov r1, fp + add r2, sp, #0 + str r4, [sp, #4] + str r4, [sp] + mov lr, pc + bx sb + add r0, r7, sl + mov r1, #1 + add r2, sp, #4 + mov lr, pc + bx sb + ldr r0, [sp] + ldr r1, [sp, #4] + bl BBP_Write + add r7, r7, #0xf + add r8, r8, #1 +_0600A274: + ldr r0, [r5] + add r0, r0, #0x600 + ldrh r0, [r0] + cmp r8, r0 + blo _0600A230 + mov r8, #0 + ldr r4, _0600A320 ; =0x0380FFF4 + mov r5, r8 + mov fp, #1 + b _0600A2EC +_0600A29C: + str r5, [sp, #4] + mov r0, r7 + mov r1, fp + add r2, sp, #4 + mov lr, pc + bx sb + ldr r1, [sp, #4] + add r0, r7, sl + mov r1, r1, lsl #8 + str r1, [sp, #4] + mov r1, #1 + add r2, sp, #4 + mov lr, pc + bx sb + ldr r0, [sp, #4] + orr r0, r0, #0x50000 + str r0, [sp, #4] + bl RF_Write + add r7, r7, #0xf + add r8, r8, #1 +_0600A2EC: + ldr r0, [r4] + add r0, r0, #0x500 + ldrh r0, [r0, #0xfe] + cmp r8, r0 + blo _0600A29C +_0600A300: + ldr r1, _0600A32C ; =0x04808040 + mov r0, #3 + strh r6, [r1] + strh r0, [r1, #8] + mov r0, #0 +_0600A314: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0600A320: .word 0x0380FFF4 +_0600A324: .word FLASH_DirectRead +_0600A328: .word FLASH_Read +_0600A32C: .word 0x04808040 + arm_func_end WSetChannel + + arm_func_start WSetRateSet +WSetRateSet: ; 0x0600A330 + stmdb sp!, {r3, lr} + ldr r1, _0600A36C ; =0x0380FFF4 + ldrh r2, [r0] + ldr r3, [r1] + add r1, r3, #0x300 + strh r2, [r1, #0xa4] + ldrh r1, [r0, #2] + ldrh r0, [r0] + add r2, r3, #0x3a4 + orr r0, r1, r0 + strh r0, [r2, #2] + bl WSetTxTimeStampOffset + mov r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A36C: .word 0x0380FFF4 + arm_func_end WSetRateSet + + arm_func_start WSetTxTimeStampOffset +WSetTxTimeStampOffset: ; 0x0600A370 + stmdb sp!, {r3, lr} + ldr r0, _0600A3E4 ; =0x0000E2E2 + add r2, sp, #0 + str r0, [sp] + mov r0, #0x58 + mov r1, #2 + bl FLASH_Read + ldr r0, [sp] + add r0, r0, #2 + add r0, r0, #0x200 + str r0, [sp] + bl WCalcManRate + cmp r0, #0x14 + bne _0600A3D0 + ldr r1, [sp] + ldr r0, _0600A3E8 ; =0x048080BC + sub r1, r1, #0x61 + sub r1, r1, #0x6100 + str r1, [sp] + ldrh r0, [r0] + tst r0, #2 + subne r0, r1, #0x60 + subne r0, r0, #0x6000 + strne r0, [sp] +_0600A3D0: + ldr r1, [sp] + ldr r0, _0600A3EC ; =0x04808140 + strh r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A3E4: .word 0x0000E2E2 +_0600A3E8: .word 0x048080BC +_0600A3EC: .word 0x04808140 + arm_func_end WSetTxTimeStampOffset + + arm_func_start WSetPowerMgtMode +WSetPowerMgtMode: ; 0x0600A3F0 + stmdb sp!, {r3, lr} + ldr r1, _0600A450 ; =0x0380FFF4 + cmp r0, #0 + ldr r2, [r1] + add r1, r2, #0x300 + add r3, r2, #0x31c + strh r0, [r1, #0x52] + ldrneh r0, [r3, #0x12] + cmpne r0, #1 + ldrne r1, _0600A454 ; =0x04808006 + ldrneh r0, [r1] + orrne r0, r0, #0x40 + strneh r0, [r1] + bne _0600A444 + ldr r2, _0600A454 ; =0x04808006 + mov r1, #0 + ldrh r0, [r2] + bic r0, r0, #0x40 + strh r0, [r2] + ldrh r0, [r3, #0x20] + bl WSetActiveZoneTime +_0600A444: + mov r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A450: .word 0x0380FFF4 +_0600A454: .word 0x04808006 + arm_func_end WSetPowerMgtMode + + arm_func_start WSetPowerState +WSetPowerState: ; 0x0600A458 + ldr r1, _0600A47C ; =0x0380FFF4 + ldr r2, _0600A480 ; =0x0480803C + ldr r1, [r1] + mov r3, r0, lsr #1 + add r1, r1, #0x300 + strh r3, [r1, #0x54] + strh r0, [r2] + mov r0, #0 + bx lr + .align 2, 0 +_0600A47C: .word 0x0380FFF4 +_0600A480: .word 0x0480803C + arm_func_end WSetPowerState + + arm_func_start WSetForcePowerState +WSetForcePowerState: ; 0x0600A484 + ldr r1, _0600A494 ; =0x04808040 + strh r0, [r1] + mov r0, #0 + bx lr + .align 2, 0 +_0600A494: .word 0x04808040 + arm_func_end WSetForcePowerState + + arm_func_start WShutdown +WShutdown: ; 0x0600A498 + stmdb sp!, {r3, lr} + ldr r0, _0600A500 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r0, [r0, #0xf8] + cmp r0, #2 + bne _0600A4BC + ldr r0, _0600A504 ; =0x0000C008 + bl RF_Write +_0600A4BC: + ldr r1, _0600A508 ; =0x0000601E + ldr r0, _0600A50C ; =0x04808158 + strh r1, [r0] + bl WaitLoop_BbpAccess + ldr r1, _0600A510 ; =0x0480815C + mov r0, #0x1e + ldrh r1, [r1] + orr r1, r1, #0x3f + bl BBP_Write + ldr r2, _0600A514 ; =0x0000800D + ldr r1, _0600A518 ; =0x04808168 + ldr r0, _0600A51C ; =0x04808036 + strh r2, [r1] + mov r1, #1 + strh r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A500: .word 0x0380FFF4 +_0600A504: .word 0x0000C008 +_0600A508: .word 0x0000601E +_0600A50C: .word 0x04808158 +_0600A510: .word 0x0480815C +_0600A514: .word 0x0000800D +_0600A518: .word 0x04808168 +_0600A51C: .word 0x04808036 + arm_func_end WShutdown + + arm_func_start WWakeUp +WWakeUp: ; 0x0600A520 + stmdb sp!, {r4, lr} + ldr r2, _0600A5B8 ; =0x04808036 + mov r3, #0 + ldr r1, _0600A5BC ; =TimeoutDummy + mov r0, #0x1f40 + strh r3, [r2] + bl WaitLoop_Waitus + ldr r1, _0600A5C0 ; =0x04808168 + mov r2, #0 + ldr r0, _0600A5C4 ; =0x0380FFF4 + strh r2, [r1] + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r0, [r0, #0xf8] + cmp r0, #2 + beq _0600A56C + cmp r0, #3 + beq _0600A5AC + b _0600A5B0 +_0600A56C: + ldr r0, _0600A5C8 ; =0x00006001 + strh r0, [r1, #-0x10] + bl WaitLoop_BbpAccess + ldr r1, _0600A5CC ; =0x0480815C + mov r0, #1 + ldrh r4, [r1] + and r1, r4, #0x7f + bl BBP_Write + mov r1, r4 + mov r0, #1 + bl BBP_Write + ldr r0, _0600A5D0 ; =0x00009C40 + ldr r1, _0600A5BC ; =TimeoutDummy + bl WaitLoop_Waitus + bl InitRF + b _0600A5B0 +_0600A5AC: + bl InitRF +_0600A5B0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600A5B8: .word 0x04808036 +_0600A5BC: .word TimeoutDummy +_0600A5C0: .word 0x04808168 +_0600A5C4: .word 0x0380FFF4 +_0600A5C8: .word 0x00006001 +_0600A5CC: .word 0x0480815C +_0600A5D0: .word 0x00009C40 + arm_func_end WWakeUp + + arm_func_start WSetFrameLifeTime +WSetFrameLifeTime: ; 0x0600A5D4 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _0600A630 ; =0x0380FFF4 + ldr r1, _0600A634 ; =0x0000FFFF + ldr r2, [r2] + mov r6, r0 + add r5, r2, #0x31c + cmp r6, r1 + streqh r1, [r5, #0x1c] + add r4, r2, #0x344 + streqh r1, [r4, #0x8c] + beq _0600A624 + ldrh r0, [r4, #0x6e] + mov r1, #0x64 + mul r0, r6, r0 + bl __VENEER__u32_div_f + cmp r0, #0x10000 + movhi r0, #5 + bhi _0600A628 + strh r6, [r5, #0x1c] + strh r0, [r4, #0x8c] +_0600A624: + mov r0, #0 +_0600A628: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600A630: .word 0x0380FFF4 +_0600A634: .word 0x0000FFFF + arm_func_end WSetFrameLifeTime + + arm_func_start WDisableTmpttPowerSave +WDisableTmpttPowerSave: ; 0x0600A638 + ldr r1, _0600A67C ; =0x0380FFF4 + mov r2, #1 + ldr r0, [r1] + add r0, r0, #0x300 + strh r2, [r0, #0xea] + ldr r0, [r1] + add r0, r0, #0x400 + ldrh r0, [r0, #0x68] + cmp r0, #0 + bxne lr + ldr r2, _0600A680 ; =0x04808038 + mov r0, #0 + ldrh r1, [r2] + bic r1, r1, #2 + strh r1, [r2] + strh r0, [r2, #0x10] + bx lr + .align 2, 0 +_0600A67C: .word 0x0380FFF4 +_0600A680: .word 0x04808038 + arm_func_end WDisableTmpttPowerSave + + arm_func_start WEnableTmpttPowerSave +WEnableTmpttPowerSave: ; 0x0600A684 + ldr r0, _0600A6AC ; =0x0380FFF4 + ldr r1, _0600A6B0 ; =0x04808038 + ldr r0, [r0] + mov r2, #0 + add r0, r0, #0x300 + strh r2, [r0, #0xea] + ldrh r0, [r1] + orr r0, r0, #2 + strh r0, [r1] + bx lr + .align 2, 0 +_0600A6AC: .word 0x0380FFF4 +_0600A6B0: .word 0x04808038 + arm_func_end WEnableTmpttPowerSave + + arm_func_start WInitGameInfo +WInitGameInfo: ; 0x0600A6B4 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600A6F4 ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r2] + cmp r5, #0x80 + add r4, r0, #0x344 + movhi r0, #4 + bhi _0600A6EC + mov r0, r1 + ldr r1, [r4, #0x9c] + add r2, r5, #1 + bl __VENEER_MIi_CpuCopy16 + strh r5, [r4, #0xa0] + mov r0, #0 +_0600A6EC: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600A6F4: .word 0x0380FFF4 + arm_func_end WInitGameInfo + + arm_func_start WSetGameInfo +WSetGameInfo: ; 0x0600A6F8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r2, _0600A7A0 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r2] + mov r8, r1 + cmp r4, #0x80 + add r5, r0, #0x344 + movhi r0, #4 + bhi _0600A798 + cmp r4, #0 + beq _0600A788 + ldrh r0, [r5, #0xa2] + tst r0, #1 + beq _0600A778 + ldr r6, [r5, #0x9c] + mov r1, #0xff + mov r0, r6 + bl WL_WriteByte + add r6, r6, #1 + mov r7, #0 + b _0600A76C +_0600A74C: + mov r0, r8 + bl WL_ReadByte + mov r1, r0 + mov r0, r6 + bl WL_WriteByte + add r6, r6, #1 + add r8, r8, #1 + add r7, r7, #1 +_0600A76C: + cmp r7, r4 + blo _0600A74C + b _0600A788 +_0600A778: + ldr r1, [r5, #0x9c] + mov r0, r8 + add r2, r4, #1 + bl __VENEER_MIi_CpuCopy16 +_0600A788: + strh r4, [r5, #0xa0] + mov r0, #1 + strh r0, [r5, #0xa4] + mov r0, #0 +_0600A798: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600A7A0: .word 0x0380FFF4 + arm_func_end WSetGameInfo + + arm_func_start WSetAids +WSetAids: ; 0x0600A7A4 + ldr r3, _0600A7D8 ; =0x0380FFF4 + ldr r2, _0600A7DC ; =0x0480802A + ldr r1, [r3] + add r1, r1, #0x300 + strh r0, [r1, #0xae] + strh r0, [r2] + ldr r1, [r3] + add r1, r1, #0x300 + ldrh r1, [r1, #0x3a] + mov r1, r1, lsl #0x18 + movs r1, r1, lsr #0x1f + strneh r0, [r2, #-2] + bx lr + .align 2, 0 +_0600A7D8: .word 0x0380FFF4 +_0600A7DC: .word 0x0480802A + arm_func_end WSetAids + + arm_func_start WClearAids +WClearAids: ; 0x0600A7E0 + stmdb sp!, {r4, lr} + ldr r1, _0600A834 ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + add r4, r1, #0x344 + strh r0, [r4, #0x6a] + bl WaitLoop_ClrAid + ldr r0, _0600A838 ; =0x0480802A + mov r1, #0 + strh r1, [r0] + ldrh r0, [r4, #0x88] + cmp r0, #0 + beq _0600A82C + bl DeleteTxFrames + ldrh r0, [r4, #0x88] + mov r1, #0x20 + bl CAM_SetStaState + mov r0, #0 + strh r0, [r4, #0x88] +_0600A82C: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600A834: .word 0x0380FFF4 +_0600A838: .word 0x0480802A + arm_func_end WClearAids + + arm_func_start WSetKSID +WSetKSID: ; 0x0600A83C + ldr r0, _0600A858 ; =0x0380FFF4 + ldr r1, _0600A85C ; =0x04808028 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0xae] + strh r0, [r1] + bx lr + .align 2, 0 +_0600A858: .word 0x0380FFF4 +_0600A85C: .word 0x04808028 + arm_func_end WSetKSID + + arm_func_start WClearKSID +WClearKSID: ; 0x0600A860 + stmdb sp!, {r3, lr} + ldr r0, _0600A880 ; =0x04808094 + ldrh r0, [r0] + tst r0, #0x8000 + bne _0600A878 + bl WaitLoop_ClrAid +_0600A878: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A880: .word 0x04808094 + arm_func_end WClearKSID + + arm_func_start WSetStaState +WSetStaState: ; 0x0600A884 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0600A91C ; =0x0380FFF4 + mov r5, r0 + ldr r1, [r1] + add r4, r1, #0x344 + ldrh r0, [r4, #8] + cmp r0, r5 + beq _0600A914 + cmp r0, #0x40 + bne _0600A8B8 + add r0, r1, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_CancelAlarm +_0600A8B8: + cmp r5, #0 + beq _0600A8D4 + cmp r5, #0x10 + beq _0600A8DC + cmp r5, #0x40 + beq _0600A8F4 + b _0600A910 +_0600A8D4: + bl WShutdown + b _0600A910 +_0600A8DC: + ldr r0, _0600A920 ; =0x04808040 + mov r1, #0 + strh r1, [r0] + bl WStop + bl WWakeUp + b _0600A910 +_0600A8F4: + ldrh r0, [r4, #0xc] + cmp r0, #2 + bne _0600A904 + bl WEnableTmpttPowerSave +_0600A904: + ldr r1, _0600A924 ; =WIntervalTimer + mov r0, #0x64 + bl SetupPeriodicTimeOut +_0600A910: + strh r5, [r4, #8] +_0600A914: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600A91C: .word 0x0380FFF4 +_0600A920: .word 0x04808040 +_0600A924: .word WIntervalTimer + arm_func_end WSetStaState + + arm_func_start WSetMacAdrs1 +WSetMacAdrs1: ; 0x0600A928 + ldrh r2, [r1] + strh r2, [r0] + ldrh r2, [r1, #2] + strh r2, [r0, #2] + ldrh r1, [r1, #4] + strh r1, [r0, #4] + bx lr + arm_func_end WSetMacAdrs1 + + arm_func_start WSetMacAdrs2 +WSetMacAdrs2: ; 0x0600A944 + ldrh r3, [r1] + strh r3, [r0] + ldrh r3, [r1, #2] + strh r3, [r0, #2] + ldrh r1, [r1, #4] + strh r1, [r0, #4] + ldrh r1, [r2] + strh r1, [r0, #6] + ldrh r1, [r2, #2] + strh r1, [r0, #8] + ldrh r1, [r2, #4] + strh r1, [r0, #0xa] + bx lr + arm_func_end WSetMacAdrs2 + + arm_func_start WSetMacAdrs3 +WSetMacAdrs3: ; 0x0600A978 + ldrh ip, [r1] + strh ip, [r0] + ldrh ip, [r1, #2] + strh ip, [r0, #2] + ldrh r1, [r1, #4] + strh r1, [r0, #4] + ldrh r1, [r2] + strh r1, [r0, #6] + ldrh r1, [r2, #2] + strh r1, [r0, #8] + ldrh r1, [r2, #4] + strh r1, [r0, #0xa] + ldrh r1, [r3] + strh r1, [r0, #0xc] + ldrh r1, [r3, #2] + strh r1, [r0, #0xe] + ldrh r1, [r3, #4] + strh r1, [r0, #0x10] + bx lr + arm_func_end WSetMacAdrs3 + + arm_func_start WInitCounter +WInitCounter: ; 0x0600A9C4 + stmdb sp!, {r3, lr} + bl WUpdateCounter + ldr r1, _0600A9F0 ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + mov r2, #0xb4 + add r1, r1, #0x13c + add r1, r1, #0x400 + bl __VENEER_MIi_CpuClear32 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600A9F0: .word 0x0380FFF4 + arm_func_end WInitCounter + + arm_func_start __VENEER_MIi_CpuClear32 +__VENEER_MIi_CpuClear32: ; 0x0600A9F4 + ldr pc, _0600A9F8 ; =MIi_CpuClear32 + .align 2, 0 +_0600A9F8: .word MIi_CpuClear32 + arm_func_end __VENEER_MIi_CpuClear32 + + arm_func_start WUpdateCounter +WUpdateCounter: ; 0x0600A9FC + ldr r1, _0600ABEC ; =0x0380FFF4 + ldr r0, _0600ABF0 ; =0x048081B0 + ldr r1, [r1] + ldrh r2, [r0] + ldr r3, [r1, #0x58c] + and r2, r2, #0xff + add r2, r3, r2 + str r2, [r1, #0x58c] + ldrh ip, [r0, #2] + ldr r3, [r1, #0x588] + and r2, ip, #0xff + add r3, r3, ip, asr #8 + str r3, [r1, #0x588] + ldr r3, [r1, #0x598] + add r2, r3, r2 + str r2, [r1, #0x598] + ldrh ip, [r0, #4] + ldr r3, [r1, #0x594] + and r2, ip, #0xff + add r3, r3, ip, asr #8 + str r3, [r1, #0x594] + ldr r3, [r1, #0x590] + add r2, r3, r2 + str r2, [r1, #0x590] + ldrh ip, [r0, #6] + ldr r3, [r1, #0x59c] + and r2, ip, #0xff + add r3, r3, ip, asr #8 + str r3, [r1, #0x59c] + ldr r3, [r1, #0x574] + add r2, r3, r2 + str r2, [r1, #0x574] + ldrh r2, [r0, #8] + ldr r3, [r1, #0x584] + and r2, r2, #0xff + add r2, r3, r2 + str r2, [r1, #0x584] + ldrh r2, [r0, #0xa] + ldr r3, [r1, #0x55c] + and r2, r2, #0xff + add r2, r3, r2 + str r2, [r1, #0x55c] + ldrh ip, [r0, #0xc] + ldr r3, [r1, #0x56c] + and r2, ip, #0xff + add r3, r3, ip, asr #8 + str r3, [r1, #0x56c] + ldr r3, [r1, #0x580] + add r2, r3, r2 + str r2, [r1, #0x580] + ldrh ip, [r0, #0xe] + ldr r3, [r1, #0x578] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x578] + ldr r2, [r1, #0x57c] + add r2, r2, ip, asr #8 + str r2, [r1, #0x57c] + ldrh r2, [r0, #0x10] + ldr r3, [r1, #0x548] + and r2, r2, #0xff + add r2, r3, r2 + str r2, [r1, #0x548] + ldrh r3, [r0, #0x20] + ldr r2, [r1, #0x5b4] + add r2, r2, r3, asr #8 + str r2, [r1, #0x5b4] + ldrh ip, [r0, #0x22] + ldr r3, [r1, #0x5b8] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5b8] + ldr r2, [r1, #0x5bc] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5bc] + ldrh ip, [r0, #0x24] + ldr r3, [r1, #0x5c0] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5c0] + ldr r2, [r1, #0x5c4] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5c4] + ldrh ip, [r0, #0x26] + ldr r3, [r1, #0x5c8] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5c8] + ldr r2, [r1, #0x5cc] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5cc] + ldrh ip, [r0, #0x28] + ldr r3, [r1, #0x5d0] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5d0] + ldr r2, [r1, #0x5d4] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5d4] + ldrh ip, [r0, #0x2a] + ldr r3, [r1, #0x5d8] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5d8] + ldr r2, [r1, #0x5dc] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5dc] + ldrh ip, [r0, #0x2c] + ldr r3, [r1, #0x5e0] + and r2, ip, #0xff + add r2, r3, r2 + str r2, [r1, #0x5e0] + ldr r2, [r1, #0x5e4] + add r2, r2, ip, asr #8 + str r2, [r1, #0x5e4] + ldrh r3, [r0, #0x2e] + ldr r2, [r1, #0x5e8] + and r0, r3, #0xff + add r0, r2, r0 + str r0, [r1, #0x5e8] + ldr r0, [r1, #0x5ec] + add r0, r0, r3, asr #8 + str r0, [r1, #0x5ec] + bx lr + .align 2, 0 +_0600ABEC: .word 0x0380FFF4 +_0600ABF0: .word 0x048081B0 + arm_func_end WUpdateCounter + + arm_func_start WCheckSSID +WCheckSSID: ; 0x0600ABF4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r2, _0600ACC0 ; =0x0380FFF4 + mov sb, r0 + ldr r0, [r2] + mov r8, r1 + cmp sb, #0x20 + add r2, r0, #0x344 + movhi r0, #0 + bhi _0600ACB8 + ldrh r1, [r2, #0x1e] + cmp r1, #0 + moveq r0, #1 + beq _0600ACB8 + add r0, r0, #0x400 + ldrh r0, [r0, #4] + cmp r0, #0x13 + bne _0600AC4C + cmp sb, r1 + movlo r0, #0 + blo _0600ACB8 + mov sb, r1 + b _0600AC58 +_0600AC4C: + cmp sb, r1 + movne r0, #0 + bne _0600ACB8 +_0600AC58: + add r5, r2, #0x20 + add r6, r2, #0x40 + mov r7, #0 + b _0600ACAC +_0600AC68: + mov r0, r6 + bl WL_ReadByte + mov r4, r0 + mov r0, r8 + add r6, r6, #1 + bl WL_ReadByte + mov sl, r0 + mov r0, r5 + add r8, r8, #1 + bl WL_ReadByte + orr r1, sl, r4 + orr r0, r0, r4 + cmp r1, r0 + add r5, r5, #1 + movne r0, #0 + bne _0600ACB8 + add r7, r7, #1 +_0600ACAC: + cmp r7, sb + blo _0600AC68 + mov r0, #1 +_0600ACB8: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0600ACC0: .word 0x0380FFF4 + arm_func_end WCheckSSID + + arm_func_start MatchMacAdrs +MatchMacAdrs: ; 0x0600ACC4 + ldrh r3, [r0, #4] + ldrh r2, [r1, #4] + cmp r3, r2 + ldreqh r3, [r0, #2] + ldreqh r2, [r1, #2] + cmpeq r3, r2 + ldreqh r2, [r0] + ldreqh r0, [r1] + cmpeq r2, r0 + moveq r0, #1 + movne r0, #0 + bx lr + arm_func_end MatchMacAdrs + + arm_func_start CheckEnableChannel +CheckEnableChannel: ; 0x0600ACF4 + ldr r1, _0600AD10 ; =0x0380FFF4 + mov r2, #1 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r1, [r1, #0x2c] + and r0, r1, r2, lsl r0 + bx lr + .align 2, 0 +_0600AD10: .word 0x0380FFF4 + arm_func_end CheckEnableChannel + + arm_func_start WElement2RateSet +WElement2RateSet: ; 0x0600AD14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r1 + mov r1, #0 + mov r4, r0 + strh r1, [sb] + add r0, r4, #1 + strh r1, [sb, #2] + bl WL_ReadByte + add r6, r4, #2 + ldr r5, _0600ADC4 ; =RateElement2Bit + mov r8, r0 + mov r7, #0 + mov r4, #1 + b _0600ADB4 +_0600AD4C: + add r0, r6, r7 + bl WL_ReadByte + and r1, r0, #0x7f + sub r1, r1, #1 + cmp r1, #0x78 + bhs _0600AD94 + mov r1, r1, lsl #1 + ldrh r2, [r5, r1] + cmp r2, #0xff + beq _0600AD94 + ldrh r1, [sb, #2] + tst r0, #0x80 + orr r0, r1, r4, lsl r2 + strh r0, [sb, #2] + ldrneh r0, [sb] + orrne r0, r0, r4, lsl r2 + strneh r0, [sb] + b _0600ADB0 +_0600AD94: + ldrh r1, [sb, #2] + tst r0, #0x80 + orr r0, r1, #0x8000 + strh r0, [sb, #2] + ldrneh r0, [sb] + orrne r0, r0, #0x8000 + strneh r0, [sb] +_0600ADB0: + add r7, r7, #1 +_0600ADB4: + cmp r7, r8 + blo _0600AD4C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_0600ADC4: .word RateElement2Bit + arm_func_end WElement2RateSet + + arm_func_start WCalcManRate +WCalcManRate: ; 0x0600ADC8 + ldr r0, _0600AE10 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x30] + cmp r1, #0 + beq _0600ADEC + cmp r1, #1 + beq _0600AE00 + b _0600AE08 +_0600ADEC: + ldrh r0, [r0, #0xa4] + tst r0, #1 + beq _0600AE08 + mov r0, #0xa + bx lr +_0600AE00: + mov r0, #0xa + bx lr +_0600AE08: + mov r0, #0x14 + bx lr + .align 2, 0 +_0600AE10: .word 0x0380FFF4 + arm_func_end WCalcManRate + + arm_func_start WStart +WStart: ; 0x0600AE14 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + ldr r0, _0600B180 ; =0x0380FFF4 + ldr r0, [r0] + add r6, r0, #0x344 + add r4, r0, #0x31c + bl WStop + ldr r1, _0600B184 ; =0x04808044 + ldrh r2, [r1] + ldrh r0, [r1] + ldrh r1, [r1] + add r0, r2, r0, lsl #8 + bl RND_Init + mov r0, #1 + strh r0, [r6, #0x7c] + ldrh r0, [r4, #0x1e] + ldr r2, _0600B188 ; =0x04808032 + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1f + cmp r0, #1 + ldreqh r0, [r6, #0x7c] + ldr r1, _0600B18C ; =0x04808134 + orreq r0, r0, #0x20 + streqh r0, [r6, #0x7c] + ldrh r0, [r4, #0x18] + mov r4, #0 + cmp r0, #0 + ldrneh r0, [r6, #0x7c] + mov r3, #0x8000 + orrne r0, r0, #0x10 + strneh r0, [r6, #0x7c] + strh r4, [r6, #0x12] + ldr r0, _0600B190 ; =0x0000FFFF + strh r3, [r2] + strh r0, [r1] + strh r4, [r2, #-8] + sub r0, r1, #0x10c + strh r4, [r0] + mov r0, #0xf + strh r0, [r1, #-0xfc] + bl InitCAM + bl InitApList + bl InitTxCtrl + bl InitRxCtrl + ldr r2, _0600B194 ; =0x04808030 + mov r1, #0x8000 + strh r1, [r2] + ldr r0, _0600B190 ; =0x0000FFFF + ldr r1, _0600B198 ; =0x048081AE + strh r0, [r2, #-0x20] + sub r2, r0, #0xe000 + ldr r0, _0600B180 ; =0x0380FFF4 + strh r2, [r1] + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #8 + movne r0, #0x400 + strneh r0, [r1, #-4] + moveq r0, r4 + streqh r0, [r1, #-4] + ldr r2, _0600B19C ; =0x04808008 + mov r3, #0 + strh r3, [r2] + strh r3, [r2, #2] + ldrh r0, [r6, #0xc] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _0600B144 +_0600AF28: ; jump table + b _0600AF3C ; case 0 + b _0600AF6C ; case 1 + b _0600B050 ; case 2 + b _0600B0D0 ; case 3 + b _0600B128 ; case 4 +_0600AF3C: + ldr r0, _0600B190 ; =0x0000FFFF + mov r1, #0x3f + strh r1, [r2, #0xa] + strh r0, [r2, #0xc8] + mov r0, #8 + strh r0, [r2, #0xd8] + strh r3, [r2] + strh r3, [r2, #2] + strh r3, [r2, #0xe0] + mov r0, #1 + strh r0, [r2, #-4] + b _0600B144 +_0600AF6C: + ldr r3, _0600B1A0 ; =0x0000703F + ldr r0, _0600B1A4 ; =0x00001FFF + ldr r1, _0600B198 ; =0x048081AE + strh r3, [r2, #0xa] + strh r0, [r1] + rsb r0, r0, #0x2300 + strh r0, [r1, #-0xde] + mov r0, #0xd + strh r0, [r1, #-0xce] + mov r0, #0xe000 + strh r0, [r2] + mov r0, #1 + strh r0, [r2, #-4] + ldrh r0, [r1, #-0xb6] + add r7, sp, #0 + strh r0, [r7] + ldrh r0, [r1, #-0xb4] + mov r4, #0 + strh r0, [r7, #2] + ldrh r2, [r1, #-0xb2] + ldr r0, [sp] + strh r2, [r7, #4] + ldrh r1, [r1, #-0xb0] + mov r3, r4 + strh r1, [r7, #6] + ldrh r2, [r6, #0x6e] + ldr r1, [sp, #4] + mov r5, r2, lsl #0xa + mov r2, r5 + bl __VENEER__ll_udiv + adds r3, r0, #1 + umull r2, r0, r3, r5 + mla r0, r3, r4, r0 + adc r1, r1, #0 + mla r0, r1, r5, r0 + str r0, [sp, #4] + ldrh r0, [r7, #6] + ldr r3, _0600B1A8 ; =0x048080F6 + str r2, [sp] + strh r0, [r3] + ldrh r0, [r7, #4] + mov r1, #1 + strh r0, [r3, #-2] + ldrh r2, [r7, #2] + mov r0, #0x40 + strh r2, [r3, #-4] + ldrh r2, [r7] + orr r2, r2, #1 + strh r2, [r3, #-6] + strh r1, [r3, #-0xe] + strh r1, [r3, #-0xc] + bl WSetStaState + bl StartBeaconFrame + ldr r0, _0600B1AC ; =0x048080AE + mov r1, #2 + strh r1, [r0] + b _0600B144 +_0600B050: + ldr r1, _0600B1B0 ; =0x0000E0BF + ldr r0, _0600B180 ; =0x0380FFF4 + strh r1, [r2, #0xa] + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #0x20 + beq _0600B08C + ldrh r0, [r2, #0xa] + ldr r1, _0600B1B4 ; =0x048081AA + orr r0, r0, #0x40 + strh r0, [r2, #0xa] + ldrh r0, [r1] + orr r0, r0, #0x68 + strh r0, [r1] +_0600B08C: + ldrh r0, [r6, #0x64] + tst r0, #1 + ldr r0, _0600B1B8 ; =0x048080D0 + ldrne r1, _0600B1BC ; =0x00000581 + strneh r1, [r0] + ldreq r1, _0600B1C0 ; =0x00000181 + streqh r1, [r0] + ldr r2, _0600B1C4 ; =0x048080E0 + mov r0, #0xb + strh r0, [r2] + mov r1, #1 + strh r1, [r2, #-0xdc] + strh r1, [r2, #8] + mov r0, #0x20 + strh r1, [r2, #0xa] + bl WSetStaState + b _0600B144 +_0600B0D0: + ldr r1, _0600B190 ; =0x0000FFFF + strh r1, [r2, #8] + sub r0, r1, #0x3fc0 + strh r0, [r2, #0xa] + ldrh r0, [r6, #0x64] + tst r0, #1 + rsbne r0, r1, #0x10400 + strneh r0, [r2, #0xc8] + moveq r0, #1 + streqh r0, [r2, #0xc8] + ldr r2, _0600B1C4 ; =0x048080E0 + mov r0, #0xb + strh r0, [r2] + mov r0, #1 + strh r0, [r2, #-0xdc] + strh r0, [r2, #8] + strh r0, [r2, #0xa] + mov r1, #0 + mov r0, #0x20 + strh r1, [r2, #-0x98] + bl WSetStaState + b _0600B144 +_0600B128: + ldr r0, _0600B198 ; =0x048081AE + strh r3, [r2, #0xa] + strh r3, [r0] + mov r1, #1 + mov r0, #0x20 + strh r1, [r2, #-4] + bl WSetStaState +_0600B144: + ldr r0, _0600B1C8 ; =0x04808048 + mov r1, #0 + strh r1, [r0] + bl WDisableTmpttPowerSave + ldr r1, _0600B1AC ; =0x048080AE + mov r0, #2 + strh r0, [r1] + ldrh r1, [r6, #0xe] + cmp r1, #1 + bne _0600B170 + bl WSetPowerState +_0600B170: + bl WaitLoop_Rxpe + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600B180: .word 0x0380FFF4 +_0600B184: .word 0x04808044 +_0600B188: .word 0x04808032 +_0600B18C: .word 0x04808134 +_0600B190: .word 0x0000FFFF +_0600B194: .word 0x04808030 +_0600B198: .word 0x048081AE +_0600B19C: .word 0x04808008 +_0600B1A0: .word 0x0000703F +_0600B1A4: .word 0x00001FFF +_0600B1A8: .word 0x048080F6 +_0600B1AC: .word 0x048080AE +_0600B1B0: .word 0x0000E0BF +_0600B1B4: .word 0x048081AA +_0600B1B8: .word 0x048080D0 +_0600B1BC: .word 0x00000581 +_0600B1C0: .word 0x00000181 +_0600B1C4: .word 0x048080E0 +_0600B1C8: .word 0x04808048 + arm_func_end WStart + + arm_func_start __VENEER__ll_udiv +__VENEER__ll_udiv: ; 0x0600B1CC + ldr pc, _0600B1D0 ; =_ll_udiv + .align 2, 0 +_0600B1D0: .word _ll_udiv + arm_func_end __VENEER__ll_udiv + + arm_func_start WStop +WStop: ; 0x0600B1D4 + stmdb sp!, {r4, lr} + ldr r0, _0600B264 ; =0x0380FFF4 + ldr r1, [r0] + add r0, r1, #0x208 + add r0, r0, #0x400 + add r4, r1, #0x344 + bl __VENEER_OS_CancelAlarm + ldr r0, _0600B264 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_CancelAlarm + mov r0, #0x20 + bl WSetStaState + mov r1, #0 + strh r1, [r4, #0xa4] + ldr r0, _0600B268 ; =0x04808012 + strh r1, [r4, #0x12] + strh r1, [r0] + strh r1, [r0, #-0xe] + strh r1, [r0, #0xd8] + strh r1, [r0, #0xd6] + strh r1, [r0, #-0xa] + strh r1, [r0, #-8] + ldrh r0, [r4, #0xc] + cmp r0, #1 + bne _0600B244 + bl StopBeaconFrame +_0600B244: + ldr r1, _0600B26C ; =0x0000FFFF + ldr r0, _0600B270 ; =0x048080AC + strh r1, [r0] + strh r1, [r0, #8] + bl DeleteAllTxFrames + bl ReleaseAllWlHeapBuf + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600B264: .word 0x0380FFF4 +_0600B268: .word 0x04808012 +_0600B26C: .word 0x0000FFFF +_0600B270: .word 0x048080AC + arm_func_end WStop + + arm_func_start BBP_Read +BBP_Read: ; 0x0600B274 + stmdb sp!, {r3, lr} + ldr r1, _0600B298 ; =0x04808158 + orr r0, r0, #0x6000 + strh r0, [r1] + bl WaitLoop_BbpAccess + ldr r0, _0600B29C ; =0x0480815C + ldrh r0, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600B298: .word 0x04808158 +_0600B29C: .word 0x0480815C + arm_func_end BBP_Read + + arm_func_start BBP_Write +BBP_Write: ; 0x0600B2A0 + stmdb sp!, {r3, lr} + ldr r2, _0600B2CC ; =0x0480815A + orr r0, r0, #0x5000 + strh r1, [r2] + strh r0, [r2, #-2] + bl WaitLoop_BbpAccess + cmp r0, #0 + mvnne r0, #0 + moveq r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600B2CC: .word 0x0480815A + arm_func_end BBP_Write + + arm_func_start RF_Write +RF_Write: ; 0x0600B2D0 + ldr r2, _0600B2E8 ; =0x0480817E + ldr ip, _0600B2EC ; =WaitLoop_RfAccess + strh r0, [r2] + mov r1, r0, lsr #0x10 + strh r1, [r2, #-2] + bx ip + .align 2, 0 +_0600B2E8: .word 0x0480817E +_0600B2EC: .word WaitLoop_RfAccess + arm_func_end RF_Write + + arm_func_start CalcBbpCRC +CalcBbpCRC: ; 0x0600B2F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r8, #0 + str r8, [sp] + mov r7, r8 + mov r6, #0x64 + add r4, sp, #0 + mov r5, #1 +_0600B310: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl FLASH_Read + cmp r7, #1 + ldreq r0, [sp] + mov r1, r8 + andeq r0, r0, #0x80 + streq r0, [sp] + ldr r0, [sp] + and r0, r0, #0xff + bl calc_NextCRC + add r7, r7, #1 + mov r8, r0 + cmp r7, #0x69 + add r6, r6, #1 + blo _0600B310 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, lr} + bx lr + arm_func_end CalcBbpCRC + + arm_func_start WConfigDevice +WConfigDevice: ; 0x0600B360 + stmdb sp!, {r4, lr} + ldr r1, _0600B3CC ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + mov r2, #0x10 + add r1, r1, #0x1f8 + add r4, r1, #0x400 + mov r1, r4 + bl __VENEER_MIi_CpuClear16 + mov r2, r4 + mov r0, #0x40 + mov r1, #1 + bl FLASH_Read + add r2, r4, #2 + mov r0, #0x41 + mov r1, #1 + bl FLASH_Read + add r2, r4, #4 + mov r0, #0x42 + mov r1, #1 + bl FLASH_Read + add r2, r4, #6 + mov r0, #0x43 + mov r1, #1 + bl FLASH_Read + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600B3CC: .word 0x0380FFF4 + arm_func_end WConfigDevice + + arm_func_start InitMac +InitMac: ; 0x0600B3D0 + ldr r2, _0600B404 ; =macInitRegs + mov r3, #0 +_0600B3D8: + mov r0, r3, lsl #2 + ldrh r0, [r2, r0] + add r1, r2, r3, lsl #2 + add r0, r0, #0x4800000 + add r3, r3, #1 + ldrh r1, [r1, #2] + add r0, r0, #0x8000 + strh r1, [r0] + cmp r3, #0x19 + blo _0600B3D8 + bx lr + .align 2, 0 +_0600B404: .word macInitRegs + arm_func_end InitMac + + arm_func_start InitBaseBand +InitBaseBand: ; 0x0600B408 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _0600B46C ; =0x04808160 + mov r1, #0x100 + strh r1, [r0] + mov r6, #0 + str r6, [sp] + mov r7, #0x64 + add r4, sp, #0 + mov r5, #1 +_0600B42C: + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl FLASH_Read + ldr r1, [sp] + mov r0, r6 + bl BBP_Write + add r6, r6, #1 + cmp r6, #0x69 + add r7, r7, #1 + blo _0600B42C + mov r0, #0x5a + mov r1, #2 + bl BBP_Write + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600B46C: .word 0x04808160 + arm_func_end InitBaseBand + + arm_func_start InitRF +InitRF: ; 0x0600B470 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + ldr r0, _0600B5EC ; =0x0380FFF4 + ldr r5, _0600B5F0 ; =macTxRxRegAdrs + ldr r0, [r0] + mov r8, #0 + add r0, r0, #0x1f8 + str r8, [sp] + add r4, r0, #0x400 + add r6, sp, #0 + mov r7, #2 +_0600B49C: + mov r0, r8, lsl #1 + mov r1, r7 + mov r2, r6 + add r0, r0, #0x44 + bl FLASH_Read + mov r0, r8, lsl #1 + ldrh r0, [r5, r0] + add r8, r8, #1 + add r0, r0, #0x4800000 + ldr r1, [sp] + add r0, r0, #0x8000 + strh r1, [r0] + cmp r8, #0x10 + blo _0600B49C + ldrh r1, [r4, #2] + ldr r0, _0600B5F4 ; =0x04808184 + mov r2, r1, lsr #7 + mov r1, r2, lsl #8 + str r1, [sp, #4] + ldrh r1, [r4, #2] + mov r7, #0xce + and r1, r1, #0x7f + orr r1, r1, r2, lsl #8 + str r1, [sp, #4] + strh r1, [r0] + ldrh r0, [r4, #2] + ldrh r1, [r4] + and r0, r0, #0x7f + add r2, r0, #7 + mov r0, r2, asr #2 + add r0, r2, r0, lsr #29 + ldrh r8, [r4, #4] + cmp r1, #3 + mov r6, r0, asr #3 + bne _0600B58C + add r0, r8, #0xce + add r2, r4, #8 + mov r1, #1 + bl FLASH_Read + mov sb, #0 + add r4, sp, #4 + mov r6, sb + mov r5, #1 + b _0600B580 +_0600B54C: + str r6, [sp, #4] + mov r0, r7 + mov r1, r5 + mov r2, r4 + bl FLASH_Read + mov r0, sb, lsl #8 + ldr r1, [sp, #4] + add r0, r0, #0x50000 + orr r0, r1, r0 + str r0, [sp, #4] + bl RF_Write + add sb, sb, #1 + add r7, r7, #1 +_0600B580: + cmp sb, r8 + blo _0600B54C + b _0600B5E0 +_0600B58C: + mov r0, #0 + str r0, [sp, #4] + add r5, sp, #4 + b _0600B5D8 +_0600B59C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + bl FLASH_Read + ldr r0, [sp, #4] + bl RF_Write + ldrh r0, [r4] + sub r8, r8, #1 + cmp r0, #2 + ldreq r1, [sp, #4] + add r7, r7, r6 + moveq r0, r1, lsr #0x12 + cmpeq r0, #9 + biceq r0, r1, #0x7c00 + streq r0, [r4, #0xc] +_0600B5D8: + cmp r8, #0 + bne _0600B59C +_0600B5E0: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_0600B5EC: .word 0x0380FFF4 +_0600B5F0: .word macTxRxRegAdrs +_0600B5F4: .word 0x04808184 + arm_func_end InitRF + + arm_func_start InitializeAlarm +InitializeAlarm: ; 0x0600B5F8 + stmdb sp!, {r4, lr} + ldr r0, _0600B648 ; =0x0380FFF4 + ldr r4, [r0] + bl __VENEER_OS_IsAlarmAvailable + cmp r0, #0 + addeq r0, r4, #0x300 + ldreqh r1, [r0, #0x3e] + orreq r1, r1, #0x40 + streqh r1, [r0, #0x3e] + beq _0600B640 + add r0, r4, #0x208 + add r0, r0, #0x400 + bl __VENEER_OS_CreateAlarm + add r0, r4, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_CreateAlarm + add r0, r4, #0x660 + bl __VENEER_OS_CreateAlarm +_0600B640: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600B648: .word 0x0380FFF4 + arm_func_end InitializeAlarm + + arm_func_start __VENEER_OS_IsAlarmAvailable +__VENEER_OS_IsAlarmAvailable: ; 0x0600B64C + ldr pc, _0600B650 ; =OS_IsAlarmAvailable + .align 2, 0 +_0600B650: .word OS_IsAlarmAvailable + arm_func_end __VENEER_OS_IsAlarmAvailable + + arm_func_start TimeoutDummy +TimeoutDummy: ; 0x0600B654 + mov r1, #0 + str r1, [r0] + bx lr + arm_func_end TimeoutDummy + + arm_func_start WWaitus +WWaitus: ; 0x0600B660 + ldr ip, _0600B66C ; =WaitLoop_Waitus + ldr r1, _0600B670 ; =TimeoutDummy + bx ip + .align 2, 0 +_0600B66C: .word WaitLoop_Waitus +_0600B670: .word TimeoutDummy + arm_func_end WWaitus + + arm_func_start SetupPeriodicTimeOut +SetupPeriodicTimeOut: ; 0x0600B674 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + ldr r2, _0600B6FC ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + add r0, r0, #0x208 + add r0, r0, #0x400 + bl __VENEER_OS_CancelAlarm + ldr r0, _0600B700 ; =0x000082EA + mov r1, #0 + umull r3, r2, r5, r0 + mla r2, r5, r1, r2 + mov r5, r1 + mla r2, r5, r0, r2 + mov r6, r3, lsr #6 + orr r6, r6, r2, lsl #26 + bl __VENEER_OS_GetTick + adds r0, r6, r0 + adc r2, r1, #0 + mov r1, r0 + str r4, [sp, #4] + mov r0, r5 + str r0, [sp, #8] + ldr r0, _0600B6FC ; =0x0380FFF4 + str r5, [sp] + ldr r0, [r0] + mov r3, r6 + add r0, r0, #0x208 + add r0, r0, #0x400 + bl __VENEER_OS_SetPeriodicAlarm + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600B6FC: .word 0x0380FFF4 +_0600B700: .word 0x000082EA + arm_func_end SetupPeriodicTimeOut + + arm_func_start __VENEER_OS_SetPeriodicAlarm +__VENEER_OS_SetPeriodicAlarm: ; 0x0600B704 + ldr pc, _0600B708 ; =OS_SetPeriodicAlarm + .align 2, 0 +_0600B708: .word OS_SetPeriodicAlarm + arm_func_end __VENEER_OS_SetPeriodicAlarm + + arm_func_start ClearPeriodicTimeOut +ClearPeriodicTimeOut: ; 0x0600B70C + ldr r0, _0600B724 ; =0x0380FFF4 + ldr ip, _0600B728 ; =OS_CancelAlarm + ldr r0, [r0] + add r0, r0, #0x208 + add r0, r0, #0x400 + bx ip + .align 2, 0 +_0600B724: .word 0x0380FFF4 +_0600B728: .word OS_CancelAlarm + arm_func_end ClearPeriodicTimeOut + + arm_func_start WIntervalTimer +WIntervalTimer: ; 0x0600B72C + stmdb sp!, {r4, lr} + ldr r1, _0600B7A8 ; =0x0380FFF4 + mov r0, #1 + ldr r4, [r1] + mov r1, #0xa + ldr r2, [r4, #0x3ec] + add r2, r2, #1 + str r2, [r4, #0x3ec] + bl AddTask + mov r0, #2 + mov r1, #0x12 + bl AddTask + mov r0, #1 + mov r1, #0x11 + bl AddTask + add r0, r4, #0x100 + ldrh r0, [r0, #0xfc] + cmp r0, #0 + beq _0600B784 + mov r0, #2 + mov r1, #0x13 + bl AddTask +_0600B784: + add r0, r4, #0x300 + ldrh r0, [r0, #0xf4] + cmp r0, #0 + beq _0600B7A0 + mov r0, #2 + mov r1, #0x15 + bl AddTask +_0600B7A0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600B7A8: .word 0x0380FFF4 + arm_func_end WIntervalTimer + + arm_func_start SetupTimeOut +SetupTimeOut: ; 0x0600B7AC + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600B814 ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + add r0, r0, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_CancelAlarm + mov r3, #0 + ldr r0, _0600B818 ; =0x000082EA + mov r1, r3 + umull r2, ip, r5, r0 + mla ip, r5, r3, ip + mla ip, r1, r0, ip + mov r1, r2, lsr #6 + str r3, [sp] + ldr r0, _0600B814 ; =0x0380FFF4 + mov r3, r4 + ldr r0, [r0] + mov r2, ip, lsr #6 + add r0, r0, #0x234 + add r0, r0, #0x400 + orr r1, r1, ip, lsl #26 + bl __VENEER_OS_SetAlarm + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600B814: .word 0x0380FFF4 +_0600B818: .word 0x000082EA + arm_func_end SetupTimeOut + + arm_func_start SetupUsTimeOut +SetupUsTimeOut: ; 0x0600B81C + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600B898 ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + add r0, r0, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_CancelAlarm + ldr r0, _0600B89C ; =0x000082EA + mov r3, #0 + umull ip, r2, r5, r0 + mla r2, r5, r3, r2 + mov r1, r3 + mla r2, r1, r0, r2 + mov r0, ip, lsr #6 + mov r1, r2, lsr #6 + orr r0, r0, r2, lsl #26 + mov r2, #0x3e8 + bl __VENEER__ll_udiv + mov r2, r1 + mov r1, r0 + mov r0, #0 + str r0, [sp] + ldr r0, _0600B898 ; =0x0380FFF4 + mov r3, r4 + ldr r0, [r0] + add r0, r0, #0x234 + add r0, r0, #0x400 + bl __VENEER_OS_SetAlarm + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600B898: .word 0x0380FFF4 +_0600B89C: .word 0x000082EA + arm_func_end SetupUsTimeOut + + arm_func_start ClearTimeOut +ClearTimeOut: ; 0x0600B8A0 + ldr r0, _0600B8B8 ; =0x0380FFF4 + ldr ip, _0600B8BC ; =OS_CancelAlarm + ldr r0, [r0] + add r0, r0, #0x234 + add r0, r0, #0x400 + bx ip + .align 2, 0 +_0600B8B8: .word 0x0380FFF4 +_0600B8BC: .word OS_CancelAlarm + arm_func_end ClearTimeOut + + arm_func_start DMA_Read +DMA_Read: ; 0x0600B8C0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _0600B934 ; =0x04805F60 + add r2, r2, #1 + mov r5, r1 + bic r2, r2, #1 + add r1, r5, r2 + cmp r1, r3 + mov r6, r0 + subhi r4, r3, r5 + subhi r7, r2, r4 + movls r4, r2 + movls r7, #0 + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl __VENEER_MIi_CpuCopy16 + cmp r7, #0 + beq _0600B92C + ldr r0, _0600B938 ; =0x0380FFF4 + add r3, r5, r4 + ldr r0, [r0] + mov r2, r7 + add r0, r0, #0x300 + ldrh r0, [r0, #0xde] + add r1, r6, r4 + sub r0, r3, r0 + bl __VENEER_MIi_CpuCopy16 +_0600B92C: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600B934: .word 0x04805F60 +_0600B938: .word 0x0380FFF4 + arm_func_end DMA_Read + + arm_func_start DMA_Write +DMA_Write: ; 0x0600B93C + ldr ip, _0600B958 ; =MIi_CpuCopy16 + mov r3, r0 + add r2, r2, #1 + mov r0, r1 + mov r1, r3 + bic r2, r2, #1 + bx ip + .align 2, 0 +_0600B958: .word MIi_CpuCopy16 + arm_func_end DMA_Write + + arm_func_start DMA_WriteHeaderData +DMA_WriteHeaderData: ; 0x0600B95C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r2 + mov r0, r1 + mov r4, r3 + mov r1, r6 + mov r2, #0x24 + bl __VENEER_MIi_CpuCopy16 + cmp r4, #0 + beq _0600B998 + add r2, r4, #1 + mov r0, r5 + add r1, r6, #0x24 + bic r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_0600B998: + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end DMA_WriteHeaderData + + arm_func_start DMA_WepWriteHeaderData +DMA_WepWriteHeaderData: ; 0x0600B9A0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r2 + mov r0, r1 + mov r4, r3 + mov r1, r6 + mov r2, #0x24 + bl __VENEER_MIi_CpuCopy16 + cmp r4, #0 + beq _0600B9DC + add r2, r4, #1 + mov r0, r5 + add r1, r6, #0x28 + bic r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_0600B9DC: + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end DMA_WepWriteHeaderData + + arm_func_start WL_WriteByte +WL_WriteByte: ; 0x0600B9E4 + tst r0, #1 + ldrneh r2, [r0, #-1] + andne r2, r2, #0xff + orrne r1, r2, r1, lsl #8 + strneh r1, [r0, #-1] + ldreqh r2, [r0] + andeq r1, r1, #0xff + andeq r2, r2, #0xff00 + orreq r1, r2, r1 + streqh r1, [r0] + bx lr + arm_func_end WL_WriteByte + + arm_func_start WL_ReadByte +WL_ReadByte: ; 0x0600BA10 + tst r0, #1 + ldrneh r0, [r0, #-1] + movne r0, r0, asr #8 + ldreqh r0, [r0] + and r0, r0, #0xff + and r0, r0, #0xff + bx lr + arm_func_end WL_ReadByte + + arm_func_start RND_Init +RND_Init: ; 0x0600BA2C + ldr r3, _0600BA58 ; =0x0380FFF4 + ldr r2, _0600BA5C ; =0x0000FFF8 + ldr r3, [r3] + and r0, r0, r2 + add r2, r0, #5 + add r0, r3, #0x500 + strh r2, [r0, #0xf0] + add r2, r3, #0x5f0 + orr r0, r1, #1 + strh r0, [r2, #2] + bx lr + .align 2, 0 +_0600BA58: .word 0x0380FFF4 +_0600BA5C: .word 0x0000FFF8 + arm_func_end RND_Init + + arm_func_start RND_seed +RND_seed: ; 0x0600BA60 + ldr r1, _0600BA74 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x500 + strh r0, [r1, #0xf4] + bx lr + .align 2, 0 +_0600BA74: .word 0x0380FFF4 + arm_func_end RND_seed + + arm_func_start RND_rand +RND_rand: ; 0x0600BA78 + ldr r0, _0600BAA4 ; =0x0380FFF4 + ldr r0, [r0] + add r3, r0, #0x5f0 + add r0, r0, #0x500 + ldrh r2, [r3, #2] + ldrh r1, [r3, #4] + ldrh r0, [r0, #0xf0] + mla r0, r1, r0, r2 + strh r0, [r3, #4] + ldrh r0, [r3, #4] + bx lr + .align 2, 0 +_0600BAA4: .word 0x0380FFF4 + arm_func_end RND_rand + + arm_func_start calc_NextCRC +calc_NextCRC: ; 0x0600BAA8 + stmdb sp!, {r4, lr} + ldr r2, _0600BB20 ; =crc16_table + mov r4, r1, lsl #0x1c + ldr r3, _0600BB24 ; =0x00000FFF + mov r4, r4, lsr #0x1b + mov ip, r0, lsl #0x1c + mov lr, ip, lsr #0x1b + and r1, r3, r1, asr #4 + ldrh r4, [r2, r4] + mov r1, r1, lsl #0x10 + mov r0, r0, asr #4 + mov r0, r0, lsl #0x1c + mov ip, r0, lsr #0x1b + ldrh r0, [r2, lr] + eor r1, r4, r1, lsr #16 + eor r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, r1, lsl #0x1c + mov r0, r0, lsr #0x1b + and r1, r3, r1, asr #4 + ldrh r3, [r2, r0] + mov r0, r1, lsl #0x10 + ldrh r1, [r2, ip] + eor r0, r3, r0, lsr #16 + eor r0, r0, r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600BB20: .word crc16_table +_0600BB24: .word 0x00000FFF + arm_func_end calc_NextCRC + + arm_func_start WCheckTxBufIdBeforeFrame +WCheckTxBufIdBeforeFrame: ; 0x0600BB28 + stmdb sp!, {r4, lr} + ldr r4, [r0, #8] + ldr r1, _0600BB9C ; =0x0000B6B8 + ldrh r2, [r4, #-4] + sub lr, r4, #4 + cmp r2, r1 + ldreqh r2, [lr, #2] + ldreq r1, _0600BBA0 ; =0x00001D46 + cmpeq r2, r1 + moveq r0, #0 + beq _0600BB94 + ldr r3, _0600BB9C ; =0x0000B6B8 + mov ip, #1 + strh ip, [r4, #0xa] + ldr r2, _0600BBA0 ; =0x00001D46 + strh r3, [lr] + strh r2, [lr, #2] + ldr r1, [r0, #8] + ldr r0, _0600BBA4 ; =0x0380FFF4 + strh r3, [r1, #0xc] + strh r2, [r1, #0xe] + ldr r1, [r0] + mov r0, ip + add r1, r1, #0x300 + ldrh r2, [r1, #0xfa] + add r2, r2, #1 + strh r2, [r1, #0xfa] +_0600BB94: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600BB9C: .word 0x0000B6B8 +_0600BBA0: .word 0x00001D46 +_0600BBA4: .word 0x0380FFF4 + arm_func_end WCheckTxBufIdBeforeFrame + + arm_func_start WaitMacStop +WaitMacStop: ; 0x0600BBA8 + ldr r0, _0600BBE0 ; =0x04808004 + mov r1, #0 + strh r1, [r0] + mov r2, #0x10 + add r1, r0, #0x210 + b _0600BBD4 +_0600BBC0: + ldrh r0, [r1] + cmp r0, #0 + cmpne r0, #9 + bxeq lr + sub r2, r2, #1 +_0600BBD4: + cmp r2, #0 + bne _0600BBC0 + bx lr + .align 2, 0 +_0600BBE0: .word 0x04808004 + arm_func_end WaitMacStop + + arm_func_start RestoreTxFrame +RestoreTxFrame: ; 0x0600BBE4 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrh r0, [r4] + cmp r0, #0 + beq _0600BC24 + bl WaitMacStop + ldr r1, [r4, #0xc] + ldr r0, [r4, #8] + sub r1, r1, #0x10 + bl CopyTxFrmToMacBuf + ldr r0, _0600BC2C ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0xfc] + add r1, r1, #1 + strh r1, [r0, #0xfc] +_0600BC24: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600BC2C: .word 0x0380FFF4 + arm_func_end RestoreTxFrame + + arm_func_start WCheckTxBuf +WCheckTxBuf: ; 0x0600BC30 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0600BD24 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x300 + ldrh r1, [r0, #0x50] + add r0, r2, #0x2c + cmp r1, #1 + add r4, r2, #0x344 + add r5, r0, #0x400 + beq _0600BC68 + cmp r1, #2 + beq _0600BC9C + cmp r1, #3 + b _0600BCD8 +_0600BC68: + add r0, r5, #0x78 + bl WCheckTxBufIdBeforeFrame + cmp r0, #0 + beq _0600BC80 + bl WaitMacStop + bl MakeBeaconFrame +_0600BC80: + add r0, r5, #0x28 + bl WCheckTxBufIdBeforeFrame + cmp r0, #0 + beq _0600BCD8 + add r0, r5, #0x28 + bl RestoreTxFrame + b _0600BCD8 +_0600BC9C: + add r0, r5, #0x64 + bl WCheckTxBufIdBeforeFrame + add r0, r5, #0x28 + bl WCheckTxBufIdBeforeFrame + cmp r0, #0 + beq _0600BCD8 + ldrh r0, [r5, #0x28] + cmp r0, #0 + beq _0600BCC4 + bl WaitMacStop +_0600BCC4: + ldrh r0, [r4, #0x6a] + bl MakePsPollFrame + ldrh r0, [r4, #0xb8] + add r0, r0, #1 + strh r0, [r4, #0xb8] +_0600BCD8: + add r0, r5, #0x14 + bl WCheckTxBufIdBeforeFrame + cmp r0, #0 + beq _0600BCF0 + add r0, r5, #0x14 + bl RestoreTxFrame +_0600BCF0: + mov r0, r5 + bl WCheckTxBufIdBeforeFrame + cmp r0, #0 + beq _0600BD08 + mov r0, r5 + bl RestoreTxFrame +_0600BD08: + ldr r1, _0600BD28 ; =0x04808004 + ldrh r0, [r1] + cmp r0, #0 + moveq r0, #1 + streqh r0, [r1] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600BD24: .word 0x0380FFF4 +_0600BD28: .word 0x04808004 + arm_func_end WCheckTxBuf + + arm_func_start SetFatalErr +SetFatalErr: ; 0x0600BD2C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldr r1, _0600BD6C ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r2, [r1, #0xf4] + orr r2, r2, r4 + strh r2, [r1, #0xf4] + bl __VENEER_OS_EnableIrqMask + mov r0, #2 + mov r1, #0x15 + bl AddTask + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600BD6C: .word 0x0380FFF4 + arm_func_end SetFatalErr + + arm_func_start SendFatalErrMsgTask +SendFatalErrMsgTask: ; 0x0600BD70 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0600BDE8 ; =0x0380FFF4 + ldr r1, [r0] + add r4, r1, #0x344 + ldrh r0, [r4, #0xb0] + cmp r0, #0 + beq _0600BDE0 + add r0, r1, #0x188 + mov r1, #0x12 + bl AllocateHeapBuf + movs r5, r0 + beq _0600BDE0 + ldr r1, _0600BDEC ; =0x00000186 + mov r0, #1 + strh r1, [r5, #0xc] + strh r0, [r5, #0xe] + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldrh r2, [r4, #0xb0] + mov r1, #0 + strh r2, [r5, #0x10] + strh r1, [r4, #0xb0] + bl __VENEER_OS_EnableIrqMask + ldr r0, _0600BDE8 ; =0x0380FFF4 + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect +_0600BDE0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600BDE8: .word 0x0380FFF4 +_0600BDEC: .word 0x00000186 + arm_func_end SendFatalErrMsgTask + + arm_func_start TerminateWlTask +TerminateWlTask: ; 0x0600BDF0 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600BE88 ; =0x0380FFF4 + ldr r0, [r2] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3e] + orr r1, r1, #0x8000 + strh r1, [r0, #0x3e] + ldr r0, [r2] + add r0, r0, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0 + beq _0600BE5C + bl WStop + ldr r2, _0600BE88 ; =0x0380FFF4 + ldr r0, [r2] + add r0, r0, #0x400 + ldrh r1, [r0, #4] + cmp r1, #0 + beq _0600BE58 + mov r1, #0 + strh r1, [r0, #4] + ldr r0, [r2] + mov r1, #6 + ldr r0, [r0, #0x420] + strh r1, [r0, #4] + bl IssueMlmeConfirm +_0600BE58: + bl WShutdown +_0600BE5C: + ldr r4, _0600BE8C ; =0x0000FFFF + mov r5, #3 +_0600BE64: + mov r0, r5 + bl DeleteTask + cmp r0, r4 + bne _0600BE64 + mov r0, #3 + mov r1, #0x17 + bl AddTask + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600BE88: .word 0x0380FFF4 +_0600BE8C: .word 0x0000FFFF + arm_func_end TerminateWlTask + + arm_func_start ReleaseWlTask +ReleaseWlTask: ; 0x0600BE90 + stmdb sp!, {r4, lr} + ldr r0, _0600BEDC ; =0x0380FFF4 + ldr r4, [r0] + bl ReleaseIntr + ldr r1, _0600BEDC ; =0x0380FFF4 + add r0, r4, #0x188 + ldr r1, [r1] + ldr r1, [r1, #0x318] + sub r1, r1, #0xc + bl ReleaseHeapBuf + ldr r1, _0600BEDC ; =0x0380FFF4 + add r0, r4, #0x188 + ldr r1, [r1] + ldr r1, [r1, #0x3e0] + sub r1, r1, #0xc + bl ReleaseHeapBuf + bl __VENEER_OS_ExitThread + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600BEDC: .word 0x0380FFF4 + arm_func_end ReleaseWlTask + + arm_func_start DiagMacRegister +DiagMacRegister: ; 0x0600BEE0 + stmdb sp!, {r4, r5, r6, lr} + mov ip, #0 + ldr r0, _0600C074 ; =test_reg + ldr r6, _0600C078 ; =test_pattern + mov r3, ip + mov r1, ip + b _0600BF54 +_0600BEFC: + mov r4, r3, lsl #1 + ldrh r5, [r6, r4] + mov r2, r1 + b _0600BF48 +_0600BF0C: + mov lr, r2, lsl #2 + add r4, r0, r2, lsl #2 + ldrh lr, [r0, lr] + ldrh r4, [r4, #2] + add lr, lr, #0x4800000 + and r4, r5, r4 + add lr, lr, #0x8000 + strh r4, [lr] + ldrh lr, [lr] + cmp lr, r4 + beq _0600BF44 + cmp ip, #0x20 + add ip, ip, #1 + bhi _0600C04C +_0600BF44: + add r2, r2, #1 +_0600BF48: + cmp r2, #0x1b + blo _0600BF0C + add r3, r3, #1 +_0600BF54: + cmp r3, #3 + blo _0600BEFC + ldr r4, _0600C07C ; =0x00001234 + ldr r3, _0600C074 ; =test_reg + mov r5, #0 +_0600BF68: + mov r0, r5, lsl #2 + add r1, r3, r5, lsl #2 + ldrh r0, [r3, r0] + ldrh r2, [r1, #2] + add r1, r4, #0x234 + add r0, r0, #0x4800000 + add r1, r1, #0x1000 + add r5, r5, #1 + and r2, r4, r2 + add r0, r0, #0x8000 + mov r1, r1, lsl #0x10 + strh r2, [r0] + cmp r5, #0x1b + mov r4, r1, lsr #0x10 + blo _0600BF68 + ldr r5, _0600C07C ; =0x00001234 + ldr r3, _0600C074 ; =test_reg + mov r4, #0 + b _0600BFFC +_0600BFB4: + mov r0, r4, lsl #2 + ldrh r0, [r3, r0] + add r1, r3, r4, lsl #2 + add r0, r0, #0x4800000 + add r0, r0, #0x8000 + ldrh r1, [r1, #2] + ldrh r2, [r0] + and r0, r5, r1 + cmp r2, r0 + beq _0600BFE8 + cmp ip, #0x20 + add ip, ip, #1 + bhi _0600C04C +_0600BFE8: + add r0, r5, #0x234 + add r0, r0, #0x1000 + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 + add r4, r4, #1 +_0600BFFC: + cmp r4, #0x1b + blo _0600BFB4 + mov r3, #0 + ldr r2, _0600C074 ; =test_reg + mov r1, r3 + b _0600C044 +_0600C014: + mov r0, r3, lsl #2 + ldrh r0, [r2, r0] + add r0, r0, #0x4800000 + add r0, r0, #0x8000 + strh r1, [r0] + ldrh r0, [r0] + cmp r0, #0 + beq _0600C040 + cmp ip, #0x20 + add ip, ip, #1 + bhi _0600C04C +_0600C040: + add r3, r3, #1 +_0600C044: + cmp r3, #0x1b + blo _0600C014 +_0600C04C: + cmp ip, #0 + beq _0600C06C + ldr r0, _0600C080 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3e] + orr r1, r1, #1 + strh r1, [r0, #0x3e] +_0600C06C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600C074: .word test_reg +_0600C078: .word test_pattern +_0600C07C: .word 0x00001234 +_0600C080: .word 0x0380FFF4 + arm_func_end DiagMacRegister + + arm_func_start DiagMacMemory +DiagMacMemory: ; 0x0600C084 + stmdb sp!, {r3, lr} + ldr lr, _0600C1FC ; =0x04804000 + mov r0, #0 + ldr r3, _0600C200 ; =0x0000FFFF + mov r2, r0 +_0600C098: + sub r1, r3, #1 + mov ip, r3 + mov r1, r1, lsl #0x10 + add r2, r2, #2 + cmp r2, #0x2000 + mov r3, r1, lsr #0x10 + strh ip, [lr], #2 + blo _0600C098 + ldr r2, _0600C1FC ; =0x04804000 + ldr r3, _0600C200 ; =0x0000FFFF + mov ip, #0 + b _0600C0F4 +_0600C0C8: + ldrh r1, [r2] + cmp r1, r3 + beq _0600C0E0 + cmp r0, #0x20 + add r0, r0, #1 + bhi _0600C1D4 +_0600C0E0: + sub r1, r3, #1 + mov r1, r1, lsl #0x10 + add ip, ip, #2 + add r2, r2, #2 + mov r3, r1, lsr #0x10 +_0600C0F4: + cmp ip, #0x2000 + blo _0600C0C8 + ldr r2, _0600C1FC ; =0x04804000 + ldr r3, _0600C204 ; =0x00005A5A + mov ip, #0 +_0600C108: + mvn r1, r3 + add ip, ip, #2 + mov r1, r1, lsl #0x10 + strh r3, [r2], #2 + cmp ip, #0x2000 + mov r3, r1, lsr #0x10 + blo _0600C108 + ldr r2, _0600C1FC ; =0x04804000 + ldr r3, _0600C204 ; =0x00005A5A + mov ip, #0 + b _0600C160 +_0600C134: + ldrh r1, [r2] + cmp r1, r3 + beq _0600C14C + cmp r0, #0x20 + add r0, r0, #1 + bhi _0600C1D4 +_0600C14C: + mvn r1, r3 + mov r1, r1, lsl #0x10 + add ip, ip, #2 + add r2, r2, #2 + mov r3, r1, lsr #0x10 +_0600C160: + cmp ip, #0x2000 + blo _0600C134 + ldr r2, _0600C1FC ; =0x04804000 + ldr r3, _0600C208 ; =0x0000A5A5 + mov ip, #0 +_0600C174: + mvn r1, r3 + add ip, ip, #2 + mov r1, r1, lsl #0x10 + strh r3, [r2], #2 + cmp ip, #0x2000 + mov r3, r1, lsr #0x10 + blo _0600C174 + ldr r2, _0600C1FC ; =0x04804000 + ldr r3, _0600C208 ; =0x0000A5A5 + mov ip, #0 + b _0600C1CC +_0600C1A0: + ldrh r1, [r2] + cmp r1, r3 + beq _0600C1B8 + cmp r0, #0x20 + add r0, r0, #1 + bhi _0600C1D4 +_0600C1B8: + mvn r1, r3 + mov r1, r1, lsl #0x10 + add ip, ip, #2 + add r2, r2, #2 + mov r3, r1, lsr #0x10 +_0600C1CC: + cmp ip, #0x2000 + blo _0600C1A0 +_0600C1D4: + cmp r0, #0 + beq _0600C1F4 + ldr r0, _0600C20C ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3e] + orr r1, r1, #2 + strh r1, [r0, #0x3e] +_0600C1F4: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600C1FC: .word 0x04804000 +_0600C200: .word 0x0000FFFF +_0600C204: .word 0x00005A5A +_0600C208: .word 0x0000A5A5 +_0600C20C: .word 0x0380FFF4 + arm_func_end DiagMacMemory + + arm_func_start DiagBaseBand +DiagBaseBand: ; 0x0600C210 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r0, _0600C4E4 ; =0x0380FFF4 + mov r7, #0 + ldr r0, [r0] + mov r6, #0 + add r0, r0, #0x500 + ldrh r0, [r0, #0xf8] + mov r5, #0xff + cmp r0, #5 + ldreq sl, _0600C4E8 ; =BBPDiagSkipAdrsES1 + mvn r4, #0 + ldrne sl, _0600C4EC ; =BBPDiagSkipAdrsRelease + b _0600C260 +_0600C244: + mov r0, r6 + mov r1, r5 + bl BBP_Write + cmp r0, r4 + moveq r7, #1 + beq _0600C4BC + add r6, r6, #1 +_0600C260: + cmp r6, #0x69 + blo _0600C244 + mov r5, #0 + mov r4, r5 + b _0600C2B0 +_0600C274: + mov r0, r4, lsl #1 + ldrh r0, [sl, r0] + cmp r5, r0 + addeq r4, r4, #1 + beq _0600C2AC + mov r0, r5 + bl BBP_Read + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #0xff + beq _0600C2AC + cmp r7, #0x20 + add r7, r7, #1 + bhi _0600C4BC +_0600C2AC: + add r5, r5, #1 +_0600C2B0: + cmp r5, #0x69 + blo _0600C274 + mov r5, #0 + mov r4, r5 +_0600C2C0: + mov r0, r5 + mov r1, r4 + bl BBP_Write + add r5, r5, #1 + cmp r5, #0x69 + blo _0600C2C0 + mov r4, #0 + mov r5, r4 + b _0600C31C +_0600C2E4: + mov r0, r5, lsl #1 + ldrh r0, [sl, r0] + cmp r4, r0 + addeq r5, r5, #1 + beq _0600C318 + mov r0, r4 + bl BBP_Read + mov r0, r0, lsl #0x10 + movs r0, r0, lsr #0x10 + beq _0600C318 + cmp r7, #0x20 + add r7, r7, #1 + bhi _0600C4BC +_0600C318: + add r4, r4, #1 +_0600C31C: + cmp r4, #0x69 + blo _0600C2E4 + mov r4, #0x55 + mov r5, #0 +_0600C32C: + mov r0, r5 + mov r1, r4 + bl BBP_Write + mvn r0, r4 + add r5, r5, #1 + mov r0, r0, lsl #0x10 + cmp r5, #0x69 + mov r4, r0, lsr #0x10 + blo _0600C32C + mov r4, #0 + mov r6, r4 + mov r5, #0x55 + b _0600C3A4 +_0600C360: + mov r0, r6, lsl #1 + ldrh r0, [sl, r0] + cmp r4, r0 + addeq r6, r6, #1 + beq _0600C398 + mov r0, r4 + bl BBP_Read + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, r5 + beq _0600C398 + cmp r7, #0x20 + add r7, r7, #1 + bhi _0600C4BC +_0600C398: + mvn r0, r5 + and r5, r0, #0xff + add r4, r4, #1 +_0600C3A4: + cmp r4, #0x69 + blo _0600C360 + mov r5, #0xff + mov r4, #0 +_0600C3B4: + mov r0, r4 + mov r1, r5 + bl BBP_Write + sub r0, r5, #1 + add r4, r4, #1 + mov r0, r0, lsl #0x10 + cmp r4, #0x69 + mov r5, r0, lsr #0x10 + blo _0600C3B4 + mov r4, #0 + mov r6, r4 + mov r5, #0xff + b _0600C430 +_0600C3E8: + mov r0, r6, lsl #1 + ldrh r0, [sl, r0] + cmp r4, r0 + addeq r6, r6, #1 + beq _0600C420 + mov r0, r4 + bl BBP_Read + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, r5 + beq _0600C420 + cmp r7, #0x20 + add r7, r7, #1 + bhi _0600C4BC +_0600C420: + sub r0, r5, #1 + mov r0, r0, lsl #0x10 + add r4, r4, #1 + mov r5, r0, lsr #0x10 +_0600C430: + cmp r4, #0x69 + blo _0600C3E8 + mov r8, #0 + mov sb, r8 + mov r4, #1 + mov fp, r8 + b _0600C4B4 +_0600C44C: + mov r0, sb, lsl #1 + ldrh r0, [sl, r0] + cmp r8, r0 + addeq sb, sb, #1 + beq _0600C4B0 + mov r6, r4 + mov r5, fp + b _0600C4A8 +_0600C46C: + mov r0, r8 + mov r1, r6 + bl BBP_Write + mov r0, r8 + bl BBP_Read + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, r6 + beq _0600C49C + cmp r7, #0x20 + add r7, r7, #1 + bhi _0600C4BC +_0600C49C: + mov r0, r6, lsl #1 + and r6, r0, #0xff + add r5, r5, #1 +_0600C4A8: + cmp r5, #9 + blo _0600C46C +_0600C4B0: + add r8, r8, #1 +_0600C4B4: + cmp r8, #0x69 + blo _0600C44C +_0600C4BC: + cmp r7, #0 + beq _0600C4DC + ldr r0, _0600C4E4 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3e] + orr r1, r1, #8 + strh r1, [r0, #0x3e] +_0600C4DC: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0600C4E4: .word 0x0380FFF4 +_0600C4E8: .word BBPDiagSkipAdrsES1 +_0600C4EC: .word BBPDiagSkipAdrsRelease + arm_func_end DiagBaseBand + + arm_func_start WlIntr +WlIntr: ; 0x0600C4F0 + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _0600C5BC ; =0x04808010 + mov r4, #1 +_0600C4FC: + ldrh r1, [r5] + ldrh r0, [r5, #2] + ands r6, r1, r0 + beq _0600C5A4 + tst r6, #0x80 + beq _0600C518 + bl WlIntrStartTx +_0600C518: + tst r6, #0x40 + beq _0600C524 + bl WlIntrStartRx +_0600C524: + tst r6, #0x8000 + beq _0600C530 + bl WlIntrPreTbtt +_0600C530: + tst r6, #0x4000 + beq _0600C53C + bl WlIntrTbtt +_0600C53C: + tst r6, #0x2000 + beq _0600C548 + bl WlIntrActEnd +_0600C548: + tst r6, #0x800 + beq _0600C554 + bl WlIntrRfWakeup +_0600C554: + tst r6, #8 + beq _0600C560 + bl WlIntrTxErr +_0600C560: + tst r6, #4 + beq _0600C56C + bl WlIntrRxCntup +_0600C56C: + tst r6, #1 + beq _0600C578 + bl WlIntrRxEnd +_0600C578: + tst r6, #0x30 + beq _0600C584 + bl WlIntrCntOvf +_0600C584: + tst r6, #2 + beq _0600C590 + bl WlIntrTxEnd +_0600C590: + tst r6, #0x1000 + beq _0600C4FC + mov r0, r4 + bl WlIntrMpEnd + b _0600C4FC +_0600C5A4: + ldr r1, _0600C5C0 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, #0x1000000 + str r0, [r1] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600C5BC: .word 0x04808010 +_0600C5C0: .word 0x0380FFF8 + arm_func_end WlIntr + + arm_func_start WlIntrPreTbtt +WlIntrPreTbtt: ; 0x0600C5C4 + stmdb sp!, {r4, lr} + ldr r1, _0600C648 ; =0x0380FFF4 + ldr r0, _0600C64C ; =0x04808010 + ldr r2, [r1] + mov r1, #0x8000 + strh r1, [r0] + add r4, r2, #0x344 + ldrh r0, [r4, #8] + cmp r0, #0x40 + bne _0600C638 + ldrh r0, [r4, #0x7e] + cmp r0, #0 + beq _0600C638 + ldrh r1, [r4, #0x72] + ldrh r0, [r4, #0x70] + cmp r1, r0 + bne _0600C638 + ldrh r0, [r4, #0x80] + add r0, r0, #1 + strh r0, [r4, #0x80] + ldrh r1, [r4, #0x80] + ldrh r0, [r4, #0x7e] + cmp r1, r0 + bls _0600C638 + mov r2, #0 + mov r0, #1 + mov r1, #0xd + strh r2, [r4, #0x80] + bl AddTask +_0600C638: + mov r0, #1 + strh r0, [r4, #0x10] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600C648: .word 0x0380FFF4 +_0600C64C: .word 0x04808010 + arm_func_end WlIntrPreTbtt + + arm_func_start WlIntrTbtt +WlIntrTbtt: ; 0x0600C650 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r6, _0600C8D4 ; =0x0380FFF4 + ldr r2, _0600C8D8 ; =0x04808010 + ldr r3, [r6] + mov r0, #0x4000 + strh r0, [r2] + add r4, r3, #0x344 + ldrh r1, [r4, #0xc] + add r0, r3, #0x2c + cmp r1, #1 + add r5, r3, #0x31c + add r7, r0, #0x400 + beq _0600C698 + cmp r1, #2 + beq _0600C74C + cmp r1, #3 + beq _0600C790 + b _0600C8CC +_0600C698: + ldr r1, [r7, #0x80] + ldrh r6, [r6, #-4] + ldrh r0, [r4, #0x96] + add r1, r1, #0x24 + add r8, r1, r0 + add r0, r8, #8 + and r1, r6, #0xff + bl WL_WriteByte + mov r1, r6, lsr #8 + add r0, r8, #9 + and r1, r1, #0xff + bl WL_WriteByte + ldrh r0, [r4, #0xe] + cmp r0, #1 + bne _0600C6EC + ldr r1, _0600C8DC ; =0x04808134 + ldrh r2, [r5, #0x20] + ldrh r0, [r1] + add r0, r2, r0 + add r0, r0, #1 + strh r0, [r1] +_0600C6EC: + ldr r0, _0600C8D4 ; =0x0380FFF4 + ldr r1, _0600C8E0 ; =0x048080B6 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r3, [r0, #0x2e] + ldrh r2, [r0, #0x32] + mvn r3, r3 + orr r2, r3, r2 + strh r2, [r0, #0x30] + ldrh r0, [r1] + tst r0, #0x18 + bne _0600C728 + and r0, r0, #6 + cmp r0, #2 + bne _0600C73C +_0600C728: + ldr r0, [r7, #0x8c] + bic r0, r0, #2 + str r0, [r7, #0x8c] + bl SetParentTbttTxq + b _0600C8CC +_0600C73C: + ldr r0, [r7, #0x8c] + orr r0, r0, #2 + str r0, [r7, #0x8c] + b _0600C8CC +_0600C74C: + ldrh r0, [r4, #0x12] + cmp r0, #0 + ldreq r1, _0600C8E4 ; =0x0000FFFF + addeq r0, r2, #0x124 + streqh r1, [r0] + beq _0600C77C + add r1, r2, #0x124 + ldrh r2, [r5, #0x20] + ldrh r0, [r1] + add r0, r2, r0 + add r0, r0, #1 + strh r0, [r1] +_0600C77C: + ldrh r0, [r4, #0x1a] + cmp r0, #2 + bne _0600C790 + mov r0, #2 + bl WSetPowerState +_0600C790: + ldrh r0, [r4, #8] + cmp r0, #0x40 + movne r1, #1 + bne _0600C7DC + ldrh r0, [r4, #0x72] + mov r1, #0 + cmp r0, #1 + ldrh r0, [r4, #0x14] + moveq r1, #1 + cmp r0, #0 + beq _0600C7DC + ldrh r0, [r4, #0x76] + cmp r0, #1 + beq _0600C7D8 + cmp r0, #0 + ldreqh r0, [r4, #0x74] + cmpeq r0, #1 + bne _0600C7DC +_0600C7D8: + mov r1, #1 +_0600C7DC: + cmp r1, #0 + ldr r1, _0600C8E8 ; =0x04808038 + ldrneh r0, [r1] + orrne r0, r0, #1 + strneh r0, [r1] + ldreqh r0, [r1] + biceq r0, r0, #1 + streqh r0, [r1] + ldr r1, _0600C8EC ; =0x04808118 + mov r8, #0 + ldrh r0, [r1] + mov r6, #2 + cmp r0, #0xa + movhi r0, #0 + strhih r0, [r1, #-0xd0] + ldrh r0, [r4, #0x72] + mov r5, r8 + sub r0, r0, #1 + strh r0, [r4, #0x72] + ldrh r0, [r4, #0x72] + mov sl, #0x14 + cmp r0, #0 + ldreqh r0, [r4, #0x70] + streqh r0, [r4, #0x72] + ldrh r1, [r4, #0x76] + sub r0, r1, #1 + strh r0, [r4, #0x76] + cmp r1, #0 + ldreqh r0, [r4, #0x74] + subeq r0, r0, #1 + streqh r0, [r4, #0x76] + mov r4, #0xe +_0600C85C: + mul r1, r8, sl + ldrh r0, [r7, r1] + add sb, r7, r1 + cmp r0, #0 + beq _0600C8B4 + ldr r0, [sb, #0xc] + ldrh r1, [r0, #8] + cmp r1, #0 + bne _0600C8B4 + bl CheckFrameTimeout + cmp r0, #0 + beq _0600C8B4 + mov r0, r8 + bl ResetTxqPri + ldr r1, [sb, #8] + mov r0, r5 + strh r6, [r1] + mov r1, r4 + bl AddTask + ldrh r0, [r7, #0xae] + add r0, r0, #1 + strh r0, [r7, #0xae] +_0600C8B4: + add r8, r8, #1 + cmp r8, #2 + blo _0600C85C + ldr r0, _0600C8F0 ; =0x048080AE + mov r1, #0xd + strh r1, [r0] +_0600C8CC: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0600C8D4: .word 0x0380FFF4 +_0600C8D8: .word 0x04808010 +_0600C8DC: .word 0x04808134 +_0600C8E0: .word 0x048080B6 +_0600C8E4: .word 0x0000FFFF +_0600C8E8: .word 0x04808038 +_0600C8EC: .word 0x04808118 +_0600C8F0: .word 0x048080AE + arm_func_end WlIntrTbtt + + arm_func_start WlIntrActEnd +WlIntrActEnd: ; 0x0600C8F4 + ldr r0, _0600C958 ; =0x0380FFF4 + ldr r1, _0600C95C ; =0x04808010 + ldr r2, [r0] + mov r0, #0x2000 + strh r0, [r1] + mov r0, #0xd + add r2, r2, #0x344 + strh r0, [r1, #0x9c] + ldrh r0, [r2, #0x1a] + cmp r0, #1 + moveq r0, #2 + streqh r0, [r2, #0x1a] + bxeq lr + cmp r0, #2 + moveq r0, #0 + streqh r0, [r2, #0x1a] + bxeq lr + ldrh r0, [r2, #0xc] + cmp r0, #2 + bxne lr + ldrh r0, [r2, #8] + cmp r0, #0x40 + movne r0, #0 + strneh r0, [r1, #0x38] + bx lr + .align 2, 0 +_0600C958: .word 0x0380FFF4 +_0600C95C: .word 0x04808010 + arm_func_end WlIntrActEnd + + arm_func_start WlIntrRfWakeup +WlIntrRfWakeup: ; 0x0600C960 + ldr r0, _0600C970 ; =0x04808010 + mov r1, #0x800 + strh r1, [r0] + bx lr + .align 2, 0 +_0600C970: .word 0x04808010 + arm_func_end WlIntrRfWakeup + + arm_func_start WlIntrCntOvf +WlIntrCntOvf: ; 0x0600C974 + stmdb sp!, {r3, lr} + bl WUpdateCounter + ldr r1, _0600C99C ; =0x048081AC + ldr r2, _0600C9A0 ; =0x0000FFFF + sub r0, r1, #0x19c + strh r2, [r1] + mov r1, #0x30 + strh r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600C99C: .word 0x048081AC +_0600C9A0: .word 0x0000FFFF + arm_func_end WlIntrCntOvf + + arm_func_start WlIntrTxErr +WlIntrTxErr: ; 0x0600C9A4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _0600CAA8 ; =0x04808010 + mov r2, #8 + ldr r0, _0600CAAC ; =0x0380FFF4 + strh r2, [r1] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x3a] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _0600C9EC + add r0, r1, #0x18c + ldrh r0, [r0] + tst r0, #1 + addeq r1, r1, #0x280 + ldreqh r0, [r1] + eoreq r0, r0, #1 + streqh r0, [r1] +_0600C9EC: + ldr r0, _0600CAAC ; =0x0380FFF4 + ldr r1, [r0] + add r0, r1, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #8 + beq _0600CAA0 + ldr r4, _0600CAB0 ; =0x04808032 + add r0, r1, #0x2c + mov r2, #0 + add r1, r1, #0x344 + add r3, r0, #0x400 + mov r5, r2 + mov lr, #0x8000 + mov ip, #0x14 +_0600CA24: + mul r6, r2, ip + ldrh r0, [r3, r6] + add r6, r3, r6 + cmp r0, #0 + beq _0600CA94 + ldr r0, [r6, #8] + ldrh r6, [r0, #0xc] + tst r6, #0x4000 + beq _0600CA94 + ldrh r6, [r0, #4] + tst r6, #0xff + beq _0600CA94 + ldrh r6, [r0, #0xa] + add r7, r0, #0xc + add r6, r7, r6 + sub r6, r6, #7 + bic r7, r6, #1 + ldrh r6, [r7] + cmp r6, #0 + ldreqh r6, [r7, #2] + cmpeq r6, #0 + bne _0600CA94 + strh r5, [r0, #4] + strh r5, [r4] + strh lr, [r4] + ldrh r0, [r1, #0xba] + add r0, r0, #1 + strh r0, [r1, #0xba] +_0600CA94: + add r2, r2, #1 + cmp r2, #3 + blo _0600CA24 +_0600CAA0: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600CAA8: .word 0x04808010 +_0600CAAC: .word 0x0380FFF4 +_0600CAB0: .word 0x04808032 + arm_func_end WlIntrTxErr + + arm_func_start WlIntrRxCntup +WlIntrRxCntup: ; 0x0600CAB4 + stmdb sp!, {r3, lr} + ldr r1, _0600CC14 ; =0x0380FFF4 + ldr ip, _0600CC18 ; =0x04808010 + ldr r2, [r1] + mov r0, #4 + strh r0, [ip] + ldr r0, [r1] + add r1, ip, #0x198 + add r0, r0, #0x600 + ldrh r3, [r0, #0x90] + add r0, r2, #0xdc + add r2, r2, #0x2c + ldrh r1, [r1] + tst r3, #8 + add r0, r0, #0x400 + add r3, r2, #0x400 + beq _0600CBA4 + tst r1, #0x400 + beq _0600CBA4 + ldrh ip, [ip, #0xa0] + tst ip, #1 + ldrneh r2, [r3] + cmpne r2, #0 + bne _0600CB60 + tst ip, #4 + ldrneh r2, [r3, #0x14] + cmpne r2, #0 + bne _0600CB60 + tst ip, #8 + ldrneh r2, [r3, #0x28] + cmpne r2, #0 + bne _0600CB60 + ldr r2, _0600CC1C ; =0x0480819C + ldrh r2, [r2] + tst r2, #1 + bne _0600CB60 + ldr r3, _0600CC20 ; =0x04808032 + mov ip, #0 + strh ip, [r3] + mov r2, #0x8000 + strh r2, [r3] + strh ip, [r0, #2] + b _0600CBA4 +_0600CB60: + ldrh r3, [r0, #2] + add r2, r3, #1 + strh r2, [r0, #2] + cmp r3, #0xc + bls _0600CBA4 + ldr r3, _0600CC20 ; =0x04808032 + mov r2, #0 + strh r2, [r0, #2] + strh r2, [r3] + mov r2, #0x8000 + ldr r0, _0600CC14 ; =0x0380FFF4 + strh r2, [r3] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r2, [r0, #0xfe] + add r2, r2, #1 + strh r2, [r0, #0xfe] +_0600CBA4: + ldr r0, _0600CC14 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #1 + beq _0600CC0C + tst r1, #0x60 + beq _0600CC0C + ldr r2, _0600CC24 ; =0x04808054 + ldrh r1, [r2] + ldrh r0, [r2, #-2] + sub r0, r0, #0x4000 + add r0, r0, r0, lsr #31 + cmp r1, r0, asr #1 + bge _0600CBF4 + ldrh r0, [r2, #-4] + sub r0, r0, #0x4000 + add r0, r0, r0, lsr #31 + cmp r1, r0, asr #1 + bge _0600CC08 +_0600CBF4: + ldr r2, _0600CC28 ; =0x0480805A + ldr r0, _0600CC2C ; =0x00008001 + ldrh r1, [r2] + strh r1, [r2, #-4] + strh r0, [r2, #-0x2a] +_0600CC08: + bl WCheckTxBuf +_0600CC0C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600CC14: .word 0x0380FFF4 +_0600CC18: .word 0x04808010 +_0600CC1C: .word 0x0480819C +_0600CC20: .word 0x04808032 +_0600CC24: .word 0x04808054 +_0600CC28: .word 0x0480805A +_0600CC2C: .word 0x00008001 + arm_func_end WlIntrRxCntup + + arm_func_start WlIntrTxEnd +WlIntrTxEnd: ; 0x0600CC30 + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _0600CE78 ; =0x0380FFF4 + ldr r0, _0600CE7C ; =0x04808010 + ldr r2, [r3] + mov r1, #2 + strh r1, [r0] + ldr r3, [r3] + add r2, r2, #0x2c + add r3, r3, #0x300 + ldrh r3, [r3, #0x4c] + add r4, r2, #0x400 + cmp r3, #0x12 + bne _0600CC6C + bl IntrCarrierSuppresionSignal + b _0600CE70 +_0600CC6C: + ldrh r2, [r0, #0xa8] + and r5, r2, #0xf00 + cmp r5, #0x300 + beq _0600CC90 + cmp r5, #0x800 + beq _0600CCC4 + cmp r5, #0xb00 + beq _0600CD00 + b _0600CDFC +_0600CC90: + ldr r0, [r4, #0x8c] + tst r0, #2 + beq _0600CCA0 + bl SetParentTbttTxq +_0600CCA0: + ldr r1, _0600CE78 ; =0x0380FFF4 + mov r0, #0 + ldr r3, [r1] + mov r1, #8 + ldr r2, [r3, #0x558] + add r2, r2, #1 + str r2, [r3, #0x558] + bl AddTask + b _0600CDFC +_0600CCC4: + ldr r2, [r4, #0x44] + ldrh r3, [r4, #0x9e] + ldrh r2, [r2, #4] + and r2, r2, #0xff + mov r2, r2, lsl #0x10 + cmp r3, r2, lsr #16 + strlsh r1, [r0, #0x9c] + ldrlsh r0, [r4, #0xa8] + addls r0, r0, #1 + strlsh r0, [r4, #0xa8] + ldr r1, [r4, #0x90] + ldrh r0, [r1, #0x18] + add r0, r0, #1 + strh r0, [r1, #0x18] + b _0600CDFC +_0600CD00: + ldr r3, _0600CE80 ; =0x0000FFFF + ldr r2, _0600CE84 ; =0x04805F70 + ldr r1, _0600CE88 ; =0x0480824E + strh r3, [r2] + strh r3, [r2, #2] + add r0, r0, #0x23c + strh r3, [r0] + strh r3, [r1] + ldrh r0, [r4, #0x3c] + cmp r0, #0 + beq _0600CD58 + ldr r1, [r4, #0x44] + ldrh r0, [r1, #0x22] + cmp r0, r3 + bne _0600CD58 + ldrh r0, [r1, #4] + cmp r0, #0 + movne r0, #0 + strneh r0, [r1, #4] + ldrneh r1, [r4, #0x98] + ldrne r0, [r4, #0x44] + strneh r1, [r0, #2] +_0600CD58: + ldr r0, [r4, #0x44] + ldr r2, [r4, #0x90] + ldrh r1, [r0, #2] + ldrh r0, [r4, #0x98] + cmp r1, #1 + add r2, r2, #0x1a + bls _0600CDA8 + ldr r3, _0600CE78 ; =0x0380FFF4 + ldr r3, [r3] + add r3, r3, #0x300 + ldrh r3, [r3, #0x3a] + mov r3, r3, lsl #0x1b + movs r3, r3, lsr #0x1f + beq _0600CDA8 + ldr ip, _0600CE8C ; =0x0480819C + ldrh r3, [ip] + tst r3, #1 + ldreqh r3, [ip, #0xf4] + eoreq r3, r3, #1 + streqh r3, [ip, #0xf4] +_0600CDA8: + ldr r3, _0600CE78 ; =0x0380FFF4 + ldr r3, [r3] + add r3, r3, #0x600 + ldrh r3, [r3, #0x90] + tst r3, #0x40 + beq _0600CDFC + b _0600CDF4 +_0600CDC4: + mov r1, r1, lsl #0xf + mov r1, r1, lsr #0x10 + tst r1, #1 + ldrneh r3, [r2, #6] + mov r0, r0, lsl #0xf + addne r3, r3, #1 + mov r0, r0, lsr #0x10 + strneh r3, [r2, #6] + tst r0, #1 + ldrne r3, [r4, #0x90] + ldrneh r3, [r3, #0x16] + addne r2, r2, r3 +_0600CDF4: + cmp r1, #1 + bhi _0600CDC4 +_0600CDFC: + cmp r5, #0x800 + beq _0600CE64 + ldr r2, _0600CE90 ; =0x048080B0 + ldrh r0, [r2] + tst r0, #2 + bne _0600CE64 + ldrh r0, [r4, #0x3c] + cmp r0, #0 + beq _0600CE58 + mov r0, #2 + strh r0, [r2, #4] + mov r1, #0 + strh r1, [r2, #-0x68] + ldrh r1, [r2, #-0xa0] + tst r1, #0x1000 + ldrneh r0, [r4, #0xac] + addne r0, r0, #1 + strneh r0, [r4, #0xac] + bne _0600CE4C + bl WlIntrMpEnd +_0600CE4C: + ldrh r0, [r4, #0xaa] + add r0, r0, #1 + strh r0, [r4, #0xaa] +_0600CE58: + ldr r0, _0600CE94 ; =0x048080AE + mov r1, #2 + strh r1, [r0] +_0600CE64: + mov r0, #0 + mov r1, #0xe + bl AddTask +_0600CE70: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600CE78: .word 0x0380FFF4 +_0600CE7C: .word 0x04808010 +_0600CE80: .word 0x0000FFFF +_0600CE84: .word 0x04805F70 +_0600CE88: .word 0x0480824E +_0600CE8C: .word 0x0480819C +_0600CE90: .word 0x048080B0 +_0600CE94: .word 0x048080AE + arm_func_end WlIntrTxEnd + + arm_func_start WlIntrRxEnd +WlIntrRxEnd: ; 0x0600CE98 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x38 + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r2, _0600D32C ; =0x04808010 + ldr r3, [r0] + mov r1, #1 + add r0, r3, #0x600 + ldrh r4, [r0, #0x90] + add r6, r3, #0x344 + strh r1, [r2] + ldrh r1, [r6, #0xc] + add r0, r3, #0xdc + cmp r1, #0 + add r7, r0, #0x400 + ldreqh r0, [r2, #0x44] + and r4, r4, #1 + streqh r0, [r2, #0x4a] + ldr r0, _0600D330 ; =0x04808098 + sub fp, r0, #0x70 + add r0, r0, #0x1b4 + str r0, [sp, #0x24] + ldr r0, _0600D334 ; =0x0480824E + sub r0, r0, #0x154 + str r0, [sp, #0x14] + ldr r0, _0600D330 ; =0x04808098 + sub r0, r0, #0x44 + str r0, [sp, #0x10] + ldr r0, _0600D338 ; =0x000008EF + sub r0, r0, #0x29 + str r0, [sp, #0x28] + ldr r0, _0600D338 ; =0x000008EF + add r0, r0, #0x3d + str r0, [sp, #0x2c] + ldr r0, _0600D33C ; =0x04805F7E + sub r0, r0, #0x24 + str r0, [sp, #0x30] + ldr r0, _0600D338 ; =0x000008EF + add r0, r0, #0x710 + str r0, [sp, #0x34] +_0600CF34: + ldr r0, [sp, #0x10] + ldrh sb, [r7, #4] + ldrh sl, [r0] + cmp sb, sl + beq _0600D2A8 + ldr r0, _0600D330 ; =0x04808098 + ldr r1, [sp, #0x14] + ldrh r0, [r0, #0x60] + ldrh r3, [r1] + ldr r1, _0600D330 ; =0x04808098 + ldrh r2, [r1, #0x60] + ldr r1, [sp, #0x14] + cmp r0, r2 + ldrh r1, [r1] + movhi r0, r1, lsl #0xc + orrhi r0, r0, r2, lsr #4 + strhi r0, [sp, #4] + movls r1, r3, lsl #0xc + orrls r0, r1, r0, lsr #4 + strls r0, [sp, #4] + ldr r0, [sp, #0x28] + cmp sb, r0 + blo _0600CFA0 + ldr r0, _0600D338 ; =0x000008EF + cmp sb, r0 + bhi _0600CFA0 + bl WUpdateCounter +_0600CFA0: + mov r0, sb, lsl #1 + str r0, [sp, #0x18] + add r0, r0, #0x4000 + add r8, r0, #0x4800000 + add r0, r8, #2 + bl AdjustRingPointer + mov r5, r0 + add r0, r5, #2 + bl AdjustRingPointer + str r0, [sp, #0x1c] + add r0, r0, #4 + bl AdjustRingPointer + str r0, [sp, #0x20] + add r0, r8, #0xe + bl AdjustRingPointer + str r0, [sp, #0xc] + ldr r0, [sp, #0x18] + ldrh r1, [r5] + add r0, r0, #0x4800000 + add r0, r0, #0x4000 + mov r1, r1, lsl #1 + ldrh r2, [r0] + and r1, r1, #0x400 + orr r1, r2, r1 + strh r1, [r0] + ldr r1, [sp, #4] + ldr r0, [sp, #0x1c] + strh r1, [r0] + ldr r0, [sp, #0x20] + ldrh r1, [r0] + add r0, r1, sb, lsl #1 + add r0, r0, #0xf + mov r0, r0, lsr #2 + mov sb, r0, lsl #1 + cmp sb, #0xfb0 + ldrhsh r0, [r6, #0x9a] + subhs sb, sb, r0, lsr #1 + ldr r0, [sp, #0x2c] + cmp r1, r0 + bls _0600D05C + ldr r0, _0600D340 ; =0x0000FFFF + mov sb, sl + strh r0, [r8] + ldrh r0, [r6, #0xb4] + add r0, r0, #1 + strh r0, [r6, #0xb4] + b _0600D0E4 +_0600D05C: + cmp r4, #0 + cmpne sb, sl + beq _0600D0E4 + ldr r3, [sp, #0x30] + mov r2, sb, lsl #1 + add r0, r2, #0x4000 + add r0, r0, #0x4800000 + cmp r0, r3 + ldrloh r0, [r0, #6] + add r2, r2, #0x4800000 + add r2, r2, #0x4000 + ldrhsh r3, [r6, #0x9a] + andlo r0, r0, #0xff + subhs r0, r0, r3 + ldrh r2, [r2] + ldrhsh r0, [r0, #6] + tst r2, #0x7c00 + bne _0600D0BC + cmp r0, #0xa + cmpne r0, #0x14 + bne _0600D0BC + ldr r0, [sp, #0x34] + cmp r1, r0 + bls _0600D0E4 +_0600D0BC: + ldrh r0, [r6, #0xb4] + ldr r1, _0600D340 ; =0x0000FFFF + add r0, r0, #1 + strh r0, [r6, #0xb4] + mov r0, sl, lsl #0x10 + strh r1, [r8] + mov r0, r0, lsr #0x10 + strh r0, [r7, #4] + strh r0, [r5] + b _0600D2A8 +_0600D0E4: + ldrh r0, [r8] + and r0, r0, #0xf + cmp r0, #0xc + bne _0600D244 + add r0, r8, #0xc + bl AdjustRingPointer + ldrh r0, [r0] + str r0, [sp, #8] + add r0, r8, #0x22 + bl AdjustRingPointer + ldrh sl, [r0] + ldrh r0, [r7] + cmp r0, sl + bne _0600D148 + ldr r0, [sp, #8] + tst r0, #0x800 + beq _0600D148 + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r1, [r0] + ldr r0, [r1, #0x57c] + add r0, r0, #1 + str r0, [r1, #0x57c] + ldr r0, _0600D340 ; =0x0000FFFF + strh r0, [r8] + b _0600D21C +_0600D148: + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r0, [r0] + add r1, r0, #0x300 + ldrh r2, [r1, #0x3a] + mov r2, r2, lsl #0x18 + movs r2, r2, lsr #0x1f + ldreqh r1, [r1, #0x4c] + cmpeq r1, #0x40 + bne _0600D21C + ldrh r1, [fp] + cmp r1, #0 + beq _0600D1F4 + ldr r1, _0600D330 ; =0x04808098 + ldrh r1, [r1] + tst r1, #0x8000 + beq _0600D1F4 + add r0, r0, #0x660 + bl __VENEER_OS_CancelAlarm + ldr r0, [sp, #0xc] + mov r3, #0 + ldrh r1, [r0] + ldr r0, _0600D344 ; =0x000082EA + mov r2, #0x3e8 + umull ip, r8, r1, r0 + mov r0, r3 + mla r8, r1, r0, r8 + mov r0, ip, lsr #6 + ldr r1, _0600D344 ; =0x000082EA + mov ip, r3 + mla r8, ip, r1, r8 + mov r1, r8, lsr #6 + orr r0, r0, r8, lsl #26 + bl __VENEER__ll_udiv + mov r2, #0 + str r2, [sp] + mov r2, r1 + mov r1, r0 + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r3, _0600D348 ; =WClearKSID + ldr r0, [r0] + add r0, r0, #0x660 + bl __VENEER_OS_SetAlarm + b _0600D21C +_0600D1F4: + ldr r1, _0600D340 ; =0x0000FFFF + ldr r0, _0600D33C ; =0x04805F7E + mov sl, r1 + strh r1, [r0] + ldr r0, [sp, #0x24] + strh r1, [r0] + ldr r0, _0600D334 ; =0x0480824E + strh r1, [r0] + mov r0, r1 + strh r0, [r8] +_0600D21C: + strh sl, [r7] + bl CheckKeyTxEnd + tst r0, #1 + beq _0600D294 + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r1, [r0] + ldr r0, [r1, #0x5a8] + add r0, r0, #1 + str r0, [r1, #0x5a8] + b _0600D294 +_0600D244: + cmp r0, #0xd + bne _0600D294 + ldr r0, _0600D328 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x3a] + mov r1, r1, lsl #0x18 + movs r1, r1, lsr #0x1f + ldreqh r0, [r0, #0x4c] + cmpeq r0, #0x40 + bne _0600D294 + ldrh r0, [fp] + cmp r0, #0 + beq _0600D28C + ldr r0, _0600D330 ; =0x04808098 + ldrh r0, [r0] + tst r0, #0x8000 + bne _0600D294 +_0600D28C: + ldr r0, _0600D340 ; =0x0000FFFF + strh r0, [r8] +_0600D294: + mov r0, sb, lsl #0x10 + mov r0, r0, lsr #0x10 + strh r0, [r7, #4] + strh r0, [r5] + b _0600CF34 +_0600D2A8: + cmp r4, #0 + beq _0600D2FC + ldr r0, _0600D34C ; =0x04808054 + ldrh r4, [r0] + bl CheckKeyTxEnd + mov r0, r0, lsl #0x10 + movs r1, r0, lsr #0x10 + beq _0600D2FC + ldr r0, _0600D34C ; =0x04808054 + ldrh r0, [r0] + cmp r4, r0 + bne _0600D2FC + tst r1, #2 + beq _0600D2EC + mov r0, #0x80 + bl SetFatalErr + b _0600D2FC +_0600D2EC: + tst r1, #1 + beq _0600D2FC + mov r0, #0x100 + bl SetFatalErr +_0600D2FC: + ldr r0, _0600D350 ; =0x0480805A + ldrh r1, [r0] + ldrh r0, [r0, #-6] + cmp r1, r0 + beq _0600D31C + mov r0, #0 + mov r1, #0xf + bl AddTask +_0600D31C: + add sp, sp, #0x38 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0600D328: .word 0x0380FFF4 +_0600D32C: .word 0x04808010 +_0600D330: .word 0x04808098 +_0600D334: .word 0x0480824E +_0600D338: .word 0x000008EF +_0600D33C: .word 0x04805F7E +_0600D340: .word 0x0000FFFF +_0600D344: .word 0x000082EA +_0600D348: .word WClearKSID +_0600D34C: .word 0x04808054 +_0600D350: .word 0x0480805A + arm_func_end WlIntrRxEnd + + arm_func_start WlIntrMpEnd +WlIntrMpEnd: ; 0x0600D354 + stmdb sp!, {r3, lr} + ldr ip, _0600D438 ; =0x0380FFF4 + ldr r2, _0600D43C ; =0x04808010 + ldr r1, [ip] + mov r3, #0x1000 + add r1, r1, #0x2c + strh r3, [r2] + add r3, r1, #0x400 + ldrh r1, [r3, #0x3c] + cmp r1, #0 + beq _0600D430 + ldr r1, [ip] + add r1, r1, #0x600 + ldrh r1, [r1, #0x90] + tst r1, #0x10 + cmpne r0, #0 + beq _0600D424 + add r0, r2, #0x204 + ldrh r1, [r2, #0xa6] + ldrh r0, [r0] + cmp r0, #3 + cmpne r0, #5 + bne _0600D424 + cmp r1, #0 + bne _0600D424 + ldr r3, [r3, #0x44] + mov r2, #0 + ldrh r0, [r3, #2] + b _0600D3D8 +_0600D3C8: + and r1, r0, #1 + mov r0, r0, lsl #0xf + add r2, r2, r1 + mov r0, r0, lsr #0x10 +_0600D3D8: + cmp r0, #0 + bne _0600D3C8 + ldrh r0, [r3, #0x24] + ldrh r1, [r3, #0xa] + add r0, r0, #0xa + mul r0, r2, r0 + add r0, r0, #0xc0 + add r0, r0, r1, lsl #2 + mov r0, r0, lsl #0x10 + ldr r1, _0600D440 ; =MacBugTxMp + mov r0, r0, lsr #0x10 + bl SetupUsTimeOut + ldr r0, _0600D438 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x400 + ldrh r1, [r0] + add r1, r1, #1 + strh r1, [r0] + b _0600D430 +_0600D424: + mov r0, #0 + mov r1, #0x10 + bl AddTask +_0600D430: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600D438: .word 0x0380FFF4 +_0600D43C: .word 0x04808010 +_0600D440: .word MacBugTxMp + arm_func_end WlIntrMpEnd + + arm_func_start WlIntrStartTx +WlIntrStartTx: ; 0x0600D444 + stmdb sp!, {r3, lr} + ldr r3, _0600D540 ; =0x0380FFF4 + ldr r0, _0600D544 ; =0x04808010 + ldr r2, [r3] + mov r1, #0x80 + strh r1, [r0] + ldr r1, [r3] + add r2, r2, #0x2c + add r1, r1, #0x600 + ldrh r1, [r1, #0x90] + tst r1, #0x20 + beq _0600D4D8 + add r1, r0, #0x204 + ldrh r3, [r1] + add r1, r0, #0x258 + and r3, r3, #0xff + ldrh ip, [r1] + cmp r3, #3 + blo _0600D4D8 + cmp r3, #5 + bhi _0600D4D8 + ldr r3, [r2, #0x458] + ldr r1, _0600D548 ; =0x00000FFF + and r3, r1, r3, lsr #1 + cmp ip, r3 + blo _0600D4D8 + ldr r2, [r2, #0x430] + and r1, r1, r2, lsr #1 + cmp ip, r1 + bhi _0600D4D8 + add r1, r0, #0x234 + ldrh r0, [r1] + orr r0, r0, #0x80 + strh r0, [r1] + ldrh r0, [r1] + bic r0, r0, #0x80 + strh r0, [r1] +_0600D4D8: + ldr r1, _0600D54C ; =0x04808000 + ldrh r0, [r1] + cmp r0, #0x1440 + beq _0600D538 + add r0, r1, #0x19c + ldrh r0, [r0] + and r0, r0, #0x42 + cmp r0, #0x42 + bne _0600D538 + add r1, r1, #0x2b8 + ldrh r2, [r1] + cmp r2, #0 + beq _0600D538 + mov r3, #0 + b _0600D52C +_0600D514: + cmp r3, #0x3e8 + add r3, r3, #1 + bls _0600D52C + mov r0, #0x40 + bl SetFatalErr + b _0600D538 +_0600D52C: + ldrh r0, [r1] + cmp r2, r0 + beq _0600D514 +_0600D538: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600D540: .word 0x0380FFF4 +_0600D544: .word 0x04808010 +_0600D548: .word 0x00000FFF +_0600D54C: .word 0x04808000 + arm_func_end WlIntrStartTx + + arm_func_start WlIntrStartRx +WlIntrStartRx: ; 0x0600D550 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r2, _0600D7A4 ; =0x0380FFF4 + ldr r0, _0600D7A8 ; =0x04808010 + ldr r3, [r2] + mov r1, #0x40 + strh r1, [r0] + ldr r2, [r2] + add r1, r3, #0x2c + add r2, r2, #0x600 + ldrh r2, [r2, #0x90] + add r4, r3, #0x344 + tst r2, #0x20 + add r5, r1, #0x400 + beq _0600D79C + ldrh r2, [r5, #0xa4] + ldr r1, _0600D7AC ; =0x0000FFFF + cmp r2, r1 + addeq r2, r0, #0x18c + ldreqh r2, [r2] + andeq r2, r2, #3 + cmpeq r2, #3 + bne _0600D79C + add r2, r0, #0x258 + ldrh r3, [r2] + ldrh r2, [r0, #0x40] + sub r1, r1, #0xf000 + and r1, r1, r2, lsr #1 + cmp r3, r1 + blt _0600D79C + ldrh r7, [r0, #0x44] + mov r0, r7, lsl #1 + add r0, r0, #0x4000 + add r0, r0, #0x4800000 + add r0, r0, #8 + bl AdjustRingPointer + add r0, r0, #4 + bl AdjustRingPointer + ldrh r2, [r0] + ldr r1, _0600D7B0 ; =0x0000E7FF + and r1, r2, r1 + cmp r1, #0x228 + bne _0600D79C + add r0, r0, #2 + bl AdjustRingPointer + ldr r2, _0600D7B4 ; =0x048080F8 + ldrh r1, [r2] + sub r6, r1, #0x10000 + add r1, r2, #0x170 +_0600D610: + ldrh r3, [r1] + sub r3, r3, r7 + mov r3, r3, lsl #0x10 + mov r8, r3, lsr #0x10 + tst r8, #0x8000 + ldrneh r3, [r4, #0x9a] + addne r3, r8, r3, lsr #1 + movne r3, r3, lsl #0x10 + movne r8, r3, lsr #0x10 + cmp r8, #0xe + bhi _0600D658 + ldrh r3, [r2] + sub r3, r3, r6 + mov r3, r3, lsl #0x10 + mov r3, r3, lsr #0x10 + cmp r3, #0x40 + bhi _0600D79C + b _0600D610 +_0600D658: + add r0, r0, #8 + mov r8, #0 + b _0600D680 +_0600D664: + bl AdjustRingPointer + add r1, r4, r8, lsl #1 + ldrh r2, [r0], #2 + ldrh r1, [r1, #0x64] + cmp r2, r1 + bne _0600D79C + add r8, r8, #1 +_0600D680: + cmp r8, #3 + blo _0600D664 + add r0, r0, #0xa + bl AdjustRingPointer + ldr r3, _0600D7B4 ; =0x048080F8 + add r1, r3, #0x170 +_0600D698: + ldrh r2, [r1] + sub r2, r2, r7 + mov r2, r2, lsl #0x10 + mov r8, r2, lsr #0x10 + tst r8, #0x8000 + ldrneh r2, [r4, #0x9a] + addne r2, r8, r2, lsr #1 + movne r2, r2, lsl #0x10 + movne r8, r2, lsr #0x10 + cmp r8, #0x14 + bhi _0600D6E0 + ldrh r2, [r3] + sub r2, r2, r6 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + cmp r2, #0x70 + bhi _0600D79C + b _0600D698 +_0600D6E0: + ldr r2, _0600D7B8 ; =0x04808028 + ldrh r3, [r0] + ldrh r0, [r2] + mov r1, #1 + tst r3, r1, lsl r0 + bne _0600D79C + ldrh r1, [r2, #0x70] + mov r0, #0x40 + strh r1, [r5, #0xa4] + strh r0, [r2, #0x8c] + ldrh r0, [r4, #0xbe] + add r1, r2, #0x174 + add r0, r0, #1 + strh r0, [r4, #0xbe] +_0600D718: + ldrh r0, [r1] + and r0, r0, #3 + cmp r0, #3 + beq _0600D718 + ldr r0, _0600D7BC ; =0x04808244 + mov r2, #8 + ldrh r1, [r0] + sub r3, r0, #0x1c + orr r1, r1, #0x40 + strh r1, [r0] + ldrh r4, [r0] + ldr r1, _0600D7A4 ; =0x0380FFF4 + bic r4, r4, #0x40 + strh r4, [r0] + strh r2, [r3] + mov r2, #0 + strh r2, [r3] + ldr r1, [r1] + ldr r2, _0600D7AC ; =0x0000FFFF + add r1, r1, #0x2c + add r6, r1, #0x400 + ldrh r5, [r6, #0xa4] + cmp r5, r2 + beq _0600D79C + sub r4, r0, #0x1b0 + ldrh r3, [r4] + sub r1, r0, #0x214 + strh r5, [r4] + ldrh r0, [r1] + orr r0, r0, #0x80 + strh r0, [r1] + strh r3, [r4] + strh r2, [r6, #0xa4] +_0600D79C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600D7A4: .word 0x0380FFF4 +_0600D7A8: .word 0x04808010 +_0600D7AC: .word 0x0000FFFF +_0600D7B0: .word 0x0000E7FF +_0600D7B4: .word 0x048080F8 +_0600D7B8: .word 0x04808028 +_0600D7BC: .word 0x04808244 + arm_func_end WlIntrStartRx + + arm_func_start SetParentTbttTxq +SetParentTbttTxq: ; 0x0600D7C0 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0600D884 ; =0x0380FFF4 + mov r0, #2 + ldr r1, [r1] + mov r5, #0 + add r1, r1, #0x2c + add r4, r1, #0x400 + bl ResetTxqPri + mov r0, #1 + bl ResetTxqPri + mov r0, r5 + bl ResetTxqPri + ldrh r0, [r4, #0x28] + cmp r0, #0 + beq _0600D814 + ldr r0, [r4, #0x30] + ldrh r0, [r0] + cmp r0, #0 + movne r5, #1 + moveq r0, r5 + streqh r0, [r4, #0x28] +_0600D814: + ldrh r0, [r4, #0x14] + cmp r0, #0 + beq _0600D838 + ldr r0, [r4, #0x1c] + ldrh r0, [r0] + cmp r0, #0 + moveq r0, #0 + streqh r0, [r4, #0x14] + movne r5, #1 +_0600D838: + ldrh r0, [r4] + cmp r0, #0 + beq _0600D85C + ldr r0, [r4, #8] + ldrh r0, [r0] + cmp r0, #0 + moveq r0, #0 + streqh r0, [r4] + movne r5, #1 +_0600D85C: + cmp r5, #0 + beq _0600D870 + mov r0, #0 + mov r1, #0xe + bl AddTask +_0600D870: + mov r0, #0 + mov r1, #0x14 + bl AddTask + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600D884: .word 0x0380FFF4 + arm_func_end SetParentTbttTxq + + arm_func_start MacBugTxMp +MacBugTxMp: ; 0x0600D888 + stmdb sp!, {r4, lr} + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldr r2, _0600D8E8 ; =0x04808210 + mov r1, #0x1000 + ldrh r3, [r2] + mov r4, r0 + strh r1, [r2, #0x34] + mov r1, #0x64 + b _0600D8C0 +_0600D8B0: + ldrh r0, [r2] + cmp r3, r0 + bne _0600D8C8 + sub r1, r1, #1 +_0600D8C0: + cmp r1, #0 + bne _0600D8B0 +_0600D8C8: + ldr r1, _0600D8EC ; =0x04808244 + mov r0, #0 + strh r0, [r1] + bl WlIntrMpEnd + mov r0, r4 + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600D8E8: .word 0x04808210 +_0600D8EC: .word 0x04808244 + arm_func_end MacBugTxMp + + arm_func_start AdjustRingPointer +AdjustRingPointer: ; 0x0600D8F0 + ldr r1, _0600D910 ; =0x04805F60 + cmp r0, r1 + ldrhs r1, _0600D914 ; =0x0380FFF4 + ldrhs r1, [r1] + addhs r1, r1, #0x300 + ldrhsh r1, [r1, #0xde] + subhs r0, r0, r1 + bx lr + .align 2, 0 +_0600D910: .word 0x04805F60 +_0600D914: .word 0x0380FFF4 + arm_func_end AdjustRingPointer + + arm_func_start CheckKeyTxEnd +CheckKeyTxEnd: ; 0x0600D918 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0600D94C ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x2c + add r5, r0, #0x400 + add r0, r5, #0x50 + bl CheckKeyTxEndMain + mov r4, r0 + add r0, r5, #0x64 + bl CheckKeyTxEndMain + orr r0, r4, r0 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600D94C: .word 0x0380FFF4 + arm_func_end CheckKeyTxEnd + + arm_func_start CheckKeyTxEndMain +CheckKeyTxEndMain: ; 0x0600D950 + stmdb sp!, {r4, lr} + ldrh r1, [r0] + mov r4, #0 + cmp r1, #2 + bne _0600D990 + ldr r2, _0600D9C0 ; =0x04808094 + ldr r3, [r0, #8] + ldr r1, _0600D9C4 ; =0x00003FFF + ldrh r2, [r2] + and r1, r3, r1 + mov r1, r1, lsr #1 + orr r1, r1, #0x8000 + cmp r1, r2 + movne r1, #1 + strneh r1, [r0] + orrne r4, r4, #1 +_0600D990: + ldrh r1, [r0] + cmp r1, #1 + bne _0600D9B4 + ldr r1, [r0, #8] + ldrh r1, [r1] + tst r1, #1 + beq _0600D9B4 + bl TxEndKeyData + orr r4, r4, #2 +_0600D9B4: + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600D9C0: .word 0x04808094 +_0600D9C4: .word 0x00003FFF + arm_func_end CheckKeyTxEndMain + + arm_func_start InitializeIntr +InitializeIntr: ; 0x0600D9C8 + stmdb sp!, {r3, lr} + ldr r1, _0600D9E8 ; =WlIntr + mov r0, #0x1000000 + bl __VENEER_OS_SetIrqFunction + mov r0, #0x1000000 + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600D9E8: .word WlIntr + arm_func_end InitializeIntr + + arm_func_start __VENEER_OS_SetIrqFunction +__VENEER_OS_SetIrqFunction: ; 0x0600D9EC + ldr pc, _0600D9F0 ; =OS_SetIrqFunction + .align 2, 0 +_0600D9F0: .word OS_SetIrqFunction + arm_func_end __VENEER_OS_SetIrqFunction + + arm_func_start ReleaseIntr +ReleaseIntr: ; 0x0600D9F4 + stmdb sp!, {r3, lr} + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + mov r0, #0x1000000 + mov r1, #0 + bl __VENEER_OS_SetIrqFunction + ldmia sp!, {r3, lr} + bx lr + arm_func_end ReleaseIntr + + arm_func_start WlIntrTxBeaconTask +WlIntrTxBeaconTask: ; 0x0600DA14 + stmdb sp!, {r3, lr} + ldr r0, _0600DA5C ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0xe8] + cmp r0, #0 + beq _0600DA34 + bl UpdateGameInfoElement +_0600DA34: + ldr r0, _0600DA5C ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x3a] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + beq _0600DA54 + bl MLME_IssueBeaconSendIndication +_0600DA54: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600DA5C: .word 0x0380FFF4 + arm_func_end WlIntrTxBeaconTask + + arm_func_start WlIntrTxEndTask +WlIntrTxEndTask: ; 0x0600DA60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r7, _0600DC2C ; =0x0380FFF4 + mov sl, #2 + ldr r1, [r7] + mov fp, #0 + add r0, r1, #0x2c + add r8, r0, #0x400 + ldr r0, _0600DC30 ; =0x04808032 + add r6, r1, #0x344 + add r4, r0, #0x6e +_0600DA88: + mov r0, #0x14 + mov r5, sl, lsl #2 + mla sb, sl, r0, r8 + add r0, r5, #0x4800000 + add r0, r0, #0x8000 + ldrh r0, [r0, #0xa0] + tst r0, #0x8000 + bne _0600DC1C + ldrh r0, [sb] + cmp r0, #0 + beq _0600DC1C + ldr r1, [sb, #0xc] + cmp r1, #0 + beq _0600DBFC + ldr r0, [sb, #8] + ldrh r0, [r0] + strh r0, [r1, #8] + ldr r1, [sb, #8] + ldr r0, [sb, #0xc] + ldrh r1, [r1, #0xc] + strh r1, [r0, #0x14] + ldr r0, [sb, #8] + ldrh r1, [r0, #0xc] + tst r1, #0x4000 + beq _0600DBC8 + ldr r1, [r7] + add r1, r1, #0x600 + ldrh r1, [r1, #0x90] + tst r1, #8 + beq _0600DBAC + ldrh r1, [r0, #0xa] + add r2, r0, #0xc + add r1, r2, r1 + sub r1, r1, #7 + bic r2, r1, #1 + ldrh r1, [r2] + cmp r1, #0 + ldreqh r1, [r2, #2] + cmpeq r1, #0 + bne _0600DBAC + ldr r0, _0600DC30 ; =0x04808032 + mov r1, #0x8000 + strh fp, [r0] + strh r1, [r0] + ldrh r0, [r6, #0xba] + add r0, r0, #1 + strh r0, [r6, #0xba] + ldr r0, [sb, #0xc] + bl CheckFrameTimeout + cmp r0, #0 + beq _0600DB90 + ldr r2, [sb, #0xc] + mov r0, #2 + strh r0, [r2, #8] + ldrh r0, [sb, #4] + mov r1, #1 + add r0, r0, #1 + strh r0, [sb, #4] + ldrh r0, [r8, #0xae] + add r0, r0, #1 + strh r0, [r8, #0xae] + ldr r0, [sb, #0xc] + ldr r2, [sb, #0x10] + mov lr, pc + bx r2 + b _0600DC1C +_0600DB90: + ldr r1, [sb, #0xc] + mov r0, #0 + strh r0, [r1, #0xc] + ldrh r0, [r5, r4] + orr r0, r0, #0x8000 + strh r0, [r5, r4] + b _0600DC1C +_0600DBAC: + ldrh r0, [r0, #4] + ldr r2, [sb, #0xc] + and r0, r0, #0xff + ldrh r1, [r2, #0xc] + add r0, r1, r0 + strh r0, [r2, #0xc] + b _0600DBD8 +_0600DBC8: + ldrh r1, [r0, #4] + ldr r0, [sb, #0xc] + and r1, r1, #0xff + strh r1, [r0, #0xc] +_0600DBD8: + ldrh r0, [sb, #4] + mov r1, #2 + add r0, r0, #1 + strh r0, [sb, #4] + ldr r0, [sb, #0xc] + ldr r2, [sb, #0x10] + mov lr, pc + bx r2 + b _0600DC1C +_0600DBFC: + ldrh r0, [sb, #4] + mov r1, #3 + add r0, r0, #1 + strh r0, [sb, #4] + ldr r0, [sb, #8] + ldr r2, [sb, #0x10] + mov lr, pc + bx r2 +_0600DC1C: + subs sl, sl, #1 + bpl _0600DA88 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0600DC2C: .word 0x0380FFF4 +_0600DC30: .word 0x04808032 + arm_func_end WlIntrTxEndTask + + arm_func_start WlIntrRxEndTask +WlIntrRxEndTask: ; 0x0600DC34 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r0, _0600DF84 ; =0x0380FFF4 + ldr r4, [r0] + add r0, r4, #0xdc + add r5, r0, #0x400 +_0600DC48: + ldr r1, _0600DF88 ; =0x0480805A + ldrh r0, [r5, #4] + ldrh r6, [r1] + cmp r6, r0 + beq _0600DF7C + ldr r0, _0600DF8C ; =0x000008C6 + cmp r6, r0 + blo _0600DC6C + bl WUpdateCounter +_0600DC6C: + mov r6, r6, lsl #1 + add r0, r6, #0x4000 + add r7, r0, #0x4800000 + add r0, r7, #2 + bl AdjustRingPointer + add r1, r6, #0x4800000 + add r1, r1, #0x4000 + ldrh r2, [r1] + ldr r1, _0600DF90 ; =0x0000FFFF + ldrh r6, [r0] + cmp r2, r1 + ldreq r0, _0600DF88 ; =0x0480805A + streqh r6, [r0] + beq _0600DC48 + add r0, r7, #8 + bl AdjustRingPointer + ldrh r1, [r0] + mov r0, r7 + bl TakeoutRxFrame + ldr r1, _0600DF88 ; =0x0480805A + movs r8, r0 + strh r6, [r1] + bne _0600DCF0 + ldrh r0, [r7] + and r0, r0, #0xf + cmp r0, #0xc + bne _0600DCE4 + mov r0, #0x10 + bl SetFatalErr + b _0600DC48 +_0600DCE4: + mov r0, #8 + bl SetFatalErr + b _0600DC48 +_0600DCF0: + ldr r0, _0600DF84 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #8 + beq _0600DD18 + ldrh r0, [r8, #0x14] + tst r0, #0x4000 + movne r0, #0 + strneh r0, [r5, #2] +_0600DD18: + ldrh r0, [r8, #8] + mov r6, #1 + tst r0, #0x200 + beq _0600DD70 + ldrh r0, [r8, #0x14] + mov r0, r0, lsl #0x15 + mov r0, r0, lsr #0x1f + cmp r0, #1 + beq _0600DD4C + ldrh r0, [r8, #0x2a] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + beq _0600DF1C +_0600DD4C: + add r0, r4, #0x188 + add r1, r4, #0x1e8 + sub r2, r8, #0x10 + mov r6, #0 + bl MoveHeapBuf + mov r0, #2 + mov r1, #9 + bl AddTask + b _0600DF1C +_0600DD70: + and r0, r0, #0xf + cmp r0, #0xf + addls pc, pc, r0, lsl #2 + b _0600DF1C +_0600DD80: ; jump table + b _0600DE0C ; case 0 + b _0600DDF4 ; case 1 + b _0600DF1C ; case 2 + b _0600DF1C ; case 3 + b _0600DF1C ; case 4 + b _0600DE3C ; case 5 + b _0600DF1C ; case 6 + b _0600DF1C ; case 7 + b _0600DDC0 ; case 8 + b _0600DF1C ; case 9 + b _0600DF1C ; case 10 + b _0600DF1C ; case 11 + b _0600DE94 ; case 12 + b _0600DEE8 ; case 13 + b _0600DE74 ; case 14 + b _0600DE74 ; case 15 +_0600DDC0: + ldrh r0, [r8, #0x14] + and r0, r0, #0xf + cmp r0, #8 + bne _0600DF1C + add r0, r4, #0x188 + add r1, r4, #0x1c4 + sub r2, r8, #0x10 + mov r6, #0 + bl MoveHeapBuf + mov r0, #2 + mov r1, #6 + bl AddTask + b _0600DF1C +_0600DDF4: + ldrh r0, [r8, #0x14] + cmp r0, #0x80 + bne _0600DF1C + mov r0, r8 + bl RxBeaconFrame + b _0600DF1C +_0600DE0C: + ldrh r0, [r8, #0x14] + tst r0, #0xf + bne _0600DF1C + add r0, r4, #0x188 + add r1, r4, #0x1dc + sub r2, r8, #0x10 + mov r6, #0 + bl MoveHeapBuf + mov r0, #1 + mov r1, #7 + bl AddTask + b _0600DF1C +_0600DE3C: + ldrh r1, [r8, #0x14] + rsb r0, r6, #0xe800 + and r0, r1, r0 + cmp r0, #0xa4 + bne _0600DF1C + add r0, r4, #0x188 + add r1, r4, #0x1dc + sub r2, r8, #0x10 + mov r6, #0 + bl MoveHeapBuf + mov r0, #1 + mov r1, #7 + bl AddTask + b _0600DF1C +_0600DE74: + ldrh r1, [r8, #0x14] + ldr r0, _0600DF94 ; =0x0000E7BF + and r0, r1, r0 + cmp r0, #0x118 + bne _0600DF1C + mov r0, r8 + bl RxKeyDataFrame + b _0600DF1C +_0600DE94: + ldrh r1, [r8, #0x14] + rsb r0, r6, #0xe800 + and r0, r1, r0 + cmp r0, #0x228 + bne _0600DF1C + ldr r0, _0600DF84 ; =0x0380FFF4 + ldr r1, _0600DF84 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x54] + cmp r0, #0 + ldreq r0, _0600DF98 ; =0x0480803C + streqh r6, [r0] + ldr r2, [r1] + mov r0, r8 + ldr r1, [r2, #0x5ac] + add r1, r1, #1 + str r1, [r2, #0x5ac] + bl RxMpFrame + mov r6, r0 + b _0600DF1C +_0600DEE8: + ldrh r1, [r8, #0x14] + rsb r0, r6, #0xe800 + and r0, r1, r0 + cmp r0, #0x218 + bne _0600DF1C + ldr r1, _0600DF84 ; =0x0380FFF4 + mov r0, r8 + ldr r2, [r1] + ldr r1, [r2, #0x5b0] + add r1, r1, #1 + str r1, [r2, #0x5b0] + bl RxMpAckFrame + mov r6, r0 +_0600DF1C: + cmp r6, #0 + beq _0600DF30 + add r0, r4, #0x188 + sub r1, r8, #0x10 + bl ReleaseHeapBuf +_0600DF30: + ldr r3, _0600DF84 ; =0x0380FFF4 + ldr r0, [r3] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #1 + beq _0600DC48 + ldr r2, _0600DF90 ; =0x0000FFFF + ldr r1, _0600DF9C ; =0x04805F60 + mov r6, #0 +_0600DF54: + cmp r7, r1 + ldrhs r0, [r3] + add r6, r6, #1 + addhs r0, r0, #0x300 + ldrhsh r0, [r0, #0xde] + subhs r7, r7, r0 + cmp r6, #7 + strh r2, [r7], #2 + blo _0600DF54 + b _0600DC48 +_0600DF7C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600DF84: .word 0x0380FFF4 +_0600DF88: .word 0x0480805A +_0600DF8C: .word 0x000008C6 +_0600DF90: .word 0x0000FFFF +_0600DF94: .word 0x0000E7BF +_0600DF98: .word 0x0480803C +_0600DF9C: .word 0x04805F60 + arm_func_end WlIntrRxEndTask + + arm_func_start WlIntrMpEndTask +WlIntrMpEndTask: ; 0x0600DFA0 + stmdb sp!, {r4, lr} + ldr r0, _0600E078 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x2c + add r4, r0, #0x400 + ldrh r0, [r4, #0x3c] + cmp r0, #0 + beq _0600E070 + ldr r1, [r4, #0x90] + ldr r0, [r4, #0x44] + ldrh r1, [r1, #0x10] + ldrh r0, [r0, #2] + cmp r1, r0 + beq _0600DFDC + bl WlIntrRxEndTask +_0600DFDC: + ldr r0, [r4, #0x44] + ldrh r0, [r0, #4] + ands r2, r0, #0xff + ldr r0, _0600E078 ; =0x0380FFF4 + ldrne r1, [r0] + ldrne r0, [r1, #0x5a0] + addne r0, r0, r2 + ldreq r1, [r0] + ldreq r0, [r1, #0x5a0] + addeq r0, r0, #1 + str r0, [r1, #0x5a0] + ldrh r1, [r4, #0x40] + ldr r0, _0600E078 ; =0x0380FFF4 + add r1, r1, #1 + strh r1, [r4, #0x40] + ldr ip, [r4, #0x90] + ldr r1, [r4, #0x44] + ldrh r3, [ip, #0x10] + ldrh r2, [r1, #2] + mov r1, #0 + eor r2, r3, r2 + strh r2, [ip, #0x12] + ldr r2, [r4, #0x90] + ldrh r2, [r2, #0x10] + strh r2, [r4, #0xa0] + strh r1, [r4, #0x3c] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0xea] + cmp r0, #0 + beq _0600E05C + bl WDisableTmpttPowerSave +_0600E05C: + ldr r0, _0600E078 ; =0x0380FFF4 + ldr r1, [r4, #0x90] + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect +_0600E070: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600E078: .word 0x0380FFF4 + arm_func_end WlIntrMpEndTask + + arm_func_start SetParentTbttTxqTask +SetParentTbttTxqTask: ; 0x0600E07C + stmdb sp!, {r4, lr} + ldr r0, _0600E130 ; =0x0380FFF4 + ldr r2, _0600E134 ; =0x04808088 + ldr r1, [r0] + ldrh r0, [r2] + add r4, r1, #0x17c + cmp r0, #0 + bne _0600E0BC + ldrh r0, [r4, #0x38] + cmp r0, #0 + beq _0600E0BC + mov r1, #8 + mov r0, #2 + strh r1, [r2, #0x26] + bl TxqPri + b _0600E128 +_0600E0BC: + add r0, r1, #0x500 + ldrh r1, [r0, #0x32] + ldrh r2, [r0, #0x2e] + mvn r0, r1 + tst r2, r0 + bne _0600E0F4 + ldr r0, _0600E138 ; =0x048080AE + mov r1, #8 + strh r1, [r0] + ldrh r0, [r4, #0x38] + cmp r0, #0 + beq _0600E0F4 + mov r0, #2 + bl TxqPri +_0600E0F4: + ldr r0, _0600E138 ; =0x048080AE + mov r1, #5 + strh r1, [r0] + ldrh r0, [r4, #0x2c] + cmp r0, #0 + beq _0600E114 + mov r0, #1 + bl TxqPri +_0600E114: + ldrh r0, [r4, #0x20] + cmp r0, #0 + beq _0600E128 + mov r0, #0 + bl TxqPri +_0600E128: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600E130: .word 0x0380FFF4 +_0600E134: .word 0x04808088 +_0600E138: .word 0x048080AE + arm_func_end SetParentTbttTxqTask + + arm_func_start TakeoutRxFrame +TakeoutRxFrame: ; 0x0600E13C + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _0600E1A8 ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r2] + mov r6, r0 + add r0, r1, #0x188 + add r1, r5, #0x22 + bl AllocateHeapBuf + movs r4, r0 + moveq r0, #0 + beq _0600E1A0 + mov r1, r6 + add r0, r4, #0x18 + add r2, r5, #0xc + bl DMA_Read + sub r0, r5, #0x18 + strh r0, [r4, #0x16] + ldrh r0, [r4, #0x22] + ldrh r1, [r4, #0x1e] + and r0, r0, #0xff + and r1, r1, #0xff + mov r0, r0, lsl #0x10 + orr r0, r1, r0, lsr #8 + strh r0, [r4, #0x1e] + add r0, r4, #0x10 +_0600E1A0: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600E1A8: .word 0x0380FFF4 + arm_func_end TakeoutRxFrame + + arm_func_start CAM_Search +CAM_Search: ; 0x0600E1AC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldrh r0, [r8] + tst r0, #1 + movne r0, #0 + bne _0600E248 + ldr r4, _0600E250 ; =0x0380FFF4 + ldr r0, [r4] + add r1, r0, #0x500 + ldrh r1, [r1, #0x2c] + cmp r1, #1 + bls _0600E244 + ldr r1, [r0, #0x31c] + mov r7, #0 + add r5, r1, #0x1c + mov r6, #1 + b _0600E234 +_0600E1F0: + ldrh r1, [r5] + cmp r1, #0 + beq _0600E22C + mov r1, r8 + add r0, r5, #4 + bl MatchMacAdrs + cmp r0, #0 + movne r0, r6 + bne _0600E248 + ldr r0, [r4] + add r7, r7, #1 + add r1, r0, #0x500 + ldrh r1, [r1, #0x2c] + cmp r7, r1 + bhs _0600E244 +_0600E22C: + add r6, r6, #1 + add r5, r5, #0x1c +_0600E234: + add r1, r0, #0x300 + ldrh r1, [r1, #0x22] + cmp r6, r1 + blo _0600E1F0 +_0600E244: + mov r0, #0xff +_0600E248: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600E250: .word 0x0380FFF4 + arm_func_end CAM_Search + + arm_func_start CAM_SearchAdd +CAM_SearchAdd: ; 0x0600E254 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r5, _0600E390 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r5] + ldrh r1, [r4] + add r6, r0, #0x31c + tst r1, #1 + movne r0, #0 + bne _0600E388 + add r1, r0, #0x500 + ldrh r1, [r1, #0x2c] + mov r8, #1 + cmp r1, #1 + bls _0600E304 + ldr r1, [r6] + mov sl, #0 + mov sb, sl + add r7, r1, #0x1c + b _0600E2F0 +_0600E2A0: + ldrh r1, [r7] + cmp r1, #0 + beq _0600E2E0 + mov r1, r4 + add r0, r7, #4 + bl MatchMacAdrs + cmp r0, #0 + movne r0, r8 + bne _0600E388 + ldr r0, [r5] + add sb, sb, #1 + add r1, r0, #0x500 + ldrh r1, [r1, #0x2c] + cmp sb, r1 + bhs _0600E2FC + b _0600E2E8 +_0600E2E0: + cmp sl, #0 + moveq sl, r8 +_0600E2E8: + add r8, r8, #1 + add r7, r7, #0x1c +_0600E2F0: + ldrh r1, [r6, #6] + cmp r8, r1 + blo _0600E2A0 +_0600E2FC: + cmp sl, #0 + movne r8, sl +_0600E304: + add r0, r0, #0x300 + ldrh r0, [r0, #0x22] + cmp r8, r0 + blo _0600E378 + ldr r7, [r6] + ldrh r5, [r6, #6] + mov r3, #0x10000 + mov r6, #1 + mov r8, #0 + mov r0, #0x1c + b _0600E364 +_0600E330: + mul r2, r6, r0 + ldrh r1, [r7, r2] + add r2, r7, r2 + cmp r1, #0x30 + bhs _0600E360 + ldrh r1, [r2, #0x16] + cmp r1, #0 + bne _0600E360 + ldrh r1, [r2, #0x18] + cmp r3, r1 + movhi r3, r1 + movhi r8, r6 +_0600E360: + add r6, r6, #1 +_0600E364: + cmp r6, r5 + blo _0600E330 + cmp r8, #0 + moveq r0, #0xff + beq _0600E388 +_0600E378: + mov r0, r8 + mov r1, r4 + bl CAM_InitElement + mov r0, r8 +_0600E388: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0600E390: .word 0x0380FFF4 + arm_func_end CAM_SearchAdd + + arm_func_start CAM_AddBcFrame +CAM_AddBcFrame: ; 0x0600E394 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _0600E3EC ; =0x0380FFF4 + mov r7, r0 + ldr r2, [r2] + mov r0, #0x1000000 + add r4, r2, #0x1ac + mov r6, r1 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r4, #8] + mov r5, r0 + cmp r1, #0 + bne _0600E3CC + mov r0, #0 + bl CAM_SetTIMElementBitmap +_0600E3CC: + mov r0, r7 + mov r1, r4 + mov r2, r6 + bl MoveHeapBuf + mov r0, r5 + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600E3EC: .word 0x0380FFF4 + arm_func_end CAM_AddBcFrame + + arm_func_start CAM_IncFrameCount +CAM_IncFrameCount: ; 0x0600E3F0 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _0600E47C ; =0x0380FFF4 + ldrh r5, [r0, #2] + ldr r0, [r1] + mov r1, #0x1c + ldr r2, [r0, #0x31c] + mov r0, #0x1000000 + mla r6, r5, r1, r2 + bl __VENEER_OS_DisableIrqMask + ldr r1, _0600E47C ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + ldreqh r0, [r6, #0x16] + cmpeq r0, #0 + bne _0600E440 + mov r0, r5 + bl CAM_SetTIMElementBitmap +_0600E440: + ldrh r1, [r6, #0x16] + mov r0, r4 + add r1, r1, #1 + strh r1, [r6, #0x16] + bl __VENEER_OS_EnableIrqMask + ldr r0, _0600E47C ; =0x0380FFF4 + mov r1, #1 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r0, [r0, #0x34] + tst r0, r1, lsl r5 + ldreqh r0, [r6, #0x1a] + streqh r0, [r6, #0x18] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600E47C: .word 0x0380FFF4 + arm_func_end CAM_IncFrameCount + + arm_func_start CAM_DecFrameCount +CAM_DecFrameCount: ; 0x0600E480 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _0600E4EC ; =0x0380FFF4 + ldrh r5, [r0, #2] + ldr r0, [r1] + mov r1, #0x1c + ldr r2, [r0, #0x31c] + mov r0, #0x1000000 + mla r6, r5, r1, r2 + bl __VENEER_OS_DisableIrqMask + ldr r1, _0600E4EC ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + ldreqh r0, [r6, #0x16] + cmpeq r0, #1 + bne _0600E4D0 + mov r0, r5 + bl CAM_ClrTIMElementBitmap +_0600E4D0: + ldrh r1, [r6, #0x16] + mov r0, r4 + sub r1, r1, #1 + strh r1, [r6, #0x16] + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600E4EC: .word 0x0380FFF4 + arm_func_end CAM_DecFrameCount + + arm_func_start CAM_SetStaState +CAM_SetStaState: ; 0x0600E4F0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r0, #0x1000000 + mov r5, r1 + bl __VENEER_OS_DisableIrqMask + ldr r3, _0600E5D4 ; =0x0380FFF4 + mov r4, r0 + cmp r5, #0x40 + bhs _0600E570 + ldr r0, [r3] + mov r2, #1 + add r0, r0, #0x500 + ldrh r1, [r0, #0x30] + orr r1, r1, r2, lsl r6 + strh r1, [r0, #0x30] + ldr r0, [r3] + add r0, r0, #0x500 + ldrh r1, [r0, #0x32] + orr r1, r1, r2, lsl r6 + strh r1, [r0, #0x32] + ldr r0, [r3] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + bne _0600E5AC + mov r0, r6 + bl CAM_GetAID + cmp r0, #0 + beq _0600E5AC + mov r0, r6 + bl CAM_ReleaseAID + b _0600E5AC +_0600E570: + ldr r2, [r3] + mov r0, #1 + mvn r1, r0, lsl r6 + add r0, r2, #0x500 + ldrh r2, [r0, #0x32] + and r1, r2, r1 + strh r1, [r0, #0x32] + ldr r0, [r3] + add r0, r0, #0x500 + ldrh r0, [r0, #0x2e] + mov r0, r0, asr r6 + tst r0, #1 + beq _0600E5AC + mov r0, r6 + bl CAM_SetDoze +_0600E5AC: + ldr r1, _0600E5D4 ; =0x0380FFF4 + mov r0, #0x1c + ldr r2, [r1] + mul r1, r6, r0 + ldr r2, [r2, #0x31c] + mov r0, r4 + strh r5, [r2, r1] + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600E5D4: .word 0x0380FFF4 + arm_func_end CAM_SetStaState + + arm_func_start CAM_SetRSSI +CAM_SetRSSI: ; 0x0600E5D8 + ldr r3, _0600E5F4 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r3] + ldr r3, [r3, #0x31c] + mla r2, r0, r2, r3 + strh r1, [r2, #0xa] + bx lr + .align 2, 0 +_0600E5F4: .word 0x0380FFF4 + arm_func_end CAM_SetRSSI + + arm_func_start CAM_SetPowerMgtMode +CAM_SetPowerMgtMode: ; 0x0600E5F8 + ldr r3, _0600E648 ; =0x0380FFF4 + mov r2, #1 + ldr ip, [r3] + mvn r3, r2, lsl r0 + add r2, ip, #0x12c + add ip, r2, #0x400 + ldrh r2, [ip, #2] + and r2, r2, r3 + orr r0, r2, r1, lsl r0 + strh r0, [ip, #2] + ldrh r0, [ip, #6] + ldrh r1, [ip, #2] + mvn r0, r0 + tst r1, r0 + ldrne r0, _0600E64C ; =0x048080AC + mov r1, #8 + strneh r1, [r0] + ldreq r0, _0600E650 ; =0x048080AE + streqh r1, [r0] + bx lr + .align 2, 0 +_0600E648: .word 0x0380FFF4 +_0600E64C: .word 0x048080AC +_0600E650: .word 0x048080AE + arm_func_end CAM_SetPowerMgtMode + + arm_func_start CAM_SetDoze +CAM_SetDoze: ; 0x0600E654 + stmdb sp!, {r4, lr} + mov r4, r0 + bl CAM_GetStaState + cmp r0, #0x40 + bne _0600E688 + ldr r1, _0600E690 ; =0x0380FFF4 + mov r0, #1 + ldr r2, [r1] + mvn r1, r0, lsl r4 + add r0, r2, #0x500 + ldrh r2, [r0, #0x30] + and r1, r2, r1 + strh r1, [r0, #0x30] +_0600E688: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600E690: .word 0x0380FFF4 + arm_func_end CAM_SetDoze + + arm_func_start CAM_SetAwake +CAM_SetAwake: ; 0x0600E694 + ldr r1, _0600E6B4 ; =0x0380FFF4 + mov r2, #1 + ldr r1, [r1] + add r1, r1, #0x500 + ldrh r3, [r1, #0x30] + orr r0, r3, r2, lsl r0 + strh r0, [r1, #0x30] + bx lr + .align 2, 0 +_0600E6B4: .word 0x0380FFF4 + arm_func_end CAM_SetAwake + + arm_func_start CAM_SetCapaInfo +CAM_SetCapaInfo: ; 0x0600E6B8 + ldr r3, _0600E6D4 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r3] + ldr r3, [r3, #0x31c] + mla r2, r0, r2, r3 + strh r1, [r2, #0xc] + bx lr + .align 2, 0 +_0600E6D4: .word 0x0380FFF4 + arm_func_end CAM_SetCapaInfo + + arm_func_start CAM_SetSupRate +CAM_SetSupRate: ; 0x0600E6D8 + ldr r3, _0600E6F4 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r3] + ldr r3, [r3, #0x31c] + mla r2, r0, r2, r3 + strh r1, [r2, #0x10] + bx lr + .align 2, 0 +_0600E6F4: .word 0x0380FFF4 + arm_func_end CAM_SetSupRate + + arm_func_start CAM_SetLastSeqCtrl +CAM_SetLastSeqCtrl: ; 0x0600E6F8 + ldr r3, _0600E714 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r3] + ldr r3, [r3, #0x31c] + mla r2, r0, r2, r3 + strh r1, [r2, #0x14] + bx lr + .align 2, 0 +_0600E714: .word 0x0380FFF4 + arm_func_end CAM_SetLastSeqCtrl + + arm_func_start CAM_SetAuthSeed +CAM_SetAuthSeed: ; 0x0600E718 + ldr r3, _0600E734 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r3] + ldr r3, [r3, #0x31c] + mla r2, r0, r2, r3 + strh r1, [r2, #0xe] + bx lr + .align 2, 0 +_0600E734: .word 0x0380FFF4 + arm_func_end CAM_SetAuthSeed + + arm_func_start CAM_UpdateLifeTime +CAM_UpdateLifeTime: ; 0x0600E738 + ldr r2, _0600E758 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #0x1a] + strh r0, [r1, #0x18] + bx lr + .align 2, 0 +_0600E758: .word 0x0380FFF4 + arm_func_end CAM_UpdateLifeTime + + arm_func_start CAM_AllocateAID +CAM_AllocateAID: ; 0x0600E75C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _0600E808 ; =0x0380FFF4 + mov r7, r0 + ldr r1, [r1] + mov r0, #0x1000000 + add r1, r1, #0x12c + add r4, r1, #0x400 + bl __VENEER_OS_DisableIrqMask + mov r6, r0 + mov r5, #1 + mov r1, #2 + b _0600E7EC +_0600E78C: + ldrh r0, [r4, #0xe] + tst r0, r1 + bne _0600E7E4 + orr r0, r0, r1 + strh r0, [r4, #0xe] + ldrh r0, [r4, #0xc] + add r0, r0, #1 + strh r0, [r4, #0xc] + ldrh r0, [r4, #0xc] + cmp r0, #1 + bne _0600E7BC + bl WEnableTmpttPowerSave +_0600E7BC: + ldr r0, _0600E808 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r0] + mov r0, r6 + ldr r2, [r2, #0x31c] + mla r1, r7, r1, r2 + strh r5, [r1, #2] + bl __VENEER_OS_EnableIrqMask + mov r0, r5 + b _0600E800 +_0600E7E4: + add r5, r5, #1 + mov r1, r1, lsl #1 +_0600E7EC: + cmp r5, #0x10 + blo _0600E78C + mov r0, r6 + bl __VENEER_OS_EnableIrqMask + mov r0, #0 +_0600E800: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600E808: .word 0x0380FFF4 + arm_func_end CAM_AllocateAID + + arm_func_start CAM_ReleaseAID +CAM_ReleaseAID: ; 0x0600E80C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0600E888 ; =0x0380FFF4 + mov r5, r0 + ldr r4, [r1] + bl CAM_ClrTIMElementBitmap + mov r0, r5 + bl CAM_GetAID + cmp r0, #0 + beq _0600E880 + ldr r1, _0600E888 ; =0x0380FFF4 + mov r2, #1 + ldr r3, [r1] + mov r1, #0x1c + ldr r3, [r3, #0x31c] + mov ip, #0 + mla r1, r5, r1, r3 + strh ip, [r1, #2] + add r1, r4, #0x500 + ldrh r3, [r1, #0x3a] + mvn r0, r2, lsl r0 + and r0, r3, r0 + strh r0, [r1, #0x3a] + ldrh r0, [r1, #0x38] + sub r0, r0, #1 + strh r0, [r1, #0x38] + ldrh r0, [r1, #0x38] + cmp r0, #0 + bne _0600E880 + bl WDisableTmpttPowerSave +_0600E880: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600E888: .word 0x0380FFF4 + arm_func_end CAM_ReleaseAID + + arm_func_start CAM_GetStaState +CAM_GetStaState: ; 0x0600E88C + ldr r2, _0600E8A8 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + mul r1, r0, r1 + ldr r0, [r2, #0x31c] + ldrh r0, [r0, r1] + bx lr + .align 2, 0 +_0600E8A8: .word 0x0380FFF4 + arm_func_end CAM_GetStaState + + arm_func_start CAM_IsActive +CAM_IsActive: ; 0x0600E8AC + ldr r1, _0600E8C8 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x500 + ldrh r1, [r1, #0x30] + mov r0, r1, asr r0 + and r0, r0, #1 + bx lr + .align 2, 0 +_0600E8C8: .word 0x0380FFF4 + arm_func_end CAM_IsActive + + arm_func_start CAM_GetPowerMgtMode +CAM_GetPowerMgtMode: ; 0x0600E8CC + ldr r1, _0600E8E8 ; =0x0380FFF4 + ldr r1, [r1] + add r1, r1, #0x500 + ldrh r1, [r1, #0x2e] + mov r0, r1, asr r0 + and r0, r0, #1 + bx lr + .align 2, 0 +_0600E8E8: .word 0x0380FFF4 + arm_func_end CAM_GetPowerMgtMode + + arm_func_start CAM_GetMacAdrs +CAM_GetMacAdrs: ; 0x0600E8EC + ldr r2, _0600E908 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + add r0, r1, #4 + bx lr + .align 2, 0 +_0600E908: .word 0x0380FFF4 + arm_func_end CAM_GetMacAdrs + + arm_func_start CAM_GetAuthSeed +CAM_GetAuthSeed: ; 0x0600E90C + ldr r2, _0600E928 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #0xe] + bx lr + .align 2, 0 +_0600E928: .word 0x0380FFF4 + arm_func_end CAM_GetAuthSeed + + arm_func_start CAM_GetLastSeqCtrl +CAM_GetLastSeqCtrl: ; 0x0600E92C + ldr r2, _0600E948 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #0x14] + bx lr + .align 2, 0 +_0600E948: .word 0x0380FFF4 + arm_func_end CAM_GetLastSeqCtrl + + arm_func_start CAM_GetTxRate +CAM_GetTxRate: ; 0x0600E94C + ldr r2, _0600E974 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #0x10] + tst r0, #2 + movne r0, #0x14 + moveq r0, #0xa + bx lr + .align 2, 0 +_0600E974: .word 0x0380FFF4 + arm_func_end CAM_GetTxRate + + arm_func_start CAM_GetAID +CAM_GetAID: ; 0x0600E978 + ldr r2, _0600E994 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #2] + bx lr + .align 2, 0 +_0600E994: .word 0x0380FFF4 + arm_func_end CAM_GetAID + + arm_func_start CAM_GetFrameCount +CAM_GetFrameCount: ; 0x0600E998 + ldr r2, _0600E9B4 ; =0x0380FFF4 + mov r1, #0x1c + ldr r2, [r2] + ldr r2, [r2, #0x31c] + mla r1, r0, r1, r2 + ldrh r0, [r1, #0x16] + bx lr + .align 2, 0 +_0600E9B4: .word 0x0380FFF4 + arm_func_end CAM_GetFrameCount + + arm_func_start CAM_SetTIMElementBitmap +CAM_SetTIMElementBitmap: ; 0x0600E9B8 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl CAM_GetStaState + cmp r0, #0x40 + bne _0600EA64 + ldr r0, _0600EA6C ; =0x0380FFF4 + mov r1, #1 + ldr r2, [r0] + add r0, r2, #0x500 + ldrh r0, [r0, #0x34] + tst r0, r1, lsl r5 + bne _0600EA64 + add r0, r2, #0x300 + ldrh r2, [r0, #0xd8] + ldr r1, _0600EA70 ; =0x0480425C + mov r0, #0x1000000 + add r6, r2, r1 + bl __VENEER_OS_DisableIrqMask + mov r4, r0 + cmp r5, #0 + bne _0600EA28 + add r0, r6, #4 + bl WL_ReadByte + orr r1, r0, #1 + add r0, r6, #4 + and r1, r1, #0xff + bl WL_WriteByte + b _0600EA5C +_0600EA28: + mov r0, r5 + bl CAM_GetAID + mov r5, r0 + add r0, r6, #5 + add r6, r0, r5, lsr #3 + mov r0, r6 + bl WL_ReadByte + and r1, r5, #7 + mov r2, #1 + orr r1, r0, r2, lsl r1 + mov r0, r6 + and r1, r1, #0xff + bl WL_WriteByte +_0600EA5C: + mov r0, r4 + bl __VENEER_OS_EnableIrqMask +_0600EA64: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600EA6C: .word 0x0380FFF4 +_0600EA70: .word 0x0480425C + arm_func_end CAM_SetTIMElementBitmap + + arm_func_start CAM_ClrTIMElementBitmap +CAM_ClrTIMElementBitmap: ; 0x0600EA74 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + bl CAM_GetStaState + cmp r0, #0x40 + bne _0600EB10 + ldr r0, _0600EB18 ; =0x0380FFF4 + ldr r2, _0600EB1C ; =0x0480425C + ldr r1, [r0] + mov r0, #0x1000000 + add r1, r1, #0x300 + ldrh r1, [r1, #0xd8] + add r6, r1, r2 + bl __VENEER_OS_DisableIrqMask + mov r4, r0 + cmp r5, #0 + bne _0600EAD0 + add r0, r6, #4 + bl WL_ReadByte + and r1, r0, #0xfe + add r0, r6, #4 + and r1, r1, #0xff + bl WL_WriteByte + b _0600EB08 +_0600EAD0: + mov r0, r5 + bl CAM_GetAID + mov r5, r0 + add r0, r6, #5 + add r6, r0, r5, lsr #3 + mov r0, r6 + bl WL_ReadByte + and r1, r5, #7 + mov r2, #1 + mvn r1, r2, lsl r1 + and r1, r1, r0 + mov r0, r6 + and r1, r1, #0xff + bl WL_WriteByte +_0600EB08: + mov r0, r4 + bl __VENEER_OS_EnableIrqMask +_0600EB10: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600EB18: .word 0x0380FFF4 +_0600EB1C: .word 0x0480425C + arm_func_end CAM_ClrTIMElementBitmap + + arm_func_start CAM_TimerTask +CAM_TimerTask: ; 0x0600EB20 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr fp, _0600ECD0 ; =0x0380FFF4 + mov sb, #0 + ldr r2, [fp] + mov r8, #1 + ldr r1, [r2, #0x31c] + add r0, r2, #0x500 + ldrh sl, [r0, #0x2c] + add r0, r2, #0x12c + add r7, r1, #0x1c + add r5, r0, #0x400 + add r4, r2, #0x300 + b _0600ECBC +_0600EB54: + ldrh r0, [r7] + cmp r0, #0 + beq _0600ECAC + ldrh r1, [r7, #0x18] + cmp r1, #0 + ldrne r0, _0600ECD4 ; =0x0000FFFF + cmpne r1, r0 + beq _0600ECA8 + sub r0, r1, #1 + strh r0, [r7, #0x18] + ldrh r0, [r7, #0x18] + cmp r0, #0 + bne _0600ECA8 + ldrh r0, [r7] + cmp r0, #0x20 + blo _0600EC94 + mov r0, r8 + bl CAM_GetStaState + mov r6, r0 + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + mov r0, r8 + bl DeleteTxFrames + ldrh r0, [r4, #0x50] + cmp r0, #1 + bne _0600EC44 + cmp r6, #0x20 + bls _0600EC94 + ldr r1, [fp] + mov r0, r8, lsl #0x10 + add r3, r1, #0x500 + ldrh r6, [r3, #0x34] + mov r2, #1 + orr r2, r6, r2, lsl r8 + strh r2, [r3, #0x34] + mov r0, r0, lsr #0x10 + mov r1, #0 + bl CAM_SetPowerMgtMode + ldr r1, [fp] + add r0, r7, #4 + add r3, r1, #0x500 + mov r1, #1 + ldrh r6, [r3, #0x30] + mov r2, r1 + orr r2, r6, r2, lsl r8 + strh r2, [r3, #0x30] + mov r2, #0 + bl MakeDeAuthFrame + cmp r0, #0 + mov r1, #1 + beq _0600EC38 + strh r1, [r0] + bl TxManCtrlFrame + add sb, sb, #1 + b _0600ECB4 +_0600EC38: + add r0, r7, #4 + bl MLME_IssueDeAuthIndication + b _0600EC94 +_0600EC44: + ldrh r0, [r4, #0xcc] + cmp r8, r0 + bne _0600EC94 + add r0, r7, #4 + mov r1, #1 + mov r2, #0 + bl MakeDeAuthFrame + cmp r0, #0 + beq _0600EC7C + mov r1, #1 + strh r1, [r0] + bl TxManCtrlFrame + add sb, sb, #1 + b _0600ECB4 +_0600EC7C: + mov r0, #0x20 + bl WSetStaState + bl WClearAids + add r0, r7, #4 + mov r1, #1 + bl MLME_IssueDeAuthIndication +_0600EC94: + mov r0, #0 + strh r0, [r7] + ldrh r0, [r5] + sub r0, r0, #1 + strh r0, [r5] +_0600ECA8: + add sb, sb, #1 +_0600ECAC: + cmp sb, sl + bhs _0600ECC8 +_0600ECB4: + add r8, r8, #1 + add r7, r7, #0x1c +_0600ECBC: + ldrh r0, [r4, #0x22] + cmp r8, r0 + blo _0600EB54 +_0600ECC8: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0600ECD0: .word 0x0380FFF4 +_0600ECD4: .word 0x0000FFFF + arm_func_end CAM_TimerTask + + arm_func_start CAM_Delete +CAM_Delete: ; 0x0600ECD8 + stmdb sp!, {r4, lr} + mov r4, r0 + bl DeleteTxFrames + ldr r2, _0600ED1C ; =0x0380FFF4 + mov r0, #0x1c + ldr r1, [r2] + mul r0, r4, r0 + ldr r1, [r1, #0x31c] + mov r3, #0 + strh r3, [r1, r0] + ldr r0, [r2] + add r0, r0, #0x500 + ldrh r1, [r0, #0x2c] + sub r1, r1, #1 + strh r1, [r0, #0x2c] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600ED1C: .word 0x0380FFF4 + arm_func_end CAM_Delete + + arm_func_start InitializeCAM +InitializeCAM: ; 0x0600ED20 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0600EDB0 ; =0x0380FFF4 + mov r2, #0x1c + ldr r3, [r0] + mov r0, #0 + add r1, r3, #0x300 + ldrh r5, [r1, #0x22] + ldr r4, [r3, #0x31c] + mul r2, r5, r2 + mov r1, r4 + bl __VENEER_MIi_CpuClear16 + ldr r1, _0600EDB0 ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + mov r2, #0x10 + add r1, r1, #0x12c + add r1, r1, #0x400 + bl __VENEER_MIi_CpuClear16 + ldr r2, _0600EDB4 ; =0x0000FFFF + mov r3, #1 + strh r2, [r4, #0x1a] + mov r0, #0x1c + b _0600ED88 +_0600ED7C: + mla r1, r3, r0, r4 + strh r2, [r1, #0x1a] + add r3, r3, #1 +_0600ED88: + cmp r3, r5 + blo _0600ED7C + ldr r1, _0600EDB8 ; =BC_ADRS + mov r0, #0 + bl CAM_InitElement + mov r0, #0 + mov r1, #0x40 + bl CAM_SetStaState + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600EDB0: .word 0x0380FFF4 +_0600EDB4: .word 0x0000FFFF +_0600EDB8: .word BC_ADRS + arm_func_end InitializeCAM + + arm_func_start InitCAM +InitCAM: ; 0x0600EDBC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _0600EE3C ; =0x0380FFF4 + mov r6, #1 + ldr r2, [r0] + mov sl, #0 + add r1, r2, #0x300 + add r0, r2, #0x12c + ldr r4, [r2, #0x31c] + ldrh r7, [r1, #0x22] + add r5, r0, #0x400 + mov sb, #0x1a + mov r8, #0x1c + b _0600EE04 +_0600EDF0: + mla r1, r6, r8, r4 + mov r0, sl + mov r2, sb + bl __VENEER_MIi_CpuClear16 + add r6, r6, #1 +_0600EE04: + cmp r6, r7 + blo _0600EDF0 + mov r2, #1 + strh r2, [r5] + mov r1, #0 + strh r1, [r5, #2] + ldr r0, _0600EE40 ; =0x0000FFFE + strh r2, [r5, #4] + strh r0, [r5, #6] + strh r1, [r5, #0xc] + strh r1, [r5, #8] + strh r2, [r5, #0xe] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_0600EE3C: .word 0x0380FFF4 +_0600EE40: .word 0x0000FFFE + arm_func_end InitCAM + + arm_func_start CAM_InitElement +CAM_InitElement: ; 0x0600EE44 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _0600EF20 ; =0x0380FFF4 + mov r7, r0 + ldr r4, [r2] + mov r0, #0x1c + mul r2, r7, r0 + ldr r3, [r4, #0x31c] + mov r6, r1 + ldrh r0, [r3, r2] + add r5, r3, r2 + cmp r0, #0 + addeq r0, r4, #0x500 + ldreqh r1, [r0, #0x2c] + mov r2, #0x1a + addeq r1, r1, #1 + streqh r1, [r0, #0x2c] + mov r1, r5 + mov r0, #0 + bl __VENEER_MIi_CpuClear16 + ldr r0, _0600EF20 ; =0x0380FFF4 + mov r4, #1 + ldr r1, [r0] + mov r0, r7, lsl #0x10 + add r2, r1, #0x500 + ldrh r3, [r2, #0x34] + mvn r1, r4, lsl r7 + and r3, r3, r1 + mov r0, r0, lsr #0x10 + mov r1, #0 + strh r3, [r2, #0x34] + bl CAM_SetPowerMgtMode + ldr r0, _0600EF20 ; =0x0380FFF4 + mov r1, r6 + ldr r2, [r0] + add r0, r5, #4 + add r2, r2, #0x500 + ldrh r3, [r2, #0x30] + orr r3, r3, r4, lsl r7 + strh r3, [r2, #0x30] + bl WSetMacAdrs1 + ldr r2, _0600EF24 ; =0x0000FFFF + mov r0, r7, lsl #0x10 + ldr r1, _0600EF20 ; =0x0380FFF4 + strh r2, [r5, #0x14] + ldr r1, [r1] + mov r0, r0, lsr #0x10 + add r1, r1, #0x300 + ldrh r2, [r1, #0xa6] + mov r1, #0x20 + strh r2, [r5, #0x10] + ldrh r2, [r5, #0x1a] + strh r2, [r5, #0x18] + bl CAM_SetStaState + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600EF20: .word 0x0380FFF4 +_0600EF24: .word 0x0000FFFF + arm_func_end CAM_InitElement + + arm_func_start WaitLoop_Rxpe +WaitLoop_Rxpe: ; 0x0600EF28 + ldr r1, _0600EF50 ; =0x0480819C + mov r2, #0xfa0 + b _0600EF44 +_0600EF34: + ldrh r0, [r1] + tst r0, #0x80 + bxne lr + sub r2, r2, #1 +_0600EF44: + cmp r2, #0 + bne _0600EF34 + bx lr + .align 2, 0 +_0600EF50: .word 0x0480819C + arm_func_end WaitLoop_Rxpe + + arm_func_start WaitLoop_Waitus +WaitLoop_Waitus: ; 0x0600EF54 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr r2, _0600EFD4 ; =0x000082EA + mov r3, #0 + umull lr, ip, r0, r2 + mla ip, r0, r3, ip + mov r0, r3 + mla ip, r0, r2, ip + mov r0, lr, lsr #6 + mov r4, #1 + mov r5, r1 + mov r1, ip, lsr #6 + orr r0, r0, ip, lsl #26 + mov r2, #0x3e8 + str r4, [sp, #4] + bl __VENEER__ll_udiv + add r3, sp, #4 + str r3, [sp] + ldr r2, _0600EFD8 ; =0x0380FFF4 + mov r3, r5 + ldr r2, [r2] + add ip, r2, #0x234 + mov r2, r1 + mov r1, r0 + add r0, ip, #0x400 + bl __VENEER_OS_SetAlarm +_0600EFBC: + ldr r0, [sp, #4] + cmp r0, #0 + bne _0600EFBC + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600EFD4: .word 0x000082EA +_0600EFD8: .word 0x0380FFF4 + arm_func_end WaitLoop_Waitus + + arm_func_start WaitLoop_ClrAid +WaitLoop_ClrAid: ; 0x0600EFDC + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0600F040 ; =0x04808028 + ldr lr, _0600F044 ; =0x04000208 + mov r5, #1 + add r2, r1, #0x1ec + add r3, r1, #0x174 + mov ip, #0 + b _0600F030 +_0600EFFC: + ldrh r4, [lr] + strh ip, [lr] + ldrh r0, [r3] + and r0, r0, #3 + cmp r0, #3 + ldrneh r0, [r2] + cmpne r0, #5 + cmpne r0, #7 + cmpne r0, #8 + strneh ip, [r1] + ldrh r0, [lr] + movne r5, ip + strh r4, [lr] +_0600F030: + cmp r5, #0 + bne _0600EFFC + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600F040: .word 0x04808028 +_0600F044: .word 0x04000208 + arm_func_end WaitLoop_ClrAid + + arm_func_start WaitLoop_BbpAccess +WaitLoop_BbpAccess: ; 0x0600F048 + ldr r1, _0600F078 ; =0x0480815E + mov r2, #0 + b _0600F068 +_0600F054: + ldrh r0, [r1] + tst r0, #1 + moveq r0, #0 + bxeq lr + add r2, r2, #1 +_0600F068: + cmp r2, #0x2800 + blo _0600F054 + mov r0, #1 + bx lr + .align 2, 0 +_0600F078: .word 0x0480815E + arm_func_end WaitLoop_BbpAccess + + arm_func_start WaitLoop_RfAccess +WaitLoop_RfAccess: ; 0x0600F07C + ldr r1, _0600F0AC ; =0x04808180 + mov r2, #0 + b _0600F09C +_0600F088: + ldrh r0, [r1] + tst r0, #1 + moveq r0, #0 + bxeq lr + add r2, r2, #1 +_0600F09C: + cmp r2, #0x2800 + blo _0600F088 + mov r0, #1 + bx lr + .align 2, 0 +_0600F0AC: .word 0x04808180 + arm_func_end WaitLoop_RfAccess + + arm_func_start RequestCmdTask +RequestCmdTask: ; 0x0600F0B0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _0600F360 ; =0x0380FFF4 + mov r3, #0 + ldr r2, [r4] + mov r6, r3 + add r0, r2, #0x24 + add r5, r0, #0x400 + ldrh r0, [r5, #4] + cmp r0, #0 + bne _0600F358 + ldr r0, [r2, #0x200] + sub r2, r3, #1 + str r0, [r5] + cmp r0, r2 + beq _0600F358 + ldr r2, [r4] + ldrh r4, [r0, #0xe] + add ip, r2, #0x300 + ldrh r2, [ip, #0x3e] + add r4, r0, r4, lsl #1 + cmp r2, #0 + movne r0, #1 + strneh r0, [r4, #0x12] + movne r0, #6 + strneh r0, [r4, #0x14] + bne _0600F310 + ldrh r7, [r0, #0xc] + ldrh r2, [r4, #0x10] + cmp r7, r2 + movne r0, #0xd + strneh r0, [r4, #0x14] + bne _0600F310 + and r2, r7, #0xff00 + cmp r2, #0x100 + bgt _0600F14C + bge _0600F198 + cmp r2, #0 + beq _0600F168 + b _0600F278 +_0600F14C: + cmp r2, #0x200 + bgt _0600F15C + beq _0600F1B8 + b _0600F278 +_0600F15C: + cmp r2, #0x300 + beq _0600F264 + b _0600F278 +_0600F168: + ldrh r6, [r5, #4] + ldr r1, _0600F364 ; =WlibCmdTbl_MLME + tst r6, #1 + and r2, r7, #0xff + mov r6, #1 + mov lr, #0xb + movne r3, #2 + bne _0600F280 + ldrh r7, [ip, #0x4c] + cmp r7, #0x20 + movlo r3, r6 + b _0600F280 +_0600F198: + ldrh r6, [ip, #0x4c] + ldr r1, _0600F368 ; =WlibCmdTbl_MA + cmp r6, #0x40 + and r2, r7, #0xff + mov r6, #2 + mov lr, #5 + movne r3, #1 + b _0600F280 +_0600F1B8: + and r2, r7, #0xff + cmp r2, #0x40 + bhs _0600F1E0 + ldrh r1, [ip, #0x4c] + mov r6, #4 + cmp r1, #0x10 + ldr r1, _0600F36C ; =WlibCmdTbl_PARAMSET + movlo r3, #1 + mov lr, #0x17 + b _0600F280 +_0600F1E0: + cmp r2, #0x80 + bhs _0600F210 + ldrh r1, [ip, #0x4c] + mov r6, #8 + cmp r1, #0x40 + sub r1, r2, #0x40 + mov r2, r1, lsl #0x10 + ldr r1, _0600F370 ; =WlibCmdTbl_PARAMSET2 + movne r3, #1 + mov r2, r2, lsr #0x10 + mov lr, #6 + b _0600F280 +_0600F210: + ldrh r1, [ip, #0x4c] + cmp r2, #0xc0 + bhs _0600F240 + cmp r1, #0x10 + sub r1, r2, #0x80 + mov r2, r1, lsl #0x10 + ldr r1, _0600F374 ; =WlibCmdTbl_PARAMGET + movlo r3, #1 + mov r2, r2, lsr #0x10 + mov r6, #0x10 + mov lr, #0x17 + b _0600F280 +_0600F240: + cmp r1, #0x10 + sub r1, r2, #0xc0 + mov r2, r1, lsl #0x10 + ldr r1, _0600F378 ; =WlibCmdTbl_PARAMGET2 + movlo r3, #1 + mov r2, r2, lsr #0x10 + mov r6, #0x20 + mov lr, #6 + b _0600F280 +_0600F264: + ldr r1, _0600F37C ; =WlibCmdTbl_DEV + and r2, r7, #0xff + mov r6, #0x40 + mov lr, #0xb + b _0600F280 +_0600F278: + mov r2, #1 + mov lr, #0 +_0600F280: + cmp r2, lr + movhi r3, #3 + bhi _0600F2B0 + mov lr, r2, lsl #3 + ldrh r7, [r0, #0xe] + ldrh ip, [r1, lr] + cmp r7, ip + addhs ip, r1, lr + ldrhsh lr, [r4, #0x12] + ldrhsh ip, [ip, #2] + cmphs lr, ip + movlo r3, #4 +_0600F2B0: + cmp r3, #0 + movne r0, #1 + strneh r0, [r4, #0x12] + strneh r3, [r4, #0x14] + bne _0600F310 + ldrh r3, [r5, #4] + add r1, r1, r2, lsl #3 + orr r2, r3, r6 + strh r2, [r5, #4] + ldr r2, [r1, #4] + add r1, r4, #0x10 + mov lr, pc + bx r2 + strh r0, [r4, #0x14] + ldrh r0, [r4, #0x14] + cmp r0, #0x80 + beq _0600F358 + cmp r0, #0x81 + bne _0600F310 + ldrh r1, [r5, #4] + mvn r0, r6 + and r0, r1, r0 + strh r0, [r5, #4] + b _0600F334 +_0600F310: + ldrh r1, [r5, #4] + mvn r0, r6 + and r0, r1, r0 + strh r0, [r5, #4] + ldr r0, _0600F360 ; =0x0380FFF4 + ldr r1, [r5] + ldr r0, [r0] + add r0, r0, #0x200 + bl SendMessageToWmDirect +_0600F334: + ldr r0, _0600F360 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x200 + ldrh r0, [r0, #8] + cmp r0, #0 + beq _0600F358 + mov r0, #2 + mov r1, #0xb + bl AddTask +_0600F358: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600F360: .word 0x0380FFF4 +_0600F364: .word WlibCmdTbl_MLME +_0600F368: .word WlibCmdTbl_MA +_0600F36C: .word WlibCmdTbl_PARAMSET +_0600F370: .word WlibCmdTbl_PARAMSET2 +_0600F374: .word WlibCmdTbl_PARAMGET +_0600F378: .word WlibCmdTbl_PARAMGET2 +_0600F37C: .word WlibCmdTbl_DEV + arm_func_end RequestCmdTask + + arm_func_start CMD_ReservedReqCmd +CMD_ReservedReqCmd: ; 0x0600F380 + mov r0, #3 + bx lr + arm_func_end CMD_ReservedReqCmd + + arm_func_start SendMessageToWmDirect +SendMessageToWmDirect: ; 0x0600F388 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0600F40C ; =0x0380FFF4 + mov r5, r0 + ldr r3, [r2] + mov r4, r1 + add r2, r3, #0x100 + ldrh r2, [r2, #0xfc] + cmp r2, #0 + beq _0600F3C8 + mov r2, r4 + add r1, r3, #0x1f4 + bl MoveHeapBuf + mov r0, #2 + mov r1, #0x13 + bl AddTask + b _0600F404 +_0600F3C8: + ldr r0, [r3, #0x304] + mov r2, #0 + bl __VENEER_OS_SendMessage + cmp r0, #0 + beq _0600F3EC + mov r0, r5 + mov r1, r4 + bl DeleteHeapBuf + b _0600F404 +_0600F3EC: + ldr r1, _0600F40C ; =0x0380FFF4 + mov r0, r5 + ldr r1, [r1] + mov r2, r4 + add r1, r1, #0x1f4 + bl MoveHeapBuf +_0600F404: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0600F40C: .word 0x0380FFF4 + arm_func_end SendMessageToWmDirect + + arm_func_start SendMessageToWmTask +SendMessageToWmTask: ; 0x0600F410 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r6, _0600F46C ; =0x0380FFF4 + mov r5, #0 + ldr r0, [r6] + mvn r4, #0 + ldr r7, [r0, #0x1f4] + b _0600F45C +_0600F42C: + ldr r0, [r0, #0x304] + mov r1, r7 + mov r2, r5 + bl __VENEER_OS_SendMessage + cmp r0, #0 + beq _0600F464 + ldr r0, [r6] + mov r1, r7 + add r0, r0, #0x1f4 + bl DeleteHeapBuf + ldr r0, [r6] + ldr r7, [r0, #0x1f4] +_0600F45C: + cmp r7, r4 + bne _0600F42C +_0600F464: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600F46C: .word 0x0380FFF4 + arm_func_end SendMessageToWmTask + + arm_func_start InitializeCmdIf +InitializeCmdIf: ; 0x0600F470 + ldr r0, _0600F488 ; =0x0380FFF4 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x400 + strh r1, [r0, #0x28] + bx lr + .align 2, 0 +_0600F488: .word 0x0380FFF4 + arm_func_end InitializeCmdIf + + arm_func_start MLME_ResetReqCmd +MLME_ResetReqCmd: ; 0x0600F48C + stmdb sp!, {r4, lr} + mov r2, #1 + strh r2, [r1, #2] + mov r4, r0 + ldrh r0, [r4, #0x10] + cmp r0, #1 + movhi r0, #5 + bhi _0600F4C4 + bl WStop + ldrh r0, [r4, #0x10] + cmp r0, #1 + bne _0600F4C0 + bl WInitCounter +_0600F4C0: + mov r0, #0 +_0600F4C4: + ldmia sp!, {r4, lr} + bx lr + arm_func_end MLME_ResetReqCmd + + arm_func_start MLME_PwrMgtReqCmd +MLME_PwrMgtReqCmd: ; 0x0600F4CC + stmdb sp!, {r4, lr} + mov r2, #9 + strh r2, [r1, #2] + mov r4, r0 + ldrh r0, [r4, #0x10] + cmp r0, #1 + movhi r0, #5 + bhi _0600F568 + ldrh r1, [r4, #0x12] + cmp r1, #1 + movhi r0, #5 + bhi _0600F568 + ldrh r1, [r4, #0x14] + cmp r1, #1 + movhi r0, #5 + bhi _0600F568 + bl WSetPowerMgtMode + ldrh r0, [r4, #0x10] + cmp r0, #1 + bne _0600F554 + ldrh r0, [r4, #0x12] + cmp r0, #1 + bne _0600F534 + ldr r0, _0600F570 ; =0x00008001 + bl WSetForcePowerState + b _0600F53C +_0600F534: + mov r0, #0 + bl WSetForcePowerState +_0600F53C: + ldr r0, _0600F574 ; =0x0380FFF4 + ldrh r1, [r4, #0x14] + ldr r0, [r0] + add r0, r0, #0x300 + strh r1, [r0, #0x58] + b _0600F564 +_0600F554: + mov r0, #0x8000 + bl WSetForcePowerState + mov r0, #2 + bl WSetPowerState +_0600F564: + mov r0, #0 +_0600F568: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0600F570: .word 0x00008001 +_0600F574: .word 0x0380FFF4 + arm_func_end MLME_PwrMgtReqCmd + + arm_func_start MLME_ScanReqCmd +MLME_ScanReqCmd: ; 0x0600F578 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r2, _0600F6B4 ; =0x0380FFF4 + mov r5, r1 + ldr r3, [r2] + ldrh r2, [r5, #2] + add r1, r3, #4 + add r4, r1, #0x400 + sub r1, r2, #3 + strh r1, [r4, #4] + mov r1, #3 + strh r1, [r5, #2] + add r1, r3, #0x300 + ldrh r1, [r1, #0x2e] + mov r6, r0 + cmp r1, #1 + cmpne r1, #3 + cmpne r1, #2 + movne r0, #0xb + bne _0600F6AC + ldr r0, _0600F6B4 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0x20 + movlo r0, #1 + blo _0600F6AC + ldrh r0, [r6, #0x16] + cmp r0, #0x20 + movhi r0, #5 + bhi _0600F6AC + ldrh r0, [r6, #0x38] + cmp r0, #1 + movhi r0, #5 + bhi _0600F6AC + add r0, r6, #0x3a + bl WL_ReadByte + cmp r0, #0 + moveq r0, #5 + beq _0600F6AC + ldrh r0, [r6, #0x4a] + cmp r0, #0x3e8 + movhi r0, #5 + bhi _0600F6AC + cmp r0, #0xa + movlo r0, #5 + blo _0600F6AC + ldrh r0, [r6, #0x4c] + cmp r0, #0x10 + movhi r0, #5 + bhi _0600F6AC + mov r8, #0 + add r7, r6, #0x3a + b _0600F670 +_0600F64C: + add r0, r7, r8 + bl WL_ReadByte + cmp r0, #0 + beq _0600F678 + bl CheckEnableChannel + cmp r0, #0 + moveq r0, #5 + beq _0600F6AC + add r8, r8, #1 +_0600F670: + cmp r8, #0x10 + blo _0600F64C +_0600F678: + add r0, r6, #0x10 + bl WSetBssid + ldrh r0, [r6, #0x16] + add r1, r6, #0x18 + bl WSetSsid + str r6, [r4, #0x18] + str r5, [r4, #0x1c] + mov r2, #0x10 + mov r0, #2 + mov r1, #0 + strh r2, [r4] + bl AddTask + mov r0, #0x80 +_0600F6AC: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600F6B4: .word 0x0380FFF4 + arm_func_end MLME_ScanReqCmd + + arm_func_start MLME_JoinReqCmd +MLME_JoinReqCmd: ; 0x0600F6B8 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _0600F868 ; =0x0380FFF4 + mov r5, r1 + ldr r3, [r2] + mov r1, #5 + strh r1, [r5, #2] + add r1, r3, #0x300 + ldrh r2, [r1, #0x2e] + add r1, r3, #4 + mov r6, r0 + cmp r2, #3 + add r0, r3, #0x344 + cmpne r2, #2 + add r4, r1, #0x400 + movne r0, #0xb + bne _0600F860 + ldrh r0, [r0, #8] + cmp r0, #0x20 + movlo r0, #1 + blo _0600F860 + mov r0, #0x20 + bl WSetStaState + ldrh r0, [r6, #0x18] + tst r0, #1 + movne r0, #5 + bne _0600F860 + ldrh r0, [r6, #0x1e] + cmp r0, #0 + moveq r0, #5 + beq _0600F860 + cmp r0, #0x20 + movhi r0, #5 + bhi _0600F860 + ldrh r0, [r6, #0x46] + cmp r0, #0xa + movlo r0, #5 + blo _0600F860 + cmp r0, #0x3e8 + movhi r0, #5 + bhi _0600F860 + ldrh r0, [r6, #0x48] + cmp r0, #0xff + movhi r0, #5 + bhi _0600F860 + ldrh r0, [r6, #0x4a] + ldr r1, _0600F86C ; =0x0000FFF0 + tst r0, r1 + movne r0, #5 + bne _0600F860 + bl CheckEnableChannel + cmp r0, #0 + moveq r0, #5 + beq _0600F860 + ldrh r2, [r6, #0x42] + mov r0, #0x1000 + rsb r0, r0, #0 + tst r2, r0 + movne r0, #5 + bne _0600F860 + ldrh r1, [r6, #0x44] + tst r1, r0 + movne r0, #5 + bne _0600F860 + cmp r2, #0 + moveq r0, #5 + beq _0600F860 + orrs r0, r1, r2 + moveq r0, #5 + beq _0600F860 + ldrh r0, [r6, #0x10] + cmp r0, #0x7d0 + movhi r0, #5 + bhi _0600F860 + mov r0, #0 + bl FLASH_VerifyCheckSum + cmp r0, #0 + movne r0, #0xe + bne _0600F860 + ldrh r0, [r6, #0x40] + tst r0, #0x20 + beq _0600F808 + mov r0, #1 + bl WSetPreambleType + b _0600F810 +_0600F808: + mov r0, #0 + bl WSetPreambleType +_0600F810: + add r0, r6, #0x18 + bl WSetBssid + ldrh r0, [r6, #0x1e] + add r1, r6, #0x20 + bl WSetSsid + ldrh r0, [r6, #0x46] + bl WSetBeaconPeriod + ldrh r0, [r6, #0x4a] + mov r1, #0 + bl WSetChannel + add r0, r6, #0x42 + bl WSetRateSet + str r6, [r4, #0x18] + str r5, [r4, #0x1c] + mov r2, #0x20 + mov r0, #2 + mov r1, #1 + strh r2, [r4] + bl AddTask + mov r0, #0x80 +_0600F860: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600F868: .word 0x0380FFF4 +_0600F86C: .word 0x0000FFF0 + arm_func_end MLME_JoinReqCmd + + arm_func_start MLME_AuthReqCmd +MLME_AuthReqCmd: ; 0x0600F870 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _0600F940 ; =0x0380FFF4 + mov r5, r1 + ldr r3, [r2] + mov r1, #6 + strh r1, [r5, #2] + add r1, r3, #0x300 + ldrh r2, [r1, #0x2e] + add r1, r3, #4 + mov r6, r0 + cmp r2, #3 + add r0, r3, #0x344 + cmpne r2, #2 + add r4, r1, #0x400 + movne r0, #0xb + bne _0600F938 + ldrh r0, [r0, #8] + cmp r0, #0x20 + movlo r0, #1 + blo _0600F938 + ldrh r0, [r6, #0x10] + tst r0, #1 + movne r0, #5 + bne _0600F938 + ldrh r0, [r6, #0x16] + cmp r0, #1 + movhi r0, #5 + bhi _0600F938 + ldrh r0, [r6, #0x18] + cmp r0, #0x7d0 + movhi r0, #5 + bhi _0600F938 + cmp r0, #0xa + movlo r0, #5 + blo _0600F938 + mov r0, #0x20 + bl WSetStaState + str r6, [r4, #0x18] + str r5, [r4, #0x1c] + mov r0, #0x30 + strh r0, [r4] + ldr r1, [r4, #0x18] + add r0, r5, #8 + ldrh r1, [r1, #0x16] + strh r1, [r5, #0xe] + ldr r1, [r4, #0x18] + add r1, r1, #0x10 + bl WSetMacAdrs1 + bl MLME_AuthTask + mov r0, #0x80 +_0600F938: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600F940: .word 0x0380FFF4 + arm_func_end MLME_AuthReqCmd + + arm_func_start MLME_DeAuthReqCmd +MLME_DeAuthReqCmd: ; 0x0600F944 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _0600FA74 ; =0x0380FFF4 + mov r6, r1 + ldr r2, [r3] + mov r1, #4 + strh r1, [r6, #2] + ldr r3, [r3] + add r1, r2, #4 + add r2, r3, #0x300 + ldrh r2, [r2, #0x2e] + mov r7, r0 + cmp r2, #3 + cmpne r2, #2 + cmpne r2, #1 + add r5, r1, #0x400 + movne r0, #0xb + bne _0600FA6C + add r0, r3, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0x30 + movlo r0, #1 + blo _0600FA6C + add r0, r2, #0xfe + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _0600F9C4 + ldrh r0, [r7, #0x10] + tst r0, #1 + movne r0, #5 + bne _0600FA6C +_0600F9C4: + add r0, r6, #6 + add r1, r7, #0x10 + bl WSetMacAdrs1 + ldrh r1, [r7, #0x16] + add r0, r6, #6 + mov r2, #0 + bl MakeDeAuthFrame + movs r4, r0 + moveq r0, #8 + beq _0600FA6C + str r7, [r5, #0x18] + str r6, [r5, #0x1c] + str r4, [r5, #4] + mov r0, #0x41 + strh r0, [r5] + ldrh r0, [r7, #0x10] + tst r0, #1 + beq _0600FA58 + ldr r2, _0600FA74 ; =0x0380FFF4 + sub r1, r4, #0x10 + ldr r0, [r2] + ldr r0, [r0, #0x3ec] + strh r0, [r4, #4] + ldr r0, [r2] + add r0, r0, #0x188 + bl CAM_AddBcFrame + ldr r0, _0600FA74 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r1, [r0, #0x32] + ldrh r2, [r0, #0x2e] + mvn r0, r1 + tst r2, r0 + bne _0600FA68 + mov r0, #2 + bl TxqPri + b _0600FA68 +_0600FA58: + add r0, r7, #0x10 + bl DeleteTxFrameByAdrs + mov r0, r4 + bl TxManCtrlFrame +_0600FA68: + mov r0, #0x80 +_0600FA6C: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600FA74: .word 0x0380FFF4 + arm_func_end MLME_DeAuthReqCmd + + arm_func_start MLME_AssReqCmd +MLME_AssReqCmd: ; 0x0600FA78 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _0600FB4C ; =0x0380FFF4 + mov r6, r1 + ldr r3, [r2] + mov r1, #3 + strh r1, [r6, #2] + add r1, r3, #0x300 + ldrh r2, [r1, #0x2e] + add r1, r3, #4 + cmp r2, #3 + mov r7, r0 + cmpne r2, #2 + add r4, r3, #0x344 + add r5, r1, #0x400 + movne r0, #0xb + bne _0600FB44 + ldrh r0, [r4, #8] + cmp r0, #0x30 + movlo r0, #1 + blo _0600FB44 + ldrh r0, [r7, #0x10] + tst r0, #1 + movne r0, #5 + bne _0600FB44 + ldrh r0, [r7, #0x16] + cmp r0, #0 + moveq r0, #5 + beq _0600FB44 + cmp r0, #0xff + movhi r0, #5 + bhi _0600FB44 + ldrh r0, [r7, #0x18] + cmp r0, #0x7d0 + movhi r0, #5 + bhi _0600FB44 + cmp r0, #0xa + movlo r0, #5 + blo _0600FB44 + mov r0, #0x30 + bl WSetStaState + bl WClearAids + ldrh r1, [r7, #0x16] + mov r0, #0x50 + strh r1, [r4, #0x70] + ldrh r1, [r7, #0x16] + strh r1, [r4, #0x72] + str r7, [r5, #0x18] + str r6, [r5, #0x1c] + strh r0, [r5] + bl MLME_AssTask + mov r0, #0x80 +_0600FB44: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600FB4C: .word 0x0380FFF4 + arm_func_end MLME_AssReqCmd + + arm_func_start MLME_ReAssReqCmd +MLME_ReAssReqCmd: ; 0x0600FB50 + stmdb sp!, {r3, lr} + ldr r3, _0600FC0C ; =0x0380FFF4 + mov r2, #3 + ldr ip, [r3] + strh r2, [r1, #2] + add r2, ip, #0x300 + ldrh r3, [r2, #0x2e] + add r2, ip, #4 + cmp r3, #3 + cmpne r3, #2 + add ip, ip, #0x344 + add lr, r2, #0x400 + movne r0, #0xb + bne _0600FC04 + ldrh r2, [ip, #8] + cmp r2, #0x30 + movlo r0, #1 + blo _0600FC04 + ldrh r2, [r0, #0x10] + tst r2, #1 + movne r0, #5 + bne _0600FC04 + ldrh r3, [r0, #0x16] + cmp r3, #1 + movlo r0, #5 + blo _0600FC04 + cmp r3, #0xff + movhi r0, #5 + bhi _0600FC04 + ldrh r2, [r0, #0x18] + cmp r2, #0x7d0 + movhi r0, #5 + bhi _0600FC04 + cmp r2, #0xa + movlo r0, #5 + blo _0600FC04 + strh r3, [ip, #0x70] + ldrh r3, [r0, #0x16] + mov r2, #0x60 + strh r3, [ip, #0x72] + str r0, [lr, #0x18] + str r1, [lr, #0x1c] + strh r2, [lr] + bl MLME_ReAssTask + mov r0, #0x80 +_0600FC04: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_0600FC0C: .word 0x0380FFF4 + arm_func_end MLME_ReAssReqCmd + + arm_func_start MLME_DisAssReqCmd +MLME_DisAssReqCmd: ; 0x0600FC10 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _0600FD18 ; =0x0380FFF4 + mov r6, r1 + ldr r2, [r3] + mov r1, #1 + strh r1, [r6, #2] + ldr r3, [r3] + add r1, r2, #4 + add r2, r3, #0x300 + ldrh r2, [r2, #0x2e] + mov r7, r0 + cmp r2, #0 + add r5, r1, #0x400 + moveq r0, #0xb + beq _0600FD10 + cmp r2, #1 + beq _0600FC64 + ldrh r0, [r7, #0x10] + tst r0, #1 + movne r0, #5 + bne _0600FD10 +_0600FC64: + add r0, r3, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0x40 + movne r0, #1 + bne _0600FD10 + ldrh r1, [r7, #0x16] + add r0, r7, #0x10 + bl MakeDisAssFrame + movs r4, r0 + moveq r0, #8 + beq _0600FD10 + str r7, [r5, #0x18] + str r6, [r5, #0x1c] + str r4, [r5, #4] + mov r0, #0x71 + strh r0, [r5] + ldrh r0, [r7, #0x10] + tst r0, #1 + beq _0600FCFC + ldr r2, _0600FD18 ; =0x0380FFF4 + sub r1, r4, #0x10 + ldr r0, [r2] + ldr r0, [r0, #0x3ec] + strh r0, [r4, #4] + ldr r0, [r2] + add r0, r0, #0x188 + bl CAM_AddBcFrame + ldr r0, _0600FD18 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r1, [r0, #0x32] + ldrh r2, [r0, #0x2e] + mvn r0, r1 + tst r2, r0 + bne _0600FD0C + mov r0, #2 + bl TxqPri + b _0600FD0C +_0600FCFC: + add r0, r7, #0x10 + bl DeleteTxFrameByAdrs + mov r0, r4 + bl TxManCtrlFrame +_0600FD0C: + mov r0, #0x80 +_0600FD10: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0600FD18: .word 0x0380FFF4 + arm_func_end MLME_DisAssReqCmd + + arm_func_start MLME_StartReqCmd +MLME_StartReqCmd: ; 0x0600FD1C + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _0600FEB0 ; =0x0380FFF4 + mov r2, #1 + ldr r3, [r3] + mov r6, r0 + strh r2, [r1, #2] + add r5, r3, #0x31c + ldrh r0, [r5, #0x12] + add r4, r3, #0x344 + cmp r0, #1 + cmpne r0, #0 + movne r0, #0xb + bne _0600FEA8 + ldrh r0, [r4, #8] + cmp r0, #0x20 + movne r0, #1 + bne _0600FEA8 + ldrh r0, [r6, #0x10] + cmp r0, #0x20 + movhi r0, #5 + bhi _0600FEA8 + cmp r0, #0 + moveq r0, #5 + beq _0600FEA8 + ldrh r0, [r6, #0x32] + cmp r0, #0xa + movlo r0, #5 + blo _0600FEA8 + cmp r0, #0x3e8 + movhi r0, #5 + bhi _0600FEA8 + ldrh r0, [r6, #0x34] + cmp r0, #0 + moveq r0, #5 + beq _0600FEA8 + cmp r0, #0xff + movhi r0, #5 + bhi _0600FEA8 + ldrh r0, [r6, #0x36] + ldr r1, _0600FEB4 ; =0x0000FFF0 + tst r0, r1 + movne r0, #5 + bne _0600FEA8 + bl CheckEnableChannel + cmp r0, #0 + moveq r0, #5 + beq _0600FEA8 + ldrh r1, [r6, #0x38] + cmp r1, #0 + moveq r0, #5 + beq _0600FEA8 + mov r0, #0x1000 + rsb r0, r0, #0 + tst r1, r0 + movne r0, #5 + bne _0600FEA8 + ldrh r1, [r6, #0x3a] + cmp r1, #0 + moveq r0, #5 + beq _0600FEA8 + tst r1, r0 + movne r0, #5 + bne _0600FEA8 + ldrh r0, [r6, #0x3c] + cmp r0, #0x80 + movhi r0, #5 + bhi _0600FEA8 + mov r0, #0 + bl FLASH_VerifyCheckSum + cmp r0, #0 + movne r0, #0xe + bne _0600FEA8 + ldrh r0, [r5, #0x12] + cmp r0, #0 + bne _0600FE54 + ldr r0, _0600FEB8 ; =BC_ADRS + bl WSetBssid + b _0600FE5C +_0600FE54: + add r0, r5, #8 + bl WSetBssid +_0600FE5C: + ldrh r0, [r6, #0x10] + add r1, r6, #0x12 + bl WSetSsid + ldrh r0, [r6, #0x32] + bl WSetBeaconPeriod + ldrh r0, [r6, #0x34] + bl WSetDTIMPeriod + ldrh r0, [r6, #0x36] + mov r1, #0 + bl WSetChannel + add r0, r6, #0x38 + bl WSetRateSet + ldrh r0, [r6, #0x3c] + add r1, r6, #0x3e + bl WInitGameInfo + mov r0, #0 + strh r0, [r4, #0xa4] + bl WStart + mov r0, #0 +_0600FEA8: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0600FEB0: .word 0x0380FFF4 +_0600FEB4: .word 0x0000FFF0 +_0600FEB8: .word BC_ADRS + arm_func_end MLME_StartReqCmd + + arm_func_start MLME_MeasChanReqCmd +MLME_MeasChanReqCmd: ; 0x0600FEBC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r2, _0600FF9C ; =0x0380FFF4 + mov r5, r1 + ldr r3, [r2] + mov r1, #0x12 + strh r1, [r5, #2] + ldr r2, [r2] + add r1, r3, #4 + add r2, r2, #0x300 + ldrh r2, [r2, #0x4c] + mov r6, r0 + cmp r2, #0x20 + add r4, r1, #0x400 + movne r0, #1 + bne _0600FF94 + ldrh r0, [r6, #0x12] + cmp r0, #3 + movhi r0, #5 + bhi _0600FF94 + ldrh r0, [r6, #0x14] + cmp r0, #0x3f + movhi r0, #5 + bhi _0600FF94 + ldrh r0, [r6, #0x16] + cmp r0, #0 + moveq r0, #5 + beq _0600FF94 + cmp r0, #0x3e8 + movhi r0, #5 + bhi _0600FF94 + mov r8, #0 + add r7, r6, #0x18 + b _0600FF64 +_0600FF40: + add r0, r7, r8 + bl WL_ReadByte + cmp r0, #0 + beq _0600FF6C + bl CheckEnableChannel + cmp r0, #0 + moveq r0, #5 + beq _0600FF94 + add r8, r8, #1 +_0600FF64: + cmp r8, #0x10 + blo _0600FF40 +_0600FF6C: + cmp r8, #0 + moveq r0, #5 + beq _0600FF94 + str r6, [r4, #0x18] + str r5, [r4, #0x1c] + mov r0, #0x80 + strh r0, [r4] + strh r0, [r5, #4] + bl MLME_MeasChannelTask + mov r0, #0x80 +_0600FF94: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_0600FF9C: .word 0x0380FFF4 + arm_func_end MLME_MeasChanReqCmd + + arm_func_start MLME_ScanTask +MLME_ScanTask: ; 0x0600FFA0 + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _06010188 ; =0x0380FFF4 + mov r6, #0 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + sub r1, r1, #0x10 + cmp r1, #5 + add r4, r0, #0x400 + add r5, r2, #0x344 + addls pc, pc, r1, lsl #2 + b _0601016C +_0600FFD4: ; jump table + b _0600FFEC ; case 0 + b _06010064 ; case 1 + b _060100F4 ; case 2 + b _060100F4 ; case 3 + b _0601016C ; case 4 + b _0601014C ; case 5 +_0600FFEC: + mov r0, #0x20 + bl WSetStaState + mov r0, #2 + strh r0, [r5, #0xc] + ldr r0, [r4, #0x1c] + mov r1, r6 + strh r1, [r0, #8] + ldr r0, [r4, #0x1c] + strh r1, [r0, #6] + strh r1, [r4, #6] + strh r1, [r4, #8] + ldr r1, [r4, #0x18] + ldrh r0, [r1, #0x38] + cmp r0, #0 + ldrh r0, [r1, #0x4a] + bne _06010054 + add r1, r0, #3 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + mov r0, r0, asr #2 + strh r0, [r4, #0xc] + ldrh r0, [r4, #0xc] + cmp r0, #0xa + movlo r0, #0xa + strloh r0, [r4, #0xc] + b _06010058 +_06010054: + strh r0, [r4, #0xc] +_06010058: + ldr r0, [r4, #0x1c] + mov r1, #0 + strh r1, [r0, #4] +_06010064: + ldr r1, [r4, #0x18] + ldrh r0, [r4, #6] + add r1, r1, #0x3a + add r0, r1, r0 + bl WL_ReadByte + movs r5, r0 + moveq r0, #0x15 + streqh r0, [r4] + moveq r6, #1 + beq _0601016C + ldrh r1, [r4, #6] + mov r0, #0 + add r1, r1, #1 + strh r1, [r4, #6] + strh r0, [r4, #0xa] + bl FLASH_VerifyCheckSum + cmp r0, #0 + beq _060100C8 + ldr r0, [r4, #0x1c] + mov r1, #0xe + strh r1, [r0, #4] + mov r0, #0x15 + strh r0, [r4] + mov r6, #1 + b _0601016C +_060100C8: + ldrh r0, [r4] + mov r1, #0 + cmp r0, #0x10 + mov r0, r5 + bne _060100E8 + bl WSetChannel + bl WStart + b _060100EC +_060100E8: + bl WSetChannel +_060100EC: + mov r0, #0x12 + strh r0, [r4] +_060100F4: + mov r0, #0x13 + strh r0, [r4] + ldr r1, [r4, #0x18] + ldrh r0, [r1, #0x38] + cmp r0, #0 + bne _0601013C + add r0, r1, #0x10 + bl MakeProbeReqFrame + cmp r0, #0 + bne _06010138 + ldr r0, [r4, #0x1c] + mov r1, #8 + strh r1, [r0, #4] + mov r0, #0x15 + strh r0, [r4] + mov r6, #1 + b _0601016C +_06010138: + bl TxManCtrlFrame +_0601013C: + ldrh r0, [r4, #0xc] + ldr r1, _0601018C ; =MLME_ScanTimeOut + bl SetupTimeOut + b _0601016C +_0601014C: + strh r6, [r4] + bl WStop + ldr r0, _06010188 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x2e] + strh r0, [r5, #0xc] + bl IssueMlmeConfirm +_0601016C: + cmp r6, #0 + beq _06010180 + mov r0, #2 + mov r1, #0 + bl AddTask +_06010180: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06010188: .word 0x0380FFF4 +_0601018C: .word MLME_ScanTimeOut + arm_func_end MLME_ScanTask + + arm_func_start MLME_ScanTimeOut +MLME_ScanTimeOut: ; 0x06010190 + ldr r0, _060101EC ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #4 + add r2, r0, #0x400 + ldrh r1, [r2, #0xa] + ldrh r0, [r2, #0xc] + add r0, r1, r0 + strh r0, [r2, #0xa] + ldr r0, [r2, #0x18] + ldrh r1, [r2, #0xa] + ldrh r0, [r0, #0x4a] + cmp r1, r0 + blo _060101DC + ldrh r0, [r2, #6] + cmp r0, #0x10 + movlo r0, #0x11 + strloh r0, [r2] + movhs r0, #0x15 + strhsh r0, [r2] +_060101DC: + ldr ip, _060101F0 ; =AddTask + mov r0, #2 + mov r1, #0 + bx ip + .align 2, 0 +_060101EC: .word 0x0380FFF4 +_060101F0: .word AddTask + arm_func_end MLME_ScanTimeOut + + arm_func_start MLME_JoinTask +MLME_JoinTask: ; 0x060101F4 + stmdb sp!, {r4, lr} + ldr r0, _0601028C ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + cmp r1, #0x20 + add r4, r0, #0x400 + beq _06010224 + cmp r1, #0x25 + beq _06010250 + b _06010284 +_06010224: + bl WStart + mov r0, #0 + strh r0, [r4, #4] + strh r0, [r4, #6] + mov r0, #0x21 + strh r0, [r4] + ldr r0, [r4, #0x18] + ldr r1, _06010290 ; =MLME_JoinTimeOut + ldrh r0, [r0, #0x10] + bl SetupTimeOut + b _06010284 +_06010250: + ldrh r1, [r4, #4] + ldr r0, [r4, #0x1c] + strh r1, [r0, #4] + ldrh r1, [r4, #6] + ldr r0, [r4, #0x1c] + strh r1, [r0, #6] + ldrh r0, [r4, #4] + cmp r0, #0 + beq _06010278 + bl WStop +_06010278: + mov r0, #0 + strh r0, [r4] + bl IssueMlmeConfirm +_06010284: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0601028C: .word 0x0380FFF4 +_06010290: .word MLME_JoinTimeOut + arm_func_end MLME_JoinTask + + arm_func_start MLME_JoinTimeOut +MLME_JoinTimeOut: ; 0x06010294 + ldr r0, _060102C8 ; =0x0380FFF4 + ldr ip, _060102CC ; =AddTask + ldr r2, [r0] + mov r1, #7 + add r0, r2, #4 + add r0, r0, #0x400 + strh r1, [r0, #4] + mov r3, #0x25 + add r2, r2, #0x400 + mov r0, #2 + mov r1, #1 + strh r3, [r2, #4] + bx ip + .align 2, 0 +_060102C8: .word 0x0380FFF4 +_060102CC: .word AddTask + arm_func_end MLME_JoinTimeOut + + arm_func_start MLME_AuthTask +MLME_AuthTask: ; 0x060102D0 + stmdb sp!, {r4, lr} + ldr r0, _060103AC ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + cmp r1, #0x30 + add r4, r0, #0x400 + beq _06010300 + cmp r1, #0x35 + beq _0601037C + b _060103A4 +_06010300: + ldr r0, [r4, #0x18] + mov r1, #0 + mov r2, r1 + add r0, r0, #0x10 + bl MakeAuthFrame + cmp r0, #0 + bne _06010340 + ldr r1, [r4, #0x1c] + mov r2, #8 + mov r0, #2 + strh r2, [r1, #4] + mov r2, #0x35 + mov r1, r0 + strh r2, [r4] + bl AddTask + b _060103A4 +_06010340: + ldr r1, [r4, #0x18] + mov r2, #1 + ldrh r3, [r1, #0x16] + mov r1, #0 + strh r3, [r0, #0x2c] + strh r2, [r0, #0x2e] + strh r1, [r0, #0x30] + mov r1, #0x31 + strh r1, [r4] + bl TxManCtrlFrame + ldr r0, [r4, #0x18] + ldr r1, _060103B0 ; =MLME_AuthTimeOut + ldrh r0, [r0, #0x18] + bl SetupTimeOut + b _060103A4 +_0601037C: + mov r0, #1 + bl ResetTxqPri + mov r0, #1 + bl ClearQueuedPri + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #0 + strh r0, [r4] + bl IssueMlmeConfirm +_060103A4: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060103AC: .word 0x0380FFF4 +_060103B0: .word MLME_AuthTimeOut + arm_func_end MLME_AuthTask + + arm_func_start MLME_AuthTimeOut +MLME_AuthTimeOut: ; 0x060103B4 + stmdb sp!, {r3, lr} + ldr r1, _060103F0 ; =0x0380FFF4 + mov r0, #2 + ldr ip, [r1] + mov r3, #7 + add r1, ip, #4 + ldr r2, [r1, #0x41c] + mov r1, r0 + strh r3, [r2, #4] + add r2, ip, #0x400 + mov r3, #0x35 + strh r3, [r2, #4] + bl AddTask + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060103F0: .word 0x0380FFF4 + arm_func_end MLME_AuthTimeOut + + arm_func_start MLME_AssTask +MLME_AssTask: ; 0x060103F4 + stmdb sp!, {r4, lr} + ldr r0, _060104AC ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + cmp r1, #0x50 + add r4, r0, #0x400 + beq _06010424 + cmp r1, #0x53 + beq _0601047C + b _060104A4 +_06010424: + ldr r0, [r4, #0x18] + add r0, r0, #0x10 + bl MakeAssReqFrame + cmp r0, #0 + bne _0601045C + ldr r0, [r4, #0x1c] + mov r1, #8 + strh r1, [r0, #4] + mov r2, #0x53 + mov r0, #2 + mov r1, #3 + strh r2, [r4] + bl AddTask + b _060104A4 +_0601045C: + mov r1, #0x51 + strh r1, [r4] + bl TxManCtrlFrame + ldr r0, [r4, #0x18] + ldr r1, _060104B0 ; =MLME_AssTimeOut + ldrh r0, [r0, #0x18] + bl SetupTimeOut + b _060104A4 +_0601047C: + mov r0, #1 + bl ResetTxqPri + mov r0, #1 + bl ClearQueuedPri + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #0 + strh r0, [r4] + bl IssueMlmeConfirm +_060104A4: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060104AC: .word 0x0380FFF4 +_060104B0: .word MLME_AssTimeOut + arm_func_end MLME_AssTask + + arm_func_start MLME_AssTimeOut +MLME_AssTimeOut: ; 0x060104B4 + ldr r0, _060104E8 ; =0x0380FFF4 + ldr ip, _060104EC ; =AddTask + ldr r2, [r0] + mov r1, #7 + add r0, r2, #4 + ldr r0, [r0, #0x41c] + mov r3, #0x53 + strh r1, [r0, #4] + add r2, r2, #0x400 + mov r0, #2 + mov r1, #3 + strh r3, [r2, #4] + bx ip + .align 2, 0 +_060104E8: .word 0x0380FFF4 +_060104EC: .word AddTask + arm_func_end MLME_AssTimeOut + + arm_func_start MLME_ReAssTask +MLME_ReAssTask: ; 0x060104F0 + stmdb sp!, {r4, lr} + ldr r0, _060105A0 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + cmp r1, #0x60 + add r4, r0, #0x400 + beq _06010520 + cmp r1, #0x63 + beq _06010578 + b _06010598 +_06010520: + ldr r0, [r4, #0x18] + add r0, r0, #0x10 + bl MakeReAssReqFrame + cmp r0, #0 + bne _06010558 + ldr r0, [r4, #0x1c] + mov r1, #8 + strh r1, [r0, #4] + mov r2, #0x63 + mov r0, #2 + mov r1, #4 + strh r2, [r4] + bl AddTask + b _06010598 +_06010558: + mov r1, #0x61 + strh r1, [r4] + bl TxManCtrlFrame + ldr r0, [r4, #0x18] + ldr r1, _060105A4 ; =MLME_ReAssTimeOut + ldrh r0, [r0, #0x18] + bl SetupTimeOut + b _06010598 +_06010578: + mov r0, #1 + bl ClearQueuedPri + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #0 + strh r0, [r4] + bl IssueMlmeConfirm +_06010598: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060105A0: .word 0x0380FFF4 +_060105A4: .word MLME_ReAssTimeOut + arm_func_end MLME_ReAssTask + + arm_func_start MLME_ReAssTimeOut +MLME_ReAssTimeOut: ; 0x060105A8 + ldr r0, _060105DC ; =0x0380FFF4 + ldr ip, _060105E0 ; =AddTask + ldr r2, [r0] + mov r1, #7 + add r0, r2, #4 + ldr r0, [r0, #0x41c] + mov r3, #0x63 + strh r1, [r0, #4] + add r2, r2, #0x400 + mov r0, #2 + mov r1, #4 + strh r3, [r2, #4] + bx ip + .align 2, 0 +_060105DC: .word 0x0380FFF4 +_060105E0: .word AddTask + arm_func_end MLME_ReAssTimeOut + + arm_func_start MLME_MeasChannelTask +MLME_MeasChannelTask: ; 0x060105E4 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _06010844 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + sub r1, r1, #0x80 + cmp r1, #4 + add r4, r2, #0x344 + add r5, r0, #0x400 + addls pc, pc, r1, lsl #2 + b _06010824 +_06010614: ; jump table + b _06010628 ; case 0 + b _06010668 ; case 1 + b _0601071C ; case 2 + b _06010744 ; case 3 + b _060107B0 ; case 4 +_06010628: + mov r0, #0 + strh r0, [r5, #0x14] + mov r0, #0x13 + bl BBP_Read + strh r0, [r5, #0xe] + mov r0, #0x35 + bl BBP_Read + strh r0, [r5, #0x10] + ldr r1, [r5, #0x18] + ldrh r0, [r1, #0x12] + ldrh r1, [r1, #0x14] + bl WSetCCA_ED + mov r0, #4 + strh r0, [r4, #0xc] + mov r0, #0 + strh r0, [r5, #0x16] +_06010668: + mov r0, #0 + str r0, [r5, #4] + str r0, [r5, #8] + ldr r1, [r5, #0x18] + ldrh r0, [r5, #0x14] + add r1, r1, #0x18 + add r0, r1, r0 + bl WL_ReadByte + movs r4, r0 + beq _0601069C + ldrh r0, [r5, #0x14] + cmp r0, #0x10 + blo _060106A8 +_0601069C: + mov r0, #0x84 + strh r0, [r5] + b _06010824 +_060106A8: + mov r0, #0 + bl FLASH_VerifyCheckSum + cmp r0, #0 + movne r0, #0xe + strneh r0, [r5, #0x16] + movne r0, #0x84 + strneh r0, [r5] + bne _06010824 + ldrh r0, [r5] + mov r1, #0 + cmp r0, #0x80 + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 + bne _06010700 + bl WSetChannel + bl WStart + ldr r1, _06010848 ; =0x04808040 + mov r0, #0x8000 + ldrh r1, [r1] + strh r1, [r5, #0xc] + bl WSetForcePowerState + b _06010704 +_06010700: + bl WSetChannel +_06010704: + mov r0, #0x82 + strh r0, [r5] + ldr r0, [r5, #0x18] + ldr r1, _0601084C ; =MLME_MeasChanTimeOut + ldrh r0, [r0, #0x16] + bl SetupTimeOut +_0601071C: + ldr r1, [r5, #4] + ldr r0, _06010850 ; =0x0480819C + add r1, r1, #1 + str r1, [r5, #4] + ldrh r0, [r0] + tst r0, #1 + ldrne r0, [r5, #8] + addne r0, r0, #0x64 + strne r0, [r5, #8] + b _06010824 +_06010744: + ldr r1, [r5, #0x18] + ldrh r0, [r5, #0x14] + add r1, r1, #0x18 + add r0, r1, r0 + bl WL_ReadByte + ldr r1, [r5, #4] + mov r4, r0 + cmp r1, #0 + ldrne r0, [r5, #8] + mov r2, #0 + cmpne r0, #0 + beq _06010784 + bl __VENEER__u32_div_f + add r2, r0, #1 + cmp r2, #0x64 + movhi r2, #0x64 +_06010784: + ldr r1, [r5, #0x1c] + ldrh r0, [r5, #0x14] + orr r2, r4, r2, lsl #8 + add r0, r1, r0, lsl #1 + strh r2, [r0, #8] + ldrh r1, [r5, #0x14] + mov r0, #0x81 + add r1, r1, #1 + strh r1, [r5, #0x14] + strh r0, [r5] + b _06010824 +_060107B0: + bl WStop + ldr r1, _06010844 ; =0x0380FFF4 + mov r0, #0x13 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r1, [r1, #0x2e] + strh r1, [r4, #0xc] + ldrh r1, [r5, #0xe] + bl BBP_Write + ldrh r1, [r5, #0x10] + mov r0, #0x35 + bl BBP_Write + ldrh r0, [r5, #0xc] + bl WSetForcePowerState + ldrh r2, [r5, #0x16] + ldr r1, [r5, #0x1c] + mov r0, #0 + strh r2, [r1, #4] + strh r0, [r5] + ldrh r2, [r5, #0x14] + mov r1, r0 + b _06010818 +_06010808: + ldr r0, [r5, #0x1c] + add r0, r0, r2, lsl #1 + strh r1, [r0, #8] + add r2, r2, #1 +_06010818: + cmp r2, #0x10 + blo _06010808 + bl IssueMlmeConfirm +_06010824: + ldrh r0, [r5] + cmp r0, #0 + beq _0601083C + mov r0, #2 + mov r1, #5 + bl AddTask +_0601083C: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06010844: .word 0x0380FFF4 +_06010848: .word 0x04808040 +_0601084C: .word MLME_MeasChanTimeOut +_06010850: .word 0x0480819C + arm_func_end MLME_MeasChannelTask + + arm_func_start MLME_MeasChanTimeOut +MLME_MeasChanTimeOut: ; 0x06010854 + ldr r0, _06010878 ; =0x0380FFF4 + ldr ip, _0601087C ; =AddTask + ldr r1, [r0] + mov r3, #0x83 + add r2, r1, #0x400 + mov r0, #2 + mov r1, #5 + strh r3, [r2, #4] + bx ip + .align 2, 0 +_06010878: .word 0x0380FFF4 +_0601087C: .word AddTask + arm_func_end MLME_MeasChanTimeOut + + arm_func_start MLME_BeaconLostTask +MLME_BeaconLostTask: ; 0x06010880 + ldr r0, _06010898 ; =0x0380FFF4 + ldr ip, _0601089C ; =MLME_IssueBeaconLostIndication + ldr r0, [r0] + add r0, r0, #0xc6 + add r0, r0, #0x300 + bx ip + .align 2, 0 +_06010898: .word 0x0380FFF4 +_0601089C: .word MLME_IssueBeaconLostIndication + arm_func_end MLME_BeaconLostTask + + arm_func_start IssueMlmeConfirm +IssueMlmeConfirm: ; 0x060108A0 + stmdb sp!, {r4, lr} + ldr r0, _060108F0 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x24 + add r1, r0, #0x400 + ldrh r0, [r1, #4] + add r4, r2, #0x17c + bic r0, r0, #1 + strh r0, [r1, #4] + ldr r1, [r2, #0x424] + add r0, r4, #0x84 + bl SendMessageToWmDirect + ldrh r0, [r4, #0x8c] + cmp r0, #0 + beq _060108E8 + mov r0, #2 + mov r1, #0xb + bl AddTask +_060108E8: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060108F0: .word 0x0380FFF4 + arm_func_end IssueMlmeConfirm + + arm_func_start MLME_IssueAuthIndication +MLME_IssueAuthIndication: ; 0x060108F4 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _0601096C ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r2] + mov r6, r0 + add r0, r1, #0x188 + mov r1, #0x18 + bl AllocateHeapBuf + movs r4, r0 + bne _0601092C + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010964 +_0601092C: + mov r0, #0x84 + strh r0, [r4, #0xc] + mov r2, #4 + mov r1, r6 + add r0, r4, #0x10 + strh r2, [r4, #0xe] + bl WSetMacAdrs1 + ldr r0, _0601096C ; =0x0380FFF4 + strh r5, [r4, #0x16] + ldr r0, [r0] + mov r1, r4 + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010964: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_0601096C: .word 0x0380FFF4 + arm_func_end MLME_IssueAuthIndication + + arm_func_start MLME_IssueDeAuthIndication +MLME_IssueDeAuthIndication: ; 0x06010970 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _060109E8 ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r2] + mov r6, r0 + add r0, r1, #0x188 + mov r1, #0x18 + bl AllocateHeapBuf + movs r4, r0 + bne _060109A8 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _060109E0 +_060109A8: + mov r0, #0x85 + strh r0, [r4, #0xc] + mov r2, #4 + mov r1, r6 + add r0, r4, #0x10 + strh r2, [r4, #0xe] + bl WSetMacAdrs1 + ldr r0, _060109E8 ; =0x0380FFF4 + strh r5, [r4, #0x16] + ldr r0, [r0] + mov r1, r4 + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_060109E0: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060109E8: .word 0x0380FFF4 + arm_func_end MLME_IssueDeAuthIndication + + arm_func_start MLME_IssueAssIndication +MLME_IssueAssIndication: ; 0x060109EC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _06010ADC ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r3] + mov r7, r0 + add r0, r1, #0x188 + mov r1, #0x3a + mov r6, r2 + bl AllocateHeapBuf + movs r4, r0 + bne _06010A28 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010AD4 +_06010A28: + mov r0, #0x86 + strh r0, [r4, #0xc] + mov r2, #0x15 + mov r1, r7 + add r0, r4, #0x10 + strh r2, [r4, #0xe] + bl WSetMacAdrs1 + ldr r1, _06010AE0 ; =0x00000FFF + add r0, r6, #1 + and r1, r5, r1 + strh r1, [r4, #0x16] + bl WL_ReadByte + add r7, r6, #2 + strh r0, [r4, #0x18] + mov r5, #0 + add r6, r4, #0x1a + b _06010A8C +_06010A6C: + cmp r5, #0x20 + bhs _06010A98 + add r0, r7, r5 + bl WL_ReadByte + mov r1, r0 + add r0, r6, r5 + bl WL_WriteByte + add r5, r5, #1 +_06010A8C: + ldrh r0, [r4, #0x18] + cmp r5, r0 + blo _06010A6C +_06010A98: + add r7, r4, #0x1a + mov r6, #0 + b _06010AB4 +_06010AA4: + mov r1, r6 + add r0, r7, r5 + bl WL_WriteByte + add r5, r5, #1 +_06010AB4: + cmp r5, #0x20 + blo _06010AA4 + ldr r0, _06010ADC ; =0x0380FFF4 + mov r1, r4 + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010AD4: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06010ADC: .word 0x0380FFF4 +_06010AE0: .word 0x00000FFF + arm_func_end MLME_IssueAssIndication + + arm_func_start MLME_IssueReAssIndication +MLME_IssueReAssIndication: ; 0x06010AE4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r3, _06010BCC ; =0x0380FFF4 + mov r6, r1 + ldr r1, [r3] + mov r7, r0 + add r0, r1, #0x188 + mov r1, #0x3a + mov r5, r2 + bl AllocateHeapBuf + movs r4, r0 + bne _06010B20 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010BC4 +_06010B20: + mov r0, #0x87 + strh r0, [r4, #0xc] + mov r0, #0x15 + strh r0, [r4, #0xe] + mov r1, r7 + add r0, r4, #0x10 + bl WSetMacAdrs1 + strh r6, [r4, #0x16] + add r0, r5, #1 + bl WL_ReadByte + add r6, r5, #2 + strh r0, [r4, #0x18] + mov r7, #0 + add r5, r4, #0x1a + b _06010B7C +_06010B5C: + cmp r7, #0x20 + bhs _06010B88 + add r0, r6, r7 + bl WL_ReadByte + mov r1, r0 + add r0, r5, r7 + bl WL_WriteByte + add r7, r7, #1 +_06010B7C: + ldrh r0, [r4, #0x18] + cmp r7, r0 + blo _06010B5C +_06010B88: + add r6, r4, #0x1a + mov r5, #0 + b _06010BA4 +_06010B94: + mov r1, r5 + add r0, r6, r7 + bl WL_WriteByte + add r7, r7, #1 +_06010BA4: + cmp r7, #0x20 + blo _06010B94 + ldr r0, _06010BCC ; =0x0380FFF4 + mov r1, r4 + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010BC4: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06010BCC: .word 0x0380FFF4 + arm_func_end MLME_IssueReAssIndication + + arm_func_start MLME_IssueDisAssIndication +MLME_IssueDisAssIndication: ; 0x06010BD0 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _06010C48 ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r2] + mov r6, r0 + add r0, r1, #0x188 + mov r1, #0x18 + bl AllocateHeapBuf + movs r4, r0 + bne _06010C08 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010C40 +_06010C08: + mov r0, #0x88 + strh r0, [r4, #0xc] + mov r2, #4 + mov r1, r6 + add r0, r4, #0x10 + strh r2, [r4, #0xe] + bl WSetMacAdrs1 + ldr r0, _06010C48 ; =0x0380FFF4 + strh r5, [r4, #0x16] + ldr r0, [r0] + mov r1, r4 + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010C40: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06010C48: .word 0x0380FFF4 + arm_func_end MLME_IssueDisAssIndication + + arm_func_start MLME_IssueBeaconLostIndication +MLME_IssueBeaconLostIndication: ; 0x06010C4C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06010CBC ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r1] + mov r1, #0x16 + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r4, r0 + bne _06010C80 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010CB4 +_06010C80: + mov r0, #0x8b + strh r0, [r4, #0xc] + mov r2, #3 + mov r1, r5 + add r0, r4, #0x10 + strh r2, [r4, #0xe] + bl WSetMacAdrs1 + ldr r0, _06010CBC ; =0x0380FFF4 + mov r1, r4 + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010CB4: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06010CBC: .word 0x0380FFF4 + arm_func_end MLME_IssueBeaconLostIndication + + arm_func_start MLME_IssueBeaconSendIndication +MLME_IssueBeaconSendIndication: ; 0x06010CC0 + stmdb sp!, {r3, lr} + ldr r0, _06010D1C ; =0x0380FFF4 + mov r1, #0x10 + ldr r0, [r0] + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r1, r0 + bne _06010CF0 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010D14 +_06010CF0: + mov r0, #0x8c + strh r0, [r1, #0xc] + mov r2, #0 + ldr r0, _06010D1C ; =0x0380FFF4 + strh r2, [r1, #0xe] + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010D14: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06010D1C: .word 0x0380FFF4 + arm_func_end MLME_IssueBeaconSendIndication + + arm_func_start MLME_IssueBeaconRecvIndication +MLME_IssueBeaconRecvIndication: ; 0x06010D20 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _06010E38 ; =0x0380FFF4 + mov r6, r0 + ldr r2, [r1] + add r0, r2, #0x300 + ldrh r1, [r0, #0xe4] + add r0, r2, #0x188 + add r1, r1, #0x3e + add r4, r2, #0x344 + bl AllocateHeapBuf + movs r5, r0 + bne _06010D60 + mov r0, #1 + bl SetFatalErr + mov r0, #0 + b _06010E30 +_06010D60: + mov r0, #0x8d + strh r0, [r5, #0xc] + ldrh r1, [r4, #0xa0] + add r0, r5, #0x1f + add r1, r1, #1 + add r1, r1, r1, lsr #31 + mov r1, r1, asr #1 + add r1, r1, #0x16 + strh r1, [r5, #0xe] + ldrh r1, [r6, #0x12] + and r1, r1, #0xff + bl WL_WriteByte + ldrh r1, [r6, #0xe] + add r0, r5, #0x1e + and r1, r1, #0xff + bl WL_WriteByte + add r0, r5, #0x2e + add r1, r6, #0x1e + bl WSetMacAdrs1 + ldrh r2, [r4, #0xa0] + strh r2, [r5, #0x16] + cmp r2, #0 + beq _06010E18 + ldrh r0, [r4, #0xa2] + tst r0, #1 + ldr r0, [r4, #0x9c] + beq _06010E0C + add r7, r5, #0x3c + add r6, r0, #1 + mov r4, #0 + b _06010DFC +_06010DDC: + mov r0, r6 + bl WL_ReadByte + mov r1, r0 + mov r0, r7 + bl WL_WriteByte + add r6, r6, #1 + add r7, r7, #1 + add r4, r4, #1 +_06010DFC: + ldrh r0, [r5, #0x16] + cmp r4, r0 + blo _06010DDC + b _06010E18 +_06010E0C: + add r1, r5, #0x3c + add r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_06010E18: + ldr r0, _06010E38 ; =0x0380FFF4 + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #1 +_06010E30: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06010E38: .word 0x0380FFF4 + arm_func_end MLME_IssueBeaconRecvIndication + + arm_func_start InitializeMLME +InitializeMLME: ; 0x06010E3C + ldr r1, _06010E5C ; =0x0380FFF4 + ldr ip, _06010E60 ; =MIi_CpuClear16 + ldr r1, [r1] + mov r0, #0 + add r1, r1, #4 + mov r2, #0x20 + add r1, r1, #0x400 + bx ip + .align 2, 0 +_06010E5C: .word 0x0380FFF4 +_06010E60: .word MIi_CpuClear16 + arm_func_end InitializeMLME + + arm_func_start PARAMSET_AllReqCmd +PARAMSET_AllReqCmd: ; 0x06010E64 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _06010F4C ; =0x0380FFF4 + mov r5, r0 + mov r0, #1 + strh r0, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + bne _06010F44 + add r0, r5, #0x10 + bl WSetMacAdrs + mov r4, r0 + ldrh r0, [r5, #0x16] + bl WSetRetryLimit + orr r4, r4, r0 + ldrh r0, [r5, #0x18] + bl WSetEnableChannel + orr r4, r4, r0 + ldrh r0, [r5, #0x1c] + bl WSetMode + orr r4, r4, r0 + ldrh r0, [r5, #0x1e] + bl WSetRate + orr r4, r4, r0 + ldrh r0, [r5, #0x20] + bl WSetWepMode + orr r4, r4, r0 + ldrh r0, [r5, #0x22] + bl WSetWepKeyId + orr r4, r4, r0 + add r0, r5, #0x24 + bl WSetWepKey + orr r4, r4, r0 + ldrh r0, [r5, #0x74] + bl WSetBeaconType + orr r4, r4, r0 + ldrh r0, [r5, #0x76] + bl WSetBcSsidResponse + orr r4, r4, r0 + ldrh r0, [r5, #0x78] + bl WSetBeaconLostThreshold + orr r4, r4, r0 + ldrh r0, [r5, #0x7a] + mov r1, #0 + bl WSetActiveZoneTime + orr r4, r4, r0 + add r0, r5, #0x7c + bl WSetSsidMask + orr r4, r4, r0 + ldrh r0, [r5, #0x9c] + bl WSetPreambleType + orr r4, r4, r0 + ldrh r0, [r5, #0x9e] + bl WSetAuthAlgo + orr r0, r4, r0 +_06010F44: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06010F4C: .word 0x0380FFF4 + arm_func_end PARAMSET_AllReqCmd + + arm_func_start PARAMSET_MacAdrsReqCmd +PARAMSET_MacAdrsReqCmd: ; 0x06010F50 + stmdb sp!, {r3, lr} + ldr r2, _06010F8C ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + bne _06010F80 + add r0, r0, #0x10 + bl WSetMacAdrs + mov r3, r0 +_06010F80: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06010F8C: .word 0x0380FFF4 + arm_func_end PARAMSET_MacAdrsReqCmd + + arm_func_start PARAMSET_RetryReqCmd +PARAMSET_RetryReqCmd: ; 0x06010F90 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06010FA4 ; =WSetRetryLimit + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_06010FA4: .word WSetRetryLimit + arm_func_end PARAMSET_RetryReqCmd + + arm_func_start PARAMSET_EnableChannelReqCmd +PARAMSET_EnableChannelReqCmd: ; 0x06010FA8 + stmdb sp!, {r3, lr} + ldr r2, _06010FE4 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + bne _06010FD8 + ldrh r0, [r0, #0x10] + bl WSetEnableChannel + mov r3, r0 +_06010FD8: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06010FE4: .word 0x0380FFF4 + arm_func_end PARAMSET_EnableChannelReqCmd + + arm_func_start PARAMSET_ModeReqCmd +PARAMSET_ModeReqCmd: ; 0x06010FE8 + stmdb sp!, {r3, lr} + ldr r2, _06011034 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r2, [r1, #0x4c] + cmp r2, #0x20 + movhi r0, r3 + bhi _0601102C + bne _06011024 + ldrh r1, [r1, #0x56] + cmp r1, #0 + movne r0, r3 + bne _0601102C +_06011024: + ldrh r0, [r0, #0x10] + bl WSetMode +_0601102C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011034: .word 0x0380FFF4 + arm_func_end PARAMSET_ModeReqCmd + + arm_func_start PARAMSET_RateReqCmd +PARAMSET_RateReqCmd: ; 0x06011038 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _0601104C ; =WSetRate + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_0601104C: .word WSetRate + arm_func_end PARAMSET_RateReqCmd + + arm_func_start PARAMSET_WepModeReqCmd +PARAMSET_WepModeReqCmd: ; 0x06011050 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06011064 ; =WSetWepMode + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_06011064: .word WSetWepMode + arm_func_end PARAMSET_WepModeReqCmd + + arm_func_start PARAMSET_WepKeyIdReqCmd +PARAMSET_WepKeyIdReqCmd: ; 0x06011068 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _0601107C ; =WSetWepKeyId + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_0601107C: .word WSetWepKeyId + arm_func_end PARAMSET_WepKeyIdReqCmd + + arm_func_start PARAMSET_WepKeyReqCmd +PARAMSET_WepKeyReqCmd: ; 0x06011080 + ldr ip, _06011094 ; =WSetWepKey + mov r2, #1 + add r0, r0, #0x10 + strh r2, [r1, #2] + bx ip + .align 2, 0 +_06011094: .word WSetWepKey + arm_func_end PARAMSET_WepKeyReqCmd + + arm_func_start PARAMSET_BeaconTypeReqCmd +PARAMSET_BeaconTypeReqCmd: ; 0x06011098 + stmdb sp!, {r3, lr} + ldr r2, _060110D4 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x20 + bhi _060110C8 + ldrh r0, [r0, #0x10] + bl WSetBeaconType + mov r3, r0 +_060110C8: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060110D4: .word 0x0380FFF4 + arm_func_end PARAMSET_BeaconTypeReqCmd + + arm_func_start PARAMSET_ResBcSsidReqCmd +PARAMSET_ResBcSsidReqCmd: ; 0x060110D8 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _060110EC ; =WSetBcSsidResponse + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_060110EC: .word WSetBcSsidResponse + arm_func_end PARAMSET_ResBcSsidReqCmd + + arm_func_start PARAMSET_BeaconLostThReqCmd +PARAMSET_BeaconLostThReqCmd: ; 0x060110F0 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06011104 ; =WSetBeaconLostThreshold + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_06011104: .word WSetBeaconLostThreshold + arm_func_end PARAMSET_BeaconLostThReqCmd + + arm_func_start PARAMSET_ActiveZoneReqCmd +PARAMSET_ActiveZoneReqCmd: ; 0x06011108 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06011120 ; =WSetActiveZoneTime + ldrh r0, [r0, #0x10] + mov r1, #0 + bx ip + .align 2, 0 +_06011120: .word WSetActiveZoneTime + arm_func_end PARAMSET_ActiveZoneReqCmd + + arm_func_start PARAMSET_SSIDMaskReqCmd +PARAMSET_SSIDMaskReqCmd: ; 0x06011124 + ldr ip, _06011138 ; =WSetSsidMask + mov r2, #1 + add r0, r0, #0x10 + strh r2, [r1, #2] + bx ip + .align 2, 0 +_06011138: .word WSetSsidMask + arm_func_end PARAMSET_SSIDMaskReqCmd + + arm_func_start PARAMSET_PreambleTypeReqCmd +PARAMSET_PreambleTypeReqCmd: ; 0x0601113C + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06011150 ; =WSetPreambleType + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_06011150: .word WSetPreambleType + arm_func_end PARAMSET_PreambleTypeReqCmd + + arm_func_start PARAMSET_AuthAlgoReqCmd +PARAMSET_AuthAlgoReqCmd: ; 0x06011154 + mov r2, #1 + strh r2, [r1, #2] + ldr ip, _06011168 ; =WSetAuthAlgo + ldrh r0, [r0, #0x10] + bx ip + .align 2, 0 +_06011168: .word WSetAuthAlgo + arm_func_end PARAMSET_AuthAlgoReqCmd + + arm_func_start PARAMSET_CCAModeEDThReqCmd +PARAMSET_CCAModeEDThReqCmd: ; 0x0601116C + stmdb sp!, {r3, r4, r5, lr} + mov r2, #1 + strh r2, [r1, #2] + mov r5, r0 + ldrh r0, [r5, #0x14] + cmp r0, #0x3f + movhi r0, #5 + bhi _060111B0 + ldrh r0, [r5, #0x10] + ldrh r1, [r5, #0x12] + bl WSetCCA_ED + movs r4, r0 + bne _060111AC + ldrh r1, [r5, #0x14] + mov r0, #0x2e + bl BBP_Write +_060111AC: + mov r0, r4 +_060111B0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end PARAMSET_CCAModeEDThReqCmd + + arm_func_start PARAMSET_LifeTimeReqCmd +PARAMSET_LifeTimeReqCmd: ; 0x060111B8 + stmdb sp!, {r4, lr} + ldr ip, _060112B8 ; =0x0380FFF4 + mov r3, #1 + ldr r2, [ip] + ldr r2, [r2, #0x31c] + strh r3, [r1, #2] + ldr r1, [ip] + ldrh r4, [r0, #0x10] + add r1, r1, #0x300 + ldrh r1, [r1, #0x22] + cmp r4, r1 + blo _060111F8 + rsb r1, r3, #0x10000 + cmp r4, r1 + movne r0, #5 + bne _060112B0 +_060111F8: + ldrh r3, [r0, #0x14] + cmp r3, #0x3f + bls _06011214 + ldr r1, _060112BC ; =0x0000FFFF + cmp r3, r1 + movne r0, #5 + bne _060112B0 +_06011214: + ldr r1, _060112BC ; =0x0000FFFF + cmp r4, r1 + bne _06011268 + ldr ip, _060112B8 ; =0x0380FFF4 + mov r4, #1 + mov r3, #0x1c + b _06011250 +_06011230: + mla lr, r4, r3, r2 + ldrh r1, [r0, #0x12] + add r4, r4, #1 + strh r1, [lr, #0x1a] + ldrh r1, [lr, #0x18] + cmp r1, #0 + ldrneh r1, [r0, #0x12] + strneh r1, [lr, #0x18] +_06011250: + ldr r1, [ip] + add r1, r1, #0x300 + ldrh r1, [r1, #0x22] + cmp r4, r1 + blo _06011230 + b _0601129C +_06011268: + cmp r4, #0 + beq _0601129C + mov r1, #0x1c + mla r3, r4, r1, r2 + ldrh lr, [r0, #0x12] + add ip, r2, #0x18 + strh lr, [r3, #0x1a] + ldrh r2, [r0, #0x10] + mul r3, r2, r1 + ldrh r1, [ip, r3] + cmp r1, #0 + ldrneh r1, [r0, #0x12] + strneh r1, [ip, r3] +_0601129C: + ldrh r0, [r0, #0x14] + cmp r0, #0 + beq _060112AC + bl WSetFrameLifeTime +_060112AC: + mov r0, #0 +_060112B0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060112B8: .word 0x0380FFF4 +_060112BC: .word 0x0000FFFF + arm_func_end PARAMSET_LifeTimeReqCmd + + arm_func_start PARAMSET_MaxConnReqCmd +PARAMSET_MaxConnReqCmd: ; 0x060112C0 + ldr r2, _06011314 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x20 + movhi r0, r3 + bxhi lr + ldrh r1, [r0, #0x10] + add r1, r1, #1 + strh r1, [r0, #0x10] + ldr r1, [r2] + ldrh r2, [r0, #0x10] + add r0, r1, #0x300 + ldrh r1, [r0, #0x20] + cmp r2, r1 + movhi r0, #5 + strlsh r2, [r0, #0x22] + movls r0, #0 + bx lr + .align 2, 0 +_06011314: .word 0x0380FFF4 + arm_func_end PARAMSET_MaxConnReqCmd + + arm_func_start PARAMSET_MainAntennaReqCmd +PARAMSET_MainAntennaReqCmd: ; 0x06011318 + stmdb sp!, {r3, lr} + ldr r2, _06011354 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + blo _06011348 + ldrh r0, [r0, #0x10] + bl WSetMainAntenna + mov r3, r0 +_06011348: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011354: .word 0x0380FFF4 + arm_func_end PARAMSET_MainAntennaReqCmd + + arm_func_start PARAMSET_DiversityReqCmd +PARAMSET_DiversityReqCmd: ; 0x06011358 + stmdb sp!, {r3, lr} + ldr r2, _06011394 ; =0x0380FFF4 + mov r3, r0 + mov r0, #1 + strh r0, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + blo _0601138C + ldrh r0, [r3, #0x10] + ldrh r1, [r3, #0x12] + bl WSetDiversity +_0601138C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011394: .word 0x0380FFF4 + arm_func_end PARAMSET_DiversityReqCmd + + arm_func_start PARAMSET_BcnSendRecvIndReqCmd +PARAMSET_BcnSendRecvIndReqCmd: ; 0x06011398 + stmdb sp!, {r3, lr} + ldr r2, _060113D4 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + blo _060113C8 + ldrh r0, [r0, #0x10] + bl WSetBeaconSendRecvIndicate + mov r3, r0 +_060113C8: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060113D4: .word 0x0380FFF4 + arm_func_end PARAMSET_BcnSendRecvIndReqCmd + + arm_func_start PARAMSET_NullKeyModeReqCmd +PARAMSET_NullKeyModeReqCmd: ; 0x060113D8 + stmdb sp!, {r3, lr} + ldr r2, _06011414 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0x10 + blo _06011408 + ldrh r0, [r0, #0x10] + bl WSetNullKeyMode + mov r3, r0 +_06011408: + mov r0, r3 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011414: .word 0x0380FFF4 + arm_func_end PARAMSET_NullKeyModeReqCmd + + arm_func_start PARAMSET_BSSIDReqCmd +PARAMSET_BSSIDReqCmd: ; 0x06011418 + ldr ip, _0601142C ; =WSetBssid + mov r2, #1 + add r0, r0, #0x10 + strh r2, [r1, #2] + bx ip + .align 2, 0 +_0601142C: .word WSetBssid + arm_func_end PARAMSET_BSSIDReqCmd + + arm_func_start PARAMSET_SSIDReqCmd +PARAMSET_SSIDReqCmd: ; 0x06011430 + mov r2, #1 + strh r2, [r1, #2] + mov r1, r0 + ldrh r0, [r1, #0x10] + ldr ip, _0601144C ; =WSetSsid + add r1, r1, #0x12 + bx ip + .align 2, 0 +_0601144C: .word WSetSsid + arm_func_end PARAMSET_SSIDReqCmd + + arm_func_start PARAMSET_BeaconPeriodReqCmd +PARAMSET_BeaconPeriodReqCmd: ; 0x06011450 + stmdb sp!, {r3, lr} + ldr r2, _06011488 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x2e] + cmp r1, #1 + movne r0, #0xb + bne _06011480 + ldrh r0, [r0, #0x10] + bl WSetBeaconPeriod +_06011480: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011488: .word 0x0380FFF4 + arm_func_end PARAMSET_BeaconPeriodReqCmd + + arm_func_start PARAMSET_DTIMPeriodReqCmd +PARAMSET_DTIMPeriodReqCmd: ; 0x0601148C + stmdb sp!, {r3, lr} + ldr r2, _060114C4 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x2e] + cmp r1, #1 + movne r0, #0xb + bne _060114BC + ldrh r0, [r0, #0x10] + bl WSetDTIMPeriod +_060114BC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060114C4: .word 0x0380FFF4 + arm_func_end PARAMSET_DTIMPeriodReqCmd + + arm_func_start PARAMSET_ListenIntervalReqCmd +PARAMSET_ListenIntervalReqCmd: ; 0x060114C8 + stmdb sp!, {r3, lr} + ldr r2, _06011504 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x2e] + cmp r1, #2 + cmpne r1, #3 + movne r0, #0xb + bne _060114FC + ldrh r0, [r0, #0x10] + bl WSetListenInterval +_060114FC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011504: .word 0x0380FFF4 + arm_func_end PARAMSET_ListenIntervalReqCmd + + arm_func_start PARAMSET_GameInfoReqCmd +PARAMSET_GameInfoReqCmd: ; 0x06011508 + stmdb sp!, {r3, lr} + ldr r2, _06011568 ; =0x0380FFF4 + mov r3, #1 + strh r3, [r1, #2] + ldr r1, [r2] + mov r3, r0 + add r0, r1, #0x300 + ldrh r0, [r0, #0x2e] + cmp r0, #1 + movne r0, #0xb + bne _06011560 + ldrh r0, [r3, #0x10] + ldrh r2, [r3, #0xe] + add r1, r0, #1 + add r1, r1, r1, lsr #31 + mov r1, r1, asr #1 + add r1, r1, #1 + cmp r2, r1 + movlt r0, #4 + blt _06011560 + add r1, r3, #0x12 + bl WSetGameInfo +_06011560: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011568: .word 0x0380FFF4 + arm_func_end PARAMSET_GameInfoReqCmd + + arm_func_start PARAMGET_AllReqCmd +PARAMGET_AllReqCmd: ; 0x0601156C + stmdb sp!, {r4, lr} + ldr r0, _060116A0 ; =0x0380FFF4 + mov r4, r1 + mov r1, #0x21 + strh r1, [r4, #2] + ldr r1, [r0] + add r0, r4, #6 + add r1, r1, #0x324 + bl WSetMacAdrs1 + ldr r0, _060116A0 ; =0x0380FFF4 + add r1, r4, #0x22 + ldr r3, [r0] + mov r2, #0x20 + add r3, r3, #0x300 + ldrh r3, [r3, #0x2a] + strh r3, [r4, #0xc] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x2c] + strh r3, [r4, #0xe] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0xbe] + strh r3, [r4, #0x10] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x2e] + strh r3, [r4, #0x12] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x30] + strh r3, [r4, #0x14] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x34] + strh r3, [r4, #0x16] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x36] + strh r3, [r4, #0x18] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x3a] + mov r3, r3, lsl #0x1f + mov r3, r3, lsr #0x1f + strh r3, [r4, #0x1a] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x3a] + mov r3, r3, lsl #0x1e + mov r3, r3, lsr #0x1f + strh r3, [r4, #0x1c] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0xc2] + strh r3, [r4, #0x1e] + ldr r3, [r0] + add r3, r3, #0x300 + ldrh r3, [r3, #0x3c] + strh r3, [r4, #0x20] + ldr r0, [r0] + add r0, r0, #0x384 + bl __VENEER_MIi_CpuCopy16 + ldr r2, _060116A0 ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x3a] + mov r1, r1, lsl #0x1d + mov r1, r1, lsr #0x1f + strh r1, [r4, #0x42] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x32] + strh r1, [r4, #0x44] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_060116A0: .word 0x0380FFF4 + arm_func_end PARAMGET_AllReqCmd + + arm_func_start PARAMGET_MacAdrsReqCmd +PARAMGET_MacAdrsReqCmd: ; 0x060116A4 + stmdb sp!, {r3, lr} + ldr r0, _060116D0 ; =0x0380FFF4 + mov r2, #4 + strh r2, [r1, #2] + ldr r2, [r0] + add r0, r1, #6 + add r1, r2, #0x324 + bl WSetMacAdrs1 + mov r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060116D0: .word 0x0380FFF4 + arm_func_end PARAMGET_MacAdrsReqCmd + + arm_func_start PARAMGET_RetryReqCmd +PARAMGET_RetryReqCmd: ; 0x060116D4 + ldr r0, _060116F8 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x2a] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_060116F8: .word 0x0380FFF4 + arm_func_end PARAMGET_RetryReqCmd + + arm_func_start PARAMGET_EnableChannelReqCmd +PARAMGET_EnableChannelReqCmd: ; 0x060116FC + ldr r3, _06011730 ; =0x0380FFF4 + mov r0, #3 + strh r0, [r1, #2] + ldr r2, [r3] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x2c] + strh r2, [r1, #6] + ldr r2, [r3] + add r2, r2, #0x300 + ldrh r2, [r2, #0xbe] + strh r2, [r1, #8] + bx lr + .align 2, 0 +_06011730: .word 0x0380FFF4 + arm_func_end PARAMGET_EnableChannelReqCmd + + arm_func_start PARAMGET_ModeReqCmd +PARAMGET_ModeReqCmd: ; 0x06011734 + ldr r0, _06011758 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x2e] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011758: .word 0x0380FFF4 + arm_func_end PARAMGET_ModeReqCmd + + arm_func_start PARAMGET_RateReqCmd +PARAMGET_RateReqCmd: ; 0x0601175C + ldr r0, _06011780 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x30] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011780: .word 0x0380FFF4 + arm_func_end PARAMGET_RateReqCmd + + arm_func_start PARAMGET_WepModeReqCmd +PARAMGET_WepModeReqCmd: ; 0x06011784 + ldr r0, _060117A8 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x34] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_060117A8: .word 0x0380FFF4 + arm_func_end PARAMGET_WepModeReqCmd + + arm_func_start PARAMGET_WepKeyIdReqCmd +PARAMGET_WepKeyIdReqCmd: ; 0x060117AC + ldr r0, _060117D0 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x36] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_060117D0: .word 0x0380FFF4 + arm_func_end PARAMGET_WepKeyIdReqCmd + + arm_func_start PARAMGET_BeaconTypeReqCmd +PARAMGET_BeaconTypeReqCmd: ; 0x060117D4 + ldr r0, _06011800 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x3a] + mov r2, r2, lsl #0x1f + mov r2, r2, lsr #0x1f + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011800: .word 0x0380FFF4 + arm_func_end PARAMGET_BeaconTypeReqCmd + + arm_func_start PARAMGET_ResBcSsidReqCmd +PARAMGET_ResBcSsidReqCmd: ; 0x06011804 + ldr r0, _06011830 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x3a] + mov r2, r2, lsl #0x1e + mov r2, r2, lsr #0x1f + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011830: .word 0x0380FFF4 + arm_func_end PARAMGET_ResBcSsidReqCmd + + arm_func_start PARAMGET_BeaconLostThReqCmd +PARAMGET_BeaconLostThReqCmd: ; 0x06011834 + ldr r0, _06011858 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0xc2] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011858: .word 0x0380FFF4 + arm_func_end PARAMGET_BeaconLostThReqCmd + + arm_func_start PARAMGET_ActiveZoneReqCmd +PARAMGET_ActiveZoneReqCmd: ; 0x0601185C + ldr r0, _06011880 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x3c] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011880: .word 0x0380FFF4 + arm_func_end PARAMGET_ActiveZoneReqCmd + + arm_func_start PARAMGET_SSIDMaskReqCmd +PARAMGET_SSIDMaskReqCmd: ; 0x06011884 + ldr r0, _060118BC ; =0x0380FFF4 + mov r2, #0x11 + strh r2, [r1, #2] + ldr r0, [r0] + add r3, r1, #6 + add r2, r0, #0x384 + mov r1, #0 +_060118A0: + ldrh r0, [r2], #2 + add r1, r1, #1 + cmp r1, #0x10 + strh r0, [r3], #2 + blo _060118A0 + mov r0, #0 + bx lr + .align 2, 0 +_060118BC: .word 0x0380FFF4 + arm_func_end PARAMGET_SSIDMaskReqCmd + + arm_func_start PARAMGET_PreambleTypeReqCmd +PARAMGET_PreambleTypeReqCmd: ; 0x060118C0 + ldr r0, _060118EC ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x3a] + mov r2, r2, lsl #0x1d + mov r2, r2, lsr #0x1f + strh r2, [r1, #6] + bx lr + .align 2, 0 +_060118EC: .word 0x0380FFF4 + arm_func_end PARAMGET_PreambleTypeReqCmd + + arm_func_start PARAMGET_AuthAlgoReqCmd +PARAMGET_AuthAlgoReqCmd: ; 0x060118F0 + ldr r0, _06011914 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x32] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011914: .word 0x0380FFF4 + arm_func_end PARAMGET_AuthAlgoReqCmd + + arm_func_start PARAMGET_CCAModeEDThReqCmd +PARAMGET_CCAModeEDThReqCmd: ; 0x06011918 + stmdb sp!, {r4, lr} + mov r4, r1 + mov r0, #4 + strh r0, [r4, #2] + mov r0, #0x13 + bl BBP_Read + strh r0, [r4, #6] + mov r0, #0x35 + bl BBP_Read + strh r0, [r4, #8] + mov r0, #0x2e + bl BBP_Read + strh r0, [r4, #0xa] + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + arm_func_end PARAMGET_CCAModeEDThReqCmd + + arm_func_start PARAMGET_MaxConnReqCmd +PARAMGET_MaxConnReqCmd: ; 0x06011958 + ldr r0, _06011980 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x22] + sub r2, r2, #1 + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011980: .word 0x0380FFF4 + arm_func_end PARAMGET_MaxConnReqCmd + + arm_func_start PARAMGET_MainAntennaReqCmd +PARAMGET_MainAntennaReqCmd: ; 0x06011984 + ldr r0, _060119BC ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r2, [r0, #0x4c] + cmp r2, #0x10 + movlo r0, #1 + ldrhsh r2, [r0, #0x3a] + movhs r0, #0 + movhs r2, r2, lsl #0x1c + movhs r2, r2, lsr #0x1f + strhsh r2, [r1, #6] + bx lr + .align 2, 0 +_060119BC: .word 0x0380FFF4 + arm_func_end PARAMGET_MainAntennaReqCmd + + arm_func_start PARAMGET_DiversityReqCmd +PARAMGET_DiversityReqCmd: ; 0x060119C0 + ldr r3, _06011A1C ; =0x0380FFF4 + mov r0, #3 + strh r0, [r1, #2] + ldr r0, [r3] + add r0, r0, #0x300 + ldrh r2, [r0, #0x4c] + cmp r2, #0x10 + movlo r0, #1 + bxlo lr + ldrh r2, [r0, #0x3a] + mov r0, #0 + mov r2, r2, lsl #0x1b + mov r2, r2, lsr #0x1f + strh r2, [r1, #6] + ldr r2, [r3] + add r2, r2, #0x300 + ldrh r3, [r2, #0x3a] + mov r2, r3, lsl #0x1c + mov r3, r3, lsl #0x1a + mov r2, r2, lsr #0x1f + eor r2, r2, r3, lsr #31 + strh r2, [r1, #8] + bx lr + .align 2, 0 +_06011A1C: .word 0x0380FFF4 + arm_func_end PARAMGET_DiversityReqCmd + + arm_func_start PARAMGET_BcnSendRecvIndReqCmd +PARAMGET_BcnSendRecvIndReqCmd: ; 0x06011A20 + ldr r0, _06011A58 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r2, [r0, #0x4c] + cmp r2, #0x10 + movlo r0, #1 + ldrhsh r2, [r0, #0x3a] + movhs r0, #0 + movhs r2, r2, lsl #0x19 + movhs r2, r2, lsr #0x1f + strhsh r2, [r1, #6] + bx lr + .align 2, 0 +_06011A58: .word 0x0380FFF4 + arm_func_end PARAMGET_BcnSendRecvIndReqCmd + + arm_func_start PARAMGET_NullKeyModeReqCmd +PARAMGET_NullKeyModeReqCmd: ; 0x06011A5C + ldr r0, _06011A94 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r2, [r0, #0x4c] + cmp r2, #0x10 + movlo r0, #1 + ldrhsh r2, [r0, #0x3a] + movhs r0, #0 + movhs r2, r2, lsl #0x18 + movhs r2, r2, lsr #0x1f + strhsh r2, [r1, #6] + bx lr + .align 2, 0 +_06011A94: .word 0x0380FFF4 + arm_func_end PARAMGET_NullKeyModeReqCmd + + arm_func_start PARAMGET_BSSIDReqCmd +PARAMGET_BSSIDReqCmd: ; 0x06011A98 + stmdb sp!, {r3, lr} + ldr r0, _06011AC4 ; =0x0380FFF4 + mov r2, #4 + strh r2, [r1, #2] + ldr r2, [r0] + add r0, r1, #6 + add r1, r2, #0x3a8 + bl WSetMacAdrs1 + mov r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011AC4: .word 0x0380FFF4 + arm_func_end PARAMGET_BSSIDReqCmd + + arm_func_start PARAMGET_SSIDReqCmd +PARAMGET_SSIDReqCmd: ; 0x06011AC8 + ldr r2, _06011B10 ; =0x0380FFF4 + mov r0, #0x12 + strh r0, [r1, #2] + ldr r0, [r2] + add ip, r1, #8 + add r0, r0, #0x300 + ldrh r0, [r0, #0x62] + mov r3, #0 + strh r0, [r1, #6] + ldr r0, [r2] + add r1, r0, #0x364 +_06011AF4: + ldrh r0, [r1], #2 + add r3, r3, #2 + cmp r3, #0x20 + strh r0, [ip], #2 + blo _06011AF4 + mov r0, #0 + bx lr + .align 2, 0 +_06011B10: .word 0x0380FFF4 + arm_func_end PARAMGET_SSIDReqCmd + + arm_func_start PARAMGET_BeaconPeriodReqCmd +PARAMGET_BeaconPeriodReqCmd: ; 0x06011B14 + ldr r0, _06011B38 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0xb2] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011B38: .word 0x0380FFF4 + arm_func_end PARAMGET_BeaconPeriodReqCmd + + arm_func_start PARAMGET_DTIMPeriodReqCmd +PARAMGET_DTIMPeriodReqCmd: ; 0x06011B3C + ldr r0, _06011B60 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0xb8] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011B60: .word 0x0380FFF4 + arm_func_end PARAMGET_DTIMPeriodReqCmd + + arm_func_start PARAMGET_ListenIntervalReqCmd +PARAMGET_ListenIntervalReqCmd: ; 0x06011B64 + ldr r0, _06011B88 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0xb4] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011B88: .word 0x0380FFF4 + arm_func_end PARAMGET_ListenIntervalReqCmd + + arm_func_start PARAMGET_GameInfoReqCmd +PARAMGET_GameInfoReqCmd: ; 0x06011B8C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, r1 + ldrh r0, [r4, #2] + ldr r1, _06011C60 ; =0x0380FFF4 + cmp r0, #1 + ldrhi r0, _06011C60 ; =0x0380FFF4 + ldrhi r0, [r0] + addhi r0, r0, #0x300 + ldrhih r0, [r0, #0xe4] + strhih r0, [r4, #6] + ldrh r0, [r4, #2] + ldr r3, [r1] + sub r1, r0, #2 + add r0, r3, #0x300 + ldrh r2, [r0, #0xe4] + cmp r2, r1, lsl #1 + movgt r0, #4 + bgt _06011C58 + ldrh r2, [r4, #6] + cmp r2, #0 + beq _06011C3C + ldrh r0, [r0, #0xe6] + tst r0, #1 + ldr r0, [r3, #0x3e0] + beq _06011C30 + add r6, r4, #8 + add r5, r0, #1 + mov r7, #0 + b _06011C20 +_06011C00: + mov r0, r5 + bl WL_ReadByte + mov r1, r0 + mov r0, r6 + bl WL_WriteByte + add r6, r6, #1 + add r5, r5, #1 + add r7, r7, #1 +_06011C20: + ldrh r0, [r4, #6] + cmp r7, r0 + blo _06011C00 + b _06011C3C +_06011C30: + add r1, r4, #8 + add r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_06011C3C: + ldrh r1, [r4, #6] + mov r0, #0 + add r1, r1, #1 + add r1, r1, r1, lsr #31 + mov r1, r1, asr #1 + add r1, r1, #2 + strh r1, [r4, #2] +_06011C58: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06011C60: .word 0x0380FFF4 + arm_func_end PARAMGET_GameInfoReqCmd + + arm_func_start DEV_ShutdownReqCmd +DEV_ShutdownReqCmd: ; 0x06011C64 + stmdb sp!, {r3, lr} + ldr r2, _06011CA0 ; =0x0380FFF4 + mov r0, #1 + strh r0, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r1, [r1, #0x4c] + cmp r1, #0 + cmpne r1, #0x10 + bne _06011C98 + mov r0, #0 + bl WSetStaState + mov r0, #0 +_06011C98: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011CA0: .word 0x0380FFF4 + arm_func_end DEV_ShutdownReqCmd + + arm_func_start DEV_IdleReqCmd +DEV_IdleReqCmd: ; 0x06011CA4 + stmdb sp!, {r3, lr} + ldr r2, _06011CFC ; =0x0380FFF4 + mov r0, #1 + strh r0, [r1, #2] + ldr r1, [r2] + add r1, r1, #0x300 + ldrh r2, [r1, #0x4c] + cmp r2, #0x20 + bhi _06011CF4 + ldrh r1, [r1, #0x56] + cmp r1, #0 + bne _06011CF4 + mov r0, #0 + bl FLASH_VerifyCheckSum + cmp r0, #0 + movne r0, #0xe + bne _06011CF4 + mov r0, #0x10 + bl WSetStaState + mov r0, #0 +_06011CF4: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011CFC: .word 0x0380FFF4 + arm_func_end DEV_IdleReqCmd + + arm_func_start DEV_Class1ReqCmd +DEV_Class1ReqCmd: ; 0x06011D00 + stmdb sp!, {r3, lr} + ldr r0, _06011D50 ; =0x0380FFF4 + mov r2, #1 + strh r2, [r1, #2] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r1, [r0, #0x4c] + cmp r1, #0x10 + beq _06011D34 + cmp r1, #0x20 + ldreqh r0, [r0, #0x56] + cmpeq r0, #0 + bne _06011D44 +_06011D34: + mov r0, #0x20 + bl WSetStaState + mov r0, #0 + b _06011D48 +_06011D44: + mov r0, #1 +_06011D48: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011D50: .word 0x0380FFF4 + arm_func_end DEV_Class1ReqCmd + + arm_func_start DEV_RebootReqCmd +DEV_RebootReqCmd: ; 0x06011D54 + stmdb sp!, {r3, lr} + ldr r0, _06011D8C ; =0x0380FFF4 + mov r2, #1 + strh r2, [r1, #2] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0x20 + blo _06011D7C + bl WStop +_06011D7C: + bl WlessLibReboot + mov r0, #0 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011D8C: .word 0x0380FFF4 + arm_func_end DEV_RebootReqCmd + + arm_func_start DEV_ClearWlInfoReqCmd +DEV_ClearWlInfoReqCmd: ; 0x06011D90 + stmdb sp!, {r3, lr} + ldr r0, _06011DC4 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0 + mov r0, #1 + beq _06011DBC + strh r0, [r1, #2] + bl WInitCounter + mov r0, #0 +_06011DBC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06011DC4: .word 0x0380FFF4 + arm_func_end DEV_ClearWlInfoReqCmd + + arm_func_start DEV_GetVerInfoReqCmd +DEV_GetVerInfoReqCmd: ; 0x06011DC8 + stmdb sp!, {r4, lr} + ldr r0, _06011E5C ; =wlVersion$4017 + mov r4, r1 + mov r3, #9 + add r1, r4, #6 + mov r2, #8 + strh r3, [r4, #2] + bl __VENEER_MIi_CpuCopy16 + ldr r1, _06011E60 ; =0x04808000 + ldr r0, _06011E64 ; =0x0380FFF4 + ldrh r1, [r1] + strh r1, [r4, #0xe] + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #0x8000 + moveq r1, #0x6d + ldreq r0, _06011E68 ; =0x0000933D + streqh r1, [r4, #0x10] + beq _06011E28 + mov r0, #0 + bl BBP_Read + strh r0, [r4, #0x10] + bl CalcBbpCRC +_06011E28: + strh r0, [r4, #0x12] + ldr r0, _06011E64 ; =0x0380FFF4 + ldr r1, [r0] + add r0, r1, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #0x4000 + addne r0, r1, #0x500 + ldrneh r0, [r0, #0xf8] + moveq r0, #2 + strh r0, [r4, #0x14] + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06011E5C: .word wlVersion$4017 +_06011E60: .word 0x04808000 +_06011E64: .word 0x0380FFF4 +_06011E68: .word 0x0000933D + arm_func_end DEV_GetVerInfoReqCmd + + arm_func_start DEV_GetWlInfoReqCmd +DEV_GetWlInfoReqCmd: ; 0x06011E6C + stmdb sp!, {r4, lr} + ldr r0, _06011EC4 ; =0x0380FFF4 + mov r4, r1 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0 + moveq r0, #1 + beq _06011EBC + mov r0, #0x5c + strh r0, [r4, #2] + bl WUpdateCounter + ldr r0, _06011EC4 ; =0x0380FFF4 + add r1, r4, #8 + ldr r0, [r0] + mov r2, #0xb4 + add r0, r0, #0x13c + add r0, r0, #0x400 + bl __VENEER_MIi_CpuCopy32 + mov r0, #0 +_06011EBC: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06011EC4: .word 0x0380FFF4 + arm_func_end DEV_GetWlInfoReqCmd + + arm_func_start __VENEER_MIi_CpuCopy32 +__VENEER_MIi_CpuCopy32: ; 0x06011EC8 + ldr pc, _06011ECC ; =MIi_CpuCopy32 + .align 2, 0 +_06011ECC: .word MIi_CpuCopy32 + arm_func_end __VENEER_MIi_CpuCopy32 + + arm_func_start DEV_GetStateReqCmd +DEV_GetStateReqCmd: ; 0x06011ED0 + ldr r0, _06011EF4 ; =0x0380FFF4 + mov r2, #2 + strh r2, [r1, #2] + ldr r2, [r0] + mov r0, #0 + add r2, r2, #0x300 + ldrh r2, [r2, #0x4c] + strh r2, [r1, #6] + bx lr + .align 2, 0 +_06011EF4: .word 0x0380FFF4 + arm_func_end DEV_GetStateReqCmd + + arm_func_start DEV_TestSignalReqCmd +DEV_TestSignalReqCmd: ; 0x06011EF8 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r2, _06012220 ; =0x0380FFF4 + mov r5, r0 + ldr r2, [r2] + mov r0, #1 + strh r0, [r1, #2] + add r4, r2, #0x344 + ldrh r1, [r4, #8] + and r1, r1, #0xf0 + cmp r1, #0x10 + bne _06012214 + ldrh r0, [r5, #0x10] + cmp r0, #1 + movhi r0, #5 + bhi _06012214 + ldrh r0, [r5, #0x14] + cmp r0, #0xa + cmpne r0, #0x14 + movne r0, #5 + bne _06012214 + ldrh r0, [r5, #0x12] + cmp r0, #4 + movhi r0, #5 + bhi _06012214 + mov r0, #0 + bl FLASH_VerifyCheckSum + cmp r0, #0 + movne r0, #0xe + bne _06012214 + ldrh r0, [r5, #0x10] + cmp r0, #0 + beq _06012188 + cmp r0, #1 + bne _06012210 + ldrh r0, [r4, #8] + cmp r0, #0x10 + movne r0, #1 + bne _06012214 + mov r0, #0 + str r0, [sp] + add r2, sp, #0 + mov r0, #0x65 + mov r1, #1 + bl FLASH_DirectRead + ldr r6, [sp] + mov r0, #1 + bl BBP_Read + cmp r6, r0 + beq _06011FD4 + mov r1, r6 + mov r0, #1 + bl BBP_Write + ldr r0, _06012224 ; =0x00001388 + bl WWaitus +_06011FD4: + ldrh r0, [r5, #0x12] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _06012210 +_06011FE4: ; jump table + b _06011FF8 ; case 0 + b _06011FF8 ; case 1 + b _06011FF8 ; case 2 + b _06012090 ; case 3 + b _06012090 ; case 4 +_06011FF8: + mov r0, #0x11 + strh r0, [r4, #8] + ldrh r0, [r5, #0x16] + mov r1, #1 + bl WSetChannel + ldr r1, _06012228 ; =0x04808040 + mov r2, #0x8000 + ldr r0, _0601222C ; =0x000005DC + strh r2, [r1] + bl WWaitus + ldrh r1, [r5, #0x14] + mov r0, #2 + strh r1, [r4, #0x16] + bl BBP_Read + str r0, [sp] + ldrh r1, [r5, #0x12] + ldr r2, _06012230 ; =0x048081A4 + cmp r1, #1 + orrls r0, r0, #0x10 + strls r0, [sp] + ldrh r0, [r5, #0x14] + strh r0, [r2] + ldrh r0, [r5, #0x12] + cmp r0, #1 + strneh r0, [r2, #-2] + bne _06012074 + ldr r1, [sp] + mov r0, #3 + orr r1, r1, #0x20 + str r1, [sp] + strh r0, [r2, #-2] +_06012074: + ldr r1, [sp] + mov r0, #2 + bl BBP_Write + ldr r1, _06012234 ; =0x00000823 + ldr r0, _06012238 ; =0x048081A0 + strh r1, [r0] + b _06012210 +_06012090: + ldr r0, _06012220 ; =0x0380FFF4 + ldr r0, [r0] + add r4, r0, #0x344 + bl WStart + bl WStop + mov r0, #6 + bl BBP_Read + strh r0, [r4, #0xac] + ldrh r0, [r5, #0x12] + cmp r0, #4 + bne _060120C8 + mov r0, #6 + mov r1, #0 + bl BBP_Write +_060120C8: + ldr r1, _0601223C ; =0x04804000 + mov r0, #0 + mov r2, #0xc + bl __VENEER_MIi_CpuClear16 + ldr r1, _0601223C ; =0x04804000 + mov r0, #0x14 + strh r0, [r1, #8] + mov r0, #0x7d0 + strh r0, [r1, #0xa] + add r3, r1, #0xc + ldr r1, _06012240 ; =0x00005555 + ldr r0, _06012244 ; =0x000007EC + mov r2, #0 +_060120FC: + add r2, r2, #2 + cmp r2, r0 + strh r1, [r3], #2 + blo _060120FC + ldr r1, _0601223C ; =0x04804000 + mov r2, #8 + ldr r0, _06012248 ; =0x04808194 + strh r2, [r1, #0xc] + mov r1, #6 + strh r1, [r0] + mov r0, #0x12 + strh r0, [r4, #8] + mov r1, #1 + strh r1, [r4, #0x18] + ldrh r0, [r5, #0x16] + bl WSetChannel + ldr r1, _06012228 ; =0x04808040 + mov r2, #0x8000 + ldr r0, _0601222C ; =0x000005DC + strh r2, [r1] + bl WWaitus + mov r2, #1 + ldr r3, _0601224C ; =0x04808012 + mov r0, #2 + strh r0, [r3] + strh r2, [r3, #-0xe] + ldr r1, _0601223C ; =0x04804000 + rsb r0, r2, #0x4000 + and r0, r1, r0 + mov r0, r0, lsl #0xf + mov r0, r0, lsr #0x10 + strh r2, [r3, #0x9c] + orr r0, r0, #0x8000 + strh r0, [r3, #0x8e] + b _06012210 +_06012188: + ldrh r0, [r4, #8] + cmp r0, #0x11 + bne _060121D0 + bl ClearPeriodicTimeOut + ldr r1, _06012238 ; =0x048081A0 + mov r2, #0 + strh r2, [r1] + mov r0, #1 + strh r0, [r1, #2] + sub r0, r1, #0x160 + strh r2, [r0] + mov r0, #2 + bl BBP_Read + bic r1, r0, #0x30 + mov r0, #2 + str r1, [sp] + bl BBP_Write + b _06012208 +_060121D0: + cmp r0, #0x12 + bne _06012200 + ldr r1, _06012250 ; =0x04808004 + mov r0, #0 + strh r0, [r4, #0x18] +_060121E4: + ldrh r0, [r1] + cmp r0, #0 + bne _060121E4 + ldrh r1, [r4, #0xac] + mov r0, #6 + bl BBP_Write + b _06012208 +_06012200: + mov r0, #1 + b _06012214 +_06012208: + mov r0, #0x10 + strh r0, [r4, #8] +_06012210: + mov r0, #0 +_06012214: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, lr} + bx lr + .align 2, 0 +_06012220: .word 0x0380FFF4 +_06012224: .word 0x00001388 +_06012228: .word 0x04808040 +_0601222C: .word 0x000005DC +_06012230: .word 0x048081A4 +_06012234: .word 0x00000823 +_06012238: .word 0x048081A0 +_0601223C: .word 0x04804000 +_06012240: .word 0x00005555 +_06012244: .word 0x000007EC +_06012248: .word 0x04808194 +_0601224C: .word 0x04808012 +_06012250: .word 0x04808004 + arm_func_end DEV_TestSignalReqCmd + + arm_func_start IntrCarrierSuppresionSignal +IntrCarrierSuppresionSignal: ; 0x06012254 + ldr r0, _060122C0 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x5c] + cmp r0, #0 + beq _06012290 + ldr r0, _060122C4 ; =0x04804000 + mov r2, #0 + strh r2, [r0] + ldr r1, _060122C8 ; =0x048080A0 + strh r2, [r0, #4] + ldrh r0, [r1] + orr r0, r0, #0x8000 + strh r0, [r1] + bx lr +_06012290: + ldr r2, _060122CC ; =0x048080AC + mov r3, #1 + strh r3, [r2] + mov r1, #0 + strh r1, [r2, #-0xa8] + mov r0, #2 + strh r0, [r2, #-0x9a] + rsb r0, r3, #0x10000 + strh r0, [r2, #-0x9c] + strh r1, [r2, #0xe8] + strh r1, [r2, #-0x6c] + bx lr + .align 2, 0 +_060122C0: .word 0x0380FFF4 +_060122C4: .word 0x04804000 +_060122C8: .word 0x048080A0 +_060122CC: .word 0x048080AC + arm_func_end IntrCarrierSuppresionSignal + + arm_func_start DEV_TestRxReqCmd +DEV_TestRxReqCmd: ; 0x060122D0 + stmdb sp!, {r4, lr} + ldr r2, _0601237C ; =0x0380FFF4 + mov r3, #1 + ldr r2, [r2] + strh r3, [r1, #2] + add r4, r2, #0x344 + ldrh r2, [r4, #8] + and r1, r2, #0xf0 + cmp r1, #0x10 + movne r0, r3 + bne _06012374 + ldrh r1, [r0, #0x10] + cmp r1, #0 + beq _06012348 + cmp r1, #1 + bne _06012370 + cmp r2, #0x10 + movne r0, r3 + bne _06012374 + ldrh r0, [r0, #0x12] + mov r1, r3 + bl WSetChannel + mov r0, #0 + strh r0, [r4, #0xc] + bl WStart + mov r0, #0x8000 + bl WSetForcePowerState + mov r0, #0x11 + strh r0, [r4, #8] + b _06012370 +_06012348: + cmp r2, #0x11 + bne _06012360 + mov r0, #0 + bl WSetForcePowerState + bl WStop + b _06012368 +_06012360: + mov r0, r3 + b _06012374 +_06012368: + mov r0, #0x10 + strh r0, [r4, #8] +_06012370: + mov r0, #0 +_06012374: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_0601237C: .word 0x0380FFF4 + arm_func_end DEV_TestRxReqCmd + + arm_func_start MA_DataReqCmd +MA_DataReqCmd: ; 0x06012380 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _06012544 ; =0x0380FFF4 + mov r8, r0 + ldr r4, [r1] + ldrh r1, [r8, #0x16] + ldr r0, _06012548 ; =0x000005E4 + add r5, r4, #0x344 + cmp r1, r0 + add r6, r4, #0x31c + movhi r0, #5 + bhi _0601253C + ldrh r0, [r6, #0x12] + cmp r0, #1 + bne _060123E0 + add r0, r8, #0x28 + bl CAM_Search + mov r7, r0 + cmp r7, #0xff + beq _060123D8 + bl CAM_GetStaState + cmp r0, #0x40 + beq _060123E4 +_060123D8: + mov r0, #0xa + b _0601253C +_060123E0: + ldrh r7, [r5, #0x88] +_060123E4: + ldr r0, _06012544 ; =0x0380FFF4 + strh r7, [r8, #0x12] + ldr r0, [r0] + ldr r0, [r0, #0x3ec] + strh r0, [r8, #0x14] + ldrh r0, [r8, #0x1e] + tst r0, #0xff + strneh r0, [r8, #0x20] + movne r0, #0 + strneh r0, [r8, #0x1e] + bne _0601241C + mov r0, r7 + bl CAM_GetTxRate + strh r0, [r8, #0x20] +_0601241C: + ldrh r0, [r8, #0x16] + cmp r0, #0 + bne _06012444 + ldrh r1, [r5, #0x8a] + mov r0, #0x1c + orr r1, r1, #0x40 + bic r1, r1, #0x4000 + strh r1, [r8, #0x24] + strh r0, [r8, #0x22] + b _06012468 +_06012444: + ldrh r0, [r5, #0x8a] + strh r0, [r8, #0x24] + ldrh r0, [r6, #0x18] + cmp r0, #0 + ldrh r0, [r8, #0x16] + addeq r0, r0, #0x1c + streqh r0, [r8, #0x22] + addne r0, r0, #0x24 + strneh r0, [r8, #0x22] +_06012468: + ldrh r0, [r6, #0x12] + cmp r0, #1 + beq _06012484 + cmp r0, #2 + cmpne r0, #3 + beq _06012500 + b _06012538 +_06012484: + add r0, r8, #0x34 + add r1, r8, #0x2e + bl WSetMacAdrs1 + add r0, r8, #0x2e + add r1, r5, #0x64 + bl WSetMacAdrs1 + cmp r7, #0 + bne _060124DC + mov r1, r8 + add r0, r4, #0x200 + bl CAM_AddBcFrame + ldr r0, _06012544 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x500 + ldrh r1, [r0, #0x32] + ldrh r2, [r0, #0x2e] + mvn r0, r1 + tst r2, r0 + bne _06012538 + mov r0, #2 + bl TxqPri + b _06012538 +_060124DC: + add r0, r8, #0x10 + bl CAM_IncFrameCount + mov r2, r8 + add r0, r4, #0x200 + add r1, r4, #0x194 + bl MoveHeapBuf + mov r0, #0 + bl TxqPri + b _06012538 +_06012500: + add r0, r8, #0x34 + add r1, r8, #0x28 + bl WSetMacAdrs1 + add r0, r8, #0x28 + add r1, r5, #0x64 + bl WSetMacAdrs1 + add r0, r8, #0x10 + bl CAM_IncFrameCount + mov r2, r8 + add r0, r4, #0x200 + add r1, r4, #0x194 + bl MoveHeapBuf + mov r0, #0 + bl TxqPri +_06012538: + mov r0, #0x81 +_0601253C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_06012544: .word 0x0380FFF4 +_06012548: .word 0x000005E4 + arm_func_end MA_DataReqCmd + + arm_func_start MA_KeyDataReqCmd +MA_KeyDataReqCmd: ; 0x0601254C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r2, _060126D8 ; =0x0380FFF4 + mov sl, r0 + ldr r2, [r2] + mov sb, #1 + add r0, r2, #0x600 + ldrh r6, [r0, #0x90] + add r4, r2, #0x31c + strh sb, [r1, #2] + ldrh r1, [r4, #0x12] + add r0, r2, #0x2c + add r5, r0, #0x400 + cmp r1, #2 + movne r0, #0xb + bne _060126D0 + ldrh r0, [sl, #0x10] + cmp r0, #0x204 + movhi r0, #5 + bhi _060126D0 + ldrh r0, [r5, #0x50] + add fp, r5, #0x50 + cmp r0, #0 + moveq sb, #0 + mov r0, #0x14 + mul r8, sb, r0 + ldrh r1, [fp, r8] + cmp r1, #0 + movne r0, #8 + bne _060126D0 + ldr r1, _060126DC ; =0x04808094 + ldrh r1, [r1] + tst r1, #0x8000 + movne r0, #8 + bne _060126D0 + add r1, r5, r8 + ldr r7, [r1, #0x58] + mov r1, #0 + strh r1, [r7] + strh r1, [r7, #4] + strh r0, [r7, #8] + ldrh r0, [sl, #0x10] + ldr r3, _060126E0 ; =MPKEY_ADRS + add r0, r0, #0x1e + strh r0, [r7, #0xa] + mov r0, #0x118 + strh r0, [r7, #0xc] + add r0, r7, #0x10 + add r1, r2, #0x3a8 + add r2, r4, #8 + bl WSetMacAdrs3 + ldrh r0, [sl, #0x12] + strh r0, [r7, #0x24] + ldrh r0, [sl, #0x10] + cmp r0, #0 + beq _06012644 + cmp sb, #0 + bne _06012634 + bl WUpdateCounter +_06012634: + ldr r1, [sl, #0x14] + ldrh r2, [sl, #0x10] + add r0, r7, #0x26 + bl DMA_Write +_06012644: + tst r6, #4 + beq _06012674 + ldrh r0, [sl, #0x10] + add r1, r7, #0x24 + add r0, r0, #2 + add r0, r1, r0 + add r0, r0, #3 + ldr r1, _060126E4 ; =0x0000B6B8 + bic r2, r0, #3 + ldr r0, _060126E8 ; =0x00001D46 + strh r1, [r2] + strh r0, [r2, #2] +_06012674: + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + mov r2, #2 + ldr r1, _060126EC ; =0x00003FFF + strh r2, [fp, r8] + add r5, r5, #0x52 + ldrh r2, [r5, r8] + and r1, r7, r1 + add r3, r2, #1 + mov r2, r1, lsr #1 + ldr r1, _060126DC ; =0x04808094 + strh r3, [r5, r8] + orr r2, r2, #0x8000 + strh r2, [r1] + ldrh r1, [r4, #0x1e] + mov r4, r0 + mov r0, r1, lsl #0x18 + movs r0, r0, lsr #0x1f + bne _060126C4 + bl WSetKSID +_060126C4: + mov r0, r4 + bl __VENEER_OS_EnableIrqMask + mov r0, #0 +_060126D0: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_060126D8: .word 0x0380FFF4 +_060126DC: .word 0x04808094 +_060126E0: .word MPKEY_ADRS +_060126E4: .word 0x0000B6B8 +_060126E8: .word 0x00001D46 +_060126EC: .word 0x00003FFF + arm_func_end MA_KeyDataReqCmd + + arm_func_start MA_MpReqCmd +MA_MpReqCmd: ; 0x060126F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + ldr r2, _06012B7C ; =0x0380FFF4 + mov sl, r0 + ldr r4, [r2] + mov sb, #1 + add r0, r4, #0x600 + ldrh r0, [r0, #0x90] + add r7, r4, #0x31c + strh sb, [r1, #2] + ldrh r1, [r7, #0x12] + str r0, [sp, #4] + add r0, r4, #0x2c + add r6, r0, #0x400 + cmp r1, #1 + movne r0, #0xb + bne _06012B70 + ldrh r0, [r6, #0x3c] + cmp r0, #0 + movne r0, #8 + bne _06012B70 + ldrh r0, [sl, #0x10] + ldr r5, [r6, #0x44] + tst r0, #0x8000 + beq _06012794 + tst r0, #2 + ldreqh r0, [r6, #0x94] + streqh r0, [sl, #0x14] + ldrh r0, [sl, #0x10] + tst r0, #4 + ldreqh r0, [r6, #0xa0] + streqh r0, [sl, #0x16] + ldrh r0, [sl, #0x10] + tst r0, #8 + ldreqh r0, [r6, #0x96] + streqh r0, [sl, #0x18] + ldrh r0, [sl, #0x10] + tst r0, #0x10 + ldreqh r0, [r6, #0x9c] + moveq sb, #0 + streqh r0, [sl, #0x1c] +_06012794: + ldrh r0, [sl, #0x1c] + cmp r0, #0x204 + movhi r0, #5 + bhi _06012B70 + mov r1, #2 + mov r8, #0 + b _060127C4 +_060127B0: + ldrh r0, [sl, #0x16] + tst r0, r1 + mov r0, r1, lsl #0x11 + addne r8, r8, #1 + mov r1, r0, lsr #0x10 +_060127C4: + cmp r1, #0 + bne _060127B0 + ldrh r0, [sl, #0x14] + strh r0, [r6, #0x94] + ldrh r0, [sl, #0x14] + tst r0, #0x8000 + beq _06012810 + ldr r1, _06012B80 ; =0x00007FFF + mov r2, #0xea + and r0, r0, r1 + strh r0, [sl, #0x14] + ldrh r0, [sl, #0x14] + sub r0, r0, #0xd0 + mov r0, r0, lsr #2 + strh r2, [r5, #0xe] + cmp r0, #0x10000 + bls _06012860 + mov r0, #5 + b _06012B70 +_06012810: + ldr r1, [sp, #4] + tst r1, #2 + movne fp, #1 + moveq fp, #0 + add r3, fp, #6 + movne r1, #2 + movne r2, #6 + add r0, r0, fp + add r3, r3, #0x200 + moveq r1, fp + moveq r2, fp + cmp r0, r3 + movhi r0, #5 + bhi _06012B70 + mov r3, r0, lsl #2 + add r3, r3, #0xd0 + add r1, r1, r3 + strh r1, [sl, #0x14] + add r1, r2, #0xea + strh r1, [r5, #0xe] +_06012860: + add r0, r0, #9 + bic fp, r0, #1 + mul r0, fp, r8 + str r0, [sp] + ldr r1, [sp] + add r0, r4, #0x188 + add r1, r1, #0x1a + bl AllocateHeapBuf + str r0, [r6, #0x90] + cmp r0, #0 + moveq r0, #8 + beq _06012B70 + mov r0, #1 + strh r0, [r6, #0x3c] + ldrh r0, [r6, #0x3e] + mov r2, #0 + add r0, r0, #1 + strh r0, [r6, #0x3e] + ldrh r0, [sl, #0x18] + add r3, r7, #8 + strh r0, [r6, #0x96] + ldrh r0, [sl, #0x16] + mov ip, #0x14 + strh r0, [r6, #0x98] + strh r2, [r6, #0x9a] + ldrh r0, [sl, #0x1c] + mov lr, #0x228 + strh r0, [r6, #0x9c] + ldrh r1, [sl, #0x12] + add r0, r5, #0x10 + strh r1, [r6, #0x9e] + strh r2, [r5] + ldrh r7, [sl, #0x16] + ldr r1, _06012B84 ; =MP_ADRS + strh r7, [r5, #2] + strh r2, [r5, #4] + strh ip, [r5, #8] + ldrh r7, [sl, #0x1c] + add r2, r4, #0x3a8 + add r7, r7, #0x22 + strh r7, [r5, #0xa] + strh lr, [r5, #0xc] + ldrh ip, [sl, #0x14] + ldrh r7, [r5, #0xe] + add ip, ip, #0xa + mla r7, ip, r8, r7 + strh r7, [r5, #0xe] + bl WSetMacAdrs3 + ldrh r0, [sl, #0x10] + tst r0, #0x8000 + ldrneh r1, [r5, #0x22] + ldrne r0, _06012B88 ; =0x0000FFFF + cmpne r1, r0 + ldreq r0, _06012B88 ; =0x0000FFFF + movne r7, #0x4000 + streqh r0, [r5, #0x22] + ldrh r0, [sl, #0x14] + moveq r7, #0 + strh r0, [r5, #0x24] + ldrh r0, [sl, #0x16] + cmp sb, #0 + strh r0, [r5, #0x26] + ldrh r0, [sl, #0x1e] + strh r0, [r5, #0x28] + ldrneh r0, [sl, #0x1c] + cmpne r0, #0 + beq _06012980 + bl WUpdateCounter + ldr r1, [sl, #0x20] + ldrh r2, [sl, #0x1c] + add r0, r5, #0x2a + bl DMA_Write +_06012980: + ldr r0, [sp, #4] + tst r0, #4 + beq _060129B4 + ldrh r0, [sl, #0x1c] + add r1, r5, #0x28 + add r0, r0, #2 + add r0, r1, r0 + add r0, r0, #3 + ldr r1, _06012B8C ; =0x0000B6B8 + bic r2, r0, #3 + ldr r0, _06012B90 ; =0x00001D46 + strh r1, [r2] + strh r0, [r2, #2] +_060129B4: + ldr r0, [r6, #0x90] + mov r1, #0x184 + strh r1, [r0, #0xc] + ldr r0, [sp] + ldr r1, [r6, #0x90] + add r0, r0, #0xb + mov r0, r0, lsr #1 + strh r0, [r1, #0xe] + ldrh r1, [sl, #0x16] + ldr r0, [r6, #0x90] + mov r3, #0 + strh r1, [r0, #0x10] + ldr r0, [r6, #0x90] + ldr sb, _06012B88 ; =0x0000FFFF + strh r8, [r0, #0x14] + ldr r0, [r6, #0x90] + mov r1, #1 + strh fp, [r0, #0x16] + ldr r0, [r6, #0x90] + mov r2, #2 + strh r3, [r0, #0x18] + ldr r0, [r6, #0x90] + add r0, r0, #0x1a + b _06012A3C +_06012A14: + ldrh ip, [sl, #0x16] + tst ip, r2 + strneh sb, [r0] + strneh r3, [r0, #2] + strneh r3, [r0, #6] + strneh r1, [r0, #4] + mov r2, r2, lsl #0x11 + addne r0, r0, fp + mov r2, r2, lsr #0x10 + add r1, r1, #1 +_06012A3C: + cmp r2, #0 + bne _06012A14 + ldrh r0, [sl, #0x14] + ldr r2, _06012B94 ; =0x048080C4 + strh r0, [r2] + ldrh r0, [r5, #0xe] + strh r0, [r2, #-4] + ldrh r1, [sl, #0x1a] + ldrh r0, [sl, #0x18] + rsb sb, r1, #0x10000 + cmp r0, #0 + bne _06012AD4 + ldrh r0, [r2, #-0xc4] + ldrh r1, [sl, #0x1c] + cmp r0, #0x1440 + ldrh r0, [sl, #0x14] + add r1, r1, #0x22 + mul r2, r0, r8 + mov r1, r1, lsl #2 + add r3, r1, #0x60 + addne r3, r3, #0x3e8 + add r0, r2, #0x388 + add r0, r3, r0 + mov r1, #0xa + add r0, r0, #0x32 + bl __VENEER__u32_div_f + mov r4, r0 + bl __VENEER_OS_DisableInterrupts + ldr r1, _06012B98 ; =0x00003FFF + ldr r2, _06012B9C ; =0x04808118 + and r1, r5, r1 + mov r1, r1, lsr #1 + orr r1, r1, #0x8000 + strh r4, [r2] + orr r1, r1, r7 + strh r1, [r2, #-0x88] + bl __VENEER_OS_RestoreInterrupts + b _06012B6C +_06012AD4: + bl __VENEER_OS_DisableInterrupts + ldr r1, _06012BA0 ; =0x048080F8 + mov r8, r0 + ldrh r0, [r1] + mov r1, #0xa + add r0, sb, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl __VENEER__u32_div_f + ldrh r3, [sl, #0x18] + add r1, r0, #3 + cmp r1, r3 + bhs _06012B3C + ldr r1, _06012B98 ; =0x00003FFF + ldr r2, _06012B9C ; =0x04808118 + sub r3, r3, r0 + and r0, r5, r1 + sub r1, r3, #1 + mov r0, r0, lsr #1 + orr r0, r0, #0x8000 + strh r1, [r2] + orr r1, r0, r7 + mov r0, r8 + strh r1, [r2, #-0x88] + bl __VENEER_OS_RestoreInterrupts + b _06012B6C +_06012B3C: + mov r0, r8 + bl __VENEER_OS_RestoreInterrupts + ldr r1, [r6, #0x90] + add r0, r4, #0x188 + bl ReleaseHeapBuf + mov r0, #0 + strh r0, [r6, #0x3c] + ldrh r1, [r6, #0x3e] + mov r0, #5 + sub r1, r1, #1 + strh r1, [r6, #0x3e] + b _06012B70 +_06012B6C: + mov r0, #0 +_06012B70: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06012B7C: .word 0x0380FFF4 +_06012B80: .word 0x00007FFF +_06012B84: .word MP_ADRS +_06012B88: .word 0x0000FFFF +_06012B8C: .word 0x0000B6B8 +_06012B90: .word 0x00001D46 +_06012B94: .word 0x048080C4 +_06012B98: .word 0x00003FFF +_06012B9C: .word 0x04808118 +_06012BA0: .word 0x048080F8 + arm_func_end MA_MpReqCmd + + arm_func_start MA_TestDataReqCmd +MA_TestDataReqCmd: ; 0x06012BA4 + stmdb sp!, {r4, lr} + mov r2, #1 + strh r2, [r1, #2] + mov r4, r0 + rsb r0, r2, #0x10000 + strh r0, [r4, #0xc] + mov r0, #0 + strh r0, [r4, #0x12] + ldrh r1, [r4, #0x16] + add r0, r4, #0x10 + strh r1, [r4, #0x22] + bl CAM_IncFrameCount + ldr r0, _06012C00 ; =0x0380FFF4 + mov r2, r4 + ldr r1, [r0] + add r0, r1, #0x200 + add r1, r1, #0x194 + bl MoveHeapBuf + mov r0, #0 + bl TxqPri + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06012C00: .word 0x0380FFF4 + arm_func_end MA_TestDataReqCmd + + arm_func_start MA_ClrDataReqCmd +MA_ClrDataReqCmd: ; 0x06012C04 + stmdb sp!, {r4, lr} + mov r2, #1 + strh r2, [r1, #2] + mov r4, r0 + ldrh r0, [r4, #0x10] + tst r0, #1 + beq _06012C24 + bl ClearTxKeyData +_06012C24: + ldrh r0, [r4, #0x10] + tst r0, #2 + beq _06012C34 + bl ClearTxMp +_06012C34: + ldrh r0, [r4, #0x10] + tst r0, #4 + beq _06012C44 + bl ClearTxData +_06012C44: + mov r0, #0 + ldmia sp!, {r4, lr} + bx lr + arm_func_end MA_ClrDataReqCmd + + arm_func_start IssueMaDataConfirm +IssueMaDataConfirm: ; 0x06012C50 + stmdb sp!, {r3, lr} + ldrh r2, [r1, #0xe] + mov r3, #2 + add lr, r1, r2, lsl #1 + ldrh ip, [lr, #0x10] + mov r2, #0 + strh ip, [r1, #0xc] + strh r3, [lr, #0x12] + strh r2, [lr, #0x14] + ldrh r2, [r1, #0x18] + strh r2, [lr, #0x16] + bl SendMessageToWmDirect + ldmia sp!, {r3, lr} + bx lr + arm_func_end IssueMaDataConfirm + + arm_func_start TxqPri +TxqPri: ; 0x06012C88 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r1, _06012E9C ; =0x0380FFF4 + mov sl, r0 + ldr r2, [r1] + mov r0, #0xc + add r1, r2, #0x194 + mla fp, sl, r0, r1 + add r0, r2, #0x2c + ldrh r1, [fp, #8] + add r5, r0, #0x400 + mov r0, #0x14 + mla r6, sl, r0, r5 + cmp r1, #0 + add r4, r2, #0x344 + beq _06012E90 + mov r0, #0x1000000 + bl __VENEER_OS_DisableIrqMask + ldrh r1, [r6] + str r0, [sp] + cmp r1, #0 + beq _06012CE8 + bl __VENEER_OS_EnableIrqMask + b _06012E90 +_06012CE8: + ldr r7, [fp] + mvn r0, #0 + str r0, [sp, #8] +_06012CF4: + ldr r0, [sp, #8] + cmp r7, r0 + bne _06012D0C + ldr r0, [sp] + bl __VENEER_OS_EnableIrqMask + b _06012E90 +_06012D0C: + mov r0, r7 + str r7, [sp, #4] + bl GetHeapBufNextAdrs + mov r1, r7 + add r8, r1, #0x10 + mov r7, r0 + ldrh sb, [r8, #2] + mov r0, r8 + bl CheckFrameTimeout + cmp r0, #0 + beq _06012D70 + ldrh r1, [r5, #0xae] + mov r0, r8 + add r1, r1, #1 + strh r1, [r5, #0xae] + mov r1, #2 + strh r1, [r8, #8] + ldrh r2, [r6, #4] + mov r1, #0 + add r2, r2, #1 + strh r2, [r6, #4] + ldr r2, [r6, #0x10] + mov lr, pc + bx r2 + b _06012CF4 +_06012D70: + cmp sl, #0 + beq _06012D90 + cmp sl, #1 + bne _06012DD0 + mov r0, sb + bl CAM_GetStaState + cmp r0, #0x40 + bne _06012DD0 +_06012D90: + mov r0, sb + bl CAM_IsActive + cmp r0, #0 + beq _06012CF4 + mov r0, sb + bl CAM_GetStaState + cmp r0, #0x40 + beq _06012DD0 + mov r2, #2 + mov r0, fp + sub r1, r8, #0x10 + strh r2, [r8, #8] + bl IssueMaDataConfirm + mov r0, r8 + bl CAM_DecFrameCount + b _06012CF4 +_06012DD0: + mov r0, #1 + strh r0, [r6] + ldrh r0, [r6, #2] + add r0, r0, #1 + strh r0, [r6, #2] + str r8, [r6, #0xc] + ldrh r0, [r4, #0x10] + ldr r5, [r6, #8] + cmp r0, #0 + bne _06012E00 + mov r0, #2 + bl WSetPowerState +_06012E00: + ldr r1, [sp, #4] + mov r0, r5 + bl CopyTxFrmToMacBuf + ldrh r0, [r4, #0xc] + cmp r0, #1 + bne _06012E30 + mov r0, sb + bl CAM_GetFrameCount + cmp r0, #1 + ldrhih r0, [r5, #0xc] + orrhi r0, r0, #0x2000 + strhih r0, [r5, #0xc] +_06012E30: + ldr r1, _06012EA0 ; =0x00003FFF + ldr r0, _06012EA4 ; =0x048080A0 + ldrh r4, [r8, #0x14] + and r2, r5, r1 + and r1, r4, #0xc + cmp r1, #4 + mov r1, r2, lsr #1 + add r3, r0, sl, lsl #2 + moveq r0, r1, lsl #0x10 + moveq r0, r0, lsr #0x10 + orreq r0, r0, #0xa000 + streqh r0, [r3] + beq _06012E88 + and r0, r4, #0xfc + cmp r0, #0x50 + mov r0, r1, lsl #0x10 + moveq r0, r0, lsr #0x10 + orreq r0, r0, #0x9000 + streqh r0, [r3] + movne r0, r0, lsr #0x10 + orrne r0, r0, #0x8000 + strneh r0, [r3] +_06012E88: + ldr r0, [sp] + bl __VENEER_OS_EnableIrqMask +_06012E90: + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06012E9C: .word 0x0380FFF4 +_06012EA0: .word 0x00003FFF +_06012EA4: .word 0x048080A0 + arm_func_end TxqPri + + arm_func_start CopyTxFrmToMacBuf +CopyTxFrmToMacBuf: ; 0x06012EA8 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + ldrh r1, [r4, #0x24] + mov r5, r0 + tst r1, #0x4000 + beq _06012F84 + ldr r0, _06012FFC ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #3 + bne _06012EDC + bl WUpdateCounter +_06012EDC: + ldrh r1, [r4, #0xc] + ldr r0, _06013000 ; =0x0000FFFF + cmp r1, r0 + bne _06012F04 + ldrh r3, [r4, #0x16] + mov r0, r5 + add r1, r4, #0x18 + add r2, r4, #0x3c + bl DMA_WepWriteHeaderData + b _06012F18 +_06012F04: + ldr r2, [r4, #0x3c] + ldrh r3, [r4, #0x16] + mov r0, r5 + add r1, r4, #0x18 + bl DMA_WepWriteHeaderData +_06012F18: + ldr r3, _06013004 ; =0x04808044 + ldr r1, _06012FFC ; =0x0380FFF4 + ldrh r2, [r3] + ldrh r0, [r3] + add r0, r2, r0, lsl #8 + strh r0, [r5, #0x24] + ldr r0, [r1] + ldrh r2, [r3] + add r0, r0, #0x300 + ldrh r0, [r0, #0x36] + and r2, r2, #0xff + orr r0, r2, r0, lsl #14 + strh r0, [r5, #0x26] + ldr r0, [r1] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #8 + beq _06012FB8 + ldrh r0, [r4, #0x22] + add r1, r5, #0xc + add r0, r1, r0 + sub r0, r0, #7 + bic r1, r0, #1 + mov r0, #0 + strh r0, [r1] + strh r0, [r1, #2] + b _06012FB8 +_06012F84: + ldrh r2, [r4, #0xc] + ldr r1, _06013000 ; =0x0000FFFF + cmp r2, r1 + bne _06012FA8 + ldrh r2, [r4, #0x16] + add r1, r4, #0x18 + add r2, r2, #0x24 + bl DMA_Write + b _06012FB8 +_06012FA8: + ldr r2, [r4, #0x3c] + ldrh r3, [r4, #0x16] + add r1, r4, #0x18 + bl DMA_WriteHeaderData +_06012FB8: + ldr r0, _06012FFC ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #4 + beq _06012FF4 + ldrh r0, [r4, #0x22] + add r1, r5, #0xc + add r0, r1, r0 + sub r0, r0, #1 + ldr r1, _06013008 ; =0x0000B6B8 + bic r2, r0, #3 + ldr r0, _0601300C ; =0x00001D46 + strh r1, [r2] + strh r0, [r2, #2] +_06012FF4: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06012FFC: .word 0x0380FFF4 +_06013000: .word 0x0000FFFF +_06013004: .word 0x04808044 +_06013008: .word 0x0000B6B8 +_0601300C: .word 0x00001D46 + arm_func_end CopyTxFrmToMacBuf + + arm_func_start CheckFrameTimeout +CheckFrameTimeout: ; 0x06013010 + ldr r1, _0601308C ; =0x0380FFF4 + ldrh r2, [r0, #0x14] + ldr r3, [r1] + mov r1, r2, lsl #0x1c + add ip, r3, #0x344 + ldrh r3, [ip, #0x8c] + movs r1, r1, lsr #0x1e + mov r1, r3, lsl #0x13 + mov r3, r1, lsr #0x10 + bne _06013064 + ldrh r1, [ip, #0xc] + cmp r1, #1 + bne _0601306C + mov r1, r2, lsl #0x18 + mov r1, r1, lsr #0x1c + cmp r1, #1 + cmpne r1, #3 + cmpne r1, #0xb + moveq r1, r3, lsl #0xd + moveq r3, r1, lsr #0x10 + b _0601306C +_06013064: + mov r1, r3, lsl #0xd + mov r3, r1, lsr #0x10 +_0601306C: + ldr r1, [ip, #0xa8] + ldrh r0, [r0, #4] + sub r0, r1, r0 + mov r0, r0, lsl #0x10 + cmp r3, r0, lsr #16 + movlo r0, #1 + movhs r0, #0 + bx lr + .align 2, 0 +_0601308C: .word 0x0380FFF4 + arm_func_end CheckFrameTimeout + + arm_func_start TxqEndData +TxqEndData: ; 0x06013090 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _06013208 ; =0x0380FFF4 + mov sb, r0 + ldr r4, [r2] + mov r8, r1 + add r5, r4, #0x194 + add r6, r4, #0x344 + sub r7, sb, #0x10 + bl CAM_DecFrameCount + ldrh r0, [sb, #8] + tst r0, #2 + bne _06013124 + ldr r0, [r4, #0x53c] + add r0, r0, #1 + str r0, [r4, #0x53c] + ldrh r0, [sb, #0x14] + mov r0, r0, lsl #0x17 + movs r0, r0, lsr #0x1f + beq _06013100 + ldrh r0, [sb, #0x24] + tst r0, #1 + ldrne r0, [r4, #0x550] + addne r0, r0, #1 + strne r0, [r4, #0x550] + ldreq r0, [r4, #0x54c] + addeq r0, r0, #1 + streq r0, [r4, #0x54c] + b _06013130 +_06013100: + ldrh r0, [sb, #0x18] + tst r0, #1 + ldrne r0, [r4, #0x550] + addne r0, r0, #1 + strne r0, [r4, #0x550] + ldreq r0, [r4, #0x54c] + addeq r0, r0, #1 + streq r0, [r4, #0x54c] + b _06013130 +_06013124: + ldr r0, [r4, #0x540] + add r0, r0, #1 + str r0, [r4, #0x540] +_06013130: + ldrh r0, [sb, #0x14] + mov r1, r7 + mov r0, r0, lsl #0x11 + movs r0, r0, lsr #0x1f + ldrne r0, [r4, #0x554] + addne r0, r0, #1 + strne r0, [r4, #0x554] + mov r0, r5 + bl IssueMaDataConfirm + ldr r0, _06013208 ; =0x0380FFF4 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x400 + strh r1, [r0, #0x2c] + ldrh r0, [sb, #2] + bl CAM_GetPowerMgtMode + cmp r0, #0 + beq _0601318C + ldrh r0, [sb, #0x14] + tst r0, #0x2000 + bne _0601318C + ldrh r0, [sb, #2] + bl CAM_SetDoze +_0601318C: + cmp r8, #0 + beq _06013200 + ldrh r0, [r5, #8] + cmp r0, #0 + beq _060131AC + mov r0, #0 + bl TxqPri + b _06013200 +_060131AC: + ldrh r0, [r6, #0xc] + add r0, r0, #0xfe + add r0, r0, #0xff00 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bhi _06013200 + ldrh r0, [r6, #8] + cmp r0, #0x40 + bne _06013200 + ldrh r0, [r6, #0xe] + cmp r0, #0 + beq _06013200 + ldrh r0, [r6, #0x88] + bl CAM_GetFrameCount + cmp r0, #0 + ldreqh r0, [r6, #0x8e] + cmpeq r0, #0 + bne _06013200 + mov r0, #1 + bl WSetPowerState +_06013200: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_06013208: .word 0x0380FFF4 + arm_func_end TxqEndData + + arm_func_start TxqEndManCtrl +TxqEndManCtrl: ; 0x0601320C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r2, _060136D4 ; =0x0380FFF4 + mov sl, r0 + ldr r4, [r2] + ldrh r2, [sl, #8] + add r0, r4, #4 + ldrh r7, [sl, #2] + mov sb, r1 + tst r2, #2 + add r8, r4, #0x344 + add r5, r0, #0x400 + add r6, r4, #0x1a0 + bne _06013294 + ldr r0, [r4, #0x53c] + add r0, r0, #1 + str r0, [r4, #0x53c] + ldrh r0, [sl, #0x18] + tst r0, #1 + ldrne r0, [r4, #0x550] + addne r0, r0, #1 + strne r0, [r4, #0x550] + ldreq r0, [r4, #0x54c] + addeq r0, r0, #1 + streq r0, [r4, #0x54c] + mov r0, r7 + bl CAM_GetPowerMgtMode + cmp r0, #0 + beq _060132A0 + ldrh r0, [sl, #0x14] + tst r0, #0x2000 + bne _060132A0 + mov r0, r7 + bl CAM_SetDoze + b _060132A0 +_06013294: + ldr r0, [r4, #0x540] + add r0, r0, #1 + str r0, [r4, #0x540] +_060132A0: + ldrh r0, [sl, #0x14] + mov r0, r0, lsl #0x11 + movs r0, r0, lsr #0x1f + ldrne r0, [r4, #0x554] + addne r0, r0, #1 + strne r0, [r4, #0x554] + ldrh r0, [sl, #0xc] + ldr r1, [r4, #0x544] + and r0, r0, #0xff + add r0, r1, r0 + str r0, [r4, #0x544] + ldrh r0, [sl, #0x14] + and r4, r0, #0xfc + cmp r4, #0xa0 + bhi _060132FC + bhs _06013464 + cmp r4, #0x10 + bhi _060132F0 + beq _060133A0 + b _0601368C +_060132F0: + cmp r4, #0x30 + beq _060133A0 + b _0601368C +_060132FC: + cmp r4, #0xb0 + bhi _0601330C + beq _06013318 + b _0601368C +_0601330C: + cmp r4, #0xc0 + beq _06013548 + b _0601368C +_06013318: + cmp r7, #0 + beq _0601368C + ldrh r0, [sl, #8] + tst r0, #2 + bne _0601368C + ldrh r1, [sl, #0x2c] + cmp r1, #0 + ldreqh r0, [sl, #0x2e] + cmpeq r0, #2 + ldreqh r0, [sl, #0x30] + cmpeq r0, #0 + bne _06013368 + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x30 + bl CAM_SetStaState + ldrh r1, [sl, #0x2c] + add r0, sl, #0x18 + bl MLME_IssueAuthIndication + b _0601368C +_06013368: + cmp r1, #1 + ldreqh r0, [sl, #0x2e] + cmpeq r0, #4 + ldreqh r0, [sl, #0x30] + cmpeq r0, #0 + bne _0601368C + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x30 + bl CAM_SetStaState + ldrh r1, [sl, #0x2c] + add r0, sl, #0x18 + bl MLME_IssueAuthIndication + b _0601368C +_060133A0: + cmp r7, #0 + beq _0601368C + ldrh r0, [sl, #8] + tst r0, #2 + bne _06013418 + ldrh r0, [sl, #0x2e] + cmp r0, #0 + bne _0601368C + mov r0, r7 + bl CAM_GetStaState + cmp r0, #0x30 + bne _0601368C + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x40 + bl CAM_SetStaState + ldrh r2, [sl, #0x12] + cmp r4, #0x10 + add r3, sl, #0x14 + bne _06013404 + ldrh r1, [sl, #0x30] + add r0, sl, #0x18 + add r2, r3, r2 + bl MLME_IssueAssIndication + b _0601368C +_06013404: + ldrh r1, [sl, #0x30] + add r0, sl, #0x18 + add r2, r3, r2 + bl MLME_IssueReAssIndication + b _0601368C +_06013418: + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + bl CAM_ReleaseAID + add r0, sl, #0x18 + mov r1, #1 + mov r2, #0 + bl MakeDeAuthFrame + cmp r0, #0 + beq _0601368C + mov r1, #2 + strh r1, [r0] + cmp sb, #0 + beq _0601345C + bl SetManCtrlFrame + mov r0, #1 + bl TxqPri + b _0601368C +_0601345C: + bl SetManCtrlFrame + b _0601368C +_06013464: + ldrh r0, [r8, #0xc] + cmp r0, #1 + bne _060134F4 + cmp r7, #0 + beq _0601349C + mov r0, r7 + bl CAM_GetStaState + cmp r0, #0x30 + bls _0601350C + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x30 + bl CAM_SetStaState + b _0601350C +_0601349C: + ldrh r0, [sl, #0x18] + tst r0, #1 + beq _0601350C + ldr r4, _060136D4 ; =0x0380FFF4 + mov r8, #1 + mov r7, #0x30 + b _060134DC +_060134B8: + mov r0, r8 + bl CAM_GetStaState + cmp r0, #0x30 + bls _060134D8 + mov r0, r8, lsl #0x10 + mov r1, r7 + mov r0, r0, lsr #0x10 + bl CAM_SetStaState +_060134D8: + add r8, r8, #1 +_060134DC: + ldr r0, [r4] + add r0, r0, #0x300 + ldrh r0, [r0, #0x22] + cmp r8, r0 + blo _060134B8 + b _0601350C +_060134F4: + ldrh r0, [r8, #8] + cmp r0, #0x30 + bls _0601350C + mov r0, #0x30 + bl WSetStaState + bl WClearAids +_0601350C: + ldrh r0, [r5] + cmp r0, #0x71 + ldreq r0, [r5, #4] + cmpeq sl, r0 + bne _0601368C + ldrh r0, [sl, #8] + tst r0, #2 + ldr r0, [r5, #0x1c] + moveq r1, #0 + movne r1, #0xc + strh r1, [r0, #4] + mov r0, #0 + strh r0, [r5] + bl IssueMlmeConfirm + b _0601368C +_06013548: + ldrh r0, [r8, #0xc] + cmp r0, #1 + bne _060135D8 + cmp r7, #0 + beq _06013580 + mov r0, r7 + bl CAM_GetStaState + cmp r0, #0x20 + bls _060135F0 + mov r0, r7, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + b _060135F0 +_06013580: + ldrh r0, [sl, #0x18] + tst r0, #1 + beq _060135F0 + ldr r4, _060136D4 ; =0x0380FFF4 + mov r8, #1 + mov fp, #0x20 + b _060135C0 +_0601359C: + mov r0, r8 + bl CAM_GetStaState + cmp r0, #0x20 + bls _060135BC + mov r0, r8, lsl #0x10 + mov r1, fp + mov r0, r0, lsr #0x10 + bl CAM_SetStaState +_060135BC: + add r8, r8, #1 +_060135C0: + ldr r0, [r4] + add r0, r0, #0x300 + ldrh r0, [r0, #0x22] + cmp r8, r0 + blo _0601359C + b _060135F0 +_060135D8: + ldrh r0, [r8, #8] + cmp r0, #0x20 + bls _060135F0 + mov r0, #0x20 + bl WSetStaState + bl WClearAids +_060135F0: + ldrh r0, [r5] + cmp r0, #0x41 + ldreq r0, [r5, #4] + cmpeq sl, r0 + bne _06013628 + ldrh r0, [sl, #8] + tst r0, #2 + ldr r0, [r5, #0x1c] + moveq r1, #0 + movne r1, #0xc + strh r1, [r0, #4] + mov r0, #0 + strh r0, [r5] + bl IssueMlmeConfirm +_06013628: + ldrh r0, [sl] + cmp r0, #1 + bne _06013678 + cmp r7, #0 + beq _06013668 + ldr r0, _060136D4 ; =0x0380FFF4 + mov r2, #1 + ldr r1, [r0] + mov r0, r7, lsl #0x10 + add r1, r1, #0x500 + ldrh r3, [r1, #0x34] + mvn r2, r2, lsl r7 + and r2, r3, r2 + mov r0, r0, lsr #0x10 + strh r2, [r1, #0x34] + bl CAM_Delete +_06013668: + add r0, sl, #0x18 + mov r1, #1 + bl MLME_IssueDeAuthIndication + b _0601368C +_06013678: + cmp r0, #2 + bne _0601368C + ldrh r1, [sl, #0x2c] + add r0, sl, #0x18 + bl MLME_IssueDeAuthIndication +_0601368C: + mov r0, sl + bl CAM_DecFrameCount + mov r0, r6 + sub r1, sl, #0x10 + bl ReleaseHeapBuf + ldr r0, _060136D4 ; =0x0380FFF4 + mov r1, #0 + ldr r0, [r0] + cmp sb, #0 + add r0, r0, #0x400 + strh r1, [r0, #0x40] + ldrneh r0, [r6, #8] + cmpne r0, #0 + beq _060136CC + mov r0, #1 + bl TxqPri +_060136CC: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_060136D4: .word 0x0380FFF4 + arm_func_end TxqEndManCtrl + + arm_func_start TxqEndPsPoll +TxqEndPsPoll: ; 0x060136D8 + ldr r2, _0601373C ; =0x0380FFF4 + ldrh r1, [r0, #4] + ldr r3, [r2] + and r1, r1, #0xff + ldr r2, [r3, #0x544] + add r1, r2, r1 + str r1, [r3, #0x544] + ldrh r0, [r0] + tst r0, #2 + ldrne r0, [r3, #0x540] + addne r0, r0, #1 + strne r0, [r3, #0x540] + bne _06013724 + ldr r0, [r3, #0x53c] + add r0, r0, #1 + str r0, [r3, #0x53c] + ldr r0, [r3, #0x54c] + add r0, r0, #1 + str r0, [r3, #0x54c] +_06013724: + ldr r0, _0601373C ; =0x0380FFF4 + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x400 + strh r1, [r0, #0x54] + bx lr + .align 2, 0 +_0601373C: .word 0x0380FFF4 + arm_func_end TxqEndPsPoll + + arm_func_start TxqEndBroadCast +TxqEndBroadCast: ; 0x06013740 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _06013844 ; =0x0380FFF4 + mov r6, r0 + ldr r2, [r2] + mov r5, r1 + ldr r1, [r2, #0x550] + add r4, r2, #0x17c + add r1, r1, #1 + str r1, [r2, #0x550] + ldrh r1, [r6, #0x14] + mov r1, r1, lsl #0x1c + movs r1, r1, lsr #0x1e + bne _06013798 + bl CAM_IncFrameCount + add r0, r4, #0x30 + add r1, r4, #0x24 + sub r2, r6, #0x10 + bl MoveHeapBuf + mov r0, r6 + mov r1, #0 + bl TxqEndManCtrl + b _060137A4 +_06013798: + add r0, r4, #0x30 + sub r1, r6, #0x10 + bl IssueMaDataConfirm +_060137A4: + ldr r1, _06013844 ; =0x0380FFF4 + mov r2, #0 + ldr r0, [r1] + add r0, r0, #0x400 + strh r2, [r0, #0x54] + ldr r0, [r1] + ldr r0, [r0, #0x45c] + ldrh r0, [r0, #0xc] + mov r0, r0, lsl #0x12 + movs r0, r0, lsr #0x1f + bne _06013814 + ldr r1, _06013848 ; =0x048080AC + mov r0, #8 + strh r0, [r1] + mov r0, #5 + strh r0, [r1, #2] + cmp r5, #0 + beq _06013814 + ldrh r0, [r4, #0x2c] + cmp r0, #0 + beq _06013800 + mov r0, #1 + bl TxqPri +_06013800: + ldrh r0, [r4, #0x20] + cmp r0, #0 + beq _06013814 + mov r0, #0 + bl TxqPri +_06013814: + ldrh r0, [r4, #0x38] + cmp r0, #0 + beq _06013834 + cmp r5, #0 + beq _0601383C + mov r0, #2 + bl TxqPri + b _0601383C +_06013834: + mov r0, #0 + bl CAM_ClrTIMElementBitmap +_0601383C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06013844: .word 0x0380FFF4 +_06013848: .word 0x048080AC + arm_func_end TxqEndBroadCast + + arm_func_start TxEndKeyData +TxEndKeyData: ; 0x0601384C + ldr r2, [r0, #8] + ldr r1, _06013890 ; =0x0380FFF4 + ldrh r3, [r2, #4] + ldr r2, [r1] + ands r3, r3, #0xff + ldreq r1, [r2, #0x5a8] + addeq r1, r1, #1 + streq r1, [r2, #0x5a8] + ldrne r1, [r2, #0x5a4] + addne r1, r1, r3 + strne r1, [r2, #0x5a4] + ldrh r2, [r0, #4] + mov r1, #0 + add r2, r2, #1 + strh r2, [r0, #4] + strh r1, [r0] + bx lr + .align 2, 0 +_06013890: .word 0x0380FFF4 + arm_func_end TxEndKeyData + + arm_func_start ClearTxKeyData +ClearTxKeyData: ; 0x06013894 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06013900 ; =0x0380FFF4 + mov r0, #0x1000000 + ldr r1, [r1] + add r1, r1, #0x2c + add r4, r1, #0x400 + bl __VENEER_OS_DisableIrqMask + ldr r1, _06013900 ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r1] + add r0, r0, #0x300 + ldrh r0, [r0, #0x3a] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1f + bne _060138D8 + mov r0, #0 + bl WClearKSID +_060138D8: + ldr r0, _06013904 ; =0x048080B4 + mov r1, #0xc0 + strh r1, [r0] + mov r1, #0 + strh r1, [r4, #0x50] + mov r0, r5 + strh r1, [r4, #0x64] + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06013900: .word 0x0380FFF4 +_06013904: .word 0x048080B4 + arm_func_end ClearTxKeyData + + arm_func_start ClearTxMp +ClearTxMp: ; 0x06013908 + stmdb sp!, {r4, lr} + ldr r1, _06013954 ; =0x0380FFF4 + mov r0, #0x1000000 + ldr r1, [r1] + add r1, r1, #0x2c + add r4, r1, #0x400 + bl __VENEER_OS_DisableIrqMask + ldr r1, _06013958 ; =0x048080B4 + mov r2, #2 + strh r2, [r1] + ldrh r1, [r4, #0x3c] + mov r4, r0 + cmp r1, #0 + beq _06013944 + bl WlIntrMpEndTask +_06013944: + mov r0, r4 + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06013954: .word 0x0380FFF4 +_06013958: .word 0x048080B4 + arm_func_end ClearTxMp + + arm_func_start ClearTxData +ClearTxData: ; 0x0601395C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _060139FC ; =0x0380FFF4 + mov r0, #0x1000000 + ldr r1, [r1] + add r1, r1, #0x2c + add r4, r1, #0x400 + bl __VENEER_OS_DisableIrqMask + ldr r1, _060139FC ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r1] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + ldr r0, _06013A00 ; =0x048080B4 + bne _060139C4 + mov r1, #9 + strh r1, [r0] + ldrh r0, [r4, #0x28] + cmp r0, #0 + beq _060139B4 + mov r0, #2 + bl ClearQueuedPri +_060139B4: + mov r0, #2 + mov r1, #1 + bl MessageDeleteTx + b _060139CC +_060139C4: + mov r1, #1 + strh r1, [r0] +_060139CC: + ldrh r0, [r4] + cmp r0, #0 + beq _060139E0 + mov r0, #0 + bl ClearQueuedPri +_060139E0: + mov r0, #0 + mov r1, #1 + bl MessageDeleteTx + mov r0, r5 + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060139FC: .word 0x0380FFF4 +_06013A00: .word 0x048080B4 + arm_func_end ClearTxData + + arm_func_start ClearQueuedPri +ClearQueuedPri: ; 0x06013A04 + stmdb sp!, {r3, lr} + ldr r2, _06013A64 ; =0x0380FFF4 + mov r1, #0x14 + ldr r2, [r2] + mul r1, r0, r1 + add r0, r2, #0x2c + add r2, r0, #0x400 + ldrh r0, [r2, r1] + add r2, r2, r1 + cmp r0, #0 + beq _06013A5C + ldr r0, [r2, #8] + ldrh r1, [r0] + ldr r0, [r2, #0xc] + cmp r1, #0 + moveq r1, #2 + strh r1, [r0, #8] + ldr r0, [r2, #0xc] + ldr r2, [r2, #0x10] + mov r1, #0 + mov lr, pc + bx r2 +_06013A5C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06013A64: .word 0x0380FFF4 + arm_func_end ClearQueuedPri + + arm_func_start ResetTxqPri +ResetTxqPri: ; 0x06013A68 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _06013AE8 ; =0x0380FFF4 + mov r7, r0 + mov r0, #0x14 + ldr r1, [r1] + mul r4, r7, r0 + add r0, r1, #0x2c + add r5, r0, #0x400 + mov r0, #0x1000000 + add r6, r5, r4 + bl __VENEER_OS_DisableIrqMask + ldr r1, _06013AEC ; =Pri2QBit + mov r2, r7, lsl #1 + ldrh r2, [r1, r2] + ldr r1, _06013AF0 ; =0x048080B4 + strh r2, [r1] + ldrh r1, [r5, r4] + cmp r1, #0 + beq _06013ADC + ldr r2, [r6, #0xc] + ldrh r1, [r2, #0x14] + tst r1, #0x4000 + ldreq r1, [r6, #8] + ldreqh r1, [r1, #4] + streqh r1, [r2, #0xc] + ldr r2, [r6, #8] + ldr r1, [r6, #0xc] + ldrh r2, [r2, #0x22] + strh r2, [r1, #0x2a] +_06013ADC: + bl __VENEER_OS_EnableIrqMask + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06013AE8: .word 0x0380FFF4 +_06013AEC: .word Pri2QBit +_06013AF0: .word 0x048080B4 + arm_func_end ResetTxqPri + + arm_func_start DeleteTxFrames +DeleteTxFrames: ; 0x06013AF4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov fp, r0 + mov r7, #0 + bl CAM_GetFrameCount + cmp r0, #0 + beq _06013BE0 + mov r8, r7 +_06013B10: + ldr r0, _06013BE8 ; =0x0380FFF4 + mov r1, #0xc + ldr r2, [r0] + mul sl, r8, r1 + sub r0, r1, #0xd + add r1, r2, sl + ldr r5, [r1, #0x194] + cmp r5, r0 + beq _06013BD4 + mov r0, #0x14 + mul sb, r8, r0 + mvn r4, #0 +_06013B40: + mov r0, r5 + bl GetHeapBufNextAdrs + add r6, r5, #0x10 + ldrh r1, [r6, #2] + str r0, [sp] + cmp r1, fp + bne _06013BC4 + cmp r8, #1 + ldrne r0, _06013BE8 ; =0x0380FFF4 + ldrne r0, [r0] + addne r0, sb, r0 + ldrne r0, [r0, #0x438] + cmpne r6, r0 + bne _06013B94 + mov r0, r6 + bl CAM_DecFrameCount + mov r1, #0 + mov r0, r6 + strh r1, [r6, #2] + bl CAM_IncFrameCount + b _06013BC4 +_06013B94: + mov r0, #2 + strh r0, [r6, #8] + mov r0, r6 + bl CAM_DecFrameCount + ldr r0, _06013BE8 ; =0x0380FFF4 + mov r1, r5 + ldr r0, [r0] + add r0, r0, #0x194 + add r0, r0, sl + bl IssueMaDataConfirm + cmp r7, #0 + moveq r7, #1 +_06013BC4: + ldr r5, [sp] + mov r0, r5 + cmp r0, r4 + bne _06013B40 +_06013BD4: + add r8, r8, #1 + cmp r8, #3 + blo _06013B10 +_06013BE0: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06013BE8: .word 0x0380FFF4 + arm_func_end DeleteTxFrames + + arm_func_start DeleteTxFrameByAdrs +DeleteTxFrameByAdrs: ; 0x06013BEC + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _06013C98 ; =0x0380FFF4 + ldrh r1, [r0] + ldr r2, [r4] + tst r1, #1 + beq _06013C40 + add r0, r2, #0x300 + ldrh r0, [r0, #0x22] + mov r5, #1 + cmp r0, #1 + bls _06013C90 + b _06013C28 +_06013C1C: + mov r0, r5 + bl DeleteTxFrames + add r5, r5, #1 +_06013C28: + ldr r0, [r4] + add r0, r0, #0x300 + ldrh r0, [r0, #0x22] + cmp r5, r0 + blo _06013C1C + b _06013C90 +_06013C40: + bl CAM_Search + mov r4, r0 + cmp r4, #0xff + beq _06013C54 + bl DeleteTxFrames +_06013C54: + ldr r0, _06013C98 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x2e] + cmp r0, #1 + bne _06013C90 + mov r0, r4 + bl CAM_GetStaState + cmp r0, #0x40 + bne _06013C90 + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + bl ClearTxKeyData +_06013C90: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06013C98: .word 0x0380FFF4 + arm_func_end DeleteTxFrameByAdrs + + arm_func_start DeleteAllTxFrames +DeleteAllTxFrames: ; 0x06013C9C + stmdb sp!, {r4, lr} + ldr r0, _06013D80 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x300 + ldrh r1, [r0, #0x50] + add r0, r2, #0x2c + cmp r1, #1 + add r4, r0, #0x400 + beq _06013CD0 + cmp r1, #2 + cmpne r1, #3 + beq _06013D2C + b _06013D54 +_06013CD0: + mov r0, #0 + mov r1, #1 + bl MessageDeleteTx + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #2 + mov r1, #1 + bl MessageDeleteTx + ldrh r0, [r4, #0x3c] + cmp r0, #0 + beq _06013D78 + mov r0, #0 + strh r0, [r4, #0x3c] + ldrh r1, [r4, #0x3e] + ldr r0, _06013D80 ; =0x0380FFF4 + sub r1, r1, #1 + strh r1, [r4, #0x3e] + ldr r0, [r0] + ldr r1, [r4, #0x90] + add r0, r0, #0x188 + bl ReleaseHeapBuf + b _06013D78 +_06013D2C: + mov r0, #0 + mov r1, #1 + bl MessageDeleteTx + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #2 + mov r1, #0 + bl MessageDeleteTx + b _06013D78 +_06013D54: + mov r0, #0 + mov r1, r0 + bl MessageDeleteTx + mov r0, #1 + mov r1, #0 + bl MessageDeleteTx + mov r0, #2 + mov r1, #0 + bl MessageDeleteTx +_06013D78: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06013D80: .word 0x0380FFF4 + arm_func_end DeleteAllTxFrames + + arm_func_start MessageDeleteTx +MessageDeleteTx: ; 0x06013D84 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r5, _06013E0C ; =0x0380FFF4 + mov r2, #0xc + mov sl, r0 + mul r8, sl, r2 + ldr r3, [r5] + sub r0, r2, #0xd + add r2, r3, r8 + ldr r6, [r2, #0x194] + mov sb, r1 + cmp r6, r0 + beq _06013E04 + mov fp, #2 + mvn r4, #0 +_06013DBC: + mov r0, r6 + bl GetHeapBufNextAdrs + mov r7, r0 + cmp sl, #2 + beq _06013DD8 + add r0, r6, #0x10 + bl CAM_DecFrameCount +_06013DD8: + strh fp, [r6, #0x18] + cmp sb, #0 + beq _06013DF8 + ldr r0, [r5] + mov r1, r6 + add r0, r0, #0x194 + add r0, r0, r8 + bl IssueMaDataConfirm +_06013DF8: + mov r6, r7 + cmp r7, r4 + bne _06013DBC +_06013E04: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06013E0C: .word 0x0380FFF4 + arm_func_end MessageDeleteTx + + arm_func_start TxManCtrlFrame +TxManCtrlFrame: ; 0x06013E10 + stmdb sp!, {r3, lr} + bl SetManCtrlFrame + mov r0, #1 + bl TxqPri + ldmia sp!, {r3, lr} + bx lr + arm_func_end TxManCtrlFrame + + arm_func_start SetManCtrlFrame +SetManCtrlFrame: ; 0x06013E28 + stmdb sp!, {r4, lr} + mov r4, r0 + add r0, r4, #0x18 + bl CAM_Search + strh r0, [r4, #2] + ldrh r0, [r4, #2] + cmp r0, #0xff + moveq r0, #0 + streqh r0, [r4, #2] + ldr r0, _06013E98 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x3ec] + strh r0, [r4, #4] + ldrh r0, [r4, #0x14] + tst r0, #0x4000 + ldrneh r0, [r4, #0x12] + addne r0, r0, #8 + strneh r0, [r4, #0x12] + mov r0, r4 + bl CAM_IncFrameCount + ldr r0, _06013E98 ; =0x0380FFF4 + sub r2, r4, #0x10 + ldr r1, [r0] + add r0, r1, #0x188 + add r1, r1, #0x1a0 + bl MoveHeapBuf + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06013E98: .word 0x0380FFF4 + arm_func_end SetManCtrlFrame + + arm_func_start TxPsPollFrame +TxPsPollFrame: ; 0x06013E9C + stmdb sp!, {r4, lr} + ldr r0, _06013F24 ; =0x0380FFF4 + ldr r2, [r0] + add r0, r2, #0x54 + add r4, r0, #0x400 + ldrh r1, [r4, #2] + add r0, r2, #0x400 + add r1, r1, #1 + strh r1, [r4, #2] + ldrh r0, [r0, #0x54] + mov r1, #0 + cmp r0, #0 + ldrne r0, [r4, #8] + strneh r1, [r0, #4] + bne _06013F1C + mov r0, #1 + strh r0, [r4] + ldr r0, [r4, #8] + strh r1, [r0] + ldr r0, [r4, #8] + strh r1, [r0, #4] + bl WCalcManRate + ldr r2, [r4, #8] + ldr r1, _06013F28 ; =0x00003FFF + strh r0, [r2, #8] + ldr r0, [r4, #8] + ldr r2, _06013F2C ; =0x048080A8 + and r0, r0, r1 + mov r0, r0, lsl #0xf + mov r0, r0, lsr #0x10 + orr r0, r0, #0x8000 + strh r0, [r2] +_06013F1C: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_06013F24: .word 0x0380FFF4 +_06013F28: .word 0x00003FFF +_06013F2C: .word 0x048080A8 + arm_func_end TxPsPollFrame + + arm_func_start StartBeaconFrame +StartBeaconFrame: ; 0x06013F30 + ldr r0, _06013F68 ; =0x0380FFF4 + mov r2, #1 + ldr r3, [r0] + rsb r1, r2, #0x4000 + add r0, r3, #0x400 + strh r2, [r0, #0xa4] + add r0, r3, #0xa4 + ldr r2, [r0, #0x408] + ldr r0, _06013F6C ; =0x04808080 + and r1, r2, r1 + mov r1, r1, lsr #1 + orr r1, r1, #0x8000 + strh r1, [r0] + bx lr + .align 2, 0 +_06013F68: .word 0x0380FFF4 +_06013F6C: .word 0x04808080 + arm_func_end StartBeaconFrame + + arm_func_start StopBeaconFrame +StopBeaconFrame: ; 0x06013F70 + ldr r1, _06013F90 ; =0x0380FFF4 + ldr r0, _06013F94 ; =0x04808080 + ldr r2, [r1] + mov r1, #0 + strh r1, [r0] + add r0, r2, #0x400 + strh r1, [r0, #0xa4] + bx lr + .align 2, 0 +_06013F90: .word 0x0380FFF4 +_06013F94: .word 0x04808080 + arm_func_end StopBeaconFrame + + arm_func_start MakeBeaconFrame +MakeBeaconFrame: ; 0x06013F98 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _060142F4 ; =0x0380FFF4 + mov r0, #0 + ldr r1, [r1] + ldr r8, [r1, #0x4ac] + add r5, r1, #0x31c + strh r0, [r8] + strh r0, [r8, #2] + strh r0, [r8, #4] + strh r0, [r8, #6] + add r6, r1, #0x344 + bl WCalcManRate + strh r0, [r8, #8] + mov r0, #0x80 + strh r0, [r8, #0xc] + mov r0, #0 + add r2, r5, #8 + strh r0, [r8, #0xe] + ldr r1, _060142F8 ; =BC_ADRS + add r0, r8, #0x10 + mov r3, r2 + bl WSetMacAdrs3 + mov r1, #0 + strh r1, [r8, #0x22] + add sl, r8, #0x24 + str r1, [r8, #0x24] + str r1, [sl, #4] + ldrh r0, [r6, #0x6e] + add sb, sl, #0xc + strh r0, [sl, #8] + ldrh r0, [r6, #0x7c] + strh r0, [sl, #0xa] + ldrh r0, [r5, #0x1e] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + bne _06014098 + sub r0, sb, sl + strh r0, [r6, #0x92] + mov r0, sb + bl WL_WriteByte + ldrh r1, [r6, #0x1e] + add r0, sb, #1 + and r1, r1, #0xff + add sb, sb, #2 + bl WL_WriteByte + mov r7, #0 + add r4, r6, #0x20 + b _06014074 +_06014058: + add r0, r4, r7 + bl WL_ReadByte + mov r1, r0 + mov r0, sb + bl WL_WriteByte + add sb, sb, #1 + add r7, r7, #1 +_06014074: + ldrh r0, [r6, #0x1e] + cmp r7, r0 + blo _06014058 + mvn r0, #0 + sub r0, r0, r7 + add r0, sb, r0 + and r1, r7, #0xff + bl WL_WriteByte + b _0601409C +_06014098: + strh r1, [r6, #0x92] +_0601409C: + mov r0, sb + bl SetSupRateSet + add sb, sb, r0 + mov r0, sb + mov r1, #3 + bl WL_WriteByte + add r0, sb, #1 + mov r1, #1 + bl WL_WriteByte + ldrh r1, [r6, #0x7a] + add r0, sb, #2 + and r1, r1, #0xff + bl WL_WriteByte + add r0, sb, #3 + sub r1, r0, sl + strh r1, [r6, #0x94] + ldrh r2, [r6, #0x94] + ldr r1, _060142FC ; =0x04808084 + add r2, r2, #2 + strh r2, [r1] + mov r1, #5 + bl WL_WriteByte + add r0, sb, #4 + mov r1, #5 + bl WL_WriteByte + add r0, sb, #5 + mov r1, #0 + bl WL_WriteByte + add r0, sb, #6 + ldrh r1, [r6, #0x74] + and r1, r1, #0xff + bl WL_WriteByte + add r0, sb, #7 + mov r1, #0 + bl WL_WriteByte + add r0, sb, #8 + mov r1, #0 + bl WL_WriteByte + add r0, sb, #9 + mov r1, #0 + bl WL_WriteByte + add r0, sb, #0xa + sub r1, r0, sl + strh r1, [r6, #0x96] + ldrh r2, [r6, #0x96] + mov r1, #0xdd + and r2, r2, #1 + strh r2, [r6, #0xa2] + bl WL_WriteByte + add r0, sb, #0xb + ldrh r1, [r6, #0xa0] + add r1, r1, #8 + and r1, r1, #0xff + bl WL_WriteByte + add r0, sb, #0xc + mov r1, #0 + bl WL_WriteByte + add r0, sb, #0xd + mov r1, #9 + bl WL_WriteByte + add r0, sb, #0xe + mov r1, #0xbf + bl WL_WriteByte + add r0, sb, #0xf + mov r1, #0 + bl WL_WriteByte + ldrh r0, [r6, #0xe] + cmp r0, #1 + bne _060141DC + ldrh r1, [r5, #0x20] + add r0, sb, #0x10 + and r1, r1, #0xff + bl WL_WriteByte + ldrh r1, [r5, #0x20] + add r0, sb, #0x11 + mov r1, r1, asr #8 + and r1, r1, #0xff + add sb, sb, #0x12 + bl WL_WriteByte + b _060141F8 +_060141DC: + add r0, sb, #0x10 + mov r1, #0xff + bl WL_WriteByte + add r0, sb, #0x11 + mov r1, #0xff + add sb, sb, #0x12 + bl WL_WriteByte +_060141F8: + ldr r1, _06014300 ; =0x0380FFF0 + mov r0, sb + ldrh r4, [r1] + and r1, r4, #0xff + bl WL_WriteByte + mov r1, r4, lsr #8 + add r0, sb, #1 + and r1, r1, #0xff + add sb, sb, #2 + bl WL_WriteByte + ldr r4, [r6, #0x9c] + mov r5, #0 + b _0601424C +_0601422C: + mov r0, r4 + bl WL_ReadByte + mov r1, r0 + mov r0, sb + bl WL_WriteByte + add sb, sb, #1 + add r4, r4, #1 + add r5, r5, #1 +_0601424C: + ldrh r1, [r6, #0xa0] + cmp r5, r1 + blo _0601422C + ldrh r0, [r6, #0xa2] + cmp r0, #0 + beq _060142A8 + ldr r0, [r6, #0x9c] + cmp r1, #0 + add r0, r0, r1 + sub r5, r0, #1 + mov r4, #0 + bls _060142A8 + b _0601429C +_06014280: + mov r0, r5 + bl WL_ReadByte + mov r1, r0 + add r0, r5, #1 + bl WL_WriteByte + add r4, r4, #1 + sub r5, r5, #1 +_0601429C: + ldrh r0, [r6, #0xa0] + cmp r4, r0 + blo _06014280 +_060142A8: + ldr r0, _060142F4 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #4 + beq _060142D8 + ldr r1, _06014304 ; =0x0000B6B8 + add r0, sb, #3 + bic r2, r0, #3 + ldr r0, _06014308 ; =0x00001D46 + strh r1, [r2] + strh r0, [r2, #2] +_060142D8: + mov r1, #0 + add r0, sb, #0x1c + strh r1, [r6, #0xa4] + sub r0, r0, sl + strh r0, [r8, #0xa] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_060142F4: .word 0x0380FFF4 +_060142F8: .word BC_ADRS +_060142FC: .word 0x04808084 +_06014300: .word 0x0380FFF0 +_06014304: .word 0x0000B6B8 +_06014308: .word 0x00001D46 + arm_func_end MakeBeaconFrame + + arm_func_start UpdateGameInfoElement +UpdateGameInfoElement: ; 0x0601430C + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _060143F8 ; =0x0380FFF4 + ldr r0, [r0] + add r4, r0, #0x344 + ldr r1, [r0, #0x4ac] + ldrh r2, [r4, #0xa0] + ldrh r0, [r4, #0x96] + add r1, r1, #0x24 + cmp r2, #0 + add r5, r1, r0 + beq _0601437C + ldrh r0, [r4, #0xa2] + ldr r1, [r4, #0x9c] + tst r0, #1 + add r0, r5, #0xa + beq _06014374 + sub r0, r0, #1 + add r2, r2, #2 + bl DMA_Write + ldr r1, _060143FC ; =0x0380FFF0 + add r0, r5, #9 + ldrh r1, [r1] + mov r1, r1, asr #8 + and r1, r1, #0xff + bl WL_WriteByte + b _0601437C +_06014374: + add r2, r2, #1 + bl DMA_Write +_0601437C: + ldr r0, _060143F8 ; =0x0380FFF4 + ldrh r2, [r4, #0x96] + ldr r0, [r0] + ldrh r1, [r4, #0xa0] + add r2, r2, #0x26 + ldr r0, [r0, #0x4ac] + add r1, r2, r1 + strh r1, [r0, #0xa] + ldrh r1, [r4, #0xa0] + add r0, r5, #1 + add r1, r1, #8 + and r1, r1, #0xff + bl WL_WriteByte + ldr r0, _060143F8 ; =0x0380FFF4 + ldr r0, [r0] + add r0, r0, #0x600 + ldrh r0, [r0, #0x90] + tst r0, #4 + beq _060143E8 + ldrh r0, [r4, #0xa0] + add r1, r5, #0xd + add r0, r1, r0 + ldr r1, _06014400 ; =0x0000B6B8 + bic r2, r0, #3 + ldr r0, _06014404 ; =0x00001D46 + strh r1, [r2] + strh r0, [r2, #2] +_060143E8: + mov r0, #0 + strh r0, [r4, #0xa4] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060143F8: .word 0x0380FFF4 +_060143FC: .word 0x0380FFF0 +_06014400: .word 0x0000B6B8 +_06014404: .word 0x00001D46 + arm_func_end UpdateGameInfoElement + + arm_func_start IsEnableManagement +IsEnableManagement: ; 0x06014408 + ldr r0, _06014434 ; =0x0380FFF4 + ldr r0, [r0] + add r1, r0, #0x500 + add r0, r0, #0x100 + ldrh r1, [r1, #0x38] + ldrh r2, [r0, #0xa8] + rsb r0, r1, #0x18 + cmp r2, r0 + movlt r0, #1 + movge r0, #0 + bx lr + .align 2, 0 +_06014434: .word 0x0380FFF4 + arm_func_end IsEnableManagement + + arm_func_start MakeDisAssFrame +MakeDisAssFrame: ; 0x06014438 + stmdb sp!, {r4, r5, r6, lr} + ldr r2, _060144AC ; =0x0380FFF4 + mov r5, r1 + ldr r1, [r2] + mov r6, r0 + add r0, r1, #0x188 + mov r1, #0x36 + bl AllocateHeapBuf + movs r4, r0 + bne _06014470 + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _060144A4 +_06014470: + ldr r0, _060144B0 ; =0x0000FFFF + mov r1, r6 + strh r0, [r4, #0xc] + add r0, r4, #0x10 + bl InitManHeader + strh r5, [r4, #0x3c] + mov r0, #2 + strh r0, [r4, #0x16] + add r0, r0, #0x1c + strh r0, [r4, #0x22] + mov r0, #0xa0 + strh r0, [r4, #0x24] + add r0, r4, #0x10 +_060144A4: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060144AC: .word 0x0380FFF4 +_060144B0: .word 0x0000FFFF + arm_func_end MakeDisAssFrame + + arm_func_start MakeAssReqFrame +MakeAssReqFrame: ; 0x060144B4 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _06014554 ; =0x0380FFF4 + mov r6, r0 + ldr r2, [r1] + mov r1, #0x5e + add r0, r2, #0x188 + add r5, r2, #0x344 + bl AllocateHeapBuf + movs r4, r0 + bne _060144EC + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _0601454C +_060144EC: + ldr r0, _06014558 ; =0x0000FFFF + mov r1, r6 + strh r0, [r4, #0xc] + add r0, r4, #0x10 + bl InitManHeader + ldrh r1, [r5, #0x7c] + add r0, r4, #0x40 + strh r1, [r4, #0x3c] + ldrh r1, [r5, #0x70] + strh r1, [r4, #0x3e] + bl SetSSIDElement + mov r5, r0 + add r0, r4, #0x40 + add r0, r0, r5 + bl SetSupRateSet + add r0, r5, r0 + add r0, r0, #4 + strh r0, [r4, #0x16] + ldrh r1, [r4, #0x16] + mov r0, #0 + add r1, r1, #0x1c + strh r1, [r4, #0x22] + strh r0, [r4, #0x24] + add r0, r4, #0x10 +_0601454C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06014554: .word 0x0380FFF4 +_06014558: .word 0x0000FFFF + arm_func_end MakeAssReqFrame + + arm_func_start MakeReAssReqFrame +MakeReAssReqFrame: ; 0x0601455C + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _06014608 ; =0x0380FFF4 + mov r6, r0 + ldr r2, [r1] + mov r1, #0x64 + add r0, r2, #0x188 + add r5, r2, #0x344 + bl AllocateHeapBuf + movs r4, r0 + bne _06014594 + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _06014600 +_06014594: + ldr r0, _0601460C ; =0x0000FFFF + mov r1, r6 + strh r0, [r4, #0xc] + add r0, r4, #0x10 + bl InitManHeader + ldrh r1, [r5, #0x7c] + add r0, r4, #0x40 + strh r1, [r4, #0x3c] + ldrh r2, [r5, #0x70] + add r1, r5, #0x82 + strh r2, [r4, #0x3e] + bl WSetMacAdrs1 + add r0, r4, #0x46 + bl SetSSIDElement + mov r5, r0 + add r0, r4, #0x46 + add r0, r0, r5 + bl SetSupRateSet + add r0, r5, r0 + add r0, r0, #0xa + strh r0, [r4, #0x16] + ldrh r1, [r4, #0x16] + mov r0, #0x20 + add r1, r1, #0x1c + strh r1, [r4, #0x22] + strh r0, [r4, #0x24] + add r0, r4, #0x10 +_06014600: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06014608: .word 0x0380FFF4 +_0601460C: .word 0x0000FFFF + arm_func_end MakeReAssReqFrame + + arm_func_start MakeAssResFrame +MakeAssResFrame: ; 0x06014610 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r3, _0601477C ; =0x0380FFF4 + mov r7, r1 + ldr r1, [r3] + mov r8, r0 + add r0, r1, #0x188 + mov r1, #0x60 + mov r6, r2 + bl AllocateHeapBuf + movs r4, r0 + bne _0601464C + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _06014774 +_0601464C: + ldr r0, _06014780 ; =0x0000FFFF + cmp r7, #0 + strh r0, [r4, #0xc] + bne _06014670 + mov r0, r8 + bl CAM_AllocateAID + movs r5, r0 + moveq r7, #0x13 + b _06014674 +_06014670: + mov r5, #0 +_06014674: + mov r0, r8 + bl CAM_GetMacAdrs + mov r1, r0 + add r0, r4, #0x10 + bl InitManHeader + ldr r0, _0601477C ; =0x0380FFF4 + cmp r5, #0 + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0xc0] + strh r0, [r4, #0x3c] + strh r7, [r4, #0x3e] + strh r5, [r4, #0x40] + ldrneh r0, [r4, #0x40] + orrne r0, r0, #0xc000 + strneh r0, [r4, #0x40] + add r0, r4, #0x42 + bl SetSupRateSet + add r0, r0, #6 + strh r0, [r4, #0x16] + ldrh r1, [r4, #0x16] + mov r0, #0x10 + add r1, r1, #0x1c + strh r1, [r4, #0x22] + strh r0, [r4, #0x24] + ldrh r0, [r4, #0x22] + add r1, r4, #0x24 + cmp r6, #0 + add r8, r1, r0 + beq _06014758 + add r0, r6, #1 + bl WL_ReadByte + mov sb, r0 + mov r0, r6 + bl WL_ReadByte + mov r1, r0 + mov r0, r8 + bl WL_WriteByte + add r0, r8, #1 + and r1, sb, #0xff + add r8, r8, #2 + bl WL_WriteByte + cmp sb, #0 + mov r7, #0 + bls _06014770 + add r5, r6, #2 + b _0601474C +_06014730: + add r0, r5, r7 + bl WL_ReadByte + mov r1, r0 + mov r0, r8 + bl WL_WriteByte + add r7, r7, #1 + add r8, r8, #1 +_0601474C: + cmp r7, sb + blo _06014730 + b _06014770 +_06014758: + mov r0, r8 + mov r1, #0 + bl WL_WriteByte + add r0, r8, #1 + mov r1, #0 + bl WL_WriteByte +_06014770: + add r0, r4, #0x10 +_06014774: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_0601477C: .word 0x0380FFF4 +_06014780: .word 0x0000FFFF + arm_func_end MakeAssResFrame + + arm_func_start MakeReAssResFrame +MakeReAssResFrame: ; 0x06014784 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, _060148DC ; =0x0380FFF4 + mov r6, r1 + ldr r1, [r3] + mov r8, r0 + add r0, r1, #0x188 + mov r1, #0x60 + mov r5, r2 + bl AllocateHeapBuf + movs r4, r0 + bne _060147C0 + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _060148D4 +_060147C0: + ldr r0, _060148E0 ; =0x0000FFFF + cmp r6, #0 + strh r0, [r4, #0xc] + bne _060147E4 + mov r0, r8 + bl CAM_AllocateAID + movs r7, r0 + moveq r6, #0x13 + b _060147E8 +_060147E4: + mov r7, #0 +_060147E8: + mov r0, r8 + bl CAM_GetMacAdrs + mov r1, r0 + add r0, r4, #0x10 + bl InitManHeader + ldr r0, _060148DC ; =0x0380FFF4 + orr r2, r7, #0xc000 + ldr r1, [r0] + add r0, r4, #0x42 + add r1, r1, #0x300 + ldrh r1, [r1, #0xc0] + strh r1, [r4, #0x3c] + strh r6, [r4, #0x3e] + strh r2, [r4, #0x40] + bl SetSupRateSet + add r0, r0, #6 + strh r0, [r4, #0x16] + ldrh r1, [r4, #0x16] + mov r0, #0x30 + add r1, r1, #0x1c + strh r1, [r4, #0x22] + strh r0, [r4, #0x24] + ldrh r0, [r4, #0x22] + add r1, r4, #0x24 + cmp r5, #0 + add r7, r1, r0 + beq _060148B8 + add r0, r5, #1 + bl WL_ReadByte + mov r8, r0 + mov r0, r5 + bl WL_ReadByte + mov r1, r0 + mov r0, r7 + bl WL_WriteByte + add r0, r7, #1 + and r1, r8, #0xff + bl WL_WriteByte + add r7, r7, #2 + mov r6, #0 + add r5, r5, #2 + b _060148AC +_06014890: + add r0, r5, r6 + bl WL_ReadByte + mov r1, r0 + mov r0, r7 + bl WL_WriteByte + add r7, r7, #1 + add r6, r6, #1 +_060148AC: + cmp r6, r8 + blo _06014890 + b _060148D0 +_060148B8: + mov r0, r7 + mov r1, #0 + bl WL_WriteByte + add r0, r7, #1 + mov r1, #0 + bl WL_WriteByte +_060148D0: + add r0, r4, #0x10 +_060148D4: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_060148DC: .word 0x0380FFF4 +_060148E0: .word 0x0000FFFF + arm_func_end MakeReAssResFrame + + arm_func_start MakeProbeReqFrame +MakeProbeReqFrame: ; 0x060148E4 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06014968 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + mov r1, #0x5a + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r5, r0 + bne _06014918 + mov r0, #2 + bl SetFatalErr + mov r0, r5 + b _06014960 +_06014918: + ldr r2, _0601496C ; =0x0000FFFF + mov r1, r4 + add r0, r5, #0x10 + strh r2, [r5, #0xc] + bl InitManHeader + add r0, r5, #0x3c + bl SetSSIDElement + mov r4, r0 + add r0, r5, #0x3c + add r0, r0, r4 + bl SetSupRateSet + add r0, r4, r0 + strh r0, [r5, #0x16] + add r0, r0, #0x1c + strh r0, [r5, #0x22] + mov r0, #0x40 + strh r0, [r5, #0x24] + add r0, r5, #0x10 +_06014960: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06014968: .word 0x0380FFF4 +_0601496C: .word 0x0000FFFF + arm_func_end MakeProbeReqFrame + + arm_func_start MakeProbeResFrame +MakeProbeResFrame: ; 0x06014970 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _06014B84 ; =0x0380FFF4 + mov r5, r0 + ldr r0, [r1] + add r4, r0, #0x344 + bl IsEnableManagement + cmp r0, #0 + moveq r0, #0 + beq _06014B7C + ldr r1, _06014B84 ; =0x0380FFF4 + ldrh r0, [r4, #0xa0] + ldr r2, [r1] + add r1, r0, #0x78 + add r0, r2, #0x188 + bl AllocateHeapBuf + movs r6, r0 + bne _060149C4 + mov r0, #2 + bl SetFatalErr + mov r0, r6 + b _06014B7C +_060149C4: + ldr r0, _06014B88 ; =0x0000FFFF + mov r1, r5 + strh r0, [r6, #0xc] + add r0, r6, #0x10 + bl InitManHeader + ldrh r1, [r4, #0x6e] + add r0, r6, #0x48 + strh r1, [r6, #0x44] + ldrh r1, [r4, #0x7c] + strh r1, [r6, #0x46] + bl SetSSIDElement + mov r4, r0 + add r0, r6, #0x48 + add r0, r0, r4 + bl SetSupRateSet + add r7, r4, r0 + add r0, r6, #0x48 + add r4, r0, r7 + mov r0, r4 + mov r1, #3 + bl WL_WriteByte + add r0, r4, #1 + mov r1, #1 + bl WL_WriteByte + ldr r1, _06014B84 ; =0x0380FFF4 + add r0, r4, #2 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r1, [r1, #0xbe] + and r1, r1, #0xff + bl WL_WriteByte + ldr r0, _06014B84 ; =0x0380FFF4 + add r7, r7, #3 + ldr r1, [r0] + add r0, r6, #0x48 + add r5, r0, r7 + add r4, r1, #0x344 + add r8, r1, #0x31c + mov r0, r5 + mov r1, #0xdd + mov sl, #0 + bl WL_WriteByte + ldr r1, _06014B84 ; =0x0380FFF4 + add r0, r5, #1 + ldr r1, [r1] + add r1, r1, #0x300 + ldrh r1, [r1, #0xe4] + add r1, r1, #8 + and r1, r1, #0xff + bl WL_WriteByte + add r0, r5, #2 + mov r1, sl + bl WL_WriteByte + add r0, r5, #3 + mov r1, #9 + bl WL_WriteByte + add r0, r5, #4 + mov r1, #0xbf + bl WL_WriteByte + add r0, r5, #5 + mov r1, sl + bl WL_WriteByte + ldrh r1, [r8, #0x20] + add r0, r5, #6 + and r1, r1, #0xff + bl WL_WriteByte + ldrh r1, [r8, #0x20] + add r0, r5, #7 + mov r1, r1, asr #8 + and r1, r1, #0xff + bl WL_WriteByte + ldr r1, _06014B8C ; =0x0380FFF0 + add r0, r5, #8 + ldrh r8, [r1] + and r1, r8, #0xff + bl WL_WriteByte + mov r1, r8, lsr #8 + add r0, r5, #9 + and r1, r1, #0xff + bl WL_WriteByte + ldrh r0, [r4, #0xa0] + add sl, sl, #0xa + cmp r0, #0 + beq _06014B58 + ldrh r0, [r4, #0xa2] + ldr r8, [r4, #0x9c] + tst r0, #1 + addne r8, r8, #1 + mov sb, #0 + b _06014B4C +_06014B2C: + mov r0, r8 + bl WL_ReadByte + mov r1, r0 + add r0, r5, sl + bl WL_WriteByte + add sl, sl, #1 + add r8, r8, #1 + add sb, sb, #1 +_06014B4C: + ldrh r0, [r4, #0xa0] + cmp sb, r0 + blo _06014B2C +_06014B58: + add r0, r7, sl + add r0, r0, #0xc + strh r0, [r6, #0x16] + ldrh r1, [r6, #0x16] + mov r0, #0x50 + add r1, r1, #0x1c + strh r1, [r6, #0x22] + strh r0, [r6, #0x24] + add r0, r6, #0x10 +_06014B7C: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_06014B84: .word 0x0380FFF4 +_06014B88: .word 0x0000FFFF +_06014B8C: .word 0x0380FFF0 + arm_func_end MakeProbeResFrame + + arm_func_start MakeAuthFrame +MakeAuthFrame: ; 0x06014B90 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + cmp r2, #0 + beq _06014BB4 + bl IsEnableManagement + cmp r0, #0 + moveq r0, #0 + beq _06014C40 +_06014BB4: + ldr r0, _06014C48 ; =0x0380FFF4 + add r1, r5, #0x3d + ldr r0, [r0] + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r4, r0 + bne _06014BE0 + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _06014C40 +_06014BE0: + ldr r2, _06014C4C ; =0x0000FFFF + mov r1, r6 + add r0, r4, #0x10 + strh r2, [r4, #0xc] + bl InitManHeader + cmp r5, #0 + beq _06014C20 + add r0, r4, #0x42 + mov r1, #0x10 + bl WL_WriteByte + add r0, r4, #0x43 + and r1, r5, #0xff + bl WL_WriteByte + add r0, r5, #2 + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 +_06014C20: + add r0, r5, #6 + strh r0, [r4, #0x16] + ldrh r1, [r4, #0x16] + mov r0, #0xb0 + add r1, r1, #0x1c + strh r1, [r4, #0x22] + strh r0, [r4, #0x24] + add r0, r4, #0x10 +_06014C40: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06014C48: .word 0x0380FFF4 +_06014C4C: .word 0x0000FFFF + arm_func_end MakeAuthFrame + + arm_func_start MakeDeAuthFrame +MakeDeAuthFrame: ; 0x06014C50 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + cmp r2, #0 + beq _06014C74 + bl IsEnableManagement + cmp r0, #0 + moveq r0, #0 + beq _06014CD4 +_06014C74: + ldr r0, _06014CDC ; =0x0380FFF4 + mov r1, #0x36 + ldr r0, [r0] + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r4, r0 + bne _06014CA0 + mov r0, #2 + bl SetFatalErr + mov r0, r4 + b _06014CD4 +_06014CA0: + ldr r0, _06014CE0 ; =0x0000FFFF + mov r1, r6 + strh r0, [r4, #0xc] + add r0, r4, #0x10 + bl InitManHeader + strh r5, [r4, #0x3c] + mov r0, #2 + strh r0, [r4, #0x16] + add r0, r0, #0x1c + strh r0, [r4, #0x22] + mov r0, #0xc0 + strh r0, [r4, #0x24] + add r0, r4, #0x10 +_06014CD4: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06014CDC: .word 0x0380FFF4 +_06014CE0: .word 0x0000FFFF + arm_func_end MakeDeAuthFrame + + arm_func_start MakePsPollFrame +MakePsPollFrame: ; 0x06014CE4 + stmdb sp!, {r3, lr} + ldr ip, _06014D38 ; =0x0380FFF4 + mov r2, #0 + ldr r3, [ip] + mov r1, #0x14 + ldr r3, [r3, #0x45c] + orr r0, r0, #0xc000 + strh r2, [r3] + strh r2, [r3, #2] + strh r2, [r3, #4] + strh r1, [r3, #0xa] + mov r1, #0xa4 + strh r1, [r3, #0xc] + strh r0, [r3, #0xe] + ldr r2, [ip] + add r0, r3, #0x10 + add r1, r2, #0x3a8 + add r2, r2, #0x324 + bl WSetMacAdrs2 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_06014D38: .word 0x0380FFF4 + arm_func_end MakePsPollFrame + + arm_func_start InitManHeader +InitManHeader: ; 0x06014D3C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + mov r1, r5 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear16 + bl WCalcManRate + strh r0, [r5, #0x10] + ldr r0, _06014D84 ; =0x0380FFF4 + mov r1, r4 + ldr r3, [r0] + add r0, r5, #0x18 + add r2, r3, #0x324 + add r3, r3, #0x3a8 + bl WSetMacAdrs3 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06014D84: .word 0x0380FFF4 + arm_func_end InitManHeader + + arm_func_start IsExistManFrame +IsExistManFrame: ; 0x06014D88 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r2, _06014DEC ; =0x0380FFF4 + mov r7, r0 + ldr r0, [r2] + mov r6, r1 + ldr r5, [r0, #0x1a0] + mvn r4, #0 + b _06014DD8 +_06014DA8: + ldrh r0, [r5, #0x24] + cmp r0, r6 + bne _06014DCC + mov r1, r7 + add r0, r5, #0x28 + bl MatchMacAdrs + cmp r0, #0 + movne r0, #1 + bne _06014DE4 +_06014DCC: + mov r0, r5 + bl GetHeapBufNextAdrs + mov r5, r0 +_06014DD8: + cmp r5, r4 + bne _06014DA8 + mov r0, #0 +_06014DE4: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06014DEC: .word 0x0380FFF4 + arm_func_end IsExistManFrame + + arm_func_start SetSSIDElement +SetSSIDElement: ; 0x06014DF0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _06014E60 ; =0x0380FFF4 + mov r5, #0 + ldr r1, [r1] + mov r8, r0 + add r4, r1, #0x344 + ldrh r6, [r4, #0x1e] + mov r1, r5 + bl WL_WriteByte + add r0, r8, #1 + and r1, r6, #0xff + bl WL_WriteByte + add r5, r5, #2 + mov r7, #0 + add r4, r4, #0x20 + b _06014E4C +_06014E30: + add r0, r4, r7 + bl WL_ReadByte + mov r1, r0 + add r0, r8, r5 + bl WL_WriteByte + add r5, r5, #1 + add r7, r7, #1 +_06014E4C: + cmp r7, r6 + blo _06014E30 + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_06014E60: .word 0x0380FFF4 + arm_func_end SetSSIDElement + + arm_func_start SetSupRateSet +SetSupRateSet: ; 0x06014E64 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _06014F00 ; =0x0380FFF4 + mov r1, #1 + ldr r2, [r2] + mov sb, r0 + add r6, r2, #0x344 + mov r7, #0 + bl WL_WriteByte + ldr r4, _06014F04 ; =RateBit2Element + add r7, r7, #2 + mov r8, #0 + mov r5, #1 +_06014E94: + ldrh r0, [r6, #0x62] + tst r0, r5, lsl r8 + beq _06014ED8 + ldrh r0, [r6, #0x60] + tst r0, r5, lsl r8 + mov r0, r8, lsl #1 + ldrh r1, [r4, r0] + beq _06014EC8 + orr r1, r1, #0x80 + add r0, sb, r7 + and r1, r1, #0xff + bl WL_WriteByte + b _06014ED4 +_06014EC8: + add r0, sb, r7 + and r1, r1, #0xff + bl WL_WriteByte +_06014ED4: + add r7, r7, #1 +_06014ED8: + add r8, r8, #1 + cmp r8, #0x10 + blo _06014E94 + sub r1, r7, #2 + add r0, sb, #1 + and r1, r1, #0xff + bl WL_WriteByte + mov r0, r7 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_06014F00: .word 0x0380FFF4 +_06014F04: .word RateBit2Element + arm_func_end SetSupRateSet + + arm_func_start InitTxCtrl +InitTxCtrl: ; 0x06014F08 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _060151D8 ; =0x0380FFF4 + mov r0, #0 + ldr r7, [r1] + mov r2, #0xb0 + add r1, r7, #0x2c + add r4, r1, #0x400 + mov r1, r4 + add r5, r7, #0x344 + add r6, r7, #0x31c + bl __VENEER_MIi_CpuClear32 + add r0, r7, #0x400 + mov r1, #0 + strh r1, [r0, #0x2c] + str r1, [r4, #0xc] + strh r1, [r4, #0x14] + str r1, [r4, #0x20] + strh r1, [r4, #0x28] + ldr r0, _060151DC ; =0x0000FFFF + str r1, [r4, #0x34] + strh r0, [r4, #0xa2] + strh r0, [r4, #0xa4] + ldrh r0, [r5, #0xc] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _060151BC +_06014F70: ; jump table + b _06014F80 ; case 0 + b _06014FFC ; case 1 + b _06015098 ; case 2 + b _06015144 ; case 3 +_06014F80: + ldr r7, _060151E0 ; =0x04804170 + ldr r0, _060151E4 ; =0x04804026 + str r7, [r4, #8] + sub r1, r7, #0x148 + str r1, [r4, #0x1c] + sub r2, r7, #0x170 + ldr r1, _060151E8 ; =TxqEndData + str r2, [r4, #0x30] + ldr r2, _060151EC ; =TxqEndManCtrl + str r1, [r4, #0x10] + ldr r1, _060151F0 ; =TxqEndPsPoll + str r2, [r4, #0x24] + ldr r3, _060151F4 ; =0x0000B6B8 + str r1, [r4, #0x38] + sub r1, r7, #0x14c + ldr r2, _060151F8 ; =0x00001D46 + strh r3, [r1] + strh r2, [r0] + strh r3, [r7, #-4] + add r0, r0, #0x148 + strh r2, [r0] + add r1, r7, #0x620 + ldr r0, _060151FC ; =0x04804792 + strh r3, [r1] + strh r2, [r0] + mov r1, #8 + ldr r0, _06015200 ; =0x048080AE + strh r1, [r5, #0x8a] + mov r1, #1 + strh r1, [r0] + b _060151BC +_06014FFC: + ldr r3, _06015204 ; =0x04804AA0 + ldr r2, _06015208 ; =0x04804334 + str r3, [r4, #8] + sub r0, r3, #0x148 + str r0, [r4, #0x1c] + ldr r0, _060151E8 ; =TxqEndData + str r2, [r4, #0x30] + ldr r1, _060151EC ; =TxqEndManCtrl + str r0, [r4, #0x10] + ldr r0, _0601520C ; =TxqEndBroadCast + str r1, [r4, #0x24] + ldr ip, _06015210 ; =0x04804956 + str r0, [r4, #0x38] + sub r1, r2, #0xfc + str r1, [r4, #0x80] + sub r7, r2, #0x334 + ldr r0, _060151F4 ; =0x0000B6B8 + str r7, [r4, #0x44] + sub r7, r2, #0x100 + ldr lr, _060151F8 ; =0x00001D46 + strh r0, [r7] + strh lr, [r2, #-0xfe] + strh r0, [r2, #-4] + strh lr, [r2, #-2] + add r2, r2, #0x620 + strh r0, [r2] + strh lr, [ip] + strh r0, [r3, #-4] + add r2, ip, #0x148 + strh lr, [r2] + add r3, r3, #0x620 + ldr r2, _06015214 ; =0x048050C2 + strh r0, [r3] + strh lr, [r2] + mov r0, #0x208 + strh r0, [r5, #0x8a] + str r1, [r4, #0x80] + bl MakeBeaconFrame + b _060151BC +_06015098: + ldr r1, _06015218 ; =0x048045D8 + ldr r3, _0601521C ; =0x04804232 + str r1, [r4, #8] + sub r0, r1, #0x148 + str r0, [r4, #0x1c] + sub r2, r1, #0x170 + ldr ip, _06015220 ; =0x04804000 + ldr r0, _060151E8 ; =TxqEndData + str r2, [r4, #0x30] + ldr r2, _060151EC ; =TxqEndManCtrl + str r0, [r4, #0x10] + ldr r0, _060151F0 ; =TxqEndPsPoll + str r2, [r4, #0x24] + str r0, [r4, #0x38] + str ip, [r4, #0x58] + add r2, ip, #0x234 + ldr r0, _060151F4 ; =0x0000B6B8 + str r2, [r4, #0x6c] + add r2, ip, #0x230 + ldr r4, _060151F8 ; =0x00001D46 + strh r0, [r2] + strh r4, [r3] + sub r2, r1, #0x174 + strh r0, [r2] + add r2, r3, #0x234 + strh r4, [r2] + sub r2, r1, #0x14c + strh r0, [r2] + add r2, r3, #0x25c + strh r4, [r2] + strh r0, [r1, #-4] + add r2, r3, #0x3a4 + strh r4, [r2] + add r2, r1, #0x620 + ldr r1, _06015224 ; =0x04804BFA + strh r0, [r2] + strh r4, [r1] + mov r1, #0x108 + ldr r0, _06015200 ; =0x048080AE + strh r1, [r5, #0x8a] + mov r1, #0xd + strh r1, [r0] + b _060151BC +_06015144: + ldr ip, _060151E0 ; =0x04804170 + ldr r0, _060151E4 ; =0x04804026 + str ip, [r4, #8] + sub r1, ip, #0x148 + str r1, [r4, #0x1c] + sub r2, ip, #0x170 + ldr r1, _060151E8 ; =TxqEndData + str r2, [r4, #0x30] + ldr r2, _060151EC ; =TxqEndManCtrl + str r1, [r4, #0x10] + ldr r1, _060151F0 ; =TxqEndPsPoll + str r2, [r4, #0x24] + ldr r3, _060151F4 ; =0x0000B6B8 + str r1, [r4, #0x38] + sub r1, ip, #0x14c + ldr r2, _060151F8 ; =0x00001D46 + strh r3, [r1] + strh r2, [r0] + strh r3, [ip, #-4] + add r0, r0, #0x148 + strh r2, [r0] + add r1, ip, #0x620 + ldr r0, _060151FC ; =0x04804792 + strh r3, [r1] + strh r2, [r0] + mov r1, #0x108 + ldr r0, _06015200 ; =0x048080AE + strh r1, [r5, #0x8a] + mov r1, #0xd + strh r1, [r0] +_060151BC: + ldrh r0, [r6, #0x18] + cmp r0, #0 + ldrneh r0, [r5, #0x8a] + orrne r0, r0, #0x4000 + strneh r0, [r5, #0x8a] + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_060151D8: .word 0x0380FFF4 +_060151DC: .word 0x0000FFFF +_060151E0: .word 0x04804170 +_060151E4: .word 0x04804026 +_060151E8: .word TxqEndData +_060151EC: .word TxqEndManCtrl +_060151F0: .word TxqEndPsPoll +_060151F4: .word 0x0000B6B8 +_060151F8: .word 0x00001D46 +_060151FC: .word 0x04804792 +_06015200: .word 0x048080AE +_06015204: .word 0x04804AA0 +_06015208: .word 0x04804334 +_0601520C: .word TxqEndBroadCast +_06015210: .word 0x04804956 +_06015214: .word 0x048050C2 +_06015218: .word 0x048045D8 +_0601521C: .word 0x04804232 +_06015220: .word 0x04804000 +_06015224: .word 0x04804BFA + arm_func_end InitTxCtrl + + arm_func_start RxDataFrameTask +RxDataFrameTask: ; 0x06015228 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r1, _060154F4 ; =0x0380FFF4 + mvn r0, #0 + ldr r4, [r1] + add r7, r4, #0x17c + ldr r5, [r7, #0x48] + add r6, r4, #0x344 + cmp r5, r0 + beq _060154EC + ldrh r0, [r6, #8] + cmp r0, #0x40 + beq _06015268 + mov r1, r5 + add r0, r7, #0x48 + bl ReleaseHeapBuf + b _060154EC +_06015268: + ldrh r0, [r5, #0x24] + mov r0, r0, lsl #0x17 + movs r0, r0, lsr #0x1f + beq _06015280 + ldrh r0, [r5, #0x34] + b _06015284 +_06015280: + ldrh r0, [r5, #0x28] +_06015284: + tst r0, #1 + ldrne r0, [r4, #0x568] + mov sb, #1 + addne r0, r0, #1 + strne r0, [r4, #0x568] + ldreq r0, [r4, #0x564] + addeq r0, r0, #1 + streq r0, [r4, #0x564] + ldrh r0, [r5, #0x18] + ldr r2, [r4, #0x560] + and r1, r0, #0xf0 + mov r0, r1, asr #3 + add r0, r1, r0, lsr #28 + mov r0, r0, asr #4 + sub r0, r0, #1 + add r0, r2, r0 + str r0, [r4, #0x560] + ldrh r2, [r6, #0xc] + cmp r2, #1 + beq _060152E4 + cmp r2, #2 + cmpne r2, #3 + beq _060153C0 + b _06015460 +_060152E4: + ldrh r0, [r5, #0x24] + tst r0, #1 + bne _06015460 + add r0, r5, #0x2e + bl CAM_Search + mov r8, r0 + cmp r8, #0xff + beq _06015310 + bl CAM_GetStaState + cmp r0, #0x40 + beq _06015374 +_06015310: + mov r0, r8 + bl CAM_GetStaState + cmp r0, #0x30 + add r0, r5, #0x2e + bne _06015344 + mov r1, #0xa0 + bl IsExistManFrame + cmp r0, #0 + bne _06015460 + add r0, r5, #0x2e + mov r1, #7 + bl MakeDisAssFrame + b _06015364 +_06015344: + mov r1, #0xc0 + bl IsExistManFrame + cmp r0, #0 + bne _06015460 + add r0, r5, #0x2e + mov r1, #7 + mov r2, #1 + bl MakeDeAuthFrame +_06015364: + cmp r0, #0 + beq _06015460 + bl TxManCtrlFrame + b _06015460 +_06015374: + ldrh r1, [r5, #0x24] + mov r0, r8, lsl #0x10 + mov r1, r1, lsl #0x13 + mov r0, r0, lsr #0x10 + mov r1, r1, lsr #0x1f + bl CAM_SetPowerMgtMode + mov r0, r8 + bl CAM_GetLastSeqCtrl + ldrh r1, [r5, #0x3a] + cmp r1, r0 + ldreq r0, [r4, #0x578] + addeq r0, r0, #1 + streq r0, [r4, #0x578] + beq _06015460 + add r0, r5, #0x28 + add r1, r5, #0x34 + bl WSetMacAdrs1 + mov sb, #0 + b _06015460 +_060153C0: + ldrh r1, [r5, #0x24] + tst r1, #1 + bne _06015460 + ldrh r0, [r6, #0xe] + cmp r0, #0 + beq _0601542C + tst r1, #0x2000 + bne _0601542C + ldrh r0, [r5, #0x28] + tst r0, #1 + ldrneh r0, [r6, #0x8e] + bicne r0, r0, #1 + strneh r0, [r6, #0x8e] + bne _06015408 + cmp r2, #3 + ldrneh r0, [r6, #0x8e] + bicne r0, r0, #2 + strneh r0, [r6, #0x8e] +_06015408: + ldrh r0, [r6, #0x8e] + cmp r0, #0 + ldreqh r0, [r7, #0x20] + cmpeq r0, #0 + ldreqh r0, [r7, #0x2c] + cmpeq r0, #0 + bne _0601542C + mov r0, #1 + bl WSetPowerState +_0601542C: + ldrh r8, [r6, #0x88] + mov r0, r8 + bl CAM_GetLastSeqCtrl + ldrh r1, [r5, #0x3a] + cmp r1, r0 + ldreq r0, [r4, #0x578] + addeq r0, r0, #1 + streq r0, [r4, #0x578] + beq _06015460 + add r0, r5, #0x2e + add r1, r5, #0x34 + bl WSetMacAdrs1 + mov sb, #0 +_06015460: + cmp sb, #0 + bne _060154C8 + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + strh r0, [r5, #0x12] + ldrh r1, [r5, #0x22] + and r1, r1, #0xff + bl CAM_SetRSSI + ldrh r1, [r5, #0x3a] + mov r0, r8 + bl CAM_SetLastSeqCtrl + mov r0, r8 + bl CAM_UpdateLifeTime + ldrh r1, [r5, #0x20] + mov r0, #0x180 + sub r1, r1, #0x18 + strh r1, [r5, #0x16] + strh r0, [r5, #0xc] + ldrh r0, [r5, #0x16] + mov r1, r5 + add r0, r0, #0x2d + mov r2, r0, lsr #1 + add r0, r7, #0x48 + strh r2, [r5, #0xe] + bl SendMessageToWmDirect + b _060154D4 +_060154C8: + mov r1, r5 + add r0, r7, #0x48 + bl ReleaseHeapBuf +_060154D4: + ldrh r0, [r7, #0x50] + cmp r0, #0 + beq _060154EC + mov r0, #2 + mov r1, #6 + bl AddTask +_060154EC: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_060154F4: .word 0x0380FFF4 + arm_func_end RxDataFrameTask + + arm_func_start RxMpFrame +RxMpFrame: ; 0x060154F8 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _06015664 ; =0x0380FFF4 + mov r6, r0 + ldr r0, [r1] + add r4, r0, #0x344 + ldrh r1, [r4, #8] + add r0, r0, #0xdc + cmp r1, #0x40 + add r5, r0, #0x400 + movne r0, #1 + bne _0601565C + add r0, r6, #0x1e + add r1, r4, #0x64 + bl MatchMacAdrs + cmp r0, #0 + beq _0601554C + add r0, r6, #0x24 + add r1, r4, #0x82 + bl MatchMacAdrs + cmp r0, #0 + bne _06015554 +_0601554C: + mov r0, #1 + b _0601565C +_06015554: + ldrh r0, [r4, #0x6a] + mov r1, #1 + mov r0, r1, lsl r0 + ldrh r1, [r6, #0x2e] + mov r0, r0, lsl #0x10 + tst r1, r0, lsr #16 + moveq r0, #0 + movne r0, #0x2000 + strh r0, [r5, #6] + ldr r0, _06015668 ; =0x04808098 + ldrh r0, [r0] + tst r0, #0x8000 + beq _060155AC + mov r0, r0, lsl #0x11 + mov r0, r0, lsr #0x10 + add r0, r0, #0x4800000 + add r0, r0, #0x4000 + ldrh r0, [r0, #4] + cmp r0, #0 + ldrneh r0, [r5, #6] + orrne r0, r0, #0x4000 + strneh r0, [r5, #6] +_060155AC: + ldrh r0, [r4, #0x88] + bl CAM_UpdateLifeTime + ldrh r1, [r6, #0x10] + ldr r0, _0601566C ; =0x00000182 + sub r1, r1, #0x1c + strh r1, [r6, #6] + sub r1, r6, #0x10 + strh r0, [r1, #0xc] + ldrh r2, [r6, #6] + mov r0, #0 + add r2, r2, #0x31 + mov r2, r2, lsr #1 + strh r2, [r1, #0xe] + ldrh r2, [r1, #0x3e] + b _060155F8 +_060155E8: + tst r2, #1 + mov r2, r2, lsl #0xf + addne r0, r0, #1 + mov r2, r2, lsr #0x10 +_060155F8: + cmp r2, #0 + bne _060155E8 + ldr r2, _06015670 ; =0x04808094 + ldrh r3, [r5, #6] + ldrh r4, [r2] + ldrh r2, [r2, #4] + ldrh r5, [r1, #0x18] + and r2, r2, #0x8000 + and r4, r4, #0x8000 + orr r2, r3, r2, asr #4 + orr r2, r2, r4, asr #3 + orr r2, r5, r2 + strh r2, [r1, #0x18] + ldrh r2, [r1, #0x3c] + ldrh r3, [r1, #0x1c] + add r2, r2, #0xa + mul r2, r0, r2 + add r0, r2, #0xfc + add r2, r3, r0, lsr #4 + ldr r0, _06015664 ; =0x0380FFF4 + strh r2, [r1, #0x1a] + ldr r0, [r0] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #0 +_0601565C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06015664: .word 0x0380FFF4 +_06015668: .word 0x04808098 +_0601566C: .word 0x00000182 +_06015670: .word 0x04808094 + arm_func_end RxMpFrame + + arm_func_start RxKeyDataFrame +RxKeyDataFrame: ; 0x06015674 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _0601581C ; =0x0380FFF4 + mov r7, r0 + ldr r1, [r1] + add r0, r1, #0x2c + add r5, r0, #0x400 + ldrh r0, [r5, #0x3c] + ldr r4, [r5, #0x90] + cmp r0, #0 + beq _06015814 + add r0, r7, #0x18 + add r1, r1, #0x3a8 + bl MatchMacAdrs + cmp r0, #0 + beq _06015814 + ldrh r1, [r7, #0x10] + ldrh r0, [r4, #0x16] + sub r1, r1, #0x18 + sub r0, r0, #8 + cmp r1, r0 + bgt _06015814 + add r0, r7, #0x1e + bl CAM_Search + mov r6, r0 + cmp r6, #0xff + beq _060156F0 + cmp r6, #0 + beq _0601572C + bl CAM_GetStaState + cmp r0, #0x40 + beq _0601572C +_060156F0: + add r0, r7, #0x1e + mov r1, #0xc0 + bl IsExistManFrame + cmp r0, #0 + bne _06015814 + add r0, r7, #0x1e + mov r1, #7 + mov r2, #0 + bl MakeDeAuthFrame + cmp r0, #0 + beq _06015814 + mov r1, #2 + strh r1, [r0] + bl TxManCtrlFrame + b _06015814 +_0601572C: + cmp r6, #0 + beq _06015814 + ldrh r1, [r7, #0x14] + mov r0, r6, lsl #0x10 + mov r1, r1, lsl #0x13 + mov r0, r0, lsr #0x10 + mov r1, r1, lsr #0x1f + bl CAM_SetPowerMgtMode + mov r0, r6 + bl CAM_UpdateLifeTime + mov r0, r6 + bl CAM_GetAID + mov r1, #1 + mov r0, r1, lsl r0 + mov r0, r0, lsl #0x10 + ldrh r1, [r5, #0x9a] + mov r2, r0, lsr #0x10 + tst r2, r1 + bne _06015814 + ldrh r0, [r5, #0x98] + tst r2, r0 + beq _06015814 + orr r0, r1, r2 + strh r0, [r5, #0x9a] + ldrh r1, [r4, #0x10] + mvn r0, r2 + and r1, r1, r0 + mov r0, r2, lsl #0xf + strh r1, [r4, #0x10] + add r6, r4, #0x1a + mov r1, r0, lsr #0x10 + b _060157C4 +_060157AC: + ldrh r0, [r5, #0x98] + tst r1, r0 + ldrneh r0, [r4, #0x16] + addne r6, r6, r0 + mov r0, r1, lsl #0xf + mov r1, r0, lsr #0x10 +_060157C4: + cmp r1, #1 + bne _060157AC + ldrh r1, [r7, #0x10] + add r0, r6, #3 + sub r1, r1, #0x18 + strh r1, [r6] + ldrh r1, [r7, #0x12] + and r1, r1, #0xff + bl WL_WriteByte + ldrh r1, [r7, #0xe] + add r0, r6, #2 + and r1, r1, #0xff + bl WL_WriteByte + ldrh r2, [r6] + cmp r2, #0 + beq _06015814 + add r0, r7, #0x2c + add r1, r6, #8 + add r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 +_06015814: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_0601581C: .word 0x0380FFF4 + arm_func_end RxKeyDataFrame + + arm_func_start RxMpAckFrame +RxMpAckFrame: ; 0x06015820 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _060158E8 ; =0x0380FFF4 + mov r4, r0 + ldr r1, [r1] + add r0, r1, #0x300 + ldrh r0, [r0, #0x4c] + add r5, r1, #0x344 + cmp r0, #0x40 + movne r0, #1 + bne _060158E0 + add r0, r4, #0x1e + add r1, r5, #0x64 + bl MatchMacAdrs + cmp r0, #0 + beq _06015870 + add r0, r4, #0x24 + add r1, r5, #0x82 + bl MatchMacAdrs + cmp r0, #0 + bne _06015878 +_06015870: + mov r0, #1 + b _060158E0 +_06015878: + ldrh r1, [r4, #0x10] + ldr r0, _060158EC ; =0x00000185 + sub r1, r1, #0x1c + strh r1, [r4, #6] + sub r1, r4, #0x10 + strh r0, [r1, #0xc] + mov r0, #0x18 + strh r0, [r1, #0xe] + ldr r4, _060158E8 ; =0x0380FFF4 + ldr r2, _060158F0 ; =0x04808094 + ldr r0, [r4] + ldrh ip, [r2] + add r0, r0, #0x400 + ldrh r2, [r2, #4] + ldrh r3, [r0, #0xe2] + and r0, r2, #0x8000 + ldrh lr, [r1, #0x18] + and r2, ip, #0x8000 + orr r0, r3, r0, asr #4 + orr r0, r0, r2, asr #3 + orr r0, lr, r0 + strh r0, [r1, #0x18] + ldr r0, [r4] + add r0, r0, #0x188 + bl SendMessageToWmDirect + mov r0, #0 +_060158E0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_060158E8: .word 0x0380FFF4 +_060158EC: .word 0x00000185 +_060158F0: .word 0x04808094 + arm_func_end RxMpAckFrame + + arm_func_start RxBeaconFrame +RxBeaconFrame: ; 0x060158F4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x44 + ldr r1, _06015F1C ; =0x0380FFF4 + mov sl, r0 + ldr r3, [r1] + add r0, sl, #0x1e + ldr r2, [r3, #0x570] + add r1, r3, #4 + add r2, r2, #1 + str r2, [r3, #0x570] + add r4, r3, #0x344 + add r5, r1, #0x400 + add r6, r3, #0x31c + add r7, r3, #0x17c + bl CAM_SearchAdd + mov r8, r0 + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + strh r0, [sl, #2] + cmp r8, #0xff + beq _06015F10 + ldrh r1, [sl, #0x12] + bl CAM_SetRSSI + ldrh sb, [sl, #6] + cmp sb, #0xc + bls _06015F10 + add r1, sp, #0x18 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear32 + add r2, sl, #0x38 + sub r1, sb, #0xc + mov r0, #2 + str r2, [sp, #0x18] + strh r1, [sp, #0x20] + strh r0, [sp, #0x22] + ldrh r0, [r4, #0x1e] + cmp r0, #0 + ldreqh r0, [sp, #0x22] + orreq r0, r0, #1 + streqh r0, [sp, #0x22] + mov r0, #0x38 + strh r0, [sp, #0x24] + ldrh r1, [sl, #8] + add r0, sp, #0x18 + strh r1, [sp, #0x1c] + ldrh r1, [sl, #0x36] + strh r1, [sp, #0x1e] + bl ElementChecker + ldr sb, [sp, #0x38] + cmp sb, #0 + beq _060159F0 + ldrh r0, [sl, #0x16] + tst r0, #0x8000 + beq _060159F0 + add r0, sb, #6 + bl WL_ReadByte + mov fp, r0 + add r0, sb, #7 + bl WL_ReadByte + ldr r1, _06015F20 ; =0x0480810C + add r0, fp, r0, lsl #8 + strh r0, [r1] +_060159F0: + ldrh r1, [r5] + cmp r1, #0x13 + ldreq r0, [r5, #0x18] + ldreqh r0, [r0, #0x38] + cmpeq r0, #1 + bne _06015A28 + ldrh r0, [sp, #0x22] + and r0, r0, #9 + cmp r0, #9 + bne _06015EF8 + add r1, sp, #0x18 + mov r0, sl + bl RxProbeResFrame + b _06015EF8 +_06015A28: + ldrh r0, [sp, #0x22] + tst r0, #8 + beq _06015EF8 + cmp r1, #0x21 + bne _06015BB0 + bl ClearTimeOut + ldrh r0, [sp, #0x22] + and r0, r0, #0x30 + cmp r0, #0x30 + movne r0, #0xc + strneh r0, [r5, #4] + movne r0, #0xa + strneh r0, [r5, #6] + bne _06015B8C + ldrh r0, [sl, #0x34] + cmp r0, #0x3e8 + movhi r0, #0xc + strhih r0, [r5, #4] + movhi r0, #1 + strhih r0, [r5, #6] + bhi _06015B8C + mov r1, #0 + strh r1, [r5, #4] + ldrh r0, [sp, #0x24] + tst r0, #2 + beq _06015AA4 + ldrh r0, [sp, #0x22] + tst r0, #2 + bne _06015AA4 + ldrh r0, [sp, #0x2a] + bl WSetChannel +_06015AA4: + ldrh r1, [sp, #0x2e] + mov r0, r8 + bl CAM_SetSupRate + ldrh r0, [r4, #0xc] + cmp r0, #2 + bne _06015B34 + ldr sb, [sp, #0x40] + cmp sb, #0 + beq _06015B1C + add r0, sb, #6 + bl WL_ReadByte + mov fp, r0 + add r0, sb, #7 + bl WL_ReadByte + add r0, fp, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #1 + bl WSetActiveZoneTime + ldr r0, [sp, #0x40] + add r0, r0, #8 + bl WL_ReadByte + ldr r1, [sp, #0x40] + mov sb, r0 + add r0, r1, #9 + bl WL_ReadByte + add r1, sb, r0, lsl #8 + ldr r0, _06015F24 ; =0x0380FFF0 + strh r1, [r0] + b _06015B34 +_06015B1C: + ldr r0, _06015F28 ; =0x0000FFFF + mov r1, #1 + bl WSetActiveZoneTime + ldr r0, _06015F24 ; =0x0380FFF0 + mov r1, #0 + strh r1, [r0] +_06015B34: + ldr r0, [sp, #0x3c] + add r0, r0, #3 + bl WL_ReadByte + bl WSetDTIMPeriod + ldr r0, [sp, #0x3c] + add r0, r0, #2 + bl WL_ReadByte + strh r0, [r4, #0x76] + ldrh r0, [sl, #0x34] + bl WSetBeaconPeriod + mov r0, #1 + strh r0, [r4, #0x12] + strh r0, [r4, #0x1a] + ldrh r0, [r4, #0xc] + cmp r0, #2 + ldreq r0, _06015F2C ; =0x04808048 + moveq r1, #3 + streqh r1, [r0] + ldr r1, _06015F30 ; =0x04808038 + ldrh r0, [r1] + orr r0, r0, #1 + strh r0, [r1] +_06015B8C: + ldr r0, [r5, #0x1c] + add r1, sl, #0x1e + add r0, r0, #8 + bl WSetMacAdrs1 + mov r2, #0x25 + mov r0, #2 + mov r1, #1 + strh r2, [r5] + bl AddTask +_06015BB0: + ldrh r0, [r4, #0xc] + cmp r0, #2 + beq _06015BC8 + cmp r0, #3 + beq _06015C80 + b _06015EE0 +_06015BC8: + ldr sb, [sp, #0x40] + cmp sb, #0 + beq _06015C80 + add r0, sb, #6 + bl WL_ReadByte + mov r5, r0 + add r0, sb, #7 + bl WL_ReadByte + add r0, r5, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + bl WSetActiveZoneTime + ldr r0, [sp, #0x40] + add r0, r0, #8 + bl WL_ReadByte + ldr r1, [sp, #0x40] + mov r5, r0 + add r0, r1, #9 + bl WL_ReadByte + ldr r1, _06015F24 ; =0x0380FFF0 + add r0, r5, r0, lsl #8 + strh r0, [r1] + ldr r0, [sp, #0x40] + add r0, r0, #1 + bl WL_ReadByte + sub r0, r0, #8 + strh r0, [r4, #0xa0] + ldrh r2, [r4, #0xa0] + cmp r2, #0 + beq _06015C80 + ldr r0, [sp, #0x40] + ldr r1, [r4, #0x9c] + tst r0, #1 + beq _06015C6C + add r0, r0, #9 + add r2, r2, #2 + bl __VENEER_MIi_CpuCopy16 + mov r0, #1 + strh r0, [r4, #0xa2] + b _06015C80 +_06015C6C: + add r0, r0, #0xa + add r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 + mov r0, #0 + strh r0, [r4, #0xa2] +_06015C80: + mov r1, #0 + mov r0, r8 + strh r1, [r4, #0x80] + bl CAM_UpdateLifeTime + add r1, sl, #0x2c + add r0, sp, #0x10 + ldmia r1, {r2, r3} + stmia r0, {r2, r3} + ldrh r0, [r4, #0x6e] + mov r5, #0 + mov r8, r0, lsl #0xa + ldr r0, [sp, #0x10] + ldr r1, [sp, #0x14] + mov r2, r8 + mov r3, r5 + bl __VENEER__ll_udiv + adds fp, r0, #1 + umull r3, r0, fp, r8 + adc sb, r1, #0 + mla r0, fp, r5, r0 + mla r0, sb, r8, r0 + add r2, sp, #0x10 + str r0, [sp, #0x14] + ldr r1, _06015F34 ; =0x048080F6 + ldrh r0, [r2, #6] + str r3, [sp, #0x10] + strh r0, [r1] + ldrh r0, [r2, #4] + strh r0, [r1, #-2] + ldrh r0, [r2, #2] + strh r0, [r1, #-4] + ldrh r0, [r2] + orr r0, r0, #1 + strh r0, [r1, #-6] + ldrh r0, [r4, #0xc] + cmp r0, #2 + bne _06015DE8 + ldrh r0, [r4, #0x1a] + cmp r0, #0 + beq _06015DE8 + ldr r1, [sp, #0x10] + ldr r0, [sp, #0x14] + subs r1, r1, r8 + sbc r0, r0, r5 + str r1, [sp, #0x10] + str r0, [sp, #0x14] + bl __VENEER_OS_DisableInterrupts + ldr r1, _06015F38 ; =0x048080F8 + ldrh ip, [r1] + ldrh fp, [r1, #2] + ldrh sb, [r1, #4] + ldrh r8, [r1, #6] + ldrh r5, [r1] + ldrh r3, [r1, #2] + ldrh r2, [r1, #4] + ldrh r1, [r1, #6] + strh ip, [sp, #8] + strh r5, [sp] + strh fp, [sp, #0xa] + strh sb, [sp, #0xc] + strh r8, [sp, #0xe] + strh r3, [sp, #2] + strh r2, [sp, #4] + strh r1, [sp, #6] + bl __VENEER_OS_RestoreInterrupts + ldrh r1, [sp, #8] + ldrh r0, [sp] + cmp r1, r0 + bhs _06015DAC + ldr r2, [sp, #8] + ldr r0, [sp, #0x10] + ldr r1, [sp, #0xc] + subs r2, r2, r0 + ldr r0, [sp, #0x14] + b _06015DC0 +_06015DAC: + ldr r2, [sp] + ldr r0, [sp, #0x10] + ldr r1, [sp, #4] + subs r2, r2, r0 + ldr r0, [sp, #0x14] +_06015DC0: + sbc r0, r1, r0 + mov r2, r2, lsr #0xa + orr r2, r2, r0, lsl #22 + ldrh r1, [r6, #0x20] + ldr r0, _06015F3C ; =0x04808134 + cmp r2, r1 + sublo r1, r1, r2 + strloh r1, [r0] + movhs r1, #0 + strhsh r1, [r0] +_06015DE8: + ldrh r0, [r4, #8] + cmp r0, #0x40 + bne _06015EE0 + ldr r1, [sp, #0x3c] + cmp r1, #0 + beq _06015EE0 + ldrh r0, [r4, #0xe] + cmp r0, #1 + bne _06015EE0 + add r0, r1, #2 + bl WL_ReadByte + ldrh r1, [r4, #0x76] + cmp r1, r0 + strneh r0, [r4, #0x76] + mov r1, #0 + strh r1, [r4, #0x8e] + cmp r0, #0 + bne _06015E4C + ldr r0, [sp, #0x3c] + add r0, r0, #4 + bl WL_ReadByte + tst r0, #1 + ldrneh r0, [r4, #0x8e] + orrne r0, r0, #1 + strneh r0, [r4, #0x8e] +_06015E4C: + ldr r0, [sp, #0x3c] + add r0, r0, #4 + bl WL_ReadByte + ldr r1, [sp, #0x3c] + and r8, r0, #0xfe + add r0, r1, #1 + mov r5, r8, lsl #3 + bl WL_ReadByte + ldrh r1, [r4, #0x6a] + add r0, r8, r0 + cmp r1, r8, lsl #3 + sub r0, r0, #3 + blo _06015EBC + cmp r1, r0, lsl #3 + bhi _06015EBC + ldr r0, [sp, #0x3c] + sub r5, r1, r5 + add r0, r0, #5 + add r0, r0, r5, lsr #3 + bl WL_ReadByte + and r1, r5, #7 + mov r2, #1 + tst r0, r2, lsl r1 + beq _06015EBC + ldrh r0, [r4, #0x8e] + orr r0, r0, #2 + strh r0, [r4, #0x8e] + bl TxPsPollFrame +_06015EBC: + ldrh r0, [r7, #0x20] + cmp r0, #0 + ldreqh r0, [r7, #0x2c] + cmpeq r0, #0 + ldreqh r0, [r4, #0x8e] + cmpeq r0, #0 + bne _06015EE0 + mov r0, #1 + bl WSetPowerState +_06015EE0: + ldrh r0, [r6, #0x1e] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + beq _06015EF8 + mov r0, sl + bl MLME_IssueBeaconRecvIndication +_06015EF8: + ldr r2, [sp, #0x34] + cmp r2, #0 + beq _06015F10 + ldrh r0, [sp, #0x2a] + mov r1, sl + bl UpdateApList +_06015F10: + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06015F1C: .word 0x0380FFF4 +_06015F20: .word 0x0480810C +_06015F24: .word 0x0380FFF0 +_06015F28: .word 0x0000FFFF +_06015F2C: .word 0x04808048 +_06015F30: .word 0x04808038 +_06015F34: .word 0x048080F6 +_06015F38: .word 0x048080F8 +_06015F3C: .word 0x04808134 + arm_func_end RxBeaconFrame + + arm_func_start RxDisAssFrame +RxDisAssFrame: ; 0x06015F40 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0601601C ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + ldrh r5, [r4, #2] + add r1, r0, #0x344 + ldrh r0, [r1, #0xc] + cmp r0, #1 + beq _06015F74 + cmp r0, #2 + cmpne r0, #3 + beq _06015FDC + b _06016014 +_06015F74: + mov r0, r5 + bl CAM_GetStaState + cmp r0, #0x40 + bne _06015FAC + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x30 + bl CAM_SetStaState + ldrh r1, [r4, #0x2c] + add r0, r4, #0x1e + bl MLME_IssueDisAssIndication + mov r0, r5 + bl DeleteTxFrames + b _06016014 +_06015FAC: + cmp r0, #0x30 + add r0, r4, #0x1e + mov r1, #7 + bne _06015FC4 + bl MakeDisAssFrame + b _06015FCC +_06015FC4: + mov r2, #1 + bl MakeDeAuthFrame +_06015FCC: + cmp r0, #0 + beq _06016014 + bl TxManCtrlFrame + b _06016014 +_06015FDC: + ldrh r0, [r1, #8] + cmp r0, #0x40 + bne _06016014 + add r0, r4, #0x1e + add r1, r1, #0x82 + bl MatchMacAdrs + cmp r0, #0 + beq _06016014 + mov r0, #0x30 + bl WSetStaState + bl WClearAids + ldrh r1, [r4, #0x2c] + add r0, r4, #0x1e + bl MLME_IssueDisAssIndication +_06016014: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0601601C: .word 0x0380FFF4 + arm_func_end RxDisAssFrame + + arm_func_start RxAssReqFrame +RxAssReqFrame: ; 0x06016020 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x2c + ldr r1, _060161E8 ; =0x0380FFF4 + mov r7, r0 + ldr r0, [r1] + ldrh r5, [r7, #6] + add r4, r0, #0x31c + cmp r5, #4 + bls _060161DC + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + bne _060161DC + add r0, r7, #0x1e + mov r1, #0x10 + bl IsExistManFrame + cmp r0, #0 + bne _060161DC + ldrh r6, [r7, #2] + cmp r6, #0 + beq _06016084 + mov r0, r6 + bl CAM_GetStaState + cmp r0, #0x30 + bhs _060160B8 +_06016084: + add r0, r7, #0x1e + mov r1, #0xc0 + bl IsExistManFrame + cmp r0, #0 + bne _060161DC + add r0, r7, #0x1e + mov r1, #6 + mov r2, #1 + bl MakeDeAuthFrame + cmp r0, #0 + beq _060161DC + bl TxManCtrlFrame + b _060161DC +_060160B8: + mov r0, r6 + bl CAM_GetStaState + cmp r0, #0x40 + mov r0, r6 + bne _060160E4 + mov r1, #0x30 + bl CAM_SetStaState + add r0, r7, #0x1e + mov r1, #1 + bl MLME_IssueDisAssIndication + b _060160F0 +_060160E4: + bl CAM_GetAID + cmp r0, #0 + bne _060161DC +_060160F0: + add r1, sp, #0 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear32 + add r2, r7, #0x30 + sub r1, r5, #4 + str r2, [sp] + strh r1, [sp, #8] + add r0, sp, #0 + bl ElementChecker + ldrh r1, [r7, #0x2c] + ldr r0, _060161EC ; =0x0000FFC2 + tst r1, r0 + bne _06016188 + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _06016188 + ldrh r2, [r4, #0x18] + cmp r2, #0 + moveq r0, r1, lsl #0x1b + moveq r0, r0, lsr #0x1f + cmpeq r0, #1 + beq _06016188 + cmp r2, #0 + beq _06016164 + ldrh r0, [r7, #0x2c] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _06016188 +_06016164: + ldrh r0, [r4, #0x1e] + mov r0, r0, lsl #0x1d + mov r0, r0, lsr #0x1f + cmp r0, #1 + bne _06016190 + ldrh r0, [r7, #0x2c] + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + bne _06016190 +_06016188: + mov r1, #0xa + b _060161C4 +_06016190: + mov r0, r6 + bl CAM_SetCapaInfo + ldrh r0, [sp, #0xa] + tst r0, #1 + moveq r1, #1 + beq _060161C4 + tst r0, #4 + moveq r1, #0x12 + beq _060161C4 + ldrh r1, [sp, #0x16] + mov r0, r6 + bl CAM_SetSupRate + mov r1, #0 +_060161C4: + ldr r2, [sp, #0x1c] + mov r0, r6 + bl MakeAssResFrame + cmp r0, #0 + beq _060161DC + bl TxManCtrlFrame +_060161DC: + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_060161E8: .word 0x0380FFF4 +_060161EC: .word 0x0000FFC2 + arm_func_end RxAssReqFrame + + arm_func_start RxProbeReqFrame +RxProbeReqFrame: ; 0x060161F0 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x2c + mov r4, r0 + add r0, r4, #0x1e + mov r1, #0x50 + bl IsExistManFrame + cmp r0, #0 + bne _06016294 + ldrh r0, [r4, #0x24] + tst r0, #1 + bne _06016228 + ldrh r0, [r4, #8] + tst r0, #0x8000 + beq _06016294 +_06016228: + add r1, sp, #0 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear32 + add r0, r4, #0x2c + str r0, [sp] + ldrh r1, [r4, #6] + ldr r0, _060162A0 ; =0x0380FFF4 + strh r1, [sp, #8] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x3a] + mov r0, r0, lsl #0x1e + movs r0, r0, lsr #0x1f + moveq r0, #0x800 + streqh r0, [sp, #0xc] + add r0, sp, #0 + bl ElementChecker + ldrh r0, [sp, #0xa] + and r0, r0, #1 + cmp r0, #1 + bne _06016294 + add r0, r4, #0x1e + bl MakeProbeResFrame + cmp r0, #0 + beq _06016294 + bl TxManCtrlFrame +_06016294: + add sp, sp, #0x2c + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_060162A0: .word 0x0380FFF4 + arm_func_end RxProbeReqFrame + + arm_func_start RxProbeResFrame +RxProbeResFrame: ; 0x060162A4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + ldr r2, _0601666C ; =0x0380FFF4 + mov r7, r0 + ldr r2, [r2] + mov sl, r1 + add r0, r2, #0x400 + ldrh r1, [r0, #4] + add r0, r2, #4 + cmp r1, #0x13 + add r4, r0, #0x400 + bne _06016660 + ldr r0, [r4, #0x18] + ldr r5, [r4, #0x1c] + add r8, r0, #0x4e + mov r6, #0 + b _06016314 +_060162E8: + mov r0, r8 + add r1, r7, #0x24 + bl MatchMacAdrs + cmp r0, #0 + ldrneh r1, [r5, #6] + movne r0, #1 + orrne r0, r1, r0, lsl r6 + strneh r0, [r5, #6] + bne _06016660 + add r8, r8, #6 + add r6, r6, #1 +_06016314: + ldr r0, [r4, #0x18] + ldrh r0, [r0, #0x4c] + cmp r6, r0 + blo _060162E8 + add r6, r5, #0xa + mov r8, #0 + b _06016350 +_06016330: + add r0, r7, #0x24 + add r1, r6, #4 + bl MatchMacAdrs + cmp r0, #0 + bne _06016660 + ldrh r0, [r6] + add r8, r8, #1 + add r6, r6, r0, lsl #1 +_06016350: + ldrh r0, [r5, #8] + cmp r8, r0 + blo _06016330 + mov r1, r6 + mov r0, #0 + mov r2, #0x40 + bl __VENEER_MIi_CpuClear16 + ldrh r8, [r7, #6] + cmp r8, #0xc + bls _06016660 + cmp sl, #0 + bne _060163CC + add r1, sp, #4 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear32 + add r3, r7, #0x38 + sub r2, r8, #0xc + mov r0, #0x38 + strh r0, [sp, #0x10] + mov r1, #3 + str r3, [sp, #4] + strh r2, [sp, #0xc] + strh r1, [sp, #0xe] + ldrh r1, [r7, #8] + add r0, sp, #4 + strh r1, [sp, #8] + ldrh r1, [r7, #0x36] + strh r1, [sp, #0xa] + bl ElementChecker + add sl, sp, #4 +_060163CC: + ldr r0, [sl, #0x28] + cmp r0, #0 + ldreqh r0, [sl, #0x1a] + beq _060163F0 + add r0, r0, #1 + bl WL_ReadByte + sub r0, r0, #8 + strh r0, [r6, #0x3c] + ldrh r0, [r6, #0x3c] +_060163F0: + add r0, r0, #0x41 + mov r0, r0, lsr #1 + strh r0, [r6] + ldrh r0, [sl, #0xa] + and r0, r0, #1 + cmp r0, #1 + bne _06016654 + ldr r0, _0601666C ; =0x0380FFF4 + ldrh r1, [r6] + ldr r0, [r0] + add r0, r0, #0x400 + ldrh r0, [r0, #8] + cmp r0, r1 + blo _06016654 + ldrh r1, [r7, #0x36] + add r0, r6, #4 + strh r1, [r6, #0x2c] + add r1, r7, #0x24 + bl WSetMacAdrs1 + ldrh r0, [r7, #0x34] + strh r0, [r6, #0x32] + ldrh r0, [r7, #0x12] + and r0, r0, #0xff + strh r0, [r6, #2] + ldr r0, [sl, #0x28] + cmp r0, #0 + beq _06016498 + mov r7, #0 + add r8, r6, #0x40 + b _06016488 +_06016468: + ldr r0, [sl, #0x28] + add r0, r0, #0xa + add r0, r0, r7 + bl WL_ReadByte + mov r1, r0 + add r0, r8, r7 + bl WL_WriteByte + add r7, r7, #1 +_06016488: + ldrh r0, [r6, #0x3c] + cmp r7, r0 + blo _06016468 + b _0601653C +_06016498: + ldrh r0, [sl, #0x18] + strh r0, [r6, #0x3e] + ldrh r0, [sl, #0x18] + cmp r0, #0 + beq _0601653C + add r7, r7, #0x38 + add fp, r6, #0x40 + mov r8, #0 + b _06016530 +_060164BC: + mov r0, r7 + bl WL_ReadByte + mov sb, r0 + add r0, r7, #1 + bl WL_ReadByte + cmp sb, #6 + bls _06016528 + ldr r1, [sl, #0x28] + cmp r7, r1 + beq _06016528 + add r0, r0, #2 + mov sb, #0 + str r0, [sp] + b _06016514 +_060164F4: + mov r0, r7 + bl WL_ReadByte + mov r1, r0 + mov r0, fp + bl WL_WriteByte + add fp, fp, #1 + add r7, r7, #1 + add sb, sb, #1 +_06016514: + ldr r0, [sp] + cmp sb, r0 + blo _060164F4 + add r8, r8, #1 + b _06016530 +_06016528: + add r0, r0, #2 + add r7, r7, r0 +_06016530: + ldrh r0, [sl, #0x18] + cmp r8, r0 + blo _060164BC +_0601653C: + ldr r0, [sl, #0x1c] + cmp r0, #0 + beq _06016590 + add r0, r0, #1 + bl WL_ReadByte + strh r0, [r6, #0xa] + mov r7, #0 + add r8, r6, #0xc + b _06016580 +_06016560: + ldr r0, [sl, #0x1c] + add r0, r0, #2 + add r0, r0, r7 + bl WL_ReadByte + mov r1, r0 + add r0, r8, r7 + bl WL_WriteByte + add r7, r7, #1 +_06016580: + ldrh r0, [r6, #0xa] + cmp r7, r0 + blo _06016560 + b _060165B8 +_06016590: + mov sb, #0 + strh sb, [r6, #0xa] + add r8, r6, #0xc + mov r7, sb +_060165A0: + mov r1, r7 + add r0, r8, sb + bl WL_WriteByte + add sb, sb, #1 + cmp sb, #0x20 + blo _060165A0 +_060165B8: + ldrh r0, [sl, #0x14] + strh r0, [r6, #0x2e] + ldrh r0, [sl, #0x16] + strh r0, [r6, #0x30] + ldrh r0, [sl, #0x12] + strh r0, [r6, #0x36] + ldr r0, [sl, #0x20] + cmp r0, #0 + beq _060165E8 + add r0, r0, #3 + bl WL_ReadByte + strh r0, [r6, #0x38] +_060165E8: + ldr r0, [sl, #0x24] + cmp r0, #0 + beq _06016600 + add r0, r0, #3 + bl WL_ReadByte + strh r0, [r6, #0x34] +_06016600: + ldrh r1, [r5, #2] + ldrh r0, [r6] + add r0, r1, r0 + strh r0, [r5, #2] + ldrh r0, [r5, #8] + add r0, r0, #1 + strh r0, [r5, #8] + ldrh r1, [r4, #4] + ldrh r0, [r6] + sub r0, r1, r0 + strh r0, [r4, #4] + ldrh r0, [r4, #4] + cmp r0, #0x20 + bhs _06016660 + bl ClearTimeOut + mov r2, #0x15 + mov r0, #2 + mov r1, #0 + strh r2, [r4] + bl AddTask + b _06016660 +_06016654: + ldr r1, _06016670 ; =NULL_ADRS + add r0, r6, #4 + bl WSetMacAdrs1 +_06016660: + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0601666C: .word 0x0380FFF4 +_06016670: .word NULL_ADRS + arm_func_end RxProbeResFrame + + arm_func_start RxAuthFrame +RxAuthFrame: ; 0x06016674 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _06016C00 ; =0x0380FFF4 + mov sl, r0 + ldr r2, [r1] + add r0, r2, #0x600 + ldrh r1, [r0, #0x90] + add r0, r2, #4 + tst r1, #8 + add r4, r2, #0x344 + add sb, r0, #0x400 + beq _06016714 + ldr r1, _06016C04 ; =0x048080B0 + add r0, r2, #0x2c + ldrh r2, [r1] + add r1, r0, #0x400 + tst r2, #1 + ldrneh r0, [r1] + cmpne r0, #0 + bne _06016714 + tst r2, #4 + ldrneh r0, [r1, #0x14] + cmpne r0, #0 + bne _06016714 + tst r2, #8 + ldrneh r0, [r1, #0x28] + cmpne r0, #0 + bne _06016714 + ldr r0, _06016C08 ; =0x0480819C + ldrh r0, [r0] + tst r0, #1 + bne _06016714 + ldr r2, _06016C0C ; =0x04808032 + mov r3, #0 + strh r3, [r2] + mov r1, #0x8000 + ldr r0, _06016C00 ; =0x0380FFF4 + strh r1, [r2] + ldr r0, [r0] + add r0, r0, #0x400 + strh r3, [r0, #0xde] +_06016714: + add r0, sl, #0x1e + mov r1, #0xb0 + bl IsExistManFrame + cmp r0, #0 + bne _06016BF8 + ldrh r0, [sl, #0x2e] + ldrh r8, [sl, #2] + add r0, r0, #1 + mov r0, r0, lsl #0x10 + cmp r8, #0 + mov r5, #0 + mov r6, r0, lsr #0x10 + moveq r7, #0x13 + moveq r5, #1 + beq _06016BBC + ldrh r0, [r4, #0xc] + cmp r0, #1 + bne _060167C4 + mov r0, r8 + bl CAM_GetStaState + cmp r0, #0x20 + bls _06016788 + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + add r0, sl, #0x1e + mov r1, #1 + bl MLME_IssueDeAuthIndication +_06016788: + ldrh r0, [sl, #8] + tst r0, #0x400 + beq _060167C4 + mov r0, r8 + bl CAM_GetAuthSeed + cmp r0, #0 + beq _060167C4 + mov r5, #1 + mov r0, r8 + mov r1, #0 + strh r5, [sl, #0x2c] + mov r7, #0xf + mov r6, #4 + bl CAM_SetAuthSeed + b _06016BBC +_060167C4: + ldrh r0, [sl, #0x2c] + cmp r0, #0 + beq _060167DC + cmp r0, #1 + beq _060168B8 + b _06016BAC +_060167DC: + ldrh r1, [r4, #0xc] + cmp r1, #1 + ldreq r0, _06016C00 ; =0x0380FFF4 + ldreq r0, [r0] + addeq r0, r0, #0x300 + ldreqh r0, [r0, #0x32] + cmpeq r0, #1 + moveq r7, #0xd + moveq r5, #1 + beq _06016BBC + cmp r1, #1 + bne _06016828 + ldrh r0, [sl, #0x2e] + mov r5, #1 + cmp r0, #1 + moveq r7, #0 + movne r7, #0xe + movne r6, #2 + b _06016BBC +_06016828: + beq _06016BBC + ldrh r0, [sl, #0x2e] + cmp r0, #2 + ldreq r1, [sb, #0x18] + ldreqh r0, [r1, #0x16] + cmpeq r0, #0 + bne _06016BBC + add r0, r1, #0x10 + add r1, sl, #0x1e + bl MatchMacAdrs + cmp r0, #0 + beq _06016BBC + ldrh r0, [sb] + cmp r0, #0x31 + bne _06016BBC + bl ClearTimeOut + ldrh r0, [sl, #0x30] + cmp r0, #0 + ldrne r0, [sb, #0x1c] + movne r1, #0xc + strneh r1, [r0, #4] + ldrneh r1, [sl, #0x30] + bne _06016898 + mov r0, #0x30 + bl WSetStaState + ldr r0, [sb, #0x1c] + mov r1, #0 + strh r1, [r0, #4] +_06016898: + ldr r0, [sb, #0x1c] + mov r2, #0x35 + strh r1, [r0, #6] + mov r0, #2 + mov r1, r0 + strh r2, [sb] + bl AddTask + b _06016BBC +_060168B8: + ldrh r0, [r4, #0xc] + cmp r0, #1 + bne _06016A58 + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + ldrh r0, [sl, #0x2e] + cmp r0, #1 + bne _06016974 + add r0, sl, #0x1e + mov r1, #0x80 + mov r2, #1 + bl MakeAuthFrame + movs r4, r0 + beq _06016BBC + ldrh r1, [sl, #0x2c] + ldr r0, _06016C10 ; =0x04808044 + strh r1, [r4, #0x2c] + strh r6, [r4, #0x2e] + mov r1, #0 + strh r1, [r4, #0x30] + ldrh r1, [r0] + ldrh r0, [r0] + add r0, r1, r0, lsl #8 + mov r0, r0, lsl #0x10 + movs sb, r0, lsr #0x10 + moveq sb, #1 + mov r0, sb + bl RND_seed + mov r0, r8 + mov r1, sb + bl CAM_SetAuthSeed + add r0, r4, #0x33 + add sb, r4, #0x34 + bl WL_ReadByte + mov fp, r0 + mov r8, #0 + b _06016960 +_06016954: + bl RND_rand + strh r0, [sb], #2 + add r8, r8, #2 +_06016960: + cmp r8, fp + blo _06016954 + mov r0, r4 + bl TxManCtrlFrame + b _06016BBC +_06016974: + cmp r0, #3 + mov r0, r8 + bne _06016A40 + bl CAM_GetStaState + cmp r0, #0x20 + bne _0601699C + mov r0, r8 + bl CAM_GetAuthSeed + cmp r0, #0 + bne _060169A8 +_0601699C: + mov r7, #1 + mov r5, r7 + b _06016BBC +_060169A8: + ldrh r0, [sl, #2] + bl CAM_GetAuthSeed + bl RND_seed + add r0, sl, #0x33 + add r7, sl, #0x34 + bl WL_ReadByte + mov r4, r0 + mov r5, #0 + b _060169E4 +_060169CC: + bl RND_rand + ldrh r1, [r7], #2 + cmp r1, r0 + movne r0, #0 + bne _06016A14 + add r5, r5, #1 +_060169E4: + cmp r5, r4, lsr #1 + blo _060169CC + tst r4, #1 + beq _06016A10 + bl RND_rand + ldrh r1, [r7] + and r0, r0, #0xff + and r1, r1, #0xff + cmp r1, r0 + movne r0, #0 + bne _06016A14 +_06016A10: + mov r0, #1 +_06016A14: + cmp r0, #0 + mov r0, r8 + mov r1, #0 + mov r5, #1 + bne _06016A34 + mov r7, #0xf + bl CAM_SetAuthSeed + b _06016BBC +_06016A34: + bl CAM_SetAuthSeed + mov r7, #0 + b _06016BBC +_06016A40: + mov r1, #0 + bl CAM_SetAuthSeed + mov r7, #0xe + mov r6, #2 + mov r5, #1 + b _06016BBC +_06016A58: + ldr r1, [sb, #0x18] + ldrh r0, [r1, #0x16] + cmp r0, #1 + bne _06016BBC + add r0, r1, #0x10 + add r1, sl, #0x1e + bl MatchMacAdrs + cmp r0, #0 + beq _06016BBC + ldrh r0, [sl, #0x2e] + cmp r0, #2 + bne _06016B48 + ldrh r0, [sb] + cmp r0, #0x31 + bne _06016BBC + ldrh r0, [sl, #0x30] + cmp r0, #0 + beq _06016ADC + bl ClearTimeOut + mov r0, #0x35 + strh r0, [sb] + ldr r0, [sb, #0x1c] + mov r1, #0xc + strh r1, [r0, #4] + mov r0, #2 + ldrh r3, [sl, #0x30] + ldr r2, [sb, #0x1c] + mov r1, r0 + strh r3, [r2, #6] + bl AddTask + mov r0, #0x20 + bl WSetStaState + b _06016BBC +_06016ADC: + mov r1, #0x33 + add r0, sl, #0x33 + strh r1, [sb] + bl WL_ReadByte + mov r1, r0 + add r0, sl, #0x1e + mov r2, #1 + bl MakeAuthFrame + movs r4, r0 + beq _06016BBC + ldrh r1, [r4, #0x14] + add r0, sl, #0x2c + orr r1, r1, #0x4000 + strh r1, [r4, #0x14] + ldrh r2, [sl, #6] + add r1, r4, #0x2c + add r2, r2, #1 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [sl, #0x2c] + mov r0, #3 + strh r1, [r4, #0x2c] + strh r0, [r4, #0x2e] + mov r1, #0 + mov r0, r4 + strh r1, [r4, #0x30] + bl TxManCtrlFrame + b _06016BBC +_06016B48: + cmp r0, #4 + ldreqh r0, [sb] + cmpeq r0, #0x33 + bne _06016BBC + bl ClearTimeOut + ldrh r0, [sl, #0x30] + cmp r0, #0 + ldrne r0, [sb, #0x1c] + movne r1, #0xc + strneh r1, [r0, #4] + ldrneh r1, [sl, #0x30] + bne _06016B8C + mov r0, #0x30 + bl WSetStaState + ldr r0, [sb, #0x1c] + mov r1, #0 + strh r1, [r0, #4] +_06016B8C: + ldr r0, [sb, #0x1c] + mov r2, #0x35 + strh r1, [r0, #6] + mov r0, #2 + mov r1, r0 + strh r2, [sb] + bl AddTask + b _06016BBC +_06016BAC: + ldrh r0, [r4, #0xc] + cmp r0, #1 + moveq r7, #0xd + moveq r5, #1 +_06016BBC: + cmp r5, #0 + beq _06016BF8 + cmp r7, #0 + movne r2, #1 + moveq r2, #0 + add r0, sl, #0x1e + mov r1, #0 + bl MakeAuthFrame + cmp r0, #0 + beq _06016BF8 + ldrh r1, [sl, #0x2c] + strh r1, [r0, #0x2c] + strh r6, [r0, #0x2e] + strh r7, [r0, #0x30] + bl TxManCtrlFrame +_06016BF8: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06016C00: .word 0x0380FFF4 +_06016C04: .word 0x048080B0 +_06016C08: .word 0x0480819C +_06016C0C: .word 0x04808032 +_06016C10: .word 0x04808044 + arm_func_end RxAuthFrame + + arm_func_start RxDeAuthFrame +RxDeAuthFrame: ; 0x06016C14 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _06016CC0 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + ldrh r5, [r4, #2] + add r1, r0, #0x344 + ldrh r0, [r1, #0xc] + cmp r0, #1 + beq _06016C48 + cmp r0, #2 + cmpne r0, #3 + beq _06016C80 + b _06016CB8 +_06016C48: + mov r0, r5 + bl CAM_GetStaState + cmp r0, #0x20 + bls _06016CB8 + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0x20 + bl CAM_SetStaState + ldrh r1, [r4, #0x2c] + add r0, r4, #0x1e + bl MLME_IssueDeAuthIndication + mov r0, r5 + bl DeleteTxFrames + b _06016CB8 +_06016C80: + ldrh r0, [r1, #8] + cmp r0, #0x20 + bls _06016CB8 + add r0, r4, #0x1e + add r1, r1, #0x82 + bl MatchMacAdrs + cmp r0, #0 + beq _06016CB8 + mov r0, #0x20 + bl WSetStaState + bl WClearAids + ldrh r1, [r4, #0x2c] + add r0, r4, #0x1e + bl MLME_IssueDeAuthIndication +_06016CB8: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_06016CC0: .word 0x0380FFF4 + arm_func_end RxDeAuthFrame + + arm_func_start ElementChecker +ElementChecker: ; 0x06016CC4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _06016FE4 ; =0x0380FFF4 + mov sb, r0 + ldr r0, [r1] + ldr r5, [sb] + add r4, r0, #0x344 + ldrh r0, [r4, #0x7a] + ldr sl, _06016FE4 ; =0x0380FFF4 + strh r0, [sb, #0x12] + ldrh r0, [sb, #0xc] + tst r0, #0x800 + ldrneh r0, [sb, #0xa] + orrne r0, r0, #1 + strneh r0, [sb, #0xa] + ldrh r6, [sb, #8] + b _06016F58 +_06016D04: + mov r0, r5 + bl WL_ReadByte + mov r8, r0 + add r0, r5, #1 + add r5, r5, #2 + bl WL_ReadByte + mov r7, r0 + cmp r8, #6 + addls pc, pc, r8, lsl #2 + b _06016D48 +_06016D2C: ; jump table + b _06016D54 ; case 0 + b _06016DC0 ; case 1 + b _06016F4C ; case 2 + b _06016E24 ; case 3 + b _06016E90 ; case 4 + b _06016E70 ; case 5 + b _06016F4C ; case 6 +_06016D48: + cmp r8, #0xdd + beq _06016EB0 + b _06016F30 +_06016D54: + cmp r7, #0x20 + bhi _06016F4C + ldrh r1, [sb, #0xc] + sub r0, r5, #2 + orr r1, r1, #1 + strh r1, [sb, #0xc] + str r0, [sb, #0x1c] + cmp r7, #0 + bne _06016D90 + ldrh r0, [sb, #0xc] + tst r0, #0x800 + ldrneh r0, [sb, #0xa] + orrne r0, r0, #1 + strneh r0, [sb, #0xa] + bne _06016F4C +_06016D90: + ldrh r1, [sb, #0xa] + mov r0, r7, lsl #0x10 + bic r2, r1, #1 + strh r2, [sb, #0xa] + mov r1, r5 + mov r0, r0, lsr #0x10 + bl WCheckSSID + cmp r0, #0 + ldrneh r0, [sb, #0xa] + orrne r0, r0, #1 + strneh r0, [sb, #0xa] + b _06016F4C +_06016DC0: + cmp r7, #1 + blo _06016F4C + ldrh r1, [sb, #0xc] + sub r0, r5, #2 + orr r1, r1, #4 + strh r1, [sb, #0xc] + add r1, sb, #0x14 + bl WElement2RateSet + ldrh r0, [r4, #0x60] + ldrh r1, [r4, #0x62] + ldrh r2, [sb, #0x14] + orr r1, r0, r1 + mvn r1, r1 + tst r2, r1 + ldreqh r1, [sb, #0x16] + orreq r1, r2, r1 + andeq r1, r0, r1 + cmpeq r0, r1 + ldreqh r0, [sb, #0xa] + orreq r0, r0, #4 + streqh r0, [sb, #0xa] + ldrneh r0, [sb, #0xa] + bicne r0, r0, #4 + strneh r0, [sb, #0xa] + b _06016F4C +_06016E24: + cmp r7, #1 + blo _06016F4C + ldrh r1, [sb, #0xc] + mov r0, r5 + orr r1, r1, #2 + strh r1, [sb, #0xc] + bl WL_ReadByte + strh r0, [sb, #0x12] + ldr r0, [sl] + ldrh r1, [sb, #0x12] + ldr r0, [r0, #0x41c] + ldrh r0, [r0, #0x4a] + cmp r1, r0 + ldrh r0, [sb, #0xa] + orreq r0, r0, #2 + streqh r0, [sb, #0xa] + bicne r0, r0, #2 + strneh r0, [sb, #0xa] + b _06016F4C +_06016E70: + cmp r7, #3 + blo _06016F4C + ldrh r1, [sb, #0xc] + sub r0, r5, #2 + orr r1, r1, #0x100 + strh r1, [sb, #0xc] + str r0, [sb, #0x24] + b _06016F4C +_06016E90: + cmp r7, #6 + blo _06016F4C + ldrh r1, [sb, #0xc] + sub r0, r5, #2 + orr r1, r1, #0x200 + strh r1, [sb, #0xc] + str r0, [sb, #0x20] + b _06016F4C +_06016EB0: + cmp r7, #8 + blo _06016EF8 + mov r0, r5 + bl WL_ReadByte + cmp r0, #0 + bne _06016EF8 + add r0, r5, #1 + bl WL_ReadByte + cmp r0, #9 + bne _06016EF8 + add r0, r5, #2 + bl WL_ReadByte + cmp r0, #0xbf + bne _06016EF8 + add r0, r5, #3 + bl WL_ReadByte + cmp r0, #0 + beq _06016F18 +_06016EF8: + ldrh r1, [sb, #0x18] + add r0, r7, #2 + add r1, r1, #1 + strh r1, [sb, #0x18] + ldrh r1, [sb, #0x1a] + add r0, r1, r0 + strh r0, [sb, #0x1a] + b _06016F4C +_06016F18: + ldrh r1, [sb, #0xc] + sub r0, r5, #2 + orr r1, r1, #0x400 + strh r1, [sb, #0xc] + str r0, [sb, #0x28] + b _06016F4C +_06016F30: + ldrh r1, [sb, #0x18] + add r0, r7, #2 + add r1, r1, #1 + strh r1, [sb, #0x18] + ldrh r1, [sb, #0x1a] + add r0, r1, r0 + strh r0, [sb, #0x1a] +_06016F4C: + add r0, r7, #2 + add r5, r5, r7 + sub r6, r6, r0 +_06016F58: + cmp r6, #0 + bgt _06016D04 + ldrh r0, [sb, #0xc] + tst r0, #8 + beq _06016F90 + ldrh r0, [r4, #0x64] + tst r0, #1 + bne _06016F84 + ldrh r0, [sb, #4] + tst r0, #0x8000 + beq _06016F90 +_06016F84: + ldrh r0, [sb, #0xa] + orr r0, r0, #8 + strh r0, [sb, #0xa] +_06016F90: + ldrh r0, [sb, #0xc] + tst r0, #0x30 + beq _06016FDC + ldrh r1, [sb, #6] + ldrh r0, [r4, #0x7c] + and r1, r1, #3 + and r0, r0, #3 + cmp r1, r0 + ldreqh r0, [sb, #0xa] + orreq r0, r0, #0x10 + streqh r0, [sb, #0xa] + ldrh r1, [sb, #6] + ldrh r0, [r4, #0x7c] + and r1, r1, #0x10 + and r0, r0, #0x10 + cmp r1, r0 + ldreqh r0, [sb, #0xa] + orreq r0, r0, #0x20 + streqh r0, [sb, #0xa] +_06016FDC: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_06016FE4: .word 0x0380FFF4 + arm_func_end ElementChecker + + arm_func_start RxManCtrlTask +RxManCtrlTask: ; 0x06016FE8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + ldr r0, _06017690 ; =0x0380FFF4 + mvn r1, #0 + ldr r4, [r0] + add sl, r4, #0x17c + ldr r6, [sl, #0x60] + add r0, r4, #0x300 + ldrh r5, [r0, #0x50] + cmp r6, r1 + beq _06017684 + ldrh r0, [r6, #0x28] + tst r0, #1 + ldrne r0, [r4, #0x568] + addne r0, r0, #1 + strne r0, [r4, #0x568] + ldreq r0, [r4, #0x564] + addeq r0, r0, #1 + streq r0, [r4, #0x564] + ldrh r0, [r6, #0x18] + ldr r2, [r4, #0x560] + and r1, r0, #0xf0 + mov r0, r1, asr #3 + add r0, r1, r0, lsr #28 + mov r0, r0, asr #4 + sub r0, r0, #1 + add r0, r2, r0 + str r0, [r4, #0x560] + ldrh r1, [r6, #0x24] + add r0, r6, #0x2e + mov r2, r1, lsl #0x1c + mov r1, r1, lsl #0x18 + mov r8, r2, lsr #0x1e + mov sb, r1, lsr #0x1c + bl CAM_SearchAdd + mov r7, r0 + strh r7, [r6, #0x12] + cmp r7, #0xff + bne _060170D8 + mov r0, #0 + strh r0, [r6, #0x12] + cmp r5, #1 + bne _06017660 + cmp r8, #0 + bne _06017660 + cmp sb, #0 + beq _060170CC + cmp sb, #4 + beq _060170C0 + cmp sb, #0xb + bne _06017660 + add r0, r6, #0x10 + bl RxAuthFrame + b _06017660 +_060170C0: + add r0, r6, #0x10 + bl RxProbeReqFrame + b _06017660 +_060170CC: + add r0, r6, #0x10 + bl RxAssReqFrame + b _06017660 +_060170D8: + bl CAM_UpdateLifeTime + ldrh r1, [r6, #0x22] + mov r0, r7, lsl #0x10 + and r1, r1, #0xff + mov r0, r0, lsr #0x10 + bl CAM_SetRSSI + cmp r8, #0 + bne _06017124 + ldrh fp, [r6, #0x3a] + mov r0, r7 + bl CAM_GetLastSeqCtrl + cmp fp, r0 + ldreq r0, [r4, #0x578] + addeq r0, r0, #1 + streq r0, [r4, #0x578] + beq _06017660 + mov r0, r7 + mov r1, fp + bl CAM_SetLastSeqCtrl +_06017124: + cmp r5, #1 + beq _0601713C + cmp r5, #2 + cmpne r5, #3 + beq _060173DC + b _06017660 +_0601713C: + ldrh r1, [r6, #0x24] + mov r0, r7, lsl #0x10 + mov r1, r1, lsl #0x13 + mov r0, r0, lsr #0x10 + mov r1, r1, lsr #0x1f + bl CAM_SetPowerMgtMode + cmp r8, #0 + bne _06017378 + cmp sb, #0xc + addls pc, pc, sb, lsl #2 + b _06017660 +_06017168: ; jump table + b _060171A8 ; case 0 + b _06017660 ; case 1 + b _060171B4 ; case 2 + b _06017660 ; case 3 + b _06017338 ; case 4 + b _06017344 ; case 5 + b _06017660 ; case 6 + b _06017660 ; case 7 + b _0601719C ; case 8 + b _06017660 ; case 9 + b _06017354 ; case 10 + b _06017360 ; case 11 + b _0601736C ; case 12 +_0601719C: + add r0, r6, #0x10 + bl RxBeaconFrame + b _06017660 +_060171A8: + add r0, r6, #0x10 + bl RxAssReqFrame + b _06017660 +_060171B4: + ldr r0, _06017690 ; =0x0380FFF4 + ldrh r4, [r6, #0x16] + ldr r5, [r0] + cmp r4, #0xa + bls _06017660 + add r0, r5, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #1 + bne _06017660 + add r0, r6, #0x2e + mov r1, #0x30 + bl IsExistManFrame + cmp r0, #0 + bne _06017660 + ldrh r7, [r6, #0x12] + mov r0, r7 + bl CAM_GetStaState + cmp r0, #0x30 + bhs _06017234 + add r0, r6, #0x2e + mov r1, #0xc0 + bl IsExistManFrame + cmp r0, #0 + bne _06017660 + add r0, r6, #0x2e + mov r1, #6 + mov r2, #1 + bl MakeDeAuthFrame + cmp r0, #0 + beq _06017660 + bl TxManCtrlFrame + b _06017660 +_06017234: + mov r0, r7 + bl CAM_GetStaState + cmp r0, #0x40 + mov r0, r7 + bne _06017260 + mov r1, #0x30 + bl CAM_SetStaState + add r0, r6, #0x2e + mov r1, #1 + bl MLME_IssueDisAssIndication + b _0601726C +_06017260: + bl CAM_GetAID + cmp r0, #0 + bne _06017660 +_0601726C: + add r1, sp, #0 + mov r0, #0 + mov r2, #0x2c + bl __VENEER_MIi_CpuClear32 + add r3, r6, #0x46 + sub r2, r4, #0xa + mov r1, #0x800 + str r3, [sp] + strh r2, [sp, #8] + strh r1, [sp, #0xc] + add r0, sp, #0 + bl ElementChecker + ldrh r1, [r6, #0x3c] + ldr r0, _06017694 ; =0x0000FFC2 + tst r1, r0 + bne _060172E0 + add r0, r5, #0x300 + ldrh r2, [r0, #0x34] + cmp r2, #0 + moveq r0, r1, lsl #0x1b + moveq r0, r0, lsr #0x1f + cmpeq r0, #1 + beq _060172E0 + cmp r2, #0 + beq _060172E8 + ldrh r0, [r6, #0x3c] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + bne _060172E8 +_060172E0: + mov r1, #0xa + b _0601731C +_060172E8: + mov r0, r7 + bl CAM_SetCapaInfo + ldrh r0, [sp, #0xa] + tst r0, #1 + moveq r1, #1 + beq _0601731C + tst r0, #4 + moveq r1, #0x12 + beq _0601731C + ldrh r1, [sp, #0x16] + mov r0, r7 + bl CAM_SetSupRate + mov r1, #0 +_0601731C: + ldr r2, [sp, #0x1c] + mov r0, r7 + bl MakeReAssResFrame + cmp r0, #0 + beq _06017660 + bl TxManCtrlFrame + b _06017660 +_06017338: + add r0, r6, #0x10 + bl RxProbeReqFrame + b _06017660 +_06017344: + add r0, r6, #0x10 + mov r1, #0 + bl RxProbeResFrame + b _06017660 +_06017354: + add r0, r6, #0x10 + bl RxDisAssFrame + b _06017660 +_06017360: + add r0, r6, #0x10 + bl RxAuthFrame + b _06017660 +_0601736C: + add r0, r6, #0x10 + bl RxDeAuthFrame + b _06017660 +_06017378: + cmp r8, #1 + bne _06017660 + cmp sb, #0xa + bne _06017660 + ldr r0, _06017690 ; =0x0380FFF4 + ldrh r4, [r6, #0x12] + ldr r1, [r0] + mov r0, r4 + add r5, r1, #0x17c + bl CAM_GetStaState + cmp r0, #0x40 + bne _06017660 + mov r0, r4 + bl CAM_SetAwake + ldrh r0, [r5, #0x2c] + cmp r0, #0 + beq _060173C4 + mov r0, #1 + bl TxqPri +_060173C4: + ldrh r0, [r5, #0x20] + cmp r0, #0 + beq _06017660 + mov r0, #0 + bl TxqPri + b _06017660 +_060173DC: + cmp r8, #0 + bne _06017660 + cmp sb, #0xc + addls pc, pc, sb, lsl #2 + b _06017660 +_060173F0: ; jump table + b _06017660 ; case 0 + b _06017430 ; case 1 + b _06017660 ; case 2 + b _0601752C ; case 3 + b _06017660 ; case 4 + b _06017630 ; case 5 + b _06017660 ; case 6 + b _06017660 ; case 7 + b _06017424 ; case 8 + b _06017660 ; case 9 + b _06017640 ; case 10 + b _0601764C ; case 11 + b _06017658 ; case 12 +_06017424: + add r0, r6, #0x10 + bl RxBeaconFrame + b _06017660 +_06017430: + ldr r0, _06017690 ; =0x0380FFF4 + ldr r0, [r0] + add r5, r0, #0x344 + ldrh r1, [r5, #0xc] + add r0, r0, #4 + cmp r1, #2 + add r4, r0, #0x400 + cmpne r1, #3 + bne _06017660 + ldrh r0, [r4] + cmp r0, #0x51 + bne _06017660 + ldr r0, [r4, #0x18] + add r1, r6, #0x2e + add r0, r0, #0x10 + bl MatchMacAdrs + cmp r0, #0 + beq _06017660 + bl ClearTimeOut + ldrh r0, [r6, #0x3e] + cmp r0, #0 + bne _060174CC + ldrh r1, [r6, #0x40] + ldr r0, _06017698 ; =0x00000FFF + and r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WSetAids + ldrh r0, [r5, #0x6a] + bl MakePsPollFrame + add r0, r5, #0x82 + add r1, r6, #0x2e + bl WSetMacAdrs1 + add r0, r6, #0x2e + bl CAM_Search + strh r0, [r5, #0x88] + ldrh r0, [r5, #0x88] + mov r1, #0x40 + bl CAM_SetStaState +_060174CC: + ldrh r0, [r6, #0x3e] + cmp r0, #0 + ldr r0, [r4, #0x1c] + movne r1, #0xc + strneh r1, [r0, #4] + ldrneh r1, [r6, #0x3e] + ldrne r0, [r4, #0x1c] + strneh r1, [r0, #6] + bne _06017508 + mov r2, #0 + strh r2, [r0, #4] + ldr r1, [r4, #0x1c] + mov r0, #0x40 + strh r2, [r1, #6] + bl WSetStaState +_06017508: + ldrh r1, [r5, #0x6a] + ldr r0, [r4, #0x1c] + mov r2, #0x53 + strh r1, [r0, #8] + mov r0, #2 + mov r1, #3 + strh r2, [r4] + bl AddTask + b _06017660 +_0601752C: + ldr r0, _06017690 ; =0x0380FFF4 + ldr r0, [r0] + add r5, r0, #0x344 + ldrh r1, [r5, #0xc] + add r0, r0, #4 + cmp r1, #2 + add r4, r0, #0x400 + cmpne r1, #3 + bne _06017660 + ldrh r0, [r4] + cmp r0, #0x61 + bne _06017660 + ldr r0, [r4, #0x18] + add r1, r6, #0x2e + add r0, r0, #0x10 + bl MatchMacAdrs + cmp r0, #0 + beq _06017660 + bl ClearTimeOut + ldrh r0, [r6, #0x3e] + cmp r0, #0 + bne _060175D0 + ldrh r1, [r6, #0x40] + ldr r0, _06017698 ; =0x00000FFF + and r0, r1, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl WSetAids + ldrh r0, [r5, #0x6a] + bl MakePsPollFrame + add r0, r5, #0x82 + add r1, r6, #0x2e + bl WSetMacAdrs1 + add r0, r6, #0x2e + bl CAM_Search + strh r0, [r5, #0x88] + ldrh r0, [r5, #0x88] + mov r1, #0x40 + bl CAM_SetStaState + mov r0, #0x40 + bl WSetStaState +_060175D0: + ldrh r0, [r6, #0x3e] + cmp r0, #0 + ldr r0, [r4, #0x1c] + movne r1, #0xc + strneh r1, [r0, #4] + ldrneh r1, [r6, #0x3e] + ldrne r0, [r4, #0x1c] + strneh r1, [r0, #6] + bne _0601760C + mov r2, #0 + strh r2, [r0, #4] + ldr r1, [r4, #0x1c] + mov r0, #0x40 + strh r2, [r1, #6] + bl WSetStaState +_0601760C: + ldrh r1, [r5, #0x6a] + ldr r0, [r4, #0x1c] + mov r2, #0x63 + strh r1, [r0, #8] + mov r0, #2 + mov r1, #4 + strh r2, [r4] + bl AddTask + b _06017660 +_06017630: + add r0, r6, #0x10 + mov r1, #0 + bl RxProbeResFrame + b _06017660 +_06017640: + add r0, r6, #0x10 + bl RxDisAssFrame + b _06017660 +_0601764C: + add r0, r6, #0x10 + bl RxAuthFrame + b _06017660 +_06017658: + add r0, r6, #0x10 + bl RxDeAuthFrame +_06017660: + mov r1, r6 + add r0, sl, #0x60 + bl ReleaseHeapBuf + ldrh r0, [sl, #0x68] + cmp r0, #0 + beq _06017684 + mov r0, #1 + mov r1, #7 + bl AddTask +_06017684: + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06017690: .word 0x0380FFF4 +_06017694: .word 0x0000FFC2 +_06017698: .word 0x00000FFF + arm_func_end RxManCtrlTask + + arm_func_start DefragTask +DefragTask: ; 0x0601769C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + ldr r0, _06017BB4 ; =0x0380FFF4 + mvn r1, #0 + ldr r2, [r0] + add r0, r2, #0x17c + ldr r5, [r0, #0x6c] + str r0, [sp, #4] + cmp r5, r1 + beq _06017BA8 + add r0, r2, #0x300 + ldrh r0, [r0, #0x4c] + cmp r0, #0x40 + bne _06017B7C + ldrh r1, [r5, #0x20] + ldr r0, _06017BB8 ; =0x000005FC + cmp r1, r0 + bhi _06017B7C + ldrh r4, [r5, #0x24] + add r0, sp, #8 + tst r4, #0x100 + beq _06017714 + add r1, r5, #0x34 + bl WSetMacAdrs1 + tst r4, #0x200 + bne _06017B7C + add r0, sp, #0xe + add r1, r5, #0x2e + bl WSetMacAdrs1 + b _0601773C +_06017714: + add r1, r5, #0x28 + bl WSetMacAdrs1 + tst r4, #0x200 + add r0, sp, #0xe + beq _06017734 + add r1, r5, #0x34 + bl WSetMacAdrs1 + b _0601773C +_06017734: + add r1, r5, #0x2e + bl WSetMacAdrs1 +_0601773C: + ldrh r0, [r5, #0x3a] + tst r4, #0x400 + strh r0, [sp, #0x14] + beq _06017974 + ldrh r0, [r5, #0x3a] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1c + bne _06017974 + ldr r0, _06017BB4 ; =0x0380FFF4 + mvn r6, #0 + ldr r0, [r0] + mov r7, #0 + add r0, r0, #0xe4 + add r8, r0, #0x400 + add fp, sp, #8 + mov r4, #0x18 + b _06017884 +_06017780: + mul sb, r7, r4 + ldrh r0, [r8, sb] + add sl, r8, sb + cmp r0, #0 + beq _0601787C + mov r1, fp + add r0, sl, #4 + bl MatchMacAdrs + cmp r0, #0 + beq _06017880 + add r1, sp, #0xe + add r0, sl, #0xa + bl MatchMacAdrs + cmp r0, #0 + beq _06017880 + ldrh r0, [sp, #0x14] + ldrh r1, [sl, #0x10] + mov r0, r0, lsl #0x10 + mov r2, r0, lsr #0x14 + mov r0, r1, lsl #0x10 + cmp r2, r0, lsr #20 + bne _06017880 + ldrh r0, [r5, #0x18] + mov r1, r1, lsl #0x1c + and r2, r0, #0xf0 + mov r0, r2, asr #3 + add r0, r2, r0, lsr #28 + mov r7, r0, asr #4 + subs r0, r7, r1, lsr #28 + beq _06017B7C + tst r0, #-0x80000000 + bne _06017B7C + mov r0, sl + ldr r4, [r0, #0x14] + ldrh r0, [r5, #0x20] + ldrh r3, [r4, #0x20] + sub r0, r0, r3 + subs r6, r0, #0x18 + beq _06017B7C + tst r6, #-0x80000000 + bne _06017B7C + add r0, r5, #0x3c + add r1, r4, #0x3c + mov r2, r6 + add r0, r0, r3 + add r1, r1, r3 + bl __VENEER_MIi_CpuCopy16 + ldrh r1, [r4, #0x20] + mov r0, r7, lsl #0x10 + add r1, r1, r6 + strh r1, [r4, #0x20] + ldrh r1, [sl, #0x10] + mov r0, r0, lsr #0x10 + bic r1, r1, #0xf + and r0, r0, #0xf + orr r1, r1, r0 + ldr r0, _06017BB4 ; =0x0380FFF4 + strh r1, [sl, #0x10] + ldr r1, [r0] + ldr r0, [r1, #0x560] + add r0, r0, r7 + str r0, [r1, #0x560] + b _06017B7C +_0601787C: + mov r6, r7 +_06017880: + add r7, r7, #1 +_06017884: + cmp r7, #3 + blo _06017780 + mvn r0, #0 + cmp r6, r0 + beq _06017B7C + ldr r0, _06017BB4 ; =0x0380FFF4 + ldr r1, _06017BBC ; =0x00000622 + ldr r0, [r0] + add r0, r0, #0x188 + bl AllocateHeapBuf + movs r4, r0 + beq _06017968 + mov r0, #0x18 + mul r7, r6, r0 + add r6, r8, r7 + add r0, sp, #8 + add r1, r6, #4 + mov r2, #0x10 + bl __VENEER_MIi_CpuCopy16 + mov r0, #5 + strh r0, [r8, r7] + mov r0, r6 + str r4, [r0, #0x14] + ldrh r2, [r5, #0x20] + add r0, r5, #0x18 + add r1, r4, #0x18 + add r2, r2, #0xc + bl __VENEER_MIi_CpuCopy16 + ldr r0, _06017BB4 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x30c] + bl __VENEER_MI_WaitDma + ldrh r1, [r4, #0x18] + ldrh r0, [r6, #0x10] + and r1, r1, #0xf0 + bic r3, r0, #0xf + mov r0, r1, asr #3 + add r0, r1, r0, lsr #28 + mov r1, r0, asr #4 + mov r2, r1, lsl #0x10 + mov r2, r2, lsr #0x10 + and r2, r2, #0xf + orr r2, r3, r2 + strh r2, [r6, #0x10] + ldr r2, _06017BB4 ; =0x0380FFF4 + ldr r3, [r2] + ldr r2, [r3, #0x560] + add r0, r2, r0, asr #4 + str r0, [r3, #0x560] + ldrh r0, [r5, #0x20] + sub r0, r0, #0x18 + strh r0, [r4, #0x20] + ldrh r0, [r4, #0x20] + bl __VENEER__u32_div_f + mov r1, r6 + strh r0, [r1, #2] + b _06017B7C +_06017968: + mov r0, #4 + bl SetFatalErr + b _06017B7C +_06017974: + ldr r1, _06017BB4 ; =0x0380FFF4 + ldrh r0, [r5, #0x20] + ldr r4, [r1] + sub r1, r0, #0x18 + add r0, r4, #0xe4 + strh r1, [r5, #0x20] + add r8, r0, #0x400 + mov r7, #0 + b _06017A30 +_06017998: + mov r0, #0x18 + mul sb, r7, r0 + ldrh r0, [r8, sb] + add sl, r8, sb + cmp r0, #0 + beq _06017A2C + add r1, sp, #8 + add r0, sl, #4 + bl MatchMacAdrs + cmp r0, #0 + beq _06017A2C + add r1, sp, #0xe + add r0, sl, #0xa + bl MatchMacAdrs + cmp r0, #0 + beq _06017A2C + ldrh r2, [sp, #0x14] + ldrh r0, [sl, #0x10] + mov r1, r2, lsl #0x10 + mov r1, r1, lsr #0x14 + mov r0, r0, lsl #0x10 + cmp r1, r0, lsr #20 + bne _06017A2C + mov r1, sl + ldrh r0, [r1, #0x10] + sub fp, r0, r2 + tst fp, #-0x80000000 + bne _06017B7C + ldrh r0, [r1, #2] + ldrh r1, [r5, #0x20] + mul r0, fp, r0 + str r0, [sp] + subs r6, r1, r0 + beq _06017B7C + tst r6, #-0x80000000 + beq _06017A38 + b _06017B7C +_06017A2C: + add r7, r7, #1 +_06017A30: + cmp r7, #3 + blo _06017998 +_06017A38: + cmp r7, #3 + beq _06017B7C + mov r0, #0x18 + mul sb, r7, r0 + add r0, r8, sb + ldr r1, [r0, #0x14] + ldr r0, _06017BC0 ; =0x000005E4 + add r7, r1, #0x10 + ldrh r1, [r7, #0x10] + add sl, r1, r6 + cmp sl, r0 + bls _06017A80 + add r0, r4, #0x188 + sub r1, r7, #0x10 + bl ReleaseHeapBuf + mov r0, #0 + strh r0, [r8, sb] + b _06017B7C +_06017A80: + ldr r0, [sp] + add r3, r5, #0x3c + add r2, r7, #0x2c + add r1, r2, r1 + add r0, r3, r0 + add r2, r6, #1 + bl __VENEER_MIi_CpuCopy16 + strh sl, [r7, #0x10] + ldrh r1, [r5, #0x18] + add r0, r8, sb + ldrh r6, [r0, #0x10] + and r2, r1, #0xf0 + mov r1, r2, asr #3 + add r1, r2, r1, lsr #28 + mov r3, r6, lsl #0x1c + rsb r2, fp, r1, asr #4 + add r2, r2, r3, lsr #28 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + bic r3, r6, #0xf + and r2, r2, #0xf + orr r3, r3, r2 + ldr r2, _06017BB4 ; =0x0380FFF4 + strh r3, [r0, #0x10] + ldr r3, [r2] + ldr r2, [r3, #0x560] + add r1, r2, r1, asr #4 + str r1, [r3, #0x560] + ldrh r1, [r5, #0x18] + tst r1, #0x100 + bne _06017B7C + mov r1, #0 + strh r1, [r0] + ldrh r0, [r7, #8] + bic r0, r0, #0xf0 + add r0, r0, #0x10 + strh r0, [r7, #8] + ldrh r0, [r7, #0x10] + add r0, r0, #0x18 + strh r0, [r7, #0x10] + ldrh r0, [r7, #8] + ands r0, r0, #0xf + beq _06017B54 + cmp r0, #8 + add r0, r4, #0x188 + bne _06017B74 + add r1, r4, #0x1c4 + sub r2, r7, #0x10 + bl MoveHeapBuf + mov r0, #2 + mov r1, #6 + bl AddTask + b _06017B7C +_06017B54: + add r0, r4, #0x188 + add r1, r4, #0x1dc + sub r2, r7, #0x10 + bl MoveHeapBuf + mov r0, #1 + mov r1, #7 + bl AddTask + b _06017B7C +_06017B74: + sub r1, r7, #0x10 + bl ReleaseHeapBuf +_06017B7C: + ldr r0, [sp, #4] + mov r1, r5 + add r0, r0, #0x6c + bl ReleaseHeapBuf + ldr r0, [sp, #4] + ldrh r0, [r0, #0x74] + cmp r0, #0 + beq _06017BA8 + mov r0, #2 + mov r1, #9 + bl AddTask +_06017BA8: + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06017BB4: .word 0x0380FFF4 +_06017BB8: .word 0x000005FC +_06017BBC: .word 0x00000622 +_06017BC0: .word 0x000005E4 + arm_func_end DefragTask + + arm_func_start __VENEER_MI_WaitDma +__VENEER_MI_WaitDma: ; 0x06017BC4 + ldr pc, _06017BC8 ; =MI_WaitDma + .align 2, 0 +_06017BC8: .word MI_WaitDma + arm_func_end __VENEER_MI_WaitDma + + arm_func_start DefragTimerTask +DefragTimerTask: ; 0x06017BCC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _06017C34 ; =0x0380FFF4 + mov r6, #0 + ldr r0, [r4] + mov r7, #0x18 + add r0, r0, #0xe4 + add r5, r0, #0x400 +_06017BE8: + mul r1, r6, r7 + ldrh r0, [r5, r1] + add r1, r5, r1 + cmp r0, #0 + beq _06017C20 + sub r0, r0, #1 + strh r0, [r1] + ldrh r0, [r1] + cmp r0, #0 + bne _06017C20 + ldr r0, [r4] + ldr r1, [r1, #0x14] + add r0, r0, #0x188 + bl ReleaseHeapBuf +_06017C20: + add r6, r6, #1 + cmp r6, #3 + blo _06017BE8 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06017C34: .word 0x0380FFF4 + arm_func_end DefragTimerTask + + arm_func_start InitRxCtrl +InitRxCtrl: ; 0x06017C38 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _06017D30 ; =0x0380FFF4 + mov r0, #0 + ldr r3, [r1] + mov r2, #0x50 + add r1, r3, #0xdc + add r5, r1, #0x400 + mov r1, r5 + add r4, r3, #0x344 + bl __VENEER_MIi_CpuClear32 + ldr r1, _06017D34 ; =0x04808030 + mov r2, #0x8000 + ldr r0, _06017D30 ; =0x0380FFF4 + strh r2, [r1] + ldr r0, [r0] + add r0, r0, #0x300 + ldrh r0, [r0, #0x50] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _06017CB4 +_06017C88: ; jump table + b _06017C98 ; case 0 + b _06017CA0 ; case 1 + b _06017CA8 ; case 2 + b _06017CB0 ; case 3 +_06017C98: + ldr r6, _06017D38 ; =0x00000794 + b _06017CB4 +_06017CA0: + ldr r6, _06017D3C ; =0x000010C4 + b _06017CB4 +_06017CA8: + ldr r6, _06017D40 ; =0x00000BFC + b _06017CB4 +_06017CB0: + ldr r6, _06017D38 ; =0x00000794 +_06017CB4: + ldr r3, _06017D44 ; =0x04808050 + add r0, r6, #0x4000 + ldr r1, _06017D48 ; =0x00005F60 + add r2, r0, #0x4800000 + mov r0, r6, lsl #0xf + strh r2, [r3] + mov r0, r0, lsr #0x10 + strh r0, [r3, #6] + strh r1, [r3, #2] + strh r0, [r3, #0xa] + ldr r2, _06017D4C ; =0x0000FFFF + strh r0, [r5, #4] + sub r0, r1, #0x4000 + strh r2, [r5] + sub r0, r0, r6 + strh r0, [r4, #0x9a] + sub r0, r1, #2 + strh r0, [r3, #0x12] + rsb r0, r2, #0x18000 + strh r0, [r3, #-0x20] + add r0, r3, #0x1fc + ldr r1, _06017D50 ; =0x0480824E + strh r2, [r0] + ldr r0, _06017D54 ; =0x04805F70 + strh r2, [r1] + strh r2, [r0] + strh r2, [r0, #2] + strh r2, [r0, #0xe] + strh r2, [r0, #6] + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06017D30: .word 0x0380FFF4 +_06017D34: .word 0x04808030 +_06017D38: .word 0x00000794 +_06017D3C: .word 0x000010C4 +_06017D40: .word 0x00000BFC +_06017D44: .word 0x04808050 +_06017D48: .word 0x00005F60 +_06017D4C: .word 0x0000FFFF +_06017D50: .word 0x0480824E +_06017D54: .word 0x04805F70 + arm_func_end InitRxCtrl + + arm_func_start UpdateApList +UpdateApList: ; 0x06017D58 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r3, _06017E98 ; =0x0380FFF4 + mov sb, r2 + ldr r2, [r3] + mov fp, r0 + add r0, sb, #1 + mov sl, r1 + add r4, r2, #0x23c + bl WL_ReadByte + cmp r0, #0x20 + bhi _06017E90 + mov r6, #4 + mov r7, r6 + mov r8, #0x400 + mov r5, #0 + b _06017DD8 +_06017D98: + ldrh r0, [r4] + cmp r0, #0 + beq _06017DCC + add r0, r4, #6 + add r1, sl, #0x24 + bl MatchMacAdrs + cmp r0, #0 + bne _06017DF8 + ldrh r0, [r4, #0x30] + cmp r0, r8 + movlo r8, r0 + movlo r7, r5 + b _06017DD0 +_06017DCC: + mov r6, r5 +_06017DD0: + add r5, r5, #1 + add r4, r4, #0x32 +_06017DD8: + cmp r5, #4 + blo _06017D98 + cmp r6, #4 + movne r5, r6 + bne _06017DF8 + cmp r7, #4 + movne r5, r7 + beq _06017E90 +_06017DF8: + ldr r0, _06017E98 ; =0x0380FFF4 + mov r2, #0x32 + mul r4, r5, r2 + ldr r0, [r0] + add r5, r0, #0x23c + add r6, r5, r4 + mov r1, r6 + mov r0, #0 + bl __VENEER_MIi_CpuClear16 + mov r0, #0x400 + strh r0, [r6, #0x30] + ldrh r1, [sl, #0x12] + add r0, r6, #6 + and r1, r1, #0xff + strh r1, [r5, r4] + strh fp, [r6, #2] + add r1, sl, #0x24 + bl WSetMacAdrs1 + add r0, sb, #1 + bl WL_ReadByte + strh r0, [r6, #0xc] + mov r7, #0 + add r5, sb, #2 + add r4, r6, #0xe + b _06017E74 +_06017E5C: + add r0, r5, r7 + bl WL_ReadByte + mov r1, r0 + add r0, r4, r7 + bl WL_WriteByte + add r7, r7, #1 +_06017E74: + ldrh r0, [r6, #0xc] + cmp r7, r0 + blo _06017E5C + ldrh r0, [sl, #0x34] + strh r0, [r6, #0x2e] + ldrh r0, [sl, #0x36] + strh r0, [r6, #4] +_06017E90: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_06017E98: .word 0x0380FFF4 + arm_func_end UpdateApList + + arm_func_start InitApList +InitApList: ; 0x06017E9C + ldr r1, _06017EB8 ; =0x0380FFF4 + ldr ip, _06017EBC ; =MIi_CpuClear16 + ldr r1, [r1] + mov r0, #0 + mov r2, #0xc8 + add r1, r1, #0x23c + bx ip + .align 2, 0 +_06017EB8: .word 0x0380FFF4 +_06017EBC: .word MIi_CpuClear16 + arm_func_end InitApList + + arm_func_start UpdateApListTask +UpdateApListTask: ; 0x06017EC0 + ldr r0, _06017F04 ; =0x0380FFF4 + mov r3, #0 + ldr r0, [r0] + add r2, r0, #0x23c + mov r0, r3 +_06017ED4: + ldrh r1, [r2, #0x30] + cmp r1, #0 + beq _06017EF4 + sub r1, r1, #1 + strh r1, [r2, #0x30] + ldrh r1, [r2, #0x30] + cmp r1, #0 + streqh r0, [r2] +_06017EF4: + add r3, r3, #1 + cmp r3, #4 + blo _06017ED4 + bx lr + .align 2, 0 +_06017F04: .word 0x0380FFF4 + arm_func_end UpdateApListTask + + arm_func_start FLASH_VerifyCheckSum +FLASH_VerifyCheckSum: ; 0x06017F08 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _06017FA4 ; =0x0380FFF4 + mov r4, r0 + ldr r0, [r1] + ldr r1, [r0, #0x318] + ldrh r6, [r1, #2] + cmp r6, #0xa4 + blo _06017F34 + ldr r0, _06017FA8 ; =0x000001D6 + cmp r6, r0 + bls _06017F3C +_06017F34: + mov r0, #2 + b _06017F9C +_06017F3C: + add r7, r1, #2 + mov r5, #0 + b _06017F6C +_06017F48: + mov r0, r7 + bl WL_ReadByte + mov r1, r5, lsl #0x10 + and r0, r0, #0xff + mov r1, r1, lsr #0x10 + add r7, r7, #1 + bl calc_NextCRC + mov r5, r0 + sub r6, r6, #1 +_06017F6C: + cmp r6, #0 + bne _06017F48 + ldr r0, _06017FA4 ; =0x0380FFF4 + cmp r4, #0 + ldr r0, [r0] + ldr r0, [r0, #0x318] + ldrh r1, [r0] + orrne r0, r1, r5, lsl #16 + strne r0, [r4] + cmp r5, r1 + movne r0, #1 + moveq r0, #0 +_06017F9C: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_06017FA4: .word 0x0380FFF4 +_06017FA8: .word 0x000001D6 + arm_func_end FLASH_VerifyCheckSum + + arm_func_start FLASH_Wait +FLASH_Wait: ; 0x06017FAC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + add r4, sp, #0 +_06017FB8: + mov r0, r4 + bl __VENEER_NVRAM_ReadStatusRegister + ldr r0, [sp] + tst r0, #0x20 + beq _06017FD4 + bl __VENEER_NVRAM_SoftwareReset + b _06017FB8 +_06017FD4: + ldr r0, [sp] + tst r0, #1 + bne _06017FB8 + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end FLASH_Wait + + arm_func_start __VENEER_NVRAM_ReadStatusRegister +__VENEER_NVRAM_ReadStatusRegister: ; 0x06017FEC + ldr pc, _06017FF0 ; =NVRAM_ReadStatusRegister + .align 2, 0 +_06017FF0: .word NVRAM_ReadStatusRegister + arm_func_end __VENEER_NVRAM_ReadStatusRegister + + arm_func_start __VENEER_NVRAM_SoftwareReset +__VENEER_NVRAM_SoftwareReset: ; 0x06017FF4 + ldr pc, _06017FF8 ; =NVRAM_SoftwareReset + .align 2, 0 +_06017FF8: .word NVRAM_SoftwareReset + arm_func_end __VENEER_NVRAM_SoftwareReset + + arm_func_start FLASH_Read +FLASH_Read: ; 0x06017FFC + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _06018058 ; =0x0380FFF4 + mov r6, r1 + ldr r1, [r3] + mov r5, r2 + ldr r1, [r1, #0x318] + cmp r1, #0 + beq _06018050 + add r0, r1, r0 + sub r4, r0, #0x2a + b _06018048 +_06018028: + mov r0, r4 + bl WL_ReadByte + mov r1, r0 + mov r0, r5 + add r4, r4, #1 + bl WL_WriteByte + add r5, r5, #1 + sub r6, r6, #1 +_06018048: + cmp r6, #0 + bne _06018028 +_06018050: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_06018058: .word 0x0380FFF4 + arm_func_end FLASH_Read + + arm_func_start FLASH_DirectRead +FLASH_DirectRead: ; 0x0601805C + stmdb sp!, {r4, r5, r6, lr} + ldr r3, _060180A8 ; =0x0380FFF4 + mov r6, r0 + ldr r0, [r3] + mov r5, r1 + ldr r0, [r0, #0x314] + mov r4, r2 + bl __VENEER_SPI_Lock + bl FLASH_Wait + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl __VENEER_NVRAM_ReadDataBytes + ldr r0, _060180A8 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x314] + bl __VENEER_SPI_Unlock + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_060180A8: .word 0x0380FFF4 + arm_func_end FLASH_DirectRead + + arm_func_start __VENEER_SPI_Lock +__VENEER_SPI_Lock: ; 0x060180AC + ldr pc, _060180B0 ; =SPI_Lock + .align 2, 0 +_060180B0: .word SPI_Lock + arm_func_end __VENEER_SPI_Lock + + arm_func_start __VENEER_NVRAM_ReadDataBytes +__VENEER_NVRAM_ReadDataBytes: ; 0x060180B4 + ldr pc, _060180B8 ; =NVRAM_ReadDataBytes + .align 2, 0 +_060180B8: .word NVRAM_ReadDataBytes + arm_func_end __VENEER_NVRAM_ReadDataBytes + + arm_func_start __VENEER_SPI_Unlock +__VENEER_SPI_Unlock: ; 0x060180BC + ldr pc, _060180C0 ; =SPI_Unlock + .align 2, 0 +_060180C0: .word SPI_Unlock + arm_func_end __VENEER_SPI_Unlock + + arm_func_start FLASH_MakeImage +FLASH_MakeImage: ; 0x060180C4 + stmdb sp!, {r3, lr} + ldr r0, _060181A8 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x314] + bl __VENEER_SPI_Lock + bl FLASH_Wait + mov r3, #0 + add r2, sp, #0 + mov r0, #0x2c + mov r1, #2 + str r3, [sp] + bl __VENEER_NVRAM_ReadDataBytes + ldr r0, _060181A8 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x314] + bl __VENEER_SPI_Unlock + ldr r1, [sp] + cmp r1, #0xa4 + blo _0601811C + ldr r0, _060181AC ; =0x000001D6 + cmp r1, r0 + bls _06018124 +_0601811C: + mov r0, #0 + b _060181A0 +_06018124: + ldr r0, _060181A8 ; =0x0380FFF4 + add r1, r1, #2 + str r1, [sp] + ldr r0, [r0] + add r0, r0, #0x188 + bl AllocateHeapBuf + ldr r2, _060181A8 ; =0x0380FFF4 + ldr r1, [r2] + str r0, [r1, #0x318] + ldr r1, [r2] + ldr r0, [r1, #0x318] + cmp r0, #0 + moveq r0, #0 + beq _060181A0 + add r0, r0, #0xc + str r0, [r1, #0x318] + ldr r0, [r2] + ldr r0, [r0, #0x314] + bl __VENEER_SPI_Lock + bl FLASH_Wait + ldr r0, _060181A8 ; =0x0380FFF4 + ldr r1, [sp] + ldr r2, [r0] + mov r0, #0x2a + ldr r2, [r2, #0x318] + bl __VENEER_NVRAM_ReadDataBytes + ldr r0, _060181A8 ; =0x0380FFF4 + ldr r0, [r0] + ldr r0, [r0, #0x314] + bl __VENEER_SPI_Unlock + mov r0, #1 +_060181A0: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_060181A8: .word 0x0380FFF4 +_060181AC: .word 0x000001D6 + arm_func_end FLASH_MakeImage + + .rodata + +WmspRequestFuncTable: ; 0x060181B0 + .word WMSP_Initialize + .word WMSP_Reset + .word WMSP_End + .word WMSP_Enable + .word WMSP_Disable + .word WMSP_PowerOn + .word WMSP_PowerOff + .word WMSP_SetParentParam + .word WMSP_StartParent + .word WMSP_EndParent + .word WMSP_StartScan + .word WMSP_EndScan + .word WMSP_StartConnectEx + .word WMSP_Disconnect + .word WMSP_StartMP + .word WMSP_SetMPData + .word WMSP_EndMP + .word WMSP_StartDCF + .word WMSP_SetDCFData + .word WMSP_EndDCF + .word WMSP_SetWEPKey + .word WmspRequestFuncDummy + .word WmspRequestFuncDummy + .word WmspRequestFuncDummy + .word WMSP_SetGameInfo + .word WMSP_SetBeaconTxRxInd + .word WMSP_StartTestMode + .word WMSP_StopTestMode + .word WMSP_VAlarmSetMPData + .word WMSP_SetLifeTime + .word WMSP_MeasureChannel + .word WMSP_InitWirelessCounter + .word WMSP_GetWirelessCounter + .word WMSP_SetEntry + .word WMSP_AutoDeAuth + .word WMSP_SetMPParameter + .word WMSP_SetBeaconPeriod + .word WMSP_AutoDisconnect + .word WMSP_StartScanEx + .word WMSP_SetWEPKeyEx + .word WMSP_SetPowerSaveMode + .word WMSP_StartTestRxMode + .word WMSP_StopTestRxMode + .word WMSP_KickNextMP_Parent + .word WMSP_KickNextMP_Child + .word WMSP_KickNextMP_Resume + +pTaskFunc: ; 0x06018268 + .word MLME_ScanTask + .word MLME_JoinTask + .word MLME_AuthTask + .word MLME_AssTask + .word MLME_ReAssTask + .word MLME_MeasChannelTask + .word RxDataFrameTask + .word RxManCtrlTask + .word WlIntrTxBeaconTask + .word DefragTask + .word CAM_TimerTask + .word RequestCmdTask + .word LowestIdleTask + .word MLME_BeaconLostTask + .word WlIntrTxEndTask + .word WlIntrRxEndTask + .word WlIntrMpEndTask + .word DefragTimerTask + .word UpdateApListTask + .word SendMessageToWmTask + .word SetParentTbttTxqTask + .word SendFatalErrMsgTask + .word TerminateWlTask + .word ReleaseWlTask + +c_RateSet$4351: ; 0x060182C8 + .byte 0x03, 0x00, 0x03, 0x00 + +def_SsidMask: ; 0x060182CC + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +crc16_table: ; 0x060182EC + .byte 0x00, 0x00, 0x01, 0xCC + .byte 0x01, 0xD8, 0x00, 0x14, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x28, 0x01, 0xE4, 0x01, 0xA0, 0x00, 0x6C + .byte 0x00, 0x78, 0x01, 0xB4, 0x00, 0x50, 0x01, 0x9C, 0x01, 0x88, 0x00, 0x44 + +macTxRxRegAdrs: ; 0x0601830C + .byte 0x46, 0x01, 0x48, 0x01 + .byte 0x4A, 0x01, 0x4C, 0x01, 0x20, 0x01, 0x22, 0x01, 0x54, 0x01, 0x44, 0x01, 0x32, 0x01, 0x32, 0x01 + .byte 0x40, 0x01, 0x42, 0x01, 0x38, 0x00, 0x24, 0x01, 0x28, 0x01, 0x50, 0x01 + +def_WepKey: ; 0x0601832C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +macInitRegs: ; 0x0601837C + .byte 0x04, 0x00, 0x00, 0x00 + .byte 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF + .byte 0x54, 0x02, 0x00, 0x00, 0xB4, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x01, 0x00 + .byte 0x88, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00 + .byte 0xEA, 0x00, 0x00, 0x00, 0xEE, 0x00, 0x01, 0x00, 0xEC, 0x00, 0x03, 0x3F, 0xA2, 0x01, 0x01, 0x00 + .byte 0xA0, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x08, 0xBC, 0x00, 0x01, 0x00, 0xD4, 0x00, 0x03, 0x00 + .byte 0xD8, 0x00, 0x04, 0x00, 0xDA, 0x00, 0x02, 0x06, 0x76, 0x00, 0x00, 0x00, 0x30, 0x01, 0x46, 0x01 + +RateElement2Bit: ; 0x060183E0 + .byte 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x03, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0x04, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x05, 0x00, 0xFF, 0x00, 0x06, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x07, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x08, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x09, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0A, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0B, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + .byte 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 + +BC_ADRS: ; 0x060184D0 + .byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + + .balign 4, 0 +MPKEY_ADRS: ; 0x060184D8 + .byte 0x03, 0x09, 0xBF, 0x00, 0x00, 0x10 + + .balign 4, 0 +NULL_ADRS: ; 0x060184E0 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + + .balign 4, 0 +MP_ADRS: ; 0x060184E8 + .byte 0x03, 0x09, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00 + + .balign 4, 0 +RateBit2Element: ; 0x060184F0 + .byte 0x02, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x16, 0x00, 0x18, 0x00, 0x24, 0x00 + .byte 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +test_pattern: ; 0x06018510 + .byte 0xFF, 0xFF, 0x5A, 0x5A, 0xA5, 0xA5 + +BBPDiagSkipAdrsES1: ; 0x06018516 + .byte 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00 + .byte 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x26, 0x00, 0x29, 0x00 + .byte 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00 + .byte 0x36, 0x00, 0x37, 0x00, 0x65, 0x00, 0x00, 0x00 + +BBPDiagSkipAdrsRelease: ; 0x06018548 + .byte 0x00, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00 + .byte 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x14, 0x00 + .byte 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x27, 0x00, 0x4D, 0x00 + .byte 0x5D, 0x00, 0x5E, 0x00, 0x5F, 0x00, 0x60, 0x00, 0x61, 0x00, 0x64, 0x00, 0x66, 0x00, 0x00, 0x00 + +test_reg: ; 0x06018580 + .byte 0x06, 0x00, 0x3F, 0x00, 0x18, 0x00, 0xFF, 0xFF, 0x1A, 0x00, 0xFF, 0xFF, 0x1C, 0x00, 0xFF, 0xFF + .byte 0x20, 0x00, 0xFF, 0xFF, 0x22, 0x00, 0xFF, 0xFF, 0x24, 0x00, 0xFF, 0xFF, 0x2A, 0x00, 0xFF, 0x07 + .byte 0x50, 0x00, 0xFF, 0xFF, 0x52, 0x00, 0xFF, 0xFF, 0x56, 0x00, 0xFE, 0x0F, 0x58, 0x00, 0xFE, 0x1F + .byte 0x5A, 0x00, 0xFE, 0x0F, 0x5C, 0x00, 0xFF, 0x0F, 0x62, 0x00, 0xFE, 0x1F, 0x64, 0x00, 0xFF, 0x0F + .byte 0x68, 0x00, 0xFE, 0x1F, 0x6C, 0x00, 0xFF, 0x0F, 0x74, 0x00, 0xFE, 0x1F, 0x22, 0x01, 0xFF, 0xFF + .byte 0x24, 0x01, 0xFF, 0xFF, 0x28, 0x01, 0xFF, 0xFF, 0x30, 0x01, 0xFF, 0x0F, 0x32, 0x01, 0xFF, 0x8F + .byte 0x34, 0x01, 0xFF, 0xFF, 0x40, 0x01, 0xFF, 0xFF, 0x42, 0x01, 0xFF, 0xFF + + .macro wlib_cmd a0, a2, a4 + .short \a0 + .short \a2 + .word \a4 + .endm + +WlibCmdTbl_MA: ; 0x060185EC + wlib_cmd 0x0018, 0x0002, MA_DataReqCmd + wlib_cmd 0x0004, 0x0001, MA_KeyDataReqCmd + wlib_cmd 0x000A, 0x0001, MA_MpReqCmd + wlib_cmd 0x000C, 0x0001, MA_TestDataReqCmd + wlib_cmd 0x0001, 0x0001, MA_ClrDataReqCmd + +WlibCmdTbl_PARAMGET2: ; 0x06018614 + wlib_cmd 0x0000, 0x0004, PARAMGET_BSSIDReqCmd + wlib_cmd 0x0000, 0x0012, PARAMGET_SSIDReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_BeaconPeriodReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_DTIMPeriodReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_ListenIntervalReqCmd + wlib_cmd 0x0000, 0x0001, PARAMGET_GameInfoReqCmd + +WlibCmdTbl_PARAMSET2: ; 0x06018644 + wlib_cmd 0x0003, 0x0001, PARAMSET_BSSIDReqCmd + wlib_cmd 0x0011, 0x0001, PARAMSET_SSIDReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_BeaconPeriodReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_DTIMPeriodReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_ListenIntervalReqCmd + wlib_cmd 0x0000, 0x0001, PARAMSET_GameInfoReqCmd + +WlibCmdTbl_MLME: ; 0x06018674 + wlib_cmd 0x0001, 0x0001, MLME_ResetReqCmd + wlib_cmd 0x0003, 0x0001, MLME_PwrMgtReqCmd + wlib_cmd 0x001F, 0x0023, MLME_ScanReqCmd + wlib_cmd 0x0022, 0x0005, MLME_JoinReqCmd + wlib_cmd 0x0005, 0x0006, MLME_AuthReqCmd + wlib_cmd 0x0004, 0x0004, MLME_DeAuthReqCmd + wlib_cmd 0x0005, 0x0003, MLME_AssReqCmd + wlib_cmd 0x0005, 0x0003, MLME_ReAssReqCmd + wlib_cmd 0x0004, 0x0001, MLME_DisAssReqCmd + wlib_cmd 0x0017, 0x0001, MLME_StartReqCmd + wlib_cmd 0x000C, 0x0012, MLME_MeasChanReqCmd + +WlibCmdTbl_DEV: ; 0x060186CC + wlib_cmd 0x0000, 0x0001, CMD_ReservedReqCmd + wlib_cmd 0x0000, 0x0001, DEV_ShutdownReqCmd + wlib_cmd 0x0000, 0x0001, DEV_IdleReqCmd + wlib_cmd 0x0000, 0x0001, DEV_Class1ReqCmd + wlib_cmd 0x0000, 0x0001, DEV_RebootReqCmd + wlib_cmd 0x0000, 0x0001, DEV_ClearWlInfoReqCmd + wlib_cmd 0x0000, 0x0009, DEV_GetVerInfoReqCmd + wlib_cmd 0x0000, 0x005C, DEV_GetWlInfoReqCmd + wlib_cmd 0x0000, 0x0002, DEV_GetStateReqCmd + wlib_cmd 0x0004, 0x0001, DEV_TestSignalReqCmd + wlib_cmd 0x0002, 0x0001, DEV_TestRxReqCmd + +WlibCmdTbl_PARAMGET: ; 0x06018724 + wlib_cmd 0x0000, 0x0021, PARAMGET_AllReqCmd + wlib_cmd 0x0000, 0x0004, PARAMGET_MacAdrsReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_RetryReqCmd + wlib_cmd 0x0000, 0x0003, PARAMGET_EnableChannelReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_ModeReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_RateReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_WepModeReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_WepKeyIdReqCmd + wlib_cmd 0x0000, 0x0001, CMD_ReservedReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_BeaconTypeReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_ResBcSsidReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_BeaconLostThReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_ActiveZoneReqCmd + wlib_cmd 0x0000, 0x0011, PARAMGET_SSIDMaskReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_PreambleTypeReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_AuthAlgoReqCmd + wlib_cmd 0x0000, 0x0004, PARAMGET_CCAModeEDThReqCmd + wlib_cmd 0x0000, 0x0001, CMD_ReservedReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_MaxConnReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_MainAntennaReqCmd + wlib_cmd 0x0000, 0x0003, PARAMGET_DiversityReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_BcnSendRecvIndReqCmd + wlib_cmd 0x0000, 0x0002, PARAMGET_NullKeyModeReqCmd + +WlibCmdTbl_PARAMSET: ; 0x060187DC + wlib_cmd 0x0048, 0x0001, PARAMSET_AllReqCmd + wlib_cmd 0x0003, 0x0001, PARAMSET_MacAdrsReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_RetryReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_EnableChannelReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_ModeReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_RateReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_WepModeReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_WepKeyIdReqCmd + wlib_cmd 0x0028, 0x0001, PARAMSET_WepKeyReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_BeaconTypeReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_ResBcSsidReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_BeaconLostThReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_ActiveZoneReqCmd + wlib_cmd 0x0010, 0x0001, PARAMSET_SSIDMaskReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_PreambleTypeReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_AuthAlgoReqCmd + wlib_cmd 0x0003, 0x0001, PARAMSET_CCAModeEDThReqCmd + wlib_cmd 0x0003, 0x0001, PARAMSET_LifeTimeReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_MaxConnReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_MainAntennaReqCmd + wlib_cmd 0x0002, 0x0001, PARAMSET_DiversityReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_BcnSendRecvIndReqCmd + wlib_cmd 0x0001, 0x0001, PARAMSET_NullKeyModeReqCmd + +wlVersion$4017: ; 0x06018894 + .asciz "2.83.00" + +Pri2QBit: ; 0x0601889C + .byte 0x01, 0x00, 0x04, 0x00, 0x08, 0x00 + + .bss + + .public wmspW +wmspW: ; 0x060188A4 + .space 0x1590 diff --git a/sub/asm/sub.wram_1.s b/sub/asm/sub.wram_1.s new file mode 100644 index 00000000..051aaa68 --- /dev/null +++ b/sub/asm/sub.wram_1.s @@ -0,0 +1,6666 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + .public OSi_SetTimerReserved + .public OS_IsTickAvailable + .public FifoCtrlInit + .public FifoRecvCallbackTable + .public PADi_XYButtonAvailable + .public MI_StopDma + .public PXI_IsCallbackReady + .public PXIi_SetToFifo + + arm_func_start SND_Enable +SND_Enable: ; 0x037FB630 + ldr r1, _037FB644 ; =0x04000501 + ldrb r0, [r1] + orr r0, r0, #0x80 + strb r0, [r1] + bx lr + .align 2, 0 +_037FB644: .word 0x04000501 + arm_func_end SND_Enable + + arm_func_start SND_Shutdown +SND_Shutdown: ; 0x037FB648 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _037FB694 ; =0x04000501 + mov r5, #0 + ldrb r0, [r1] + bic r0, r0, #0x80 + strb r0, [r1] + mov r4, #1 +_037FB664: + mov r0, r5 + mov r1, r4 + bl SND_StopChannel + add r5, r5, #1 + cmp r5, #0x10 + blt _037FB664 + ldr r0, _037FB698 ; =0x04000508 + mov r1, #0 + strb r1, [r0] + strb r1, [r0, #1] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_037FB694: .word 0x04000501 +_037FB698: .word 0x04000508 + arm_func_end SND_Shutdown + + arm_func_start SND_BeginSleep +SND_BeginSleep: ; 0x037FB69C + stmdb sp!, {r3, lr} + ldr r2, _037FB6E0 ; =0x04000501 + mov r0, #0x80 + ldrb r1, [r2] + bic r1, r1, #0x80 + strb r1, [r2] + bl __VENEER_SVC_ResetSoundBias + mov r0, #0x40000 + bl OS_SpinWait + mov r0, #1 + bl PMi_ResetControl + ldr r1, _037FB6E4 ; =0x04000304 + ldrh r0, [r1] + bic r0, r0, #1 + strh r0, [r1] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FB6E0: .word 0x04000501 +_037FB6E4: .word 0x04000304 + arm_func_end SND_BeginSleep + + arm_func_start __VENEER_SVC_ResetSoundBias +__VENEER_SVC_ResetSoundBias: ; 0x037FB6E8 + ldr ip, _037FB6F0 ; =SVC_ResetSoundBias + bx ip + .align 2, 0 +_037FB6F0: .word SVC_ResetSoundBias + arm_func_end __VENEER_SVC_ResetSoundBias + + arm_func_start SND_EndSleep +SND_EndSleep: ; 0x037FB6F4 + stmdb sp!, {r3, lr} + ldr r2, _037FB738 ; =0x04000304 + mov r0, #1 + ldrh r1, [r2] + orr r1, r1, #1 + strh r1, [r2] + bl PMi_SetControl + mov r0, #0x100 + bl __VENEER_SVC_SetSoundBias + ldr r0, _037FB73C ; =0x0007AB80 + bl OS_SpinWait + ldr r1, _037FB740 ; =0x04000501 + ldrb r0, [r1] + orr r0, r0, #0x80 + strb r0, [r1] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FB738: .word 0x04000304 +_037FB73C: .word 0x0007AB80 +_037FB740: .word 0x04000501 + arm_func_end SND_EndSleep + + arm_func_start __VENEER_SVC_SetSoundBias +__VENEER_SVC_SetSoundBias: ; 0x037FB744 + ldr ip, _037FB74C ; =SVC_SetSoundBias + bx ip + .align 2, 0 +_037FB74C: .word SVC_SetSoundBias + arm_func_end __VENEER_SVC_SetSoundBias + + arm_func_start SND_SetMasterVolume +SND_SetMasterVolume: ; 0x037FB750 + ldr r1, _037FB75C ; =0x04000500 + strb r0, [r1] + bx lr + .align 2, 0 +_037FB75C: .word 0x04000500 + arm_func_end SND_SetMasterVolume + + arm_func_start SND_SetOutputSelector +SND_SetOutputSelector: ; 0x037FB760 + ldr ip, _037FB794 ; =0x04000501 + mov r3, r3, lsl #5 + ldrb ip, [ip] + tst ip, #0x80 + movne ip, #1 + moveq ip, #0 + orr r3, r3, ip, lsl #7 + orr r2, r3, r2, lsl #4 + orr r2, r2, r1, lsl #2 + ldr r1, _037FB794 ; =0x04000501 + orr r0, r0, r2 + strb r0, [r1] + bx lr + .align 2, 0 +_037FB794: .word 0x04000501 + arm_func_end SND_SetOutputSelector + + arm_func_start SND_SetupChannelPcm +SND_SetupChannelPcm: ; 0x037FB798 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _037FB850 ; =sMasterPan + mov r8, r1 + ldr lr, [r4] + ldr r1, _037FB854 ; =sSurroundDecay + mov r7, r2 + ldr r5, [sp, #0x2c] + ldr r4, _037FB858 ; =sOrgPan + ldr ip, [sp, #0x20] + ldr r2, _037FB85C ; =sOrgVolume + strb r5, [r4, r0] + cmp lr, #0 + ldr r1, [r1] + movge r5, lr + mov r6, r3 + mov r4, r0, lsl #4 + strb ip, [r2, r0] + cmp r1, #0 + ble _037FB804 + ldr r1, _037FB860 ; =0x0000FFF5 + mov r2, #1 + tst r1, r2, lsl r0 + beq _037FB804 + mov r0, ip + mov r1, r5 + bl CalcSurroundDecay + mov ip, r0 +_037FB804: + ldr r2, [sp, #0x24] + mov r0, r6, lsl #0x1b + orr r0, r0, r7, lsl #29 + orr r1, r0, r5, lsl #16 + ldr r0, [sp, #0x28] + orr r2, r1, r2, lsl #8 + add r1, r4, #0x4000000 + orr r2, ip, r2 + str r2, [r1, #0x400] + ldr r3, [sp, #0x18] + rsb r2, r0, #0x10000 + add r0, r1, #0x400 + strh r2, [r0, #8] + ldr r2, [sp, #0x1c] + strh r3, [r0, #0xa] + str r2, [r1, #0x40c] + str r8, [r1, #0x404] + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FB850: .word sMasterPan +_037FB854: .word sSurroundDecay +_037FB858: .word sOrgPan +_037FB85C: .word sOrgVolume +_037FB860: .word 0x0000FFF5 + arm_func_end SND_SetupChannelPcm + + arm_func_start SND_SetupChannelPsg +SND_SetupChannelPsg: ; 0x037FB864 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _037FB8FC ; =sMasterPan + mov r7, r1 + ldr ip, [r4] + ldr r1, _037FB900 ; =sSurroundDecay + mov r6, r3 + ldr r3, _037FB904 ; =sOrgVolume + ldr r5, [sp, #0x1c] + ldr r4, _037FB908 ; =sOrgPan + ldr r1, [r1] + strb r5, [r4, r0] + cmp ip, #0 + movge r5, ip + mov r4, r0, lsl #4 + strb r2, [r3, r0] + cmp r1, #0 + ble _037FB8C8 + ldr r1, _037FB90C ; =0x0000FFF5 + mov r3, #1 + tst r1, r3, lsl r0 + beq _037FB8C8 + mov r0, r2 + mov r1, r5 + bl CalcSurroundDecay + mov r2, r0 +_037FB8C8: + mov r0, r7, lsl #0x18 + orr r0, r0, #0x60000000 + orr r0, r0, r5, lsl #16 + ldr r1, [sp, #0x18] + orr r3, r0, r6, lsl #8 + add r0, r4, #0x4000000 + orr r2, r2, r3 + str r2, [r0, #0x400] + rsb r1, r1, #0x10000 + add r0, r0, #0x400 + strh r1, [r0, #8] + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_037FB8FC: .word sMasterPan +_037FB900: .word sSurroundDecay +_037FB904: .word sOrgVolume +_037FB908: .word sOrgPan +_037FB90C: .word 0x0000FFF5 + arm_func_end SND_SetupChannelPsg + + arm_func_start SND_SetupChannelNoise +SND_SetupChannelNoise: ; 0x037FB910 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _037FB9A0 ; =sMasterPan + mov r7, r2 + ldr ip, [r4] + ldr r2, _037FB9A4 ; =sSurroundDecay + mov r6, r3 + ldr r3, _037FB9A8 ; =sOrgVolume + ldr r5, [sp, #0x18] + ldr r4, _037FB9AC ; =sOrgPan + ldr r2, [r2] + strb r5, [r4, r0] + cmp ip, #0 + movge r5, ip + mov r4, r0, lsl #4 + strb r1, [r3, r0] + cmp r2, #0 + ble _037FB974 + ldr r2, _037FB9B0 ; =0x0000FFF5 + mov r3, #1 + tst r2, r3, lsl r0 + beq _037FB974 + mov r0, r1 + mov r1, r5 + bl CalcSurroundDecay + mov r1, r0 +_037FB974: + mov r0, r5, lsl #0x10 + orr r0, r0, #0x60000000 + orr r2, r0, r7, lsl #8 + add r0, r4, #0x4000000 + orr r1, r1, r2 + str r1, [r0, #0x400] + rsb r1, r6, #0x10000 + add r0, r0, #0x400 + strh r1, [r0, #8] + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_037FB9A0: .word sMasterPan +_037FB9A4: .word sSurroundDecay +_037FB9A8: .word sOrgVolume +_037FB9AC: .word sOrgPan +_037FB9B0: .word 0x0000FFF5 + arm_func_end SND_SetupChannelNoise + + arm_func_start SND_StopChannel +SND_StopChannel: ; 0x037FB9B4 + mov r3, r0, lsl #4 + add r0, r3, #0x4000000 + ldr r2, [r0, #0x400] + add r0, r3, #0x400 + tst r1, #1 + bic r1, r2, #0x80000000 + add r0, r0, #0x4000000 + orrne r1, r1, #0x8000 + str r1, [r0] + bx lr + arm_func_end SND_StopChannel + + arm_func_start SND_SetChannelVolume +SND_SetChannelVolume: ; 0x037FB9DC + stmdb sp!, {r3, r4, r5, lr} + ldr r3, _037FBA48 ; =sSurroundDecay + ldr ip, _037FBA4C ; =sOrgVolume + ldr r3, [r3] + mov r5, r0 + mov r4, r2 + strb r1, [ip, r5] + cmp r3, #0 + ble _037FBA2C + ldr r0, _037FBA50 ; =0x0000FFF5 + mov r2, #1 + tst r0, r2, lsl r5 + beq _037FBA2C + mov r0, r5, lsl #4 + add r0, r0, #0x4000000 + ldrb r2, [r0, #0x402] + mov r0, r1 + mov r1, r2 + bl CalcSurroundDecay + mov r1, r0 +_037FBA2C: + mov r0, r5, lsl #4 + add r0, r0, #0x4000000 + orr r1, r1, r4, lsl #8 + add r0, r0, #0x400 + strh r1, [r0] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_037FBA48: .word sSurroundDecay +_037FBA4C: .word sOrgVolume +_037FBA50: .word 0x0000FFF5 + arm_func_end SND_SetChannelVolume + + arm_func_start SND_SetChannelTimer +SND_SetChannelTimer: ; 0x037FBA54 + mov r0, r0, lsl #4 + add r0, r0, #0x4000000 + rsb r1, r1, #0x10000 + add r0, r0, #0x400 + strh r1, [r0, #8] + bx lr + arm_func_end SND_SetChannelTimer + + arm_func_start SND_SetChannelPan +SND_SetChannelPan: ; 0x037FBA6C + stmdb sp!, {r4, lr} + ldr r2, _037FBAD0 ; =sMasterPan + ldr r3, _037FBAD4 ; =sOrgPan + ldr r2, [r2] + strb r1, [r3, r0] + cmp r2, #0 + ldr r3, _037FBAD8 ; =sSurroundDecay + mov r4, r0, lsl #4 + movge r1, r2 + add r2, r4, #0x4000000 + strb r1, [r2, #0x402] + ldr r2, [r3] + cmp r2, #0 + ble _037FBAC8 + ldr r2, _037FBADC ; =0x0000FFF5 + mov r3, #1 + tst r2, r3, lsl r0 + beq _037FBAC8 + ldr r2, _037FBAE0 ; =sOrgVolume + ldrb r0, [r2, r0] + bl CalcSurroundDecay + add r1, r4, #0x4000000 + strb r0, [r1, #0x400] +_037FBAC8: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FBAD0: .word sMasterPan +_037FBAD4: .word sOrgPan +_037FBAD8: .word sSurroundDecay +_037FBADC: .word 0x0000FFF5 +_037FBAE0: .word sOrgVolume + arm_func_end SND_SetChannelPan + + arm_func_start SND_IsChannelActive +SND_IsChannelActive: ; 0x037FBAE4 + mov r0, r0, lsl #4 + add r0, r0, #0x4000000 + ldrb r0, [r0, #0x403] + tst r0, #0x80 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end SND_IsChannelActive + + arm_func_start SND_SetMasterPan +SND_SetMasterPan: ; 0x037FBB00 + ldr r1, _037FBB5C ; =sMasterPan + cmp r0, #0 + str r0, [r1] + blt _037FBB34 + mov r2, #0 + and r1, r0, #0xff +_037FBB18: + mov r0, r2, lsl #4 + add r0, r0, #0x4000000 + add r2, r2, #1 + strb r1, [r0, #0x402] + cmp r2, #0x10 + blt _037FBB18 + bx lr +_037FBB34: + ldr r2, _037FBB60 ; =sOrgPan + mov r3, #0 +_037FBB3C: + ldrb r1, [r2, r3] + mov r0, r3, lsl #4 + add r0, r0, #0x4000000 + add r3, r3, #1 + strb r1, [r0, #0x402] + cmp r3, #0x10 + blt _037FBB3C + bx lr + .align 2, 0 +_037FBB5C: .word sMasterPan +_037FBB60: .word sOrgPan + arm_func_end SND_SetMasterPan + + arm_func_start SND_GetChannelControl +SND_GetChannelControl: ; 0x037FBB64 + mov r0, r0, lsl #4 + add r0, r0, #0x4000000 + ldr r0, [r0, #0x400] + bx lr + arm_func_end SND_GetChannelControl + + arm_func_start SNDi_SetSurroundDecay +SNDi_SetSurroundDecay: ; 0x037FBB74 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _037FBBC8 ; =sSurroundDecay + ldr r5, _037FBBCC ; =sOrgVolume + ldr r4, _037FBBD0 ; =0x0000FFF5 + str r0, [r1] + mov r7, #0 + mov r6, #1 +_037FBB90: + tst r4, r6, lsl r7 + beq _037FBBB4 + mov r8, r7, lsl #4 + add r0, r8, #0x4000000 + ldrb r1, [r0, #0x402] + ldrb r0, [r5, r7] + bl CalcSurroundDecay + add r1, r8, #0x4000000 + strb r0, [r1, #0x400] +_037FBBB4: + add r7, r7, #1 + cmp r7, #0x10 + blt _037FBB90 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FBBC8: .word sSurroundDecay +_037FBBCC: .word sOrgVolume +_037FBBD0: .word 0x0000FFF5 + arm_func_end SNDi_SetSurroundDecay + + arm_func_start CalcSurroundDecay +CalcSurroundDecay: ; 0x037FBBD4 + cmp r1, #0x18 + bge _037FBC04 + ldr r2, _037FBC38 ; =sSurroundDecay + add r3, r1, #0x28 + ldr ip, [r2] + ldr r1, _037FBC3C ; =0x00007FFF + mul r2, ip, r3 + sub r1, r1, ip + add r1, r2, r1, lsl #6 + mul r1, r0, r1 + mov r0, r1, asr #0x15 + bx lr +_037FBC04: + cmp r1, #0x68 + bxle lr + ldr r2, _037FBC38 ; =sSurroundDecay + sub r1, r1, #0x28 + ldr ip, [r2] + rsb r2, ip, #0 + mul r3, r2, r1 + add r1, ip, #0xff + add r1, r1, #0x7f00 + add r1, r3, r1, lsl #6 + mul r1, r0, r1 + mov r0, r1, asr #0x15 + bx lr + .align 2, 0 +_037FBC38: .word sSurroundDecay +_037FBC3C: .word 0x00007FFF + arm_func_end CalcSurroundDecay + + arm_func_start SND_CalcTimer +SND_CalcTimer: ; 0x037FBC40 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + rsb r0, r1, #0 + mov r4, #0 + b _037FBC5C +_037FBC54: + sub r4, r4, #1 + add r0, r0, #0x300 +_037FBC5C: + cmp r0, #0 + blt _037FBC54 + b _037FBC70 +_037FBC68: + add r4, r4, #1 + sub r0, r0, #0x300 +_037FBC70: + cmp r0, #0x300 + bge _037FBC68 + bl __VENEER_SVC_GetPitchTable + adds r3, r0, #0x10000 + mov r0, r5, asr #0x1f + umull r2, r1, r3, r5 + mov ip, #0 + mla r1, r3, r0, r1 + adc r3, ip, #0 + sub r0, r4, #0x10 + mla r1, r3, r5, r1 + cmp r0, #0 + mov r4, #0x10000 + bgt _037FBCC8 + rsb r3, r0, #0 + mov r4, r2, lsr r3 + rsb r0, r3, #0x20 + orr r4, r4, r1, lsl r0 + sub r0, r3, #0x20 + mov r3, r1, lsr r3 + orr r4, r4, r1, lsr r0 + b _037FBD24 +_037FBCC8: + cmp r0, #0x20 + bge _037FBD1C + rsb r5, r0, #0x20 + sub lr, ip, #1 + mov r6, lr, lsl r5 + rsb r3, r5, #0x20 + orr r6, r6, lr, lsr r3 + sub r3, r5, #0x20 + orr r6, r6, lr, lsl r3 + and r3, r1, r6 + and r6, r2, lr, lsl r5 + cmp r3, ip + cmpeq r6, ip + subne r0, r4, #1 + bne _037FBD54 + mov r3, r1, lsl r0 + orr r3, r3, r2, lsr r5 + sub r1, r0, #0x20 + mov r4, r2, lsl r0 + orr r3, r3, r2, lsl r1 + b _037FBD24 +_037FBD1C: + sub r0, r4, #1 + b _037FBD54 +_037FBD24: + mov r0, #0x10 + cmp r3, #0 + cmpeq r4, #0x10 + mov r1, #0 + movlo r4, r0 + blo _037FBD4C + ldr r0, _037FBD5C ; =0x0000FFFF + cmp r3, r1 + cmpeq r4, r0 + movhi r4, r0 +_037FBD4C: + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 +_037FBD54: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_037FBD5C: .word 0x0000FFFF + arm_func_end SND_CalcTimer + + arm_func_start __VENEER_SVC_GetPitchTable +__VENEER_SVC_GetPitchTable: ; 0x037FBD60 + ldr ip, _037FBD68 ; =SVC_GetPitchTable + bx ip + .align 2, 0 +_037FBD68: .word SVC_GetPitchTable + arm_func_end __VENEER_SVC_GetPitchTable + + arm_func_start SND_CalcChannelVolume +SND_CalcChannelVolume: ; 0x037FBD6C + stmdb sp!, {r4, lr} + ldr r1, _037FBDDC ; =0xFFFFFD2D + mov r4, r0 + cmp r4, r1 + movlt r4, r1 + blt _037FBD8C + cmp r4, #0 + movgt r4, #0 +_037FBD8C: + add r0, r4, #0xd3 + add r0, r0, #0x200 + bl __VENEER_SVC_GetVolumeTable + mvn r2, #0xef + cmp r4, r2 + movlt r1, #3 + blt _037FBDC8 + add r1, r2, #0x78 + cmp r4, r1 + movlt r1, #2 + blt _037FBDC8 + add r1, r2, #0xb4 + cmp r4, r1 + movlt r1, #1 + movge r1, #0 +_037FBDC8: + orr r0, r0, r1, lsl #8 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FBDDC: .word 0xFFFFFD2D + arm_func_end SND_CalcChannelVolume + + arm_func_start __VENEER_SVC_GetVolumeTable +__VENEER_SVC_GetVolumeTable: ; 0x037FBDE0 + ldr ip, _037FBDE8 ; =SVC_GetVolumeTable + bx ip + .align 2, 0 +_037FBDE8: .word SVC_GetVolumeTable + arm_func_end __VENEER_SVC_GetVolumeTable + + arm_func_start SND_SinIdx +SND_SinIdx: ; 0x037FBDEC + cmp r0, #0x20 + ldrlt r1, _037FBE54 ; =SinTable + ldrltsb r0, [r1, r0] + bxlt lr + cmp r0, #0x40 + ldrlt r1, _037FBE54 ; =SinTable + rsblt r0, r0, #0x40 + ldrltsb r0, [r1, r0] + bxlt lr + cmp r0, #0x60 + bge _037FBE34 + ldr r1, _037FBE54 ; =SinTable + sub r0, r0, #0x40 + ldrsb r0, [r1, r0] + rsb r0, r0, #0 + mov r0, r0, lsl #0x18 + mov r0, r0, asr #0x18 + bx lr +_037FBE34: + ldr r1, _037FBE54 ; =SinTable + sub r0, r0, #0x60 + rsb r0, r0, #0x20 + ldrsb r0, [r1, r0] + rsb r0, r0, #0 + mov r0, r0, lsl #0x18 + mov r0, r0, asr #0x18 + bx lr + .align 2, 0 +_037FBE54: .word SinTable + arm_func_end SND_SinIdx + + arm_func_start SND_CalcRandom +SND_CalcRandom: ; 0x037FBE58 + ldr r2, _037FBE80 ; =u$3681 + ldr r0, _037FBE84 ; =0x0019660D + ldr r3, [r2] + ldr r1, _037FBE88 ; =0x3C6EF35F + mla r1, r3, r0, r1 + mov r0, r1, lsr #0x10 + mov r0, r0, lsl #0x10 + str r1, [r2] + mov r0, r0, lsr #0x10 + bx lr + .align 2, 0 +_037FBE80: .word u$3681 +_037FBE84: .word 0x0019660D +_037FBE88: .word 0x3C6EF35F + arm_func_end SND_CalcRandom + + arm_func_start SND_Init +SND_Init: ; 0x037FBE8C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r1, _037FBEE8 ; =initialized$3619 + mov r4, r0 + ldr r0, [r1] + cmp r0, #0 + bne _037FBEDC + mov r0, #1 + str r0, [r1] + bl SND_CommandInit + mov r0, #0x400 + str r0, [sp] + ldr r0, _037FBEEC ; =sndThread + ldr r1, _037FBEF0 ; =SndThread + ldr r3, _037FBEF4 ; =sWeakLockChannel + mov r2, #0 + str r4, [sp, #4] + bl OS_CreateThread + ldr r0, _037FBEEC ; =sndThread + bl OS_WakeupThreadDirect +_037FBEDC: + add sp, sp, #8 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FBEE8: .word initialized$3619 +_037FBEEC: .word sndThread +_037FBEF0: .word SndThread +_037FBEF4: .word sWeakLockChannel + arm_func_end SND_Init + + arm_func_start SND_StartIntervalTimer +SND_StartIntervalTimer: ; 0x037FBEF8 + stmdb sp!, {lr} + sub sp, sp, #0xc + bl OS_GetTick + ldr r3, _037FBF3C ; =SndAlarmCallback + adds ip, r0, #0x10000 + str r3, [sp, #4] + mov lr, #0 + str lr, [sp, #8] + adc r2, r1, #0 + ldr r3, _037FBF40 ; =0x00000AA8 + ldr r0, _037FBF44 ; =sndAlarm + mov r1, ip + str lr, [sp] + bl OS_SetPeriodicAlarm + add sp, sp, #0xc + ldmia sp!, {lr} + bx lr + .align 2, 0 +_037FBF3C: .word SndAlarmCallback +_037FBF40: .word 0x00000AA8 +_037FBF44: .word sndAlarm + arm_func_end SND_StartIntervalTimer + + arm_func_start SND_StopIntervalTimer +SND_StopIntervalTimer: ; 0x037FBF48 + ldr ip, _037FBF54 ; =OS_CancelAlarm + ldr r0, _037FBF58 ; =sndAlarm + bx ip + .align 2, 0 +_037FBF54: .word OS_CancelAlarm +_037FBF58: .word sndAlarm + arm_func_end SND_StopIntervalTimer + + arm_func_start SND_SendWakeupMessage +SND_SendWakeupMessage: ; 0x037FBF5C + ldr ip, _037FBF70 ; =OS_SendMessage + ldr r0, _037FBF74 ; =sndMesgQueue + mov r1, #2 + mov r2, #0 + bx ip + .align 2, 0 +_037FBF70: .word OS_SendMessage +_037FBF74: .word sndMesgQueue + arm_func_end SND_SendWakeupMessage + + arm_func_start SNDi_LockMutex +SNDi_LockMutex: ; 0x037FBF78 + bx lr + arm_func_end SNDi_LockMutex + + arm_func_start SNDi_UnlockMutex +SNDi_UnlockMutex: ; 0x037FBF7C + bx lr + arm_func_end SNDi_UnlockMutex + + arm_func_start SndAlarmCallback +SndAlarmCallback: ; 0x037FBF80 + ldr ip, _037FBF94 ; =OS_SendMessage + ldr r0, _037FBF98 ; =sndMesgQueue + mov r1, #1 + mov r2, #0 + bx ip + .align 2, 0 +_037FBF94: .word OS_SendMessage +_037FBF98: .word sndMesgQueue + arm_func_end SndAlarmCallback + + arm_func_start SndThread +SndThread: ; 0x037FBF9C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + ldr r0, _037FC07C ; =sndMesgQueue + ldr r1, _037FC080 ; =sndMesgBuffer + mov r2, #8 + bl OS_InitMessageQueue + ldr r0, _037FC084 ; =sndAlarm + bl OS_CreateAlarm + bl SND_ExChannelInit + bl SND_SeqInit + bl SND_AlarmInit + bl SND_Enable + mov r0, #0 + mov r1, r0 + mov r2, r0 + mov r3, r0 + bl SND_SetOutputSelector + mov r0, #0x7f + bl SND_SetMasterVolume + bl OS_GetTick + ldr r2, _037FC088 ; =SndAlarmCallback + adds r4, r0, #0x10000 + str r2, [sp, #4] + mov r0, #0 + str r0, [sp, #8] + str r0, [sp] + adc r2, r1, #0 + ldr r3, _037FC08C ; =0x00000AA8 + ldr r0, _037FC084 ; =sndAlarm + mov r1, r4 + bl OS_SetPeriodicAlarm + ldr r7, _037FC07C ; =sndMesgQueue + mov r4, #1 + add r6, sp, #0xc + mov r8, #0 + mov r5, r4 +_037FC02C: + mov r0, r7 + mov r1, r6 + mov r2, r5 + mov sb, r8 + bl OS_ReceiveMessage + ldr r0, [sp, #0xc] + cmp r0, #1 + beq _037FC054 + cmp r0, #2 + b _037FC058 +_037FC054: + mov sb, r4 +_037FC058: + bl SND_UpdateExChannel + bl SND_CommandProc + mov r0, sb + bl SND_SeqMain + mov r0, sb + bl SND_ExChannelMain + bl SND_UpdateSharedWork + bl SND_CalcRandom + b _037FC02C + .align 2, 0 +_037FC07C: .word sndMesgQueue +_037FC080: .word sndMesgBuffer +_037FC084: .word sndAlarm +_037FC088: .word SndAlarmCallback +_037FC08C: .word 0x00000AA8 + arm_func_end SndThread + + arm_func_start SND_SetupCapture +SND_SetupCapture: ; 0x037FC090 + stmdb sp!, {r3, r4, r5, lr} + ldr r4, [sp, #0x10] + mov r5, r0, lsl #3 + cmp r4, #0 + movne r4, #0 + moveq r4, #1 + mov ip, r4, lsl #2 + ldr lr, [sp, #0x14] + orr r1, ip, r1, lsl #3 + orr ip, r1, lr, lsl #1 + ldr r4, [sp, #0x18] + add r0, r0, #0x4000000 + orr r4, r4, ip + strb r4, [r0, #0x508] + add r1, r5, #0x4000000 + str r2, [r1, #0x510] + add r0, r1, #0x500 + strh r3, [r0, #0x14] + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end SND_SetupCapture + + arm_func_start SND_IsCaptureActive +SND_IsCaptureActive: ; 0x037FC0E0 + add r0, r0, #0x4000000 + ldrb r0, [r0, #0x508] + tst r0, #0x80 + movne r0, #1 + moveq r0, #0 + bx lr + arm_func_end SND_IsCaptureActive + + arm_func_start SND_ExChannelInit +SND_ExChannelInit: ; 0x037FC0F8 + stmdb sp!, {r3, lr} + ldr r3, _037FC14C ; =SNDi_Work + mov lr, #0 + mov r0, #0x54 +_037FC108: + mul r1, lr, r0 + add ip, r3, r1 + strb lr, [r3, r1] + ldrb r1, [ip, #3] + add lr, lr, #1 + bic r2, r1, #0xf8 + and r1, r2, #0xff + bic r1, r1, #1 + strb r1, [ip, #3] + cmp lr, #0x10 + blt _037FC108 + ldr r0, _037FC150 ; =sWeakLockChannel + mov r1, #0 + str r1, [r0, #4] + str r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FC14C: .word SNDi_Work +_037FC150: .word sWeakLockChannel + arm_func_end SND_ExChannelInit + + arm_func_start SND_UpdateExChannel +SND_UpdateExChannel: ; 0x037FC154 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x18 + ldr r7, _037FC33C ; =SNDi_Work + mov sb, #0 + mov r4, #2 + mov r5, #1 + mov r6, sb + mov sl, #0x54 +_037FC174: + mla r8, sb, sl, r7 + ldrb r0, [r8, #3] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1b + beq _037FC2D4 + tst r0, #2 + beq _037FC19C + mov r0, sb + mov r1, r6 + bl SND_StopChannel +_037FC19C: + ldrb r0, [r8, #3] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1b + tst r0, #1 + beq _037FC278 + ldrb r0, [r8, #1] + cmp r0, #0 + beq _037FC1D0 + cmp r0, #1 + beq _037FC228 + cmp r0, #2 + beq _037FC254 + b _037FC2D4 +_037FC1D0: + ldrb r0, [r8, #0x39] + ldrh ip, [r8, #0x24] + cmp r0, #0 + ldrh r0, [r8, #0x3e] + movne r3, r5 + str r0, [sp] + ldr r2, [r8, #0x40] + and r1, ip, #0xff + str r2, [sp, #4] + str r1, [sp, #8] + mov r0, ip, asr #8 + str r0, [sp, #0xc] + ldrh r1, [r8, #0x26] + moveq r3, r4 + str r1, [sp, #0x10] + ldrb r1, [r8, #0x23] + mov r0, sb + str r1, [sp, #0x14] + ldr r1, [r8, #0x44] + ldrb r2, [r8, #0x38] + bl SND_SetupChannelPcm + b _037FC2D4 +_037FC228: + ldrh r3, [r8, #0x24] + ldrh r1, [r8, #0x26] + mov r0, sb + str r1, [sp] + ldrb r1, [r8, #0x23] + and r2, r3, #0xff + str r1, [sp, #4] + ldr r1, [r8, #0x44] + mov r3, r3, asr #8 + bl SND_SetupChannelPsg + b _037FC2D4 +_037FC254: + ldrh r2, [r8, #0x24] + ldrb r1, [r8, #0x23] + mov r0, sb + str r1, [sp] + ldrh r3, [r8, #0x26] + and r1, r2, #0xff + mov r2, r2, asr #8 + bl SND_SetupChannelNoise + b _037FC2D4 +_037FC278: + tst r0, #4 + beq _037FC28C + ldrh r1, [r8, #0x26] + mov r0, sb + bl SND_SetChannelTimer +_037FC28C: + ldrb r0, [r8, #3] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1b + tst r0, #8 + beq _037FC2B4 + ldrh r2, [r8, #0x24] + mov r0, sb + and r1, r2, #0xff + mov r2, r2, asr #8 + bl SND_SetChannelVolume +_037FC2B4: + ldrb r0, [r8, #3] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1b + tst r0, #0x10 + beq _037FC2D4 + ldrb r1, [r8, #0x23] + mov r0, sb + bl SND_SetChannelPan +_037FC2D4: + add sb, sb, #1 + cmp sb, #0x10 + blt _037FC174 + ldr r3, _037FC33C ; =SNDi_Work + mov r4, #0 + mov r1, #0x54 +_037FC2EC: + mla r5, r4, r1, r3 + ldrb r0, [r5, #3] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1b + beq _037FC324 + tst r0, #1 + movne r0, r4, lsl #4 + addne r0, r0, #0x4000000 + ldrneb r2, [r0, #0x403] + orrne r2, r2, #0x80 + strneb r2, [r0, #0x403] + ldrb r0, [r5, #3] + bic r0, r0, #0xf8 + strb r0, [r5, #3] +_037FC324: + add r4, r4, #1 + cmp r4, #0x10 + blt _037FC2EC + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_037FC33C: .word SNDi_Work + arm_func_end SND_UpdateExChannel + + arm_func_start SND_ExChannelMain +SND_ExChannelMain: ; 0x037FC340 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov fp, r0 + mov r0, #0x8000 + rsb r0, r0, #0 + mov r6, #0 + str r0, [sp] + mov r4, r6 +_037FC35C: + ldr r0, _037FC6E8 ; =SNDi_Work + mov r1, #0x54 + mla r5, r6, r1, r0 + ldrb r2, [r5, #3] + mov r7, #0 + mov r0, r2, lsl #0x1f + mov r8, r7 + mov sb, r7 + movs r0, r0, lsr #0x1f + beq _037FC6D4 + mov r0, r2, lsl #0x1e + movs r0, r0, lsr #0x1f + beq _037FC3C0 + bic r1, r2, #0xf8 + mov r0, r2, lsl #0x18 + mov r0, r0, lsr #0x1b + orr r0, r0, #1 + and r0, r0, #0xff + mov r0, r0, lsl #0x1b + orr r0, r1, r0, lsr #24 + strb r0, [r5, #3] + and r0, r0, #0xff + bic r0, r0, #2 + strb r0, [r5, #3] + b _037FC410 +_037FC3C0: + mov r0, r6 + bl SND_IsChannelActive + cmp r0, #0 + bne _037FC410 + ldr r3, [r5, #0x48] + cmp r3, #0 + moveq r0, r7 + streqb r0, [r5, #0x22] + beq _037FC3F8 + ldr r2, [r5, #0x4c] + mov r0, r5 + mov r1, #1 + mov lr, pc + bx r3 +_037FC3F8: + mov r0, #0 + strh r0, [r5, #0x24] + ldrb r0, [r5, #3] + bic r0, r0, #1 + strb r0, [r5, #3] + b _037FC6D4 +_037FC410: + ldrb r0, [r5, #9] + ldrb r1, [r5, #8] + mov r2, r0, lsl #1 + ldr r0, _037FC6EC ; =SNDi_DecibelTable + ldrsh r2, [r0, r2] + ldrb r0, [r5, #5] + add r7, r7, r2 + sub r0, r1, r0 + add r8, r8, r0, lsl #6 + mov r0, r5 + mov r1, fp + bl SND_UpdateExChannelEnvelope + ldrsh r3, [r5, #0x32] + add r7, r7, r0 + cmp r3, #0 + moveq r0, #0 + beq _037FC498 + ldr r0, [r5, #0x14] + ldr r2, [r5, #0x18] + cmp r0, r2 + movge r0, #0 + bge _037FC498 + sub r0, r2, r0 + smull r0, r1, r3, r0 + mov r3, r2, asr #0x1f + bl _ll_sdiv + cmp fp, #0 + beq _037FC498 + ldrb r1, [r5, #3] + mov r1, r1, lsl #0x1d + movs r1, r1, lsr #0x1f + ldrne r1, [r5, #0x14] + addne r1, r1, #1 + strne r1, [r5, #0x14] +_037FC498: + ldrsh r1, [r5, #0xc] + add r2, r8, r0 + ldrsh r0, [r5, #6] + add r1, r7, r1 + add r7, r1, r0 + ldrsh r1, [r5, #0xe] + add r0, r5, #0x28 + add r8, r2, r1 + bl SND_GetLfoValue + mov r1, r0, asr #0x1f + cmp r1, #0 + mov sl, r0 + cmpeq r0, r4 + beq _037FC524 + ldrb r2, [r5, #0x28] + cmp r2, #0 + beq _037FC510 + cmp r2, #1 + beq _037FC4F8 + cmp r2, #2 + moveq r1, r1, lsl #6 + orreq r1, r1, r0, lsr #26 + moveq sl, r0, lsl #6 + b _037FC51C +_037FC4F8: + mov r2, #0x3c + umull sl, r3, r0, r2 + mov r0, #0x3c + mla r3, r1, r0, r3 + mov r1, r3 + b _037FC51C +_037FC510: + mov r1, r1, lsl #6 + orr r1, r1, r0, lsr #26 + mov sl, r0, lsl #6 +_037FC51C: + mov sl, sl, lsr #0xe + orr sl, sl, r1, lsl #18 +_037FC524: + cmp fp, #0 + beq _037FC534 + add r0, r5, #0x28 + bl SND_UpdateLfo +_037FC534: + ldrb r0, [r5, #0x28] + cmp r0, #0 + beq _037FC564 + cmp r0, #1 + beq _037FC554 + cmp r0, #2 + addeq sb, sb, sl + b _037FC568 +_037FC554: + ldr r0, [sp] + cmp r7, r0 + addgt r7, r7, sl + b _037FC568 +_037FC564: + add r8, r8, sl +_037FC568: + ldrsb r1, [r5, #0xa] + ldrb r0, [r5, #4] + add sb, sb, r1 + cmp r0, #0x7f + mulne r0, sb, r0 + addne r0, r0, #0x40 + movne sb, r0, asr #7 + ldrsb r1, [r5, #0xb] + ldrb r0, [r5, #2] + add sb, sb, r1 + cmp r0, #3 + bne _037FC5F4 + ldr r0, _037FC6F0 ; =0xFFFFFD2D + cmp r7, r0 + bgt _037FC5F4 + ldrb r0, [r5, #3] + bic r0, r0, #0xf8 + orr r0, r0, #0x10 + strb r0, [r5, #3] + ldr r3, [r5, #0x48] + cmp r3, #0 + moveq r0, #0 + streqb r0, [r5, #0x22] + beq _037FC5DC + ldr r2, [r5, #0x4c] + mov r0, r5 + mov r1, #1 + mov lr, pc + bx r3 +_037FC5DC: + mov r0, #0 + strh r0, [r5, #0x24] + ldrb r0, [r5, #3] + bic r0, r0, #1 + strb r0, [r5, #3] + b _037FC6D4 +_037FC5F4: + mov r0, r7 + bl SND_CalcChannelVolume + mov r7, r0 + ldrh r0, [r5, #0x3c] + mov r1, r8 + bl SND_CalcTimer + ldrb r1, [r5, #1] + cmp r1, #1 + ldreq r1, _037FC6F4 ; =0x0000FFFC + andeq r0, r0, r1 + moveq r0, r0, lsl #0x10 + moveq r0, r0, lsr #0x10 + adds sb, sb, #0x40 + movmi sb, #0 + bmi _037FC638 + cmp sb, #0x7f + movgt sb, #0x7f +_037FC638: + ldrh r1, [r5, #0x24] + cmp r7, r1 + beq _037FC66C + strh r7, [r5, #0x24] + ldrb r1, [r5, #3] + bic r2, r1, #0xf8 + mov r1, r1, lsl #0x18 + mov r1, r1, lsr #0x1b + orr r1, r1, #8 + and r1, r1, #0xff + mov r1, r1, lsl #0x1b + orr r1, r2, r1, lsr #24 + strb r1, [r5, #3] +_037FC66C: + ldrh r1, [r5, #0x26] + cmp r0, r1 + beq _037FC6A0 + strh r0, [r5, #0x26] + ldrb r0, [r5, #3] + bic r1, r0, #0xf8 + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1b + orr r0, r0, #4 + and r0, r0, #0xff + mov r0, r0, lsl #0x1b + orr r0, r1, r0, lsr #24 + strb r0, [r5, #3] +_037FC6A0: + ldrb r0, [r5, #0x23] + cmp sb, r0 + beq _037FC6D4 + strb sb, [r5, #0x23] + ldrb r0, [r5, #3] + bic r1, r0, #0xf8 + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x1b + orr r0, r0, #0x10 + and r0, r0, #0xff + mov r0, r0, lsl #0x1b + orr r0, r1, r0, lsr #24 + strb r0, [r5, #3] +_037FC6D4: + add r6, r6, #1 + cmp r6, #0x10 + blt _037FC35C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FC6E8: .word SNDi_Work +_037FC6EC: .word SNDi_DecibelTable +_037FC6F0: .word 0xFFFFFD2D +_037FC6F4: .word 0x0000FFFC + arm_func_end SND_ExChannelMain + + arm_func_start SND_StartExChannelPcm +SND_StartExChannelPcm: ; 0x037FC6F8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + strb r0, [r4, #1] + mov lr, r2 + add ip, r4, #0x38 + ldmia r1, {r0, r1, r2} + stmia ip, {r0, r1, r2} + mov r0, r4 + mov r1, r3 + str lr, [r4, #0x44] + bl StartExChannel + mov r0, #1 + ldmia sp!, {r4, lr} + bx lr + arm_func_end SND_StartExChannelPcm + + arm_func_start SND_StartExChannelPsg +SND_StartExChannelPsg: ; 0x037FC734 + stmdb sp!, {r3, lr} + ldrb r3, [r0] + cmp r3, #8 + movlo r0, #0 + blo _037FC774 + cmp r3, #0xd + movhi r0, #0 + bhi _037FC774 + mov r3, #1 + strb r3, [r0, #1] + str r1, [r0, #0x44] + ldr r3, _037FC77C ; =0x00001F46 + mov r1, r2 + strh r3, [r0, #0x3c] + bl StartExChannel + mov r0, #1 +_037FC774: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FC77C: .word 0x00001F46 + arm_func_end SND_StartExChannelPsg + + arm_func_start SND_StartExChannelNoise +SND_StartExChannelNoise: ; 0x037FC780 + stmdb sp!, {r3, lr} + ldrb r2, [r0] + cmp r2, #0xe + movlo r0, #0 + blo _037FC7B8 + cmp r2, #0xf + movhi r0, #0 + bhi _037FC7B8 + ldr r2, _037FC7C0 ; =0x00001F46 + mov r3, #2 + strb r3, [r0, #1] + strh r2, [r0, #0x3c] + bl StartExChannel + mov r0, #1 +_037FC7B8: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FC7C0: .word 0x00001F46 + arm_func_end SND_StartExChannelNoise + + arm_func_start SND_UpdateExChannelEnvelope +SND_UpdateExChannelEnvelope: ; 0x037FC7C4 + cmp r1, #0 + beq _037FC85C + ldrb r1, [r0, #2] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _037FC85C +_037FC7DC: ; jump table + b _037FC7EC ; case 0 + b _037FC814 ; case 1 + b _037FC85C ; case 2 + b _037FC84C ; case 3 +_037FC7EC: + ldr r2, [r0, #0x10] + ldrb r1, [r0, #0x1c] + rsb r2, r2, #0 + mul r1, r2, r1 + mov r1, r1, asr #8 + rsbs r1, r1, #0 + str r1, [r0, #0x10] + moveq r1, #1 + streqb r1, [r0, #2] + b _037FC85C +_037FC814: + ldrb r2, [r0, #0x1d] + ldr r1, _037FC868 ; =SNDi_DecibelTable + mov r2, r2, lsl #1 + ldrsh r3, [r1, r2] + ldr r2, [r0, #0x10] + ldrh r1, [r0, #0x1e] + mov ip, r3, lsl #7 + sub r1, r2, r1 + str r1, [r0, #0x10] + cmp r1, r3, lsl #7 + strle ip, [r0, #0x10] + movle r1, #2 + strleb r1, [r0, #2] + b _037FC85C +_037FC84C: + ldr r2, [r0, #0x10] + ldrh r1, [r0, #0x20] + sub r1, r2, r1 + str r1, [r0, #0x10] +_037FC85C: + ldr r0, [r0, #0x10] + mov r0, r0, asr #7 + bx lr + .align 2, 0 +_037FC868: .word SNDi_DecibelTable + arm_func_end SND_UpdateExChannelEnvelope + + arm_func_start SND_SetExChannelAttack +SND_SetExChannelAttack: ; 0x037FC86C + cmp r1, #0x6d + ldrge r2, _037FC888 ; =attack_table$3790 + rsblt r1, r1, #0xff + rsbge r1, r1, #0x7f + ldrgeb r1, [r2, r1] + strb r1, [r0, #0x1c] + bx lr + .align 2, 0 +_037FC888: .word attack_table$3790 + arm_func_end SND_SetExChannelAttack + + arm_func_start SND_SetExChannelDecay +SND_SetExChannelDecay: ; 0x037FC88C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + bl CalcRelease + strh r0, [r4, #0x1e] + ldmia sp!, {r4, lr} + bx lr + arm_func_end SND_SetExChannelDecay + + arm_func_start SND_SetExChannelSustain +SND_SetExChannelSustain: ; 0x037FC8A8 + strb r1, [r0, #0x1d] + bx lr + arm_func_end SND_SetExChannelSustain + + arm_func_start SND_SetExChannelRelease +SND_SetExChannelRelease: ; 0x037FC8B0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + bl CalcRelease + strh r0, [r4, #0x20] + ldmia sp!, {r4, lr} + bx lr + arm_func_end SND_SetExChannelRelease + + arm_func_start SND_ReleaseExChannel +SND_ReleaseExChannel: ; 0x037FC8CC + mov r1, #3 + strb r1, [r0, #2] + bx lr + arm_func_end SND_ReleaseExChannel + + arm_func_start SND_IsExChannelActive +SND_IsExChannelActive: ; 0x037FC8D8 + ldrb r0, [r0, #3] + mov r0, r0, lsl #0x1f + mov r0, r0, lsr #0x1f + bx lr + arm_func_end SND_IsExChannelActive + + arm_func_start SND_AllocExChannel +SND_AllocExChannel: ; 0x037FC8E8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _037FCAA0 ; =sWeakLockChannel + mov r6, r1 + ldr r1, [r4, #4] + mov r5, r3 + mvn r1, r1 + cmp r2, #0 + and r0, r0, r1 + ldreq r1, [r4] + mov r4, #0 + mvneq r1, r1 + andeq r0, r0, r1 + ldr r3, _037FCAA4 ; =shift$4005 + ldr r8, _037FCAA8 ; =channel_order$3829 + mov sb, r4 + mvn r1, #0 + mov fp, #1 +_037FC92C: + ldrb ip, [r8, sb] + tst r0, fp, lsl ip + beq _037FC9AC + ldr r2, _037FCAAC ; =SNDi_Work + mov r7, #0x54 + mla sl, ip, r7, r2 + cmp r4, #0 + moveq r4, sl + beq _037FC9AC + ldrb r7, [r4, #0x22] + ldrb r2, [sl, #0x22] + cmp r2, r7 + bhi _037FC9AC + bne _037FC9A8 + ldrh r2, [r4, #0x24] + ldrh r7, [sl, #0x24] + mov ip, r2, lsl #0x18 + mov ip, ip, lsr #0x14 + ldrb r2, [r3, r2, asr #8] + mov lr, r7, lsl #0x18 + mov r2, ip, asr r2 + mov ip, lr, lsr #0x14 + ldrb r7, [r3, r7, asr #8] + cmp r2, ip, asr r7 + beq _037FC99C + movlt r2, fp + movge r2, r1 + b _037FC9A0 +_037FC99C: + mov r2, #0 +_037FC9A0: + cmp r2, #0 + bge _037FC9AC +_037FC9A8: + mov r4, sl +_037FC9AC: + add sb, sb, #1 + cmp sb, #0x10 + blt _037FC92C + cmp r4, #0 + moveq r0, #0 + beq _037FCA98 + ldrb r0, [r4, #0x22] + cmp r6, r0 + movlt r0, #0 + blt _037FCA98 + ldr r3, [r4, #0x48] + cmp r3, #0 + beq _037FC9F4 + ldr r2, [r4, #0x4c] + mov r0, r4 + mov r1, #0 + mov lr, pc + bx r3 +_037FC9F4: + ldrb r0, [r4, #3] + mov r7, #0 + bic r0, r0, #0xf8 + orr r1, r0, #0x10 + and r0, r1, #0xff + bic r0, r0, #1 + strb r0, [r4, #3] + str r7, [r4, #0x50] + ldr r0, [sp, #0x28] + str r5, [r4, #0x48] + str r0, [r4, #0x4c] + str r7, [r4, #0x34] + strb r6, [r4, #0x22] + mov r3, #0x7f + strh r3, [r4, #0x24] + ldrb r1, [r4, #3] + mov r0, #0x3c + bic r2, r1, #2 + and r1, r2, #0xff + orr r1, r1, #4 + strb r1, [r4, #3] + strb r0, [r4, #8] + strb r0, [r4, #5] + strb r3, [r4, #9] + strb r7, [r4, #0xa] + strh r7, [r4, #0xc] + strh r7, [r4, #6] + strh r7, [r4, #0xe] + strb r7, [r4, #0xb] + strb r3, [r4, #4] + strh r7, [r4, #0x32] + str r7, [r4, #0x18] + str r7, [r4, #0x14] + ldr r1, _037FCAB0 ; =0x0000FFFF + strb r7, [r4, #0x1c] + strh r1, [r4, #0x1e] + strb r3, [r4, #0x1d] + add r0, r4, #0x28 + strh r1, [r4, #0x20] + bl SND_InitLfoParam + mov r0, r4 +_037FCA98: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FCAA0: .word sWeakLockChannel +_037FCAA4: .word shift$4005 +_037FCAA8: .word channel_order$3829 +_037FCAAC: .word SNDi_Work +_037FCAB0: .word 0x0000FFFF + arm_func_end SND_AllocExChannel + + arm_func_start SND_FreeExChannel +SND_FreeExChannel: ; 0x037FCAB4 + cmp r0, #0 + movne r1, #0 + strne r1, [r0, #0x48] + strne r1, [r0, #0x4c] + bx lr + arm_func_end SND_FreeExChannel + + arm_func_start SND_StopUnlockedChannel +SND_StopUnlockedChannel: ; 0x037FCAC8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, #0 + ldr r7, _037FCB70 ; =SNDi_Work + ldr r4, _037FCB74 ; =sWeakLockChannel + mov sl, r0 + mov r5, sb + mov r6, #1 + mov fp, #0x54 + b _037FCB58 +_037FCAEC: + tst sl, #1 + beq _037FCB50 + ldr r0, [r4, #4] + mla r8, sb, fp, r7 + tst r0, r6, lsl sb + bne _037FCB50 + ldr r3, [r8, #0x48] + cmp r3, #0 + beq _037FCB24 + ldr r2, [r8, #0x4c] + mov r0, r8 + mov r1, #0 + mov lr, pc + bx r3 +_037FCB24: + mov r0, sb + mov r1, #0 + bl SND_StopChannel + strb r5, [r8, #0x22] + mov r0, r8 + bl SND_FreeExChannel + ldrb r0, [r8, #3] + bic r1, r0, #0xf8 + and r0, r1, #0xff + bic r0, r0, #1 + strb r0, [r8, #3] +_037FCB50: + add sb, sb, #1 + mov sl, sl, lsr #1 +_037FCB58: + cmp sb, #0x10 + bge _037FCB68 + cmp sl, #0 + bne _037FCAEC +_037FCB68: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FCB70: .word SNDi_Work +_037FCB74: .word sWeakLockChannel + arm_func_end SND_StopUnlockedChannel + + arm_func_start SND_LockChannel +SND_LockChannel: ; 0x037FCB78 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov r8, #0 + ldr r5, _037FCC50 ; =SNDi_Work + mov sb, r1 + mov r7, sl + mov fp, r8 + mov r4, #1 + b _037FCC14 +_037FCB9C: + tst r7, #1 + beq _037FCC0C + ldr r0, _037FCC54 ; =sWeakLockChannel + ldr r1, [r0, #4] + mov r0, #0x54 + mla r6, r8, r0, r5 + tst r1, r4, lsl r8 + bne _037FCC0C + ldr r3, [r6, #0x48] + cmp r3, #0 + beq _037FCBDC + ldr r2, [r6, #0x4c] + mov r0, r6 + mov r1, #0 + mov lr, pc + bx r3 +_037FCBDC: + mov r0, r8 + mov r1, #0 + bl SND_StopChannel + strb fp, [r6, #0x22] + mov r0, r6 + bl SND_FreeExChannel + ldrb r0, [r6, #3] + bic r0, r0, #0xf8 + strb r0, [r6, #3] + and r0, r0, #0xff + bic r0, r0, #1 + strb r0, [r6, #3] +_037FCC0C: + add r8, r8, #1 + mov r7, r7, lsr #1 +_037FCC14: + cmp r8, #0x10 + bge _037FCC24 + cmp r7, #0 + bne _037FCB9C +_037FCC24: + tst sb, #1 + ldrne r0, _037FCC54 ; =sWeakLockChannel + ldrne r1, [r0] + orrne r1, r1, sl + strne r1, [r0] + ldreq r0, _037FCC54 ; =sWeakLockChannel + ldreq r1, [r0, #4] + orreq r1, r1, sl + streq r1, [r0, #4] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FCC50: .word SNDi_Work +_037FCC54: .word sWeakLockChannel + arm_func_end SND_LockChannel + + arm_func_start SND_UnlockChannel +SND_UnlockChannel: ; 0x037FCC58 + tst r1, #1 + ldreq r1, _037FCC8C ; =sWeakLockChannel + mvneq r0, r0 + ldreq r2, [r1, #4] + andeq r0, r2, r0 + streq r0, [r1, #4] + bxeq lr + ldr r1, _037FCC8C ; =sWeakLockChannel + mvn r0, r0 + ldr r2, [r1] + and r0, r2, r0 + str r0, [r1] + bx lr + .align 2, 0 +_037FCC8C: .word sWeakLockChannel + arm_func_end SND_UnlockChannel + + arm_func_start SND_GetLockedChannel +SND_GetLockedChannel: ; 0x037FCC90 + tst r0, #1 + ldrne r0, _037FCCA8 ; =sWeakLockChannel + ldrne r0, [r0] + ldreq r0, _037FCCA8 ; =sWeakLockChannel + ldreq r0, [r0, #4] + bx lr + .align 2, 0 +_037FCCA8: .word sWeakLockChannel + arm_func_end SND_GetLockedChannel + + arm_func_start SND_InvalidateWave +SND_InvalidateWave: ; 0x037FCCAC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r5, _037FCD24 ; =SNDi_Work + mov r6, #0 + mov r8, r0 + mov r7, r1 + mov r4, r6 + mov sb, #0x54 +_037FCCC8: + mla r2, r6, sb, r5 + ldrb r1, [r2, #3] + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _037FCD0C + ldrb r0, [r2, #1] + cmp r0, #0 + bne _037FCD0C + ldr r0, [r2, #0x44] + cmp r8, r0 + cmpls r0, r7 + bhi _037FCD0C + bic r3, r1, #2 + mov r0, r6 + mov r1, r4 + strb r3, [r2, #3] + bl SND_StopChannel +_037FCD0C: + add r0, r6, #1 + and r6, r0, #0xff + cmp r6, #0x10 + blo _037FCCC8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_037FCD24: .word SNDi_Work + arm_func_end SND_InvalidateWave + + arm_func_start SND_InitLfoParam +SND_InitLfoParam: ; 0x037FCD28 + mov r2, #0 + strb r2, [r0] + strb r2, [r0, #2] + mov r1, #1 + strb r1, [r0, #3] + mov r1, #0x10 + strb r1, [r0, #1] + strh r2, [r0, #4] + bx lr + arm_func_end SND_InitLfoParam + + arm_func_start SND_UpdateLfo +SND_UpdateLfo: ; 0x037FCD4C + ldrh r2, [r0, #6] + ldrh r1, [r0, #4] + cmp r2, r1 + addlo r1, r2, #1 + strloh r1, [r0, #6] + bxlo lr + ldrh r1, [r0, #8] + ldrb r2, [r0, #1] + add r1, r1, r2, lsl #6 + mov r3, r1, lsr #8 + b _037FCD7C +_037FCD78: + sub r3, r3, #0x80 +_037FCD7C: + cmp r3, #0x80 + bhs _037FCD78 + ldrh r1, [r0, #8] + add r1, r1, r2, lsl #6 + strh r1, [r0, #8] + ldrh r1, [r0, #8] + and r1, r1, #0xff + strh r1, [r0, #8] + ldrh r1, [r0, #8] + orr r1, r1, r3, lsl #8 + strh r1, [r0, #8] + bx lr + arm_func_end SND_UpdateLfo + + arm_func_start SND_GetLfoValue +SND_GetLfoValue: ; 0x037FCDAC + stmdb sp!, {r4, lr} + mov r4, r0 + ldrb r0, [r4, #2] + cmp r0, #0 + moveq r0, #0 + beq _037FCDF4 + ldrh r1, [r4, #6] + ldrh r0, [r4, #4] + cmp r1, r0 + movlo r0, #0 + blo _037FCDF4 + ldrh r0, [r4, #8] + mov r0, r0, lsr #8 + bl SND_SinIdx + ldrb r1, [r4, #2] + ldrb r2, [r4, #3] + mul r0, r1, r0 + mul r0, r2, r0 +_037FCDF4: + ldmia sp!, {r4, lr} + bx lr + arm_func_end SND_GetLfoValue + + arm_func_start CalcRelease +CalcRelease: ; 0x037FCDFC + stmdb sp!, {r3, lr} + cmp r0, #0x7f + ldreq r0, _037FCE4C ; =0x0000FFFF + beq _037FCE44 + cmp r0, #0x7e + moveq r0, #0x3c00 + beq _037FCE44 + cmp r0, #0x32 + movlt r0, r0, lsl #1 + addlt r0, r0, #1 + movlt r0, r0, lsl #0x10 + movlt r0, r0, lsr #0x10 + blt _037FCE44 + rsb r1, r0, #0x7e + mov r0, #0x1e00 + bl _s32_div_f + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 +_037FCE44: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FCE4C: .word 0x0000FFFF + arm_func_end CalcRelease + + arm_func_start StartExChannel +StartExChannel: ; 0x037FCE50 + ldr r3, _037FCE84 ; =0xFFFE9680 + mov r2, #0 + str r3, [r0, #0x10] + strb r2, [r0, #2] + str r1, [r0, #0x34] + strh r2, [r0, #0x30] + strh r2, [r0, #0x2e] + ldrb r1, [r0, #3] + orr r2, r1, #2 + bic r1, r2, #1 + orr r1, r1, #1 + strb r1, [r0, #3] + bx lr + .align 2, 0 +_037FCE84: .word 0xFFFE9680 + arm_func_end StartExChannel + + arm_func_start SND_SeqInit +SND_SeqInit: ; 0x037FCE88 + stmdb sp!, {r3, lr} + ldr r3, _037FCEE4 ; =SNDi_Work + 0x540 + mov lr, #0 + mov r0, #0x24 +_037FCE98: + mul r2, lr, r0 + ldrb r1, [r3, r2] + add ip, r3, r2 + bic r1, r1, #1 + strb r1, [r3, r2] + strb lr, [ip, #1] + add lr, lr, #1 + cmp lr, #0x10 + blt _037FCE98 + ldr r1, _037FCEE8 ; =SNDi_Work + 0x780 + mov r2, #0 +_037FCEC4: + ldrb r0, [r1, r2, lsl #6] + bic r0, r0, #1 + strb r0, [r1, r2, lsl #6] + add r2, r2, #1 + cmp r2, #0x20 + blt _037FCEC4 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FCEE4: .word SNDi_Work + 0x540 +_037FCEE8: .word SNDi_Work + 0x780 + arm_func_end SND_SeqInit + + arm_func_start SND_SeqMain +SND_SeqMain: ; 0x037FCEEC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r6, #0 + mov sb, r0 + mov r5, r6 +_037FCEFC: + mov r0, #0x24 + mul r0, r5, r0 + ldr r2, _037FD044 ; =SNDi_Work + 0x540 + ldrb r1, [r2, r0] + add r4, r2, r0 + mov r0, r1, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _037FD020 + mov r0, r1, lsl #0x1e + movs r0, r0, lsr #0x1f + beq _037FD00C + cmp sb, #0 + beq _037FCFD8 + mov r0, r1, lsl #0x1d + movs r0, r0, lsr #0x1f + bne _037FCFD8 + mov r8, #0 + b _037FCF54 +_037FCF44: + ldrh r0, [r4, #0x1c] + add r8, r8, #1 + sub r0, r0, #0xf0 + strh r0, [r4, #0x1c] +_037FCF54: + ldrh r0, [r4, #0x1c] + cmp r0, #0xf0 + bhs _037FCF44 + mov r7, #0 + mov sl, #1 + b _037FCF90 +_037FCF6C: + mov r0, r4 + mov r1, sl + bl PlayerSeqMain + cmp r0, #0 + beq _037FCF8C + mov r0, r4 + bl FinishPlayer + b _037FCF98 +_037FCF8C: + add r7, r7, #1 +_037FCF90: + cmp r7, r8 + blt _037FCF6C +_037FCF98: + ldr r0, _037FD048 ; =SNDi_SharedWork + ldr r2, [r0] + cmp r2, #0 + beq _037FCFC0 + ldrb r1, [r4, #1] + mov r0, #0x24 + mla r2, r1, r0, r2 + ldr r0, [r2, #0x40] + add r0, r0, r7 + str r0, [r2, #0x40] +_037FCFC0: + ldrh r2, [r4, #0x18] + ldrh r1, [r4, #0x1a] + ldrh r0, [r4, #0x1c] + mul r1, r2, r1 + add r0, r0, r1, asr #8 + strh r0, [r4, #0x1c] +_037FCFD8: + mov r8, #0 + mov r7, #1 +_037FCFE0: + mov r0, r4 + mov r1, r8 + bl GetPlayerTrack + cmp r0, #0 + beq _037FD000 + mov r1, r4 + mov r2, r7 + bl UpdateTrackChannel +_037FD000: + add r8, r8, #1 + cmp r8, #0x10 + blt _037FCFE0 +_037FD00C: + ldrb r0, [r4] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + movne r0, #1 + orrne r6, r6, r0, lsl r5 +_037FD020: + add r5, r5, #1 + cmp r5, #0x10 + blt _037FCEFC + ldr r0, _037FD048 ; =SNDi_SharedWork + ldr r0, [r0] + cmp r0, #0 + strne r6, [r0, #4] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_037FD044: .word SNDi_Work + 0x540 +_037FD048: .word SNDi_SharedWork + arm_func_end SND_SeqMain + + arm_func_start SND_PrepareSeq +SND_PrepareSeq: ; 0x037FD04C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r0, #0x24 + mul r5, sb, r0 + ldr r6, _037FD21C ; =SNDi_Work + 0x540 + mov r8, r1 + ldrb r0, [r6, r5] + mov r7, r2 + mov r0, r0, lsl #0x1f + mov r4, r3 + add r5, r6, r5 + movs r0, r0, lsr #0x1f + beq _037FD088 + mov r0, r5 + bl FinishPlayer +_037FD088: + ldrb r1, [r5] + mov r0, #0x78 + bic r1, r1, #4 + strb r1, [r5] + str r4, [r5, #0x20] + strh r0, [r5, #0x18] + mov r0, #0x100 + strh r0, [r5, #0x1a] + mov r0, #0xf0 + strh r0, [r5, #0x1c] + mov r0, #0x7f + strb r0, [r5, #5] + mov r2, #0 + strh r2, [r5, #6] + mov r0, #0x40 + strb r0, [r5, #4] + mov r1, #0xff +_037FD0CC: + add r0, r5, r2 + add r2, r2, #1 + strb r1, [r0, #8] + cmp r2, #0x10 + blt _037FD0CC + ldr r1, _037FD220 ; =SNDi_SharedWork + ldr r3, [r1] + cmp r3, #0 + beq _037FD12C + ldrb r2, [r5, #1] + mov r0, #0x24 + mla r0, r2, r0, r3 + mov r6, #0 + str r6, [r0, #0x40] + mvn r4, #0 + mov r0, #0x24 +_037FD10C: + ldr r2, [r1] + ldrb r3, [r5, #1] + mla r2, r3, r0, r2 + add r2, r2, r6, lsl #1 + add r6, r6, #1 + strh r4, [r2, #0x20] + cmp r6, #0x10 + blt _037FD10C +_037FD12C: + bl AllocTrack + movs r4, r0 + bmi _037FD214 + ldr r0, _037FD224 ; =SNDi_Work + 0x780 + add r6, r0, r4, lsl #6 + mov r0, r6 + bl InitTrack + str r8, [r6, #0x24] + add r0, r8, r7 + str r0, [r6, #0x28] + strb r4, [r5, #8] + ldr r0, [r6, #0x28] + bl InitCache + mov r0, r6 + bl ReadByte + cmp r0, #0xfe + ldrne r0, [r6, #0x28] + subne r0, r0, #1 + strne r0, [r6, #0x28] + bne _037FD1E0 + mov r0, r6 + bl ReadByte + mov r4, r0 + mov r0, r6 + bl ReadByte + orr r0, r4, r0, lsl #8 + mov r0, r0, lsl #0x10 + ldr r4, _037FD224 ; =SNDi_Work + 0x780 + mov r8, r0, lsr #0x11 + mov r7, #1 + b _037FD1D8 +_037FD1A8: + tst r8, #1 + beq _037FD1CC + bl AllocTrack + movs r6, r0 + bmi _037FD1E0 + add r0, r4, r6, lsl #6 + bl InitTrack + add r0, r5, r7 + strb r6, [r0, #8] +_037FD1CC: + mov r0, r8, lsl #0xf + add r7, r7, #1 + mov r8, r0, lsr #0x10 +_037FD1D8: + cmp r8, #0 + bne _037FD1A8 +_037FD1E0: + ldrb r1, [r5] + ldr r0, _037FD220 ; =SNDi_SharedWork + bic r1, r1, #1 + ldr r2, [r0] + orr r1, r1, #1 + and r0, r1, #0xff + bic r0, r0, #2 + strb r0, [r5] + cmp r2, #0 + ldrne r1, [r2, #4] + movne r0, #1 + orrne r0, r1, r0, lsl sb + strne r0, [r2, #4] +_037FD214: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_037FD21C: .word SNDi_Work + 0x540 +_037FD220: .word SNDi_SharedWork +_037FD224: .word SNDi_Work + 0x780 + arm_func_end SND_PrepareSeq + + arm_func_start ReadByte +ReadByte: ; 0x037FD228 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _037FD280 ; =sMmlPrintEnable + mov r5, r0 + ldr r4, [r5, #0x28] + ldr r0, [r1, #4] + cmp r4, r0 + blo _037FD250 + ldr r0, [r1, #8] + cmp r4, r0 + blo _037FD258 +_037FD250: + mov r0, r4 + bl InitCache +_037FD258: + ldr r0, _037FD280 ; =sMmlPrintEnable + ldr r1, [r5, #0x28] + ldr r2, [r0, #4] + ldr r0, _037FD284 ; =seqCache + 0x8 + sub r2, r4, r2 + ldrb r0, [r0, r2] + add r1, r1, #1 + str r1, [r5, #0x28] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_037FD280: .word sMmlPrintEnable +_037FD284: .word seqCache + 0x8 + arm_func_end ReadByte + + arm_func_start SND_StartPreparedSeq +SND_StartPreparedSeq: ; 0x037FD288 + mov r1, #0x24 + mul r1, r0, r1 + ldr r2, _037FD2A4 ; =SNDi_Work + 0x540 + ldrb r0, [r2, r1] + orr r0, r0, #2 + strb r0, [r2, r1] + bx lr + .align 2, 0 +_037FD2A4: .word SNDi_Work + 0x540 + arm_func_end SND_StartPreparedSeq + + arm_func_start SND_StartSeq +SND_StartSeq: ; 0x037FD2A8 + stmdb sp!, {r4, lr} + mov r4, r0 + bl SND_PrepareSeq + mov r0, #0x24 + mul r1, r4, r0 + ldr r2, _037FD2D4 ; =SNDi_Work + 0x540 + ldrb r0, [r2, r1] + orr r0, r0, #2 + strb r0, [r2, r1] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FD2D4: .word SNDi_Work + 0x540 + arm_func_end SND_StartSeq + + arm_func_start SND_StopSeq +SND_StopSeq: ; 0x037FD2D8 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x24 + mul r1, r4, r0 + ldr r2, _037FD32C ; =SNDi_Work + 0x540 + ldrb r0, [r2, r1] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _037FD324 + add r0, r2, r1 + bl FinishPlayer + ldr r0, _037FD330 ; =SNDi_SharedWork + ldr r2, [r0] + cmp r2, #0 + movne r0, #1 + ldrne r1, [r2, #4] + mvnne r0, r0, lsl r4 + andne r0, r1, r0 + strne r0, [r2, #4] +_037FD324: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FD32C: .word SNDi_Work + 0x540 +_037FD330: .word SNDi_SharedWork + arm_func_end SND_StopSeq + + arm_func_start SND_PauseSeq +SND_PauseSeq: ; 0x037FD334 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r2, #0x24 + mul r4, r0, r2 + ldr r5, _037FD3A8 ; =SNDi_Work + 0x540 + and r0, r1, #0xff + ldrb r2, [r5, r4] + mov r0, r0, lsl #0x1f + bic r2, r2, #4 + orr r0, r2, r0, lsr #29 + strb r0, [r5, r4] + cmp r1, #0 + beq _037FD3A0 + mov r8, #0 + mov r6, #0x7f +_037FD36C: + mov r1, r8 + add r0, r5, r4 + bl GetPlayerTrack + movs r7, r0 + beq _037FD394 + mov r2, r6 + add r1, r5, r4 + bl ReleaseTrackChannelAll + mov r0, r7 + bl FreeTrackChannelAll +_037FD394: + add r8, r8, #1 + cmp r8, #0x10 + blt _037FD36C +_037FD3A0: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FD3A8: .word SNDi_Work + 0x540 + arm_func_end SND_PauseSeq + + arm_func_start SND_SkipSeq +SND_SkipSeq: ; 0x037FD3AC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r3, _037FD470 ; =SNDi_Work + 0x540 + mov r2, #0x24 + mla r6, r0, r2, r3 + mov r8, r1 + mov r7, #0 + mov r4, #0x7f +_037FD3C8: + mov r0, r6 + mov r1, r7 + bl GetPlayerTrack + movs r5, r0 + beq _037FD3F0 + mov r1, r6 + mov r2, r4 + bl ReleaseTrackChannelAll + mov r0, r5 + bl FreeTrackChannelAll +_037FD3F0: + add r7, r7, #1 + cmp r7, #0x10 + blt _037FD3C8 + bl SND_StopIntervalTimer + mov r4, #0 + mov r5, r4 + b _037FD430 +_037FD40C: + mov r0, r6 + mov r1, r5 + bl PlayerSeqMain + cmp r0, #0 + beq _037FD42C + mov r0, r6 + bl FinishPlayer + b _037FD438 +_037FD42C: + add r4, r4, #1 +_037FD430: + cmp r4, r8 + blo _037FD40C +_037FD438: + bl SND_StartIntervalTimer + ldr r0, _037FD474 ; =SNDi_SharedWork + ldr r3, [r0] + cmp r3, #0 + beq _037FD468 + ldrb r1, [r6, #1] + mov r0, #0x24 + mul r2, r1, r0 + add r1, r3, #0x40 + ldr r0, [r1, r2] + add r0, r0, r4 + str r0, [r1, r2] +_037FD468: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FD470: .word SNDi_Work + 0x540 +_037FD474: .word SNDi_SharedWork + arm_func_end SND_SkipSeq + + arm_func_start SND_SetTrackMute +SND_SetTrackMute: ; 0x037FD478 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r3, #0x24 + mul r4, r0, r3 + ldr r5, _037FD4E0 ; =SNDi_Work + 0x540 + mov r8, r1 + mov r7, r2 + mov r6, #0 + b _037FD4C8 +_037FD498: + tst r8, #1 + beq _037FD4C0 + mov r1, r6 + add r0, r5, r4 + bl GetPlayerTrack + cmp r0, #0 + beq _037FD4C0 + mov r2, r7 + add r1, r5, r4 + bl SetTrackMute +_037FD4C0: + add r6, r6, #1 + mov r8, r8, lsr #1 +_037FD4C8: + cmp r6, #0x10 + bge _037FD4D8 + cmp r8, #0 + bne _037FD498 +_037FD4D8: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FD4E0: .word SNDi_Work + 0x540 + arm_func_end SND_SetTrackMute + + arm_func_start SND_SetTrackAllocatableChannel +SND_SetTrackAllocatableChannel: ; 0x037FD4E4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r3, #0x24 + mul r4, r0, r3 + mov r0, r2, lsl #0x10 + ldr r5, _037FD550 ; =SNDi_Work + 0x540 + mov r7, r1 + mov r6, #0 + mov r8, r0, lsr #0x10 + b _037FD538 +_037FD508: + tst r7, #1 + beq _037FD530 + mov r1, r6 + add r0, r5, r4 + bl GetPlayerTrack + cmp r0, #0 + strneh r8, [r0, #0x1e] + ldrneb r1, [r0] + orrne r1, r1, #0x80 + strneb r1, [r0] +_037FD530: + add r6, r6, #1 + mov r7, r7, lsr #1 +_037FD538: + cmp r6, #0x10 + bge _037FD548 + cmp r7, #0 + bne _037FD508 +_037FD548: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FD550: .word SNDi_Work + 0x540 + arm_func_end SND_SetTrackAllocatableChannel + + arm_func_start SND_InvalidateSeq +SND_InvalidateSeq: ; 0x037FD554 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r6, _037FD5DC ; =SNDi_Work + 0x540 + mov r7, #0 + mov sl, r0 + mov sb, r1 + mov fp, r7 + mov r4, #0x24 +_037FD570: + mul r5, r7, r4 + ldrb r0, [r6, r5] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _037FD5C8 + mov r8, fp + b _037FD5C0 +_037FD58C: + mov r1, r8 + add r0, r6, r5 + bl GetPlayerTrack + cmp r0, #0 + beq _037FD5BC + ldr r0, [r0, #0x28] + cmp sl, r0 + cmpls r0, sb + bhi _037FD5BC + add r0, r6, r5 + bl FinishPlayer + b _037FD5C8 +_037FD5BC: + add r8, r8, #1 +_037FD5C0: + cmp r8, #0x10 + blt _037FD58C +_037FD5C8: + add r7, r7, #1 + cmp r7, #0x10 + blt _037FD570 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FD5DC: .word SNDi_Work + 0x540 + arm_func_end SND_InvalidateSeq + + arm_func_start SND_InvalidateBank +SND_InvalidateBank: ; 0x037FD5E0 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _037FD638 ; =SNDi_Work + 0x540 + mov r7, r0 + mov r6, r1 + mov r5, #0 + mov r8, #0x24 +_037FD5F8: + mul r0, r5, r8 + ldrb r1, [r4, r0] + add r0, r4, r0 + mov r1, r1, lsl #0x1f + movs r1, r1, lsr #0x1f + beq _037FD624 + ldr r1, [r0, #0x20] + cmp r7, r1 + cmpls r1, r6 + bhi _037FD624 + bl FinishPlayer +_037FD624: + add r5, r5, #1 + cmp r5, #0x10 + blt _037FD5F8 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FD638: .word SNDi_Work + 0x540 + arm_func_end SND_InvalidateBank + + arm_func_start SNDi_SetPlayerParam +SNDi_SetPlayerParam: ; 0x037FD63C + stmdb sp!, {r3, lr} + ldr lr, _037FD67C ; =SNDi_Work + 0x540 + mov ip, #0x24 + mla ip, r0, ip, lr + cmp r3, #1 + beq _037FD668 + cmp r3, #2 + beq _037FD670 + cmp r3, #4 + streq r2, [ip, r1] + b _037FD674 +_037FD668: + strb r2, [ip, r1] + b _037FD674 +_037FD670: + strh r2, [ip, r1] +_037FD674: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FD67C: .word SNDi_Work + 0x540 + arm_func_end SNDi_SetPlayerParam + + arm_func_start SNDi_SetTrackParam +SNDi_SetTrackParam: ; 0x037FD680 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, #0x24 + mul r5, r0, r4 + mov r8, r3 + mov r0, r8, lsl #0x10 + ldr r7, [sp, #0x28] + mov sl, r1 + mov sb, r2 + mov r6, #0 + mov fp, r0, lsr #0x10 + and r4, r8, #0xff + b _037FD700 +_037FD6B0: + tst sl, #1 + beq _037FD6F8 + ldr r0, _037FD718 ; =SNDi_Work + 0x540 + mov r1, r6 + add r0, r0, r5 + bl GetPlayerTrack + cmp r0, #0 + beq _037FD6F8 + cmp r7, #1 + beq _037FD6EC + cmp r7, #2 + beq _037FD6F4 + cmp r7, #4 + streq r8, [r0, sb] + b _037FD6F8 +_037FD6EC: + strb r4, [r0, sb] + b _037FD6F8 +_037FD6F4: + strh fp, [r0, sb] +_037FD6F8: + add r6, r6, #1 + mov sl, sl, lsr #1 +_037FD700: + cmp r6, #0x10 + bge _037FD710 + cmp sl, #0 + bne _037FD6B0 +_037FD710: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FD718: .word SNDi_Work + 0x540 + arm_func_end SNDi_SetTrackParam + + arm_func_start InitCache +InitCache: ; 0x037FD71C + ldr r1, _037FD754 ; =sMmlPrintEnable + bic r2, r0, #3 + str r2, [r1, #4] + add r0, r2, #0x10 + str r0, [r1, #8] + ldr r0, [r2] + str r0, [r1, #0xc] + ldr r0, [r2, #4] + str r0, [r1, #0x10] + ldr r0, [r2, #8] + str r0, [r1, #0x14] + ldr r0, [r2, #0xc] + str r0, [r1, #0x18] + bx lr + .align 2, 0 +_037FD754: .word sMmlPrintEnable + arm_func_end InitCache + + arm_func_start Read24 +Read24: ; 0x037FD758 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl ReadByte + mov r4, r0 + mov r0, r5 + bl ReadByte + orr r4, r4, r0, lsl #8 + mov r0, r5 + bl ReadByte + orr r0, r4, r0, lsl #16 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end Read24 + + arm_func_start ReadArg +ReadArg: ; 0x037FD788 + stmdb sp!, {r4, r5, r6, lr} + mov r4, r0 + mov r6, r1 + cmp r2, #4 + addls pc, pc, r2, lsl #2 + b _037FD87C +_037FD7A0: ; jump table + b _037FD7B4 ; case 0 + b _037FD7C0 ; case 1 + b _037FD7E0 ; case 2 + b _037FD81C ; case 3 + b _037FD800 ; case 4 +_037FD7B4: + bl ReadByte + mov r5, r0 + b _037FD87C +_037FD7C0: + bl ReadByte + mov r5, r0 + mov r0, r4 + bl ReadByte + orr r0, r5, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r5, r0, lsr #0x10 + b _037FD87C +_037FD7E0: + mov r5, #0 +_037FD7E4: + mov r0, r4 + bl ReadByte + and r1, r0, #0x7f + tst r0, #0x80 + orr r5, r1, r5, lsl #7 + bne _037FD7E4 + b _037FD87C +_037FD800: + bl ReadByte + mov r1, r0 + mov r0, r6 + bl GetVariablePtr + cmp r0, #0 + ldrnesh r5, [r0] + b _037FD87C +_037FD81C: + bl ReadByte + mov r5, r0 + mov r0, r4 + bl ReadByte + orr r0, r5, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, r4 + mov r5, r1, lsl #0x10 + bl ReadByte + mov r6, r0 + mov r0, r4 + bl ReadByte + orr r0, r6, r0, lsl #8 + mov r0, r0, lsl #0x10 + mov r4, r0, lsr #0x10 + bl SND_CalcRandom + mov r1, r4, lsl #0x10 + mov r1, r1, asr #0x10 + sub r1, r1, r5, asr #16 + add r1, r1, #1 + mul r1, r0, r1 + mov r0, r1, asr #0x10 + add r5, r0, r5, asr #16 +_037FD87C: + mov r0, r5 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end ReadArg + + arm_func_start InitTrack +InitTrack: ; 0x037FD888 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + str r0, [r4, #0x24] + str r0, [r4, #0x28] + ldrb r1, [r4] + mov r2, #0xff + orr r1, r1, #2 + bic ip, r1, #4 + strb r1, [r4] + and r1, ip, #0xff + bic r3, r1, #8 + strb ip, [r4] + and r1, r3, #0xff + bic ip, r1, #0x10 + strb r3, [r4] + and r1, ip, #0xff + bic r3, r1, #0x20 + and r1, r3, #0xff + orr r1, r1, #0x40 + strb ip, [r4] + bic r1, r1, #0x80 + strb r1, [r4] + strb r0, [r4, #0x3b] + strh r0, [r4, #2] + mov r1, #0x40 + strb r1, [r4, #0x12] + mov r1, #0x7f + strb r1, [r4, #4] + strb r1, [r4, #5] + strh r0, [r4, #0xa] + strb r0, [r4, #8] + strb r0, [r4, #9] + strb r0, [r4, #6] + strh r0, [r4, #0xc] + strb r2, [r4, #0xe] + strb r2, [r4, #0xf] + strb r2, [r4, #0x10] + strb r2, [r4, #0x11] + strb r1, [r4, #1] + mov r1, #2 + strb r1, [r4, #7] + mov r1, #0x3c + strb r1, [r4, #0x14] + strb r0, [r4, #0x15] + strh r0, [r4, #0x16] + strb r0, [r4, #0x13] + add r0, r2, #0xff00 + strh r0, [r4, #0x1e] + add r0, r4, #0x18 + bl SND_InitLfoParam + mov r0, #0 + str r0, [r4, #0x20] + str r0, [r4, #0x3c] + ldmia sp!, {r4, lr} + bx lr + arm_func_end InitTrack + + arm_func_start StartTrack +StartTrack: ; 0x037FD968 + str r1, [r0, #0x24] + add r1, r1, r2 + str r1, [r0, #0x28] + bx lr + arm_func_end StartTrack + + arm_func_start ReleaseTrackChannelAll +ReleaseTrackChannelAll: ; 0x037FD978 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r2 + mov r4, r0 + mov r2, #0 + bl UpdateTrackChannel + ldr r5, [r4, #0x3c] + and r6, r7, #0xff + mov r4, #1 + b _037FD9D0 +_037FD99C: + mov r0, r5 + bl SND_IsExChannelActive + cmp r0, #0 + beq _037FD9CC + cmp r7, #0 + blt _037FD9C0 + mov r0, r5 + mov r1, r6 + bl SND_SetExChannelRelease +_037FD9C0: + mov r0, r5 + strb r4, [r5, #0x22] + bl SND_ReleaseExChannel +_037FD9CC: + ldr r5, [r5, #0x50] +_037FD9D0: + cmp r5, #0 + bne _037FD99C + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end ReleaseTrackChannelAll + + arm_func_start FreeTrackChannelAll +FreeTrackChannelAll: ; 0x037FD9E0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r4, [r5, #0x3c] + b _037FD9FC +_037FD9F0: + mov r0, r4 + bl SND_FreeExChannel + ldr r4, [r4, #0x50] +_037FD9FC: + cmp r4, #0 + bne _037FD9F0 + mov r0, #0 + str r0, [r5, #0x3c] + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end FreeTrackChannelAll + + arm_func_start GetPlayerTrack +GetPlayerTrack: ; 0x037FDA14 + cmp r1, #0xf + movgt r0, #0 + bxgt lr + add r0, r0, r1 + ldrb r1, [r0, #8] + cmp r1, #0xff + moveq r0, #0 + ldrne r0, _037FDA3C ; =SNDi_Work + 0x780 + addne r0, r0, r1, lsl #6 + bx lr + .align 2, 0 +_037FDA3C: .word SNDi_Work + 0x780 + arm_func_end GetPlayerTrack + + arm_func_start ClosePlayerTrack +ClosePlayerTrack: ; 0x037FDA40 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r4, r1 + bl GetPlayerTrack + movs r5, r0 + beq _037FDA8C + mov r1, r6 + mvn r2, #0 + bl ReleaseTrackChannelAll + mov r0, r5 + bl FreeTrackChannelAll + add ip, r6, #8 + ldrb r2, [ip, r4] + ldr r3, _037FDA94 ; =SNDi_Work + 0x780 + mov r0, #0xff + ldrb r1, [r3, r2, lsl #6] + bic r1, r1, #1 + strb r1, [r3, r2, lsl #6] + strb r0, [ip, r4] +_037FDA8C: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_037FDA94: .word SNDi_Work + 0x780 + arm_func_end ClosePlayerTrack + + arm_func_start FinishPlayer +FinishPlayer: ; 0x037FDA98 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, #0 +_037FDAA4: + mov r0, r5 + mov r1, r4 + bl ClosePlayerTrack + add r4, r4, #1 + cmp r4, #0x10 + blt _037FDAA4 + ldrb r0, [r5] + bic r0, r0, #1 + strb r0, [r5] + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end FinishPlayer + + arm_func_start ChannelCallback +ChannelCallback: ; 0x037FDAD0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r2 + cmp r1, #1 + bne _037FDAF0 + mov r1, #0 + strb r1, [r5, #0x22] + bl SND_FreeExChannel +_037FDAF0: + ldr r1, [r4, #0x3c] + cmp r1, r5 + ldreq r0, [r5, #0x50] + streq r0, [r4, #0x3c] + beq _037FDB28 + b _037FDB1C +_037FDB08: + cmp r0, r5 + ldreq r0, [r5, #0x50] + streq r0, [r1, #0x50] + beq _037FDB28 + mov r1, r0 +_037FDB1C: + ldr r0, [r1, #0x50] + cmp r0, #0 + bne _037FDB08 +_037FDB28: + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end ChannelCallback + + arm_func_start UpdateTrackChannel +UpdateTrackChannel: ; 0x037FDB30 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + ldrb r0, [sl, #7] + ldrb r6, [sl, #4] + ldrb r3, [sl, #5] + ldrb fp, [r1, #5] + mov r5, r0, lsl #6 + mov r8, r3, lsl #1 + ldrb r4, [sl, #1] + ldrsb r7, [sl, #6] + mov sb, r6, lsl #1 + ldr r0, _037FDC84 ; =SNDi_DecibelTable + mul r6, r7, r5 + mov r3, fp, lsl #1 + ldrsh sb, [r0, sb] + ldrsh r7, [r0, r8] + ldrsh r0, [r0, r3] + add r8, sb, r7 + ldrsb r3, [sl, #8] + cmp r4, #0x7f + mulne r4, r3, r4 + addne r3, r4, #0x40 + mov r4, #0x8000 + ldrsh r5, [sl, #0xc] + mov sb, r2 + add r2, r5, r6, asr #7 + ldrsh r7, [sl, #0xa] + ldrsh r1, [r1, #6] + ldrsb r5, [sl, #9] + movne r3, r3, asr #7 + add r0, r0, r8 + rsb r4, r4, #0 + cmp r0, r4 + movlt r0, r4 + mov r4, #0x8000 + add r1, r7, r1 + rsb r4, r4, #0 + cmp r1, r4 + movlt r1, r4 + add r3, r3, r5 + mvn r4, #0x7f + cmp r3, r4 + movlt r3, r4 + blt _037FDBE8 + cmp r3, #0x7f + movgt r3, #0x7f +_037FDBE8: + mov r0, r0, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r3, r3, lsl #0x18 + mov r1, r1, lsl #0x10 + ldr r8, [sl, #0x3c] + mov r6, r0, asr #0x10 + mov r5, r2, asr #0x10 + mov r4, r3, asr #0x18 + mov r7, r1, asr #0x10 + mov fp, #1 + b _037FDC74 +_037FDC14: + strh r7, [r8, #6] + ldrb r0, [r8, #2] + cmp r0, #3 + beq _037FDC70 + strh r6, [r8, #0xc] + strh r5, [r8, #0xe] + strb r4, [r8, #0xb] + ldrb r0, [sl, #1] + strb r0, [r8, #4] + ldrh r0, [sl, #0x18] + strh r0, [r8, #0x28] + ldrh r0, [sl, #0x1a] + strh r0, [r8, #0x2a] + ldrh r0, [sl, #0x1c] + strh r0, [r8, #0x2c] + ldr r0, [r8, #0x34] + cmp r0, #0 + bne _037FDC70 + cmp sb, #0 + beq _037FDC70 + mov r0, r8 + strb fp, [r8, #0x22] + bl SND_ReleaseExChannel +_037FDC70: + ldr r8, [r8, #0x50] +_037FDC74: + cmp r8, #0 + bne _037FDC14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FDC84: .word SNDi_DecibelTable + arm_func_end UpdateTrackChannel + + arm_func_start PlayerSeqMain +PlayerSeqMain: ; 0x037FDC88 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x24 + mov r2, #0 + str r2, [sp, #0x10] + str r1, [sp, #8] + mov r7, r0 + mov sl, r2 +_037FDCA4: + mov r0, r7 + mov r1, sl + bl GetPlayerTrack + movs r8, r0 + ldrne r0, [r8, #0x28] + cmpne r0, #0 + beq _037FE7A4 + ldr r0, [r8, #0x3c] + b _037FDD00 +_037FDCC8: + ldr r1, [r0, #0x34] + cmp r1, #0 + subgt r1, r1, #1 + strgt r1, [r0, #0x34] + ldrb r1, [r0, #3] + mov r1, r1, lsl #0x1d + movs r1, r1, lsr #0x1f + bne _037FDCFC + ldr r2, [r0, #0x14] + ldr r1, [r0, #0x18] + cmp r2, r1 + addlt r1, r2, #1 + strlt r1, [r0, #0x14] +_037FDCFC: + ldr r0, [r0, #0x50] +_037FDD00: + cmp r0, #0 + bne _037FDCC8 + ldrb r1, [r8] + mov r0, r1, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _037FDD30 + ldr r0, [r8, #0x3c] + cmp r0, #0 + movne r0, #0 + bne _037FE788 + bic r0, r1, #0x10 + strb r0, [r8] +_037FDD30: + ldr r0, [r8, #0x20] + cmp r0, #0 + subgt r0, r0, #1 + strgt r0, [r8, #0x20] + cmpgt r0, #0 + movgt r0, #0 + bgt _037FE788 + ldr r0, [r8, #0x28] + bl InitCache + ldr r0, _037FE7CC ; =0x0000FFFF + sub fp, r0, #0x10000 + b _037FE768 +_037FDD60: + mov r0, r8 + mov sb, #0 + mov r4, #1 + bl ReadByte + mov r6, r0 + cmp r6, #0xa2 + bne _037FDD94 + mov r0, r8 + bl ReadByte + mov r6, r0 + ldrb r0, [r8] + mov r0, r0, lsl #0x19 + mov r4, r0, lsr #0x1f +_037FDD94: + cmp r6, #0xa0 + bne _037FDDB0 + mov r0, r8 + bl ReadByte + mov r6, r0 + mov r5, #3 + mov sb, #1 +_037FDDB0: + cmp r6, #0xa1 + bne _037FDDCC + mov r0, r8 + bl ReadByte + mov r6, r0 + mov r5, #4 + mov sb, #1 +_037FDDCC: + tst r6, #0x80 + bne _037FE050 + mov r0, r8 + bl ReadByte + cmp sb, #0 + str r0, [sp, #0xc] + movne r2, r5 + moveq r2, #2 + mov r0, r8 + mov r1, r7 + bl ReadArg + cmp r4, #0 + mov r4, r0 + ldrsb r0, [r8, #0x13] + add sb, r6, r0 + beq _037FE768 + cmp sb, #0 + movlt sb, #0 + blt _037FDE20 + cmp sb, #0x7f + movgt sb, #0x7f +_037FDE20: + ldrb r1, [r8] + mov r0, r1, lsl #0x1d + movs r0, r0, lsr #0x1f + bne _037FE024 + ldr r0, [sp, #8] + cmp r0, #0 + beq _037FE024 + mov r0, r1, lsl #0x1c + mov r6, #0 + movs r0, r0, lsr #0x1f + ldrne r6, [r8, #0x3c] + cmpne r6, #0 + strneb sb, [r6, #8] + ldrne r0, [sp, #0xc] + strneb r0, [r6, #9] + cmp r6, #0 + bne _037FDF54 + ldr r0, [r7, #0x20] + ldrh r1, [r8, #2] + mov r2, sb + add r3, sp, #0x16 + bl SND_ReadInstData + cmp r0, #0 + beq _037FE024 + ldrb r0, [sp, #0x16] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _037FE024 +_037FDE90: ; jump table + b _037FE024 ; case 0 + b _037FDEA4 ; case 1 + b _037FDEAC ; case 2 + b _037FDEB4 ; case 3 + b _037FDEA4 ; case 4 +_037FDEA4: + ldr r1, _037FE7CC ; =0x0000FFFF + b _037FDEB8 +_037FDEAC: + mov r1, #0x3f00 + b _037FDEB8 +_037FDEB4: + mov r1, #0xc000 +_037FDEB8: + ldrh r0, [r8, #0x1e] + ldr r3, _037FE7D0 ; =ChannelCallback + str r8, [sp] + ldrb r2, [r8] + and r0, r1, r0 + mov r2, r2, lsl #0x18 + ldrb r6, [r7, #4] + ldrb r1, [r8, #0x12] + mov r2, r2, lsr #0x1f + add r1, r6, r1 + bl SND_AllocExChannel + movs r6, r0 + beq _037FE024 + ldrb r0, [r8] + mov r0, r0, lsl #0x1c + movs r0, r0, lsr #0x1f + movne r3, fp + bne _037FDF0C + cmp r4, #0 + movgt r3, r4 + movle r3, fp +_037FDF0C: + ldr r2, [sp, #0xc] + ldr r1, [r7, #0x20] + mov r0, r6 + str r1, [sp] + add r1, sp, #0x16 + str r1, [sp, #4] + mov r1, sb + bl SND_NoteOn + cmp r0, #0 + bne _037FDF48 + mov r0, #0 + strb r0, [r6, #0x22] + mov r0, r6 + bl SND_FreeExChannel + b _037FE024 +_037FDF48: + ldr r0, [r8, #0x3c] + str r0, [r6, #0x50] + str r6, [r8, #0x3c] +_037FDF54: + ldrb r1, [r8, #0xe] + cmp r1, #0xff + beq _037FDF68 + mov r0, r6 + bl SND_SetExChannelAttack +_037FDF68: + ldrb r1, [r8, #0xf] + cmp r1, #0xff + beq _037FDF7C + mov r0, r6 + bl SND_SetExChannelDecay +_037FDF7C: + ldrb r1, [r8, #0x10] + cmp r1, #0xff + beq _037FDF90 + mov r0, r6 + bl SND_SetExChannelSustain +_037FDF90: + ldrb r1, [r8, #0x11] + cmp r1, #0xff + beq _037FDFA4 + mov r0, r6 + bl SND_SetExChannelRelease +_037FDFA4: + ldrsh r0, [r8, #0x16] + strh r0, [r6, #0x32] + ldrb r0, [r8] + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + beq _037FDFD4 + ldrsh r1, [r6, #0x32] + ldrb r0, [r8, #0x14] + sub r0, r0, sb + mov r0, r0, lsl #0x16 + add r0, r1, r0, asr #16 + strh r0, [r6, #0x32] +_037FDFD4: + ldrb r0, [r8, #0x15] + cmp r0, #0 + bne _037FE000 + cmp r4, #0 + movgt r0, r4 + movle r0, fp + str r0, [r6, #0x18] + ldrb r0, [r6, #3] + bic r0, r0, #4 + strb r0, [r6, #3] + b _037FE01C +_037FE000: + mul r1, r0, r0 + ldrsh r0, [r6, #0x32] + cmp r0, #0 + rsblt r0, r0, #0 + mul r0, r1, r0 + mov r0, r0, asr #0xb + str r0, [r6, #0x18] +_037FE01C: + mov r0, #0 + str r0, [r6, #0x14] +_037FE024: + strb sb, [r8, #0x14] + ldrb r0, [r8] + mov r0, r0, lsl #0x1e + movs r0, r0, lsr #0x1f + beq _037FE768 + str r4, [r8, #0x20] + cmp r4, #0 + ldreqb r0, [r8] + orreq r0, r0, #0x10 + streqb r0, [r8] + b _037FE768 +_037FE050: + and r0, r6, #0xf0 + cmp r0, #0xc0 + bgt _037FE084 + bge _037FE1CC + cmp r0, #0x90 + bgt _037FE078 + bge _037FE0F0 + cmp r0, #0x80 + beq _037FE0A8 + b _037FE768 +_037FE078: + cmp r0, #0xb0 + beq _037FE47C + b _037FE768 +_037FE084: + cmp r0, #0xe0 + bgt _037FE09C + bge _037FE428 + cmp r0, #0xd0 + beq _037FE1CC + b _037FE768 +_037FE09C: + cmp r0, #0xf0 + beq _037FE6C4 + b _037FE768 +_037FE0A8: + cmp sb, #0 + movne r2, r5 + moveq r2, #2 + mov r0, r8 + mov r1, r7 + bl ReadArg + cmp r4, #0 + beq _037FE768 + cmp r6, #0x80 + beq _037FE0DC + cmp r6, #0x81 + beq _037FE0E4 + b _037FE768 +_037FE0DC: + str r0, [r8, #0x20] + b _037FE768 +_037FE0E4: + cmp r0, #0x10000 + strlth r0, [r8, #2] + b _037FE768 +_037FE0F0: + cmp r6, #0x93 + beq _037FE10C + cmp r6, #0x94 + beq _037FE16C + cmp r6, #0x95 + beq _037FE188 + b _037FE768 +_037FE10C: + mov r0, r8 + bl ReadByte + mov r6, r0 + mov r0, r8 + bl Read24 + cmp r4, #0 + mov sb, r0 + beq _037FE768 + mov r1, r6 + mov r0, r7 + bl GetPlayerTrack + movs r4, r0 + cmpne r4, r8 + beq _037FE768 + mov r1, r7 + mov r2, fp + bl ReleaseTrackChannelAll + mov r0, r4 + bl FreeTrackChannelAll + mov r0, r4 + mov r2, sb + ldr r1, [r8, #0x24] + bl StartTrack + b _037FE768 +_037FE16C: + mov r0, r8 + bl Read24 + cmp r4, #0 + ldrne r1, [r8, #0x24] + addne r0, r1, r0 + strne r0, [r8, #0x28] + b _037FE768 +_037FE188: + mov r0, r8 + bl Read24 + cmp r4, #0 + beq _037FE768 + ldrb r1, [r8, #0x3b] + cmp r1, #3 + bhs _037FE768 + add r1, r8, r1, lsl #2 + ldr r2, [r8, #0x28] + str r2, [r1, #0x2c] + ldrb r1, [r8, #0x3b] + add r1, r1, #1 + strb r1, [r8, #0x3b] + ldr r1, [r8, #0x24] + add r0, r1, r0 + str r0, [r8, #0x28] + b _037FE768 +_037FE1CC: + cmp sb, #0 + movne r2, r5 + moveq r2, #0 + mov r0, r8 + mov r1, r7 + bl ReadArg + cmp r4, #0 + strb r0, [sp, #0x14] + beq _037FE768 + sub r1, r6, #0xc0 + cmp r1, #0x17 + addls pc, pc, r1, lsl #2 + b _037FE768 +_037FE200: ; jump table + b _037FE3F8 ; case 0 + b _037FE260 ; case 1 + b _037FE278 ; case 2 + b _037FE3E0 ; case 3 + b _037FE3EC ; case 4 + b _037FE284 ; case 5 + b _037FE290 ; case 6 + b _037FE29C ; case 7 + b _037FE35C ; case 8 + b _037FE3A4 ; case 9 + b _037FE2C4 ; case 10 + b _037FE2D0 ; case 11 + b _037FE2DC ; case 12 + b _037FE2E8 ; case 13 + b _037FE3C4 ; case 14 + b _037FE2B8 ; case 15 + b _037FE2F4 ; case 16 + b _037FE300 ; case 17 + b _037FE30C ; case 18 + b _037FE318 ; case 19 + b _037FE324 ; case 20 + b _037FE26C ; case 21 + b _037FE408 ; case 22 + b _037FE390 ; case 23 +_037FE260: + and r0, r0, #0xff + strb r0, [r8, #4] + b _037FE768 +_037FE26C: + and r0, r0, #0xff + strb r0, [r8, #5] + b _037FE768 +_037FE278: + and r0, r0, #0xff + strb r0, [r7, #5] + b _037FE768 +_037FE284: + and r0, r0, #0xff + strb r0, [r8, #7] + b _037FE768 +_037FE290: + and r0, r0, #0xff + strb r0, [r8, #0x12] + b _037FE768 +_037FE29C: + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + ldrb r1, [r8] + bic r1, r1, #2 + orr r0, r1, r0, lsr #30 + strb r0, [r8] + b _037FE768 +_037FE2B8: + and r0, r0, #0xff + strb r0, [r8, #0x15] + b _037FE768 +_037FE2C4: + and r0, r0, #0xff + strb r0, [r8, #0x1a] + b _037FE768 +_037FE2D0: + and r0, r0, #0xff + strb r0, [r8, #0x19] + b _037FE768 +_037FE2DC: + and r0, r0, #0xff + strb r0, [r8, #0x18] + b _037FE768 +_037FE2E8: + and r0, r0, #0xff + strb r0, [r8, #0x1b] + b _037FE768 +_037FE2F4: + and r0, r0, #0xff + strb r0, [r8, #0xe] + b _037FE768 +_037FE300: + and r0, r0, #0xff + strb r0, [r8, #0xf] + b _037FE768 +_037FE30C: + and r0, r0, #0xff + strb r0, [r8, #0x10] + b _037FE768 +_037FE318: + and r0, r0, #0xff + strb r0, [r8, #0x11] + b _037FE768 +_037FE324: + ldrb r1, [r8, #0x3b] + cmp r1, #3 + bhs _037FE768 + add r2, r8, r1, lsl #2 + and r1, r0, #0xff + ldr r0, [r8, #0x28] + str r0, [r2, #0x2c] + ldrb r0, [r8, #0x3b] + add r0, r8, r0 + strb r1, [r0, #0x38] + ldrb r0, [r8, #0x3b] + add r0, r0, #1 + strb r0, [r8, #0x3b] + b _037FE768 +_037FE35C: + and r0, r0, #0xff + mov r1, r0, lsl #0x1f + ldrb r2, [r8] + mov r0, r8 + bic r2, r2, #8 + orr r1, r2, r1, lsr #28 + strb r1, [r8] + mov r1, r7 + mov r2, fp + bl ReleaseTrackChannelAll + mov r0, r8 + bl FreeTrackChannelAll + b _037FE768 +_037FE390: + and r2, r0, #0xff + mov r0, r8 + mov r1, r7 + bl SetTrackMute + b _037FE768 +_037FE3A4: + and r1, r0, #0xff + ldrsb r0, [r8, #0x13] + add r0, r1, r0 + strb r0, [r8, #0x14] + ldrb r0, [r8] + orr r0, r0, #0x20 + strb r0, [r8] + b _037FE768 +_037FE3C4: + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + ldrb r1, [r8] + bic r1, r1, #0x20 + orr r0, r1, r0, lsr #26 + strb r0, [r8] + b _037FE768 +_037FE3E0: + ldrsb r0, [sp, #0x14] + strb r0, [r8, #0x13] + b _037FE768 +_037FE3EC: + ldrsb r0, [sp, #0x14] + strb r0, [r8, #6] + b _037FE768 +_037FE3F8: + and r0, r0, #0xff + sub r0, r0, #0x40 + strb r0, [r8, #8] + b _037FE768 +_037FE408: + ldr r1, _037FE7D4 ; =sMmlPrintEnable + ldr r1, [r1] + cmp r1, #0 + beq _037FE768 + and r1, r0, #0xff + mov r0, r7 + bl GetVariablePtr + b _037FE768 +_037FE428: + cmp sb, #0 + movne r2, r5 + moveq r2, #1 + mov r0, r8 + mov r1, r7 + bl ReadArg + mov r0, r0, lsl #0x10 + cmp r4, #0 + mov r0, r0, asr #0x10 + beq _037FE768 + cmp r6, #0xe0 + beq _037FE474 + cmp r6, #0xe1 + beq _037FE46C + cmp r6, #0xe3 + streqh r0, [r8, #0x16] + b _037FE768 +_037FE46C: + strh r0, [r7, #0x18] + b _037FE768 +_037FE474: + strh r0, [r8, #0x1c] + b _037FE768 +_037FE47C: + mov r0, r8 + bl ReadByte + cmp sb, #0 + movne r2, r5 + mov sb, r0 + moveq r2, #1 + mov r0, r8 + mov r1, r7 + bl ReadArg + mov r0, r0, lsl #0x10 + mov r1, sb + mov sb, r0, asr #0x10 + mov r0, r7 + bl GetVariablePtr + cmp r4, #0 + mov r4, r0 + cmpne r4, #0 + beq _037FE768 + sub r0, r6, #0xb0 + cmp r0, #0xd + addls pc, pc, r0, lsl #2 + b _037FE768 +_037FE4D4: ; jump table + b _037FE50C ; case 0 + b _037FE514 ; case 1 + b _037FE524 ; case 2 + b _037FE534 ; case 3 + b _037FE544 ; case 4 + b _037FE560 ; case 5 + b _037FE584 ; case 6 + b _037FE768 ; case 7 + b _037FE5BC ; case 8 + b _037FE5E8 ; case 9 + b _037FE614 ; case 10 + b _037FE640 ; case 11 + b _037FE66C ; case 12 + b _037FE698 ; case 13 +_037FE50C: + strh sb, [r4] + b _037FE768 +_037FE514: + ldrsh r0, [r4] + add r0, r0, sb + strh r0, [r4] + b _037FE768 +_037FE524: + ldrsh r0, [r4] + sub r0, r0, sb + strh r0, [r4] + b _037FE768 +_037FE534: + ldrsh r0, [r4] + mul r1, r0, sb + strh r1, [r4] + b _037FE768 +_037FE544: + cmp sb, #0 + beq _037FE768 + mov r1, sb + ldrsh r0, [r4] + bl _s32_div_f + strh r0, [r4] + b _037FE768 +_037FE560: + cmp sb, #0 + ldrgesh r0, [r4] + movge r0, r0, lsl sb + strgeh r0, [r4] + ldrltsh r1, [r4] + rsblt r0, sb, #0 + movlt r0, r1, asr r0 + strlth r0, [r4] + b _037FE768 +_037FE584: + cmp sb, #0 + rsblt r0, sb, #0 + movlt r0, r0, lsl #0x10 + mov r6, #0 + movlt sb, r0, asr #0x10 + movlt r6, #1 + bl SND_CalcRandom + add r1, sb, #1 + mul r1, r0, r1 + mov r0, r1, asr #0x10 + cmp r6, #0 + rsbne r0, r0, #0 + strh r0, [r4] + b _037FE768 +_037FE5BC: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE5E8: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + movge r0, #1 + movlt r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE614: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + movgt r0, #1 + movle r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE640: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + movle r0, #1 + movgt r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE66C: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + movlt r0, #1 + movge r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE698: + ldrsh r0, [r4] + ldrb r1, [r8] + cmp r0, sb + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + mov r0, r0, lsl #0x1f + bic r1, r1, #0x40 + orr r0, r1, r0, lsr #25 + strb r0, [r8] + b _037FE768 +_037FE6C4: + cmp r4, #0 + beq _037FE768 + sub r0, r6, #0xfc + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _037FE768 +_037FE6DC: ; jump table + b _037FE714 ; case 0 + b _037FE6EC ; case 1 + b _037FE768 ; case 2 + b _037FE760 ; case 3 +_037FE6EC: + ldrb r0, [r8, #0x3b] + cmp r0, #0 + beq _037FE768 + sub r0, r0, #1 + strb r0, [r8, #0x3b] + and r0, r0, #0xff + add r0, r8, r0, lsl #2 + ldr r0, [r0, #0x2c] + str r0, [r8, #0x28] + b _037FE768 +_037FE714: + ldrb r0, [r8, #0x3b] + cmp r0, #0 + beq _037FE768 + add r1, r8, r0 + ldrb r0, [r1, #0x37] + cmp r0, #0 + beq _037FE748 + sub r0, r0, #1 + ands r0, r0, #0xff + ldreqb r0, [r8, #0x3b] + subeq r0, r0, #1 + streqb r0, [r8, #0x3b] + beq _037FE768 +_037FE748: + strb r0, [r1, #0x37] + ldrb r0, [r8, #0x3b] + add r0, r8, r0, lsl #2 + ldr r0, [r0, #0x28] + str r0, [r8, #0x28] + b _037FE768 +_037FE760: + mvn r0, #0 + b _037FE788 +_037FE768: + ldr r0, [r8, #0x20] + cmp r0, #0 + bne _037FE784 + ldrb r0, [r8] + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + beq _037FDD60 +_037FE784: + mov r0, #0 +_037FE788: + cmp r0, #0 + moveq r0, #1 + streq r0, [sp, #0x10] + beq _037FE7A4 + mov r0, r7 + mov r1, sl + bl ClosePlayerTrack +_037FE7A4: + add sl, sl, #1 + cmp sl, #0x10 + blt _037FDCA4 + ldr r0, [sp, #0x10] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + add sp, sp, #0x24 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FE7CC: .word 0x0000FFFF +_037FE7D0: .word ChannelCallback +_037FE7D4: .word sMmlPrintEnable + arm_func_end PlayerSeqMain + + arm_func_start GetVariablePtr +GetVariablePtr: ; 0x037FE7D8 + ldr r2, _037FE818 ; =SNDi_SharedWork + ldr r3, [r2] + cmp r3, #0 + moveq r0, #0 + bxeq lr + cmp r1, #0x10 + addge r2, r3, #0x260 + subge r0, r1, #0x10 + addge r0, r2, r0, lsl #1 + bxge lr + ldrb r2, [r0, #1] + add r3, r3, #0x20 + mov r0, #0x24 + mla r0, r2, r0, r3 + add r0, r0, r1, lsl #1 + bx lr + .align 2, 0 +_037FE818: .word SNDi_SharedWork + arm_func_end GetVariablePtr + + arm_func_start AllocTrack +AllocTrack: ; 0x037FE81C + ldr ip, _037FE85C ; =SNDi_Work + 0x780 + mov r0, #0 + b _037FE84C +_037FE828: + ldrb r1, [ip, r0, lsl #6] + mov r3, r0, lsl #6 + mov r2, r1, lsl #0x1f + movs r2, r2, lsr #0x1f + biceq r1, r1, #1 + orreq r1, r1, #1 + streqb r1, [ip, r3] + bxeq lr + add r0, r0, #1 +_037FE84C: + cmp r0, #0x20 + blt _037FE828 + mvn r0, #0 + bx lr + .align 2, 0 +_037FE85C: .word SNDi_Work + 0x780 + arm_func_end AllocTrack + + arm_func_start SetTrackMute +SetTrackMute: ; 0x037FE860 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r2, #3 + addls pc, pc, r2, lsl #2 + b _037FE8D8 +_037FE874: ; jump table + b _037FE884 ; case 0 + b _037FE894 ; case 1 + b _037FE8A4 ; case 2 + b _037FE8BC ; case 3 +_037FE884: + ldrb r0, [r4] + bic r0, r0, #4 + strb r0, [r4] + b _037FE8D8 +_037FE894: + ldrb r0, [r4] + orr r0, r0, #4 + strb r0, [r4] + b _037FE8D8 +_037FE8A4: + ldrb r3, [r4] + mvn r2, #0 + orr r3, r3, #4 + strb r3, [r4] + bl ReleaseTrackChannelAll + b _037FE8D8 +_037FE8BC: + ldrb r3, [r4] + mov r2, #0x7f + orr r3, r3, #4 + strb r3, [r4] + bl ReleaseTrackChannelAll + mov r0, r4 + bl FreeTrackChannelAll +_037FE8D8: + ldmia sp!, {r4, lr} + bx lr + arm_func_end SetTrackMute + + arm_func_start SND_ReadInstData +SND_ReadInstData: ; 0x037FE8E0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + movs r7, r1 + mov r6, r0 + mov r5, r2 + mov r4, r3 + movmi r0, #0 + bmi _037FEA58 + bl SNDi_LockMutex + ldr r0, [r6, #0x38] + cmp r7, r0 + blo _037FE918 + bl SNDi_UnlockMutex + mov r0, #0 + b _037FEA58 +_037FE918: + add r0, r6, r7, lsl #2 + ldr r1, [r0, #0x3c] + and r0, r1, #0xff + strb r1, [r4] + cmp r0, #0x11 + mov r1, r1, lsr #8 + addls pc, pc, r0, lsl #2 + b _037FEA44 +_037FE938: ; jump table + b _037FEA44 ; case 0 + b _037FE980 ; case 1 + b _037FE980 ; case 2 + b _037FE980 ; case 3 + b _037FE980 ; case 4 + b _037FE980 ; case 5 + b _037FEA44 ; case 6 + b _037FEA44 ; case 7 + b _037FEA44 ; case 8 + b _037FEA44 ; case 9 + b _037FEA44 ; case 10 + b _037FEA44 ; case 11 + b _037FEA44 ; case 12 + b _037FEA44 ; case 13 + b _037FEA44 ; case 14 + b _037FEA44 ; case 15 + b _037FE9A0 ; case 16 + b _037FE9F0 ; case 17 +_037FE980: + add r3, r6, r1 + add r2, r4, #2 + mov r1, #5 +_037FE98C: + ldrh r0, [r3], #2 + subs r1, r1, #1 + strh r0, [r2], #2 + bne _037FE98C + b _037FEA50 +_037FE9A0: + ldrb r0, [r6, r1] + add r2, r6, r1 + ldrb r1, [r2, #1] + cmp r5, r0 + blt _037FE9BC + cmp r5, r1 + ble _037FE9C8 +_037FE9BC: + bl SNDi_UnlockMutex + mov r0, #0 + b _037FEA58 +_037FE9C8: + sub r1, r5, r0 + mov r0, #0xc + mla r0, r1, r0, r2 + add r2, r0, #2 + mov r1, #6 +_037FE9DC: + ldrh r0, [r2], #2 + subs r1, r1, #1 + strh r0, [r4], #2 + bne _037FE9DC + b _037FEA50 +_037FE9F0: + add r2, r6, r1 + mov r1, #0 + b _037FEA14 +_037FE9FC: + add r1, r1, #1 + cmp r1, #8 + blt _037FEA14 + bl SNDi_UnlockMutex + mov r0, #0 + b _037FEA58 +_037FEA14: + ldrb r0, [r2, r1] + cmp r5, r0 + bgt _037FE9FC + mov r0, #0xc + mla r0, r1, r0, r2 + add r2, r0, #8 + mov r1, #6 +_037FEA30: + ldrh r0, [r2], #2 + subs r1, r1, #1 + strh r0, [r4], #2 + bne _037FEA30 + b _037FEA50 +_037FEA44: + bl SNDi_UnlockMutex + mov r0, #0 + b _037FEA58 +_037FEA50: + bl SNDi_UnlockMutex + mov r0, #1 +_037FEA58: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end SND_ReadInstData + + arm_func_start SND_GetWaveDataAddress +SND_GetWaveDataAddress: ; 0x037FEA60 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl SNDi_LockMutex + add r0, r5, r4, lsl #2 + ldr r4, [r0, #0x3c] + cmp r4, #0 + beq _037FEA8C + cmp r4, #0x2000000 + addlo r4, r5, r4 + b _037FEA90 +_037FEA8C: + mov r4, #0 +_037FEA90: + bl SNDi_UnlockMutex + mov r0, r4 + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end SND_GetWaveDataAddress + + arm_func_start SND_NoteOn +SND_NoteOn: ; 0x037FEAA0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r5, [sp, #0x24] + mov sb, r0 + ldrb r4, [r5, #0xa] + ldrb r0, [r5] + cmp r4, #0xff + mov r6, r3 + mov r8, r1 + mov r7, r2 + mvneq r6, #0 + moveq r4, #0 + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _037FEB80 +_037FEAD8: ; jump table + b _037FEB80 ; case 0 + b _037FEAEC ; case 1 + b _037FEB5C ; case 2 + b _037FEB70 ; case 3 + b _037FEAEC ; case 4 +_037FEAEC: + cmp r0, #1 + bne _037FEB30 + ldr r2, [sp, #0x20] + ldrh r0, [r5, #4] + ldrh r1, [r5, #2] + add r0, r2, r0, lsl #3 + ldr r0, [r0, #0x18] + cmp r0, #0 + moveq r1, #0 + beq _037FEB3C + ldr r2, [r0, #0x38] + cmp r1, r2 + movhs r1, #0 + bhs _037FEB3C + bl SND_GetWaveDataAddress + mov r1, r0 + b _037FEB3C +_037FEB30: + ldrh r1, [r5, #4] + ldrh r0, [r5, #2] + orr r1, r0, r1, lsl #16 +_037FEB3C: + cmp r1, #0 + moveq r0, #0 + beq _037FEB84 + mov r0, sb + mov r3, r6 + add r2, r1, #0xc + bl SND_StartExChannelPcm + b _037FEB84 +_037FEB5C: + ldrh r1, [r5, #2] + mov r0, sb + mov r2, r6 + bl SND_StartExChannelPsg + b _037FEB84 +_037FEB70: + mov r0, sb + mov r1, r6 + bl SND_StartExChannelNoise + b _037FEB84 +_037FEB80: + mov r0, #0 +_037FEB84: + cmp r0, #0 + moveq r0, #0 + beq _037FEBE0 + strb r8, [sb, #8] + ldrb r1, [r5, #6] + mov r0, sb + strb r1, [sb, #5] + strb r7, [sb, #9] + ldrb r1, [r5, #7] + bl SND_SetExChannelAttack + ldrb r1, [r5, #8] + mov r0, sb + bl SND_SetExChannelDecay + ldrb r1, [r5, #9] + mov r0, sb + bl SND_SetExChannelSustain + mov r0, sb + mov r1, r4 + bl SND_SetExChannelRelease + ldrb r1, [r5, #0xb] + mov r0, #1 + sub r1, r1, #0x40 + strb r1, [sb, #0xa] +_037FEBE0: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + arm_func_end SND_NoteOn + + arm_func_start SND_SetPlayerLocalVariable +SND_SetPlayerLocalVariable: ; 0x037FEBE8 + ldr ip, _037FEC04 ; =SNDi_SharedWork + mov r3, #0x24 + ldr ip, [ip] + mla r3, r0, r3, ip + add r0, r3, r1, lsl #1 + strh r2, [r0, #0x20] + bx lr + .align 2, 0 +_037FEC04: .word SNDi_SharedWork + arm_func_end SND_SetPlayerLocalVariable + + arm_func_start SND_SetPlayerGlobalVariable +SND_SetPlayerGlobalVariable: ; 0x037FEC08 + ldr r2, _037FEC20 ; =SNDi_SharedWork + ldr r2, [r2] + add r0, r2, r0, lsl #1 + add r0, r0, #0x200 + strh r1, [r0, #0x60] + bx lr + .align 2, 0 +_037FEC20: .word SNDi_SharedWork + arm_func_end SND_SetPlayerGlobalVariable + + arm_func_start SND_UpdateSharedWork +SND_UpdateSharedWork: ; 0x037FEC24 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _037FECB8 ; =SNDi_SharedWork + mov r4, #0 + ldr r0, [r0] + mov r5, r4 + cmp r0, #0 + beq _037FECB0 + mov r7, r4 + mov r6, #1 +_037FEC48: + mov r0, r7 + bl SND_IsChannelActive + cmp r0, #0 + orrne r0, r4, r6, lsl r7 + movne r0, r0, lsl #0x10 + add r7, r7, #1 + movne r4, r0, lsr #0x10 + cmp r7, #0x10 + blt _037FEC48 + mov r0, #0 + bl SND_IsCaptureActive + cmp r0, #0 + orrne r0, r5, #1 + movne r0, r0, lsl #0x10 + movne r5, r0, lsr #0x10 + mov r0, #1 + bl SND_IsCaptureActive + cmp r0, #0 + orrne r0, r5, #2 + movne r0, r0, lsl #0x10 + movne r5, r0, lsr #0x10 + ldr r0, _037FECB8 ; =SNDi_SharedWork + ldr r1, [r0] + strh r4, [r1, #8] + ldr r0, [r0] + strh r5, [r0, #0xa] +_037FECB0: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_037FECB8: .word SNDi_SharedWork + arm_func_end SND_UpdateSharedWork + + arm_func_start SND_AlarmInit +SND_AlarmInit: ; 0x037FECBC + ldr r1, _037FECE4 ; =SNDi_Work + mov r3, #0 + mov r2, r3 +_037FECC8: + add r0, r1, r3, lsl #6 + strb r2, [r0, #0xf80] + add r3, r3, #1 + strb r2, [r0, #0xf81] + cmp r3, #8 + blt _037FECC8 + bx lr + .align 2, 0 +_037FECE4: .word SNDi_Work + arm_func_end SND_AlarmInit + + arm_func_start SND_SetupAlarm +SND_SetupAlarm: ; 0x037FECE8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr lr, _037FED40 ; =SNDi_Work + 0xF80 + ldr r4, [sp, #0x18] + ldrb ip, [lr, r0, lsl #6] + mov r7, r1 + mov r6, r2 + mov r5, r3 + cmp ip, #0 + add r8, lr, r0, lsl #6 + beq _037FED20 + add r0, r8, #0x14 + bl OS_CancelAlarm + mov r0, #0 + strb r0, [r8] +_037FED20: + str r7, [r8, #4] + str r6, [r8, #8] + str r5, [r8, #0xc] + ldr r0, [sp, #0x1c] + str r4, [r8, #0x10] + strb r0, [r8, #1] + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FED40: .word SNDi_Work + 0xF80 + arm_func_end SND_SetupAlarm + + arm_func_start SND_StartAlarm +SND_StartAlarm: ; 0x037FED44 + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0xc + ldr r1, _037FEDF8 ; =SNDi_Work + 0xF80 + mov sb, r0 + ldrb r0, [r1, sb, lsl #6] + add r8, r1, sb, lsl #6 + cmp r0, #0 + beq _037FED74 + add r0, r8, #0x14 + bl OS_CancelAlarm + mov r0, #0 + strb r0, [r8] +_037FED74: + ldrb r1, [r8, #1] + ldr r7, [r8, #0xc] + ldr r6, [r8, #0x10] + add r0, r8, #0x14 + ldr r5, [r8, #4] + ldr r4, [r8, #8] + orr sb, sb, r1, lsl #8 + bl OS_CreateAlarm + cmp r6, #0 + cmpeq r7, #0 + bne _037FEDBC + ldr r3, _037FEDFC ; =AlarmHandler + mov r1, r5 + mov r2, r4 + add r0, r8, #0x14 + str sb, [sp] + bl OS_SetAlarm + b _037FEDE4 +_037FEDBC: + bl OS_GetTick + ldr r2, _037FEDFC ; =AlarmHandler + adds r0, r5, r0 + stmib sp, {r2, sb} + adc r2, r4, r1 + mov r1, r0 + mov r3, r7 + add r0, r8, #0x14 + str r6, [sp] + bl OS_SetPeriodicAlarm +_037FEDE4: + mov r0, #1 + strb r0, [r8] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_037FEDF8: .word SNDi_Work + 0xF80 +_037FEDFC: .word AlarmHandler + arm_func_end SND_StartAlarm + + arm_func_start SND_StopAlarm +SND_StopAlarm: ; 0x037FEE00 + stmdb sp!, {r4, lr} + ldr r2, _037FEE3C ; =SNDi_Work + 0xF80 + ldrb r1, [r2, r0, lsl #6] + add r4, r2, r0, lsl #6 + cmp r1, #0 + beq _037FEE34 + add r0, r4, #0x14 + bl OS_CancelAlarm + ldrb r1, [r4, #1] + mov r0, #0 + add r1, r1, #1 + strb r1, [r4, #1] + strb r0, [r4] +_037FEE34: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FEE3C: .word SNDi_Work + 0xF80 + arm_func_end SND_StopAlarm + + arm_func_start AlarmHandler +AlarmHandler: ; 0x037FEE40 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, #7 + mov r4, #0 +_037FEE50: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _037FEE50 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end AlarmHandler + + arm_func_start SND_CommandInit +SND_CommandInit: ; 0x037FEE70 + stmdb sp!, {r3, lr} + ldr r0, _037FEEA4 ; =sCommandMesgQueue + ldr r1, _037FEEA8 ; =sCommandMesgBuffer + mov r2, #8 + bl OS_InitMessageQueue + ldr r1, _037FEEAC ; =PxiFifoCallback + mov r0, #7 + bl PXI_SetFifoRecvCallback + ldr r0, _037FEEB0 ; =SNDi_SharedWork + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FEEA4: .word sCommandMesgQueue +_037FEEA8: .word sCommandMesgBuffer +_037FEEAC: .word PxiFifoCallback +_037FEEB0: .word SNDi_SharedWork + arm_func_end SND_CommandInit + + arm_func_start SND_CommandProc +SND_CommandProc: ; 0x037FEEB4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + b _037FF52C +_037FEEC0: + ldr sl, _037FF550 ; =0x04000509 + ldr r6, [sp, #0x18] + sub r4, sl, #1 + b _037FF510 +_037FEED0: + add r5, sp, #0x1c + ldmia r6!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + ldmia r6, {r0, r1} + stmia r5, {r0, r1} + ldr r0, [sp, #0x20] + cmp r0, #0x21 + addls pc, pc, r0, lsl #2 + b _037FF50C +_037FEEF4: ; jump table + b _037FEF7C ; case 0 + b _037FEF94 ; case 1 + b _037FEFA0 ; case 2 + b _037FEFB8 ; case 3 + b _037FEFC4 ; case 4 + b _037FEFD4 ; case 5 + b _037FEFE4 ; case 6 + b _037FEFFC ; case 7 + b _037FF024 ; case 8 + b _037FF038 ; case 9 + b _037FF04C ; case 10 + b _037FF068 ; case 11 + b _037FF080 ; case 12 + b _037FF148 ; case 13 + b _037FF324 ; case 14 + b _037FF3A4 ; case 15 + b _037FF3DC ; case 16 + b _037FF1EC ; case 17 + b _037FF234 ; case 18 + b _037FF25C ; case 19 + b _037FF29C ; case 20 + b _037FF2E4 ; case 21 + b _037FF40C ; case 22 + b _037FF418 ; case 23 + b _037FF424 ; case 24 + b _037FF430 ; case 25 + b _037FF448 ; case 26 + b _037FF458 ; case 27 + b _037FF468 ; case 28 + b _037FF4A8 ; case 29 + b _037FF478 ; case 30 + b _037FF488 ; case 31 + b _037FF498 ; case 32 + b _037FF4B8 ; case 33 +_037FEF7C: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + bl SND_StartSeq + b _037FF50C +_037FEF94: + ldr r0, [sp, #0x24] + bl SND_StopSeq + b _037FF50C +_037FEFA0: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + bl SND_PrepareSeq + b _037FF50C +_037FEFB8: + ldr r0, [sp, #0x24] + bl SND_StartPreparedSeq + b _037FF50C +_037FEFC4: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_PauseSeq + b _037FF50C +_037FEFD4: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_SkipSeq + b _037FF50C +_037FEFE4: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + bl SNDi_SetPlayerParam + b _037FF50C +_037FEFFC: + ldr r1, [sp, #0x24] + mov r0, r1, lsr #0x18 + and r0, r0, #0xff + str r0, [sp] + bic r0, r1, #0xff000000 + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + bl SNDi_SetTrackParam + b _037FF50C +_037FF024: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + bl SND_SetTrackMute + b _037FF50C +_037FF038: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + bl SND_SetTrackAllocatableChannel + b _037FF50C +_037FF04C: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + mov r2, r2, lsl #0x10 + mov r2, r2, asr #0x10 + bl SND_SetPlayerLocalVariable + b _037FF50C +_037FF068: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + mov r1, r1, lsl #0x10 + mov r1, r1, asr #0x10 + bl SND_SetPlayerGlobalVariable + b _037FF50C +_037FF080: + ldr r7, [sp, #0x2c] + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x24] + bl OS_DisableInterrupts + mov r8, r0 + mov r2, #0 + b _037FF0BC +_037FF09C: + tst r5, #1 + movne r0, r2, lsl #4 + addne r0, r0, #0x4000000 + ldrneb r1, [r0, #0x403] + add r2, r2, #1 + orrne r1, r1, #0x80 + strneb r1, [r0, #0x403] + mov r5, r5, lsr #1 +_037FF0BC: + cmp r2, #0x10 + bge _037FF0CC + cmp r5, #0 + bne _037FF09C +_037FF0CC: + tst r6, #1 + beq _037FF0F8 + tst r6, #2 + ldrneh r1, [r4] + orrne r0, r1, #0x80 + orrne r0, r0, #0x8000 + strneh r0, [r4] + ldreqb r0, [r4] + orreq r0, r0, #0x80 + streqb r0, [r4] + b _037FF108 +_037FF0F8: + tst r6, #2 + ldrneb r0, [sl] + orrne r0, r0, #0x80 + strneb r0, [sl] +_037FF108: + mov r5, #0 + b _037FF128 +_037FF110: + tst r7, #1 + beq _037FF120 + mov r0, r5 + bl SND_StartAlarm +_037FF120: + add r5, r5, #1 + mov r7, r7, lsr #1 +_037FF128: + cmp r5, #8 + bge _037FF138 + cmp r7, #0 + bne _037FF110 +_037FF138: + mov r0, r8 + bl OS_RestoreInterrupts + bl SND_UpdateSharedWork + b _037FF50C +_037FF148: + ldr sb, [sp, #0x30] + ldr r7, [sp, #0x2c] + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x24] + bl OS_DisableInterrupts + mov fp, r0 + mov r8, #0 + b _037FF180 +_037FF168: + tst r7, #1 + beq _037FF178 + mov r0, r8 + bl SND_StopAlarm +_037FF178: + add r8, r8, #1 + mov r7, r7, lsr #1 +_037FF180: + cmp r8, #8 + bge _037FF190 + cmp r7, #0 + bne _037FF168 +_037FF190: + mov r7, #0 + b _037FF1B4 +_037FF198: + tst r5, #1 + beq _037FF1AC + mov r0, r7 + mov r1, sb + bl SND_StopChannel +_037FF1AC: + add r7, r7, #1 + mov r5, r5, lsr #1 +_037FF1B4: + cmp r7, #0x10 + bge _037FF1C4 + cmp r5, #0 + bne _037FF198 +_037FF1C4: + tst r6, #1 + movne r0, #0 + strneb r0, [r4] + tst r6, #2 + movne r0, #0 + strneb r0, [sl] + mov r0, fp + bl OS_RestoreInterrupts + bl SND_UpdateSharedWork + b _037FF50C +_037FF1EC: + ldr r1, [sp, #0x2c] + mov r0, r1, lsr #0x1d + and r0, r0, #1 + str r0, [sp] + mov r0, r1, lsr #0x1c + and r0, r0, #1 + str r0, [sp, #4] + mov r0, r1, lsr #0x1b + and r0, r0, #1 + str r0, [sp, #8] + mov r0, r1, lsr #0x1f + and r0, r0, #1 + mov r1, r1, lsr #0x1e + and r1, r1, #1 + ldr r2, [sp, #0x24] + ldr r3, [sp, #0x28] + bl SND_SetupCapture + b _037FF50C +_037FF234: + ldr r0, [sp, #0x30] + mov r2, #0 + str r0, [sp, #4] + ldr r3, [sp, #0x2c] + mov r0, #0 + str r0, [sp] + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_SetupAlarm + b _037FF50C +_037FF25C: + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x24] + mov r7, #0 + b _037FF288 +_037FF26C: + tst r5, #1 + beq _037FF280 + mov r0, r7 + mov r1, r6 + bl SND_SetChannelTimer +_037FF280: + add r7, r7, #1 + mov r5, r5, lsr #1 +_037FF288: + cmp r7, #0x10 + bge _037FF50C + cmp r5, #0 + bne _037FF26C + b _037FF50C +_037FF29C: + ldr r7, [sp, #0x2c] + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x24] + mov r8, #0 + b _037FF2D0 +_037FF2B0: + tst r5, #1 + beq _037FF2C8 + mov r0, r8 + mov r1, r6 + mov r2, r7 + bl SND_SetChannelVolume +_037FF2C8: + add r8, r8, #1 + mov r5, r5, lsr #1 +_037FF2D0: + cmp r8, #0x10 + bge _037FF50C + cmp r5, #0 + bne _037FF2B0 + b _037FF50C +_037FF2E4: + ldr r6, [sp, #0x28] + ldr r5, [sp, #0x24] + mov r7, #0 + b _037FF310 +_037FF2F4: + tst r5, #1 + beq _037FF308 + mov r0, r7 + mov r1, r6 + bl SND_SetChannelPan +_037FF308: + add r7, r7, #1 + mov r5, r5, lsr #1 +_037FF310: + cmp r7, #0x10 + bge _037FF50C + cmp r5, #0 + bne _037FF2F4 + b _037FF50C +_037FF324: + ldr r3, [sp, #0x30] + ldr r0, [sp, #0x24] + mov r1, r3, lsl #0x10 + ldr r2, [sp, #0x2c] + mov r1, r1, lsr #0x10 + str r1, [sp] + ldr r1, _037FF554 ; =0x003FFFFF + and r1, r2, r1 + str r1, [sp, #4] + mov r1, r2, lsr #0x18 + and r1, r1, #0x7f + str r1, [sp, #8] + mov r1, r2, lsr #0x16 + and r1, r1, #3 + str r1, [sp, #0xc] + mov r1, r0, lsr #0x10 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + str r1, [sp, #0x10] + mov r1, r3, lsr #0x10 + mov r2, r3, lsr #0x18 + and r1, r1, #0x7f + str r1, [sp, #0x14] + ldr r1, [sp, #0x28] + mov r0, r0, lsl #0x10 + mov r3, r3, lsr #0x1a + mov r0, r0, lsr #0x10 + bic r1, r1, #0xf8000000 + and r2, r2, #3 + and r3, r3, #3 + bl SND_SetupChannelPcm + b _037FF50C +_037FF3A4: + ldr r1, [sp, #0x2c] + ldr r3, [sp, #0x28] + mov r0, r1, lsl #8 + mov r0, r0, lsr #0x10 + str r0, [sp] + and r0, r1, #0x7f + str r0, [sp, #4] + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x30] + and r2, r3, #0x7f + mov r3, r3, lsr #8 + and r3, r3, #3 + bl SND_SetupChannelPsg + b _037FF50C +_037FF3DC: + ldr r1, [sp, #0x2c] + ldr r2, [sp, #0x28] + and r0, r1, #0x7f + str r0, [sp] + mov r0, r1, lsl #8 + mov r3, r0, lsr #0x10 + ldr r0, [sp, #0x24] + and r1, r2, #0x7f + mov r2, r2, lsr #8 + and r2, r2, #3 + bl SND_SetupChannelNoise + b _037FF50C +_037FF40C: + ldr r0, [sp, #0x24] + bl SNDi_SetSurroundDecay + b _037FF50C +_037FF418: + ldr r0, [sp, #0x24] + bl SND_SetMasterVolume + b _037FF50C +_037FF424: + ldr r0, [sp, #0x24] + bl SND_SetMasterPan + b _037FF50C +_037FF430: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + ldr r2, [sp, #0x2c] + ldr r3, [sp, #0x30] + bl SND_SetOutputSelector + b _037FF50C +_037FF448: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_LockChannel + b _037FF50C +_037FF458: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_UnlockChannel + b _037FF50C +_037FF468: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_StopUnlockedChannel + b _037FF50C +_037FF478: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_InvalidateSeq + b _037FF50C +_037FF488: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_InvalidateBank + b _037FF50C +_037FF498: + ldr r0, [sp, #0x24] + ldr r1, [sp, #0x28] + bl SND_InvalidateWave + b _037FF50C +_037FF4A8: + ldr r1, [sp, #0x24] + ldr r0, _037FF558 ; =SNDi_SharedWork + str r1, [r0] + b _037FF50C +_037FF4B8: + ldr r5, [sp, #0x24] + ldr r0, _037FF55C ; =SNDi_Work + mov r1, r5 + mov r2, #0x1180 + bl MIi_CpuCopy32 + ldr r0, _037FF55C ; =SNDi_Work + add r1, r5, #0x1000 + str r0, [r1, #0x1c0] + mov r6, #0 +_037FF4DC: + mov r0, r6 + bl SND_GetChannelControl + add r1, r5, r6, lsl #2 + add r1, r1, #0x1000 + str r0, [r1, #0x180] + add r6, r6, #1 + cmp r6, #0x10 + blt _037FF4DC + mov r0, #0 + bl SND_GetLockedChannel + add r1, r5, #0x1000 + str r0, [r1, #0x1c4] +_037FF50C: + ldr r6, [sp, #0x1c] +_037FF510: + cmp r6, #0 + bne _037FEED0 + ldr r0, _037FF558 ; =SNDi_SharedWork + ldr r1, [r0] + ldr r0, [r1] + add r0, r0, #1 + str r0, [r1] +_037FF52C: + ldr r0, _037FF560 ; =sCommandMesgQueue + add r1, sp, #0x18 + mov r2, #0 + bl OS_ReceiveMessage + cmp r0, #0 + bne _037FEEC0 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FF550: .word 0x04000509 +_037FF554: .word 0x003FFFFF +_037FF558: .word SNDi_SharedWork +_037FF55C: .word SNDi_Work +_037FF560: .word sCommandMesgQueue + arm_func_end SND_CommandProc + + arm_func_start PxiFifoCallback +PxiFifoCallback: ; 0x037FF564 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + bl OS_DisableInterrupts + mov r4, r0 + cmp r5, #0x2000000 + blo _037FF590 + ldr r0, _037FF5AC ; =sCommandMesgQueue + mov r1, r5 + mov r2, #0 + bl OS_SendMessage + b _037FF59C +_037FF590: + cmp r5, #0 + bne _037FF59C + bl SND_SendWakeupMessage +_037FF59C: + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_037FF5AC: .word sCommandMesgQueue + arm_func_end PxiFifoCallback + + arm_func_start FS_Init +FS_Init: ; 0x037FF5B0 + ldr ip, _037FF5B8 ; =CARD_Init + bx ip + .align 2, 0 +_037FF5B8: .word CARD_Init + arm_func_end FS_Init + + arm_func_start CARDi_InitCommon +CARDi_InitCommon: ; 0x037FF5BC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r4, _037FF660 ; =cardi_common + mov r2, #0 + mvn r1, #2 + str r1, [r4, #0xc] + mov r0, #4 + str r0, [r4, #0xf0] + str r2, [r4, #0x10] + str r2, [r4, #0x1c] + str r2, [r4] + str r2, [r4, #8] + str r2, [r4, #0x18] + str r2, [r4, #0x14] + str r2, [r4, #0xf8] + str r2, [r4, #0xf4] + mov r0, #0x400 + str r0, [sp] + ldr ip, [r4, #0xf0] + ldr r1, _037FF664 ; =CARDi_TaskThread + ldr r3, _037FF668 ; =status_checked$3825 + add r0, r4, #0x48 + str ip, [sp, #4] + bl OS_CreateThread + add r0, r4, #0x48 + bl OS_WakeupThreadDirect + ldr r1, _037FF66C ; =CARDi_OnFifoRecv + mov r0, #0xb + bl PXI_SetFifoRecvCallback + ldr r0, _037FF670 ; =0x027FFC40 + ldrh r0, [r0] + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + ldreq r0, _037FF674 ; =CARDi_EnableFlag + moveq r1, #1 + streq r1, [r0] + add sp, sp, #8 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FF660: .word cardi_common +_037FF664: .word CARDi_TaskThread +_037FF668: .word status_checked$3825 +_037FF66C: .word CARDi_OnFifoRecv +_037FF670: .word 0x027FFC40 +_037FF674: .word CARDi_EnableFlag + arm_func_end CARDi_InitCommon + + arm_func_start CARD_SetThreadPriority +CARD_SetThreadPriority: ; 0x037FF678 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r5, _037FF6B4 ; =cardi_common + mov r7, r0 + bl OS_DisableInterrupts + ldr r6, [r5, #0xf0] + mov r4, r0 + mov r1, r7 + add r0, r5, #0x48 + str r7, [r5, #0xf0] + bl OS_SetThreadPriority + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, r6 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_037FF6B4: .word cardi_common + arm_func_end CARD_SetThreadPriority + + arm_func_start CARD_GetRomHeader +CARD_GetRomHeader: ; 0x037FF6B8 + ldr r0, _037FF6C0 ; =0x027FFA80 + bx lr + .align 2, 0 +_037FF6C0: .word 0x027FFA80 + arm_func_end CARD_GetRomHeader + + arm_func_start CARDi_CommandEnd +CARDi_CommandEnd: ; 0x037FF6C4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r0 + mov r4, r1 + adds r1, r5, r4 + beq _037FF75C + cmp r5, #0 + beq _037FF6E4 + bl OS_Sleep +_037FF6E4: + cmp r4, #0 + beq _037FF738 + sub r7, r4, r5 + mov r4, #0 + mov r5, #1 + mov r6, #5 + b _037FF718 +_037FF700: + cmp r7, #5 + movlt r8, r7 + movge r8, r6 + mov r0, r8 + bl OS_Sleep + sub r7, r7, r8 +_037FF718: + bl CARDi_CommandReadStatus + tst r0, #1 + moveq r0, r5 + movne r0, r4 + cmp r0, #0 + bne _037FF738 + cmp r7, #0 + bgt _037FF700 +_037FF738: + bl CARDi_CommandReadStatus + tst r0, #1 + moveq r0, #1 + movne r0, #0 + cmp r0, #0 + ldreq r0, _037FF764 ; =cardi_common + moveq r1, #4 + ldreq r0, [r0] + streq r1, [r0] +_037FF75C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_037FF764: .word cardi_common + arm_func_end CARDi_CommandEnd + + arm_func_start CARDi_CommandReadStatus +CARDi_CommandReadStatus: ; 0x037FF768 + stmdb sp!, {r3, lr} + ldr ip, _037FF7AC ; =status_checked$3825 + mov lr, #2 + ldr r0, _037FF7B0 ; =arg$3983 + ldr r3, _037FF7B4 ; =CARDi_CommWriteCore + mov r1, #0 + mov r2, #1 + str lr, [ip, #4] + bl CARDi_CommArray + ldr r3, _037FF7B8 ; =CARDi_CommReadCore + add r1, sp, #0 + mov r0, #0 + mov r2, #1 + bl CARDi_CommArray + ldrb r0, [sp] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FF7AC: .word status_checked$3825 +_037FF7B0: .word arg$3983 +_037FF7B4: .word CARDi_CommWriteCore +_037FF7B8: .word CARDi_CommReadCore + arm_func_end CARDi_CommandReadStatus + + arm_func_start CARDi_WaitPrevCommand +CARDi_WaitPrevCommand: ; 0x037FF7BC + stmdb sp!, {r3, lr} + mov r0, #0 + mov r1, #0x32 + bl CARDi_CommandEnd + ldr r0, _037FF7F4 ; =cardi_common + ldr r1, [r0] + ldr r0, [r1] + cmp r0, #4 + moveq r0, #6 + streq r0, [r1] + moveq r0, #0 + movne r0, #1 + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FF7F4: .word cardi_common + arm_func_end CARDi_WaitPrevCommand + + arm_func_start CARDi_CommArray +CARDi_CommArray: ; 0x037FF7F8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r4, _037FF9B0 ; =cardi_param + ldr r6, _037FF9B4 ; =0x0000A040 + ldr r5, _037FF9B8 ; =0x040001A0 + stmib r4, {r0, r1} + mov r8, r2 + mov r7, r3 + strh r6, [r5] + b _037FF98C +_037FF81C: + ldr r0, _037FF9BC ; =_03806AF4 + ldr r0, [r0, #4] + cmp r0, #0 + beq _037FF92C + ldr r0, _037FF9C0 ; =cardi_common + ldr r0, [r0] + ldr r0, [r0, #4] + mov r0, r0, asr #0x10 + and r0, r0, #0xff + cmp r0, #0xff + bne _037FF92C + bl OS_GetTick + ldr fp, _037FF9BC ; =_03806AF4 + mov r5, r0 + mov r6, r1 + mov sb, #0xfa00 +_037FF85C: + bl OS_GetTick + mov r3, #0 + subs sl, r0, r5 + sbc lr, r1, r6 + mov ip, r3 + umull r0, r1, sl, sb + mla r1, sl, ip, r1 + mla r1, lr, sb, r1 + ldr r2, _037FF9C4 ; =0x000082EA + bl _ll_udiv + ldrb r2, [fp] + cmp r1, r2, asr #31 + cmpeq r0, r2 + blo _037FF85C + ldr r0, _037FF9C8 ; =0x0000A042 + ldr r1, _037FF9B8 ; =0x040001A0 + strh r0, [r1] +_037FF8A0: + ldrh r0, [r1] + tst r0, #0x80 + bne _037FF8A0 + ldr r0, _037FF9CC ; =0x040001A2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_037FF8BC: + ldrh r0, [r1] + tst r0, #0x80 + bne _037FF8BC + ldr r1, _037FF9CC ; =0x040001A2 + ldr r0, _037FF9BC ; =_03806AF4 + ldrh r2, [r1] + mov r1, #0 + strh r2, [sp] + str r1, [r0, #4] + bl OS_GetTick + mov r6, r0 + mov sb, r1 + mov r5, #0xfa00 +_037FF8F0: + bl OS_GetTick + mov r3, #0 + subs ip, r0, r6 + sbc fp, r1, sb + mov sl, r3 + umull r0, r1, ip, r5 + mla r1, ip, sl, r1 + mla r1, fp, r5, r1 + ldr r2, _037FF9C4 ; =0x000082EA + bl _ll_udiv + ldr r2, _037FF9BC ; =_03806AF4 + ldrb r2, [r2] + cmp r1, r2, asr #31 + cmpeq r0, r2 + blo _037FF8F0 +_037FF92C: + ldr r0, [r4] + subs r0, r0, #1 + str r0, [r4] + ldrne r1, _037FF9B4 ; =0x0000A040 + ldrne r0, _037FF9B8 ; =0x040001A0 + strneh r1, [r0] + bne _037FF960 + ldr r1, _037FF9B8 ; =0x040001A0 + mov r2, #0xa000 + strh r2, [r1] + ldr r0, _037FF9BC ; =_03806AF4 + mov r1, #1 + str r1, [r0, #4] +_037FF960: + ldr r1, _037FF9B8 ; =0x040001A0 +_037FF964: + ldrh r0, [r1] + tst r0, #0x80 + bne _037FF964 + mov r0, r4 + mov lr, pc + bx r7 + ldr r0, [r4] + cmp r0, #0 + beq _037FF994 + sub r8, r8, #1 +_037FF98C: + cmp r8, #0 + bne _037FF81C +_037FF994: + ldr r0, [r4] + cmp r0, #0 + ldreq r0, _037FF9B8 ; =0x040001A0 + moveq r1, #0 + streqh r1, [r0] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FF9B0: .word cardi_param +_037FF9B4: .word 0x0000A040 +_037FF9B8: .word 0x040001A0 +_037FF9BC: .word _03806AF4 +_037FF9C0: .word cardi_common +_037FF9C4: .word 0x000082EA +_037FF9C8: .word 0x0000A042 +_037FF9CC: .word 0x040001A2 + arm_func_end CARDi_CommArray + + arm_func_start CARDi_CommReadCore +CARDi_CommReadCore: ; 0x037FF9D0 + ldr r1, _037FFA0C ; =0x040001A2 + mov r2, #0 + strh r2, [r1] + sub r2, r1, #2 +_037FF9E0: + ldrh r1, [r2] + tst r1, #0x80 + bne _037FF9E0 + ldr r2, _037FFA0C ; =0x040001A2 + ldr r1, [r0, #8] + ldrh r2, [r2] + strb r2, [r1] + ldr r1, [r0, #8] + add r1, r1, #1 + str r1, [r0, #8] + bx lr + .align 2, 0 +_037FFA0C: .word 0x040001A2 + arm_func_end CARDi_CommReadCore + + arm_func_start CARDi_CommWriteCore +CARDi_CommWriteCore: ; 0x037FFA10 + stmdb sp!, {r3} + sub sp, sp, #4 + ldr r1, [r0, #4] + ldr r2, _037FFA5C ; =0x040001A2 + ldrb r1, [r1] + strh r1, [r2] + ldr r1, [r0, #4] + add r1, r1, #1 + str r1, [r0, #4] + sub r1, r2, #2 +_037FFA38: + ldrh r0, [r1] + tst r0, #0x80 + bne _037FFA38 + ldr r0, _037FFA5C ; =0x040001A2 + ldrh r0, [r0] + strh r0, [sp] + add sp, sp, #4 + ldmia sp!, {r3} + bx lr + .align 2, 0 +_037FFA5C: .word 0x040001A2 + arm_func_end CARDi_CommWriteCore + + arm_func_start CARDi_CommVerifyCore +CARDi_CommVerifyCore: ; 0x037FFA60 + ldr r1, _037FFAC0 ; =0x040001A2 + mov r2, #0 + strh r2, [r1] + sub r2, r1, #2 +_037FFA70: + ldrh r1, [r2] + tst r1, #0x80 + bne _037FFA70 + ldr r2, _037FFAC0 ; =0x040001A2 + ldr r1, [r0, #4] + ldrh r2, [r2] + ldrb r1, [r1] + and r2, r2, #0xff + cmp r2, r1 + beq _037FFAB0 + mov r1, #0 + str r1, [r0, #0xc] + ldr r1, [r0] + cmp r1, #1 + movhi r1, #1 + strhi r1, [r0] +_037FFAB0: + ldr r1, [r0, #4] + add r1, r1, #1 + str r1, [r0, #4] + bx lr + .align 2, 0 +_037FFAC0: .word 0x040001A2 + arm_func_end CARDi_CommVerifyCore + + arm_func_start CARDi_WriteEnable +CARDi_WriteEnable: ; 0x037FFAC4 + stmdb sp!, {r3, lr} + ldr ip, _037FFAEC ; =status_checked$3825 + mov r2, #1 + ldr r0, _037FFAF0 ; =buf$3759 + ldr r3, _037FFAF4 ; =CARDi_CommWriteCore + mov r1, #0 + str r2, [ip, #4] + bl CARDi_CommArray + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FFAEC: .word status_checked$3825 +_037FFAF0: .word buf$3759 +_037FFAF4: .word CARDi_CommWriteCore + arm_func_end CARDi_WriteEnable + + arm_func_start CARDi_SendSpiAddressingCommand +CARDi_SendSpiAddressingCommand: ; 0x037FFAF8 + stmdb sp!, {r3, lr} + ldr r2, _037FFB90 ; =cardi_common + ldr r2, [r2] + ldr r2, [r2, #0x28] + cmp r2, #1 + beq _037FFB24 + cmp r2, #2 + beq _037FFB40 + cmp r2, #3 + beq _037FFB58 + b _037FFB74 +_037FFB24: + mov r3, r0, lsr #5 + and r3, r3, #8 + mov ip, r0, lsl #0x18 + orr r0, r1, r3 + orr r0, r0, ip, lsr #16 + str r0, [sp] + b _037FFB74 +_037FFB40: + and r3, r0, #0xff00 + mov ip, r0, lsl #0x18 + orr r0, r1, r3 + orr r0, r0, ip, lsr #8 + str r0, [sp] + b _037FFB74 +_037FFB58: + mov r3, r0, lsr #8 + and r3, r3, #0xff00 + and ip, r0, #0xff00 + orr r1, r1, r3 + orr r1, r1, ip, lsl #8 + orr r0, r1, r0, lsl #24 + str r0, [sp] +_037FFB74: + ldr r3, _037FFB94 ; =CARDi_CommWriteCore + add r0, sp, #0 + add r2, r2, #1 + mov r1, #0 + bl CARDi_CommArray + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_037FFB90: .word cardi_common +_037FFB94: .word CARDi_CommWriteCore + arm_func_end CARDi_SendSpiAddressingCommand + + arm_func_start CARDi_InitStatusRegister +CARDi_InitStatusRegister: ; 0x037FFB98 + stmdb sp!, {r4, lr} + ldr r0, _037FFBE8 ; =cardi_common + ldr r0, [r0] + ldrb r4, [r0, #0x54] + cmp r4, #0xff + beq _037FFBE0 + ldr r0, _037FFBEC ; =status_checked$3825 + ldr r0, [r0] + cmp r0, #0 + bne _037FFBE0 + bl CARDi_CommandReadStatus + cmp r4, r0 + beq _037FFBD4 + mov r0, r4 + bl CARDi_SetWriteProtectCore +_037FFBD4: + ldr r0, _037FFBEC ; =status_checked$3825 + mov r1, #1 + str r1, [r0] +_037FFBE0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FFBE8: .word cardi_common +_037FFBEC: .word status_checked$3825 + arm_func_end CARDi_InitStatusRegister + + arm_func_start CARDi_ReadBackupCore +CARDi_ReadBackupCore: ; 0x037FFBF0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFC48 + ldr r0, _037FFC50 ; =cardi_common + ldr r2, _037FFC54 ; =status_checked$3825 + ldr r1, [r0] + mov r0, r6 + ldr r3, [r1, #0x28] + mov r1, #3 + add r3, r3, #1 + add r3, r3, r4 + str r3, [r2, #4] + bl CARDi_SendSpiAddressingCommand + ldr r3, _037FFC58 ; =CARDi_CommReadCore + mov r1, r5 + mov r2, r4 + mov r0, #0 + bl CARDi_CommArray +_037FFC48: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_037FFC50: .word cardi_common +_037FFC54: .word status_checked$3825 +_037FFC58: .word CARDi_CommReadCore + arm_func_end CARDi_ReadBackupCore + + arm_func_start CARDi_ProgramBackupCore +CARDi_ProgramBackupCore: ; 0x037FFC5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFD00 + ldr r0, _037FFD08 ; =cardi_common + ldr fp, _037FFD0C ; =status_checked$3825 + ldr r5, [r0] + ldr r6, [r5, #0x24] + sub r4, r6, #1 + b _037FFCF8 +_037FFC90: + and r0, sl, r4 + sub r7, r6, r0 + cmp r7, r8 + movhi r7, r8 + bl CARDi_WriteEnable + ldr r1, [r5, #0x28] + mov r0, sl + add r1, r1, #1 + add r1, r1, r7 + str r1, [fp, #4] + mov r1, #2 + bl CARDi_SendSpiAddressingCommand + ldr r3, _037FFD10 ; =CARDi_CommWriteCore + mov r0, sb + mov r1, #0 + mov r2, r7 + bl CARDi_CommArray + ldr r0, [r5, #0x2c] + mov r1, #0 + bl CARDi_CommandEnd + ldr r0, [r5] + cmp r0, #0 + bne _037FFD00 + add sb, sb, r7 + add sl, sl, r7 + sub r8, r8, r7 +_037FFCF8: + cmp r8, #0 + bne _037FFC90 +_037FFD00: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FFD08: .word cardi_common +_037FFD0C: .word status_checked$3825 +_037FFD10: .word CARDi_CommWriteCore + arm_func_end CARDi_ProgramBackupCore + + arm_func_start CARDi_WriteBackupCore +CARDi_WriteBackupCore: ; 0x037FFD14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + mov sb, r1 + mov r8, r2 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFDB8 + ldr r0, _037FFDC0 ; =cardi_common + ldr fp, _037FFDC4 ; =status_checked$3825 + ldr r5, [r0] + ldr r6, [r5, #0x24] + sub r4, r6, #1 + b _037FFDB0 +_037FFD48: + and r0, sl, r4 + sub r7, r6, r0 + cmp r7, r8 + movhi r7, r8 + bl CARDi_WriteEnable + ldr r1, [r5, #0x28] + mov r0, sl + add r1, r1, #1 + add r1, r1, r7 + str r1, [fp, #4] + mov r1, #0xa + bl CARDi_SendSpiAddressingCommand + ldr r3, _037FFDC8 ; =CARDi_CommWriteCore + mov r0, sb + mov r1, #0 + mov r2, r7 + bl CARDi_CommArray + ldr r0, [r5, #0x30] + ldr r1, [r5, #0x34] + bl CARDi_CommandEnd + ldr r0, [r5] + cmp r0, #0 + bne _037FFDB8 + add sb, sb, r7 + add sl, sl, r7 + sub r8, r8, r7 +_037FFDB0: + cmp r8, #0 + bne _037FFD48 +_037FFDB8: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_037FFDC0: .word cardi_common +_037FFDC4: .word status_checked$3825 +_037FFDC8: .word CARDi_CommWriteCore + arm_func_end CARDi_WriteBackupCore + + arm_func_start CARDi_VerifyBackupCore +CARDi_VerifyBackupCore: ; 0x037FFDCC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFE48 + ldr r0, _037FFE50 ; =cardi_common + ldr r2, _037FFE54 ; =status_checked$3825 + ldr r4, [r0] + mov r0, #1 + str r0, [r2, #0x10] + ldr r1, [r4, #0x28] + mov r0, r7 + add r1, r1, #1 + add r3, r1, r5 + mov r1, #3 + str r3, [r2, #4] + bl CARDi_SendSpiAddressingCommand + ldr r3, _037FFE58 ; =CARDi_CommVerifyCore + mov r0, r6 + mov r2, r5 + mov r1, #0 + bl CARDi_CommArray + ldr r0, [r4] + cmp r0, #0 + ldreq r0, _037FFE54 ; =status_checked$3825 + ldreq r0, [r0, #0x10] + cmpeq r0, #0 + moveq r0, #1 + streq r0, [r4] +_037FFE48: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_037FFE50: .word cardi_common +_037FFE54: .word status_checked$3825 +_037FFE58: .word CARDi_CommVerifyCore + arm_func_end CARDi_VerifyBackupCore + + arm_func_start CARDi_EraseBackupSectorCore +CARDi_EraseBackupSectorCore: ; 0x037FFE5C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _037FFEF0 ; =cardi_common + mov r7, r0 + ldr r4, [r2] + mov r6, r1 + ldr r5, [r4, #0x1c] + orr r0, r7, r6 + sub r1, r5, #1 + tst r1, r0 + movne r0, #2 + strne r0, [r4] + bne _037FFEE8 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFEE8 + ldr r8, _037FFEF4 ; =status_checked$3825 + mov sb, #0xd8 + b _037FFEE0 +_037FFEA4: + bl CARDi_WriteEnable + ldr r1, [r4, #0x28] + mov r0, r7 + add r1, r1, #1 + str r1, [r8, #4] + mov r1, sb + bl CARDi_SendSpiAddressingCommand + ldr r0, [r4, #0x40] + ldr r1, [r4, #0x44] + bl CARDi_CommandEnd + ldr r0, [r4] + cmp r0, #0 + bne _037FFEE8 + add r7, r7, r5 + sub r6, r6, r5 +_037FFEE0: + cmp r6, #0 + bne _037FFEA4 +_037FFEE8: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_037FFEF0: .word cardi_common +_037FFEF4: .word status_checked$3825 + arm_func_end CARDi_EraseBackupSectorCore + + arm_func_start CARDi_EraseBackupSubSectorCore +CARDi_EraseBackupSubSectorCore: ; 0x037FFEF8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _037FFF8C ; =cardi_common + mov r7, r0 + ldr r4, [r2] + mov r6, r1 + ldr r5, [r4, #0x20] + orr r0, r7, r6 + sub r1, r5, #1 + tst r1, r0 + movne r0, #2 + strne r0, [r4] + bne _037FFF84 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFF84 + ldr r8, _037FFF90 ; =status_checked$3825 + mov sb, #0x20 + b _037FFF7C +_037FFF40: + bl CARDi_WriteEnable + ldr r1, [r4, #0x28] + mov r0, r7 + add r1, r1, #1 + str r1, [r8, #4] + mov r1, sb + bl CARDi_SendSpiAddressingCommand + ldr r0, [r4, #0x48] + ldr r1, [r4, #0x4c] + bl CARDi_CommandEnd + ldr r0, [r4] + cmp r0, #0 + bne _037FFF84 + add r7, r7, r5 + sub r6, r6, r5 +_037FFF7C: + cmp r6, #0 + bne _037FFF40 +_037FFF84: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_037FFF8C: .word cardi_common +_037FFF90: .word status_checked$3825 + arm_func_end CARDi_EraseBackupSubSectorCore + + arm_func_start CARDi_EraseChipCore +CARDi_EraseChipCore: ; 0x037FFF94 + stmdb sp!, {r4, lr} + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _037FFFD8 + ldr r0, _037FFFE0 ; =cardi_common + ldr r4, [r0] + bl CARDi_WriteEnable + ldr r1, _037FFFE4 ; =status_checked$3825 + mov r2, #1 + ldr r0, _037FFFE8 ; =arg$3806 + ldr r3, _037FFFEC ; =CARDi_CommWriteCore + str r2, [r1, #4] + mov r1, #0 + bl CARDi_CommArray + ldr r0, [r4, #0x38] + ldr r1, [r4, #0x3c] + bl CARDi_CommandEnd +_037FFFD8: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FFFE0: .word cardi_common +_037FFFE4: .word status_checked$3825 +_037FFFE8: .word arg$3806 +_037FFFEC: .word CARDi_CommWriteCore + arm_func_end CARDi_EraseChipCore + + arm_func_start CARDi_SetWriteProtectCore +CARDi_SetWriteProtectCore: ; 0x037FFFF0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, r0 + bl CARDi_WaitPrevCommand + cmp r0, #0 + beq _03800074 + ldr r0, _0380007C ; =cardi_common + strb r4, [sp, #1] + mov r1, #1 + ldr sb, [r0] + ldr r5, _03800080 ; =CARDi_CommWriteCore + ldr r4, _03800084 ; =status_checked$3825 + strb r1, [sp] + mov sl, #0xa + add r7, sp, #0 + mov r8, #2 + mov r6, #0 + mov fp, #5 +_03800034: + bl CARDi_WriteEnable + mov r0, r7 + str r8, [r4, #4] + mov r1, r6 + mov r2, r8 + mov r3, r5 + bl CARDi_CommArray + mov r0, fp + mov r1, #0 + bl CARDi_CommandEnd + ldr r0, [sb] + cmp r0, #4 + bne _03800074 + sub sl, sl, #1 + cmp sl, #0 + bgt _03800034 +_03800074: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_0380007C: .word cardi_common +_03800080: .word CARDi_CommWriteCore +_03800084: .word status_checked$3825 + arm_func_end CARDi_SetWriteProtectCore + + arm_func_start CARDi_SetRomOp +CARDi_SetRomOp: ; 0x03800088 + ldr r3, _038000E0 ; =0x040001A4 +_0380008C: + ldr r2, [r3] + tst r2, #-0x80000000 + bne _0380008C + ldr r3, _038000E4 ; =0x040001A1 + mov r2, #0xc0 + strb r2, [r3] + mov r2, r0, lsr #0x18 + strb r2, [r3, #7] + mov r2, r0, lsr #0x10 + strb r2, [r3, #8] + mov r2, r0, lsr #8 + strb r2, [r3, #9] + strb r0, [r3, #0xa] + mov r0, r1, lsr #0x18 + strb r0, [r3, #0xb] + mov r0, r1, lsr #0x10 + strb r0, [r3, #0xc] + mov r0, r1, lsr #8 + strb r0, [r3, #0xd] + strb r1, [r3, #0xe] + bx lr + .align 2, 0 +_038000E0: .word 0x040001A4 +_038000E4: .word 0x040001A1 + arm_func_end CARDi_SetRomOp + + arm_func_start CARDi_ReadEnd +CARDi_ReadEnd: ; 0x038000E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r4, _03800158 ; =cardi_common + mov r1, #0 + ldr r0, [r4] + str r1, [r0] + ldr r7, [r4, #0x3c] + ldr r6, [r4, #0x40] + bl OS_DisableInterrupts + ldr r1, [r4, #0xfc] + mov r5, r0 + bic r0, r1, #0x4c + str r0, [r4, #0xfc] + add r0, r4, #0xf4 + bl OS_WakeupThread + ldr r0, [r4, #0xfc] + tst r0, #0x10 + beq _03800134 + add r0, r4, #0x48 + bl OS_WakeupThreadDirect +_03800134: + mov r0, r5 + bl OS_RestoreInterrupts + cmp r7, #0 + beq _03800150 + mov r0, r6 + mov lr, pc + bx r7 +_03800150: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03800158: .word cardi_common + arm_func_end CARDi_ReadEnd + + arm_func_start CARDi_GetRomFlag +CARDi_GetRomFlag: ; 0x0380015C + ldr r1, _03800178 ; =cardi_rom_header_addr + ldr r1, [r1] + ldr r1, [r1, #0x60] + bic r1, r1, #0x7000000 + orr r0, r1, r0 + orr r0, r0, #0xa0000000 + bx lr + .align 2, 0 +_03800178: .word cardi_rom_header_addr + arm_func_end CARDi_GetRomFlag + + arm_func_start CARDi_ReadCard +CARDi_ReadCard: ; 0x0380017C + bx lr + arm_func_end CARDi_ReadCard + + arm_func_start CARDi_ReadRomIDCore +CARDi_ReadRomIDCore: ; 0x03800180 + stmdb sp!, {r3, lr} + mov r0, #-0x48000000 + mov r1, #0 + bl CARDi_SetRomOp + mov r0, #0x7000000 + bl CARDi_GetRomFlag + mov r1, #0x2000 + rsb r1, r1, #0 + ldr r2, _038001C8 ; =0x040001A4 + and r0, r0, r1 + str r0, [r2] +_038001AC: + ldr r0, [r2] + tst r0, #0x800000 + beq _038001AC + ldr r0, _038001CC ; =0x04100010 + ldr r0, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038001C8: .word 0x040001A4 +_038001CC: .word 0x04100010 + arm_func_end CARDi_ReadRomIDCore + + arm_func_start CARDi_ReadRomID +CARDi_ReadRomID: ; 0x038001D0 + stmdb sp!, {r4, lr} + ldr r0, _038001FC ; =cardi_common + mov r1, #0 + mov r2, r1 + bl CARDi_WaitTask + bl CARDi_ReadRomIDCore + mov r4, r0 + bl CARDi_ReadEnd + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_038001FC: .word cardi_common + arm_func_end CARDi_ReadRomID + + arm_func_start CARDi_WaitTask +CARDi_WaitTask: ; 0x03800200 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + bl OS_DisableInterrupts + mov r4, r0 + b _03800224 +_0380021C: + add r0, r7, #0xf4 + bl OS_SleepThread +_03800224: + ldr r0, [r7, #0xfc] + tst r0, #4 + bne _0380021C + ldr r1, [r7, #0xfc] + mov r0, r4 + orr r1, r1, #4 + str r1, [r7, #0xfc] + str r6, [r7, #0x3c] + str r5, [r7, #0x40] + bl OS_RestoreInterrupts + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end CARDi_WaitTask + + arm_func_start CARD_Init +CARD_Init: ; 0x03800254 + stmdb sp!, {r3, lr} + ldr ip, _038002B4 ; =cardi_common + ldr r0, [ip, #0xfc] + cmp r0, #0 + bne _038002AC + ldr r0, _038002B8 ; =cardi_rom_base + mov r2, #0 + sub r1, r2, #1 + mov r3, #1 + str r3, [ip, #0xfc] + str r2, [ip, #0x28] + str r2, [ip, #0x24] + str r2, [ip, #0x20] + str r1, [ip, #0x2c] + str r2, [ip, #0x3c] + str r2, [ip, #0x40] + str r2, [r0] + bl CARDi_InitCommon + ldr r1, _038002BC ; =CARDi_ReadCard + ldr r0, _038002C0 ; =rom_stat + str r1, [r0] + bl CARD_InitPulledOutCallback +_038002AC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038002B4: .word cardi_common +_038002B8: .word cardi_rom_base +_038002BC: .word CARDi_ReadCard +_038002C0: .word rom_stat + arm_func_end CARD_Init + + arm_func_start CARDi_OnFifoRecv +CARDi_OnFifoRecv: ; 0x038002C4 + stmdb sp!, {r3, lr} + cmp r0, #0xb + bne _0380039C + cmp r2, #0 + beq _0380039C + ldr r0, _038003A4 ; =cardi_common + ldr r2, [r0, #8] + cmp r2, #0 + streq r1, [r0, #4] + ldr r2, [r0, #4] + cmp r2, #0xf + addls pc, pc, r2, lsl #2 + b _03800368 +_038002F8: ; jump table + b _03800338 ; case 0 + b _03800368 ; case 1 + b _0380035C ; case 2 + b _0380035C ; case 3 + b _0380035C ; case 4 + b _0380035C ; case 5 + b _0380035C ; case 6 + b _0380035C ; case 7 + b _0380035C ; case 8 + b _0380035C ; case 9 + b _0380035C ; case 10 + b _0380035C ; case 11 + b _0380035C ; case 12 + b _0380035C ; case 13 + b _0380035C ; case 14 + b _0380035C ; case 15 +_03800338: + ldr r2, [r0, #8] + cmp r2, #0 + beq _03800368 + cmp r2, #1 + ldreq r2, [r0, #0xfc] + streq r1, [r0] + orreq r1, r2, #0x10 + streq r1, [r0, #0xfc] + b _03800368 +_0380035C: + ldr r1, [r0, #0xfc] + orr r1, r1, #0x10 + str r1, [r0, #0xfc] +_03800368: + ldr r1, [r0, #0xfc] + tst r1, #0x10 + ldreq r1, [r0, #8] + addeq r1, r1, #1 + streq r1, [r0, #8] + beq _0380039C + ldr r1, [r0, #0xfc] + mov r2, #0 + str r2, [r0, #8] + tst r1, #4 + ldrne r0, [r0, #0xec] + addeq r0, r0, #0x48 + bl OS_WakeupThreadDirect +_0380039C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038003A4: .word cardi_common + arm_func_end CARDi_OnFifoRecv + + arm_func_start CARDi_TaskThread +CARDi_TaskThread: ; 0x038003A8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _038005D8 ; =cardi_common +_038003B0: + mov r5, #0 + bl OS_DisableInterrupts + mov r6, r0 + add r8, r4, #0x48 + mov r7, r5 +_038003C4: + ldr r0, [r4, #0xfc] + tst r0, #4 + bne _038003FC + ldr r0, [r4, #0xfc] + tst r0, #0x10 + beq _03800408 + ldr r0, [r4, #0xfc] + mov r5, #1 + orr r0, r0, #4 + str r0, [r4, #0xfc] + ldr r0, [r4, #0xfc] + bic r0, r0, #0x10 + str r0, [r4, #0xfc] + b _03800418 +_038003FC: + ldr r0, [r4, #0xfc] + tst r0, #8 + bne _03800418 +_03800408: + mov r0, r7 + str r8, [r4, #0xec] + bl OS_SleepThread + b _038003C4 +_03800418: + mov r0, r6 + bl OS_RestoreInterrupts + cmp r5, #0 + beq _038005C4 + ldr r0, [r4] + mov r1, #0 + str r1, [r0] + ldr r3, [r4] + ldr r2, [r4, #4] + ldr r1, [r3, #0x58] + mov r0, #1 + tst r1, r0, lsl r2 + moveq r0, #3 + streq r0, [r3] + beq _03800568 + cmp r2, #0xf + addls pc, pc, r2, lsl #2 + b _03800560 +_03800460: ; jump table + b _03800568 ; case 0 + b _03800568 ; case 1 + b _038004A0 ; case 2 + b _038004A8 ; case 3 + b _038004B8 ; case 4 + b _03800560 ; case 5 + b _038004C4 ; case 6 + b _038004D8 ; case 7 + b _038004EC ; case 8 + b _03800500 ; case 9 + b _03800560 ; case 10 + b _03800514 ; case 11 + b _03800534 ; case 12 + b _0380053C ; case 13 + b _03800550 ; case 14 + b _03800524 ; case 15 +_038004A0: + bl CARDi_InitStatusRegister + b _03800568 +_038004A8: + bl CARDi_ReadRomIDCore + ldr r1, [r4] + str r0, [r1, #8] + b _03800568 +_038004B8: + mov r0, #3 + str r0, [r3] + b _03800568 +_038004C4: + ldr r0, [r3, #0xc] + ldr r1, [r3, #0x10] + ldr r2, [r3, #0x14] + bl CARDi_ReadBackupCore + b _03800568 +_038004D8: + ldr r0, [r3, #0x10] + ldr r1, [r3, #0xc] + ldr r2, [r3, #0x14] + bl CARDi_WriteBackupCore + b _03800568 +_038004EC: + ldr r0, [r3, #0x10] + ldr r1, [r3, #0xc] + ldr r2, [r3, #0x14] + bl CARDi_ProgramBackupCore + b _03800568 +_03800500: + ldr r0, [r3, #0x10] + ldr r1, [r3, #0xc] + ldr r2, [r3, #0x14] + bl CARDi_VerifyBackupCore + b _03800568 +_03800514: + ldr r0, [r3, #0x10] + ldr r1, [r3, #0x14] + bl CARDi_EraseBackupSectorCore + b _03800568 +_03800524: + ldr r0, [r3, #0x10] + ldr r1, [r3, #0x14] + bl CARDi_EraseBackupSubSectorCore + b _03800568 +_03800534: + bl CARDi_EraseChipCore + b _03800568 +_0380053C: + bl CARDi_CommandReadStatus + ldr r1, [r4] + ldr r1, [r1, #0x10] + strb r0, [r1] + b _03800568 +_03800550: + ldr r0, [r3, #0xc] + ldrb r0, [r0] + bl CARDi_SetWriteProtectCore + b _03800568 +_03800560: + mov r0, #3 + str r0, [r3] +_03800568: + mov r6, #0xb + mov r5, #1 +_03800570: + mov r0, r6 + mov r1, r5 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03800570 + bl OS_DisableInterrupts + ldr r1, [r4, #0xfc] + mov r5, r0 + bic r0, r1, #0x4c + str r0, [r4, #0xfc] + add r0, r4, #0xf4 + bl OS_WakeupThread + ldr r0, [r4, #0xfc] + tst r0, #0x10 + beq _038005B8 + add r0, r4, #0x48 + bl OS_WakeupThreadDirect +_038005B8: + mov r0, r5 + bl OS_RestoreInterrupts + b _038003B0 +_038005C4: + ldr r1, [r4, #0x44] + mov r0, r4 + mov lr, pc + bx r1 + b _038003B0 + .align 2, 0 +_038005D8: .word cardi_common + arm_func_end CARDi_TaskThread + + arm_func_start CARD_InitPulledOutCallback +CARD_InitPulledOutCallback: ; 0x038005DC + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0380062C ; =skipCheck$3668 + ldr r1, [r0, #8] + cmp r1, #0 + bne _03800624 + mov r1, #1 + str r1, [r0, #8] + bl PXI_Init + mov r5, #0xe + mov r4, #0 +_03800604: + mov r0, r5 + mov r1, r4 + bl PXI_IsCallbackReady + cmp r0, #0 + beq _03800604 + ldr r1, _03800630 ; =CARDi_CallbackForPulledOut + mov r0, #0xe + bl PXI_SetFifoRecvCallback +_03800624: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0380062C: .word skipCheck$3668 +_03800630: .word CARDi_CallbackForPulledOut + arm_func_end CARD_InitPulledOutCallback + + arm_func_start CARDi_CallbackForPulledOut +CARDi_CallbackForPulledOut: ; 0x03800634 + stmdb sp!, {r4, lr} + and r0, r1, #0x3f + cmp r0, #1 + bne _0380068C + mov r0, #0 + bl MI_StopDma + mov r0, #1 + bl MI_StopDma + mov r0, #2 + bl MI_StopDma + mov r0, #3 + bl MI_StopDma + mov r0, #0 + bl CTRDG_VibPulseEdgeUpdate + bl OS_DisableInterrupts + mov r4, r0 + bl SND_BeginSleep + bl WVR_Shutdown + mov r0, r4 + bl OS_RestoreInterrupts + bl OS_Terminate + b _03800690 +_0380068C: + bl OS_Terminate +_03800690: + ldmia sp!, {r4, lr} + bx lr + arm_func_end CARDi_CallbackForPulledOut + + arm_func_start CARD_IsPulledOut +CARD_IsPulledOut: ; 0x03800698 + stmdb sp!, {r3, lr} + ldr r0, _038006D8 ; =skipCheck$3668 + ldr r0, [r0, #0xc] + cmp r0, #0 + bne _038006C8 + ldr r0, _038006DC ; =0x027FFE1F + ldrb r0, [r0] + tst r0, #0x80 + beq _038006C4 + bl CARD_CompareCardID + b _038006C8 +_038006C4: + bl CARD_IsCardIreqLo +_038006C8: + ldr r0, _038006D8 ; =skipCheck$3668 + ldr r0, [r0, #0xc] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038006D8: .word skipCheck$3668 +_038006DC: .word 0x027FFE1F + arm_func_end CARD_IsPulledOut + + arm_func_start CARD_CompareCardID +CARD_CompareCardID: ; 0x038006E0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #1 + bl OS_GetLockID + mov r4, r0 + mvn r0, #2 + cmp r4, r0 + beq _03800758 + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 + bl OS_TryLockCard + cmp r0, #0 + bne _0380074C + ldr r1, _03800778 ; =0x027FFC10 + ldrh r0, [r1] + cmp r0, #0 + subeq r0, r1, #0x410 + subne r0, r1, #0x10 + ldr r0, [r0] + str r0, [sp] + bl CARDi_ReadRomID + ldr r1, [sp] + cmp r0, r1 + mov r0, r4, lsl #0x10 + moveq r5, #1 + mov r0, r0, lsr #0x10 + movne r5, #0 + bl OS_UnlockCard +_0380074C: + mov r0, r4, lsl #0x10 + mov r0, r0, lsr #0x10 + bl OS_ReleaseLockID +_03800758: + ldr r1, _0380077C ; =skipCheck$3668 + cmp r5, #0 + moveq r2, #1 + movne r2, #0 + str r2, [r1, #0xc] + mov r0, r5 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_03800778: .word 0x027FFC10 +_0380077C: .word skipCheck$3668 + arm_func_end CARD_CompareCardID + + arm_func_start CARD_IsCardIreqLo +CARD_IsCardIreqLo: ; 0x03800780 + ldr r0, _038007A4 ; =0x04000214 + mov r2, #1 + ldr r1, [r0] + mov r0, r2 + tst r1, #0x100000 + ldrne r1, _038007A8 ; =skipCheck$3668 + movne r0, #0 + strne r2, [r1, #0xc] + bx lr + .align 2, 0 +_038007A4: .word 0x04000214 +_038007A8: .word skipCheck$3668 + arm_func_end CARD_IsCardIreqLo + + arm_func_start CARD_CheckPullOut_Polling +CARD_CheckPullOut_Polling: ; 0x038007AC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _03800898 ; =skipCheck$3668 + ldr r0, [r0, #4] + cmp r0, #0 + bne _03800890 + ldr r2, _0380089C ; =0x027FFC40 + ldrh r0, [r2] + cmp r0, #2 + beq _03800890 + ldr r1, _038008A0 ; =nextCount$3668 + mvn r0, #0 + ldr r3, [r1] + cmp r3, r0 + ldreq r0, [r2, #-4] + addeq r0, r0, #0xa + streq r0, [r1] + beq _03800890 + ldr r0, [r2, #-4]! + cmp r0, r3 + blo _03800890 + ldr r0, [r2] + add r0, r0, #0xa + str r0, [r1] + bl CARD_IsPulledOut + cmp r0, #0 + beq _03800840 + ldr r0, _03800898 ; =skipCheck$3668 + mov r1, #1 + str r1, [r0, #4] + bl CARD_GetRomHeader + ldr r0, [r0, #0xc] + cmp r0, #0 + bne _03800840 + ldr r0, _038008A0 ; =nextCount$3668 + ldr r0, [r0, #4] + cmp r0, #0 + bne _03800890 +_03800840: + ldr r0, _03800898 ; =skipCheck$3668 + ldr r1, _038008A0 ; =nextCount$3668 + ldr r0, [r0, #4] + mov r2, #0 + str r2, [r1, #4] + cmp r0, #0 + beq _03800890 + mov r7, #0x64 + mov r6, #0xe + mov r5, #0x11 + mov r4, r2 + b _03800878 +_03800870: + mov r0, r7 + bl VENEER_SVC_WaitByLoop +_03800878: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _03800870 +_03800890: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03800898: .word skipCheck$3668 +_0380089C: .word 0x027FFC40 +_038008A0: .word nextCount$3668 + arm_func_end CARD_CheckPullOut_Polling + + .rodata + +SinTable: ; 0x0380664C + .byte 0x00, 0x06, 0x0C, 0x13 + .byte 0x19, 0x1F, 0x25, 0x2B, 0x31, 0x36, 0x3C, 0x41, 0x47, 0x4C, 0x51, 0x55, 0x5A, 0x5E, 0x62, 0x66 + .byte 0x6A, 0x6D, 0x70, 0x73, 0x75, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F + + .balign 4, 0 + +SNDi_DecibelTable: ; 0x03806670 + .byte 0x00, 0x80, 0x2E, 0xFD, 0x2F, 0xFD, 0x75, 0xFD, 0xA7, 0xFD, 0xCE, 0xFD, 0xEE, 0xFD, 0x09, 0xFE + .byte 0x20, 0xFE, 0x34, 0xFE, 0x46, 0xFE, 0x57, 0xFE, 0x66, 0xFE, 0x74, 0xFE, 0x81, 0xFE, 0x8D, 0xFE + .byte 0x98, 0xFE, 0xA3, 0xFE, 0xAD, 0xFE, 0xB6, 0xFE, 0xBF, 0xFE, 0xC7, 0xFE, 0xCF, 0xFE, 0xD7, 0xFE + .byte 0xDF, 0xFE, 0xE6, 0xFE, 0xEC, 0xFE, 0xF3, 0xFE, 0xF9, 0xFE, 0xFF, 0xFE, 0x05, 0xFF, 0x0B, 0xFF + .byte 0x11, 0xFF, 0x16, 0xFF, 0x1B, 0xFF, 0x20, 0xFF, 0x25, 0xFF, 0x2A, 0xFF, 0x2E, 0xFF, 0x33, 0xFF + .byte 0x37, 0xFF, 0x3C, 0xFF, 0x40, 0xFF, 0x44, 0xFF, 0x48, 0xFF, 0x4C, 0xFF, 0x50, 0xFF, 0x53, 0xFF + .byte 0x57, 0xFF, 0x5B, 0xFF, 0x5E, 0xFF, 0x62, 0xFF, 0x65, 0xFF, 0x68, 0xFF, 0x6B, 0xFF, 0x6F, 0xFF + .byte 0x72, 0xFF, 0x75, 0xFF, 0x78, 0xFF, 0x7B, 0xFF, 0x7E, 0xFF, 0x81, 0xFF, 0x83, 0xFF, 0x86, 0xFF + .byte 0x89, 0xFF, 0x8C, 0xFF, 0x8E, 0xFF, 0x91, 0xFF, 0x93, 0xFF, 0x96, 0xFF, 0x99, 0xFF, 0x9B, 0xFF + .byte 0x9D, 0xFF, 0xA0, 0xFF, 0xA2, 0xFF, 0xA5, 0xFF, 0xA7, 0xFF, 0xA9, 0xFF, 0xAB, 0xFF, 0xAE, 0xFF + .byte 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0xFF, 0xB6, 0xFF, 0xB8, 0xFF, 0xBA, 0xFF, 0xBC, 0xFF, 0xBE, 0xFF + .byte 0xC0, 0xFF, 0xC2, 0xFF, 0xC4, 0xFF, 0xC6, 0xFF, 0xC8, 0xFF, 0xCA, 0xFF, 0xCC, 0xFF, 0xCE, 0xFF + .byte 0xCF, 0xFF, 0xD1, 0xFF, 0xD3, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD8, 0xFF, 0xDA, 0xFF, 0xDC, 0xFF + .byte 0xDD, 0xFF, 0xDF, 0xFF, 0xE1, 0xFF, 0xE2, 0xFF, 0xE4, 0xFF, 0xE5, 0xFF, 0xE7, 0xFF, 0xE9, 0xFF + .byte 0xEA, 0xFF, 0xEC, 0xFF, 0xED, 0xFF, 0xEF, 0xFF, 0xF0, 0xFF, 0xF2, 0xFF, 0xF3, 0xFF, 0xF5, 0xFF + .byte 0xF6, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, 0xFA, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00 + +shift$4005: ; 0x03806770 + .byte 0x00, 0x01, 0x02, 0x04 + +channel_order$3829: ; 0x03806774 + .byte 0x04, 0x05, 0x06, 0x07, 0x02, 0x00, 0x03, 0x01, 0x08, 0x09, 0x0A, 0x0B + .byte 0x0E, 0x0C, 0x0F, 0x0D + +attack_table$3790: ; 0x03806784 + .byte 0x00, 0x01, 0x05, 0x0E, 0x1A, 0x26, 0x33, 0x3F, 0x49, 0x54, 0x5C, 0x64 + .byte 0x6D, 0x74, 0x7B, 0x7F, 0x84, 0x89, 0x8F + + .balign 4, 0 +arg$3806: ; 0x03806798 + .byte 0xC7 + + .balign 4, 0 +arg$3983: ; 0x0380679C + .byte 0x05 + + .balign 4, 0 +buf$3759: ; 0x038067A0 + .byte 0x06 + + .section .data,4,1,1 + +sMasterPan: ; 0x03806AEC + .word 0xFFFFFFFF + +u$3681: ; 0x03806AF0 + .word 0x12345678 + +_03806AF4: + .byte 50 + + .balign 4, 0 +_03806AF8: + .word 1 + +cardi_rom_header_addr: ; 0x03806AFC + .word 0x027FFE00 + +nextCount$3668: ; 0x03806B00 + .word 0xFFFFFFFF + +isFirstCheck$3676: ; 0x03806B04 + .word 1 + + .bss + + .type PADi_XYButtonAlarm,@object + .public PADi_XYButtonAlarm +PADi_XYButtonAlarm: ; 0x03806E80 + .space 0x2C + .size PADi_XYButtonAlarm,.-PADi_XYButtonAlarm + + .type sSurroundDecay,@object +sSurroundDecay: ; 0x03806EAC + .space 0x4 + .size sSurroundDecay,.-sSurroundDecay + + .type sOrgPan,@object +sOrgPan: ; 0x03806EB0 + .space 0x10 + .size sOrgPan,.-sOrgPan + + .type sOrgVolume,@object +sOrgVolume: ; 0x03806EC0 + .space 0x10 + .size sOrgVolume,.-sOrgVolume + + .type initialized$3619,@object +initialized$3619: ; 0x03806ED0 + .space 0x4 + .size initialized$3619,.-initialized$3619 + + .type sndMesgBuffer,@object +sndMesgBuffer: ; 0x03806ED4 + .space 0x20 + .size sndMesgBuffer,.-sndMesgBuffer + + .type sndMesgQueue,@object +sndMesgQueue: ; 0x03806EF4 + .space 0x20 + .size sndMesgQueue,.-sndMesgQueue + + .type sndAlarm,@object +sndAlarm: ; 0x03806F14 + .space 0x2C + .size sndAlarm,.-sndAlarm + + .type sndThread,@object +sndThread: ; 0x03806F40 + .space 0xA4 + .size sndThread,.-sndThread + + .type sndStack,@object +sndStack: ; 0x03806FE4 + .space 0x400 + .size sndStack,.-sndStack + + .type sWeakLockChannel,@object +sWeakLockChannel: ; 0x038073E4 + .space 0x4 + .size sWeakLockChannel,.-sWeakLockChannel + + .type sLockChannel,@object +sLockChannel: ; 0x038073E8 + .space 0x4 + .size sLockChannel,.-sLockChannel + + .type sMmlPrintEnable,@object +sMmlPrintEnable: ; 0x038073EC + .space 0x4 + .size sMmlPrintEnable,.-sMmlPrintEnable + + .type seqCache,@object +seqCache: ; 0x038073F0 + .space 0x18 + .size seqCache,.-seqCache + + .type SNDi_SharedWork,@object +SNDi_SharedWork: ; 0x03807408 + .space 0x4 + .size SNDi_SharedWork,.-SNDi_SharedWork + + .type SNDi_Work,@object +SNDi_Work: ; 0x0380740C + .space 0x1180 + .size SNDi_Work,.-SNDi_Work + + .type sCommandMesgQueue,@object +sCommandMesgQueue: ; 0x0380858C + .space 0x20 + .size sCommandMesgQueue,.-sCommandMesgQueue + + .type sCommandMesgBuffer,@object +sCommandMesgBuffer: ; 0x038085AC + .space 0x20 + .size sCommandMesgBuffer,.-sCommandMesgBuffer + + .type CARDi_EnableFlag,@object +CARDi_EnableFlag: ; 0x038085CC + .space 0x4 + .size CARDi_EnableFlag,.-CARDi_EnableFlag + + .balign 32, 0 + .type cardi_common,@object +cardi_common: ; 0x038085E0 + .space 0x200 + .size cardi_common,.-cardi_common + + .type cardi_thread_stack,@object +cardi_thread_stack: ; 0x038087E0 + .space 0x400 + .size cardi_thread_stack,.-cardi_thread_stack + + .type status_checked$3825,@object +status_checked$3825: ; 0x03808BE0 + .space 0x4 + .size status_checked$3825,.-status_checked$3825 + + .type cardi_param,@object +cardi_param: ; 0x03808BE4 + .space 0x10 + .size cardi_param,.-cardi_param + + .type cardi_rom_base,@object +cardi_rom_base: ; 0x03808BF4 + .space 0x4 + .size cardi_rom_base,.-cardi_rom_base + + .balign 32, 0 + .type rom_stat,@object +rom_stat: ; 0x03808C00 + .space 0x220 + .size rom_stat,.-rom_stat + + .type skipCheck$3668,@object +skipCheck$3668: ; 0x03808E20 + .space 0x4 + .size skipCheck$3668,.-skipCheck$3668 + + .type isCardPullOut,@object +isCardPullOut: ; 0x03808E24 + .space 0x4 + .size isCardPullOut,.-isCardPullOut + + .type isInitialized$3621,@object +isInitialized$3621: ; 0x03808E28 + .space 0x4 + .size isInitialized$3621,.-isInitialized$3621 + + .type detectPullOut,@object +detectPullOut: ; 0x03808E2C + .space 0x4 + .size detectPullOut,.-detectPullOut diff --git a/sub/asm/sub.wram_2.s b/sub/asm/sub.wram_2.s new file mode 100644 index 00000000..3ea93df5 --- /dev/null +++ b/sub/asm/sub.wram_2.s @@ -0,0 +1,7471 @@ + .include "asm/macros.inc" + .include "global.inc" + + .public WMSP_CancelVAlarm + .public WMSP_CancelAllAlarms + .public WMSP_GetRequestThread + .public WL_Terminate + .public WMSP_GetIndicateThread + .public WMSP_Init + .public OS_IRQTable + .public wmspW + + .text + + arm_func_start SPI_Init +SPI_Init: ; 0x03800920 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + ldr r1, _03800A20 ; =spiInitialized + mov r4, r0 + ldrh r0, [r1] + cmp r0, #0 + bne _03800A14 + ldr r0, _03800A24 ; =spiWork + mov r2, #0 + str r2, [r0] + mov r3, #1 + mov r2, #5 + strh r3, [r1] + str r2, [r0, #4] + bl TP_Init + bl NVRAM_Init + bl MIC_Init + bl PM_Init + bl PXI_Init + ldr r1, _03800A28 ; =SpiPxiCallback + mov r0, #6 + bl PXI_SetFifoRecvCallback + ldr r1, _03800A28 ; =SpiPxiCallback + mov r0, #9 + bl PXI_SetFifoRecvCallback + ldr r1, _03800A28 ; =SpiPxiCallback + mov r0, #8 + bl PXI_SetFifoRecvCallback + ldr r1, _03800A28 ; =SpiPxiCallback + mov r0, #4 + bl PXI_SetFifoRecvCallback + ldr r0, _03800A2C ; =spiWork + 0x2AC + ldr r1, _03800A30 ; =spiWork + 0x2CC + mov r2, #0x10 + bl OS_InitMessageQueue + mov sb, #0 + mov r6, #0x18 + ldr r8, _03800A34 ; =spiWork + 0x30C + mov r7, sb + mov r5, r6 +_038009C0: + mla r0, sb, r5, r8 + mov r1, r7 + mov r2, r6 + bl MI_CpuFill8 + add sb, sb, #1 + cmp sb, #0x10 + blt _038009C0 + ldr r0, _03800A24 ; =spiWork + mov r2, #0 + str r2, [r0, #0x48c] + str r2, [r0, #0x494] + str r2, [r0, #0x490] + mov r0, #0x200 + str r0, [sp] + ldr r0, _03800A38 ; =spiWork + 0x8 + ldr r1, _03800A3C ; =SpiCommonThread + ldr r3, _03800A2C ; =spiWork + 0x2AC + str r4, [sp, #4] + bl OS_CreateThread + ldr r0, _03800A38 ; =spiWork + 0x8 + bl OS_WakeupThreadDirect +_03800A14: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_03800A20: .word spiInitialized +_03800A24: .word spiWork +_03800A28: .word SpiPxiCallback +_03800A2C: .word spiWork + 0x2AC +_03800A30: .word spiWork + 0x2CC +_03800A34: .word spiWork + 0x30C +_03800A38: .word spiWork + 0x8 +_03800A3C: .word SpiCommonThread + arm_func_end SPI_Init + + arm_func_start SPI_Lock +SPI_Lock: ; 0x03800A40 + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _03800A94 ; =spiWork + 0x490 + ldr r4, _03800A98 ; =spiWork + mov r6, r0 +_03800A50: + bl OS_DisableInterrupts + ldr r1, [r4] + cmp r1, #0 + beq _03800A70 + bl OS_RestoreInterrupts + mov r0, r5 + bl OS_SleepThread + b _03800A50 +_03800A70: + ldr r1, _03800A98 ; =spiWork + mov r2, #1 + str r2, [r1] + mov r2, #4 + str r2, [r1, #4] + str r6, [r1, #0x498] + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_03800A94: .word spiWork + 0x490 +_03800A98: .word spiWork + arm_func_end SPI_Lock + + arm_func_start SPI_Unlock +SPI_Unlock: ; 0x03800A9C + stmdb sp!, {r3, lr} + ldr r1, _03800AF4 ; =spiWork + ldr r2, [r1] + cmp r2, #0 + beq _03800AEC + ldr r2, [r1, #4] + cmp r2, #4 + ldreq r1, [r1, #0x498] + cmpeq r1, r0 + bne _03800AEC + bl OS_DisableInterrupts + ldr r1, _03800AF4 ; =spiWork + mov r2, #5 + str r2, [r1, #4] + mov r2, #0 + str r2, [r1] + str r2, [r1, #0x498] + bl OS_RestoreInterrupts + ldr r0, _03800AF8 ; =spiWork + 0x490 + bl OS_WakeupThread +_03800AEC: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03800AF4: .word spiWork +_03800AF8: .word spiWork + 0x490 + arm_func_end SPI_Unlock + + arm_func_start SPIi_ReturnResult +SPIi_ReturnResult: ; 0x03800AFC + stmdb sp!, {r4, r5, r6, lr} + and r2, r0, #0x70 + cmp r2, #0x30 + bgt _03800B34 + bge _03800B80 + cmp r2, #0x10 + bgt _03800B28 + bge _03800B68 + cmp r2, #0 + beq _03800B68 + b _03800B84 +_03800B28: + cmp r2, #0x20 + beq _03800B80 + b _03800B84 +_03800B34: + cmp r2, #0x50 + bgt _03800B4C + bge _03800B70 + cmp r2, #0x40 + beq _03800B70 + b _03800B84 +_03800B4C: + cmp r2, #0x60 + bgt _03800B5C + beq _03800B78 + b _03800B84 +_03800B5C: + cmp r2, #0x70 + beq _03800B78 + b _03800B84 +_03800B68: + mov r4, #6 + b _03800B84 +_03800B70: + mov r4, #9 + b _03800B84 +_03800B78: + mov r4, #8 + b _03800B84 +_03800B80: + mov r4, #4 +_03800B84: + and r0, r0, #0xff + orr r0, r0, #0x80 + mov r0, r0, lsl #8 + orr r2, r0, #0x3000000 + and r0, r1, #0xff + orr r6, r2, r0 + mov r5, #0 +_03800BA0: + mov r0, r4 + mov r1, r6 + mov r2, r5 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03800BA0 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end SPIi_ReturnResult + + arm_func_start SPIi_CheckException +SPIi_CheckException: ; 0x03800BC0 + ldr r0, _03800BD8 ; =spiWork + ldr r0, [r0] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + bx lr + .align 2, 0 +_03800BD8: .word spiWork + arm_func_end SPIi_CheckException + + arm_func_start SPIi_GetException +SPIi_GetException: ; 0x03800BDC + ldr r1, _03800BF0 ; =spiWork + mov r2, #1 + str r2, [r1] + str r0, [r1, #4] + bx lr + .align 2, 0 +_03800BF0: .word spiWork + arm_func_end SPIi_GetException + + arm_func_start SPIi_ReleaseException +SPIi_ReleaseException: ; 0x03800BF4 + stmdb sp!, {r3, lr} + ldr r1, _03800C28 ; =spiWork + ldr r2, [r1, #4] + cmp r2, r0 + bne _03800C20 + ldr r0, _03800C2C ; =spiWork + 0x490 + mov r2, #5 + str r2, [r1, #4] + mov r2, #0 + str r2, [r1] + bl OS_WakeupThread +_03800C20: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03800C28: .word spiWork +_03800C2C: .word spiWork + 0x490 + arm_func_end SPIi_ReleaseException + + arm_func_start SPIi_SetEntry +SPIi_SetEntry: ; 0x03800C30 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r4, r5, r6, lr} + ldrh r2, [sp, #0x18] + mov r5, r0 + cmp r2, #4 + mov r4, r1 + movhi r0, #0 + bhi _03800CEC + bl OS_DisableInterrupts + ldr ip, _03800CF8 ; =spiWork + add r2, sp, #0x18 + ldr r3, [ip, #0x48c] + mov r1, #0x18 + mul r6, r3, r1 + ldr lr, _03800CFC ; =spiWork + 0x30C + ldr r3, _03800D00 ; =spiWork + 0x310 + str r5, [lr, r6] + ldr r5, [ip, #0x48c] + bic r2, r2, #3 + mul lr, r5, r1 + add r5, r2, #4 + ldrh r1, [sp, #0x18] + str r4, [r3, lr] + mov r6, #0 + mov r2, #0x18 + b _03800CB4 +_03800C98: + ldr r4, [ip, #0x48c] + add r5, r5, #4 + mla r3, r4, r2, ip + add r3, r3, r6, lsl #2 + ldr r4, [r5, #-4] + add r6, r6, #1 + str r4, [r3, #0x314] +_03800CB4: + cmp r6, r1 + blt _03800C98 + ldr r1, _03800CF8 ; =spiWork + ldr r4, [r1, #0x48c] + add r2, r4, #1 + and r2, r2, #0xf + str r2, [r1, #0x48c] + bl OS_RestoreInterrupts + ldr r1, _03800CFC ; =spiWork + 0x30C + mov r0, #0x18 + mla r1, r4, r0, r1 + ldr r0, _03800D04 ; =spiWork + 0x2AC + mov r2, #0 + bl OS_SendMessage +_03800CEC: + ldmia sp!, {r4, r5, r6, lr} + add sp, sp, #0x10 + bx lr + .align 2, 0 +_03800CF8: .word spiWork +_03800CFC: .word spiWork + 0x30C +_03800D00: .word spiWork + 0x310 +_03800D04: .word spiWork + 0x2AC + arm_func_end SPIi_SetEntry + + arm_func_start SPIi_CheckEntry +SPIi_CheckEntry: ; 0x03800D08 + stmdb sp!, {r3, lr} + ldr r0, _03800D24 ; =spiWork + 0x2AC + add r1, sp, #0 + mov r2, #0 + bl OS_ReadMessage + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03800D24: .word spiWork + 0x2AC + arm_func_end SPIi_CheckEntry + + arm_func_start SpiCommonThread +SpiCommonThread: ; 0x03800D28 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + ldr r6, _03800D90 ; =spiWork + 0x2AC + add r5, sp, #0 + mov r4, #1 +_03800D3C: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl OS_ReceiveMessage + ldr r0, [sp] + ldr r1, [r0] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _03800D3C +_03800D60: ; jump table + b _03800D70 ; case 0 + b _03800D88 ; case 1 + b _03800D78 ; case 2 + b _03800D80 ; case 3 +_03800D70: + bl TP_ExecuteProcess + b _03800D3C +_03800D78: + bl MIC_ExecuteProcess + b _03800D3C +_03800D80: + bl PM_ExecuteProcess + b _03800D3C +_03800D88: + bl NVRAM_ExecuteProcess + b _03800D3C + .align 2, 0 +_03800D90: .word spiWork + 0x2AC + arm_func_end SpiCommonThread + + arm_func_start SpiPxiCallback +SpiPxiCallback: ; 0x03800D94 + stmdb sp!, {r3, lr} + cmp r2, #0 + bne _03800DF4 + sub r0, r0, #4 + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _03800DF4 +_03800DB0: ; jump table + b _03800DEC ; case 0 + b _03800DF4 ; case 1 + b _03800DC8 ; case 2 + b _03800DF4 ; case 3 + b _03800DE0 ; case 4 + b _03800DD4 ; case 5 +_03800DC8: + mov r0, r1 + bl TP_AnalyzeCommand + b _03800DF4 +_03800DD4: + mov r0, r1 + bl MIC_AnalyzeCommand + b _03800DF4 +_03800DE0: + mov r0, r1 + bl PM_AnalyzeCommand + b _03800DF4 +_03800DEC: + mov r0, r1 + bl NVRAM_AnalyzeCommand +_03800DF4: + ldmia sp!, {r3, lr} + bx lr + arm_func_end SpiPxiCallback + + arm_func_start TP_Init +TP_Init: ; 0x03800DFC + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r0, _03800EC4 ; =tpw + mov r3, #0 + str r3, [r0, #0x20] + mov r1, #0x14 + str r1, [r0, #0x24] + str r1, [r0, #0x28] + mov r2, r3 +_03800E1C: + mov r1, r3, lsl #1 + add r3, r3, #1 + strh r2, [r0, r1] + cmp r3, #0x10 + blt _03800E1C + bl OS_IsVAlarmAvailable + cmp r0, #0 + bne _03800E40 + bl OS_InitVAlarm +_03800E40: + ldr r7, _03800EC8 ; =tpw + 0x2C + ldr r5, _03800ECC ; =0x54505641 + mov r8, #0 + mov r4, #0x28 +_03800E50: + mul r6, r8, r4 + add r0, r7, r6 + bl OS_CreateVAlarm + mov r1, r5 + add r0, r7, r6 + bl OS_SetVAlarmTag + add r8, r8, #1 + cmp r8, #4 + blt _03800E50 + ldr r2, _03800ED0 ; =0x040001C0 +_03800E78: + ldrh r0, [r2] + tst r0, #0x80 + bne _03800E78 + ldr r1, _03800ED4 ; =0x00008A01 + ldr r0, _03800ED8 ; =0x040001C2 + strh r1, [r2] + mov r1, #0x84 + strh r1, [r0] + sub r1, r0, #2 +_03800E9C: + ldrh r0, [r1] + tst r0, #0x80 + bne _03800E9C + bl SPI_DummyWait_03800EE0 + ldr r1, _03800EDC ; =0x00008201 + ldr r0, _03800ED0 ; =0x040001C0 + strh r1, [r0] + bl SPI_DummyWait_03800EE0 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_03800EC4: .word tpw +_03800EC8: .word tpw + 0x2C +_03800ECC: .word 0x54505641 +_03800ED0: .word 0x040001C0 +_03800ED4: .word 0x00008A01 +_03800ED8: .word 0x040001C2 +_03800EDC: .word 0x00008201 + arm_func_end TP_Init + + arm_func_start SPI_DummyWait_03800EE0 +SPI_DummyWait_03800EE0: ; 0x03800EE0 + ldr r0, _03800F00 ; =0x040001C2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_03800EF0: + ldrh r0, [r1] + tst r0, #0x80 + bne _03800EF0 + bx lr + .align 2, 0 +_03800F00: .word 0x040001C2 + arm_func_end SPI_DummyWait_03800EE0 + + arm_func_start TP_AnalyzeCommand +TP_AnalyzeCommand: ; 0x03800F04 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + tst r0, #0x2000000 + beq _03800F34 + ldr r1, _038010DC ; =tpw + mov r4, #0 + mov r3, r4 +_03800F20: + mov r2, r4, lsl #1 + add r4, r4, #1 + strh r3, [r1, r2] + cmp r4, #0x10 + blt _03800F20 +_03800F34: + ldr r2, _038010DC ; =tpw + and r1, r0, #0xf0000 + mov r1, r1, lsr #0x10 + mov r1, r1, lsl #1 + strh r0, [r2, r1] + tst r0, #0x1000000 + beq _038010D0 + ldrh r1, [r2] + and r0, r1, #0xff00 + mov r0, r0, lsl #8 + mov r4, r0, lsr #0x10 + cmp r4, #3 + addls pc, pc, r4, lsl #2 + b _038010C4 +_03800F6C: ; jump table + b _03800FB0 ; case 0 + b _03800FD8 ; case 1 + b _03801074 ; case 2 + b _03800F7C ; case 3 +_03800F7C: + and r0, r1, #0xff + mov r0, r0, lsl #0x10 + movs r3, r0, lsr #0x10 + mov r0, #3 + bne _03800F9C + mov r1, #2 + bl SPIi_ReturnResult + b _038010D0 +_03800F9C: + str r3, [r2, #0x24] + mov r1, #0 + str r3, [r2, #0x28] + bl SPIi_ReturnResult + b _038010D0 +_03800FB0: + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl SPIi_SetEntry + cmp r0, #0 + bne _038010D0 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _038010D0 +_03800FD8: + ldr r0, [r2, #0x20] + cmp r0, #0 + beq _03800FF4 + mov r0, r4 + mov r1, #3 + bl SPIi_ReturnResult + b _038010D0 +_03800FF4: + and r0, r1, #0xff + mov r0, r0, lsl #0x10 + movs r3, r0, lsr #0x10 + beq _0380100C + cmp r3, #4 + bls _0380101C +_0380100C: + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038010D0 +_0380101C: + ldrh ip, [r2, #2] + ldr r0, _038010E0 ; =0x00000107 + cmp ip, r0 + blo _0380103C + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038010D0 +_0380103C: + mov r1, r4 + mov r0, #0 + mov r2, #2 + str ip, [sp] + bl SPIi_SetEntry + cmp r0, #0 + ldrne r0, _038010DC ; =tpw + movne r1, #1 + strne r1, [r0, #0x20] + bne _038010D0 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _038010D0 +_03801074: + ldr r0, [r2, #0x20] + cmp r0, #2 + beq _03801090 + mov r0, r4 + mov r1, #3 + bl SPIi_ReturnResult + b _038010D0 +_03801090: + mov r0, #0 + mov r1, r4 + mov r2, r0 + bl SPIi_SetEntry + cmp r0, #0 + ldrne r0, _038010DC ; =tpw + movne r1, #3 + strne r1, [r0, #0x20] + bne _038010D0 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _038010D0 +_038010C4: + mov r0, r4 + mov r1, #1 + bl SPIi_ReturnResult +_038010D0: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_038010DC: .word tpw +_038010E0: .word 0x00000107 + arm_func_end TP_AnalyzeCommand + + arm_func_start TP_ExecuteProcess +TP_ExecuteProcess: ; 0x038010E4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov sl, r0 + ldr r1, [sl, #4] + cmp r1, #2 + bhi _03801118 + cmp r1, #0 + beq _03801130 + cmp r1, #1 + beq _038012A4 + cmp r1, #2 + beq _03801368 + b _038013B4 +_03801118: + cmp r1, #0x10 + bne _038013B4 + ldr r0, _038013C0 ; =tpw + ldr r0, [r0, #0x20] + cmp r0, #2 + bne _038013B4 +_03801130: + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #0 + bl SPIi_CheckException + cmp r0, #0 + bne _03801168 + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, [sl, #4] + mov r1, #4 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + b _038013B4 +_03801168: + mov r0, #0 + bl SPIi_GetException + mov r0, r4 + bl OS_RestoreInterrupts + ldr r1, _038013C0 ; =tpw + add r0, sp, #8 + ldr r1, [r1, #0x24] + add r2, sp, #4 + bl TP_ExecSampling + ldr r0, [sp, #8] + ldrh r2, [sp, #4] + mov r1, r0, lsl #7 + movs r1, r1, lsr #0x1f + ldreq r0, _038013C4 ; =valid_cnt$3731 + moveq r1, #0 + streqb r1, [r0, #1] + streqb r1, [r0] + beq _03801250 + mov r0, r0, lsl #5 + movs r0, r0, lsr #0x1e + beq _038011FC + ldr r1, _038013C4 ; =valid_cnt$3731 + mov r3, #0 + strb r3, [r1] + ldrb r0, [r1, #1] + add r2, r0, #1 + and r0, r2, #0xff + strb r2, [r1, #1] + cmp r0, #4 + blo _03801250 + ldr r0, _038013C0 ; =tpw + strb r3, [r1, #1] + ldr r1, [r0, #0x24] + cmp r1, #0x23 + addlt r1, r1, #1 + strlt r1, [r0, #0x24] + b _03801250 +_038011FC: + ldr r0, _038013C0 ; =tpw + ldr r1, _038013C4 ; =valid_cnt$3731 + ldr r4, [r0, #0x24] + mov r5, #0 + strb r5, [r1, #1] + cmp r2, r4, asr #1 + strgeb r5, [r1] + bge _03801250 + ldrb r2, [r1] + add r3, r2, #1 + and r2, r3, #0xff + strb r3, [r1] + cmp r2, #4 + blo _03801250 + strb r5, [r1] + ldr r2, [r0, #0x28] + cmp r4, r2 + subgt r3, r4, #1 + movgt r2, #3 + strgt r3, [r0, #0x24] + strgtb r2, [r1, #1] +_03801250: + ldrh r0, [sp, #8] + ldr r1, _038013C8 ; =0x027FFFAA + strh r0, [r1] + ldrh r0, [sp, #0xa] + strh r0, [r1, #2] + ldr r0, [sl, #4] + cmp r0, #0 + bne _03801284 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + bl SPIi_ReturnResult + b _03801298 +_03801284: + ldr r1, [sl, #8] + mov r0, r0, lsl #0x10 + and r1, r1, #0xff + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult +_03801298: + mov r0, #0 + bl SPIi_ReleaseException + b _038013B4 +_038012A4: + ldr r6, _038013C0 ; =tpw + ldr r0, [r6, #0x20] + cmp r0, #1 + bne _03801354 + ldr r8, _038013CC ; =0x00000107 + ldr r5, _038013D0 ; =tpw + 0x2C + mov sb, #0 + mov r7, #0xd7 + mov fp, #0xa + mov r4, #0x28 + b _03801324 +_038012D0: + mul r0, sb, r8 + bl _u32_div_f + ldr r2, [sl, #0xc] + mov r1, r8 + add r0, r2, r0 + bl _u32_div_f + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #0xc8 + blo _03801300 + cmp r0, #0xd7 + movlo r0, r7 +_03801300: + add r1, r6, sb, lsl #1 + strh r0, [r1, #0xcc] + str sb, [sp] + mla r0, sb, r4, r5 + ldrsh r1, [r1, #0xcc] + ldr r3, _038013D4 ; =TpVAlarmHandler + mov r2, fp + bl OS_SetPeriodicVAlarm + add sb, sb, #1 +_03801324: + ldr r1, [sl, #8] + cmp sb, r1 + blo _038012D0 + ldr r0, [sl, #4] + mov r1, #0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + ldr r0, _038013C0 ; =tpw + mov r1, #2 + str r1, [r0, #0x20] + b _038013B4 +_03801354: + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #3 + bl SPIi_ReturnResult + b _038013B4 +_03801368: + ldr r0, _038013C0 ; =tpw + ldr r0, [r0, #0x20] + cmp r0, #3 + bne _038013A4 + ldr r0, _038013D8 ; =0x54505641 + bl OS_CancelVAlarms + ldr r0, [sl, #4] + mov r1, #0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + ldr r0, _038013C0 ; =tpw + mov r1, #0 + str r1, [r0, #0x20] + b _038013B4 +_038013A4: + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #3 + bl SPIi_ReturnResult +_038013B4: + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_038013C0: .word tpw +_038013C4: .word valid_cnt$3731 +_038013C8: .word 0x027FFFAA +_038013CC: .word 0x00000107 +_038013D0: .word tpw + 0x2C +_038013D4: .word TpVAlarmHandler +_038013D8: .word 0x54505641 + arm_func_end TP_ExecuteProcess + + arm_func_start TpVAlarmHandler +TpVAlarmHandler: ; 0x038013DC + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r3, r4 + mov r0, #0 + mov r1, #0x10 + mov r2, #1 + bl SPIi_SetEntry + cmp r0, #0 + bne _03801434 + ldr r0, [sp] + ldr r3, _03801440 ; =0x027FFFAA + bic r0, r0, #0x6000000 + orr r0, r0, #0x6000000 + str r0, [sp] + ldrh r0, [sp] + ldrh r2, [sp, #2] + strh r0, [r3] + and r1, r4, #0xff + mov r0, #0x10 + strh r2, [r3, #2] + bl SPIi_ReturnResult +_03801434: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_03801440: .word 0x027FFFAA + arm_func_end TpVAlarmHandler + + arm_func_start TPi_DetectTouch +TPi_DetectTouch: ; 0x03801444 + stmdb sp!, {r3, lr} + mov r0, #0x8000 + bl EXIi_SelectRcnt + ldr r2, _03801520 ; =0x040001C0 +_03801454: + ldrh r0, [r2] + tst r0, #0x80 + bne _03801454 + ldr r1, _03801524 ; =0x00008A01 + ldr r0, _03801528 ; =0x040001C2 + strh r1, [r2] + mov r1, #0x84 + strh r1, [r0] + sub r1, r0, #2 +_03801478: + ldrh r0, [r1] + tst r0, #0x80 + bne _03801478 + bl SPI_DummyWait_03801538 + ldr r1, _0380152C ; =0x00008201 + ldr r0, _03801520 ; =0x040001C0 + strh r1, [r0] + bl SPI_DummyWait_03801538 + ldr r0, _03801530 ; =last_touch_flg + ldrh r0, [r0] + cmp r0, #0 + bne _038014C0 + ldr r0, _03801534 ; =0x04000136 + ldrh r0, [r0] + tst r0, #0x40 + moveq r0, #1 + movne r0, #0 + b _03801518 +_038014C0: + ldr r2, _03801534 ; =0x04000136 + ldrh r0, [r2] + tst r0, #0x40 + moveq r0, #1 + beq _03801518 + ldr r1, _03801524 ; =0x00008A01 + mov r0, #0x84 + strh r1, [r2, #0x8a] + strh r0, [r2, #0x8c] +_038014E4: + ldrh r0, [r2, #0x8a] + tst r0, #0x80 + bne _038014E4 + bl SPI_DummyWait_03801538 + ldr r1, _0380152C ; =0x00008201 + ldr r0, _03801520 ; =0x040001C0 + strh r1, [r0] + bl SPI_DummyWait_03801538 + ldr r0, _03801534 ; =0x04000136 + ldrh r0, [r0] + tst r0, #0x40 + movne r0, #0 + moveq r0, #2 +_03801518: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03801520: .word 0x040001C0 +_03801524: .word 0x00008A01 +_03801528: .word 0x040001C2 +_0380152C: .word 0x00008201 +_03801530: .word last_touch_flg +_03801534: .word 0x04000136 + arm_func_end TPi_DetectTouch + + arm_func_start SPI_DummyWait_03801538 +SPI_DummyWait_03801538: ; 0x03801538 + ldr r0, _03801558 ; =0x040001C2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_03801548: + ldrh r0, [r1] + tst r0, #0x80 + bne _03801548 + bx lr + .align 2, 0 +_03801558: .word 0x040001C2 + arm_func_end SPI_DummyWait_03801538 + + arm_func_start TPi_DetectPos +TPi_DetectPos: ; 0x0380155C + stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x14 + cmp r2, #0 + ldr r2, _03801738 ; =0x040001C0 + mov r5, r3 + moveq r3, #0xd1 + moveq r4, #1 + mov r7, r0 + mov r6, r1 + movne r3, #0x91 + movne r4, #2 +_03801588: + ldrh r0, [r2] + tst r0, #0x80 + bne _03801588 + ldr r1, _0380173C ; =0x00008A01 + ldr r0, _03801740 ; =0x040001C2 + strh r1, [r2] + and r2, r3, #0xff + strh r2, [r0] + sub r1, r0, #2 +_038015AC: + ldrh r0, [r1] + tst r0, #0x80 + bne _038015AC + mov r0, r2, lsl #0x10 + ldr r2, _03801738 ; =0x040001C0 + mov ip, #0 + ldr r8, _03801744 ; =0x00007FF8 + add r1, sp, #0 + mov r0, r0, lsr #0x10 + mov r3, ip +_038015D4: + strh r3, [r2, #2] +_038015D8: + ldrh sb, [r2] + tst sb, #0x80 + bne _038015D8 + ldrh sb, [r2, #2] + and sb, sb, #0xff + mov lr, sb, lsl #0x10 + mov sb, lr, lsr #8 + str sb, [r1, ip, lsl #2] + strh r0, [r2, #2] +_038015FC: + ldrh sb, [r2] + tst sb, #0x80 + bne _038015FC + ldrh lr, [r2, #2] + ldr sb, [r1, ip, lsl #2] + and lr, lr, #0xff + mov lr, lr, lsl #0x10 + orr sb, sb, lr, lsr #16 + and lr, sb, r8 + mov lr, lr, asr #3 + str lr, [r1, ip, lsl #2] + add ip, ip, #1 + cmp ip, #5 + blt _038015D4 + ldr r0, _03801748 ; =0x00008201 + strh r0, [r2] + bl SPI_DummyWait_03801538 + mov r8, #0 + mov sb, r8 + add r2, sp, #0 +_0380164C: + ldr r1, [r2, sb, lsl #2] + add r3, sb, #1 + b _03801670 +_03801658: + ldr r0, [r2, r3, lsl #2] + add r3, r3, #1 + subs r0, r1, r0 + rsbmi r0, r0, #0 + cmp r0, r8 + movgt r8, r0 +_03801670: + cmp r3, #5 + blt _03801658 + add sb, sb, #1 + cmp sb, #4 + blt _0380164C + strh r8, [r5] + mov r8, #0 + add r0, sp, #0 + b _03801708 +_03801694: + ldr r3, [r0, r8, lsl #2] + add sb, r8, #1 + b _038016FC +_038016A0: + ldr r2, [r0, sb, lsl #2] + subs r1, r3, r2 + rsbmi r1, r1, #0 + cmp r1, r6 + bgt _038016F8 + add r1, sb, #1 + b _038016F0 +_038016BC: + ldr r5, [r0, r1, lsl #2] + subs ip, r3, r5 + rsbmi ip, ip, #0 + cmp ip, r6 + bgt _038016EC + add r0, r2, r3, lsl #1 + add r0, r5, r0 + mov r0, r0, asr #2 + bic r0, r0, #7 + strh r0, [r7] + mov r0, #0 + b _0380172C +_038016EC: + add r1, r1, #1 +_038016F0: + cmp r1, #5 + blt _038016BC +_038016F8: + add sb, sb, #1 +_038016FC: + cmp sb, #4 + blt _038016A0 + add r8, r8, #1 +_03801708: + cmp r8, #3 + blt _03801694 + ldr r2, [sp] + ldr r1, [sp, #0x10] + mov r0, r4 + add r1, r2, r1 + mov r1, r1, asr #1 + bic r1, r1, #7 + strh r1, [r7] +_0380172C: + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_03801738: .word 0x040001C0 +_0380173C: .word 0x00008A01 +_03801740: .word 0x040001C2 +_03801744: .word 0x00007FF8 +_03801748: .word 0x00008201 + arm_func_end TPi_DetectPos + + arm_func_start TP_ExecSampling +TP_ExecSampling: ; 0x0380174C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + movs r6, r1 + mov r5, r2 + mov r1, #0 + mov r7, r0 + strh r1, [r5] + rsbmi r6, r6, #0 + bl TPi_DetectTouch + movs r4, r0 + bne _038017B4 + ldr r1, [r7] + mov r0, #0x1000 + rsb r0, r0, #0 + and r1, r1, r0 + ldr r0, _03801930 ; =0xFF000FFF + and r0, r1, r0 + bic r1, r0, #0x1000000 + bic r0, r1, #0x6000000 + str r1, [r7] + orr r1, r0, #0x6000000 + str r1, [r7] + ldr r0, _03801934 ; =last_touch_flg + mov r1, #0 + strh r1, [r0] + b _03801924 +_038017B4: + add r0, sp, #4 + add r3, sp, #2 + mov r1, r6 + mov r2, #0 + bl TPi_DetectPos + ldr r1, [r7] + mov r0, r0, lsl #0x1e + bic r1, r1, #0x6000000 + orr ip, r1, r0, lsr #5 + str ip, [r7] + mov r1, #0x1000 + rsb r1, r1, #0 + ldrh r2, [sp, #4] + and ip, ip, r1 + and r1, r2, r1, lsr #20 + orr ip, ip, r1 + add r0, sp, #4 + add r3, sp, #0 + mov r1, r6 + mov r2, #1 + str ip, [r7] + bl TPi_DetectPos + cmp r0, #2 + bne _03801834 + ldr r1, [r7] + mov r0, r1, lsl #5 + mov r0, r0, lsr #0x1e + orr r0, r0, #2 + bic r1, r1, #0x6000000 + mov r0, r0, lsl #0x1e + orr r0, r1, r0, lsr #5 + str r0, [r7] +_03801834: + ldrh r1, [sp, #4] + ldr r2, [r7] + ldr r0, _03801930 ; =0xFF000FFF + mov r1, r1, lsl #0x14 + and r0, r2, r0 + orr r2, r0, r1, lsr #8 + ldr r1, _03801938 ; =0x00008A01 + ldr r0, _0380193C ; =0x040001C0 + str r2, [r7] + strh r1, [r0] + mov r6, #0 +_03801860: + bl SPI_DummyWait_03801538 + add r6, r6, #1 + cmp r6, #0xc + blt _03801860 + ldr r1, _03801940 ; =0x00008201 + ldr r0, _0380193C ; =0x040001C0 + strh r1, [r0] + bl SPI_DummyWait_03801538 + cmp r4, #2 + ldreq r0, [r7] + biceq r0, r0, #0x6000000 + orreq r0, r0, #0x6000000 + streq r0, [r7] + bl TPi_DetectTouch + cmp r0, #0 + beq _03801904 + cmp r0, #1 + beq _038018D4 + cmp r0, #2 + bne _03801920 + ldr r1, [r7] + ldr r0, _03801934 ; =last_touch_flg + orr r2, r1, #0x1000000 + bic r1, r2, #0x6000000 + orr r1, r1, #0x6000000 + str r1, [r7] + mov r1, #0 + strh r1, [r0] + b _03801924 +_038018D4: + ldr r1, [r7] + ldr r0, _03801934 ; =last_touch_flg + orr r1, r1, #0x1000000 + str r1, [r7] + mov r2, #1 + ldrh r1, [sp] + ldrh r3, [sp, #2] + strh r2, [r0] + cmp r3, r1 + movlo r3, r1 + strh r3, [r5] + b _03801924 +_03801904: + ldr r1, [r7] + ldr r0, _03801934 ; =last_touch_flg + bic r1, r1, #0x1000000 + str r1, [r7] + mov r1, #0 + strh r1, [r0] + b _03801924 +_03801920: + bl OS_Terminate +_03801924: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03801930: .word 0xFF000FFF +_03801934: .word last_touch_flg +_03801938: .word 0x00008A01 +_0380193C: .word 0x040001C0 +_03801940: .word 0x00008201 + arm_func_end TP_ExecSampling + + arm_func_start PM_Init +PM_Init: ; 0x03801944 + ldr r0, _03801978 ; =PMi_KeyPattern + mov r1, #1 + str r1, [r0, #4] + mov r3, #0 + str r3, [r0, #0x28] + ldr r0, _0380197C ; =PMi_Work + mov r2, r3 +_03801960: + mov r1, r3, lsl #1 + add r3, r3, #1 + strh r2, [r0, r1] + cmp r3, #0x10 + blt _03801960 + bx lr + .align 2, 0 +_03801978: .word PMi_KeyPattern +_0380197C: .word PMi_Work + arm_func_end PM_Init + + arm_func_start PM_AnalyzeCommand +PM_AnalyzeCommand: ; 0x03801980 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + tst r0, #0x2000000 + beq _038019B0 + ldr r1, _03801B34 ; =PMi_Work + mov r4, #0 + mov r3, r4 +_0380199C: + mov r2, r4, lsl #1 + add r4, r4, #1 + strh r3, [r1, r2] + cmp r4, #0x10 + blt _0380199C +_038019B0: + ldr r1, _03801B34 ; =PMi_Work + and r2, r0, #0xf0000 + mov r2, r2, lsr #0x10 + mov r2, r2, lsl #1 + strh r0, [r1, r2] + tst r0, #0x1000000 + beq _03801B28 + ldr r1, _03801B38 ; =PMi_KeyPattern + ldrh r2, [r1, #8] + and r0, r2, #0xff00 + mov r0, r0, lsl #8 + mov r4, r0, lsr #0x10 + sub r0, r4, #0x60 + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _03801B1C +_038019F0: ; jump table + b _03801A10 ; case 0 + b _03801A20 ; case 1 + b _03801B1C ; case 2 + b _03801AB8 ; case 3 + b _03801A54 ; case 4 + b _03801A88 ; case 5 + b _03801AEC ; case 6 + b _03801B04 ; case 7 +_03801A10: + mov r0, #0x60 + mov r1, #0 + bl SPIi_ReturnResult + b _03801B28 +_03801A20: + ldrh ip, [r1, #0xa] + mov r1, r4 + and r3, r2, #0xff + mov r0, #3 + mov r2, #2 + str ip, [sp] + bl SPIi_SetEntry + cmp r0, #0 + bne _03801B28 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _03801B28 +_03801A54: + ldrh ip, [r1, #0xa] + mov r1, r4 + and r3, r2, #0xff + mov r0, #3 + mov r2, #2 + str ip, [sp] + bl SPIi_SetEntry + cmp r0, #0 + bne _03801B28 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _03801B28 +_03801A88: + mov r0, r2, lsl #0x10 + mov r1, r4 + mov r3, r0, lsr #0x10 + mov r0, #3 + mov r2, #1 + bl SPIi_SetEntry + cmp r0, #0 + bne _03801B28 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _03801B28 +_03801AB8: + ldrh r0, [r1, #0xa] + mov r2, r2, lsl #0x18 + mov r1, r4 + orr r3, r0, r2, lsr #8 + mov r0, #3 + mov r2, #1 + bl SPIi_SetEntry + cmp r0, #0 + bne _03801B28 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _03801B28 +_03801AEC: + and r0, r2, #0xff + bl PM_SetLEDPattern + mov r0, #0x66 + mov r1, #0 + bl SPIi_ReturnResult + b _03801B28 +_03801B04: + bl PM_GetLEDPattern + mov r0, r0, lsl #0x10 + mov r1, r0, lsr #0x10 + mov r0, #0x67 + bl SPIi_ReturnResult + b _03801B28 +_03801B1C: + mov r0, r4 + mov r1, #1 + bl SPIi_ReturnResult +_03801B28: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + .align 2, 0 +_03801B34: .word PMi_Work +_03801B38: .word PMi_KeyPattern + arm_func_end PM_AnalyzeCommand + + arm_func_start PM_ExecuteProcess +PM_ExecuteProcess: ; 0x03801B3C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl OS_DisableInterrupts + mov r5, r0 + mov r0, #3 + bl SPIi_CheckException + cmp r0, #0 + bne _03801B7C + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #4] + mov r1, #4 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + b _03801CA0 +_03801B7C: + mov r0, #3 + bl SPIi_GetException + mov r0, r5 + bl OS_RestoreInterrupts + ldr r1, [r4, #4] + sub r0, r1, #0x61 + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _03801C88 +_03801BA0: ; jump table + b _03801BB8 ; case 0 + b _03801C88 ; case 1 + b _03801C54 ; case 2 + b _03801BDC ; case 3 + b _03801C18 ; case 4 + b _03801C7C ; case 5 +_03801BB8: + ldr r0, _03801CA8 ; =PMi_KeyPattern + mov r1, #1 + str r1, [r0, #0x28] + ldr r1, [r4, #8] + strh r1, [r0, #2] + ldr r1, [r4, #0xc] + strh r1, [r0] + bl PMi_DoSleep + b _03801C98 +_03801BDC: + ldr r2, _03801CA8 ; =PMi_KeyPattern + mov r0, #4 + str r0, [r2, #0x28] + ldr r0, [r4, #8] + str r0, [r2, #0x30] + ldr r3, [r4, #0xc] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + and r1, r3, #0xff + str r3, [r2, #0x2c] + bl PMi_SetRegister + mov r0, #0x64 + mov r1, #0 + bl SPIi_ReturnResult + b _03801C98 +_03801C18: + ldr r1, _03801CA8 ; =PMi_KeyPattern + mov r0, #3 + str r0, [r1, #0x28] + ldr r2, [r4, #8] + mov r0, r2, lsl #0x10 + mov r4, r0, lsr #0x10 + mov r0, r4 + str r2, [r1, #0x30] + bl PMi_GetRegister + add r1, r4, #0x70 + mov r2, r1, lsl #0x10 + mov r1, r0 + mov r0, r2, lsr #0x10 + bl SPIi_ReturnResult + b _03801C98 +_03801C54: + ldr r1, _03801CA8 ; =PMi_KeyPattern + mov r0, #2 + str r0, [r1, #0x28] + ldr r0, [r4, #8] + str r0, [r1, #0x2c] + bl PMi_SwitchUtilityProc + mov r0, #0x63 + mov r1, #0 + bl SPIi_ReturnResult + b _03801C98 +_03801C7C: + ldr r0, [r4, #8] + bl PMi_SetLED + b _03801C98 +_03801C88: + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #1 + bl SPIi_ReturnResult +_03801C98: + mov r0, #3 + bl SPIi_ReleaseException +_03801CA0: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_03801CA8: .word PMi_KeyPattern + arm_func_end PM_ExecuteProcess + + arm_func_start PMi_SendPxiCommand +PMi_SendPxiCommand: ; 0x03801CAC + stmdb sp!, {r4, r5, r6, lr} + and r1, r1, #0x3f0000 + and r3, r0, #0x3c00000 + mov r1, r1, lsl #0x10 + mov r0, r2, lsl #0x10 + orr r1, r1, r3, lsl #22 + orr r6, r1, r0, lsr #16 + mov r5, #8 + mov r4, #0 +_03801CD0: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _03801CD0 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end PMi_SendPxiCommand + + arm_func_start PMi_SetRegister +PMi_SetRegister: ; 0x03801CF0 + stmdb sp!, {r4, lr} + ldr r2, _03801D3C ; =0x040001C0 + mov r4, r1 +_03801CFC: + ldrh r1, [r2] + tst r1, #0x80 + bne _03801CFC + ldr r1, _03801D40 ; =0x00008202 + and r0, r0, #0xff + strh r1, [r2] + add r1, r1, #0x600 + strh r1, [r2] + bl SPI_SendWait_03801D48 + ldr r2, _03801D44 ; =0x00008002 + ldr r1, _03801D3C ; =0x040001C0 + and r0, r4, #0xff + strh r2, [r1] + strh r0, [r1, #2] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_03801D3C: .word 0x040001C0 +_03801D40: .word 0x00008202 +_03801D44: .word 0x00008002 + arm_func_end PMi_SetRegister + + arm_func_start SPI_SendWait_03801D48 +SPI_SendWait_03801D48: ; 0x03801D48 + ldr r1, _03801D68 ; =0x040001C2 + and r0, r0, #0xff + strh r0, [r1] + sub r1, r1, #2 +_03801D58: + ldrh r0, [r1] + tst r0, #0x80 + bne _03801D58 + bx lr + .align 2, 0 +_03801D68: .word 0x040001C2 + arm_func_end SPI_SendWait_03801D48 + + arm_func_start PMi_GetRegister +PMi_GetRegister: ; 0x03801D6C + stmdb sp!, {r3, lr} + ldr r2, _03801DD0 ; =0x040001C0 +_03801D74: + ldrh r1, [r2] + tst r1, #0x80 + bne _03801D74 + ldr r1, _03801DD4 ; =0x00008202 + orr r0, r0, #0x80 + strh r1, [r2] + add r1, r1, #0x600 + and r0, r0, #0xff + strh r1, [r2] + bl SPI_SendWait_03801D48 + ldr r2, _03801DD8 ; =0x00008002 + ldr r1, _03801DD0 ; =0x040001C0 + mov r0, #0 + strh r2, [r1] + strh r0, [r1, #2] +_03801DB0: + ldrh r0, [r1] + tst r0, #0x80 + bne _03801DB0 + ldr r0, _03801DDC ; =0x040001C2 + ldrh r0, [r0] + and r0, r0, #0xff + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03801DD0: .word 0x040001C0 +_03801DD4: .word 0x00008202 +_03801DD8: .word 0x00008002 +_03801DDC: .word 0x040001C2 + arm_func_end PMi_GetRegister + + arm_func_start PMi_SetControl +PMi_SetControl: ; 0x03801DE0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + bl PMi_GetRegister + orr r1, r0, r4 + mov r0, #0 + bl PMi_SetRegister + ldmia sp!, {r4, lr} + bx lr + arm_func_end PMi_SetControl + + arm_func_start PMi_ResetControl +PMi_ResetControl: ; 0x03801E04 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0 + bl PMi_GetRegister + mvn r1, r4 + and r0, r0, r1 + and r1, r0, #0xff + mov r0, #0 + bl PMi_SetRegister + ldmia sp!, {r4, lr} + bx lr + arm_func_end PMi_ResetControl + + arm_func_start PMi_SwitchUtilityProc +PMi_SwitchUtilityProc: ; 0x03801E30 + stmdb sp!, {r3, lr} + cmp r0, #0xf + addls pc, pc, r0, lsl #2 + b _03801F4C +_03801E40: ; jump table + b _03801F4C ; case 0 + b _03801E80 ; case 1 + b _03801E94 ; case 2 + b _03801EA8 ; case 3 + b _03801EBC ; case 4 + b _03801EC8 ; case 5 + b _03801ED4 ; case 6 + b _03801EE0 ; case 7 + b _03801EEC ; case 8 + b _03801EF8 ; case 9 + b _03801F04 ; case 10 + b _03801F10 ; case 11 + b _03801F1C ; case 12 + b _03801F28 ; case 13 + b _03801F40 ; case 14 + b _03801F34 ; case 15 +_03801E80: + mov r0, #1 + bl PM_SetLEDPattern + mov r0, #1 + bl PMi_SetLED + b _03801F4C +_03801E94: + mov r0, #3 + bl PM_SetLEDPattern + mov r0, #3 + bl PMi_SetLED + b _03801F4C +_03801EA8: + mov r0, #2 + bl PM_SetLEDPattern + mov r0, #2 + bl PMi_SetLED + b _03801F4C +_03801EBC: + mov r0, #4 + bl PMi_SetControl + b _03801F4C +_03801EC8: + mov r0, #4 + bl PMi_ResetControl + b _03801F4C +_03801ED4: + mov r0, #8 + bl PMi_SetControl + b _03801F4C +_03801EE0: + mov r0, #8 + bl PMi_ResetControl + b _03801F4C +_03801EEC: + mov r0, #0xc + bl PMi_SetControl + b _03801F4C +_03801EF8: + mov r0, #0xc + bl PMi_ResetControl + b _03801F4C +_03801F04: + mov r0, #1 + bl PMi_SetControl + b _03801F4C +_03801F10: + mov r0, #1 + bl PMi_ResetControl + b _03801F4C +_03801F1C: + mov r0, #2 + bl PMi_ResetControl + b _03801F4C +_03801F28: + mov r0, #2 + bl PMi_SetControl + b _03801F4C +_03801F34: + mov r0, #0x40 + bl PMi_ResetControl + b _03801F4C +_03801F40: + bl SND_BeginSleep + mov r0, #0x40 + bl PMi_SetControl +_03801F4C: + ldmia sp!, {r3, lr} + bx lr + arm_func_end PMi_SwitchUtilityProc + + arm_func_start PMi_SetLED +PMi_SetLED: ; 0x03801F54 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r4, #1 + beq _03801F78 + cmp r4, #2 + beq _03801F90 + cmp r4, #3 + beq _03801F84 + b _03801FA4 +_03801F78: + mov r0, #0x10 + bl PMi_ResetControl + b _03801FA8 +_03801F84: + mov r0, #0x30 + bl PMi_SetControl + b _03801FA8 +_03801F90: + mov r0, #0x20 + bl PMi_ResetControl + mov r0, #0x10 + bl PMi_SetControl + b _03801FA8 +_03801FA4: + bl OS_Terminate +_03801FA8: + ldr r0, _03801FB8 ; =PMi_LEDStatus + str r4, [r0] + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_03801FB8: .word PMi_LEDStatus + arm_func_end PMi_SetLED + + arm_func_start PMi_DoSleep +PMi_DoSleep: ; 0x03801FBC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r0, _03802178 ; =0x04000208 + mov r8, #0 + ldrh sb, [r0] + strh r8, [r0] + bl OS_DisableInterrupts + mov r4, r0 + mvn r0, #0xfe000000 + bl OS_DisableIrqMask + mov r5, r0 + mov r0, r8 + bl PMi_GetRegister + mov r6, r0 + mov r0, #2 + bl PM_SetLEDPattern + mov r0, #2 + bl PMi_SetLED + mov r0, #2 + bl PMi_SetLED + bl SND_BeginSleep + mov r0, #1 + bl PMi_ResetControl + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r0, [r0] + tst r0, #1 + beq _03802040 + ldr r0, _03802180 ; =PMi_KeyPattern + ldr r1, _03802184 ; =0x04000132 + ldrh r2, [r0] + mov r0, #0x1000 + orr r2, r2, #0x4000 + strh r2, [r1] + bl OS_EnableIrqMask +_03802040: + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r0, [r0] + tst r0, #4 + beq _03802058 + mov r0, #0x400000 + bl OS_EnableIrqMask +_03802058: + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r0, [r0] + tst r0, #2 + beq _0380209C + ldr r1, _03802188 ; =0x04000134 + mov r0, #0x8000 + ldrh r7, [r1] + mov r8, #1 + bl EXIi_SelectRcnt + mov r0, #0x40 + mov r1, #0 + bl EXIi_SetBitRcnt0L + mov r0, #0x100 + mov r1, r0 + bl EXIi_SetBitRcnt0L + mov r0, #0x80 + bl OS_EnableIrqMask +_0380209C: + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r0, [r0] + tst r0, #8 + beq _038020B4 + mov r0, #0x100000 + bl OS_EnableIrqMask +_038020B4: + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r0, [r0] + tst r0, #0x10 + beq _038020CC + mov r0, #0x2000 + bl OS_EnableIrqMask +_038020CC: + mov r0, r4 + bl OS_RestoreInterrupts + ldr r2, _03802178 ; =0x04000208 + mov r0, #1 + ldrh r1, [r2] + strh r0, [r2] + bl __VENEER_SVC_Sleep + mov r1, r6 + mov r0, #0 + bl PMi_SetRegister + ldr r0, _0380217C ; =PMi_TriggerBL + ldrh r1, [r0] + tst r1, #0x20 + movne r0, #6 + moveq r0, #7 + tst r1, #0x40 + movne r6, #4 + moveq r6, #5 + bl PMi_SwitchUtilityProc + mov r0, r6 + bl PMi_SwitchUtilityProc + cmp r8, #0 + ldrne r0, _03802188 ; =0x04000134 + strneh r7, [r0] + mov r0, #1 + bl PMi_SetControl + bl SND_EndSleep + mov r1, #0 + ldr r3, _0380218C ; =PMi_Work + mov r2, r1 + mov r0, #0x62 + str r1, [r3, #0x20] + bl PMi_SendPxiCommand + bl OS_DisableInterrupts + mov r0, r5 + bl OS_SetIrqMask + mov r0, r4 + bl OS_RestoreInterrupts + ldr r1, _03802178 ; =0x04000208 + ldrh r0, [r1] + strh sb, [r1] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + bx lr + .align 2, 0 +_03802178: .word 0x04000208 +_0380217C: .word PMi_TriggerBL +_03802180: .word PMi_KeyPattern +_03802184: .word 0x04000132 +_03802188: .word 0x04000134 +_0380218C: .word PMi_Work + arm_func_end PMi_DoSleep + + arm_func_start __VENEER_SVC_Sleep +__VENEER_SVC_Sleep: ; 0x03802190 + ldr ip, _03802198 ; =SVC_Sleep + bx ip + .align 2, 0 +_03802198: .word SVC_Sleep + arm_func_end __VENEER_SVC_Sleep + + arm_func_start PM_SelfBlinkProc +PM_SelfBlinkProc: ; 0x0380219C + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _038022B0 ; =PMi_BlinkCounter + ldr r3, [r1, #4] + cmp r3, #0 + bne _038021D8 + mov r2, #1 + mov r3, r2 + mov r0, #3 + mov r1, #0x66 + bl SPIi_SetEntry + cmp r0, #0 + beq _038022A8 + mov r0, #1 + bl PM_SetLEDPattern + b _038022A8 +_038021D8: + cmp r3, #4 + bge _03802204 + ldr r0, _038022B4 ; =PMi_LEDStatus + ldr r0, [r0] + cmp r3, r0 + beq _038022A8 + mov r0, #3 + mov r1, #0x66 + mov r2, #1 + bl SPIi_SetEntry + b _038022A8 +_03802204: + sub r2, r3, #4 + mov r0, #0xc + mul r4, r2, r0 + ldr r5, _038022B8 ; =PMi_BlinkPatternData + ldr r0, [r1] + add r6, r5, r4 + ldrh r1, [r6, #0xa] + bl _u32_div_f + mov r1, #0 + mov r3, r1, lsr r0 + ldr ip, [r6, #4] + mov r2, #-0x80000000 + rsb r1, r0, #0x20 + orr r3, r3, r2, lsl r1 + sub r1, r0, #0x20 + and ip, ip, r2, lsr r0 + orr r3, r3, r2, lsr r1 + ldr r0, [r5, r4] + cmp ip, #0 + and r0, r0, r3 + cmpeq r0, #0 + movne r3, #1 + ldrh r2, [r6, #8] + ldrh r1, [r6, #0xa] + ldr r0, _038022B0 ; =PMi_BlinkCounter + mul r1, r2, r1 + ldr r2, [r0] + moveq r3, #2 + add r2, r2, #1 + cmp r2, r1 + str r2, [r0] + movhs r1, #0 + strhs r1, [r0] + ldr r0, _038022B4 ; =PMi_LEDStatus + ldr r0, [r0] + cmp r3, r0 + beq _038022A8 + mov r0, #3 + mov r1, #0x66 + mov r2, #1 + bl SPIi_SetEntry +_038022A8: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_038022B0: .word PMi_BlinkCounter +_038022B4: .word PMi_LEDStatus +_038022B8: .word PMi_BlinkPatternData + arm_func_end PM_SelfBlinkProc + + arm_func_start PM_SetLEDPattern +PM_SetLEDPattern: ; 0x038022BC + cmp r0, #0xf + ldrle r1, _038022D4 ; =PMi_BlinkCounter + movle r2, #0 + strle r0, [r1, #4] + strle r2, [r1] + bx lr + .align 2, 0 +_038022D4: .word PMi_BlinkCounter + arm_func_end PM_SetLEDPattern + + arm_func_start PM_GetLEDPattern +PM_GetLEDPattern: ; 0x038022D8 + ldr r0, _038022E4 ; =PMi_BlinkCounter + ldr r0, [r0, #4] + bx lr + .align 2, 0 +_038022E4: .word PMi_BlinkCounter + arm_func_end PM_GetLEDPattern + + arm_func_start MIC_Init +MIC_Init: ; 0x038022E8 + ldr r0, _03802324 ; =micw + mov r3, #0 + str r3, [r0, #0x20] + ldr r0, _03802328 ; =micw + mov r2, r3 +_038022FC: + mov r1, r3, lsl #1 + add r3, r3, #1 + strh r2, [r0, r1] + cmp r3, #0x10 + blt _038022FC + ldr r1, _0380232C ; =0x0400010E + ldrh r0, [r1] + bic r0, r0, #0x80 + strh r0, [r1] + bx lr + .align 2, 0 +_03802324: .word micw +_03802328: .word micw +_0380232C: .word 0x0400010E + arm_func_end MIC_Init + + arm_func_start MIC_AnalyzeCommand +MIC_AnalyzeCommand: ; 0x03802330 + stmdb sp!, {r4, lr} + tst r0, #0x2000000 + beq _0380235C + ldr r1, _038025E8 ; =micw + mov r4, #0 + mov r3, r4 +_03802348: + mov r2, r4, lsl #1 + add r4, r4, #1 + strh r3, [r1, r2] + cmp r4, #0x10 + blt _03802348 +_0380235C: + ldr r1, _038025E8 ; =micw + and r2, r0, #0xf0000 + mov r2, r2, lsr #0x10 + mov r2, r2, lsl #1 + strh r0, [r1, r2] + tst r0, #0x1000000 + beq _038025E0 + ldr r1, _038025EC ; =micw + ldrh r2, [r1] + and r0, r2, #0xff00 + mov r0, r0, lsl #8 + mov r4, r0, lsr #0x10 + sub r0, r4, #0x40 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _038025D4 +_0380239C: ; jump table + b _038023AC ; case 0 + b _038023E8 ; case 1 + b _038024EC ; case 2 + b _03802550 ; case 3 +_038023AC: + mov r1, r4 + and r3, r2, #0xff + mov r0, #2 + mov r2, #1 + bl SPIi_SetEntry + cmp r0, #0 + bne _038023D4 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult +_038023D4: + ldr r0, _038025F0 ; =0x027FFF94 + mov r1, #0 + strh r1, [r0] + str r1, [r0, #-4] + b _038025E0 +_038023E8: + ldr r0, [r1, #0x20] + cmp r0, #0 + beq _03802404 + mov r0, r4 + mov r1, #3 + bl SPIi_ReturnResult + b _038025E0 +_03802404: + and r0, r2, #0xff + strh r0, [r1, #0x24] + ldrh r2, [r1, #2] + ldrh r0, [r1, #4] + orr r3, r0, r2, lsl #16 + cmp r3, #0x2000000 + blo _03802428 + cmp r3, #0x2400000 + blo _03802438 +_03802428: + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038025E0 +_03802438: + str r3, [r1, #0x28] + ldrh r2, [r1, #6] + ldrh r0, [r1, #8] + orr r2, r0, r2, lsl #16 + add r0, r3, r2 + cmp r0, #0x2400000 + bls _03802464 + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038025E0 +_03802464: + str r2, [r1, #0x30] + ldrh r2, [r1, #0xa] + ldrh r0, [r1, #0xc] + orr r0, r0, r2, lsl #16 + bl MicSetTimerValue + cmp r0, #0 + bne _03802490 + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038025E0 +_03802490: + ldr r3, _038025EC ; =micw + mov r2, #0 + str r2, [r3, #0x2c] + ldrh r0, [r3, #0x24] + mov r1, r4 + and ip, r0, #7 + mov r0, #2 + strh ip, [r3, #0x26] + bl SPIi_SetEntry + cmp r0, #0 + bne _038024CC + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _038025E0 +_038024CC: + ldr r1, _038025F0 ; =0x027FFF94 + mov r2, #0 + strh r2, [r1] + ldr r0, _038025EC ; =micw + str r2, [r1, #-4] + mov r1, #1 + str r1, [r0, #0x20] + b _038025E0 +_038024EC: + ldr r0, [r1, #0x20] + cmp r0, #2 + beq _03802508 + mov r0, r4 + mov r1, #3 + bl SPIi_ReturnResult + b _038025E0 +_03802508: + mov r1, r4 + mov r0, #2 + mov r2, #0 + bl SPIi_SetEntry + cmp r0, #0 + bne _03802530 + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult + b _038025E0 +_03802530: + ldr r0, _038025EC ; =micw + mov r2, #3 + ldr r1, _038025F4 ; =0x0400010E + str r2, [r0, #0x20] + ldrh r0, [r1] + bic r0, r0, #0x80 + strh r0, [r1] + b _038025E0 +_03802550: + ldr r0, [r1, #0x20] + cmp r0, #2 + beq _0380256C + mov r0, r4 + mov r1, #3 + bl SPIi_ReturnResult + b _038025E0 +_0380256C: + ldrh r2, [r1, #2] + ldrh r0, [r1, #4] + orr r0, r0, r2, lsl #16 + bl MicSetTimerValue + cmp r0, #0 + bne _03802594 + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _038025E0 +_03802594: + bl OS_DisableInterrupts + ldr r3, _038025F4 ; =0x0400010E + ldr r1, _038025EC ; =micw + ldrh r2, [r3] + bic r2, r2, #0x80 + strh r2, [r3] + ldrh r2, [r1, #0x34] + strh r2, [r3, #-2] + ldrh r1, [r1, #0x36] + orr r1, r1, #0xc0 + strh r1, [r3] + bl OS_RestoreInterrupts + mov r0, r4 + mov r1, #0 + bl SPIi_ReturnResult + b _038025E0 +_038025D4: + mov r0, r4 + mov r1, #1 + bl SPIi_ReturnResult +_038025E0: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_038025E8: .word micw +_038025EC: .word micw +_038025F0: .word 0x027FFF94 +_038025F4: .word 0x0400010E + arm_func_end MIC_AnalyzeCommand + + arm_func_start MicSetTimerValue +MicSetTimerValue: ; 0x038025F8 + cmp r0, #0x10000 + bhs _0380261C + ldr r1, _03802698 ; =micw + mov r2, #0 + strh r2, [r1, #0x36] + rsb r0, r0, #0x10000 + strh r0, [r1, #0x34] + mov r0, #1 + bx lr +_0380261C: + cmp r0, #0x400000 + bhs _03802644 + ldr r1, _03802698 ; =micw + mov r3, #1 + mov r0, r0, lsr #6 + rsb r2, r0, #0x10000 + strh r3, [r1, #0x36] + mov r0, r3 + strh r2, [r1, #0x34] + bx lr +_03802644: + cmp r0, #0x1000000 + bhs _0380266C + ldr r1, _03802698 ; =micw + mov r2, #2 + mov r0, r0, lsr #8 + strh r2, [r1, #0x36] + rsb r0, r0, #0x10000 + strh r0, [r1, #0x34] + mov r0, #1 + bx lr +_0380266C: + cmp r0, #0x4000000 + movhs r0, #0 + bxhs lr + ldr r1, _03802698 ; =micw + mov r2, #3 + mov r0, r0, lsr #0xa + strh r2, [r1, #0x36] + rsb r0, r0, #0x10000 + strh r0, [r1, #0x34] + mov r0, #1 + bx lr + .align 2, 0 +_03802698: .word micw + arm_func_end MicSetTimerValue + + arm_func_start MIC_ExecuteProcess +MIC_ExecuteProcess: ; 0x0380269C + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + ldr r2, [r4, #4] + cmp r2, #0x40 + beq _038026C4 + cmp r2, #0x41 + beq _03802774 + cmp r2, #0x42 + beq _0380280C + b _038028A8 +_038026C4: + bl OS_DisableInterrupts + mov r5, r0 + mov r0, #2 + bl SPIi_CheckException + cmp r0, #0 + bne _038026FC + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #4] + mov r1, #4 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + b _038028A8 +_038026FC: + mov r0, #2 + bl SPIi_GetException + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #8] + and r0, r0, #1 + cmp r0, #1 + bne _03802730 + bl MIC_ExecSampling12 + ldr r1, [r4, #8] + tst r1, #2 + eorne r0, r0, #0x8000 + b _03802740 +_03802730: + bl MIC_ExecSampling8 + ldr r1, [r4, #8] + tst r1, #2 + eorne r0, r0, #0x80 +_03802740: + ldr r1, _038028B0 ; =0x027FFF94 + movne r0, r0, lsl #0x10 + movne r0, r0, lsr #0x10 + strh r0, [r1] + str r1, [r1, #-4] + ldr r0, [r4, #4] + mov r1, #0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #2 + bl SPIi_ReleaseException + b _038028A8 +_03802774: + ldr r0, _038028B4 ; =micw + ldr r1, [r0, #0x20] + cmp r1, #1 + bne _038027F8 + mov r1, #0 + strh r1, [r0, #0x3a] + strh r1, [r0, #0x38] + bl OS_DisableInterrupts + mov r5, r0 + mov r0, #0x40 + bl OS_EnableIrqMask + ldr r1, _038028B8 ; =MIC_TimerHandler + mov r0, #0x40 + bl MIC_SetIrqFunction + bl MIC_EnableMultipleInterrupt + ldr r1, _038028B4 ; =micw + ldr r2, _038028BC ; =0x0400010C + ldrh r3, [r1, #0x34] + mov r0, r5 + strh r3, [r2] + ldrh r1, [r1, #0x36] + orr r1, r1, #0xc0 + strh r1, [r2, #2] + bl OS_RestoreInterrupts + ldr r0, [r4, #4] + mov r1, #0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + ldr r0, _038028B4 ; =micw + mov r1, #2 + str r1, [r0, #0x20] + b _038028A8 +_038027F8: + mov r0, r2, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #3 + bl SPIi_ReturnResult + b _038028A8 +_0380280C: + ldr r0, _038028B4 ; =micw + ldr r1, [r0, #0x20] + sub r0, r1, #3 + cmp r0, #1 + bhi _03802888 + ldr r1, _038028C0 ; =0x0400010E + ldrh r0, [r1] + bic r0, r0, #0x80 + strh r0, [r1] + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #0x40 + mov r1, #0 + bl MIC_SetIrqFunction + bl MIC_DisableMultipleInterrupt + mov r0, r4 + bl OS_RestoreInterrupts + ldr r0, _038028B4 ; =micw + mov r1, #0 + ldr r0, [r0, #0x20] + cmp r0, #3 + bne _03802870 + mov r0, #0x42 + bl SPIi_ReturnResult + b _03802878 +_03802870: + mov r0, #0x51 + bl SPIi_ReturnResult +_03802878: + ldr r0, _038028B4 ; =micw + mov r1, #0 + str r1, [r0, #0x20] + b _038028A8 +_03802888: + cmp r1, #3 + mov r1, #3 + bne _038028A0 + mov r0, #0x42 + bl SPIi_ReturnResult + b _038028A8 +_038028A0: + mov r0, #0x51 + bl SPIi_ReturnResult +_038028A8: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_038028B0: .word 0x027FFF94 +_038028B4: .word micw +_038028B8: .word MIC_TimerHandler +_038028BC: .word 0x0400010C +_038028C0: .word 0x0400010E + arm_func_end MIC_ExecuteProcess + + arm_func_start MIC_TimerHandler +MIC_TimerHandler: ; 0x038028C4 + stmdb sp!, {r3, lr} + bl MicTimerHandler + ldr r3, _038028F0 ; =0x0380FFF8 + ldr r0, _038028F4 ; =0x04000214 + ldr r2, [r3] + mov r1, #0x40 + orr r2, r2, #0x40 + str r2, [r3] + str r1, [r0] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038028F0: .word 0x0380FFF8 +_038028F4: .word 0x04000214 + arm_func_end MIC_TimerHandler + + arm_func_start MicTimerHandler +MicTimerHandler: ; 0x038028F8 + stmdb sp!, {r4, r5, r6, r7, lr} + ldr r4, _03802A50 ; =micw + ldrh r5, [r4, #0x26] + and r0, r5, #4 + cmp r0, #4 + ldrh r6, [r4, #0x38] + ldrneh r7, [r4, #0x3a] + ldreq r7, _03802A54 ; =0x0000FFFF + bl SPIi_CheckEntry + cmp r0, #0 + bne _03802964 + mov r0, #2 + bl SPIi_CheckException + cmp r0, #0 + beq _03802964 + and r0, r5, #1 + cmp r0, #1 + bne _03802954 + bl MIC_ExecSampling12 + tst r5, #2 + moveq r7, r0 + eorne r7, r0, #0x8000 + b _03802964 +_03802954: + bl MIC_ExecSampling8 + tst r5, #2 + moveq r7, r0 + eorne r7, r0, #0x80 +_03802964: + and r0, r5, #1 + ldr r3, _03802A58 ; =0x027FFC00 + ldr r1, [r4, #0x2c] + cmp r0, #1 + bne _03802994 + ldr r2, [r4, #0x28] + strh r7, [r2, r1]! + str r2, [r3, #0x390] + add r3, r3, #0x394 + strh r7, [r3] + add r1, r1, #2 + b _038029CC +_03802994: + and r7, r7, #0xff + tst r1, #1 + bne _038029AC + mov r6, r7 + add r1, r1, #1 + b _038029CC +_038029AC: + orr r0, r6, r7, lsl #8 + ldr r2, [r4, #0x28] + sub r1, r1, #1 + strh r0, [r2, r1]! + str r2, [r3, #0x390] + add r3, r3, #0x394 + strh r0, [r3] + add r1, r1, #2 +_038029CC: + strh r6, [r4, #0x38] + strh r7, [r4, #0x3a] + ldr r0, [r4, #0x30] + cmp r1, r0 + movhs r1, #0 + str r1, [r4, #0x2c] + blo _03802A48 + ldrh r0, [r4, #0x24] + and r0, r0, #0x10 + cmp r0, #0x10 + bne _03802A08 + mov r0, #0x51 + mov r1, #0 + bl SPIi_ReturnResult + b _03802A48 +_03802A08: + mov r0, #2 + mov r1, #0x42 + mov r2, #0 + bl SPIi_SetEntry + cmp r0, #0 + bne _03802A30 + mov r0, #0x51 + mov r1, #4 + bl SPIi_ReturnResult + b _03802A48 +_03802A30: + mov r0, #4 + str r0, [r4, #0x20] + ldr r1, _03802A5C ; =0x0400010E + ldrh r0, [r1] + bic r0, r0, #0x80 + strh r0, [r1] +_03802A48: + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03802A50: .word micw +_03802A54: .word 0x0000FFFF +_03802A58: .word 0x027FFC00 +_03802A5C: .word 0x0400010E + arm_func_end MicTimerHandler + + arm_func_start MIC_ExecSampling8 +MIC_ExecSampling8: ; 0x03802A60 + stmdb sp!, {r4, lr} + ldr r2, _03802B6C ; =0x040001C0 +_03802A68: + ldrh r0, [r2] + tst r0, #0x80 + bne _03802A68 + ldr r1, _03802B70 ; =0x00008A01 + ldr r0, _03802B74 ; =0x040001C2 + strh r1, [r2] + mov r1, #0xec + strh r1, [r0] + sub r1, r0, #2 +_03802A8C: + ldrh r0, [r1] + tst r0, #0x80 + bne _03802A8C + bl SPI_DummyWaitReceive + ldr r2, _03802B78 ; =0x00008201 + ldr r1, _03802B6C ; =0x040001C0 + mov r4, r0, lsl #0x18 + strh r2, [r1] + bl SPI_DummyWaitReceive + ldr r2, _03802B7C ; =micw + 0x3C + ldr r1, _03802B80 ; =0x00007F80 + orr r0, r0, r4, lsr #16 + and r1, r0, r1 + ldr r0, [r2, #0x10] + mov r1, r1, lsl #9 + add r3, r0, r1, lsr #16 + str r3, [r2, #0x10] + ldr r0, [r2, #0xc] + add r0, r0, #1 + str r0, [r2, #0xc] + cmp r0, #0x1000 + blo _03802B3C + ldrsb r4, [r2] + mov r0, r3, lsr #0xc + sub r0, r0, #0x80 + mov r0, r0, lsl #0x18 + cmp r4, r0, asr #24 + mov r0, r0, asr #0x18 + cmplt r4, #0xc + addlt r0, r4, #1 + strltb r0, [r2] + blt _03802B2C + cmp r0, r4 + bge _03802B2C + mvn r0, #0xb + cmp r4, r0 + ldrgt r0, _03802B7C ; =micw + 0x3C + ldrgtsb r2, [r0] + subgt r2, r2, #1 + strgtb r2, [r0] +_03802B2C: + ldr r0, _03802B7C ; =micw + 0x3C + mov r2, #0 + str r2, [r0, #0xc] + str r2, [r0, #0x10] +_03802B3C: + ldr r0, _03802B7C ; =micw + 0x3C + ldrsb r0, [r0] + rsb r0, r0, r1, lsr #16 + cmp r0, #0xff + movgt r0, #0xff + bgt _03802B5C + cmp r0, #0 + movlt r0, #0 +_03802B5C: + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_03802B6C: .word 0x040001C0 +_03802B70: .word 0x00008A01 +_03802B74: .word 0x040001C2 +_03802B78: .word 0x00008201 +_03802B7C: .word micw + 0x3C +_03802B80: .word 0x00007F80 + arm_func_end MIC_ExecSampling8 + + arm_func_start SPI_DummyWaitReceive +SPI_DummyWaitReceive: ; 0x03802B84 + ldr r0, _03802BB0 ; =0x040001C2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_03802B94: + ldrh r0, [r1] + tst r0, #0x80 + bne _03802B94 + ldr r0, _03802BB0 ; =0x040001C2 + ldrh r0, [r0] + and r0, r0, #0xff + bx lr + .align 2, 0 +_03802BB0: .word 0x040001C2 + arm_func_end SPI_DummyWaitReceive + + arm_func_start MIC_ExecSampling12 +MIC_ExecSampling12: ; 0x03802BB4 + stmdb sp!, {r4, lr} + ldr r2, _03802CCC ; =0x040001C0 +_03802BBC: + ldrh r0, [r2] + tst r0, #0x80 + bne _03802BBC + ldr r1, _03802CD0 ; =0x00008A01 + ldr r0, _03802CD4 ; =0x040001C2 + strh r1, [r2] + mov r1, #0xe4 + strh r1, [r0] + sub r1, r0, #2 +_03802BE0: + ldrh r0, [r1] + tst r0, #0x80 + bne _03802BE0 + bl SPI_DummyWaitReceive + ldr r2, _03802CD8 ; =0x00008201 + ldr r1, _03802CCC ; =0x040001C0 + mov r4, r0, lsl #0x18 + strh r2, [r1] + bl SPI_DummyWaitReceive + ldr r3, _03802CDC ; =micw + 0x3C + ldr r1, _03802CE0 ; =0x00007FF8 + orr r0, r0, r4, lsr #16 + and r2, r0, r1 + ldr r0, [r3, #4] + mov r2, r2, lsl #0x11 + add r4, r0, r2, lsr #16 + str r4, [r3, #4] + ldr r0, [r3, #8] + add r0, r0, #1 + str r0, [r3, #8] + cmp r0, #0x100 + blo _03802C98 + mov r0, r1, lsl #1 + and r0, r0, r4, lsr #8 + ldrsh r4, [r3, #2] + sub r0, r0, #0x8000 + mov r0, r0, lsl #0x10 + cmp r4, r0, asr #16 + mov r1, r0, asr #0x10 + cmplt r4, #0xc00 + addlt r0, r4, #0x10 + strlth r0, [r3, #2] + blt _03802C88 + cmp r1, r4 + bge _03802C88 + mov r0, #0xc00 + rsb r0, r0, #0 + cmp r4, r0 + ldrgt r0, _03802CDC ; =micw + 0x3C + ldrgtsh r1, [r0, #2] + subgt r1, r1, #0x10 + strgth r1, [r0, #2] +_03802C88: + ldr r0, _03802CDC ; =micw + 0x3C + mov r1, #0 + str r1, [r0, #8] + str r1, [r0, #4] +_03802C98: + ldr r1, _03802CDC ; =micw + 0x3C + ldr r0, _03802CE4 ; =0x0000FFF0 + ldrsh r1, [r1, #2] + rsb r1, r1, r2, lsr #16 + cmp r1, r0 + movgt r1, r0 + bgt _03802CBC + cmp r1, #0 + movlt r1, #0 +_03802CBC: + mov r0, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_03802CCC: .word 0x040001C0 +_03802CD0: .word 0x00008A01 +_03802CD4: .word 0x040001C2 +_03802CD8: .word 0x00008201 +_03802CDC: .word micw + 0x3C +_03802CE0: .word 0x00007FF8 +_03802CE4: .word 0x0000FFF0 + arm_func_end MIC_ExecSampling12 + + arm_func_start MIC_SetIrqFunction +MIC_SetIrqFunction: ; 0x03802CE8 + ldr r2, _03802D0C ; =OS_IRQTable + mov r3, #0 +_03802CF0: + tst r0, #1 + strne r1, [r2, r3, lsl #2] + add r3, r3, #1 + cmp r3, #0x19 + mov r0, r0, lsr #1 + blt _03802CF0 + bx lr + .align 2, 0 +_03802D0C: .word OS_IRQTable + arm_func_end MIC_SetIrqFunction + + arm_func_start MIC_EnableMultipleInterrupt +MIC_EnableMultipleInterrupt: ; 0x03802D10 + stmdb sp!, {r3, lr} + ldr r3, _03802D64 ; =0x0380FFFC + ldr r0, _03802D68 ; =MIC_IrqHandler + ldr r2, [r3] + cmp r2, r0 + beq _03802D5C + ldr r0, _03802D6C ; =micIntrInfo + mov r1, #0 + str r1, [r0] + sub r1, r3, #0x17c + str r1, [r0, #4] + mov r1, #0x40 + str r1, [r0, #8] + str r2, [r0, #0xc] + bl OS_DisableInterrupts + ldr r2, _03802D68 ; =MIC_IrqHandler + ldr r1, _03802D64 ; =0x0380FFFC + str r2, [r1] + bl OS_RestoreInterrupts +_03802D5C: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03802D64: .word 0x0380FFFC +_03802D68: .word MIC_IrqHandler +_03802D6C: .word micIntrInfo + arm_func_end MIC_EnableMultipleInterrupt + + arm_func_start MIC_DisableMultipleInterrupt +MIC_DisableMultipleInterrupt: ; 0x03802D70 + stmdb sp!, {r3, lr} + ldr r1, _03802DA8 ; =0x0380FFFC + ldr r0, _03802DAC ; =MIC_IrqHandler + ldr r1, [r1] + cmp r1, r0 + bne _03802DA0 + bl OS_DisableInterrupts + ldr r1, _03802DB0 ; =micIntrInfo + ldr r2, _03802DA8 ; =0x0380FFFC + ldr r1, [r1, #0xc] + str r1, [r2] + bl OS_RestoreInterrupts +_03802DA0: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03802DA8: .word 0x0380FFFC +_03802DAC: .word MIC_IrqHandler +_03802DB0: .word micIntrInfo + arm_func_end MIC_DisableMultipleInterrupt + + arm_func_start MIC_IrqHandler +MIC_IrqHandler: ; 0x03802DB4 + mov ip, #0x4000000 + add r1, ip, #0x208 + ldrh r0, [r1] + tst r0, r0 + bxeq lr + ldr r3, [ip, #0x210] + ldr r1, [ip, #0x214] + ands r2, r1, r3 + bxeq lr + ldr r0, _03802F20 ; =0x01DF3FFF + tst r2, r0 + streq r2, [ip, #0x214] + bxeq lr + stmdb sp!, {lr} + mrs r0, spsr + stmdb sp!, {r0} + stmdb sp, {sp, lr} ^ + sub sp, sp, #8 + mov r0, #0x9f + msr cpsr_c, r0 + ldr r1, _03802F24 ; =OSi_ThreadInfo + ldrh r0, [r1, #2] + add r0, r0, #1 + strh r0, [r1, #2] + ldr r1, _03802F28 ; =micIntrInfo + cmp r0, #1 + moveq r0, sp + ldreq sp, [r1, #4] + streq r0, [r1, #4] + stmdb sp!, {r3} + ldr r1, _03802F2C ; =micIntrPrio + ldr r0, [r1] + tst r0, r2 + strne r0, [ip, #0x214] + ldrne r0, [r1, #4] + ldrne r3, _03802F30 ; =OS_IRQTable + ldrne r0, [r3, r0, lsl #2] + bne _03802E90 + mov r3, #1 +_03802E50: + ldr r0, [r1, r3, lsl #3] + tst r0, r2 + addeq r3, r3, #1 + beq _03802E50 + str r0, [ip, #0x214] + add r0, r1, r3, lsl #3 + ldr r2, [r0, #4] + ldr r3, _03802F30 ; =OS_IRQTable + ldr r0, [r3, r2, lsl #2] + ldr r2, _03802F24 ; =OSi_ThreadInfo + ldrh r3, [r2, #2] + cmp r3, #1 + ldreq r2, [r1] + streq r2, [ip, #0x210] + moveq r2, #0x1f + msreq cpsr_c, r2 +_03802E90: + ldr r1, [ip, #0x210] + stmdb sp!, {r1} + add lr, pc, #0x0 ; =sub_03802EA0 + bx r0 + mov r0, #0x9f + msr cpsr_c, r0 + mov ip, #0x4000000 + ldmia sp!, {r0} + ldr r1, [ip, #0x210] + eor r2, r0, r1 + and r1, r2, r1 + and r0, r2, r0 + ldmia sp!, {r3} + orr r3, r3, r1 + bic r3, r3, r0 + str r3, [ip, #0x210] + ldr r2, _03802F24 ; =OSi_ThreadInfo + ldr r3, _03802F28 ; =micIntrInfo + ldrh r0, [r2, #2] + subs r1, r0, #1 + strh r1, [r2, #2] + moveq r0, sp + ldreq sp, [r3, #4] + streq r0, [r3, #4] + mov r0, #0x92 + msr cpsr_c, r0 + ldmia sp, {sp, lr} ^ + mov r0, r0 + add sp, sp, #8 + ldmia sp!, {r0} + msr spsr_fc, r0 + tst r1, r1 + ldreq r0, _03802F34 ; =OS_IrqHandler_ThreadSwitch + addeq lr, pc, #0x0 ; =_03802F1C + bxeq r0 +_03802F1C: + ldmia sp!, {pc} + .align 2, 0 +_03802F20: .word 0x01DF3FFF +_03802F24: .word OSi_ThreadInfo +_03802F28: .word micIntrInfo +_03802F2C: .word micIntrPrio +_03802F30: .word OS_IRQTable +_03802F34: .word OS_IrqHandler_ThreadSwitch + arm_func_end MIC_IrqHandler + + arm_func_start CTRDGi_InitCommon +CTRDGi_InitCommon: ; 0x03802F38 + stmdb sp!, {r3, lr} + ldr r1, _03802F68 ; =CTRDGi_Work + mov r3, #0 + ldr r2, _03802F6C ; =0x05000001 + add r0, sp, #0 + str r3, [sp] + bl __VENEER_SVC_CpuSet + bl OS_GetLockID + ldr r1, _03802F70 ; =CTRDGi_EnableFlag + strh r0, [r1, #6] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03802F68: .word CTRDGi_Work +_03802F6C: .word 0x05000001 +_03802F70: .word CTRDGi_EnableFlag + arm_func_end CTRDGi_InitCommon + + arm_func_start __VENEER_SVC_CpuSet +__VENEER_SVC_CpuSet: ; 0x03802F74 + ldr ip, _03802F7C ; =SVC_CpuSet + bx ip + .align 2, 0 +_03802F7C: .word SVC_CpuSet + arm_func_end __VENEER_SVC_CpuSet + + arm_func_start CTRDG_IsPulledOut +CTRDG_IsPulledOut: ; 0x03802F80 + stmdb sp!, {r3, lr} + ldr r2, _03802FC8 ; =0x027FFC30 + ldr r0, _03802FCC ; =0x0000FFFF + ldrh r1, [r2] + cmp r1, r0 + moveq r0, #0 + beq _03802FC0 + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1e + movs r0, r0, lsr #0x1f + bne _03802FB0 + bl CTRDG_IsExisting +_03802FB0: + ldr r0, _03802FC8 ; =0x027FFC30 + ldrb r0, [r0, #5] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1f +_03802FC0: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03802FC8: .word 0x027FFC30 +_03802FCC: .word 0x0000FFFF + arm_func_end CTRDG_IsPulledOut + + arm_func_start CTRDG_IsExisting +CTRDG_IsExisting: ; 0x03802FD0 + stmdb sp!, {r4, lr} + sub sp, sp, #0x10 + ldr r2, _038030E8 ; =0x027FFC30 + mov r4, #1 + ldrh r1, [r2] + rsb r0, r4, #0x10000 + cmp r1, r0 + moveq r0, #0 + beq _038030DC + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1f + cmp r0, #1 + moveq r0, #0 + beq _038030DC + ldr r0, _038030EC ; =CTRDGi_EnableFlag + add r1, sp, #8 + ldrh r0, [r0, #6] + bl CTRDGi_LockByProcessor + cmp r0, #0 + bne _03803034 + ldr r0, [sp, #0xc] + bl OS_RestoreInterrupts + mov r0, r4 + b _038030DC +_03803034: + add r0, sp, #0 + bl CTRDGi_ChangeLatestAccessCycle + mov r0, #0x8000000 + ldrb r2, [r0, #0xb2] + cmp r2, #0x96 + bne _03803060 + ldr r1, _038030E8 ; =0x027FFC30 + ldrh r0, [r0, #0xbe] + ldrh r1, [r1] + cmp r1, r0 + bne _038030A4 +_03803060: + cmp r2, #0x96 + ldrne r1, _038030E8 ; =0x027FFC30 + ldrne r0, _038030F0 ; =0x0801FFFE + ldrneh r1, [r1] + ldrneh r0, [r0] + cmpne r1, r0 + bne _038030A4 + ldr r2, _038030E8 ; =0x027FFC30 + mov r0, #0x8000000 + ldr r1, [r2, #8] + ldr r0, [r0, #0xac] + cmp r1, r0 + beq _038030B8 + ldrb r0, [r2, #5] + mov r0, r0, lsl #0x1f + movs r0, r0, lsr #0x1f + beq _038030B8 +_038030A4: + ldr r1, _038030E8 ; =0x027FFC30 + mov r4, #0 + ldrb r0, [r1, #5] + orr r0, r0, #2 + strb r0, [r1, #5] +_038030B8: + ldr r0, [sp] + bl MI_SetCartridgeRomCycle1st + ldr r0, [sp, #4] + bl MI_SetCartridgeRomCycle2nd + ldr r0, _038030EC ; =CTRDGi_EnableFlag + add r1, sp, #8 + ldrh r0, [r0, #6] + bl CTRDGi_UnlockByProcessor + mov r0, r4 +_038030DC: + add sp, sp, #0x10 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_038030E8: .word 0x027FFC30 +_038030EC: .word CTRDGi_EnableFlag +_038030F0: .word 0x0801FFFE + arm_func_end CTRDG_IsExisting + + arm_func_start CTRDGi_ChangeLatestAccessCycle +CTRDGi_ChangeLatestAccessCycle: ; 0x038030F4 + stmdb sp!, {r3, lr} + ldr r2, _03803134 ; =0x04000204 + ldrh r1, [r2] + and r1, r1, #0xc + mov r1, r1, asr #2 + str r1, [r0] + ldrh r1, [r2] + and r1, r1, #0x10 + mov r1, r1, asr #4 + str r1, [r0, #4] + mov r0, #3 + bl MI_SetCartridgeRomCycle1st + mov r0, #0 + bl MI_SetCartridgeRomCycle2nd + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03803134: .word 0x04000204 + arm_func_end CTRDGi_ChangeLatestAccessCycle + + arm_func_start MI_SetCartridgeRomCycle1st +MI_SetCartridgeRomCycle1st: ; 0x03803138 + ldr r2, _03803150 ; =0x04000204 + ldrh r1, [r2] + bic r1, r1, #0xc + orr r0, r1, r0, lsl #2 + strh r0, [r2] + bx lr + .align 2, 0 +_03803150: .word 0x04000204 + arm_func_end MI_SetCartridgeRomCycle1st + + arm_func_start MI_SetCartridgeRomCycle2nd +MI_SetCartridgeRomCycle2nd: ; 0x03803154 + ldr r2, _0380316C ; =0x04000204 + ldrh r1, [r2] + bic r1, r1, #0x10 + orr r0, r1, r0, lsl #4 + strh r0, [r2] + bx lr + .align 2, 0 +_0380316C: .word 0x04000204 + arm_func_end MI_SetCartridgeRomCycle2nd + + arm_func_start CTRDGi_LockByProcessor +CTRDGi_LockByProcessor: ; 0x03803170 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + bl OS_DisableInterrupts + str r0, [r4, #4] + ldr r0, _038031BC ; =0x027FFFE8 + bl OS_ReadOwnerOfLockWord + ands r0, r0, #0x80 + str r0, [r4] + bne _038031A8 + mov r0, r5 + bl OS_TryLockCartridge + cmp r0, #0 + bne _038031B0 +_038031A8: + mov r0, #1 + b _038031B4 +_038031B0: + mov r0, #0 +_038031B4: + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_038031BC: .word 0x027FFFE8 + arm_func_end CTRDGi_LockByProcessor + + arm_func_start CTRDGi_UnlockByProcessor +CTRDGi_UnlockByProcessor: ; 0x038031C0 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, [r4] + cmp r1, #0 + bne _038031D8 + bl OS_UnLockCartridge +_038031D8: + ldr r0, [r4, #4] + bl OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + arm_func_end CTRDGi_UnlockByProcessor + + arm_func_start CTRDGi_SendtoPxi +CTRDGi_SendtoPxi: ; 0x038031E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, #1 + mov r5, #0xd + mov r4, #0 + b _03803208 +_03803200: + mov r0, r6 + bl VENEER_SVC_WaitByLoop +_03803208: + mov r0, r5 + mov r1, r7 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _03803200 + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end CTRDGi_SendtoPxi + + arm_func_start CTRDG_Init +CTRDG_Init: ; 0x03803228 + stmdb sp!, {r3, lr} + bl OS_InitTick + bl OS_InitAlarm + ldr r0, _038032B0 ; =pulse_edge_alarm + bl OS_CreateAlarm + ldr r0, _038032B4 ; =lock_id + ldr r1, [r0, #0x14] + cmp r1, #0 + bne _038032A8 + mov r1, #1 + str r1, [r0, #0x14] + bl CTRDGi_InitCommon + bl OS_GetLockID + mvn r1, #2 + cmp r0, r1 + beq _038032A8 + ldr r1, _038032B4 ; =lock_id + strh r0, [r1] + bl PXI_Init + ldr r1, _038032B8 ; =CTRDGi_CallbackForInitModuleInfo + mov r0, #0xd + bl PXI_SetFifoRecvCallback + bl CTRDGi_InitModuleInfo + ldr r1, _038032BC ; =CTRDGi_CallbackForPulledOut + mov r0, #0xd + bl PXI_SetFifoRecvCallback + ldr r1, _038032C0 ; =CTRDGi_CallbackForCTREx + mov r0, #0x10 + bl PXI_SetFifoRecvCallback + ldr r1, _038032C4 ; =CTRDGi_CallbackForSetPhi + mov r0, #0x11 + bl PXI_SetFifoRecvCallback +_038032A8: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_038032B0: .word pulse_edge_alarm +_038032B4: .word lock_id +_038032B8: .word CTRDGi_CallbackForInitModuleInfo +_038032BC: .word CTRDGi_CallbackForPulledOut +_038032C0: .word CTRDGi_CallbackForCTREx +_038032C4: .word CTRDGi_CallbackForSetPhi + arm_func_end CTRDG_Init + + arm_func_start CTRDGi_InitModuleInfo +CTRDGi_InitModuleInfo: ; 0x038032C8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r0, _03803424 ; =lock_id + ldr r1, [r0, #8] + cmp r1, #0 + bne _0380341C + ldr r1, _03803428 ; =0x04000300 + mov r2, #1 + ldrh r1, [r1] + str r2, [r0, #8] + tst r1, #1 + beq _0380341C + mov r0, #0x40000 + bl OS_SetIrqMask + ldr r2, _0380342C ; =0x04000208 + mov r1, #1 + ldrh sb, [r2] + ldr r5, _03803424 ; =lock_id + mov r4, r0 + strh r1, [r2] + mov r6, #0x100 + b _03803324 +_0380331C: + mov r0, r6 + bl VENEER_SVC_WaitByLoop +_03803324: + ldr r0, [r5, #0x28] + cmp r0, #1 + bne _0380331C + ldr r0, _03803424 ; =lock_id + mov r1, #0x8000000 + ldr r2, [r0, #0x18] + ldr r0, _03803430 ; =0x01FFFFC0 + add r8, r1, #4 + and r0, r2, r0 + mov r0, r0, lsr #6 + mov r0, r0, lsl #5 + add r5, r0, #0x2000000 + mov r6, #1 + bl OS_GetLockID + mov r0, r0, lsl #0x10 + mov r7, r0, lsr #0x10 + mov r0, r7 + bl OS_LockCartridge + ldr ip, _03803434 ; =0x0000FFFF + mov sl, #0 + eor r0, ip, #3 + eor r1, ip, #0x84 + mov r0, r0, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r2, r0, lsr #0x10 + mov r3, r1, lsr #0x10 + b _038033CC +_03803390: + mov lr, ip + cmp sl, #0x4c + moveq lr, r3 + beq _038033A8 + cmp sl, #0x4d + moveq lr, r2 +_038033A8: + add r0, r5, sl, lsl #1 + mov r1, sl, lsl #1 + ldrh r0, [r0, #4] + ldrh r1, [r8, r1] + and r0, lr, r0 + cmp r0, r1 + movne r6, #0 + bne _038033D4 + add sl, sl, #1 +_038033CC: + cmp sl, #0x4e + blt _03803390 +_038033D4: + mov r0, r7 + bl OS_UnLockCartridge + mov r0, r7 + bl OS_ReleaseLockID + ldr r2, _03803438 ; =0x027FFC30 + and r0, r6, #0xff + ldrb r1, [r2, #5] + and r0, r0, #1 + bic r1, r1, #1 + orr r1, r1, r0 + mov r0, #1 + strb r1, [r2, #5] + bl CTRDGi_SendtoPxi + ldr r2, _0380342C ; =0x04000208 + mov r0, r4 + ldrh r1, [r2] + strh sb, [r2] + bl OS_SetIrqMask +_0380341C: + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_03803424: .word lock_id +_03803428: .word 0x04000300 +_0380342C: .word 0x04000208 +_03803430: .word 0x01FFFFC0 +_03803434: .word 0x0000FFFF +_03803438: .word 0x027FFC30 + arm_func_end CTRDGi_InitModuleInfo + + arm_func_start CTRDGi_CallbackForInitModuleInfo +CTRDGi_CallbackForInitModuleInfo: ; 0x0380343C + stmdb sp!, {r3, lr} + and r0, r1, #0x3f + cmp r0, #1 + ldreq r0, _03803468 ; =lock_id + moveq r2, #1 + streq r1, [r0, #0x18] + streq r2, [r0, #0x28] + beq _03803460 + bl OS_Terminate +_03803460: + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03803468: .word lock_id + arm_func_end CTRDGi_CallbackForInitModuleInfo + + arm_func_start CTRDGi_CallbackForPulledOut +CTRDGi_CallbackForPulledOut: ; 0x0380346C + stmdb sp!, {r3, lr} + and r0, r1, #0x3f + cmp r0, #2 + bne _03803494 + mov r0, #0 + bl CTRDG_VibPulseEdgeUpdate + bl SND_BeginSleep + bl WVR_Shutdown + bl OS_Terminate + b _03803498 +_03803494: + bl OS_Terminate +_03803498: + ldmia sp!, {r3, lr} + bx lr + arm_func_end CTRDGi_CallbackForPulledOut + + arm_func_start CTRDGi_CallbackForCTREx +CTRDGi_CallbackForCTREx: ; 0x038034A0 + ldr ip, _038034AC ; =CTRDG_VibPulseEdgeUpdate + mov r0, r1 + bx ip + .align 2, 0 +_038034AC: .word CTRDG_VibPulseEdgeUpdate + arm_func_end CTRDGi_CallbackForCTREx + + arm_func_start CTRDG_VibPulseEdgeUpdate +CTRDG_VibPulseEdgeUpdate: ; 0x038034B0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs r5, r0 + beq _038034EC + ldr r0, [r5] + cmp r0, #0 + bne _038034EC + ldr r0, [r5, #0x44] + add r0, r0, #1 + str r0, [r5, #0x44] + ldr r1, [r5, #0x40] + cmp r1, #0 + beq _038034EC + ldr r0, [r5, #0x44] + cmp r0, r1 + movhi r5, #0 +_038034EC: + cmp r5, #0 + ldrne r0, [r5, #0x3c] + cmpne r0, #0 + bne _03803590 + bl OS_DisableInterrupts + ldr r4, _038036CC ; =lock_id + mov sb, r0 + ldr r0, [r4, #4] + cmp r0, #2 + bne _0380357C + mov sl, #0 + ldr r7, _038036D0 ; =0x027FFFE8 + ldr r5, _038036D4 ; =0x08001000 + mov r6, sl + mov fp, #1 + b _03803574 +_0380352C: + mov r0, r7 + bl OS_ReadOwnerOfLockWord + ands r8, r0, #0x80 + bne _0380354C + ldrh r0, [r4] + bl OS_TryLockCartridge + cmp r0, #0 + bne _0380356C +_0380354C: + str r6, [r4, #4] + mov sl, fp + strh r6, [r5] + cmp r8, #0 + bne _03803574 + ldrh r0, [r4] + bl OS_UnlockCartridge + b _03803574 +_0380356C: + ldr r0, _038036D8 ; =0x000080E8 + bl OS_SpinWait +_03803574: + cmp sl, #0 + beq _0380352C +_0380357C: + ldr r0, _038036DC ; =pulse_edge_alarm + bl OS_CancelAlarm + mov r0, sb + bl OS_RestoreInterrupts + b _038036C4 +_03803590: + cmp r5, #0 + beq _038036C4 + ldr r0, _038036D0 ; =0x027FFFE8 + bl OS_ReadOwnerOfLockWord + ands r4, r0, #0x80 + bne _038035BC + ldr r0, _038036CC ; =lock_id + ldrh r0, [r0] + bl OS_TryLockCartridge + cmp r0, #0 + bne _038036AC +_038035BC: + ldr r1, [r5] + ldr r0, [r5, #4] + cmp r1, r0 + bne _03803604 + ldr r0, _038036CC ; =lock_id + mov r2, #0 + ldr r1, _038036D4 ; =0x08001000 + str r2, [r0, #4] + strh r2, [r1] + str r5, [sp] + ldr r1, [r5, #8] + ldr r0, _038036DC ; =pulse_edge_alarm + ldr r3, _038036E0 ; =CTRDG_VibPulseEdgeUpdate + mov r2, #0 + bl OS_SetAlarm + mov r0, #0 + str r0, [r5] + b _03803694 +_03803604: + tst r1, #1 + ldr r1, _038036D4 ; =0x08001000 + beq _03803654 + ldr r0, _038036CC ; =lock_id + mov r2, #0 + str r2, [r0, #4] + strh r2, [r1] + str r5, [sp] + ldr r1, [r5] + ldr r0, _038036DC ; =pulse_edge_alarm + mov r1, r1, lsr #1 + add r1, r5, r1, lsl #2 + ldr r1, [r1, #0x24] + ldr r3, _038036E0 ; =CTRDG_VibPulseEdgeUpdate + mov r2, #0 + bl OS_SetAlarm + ldr r0, [r5] + add r0, r0, #1 + str r0, [r5] + b _03803694 +_03803654: + ldr r0, _038036CC ; =lock_id + mov r2, #2 + str r2, [r0, #4] + strh r2, [r1] + str r5, [sp] + ldr r1, [r5] + ldr r0, _038036DC ; =pulse_edge_alarm + mov r1, r1, lsr #1 + add r1, r5, r1, lsl #2 + ldr r1, [r1, #0xc] + ldr r3, _038036E0 ; =CTRDG_VibPulseEdgeUpdate + mov r2, #0 + bl OS_SetAlarm + ldr r0, [r5] + add r0, r0, #1 + str r0, [r5] +_03803694: + cmp r4, #0 + bne _038036C4 + ldr r0, _038036CC ; =lock_id + ldrh r0, [r0] + bl OS_UnlockCartridge + b _038036C4 +_038036AC: + ldr r0, _038036DC ; =pulse_edge_alarm + ldr r1, _038036E4 ; =0x0000020B + ldr r3, _038036E0 ; =CTRDG_VibPulseEdgeUpdate + mov r2, #0 + str r5, [sp] + bl OS_SetAlarm +_038036C4: + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_038036CC: .word lock_id +_038036D0: .word 0x027FFFE8 +_038036D4: .word 0x08001000 +_038036D8: .word 0x000080E8 +_038036DC: .word pulse_edge_alarm +_038036E0: .word CTRDG_VibPulseEdgeUpdate +_038036E4: .word 0x0000020B + arm_func_end CTRDG_VibPulseEdgeUpdate + + arm_func_start CTRDG_CheckPullOut_Polling +CTRDG_CheckPullOut_Polling: ; 0x038036E8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, _038037D8 ; =isFirstCheck$3769 + mvn r0, #0 + ldr r3, [r1, #4] + cmp r3, r0 + ldreq r0, _038037DC ; =0x027FFC3C + ldreq r0, [r0] + addeq r0, r0, #0xa + streq r0, [r1, #4] + beq _038037D0 + ldr r0, _038037E0 ; =lock_id + ldr r2, [r0, #0x10] + cmp r2, #0 + ldreq r0, [r0, #0xc] + cmpeq r0, #0 + bne _038037D0 + ldr r2, _038037DC ; =0x027FFC3C + ldr r0, [r2] + cmp r0, r3 + blo _038037D0 + ldr r0, [r2] + add r0, r0, #0xa + str r0, [r1, #4] + bl CTRDG_IsPulledOut + ldr r1, _038037E0 ; =lock_id + str r0, [r1, #0xc] + bl CTRDG_IsExisting + cmp r0, #0 + bne _03803780 + ldr r0, _038037D8 ; =isFirstCheck$3769 + mov r1, #1 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, _038037E0 ; =lock_id + strne r1, [r0, #0x10] + bne _038037D0 + ldr r0, _038037E0 ; =lock_id + str r1, [r0, #0xc] +_03803780: + ldr r0, _038037E0 ; =lock_id + ldr r1, _038037D8 ; =isFirstCheck$3769 + ldr r0, [r0, #0xc] + mov r2, #0 + str r2, [r1] + cmp r0, #0 + beq _038037D0 + mov r7, #0x64 + mov r6, #0xd + mov r5, #0x11 + mov r4, r2 + b _038037B8 +_038037B0: + mov r0, r7 + bl OS_Sleep +_038037B8: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _038037B0 +_038037D0: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_038037D8: .word isFirstCheck$3769 +_038037DC: .word 0x027FFC3C +_038037E0: .word lock_id + arm_func_end CTRDG_CheckPullOut_Polling + + arm_func_start CTRDGi_CallbackForSetPhi +CTRDGi_CallbackForSetPhi: ; 0x038037E4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + and r0, r1, #0x3f + cmp r0, #3 + bne _0380384C + ldr r3, _03803858 ; =0x04000204 + ldr r0, _0380385C ; =0x01FFFFC0 + ldrh r2, [r3] + and r0, r1, r0 + mov r1, r0, lsr #6 + bic r0, r2, #0x60 + orr r0, r0, r1, lsl #5 + strh r0, [r3] + mov r7, #1 + mov r6, #0x11 + mov r5, #0x12 + mov r4, #0 + b _03803830 +_03803828: + mov r0, r7 + bl VENEER_SVC_WaitByLoop +_03803830: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + bne _03803828 + b _03803850 +_0380384C: + bl OS_Terminate +_03803850: + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03803858: .word 0x04000204 +_0380385C: .word 0x01FFFFC0 + arm_func_end CTRDGi_CallbackForSetPhi + + arm_func_start NVRAM_Init +NVRAM_Init: ; 0x03803860 + ldr r0, _03803884 ; =nvramw + mov r3, #0 + mov r2, r3 +_0380386C: + mov r1, r3, lsl #1 + add r3, r3, #1 + strh r2, [r0, r1] + cmp r3, #0x10 + blt _0380386C + bx lr + .align 2, 0 +_03803884: .word nvramw + arm_func_end NVRAM_Init + + arm_func_start NVRAM_AnalyzeCommand +NVRAM_AnalyzeCommand: ; 0x03803888 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + tst r0, #0x2000000 + beq _038038B8 + ldr r2, _03803A28 ; =nvramw + mov r5, #0 + mov lr, r5 +_038038A4: + mov r4, r5, lsl #1 + add r5, r5, #1 + strh lr, [r2, r4] + cmp r5, #0x10 + blt _038038A4 +_038038B8: + ldr r2, _03803A28 ; =nvramw + and r4, r0, #0xf0000 + mov r4, r4, lsr #0x10 + mov r4, r4, lsl #1 + strh r0, [r2, r4] + tst r0, #0x1000000 + beq _03803A1C + ldr lr, _03803A2C ; =nvramw + ldrh r0, [lr] + and r2, r0, #0xff00 + mov r2, r2, lsl #8 + mov r4, r2, lsr #0x10 + sub r2, r4, #0x22 + cmp r2, #0xa + addls pc, pc, r2, lsl #2 + b _038039F0 +_038038F8: ; jump table + b _03803924 ; case 0 + b _0380395C ; case 1 + b _0380395C ; case 2 + b _038039A4 ; case 3 + b _038039A4 ; case 4 + b _038039E4 ; case 5 + b _038039E4 ; case 6 + b _038039F0 ; case 7 + b _038039F0 ; case 8 + b _038039F0 ; case 9 + b _03803924 ; case 10 +_03803924: + ldrh ip, [lr, #4] + ldrh r2, [lr, #2] + mov r0, r0, lsl #0x18 + and ip, ip, #0xff00 + orr r0, r0, r2, lsl #8 + orr ip, r0, ip, lsr #8 + cmp ip, #0x2000000 + blo _0380394C + cmp ip, #0x2800000 + blo _038039F0 +_0380394C: + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _03803A1C +_0380395C: + ldrh r2, [lr, #8] + ldrh r1, [lr, #0xa] + orr ip, r1, r2, lsl #16 + cmp ip, #0x2000000 + blo _03803978 + cmp ip, #0x2800000 + blo _03803988 +_03803978: + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _03803A1C +_03803988: + ldrh r2, [lr, #2] + mov r3, r0, lsl #0x18 + ldrh r1, [lr, #4] + ldrh r0, [lr, #6] + orr r3, r2, r3, lsr #8 + orr r1, r0, r1, lsl #16 + b _038039F0 +_038039A4: + ldrh r2, [lr, #6] + ldrh r1, [lr, #8] + orr ip, r1, r2, lsl #16 + cmp ip, #0x2000000 + blo _038039C0 + cmp ip, #0x2800000 + blo _038039D0 +_038039C0: + mov r0, r4 + mov r1, #2 + bl SPIi_ReturnResult + b _03803A1C +_038039D0: + ldrh r2, [lr, #2] + mov r0, r0, lsl #0x18 + ldrh r1, [lr, #4] + orr r3, r2, r0, lsr #8 + b _038039F0 +_038039E4: + ldrh r2, [lr, #2] + mov r0, r0, lsl #0x18 + orr r3, r2, r0, lsr #8 +_038039F0: + str r1, [sp] + mov r1, r4 + mov r0, #1 + mov r2, #3 + str ip, [sp, #4] + bl SPIi_SetEntry + cmp r0, #0 + bne _03803A1C + mov r0, r4 + mov r1, #4 + bl SPIi_ReturnResult +_03803A1C: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_03803A28: .word nvramw +_03803A2C: .word nvramw + arm_func_end NVRAM_AnalyzeCommand + + arm_func_start NVRAM_ExecuteProcess +NVRAM_ExecuteProcess: ; 0x03803A30 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl OS_DisableInterrupts + mov r5, r0 + mov r0, #1 + bl SPIi_CheckException + cmp r0, #0 + bne _03803A70 + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #4] + mov r1, #4 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + b _03803CFC +_03803A70: + mov r0, #1 + bl SPIi_GetException + mov r0, r5 + bl OS_RestoreInterrupts + ldr r0, [r4, #4] + sub r0, r0, #0x20 + cmp r0, #0xd + addls pc, pc, r0, lsl #2 + b _03803CC0 +_03803A94: ; jump table + b _03803ACC ; case 0 + b _03803AD4 ; case 1 + b _03803ADC ; case 2 + b _03803AE8 ; case 3 + b _03803B28 ; case 4 + b _03803B68 ; case 5 + b _03803BB0 ; case 6 + b _03803BF8 ; case 7 + b _03803C30 ; case 8 + b _03803C68 ; case 9 + b _03803C70 ; case 10 + b _03803C78 ; case 11 + b _03803CAC ; case 12 + b _03803CB8 ; case 13 +_03803ACC: + bl NVRAM_WriteEnable + b _03803CE0 +_03803AD4: + bl NVRAM_WriteDisable + b _03803CE0 +_03803ADC: + ldr r0, [r4, #0x10] + bl NVRAM_ReadStatusRegister + b _03803CE0 +_03803AE8: + bl NvramCheckReadyToRead + cmp r0, #0 + bne _03803B14 + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803B14: + ldr r0, [r4, #8] + ldr r1, [r4, #0xc] + ldr r2, [r4, #0x10] + bl NVRAM_ReadDataBytes + b _03803CE0 +_03803B28: + bl NvramCheckReadyToRead + cmp r0, #0 + bne _03803B54 + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803B54: + ldr r0, [r4, #8] + ldr r1, [r4, #0xc] + ldr r2, [r4, #0x10] + bl NVRAM_ReadDataBytesAtHigherSpeed + b _03803CE0 +_03803B68: + bl NvramCheckReadyToWrite + cmp r0, #0 + bne _03803B94 + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803B94: + ldr r1, [r4, #0xc] + ldr r0, [r4, #8] + mov r1, r1, lsl #0x10 + ldr r2, [r4, #0x10] + mov r1, r1, lsr #0x10 + bl NVRAM_PageWrite + b _03803CE0 +_03803BB0: + bl NvramCheckReadyToWrite + cmp r0, #0 + bne _03803BDC + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803BDC: + ldr r1, [r4, #0xc] + ldr r0, [r4, #8] + mov r1, r1, lsl #0x10 + ldr r2, [r4, #0x10] + mov r1, r1, lsr #0x10 + bl NVRAM_PageProgram + b _03803CE0 +_03803BF8: + bl NvramCheckReadyToWrite + cmp r0, #0 + bne _03803C24 + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803C24: + ldr r0, [r4, #8] + bl NVRAM_PageErase + b _03803CE0 +_03803C30: + bl NvramCheckReadyToWrite + cmp r0, #0 + bne _03803C5C + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803C5C: + ldr r0, [r4, #8] + bl NVRAM_SectorErase + b _03803CE0 +_03803C68: + bl NVRAM_DeepPowerDown + b _03803CE0 +_03803C70: + bl NVRAM_ReleaseFromDeepPowerDown + b _03803CE0 +_03803C78: + bl NvramCheckReadyToWrite + cmp r0, #0 + bne _03803CA4 + ldr r0, [r4, #4] + mov r1, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException + b _03803CFC +_03803CA4: + bl NVRAM_ChipErase + b _03803CE0 +_03803CAC: + ldr r0, [r4, #0x10] + bl NVRAM_ReadSiliconId + b _03803CE0 +_03803CB8: + bl NVRAM_SoftwareReset + b _03803CE0 +_03803CC0: + mov r0, #1 + bl SPIi_ReleaseException + ldr r0, [r4, #4] + mov r1, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + b _03803CFC +_03803CE0: + ldr r0, [r4, #4] + mov r1, #0 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl SPIi_ReturnResult + mov r0, #1 + bl SPIi_ReleaseException +_03803CFC: + ldmia sp!, {r3, r4, r5, lr} + bx lr + arm_func_end NVRAM_ExecuteProcess + + arm_func_start NvramCheckReadyToRead +NvramCheckReadyToRead: ; 0x03803D04 + stmdb sp!, {r3, lr} + add r0, sp, #0 + bl NVRAM_ReadStatusRegister + ldrh r0, [sp] + tst r0, #1 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r3, lr} + bx lr + arm_func_end NvramCheckReadyToRead + + arm_func_start NvramCheckReadyToWrite +NvramCheckReadyToWrite: ; 0x03803D28 + stmdb sp!, {r3, lr} + add r0, sp, #0 + bl NVRAM_ReadStatusRegister + ldrh r0, [sp] + tst r0, #1 + movne r0, #0 + bne _03803D50 + tst r0, #2 + movne r0, #1 + moveq r0, #0 +_03803D50: + ldmia sp!, {r3, lr} + bx lr + arm_func_end NvramCheckReadyToWrite + + arm_func_start NVRAM_WriteEnable +NVRAM_WriteEnable: ; 0x03803D58 + ldr r2, _03803D90 ; =0x040001C0 +_03803D5C: + ldrh r0, [r2] + tst r0, #0x80 + bne _03803D5C + ldr r0, _03803D94 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #6 + strh r1, [r0] + sub r1, r0, #2 +_03803D80: + ldrh r0, [r1] + tst r0, #0x80 + bne _03803D80 + bx lr + .align 2, 0 +_03803D90: .word 0x040001C0 +_03803D94: .word 0x040001C2 + arm_func_end NVRAM_WriteEnable + + arm_func_start SPI_SendWait_03803D98 +SPI_SendWait_03803D98: ; 0x03803D98 + ldr r1, _03803DB8 ; =0x040001C2 + and r0, r0, #0xff + strh r0, [r1] + sub r1, r1, #2 +_03803DA8: + ldrh r0, [r1] + tst r0, #0x80 + bne _03803DA8 + bx lr + .align 2, 0 +_03803DB8: .word 0x040001C2 + arm_func_end SPI_SendWait_03803D98 + + arm_func_start NVRAM_WriteDisable +NVRAM_WriteDisable: ; 0x03803DBC + ldr r2, _03803DF4 ; =0x040001C0 +_03803DC0: + ldrh r0, [r2] + tst r0, #0x80 + bne _03803DC0 + ldr r0, _03803DF8 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #4 + strh r1, [r0] + sub r1, r0, #2 +_03803DE4: + ldrh r0, [r1] + tst r0, #0x80 + bne _03803DE4 + bx lr + .align 2, 0 +_03803DF4: .word 0x040001C0 +_03803DF8: .word 0x040001C2 + arm_func_end NVRAM_WriteDisable + + arm_func_start NVRAM_ReadStatusRegister +NVRAM_ReadStatusRegister: ; 0x03803DFC + ldr r3, _03803E64 ; =0x040001C0 +_03803E00: + ldrh r1, [r3] + tst r1, #0x80 + bne _03803E00 + ldr r1, _03803E68 ; =0x040001C2 + mov r2, #0x8900 + strh r2, [r3] + mov r2, #5 + strh r2, [r1] + sub r3, r1, #2 +_03803E24: + ldrh r1, [r3] + tst r1, #0x80 + bne _03803E24 + ldr r1, _03803E68 ; =0x040001C2 + mov r2, #0x8100 + strh r2, [r3] + mov r2, #0 + strh r2, [r1] + sub r2, r1, #2 +_03803E48: + ldrh r1, [r2] + tst r1, #0x80 + bne _03803E48 + ldr r1, _03803E68 ; =0x040001C2 + ldrh r1, [r1] + strb r1, [r0] + bx lr + .align 2, 0 +_03803E64: .word 0x040001C0 +_03803E68: .word 0x040001C2 + arm_func_end NVRAM_ReadStatusRegister + + arm_func_start NVRAM_ReadDataBytes +NVRAM_ReadDataBytes: ; 0x03803E6C + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r2 + cmp r1, #1 + blo _03803F5C + and r2, r0, #0xff00 + mov r2, r2, lsr #8 + and r3, r0, #0xff0000 + strh r2, [sp, #2] + mov r3, r3, lsr #0x10 + and r0, r0, #0xff + ldr r2, _03803F68 ; =0x040001C0 + strh r3, [sp] + strh r0, [sp, #4] +_03803EA4: + ldrh r0, [r2] + tst r0, #0x80 + bne _03803EA4 + ldr r4, _03803F6C ; =0x040001C2 + mov r0, #0x8900 + strh r0, [r2] + mov r0, #3 + strh r0, [r4] + mov ip, #0 + add r2, sp, #0 + sub r3, r4, #2 +_03803ED0: + ldrh r0, [r3] + tst r0, #0x80 + bne _03803ED0 + mov r0, ip, lsl #1 + ldrh r0, [r2, r0] + add ip, ip, #1 + and r0, r0, #0xff + strh r0, [r4] + cmp ip, #3 + blt _03803ED0 + ldr r2, _03803F68 ; =0x040001C0 +_03803EFC: + ldrh r0, [r2] + tst r0, #0x80 + bne _03803EFC + mov r4, #0 + ldr r2, _03803F68 ; =0x040001C0 + sub r0, r1, #1 + mov r3, r4 + b _03803F38 +_03803F1C: + strh r3, [r2, #2] +_03803F20: + ldrh r1, [r2] + tst r1, #0x80 + bne _03803F20 + ldrh r1, [r2, #2] + strb r1, [r5, r4] + add r4, r4, #1 +_03803F38: + cmp r4, r0 + blo _03803F1C + ldr r0, _03803F68 ; =0x040001C0 + mov r1, #0x8100 + strh r1, [r0] + bl SPI_DummyWait_03803F70 + ldr r0, _03803F6C ; =0x040001C2 + ldrh r0, [r0] + strb r0, [r5, r4] +_03803F5C: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_03803F68: .word 0x040001C0 +_03803F6C: .word 0x040001C2 + arm_func_end NVRAM_ReadDataBytes + + arm_func_start SPI_DummyWait_03803F70 +SPI_DummyWait_03803F70: ; 0x03803F70 + ldr r0, _03803F90 ; =0x040001C2 + mov r1, #0 + strh r1, [r0] + sub r1, r0, #2 +_03803F80: + ldrh r0, [r1] + tst r0, #0x80 + bne _03803F80 + bx lr + .align 2, 0 +_03803F90: .word 0x040001C2 + arm_func_end SPI_DummyWait_03803F70 + + arm_func_start NVRAM_ReadDataBytesAtHigherSpeed +NVRAM_ReadDataBytesAtHigherSpeed: ; 0x03803F94 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + mov r5, r2 + cmp r1, #1 + blo _038040A0 + and r2, r0, #0xff00 + mov r2, r2, lsr #8 + and r3, r0, #0xff0000 + strh r2, [sp, #2] + mov r3, r3, lsr #0x10 + and r0, r0, #0xff + ldr r2, _038040AC ; =0x040001C0 + strh r3, [sp] + strh r0, [sp, #4] +_03803FCC: + ldrh r0, [r2] + tst r0, #0x80 + bne _03803FCC + ldr r4, _038040B0 ; =0x040001C2 + mov r0, #0x8900 + strh r0, [r2] + mov r0, #0xb + strh r0, [r4] + mov ip, #0 + add r2, sp, #0 + sub r3, r4, #2 +_03803FF8: + ldrh r0, [r3] + tst r0, #0x80 + bne _03803FF8 + mov r0, ip, lsl #1 + ldrh r0, [r2, r0] + add ip, ip, #1 + and r0, r0, #0xff + strh r0, [r4] + cmp ip, #3 + blt _03803FF8 + ldr r2, _038040AC ; =0x040001C0 +_03804024: + ldrh r0, [r2] + tst r0, #0x80 + bne _03804024 + ldr r0, _038040B0 ; =0x040001C2 + mov r2, #0 + strh r2, [r0] + sub r2, r0, #2 +_03804040: + ldrh r0, [r2] + tst r0, #0x80 + bne _03804040 + mov r4, #0 + ldr r2, _038040AC ; =0x040001C0 + sub r0, r1, #1 + mov r3, r4 + b _0380407C +_03804060: + strh r3, [r2, #2] +_03804064: + ldrh r1, [r2] + tst r1, #0x80 + bne _03804064 + ldrh r1, [r2, #2] + strb r1, [r5, r4] + add r4, r4, #1 +_0380407C: + cmp r4, r0 + blo _03804060 + ldr r0, _038040AC ; =0x040001C0 + mov r1, #0x8100 + strh r1, [r0] + bl SPI_DummyWait_03803F70 + ldr r0, _038040B0 ; =0x040001C2 + ldrh r0, [r0] + strb r0, [r5, r4] +_038040A0: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_038040AC: .word 0x040001C0 +_038040B0: .word 0x040001C2 + arm_func_end NVRAM_ReadDataBytesAtHigherSpeed + + arm_func_start NVRAM_PageWrite +NVRAM_PageWrite: ; 0x038040B4 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + cmp r1, #1 + blo _038041AC + add r3, r0, r1 + sub r3, r3, #1 + mov r3, r3, lsr #8 + cmp r3, r0, lsr #8 + and r3, r0, #0xff00 + mov r3, r3, lsr #8 + andhi r1, r0, #0xff + and ip, r0, #0xff0000 + strh r3, [sp, #2] + rsbhi r1, r1, #0x100 + mov ip, ip, lsr #0x10 + and r0, r0, #0xff + movhi r1, r1, lsl #0x10 + ldr r3, _038041B8 ; =0x040001C0 + strh ip, [sp] + strh r0, [sp, #4] + movhi r1, r1, lsr #0x10 +_03804108: + ldrh r0, [r3] + tst r0, #0x80 + bne _03804108 + ldr lr, _038041BC ; =0x040001C2 + mov r0, #0x8900 + strh r0, [r3] + mov r0, #0xa + strh r0, [lr] + mov r4, #0 + add r3, sp, #0 + sub ip, lr, #2 +_03804134: + ldrh r0, [ip] + tst r0, #0x80 + bne _03804134 + mov r0, r4, lsl #1 + ldrh r0, [r3, r0] + add r4, r4, #1 + and r0, r0, #0xff + strh r0, [lr] + cmp r4, #3 + blt _03804134 + sub r3, r1, #1 + ldr r1, _038041B8 ; =0x040001C0 + mov r4, #0 + b _03804184 +_0380416C: + ldrh r0, [r1] + tst r0, #0x80 + bne _0380416C + ldrb r0, [r2, r4] + add r4, r4, #1 + strh r0, [r1, #2] +_03804184: + cmp r4, r3 + blt _0380416C + ldr r1, _038041B8 ; =0x040001C0 +_03804190: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804190 + mov r0, #0x8100 + strh r0, [r1] + ldrb r0, [r2, r4] + bl SPI_SendWait_03803D98 +_038041AC: + add sp, sp, #8 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_038041B8: .word 0x040001C0 +_038041BC: .word 0x040001C2 + arm_func_end NVRAM_PageWrite + + arm_func_start NVRAM_PageProgram +NVRAM_PageProgram: ; 0x038041C0 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + cmp r1, #1 + blo _038042B8 + add r3, r0, r1 + sub r3, r3, #1 + mov r3, r3, lsr #8 + cmp r3, r0, lsr #8 + and r3, r0, #0xff00 + mov r3, r3, lsr #8 + andhi r1, r0, #0xff + and ip, r0, #0xff0000 + strh r3, [sp, #2] + rsbhi r1, r1, #0x100 + mov ip, ip, lsr #0x10 + and r0, r0, #0xff + movhi r1, r1, lsl #0x10 + ldr r3, _038042C4 ; =0x040001C0 + strh ip, [sp] + strh r0, [sp, #4] + movhi r1, r1, lsr #0x10 +_03804214: + ldrh r0, [r3] + tst r0, #0x80 + bne _03804214 + ldr lr, _038042C8 ; =0x040001C2 + mov r0, #0x8900 + strh r0, [r3] + mov r0, #2 + strh r0, [lr] + mov r4, #0 + add r3, sp, #0 + sub ip, lr, #2 +_03804240: + ldrh r0, [ip] + tst r0, #0x80 + bne _03804240 + mov r0, r4, lsl #1 + ldrh r0, [r3, r0] + add r4, r4, #1 + and r0, r0, #0xff + strh r0, [lr] + cmp r4, #3 + blt _03804240 + sub r3, r1, #1 + ldr r1, _038042C4 ; =0x040001C0 + mov r4, #0 + b _03804290 +_03804278: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804278 + ldrb r0, [r2, r4] + add r4, r4, #1 + strh r0, [r1, #2] +_03804290: + cmp r4, r3 + blt _03804278 + ldr r1, _038042C4 ; =0x040001C0 +_0380429C: + ldrh r0, [r1] + tst r0, #0x80 + bne _0380429C + mov r0, #0x8100 + strh r0, [r1] + ldrb r0, [r2, r4] + bl SPI_SendWait_03803D98 +_038042B8: + add sp, sp, #8 + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_038042C4: .word 0x040001C0 +_038042C8: .word 0x040001C2 + arm_func_end NVRAM_PageProgram + + arm_func_start NVRAM_PageErase +NVRAM_PageErase: ; 0x038042CC + stmdb sp!, {r3, r4, r5, lr} + and r1, r0, #0xff0000 + mov r1, r1, lsr #0x10 + and r2, r0, #0xff00 + mov r2, r2, lsl #8 + ldr r3, _0380434C ; =0x040001C0 + mov r1, r1, lsl #0x10 + and r5, r0, #0xff + mov r0, r1, lsr #0x10 + mov r4, r2, lsr #0x10 +_038042F4: + ldrh r1, [r3] + tst r1, #0x80 + bne _038042F4 + ldr r1, _03804350 ; =0x040001C2 + mov r2, #0x8900 + strh r2, [r3] + mov r2, #0xdb + strh r2, [r1] + sub r2, r1, #2 +_03804318: + ldrh r1, [r2] + tst r1, #0x80 + bne _03804318 + bl SPI_SendWait_03803D98 + mov r0, r4 + bl SPI_SendWait_03803D98 + ldr r1, _0380434C ; =0x040001C0 + mov r2, #0x8100 + mov r0, r5 + strh r2, [r1] + bl SPI_SendWait_03803D98 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0380434C: .word 0x040001C0 +_03804350: .word 0x040001C2 + arm_func_end NVRAM_PageErase + + arm_func_start NVRAM_SectorErase +NVRAM_SectorErase: ; 0x03804354 + stmdb sp!, {r3, r4, r5, lr} + and r1, r0, #0xff0000 + mov r1, r1, lsr #0x10 + and r2, r0, #0xff00 + mov r2, r2, lsl #8 + ldr r3, _038043D4 ; =0x040001C0 + mov r1, r1, lsl #0x10 + and r5, r0, #0xff + mov r0, r1, lsr #0x10 + mov r4, r2, lsr #0x10 +_0380437C: + ldrh r1, [r3] + tst r1, #0x80 + bne _0380437C + ldr r1, _038043D8 ; =0x040001C2 + mov r2, #0x8900 + strh r2, [r3] + mov r2, #0xd8 + strh r2, [r1] + sub r2, r1, #2 +_038043A0: + ldrh r1, [r2] + tst r1, #0x80 + bne _038043A0 + bl SPI_SendWait_03803D98 + mov r0, r4 + bl SPI_SendWait_03803D98 + ldr r1, _038043D4 ; =0x040001C0 + mov r2, #0x8100 + mov r0, r5 + strh r2, [r1] + bl SPI_SendWait_03803D98 + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_038043D4: .word 0x040001C0 +_038043D8: .word 0x040001C2 + arm_func_end NVRAM_SectorErase + + arm_func_start NVRAM_DeepPowerDown +NVRAM_DeepPowerDown: ; 0x038043DC + ldr r2, _03804414 ; =0x040001C0 +_038043E0: + ldrh r0, [r2] + tst r0, #0x80 + bne _038043E0 + ldr r0, _03804418 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #0xb9 + strh r1, [r0] + sub r1, r0, #2 +_03804404: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804404 + bx lr + .align 2, 0 +_03804414: .word 0x040001C0 +_03804418: .word 0x040001C2 + arm_func_end NVRAM_DeepPowerDown + + arm_func_start NVRAM_ReleaseFromDeepPowerDown +NVRAM_ReleaseFromDeepPowerDown: ; 0x0380441C + ldr r2, _03804454 ; =0x040001C0 +_03804420: + ldrh r0, [r2] + tst r0, #0x80 + bne _03804420 + ldr r0, _03804458 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #0xab + strh r1, [r0] + sub r1, r0, #2 +_03804444: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804444 + bx lr + .align 2, 0 +_03804454: .word 0x040001C0 +_03804458: .word 0x040001C2 + arm_func_end NVRAM_ReleaseFromDeepPowerDown + + arm_func_start NVRAM_ChipErase +NVRAM_ChipErase: ; 0x0380445C + ldr r2, _03804494 ; =0x040001C0 +_03804460: + ldrh r0, [r2] + tst r0, #0x80 + bne _03804460 + ldr r0, _03804498 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #0xc7 + strh r1, [r0] + sub r1, r0, #2 +_03804484: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804484 + bx lr + .align 2, 0 +_03804494: .word 0x040001C0 +_03804498: .word 0x040001C2 + arm_func_end NVRAM_ChipErase + + arm_func_start NVRAM_ReadSiliconId +NVRAM_ReadSiliconId: ; 0x0380449C + stmdb sp!, {r3, lr} + ldr r3, _03804530 ; =0x040001C0 +_038044A4: + ldrh r1, [r3] + tst r1, #0x80 + bne _038044A4 + ldr r1, _03804534 ; =0x040001C2 + mov r2, #0x8900 + strh r2, [r3] + mov r2, #0x9f + strh r2, [r1] + sub r2, r1, #2 +_038044C8: + ldrh r1, [r2] + tst r1, #0x80 + bne _038044C8 + ldr r1, _03804534 ; =0x040001C2 + mov r2, #0 + strh r2, [r1] + sub lr, r1, #2 +_038044E4: + ldrh r1, [lr] + tst r1, #0x80 + bne _038044E4 + ldr ip, _03804534 ; =0x040001C2 + mov r2, #0x8100 + ldrh r3, [ip] + mov r1, #0 + strb r3, [r0] + strh r2, [lr] + strh r1, [ip] + sub r2, ip, #2 +_03804510: + ldrh r1, [r2] + tst r1, #0x80 + bne _03804510 + ldr r1, _03804534 ; =0x040001C2 + ldrh r1, [r1] + strb r1, [r0, #1] + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03804530: .word 0x040001C0 +_03804534: .word 0x040001C2 + arm_func_end NVRAM_ReadSiliconId + + arm_func_start NVRAM_SoftwareReset +NVRAM_SoftwareReset: ; 0x03804538 + ldr r2, _03804570 ; =0x040001C0 +_0380453C: + ldrh r0, [r2] + tst r0, #0x80 + bne _0380453C + ldr r0, _03804574 ; =0x040001C2 + mov r1, #0x8100 + strh r1, [r2] + mov r1, #0xff + strh r1, [r0] + sub r1, r0, #2 +_03804560: + ldrh r0, [r1] + tst r0, #0x80 + bne _03804560 + bx lr + .align 2, 0 +_03804570: .word 0x040001C0 +_03804574: .word 0x040001C2 + arm_func_end NVRAM_SoftwareReset + + arm_func_start RTC_Init +RTC_Init: ; 0x03804578 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0xc + ldr r2, _038047B8 ; =rtcInitialized + mov r8, r0 + ldrh r0, [r2] + cmp r0, #0 + bne _038047AC + ldr r1, _038047BC ; =rtcWork + mov r3, #1 + add r0, sp, #8 + strh r3, [r2] + str r3, [r1, #0x1d4] + bl RTC_ReadStatus1 + add r0, sp, #0xa + bl RTC_ReadStatus2 + ldrh r0, [sp, #8] + mov r1, r0, lsl #0x18 + movs r1, r1, lsr #0x1f + bne _038045E0 + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + bne _038045E0 + ldrh r0, [sp, #0xa] + mov r0, r0, lsl #0x18 + movs r0, r0, lsr #0x1f + beq _038045F8 +_038045E0: + ldrh r1, [sp, #8] + add r0, sp, #8 + bic r1, r1, #1 + orr r1, r1, #1 + strh r1, [sp, #8] + bl RTC_WriteStatus1 +_038045F8: + ldrh r0, [sp, #8] + mov r1, r0, lsl #0x1b + movs r1, r1, lsr #0x1f + bne _03804614 + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + beq _03804634 +_03804614: + ldrh r1, [sp, #0xa] + add r0, sp, #0xa + bic r1, r1, #0xf + strh r1, [sp, #0xa] + ldrh r1, [sp, #0xa] + bic r1, r1, #0x40 + strh r1, [sp, #0xa] + bl RTC_WriteStatus2 +_03804634: + ldr r0, _038047C0 ; =0x027FFDE8 + bl RTC_ReadDateTime + ldr r0, _038047C0 ; =0x027FFDE8 + ldr r0, [r0] + mov r0, r0, lsl #0xa + mov r0, r0, lsr #0x1a + bl RtcBCD2HEX + ldr r1, _038047C0 ; =0x027FFDE8 + mov r5, r0 + ldr r0, [r1] + mov r0, r0, lsl #0x13 + mov r0, r0, lsr #0x1b + bl RtcBCD2HEX + ldr r1, _038047C0 ; =0x027FFDE8 + mov r6, r0 + ldr r0, [r1] + mov r0, r0, lsl #0x18 + mov r0, r0, lsr #0x18 + bl RtcBCD2HEX + sub r1, r6, #1 + cmp r1, #1 + add r7, r0, #0x7d0 + subls r7, r7, #1 + mov r0, r7 + mov r1, #0x190 + addls r6, r6, #0xc + bl _u32_div_f + mov r4, r0 + mov r0, r7 + mov r1, #0x64 + bl _u32_div_f + mov r1, #0xd + mul r1, r6, r1 + mov r6, r0 + add r0, r1, #8 + mov r1, #5 + bl _u32_div_f + add r1, r7, r7, lsr #2 + sub r1, r1, r6 + add r1, r4, r1 + add r0, r1, r0 + add r0, r5, r0 + mov r1, #7 + bl _u32_div_f + ldr r0, _038047C0 ; =0x027FFDE8 + ldr r2, [r0] + mov r3, r2, lsl #5 + mov r3, r3, lsr #0x1d + cmp r3, r1 + beq _03804710 + bic r2, r2, #0x7000000 + mov r1, r1, lsl #0x1d + orr r1, r2, r1, lsr #5 + str r1, [r0] + bl RTC_WriteDateTime +_03804710: + mov r0, #1 + bl RTC_SetHourFormat + ldr r0, _038047BC ; =rtcWork + mov r1, #0 + str r1, [r0, #0x1d4] + bl PXI_Init + ldr r1, _038047C4 ; =RtcPxiCallback + mov r0, #5 + bl PXI_SetFifoRecvCallback + ldr r0, _038047BC ; =rtcWork + ldr r1, _038047C8 ; =rtcWork + 0x20 + mov r2, #4 + bl OS_InitMessageQueue + mov r0, #0x100 + stmia sp, {r0, r8} + ldr r0, _038047CC ; =rtcWork + 0x30 + ldr r1, _038047D0 ; =RtcThread + ldr r3, _038047D4 ; =rtcWork + 0x1D4 + mov r2, #0 + bl OS_CreateThread + ldr r0, _038047CC ; =rtcWork + 0x30 + bl OS_WakeupThreadDirect + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r0, #0x40 + mov r1, #0 + bl EXIi_SetBitRcnt0L + mov r0, #0x100 + mov r1, r0 + bl EXIi_SetBitRcnt0L + bl OS_DisableInterrupts + mov r4, r0 + ldr r1, _038047D8 ; =RtcAlarmIntr + mov r0, #0x80 + bl OS_SetIrqFunction + mov r0, #0x80 + bl OS_EnableIrqMask + mov r0, r4 + bl OS_RestoreInterrupts +_038047AC: + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, r7, r8, lr} + bx lr + .align 2, 0 +_038047B8: .word rtcInitialized +_038047BC: .word rtcWork +_038047C0: .word 0x027FFDE8 +_038047C4: .word RtcPxiCallback +_038047C8: .word rtcWork + 0x20 +_038047CC: .word rtcWork + 0x30 +_038047D0: .word RtcThread +_038047D4: .word rtcWork + 0x1D4 +_038047D8: .word RtcAlarmIntr + arm_func_end RTC_Init + + arm_func_start RtcPxiCallback +RtcPxiCallback: ; 0x038047DC + stmdb sp!, {r4, lr} + cmp r2, #0 + bne _03804908 + and r0, r1, #0x7f00 + mov r0, r0, lsl #8 + mov r4, r0, lsr #0x10 + cmp r4, #0x29 + addls pc, pc, r4, lsl #2 + b _038048FC +_03804800: ; jump table + b _038048A8 ; case 0 + b _038048A8 ; case 1 + b _038048FC ; case 2 + b _038048FC ; case 3 + b _038048FC ; case 4 + b _038048FC ; case 5 + b _038048FC ; case 6 + b _038048FC ; case 7 + b _038048FC ; case 8 + b _038048FC ; case 9 + b _038048FC ; case 10 + b _038048FC ; case 11 + b _038048FC ; case 12 + b _038048FC ; case 13 + b _038048FC ; case 14 + b _038048FC ; case 15 + b _038048A8 ; case 16 + b _038048A8 ; case 17 + b _038048A8 ; case 18 + b _038048A8 ; case 19 + b _038048A8 ; case 20 + b _038048A8 ; case 21 + b _038048A8 ; case 22 + b _038048A8 ; case 23 + b _038048A8 ; case 24 + b _038048A8 ; case 25 + b _038048FC ; case 26 + b _038048FC ; case 27 + b _038048FC ; case 28 + b _038048FC ; case 29 + b _038048FC ; case 30 + b _038048FC ; case 31 + b _038048FC ; case 32 + b _038048FC ; case 33 + b _038048FC ; case 34 + b _038048A8 ; case 35 + b _038048A8 ; case 36 + b _038048A8 ; case 37 + b _038048A8 ; case 38 + b _038048A8 ; case 39 + b _038048A8 ; case 40 + b _038048A8 ; case 41 +_038048A8: + ldr r0, _03804910 ; =rtcWork + ldr r1, [r0, #0x1d4] + cmp r1, #0 + beq _038048C8 + mov r0, r4 + mov r1, #3 + bl RtcReturnResult + b _03804908 +_038048C8: + ldr r3, _03804914 ; =rtcWork + 0x100 + mov r1, #1 + str r1, [r0, #0x1d4] + mov r1, #0 + mov r2, r1 + strh r4, [r3, #0xd8] + bl OS_SendMessage + cmp r0, #0 + bne _03804908 + mov r0, r4 + mov r1, #4 + bl RtcReturnResult + b _03804908 +_038048FC: + mov r0, r4 + mov r1, #1 + bl RtcReturnResult +_03804908: + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_03804910: .word rtcWork +_03804914: .word rtcWork + 0x100 + arm_func_end RtcPxiCallback + + arm_func_start RtcReturnResult +RtcReturnResult: ; 0x03804918 + stmdb sp!, {r4, r5, r6, lr} + mov r0, r0, lsl #8 + and r0, r0, #0x7f00 + orr r2, r0, #0x8000 + and r0, r1, #0xff + orr r6, r2, r0 + mov r5, #5 + mov r4, #0 +_03804938: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03804938 + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end RtcReturnResult + + arm_func_start RtcThread +RtcThread: ; 0x03804958 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r8, _03804DCC ; =0x027FFDE8 + mov r7, #0 + ldr sb, _03804DD0 ; =rtcWork + mov r6, r7 + mov r5, r7 + mov r4, r7 + mov sl, r7 + mov fp, r7 +_0380497C: + mov r0, sb + add r1, sp, #0 + mov r2, #1 + bl OS_ReceiveMessage + ldr r0, _03804DD4 ; =rtcWork + 0x100 + ldrh r0, [r0, #0xd8] + cmp r0, #0x29 + addls pc, pc, r0, lsl #2 + b _03804DB8 +_038049A0: ; jump table + b _03804A48 ; case 0 + b _03804A60 ; case 1 + b _03804DB8 ; case 2 + b _03804DB8 ; case 3 + b _03804DB8 ; case 4 + b _03804DB8 ; case 5 + b _03804DB8 ; case 6 + b _03804DB8 ; case 7 + b _03804DB8 ; case 8 + b _03804DB8 ; case 9 + b _03804DB8 ; case 10 + b _03804DB8 ; case 11 + b _03804DB8 ; case 12 + b _03804DB8 ; case 13 + b _03804DB8 ; case 14 + b _03804DB8 ; case 15 + b _03804A88 ; case 16 + b _03804AA8 ; case 17 + b _03804AC8 ; case 18 + b _03804AE8 ; case 19 + b _03804B24 ; case 20 + b _03804B60 ; case 21 + b _03804B9C ; case 22 + b _03804BBC ; case 23 + b _03804BDC ; case 24 + b _03804BFC ; case 25 + b _03804DB8 ; case 26 + b _03804DB8 ; case 27 + b _03804DB8 ; case 28 + b _03804DB8 ; case 29 + b _03804DB8 ; case 30 + b _03804DB8 ; case 31 + b _03804C1C ; case 32 + b _03804C3C ; case 33 + b _03804C64 ; case 34 + b _03804C84 ; case 35 + b _03804CC0 ; case 36 + b _03804CFC ; case 37 + b _03804D38 ; case 38 + b _03804D58 ; case 39 + b _03804D78 ; case 40 + b _03804D98 ; case 41 +_03804A48: + bl RTC_Reset + mov r0, #0 + mov r1, r0 + str r0, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804A60: + ldrh r0, [r8] + mov r0, r0, lsl #0x1e + mov r0, r0, lsr #0x1f + bl RTC_SetHourFormat + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #1 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804A88: + mov r0, r8 + bl RTC_ReadDateTime + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x10 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804AA8: + mov r0, r8 + bl RTC_ReadDate + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x11 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804AC8: + add r0, r8, #4 + bl RTC_ReadTime + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x12 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804AE8: + add r0, r8, #4 + bl RTC_ReadPulse + cmp r0, #0 + bne _03804B0C + mov r0, #0x13 + mov r1, #2 + str r7, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804B0C: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x13 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804B24: + add r0, r8, #4 + bl RTC_ReadAlarm1 + cmp r0, #0 + bne _03804B48 + mov r0, #0x14 + mov r1, #2 + str r6, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804B48: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x14 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804B60: + add r0, r8, #4 + bl RTC_ReadAlarm2 + cmp r0, #0 + bne _03804B84 + mov r0, #0x15 + mov r1, #2 + str r5, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804B84: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x15 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804B9C: + mov r0, r8 + bl RTC_ReadStatus1 + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x16 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804BBC: + add r0, r8, #2 + bl RTC_ReadStatus2 + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x17 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804BDC: + add r0, r8, #4 + bl RTC_ReadAdjust + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x18 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804BFC: + add r0, r8, #4 + bl RTC_ReadFree + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x19 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804C1C: + mov r0, r8 + bl RTC_WriteDateTime + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x20 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804C3C: + add r0, r8, #4 + bl RTC_ReadTime + mov r0, r8 + bl RTC_WriteDateTime + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x21 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804C64: + add r0, r8, #4 + bl RTC_WriteTime + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x22 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804C84: + add r0, r8, #4 + bl RTC_WritePulse + cmp r0, #0 + bne _03804CA8 + mov r0, #0x23 + mov r1, #2 + str r4, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804CA8: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x23 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804CC0: + add r0, r8, #4 + bl RTC_WriteAlarm1 + cmp r0, #0 + bne _03804CE4 + mov r0, #0x24 + mov r1, #2 + str sl, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804CE4: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x24 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804CFC: + add r0, r8, #4 + bl RTC_WriteAlarm2 + cmp r0, #0 + bne _03804D20 + mov r0, #0x25 + mov r1, #2 + str fp, [sb, #0x1d4] + bl RtcReturnResult + b _0380497C +_03804D20: + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x25 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804D38: + mov r0, r8 + bl RTC_WriteStatus1 + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x26 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804D58: + add r0, r8, #2 + bl RTC_WriteStatus2 + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x27 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804D78: + add r0, r8, #4 + bl RTC_WriteAdjust + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x28 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804D98: + add r0, r8, #4 + bl RTC_WriteFree + mov r0, #0 + str r0, [sb, #0x1d4] + mov r0, #0x29 + mov r1, #0 + bl RtcReturnResult + b _0380497C +_03804DB8: + mov r1, #0 + str r1, [sb, #0x1d4] + mov r1, #1 + bl RtcReturnResult + b _0380497C + .align 2, 0 +_03804DCC: .word 0x027FFDE8 +_03804DD0: .word rtcWork +_03804DD4: .word rtcWork + 0x100 + arm_func_end RtcThread + + arm_func_start RtcAlarmIntr +RtcAlarmIntr: ; 0x03804DD8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + add r0, sp, #2 + bl RTC_ReadStatus1 + ldrh r0, [sp, #2] + mov r1, r0, lsl #0x1b + movs r1, r1, lsr #0x1f + bne _03804E04 + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + beq _03804E5C +_03804E04: + add r0, sp, #0 + bl RTC_ReadStatus2 + ldrh r0, [sp, #2] + mov r4, #0 + mov r0, r0, lsl #0x1b + movs r0, r0, lsr #0x1f + ldrneh r0, [sp] + orrne r4, r4, #1 + bicne r0, r0, #0xf + strneh r0, [sp] + ldrh r0, [sp, #2] + mov r0, r0, lsl #0x1a + movs r0, r0, lsr #0x1f + ldrneh r0, [sp] + orrne r4, r4, #2 + bicne r0, r0, #0x40 + strneh r0, [sp] + add r0, sp, #0 + bl RTC_WriteStatus2 + mov r1, r4 + mov r0, #0x30 + bl RtcReturnResult +_03804E5C: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RtcAlarmIntr + + arm_func_start RtcBCD2HEX +RtcBCD2HEX: ; 0x03804E68 + stmdb sp!, {r4, lr} + mov ip, #0 + mov r2, ip + b _03804E94 +_03804E78: + mov r1, r2, lsl #2 + mov r1, r0, lsr r1 + and r1, r1, #0xf + cmp r1, #0xa + movhs r0, #0 + bhs _03804ED0 + add r2, r2, #1 +_03804E94: + cmp r2, #8 + blt _03804E78 + mov r4, #0 + mov lr, #1 + mov r2, #0xa +_03804EA8: + mov r1, r4, lsl #2 + mov r1, r0, lsr r1 + and r3, r1, #0xf + mul r1, lr, r2 + mla ip, lr, r3, ip + add r4, r4, #1 + mov lr, r1 + cmp r4, #8 + blt _03804EA8 + mov r0, ip +_03804ED0: + ldmia sp!, {r4, lr} + bx lr + arm_func_end RtcBCD2HEX + + arm_func_start RTC_Reset +RTC_Reset: ; 0x03804ED8 + stmdb sp!, {r3, lr} + mov r0, #0x8000 + bl EXIi_SelectRcnt + ldrh r0, [sp] + bic r0, r0, #1 + orr r0, r0, #1 + strh r0, [sp] + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0 + bl RTCi_GpioSendCommand + add r0, sp, #0 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r3, lr} + bx lr + arm_func_end RTC_Reset + + arm_func_start RTC_SetHourFormat +RTC_SetHourFormat: ; 0x03804F1C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + and r4, r4, #1 + cmp r4, #1 + bne _03805034 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r1, r0, lsl #0x1e + mov r1, r1, lsr #0x1f + cmp r1, r4 + beq _03805034 + bic r1, r0, #2 + mov r0, r4, lsl #0x1f + orr r1, r1, r0, lsr #30 + mov r0, #0x8000 + strh r1, [sp] + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0 + bl RTCi_GpioSendCommand + add r0, sp, #0 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + mov r0, #0x86 + mov r1, #0x10 + add r2, sp, #4 + mov r3, #3 + bl RtcGpioTransfer + cmp r4, #0 + add r0, sp, #4 + bne _03804FC4 + bl RtcChangeAlarmFormat24to12 + b _03804FC8 +_03804FC4: + bl RtcChangeAlarmFormat12to24 +_03804FC8: + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x10 + bl RTCi_GpioSendCommand + add r0, sp, #4 + mov r1, #3 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + mov r0, #0x86 + mov r1, #0x50 + add r2, sp, #4 + mov r3, #3 + bl RtcGpioTransfer + cmp r4, #0 + add r0, sp, #4 + bne _03805010 + bl RtcChangeAlarmFormat24to12 + b _03805014 +_03805010: + bl RtcChangeAlarmFormat12to24 +_03805014: + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x50 + bl RTCi_GpioSendCommand + add r0, sp, #4 + mov r1, #3 + bl RTCi_GpioSendData + bl RTCi_GpioEnd +_03805034: + add sp, sp, #8 + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_SetHourFormat + + arm_func_start RTC_ReadDateTime +RTC_ReadDateTime: ; 0x03805040 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x20 + mov r3, #7 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadDateTime + + arm_func_start RTC_WriteDateTime +RTC_WriteDateTime: ; 0x0380506C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x20 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #7 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteDateTime + + arm_func_start RTC_ReadDate +RTC_ReadDate: ; 0x038050A4 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x20 + mov r3, #4 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadDate + + arm_func_start RTC_ReadTime +RTC_ReadTime: ; 0x038050D0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x60 + mov r3, #3 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadTime + + arm_func_start RTC_WriteTime +RTC_WriteTime: ; 0x038050FC + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x60 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #3 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteTime + + arm_func_start RTC_ReadPulse +RTC_ReadPulse: ; 0x03805134 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + and r0, r0, #0xb + cmp r0, #1 + movne r0, #0 + bne _03805190 + mov r2, r4 + mov r0, #0x86 + mov r1, #0x10 + mov r3, #1 + bl RtcGpioTransfer + mov r0, #1 +_03805190: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_ReadPulse + + arm_func_start RTC_WritePulse +RTC_WritePulse: ; 0x0380519C + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + and r0, r0, #0xb + cmp r0, #1 + movne r0, #0 + bne _03805204 + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x10 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + mov r0, #1 +_03805204: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_WritePulse + + arm_func_start RTC_ReadAlarm1 +RTC_ReadAlarm1: ; 0x03805210 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #4 + movne r0, #0 + bne _03805268 + mov r2, r4 + mov r0, #0x86 + mov r1, #0x10 + mov r3, #3 + bl RtcGpioTransfer + mov r0, #1 +_03805268: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_ReadAlarm1 + + arm_func_start RTC_WriteAlarm1 +RTC_WriteAlarm1: ; 0x03805274 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x1c + mov r0, r0, lsr #0x1c + cmp r0, #4 + movne r0, #0 + bne _038052D8 + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x10 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #3 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + mov r0, #1 +_038052D8: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_WriteAlarm1 + + arm_func_start RTC_ReadAlarm2 +RTC_ReadAlarm2: ; 0x038052E4 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + moveq r0, #0 + beq _03805338 + mov r2, r4 + mov r0, #0x86 + mov r1, #0x50 + mov r3, #3 + bl RtcGpioTransfer + mov r0, #1 +_03805338: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_ReadAlarm2 + + arm_func_start RTC_WriteAlarm2 +RTC_WriteAlarm2: ; 0x03805344 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + add r2, sp, #0 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldrh r0, [sp] + mov r0, r0, lsl #0x19 + movs r0, r0, lsr #0x1f + moveq r0, #0 + beq _038053A4 + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x50 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #3 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + mov r0, #1 +_038053A4: + add sp, sp, #4 + ldmia sp!, {r3, r4, lr} + bx lr + arm_func_end RTC_WriteAlarm2 + + arm_func_start RTC_ReadStatus1 +RTC_ReadStatus1: ; 0x038053B0 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0 + mov r3, #1 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadStatus1 + + arm_func_start RTC_WriteStatus1 +RTC_WriteStatus1: ; 0x038053DC + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteStatus1 + + arm_func_start RTC_ReadStatus2 +RTC_ReadStatus2: ; 0x03805414 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x40 + mov r3, #1 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadStatus2 + + arm_func_start RTC_WriteStatus2 +RTC_WriteStatus2: ; 0x03805440 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x40 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteStatus2 + + arm_func_start RTC_ReadAdjust +RTC_ReadAdjust: ; 0x03805478 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x30 + mov r3, #1 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadAdjust + + arm_func_start RTC_WriteAdjust +RTC_WriteAdjust: ; 0x038054A4 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x30 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteAdjust + + arm_func_start RTC_ReadFree +RTC_ReadFree: ; 0x038054DC + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + mov r2, r4 + mov r0, #0x86 + mov r1, #0x70 + mov r3, #1 + bl RtcGpioTransfer + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_ReadFree + + arm_func_start RTC_WriteFree +RTC_WriteFree: ; 0x03805508 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x8000 + bl EXIi_SelectRcnt + bl RTCi_GpioStart + mov r0, #6 + mov r1, #0x70 + bl RTCi_GpioSendCommand + mov r0, r4 + mov r1, #1 + bl RTCi_GpioSendData + bl RTCi_GpioEnd + ldmia sp!, {r4, lr} + bx lr + arm_func_end RTC_WriteFree + + arm_func_start RtcChangeAlarmFormat24to12 +RtcChangeAlarmFormat24to12: ; 0x03805540 + ldr r1, [r0] + mov r2, r1, lsl #0x12 + mov r2, r2, lsr #0x1a + cmp r2, #0x23 + addls pc, pc, r2, lsl #2 + b _0380563C +_03805558: ; jump table + b _038055E8 ; case 0 + b _038055E8 ; case 1 + b _038055E8 ; case 2 + b _038055E8 ; case 3 + b _038055E8 ; case 4 + b _038055E8 ; case 5 + b _038055E8 ; case 6 + b _038055E8 ; case 7 + b _038055E8 ; case 8 + b _038055E8 ; case 9 + b _0380563C ; case 10 + b _0380563C ; case 11 + b _0380563C ; case 12 + b _0380563C ; case 13 + b _0380563C ; case 14 + b _0380563C ; case 15 + b _038055E8 ; case 16 + b _038055E8 ; case 17 + b _038055F4 ; case 18 + b _038055F4 ; case 19 + b _038055F4 ; case 20 + b _038055F4 ; case 21 + b _038055F4 ; case 22 + b _038055F4 ; case 23 + b _038055F4 ; case 24 + b _038055F4 ; case 25 + b _0380563C ; case 26 + b _0380563C ; case 27 + b _0380563C ; case 28 + b _0380563C ; case 29 + b _0380563C ; case 30 + b _0380563C ; case 31 + b _03805618 ; case 32 + b _03805618 ; case 33 + b _038055F4 ; case 34 + b _038055F4 ; case 35 +_038055E8: + bic r1, r1, #0x4000 + str r1, [r0] + bx lr +_038055F4: + orr r2, r1, #0x4000 + mov r1, r2, lsl #0x12 + mov r1, r1, lsr #0x1a + sub r1, r1, #0x12 + bic r2, r2, #0x3f00 + mov r1, r1, lsl #0x1a + orr r1, r2, r1, lsr #18 + str r1, [r0] + bx lr +_03805618: + orr r2, r1, #0x4000 + mov r1, r2, lsl #0x12 + mov r1, r1, lsr #0x1a + sub r1, r1, #0x18 + bic r2, r2, #0x3f00 + mov r1, r1, lsl #0x1a + orr r1, r2, r1, lsr #18 + str r1, [r0] + bx lr +_0380563C: + ldr r1, [r0] + bic r1, r1, #0x4000 + bic r1, r1, #0x3f00 + str r1, [r0] + bx lr + arm_func_end RtcChangeAlarmFormat24to12 + + arm_func_start RtcChangeAlarmFormat12to24 +RtcChangeAlarmFormat12to24: ; 0x03805650 + ldr r2, [r0] + mov r1, r2, lsl #0x12 + mov r3, r1, lsr #0x1a + cmp r3, #0x23 + addls pc, pc, r3, lsl #2 + b _0380574C +_03805668: ; jump table + b _038056F8 ; case 0 + b _038056F8 ; case 1 + b _038056F8 ; case 2 + b _038056F8 ; case 3 + b _038056F8 ; case 4 + b _038056F8 ; case 5 + b _038056F8 ; case 6 + b _038056F8 ; case 7 + b _0380571C ; case 8 + b _0380571C ; case 9 + b _0380574C ; case 10 + b _0380574C ; case 11 + b _0380574C ; case 12 + b _0380574C ; case 13 + b _0380574C ; case 14 + b _0380574C ; case 15 + b _038056F8 ; case 16 + b _038056F8 ; case 17 + b _03805740 ; case 18 + b _03805740 ; case 19 + b _03805740 ; case 20 + b _03805740 ; case 21 + b _03805740 ; case 22 + b _03805740 ; case 23 + b _03805740 ; case 24 + b _03805740 ; case 25 + b _0380574C ; case 26 + b _0380574C ; case 27 + b _0380574C ; case 28 + b _0380574C ; case 29 + b _0380574C ; case 30 + b _0380574C ; case 31 + b _03805740 ; case 32 + b _03805740 ; case 33 + b _03805740 ; case 34 + b _03805740 ; case 35 +_038056F8: + mov r1, r2, lsl #0x11 + movs r1, r1, lsr #0x1f + bxeq lr + add r1, r3, #0x12 + bic r2, r2, #0x3f00 + mov r1, r1, lsl #0x1a + orr r1, r2, r1, lsr #18 + str r1, [r0] + bx lr +_0380571C: + mov r1, r2, lsl #0x11 + movs r1, r1, lsr #0x1f + bxeq lr + add r1, r3, #0x18 + bic r2, r2, #0x3f00 + mov r1, r1, lsl #0x1a + orr r1, r2, r1, lsr #18 + str r1, [r0] + bx lr +_03805740: + orr r1, r2, #0x4000 + str r1, [r0] + bx lr +_0380574C: + ldr r1, [r0] + bic r1, r1, #0x4000 + bic r1, r1, #0x3f00 + str r1, [r0] + bx lr + arm_func_end RtcChangeAlarmFormat12to24 + + arm_func_start RtcGpioTransfer +RtcGpioTransfer: ; 0x03805760 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl RTCi_GpioStart + mov r0, r7 + mov r1, r6 + bl RTCi_GpioSendCommand + cmp r7, #6 + beq _038057A4 + cmp r7, #0x86 + bne _038057B0 + mov r0, r5 + mov r1, r4 + bl RTCi_GpioReceiveData + b _038057B0 +_038057A4: + mov r0, r5 + mov r1, r4 + bl RTCi_GpioSendData +_038057B0: + bl RTCi_GpioEnd + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + arm_func_end RtcGpioTransfer + + arm_func_start RTCi_GpioStart +RTCi_GpioStart: ; 0x038057BC + mov ip, #0x4000000 + add ip, ip, #0x138 + ldrh r0, [ip] + bic r0, r0, #0x77 + orr r0, r0, #0x72 + strh r0, [ip] + mov r3, #2 +_038057D8: + subs r3, r3, #1 + bne _038057D8 + bic r0, r0, #4 + orr r0, r0, #4 + strh r0, [ip] + mov r3, #2 +_038057F0: + subs r3, r3, #1 + bne _038057F0 + bx lr + arm_func_end RTCi_GpioStart + + arm_func_start RTCi_GpioEnd +RTCi_GpioEnd: ; 0x038057FC + mov ip, #0x4000000 + add ip, ip, #0x138 + mov r3, #2 +_03805808: + subs r3, r3, #1 + bne _03805808 + ldrh r0, [ip] + bic r0, r0, #4 + orr r0, r0, #0 + strh r0, [ip] + mov r3, #2 +_03805824: + subs r3, r3, #1 + bne _03805824 + bx lr + arm_func_end RTCi_GpioEnd + + arm_func_start RTCi_GpioSendCommand +RTCi_GpioSendCommand: ; 0x03805830 + mov ip, #0x4000000 + add ip, ip, #0x138 + orr r1, r0, r1 + ldrh r0, [ip] + bic r0, r0, #0x77 + orr r0, r0, #0x74 + mov r2, #0 +_0380584C: + bic r0, r0, #3 + orr r0, r0, #0 + mov r3, #1 + tst r3, r1, lsr r2 + movne r3, #1 + moveq r3, #0 + orr r0, r0, r3 + strh r0, [ip] + mov r3, #9 +_03805870: + subs r3, r3, #1 + bne _03805870 + bic r0, r0, #2 + orr r0, r0, #2 + strh r0, [ip] + mov r3, #9 +_03805888: + subs r3, r3, #1 + bne _03805888 + add r2, r2, #1 + cmp r2, #8 + bne _0380584C + bx lr + arm_func_end RTCi_GpioSendCommand + + arm_func_start RTCi_GpioSendData +RTCi_GpioSendData: ; 0x038058A0 + mov ip, #0x4000000 + add ip, ip, #0x138 +_038058A8: + stmdb sp!, {r0, r1} + tst r0, #1 + ldreqh r1, [r0] + ldrneh r1, [r0, #-1] + movne r1, r1, lsr #8 + ldrh r0, [ip] + bic r0, r0, #0x77 + orr r0, r0, #0x74 + mov r2, #0 +_038058CC: + bic r0, r0, #3 + orr r0, r0, #0 + mov r3, #1 + tst r3, r1, lsr r2 + movne r3, #1 + moveq r3, #0 + orr r0, r0, r3 + strh r0, [ip] + mov r3, #9 +_038058F0: + subs r3, r3, #1 + bne _038058F0 + bic r0, r0, #2 + orr r0, r0, #2 + strh r0, [ip] + mov r3, #9 +_03805908: + subs r3, r3, #1 + bne _03805908 + add r2, r2, #1 + cmp r2, #8 + bne _038058CC + ldmia sp!, {r0, r1} + add r0, r0, #1 + subs r1, r1, #1 + bne _038058A8 + bx lr + arm_func_end RTCi_GpioSendData + + arm_func_start RTCi_GpioReceiveData +RTCi_GpioReceiveData: ; 0x03805930 + mov ip, #0x4000000 + add ip, ip, #0x138 +_03805938: + stmdb sp!, {r0, r1} + ldrh r0, [ip] + bic r0, r0, #0x77 + orr r0, r0, #0x64 + mov r2, #0 + mov r1, #0 +_03805950: + bic r0, r0, #3 + orr r0, r0, #0 + strh r0, [ip] + mov r3, #9 +_03805960: + subs r3, r3, #1 + bne _03805960 + ldrh r0, [ip] + and r3, r0, #1 + cmp r3, #1 + moveq r3, #0x80 + movne r3, #0 + orr r2, r3, r2, lsr #1 + bic r0, r0, #2 + orr r0, r0, #2 + strh r0, [ip] + mov r3, #9 +_03805990: + subs r3, r3, #1 + bne _03805990 + add r1, r1, #1 + cmp r1, #8 + bne _03805950 + ldmia sp!, {r0, r1} + tst r0, #1 + beq _038059C8 + ldrh r3, [r0, #-1] + bic r3, r3, #0xff00 + mov r2, r2, lsl #8 + orr r3, r2, r3 + strh r3, [r0, #-1] + b _038059D8 +_038059C8: + ldrh r3, [r0] + bic r3, r3, #0xff + orr r3, r3, r2 + strh r3, [r0] +_038059D8: + add r0, r0, #1 + subs r1, r1, #1 + bne _03805938 + bx lr + arm_func_end RTCi_GpioReceiveData + + ; wvr.s(.wram) + + arm_func_start WVR_Init +WVR_Init: ; 0x038059E8 + stmdb sp!, {r3, lr} + ldr r3, _03805A2C ; =wvrStatus + mov ip, #1 + str r0, [r3, #8] + ldr r0, _03805A30 ; =wvrThread + mov r1, #0 + mov r2, #0xa4 + strb ip, [r3] + bl MI_CpuFill8 + ldr r1, _03805A34 ; =WvrPxiReceiveCallback + mov r0, #0xf + bl PXI_SetFifoRecvCallback + ldr r1, _03805A38 ; =WvrPxiWmSubstituteCallback + mov r0, #0xa + bl PXI_SetFifoRecvCallback + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03805A2C: .word wvrStatus +_03805A30: .word wvrThread +_03805A34: .word WvrPxiReceiveCallback +_03805A38: .word WvrPxiWmSubstituteCallback + arm_func_end WVR_Init + + arm_func_start WVR_Shutdown +WVR_Shutdown: ; 0x03805A3C + stmdb sp!, {r3, lr} + ldr r2, _03805A68 ; =0x04000304 + mov r0, #1 + ldrh r1, [r2] + bic r1, r1, #2 + strh r1, [r2] + bl PM_SetLEDPattern + mov r0, #1 + bl PMi_SetLED + ldmia sp!, {r3, lr} + bx lr + .align 2, 0 +_03805A68: .word 0x04000304 + arm_func_end WVR_Shutdown + + arm_func_start WvrBegin +WvrBegin: ; 0x03805A6C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x50 + str r0, [sp, #0x44] + ldr r0, _03805B04 ; =wvrWlWork + mov sb, #4 + mov r7, #8 + mov r4, #3 + ldr r1, _03805B08 ; =wvrWlWork + ldr r6, _03805B0C ; =wvrWlStaElement + mov sl, #0x600 + mov r8, #0 + mov r5, #0x1c0 + mov lr, #0x40 + mov ip, #5 + mov r3, #7 + mov r2, #9 + str r0, [sp, #0x1c] + str r1, [sp, #0x20] + add r0, sp, #0x1c + add r1, sp, #0 + str sl, [sp, #0x24] + str sb, [sp, #0x28] + str r8, [sp, #0x3c] + str r7, [sp, #0x40] + str r6, [sp, #0x48] + str r5, [sp, #0x4c] + str r4, [sp] + str lr, [sp, #0x38] + str r4, [sp, #8] + str sb, [sp, #0x18] + str ip, [sp, #0x10] + str r3, [sp, #4] + str r7, [sp, #0x14] + str r2, [sp, #0xc] + bl __VENEER_WMSP_Init + add sp, sp, #0x50 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + bx lr + .align 2, 0 +_03805B04: .word wvrWlWork +_03805B08: .word wvrWlWork +_03805B0C: .word wvrWlStaElement + arm_func_end WvrBegin + + arm_func_start __VENEER_WMSP_Init +__VENEER_WMSP_Init: ; 0x03805B10 + ldr pc, _03805B14 ; =WMSP_Init + .align 2, 0 +_03805B14: .word WMSP_Init + arm_func_end __VENEER_WMSP_Init + + arm_func_start WvrPxiWmSubstituteCallback +WvrPxiWmSubstituteCallback: ; 0x03805B18 + stmdb sp!, {r4, r5, r6, lr} + movs r6, r1 + ldrh r4, [r6] + beq _03805B60 + mov r0, #0 + mov r2, #0x100 + bl MIi_CpuClear32 + strh r4, [r6] + mov r0, #4 + strh r0, [r6, #2] + mov r5, #0xa + mov r4, #0 +_03805B48: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03805B48 +_03805B60: + ldmia sp!, {r4, r5, r6, lr} + bx lr + arm_func_end WvrPxiWmSubstituteCallback + + arm_func_start WvrCheckThreadRunning +WvrCheckThreadRunning: ; 0x03805B68 + cmp r0, #0 + moveq r0, #0 + bxeq lr + ldr r1, _03805BC4 ; =OSi_ThreadInfo + ldr r1, [r1, #8] + b _03805BB4 +_03805B80: + cmp r1, r0 + bne _03805BB0 + ldr r0, [r0, #0x48] + cmp r0, #0 + cmpne r0, #1 + beq _03805BA0 + cmp r0, #2 + b _03805BA8 +_03805BA0: + mov r0, #1 + bx lr +_03805BA8: + mov r0, #0 + bx lr +_03805BB0: + ldr r1, [r1, #0x4c] +_03805BB4: + cmp r1, #0 + bne _03805B80 + mov r0, #0 + bx lr + .align 2, 0 +_03805BC4: .word OSi_ThreadInfo + arm_func_end WvrCheckThreadRunning + + arm_func_start WvrPxiReceiveCallback +WvrPxiReceiveCallback: ; 0x03805BC8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r4, r1 + cmp r4, #0x10000 + beq _03805BE8 + cmp r4, #0x20000 + beq _03805C80 + b _03805D24 +_03805BE8: + bl OS_DisableInterrupts + mov r5, r0 + ldr r0, _03805D54 ; =wvrThread + bl WvrCheckThreadRunning + cmp r0, #0 + beq _03805C10 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + b _03805C70 +_03805C10: + ldr r1, _03805D58 ; =wvrStatus + ldrb r0, [r1] + cmp r0, #1 + beq _03805C30 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + b _03805C70 +_03805C30: + mov r2, #2 + mov r0, r5 + strb r2, [r1] + bl OS_RestoreInterrupts + mov r2, #0x400 + ldr r0, _03805D54 ; =wvrThread + ldr r1, _03805D5C ; =WvrStartUpThread + ldr r3, _03805D60 ; =wvrWlStack + str r2, [sp] + mov r5, #0xa + mov r2, #0 + str r5, [sp, #4] + bl OS_CreateThread + ldr r0, _03805D54 ; =wvrThread + bl OS_WakeupThreadDirect + mov r0, #1 +_03805C70: + cmp r0, #0 + bne _03805D48 + orr r6, r4, #5 + b _03805D28 +_03805C80: + bl OS_DisableInterrupts + mov r5, r0 + ldr r0, _03805D54 ; =wvrThread + bl WvrCheckThreadRunning + cmp r0, #0 + beq _03805CA8 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + b _03805D14 +_03805CA8: + ldr r1, _03805D58 ; =wvrStatus + ldrb r0, [r1] + cmp r0, #3 + beq _03805CC8 + mov r0, r5 + bl OS_RestoreInterrupts + mov r0, #0 + b _03805D14 +_03805CC8: + mov r2, #4 + mov r0, r5 + strb r2, [r1] + bl OS_RestoreInterrupts + ldr r1, _03805D64 ; =WvrPxiWmSubstituteCallback + mov r0, #0xa + bl PXI_SetFifoRecvCallback + mov r2, #0x400 + ldr r0, _03805D54 ; =wvrThread + ldr r1, _03805D68 ; =WvrTerminateThread + ldr r3, _03805D60 ; =wvrWlStack + str r2, [sp] + mov r5, #2 + mov r2, #0 + str r5, [sp, #4] + bl OS_CreateThread + ldr r0, _03805D54 ; =wvrThread + bl OS_WakeupThreadDirect + mov r0, #1 +_03805D14: + cmp r0, #0 + bne _03805D48 + orr r6, r4, #5 + b _03805D28 +_03805D24: + orr r6, r4, #7 +_03805D28: + mov r5, #0xf + mov r4, #0 +_03805D30: + mov r0, r5 + mov r1, r6 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03805D30 +_03805D48: + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_03805D54: .word wvrThread +_03805D58: .word wvrStatus +_03805D5C: .word WvrStartUpThread +_03805D60: .word wvrWlStack +_03805D64: .word WvrPxiWmSubstituteCallback +_03805D68: .word WvrTerminateThread + arm_func_end WvrPxiReceiveCallback + + arm_func_start WvrStartUpThread +WvrStartUpThread: ; 0x03805D6C + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _03805DD8 ; =wvrStatus + ldr r0, [r1, #4] + cmp r0, #0 + beq _03805D8C + ldr r2, [r1, #0xc] + mov r1, #0x6000000 + bl MIi_CpuCopyFast +_03805D8C: + ldr r0, _03805DD8 ; =wvrStatus + ldr r0, [r0, #8] + bl WvrBegin + mov r6, #0xf + mov r5, #0x10000 + mov r4, #0 +_03805DA4: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03805DA4 + bl OS_DisableInterrupts + ldr r0, _03805DD8 ; =wvrStatus + mov r1, #3 + strb r1, [r0] + bl OS_ExitThread + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_03805DD8: .word wvrStatus + arm_func_end WvrStartUpThread + + arm_func_start WvrTerminateThread +WvrTerminateThread: ; 0x03805DDC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r0, _03805FDC ; =wmspW + 0x1000 + ldr sl, _03805FE0 ; =wmspW + ldr r0, [r0, #0x54c] + cmp r0, #0 + addne r0, sl, #0x1000 + ldrne r0, [r0, #0x54c] + ldrne r0, [r0] + ldrneh r0, [r0] + cmpne r0, #0 + beq _03805E10 + bl __VENEER_WMSP_CancelVAlarm + bl __VENEER_WMSP_CancelAllAlarms +_03805E10: + mov r6, #0 + add sb, sp, #0 + add r4, sl, #0x1000 + mov fp, #0x100 + mov r5, #4 + mov r8, r6 +_03805E28: + mov r1, sb + mov r2, r8 + add r0, sl, #0x88 + bl OS_ReceiveMessage + cmp r0, #0 + beq _03805E90 + ldr r0, [r4, #0x54c] + cmp r0, #0 + beq _03805E28 + bl WMSP_GetBuffer4Callback2Wm9 + mov r7, r0 + mov r0, r6 + mov r1, r7 + mov r2, fp + bl MIi_CpuClear32 + ldr r1, [sp] + mov r0, r7 + ldrh r1, [r1] + strh r1, [r7] + strh r5, [r7, #2] + bl WMSP_ReturnResult2Wm9 + ldr r1, [sp] + ldrh r0, [r1] + orr r0, r0, #0x8000 + strh r0, [r1] + b _03805E28 +_03805E90: + bl __VENEER_WMSP_GetRequestThread + bl WvrCheckThreadRunning + cmp r0, #0 + beq _03805EB8 + add r0, sl, #0x88 + mov r1, #0 + mov r2, #1 + bl OS_SendMessage + bl __VENEER_WMSP_GetRequestThread + bl OS_JoinThread +_03805EB8: + add r1, sp, #0 + add r0, sl, #0x88 + mov r2, #0 + bl OS_ReceiveMessage + mov r5, r0 + add r1, sp, #0 + add r0, sl, #0x58 + mov r2, #0 + bl OS_ReceiveMessage + mov r4, r0 + add r1, sp, #0 + mov r0, sl + mov r2, #0 + bl OS_ReceiveMessage + orr r1, r5, r4 + orrs r0, r0, r1 + beq _03805F00 + bl OS_Terminate +_03805F00: + bl __VENEER_WL_Terminate + add r5, sp, #0 + mov r4, #0 +_03805F0C: + mov r1, r5 + mov r2, r4 + add r0, sl, #0x28 + bl OS_ReceiveMessage + cmp r0, #0 + bne _03805F0C + bl __VENEER_WMSP_GetIndicateThread + bl WvrCheckThreadRunning + cmp r0, #0 + beq _03805F4C + add r0, sl, #0x28 + mov r1, #0 + mov r2, #1 + bl OS_SendMessage + bl __VENEER_WMSP_GetIndicateThread + bl OS_JoinThread +_03805F4C: + mov r0, #1 + bl PM_SetLEDPattern + mov r0, #1 + bl PMi_SetLED + add r0, sl, #0x1000 + ldr r0, [r0, #0x54c] + cmp r0, #0 + ldrne r1, [r0] + ldrneh r0, [r1] + cmpne r0, #0 + movne r0, #0 + strneh r0, [r1] + ldr r0, _03805FE4 ; =wvrStatus + ldr r1, [r0, #4] + cmp r1, #0 + beq _03805F9C + ldr r2, [r0, #0xc] + mov r0, #0 + mov r1, #0x6000000 + bl MIi_CpuClearFast +_03805F9C: + mov r6, #0xf + mov r5, #0x20000 + mov r4, #0 +_03805FA8: + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03805FA8 + bl OS_DisableInterrupts + ldr r0, _03805FE4 ; =wvrStatus + mov r1, #1 + strb r1, [r0] + bl OS_ExitThread + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bx lr + .align 2, 0 +_03805FDC: .word wmspW + 0x1000 +_03805FE0: .word wmspW +_03805FE4: .word wvrStatus + arm_func_end WvrTerminateThread + + ; veneers into wvram + + arm_func_start __VENEER_WMSP_CancelVAlarm +__VENEER_WMSP_CancelVAlarm: ; 0x03805FE8 + ldr pc, _03805FEC ; =WMSP_CancelVAlarm + .align 2, 0 +_03805FEC: .word WMSP_CancelVAlarm + arm_func_end __VENEER_WMSP_CancelVAlarm + + arm_func_start __VENEER_WMSP_CancelAllAlarms +__VENEER_WMSP_CancelAllAlarms: ; 0x03805FF0 + ldr pc, _03805FF4 ; =WMSP_CancelAllAlarms + .align 2, 0 +_03805FF4: .word WMSP_CancelAllAlarms + arm_func_end __VENEER_WMSP_CancelAllAlarms + + arm_func_start __VENEER_WMSP_GetRequestThread +__VENEER_WMSP_GetRequestThread: ; 0x03805FF8 + ldr pc, _03805FFC ; =WMSP_GetRequestThread + .align 2, 0 +_03805FFC: .word WMSP_GetRequestThread + arm_func_end __VENEER_WMSP_GetRequestThread + + arm_func_start __VENEER_WL_Terminate +__VENEER_WL_Terminate: ; 0x03806000 + ldr pc, _03806004 ; =WL_Terminate + .align 2, 0 +_03806004: .word WL_Terminate + arm_func_end __VENEER_WL_Terminate + + arm_func_start __VENEER_WMSP_GetIndicateThread +__VENEER_WMSP_GetIndicateThread: ; 0x03806008 + ldr pc, _0380600C ; =WMSP_GetIndicateThread + .align 2, 0 +_0380600C: .word WMSP_GetIndicateThread + arm_func_end __VENEER_WMSP_GetIndicateThread + + ; math + + arm_func_start MATH_CountPopulation +MATH_CountPopulation: ; 0x03806010 + ldr r1, _03806048 ; =0x55555555 + ldr r2, _0380604C ; =0x33333333 + and r1, r1, r0, lsr #1 + sub r1, r0, r1 + ldr r0, _03806050 ; =0x0F0F0F0F + and r3, r1, r2 + and r1, r2, r1, lsr #2 + add r1, r3, r1 + add r1, r1, r1, lsr #4 + and r0, r1, r0 + add r0, r0, r0, lsr #8 + add r0, r0, r0, lsr #16 + and r0, r0, #0xff + bx lr + .align 2, 0 +_03806048: .word 0x55555555 +_0380604C: .word 0x33333333 +_03806050: .word 0x0F0F0F0F + arm_func_end MATH_CountPopulation + + ; msl + + .public _ll_mod +_ll_mod: ; 0x03806054 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, r1 + orr r4, r4, #1 + b _03806074 + + .public _ll_div + .public _ll_sdiv +_ll_div: ; 0x03806064 +_ll_sdiv: ; 0x03806064 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + eor r4, r1, r3 + mov r4, r4, asr #1 + mov r4, r4, lsl #1 +_03806074: + orrs r5, r3, r2 + bne _03806084 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_03806084: + mov r5, r0, lsr #0x1f + add r5, r5, r1 + mov r6, r2, lsr #0x1f + add r6, r6, r3 + orrs r6, r5, r6 + bne _038060B8 + mov r1, r2 + bl _s32_div_f + ands r4, r4, #1 + movne r0, r1 + mov r1, r0, asr #0x1f + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_038060B8: + cmp r1, #0 + bge _038060C8 + rsbs r0, r0, #0 + rsc r1, r1, #0 +_038060C8: + cmp r3, #0 + bge _038060D8 + rsbs r2, r2, #0 + rsc r3, r3, #0 +_038060D8: + orrs r5, r1, r0 + beq _038061FC + mov r5, #0 + mov r6, #1 + cmp r3, #0 + bmi _03806104 +_038060F0: + add r5, r5, #1 + adds r2, r2, r2 + adcs r3, r3, r3 + bpl _038060F0 + add r6, r6, r5 +_03806104: + cmp r1, #0 + blt _03806124 +_0380610C: + cmp r6, #1 + beq _03806124 + sub r6, r6, #1 + adds r0, r0, r0 + adcs r1, r1, r1 + bpl _0380610C +_03806124: + mov r7, #0 + mov ip, #0 + mov fp, #0 + b _0380614C +_03806134: + orr ip, ip, #1 + subs r6, r6, #1 + beq _038061A4 + adds r0, r0, r0 + adcs r1, r1, r1 + adcs r7, r7, r7 +_0380614C: + subs r0, r0, r2 + sbcs r1, r1, r3 + sbcs r7, r7, #0 + adds ip, ip, ip + adc fp, fp, fp + cmp r7, #0 + bge _03806134 +_03806168: + subs r6, r6, #1 + beq _0380619C + adds r0, r0, r0 + adcs r1, r1, r1 + adc r7, r7, r7 + adds r0, r0, r2 + adcs r1, r1, r3 + adc r7, r7, #0 + adds ip, ip, ip + adc fp, fp, fp + cmp r7, #0 + bge _03806134 + b _03806168 +_0380619C: + adds r0, r0, r2 + adc r1, r1, r3 +_038061A4: + ands r7, r4, #1 + moveq r0, ip + moveq r1, fp + beq _038061DC + subs r7, r5, #0x20 + movge r0, r1, lsr r7 + bge _03806200 + rsb r7, r5, #0x20 + mov r0, r0, lsr r5 + orr r0, r0, r1, lsl r7 + mov r1, r1, lsr r5 + b _038061DC +_038061D4: ; 0x038061D4 + mov r0, r1, lsr r7 + mov r1, #0 +_038061DC: + cmp r4, #0 + blt _038061EC + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_038061EC: + rsbs r0, r0, #0 + rsc r1, r1, #0 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_038061FC: + mov r0, #0 +_03806200: + mov r1, #0 + cmp r4, #0 + blt _038061EC + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr + + arm_func_start _ll_udiv + arm_func_start _ull_div +_ll_udiv: ; 0x03806214 +_ull_div: ; 0x03806214 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, #0 + b _03806228 + + .public _ull_mod +_ull_mod: ; 0x03806220 + stmdb sp!, {r4, r5, r6, r7, fp, ip, lr} + mov r4, #1 +_03806228: + orrs r5, r3, r2 + bne _03806238 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr +_03806238: + orrs r5, r1, r3 + bne _038060D8 + mov r1, r2 + bl _u32_div_not_0_f + cmp r4, #0 + movne r0, r1 + mov r1, #0 + ldmia sp!, {r4, r5, r6, r7, fp, ip, lr} + bx lr + + .public _s32_div_f +_s32_div_f: ; 0x0380625C + eor ip, r0, r1 + and ip, ip, #0x80000000 + cmp r0, #0 + rsblt r0, r0, #0 + addlt ip, ip, #1 + cmp r1, #0 + rsblt r1, r1, #0 + beq _03806454 + cmp r0, r1 + movlo r1, r0 + movlo r0, #0 + blo _03806454 + mov r2, #0x1c + mov r3, r0, lsr #4 + cmp r1, r3, lsr #12 + suble r2, r2, #0x10 + movle r3, r3, lsr #0x10 + cmp r1, r3, lsr #4 + suble r2, r2, #8 + movle r3, r3, lsr #8 + cmp r1, r3 + suble r2, r2, #4 + movle r3, r3, lsr #4 + mov r0, r0, lsl r2 + rsb r1, r1, #0 + adds r0, r0, r0 + add r2, r2, r2, lsl #1 + add pc, pc, r2, lsl #2 + mov r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + mov r1, r3 +_03806454: + ands r3, ip, #0x80000000 + rsbne r0, r0, #0 + ands r3, ip, #1 + rsbne r1, r1, #0 + bx lr + + .public _u32_div_f +_u32_div_f: ; 0x03806468 + cmp r1, #0 + bxeq lr + + .public _u32_div_not_0_f +_u32_div_not_0_f: ; 0x03806470 + cmp r0, r1 + movlo r1, r0 + movlo r0, #0 + bxlo lr + mov r2, #0x1c + mov r3, r0, lsr #4 + cmp r1, r3, lsr #12 + suble r2, r2, #0x10 + movle r3, r3, lsr #0x10 + cmp r1, r3, lsr #4 + suble r2, r2, #8 + movle r3, r3, lsr #8 + cmp r1, r3 + suble r2, r2, #4 + movle r3, r3, lsr #4 + mov r0, r0, lsl r2 + rsb r1, r1, #0 + adds r0, r0, r0 + add r2, r2, r2, lsl #1 + add pc, pc, r2, lsl #2 + mov r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + adcs r3, r1, r3, lsl #1 + sublo r3, r3, r1 + adcs r0, r0, r0 + mov r1, r3 + bx lr + + .rodata + + .balign 4, 0 +micIntrPrio: ; 0x038067A4 + .byte 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + .byte 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 + .byte 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 + .byte 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 + .byte 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 + .byte 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00 + .byte 0x0B, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 + .byte 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 + .byte 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 + .byte 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x16, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 + .byte 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 + .byte 0x17, 0x00, 0x00, 0x00 + + .section .wram,4,1,5 + + arm_func_start WMSP_ReturnResult2Wm9 +WMSP_ReturnResult2Wm9: ; 0x038068C8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, #0x100 + mov r5, #0xa + mov r4, #0 + b _038068E8 +_038068E0: + mov r0, r6 + bl VENEER_SVC_WaitByLoop +_038068E8: + mov r0, r5 + mov r1, r7 + mov r2, r4 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _038068E0 + ldr r0, _03806910 ; =wmspW + 0x1528 + bl OS_UnlockMutex + ldmia sp!, {r3, r4, r5, r6, r7, lr} + bx lr + .align 2, 0 +_03806910: .word wmspW + 0x1528 + arm_func_end WMSP_ReturnResult2Wm9 + + arm_func_start WMSP_GetBuffer4Callback2Wm9 +WMSP_GetBuffer4Callback2Wm9: ; 0x03806914 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0380695C ; =wmspW + 0x1528 + bl OS_LockMutex + ldr r4, _03806960 ; =0x027FFF96 + mov r5, #0x100 + b _03806934 +_0380692C: + mov r0, r5 + bl VENEER_SVC_WaitByLoop +_03806934: + ldrh r1, [r4] + tst r1, #1 + bne _0380692C + ldr r0, _03806964 ; =wmspW + 0x1000 + orr r1, r1, #1 + strh r1, [r4] + ldr r0, [r0, #0x54c] + ldr r0, [r0, #8] + ldmia sp!, {r3, r4, r5, lr} + bx lr + .align 2, 0 +_0380695C: .word wmspW + 0x1528 +_03806960: .word 0x027FFF96 +_03806964: .word wmspW + 0x1000 + arm_func_end WMSP_GetBuffer4Callback2Wm9 + + arm_func_start WMSP_GetAllowedChannel +WMSP_GetAllowedChannel: ; 0x03806968 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _03806A70 ; =0x00001FFF + and r0, r0, r1 + mov r0, r0, lsl #0x10 + movs r2, r0, lsr #0x10 + moveq r0, #0 + beq _03806A68 + mov r1, #0 + mov r0, #1 + b _0380699C +_03806990: + tst r2, r0, lsl r1 + bne _038069A4 + add r1, r1, #1 +_0380699C: + cmp r1, #0x10 + blt _03806990 +_038069A4: + mov r0, #0xf + mov r3, #1 + b _038069BC +_038069B0: + tst r2, r3, lsl r0 + bne _038069C4 + sub r0, r0, #1 +_038069BC: + cmp r0, #0 + bne _038069B0 +_038069C4: + sub r6, r0, r1 + cmp r6, #5 + movlt r0, #1 + movlt r0, r0, lsl r1 + movlt r0, r0, lsl #0x10 + movlt r0, r0, lsr #0x10 + blt _03806A68 + add r3, r0, r1 + add r3, r3, r3, lsr #31 + mov r4, r3, asr #1 + mov r5, #0 + mov lr, #1 + b _03806A1C +_038069F8: + mov ip, r5, lsr #0x1f + rsb r3, ip, r5, lsl #31 + add r3, ip, r3, ror #31 + mov r3, r3, lsl #1 + sub r3, r3, #1 + mla r4, r5, r3, r4 + tst r2, lr, lsl r4 + bne _03806A24 + add r5, r5, #1 +_03806A1C: + cmp r5, r6 + blt _038069F8 +_03806A24: + sub r2, r0, r4 + cmp r2, #5 + subge r2, r4, r1 + cmpge r2, #5 + bge _03806A50 + mov r2, #1 + mov r0, r2, lsl r0 + orr r0, r0, r2, lsl r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + b _03806A68 +_03806A50: + mov r3, #1 + mov r2, r3, lsl r4 + orr r0, r2, r3, lsl r0 + orr r0, r0, r3, lsl r1 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 +_03806A68: + ldmia sp!, {r4, r5, r6, lr} + bx lr + .align 2, 0 +_03806A70: .word 0x00001FFF + arm_func_end WMSP_GetAllowedChannel + + .data + +PMi_LEDStatus: ; 0x03806B08 + .word 1 + +PMi_BlinkPatternData: ; 0x03806B0C + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0xAA, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC + .byte 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE3, 0x0C, 0x00, 0x01, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x3E, 0xF8, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC + .byte 0x0C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x01, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0xFF, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF + .byte 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x01, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x28, 0x00, 0x02, 0x00 + +isFirstCheck$3769: ; 0x03806B9C + .word 1 + +nextCount$3767: ; 0x03806BA0 + .word 0xFFFFFFFF + + .bss + +spiInitialized: ; 0x03808E30 + .space 0x2 + + .balign 4, 0 +spiWork: ; 0x03808E34 + .space 0x49C + +valid_cnt$3731: ; 0x038092D0 + .space 1 + +invalid_cnt$3730: ; 0x038092D1 + .space 1 + + .balign 4, 0 +tpw: ; 0x038092D4 + .space 0xD4 + +last_touch_flg: ; 0x038093A8 + .space 0x2 + + .balign 4, 0 +PMi_KeyPattern: ; 0x038093AC + .space 0x2 + +PMi_TriggerBL: ; 0x038093AE + .space 0x2 + + .public PMi_Initialized +PMi_Initialized: ; 0x038093B0 + .space 0x4 + +PMi_Work: ; 0x038093B4 + .space 0x2C + +PMi_BlinkCounter: ; 0x038093E0 + .space 0x4 + +PMi_BlinkPatternNo: ; 0x038093E4 + .space 0x4 + +micw: ; 0x038093E8 + .space 0x50 + +micIntrInfo: ; 0x03809438 + .space 0x10 + +CTRDGi_EnableFlag: ; 0x03809448 + .space 0x4 + +CTRDGi_Work: ; 0x0380944C + .space 0x4 + +lock_id: ; 0x03809450 + .space 0x2 + + .balign 4, 0 +current_vib: ; 0x03809454 + .space 0x4 + +isInitialized$3644: ; 0x03809458 + .space 0x4 + +isCartridgePullOut$3768: ; 0x0380945C + .space 0x4 + +skipCheck$3770: ; 0x03809460 + .space 0x4 + +isInitialized$3633: ; 0x03809464 + .space 0x4 + +ctw_sp: ; 0x03809468 + .space 0x18 + +pulse_edge_alarm: ; 0x03809480 + .space 0x2C + +nvramw: ; 0x038094AC + .space 0x20 + +rtcInitialized: ; 0x038094CC + .space 0x2 + + .balign 4, 0 +rtcWork: ; 0x038094D0 + .space 0x3B4 + + .public WVR_BSS_START +WVR_BSS_START: +wvrStatus: ; 0x03809884 + .space 0x1 + + .balign 4, 0 +wvrVramImageBuf: ; 0x03809888 + .space 0x4 + +wvrHeapHandle: ; 0x0380988C + .space 0x4 + +wvrVramImageBufSize: ; 0x03809890 + .space 0x4 + +wvrThread: ; 0x03809894 + .space 0xA4 + +wvrWlStaElement: ; 0x03809938 + .space 0x1C0 + +wvrThreadStack: ; 0x03809AF8 + .space 0x400 + +wvrWlStack: ; 0x03809EF8 + .space 0x600 + +wvrWlWork: ; 0x0380A4F8 + .space 0x700 + + .public wmspRequestThread +wmspRequestThread: ; 0x0380ABF8 + .space 0xA4 + + .public wmspIndicateThread +wmspIndicateThread: ; 0x0380AC9C + .space 0xA4 + + .public wmspMPAckAlarm +wmspMPAckAlarm: ; 0x0380AD40 + .space 0x2C + + .public wmspMPIntervalAlarm +wmspMPIntervalAlarm: ; 0x0380AD6C + .space 0x2C + + .public wmspVAlarm +wmspVAlarm: ; 0x0380AD98 + .space 0x28 + +; 0x0380ADC0 diff --git a/sub/global.inc b/sub/global.inc new file mode 100644 index 00000000..4dfead12 --- /dev/null +++ b/sub/global.inc @@ -0,0 +1,164 @@ +.public OS_Terminate +.public OS_SetIrqFunction +.public OS_EnableIrqMask +.public OS_DisableIrqMask +.public OS_GetLockID +.public OS_CreateThread +.public OS_ExitThread +.public OS_JoinThread +.public OS_IsThreadTerminated +.public OS_WakeupThreadDirect +.public OS_SetThreadPriority +.public OS_Sleep +.public OS_DisableScheduler +.public OS_EnableScheduler +.public OS_InitMessageQueue +.public OS_SendMessage +.public OS_ReceiveMessage +.public OS_InitMutex +.public OS_LockMutex +.public OS_UnlockMutex +.public OS_AllocFromHeap +.public OS_FreeToHeap +.public OS_GetTick +.public OS_IsAlarmAvailable +.public OS_CreateAlarm +.public OS_SetAlarm +.public OS_SetPeriodicAlarm +.public OS_CancelAlarm +.public OS_InitVAlarm +.public OS_IsVAlarmAvailable +.public OS_SetVAlarm +.public OS_CancelVAlarm +.public OS_DisableInterrupts +.public OS_RestoreInterrupts +.public MI_WaitDma +.public MIi_CpuClear16 +.public MIi_CpuCopy16 +.public MIi_CpuClear32 +.public MIi_CpuCopy32 +.public MIi_CpuClearFast +.public MI_CpuFill8 +.public MI_CpuCopy8 +.public PXI_Init +.public PXI_SetFifoRecvCallback +.public SND_BeginSleep +.public SPI_Lock +.public SPI_Unlock +.public PM_SetLEDPattern +.public NVRAM_ReadStatusRegister +.public NVRAM_ReadDataBytes +.public NVRAM_SoftwareReset +.public MATH_CountPopulation +.public _ll_udiv +.public _s32_div_f +.public _u32_div_f +.public WMSP_ReturnResult2Wm9 +.public WMSP_GetBuffer4Callback2Wm9 +.public WMSP_GetAllowedChannel +.public OS_IrqHandler_ThreadSwitch +.public OS_SetIrqMask +.public VENEER_SVC_WaitByLoop +.public OS_LockCartridge +.public OS_UnlockCartridge +.public OS_UnLockCartridge +.public OS_TryLockCartridge +.public OS_ReadOwnerOfLockWord +.public OS_ReleaseLockID +.public OS_SleepThread +.public OS_WakeupThread +.public OS_ReadMessage +.public OS_InitTick +.public OS_InitAlarm +.public OS_CreateVAlarm +.public OS_SetPeriodicVAlarm +.public OS_SetVAlarmTag +.public OS_CancelVAlarms +.public OS_SpinWait +.public MIi_CpuCopyFast +.public PXI_SendWordByFifo +.public EXIi_SetBitRcnt0L +.public EXIi_SelectRcnt +.public SND_EndSleep +.public SVC_Sleep +.public SVC_CpuSet +.public WVR_ShelterExtWram +.public SVC_WaitByLoop +.public SVC_Halt +.public SVC_SetSoundBias +.public SVC_ResetSoundBias +.public SVC_GetCRC16 +.public SVC_GetPitchTable +.public SVC_GetVolumeTable +.public SPI_Init +.public PMi_SetControl +.public PMi_ResetControl +.public PM_SelfBlinkProc +.public CTRDG_Init +.public CTRDG_VibPulseEdgeUpdate +.public CTRDG_CheckPullOut_Polling +.public RTC_Init +.public WVR_Init +.public WVR_Shutdown +.public _ll_sdiv +.public OSi_DoBoot +.public OS_Init +.public OS_GetArenaHi +.public OS_GetArenaLo +.public OS_InitAlloc +.public OS_SetArenaLo +.public OSi_UnlockAllMutex +.public OS_CreateHeap +.public OS_SetCurrentHeap +.public OS_CheckHeap +.public SND_Init +.public PAD_InitXYButton +.public OS_EnableInterrupts +.public FS_Init +.public CARD_SetThreadPriority +.public OS_IsResetOccurred +.public OS_ResetSystem +.public CARD_CheckPullOut_Polling +.public OS_DisableInterrupts_IrqAndFiq +.public OS_RestoreInterrupts_IrqAndFiq +.public OS_DisableInterrupts_IrqAndFiq +.public MI_SwapWord +.public OS_RestoreInterrupts_IrqAndFiq +.public OS_GetProcMode +.public OSi_IrqCallbackInfoIndex +.public OSi_RemoveMutexLinkFromQueue +.public OS_InitLock +.public OS_InitIrqTable +.public OS_InitThread +.public OSi_EnterTimerCallback +.public OS_TryLockCard +.public OS_UnlockCard +.public OS_ResetRequestIrqMask +.public OSi_ThreadInfo +.public OS_SaveContext +.public OS_LoadContext +.public OS_InitContext +.public OSi_CurrentThreadPtr +.public NitroSpMain +.public OSi_LauncherThread +.public MIi_CpuClear32 +.public _sub_wram1_bss_start +.public OSi_IdleThread +.public OSi_SystemCallbackInSwitchThread +.public OSi_RescheduleCount +.public OSi_IsThreadInitialized +.public OSi_StackForDestructor +.public OSi_ThreadIdCount +.public OSi_ThreadInfo +.public OSi_LauncherThread +.public OSi_Initialized +.public OSi_IrqTimer0 +.public OSi_IrqTimer1 +.public OSi_IrqTimer2 +.public OSi_IrqTimer3 +.public OSi_IrqVBlank +.public OSi_IrqDma0 +.public OSi_IrqDma1 +.public OSi_IrqDma2 +.public OSi_IrqDma3 +.public OS_IrqDummy diff --git a/sub/ichneumon_sub.lsf b/sub/ichneumon_sub.lsf new file mode 100644 index 00000000..25805dea --- /dev/null +++ b/sub/ichneumon_sub.lsf @@ -0,0 +1,53 @@ +Static ichneumon_sub +{ + Address 0x02380000 + StackSize 1024 1024 +} + +Autoload MAIN +{ + Address 0x027E0000 + Object asm/sub.ext.o +} + +Autoload WRAM +{ + Address 0x037F8000 + Object asm/sp_main.o + Object asm/sp_main_help.o + Object lib/src/OS_irqHandler.o + Object lib/src/OS_irqTable.o + Object lib/src/OS_interrupt.o + Object lib/src/OS_spinLock.o + Object lib/src/OS_thread.o + Object lib/src/OS_context.o + Object lib/src/OS_message.o + Object lib/src/OS_mutex.o + Object lib/src/OS_init.o + Object lib/src/OS_arena.o + Object lib/src/OS_alloc.o + Object lib/src/OS_timer.o + Object lib/src/OS_tick.o + Object lib/src/OS_alarm.o + Object lib/src/OS_valarm.o + Object lib/src/OS_system.o + Object lib/src/OS_reset.o + Object lib/src/OS_terminate_proc.o + Object lib/asm/MI_dma.o + Object lib/asm/MI_memory.o + Object lib/asm/MI_swap.o + Object lib/src/PXI_fifo.o + Object lib/src/EXI_genPort.o + Object lib/src/PAD_xyButton.o + Object asm/sub.wram_1.o + Object asm/libsyscall.o + Object asm/sub.wram_2.o + Object lib/src/OS_reset.o (.wram) + Object asm/sub.wram_2.o (.wram) +} + +Autoload EXT_WRAM +{ + Address 0x06000000 + Object asm/sub.ext_wram.o +} diff --git a/sub/ichneumon_sub.sha1 b/sub/ichneumon_sub.sha1 new file mode 100644 index 00000000..5ef98671 --- /dev/null +++ b/sub/ichneumon_sub.sha1 @@ -0,0 +1 @@ +1d0b3418b85fa8b5e1a9e345d3a182073cb968ac *build/ichneumon_sub.sbin diff --git a/sub/lib/asm/MI_dma.s b/sub/lib/asm/MI_dma.s new file mode 100644 index 00000000..db89f279 --- /dev/null +++ b/sub/lib/asm/MI_dma.s @@ -0,0 +1,76 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start MI_WaitDma +MI_WaitDma: ; 0x037FAEAC + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + add r1, r4, r4, lsl #1 + add r1, r1, #2 + mov r1, r1, lsl #2 + add r1, r1, #0xb0 + add r2, r1, #0x4000000 +_037FAECC: + ldr r1, [r2] + tst r1, #-0x80000000 + bne _037FAECC + cmp r4, #0 + bne _037FAF08 + mov r1, #0xc + mul r1, r4, r1 + add r2, r1, #0x4000000 + mov r3, #0 + add r1, r1, #0xb0 + str r3, [r2, #0xb0] + add r2, r1, #0x4000000 + ldr r1, _037FAF14 ; =0x81400001 + str r3, [r2, #4] + str r1, [r2, #8] +_037FAF08: + bl OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FAF14: .word 0x81400001 + arm_func_end MI_WaitDma + + arm_func_start MI_StopDma +MI_StopDma: ; 0x037FAF18 + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + mov r1, #6 + mul r1, r4, r1 + add r1, r1, #5 + mov r1, r1, lsl #1 + add r1, r1, #0x4000000 + ldrh r2, [r1, #0xb0] + cmp r4, #0 + bic r2, r2, #0x3200 + strh r2, [r1, #0xb0] + ldrh r2, [r1, #0xb0] + bic r2, r2, #0x8000 + strh r2, [r1, #0xb0] + ldrh r2, [r1, #0xb0] + ldrh r1, [r1, #0xb0] + bne _037FAF88 + mov r1, #0xc + mul r1, r4, r1 + add r2, r1, #0x4000000 + mov r3, #0 + add r1, r1, #0xb0 + str r3, [r2, #0xb0] + add r2, r1, #0x4000000 + ldr r1, _037FAF94 ; =0x81400001 + str r3, [r2, #4] + str r1, [r2, #8] +_037FAF88: + bl OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + .align 2, 0 +_037FAF94: .word 0x81400001 + arm_func_end MI_StopDma diff --git a/sub/lib/asm/MI_memory.s b/sub/lib/asm/MI_memory.s new file mode 100644 index 00000000..84e251a4 --- /dev/null +++ b/sub/lib/asm/MI_memory.s @@ -0,0 +1,229 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start MIi_CpuClear16 +MIi_CpuClear16: ; 0x037FAF98 + mov r3, #0 +_037FAF9C: + cmp r3, r2 + strlth r0, [r1, r3] + addlt r3, r3, #2 + blt _037FAF9C + bx lr + arm_func_end MIi_CpuClear16 + + arm_func_start MIi_CpuCopy16 +MIi_CpuCopy16: ; 0x037FAFB0 + mov ip, #0 +_037FAFB4: + cmp ip, r2 + ldrlth r3, [r0, ip] + strlth r3, [r1, ip] + addlt ip, ip, #2 + blt _037FAFB4 + bx lr + arm_func_end MIi_CpuCopy16 + + arm_func_start MIi_CpuClear32 +MIi_CpuClear32: ; 0x037FAFCC + add ip, r1, r2 +_037FAFD0: + cmp r1, ip + stmltia r1!, {r0} + blt _037FAFD0 + bx lr + arm_func_end MIi_CpuClear32 + + arm_func_start MIi_CpuCopy32 +MIi_CpuCopy32: ; 0x037FAFE0 + add ip, r1, r2 +_037FAFE4: + cmp r1, ip + ldmltia r0!, {r2} + stmltia r1!, {r2} + blt _037FAFE4 + bx lr + arm_func_end MIi_CpuCopy32 + + arm_func_start MIi_CpuClearFast +MIi_CpuClearFast: ; 0x037FAFF8 + stmdb sp!, {r4, r5, r6, r7, r8, sb} + add sb, r1, r2 + mov ip, r2, lsr #5 + add ip, r1, ip, lsl #5 + mov r2, r0 + mov r3, r2 + mov r4, r2 + mov r5, r2 + mov r6, r2 + mov r7, r2 + mov r8, r2 +_037FB024: + cmp r1, ip + stmltia r1!, {r0, r2, r3, r4, r5, r6, r7, r8} + blt _037FB024 +_037FB030: + cmp r1, sb + stmltia r1!, {r0} + blt _037FB030 + ldmia sp!, {r4, r5, r6, r7, r8, sb} + bx lr + arm_func_end MIi_CpuClearFast + + arm_func_start MIi_CpuCopyFast +MIi_CpuCopyFast: ; 0x037FB044 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl} + add sl, r1, r2 + mov ip, r2, lsr #5 + add ip, r1, ip, lsl #5 +_037FB054: + cmp r1, ip + ldmltia r0!, {r2, r3, r4, r5, r6, r7, r8, sb} + stmltia r1!, {r2, r3, r4, r5, r6, r7, r8, sb} + blt _037FB054 +_037FB064: + cmp r1, sl + ldmltia r0!, {r2} + stmltia r1!, {r2} + blt _037FB064 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl} + bx lr + arm_func_end MIi_CpuCopyFast + + arm_func_start MI_CpuFill8 +MI_CpuFill8: ; 0x037FB07C + cmp r2, #0 + bxeq lr + tst r0, #1 + beq _037FB0A8 + ldrh ip, [r0, #-1] + and ip, ip, #0xff + orr r3, ip, r1, lsl #8 + strh r3, [r0, #-1] + add r0, r0, #1 + subs r2, r2, #1 + bxeq lr +_037FB0A8: + cmp r2, #2 + blo _037FB0F0 + orr r1, r1, r1, lsl #8 + tst r0, #2 + beq _037FB0C8 + strh r1, [r0], #2 + subs r2, r2, #2 + bxeq lr +_037FB0C8: + orr r1, r1, r1, lsl #16 + bics r3, r2, #3 + beq _037FB0E8 + sub r2, r2, r3 + add ip, r3, r0 +_037FB0DC: + str r1, [r0], #4 + cmp r0, ip + blo _037FB0DC +_037FB0E8: + tst r2, #2 + strneh r1, [r0], #2 +_037FB0F0: + tst r2, #1 + bxeq lr + ldrh r3, [r0] + and r3, r3, #0xff00 + and r1, r1, #0xff + orr r1, r1, r3 + strh r1, [r0] + bx lr + arm_func_end MI_CpuFill8 + + arm_func_start MI_CpuCopy8 +MI_CpuCopy8: ; 0x037FB110 + cmp r2, #0 + bxeq lr + tst r1, #1 + beq _037FB150 + ldrh ip, [r1, #-1] + and ip, ip, #0xff + tst r0, #1 + ldrneh r3, [r0, #-1] + movne r3, r3, lsr #8 + ldreqh r3, [r0] + orr r3, ip, r3, lsl #8 + strh r3, [r1, #-1] + add r0, r0, #1 + add r1, r1, #1 + subs r2, r2, #1 + bxeq lr +_037FB150: + eor ip, r1, r0 + tst ip, #1 + beq _037FB1A4 + bic r0, r0, #1 + ldrh ip, [r0], #2 + mov r3, ip, lsr #8 + subs r2, r2, #2 + blo _037FB188 +_037FB170: + ldrh ip, [r0], #2 + orr ip, r3, ip, lsl #8 + strh ip, [r1], #2 + mov r3, ip, lsr #0x10 + subs r2, r2, #2 + bhs _037FB170 +_037FB188: + tst r2, #1 + bxeq lr + ldrh ip, [r1] + and ip, ip, #0xff00 + orr ip, ip, r3 + strh ip, [r1] + bx lr +_037FB1A4: + tst ip, #2 + beq _037FB1D0 + bics r3, r2, #1 + beq _037FB21C + sub r2, r2, r3 + add ip, r3, r1 +_037FB1BC: + ldrh r3, [r0], #2 + strh r3, [r1], #2 + cmp r1, ip + blo _037FB1BC + b _037FB21C +_037FB1D0: + cmp r2, #2 + blo _037FB21C + tst r1, #2 + beq _037FB1F0 + ldrh r3, [r0], #2 + strh r3, [r1], #2 + subs r2, r2, #2 + bxeq lr +_037FB1F0: + bics r3, r2, #3 + beq _037FB210 + sub r2, r2, r3 + add ip, r3, r1 +_037FB200: + ldr r3, [r0], #4 + str r3, [r1], #4 + cmp r1, ip + blo _037FB200 +_037FB210: + tst r2, #2 + ldrneh r3, [r0], #2 + strneh r3, [r1], #2 +_037FB21C: + tst r2, #1 + bxeq lr + ldrh r2, [r1] + ldrh r0, [r0] + and r2, r2, #0xff00 + and r0, r0, #0xff + orr r0, r2, r0 + strh r0, [r1] + bx lr + arm_func_end MI_CpuCopy8 diff --git a/sub/lib/asm/MI_swap.s b/sub/lib/asm/MI_swap.s new file mode 100644 index 00000000..6234ad18 --- /dev/null +++ b/sub/lib/asm/MI_swap.s @@ -0,0 +1,10 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start MI_SwapWord +MI_SwapWord: ; 0x037FB240 + swp r0, r0, [r1] + bx lr + arm_func_end MI_SwapWord diff --git a/sub/lib/asm/crt0.s b/sub/lib/asm/crt0.s new file mode 100644 index 00000000..6d3e9fed --- /dev/null +++ b/sub/lib/asm/crt0.s @@ -0,0 +1,154 @@ + .include "asm/macros.inc" + .include "global.inc" + + .public OS_IrqHandler + .public NitroSpMain + .public SDK_STATIC_BSS_START + .public SDK_AUTOLOAD_LIST + .public SDK_AUTOLOAD_LIST_END + .public SDK_AUTOLOAD_START + .public SDK_STATIC_BSS_START + .public SDK_STATIC_BSS_END + .public SDK_IRQ_STACKSIZE + + .text + + arm_func_start _start +_start: ; 0x02380000 + mov ip, #0x4000000 + str ip, [ip, #0x208] + ldr r1, _023800CC ; =SDK_STATIC_BSS_END + mov r0, #0x3800000 ; HW_PRV_WRAM + cmp r0, r1 + movpl r1, r0 + ldr r2, _023800D0 ; =0x0380FF00 + mov r0, #0 +_02380020: + cmp r1, r2 + stmltia r1!, {r0} + blt _02380020 + mov r0, #0x13 + msr cpsr_c, r0 + ldr sp, _023800D4 ; =0x0380FFC0 HW_PRV_WRAM_SVC_STACK_END + mov r0, #0x12 + msr cpsr_c, r0 + ldr r0, _023800D8 ; =0x0380FF80 HW_PRV_WRAM_IRQ_STACK_END + mov sp, r0 + ldr r1, _023800DC ; =SDK_IRQ_STACKSIZE + sub r1, r0, r1 + mov r0, #0x1f + msr cpsr_fsxc, r0 + sub sp, r1, #4 + ldr r0, _023800E0 ; =0x023FE940 + ldr r1, _023800E4 ; =0x027FFA80 HW_CARD_ROM_HEADER + add r2, r1, #0x160 ; HW_CARD_ROM_HEADER_SIZE +_02380068: + ldr r3, [r0], #4 + str r3, [r1], #4 + cmp r1, r2 + bmi _02380068 + ldr r0, _023800E8 ; =0x023FE904 + add r2, r1, #0x20 ; HW_DOWNLOAD_PARAMETER_SIZE +_02380080: + ldr r3, [r0], #4 + str r3, [r1], #4 + cmp r1, r2 + bmi _02380080 + bl do_autoload + ldr r0, _023800EC ; =_start_ModuleParams + ldr r1, [r0, #0xc] + ldr r2, [r0, #0x10] + mov r0, #0 +_023800A4: + cmp r1, r2 + strlo r0, [r1], #4 + blo _023800A4 + bl detect_main_memory_size + ldr r1, _023800F0 ; =0x0380FFFC + ldr r0, _023800F4 ; =OS_IrqHandler + str r0, [r1] + ldr r1, _023800F8 ; =NitroSpMain + ldr lr, _023800FC ; =0xFFFF0000 + bx r1 + .align 2, 0 +_023800CC: .word SDK_STATIC_BSS_END +_023800D0: .word 0x0380FF00 +_023800D4: .word 0x0380FFC0 ; HW_PRV_WRAM_SVC_STACK_END +_023800D8: .word 0x0380FF80 ; HW_PRV_WRAM_IRQ_STACK_END +_023800DC: .word SDK_IRQ_STACKSIZE +_023800E0: .word 0x023FE940 +_023800E4: .word 0x027FFA80 ; HW_CARD_ROM_HEADER +_023800E8: .word 0x023FE904 +_023800EC: .word _start_ModuleParams +_023800F0: .word 0x0380FFFC +_023800F4: .word OS_IrqHandler +_023800F8: .word NitroSpMain +_023800FC: .word 0xFFFF0000 + arm_func_end _start + + arm_func_start do_autoload +do_autoload: ; 0x02380100 + ldr r0, _02380154 ; =_start_ModuleParams + ldr r1, [r0] + ldr r2, [r0, #4] + ldr r3, [r0, #8] +_02380110: + cmp r1, r2 + beq _02380150 + ldr r4, [r1], #4 + ldr r5, [r1], #4 + add r6, r4, r5 +_02380124: + cmp r4, r6 + ldrmi r7, [r3], #4 + strmi r7, [r4], #4 + bmi _02380124 + ldr r5, [r1], #4 + add r6, r4, r5 + mov r7, #0 +_02380140: + cmp r4, r6 + strlo r7, [r4], #4 + blo _02380140 + beq _02380110 +_02380150: + b _start_AutoloadDoneCallback + .align 2, 0 +_02380154: .word _start_ModuleParams + arm_func_end do_autoload + + arm_func_start _start_AutoloadDoneCallback +_start_AutoloadDoneCallback: + bx lr + arm_func_end _start_AutoloadDoneCallback + + arm_func_start detect_main_memory_size +detect_main_memory_size: ; 0x0238015C + mov r0, #1 + mov r1, #0 + ldr r2, _02380194 ; =0x027FFFFA + sub r3, r2, #0x400000 +_0238016C: + strh r1, [r2] + ldrh ip, [r3] + cmp r1, ip + movne r0, #2 + bne _0238018C + add r1, r1, #1 + cmp r1, #2 + bne _0238016C +_0238018C: + strh r0, [r2] + bx lr + .align 2, 0 +_02380194: .word 0x027FFFFA + arm_func_end detect_main_memory_size + + .public _start_ModuleParams +_start_ModuleParams: ; 0x02380198 + .word SDK_AUTOLOAD_LIST + .word SDK_AUTOLOAD_LIST_END + .word SDK_AUTOLOAD_START + .word SDK_STATIC_BSS_START + .word SDK_STATIC_BSS_END +; SDK_STATIC_TEXT_END = 0x023801B0 diff --git a/sub/lib/src/EXI_genPort.c b/sub/lib/src/EXI_genPort.c new file mode 100644 index 00000000..cf7f04de --- /dev/null +++ b/sub/lib/src/EXI_genPort.c @@ -0,0 +1,10 @@ +#include + +__declspec(noinline) +void EXIi_SetBitRcnt0L(u16 mask, u16 data) { + reg_EXI_RCNT0_L = (~mask & reg_EXI_RCNT0_L) | data; +} + +void EXIi_SelectRcnt(EXIGpioIF type) { + EXIi_SetBitRcnt0L(REG_EXI_RCNT0_L_RE1_MASK | REG_EXI_RCNT0_L_RE0_MASK, type); +} diff --git a/sub/lib/src/OS_alarm.c b/sub/lib/src/OS_alarm.c new file mode 100644 index 00000000..732abfec --- /dev/null +++ b/sub/lib/src/OS_alarm.c @@ -0,0 +1,198 @@ +#include + +void OSi_AlarmHandler(void *arg); +void OSi_ArrangeTimer(void); + +#define OSi_ALARM_TIMER OS_TIMER_1 +#define OSi_ALARM_TIMERCONTROL ((1 << REG_OS_TM1CNT_H_E_SHIFT) | (1 << REG_OS_TM1CNT_H_I_SHIFT) | OS_TIMER_PRESCALER_64) +#define OSi_ALARM_IE_TIMER OS_IE_TIMER1 + +u16 OSi_UseAlarm = FALSE; +struct OSiAlarmQueue OSi_AlarmQueue; + +void OSi_SetTimer(OSAlarm *alarm) { + s64 delta; + OSTick tick = OS_GetTick(); + u16 timerCount; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + delta = alarm->fire - tick; + OSi_EnterTimerCallback(OSi_ALARM_TIMER, OSi_AlarmHandler, NULL); + if (delta < 0) { + timerCount = (u16)~1; + } else if (delta < 0x10000) { + timerCount = (u16)~delta; + } else { + timerCount = 0; + } + OS_SetTimerCount(OSi_ALARM_TIMER, timerCount); + OS_SetTimerControl(OSi_ALARM_TIMER, OSi_ALARM_TIMERCONTROL); + OS_EnableIrqMask(OSi_ALARM_IE_TIMER); +} + +void OS_InitAlarm(void) { + if (OSi_UseAlarm) { + return; + } + OSi_UseAlarm = TRUE; + OSi_SetTimerReserved(OSi_ALARM_TIMER); + OSi_AlarmQueue.head = NULL; + OSi_AlarmQueue.tail = NULL; + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); +} + +BOOL OS_IsAlarmAvailable(void) { + return OSi_UseAlarm; +} + +void OS_CreateAlarm(OSAlarm *alarm) { + alarm->handler = NULL; + alarm->tag = 0; +} + +void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire) { + OSAlarm *prev; + OSAlarm *next; + + if (alarm->period > 0) { + OSTick tick = OS_GetTick(); + fire = alarm->start; + if (alarm->start < tick) { + fire += alarm->period * ((tick - alarm->start) / alarm->period + 1); + } + } + alarm->fire = fire; + for (next = OSi_AlarmQueue.head; next; next = next->next) { + if ((s64)(fire - next->fire) >= 0) { // cast required to match + continue; + } + alarm->prev = next->prev; + next->prev = alarm; + alarm->next = next; + prev = alarm->prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = alarm; + OSi_SetTimer(alarm); + } + return; + } + alarm->next = NULL; + prev = OSi_AlarmQueue.tail; + OSi_AlarmQueue.tail = alarm; + alarm->prev = prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = OSi_AlarmQueue.tail = alarm; // why set .tail twice? + OSi_SetTimer(alarm); + } +} + +void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg) { + OSIntrMode enabled; + + if (alarm == NULL || alarm->handler != NULL) { + OS_Panic(""); + } + + enabled = OS_DisableInterrupts(); + alarm->period = 0; + alarm->handler = handler; + alarm->arg = arg; + OSi_InsertAlarm(alarm, tick + OS_GetTick()); + OS_RestoreInterrupts(enabled); +} + +void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg) { + OSIntrMode enabled; + + if (alarm == NULL || alarm->handler != NULL) { + OS_Panic(""); + } + + enabled = OS_DisableInterrupts(); + alarm->period = period; + alarm->start = start; + alarm->handler = handler; + alarm->arg = arg; + OSi_InsertAlarm(alarm, 0); + OS_RestoreInterrupts(enabled); +} + +void OS_CancelAlarm(OSAlarm *alarm) { + OSAlarm *next; + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + if (alarm->handler == NULL) { + OS_RestoreInterrupts(enabled); + return; + } + next = alarm->next; + if (next == NULL) { + OSi_AlarmQueue.tail = alarm->prev; + } else { + next->prev = alarm->prev; + } + if (alarm->prev != NULL) { + alarm->prev->next = next; + } else { + OSi_AlarmQueue.head = next; + if (next != NULL) { + OSi_SetTimer(next); + } + } + alarm->handler = NULL; + alarm->period = 0; + OS_RestoreInterrupts(enabled); +} + +asm void OSi_AlarmHandler(void *arg) { + stmdb sp!, {r0, lr} + bl OSi_ArrangeTimer + ldmia sp!, {r0, lr} + bx lr +} + +void OSi_ArrangeTimer(void) { + OSTick tick; + OSAlarm *alarm; + OSAlarm *next; + OSAlarmHandler handler; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); + OS_SetIrqCheckFlag(OSi_ALARM_IE_TIMER); + tick = OS_GetTick(); + alarm = OSi_AlarmQueue.head; + if (alarm == NULL) { + return; + } + if (tick < alarm->fire) { + OSi_SetTimer(alarm); + return; + } + next = alarm->next; + OSi_AlarmQueue.head = next; + if (next == NULL) { + OSi_AlarmQueue.tail = NULL; + } else { + next->prev = NULL; + } + handler = alarm->handler; + if (alarm->period == 0) { + alarm->handler = NULL; + } + if (handler) { + handler(alarm->arg); + } + if (alarm->period > 0) { + alarm->handler = handler; + OSi_InsertAlarm(alarm, 0); + } + if (OSi_AlarmQueue.head) { + OSi_SetTimer(OSi_AlarmQueue.head); + } +} diff --git a/sub/lib/src/OS_alloc.c b/sub/lib/src/OS_alloc.c new file mode 100644 index 00000000..a6dcb853 --- /dev/null +++ b/sub/lib/src/OS_alloc.c @@ -0,0 +1,272 @@ +#include + +#define OFFSET(n, a) (((u32) (n)) & ((a) - 1)) +#define TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) +#define ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) + +#define ALIGNMENT 32 +#define MINOBJSIZE (HEADERSIZE + ALIGNMENT) +#define HEADERSIZE ROUND(sizeof(Cell), ALIGNMENT) + +void *OSiHeapInfo[OS_ARENA_MAX] = {}; + +static +#ifdef SDK_ARM7 +inline +#endif //SDK_ARM7 +Cell *DLAddFront(Cell *list, Cell *cell) { + cell->next = list; + cell->prev = NULL; + if (list != NULL) { + list->prev = cell; + } + return cell; +} + +Cell *DLExtract(Cell *list, Cell *cell) { + if (cell->next != NULL) { + cell->next->prev = cell->prev; + } + if (cell->prev == NULL) { + return cell->next; + } else { + cell->prev->next = cell->next; + return list; + } +} + +Cell *DLInsert(Cell *list, Cell *cell) { + Cell *prev; + Cell *next; + + for (next = list, prev = NULL; next; prev = next, next = next->next) { + if (cell <= next) { + break; + } + } + + cell->next = next; + cell->prev = prev; + + if (next) { + next->prev = cell; + if ((char *)cell + cell->size == (char *)next) { + cell->size += next->size; + cell->next = next = next->next; + if (next) { + next->prev = cell; + } + } + } + if (prev) { + prev->next = cell; + if ((char *)prev + prev->size == (char *)cell) { + prev->size += cell->size; + prev->next = next; + if (next) { + next->prev = prev; + } + } + return list; + } else { + return cell; + } +} + +void *OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + Cell *newCell; + long leftoverSize; + OSIntrMode enabled = OS_DisableInterrupts(); + + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + if (heapInfo == NULL) { + OS_RestoreInterrupts(enabled); + return NULL; + } + + if (heap < 0) { + heap = heapInfo->currentHeap; + } + hd = &heapInfo->heapArray[heap]; + size += HEADERSIZE; + size = ROUND(size, ALIGNMENT); + for (cell = hd->free; cell != NULL; cell = cell->next) { + if ((long)size <= cell->size) { + break; + } + } + if (cell == NULL) { + OS_RestoreInterrupts(enabled); + return NULL; + } + leftoverSize = cell->size - size; + if (leftoverSize < MINOBJSIZE) { + hd->free = DLExtract(hd->free, cell); + } else { + cell->size = (long)size; + newCell = (Cell*)((char *)cell + size); + newCell->size = leftoverSize; + newCell->prev = cell->prev; + newCell->next = cell->next; + if (newCell->next != NULL) { + newCell->next->prev = newCell; + } + if (newCell->prev != NULL) { + newCell->prev->next = newCell; + } else { + // debug assert here: "broken heap" + hd->free = newCell; + } + } + hd->allocated = DLAddFront(hd->allocated, cell); + OS_RestoreInterrupts(enabled); + return (void *)((char *)cell + HEADERSIZE); +} + +void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void *ptr) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + if (heap < 0) { + heap = heapInfo->currentHeap; + } + hd = &heapInfo->heapArray[heap]; + cell = (Cell *)((char *)ptr - HEADERSIZE); + hd->allocated = DLExtract(hd->allocated, cell); + hd->free = DLInsert(hd->free, cell); + OS_RestoreInterrupts(enabled); +} + +OSHeapHandle OS_SetCurrentHeap(OSArenaId id, OSHeapHandle heap) { + OSHeapInfo *heapInfo; + OSHeapHandle prev; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + prev = heapInfo->currentHeap; + heapInfo->currentHeap = heap; + OS_RestoreInterrupts(enabled); + return prev; +} + +void *OS_InitAlloc(OSArenaId id, void *arenaStart, void *arenaEnd, s32 maxHeaps) { + OSHeapInfo *heapInfo; + OSHeapHandle i; + u32 arraySize; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = arenaStart; + OSiHeapInfo[id] = heapInfo; + arraySize = sizeof(HeapDesc) * maxHeaps; + heapInfo->heapArray = (void *)((u32)arenaStart + sizeof(OSHeapInfo)); + heapInfo->numHeaps = maxHeaps; + for (i = 0; i < heapInfo->numHeaps; i++) { + HeapDesc *hd = &heapInfo->heapArray[i]; + hd->size = -1; + hd->free = hd->allocated = NULL; + } + heapInfo->currentHeap = -1; + arenaStart = (void *)((char *)heapInfo->heapArray + arraySize); + arenaStart = (void *)ROUND(arenaStart, ALIGNMENT); + heapInfo->arenaStart = arenaStart; + heapInfo->arenaEnd = (void *)TRUNC(arenaEnd, ALIGNMENT); + OS_RestoreInterrupts(enabled); + return heapInfo->arenaStart; +} + +void OS_ClearAlloc(OSArenaId id) { + OSiHeapInfo[id] = NULL; // Act like it never existed +} + +OSHeapHandle OS_CreateHeap(OSArenaId id, void *start, void *end) { + OSHeapInfo *heapInfo; + OSHeapHandle heap; + HeapDesc *hd; + Cell *cell; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = (OSHeapInfo *)OSiHeapInfo[id]; + start = (void *)ROUND(start, ALIGNMENT); + end = (void *)TRUNC(end, ALIGNMENT); + for (heap = 0; heap < heapInfo->numHeaps; heap++) { + hd = &heapInfo->heapArray[heap]; + if (hd->size < 0) { + // This heap is available, asign it + hd->size = (char *)end - (char *)start; + cell = (Cell *)start; + cell->prev = NULL; + cell->next = NULL; + cell->size = hd->size; + hd->free = cell; + hd->allocated = NULL; + OS_RestoreInterrupts(enabled); + return heap; + } + } + // No heap is available, signal such + OS_RestoreInterrupts(enabled); + return -1; +} + +#define InRange(targ, a, b)((u32)(a) <= (u32)(targ) && (u32)(targ) < (u32)(b)) + +#define OSi_CHECK(exp) do { \ + if (!(exp)) { \ + goto exit_OS_CheckHeap; \ + } \ +} while (0) + +s32 OS_CheckHeap(OSArenaId id, OSHeapHandle heap) { + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + long total = 0; + long free = 0; + long retValue = -1; + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = OSiHeapInfo[id]; + if (heap == -1) { + heap = heapInfo->currentHeap; + } + OSi_CHECK(heapInfo->heapArray); + OSi_CHECK(0 <= heap && heap < heapInfo->numHeaps); + + hd = &heapInfo->heapArray[heap]; + OSi_CHECK(0 <= hd->size); + + OSi_CHECK(hd->allocated == NULL || hd->allocated->prev == NULL); + for (cell = hd->allocated; cell; cell = cell->next) { + OSi_CHECK(InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OFFSET(cell, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OFFSET(cell->size, ALIGNMENT) == 0); + + total += cell->size; + OSi_CHECK(0 < total && total <= hd->size); + + } + + OSi_CHECK(hd->free == NULL || hd->free->prev == NULL); + for (cell = hd->free; cell; cell = cell->next) { + OSi_CHECK(InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OFFSET(cell, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OFFSET(cell->size, ALIGNMENT) == 0); + OSi_CHECK(cell->next == NULL || (char *) cell + cell->size < (char *) cell->next); + + total += cell->size; + free += cell->size - HEADERSIZE; + OSi_CHECK(0 < total && total <= hd->size); + } + + OSi_CHECK(total == hd->size); + retValue = free; + +exit_OS_CheckHeap: + OS_RestoreInterrupts(enabled); + return retValue; +} diff --git a/sub/lib/src/OS_arena.c b/sub/lib/src/OS_arena.c new file mode 100644 index 00000000..fa894f69 --- /dev/null +++ b/sub/lib/src/OS_arena.c @@ -0,0 +1,243 @@ +#include + +extern void SDK_IRQ_STACKSIZE(void); +#define OSi_IRQ_STACKSIZE ((s32)SDK_IRQ_STACKSIZE) +extern void SDK_SYS_STACKSIZE(void); +#define OSi_SYS_STACKSIZE ((s32)SDK_SYS_STACKSIZE) + +#ifdef SDK_ARM9 +extern void SDK_SECTION_ARENA_DTCM_START(void); +#define OSi_DTCM_ARENA_LO_DEFAULT ((s32)SDK_SECTION_ARENA_DTCM_START) + +extern void SDK_SECTION_ARENA_ITCM_START(void); +#define OSi_ITCM_ARENA_LO_DEFAULT ((s32)SDK_SECTION_ARENA_ITCM_START) + +extern void SDK_MAIN_ARENA_LO(void); +#define OSi_MAIN_ARENA_LO_DEFAULT ((s32)SDK_MAIN_ARENA_LO) +#else +extern void SDK_SUBPRIV_ARENA_LO(void); +#define OSi_SUBPRIV_ARENA_LO_DEFAULT ((s32)SDK_SUBPRIV_ARENA_LO) + +extern void SDK_WRAM_ARENA_LO(void); +#define OSi_WRAM_ARENA_LO_DEFAULT ((s32)SDK_WRAM_ARENA_LO) +#endif //SDK_ARM9 + +static BOOL OSi_Initialized = FALSE; +#ifdef SDK_ARM9 +static BOOL OSi_MainArenaEnabled = FALSE; +#endif + +void OS_InitArena(void) { + if (OSi_Initialized) { + return; + } + OSi_Initialized = TRUE; +#ifdef SDK_ARM9 + OS_SetArenaHi(OS_ARENA_MAIN, OS_GetInitArenaHi(OS_ARENA_MAIN)); + OS_SetArenaLo(OS_ARENA_MAIN, OS_GetInitArenaLo(OS_ARENA_MAIN)); + OS_SetArenaLo(OS_ARENA_MAINEX, NULL); + OS_SetArenaHi(OS_ARENA_MAINEX, NULL); + OS_SetArenaHi(OS_ARENA_ITCM, OS_GetInitArenaHi(OS_ARENA_ITCM)); + OS_SetArenaLo(OS_ARENA_ITCM, OS_GetInitArenaLo(OS_ARENA_ITCM)); + OS_SetArenaHi(OS_ARENA_DTCM, OS_GetInitArenaHi(OS_ARENA_DTCM)); + OS_SetArenaLo(OS_ARENA_DTCM, OS_GetInitArenaLo(OS_ARENA_DTCM)); + OS_SetArenaHi(OS_ARENA_SHARED, OS_GetInitArenaHi(OS_ARENA_SHARED)); + OS_SetArenaLo(OS_ARENA_SHARED, OS_GetInitArenaLo(OS_ARENA_SHARED)); + OS_SetArenaHi(OS_ARENA_WRAM_MAIN, OS_GetInitArenaHi(OS_ARENA_WRAM_MAIN)); + OS_SetArenaLo(OS_ARENA_WRAM_MAIN, OS_GetInitArenaLo(OS_ARENA_WRAM_MAIN)); +#else + OS_InitArenaHiAndLo(OS_ARENA_MAIN_SUBPRIV); + OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUB); + OS_InitArenaHiAndLo(OS_ARENA_WRAM_SUBPRIV); +#endif +} + +#ifdef SDK_ARM9 +void OS_InitArenaEx(void) { + OS_SetArenaHi(OS_ARENA_MAINEX, OS_GetInitArenaHi(OS_ARENA_MAINEX)); + OS_SetArenaLo(OS_ARENA_MAINEX, OS_GetInitArenaLo(OS_ARENA_MAINEX)); + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + OS_SetProtectionRegion(1, HW_MAIN_MEM_MAIN, 4MB); + OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 128KB); + } +} +#else +static inline void OS_InitArenaHi(OSArenaId id) +{ + OS_SetArenaHi(id, OS_GetInitArenaHi((OSArenaId)id)); +} + +static inline void OS_InitArenaLo(OSArenaId id) +{ + OS_SetArenaLo(id, OS_GetInitArenaLo(id)); +} + +void OS_InitArenaHiAndLo(OSArenaId id) +{ + OS_InitArenaHi(id); + OS_InitArenaLo(id); +} +#endif //SDK_ARM9 + +void *OS_GetArenaHi(OSArenaId id) { + return OSi_GetArenaInfo().hi[id]; +} + +void *OS_GetArenaLo(OSArenaId id) { + return OSi_GetArenaInfo().lo[id]; +} + +void *OS_GetInitArenaHi(OSArenaId id) { + switch (id) { +#ifdef SDK_ARM9 + case OS_ARENA_MAIN: + return (void *)OSi_MAIN_ARENA_HI_DEFAULT; + case OS_ARENA_MAINEX: + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + return NULL; + } else { + return (void *)OSi_MAINEX_ARENA_HI_DEFAULT; + } + case OS_ARENA_ITCM: + return (void *)HW_ITCM_ARENA_HI_DEFAULT; + case OS_ARENA_DTCM: { + u32 irqStackLo; + u32 sysStackLo; + + irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - OSi_IRQ_STACKSIZE; + + if (OSi_SYS_STACKSIZE == 0) { + sysStackLo = HW_DTCM; + if (sysStackLo < OSi_DTCM_ARENA_LO_DEFAULT) { + sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT; + } + } else if (OSi_SYS_STACKSIZE < 0) { + sysStackLo = OSi_DTCM_ARENA_LO_DEFAULT - OSi_SYS_STACKSIZE; + } else { + sysStackLo = irqStackLo - OSi_SYS_STACKSIZE; + } + return (void *)sysStackLo; + } + case OS_ARENA_SHARED: + return (void *)HW_SHARED_ARENA_HI_DEFAULT; + case OS_ARENA_WRAM_MAIN: + return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT; +#else + case OS_ARENA_MAIN_SUBPRIV: + return (void *)HW_MAIN_MEM_SUB_END; + case OS_ARENA_WRAM_SUB: + return (void *)HW_WRAM_END; + case OS_ARENA_WRAM_SUBPRIV: + { + u32 irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - OSi_IRQ_STACKSIZE; + u32 sysStackLo = (u32)HW_PRV_WRAM; + + if ((u32)OSi_WRAM_ARENA_LO_DEFAULT > (u32)HW_PRV_WRAM) { + sysStackLo = (u32)OSi_WRAM_ARENA_LO_DEFAULT; + } + + if (!OSi_SYS_STACKSIZE) { + return (void *)sysStackLo; + } else if (OSi_SYS_STACKSIZE < 0) { + sysStackLo -= OSi_SYS_STACKSIZE; + } else { + sysStackLo = irqStackLo - OSi_SYS_STACKSIZE; + } + + return (void *)sysStackLo; + } +#endif //SDK_ARM9 + default: + return NULL; + } +} + +void *OS_GetInitArenaLo(OSArenaId id) { + switch (id) { +#ifdef SDK_ARM9 + case OS_ARENA_MAIN: + return (void *)OSi_MAIN_ARENA_LO_DEFAULT; + case OS_ARENA_MAINEX: + if (!OSi_MainArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { + return NULL; + } else { + return (void *)OSi_MAINEX_ARENA_LO_DEFAULT; + } + case OS_ARENA_ITCM: + return (void *)OSi_ITCM_ARENA_LO_DEFAULT; + case OS_ARENA_DTCM: + return (void *)OSi_DTCM_ARENA_LO_DEFAULT; + case OS_ARENA_SHARED: + return (void *)HW_SHARED_ARENA_LO_DEFAULT; + case OS_ARENA_WRAM_MAIN: + return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT; +#else + case OS_ARENA_MAIN_SUBPRIV: + return (void *)OSi_SUBPRIV_ARENA_LO_DEFAULT; + case OS_ARENA_WRAM_SUB: + { + u32 wramSubLo = ((u32)OSi_WRAM_ARENA_LO_DEFAULT); + if ((u32)HW_WRAM_END < (u32)wramSubLo) { + wramSubLo = (u32)HW_WRAM_END; + } + return (void *)wramSubLo; + } + case OS_ARENA_WRAM_SUBPRIV: + { + u32 privWramLo = HW_PRV_WRAM; + if ((u32)OSi_WRAM_ARENA_LO_DEFAULT > (u32)privWramLo) { + privWramLo = (u32)OSi_WRAM_ARENA_LO_DEFAULT; + } + return (void *)privWramLo; + } +#endif + default: + return NULL; + } +} + +void OS_SetArenaHi(OSArenaId id, void *ptr) { + OSi_GetArenaInfo().hi[id] = ptr; +} + +void OS_SetArenaLo(OSArenaId arena, void *ptr) { + OSi_GetArenaInfo().lo[arena] = ptr; +} + +void *OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) { + void *ptr; + u8 *arenaLo; + + ptr = OS_GetArenaLo(id); + if (ptr == NULL) { + return NULL; + } + + arenaLo = ptr = (void *)OSi_ROUND(ptr, align); + arenaLo += size; + arenaLo = (u8 *)OSi_ROUND(arenaLo, align); + if (arenaLo > (u8 *)OS_GetArenaHi(id)) { + return NULL; + } + OS_SetArenaLo(id, arenaLo); + return ptr; +} + +void *OS_AllocFromArenaHi(OSArenaId arena, u32 size, u32 align) { + void *ptr; + u8 *arenaHi; + + arenaHi = OS_GetArenaHi(arena); + if (arenaHi == NULL) { + return NULL; + } + + arenaHi = (u8 *)OSi_TRUNC(arenaHi, align); + arenaHi -= size; + arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align); + if (arenaHi < (u8 *)OS_GetArenaLo(arena)) { + return NULL; + } + OS_SetArenaHi(arena, arenaHi); + return ptr; +} diff --git a/sub/lib/src/OS_context.c b/sub/lib/src/OS_context.c new file mode 100644 index 00000000..098a5399 --- /dev/null +++ b/sub/lib/src/OS_context.c @@ -0,0 +1,96 @@ +#include +#include + +asm void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp) { +add newpc, newpc, #4 +str newpc, [context, #OS_CONTEXT_PC_PLUS4] + +#ifdef SDK_CONTEXT_HAS_SP_SVC +str newsp, [context, #OS_CONTEXT_SP_SVC] +sub newsp, newsp, #HW_SVC_STACK_SIZE +#endif + +tst newsp, #4 +subne newsp, newsp, #4 +str newsp, [context, #OS_CONTEXT_SP] + +ands newpc, newpc, #1 +movne r1, #HW_PSR_SYS_MODE | HW_PSR_THUMB_STATE +moveq r1, #HW_PSR_SYS_MODE | HW_PSR_ARM_STATE +str r1, [context, #OS_CONTEXT_CPSR] + +// Zero-initialize the registers +mov r1, #0 +str r1, [context, #OS_CONTEXT_R0] +str r1, [context, #OS_CONTEXT_R1] +str r1, [context, #OS_CONTEXT_R2] +str r1, [context, #OS_CONTEXT_R3] +str r1, [context, #OS_CONTEXT_R4] +str r1, [context, #OS_CONTEXT_R5] +str r1, [context, #OS_CONTEXT_R6] +str r1, [context, #OS_CONTEXT_R7] +str r1, [context, #OS_CONTEXT_R8] +str r1, [context, #OS_CONTEXT_R9] +str r1, [context, #OS_CONTEXT_R10] +str r1, [context, #OS_CONTEXT_R11] +str r1, [context, #OS_CONTEXT_R12] +str r1, [context, #OS_CONTEXT_R14] +bx lr +} + +asm BOOL OS_SaveContext(register OSContext *context) { +#ifdef SDK_ARM9 +stmdb sp!, {r0, lr} + add r0, r0, #OS_CONTEXT_CP_CONTEXT + ldr r1, =CP_SaveContext + blx r1 + ldmia sp!, {r0, lr} +#endif +add r1, r0, #0 + +mrs r2, cpsr +str r2, [r1], #OS_CONTEXT_R0 - OS_CONTEXT_CPSR + +#ifdef SDK_CONTEXT_HAS_SP_SVC +mov r0, #HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE | HW_PSR_ARM_STATE +msr cpsr_c, r0 +str sp, [r1, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0] +msr cpsr_c, r2 +#endif + +mov r0, #1 // Return value if restoring context via OS_LoadContext +stmia r1, {r0-r14} +add r0, pc, #0x8 +str r0, [r1, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0] + +mov r0, #0 +bx lr +} + +asm void OS_LoadContext(register OSContext *context) { +#ifdef SDK_ARM9 +stmdb sp!, {r0, lr} + add r0, r0, #OS_CONTEXT_CP_CONTEXT + ldr r1, =CPi_RestoreContext + blx r1 + ldmia sp!, {r0, lr} +#endif + +mrs r1, cpsr +bic r1, r1, #HW_PSR_CPU_MODE_MASK +orr r1, r1, #HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE +msr cpsr_c, r1 + +ldr r1, [r0], #OS_CONTEXT_R0 - OS_CONTEXT_CPSR +msr spsr_fsxc, r1 + +#ifdef SDK_CONTEXT_HAS_SP_SVC +ldr sp, [r0, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0] +#endif + +ldr lr, [r0, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0] +ldmia r0, {r0-r14} ^ +nop + + subs pc, lr, #4 +} diff --git a/sub/lib/src/OS_init.c b/sub/lib/src/OS_init.c new file mode 100644 index 00000000..fff1b1f9 --- /dev/null +++ b/sub/lib/src/OS_init.c @@ -0,0 +1,20 @@ +#include +#include + +extern void PXI_Init(void); +extern void OS_InitThread(void); +extern void OS_InitAlarm(void); +extern void CTRDG_Init(void); + +void OS_Init(void) +{ + OS_InitArena(); + PXI_Init(); + OS_InitLock(); + OS_InitIrqTable(); + OS_InitTick(); + OS_InitAlarm(); + OS_InitThread(); + OS_InitReset(); + CTRDG_Init(); +} diff --git a/sub/lib/src/OS_interrupt.c b/sub/lib/src/OS_interrupt.c new file mode 100644 index 00000000..bf6893c1 --- /dev/null +++ b/sub/lib/src/OS_interrupt.c @@ -0,0 +1,147 @@ +#include + +extern OSThreadQueue OSi_IrqThreadQueue; + +static u32 OSi_IrqStackWarningOffset = 0; + +void OS_InitIrqTable(void) { + OS_InitThreadQueue(&OSi_IrqThreadQueue); +#ifdef SDK_ARM7 + OSi_SetVBlankCount(0); +#endif +} + +void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) { + int i; + OSIrqCallbackInfo * info; + for (i = 0; i < OS_IRQ_TABLE_MAX; i++) { + if (intrBit & 1) { + info = NULL; + if (REG_OS_IE_D0_SHIFT <= i && i <= REG_OS_IE_D3_SHIFT) { + info = &OSi_IrqCallbackInfo[i - REG_OS_IE_D0_SHIFT]; + } else if (REG_OS_IE_T0_SHIFT <= i && i <= REG_OS_IE_T3_SHIFT) { + info = &OSi_IrqCallbackInfo[i - REG_OS_IE_T0_SHIFT + OSi_IRQCALLBACK_NO_TIMER0]; + } +#ifdef SDK_ARM7 + else if (i == REG_OS_IE_VB_SHIFT) { + info = &OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK]; + } +#endif + else { + OS_IRQTable[i] = function; + } + if (info) { + info->func = (void (*)(void*))function; + info->arg = 0; + info->enable = TRUE; + } + } + intrBit >>= 1; + } +} + +OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { + int i; + OSIrqFunction *funcPtr = &OS_IRQTable[0]; + for (i = 0; i < OS_IRQ_TABLE_MAX; i++) { + if (intrBit & 1) { + if (REG_OS_IE_D0_SHIFT <= i && i <= REG_OS_IE_D3_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[i - REG_OS_IE_D0_SHIFT].func; + } else if (REG_OS_IE_T0_SHIFT <= i && i <= REG_OS_IE_T3_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[i - REG_OS_IE_T0_SHIFT + OSi_IRQCALLBACK_NO_TIMER0].func; + } +#ifdef SDK_ARM7 + else if (i == REG_OS_IE_VB_SHIFT) { + return (OSIrqFunction)OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func; + } +#endif + return *funcPtr; + } + intrBit >>= 1; + funcPtr++; + } + return NULL; +} + +void OSi_EnterDmaCallback(u32 dmaNo, void (*callback)(void * arg), void * arg) { + OSIrqMask imask = (1UL << (dmaNo + REG_OS_IE_D0_SHIFT)); + OSi_IrqCallbackInfo[dmaNo].func = callback; + OSi_IrqCallbackInfo[dmaNo].arg = arg; + OSi_IrqCallbackInfo[dmaNo].enable = OS_EnableIrqMask(imask) & imask; +} + +void OSi_EnterTimerCallback(u32 timerNo, void (*callback)(void * arg), void * arg) { + OSIrqMask imask = (1UL << (timerNo + REG_OS_IE_T0_SHIFT)); + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].func = callback; + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].arg = arg; + OS_EnableIrqMask(imask); + OSi_IrqCallbackInfo[timerNo + OSi_IRQCALLBACK_NO_TIMER0].enable = TRUE; +} + +OSIrqMask OS_SetIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = newMask; + OS_RestoreIrq(ime); + return prep; +} + +#ifdef SDK_ARM7 +BOOL OS_DisableIrq(void) { + BOOL ime = reg_OS_IME; + reg_OS_IME = 0; + return ime; +} +#endif + +OSIrqMask OS_EnableIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = prep | newMask; + OS_RestoreIrq(ime); + return prep; +} + +OSIrqMask OS_DisableIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IE; + reg_OS_IE = prep & ~newMask; + OS_RestoreIrq(ime); + return prep; +} + +OSIrqMask OS_ResetRequestIrqMask(OSIrqMask newMask) { + BOOL ime = OS_DisableIrq(); + OSIrqMask prep = reg_OS_IF; + reg_OS_IF = newMask; + OS_RestoreIrq(ime); + return prep; +} + +extern void SDK_IRQ_STACKSIZE(void); + +//---- defs for irq stack +#ifdef SDK_ARM9 +#define OSi_IRQ_STACK_TOP (HW_DTCM_SVC_STACK - ((s32)SDK_IRQ_STACKSIZE)) +#define OSi_IRQ_STACK_BOTTOM HW_DTCM_SVC_STACK +#else +#define OSi_IRQ_STACK_TOP (HW_PRV_WRAM_IRQ_STACK_END - ((s32)SDK_IRQ_STACKSIZE)) +#define OSi_IRQ_STACK_BOTTOM HW_PRV_WRAM_IRQ_STACK_END +#endif + +//---- Stack CheckNumber +#ifdef SDK_ARM9 +#define OSi_IRQ_STACK_CHECKNUM_BOTTOM 0xfddb597dUL +#define OSi_IRQ_STACK_CHECKNUM_TOP 0x7bf9dd5bUL +#define OSi_IRQ_STACK_CHECKNUM_WARN 0x597dfbd9UL +#else +#define OSi_IRQ_STACK_CHECKNUM_BOTTOM 0xd73bfdf7UL +#define OSi_IRQ_STACK_CHECKNUM_TOP 0xfbdd37bbUL +#define OSi_IRQ_STACK_CHECKNUM_WARN 0xbdf7db3dUL +#endif + + +void OS_SetIrqStackChecker(void) { + *(u32 *)(OSi_IRQ_STACK_BOTTOM - sizeof(u32)) = OSi_IRQ_STACK_CHECKNUM_BOTTOM; + *(u32 *)(OSi_IRQ_STACK_TOP) = OSi_IRQ_STACK_CHECKNUM_TOP; +} diff --git a/sub/lib/src/OS_irqHandler.c b/sub/lib/src/OS_irqHandler.c new file mode 100644 index 00000000..f0360fdd --- /dev/null +++ b/sub/lib/src/OS_irqHandler.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include +#include + +extern OSThreadQueue OSi_IrqThreadQueue; +asm void OS_IrqHandler_ThreadSwitch(void); + +void OS_WaitIrq(BOOL clear, OSIrqMask irqFlags) { + OSIntrMode enabled = OS_DisableInterrupts(); + if (clear) { + OS_ClearIrqCheckFlag(irqFlags); + } + OS_RestoreInterrupts(enabled); + while (!(OS_GetIrqCheckFlag() & irqFlags)) { + OS_SleepThread(&OSi_IrqThreadQueue); + } +} + +#ifdef SDK_ARM9 +#include +#endif + +OSThreadQueue OSi_IrqThreadQueue = {NULL, NULL}; + +#ifdef SDK_ARM9 +#include +#endif + +#ifdef SDK_ARM9 +#include +#endif //SDK_ARM9 + +asm void OS_IrqHandler(register OSIrqMask irq) { + stmdb sp!, {lr} + mov r12, #HW_REG_BASE + add r12, r12, #REG_IE_OFFSET + // Are intr disabled? + ldr r1, [r12, #REG_IME_OFFSET - REG_IE_OFFSET] + cmp r1, #0 + ldmeqia sp!, {pc} + // Is intr requested? + ldmia r12, {r1, r2} + ands r1, r1, r2 + ldmeqia sp!, {pc} + // Least significant intr flag takes highest priority +#ifdef SDK_ARM9 + mov r3, #1 << 31 +@clzLoop: + clz r0, r1 + bics r1, r1, r3, lsr r0 + bne @clzLoop + mov r1, r3, lsr r0 + str r1, [r12, #REG_IF_OFFSET - REG_IE_OFFSET] + rsbs r0, r0, #31 +#else + mov r3, #1 + mov r0, #0 +@clzLoop: + ands r2, r1, r3, lsl r0 + addeq r0, r0, #1 + beq @clzLoop + str r2, [r12, #REG_IF_OFFSET - REG_IE_OFFSET] +#endif + ldr r1, =OS_IRQTable + ldr r0, [r1, r0, lsl #2] + ldr lr, =OS_IrqHandler_ThreadSwitch + bx r0 +} + +asm void OS_IrqHandler_ThreadSwitch(void) { + ldr r12, =OSi_IrqThreadQueue + mov r3, #0 + ldr r12, [r12, #OSThreadQueue.head] + mov r2, #1 + cmp r12, #0 + beq @noThreadsToWake +@wakeThreadsLoop: + str r2, [r12, #OSThread.state] + str r3, [r12, #OSThread.queue] + str r3, [r12, #OSThread.link.prev] + ldr r0, [r12, #OSThread.link.next] + str r3, [r12, #OSThread.link.next] + mov r12, r0 + cmp r12, #0 + bne @wakeThreadsLoop + ldr r12, =OSi_IrqThreadQueue + str r3, [r12, #OSThreadQueue.head] + str r3, [r12, #OSThreadQueue.tail] + ldr r12, =OSi_ThreadInfo + mov r1, #1 + strh r1, [r12, #OSThreadInfo.isNeedRescheduling] +@noThreadsToWake: + ldr r12, =OSi_ThreadInfo + ldrh r1, [r12, #OSThreadInfo.isNeedRescheduling] + cmp r1, #0 + ldreq pc, [sp], #4 + mov r1, #0 + strh r1, [r12, #OSThreadInfo.isNeedRescheduling] + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 + add r2, r12, #OSThreadInfo.list + ldr r1, [r2] +@listLoop: + cmp r1, #0 + ldrneh r0, [r1, #OSThread.state] + cmpne r0, #OS_THREAD_STATE_READY + ldrne r1, [r1, #OSThread.next] + bne @listLoop + cmp r1, #0 + bne @checkNext +@enableFiqAndBail: + mov r3, #HW_PSR_DISABLE_IRQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 + ldr pc, [sp], #4 +@checkNext: + ldr r0, [r12, #OSThreadInfo.current] + cmp r1, r0 + beq @enableFiqAndBail + ldr r3, [r12, #OSThreadInfo.switchCallback] + cmp r3, #0 + beq @noSwitchCB + stmdb sp!, {r0, r1, r12} + mov lr, pc + bx r3 + ldmia sp!, {r0, r1, r12} +@noSwitchCB: + str r1, [r12, #OSThreadInfo.current] + mrs r2, spsr + str r2, [r0, #OSThread.context + OS_CONTEXT_CPSR]! +#ifdef SDK_ARM9 + stmdb sp!, {r0, r1} + add r0, r0, #OSThread.context + add r0, r0, #OSContext.cp_context + ldr r1, =CP_SaveContext + blx r1 + ldmia sp!, {r0, r1} +#endif + ldmib sp!, {r2, r3} + stmib r0!, {r2, r3} + ldmib sp!, {r2, r3, r12, lr} + stmib r0!, {r2-r14} ^ + stmib r0!, {lr} +#ifdef SDK_CONTEXT_HAS_SP_SVC + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_SVC_MODE + msr cpsr_c, r3 + stmib r0!, {sp} +#endif +#ifdef SDK_ARM9 +stmdb sp!, {r1} + add r0, r1, #OSThread.context + add r0, r0, #OSContext.cp_context + ldr r1, =CPi_RestoreContext + blx r1 + ldmia sp!, {r1} +#endif +#ifdef SDK_CONTEXT_HAS_SP_SVC + ldr sp, [r1, #OSThread.context + OSContext.sp_svc] + mov r3, #HW_PSR_DISABLE_IRQ_FIQ | HW_PSR_IRQ_MODE + msr cpsr_c, r3 +#endif + ldr r2, [r1, #OSThread.context + OSContext.cpsr]! + msr spsr_fc, r2 + ldr lr, [r1, #OSThread.context + OSContext.pc_plus4] + ldmib r1, {r0-r14} ^ + nop + stmda sp!, {r0-r3, r12, lr} + ldmia sp!, {pc} +} diff --git a/sub/lib/src/OS_irqTable.c b/sub/lib/src/OS_irqTable.c new file mode 100644 index 00000000..647924dc --- /dev/null +++ b/sub/lib/src/OS_irqTable.c @@ -0,0 +1,114 @@ +#include +#include + +OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM]; + +u16 OSi_IrqCallbackInfoIndex[] = { + REG_OS_IE_D0_SHIFT, + REG_OS_IE_D1_SHIFT, + REG_OS_IE_D2_SHIFT, + REG_OS_IE_D3_SHIFT, + REG_OS_IE_T0_SHIFT, + REG_OS_IE_T1_SHIFT, + REG_OS_IE_T2_SHIFT, + REG_OS_IE_T3_SHIFT, +#ifdef SDK_ARM7 + REG_OS_IE_VB_SHIFT, +#endif +}; + +#ifdef SDK_ARM9 +#include +#endif +OSIrqFunction OS_IRQTable[] = { +#ifdef SDK_ARM7 + OSi_IrqVBlank, +#else + OS_IrqDummy, +#endif + OS_IrqDummy, + OS_IrqDummy, + OSi_IrqTimer0, + OSi_IrqTimer1, + OSi_IrqTimer2, + OSi_IrqTimer3, + OS_IrqDummy, + OSi_IrqDma0, + OSi_IrqDma1, + OSi_IrqDma2, + OSi_IrqDma3, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, +#ifdef SDK_ARM7 + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, +#endif +}; + +#ifdef SDK_ARM9 +#include +#endif + +void OS_IrqDummy(void) {} + +void OSi_IrqCallback(s32 index) { + OSIrqMask imask = (1UL << OSi_IrqCallbackInfoIndex[index]); + void (*callback)(void *) = OSi_IrqCallbackInfo[index].func; + OSi_IrqCallbackInfo[index].func = NULL; + if (callback) callback(OSi_IrqCallbackInfo[index].arg); + OS_SetIrqCheckFlag(imask); + if (!OSi_IrqCallbackInfo[index].enable) + OS_DisableIrqMask(imask); +} + +void OSi_IrqDma0(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA0); +} + +void OSi_IrqDma1(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA1); +} + +void OSi_IrqDma2(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA2); +} + +void OSi_IrqDma3(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA3); +} + +void OSi_IrqTimer0(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER0); +} + +void OSi_IrqTimer1(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER1); +} + +void OSi_IrqTimer2(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER2); +} + +void OSi_IrqTimer3(void) { + OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER3); +} + +#ifdef SDK_ARM7 +void OSi_IrqVBlank(void) { + void (*callback)(void) = (void(*)(void))OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func; + (*(u32 *)HW_VBLANK_COUNT_BUF)++; + if (callback) { + callback(); + } + OS_SetIrqCheckFlag(1UL << REG_OS_IE_VB_SHIFT); +} +#endif //SDK_ARM7 diff --git a/sub/lib/src/OS_message.c b/sub/lib/src/OS_message.c new file mode 100644 index 00000000..57f205fa --- /dev/null +++ b/sub/lib/src/OS_message.c @@ -0,0 +1,96 @@ +#include +#include +#include + +void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount) +{ + OS_InitThreadQueue(&mq->queueSend); + OS_InitThreadQueue(&mq->queueReceive); + mq->msgArray = msgArray; + mq->msgCount = msgCount; + mq->firstIndex = 0; + mq->usedCount = 0; +} + +BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + while (mq->msgCount <= mq->usedCount) + { + if (!(flags & OS_MESSAGE_BLOCK)) + { + (void)OS_RestoreInterrupts(enabled); + return FALSE; + } + else + { + OS_SleepThread(&mq->queueSend); + } + } + + s32 lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount; + mq->msgArray[lastIndex] = msg; + mq->usedCount++; + + OS_WakeupThread(&mq->queueReceive); + + (void)OS_RestoreInterrupts(enabled); + return TRUE; +} + +BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + while (mq->usedCount == 0) + { + if (!(flags & OS_MESSAGE_BLOCK)) + { + (void)OS_RestoreInterrupts(enabled); + return FALSE; + } + else + { + OS_SleepThread(&mq->queueReceive); + } + } + + if (msg != NULL) + { + *msg = mq->msgArray[mq->firstIndex]; + } + mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount; + mq->usedCount--; + + OS_WakeupThread(&mq->queueSend); + + (void)OS_RestoreInterrupts(enabled); + return TRUE; +} + +BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + while (mq->usedCount == 0) + { + if (!(flags & OS_MESSAGE_BLOCK)) + { + (void)OS_RestoreInterrupts(enabled); + return FALSE; + } + else + { + OS_SleepThread(&mq->queueReceive); + } + } + + if (msg != NULL) + { + *msg = mq->msgArray[mq->firstIndex]; + } + + (void)OS_RestoreInterrupts(enabled); + return TRUE; +} diff --git a/sub/lib/src/OS_mutex.c b/sub/lib/src/OS_mutex.c new file mode 100644 index 00000000..a162b84e --- /dev/null +++ b/sub/lib/src/OS_mutex.c @@ -0,0 +1,94 @@ +#include +#include +#include + +void OS_InitMutex(OSMutex* mutex) { + OS_InitThreadQueue(&mutex->queue); + mutex->thread = NULL; + mutex->count = 0; +} + +void OS_LockMutex(OSMutex* mutex) { + OSIntrMode mode; + OSThread* current; + + mode = OS_DisableInterrupts(); + current = OS_GetCurrentThread(); + while (1) { + OSThread* owner = mutex->thread; + if (owner == NULL) { + mutex->thread = current; + mutex->count++; + OSi_EnqueueTail(current, mutex); + break; + } + else if (owner == current) { + mutex->count++; + break; + } + else { + current->mutex = mutex; + OS_SleepThread(&mutex->queue); + current->mutex = NULL; + } + } + (void)OS_RestoreInterrupts(mode); +} + +void OS_UnlockMutex(OSMutex* mutex) { + OSIntrMode mode; + OSThread* current; + + mode = OS_DisableInterrupts(); + current = OS_GetCurrentThread(); + if (mutex->thread == current) { + if (--mutex->count == 0) { + OSi_DequeueItem(current, mutex); + mutex->thread = NULL; + OS_WakeupThread(&mutex->queue); + } + } + (void)OS_RestoreInterrupts(mode); +} + +void OSi_UnlockAllMutex(OSThread * thread) { + OSMutex * mutex; + while (thread->mutexQueue.head) { + mutex = OSi_RemoveMutexLinkFromQueue(&thread->mutexQueue); + mutex->count = 0; + mutex->thread = NULL; + OS_WakeupThread(&mutex->queue); + } +} + +void OSi_EnqueueTail(OSThread * thread, OSMutex * mutex) { + OSMutex * tail = thread->mutexQueue.tail; + if (tail == NULL) { + thread->mutexQueue.head = mutex; + } + else { + tail->link.next = mutex; + } + mutex->link.prev = tail; + mutex->link.next = NULL; + thread->mutexQueue.tail = mutex; +} + +void OSi_DequeueItem(OSThread * thread, OSMutex * mutex) { + OSMutex *next = mutex->link.next; + OSMutex *prev = mutex->link.prev; + + if (next == NULL) { + thread->mutexQueue.tail = prev; + } + else { + next->link.prev = prev; + } + + if (prev == NULL) { + thread->mutexQueue.head = next; + } + else { + prev->link.next = next; + } +} diff --git a/sub/lib/src/OS_reset.c b/sub/lib/src/OS_reset.c new file mode 100644 index 00000000..44cd7771 --- /dev/null +++ b/sub/lib/src/OS_reset.c @@ -0,0 +1,293 @@ +#include + +extern void SDK_IRQ_STACKSIZE(void); + +#define OSi_HW_DTCM SDK_AUTOLOAD_DTCM_START +#define RESET_HW_DTCM_IRQ_STACK_END SDK_AUTOLOAD_DTCM_START + 0x00003fc0 - HW_SVC_STACK_SIZE + +#ifdef SDK_ARM9 +static vu16 OSi_IsResetOccurred = FALSE; +static u16 OSi_IsInitReset = FALSE; +#else +static u16 OSi_IsInitReset = FALSE; +static vu16 OSi_IsResetOccurred = FALSE; +#endif + +u32 OSi_CpuClear32(u32 value, void *ptr, u32 size); +void OSi_ReadCardRom32(u32 src, void *dst, int len); + +void OSi_DoResetSystem(void); +void OSi_ReloadRomData(void); +void OSi_DoBoot(void); + +void OS_InitReset(void) { + if (OSi_IsInitReset) { + return; + } + OSi_IsInitReset = TRUE; +#ifdef SDK_ARM9 + PXI_Init(); + while (!PXI_IsCallbackReady(PXI_FIFO_TAG_OS, PXI_PROC_ARM7)) {} +#endif //SDK_ARM9 + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_OS, OSi_CommonCallback); +} + +BOOL OS_IsResetOccurred(void) { + return OSi_IsResetOccurred; +} + +void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err) { +#pragma unused(tag) +#pragma unused(err) + u16 command; + u16 commandArg; + + command = (u16)((data & OS_PXI_COMMAND_MASK) >> OS_PXI_COMMAND_SHIFT); + commandArg = (u16)((data & OS_PXI_DATA_MASK) >> OS_PXI_DATA_SHIFT); + if (command == OS_PXI_COMMAND_RESET) { + OSi_IsResetOccurred = TRUE; + } else { + OS_Panic(""); + } +} + +void OSi_SendToPxi(u16 data) { + u32 pxi_send_data; + + pxi_send_data = (u32)(data) << OS_PXI_COMMAND_SHIFT; + while (PXI_SendWordByFifo(PXI_FIFO_TAG_OS, pxi_send_data, FALSE) != PXI_FIFO_SUCCESS) {} +} + +#ifdef SDK_ARM9 +void OS_ResetSystem(u32 parameter) { + u16 lockId; + + if (MB_IsMultiBootChild()) { + OS_Panic(""); + } + + lockId = OS_GetLockID(); + CARD_LockRom(lockId); + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + OS_SetIrqMask(OS_IE_SPFIFO_RECV); + OS_ResetRequestIrqMask(~OS_IE_SPFIFO_RECV); + *(vu32 *)HW_RESET_PARAMETER_BUF = parameter; + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + asm { + ldr r0, =RESET_HW_DTCM_IRQ_STACK_END + ldr r1, =SDK_IRQ_STACKSIZE + sub r0, r0, r1 + mov sp, r0 + bl OSi_DoResetSystem // noreturn + } +} + +#include +void OSi_DoResetSystem(void) { + while (!OSi_IsResetOccurred) {} + reg_OS_IME = 0; + OSi_ReloadRomData(); + OSi_DoBoot(); // noreturn +} + +asm void OSi_DoBoot(void) { + mov r12, #HW_REG_BASE + str r12, [r12, #REG_IME_OFFSET] + ldr r1, =OSi_HW_DTCM + add r1, r1, #0x3FC0 + add r1, r1, #HW_DTCM_SYSRV_OFS_INTR_VECTOR + mov r0, #0 + str r0, [r1] + ldr r1, =REG_SUBINTF_ADDR + @waitSubIntf: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + bne @waitSubIntf + mov r0, #0x0100 + strh r0, [r1] + mov r0, #0 + ldr r3, =HW_EXCP_VECTOR_MAIN + ldr r4, [r3] + ldr r1, =HW_BIOS_EXCP_STACK_MAIN + mov r2, #0x80 + bl OSi_CpuClear32 + str r4, [r3] + ldr r1, =HW_PXI_SIGNAL_PARAM_ARM9 + mov r2, #0x18 + bl OSi_CpuClear32 + ldr r1, =HW_WM_RSSI_POOL + strh r0, [r1] + ldr r1, =HW_COMPONENT_PARAM + mov r2, #0x64 + bl OSi_CpuClear32 + ldr r1, =REG_SUBINTF_ADDR + @waitSubIntf2: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + beq @waitSubIntf2 + mov r0, #0x0000 + strh r0, [r1] + ldr r3, =HW_ROM_HEADER_BUF + ldr r12, [r3, #0x24] // ARM9 entry + mov lr, r12 + ldr r11, =HW_PXI_SIGNAL_PARAM_ARM9 + ldmia r11, {r0-r10} + mov r11, #0 + bx r12 +} + +asm u32 OSi_CpuClear32(register u32 value, register void * startAddr, register u32 size) { + add r12, r1, r2 + @loop: + cmp r1, r12 + stmltia r1!, {r0} + blt @loop + bx lr +} + +void OSi_ReloadRomData(void) { + u32 p = (u32)HW_ROM_HEADER_BUF; + const u32 rom_base = *(u32 *)HW_ROM_BASE_OFFSET_BUF; + if (rom_base >= 0x8000) { + OSi_ReadCardRom32(rom_base, (void *)p, 0x160); + } + u32 src_arm9 = *(u32 *)(p + 0x20); + u32 dst_arm9 = *(u32 *)(p + 0x28); + u32 len_arm9 = *(u32 *)(p + 0x2C); + u32 src_arm7 = *(u32 *)(p + 0x30); + u32 dst_arm7 = *(u32 *)(p + 0x38); + u32 len_arm7 = *(u32 *)(p + 0x3C); + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + DC_StoreAll(); + DC_InvalidateAll(); + OS_RestoreInterrupts(bak_cpsr); + IC_InvalidateAll(); + DC_WaitWriteBufferEmpty(); + src_arm9 += rom_base; + src_arm7 += rom_base; + if (src_arm9 < 0x8000) { + u32 diff = 0x8000 - src_arm9; + src_arm9 = 0x8000; + dst_arm9 += diff; + len_arm9 -= diff; + } + OSi_ReadCardRom32(src_arm9, (void *)dst_arm9, len_arm9); + OSi_ReadCardRom32(src_arm7, (void *)dst_arm7, len_arm7); +} + +#undef reg_CARD_MASTERCNT +#undef reg_CARD_CMD +#undef reg_CARD_CNT +#undef reg_CARD_DATA + +void OSi_ReadCardRom32(u32 src, void *dst, int len) { + vu8 *reg_CARD_MASTERCNT = (vu8 *)(HW_REG_BASE + 0x1a1); + vu8 *reg_CARD_CMD = (vu8 *)(HW_REG_BASE + 0x1a8); + vu32 *reg_CARD_CNT = (vu32 *)(HW_REG_BASE + 0x1a4); + vu32 *reg_CARD_DATA = (vu32 *)(HW_REG_BASE + 0x100010); + vu32 *hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60); + + enum { + CARD_MASTER_SELECT_ROM = 0x00, + CARD_MASTER_ENABLE = 0x80, + CARD_CMD_READ_PAGE = 0xb7, + CARD_CTRL_CMD_MASK = 0x07000000, + CARD_CTRL_CMD_PAGE = 0x01000000, + CARD_CTRL_READ = 0x00000000, + CARD_CTRL_RESET_HI = 0x20000000, + CARD_CTRL_START = 0x80000000, + CARD_CTRL_READY = 0x00800000, + CARD_ENUM_END + }; + + const u32 ctrl_start = ((*hdr_GAME_BUF & ~CARD_CTRL_CMD_MASK) | (CARD_CTRL_CMD_PAGE | CARD_CTRL_READ | CARD_CTRL_START | CARD_CTRL_RESET_HI)); + int pos = -(src & 0x1FF); + while ((*reg_CARD_CNT & CARD_CTRL_START) != 0) {} + *reg_CARD_MASTERCNT = (u32)(CARD_MASTER_SELECT_ROM | CARD_MASTER_ENABLE); + for (src += pos; pos < len; src += 512) + { + //---- setting for command of one page reading + reg_CARD_CMD[0] = CARD_CMD_READ_PAGE; + reg_CARD_CMD[1] = src >> 24; + reg_CARD_CMD[2] = src >> 16; + reg_CARD_CMD[3] = src >> 8; + reg_CARD_CMD[4] = src >> 0; + reg_CARD_CMD[5] = 0; + reg_CARD_CMD[6] = 0; + reg_CARD_CMD[7] = 0; + *reg_CARD_CNT = ctrl_start; + for (;;) + { + u32 ctrl = *reg_CARD_CNT; + if ((ctrl & CARD_CTRL_READY) != 0) { + const u32 data = *reg_CARD_DATA; + if ((pos >= 0) && (pos < len)) { + *(u32 *)(dst + pos) = data; + } + pos += sizeof(u32); + } + if (!(ctrl & CARD_CTRL_START)) { + break; + } + } + } +} + +#include + +#else +void OS_ResetSystem(void) { + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + OS_SetIrqMask(OS_IE_FIFO_RECV); + OS_ResetRequestIrqMask(0xFFFFFFFF); + SND_Shutdown(); + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + OSi_DoResetSystem(); +} + +void OSi_DoResetSystem(void) { + reg_OS_IME = 0; + OSi_DoBoot(); +} + +#include +asm void OSi_DoBoot(void) { + mov r12, #HW_REG_BASE + str r12, [r12, #REG_IME_OFFSET] + ldr r1, =HW_INTR_VECTOR_BUF + mov r0, #0 + str r0, [r1] + ldr r1, =REG_MAINPINTF_ADDR + mov r0, #0x100 + strh r0, [r1] +@waitMainpIntf: + ldrh r0, [r1] + and r0, r0, #0x000F + cmp r0, #0x0001 + bne @waitMainpIntf + ldr r1, =REG_MAINPINTF_ADDR + mov r0, #0 + strh r0, [r1] +@waitMainpIntf2: + ldrh r0, [r1] + cmp r0, #0x0001 + beq @waitMainpIntf2 + ldr r3, =HW_ROM_HEADER_BUF + ldr r12, [r3, #0x34] // ARM7 entry + mov lr, r12 + mov r0, #0 + mov r1, #0 + mov r2, #0 + mov r3, #0 + bx r12 +} +#include +#endif diff --git a/sub/lib/src/OS_spinLock.c b/sub/lib/src/OS_spinLock.c new file mode 100644 index 00000000..c91b0d86 --- /dev/null +++ b/sub/lib/src/OS_spinLock.c @@ -0,0 +1,262 @@ +#include + +#define OSi_LOCKID_INITIAL_FLAG_0 0xffffffff +#define OSi_LOCKID_INITIAL_FLAG_1 0xffff0000 + +#ifdef SDK_ARM9 +#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_MAIN +#define OSi_ANYP_LOCK_ID_START OS_MAINP_LOCK_ID_START +#else +#define OSi_ANYP_LOCK_ID_FLAG HW_LOCK_ID_FLAG_SUB +#define OSi_ANYP_LOCK_ID_START OS_SUBP_LOCK_ID_START +#endif + +void OSi_AllocateCartridgeBus(void); +void OSi_FreeCartridgeBus(void); +void OSi_AllocateCardBus(void); +void OSi_FreeCardBus(void); + +// FIXME: This looks like it's meant to be a linker-inserted veneer, but I can't get it to insert properly yet +#ifdef SDK_ARM9 +static inline void OSi_WaitByLoop(void) { + SVC_WaitByLoop(0x1000 / 4); +} +#else +void VENEER_SVC_WaitByLoop(s32 count); +static inline void OSi_WaitByLoop(void) { + VENEER_SVC_WaitByLoop(0x1000 / 4); +} +#endif + +void OS_InitLock(void) { + static BOOL isInitialized = FALSE; + OSLockWord *lockp; + + if (isInitialized) + return; + + isInitialized = TRUE; + lockp = (OSLockWord *)HW_INIT_LOCK_BUF; + +#ifdef SDK_ARM9 + lockp->lockFlag = 0; + OS_LockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL); + while (lockp->extension != 0) { + OSi_WaitByLoop(); + } + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0; + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1; + MI_CpuClear32((void *)HW_SHARED_LOCK_BUF, HW_CTRDG_LOCK_BUF - HW_SHARED_LOCK_BUF); + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); + OS_UnlockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL); + OS_LockByWord(OS_MAINP_SYSTEM_LOCK_ID, lockp, NULL); +#else + lockp->extension = 0; + while (lockp->ownerID != OS_MAINP_SYSTEM_LOCK_ID) { + OSi_WaitByLoop(); + } + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[0] = OSi_LOCKID_INITIAL_FLAG_0; + ((u32 *)OSi_ANYP_LOCK_ID_FLAG)[1] = OSi_LOCKID_INITIAL_FLAG_1; + lockp->extension = OS_SUBP_SYSTEM_LOCK_ID; +#endif +} + +#ifdef SDK_ARM7 +asm void VENEER_SVC_WaitByLoop(register s32 count) { + ldr ip, =SVC_WaitByLoop + bx ip +} +#endif + +#ifdef SDK_ARM7 +static inline +#endif //SDK_ARM7 +s32 OSi_DoLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + s32 lastLockFlag; + + while ((lastLockFlag = OSi_DoTryLockByWord(lockID, lockp, ctrlFuncp, disableFiq)) > 0) { + OSi_WaitByLoop(); + } + return lastLockFlag; +} + +s32 OS_LockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void)) { + return OSi_DoLockByWord(lockID, lockp, ctrlFuncp, FALSE); +} + +s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + if (lockID != lockp->ownerID) { + return -2; + } + OSIntrMode ime = disableFiq ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lockp->ownerID = 0; + if (ctrlFuncp != NULL) { + ctrlFuncp(); + } + lockp->lockFlag = 0; + if (disableFiq) { + OS_RestoreInterrupts_IrqAndFiq(ime); + } else { + OS_RestoreInterrupts(ime); + } + return 0; +} + +s32 OS_UnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void)) { + return OSi_DoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE); +} + +s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)(void), BOOL disableFiq) { + s32 lastLockFlag; + OSIntrMode ime; + + ime = disableFiq ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lastLockFlag = MI_SwapWord(lockID, &lockp->lockFlag); + if (lastLockFlag == 0) { + if (ctrlFuncp != NULL) { + ctrlFuncp(); + } + lockp->ownerID = lockID; + } + if (disableFiq) { + OS_RestoreInterrupts_IrqAndFiq(ime); + } else { + OS_RestoreInterrupts(ime); + } + return lastLockFlag; +} + +s32 OS_LockCartridge(u16 lockID) { + return OSi_DoLockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +s32 OS_UnlockCartridge(u16 lockID) { + return OSi_DoUnlockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_FreeCartridgeBus, TRUE); +} + +// For backwards compatibility. +// Nintendo decided they didn't want to use a define here, +// so they made an asm func instead +asm s32 OS_UnLockCartridge(u16 lockID) { + ldr r1, =OS_UnlockCartridge + bx r1 +} + +s32 OS_TryLockCartridge(u16 lockID) { + return OSi_DoTryLockByWord(lockID, (OSLockWord*)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +void OSi_AllocateCartridgeBus(void) { +#ifdef SDK_ARM9 + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9); +#endif +} + +void OSi_FreeCartridgeBus(void) { +#ifdef SDK_ARM9 + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); +#endif +} + +s32 OS_LockCard(u16 lockID) { + return OS_LockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_AllocateCardBus); +} + +s32 OS_UnlockCard(u16 lockID) { + return OS_UnlockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_FreeCardBus); +} + +// For backwards compatibility. +// Nintendo decided they didn't want to use a define here, +// so they made an asm func instead +asm s32 OS_UnLockCard(u16 lockID) { + ldr r1, =OS_UnlockCard + bx r1 +} + +BOOL OS_TryLockCard(u16 lockID) { + return OSi_DoTryLockByWord(lockID, (OSLockWord*)HW_CARD_LOCK_BUF, OSi_AllocateCardBus, FALSE); +} + +void OSi_AllocateCardBus(void) { +#ifdef SDK_ARM9 + MIi_SetCardProcessor(MI_PROCESSOR_ARM9); +#endif +} + +void OSi_FreeCardBus(void) { +#ifdef SDK_ARM9 + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); +#endif +} + +u16 OS_ReadOwnerOfLockWord(OSLockWord *lockp) { + return lockp->ownerID; +} + +asm s32 OS_GetLockID(void) { + ldr r3, =OSi_ANYP_LOCK_ID_FLAG; + ldr r1, [r3] +#ifdef SDK_ARM9 + clz r2, r1 +#else //SDK_ARM7 + mov r2, #0 + mov r0, #0x80000000 +_lp1: + tst r1, r0 + bne _ex1 + add r2, r2, #1 + cmp r2, #32 + beq _ex1 + mov r0, r0, lsr #1 + b _lp1 +_ex1: +#endif //SDK_ARM9 + cmp r2, #32 + movne r0, #OSi_ANYP_LOCK_ID_START + bne @movne + add r3, r3, #4 + ldr r1, [r3] +#ifdef SDK_ARM9 + clz r2, r1 +#else //SDK_ARM7 + mov r2, #0 + mov r0, #0x80000000 +_lp2: + tst r1, r0 + bne _ex2 + add r2, r2, #1 + cmp r2, #32 + beq _ex2 + mov r0, r0, lsr #1 + b _lp2 +_ex2: +#endif //SDK_ARM9 + cmp r2, #32 + ldr r0, =-3 + bxeq lr + mov r0, #OSi_ANYP_LOCK_ID_START + 32 +@movne: + add r0, r0, r2 + mov r1, #0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3] + bic r2, r2, r1 + str r2, [r3] + bx lr +} + +asm void OS_ReleaseLockID(register u16 lockID) { + ldr r3, =OSi_ANYP_LOCK_ID_FLAG + cmp r0, #OSi_ANYP_LOCK_ID_START + 32 + addpl r3, r3, #4 + subpl r0, r0, #OSi_ANYP_LOCK_ID_START + 32 + submi r0, r0, #OSi_ANYP_LOCK_ID_START + mov r1, #0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3] + orr r2, r2, r1 + str r2, [r3] + bx lr +} diff --git a/sub/lib/src/OS_system.c b/sub/lib/src/OS_system.c new file mode 100644 index 00000000..b15f1145 --- /dev/null +++ b/sub/lib/src/OS_system.c @@ -0,0 +1,75 @@ +#include + +asm OSIntrMode OS_EnableInterrupts(void) { + mrs r0, cpsr + bic r1, r0, #HW_PSR_IRQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_DisableInterrupts(void) { + mrs r0, cpsr + orr r1, r0, #HW_PSR_IRQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_RestoreInterrupts(register OSIntrMode prev) { + mrs r1, cpsr + bic r2, r1, #HW_PSR_IRQ_DISABLE + orr r2, r2, r0 + msr cpsr_c, r2 + and r0, r1, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSIntrMode OS_DisableInterrupts_IrqAndFiq(void) { + mrs r0, cpsr + orr r1, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + bx lr +} + +asm OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode prev) { + mrs r1, cpsr + bic r2, r1, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + orr r2, r2, r0 + msr cpsr_c, r2 + and r0, r1, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + bx lr +} + +asm OSIntrMode_Irq OS_GetCpsrIrq(void) { + mrs r0, cpsr + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr +} + +asm OSProcMode OS_GetProcMode(void) { + mrs r0, cpsr + and r0, r0, #HW_PSR_CPU_MODE_MASK + bx lr +} + +#ifdef SDK_ARM9 +#include +asm void OS_SpinWait(register u32 cycles) { +@loop: + subs r0, r0, #4 + bhs @loop + bx lr +} +#include +#else +void OS_SpinWait(u32 cycles) { + SVC_WaitByLoop((s32)cycles / 4); +} +#endif + +void OS_WaitVBlankIntr(void) { + SVC_WaitByLoop(1); + OS_WaitIrq(TRUE, OS_IE_VBLANK); +} diff --git a/sub/lib/src/OS_terminate_proc.c b/sub/lib/src/OS_terminate_proc.c new file mode 100644 index 00000000..d84dbb95 --- /dev/null +++ b/sub/lib/src/OS_terminate_proc.c @@ -0,0 +1,19 @@ +#include + +void OS_Terminate(void) { +#ifdef SDK_ARM7 + CTRDG_VibPulseEdgeUpdate(0); +#endif + while (1) { + OS_DisableInterrupts(); + OS_Halt(); + } +} + +#ifdef SDK_ARM9 +asm void OS_Halt(void) { + mov r0, #0 + mcr p15, 0, r0, c7, c0, 4 + bx lr +} +#endif diff --git a/sub/lib/src/OS_thread.c b/sub/lib/src/OS_thread.c new file mode 100644 index 00000000..42cb4a74 --- /dev/null +++ b/sub/lib/src/OS_thread.c @@ -0,0 +1,610 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern void SDK_SYS_STACKSIZE(void); +extern void SDK_IRQ_STACKSIZE(void); + +OSThread OSi_LauncherThread; +OSThread OSi_IdleThread; +OSThreadInfo OSi_ThreadInfo; +OSThread **OSi_CurrentThreadPtr; +void *OSi_SystemCallbackInSwitchThread = NULL; +u32 OSi_RescheduleCount = 0; +static int OSi_ThreadIdCount = 0; +void *OSi_StackForDestructor = NULL; +static u32 exitThreadStatus = 0; +static u32 killThreadStatus = 0; +static u32 OSi_SystemStackBuffer = 0; +BOOL OSi_IsThreadInitialized = FALSE; + + +static s32 OSi_GetUnusedThreadId(void); +//static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread); +//static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue); +//static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread); +static void OSi_InsertThreadToList(OSThread *thread); +//static void OSi_RemoveThreadFromList(OSThread *thread); +static void OSi_RescheduleThread(void); +void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg); +static void OSi_ExitThread(void *arg); +void OSi_ExitThread_Destroy(void); +static void OSi_SleepAlarmCallback(void *arg); + +#pragma warn_no_side_effect off +static inline s32 OSi_GetUnusedThreadId(void) +{ + OSi_SystemStackBuffer; + killThreadStatus; + exitThreadStatus; + return ++OSi_ThreadIdCount; +} +#pragma warn_no_side_effect on + +static inline void OS_RescheduleThread(void) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + OSi_RescheduleThread(); + (void)OS_RestoreInterrupts(enabled); +} + +inline void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor) +{ + thread->destructor = dtor; +} + +void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread) +{ + OSThread *next = queue->head; + + while (next && next->priority <= thread->priority) + { + if (next == thread) + return; + next = next->link.next; + } + + if (!next) + { + OSThread *prev = queue->tail; + + if (!prev) + { + queue->head = thread; + } + else + { + prev->link.next = thread; + } + + thread->link.prev = prev; + thread->link.next = NULL; + queue->tail = thread; + } + else + { + OSThread *prev = next->link.prev; + + if (!prev) + { + queue->head = thread; + } + else + { + prev->link.next = thread; + } + + thread->link.prev = prev; + thread->link.next = next; + next->link.prev = thread; + } +} + +static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue) +{ + OSThread *thread = queue->head; + + if (thread) + { + OSThread *next = thread->link.next; + + queue->head = next; + + if (next) + { + next->link.prev = NULL; + } + else + { + queue->tail = NULL; + thread->queue = NULL; + } + } + + return thread; +} + +OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread) +{ + OSThread *queueHead = queue->head; + + while (queueHead) + { + OSThread *next = queueHead->link.next; + + if (queueHead == thread) + { + OSThread *prev = queueHead->link.prev; + + if (queue->head == queueHead) + { + queue->head = next; + } + else + { + prev->link.next = next; + } + + if (queue->tail == queueHead) + { + queue->tail = prev; + } + else + { + next->link.prev = prev; + } + + break; + } + + queueHead = next; + } + + return queueHead; +} + +OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue) +{ + OSMutex *mutexHead = queue->head; + + if (mutexHead) + { + OSMutex *next = mutexHead->link.next; + + queue->head = next; + + if (next) + { + next->link.prev = NULL; + } + else + { + queue->tail = NULL; + } + } + + return mutexHead; +} + +static void OSi_InsertThreadToList(OSThread *thread) +{ + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + + while(t && t->priority < thread->priority) + { + pre = t; + t = t->next; + } + + if (!pre) + { + thread->next = OSi_ThreadInfo.list; + OSi_ThreadInfo.list = thread; + } + else + { + thread->next = pre->next; + pre->next = thread; + } +} + +void OSi_RemoveThreadFromList(OSThread *thread) +{ + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + + while (t && t != thread) + { + pre = t; + t = t-> next; + } + + if (!pre) + { + OSi_ThreadInfo.list = thread->next; + } + else + { + pre->next = thread->next; + } +} + +static void OSi_RescheduleThread(void) +{ + if (OSi_RescheduleCount <= 0) + { + OSThreadInfo *info = &OSi_ThreadInfo; + if (info->irqDepth > 0 || OS_GetProcMode() == OS_PROCMODE_IRQ) + { + info->isNeedRescheduling = TRUE; + } + else + { + OSThread *currentThread = OSi_GetCurrentThread(); + OSThread *nextThread = OS_SelectThread(); + + if (currentThread == nextThread || !nextThread) + return; + + if (currentThread->state != OS_THREAD_STATE_TERMINATED + && OS_SaveContext(¤tThread->context)) + return; + + if (OSi_SystemCallbackInSwitchThread) + { + ((OSSwitchThreadCallback)OSi_SystemCallbackInSwitchThread) (currentThread, nextThread); + } + + if (info->switchCallback) + { + ((OSSwitchThreadCallback)info->switchCallback) (currentThread, nextThread); + } + + OS_SetCurrentThread(nextThread); + + OS_LoadContext(&nextThread->context); + } + } +} + +void OS_InitThread(void) +{ + if (OSi_IsThreadInitialized) + return; + OSi_IsThreadInitialized = TRUE; + + OSi_CurrentThreadPtr = &(OSi_ThreadInfo.current); + + OSi_LauncherThread.priority = OS_THREAD_LAUNCHER_PRIORITY; + OSi_LauncherThread.id = 0; + OSi_LauncherThread.state = OS_THREAD_STATE_READY; + OSi_LauncherThread.next = NULL; + + OSi_LauncherThread.profiler = NULL; + + OSi_ThreadInfo.list = &OSi_LauncherThread; + + OS_SetCurrentThread(&OSi_LauncherThread); + + void *stackLo = (((s32)SDK_SYS_STACKSIZE) <= 0) ? + (void *)((u32)HW_WRAM - (s32)SDK_SYS_STACKSIZE) : + (void *)((u32)(HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE) - (s32)SDK_SYS_STACKSIZE); + + OSi_LauncherThread.stackBottom = (u32)(HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE); + OSi_LauncherThread.stackTop = (u32)stackLo; + OSi_LauncherThread.stackWarningOffset = 0; + + //checksums + *(u32 *)(OSi_LauncherThread.stackBottom - sizeof(u32)) = 0xd73bfdf7UL; + *(u32 *)OSi_LauncherThread.stackTop = 0xfbdd37bbUL; + + OS_InitThreadQueue(&OSi_LauncherThread.joinQueue); + + OSi_ThreadInfo.isNeedRescheduling = FALSE; + OSi_ThreadInfo.irqDepth = 0; + + OS_GetSystemWork()->threadinfo_subp = &OSi_ThreadInfo; + + (void)OS_SetSwitchThreadCallback(NULL); +} + +void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio) +{ + OSIntrMode enable = OS_DisableInterrupts(); + + s32 index = OSi_GetUnusedThreadId(); + + thread->priority = prio; + thread->id = (u32)index; + thread->state = OS_THREAD_STATE_WAITING; + + thread->profiler = NULL; + + OSi_InsertThreadToList(thread); + + thread->stackBottom = (u32)stack; + thread->stackTop = (u32)stack - stackSize; + thread->stackWarningOffset = 0; + + *(u32 *)(thread->stackBottom - sizeof(u32)) = 0xd73bfdf7UL; + *(u32 *)thread->stackTop = 0xfbdd37bbUL; + + OS_InitThreadQueue(&thread->joinQueue); + + OS_InitContext(&thread->context, (u32)func, (u32)stack - 4); + + thread->context.r[0] = (u32)arg; + thread->context.lr = (u32)OS_ExitThread; + + MI_CpuClear32((void *)((u32)stack - stackSize + 4), stackSize - 8); + + thread->mutex = NULL; + thread->mutexQueue.head = NULL; + thread->mutexQueue.tail = NULL; + + OS_SetThreadDestructor(thread, NULL); + + thread->queue = NULL; + thread->link.prev = thread->link.next = NULL; + + MI_CpuClear32(&thread->specific[0], sizeof(void *) * OS_THREAD_SPECIFIC_MAX); + + thread->alarmForSleep = NULL; + + (void)OS_RestoreInterrupts(enable); +} + +void OS_ExitThread(void) +{ + (void)OS_DisableInterrupts(); + OSi_ExitThread_ArgSpecified(OS_GetCurrentThread(), 0); +} + +void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg) +{ + if (OSi_StackForDestructor) + { + OS_InitContext(&thread->context, (u32)OSi_ExitThread, (u32)OSi_StackForDestructor); + thread->context.r[0] = (u32)arg; + thread->context.cpsr |= HW_PSR_DISABLE_IRQ; + thread->state = OS_THREAD_STATE_READY; + OS_LoadContext(&thread->context); + } + else + { + OSi_ExitThread(arg); + } +} + +static void OSi_ExitThread(void *arg) +{ + OSThread *currentThread = OSi_GetCurrentThread(); + OSThreadDestructor destructor = currentThread->destructor; + + if (destructor) + { + currentThread->destructor = NULL; + destructor(arg); + (void)OS_DisableInterrupts(); + } + + OSi_ExitThread_Destroy(); +} + +void OSi_ExitThread_Destroy(void) +{ + OSThread *currentThread = OSi_GetCurrentThread(); + (void)OS_DisableScheduler(); + + OSi_UnlockAllMutex(currentThread); + + if (currentThread->queue) + { + (void)OSi_RemoveSpecifiedLinkFromQueue(currentThread->queue, currentThread); + } + + OSi_RemoveThreadFromList(currentThread); + + currentThread->state = OS_THREAD_STATE_TERMINATED; + + OS_WakeupThread(¤tThread->joinQueue); + + (void)OS_EnableScheduler(); + + OS_RescheduleThread(); + + OS_Terminate(); +} + +void OS_JoinThread(OSThread *thread) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + if (thread->state != OS_THREAD_STATE_TERMINATED) + { + OS_SleepThread(&thread->joinQueue); + } + + (void)OS_RestoreInterrupts(enabled); +} + +BOOL OS_IsThreadTerminated(const OSThread *thread) +{ + return (thread->state == OS_THREAD_STATE_TERMINATED) ? TRUE : FALSE; +} + +void OS_SleepThread(OSThreadQueue *queue) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + OSThread *currentThread = OSi_GetCurrentThread(); + + if (queue) + { + currentThread->queue = queue; + OSi_InsertLinkToQueue(queue, currentThread); + } + + currentThread->state = OS_THREAD_STATE_WAITING; + OSi_RescheduleThread(); + + (void)OS_RestoreInterrupts(enabled); +} + +void OS_WakeupThread(OSThreadQueue *queue) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + if (queue->head) + { + while (queue->head) + { + OSThread *thread = OSi_RemoveLinkFromQueue(queue); + + thread->state = OS_THREAD_STATE_READY; + thread->queue = NULL; + thread->link.prev = thread->link.next = NULL; + } + + OS_InitThreadQueue(queue); + OSi_RescheduleThread(); + } + + (void)OS_RestoreInterrupts(enabled); +} + +void OS_WakeupThreadDirect(OSThread *thread) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + thread->state = OS_THREAD_STATE_READY; + OSi_RescheduleThread(); + + (void)OS_RestoreInterrupts(enabled); +} + +OSThread *OS_SelectThread(void) +{ + OSThread *thread = OSi_ThreadInfo.list; + + while (thread && !OS_IsThreadRunnable(thread)) + { + thread = thread->next; + } + + return thread; +} + +BOOL OS_SetThreadPriority(OSThread *thread, u32 prio) +{ + OSThread *t = OSi_ThreadInfo.list; + OSThread *pre = NULL; + OSIntrMode enabled = OS_DisableInterrupts(); + + while (t && t != thread) + { + pre = t; + t = t->next; + } + + if (!t || t == &OSi_IdleThread) + { + (void)OS_RestoreInterrupts(enabled); + return FALSE; + } + + if (t->priority != prio) + { + if (!pre) + { + OSi_ThreadInfo.list = thread->next; + } + else + { + pre->next = thread->next; + } + + thread->priority = prio; + OSi_InsertThreadToList(thread); + + OSi_RescheduleThread(); + } + + (void)OS_RestoreInterrupts(enabled); + + return TRUE; +} + +void OS_Sleep(u32 msec) +{ + OSAlarm alarm; + + OS_CreateAlarm(&alarm); + OSThread *volatile p_thread = OSi_GetCurrentThread(); + OSIntrMode enabled = OS_DisableInterrupts(); + + p_thread->alarmForSleep = &alarm; + + OS_SetAlarm(&alarm, OS_MilliSecondsToTicks(msec), &OSi_SleepAlarmCallback, + (void*)&p_thread); + while (p_thread != NULL) + { + OS_SleepThread(NULL); + } + (void)OS_RestoreInterrupts(enabled); +} + +static void OSi_SleepAlarmCallback(void *arg) +{ + OSThread **pp_thread = (OSThread **)arg; + OSThread *p_thread = *pp_thread; + *pp_thread = NULL; + + p_thread->alarmForSleep = NULL; + + OS_WakeupThreadDirect(p_thread); +} + +OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + OSSwitchThreadCallback prev = OSi_ThreadInfo.switchCallback; + OSi_ThreadInfo.switchCallback = callback; + + (void)OS_RestoreInterrupts(enabled); + return prev; +} + +u32 OS_DisableScheduler(void) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + u32 count; + + if (OSi_RescheduleCount < (u32)-1) + { + count = OSi_RescheduleCount++; + } + (void)OS_RestoreInterrupts(enabled); + + return count; +} + +u32 OS_EnableScheduler(void) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + u32 count = 0; + + if (OSi_RescheduleCount > 0) + { + count = OSi_RescheduleCount--; + } + (void)OS_RestoreInterrupts(enabled); + + return count; +} diff --git a/sub/lib/src/OS_tick.c b/sub/lib/src/OS_tick.c new file mode 100644 index 00000000..08f3146e --- /dev/null +++ b/sub/lib/src/OS_tick.c @@ -0,0 +1,71 @@ +#include + +static u16 OSi_UseTick = FALSE; +vu64 OSi_TickCounter; +BOOL OSi_NeedResetTimer = FALSE; + +#define OSi_TICK_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) +#define OSi_TICK_TIMER OS_TIMER_0 +#define OSi_TICK_IE_TIMER OS_IE_TIMER0 + +void OSi_CountUpTick(void); + +void OS_InitTick(void) { + if (OSi_UseTick) { + return; + } + OSi_UseTick = TRUE; + OSi_SetTimerReserved(OSi_TICK_TIMER); + OSi_TickCounter = 0; + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, 0); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OS_SetIrqFunction(OSi_TICK_IE_TIMER, OSi_CountUpTick); + OS_EnableIrqMask(OSi_TICK_IE_TIMER); + OSi_NeedResetTimer = FALSE; +} + +BOOL OS_IsTickAvailable(void) { + return OSi_UseTick; +} + +void OSi_CountUpTick(void) { + // timer0 interrupt + OSi_TickCounter++; + if (OSi_NeedResetTimer) { + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, 0); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OSi_NeedResetTimer = FALSE; + } + OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))OSi_CountUpTick, NULL); +} + +OSTick OS_GetTick(void) { + vu16 countL; + vu64 countH; + OSIntrMode enabled = OS_DisableInterrupts(); + + countL = *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); + countH = OSi_TickCounter & 0xffffffffffffULL; + if (reg_OS_IF & OSi_TICK_IE_TIMER && !(countL & 0x8000)) { + countH++; + } + OS_RestoreInterrupts(enabled); + return (countH << 16) | countL; +} + +u16 OS_GetTickLo(void) { + return *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); +} + +void OS_SetTick(OSTick tick) { + OSIntrMode enabled = OS_DisableInterrupts(); + reg_OS_IF = OSi_TICK_IE_TIMER; + OSi_NeedResetTimer = TRUE; + OSi_TickCounter = tick >> 16; + OS_SetTimerControl(OSi_TICK_TIMER, 0); + OS_SetTimerCount(OSi_TICK_TIMER, tick & 0xFFFF); + OS_SetTimerControl(OSi_TICK_TIMER, OSi_TICK_TIMERCONTROL); + OS_RestoreInterrupts(enabled); +} diff --git a/sub/lib/src/OS_timer.c b/sub/lib/src/OS_timer.c new file mode 100644 index 00000000..a285545f --- /dev/null +++ b/sub/lib/src/OS_timer.c @@ -0,0 +1,7 @@ +#include + +static u16 OSi_TimerReserved = 0; + +void OSi_SetTimerReserved(s32 timerNum) { + OSi_TimerReserved |= (1 << timerNum); +} diff --git a/sub/lib/src/OS_valarm.c b/sub/lib/src/OS_valarm.c new file mode 100644 index 00000000..855dd312 --- /dev/null +++ b/sub/lib/src/OS_valarm.c @@ -0,0 +1,258 @@ +#include + +#define HW_LCD_LINES (263) + +#define OSi_VHIGHT HW_LCD_LINES + +#define OSi_VALARM_LATER 0 +#define OSi_VALARM_NOW 1 +#define OSi_VALARM_TIMEOUT 2 + +struct OSiVAlarmQueue { + OSVAlarm *head; + OSVAlarm *tail; +} OSi_VAlarmQueue; + +u16 OSi_UseVAlarm = FALSE; +s32 OSi_VFrameCount; +s32 OSi_PreviousVCount; + +static void OSi_SetNextVAlarm(OSVAlarm *alarm); +static void OSi_AppendVAlarm(OSVAlarm *alarm); +static int OSi_CompareVCount(OSVAlarm *alarm, s32 currentVCount, s32 currentVFrame); +static s32 OSi_GetVFrame(s32 vcount); +static void OSi_VAlarmHandler(void); + +void OS_InitVAlarm(void) { + if (!OSi_UseVAlarm) { + OSi_UseVAlarm = TRUE; + OSi_VAlarmQueue.head = NULL; + OSi_VAlarmQueue.tail = NULL; + OS_DisableIrqMask(OS_IE_V_COUNT); + OSi_VFrameCount = 0; + OSi_PreviousVCount = 0; + } +} + +BOOL OS_IsVAlarmAvailable(void) { + return OSi_UseVAlarm; +} + +void OSi_InsertVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev; + OSVAlarm *next; + for (next = OSi_VAlarmQueue.head; next; next = next->next) { + if ((next->frame < alarm->frame) || (next->frame == alarm->frame) && (next->fire <= alarm->fire)) { + continue; + } + prev = next->prev; + alarm->prev = prev; + alarm->next = next; + next->prev = alarm; + if (prev) { + prev->next = alarm; + } else { + OSi_VAlarmQueue.head = alarm; + OSi_SetNextVAlarm(alarm); + } + return; + } + OSi_AppendVAlarm(alarm); +} + +static void OSi_AppendVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev = OSi_VAlarmQueue.tail; + alarm->prev = prev; + alarm->next = NULL; + OSi_VAlarmQueue.tail = alarm; + if (prev) { + prev->next = alarm; + } else { + OSi_VAlarmQueue.head = alarm; + OSi_SetNextVAlarm(alarm); + } +} + +void OSi_DetachVAlarm(OSVAlarm *alarm) { + OSVAlarm *prev; + OSVAlarm *next; + if (alarm == NULL) { + return; + } + prev = alarm->prev; + next = alarm->next; + if (next) { + next->prev = prev; + } else { + OSi_VAlarmQueue.tail = prev; + } + if (prev) { + prev->next = next; + } else { + OSi_VAlarmQueue.head = next; + } +} + +void OS_CreateVAlarm(OSVAlarm *alarm) { + alarm->handler = NULL; + alarm->tag = 0; + alarm->finish = FALSE; +} + +void OS_SetVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg) { + OSIntrMode enabled = OS_DisableInterrupts(); + s32 currentVCount; + s32 currentVFrame; + if (!alarm || alarm->handler) { + OS_Panic(""); + } + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + alarm->period = FALSE; + alarm->fire = count; + alarm->frame = ((count > currentVCount) ? currentVFrame : (currentVFrame + 1)); + alarm->delay = delay; + alarm->handler = handler; + alarm->arg = arg; + alarm->canceled = FALSE; + OSi_InsertVAlarm(alarm); + OS_RestoreInterrupts(enabled); +} + +void OS_SetPeriodicVAlarm(OSVAlarm *alarm, s16 count, s16 delay, OSVAlarmHandler handler, void *arg) { + OSIntrMode enabled = OS_DisableInterrupts(); + s32 currentVCount; + s32 currentVFrame; + if (!alarm || alarm->handler) { + OS_Panic(""); + } + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + alarm->period = TRUE; + alarm->fire = count; + alarm->frame = ((count > currentVCount) ? currentVFrame : (currentVFrame + 1)); + alarm->delay = delay; + alarm->handler = handler; + alarm->arg = arg; + alarm->canceled = FALSE; + OSi_InsertVAlarm(alarm); + OS_RestoreInterrupts(enabled); +} + +__declspec(noinline) +static void OSi_SetNextVAlarm(OSVAlarm *alarm) { + OS_SetIrqFunction(OS_IE_V_COUNT, (void(*)())OSi_VAlarmHandler); + GX_SetVCountEqVal(alarm->fire); + GX_VCountEqIntr(TRUE); + OS_EnableIrqMask(OS_IE_V_COUNT); +} + +void OS_SetVAlarmTag(OSVAlarm *alarm, u32 tag) { + if (tag == 0) { + OS_Panic(""); + } + if (alarm) { + alarm->tag = tag; + } +} + +void OS_CancelVAlarm(OSVAlarm *alarm) { + OSIntrMode enabled = OS_DisableInterrupts(); + alarm->canceled = TRUE; + if (alarm->handler == NULL) { + OS_RestoreInterrupts(enabled); + return; + } + OSi_DetachVAlarm(alarm); + alarm->handler = NULL; + OS_RestoreInterrupts(enabled); +} + +void OS_CancelVAlarms(u32 tag) { + OSIntrMode enabled = OS_DisableInterrupts(); + OSVAlarm *alarm; + OSVAlarm *next; + if (tag == 0) { + OS_Panic(""); + } + for (alarm = OSi_VAlarmQueue.head, next = alarm ? alarm->next : NULL; alarm; alarm = next, next = alarm? alarm->next : NULL) { + if (alarm->tag == tag) { + OS_CancelVAlarm(alarm); + } + } + OS_RestoreInterrupts(enabled); +} + +void OSi_VAlarmHandler(void) { + OSVAlarm *alarm; + OSVAlarmHandler handler; + int check; + s32 currentVCount; + s32 currentVFrame; + + OS_DisableIrqMask(OS_IE_V_COUNT); + GX_VCountEqIntr(FALSE); + OS_SetIrqCheckFlag(OS_IE_V_COUNT); + currentVCount = GX_GetVCountEqVal(); + currentVFrame = OSi_GetVFrame(currentVCount - 1); + + while (NULL != (alarm = OSi_VAlarmQueue.head)) { + currentVCount = GX_GetVCount(); + currentVFrame = OSi_GetVFrame(currentVCount); + check = OSi_CompareVCount(alarm, currentVFrame, currentVCount); + switch (check) { + case OSi_VALARM_LATER: + OSi_SetNextVAlarm(alarm); + if (alarm->fire != GX_GetVCount() || alarm->frame != currentVFrame) { + return; + } + OS_DisableIrqMask(OS_IE_V_COUNT); + GX_VCountEqIntr(FALSE); + OS_ResetRequestIrqMask(OS_IE_V_COUNT); + // fallthrough + case OSi_VALARM_NOW: + handler = alarm->handler; + OSi_DetachVAlarm(alarm); + alarm->handler = NULL; + if (handler) { + (handler)(alarm->arg); + } + if (alarm->period && !alarm->canceled) { + alarm->handler = handler; + alarm->frame = OSi_VFrameCount + 1; + OSi_InsertVAlarm(alarm); + } + break; + case OSi_VALARM_TIMEOUT: + OSi_DetachVAlarm(alarm); + alarm->frame = OSi_VFrameCount + 1; + OSi_InsertVAlarm(alarm); + break; + } + } +} + +static int OSi_CompareVCount(OSVAlarm *alarm, s32 currentVFrame, s32 currentVCount) { + s32 delayVFrame; + s32 delayVCount; + + delayVFrame = currentVFrame - alarm->frame; + delayVCount = currentVCount - alarm->fire; + if (delayVFrame < 0 || (delayVFrame == 0 && delayVCount < 0)) { + return OSi_VALARM_LATER; + } + if (delayVCount < 0) { + delayVCount += OSi_VHIGHT; + } + return (delayVCount <= alarm->delay) ? OSi_VALARM_NOW : OSi_VALARM_TIMEOUT; +} + +static s32 OSi_GetVFrame(s32 vcount) { + OSIntrMode enabled = OS_DisableInterrupts(); + if (vcount < OSi_PreviousVCount) { + OSi_VFrameCount++; + } + OSi_PreviousVCount = vcount; + OS_RestoreInterrupts(enabled); + return OSi_VFrameCount; +} diff --git a/sub/lib/src/PAD_xyButton.c b/sub/lib/src/PAD_xyButton.c new file mode 100644 index 00000000..7058118e --- /dev/null +++ b/sub/lib/src/PAD_xyButton.c @@ -0,0 +1,31 @@ +#include + +BOOL PADi_XYButtonAvailable = FALSE; +// OSAlarm PADi_XYButtonAlarm = {}; +extern OSAlarm PADi_XYButtonAlarm; + +void PADi_XYButton_Callback(void); + +BOOL PAD_InitXYButton(void) { + if (!OS_IsTickAvailable() || !OS_IsAlarmAvailable()) { + return FALSE; + } + if (PADi_XYButtonAvailable) { + return FALSE; + } + OS_CreateAlarm(&PADi_XYButtonAlarm); + OS_SetPeriodicAlarm(&PADi_XYButtonAlarm, OS_GetTick() + 2094ll, 2094ll, (OSAlarmHandler)PADi_XYButton_Callback, NULL); + PADi_XYButtonAvailable = TRUE; + return TRUE; +} + +void PADi_XYButton_Callback(void) { + u16 rcnt0_h; + u16 data_r7 = 0; + EXIi_SelectRcnt(EXI_GPIOIF_GPIO); + rcnt0_h = reg_EXI_RCNT0_H; + if (rcnt0_h & REG_EXI_RCNT0_H_DATA_R7_MASK) { + data_r7 = 0x8000; + } + *(u16 *)HW_BUTTON_XY_BUF = data_r7 | ((rcnt0_h & (REG_EXI_RCNT0_H_DATA_R3_MASK | REG_EXI_RCNT0_H_DATA_R1_MASK | REG_EXI_RCNT0_H_DATA_R0_MASK)) << 10); +} diff --git a/sub/lib/src/PXI_fifo.c b/sub/lib/src/PXI_fifo.c new file mode 100644 index 00000000..7c57935f --- /dev/null +++ b/sub/lib/src/PXI_fifo.c @@ -0,0 +1,148 @@ +#include + +// Stub file for now +u16 FifoCtrlInit = 0; +PXIFifoCallback FifoRecvCallbackTable[PXI_MAX_FIFO_TAG]; + +PXIFifoStatus PXIi_SetToFifo(u32 data); + +void PXI_Init(void) { + PXI_InitFifo(); +} + +void PXI_InitFifo(void) { + int i; + OSSystemWork *work; + OSIntrMode enabled = OS_DisableInterrupts(); + if (!FifoCtrlInit) { + FifoCtrlInit = TRUE; + work = OS_GetSystemWork(); + work->pxiHandleChecker[PXI_PROC_ARM7] = 0; + for (i = 0; i < PXI_MAX_FIFO_TAG; i++) { + FifoRecvCallbackTable[i] = NULL; + } + reg_PXI_FIFO_CNT = REG_PXI_FIFO_CNT_FIELD( + 1,1,1,0,0,1,0,0,0 + ); + OS_ResetRequestIrqMask(OS_IE_FIFO_RECV); + OS_SetIrqFunction(OS_IE_FIFO_RECV, PXIi_HandlerRecvFifoNotEmpty); + OS_EnableIrqMask(OS_IE_FIFO_RECV); +#ifdef SDK_ARM7 + for (i = 8; i >= 0; i--) { + reg_PXI_INTF = (i << REG_PXI_INTF_A7STATUS_SHIFT); + OS_SpinWait(1000); + if (((reg_PXI_INTF & REG_PXI_INTF_A9STATUS_MASK) >> REG_PXI_INTF_A9STATUS_SHIFT) != i) { + i = 8; + } + } +#else + { + int timeout; + s32 c; + for (i = 0;; i++) { + c = (reg_PXI_INTF & REG_PXI_INTF_A9STATUS_MASK) >> REG_PXI_INTF_A9STATUS_SHIFT; + reg_PXI_INTF = c << REG_PXI_INTF_A7STATUS_SHIFT; + if (c == 0 && i > 4) { + break; + } + for (timeout = 1000; ((reg_PXI_INTF & REG_PXI_INTF_A9STATUS_MASK) >> REG_PXI_INTF_A9STATUS_SHIFT) == c; timeout--) { + if (timeout == 0) { + i = 0; + break; + } + } + } + } +#endif + } + OS_RestoreInterrupts(enabled); +} + +void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback) { + OSIntrMode enabled = OS_DisableInterrupts(); + OSSystemWork *work = OS_GetSystemWork(); + + FifoRecvCallbackTable[fifotag] = callback; + if (callback != NULL) { + work->pxiHandleChecker[PXI_PROC_ARM7] |= (1 << fifotag); + } else { + work->pxiHandleChecker[PXI_PROC_ARM7] &= ~(1 << fifotag); + } + OS_RestoreInterrupts(enabled); +} + +BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc) { + OSSystemWork *work = OS_GetSystemWork(); + return ((work->pxiHandleChecker[proc] & (1 << fifotag)) != 0); +} + +s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err) { + PXIFifoMessage fifomsg; + + fifomsg.e.tag = fifotag; + fifomsg.e.err = err; + fifomsg.e.data = data; + return PXIi_SetToFifo(fifomsg.raw); +} + +#ifdef SDK_ARM9 +static inline +#endif +PXIFifoStatus PXIi_SetToFifo(u32 data) { + OSIntrMode enabled; + if (reg_PXI_FIFO_CNT & REG_PXI_FIFO_CNT_ERR_MASK) { + reg_PXI_FIFO_CNT |= (REG_PXI_FIFO_CNT_E_MASK | REG_PXI_FIFO_CNT_ERR_MASK); + return PXI_FIFO_FAIL_SEND_ERR; + } + enabled = OS_DisableInterrupts(); + if (reg_PXI_FIFO_CNT & REG_PXI_FIFO_CNT_SEND_FULL_MASK) { + OS_RestoreInterrupts(enabled); + return PXI_FIFO_FAIL_SEND_FULL; + } + + reg_PXI_SEND_FIFO = data; + OS_RestoreInterrupts(enabled); + return PXI_FIFO_SUCCESS; +} + +static inline PXIFifoStatus PXIi_GetFromFifo(u32 *data_p) { + OSIntrMode enabled; + if (reg_PXI_FIFO_CNT & REG_PXI_FIFO_CNT_ERR_MASK) { + reg_PXI_FIFO_CNT |= (REG_PXI_FIFO_CNT_E_MASK | REG_PXI_FIFO_CNT_ERR_MASK); + return PXI_FIFO_FAIL_RECV_ERR; + } + enabled = OS_DisableInterrupts(); + if (reg_PXI_FIFO_CNT & REG_PXI_FIFO_CNT_RECV_EMP_MASK) { + OS_RestoreInterrupts(enabled); + return PXI_FIFO_FAIL_RECV_EMPTY; + } + *data_p = reg_PXI_RECV_FIFO; + OS_RestoreInterrupts(enabled); + return PXI_FIFO_SUCCESS; +} + +void PXIi_HandlerRecvFifoNotEmpty(void) { + PXIFifoMessage fifomsg; + s32 result; + PXIFifoCallback callback; + + while (1) { + result = PXIi_GetFromFifo(&fifomsg.raw); + if (result == PXI_FIFO_FAIL_RECV_EMPTY) { + return; + } + if (result == PXI_FIFO_FAIL_RECV_ERR) { + continue; + } + if (fifomsg.e.tag == 0) { + continue; + } + callback = FifoRecvCallbackTable[fifomsg.e.tag]; + if (callback != NULL) { + callback((PXIFifoTag)fifomsg.e.tag, fifomsg.e.data, fifomsg.e.err); + } else if (!fifomsg.e.err) { + fifomsg.e.err = TRUE; + PXIi_SetToFifo(fifomsg.raw); + } + } +} diff --git a/tools/asm_processor/.gitattributes b/tools/asm_processor/.gitattributes new file mode 100644 index 00000000..75c2cbe5 --- /dev/null +++ b/tools/asm_processor/.gitattributes @@ -0,0 +1 @@ +compile.sh text eol=lf diff --git a/tools/asm_processor/asm_processor.py b/tools/asm_processor/asm_processor.py new file mode 100755 index 00000000..83cef1b7 --- /dev/null +++ b/tools/asm_processor/asm_processor.py @@ -0,0 +1,1265 @@ +#!/usr/bin/env python3 +import argparse +import tempfile +import struct +import copy +import sys +import re +import os +from collections import namedtuple, defaultdict +from io import StringIO + +MAX_FN_SIZE = 3000 +SLOW_CHECKS = False + +EI_NIDENT = 16 +EI_CLASS = 4 +EI_DATA = 5 +EI_VERSION = 6 +EI_OSABI = 7 +EI_ABIVERSION = 8 +STN_UNDEF = 0 + +SHN_UNDEF = 0 +SHN_ABS = 0xfff1 +SHN_COMMON = 0xfff2 +SHN_XINDEX = 0xffff +SHN_LORESERVE = 0xff00 + +STT_NOTYPE = 0 +STT_OBJECT = 1 +STT_FUNC = 2 +STT_SECTION = 3 +STT_FILE = 4 +STT_COMMON = 5 +STT_TLS = 6 + +STB_LOCAL = 0 +STB_GLOBAL = 1 +STB_WEAK = 2 + +STV_DEFAULT = 0 +STV_INTERNAL = 1 +STV_HIDDEN = 2 +STV_PROTECTED = 3 + +SHT_NULL = 0 +SHT_PROGBITS = 1 +SHT_SYMTAB = 2 +SHT_STRTAB = 3 +SHT_RELA = 4 +SHT_HASH = 5 +SHT_DYNAMIC = 6 +SHT_NOTE = 7 +SHT_NOBITS = 8 +SHT_REL = 9 +SHT_SHLIB = 10 +SHT_DYNSYM = 11 +SHT_INIT_ARRAY = 14 +SHT_FINI_ARRAY = 15 +SHT_PREINIT_ARRAY = 16 +SHT_GROUP = 17 +SHT_SYMTAB_SHNDX = 18 +SHT_MIPS_GPTAB = 0x70000003 +SHT_MIPS_DEBUG = 0x70000005 +SHT_MIPS_REGINFO = 0x70000006 +SHT_MIPS_OPTIONS = 0x7000000d + +SHF_WRITE = 0x1 +SHF_ALLOC = 0x2 +SHF_EXECINSTR = 0x4 +SHF_MERGE = 0x10 +SHF_STRINGS = 0x20 +SHF_INFO_LINK = 0x40 +SHF_LINK_ORDER = 0x80 +SHF_OS_NONCONFORMING = 0x100 +SHF_GROUP = 0x200 +SHF_TLS = 0x400 + +R_MIPS_32 = 2 +R_MIPS_26 = 4 +R_MIPS_HI16 = 5 +R_MIPS_LO16 = 6 + + +class ElfHeader: + """ + typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; + } Elf32_Ehdr; + """ + + def __init__(self, data): + self.e_ident = data[:EI_NIDENT] + self.e_type, self.e_machine, self.e_version, self.e_entry, self.e_phoff, self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx = struct.unpack('> 4 + self.type = st_info & 15 + self.name = strtab.lookup_str(self.st_name) + self.visibility = self.st_other & 3 + + def to_bin(self): + st_info = (self.bind << 4) | self.type + return struct.pack('> 8 + self.rel_type = self.r_info & 0xff + + def to_bin(self): + self.r_info = (self.sym_index << 8) | self.rel_type + if self.sh_type == SHT_REL: + return struct.pack(' 0: + # Generate late rodata by emitting unique float constants. + # This requires 3 instructions for each 4 bytes of rodata. + # If we know alignment, we can use doubles, which give 3 + # instructions for 8 bytes of rodata. + size = self.fn_section_sizes['.late_rodata'] // 2 + skip_next = False + needs_double = (self.late_rodata_alignment != 0) + for i in range(size): + if skip_next: + skip_next = False + continue + # Jump tables give 9 instructions for >= 5 words of rodata, and should be + # emitted when: + # - -O2 or -O2 -g3 are used, which give the right codegen + # - we have emitted our first .float/.double (to ensure that we find the + # created rodata in the binary) + # - we have emitted our first .double, if any (to ensure alignment of doubles + # in shifted rodata sections) + # - we have at least 5 words of rodata left to emit (otherwise IDO does not + # generate a jump table) + # - we have at least 10 more instructions to go in this function (otherwise our + # function size computation will be wrong since the delay slot goes unused) + if (not needs_double and state.use_jtbl_for_rodata and i >= 1 and + size - i >= 5 and num_instr - len(late_rodata_fn_output) >= 10): + cases = " ".join("case {}:".format(case) for case in range(size - i)) + late_rodata_fn_output.append("switch (*(volatile int*)0) { " + cases + " ; }") + late_rodata_fn_output.extend([""] * 8) + jtbl_rodata_size = (size - i) * 4 + break + dummy_bytes = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes) + if self.late_rodata_alignment == 4 * ((i + 1) % 2 + 1) and i + 1 < size: + dummy_bytes2 = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes2) + fval, = struct.unpack(' 0 or late_rodata_fn_output: + text_name = state.make_name('func') + src[0] = 'int {}(void) {{ return '.format(text_name) + instr_count = self.fn_section_sizes['.text'] // 2 + src[self.num_lines] = '((volatile void *) 0); }; ' if instr_count > 1 else '; }; ' + if instr_count < state.min_instr_count: + self.fail("too short .text block") + tot_emitted = 0 + tot_skipped = 0 + fn_emitted = 0 + fn_skipped = 0 + rodata_stack = late_rodata_fn_output[::-1] + for (line, count) in self.fn_ins_inds: + for _ in range(count): + if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and + (not rodata_stack or rodata_stack[-1])): + # Don't let functions become too large. When a function reaches 284 + # instructions, and -O2 -framepointer flags are passed, the IRIX + # compiler decides it is a great idea to start optimizing more. + fn_emitted = 0 + fn_skipped = 0 + src[line] += '((volatile void *) 0); }} int {}(void) {{ return '.format(state.make_name('large_func')) + if fn_skipped < state.skip_instr_count: + fn_skipped += 1 + tot_skipped += 1 + elif rodata_stack: + src[line] += rodata_stack.pop() + else: + src[line] += '*(int *)' + tot_emitted += 1 + fn_emitted += 1 + if rodata_stack: + size = len(late_rodata_fn_output) // 3 + available = instr_count - tot_skipped + self.fail( + "late rodata to text ratio is too high: {} / {} must be <= 1/3\n" + "add .late_rodata_alignment (4|8) to the .late_rodata " + "block to double the allowed ratio." + .format(size, available)) + + init_name = None + if self.fn_section_sizes['.init'] > 0 or late_rodata_fn_output: + init_name = state.make_name('func') + src[0] = 'int {}(void) {{ return '.format(init_name) + instr_count = self.fn_section_sizes['.init'] // 2 + src[self.num_lines] = '((volatile void *) 0); }; ' if instr_count else '; }; ' + if instr_count < state.min_instr_count: + self.fail("too short .init block") + tot_emitted = 0 + tot_skipped = 0 + fn_emitted = 0 + fn_skipped = 0 + rodata_stack = late_rodata_fn_output[::-1] + for (line, count) in self.fn_ins_inds: + for _ in range(count): + if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and + (not rodata_stack or rodata_stack[-1])): + # Don't let functions become too large. When a function reaches 284 + # instructions, and -O2 -framepointer flags are passed, the IRIX + # compiler decides it is a great idea to start optimizing more. + fn_emitted = 0 + fn_skipped = 0 + src[line] += '((volatile void *) 0); }} int {}(void) {{ return '.format(state.make_name('large_func')) + if fn_skipped < state.skip_instr_count: + fn_skipped += 1 + tot_skipped += 1 + elif rodata_stack: + src[line] += rodata_stack.pop() + else: + src[line] += '*(int *)' + tot_emitted += 1 + fn_emitted += 1 + if rodata_stack: + size = len(late_rodata_fn_output) // 3 + available = instr_count - tot_skipped + self.fail( + "late rodata to init ratio is too high: {} / {} must be <= 1/3\n" + "add .late_rodata_alignment (4|8) to the .late_rodata " + "block to double the allowed ratio." + .format(size, available)) + + rodata_name = None + if self.fn_section_sizes['.rodata'] > 0: + rodata_name = state.make_name('rodata') + src[self.num_lines] += f" const char {rodata_name}[{self.fn_section_sizes['.rodata']}] = {{1}};" + + data_name = None + if self.fn_section_sizes['.data'] > 0: + data_name = state.make_name('data') + src[self.num_lines] += f" char {data_name}[{self.fn_section_sizes['.data']}] = {{1}};" + + bss_name = None + if self.fn_section_sizes['.bss'] > 0: + bss_name = state.make_name('bss') + src[self.num_lines] += f" char {bss_name}[{self.fn_section_sizes['.bss']}];" + + sdata_name = None # sdata is like data but small + if self.fn_section_sizes['.sdata'] > 0: + sdata_code = "" + for i in range(self.fn_section_sizes['.sdata']): + sdata_name = state.make_name('sdata') + sdata_code += f" char {sdata_name} = 1;" + src[self.num_lines] += sdata_code + + sdata2_name = None # sdata2 is like rodata but small + if self.fn_section_sizes['.sdata2'] > 0: + sdata2_code = "" + for i in range(self.fn_section_sizes['.sdata2']): + sdata2_name = state.make_name('sdata2') + sdata2_code += f" const char {sdata2_name} = 1;" + src[self.num_lines] += sdata2_code + + sbss_name = None # Similarly, sbss is like uninitialized data but small + if self.fn_section_sizes['.sbss'] > 0: + sbss_code = "" + for i in range(self.fn_section_sizes['.sbss']): + sbss_name = state.make_name('sbss') + sbss_code += f" char {sbss_name};" + src[self.num_lines] += sbss_code + + """ sbss2 is currently borked + sbss2_name = None # Similarly, sbss2 is like uninitialized rodata but small + if self.fn_section_sizes['.sbss2'] > 0: + sbss2_code = "" + for i in range(self.fn_section_sizes['.sbss2']): + sbss2_name = state.make_name('sbss2') + sbss2_code += f" const char {sbss2_name};" + src[self.num_lines] += sbss2_code + """ + + fn = Function( + text_glabels=self.text_glabels, + asm_conts=self.asm_conts, + late_rodata_dummy_bytes=late_rodata_dummy_bytes, + jtbl_rodata_size=jtbl_rodata_size, + late_rodata_asm_conts=self.late_rodata_asm_conts, + fn_desc=self.fn_desc, + data={ + '.text': (text_name, self.fn_section_sizes['.text']), + '.data': (data_name, self.fn_section_sizes['.data']), + '.rodata': (rodata_name, self.fn_section_sizes['.rodata']), + '.bss': (bss_name, self.fn_section_sizes['.bss']), + '.sdata': (sdata_name, self.fn_section_sizes['.sdata']), + '.sdata2': (sdata2_name, self.fn_section_sizes['.sdata2']), + '.sbss': (sbss_name, self.fn_section_sizes['.sbss']), + #'.sbss2': (sbss2_name, self.fn_section_sizes['.sbss2']), + }) + return src, fn + +cutscene_data_regexpr = re.compile(r"CutsceneData (.|\n)*\[\] = {") +float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f") + +def repl_float_hex(m): + return str(struct.unpack(" 0 + n_text = objfile.text_section_index(temp_name) + loc = objfile.symtab.find_symbol(temp_name) + if loc is None: + ifdefed = True + break + loc = loc[1] + prev_loc = prev_locs[sectype + (str(n_text) if sectype == '.text' else '')] + if loc < prev_loc: + raise Failure("Wrongly computed size for section {} (diff {}). This is an asm-processor bug!".format(sectype + (str(n_text) if sectype == '.text' else ''), prev_loc- loc)) + if loc != prev_loc: + asm.append('.section ' + sectype) + if sectype == '.text': + for i in range((loc - prev_loc) // 2): + asm.append('nop') + else: + asm.append('.space {}'.format(loc - prev_loc)) + to_copy[sectype + (str(n_text) if sectype == '.text' else '')].append((loc, size, temp_name, function.fn_desc, [])) + prev_locs[sectype + (str(n_text) if sectype == '.text' else '')] = loc + size + if not ifdefed: + all_text_glabels.update(function.text_glabels) + all_late_rodata_dummy_bytes.append(function.late_rodata_dummy_bytes) + all_jtbl_rodata_size.append(function.jtbl_rodata_size) + late_rodata_asm.append(function.late_rodata_asm_conts) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + asm.append('.section ' + sectype) + asm.append('.global ' + temp_name + '_asm_start') + asm.append(temp_name + '_asm_start:') + asm.append('.section .text') + for line in function.asm_conts: + asm.append(line) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + #asm.append('.section ' + sectype) + asm.append('.global ' + temp_name + '_asm_end') + asm.append(temp_name + '_asm_end:') + + if any(late_rodata_asm): + late_rodata_source_name_start = '_asmpp_late_rodata_start' + late_rodata_source_name_end = '_asmpp_late_rodata_end' + asm.append('.rdata') + asm.append('glabel {}'.format(late_rodata_source_name_start)) + for conts in late_rodata_asm: + asm.extend(conts) + asm.append('glabel {}'.format(late_rodata_source_name_end)) + + o_file = open("asm_processor_temp.o", 'w').close() # Create temp file. tempfile module isn't working for me. + o_name = "asm_processor_temp.o" + + s_file = open("asm_processor_temp.s", 'wb') # Ditto. + s_name = "asm_processor_temp.s" + try: + s_file.write(asm_prelude + b'\n') + for line in asm: + s_file.write(line.encode(output_enc) + b'\n') + s_file.close() + ret = os.system(assembler + " " + s_name + " -o " + o_name) + if ret != 0: + raise Failure("failed to assemble") + with open(o_name, 'rb') as f: + asm_objfile = ElfFile(f.read()) + + # Remove some clutter from objdump output + objfile.drop_irrelevant_sections() + + """ + # Unify reginfo sections + target_reginfo = objfile.find_section('.reginfo') + source_reginfo_data = list(asm_objfile.find_section('.reginfo').data) + data = list(target_reginfo.data) + for i in range(20): + data[i] |= source_reginfo_data[i] + target_reginfo.data = bytes(data) + """ + + # Move over section contents + modified_text_positions = set() + jtbl_rodata_positions = set() + last_rodata_pos = 0 + n_text = 0 + for sec in objfile.sections: + sectype = sec.name + if not to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + if sectype == '.text': + n_text += 1 + continue + # This should work as long as you NONMATCH whole functions rather than asm fragments + func = to_copy[sectype + str(n_text) if sectype == '.text' else ''][0][2] + asm_n_text = asm_objfile.text_section_index(func + '_asm_start') + source = asm_objfile.find_section(sectype, asm_n_text if sectype == '.text' else 0) + assert source is not None, "didn't find source section: " + sectype + for (pos, count, temp_name, fn_desc, fn_name) in to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + loc1 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_start', source) + loc2 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_end', source) + assert loc1 == pos, "assembly and C files don't line up for section " + sectype + ", " + fn_desc + # Since we are nonmatching whole functions, we don't need to insert the correct + # amount of padding into the src file. We don't actually need to insert padding + # at all. We can just plop the asm's text section into the objfile. + # if loc2 - loc1 != count: + # raise Failure("incorrectly computed size for section " + sectype + ", " + fn_desc + ". If using .double, make sure to provide explicit alignment padding.") + if sectype == '.bss' or sectype == '.sbss2': + continue + target = objfile.find_section(sectype, n_text if sectype == '.text' else 0) + assert target is not None, "missing target section of type " + sectype + data = list(target.data) + for (pos, count, _, _, _) in to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + # mwasmarm 4-aligns text sections, so make sure to copy exactly `count` bytes + data[pos:pos + count] = source.data[pos:pos + count] + if sectype == '.text': + assert count % 2 == 0 + assert pos % 2 == 0 + for i in range(count // 2): + modified_text_positions.add(pos + 2 * i) + elif sectype == '.rodata': + last_rodata_pos = pos + count + target.data = bytes(data) + if sectype == '.text': + n_text += 1 + + # Move over late rodata. This is heuristic, sadly, since I can't think + # of another way of doing it. + moved_late_rodata = {} + if any(all_late_rodata_dummy_bytes) or any(all_jtbl_rodata_size): + source = asm_objfile.find_section('.rodata', 0) + target = objfile.find_section('.rodata', 0) + source_pos = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_start, source) + source_end = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_end, source) + if source_end - source_pos != sum(map(len, all_late_rodata_dummy_bytes)) * 2 + sum(all_jtbl_rodata_size): + raise Failure("computed wrong size of .late_rodata") + new_data = list(target.data) + for dummy_bytes_list, jtbl_rodata_size in zip(all_late_rodata_dummy_bytes, all_jtbl_rodata_size): + for index, dummy_bytes in enumerate(dummy_bytes_list): + pos = target.data.index(dummy_bytes, last_rodata_pos) + # This check is nice, but makes time complexity worse for large files: + if SLOW_CHECKS and target.data.find(dummy_bytes, pos + 2) != -1: + raise Failure("multiple occurrences of late_rodata hex magic. Change asm-processor to use something better than 0xE0123456!") + if index == 0 and len(dummy_bytes_list) > 1 and target.data[pos+2:pos+8] == b'\0\0\0\0': + # Ugly hack to handle double alignment for non-matching builds. + # We were told by .late_rodata_alignment (or deduced from a .double) + # that a function's late_rodata started out 4 (mod 8), and emitted + # a float and then a double. But it was actually 0 (mod 8), so our + # double was moved by 4 bytes. To make them adjacent to keep jump + # tables correct, move the float by 4 bytes as well. + new_data[pos:pos+2] = b'\0\0\0\0' + pos += 2 + new_data[pos:pos+2] = source.data[source_pos:source_pos+2] + moved_late_rodata[source_pos] = pos + last_rodata_pos = pos + 2 + source_pos += 2 + if jtbl_rodata_size > 0: + assert dummy_bytes_list, "should always have dummy bytes before jtbl data" + pos = last_rodata_pos + new_data[pos : pos + jtbl_rodata_size] = \ + source.data[source_pos : source_pos + jtbl_rodata_size] + for i in range(0, jtbl_rodata_size, 2): + moved_late_rodata[source_pos + i] = pos + i + jtbl_rodata_positions.add(pos + i) + last_rodata_pos += jtbl_rodata_size + source_pos += jtbl_rodata_size + target.data = bytes(new_data) + + # Merge strtab data. + strtab_adj = len(objfile.symtab.strtab.data) + objfile.symtab.strtab.data += asm_objfile.symtab.strtab.data + + # Find relocated symbols + relocated_symbols = set() + for obj in [asm_objfile, objfile]: + for sec in obj.sections: + for reltab in sec.relocated_by: + for rel in reltab.relocations: + relocated_symbols.add(obj.symtab.symbol_entries[rel.sym_index]) + + # Move over symbols, deleting the temporary function labels. + # Sometimes this naive procedure results in duplicate symbols, or UNDEF + # symbols that are also defined the same .o file. Hopefully that's fine. + # Skip over local symbols that aren't used relocated against, to avoid + # conflicts. + new_local_syms = [s for s in objfile.symtab.local_symbols() if not is_temp_name(s.name)] + new_global_syms = [s for s in objfile.symtab.global_symbols() if not is_temp_name(s.name)] + n_text = 0 + for i, s in enumerate(asm_objfile.symtab.symbol_entries): + is_local = (i < asm_objfile.symtab.sh_info) + if is_local and s not in relocated_symbols: + continue + if is_temp_name(s.name): + continue + if s.st_shndx not in [SHN_UNDEF, SHN_ABS]: + section_name = asm_objfile.sections[s.st_shndx].name + if section_name not in SECTIONS: + raise Failure("generated assembly .o must only have symbols for .text, .data, .rodata, .sdata, .sdata2, .sbss, ABS and UNDEF, but found " + section_name) + if section_name == '.sbss2': #! I'm not sure why this isn't working + continue + obj_n_text = objfile.text_section_index(temp_name) + s.st_shndx = objfile.find_section(section_name, obj_n_text if section_name == '.text' else 0).index + if section_name == '.text': + n_text += 1 + # glabel's aren't marked as functions, making objdump output confusing. Fix that. + if s.name in all_text_glabels: + s.type = STT_FUNC + if objfile.sections[s.st_shndx].name == '.rodata' and s.st_value in moved_late_rodata: + s.st_value = moved_late_rodata[s.st_value] + s.st_name += strtab_adj + if is_local: + new_local_syms.append(s) + else: + new_global_syms.append(s) + new_syms = new_local_syms + new_global_syms + for i, s in enumerate(new_syms): + s.new_index = i + objfile.symtab.data = b''.join(s.to_bin() for s in new_syms) + objfile.symtab.sh_info = len(new_local_syms) + + # Move over relocations + n_text = 0 + for sec in objfile.sections: + sectype = sec.name + # This should work as long as you NONMATCH whole functions rather than asm fragments + target = objfile.find_section(sectype, n_text if sectype == '.text' else 0) + + if target is not None: + # fixup relocation symbol indices, since we butchered them above + for reltab in target.relocated_by: + nrels = [] + for rel in reltab.relocations: + if (sectype == '.rodata' and rel.r_offset in jtbl_rodata_positions) or sectype == ".sbss2": + # don't include relocations for late_rodata dummy code + continue + # hopefully we don't have relocations for local or + # temporary symbols, so new_index exists + rel.sym_index = objfile.symtab.symbol_entries[rel.sym_index].new_index + nrels.append(rel) + reltab.relocations = nrels + reltab.data = b''.join(rel.to_bin() for rel in nrels) + + if not to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + if sectype == '.text': + n_text += 1 + continue + + func = to_copy[sectype + str(n_text) if sectype == '.text' else ''][0][2] + asm_n_text = asm_objfile.text_section_index(func + '_asm_start') + source = asm_objfile.find_section(sectype, asm_n_text if sectype == '.text' else 0) + if not source: + if sectype == '.text': + n_text += 1 + continue + + target_reltab = objfile.find_section('.rel' + sectype, n_text if sectype == '.text' else 0) + target_reltaba = objfile.find_section('.rela' + sectype, n_text if sectype == '.text' else 0) + for reltab in source.relocated_by: + for rel in reltab.relocations: + rel.sym_index = asm_objfile.symtab.symbol_entries[rel.sym_index].new_index + if sectype == '.rodata' and rel.r_offset in moved_late_rodata: + rel.r_offset = moved_late_rodata[rel.r_offset] + new_data = b''.join(rel.to_bin() for rel in reltab.relocations) + if reltab.sh_type == SHT_REL: + target_reltab = objfile.add_section('.rel' + sectype, + sh_type=SHT_REL, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=8, data=b'') + target_reltab.data += new_data + else: + # Always append as a separate .rela.text section + target_reltaba = objfile.add_section('.rela' + sectype, + sh_type=SHT_RELA, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=12, data=b'') + target_reltaba.data += new_data + if sectype == '.text': + n_text += 1 + + objfile.write(objfile_name) + finally: + s_file.close() + #os.remove(s_name) + try: + pass + #os.remove(o_name) + except: + pass + +def run_wrapped(argv, outfile): + parser = argparse.ArgumentParser(description="Pre-process .c files and post-process .o files to enable embedding assembly into C.") + parser.add_argument('filename', help="path to .c code") + parser.add_argument('--post-process', dest='objfile', help="path to .o file to post-process") + parser.add_argument('--assembler', dest='assembler', help="assembler command (e.g. \"mips-linux-gnu-as -march=vr4300 -mabi=32\")") + parser.add_argument('--asm-prelude', dest='asm_prelude', help="path to a file containing a prelude to the assembly file (with .set and .macro directives, e.g.)") + parser.add_argument('--input-enc', default='latin1', help="Input encoding (default: latin1)") + parser.add_argument('--output-enc', default='latin1', help="Output encoding (default: latin1)") + parser.add_argument('-framepointer', dest='framepointer', action='store_true') + parser.add_argument('-g3', dest='g3', action='store_true') + group = parser.add_mutually_exclusive_group(required=False) + group.add_argument('-O1', dest='opt', action='store_const', const='O1') + group.add_argument('-O2', dest='opt', action='store_const', const='O2') + group.add_argument('-g', dest='opt', action='store_const', const='g') + args = parser.parse_args(argv) + opt = args.opt + if args.g3: + if opt != 'O2': + raise Failure("-g3 is only supported together with -O2") + opt = 'g3' + + if args.objfile is None: + with open(args.filename, encoding=args.input_enc) as f: + parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc, print_source=outfile) + else: + if args.assembler is None: + raise Failure("must pass assembler command") + with open(args.filename, encoding=args.input_enc) as f: + functions = parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc) + if not functions: + return + asm_prelude = b'' + if args.asm_prelude: + with open(args.asm_prelude, 'rb') as f: + asm_prelude = f.read() + fixup_objfile(args.objfile, functions, asm_prelude, args.assembler, args.output_enc) + +def run(argv, outfile=sys.stdout.buffer): + try: + run_wrapped(argv, outfile) + except Failure as e: + print("Error:", e, file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + run(sys.argv[1:]) diff --git a/tools/asm_processor/compile.sh b/tools/asm_processor/compile.sh new file mode 100755 index 00000000..b27d7a32 --- /dev/null +++ b/tools/asm_processor/compile.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +CC="$1" +AS="$2" +OBJ="$3" +SRC="$4" + +BUILD_FILENAME=${OBJ%.o} + +PADDED_SRC="$(mktemp --suffix=.c padded-XXXXXX)" +PADDED_OBJ="$(mktemp --suffix=.o padded-XXXXXX)" +PADDED_D="$(mktemp --suffix=.d padded-XXXXXX)" + +# Create a .c file replacing the nonmatching function with volatile int writes, +# and compile. +./tools/asm_processor/asm_processor.py "$SRC" --assembler "$AS" > "$PADDED_SRC" +$CC -c "$PADDED_SRC" -o "$PADDED_OBJ" + +# Inject the matching assembly into the padded obj file. +./tools/asm_processor/asm_processor.py "$SRC" --post-process "$PADDED_OBJ" --assembler "$AS" + +arm-none-eabi-objcopy --remove-section .comment "$PADDED_OBJ" "$OBJ" +if [[ $CC == *"gccdep"* ]]; then + cp "$PADDED_D" "${BUILD_FILENAME}.d" +fi + +rm padded-* +rm output.txt +rm asm_processor_temp.s +rm asm_processor_temp.o diff --git a/tools/asmdiff/.gitignore b/tools/asmdiff/.gitignore new file mode 100644 index 00000000..0f0a7b73 --- /dev/null +++ b/tools/asmdiff/.gitignore @@ -0,0 +1,4 @@ +.bins/ +.files/ +ntrextractfile +ntruncompbw diff --git a/tools/asmdiff/Makefile b/tools/asmdiff/Makefile new file mode 100644 index 00000000..eed8194b --- /dev/null +++ b/tools/asmdiff/Makefile @@ -0,0 +1,17 @@ +CC := gcc +CFLAGS := -O2 -g -Wno-unused-result + +ifneq ($(DEBUG),1) +CFLAGS += -DNDEBUG +endif + +programs := ntrextractfile ntruncompbw + +all: $(programs) + @: + +clean: + $(RM) $(programs) + +%: %.c + $(CC) $(CFLAGS) -o $@ $< diff --git a/tools/asmdiff/find_module_params.py b/tools/asmdiff/find_module_params.py new file mode 100644 index 00000000..b8e897bf --- /dev/null +++ b/tools/asmdiff/find_module_params.py @@ -0,0 +1,8 @@ +import sys + +with open(sys.argv[1], 'rb') as fp: + data = fp.read() +x = data.find(b'\x21\x06\xc0\xde') +if x != -1: + x -= 28 +print(x) diff --git a/tools/asmdiff/ntrextractfile.c b/tools/asmdiff/ntrextractfile.c new file mode 100644 index 00000000..19869a14 --- /dev/null +++ b/tools/asmdiff/ntrextractfile.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include + +#ifndef NDEBUG +#ifdef _MSC_VER +#define debug_printf(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) +#else +#define debug_printf(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) +#endif //_MSC_VER +#else +#define debug_printf(fmt, ...) ((void)0) +#endif //NDEBUG + +#define FIND_FAIL (-1u) + +struct NtrDirHeader { + unsigned offset; + unsigned short first_file; + unsigned short count_or_parent; +}; + +static char FILEBUF[BUFSIZ]; + +unsigned find_file(struct NtrDirHeader * fnt, const char * cfilename) { + unsigned file_id = fnt->first_file; + char * filename = strdup(cfilename); + char * tokenizer = filename; + int found = 0; + char * tree = (char *)fnt + fnt->offset; + char * token; + + while ((token = strtok(tokenizer, "/")) != NULL) { + tokenizer = NULL; + debug_printf("TOKEN: %s\n", token); + long toklen = strlen(token); + while (*tree) { + char flag = *tree++; +#ifndef NDEBUG + char *entname = malloc((flag & 0x7F) + 1); + *stpncpy(entname, tree, flag & 0x7F) = 0; + debug_printf("testing entry %s...", entname); + free(entname); +#endif //NDEBUG + if ((toklen != (flag & 0x7F)) || strncmp(tree, token, toklen) != 0) { + debug_printf("no; is %s\n", (flag & 0x80) ? "dir" : "file"); + // Next entry + tree += (flag & 0x7F); + if (flag & 0x80) { + tree += 2; // skip dir id + } + else { + file_id++; + } + } + else { + debug_printf("yes; is %s\n", (flag & 0x80) ? "dir" : "file"); + tree += (flag & 0x7F); + if (flag & 0x80) { + // navigate to next dir + unsigned short dir_id = (unsigned char) tree[0] | ((unsigned char) tree[1] << 8); + file_id = fnt[dir_id & 0xFFF].first_file; + tree = (char *)fnt + fnt[dir_id & 0xFFF].offset; + break; + } + else { + found = 1; + token = strtok(NULL, "/"); + goto done; + } + } + } + } + +done: + free(filename); + if (!found || token != NULL) { + file_id = FIND_FAIL; + } + return file_id; +} + +int main(int argc, char ** argv) { + if (argc < 3) { + fprintf(stderr, "missing required argument: %s\n", (argc == 1) ? "BASEROM" : "FILENAME"); + return 1; + } + FILE *baserom = fopen(argv[1], "rb"); + if (baserom == NULL) { + fprintf(stderr, "unable to open ROM %s for reading\n", argv[1]); + return 1; + } + debug_printf("opened baserom\n"); + + // fnt offset, fnt size, fat offset, fat size + unsigned offsets[4]; + fseek(baserom, 64, SEEK_SET); + if (fread(offsets, 4, 4, baserom) != 4) { + fprintf(stderr, "failed to read from baserom\n"); + fclose(baserom); + return 1; + } + debug_printf("read offsets\n"); + + // read fnt + struct NtrDirHeader *fnt = malloc(offsets[1]); + if (fnt == NULL) { + fprintf(stderr, "unable to allocate FNT buffer\n"); + fclose(baserom); + return 1; + } + fseek(baserom, offsets[0], SEEK_SET); + if (fread(fnt, 1, offsets[1], baserom) != offsets[1]) { + fprintf(stderr, "unable to read FNT\n"); + free(fnt); + fclose(baserom); + return 1; + } + debug_printf("read fnt\n"); + + unsigned file_id = find_file(fnt, argv[2]); + free(fnt); + if (file_id == FIND_FAIL) { + fprintf(stderr, "file not found"); + fclose(baserom); + return 1; + } + debug_printf("found file with id %u\n", file_id); + + // Extract the file to stdout + if (8 * file_id >= offsets[3]) { + fprintf(stderr, "nitrofs lookup failed"); + fclose(baserom); + return 1; + } + + FILE *out = fdopen(dup(fileno(stdout)), "wb"); + fseek(baserom, offsets[2] + 8 * file_id, SEEK_SET); + fread(offsets, 4, 2, baserom); + fseek(baserom, offsets[0], SEEK_SET); + while (offsets[1] - offsets[0] > BUFSIZ) { + fread(FILEBUF, 1, BUFSIZ, baserom); + fwrite(FILEBUF, 1, BUFSIZ, out); + offsets[0] += BUFSIZ; + } + fread(FILEBUF, 1, offsets[1] - offsets[0], baserom); + fwrite(FILEBUF, 1, offsets[1] - offsets[0], out); + fclose(out); + + fclose(baserom); + return 0; +} diff --git a/tools/asmdiff/ntruncompbw.c b/tools/asmdiff/ntruncompbw.c new file mode 100644 index 00000000..e97db925 --- /dev/null +++ b/tools/asmdiff/ntruncompbw.c @@ -0,0 +1,107 @@ +#include +#include +#include + +static inline uint32_t READ32(const unsigned char * ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static uint32_t MIi_UncompressBackwards(unsigned char ** out_p, size_t compsize) +{ + unsigned char * out = *out_p; + + // Read the pointer to the end of the compressed image + uint8_t * endptr = out + compsize - 8; + uint32_t size = READ32(endptr); + uint32_t offset = READ32(endptr + 4); + out = realloc(out, compsize + offset); + if (out == NULL) + return -1u; + endptr = out + compsize; + uint8_t * dest_p = endptr + offset; + uint8_t * end = endptr - ((uint8_t)(size >> 24)); + uint8_t * start = endptr - (size & ~0xFF000000); + while (end > start) { + uint8_t r5 = *--end; + for (int i = 0; i < 8; i++) { + if ((r5 & 0x80) == 0) + *--dest_p = *--end; + else { + int ip = *--end; + int r7 = *--end; + + + r7 = ((r7 | (ip << 8)) & ~0xF000) + 2; + ip += 0x20; + while (ip >= 0) { + dest_p[-1] = dest_p[r7]; + dest_p--; + ip -= 0x10; + } + } + if (end <= start) + break; + r5 <<= 1; + } + } + *out_p = out; + return compsize + offset; +} + +int main(int argc, char ** argv) +{ + if (argc < 4) { + fprintf(stderr, "usage: %s FILE VMA END\n\ninsufficient arguments\n", argv[0]); + return 1; + } + char * infname = argv[1]; + uint32_t vma = strtoul(argv[2], NULL, 0); + uint32_t end = strtoul(argv[3], NULL, 0); + if (end == 0) { + fprintf(stderr, "compressed size is 0, no action taken\n"); + return 0; + } + FILE * infile = fopen(infname, "r+b"); + if (infile == NULL) { + fclose(infile); + fprintf(stderr, "unable to open file %s for reading\n", infname); + return 1; + } + fseek(infile, 0, SEEK_END); + long infsize = ftell(infile); + fseek(infile, 0, SEEK_SET); + if (infsize != end - vma) { + fclose(infile); + fprintf(stderr, "compressed size does not match file size, I am cowardly doing nothing\n"); + return 0; + } + unsigned char * inbuf = malloc(infsize); + if (inbuf == NULL) { + fclose(infile); + fprintf(stderr, "error: malloc(%d)\n", (int)infsize); + return 1; + } + if (fread(inbuf, 1, infsize, infile) != infsize) { + fclose(infile); + free(inbuf); + fprintf(stderr, "error reading from %s\n", infname); + return 1; + } + uint32_t outsize = MIi_UncompressBackwards(&inbuf, end - vma); + if (outsize == -1u) { + fclose(infile); + fprintf(stderr, "fatal error reallocating for decompression\n"); + return 1; + } + fseek(infile, 0, SEEK_SET); + if (fwrite(inbuf, 1, outsize, infile) != outsize) { + fclose(infile); + free(inbuf); + fprintf(stderr, "error writing back to %s\n", infname); + return 1; + } + fclose(infile); + free(inbuf); + return 0; +} diff --git a/tools/compstatic/.gitignore b/tools/compstatic/.gitignore new file mode 100644 index 00000000..0ccf76ad --- /dev/null +++ b/tools/compstatic/.gitignore @@ -0,0 +1 @@ +compstatic diff --git a/tools/compstatic/Makefile b/tools/compstatic/Makefile new file mode 100644 index 00000000..4352c0cb --- /dev/null +++ b/tools/compstatic/Makefile @@ -0,0 +1,32 @@ +CC := gcc +CFLAGS := -O3 + +SRCS = $(wildcard *.c) +OBJS = $(SRCS:%.c=%.o) + +prog := compstatic + +.PHONY: all clean + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +all: $(prog) + @: + +clean: + $(RM) -r $(DEPDIR) $(OBJS) $(prog) $(prog).exe + +$(prog): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +$(OBJS): %.o: %.c +$(OBJS): %.o: %.c $(DEPDIR)/%.d | $(DEPDIR) + $(CC) $(CFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(SRCS:%.c=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/compstatic/component.c b/tools/compstatic/component.c new file mode 100644 index 00000000..0df9d3a5 --- /dev/null +++ b/tools/compstatic/component.c @@ -0,0 +1,187 @@ +#include +#include +#include "component.h" +#include "compress.h" +#include "global.h" +#include "overlay_defs.h" +#include "overlay_modules.h" +#include "overlay_table.h" +#include "print.h" +#include "static_module.h" +#include "str.h" + +static bool ReadComponent(Component *component, char *staticModule, char *overlayDefs, char *overlayTable); +static bool WriteComponent(Component *component); +static bool ComponentAddSuffix(Component *component, char *suffix); +static void FreeComponent(Component *component); +static void DebugPrintComponent(Component *component); + +bool ConvertComponent(Options *options, char *staticModule, char *overlayDefs, char *overlayTable) { + bool finalSuccess = false; + Component component; + memset(&component, 0, sizeof(component)); + + bool success = ReadComponent(&component, staticModule, overlayDefs, overlayTable); + if (success) { + DebugPrintComponent(&component); + if (!options->overlayModules || CompressOverlayModules(&component)) { + if (!options->overlayDigest || CalculateHMAC_OverlayModules(&component, options->digestType, options->digestKey)) { + if (!options->staticModule || CompressStaticModule(&component, options->headerSize)) { + if (options->outSuffix == NULL || ComponentAddSuffix(&component, options->outSuffix)) { + DebugPrintComponent(&component); + finalSuccess = WriteComponent(&component); + } + } + } + } + } + + FreeComponent(&component); + return finalSuccess; +} + +static bool ReadComponent(Component *component, char *staticModule, char *overlayDefs, char *overlayTable) { + bool finalSuccess = false; + + bool success = ReadOverlayDefs(component, overlayDefs); + if (success) { + success = ReadStaticModule(component, staticModule); + if (success) { + success = ReadOverlayTable(component, overlayTable); + if (success) { + finalSuccess = ReadOverlayModules(component); + } + } + } + + return finalSuccess; +} + +static bool WriteComponent(Component *component) { + bool finalSuccess = false; + + bool success = WriteOverlayDefs(component); + if (success) { + success = WriteStaticModule(component); + if (success) { + success = WriteOverlayTable(component); + if (success) { + finalSuccess = WriteOverlayModules(component); + } + } + } + + return finalSuccess; +} + +static bool ComponentAddSuffix(Component *component, char *suffix) { + if (suffix == NULL || *suffix == '\0') return true; + + bool finalSuccess = false; + bool success = AddSuffixOverlayDefs(component, suffix); + if (success) { + success = AddSuffixStaticModule(component, suffix); + if (success) { + success = AddSuffixOverlayTable(component, suffix); + if (success) { + finalSuccess = AddSuffixOverlayModules(component, suffix); + } + } + } + + return finalSuccess; +} + +static void FreeComponent(Component *component) { + FreeOverlayDefs(component); + FreeStaticModule(component); + FreeOverlayTable(component); + FreeOverlayModules(component); + component->numOverlays = 0; +} + +static void DebugPrintComponent(Component *component) { + int i; + char *filename; + char c; + uint staticParamsOffset = *(uint *)(component->staticModule.footerContent + 4); + StaticParams *staticParams = (StaticParams *)(component->staticModule.fileInfo.content + staticParamsOffset); + + DebugPrintf("-------------------------------------------------------------\n"); + + DebugPrintf("static.buffer.filename = %s\n" + " .ptr = %p\n" + " .size = %p %9d\n" + " .compressed = %p %9d\n" + " .footerSize = %p %9d\n" + " .footer = %p\n" + " .footer.magicNumber = %08x %9s\n" + " .staticParamsOffset = %p %9d\n" + " .digestParamsOffset = %p %9d\n", + component->staticModule.fileInfo.filename, + component->staticModule.fileInfo.content, + component->staticModule.fileInfo.fileSize, component->staticModule.fileInfo.fileSize, + component->staticModule.fileInfo.compressedSize, component->staticModule.fileInfo.compressedSize, + component->staticModule.footerSize, component->staticModule.footerSize, + component->staticModule.footerContent, + *(uint *)(component->staticModule.footerContent + STATIC_FOOTER_MAGIC_OFFSET), (*(uint *)(component->staticModule.footerContent + STATIC_FOOTER_MAGIC_OFFSET) == 0xDEC00621) ? "NITROCODE" : "UNKNOWN!!", + *(uint *)(component->staticModule.footerContent + STATIC_FOOTER_STATIC_PARAM_OFFSET), *(uint *)(component->staticModule.footerContent + STATIC_FOOTER_STATIC_PARAM_OFFSET), + *(uint *)(component->staticModule.footerContent + STATIC_FOOTER_DIGEST_PARAM_OFFSET), *(uint *)(component->staticModule.footerContent + STATIC_FOOTER_DIGEST_PARAM_OFFSET)); + + DebugPrintf("static.Params = %p\n" + " .Params.autoloadList = %p\n" + " .Params.autoloadListEnd = %p\n" + " .Params.autoloadStart = %p\n" + " .Params.staticBssStart = %p\n" + " .Params.staticBssEnd = %p\n" + " .Params.compressedStatic = %p\n", + component->staticModule.fileInfo.content + staticParamsOffset, + staticParams->autoloadList, + staticParams->autoloadListEnd, + staticParams->autoloadStart, + staticParams->staticBssStart, + staticParams->staticBssEnd, + staticParams->compressedStatic); + + DebugPrintf("-------------------------------------------------------------\n"); + DebugPrintf("numOverlays = %d\n", component->numOverlays); + DebugPrintf("-------------------------------------------------------------\n"); + + DebugPrintf("ovdefs.buffer.filename = %s\n" + " .ptr = %p\n" + " .size = %p %9d\n" + " .compressed = %p %9d\n" + " .header = %p\n" + " .header.loadAddress = %p\n" + " .header.entryAddress = %p\n" + " .header.moduleSize = %p %9d\n" + " .header.autoloadDone = %p\n" + " .dirname = %s\n", + component->overlayDefs.fileInfo.filename, + component->overlayDefs.fileInfo.content, + &component->overlayDefs.fileInfo.fileSize, component->overlayDefs.fileInfo.fileSize, + &component->overlayDefs.fileInfo.compressedSize, component->overlayDefs.fileInfo.compressedSize, + component->overlayDefs.header, + *(uint *)(component->overlayDefs.header + OVERLAY_DEFS_HEADER_LOAD_ADDRESS_OFFSET), + *(uint *)(component->overlayDefs.header + OVERLAY_DEFS_HEADER_ENTRY_ADDRESS_OFFSET), + component->overlayDefs.header + OVERLAY_DEFS_HEADER_MODULE_SIZE_OFFSET, *(uint *)(component->overlayDefs.header + OVERLAY_DEFS_HEADER_MODULE_SIZE_OFFSET), + *(uint *)(component->overlayDefs.header + OVERLAY_DEFS_HEADER_AUTOLOAD_DONE_OFFSET), + component->dirName); + + filename = component->overlayFilenames; + for (i = 0; i < component->numOverlays; i++) { + DebugPrintf(" .filename[%2d] = %s\n", i, filename); + do { + c = *filename; + filename++; + } while (c != '\0'); + } + + DebugPrintf("-------------------------------------------------------------\n"); + DebugPrintf("-------------------------------------------------------------\n"); +} + +void ConvertFinal(Options *options) { + options->digestKey = StrDup(options->digestKey, NULL); + options->outSuffix = StrDup(options->outSuffix, NULL); +} diff --git a/tools/compstatic/component.h b/tools/compstatic/component.h new file mode 100644 index 00000000..fdcbd348 --- /dev/null +++ b/tools/compstatic/component.h @@ -0,0 +1,10 @@ +#ifndef COMPONENT_H +#define COMPONENT_H + +#include +#include "global.h" + +bool ConvertComponent(Options *options, char *staticModule, char *overlayDefs, char *overlayTable); +void ConvertFinal(Options *options); + +#endif // COMPONENT_H diff --git a/tools/compstatic/compress.c b/tools/compstatic/compress.c new file mode 100644 index 00000000..528d0ad3 --- /dev/null +++ b/tools/compstatic/compress.c @@ -0,0 +1,333 @@ +#include +#include +#include +#include "component.h" +#include "compress.h" +#include "digest.h" +#include "global.h" +#include "misc.h" +#include "overlay_table.h" +#include "print.h" +#include "static_module.h" + +static int Compress(char *content, int size); +static int LZCompressRV(char *uncompressed, int uncompressedSize, char *compressed, int compressedSize); +static int FindMatched(char *chunk, int chunkSize, char *remainder, int remainderSize, int *optimalRemainderIdx); +static int HowManyMatched(char *buffer1, char *buffer2, int size); +static int CheckOverwrite(int sourceSize, char *compressed, int compressedSize, int *newSourceSize, int *newCompressedSize); + +bool CompressOverlayModules(Component *component) { + OverlayModule *overlayModule = component->overlayModules; + char *overlayTable = component->overlayTable.table; + DebugPrintf("Compressing OverlayModules\n"); + if (component->numOverlays == 0 || overlayModule == NULL || overlayTable == NULL) { + DebugPrintf("No overlay to compress\n"); + } else { + for (int i = 0; i < component->numOverlays; i++) { + if ((overlayTable[OT_COMPRESSED_FLAGS_OFFSET] & 1) == 0) { + if (overlayModule->fileInfo.fileSize < *(uint *)(overlayTable + OT_FILESIZE_OFFSET)) { + ErrorPrintf("Overlay module file is shorter than the size reported in the overlay table\n" + "FileSize=%d InOverlayTable=%d\n", overlayModule->fileInfo.fileSize, *(uint *)(overlayTable + OT_FILESIZE_OFFSET)); + return false; + } + int compressResult = Compress(overlayModule->fileInfo.content, *(int *)(overlayTable + OT_FILESIZE_OFFSET)); + if (compressResult < 0) { + if (compressResult == -2 || compressResult != -1) return false; + + printf("OverlayModule[%02d]. Not compressed %9d (enlarged or same size as before)\n", i, overlayModule->fileInfo.fileSize); + } else { + if (compressResult > 0x00ffffff) { + ErrorPrintf("Compressed file size too large (over 24bit wide)\n"); + } + printf("OverlayModule[%02d]. Compressed ... %9d -> %9d\n", i, overlayModule->fileInfo.fileSize, compressResult); + uint *overlayTableCompressedSize = (uint *)(overlayTable + OT_COMPRESSED_FILESIZE_OFFSET); + *overlayTableCompressedSize = (*overlayTableCompressedSize & 0xff000000) | (compressResult & 0x00ffffff); + overlayModule->fileInfo.compressedSize = compressResult & 0x00ffffff; + overlayModule->fileInfo.compressedSize = compressResult & 0x00ffffff; + overlayTable[OT_COMPRESSED_FLAGS_OFFSET] |= 1; + overlayModule->fileInfo.rewrite = true; + component->overlayTable.fileInfo.rewrite = true; + } + } else { + printf("OverlayModule[%02d]. Already compressed\n", i); + } + overlayModule++; + overlayTable += OVERLAY_ENTRY_SIZE; + } + } + return true; +} + +bool CompressStaticModule(Component *component, int headerSize) { + bool success; + + int staticParamsOffset = *(int *)(component->staticModule.footerContent + 4); + char *content = component->staticModule.fileInfo.content; + StaticParams *staticParams = (StaticParams *)(content + staticParamsOffset); + if (staticParams->compressedStatic == 0 && + component->staticModule.fileInfo.compressedSize == 0) { + if (headerSize < 0) { + ErrorPrintf("Specified header size is less than 0 (=%d)\n", headerSize); + success = false; + } else if (component->staticModule.fileInfo.fileSize < headerSize) { + printf("StaticModule ..... Not compressed (Module is smaller than the header [%d bytes])\n", headerSize); + success = true; + } else { + int compressResult = + Compress(component->staticModule.fileInfo.content + headerSize, + component->staticModule.fileInfo.fileSize - headerSize); + if (compressResult < 0) { + if (compressResult == -2 || compressResult != -1) { + success = false; + } else { + printf("StaticModule ..... Not compressed (enlarged or same size as before)\n"); + success = true; + } + } else { + component->staticModule.fileInfo.compressedSize = compressResult + headerSize; + printf("StaticModule ..... Compressed ... %9d -> %9d\n", + component->staticModule.fileInfo.fileSize, component->staticModule.fileInfo.compressedSize); + int *header = (int *)component->overlayDefs.header; + header[2] = component->staticModule.fileInfo.compressedSize; + staticParams->compressedStatic = component->staticModule.fileInfo.compressedSize + header[0]; + CopyBuffer(component->staticModule.footerContent, + component->staticModule.fileInfo.content + ALIGN_4(component->staticModule.fileInfo.compressedSize), + component->staticModule.footerSize); + component->overlayDefs.fileInfo.rewrite = true; + component->staticModule.fileInfo.rewrite = true; + success = true; + } + } + } else { + printf("StaticModule ..... Already compressed\n"); + success = true; + } + return success; +} + +bool CalculateHMAC_OverlayModules(Component *component, int digestType, char *digestKey) { + bool success; + + OverlayModule *overlayModule = component->overlayModules; + char *overlayTable = component->overlayTable.table; + int numOverlays = component->numOverlays; + if (numOverlays == 0 || overlayModule == NULL || overlayTable == NULL) { + DebugPrintf("No overlay to calculate HMAC\n"); + success = true; + } else { + bool initDigestSuccess = Init_Digest(digestType, digestKey); + if (!initDigestSuccess) { + ErrorPrintf("Cannot setup digest library\n"); + success = false; + } else { + DebugPrintf("Calculating HMAC for OverlayModules\n"); + int digestParamsOffset = *(int *)(component->staticModule.footerContent + STATIC_FOOTER_DIGEST_PARAM_OFFSET); + char *content = component->staticModule.fileInfo.content; + char *digestParams = (char *)(content + digestParamsOffset); + for (int i = 0; i < numOverlays; i++) { + if ((overlayTable[OT_COMPRESSED_FLAGS_OFFSET] & 2U) != 0) { + printf("OverlayModule[%02d]: HMAC already calculated - do it again.\n", i); + } + if ((uint)overlayModule->fileInfo.fileSize < *(uint *)(overlayTable + OT_FILESIZE_OFFSET)) { + ErrorPrintf("Overlay module file is shorter than the size reported in overlay table\n" + " File size=%d InOverlayTabe=%d\n", overlayModule->fileInfo.fileSize, *(uint *)(overlayTable + OT_FILESIZE_OFFSET)); + return false; + } + uint overlaySize = *(uint *)(overlayTable + OT_COMPRESSED_FILESIZE_OFFSET) & 0x00ffffff; + if (overlaySize == 0) { + overlaySize = *(uint *)(overlayTable + OT_FILESIZE_OFFSET); + } + + printf("OverlayModule[%02d]", i); + Calc_Digest(overlayModule->fileInfo.content, overlaySize, digestParams, false); + overlayTable[OT_COMPRESSED_FLAGS_OFFSET] |= 2; + component->staticModule.fileInfo.rewrite = true; + component->overlayTable.fileInfo.rewrite = true; + digestParams += DIGEST_HASH_SIZE; + overlayModule++; + overlayTable += OVERLAY_ENTRY_SIZE; + } + printf("OverlayTable "); + Calc_Digest(component->overlayTable.table, numOverlays * OVERLAY_ENTRY_SIZE, content + digestParamsOffset - DIGEST_HASH_SIZE, true); + success = true; + } + } + return success; +} + +static int Compress(char *content, int size) { + int ret; + int sourceOffset; + int compressedOffset; + + char *compressed = malloc(size); + char *compressedCpy = compressed; + if (compressed == NULL) { + ErrorPrintf("Cannot allocate memory size=%d\n", size); + ret = -2; + } else if (((size_t)content % 4) == 0) { + char *contentCpy = content; + int sizeCpy = size; + int compressedSize = size; + int lzResult = LZCompressRV(content, size, compressed, size); + if (lzResult < 0) { + DebugPrintf("Compressed buffer size exceeds original data size.\n"); + free(compressedCpy); + ret = -1; + } else { + compressedSize -= lzResult; + compressed += lzResult; + DebugPrintf("1: source size = %d compressed = %d\n", size, compressedSize); + int overwriteResult = CheckOverwrite(sizeCpy, compressed, compressedSize, &sourceOffset, &compressedOffset); + if (overwriteResult == 0) { + contentCpy += sourceOffset; + sizeCpy -= sourceOffset; + compressed += compressedOffset; + compressedSize -= compressedOffset; + DebugPrintf(" !! Shrink back Compressed region to avoid overwriting.\n" + " !! Expand non-compressed region = +%d\n" + "2: source size = %d compressed = %d\n", sourceOffset, sizeCpy, compressedSize); + } + int compressedEnd = compressedSize + sourceOffset; + uint compressedEndAligned = ALIGN_4(compressedEnd); + ret = compressedEndAligned + 8; + if (ret < size) { + CopyBuffer(compressed, contentCpy, compressedSize); + free(compressedCpy); + for (int i = compressedEnd; i < (int)compressedEndAligned; i++) { + content[i] = -1; + } + char *contentEnd = content + compressedEndAligned; + *(uint *)contentEnd = (*(uint *)contentEnd & 0xff000000) | (ret - sourceOffset) & 0xffffff; + char compressedEndU8 = (char)compressedEnd; + char retU8 = (char)ret; + *(contentEnd + 3) = retU8 - compressedEndU8; + *(int *)(contentEnd + 4) = size - ret; + } else { + DebugPrintf("Compressed buffer size exceeds or equals original data size.\n"); + free(compressedCpy); + ret = -1; + } + } + } else { + ErrorPrintf("Top of buffer is not aligned by 4.\n"); + ret = -2; + } + return ret; +} + +static int LZCompressRV(char *uncompressed, int uncompressedSize, char *compressed, int compressedSize) { + int optimalRemainderIdx; + ushort optimalRemainderIdx16; + int bytesLeft = uncompressedSize; + while (true) { + if (bytesLeft < 1) return compressedSize; + if (compressedSize < 1) break; + + uint bitVector = 0; + int compressedPtr = compressedSize - 1; + compressedSize = compressedPtr; + for (int i = 0; i < 8; i++) { + bitVector <<= 1; + if (bytesLeft > 0) { + char *remainder = uncompressed + bytesLeft; + int bytesRead = uncompressedSize - bytesLeft; + int chunkSize = MIN(bytesLeft, 0x12); + char *chunk = remainder - chunkSize; + bytesRead = MIN(bytesRead, 0x1002); + int numMatches = FindMatched(chunk, chunkSize, remainder, bytesRead, &optimalRemainderIdx); + if (numMatches < 3) { + if (compressedSize < 1) return -1; + + compressedSize--; + bytesLeft--; + compressed[compressedSize] = uncompressed[bytesLeft]; + } else { + if (compressedSize < 2) return -1; + + bytesLeft -= numMatches; + optimalRemainderIdx -= 2; + optimalRemainderIdx16 = (ushort)optimalRemainderIdx & 0xfff; + compressed[compressedSize - 1] = + (char)((ushort)(((short)numMatches - 3) * 0x1000) >> 8) | (char)(optimalRemainderIdx16 >> 8); + compressedSize -= 2; + compressed[compressedSize] = (char)optimalRemainderIdx16; + bitVector |= 1; + } + } + } + compressed[compressedPtr] = (char)bitVector; + } + return -1; +} + +// `chunk` is a pointer to a section of the uncompressed byte array +// of size `chunkSize`. `remainder` is a pointer to the remainder of the +// byte array of size `remainderSize`. +// +// This function iterates over all the bytes after the chunk to find another +// chunk with the most bytes matching `chunk`. It returns the number of +// byte-wise matches found in the optimal chunk. +// +// `optimalRemainderIdx` points to the end of the optimal chunk. +static int FindMatched(char *chunk, int chunkSize, char *remainder, int remainderSize, int *optimalRemainderIdx) { + char lastChar = chunk[chunkSize - 1]; + int maxMatches = 0; + for (int i = 0; i < remainderSize; i++) { + if (lastChar == remainder[i]) { + int bufferSize = MIN(i + 1, chunkSize); + int numMatches = HowManyMatched(chunk + chunkSize - 1, remainder + i, bufferSize); + if (numMatches > maxMatches) { + *optimalRemainderIdx = i; + maxMatches = numMatches; + } + } + } + return maxMatches; +} + +// Returns the number of consecutive bytes that match in both buffers, starting +// from the end of each buffer. +static int HowManyMatched(char *buffer1, char *buffer2, int size) { + int i = 0; + for (; i < size && *buffer1 == *buffer2; buffer1--) { + buffer2--; + i++; + } + return i; +} + +static int CheckOverwrite(int sourceSize, char *compressed, int compressedSize, int *sourceOffset, int *compressedOffset) { + do { + if (sourceSize < 1) { + *sourceOffset = 0; + *compressedOffset = 0; + return 1; + } + compressedSize--; + uint bitVector = compressed[compressedSize]; + for (int i = 0; i < 8; i++) { + if (sourceSize > 0) { + if ((bitVector & 0x80) == 0) { + compressedSize--; + sourceSize--; + } else { + int nextCompressedSize = compressedSize - 2; + sourceSize -= ((byte)compressed[compressedSize - 1] >> 4) + 3; + if (sourceSize < 0) { + ErrorPrintf("System error in CheckOverwrite???\n"); + exit(-1); + } + compressedSize = nextCompressedSize; + if (sourceSize < nextCompressedSize) { + *sourceOffset = sourceSize; + *compressedOffset = compressedSize; + return 0; + } + } + bitVector <<= 1; + } + } + + } while (true); +} diff --git a/tools/compstatic/compress.h b/tools/compstatic/compress.h new file mode 100644 index 00000000..ed62fac3 --- /dev/null +++ b/tools/compstatic/compress.h @@ -0,0 +1,11 @@ +#ifndef COMPRESS_H +#define COMPRESS_H + +#include +#include "component.h" + +bool CompressOverlayModules(Component *component); +bool CompressStaticModule(Component *component, int headerSize); +bool CalculateHMAC_OverlayModules(Component *component, int digestType, char *digestKey); + +#endif // COMPRESS_H diff --git a/tools/compstatic/digest.c b/tools/compstatic/digest.c new file mode 100644 index 00000000..d6f722a4 --- /dev/null +++ b/tools/compstatic/digest.c @@ -0,0 +1,370 @@ +#include +#include +#include +#include +#include +#include "digest.h" +#include "files.h" +#include "global.h" +#include "misc.h" +#include "print.h" + +typedef struct { + uint intermediateHash[5]; + uint lengthLow; + uint lengthHigh; + int messageBlockIdx; + byte messageBlock[64]; + bool computed; + uint corrupted; +} DGTHash2Context; + +typedef bool (*Hash2ResetCb)(DGTHash2Context *hashCtx); +typedef uint (*Hash2SetSourceCb)(DGTHash2Context *hashCtx, char *digestKey, int digestKeySize); +typedef uint (*Hash2GetDigestCb)(DGTHash2Context *hashCtx, char *digestBuffer); + +typedef struct { + int unk0; + int blockSize; + DGTHash2Context *hashCtx; + char *unkC; + Hash2ResetCb hash2Reset; + Hash2SetSourceCb hash2SetSource; + Hash2GetDigestCb hash2GetDigest; +} HmacParam; + +static void DGT_Hash2CalcHmac(char *hash, char *content, int size, char *digestKey, int digestKeySize); +static bool DGT_SetOverlayTableMode(bool mode); +static bool DGT_Hash2Reset(DGTHash2Context *hashCtx); +static uint DGT_Hash2SetSource(DGTHash2Context *hashCtx, char *digestKey, int digestKeySize); +static uint DGT_Hash2GetDigest(DGTHash2Context *hashCtx, char *digestBuffer); +static void DGT_Hash2SetPadding(DGTHash2Context *hashCtx); +static void DGT_Hash2DoProcess(DGTHash2Context *hashCtx); +static void HmacCalc(char *hash, char *content, int size, char *digestKey, int digestKeySize, HmacParam *param); + +// Set default DigestFunc +static DigestFunc sDigestFunc = DGT_Hash2CalcHmac; + +static DigestFunc sDigestFuncs[] = { NULL, DGT_Hash2CalcHmac }; +static char sDefaultDigestKey[] = { + 0x21, 0x06, 0xc0, 0xde, 0xba, 0x98, 0xce, 0x3f, 0xa6, 0x92, 0xe3, 0x9d, + 0x46, 0xf2, 0xed, 0x01, 0x76, 0xe3, 0xcc, 0x08, 0x56, 0x23, 0x63, 0xfa, + 0xca, 0xd4, 0xec, 0xdf, 0x9a, 0x62, 0x78, 0x34, 0x8f, 0x6d, 0x63, 0x3c, + 0xfe, 0x22, 0xca, 0x92, 0x20, 0x88, 0x97, 0x23, 0xd2, 0xcf, 0xae, 0xc2, + 0x32, 0x67, 0x8d, 0xfe, 0xca, 0x83, 0x64, 0x98, 0xac, 0xfd, 0x3e, 0x37, + 0x87, 0x46, 0x58, 0x24, +}; + +static char *sDigestKey; +static int sDigestKeySize; +static bool sOverlayTableMode; + +bool Init_Digest(uint digestType, char *digestKey) { + bool success; + + if (digestType < 1 || digestType > 2) { + ErrorPrintf("Unknown digest type\n"); + success = false; + } else { + DigestFunc digestFunc = sDigestFuncs[digestType - 1]; + if (digestFunc == NULL) { + ErrorPrintf("Unsupported digest\n"); + success = false; + } else { + sDigestFunc = digestFunc; + if (sDigestKey != NULL) { + free(sDigestKey); + sDigestKey = NULL; + } + if (digestKey == NULL) { + sDigestKey = calloc(1, DIGEST_KEY_SIZE); + if (sDigestKey == NULL) { + ErrorPrintf("Cannot allocate memory.\n"); + return false; + } + memcpy(sDigestKey, sDefaultDigestKey, DIGEST_KEY_SIZE); + sDigestKeySize = DIGEST_KEY_SIZE; + } else { + sDigestKeySize = ReadFile(digestKey, &sDigestKey); + if (sDigestKeySize < 0) { + return false; + } + if (sDigestKeySize < DIGEST_KEY_SIZE) { + ErrorPrintf("Key file size should be >= %d bytes\n", DIGEST_KEY_SIZE); + return false; + } + } + success = true; + } + } + return success; +} + +void Calc_Digest(char *content, int size, char *hash, bool overlayTableMode) { + byte hashBuffer[40]; + + bool oldMode = DGT_SetOverlayTableMode(overlayTableMode); + sDigestFunc((char *)hashBuffer, content, size, sDigestKey, sDigestKeySize); + DGT_SetOverlayTableMode(oldMode); + int iCpy = 0; + for (int i = 0; i < 20; i++) { + hashBuffer[i] = hashBuffer[iCpy + 1] ^ hashBuffer[iCpy]; + iCpy++; + } + printf(": Digest "); + for (int i = 0; i < 20; i++) { + printf("%02X", hashBuffer[i]); + } + printf(" %8ld\n", (long int)size); + CopyBuffer((char *)hashBuffer, hash, 20); +} + +static void DGT_Hash2CalcHmac(char *hash, char *content, int size, char *digestKey, int digestKeySize) { + DGTHash2Context hashCtx; + char unkBuffer1[0x20]; + HmacParam param = {0}; + + param.unk0 = 20; + param.blockSize = DIGEST_KEY_SIZE; + param.hashCtx = &hashCtx; + param.unkC = unkBuffer1; + param.hash2Reset = DGT_Hash2Reset; + param.hash2SetSource = DGT_Hash2SetSource; + param.hash2GetDigest = DGT_Hash2GetDigest; + HmacCalc(hash, content, size, digestKey, digestKeySize, ¶m); +} + +static bool DGT_SetOverlayTableMode(bool mode) { + bool oldMode = sOverlayTableMode; + sOverlayTableMode = mode; + return oldMode; +} + +static bool DGT_Hash2Reset(DGTHash2Context *hashCtx) { + if (hashCtx != NULL) { + hashCtx->intermediateHash[0] = 0x67452301; + hashCtx->intermediateHash[1] = 0xefcdab89; + hashCtx->intermediateHash[2] = 0x98badcfe; + hashCtx->intermediateHash[3] = 0x10325476; + hashCtx->intermediateHash[4] = 0xc3d2e1f0; + hashCtx->lengthLow = 0; + hashCtx->lengthHigh = 0; + hashCtx->messageBlockIdx = 0; + hashCtx->computed = false; + hashCtx->corrupted = 0; + } + return hashCtx == NULL; +} + +static uint DGT_Hash2SetSource(DGTHash2Context *hashCtx, char *digestKey, int digestKeySize) { + uint ret; + + if (digestKeySize == 0) { + ret = 0; + } else if (hashCtx == NULL || digestKey == NULL) { + ret = 1; + } else if (!hashCtx->computed) { + if (hashCtx->corrupted == 0) { + while (digestKeySize -= 1, digestKeySize != -1 && hashCtx->corrupted == 0) { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = *digestKey; + hashCtx->messageBlockIdx += 1; + hashCtx->lengthLow += 8; + if (hashCtx->messageBlockIdx == 0 && (hashCtx->lengthHigh += 1, hashCtx->lengthHigh == 0)) { + hashCtx->corrupted = 1; + } + if (hashCtx->messageBlockIdx == 0x40) { + DGT_Hash2DoProcess(hashCtx); + } + digestKey++; + } + ret = 0; + } else { + ret = hashCtx->corrupted; + } + } else { + hashCtx->corrupted = 3; + ret = 3; + } + return ret; +} + +static uint DGT_Hash2GetDigest(DGTHash2Context *hashCtx, char *digestBuffer) { + uint ret; + + if (hashCtx == NULL || digestBuffer == NULL) { + ret = 1; + } else if (hashCtx->corrupted == 0) { + if (!hashCtx->computed) { + DGT_Hash2SetPadding(hashCtx); + for (int i = 0; i < 0x40; i++) { + hashCtx->messageBlock[i] = '\0'; + } + hashCtx->lengthLow = 0; + hashCtx->lengthHigh = 0; + hashCtx->computed = true; + } + for (int i = 0; i < 20; i++) { + digestBuffer[i] = (char)(*(uint *)(hashCtx->messageBlock + (i >> 2) * 4 + -0x20) >> ((3u - ((byte)i % 4)) * 8u & 0x1f)); + } + ret = 0; + } else { + ret = hashCtx->corrupted; + } + return ret; +} + +static void DGT_Hash2SetPadding(DGTHash2Context *hashCtx) { + if (hashCtx->messageBlockIdx < 0x38) { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = -0x80; + hashCtx->messageBlockIdx += 1; + while (hashCtx->messageBlockIdx < 0x38) { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = '\0'; + hashCtx->messageBlockIdx += 1; + } + } else { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = -0x80; + hashCtx->messageBlockIdx += 1; + while (hashCtx->messageBlockIdx < 0x40) { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = '\0'; + hashCtx->messageBlockIdx += 1; + } + DGT_Hash2DoProcess(hashCtx); + while (hashCtx->messageBlockIdx < 0x38) { + hashCtx->messageBlock[hashCtx->messageBlockIdx] = '\0'; + hashCtx->messageBlockIdx += 1; + } + } + hashCtx->messageBlock[0x38] = hashCtx->lengthHigh >> 0x18; + hashCtx->messageBlock[0x39] = (byte)(hashCtx->lengthHigh >> 0x10); + hashCtx->messageBlock[0x3a] = (byte)(hashCtx->lengthHigh >> 8); + hashCtx->messageBlock[0x3b] = (byte)(hashCtx->lengthHigh); + hashCtx->messageBlock[0x3c] = hashCtx->lengthLow >> 0x18; + hashCtx->messageBlock[0x3d] = (byte)(hashCtx->lengthLow >> 0x10); + hashCtx->messageBlock[0x3e] = (byte)(hashCtx->lengthLow >> 8); + hashCtx->messageBlock[0x3f] = (byte)(hashCtx->lengthLow); + DGT_Hash2DoProcess(hashCtx); +} + +// SHA hash +static void DGT_Hash2DoProcess(DGTHash2Context *hashCtx) { + uint temp; + int temp2; + uint buffer[99]; + int i, idx; + + if (sOverlayTableMode) { + buffer[10] = *(uint *)(hashCtx->messageBlock + 0x18); + buffer[9] = *(uint *)(hashCtx->messageBlock + 0x38); + *(uint *)(hashCtx->messageBlock + 0x18) = 0; + *(uint *)(hashCtx->messageBlock + 0x38) = 0; + } + for (i = 0; i < 0x10; i++) { + buffer[i + 0x10] = (uint)(byte)hashCtx->messageBlock[i * 4] << 0x18; + buffer[i + 0x10] = (uint)(byte)hashCtx->messageBlock[i * 4 + 1] << 0x10 | buffer[i + 0x10]; + buffer[i + 0x10] = (uint)(byte)hashCtx->messageBlock[i * 4 + 2] << 8 | buffer[i + 0x10]; + buffer[i + 0x10] = (uint)(byte)hashCtx->messageBlock[i * 4 + 3] | buffer[i + 0x10]; + } + for (i = 0x10; i < 0x50; i++) { + temp = buffer[i + 0xd] ^ buffer[i + 8] ^ buffer[i + 2] ^ buffer[i]; + buffer[i + 0x10] = temp << 1 | (uint)((int)temp < 0); + } + buffer[14] = hashCtx->intermediateHash[1]; + buffer[13] = hashCtx->intermediateHash[2]; + buffer[12] = hashCtx->intermediateHash[3]; + buffer[11] = hashCtx->intermediateHash[4]; + buffer[15] = hashCtx->intermediateHash[0]; + for (i = 0; i < 0x14; i++) { + temp2 = (~buffer[14] & buffer[12] | buffer[14] & buffer[13]) + + (buffer[15] << 5 | buffer[15] >> 0x1b) + buffer[11]; + idx = i + 0x10; + buffer[11] = buffer[12]; + buffer[12] = buffer[13]; + buffer[13] = buffer[14] << 0x1e | buffer[14] >> 2; + buffer[14] = buffer[15]; + buffer[15] = buffer[idx] + temp2 + 0x5a827999; + } + for (i = 0x14; i < 0x28; i = i + 1) { + temp2 = (buffer[13] ^ buffer[14] ^ buffer[12]) + (buffer[15] << 5 | buffer[15] >> 0x1b) + + buffer[11]; + idx = i + 0x10; + buffer[11] = buffer[12]; + buffer[12] = buffer[13]; + buffer[13] = buffer[14] << 0x1e | buffer[14] >> 2; + buffer[14] = buffer[15]; + buffer[15] = buffer[idx] + temp2 + 0x6ed9eba1; + } + for (i = 0x28; i < 0x3c; i++) { + temp2 = (buffer[12] & buffer[13] | (buffer[12] | buffer[13]) & buffer[14]) + + (buffer[15] << 5 | buffer[15] >> 0x1b) + buffer[11]; + idx = i + 0x10; + buffer[11] = buffer[12]; + buffer[12] = buffer[13]; + buffer[13] = buffer[14] << 0x1e | buffer[14] >> 2; + buffer[14] = buffer[15]; + buffer[15] = buffer[idx] + temp2 + 0x8f1bbcdc; + } + for (i = 0x3c; i < 0x50; i++) { + temp2 = (buffer[13] ^ buffer[14] ^ buffer[12]) + (buffer[15] << 5 | buffer[15] >> 0x1b) + + buffer[11]; + idx = i + 0x10; + buffer[11] = buffer[12]; + buffer[12] = buffer[13]; + buffer[13] = buffer[14] << 0x1e | buffer[14] >> 2; + buffer[14] = buffer[15]; + buffer[15] = buffer[idx] + temp2 + 0xca62c1d6; + } + hashCtx->intermediateHash[0] += buffer[15]; + hashCtx->intermediateHash[1] += buffer[14]; + hashCtx->intermediateHash[2] += buffer[13]; + hashCtx->intermediateHash[3] += buffer[12]; + hashCtx->intermediateHash[4] += buffer[11]; + hashCtx->messageBlockIdx = 0; + if (sOverlayTableMode) { + *(uint *)(hashCtx->messageBlock + 0x18) = buffer[10]; + *(uint *)(hashCtx->messageBlock + 0x38) = buffer[9]; + } +} + +static void HmacCalc(char *hash, char *content, int size, char *digestKey, int digestKeySize, HmacParam *param) { + char digestBuffer[0x4C]; + char *key; + int keySize; + char innerKey[0x48]; + char outerKey[0x40]; + int i; + + if (hash != NULL && content != NULL && size != 0 && digestKey != NULL && + digestKeySize != 0 && param != NULL) { + if (param->blockSize < digestKeySize) { + param->hash2Reset(param->hashCtx); + param->hash2SetSource(param->hashCtx, digestKey, digestKeySize); + param->hash2GetDigest(param->hashCtx, digestBuffer); + key = digestBuffer; + keySize = param->unk0; + } else { + key = digestKey; + keySize = digestKeySize; + } + for (i = 0; i < keySize; i++) { + innerKey[i] = key[i] ^ 0x36; + } + for (; i < param->blockSize; i++) { + innerKey[i] = 0x36; + } + param->hash2Reset(param->hashCtx); + param->hash2SetSource(param->hashCtx, innerKey, param->blockSize); + param->hash2SetSource(param->hashCtx, content, size); + param->hash2GetDigest(param->hashCtx, param->unkC); + + for (i = 0; i < keySize; i++) { + outerKey[i] = key[i] ^ 0x5c; + } + for (; i < param->blockSize; i++) { + outerKey[i] = 0x5c; + } + param->hash2Reset(param->hashCtx); + param->hash2SetSource(param->hashCtx, outerKey, param->blockSize); + param->hash2SetSource(param->hashCtx, param->unkC, param->unk0); + param->hash2GetDigest(param->hashCtx, hash); + } +} diff --git a/tools/compstatic/digest.h b/tools/compstatic/digest.h new file mode 100644 index 00000000..578c45aa --- /dev/null +++ b/tools/compstatic/digest.h @@ -0,0 +1,15 @@ +#ifndef DIGEST_H +#define DIGEST_H + +#include +#include "global.h" + +#define DIGEST_KEY_SIZE (0x40) +#define DIGEST_HASH_SIZE (0x14) + +typedef void (*DigestFunc)(char *hash, char *content, int size, char *digestKey, int digestKeySize); + +bool Init_Digest(uint digestType, char *digestKey); +void Calc_Digest(char *content, int size, char *hash, bool overlayTableMode); + +#endif // DIGEST_H diff --git a/tools/compstatic/files.c b/tools/compstatic/files.c new file mode 100644 index 00000000..5f815b2e --- /dev/null +++ b/tools/compstatic/files.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#include +#include +#include +#include "files.h" +#include "global.h" +#include "print.h" +#include "str.h" + +char *GetDirName(char *filename) { + char *dirName; + + int i = strlen(filename); + while (true) { + i--; + if (i < 0) { + dirName = strdup("."); + return dirName; + } + if (filename[i] == '/' || filename[i] == '\\') break; + if (filename[i] == ':') { + dirName = malloc(i + 3); + if (dirName != NULL) { + strncpy(dirName, filename, i); + strcpy(dirName + i, ":."); + } + return dirName; + } + } + + // Same size as filename, but has null-character after directory name. + dirName = strdup(filename); + if (dirName == NULL) { + return NULL; + } + dirName[i] = '\0'; + return dirName; +} + +bool GetFiles(char *responseFile, SourceFiles *sourceFiles) { + char *filename; + bool success; + int numWords; + int wordStart; + char *content; + + char *dirName = GetDirName(responseFile); + int bytesRead = ReadFile(responseFile, &content); + if (bytesRead < 0) { + success = false; + } else { + numWords = 0; + wordStart = 0; + for (int i = 0; i < bytesRead; i++) { + if (content[i] == '\0') { + filename = StrCat(3, dirName, "/", &content[wordStart]); + sourceFiles->filenames[numWords] = filename; + + wordStart = i + 1; + numWords++; + if (numWords == NUM_SOURCE_FILES) break; + } + } + free(content); + free(dirName); + if (numWords == NUM_SOURCE_FILES) { + success = true; + } else { + while (numWords > 0) { + numWords--; + free(sourceFiles->filenames[numWords]); + } + ErrorPrintf("%s wrong format", responseFile); + success = false; + } + } + return success; +} + +// Returns size of file. +int ReadFile(char *filename, char **content) { + int bytesRead; + struct stat fileInfo; + FILE *fp = NULL; + *content = NULL; + + if (filename == NULL) { + ErrorPrintf("Not specified filename\n"); + } else { + int error = stat(filename, &fileInfo); + if ((error == 0) && (fp = fopen(filename, "rb"), fp != NULL)) { + *content = malloc(fileInfo.st_size); + if (*content == NULL) { + ErrorPrintf("Cannot allocate memory size=%d\n", fileInfo.st_size); + } else { + bytesRead = fread(*content, 1, fileInfo.st_size, fp); + if (bytesRead == fileInfo.st_size) { + DebugPrintf("%p %8d bytes ReadFile \'%s\'\n", *content, fileInfo.st_size, filename); + fclose(fp); + return fileInfo.st_size; + } + ErrorPrintf("Cannot read file \'%s\'\n", filename); + } + } + ErrorPrintf("Cannot read file \'%s\'\n", filename); + } + + if (*content != NULL) { + free(content); + } + if (fp != NULL) { + fclose(fp); + } + return -1; +} + +// Returns number of bytes written. +int WriteFile(char *filename, char *content, int size) { + FILE *fp = NULL; + int ret; + + DebugPrintf("%p %8d bytes WriteFile \'%s\'\n", content, size, filename); + fp = fopen(filename, "wb"); + if (fp == NULL) { + ErrorPrintf("Cannot open file \'%s\'\n", filename); + ret = -1; + } else { + int sizeWritten = fwrite(content, 1, size, fp); + if (size == sizeWritten) { + int closeResult = fclose(fp); + if (closeResult < 0) { + ErrorPrintf("Cannot close file \'%s\'\n", filename); + unlink(filename); + ret = -1; + } else { + ret = sizeWritten; + } + } else { + ErrorPrintf("Cannot write file \'%s\'\n", filename); + fclose(fp); + unlink(filename); + ret = -1; + } + } + return ret; +} diff --git a/tools/compstatic/files.h b/tools/compstatic/files.h new file mode 100644 index 00000000..e66d34db --- /dev/null +++ b/tools/compstatic/files.h @@ -0,0 +1,12 @@ +#ifndef FILES_H +#define FILES_H + +#include +#include "global.h" + +char *GetDirName(char *filename); +bool GetFiles(char *responseFile, SourceFiles *sourceFiles); +int ReadFile(char *filename, char **content); +int WriteFile(char *filename, char *content, int size); + +#endif // FILES_H diff --git a/tools/compstatic/global.h b/tools/compstatic/global.h new file mode 100644 index 00000000..e2db90c7 --- /dev/null +++ b/tools/compstatic/global.h @@ -0,0 +1,74 @@ +#ifndef GLOBAL_H +#define GLOBAL_H + +#include + +typedef unsigned char byte; +typedef unsigned short ushort; +typedef unsigned int uint; + +#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) +#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) + +#define ALIGN_4(addr) ((addr + 3U) & 0xfffffffc) + +typedef struct { + bool staticModule; + int headerSize; // size in bytes + bool overlayModules; + bool overlayDigest; + int digestType; + char *digestKey; + char *outSuffix; +} Options; + +#define SOURCE_FILES_STATIC_MODULE 0 +#define SOURCE_FILES_OVERLAY_DEFS 1 +#define SOURCE_FILES_OVERLAY_TABLE 2 +#define NUM_SOURCE_FILES 3 + +typedef struct { + char *filenames[NUM_SOURCE_FILES]; +} SourceFiles; + +extern bool gDebugMode; + +typedef struct { + char *filename; + char *content; + int fileSize; + int compressedSize; + bool rewrite; // File should be updated after compression +} FileInfo; // win32 sizeof == 0x14 + +typedef struct { + FileInfo fileInfo; + char *footerContent; + uint footerSize; +} StaticModule; // win32 sizeof == 0x1c + +typedef struct { + FileInfo fileInfo; + char *header; +} OverlayDefs; // win32 sizeof == 0x18 + +typedef struct { + FileInfo fileInfo; +} OverlayModule; // win32 sizeof == 0x14 + +typedef struct { + FileInfo fileInfo; + char *table; // == fileInfo.content +} OverlayTable; // win32 sizeof == 0x18 + +typedef struct { + StaticModule staticModule; + int numOverlays; + OverlayDefs overlayDefs; + char *overlayFilenames; + char *dirName; + OverlayTable overlayTable; + OverlayModule *overlayModules; +} Component; // win32 sizeof: 0x5c + +#endif // GLOBAL_H diff --git a/tools/compstatic/main.c b/tools/compstatic/main.c new file mode 100644 index 00000000..0c051d8a --- /dev/null +++ b/tools/compstatic/main.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include "component.h" +#include "files.h" +#include "global.h" +#include "print.h" +#include "str.h" + +bool gDebugMode = false; + +void InitializeOptions(Options *options) { + options->staticModule = false; + options->headerSize = 0x4000; + options->overlayModules = false; + options->overlayDigest = false; + options->digestType = 2; + options->digestKey = StrDup(NULL, NULL); + options->outSuffix = StrDup(NULL, "_LZ"); +} + +void usage(void) { + printf("NDS Development Tool - compstatic - Compress static module\n\n" + "Usage: compstatic [-sHSIZE|-9|-7] [-c] [-a[FILE]]\n" + " [-F] [-eSUFFIX] [-fRESFILE] [-d] [-h]\n" + " [STATICMODULE OVERLAYDEFS [OVERLAYTABLE]]\n\n" + " Compress component modules\n\n" + " -sHSIZE Compress STATICMODULE\n" + " without header region specified by HSIZE(bytes)\n" + " -9 Compress as ARM9 static module (HEADER_SIZE = 16k)\n" + " -7 Compress as ARM7 static module (HEADER_SIZE = 1k)\n" + " -c Compress overlay modules\n" + " -a[FILE] Generate overlay digest code with FILE as key\n" + " -F Overwrite original component files\n" + " -eSUFFIX SUFFIX for output file (default:\"_LZ\")\n" + " -fRESFILE Use response file to specify source files\n" + " -d Show debug messages (for test purpose)\n" + " -h Show this message\n\n"); +} + +int main(int argc, char *argv[]) { + int opt; + int useResponseFile = false; + int argsLeft; + char **remainingArgs; + char *overlayTable; + bool success; + SourceFiles sourceFiles; + Options options; + + InitializeOptions(&options); + while ((opt = getopt(argc, argv, "s:ca::A:97Fe:fdhv")) != -1) { + switch (opt) { + case '7': + options.staticModule = true; + options.headerSize = 0x400; + break; + case '9': + options.staticModule = true; + options.headerSize = 0x4000; + break; + // Not referenced in usage + case 'A': + options.digestType = atoi(optarg); + break; + case 'F': + options.outSuffix = StrDup(options.outSuffix, NULL); + break; + case 'a': + options.overlayDigest = true; + options.digestKey = StrDup(options.digestKey, optarg); + break; + case 'c': + options.overlayModules = true; + break; + case 'd': + gDebugMode = true; + break; + case 'e': + options.outSuffix = strdup(optarg); + break; + case 'f': + useResponseFile = true; + break; + case 's': + options.staticModule = true; + options.headerSize = atoi(optarg); + break; + default: + usage(); + break; + } + DebugPrintf("option -%c: %s\n", opt, (optarg == NULL) ? "No ARG" : optarg); + } + + argsLeft = argc - optind; + remainingArgs = &argv[optind]; + + DebugPrintf("argc=%d optind=%d\n", argsLeft, optind); + for (int i = 0; i < argsLeft; i++) { + DebugPrintf("argv[%d] = [%s]\n", i, argv[optind + i]); + } + + if (!useResponseFile || argsLeft != 1) { + if (!useResponseFile && (argsLeft == 2 || argsLeft == 3)) { + overlayTable = (argsLeft == 3) ? remainingArgs[2] : NULL; + success = ConvertComponent(&options, remainingArgs[0], remainingArgs[1], overlayTable); + } else { + usage(); + } + } else { + success = GetFiles(remainingArgs[0], &sourceFiles); + if (success) { + printf("StaticModule = %s\n", sourceFiles.filenames[SOURCE_FILES_STATIC_MODULE]); + printf("OverlayDefs = %s\n", sourceFiles.filenames[SOURCE_FILES_OVERLAY_DEFS]); + printf("OverlayTable = %s\n", sourceFiles.filenames[SOURCE_FILES_OVERLAY_TABLE]); + + success = ConvertComponent(&options, sourceFiles.filenames[SOURCE_FILES_STATIC_MODULE], sourceFiles.filenames[SOURCE_FILES_OVERLAY_DEFS], sourceFiles.filenames[SOURCE_FILES_OVERLAY_TABLE]); + free(sourceFiles.filenames[SOURCE_FILES_STATIC_MODULE]); + free(sourceFiles.filenames[SOURCE_FILES_OVERLAY_DEFS]); + free(sourceFiles.filenames[SOURCE_FILES_OVERLAY_TABLE]); + } + } + + ConvertFinal(&options); + if (!success) { + ErrorPrintf("exit...\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/tools/compstatic/misc.c b/tools/compstatic/misc.c new file mode 100644 index 00000000..e54bbb6b --- /dev/null +++ b/tools/compstatic/misc.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "global.h" +#include "misc.h" +#include "print.h" + +void CopyBuffer(char *src, char *dest, int size) { + if (dest < src) { + for (int i = 0; i < size; i++) { + dest[i] = src[i]; + } + } else { + for (int i = size - 1; i >= 0; i--) { + dest[i] = src[i]; + } + } +} + +void FreeBuffer(FileInfo *fileInfo) { + if (fileInfo->content != NULL) { + free(fileInfo->content); + fileInfo->content = NULL; + } + if (fileInfo->filename != NULL) { + free(fileInfo->filename); + fileInfo->filename = NULL; + } + fileInfo->compressedSize = 0; + fileInfo->fileSize = 0; + fileInfo->rewrite = false; +} + +bool AddSuffixBuffer(FileInfo *fileInfo, char *suffix) { + bool success; + + if (fileInfo->fileSize == 0 || fileInfo->filename == NULL || suffix == NULL || *suffix == '\0') { + success = true; + } else { + int filenameLength = strlen(fileInfo->filename); + int suffixLength = strlen(suffix); + char *dest = malloc(filenameLength + suffixLength + 1); + if (dest == NULL) { + ErrorPrintf("Cannot allocate memory.\n"); + success = false; + } else { + sprintf(dest, "%s%s", fileInfo->filename, suffix); + free(fileInfo->filename); + fileInfo->filename = dest; + fileInfo->rewrite = true; + success = true; + } + } + return success; +} diff --git a/tools/compstatic/misc.h b/tools/compstatic/misc.h new file mode 100644 index 00000000..b21351fd --- /dev/null +++ b/tools/compstatic/misc.h @@ -0,0 +1,10 @@ +#ifndef MISC_H +#define MISC_H + +#include "global.h" + +void CopyBuffer(char *src, char *dest, int size); +void FreeBuffer(FileInfo *fileInfo); +bool AddSuffixBuffer(FileInfo *fileInfo, char *suffix); + +#endif // MISC_H diff --git a/tools/compstatic/overlay_defs.c b/tools/compstatic/overlay_defs.c new file mode 100644 index 00000000..8839dfaa --- /dev/null +++ b/tools/compstatic/overlay_defs.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include "files.h" +#include "global.h" +#include "misc.h" +#include "overlay_defs.h" +#include "print.h" + +bool ReadOverlayDefs(Component *component, char *filename) { + int numWords; + int checkPtr; + bool success = false; + + DebugPrintf("Reading overlayDefs=%s\n", filename); + int fileSize = ReadFile(filename, &component->overlayDefs.fileInfo.content); + component->overlayDefs.fileInfo.fileSize = fileSize; + component->overlayDefs.fileInfo.compressedSize = 0; + component->overlayDefs.fileInfo.rewrite = false; + component->overlayDefs.fileInfo.filename = strdup(filename); + + if (component->overlayDefs.fileInfo.fileSize < 0) { + success = false; + } else if (component->overlayDefs.fileInfo.fileSize < MIN_OVERLAY_DEFS_FILE_SIZE) { + ErrorPrintf("Overlaydefs is too small (size=%d). Must be >= %d\n", component->overlayDefs.fileInfo.fileSize, MIN_OVERLAY_DEFS_FILE_SIZE); + success = false; + } else { + component->overlayDefs.header = component->overlayDefs.fileInfo.content; + component->overlayFilenames = component->overlayDefs.header + OVERLAY_DEFS_FILENAMES_OFFSET; + component->dirName = GetDirName(filename); + if (component->dirName == NULL) { + success = false; + } else { + // Count the number of words in the footer. Once two '\0' chars + // appear back-to-back, stop checking. + numWords = 0; + checkPtr = 0; + for (int i = 0; i < component->overlayDefs.fileInfo.fileSize - OVERLAY_DEFS_FILENAMES_SIZE; i++) { + if (component->overlayFilenames[i] == '\0') { + if (checkPtr == i) break; + numWords++; + checkPtr = i + 1; + } + } + component->numOverlays = numWords; + success = true; + } + } + + return success; +} + +bool WriteOverlayDefs(Component *component) { + int sizeWritten; + bool success; + + OverlayDefs *overlayDefs = &component->overlayDefs; + if (!overlayDefs->fileInfo.rewrite) { + success = true; + } else { + DebugPrintf("Writing overlayDefs=%s\n", overlayDefs->fileInfo.filename); + if (overlayDefs->fileInfo.compressedSize == 0) { + sizeWritten = WriteFile(overlayDefs->fileInfo.filename, overlayDefs->fileInfo.content, overlayDefs->fileInfo.fileSize); + success = sizeWritten >= 0; + } else { + ErrorPrintf("Don\'t support compressed overlaydefs\n"); + success = false; + } + } + return success; +} + +bool AddSuffixOverlayDefs(Component *component, char *suffix) { + DebugPrintf("Adding suffix overlayDefs=%s\n", suffix); + return AddSuffixBuffer(&component->overlayDefs.fileInfo, suffix); +} + +void FreeOverlayDefs(Component *component) { + DebugPrintf("Releasing overlayDefs\n"); + FreeBuffer(&component->overlayDefs.fileInfo); + component->overlayDefs.header = NULL; + component->overlayFilenames = NULL; + if (component->dirName != NULL) { + free(component->dirName); + component->dirName = NULL; + } +} diff --git a/tools/compstatic/overlay_defs.h b/tools/compstatic/overlay_defs.h new file mode 100644 index 00000000..0d83c4fc --- /dev/null +++ b/tools/compstatic/overlay_defs.h @@ -0,0 +1,22 @@ +#ifndef OVERLAY_DEFS_H +#define OVERLAY_DEFS_H + +#include +#include "global.h" + +#define MIN_OVERLAY_DEFS_FILE_SIZE 0x10 +#define OVERLAY_DEFS_FOOTER_OFFSET 0x8 +#define OVERLAY_DEFS_FILENAMES_OFFSET 0x10 +#define OVERLAY_DEFS_FILENAMES_SIZE 0x10 + +#define OVERLAY_DEFS_HEADER_LOAD_ADDRESS_OFFSET 0 +#define OVERLAY_DEFS_HEADER_ENTRY_ADDRESS_OFFSET 4 +#define OVERLAY_DEFS_HEADER_MODULE_SIZE_OFFSET 8 +#define OVERLAY_DEFS_HEADER_AUTOLOAD_DONE_OFFSET 12 + +bool ReadOverlayDefs(Component *component, char *filename); +bool WriteOverlayDefs(Component *component); +bool AddSuffixOverlayDefs(Component *component, char *suffix); +void FreeOverlayDefs(Component *component); + +#endif // OVERLAY_DEFS_H diff --git a/tools/compstatic/overlay_modules.c b/tools/compstatic/overlay_modules.c new file mode 100644 index 00000000..440df669 --- /dev/null +++ b/tools/compstatic/overlay_modules.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#include "files.h" +#include "global.h" +#include "misc.h" +#include "overlay_modules.h" +#include "print.h" + +bool ReadOverlayModules(Component *component) { + bool success; + char c; + OverlayModule *overlayModules; + + char *overlayFilenames = component->overlayFilenames; + char *dirName = component->dirName; + int dirNameLength = strlen(dirName); + + if (component->numOverlays == 0) { + DebugPrintf("No overlay to read\n"); + component->overlayModules = NULL; + success = true; + } else { + overlayModules = calloc(component->numOverlays, sizeof(OverlayModule)); + if (overlayModules == NULL) { + ErrorPrintf("Cannot allocate memory.\n"); + success = false; + } else { + component->overlayModules = overlayModules; + for (int i = 0; i < component->numOverlays; i++) { + int filenameLength = strlen(overlayFilenames); + overlayModules->fileInfo.filename = malloc(filenameLength + dirNameLength + 2);; + if (overlayModules->fileInfo.filename == NULL) { + ErrorPrintf("Cannot allocate memory\n"); + return false; + } + sprintf(overlayModules->fileInfo.filename, "%s/%s", dirName, overlayFilenames); + DebugPrintf("Reading overlay[%d]=%s\n", i, overlayModules->fileInfo.filename); + + int fileSize = ReadFile(overlayModules->fileInfo.filename, &overlayModules->fileInfo.content); + overlayModules->fileInfo.fileSize = fileSize; + overlayModules->fileInfo.compressedSize = 0; + overlayModules->fileInfo.rewrite = false; + if (overlayModules->fileInfo.fileSize < 0) return false; + + overlayModules++; + do { + c = *overlayFilenames; + overlayFilenames++; + } while (c != '\0'); + } + success = true; + } + } + return success; +} + +bool WriteOverlayModules(Component *component) { + OverlayModule *overlayModule = component->overlayModules; + int i = 0; + + do { + if (i >= component->numOverlays) { + return true; + } + if (overlayModule->fileInfo.rewrite) { + DebugPrintf("Writing overlay[%d]=%s\n", i, overlayModule->fileInfo.filename); + int overlaySize = overlayModule->fileInfo.compressedSize ? overlayModule->fileInfo.compressedSize : overlayModule->fileInfo.fileSize; + int sizeWritten = WriteFile(overlayModule->fileInfo.filename, overlayModule->fileInfo.content, overlaySize); + if (sizeWritten < 0) { + return false; + } + } + overlayModule++; + i++; + } while (true); +} + +bool AddSuffixOverlayModules(Component *component, char *suffix) { + bool success; + + OverlayModule *overlayModule = component->overlayModules; + if (component->numOverlays == 0 || overlayModule == NULL) { + DebugPrintf("No overlay to add suffix\n"); + success = true; + } else if (suffix == NULL || *suffix == '\0') { + success = true; + } else { + int suffixLength = strlen(suffix); + int fileSize = suffixLength * component->numOverlays + component->overlayDefs.fileInfo.fileSize; + char *buffer = malloc(fileSize); + if (buffer == NULL) { + ErrorPrintf("Cannot allocate memory\n"); + success = false; + } else { + uint *header32 = (uint *)component->overlayDefs.header; + *(uint *)buffer = header32[0]; + *(uint *)(buffer + 4) = header32[1]; + *(uint *)(buffer + 8) = header32[2]; + *(uint *)(buffer + 0xc) = header32[3]; + + char *contentPtr = buffer + 0x10; + char *ovFilename = component->overlayFilenames; + for (int i = 0; i < component->numOverlays; i++) { + DebugPrintf("Adding suffix overlay[%d]\n", i); + strcpy(contentPtr, ovFilename); + strcat(contentPtr, suffix); + + int length = strlen(ovFilename); + ovFilename += length + 1; + length = strlen(contentPtr); + contentPtr += length + 1; + + bool addSuffixSuccess = AddSuffixBuffer(&overlayModule->fileInfo, suffix); + if (!addSuffixSuccess) { + return false; + } + overlayModule++; + } + CopyBuffer(ovFilename, contentPtr, fileSize - ((size_t)contentPtr - (size_t)buffer)); + free(component->overlayDefs.fileInfo.content); + component->overlayDefs.fileInfo.content = buffer; + component->overlayDefs.fileInfo.fileSize = fileSize; + component->overlayDefs.fileInfo.rewrite = true; + component->overlayDefs.header = buffer; + component->overlayFilenames = buffer + 0x10; + success = true; + } + } + return success; +} + +void FreeOverlayModules(Component *component) { + OverlayModule *overlayModule = component->overlayModules; + if (component->numOverlays == 0 || overlayModule == NULL) { + DebugPrintf("No overlay to release\n"); + } else { + for (int i = 0; i < component->numOverlays; i++) { + DebugPrintf("Releasing overlay[%d]\n", i); + FreeBuffer(&overlayModule->fileInfo); + overlayModule++; + } + } + if (component->overlayModules != NULL) { + free(component->overlayModules); + component->overlayModules = NULL; + } +} diff --git a/tools/compstatic/overlay_modules.h b/tools/compstatic/overlay_modules.h new file mode 100644 index 00000000..e10eae9e --- /dev/null +++ b/tools/compstatic/overlay_modules.h @@ -0,0 +1,12 @@ +#ifndef OVERLAY_MODULE_H +#define OVERLAY_MODULE_H + +#include +#include "global.h" + +bool ReadOverlayModules(Component *component); +bool WriteOverlayModules(Component *component); +bool AddSuffixOverlayModules(Component *component, char *suffix); +void FreeOverlayModules(Component *component); + +#endif // OVERLAY_MODULE_H diff --git a/tools/compstatic/overlay_table.c b/tools/compstatic/overlay_table.c new file mode 100644 index 00000000..cf0a3445 --- /dev/null +++ b/tools/compstatic/overlay_table.c @@ -0,0 +1,76 @@ +#include +#include +#include "files.h" +#include "global.h" +#include "misc.h" +#include "overlay_table.h" +#include "print.h" + +bool ReadOverlayTable(Component *component, char *filename) { + OverlayTable *overlayTable = &component->overlayTable; + if (filename == NULL || component->numOverlays < 1) { + DebugPrintf("No overlay table to read\n"); + overlayTable->fileInfo.content = NULL; + overlayTable->fileInfo.fileSize = 0; + overlayTable->fileInfo.filename = NULL; + } else { + DebugPrintf("Reading overlayTable=%s\n", filename); + int fileSize = ReadFile(filename, &overlayTable->fileInfo.content); + overlayTable->fileInfo.fileSize = fileSize; + overlayTable->fileInfo.filename = strdup(filename); + } + overlayTable->fileInfo.compressedSize = 0; + overlayTable->fileInfo.rewrite = false; + bool success = overlayTable->fileInfo.fileSize == component->numOverlays * OVERLAY_ENTRY_SIZE; + if (success) { + overlayTable->table = overlayTable->fileInfo.content; + } else { + ErrorPrintf("Not matched number of overlays and size of overlay table\n"); + } + return success; +} + +bool WriteOverlayTable(Component *component) { + bool success; + OverlayTable *overlayTable = &component->overlayTable; + + if (!overlayTable->fileInfo.rewrite) { + success = true; + } else if (overlayTable->fileInfo.filename == NULL) { + ErrorPrintf("No filename specified for overlay table\n"); + success = false; + } else { + DebugPrintf("Writing overlayTable=%s\n", overlayTable->fileInfo.filename); + if (overlayTable->fileInfo.compressedSize == 0) { + int sizeWritten = WriteFile(overlayTable->fileInfo.filename, overlayTable->fileInfo.content, overlayTable->fileInfo.fileSize); + success = sizeWritten >= 0; + } else { + ErrorPrintf("Don\'t support compressed overlay table\n"); + success = false; + } + } + return success; +} + +bool AddSuffixOverlayTable(Component *component, char *suffix) { + bool success; + + if (component->overlayTable.fileInfo.content == NULL || component->numOverlays == 0) { + DebugPrintf("No overlaytable to add suffix\n"); + success = true; + } else { + DebugPrintf("Adding suffix overlayTable=%s\n", suffix); + success = AddSuffixBuffer(&component->overlayTable.fileInfo, suffix); + } + return success; +} + +void FreeOverlayTable(Component *component) { + if (component->overlayTable.fileInfo.content == NULL) { + DebugPrintf("No overlaytable to release\n"); + } else { + DebugPrintf("Releasing overlayTable\n"); + FreeBuffer(&component->overlayTable.fileInfo); + } + component->overlayTable.table = NULL; +} diff --git a/tools/compstatic/overlay_table.h b/tools/compstatic/overlay_table.h new file mode 100644 index 00000000..7343a2db --- /dev/null +++ b/tools/compstatic/overlay_table.h @@ -0,0 +1,18 @@ +#ifndef OVERLAY_TABLE_H +#define OVERLAY_TABLE_H + +#include +#include "component.h" + +#define OVERLAY_ENTRY_SIZE 32 + +#define OT_FILESIZE_OFFSET 0x8 +#define OT_COMPRESSED_FILESIZE_OFFSET 0x1c +#define OT_COMPRESSED_FLAGS_OFFSET 0x1f + +bool ReadOverlayTable(Component *component, char *filename); +bool WriteOverlayTable(Component *component); +bool AddSuffixOverlayTable(Component *component, char *suffix); +void FreeOverlayTable(Component *component); + +#endif // OVERLAY_TABLE_H diff --git a/tools/compstatic/print.c b/tools/compstatic/print.c new file mode 100644 index 00000000..d0750529 --- /dev/null +++ b/tools/compstatic/print.c @@ -0,0 +1,22 @@ +#include +#include +#include "global.h" +#include "print.h" + +void DebugPrintf(const char *format, ...) { + if (!gDebugMode) return; + + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); +} + +void ErrorPrintf(const char *format, ...) { + printf("Error: "); + + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); +} diff --git a/tools/compstatic/print.h b/tools/compstatic/print.h new file mode 100644 index 00000000..afc6a409 --- /dev/null +++ b/tools/compstatic/print.h @@ -0,0 +1,7 @@ +#ifndef PRINT_H +#define PRINT_H + +void DebugPrintf(const char *format, ...); +void ErrorPrintf(const char *format, ...); + +#endif // PRINT_H diff --git a/tools/compstatic/static_module.c b/tools/compstatic/static_module.c new file mode 100644 index 00000000..84a26d5a --- /dev/null +++ b/tools/compstatic/static_module.c @@ -0,0 +1,74 @@ +#include +#include +#include "files.h" +#include "global.h" +#include "misc.h" +#include "overlay_defs.h" +#include "print.h" +#include "static_module.h" + +bool ReadStaticModule(Component *component, char *filename) { + bool success; + + StaticModule *staticModule = &component->staticModule; + + DebugPrintf("Reading staticModule=%s\n", filename); + int fileSize = ReadFile(filename, &staticModule->fileInfo.content); + staticModule->fileInfo.fileSize = fileSize; + staticModule->fileInfo.compressedSize = 0; + staticModule->fileInfo.rewrite = false; + staticModule->fileInfo.filename = strdup(filename); + if (staticModule->fileInfo.fileSize < 0) { + success = false; + } else if (staticModule->fileInfo.fileSize % 4 == 0) { + int footerOffset = *(int *)(component->overlayDefs.header + OVERLAY_DEFS_FOOTER_OFFSET); + uint footerOffsetAligned = ALIGN_4(footerOffset); + staticModule->footerSize = staticModule->fileInfo.fileSize - footerOffsetAligned; + staticModule->footerContent = staticModule->fileInfo.content + footerOffsetAligned; + staticModule->fileInfo.fileSize = footerOffset; + + int staticParamsOffset = *(uint *)(staticModule->footerContent + 4); + if (staticModule->footerSize < 0xc || *(uint *)(staticModule->footerContent + STATIC_FOOTER_MAGIC_OFFSET) != 0xDEC00621) { + ErrorPrintf("Static module is older format (No footer extension).\n"); + success = false; + } else if (((staticParamsOffset % 4) == 0) && + (staticParamsOffset > -1) && + (staticParamsOffset < footerOffset)) { + success = true; + } else { + ErrorPrintf("Static module is illegal format (Unknown footer format).\n"); + success = false; + } + } else { + ErrorPrintf("Static module size is illegal (size=%d). Must be aligned by 4\n"); + success = false; + } + return success; +} + +bool WriteStaticModule(Component *component) { + bool success; + StaticModule *staticModule = &component->staticModule; + + if (!staticModule->fileInfo.rewrite) { + success = true; + } else { + DebugPrintf("Writing staticModule=%s\n", staticModule->fileInfo.filename); + int fileSize = staticModule->fileInfo.compressedSize ? staticModule->fileInfo.compressedSize : staticModule->fileInfo.fileSize; + int sizeWritten = WriteFile(staticModule->fileInfo.filename, staticModule->fileInfo.content, fileSize + staticModule->footerSize); + success = sizeWritten >= 0; + } + return success; +} + +bool AddSuffixStaticModule(Component *component, char *suffix) { + DebugPrintf("Adding suffix staticModule=%s\n", suffix); + return AddSuffixBuffer(&component->staticModule.fileInfo, suffix); +} + +void FreeStaticModule(Component *component) { + DebugPrintf("Releasing staticModule\n"); + FreeBuffer(&component->staticModule.fileInfo); + component->staticModule.footerContent = NULL; + component->staticModule.footerSize = 0; +} diff --git a/tools/compstatic/static_module.h b/tools/compstatic/static_module.h new file mode 100644 index 00000000..15691a2f --- /dev/null +++ b/tools/compstatic/static_module.h @@ -0,0 +1,25 @@ +#ifndef STATIC_MODULE_H +#define STATIC_MODULE_H + +#include +#include "global.h" + +#define STATIC_FOOTER_MAGIC_OFFSET (0) +#define STATIC_FOOTER_STATIC_PARAM_OFFSET (4) +#define STATIC_FOOTER_DIGEST_PARAM_OFFSET (8) + +typedef struct { + uint autoloadList; + uint autoloadListEnd; + uint autoloadStart; + uint staticBssStart; + uint staticBssEnd; + int compressedStatic; +} StaticParams; + +bool ReadStaticModule(Component *component, char *filename); +bool WriteStaticModule(Component *component); +bool AddSuffixStaticModule(Component *component, char *suffix); +void FreeStaticModule(Component *component); + +#endif // STATIC_MODULE_H diff --git a/tools/compstatic/str.c b/tools/compstatic/str.c new file mode 100644 index 00000000..6bf16ea5 --- /dev/null +++ b/tools/compstatic/str.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include "print.h" +#include "str.h" + +char *StrCat(int count, ...) { + char *dest; + char *word; + int length; + + va_list args; + va_start(args, count); + va_list argsCpy; + va_copy(argsCpy, args); + + int totalLength = 0; + for (int i = 0; i < count; i++) { + word = va_arg(args, char *); + length = strlen(word); + totalLength += length; + } + va_end(args); + dest = malloc(totalLength + 1); + if (dest == NULL) { + ErrorPrintf("Cannot allocate memory\n"); + exit(1); + } + + dest[0] = '\0'; + for (int i = 0; i < count; i++) { + word = va_arg(argsCpy, char *); + length = strlen(word); + strcat(dest, word); + } + va_end(argsCpy); + return dest; +} + +char *StrDup(char *prevDest, char *src) { + if (prevDest != NULL) { + free(prevDest); + } + if (src != NULL) { + src = strdup(src); + if (src == NULL) { + ErrorPrintf("Cannot allocate memory\n"); + exit(1); + } + } + return src; +} diff --git a/tools/compstatic/str.h b/tools/compstatic/str.h new file mode 100644 index 00000000..0305660a --- /dev/null +++ b/tools/compstatic/str.h @@ -0,0 +1,7 @@ +#ifndef STR_H +#define STR_H + +char *StrCat(int count, ...); +char *StrDup(char *prevDest, char *src); + +#endif // STR_H diff --git a/tools/csv2bin/.gitignore b/tools/csv2bin/.gitignore new file mode 100644 index 00000000..1e550b04 --- /dev/null +++ b/tools/csv2bin/.gitignore @@ -0,0 +1,2 @@ +.deps +csv2bin diff --git a/tools/csv2bin/CsvFile.cpp b/tools/csv2bin/CsvFile.cpp new file mode 100644 index 00000000..63653283 --- /dev/null +++ b/tools/csv2bin/CsvFile.cpp @@ -0,0 +1,252 @@ +#include +#include "CsvFile.h" + +void CsvFile::ParseRow(std::string &line, std::vector &row, bool resize) { + std::string entry, qbuf; + bool isQuoted = false; + int i = 0; + if (resize) { + row.clear(); + } + while (line[0] == '\r') { + line = line.substr(1); + } + while (line[line.size() - 1] == '\r') { + line = line.substr(0, line.size() - 1); + } + std::stringstream line_s(line); + while (std::getline(line_s, entry, ',')) { + if (!isQuoted && entry[0] == '"') { + isQuoted = true; + entry = entry.substr(1); + } + if (isQuoted) { + if (entry[entry.size() - 1] == '"') { + isQuoted = false; + entry = entry.substr(0, entry.size() - 1); + } + qbuf += entry; + if (!isQuoted) { + if (resize) { + row.push_back(qbuf); + } else { + row[i++] = qbuf; + } + qbuf.clear(); + } + } else { + if (resize) { + row.push_back(entry); + } else { + row[i++] = entry; + } + } + } + assert(!isQuoted); +} + +void CsvFile::FromFile(const fs::path &filename, bool has_header) { + std::ifstream handle(filename); + std::string line; + std::stringstream filebuf; + + // Read the whole file at once + filebuf << handle.rdbuf(); + + // Read the first row + line = filebuf.str().substr(0, filebuf.str().find_first_of("\r\n")); + + // Calculate the number of rows + size_t pos = 0; + for ( + _nrow = !has_header; + pos != std::string::npos && + (pos = filebuf.str().find_first_of("\r\n", pos), pos != std::string::npos); + _nrow++ + ) { + pos = filebuf.str().find_first_not_of("\r\n", pos); + if (pos == std::string::npos) { + break; + } + } + + // Calculate the number of columns + pos = 0; + for ( + _ncol = 1; + pos = line.find(',', pos), pos++ != std::string::npos; + _ncol++ + ) {} + + // Preallocate the rows and colnames + _rows.resize(_nrow); + _colnames.resize(_ncol); + + // Parse the header, or set a dummy header + if (has_header) { + ParseRow(line, _colnames, false); + pos = filebuf.str().find_first_of("\r\n", pos); + if (pos != std::string::npos) { + pos = filebuf.str().find_first_not_of("\r\n", pos); + } + } else { + int i = 1; + for (std::string & name : _colnames) { + name = "V" + std::to_string(i++); + } + pos = 0; + } + + // Parse the rows + size_t last_pos = pos; + for ( + auto row = _rows.begin(); + row != _rows.end() && + (last_pos = pos, last_pos != std::string::npos) && + (pos = filebuf.str().find_first_of("\r\n", pos), pos != std::string::npos); + row++ + ) { + line = filebuf.str().substr(last_pos, pos - last_pos); + row->resize(_ncol); + ParseRow(line, *row, false); + pos = filebuf.str().find_first_not_of("\r\n", pos); + if (pos == std::string::npos) { + break; + } + } +} + +bool CsvFile::GetRow(size_t i, std::vector &row) const { + if (i >= _nrow) { + row.clear(); + return false; + } else { + row = _rows[i]; + return true; + } +} + +bool CsvFile::GetCol(size_t i, std::vector &col) const { + if (i >= _ncol) { + col.clear(); + return false; + } else { + int j = 0; + for (const auto & row : _rows) { + col[j++] = row[i]; + } + return true; + } +} + +bool CsvFile::GetCol(const std::string &name, std::vector &col) const { + auto it = std::find(_colnames.cbegin(), _colnames.cend(), name); + if (it != _colnames.cend()) { + size_t i = it - _colnames.cbegin(); + return GetCol(i, col); + } else { + col.clear(); + return false; + } +} + +bool CsvFile::GetCell(size_t row, size_t col, std::string &cell) const { + if (row >= _nrow || col >= _ncol) { + cell.clear(); + return false; + } else { + cell = _rows[row][col]; + return true; + } +} + +bool CsvFile::GetCell(const std::string &colname, size_t row, std::string &cell) const { + auto it = std::find(_colnames.cbegin(), _colnames.cend(), colname); + if (it != _colnames.cend()) { + size_t i = it - _colnames.cbegin(); + return GetCell(row, i, cell); + } else { + cell.clear(); + return false; + } +} + +bool CsvFile::SetRow(size_t i, const std::vector &row) { + if (i >= _nrow) { + return false; + } else { + _rows[i] = row; + return true; + } +} + +bool CsvFile::SetCol(size_t i, const std::vector &col) { + if (i >= _ncol) { + return false; + } else { + int j = 0; + for (auto & row : _rows) { + row[i] = col[j++]; + } + return true; + } +} + +bool CsvFile::SetCol(const std::string &name, const std::vector &col) { + auto it = std::find(_colnames.cbegin(), _colnames.cend(), name); + if (it != _colnames.cend()) { + size_t i = it - _colnames.cbegin(); + return SetCol(i, col); + } else { + return false; + } +} + +bool CsvFile::SetCell(size_t row, size_t col, const std::string &cell) { + if (row >= _nrow || col >= _ncol) { + return false; + } else { + _rows[row][col] = cell; + return true; + } +} + +bool CsvFile::SetCell(const std::string &colname, size_t row, const std::string &cell) { + auto it = std::find(_colnames.cbegin(), _colnames.cend(), colname); + if (it != _colnames.cend()) { + size_t i = it - _colnames.cbegin(); + return SetCell(row, i, cell); + } else { + return false; + } +} + +void CsvFile::WriteRow(std::ofstream &ofile, const std::vector &row) { + bool first = true; + for (const auto & entry : row) { + if (!first) { + ofile << ','; + } else { + first = false; + } + bool has_comma = (entry.find(',') != std::string::npos); + if (has_comma) { + ofile << '"'; + } + ofile << entry; + if (has_comma) { + ofile << '"'; + } + } + ofile << '\n'; +} + +void CsvFile::ToFile(const fs::path &filename, bool write_header) { + std::ofstream ofile(filename); + if (write_header) { + WriteRow(ofile, _colnames); + } + for (auto const & row : _rows) { + WriteRow(ofile, row); + } +} diff --git a/tools/csv2bin/CsvFile.h b/tools/csv2bin/CsvFile.h new file mode 100644 index 00000000..60938915 --- /dev/null +++ b/tools/csv2bin/CsvFile.h @@ -0,0 +1,69 @@ +#ifndef GUARD_CSVFILE_H +#define GUARD_CSVFILE_H + +#include "global.h" +#include + +class CsvFile { + std::vector _colnames; + std::vector> _rows; + size_t _nrow = 0; + size_t _ncol = 0; + bool _has_header = true; + static void ParseRow(std::string &line, std::vector &row, bool resize = true); + static void WriteRow(std::ofstream &ofile, std::vector const &row); +public: + CsvFile() = default; + explicit CsvFile(const fs::path & filename, bool has_header = true) { FromFile(filename, has_header); }; + void FromFile(const fs::path & filename, bool has_header = true); + + void ToFile(const fs::path & filename, bool write_header = true); + bool GetRow(size_t i, std::vector &row) const; + bool GetCol(size_t i, std::vector &col) const; + bool GetCol(const std::string &name, std::vector &col) const; + bool GetCell(size_t row, size_t col, std::string &cell) const; + bool GetCell(const std::string &colname, size_t row, std::string &cell) const; + bool SetRow(size_t i, const std::vector &row); + bool SetCol(size_t i, const std::vector &col); + bool SetCol(const std::string &name, const std::vector &col); + bool SetCell(size_t row, size_t col, const std::string &cell); + bool SetCell(const std::string &colname, size_t row, const std::string &cell); + std::vector>::iterator begin() { return _rows.begin(); } + std::vector>::iterator end() { return _rows.end(); } + std::vector>::const_iterator cbegin() { return _rows.cbegin(); } + std::vector>::const_iterator cend() { return _rows.cend(); } + std::vector>::reverse_iterator rbegin() { return _rows.rbegin(); } + std::vector>::reverse_iterator rend() { return _rows.rend(); } + std::vector>::const_reverse_iterator crbegin() { return _rows.crbegin(); } + std::vector>::const_reverse_iterator crend() { return _rows.crend(); } + [[nodiscard]] size_t nrow() const { return _nrow; } + [[nodiscard]] size_t ncol() const { return _ncol; } + std::vector &operator[](size_t i) { return _rows[i]; } + void resize_internal() { + _rows.resize(_nrow); + for (auto & row : _rows) { + row.resize(_ncol); + } + } + void resize(size_t nrow, size_t ncol) { + if (_nrow != nrow || _ncol != ncol) { + _nrow = nrow; + _ncol = ncol; + resize_internal(); + } + } + template + void SetColnames(Iter _begin, Iter _end) { + _colnames.assign(_begin, _end); + if (_ncol != _colnames.size()) { + _ncol = _colnames.size(); + resize_internal(); + } + } + std::vector &GetColnames() { + return _colnames; + } +}; + + +#endif //GUARD_CSVFILE_H diff --git a/tools/csv2bin/Makefile b/tools/csv2bin/Makefile new file mode 100644 index 00000000..26e8c619 --- /dev/null +++ b/tools/csv2bin/Makefile @@ -0,0 +1,40 @@ +CXX ?= g++ + +CXXFLAGS := -std=c++17 -g + +ifeq ($(DEBUG),) +CXXFLAGS += -O2 -DNDEBUG +endif + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +CXX_SRCS := main.cpp CsvFile.cpp Manifest.cpp Options.cpp + +CXX_OBJS := $(CXX_SRCS:%.cpp=%.o) +SRCS := $(CXX_SRCS) +OBJS := $(CXX_OBJS) + +PROGRAM := csv2bin + +.PHONY: all clean + +all: $(PROGRAM) + @: + +clean: + $(RM) -r $(PROGRAM) $(PROGRAM).exe $(OBJS) $(DEPDIR) + +$(PROGRAM): $(OBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +%.o: %.cpp +%.o: %.cpp $(DEPDIR)/%.d | $(DEPDIR) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(SRCS:%.cpp=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/csv2bin/Manifest.cpp b/tools/csv2bin/Manifest.cpp new file mode 100644 index 00000000..e82de6ff --- /dev/null +++ b/tools/csv2bin/Manifest.cpp @@ -0,0 +1,265 @@ +#include "Manifest.h" + +std::map, std::map> HeaderCache { + {{"bool", ""}, { + {"false", 0}, + {"true", 1} + }} +}; + +void ColumnSpec::translate_width(std::string &width, int &bytes, int &bits) { + int dotpos = width.find('.'); + bytes = std::stoi(width.substr(0, dotpos)); + if (dotpos == std::string::npos) { + bits = 0; + } else { + bits = std::stoi(width.substr(dotpos + 1)); + } +} + +void ColumnSpec::_init(int _width, const fs::path &headerfile, const std::string &prefix, int _nbits) { + width = _width; + nbits = _nbits; + if (!headerfile.empty()) { + try { + constants = HeaderCache.at({headerfile, prefix}); + } catch (const std::out_of_range &e) { + std::ifstream handle(headerfile); + std::regex pattern("#define +(" + prefix + "\\w+) +(\\d+)$"); + std::string line; + std::smatch results; + while (std::getline(handle, line)) { + if (std::regex_match(line, results, pattern)) { + constants[results[1]] = std::stoi(results[2]); + } + } + HeaderCache[{headerfile, prefix}] = constants; + } + } +} + +ColumnSpec::ColumnSpec(int _width, const fs::path& headerfile, const std::string &prefix, int _nbits) { + _init(_width, headerfile, prefix, _nbits); +} + +ColumnSpec::ColumnSpec(std::string &_width, const fs::path &headerfile, const std::string &prefix) { + int sign; + int nbit; + int nbytes; + + if (_width == "skip") { + _init(skip, headerfile, prefix); + return; + } + + if (_width.substr(0, 3) == "pad") { + std::string __width = _width.substr(3); + translate_width(__width, nbytes, nbit); + _init(pad | nbytes, headerfile, prefix, nbit); + return; + } + + switch (_width[0]) { + case 's': + sign = -1; + break; + case 'u': + sign = 1; + break; + default: + throw std::invalid_argument("width param must be a valid fixed-width type spec"); + } + + std::string __width = _width.substr(1); + translate_width(__width, nbytes, nbit); + switch (nbytes) { + case 8: + case 16: + case 32: + case 64: + sign *= nbytes / 8; + break; + default: + throw std::invalid_argument("width param must be a valid fixed-width type spec"); + } + + _init(sign, headerfile, prefix, nbit); +} + +Manifest::Manifest(const fs::path &filename, std::vector &header_dirs) { + read(filename, header_dirs); +} + +void Manifest::read(const fs::path &filename, std::vector &header_dirs) { + std::ifstream strm(filename); + std::string line; + while (std::getline(strm, line)) { + line = line.substr(0, line.find_last_not_of(" \t\r\n") + 1); + fs::path headerfile; + std::string prefix; + + // Tokenize with colons + std::vector tokens; + size_t s = 0; + size_t e; + do { + e = line.find(':', s); + tokens.emplace_back(line.substr(s, e - s)); + s = e + 1; + } while (e != std::string::npos); + + std::string name = tokens.at(0); + try { + mapping.at(name); + throw std::invalid_argument("duplicate column in manifest: " + name); + } catch (const std::out_of_range &e) { + // discard silently, we gucci + } + std::string width = tokens.at(1); + if (tokens.size() > 2) { + if (tokens.size() > 3) { + prefix = tokens[3]; + } + fs::path header_name = tokens[2]; + if (header_name == "bool") { + headerfile = "bool"; + } else { + for (auto &root: header_dirs) { + if (fs::exists(root / header_name)) { + headerfile = root / header_name; + break; + } + } + } + } + mapping[name] = ColumnSpec(width, headerfile, prefix); + colnames.emplace_back(name); + } +} + +ColumnSpec &Manifest::operator[](const std::string &name) { + return mapping[name]; +} + +size_t Manifest::size(const int alignment) const { + size_t ret = 0; + size_t bitpos = 0; + for (const auto & name : colnames) { + auto &spec = mapping.at(name); + if (spec.is_skipped()) { + continue; + } + size_t bytect = spec.size(); + size_t aln = spec.get_alignment(); + size_t bitct = spec.num_bits(); + if (bitpos != 0 && bitct == 0) { + bitpos = 0; + ret++; + } + if (bitpos == 0 && aln != 1) { + ret += aln - 1; + ret &= ~(aln - 1); + } + if (bitct != 0) { + bitpos += bitct; + if (bitpos >= 8 * bytect) { + ret += bytect; + bitpos -= 8 * bytect; + } + } else { + ret += bytect; + } + } + // Word align + if (alignment != 0) { + ret += alignment - 1; + ret &= ~(alignment - 1); + } + return ret; +} + +BufferedRowConverter::BufferedRowConverter(Manifest &_manifest, CsvFile &_csvFile, unsigned char _padval): + manifest(_manifest), + csvFile(_csvFile), + padval(_padval) +{ + buffer.resize(manifest.size()); + carriage_return(); + byte_cursor = 0; + bit_cursor = 0; + row_cursor = 0; +} + +std::ifstream &operator>>(std::ifstream &strm, BufferedRowConverter &cvtr) { + std::ios::iostate state = strm.rdstate(); + size_t pos = strm.tellg(); + strm.read((char *)cvtr.buffer.data(), cvtr.buffer.size()); + cvtr.to_strings(); + cvtr++; + return strm; +} + +std::ofstream &operator<<(std::ofstream &strm, BufferedRowConverter &cvtr) { + cvtr.to_bytes(); + strm.write((char *)cvtr.buffer.data(), cvtr.buffer.size()); + cvtr++; + return strm; +} + +void BufferedRowConverter::to_strings() { + if (row_cursor >= csvFile.nrow()) { + throw std::out_of_range("invalid row idx"); + } + std::vector &row = csvFile[row_cursor]; + size_t column_i = 0; + for (const auto colname : manifest.colnames) { + const ColumnSpec &spec = manifest[colname]; + if (spec.is_skipped()) { + row.at(column_i++) = spec[row_cursor]; + continue; + } else { + align(spec.size(), spec.num_bits()); + unsigned long long val = get(spec.type(), spec.num_bits()); + if (spec.is_padding()) { + if (val != 0) { + std::cerr << "csv2bin warning: nonzero data in padding field may result in data loss" << std::endl; + } + } else { + row.at(column_i++) = spec[val]; + } + advance(spec.size(), spec.num_bits()); + } + } +} + +void BufferedRowConverter::to_bytes() { + if (row_cursor >= csvFile.nrow()) { + throw std::out_of_range("invalid row idx"); + } + std::vector &row = csvFile[row_cursor]; + size_t column_i = 0; + for (const auto colname : manifest.colnames) { + const ColumnSpec &spec = manifest[colname]; + if (spec.is_skipped()) { + column_i++; + continue; + } else { + align(spec.get_alignment(), spec.num_bits()); + unsigned long long val; + if (spec.is_padding()) { + val = 0; + } else { + val = spec[row.at(column_i++)]; + } + set(val, spec.type(), spec.num_bits()); + advance(spec.size(), spec.num_bits()); + } + } + if (bit_cursor != 0) { + const ColumnSpec &spec = manifest[*manifest.colnames.crbegin()]; + byte_cursor += spec.size(); + } + while (byte_cursor < buffer.size()) { + buffer[byte_cursor++] = padval; + } +} diff --git a/tools/csv2bin/Manifest.h b/tools/csv2bin/Manifest.h new file mode 100644 index 00000000..e89b41c9 --- /dev/null +++ b/tools/csv2bin/Manifest.h @@ -0,0 +1,289 @@ +#ifndef GUARD_MANIFEST_H +#define GUARD_MANIFEST_H + +#include "global.h" +#include "CsvFile.h" + +template +C* to_array(C* buf, const T val, off_t offset = 0) { + for (int i = 0; i < sizeof(T); i++) { + buf[offset + i] = (val >> (8 * i * sizeof(C))); + } + return buf; +} + +template +T from_array(const C* buf, off_t offset = 0) { + T ret = 0; + for (int i = 0; i < sizeof(T); i++) { + ret |= buf[offset + i] << (8 * i * sizeof(C)); + } + return ret; +} + +template +std::vector & to_array(std::vector & buf, const T val, off_t offset = 0) { + for (int i = 0; i < sizeof(T); i++) { + buf[offset + i] = (val >> (8 * i * sizeof(C))); + } + return buf; +} + +template +T from_array(const std::vector & buf, off_t offset = 0) { + T ret = 0; + for (int i = 0; i < sizeof(T); i++) { + ret |= buf[offset + i] << (8 * i * sizeof(C)); + } + return ret; +} + +class padding_warning : public std::exception { + std::string _what; +public: + padding_warning(const char *c) : _what(c) {} + padding_warning(const std::string &s) : _what(s) {} + const char * what() const noexcept { return _what.c_str(); } +}; + +class ColumnSpec { + typedef int width_t; + static const width_t u8 = 1; + static const width_t u16 = 2; + static const width_t u32 = 4; + static const width_t u64 = 8; + static const width_t s8 = -1; + static const width_t s16 = -2; + static const width_t s32 = -4; + static const width_t s64 = -8; + static const width_t skip = 256; + static const width_t pad = 512; + + width_t width = 0; // number of bytes. positive = unsigned, negative = signed + unsigned char nbits = 0; + std::map constants; // from a C header, specified in the manifest + + void _init(int _width, const fs::path &headerfile = "", const std::string &prefix = "", int _nbits = 0); + static void translate_width(std::string &width, int &bytes, int &bits); +public: + ColumnSpec() = default; + explicit ColumnSpec(int _width, const fs::path& headerfile = "", const std::string &prefix = "", int _nbits = 0); + explicit ColumnSpec(std::string &_width, const fs::path& headerfile = "", const std::string &prefix = ""); + size_t size() const { + if (is_skipped()) { + return 0; + } + if (is_padding()) { + return width & 0xFF; + } + return abs(width); + } + int type() const { + if (is_skipped()) { + return 0; + } + if (is_padding()) { + return width & 0xFF; + } + return width; + } + bool is_signed() const { return width < 0; } + bool is_init() const { return width != 0; } + bool is_padding() const { return width > 0 && (width & ~0xFF) == pad; } + bool is_skipped() const { return width == skip; } + bool is_bitfield() const { return nbits != 0; } + unsigned num_bits() const { return nbits; } + unsigned get_alignment() const { + if (is_skipped() || is_padding()) { + return 1; + } + return size(); + } + const std::string operator[](int i) const { + auto it = std::find_if(constants.cbegin(), constants.cend(), [&](const auto pair) { return pair.second == i; }); + if (it == constants.end()) { + return std::to_string(i); + } + return it->first; + } + int operator[](const std::string &key) const { + try { + return constants.at(key); + } catch (std::out_of_range &e) { + return std::stoi(key); + } + } +}; + +// File format: newline separated +class Manifest { + std::map mapping; // maps column name to column specification +public: + std::vector colnames; // column ordering + using manifest_iter = std::map::iterator; + using manifest_const_iter = std::map::const_iterator; + using manifest_reverse_iter = std::map::reverse_iterator; + using manifest_const_reverse_iter = std::map::const_reverse_iterator; + Manifest() = default; + explicit Manifest(fs::path const &filename, std::vector &header_dirs); + void read(fs::path const &filename, std::vector &header_dirs); + ColumnSpec &operator[](const std::string &name); + manifest_iter begin() { return mapping.begin(); } + manifest_iter end() { return mapping.end(); } + manifest_const_iter cbegin() { return mapping.cbegin(); } + manifest_const_iter cend() { return mapping.cend(); } + manifest_reverse_iter rbegin() { return mapping.rbegin(); } + manifest_reverse_iter rend() { return mapping.rend(); } + manifest_const_reverse_iter crbegin() { return mapping.crbegin(); } + manifest_const_reverse_iter crend() { return mapping.crend(); } + [[nodiscard]] size_t size(const int alignment = 4) const; + template + void assign(Iter first, Iter last) { + mapping.clear(); + for (auto pair = first; pair != last; pair ++) { + mapping[pair->first] = pair->second; + } + } +}; + +class BufferedRowConverter { + Manifest &manifest; + CsvFile &csvFile; + std::vectorbuffer; + off_t byte_cursor = 0; + off_t bit_cursor = 0; + off_t row_cursor = 0; + unsigned char padval = 0; +public: + BufferedRowConverter(Manifest &_manifest, CsvFile &_csvFile, unsigned char _padval = 0); + void to_strings(); + void to_bytes(); + friend std::ifstream &operator>>(std::ifstream &strm, BufferedRowConverter &cvtr); + friend std::ofstream &operator<<(std::ofstream &strm, BufferedRowConverter &cvtr); + BufferedRowConverter &operator++() { + if (row_cursor >= csvFile.nrow()) { + throw std::out_of_range("BufferedRowConverter++"); + } + row_cursor++; + return *this; + }; + BufferedRowConverter &operator++(int i) { + if (row_cursor + i > csvFile.nrow()) { + throw std::out_of_range("BufferedRowConverter++"); + } + row_cursor++; + carriage_return(); + return *this; + }; + unsigned bitmask(unsigned nbits) const { + return ((1ul << nbits) - 1) << bit_cursor; + } + void align(const unsigned alignment, const unsigned bitcount) { + if (bitcount == 0 && bit_cursor != 0) { + byte_cursor++; + bit_cursor = 0; + } + if (alignment == 1) return; + if (byte_cursor & (alignment - 1)) { + byte_cursor += alignment - 1; + byte_cursor &= ~(alignment - 1); + bit_cursor = 0; + } + } + unsigned long long get(int width, int numbits = 0) const { + unsigned long ret; + if (byte_cursor + abs(width) > buffer.size()) { + throw std::out_of_range("BufferedRowConverter::get"); + } + switch (width) { + case 1: + ret = from_array(buffer, byte_cursor); + break; + case 2: + ret = from_array(buffer, byte_cursor); + break; + case 4: + ret = from_array(buffer, byte_cursor); + break; + case 8: + ret = from_array(buffer, byte_cursor); + break; + case -1: + ret = from_array(buffer, byte_cursor); + break; + case -2: + ret = from_array(buffer, byte_cursor); + break; + case -4: + ret = from_array(buffer, byte_cursor); + break; + case -8: + ret = from_array(buffer, byte_cursor); + break; + default: + throw std::invalid_argument("BufferedRowConverter::get"); + } + if (numbits != 0) { + ret &= bitmask(numbits); + ret >>= bit_cursor; + } + return ret; + } + void set(unsigned long long val, int width, int numbits = 0) { + if (numbits != 0) { + val <<= bit_cursor; + val &= bitmask(numbits); + val |= (get(width) & ~bitmask(numbits)); + } + if (byte_cursor + abs(width) > buffer.size()) { + throw std::out_of_range("BufferedRowConverter::set"); + } + switch (width) { + case 1: + to_array(buffer, val, byte_cursor); + break; + case 2: + to_array(buffer, val, byte_cursor); + break; + case 4: + to_array(buffer, val, byte_cursor); + break; + case 8: + to_array(buffer, val, byte_cursor); + break; + case -1: + to_array(buffer, val, byte_cursor); + break; + case -2: + to_array(buffer, val, byte_cursor); + break; + case -4: + to_array(buffer, val, byte_cursor); + break; + case -8: + to_array(buffer, val, byte_cursor); + break; + default: + throw std::invalid_argument("BufferedRowConverter::set"); + } + } + void advance(int nbytes, int nbits = 0) { + if (nbits != 0) { + bit_cursor += nbits; + if (bit_cursor >= nbytes * 8) { + byte_cursor += nbytes; + bit_cursor -= nbytes * 8; + } + } else { + byte_cursor += nbytes; + bit_cursor = 0; + } + } + void carriage_return() { + byte_cursor = 0; + bit_cursor = 0; + buffer.assign(buffer.size(), 0); + } +}; + +#endif //GUARD_MANIFEST_H diff --git a/tools/csv2bin/Options.cpp b/tools/csv2bin/Options.cpp new file mode 100644 index 00000000..5ba12305 --- /dev/null +++ b/tools/csv2bin/Options.cpp @@ -0,0 +1,273 @@ +#include "Options.h" + +template +V& to_upper(V& vec) { + std::for_each(vec.begin(), vec.end(), [](typename V::value_type &x) { x = std::toupper(x); }); + return vec; +} + +void Options::short_usage(std::ostream &strm) { + strm << "Usage: csv2bin [OPTIONS] MODE CSV BIN MANIFEST" << std::endl; +} + +void Options::usage(std::ostream &strm) { + short_usage(strm); + strm << std::endl; + strm << R"( MODE Either "compile" or "disasm", controls)" << std::endl; + strm << " the mode of execution." << std::endl; + strm << " CSV Path to the CSV file. If compiling, the file" << std::endl; + strm << " must exist." << std::endl; + strm << " BIN Path to the compiled binary. If disassembling," << std::endl; + strm << " the file must exist." << std::endl; + strm << " MANIFEST Column specification for the CSV file. Not all" << std::endl; + strm << " columns need to be specified, but missing columns" << std::endl; + strm << " are presumed to be u32." << std::endl; + strm << " -i PATH Add header search paths. Can repeat as much as you want." << std::endl; + strm << " --include PATH Alias for -i" << std::endl; + strm << " --narc Output a NARC file" << std::endl; + strm << " --naix Output a NAIX file. Implies --narc" << std::endl; + strm << " --pad PADVAL Pads with PADVAL between rows (default: 0)" << std::endl; + strm << " -h Prints this message and exits" << std::endl; + strm << std::endl; + strm << "Note: Manifest file format declares each column on a separate line." << std::endl; + strm << "Columns must be declared in the same order as they would appear in" << std::endl; + strm << "both the CSV and the corresponding field in the compiled binary" << std::endl; + strm << "Each line shall have the following format:" << std::endl; + strm << std::endl; + strm << "column_name:width[.bits][:path/to/c/header.h[:const-prefix]]" << std::endl; + strm << std::endl; + strm << "column_name must match the CSV header line." << std::endl; + strm << "width must be a valid Nitro type name - either 'u' or 's'," << std::endl; + strm << " followed by either 8, 16, 32, or 64." << std::endl; + strm << " To designate a column as an index column, use 'skip'." << std::endl; + strm << " To designate a column as binary padding, use 'pad' followed by" << std::endl; + strm << " the number of padding bytes." << std::endl; + strm << " To designate a bitfield to a typed or padded field, add a period (.) followed" << std::endl; + strm << " by the number of bits. For example, 'can_cycle:u8.1'" << std::endl; + strm << "the optional header file path should be relative to" << std::endl; + strm << " the directory of execution, or you can pass a different" << std::endl; + strm << R"( root using "-i".)" << std::endl; + strm << " This spec supports the special header type 'bool', which maps" << std::endl; + strm << " the strings 'true' and 'false'." << std::endl; + strm << "the optional const-prefix restricts the header parsing to only those" << std::endl; + strm << " constants beginning with the specified prefix. Default behavior is to" << std::endl; + strm << " consider all constants defined in that header." << std::endl; + strm << std::endl; + strm << "Note 2: In disasm mode, the manifest must define all columns." << std::endl; + strm << "In compile mode, missing columns will be assumed to be u32." << std::endl; + strm << "The corresponding field will be inserted after the previous named" << std::endl; + strm << "column from the CSV." << std::endl; +} + +Options::Options(int argc, char **argv) { + std::vector argvec(argv + 1, argv + argc); + include_paths.insert(include_paths.begin(), "."); + for (auto iarg = argvec.begin(); iarg != argvec.end(); iarg ++) { + if (*iarg == "-i" || *iarg == "--include") { + iarg++; + if (iarg == argvec.end()) { + throw argument_error("missing argument to " + iarg[-1]); + } + assert(fs::exists(*iarg)); + include_paths.emplace_back(*iarg); + } else if (*iarg == "-h" || *iarg == "--help") { + usage(); + std::exit(EXIT_SUCCESS); + } else if (*iarg == "--narc") { + narc_mode = true; + } else if (*iarg == "--naix") { + naix_mode = true; + narc_mode = true; + } else if (*iarg == "--pad") { + iarg++; + padval = std::stoi(*iarg, 0, 0); + } else if ((*iarg)[0] == '-') { + throw argument_error("caught invalid option flag: " + *iarg); + } else { + posargs.emplace_back(*iarg); + } + } + if (posargs.size() < 4) { + throw argument_error("missing required argument(s)"); + } + assert(posargs.size() >= 4); + if (posargs[0] == "compile") { + execMode = EXEC_CSV2BIN; + } else if (posargs[0] == "disasm") { + if (naix_mode) { + std::cerr << "csv2bin warning: --naix with disasm mode is equivalent to --narc" << std::endl; + } + execMode = EXEC_BIN2CSV; + } else { + throw argument_error(R"(first positional argument must be either "compile" or "disasm", not )" + posargs[0]); + } + switch (execMode) { + case EXEC_CSV2BIN: + binfile.out = new std::ofstream(posargs[2], std::ios::binary); + break; + case EXEC_BIN2CSV: + binfile.in = new std::ifstream(posargs[2], narc_mode ? std::ios::binary : std::ios::binary | std::ios::ate); + break; + default: + assert(0); + } + manifest.read(posargs[3], include_paths); + if (execMode == EXEC_CSV2BIN) { + csvFile.FromFile(posargs[1]); + } +} + +Options::~Options() { + switch (execMode) { + case EXEC_CSV2BIN: + delete binfile.out; + break; + case EXEC_BIN2CSV: + delete binfile.in; + break; + default: + assert(0); + } +} + +int Options::main() { + switch (execMode) { + case EXEC_CSV2BIN: + return main_compile(); + case EXEC_BIN2CSV: + return main_disasm(); + default: + return 1; + } +} + +int Options::main_compile() { + for (auto name_i = csvFile.GetColnames().cbegin(); name_i != csvFile.GetColnames().cend(); name_i ++) { + if (!manifest[*name_i].is_init()) { + manifest[*name_i] = ColumnSpec(sizeof(unsigned int)); + if (name_i == csvFile.GetColnames().cbegin()) { + manifest.colnames.insert(manifest.colnames.cbegin(), *name_i); + } else { + auto dest_i = std::find(manifest.colnames.cbegin(), manifest.colnames.cend(), name_i[-1]); + manifest.colnames.insert(dest_i + 1, *name_i); + } + } + } + + if (narc_mode) { + fs::path naixfilename; + fs::path narcfilename; + std::ofstream naixfile; + std::string guard, guard_sub; + if (naix_mode) { + static const char do_not_modify[] = "/*\n" + " * THIS FILE WAS AUTOMATICALLY\n" + " * GENERATED BY tools/csv2bin\n" + " * DO NOT MODIFY!!!\n" + " */\n"; + narcfilename = posargs[2]; + naixfilename = narcfilename.replace_extension("naix"); + naixfile.open(naixfilename, std::ios::out); + naixfile << do_not_modify << std::endl; + guard_sub = narcfilename.replace_extension().filename().string(); + guard = "NARC_" + guard_sub + "_NAIX_"; + to_upper(guard); + naixfile << "#ifndef " << guard << std::endl; + naixfile << "#define " << guard << std::endl; + naixfile << std::endl; + naixfile << "enum {" << std::endl; + } + unsigned gmif_size = manifest.size() * csvFile.nrow() + 8; + unsigned btaf_size = 8 * csvFile.nrow() + 12; + unsigned btnf_size = 16; + auto *narc_header = new unsigned char[16]; + auto *gmif = new unsigned char[8]; + auto *btnf = new unsigned char[btnf_size]; + auto *btaf = new unsigned char[btaf_size]; + memcpy(narc_header, "NARC\xFE\xFF\x00\x01\x00\x00\x00\x00\x10\x00\x03\x00", 16); + to_array(narc_header, gmif_size + btaf_size + btnf_size + 16, 8); + memcpy(btaf, "BTAF", 4); + to_array(btaf, btaf_size, 4); + to_array(btaf, csvFile.nrow(), 8); + for (int i = 0; i < csvFile.nrow(); i++) { + to_array(btaf, i * manifest.size(), 12 + 8 * i); + to_array(btaf, i * manifest.size() + manifest.size(0), 16 + 8 * i); + if (naix_mode) { + char num_buf[10] = {0}; + sprintf(num_buf, "%04d", i); + naixfile << " NARC_" << guard_sub << "_" << num_buf << "_bin = " << i << "," << std::endl; + } + } + memcpy(btnf, "BTNF\x10\x00\x00\x00\x04\x00\x00\x00\x00\x00\x01\x00", 16); + memcpy(gmif, "GMIF", 4); + to_array(gmif, gmif_size, 4); + binfile.out->write((const char *)narc_header, 16); + binfile.out->write((const char *)btaf, btaf_size); + binfile.out->write((const char *)btnf, btnf_size); + binfile.out->write((const char *)gmif, 8); + delete[] gmif; + delete[] btnf; + delete[] btaf; + delete[] narc_header; + if (naix_mode) { + naixfile << "};" << std::endl; + naixfile << std::endl; + naixfile << "#endif // " << guard << std::endl; + naixfile.close(); + } + } + + BufferedRowConverter converter(manifest, csvFile, padval); + for (const auto &row : csvFile) { + *binfile.out << converter; + } + return 0; +} + +int Options::main_disasm() { + std::vector colnames; + // pad cols are skipped from the csv but not the binary + for (auto name_i = manifest.colnames.begin(); name_i != manifest.colnames.end(); name_i ++) { + if (!manifest[*name_i].is_padding()) { + colnames.emplace_back(*name_i); + } + } + size_t binfsize; + size_t manifest_size = manifest.size(); + if (narc_mode) { + static unsigned char narc_header[16]; + static unsigned char btaf_header[12]; + binfile.in->read((char *)narc_header, 16); + assert(memcmp(narc_header, "NARC\xfe\xff\x00\x01", 8) == 0); + binfile.in->read((char *)btaf_header, 12); + assert(memcmp(btaf_header, "BTAF", 4) == 0); + size_t fatb_size = from_array(btaf_header, 4) - 12; + size_t nrow = from_array(btaf_header, 8); + binfile.in->seekg(fatb_size, std::ios::cur); + static unsigned char btnf_header[8]; + binfile.in->read((char *)btnf_header, 8); + assert(memcmp(btnf_header, "BTNF", 4) == 0); + size_t fntb_size = from_array(btnf_header, 4) - 8; + binfile.in->seekg(fntb_size, std::ios::cur); + static unsigned char gmif_header[8]; + binfile.in->read((char *)gmif_header, 8); + assert(memcmp(gmif_header, "GMIF", 4) == 0); + binfsize = from_array(gmif_header, 4) - 8; + assert(binfsize / manifest_size == nrow); + } else { + // binfile was opened at end (ios::ate) + binfsize = binfile.in->tellg(); + // rewind + binfile.in->seekg(0); + } + assert(binfsize % manifest_size == 0); + csvFile.resize(binfsize / manifest_size, colnames.size()); + csvFile.SetColnames(colnames.cbegin(), colnames.cend()); + + BufferedRowConverter converter(manifest, csvFile, padval); + for (int i = 0; i < csvFile.nrow(); i++) { + *binfile.in >> converter; + } + csvFile.ToFile(posargs[1]); + return 0; +} diff --git a/tools/csv2bin/Options.h b/tools/csv2bin/Options.h new file mode 100644 index 00000000..2ecfa3a6 --- /dev/null +++ b/tools/csv2bin/Options.h @@ -0,0 +1,45 @@ +#ifndef GUARD_OPTIONS_H +#define GUARD_OPTIONS_H + +#include "global.h" +#include "CsvFile.h" +#include "Manifest.h" + +enum ExecMode { + EXEC_UNSET = 0, + EXEC_CSV2BIN = 1, + EXEC_BIN2CSV = 2, +}; + +class argument_error : public std::runtime_error { +public: + explicit argument_error(const char *s) : std::runtime_error(s) {} + explicit argument_error(const std::string &s) : std::runtime_error(s) {} +}; + +class Options { + ExecMode execMode = EXEC_UNSET; + union { + std::ifstream *in; + std::ofstream *out; + } binfile; + CsvFile csvFile; + Manifest manifest; + std::vector include_paths; + std::vector posargs; + bool narc_mode = false; + bool naix_mode = false; + unsigned char padval = 0; + + int main_compile(); + int main_disasm(); +public: + static void short_usage(std::ostream &strm = std::cout); + static void usage(std::ostream &strm = std::cout); + Options(int argc, char ** argv); + ~Options(); + int main(); +}; + + +#endif //GUARD_OPTIONS_H diff --git a/tools/csv2bin/global.h b/tools/csv2bin/global.h new file mode 100644 index 00000000..3ab47794 --- /dev/null +++ b/tools/csv2bin/global.h @@ -0,0 +1,22 @@ +#ifndef GUARD_GLOBAL_H +#define GUARD_GLOBAL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if (__cplusplus < 201703L) +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif + +#endif //GUARD_GLOBAL_H diff --git a/tools/csv2bin/main.cpp b/tools/csv2bin/main.cpp new file mode 100644 index 00000000..5525d07b --- /dev/null +++ b/tools/csv2bin/main.cpp @@ -0,0 +1,21 @@ +#include "Options.h" + +int main(int argc, char ** argv) { +#ifdef NDEBUG + try { +#endif + return Options(argc, argv).main(); +#ifdef NDEBUG + } catch (std::bad_alloc const &e ) { + std::cerr << "csv2bin fatal error: bad alloc: " << e.what() << std::endl; + return 1; + } catch (argument_error const &e ) { + Options::short_usage(std::cerr); + std::cerr << "csv2bin argument error: " << e.what() << std::endl; + return 1; + } catch (std::exception const &e) { + std::cerr << "csv2bin error: " << e.what() << std::endl; + return 1; + } +#endif +} diff --git a/tools/fixrom/.gitignore b/tools/fixrom/.gitignore new file mode 100644 index 00000000..8ab48d98 --- /dev/null +++ b/tools/fixrom/.gitignore @@ -0,0 +1 @@ +fixrom diff --git a/tools/fixrom/Makefile b/tools/fixrom/Makefile new file mode 100644 index 00000000..7a3b5e0d --- /dev/null +++ b/tools/fixrom/Makefile @@ -0,0 +1,13 @@ +CC := gcc +CFLAGS := -O3 + +.PHONY: all clean + +all: fixrom + @: + +fixrom: fixrom.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + $(RM) fixrom fixrom.exe diff --git a/tools/fixrom/fixrom.c b/tools/fixrom/fixrom.c new file mode 100644 index 00000000..928a546a --- /dev/null +++ b/tools/fixrom/fixrom.c @@ -0,0 +1,190 @@ +#include +#include +#include +#include +#include +#include +#include + +#define HEADER_SIZE 0x4000 + +uint8_t RomHeader[HEADER_SIZE]; + +static inline noreturn __attribute__((format(printf, 1, 2))) void fatal_error(const char * message, ...) +{ + va_list va_args; + va_start(va_args, message); + fputs("Error: ", stderr); + vfprintf(stderr, message, va_args); + fputc('\n', stderr); + va_end(va_args); + exit(EXIT_FAILURE); +} + +static inline void OffsetCheck(int offset) +{ + if (offset < 0 || offset >= HEADER_SIZE) + { + fatal_error("illegal access to header+%d", offset); + } +} + +static inline uint16_t HeaderReadU16LE(int offset) +{ + OffsetCheck(offset); + return RomHeader[offset] | + (RomHeader[offset + 1] << 8); +} + +static inline uint32_t HeaderReadU32LE(int offset) +{ + OffsetCheck(offset); + return RomHeader[offset] | + (RomHeader[offset + 1] << 8) | + (RomHeader[offset + 2] << 16) | + (RomHeader[offset + 3] << 24); +} + +static inline void HeaderWriteU16LE(int offset, uint16_t value) +{ + OffsetCheck(offset); + RomHeader[offset] = value; + RomHeader[offset + 1] = value >> 8; +} +static inline void HeaderWriteU32LE(int offset, uint32_t value) +{ + OffsetCheck(offset); + RomHeader[offset] = value; + RomHeader[offset + 1] = value >> 8; + RomHeader[offset + 2] = value >> 16; + RomHeader[offset + 3] = value >> 24; +} + +static uint16_t Calc_CRC16(uint8_t * data, size_t length, uint16_t crc) +{ + static uint16_t CrcTable[16] = { + 0x0000, + 0xCC01, + 0xD801, + 0x1400, + 0xF001, + 0x3C00, + 0x2800, + 0xE401, + 0xA001, + 0x6C00, + 0x7800, + 0xB401, + 0x5000, + 0x9C01, + 0x8801, + 0x4400, + }; + + uint16_t x = 0; + uint16_t y; + uint16_t bit = 0; + uint8_t * end = data + length; + while (data < end) + { + if (bit == 0) + { + x = data[0] | (data[1] << 8); + } + y = CrcTable[crc & 15]; + crc >>= 4; + crc ^= y; + y = CrcTable[(x >> bit) & 15]; + crc ^= y; + bit += 4; + if (bit == 16) + { + data += 2; + bit = 0; + } + } + return crc; +} + +int main(int argc, char ** argv) +{ + uint16_t secure_crc = 0xFFFF; + char game_code[4] = "NTRJ"; + int override_crc = 0; + int override_code = 0; + FILE * rom = NULL; + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--secure-crc") == 0) + { + if (override_crc) + { + fatal_error("multiple --secure-crc options specified"); + } + char * endptr; + unsigned long secure_crc_l = strtoul(argv[++i], &endptr, 0); + if (secure_crc_l == 0 && endptr == argv[i]) + { + fatal_error("argument to --secure-crc must be an integer"); + } + if (secure_crc_l >= 0x10000) + { + fatal_error("argument to --secure-crc must be a 16-bit integer"); + } + secure_crc = secure_crc_l; + override_crc = 1; + } + else if (strcmp(argv[i], "--game-code") == 0) + { + if (override_code) + { + fatal_error("multiple --game-code options specified"); + } + if (strlen(argv[++i]) > 4) + { + fatal_error("argument to --game-code must be 4 characters or fewer"); + } + strncpy(game_code, argv[i], 4); + override_code = 1; + } + else + { + if (rom != NULL) + { + fatal_error("unrecognized %s argument: %s", argv[i][0] == '-' ? "flag" : "positional", argv[i]); + } + rom = fopen(argv[i], "r+b"); + if (rom == NULL) + { + fatal_error(argv[i][0] == '-' ? "unrecognized flag argument: %s" : "unable to open file '%s' for reading", argv[i]); + } + } + } + + if (fread(RomHeader, 1, HEADER_SIZE, rom) != HEADER_SIZE) + { + fatal_error("error reading the ROM header"); + } + + if (override_crc) + { + HeaderWriteU16LE(0x6C, secure_crc); + } + + if (override_code) + { + memcpy(RomHeader + 0xC, game_code, 4); + } + + uint16_t header_crc = Calc_CRC16((uint8_t *)RomHeader, 0x15E, 0xFFFF); + HeaderWriteU16LE(0x15E, header_crc); + + fseek(rom, 0, SEEK_SET); + if (fwrite(RomHeader, 1, HEADER_SIZE, rom) != HEADER_SIZE) + { + fatal_error("error writing the ROM header"); + } + + fclose(rom); + return EXIT_SUCCESS; +} diff --git a/tools/gen_fx_consts/.gitignore b/tools/gen_fx_consts/.gitignore new file mode 100644 index 00000000..d091085c --- /dev/null +++ b/tools/gen_fx_consts/.gitignore @@ -0,0 +1 @@ +gen_fx_consts diff --git a/tools/gen_fx_consts/Makefile b/tools/gen_fx_consts/Makefile new file mode 100644 index 00000000..9c9d3f4e --- /dev/null +++ b/tools/gen_fx_consts/Makefile @@ -0,0 +1,31 @@ +CC = gcc +CFLAGS := -O3 -g -DNDEBUG -DSOURCE_DIR="\"$(CURDIR)\"" + +SRCS := main.c fx_encode.c fx_data.c +OBJS := $(SRCS:%.c=%.o) + +prog := gen_fx_consts + +.PHONY: all clean + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +all: $(prog) + @: + +clean: ; $(RM) -r $(DEPDIR) $(OBJS) $(prog) $(prog).exe + +$(prog): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +$(OBJS): %.o: %.c +$(OBJS): %.o: %.c $(DEPDIR)/%.d | $(DEPDIR) + $(CC) $(CFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; mkdir -p $@ + +DEPFILES := $(SRCS:%.c=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/gen_fx_consts/fx.h b/tools/gen_fx_consts/fx.h new file mode 100644 index 00000000..93984e02 --- /dev/null +++ b/tools/gen_fx_consts/fx.h @@ -0,0 +1,31 @@ +#ifndef GUARD_FX_H +#define GUARD_FX_H + +#include + +struct FxSpec { + const char *name; + int intpart; + int fracpart; +}; + +struct FxConst { + char *name; + const struct FxSpec *fxtype; + double value; +}; + +extern struct FxConst *gFxConstTable; +extern size_t gNFxConstTable; + +// Init and delete the above two objects +void FxConstTableInit(void); +void FxConstTableEnd(void); + +// Generates the integer value of the fixed-point value represented by FxConst* +long long MakeFix(const struct FxConst *constdef); + +// For FxSpec*, get the width in bits. +int GetFxWidth(const struct FxSpec *fxtype); + +#endif //GUARD_FX_H diff --git a/tools/gen_fx_consts/fx_const.csv b/tools/gen_fx_consts/fx_const.csv new file mode 100644 index 00000000..713aaa33 --- /dev/null +++ b/tools/gen_fx_consts/fx_const.csv @@ -0,0 +1,862 @@ +#name,type,value +E,fx64c,2.7182818284590452354 +LOG2E,fx64c,1.4426950408889634074 +LOG10E,fx64c,0.43429448190325182765 +LN2,fx64c,0.69314718055994530942 +LN10,fx64c,2.30258509299404568402 +PI,fx64c,3.14159265358979323846 +TWOPI,fx64c,6.28318530717958647692 +PI_2,fx64c,1.57079632679489661923 +PI_4,fx64c,0.78539816339744830962 +3PI_4,fx64c,2.3561944901923448370 +SQRTPI,fx64c,1.77245385090551602793 +1_PI,fx64c,0.31830988618379067154 +2_PI,fx64c,0.63661977236758134308 +2_SQRTPI,fx64c,1.12837916709551257390 +SQRT2,fx64c,1.41421356237309504880 +SQRT1_2,fx64c,0.70710678118654752440 +SQRT3,fx64c,1.73205080756887719000 +SQRT1_3,fx64c,0.57735026918962576450914878050196 +IVLN10,fx64c,0.43429448190325182765 +LOG2_E,fx64c,0.693147180559945309417 +INVLN2,fx64c,1.4426950408889633870 +1_360,fx64c,0.0027777777777777777778 +TWOPI_360,fx64c,0.0174532925199432957692 +360_TWOPI,fx64c,57.295779513082320876846 +65536_TWOPI,fx64c,10430.378350470452724958342593503 +65536_360,fx64c,182.04444444444444444444444444444 +TWOPI_65536,fx64c,0.0000958737992428525768572998046875 +360_65536,fx64c,0.0054931640625 +1_100,fx64c,0.01000000000000000000 +2_100,fx64c,0.02000000000000000000 +3_100,fx64c,0.03000000000000000000 +4_100,fx64c,0.04000000000000000000 +5_100,fx64c,0.05000000000000000000 +6_100,fx64c,0.06000000000000000000 +7_100,fx64c,0.07000000000000000000 +8_100,fx64c,0.08000000000000000000 +9_100,fx64c,0.09000000000000000000 +10_100,fx64c,0.10000000000000000000 +11_100,fx64c,0.11000000000000000000 +12_100,fx64c,0.12000000000000000000 +13_100,fx64c,0.13000000000000000000 +14_100,fx64c,0.14000000000000000000 +15_100,fx64c,0.15000000000000000000 +16_100,fx64c,0.16000000000000000000 +17_100,fx64c,0.17000000000000000000 +18_100,fx64c,0.18000000000000000000 +19_100,fx64c,0.19000000000000000000 +20_100,fx64c,0.20000000000000000000 +21_100,fx64c,0.21000000000000000000 +22_100,fx64c,0.22000000000000000000 +23_100,fx64c,0.23000000000000000000 +24_100,fx64c,0.24000000000000000000 +25_100,fx64c,0.25000000000000000000 +26_100,fx64c,0.26000000000000000000 +27_100,fx64c,0.27000000000000000000 +28_100,fx64c,0.28000000000000000000 +29_100,fx64c,0.29000000000000000000 +30_100,fx64c,0.30000000000000000000 +31_100,fx64c,0.31000000000000000000 +32_100,fx64c,0.32000000000000000000 +33_100,fx64c,0.33000000000000000000 +34_100,fx64c,0.34000000000000000000 +35_100,fx64c,0.35000000000000000000 +36_100,fx64c,0.36000000000000000000 +37_100,fx64c,0.37000000000000000000 +38_100,fx64c,0.38000000000000000000 +39_100,fx64c,0.39000000000000000000 +40_100,fx64c,0.40000000000000000000 +41_100,fx64c,0.41000000000000000000 +42_100,fx64c,0.42000000000000000000 +43_100,fx64c,0.43000000000000000000 +44_100,fx64c,0.44000000000000000000 +45_100,fx64c,0.45000000000000000000 +46_100,fx64c,0.46000000000000000000 +47_100,fx64c,0.47000000000000000000 +48_100,fx64c,0.48000000000000000000 +49_100,fx64c,0.49000000000000000000 +50_100,fx64c,0.50000000000000000000 +51_100,fx64c,0.51000000000000000000 +52_100,fx64c,0.52000000000000000000 +53_100,fx64c,0.53000000000000000000 +54_100,fx64c,0.54000000000000000000 +55_100,fx64c,0.55000000000000000000 +56_100,fx64c,0.56000000000000000000 +57_100,fx64c,0.57000000000000000000 +58_100,fx64c,0.58000000000000000000 +59_100,fx64c,0.59000000000000000000 +60_100,fx64c,0.60000000000000000000 +61_100,fx64c,0.61000000000000000000 +62_100,fx64c,0.62000000000000000000 +63_100,fx64c,0.63000000000000000000 +64_100,fx64c,0.64000000000000000000 +65_100,fx64c,0.65000000000000000000 +66_100,fx64c,0.66000000000000000000 +67_100,fx64c,0.67000000000000000000 +68_100,fx64c,0.68000000000000000000 +69_100,fx64c,0.69000000000000000000 +70_100,fx64c,0.70000000000000000000 +71_100,fx64c,0.71000000000000000000 +72_100,fx64c,0.72000000000000000000 +73_100,fx64c,0.73000000000000000000 +74_100,fx64c,0.74000000000000000000 +75_100,fx64c,0.75000000000000000000 +76_100,fx64c,0.76000000000000000000 +77_100,fx64c,0.77000000000000000000 +78_100,fx64c,0.78000000000000000000 +79_100,fx64c,0.79000000000000000000 +80_100,fx64c,0.80000000000000000000 +81_100,fx64c,0.81000000000000000000 +82_100,fx64c,0.82000000000000000000 +83_100,fx64c,0.83000000000000000000 +84_100,fx64c,0.84000000000000000000 +85_100,fx64c,0.85000000000000000000 +86_100,fx64c,0.86000000000000000000 +87_100,fx64c,0.87000000000000000000 +88_100,fx64c,0.88000000000000000000 +89_100,fx64c,0.89000000000000000000 +90_100,fx64c,0.90000000000000000000 +91_100,fx64c,0.91000000000000000000 +92_100,fx64c,0.92000000000000000000 +93_100,fx64c,0.93000000000000000000 +94_100,fx64c,0.94000000000000000000 +95_100,fx64c,0.95000000000000000000 +96_100,fx64c,0.96000000000000000000 +97_100,fx64c,0.97000000000000000000 +98_100,fx64c,0.98000000000000000000 +99_100,fx64c,0.99000000000000000000 +ONE,fx64c,1.00000000000000000000 +HALF,fx64c,0.50000000000000000000 +ONE,fx32,1.00000000000000000000 +HALF,fx32,0.50000000000000000000 +SQRT2,fx32,1.41421356237309504880 +SQRT1_2,fx32,0.70710678118654752440 +SQRT3,fx32,1.73205080756887719000 +SQRT1_3,fx32,0.57735026918962576450914878050196 +ONE,fx16,1.00000000000000000000 +HALF,fx16,0.50000000000000000000 +SQRT2,fx16,1.41421356237309504880 +SQRT1_2,fx16,0.70710678118654752440 +SQRT3,fx16,1.73205080756887719000 +SQRT1_3,fx16,0.57735026918962576450914878050196 +SIN0,fx32,0 +SIN1,fx32,0.0174524064372835 +SIN2,fx32,0.034899496702501 +SIN3,fx32,0.0523359562429438 +SIN4,fx32,0.0697564737441253 +SIN5,fx32,0.0871557427476582 +SIN6,fx32,0.104528463267653 +SIN7,fx32,0.121869343405147 +SIN8,fx32,0.139173100960065 +SIN9,fx32,0.156434465040231 +SIN10,fx32,0.17364817766693 +SIN11,fx32,0.190808995376545 +SIN12,fx32,0.207911690817759 +SIN13,fx32,0.224951054343865 +SIN14,fx32,0.241921895599668 +SIN15,fx32,0.258819045102521 +SIN16,fx32,0.275637355816999 +SIN17,fx32,0.292371704722737 +SIN18,fx32,0.309016994374947 +SIN19,fx32,0.325568154457157 +SIN20,fx32,0.342020143325669 +SIN21,fx32,0.3583679495453 +SIN22,fx32,0.374606593415912 +SIN23,fx32,0.390731128489274 +SIN24,fx32,0.4067366430758 +SIN25,fx32,0.422618261740699 +SIN26,fx32,0.438371146789077 +SIN27,fx32,0.453990499739547 +SIN28,fx32,0.469471562785891 +SIN29,fx32,0.484809620246337 +SIN30,fx32,0.5 +SIN31,fx32,0.515038074910054 +SIN32,fx32,0.529919264233205 +SIN33,fx32,0.544639035015027 +SIN34,fx32,0.559192903470747 +SIN35,fx32,0.573576436351046 +SIN36,fx32,0.587785252292473 +SIN37,fx32,0.601815023152048 +SIN38,fx32,0.615661475325658 +SIN39,fx32,0.629320391049837 +SIN40,fx32,0.642787609686539 +SIN41,fx32,0.656059028990507 +SIN42,fx32,0.669130606358858 +SIN43,fx32,0.681998360062498 +SIN44,fx32,0.694658370458997 +SIN45,fx32,0.707106781186547 +SIN46,fx32,0.719339800338651 +SIN47,fx32,0.73135370161917 +SIN48,fx32,0.743144825477394 +SIN49,fx32,0.754709580222772 +SIN50,fx32,0.766044443118978 +SIN51,fx32,0.777145961456971 +SIN52,fx32,0.788010753606722 +SIN53,fx32,0.798635510047293 +SIN54,fx32,0.809016994374947 +SIN55,fx32,0.819152044288992 +SIN56,fx32,0.829037572555042 +SIN57,fx32,0.838670567945424 +SIN58,fx32,0.848048096156426 +SIN59,fx32,0.857167300702112 +SIN60,fx32,0.866025403784439 +SIN61,fx32,0.874619707139396 +SIN62,fx32,0.882947592858927 +SIN63,fx32,0.891006524188368 +SIN64,fx32,0.898794046299167 +SIN65,fx32,0.90630778703665 +SIN66,fx32,0.913545457642601 +SIN67,fx32,0.92050485345244 +SIN68,fx32,0.927183854566787 +SIN69,fx32,0.933580426497202 +SIN70,fx32,0.939692620785908 +SIN71,fx32,0.945518575599317 +SIN72,fx32,0.951056516295154 +SIN73,fx32,0.956304755963035 +SIN74,fx32,0.961261695938319 +SIN75,fx32,0.965925826289068 +SIN76,fx32,0.970295726275996 +SIN77,fx32,0.974370064785235 +SIN78,fx32,0.978147600733806 +SIN79,fx32,0.981627183447664 +SIN80,fx32,0.984807753012208 +SIN81,fx32,0.987688340595138 +SIN82,fx32,0.99026806874157 +SIN83,fx32,0.992546151641322 +SIN84,fx32,0.994521895368273 +SIN85,fx32,0.996194698091746 +SIN86,fx32,0.997564050259824 +SIN87,fx32,0.998629534754574 +SIN88,fx32,0.999390827019096 +SIN89,fx32,0.999847695156391 +SIN90,fx32,1 +SIN91,fx32,0.999847695156391 +SIN92,fx32,0.999390827019096 +SIN93,fx32,0.998629534754574 +SIN94,fx32,0.997564050259824 +SIN95,fx32,0.996194698091746 +SIN96,fx32,0.994521895368273 +SIN97,fx32,0.992546151641322 +SIN98,fx32,0.99026806874157 +SIN99,fx32,0.987688340595138 +SIN100,fx32,0.984807753012208 +SIN101,fx32,0.981627183447664 +SIN102,fx32,0.978147600733806 +SIN103,fx32,0.974370064785235 +SIN104,fx32,0.970295726275996 +SIN105,fx32,0.965925826289068 +SIN106,fx32,0.961261695938319 +SIN107,fx32,0.956304755963036 +SIN108,fx32,0.951056516295154 +SIN109,fx32,0.945518575599317 +SIN110,fx32,0.939692620785908 +SIN111,fx32,0.933580426497202 +SIN112,fx32,0.927183854566787 +SIN113,fx32,0.92050485345244 +SIN114,fx32,0.913545457642601 +SIN115,fx32,0.90630778703665 +SIN116,fx32,0.898794046299167 +SIN117,fx32,0.891006524188368 +SIN118,fx32,0.882947592858927 +SIN119,fx32,0.874619707139396 +SIN120,fx32,0.866025403784439 +SIN121,fx32,0.857167300702112 +SIN122,fx32,0.848048096156426 +SIN123,fx32,0.838670567945424 +SIN124,fx32,0.829037572555042 +SIN125,fx32,0.819152044288992 +SIN126,fx32,0.809016994374947 +SIN127,fx32,0.798635510047293 +SIN128,fx32,0.788010753606722 +SIN129,fx32,0.777145961456971 +SIN130,fx32,0.766044443118978 +SIN131,fx32,0.754709580222772 +SIN132,fx32,0.743144825477394 +SIN133,fx32,0.731353701619171 +SIN134,fx32,0.719339800338651 +SIN135,fx32,0.707106781186548 +SIN136,fx32,0.694658370458997 +SIN137,fx32,0.681998360062498 +SIN138,fx32,0.669130606358858 +SIN139,fx32,0.656059028990507 +SIN140,fx32,0.642787609686539 +SIN141,fx32,0.629320391049837 +SIN142,fx32,0.615661475325658 +SIN143,fx32,0.601815023152048 +SIN144,fx32,0.587785252292473 +SIN145,fx32,0.573576436351046 +SIN146,fx32,0.559192903470747 +SIN147,fx32,0.544639035015027 +SIN148,fx32,0.529919264233205 +SIN149,fx32,0.515038074910054 +SIN150,fx32,0.5 +SIN151,fx32,0.484809620246337 +SIN152,fx32,0.469471562785891 +SIN153,fx32,0.453990499739547 +SIN154,fx32,0.438371146789077 +SIN155,fx32,0.422618261740699 +SIN156,fx32,0.4067366430758 +SIN157,fx32,0.390731128489274 +SIN158,fx32,0.374606593415912 +SIN159,fx32,0.3583679495453 +SIN160,fx32,0.342020143325669 +SIN161,fx32,0.325568154457157 +SIN162,fx32,0.309016994374948 +SIN163,fx32,0.292371704722737 +SIN164,fx32,0.275637355816999 +SIN165,fx32,0.258819045102521 +SIN166,fx32,0.241921895599668 +SIN167,fx32,0.224951054343865 +SIN168,fx32,0.207911690817759 +SIN169,fx32,0.190808995376545 +SIN170,fx32,0.17364817766693 +SIN171,fx32,0.156434465040231 +SIN172,fx32,0.139173100960065 +SIN173,fx32,0.121869343405148 +SIN174,fx32,0.104528463267654 +SIN175,fx32,0.0871557427476582 +SIN176,fx32,0.0697564737441255 +SIN177,fx32,0.0523359562429438 +SIN178,fx32,0.0348994967025011 +SIN179,fx32,0.0174524064372834 +SIN180,fx32,1.22464679914735e-16 +SIN181,fx32,-0.0174524064372836 +SIN182,fx32,-0.0348994967025009 +SIN183,fx32,-0.0523359562429436 +SIN184,fx32,-0.0697564737441253 +SIN185,fx32,-0.0871557427476579 +SIN186,fx32,-0.104528463267653 +SIN187,fx32,-0.121869343405147 +SIN188,fx32,-0.139173100960066 +SIN189,fx32,-0.156434465040231 +SIN190,fx32,-0.17364817766693 +SIN191,fx32,-0.190808995376545 +SIN192,fx32,-0.20791169081776 +SIN193,fx32,-0.224951054343865 +SIN194,fx32,-0.241921895599668 +SIN195,fx32,-0.258819045102521 +SIN196,fx32,-0.275637355816999 +SIN197,fx32,-0.292371704722737 +SIN198,fx32,-0.309016994374947 +SIN199,fx32,-0.325568154457157 +SIN200,fx32,-0.342020143325669 +SIN201,fx32,-0.3583679495453 +SIN202,fx32,-0.374606593415912 +SIN203,fx32,-0.390731128489274 +SIN204,fx32,-0.4067366430758 +SIN205,fx32,-0.422618261740699 +SIN206,fx32,-0.438371146789077 +SIN207,fx32,-0.453990499739547 +SIN208,fx32,-0.469471562785891 +SIN209,fx32,-0.484809620246337 +SIN210,fx32,-0.5 +SIN211,fx32,-0.515038074910054 +SIN212,fx32,-0.529919264233205 +SIN213,fx32,-0.544639035015027 +SIN214,fx32,-0.559192903470747 +SIN215,fx32,-0.573576436351046 +SIN216,fx32,-0.587785252292473 +SIN217,fx32,-0.601815023152048 +SIN218,fx32,-0.615661475325658 +SIN219,fx32,-0.629320391049838 +SIN220,fx32,-0.642787609686539 +SIN221,fx32,-0.656059028990507 +SIN222,fx32,-0.669130606358858 +SIN223,fx32,-0.681998360062498 +SIN224,fx32,-0.694658370458997 +SIN225,fx32,-0.707106781186547 +SIN226,fx32,-0.719339800338651 +SIN227,fx32,-0.73135370161917 +SIN228,fx32,-0.743144825477394 +SIN229,fx32,-0.754709580222772 +SIN230,fx32,-0.766044443118978 +SIN231,fx32,-0.777145961456971 +SIN232,fx32,-0.788010753606722 +SIN233,fx32,-0.798635510047293 +SIN234,fx32,-0.809016994374947 +SIN235,fx32,-0.819152044288992 +SIN236,fx32,-0.829037572555042 +SIN237,fx32,-0.838670567945424 +SIN238,fx32,-0.848048096156426 +SIN239,fx32,-0.857167300702112 +SIN240,fx32,-0.866025403784438 +SIN241,fx32,-0.874619707139396 +SIN242,fx32,-0.882947592858927 +SIN243,fx32,-0.891006524188368 +SIN244,fx32,-0.898794046299167 +SIN245,fx32,-0.90630778703665 +SIN246,fx32,-0.913545457642601 +SIN247,fx32,-0.92050485345244 +SIN248,fx32,-0.927183854566787 +SIN249,fx32,-0.933580426497202 +SIN250,fx32,-0.939692620785908 +SIN251,fx32,-0.945518575599317 +SIN252,fx32,-0.951056516295154 +SIN253,fx32,-0.956304755963035 +SIN254,fx32,-0.961261695938319 +SIN255,fx32,-0.965925826289068 +SIN256,fx32,-0.970295726275996 +SIN257,fx32,-0.974370064785235 +SIN258,fx32,-0.978147600733806 +SIN259,fx32,-0.981627183447664 +SIN260,fx32,-0.984807753012208 +SIN261,fx32,-0.987688340595138 +SIN262,fx32,-0.99026806874157 +SIN263,fx32,-0.992546151641322 +SIN264,fx32,-0.994521895368273 +SIN265,fx32,-0.996194698091746 +SIN266,fx32,-0.997564050259824 +SIN267,fx32,-0.998629534754574 +SIN268,fx32,-0.999390827019096 +SIN269,fx32,-0.999847695156391 +SIN270,fx32,-1 +SIN271,fx32,-0.999847695156391 +SIN272,fx32,-0.999390827019096 +SIN273,fx32,-0.998629534754574 +SIN274,fx32,-0.997564050259824 +SIN275,fx32,-0.996194698091746 +SIN276,fx32,-0.994521895368273 +SIN277,fx32,-0.992546151641322 +SIN278,fx32,-0.99026806874157 +SIN279,fx32,-0.987688340595138 +SIN280,fx32,-0.984807753012208 +SIN281,fx32,-0.981627183447664 +SIN282,fx32,-0.978147600733806 +SIN283,fx32,-0.974370064785235 +SIN284,fx32,-0.970295726275997 +SIN285,fx32,-0.965925826289068 +SIN286,fx32,-0.961261695938319 +SIN287,fx32,-0.956304755963035 +SIN288,fx32,-0.951056516295154 +SIN289,fx32,-0.945518575599317 +SIN290,fx32,-0.939692620785908 +SIN291,fx32,-0.933580426497202 +SIN292,fx32,-0.927183854566787 +SIN293,fx32,-0.92050485345244 +SIN294,fx32,-0.913545457642601 +SIN295,fx32,-0.90630778703665 +SIN296,fx32,-0.898794046299167 +SIN297,fx32,-0.891006524188368 +SIN298,fx32,-0.882947592858927 +SIN299,fx32,-0.874619707139396 +SIN300,fx32,-0.866025403784439 +SIN301,fx32,-0.857167300702112 +SIN302,fx32,-0.848048096156426 +SIN303,fx32,-0.838670567945424 +SIN304,fx32,-0.829037572555042 +SIN305,fx32,-0.819152044288992 +SIN306,fx32,-0.809016994374948 +SIN307,fx32,-0.798635510047293 +SIN308,fx32,-0.788010753606722 +SIN309,fx32,-0.777145961456971 +SIN310,fx32,-0.766044443118978 +SIN311,fx32,-0.754709580222772 +SIN312,fx32,-0.743144825477395 +SIN313,fx32,-0.73135370161917 +SIN314,fx32,-0.719339800338651 +SIN315,fx32,-0.707106781186548 +SIN316,fx32,-0.694658370458998 +SIN317,fx32,-0.681998360062498 +SIN318,fx32,-0.669130606358858 +SIN319,fx32,-0.656059028990507 +SIN320,fx32,-0.64278760968654 +SIN321,fx32,-0.629320391049838 +SIN322,fx32,-0.615661475325658 +SIN323,fx32,-0.601815023152048 +SIN324,fx32,-0.587785252292473 +SIN325,fx32,-0.573576436351046 +SIN326,fx32,-0.559192903470747 +SIN327,fx32,-0.544639035015027 +SIN328,fx32,-0.529919264233205 +SIN329,fx32,-0.515038074910054 +SIN330,fx32,-0.5 +SIN331,fx32,-0.484809620246337 +SIN332,fx32,-0.469471562785891 +SIN333,fx32,-0.453990499739547 +SIN334,fx32,-0.438371146789078 +SIN335,fx32,-0.422618261740699 +SIN336,fx32,-0.4067366430758 +SIN337,fx32,-0.390731128489274 +SIN338,fx32,-0.374606593415912 +SIN339,fx32,-0.358367949545301 +SIN340,fx32,-0.342020143325669 +SIN341,fx32,-0.325568154457157 +SIN342,fx32,-0.309016994374948 +SIN343,fx32,-0.292371704722737 +SIN344,fx32,-0.275637355816999 +SIN345,fx32,-0.258819045102521 +SIN346,fx32,-0.241921895599668 +SIN347,fx32,-0.224951054343865 +SIN348,fx32,-0.20791169081776 +SIN349,fx32,-0.190808995376545 +SIN350,fx32,-0.17364817766693 +SIN351,fx32,-0.156434465040231 +SIN352,fx32,-0.139173100960066 +SIN353,fx32,-0.121869343405147 +SIN354,fx32,-0.104528463267653 +SIN355,fx32,-0.0871557427476583 +SIN356,fx32,-0.0697564737441256 +SIN357,fx32,-0.0523359562429444 +SIN358,fx32,-0.0348994967025008 +SIN359,fx32,-0.0174524064372836 +COS0,fx32,1 +COS1,fx32,0.999847695156391 +COS2,fx32,0.999390827019096 +COS3,fx32,0.998629534754574 +COS4,fx32,0.997564050259824 +COS5,fx32,0.996194698091746 +COS6,fx32,0.994521895368273 +COS7,fx32,0.992546151641322 +COS8,fx32,0.99026806874157 +COS9,fx32,0.987688340595138 +COS10,fx32,0.984807753012208 +COS11,fx32,0.981627183447664 +COS12,fx32,0.978147600733806 +COS13,fx32,0.974370064785235 +COS14,fx32,0.970295726275996 +COS15,fx32,0.965925826289068 +COS16,fx32,0.961261695938319 +COS17,fx32,0.956304755963035 +COS18,fx32,0.951056516295154 +COS19,fx32,0.945518575599317 +COS20,fx32,0.939692620785908 +COS21,fx32,0.933580426497202 +COS22,fx32,0.927183854566787 +COS23,fx32,0.92050485345244 +COS24,fx32,0.913545457642601 +COS25,fx32,0.90630778703665 +COS26,fx32,0.898794046299167 +COS27,fx32,0.891006524188368 +COS28,fx32,0.882947592858927 +COS29,fx32,0.874619707139396 +COS30,fx32,0.866025403784439 +COS31,fx32,0.857167300702112 +COS32,fx32,0.848048096156426 +COS33,fx32,0.838670567945424 +COS34,fx32,0.829037572555042 +COS35,fx32,0.819152044288992 +COS36,fx32,0.809016994374947 +COS37,fx32,0.798635510047293 +COS38,fx32,0.788010753606722 +COS39,fx32,0.777145961456971 +COS40,fx32,0.766044443118978 +COS41,fx32,0.754709580222772 +COS42,fx32,0.743144825477394 +COS43,fx32,0.73135370161917 +COS44,fx32,0.719339800338651 +COS45,fx32,0.707106781186548 +COS46,fx32,0.694658370458997 +COS47,fx32,0.681998360062498 +COS48,fx32,0.669130606358858 +COS49,fx32,0.656059028990507 +COS50,fx32,0.642787609686539 +COS51,fx32,0.629320391049838 +COS52,fx32,0.615661475325658 +COS53,fx32,0.601815023152048 +COS54,fx32,0.587785252292473 +COS55,fx32,0.573576436351046 +COS56,fx32,0.559192903470747 +COS57,fx32,0.544639035015027 +COS58,fx32,0.529919264233205 +COS59,fx32,0.515038074910054 +COS60,fx32,0.5 +COS61,fx32,0.484809620246337 +COS62,fx32,0.469471562785891 +COS63,fx32,0.453990499739547 +COS64,fx32,0.438371146789077 +COS65,fx32,0.422618261740699 +COS66,fx32,0.4067366430758 +COS67,fx32,0.390731128489274 +COS68,fx32,0.374606593415912 +COS69,fx32,0.3583679495453 +COS70,fx32,0.342020143325669 +COS71,fx32,0.325568154457157 +COS72,fx32,0.309016994374947 +COS73,fx32,0.292371704722737 +COS74,fx32,0.275637355816999 +COS75,fx32,0.258819045102521 +COS76,fx32,0.241921895599668 +COS77,fx32,0.224951054343865 +COS78,fx32,0.207911690817759 +COS79,fx32,0.190808995376545 +COS80,fx32,0.17364817766693 +COS81,fx32,0.156434465040231 +COS82,fx32,0.139173100960065 +COS83,fx32,0.121869343405147 +COS84,fx32,0.104528463267653 +COS85,fx32,0.0871557427476581 +COS86,fx32,0.0697564737441252 +COS87,fx32,0.052335956242944 +COS88,fx32,0.0348994967025011 +COS89,fx32,0.0174524064372836 +COS90,fx32,6.12323399573677e-17 +COS91,fx32,-0.0174524064372835 +COS92,fx32,-0.034899496702501 +COS93,fx32,-0.0523359562429438 +COS94,fx32,-0.0697564737441253 +COS95,fx32,-0.0871557427476582 +COS96,fx32,-0.104528463267654 +COS97,fx32,-0.121869343405147 +COS98,fx32,-0.139173100960065 +COS99,fx32,-0.156434465040231 +COS100,fx32,-0.17364817766693 +COS101,fx32,-0.190808995376545 +COS102,fx32,-0.207911690817759 +COS103,fx32,-0.224951054343865 +COS104,fx32,-0.241921895599668 +COS105,fx32,-0.258819045102521 +COS106,fx32,-0.275637355816999 +COS107,fx32,-0.292371704722737 +COS108,fx32,-0.309016994374947 +COS109,fx32,-0.325568154457157 +COS110,fx32,-0.342020143325669 +COS111,fx32,-0.3583679495453 +COS112,fx32,-0.374606593415912 +COS113,fx32,-0.390731128489274 +COS114,fx32,-0.4067366430758 +COS115,fx32,-0.422618261740699 +COS116,fx32,-0.438371146789078 +COS117,fx32,-0.453990499739547 +COS118,fx32,-0.469471562785891 +COS119,fx32,-0.484809620246337 +COS120,fx32,-0.5 +COS121,fx32,-0.515038074910054 +COS122,fx32,-0.529919264233205 +COS123,fx32,-0.544639035015027 +COS124,fx32,-0.559192903470747 +COS125,fx32,-0.573576436351046 +COS126,fx32,-0.587785252292473 +COS127,fx32,-0.601815023152048 +COS128,fx32,-0.615661475325658 +COS129,fx32,-0.629320391049837 +COS130,fx32,-0.642787609686539 +COS131,fx32,-0.656059028990507 +COS132,fx32,-0.669130606358858 +COS133,fx32,-0.681998360062498 +COS134,fx32,-0.694658370458997 +COS135,fx32,-0.707106781186547 +COS136,fx32,-0.719339800338651 +COS137,fx32,-0.73135370161917 +COS138,fx32,-0.743144825477394 +COS139,fx32,-0.754709580222772 +COS140,fx32,-0.766044443118978 +COS141,fx32,-0.777145961456971 +COS142,fx32,-0.788010753606722 +COS143,fx32,-0.798635510047293 +COS144,fx32,-0.809016994374947 +COS145,fx32,-0.819152044288992 +COS146,fx32,-0.829037572555042 +COS147,fx32,-0.838670567945424 +COS148,fx32,-0.848048096156426 +COS149,fx32,-0.857167300702112 +COS150,fx32,-0.866025403784439 +COS151,fx32,-0.874619707139396 +COS152,fx32,-0.882947592858927 +COS153,fx32,-0.891006524188368 +COS154,fx32,-0.898794046299167 +COS155,fx32,-0.90630778703665 +COS156,fx32,-0.913545457642601 +COS157,fx32,-0.92050485345244 +COS158,fx32,-0.927183854566787 +COS159,fx32,-0.933580426497202 +COS160,fx32,-0.939692620785908 +COS161,fx32,-0.945518575599317 +COS162,fx32,-0.951056516295154 +COS163,fx32,-0.956304755963036 +COS164,fx32,-0.961261695938319 +COS165,fx32,-0.965925826289068 +COS166,fx32,-0.970295726275996 +COS167,fx32,-0.974370064785235 +COS168,fx32,-0.978147600733806 +COS169,fx32,-0.981627183447664 +COS170,fx32,-0.984807753012208 +COS171,fx32,-0.987688340595138 +COS172,fx32,-0.99026806874157 +COS173,fx32,-0.992546151641322 +COS174,fx32,-0.994521895368273 +COS175,fx32,-0.996194698091746 +COS176,fx32,-0.997564050259824 +COS177,fx32,-0.998629534754574 +COS178,fx32,-0.999390827019096 +COS179,fx32,-0.999847695156391 +COS180,fx32,-1 +COS181,fx32,-0.999847695156391 +COS182,fx32,-0.999390827019096 +COS183,fx32,-0.998629534754574 +COS184,fx32,-0.997564050259824 +COS185,fx32,-0.996194698091746 +COS186,fx32,-0.994521895368273 +COS187,fx32,-0.992546151641322 +COS188,fx32,-0.99026806874157 +COS189,fx32,-0.987688340595138 +COS190,fx32,-0.984807753012208 +COS191,fx32,-0.981627183447664 +COS192,fx32,-0.978147600733806 +COS193,fx32,-0.974370064785235 +COS194,fx32,-0.970295726275996 +COS195,fx32,-0.965925826289068 +COS196,fx32,-0.961261695938319 +COS197,fx32,-0.956304755963035 +COS198,fx32,-0.951056516295154 +COS199,fx32,-0.945518575599317 +COS200,fx32,-0.939692620785908 +COS201,fx32,-0.933580426497202 +COS202,fx32,-0.927183854566787 +COS203,fx32,-0.92050485345244 +COS204,fx32,-0.913545457642601 +COS205,fx32,-0.90630778703665 +COS206,fx32,-0.898794046299167 +COS207,fx32,-0.891006524188368 +COS208,fx32,-0.882947592858927 +COS209,fx32,-0.874619707139396 +COS210,fx32,-0.866025403784439 +COS211,fx32,-0.857167300702112 +COS212,fx32,-0.848048096156426 +COS213,fx32,-0.838670567945424 +COS214,fx32,-0.829037572555042 +COS215,fx32,-0.819152044288992 +COS216,fx32,-0.809016994374948 +COS217,fx32,-0.798635510047293 +COS218,fx32,-0.788010753606722 +COS219,fx32,-0.777145961456971 +COS220,fx32,-0.766044443118978 +COS221,fx32,-0.754709580222772 +COS222,fx32,-0.743144825477394 +COS223,fx32,-0.731353701619171 +COS224,fx32,-0.719339800338651 +COS225,fx32,-0.707106781186548 +COS226,fx32,-0.694658370458997 +COS227,fx32,-0.681998360062499 +COS228,fx32,-0.669130606358858 +COS229,fx32,-0.656059028990507 +COS230,fx32,-0.642787609686539 +COS231,fx32,-0.629320391049838 +COS232,fx32,-0.615661475325658 +COS233,fx32,-0.601815023152048 +COS234,fx32,-0.587785252292473 +COS235,fx32,-0.573576436351046 +COS236,fx32,-0.559192903470747 +COS237,fx32,-0.544639035015027 +COS238,fx32,-0.529919264233205 +COS239,fx32,-0.515038074910054 +COS240,fx32,-0.5 +COS241,fx32,-0.484809620246337 +COS242,fx32,-0.469471562785891 +COS243,fx32,-0.453990499739547 +COS244,fx32,-0.438371146789078 +COS245,fx32,-0.422618261740699 +COS246,fx32,-0.4067366430758 +COS247,fx32,-0.390731128489274 +COS248,fx32,-0.374606593415912 +COS249,fx32,-0.358367949545301 +COS250,fx32,-0.342020143325669 +COS251,fx32,-0.325568154457157 +COS252,fx32,-0.309016994374948 +COS253,fx32,-0.292371704722737 +COS254,fx32,-0.275637355816999 +COS255,fx32,-0.258819045102521 +COS256,fx32,-0.241921895599668 +COS257,fx32,-0.224951054343865 +COS258,fx32,-0.20791169081776 +COS259,fx32,-0.190808995376545 +COS260,fx32,-0.17364817766693 +COS261,fx32,-0.156434465040231 +COS262,fx32,-0.139173100960066 +COS263,fx32,-0.121869343405147 +COS264,fx32,-0.104528463267653 +COS265,fx32,-0.0871557427476582 +COS266,fx32,-0.0697564737441256 +COS267,fx32,-0.0523359562429443 +COS268,fx32,-0.0348994967025008 +COS269,fx32,-0.0174524064372835 +COS270,fx32,-1.83697019872103e-16 +COS271,fx32,0.0174524064372831 +COS272,fx32,0.0348994967025013 +COS273,fx32,0.0523359562429439 +COS274,fx32,0.0697564737441252 +COS275,fx32,0.0871557427476579 +COS276,fx32,0.104528463267653 +COS277,fx32,0.121869343405148 +COS278,fx32,0.139173100960065 +COS279,fx32,0.156434465040231 +COS280,fx32,0.17364817766693 +COS281,fx32,0.190808995376545 +COS282,fx32,0.207911690817759 +COS283,fx32,0.224951054343865 +COS284,fx32,0.241921895599667 +COS285,fx32,0.25881904510252 +COS286,fx32,0.275637355816999 +COS287,fx32,0.292371704722737 +COS288,fx32,0.309016994374947 +COS289,fx32,0.325568154457156 +COS290,fx32,0.342020143325669 +COS291,fx32,0.3583679495453 +COS292,fx32,0.374606593415912 +COS293,fx32,0.390731128489273 +COS294,fx32,0.4067366430758 +COS295,fx32,0.4226182617407 +COS296,fx32,0.438371146789077 +COS297,fx32,0.453990499739547 +COS298,fx32,0.46947156278589 +COS299,fx32,0.484809620246337 +COS300,fx32,0.5 +COS301,fx32,0.515038074910054 +COS302,fx32,0.529919264233205 +COS303,fx32,0.544639035015027 +COS304,fx32,0.559192903470747 +COS305,fx32,0.573576436351046 +COS306,fx32,0.587785252292473 +COS307,fx32,0.601815023152048 +COS308,fx32,0.615661475325659 +COS309,fx32,0.629320391049838 +COS310,fx32,0.642787609686539 +COS311,fx32,0.656059028990507 +COS312,fx32,0.669130606358858 +COS313,fx32,0.681998360062499 +COS314,fx32,0.694658370458997 +COS315,fx32,0.707106781186547 +COS316,fx32,0.719339800338651 +COS317,fx32,0.731353701619171 +COS318,fx32,0.743144825477394 +COS319,fx32,0.754709580222772 +COS320,fx32,0.766044443118978 +COS321,fx32,0.777145961456971 +COS322,fx32,0.788010753606722 +COS323,fx32,0.798635510047293 +COS324,fx32,0.809016994374947 +COS325,fx32,0.819152044288992 +COS326,fx32,0.829037572555042 +COS327,fx32,0.838670567945424 +COS328,fx32,0.848048096156426 +COS329,fx32,0.857167300702112 +COS330,fx32,0.866025403784438 +COS331,fx32,0.874619707139396 +COS332,fx32,0.882947592858927 +COS333,fx32,0.891006524188368 +COS334,fx32,0.898794046299167 +COS335,fx32,0.90630778703665 +COS336,fx32,0.913545457642601 +COS337,fx32,0.92050485345244 +COS338,fx32,0.927183854566787 +COS339,fx32,0.933580426497202 +COS340,fx32,0.939692620785908 +COS341,fx32,0.945518575599317 +COS342,fx32,0.951056516295154 +COS343,fx32,0.956304755963035 +COS344,fx32,0.961261695938319 +COS345,fx32,0.965925826289068 +COS346,fx32,0.970295726275996 +COS347,fx32,0.974370064785235 +COS348,fx32,0.978147600733806 +COS349,fx32,0.981627183447664 +COS350,fx32,0.984807753012208 +COS351,fx32,0.987688340595138 +COS352,fx32,0.99026806874157 +COS353,fx32,0.992546151641322 +COS354,fx32,0.994521895368273 +COS355,fx32,0.996194698091746 +COS356,fx32,0.997564050259824 +COS357,fx32,0.998629534754574 +COS358,fx32,0.999390827019096 +COS359,fx32,0.999847695156391 diff --git a/tools/gen_fx_consts/fx_data.c b/tools/gen_fx_consts/fx_data.c new file mode 100644 index 00000000..a6f94bb7 --- /dev/null +++ b/tools/gen_fx_consts/fx_data.c @@ -0,0 +1,128 @@ +#include +#include +#include "fx.h" +#include "global.h" + +const struct FxSpec fx32 = {"fx32", 19, 12}; +const struct FxSpec fx64 = {"fx64", 51, 12}; +const struct FxSpec fx64c = {"fx64c", 31, 32}; +const struct FxSpec fx16 = {"fx16", 3, 12}; + +const struct FxSpec *const sFxSpecPtrs[] = { + &fx32, + &fx64, + &fx64c, + &fx16, +}; + +struct FxConst *gFxConstTable = NULL; +size_t gNFxConstTable = 0; + +void FxConstTableInit(void) { + FILE *file; + char *contents; + char *ptr; + char *linetok; + char *linetok_r; + char *commatok; + char *commatok_r; + char *_realpath; + int i, j, k; + long fsize; + long readsz; + static const char filename[] = SOURCE_DIR "/fx_const.csv"; + + atexit(FxConstTableEnd); + + file = fopen(filename, "r"); + if (file == NULL) { + fatal_error("Unable to open file '%s' for reading", filename); + } + fseek(file, 0, SEEK_END); + fsize = ftell(file); + fseek(file, 0, SEEK_SET); + contents = malloc(fsize + 1); + if (contents == NULL) { + fclose(file); + fatal_error("Unable to allocate CSV read buffer"); + } + readsz = fread(contents, 1, fsize, file); + fclose(file); + if (readsz != fsize) { + free(contents); + fatal_error("Read error"); + } + contents[fsize] = 0; + ptr = contents - 1; + gNFxConstTable = 0; + do { + ptr++; + gNFxConstTable += (*ptr != '#' && *ptr != '\n'); + ptr = strchr(ptr, '\n'); + } while (ptr != NULL); + if (gNFxConstTable == 0) { + free(contents); + fatal_error("Malformatted CSV file"); + } + gFxConstTable = malloc(gNFxConstTable * sizeof(struct FxConst)); + if (gFxConstTable == NULL) { + free(contents); + fatal_error("Unable to allocate gFxConstTable"); + } + ptr = contents; + for (i = 0; i < gNFxConstTable; i++) { + linetok = strtok_r(ptr, "\n", &linetok_r); + ptr = NULL; + if (linetok == NULL) { + gNFxConstTable = i; + break; + } + if (*linetok == '#') { + i--; + continue; + } + for (j = 0; j < 3; j++) { + commatok = strtok_r(linetok, ",", &commatok_r); + linetok = NULL; + if (commatok == NULL) { + free(contents); + fatal_error("Malformatted CSV file at line %d col %d", i, j); + } + switch (j) { + case 0: + gFxConstTable[i].name = strdup(commatok); + break; + case 1: + for (k = 0; k < len(sFxSpecPtrs); k++) { + if (strcmp(commatok, sFxSpecPtrs[k]->name) == 0) { + break; + } + } + if (k == len(sFxSpecPtrs)) { + free(contents); + fatal_error("Invalid fx type %s", commatok); + } + gFxConstTable[i].fxtype = sFxSpecPtrs[k]; + break; + case 2: + gFxConstTable[i].value = strtod(commatok, NULL); + break; + } + } + } + free(contents); +} + +void FxConstTableEnd(void) { + int i; + if (gFxConstTable != NULL) { + for (i = 0; i < gNFxConstTable; i++) { + if (gFxConstTable[i].name != NULL) { + free(gFxConstTable[i].name); + } + } + free(gFxConstTable); + gFxConstTable = NULL; + } + gNFxConstTable = 0; +} diff --git a/tools/gen_fx_consts/fx_encode.c b/tools/gen_fx_consts/fx_encode.c new file mode 100644 index 00000000..8110753d --- /dev/null +++ b/tools/gen_fx_consts/fx_encode.c @@ -0,0 +1,28 @@ +#include +#include "fx.h" + +long long MakeFix(const struct FxConst *constdef) { + double ret_di, ret_df, value_abs; + long long ret_ii, ret_if, ret_val; + + if (constdef->value == 0) { + return 0LL; + } + + value_abs = constdef->value < 0 ? -constdef->value : constdef->value; + ret_di = floor(value_abs); + ret_df = value_abs - ret_di; + ret_ii = (long long)value_abs * (1LL << constdef->fxtype->fracpart); + ret_if = (long long)(ret_df * (double)(1LL << constdef->fxtype->fracpart) + 0.5); + ret_ii &= ~((1LL << constdef->fxtype->fracpart) - 1); + ret_if &= (1LL << constdef->fxtype->fracpart) - 1; + ret_val = ret_ii + ret_if; + if (constdef->value < 0) { + ret_val = -ret_val; + } + return ret_val; +} + +int GetFxWidth(const struct FxSpec *fxtype) { + return fxtype->fracpart + fxtype->intpart + 1; +} diff --git a/tools/gen_fx_consts/global.h b/tools/gen_fx_consts/global.h new file mode 100644 index 00000000..b4509536 --- /dev/null +++ b/tools/gen_fx_consts/global.h @@ -0,0 +1,27 @@ +#ifndef GUARD_GLOBAL_H +#define GUARD_GLOBAL_H + +#include +#include +#include +#include + +#define len(a) ((sizeof(a))/(sizeof(*(a)))) + +static inline noreturn __attribute__((format(printf, 1, 2))) void fatal_error(const char *fmt, ...) { + va_list va_args; + va_start(va_args, fmt); + vfprintf(stderr, fmt, va_args); + va_end(va_args); + fputc('\n', stderr); + exit(1); +} + +#ifndef __clang__ +#undef strlcat +#define strlcat(d,s,n) strncat(d,s,(n)-strlen(d)-1) +#undef strlcpy +#define strlcpy(d,s,n) strncpy(d,s,(n)-1) +#endif //__clang__ + +#endif //GUARD_GLOBAL_H diff --git a/tools/gen_fx_consts/main.c b/tools/gen_fx_consts/main.c new file mode 100644 index 00000000..19787ced --- /dev/null +++ b/tools/gen_fx_consts/main.c @@ -0,0 +1,86 @@ +#include +#include +#include "fx.h" +#include "global.h" + +#define NAMEBUF_SIZ 32 + +static inline void usage(FILE *dest) { + fprintf(dest, "USAGE: gen_fx_consts FILENAME\n\n" + "FILENAME Path to write C header. Guard will be generated\n" + " automatically from the path.\n"); +} + +int main(int argc, char ** argv) { + int i; + char namebuf[NAMEBUF_SIZ] = ""; + char *header_guard; + FILE *outfile; + + FxConstTableInit(); + if (argc < 2) { + outfile = stdout; + header_guard = "NITRO_FX_FX_CONST_H_"; + } else { + outfile = fopen(argv[1], "w"); + if (outfile == NULL) { + fatal_error("Unable to open file '%s' for writing", argv[1]); + } + header_guard = strdup(argv[1]); + if (header_guard == NULL) { + fclose(outfile); + fatal_error("Unable to allocate temp buffer for header guard"); + } + for (i = 0; header_guard[i]; i++) { + switch (header_guard[i]) { + case '.': + case '/': + header_guard[i] = '_'; + break; + default: + header_guard[i] = toupper(header_guard[i]); + break; + } + } + } + fprintf(outfile, "#ifndef %s_\n" + "#define %s_\n\n", header_guard, header_guard); + for (i = 0; i < gNFxConstTable; i++) { + long long value; + int nbyte; + char *suffix; + char *fmtstr; + int j; + value = MakeFix(&gFxConstTable[i]); + nbyte = GetFxWidth(gFxConstTable[i].fxtype) / 8; + switch (nbyte) { + case 2: + suffix = ""; + fmtstr = "#define %-32s ((%s) 0x%04hx%s) // %.12f\n"; + value &= 0xFFFFLL; + break; + case 4: + suffix = "L"; + fmtstr = "#define %-32s ((%s) 0x%08lx%s) // %.12f\n"; + value &= 0xFFFFFFFFLL; + break; + case 8: + suffix = "LL"; + fmtstr = "#define %-32s ((%s) 0x%016llx%s) // %.12f\n"; + break; + default: + fatal_error("invalid integer width: %d", nbyte); + } + snprintf(namebuf, NAMEBUF_SIZ, "%s_%s", gFxConstTable[i].fxtype->name, gFxConstTable[i].name); + for (j = 0; j < NAMEBUF_SIZ && namebuf[j]; j++) { + namebuf[j] = toupper(namebuf[j]); + } + fprintf(outfile, fmtstr, namebuf, gFxConstTable[i].fxtype->name, value, suffix, gFxConstTable[i].value); + } + fprintf(outfile, "\n#endif //%s_\n", header_guard); + if (argc >= 2) { + fclose(outfile); + free(header_guard); + } + return 0; +} diff --git a/tools/jsonproc/.gitignore b/tools/jsonproc/.gitignore new file mode 100644 index 00000000..a613cf2d --- /dev/null +++ b/tools/jsonproc/.gitignore @@ -0,0 +1 @@ +jsonproc diff --git a/tools/jsonproc/Makefile b/tools/jsonproc/Makefile new file mode 100644 index 00000000..74797f54 --- /dev/null +++ b/tools/jsonproc/Makefile @@ -0,0 +1,33 @@ +CXXFLAGS := -Wall -std=c++11 -O2 + +INCLUDES := -I . + +SRCS := jsonproc.cpp + +HEADERS := jsonproc.h \ + inja.hpp \ + config.hpp \ + environment.hpp \ + exceptions.hpp \ + function_storage.hpp \ + lexer.hpp \ + node.hpp \ + parser.hpp \ + renderer.hpp \ + statistics.hpp \ + string_view.hpp \ + template.hpp \ + token.hpp \ + utils.hpp \ + nlohmann/json.hpp + +.PHONY: all clean + +all: jsonproc + @: + +jsonproc: $(SRCS) $(HEADERS) + $(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) -o $@ $(LDFLAGS) + +clean: + $(RM) jsonproc jsonproc.exe diff --git a/tools/jsonproc/config.hpp b/tools/jsonproc/config.hpp new file mode 100644 index 00000000..42b55c8a --- /dev/null +++ b/tools/jsonproc/config.hpp @@ -0,0 +1,79 @@ +#ifndef INCLUDE_INJA_CONFIG_HPP_ +#define INCLUDE_INJA_CONFIG_HPP_ + +#include +#include + +#include "string_view.hpp" + +namespace inja { + +/*! + * \brief Class for lexer configuration. + */ +struct LexerConfig { + std::string statement_open {"{%"}; + std::string statement_open_no_lstrip {"{%+"}; + std::string statement_open_force_lstrip {"{%-"}; + std::string statement_close {"%}"}; + std::string statement_close_force_rstrip {"-%}"}; + std::string line_statement {"##"}; + std::string expression_open {"{{"}; + std::string expression_open_force_lstrip {"{{-"}; + std::string expression_close {"}}"}; + std::string expression_close_force_rstrip {"-}}"}; + std::string comment_open {"{#"}; + std::string comment_open_force_lstrip {"{#-"}; + std::string comment_close {"#}"}; + std::string comment_close_force_rstrip {"-#}"}; + std::string open_chars {"#{"}; + + bool trim_blocks {false}; + bool lstrip_blocks {false}; + + void update_open_chars() { + open_chars = ""; + if (open_chars.find(line_statement[0]) == std::string::npos) { + open_chars += line_statement[0]; + } + if (open_chars.find(statement_open[0]) == std::string::npos) { + open_chars += statement_open[0]; + } + if (open_chars.find(statement_open_no_lstrip[0]) == std::string::npos) { + open_chars += statement_open_no_lstrip[0]; + } + if (open_chars.find(statement_open_force_lstrip[0]) == std::string::npos) { + open_chars += statement_open_force_lstrip[0]; + } + if (open_chars.find(expression_open[0]) == std::string::npos) { + open_chars += expression_open[0]; + } + if (open_chars.find(expression_open_force_lstrip[0]) == std::string::npos) { + open_chars += expression_open_force_lstrip[0]; + } + if (open_chars.find(comment_open[0]) == std::string::npos) { + open_chars += comment_open[0]; + } + if (open_chars.find(comment_open_force_lstrip[0]) == std::string::npos) { + open_chars += comment_open_force_lstrip[0]; + } + } +}; + +/*! + * \brief Class for parser configuration. + */ +struct ParserConfig { + bool search_included_templates_in_files {true}; +}; + +/*! + * \brief Class for render configuration. + */ +struct RenderConfig { + bool throw_at_missing_includes {true}; +}; + +} // namespace inja + +#endif // INCLUDE_INJA_CONFIG_HPP_ diff --git a/tools/jsonproc/environment.hpp b/tools/jsonproc/environment.hpp new file mode 100644 index 00000000..c4bd7deb --- /dev/null +++ b/tools/jsonproc/environment.hpp @@ -0,0 +1,228 @@ +#ifndef INCLUDE_INJA_ENVIRONMENT_HPP_ +#define INCLUDE_INJA_ENVIRONMENT_HPP_ + +#include +#include +#include +#include +#include + +#include + +#include "config.hpp" +#include "function_storage.hpp" +#include "parser.hpp" +#include "renderer.hpp" +#include "string_view.hpp" +#include "template.hpp" +#include "utils.hpp" + +namespace inja { + +using json = nlohmann::json; + +/*! + * \brief Class for changing the configuration. + */ +class Environment { + std::string input_path; + std::string output_path; + + LexerConfig lexer_config; + ParserConfig parser_config; + RenderConfig render_config; + + FunctionStorage function_storage; + TemplateStorage template_storage; + +public: + Environment() : Environment("") {} + + explicit Environment(const std::string &global_path) : input_path(global_path), output_path(global_path) {} + + Environment(const std::string &input_path, const std::string &output_path) + : input_path(input_path), output_path(output_path) {} + + /// Sets the opener and closer for template statements + void set_statement(const std::string &open, const std::string &close) { + lexer_config.statement_open = open; + lexer_config.statement_open_no_lstrip = open + "+"; + lexer_config.statement_open_force_lstrip = open + "-"; + lexer_config.statement_close = close; + lexer_config.statement_close_force_rstrip = "-" + close; + lexer_config.update_open_chars(); + } + + /// Sets the opener for template line statements + void set_line_statement(const std::string &open) { + lexer_config.line_statement = open; + lexer_config.update_open_chars(); + } + + /// Sets the opener and closer for template expressions + void set_expression(const std::string &open, const std::string &close) { + lexer_config.expression_open = open; + lexer_config.expression_open_force_lstrip = open + "-"; + lexer_config.expression_close = close; + lexer_config.expression_close_force_rstrip = "-" + close; + lexer_config.update_open_chars(); + } + + /// Sets the opener and closer for template comments + void set_comment(const std::string &open, const std::string &close) { + lexer_config.comment_open = open; + lexer_config.comment_open_force_lstrip = open + "-"; + lexer_config.comment_close = close; + lexer_config.comment_close_force_rstrip = "-" + close; + lexer_config.update_open_chars(); + } + + /// Sets whether to remove the first newline after a block + void set_trim_blocks(bool trim_blocks) { + lexer_config.trim_blocks = trim_blocks; + } + + /// Sets whether to strip the spaces and tabs from the start of a line to a block + void set_lstrip_blocks(bool lstrip_blocks) { + lexer_config.lstrip_blocks = lstrip_blocks; + } + + /// Sets the element notation syntax + void set_search_included_templates_in_files(bool search_in_files) { + parser_config.search_included_templates_in_files = search_in_files; + } + + /// Sets whether a missing include will throw an error + void set_throw_at_missing_includes(bool will_throw) { + render_config.throw_at_missing_includes = will_throw; + } + + Template parse(nonstd::string_view input) { + Parser parser(parser_config, lexer_config, template_storage, function_storage); + return parser.parse(input); + } + + Template parse_template(const std::string &filename) { + Parser parser(parser_config, lexer_config, template_storage, function_storage); + auto result = Template(parser.load_file(input_path + static_cast(filename))); + parser.parse_into_template(result, input_path + static_cast(filename)); + return result; + } + + Template parse_file(const std::string &filename) { + return parse_template(filename); + } + + std::string render(nonstd::string_view input, const json &data) { return render(parse(input), data); } + + std::string render(const Template &tmpl, const json &data) { + std::stringstream os; + render_to(os, tmpl, data); + return os.str(); + } + + std::string render_file(const std::string &filename, const json &data) { + return render(parse_template(filename), data); + } + + std::string render_file_with_json_file(const std::string &filename, const std::string &filename_data) { + const json data = load_json(filename_data); + return render_file(filename, data); + } + + void write(const std::string &filename, const json &data, const std::string &filename_out) { + std::ofstream file(output_path + filename_out); + file << render_file(filename, data); + file.close(); + } + + void write(const Template &temp, const json &data, const std::string &filename_out) { + std::ofstream file(output_path + filename_out); + file << render(temp, data); + file.close(); + } + + void write_with_json_file(const std::string &filename, const std::string &filename_data, + const std::string &filename_out) { + const json data = load_json(filename_data); + write(filename, data, filename_out); + } + + void write_with_json_file(const Template &temp, const std::string &filename_data, const std::string &filename_out) { + const json data = load_json(filename_data); + write(temp, data, filename_out); + } + + std::ostream &render_to(std::ostream &os, const Template &tmpl, const json &data) { + Renderer(render_config, template_storage, function_storage).render_to(os, tmpl, data); + return os; + } + + std::string load_file(const std::string &filename) { + Parser parser(parser_config, lexer_config, template_storage, function_storage); + return parser.load_file(input_path + filename); + } + + json load_json(const std::string &filename) { + std::ifstream file; + open_file_or_throw(input_path + filename, file); + json j; + file >> j; + return j; + } + + /*! + @brief Adds a variadic callback + */ + void add_callback(const std::string &name, const CallbackFunction &callback) { + add_callback(name, -1, callback); + } + + /*! + @brief Adds a variadic void callback + */ + void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) { + add_void_callback(name, -1, callback); + } + + /*! + @brief Adds a callback with given number or arguments + */ + void add_callback(const std::string &name, int num_args, const CallbackFunction &callback) { + function_storage.add_callback(name, num_args, callback); + } + + /*! + @brief Adds a void callback with given number or arguments + */ + void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) { + function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); }); + } + + /** Includes a template with a given name into the environment. + * Then, a template can be rendered in another template using the + * include "" syntax. + */ + void include_template(const std::string &name, const Template &tmpl) { + template_storage[name] = tmpl; + } +}; + +/*! +@brief render with default settings to a string +*/ +inline std::string render(nonstd::string_view input, const json &data) { + return Environment().render(input, data); +} + +/*! +@brief render with default settings to the given output stream +*/ +inline void render_to(std::ostream &os, nonstd::string_view input, const json &data) { + Environment env; + env.render_to(os, env.parse(input), data); +} + +} // namespace inja + +#endif // INCLUDE_INJA_ENVIRONMENT_HPP_ diff --git a/tools/jsonproc/exceptions.hpp b/tools/jsonproc/exceptions.hpp new file mode 100644 index 00000000..9991f0d2 --- /dev/null +++ b/tools/jsonproc/exceptions.hpp @@ -0,0 +1,48 @@ +#ifndef INCLUDE_INJA_EXCEPTIONS_HPP_ +#define INCLUDE_INJA_EXCEPTIONS_HPP_ + +#include +#include + +namespace inja { + +struct SourceLocation { + size_t line; + size_t column; +}; + +struct InjaError : public std::runtime_error { + const std::string type; + const std::string message; + + const SourceLocation location; + + explicit InjaError(const std::string &type, const std::string &message) + : std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {} + + explicit InjaError(const std::string &type, const std::string &message, SourceLocation location) + : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + + std::to_string(location.column) + ") " + message), + type(type), message(message), location(location) {} +}; + +struct ParserError : public InjaError { + explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {} +}; + +struct RenderError : public InjaError { + explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {} +}; + +struct FileError : public InjaError { + explicit FileError(const std::string &message) : InjaError("file_error", message) {} + explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {} +}; + +struct JsonError : public InjaError { + explicit JsonError(const std::string &message, SourceLocation location) : InjaError("json_error", message, location) {} +}; + +} // namespace inja + +#endif // INCLUDE_INJA_EXCEPTIONS_HPP_ diff --git a/tools/jsonproc/function_storage.hpp b/tools/jsonproc/function_storage.hpp new file mode 100644 index 00000000..3e8e5132 --- /dev/null +++ b/tools/jsonproc/function_storage.hpp @@ -0,0 +1,142 @@ +#ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_ +#define INCLUDE_INJA_FUNCTION_STORAGE_HPP_ + +#include + +#include "string_view.hpp" + +namespace inja { + +using json = nlohmann::json; + +using Arguments = std::vector; +using CallbackFunction = std::function; +using VoidCallbackFunction = std::function; + +/*! + * \brief Class for builtin functions and user-defined callbacks. + */ +class FunctionStorage { +public: + enum class Operation { + Not, + And, + Or, + In, + Equal, + NotEqual, + Greater, + GreaterEqual, + Less, + LessEqual, + Add, + Subtract, + Multiplication, + Division, + Power, + Modulo, + AtId, + At, + Default, + DivisibleBy, + Even, + Exists, + ExistsInObject, + First, + Float, + Int, + IsArray, + IsBoolean, + IsFloat, + IsInteger, + IsNumber, + IsObject, + IsString, + Last, + Length, + Lower, + Max, + Min, + Odd, + Range, + Round, + Sort, + Upper, + Super, + Join, + Callback, + ParenLeft, + ParenRight, + None, + }; + + struct FunctionData { + explicit FunctionData(const Operation &op, const CallbackFunction &cb = CallbackFunction{}) : operation(op), callback(cb) {} + const Operation operation; + const CallbackFunction callback; + }; + +private: + const int VARIADIC {-1}; + + std::map, FunctionData> function_storage = { + {std::make_pair("at", 2), FunctionData { Operation::At }}, + {std::make_pair("default", 2), FunctionData { Operation::Default }}, + {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }}, + {std::make_pair("even", 1), FunctionData { Operation::Even }}, + {std::make_pair("exists", 1), FunctionData { Operation::Exists }}, + {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }}, + {std::make_pair("first", 1), FunctionData { Operation::First }}, + {std::make_pair("float", 1), FunctionData { Operation::Float }}, + {std::make_pair("int", 1), FunctionData { Operation::Int }}, + {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }}, + {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }}, + {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }}, + {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }}, + {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }}, + {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }}, + {std::make_pair("isString", 1), FunctionData { Operation::IsString }}, + {std::make_pair("last", 1), FunctionData { Operation::Last }}, + {std::make_pair("length", 1), FunctionData { Operation::Length }}, + {std::make_pair("lower", 1), FunctionData { Operation::Lower }}, + {std::make_pair("max", 1), FunctionData { Operation::Max }}, + {std::make_pair("min", 1), FunctionData { Operation::Min }}, + {std::make_pair("odd", 1), FunctionData { Operation::Odd }}, + {std::make_pair("range", 1), FunctionData { Operation::Range }}, + {std::make_pair("round", 2), FunctionData { Operation::Round }}, + {std::make_pair("sort", 1), FunctionData { Operation::Sort }}, + {std::make_pair("upper", 1), FunctionData { Operation::Upper }}, + {std::make_pair("super", 0), FunctionData { Operation::Super }}, + {std::make_pair("super", 1), FunctionData { Operation::Super }}, + {std::make_pair("join", 2), FunctionData { Operation::Join }}, + }; + +public: + void add_builtin(nonstd::string_view name, int num_args, Operation op) { + function_storage.emplace(std::make_pair(static_cast(name), num_args), FunctionData { op }); + } + + void add_callback(nonstd::string_view name, int num_args, const CallbackFunction &callback) { + function_storage.emplace(std::make_pair(static_cast(name), num_args), FunctionData { Operation::Callback, callback }); + } + + FunctionData find_function(nonstd::string_view name, int num_args) const { + auto it = function_storage.find(std::make_pair(static_cast(name), num_args)); + if (it != function_storage.end()) { + return it->second; + + // Find variadic function + } else if (num_args > 0) { + it = function_storage.find(std::make_pair(static_cast(name), VARIADIC)); + if (it != function_storage.end()) { + return it->second; + } + } + + return FunctionData { Operation::None }; + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_FUNCTION_STORAGE_HPP_ diff --git a/tools/jsonproc/inja.hpp b/tools/jsonproc/inja.hpp new file mode 100644 index 00000000..d4e2ab17 --- /dev/null +++ b/tools/jsonproc/inja.hpp @@ -0,0 +1,51 @@ +/* + ___ _ Version 3.3 + |_ _|_ __ (_) __ _ https://github.com/pantor/inja + | || '_ \ | |/ _` | Licensed under the MIT License . + | || | | || | (_| | + |___|_| |_|/ |\__,_| Copyright (c) 2018-2021 Lars Berscheid + |__/ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef INCLUDE_INJA_INJA_HPP_ +#define INCLUDE_INJA_INJA_HPP_ + +#include + +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION) + #ifndef INJA_THROW + #define INJA_THROW(exception) throw exception + #endif +#else + #include + #ifndef INJA_THROW + #define INJA_THROW(exception) std::abort(); std::ignore = exception + #endif + #ifndef INJA_NOEXCEPTION + #define INJA_NOEXCEPTION + #endif +#endif + +#include "environment.hpp" +#include "exceptions.hpp" +#include "parser.hpp" +#include "renderer.hpp" +#include "string_view.hpp" +#include "template.hpp" + +#endif // INCLUDE_INJA_INJA_HPP_ diff --git a/tools/jsonproc/jsonproc.cpp b/tools/jsonproc/jsonproc.cpp new file mode 100644 index 00000000..e7cdf2a6 --- /dev/null +++ b/tools/jsonproc/jsonproc.cpp @@ -0,0 +1,180 @@ +// jsonproc.cpp + +#include "jsonproc.h" + +#include + +#include +#include +using std::string; using std::to_string; + +#include "inja.hpp" +using namespace inja; +using json = nlohmann::json; + +std::map customVars; + +void set_custom_var(string key, string value) +{ + customVars[key] = value; +} + +string get_custom_var(string key) +{ + return customVars[key]; +} + +int main(int argc, char *argv[]) +{ + if (argc != 4) + FATAL_ERROR("USAGE: jsonproc \n"); + + string jsonfilepath = argv[1]; + string templateFilepath = argv[2]; + string outputFilepath = argv[3]; + + Environment env; + + // Add custom command callbacks. + env.add_callback("doNotModifyHeader", 0, [jsonfilepath, templateFilepath](Arguments& args) { + return "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from " + jsonfilepath +" and Inja template " + templateFilepath + "\n//\n"; + }); + + env.add_callback("contains", 2, [](Arguments& args) { + string word = args.at(0)->get(); + string check = args.at(1)->get(); + + return word.find(check) != std::string::npos; + }); + + env.add_callback("subtract", 2, [](Arguments& args) { + int minuend = args.at(0)->get(); + int subtrahend = args.at(1)->get(); + + return minuend - subtrahend; + }); + + env.add_callback("add", 2, [](Arguments& args) { + int x = args.at(0)->get(); + int y = args.at(1)->get(); + + return x + y; + }); + + env.add_callback("setBit", 2, [=](Arguments& args) { + string key = args.at(0)->get(); + unsigned long value = std::stoul(get_custom_var(key)); + value |= (1 << (args.at(1)->get())); + set_custom_var(key, to_string(value)); + return ""; + }); + + env.add_callback("setVar", 2, [=](Arguments& args) { + string key = args.at(0)->get(); + string value = args.at(1)->get(); + set_custom_var(key, value); + return ""; + }); + + env.add_callback("setVarInt", 2, [=](Arguments& args) { + string key = args.at(0)->get(); + string value = to_string(args.at(1)->get()); + set_custom_var(key, value); + return ""; + }); + + env.add_callback("getVar", 1, [=](Arguments& args) { + string key = args.at(0)->get(); + return get_custom_var(key); + }); + + env.add_callback("getVarHex", 1, [=](Arguments& args) { + string key = args.at(0)->get(); + unsigned long value = std::stoul(get_custom_var(key)); + std::stringstream ss; + ss << "0x" << std::hex << (value & 0xFFFFFFFFul); + string s = ss.str(); + return s; + }); + + env.add_callback("concat", 2, [](Arguments& args) { + string first = args.at(0)->get(); + string second = args.at(1)->get(); + return first + second; + }); + + env.add_callback("removePrefix", 2, [](Arguments& args) { + string rawValue = args.at(0)->get(); + string prefix = args.at(1)->get(); + string::size_type i = rawValue.find(prefix); + if (i != 0) + return rawValue; + + return rawValue.erase(0, prefix.length()); + }); + + env.add_callback("removeSuffix", 2, [](Arguments& args) { + string rawValue = args.at(0)->get(); + string suffix = args.at(1)->get(); + string::size_type i = rawValue.rfind(suffix); + if (i == string::npos) + return rawValue; + + return rawValue.substr(0, i); + }); + + // single argument is a json object + env.add_callback("isEmpty", 1, [](Arguments& args) { + return args.at(0)->empty(); + }); + + env.add_void_callback("log", 1, [](Arguments& args) { + std::cout << args.at(0)->get() << std::endl; + }); + + env.add_callback("fmtInt", 3, [](Arguments& args) { + int num = args.at(0)->get(); + int ndigits = args.at(1)->get(); + int format = args.at(2)->get(); + char buf[ndigits + 1]; + bool printing_zeros = (format == 2); + int pow10 = 1; + for (int i = 1; i < ndigits; i++) { + pow10 *= 10; + } + char *ptr = buf; + while (pow10 > 0) { + div_t div_result = div(num, pow10); + num = div_result.rem; + pow10 /= 10; + if (div_result.quot != 0) { + printing_zeros = true; + } else if (!printing_zeros) { + if (pow10 == 0) { + printing_zeros = true; + } else { + if (format == 1) { + *ptr++ = ' '; + } + continue; + } + } + if (div_result.quot != 0 || printing_zeros) { + *ptr++ = '0' + div_result.quot; + } + } + *ptr = 0; + return string{buf}; + }); + + try + { + env.write_with_json_file(templateFilepath, jsonfilepath, outputFilepath); + } + catch (const std::exception& e) + { + FATAL_ERROR("JSONPROC_ERROR: %s\n", e.what()); + } + + return 0; +} diff --git a/tools/jsonproc/jsonproc.h b/tools/jsonproc/jsonproc.h new file mode 100644 index 00000000..575fb375 --- /dev/null +++ b/tools/jsonproc/jsonproc.h @@ -0,0 +1,32 @@ +// jsonproc.h + +#ifndef JSONPROC_H +#define JSONPROC_H + +#include +#include +using std::fprintf; using std::exit; + +#include + +#ifdef _MSC_VER + +#define FATAL_ERROR(format, ...) \ +do \ +{ \ + fprintf(stderr, format, __VA_ARGS__); \ + exit(1); \ +} while (0) + +#else + +#define FATAL_ERROR(format, ...) \ +do \ +{ \ + fprintf(stderr, format, ##__VA_ARGS__); \ + exit(1); \ +} while (0) + +#endif // _MSC_VER + +#endif // JSONPROC_H diff --git a/tools/jsonproc/lexer.hpp b/tools/jsonproc/lexer.hpp new file mode 100644 index 00000000..58768e41 --- /dev/null +++ b/tools/jsonproc/lexer.hpp @@ -0,0 +1,434 @@ +#ifndef INCLUDE_INJA_LEXER_HPP_ +#define INCLUDE_INJA_LEXER_HPP_ + +#include +#include + +#include "config.hpp" +#include "token.hpp" +#include "utils.hpp" + +namespace inja { + +/*! + * \brief Class for lexing an inja Template. + */ +class Lexer { + enum class State { + Text, + ExpressionStart, + ExpressionStartForceLstrip, + ExpressionBody, + LineStart, + LineBody, + StatementStart, + StatementStartNoLstrip, + StatementStartForceLstrip, + StatementBody, + CommentStart, + CommentStartForceLstrip, + CommentBody, + }; + + enum class MinusState { + Operator, + Number, + }; + + const LexerConfig &config; + + State state; + MinusState minus_state; + nonstd::string_view m_in; + size_t tok_start; + size_t pos; + + + Token scan_body(nonstd::string_view close, Token::Kind closeKind, nonstd::string_view close_trim = nonstd::string_view(), bool trim = false) { + again: + // skip whitespace (except for \n as it might be a close) + if (tok_start >= m_in.size()) { + return make_token(Token::Kind::Eof); + } + const char ch = m_in[tok_start]; + if (ch == ' ' || ch == '\t' || ch == '\r') { + tok_start += 1; + goto again; + } + + // check for close + if (!close_trim.empty() && inja::string_view::starts_with(m_in.substr(tok_start), close_trim)) { + state = State::Text; + pos = tok_start + close_trim.size(); + const Token tok = make_token(closeKind); + skip_whitespaces_and_newlines(); + return tok; + } + + if (inja::string_view::starts_with(m_in.substr(tok_start), close)) { + state = State::Text; + pos = tok_start + close.size(); + const Token tok = make_token(closeKind); + if (trim) { + skip_whitespaces_and_first_newline(); + } + return tok; + } + + // skip \n + if (ch == '\n') { + tok_start += 1; + goto again; + } + + pos = tok_start + 1; + if (std::isalpha(ch)) { + minus_state = MinusState::Operator; + return scan_id(); + } + + const MinusState current_minus_state = minus_state; + if (minus_state == MinusState::Operator) { + minus_state = MinusState::Number; + } + + switch (ch) { + case '+': + return make_token(Token::Kind::Plus); + case '-': + if (current_minus_state == MinusState::Operator) { + return make_token(Token::Kind::Minus); + } + return scan_number(); + case '*': + return make_token(Token::Kind::Times); + case '/': + return make_token(Token::Kind::Slash); + case '^': + return make_token(Token::Kind::Power); + case '%': + return make_token(Token::Kind::Percent); + case '.': + return make_token(Token::Kind::Dot); + case ',': + return make_token(Token::Kind::Comma); + case ':': + return make_token(Token::Kind::Colon); + case '(': + return make_token(Token::Kind::LeftParen); + case ')': + minus_state = MinusState::Operator; + return make_token(Token::Kind::RightParen); + case '[': + return make_token(Token::Kind::LeftBracket); + case ']': + minus_state = MinusState::Operator; + return make_token(Token::Kind::RightBracket); + case '{': + return make_token(Token::Kind::LeftBrace); + case '}': + minus_state = MinusState::Operator; + return make_token(Token::Kind::RightBrace); + case '>': + if (pos < m_in.size() && m_in[pos] == '=') { + pos += 1; + return make_token(Token::Kind::GreaterEqual); + } + return make_token(Token::Kind::GreaterThan); + case '<': + if (pos < m_in.size() && m_in[pos] == '=') { + pos += 1; + return make_token(Token::Kind::LessEqual); + } + return make_token(Token::Kind::LessThan); + case '=': + if (pos < m_in.size() && m_in[pos] == '=') { + pos += 1; + return make_token(Token::Kind::Equal); + } + return make_token(Token::Kind::Unknown); + case '!': + if (pos < m_in.size() && m_in[pos] == '=') { + pos += 1; + return make_token(Token::Kind::NotEqual); + } + return make_token(Token::Kind::Unknown); + case '\"': + return scan_string(); + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + minus_state = MinusState::Operator; + return scan_number(); + case '_': + case '@': + case '$': + minus_state = MinusState::Operator; + return scan_id(); + default: + return make_token(Token::Kind::Unknown); + } + } + + Token scan_id() { + for (;;) { + if (pos >= m_in.size()) { + break; + } + const char ch = m_in[pos]; + if (!std::isalnum(ch) && ch != '.' && ch != '/' && ch != '_' && ch != '-') { + break; + } + pos += 1; + } + return make_token(Token::Kind::Id); + } + + Token scan_number() { + for (;;) { + if (pos >= m_in.size()) { + break; + } + const char ch = m_in[pos]; + // be very permissive in lexer (we'll catch errors when conversion happens) + if (!std::isdigit(ch) && ch != '.' && ch != 'e' && ch != 'E' && ch != '+' && ch != '-') { + break; + } + pos += 1; + } + return make_token(Token::Kind::Number); + } + + Token scan_string() { + bool escape {false}; + for (;;) { + if (pos >= m_in.size()) { + break; + } + const char ch = m_in[pos++]; + if (ch == '\\') { + escape = true; + } else if (!escape && ch == m_in[tok_start]) { + break; + } else { + escape = false; + } + } + return make_token(Token::Kind::String); + } + + Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); } + + void skip_whitespaces_and_newlines() { + if (pos < m_in.size()) { + while (pos < m_in.size() && (m_in[pos] == ' ' || m_in[pos] == '\t' || m_in[pos] == '\n' || m_in[pos] == '\r')) { + pos += 1; + } + } + } + + void skip_whitespaces_and_first_newline() { + if (pos < m_in.size()) { + while (pos < m_in.size() && (m_in[pos] == ' ' || m_in[pos] == '\t')) { + pos += 1; + } + } + + if (pos < m_in.size()) { + const char ch = m_in[pos]; + if (ch == '\n') { + pos += 1; + } else if (ch == '\r') { + pos += 1; + if (pos < m_in.size() && m_in[pos] == '\n') { + pos += 1; + } + } + } + } + + static nonstd::string_view clear_final_line_if_whitespace(nonstd::string_view text) { + nonstd::string_view result = text; + while (!result.empty()) { + const char ch = result.back(); + if (ch == ' ' || ch == '\t') { + result.remove_suffix(1); + } else if (ch == '\n' || ch == '\r') { + break; + } else { + return text; + } + } + return result; + } + +public: + explicit Lexer(const LexerConfig &config) : config(config), state(State::Text), minus_state(MinusState::Number) {} + + SourceLocation current_position() const { + return get_source_location(m_in, tok_start); + } + + void start(nonstd::string_view input) { + m_in = input; + tok_start = 0; + pos = 0; + state = State::Text; + minus_state = MinusState::Number; + + // Consume byte order mark (BOM) for UTF-8 + if (inja::string_view::starts_with(m_in, "\xEF\xBB\xBF")) { + m_in = m_in.substr(3); + } + } + + Token scan() { + tok_start = pos; + + again: + if (tok_start >= m_in.size()) { + return make_token(Token::Kind::Eof); + } + + switch (state) { + default: + case State::Text: { + // fast-scan to first open character + const size_t open_start = m_in.substr(pos).find_first_of(config.open_chars); + if (open_start == nonstd::string_view::npos) { + // didn't find open, return remaining text as text token + pos = m_in.size(); + return make_token(Token::Kind::Text); + } + pos += open_start; + + // try to match one of the opening sequences, and get the close + nonstd::string_view open_str = m_in.substr(pos); + bool must_lstrip = false; + if (inja::string_view::starts_with(open_str, config.expression_open)) { + if (inja::string_view::starts_with(open_str, config.expression_open_force_lstrip)) { + state = State::ExpressionStartForceLstrip; + must_lstrip = true; + } else { + state = State::ExpressionStart; + } + } else if (inja::string_view::starts_with(open_str, config.statement_open)) { + if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) { + state = State::StatementStartNoLstrip; + } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) { + state = State::StatementStartForceLstrip; + must_lstrip = true; + } else { + state = State::StatementStart; + must_lstrip = config.lstrip_blocks; + } + } else if (inja::string_view::starts_with(open_str, config.comment_open)) { + if (inja::string_view::starts_with(open_str, config.comment_open_force_lstrip)) { + state = State::CommentStartForceLstrip; + must_lstrip = true; + } else { + state = State::CommentStart; + must_lstrip = config.lstrip_blocks; + } + } else if ((pos == 0 || m_in[pos - 1] == '\n') && inja::string_view::starts_with(open_str, config.line_statement)) { + state = State::LineStart; + } else { + pos += 1; // wasn't actually an opening sequence + goto again; + } + + nonstd::string_view text = string_view::slice(m_in, tok_start, pos); + if (must_lstrip) { + text = clear_final_line_if_whitespace(text); + } + + if (text.empty()) { + goto again; // don't generate empty token + } + return Token(Token::Kind::Text, text); + } + case State::ExpressionStart: { + state = State::ExpressionBody; + pos += config.expression_open.size(); + return make_token(Token::Kind::ExpressionOpen); + } + case State::ExpressionStartForceLstrip: { + state = State::ExpressionBody; + pos += config.expression_open_force_lstrip.size(); + return make_token(Token::Kind::ExpressionOpen); + } + case State::LineStart: { + state = State::LineBody; + pos += config.line_statement.size(); + return make_token(Token::Kind::LineStatementOpen); + } + case State::StatementStart: { + state = State::StatementBody; + pos += config.statement_open.size(); + return make_token(Token::Kind::StatementOpen); + } + case State::StatementStartNoLstrip: { + state = State::StatementBody; + pos += config.statement_open_no_lstrip.size(); + return make_token(Token::Kind::StatementOpen); + } + case State::StatementStartForceLstrip: { + state = State::StatementBody; + pos += config.statement_open_force_lstrip.size(); + return make_token(Token::Kind::StatementOpen); + } + case State::CommentStart: { + state = State::CommentBody; + pos += config.comment_open.size(); + return make_token(Token::Kind::CommentOpen); + } + case State::CommentStartForceLstrip: { + state = State::CommentBody; + pos += config.comment_open_force_lstrip.size(); + return make_token(Token::Kind::CommentOpen); + } + case State::ExpressionBody: + return scan_body(config.expression_close, Token::Kind::ExpressionClose, config.expression_close_force_rstrip); + case State::LineBody: + return scan_body("\n", Token::Kind::LineStatementClose); + case State::StatementBody: + return scan_body(config.statement_close, Token::Kind::StatementClose, config.statement_close_force_rstrip, config.trim_blocks); + case State::CommentBody: { + // fast-scan to comment close + const size_t end = m_in.substr(pos).find(config.comment_close); + if (end == nonstd::string_view::npos) { + pos = m_in.size(); + return make_token(Token::Kind::Eof); + } + + // Check for trim pattern + const bool must_rstrip = inja::string_view::starts_with(m_in.substr(pos + end - 1), config.comment_close_force_rstrip); + + // return the entire comment in the close token + state = State::Text; + pos += end + config.comment_close.size(); + Token tok = make_token(Token::Kind::CommentClose); + + if (must_rstrip || config.trim_blocks) { + skip_whitespaces_and_first_newline(); + } + return tok; + } + } + } + + const LexerConfig &get_config() const { + return config; + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_LEXER_HPP_ diff --git a/tools/jsonproc/nlohmann/LICENSE.MIT b/tools/jsonproc/nlohmann/LICENSE.MIT new file mode 100644 index 00000000..00599afe --- /dev/null +++ b/tools/jsonproc/nlohmann/LICENSE.MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013-2017 Niels Lohmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/jsonproc/nlohmann/json.hpp b/tools/jsonproc/nlohmann/json.hpp new file mode 100644 index 00000000..cb27e058 --- /dev/null +++ b/tools/jsonproc/nlohmann/json.hpp @@ -0,0 +1,22091 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ +| | |__ | | | | | | version 3.10.5 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2022 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file doc/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#define NLOHMANN_JSON_VERSION_MAJOR 3 +#define NLOHMANN_JSON_VERSION_MINOR 10 +#define NLOHMANN_JSON_VERSION_PATCH 5 + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // accumulate +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include + + +#include +#include + +// #include + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include + + +#include // exception +#include // runtime_error +#include // to_string +#include // vector + +// #include + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +namespace nlohmann +{ +namespace detail +{ +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +} +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +// #include + + +#include // declval, pair +// #include + + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * For details, see . + * SPDX-License-Identifier: CC0-1.0 + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + +// #include + + +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; +} // namespace detail +} // namespace nlohmann + + +// https://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; +} // namespace detail +} // namespace nlohmann + + +// This file contains all internal macro definitions +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1940 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +inline void replace_substring(std::string& s, const std::string& f, + const std::string& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +inline std::string escape(std::string s) +{ + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +static void unescape(std::string& s) +{ + replace_substring(s, "~1", "/"); + replace_substring(s, "~0", "~"); +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // size_t + +namespace nlohmann +{ +namespace detail +{ +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return "[json.exception." + ename + "." + std::to_string(id_) + "] "; + } + + template + static std::string diagnostics(const BasicJsonType& leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector tokens; + for (const auto* current = &leaf_element; current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) + { + if (¤t->m_parent->m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + return "(" + std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }) + ") "; +#else + static_cast(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + position_string(pos) + ": " + exception::diagnostics(context) + what_arg; + return {id_, pos.chars_read_total, w.c_str()}; + } + + template + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") + + ": " + exception::diagnostics(context) + what_arg; + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return " at line " + std::to_string(pos.lines_read + 1) + + ", column " + std::to_string(pos.chars_read_current_line); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template + static invalid_iterator create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("invalid_iterator", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template + static type_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("type_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template + static out_of_range create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("out_of_range", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template + static other_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("other_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; // NOLINT(readability-redundant-declaration) + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// dispatching helper struct +template struct identity_tag {}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple + +// #include + + +// #include + + +#include // random_access_iterator_tag + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); +} // namespace nlohmann + +// #include + +// #include + +// #include +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ +#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + +#include // int64_t, uint64_t +#include // map +#include // allocator +#include // string +#include // vector + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ +/*! +@brief default JSONSerializer template argument + +This serializer ignores the template arguments and uses ADL +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) +for serialization. +*/ +template +struct adl_serializer; + +/// a class to store JSON values +/// @sa https://json.nlohmann.me/api/basic_json/ +template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector> +class basic_json; + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer; + +/*! +@brief default specialization +@sa https://json.nlohmann.me/api/json/ +*/ +using json = basic_json<>; + +/// @brief a minimal map-like container that preserves insertion order +/// @sa https://json.nlohmann.me/api/ordered_map/ +template +struct ordered_map; + +/// @brief specialization that maintains the insertion order of object keys +/// @sa https://json.nlohmann.me/api/ordered_json/ +using ordered_json = basic_json; + +} // namespace nlohmann + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +namespace nlohmann +{ +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B1 { }; +template +struct conjunction +: std::conditional, B1>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +// a naive helper to check if a type is an ordered_map (exploits the fact that +// ordered_map inherits capacity() from std::vector) +template +struct is_ordered_map +{ + using one = char; + + struct two + { + char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + }; + + template static one test( decltype(&C::capacity) ) ; + template static two test(...); + + enum { value = sizeof(test(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) +}; + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template < typename T, typename U, enable_if_t < !std::is_same::value, int > = 0 > +T conditional_static_cast(U value) +{ + return static_cast(value); +} + +template::value, int> = 0> +T conditional_static_cast(U value) +{ + return value; +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()), j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic::value&& + !std::is_same::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()), j)); + } + b = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + s = *j.template get_ptr(); +} + +template < + typename BasicJsonType, typename ConstructibleStringType, + enable_if_t < + is_constructible_string_type::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ConstructibleStringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + + s = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type::type val; + get_arithmetic_value(j, val); + e = static_cast(val); +} + +// forward_list doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::forward_list& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get(); + }); +} + +// valarray doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::valarray& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get(); + }); +} + +template +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template +void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr(); +} + +template +auto from_json_array_impl(const BasicJsonType& j, std::array& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval()), + j.template get(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template::value, + int> = 0> +void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type::value&& + !is_constructible_object_type::value&& + !is_constructible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag> /*unused*/, index_sequence /*unused*/) +{ + return { { std::forward(j).at(Idx).template get()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag> tag) +-> decltype(from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {}); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name()), j)); + } + + bin = *j.template get_ptr(); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()), j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::boolean: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +std::tuple from_json_tuple_impl_base(BasicJsonType&& j, index_sequence /*unused*/) +{ + return std::make_tuple(std::forward(j).at(Idx).template get()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward(j).at(0).template get(), + std::forward(j).at(1).template get()}; +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); +} + +template +std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + p = *j.template get_ptr(); +} +#endif + +struct from_json_fn +{ + template + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward(val)))) + -> decltype(from_json(j, std::forward(val))) + { + return from_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& from_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + + +#include // copy +#include // begin, end +#include // string +#include // tuple, get +#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include // move, forward, declval, pair +#include // valarray +#include // vector + +// #include + +// #include + + +#include // size_t +#include // input_iterator_tag +#include // string, to_string +#include // tuple_size, get, tuple_element +#include // move + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const string_type empty_str{}; + + public: + explicit iteration_proxy_value(IteratorType it) noexcept + : anchor(std::move(it)) + {} + + /// dereference operator (needed for range-based for) + iteration_proxy_value& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_value begin() noexcept + { + return iteration_proxy_value(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value end() noexcept + { + return iteration_proxy_value(container.end()); + } +}; +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) +{ + return i.value(); +} +} // namespace detail +} // namespace nlohmann + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template +class tuple_size<::nlohmann::detail::iteration_proxy_value> + : public std::integral_constant {}; + +template +class tuple_element> +{ + public: + using type = decltype( + get(std::declval < + ::nlohmann::detail::iteration_proxy_value> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif +} // namespace std + +// #include + +// #include + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template struct external_constructor; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::boolean; + j.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = s; + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_float; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_unsigned; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_integer; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value.array = j.template create(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, const std::vector& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_value.array->push_back(x); + j.set_parent(j.m_value.array->back()); + } + j.assert_invariant(); + } + + template::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value.object = j.template create(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor::construct(j, b); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor::construct(j, s); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor::construct(j, std::move(s)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type::type; + external_constructor::construct(j, static_cast(e)); +} + +template +void to_json(BasicJsonType& j, const std::vector& e) +{ + external_constructor::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type::value&& + !is_compatible_object_type::value&& + !is_compatible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor::construct(j, arr); +} + +template +void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor::construct(j, bin); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const std::valarray& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > +void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor::construct(j, obj); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > +void to_json(BasicJsonType& j, const std::pair& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template>::value, int> = 0> +void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template +void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +{ + j = { std::get(t)... }; +} + +template::value, int > = 0> +void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) + -> decltype(to_json(j, std::forward(val)), void()) + { + return to_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& to_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), val))) + -> decltype(::nlohmann::from_json(std::forward(j), val), void()) + { + ::nlohmann::from_json(std::forward(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) + -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) + { + return ::nlohmann::from_json(std::forward(j), detail::identity_tag {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward(val)))) + -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) + { + ::nlohmann::to_json(j, std::forward(val)); + } +}; +} // namespace nlohmann + +// #include + + +#include // uint8_t, uint64_t +#include // tie +#include // move + +namespace nlohmann +{ + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast(*this), m_subtype, m_has_subtype) == + std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + + +#include // uint8_t +#include // size_t +#include // hash + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash {}(j.template get_ref()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // generate_n +#include // array +#include // ldexp +#include // size_t +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf +#include // memcpy +#include // back_inserter +#include // numeric_limits +#include // char_traits, string +#include // make_pair, move +#include // vector + +// #include + +// #include + + +#include // array +#include // size_t +#include // strlen +#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include // shared_ptr, make_shared, addressof +#include // accumulate +#include // string, char_traits +#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include // pair, declval + +#ifndef JSON_NO_IO + #include // FILE * + #include // istream +#endif // JSON_NO_IO + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + {} + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits::to_int_type, to + // ensure that std::char_traits::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename std::char_traits::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = std::char_traits::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return std::char_traits::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + + +template +struct wide_string_input_helper; + +template +struct wide_string_input_helper +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template +struct wide_string_input_helper +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast(input.get_character()); + const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input apdater to convert wide character types into individual bytes. +template +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template + void fill_buffer() + { + wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + + +template +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using adapter_type = iterator_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template +struct iterator_input_adapter_factory::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using base_adapter_type = iterator_input_adapter; + using adapter_type = wide_string_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template +typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template +struct container_input_adapter_factory {}; + +template +struct container_input_adapter_factory< ContainerType, + void_t()), end(std::declval()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval()), end(std::declval()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template +typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + !std::is_array::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast(b)); + const auto* ptr = reinterpret_cast(b); + return input_adapter(ptr, ptr + length); +} + +template +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} + + template::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +#include // string +#include // move +#include // vector + +// #include + +// #include + + +namespace nlohmann +{ + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template + std::pair handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, &root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// stack to manage which values to keep + std::vector keep_stack {}; + /// stack to manage which object keys to keep + std::vector key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; +} // namespace detail + +} // namespace nlohmann + +// #include + + +#include // array +#include // localeconv +#include // size_t +#include // snprintf +#include // strtof, strtod, strtold, strtoll, strtoull +#include // initializer_list +#include // char_traits, string +#include // move +#include // vector + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////// +// lexer // +/////////// + +template +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template +class lexer : public lexer_base +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + using token_type = typename lexer_base::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast((static_cast(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast((static_cast(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast((static_cast(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case std::char_traits::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast( + // high surrogate occupies the most significant 22 bits + (static_cast(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case std::char_traits::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case std::char_traits::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(std::char_traits::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `std::char_traits::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + token_string.push_back(std::char_traits::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast(c) <= '\x1F') + { + // escape control characters + std::array cs{{}}; + static_cast((std::snprintf)(cs.data(), cs.size(), "", static_cast(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array true_literal = {{static_cast('t'), static_cast('r'), static_cast('u'), static_cast('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array false_literal = {{static_cast('f'), static_cast('a'), static_cast('l'), static_cast('s'), static_cast('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array null_literal = {{static_cast('n'), static_cast('u'), static_cast('l'), static_cast('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case std::char_traits::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // declval +#include // string + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +using null_function_t = decltype(std::declval().null()); + +template +using boolean_function_t = + decltype(std::declval().boolean(std::declval())); + +template +using number_integer_function_t = + decltype(std::declval().number_integer(std::declval())); + +template +using number_unsigned_function_t = + decltype(std::declval().number_unsigned(std::declval())); + +template +using number_float_function_t = decltype(std::declval().number_float( + std::declval(), std::declval())); + +template +using string_function_t = + decltype(std::declval().string(std::declval())); + +template +using binary_function_t = + decltype(std::declval().binary(std::declval())); + +template +using start_object_function_t = + decltype(std::declval().start_object(std::declval())); + +template +using key_function_t = + decltype(std::declval().key(std::declval())); + +template +using end_object_function_t = decltype(std::declval().end_object()); + +template +using start_array_function_t = + decltype(std::declval().start_array(std::declval())); + +template +using end_array_function_t = decltype(std::declval().end_array()); + +template +using parse_error_function_t = decltype(std::declval().parse_error( + std::declval(), std::declval(), + std::declval())); + +template +struct is_sax +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value; +}; + +template +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast(&num) == 1; +} + + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(std::move(adapter)) + { + (void)detail::is_sax_static_asserts {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (format == input_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), + parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value"), BasicJsonType())); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string"), BasicJsonType())); + } + + return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary"), BasicJsonType())); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data()), BasicJsonType())); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) + - static_cast(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary"), BasicJsonType())); + } + } + } + + /*! + @param[in] len the length of the array or static_cast(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + default: + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) + { + switch (get_ignore_noop()) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + } + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair& result) + { + result.first = string_t::npos; // size + result.second = 0; // type + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + + return get_ubjson_size_value(result.first); + } + + if (current == '#') + { + return get_ubjson_size_value(result.first); + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case std::char_traits::eof(): // EOF + return unexpect_eof(input_format_t::ubjson, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'd': + { + float number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char"), BasicJsonType())); + } + string_t s(1, static_cast(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + string_t key; + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + auto res = get_ubjson_size_value(size); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number"))) + { + return false; + } + number_vector.push_back(static_cast(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `std::char_traits::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + */ + template + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != InputIsLittleEndian) + { + vec[sizeof(NumberType) - i - 1] = static_cast(current); + } + else + { + vec[i] = static_cast(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) + { + return sax->parse_error(chars_read, "", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), BasicJsonType())); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return error_msg + " " + context + ": " + detail; + } + + private: + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the SAX parser + json_sax_t* sax = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // isfinite +#include // uint8_t +#include // function +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template +using parser_callback_t = + std::function; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + return result; + } + + private: + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'", BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), BasicJsonType())); + } + + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::end_of_input: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), BasicJsonType())); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), BasicJsonType())); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), BasicJsonType())); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += "while parsing " + context + " "; + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + + m_lexer.get_token_string() + "'"; + } + else + { + error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +#include // ptrdiff_t +#include // numeric_limits + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t const operator++(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t const operator--(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include // conditional, is_const, remove_const + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// forward declare, to be able to friend it later on +template class iteration_proxy; +template class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy; + friend iteration_proxy_value; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json::type>::value, + "iter_impl only accepts (const) basic_json"); + + public: + + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator++(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator--(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", *m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", *m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", *m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator::type> m_it {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // ptrdiff_t +#include // reverse_iterator +#include // declval + +namespace nlohmann +{ +namespace detail +{ +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template +class json_reverse_iterator : public std::reverse_iterator +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator const operator++(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator const operator--(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // all_of +#include // isdigit +#include // max +#include // accumulate +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + public: + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const std::string& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + std::string to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + operator std::string() const + { + return to_string(); + } + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::string token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::string token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const std::string& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const std::string& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(std::string&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + static typename BasicJsonType::size_type array_index(const std::string& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, "array index '" + s + "' must not begin with '0'", BasicJsonType())); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number", BasicJsonType())); + } + + std::size_t processed_chars = 0; + unsigned long long res = 0; // NOLINT(runtime/int) + JSON_TRY + { + res = std::stoull(s, &processed_chars); + } + JSON_CATCH(std::out_of_range&) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // check if the string was completely read + if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size())) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast((std::numeric_limits::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type", BasicJsonType())); // LCOV_EXCL_LINE + } + + return static_cast(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range", *ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector split(const std::string& reference_string) + { + std::vector result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, "JSON pointer must be empty or begin with '/' - was: '" + reference_string + "'", BasicJsonType())); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == std::string::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == std::string::npos) + start = (slash == std::string::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != std::string::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", BasicJsonType())); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + static void flatten(const std::string& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(reference_string + "/" + detail::escape(element.first), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + /*! + @brief compares two JSON pointers for equality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is equal to @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator==(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return lhs.reference_tokens == rhs.reference_tokens; + } + + /*! + @brief compares two JSON pointers for inequality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is not equal @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator!=(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return !(lhs == rhs); + } + + /// the reference tokens + std::vector reference_tokens; +}; +} // namespace nlohmann + +// #include + + +#include +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + + +#include // reverse +#include // array +#include // isnan, isinf +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // memcpy +#include // numeric_limits +#include // string +#include // move + +// #include + +// #include + +// #include + + +#include // copy +#include // size_t +#include // back_inserter +#include // shared_ptr, make_shared +#include // basic_string +#include // vector + +#ifndef JSON_NO_IO + #include // streamsize + #include // basic_ostream +#endif // JSON_NO_IO + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// abstract output adapter interface +template struct output_adapter_protocol +{ + virtual void write_character(CharType c) = 0; + virtual void write_characters(const CharType* s, std::size_t length) = 0; + virtual ~output_adapter_protocol() = default; + + output_adapter_protocol() = default; + output_adapter_protocol(const output_adapter_protocol&) = default; + output_adapter_protocol(output_adapter_protocol&&) noexcept = default; + output_adapter_protocol& operator=(const output_adapter_protocol&) = default; + output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default; +}; + +/// a type to simplify interfaces +template +using output_adapter_t = std::shared_ptr>; + +/// output adapter for byte vectors +template> +class output_vector_adapter : public output_adapter_protocol +{ + public: + explicit output_vector_adapter(std::vector& vec) noexcept + : v(vec) + {} + + void write_character(CharType c) override + { + v.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + std::copy(s, s + length, std::back_inserter(v)); + } + + private: + std::vector& v; +}; + +#ifndef JSON_NO_IO +/// output adapter for output streams +template +class output_stream_adapter : public output_adapter_protocol +{ + public: + explicit output_stream_adapter(std::basic_ostream& s) noexcept + : stream(s) + {} + + void write_character(CharType c) override + { + stream.put(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + stream.write(s, static_cast(length)); + } + + private: + std::basic_ostream& stream; +}; +#endif // JSON_NO_IO + +/// output adapter for basic_string +template> +class output_string_adapter : public output_adapter_protocol +{ + public: + explicit output_string_adapter(StringType& s) noexcept + : str(s) + {} + + void write_character(CharType c) override + { + str.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + str.append(s, length); + } + + private: + StringType& str; +}; + +template> +class output_adapter +{ + public: + template> + output_adapter(std::vector& vec) + : oa(std::make_shared>(vec)) {} + +#ifndef JSON_NO_IO + output_adapter(std::basic_ostream& s) + : oa(std::make_shared>(s)) {} +#endif // JSON_NO_IO + + output_adapter(StringType& s) + : oa(std::make_shared>(s)) {} + + operator output_adapter_t() + { + return oa; + } + + private: + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// binary writer // +/////////////////// + +/*! +@brief serialization to CBOR and MessagePack values +*/ +template +class binary_writer +{ + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using number_float_t = typename BasicJsonType::number_float_t; + + public: + /*! + @brief create a binary writer + + @param[in] adapter output adapter to write to + */ + explicit binary_writer(output_adapter_t adapter) : oa(std::move(adapter)) + { + JSON_ASSERT(oa); + } + + /*! + @param[in] j JSON value to serialize + @pre j.type() == value_t::object + */ + void write_bson(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + { + write_bson_object(*j.m_value.object); + break; + } + + case value_t::null: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name()), j)); + } + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_cbor(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: + { + oa->write_character(to_char_type(0xF6)); + break; + } + + case value_t::boolean: + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xF5) + : to_char_type(0xF4)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // CBOR does not differentiate between positive signed + // integers and unsigned integers. Therefore, we used the + // code from the value_t::number_unsigned case here. + if (j.m_value.number_integer <= 0x17) + { + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_integer)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + // The conversions below encode the sign in the first + // byte, and the value is converted to a positive number. + const auto positive_number = -1 - j.m_value.number_integer; + if (j.m_value.number_integer >= -24) + { + write_number(static_cast(0x20 + positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x38)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x39)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x3A)); + write_number(static_cast(positive_number)); + } + else + { + oa->write_character(to_char_type(0x3B)); + write_number(static_cast(positive_number)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= 0x17) + { + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_unsigned)); + } + break; + } + + case value_t::number_float: + { + if (std::isnan(j.m_value.number_float)) + { + // NaN is 0xf97e00 in CBOR + oa->write_character(to_char_type(0xF9)); + oa->write_character(to_char_type(0x7E)); + oa->write_character(to_char_type(0x00)); + } + else if (std::isinf(j.m_value.number_float)) + { + // Infinity is 0xf97c00, -Infinity is 0xf9fc00 + oa->write_character(to_char_type(0xf9)); + oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); + oa->write_character(to_char_type(0x00)); + } + else + { + write_compact_float(j.m_value.number_float, detail::input_format_t::cbor); + } + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 0x17) + { + write_number(static_cast(0x60 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x78)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x79)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 0x17) + { + write_number(static_cast(0x80 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x98)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x99)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_cbor(el); + } + break; + } + + case value_t::binary: + { + if (j.m_value.binary->has_subtype()) + { + if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd8)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd9)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xda)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xdb)); + write_number(static_cast(j.m_value.binary->subtype())); + } + } + + // step 1: write control byte and the binary array size + const auto N = j.m_value.binary->size(); + if (N <= 0x17) + { + write_number(static_cast(0x40 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x58)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x59)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 0x17) + { + write_number(static_cast(0xA0 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB8)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBA)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBB)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_cbor(el.first); + write_cbor(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_msgpack(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: // nil + { + oa->write_character(to_char_type(0xC0)); + break; + } + + case value_t::boolean: // true and false + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xC3) + : to_char_type(0xC2)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // MessagePack does not differentiate between positive + // signed integers and unsigned integers. Therefore, we used + // the code from the value_t::number_unsigned case here. + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + if (j.m_value.number_integer >= -32) + { + // negative fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 8 + oa->write_character(to_char_type(0xD0)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 16 + oa->write_character(to_char_type(0xD1)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 32 + oa->write_character(to_char_type(0xD2)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 64 + oa->write_character(to_char_type(0xD3)); + write_number(static_cast(j.m_value.number_integer)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + break; + } + + case value_t::number_float: + { + write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack); + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 31) + { + // fixstr + write_number(static_cast(0xA0 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 8 + oa->write_character(to_char_type(0xD9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 16 + oa->write_character(to_char_type(0xDA)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 32 + oa->write_character(to_char_type(0xDB)); + write_number(static_cast(N)); + } + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 15) + { + // fixarray + write_number(static_cast(0x90 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 16 + oa->write_character(to_char_type(0xDC)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 32 + oa->write_character(to_char_type(0xDD)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_msgpack(el); + } + break; + } + + case value_t::binary: + { + // step 0: determine if the binary type has a set subtype to + // determine whether or not to use the ext or fixext types + const bool use_ext = j.m_value.binary->has_subtype(); + + // step 1: write control byte and the byte string length + const auto N = j.m_value.binary->size(); + if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type{}; + bool fixed = true; + if (use_ext) + { + switch (N) + { + case 1: + output_type = 0xD4; // fixext 1 + break; + case 2: + output_type = 0xD5; // fixext 2 + break; + case 4: + output_type = 0xD6; // fixext 4 + break; + case 8: + output_type = 0xD7; // fixext 8 + break; + case 16: + output_type = 0xD8; // fixext 16 + break; + default: + output_type = 0xC7; // ext 8 + fixed = false; + break; + } + + } + else + { + output_type = 0xC4; // bin 8 + fixed = false; + } + + oa->write_character(to_char_type(output_type)); + if (!fixed) + { + write_number(static_cast(N)); + } + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC8 // ext 16 + : 0xC5; // bin 16 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC9 // ext 32 + : 0xC6; // bin 32 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + + // step 1.5: if this is an ext type, write the subtype + if (use_ext) + { + write_number(static_cast(j.m_value.binary->subtype())); + } + + // step 2: write the byte string + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 15) + { + // fixmap + write_number(static_cast(0x80 | (N & 0xF))); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 16 + oa->write_character(to_char_type(0xDE)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 32 + oa->write_character(to_char_type(0xDF)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_msgpack(el.first); + write_msgpack(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + @param[in] use_count whether to use '#' prefixes (optimized format) + @param[in] use_type whether to use '$' prefixes (optimized format) + @param[in] add_prefix whether prefixes need to be used for this value + */ + void write_ubjson(const BasicJsonType& j, const bool use_count, + const bool use_type, const bool add_prefix = true) + { + switch (j.type()) + { + case value_t::null: + { + if (add_prefix) + { + oa->write_character(to_char_type('Z')); + } + break; + } + + case value_t::boolean: + { + if (add_prefix) + { + oa->write_character(j.m_value.boolean + ? to_char_type('T') + : to_char_type('F')); + } + break; + } + + case value_t::number_integer: + { + write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); + break; + } + + case value_t::number_unsigned: + { + write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); + break; + } + + case value_t::number_float: + { + write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); + break; + } + + case value_t::string: + { + if (add_prefix) + { + oa->write_character(to_char_type('S')); + } + write_number_with_ubjson_prefix(j.m_value.string->size(), true); + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.array->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin() + 1, j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.array->size(), true); + } + + for (const auto& el : *j.m_value.array) + { + write_ubjson(el, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::binary: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + if (use_type && !j.m_value.binary->empty()) + { + JSON_ASSERT(use_count); + oa->write_character(to_char_type('$')); + oa->write_character('U'); + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.binary->size(), true); + } + + if (use_type) + { + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + j.m_value.binary->size()); + } + else + { + for (size_t i = 0; i < j.m_value.binary->size(); ++i) + { + oa->write_character(to_char_type('U')); + oa->write_character(j.m_value.binary->data()[i]); + } + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::object: + { + if (add_prefix) + { + oa->write_character(to_char_type('{')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.object->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin(), j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.object->size(), true); + } + + for (const auto& el : *j.m_value.object) + { + write_number_with_ubjson_prefix(el.first.size(), true); + oa->write_characters( + reinterpret_cast(el.first.c_str()), + el.first.size()); + write_ubjson(el.second, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type('}')); + } + + break; + } + + case value_t::discarded: + default: + break; + } + } + + private: + ////////// + // BSON // + ////////// + + /*! + @return The size of a BSON document entry header, including the id marker + and the entry name size (and its null-terminator). + */ + static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) + { + const auto it = name.find(static_cast(0)); + if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) + { + JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")", j)); + static_cast(j); + } + + return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; + } + + /*! + @brief Writes the given @a element_type and @a name to the output adapter + */ + void write_bson_entry_header(const string_t& name, + const std::uint8_t element_type) + { + oa->write_character(to_char_type(element_type)); // boolean + oa->write_characters( + reinterpret_cast(name.c_str()), + name.size() + 1u); + } + + /*! + @brief Writes a BSON element with key @a name and boolean value @a value + */ + void write_bson_boolean(const string_t& name, + const bool value) + { + write_bson_entry_header(name, 0x08); + oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and double value @a value + */ + void write_bson_double(const string_t& name, + const double value) + { + write_bson_entry_header(name, 0x01); + write_number(value); + } + + /*! + @return The size of the BSON-encoded string in @a value + */ + static std::size_t calc_bson_string_size(const string_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and string value @a value + */ + void write_bson_string(const string_t& name, + const string_t& value) + { + write_bson_entry_header(name, 0x02); + + write_number(static_cast(value.size() + 1ul)); + oa->write_characters( + reinterpret_cast(value.c_str()), + value.size() + 1); + } + + /*! + @brief Writes a BSON element with key @a name and null value + */ + void write_bson_null(const string_t& name) + { + write_bson_entry_header(name, 0x0A); + } + + /*! + @return The size of the BSON-encoded integer @a value + */ + static std::size_t calc_bson_integer_size(const std::int64_t value) + { + return (std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)() + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and integer @a value + */ + void write_bson_integer(const string_t& name, + const std::int64_t value) + { + if ((std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)()) + { + write_bson_entry_header(name, 0x10); // int32 + write_number(static_cast(value)); + } + else + { + write_bson_entry_header(name, 0x12); // int64 + write_number(static_cast(value)); + } + } + + /*! + @return The size of the BSON-encoded unsigned integer in @a j + */ + static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept + { + return (value <= static_cast((std::numeric_limits::max)())) + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and unsigned @a value + */ + void write_bson_unsigned(const string_t& name, + const BasicJsonType& j) + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x10 /* int32 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x12 /* int64 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(j.m_value.number_unsigned) + " cannot be represented by BSON as it does not fit int64", j)); + } + } + + /*! + @brief Writes a BSON element with key @a name and object @a value + */ + void write_bson_object_entry(const string_t& name, + const typename BasicJsonType::object_t& value) + { + write_bson_entry_header(name, 0x03); // object + write_bson_object(value); + } + + /*! + @return The size of the BSON-encoded array @a value + */ + static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) + { + std::size_t array_index = 0ul; + + const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) + { + return result + calc_bson_element_size(std::to_string(array_index++), el); + }); + + return sizeof(std::int32_t) + embedded_document_size + 1ul; + } + + /*! + @return The size of the BSON-encoded binary array @a value + */ + static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and array @a value + */ + void write_bson_array(const string_t& name, + const typename BasicJsonType::array_t& value) + { + write_bson_entry_header(name, 0x04); // array + write_number(static_cast(calc_bson_array_size(value))); + + std::size_t array_index = 0ul; + + for (const auto& el : value) + { + write_bson_element(std::to_string(array_index++), el); + } + + oa->write_character(to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and binary value @a value + */ + void write_bson_binary(const string_t& name, + const binary_t& value) + { + write_bson_entry_header(name, 0x05); + + write_number(static_cast(value.size())); + write_number(value.has_subtype() ? static_cast(value.subtype()) : static_cast(0x00)); + + oa->write_characters(reinterpret_cast(value.data()), value.size()); + } + + /*! + @brief Calculates the size necessary to serialize the JSON value @a j with its @a name + @return The calculated size for the BSON document entry for @a j with the given @a name. + */ + static std::size_t calc_bson_element_size(const string_t& name, + const BasicJsonType& j) + { + const auto header_size = calc_bson_entry_header_size(name, j); + switch (j.type()) + { + case value_t::object: + return header_size + calc_bson_object_size(*j.m_value.object); + + case value_t::array: + return header_size + calc_bson_array_size(*j.m_value.array); + + case value_t::binary: + return header_size + calc_bson_binary_size(*j.m_value.binary); + + case value_t::boolean: + return header_size + 1ul; + + case value_t::number_float: + return header_size + 8ul; + + case value_t::number_integer: + return header_size + calc_bson_integer_size(j.m_value.number_integer); + + case value_t::number_unsigned: + return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned); + + case value_t::string: + return header_size + calc_bson_string_size(*j.m_value.string); + + case value_t::null: + return header_size + 0ul; + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return 0ul; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Serializes the JSON value @a j to BSON and associates it with the + key @a name. + @param name The name to associate with the JSON entity @a j within the + current BSON document + */ + void write_bson_element(const string_t& name, + const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + return write_bson_object_entry(name, *j.m_value.object); + + case value_t::array: + return write_bson_array(name, *j.m_value.array); + + case value_t::binary: + return write_bson_binary(name, *j.m_value.binary); + + case value_t::boolean: + return write_bson_boolean(name, j.m_value.boolean); + + case value_t::number_float: + return write_bson_double(name, j.m_value.number_float); + + case value_t::number_integer: + return write_bson_integer(name, j.m_value.number_integer); + + case value_t::number_unsigned: + return write_bson_unsigned(name, j); + + case value_t::string: + return write_bson_string(name, *j.m_value.string); + + case value_t::null: + return write_bson_null(name); + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Calculates the size of the BSON serialization of the given + JSON-object @a j. + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) + { + std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast(0), + [](size_t result, const typename BasicJsonType::object_t::value_type & el) + { + return result += calc_bson_element_size(el.first, el.second); + }); + + return sizeof(std::int32_t) + document_size + 1ul; + } + + /*! + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + void write_bson_object(const typename BasicJsonType::object_t& value) + { + write_number(static_cast(calc_bson_object_size(value))); + + for (const auto& el : value) + { + write_bson_element(el.first, el.second); + } + + oa->write_character(to_char_type(0x00)); + } + + ////////// + // CBOR // + ////////// + + static constexpr CharType get_cbor_float_prefix(float /*unused*/) + { + return to_char_type(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double /*unused*/) + { + return to_char_type(0xFB); // Double-Precision Float + } + + ///////////// + // MsgPack // + ///////////// + + static constexpr CharType get_msgpack_float_prefix(float /*unused*/) + { + return to_char_type(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double /*unused*/) + { + return to_char_type(0xCB); // float 64 + } + + //////////// + // UBJSON // + //////////// + + // UBJSON: write number (floating point) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (add_prefix) + { + oa->write_character(get_ubjson_float_prefix(n)); + } + write_number(n); + } + + // UBJSON: write number (unsigned integer) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + } + + // UBJSON: write number (signed integer) + template < typename NumberType, typename std::enable_if < + std::is_signed::value&& + !std::is_floating_point::value, int >::type = 0 > + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (static_cast((std::numeric_limits::min)()) <= n && n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + // LCOV_EXCL_START + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + // LCOV_EXCL_STOP + } + + /*! + @brief determine the type prefix of container values + */ + CharType ubjson_prefix(const BasicJsonType& j) const noexcept + { + switch (j.type()) + { + case value_t::null: + return 'Z'; + + case value_t::boolean: + return j.m_value.boolean ? 'T' : 'F'; + + case value_t::number_integer: + { + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'i'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'U'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'I'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'l'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'i'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'U'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'I'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'l'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_float: + return get_ubjson_float_prefix(j.m_value.number_float); + + case value_t::string: + return 'S'; + + case value_t::array: // fallthrough + case value_t::binary: + return '['; + + case value_t::object: + return '{'; + + case value_t::discarded: + default: // discarded values + return 'N'; + } + } + + static constexpr CharType get_ubjson_float_prefix(float /*unused*/) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double /*unused*/) + { + return 'D'; // float 64 + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /* + @brief write a number to output input + @param[in] n number of type @a NumberType + @tparam NumberType the type of the number + @tparam OutputIsLittleEndian Set to true if output data is + required to be little endian + + @note This function needs to respect the system's endianness, because bytes + in CBOR, MessagePack, and UBJSON are stored in network order (big + endian) and therefore need reordering on little endian systems. + */ + template + void write_number(const NumberType n) + { + // step 1: write number to array of length NumberType + std::array vec{}; + std::memcpy(vec.data(), &n, sizeof(NumberType)); + + // step 2: write array to output (with possible reordering) + if (is_little_endian != OutputIsLittleEndian) + { + // reverse byte order prior to conversion if necessary + std::reverse(vec.begin(), vec.end()); + } + + oa->write_characters(vec.data(), sizeof(NumberType)); + } + + void write_compact_float(const number_float_t n, detail::input_format_t format) + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (static_cast(n) >= static_cast(std::numeric_limits::lowest()) && + static_cast(n) <= static_cast((std::numeric_limits::max)()) && + static_cast(static_cast(n)) == static_cast(n)) + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(static_cast(n)) + : get_msgpack_float_prefix(static_cast(n))); + write_number(static_cast(n)); + } + else + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(n) + : get_msgpack_float_prefix(n)); + write_number(n); + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + public: + // The following to_char_type functions are implement the conversion + // between uint8_t and CharType. In case CharType is not unsigned, + // such a conversion is required to allow values greater than 128. + // See for a discussion. + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_signed::value > * = nullptr > + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return *reinterpret_cast(&x); + } + + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_unsigned::value > * = nullptr > + static CharType to_char_type(std::uint8_t x) noexcept + { + static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); + static_assert(std::is_trivial::value, "CharType must be trivial"); + CharType result; + std::memcpy(&result, &x, sizeof(x)); + return result; + } + + template::value>* = nullptr> + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return x; + } + + template < typename InputCharType, typename C = CharType, + enable_if_t < + std::is_signed::value && + std::is_signed::value && + std::is_same::type>::value + > * = nullptr > + static constexpr CharType to_char_type(InputCharType x) noexcept + { + return x; + } + + private: + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the output + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // reverse, remove, fill, find, none_of +#include // array +#include // localeconv, lconv +#include // labs, isfinite, isnan, signbit +#include // size_t, ptrdiff_t +#include // uint8_t +#include // snprintf +#include // numeric_limits +#include // string, char_traits +#include // setfill, setw +#include // stringstream +#include // is_same +#include // move + +// #include + + +#include // array +#include // signbit, isfinite +#include // intN_t, uintN_t +#include // memcpy, memmove +#include // numeric_limits +#include // conditional + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional::type; + + const auto bits = static_cast(reinterpret_bits(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 + const boundaries w = compute_boundaries(static_cast(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + else + { + *buf++ = static_cast('0' + k / 100); + k %= 100; + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast(n) - static_cast(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); + buf[n] = '.'; + return buf + (static_cast(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast(-n)); + return buf + (2U + static_cast(-n) + static_cast(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// serialization // +/////////////////// + +/// how to treat decoding errors +enum class error_handler_t +{ + strict, ///< throw a type_error exception in case of invalid UTF-8 + replace, ///< replace invalid UTF-8 sequences with U+FFFD + ignore ///< ignore invalid UTF-8 sequences +}; + +template +class serializer +{ + using string_t = typename BasicJsonType::string_t; + using number_float_t = typename BasicJsonType::number_float_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using binary_char_t = typename BasicJsonType::binary_t::value_type; + static constexpr std::uint8_t UTF8_ACCEPT = 0; + static constexpr std::uint8_t UTF8_REJECT = 1; + + public: + /*! + @param[in] s output stream to serialize to + @param[in] ichar indentation character to use + @param[in] error_handler_ how to react on decoding errors + */ + serializer(output_adapter_t s, const char ichar, + error_handler_t error_handler_ = error_handler_t::strict) + : o(std::move(s)) + , loc(std::localeconv()) + , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->thousands_sep))) + , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->decimal_point))) + , indent_char(ichar) + , indent_string(512, indent_char) + , error_handler(error_handler_) + {} + + // delete because of pointer members + serializer(const serializer&) = delete; + serializer& operator=(const serializer&) = delete; + serializer(serializer&&) = delete; + serializer& operator=(serializer&&) = delete; + ~serializer() = default; + + /*! + @brief internal implementation of the serialization function + + This function is called by the public member function dump and organizes + the serialization internally. The indentation level is propagated as + additional parameter. In case of arrays and objects, the function is + called recursively. + + - strings and object keys are escaped using `escape_string()` + - integer numbers are converted implicitly via `operator<<` + - floating-point numbers are converted to a string using `"%g"` format + - binary values are serialized as objects containing the subtype and the + byte array + + @param[in] val value to serialize + @param[in] pretty_print whether the output shall be pretty-printed + @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters + in the output are escaped with `\uXXXX` sequences, and the result consists + of ASCII characters only. + @param[in] indent_step the indent level + @param[in] current_indent the current indent level (only used internally) + */ + void dump(const BasicJsonType& val, + const bool pretty_print, + const bool ensure_ascii, + const unsigned int indent_step, + const unsigned int current_indent = 0) + { + switch (val.m_type) + { + case value_t::object: + { + if (val.m_value.object->empty()) + { + o->write_characters("{}", 2); + return; + } + + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_character('{'); + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + + o->write_character('}'); + } + + return; + } + + case value_t::array: + { + if (val.m_value.array->empty()) + { + o->write_characters("[]", 2); + return; + } + + if (pretty_print) + { + o->write_characters("[\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + dump(*i, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + o->write_characters(indent_string.c_str(), new_indent); + dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character(']'); + } + else + { + o->write_character('['); + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + dump(*i, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); + + o->write_character(']'); + } + + return; + } + + case value_t::string: + { + o->write_character('\"'); + dump_escaped(*val.m_value.string, ensure_ascii); + o->write_character('\"'); + return; + } + + case value_t::binary: + { + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"bytes\": [", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_characters(", ", 2); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\n", 3); + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"subtype\": ", 11); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + } + else + { + o->write_characters("null", 4); + } + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_characters("{\"bytes\":[", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_character(','); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\"subtype\":", 12); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + o->write_character('}'); + } + else + { + o->write_characters("null}", 5); + } + } + return; + } + + case value_t::boolean: + { + if (val.m_value.boolean) + { + o->write_characters("true", 4); + } + else + { + o->write_characters("false", 5); + } + return; + } + + case value_t::number_integer: + { + dump_integer(val.m_value.number_integer); + return; + } + + case value_t::number_unsigned: + { + dump_integer(val.m_value.number_unsigned); + return; + } + + case value_t::number_float: + { + dump_float(val.m_value.number_float); + return; + } + + case value_t::discarded: + { + o->write_characters("", 11); + return; + } + + case value_t::null: + { + o->write_characters("null", 4); + return; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief dump escaped string + + Escape a string by replacing certain special characters by a sequence of an + escape character (backslash) and another character and other control + characters by a sequence of "\u" followed by a four-digit hex + representation. The escaped string is written to output stream @a o. + + @param[in] s the string to escape + @param[in] ensure_ascii whether to escape non-ASCII characters with + \uXXXX sequences + + @complexity Linear in the length of string @a s. + */ + void dump_escaped(const string_t& s, const bool ensure_ascii) + { + std::uint32_t codepoint{}; + std::uint8_t state = UTF8_ACCEPT; + std::size_t bytes = 0; // number of bytes written to string_buffer + + // number of bytes written at the point of the last valid byte + std::size_t bytes_after_last_accept = 0; + std::size_t undumped_chars = 0; + + for (std::size_t i = 0; i < s.size(); ++i) + { + const auto byte = static_cast(s[i]); + + switch (decode(state, codepoint, byte)) + { + case UTF8_ACCEPT: // decode found a new code point + { + switch (codepoint) + { + case 0x08: // backspace + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'b'; + break; + } + + case 0x09: // horizontal tab + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 't'; + break; + } + + case 0x0A: // newline + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'n'; + break; + } + + case 0x0C: // formfeed + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'f'; + break; + } + + case 0x0D: // carriage return + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'r'; + break; + } + + case 0x22: // quotation mark + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\"'; + break; + } + + case 0x5C: // reverse solidus + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\\'; + break; + } + + default: + { + // escape control characters (0x00..0x1F) or, if + // ensure_ascii parameter is used, non-ASCII characters + if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) + { + if (codepoint <= 0xFFFF) + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", + static_cast(codepoint))); + bytes += 6; + } + else + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast(0xD7C0u + (codepoint >> 10u)), + static_cast(0xDC00u + (codepoint & 0x3FFu)))); + bytes += 12; + } + } + else + { + // copy byte to buffer (all previous bytes + // been copied have in default case above) + string_buffer[bytes++] = s[i]; + } + break; + } + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + // remember the byte position of this accept + bytes_after_last_accept = bytes; + undumped_chars = 0; + break; + } + + case UTF8_REJECT: // decode found invalid UTF-8 byte + { + switch (error_handler) + { + case error_handler_t::strict: + { + std::stringstream ss; + ss << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (byte | 0); + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + ss.str(), BasicJsonType())); + } + + case error_handler_t::ignore: + case error_handler_t::replace: + { + // in case we saw this character the first time, we + // would like to read it again, because the byte + // may be OK for itself, but just not OK for the + // previous sequence + if (undumped_chars > 0) + { + --i; + } + + // reset length buffer to the last accepted index; + // thus removing/ignoring the invalid characters + bytes = bytes_after_last_accept; + + if (error_handler == error_handler_t::replace) + { + // add a replacement character + if (ensure_ascii) + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'u'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'd'; + } + else + { + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xEF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBD'); + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + bytes_after_last_accept = bytes; + } + + undumped_chars = 0; + + // continue processing the string + state = UTF8_ACCEPT; + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + break; + } + + default: // decode found yet incomplete multi-byte code point + { + if (!ensure_ascii) + { + // code point will not be escaped - copy byte to buffer + string_buffer[bytes++] = s[i]; + } + ++undumped_chars; + break; + } + } + } + + // we finished processing the string + if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) + { + // write buffer + if (bytes > 0) + { + o->write_characters(string_buffer.data(), bytes); + } + } + else + { + // we finish reading, but do not accept: string was incomplete + switch (error_handler) + { + case error_handler_t::strict: + { + std::stringstream ss; + ss << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (static_cast(s.back()) | 0); + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + ss.str(), BasicJsonType())); + } + + case error_handler_t::ignore: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + break; + } + + case error_handler_t::replace: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + // add a replacement character + if (ensure_ascii) + { + o->write_characters("\\ufffd", 6); + } + else + { + o->write_characters("\xEF\xBF\xBD", 3); + } + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + } + + private: + /*! + @brief count digits + + Count the number of decimal (base 10) digits for an input unsigned integer. + + @param[in] x unsigned integer number to count its digits + @return number of decimal digits + */ + inline unsigned int count_digits(number_unsigned_t x) noexcept + { + unsigned int n_digits = 1; + for (;;) + { + if (x < 10) + { + return n_digits; + } + if (x < 100) + { + return n_digits + 1; + } + if (x < 1000) + { + return n_digits + 2; + } + if (x < 10000) + { + return n_digits + 3; + } + x = x / 10000u; + n_digits += 4; + } + } + + // templates to avoid warnings about useless casts + template ::value, int> = 0> + bool is_negative_number(NumberType x) + { + return x < 0; + } + + template < typename NumberType, enable_if_t ::value, int > = 0 > + bool is_negative_number(NumberType /*unused*/) + { + return false; + } + + /*! + @brief dump an integer + + Dump a given integer to output stream @a o. Works internally with + @a number_buffer. + + @param[in] x integer number (signed or unsigned) to dump + @tparam NumberType either @a number_integer_t or @a number_unsigned_t + */ + template < typename NumberType, detail::enable_if_t < + std::is_integral::value || + std::is_same::value || + std::is_same::value || + std::is_same::value, + int > = 0 > + void dump_integer(NumberType x) + { + static constexpr std::array, 100> digits_to_99 + { + { + {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, + {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, + {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, + {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, + {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, + {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, + {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, + {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, + {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, + {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, + } + }; + + // special case for "0" + if (x == 0) + { + o->write_character('0'); + return; + } + + // use a pointer to fill the buffer + auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg) + + number_unsigned_t abs_value; + + unsigned int n_chars{}; + + if (is_negative_number(x)) + { + *buffer_ptr = '-'; + abs_value = remove_sign(static_cast(x)); + + // account one more byte for the minus sign + n_chars = 1 + count_digits(abs_value); + } + else + { + abs_value = static_cast(x); + n_chars = count_digits(abs_value); + } + + // spare 1 byte for '\0' + JSON_ASSERT(n_chars < number_buffer.size() - 1); + + // jump to the end to generate the string from backward, + // so we later avoid reversing the result + buffer_ptr += n_chars; + + // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu + // See: https://www.youtube.com/watch?v=o4-CwDo2zpg + while (abs_value >= 100) + { + const auto digits_index = static_cast((abs_value % 100)); + abs_value /= 100; + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + + if (abs_value >= 10) + { + const auto digits_index = static_cast(abs_value); + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + else + { + *(--buffer_ptr) = static_cast('0' + abs_value); + } + + o->write_characters(number_buffer.data(), n_chars); + } + + /*! + @brief dump a floating-point number + + Dump a given floating-point number to output stream @a o. Works internally + with @a number_buffer. + + @param[in] x floating-point number to dump + */ + void dump_float(number_float_t x) + { + // NaN / inf + if (!std::isfinite(x)) + { + o->write_characters("null", 4); + return; + } + + // If number_float_t is an IEEE-754 single or double precision number, + // use the Grisu2 algorithm to produce short numbers which are + // guaranteed to round-trip, using strtof and strtod, resp. + // + // NB: The test below works if == . + static constexpr bool is_ieee_single_or_double + = (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 24 && std::numeric_limits::max_exponent == 128) || + (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 53 && std::numeric_limits::max_exponent == 1024); + + dump_float(x, std::integral_constant()); + } + + void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) + { + auto* begin = number_buffer.data(); + auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); + + o->write_characters(begin, static_cast(end - begin)); + } + + void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) + { + // get number of digits for a float -> text -> float round-trip + static constexpr auto d = std::numeric_limits::max_digits10; + + // the actual conversion + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); + + // negative value indicates an error + JSON_ASSERT(len > 0); + // check if buffer was large enough + JSON_ASSERT(static_cast(len) < number_buffer.size()); + + // erase thousands separator + if (thousands_sep != '\0') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); + std::fill(end, number_buffer.end(), '\0'); + JSON_ASSERT((end - number_buffer.begin()) <= len); + len = (end - number_buffer.begin()); + } + + // convert decimal point to '.' + if (decimal_point != '\0' && decimal_point != '.') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); + if (dec_pos != number_buffer.end()) + { + *dec_pos = '.'; + } + } + + o->write_characters(number_buffer.data(), static_cast(len)); + + // determine if we need to append ".0" + const bool value_is_int_like = + std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, + [](char c) + { + return c == '.' || c == 'e'; + }); + + if (value_is_int_like) + { + o->write_characters(".0", 2); + } + } + + /*! + @brief check whether a string is UTF-8 encoded + + The function checks each byte of a string whether it is UTF-8 encoded. The + result of the check is stored in the @a state parameter. The function must + be called initially with state 0 (accept). State 1 means the string must + be rejected, because the current byte is not allowed. If the string is + completely processed, but the state is non-zero, the string ended + prematurely; that is, the last byte indicated more bytes should have + followed. + + @param[in,out] state the state of the decoding + @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) + @param[in] byte next byte to decode + @return new state + + @note The function has been edited: a std::array is used. + + @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann + @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + */ + static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept + { + static const std::array utf8d = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF + 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF + 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF + 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF + 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 + 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 + 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 + } + }; + + JSON_ASSERT(byte < utf8d.size()); + const std::uint8_t type = utf8d[byte]; + + codep = (state != UTF8_ACCEPT) + ? (byte & 0x3fu) | (codep << 6u) + : (0xFFu >> type) & (byte); + + std::size_t index = 256u + static_cast(state) * 16u + static_cast(type); + JSON_ASSERT(index < 400); + state = utf8d[index]; + return state; + } + + /* + * Overload to make the compiler happy while it is instantiating + * dump_integer for number_unsigned_t. + * Must never be called. + */ + number_unsigned_t remove_sign(number_unsigned_t x) + { + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE + } + + /* + * Helper function for dump_integer + * + * This function takes a negative signed integer and returns its absolute + * value as unsigned integer. The plus/minus shuffling is necessary as we can + * not directly remove the sign of an arbitrary signed integer as the + * absolute values of INT_MIN and INT_MAX are usually not the same. See + * #1708 for details. + */ + inline number_unsigned_t remove_sign(number_integer_t x) noexcept + { + JSON_ASSERT(x < 0 && x < (std::numeric_limits::max)()); // NOLINT(misc-redundant-expression) + return static_cast(-(x + 1)) + 1; + } + + private: + /// the output of the serializer + output_adapter_t o = nullptr; + + /// a (hopefully) large enough character buffer + std::array number_buffer{{}}; + + /// the locale + const std::lconv* loc = nullptr; + /// the locale's thousand separator character + const char thousands_sep = '\0'; + /// the locale's decimal point character + const char decimal_point = '\0'; + + /// string buffer + std::array string_buffer{{}}; + + /// the indentation character + const char indent_char; + /// the indentation string + string_t indent_string; + + /// error_handler how to react on decoding errors + const error_handler_t error_handler; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // less +#include // initializer_list +#include // input_iterator_tag, iterator_traits +#include // allocator +#include // for out_of_range +#include // enable_if, is_convertible +#include // pair +#include // vector + +// #include + + +namespace nlohmann +{ + +/// ordered_map: a minimal map-like container that preserves insertion order +/// for use within nlohmann::basic_json +template , + class Allocator = std::allocator>> + struct ordered_map : std::vector, Allocator> +{ + using key_type = Key; + using mapped_type = T; + using Container = std::vector, Allocator>; + using iterator = typename Container::iterator; + using const_iterator = typename Container::const_iterator; + using size_type = typename Container::size_type; + using value_type = typename Container::value_type; + + // Explicit constructors instead of `using Container::Container` + // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) + ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {} + template + ordered_map(It first, It last, const Allocator& alloc = Allocator()) + : Container{first, last, alloc} {} + ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) + : Container{init, alloc} {} + + std::pair emplace(const key_type& key, T&& t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return {it, false}; + } + } + Container::emplace_back(key, t); + return {--this->end(), true}; + } + + T& operator[](const Key& key) + { + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + iterator erase(iterator pos) + { + return erase(pos, std::next(pos)); + } + + iterator erase(iterator first, iterator last) + { + const auto elements_affected = std::distance(first, last); + const auto offset = std::distance(Container::begin(), first); + + // This is the start situation. We need to delete elements_affected + // elements (3 in this example: e, f, g), and need to return an + // iterator past the last deleted element (h in this example). + // Note that offset is the distance from the start of the vector + // to first. We will need this later. + + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // first last + + // Since we cannot move const Keys, we re-construct them in place. + // We start at first and re-construct (viz. copy) the elements from + // the back of the vector. Example for first iteration: + + // ,--------. + // v | destroy e and re-construct with h + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // it it + elements_affected + + for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) + { + it->~value_type(); // destroy but keep allocation + new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // "move" next element to it + } + + // [ a, b, c, d, h, i, j, h, i, j ] + // ^ ^ + // first last + + // remove the unneeded elements at the end of the vector + Container::resize(this->size() - static_cast(elements_affected)); + + // [ a, b, c, d, h, i, j ] + // ^ ^ + // first last + + // first is now pointing past the last deleted element, but we cannot + // use this iterator, because it may have been invalidated by the + // resize call. Instead, we can return begin() + offset. + return Container::begin() + offset; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } + + template + using require_input_iter = typename std::enable_if::iterator_category, + std::input_iterator_tag>::value>::type; + + template> + void insert(InputIt first, InputIt last) + { + for (auto it = first; it != last; ++it) + { + insert(*it); + } + } +}; + +} // namespace nlohmann + + +#if defined(JSON_HAS_CPP_17) + #include +#endif + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ + +/*! +@brief a class to store JSON values + +@internal +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + +@note ObjectType trick from https://stackoverflow.com/a/9860911 +@endinternal + +@since version 1.0.0 + +@nosubgrouping +*/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + private: + template friend struct detail::external_constructor; + friend ::nlohmann::json_pointer; + + template + friend class ::nlohmann::detail::parser; + friend ::nlohmann::detail::serializer; + template + friend class ::nlohmann::detail::iter_impl; + template + friend class ::nlohmann::detail::binary_writer; + template + friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; + friend class ::nlohmann::detail::exception; + + /// workaround type for MSVC + using basic_json_t = NLOHMANN_BASIC_JSON_TPL; + + JSON_PRIVATE_UNLESS_TESTED: + // convenience aliases for types residing in namespace detail; + using lexer = ::nlohmann::detail::lexer_base; + + template + static ::nlohmann::detail::parser parser( + InputAdapterType adapter, + detail::parser_callback_tcb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false + ) + { + return ::nlohmann::detail::parser(std::move(adapter), + std::move(cb), allow_exceptions, ignore_comments); + } + + private: + using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; + template + using internal_iterator = ::nlohmann::detail::internal_iterator; + template + using iter_impl = ::nlohmann::detail::iter_impl; + template + using iteration_proxy = ::nlohmann::detail::iteration_proxy; + template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; + + template + using output_adapter_t = ::nlohmann::detail::output_adapter_t; + + template + using binary_reader = ::nlohmann::detail::binary_reader; + template using binary_writer = ::nlohmann::detail::binary_writer; + + JSON_PRIVATE_UNLESS_TESTED: + using serializer = ::nlohmann::detail::serializer; + + public: + using value_t = detail::value_t; + /// JSON Pointer, see @ref nlohmann::json_pointer + using json_pointer = ::nlohmann::json_pointer; + template + using json_serializer = JSONSerializer; + /// how to treat decoding errors + using error_handler_t = detail::error_handler_t; + /// how to treat CBOR tags + using cbor_tag_handler_t = detail::cbor_tag_handler_t; + /// helper type for initializer lists of basic_json values + using initializer_list_t = std::initializer_list>; + + using input_format_t = detail::input_format_t; + /// SAX interface type, see @ref nlohmann::json_sax + using json_sax_t = json_sax; + + //////////////// + // exceptions // + //////////////// + + /// @name exceptions + /// Classes to implement user-defined exceptions. + /// @{ + + using exception = detail::exception; + using parse_error = detail::parse_error; + using invalid_iterator = detail::invalid_iterator; + using type_error = detail::type_error; + using out_of_range = detail::out_of_range; + using other_error = detail::other_error; + + /// @} + + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType; + + /// the type of an element pointer + using pointer = typename std::allocator_traits::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits::const_pointer; + + /// an iterator for a basic_json container + using iterator = iter_impl; + /// a const iterator for a basic_json container + using const_iterator = iter_impl; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator; + + /// @} + + + /// @brief returns the allocator associated with the container + /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ + static allocator_type get_allocator() + { + return allocator_type(); + } + + /// @brief returns version information on the library + /// @sa https://json.nlohmann.me/api/basic_json/meta/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json meta() + { + basic_json result; + + result["copyright"] = "(C) 2013-2022 Niels Lohmann"; + result["name"] = "JSON for Modern C++"; + result["url"] = "https://github.com/nlohmann/json"; + result["version"]["string"] = + std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_PATCH); + result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; + result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; + result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; + +#ifdef _WIN32 + result["platform"] = "win32"; +#elif defined __linux__ + result["platform"] = "linux"; +#elif defined __APPLE__ + result["platform"] = "apple"; +#elif defined __unix__ + result["platform"] = "unix"; +#else + result["platform"] = "unknown"; +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; +#elif defined(__clang__) + result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; +#elif defined(__GNUC__) || defined(__GNUG__) + result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; +#elif defined(__HP_cc) || defined(__HP_aCC) + result["compiler"] = "hp" +#elif defined(__IBMCPP__) + result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; +#elif defined(_MSC_VER) + result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; +#elif defined(__PGI) + result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; +#elif defined(__SUNPRO_CC) + result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; +#else + result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; +#endif + +#ifdef __cplusplus + result["compiler"]["c++"] = std::to_string(__cplusplus); +#else + result["compiler"]["c++"] = "unknown"; +#endif + return result; + } + + + /////////////////////////// + // JSON value data types // + /////////////////////////// + + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ + + /// @brief object key comparator type + /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/ +#if defined(JSON_HAS_CPP_14) + // Use transparent comparator if possible, combined with perfect forwarding + // on find() and count() calls prevents unnecessary string construction. + using object_comparator_t = std::less<>; +#else + using object_comparator_t = std::less; +#endif + + /// @brief a type for an object + /// @sa https://json.nlohmann.me/api/basic_json/object_t/ + using object_t = ObjectType>>; + + /// @brief a type for an array + /// @sa https://json.nlohmann.me/api/basic_json/array_t/ + using array_t = ArrayType>; + + /// @brief a type for a string + /// @sa https://json.nlohmann.me/api/basic_json/string_t/ + using string_t = StringType; + + /// @brief a type for a boolean + /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/ + using boolean_t = BooleanType; + + /// @brief a type for a number (integer) + /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/ + using number_integer_t = NumberIntegerType; + + /// @brief a type for a number (unsigned) + /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/ + using number_unsigned_t = NumberUnsignedType; + + /// @brief a type for a number (floating-point) + /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/ + using number_float_t = NumberFloatType; + + /// @brief a type for a packed binary type + /// @sa https://json.nlohmann.me/api/basic_json/binary_t/ + using binary_t = nlohmann::byte_container_with_subtype; + + /// @} + + private: + + /// helper for exception-safe object creation + template + JSON_HEDLEY_RETURNS_NON_NULL + static T* create(Args&& ... args) + { + AllocatorType alloc; + using AllocatorTraits = std::allocator_traits>; + + auto deleter = [&](T * obj) + { + AllocatorTraits::deallocate(alloc, obj, 1); + }; + std::unique_ptr obj(AllocatorTraits::allocate(alloc, 1), deleter); + AllocatorTraits::construct(alloc, obj.get(), std::forward(args)...); + JSON_ASSERT(obj != nullptr); + return obj.release(); + } + + //////////////////////// + // JSON value storage // + //////////////////////// + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief a JSON value + + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + binary | binary | pointer to @ref binary_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. + + @since version 1.0.0 + */ + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// binary (stored with pointer to save storage) + binary_t* binary; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) + { + case value_t::object: + { + object = create(); + break; + } + + case value_t::array: + { + array = create(); + break; + } + + case value_t::string: + { + string = create(""); + break; + } + + case value_t::binary: + { + binary = create(); + break; + } + + case value_t::boolean: + { + boolean = static_cast(false); + break; + } + + case value_t::number_integer: + { + number_integer = static_cast(0); + break; + } + + case value_t::number_unsigned: + { + number_unsigned = static_cast(0); + break; + } + + case value_t::number_float: + { + number_float = static_cast(0.0); + break; + } + + case value_t::null: + { + object = nullptr; // silence warning, see #821 + break; + } + + case value_t::discarded: + default: + { + object = nullptr; // silence warning, see #821 + if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) + { + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.10.5", basic_json())); // LCOV_EXCL_LINE + } + break; + } + } + } + + /// constructor for strings + json_value(const string_t& value) : string(create(value)) {} + + /// constructor for rvalue strings + json_value(string_t&& value) : string(create(std::move(value))) {} + + /// constructor for objects + json_value(const object_t& value) : object(create(value)) {} + + /// constructor for rvalue objects + json_value(object_t&& value) : object(create(std::move(value))) {} + + /// constructor for arrays + json_value(const array_t& value) : array(create(value)) {} + + /// constructor for rvalue arrays + json_value(array_t&& value) : array(create(std::move(value))) {} + + /// constructor for binary arrays + json_value(const typename binary_t::container_type& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays + json_value(typename binary_t::container_type&& value) : binary(create(std::move(value))) {} + + /// constructor for binary arrays (internal type) + json_value(const binary_t& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays (internal type) + json_value(binary_t&& value) : binary(create(std::move(value))) {} + + void destroy(value_t t) + { + if (t == value_t::array || t == value_t::object) + { + // flatten the current json_value to a heap-allocated stack + std::vector stack; + + // move the top-level items to stack + if (t == value_t::array) + { + stack.reserve(array->size()); + std::move(array->begin(), array->end(), std::back_inserter(stack)); + } + else + { + stack.reserve(object->size()); + for (auto&& it : *object) + { + stack.push_back(std::move(it.second)); + } + } + + while (!stack.empty()) + { + // move the last item to local variable to be processed + basic_json current_item(std::move(stack.back())); + stack.pop_back(); + + // if current_item is array/object, move + // its children to the stack to be processed later + if (current_item.is_array()) + { + std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack)); + + current_item.m_value.array->clear(); + } + else if (current_item.is_object()) + { + for (auto&& it : *current_item.m_value.object) + { + stack.push_back(std::move(it.second)); + } + + current_item.m_value.object->clear(); + } + + // it's now safe that current_item get destructed + // since it doesn't have any children + } + } + + switch (t) + { + case value_t::object: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, object); + std::allocator_traits::deallocate(alloc, object, 1); + break; + } + + case value_t::array: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, array); + std::allocator_traits::deallocate(alloc, array, 1); + break; + } + + case value_t::string: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, string); + std::allocator_traits::deallocate(alloc, string, 1); + break; + } + + case value_t::binary: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, binary); + std::allocator_traits::deallocate(alloc, binary, 1); + break; + } + + case value_t::null: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::discarded: + default: + { + break; + } + } + } + }; + + private: + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + + Furthermore, the parent relation is checked for arrays and objects: If + @a check_parents true and the value is an array or object, then the + container's elements must have the current value as parent. + + @param[in] check_parents whether the parent relation should be checked. + The value is true by default and should only be set to false + during destruction of objects when the invariant does not + need to hold. + */ + void assert_invariant(bool check_parents = true) const noexcept + { + JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr); + JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr); + JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr); + JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr); + +#if JSON_DIAGNOSTICS + JSON_TRY + { + // cppcheck-suppress assertWithSideEffect + JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j) + { + return j.m_parent == this; + })); + } + JSON_CATCH(...) {} // LCOV_EXCL_LINE +#endif + static_cast(check_parents); + } + + void set_parents() + { +#if JSON_DIAGNOSTICS + switch (m_type) + { + case value_t::array: + { + for (auto& element : *m_value.array) + { + element.m_parent = this; + } + break; + } + + case value_t::object: + { + for (auto& element : *m_value.object) + { + element.second.m_parent = this; + } + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + break; + } +#endif + } + + iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) + { +#if JSON_DIAGNOSTICS + for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) + { + (it + i)->m_parent = this; + } +#else + static_cast(count_set_parents); +#endif + return it; + } + + reference set_parent(reference j, std::size_t old_capacity = static_cast(-1)) + { +#if JSON_DIAGNOSTICS + if (old_capacity != static_cast(-1)) + { + // see https://github.com/nlohmann/json/issues/2838 + JSON_ASSERT(type() == value_t::array); + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + return j; + } + } + + // ordered_json uses a vector internally, so pointers could have + // been invalidated; see https://github.com/nlohmann/json/issues/2962 +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning(push ) +#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr +#endif + if (detail::is_ordered_map::value) + { + set_parents(); + return j; + } +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning( pop ) +#endif + + j.m_parent = this; +#else + static_cast(j); + static_cast(old_capacity); +#endif + return j; + } + + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// + + /// @brief parser event types + /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/ + using parse_event_t = detail::parse_event_t; + + /// @brief per-element parser callback type + /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/ + using parser_callback_t = detail::parser_callback_t; + + ////////////////// + // constructors // + ////////////////// + + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ + + /// @brief create an empty value with a given type + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const value_t v) + : m_type(v), m_value(v) + { + assert_invariant(); + } + + /// @brief create a null object + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(std::nullptr_t = nullptr) noexcept + : basic_json(value_t::null) + { + assert_invariant(); + } + + /// @brief create a JSON value from compatible types + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename CompatibleType, + typename U = detail::uncvref_t, + detail::enable_if_t < + !detail::is_basic_json::value && detail::is_compatible_type::value, int > = 0 > + basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape) + JSONSerializer::to_json(std::declval(), + std::forward(val)))) + { + JSONSerializer::to_json(*this, std::forward(val)); + set_parents(); + assert_invariant(); + } + + /// @brief create a JSON value from an existing one + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value&& !std::is_same::value, int > = 0 > + basic_json(const BasicJsonType& val) + { + using other_boolean_t = typename BasicJsonType::boolean_t; + using other_number_float_t = typename BasicJsonType::number_float_t; + using other_number_integer_t = typename BasicJsonType::number_integer_t; + using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using other_string_t = typename BasicJsonType::string_t; + using other_object_t = typename BasicJsonType::object_t; + using other_array_t = typename BasicJsonType::array_t; + using other_binary_t = typename BasicJsonType::binary_t; + + switch (val.type()) + { + case value_t::boolean: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_float: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_integer: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_unsigned: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::string: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::object: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::array: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::binary: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::null: + *this = nullptr; + break; + case value_t::discarded: + m_type = value_t::discarded; + break; + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + set_parents(); + assert_invariant(); + } + + /// @brief create a container (array or object) from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(initializer_list_t init, + bool type_deduction = true, + value_t manual_type = value_t::array) + { + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const detail::json_ref& element_ref) + { + return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string(); + }); + + // adjust type if type deduction is not wanted + if (!type_deduction) + { + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } + + // if object is wanted but impossible, throw an exception + if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) + { + JSON_THROW(type_error::create(301, "cannot create object from initializer list", basic_json())); + } + } + + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_type = value_t::object; + m_value = value_t::object; + + for (auto& element_ref : init) + { + auto element = element_ref.moved_or_copied(); + m_value.object->emplace( + std::move(*((*element.m_value.array)[0].m_value.string)), + std::move((*element.m_value.array)[1])); + } + } + else + { + // the initializer list describes an array -> create array + m_type = value_t::array; + m_value.array = create(init.begin(), init.end()); + } + + set_parents(); + assert_invariant(); + } + + /// @brief explicitly create a binary array (without subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = init; + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(init, subtype); + return res; + } + + /// @brief explicitly create a binary array + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = std::move(init); + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(std::move(init), subtype); + return res; + } + + /// @brief explicitly create an array from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/array/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json array(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::array); + } + + /// @brief explicitly create an object from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/object/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json object(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::object); + } + + /// @brief construct an array with count copies of given value + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create(cnt, val); + set_parents(); + assert_invariant(); + } + + /// @brief construct a JSON container given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < class InputIT, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type = 0 > + basic_json(InputIT first, InputIT last) + { + JSON_ASSERT(first.m_object != nullptr); + JSON_ASSERT(last.m_object != nullptr); + + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", basic_json())); + } + + // copy type from first iterator + m_type = first.m_object->m_type; + + // check if iterator range is complete for primitive values + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *first.m_object)); + } + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::binary: + case value_t::discarded: + default: + break; + } + + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = first.m_object->m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = first.m_object->m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value.number_float = first.m_object->m_value.number_float; + break; + } + + case value_t::boolean: + { + m_value.boolean = first.m_object->m_value.boolean; + break; + } + + case value_t::string: + { + m_value = *first.m_object->m_value.string; + break; + } + + case value_t::object: + { + m_value.object = create(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_value.array = create(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::binary: + { + m_value = *first.m_object->m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + std::string(first.m_object->type_name()), *first.m_object)); + } + + set_parents(); + assert_invariant(); + } + + + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// + + template, + std::is_same>::value, int> = 0 > + basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} + + /// @brief copy constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const basic_json& other) + : m_type(other.m_type) + { + // check of passed value is valid + other.assert_invariant(); + + switch (m_type) + { + case value_t::object: + { + m_value = *other.m_value.object; + break; + } + + case value_t::array: + { + m_value = *other.m_value.array; + break; + } + + case value_t::string: + { + m_value = *other.m_value.string; + break; + } + + case value_t::boolean: + { + m_value = other.m_value.boolean; + break; + } + + case value_t::number_integer: + { + m_value = other.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value = other.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value = other.m_value.number_float; + break; + } + + case value_t::binary: + { + m_value = *other.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + + set_parents(); + assert_invariant(); + } + + /// @brief move constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(basic_json&& other) noexcept + : m_type(std::move(other.m_type)), + m_value(std::move(other.m_value)) + { + // check that passed value is valid + other.assert_invariant(false); + + // invalidate payload + other.m_type = value_t::null; + other.m_value = {}; + + set_parents(); + assert_invariant(); + } + + /// @brief copy assignment + /// @sa https://json.nlohmann.me/api/basic_json/operator=/ + basic_json& operator=(basic_json other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_type, other.m_type); + swap(m_value, other.m_value); + + set_parents(); + assert_invariant(); + return *this; + } + + /// @brief destructor + /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/ + ~basic_json() noexcept + { + assert_invariant(false); + m_value.destroy(m_type); + } + + /// @} + + public: + /////////////////////// + // object inspection // + /////////////////////// + + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ + + /// @brief serialization + /// @sa https://json.nlohmann.me/api/basic_json/dump/ + string_t dump(const int indent = -1, + const char indent_char = ' ', + const bool ensure_ascii = false, + const error_handler_t error_handler = error_handler_t::strict) const + { + string_t result; + serializer s(detail::output_adapter(result), indent_char, error_handler); + + if (indent >= 0) + { + s.dump(*this, true, ensure_ascii, static_cast(indent)); + } + else + { + s.dump(*this, false, ensure_ascii, 0); + } + + return result; + } + + /// @brief return the type of the JSON value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/type/ + constexpr value_t type() const noexcept + { + return m_type; + } + + /// @brief return whether type is primitive + /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/ + constexpr bool is_primitive() const noexcept + { + return is_null() || is_string() || is_boolean() || is_number() || is_binary(); + } + + /// @brief return whether type is structured + /// @sa https://json.nlohmann.me/api/basic_json/is_structured/ + constexpr bool is_structured() const noexcept + { + return is_array() || is_object(); + } + + /// @brief return whether value is null + /// @sa https://json.nlohmann.me/api/basic_json/is_null/ + constexpr bool is_null() const noexcept + { + return m_type == value_t::null; + } + + /// @brief return whether value is a boolean + /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/ + constexpr bool is_boolean() const noexcept + { + return m_type == value_t::boolean; + } + + /// @brief return whether value is a number + /// @sa https://json.nlohmann.me/api/basic_json/is_number/ + constexpr bool is_number() const noexcept + { + return is_number_integer() || is_number_float(); + } + + /// @brief return whether value is an integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/ + constexpr bool is_number_integer() const noexcept + { + return m_type == value_t::number_integer || m_type == value_t::number_unsigned; + } + + /// @brief return whether value is an unsigned integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/ + constexpr bool is_number_unsigned() const noexcept + { + return m_type == value_t::number_unsigned; + } + + /// @brief return whether value is a floating-point number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/ + constexpr bool is_number_float() const noexcept + { + return m_type == value_t::number_float; + } + + /// @brief return whether value is an object + /// @sa https://json.nlohmann.me/api/basic_json/is_object/ + constexpr bool is_object() const noexcept + { + return m_type == value_t::object; + } + + /// @brief return whether value is an array + /// @sa https://json.nlohmann.me/api/basic_json/is_array/ + constexpr bool is_array() const noexcept + { + return m_type == value_t::array; + } + + /// @brief return whether value is a string + /// @sa https://json.nlohmann.me/api/basic_json/is_string/ + constexpr bool is_string() const noexcept + { + return m_type == value_t::string; + } + + /// @brief return whether value is a binary array + /// @sa https://json.nlohmann.me/api/basic_json/is_binary/ + constexpr bool is_binary() const noexcept + { + return m_type == value_t::binary; + } + + /// @brief return whether value is discarded + /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/ + constexpr bool is_discarded() const noexcept + { + return m_type == value_t::discarded; + } + + /// @brief return the type of the JSON value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/ + constexpr operator value_t() const noexcept + { + return m_type; + } + + /// @} + + private: + ////////////////// + // value access // + ////////////////// + + /// get a boolean (explicit) + boolean_t get_impl(boolean_t* /*unused*/) const + { + if (JSON_HEDLEY_LIKELY(is_boolean())) + { + return m_value.boolean; + } + + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()), *this)); + } + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t* /*unused*/) noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t* /*unused*/) noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t* /*unused*/) noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (binary) + binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /// get a pointer to the value (binary) + constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /*! + @brief helper function to implement get_ref() + + This function helps to implement get_ref() without code duplication for + const and non-const overloads + + @tparam ThisType will be deduced as `basic_json` or `const basic_json` + + @throw type_error.303 if ReferenceType does not match underlying value + type of the current JSON + */ + template + static ReferenceType get_ref_impl(ThisType& obj) + { + // delegate the call to get_ptr<>() + auto* ptr = obj.template get_ptr::type>(); + + if (JSON_HEDLEY_LIKELY(ptr != nullptr)) + { + return *ptr; + } + + JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()), obj)); + } + + public: + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template::value, int>::type = 0> + auto get_ptr() noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast(nullptr)); + } + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template < typename PointerType, typename std::enable_if < + std::is_pointer::value&& + std::is_const::type>::value, int >::type = 0 > + constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast(nullptr)); + } + + private: + /*! + @brief get a value (explicit) + + Explicit type conversion between the JSON value and a compatible value + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + ValueType ret; + JSONSerializer::from_json(*this, ret); + return ret; + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json, + - @ref json_serializer has a `from_json()` method of the form + `void from_json(const basic_json&, ValueType&)`, and + - @ref json_serializer does not have a `from_json()` method of + the form `ValueType from_json(const basic_json&)` + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,get__ValueType_const} + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::is_default_constructible::value&& + detail::has_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), std::declval()))) + { + auto ret = ValueType(); + JSONSerializer::from_json(*this, ret); + return ret; + } + + /*! + @brief get a value (explicit); special case + + Explicit type conversion between the JSON value and a compatible value + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + return JSONSerializer::from_json(*this); + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json and + - @ref json_serializer has a `from_json()` method of the form + `ValueType from_json(const basic_json&)` + + @note If @ref json_serializer has both overloads of + `from_json()`, this one is chosen. + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::has_non_default_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval()))) + { + return JSONSerializer::from_json(*this); + } + + /*! + @brief get special-case overload + + This overloads converts the current @ref basic_json in a different + @ref basic_json type + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this, converted into @a BasicJsonType + + @complexity Depending on the implementation of the called `from_json()` + method. + + @since version 3.2.0 + */ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value, + int > = 0 > + BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const + { + return *this; + } + + /*! + @brief get special-case overload + + This overloads avoids a lot of template boilerplate, it can be seen as the + identity method + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this + + @complexity Constant. + + @since version 2.1.0 + */ + template::value, + int> = 0> + basic_json get_impl(detail::priority_tag<3> /*unused*/) const + { + return *this; + } + + /*! + @brief get a pointer value (explicit) + @copydoc get() + */ + template::value, + int> = 0> + constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept + -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + public: + /*! + @brief get a (pointer) value (explicit) + + Performs explicit type conversion between the JSON value and a compatible value if required. + + - If the requested type is a pointer to the internally stored JSON value that pointer is returned. + No copies are made. + + - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible + from the current @ref basic_json. + + - Otherwise the value is converted by calling the @ref json_serializer `from_json()` + method. + + @tparam ValueTypeCV the provided value type + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @tparam ValueType if necessary + + @throw what @ref json_serializer `from_json()` method throws if conversion is required + + @since version 2.1.0 + */ + template < typename ValueTypeCV, typename ValueType = detail::uncvref_t> +#if defined(JSON_HAS_CPP_14) + constexpr +#endif + auto get() const noexcept( + noexcept(std::declval().template get_impl(detail::priority_tag<4> {}))) + -> decltype(std::declval().template get_impl(detail::priority_tag<4> {})) + { + // we cannot static_assert on ValueTypeCV being non-const, because + // there is support for get(), which is why we + // still need the uncvref + static_assert(!std::is_reference::value, + "get() cannot be used with reference types, you might want to use get_ref()"); + return get_impl(detail::priority_tag<4> {}); + } + + /*! + @brief get a pointer value (explicit) + + Explicit pointer access to the internally stored JSON value. No copies are + made. + + @warning The pointer becomes invalid if the underlying JSON object + changes. + + @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, + @ref number_unsigned_t, or @ref number_float_t. + + @return pointer to the internally stored JSON value if the requested + pointer type @a PointerType fits to the JSON value; `nullptr` otherwise + + @complexity Constant. + + @liveexample{The example below shows how pointers to internal values of a + JSON value can be requested. Note that no type conversions are made and a + `nullptr` is returned if the value and the requested pointer type does not + match.,get__PointerType} + + @sa see @ref get_ptr() for explicit pointer-member access + + @since version 1.0.0 + */ + template::value, int>::type = 0> + auto get() noexcept -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + /// @brief get a value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_to/ + template < typename ValueType, + detail::enable_if_t < + !detail::is_basic_json::value&& + detail::has_from_json::value, + int > = 0 > + ValueType & get_to(ValueType& v) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + // specialization to allow calling get_to with a basic_json value + // see https://github.com/nlohmann/json/issues/2175 + template::value, + int> = 0> + ValueType & get_to(ValueType& v) const + { + v = *this; + return v; + } + + template < + typename T, std::size_t N, + typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + detail::enable_if_t < + detail::has_from_json::value, int > = 0 > + Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + noexcept(noexcept(JSONSerializer::from_json( + std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template < typename ReferenceType, typename std::enable_if < + std::is_reference::value&& + std::is_const::type>::value, int >::type = 0 > + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /*! + @brief get a value (implicit) + + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. + + @tparam ValueType non-pointer type compatible to the JSON value, for + instance `int` for JSON integer numbers, `bool` for JSON booleans, or + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. + + @return copy of the JSON value, converted to type @a ValueType + + @throw type_error.302 in case passed type @a ValueType is incompatible + to the JSON value type (e.g., the JSON value is of type boolean, but a + string is requested); see example below + + @complexity Linear in the size of the JSON value. + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,operator__ValueType} + + @since version 1.0.0 + */ + template < typename ValueType, typename std::enable_if < + detail::conjunction < + detail::negation>, + detail::negation>>, + detail::negation>, + detail::negation>, + detail::negation>>, + +#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) + detail::negation>, +#endif + detail::is_detected_lazy + >::value, int >::type = 0 > + JSON_EXPLICIT operator ValueType() const + { + // delegate the call to get<>() const + return get(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + binary_t& get_binary() + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + const binary_t& get_binary() const + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @} + + + //////////////////// + // element access // + //////////////////// + + /// @name element access + /// Access to the JSON value. + /// @{ + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(size_type idx) + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return set_parent(m_value.array->at(idx)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(size_type idx) const + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return m_value.array->at(idx); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const typename object_t::key_type& key) + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return set_parent(m_value.object->at(key)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const typename object_t::key_type& key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return m_value.object->at(key); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](size_type idx) + { + // implicitly convert null value to an empty array + if (is_null()) + { + m_type = value_t::array; + m_value.array = create(); + assert_invariant(); + } + + // operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) + { +#if JSON_DIAGNOSTICS + // remember array size & capacity before resizing + const auto old_size = m_value.array->size(); + const auto old_capacity = m_value.array->capacity(); +#endif + m_value.array->resize(idx + 1); + +#if JSON_DIAGNOSTICS + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + } + else + { + // set parent for values added above + set_parents(begin() + static_cast(old_size), static_cast(idx + 1 - old_size)); + } +#endif + assert_invariant(); + } + + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](size_type idx) const + { + // const operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const typename object_t::key_type& key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const typename object_t::key_type& key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + reference operator[](T* key) + { + // implicitly convert null to object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + const_reference operator[](T* key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// using std::is_convertible in a std::enable_if will fail when using explicit conversions + template < class ValueType, typename std::enable_if < + detail::is_getable::value + && !std::is_same::value, int >::type = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + string_t value(const typename object_t::key_type& key, const char* default_value) const + { + return value(key, string_t(default_value)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return default_value; + } + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + JSON_HEDLEY_NON_NULL(3) + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + reference front() + { + return *begin(); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + const_reference front() const + { + return *cbegin(); + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } + + /// @brief remove element given an iterator + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType pos) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) + { + JSON_THROW(invalid_iterator::create(205, "iterator out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove elements given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType first, IteratorType last) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) + { + JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + size_type erase(const typename object_t::key_type& key) + { + // this erase only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return m_value.object->erase(key); + } + + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + /// @brief remove element from a JSON array given an index + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + void erase(const size_type idx) + { + // this erase only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + if (JSON_HEDLEY_UNLIKELY(idx >= size())) + { + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + + m_value.array->erase(m_value.array->begin() + static_cast(idx)); + } + else + { + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + } + + /// @} + + + //////////// + // lookup // + //////////// + + /// @name lookup + /// @{ + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + iterator find(KeyT&& key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + const_iterator find(KeyT&& key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + template + size_type count(KeyT&& key) const + { + // return 0 for all nonobject types + return is_object() ? m_value.object->count(std::forward(key)) : 0; + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + template < typename KeyT, typename std::enable_if < + !std::is_same::type, json_pointer>::value, int >::type = 0 > + bool contains(KeyT && key) const + { + return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object given a JSON pointer + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const json_pointer& ptr) const + { + return ptr.contains(this); + } + + /// @} + + + /////////////// + // iterators // + /////////////// + + /// @name iterators + /// @{ + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + const_iterator begin() const noexcept + { + return cbegin(); + } + + /// @brief returns a const iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/cbegin/ + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + const_iterator end() const noexcept + { + return cend(); + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/cend/ + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + const_reverse_iterator rend() const noexcept + { + return crend(); + } + + /// @brief returns a const reverse iterator to the last element + /// @sa https://json.nlohmann.me/api/basic_json/crbegin/ + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } + + /// @brief returns a const reverse iterator to one before the first + /// @sa https://json.nlohmann.me/api/basic_json/crend/ + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } + + public: + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(reference ref) noexcept + { + return ref.items(); + } + + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(const_reference ref) noexcept + { + return ref.items(); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() noexcept + { + return iteration_proxy(*this); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() const noexcept + { + return iteration_proxy(*this); + } + + /// @} + + + ////////////// + // capacity // + ////////////// + + /// @name capacity + /// @{ + + /// @brief checks whether the container is empty. + /// @sa https://json.nlohmann.me/api/basic_json/empty/ + bool empty() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return true; + } + + case value_t::array: + { + // delegate call to array_t::empty() + return m_value.array->empty(); + } + + case value_t::object: + { + // delegate call to object_t::empty() + return m_value.object->empty(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types are nonempty + return false; + } + } + } + + /// @brief returns the number of elements + /// @sa https://json.nlohmann.me/api/basic_json/size/ + size_type size() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return 0; + } + + case value_t::array: + { + // delegate call to array_t::size() + return m_value.array->size(); + } + + case value_t::object: + { + // delegate call to object_t::size() + return m_value.object->size(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have size 1 + return 1; + } + } + } + + /// @brief returns the maximum possible number of elements + /// @sa https://json.nlohmann.me/api/basic_json/max_size/ + size_type max_size() const noexcept + { + switch (m_type) + { + case value_t::array: + { + // delegate call to array_t::max_size() + return m_value.array->max_size(); + } + + case value_t::object: + { + // delegate call to object_t::max_size() + return m_value.object->max_size(); + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have max_size() == size() + return size(); + } + } + } + + /// @} + + + /////////////// + // modifiers // + /////////////// + + /// @name modifiers + /// @{ + + /// @brief clears the contents + /// @sa https://json.nlohmann.me/api/basic_json/clear/ + void clear() noexcept + { + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = 0; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = 0; + break; + } + + case value_t::number_float: + { + m_value.number_float = 0.0; + break; + } + + case value_t::boolean: + { + m_value.boolean = false; + break; + } + + case value_t::string: + { + m_value.string->clear(); + break; + } + + case value_t::binary: + { + m_value.binary->clear(); + break; + } + + case value_t::array: + { + m_value.array->clear(); + break; + } + + case value_t::object: + { + m_value.object->clear(); + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(basic_json&& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (move semantics) + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(std::move(val)); + set_parent(m_value.array->back(), old_capacity); + // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const basic_json& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(val); + set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const typename object_t::value_type& val) + { + // push_back only works for null objects or objects + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to object + auto res = m_value.object->insert(val); + set_parent(res.first->second); + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(initializer_list_t init) + { + if (is_object() && init.size() == 2 && (*init.begin())->is_string()) + { + basic_json&& key = init.begin()->moved_or_copied(); + push_back(typename object_t::value_type( + std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); + } + else + { + push_back(basic_json(init)); + } + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(initializer_list_t init) + { + push_back(init); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/ + template + reference emplace_back(Args&& ... args) + { + // emplace_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (perfect forwarding) + const auto old_capacity = m_value.array->capacity(); + m_value.array->emplace_back(std::forward(args)...); + return set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an object if key does not exist + /// @sa https://json.nlohmann.me/api/basic_json/emplace/ + template + std::pair emplace(Args&& ... args) + { + // emplace only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to array (perfect forwarding) + auto res = m_value.object->emplace(std::forward(args)...); + set_parent(res.first->second); + + // create result iterator and set iterator to the result of emplace + auto it = begin(); + it.m_it.object_iterator = res.first; + + // return pair of iterator and boolean + return {it, res.second}; + } + + /// Helper for insertion of an iterator + /// @note: This uses std::distance to support GCC 4.8, + /// see https://github.com/nlohmann/json/pull/1257 + template + iterator insert_iterator(const_iterator pos, Args&& ... args) + { + iterator result(this); + JSON_ASSERT(m_value.array != nullptr); + + auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator); + m_value.array->insert(pos.m_it.array_iterator, std::forward(args)...); + result.m_it.array_iterator = m_value.array->begin() + insert_pos; + + // This could have been written as: + // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); + // but the return value of insert is missing in GCC 4.8, so it is written this way instead. + + set_parents(); + return result; + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } + + /// @brief inserts copies of element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, cnt, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts range of elements into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const_iterator first, const_iterator last) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) + { + JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); + } + + /// @brief inserts elements from initializer list into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, initializer_list_t ilist) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, ilist.begin(), ilist.end()); + } + + /// @brief inserts range of elements into object + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + void insert(const_iterator first, const_iterator last) + { + // insert only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", *this)); + } + + m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_reference j, bool merge_objects = false) + { + update(j.begin(), j.end(), merge_objects); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_iterator first, const_iterator last, bool merge_objects = false) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(first.m_object->type_name()), *first.m_object)); + } + + for (auto it = first; it != last; ++it) + { + if (merge_objects && it.value().is_object()) + { + auto it2 = m_value.object->find(it.key()); + if (it2 != m_value.object->end()) + { + it2->second.update(it.value(), true); + continue; + } + } + m_value.object->operator[](it.key()) = it.value(); +#if JSON_DIAGNOSTICS + m_value.object->operator[](it.key()).m_parent = this; +#endif + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(reference other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + std::swap(m_type, other.m_type); + std::swap(m_value, other.m_value); + + set_parents(); + other.set_parents(); + assert_invariant(); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + friend void swap(reference left, reference right) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + left.swap(right); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(array_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + std::swap(*(m_value.array), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(object_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + std::swap(*(m_value.object), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(string_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_string())) + { + std::swap(*(m_value.string), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(binary_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @} + + public: + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// + + /// @name lexicographical comparison operators + /// @{ + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + friend bool operator==(const_reference lhs, const_reference rhs) noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + return *lhs.m_value.array == *rhs.m_value.array; + + case value_t::object: + return *lhs.m_value.object == *rhs.m_value.object; + + case value_t::null: + return true; + + case value_t::string: + return *lhs.m_value.string == *rhs.m_value.string; + + case value_t::boolean: + return lhs.m_value.boolean == rhs.m_value.boolean; + + case value_t::number_integer: + return lhs.m_value.number_integer == rhs.m_value.number_integer; + + case value_t::number_unsigned: + return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; + + case value_t::number_float: + return lhs.m_value.number_float == rhs.m_value.number_float; + + case value_t::binary: + return *lhs.m_value.binary == *rhs.m_value.binary; + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); + } + + return false; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(const_reference lhs, ScalarType rhs) noexcept + { + return lhs == basic_json(rhs); + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) == rhs; + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs == rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs != basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) != rhs; + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + friend bool operator<(const_reference lhs, const_reference rhs) noexcept + { + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + // note parentheses are necessary, see + // https://github.com/nlohmann/json/issues/1530 + return (*lhs.m_value.array) < (*rhs.m_value.array); + + case value_t::object: + return (*lhs.m_value.object) < (*rhs.m_value.object); + + case value_t::null: + return false; + + case value_t::string: + return (*lhs.m_value.string) < (*rhs.m_value.string); + + case value_t::boolean: + return (lhs.m_value.boolean) < (rhs.m_value.boolean); + + case value_t::number_integer: + return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); + + case value_t::number_unsigned: + return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); + + case value_t::number_float: + return (lhs.m_value.number_float) < (rhs.m_value.number_float); + + case value_t::binary: + return (*lhs.m_value.binary) < (*rhs.m_value.binary); + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; + } + + // We only reach this line if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + return operator<(lhs_type, rhs_type); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(const_reference lhs, ScalarType rhs) noexcept + { + return lhs < basic_json(rhs); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) < rhs; + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + return !(rhs < lhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs <= basic_json(rhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) <= rhs; + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs <= rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(const_reference lhs, ScalarType rhs) noexcept + { + return lhs > basic_json(rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) > rhs; + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs >= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) >= rhs; + } + + /// @} + + /////////////////// + // serialization // + /////////////////// + + /// @name serialization + /// @{ +#ifndef JSON_NO_IO + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = o.width() > 0; + const auto indentation = pretty_print ? o.width() : 0; + + // reset width to 0 for subsequent calls to this stream + o.width(0); + + // do the actual serialization + serializer s(detail::output_adapter(o), o.fill()); + s.dump(j, pretty_print, false, static_cast(indentation)); + return o; + } + + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + /// @deprecated This function is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator<<(std::ostream&, const basic_json&) instead; that is, + /// replace calls like `j >> o;` with `o << j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } +#endif // JSON_NO_IO + /// @} + + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /// @brief deserialize from a compatible input + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(InputType&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::forward(i)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief deserialize from a pair of character iterators + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(IteratorType first, + IteratorType last, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) + static basic_json parse(detail::span_input_adapter&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(InputType&& i, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::forward(i)), nullptr, false, ignore_comments).accept(true); + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(IteratorType first, IteratorType last, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) + static bool accept(detail::span_input_adapter&& i, + const bool ignore_comments = false) + { + return parser(i.get(), nullptr, false, ignore_comments).accept(true); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(InputType&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::forward(i)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(3) + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::move(first), std::move(last)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + /// @deprecated This function is deprecated since 3.8.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// sax_parse(ptr, ptr + len) instead. + template + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = i.get(); + return format == input_format_t::json + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } +#ifndef JSON_NO_IO + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator>>(std::istream&, basic_json&) instead; that is, + /// replace calls like `j << i;` with `i >> j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + return operator>>(i, j); + } + + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + parser(detail::input_adapter(i)).parse(false, j); + return i; + } +#endif // JSON_NO_IO + /// @} + + /////////////////////////// + // convenience functions // + /////////////////////////// + + /// @brief return the type as string + /// @sa https://json.nlohmann.me/api/basic_json/type_name/ + JSON_HEDLEY_RETURNS_NON_NULL + const char* type_name() const noexcept + { + switch (m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::binary: + return "binary"; + case value_t::discarded: + return "discarded"; + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + default: + return "number"; + } + } + + + JSON_PRIVATE_UNLESS_TESTED: + ////////////////////// + // member variables // + ////////////////////// + + /// the type of the current element + value_t m_type = value_t::null; + + /// the value of the current element + json_value m_value = {}; + +#if JSON_DIAGNOSTICS + /// a pointer to a parent value (for debugging purposes) + basic_json* m_parent = nullptr; +#endif + + ////////////////////////////////////////// + // binary serialization/deserialization // + ////////////////////////////////////////// + + /// @name binary serialization/deserialization support + /// @{ + + public: + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static std::vector to_cbor(const basic_json& j) + { + std::vector result; + to_cbor(j, result); + return result; + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static std::vector to_msgpack(const basic_json& j) + { + std::vector result; + to_msgpack(j, result); + return result; + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static std::vector to_ubjson(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector result; + to_ubjson(j, result, use_size, use_type); + return result; + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static std::vector to_bson(const basic_json& j) + { + std::vector result; + to_bson(j, result); + return result; + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); + } + + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_msgpack(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_ubjson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_bson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + /// @} + + ////////////////////////// + // JSON Pointer support // + ////////////////////////// + + /// @name JSON Pointer functions + /// @{ + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + + /// @brief return flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/flatten/ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } + + /// @brief unflatten a previously flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/unflatten/ + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } + + /// @} + + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + + /// @brief applies a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + // make a working copy to apply the patch to + basic_json result = *this; + + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string & op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.empty()) + { + result = val; + return; + } + + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) + { + result.at(top_pointer); + } + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) + { + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = json_pointer::array_index(last_path); + if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) + { + // avoid undefined behavior + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", parent)); + } + + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + break; + } + + // if there exists a parent it cannot be primitive + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + }; + + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [this, &result](json_pointer & ptr) + { + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result.at(ptr); + + // remove child + if (parent.is_object()) + { + // perform range check + auto it = parent.find(last_path); + if (JSON_HEDLEY_LIKELY(it != parent.end())) + { + parent.erase(it); + } + else + { + JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found", *this)); + } + } + else if (parent.is_array()) + { + // note erase performs range check + parent.erase(json_pointer::array_index(last_path)); + } + }; + + // type check: top level value must be an array + if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", json_patch)); + } + + // iterate and apply the operations + for (const auto& val : json_patch) + { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json & + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'", val)); + } + + // check if result is of type string + if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'", val)); + } + + // no error: return value + return it->second; + }; + + // type check: every element of the array must be an object + if (JSON_HEDLEY_UNLIKELY(!val.is_object())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", val)); + } + + // collect mandatory members + const auto op = get_value("op", "op", true).template get(); + const auto path = get_value(op, "path", true).template get(); + json_pointer ptr(path); + + switch (get_op(op)) + { + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const auto from_path = get_value("move", "from", true).template get(); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const auto from_path = get_value("copy", "from", true).template get(); + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The copy is functionally identical to an "add" + // operation at the target location using the value + // specified in the "from" member. + operation_add(ptr, v); + break; + } + + case patch_operations::test: + { + bool success = false; + JSON_TRY + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (JSON_HEDLEY_UNLIKELY(!success)) + { + JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump(), val)); + } + + break; + } + + case patch_operations::invalid: + default: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid", val)); + } + } + } + + return result; + } + + /// @brief creates a diff as a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/diff/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json diff(const basic_json& source, const basic_json& target, + const std::string& path = "") + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + return result; + } + + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + std::size_t i = 0; + while (i < source.size() && i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // We now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + const auto end_index = static_cast(result.size()); + while (i < source.size()) + { + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/-"}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.cbegin(); it != source.cend(); ++it) + { + // escape the key name to be used in a JSON patch + const auto path_key = path + "/" + detail::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path_key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, {"path", path_key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.cbegin(); it != target.cend(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto path_key = path + "/" + detail::escape(it.key()); + result.push_back( + { + {"op", "add"}, {"path", path_key}, + {"value", it.value()} + }); + } + } + + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + break; + } + } + + return result; + } + + /// @} + + //////////////////////////////// + // JSON Merge Patch functions // + //////////////////////////////// + + /// @name JSON Merge Patch functions + /// @{ + + /// @brief applies a JSON Merge Patch + /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/ + void merge_patch(const basic_json& apply_patch) + { + if (apply_patch.is_object()) + { + if (!is_object()) + { + *this = object(); + } + for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) + { + if (it.value().is_null()) + { + erase(it.key()); + } + else + { + operator[](it.key()).merge_patch(it.value()); + } + } + } + else + { + *this = apply_patch; + } + } + + /// @} +}; + +/// @brief user-defined to_string function for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/to_string/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) +{ + return j.dump(); +} + +} // namespace nlohmann + +/////////////////////// +// nonmember support // +/////////////////////// + +namespace std // NOLINT(cert-dcl58-cpp) +{ + +/// @brief hash value for JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_hash/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct hash +{ + std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const + { + return nlohmann::detail::hash(j); + } +}; + +// specialization for std::less +template<> +struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679 +{ + /*! + @brief compare two value_t enum values + @since version 3.0.0 + */ + bool operator()(nlohmann::detail::value_t lhs, + nlohmann::detail::value_t rhs) const noexcept + { + return nlohmann::detail::operator<(lhs, rhs); + } +}; + +// C++20 prohibit function specialization in the std namespace. +#ifndef JSON_HAS_CPP_20 + +/// @brief exchanges the values of two JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name) + is_nothrow_move_constructible::value&& // NOLINT(misc-redundant-expression) + is_nothrow_move_assignable::value) +{ + j1.swap(j2); +} + +#endif + +} // namespace std + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +// #include + + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_CATCH +#undef JSON_THROW +#undef JSON_TRY +#undef JSON_PRIVATE_UNLESS_TESTED +#undef JSON_HAS_CPP_11 +#undef JSON_HAS_CPP_14 +#undef JSON_HAS_CPP_17 +#undef JSON_HAS_CPP_20 +#undef JSON_HAS_FILESYSTEM +#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL + +// #include + + +#undef JSON_HEDLEY_ALWAYS_INLINE +#undef JSON_HEDLEY_ARM_VERSION +#undef JSON_HEDLEY_ARM_VERSION_CHECK +#undef JSON_HEDLEY_ARRAY_PARAM +#undef JSON_HEDLEY_ASSUME +#undef JSON_HEDLEY_BEGIN_C_DECLS +#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#undef JSON_HEDLEY_CLANG_HAS_FEATURE +#undef JSON_HEDLEY_CLANG_HAS_WARNING +#undef JSON_HEDLEY_COMPCERT_VERSION +#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#undef JSON_HEDLEY_CONCAT +#undef JSON_HEDLEY_CONCAT3 +#undef JSON_HEDLEY_CONCAT3_EX +#undef JSON_HEDLEY_CONCAT_EX +#undef JSON_HEDLEY_CONST +#undef JSON_HEDLEY_CONSTEXPR +#undef JSON_HEDLEY_CONST_CAST +#undef JSON_HEDLEY_CPP_CAST +#undef JSON_HEDLEY_CRAY_VERSION +#undef JSON_HEDLEY_CRAY_VERSION_CHECK +#undef JSON_HEDLEY_C_DECL +#undef JSON_HEDLEY_DEPRECATED +#undef JSON_HEDLEY_DEPRECATED_FOR +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#undef JSON_HEDLEY_DIAGNOSTIC_POP +#undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#undef JSON_HEDLEY_DMC_VERSION +#undef JSON_HEDLEY_DMC_VERSION_CHECK +#undef JSON_HEDLEY_EMPTY_BASES +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#undef JSON_HEDLEY_END_C_DECLS +#undef JSON_HEDLEY_FLAGS +#undef JSON_HEDLEY_FLAGS_CAST +#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_BUILTIN +#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_EXTENSION +#undef JSON_HEDLEY_GCC_HAS_FEATURE +#undef JSON_HEDLEY_GCC_HAS_WARNING +#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#undef JSON_HEDLEY_GCC_VERSION +#undef JSON_HEDLEY_GCC_VERSION_CHECK +#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#undef JSON_HEDLEY_GNUC_HAS_FEATURE +#undef JSON_HEDLEY_GNUC_HAS_WARNING +#undef JSON_HEDLEY_GNUC_VERSION +#undef JSON_HEDLEY_GNUC_VERSION_CHECK +#undef JSON_HEDLEY_HAS_ATTRIBUTE +#undef JSON_HEDLEY_HAS_BUILTIN +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_HAS_EXTENSION +#undef JSON_HEDLEY_HAS_FEATURE +#undef JSON_HEDLEY_HAS_WARNING +#undef JSON_HEDLEY_IAR_VERSION +#undef JSON_HEDLEY_IAR_VERSION_CHECK +#undef JSON_HEDLEY_IBM_VERSION +#undef JSON_HEDLEY_IBM_VERSION_CHECK +#undef JSON_HEDLEY_IMPORT +#undef JSON_HEDLEY_INLINE +#undef JSON_HEDLEY_INTEL_CL_VERSION +#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#undef JSON_HEDLEY_INTEL_VERSION +#undef JSON_HEDLEY_INTEL_VERSION_CHECK +#undef JSON_HEDLEY_IS_CONSTANT +#undef JSON_HEDLEY_IS_CONSTEXPR_ +#undef JSON_HEDLEY_LIKELY +#undef JSON_HEDLEY_MALLOC +#undef JSON_HEDLEY_MCST_LCC_VERSION +#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#undef JSON_HEDLEY_MESSAGE +#undef JSON_HEDLEY_MSVC_VERSION +#undef JSON_HEDLEY_MSVC_VERSION_CHECK +#undef JSON_HEDLEY_NEVER_INLINE +#undef JSON_HEDLEY_NON_NULL +#undef JSON_HEDLEY_NO_ESCAPE +#undef JSON_HEDLEY_NO_RETURN +#undef JSON_HEDLEY_NO_THROW +#undef JSON_HEDLEY_NULL +#undef JSON_HEDLEY_PELLES_VERSION +#undef JSON_HEDLEY_PELLES_VERSION_CHECK +#undef JSON_HEDLEY_PGI_VERSION +#undef JSON_HEDLEY_PGI_VERSION_CHECK +#undef JSON_HEDLEY_PREDICT +#undef JSON_HEDLEY_PRINTF_FORMAT +#undef JSON_HEDLEY_PRIVATE +#undef JSON_HEDLEY_PUBLIC +#undef JSON_HEDLEY_PURE +#undef JSON_HEDLEY_REINTERPRET_CAST +#undef JSON_HEDLEY_REQUIRE +#undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#undef JSON_HEDLEY_REQUIRE_MSG +#undef JSON_HEDLEY_RESTRICT +#undef JSON_HEDLEY_RETURNS_NON_NULL +#undef JSON_HEDLEY_SENTINEL +#undef JSON_HEDLEY_STATIC_ASSERT +#undef JSON_HEDLEY_STATIC_CAST +#undef JSON_HEDLEY_STRINGIFY +#undef JSON_HEDLEY_STRINGIFY_EX +#undef JSON_HEDLEY_SUNPRO_VERSION +#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#undef JSON_HEDLEY_TINYC_VERSION +#undef JSON_HEDLEY_TINYC_VERSION_CHECK +#undef JSON_HEDLEY_TI_ARMCL_VERSION +#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL2000_VERSION +#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL430_VERSION +#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL6X_VERSION +#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL7X_VERSION +#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CLPRU_VERSION +#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#undef JSON_HEDLEY_TI_VERSION +#undef JSON_HEDLEY_TI_VERSION_CHECK +#undef JSON_HEDLEY_UNAVAILABLE +#undef JSON_HEDLEY_UNLIKELY +#undef JSON_HEDLEY_UNPREDICTABLE +#undef JSON_HEDLEY_UNREACHABLE +#undef JSON_HEDLEY_UNREACHABLE_RETURN +#undef JSON_HEDLEY_VERSION +#undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#undef JSON_HEDLEY_VERSION_DECODE_MINOR +#undef JSON_HEDLEY_VERSION_DECODE_REVISION +#undef JSON_HEDLEY_VERSION_ENCODE +#undef JSON_HEDLEY_WARNING +#undef JSON_HEDLEY_WARN_UNUSED_RESULT +#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#undef JSON_HEDLEY_FALL_THROUGH + + + +#endif // INCLUDE_NLOHMANN_JSON_HPP_ diff --git a/tools/jsonproc/node.hpp b/tools/jsonproc/node.hpp new file mode 100644 index 00000000..cafd83ca --- /dev/null +++ b/tools/jsonproc/node.hpp @@ -0,0 +1,374 @@ +#ifndef INCLUDE_INJA_NODE_HPP_ +#define INCLUDE_INJA_NODE_HPP_ + +#include +#include + +#include + +#include "function_storage.hpp" +#include "string_view.hpp" + + +namespace inja { + +class NodeVisitor; +class BlockNode; +class TextNode; +class ExpressionNode; +class LiteralNode; +class JsonNode; +class FunctionNode; +class ExpressionListNode; +class StatementNode; +class ForStatementNode; +class ForArrayStatementNode; +class ForObjectStatementNode; +class IfStatementNode; +class IncludeStatementNode; +class ExtendsStatementNode; +class BlockStatementNode; +class SetStatementNode; + + +class NodeVisitor { +public: + virtual ~NodeVisitor() = default; + + virtual void visit(const BlockNode& node) = 0; + virtual void visit(const TextNode& node) = 0; + virtual void visit(const ExpressionNode& node) = 0; + virtual void visit(const LiteralNode& node) = 0; + virtual void visit(const JsonNode& node) = 0; + virtual void visit(const FunctionNode& node) = 0; + virtual void visit(const ExpressionListNode& node) = 0; + virtual void visit(const StatementNode& node) = 0; + virtual void visit(const ForStatementNode& node) = 0; + virtual void visit(const ForArrayStatementNode& node) = 0; + virtual void visit(const ForObjectStatementNode& node) = 0; + virtual void visit(const IfStatementNode& node) = 0; + virtual void visit(const IncludeStatementNode& node) = 0; + virtual void visit(const ExtendsStatementNode& node) = 0; + virtual void visit(const BlockStatementNode& node) = 0; + virtual void visit(const SetStatementNode& node) = 0; +}; + +/*! + * \brief Base node class for the abstract syntax tree (AST). + */ +class AstNode { +public: + virtual void accept(NodeVisitor& v) const = 0; + + size_t pos; + + AstNode(size_t pos) : pos(pos) { } + virtual ~AstNode() { } +}; + + +class BlockNode : public AstNode { +public: + std::vector> nodes; + + explicit BlockNode() : AstNode(0) {} + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class TextNode : public AstNode { +public: + const size_t length; + + explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class ExpressionNode : public AstNode { +public: + explicit ExpressionNode(size_t pos) : AstNode(pos) {} + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class LiteralNode : public ExpressionNode { +public: + const nlohmann::json value; + + explicit LiteralNode(const nlohmann::json& value, size_t pos) : ExpressionNode(pos), value(value) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class JsonNode : public ExpressionNode { +public: + const std::string name; + const json::json_pointer ptr; + + static std::string convert_dot_to_json_ptr(nonstd::string_view ptr_name) { + std::string result; + do { + nonstd::string_view part; + std::tie(part, ptr_name) = string_view::split(ptr_name, '.'); + result.push_back('/'); + result.append(part.begin(), part.end()); + } while (!ptr_name.empty()); + return result; + } + + explicit JsonNode(nonstd::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_json_ptr(ptr_name))) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class FunctionNode : public ExpressionNode { + using Op = FunctionStorage::Operation; + +public: + enum class Associativity { + Left, + Right, + }; + + unsigned int precedence; + Associativity associativity; + + Op operation; + + std::string name; + int number_args; // Should also be negative -> -1 for unknown number + std::vector> arguments; + CallbackFunction callback; + + explicit FunctionNode(nonstd::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { } + explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) { + switch (operation) { + case Op::Not: { + number_args = 1; + precedence = 4; + associativity = Associativity::Left; + } break; + case Op::And: { + number_args = 2; + precedence = 1; + associativity = Associativity::Left; + } break; + case Op::Or: { + number_args = 2; + precedence = 1; + associativity = Associativity::Left; + } break; + case Op::In: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::Equal: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::NotEqual: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::Greater: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::GreaterEqual: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::Less: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::LessEqual: { + number_args = 2; + precedence = 2; + associativity = Associativity::Left; + } break; + case Op::Add: { + number_args = 2; + precedence = 3; + associativity = Associativity::Left; + } break; + case Op::Subtract: { + number_args = 2; + precedence = 3; + associativity = Associativity::Left; + } break; + case Op::Multiplication: { + number_args = 2; + precedence = 4; + associativity = Associativity::Left; + } break; + case Op::Division: { + number_args = 2; + precedence = 4; + associativity = Associativity::Left; + } break; + case Op::Power: { + number_args = 2; + precedence = 5; + associativity = Associativity::Right; + } break; + case Op::Modulo: { + number_args = 2; + precedence = 4; + associativity = Associativity::Left; + } break; + case Op::AtId: { + number_args = 2; + precedence = 8; + associativity = Associativity::Left; + } break; + default: { + precedence = 1; + associativity = Associativity::Left; + } + } + } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class ExpressionListNode : public AstNode { +public: + std::shared_ptr root; + + explicit ExpressionListNode() : AstNode(0) { } + explicit ExpressionListNode(size_t pos) : AstNode(pos) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class StatementNode : public AstNode { +public: + StatementNode(size_t pos) : AstNode(pos) { } + + virtual void accept(NodeVisitor& v) const = 0; +}; + +class ForStatementNode : public StatementNode { +public: + ExpressionListNode condition; + BlockNode body; + BlockNode *const parent; + + ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { } + + virtual void accept(NodeVisitor& v) const = 0; +}; + +class ForArrayStatementNode : public ForStatementNode { +public: + const std::string value; + + explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class ForObjectStatementNode : public ForStatementNode { +public: + const std::string key; + const std::string value; + + explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class IfStatementNode : public StatementNode { +public: + ExpressionListNode condition; + BlockNode true_statement; + BlockNode false_statement; + BlockNode *const parent; + + const bool is_nested; + bool has_false_statement {false}; + + explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { } + explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class IncludeStatementNode : public StatementNode { +public: + const std::string file; + + explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +class ExtendsStatementNode : public StatementNode { +public: + const std::string file; + + explicit ExtendsStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + }; +}; + +class BlockStatementNode : public StatementNode { +public: + const std::string name; + BlockNode block; + BlockNode *const parent; + + explicit BlockStatementNode(BlockNode *const parent, const std::string& name, size_t pos) : StatementNode(pos), name(name), parent(parent) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + }; +}; + +class SetStatementNode : public StatementNode { +public: + const std::string key; + ExpressionListNode expression; + + explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { } + + void accept(NodeVisitor& v) const { + v.visit(*this); + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_NODE_HPP_ diff --git a/tools/jsonproc/parser.hpp b/tools/jsonproc/parser.hpp new file mode 100644 index 00000000..6eea8571 --- /dev/null +++ b/tools/jsonproc/parser.hpp @@ -0,0 +1,646 @@ +#ifndef INCLUDE_INJA_PARSER_HPP_ +#define INCLUDE_INJA_PARSER_HPP_ + +#include +#include +#include +#include +#include +#include + +#include "config.hpp" +#include "exceptions.hpp" +#include "function_storage.hpp" +#include "lexer.hpp" +#include "node.hpp" +#include "template.hpp" +#include "token.hpp" +#include "utils.hpp" + +#include + +namespace inja { + +/*! + * \brief Class for parsing an inja Template. + */ +class Parser { + const ParserConfig &config; + + Lexer lexer; + TemplateStorage &template_storage; + const FunctionStorage &function_storage; + + Token tok, peek_tok; + bool have_peek_tok {false}; + + size_t current_paren_level {0}; + size_t current_bracket_level {0}; + size_t current_brace_level {0}; + + nonstd::string_view json_literal_start; + + BlockNode *current_block {nullptr}; + ExpressionListNode *current_expression_list {nullptr}; + std::stack> function_stack; + std::vector> arguments; + + std::stack> operator_stack; + std::stack if_statement_stack; + std::stack for_statement_stack; + std::stack block_statement_stack; + + inline void throw_parser_error(const std::string &message) { + INJA_THROW(ParserError(message, lexer.current_position())); + } + + inline void get_next_token() { + if (have_peek_tok) { + tok = peek_tok; + have_peek_tok = false; + } else { + tok = lexer.scan(); + } + } + + inline void get_peek_token() { + if (!have_peek_tok) { + peek_tok = lexer.scan(); + have_peek_tok = true; + } + } + + inline void add_json_literal(const char* content_ptr) { + nonstd::string_view json_text(json_literal_start.data(), tok.text.data() - json_literal_start.data() + tok.text.size()); + arguments.emplace_back(std::make_shared(json::parse(json_text), json_text.data() - content_ptr)); + } + + inline void add_operator() { + auto function = operator_stack.top(); + operator_stack.pop(); + + for (int i = 0; i < function->number_args; ++i) { + function->arguments.insert(function->arguments.begin(), arguments.back()); + arguments.pop_back(); + } + arguments.emplace_back(function); + } + + void add_to_template_storage(nonstd::string_view path, std::string& template_name) { + if (config.search_included_templates_in_files && template_storage.find(template_name) == template_storage.end()) { + // Build the relative path + template_name = static_cast(path) + template_name; + if (template_name.compare(0, 2, "./") == 0) { + template_name.erase(0, 2); + } + + if (template_storage.find(template_name) == template_storage.end()) { + auto include_template = Template(load_file(template_name)); + template_storage.emplace(template_name, include_template); + parse_into_template(template_storage[template_name], template_name); + } + } + } + + bool parse_expression(Template &tmpl, Token::Kind closing) { + while (tok.kind != closing && tok.kind != Token::Kind::Eof) { + // Literals + switch (tok.kind) { + case Token::Kind::String: { + if (current_brace_level == 0 && current_bracket_level == 0) { + json_literal_start = tok.text; + add_json_literal(tmpl.content.c_str()); + } + + } break; + case Token::Kind::Number: { + if (current_brace_level == 0 && current_bracket_level == 0) { + json_literal_start = tok.text; + add_json_literal(tmpl.content.c_str()); + } + + } break; + case Token::Kind::LeftBracket: { + if (current_brace_level == 0 && current_bracket_level == 0) { + json_literal_start = tok.text; + } + current_bracket_level += 1; + + } break; + case Token::Kind::LeftBrace: { + if (current_brace_level == 0 && current_bracket_level == 0) { + json_literal_start = tok.text; + } + current_brace_level += 1; + + } break; + case Token::Kind::RightBracket: { + if (current_bracket_level == 0) { + throw_parser_error("unexpected ']'"); + } + + current_bracket_level -= 1; + if (current_brace_level == 0 && current_bracket_level == 0) { + add_json_literal(tmpl.content.c_str()); + } + + } break; + case Token::Kind::RightBrace: { + if (current_brace_level == 0) { + throw_parser_error("unexpected '}'"); + } + + current_brace_level -= 1; + if (current_brace_level == 0 && current_bracket_level == 0) { + add_json_literal(tmpl.content.c_str()); + } + + } break; + case Token::Kind::Id: { + get_peek_token(); + + // Json Literal + if (tok.text == static_cast("true") || tok.text == static_cast("false") || tok.text == static_cast("null")) { + if (current_brace_level == 0 && current_bracket_level == 0) { + json_literal_start = tok.text; + add_json_literal(tmpl.content.c_str()); + } + + // Operator + } else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") { + goto parse_operator; + + // Functions + } else if (peek_tok.kind == Token::Kind::LeftParen) { + operator_stack.emplace(std::make_shared(static_cast(tok.text), tok.text.data() - tmpl.content.c_str())); + function_stack.emplace(operator_stack.top().get(), current_paren_level); + + // Variables + } else { + arguments.emplace_back(std::make_shared(static_cast(tok.text), tok.text.data() - tmpl.content.c_str())); + } + + // Operators + } break; + case Token::Kind::Equal: + case Token::Kind::NotEqual: + case Token::Kind::GreaterThan: + case Token::Kind::GreaterEqual: + case Token::Kind::LessThan: + case Token::Kind::LessEqual: + case Token::Kind::Plus: + case Token::Kind::Minus: + case Token::Kind::Times: + case Token::Kind::Slash: + case Token::Kind::Power: + case Token::Kind::Percent: + case Token::Kind::Dot: { + + parse_operator: + FunctionStorage::Operation operation; + switch (tok.kind) { + case Token::Kind::Id: { + if (tok.text == "and") { + operation = FunctionStorage::Operation::And; + } else if (tok.text == "or") { + operation = FunctionStorage::Operation::Or; + } else if (tok.text == "in") { + operation = FunctionStorage::Operation::In; + } else if (tok.text == "not") { + operation = FunctionStorage::Operation::Not; + } else { + throw_parser_error("unknown operator in parser."); + } + } break; + case Token::Kind::Equal: { + operation = FunctionStorage::Operation::Equal; + } break; + case Token::Kind::NotEqual: { + operation = FunctionStorage::Operation::NotEqual; + } break; + case Token::Kind::GreaterThan: { + operation = FunctionStorage::Operation::Greater; + } break; + case Token::Kind::GreaterEqual: { + operation = FunctionStorage::Operation::GreaterEqual; + } break; + case Token::Kind::LessThan: { + operation = FunctionStorage::Operation::Less; + } break; + case Token::Kind::LessEqual: { + operation = FunctionStorage::Operation::LessEqual; + } break; + case Token::Kind::Plus: { + operation = FunctionStorage::Operation::Add; + } break; + case Token::Kind::Minus: { + operation = FunctionStorage::Operation::Subtract; + } break; + case Token::Kind::Times: { + operation = FunctionStorage::Operation::Multiplication; + } break; + case Token::Kind::Slash: { + operation = FunctionStorage::Operation::Division; + } break; + case Token::Kind::Power: { + operation = FunctionStorage::Operation::Power; + } break; + case Token::Kind::Percent: { + operation = FunctionStorage::Operation::Modulo; + } break; + case Token::Kind::Dot: { + operation = FunctionStorage::Operation::AtId; + } break; + default: { + throw_parser_error("unknown operator in parser."); + } + } + auto function_node = std::make_shared(operation, tok.text.data() - tmpl.content.c_str()); + + while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) { + add_operator(); + } + + operator_stack.emplace(function_node); + + } break; + case Token::Kind::Comma: { + if (current_brace_level == 0 && current_bracket_level == 0) { + if (function_stack.empty()) { + throw_parser_error("unexpected ','"); + } + + function_stack.top().first->number_args += 1; + } + + } break; + case Token::Kind::Colon: { + if (current_brace_level == 0 && current_bracket_level == 0) { + throw_parser_error("unexpected ':'"); + } + + } break; + case Token::Kind::LeftParen: { + current_paren_level += 1; + operator_stack.emplace(std::make_shared(FunctionStorage::Operation::ParenLeft, tok.text.data() - tmpl.content.c_str())); + + get_peek_token(); + if (peek_tok.kind == Token::Kind::RightParen) { + if (!function_stack.empty() && function_stack.top().second == current_paren_level - 1) { + function_stack.top().first->number_args = 0; + } + } + + } break; + case Token::Kind::RightParen: { + current_paren_level -= 1; + while (!operator_stack.empty() && operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft) { + add_operator(); + } + + if (!operator_stack.empty() && operator_stack.top()->operation == FunctionStorage::Operation::ParenLeft) { + operator_stack.pop(); + } + + if (!function_stack.empty() && function_stack.top().second == current_paren_level) { + auto func = function_stack.top().first; + auto function_data = function_storage.find_function(func->name, func->number_args); + if (function_data.operation == FunctionStorage::Operation::None) { + throw_parser_error("unknown function " + func->name); + } + func->operation = function_data.operation; + if (function_data.operation == FunctionStorage::Operation::Callback) { + func->callback = function_data.callback; + } + + if (operator_stack.empty()) { + throw_parser_error("internal error at function " + func->name); + } + + add_operator(); + function_stack.pop(); + } + } + default: + break; + } + + get_next_token(); + } + + while (!operator_stack.empty()) { + add_operator(); + } + + if (arguments.size() == 1) { + current_expression_list->root = arguments[0]; + arguments = {}; + + } else if (arguments.size() > 1) { + throw_parser_error("malformed expression"); + } + + return true; + } + + bool parse_statement(Template &tmpl, Token::Kind closing, nonstd::string_view path) { + if (tok.kind != Token::Kind::Id) { + return false; + } + + if (tok.text == static_cast("if")) { + get_next_token(); + + auto if_statement_node = std::make_shared(current_block, tok.text.data() - tmpl.content.c_str()); + current_block->nodes.emplace_back(if_statement_node); + if_statement_stack.emplace(if_statement_node.get()); + current_block = &if_statement_node->true_statement; + current_expression_list = &if_statement_node->condition; + + if (!parse_expression(tmpl, closing)) { + return false; + } + + } else if (tok.text == static_cast("else")) { + if (if_statement_stack.empty()) { + throw_parser_error("else without matching if"); + } + auto &if_statement_data = if_statement_stack.top(); + get_next_token(); + + if_statement_data->has_false_statement = true; + current_block = &if_statement_data->false_statement; + + // Chained else if + if (tok.kind == Token::Kind::Id && tok.text == static_cast("if")) { + get_next_token(); + + auto if_statement_node = std::make_shared(true, current_block, tok.text.data() - tmpl.content.c_str()); + current_block->nodes.emplace_back(if_statement_node); + if_statement_stack.emplace(if_statement_node.get()); + current_block = &if_statement_node->true_statement; + current_expression_list = &if_statement_node->condition; + + if (!parse_expression(tmpl, closing)) { + return false; + } + } + + } else if (tok.text == static_cast("endif")) { + if (if_statement_stack.empty()) { + throw_parser_error("endif without matching if"); + } + + // Nested if statements + while (if_statement_stack.top()->is_nested) { + if_statement_stack.pop(); + } + + auto &if_statement_data = if_statement_stack.top(); + get_next_token(); + + current_block = if_statement_data->parent; + if_statement_stack.pop(); + + } else if (tok.text == static_cast("block")) { + get_next_token(); + + if (tok.kind != Token::Kind::Id) { + throw_parser_error("expected block name, got '" + tok.describe() + "'"); + } + + const std::string block_name = static_cast(tok.text); + + auto block_statement_node = std::make_shared(current_block, block_name, tok.text.data() - tmpl.content.c_str()); + current_block->nodes.emplace_back(block_statement_node); + block_statement_stack.emplace(block_statement_node.get()); + current_block = &block_statement_node->block; + auto success = tmpl.block_storage.emplace(block_name, block_statement_node); + if (!success.second) { + throw_parser_error("block with the name '" + block_name + "' does already exist"); + } + + get_next_token(); + + } else if (tok.text == static_cast("endblock")) { + if (block_statement_stack.empty()) { + throw_parser_error("endblock without matching block"); + } + + auto &block_statement_data = block_statement_stack.top(); + get_next_token(); + + current_block = block_statement_data->parent; + block_statement_stack.pop(); + + } else if (tok.text == static_cast("for")) { + get_next_token(); + + // options: for a in arr; for a, b in obj + if (tok.kind != Token::Kind::Id) { + throw_parser_error("expected id, got '" + tok.describe() + "'"); + } + + Token value_token = tok; + get_next_token(); + + // Object type + std::shared_ptr for_statement_node; + if (tok.kind == Token::Kind::Comma) { + get_next_token(); + if (tok.kind != Token::Kind::Id) { + throw_parser_error("expected id, got '" + tok.describe() + "'"); + } + + Token key_token = std::move(value_token); + value_token = tok; + get_next_token(); + + for_statement_node = std::make_shared(static_cast(key_token.text), static_cast(value_token.text), current_block, tok.text.data() - tmpl.content.c_str()); + + // Array type + } else { + for_statement_node = std::make_shared(static_cast(value_token.text), current_block, tok.text.data() - tmpl.content.c_str()); + } + + current_block->nodes.emplace_back(for_statement_node); + for_statement_stack.emplace(for_statement_node.get()); + current_block = &for_statement_node->body; + current_expression_list = &for_statement_node->condition; + + if (tok.kind != Token::Kind::Id || tok.text != static_cast("in")) { + throw_parser_error("expected 'in', got '" + tok.describe() + "'"); + } + get_next_token(); + + if (!parse_expression(tmpl, closing)) { + return false; + } + + } else if (tok.text == static_cast("endfor")) { + if (for_statement_stack.empty()) { + throw_parser_error("endfor without matching for"); + } + + auto &for_statement_data = for_statement_stack.top(); + get_next_token(); + + current_block = for_statement_data->parent; + for_statement_stack.pop(); + + } else if (tok.text == static_cast("include")) { + get_next_token(); + + if (tok.kind != Token::Kind::String) { + throw_parser_error("expected string, got '" + tok.describe() + "'"); + } + + std::string template_name = json::parse(tok.text).get_ref(); + add_to_template_storage(path, template_name); + + current_block->nodes.emplace_back(std::make_shared(template_name, tok.text.data() - tmpl.content.c_str())); + + get_next_token(); + + } else if (tok.text == static_cast("extends")) { + get_next_token(); + + if (tok.kind != Token::Kind::String) { + throw_parser_error("expected string, got '" + tok.describe() + "'"); + } + + std::string template_name = json::parse(tok.text).get_ref(); + add_to_template_storage(path, template_name); + + current_block->nodes.emplace_back(std::make_shared(template_name, tok.text.data() - tmpl.content.c_str())); + + get_next_token(); + + } else if (tok.text == static_cast("set")) { + get_next_token(); + + if (tok.kind != Token::Kind::Id) { + throw_parser_error("expected variable name, got '" + tok.describe() + "'"); + } + + std::string key = static_cast(tok.text); + get_next_token(); + + auto set_statement_node = std::make_shared(key, tok.text.data() - tmpl.content.c_str()); + current_block->nodes.emplace_back(set_statement_node); + current_expression_list = &set_statement_node->expression; + + if (tok.text != static_cast("=")) { + throw_parser_error("expected '=', got '" + tok.describe() + "'"); + } + get_next_token(); + + if (!parse_expression(tmpl, closing)) { + return false; + } + + } else { + return false; + } + return true; + } + + void parse_into(Template &tmpl, nonstd::string_view path) { + lexer.start(tmpl.content); + current_block = &tmpl.root; + + for (;;) { + get_next_token(); + switch (tok.kind) { + case Token::Kind::Eof: { + if (!if_statement_stack.empty()) { + throw_parser_error("unmatched if"); + } + if (!for_statement_stack.empty()) { + throw_parser_error("unmatched for"); + } + } return; + case Token::Kind::Text: { + current_block->nodes.emplace_back(std::make_shared(tok.text.data() - tmpl.content.c_str(), tok.text.size())); + } break; + case Token::Kind::StatementOpen: { + get_next_token(); + if (!parse_statement(tmpl, Token::Kind::StatementClose, path)) { + throw_parser_error("expected statement, got '" + tok.describe() + "'"); + } + if (tok.kind != Token::Kind::StatementClose) { + throw_parser_error("expected statement close, got '" + tok.describe() + "'"); + } + } break; + case Token::Kind::LineStatementOpen: { + get_next_token(); + if (!parse_statement(tmpl, Token::Kind::LineStatementClose, path)) { + throw_parser_error("expected statement, got '" + tok.describe() + "'"); + } + if (tok.kind != Token::Kind::LineStatementClose && tok.kind != Token::Kind::Eof) { + throw_parser_error("expected line statement close, got '" + tok.describe() + "'"); + } + } break; + case Token::Kind::ExpressionOpen: { + get_next_token(); + + auto expression_list_node = std::make_shared(tok.text.data() - tmpl.content.c_str()); + current_block->nodes.emplace_back(expression_list_node); + current_expression_list = expression_list_node.get(); + + if (!parse_expression(tmpl, Token::Kind::ExpressionClose)) { + throw_parser_error("expected expression, got '" + tok.describe() + "'"); + } + + if (tok.kind != Token::Kind::ExpressionClose) { + throw_parser_error("expected expression close, got '" + tok.describe() + "'"); + } + } break; + case Token::Kind::CommentOpen: { + get_next_token(); + if (tok.kind != Token::Kind::CommentClose) { + throw_parser_error("expected comment close, got '" + tok.describe() + "'"); + } + } break; + default: { + throw_parser_error("unexpected token '" + tok.describe() + "'"); + } break; + } + } + } + + +public: + explicit Parser(const ParserConfig &parser_config, const LexerConfig &lexer_config, + TemplateStorage &template_storage, const FunctionStorage &function_storage) + : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { } + + Template parse(nonstd::string_view input, nonstd::string_view path) { + auto result = Template(static_cast(input)); + parse_into(result, path); + return result; + } + + Template parse(nonstd::string_view input) { + return parse(input, "./"); + } + + void parse_into_template(Template& tmpl, nonstd::string_view filename) { + nonstd::string_view path = filename.substr(0, filename.find_last_of("/\\") + 1); + + // StringRef path = sys::path::parent_path(filename); + auto sub_parser = Parser(config, lexer.get_config(), template_storage, function_storage); + sub_parser.parse_into(tmpl, path); + } + + std::string load_file(nonstd::string_view filename) { + std::ifstream file; + open_file_or_throw(static_cast(filename), file); + std::string text((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + return text; + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_PARSER_HPP_ diff --git a/tools/jsonproc/renderer.hpp b/tools/jsonproc/renderer.hpp new file mode 100644 index 00000000..54e73225 --- /dev/null +++ b/tools/jsonproc/renderer.hpp @@ -0,0 +1,717 @@ +#ifndef INCLUDE_INJA_RENDERER_HPP_ +#define INCLUDE_INJA_RENDERER_HPP_ + +#include +#include +#include +#include +#include + +#include + +#include "config.hpp" +#include "exceptions.hpp" +#include "node.hpp" +#include "template.hpp" +#include "utils.hpp" + +namespace inja { + +/*! + * \brief Class for rendering a Template with data. + */ +class Renderer : public NodeVisitor { + using Op = FunctionStorage::Operation; + + const RenderConfig config; + const TemplateStorage &template_storage; + const FunctionStorage &function_storage; + + const Template *current_template; + size_t current_level {0}; + std::vector template_stack; + std::vector block_statement_stack; + + const json *json_input; + std::ostream *output_stream; + + json json_additional_data; + json* current_loop_data = &json_additional_data["loop"]; + + std::vector> json_tmp_stack; + std::stack json_eval_stack; + std::stack not_found_stack; + + bool break_rendering {false}; + + bool truthy(const json* data) const { + if (data->is_boolean()) { + return data->get(); + } else if (data->is_number()) { + return (*data != 0); + } else if (data->is_null()) { + return false; + } + return !data->empty(); + } + + void print_json(const std::shared_ptr value) { + if (value->is_string()) { + *output_stream << value->get_ref(); + } else if (value->is_number_integer()) { + *output_stream << value->get(); + } else if (value->is_null()) { + } else { + *output_stream << value->dump(); + } + } + + const std::shared_ptr eval_expression_list(const ExpressionListNode& expression_list) { + if (!expression_list.root) { + throw_renderer_error("empty expression", expression_list); + } + + expression_list.root->accept(*this); + + if (json_eval_stack.empty()) { + throw_renderer_error("empty expression", expression_list); + } else if (json_eval_stack.size() != 1) { + throw_renderer_error("malformed expression", expression_list); + } + + const auto result = json_eval_stack.top(); + json_eval_stack.pop(); + + if (!result) { + if (not_found_stack.empty()) { + throw_renderer_error("expression could not be evaluated", expression_list); + } + + auto node = not_found_stack.top(); + not_found_stack.pop(); + + throw_renderer_error("variable '" + static_cast(node->name) + "' not found", *node); + } + return std::make_shared(*result); + } + + void throw_renderer_error(const std::string &message, const AstNode& node) { + SourceLocation loc = get_source_location(current_template->content, node.pos); + INJA_THROW(RenderError(message, loc)); + } + + template + std::array get_arguments(const FunctionNode& node) { + if (node.arguments.size() < N_start + N) { + throw_renderer_error("function needs " + std::to_string(N_start + N) + " variables, but has only found " + std::to_string(node.arguments.size()), node); + } + + for (size_t i = N_start; i < N_start + N; i += 1) { + node.arguments[i]->accept(*this); + } + + if (json_eval_stack.size() < N) { + throw_renderer_error("function needs " + std::to_string(N) + " variables, but has only found " + std::to_string(json_eval_stack.size()), node); + } + + std::array result; + for (size_t i = 0; i < N; i += 1) { + result[N - i - 1] = json_eval_stack.top(); + json_eval_stack.pop(); + + if (!result[N - i - 1]) { + const auto json_node = not_found_stack.top(); + not_found_stack.pop(); + + if (throw_not_found) { + throw_renderer_error("variable '" + static_cast(json_node->name) + "' not found", *json_node); + } + } + } + return result; + } + + template + Arguments get_argument_vector(const FunctionNode& node) { + const size_t N = node.arguments.size(); + for (auto a: node.arguments) { + a->accept(*this); + } + + if (json_eval_stack.size() < N) { + throw_renderer_error("function needs " + std::to_string(N) + " variables, but has only found " + std::to_string(json_eval_stack.size()), node); + } + + Arguments result {N}; + for (size_t i = 0; i < N; i += 1) { + result[N - i - 1] = json_eval_stack.top(); + json_eval_stack.pop(); + + if (!result[N - i - 1]) { + const auto json_node = not_found_stack.top(); + not_found_stack.pop(); + + if (throw_not_found) { + throw_renderer_error("variable '" + static_cast(json_node->name) + "' not found", *json_node); + } + } + } + return result; + } + + void visit(const BlockNode& node) { + for (auto& n : node.nodes) { + n->accept(*this); + + if (break_rendering) { + break; + } + } + } + + void visit(const TextNode& node) { + output_stream->write(current_template->content.c_str() + node.pos, node.length); + } + + void visit(const ExpressionNode&) { } + + void visit(const LiteralNode& node) { + json_eval_stack.push(&node.value); + } + + void visit(const JsonNode& node) { + if (json_additional_data.contains(node.ptr)) { + json_eval_stack.push(&(json_additional_data[node.ptr])); + + } else if (json_input->contains(node.ptr)) { + json_eval_stack.push(&(*json_input)[node.ptr]); + + } else { + // Try to evaluate as a no-argument callback + const auto function_data = function_storage.find_function(node.name, 0); + if (function_data.operation == FunctionStorage::Operation::Callback) { + Arguments empty_args {}; + const auto value = std::make_shared(function_data.callback(empty_args)); + json_tmp_stack.push_back(value); + json_eval_stack.push(value.get()); + + } else { + json_eval_stack.push(nullptr); + not_found_stack.emplace(&node); + } + } + } + + void visit(const FunctionNode& node) { + std::shared_ptr result_ptr; + + switch (node.operation) { + case Op::Not: { + const auto args = get_arguments<1>(node); + result_ptr = std::make_shared(!truthy(args[0])); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::And: { + result_ptr = std::make_shared(truthy(get_arguments<1, 0>(node)[0]) && truthy(get_arguments<1, 1>(node)[0])); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Or: { + result_ptr = std::make_shared(truthy(get_arguments<1, 0>(node)[0]) || truthy(get_arguments<1, 1>(node)[0])); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::In: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(std::find(args[1]->begin(), args[1]->end(), *args[0]) != args[1]->end()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Equal: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] == *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::NotEqual: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] != *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Greater: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] > *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::GreaterEqual: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] >= *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Less: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] < *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::LessEqual: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(*args[0] <= *args[1]); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Add: { + const auto args = get_arguments<2>(node); + if (args[0]->is_string() && args[1]->is_string()) { + result_ptr = std::make_shared(args[0]->get_ref() + args[1]->get_ref()); + json_tmp_stack.push_back(result_ptr); + } else if (args[0]->is_number_integer() && args[1]->is_number_integer()) { + result_ptr = std::make_shared(args[0]->get() + args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } else { + result_ptr = std::make_shared(args[0]->get() + args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Subtract: { + const auto args = get_arguments<2>(node); + if (args[0]->is_number_integer() && args[1]->is_number_integer()) { + result_ptr = std::make_shared(args[0]->get() - args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } else { + result_ptr = std::make_shared(args[0]->get() - args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Multiplication: { + const auto args = get_arguments<2>(node); + if (args[0]->is_number_integer() && args[1]->is_number_integer()) { + result_ptr = std::make_shared(args[0]->get() * args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } else { + result_ptr = std::make_shared(args[0]->get() * args[1]->get()); + json_tmp_stack.push_back(result_ptr); + } + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Division: { + const auto args = get_arguments<2>(node); + if (args[1]->get() == 0) { + throw_renderer_error("division by zero", node); + } + result_ptr = std::make_shared(args[0]->get() / args[1]->get()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Power: { + const auto args = get_arguments<2>(node); + if (args[0]->is_number_integer() && args[1]->get() >= 0) { + int result = static_cast(std::pow(args[0]->get(), args[1]->get())); + result_ptr = std::make_shared(std::move(result)); + json_tmp_stack.push_back(result_ptr); + } else { + double result = std::pow(args[0]->get(), args[1]->get()); + result_ptr = std::make_shared(std::move(result)); + json_tmp_stack.push_back(result_ptr); + } + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Modulo: { + const auto args = get_arguments<2>(node); + result_ptr = std::make_shared(args[0]->get() % args[1]->get()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::AtId: { + const auto container = get_arguments<1, 0, false>(node)[0]; + node.arguments[1]->accept(*this); + if (not_found_stack.empty()) { + throw_renderer_error("could not find element with given name", node); + } + const auto id_node = not_found_stack.top(); + not_found_stack.pop(); + json_eval_stack.pop(); + json_eval_stack.push(&container->at(id_node->name)); + } break; + case Op::At: { + const auto args = get_arguments<2>(node); + if (args[0]->is_object()) { + json_eval_stack.push(&args[0]->at(args[1]->get())); + } else { + json_eval_stack.push(&args[0]->at(args[1]->get())); + } + } break; + case Op::Default: { + const auto test_arg = get_arguments<1, 0, false>(node)[0]; + json_eval_stack.push(test_arg ? test_arg : get_arguments<1, 1>(node)[0]); + } break; + case Op::DivisibleBy: { + const auto args = get_arguments<2>(node); + const int divisor = args[1]->get(); + result_ptr = std::make_shared((divisor != 0) && (args[0]->get() % divisor == 0)); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Even: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->get() % 2 == 0); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Exists: { + auto &&name = get_arguments<1>(node)[0]->get_ref(); + result_ptr = std::make_shared(json_input->contains(json::json_pointer(JsonNode::convert_dot_to_json_ptr(name)))); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::ExistsInObject: { + const auto args = get_arguments<2>(node); + auto &&name = args[1]->get_ref(); + result_ptr = std::make_shared(args[0]->find(name) != args[0]->end()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::First: { + const auto result = &get_arguments<1>(node)[0]->front(); + json_eval_stack.push(result); + } break; + case Op::Float: { + result_ptr = std::make_shared(std::stod(get_arguments<1>(node)[0]->get_ref())); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Int: { + result_ptr = std::make_shared(std::stoi(get_arguments<1>(node)[0]->get_ref())); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Last: { + const auto result = &get_arguments<1>(node)[0]->back(); + json_eval_stack.push(result); + } break; + case Op::Length: { + const auto val = get_arguments<1>(node)[0]; + if (val->is_string()) { + result_ptr = std::make_shared(val->get_ref().length()); + } else { + result_ptr = std::make_shared(val->size()); + } + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Lower: { + std::string result = get_arguments<1>(node)[0]->get(); + std::transform(result.begin(), result.end(), result.begin(), ::tolower); + result_ptr = std::make_shared(std::move(result)); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Max: { + const auto args = get_arguments<1>(node); + const auto result = std::max_element(args[0]->begin(), args[0]->end()); + json_eval_stack.push(&(*result)); + } break; + case Op::Min: { + const auto args = get_arguments<1>(node); + const auto result = std::min_element(args[0]->begin(), args[0]->end()); + json_eval_stack.push(&(*result)); + } break; + case Op::Odd: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->get() % 2 != 0); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Range: { + std::vector result(get_arguments<1>(node)[0]->get()); + std::iota(result.begin(), result.end(), 0); + result_ptr = std::make_shared(std::move(result)); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Round: { + const auto args = get_arguments<2>(node); + const int precision = args[1]->get(); + const double result = std::round(args[0]->get() * std::pow(10.0, precision)) / std::pow(10.0, precision); + if(0==precision){ + result_ptr = std::make_shared(int(result)); + }else{ + result_ptr = std::make_shared(std::move(result)); + } + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Sort: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->get>()); + std::sort(result_ptr->begin(), result_ptr->end()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Upper: { + std::string result = get_arguments<1>(node)[0]->get(); + std::transform(result.begin(), result.end(), result.begin(), ::toupper); + result_ptr = std::make_shared(std::move(result)); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsBoolean: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_boolean()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsNumber: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_number()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsInteger: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_number_integer()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsFloat: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_number_float()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsObject: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_object()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsArray: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_array()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::IsString: { + result_ptr = std::make_shared(get_arguments<1>(node)[0]->is_string()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Callback: { + auto args = get_argument_vector(node); + result_ptr = std::make_shared(node.callback(args)); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Super: { + const auto args = get_argument_vector(node); + const size_t old_level = current_level; + const size_t level_diff = (args.size() == 1) ? args[0]->get() : 1; + const size_t level = current_level + level_diff; + + if (block_statement_stack.empty()) { + throw_renderer_error("super() call is not within a block", node); + } + + if (level < 1 || level > template_stack.size() - 1) { + throw_renderer_error("level of super() call does not match parent templates (between 1 and " + std::to_string(template_stack.size() - 1) + ")", node); + } + + const auto current_block_statement = block_statement_stack.back(); + const Template *new_template = template_stack.at(level); + const Template *old_template = current_template; + const auto block_it = new_template->block_storage.find(current_block_statement->name); + if (block_it != new_template->block_storage.end()) { + current_template = new_template; + current_level = level; + block_it->second->block.accept(*this); + current_level = old_level; + current_template = old_template; + } else { + throw_renderer_error("could not find block with name '" + current_block_statement->name + "'", node); + } + result_ptr = std::make_shared(nullptr); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::Join: { + const auto args = get_arguments<2>(node); + const auto separator = args[1]->get(); + std::ostringstream os; + std::string sep; + for (const auto& value : *args[0]) { + os << sep; + if (value.is_string()) { + os << value.get(); // otherwise the value is surrounded with "" + } else { + os << value; + } + sep = separator; + } + result_ptr = std::make_shared(os.str()); + json_tmp_stack.push_back(result_ptr); + json_eval_stack.push(result_ptr.get()); + } break; + case Op::ParenLeft: + case Op::ParenRight: + case Op::None: + break; + } + } + + void visit(const ExpressionListNode& node) { + print_json(eval_expression_list(node)); + } + + void visit(const StatementNode&) { } + + void visit(const ForStatementNode&) { } + + void visit(const ForArrayStatementNode& node) { + const auto result = eval_expression_list(node.condition); + if (!result->is_array()) { + throw_renderer_error("object must be an array", node); + } + + if (!current_loop_data->empty()) { + auto tmp = *current_loop_data; // Because of clang-3 + (*current_loop_data)["parent"] = std::move(tmp); + } + + size_t index = 0; + (*current_loop_data)["is_first"] = true; + (*current_loop_data)["is_last"] = (result->size() <= 1); + for (auto it = result->begin(); it != result->end(); ++it) { + json_additional_data[static_cast(node.value)] = *it; + + (*current_loop_data)["index"] = index; + (*current_loop_data)["index1"] = index + 1; + if (index == 1) { + (*current_loop_data)["is_first"] = false; + } + if (index == result->size() - 1) { + (*current_loop_data)["is_last"] = true; + } + + node.body.accept(*this); + ++index; + } + + json_additional_data[static_cast(node.value)].clear(); + if (!(*current_loop_data)["parent"].empty()) { + const auto tmp = (*current_loop_data)["parent"]; + *current_loop_data = std::move(tmp); + } else { + current_loop_data = &json_additional_data["loop"]; + } + } + + void visit(const ForObjectStatementNode& node) { + const auto result = eval_expression_list(node.condition); + if (!result->is_object()) { + throw_renderer_error("object must be an object", node); + } + + if (!current_loop_data->empty()) { + (*current_loop_data)["parent"] = std::move(*current_loop_data); + } + + size_t index = 0; + (*current_loop_data)["is_first"] = true; + (*current_loop_data)["is_last"] = (result->size() <= 1); + for (auto it = result->begin(); it != result->end(); ++it) { + json_additional_data[static_cast(node.key)] = it.key(); + json_additional_data[static_cast(node.value)] = it.value(); + + (*current_loop_data)["index"] = index; + (*current_loop_data)["index1"] = index + 1; + if (index == 1) { + (*current_loop_data)["is_first"] = false; + } + if (index == result->size() - 1) { + (*current_loop_data)["is_last"] = true; + } + + node.body.accept(*this); + ++index; + } + + json_additional_data[static_cast(node.key)].clear(); + json_additional_data[static_cast(node.value)].clear(); + if (!(*current_loop_data)["parent"].empty()) { + *current_loop_data = std::move((*current_loop_data)["parent"]); + } else { + current_loop_data = &json_additional_data["loop"]; + } + } + + void visit(const IfStatementNode& node) { + const auto result = eval_expression_list(node.condition); + if (truthy(result.get())) { + node.true_statement.accept(*this); + } else if (node.has_false_statement) { + node.false_statement.accept(*this); + } + } + + void visit(const IncludeStatementNode& node) { + auto sub_renderer = Renderer(config, template_storage, function_storage); + const auto included_template_it = template_storage.find(node.file); + if (included_template_it != template_storage.end()) { + sub_renderer.render_to(*output_stream, included_template_it->second, *json_input, &json_additional_data); + } else if (config.throw_at_missing_includes) { + throw_renderer_error("include '" + node.file + "' not found", node); + } + } + + void visit(const ExtendsStatementNode& node) { + const auto included_template_it = template_storage.find(node.file); + if (included_template_it != template_storage.end()) { + const Template *parent_template = &included_template_it->second; + render_to(*output_stream, *parent_template, *json_input, &json_additional_data); + break_rendering = true; + } else if (config.throw_at_missing_includes) { + throw_renderer_error("extends '" + node.file + "' not found", node); + } + } + + void visit(const BlockStatementNode& node) { + const size_t old_level = current_level; + current_level = 0; + current_template = template_stack.front(); + const auto block_it = current_template->block_storage.find(node.name); + if (block_it != current_template->block_storage.end()) { + block_statement_stack.emplace_back(&node); + block_it->second->block.accept(*this); + block_statement_stack.pop_back(); + } + current_level = old_level; + current_template = template_stack.back(); + } + + void visit(const SetStatementNode& node) { + std::string ptr = node.key; + replace_substring(ptr, ".", "/"); + ptr = "/" + ptr; + json_additional_data[nlohmann::json::json_pointer(ptr)] = *eval_expression_list(node.expression); + } + +public: + Renderer(const RenderConfig& config, const TemplateStorage &template_storage, const FunctionStorage &function_storage) + : config(config), template_storage(template_storage), function_storage(function_storage) { } + + void render_to(std::ostream &os, const Template &tmpl, const json &data, json *loop_data = nullptr) { + output_stream = &os; + current_template = &tmpl; + json_input = &data; + if (loop_data) { + json_additional_data = *loop_data; + current_loop_data = &json_additional_data["loop"]; + } + + template_stack.emplace_back(current_template); + current_template->root.accept(*this); + + json_tmp_stack.clear(); + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_RENDERER_HPP_ diff --git a/tools/jsonproc/statistics.hpp b/tools/jsonproc/statistics.hpp new file mode 100644 index 00000000..3ab4c370 --- /dev/null +++ b/tools/jsonproc/statistics.hpp @@ -0,0 +1,74 @@ +#ifndef INCLUDE_INJA_STATISTICS_HPP_ +#define INCLUDE_INJA_STATISTICS_HPP_ + +#include "node.hpp" + + +namespace inja { + +/*! + * \brief A class for counting statistics on a Template. + */ +class StatisticsVisitor : public NodeVisitor { + void visit(const BlockNode& node) { + for (auto& n : node.nodes) { + n->accept(*this); + } + } + + void visit(const TextNode&) { } + void visit(const ExpressionNode&) { } + void visit(const LiteralNode&) { } + + void visit(const JsonNode&) { + variable_counter += 1; + } + + void visit(const FunctionNode& node) { + for (auto& n : node.arguments) { + n->accept(*this); + } + } + + void visit(const ExpressionListNode& node) { + node.root->accept(*this); + } + + void visit(const StatementNode&) { } + void visit(const ForStatementNode&) { } + + void visit(const ForArrayStatementNode& node) { + node.condition.accept(*this); + node.body.accept(*this); + } + + void visit(const ForObjectStatementNode& node) { + node.condition.accept(*this); + node.body.accept(*this); + } + + void visit(const IfStatementNode& node) { + node.condition.accept(*this); + node.true_statement.accept(*this); + node.false_statement.accept(*this); + } + + void visit(const IncludeStatementNode&) { } + + void visit(const ExtendsStatementNode&) { } + + void visit(const BlockStatementNode& node) { + node.block.accept(*this); + } + + void visit(const SetStatementNode&) { } + +public: + unsigned int variable_counter; + + explicit StatisticsVisitor() : variable_counter(0) { } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_STATISTICS_HPP_ diff --git a/tools/jsonproc/string_view.hpp b/tools/jsonproc/string_view.hpp new file mode 100644 index 00000000..2bb50c91 --- /dev/null +++ b/tools/jsonproc/string_view.hpp @@ -0,0 +1,1416 @@ +// Copyright 2017-2019 by Martin Moene +// +// string-view lite, a C++17-like string_view for C++98 and later. +// For more information see https://github.com/martinmoene/string-view-lite +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#pragma once + +#ifndef NONSTD_SV_LITE_H_INCLUDED +#define NONSTD_SV_LITE_H_INCLUDED + +#define string_view_lite_MAJOR 1 +#define string_view_lite_MINOR 4 +#define string_view_lite_PATCH 0 + +#define string_view_lite_VERSION \ + nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY( \ + string_view_lite_PATCH) + +#define nssv_STRINGIFY(x) nssv_STRINGIFY_(x) +#define nssv_STRINGIFY_(x) #x + +// string-view lite configuration: + +#define nssv_STRING_VIEW_DEFAULT 0 +#define nssv_STRING_VIEW_NONSTD 1 +#define nssv_STRING_VIEW_STD 2 + +#if !defined(nssv_CONFIG_SELECT_STRING_VIEW) +#define nssv_CONFIG_SELECT_STRING_VIEW (nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD) +#endif + +#if defined(nssv_CONFIG_SELECT_STD_STRING_VIEW) || defined(nssv_CONFIG_SELECT_NONSTD_STRING_VIEW) +#error nssv_CONFIG_SELECT_STD_STRING_VIEW and nssv_CONFIG_SELECT_NONSTD_STRING_VIEW are deprecated and removed, please use nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_... +#endif + +#ifndef nssv_CONFIG_STD_SV_OPERATOR +#define nssv_CONFIG_STD_SV_OPERATOR 0 +#endif + +#ifndef nssv_CONFIG_USR_SV_OPERATOR +#define nssv_CONFIG_USR_SV_OPERATOR 1 +#endif + +#ifdef nssv_CONFIG_CONVERSION_STD_STRING +#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING +#define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING +#endif + +#ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS +#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1 +#endif + +#ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS +#define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1 +#endif + +// Control presence of exception handling (try and auto discover): + +#ifndef nssv_CONFIG_NO_EXCEPTIONS +#if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND) +#define nssv_CONFIG_NO_EXCEPTIONS 0 +#else +#define nssv_CONFIG_NO_EXCEPTIONS 1 +#endif +#endif + +// C++ language version detection (C++20 is speculative): +// Note: VC14.0/1900 (VS2015) lacks too much from C++14. + +#ifndef nssv_CPLUSPLUS +#if defined(_MSVC_LANG) && !defined(__clang__) +#define nssv_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG) +#else +#define nssv_CPLUSPLUS __cplusplus +#endif +#endif + +#define nssv_CPP98_OR_GREATER (nssv_CPLUSPLUS >= 199711L) +#define nssv_CPP11_OR_GREATER (nssv_CPLUSPLUS >= 201103L) +#define nssv_CPP11_OR_GREATER_ (nssv_CPLUSPLUS >= 201103L) +#define nssv_CPP14_OR_GREATER (nssv_CPLUSPLUS >= 201402L) +#define nssv_CPP17_OR_GREATER (nssv_CPLUSPLUS >= 201703L) +#define nssv_CPP20_OR_GREATER (nssv_CPLUSPLUS >= 202000L) + +// use C++17 std::string_view if available and requested: + +#if nssv_CPP17_OR_GREATER && defined(__has_include) +#if __has_include( ) +#define nssv_HAVE_STD_STRING_VIEW 1 +#else +#define nssv_HAVE_STD_STRING_VIEW 0 +#endif +#else +#define nssv_HAVE_STD_STRING_VIEW 0 +#endif + +#define nssv_USES_STD_STRING_VIEW \ + ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || \ + ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW)) + +#define nssv_HAVE_STARTS_WITH (nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW) +#define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH + +// +// Use C++17 std::string_view: +// + +#if nssv_USES_STD_STRING_VIEW + +#include + +// Extensions for std::string: + +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS + +namespace nonstd { + +template > +std::basic_string to_string(std::basic_string_view v, + Allocator const &a = Allocator()) { + return std::basic_string(v.begin(), v.end(), a); +} + +template +std::basic_string_view to_string_view(std::basic_string const &s) { + return std::basic_string_view(s.data(), s.size()); +} + +// Literal operators sv and _sv: + +#if nssv_CONFIG_STD_SV_OPERATOR + +using namespace std::literals::string_view_literals; + +#endif + +#if nssv_CONFIG_USR_SV_OPERATOR + +inline namespace literals { +inline namespace string_view_literals { + +constexpr std::string_view operator"" _sv(const char *str, size_t len) noexcept // (1) +{ + return std::string_view {str, len}; +} + +constexpr std::u16string_view operator"" _sv(const char16_t *str, size_t len) noexcept // (2) +{ + return std::u16string_view {str, len}; +} + +constexpr std::u32string_view operator"" _sv(const char32_t *str, size_t len) noexcept // (3) +{ + return std::u32string_view {str, len}; +} + +constexpr std::wstring_view operator"" _sv(const wchar_t *str, size_t len) noexcept // (4) +{ + return std::wstring_view {str, len}; +} + +} // namespace string_view_literals +} // namespace literals + +#endif // nssv_CONFIG_USR_SV_OPERATOR + +} // namespace nonstd + +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS + +namespace nonstd { + +using std::basic_string_view; +using std::string_view; +using std::u16string_view; +using std::u32string_view; +using std::wstring_view; + +// literal "sv" and "_sv", see above + +using std::operator==; +using std::operator!=; +using std::operator<; +using std::operator<=; +using std::operator>; +using std::operator>=; + +using std::operator<<; + +} // namespace nonstd + +#else // nssv_HAVE_STD_STRING_VIEW + +// +// Before C++17: use string_view lite: +// + +// Compiler versions: +// +// MSVC++ 6.0 _MSC_VER == 1200 (Visual Studio 6.0) +// MSVC++ 7.0 _MSC_VER == 1300 (Visual Studio .NET 2002) +// MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio .NET 2003) +// MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) +// MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) +// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) +// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) +// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) +// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) +// MSVC++ 14.1 _MSC_VER >= 1910 (Visual Studio 2017) + +#if defined(_MSC_VER) && !defined(__clang__) +#define nssv_COMPILER_MSVC_VER (_MSC_VER) +#define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * (5 + (_MSC_VER < 1900))) +#else +#define nssv_COMPILER_MSVC_VER 0 +#define nssv_COMPILER_MSVC_VERSION 0 +#endif + +#define nssv_COMPILER_VERSION(major, minor, patch) (10 * (10 * (major) + (minor)) + (patch)) + +#if defined(__clang__) +#define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) +#else +#define nssv_COMPILER_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +#define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#else +#define nssv_COMPILER_GNUC_VERSION 0 +#endif + +// half-open range [lo..hi): +#define nssv_BETWEEN(v, lo, hi) ((lo) <= (v) && (v) < (hi)) + +// Presence of language and library features: + +#ifdef _HAS_CPP0X +#define nssv_HAS_CPP0X _HAS_CPP0X +#else +#define nssv_HAS_CPP0X 0 +#endif + +// Unless defined otherwise below, consider VC14 as C++11 for variant-lite: + +#if nssv_COMPILER_MSVC_VER >= 1900 +#undef nssv_CPP11_OR_GREATER +#define nssv_CPP11_OR_GREATER 1 +#endif + +#define nssv_CPP11_90 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500) +#define nssv_CPP11_100 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600) +#define nssv_CPP11_110 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700) +#define nssv_CPP11_120 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800) +#define nssv_CPP11_140 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900) +#define nssv_CPP11_141 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910) + +#define nssv_CPP14_000 (nssv_CPP14_OR_GREATER) +#define nssv_CPP17_000 (nssv_CPP17_OR_GREATER) + +// Presence of C++11 language features: + +#define nssv_HAVE_CONSTEXPR_11 nssv_CPP11_140 +#define nssv_HAVE_EXPLICIT_CONVERSION nssv_CPP11_140 +#define nssv_HAVE_INLINE_NAMESPACE nssv_CPP11_140 +#define nssv_HAVE_NOEXCEPT nssv_CPP11_140 +#define nssv_HAVE_NULLPTR nssv_CPP11_100 +#define nssv_HAVE_REF_QUALIFIER nssv_CPP11_140 +#define nssv_HAVE_UNICODE_LITERALS nssv_CPP11_140 +#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140 +#define nssv_HAVE_WCHAR16_T nssv_CPP11_100 +#define nssv_HAVE_WCHAR32_T nssv_CPP11_100 + +#if !((nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION) || nssv_BETWEEN(nssv_COMPILER_CLANG_VERSION, 300, 400)) +#define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140 +#else +#define nssv_HAVE_STD_DEFINED_LITERALS 0 +#endif + +// Presence of C++14 language features: + +#define nssv_HAVE_CONSTEXPR_14 nssv_CPP14_000 + +// Presence of C++17 language features: + +#define nssv_HAVE_NODISCARD nssv_CPP17_000 + +// Presence of C++ library features: + +#define nssv_HAVE_STD_HASH nssv_CPP11_120 + +// C++ feature usage: + +#if nssv_HAVE_CONSTEXPR_11 +#define nssv_constexpr constexpr +#else +#define nssv_constexpr /*constexpr*/ +#endif + +#if nssv_HAVE_CONSTEXPR_14 +#define nssv_constexpr14 constexpr +#else +#define nssv_constexpr14 /*constexpr*/ +#endif + +#if nssv_HAVE_EXPLICIT_CONVERSION +#define nssv_explicit explicit +#else +#define nssv_explicit /*explicit*/ +#endif + +#if nssv_HAVE_INLINE_NAMESPACE +#define nssv_inline_ns inline +#else +#define nssv_inline_ns /*inline*/ +#endif + +#if nssv_HAVE_NOEXCEPT +#define nssv_noexcept noexcept +#else +#define nssv_noexcept /*noexcept*/ +#endif + +//#if nssv_HAVE_REF_QUALIFIER +//# define nssv_ref_qual & +//# define nssv_refref_qual && +//#else +//# define nssv_ref_qual /*&*/ +//# define nssv_refref_qual /*&&*/ +//#endif + +#if nssv_HAVE_NULLPTR +#define nssv_nullptr nullptr +#else +#define nssv_nullptr NULL +#endif + +#if nssv_HAVE_NODISCARD +#define nssv_nodiscard [[nodiscard]] +#else +#define nssv_nodiscard /*[[nodiscard]]*/ +#endif + +// Additional includes: + +#include +#include +#include +#include +#include +#include // std::char_traits<> + +#if !nssv_CONFIG_NO_EXCEPTIONS +#include +#endif + +#if nssv_CPP11_OR_GREATER +#include +#endif + +// Clang, GNUC, MSVC warning suppression macros: + +#if defined(__clang__) +#pragma clang diagnostic ignored "-Wreserved-user-defined-literal" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wuser-defined-literals" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wliteral-suffix" +#endif // __clang__ + +#if nssv_COMPILER_MSVC_VERSION >= 140 +#define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] +#define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress : code)) +#define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable : codes)) +#else +#define nssv_SUPPRESS_MSGSL_WARNING(expr) +#define nssv_SUPPRESS_MSVC_WARNING(code, descr) +#define nssv_DISABLE_MSVC_WARNINGS(codes) +#endif + +#if defined(__clang__) +#define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) +#define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop") +#elif nssv_COMPILER_MSVC_VERSION >= 140 +#define nssv_RESTORE_WARNINGS() __pragma(warning(pop)) +#else +#define nssv_RESTORE_WARNINGS() +#endif + +// Suppress the following MSVC (GSL) warnings: +// - C4455, non-gsl : 'operator ""sv': literal suffix identifiers that do not +// start with an underscore are reserved +// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions; +// use brace initialization, gsl::narrow_cast or gsl::narow +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead + +nssv_DISABLE_MSVC_WARNINGS(4455 26481 26472) + // nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" ) + // nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix ) + + namespace nonstd { + namespace sv_lite { + +#if nssv_CPP11_OR_GREATER + + namespace detail { + + // Expect tail call optimization to make length() non-recursive: + + template inline constexpr std::size_t length(CharT *s, std::size_t result = 0) { + return *s == '\0' ? result : length(s + 1, result + 1); + } + + } // namespace detail + +#endif // nssv_CPP11_OR_GREATER + + template > class basic_string_view; + + // + // basic_string_view: + // + + template */ + > + class basic_string_view { + public: + // Member types: + + typedef Traits traits_type; + typedef CharT value_type; + + typedef CharT *pointer; + typedef CharT const *const_pointer; + typedef CharT &reference; + typedef CharT const &const_reference; + + typedef const_pointer iterator; + typedef const_pointer const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + // 24.4.2.1 Construction and assignment: + + nssv_constexpr basic_string_view() nssv_noexcept : data_(nssv_nullptr), size_(0) {} + +#if nssv_CPP11_OR_GREATER + nssv_constexpr basic_string_view(basic_string_view const &other) nssv_noexcept = default; +#else + nssv_constexpr basic_string_view(basic_string_view const &other) nssv_noexcept : data_(other.data_), + size_(other.size_) {} +#endif + + nssv_constexpr basic_string_view(CharT const *s, size_type count) nssv_noexcept // non-standard noexcept + : data_(s), + size_(count) {} + + nssv_constexpr basic_string_view(CharT const *s) nssv_noexcept // non-standard noexcept + : data_(s) +#if nssv_CPP17_OR_GREATER + , + size_(Traits::length(s)) +#elif nssv_CPP11_OR_GREATER + , + size_(detail::length(s)) +#else + , + size_(Traits::length(s)) +#endif + { + } + + // Assignment: + +#if nssv_CPP11_OR_GREATER + nssv_constexpr14 basic_string_view &operator=(basic_string_view const &other) nssv_noexcept = default; +#else + nssv_constexpr14 basic_string_view &operator=(basic_string_view const &other) nssv_noexcept { + data_ = other.data_; + size_ = other.size_; + return *this; + } +#endif + + // 24.4.2.2 Iterator support: + + nssv_constexpr const_iterator begin() const nssv_noexcept { return data_; } + nssv_constexpr const_iterator end() const nssv_noexcept { return data_ + size_; } + + nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); } + nssv_constexpr const_iterator cend() const nssv_noexcept { return end(); } + + nssv_constexpr const_reverse_iterator rbegin() const nssv_noexcept { return const_reverse_iterator(end()); } + nssv_constexpr const_reverse_iterator rend() const nssv_noexcept { return const_reverse_iterator(begin()); } + + nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); } + nssv_constexpr const_reverse_iterator crend() const nssv_noexcept { return rend(); } + + // 24.4.2.3 Capacity: + + nssv_constexpr size_type size() const nssv_noexcept { return size_; } + nssv_constexpr size_type length() const nssv_noexcept { return size_; } + nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits::max)(); } + + // since C++20 + nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept { return 0 == size_; } + + // 24.4.2.4 Element access: + + nssv_constexpr const_reference operator[](size_type pos) const { return data_at(pos); } + + nssv_constexpr14 const_reference at(size_type pos) const { +#if nssv_CONFIG_NO_EXCEPTIONS + assert(pos < size()); +#else + if (pos >= size()) { + throw std::out_of_range("nonstd::string_view::at()"); + } +#endif + return data_at(pos); + } + + nssv_constexpr const_reference front() const { return data_at(0); } + nssv_constexpr const_reference back() const { return data_at(size() - 1); } + + nssv_constexpr const_pointer data() const nssv_noexcept { return data_; } + + // 24.4.2.5 Modifiers: + + nssv_constexpr14 void remove_prefix(size_type n) { + assert(n <= size()); + data_ += n; + size_ -= n; + } + + nssv_constexpr14 void remove_suffix(size_type n) { + assert(n <= size()); + size_ -= n; + } + + nssv_constexpr14 void swap(basic_string_view &other) nssv_noexcept { + using std::swap; + swap(data_, other.data_); + swap(size_, other.size_); + } + + // 24.4.2.6 String operations: + + size_type copy(CharT *dest, size_type n, size_type pos = 0) const { +#if nssv_CONFIG_NO_EXCEPTIONS + assert(pos <= size()); +#else + if (pos > size()) { + throw std::out_of_range("nonstd::string_view::copy()"); + } +#endif + const size_type rlen = (std::min)(n, size() - pos); + + (void)Traits::copy(dest, data() + pos, rlen); + + return rlen; + } + + nssv_constexpr14 basic_string_view substr(size_type pos = 0, size_type n = npos) const { +#if nssv_CONFIG_NO_EXCEPTIONS + assert(pos <= size()); +#else + if (pos > size()) { + throw std::out_of_range("nonstd::string_view::substr()"); + } +#endif + return basic_string_view(data() + pos, (std::min)(n, size() - pos)); + } + + // compare(), 6x: + + nssv_constexpr14 int compare(basic_string_view other) const nssv_noexcept // (1) + { + if (const int result = Traits::compare(data(), other.data(), (std::min)(size(), other.size()))) { + return result; + } + + return size() == other.size() ? 0 : size() < other.size() ? -1 : 1; + } + + nssv_constexpr int compare(size_type pos1, size_type n1, basic_string_view other) const // (2) + { + return substr(pos1, n1).compare(other); + } + + nssv_constexpr int compare(size_type pos1, size_type n1, basic_string_view other, size_type pos2, + size_type n2) const // (3) + { + return substr(pos1, n1).compare(other.substr(pos2, n2)); + } + + nssv_constexpr int compare(CharT const *s) const // (4) + { + return compare(basic_string_view(s)); + } + + nssv_constexpr int compare(size_type pos1, size_type n1, CharT const *s) const // (5) + { + return substr(pos1, n1).compare(basic_string_view(s)); + } + + nssv_constexpr int compare(size_type pos1, size_type n1, CharT const *s, size_type n2) const // (6) + { + return substr(pos1, n1).compare(basic_string_view(s, n2)); + } + + // 24.4.2.7 Searching: + + // starts_with(), 3x, since C++20: + + nssv_constexpr bool starts_with(basic_string_view v) const nssv_noexcept // (1) + { + return size() >= v.size() && compare(0, v.size(), v) == 0; + } + + nssv_constexpr bool starts_with(CharT c) const nssv_noexcept // (2) + { + return starts_with(basic_string_view(&c, 1)); + } + + nssv_constexpr bool starts_with(CharT const *s) const // (3) + { + return starts_with(basic_string_view(s)); + } + + // ends_with(), 3x, since C++20: + + nssv_constexpr bool ends_with(basic_string_view v) const nssv_noexcept // (1) + { + return size() >= v.size() && compare(size() - v.size(), npos, v) == 0; + } + + nssv_constexpr bool ends_with(CharT c) const nssv_noexcept // (2) + { + return ends_with(basic_string_view(&c, 1)); + } + + nssv_constexpr bool ends_with(CharT const *s) const // (3) + { + return ends_with(basic_string_view(s)); + } + + // find(), 4x: + + nssv_constexpr14 size_type find(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1) + { + return assert(v.size() == 0 || v.data() != nssv_nullptr), + pos >= size() ? npos : to_pos(std::search(cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq)); + } + + nssv_constexpr14 size_type find(CharT c, size_type pos = 0) const nssv_noexcept // (2) + { + return find(basic_string_view(&c, 1), pos); + } + + nssv_constexpr14 size_type find(CharT const *s, size_type pos, size_type n) const // (3) + { + return find(basic_string_view(s, n), pos); + } + + nssv_constexpr14 size_type find(CharT const *s, size_type pos = 0) const // (4) + { + return find(basic_string_view(s), pos); + } + + // rfind(), 4x: + + nssv_constexpr14 size_type rfind(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1) + { + if (size() < v.size()) { + return npos; + } + + if (v.empty()) { + return (std::min)(size(), pos); + } + + const_iterator last = cbegin() + (std::min)(size() - v.size(), pos) + v.size(); + const_iterator result = std::find_end(cbegin(), last, v.cbegin(), v.cend(), Traits::eq); + + return result != last ? size_type(result - cbegin()) : npos; + } + + nssv_constexpr14 size_type rfind(CharT c, size_type pos = npos) const nssv_noexcept // (2) + { + return rfind(basic_string_view(&c, 1), pos); + } + + nssv_constexpr14 size_type rfind(CharT const *s, size_type pos, size_type n) const // (3) + { + return rfind(basic_string_view(s, n), pos); + } + + nssv_constexpr14 size_type rfind(CharT const *s, size_type pos = npos) const // (4) + { + return rfind(basic_string_view(s), pos); + } + + // find_first_of(), 4x: + + nssv_constexpr size_type find_first_of(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1) + { + return pos >= size() ? npos + : to_pos(std::find_first_of(cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq)); + } + + nssv_constexpr size_type find_first_of(CharT c, size_type pos = 0) const nssv_noexcept // (2) + { + return find_first_of(basic_string_view(&c, 1), pos); + } + + nssv_constexpr size_type find_first_of(CharT const *s, size_type pos, size_type n) const // (3) + { + return find_first_of(basic_string_view(s, n), pos); + } + + nssv_constexpr size_type find_first_of(CharT const *s, size_type pos = 0) const // (4) + { + return find_first_of(basic_string_view(s), pos); + } + + // find_last_of(), 4x: + + nssv_constexpr size_type find_last_of(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1) + { + return empty() ? npos + : pos >= size() ? find_last_of(v, size() - 1) + : to_pos(std::find_first_of(const_reverse_iterator(cbegin() + pos + 1), crend(), + v.cbegin(), v.cend(), Traits::eq)); + } + + nssv_constexpr size_type find_last_of(CharT c, size_type pos = npos) const nssv_noexcept // (2) + { + return find_last_of(basic_string_view(&c, 1), pos); + } + + nssv_constexpr size_type find_last_of(CharT const *s, size_type pos, size_type count) const // (3) + { + return find_last_of(basic_string_view(s, count), pos); + } + + nssv_constexpr size_type find_last_of(CharT const *s, size_type pos = npos) const // (4) + { + return find_last_of(basic_string_view(s), pos); + } + + // find_first_not_of(), 4x: + + nssv_constexpr size_type find_first_not_of(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1) + { + return pos >= size() ? npos : to_pos(std::find_if(cbegin() + pos, cend(), not_in_view(v))); + } + + nssv_constexpr size_type find_first_not_of(CharT c, size_type pos = 0) const nssv_noexcept // (2) + { + return find_first_not_of(basic_string_view(&c, 1), pos); + } + + nssv_constexpr size_type find_first_not_of(CharT const *s, size_type pos, size_type count) const // (3) + { + return find_first_not_of(basic_string_view(s, count), pos); + } + + nssv_constexpr size_type find_first_not_of(CharT const *s, size_type pos = 0) const // (4) + { + return find_first_not_of(basic_string_view(s), pos); + } + + // find_last_not_of(), 4x: + + nssv_constexpr size_type find_last_not_of(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1) + { + return empty() ? npos + : pos >= size() + ? find_last_not_of(v, size() - 1) + : to_pos(std::find_if(const_reverse_iterator(cbegin() + pos + 1), crend(), not_in_view(v))); + } + + nssv_constexpr size_type find_last_not_of(CharT c, size_type pos = npos) const nssv_noexcept // (2) + { + return find_last_not_of(basic_string_view(&c, 1), pos); + } + + nssv_constexpr size_type find_last_not_of(CharT const *s, size_type pos, size_type count) const // (3) + { + return find_last_not_of(basic_string_view(s, count), pos); + } + + nssv_constexpr size_type find_last_not_of(CharT const *s, size_type pos = npos) const // (4) + { + return find_last_not_of(basic_string_view(s), pos); + } + + // Constants: + +#if nssv_CPP17_OR_GREATER + static nssv_constexpr size_type npos = size_type(-1); +#elif nssv_CPP11_OR_GREATER + enum : size_type { npos = size_type(-1) }; +#else + enum { npos = size_type(-1) }; +#endif + + private: + struct not_in_view { + const basic_string_view v; + + nssv_constexpr explicit not_in_view(basic_string_view v) : v(v) {} + + nssv_constexpr bool operator()(CharT c) const { return npos == v.find_first_of(c); } + }; + + nssv_constexpr size_type to_pos(const_iterator it) const { return it == cend() ? npos : size_type(it - cbegin()); } + + nssv_constexpr size_type to_pos(const_reverse_iterator it) const { + return it == crend() ? npos : size_type(crend() - it - 1); + } + + nssv_constexpr const_reference data_at(size_type pos) const { +#if nssv_BETWEEN(nssv_COMPILER_GNUC_VERSION, 1, 500) + return data_[pos]; +#else + return assert(pos < size()), data_[pos]; +#endif + } + + private: + const_pointer data_; + size_type size_; + + public: +#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS + + template + basic_string_view(std::basic_string const &s) nssv_noexcept : data_(s.data()), + size_(s.size()) {} + +#if nssv_HAVE_EXPLICIT_CONVERSION + + template explicit operator std::basic_string() const { + return to_string(Allocator()); + } + +#endif // nssv_HAVE_EXPLICIT_CONVERSION + +#if nssv_CPP11_OR_GREATER + + template > + std::basic_string to_string(Allocator const &a = Allocator()) const { + return std::basic_string(begin(), end(), a); + } + +#else + + std::basic_string to_string() const { return std::basic_string(begin(), end()); } + + template std::basic_string to_string(Allocator const &a) const { + return std::basic_string(begin(), end(), a); + } + +#endif // nssv_CPP11_OR_GREATER + +#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS + }; + + // + // Non-member functions: + // + + // 24.4.3 Non-member comparison functions: + // lexicographically compare two string views (function template): + + template + nssv_constexpr bool operator==(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) == 0; + } + + template + nssv_constexpr bool operator!=(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) != 0; + } + + template + nssv_constexpr bool operator<(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) < 0; + } + + template + nssv_constexpr bool operator<=(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) <= 0; + } + + template + nssv_constexpr bool operator>(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) > 0; + } + + template + nssv_constexpr bool operator>=(basic_string_view lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) >= 0; + } + + // Let S be basic_string_view, and sv be an instance of S. + // Implementations shall provide sufficient additional overloads marked + // constexpr and noexcept so that an object t with an implicit conversion + // to S can be compared according to Table 67. + +#if !nssv_CPP11_OR_GREATER || nssv_BETWEEN(nssv_COMPILER_MSVC_VERSION, 100, 141) + + // accomodate for older compilers: + + // == + + template + nssv_constexpr bool operator==(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) == 0; + } + + template + nssv_constexpr bool operator==(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) == 0; + } + + template + nssv_constexpr bool operator==(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.size() == rhs.size() && lhs.compare(rhs) == 0; + } + + template + nssv_constexpr bool operator==(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return lhs.size() == rhs.size() && lhs.compare(rhs) == 0; + } + + // != + + template + nssv_constexpr bool operator!=(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) != 0; + } + + template + nssv_constexpr bool operator!=(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) != 0; + } + + template + nssv_constexpr bool operator!=(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.size() != rhs.size() && lhs.compare(rhs) != 0; + } + + template + nssv_constexpr bool operator!=(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return lhs.size() != rhs.size() || rhs.compare(lhs) != 0; + } + + // < + + template + nssv_constexpr bool operator<(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) < 0; + } + + template + nssv_constexpr bool operator<(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) > 0; + } + + template + nssv_constexpr bool operator<(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.compare(rhs) < 0; + } + + template + nssv_constexpr bool operator<(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return rhs.compare(lhs) > 0; + } + + // <= + + template + nssv_constexpr bool operator<=(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) <= 0; + } + + template + nssv_constexpr bool operator<=(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) >= 0; + } + + template + nssv_constexpr bool operator<=(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.compare(rhs) <= 0; + } + + template + nssv_constexpr bool operator<=(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return rhs.compare(lhs) >= 0; + } + + // > + + template + nssv_constexpr bool operator>(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) > 0; + } + + template + nssv_constexpr bool operator>(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) < 0; + } + + template + nssv_constexpr bool operator>(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.compare(rhs) > 0; + } + + template + nssv_constexpr bool operator>(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return rhs.compare(lhs) < 0; + } + + // >= + + template + nssv_constexpr bool operator>=(basic_string_view lhs, char const *rhs) nssv_noexcept { + return lhs.compare(rhs) >= 0; + } + + template + nssv_constexpr bool operator>=(char const *lhs, basic_string_view rhs) nssv_noexcept { + return rhs.compare(lhs) <= 0; + } + + template + nssv_constexpr bool operator>=(basic_string_view lhs, + std::basic_string rhs) nssv_noexcept { + return lhs.compare(rhs) >= 0; + } + + template + nssv_constexpr bool operator>=(std::basic_string rhs, + basic_string_view lhs) nssv_noexcept { + return rhs.compare(lhs) <= 0; + } + +#else // newer compilers: + +#define nssv_BASIC_STRING_VIEW_I(T, U) typename std::decay>::type + +#if nssv_BETWEEN(nssv_COMPILER_MSVC_VERSION, 140, 150) +#define nssv_MSVC_ORDER(x) , int = x +#else +#define nssv_MSVC_ORDER(x) /*, int=x*/ +#endif + + // == + + template + nssv_constexpr bool operator==(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.compare(rhs) == 0; + } + + template + nssv_constexpr bool operator==(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.size() == rhs.size() && lhs.compare(rhs) == 0; + } + + // != + + template + nssv_constexpr bool operator!=(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.size() != rhs.size() || lhs.compare(rhs) != 0; + } + + template + nssv_constexpr bool operator!=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) != 0; + } + + // < + + template + nssv_constexpr bool operator<(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.compare(rhs) < 0; + } + + template + nssv_constexpr bool operator<(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) < 0; + } + + // <= + + template + nssv_constexpr bool operator<=(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.compare(rhs) <= 0; + } + + template + nssv_constexpr bool operator<=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) <= 0; + } + + // > + + template + nssv_constexpr bool operator>(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.compare(rhs) > 0; + } + + template + nssv_constexpr bool operator>(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) > 0; + } + + // >= + + template + nssv_constexpr bool operator>=(basic_string_view lhs, + nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept { + return lhs.compare(rhs) >= 0; + } + + template + nssv_constexpr bool operator>=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, + basic_string_view rhs) nssv_noexcept { + return lhs.compare(rhs) >= 0; + } + +#undef nssv_MSVC_ORDER +#undef nssv_BASIC_STRING_VIEW_I + +#endif // compiler-dependent approach to comparisons + + // 24.4.4 Inserters and extractors: + + namespace detail { + + template void write_padding(Stream &os, std::streamsize n) { + for (std::streamsize i = 0; i < n; ++i) + os.rdbuf()->sputc(os.fill()); + } + + template Stream &write_to_stream(Stream &os, View const &sv) { + typename Stream::sentry sentry(os); + + if (!os) + return os; + + const std::streamsize length = static_cast(sv.length()); + + // Whether, and how, to pad: + const bool pad = (length < os.width()); + const bool left_pad = pad && (os.flags() & std::ios_base::adjustfield) == std::ios_base::right; + + if (left_pad) + write_padding(os, os.width() - length); + + // Write span characters: + os.rdbuf()->sputn(sv.begin(), length); + + if (pad && !left_pad) + write_padding(os, os.width() - length); + + // Reset output stream width: + os.width(0); + + return os; + } + + } // namespace detail + + template + std::basic_ostream &operator<<(std::basic_ostream &os, + basic_string_view sv) { + return detail::write_to_stream(os, sv); + } + + // Several typedefs for common character types are provided: + + typedef basic_string_view string_view; + typedef basic_string_view wstring_view; +#if nssv_HAVE_WCHAR16_T + typedef basic_string_view u16string_view; + typedef basic_string_view u32string_view; +#endif + + } // namespace sv_lite +} // namespace nonstd::sv_lite + +// +// 24.4.6 Suffix for basic_string_view literals: +// + +#if nssv_HAVE_USER_DEFINED_LITERALS + +namespace nonstd { +nssv_inline_ns namespace literals { + nssv_inline_ns namespace string_view_literals { + +#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS + + nssv_constexpr nonstd::sv_lite::string_view operator"" sv(const char *str, size_t len) nssv_noexcept // (1) + { + return nonstd::sv_lite::string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::u16string_view operator"" sv(const char16_t *str, size_t len) nssv_noexcept // (2) + { + return nonstd::sv_lite::u16string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::u32string_view operator"" sv(const char32_t *str, size_t len) nssv_noexcept // (3) + { + return nonstd::sv_lite::u32string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::wstring_view operator"" sv(const wchar_t *str, size_t len) nssv_noexcept // (4) + { + return nonstd::sv_lite::wstring_view {str, len}; + } + +#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS + +#if nssv_CONFIG_USR_SV_OPERATOR + + nssv_constexpr nonstd::sv_lite::string_view operator"" _sv(const char *str, size_t len) nssv_noexcept // (1) + { + return nonstd::sv_lite::string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::u16string_view operator"" _sv(const char16_t *str, size_t len) nssv_noexcept // (2) + { + return nonstd::sv_lite::u16string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::u32string_view operator"" _sv(const char32_t *str, size_t len) nssv_noexcept // (3) + { + return nonstd::sv_lite::u32string_view {str, len}; + } + + nssv_constexpr nonstd::sv_lite::wstring_view operator"" _sv(const wchar_t *str, size_t len) nssv_noexcept // (4) + { + return nonstd::sv_lite::wstring_view {str, len}; + } + +#endif // nssv_CONFIG_USR_SV_OPERATOR + } +} +} // namespace nonstd + +#endif + +// +// Extensions for std::string: +// + +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS + +namespace nonstd { +namespace sv_lite { + +// Exclude MSVC 14 (19.00): it yields ambiguous to_string(): + +#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140 + +template > +std::basic_string to_string(basic_string_view v, + Allocator const &a = Allocator()) { + return std::basic_string(v.begin(), v.end(), a); +} + +#else + +template std::basic_string to_string(basic_string_view v) { + return std::basic_string(v.begin(), v.end()); +} + +template +std::basic_string to_string(basic_string_view v, Allocator const &a) { + return std::basic_string(v.begin(), v.end(), a); +} + +#endif // nssv_CPP11_OR_GREATER + +template +basic_string_view to_string_view(std::basic_string const &s) { + return basic_string_view(s.data(), s.size()); +} + +} // namespace sv_lite +} // namespace nonstd + +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS + +// +// make types and algorithms available in namespace nonstd: +// + +namespace nonstd { + +using sv_lite::basic_string_view; +using sv_lite::string_view; +using sv_lite::wstring_view; + +#if nssv_HAVE_WCHAR16_T +using sv_lite::u16string_view; +#endif +#if nssv_HAVE_WCHAR32_T +using sv_lite::u32string_view; +#endif + +// literal "sv" + +using sv_lite::operator==; +using sv_lite::operator!=; +using sv_lite::operator<; +using sv_lite::operator<=; +using sv_lite::operator>; +using sv_lite::operator>=; + +using sv_lite::operator<<; + +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS +using sv_lite::to_string; +using sv_lite::to_string_view; +#endif + +} // namespace nonstd + +// 24.4.5 Hash support (C++11): + +// Note: The hash value of a string view object is equal to the hash value of +// the corresponding string object. + +#if nssv_HAVE_STD_HASH + +#include + +namespace std { + +template <> struct hash { +public: + std::size_t operator()(nonstd::string_view v) const nssv_noexcept { + return std::hash()(std::string(v.data(), v.size())); + } +}; + +template <> struct hash { +public: + std::size_t operator()(nonstd::wstring_view v) const nssv_noexcept { + return std::hash()(std::wstring(v.data(), v.size())); + } +}; + +template <> struct hash { +public: + std::size_t operator()(nonstd::u16string_view v) const nssv_noexcept { + return std::hash()(std::u16string(v.data(), v.size())); + } +}; + +template <> struct hash { +public: + std::size_t operator()(nonstd::u32string_view v) const nssv_noexcept { + return std::hash()(std::u32string(v.data(), v.size())); + } +}; + +} // namespace std + +#endif // nssv_HAVE_STD_HASH + +nssv_RESTORE_WARNINGS() + +#endif // nssv_HAVE_STD_STRING_VIEW +#endif // NONSTD_SV_LITE_H_INCLUDED diff --git a/tools/jsonproc/template.hpp b/tools/jsonproc/template.hpp new file mode 100644 index 00000000..45b276bd --- /dev/null +++ b/tools/jsonproc/template.hpp @@ -0,0 +1,38 @@ +#ifndef INCLUDE_INJA_TEMPLATE_HPP_ +#define INCLUDE_INJA_TEMPLATE_HPP_ + +#include +#include +#include +#include + +#include "node.hpp" +#include "statistics.hpp" + + +namespace inja { + +/*! + * \brief The main inja Template. + */ +struct Template { + BlockNode root; + std::string content; + std::map> block_storage; + + explicit Template() { } + explicit Template(const std::string& content): content(content) { } + + /// Return number of variables (total number, not distinct ones) in the template + int count_variables() { + auto statistic_visitor = StatisticsVisitor(); + root.accept(statistic_visitor); + return statistic_visitor.variable_counter; + } +}; + +using TemplateStorage = std::map; + +} // namespace inja + +#endif // INCLUDE_INJA_TEMPLATE_HPP_ diff --git a/tools/jsonproc/token.hpp b/tools/jsonproc/token.hpp new file mode 100644 index 00000000..1904c4dd --- /dev/null +++ b/tools/jsonproc/token.hpp @@ -0,0 +1,74 @@ +#ifndef INCLUDE_INJA_TOKEN_HPP_ +#define INCLUDE_INJA_TOKEN_HPP_ + +#include + +#include "string_view.hpp" + +namespace inja { + +/*! + * \brief Helper-class for the inja Lexer. + */ +struct Token { + enum class Kind { + Text, + ExpressionOpen, // {{ + ExpressionClose, // }} + LineStatementOpen, // ## + LineStatementClose, // \n + StatementOpen, // {% + StatementClose, // %} + CommentOpen, // {# + CommentClose, // #} + Id, // this, this.foo + Number, // 1, 2, -1, 5.2, -5.3 + String, // "this" + Plus, // + + Minus, // - + Times, // * + Slash, // / + Percent, // % + Power, // ^ + Comma, // , + Dot, // . + Colon, // : + LeftParen, // ( + RightParen, // ) + LeftBracket, // [ + RightBracket, // ] + LeftBrace, // { + RightBrace, // } + Equal, // == + NotEqual, // != + GreaterThan, // > + GreaterEqual, // >= + LessThan, // < + LessEqual, // <= + Unknown, + Eof, + }; + + Kind kind {Kind::Unknown}; + nonstd::string_view text; + + explicit constexpr Token() = default; + explicit constexpr Token(Kind kind, nonstd::string_view text) : kind(kind), text(text) {} + + std::string describe() const { + switch (kind) { + case Kind::Text: + return ""; + case Kind::LineStatementClose: + return ""; + case Kind::Eof: + return ""; + default: + return static_cast(text); + } + } +}; + +} // namespace inja + +#endif // INCLUDE_INJA_TOKEN_HPP_ diff --git a/tools/jsonproc/utils.hpp b/tools/jsonproc/utils.hpp new file mode 100644 index 00000000..d993f3f5 --- /dev/null +++ b/tools/jsonproc/utils.hpp @@ -0,0 +1,83 @@ +#ifndef INCLUDE_INJA_UTILS_HPP_ +#define INCLUDE_INJA_UTILS_HPP_ + +#include +#include +#include +#include + +#include "exceptions.hpp" +#include "string_view.hpp" + +namespace inja { + +inline void open_file_or_throw(const std::string &path, std::ifstream &file) { + file.exceptions(std::ifstream::failbit | std::ifstream::badbit); +#ifndef INJA_NOEXCEPTION + try { + file.open(path); + } catch (const std::ios_base::failure & /*e*/) { + INJA_THROW(FileError("failed accessing file at '" + path + "'")); + } +#else + file.open(path); +#endif +} + +namespace string_view { +inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) { + start = std::min(start, view.size()); + end = std::min(std::max(start, end), view.size()); + return view.substr(start, end - start); +} + +inline std::pair split(nonstd::string_view view, char Separator) { + size_t idx = view.find(Separator); + if (idx == nonstd::string_view::npos) { + return std::make_pair(view, nonstd::string_view()); + } + return std::make_pair(slice(view, 0, idx), slice(view, idx + 1, nonstd::string_view::npos)); +} + +inline bool starts_with(nonstd::string_view view, nonstd::string_view prefix) { + return (view.size() >= prefix.size() && view.compare(0, prefix.size(), prefix) == 0); +} +} // namespace string_view + +inline SourceLocation get_source_location(nonstd::string_view content, size_t pos) { + // Get line and offset position (starts at 1:1) + auto sliced = string_view::slice(content, 0, pos); + std::size_t last_newline = sliced.rfind("\n"); + + if (last_newline == nonstd::string_view::npos) { + return {1, sliced.length() + 1}; + } + + // Count newlines + size_t count_lines = 0; + size_t search_start = 0; + while (search_start <= sliced.size()) { + search_start = sliced.find("\n", search_start) + 1; + if (search_start == 0) { + break; + } + count_lines += 1; + } + + return {count_lines + 1, sliced.length() - last_newline}; +} + +inline void replace_substring(std::string& s, const std::string& f, + const std::string& t) +{ + if (f.empty()) return; + for (auto pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +} // namespace inja + +#endif // INCLUDE_INJA_UTILS_HPP_ diff --git a/tools/knarc/.gitignore b/tools/knarc/.gitignore new file mode 100644 index 00000000..20bde9af --- /dev/null +++ b/tools/knarc/.gitignore @@ -0,0 +1 @@ +knarc diff --git a/tools/knarc/Makefile b/tools/knarc/Makefile new file mode 100644 index 00000000..24e0de7d --- /dev/null +++ b/tools/knarc/Makefile @@ -0,0 +1,42 @@ +CXXFLAGS := -std=c++17 -O2 -Wall -Wno-switch +CFLAGS := -O2 -Wall -Wno-switch + +ifeq ($(OS),Windows_NT) +C_SRCS := fnmatch.c +LDFLAGS += -lstdc++fs +else +C_SRCS := +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Darwin) +LDFLAGS += -lstdc++ -lc++ -lc -D_LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_FILESYSTEM +else +LDFLAGS += -lstdc++fs +endif +endif +CXX_SRCS := Source.cpp Narc.cpp +C_OBJS := $(C_SRCS:%.c=%.o) +CXX_OBJS := $(CXX_SRCS:%.cpp=%.o) +OBJS := $(C_OBJS) $(CXX_OBJS) +HEADERS := Narc.h fnmatch.h + +.PHONY: all clean + +all: knarc + @: + +clean: + $(RM) knarc knarc.exe $(OBJS) + +ifeq ($(OS),Windows_NT) +knarc: $(OBJS) + $(CXX) $^ -o $@ $(LDFLAGS) $(CXXFLAGS) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c -o $@ $< + +%.o: %.cpp $(HEADERS) + $(CXX) $(CXXFLAGS) -c -o $@ $< +else +knarc: $(CXX_SRCS) $(HEADERS) + $(CXX) $(CXX_SRCS) -o $@ $(LDFLAGS) $(CXXFLAGS) +endif diff --git a/tools/knarc/Narc.cpp b/tools/knarc/Narc.cpp new file mode 100644 index 00000000..04594091 --- /dev/null +++ b/tools/knarc/Narc.cpp @@ -0,0 +1,720 @@ +#include "Narc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fnmatch.h" + +#if (__cplusplus < 201703L) +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif + +using namespace std; + +extern bool debug; +extern bool pack_no_fnt; +extern bool output_header; + +void Narc::AlignDword(ofstream& ofs, uint8_t paddingChar) +{ + if ((ofs.tellp() % 4) != 0) + { + for (int i = 4 - (ofs.tellp() % 4); i-- > 0; ) + { + ofs.write(reinterpret_cast(&paddingChar), sizeof(uint8_t)); + } + } +} + +bool Narc::Cleanup(ifstream& ifs, const NarcError& e) +{ + ifs.close(); + + error = e; + + return false; +} + +bool Narc::Cleanup(ofstream& ofs, const NarcError& e) +{ + ofs.close(); + + error = e; + + return false; +} + +std::vector Narc::KnarcOrderDirectoryIterator(const fs::path& path, bool recursive) const +{ + std::vector ordered_files; + std::vector unordered_files; + + // open the order file + if (fs::exists(path / ".knarcorder")) + { + std::ifstream order_file(path / ".knarcorder"); + if (order_file) + { + if (debug) + { + cerr << "DEBUG: knarcorder file exists" << endl; + } + // read the filenames in the order file and add the corresponding directory entries to the ordered files vector + std::string filename; + while (std::getline(order_file, filename)) + { + fs::path file_path = path / filename; + if (fs::exists(file_path)) + { + if (debug) + { + cerr << "DEBUG: knarcorder file: " << file_path << endl; + } + ordered_files.push_back(fs::directory_entry(file_path)); + } + } + } + } + + // if recursive flag is set, search for knarcorder files in subdirectories and process them recursively + if (recursive) + { + for (auto &entry : fs::directory_iterator(path)) + { + if (entry.is_directory()) + { + std::vector subdirectory_files = + KnarcOrderDirectoryIterator(entry.path(), true); + ordered_files.insert( + ordered_files.end(), subdirectory_files.begin(), subdirectory_files.end()); + } + } + } + + // add the remaining files in alphabetical order + for (auto& entry : fs::directory_iterator(path)) + { + if (entry.is_regular_file() && entry.path().filename() != ".knarcorder") + { + if (std::find(ordered_files.begin(), ordered_files.end(), entry) == ordered_files.end()) + { + unordered_files.push_back(entry); + } + } + } + std::sort(unordered_files.begin(), unordered_files.end(), + [](const fs::directory_entry& a, const fs::directory_entry& b) + { + // I fucking hate C++ + string aStr = a.path().filename().string(); + string bStr = b.path().filename().string(); + + for (size_t i = 0; i < aStr.size(); ++i) + { + aStr[i] = tolower(aStr[i]); + } + + for (size_t i = 0; i < bStr.size(); ++i) + { + bStr[i] = tolower(bStr[i]); + } + + return aStr < bStr; + }); + ordered_files.insert(ordered_files.end(), unordered_files.begin(), unordered_files.end()); + + return ordered_files; +} + +vector Narc::OrderedDirectoryIterator(const fs::path& path, bool recursive) const +{ + vector v; + + for (const auto& de : fs::directory_iterator(path)) + { + v.push_back(de); + } + + sort(v.begin(), v.end(), [](const fs::directory_entry& a, const fs::directory_entry& b) + { + // I fucking hate C++ + string aStr = a.path().filename().string(); + string bStr = b.path().filename().string(); + + for (size_t i = 0; i < aStr.size(); ++i) + { + aStr[i] = tolower(aStr[i]); + } + + for (size_t i = 0; i < bStr.size(); ++i) + { + bStr[i] = tolower(bStr[i]); + } + + return aStr < bStr; + }); + + if (recursive) + { + size_t vSize = v.size(); + + for (size_t i = 0; i < vSize; ++i) + { + if (is_directory(v[i])) + { + vector temp = OrderedDirectoryIterator(v[i], true); + + v.insert(v.end(), temp.begin(), temp.end()); + } + } + } + + return v; +} + +NarcError Narc::GetError() const +{ + return error; +} + +class WildcardVector : public vector { +public: + WildcardVector(fs::path fp) { + fstream infile; + if (!fs::exists(fp)) return; + infile.open(fp, ios_base::in); + string line; + while (getline(infile, line)) { + if (!line.empty()) + { + // strip CR + size_t i; + for (i = line.size() - 1; line[i] == '\r'; i--) + ; + if (i < line.size() - 1) + line.erase(i + 1); + push_back(line); + } + } + } + bool matches(string fp) { + for (string& pattern : *this) { + if (fnmatch(pattern.c_str(), fp.c_str(), FNM_PERIOD) == 0) + return true; + } + return false; + } +}; + +bool Narc::Pack(const fs::path& fileName, const fs::path& directory) +{ + ofstream ofs(fileName, ios::binary); + + if (!ofs.good()) { return Cleanup(ofs, NarcError::InvalidOutputFile); } + + ofstream ofhs; + string stem; + string stem_upper; + // Pikalax 29 May 2021 + // Output an includable header that enumerates the NARC contents + if (output_header) + { + fs::path naixfname = fileName; + naixfname.replace_extension(".naix"); + + ofhs.open(naixfname); + if (!ofhs.good()) + { + ofhs.close(); + return Cleanup(ofs, NarcError::InvalidOutputFile); + } + + stem = fileName.stem().string(); + stem_upper = stem; + for (char &c : stem_upper) + { c = toupper(c); } + + ofhs << "/*\n" + " * THIS FILE WAS AUTOMATICALLY\n" + " * GENERATED BY tools/knarc\n" + " * DO NOT MODIFY!!!\n" + " */\n" + "\n" + "#ifndef NARC_" << stem_upper << "_NAIX_\n" + "#define NARC_" << stem_upper << "_NAIX_\n" + "\n" + "enum {\n"; + } + vector fatEntries; + uint16_t directoryCounter = 1; + + WildcardVector ignore_patterns(directory / ".knarcignore"); + ignore_patterns.push_back(".*ignore"); + ignore_patterns.push_back(".*keep"); + ignore_patterns.push_back(".*order"); + WildcardVector keep_patterns(directory / ".knarckeep"); + + int memberNo = 0; + for (const auto& de : KnarcOrderDirectoryIterator(directory, true)) + { + if (is_directory(de)) + { + ++directoryCounter; + } + else if (keep_patterns.matches(de.path().filename().string()) || !ignore_patterns.matches(de.path().filename().string())) + { + if (debug) { + cerr << "DEBUG: adding file " << de.path() << endl; + } + if (output_header) + { + string de_stem = de.path().filename().string(); + std::replace(de_stem.begin(), de_stem.end(), '.', '_'); + ofhs << "\tNARC_" << stem << "_" << de_stem << " = " << (memberNo++) << ",\n"; + } + fatEntries.push_back(FileAllocationTableEntry + { + .Start = 0x0, + .End = 0x0 + }); + + if (fatEntries.size() > 1) + { + fatEntries.back().Start = fatEntries.rbegin()[1].End; + + if ((fatEntries.rbegin()[1].End % 4) != 0) + { + fatEntries.back().Start += 4 - (fatEntries.rbegin()[1].End % 4); + } + } + + fatEntries.back().End = fatEntries.back().Start + static_cast(file_size(de)); + } + } + if (output_header) + { + ofhs << "};\n\n#endif //NARC_" << stem_upper << "_NAIX_\n"; + ofhs.close(); + } + + FileAllocationTable fat + { + .Id = 0x46415442, // BTAF + .ChunkSize = static_cast(sizeof(FileAllocationTable) + ((uint32_t)fatEntries.size() * sizeof(FileAllocationTableEntry))), + .FileCount = static_cast(fatEntries.size()), + .Reserved = 0x0 + }; + + map subTables; + vector paths; + + directoryCounter = 0; + + for (const auto& de : KnarcOrderDirectoryIterator(directory, true)) + { + if (!subTables.count(de.path().parent_path()) && (keep_patterns.matches(de.path().filename().string()) || !ignore_patterns.matches(de.path().filename().string()))) + { + subTables.insert({ de.path().parent_path(), "" }); + paths.push_back(de.path().parent_path()); + } + + if (is_directory(de)) + { + ++directoryCounter; + + subTables[de.path().parent_path()] += static_cast(0x80 + de.path().filename().string().size()); + subTables[de.path().parent_path()] += de.path().filename().string(); + subTables[de.path().parent_path()] += (0xF000 + directoryCounter) & 0xFF; + subTables[de.path().parent_path()] += (0xF000 + directoryCounter) >> 8; + } + else if (keep_patterns.matches(de.path().filename().string()) || !ignore_patterns.matches(de.path().filename().string())) + { + subTables[de.path().parent_path()] += static_cast(de.path().filename().string().size()); + subTables[de.path().parent_path()] += de.path().filename().string(); + } + } + + for (auto& subTable : subTables) + { + subTable.second += '\0'; + } + + vector fntEntries; + + if (!pack_no_fnt) + { + fntEntries.push_back( + { + .Offset = static_cast((directoryCounter + 1) * sizeof(FileNameTableEntry)), + .FirstFileId = 0x0, + .Utility = static_cast(directoryCounter + 1) + }); + + for (uint16_t i = 0; i < directoryCounter; ++i) + { + fntEntries.push_back( + { + .Offset = static_cast(fntEntries.back().Offset + subTables[paths[i]].size()), + .FirstFileId = fntEntries.back().FirstFileId, + .Utility = 0x0 + }); + + for (size_t j = 0; j < (subTables[paths[i]].size() - 1); ++j) + { + if (static_cast(subTables[paths[i]][j]) <= 0x7F) + { + j += static_cast(subTables[paths[i]][j]); + ++fntEntries.back().FirstFileId; + } + else if (static_cast(subTables[paths[i]][j]) <= 0xFF) + { + j += static_cast(subTables[paths[i]][j]) - 0x80 + 0x2; + } + } + + fntEntries.back().Utility = 0xF000 + (find(paths.begin(), paths.end(), paths[i + 1].parent_path()) - paths.begin()); + } + } + else + { + fntEntries.push_back( + { + .Offset = 0x4, + .FirstFileId = 0x0, + .Utility = 0x1 + }); + } + + FileNameTable fnt + { + .Id = 0x464E5442, // BTNF + .ChunkSize = static_cast(sizeof(FileNameTable) + (fntEntries.size() * sizeof(FileNameTableEntry))) + }; + + if (!pack_no_fnt) + { + for (const auto& subTable : subTables) + { + fnt.ChunkSize += subTable.second.size(); + } + } + + if ((fnt.ChunkSize % 4) != 0) + { + fnt.ChunkSize += 4 - (fnt.ChunkSize % 4); + } + + FileImages fi + { + .Id = 0x46494D47, // GMIF + .ChunkSize = static_cast(sizeof(FileImages) + (fatEntries.empty() ? 0 : fatEntries.back().End)) + }; + + if ((fi.ChunkSize % 4) != 0) + { + fi.ChunkSize += 4 - (fi.ChunkSize % 4); + } + + Header header + { + .Id = 0x4352414E, // NARC + .ByteOrderMark = 0xFFFE, + .Version = 0x100, + .FileSize = static_cast(sizeof(Header) + fat.ChunkSize + fnt.ChunkSize + fi.ChunkSize), + .ChunkSize = sizeof(Header), + .ChunkCount = 0x3 + }; + + ofs.write(reinterpret_cast(&header), sizeof(Header)); + ofs.write(reinterpret_cast(&fat), sizeof(FileAllocationTable)); + + for (auto& entry : fatEntries) + { + ofs.write(reinterpret_cast(&entry), sizeof(FileAllocationTableEntry)); + } + + ofs.write(reinterpret_cast(&fnt), sizeof(FileNameTable)); + + for (auto& entry : fntEntries) + { + ofs.write(reinterpret_cast(&entry), sizeof(FileNameTableEntry)); + } + + if (!pack_no_fnt) + { + for (const auto& path : paths) + { + ofs << subTables[path]; + } + } + + AlignDword(ofs, 0xFF); + + ofs.write(reinterpret_cast(&fi), sizeof(FileImages)); + + for (const auto& de : KnarcOrderDirectoryIterator(directory, true)) + { + if (is_directory(de)) + { + continue; + } + + if (!(keep_patterns.matches(de.path().filename().string()) || !ignore_patterns.matches(de.path().filename().string()))) + { + continue; + } + + ifstream ifs(de.path(), ios::binary | ios::ate); + + if (!ifs.good()) + { + ifs.close(); + + return Cleanup(ofs, NarcError::InvalidInputFile); + } + + streampos length = ifs.tellg(); + unique_ptr buffer = make_unique(static_cast(length)); + + ifs.seekg(0); + ifs.read(buffer.get(), length); + ifs.close(); + + ofs.write(buffer.get(), length); + + AlignDword(ofs, 0xFF); + } + + ofs.close(); + + return error == NarcError::None ? true : false; +} + +bool Narc::Unpack(const fs::path& fileName, const fs::path& directory) +{ + ifstream ifs(fileName, ios::binary); + + if (!ifs.good()) { return Cleanup(ifs, NarcError::InvalidInputFile); } + + Header header; + ifs.read(reinterpret_cast(&header), sizeof(Header)); + + if (header.Id != 0x4352414E) { return Cleanup(ifs, NarcError::InvalidHeaderId); } + if (header.ByteOrderMark != 0xFFFE) { return Cleanup(ifs, NarcError::InvalidByteOrderMark); } + if ((header.Version != 0x0100) && (header.Version != 0x0000)) { return Cleanup(ifs, NarcError::InvalidVersion); } + if (header.ChunkSize != 0x10) { return Cleanup(ifs, NarcError::InvalidHeaderSize); } + if (header.ChunkCount != 0x3) { return Cleanup(ifs, NarcError::InvalidChunkCount); } + + FileAllocationTable fat; + ifs.read(reinterpret_cast(&fat), sizeof(FileAllocationTable)); + + if (fat.Id != 0x46415442) { return Cleanup(ifs, NarcError::InvalidFileAllocationTableId); } + if (fat.Reserved != 0x0) { return Cleanup(ifs, NarcError::InvalidFileAllocationTableReserved); } + + unique_ptr fatEntries = make_unique(fat.FileCount); + + for (uint16_t i = 0; i < fat.FileCount; ++i) + { + ifs.read(reinterpret_cast(&fatEntries.get()[i]), sizeof(FileAllocationTableEntry)); + } + + FileNameTable fnt; + vector FileNameTableEntries; + ifs.read(reinterpret_cast(&fnt), sizeof(FileNameTable)); + + if (fnt.Id != 0x464E5442) { return Cleanup(ifs, NarcError::InvalidFileNameTableId); } + + vector fntEntries; + + do + { + fntEntries.push_back(FileNameTableEntry()); + + ifs.read(reinterpret_cast(&fntEntries.back().Offset), sizeof(uint32_t)); + ifs.read(reinterpret_cast(&fntEntries.back().FirstFileId), sizeof(uint16_t)); + ifs.read(reinterpret_cast(&fntEntries.back().Utility), sizeof(uint16_t)); + } while (static_cast(ifs.tellg()) < (header.ChunkSize + fat.ChunkSize + sizeof(FileNameTable) + fntEntries[0].Offset)); + + unique_ptr fileNames = make_unique(0xFFFF); + + for (size_t i = 0; i < fntEntries.size(); ++i) + { + ifs.seekg(static_cast(header.ChunkSize) + fat.ChunkSize + sizeof(FileNameTable) + fntEntries[i].Offset); + + uint16_t fileId = 0x0000; + + for (uint8_t length = 0x80; length != 0x00; ifs.read(reinterpret_cast(&length), sizeof(uint8_t))) + { + if (length <= 0x7F) + { + for (uint8_t j = 0; j < length; ++j) + { + uint8_t c; + ifs.read(reinterpret_cast(&c), sizeof(uint8_t)); + + fileNames.get()[fntEntries[i].FirstFileId + fileId] += c; + } + + ++fileId; + } + else if (length == 0x80) + { + // Reserved + } + else if (length <= 0xFF) + { + length -= 0x80; + string directoryName; + + for (uint8_t j = 0; j < length; ++j) + { + uint8_t c; + ifs.read(reinterpret_cast(&c), sizeof(uint8_t)); + + directoryName += c; + } + + uint16_t directoryId; + ifs.read(reinterpret_cast(&directoryId), sizeof(uint16_t)); + + fileNames.get()[directoryId] = directoryName; + } + else + { + return Cleanup(ifs, NarcError::InvalidFileNameTableEntryId); + } + } + } + + if ((ifs.tellg() % 4) != 0) + { + ifs.seekg(4 - (ifs.tellg() % 4), ios::cur); + } + + FileImages fi; + ifs.read(reinterpret_cast(&fi), sizeof(FileImages)); + + if (fi.Id != 0x46494D47) { return Cleanup(ifs, NarcError::InvalidFileImagesId); } + + fs::create_directory(directory); + fs::current_path(directory); + + if (fnt.ChunkSize == 0x10) + { + for (uint16_t i = 0; i < fat.FileCount; ++i) + { + ifs.seekg(static_cast(header.ChunkSize) + fat.ChunkSize + fnt.ChunkSize + 8 + fatEntries.get()[i].Start); + + unique_ptr buffer = make_unique(fatEntries.get()[i].End - fatEntries.get()[i].Start); + ifs.read(buffer.get(), fatEntries.get()[i].End - fatEntries.get()[i].Start); + + ostringstream oss; + oss << fileName.stem().string() << "_" << setfill('0') << setw(8) << i << ".bin"; + + ofstream ofs(oss.str(), ios::binary); + + if (!ofs.good()) + { + ofs.close(); + + return Cleanup(ifs, NarcError::InvalidOutputFile); + } + + ofs.write(buffer.get(), fatEntries.get()[i].End - fatEntries.get()[i].Start); + ofs.close(); + } + } + else + { + fs::path absolutePath = fs::absolute(fs::current_path()); + + for (size_t i = 0; i < fntEntries.size(); ++i) + { + fs::current_path(absolutePath); + stack directories; + + for (uint16_t j = fntEntries[i].Utility; j > 0xF000; j = fntEntries[j - 0xF000].Utility) + { + directories.push(fileNames.get()[j]); + } + + for (; !directories.empty(); directories.pop()) + { + fs::create_directory(directories.top()); + fs::current_path(directories.top()); + } + + if (fntEntries[i].Utility >= 0xF000) + { + fs::create_directory(fileNames.get()[0xF000 + i]); + fs::current_path(fileNames.get()[0xF000 + i]); + } + + ifs.seekg(static_cast(header.ChunkSize) + fat.ChunkSize + sizeof(FileNameTable) + fntEntries[i].Offset); + + uint16_t fileId = 0x0000; + + for (uint8_t length = 0x80; length != 0x00; ifs.read(reinterpret_cast(&length), sizeof(uint8_t))) + { + if (length <= 0x7F) + { + streampos savedPosition = ifs.tellg(); + + ifs.seekg(static_cast(header.ChunkSize) + fat.ChunkSize + fnt.ChunkSize + 8 + fatEntries.get()[fntEntries[i].FirstFileId + fileId].Start); + + unique_ptr buffer = make_unique(fatEntries.get()[fntEntries[i].FirstFileId + fileId].End - fatEntries.get()[fntEntries[i].FirstFileId + fileId].Start); + ifs.read(buffer.get(), fatEntries.get()[fntEntries[i].FirstFileId + fileId].End - fatEntries.get()[fntEntries[i].FirstFileId + fileId].Start); + + ofstream ofs(fileNames.get()[fntEntries[i].FirstFileId + fileId], ios::binary); + + if (!ofs.good()) + { + ofs.close(); + + return Cleanup(ifs, NarcError::InvalidOutputFile); + } + + ofs.write(buffer.get(), fatEntries.get()[fntEntries[i].FirstFileId + fileId].End - fatEntries.get()[fntEntries[i].FirstFileId + fileId].Start); + ofs.close(); + + ifs.seekg(savedPosition); + ifs.seekg(length, ios::cur); + + ++fileId; + } + else if (length == 0x80) + { + // Reserved + } + else if (length <= 0xFF) + { + ifs.seekg(static_cast(length) - 0x80 + 0x2, ios::cur); + } + else + { + return Cleanup(ifs, NarcError::InvalidFileNameTableEntryId); + } + } + } + } + + ifs.close(); + + return error == NarcError::None ? true : false; +} diff --git a/tools/knarc/Narc.h b/tools/knarc/Narc.h new file mode 100644 index 00000000..ed0504f9 --- /dev/null +++ b/tools/knarc/Narc.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include +#include +#include + +#if (__cplusplus < 201703L) +#include +namespace fs = std::experimental::filesystem; +#else +#include +namespace fs = std::filesystem; +#endif + +enum class NarcError +{ + None, + InvalidInputFile, + InvalidHeaderId, + InvalidByteOrderMark, + InvalidVersion, + InvalidHeaderSize, + InvalidChunkCount, + InvalidFileAllocationTableId, + InvalidFileAllocationTableReserved, + InvalidFileNameTableId, + InvalidFileNameTableEntryId, + InvalidFileImagesId, + InvalidOutputFile +}; + +struct Header +{ + uint32_t Id; + uint16_t ByteOrderMark; + uint16_t Version; + uint32_t FileSize; + uint16_t ChunkSize; + uint16_t ChunkCount; +}; + +struct FileAllocationTable +{ + uint32_t Id; + uint32_t ChunkSize; + uint16_t FileCount; + uint16_t Reserved; +}; + +struct FileAllocationTableEntry +{ + uint32_t Start; + uint32_t End; +}; + +struct FileNameTable +{ + uint32_t Id; + uint32_t ChunkSize; +}; + +struct FileNameTableEntry +{ + uint32_t Offset; + uint16_t FirstFileId; + uint16_t Utility; +}; + +struct FileImages +{ + uint32_t Id; + uint32_t ChunkSize; +}; + +class Narc +{ +public: + NarcError GetError() const; + + bool Pack(const fs::path& fileName, const fs::path& directory); + bool Unpack(const fs::path& fileName, const fs::path& directory); + +private: + NarcError error = NarcError::None; + + void AlignDword(std::ofstream& ofs, uint8_t paddingChar); + + bool Cleanup(std::ifstream& ifs, const NarcError& e); + bool Cleanup(std::ofstream& ofs, const NarcError& e); + + std::vector KnarcOrderDirectoryIterator(const fs::path& path, bool recursive) const; + std::vector OrderedDirectoryIterator(const fs::path& path, bool recursive) const; +}; diff --git a/tools/knarc/Source.cpp b/tools/knarc/Source.cpp new file mode 100644 index 00000000..587c8527 --- /dev/null +++ b/tools/knarc/Source.cpp @@ -0,0 +1,150 @@ +#include +#include +#include + +#include "Narc.h" + +using namespace std; + +bool debug = false; +bool pack_no_fnt = true; +bool output_header = false; + +void PrintError(NarcError error) +{ + switch (error) + { + case NarcError::None: cout << "ERROR: No error???" << endl; break; + case NarcError::InvalidInputFile: cout << "ERROR: Invalid input file" << endl; break; + case NarcError::InvalidHeaderId: cout << "ERROR: Invalid header ID" << endl; break; + case NarcError::InvalidByteOrderMark: cout << "ERROR: Invalid byte order mark" << endl; break; + case NarcError::InvalidVersion: cout << "ERROR: Invalid NARC version" << endl; break; + case NarcError::InvalidHeaderSize: cout << "ERROR: Invalid header size" << endl; break; + case NarcError::InvalidChunkCount: cout << "ERROR: Invalid chunk count" << endl; break; + case NarcError::InvalidFileAllocationTableId: cout << "ERROR: Invalid file allocation table ID" << endl; break; + case NarcError::InvalidFileAllocationTableReserved: cout << "ERROR: Invalid file allocation table reserved section" << endl; break; + case NarcError::InvalidFileNameTableId: cout << "ERROR: Invalid file name table ID" << endl; break; + case NarcError::InvalidFileNameTableEntryId: cout << "ERROR: Invalid file name table entry ID" << endl; break; + case NarcError::InvalidFileImagesId: cout << "ERROR: Invalid file images ID" << endl; break; + case NarcError::InvalidOutputFile: cout << "ERROR: Invalid output file" << endl; break; + default: cout << "ERROR: Unknown error???" << endl; break; + } +} + +static inline void usage() { + cout << "OVERVIEW: Knarc" << endl << endl; + cout << "USAGE: knarc [options] -d DIRECTORY [-p TARGET | -u SOURCE]" << endl << endl; + cout << "OPTIONS:" << endl; + cout << "\t-d DIRECTORY\tDirectory to pack from/unpack to" << endl; + cout << "\t-p TARGET\tPack to the target NARC" << endl; + cout << "\t-u SOURCE\tUnpack from the source NARC" << endl; + cout << "\t-n\tBuild the filename table (default: discards filenames)" << endl; + cout << "\t-D/--debug\tPrint additional debug messages" << endl; + cout << "\t-h/--help\tPrint this message and exit" << endl; + cout << "\t-i\tOutput a .naix header" << endl; +} + +int main(int argc, char* argv[]) +{ + string directory = ""; + string fileName = ""; + bool pack = false; + + for (int i = 1; i < argc; ++i) + { + if (!strcmp(argv[i], "-d")) + { + if (i == (argc - 1)) + { + cerr << "ERROR: No directory specified" << endl; + + return 1; + } + + if (!directory.empty()) { + cerr << "ERROR: Multiple directories specified" << endl; + return 1; + } + directory = argv[++i]; + } + else if (!strcmp(argv[i], "-p")) + { + if (i == (argc - 1)) + { + cerr << "ERROR: No NARC specified to pack to" << endl; + + return 1; + } + + if (!fileName.empty()) { + cerr << "ERROR: Multiple files specified" << endl; + return 1; + } + fileName = argv[++i]; + pack = true; + } + else if (!strcmp(argv[i], "-u")) + { + if (i == (argc - 1)) + { + cerr << "ERROR: No NARC specified to unpack from" << endl; + + return 1; + } + + if (!fileName.empty()) { + cerr << "ERROR: Multiple files specified" << endl; + return 1; + } + fileName = argv[++i]; + } else if (!strcmp(argv[i], "-D") || !strcmp(argv[i], "--debug")) { + debug = true; + } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { + usage(); + return 0; + } + else if (!strcmp(argv[i], "-n")) { + pack_no_fnt = false; + } + else if (!strcmp(argv[i], "-i")) { + output_header = true; + } + else { + usage(); + cerr << "ERROR: Unrecognized argument: " << argv[i] << endl; + return 1; + } + } + + if (fileName.empty()) { + cerr << "ERROR: Missing -u or -p" << endl; + return 1; + } + if (directory.empty()) { + cerr << "ERROR: Missing -d" << endl; + return 1; + } + + Narc narc; + + if (pack) + { + if (!narc.Pack(fileName, directory)) + { + PrintError(narc.GetError()); + + return 1; + } + } + else + { + if (!narc.Unpack(fileName, directory)) + { + PrintError(narc.GetError()); + + return 1; + } + } + + return 0; +} diff --git a/tools/knarc/fnmatch.c b/tools/knarc/fnmatch.c new file mode 100644 index 00000000..6ba0a871 --- /dev/null +++ b/tools/knarc/fnmatch.c @@ -0,0 +1,219 @@ +/* Copyright (C) 1991-2018 Free Software Foundation, Inc. + +NOTE: This source is derived from an old version taken from the GNU C +Library (glibc). + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#if defined (CONFIG_BROKETS) +/* We use instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because it found this file in $srcdir). */ +#include +#else +#include "config.h" +#endif +#endif + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +/* This code to undef const added in libiberty. */ +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include "fnmatch.h" + +#include + + /* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS) +extern int errno; +#endif + +/* Match STRING against the filename pattern PATTERN, returning zero if + it matches, nonzero if not. */ +int +fnmatch(const char* pattern, const char* string, int flags) +{ + register const char* p = pattern, * n = string; + register unsigned char c; + +#define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c)) + + while ((c = *p++) != '\0') + { + c = FOLD(c); + + switch (c) + { + case '?': + if (*n == '\0') + return FNM_NOMATCH; + else if ((flags & FNM_FILE_NAME) && *n == '/') + return FNM_NOMATCH; + else if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + break; + + case '\\': + if (!(flags & FNM_NOESCAPE)) + { + c = *p++; + c = FOLD(c); + } + if (FOLD((unsigned char)*n) != c) + return FNM_NOMATCH; + break; + + case '*': + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + for (c = *p++; c == '?' || c == '*'; c = *p++, ++n) + if (((flags & FNM_FILE_NAME) && *n == '/') || + (c == '?' && *n == '\0')) + return FNM_NOMATCH; + + if (c == '\0') + return 0; + + { + unsigned char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; + c1 = FOLD(c1); + for (--p; *n != '\0'; ++n) + if ((c == '[' || FOLD((unsigned char)*n) == c1) && + fnmatch(p, n, flags & ~FNM_PERIOD) == 0) + return 0; + return FNM_NOMATCH; + } + + case '[': + { + /* Nonzero if the sense of the character class is inverted. */ + register int negate; + + if (*n == '\0') + return FNM_NOMATCH; + + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + negate = (*p == '!' || *p == '^'); + if (negate) + ++p; + + c = *p++; + for (;;) + { + register unsigned char cstart = c, cend = c; + + if (!(flags & FNM_NOESCAPE) && c == '\\') + cstart = cend = *p++; + + cstart = cend = FOLD(cstart); + + if (c == '\0') + /* [ (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + c = FOLD(c); + + if ((flags & FNM_FILE_NAME) && c == '/') + /* [/] can never match. */ + return FNM_NOMATCH; + + if (c == '-' && *p != ']') + { + cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + cend = FOLD(cend); + + c = *p++; + } + + if (FOLD((unsigned char)*n) >= cstart + && FOLD((unsigned char)*n) <= cend) + goto matched; + + if (c == ']') + break; + } + if (!negate) + return FNM_NOMATCH; + break; + + matched:; + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { + if (c == '\0') + /* [... (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + if (!(flags & FNM_NOESCAPE) && c == '\\') + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; + } + if (negate) + return FNM_NOMATCH; + } + break; + + default: + if (c != FOLD((unsigned char)*n)) + return FNM_NOMATCH; + } + + ++n; + } + + if (*n == '\0') + return 0; + + if ((flags & FNM_LEADING_DIR) && *n == '/') + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; + + return FNM_NOMATCH; +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/tools/knarc/fnmatch.h b/tools/knarc/fnmatch.h new file mode 100644 index 00000000..508c59a7 --- /dev/null +++ b/tools/knarc/fnmatch.h @@ -0,0 +1,70 @@ +/* Copyright (C) 1991-2020 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef _FNMATCH_H + +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) +#undef __P +#define __P(args) args +#else /* Not C++ or ANSI C. */ +#undef __P +#define __P(args) () + /* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + + + /* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in . */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + + /* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) +#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* Match STRING against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ + extern int fnmatch __P((const char* __pattern, const char* __string, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/tools/m2ctx/README.md b/tools/m2ctx/README.md new file mode 100644 index 00000000..bafa45ed --- /dev/null +++ b/tools/m2ctx/README.md @@ -0,0 +1,31 @@ +# Generate a context file for decomp.me + +[Decomp.me](https://decomp.me) requires a context file declaring any imported typedefs, structs, or constants that will be used in the decompiled function. +`m2ctx` generates this context file automatically. + +## How to use + +Before using `m2ctx`, follow the [installation instructions](../../INSTALL.md) to make a vanilla copy of the game. +This generates some header files that may be included in decompiled files. + +In this example, you are decompiling an asm file `asm/npc_trade.s` into a new C file `src/npc_trade.c`. +You've created the source file and may have added some imports you know you'll need. +Your file may look like this: + +``` +#include "pokemon.h" +``` + +Run `./tools/m2ctx/m2ctx.sh src/npc_trade.c` to generate a context file, which will be output as `ctx.c`. +Copy the contents of `ctx.c` into the "Context" section of the scratch. + +### Adding imports + +As you continue decompiling, you may realize that you need to add imports to your source file: +```diff +#include "pokemon.h" ++#include "party.h" +``` + +You can use `m2ctx` to generate an updated context file which will include declarations from the new imports. +Simply re-run the command to generate a new context file: `./tools/m2ctx/m2ctx.sh src/npc_trade.c`. diff --git a/tools/m2ctx/m2ctx.sh b/tools/m2ctx/m2ctx.sh new file mode 100755 index 00000000..9308b435 --- /dev/null +++ b/tools/m2ctx/m2ctx.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +OUT_FILE=ctx.c + +GCC=gcc +FLAGS="-E -P -dD -undef" +INCLUDES="-Iinclude -Iinclude/library -Ifiles -Ilib/include -include global.h" +DEFINES="-DGAME_REMASTER=0 -DENGLISH -DPM_KEEP_ASSERTS -DSDK_ARM9 -DSDK_CODE_ARM -DSDK_FINALROM" + + +generate-ctx () { + # Remove any line containing a predefined macro. If not removed, mwccarm + # generates compiler warnings. + grep "^#include " "$1" | $GCC $FLAGS $INCLUDES $DEFINES -x c - | sed '/__STDC__\|__STDC_VERSION__\|__STDC_VERSION__\|__STDC_HOSTED__/d' > $OUT_FILE +} + +usage () { + echo "Generate a context file for decomp.me." + echo "Usage: $0 [-h] [FILEPATH]" + echo "" + echo "Arguments:" + echo " FILEPATH Source file used to generate ctx.c" + echo "" + echo "Options:" + echo " -h Show this message and exit" +} + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h) + usage + exit 0 + ;; + *) + generate-ctx "$1" + exit 0 + ;; + esac +done diff --git a/tools/mod123encry/.gitignore b/tools/mod123encry/.gitignore new file mode 100644 index 00000000..5a50aa8e --- /dev/null +++ b/tools/mod123encry/.gitignore @@ -0,0 +1 @@ +mod123encry diff --git a/tools/mod123encry/CryptoRc4.cpp b/tools/mod123encry/CryptoRc4.cpp new file mode 100644 index 00000000..1cea134a --- /dev/null +++ b/tools/mod123encry/CryptoRc4.cpp @@ -0,0 +1,63 @@ +#include "CryptoRc4.h" + +u8 CryptoRC4Context::GetEncodedByte() { + i = (++i) & 0xFF; + u8 x = s[i]; + j = (j + x) & 0xFF; + u8 y = s[j]; + s[j] = x; + s[i] = y; + return s[(x + y) & 0xFF]; +} + +void CryptoRC4Context::Decrypt(u32 *start, u32 *end) { + // assert (!(size & 3)); + u8 buffer[256]; + for (int _i = 0; _i < 256; _i++) { + buffer[_i] = _i ^ 1; + } + for (; start < end; start++) { + u32 &word = *start; + switch (GetInsnType(word)) { + case 1: + case 2: + word = (((word & ~0xFF000000) - 0x1300) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + case 3: + word = (((word & ~0xFF000000) - 0x4C2) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + default: + u8 *bytes = (u8 *)&word; + bytes[0] ^= GetEncodedByte(); + bytes[1] ^= GetEncodedByte(); + bytes[2] = buffer[bytes[2]]; + break; + } + } +} + +void CryptoRC4Context::Encrypt(u32 *start, u32 *end) { + // assert (!(size & 3)); + u8 buffer[256]; + for (int _i = 0; _i < 256; _i++) { + buffer[_i] = _i ^ 1; + } + for (; start < end; start++) { + u32 &word = *start; + switch (GetInsnType(word)) { + case 1: + case 2: + word = (((word & ~0xFF000000) + 0x4C2) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + case 3: + word = (((word & ~0xFF000000) + 0x1300) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + default: + u8 *bytes = (u8 *)&word; + bytes[0] ^= GetEncodedByte(); + bytes[1] ^= GetEncodedByte(); + bytes[2] = buffer[bytes[2]]; + break; + } + } +} diff --git a/tools/mod123encry/CryptoRc4.h b/tools/mod123encry/CryptoRc4.h new file mode 100644 index 00000000..169bae24 --- /dev/null +++ b/tools/mod123encry/CryptoRc4.h @@ -0,0 +1,52 @@ +#ifndef GUARD_CRYPTORC4_H +#define GUARD_CRYPTORC4_H + +#include "ntrtypes.h" + +static inline int GetInsnType(u32 value) { + u8 highByte = (value >> 24) & 0xFF; + if ((highByte & 0xE) == 0xA) { + if ((highByte & 0xF0) == 0xF0) + return 1; + else if (highByte & 1) + return 2; + else + return 3; + } + return 0; +} + +class CryptoRC4Context { + u32 i; + u32 j; + u8 s[256]; + + u8 GetEncodedByte(); + +public: + CryptoRC4Context() { + i = 0; + j = 0; + for (int _i = 0; _i < 256; _i++) { + s[_i] = _i; + } + } + CryptoRC4Context(const u8 *keys) : CryptoRC4Context() { + int key_i = 0; + int s_i = 0; + for (int s_j = 255; s_j >= 0; s_j--) { + u8 s_k = s[s_j]; + s_i = (s_i + keys[key_i++] + s_k) & 0xFF; + u8 s_l = s[s_i]; + if (key_i >= 16) + key_i = 0; + s[s_i] = s_k; + s[s_j] = s_l; + } + } + void Decrypt(u32 *start, u32 *end); + void Encrypt(u32 *start, u32 *end); +}; + + +#endif //GUARD_CRYPTORC4_H diff --git a/tools/mod123encry/Decrypt.cpp b/tools/mod123encry/Decrypt.cpp new file mode 100644 index 00000000..5a4ba4d2 --- /dev/null +++ b/tools/mod123encry/Decrypt.cpp @@ -0,0 +1,126 @@ +#include +#include "Decrypt.h" +#include "CryptoRc4.h" + +u32 Decryptor::FindDecryLvl2(u32 offset) { + offset = (offset + 3) & ~3; // round up + static const u8 pattern1[] = { + 0xf0, 0x00, 0x2d, 0xe9, 0x0f, 0x00, 0x2d, 0xe9, 0xf0, 0x00, 0xbd, 0xe8, 0x60, 0x10, 0x9f, 0xe5, + 0x50, 0x30, 0x8f, 0xe2, 0x00, 0xe0, 0x83, 0xe5, 0x4c, 0x20, 0x9f, 0xe5, 0x4c, 0x00, 0x9f, 0xe5, + }; // size=32 + static const u8 pattern2[] = { + 0x00, 0xc0, 0xa0, 0xe1, 0xf0, 0x00, 0x2d, 0xe9, 0x0f, 0x00, 0xbd, 0xe8, + 0xf0, 0x00, 0xbd, 0xe8, 0x3c, 0xff, 0x2f, 0xe1, 0x10, 0x00, 0x2d, 0xe9, 0x00, 0x40, 0xa0, 0xe1, + 0x2c, 0x10, 0x9f, 0xe5, 0x20, 0x20, 0x9f, 0xe5, 0x20, 0x00, 0x9f, 0xe5, + }; // size=40 + static const u8 pattern3[] = { + 0x18, 0x00, 0x8f, 0xe5, 0x04, 0x00, 0xa0, 0xe1, 0x10, 0x00, 0xbd, 0xe8, 0x04, 0xe0, 0x9f, 0xe5, + 0x00, 0xf0, 0x8f, 0xe5, 0x1e, 0xff, 0x2f, 0xe1 + }; // size=24 + + for (int i = offset; i < data.size() - sizeof(pattern1) - sizeof(pattern2) - sizeof(pattern3) - 8; i += 4) { + if (memcmp(&data[i], pattern1, sizeof(pattern1)) == 0 + && memcmp(&data[i + sizeof(pattern1) + 4], pattern2, sizeof(pattern2)) == 0 + && memcmp(&data[i + sizeof(pattern1) + sizeof(pattern2) + 8], pattern3, sizeof(pattern3)) == 0) { + return i; + } + } + return data.size(); +} + +u32 Decryptor::DoDecryptLvl2(u32 tableOffset) { + u32 *pool = (u32 *)&data[tableOffset + 104]; + pool[1] -= info.start + info.size + 0x1300; + pool[2] -= info.start + info.size + 0x1300; + pool[3] -= 0x1300; + u32 param = pool[2]; + u32 start = pool[3]; + u32 size = pool[1]; + u32 keys[4] = { + size ^ param, + size ^ ((param << 8) | (param >> 24)), + size ^ ((param << 16) | (param >> 16)), + size ^ ((param << 24) | (param >> 8)), + }; + CryptoRC4Context buffer((const u8 *)keys); + buffer.Decrypt((u32 *) &data[start - info.start], (u32 *) &data[start + size - info.start]); + return tableOffset + 120; +} + +void Decryptor::DecryptLvl2() { + u32 i = 0; + while ((i = FindDecryLvl2(i)) != data.size()) { + i = DoDecryptLvl2(i); + } +} + +u32 Decryptor::DoDecryptLvl1(u32 tableOffset) { + FATEntry *table; + FATEntry *table_start = (FATEntry *)(&data[tableOffset]); + for (table = table_start; table->start != 0 && table->end != 0; table++) { + table->start -= 0x1300; + table->end -= info.start + info.size + 0x1300; + u32 start_offs = table->start - info.start; + u32 size = table->end & ~3; + for (int i = start_offs; i < start_offs + size; i += 4) { + u32 & word = (u32 &)data[i]; + switch (GetInsnType(word)) { + case 1: + case 2: + word = (((word & ~0xFF000000) - 0x1300) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + case 3: + word = (((word & ~0xFF000000) - 0x4C2) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + default: + u8 *ptr = (u8 *)&word; + word = ((ptr[0] ^ 0x56) << 0) | ((ptr[1] ^ 0x65) << 8) | ((ptr[2] ^ 0x56) << 16) | ((ptr[3] ^ 0xF0) << 24); + break; + } + } + } + return (u8 *)table - (u8 *)table_start + tableOffset + sizeof(*table); +} + +void Decryptor::DecryptLvl1() { + for (int i = info.sinit_start; i != info.sinit_end; i += 4) { + if (*(u32 *)&data[i - info.start] != 0) { + (void)DoDecryptLvl1(*(u32 *)&data[i - info.start] - info.start + 16); + } + } +} + +void Decryptor::Decrypt() { + DecryptLvl1(); + DecryptLvl2(); +} + +void Decryptor::Write(std::ofstream &outfile) { + outfile.write((char *)data.data(), data.size()); +} + +DecryptOptions::DecryptOptions(int argc, char ** argv) : Options(argc, argv) { + if (argc < 5) { + throw std::invalid_argument("missing required argument: " + + ((std::string[]) {"", "mode", "baserom", "outfile", "ovy_id"})[argc]); + } + baserom = new NtrRom(argv[2], std::ios::binary); + outfile = std::ofstream(argv[3], std::ios::binary); + if (!outfile.good()) { + throw std::runtime_error(std::string("unable to open file '") + argv[3] + "' for reading"); + } + + // Translate module number + ovy_id = std::strtoul(argv[4], nullptr, 10); +} + +DecryptOptions::~DecryptOptions() { + delete baserom; +} + +int DecryptOptions::main() { + Decryptor decryptor(baserom, ovy_id); + decryptor.Decrypt(); + decryptor.Write(outfile); + return 0; +} diff --git a/tools/mod123encry/Decrypt.h b/tools/mod123encry/Decrypt.h new file mode 100644 index 00000000..a4ad1c88 --- /dev/null +++ b/tools/mod123encry/Decrypt.h @@ -0,0 +1,67 @@ +#ifndef GUARD_DECRYPT_H +#define GUARD_DECRYPT_H + +#include +#include "NtrRom.h" +#include "Options.h" + +struct DecryptPart2 { + u32 i; + u32 j; + u8 s[256]; + const u8 *keys = nullptr; + + DecryptPart2() { + i = 0; + j = 0; + for (int _i = 0; _i < 256; _i++) { + s[_i] = _i; + } + } + DecryptPart2(const u8 *_keys) : DecryptPart2() { + keys = _keys; + int r6 = 0; + int r7 = 0; + for (int _i = 255; _i >= 0; _i--) { + u8 r4 = s[_i]; + r7 = (r7 + keys[r6++] + r4) & 0xFF; + u8 ip = s[r7]; + if (r6 >= 16) + r6 = 0; + s[r7] = r4; + s[_i] = ip; + } + } + u8 GetEncodedByte(); + void DoDecrypt(u32 *start, u32 *end); +}; + +class Decryptor : public NtrOverlay { +protected: + u32 FindDecryLvl2(u32 offset); + u32 DoDecryptLvl1(u32 tableOffset); + u32 DoDecryptLvl2(u32 tableOffset); + void DecryptLvl1(); + void DecryptLvl2(); +public: + Decryptor() = default; + Decryptor(FSOverlayInfo &_info, std::vector &_data) : NtrOverlay(_info, _data) {} + Decryptor(NtrOverlay &_overlay) : NtrOverlay(_overlay) {} + Decryptor(NtrRom *baserom, u32 ovy_id) : NtrOverlay(baserom, ovy_id) {} + void Decrypt(); + void Write(std::ofstream &outfile); +}; + +struct DecryptOptions: public Options { + NtrRom *baserom; + std::ofstream outfile; + std::uint32_t ovy_id; + + DecryptOptions(int argc, char ** argv); + ~DecryptOptions(); + int main(); +}; + +int decrypt_main(DecryptOptions &options); + +#endif //GUARD_DECRYPT_H diff --git a/tools/mod123encry/Encrypt.cpp b/tools/mod123encry/Encrypt.cpp new file mode 100644 index 00000000..9cd1a92d --- /dev/null +++ b/tools/mod123encry/Encrypt.cpp @@ -0,0 +1,124 @@ +#include +#include "Encrypt.h" +#include "CryptoRc4.h" + +Encryptor::Encryptor(std::string &buildname, u32 ovy_id) { + std::filesystem::path table_path(buildname + "_table.sbin"); + std::ifstream table(table_path, std::ios::binary); + if (!table.good()) { + throw std::runtime_error("unable to open " + buildname + "_table.sbin for reading"); + } + table.seekg(ovy_id * sizeof(FSOverlayInfo)); + table.read((char *)&info, sizeof(info)); + + std::ifstream defs(buildname + "_defs.sbin", std::ios::binary); + if (!defs.good()) { + throw std::runtime_error("unable to open " + buildname + "_defs.sbin for reading"); + } + defs.seekg(16); + std::string filename; + for (int i = 0; i < ovy_id; i++) { + std::getline(defs, filename, '\0'); + } + std::getline(defs, filename, '\0'); + + std::filesystem::path ovyfname = table_path.replace_filename(filename); + std::ifstream ovyfile(ovyfname, std::ios::binary | std::ios::ate); + if (!ovyfile.good()) { + throw std::runtime_error("unable to open " + ovyfname.string() + " for reading"); + } + u32 size = ovyfile.tellg(); + data.resize(size); + ovyfile.seekg(0); + ovyfile.read((char *)data.data(), size); +} + +u32 Encryptor::DoEncryptLvl2(u32 tableOffset) { + u32 *pool = (u32 *)&data[tableOffset + 104]; + u32 param = pool[2]; + u32 start = pool[3]; + u32 size = pool[1]; + pool[1] += info.start + info.size + 0x1300; + pool[2] += info.start + info.size + 0x1300; + pool[3] += 0x1300; + u32 keys[4] = { + size ^ param, + size ^ ((param << 8) | (param >> 24)), + size ^ ((param << 16) | (param >> 16)), + size ^ ((param << 24) | (param >> 8)), + }; + CryptoRC4Context buffer((const u8 *)keys); + buffer.Encrypt((u32 *) &data[start - info.start], (u32 *) &data[start + size - info.start]); + return tableOffset + 120; +} + +void Encryptor::EncryptLvl2() { + u32 i = 0; + while ((i = FindDecryLvl2(i)) != data.size()) { + i = DoEncryptLvl2(i); + } +} + +u32 Encryptor::DoEncryptLvl1(u32 tableOffset) { + FATEntry *table; + FATEntry *table_start = (FATEntry *)(&data[tableOffset]); + for (table = table_start; table->start != 0 && table->end != 0; table++) { + u32 start_offs = table->start - info.start; + u32 size = table->end & ~3; + table->start += 0x1300; + table->end += info.start + info.size + 0x1300; + for (int i = start_offs; i < start_offs + size; i += 4) { + u32 & word = (u32 &)data[i]; + switch (GetInsnType(word)) { + case 1: + case 2: + word = (((word & ~0xFF000000) + 0x4C2) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + case 3: + word = (((word & ~0xFF000000) + 0x1300) & ~0xFF000000) | ((word & 0xFF000000) ^ 0x01000000); + break; + default: + u8 *ptr = (u8 *)&word; + word = ((ptr[0] ^ 0x56) << 0) | ((ptr[1] ^ 0x65) << 8) | ((ptr[2] ^ 0x56) << 16) | ((ptr[3] ^ 0xF0) << 24); + break; + } + } + } + return (u8 *)table - (u8 *)table_start + tableOffset + sizeof(*table); +} + +void Encryptor::EncryptLvl1() { + for (int i = info.sinit_start; i != info.sinit_end; i += 4) { + if (*(u32 *)&data[i - info.start] != 0) { + (void)DoEncryptLvl1(*(u32 *)&data[i - info.start] - info.start + 16); + } + } +} + +void Encryptor::Encrypt() { + EncryptLvl2(); + EncryptLvl1(); +} + +EncryptOptions::EncryptOptions(int argc, char ** argv) : Options(argc, argv) { + if (argc < 5) { + throw std::invalid_argument("missing required argument: " + + ((std::string[]) {"", "mode", "buildname", "outfile", "ovy_id"})[argc]); + } + + buildname = argv[2]; + outfile = std::ofstream(argv[3], std::ios::binary); + if (!outfile.good()) { + throw std::runtime_error(std::string("unable to open file '") + argv[3] + "' for reading"); + } + + // Translate module number + ovy_id = std::strtoul(argv[4], nullptr, 10); +} + +int EncryptOptions::main() { + Encryptor encryptor(buildname, ovy_id); + encryptor.Encrypt(); + encryptor.Write(outfile); + return 0; +} diff --git a/tools/mod123encry/Encrypt.h b/tools/mod123encry/Encrypt.h new file mode 100644 index 00000000..dfecc838 --- /dev/null +++ b/tools/mod123encry/Encrypt.h @@ -0,0 +1,33 @@ +#ifndef GUARD_ENCRYPT_H +#define GUARD_ENCRYPT_H + +#include +#include +#include +#include "ntrtypes.h" +#include "Decrypt.h" + +class Encryptor : public Decryptor { + u32 FindEncryLvl2(u32 offset) { return FindDecryLvl2(offset); } + u32 DoEncryptLvl1(u32 tableOffset); + u32 DoEncryptLvl2(u32 tableOffset); + void EncryptLvl1(); + void EncryptLvl2(); +public: + Encryptor(std::string &buildname, u32 ovy_id); + Encryptor(FSOverlayInfo &_info, std::vector &_data) : Decryptor(_info, _data) {} + void Encrypt(); +}; + +struct EncryptOptions : public Options { + std::string buildname; + std::ofstream outfile; + u32 ovy_id; + + EncryptOptions(int argc, char ** argv); + ~EncryptOptions() = default; + int main(void); +}; + + +#endif //GUARD_ENCRYPT_H diff --git a/tools/mod123encry/Makefile b/tools/mod123encry/Makefile new file mode 100644 index 00000000..b13e7ff3 --- /dev/null +++ b/tools/mod123encry/Makefile @@ -0,0 +1,49 @@ +DEBUG ?= 1 + +CC ?= gcc +CXX ?= g++ +ifneq ($(DEBUG),1) +OPTFLAGS += -O3 +DEFINES += -DNDEBUG +endif +CFLAGS := $(OPTFLAGS) $(DEFINES) -g +CXXFLAGS := $(OPTFLAGS) $(DEFINES) -g -std=c++17 +LDFLAGS := + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +PROGRAM := mod123encry +CXXSRCS := mod123encry.cpp NtrRom.cpp Decrypt.cpp Encrypt.cpp CryptoRc4.cpp Overlay.cpp +CXXOBJS := $(CXXSRCS:%.cpp=%.o) +CSRCS := ntruncompbw.c +COBJS := $(CSRCS:%.c=%.o) +SRCS := $(CXXSRCS) $(CSRCS) +OBJS := $(CXXOBJS) $(COBJS) + +.PHONY: all clean + +all: $(PROGRAM) + @: + +$(PROGRAM): $(OBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +clean: + $(RM) $(PROGRAM) $(OBJS) + $(RM) -r $(DEPDIR) + +%.o: %.cpp +%.o: %.cpp $(DEPDIR)/%.d | $(DEPDIR) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +%.o: %.c +%.o: %.c $(DEPDIR)/%.d | $(DEPDIR) + $(CC) $(CFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(CXXSRCS:%.cpp=$(DEPDIR)/%.d) $(CSRCS:%.c=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/mod123encry/NtrRom.cpp b/tools/mod123encry/NtrRom.cpp new file mode 100644 index 00000000..ce616750 --- /dev/null +++ b/tools/mod123encry/NtrRom.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include "NtrRom.h" +#include "ntruncompbw.h" + +NtrRom::NtrRom(const char *filename, std::ios::openmode mode) : handle(filename, mode | std::ios::ate) { + size_t romsize = handle.tellg(); + raw = new u8[romsize]; + handle.seekg(0); + handle.read((char *)raw, romsize); + + const RomHeader *header = getHeader(); + arm9_static = raw + header->main_rom_offset; + arm7_static = raw + header->sub_rom_offset; + + // ARM9 might be compressed + u32 *_start_ModuleParams = (u32 *)(arm9_static + *(u32 *)(arm9_static + header->main_size + 4)); + if (_start_ModuleParams[5] != 0) { + arm9_static = new u8[header->main_size]; + memcpy(arm9_static, raw + header->main_rom_offset, header->main_size); + arm9_static_uncomp_size = MIi_UncompressBackwards((u8 **)&arm9_static, header->main_size); + } + // ARM7 static is never compressed + + // Set FAT + AssignRomVector(fat, header->fat.offset, header->fat.length); + + // Set FNT + fnt.raw = raw + header->fnt.offset; + AssignRomVector(fnt.directories, header->fnt.offset, sizeof(FNTHeader)); + AssignRomVector(fnt.directories, header->fnt.offset, fnt.directories[0].parent * sizeof(FNTHeader)); + fnt.paths = (char *)&*fnt.directories.cend(); + + // Set overlay tables + AssignRomVector(arm9_ovt, header->main_ovt.offset, header->main_ovt.length); + arm9_ovy = new u8*[arm9_ovt.size()]; + for (int i = 0; i < arm9_ovt.size(); i++) { + if (arm9_ovt[i].flag & 1) { + arm9_ovy[i] = new u8[arm9_ovt[i].compsize]; + memcpy(arm9_ovy[i], raw + fat[arm9_ovt[i].file_id].start, arm9_ovt[i].compsize); + MIi_UncompressBackwards((u8 **)&arm9_ovy[i], arm9_ovt[i].compsize); + } else { + arm9_ovy[i] = raw + fat[arm9_ovt[i].file_id].start; + } + } + AssignRomVector(arm7_ovt, header->main_ovt.offset, header->main_ovt.length); + arm7_ovy = new u8*[arm7_ovt.size()]; + for (int i = 0; i < arm7_ovt.size(); i++) { + if (arm7_ovt[i].flag & 1) { + arm7_ovy[i] = new u8[arm7_ovt[i].compsize]; + memcpy(arm7_ovy[i], raw + fat[arm7_ovt[i].file_id].start, arm7_ovt[i].compsize); + MIi_UncompressBackwards((u8 **)&arm7_ovy[i], arm7_ovt[i].compsize); + } else { + arm7_ovy[i] = raw + fat[arm7_ovt[i].file_id].start; + } + } + + banner = (NtrBanner *)(raw + header->banner_offset); +} + +NtrRom::~NtrRom() { + int i; + + for (i = 0; i < arm9_ovt.size(); i++) { + if (arm9_ovt[i].flag & 1) { + delete[] arm9_ovy[i]; + } + } + for (i = 0; i < arm7_ovt.size(); i++) { + if (arm7_ovt[i].flag & 1) { + delete[] arm7_ovy[i]; + } + } + delete[] arm9_ovy; + delete[] arm7_ovy; + // explicit delete for static only if uncomped + if (arm9_static_uncomp_size != 0) { + delete[] arm9_static; + } + delete[] raw; +} diff --git a/tools/mod123encry/NtrRom.h b/tools/mod123encry/NtrRom.h new file mode 100644 index 00000000..7376e6d4 --- /dev/null +++ b/tools/mod123encry/NtrRom.h @@ -0,0 +1,119 @@ +#ifndef GUARD_NTRROM_H +#define GUARD_NTRROM_H + +#include +#include +#include "ntrtypes.h" +#include "Overlay.h" + +struct CARDRomRegion { + u32 offset; + u32 length; +}; + +struct RomHeader { + char game_name[12]; + u32 game_code; + u16 maker_code; + u8 product_id; + u8 device_type; + u8 device_size; + u8 reserved_A[9]; + u8 game_version; + u8 property; + u32 main_rom_offset; + u32 main_entry_address; + u32 main_ram_address; + u32 main_size; + u32 sub_rom_offset; + u32 sub_entry_address; + u32 sub_ram_address; + u32 sub_size; + CARDRomRegion fnt; + CARDRomRegion fat; + CARDRomRegion main_ovt; + CARDRomRegion sub_ovt; + u8 rom_param_A[8]; + u32 banner_offset; + u16 secure_crc; + u8 rom_param_B[2]; + u32 main_autoload_done; + u32 sub_autoload_done; + u8 rom_param_C[8]; + u32 rom_size; + u32 header_size; + u8 reserved_B[0x38]; + u8 logo_data[0x9C]; + u16 logo_crc; + u16 header_crc; +}; + +struct NtrBanner { + u16 reserved[16]; + u16 pixels[0x100]; + u16 palette[16]; + char16_t titles[6][128]; +}; + +struct FATEntry { + u32 start; + u32 end; +}; + +struct FNTHeader { + u32 start; + u16 index; + u16 parent; +}; + +struct FNT { + u8 *raw; + std::vector directories; + char *paths; +}; + +class NtrRom { + std::ifstream handle; + u8 * raw; + u8 * arm9_static; + u8 * arm7_static; + u32 arm9_static_uncomp_size = 0; + std::vector arm9_ovt; + std::vector arm7_ovt; + std::vector fat; + FNT fnt; + u8 ** arm9_ovy; + u8 ** arm7_ovy; + NtrBanner *banner; + + template void AssignRomVector(std::vector &dest, u32 address, u32 size) { + if (size % sizeof(T) != 0) { + throw std::runtime_error("requested size not a multiple of type size"); + } + dest.assign((T *)(raw + address), (T *)(raw + address + size)); + } + +public: + NtrRom(const char * filename, std::ios::openmode mode = std::ios::in); + ~NtrRom(); + const RomHeader * getHeader() { return (const RomHeader *)(raw + 0); } + FSOverlayInfo &getOverlayInfo(u32 proc, u32 ovy_id) { + std::vector &ovyi = (proc == 0) ? arm9_ovt : arm7_ovt; + return ovyi[ovy_id]; + } + std::vector getOverlayData(u32 proc, u32 ovy_id) { + u8 *& data_raw = ((proc == 0) ? arm9_ovy : arm7_ovy)[ovy_id]; + FSOverlayInfo &info = getOverlayInfo(proc, ovy_id); + return std::vector(data_raw, data_raw + info.size); + } + NtrOverlay getOverlay(u32 proc, u32 ovy_id) { + std::vector &ovyi = (proc == 0) ? arm9_ovt : arm7_ovt; + u8 *& data_raw = ((proc == 0) ? arm9_ovy : arm7_ovy)[ovy_id]; + FSOverlayInfo &info = ovyi[ovy_id]; + std::vector data(data_raw, data_raw + info.size); + return {info, data}; + } +}; + + +#endif //GUARD_NTRROM_H diff --git a/tools/mod123encry/Options.h b/tools/mod123encry/Options.h new file mode 100644 index 00000000..8552cee5 --- /dev/null +++ b/tools/mod123encry/Options.h @@ -0,0 +1,30 @@ +#ifndef GUARD_OPTIONS_H +#define GUARD_OPTIONS_H +#include +#include +#include +#include "NtrRom.h" + +enum ExecMode { + EXEC_DECRY = 0, + EXEC_ENCRY = 1, +}; + +struct Options { + Options(int argc, char ** argv) {}; + virtual ~Options() = default; + virtual int main() = 0; + static ExecMode TranslateExecMode(const char * value) { + ExecMode mode; + if (strcmp(value, "decry") == 0) { + mode = EXEC_DECRY; + } else if (strcmp(value, "encry") == 0) { + mode = EXEC_ENCRY; + } else { + throw std::invalid_argument(std::string("invalid ExecMode value: expected 'encry' or 'decry'; got ") + value); + } + return mode; + } +}; + +#endif //GUARD_OPTIONS_H diff --git a/tools/mod123encry/Overlay.cpp b/tools/mod123encry/Overlay.cpp new file mode 100644 index 00000000..41b4b0dd --- /dev/null +++ b/tools/mod123encry/Overlay.cpp @@ -0,0 +1,7 @@ +#include "Overlay.h" +#include "NtrRom.h" + +NtrOverlay::NtrOverlay(NtrRom *baserom, u32 ovy_id) { + info = baserom->getOverlayInfo(0, ovy_id); + data = baserom->getOverlayData(0, ovy_id); +} diff --git a/tools/mod123encry/Overlay.h b/tools/mod123encry/Overlay.h new file mode 100644 index 00000000..c7304f11 --- /dev/null +++ b/tools/mod123encry/Overlay.h @@ -0,0 +1,32 @@ +#ifndef GUARD_OVERLAY_H +#define GUARD_OVERLAY_H + +#include +#include "ntrtypes.h" + +class NtrRom; + +struct FSOverlayInfo { + u32 ovy_id; + u32 start; + u32 size; + u32 bssize; + u32 sinit_start; + u32 sinit_end; + u32 file_id; + u32 compsize : 24; + u32 flag : 8; +}; + +class NtrOverlay { +protected: + FSOverlayInfo info; + std::vector data; +public: + NtrOverlay() = default; + NtrOverlay(FSOverlayInfo &_info, std::vector &_data) : info(_info), data(_data) {} + NtrOverlay(NtrRom *baserom, u32 ovy_id); +}; + + +#endif //GUARD_OVERLAY_H diff --git a/tools/mod123encry/mod123encry.cpp b/tools/mod123encry/mod123encry.cpp new file mode 100644 index 00000000..7b0e7f0e --- /dev/null +++ b/tools/mod123encry/mod123encry.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "Decrypt.h" +#include "Encrypt.h" + +int main(int argc, char ** argv) { + // Usage: + // mod123encry decry BASEROM OUTFILE OVY_ID + // mod123encry encry BUILDNAME OUTFILE OVY_ID + try { + if (argc < 2) { + throw std::invalid_argument("missing required argument: mode"); + } + Options *options; + switch (Options::TranslateExecMode(argv[1])) { + case EXEC_DECRY: + options = new DecryptOptions(argc, argv); + break; + case EXEC_ENCRY: + options = new EncryptOptions(argc, argv); + break; + } + + int ret = options->main(); + delete options; + return ret; + } catch (std::exception &e) { + std::cerr << "An exception has occurred: " << e.what() << std::endl; + return 1; + } +} diff --git a/tools/mod123encry/ntrtypes.h b/tools/mod123encry/ntrtypes.h new file mode 100644 index 00000000..18225421 --- /dev/null +++ b/tools/mod123encry/ntrtypes.h @@ -0,0 +1,24 @@ +#ifndef GUARD_NTRTYPES_H +#define GUARD_NTRTYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +typedef s32 BOOL; + +#ifdef __cplusplus +} +#endif + +#endif //GUARD_NTRTYPES_H diff --git a/tools/mod123encry/ntruncompbw.c b/tools/mod123encry/ntruncompbw.c new file mode 100644 index 00000000..e84b3869 --- /dev/null +++ b/tools/mod123encry/ntruncompbw.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include "ntruncompbw.h" + +static inline uint32_t READ32(const unsigned char * ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +uint32_t MIi_UncompressBackwards(unsigned char ** out_p, size_t compsize) +{ + unsigned char * out = *out_p; + + // Read the pointer to the end of the compressed image + uint8_t * endptr = out + compsize - 8; + uint32_t size = READ32(endptr); + uint32_t offset = READ32(endptr + 4); + out = realloc(out, compsize + offset); + if (out == NULL) + return -1u; + endptr = out + compsize; + uint8_t * dest_p = endptr + offset; + uint8_t * end = endptr - ((uint8_t)(size >> 24)); + uint8_t * start = endptr - (size & ~0xFF000000); + while (dest_p > end && end > start) { + uint8_t r5 = *--end; + for (int i = 0; i < 8; i++) { + if ((r5 & 0x80) == 0) + *--dest_p = *--end; + else { + int ip = *--end; + int r7 = *--end; + + + r7 = ((r7 | (ip << 8)) & ~0xF000) + 2; + ip += 0x20; + while (ip >= 0) { + dest_p[-1] = dest_p[r7]; + dest_p--; + ip -= 0x10; + } + } + if (end <= start) + break; + r5 <<= 1; + } + } + *out_p = out; + return compsize + offset; +} diff --git a/tools/mod123encry/ntruncompbw.h b/tools/mod123encry/ntruncompbw.h new file mode 100644 index 00000000..79509ead --- /dev/null +++ b/tools/mod123encry/ntruncompbw.h @@ -0,0 +1,14 @@ +#ifndef GUARD_NTRUNCOMPBW_H +#define GUARD_NTRUNCOMPBW_H + +#ifdef __cplusplus +extern "C" { +#endif + +uint32_t MIi_UncompressBackwards(unsigned char ** out_p, size_t compsize); + +#ifdef __cplusplus +} +#endif + +#endif //GUARD_NTRUNCOMPBW_H diff --git a/tools/msgenc/.gitignore b/tools/msgenc/.gitignore new file mode 100644 index 00000000..760f8a2e --- /dev/null +++ b/tools/msgenc/.gitignore @@ -0,0 +1,2 @@ +msgenc +.deps diff --git a/tools/msgenc/Gmm.cpp b/tools/msgenc/Gmm.cpp new file mode 100644 index 00000000..69bc4f58 --- /dev/null +++ b/tools/msgenc/Gmm.cpp @@ -0,0 +1,177 @@ +#include "Gmm.h" +#include "pugixml.hpp" +#include + +static const char WINCTXNAME[] = "window_context_name"; +static const char LANGUAGE[] = "English"; +static const char JAPANESE[] = "日本語"; + +// Reads header constants from the supplied file. +// Expects them to be of the format `#define +{name} +{integer value}` +// and that the integer value is in sequential order starting from 0. +void GMM::ReadGmmHeader(const string &_filename) { + ifstream hstrm(_filename, ios::ate | ios::binary); + if (!hstrm.good()) { + return; + } + int fsize = hstrm.tellg(); + auto buf = new char[fsize + 1]; + hstrm.seekg(0); + hstrm.read(buf, fsize); + buf[fsize] = 0; + string hstrng(buf); + regex pattern(R"(#define\s+(\w+)\s+([0-9]+))"); + smatch results; + id_strings.clear(); + while (regex_search(hstrng, results, pattern)) { + id_strings.emplace_back(results[1]); + hstrng = results.suffix().str(); + } + delete[] buf; +} + +// Reads header constants to the supplied file. +// Prints them in the format `#define {name} {integer value}` +// such that the integer value is in sequential order starting from 0. +void GMM::WriteGmmHeader(const string &_filename) { + ofstream hstrm(_filename); + string guard(_filename); + for (auto & c : guard) { + switch (c) { + case '/': + case '.': + c = '_'; + break; + default: + c = toupper(c); + break; + } + } + + hstrm << "/***************************************************" << endl; + hstrm << " * WARNING: This file was autogenerated by msgenc. *" << endl; + hstrm << " * DO NOT MODIFY *" << endl; + hstrm << " ***************************************************/" << endl; + hstrm << endl; + hstrm << "#ifndef MSGENC_" << guard << endl; + hstrm << "#define MSGENC_" << guard << endl; + hstrm << endl; + for (size_t i = 0; i < id_strings.size(); i++) { + auto message_lines = SplitMessage(messages[i]); + for (const auto & message_line : message_lines) { + hstrm << "// " << message_line << endl; + } + hstrm << "#define " << id_strings[i] << " " << i << endl; + } + hstrm << endl; + hstrm << "#endif //MSGENC_" << guard << endl; +} + +// Reads messages from GMM into memory to be converted +void GMM::FromFile(MessagesConverter &converter) { + pugi::xml_parse_result result = doc.load(stream); + if (!result) { + throw runtime_error(result.description()); + } + const auto &node = doc.find_child([](const auto &n) { + return strcmp(n.name(), "body") == 0; + }); + int i = 0; + string rowname_pref = filename.substr(filename.find_last_of('/') + 1).substr(0, filename.find_first_of('.')); + for (const auto &subnode : node.children()) { + if (strcmp(subnode.name(), "row") == 0) { + const auto &language = subnode.find_child([](const auto &n) { + return strcmp(n.name(), "language") == 0 && strcmp(n.attribute("name").value(), LANGUAGE) == 0; + }); + const auto &windowcontext = subnode.find_child([](const auto &n) { + return strcmp(n.name(), "attribute") == 0 && strcmp(n.attribute("name").value(), WINCTXNAME) == 0; + }); + string is_garbage(windowcontext.child_value()); + string message(language.child_value()); + if (is_garbage == "garbage") { + const auto &jap = subnode.find_child([](const auto &n) { + return strcmp(n.name(), "language") == 0 && strcmp(n.attribute("name").value(), JAPANESE) == 0; + }); + message.assign(jap.child_value()); + fill(message.begin(), message.end(), ' '); + } + converter.GetDecodedMessages().emplace_back(message); + string row_id(subnode.attribute("id").value()); + if (row_id.empty()) { + row_id = rowname_pref + '_' + row_no_buf; + } + id_strings.emplace_back(row_id); + messages.emplace_back(message); + i++; + IncRowNoBuf(); + } + } + if (!converter.GetHeaderFilename().empty()) { + WriteGmmHeader(converter.GetHeaderFilename()); + } +} + +// Writes decoded messages to a new GMM file +void GMM::ToFile(MessagesConverter &converter) { + if (!converter.GetHeaderFilename().empty()) { + ReadGmmHeader(converter.GetHeaderFilename()); + } + auto it = id_strings.cbegin(); + auto body = doc.append_child("body"); + body.append_attribute("language").set_value(LANGUAGE); + if (body.empty()) { + throw runtime_error("failed to create gmm body node"); + } + string rowname_pref = filename.substr(filename.find_last_of('/') + 1); + rowname_pref = rowname_pref.substr(0, rowname_pref.find_first_of('.')); + int i = 0; + for (const auto &message : converter.GetDecodedMessages()) { + string rowname; + if (it != id_strings.cend()) { + rowname = *it++; + } else { + rowname = rowname_pref + '_' + row_no_buf; + } + auto row = body.append_child("row"); + if (row.empty()) { + throw runtime_error("failed to create gmm row node"); + } + row.append_attribute("id").set_value(rowname.c_str()); + row.append_attribute("index").set_value(i++); + auto windowcontextname = row.append_child("attribute"); + windowcontextname.append_attribute("name").set_value(WINCTXNAME); + auto language = row.append_child("language"); + if (language.empty()) { + throw runtime_error("failed to create gmm language node"); + } + language.append_attribute("name").set_value(LANGUAGE); + auto windowattr = windowcontextname.append_child(pugi::xml_node_type::node_pcdata); + if (message.find_first_not_of(' ') == string::npos) { + string buf; + buf.resize(message.size()); + fill(buf.begin(), buf.end(), 'X'); + windowattr.set_value("garbage"); + auto jap = row.append_child("language"); + jap.append_attribute("name").set_value(JAPANESE); + jap.append_child(pugi::xml_node_type::node_pcdata).set_value(buf.c_str()); + language.append_child(pugi::xml_node_type::node_pcdata).set_value(""); + } else { + windowattr.set_value("used"); + language.append_child(pugi::xml_node_type::node_pcdata).set_value(message.c_str()); + } + IncRowNoBuf(); + } + doc.save(stream); +} + +// The message headers are included in script files, which can cause the +// assembler to break if the lines are too long. +vector GMM::SplitMessage(const string &message) { + vector v; + + auto limit = 300; + for (size_t i = 0; i < message.size(); i += limit) { + v.push_back(message.substr(i, limit)); + } + return v; +} diff --git a/tools/msgenc/Gmm.h b/tools/msgenc/Gmm.h new file mode 100644 index 00000000..734fcac1 --- /dev/null +++ b/tools/msgenc/Gmm.h @@ -0,0 +1,57 @@ +#ifndef GUARD_GMM_H +#define GUARD_GMM_H + + +// The GMM format is a slimmed-down variant of GameFreak's GMM file. +// It is essentially an XML file by another name. +// Within the body, each row encodes the text of a message as well +// as additional details about how the message is printed. +// Most of these details are ignored. +// Some strings in the EN-US release of Pokemon titles are blank +// (composed entirely of spaces). The number of spaces varies by the +// length of the corresponding Japanese message. Such strings are +// labeled with the window context "garbage". + +#include +#include +#include +#include +#include "pugixml.hpp" +#include "MessagesConverter.h" + +class GMM { + static const int _row_no_buf_ndigit = 5; + char row_no_buf[_row_no_buf_ndigit + 1] = {0}; + string filename; + fstream stream; + pugi::xml_document doc; + vector id_strings; + vector messages; + void ReadGmmHeader(const string &_filename); + void WriteGmmHeader(const string &_filename); + void IncRowNoBuf() { + for (int i = _row_no_buf_ndigit - 1; i >= 0; i--) { + row_no_buf[i]++; + if (row_no_buf[i] > '9') { + if (i == 0) { + throw runtime_error("message count overflow"); + } + row_no_buf[i] = '0'; + } else { + break; + } + } + } +public: + GMM(string &_filename, ios::openmode _openmode) : filename(_filename), stream(_filename, _openmode) { + memset(row_no_buf, '0', _row_no_buf_ndigit); + } + void FromFile(MessagesConverter &converter); + void ToFile(MessagesConverter &converter); + +private: + vector SplitMessage(const string &message); +}; + + +#endif //GUARD_GMM_H diff --git a/tools/msgenc/LICENSE.pugixml.md b/tools/msgenc/LICENSE.pugixml.md new file mode 100644 index 00000000..2503b81e --- /dev/null +++ b/tools/msgenc/LICENSE.pugixml.md @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2006-2020 Arseny Kapoulkine + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/tools/msgenc/Makefile b/tools/msgenc/Makefile new file mode 100644 index 00000000..5cf8f55e --- /dev/null +++ b/tools/msgenc/Makefile @@ -0,0 +1,43 @@ +CXXFLAGS := -std=c++17 -O2 -Wall -Wno-switch +CFLAGS := -O2 -Wall -Wno-switch +LDFLAGS := + +ifeq ($(DEBUG),) +CXXFLAGS += -DNDEBUG +endif + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +SRCS := \ + msgenc.cpp \ + Options.cpp \ + MessagesConverter.cpp \ + MessagesDecoder.cpp \ + MessagesEncoder.cpp \ + Gmm.cpp \ + pugixml.cpp + +OBJS := $(SRCS:%.cpp=%.o) + +.PHONY: all clean + +all: msgenc + @: + +clean: + $(RM) -r msgenc msgenc.exe $(OBJS) $(DEPDIR) + +msgenc: $(OBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +%.o: %.cpp +%.o: %.cpp $(DEPDIR)/%.d | $(DEPDIR) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(SRCS:%.cpp=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/msgenc/MessagesConverter.cpp b/tools/msgenc/MessagesConverter.cpp new file mode 100644 index 00000000..ff75f7d7 --- /dev/null +++ b/tools/msgenc/MessagesConverter.cpp @@ -0,0 +1,97 @@ +#include "MessagesConverter.h" + +void MessagesConverter::CharmapRegisterCharacter(string &code, uint16_t value) +{ + throw runtime_error("calling parent class method MessagesConverter::CharmapRegisterCharacter when child class method is required"); +} + +void MessagesConverter::CmdmapRegisterCommand(string &command, uint16_t value) +{ + throw runtime_error("calling parent class method MessagesConverter::CmdmapRegisterCommand when child class method is required"); +} + +string MessagesConverter::ReadTextFile(string& filename) { + ifstream file(filename); + if (!file.good()) { + throw ifstream::failure("unable to open file \"" + filename + "\" for reading"); + } + stringstream ss; + ss << file.rdbuf(); + file.close(); + return ss.str(); +} + +void MessagesConverter::WriteTextFile(string& filename, string const& contents) { + ofstream file(filename); + if (!file.good()) { + throw ofstream::failure("unable to open file \"" + filename + "\" for writing"); + } + file << contents; + file.close(); +} + +void MessagesConverter::ReadCharmap() { + string raw = ReadTextFile(charmapfilename); + string line; + size_t pos, eqpos, last_pos, lineno = 0; + + for ( + last_pos = 0; + last_pos != string::npos && (pos = raw.find_first_of("\r\n", last_pos)) != string::npos; + last_pos = raw.find_last_of("\r\n", pos + 1, 2) + 1, lineno++ + ) { + line = raw.substr(last_pos, pos - last_pos); + if (line.find("//") != string::npos) { + line = line.substr(0, line.find("//")); + } + if (line.find_first_not_of(" \t") == string::npos) + continue; + line = line.substr( + line.find_first_not_of(" \t") + ); + eqpos = line.find('='); + if (eqpos == string::npos) { + stringstream s; + s << "charmap syntax error at " << (lineno + 1); + throw runtime_error(s.str()); + } + string value = line.substr(0, eqpos); + string code = line.substr(eqpos + 1); + uint16_t value_i = stoi(value, nullptr, 16); + if (code[0] == '{' && code[code.length() - 1] == '}') { + code = code.substr(1, code.length() - 2); + CmdmapRegisterCommand(code, value_i); + } else { + CharmapRegisterCharacter(code, value_i); + } + } +} + +uint16_t MessagesConverter::CalcCRC() +{ + uint16_t crc = 0; + for (char d : binfilename) { + for (int i = 0; i < 8; i++) { + crc = (crc & 0x8000) ? ((crc << 1) ^ 0x8003) : (crc << 1); + if (d & 0x80) crc ^= 1; + d <<= 1; + } + } + return crc; +} + +void MessagesConverter::WriteBinaryDecoded(string &filename) +{ + ofstream outfile(filename, ios::binary); + if (!outfile.good()) { + throw ios::failure("Unable to open file " + filename + " for writing"); + } + outfile.write((char *)&header, sizeof(header)); + outfile.write((char *)alloc_table.data(), alloc_table.size() * sizeof(MsgAlloc)); + for (auto msg : vec_encoded) { + outfile.write((char *)msg.data(), msg.size() * 2); + } + outfile.close(); +} + +MessagesConverter::~MessagesConverter() = default; diff --git a/tools/msgenc/MessagesConverter.h b/tools/msgenc/MessagesConverter.h new file mode 100644 index 00000000..47f321c3 --- /dev/null +++ b/tools/msgenc/MessagesConverter.h @@ -0,0 +1,117 @@ +#ifndef GUARD_MESSAGESCONVERTER_H +#define GUARD_MESSAGESCONVERTER_H + +#include "util.h" +#include "Options.h" +#include +#include +#include +#include +#include +#include + +using namespace std; + +static inline uint16_t enc_short(uint16_t value, uint16_t & seed) { + value ^= seed; + seed += 18749; + return value; +} + +struct MsgArcHeader +{ + uint16_t count; + uint16_t key; +}; + +struct MsgAlloc +{ + uint32_t offset; + uint32_t length; + void encrypt(uint16_t key, int i) { + uint32_t alloc_key = (765 * i * key) & 0xFFFF; + alloc_key |= alloc_key << 16; + offset ^= alloc_key; + length ^= alloc_key; + } + void decrypt(uint16_t key, int i) { encrypt(key, i); } +}; + +static inline void EncryptU16String(u16string & message, int & i) { + uint16_t key = i * 596947; + for (auto & code : message) { + code = enc_short(code, key); + } +} + +static inline void DecryptU16String(u16string & message, int & i) { + EncryptU16String(message, i); +} + +class MessagesConverter{ + virtual void CharmapRegisterCharacter(string& code, uint16_t value); + virtual void CmdmapRegisterCommand(string& command, uint16_t value); + +protected: + ConvertMode mode; + string textfilename; + string charmapfilename; + string binfilename; + string headerfilename; + + MsgArcHeader header = {}; + vector alloc_table; + vector vec_decoded; + vector vec_encoded; + + template void CreateInverseMap(mapconst& _in, map& _out) { + for (auto _pair : _in) { + _out[_pair.second] = _pair.first; + } + } + static string ReadTextFile(string& filename); + static void WriteTextFile(string& filename, string const & contents); + +public: + typedef int txtfmt; + static const txtfmt PlainText = 0; + static const txtfmt GamefreakGMM = 1; +protected: + txtfmt text_format = PlainText; + +public: + MessagesConverter(Options &options) : + mode(options.mode), + charmapfilename(options.charmap), + headerfilename(options.gmm_header), + text_format(options.textFormat) + { + header.key = (options.key == 0) ? CalcCRC() : static_cast(options.key); + } + void ReadCharmap(); + virtual void ReadInput() = 0; + virtual void Convert() = 0; + virtual void WriteOutput() = 0; + virtual ~MessagesConverter() = 0; + + uint16_t CalcCRC(); + + uint16_t GetKey() { + return header.key; + } + + void WriteBinaryDecoded(string &filename); + + vector &GetDecodedMessages() { + return vec_decoded; + } + vector &GetEncodedMessages() { + return vec_encoded; + } + + string &GetHeaderFilename() { + return headerfilename; + } +}; + +#endif //GUARD_MESSAGESCONVERTER_H diff --git a/tools/msgenc/MessagesDecoder.cpp b/tools/msgenc/MessagesDecoder.cpp new file mode 100644 index 00000000..9ab04139 --- /dev/null +++ b/tools/msgenc/MessagesDecoder.cpp @@ -0,0 +1,197 @@ +#include +#include "MessagesDecoder.h" +#include "Gmm.h" + +void MessagesDecoder::CmdmapRegisterCommand(string &command, uint16_t value) +{ + cmdmap[value] = command; + if (command.rfind("STRVAR_", 0) == 0) + strvar_codes.insert(value); +} + +void MessagesDecoder::CharmapRegisterCharacter(string &code, uint16_t value) +{ + charmap[value] = code; +} + +static string ConvertIntToHexStringN(unsigned value, StrConvMode mode, int n) { + string dest; + bool printing_zeroes = mode == STR_CONV_MODE_LEADING_ZEROS; + unsigned shift = 4 * (n - 1); + + for (int i = 0; i < n; i++) { + unsigned nybble = (value >> shift) & 0xF; + if (nybble == 0 && !printing_zeroes) { + if (i == n - 1) printing_zeroes = true; + else if (mode == STR_CONV_MODE_RIGHT_ALIGN) { + dest += ' '; + continue; + } + } + if (nybble != 0 || printing_zeroes) { + if (nybble < 10) { + dest += (char)('0' + nybble); + } else { + dest += (char)('A' + nybble - 10); + } + } + shift -= 4; + } + + return dest; +} + +void MessagesDecoder::ReadMessagesFromBin(string& filename) +{ + ifstream infile(filename, ios_base::binary); + if (!infile.good()) { + throw ifstream::failure("Unable to open file \"" + filename + "\" for reading"); + } + infile.read((char*)&header, sizeof(header)); + debug_printf("%d lines\n", header.count); + alloc_table.resize(header.count); + infile.read((char*)alloc_table.data(), (streamsize)(sizeof(MsgAlloc) * header.count)); + int i = 1; + for (auto & alloc : alloc_table) { + alloc.decrypt(header.key, i); + u16string str; + str.resize(alloc.length); + infile.read((char*)str.data(), (2 * alloc.length)); + DecryptU16String(str, i); + vec_encoded.push_back(str); + i++; + } + infile.close(); +} + +u16string MessagesDecoder::DecodeTrainerNameMessage(u16string const &message) +{ + int bit = 0; + u16string out = u"\uf100"; + auto src_p = message.cbegin() + 1; + char16_t cur_char; + do { + cur_char = ((*src_p >> bit) & 0x1FF); + bit += 9; + if (bit >= 15) { + src_p++; + bit -= 15; + if (bit != 0 && src_p < message.cend()) { + cur_char |= (*src_p << (9 - bit)) & 0x1FF; + } + } + out += cur_char; + } while (src_p < message.cend() && cur_char != 0x1FF); + return out; +} + +string MessagesDecoder::DecodeMessage(u16string &message, int &i) { + string decoded; + bool is_trname = false; + for (size_t j = 0; j < message.size(); j++) { + uint16_t code = message[j]; + debug_printf("%04X ", code); + + if (charmap.find(code) != charmap.end()) { + decoded += charmap[code]; + } + else if (code == (is_trname ? 0x01FF : 0xFFFF)) { + break; + } + else if (code == 0xFFFE) { + decoded += '{'; + j++; + code = message[j++]; + debug_printf("%04X ", code); + string command; + bool is_strvar = false; + if (find(strvar_codes.cbegin(), strvar_codes.cend(), code & 0xFF00) != strvar_codes.cend()) { + is_strvar = true; + command = "STRVAR_" + ConvertIntToHexStringN((code >> 8), STR_CONV_MODE_LEFT_ALIGN, 2); + } + else if (cmdmap.find(code) != cmdmap.end()) { + command = cmdmap[code]; + } else { + throw runtime_error("Invalid control code in " + binfilename + ": " + ConvertIntToHexStringN(code, STR_CONV_MODE_LEADING_ZEROS, 4) + " at line " + to_string(i) + ":" + to_string(j)); + } + decoded += command; + int nargs = message[j++]; + debug_printf("%04X ", nargs); + if (is_strvar) { + decoded += ' '; + decoded += to_string(code & 0xFF); + if (nargs != 0) + decoded += ','; + } + for (int k = 0; k < nargs; k++) { + decoded += ' '; + decoded += to_string(message[j + k]); + debug_printf("%04X ", message[j + k]); + if (k != nargs - 1) + decoded += ','; + } + decoded += '}'; + j += nargs - 1; + } + else if (code == 0xF100) { + decoded += "{TRNAME}"; + message = DecodeTrainerNameMessage(message); + is_trname = true; + } + else { + throw runtime_error("invalid character in " + binfilename + ": " + ConvertIntToHexStringN(code, STR_CONV_MODE_LEADING_ZEROS, 4) + " at " + to_string(i) + ":" + to_string(j)); + } + } + MsgAlloc & alloc = alloc_table[i]; + debug_printf("msg %d: at 0x%08X, count %d\n", i + 1, alloc.offset, alloc.length); + return decoded; +} + +template void MessagesDecoder::WriteBinaryFile(string& filename, T& data) { + ofstream outfile(filename, ios_base::binary); + if (!outfile.good()) { + throw ofstream::failure("Unable to open file \"" + filename + "\" for writing"); + } + outfile.write((const char *)&data, sizeof(data)); + outfile.close(); +} + +void MessagesDecoder::WriteMessagesToText(string& filename) { + stringstream ss; + for (string& text : vec_decoded) { + ss << text << "\r\n"; + } + WriteTextFile(filename, ss.str()); +} + +void MessagesDecoder::WriteMessagesToGMM(string &filename) { + GMM(filename, std::ios::out).ToFile(*this); +} + +// Public virtual functions + +void MessagesDecoder::ReadInput() +{ + ReadMessagesFromBin(binfilename); +} + +void MessagesDecoder::Convert() +{ + for (int i = 0; i < (int)vec_encoded.size(); i++) { + u16string message = vec_encoded[i]; + string decoded = DecodeMessage(message, i); + vec_decoded.push_back(decoded); + } +} + +void MessagesDecoder::WriteOutput() +{ + switch (text_format) { + case PlainText: + WriteMessagesToText(textfilename); + break; + case GamefreakGMM: + WriteMessagesToGMM(textfilename); + break; + } +} diff --git a/tools/msgenc/MessagesDecoder.h b/tools/msgenc/MessagesDecoder.h new file mode 100644 index 00000000..796722a6 --- /dev/null +++ b/tools/msgenc/MessagesDecoder.h @@ -0,0 +1,40 @@ +#ifndef GUARD_MESSAGESDECODER_H +#define GUARD_MESSAGESDECODER_H + + +#include "MessagesConverter.h" + +enum StrConvMode { + STR_CONV_MODE_LEFT_ALIGN = 0, + STR_CONV_MODE_RIGHT_ALIGN, + STR_CONV_MODE_LEADING_ZEROS +}; + +class MessagesDecoder : public MessagesConverter +{ + map cmdmap; + map charmap; + set strvar_codes; + + void ReadMessagesFromBin(string& filename); + void WriteMessagesToText(string& filename); + void WriteMessagesToGMM(string& filename); + template void WriteBinaryFile(string& filename, T& data); + static u16string DecodeTrainerNameMessage(u16string const &message); + string DecodeMessage(u16string& message, int& i); + void CharmapRegisterCharacter(string& code, uint16_t value) override; + void CmdmapRegisterCommand(string& command, uint16_t value) override; + +public: + MessagesDecoder(Options &options) : MessagesConverter(options) { + textfilename = options.posargs[1]; + binfilename = options.posargs[0]; + } + void ReadInput() override; + void Convert() override; + void WriteOutput() override; + ~MessagesDecoder() override = default; +}; + + +#endif //GUARD_MESSAGESDECODER_H diff --git a/tools/msgenc/MessagesEncoder.cpp b/tools/msgenc/MessagesEncoder.cpp new file mode 100644 index 00000000..01ba4dda --- /dev/null +++ b/tools/msgenc/MessagesEncoder.cpp @@ -0,0 +1,179 @@ +#include "MessagesEncoder.h" +#include "Gmm.h" + +void MessagesEncoder::CmdmapRegisterCommand(string &command, uint16_t value) +{ + cmdmap[command] = value; +} + +void MessagesEncoder::CharmapRegisterCharacter(string &code, uint16_t value) +{ + charmap[code] = value; +} + +void MessagesEncoder::ReadMessagesFromText(string& fname) { + string text = ReadTextFile(fname); + size_t pos = 0; + do { + text = text.substr(pos); + if (text.empty()) + break; + pos = text.find_first_of("\r\n"); + vec_decoded.push_back(text.substr(0, pos)); + pos = text.find_last_of("\r\n", pos + 1, 2); + if (pos == string::npos) + break; + pos++; + } while (pos != string::npos); + header.count = vec_decoded.size(); + debug_printf("%d lines\n", header.count); +} + +void MessagesEncoder::ReadMessagesFromGMM(string& filename) { + GMM(filename, std::ios::in).FromFile(*this); + header.count = vec_decoded.size(); + debug_printf("%d lines\n", header.count); +} + +u16string MessagesEncoder::EncodeMessage(const string & message, int & i) { + u16string encoded; + bool is_trname = false; + uint32_t trnamebuf = 0; + int bit = 0; + + for (size_t j = 0; j < message.size(); j++) { + if (message[j] == '{') { + size_t k = message.find('}', j); + string enclosed = message.substr(j + 1, k - j - 1); + j = k; + size_t pos = enclosed.find(' '); + string command = enclosed.substr(0, pos); + enclosed = enclosed.substr(pos + 1); + if (cmdmap.find(command) != cmdmap.end()) { + uint16_t command_i = cmdmap[command]; + encoded += (char16_t)(0xFFFE); + debug_printf("%04X ", 0xFFFE); + vector args; + if (pos != string::npos) { + do { + k = enclosed.find(','); + string num = enclosed.substr(0, k); + uint16_t num_i = stoi(num); + args.push_back(num_i); + enclosed = enclosed.substr(k + 1); + } while (k != string::npos); + if (command.rfind("STRVAR_", 0) == 0) { + command_i |= args[0]; + args.erase(args.begin()); + } + } + encoded += (char16_t)(command_i); + debug_printf("%04X ", command_i); + encoded += (char16_t)(args.size()); + debug_printf("%04X ", (unsigned)args.size()); + for (auto num_i : args) { + encoded += (char16_t)(num_i); + debug_printf("%04X ", num_i); + } + } else if (command == "TRNAME") { + is_trname = true; + encoded += (char16_t)(0xF100); + debug_printf("%04X ", 0xF100); + } else { + encoded += (char16_t)(stoi(enclosed, nullptr, 16)); + debug_printf("%04X ", stoi(enclosed, nullptr, 16)); + } + } else { + uint16_t code = 0; + size_t k; + string substr; + for (k = 0; k < message.size() - j; k++) { + substr = message.substr(j, k + 1); + try { + code = charmap.at(substr); + break; + } catch (out_of_range& oor) { /* silently discard */} + } + if (code == 0 && substr != "\\x0000") { + stringstream ss; + ss << "unrecognized character in " << textfilename << ": line " << i << " pos " << (j + 1) << " value " << substr; + throw runtime_error(ss.str()); + } + debug_printf("%04X ", code); + if (is_trname) { + if (code & ~0x1FF) { + stringstream ss; + ss << "invalid character for bitpacked string: " << substr; + throw runtime_error(ss.str()); + } + trnamebuf |= code << bit; + bit += 9; + if (bit >= 15) { + bit -= 15; + encoded += (char16_t)(trnamebuf & 0x7FFF); + trnamebuf >>= 15; + } + } else { + encoded += (char16_t)(code); + } + j += k; + } + } + if (is_trname && bit > 1) { + trnamebuf |= 0xFFFF << bit; + encoded += (char16_t)(trnamebuf & 0x7FFF); + debug_printf("%04X ", trnamebuf & 0x7FFF); + } + encoded += (char16_t)(0xFFFF); + debug_printf("%04X ", 0xFFFF); + return encoded; +} + +void MessagesEncoder::WriteMessagesToBin(string& filename) { + ofstream outfile(filename, ios_base::binary); + if (!outfile.good()) { + throw ofstream::failure("Unable to open file \"" + filename + "\" for writing"); + } + outfile.write((char *)&header, sizeof(header)); + for (int i = 1; i <= (int)alloc_table.size(); i++) { + alloc_table[i - 1].encrypt(header.key, i); + EncryptU16String(vec_encoded[i - 1], i); + } + outfile.write((char *)alloc_table.data(), (streamsize)(sizeof(MsgAlloc) * alloc_table.size())); + for (const u16string & m : vec_encoded) { + outfile.write((char *)m.c_str(), (streamsize)(m.size() * 2)); + } + outfile.close(); +} + +// Public virtual functions + +void MessagesEncoder::ReadInput() +{ + switch (text_format) { + case PlainText: + ReadMessagesFromText(textfilename); + break; + case GamefreakGMM: + ReadMessagesFromGMM(textfilename); + break; + } +} + +void MessagesEncoder::Convert() { + MsgAlloc alloc {(uint32_t)(sizeof(header) + sizeof(MsgAlloc) * header.count), 0}; + int i = 1; + for (const auto& message : vec_decoded) { + u16string encoded = EncodeMessage(message, i); + alloc.length = encoded.size(); + vec_encoded.push_back(encoded); + debug_printf("msg %d: at 0x%08X, count %d\n", i, alloc.offset, alloc.length); + alloc_table.push_back(alloc); + alloc.offset += alloc.length * 2; + i++; + } +} + +void MessagesEncoder::WriteOutput() { + WriteMessagesToBin(binfilename); +} diff --git a/tools/msgenc/MessagesEncoder.h b/tools/msgenc/MessagesEncoder.h new file mode 100644 index 00000000..739ea47c --- /dev/null +++ b/tools/msgenc/MessagesEncoder.h @@ -0,0 +1,30 @@ +#ifndef GUARD_MESSAGESENCODER_H +#define GUARD_MESSAGESENCODER_H + + +#include "MessagesConverter.h" + +class MessagesEncoder : public MessagesConverter +{ + map cmdmap; + map charmap; + + void ReadMessagesFromText(string& filename); + void ReadMessagesFromGMM(string& filename); + void WriteMessagesToBin(string& filename); + u16string EncodeMessage(const string& message, int & i); + void CharmapRegisterCharacter(string& code, uint16_t value) override; + void CmdmapRegisterCommand(string& command, uint16_t value) override; +public: + MessagesEncoder(Options &options) : MessagesConverter(options) { + textfilename = options.posargs[0]; + binfilename = options.posargs[1]; + } + void ReadInput() override; + void Convert() override; + void WriteOutput() override; + ~MessagesEncoder() override = default; +}; + + +#endif //GUARD_MESSAGESENCODER_H diff --git a/tools/msgenc/Options.cpp b/tools/msgenc/Options.cpp new file mode 100644 index 00000000..64492d0f --- /dev/null +++ b/tools/msgenc/Options.cpp @@ -0,0 +1,45 @@ +#include "Options.h" + +Options::Options(int argc, char **argv) { + for (int i = 1; i < argc; i++) { + string arg(argv[i]); + if (arg == "-d") { + mode = CONV_DECODE; + } else if (arg == "-e") { + mode = CONV_ENCODE; + } else if (arg == "-h") { + printUsage = true; + return; + } else if (arg == "-H") { + gmm_header = argv[++i]; + } else if (arg == "-v") { + printVersion = true; + return; + } else if (arg == "-k") { + key = stoi(argv[++i], nullptr, 0); + // If the key is 0, ensure that it is not overridden by the CRC. + key &= 0xFFFF; + key |= 0x10000; + } else if (arg == "-c") { + charmap = argv[++i]; + } else if (arg == "-D") { + dumpBinary = argv[++i]; + } else if (arg == "--gmm") { + textFormat = GamefreakGMM; + } else if (arg[0] != '-') { + posargs.push_back(arg); + } else { + failReason = "unrecognized option: " + arg; + break; + } + } + if (posargs.size() < 2) { + failReason = "missing required positional argument: " + (string[]){"INFILE", "OUTFILE"}[posargs.size()]; + } + if (mode == CONV_INVALID) { + failReason = "missing mode flag: -d or -e is required"; + } + if (charmap.empty()) { + failReason = "missing charmap file: -c CHARMAP is required"; + } +} diff --git a/tools/msgenc/Options.h b/tools/msgenc/Options.h new file mode 100644 index 00000000..ba224b9e --- /dev/null +++ b/tools/msgenc/Options.h @@ -0,0 +1,34 @@ +#ifndef GUARD_OPTIONS_H +#define GUARD_OPTIONS_H + +#include +#include +#include +#include + +using namespace std; + +enum ConvertMode : uint8_t { + CONV_ENCODE = 0, + CONV_DECODE, + CONV_INVALID = 0xFF, +}; + +struct Options { + ConvertMode mode = CONV_INVALID; + int key = 0; + vector posargs; + string failReason; + string charmap; + bool printUsage = false; + bool printVersion = false; + string dumpBinary; + string gmm_header = ""; + typedef int txtfmt; + static const txtfmt PlainText = 0; + static const txtfmt GamefreakGMM = 1; + txtfmt textFormat = PlainText; + Options(int argc, char ** argv); +}; + +#endif //GUARD_OPTIONS_H diff --git a/tools/msgenc/msgenc.cpp b/tools/msgenc/msgenc.cpp new file mode 100644 index 00000000..b77f8353 --- /dev/null +++ b/tools/msgenc/msgenc.cpp @@ -0,0 +1,80 @@ +/* + * MSGENC: Encodes a Pokemon DP message file to binary + * + * Usage: + * msgenc TXTFILE KEYFILE CHARMAP OUTFILE + */ + +#include +#include "MessagesDecoder.h" +#include "MessagesEncoder.h" +#include "Options.h" + +static const char* progname = "msgenc"; +static const char* version = "2021.12.21"; + +static inline void usage() { + cout << progname << " v" << version << endl; + cout << "Usage: " << progname << " [-h] [-v] -d|-e [OPTIONS] -c CHARMAP INFILE OUTFILE" << endl; + cout << endl; + cout << "INFILE Required: Path to the input file to convert (-e: plaintext; -d: binary)." << endl; + cout << "OUTFILE Required: Path to the output file (-e: binary; -d: plaintext)." << endl; + cout << "-c CHARMAP Required: Path to a text file with a character mapping, for example pmdsky/charmap.txt." << endl; + cout << "-d Decode from binary to text, also print the key" << endl; + cout << "-e Encode from text to binary using the provided key" << endl; + cout << "--gmm Text file is GMM (Gamefreak XML format)" << endl; + cout << "-H HEADER When operating in GMM mode, specify this header file to read/write C constant values" << endl; + cout << "-k KEY The 16-bit encryption key for this message bank. Default: computes it from the binary file name" << endl; + cout << "-v Print the program version and exit." << endl; + cout << "-h Print this message and exit." << endl; + cout << "-D DUMPNAME Dump the intermediate binary (after decryption or before encryption)." << endl; +} + +int do_main(MessagesConverter* &converter, int argc, char ** argv) { + try { + Options options(argc, argv); + if (options.printUsage || !options.failReason.empty()) { + usage(); + if (!options.failReason.empty()) { + throw invalid_argument(options.failReason); + } + return 0; + } else if (options.printVersion) { + cout << progname << " v" << version << endl; + return 0; + } + + if (options.mode == CONV_DECODE) { + converter = new MessagesDecoder(options); + } else { + converter = new MessagesEncoder(options); + } + converter->ReadInput(); + converter->ReadCharmap(); + converter->Convert(); + if (!options.dumpBinary.empty()) { + converter->WriteBinaryDecoded(options.dumpBinary); + } + converter->WriteOutput(); + if (options.mode == CONV_DECODE) { + cout << "Key: " << hex << converter->GetKey() << endl; + } + } catch (invalid_argument& ia) { + cerr << "Invalid Argument: " << ia.what() << endl; + return 1; + } catch (ios_base::failure& iof) { + cerr << "IO Failure: " << iof.what() << endl; + return 1; + } catch (runtime_error& exc) { + cerr << "Runtime Error: " << exc.what() << endl; + return 1; + } + return 0; +} + +int main(int argc, char ** argv) { + MessagesConverter *converter; + int result = do_main(converter, argc, argv); + delete converter; + return result; +} diff --git a/tools/msgenc/pugiconfig.hpp b/tools/msgenc/pugiconfig.hpp new file mode 100644 index 00000000..405a66b6 --- /dev/null +++ b/tools/msgenc/pugiconfig.hpp @@ -0,0 +1,77 @@ +/** + * pugixml parser - version 1.11 + * -------------------------------------------------------- + * Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef HEADER_PUGICONFIG_HPP +#define HEADER_PUGICONFIG_HPP + +// Uncomment this to enable wchar_t mode +// #define PUGIXML_WCHAR_MODE + +// Uncomment this to enable compact mode +// #define PUGIXML_COMPACT + +// Uncomment this to disable XPath +// #define PUGIXML_NO_XPATH + +// Uncomment this to disable STL +// #define PUGIXML_NO_STL + +// Uncomment this to disable exceptions +// #define PUGIXML_NO_EXCEPTIONS + +// Set this to control attributes for public classes/functions, i.e.: +// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL +// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL +// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall +// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead + +// Tune these constants to adjust memory-related behavior +// #define PUGIXML_MEMORY_PAGE_SIZE 32768 +// #define PUGIXML_MEMORY_OUTPUT_STACK 10240 +// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096 + +// Tune this constant to adjust max nesting for XPath queries +// #define PUGIXML_XPATH_DEPTH_LIMIT 1024 + +// Uncomment this to switch to header-only version +// #define PUGIXML_HEADER_ONLY + +// Uncomment this to enable long long support +// #define PUGIXML_HAS_LONG_LONG + +#endif + +/** + * Copyright (c) 2006-2020 Arseny Kapoulkine + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ diff --git a/tools/msgenc/pugixml.cpp b/tools/msgenc/pugixml.cpp new file mode 100644 index 00000000..efdcdf69 --- /dev/null +++ b/tools/msgenc/pugixml.cpp @@ -0,0 +1,13020 @@ +/** + * pugixml parser - version 1.11 + * -------------------------------------------------------- + * Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef SOURCE_PUGIXML_CPP +#define SOURCE_PUGIXML_CPP + +#include "pugixml.hpp" + +#include +#include +#include +#include +#include + +#ifdef PUGIXML_WCHAR_MODE +# include +#endif + +#ifndef PUGIXML_NO_XPATH +# include +# include +#endif + +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// For placement new +#include + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4324) // structure was padded due to __declspec(align()) +# pragma warning(disable: 4702) // unreachable code +# pragma warning(disable: 4996) // this function or variable may be unsafe +#endif + +#if defined(_MSC_VER) && defined(__c2__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated" // this function or variable may be unsafe +#endif + +#ifdef __INTEL_COMPILER +# pragma warning(disable: 177) // function was declared but never referenced +# pragma warning(disable: 279) // controlling expression is constant +# pragma warning(disable: 1478 1786) // function was declared "deprecated" +# pragma warning(disable: 1684) // conversion from pointer to same-sized integral type +#endif + +#if defined(__BORLANDC__) && defined(PUGIXML_HEADER_ONLY) +# pragma warn -8080 // symbol is declared but never used; disabling this inside push/pop bracket does not make the warning go away +#endif + +#ifdef __BORLANDC__ +# pragma option push +# pragma warn -8008 // condition is always false +# pragma warn -8066 // unreachable code +#endif + +#ifdef __SNC__ +// Using diag_push/diag_pop does not disable the warnings inside templates due to a compiler bug +# pragma diag_suppress=178 // function was declared but never referenced +# pragma diag_suppress=237 // controlling expression is constant +#endif + +#ifdef __TI_COMPILER_VERSION__ +# pragma diag_suppress 179 // function was declared but never referenced +#endif + +// Inlining controls +#if defined(_MSC_VER) && _MSC_VER >= 1300 +# define PUGI__NO_INLINE __declspec(noinline) +#elif defined(__GNUC__) +# define PUGI__NO_INLINE __attribute__((noinline)) +#else +# define PUGI__NO_INLINE +#endif + +// Branch weight controls +#if defined(__GNUC__) && !defined(__c2__) +# define PUGI__UNLIKELY(cond) __builtin_expect(cond, 0) +#else +# define PUGI__UNLIKELY(cond) (cond) +#endif + +// Simple static assertion +#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; } + +// Digital Mars C++ bug workaround for passing char loaded from memory via stack +#ifdef __DMC__ +# define PUGI__DMC_VOLATILE volatile +#else +# define PUGI__DMC_VOLATILE +#endif + +// Integer sanitizer workaround; we only apply this for clang since gcc8 has no_sanitize but not unsigned-integer-overflow and produces "attribute directive ignored" warnings +#if defined(__clang__) && defined(__has_attribute) +# if __has_attribute(no_sanitize) +# define PUGI__UNSIGNED_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow"))) +# else +# define PUGI__UNSIGNED_OVERFLOW +# endif +#else +# define PUGI__UNSIGNED_OVERFLOW +#endif + +// Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all) +#if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST) +using std::memcpy; +using std::memmove; +using std::memset; +#endif + +// Some MinGW/GCC versions have headers that erroneously omit LLONG_MIN/LLONG_MAX/ULLONG_MAX definitions from limits.h in some configurations +#if defined(PUGIXML_HAS_LONG_LONG) && defined(__GNUC__) && !defined(LLONG_MAX) && !defined(LLONG_MIN) && !defined(ULLONG_MAX) +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define LLONG_MAX __LONG_LONG_MAX__ +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +#endif + +// In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features +#if defined(_MSC_VER) && !defined(__S3E__) +# define PUGI__MSVC_CRT_VERSION _MSC_VER +#endif + +// Not all platforms have snprintf; we define a wrapper that uses snprintf if possible. This only works with buffers with a known size. +#if __cplusplus >= 201103 +# define PUGI__SNPRINTF(buf, ...) snprintf(buf, sizeof(buf), __VA_ARGS__) +#elif defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 +# define PUGI__SNPRINTF(buf, ...) _snprintf_s(buf, _countof(buf), _TRUNCATE, __VA_ARGS__) +#else +# define PUGI__SNPRINTF sprintf +#endif + +// We put implementation details into an anonymous namespace in source mode, but have to keep it in non-anonymous namespace in header-only mode to prevent binary bloat. +#ifdef PUGIXML_HEADER_ONLY +# define PUGI__NS_BEGIN namespace pugi { namespace impl { +# define PUGI__NS_END } } +# define PUGI__FN inline +# define PUGI__FN_NO_INLINE inline +#else +# if defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces +# define PUGI__NS_BEGIN namespace pugi { namespace impl { +# define PUGI__NS_END } } +# else +# define PUGI__NS_BEGIN namespace pugi { namespace impl { namespace { +# define PUGI__NS_END } } } +# endif +# define PUGI__FN +# define PUGI__FN_NO_INLINE PUGI__NO_INLINE +#endif + +// uintptr_t +#if (defined(_MSC_VER) && _MSC_VER < 1600) || (defined(__BORLANDC__) && __BORLANDC__ < 0x561) +namespace pugi +{ +# ifndef _UINTPTR_T_DEFINED + typedef size_t uintptr_t; +# endif + + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +} +#else +# include +#endif + +// Memory allocation +PUGI__NS_BEGIN + PUGI__FN void* default_allocate(size_t size) + { + return malloc(size); + } + + PUGI__FN void default_deallocate(void* ptr) + { + free(ptr); + } + + template + struct xml_memory_management_function_storage + { + static allocation_function allocate; + static deallocation_function deallocate; + }; + + // Global allocation functions are stored in class statics so that in header mode linker deduplicates them + // Without a template<> we'll get multiple definitions of the same static + template allocation_function xml_memory_management_function_storage::allocate = default_allocate; + template deallocation_function xml_memory_management_function_storage::deallocate = default_deallocate; + + typedef xml_memory_management_function_storage xml_memory; +PUGI__NS_END + +// String utilities +PUGI__NS_BEGIN + // Get string length + PUGI__FN size_t strlength(const char_t* s) + { + assert(s); + + #ifdef PUGIXML_WCHAR_MODE + return wcslen(s); + #else + return strlen(s); + #endif + } + + // Compare two strings + PUGI__FN bool strequal(const char_t* src, const char_t* dst) + { + assert(src && dst); + + #ifdef PUGIXML_WCHAR_MODE + return wcscmp(src, dst) == 0; + #else + return strcmp(src, dst) == 0; + #endif + } + + // Compare lhs with [rhs_begin, rhs_end) + PUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count) + { + for (size_t i = 0; i < count; ++i) + if (lhs[i] != rhs[i]) + return false; + + return lhs[count] == 0; + } + + // Get length of wide string, even if CRT lacks wide character support + PUGI__FN size_t strlength_wide(const wchar_t* s) + { + assert(s); + + #ifdef PUGIXML_WCHAR_MODE + return wcslen(s); + #else + const wchar_t* end = s; + while (*end) end++; + return static_cast(end - s); + #endif + } +PUGI__NS_END + +// auto_ptr-like object for exception recovery +PUGI__NS_BEGIN + template struct auto_deleter + { + typedef void (*D)(T*); + + T* data; + D deleter; + + auto_deleter(T* data_, D deleter_): data(data_), deleter(deleter_) + { + } + + ~auto_deleter() + { + if (data) deleter(data); + } + + T* release() + { + T* result = data; + data = 0; + return result; + } + }; +PUGI__NS_END + +#ifdef PUGIXML_COMPACT +PUGI__NS_BEGIN + class compact_hash_table + { + public: + compact_hash_table(): _items(0), _capacity(0), _count(0) + { + } + + void clear() + { + if (_items) + { + xml_memory::deallocate(_items); + _items = 0; + _capacity = 0; + _count = 0; + } + } + + void* find(const void* key) + { + if (_capacity == 0) return 0; + + item_t* item = get_item(key); + assert(item); + assert(item->key == key || (item->key == 0 && item->value == 0)); + + return item->value; + } + + void insert(const void* key, void* value) + { + assert(_capacity != 0 && _count < _capacity - _capacity / 4); + + item_t* item = get_item(key); + assert(item); + + if (item->key == 0) + { + _count++; + item->key = key; + } + + item->value = value; + } + + bool reserve(size_t extra = 16) + { + if (_count + extra >= _capacity - _capacity / 4) + return rehash(_count + extra); + + return true; + } + + private: + struct item_t + { + const void* key; + void* value; + }; + + item_t* _items; + size_t _capacity; + + size_t _count; + + bool rehash(size_t count); + + item_t* get_item(const void* key) + { + assert(key); + assert(_capacity > 0); + + size_t hashmod = _capacity - 1; + size_t bucket = hash(key) & hashmod; + + for (size_t probe = 0; probe <= hashmod; ++probe) + { + item_t& probe_item = _items[bucket]; + + if (probe_item.key == key || probe_item.key == 0) + return &probe_item; + + // hash collision, quadratic probing + bucket = (bucket + probe + 1) & hashmod; + } + + assert(false && "Hash table is full"); // unreachable + return 0; + } + + static PUGI__UNSIGNED_OVERFLOW unsigned int hash(const void* key) + { + unsigned int h = static_cast(reinterpret_cast(key) & 0xffffffff); + + // MurmurHash3 32-bit finalizer + h ^= h >> 16; + h *= 0x85ebca6bu; + h ^= h >> 13; + h *= 0xc2b2ae35u; + h ^= h >> 16; + + return h; + } + }; + + PUGI__FN_NO_INLINE bool compact_hash_table::rehash(size_t count) + { + size_t capacity = 32; + while (count >= capacity - capacity / 4) + capacity *= 2; + + compact_hash_table rt; + rt._capacity = capacity; + rt._items = static_cast(xml_memory::allocate(sizeof(item_t) * capacity)); + + if (!rt._items) + return false; + + memset(rt._items, 0, sizeof(item_t) * capacity); + + for (size_t i = 0; i < _capacity; ++i) + if (_items[i].key) + rt.insert(_items[i].key, _items[i].value); + + if (_items) + xml_memory::deallocate(_items); + + _capacity = capacity; + _items = rt._items; + + assert(_count == rt._count); + + return true; + } + +PUGI__NS_END +#endif + +PUGI__NS_BEGIN +#ifdef PUGIXML_COMPACT + static const uintptr_t xml_memory_block_alignment = 4; +#else + static const uintptr_t xml_memory_block_alignment = sizeof(void*); +#endif + + // extra metadata bits + static const uintptr_t xml_memory_page_contents_shared_mask = 64; + static const uintptr_t xml_memory_page_name_allocated_mask = 32; + static const uintptr_t xml_memory_page_value_allocated_mask = 16; + static const uintptr_t xml_memory_page_type_mask = 15; + + // combined masks for string uniqueness + static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask; + static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask; + +#ifdef PUGIXML_COMPACT + #define PUGI__GETHEADER_IMPL(object, page, flags) // unused + #define PUGI__GETPAGE_IMPL(header) (header).get_page() +#else + #define PUGI__GETHEADER_IMPL(object, page, flags) (((reinterpret_cast(object) - reinterpret_cast(page)) << 8) | (flags)) + // this macro casts pointers through void* to avoid 'cast increases required alignment of target type' warnings + #define PUGI__GETPAGE_IMPL(header) static_cast(const_cast(static_cast(reinterpret_cast(&header) - (header >> 8)))) +#endif + + #define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header) + #define PUGI__NODETYPE(n) static_cast((n)->header & impl::xml_memory_page_type_mask) + + struct xml_allocator; + + struct xml_memory_page + { + static xml_memory_page* construct(void* memory) + { + xml_memory_page* result = static_cast(memory); + + result->allocator = 0; + result->prev = 0; + result->next = 0; + result->busy_size = 0; + result->freed_size = 0; + + #ifdef PUGIXML_COMPACT + result->compact_string_base = 0; + result->compact_shared_parent = 0; + result->compact_page_marker = 0; + #endif + + return result; + } + + xml_allocator* allocator; + + xml_memory_page* prev; + xml_memory_page* next; + + size_t busy_size; + size_t freed_size; + + #ifdef PUGIXML_COMPACT + char_t* compact_string_base; + void* compact_shared_parent; + uint32_t* compact_page_marker; + #endif + }; + + static const size_t xml_memory_page_size = + #ifdef PUGIXML_MEMORY_PAGE_SIZE + (PUGIXML_MEMORY_PAGE_SIZE) + #else + 32768 + #endif + - sizeof(xml_memory_page); + + struct xml_memory_string_header + { + uint16_t page_offset; // offset from page->data + uint16_t full_size; // 0 if string occupies whole page + }; + + struct xml_allocator + { + xml_allocator(xml_memory_page* root): _root(root), _busy_size(root->busy_size) + { + #ifdef PUGIXML_COMPACT + _hash = 0; + #endif + } + + xml_memory_page* allocate_page(size_t data_size) + { + size_t size = sizeof(xml_memory_page) + data_size; + + // allocate block with some alignment, leaving memory for worst-case padding + void* memory = xml_memory::allocate(size); + if (!memory) return 0; + + // prepare page structure + xml_memory_page* page = xml_memory_page::construct(memory); + assert(page); + + page->allocator = _root->allocator; + + return page; + } + + static void deallocate_page(xml_memory_page* page) + { + xml_memory::deallocate(page); + } + + void* allocate_memory_oob(size_t size, xml_memory_page*& out_page); + + void* allocate_memory(size_t size, xml_memory_page*& out_page) + { + if (PUGI__UNLIKELY(_busy_size + size > xml_memory_page_size)) + return allocate_memory_oob(size, out_page); + + void* buf = reinterpret_cast(_root) + sizeof(xml_memory_page) + _busy_size; + + _busy_size += size; + + out_page = _root; + + return buf; + } + + #ifdef PUGIXML_COMPACT + void* allocate_object(size_t size, xml_memory_page*& out_page) + { + void* result = allocate_memory(size + sizeof(uint32_t), out_page); + if (!result) return 0; + + // adjust for marker + ptrdiff_t offset = static_cast(result) - reinterpret_cast(out_page->compact_page_marker); + + if (PUGI__UNLIKELY(static_cast(offset) >= 256 * xml_memory_block_alignment)) + { + // insert new marker + uint32_t* marker = static_cast(result); + + *marker = static_cast(reinterpret_cast(marker) - reinterpret_cast(out_page)); + out_page->compact_page_marker = marker; + + // since we don't reuse the page space until we reallocate it, we can just pretend that we freed the marker block + // this will make sure deallocate_memory correctly tracks the size + out_page->freed_size += sizeof(uint32_t); + + return marker + 1; + } + else + { + // roll back uint32_t part + _busy_size -= sizeof(uint32_t); + + return result; + } + } + #else + void* allocate_object(size_t size, xml_memory_page*& out_page) + { + return allocate_memory(size, out_page); + } + #endif + + void deallocate_memory(void* ptr, size_t size, xml_memory_page* page) + { + if (page == _root) page->busy_size = _busy_size; + + assert(ptr >= reinterpret_cast(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast(page) + sizeof(xml_memory_page) + page->busy_size); + (void)!ptr; + + page->freed_size += size; + assert(page->freed_size <= page->busy_size); + + if (page->freed_size == page->busy_size) + { + if (page->next == 0) + { + assert(_root == page); + + // top page freed, just reset sizes + page->busy_size = 0; + page->freed_size = 0; + + #ifdef PUGIXML_COMPACT + // reset compact state to maximize efficiency + page->compact_string_base = 0; + page->compact_shared_parent = 0; + page->compact_page_marker = 0; + #endif + + _busy_size = 0; + } + else + { + assert(_root != page); + assert(page->prev); + + // remove from the list + page->prev->next = page->next; + page->next->prev = page->prev; + + // deallocate + deallocate_page(page); + } + } + } + + char_t* allocate_string(size_t length) + { + static const size_t max_encoded_offset = (1 << 16) * xml_memory_block_alignment; + + PUGI__STATIC_ASSERT(xml_memory_page_size <= max_encoded_offset); + + // allocate memory for string and header block + size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t); + + // round size up to block alignment boundary + size_t full_size = (size + (xml_memory_block_alignment - 1)) & ~(xml_memory_block_alignment - 1); + + xml_memory_page* page; + xml_memory_string_header* header = static_cast(allocate_memory(full_size, page)); + + if (!header) return 0; + + // setup header + ptrdiff_t page_offset = reinterpret_cast(header) - reinterpret_cast(page) - sizeof(xml_memory_page); + + assert(page_offset % xml_memory_block_alignment == 0); + assert(page_offset >= 0 && static_cast(page_offset) < max_encoded_offset); + header->page_offset = static_cast(static_cast(page_offset) / xml_memory_block_alignment); + + // full_size == 0 for large strings that occupy the whole page + assert(full_size % xml_memory_block_alignment == 0); + assert(full_size < max_encoded_offset || (page->busy_size == full_size && page_offset == 0)); + header->full_size = static_cast(full_size < max_encoded_offset ? full_size / xml_memory_block_alignment : 0); + + // round-trip through void* to avoid 'cast increases required alignment of target type' warning + // header is guaranteed a pointer-sized alignment, which should be enough for char_t + return static_cast(static_cast(header + 1)); + } + + void deallocate_string(char_t* string) + { + // this function casts pointers through void* to avoid 'cast increases required alignment of target type' warnings + // we're guaranteed the proper (pointer-sized) alignment on the input string if it was allocated via allocate_string + + // get header + xml_memory_string_header* header = static_cast(static_cast(string)) - 1; + assert(header); + + // deallocate + size_t page_offset = sizeof(xml_memory_page) + header->page_offset * xml_memory_block_alignment; + xml_memory_page* page = reinterpret_cast(static_cast(reinterpret_cast(header) - page_offset)); + + // if full_size == 0 then this string occupies the whole page + size_t full_size = header->full_size == 0 ? page->busy_size : header->full_size * xml_memory_block_alignment; + + deallocate_memory(header, full_size, page); + } + + bool reserve() + { + #ifdef PUGIXML_COMPACT + return _hash->reserve(); + #else + return true; + #endif + } + + xml_memory_page* _root; + size_t _busy_size; + + #ifdef PUGIXML_COMPACT + compact_hash_table* _hash; + #endif + }; + + PUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page) + { + const size_t large_allocation_threshold = xml_memory_page_size / 4; + + xml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size); + out_page = page; + + if (!page) return 0; + + if (size <= large_allocation_threshold) + { + _root->busy_size = _busy_size; + + // insert page at the end of linked list + page->prev = _root; + _root->next = page; + _root = page; + + _busy_size = size; + } + else + { + // insert page before the end of linked list, so that it is deleted as soon as possible + // the last page is not deleted even if it's empty (see deallocate_memory) + assert(_root->prev); + + page->prev = _root->prev; + page->next = _root; + + _root->prev->next = page; + _root->prev = page; + + page->busy_size = size; + } + + return reinterpret_cast(page) + sizeof(xml_memory_page); + } +PUGI__NS_END + +#ifdef PUGIXML_COMPACT +PUGI__NS_BEGIN + static const uintptr_t compact_alignment_log2 = 2; + static const uintptr_t compact_alignment = 1 << compact_alignment_log2; + + class compact_header + { + public: + compact_header(xml_memory_page* page, unsigned int flags) + { + PUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment); + + ptrdiff_t offset = (reinterpret_cast(this) - reinterpret_cast(page->compact_page_marker)); + assert(offset % compact_alignment == 0 && static_cast(offset) < 256 * compact_alignment); + + _page = static_cast(offset >> compact_alignment_log2); + _flags = static_cast(flags); + } + + void operator&=(uintptr_t mod) + { + _flags &= static_cast(mod); + } + + void operator|=(uintptr_t mod) + { + _flags |= static_cast(mod); + } + + uintptr_t operator&(uintptr_t mod) const + { + return _flags & mod; + } + + xml_memory_page* get_page() const + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + const char* page_marker = reinterpret_cast(this) - (_page << compact_alignment_log2); + const char* page = page_marker - *reinterpret_cast(static_cast(page_marker)); + + return const_cast(reinterpret_cast(static_cast(page))); + } + + private: + unsigned char _page; + unsigned char _flags; + }; + + PUGI__FN xml_memory_page* compact_get_page(const void* object, int header_offset) + { + const compact_header* header = reinterpret_cast(static_cast(object) - header_offset); + + return header->get_page(); + } + + template PUGI__FN_NO_INLINE T* compact_get_value(const void* object) + { + return static_cast(compact_get_page(object, header_offset)->allocator->_hash->find(object)); + } + + template PUGI__FN_NO_INLINE void compact_set_value(const void* object, T* value) + { + compact_get_page(object, header_offset)->allocator->_hash->insert(object, value); + } + + template class compact_pointer + { + public: + compact_pointer(): _data(0) + { + } + + void operator=(const compact_pointer& rhs) + { + *this = rhs + 0; + } + + void operator=(T* value) + { + if (value) + { + // value is guaranteed to be compact-aligned; 'this' is not + // our decoding is based on 'this' aligned to compact alignment downwards (see operator T*) + // so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to + // compensate for arithmetic shift rounding for negative values + ptrdiff_t diff = reinterpret_cast(value) - reinterpret_cast(this); + ptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) - start; + + if (static_cast(offset) <= 253) + _data = static_cast(offset + 1); + else + { + compact_set_value(this, value); + + _data = 255; + } + } + else + _data = 0; + } + + operator T*() const + { + if (_data) + { + if (_data < 255) + { + uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); + + return reinterpret_cast(base + (_data - 1 + start) * compact_alignment); + } + else + return compact_get_value(this); + } + else + return 0; + } + + T* operator->() const + { + return *this; + } + + private: + unsigned char _data; + }; + + template class compact_pointer_parent + { + public: + compact_pointer_parent(): _data(0) + { + } + + void operator=(const compact_pointer_parent& rhs) + { + *this = rhs + 0; + } + + void operator=(T* value) + { + if (value) + { + // value is guaranteed to be compact-aligned; 'this' is not + // our decoding is based on 'this' aligned to compact alignment downwards (see operator T*) + // so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to + // compensate for arithmetic shift behavior for negative values + ptrdiff_t diff = reinterpret_cast(value) - reinterpret_cast(this); + ptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) + 65533; + + if (static_cast(offset) <= 65533) + { + _data = static_cast(offset + 1); + } + else + { + xml_memory_page* page = compact_get_page(this, header_offset); + + if (PUGI__UNLIKELY(page->compact_shared_parent == 0)) + page->compact_shared_parent = value; + + if (page->compact_shared_parent == value) + { + _data = 65534; + } + else + { + compact_set_value(this, value); + + _data = 65535; + } + } + } + else + { + _data = 0; + } + } + + operator T*() const + { + if (_data) + { + if (_data < 65534) + { + uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); + + return reinterpret_cast(base + (_data - 1 - 65533) * compact_alignment); + } + else if (_data == 65534) + return static_cast(compact_get_page(this, header_offset)->compact_shared_parent); + else + return compact_get_value(this); + } + else + return 0; + } + + T* operator->() const + { + return *this; + } + + private: + uint16_t _data; + }; + + template class compact_string + { + public: + compact_string(): _data(0) + { + } + + void operator=(const compact_string& rhs) + { + *this = rhs + 0; + } + + void operator=(char_t* value) + { + if (value) + { + xml_memory_page* page = compact_get_page(this, header_offset); + + if (PUGI__UNLIKELY(page->compact_string_base == 0)) + page->compact_string_base = value; + + ptrdiff_t offset = value - page->compact_string_base; + + if (static_cast(offset) < (65535 << 7)) + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); + + if (*base == 0) + { + *base = static_cast((offset >> 7) + 1); + _data = static_cast((offset & 127) + 1); + } + else + { + ptrdiff_t remainder = offset - ((*base - 1) << 7); + + if (static_cast(remainder) <= 253) + { + _data = static_cast(remainder + 1); + } + else + { + compact_set_value(this, value); + + _data = 255; + } + } + } + else + { + compact_set_value(this, value); + + _data = 255; + } + } + else + { + _data = 0; + } + } + + operator char_t*() const + { + if (_data) + { + if (_data < 255) + { + xml_memory_page* page = compact_get_page(this, header_offset); + + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + const uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); + assert(*base); + + ptrdiff_t offset = ((*base - 1) << 7) + (_data - 1); + + return page->compact_string_base + offset; + } + else + { + return compact_get_value(this); + } + } + else + return 0; + } + + private: + unsigned char _data; + }; +PUGI__NS_END +#endif + +#ifdef PUGIXML_COMPACT +namespace pugi +{ + struct xml_attribute_struct + { + xml_attribute_struct(impl::xml_memory_page* page): header(page, 0), namevalue_base(0) + { + PUGI__STATIC_ASSERT(sizeof(xml_attribute_struct) == 8); + } + + impl::compact_header header; + + uint16_t namevalue_base; + + impl::compact_string<4, 2> name; + impl::compact_string<5, 3> value; + + impl::compact_pointer prev_attribute_c; + impl::compact_pointer next_attribute; + }; + + struct xml_node_struct + { + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(page, type), namevalue_base(0) + { + PUGI__STATIC_ASSERT(sizeof(xml_node_struct) == 12); + } + + impl::compact_header header; + + uint16_t namevalue_base; + + impl::compact_string<4, 2> name; + impl::compact_string<5, 3> value; + + impl::compact_pointer_parent parent; + + impl::compact_pointer first_child; + + impl::compact_pointer prev_sibling_c; + impl::compact_pointer next_sibling; + + impl::compact_pointer first_attribute; + }; +} +#else +namespace pugi +{ + struct xml_attribute_struct + { + xml_attribute_struct(impl::xml_memory_page* page): name(0), value(0), prev_attribute_c(0), next_attribute(0) + { + header = PUGI__GETHEADER_IMPL(this, page, 0); + } + + uintptr_t header; + + char_t* name; + char_t* value; + + xml_attribute_struct* prev_attribute_c; + xml_attribute_struct* next_attribute; + }; + + struct xml_node_struct + { + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): name(0), value(0), parent(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0) + { + header = PUGI__GETHEADER_IMPL(this, page, type); + } + + uintptr_t header; + + char_t* name; + char_t* value; + + xml_node_struct* parent; + + xml_node_struct* first_child; + + xml_node_struct* prev_sibling_c; + xml_node_struct* next_sibling; + + xml_attribute_struct* first_attribute; + }; +} +#endif + +PUGI__NS_BEGIN + struct xml_extra_buffer + { + char_t* buffer; + xml_extra_buffer* next; + }; + + struct xml_document_struct: public xml_node_struct, public xml_allocator + { + xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0) + { + } + + const char_t* buffer; + + xml_extra_buffer* extra_buffers; + + #ifdef PUGIXML_COMPACT + compact_hash_table hash; + #endif + }; + + template inline xml_allocator& get_allocator(const Object* object) + { + assert(object); + + return *PUGI__GETPAGE(object)->allocator; + } + + template inline xml_document_struct& get_document(const Object* object) + { + assert(object); + + return *static_cast(PUGI__GETPAGE(object)->allocator); + } +PUGI__NS_END + +// Low-level DOM operations +PUGI__NS_BEGIN + inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc) + { + xml_memory_page* page; + void* memory = alloc.allocate_object(sizeof(xml_attribute_struct), page); + if (!memory) return 0; + + return new (memory) xml_attribute_struct(page); + } + + inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type) + { + xml_memory_page* page; + void* memory = alloc.allocate_object(sizeof(xml_node_struct), page); + if (!memory) return 0; + + return new (memory) xml_node_struct(page, type); + } + + inline void destroy_attribute(xml_attribute_struct* a, xml_allocator& alloc) + { + if (a->header & impl::xml_memory_page_name_allocated_mask) + alloc.deallocate_string(a->name); + + if (a->header & impl::xml_memory_page_value_allocated_mask) + alloc.deallocate_string(a->value); + + alloc.deallocate_memory(a, sizeof(xml_attribute_struct), PUGI__GETPAGE(a)); + } + + inline void destroy_node(xml_node_struct* n, xml_allocator& alloc) + { + if (n->header & impl::xml_memory_page_name_allocated_mask) + alloc.deallocate_string(n->name); + + if (n->header & impl::xml_memory_page_value_allocated_mask) + alloc.deallocate_string(n->value); + + for (xml_attribute_struct* attr = n->first_attribute; attr; ) + { + xml_attribute_struct* next = attr->next_attribute; + + destroy_attribute(attr, alloc); + + attr = next; + } + + for (xml_node_struct* child = n->first_child; child; ) + { + xml_node_struct* next = child->next_sibling; + + destroy_node(child, alloc); + + child = next; + } + + alloc.deallocate_memory(n, sizeof(xml_node_struct), PUGI__GETPAGE(n)); + } + + inline void append_node(xml_node_struct* child, xml_node_struct* node) + { + child->parent = node; + + xml_node_struct* head = node->first_child; + + if (head) + { + xml_node_struct* tail = head->prev_sibling_c; + + tail->next_sibling = child; + child->prev_sibling_c = tail; + head->prev_sibling_c = child; + } + else + { + node->first_child = child; + child->prev_sibling_c = child; + } + } + + inline void prepend_node(xml_node_struct* child, xml_node_struct* node) + { + child->parent = node; + + xml_node_struct* head = node->first_child; + + if (head) + { + child->prev_sibling_c = head->prev_sibling_c; + head->prev_sibling_c = child; + } + else + child->prev_sibling_c = child; + + child->next_sibling = head; + node->first_child = child; + } + + inline void insert_node_after(xml_node_struct* child, xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + child->parent = parent; + + if (node->next_sibling) + node->next_sibling->prev_sibling_c = child; + else + parent->first_child->prev_sibling_c = child; + + child->next_sibling = node->next_sibling; + child->prev_sibling_c = node; + + node->next_sibling = child; + } + + inline void insert_node_before(xml_node_struct* child, xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + child->parent = parent; + + if (node->prev_sibling_c->next_sibling) + node->prev_sibling_c->next_sibling = child; + else + parent->first_child = child; + + child->prev_sibling_c = node->prev_sibling_c; + child->next_sibling = node; + + node->prev_sibling_c = child; + } + + inline void remove_node(xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + if (node->next_sibling) + node->next_sibling->prev_sibling_c = node->prev_sibling_c; + else + parent->first_child->prev_sibling_c = node->prev_sibling_c; + + if (node->prev_sibling_c->next_sibling) + node->prev_sibling_c->next_sibling = node->next_sibling; + else + parent->first_child = node->next_sibling; + + node->parent = 0; + node->prev_sibling_c = 0; + node->next_sibling = 0; + } + + inline void append_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + xml_attribute_struct* head = node->first_attribute; + + if (head) + { + xml_attribute_struct* tail = head->prev_attribute_c; + + tail->next_attribute = attr; + attr->prev_attribute_c = tail; + head->prev_attribute_c = attr; + } + else + { + node->first_attribute = attr; + attr->prev_attribute_c = attr; + } + } + + inline void prepend_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + xml_attribute_struct* head = node->first_attribute; + + if (head) + { + attr->prev_attribute_c = head->prev_attribute_c; + head->prev_attribute_c = attr; + } + else + attr->prev_attribute_c = attr; + + attr->next_attribute = head; + node->first_attribute = attr; + } + + inline void insert_attribute_after(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node) + { + if (place->next_attribute) + place->next_attribute->prev_attribute_c = attr; + else + node->first_attribute->prev_attribute_c = attr; + + attr->next_attribute = place->next_attribute; + attr->prev_attribute_c = place; + place->next_attribute = attr; + } + + inline void insert_attribute_before(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node) + { + if (place->prev_attribute_c->next_attribute) + place->prev_attribute_c->next_attribute = attr; + else + node->first_attribute = attr; + + attr->prev_attribute_c = place->prev_attribute_c; + attr->next_attribute = place; + place->prev_attribute_c = attr; + } + + inline void remove_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + if (attr->next_attribute) + attr->next_attribute->prev_attribute_c = attr->prev_attribute_c; + else + node->first_attribute->prev_attribute_c = attr->prev_attribute_c; + + if (attr->prev_attribute_c->next_attribute) + attr->prev_attribute_c->next_attribute = attr->next_attribute; + else + node->first_attribute = attr->next_attribute; + + attr->prev_attribute_c = 0; + attr->next_attribute = 0; + } + + PUGI__FN_NO_INLINE xml_node_struct* append_new_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element) + { + if (!alloc.reserve()) return 0; + + xml_node_struct* child = allocate_node(alloc, type); + if (!child) return 0; + + append_node(child, node); + + return child; + } + + PUGI__FN_NO_INLINE xml_attribute_struct* append_new_attribute(xml_node_struct* node, xml_allocator& alloc) + { + if (!alloc.reserve()) return 0; + + xml_attribute_struct* attr = allocate_attribute(alloc); + if (!attr) return 0; + + append_attribute(attr, node); + + return attr; + } +PUGI__NS_END + +// Helper classes for code generation +PUGI__NS_BEGIN + struct opt_false + { + enum { value = 0 }; + }; + + struct opt_true + { + enum { value = 1 }; + }; +PUGI__NS_END + +// Unicode utilities +PUGI__NS_BEGIN + inline uint16_t endian_swap(uint16_t value) + { + return static_cast(((value & 0xff) << 8) | (value >> 8)); + } + + inline uint32_t endian_swap(uint32_t value) + { + return ((value & 0xff) << 24) | ((value & 0xff00) << 8) | ((value & 0xff0000) >> 8) | (value >> 24); + } + + struct utf8_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t ch) + { + // U+0000..U+007F + if (ch < 0x80) return result + 1; + // U+0080..U+07FF + else if (ch < 0x800) return result + 2; + // U+0800..U+FFFF + else return result + 3; + } + + static value_type high(value_type result, uint32_t) + { + // U+10000..U+10FFFF + return result + 4; + } + }; + + struct utf8_writer + { + typedef uint8_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + // U+0000..U+007F + if (ch < 0x80) + { + *result = static_cast(ch); + return result + 1; + } + // U+0080..U+07FF + else if (ch < 0x800) + { + result[0] = static_cast(0xC0 | (ch >> 6)); + result[1] = static_cast(0x80 | (ch & 0x3F)); + return result + 2; + } + // U+0800..U+FFFF + else + { + result[0] = static_cast(0xE0 | (ch >> 12)); + result[1] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[2] = static_cast(0x80 | (ch & 0x3F)); + return result + 3; + } + } + + static value_type high(value_type result, uint32_t ch) + { + // U+10000..U+10FFFF + result[0] = static_cast(0xF0 | (ch >> 18)); + result[1] = static_cast(0x80 | ((ch >> 12) & 0x3F)); + result[2] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[3] = static_cast(0x80 | (ch & 0x3F)); + return result + 4; + } + + static value_type any(value_type result, uint32_t ch) + { + return (ch < 0x10000) ? low(result, ch) : high(result, ch); + } + }; + + struct utf16_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t) + { + return result + 1; + } + + static value_type high(value_type result, uint32_t) + { + return result + 2; + } + }; + + struct utf16_writer + { + typedef uint16_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = static_cast(ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + uint32_t msh = static_cast(ch - 0x10000) >> 10; + uint32_t lsh = static_cast(ch - 0x10000) & 0x3ff; + + result[0] = static_cast(0xD800 + msh); + result[1] = static_cast(0xDC00 + lsh); + + return result + 2; + } + + static value_type any(value_type result, uint32_t ch) + { + return (ch < 0x10000) ? low(result, ch) : high(result, ch); + } + }; + + struct utf32_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t) + { + return result + 1; + } + + static value_type high(value_type result, uint32_t) + { + return result + 1; + } + }; + + struct utf32_writer + { + typedef uint32_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + + static value_type any(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + }; + + struct latin1_writer + { + typedef uint8_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = static_cast(ch > 255 ? '?' : ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + (void)ch; + + *result = '?'; + + return result + 1; + } + }; + + struct utf8_decoder + { + typedef uint8_t type; + + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) + { + const uint8_t utf8_byte_mask = 0x3f; + + while (size) + { + uint8_t lead = *data; + + // 0xxxxxxx -> U+0000..U+007F + if (lead < 0x80) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + + // process aligned single-byte (ascii) blocks + if ((reinterpret_cast(data) & 3) == 0) + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + while (size >= 4 && (*static_cast(static_cast(data)) & 0x80808080) == 0) + { + result = Traits::low(result, data[0]); + result = Traits::low(result, data[1]); + result = Traits::low(result, data[2]); + result = Traits::low(result, data[3]); + data += 4; + size -= 4; + } + } + } + // 110xxxxx -> U+0080..U+07FF + else if (static_cast(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80) + { + result = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask)); + data += 2; + size -= 2; + } + // 1110xxxx -> U+0800-U+FFFF + else if (static_cast(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80) + { + result = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask)); + data += 3; + size -= 3; + } + // 11110xxx -> U+10000..U+10FFFF + else if (static_cast(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80) + { + result = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask)); + data += 4; + size -= 4; + } + // 10xxxxxx or 11111xxx -> invalid + else + { + data += 1; + size -= 1; + } + } + + return result; + } + }; + + template struct utf16_decoder + { + typedef uint16_t type; + + template static inline typename Traits::value_type process(const uint16_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + uint16_t lead = opt_swap::value ? endian_swap(*data) : *data; + + // U+0000..U+D7FF + if (lead < 0xD800) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // U+E000..U+FFFF + else if (static_cast(lead - 0xE000) < 0x2000) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // surrogate pair lead + else if (static_cast(lead - 0xD800) < 0x400 && size >= 2) + { + uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1]; + + if (static_cast(next - 0xDC00) < 0x400) + { + result = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff)); + data += 2; + size -= 2; + } + else + { + data += 1; + size -= 1; + } + } + else + { + data += 1; + size -= 1; + } + } + + return result; + } + }; + + template struct utf32_decoder + { + typedef uint32_t type; + + template static inline typename Traits::value_type process(const uint32_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + uint32_t lead = opt_swap::value ? endian_swap(*data) : *data; + + // U+0000..U+FFFF + if (lead < 0x10000) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // U+10000..U+10FFFF + else + { + result = Traits::high(result, lead); + data += 1; + size -= 1; + } + } + + return result; + } + }; + + struct latin1_decoder + { + typedef uint8_t type; + + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + result = Traits::low(result, *data); + data += 1; + size -= 1; + } + + return result; + } + }; + + template struct wchar_selector; + + template <> struct wchar_selector<2> + { + typedef uint16_t type; + typedef utf16_counter counter; + typedef utf16_writer writer; + typedef utf16_decoder decoder; + }; + + template <> struct wchar_selector<4> + { + typedef uint32_t type; + typedef utf32_counter counter; + typedef utf32_writer writer; + typedef utf32_decoder decoder; + }; + + typedef wchar_selector::counter wchar_counter; + typedef wchar_selector::writer wchar_writer; + + struct wchar_decoder + { + typedef wchar_t type; + + template static inline typename Traits::value_type process(const wchar_t* data, size_t size, typename Traits::value_type result, Traits traits) + { + typedef wchar_selector::decoder decoder; + + return decoder::process(reinterpret_cast(data), size, result, traits); + } + }; + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length) + { + for (size_t i = 0; i < length; ++i) + result[i] = static_cast(endian_swap(static_cast::type>(data[i]))); + } +#endif +PUGI__NS_END + +PUGI__NS_BEGIN + enum chartype_t + { + ct_parse_pcdata = 1, // \0, &, \r, < + ct_parse_attr = 2, // \0, &, \r, ', " + ct_parse_attr_ws = 4, // \0, &, \r, ', ", \n, tab + ct_space = 8, // \r, \n, space, tab + ct_parse_cdata = 16, // \0, ], >, \r + ct_parse_comment = 32, // \0, -, >, \r + ct_symbol = 64, // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, . + ct_start_symbol = 128 // Any symbol > 127, a-z, A-Z, _, : + }; + + static const unsigned char chartype_table[256] = + { + 55, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 63, 0, 0, // 0-15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31 + 8, 0, 6, 0, 0, 0, 7, 6, 0, 0, 0, 0, 0, 96, 64, 0, // 32-47 + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 0, 1, 0, 48, 0, // 48-63 + 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 64-79 + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 16, 0, 192, // 80-95 + 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 96-111 + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 0, // 112-127 + + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 128+ + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192 + }; + + enum chartypex_t + { + ctx_special_pcdata = 1, // Any symbol >= 0 and < 32 (except \t, \r, \n), &, <, > + ctx_special_attr = 2, // Any symbol >= 0 and < 32, &, <, ", ' + ctx_start_symbol = 4, // Any symbol > 127, a-z, A-Z, _ + ctx_digit = 8, // 0-9 + ctx_symbol = 16 // Any symbol > 127, a-z, A-Z, 0-9, _, -, . + }; + + static const unsigned char chartypex_table[256] = + { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, // 0-15 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 16-31 + 0, 0, 2, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 16, 16, 0, // 32-47 + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 3, 0, 1, 0, // 48-63 + + 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 64-79 + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 20, // 80-95 + 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 96-111 + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, // 112-127 + + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 128+ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }; + +#ifdef PUGIXML_WCHAR_MODE + #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast(c) < 128 ? table[static_cast(c)] : table[128]) & (ct)) +#else + #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast(c)] & (ct)) +#endif + + #define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table) + #define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table) + + PUGI__FN bool is_little_endian() + { + unsigned int ui = 1; + + return *reinterpret_cast(&ui) == 1; + } + + PUGI__FN xml_encoding get_wchar_encoding() + { + PUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4); + + if (sizeof(wchar_t) == 2) + return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + else + return is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + } + + PUGI__FN bool parse_declaration_encoding(const uint8_t* data, size_t size, const uint8_t*& out_encoding, size_t& out_length) + { + #define PUGI__SCANCHAR(ch) { if (offset >= size || data[offset] != ch) return false; offset++; } + #define PUGI__SCANCHARTYPE(ct) { while (offset < size && PUGI__IS_CHARTYPE(data[offset], ct)) offset++; } + + // check if we have a non-empty XML declaration + if (size < 6 || !((data[0] == '<') & (data[1] == '?') & (data[2] == 'x') & (data[3] == 'm') & (data[4] == 'l') && PUGI__IS_CHARTYPE(data[5], ct_space))) + return false; + + // scan XML declaration until the encoding field + for (size_t i = 6; i + 1 < size; ++i) + { + // declaration can not contain ? in quoted values + if (data[i] == '?') + return false; + + if (data[i] == 'e' && data[i + 1] == 'n') + { + size_t offset = i; + + // encoding follows the version field which can't contain 'en' so this has to be the encoding if XML is well formed + PUGI__SCANCHAR('e'); PUGI__SCANCHAR('n'); PUGI__SCANCHAR('c'); PUGI__SCANCHAR('o'); + PUGI__SCANCHAR('d'); PUGI__SCANCHAR('i'); PUGI__SCANCHAR('n'); PUGI__SCANCHAR('g'); + + // S? = S? + PUGI__SCANCHARTYPE(ct_space); + PUGI__SCANCHAR('='); + PUGI__SCANCHARTYPE(ct_space); + + // the only two valid delimiters are ' and " + uint8_t delimiter = (offset < size && data[offset] == '"') ? '"' : '\''; + + PUGI__SCANCHAR(delimiter); + + size_t start = offset; + + out_encoding = data + offset; + + PUGI__SCANCHARTYPE(ct_symbol); + + out_length = offset - start; + + PUGI__SCANCHAR(delimiter); + + return true; + } + } + + return false; + + #undef PUGI__SCANCHAR + #undef PUGI__SCANCHARTYPE + } + + PUGI__FN xml_encoding guess_buffer_encoding(const uint8_t* data, size_t size) + { + // skip encoding autodetection if input buffer is too small + if (size < 4) return encoding_utf8; + + uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3]; + + // look for BOM in first few bytes + if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; + if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le; + if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be; + if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le; + if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8; + + // look for <, (contents); + + return guess_buffer_encoding(data, size); + } + + PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + size_t length = size / sizeof(char_t); + + if (is_mutable) + { + out_buffer = static_cast(const_cast(contents)); + out_length = length; + } + else + { + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + if (contents) + memcpy(buffer, contents, length * sizeof(char_t)); + else + assert(length == 0); + + buffer[length] = 0; + + out_buffer = buffer; + out_length = length + 1; + } + + return true; + } + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re) + { + return (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) || + (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be); + } + + PUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + const char_t* data = static_cast(contents); + size_t length = size / sizeof(char_t); + + if (is_mutable) + { + char_t* buffer = const_cast(data); + + convert_wchar_endian_swap(buffer, data, length); + + out_buffer = buffer; + out_length = length; + } + else + { + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + convert_wchar_endian_swap(buffer, data, length); + buffer[length] = 0; + + out_buffer = buffer; + out_length = length + 1; + } + + return true; + } + + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) + { + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); + + // first pass: get length in wchar_t units + size_t length = D::process(data, data_length, 0, wchar_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf16 input to wchar_t + wchar_writer::value_type obegin = reinterpret_cast(buffer); + wchar_writer::value_type oend = D::process(data, data_length, obegin, wchar_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) + { + // get native encoding + xml_encoding wchar_encoding = get_wchar_encoding(); + + // fast path: no conversion required + if (encoding == wchar_encoding) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // only endian-swapping is required + if (need_endian_swap_utf(encoding, wchar_encoding)) + return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable); + + // source encoding is utf8 + if (encoding == encoding_utf8) + return convert_buffer_generic(out_buffer, out_length, contents, size, utf8_decoder()); + + // source encoding is utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); + } + + // source encoding is utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); + } + + // source encoding is latin1 + if (encoding == encoding_latin1) + return convert_buffer_generic(out_buffer, out_length, contents, size, latin1_decoder()); + + assert(false && "Invalid encoding"); // unreachable + return false; + } +#else + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) + { + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); + + // first pass: get length in utf8 units + size_t length = D::process(data, data_length, 0, utf8_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf16 input to utf8 + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = D::process(data, data_length, obegin, utf8_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size) + { + for (size_t i = 0; i < size; ++i) + if (data[i] > 127) + return i; + + return size; + } + + PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + const uint8_t* data = static_cast(contents); + size_t data_length = size; + + // get size of prefix that does not need utf8 conversion + size_t prefix_length = get_latin1_7bit_prefix_length(data, data_length); + assert(prefix_length <= data_length); + + const uint8_t* postfix = data + prefix_length; + size_t postfix_length = data_length - prefix_length; + + // if no conversion is needed, just return the original buffer + if (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // first pass: get length in utf8 units + size_t length = prefix_length + latin1_decoder::process(postfix, postfix_length, 0, utf8_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert latin1 input to utf8 + memcpy(buffer, data, prefix_length); + + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = latin1_decoder::process(postfix, postfix_length, obegin + prefix_length, utf8_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) + { + // fast path: no conversion required + if (encoding == encoding_utf8) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // source encoding is utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); + } + + // source encoding is utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); + } + + // source encoding is latin1 + if (encoding == encoding_latin1) + return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable); + + assert(false && "Invalid encoding"); // unreachable + return false; + } +#endif + + PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length) + { + // get length in utf8 characters + return wchar_decoder::process(str, length, 0, utf8_counter()); + } + + PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length) + { + // convert to utf8 + uint8_t* begin = reinterpret_cast(buffer); + uint8_t* end = wchar_decoder::process(str, length, begin, utf8_writer()); + + assert(begin + size == end); + (void)!end; + (void)!size; + } + +#ifndef PUGIXML_NO_STL + PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length) + { + // first pass: get length in utf8 characters + size_t size = as_utf8_begin(str, length); + + // allocate resulting string + std::string result; + result.resize(size); + + // second pass: convert to utf8 + if (size > 0) as_utf8_end(&result[0], size, str, length); + + return result; + } + + PUGI__FN std::basic_string as_wide_impl(const char* str, size_t size) + { + const uint8_t* data = reinterpret_cast(str); + + // first pass: get length in wchar_t units + size_t length = utf8_decoder::process(data, size, 0, wchar_counter()); + + // allocate resulting string + std::basic_string result; + result.resize(length); + + // second pass: convert to wchar_t + if (length > 0) + { + wchar_writer::value_type begin = reinterpret_cast(&result[0]); + wchar_writer::value_type end = utf8_decoder::process(data, size, begin, wchar_writer()); + + assert(begin + length == end); + (void)!end; + } + + return result; + } +#endif + + template + inline bool strcpy_insitu_allow(size_t length, const Header& header, uintptr_t header_mask, char_t* target) + { + // never reuse shared memory + if (header & xml_memory_page_contents_shared_mask) return false; + + size_t target_length = strlength(target); + + // always reuse document buffer memory if possible + if ((header & header_mask) == 0) return target_length >= length; + + // reuse heap memory if waste is not too great + const size_t reuse_threshold = 32; + + return target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2); + } + + template + PUGI__FN bool strcpy_insitu(String& dest, Header& header, uintptr_t header_mask, const char_t* source, size_t source_length) + { + if (source_length == 0) + { + // empty string and null pointer are equivalent, so just deallocate old memory + xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator; + + if (header & header_mask) alloc->deallocate_string(dest); + + // mark the string as not allocated + dest = 0; + header &= ~header_mask; + + return true; + } + else if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest)) + { + // we can reuse old buffer, so just copy the new data (including zero terminator) + memcpy(dest, source, source_length * sizeof(char_t)); + dest[source_length] = 0; + + return true; + } + else + { + xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator; + + if (!alloc->reserve()) return false; + + // allocate new buffer + char_t* buf = alloc->allocate_string(source_length + 1); + if (!buf) return false; + + // copy the string (including zero terminator) + memcpy(buf, source, source_length * sizeof(char_t)); + buf[source_length] = 0; + + // deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures) + if (header & header_mask) alloc->deallocate_string(dest); + + // the string is now allocated, so set the flag + dest = buf; + header |= header_mask; + + return true; + } + } + + struct gap + { + char_t* end; + size_t size; + + gap(): end(0), size(0) + { + } + + // Push new gap, move s count bytes further (skipping the gap). + // Collapse previous gap. + void push(char_t*& s, size_t count) + { + if (end) // there was a gap already; collapse it + { + // Move [old_gap_end, new_gap_start) to [old_gap_start, ...) + assert(s >= end); + memmove(end - size, end, reinterpret_cast(s) - reinterpret_cast(end)); + } + + s += count; // end of current gap + + // "merge" two gaps + end = s; + size += count; + } + + // Collapse all gaps, return past-the-end pointer + char_t* flush(char_t* s) + { + if (end) + { + // Move [old_gap_end, current_pos) to [old_gap_start, ...) + assert(s >= end); + memmove(end - size, end, reinterpret_cast(s) - reinterpret_cast(end)); + + return s - size; + } + else return s; + } + }; + + PUGI__FN char_t* strconv_escape(char_t* s, gap& g) + { + char_t* stre = s + 1; + + switch (*stre) + { + case '#': // &#... + { + unsigned int ucsc = 0; + + if (stre[1] == 'x') // &#x... (hex code) + { + stre += 2; + + char_t ch = *stre; + + if (ch == ';') return stre; + + for (;;) + { + if (static_cast(ch - '0') <= 9) + ucsc = 16 * ucsc + (ch - '0'); + else if (static_cast((ch | ' ') - 'a') <= 5) + ucsc = 16 * ucsc + ((ch | ' ') - 'a' + 10); + else if (ch == ';') + break; + else // cancel + return stre; + + ch = *++stre; + } + + ++stre; + } + else // &#... (dec code) + { + char_t ch = *++stre; + + if (ch == ';') return stre; + + for (;;) + { + if (static_cast(ch - '0') <= 9) + ucsc = 10 * ucsc + (ch - '0'); + else if (ch == ';') + break; + else // cancel + return stre; + + ch = *++stre; + } + + ++stre; + } + + #ifdef PUGIXML_WCHAR_MODE + s = reinterpret_cast(wchar_writer::any(reinterpret_cast(s), ucsc)); + #else + s = reinterpret_cast(utf8_writer::any(reinterpret_cast(s), ucsc)); + #endif + + g.push(s, stre - s); + return stre; + } + + case 'a': // &a + { + ++stre; + + if (*stre == 'm') // &am + { + if (*++stre == 'p' && *++stre == ';') // & + { + *s++ = '&'; + ++stre; + + g.push(s, stre - s); + return stre; + } + } + else if (*stre == 'p') // &ap + { + if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // ' + { + *s++ = '\''; + ++stre; + + g.push(s, stre - s); + return stre; + } + } + break; + } + + case 'g': // &g + { + if (*++stre == 't' && *++stre == ';') // > + { + *s++ = '>'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + case 'l': // &l + { + if (*++stre == 't' && *++stre == ';') // < + { + *s++ = '<'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + case 'q': // &q + { + if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // " + { + *s++ = '"'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + default: + break; + } + + return stre; + } + + // Parser utilities + #define PUGI__ENDSWITH(c, e) ((c) == (e) || ((c) == 0 && endch == (e))) + #define PUGI__SKIPWS() { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; } + #define PUGI__OPTSET(OPT) ( optmsk & (OPT) ) + #define PUGI__PUSHNODE(TYPE) { cursor = append_new_node(cursor, *alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); } + #define PUGI__POPNODE() { cursor = cursor->parent; } + #define PUGI__SCANFOR(X) { while (*s != 0 && !(X)) ++s; } + #define PUGI__SCANWHILE(X) { while (X) ++s; } + #define PUGI__SCANWHILE_UNROLL(X) { for (;;) { char_t ss = s[0]; if (PUGI__UNLIKELY(!(X))) { break; } ss = s[1]; if (PUGI__UNLIKELY(!(X))) { s += 1; break; } ss = s[2]; if (PUGI__UNLIKELY(!(X))) { s += 2; break; } ss = s[3]; if (PUGI__UNLIKELY(!(X))) { s += 3; break; } s += 4; } } + #define PUGI__ENDSEG() { ch = *s; *s = 0; ++s; } + #define PUGI__THROW_ERROR(err, m) return error_offset = m, error_status = err, static_cast(0) + #define PUGI__CHECK_ERROR(err, m) { if (*s == 0) PUGI__THROW_ERROR(err, m); } + + PUGI__FN char_t* strconv_comment(char_t* s, char_t endch) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment)); + + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here + { + *g.flush(s) = 0; + + return s + (s[2] == '>' ? 3 : 2); + } + else if (*s == 0) + { + return 0; + } + else ++s; + } + } + + PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata)); + + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here + { + *g.flush(s) = 0; + + return s + 1; + } + else if (*s == 0) + { + return 0; + } + else ++s; + } + } + + typedef char_t* (*strconv_pcdata_t)(char_t*); + + template struct strconv_pcdata_impl + { + static char_t* parse(char_t* s) + { + gap g; + + char_t* begin = s; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_pcdata)); + + if (*s == '<') // PCDATA ends here + { + char_t* end = g.flush(s); + + if (opt_trim::value) + while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space)) + --end; + + *end = 0; + + return s + 1; + } + else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (*s == 0) + { + char_t* end = g.flush(s); + + if (opt_trim::value) + while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space)) + --end; + + *end = 0; + + return s; + } + else ++s; + } + } + }; + + PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask) + { + PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800); + + switch (((optmask >> 4) & 3) | ((optmask >> 9) & 4)) // get bitmask for flags (trim eol escapes); this simultaneously checks 3 options from assertion above + { + case 0: return strconv_pcdata_impl::parse; + case 1: return strconv_pcdata_impl::parse; + case 2: return strconv_pcdata_impl::parse; + case 3: return strconv_pcdata_impl::parse; + case 4: return strconv_pcdata_impl::parse; + case 5: return strconv_pcdata_impl::parse; + case 6: return strconv_pcdata_impl::parse; + case 7: return strconv_pcdata_impl::parse; + default: assert(false); return 0; // unreachable + } + } + + typedef char_t* (*strconv_attribute_t)(char_t*, char_t); + + template struct strconv_attribute_impl + { + static char_t* parse_wnorm(char_t* s, char_t end_quote) + { + gap g; + + // trim leading whitespaces + if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + char_t* str = s; + + do ++str; + while (PUGI__IS_CHARTYPE(*str, ct_space)); + + g.push(s, str - s); + } + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space)); + + if (*s == end_quote) + { + char_t* str = g.flush(s); + + do *str-- = 0; + while (PUGI__IS_CHARTYPE(*str, ct_space)); + + return s + 1; + } + else if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + *s++ = ' '; + + if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + char_t* str = s + 1; + while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str; + + g.push(s, str - s); + } + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_wconv(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + if (*s == '\r') + { + *s++ = ' '; + + if (*s == '\n') g.push(s, 1); + } + else *s++ = ' '; + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_eol(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (*s == '\r') + { + *s++ = '\n'; + + if (*s == '\n') g.push(s, 1); + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_simple(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + }; + + PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask) + { + PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80); + + switch ((optmask >> 4) & 15) // get bitmask for flags (wnorm wconv eol escapes); this simultaneously checks 4 options from assertion above + { + case 0: return strconv_attribute_impl::parse_simple; + case 1: return strconv_attribute_impl::parse_simple; + case 2: return strconv_attribute_impl::parse_eol; + case 3: return strconv_attribute_impl::parse_eol; + case 4: return strconv_attribute_impl::parse_wconv; + case 5: return strconv_attribute_impl::parse_wconv; + case 6: return strconv_attribute_impl::parse_wconv; + case 7: return strconv_attribute_impl::parse_wconv; + case 8: return strconv_attribute_impl::parse_wnorm; + case 9: return strconv_attribute_impl::parse_wnorm; + case 10: return strconv_attribute_impl::parse_wnorm; + case 11: return strconv_attribute_impl::parse_wnorm; + case 12: return strconv_attribute_impl::parse_wnorm; + case 13: return strconv_attribute_impl::parse_wnorm; + case 14: return strconv_attribute_impl::parse_wnorm; + case 15: return strconv_attribute_impl::parse_wnorm; + default: assert(false); return 0; // unreachable + } + } + + inline xml_parse_result make_parse_result(xml_parse_status status, ptrdiff_t offset = 0) + { + xml_parse_result result; + result.status = status; + result.offset = offset; + + return result; + } + + struct xml_parser + { + xml_allocator* alloc; + char_t* error_offset; + xml_parse_status error_status; + + xml_parser(xml_allocator* alloc_): alloc(alloc_), error_offset(0), error_status(status_ok) + { + } + + // DOCTYPE consists of nested sections of the following possible types: + // , , "...", '...' + // + // + // First group can not contain nested groups + // Second group can contain nested groups of the same type + // Third group can contain all other groups + char_t* parse_doctype_primitive(char_t* s) + { + if (*s == '"' || *s == '\'') + { + // quoted string + char_t ch = *s++; + PUGI__SCANFOR(*s == ch); + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s++; + } + else if (s[0] == '<' && s[1] == '?') + { + // + s += 2; + PUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s += 2; + } + else if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-') + { + s += 4; + PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s += 3; + } + else PUGI__THROW_ERROR(status_bad_doctype, s); + + return s; + } + + char_t* parse_doctype_ignore(char_t* s) + { + size_t depth = 0; + + assert(s[0] == '<' && s[1] == '!' && s[2] == '['); + s += 3; + + while (*s) + { + if (s[0] == '<' && s[1] == '!' && s[2] == '[') + { + // nested ignore section + s += 3; + depth++; + } + else if (s[0] == ']' && s[1] == ']' && s[2] == '>') + { + // ignore section end + s += 3; + + if (depth == 0) + return s; + + depth--; + } + else s++; + } + + PUGI__THROW_ERROR(status_bad_doctype, s); + } + + char_t* parse_doctype_group(char_t* s, char_t endch) + { + size_t depth = 0; + + assert((s[0] == '<' || s[0] == 0) && s[1] == '!'); + s += 2; + + while (*s) + { + if (s[0] == '<' && s[1] == '!' && s[2] != '-') + { + if (s[2] == '[') + { + // ignore + s = parse_doctype_ignore(s); + if (!s) return s; + } + else + { + // some control group + s += 2; + depth++; + } + } + else if (s[0] == '<' || s[0] == '"' || s[0] == '\'') + { + // unknown tag (forbidden), or some primitive group + s = parse_doctype_primitive(s); + if (!s) return s; + } + else if (*s == '>') + { + if (depth == 0) + return s; + + depth--; + s++; + } + else s++; + } + + if (depth != 0 || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s); + + return s; + } + + char_t* parse_exclamation(char_t* s, xml_node_struct* cursor, unsigned int optmsk, char_t endch) + { + // parse node contents, starting with exclamation mark + ++s; + + if (*s == '-') // 'value = s; // Save the offset. + } + + if (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments)) + { + s = strconv_comment(s, endch); + + if (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value); + } + else + { + // Scan for terminating '-->'. + PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_comment, s); + + if (PUGI__OPTSET(parse_comments)) + *s = 0; // Zero-terminate this segment at the first terminating '-'. + + s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'. + } + } + else PUGI__THROW_ERROR(status_bad_comment, s); + } + else if (*s == '[') + { + // 'value = s; // Save the offset. + + if (PUGI__OPTSET(parse_eol)) + { + s = strconv_cdata(s, endch); + + if (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value); + } + else + { + // Scan for terminating ']]>'. + PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_cdata, s); + + *s++ = 0; // Zero-terminate this segment. + } + } + else // Flagged for discard, but we still have to scan for the terminator. + { + // Scan for terminating ']]>'. + PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_cdata, s); + + ++s; + } + + s += (s[1] == '>' ? 2 : 1); // Step over the last ']>'. + } + else PUGI__THROW_ERROR(status_bad_cdata, s); + } + else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && PUGI__ENDSWITH(s[6], 'E')) + { + s -= 2; + + if (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s); + + char_t* mark = s + 9; + + s = parse_doctype_group(s, endch); + if (!s) return s; + + assert((*s == 0 && endch == '>') || *s == '>'); + if (*s) *s++ = 0; + + if (PUGI__OPTSET(parse_doctype)) + { + while (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark; + + PUGI__PUSHNODE(node_doctype); + + cursor->value = mark; + } + } + else if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s); + else if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s); + else PUGI__THROW_ERROR(status_unrecognized_tag, s); + + return s; + } + + char_t* parse_question(char_t* s, xml_node_struct*& ref_cursor, unsigned int optmsk, char_t endch) + { + // load into registers + xml_node_struct* cursor = ref_cursor; + char_t ch = 0; + + // parse node contents, starting with question mark + ++s; + + // read PI target + char_t* target = s; + + if (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s); + + PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol)); + PUGI__CHECK_ERROR(status_bad_pi, s); + + // determine node type; stricmp / strcasecmp is not portable + bool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s; + + if (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi)) + { + if (declaration) + { + // disallow non top-level declarations + if (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s); + + PUGI__PUSHNODE(node_declaration); + } + else + { + PUGI__PUSHNODE(node_pi); + } + + cursor->name = target; + + PUGI__ENDSEG(); + + // parse value/attributes + if (ch == '?') + { + // empty node + if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s); + s += (*s == '>'); + + PUGI__POPNODE(); + } + else if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + PUGI__SKIPWS(); + + // scan for tag end + char_t* value = s; + + PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>')); + PUGI__CHECK_ERROR(status_bad_pi, s); + + if (declaration) + { + // replace ending ? with / so that 'element' terminates properly + *s = '/'; + + // we exit from this function with cursor at node_declaration, which is a signal to parse() to go to LOC_ATTRIBUTES + s = value; + } + else + { + // store value and step over > + cursor->value = value; + + PUGI__POPNODE(); + + PUGI__ENDSEG(); + + s += (*s == '>'); + } + } + else PUGI__THROW_ERROR(status_bad_pi, s); + } + else + { + // scan for tag end + PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>')); + PUGI__CHECK_ERROR(status_bad_pi, s); + + s += (s[1] == '>' ? 2 : 1); + } + + // store from registers + ref_cursor = cursor; + + return s; + } + + char_t* parse_tree(char_t* s, xml_node_struct* root, unsigned int optmsk, char_t endch) + { + strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk); + strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk); + + char_t ch = 0; + xml_node_struct* cursor = root; + char_t* mark = s; + + while (*s != 0) + { + if (*s == '<') + { + ++s; + + LOC_TAG: + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...' + { + PUGI__PUSHNODE(node_element); // Append a new node to the tree. + + cursor->name = s; + + PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator. + PUGI__ENDSEG(); // Save char in 'ch', terminate & step over. + + if (ch == '>') + { + // end of tag + } + else if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + LOC_ATTRIBUTES: + while (true) + { + PUGI__SKIPWS(); // Eat any whitespace. + + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #... + { + xml_attribute_struct* a = append_new_attribute(cursor, *alloc); // Make space for this attribute. + if (!a) PUGI__THROW_ERROR(status_out_of_memory, s); + + a->name = s; // Save the offset. + + PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator. + PUGI__ENDSEG(); // Save char in 'ch', terminate & step over. + + if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + PUGI__SKIPWS(); // Eat any whitespace. + + ch = *s; + ++s; + } + + if (ch == '=') // '<... #=...' + { + PUGI__SKIPWS(); // Eat any whitespace. + + if (*s == '"' || *s == '\'') // '<... #="...' + { + ch = *s; // Save quote char to avoid breaking on "''" -or- '""'. + ++s; // Step over the quote. + a->value = s; // Save the offset. + + s = strconv_attribute(s, ch); + + if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value); + + // After this line the loop continues from the start; + // Whitespaces, / and > are ok, symbols and EOF are wrong, + // everything else will be detected + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s); + } + else PUGI__THROW_ERROR(status_bad_attribute, s); + } + else PUGI__THROW_ERROR(status_bad_attribute, s); + } + else if (*s == '/') + { + ++s; + + if (*s == '>') + { + PUGI__POPNODE(); + s++; + break; + } + else if (*s == 0 && endch == '>') + { + PUGI__POPNODE(); + break; + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + else if (*s == '>') + { + ++s; + + break; + } + else if (*s == 0 && endch == '>') + { + break; + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + + // !!! + } + else if (ch == '/') // '<#.../' + { + if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s); + + PUGI__POPNODE(); // Pop. + + s += (*s == '>'); + } + else if (ch == 0) + { + // we stepped over null terminator, backtrack & handle closing tag + --s; + + if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s); + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + else if (*s == '/') + { + ++s; + + mark = s; + + char_t* name = cursor->name; + if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, mark); + + while (PUGI__IS_CHARTYPE(*s, ct_symbol)) + { + if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, mark); + } + + if (*name) + { + if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s); + else PUGI__THROW_ERROR(status_end_element_mismatch, mark); + } + + PUGI__POPNODE(); // Pop. + + PUGI__SKIPWS(); + + if (*s == 0) + { + if (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s); + } + else + { + if (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s); + ++s; + } + } + else if (*s == '?') // 'first_child) continue; + } + } + + if (!PUGI__OPTSET(parse_trim_pcdata)) + s = mark; + + if (cursor->parent || PUGI__OPTSET(parse_fragment)) + { + if (PUGI__OPTSET(parse_embed_pcdata) && cursor->parent && !cursor->first_child && !cursor->value) + { + cursor->value = s; // Save the offset. + } + else + { + PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree. + + cursor->value = s; // Save the offset. + + PUGI__POPNODE(); // Pop since this is a standalone. + } + + s = strconv_pcdata(s); + + if (!*s) break; + } + else + { + PUGI__SCANFOR(*s == '<'); // '...<' + if (!*s) break; + + ++s; + } + + // We're after '<' + goto LOC_TAG; + } + } + + // check that last tag is closed + if (cursor != root) PUGI__THROW_ERROR(status_end_element_mismatch, s); + + return s; + } + + #ifdef PUGIXML_WCHAR_MODE + static char_t* parse_skip_bom(char_t* s) + { + unsigned int bom = 0xfeff; + return (s[0] == static_cast(bom)) ? s + 1 : s; + } + #else + static char_t* parse_skip_bom(char_t* s) + { + return (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf') ? s + 3 : s; + } + #endif + + static bool has_element_node_siblings(xml_node_struct* node) + { + while (node) + { + if (PUGI__NODETYPE(node) == node_element) return true; + + node = node->next_sibling; + } + + return false; + } + + static xml_parse_result parse(char_t* buffer, size_t length, xml_document_struct* xmldoc, xml_node_struct* root, unsigned int optmsk) + { + // early-out for empty documents + if (length == 0) + return make_parse_result(PUGI__OPTSET(parse_fragment) ? status_ok : status_no_document_element); + + // get last child of the root before parsing + xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c + 0 : 0; + + // create parser on stack + xml_parser parser(static_cast(xmldoc)); + + // save last character and make buffer zero-terminated (speeds up parsing) + char_t endch = buffer[length - 1]; + buffer[length - 1] = 0; + + // skip BOM to make sure it does not end up as part of parse output + char_t* buffer_data = parse_skip_bom(buffer); + + // perform actual parsing + parser.parse_tree(buffer_data, root, optmsk, endch); + + xml_parse_result result = make_parse_result(parser.error_status, parser.error_offset ? parser.error_offset - buffer : 0); + assert(result.offset >= 0 && static_cast(result.offset) <= length); + + if (result) + { + // since we removed last character, we have to handle the only possible false positive (stray <) + if (endch == '<') + return make_parse_result(status_unrecognized_tag, length - 1); + + // check if there are any element nodes parsed + xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling + 0 : root->first_child+ 0; + + if (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed)) + return make_parse_result(status_no_document_element, length - 1); + } + else + { + // roll back offset if it occurs on a null terminator in the source buffer + if (result.offset > 0 && static_cast(result.offset) == length - 1 && endch == 0) + result.offset--; + } + + return result; + } + }; + + // Output facilities + PUGI__FN xml_encoding get_write_native_encoding() + { + #ifdef PUGIXML_WCHAR_MODE + return get_wchar_encoding(); + #else + return encoding_utf8; + #endif + } + + PUGI__FN xml_encoding get_write_encoding(xml_encoding encoding) + { + // replace wchar encoding with utf implementation + if (encoding == encoding_wchar) return get_wchar_encoding(); + + // replace utf16 encoding with utf16 with specific endianness + if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + // replace utf32 encoding with utf32 with specific endianness + if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + // only do autodetection if no explicit encoding is requested + if (encoding != encoding_auto) return encoding; + + // assume utf8 encoding + return encoding_utf8; + } + + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + return static_cast(end - dest) * sizeof(*dest); + } + + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T, bool opt_swap) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + if (opt_swap) + { + for (typename T::value_type i = dest; i != end; ++i) + *i = endian_swap(*i); + } + + return static_cast(end - dest) * sizeof(*dest); + } + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN size_t get_valid_length(const char_t* data, size_t length) + { + if (length < 1) return 0; + + // discard last character if it's the lead of a surrogate pair + return (sizeof(wchar_t) == 2 && static_cast(static_cast(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length; + } + + PUGI__FN size_t convert_buffer_output(char_t* r_char, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding) + { + // only endian-swapping is required + if (need_endian_swap_utf(encoding, get_wchar_encoding())) + { + convert_wchar_endian_swap(r_char, data, length); + + return length * sizeof(char_t); + } + + // convert to utf8 + if (encoding == encoding_utf8) + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), utf8_writer()); + + // convert to utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return convert_buffer_output_generic(r_u16, data, length, wchar_decoder(), utf16_writer(), native_encoding != encoding); + } + + // convert to utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return convert_buffer_output_generic(r_u32, data, length, wchar_decoder(), utf32_writer(), native_encoding != encoding); + } + + // convert to latin1 + if (encoding == encoding_latin1) + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), latin1_writer()); + + assert(false && "Invalid encoding"); // unreachable + return 0; + } +#else + PUGI__FN size_t get_valid_length(const char_t* data, size_t length) + { + if (length < 5) return 0; + + for (size_t i = 1; i <= 4; ++i) + { + uint8_t ch = static_cast(data[length - i]); + + // either a standalone character or a leading one + if ((ch & 0xc0) != 0x80) return length - i; + } + + // there are four non-leading characters at the end, sequence tail is broken so might as well process the whole chunk + return length; + } + + PUGI__FN size_t convert_buffer_output(char_t* /* r_char */, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding) + { + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return convert_buffer_output_generic(r_u16, data, length, utf8_decoder(), utf16_writer(), native_encoding != encoding); + } + + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return convert_buffer_output_generic(r_u32, data, length, utf8_decoder(), utf32_writer(), native_encoding != encoding); + } + + if (encoding == encoding_latin1) + return convert_buffer_output_generic(r_u8, data, length, utf8_decoder(), latin1_writer()); + + assert(false && "Invalid encoding"); // unreachable + return 0; + } +#endif + + class xml_buffered_writer + { + xml_buffered_writer(const xml_buffered_writer&); + xml_buffered_writer& operator=(const xml_buffered_writer&); + + public: + xml_buffered_writer(xml_writer& writer_, xml_encoding user_encoding): writer(writer_), bufsize(0), encoding(get_write_encoding(user_encoding)) + { + PUGI__STATIC_ASSERT(bufcapacity >= 8); + } + + size_t flush() + { + flush(buffer, bufsize); + bufsize = 0; + return 0; + } + + void flush(const char_t* data, size_t size) + { + if (size == 0) return; + + // fast path, just write data + if (encoding == get_write_native_encoding()) + writer.write(data, size * sizeof(char_t)); + else + { + // convert chunk + size_t result = convert_buffer_output(scratch.data_char, scratch.data_u8, scratch.data_u16, scratch.data_u32, data, size, encoding); + assert(result <= sizeof(scratch)); + + // write data + writer.write(scratch.data_u8, result); + } + } + + void write_direct(const char_t* data, size_t length) + { + // flush the remaining buffer contents + flush(); + + // handle large chunks + if (length > bufcapacity) + { + if (encoding == get_write_native_encoding()) + { + // fast path, can just write data chunk + writer.write(data, length * sizeof(char_t)); + return; + } + + // need to convert in suitable chunks + while (length > bufcapacity) + { + // get chunk size by selecting such number of characters that are guaranteed to fit into scratch buffer + // and form a complete codepoint sequence (i.e. discard start of last codepoint if necessary) + size_t chunk_size = get_valid_length(data, bufcapacity); + assert(chunk_size); + + // convert chunk and write + flush(data, chunk_size); + + // iterate + data += chunk_size; + length -= chunk_size; + } + + // small tail is copied below + bufsize = 0; + } + + memcpy(buffer + bufsize, data, length * sizeof(char_t)); + bufsize += length; + } + + void write_buffer(const char_t* data, size_t length) + { + size_t offset = bufsize; + + if (offset + length <= bufcapacity) + { + memcpy(buffer + offset, data, length * sizeof(char_t)); + bufsize = offset + length; + } + else + { + write_direct(data, length); + } + } + + void write_string(const char_t* data) + { + // write the part of the string that fits in the buffer + size_t offset = bufsize; + + while (*data && offset < bufcapacity) + buffer[offset++] = *data++; + + // write the rest + if (offset < bufcapacity) + { + bufsize = offset; + } + else + { + // backtrack a bit if we have split the codepoint + size_t length = offset - bufsize; + size_t extra = length - get_valid_length(data - length, length); + + bufsize = offset - extra; + + write_direct(data - extra, strlength(data) + extra); + } + } + + void write(char_t d0) + { + size_t offset = bufsize; + if (offset > bufcapacity - 1) offset = flush(); + + buffer[offset + 0] = d0; + bufsize = offset + 1; + } + + void write(char_t d0, char_t d1) + { + size_t offset = bufsize; + if (offset > bufcapacity - 2) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + bufsize = offset + 2; + } + + void write(char_t d0, char_t d1, char_t d2) + { + size_t offset = bufsize; + if (offset > bufcapacity - 3) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + bufsize = offset + 3; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3) + { + size_t offset = bufsize; + if (offset > bufcapacity - 4) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + bufsize = offset + 4; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4) + { + size_t offset = bufsize; + if (offset > bufcapacity - 5) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + buffer[offset + 4] = d4; + bufsize = offset + 5; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5) + { + size_t offset = bufsize; + if (offset > bufcapacity - 6) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + buffer[offset + 4] = d4; + buffer[offset + 5] = d5; + bufsize = offset + 6; + } + + // utf8 maximum expansion: x4 (-> utf32) + // utf16 maximum expansion: x2 (-> utf32) + // utf32 maximum expansion: x1 + enum + { + bufcapacitybytes = + #ifdef PUGIXML_MEMORY_OUTPUT_STACK + PUGIXML_MEMORY_OUTPUT_STACK + #else + 10240 + #endif + , + bufcapacity = bufcapacitybytes / (sizeof(char_t) + 4) + }; + + char_t buffer[bufcapacity]; + + union + { + uint8_t data_u8[4 * bufcapacity]; + uint16_t data_u16[2 * bufcapacity]; + uint32_t data_u32[bufcapacity]; + char_t data_char[bufcapacity]; + } scratch; + + xml_writer& writer; + size_t bufsize; + xml_encoding encoding; + }; + + PUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags) + { + while (*s) + { + const char_t* prev = s; + + // While *s is a usual symbol + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type)); + + writer.write_buffer(prev, static_cast(s - prev)); + + switch (*s) + { + case 0: break; + case '&': + writer.write('&', 'a', 'm', 'p', ';'); + ++s; + break; + case '<': + writer.write('&', 'l', 't', ';'); + ++s; + break; + case '>': + writer.write('&', 'g', 't', ';'); + ++s; + break; + case '"': + if (flags & format_attribute_single_quote) + writer.write('"'); + else + writer.write('&', 'q', 'u', 'o', 't', ';'); + ++s; + break; + case '\'': + if (flags & format_attribute_single_quote) + writer.write('&', 'a', 'p', 'o', 's', ';'); + else + writer.write('\''); + ++s; + break; + default: // s is not a usual symbol + { + unsigned int ch = static_cast(*s++); + assert(ch < 32); + + if (!(flags & format_skip_control_chars)) + writer.write('&', '#', static_cast((ch / 10) + '0'), static_cast((ch % 10) + '0'), ';'); + } + } + } + } + + PUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags) + { + if (flags & format_no_escapes) + writer.write_string(s); + else + text_output_escaped(writer, s, type, flags); + } + + PUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s) + { + do + { + writer.write('<', '!', '[', 'C', 'D'); + writer.write('A', 'T', 'A', '['); + + const char_t* prev = s; + + // look for ]]> sequence - we can't output it as is since it terminates CDATA + while (*s && !(s[0] == ']' && s[1] == ']' && s[2] == '>')) ++s; + + // skip ]] if we stopped at ]]>, > will go to the next CDATA section + if (*s) s += 2; + + writer.write_buffer(prev, static_cast(s - prev)); + + writer.write(']', ']', '>'); + } + while (*s); + } + + PUGI__FN void text_output_indent(xml_buffered_writer& writer, const char_t* indent, size_t indent_length, unsigned int depth) + { + switch (indent_length) + { + case 1: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0]); + break; + } + + case 2: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1]); + break; + } + + case 3: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1], indent[2]); + break; + } + + case 4: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1], indent[2], indent[3]); + break; + } + + default: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write_buffer(indent, indent_length); + } + } + } + + PUGI__FN void node_output_comment(xml_buffered_writer& writer, const char_t* s) + { + writer.write('<', '!', '-', '-'); + + while (*s) + { + const char_t* prev = s; + + // look for -\0 or -- sequence - we can't output it since -- is illegal in comment body + while (*s && !(s[0] == '-' && (s[1] == '-' || s[1] == 0))) ++s; + + writer.write_buffer(prev, static_cast(s - prev)); + + if (*s) + { + assert(*s == '-'); + + writer.write('-', ' '); + ++s; + } + } + + writer.write('-', '-', '>'); + } + + PUGI__FN void node_output_pi_value(xml_buffered_writer& writer, const char_t* s) + { + while (*s) + { + const char_t* prev = s; + + // look for ?> sequence - we can't output it since ?> terminates PI + while (*s && !(s[0] == '?' && s[1] == '>')) ++s; + + writer.write_buffer(prev, static_cast(s - prev)); + + if (*s) + { + assert(s[0] == '?' && s[1] == '>'); + + writer.write('?', ' ', '>'); + s += 2; + } + } + } + + PUGI__FN void node_output_attributes(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + const char_t enquotation_char = (flags & format_attribute_single_quote) ? '\'' : '"'; + + for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute) + { + if ((flags & (format_indent_attributes | format_raw)) == format_indent_attributes) + { + writer.write('\n'); + + text_output_indent(writer, indent, indent_length, depth + 1); + } + else + { + writer.write(' '); + } + + writer.write_string(a->name ? a->name + 0 : default_name); + writer.write('=', enquotation_char); + + if (a->value) + text_output(writer, a->value, ctx_special_attr, flags); + + writer.write(enquotation_char); + } + } + + PUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + const char_t* name = node->name ? node->name + 0 : default_name; + + writer.write('<'); + writer.write_string(name); + + if (node->first_attribute) + node_output_attributes(writer, node, indent, indent_length, flags, depth); + + // element nodes can have value if parse_embed_pcdata was used + if (!node->value) + { + if (!node->first_child) + { + if (flags & format_no_empty_element_tags) + { + writer.write('>', '<', '/'); + writer.write_string(name); + writer.write('>'); + + return false; + } + else + { + if ((flags & format_raw) == 0) + writer.write(' '); + + writer.write('/', '>'); + + return false; + } + } + else + { + writer.write('>'); + + return true; + } + } + else + { + writer.write('>'); + + text_output(writer, node->value, ctx_special_pcdata, flags); + + if (!node->first_child) + { + writer.write('<', '/'); + writer.write_string(name); + writer.write('>'); + + return false; + } + else + { + return true; + } + } + } + + PUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + const char_t* name = node->name ? node->name + 0 : default_name; + + writer.write('<', '/'); + writer.write_string(name); + writer.write('>'); + } + + PUGI__FN void node_output_simple(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + + switch (PUGI__NODETYPE(node)) + { + case node_pcdata: + text_output(writer, node->value ? node->value + 0 : PUGIXML_TEXT(""), ctx_special_pcdata, flags); + break; + + case node_cdata: + text_output_cdata(writer, node->value ? node->value + 0 : PUGIXML_TEXT("")); + break; + + case node_comment: + node_output_comment(writer, node->value ? node->value + 0 : PUGIXML_TEXT("")); + break; + + case node_pi: + writer.write('<', '?'); + writer.write_string(node->name ? node->name + 0 : default_name); + + if (node->value) + { + writer.write(' '); + node_output_pi_value(writer, node->value); + } + + writer.write('?', '>'); + break; + + case node_declaration: + writer.write('<', '?'); + writer.write_string(node->name ? node->name + 0 : default_name); + node_output_attributes(writer, node, PUGIXML_TEXT(""), 0, flags | format_raw, 0); + writer.write('?', '>'); + break; + + case node_doctype: + writer.write('<', '!', 'D', 'O', 'C'); + writer.write('T', 'Y', 'P', 'E'); + + if (node->value) + { + writer.write(' '); + writer.write_string(node->value); + } + + writer.write('>'); + break; + + default: + assert(false && "Invalid node type"); // unreachable + } + } + + enum indent_flags_t + { + indent_newline = 1, + indent_indent = 2 + }; + + PUGI__FN void node_output(xml_buffered_writer& writer, xml_node_struct* root, const char_t* indent, unsigned int flags, unsigned int depth) + { + size_t indent_length = ((flags & (format_indent | format_indent_attributes)) && (flags & format_raw) == 0) ? strlength(indent) : 0; + unsigned int indent_flags = indent_indent; + + xml_node_struct* node = root; + + do + { + assert(node); + + // begin writing current node + if (PUGI__NODETYPE(node) == node_pcdata || PUGI__NODETYPE(node) == node_cdata) + { + node_output_simple(writer, node, flags); + + indent_flags = 0; + } + else + { + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + + if ((indent_flags & indent_indent) && indent_length) + text_output_indent(writer, indent, indent_length, depth); + + if (PUGI__NODETYPE(node) == node_element) + { + indent_flags = indent_newline | indent_indent; + + if (node_output_start(writer, node, indent, indent_length, flags, depth)) + { + // element nodes can have value if parse_embed_pcdata was used + if (node->value) + indent_flags = 0; + + node = node->first_child; + depth++; + continue; + } + } + else if (PUGI__NODETYPE(node) == node_document) + { + indent_flags = indent_indent; + + if (node->first_child) + { + node = node->first_child; + continue; + } + } + else + { + node_output_simple(writer, node, flags); + + indent_flags = indent_newline | indent_indent; + } + } + + // continue to the next node + while (node != root) + { + if (node->next_sibling) + { + node = node->next_sibling; + break; + } + + node = node->parent; + + // write closing node + if (PUGI__NODETYPE(node) == node_element) + { + depth--; + + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + + if ((indent_flags & indent_indent) && indent_length) + text_output_indent(writer, indent, indent_length, depth); + + node_output_end(writer, node); + + indent_flags = indent_newline | indent_indent; + } + } + } + while (node != root); + + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + } + + PUGI__FN bool has_declaration(xml_node_struct* node) + { + for (xml_node_struct* child = node->first_child; child; child = child->next_sibling) + { + xml_node_type type = PUGI__NODETYPE(child); + + if (type == node_declaration) return true; + if (type == node_element) return false; + } + + return false; + } + + PUGI__FN bool is_attribute_of(xml_attribute_struct* attr, xml_node_struct* node) + { + for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute) + if (a == attr) + return true; + + return false; + } + + PUGI__FN bool allow_insert_attribute(xml_node_type parent) + { + return parent == node_element || parent == node_declaration; + } + + PUGI__FN bool allow_insert_child(xml_node_type parent, xml_node_type child) + { + if (parent != node_document && parent != node_element) return false; + if (child == node_document || child == node_null) return false; + if (parent != node_document && (child == node_declaration || child == node_doctype)) return false; + + return true; + } + + PUGI__FN bool allow_move(xml_node parent, xml_node child) + { + // check that child can be a child of parent + if (!allow_insert_child(parent.type(), child.type())) + return false; + + // check that node is not moved between documents + if (parent.root() != child.root()) + return false; + + // check that new parent is not in the child subtree + xml_node cur = parent; + + while (cur) + { + if (cur == child) + return false; + + cur = cur.parent(); + } + + return true; + } + + template + PUGI__FN void node_copy_string(String& dest, Header& header, uintptr_t header_mask, char_t* source, Header& source_header, xml_allocator* alloc) + { + assert(!dest && (header & header_mask) == 0); + + if (source) + { + if (alloc && (source_header & header_mask) == 0) + { + dest = source; + + // since strcpy_insitu can reuse document buffer memory we need to mark both source and dest as shared + header |= xml_memory_page_contents_shared_mask; + source_header |= xml_memory_page_contents_shared_mask; + } + else + strcpy_insitu(dest, header, header_mask, source, strlength(source)); + } + } + + PUGI__FN void node_copy_contents(xml_node_struct* dn, xml_node_struct* sn, xml_allocator* shared_alloc) + { + node_copy_string(dn->name, dn->header, xml_memory_page_name_allocated_mask, sn->name, sn->header, shared_alloc); + node_copy_string(dn->value, dn->header, xml_memory_page_value_allocated_mask, sn->value, sn->header, shared_alloc); + + for (xml_attribute_struct* sa = sn->first_attribute; sa; sa = sa->next_attribute) + { + xml_attribute_struct* da = append_new_attribute(dn, get_allocator(dn)); + + if (da) + { + node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc); + node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc); + } + } + } + + PUGI__FN void node_copy_tree(xml_node_struct* dn, xml_node_struct* sn) + { + xml_allocator& alloc = get_allocator(dn); + xml_allocator* shared_alloc = (&alloc == &get_allocator(sn)) ? &alloc : 0; + + node_copy_contents(dn, sn, shared_alloc); + + xml_node_struct* dit = dn; + xml_node_struct* sit = sn->first_child; + + while (sit && sit != sn) + { + // loop invariant: dit is inside the subtree rooted at dn + assert(dit); + + // when a tree is copied into one of the descendants, we need to skip that subtree to avoid an infinite loop + if (sit != dn) + { + xml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit)); + + if (copy) + { + node_copy_contents(copy, sit, shared_alloc); + + if (sit->first_child) + { + dit = copy; + sit = sit->first_child; + continue; + } + } + } + + // continue to the next node + do + { + if (sit->next_sibling) + { + sit = sit->next_sibling; + break; + } + + sit = sit->parent; + dit = dit->parent; + + // loop invariant: dit is inside the subtree rooted at dn while sit is inside sn + assert(sit == sn || dit); + } + while (sit != sn); + } + + assert(!sit || dit == dn->parent); + } + + PUGI__FN void node_copy_attribute(xml_attribute_struct* da, xml_attribute_struct* sa) + { + xml_allocator& alloc = get_allocator(da); + xml_allocator* shared_alloc = (&alloc == &get_allocator(sa)) ? &alloc : 0; + + node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc); + node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc); + } + + inline bool is_text_node(xml_node_struct* node) + { + xml_node_type type = PUGI__NODETYPE(node); + + return type == node_pcdata || type == node_cdata; + } + + // get value with conversion functions + template PUGI__FN PUGI__UNSIGNED_OVERFLOW U string_to_integer(const char_t* value, U minv, U maxv) + { + U result = 0; + const char_t* s = value; + + while (PUGI__IS_CHARTYPE(*s, ct_space)) + s++; + + bool negative = (*s == '-'); + + s += (*s == '+' || *s == '-'); + + bool overflow = false; + + if (s[0] == '0' && (s[1] | ' ') == 'x') + { + s += 2; + + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 16 + (*s - '0'); + else if (static_cast((*s | ' ') - 'a') < 6) + result = result * 16 + ((*s | ' ') - 'a' + 10); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + overflow = digits > sizeof(U) * 2; + } + else + { + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 10 + (*s - '0'); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + PUGI__STATIC_ASSERT(sizeof(U) == 8 || sizeof(U) == 4 || sizeof(U) == 2); + + const size_t max_digits10 = sizeof(U) == 8 ? 20 : sizeof(U) == 4 ? 10 : 5; + const char_t max_lead = sizeof(U) == 8 ? '1' : sizeof(U) == 4 ? '4' : '6'; + const size_t high_bit = sizeof(U) * 8 - 1; + + overflow = digits >= max_digits10 && !(digits == max_digits10 && (*start < max_lead || (*start == max_lead && result >> high_bit))); + } + + if (negative) + { + // Workaround for crayc++ CC-3059: Expected no overflow in routine. + #ifdef _CRAYC + return (overflow || result > ~minv + 1) ? minv : ~result + 1; + #else + return (overflow || result > 0 - minv) ? minv : 0 - result; + #endif + } + else + return (overflow || result > maxv) ? maxv : result; + } + + PUGI__FN int get_value_int(const char_t* value) + { + return string_to_integer(value, static_cast(INT_MIN), INT_MAX); + } + + PUGI__FN unsigned int get_value_uint(const char_t* value) + { + return string_to_integer(value, 0, UINT_MAX); + } + + PUGI__FN double get_value_double(const char_t* value) + { + #ifdef PUGIXML_WCHAR_MODE + return wcstod(value, 0); + #else + return strtod(value, 0); + #endif + } + + PUGI__FN float get_value_float(const char_t* value) + { + #ifdef PUGIXML_WCHAR_MODE + return static_cast(wcstod(value, 0)); + #else + return static_cast(strtod(value, 0)); + #endif + } + + PUGI__FN bool get_value_bool(const char_t* value) + { + // only look at first char + char_t first = *value; + + // 1*, t* (true), T* (True), y* (yes), Y* (YES) + return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y'); + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long get_value_llong(const char_t* value) + { + return string_to_integer(value, static_cast(LLONG_MIN), LLONG_MAX); + } + + PUGI__FN unsigned long long get_value_ullong(const char_t* value) + { + return string_to_integer(value, 0, ULLONG_MAX); + } +#endif + + template PUGI__FN PUGI__UNSIGNED_OVERFLOW char_t* integer_to_string(char_t* begin, char_t* end, U value, bool negative) + { + char_t* result = end - 1; + U rest = negative ? 0 - value : value; + + do + { + *result-- = static_cast('0' + (rest % 10)); + rest /= 10; + } + while (rest); + + assert(result >= begin); + (void)begin; + + *result = '-'; + + return result + !negative; + } + + // set value with conversion functions + template + PUGI__FN bool set_value_ascii(String& dest, Header& header, uintptr_t header_mask, char* buf) + { + #ifdef PUGIXML_WCHAR_MODE + char_t wbuf[128]; + assert(strlen(buf) < sizeof(wbuf) / sizeof(wbuf[0])); + + size_t offset = 0; + for (; buf[offset]; ++offset) wbuf[offset] = buf[offset]; + + return strcpy_insitu(dest, header, header_mask, wbuf, offset); + #else + return strcpy_insitu(dest, header, header_mask, buf, strlen(buf)); + #endif + } + + template + PUGI__FN bool set_value_integer(String& dest, Header& header, uintptr_t header_mask, U value, bool negative) + { + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, negative); + + return strcpy_insitu(dest, header, header_mask, begin, end - begin); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value, int precision) + { + char buf[128]; + PUGI__SNPRINTF(buf, "%.*g", precision, double(value)); + + return set_value_ascii(dest, header, header_mask, buf); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value, int precision) + { + char buf[128]; + PUGI__SNPRINTF(buf, "%.*g", precision, value); + + return set_value_ascii(dest, header, header_mask, buf); + } + + template + PUGI__FN bool set_value_bool(String& dest, Header& header, uintptr_t header_mask, bool value) + { + return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"), value ? 4 : 5); + } + + PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer) + { + // check input buffer + if (!contents && size) return make_parse_result(status_io_error); + + // get actual encoding + xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size); + + // get private buffer + char_t* buffer = 0; + size_t length = 0; + + // coverity[var_deref_model] + if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory); + + // delete original buffer if we performed a conversion + if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents); + + // grab onto buffer if it's our buffer, user is responsible for deallocating contents himself + if (own || buffer != contents) *out_buffer = buffer; + + // store buffer for offset_debug + doc->buffer = buffer; + + // parse + xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options); + + // remember encoding + res.encoding = buffer_encoding; + + return res; + } + + // we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick + PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result) + { + #if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) + // there are 64-bit versions of fseek/ftell, let's use them + typedef __int64 length_type; + + _fseeki64(file, 0, SEEK_END); + length_type length = _ftelli64(file); + _fseeki64(file, 0, SEEK_SET); + #elif defined(__MINGW32__) && !defined(__NO_MINGW_LFS) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)) + // there are 64-bit versions of fseek/ftell, let's use them + typedef off64_t length_type; + + fseeko64(file, 0, SEEK_END); + length_type length = ftello64(file); + fseeko64(file, 0, SEEK_SET); + #else + // if this is a 32-bit OS, long is enough; if this is a unix system, long is 64-bit, which is enough; otherwise we can't do anything anyway. + typedef long length_type; + + fseek(file, 0, SEEK_END); + length_type length = ftell(file); + fseek(file, 0, SEEK_SET); + #endif + + // check for I/O errors + if (length < 0) return status_io_error; + + // check for overflow + size_t result = static_cast(length); + + if (static_cast(result) != length) return status_out_of_memory; + + // finalize + out_result = result; + + return status_ok; + } + + // This function assumes that buffer has extra sizeof(char_t) writable bytes after size + PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding) + { + // We only need to zero-terminate if encoding conversion does not do it for us + #ifdef PUGIXML_WCHAR_MODE + xml_encoding wchar_encoding = get_wchar_encoding(); + + if (encoding == wchar_encoding || need_endian_swap_utf(encoding, wchar_encoding)) + { + size_t length = size / sizeof(char_t); + + static_cast(buffer)[length] = 0; + return (length + 1) * sizeof(char_t); + } + #else + if (encoding == encoding_utf8) + { + static_cast(buffer)[size] = 0; + return size + 1; + } + #endif + + return size; + } + + PUGI__FN xml_parse_result load_file_impl(xml_document_struct* doc, FILE* file, unsigned int options, xml_encoding encoding, char_t** out_buffer) + { + if (!file) return make_parse_result(status_file_not_found); + + // get file size (can result in I/O errors) + size_t size = 0; + xml_parse_status size_status = get_file_size(file, size); + if (size_status != status_ok) return make_parse_result(size_status); + + size_t max_suffix_size = sizeof(char_t); + + // allocate buffer for the whole file + char* contents = static_cast(xml_memory::allocate(size + max_suffix_size)); + if (!contents) return make_parse_result(status_out_of_memory); + + // read file in memory + size_t read_size = fread(contents, 1, size, file); + + if (read_size != size) + { + xml_memory::deallocate(contents); + return make_parse_result(status_io_error); + } + + xml_encoding real_encoding = get_buffer_encoding(encoding, contents, size); + + return load_buffer_impl(doc, doc, contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding, true, true, out_buffer); + } + + PUGI__FN void close_file(FILE* file) + { + fclose(file); + } + +#ifndef PUGIXML_NO_STL + template struct xml_stream_chunk + { + static xml_stream_chunk* create() + { + void* memory = xml_memory::allocate(sizeof(xml_stream_chunk)); + if (!memory) return 0; + + return new (memory) xml_stream_chunk(); + } + + static void destroy(xml_stream_chunk* chunk) + { + // free chunk chain + while (chunk) + { + xml_stream_chunk* next_ = chunk->next; + + xml_memory::deallocate(chunk); + + chunk = next_; + } + } + + xml_stream_chunk(): next(0), size(0) + { + } + + xml_stream_chunk* next; + size_t size; + + T data[xml_memory_page_size / sizeof(T)]; + }; + + template PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + auto_deleter > chunks(0, xml_stream_chunk::destroy); + + // read file to a chunk list + size_t total = 0; + xml_stream_chunk* last = 0; + + while (!stream.eof()) + { + // allocate new chunk + xml_stream_chunk* chunk = xml_stream_chunk::create(); + if (!chunk) return status_out_of_memory; + + // append chunk to list + if (last) last = last->next = chunk; + else chunks.data = last = chunk; + + // read data to chunk + stream.read(chunk->data, static_cast(sizeof(chunk->data) / sizeof(T))); + chunk->size = static_cast(stream.gcount()) * sizeof(T); + + // read may set failbit | eofbit in case gcount() is less than read length, so check for other I/O errors + if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error; + + // guard against huge files (chunk size is small enough to make this overflow check work) + if (total + chunk->size < total) return status_out_of_memory; + total += chunk->size; + } + + size_t max_suffix_size = sizeof(char_t); + + // copy chunk list to a contiguous buffer + char* buffer = static_cast(xml_memory::allocate(total + max_suffix_size)); + if (!buffer) return status_out_of_memory; + + char* write = buffer; + + for (xml_stream_chunk* chunk = chunks.data; chunk; chunk = chunk->next) + { + assert(write + chunk->size <= buffer + total); + memcpy(write, chunk->data, chunk->size); + write += chunk->size; + } + + assert(write == buffer + total); + + // return buffer + *out_buffer = buffer; + *out_size = total; + + return status_ok; + } + + template PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + // get length of remaining data in stream + typename std::basic_istream::pos_type pos = stream.tellg(); + stream.seekg(0, std::ios::end); + std::streamoff length = stream.tellg() - pos; + stream.seekg(pos); + + if (stream.fail() || pos < 0) return status_io_error; + + // guard against huge files + size_t read_length = static_cast(length); + + if (static_cast(read_length) != length || length < 0) return status_out_of_memory; + + size_t max_suffix_size = sizeof(char_t); + + // read stream data into memory (guard against stream exceptions with buffer holder) + auto_deleter buffer(xml_memory::allocate(read_length * sizeof(T) + max_suffix_size), xml_memory::deallocate); + if (!buffer.data) return status_out_of_memory; + + stream.read(static_cast(buffer.data), static_cast(read_length)); + + // read may set failbit | eofbit in case gcount() is less than read_length (i.e. line ending conversion), so check for other I/O errors + if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error; + + // return buffer + size_t actual_length = static_cast(stream.gcount()); + assert(actual_length <= read_length); + + *out_buffer = buffer.release(); + *out_size = actual_length * sizeof(T); + + return status_ok; + } + + template PUGI__FN xml_parse_result load_stream_impl(xml_document_struct* doc, std::basic_istream& stream, unsigned int options, xml_encoding encoding, char_t** out_buffer) + { + void* buffer = 0; + size_t size = 0; + xml_parse_status status = status_ok; + + // if stream has an error bit set, bail out (otherwise tellg() can fail and we'll clear error bits) + if (stream.fail()) return make_parse_result(status_io_error); + + // load stream to memory (using seek-based implementation if possible, since it's faster and takes less memory) + if (stream.tellg() < 0) + { + stream.clear(); // clear error flags that could be set by a failing tellg + status = load_stream_data_noseek(stream, &buffer, &size); + } + else + status = load_stream_data_seek(stream, &buffer, &size); + + if (status != status_ok) return make_parse_result(status); + + xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size); + + return load_buffer_impl(doc, doc, buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding, true, true, out_buffer); + } +#endif + +#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR))) + PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) + { +#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 + FILE* file = 0; + return _wfopen_s(&file, path, mode) == 0 ? file : 0; +#else + return _wfopen(path, mode); +#endif + } +#else + PUGI__FN char* convert_path_heap(const wchar_t* str) + { + assert(str); + + // first pass: get length in utf8 characters + size_t length = strlength_wide(str); + size_t size = as_utf8_begin(str, length); + + // allocate resulting string + char* result = static_cast(xml_memory::allocate(size + 1)); + if (!result) return 0; + + // second pass: convert to utf8 + as_utf8_end(result, size, str, length); + + // zero-terminate + result[size] = 0; + + return result; + } + + PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) + { + // there is no standard function to open wide paths, so our best bet is to try utf8 path + char* path_utf8 = convert_path_heap(path); + if (!path_utf8) return 0; + + // convert mode to ASCII (we mirror _wfopen interface) + char mode_ascii[4] = {0}; + for (size_t i = 0; mode[i]; ++i) mode_ascii[i] = static_cast(mode[i]); + + // try to open the utf8 path + FILE* result = fopen(path_utf8, mode_ascii); + + // free dummy buffer + xml_memory::deallocate(path_utf8); + + return result; + } +#endif + + PUGI__FN FILE* open_file(const char* path, const char* mode) + { +#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 + FILE* file = 0; + return fopen_s(&file, path, mode) == 0 ? file : 0; +#else + return fopen(path, mode); +#endif + } + + PUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding) + { + if (!file) return false; + + xml_writer_file writer(file); + doc.save(writer, indent, flags, encoding); + + return ferror(file) == 0; + } + + struct name_null_sentry + { + xml_node_struct* node; + char_t* name; + + name_null_sentry(xml_node_struct* node_): node(node_), name(node_->name) + { + node->name = 0; + } + + ~name_null_sentry() + { + node->name = name; + } + }; +PUGI__NS_END + +namespace pugi +{ + PUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_) + { + } + + PUGI__FN void xml_writer_file::write(const void* data, size_t size) + { + size_t result = fwrite(data, 1, size, static_cast(file)); + (void)!result; // unfortunately we can't do proper error handling here + } + +#ifndef PUGIXML_NO_STL + PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream >& stream): narrow_stream(&stream), wide_stream(0) + { + } + + PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream >& stream): narrow_stream(0), wide_stream(&stream) + { + } + + PUGI__FN void xml_writer_stream::write(const void* data, size_t size) + { + if (narrow_stream) + { + assert(!wide_stream); + narrow_stream->write(reinterpret_cast(data), static_cast(size)); + } + else + { + assert(wide_stream); + assert(size % sizeof(wchar_t) == 0); + + wide_stream->write(reinterpret_cast(data), static_cast(size / sizeof(wchar_t))); + } + } +#endif + + PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0) + { + } + + PUGI__FN xml_tree_walker::~xml_tree_walker() + { + } + + PUGI__FN int xml_tree_walker::depth() const + { + return _depth; + } + + PUGI__FN bool xml_tree_walker::begin(xml_node&) + { + return true; + } + + PUGI__FN bool xml_tree_walker::end(xml_node&) + { + return true; + } + + PUGI__FN xml_attribute::xml_attribute(): _attr(0) + { + } + + PUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr) + { + } + + PUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***) + { + } + + PUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const + { + return _attr ? unspecified_bool_xml_attribute : 0; + } + + PUGI__FN bool xml_attribute::operator!() const + { + return !_attr; + } + + PUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const + { + return (_attr == r._attr); + } + + PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const + { + return (_attr != r._attr); + } + + PUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const + { + return (_attr < r._attr); + } + + PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const + { + return (_attr > r._attr); + } + + PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const + { + return (_attr <= r._attr); + } + + PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const + { + return (_attr >= r._attr); + } + + PUGI__FN xml_attribute xml_attribute::next_attribute() const + { + return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute(); + } + + PUGI__FN xml_attribute xml_attribute::previous_attribute() const + { + return _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute(); + } + + PUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const + { + return (_attr && _attr->value) ? _attr->value + 0 : def; + } + + PUGI__FN int xml_attribute::as_int(int def) const + { + return (_attr && _attr->value) ? impl::get_value_int(_attr->value) : def; + } + + PUGI__FN unsigned int xml_attribute::as_uint(unsigned int def) const + { + return (_attr && _attr->value) ? impl::get_value_uint(_attr->value) : def; + } + + PUGI__FN double xml_attribute::as_double(double def) const + { + return (_attr && _attr->value) ? impl::get_value_double(_attr->value) : def; + } + + PUGI__FN float xml_attribute::as_float(float def) const + { + return (_attr && _attr->value) ? impl::get_value_float(_attr->value) : def; + } + + PUGI__FN bool xml_attribute::as_bool(bool def) const + { + return (_attr && _attr->value) ? impl::get_value_bool(_attr->value) : def; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long xml_attribute::as_llong(long long def) const + { + return (_attr && _attr->value) ? impl::get_value_llong(_attr->value) : def; + } + + PUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const + { + return (_attr && _attr->value) ? impl::get_value_ullong(_attr->value) : def; + } +#endif + + PUGI__FN bool xml_attribute::empty() const + { + return !_attr; + } + + PUGI__FN const char_t* xml_attribute::name() const + { + return (_attr && _attr->name) ? _attr->name + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_attribute::value() const + { + return (_attr && _attr->value) ? _attr->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN size_t xml_attribute::hash_value() const + { + return static_cast(reinterpret_cast(_attr) / sizeof(xml_attribute_struct)); + } + + PUGI__FN xml_attribute_struct* xml_attribute::internal_object() const + { + return _attr; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(int rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(long rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(double rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(float rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(bool rhs) + { + set_value(rhs); + return *this; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN xml_attribute& xml_attribute::operator=(long long rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs) + { + set_value(rhs); + return *this; + } +#endif + + PUGI__FN bool xml_attribute::set_name(const char_t* rhs) + { + if (!_attr) return false; + + return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_attribute::set_value(const char_t* rhs) + { + if (!_attr) return false; + + return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_attribute::set_value(int rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); + } + + PUGI__FN bool xml_attribute::set_value(unsigned int rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); + } + + PUGI__FN bool xml_attribute::set_value(long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); + } + + PUGI__FN bool xml_attribute::set_value(unsigned long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); + } + + PUGI__FN bool xml_attribute::set_value(double rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, default_double_precision); + } + + PUGI__FN bool xml_attribute::set_value(double rhs, int precision) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, precision); + } + + PUGI__FN bool xml_attribute::set_value(float rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, default_float_precision); + } + + PUGI__FN bool xml_attribute::set_value(float rhs, int precision) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, precision); + } + + PUGI__FN bool xml_attribute::set_value(bool rhs) + { + if (!_attr) return false; + + return impl::set_value_bool(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN bool xml_attribute::set_value(long long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); + } + + PUGI__FN bool xml_attribute::set_value(unsigned long long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); + } +#endif + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_attribute& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_node::xml_node(): _root(0) + { + } + + PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p) + { + } + + PUGI__FN static void unspecified_bool_xml_node(xml_node***) + { + } + + PUGI__FN xml_node::operator xml_node::unspecified_bool_type() const + { + return _root ? unspecified_bool_xml_node : 0; + } + + PUGI__FN bool xml_node::operator!() const + { + return !_root; + } + + PUGI__FN xml_node::iterator xml_node::begin() const + { + return iterator(_root ? _root->first_child + 0 : 0, _root); + } + + PUGI__FN xml_node::iterator xml_node::end() const + { + return iterator(0, _root); + } + + PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const + { + return attribute_iterator(_root ? _root->first_attribute + 0 : 0, _root); + } + + PUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const + { + return attribute_iterator(0, _root); + } + + PUGI__FN xml_object_range xml_node::children() const + { + return xml_object_range(begin(), end()); + } + + PUGI__FN xml_object_range xml_node::children(const char_t* name_) const + { + return xml_object_range(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_)); + } + + PUGI__FN xml_object_range xml_node::attributes() const + { + return xml_object_range(attributes_begin(), attributes_end()); + } + + PUGI__FN bool xml_node::operator==(const xml_node& r) const + { + return (_root == r._root); + } + + PUGI__FN bool xml_node::operator!=(const xml_node& r) const + { + return (_root != r._root); + } + + PUGI__FN bool xml_node::operator<(const xml_node& r) const + { + return (_root < r._root); + } + + PUGI__FN bool xml_node::operator>(const xml_node& r) const + { + return (_root > r._root); + } + + PUGI__FN bool xml_node::operator<=(const xml_node& r) const + { + return (_root <= r._root); + } + + PUGI__FN bool xml_node::operator>=(const xml_node& r) const + { + return (_root >= r._root); + } + + PUGI__FN bool xml_node::empty() const + { + return !_root; + } + + PUGI__FN const char_t* xml_node::name() const + { + return (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN xml_node_type xml_node::type() const + { + return _root ? PUGI__NODETYPE(_root) : node_null; + } + + PUGI__FN const char_t* xml_node::value() const + { + return (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN xml_node xml_node::child(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const + { + if (!_root) return xml_attribute(); + + for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute) + if (i->name && impl::strequal(name_, i->name)) + return xml_attribute(i); + + return xml_attribute(); + } + + PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_node xml_node::next_sibling() const + { + return _root ? xml_node(_root->next_sibling) : xml_node(); + } + + PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_attribute xml_node::attribute(const char_t* name_, xml_attribute& hint_) const + { + xml_attribute_struct* hint = hint_._attr; + + // if hint is not an attribute of node, behavior is not defined + assert(!hint || (_root && impl::is_attribute_of(hint, _root))); + + if (!_root) return xml_attribute(); + + // optimistically search from hint up until the end + for (xml_attribute_struct* i = hint; i; i = i->next_attribute) + if (i->name && impl::strequal(name_, i->name)) + { + // update hint to maximize efficiency of searching for consecutive attributes + hint_._attr = i->next_attribute; + + return xml_attribute(i); + } + + // wrap around and search from the first attribute until the hint + // 'j' null pointer check is technically redundant, but it prevents a crash in case the assertion above fails + for (xml_attribute_struct* j = _root->first_attribute; j && j != hint; j = j->next_attribute) + if (j->name && impl::strequal(name_, j->name)) + { + // update hint to maximize efficiency of searching for consecutive attributes + hint_._attr = j->next_attribute; + + return xml_attribute(j); + } + + return xml_attribute(); + } + + PUGI__FN xml_node xml_node::previous_sibling() const + { + if (!_root) return xml_node(); + + if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c); + else return xml_node(); + } + + PUGI__FN xml_node xml_node::parent() const + { + return _root ? xml_node(_root->parent) : xml_node(); + } + + PUGI__FN xml_node xml_node::root() const + { + return _root ? xml_node(&impl::get_document(_root)) : xml_node(); + } + + PUGI__FN xml_text xml_node::text() const + { + return xml_text(_root); + } + + PUGI__FN const char_t* xml_node::child_value() const + { + if (!_root) return PUGIXML_TEXT(""); + + // element nodes can have value if parse_embed_pcdata was used + if (PUGI__NODETYPE(_root) == node_element && _root->value) + return _root->value; + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (impl::is_text_node(i) && i->value) + return i->value; + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const + { + return child(name_).child_value(); + } + + PUGI__FN xml_attribute xml_node::first_attribute() const + { + return _root ? xml_attribute(_root->first_attribute) : xml_attribute(); + } + + PUGI__FN xml_attribute xml_node::last_attribute() const + { + return _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute(); + } + + PUGI__FN xml_node xml_node::first_child() const + { + return _root ? xml_node(_root->first_child) : xml_node(); + } + + PUGI__FN xml_node xml_node::last_child() const + { + return _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node(); + } + + PUGI__FN bool xml_node::set_name(const char_t* rhs) + { + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; + + if (type_ != node_element && type_ != node_pi && type_ != node_declaration) + return false; + + return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_node::set_value(const char_t* rhs) + { + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; + + if (type_ != node_pcdata && type_ != node_cdata && type_ != node_comment && type_ != node_pi && type_ != node_doctype) + return false; + + return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::append_attribute(a._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::prepend_attribute(a._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_after(a._attr, attr._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_before(a._attr, attr._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::append_attribute(a._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::prepend_attribute(a._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_after(a._attr, attr._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_before(a._attr, attr._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_node xml_node::append_child(xml_node_type type_) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::append_node(n._root, _root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::prepend_child(xml_node_type type_) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::prepend_node(n._root, _root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_before(n._root, node._root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_after(n._root, node._root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::append_child(const char_t* name_) + { + xml_node result = append_child(node_element); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::prepend_child(const char_t* name_) + { + xml_node result = prepend_child(node_element); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node) + { + xml_node result = insert_child_after(node_element, node); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node) + { + xml_node result = insert_child_before(node_element, node); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::append_copy(const xml_node& proto) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::append_node(n._root, _root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::prepend_node(n._root, _root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_after(n._root, node._root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_before(n._root, node._root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::append_move(const xml_node& moved) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::append_node(moved._root, _root); + + return moved; + } + + PUGI__FN xml_node xml_node::prepend_move(const xml_node& moved) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::prepend_node(moved._root, _root); + + return moved; + } + + PUGI__FN xml_node xml_node::insert_move_after(const xml_node& moved, const xml_node& node) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + if (moved._root == node._root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::insert_node_after(moved._root, node._root); + + return moved; + } + + PUGI__FN xml_node xml_node::insert_move_before(const xml_node& moved, const xml_node& node) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + if (moved._root == node._root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::insert_node_before(moved._root, node._root); + + return moved; + } + + PUGI__FN bool xml_node::remove_attribute(const char_t* name_) + { + return remove_attribute(attribute(name_)); + } + + PUGI__FN bool xml_node::remove_attribute(const xml_attribute& a) + { + if (!_root || !a._attr) return false; + if (!impl::is_attribute_of(a._attr, _root)) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + impl::remove_attribute(a._attr, _root); + impl::destroy_attribute(a._attr, alloc); + + return true; + } + + PUGI__FN bool xml_node::remove_attributes() + { + if (!_root) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + for (xml_attribute_struct* attr = _root->first_attribute; attr; ) + { + xml_attribute_struct* next = attr->next_attribute; + + impl::destroy_attribute(attr, alloc); + + attr = next; + } + + _root->first_attribute = 0; + + return true; + } + + PUGI__FN bool xml_node::remove_child(const char_t* name_) + { + return remove_child(child(name_)); + } + + PUGI__FN bool xml_node::remove_child(const xml_node& n) + { + if (!_root || !n._root || n._root->parent != _root) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + impl::remove_node(n._root); + impl::destroy_node(n._root, alloc); + + return true; + } + + PUGI__FN bool xml_node::remove_children() + { + if (!_root) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + for (xml_node_struct* cur = _root->first_child; cur; ) + { + xml_node_struct* next = cur->next_sibling; + + impl::destroy_node(cur, alloc); + + cur = next; + } + + _root->first_child = 0; + + return true; + } + + PUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + // append_buffer is only valid for elements/documents + if (!impl::allow_insert_child(type(), node_element)) return impl::make_parse_result(status_append_invalid_root); + + // get document node + impl::xml_document_struct* doc = &impl::get_document(_root); + + // disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense + doc->header |= impl::xml_memory_page_contents_shared_mask; + + // get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later) + impl::xml_memory_page* page = 0; + impl::xml_extra_buffer* extra = static_cast(doc->allocate_memory(sizeof(impl::xml_extra_buffer) + sizeof(void*), page)); + (void)page; + + if (!extra) return impl::make_parse_result(status_out_of_memory); + + #ifdef PUGIXML_COMPACT + // align the memory block to a pointer boundary; this is required for compact mode where memory allocations are only 4b aligned + // note that this requires up to sizeof(void*)-1 additional memory, which the allocation above takes into account + extra = reinterpret_cast((reinterpret_cast(extra) + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1)); + #endif + + // add extra buffer to the list + extra->buffer = 0; + extra->next = doc->extra_buffers; + doc->extra_buffers = extra; + + // name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level + impl::name_null_sentry sentry(_root); + + return impl::load_buffer_impl(doc, _root, const_cast(contents), size, options, encoding, false, false, &extra->buffer); + } + + PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) + { + for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) + if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) + return xml_node(i); + } + + return xml_node(); + } + + PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) + if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) + return xml_node(i); + + return xml_node(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN string_t xml_node::path(char_t delimiter) const + { + if (!_root) return string_t(); + + size_t offset = 0; + + for (xml_node_struct* i = _root; i; i = i->parent) + { + offset += (i != _root); + offset += i->name ? impl::strlength(i->name) : 0; + } + + string_t result; + result.resize(offset); + + for (xml_node_struct* j = _root; j; j = j->parent) + { + if (j != _root) + result[--offset] = delimiter; + + if (j->name) + { + size_t length = impl::strlength(j->name); + + offset -= length; + memcpy(&result[offset], j->name, length * sizeof(char_t)); + } + } + + assert(offset == 0); + + return result; + } +#endif + + PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const + { + xml_node context = path_[0] == delimiter ? root() : *this; + + if (!context._root) return xml_node(); + + const char_t* path_segment = path_; + + while (*path_segment == delimiter) ++path_segment; + + const char_t* path_segment_end = path_segment; + + while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end; + + if (path_segment == path_segment_end) return context; + + const char_t* next_segment = path_segment_end; + + while (*next_segment == delimiter) ++next_segment; + + if (*path_segment == '.' && path_segment + 1 == path_segment_end) + return context.first_element_by_path(next_segment, delimiter); + else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end) + return context.parent().first_element_by_path(next_segment, delimiter); + else + { + for (xml_node_struct* j = context._root->first_child; j; j = j->next_sibling) + { + if (j->name && impl::strequalrange(j->name, path_segment, static_cast(path_segment_end - path_segment))) + { + xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter); + + if (subsearch) return subsearch; + } + } + + return xml_node(); + } + } + + PUGI__FN bool xml_node::traverse(xml_tree_walker& walker) + { + walker._depth = -1; + + xml_node arg_begin(_root); + if (!walker.begin(arg_begin)) return false; + + xml_node_struct* cur = _root ? _root->first_child + 0 : 0; + + if (cur) + { + ++walker._depth; + + do + { + xml_node arg_for_each(cur); + if (!walker.for_each(arg_for_each)) + return false; + + if (cur->first_child) + { + ++walker._depth; + cur = cur->first_child; + } + else if (cur->next_sibling) + cur = cur->next_sibling; + else + { + while (!cur->next_sibling && cur != _root && cur->parent) + { + --walker._depth; + cur = cur->parent; + } + + if (cur != _root) + cur = cur->next_sibling; + } + } + while (cur && cur != _root); + } + + assert(walker._depth == -1); + + xml_node arg_end(_root); + return walker.end(arg_end); + } + + PUGI__FN size_t xml_node::hash_value() const + { + return static_cast(reinterpret_cast(_root) / sizeof(xml_node_struct)); + } + + PUGI__FN xml_node_struct* xml_node::internal_object() const + { + return _root; + } + + PUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const + { + if (!_root) return; + + impl::xml_buffered_writer buffered_writer(writer, encoding); + + impl::node_output(buffered_writer, _root, indent, flags, depth); + + buffered_writer.flush(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN void xml_node::print(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const + { + xml_writer_stream writer(stream); + + print(writer, indent, flags, encoding, depth); + } + + PUGI__FN void xml_node::print(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const + { + xml_writer_stream writer(stream); + + print(writer, indent, flags, encoding_wchar, depth); + } +#endif + + PUGI__FN ptrdiff_t xml_node::offset_debug() const + { + if (!_root) return -1; + + impl::xml_document_struct& doc = impl::get_document(_root); + + // we can determine the offset reliably only if there is exactly once parse buffer + if (!doc.buffer || doc.extra_buffers) return -1; + + switch (type()) + { + case node_document: + return 0; + + case node_element: + case node_declaration: + case node_pi: + return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1; + + case node_pcdata: + case node_cdata: + case node_comment: + case node_doctype: + return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1; + + default: + assert(false && "Invalid node type"); // unreachable + return -1; + } + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_node& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_node& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_text::xml_text(xml_node_struct* root): _root(root) + { + } + + PUGI__FN xml_node_struct* xml_text::_data() const + { + if (!_root || impl::is_text_node(_root)) return _root; + + // element nodes can have value if parse_embed_pcdata was used + if (PUGI__NODETYPE(_root) == node_element && _root->value) + return _root; + + for (xml_node_struct* node = _root->first_child; node; node = node->next_sibling) + if (impl::is_text_node(node)) + return node; + + return 0; + } + + PUGI__FN xml_node_struct* xml_text::_data_new() + { + xml_node_struct* d = _data(); + if (d) return d; + + return xml_node(_root).append_child(node_pcdata).internal_object(); + } + + PUGI__FN xml_text::xml_text(): _root(0) + { + } + + PUGI__FN static void unspecified_bool_xml_text(xml_text***) + { + } + + PUGI__FN xml_text::operator xml_text::unspecified_bool_type() const + { + return _data() ? unspecified_bool_xml_text : 0; + } + + PUGI__FN bool xml_text::operator!() const + { + return !_data(); + } + + PUGI__FN bool xml_text::empty() const + { + return _data() == 0; + } + + PUGI__FN const char_t* xml_text::get() const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? d->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_text::as_string(const char_t* def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? d->value + 0 : def; + } + + PUGI__FN int xml_text::as_int(int def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_int(d->value) : def; + } + + PUGI__FN unsigned int xml_text::as_uint(unsigned int def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_uint(d->value) : def; + } + + PUGI__FN double xml_text::as_double(double def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_double(d->value) : def; + } + + PUGI__FN float xml_text::as_float(float def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_float(d->value) : def; + } + + PUGI__FN bool xml_text::as_bool(bool def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_bool(d->value) : def; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long xml_text::as_llong(long long def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_llong(d->value) : def; + } + + PUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_ullong(d->value) : def; + } +#endif + + PUGI__FN bool xml_text::set(const char_t* rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)) : false; + } + + PUGI__FN bool xml_text::set(int rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; + } + + PUGI__FN bool xml_text::set(unsigned int rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; + } + + PUGI__FN bool xml_text::set(long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; + } + + PUGI__FN bool xml_text::set(unsigned long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; + } + + PUGI__FN bool xml_text::set(float rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, default_float_precision) : false; + } + + PUGI__FN bool xml_text::set(float rhs, int precision) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, precision) : false; + } + + PUGI__FN bool xml_text::set(double rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, default_double_precision) : false; + } + + PUGI__FN bool xml_text::set(double rhs, int precision) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, precision) : false; + } + + PUGI__FN bool xml_text::set(bool rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_bool(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN bool xml_text::set(long long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; + } + + PUGI__FN bool xml_text::set(unsigned long long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; + } +#endif + + PUGI__FN xml_text& xml_text::operator=(const char_t* rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(int rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned int rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(long rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned long rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(double rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(float rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(bool rhs) + { + set(rhs); + return *this; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN xml_text& xml_text::operator=(long long rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned long long rhs) + { + set(rhs); + return *this; + } +#endif + + PUGI__FN xml_node xml_text::data() const + { + return xml_node(_data()); + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_text& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_text& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_node_iterator::xml_node_iterator() + { + } + + PUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent()) + { + } + + PUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) + { + } + + PUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const + { + return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const + { + return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_node& xml_node_iterator::operator*() const + { + assert(_wrap._root); + return _wrap; + } + + PUGI__FN xml_node* xml_node_iterator::operator->() const + { + assert(_wrap._root); + return const_cast(&_wrap); // BCC5 workaround + } + + PUGI__FN const xml_node_iterator& xml_node_iterator::operator++() + { + assert(_wrap._root); + _wrap._root = _wrap._root->next_sibling; + return *this; + } + + PUGI__FN xml_node_iterator xml_node_iterator::operator++(int) + { + xml_node_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_node_iterator& xml_node_iterator::operator--() + { + _wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child(); + return *this; + } + + PUGI__FN xml_node_iterator xml_node_iterator::operator--(int) + { + xml_node_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator() + { + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent) + { + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) + { + } + + PUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const + { + return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const + { + return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_attribute& xml_attribute_iterator::operator*() const + { + assert(_wrap._attr); + return _wrap; + } + + PUGI__FN xml_attribute* xml_attribute_iterator::operator->() const + { + assert(_wrap._attr); + return const_cast(&_wrap); // BCC5 workaround + } + + PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++() + { + assert(_wrap._attr); + _wrap._attr = _wrap._attr->next_attribute; + return *this; + } + + PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int) + { + xml_attribute_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--() + { + _wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute(); + return *this; + } + + PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int) + { + xml_attribute_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(): _name(0) + { + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(const xml_node& node, const char_t* name): _wrap(node), _parent(node.parent()), _name(name) + { + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name): _wrap(ref), _parent(parent), _name(name) + { + } + + PUGI__FN bool xml_named_node_iterator::operator==(const xml_named_node_iterator& rhs) const + { + return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_named_node_iterator::operator!=(const xml_named_node_iterator& rhs) const + { + return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_node& xml_named_node_iterator::operator*() const + { + assert(_wrap._root); + return _wrap; + } + + PUGI__FN xml_node* xml_named_node_iterator::operator->() const + { + assert(_wrap._root); + return const_cast(&_wrap); // BCC5 workaround + } + + PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++() + { + assert(_wrap._root); + _wrap = _wrap.next_sibling(_name); + return *this; + } + + PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator++(int) + { + xml_named_node_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator--() + { + if (_wrap._root) + _wrap = _wrap.previous_sibling(_name); + else + { + _wrap = _parent.last_child(); + + if (!impl::strequal(_wrap.name(), _name)) + _wrap = _wrap.previous_sibling(_name); + } + + return *this; + } + + PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator--(int) + { + xml_named_node_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto) + { + } + + PUGI__FN xml_parse_result::operator bool() const + { + return status == status_ok; + } + + PUGI__FN const char* xml_parse_result::description() const + { + switch (status) + { + case status_ok: return "No error"; + + case status_file_not_found: return "File was not found"; + case status_io_error: return "Error reading from file/stream"; + case status_out_of_memory: return "Could not allocate memory"; + case status_internal_error: return "Internal error occurred"; + + case status_unrecognized_tag: return "Could not determine tag type"; + + case status_bad_pi: return "Error parsing document declaration/processing instruction"; + case status_bad_comment: return "Error parsing comment"; + case status_bad_cdata: return "Error parsing CDATA section"; + case status_bad_doctype: return "Error parsing document type declaration"; + case status_bad_pcdata: return "Error parsing PCDATA section"; + case status_bad_start_element: return "Error parsing start element tag"; + case status_bad_attribute: return "Error parsing element attribute"; + case status_bad_end_element: return "Error parsing end element tag"; + case status_end_element_mismatch: return "Start-end tags mismatch"; + + case status_append_invalid_root: return "Unable to append nodes: root is not an element or document"; + + case status_no_document_element: return "No document element found"; + + default: return "Unknown error"; + } + } + + PUGI__FN xml_document::xml_document(): _buffer(0) + { + _create(); + } + + PUGI__FN xml_document::~xml_document() + { + _destroy(); + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xml_document::xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT: _buffer(0) + { + _create(); + _move(rhs); + } + + PUGI__FN xml_document& xml_document::operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT + { + if (this == &rhs) return *this; + + _destroy(); + _create(); + _move(rhs); + + return *this; + } +#endif + + PUGI__FN void xml_document::reset() + { + _destroy(); + _create(); + } + + PUGI__FN void xml_document::reset(const xml_document& proto) + { + reset(); + + impl::node_copy_tree(_root, proto._root); + } + + PUGI__FN void xml_document::_create() + { + assert(!_root); + + #ifdef PUGIXML_COMPACT + // space for page marker for the first page (uint32_t), rounded up to pointer size; assumes pointers are at least 32-bit + const size_t page_offset = sizeof(void*); + #else + const size_t page_offset = 0; + #endif + + // initialize sentinel page + PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + page_offset <= sizeof(_memory)); + + // prepare page structure + impl::xml_memory_page* page = impl::xml_memory_page::construct(_memory); + assert(page); + + page->busy_size = impl::xml_memory_page_size; + + // setup first page marker + #ifdef PUGIXML_COMPACT + // round-trip through void* to avoid 'cast increases required alignment of target type' warning + page->compact_page_marker = reinterpret_cast(static_cast(reinterpret_cast(page) + sizeof(impl::xml_memory_page))); + *page->compact_page_marker = sizeof(impl::xml_memory_page); + #endif + + // allocate new root + _root = new (reinterpret_cast(page) + sizeof(impl::xml_memory_page) + page_offset) impl::xml_document_struct(page); + _root->prev_sibling_c = _root; + + // setup sentinel page + page->allocator = static_cast(_root); + + // setup hash table pointer in allocator + #ifdef PUGIXML_COMPACT + page->allocator->_hash = &static_cast(_root)->hash; + #endif + + // verify the document allocation + assert(reinterpret_cast(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory)); + } + + PUGI__FN void xml_document::_destroy() + { + assert(_root); + + // destroy static storage + if (_buffer) + { + impl::xml_memory::deallocate(_buffer); + _buffer = 0; + } + + // destroy extra buffers (note: no need to destroy linked list nodes, they're allocated using document allocator) + for (impl::xml_extra_buffer* extra = static_cast(_root)->extra_buffers; extra; extra = extra->next) + { + if (extra->buffer) impl::xml_memory::deallocate(extra->buffer); + } + + // destroy dynamic storage, leave sentinel page (it's in static memory) + impl::xml_memory_page* root_page = PUGI__GETPAGE(_root); + assert(root_page && !root_page->prev); + assert(reinterpret_cast(root_page) >= _memory && reinterpret_cast(root_page) < _memory + sizeof(_memory)); + + for (impl::xml_memory_page* page = root_page->next; page; ) + { + impl::xml_memory_page* next = page->next; + + impl::xml_allocator::deallocate_page(page); + + page = next; + } + + #ifdef PUGIXML_COMPACT + // destroy hash table + static_cast(_root)->hash.clear(); + #endif + + _root = 0; + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN void xml_document::_move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT + { + impl::xml_document_struct* doc = static_cast(_root); + impl::xml_document_struct* other = static_cast(rhs._root); + + // save first child pointer for later; this needs hash access + xml_node_struct* other_first_child = other->first_child; + + #ifdef PUGIXML_COMPACT + // reserve space for the hash table up front; this is the only operation that can fail + // if it does, we have no choice but to throw (if we have exceptions) + if (other_first_child) + { + size_t other_children = 0; + for (xml_node_struct* node = other_first_child; node; node = node->next_sibling) + other_children++; + + // in compact mode, each pointer assignment could result in a hash table request + // during move, we have to relocate document first_child and parents of all children + // normally there's just one child and its parent has a pointerless encoding but + // we assume the worst here + if (!other->_hash->reserve(other_children + 1)) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return; + #else + throw std::bad_alloc(); + #endif + } + } + #endif + + // move allocation state + doc->_root = other->_root; + doc->_busy_size = other->_busy_size; + + // move buffer state + doc->buffer = other->buffer; + doc->extra_buffers = other->extra_buffers; + _buffer = rhs._buffer; + + #ifdef PUGIXML_COMPACT + // move compact hash; note that the hash table can have pointers to other but they will be "inactive", similarly to nodes removed with remove_child + doc->hash = other->hash; + doc->_hash = &doc->hash; + + // make sure we don't access other hash up until the end when we reinitialize other document + other->_hash = 0; + #endif + + // move page structure + impl::xml_memory_page* doc_page = PUGI__GETPAGE(doc); + assert(doc_page && !doc_page->prev && !doc_page->next); + + impl::xml_memory_page* other_page = PUGI__GETPAGE(other); + assert(other_page && !other_page->prev); + + // relink pages since root page is embedded into xml_document + if (impl::xml_memory_page* page = other_page->next) + { + assert(page->prev == other_page); + + page->prev = doc_page; + + doc_page->next = page; + other_page->next = 0; + } + + // make sure pages point to the correct document state + for (impl::xml_memory_page* page = doc_page->next; page; page = page->next) + { + assert(page->allocator == other); + + page->allocator = doc; + + #ifdef PUGIXML_COMPACT + // this automatically migrates most children between documents and prevents ->parent assignment from allocating + if (page->compact_shared_parent == other) + page->compact_shared_parent = doc; + #endif + } + + // move tree structure + assert(!doc->first_child); + + doc->first_child = other_first_child; + + for (xml_node_struct* node = other_first_child; node; node = node->next_sibling) + { + #ifdef PUGIXML_COMPACT + // most children will have migrated when we reassigned compact_shared_parent + assert(node->parent == other || node->parent == doc); + + node->parent = doc; + #else + assert(node->parent == other); + node->parent = doc; + #endif + } + + // reset other document + new (other) impl::xml_document_struct(PUGI__GETPAGE(other)); + rhs._buffer = 0; + } +#endif + +#ifndef PUGIXML_NO_STL + PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_stream_impl(static_cast(_root), stream, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options) + { + reset(); + + return impl::load_stream_impl(static_cast(_root), stream, options, encoding_wchar, &_buffer); + } +#endif + + PUGI__FN xml_parse_result xml_document::load_string(const char_t* contents, unsigned int options) + { + // Force native encoding (skip autodetection) + #ifdef PUGIXML_WCHAR_MODE + xml_encoding encoding = encoding_wchar; + #else + xml_encoding encoding = encoding_utf8; + #endif + + return load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding); + } + + PUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options) + { + return load_string(contents, options); + } + + PUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding) + { + reset(); + + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file(path_, "rb"), impl::close_file); + + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding) + { + reset(); + + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file_wide(path_, L"rb"), impl::close_file); + + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, const_cast(contents), size, options, encoding, false, false, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, contents, size, options, encoding, true, false, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, contents, size, options, encoding, true, true, &_buffer); + } + + PUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + impl::xml_buffered_writer buffered_writer(writer, encoding); + + if ((flags & format_write_bom) && encoding != encoding_latin1) + { + // BOM always represents the codepoint U+FEFF, so just write it in native encoding + #ifdef PUGIXML_WCHAR_MODE + unsigned int bom = 0xfeff; + buffered_writer.write(static_cast(bom)); + #else + buffered_writer.write('\xef', '\xbb', '\xbf'); + #endif + } + + if (!(flags & format_no_declaration) && !impl::has_declaration(_root)) + { + buffered_writer.write_string(PUGIXML_TEXT("'); + if (!(flags & format_raw)) buffered_writer.write('\n'); + } + + impl::node_output(buffered_writer, _root, indent, flags, 0); + + buffered_writer.flush(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN void xml_document::save(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + xml_writer_stream writer(stream); + + save(writer, indent, flags, encoding); + } + + PUGI__FN void xml_document::save(std::basic_ostream >& stream, const char_t* indent, unsigned int flags) const + { + xml_writer_stream writer(stream); + + save(writer, indent, flags, encoding_wchar); + } +#endif + + PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file(path_, (flags & format_save_file_text) ? "w" : "wb"), impl::close_file); + + return impl::save_file_impl(*this, file.data, indent, flags, encoding); + } + + PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb"), impl::close_file); + + return impl::save_file_impl(*this, file.data, indent, flags, encoding); + } + + PUGI__FN xml_node xml_document::document_element() const + { + assert(_root); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (PUGI__NODETYPE(i) == node_element) + return xml_node(i); + + return xml_node(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str) + { + assert(str); + + return impl::as_utf8_impl(str, impl::strlength_wide(str)); + } + + PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string& str) + { + return impl::as_utf8_impl(str.c_str(), str.size()); + } + + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const char* str) + { + assert(str); + + return impl::as_wide_impl(str, strlen(str)); + } + + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const std::string& str) + { + return impl::as_wide_impl(str.c_str(), str.size()); + } +#endif + + PUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate) + { + impl::xml_memory::allocate = allocate; + impl::xml_memory::deallocate = deallocate; + } + + PUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function() + { + return impl::xml_memory::allocate; + } + + PUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function() + { + return impl::xml_memory::deallocate; + } +} + +#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) +namespace std +{ + // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_named_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } +} +#endif + +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_named_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } +} +#endif + +#ifndef PUGIXML_NO_XPATH +// STL replacements +PUGI__NS_BEGIN + struct equal_to + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs == rhs; + } + }; + + struct not_equal_to + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs != rhs; + } + }; + + struct less + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs < rhs; + } + }; + + struct less_equal + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs <= rhs; + } + }; + + template inline void swap(T& lhs, T& rhs) + { + T temp = lhs; + lhs = rhs; + rhs = temp; + } + + template PUGI__FN I min_element(I begin, I end, const Pred& pred) + { + I result = begin; + + for (I it = begin + 1; it != end; ++it) + if (pred(*it, *result)) + result = it; + + return result; + } + + template PUGI__FN void reverse(I begin, I end) + { + while (end - begin > 1) + swap(*begin++, *--end); + } + + template PUGI__FN I unique(I begin, I end) + { + // fast skip head + while (end - begin > 1 && *begin != *(begin + 1)) + begin++; + + if (begin == end) + return begin; + + // last written element + I write = begin++; + + // merge unique elements + while (begin != end) + { + if (*begin != *write) + *++write = *begin++; + else + begin++; + } + + // past-the-end (write points to live element) + return write + 1; + } + + template PUGI__FN void insertion_sort(T* begin, T* end, const Pred& pred) + { + if (begin == end) + return; + + for (T* it = begin + 1; it != end; ++it) + { + T val = *it; + T* hole = it; + + // move hole backwards + while (hole > begin && pred(val, *(hole - 1))) + { + *hole = *(hole - 1); + hole--; + } + + // fill hole with element + *hole = val; + } + } + + template inline I median3(I first, I middle, I last, const Pred& pred) + { + if (pred(*middle, *first)) + swap(middle, first); + if (pred(*last, *middle)) + swap(last, middle); + if (pred(*middle, *first)) + swap(middle, first); + + return middle; + } + + template PUGI__FN void partition3(T* begin, T* end, T pivot, const Pred& pred, T** out_eqbeg, T** out_eqend) + { + // invariant: array is split into 4 groups: = < ? > (each variable denotes the boundary between the groups) + T* eq = begin; + T* lt = begin; + T* gt = end; + + while (lt < gt) + { + if (pred(*lt, pivot)) + lt++; + else if (*lt == pivot) + swap(*eq++, *lt++); + else + swap(*lt, *--gt); + } + + // we now have just 4 groups: = < >; move equal elements to the middle + T* eqbeg = gt; + + for (T* it = begin; it != eq; ++it) + swap(*it, *--eqbeg); + + *out_eqbeg = eqbeg; + *out_eqend = gt; + } + + template PUGI__FN void sort(I begin, I end, const Pred& pred) + { + // sort large chunks + while (end - begin > 16) + { + // find median element + I middle = begin + (end - begin) / 2; + I median = median3(begin, middle, end - 1, pred); + + // partition in three chunks (< = >) + I eqbeg, eqend; + partition3(begin, end, *median, pred, &eqbeg, &eqend); + + // loop on larger half + if (eqbeg - begin > end - eqend) + { + sort(eqend, end, pred); + end = eqbeg; + } + else + { + sort(begin, eqbeg, pred); + begin = eqend; + } + } + + // insertion sort small chunk + insertion_sort(begin, end, pred); + } + + PUGI__FN bool hash_insert(const void** table, size_t size, const void* key) + { + assert(key); + + unsigned int h = static_cast(reinterpret_cast(key)); + + // MurmurHash3 32-bit finalizer + h ^= h >> 16; + h *= 0x85ebca6bu; + h ^= h >> 13; + h *= 0xc2b2ae35u; + h ^= h >> 16; + + size_t hashmod = size - 1; + size_t bucket = h & hashmod; + + for (size_t probe = 0; probe <= hashmod; ++probe) + { + if (table[bucket] == 0) + { + table[bucket] = key; + return true; + } + + if (table[bucket] == key) + return false; + + // hash collision, quadratic probing + bucket = (bucket + probe + 1) & hashmod; + } + + assert(false && "Hash table is full"); // unreachable + return false; + } +PUGI__NS_END + +// Allocator used for AST and evaluation stacks +PUGI__NS_BEGIN + static const size_t xpath_memory_page_size = + #ifdef PUGIXML_MEMORY_XPATH_PAGE_SIZE + PUGIXML_MEMORY_XPATH_PAGE_SIZE + #else + 4096 + #endif + ; + + static const uintptr_t xpath_memory_block_alignment = sizeof(double) > sizeof(void*) ? sizeof(double) : sizeof(void*); + + struct xpath_memory_block + { + xpath_memory_block* next; + size_t capacity; + + union + { + char data[xpath_memory_page_size]; + double alignment; + }; + }; + + struct xpath_allocator + { + xpath_memory_block* _root; + size_t _root_size; + bool* _error; + + xpath_allocator(xpath_memory_block* root, bool* error = 0): _root(root), _root_size(0), _error(error) + { + } + + void* allocate(size_t size) + { + // round size up to block alignment boundary + size = (size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + + if (_root_size + size <= _root->capacity) + { + void* buf = &_root->data[0] + _root_size; + _root_size += size; + return buf; + } + else + { + // make sure we have at least 1/4th of the page free after allocation to satisfy subsequent allocation requests + size_t block_capacity_base = sizeof(_root->data); + size_t block_capacity_req = size + block_capacity_base / 4; + size_t block_capacity = (block_capacity_base > block_capacity_req) ? block_capacity_base : block_capacity_req; + + size_t block_size = block_capacity + offsetof(xpath_memory_block, data); + + xpath_memory_block* block = static_cast(xml_memory::allocate(block_size)); + if (!block) + { + if (_error) *_error = true; + return 0; + } + + block->next = _root; + block->capacity = block_capacity; + + _root = block; + _root_size = size; + + return block->data; + } + } + + void* reallocate(void* ptr, size_t old_size, size_t new_size) + { + // round size up to block alignment boundary + old_size = (old_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + new_size = (new_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + + // we can only reallocate the last object + assert(ptr == 0 || static_cast(ptr) + old_size == &_root->data[0] + _root_size); + + // try to reallocate the object inplace + if (ptr && _root_size - old_size + new_size <= _root->capacity) + { + _root_size = _root_size - old_size + new_size; + return ptr; + } + + // allocate a new block + void* result = allocate(new_size); + if (!result) return 0; + + // we have a new block + if (ptr) + { + // copy old data (we only support growing) + assert(new_size >= old_size); + memcpy(result, ptr, old_size); + + // free the previous page if it had no other objects + assert(_root->data == result); + assert(_root->next); + + if (_root->next->data == ptr) + { + // deallocate the whole page, unless it was the first one + xpath_memory_block* next = _root->next->next; + + if (next) + { + xml_memory::deallocate(_root->next); + _root->next = next; + } + } + } + + return result; + } + + void revert(const xpath_allocator& state) + { + // free all new pages + xpath_memory_block* cur = _root; + + while (cur != state._root) + { + xpath_memory_block* next = cur->next; + + xml_memory::deallocate(cur); + + cur = next; + } + + // restore state + _root = state._root; + _root_size = state._root_size; + } + + void release() + { + xpath_memory_block* cur = _root; + assert(cur); + + while (cur->next) + { + xpath_memory_block* next = cur->next; + + xml_memory::deallocate(cur); + + cur = next; + } + } + }; + + struct xpath_allocator_capture + { + xpath_allocator_capture(xpath_allocator* alloc): _target(alloc), _state(*alloc) + { + } + + ~xpath_allocator_capture() + { + _target->revert(_state); + } + + xpath_allocator* _target; + xpath_allocator _state; + }; + + struct xpath_stack + { + xpath_allocator* result; + xpath_allocator* temp; + }; + + struct xpath_stack_data + { + xpath_memory_block blocks[2]; + xpath_allocator result; + xpath_allocator temp; + xpath_stack stack; + bool oom; + + xpath_stack_data(): result(blocks + 0, &oom), temp(blocks + 1, &oom), oom(false) + { + blocks[0].next = blocks[1].next = 0; + blocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data); + + stack.result = &result; + stack.temp = &temp; + } + + ~xpath_stack_data() + { + result.release(); + temp.release(); + } + }; +PUGI__NS_END + +// String class +PUGI__NS_BEGIN + class xpath_string + { + const char_t* _buffer; + bool _uses_heap; + size_t _length_heap; + + static char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc) + { + char_t* result = static_cast(alloc->allocate((length + 1) * sizeof(char_t))); + if (!result) return 0; + + memcpy(result, string, length * sizeof(char_t)); + result[length] = 0; + + return result; + } + + xpath_string(const char_t* buffer, bool uses_heap_, size_t length_heap): _buffer(buffer), _uses_heap(uses_heap_), _length_heap(length_heap) + { + } + + public: + static xpath_string from_const(const char_t* str) + { + return xpath_string(str, false, 0); + } + + static xpath_string from_heap_preallocated(const char_t* begin, const char_t* end) + { + assert(begin <= end && *end == 0); + + return xpath_string(begin, true, static_cast(end - begin)); + } + + static xpath_string from_heap(const char_t* begin, const char_t* end, xpath_allocator* alloc) + { + assert(begin <= end); + + if (begin == end) + return xpath_string(); + + size_t length = static_cast(end - begin); + const char_t* data = duplicate_string(begin, length, alloc); + + return data ? xpath_string(data, true, length) : xpath_string(); + } + + xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false), _length_heap(0) + { + } + + void append(const xpath_string& o, xpath_allocator* alloc) + { + // skip empty sources + if (!*o._buffer) return; + + // fast append for constant empty target and constant source + if (!*_buffer && !_uses_heap && !o._uses_heap) + { + _buffer = o._buffer; + } + else + { + // need to make heap copy + size_t target_length = length(); + size_t source_length = o.length(); + size_t result_length = target_length + source_length; + + // allocate new buffer + char_t* result = static_cast(alloc->reallocate(_uses_heap ? const_cast(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t))); + if (!result) return; + + // append first string to the new buffer in case there was no reallocation + if (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t)); + + // append second string to the new buffer + memcpy(result + target_length, o._buffer, source_length * sizeof(char_t)); + result[result_length] = 0; + + // finalize + _buffer = result; + _uses_heap = true; + _length_heap = result_length; + } + } + + const char_t* c_str() const + { + return _buffer; + } + + size_t length() const + { + return _uses_heap ? _length_heap : strlength(_buffer); + } + + char_t* data(xpath_allocator* alloc) + { + // make private heap copy + if (!_uses_heap) + { + size_t length_ = strlength(_buffer); + const char_t* data_ = duplicate_string(_buffer, length_, alloc); + + if (!data_) return 0; + + _buffer = data_; + _uses_heap = true; + _length_heap = length_; + } + + return const_cast(_buffer); + } + + bool empty() const + { + return *_buffer == 0; + } + + bool operator==(const xpath_string& o) const + { + return strequal(_buffer, o._buffer); + } + + bool operator!=(const xpath_string& o) const + { + return !strequal(_buffer, o._buffer); + } + + bool uses_heap() const + { + return _uses_heap; + } + }; +PUGI__NS_END + +PUGI__NS_BEGIN + PUGI__FN bool starts_with(const char_t* string, const char_t* pattern) + { + while (*pattern && *string == *pattern) + { + string++; + pattern++; + } + + return *pattern == 0; + } + + PUGI__FN const char_t* find_char(const char_t* s, char_t c) + { + #ifdef PUGIXML_WCHAR_MODE + return wcschr(s, c); + #else + return strchr(s, c); + #endif + } + + PUGI__FN const char_t* find_substring(const char_t* s, const char_t* p) + { + #ifdef PUGIXML_WCHAR_MODE + // MSVC6 wcsstr bug workaround (if s is empty it always returns 0) + return (*p == 0) ? s : wcsstr(s, p); + #else + return strstr(s, p); + #endif + } + + // Converts symbol to lower case, if it is an ASCII one + PUGI__FN char_t tolower_ascii(char_t ch) + { + return static_cast(ch - 'A') < 26 ? static_cast(ch | ' ') : ch; + } + + PUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc) + { + if (na.attribute()) + return xpath_string::from_const(na.attribute().value()); + else + { + xml_node n = na.node(); + + switch (n.type()) + { + case node_pcdata: + case node_cdata: + case node_comment: + case node_pi: + return xpath_string::from_const(n.value()); + + case node_document: + case node_element: + { + xpath_string result; + + // element nodes can have value if parse_embed_pcdata was used + if (n.value()[0]) + result.append(xpath_string::from_const(n.value()), alloc); + + xml_node cur = n.first_child(); + + while (cur && cur != n) + { + if (cur.type() == node_pcdata || cur.type() == node_cdata) + result.append(xpath_string::from_const(cur.value()), alloc); + + if (cur.first_child()) + cur = cur.first_child(); + else if (cur.next_sibling()) + cur = cur.next_sibling(); + else + { + while (!cur.next_sibling() && cur != n) + cur = cur.parent(); + + if (cur != n) cur = cur.next_sibling(); + } + } + + return result; + } + + default: + return xpath_string(); + } + } + } + + PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn) + { + assert(ln->parent == rn->parent); + + // there is no common ancestor (the shared parent is null), nodes are from different documents + if (!ln->parent) return ln < rn; + + // determine sibling order + xml_node_struct* ls = ln; + xml_node_struct* rs = rn; + + while (ls && rs) + { + if (ls == rn) return true; + if (rs == ln) return false; + + ls = ls->next_sibling; + rs = rs->next_sibling; + } + + // if rn sibling chain ended ln must be before rn + return !rs; + } + + PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn) + { + // find common ancestor at the same depth, if any + xml_node_struct* lp = ln; + xml_node_struct* rp = rn; + + while (lp && rp && lp->parent != rp->parent) + { + lp = lp->parent; + rp = rp->parent; + } + + // parents are the same! + if (lp && rp) return node_is_before_sibling(lp, rp); + + // nodes are at different depths, need to normalize heights + bool left_higher = !lp; + + while (lp) + { + lp = lp->parent; + ln = ln->parent; + } + + while (rp) + { + rp = rp->parent; + rn = rn->parent; + } + + // one node is the ancestor of the other + if (ln == rn) return left_higher; + + // find common ancestor... again + while (ln->parent != rn->parent) + { + ln = ln->parent; + rn = rn->parent; + } + + return node_is_before_sibling(ln, rn); + } + + PUGI__FN bool node_is_ancestor(xml_node_struct* parent, xml_node_struct* node) + { + while (node && node != parent) node = node->parent; + + return parent && node == parent; + } + + PUGI__FN const void* document_buffer_order(const xpath_node& xnode) + { + xml_node_struct* node = xnode.node().internal_object(); + + if (node) + { + if ((get_document(node).header & xml_memory_page_contents_shared_mask) == 0) + { + if (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name; + if (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value; + } + + return 0; + } + + xml_attribute_struct* attr = xnode.attribute().internal_object(); + + if (attr) + { + if ((get_document(attr).header & xml_memory_page_contents_shared_mask) == 0) + { + if ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name; + if ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value; + } + + return 0; + } + + return 0; + } + + struct document_order_comparator + { + bool operator()(const xpath_node& lhs, const xpath_node& rhs) const + { + // optimized document order based check + const void* lo = document_buffer_order(lhs); + const void* ro = document_buffer_order(rhs); + + if (lo && ro) return lo < ro; + + // slow comparison + xml_node ln = lhs.node(), rn = rhs.node(); + + // compare attributes + if (lhs.attribute() && rhs.attribute()) + { + // shared parent + if (lhs.parent() == rhs.parent()) + { + // determine sibling order + for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute()) + if (a == rhs.attribute()) + return true; + + return false; + } + + // compare attribute parents + ln = lhs.parent(); + rn = rhs.parent(); + } + else if (lhs.attribute()) + { + // attributes go after the parent element + if (lhs.parent() == rhs.node()) return false; + + ln = lhs.parent(); + } + else if (rhs.attribute()) + { + // attributes go after the parent element + if (rhs.parent() == lhs.node()) return true; + + rn = rhs.parent(); + } + + if (ln == rn) return false; + + if (!ln || !rn) return ln < rn; + + return node_is_before(ln.internal_object(), rn.internal_object()); + } + }; + + PUGI__FN double gen_nan() + { + #if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24)) + PUGI__STATIC_ASSERT(sizeof(float) == sizeof(uint32_t)); + typedef uint32_t UI; // BCC5 workaround + union { float f; UI i; } u; + u.i = 0x7fc00000; + return double(u.f); + #else + // fallback + const volatile double zero = 0.0; + return zero / zero; + #endif + } + + PUGI__FN bool is_nan(double value) + { + #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) + return !!_isnan(value); + #elif defined(fpclassify) && defined(FP_NAN) + return fpclassify(value) == FP_NAN; + #else + // fallback + const volatile double v = value; + return v != v; + #endif + } + + PUGI__FN const char_t* convert_number_to_string_special(double value) + { + #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) + if (_finite(value)) return (value == 0) ? PUGIXML_TEXT("0") : 0; + if (_isnan(value)) return PUGIXML_TEXT("NaN"); + return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + #elif defined(fpclassify) && defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) + switch (fpclassify(value)) + { + case FP_NAN: + return PUGIXML_TEXT("NaN"); + + case FP_INFINITE: + return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + + case FP_ZERO: + return PUGIXML_TEXT("0"); + + default: + return 0; + } + #else + // fallback + const volatile double v = value; + + if (v == 0) return PUGIXML_TEXT("0"); + if (v != v) return PUGIXML_TEXT("NaN"); + if (v * 2 == v) return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + return 0; + #endif + } + + PUGI__FN bool convert_number_to_boolean(double value) + { + return (value != 0 && !is_nan(value)); + } + + PUGI__FN void truncate_zeros(char* begin, char* end) + { + while (begin != end && end[-1] == '0') end--; + + *end = 0; + } + + // gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent +#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) + PUGI__FN void convert_number_to_mantissa_exponent(double value, char (&buffer)[32], char** out_mantissa, int* out_exponent) + { + // get base values + int sign, exponent; + _ecvt_s(buffer, sizeof(buffer), value, DBL_DIG + 1, &exponent, &sign); + + // truncate redundant zeros + truncate_zeros(buffer, buffer + strlen(buffer)); + + // fill results + *out_mantissa = buffer; + *out_exponent = exponent; + } +#else + PUGI__FN void convert_number_to_mantissa_exponent(double value, char (&buffer)[32], char** out_mantissa, int* out_exponent) + { + // get a scientific notation value with IEEE DBL_DIG decimals + PUGI__SNPRINTF(buffer, "%.*e", DBL_DIG, value); + + // get the exponent (possibly negative) + char* exponent_string = strchr(buffer, 'e'); + assert(exponent_string); + + int exponent = atoi(exponent_string + 1); + + // extract mantissa string: skip sign + char* mantissa = buffer[0] == '-' ? buffer + 1 : buffer; + assert(mantissa[0] != '0' && mantissa[1] == '.'); + + // divide mantissa by 10 to eliminate integer part + mantissa[1] = mantissa[0]; + mantissa++; + exponent++; + + // remove extra mantissa digits and zero-terminate mantissa + truncate_zeros(mantissa, exponent_string); + + // fill results + *out_mantissa = mantissa; + *out_exponent = exponent; + } +#endif + + PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc) + { + // try special number conversion + const char_t* special = convert_number_to_string_special(value); + if (special) return xpath_string::from_const(special); + + // get mantissa + exponent form + char mantissa_buffer[32]; + + char* mantissa; + int exponent; + convert_number_to_mantissa_exponent(value, mantissa_buffer, &mantissa, &exponent); + + // allocate a buffer of suitable length for the number + size_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4; + char_t* result = static_cast(alloc->allocate(sizeof(char_t) * result_size)); + if (!result) return xpath_string(); + + // make the number! + char_t* s = result; + + // sign + if (value < 0) *s++ = '-'; + + // integer part + if (exponent <= 0) + { + *s++ = '0'; + } + else + { + while (exponent > 0) + { + assert(*mantissa == 0 || static_cast(*mantissa - '0') <= 9); + *s++ = *mantissa ? *mantissa++ : '0'; + exponent--; + } + } + + // fractional part + if (*mantissa) + { + // decimal point + *s++ = '.'; + + // extra zeroes from negative exponent + while (exponent < 0) + { + *s++ = '0'; + exponent++; + } + + // extra mantissa digits + while (*mantissa) + { + assert(static_cast(*mantissa - '0') <= 9); + *s++ = *mantissa++; + } + } + + // zero-terminate + assert(s < result + result_size); + *s = 0; + + return xpath_string::from_heap_preallocated(result, s); + } + + PUGI__FN bool check_string_to_number_format(const char_t* string) + { + // parse leading whitespace + while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string; + + // parse sign + if (*string == '-') ++string; + + if (!*string) return false; + + // if there is no integer part, there should be a decimal part with at least one digit + if (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false; + + // parse integer part + while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string; + + // parse decimal part + if (*string == '.') + { + ++string; + + while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string; + } + + // parse trailing whitespace + while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string; + + return *string == 0; + } + + PUGI__FN double convert_string_to_number(const char_t* string) + { + // check string format + if (!check_string_to_number_format(string)) return gen_nan(); + + // parse string + #ifdef PUGIXML_WCHAR_MODE + return wcstod(string, 0); + #else + return strtod(string, 0); + #endif + } + + PUGI__FN bool convert_string_to_number_scratch(char_t (&buffer)[32], const char_t* begin, const char_t* end, double* out_result) + { + size_t length = static_cast(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!scratch) return false; + } + + // copy string to zero-terminated buffer and perform conversion + memcpy(scratch, begin, length * sizeof(char_t)); + scratch[length] = 0; + + *out_result = convert_string_to_number(scratch); + + // free dummy buffer + if (scratch != buffer) xml_memory::deallocate(scratch); + + return true; + } + + PUGI__FN double round_nearest(double value) + { + return floor(value + 0.5); + } + + PUGI__FN double round_nearest_nzero(double value) + { + // same as round_nearest, but returns -0 for [-0.5, -0] + // ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0) + return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5); + } + + PUGI__FN const char_t* qualified_name(const xpath_node& node) + { + return node.attribute() ? node.attribute().name() : node.node().name(); + } + + PUGI__FN const char_t* local_name(const xpath_node& node) + { + const char_t* name = qualified_name(node); + const char_t* p = find_char(name, ':'); + + return p ? p + 1 : name; + } + + struct namespace_uri_predicate + { + const char_t* prefix; + size_t prefix_length; + + namespace_uri_predicate(const char_t* name) + { + const char_t* pos = find_char(name, ':'); + + prefix = pos ? name : 0; + prefix_length = pos ? static_cast(pos - name) : 0; + } + + bool operator()(xml_attribute a) const + { + const char_t* name = a.name(); + + if (!starts_with(name, PUGIXML_TEXT("xmlns"))) return false; + + return prefix ? name[5] == ':' && strequalrange(name + 6, prefix, prefix_length) : name[5] == 0; + } + }; + + PUGI__FN const char_t* namespace_uri(xml_node node) + { + namespace_uri_predicate pred = node.name(); + + xml_node p = node; + + while (p) + { + xml_attribute a = p.find_attribute(pred); + + if (a) return a.value(); + + p = p.parent(); + } + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent) + { + namespace_uri_predicate pred = attr.name(); + + // Default namespace does not apply to attributes + if (!pred.prefix) return PUGIXML_TEXT(""); + + xml_node p = parent; + + while (p) + { + xml_attribute a = p.find_attribute(pred); + + if (a) return a.value(); + + p = p.parent(); + } + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* namespace_uri(const xpath_node& node) + { + return node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node()); + } + + PUGI__FN char_t* normalize_space(char_t* buffer) + { + char_t* write = buffer; + + for (char_t* it = buffer; *it; ) + { + char_t ch = *it++; + + if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + // replace whitespace sequence with single space + while (PUGI__IS_CHARTYPE(*it, ct_space)) it++; + + // avoid leading spaces + if (write != buffer) *write++ = ' '; + } + else *write++ = ch; + } + + // remove trailing space + if (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--; + + // zero-terminate + *write = 0; + + return write; + } + + PUGI__FN char_t* translate(char_t* buffer, const char_t* from, const char_t* to, size_t to_length) + { + char_t* write = buffer; + + while (*buffer) + { + PUGI__DMC_VOLATILE char_t ch = *buffer++; + + const char_t* pos = find_char(from, ch); + + if (!pos) + *write++ = ch; // do not process + else if (static_cast(pos - from) < to_length) + *write++ = to[pos - from]; // replace + } + + // zero-terminate + *write = 0; + + return write; + } + + PUGI__FN unsigned char* translate_table_generate(xpath_allocator* alloc, const char_t* from, const char_t* to) + { + unsigned char table[128] = {0}; + + while (*from) + { + unsigned int fc = static_cast(*from); + unsigned int tc = static_cast(*to); + + if (fc >= 128 || tc >= 128) + return 0; + + // code=128 means "skip character" + if (!table[fc]) + table[fc] = static_cast(tc ? tc : 128); + + from++; + if (tc) to++; + } + + for (int i = 0; i < 128; ++i) + if (!table[i]) + table[i] = static_cast(i); + + void* result = alloc->allocate(sizeof(table)); + if (!result) return 0; + + memcpy(result, table, sizeof(table)); + + return static_cast(result); + } + + PUGI__FN char_t* translate_table(char_t* buffer, const unsigned char* table) + { + char_t* write = buffer; + + while (*buffer) + { + char_t ch = *buffer++; + unsigned int index = static_cast(ch); + + if (index < 128) + { + unsigned char code = table[index]; + + // code=128 means "skip character" (table size is 128 so 128 can be a special value) + // this code skips these characters without extra branches + *write = static_cast(code); + write += 1 - (code >> 7); + } + else + { + *write++ = ch; + } + } + + // zero-terminate + *write = 0; + + return write; + } + + inline bool is_xpath_attribute(const char_t* name) + { + return !(starts_with(name, PUGIXML_TEXT("xmlns")) && (name[5] == 0 || name[5] == ':')); + } + + struct xpath_variable_boolean: xpath_variable + { + xpath_variable_boolean(): xpath_variable(xpath_type_boolean), value(false) + { + } + + bool value; + char_t name[1]; + }; + + struct xpath_variable_number: xpath_variable + { + xpath_variable_number(): xpath_variable(xpath_type_number), value(0) + { + } + + double value; + char_t name[1]; + }; + + struct xpath_variable_string: xpath_variable + { + xpath_variable_string(): xpath_variable(xpath_type_string), value(0) + { + } + + ~xpath_variable_string() + { + if (value) xml_memory::deallocate(value); + } + + char_t* value; + char_t name[1]; + }; + + struct xpath_variable_node_set: xpath_variable + { + xpath_variable_node_set(): xpath_variable(xpath_type_node_set) + { + } + + xpath_node_set value; + char_t name[1]; + }; + + static const xpath_node_set dummy_node_set; + + PUGI__FN PUGI__UNSIGNED_OVERFLOW unsigned int hash_string(const char_t* str) + { + // Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time) + unsigned int result = 0; + + while (*str) + { + result += static_cast(*str++); + result += result << 10; + result ^= result >> 6; + } + + result += result << 3; + result ^= result >> 11; + result += result << 15; + + return result; + } + + template PUGI__FN T* new_xpath_variable(const char_t* name) + { + size_t length = strlength(name); + if (length == 0) return 0; // empty variable names are invalid + + // $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters + void* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t)); + if (!memory) return 0; + + T* result = new (memory) T(); + + memcpy(result->name, name, (length + 1) * sizeof(char_t)); + + return result; + } + + PUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name) + { + switch (type) + { + case xpath_type_node_set: + return new_xpath_variable(name); + + case xpath_type_number: + return new_xpath_variable(name); + + case xpath_type_string: + return new_xpath_variable(name); + + case xpath_type_boolean: + return new_xpath_variable(name); + + default: + return 0; + } + } + + template PUGI__FN void delete_xpath_variable(T* var) + { + var->~T(); + xml_memory::deallocate(var); + } + + PUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var) + { + switch (type) + { + case xpath_type_node_set: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_number: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_string: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_boolean: + delete_xpath_variable(static_cast(var)); + break; + + default: + assert(false && "Invalid variable type"); // unreachable + } + } + + PUGI__FN bool copy_xpath_variable(xpath_variable* lhs, const xpath_variable* rhs) + { + switch (rhs->type()) + { + case xpath_type_node_set: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_number: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_string: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_boolean: + return lhs->set(static_cast(rhs)->value); + + default: + assert(false && "Invalid variable type"); // unreachable + return false; + } + } + + PUGI__FN bool get_variable_scratch(char_t (&buffer)[32], xpath_variable_set* set, const char_t* begin, const char_t* end, xpath_variable** out_result) + { + size_t length = static_cast(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!scratch) return false; + } + + // copy string to zero-terminated buffer and perform lookup + memcpy(scratch, begin, length * sizeof(char_t)); + scratch[length] = 0; + + *out_result = set->get(scratch); + + // free dummy buffer + if (scratch != buffer) xml_memory::deallocate(scratch); + + return true; + } +PUGI__NS_END + +// Internal node set class +PUGI__NS_BEGIN + PUGI__FN xpath_node_set::type_t xpath_get_order(const xpath_node* begin, const xpath_node* end) + { + if (end - begin < 2) + return xpath_node_set::type_sorted; + + document_order_comparator cmp; + + bool first = cmp(begin[0], begin[1]); + + for (const xpath_node* it = begin + 1; it + 1 < end; ++it) + if (cmp(it[0], it[1]) != first) + return xpath_node_set::type_unsorted; + + return first ? xpath_node_set::type_sorted : xpath_node_set::type_sorted_reverse; + } + + PUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev) + { + xpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted; + + if (type == xpath_node_set::type_unsorted) + { + xpath_node_set::type_t sorted = xpath_get_order(begin, end); + + if (sorted == xpath_node_set::type_unsorted) + { + sort(begin, end, document_order_comparator()); + + type = xpath_node_set::type_sorted; + } + else + type = sorted; + } + + if (type != order) reverse(begin, end); + + return order; + } + + PUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type) + { + if (begin == end) return xpath_node(); + + switch (type) + { + case xpath_node_set::type_sorted: + return *begin; + + case xpath_node_set::type_sorted_reverse: + return *(end - 1); + + case xpath_node_set::type_unsorted: + return *min_element(begin, end, document_order_comparator()); + + default: + assert(false && "Invalid node set type"); // unreachable + return xpath_node(); + } + } + + class xpath_node_set_raw + { + xpath_node_set::type_t _type; + + xpath_node* _begin; + xpath_node* _end; + xpath_node* _eos; + + public: + xpath_node_set_raw(): _type(xpath_node_set::type_unsorted), _begin(0), _end(0), _eos(0) + { + } + + xpath_node* begin() const + { + return _begin; + } + + xpath_node* end() const + { + return _end; + } + + bool empty() const + { + return _begin == _end; + } + + size_t size() const + { + return static_cast(_end - _begin); + } + + xpath_node first() const + { + return xpath_first(_begin, _end, _type); + } + + void push_back_grow(const xpath_node& node, xpath_allocator* alloc); + + void push_back(const xpath_node& node, xpath_allocator* alloc) + { + if (_end != _eos) + *_end++ = node; + else + push_back_grow(node, alloc); + } + + void append(const xpath_node* begin_, const xpath_node* end_, xpath_allocator* alloc) + { + if (begin_ == end_) return; + + size_t size_ = static_cast(_end - _begin); + size_t capacity = static_cast(_eos - _begin); + size_t count = static_cast(end_ - begin_); + + if (size_ + count > capacity) + { + // reallocate the old array or allocate a new one + xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node))); + if (!data) return; + + // finalize + _begin = data; + _end = data + size_; + _eos = data + size_ + count; + } + + memcpy(_end, begin_, count * sizeof(xpath_node)); + _end += count; + } + + void sort_do() + { + _type = xpath_sort(_begin, _end, _type, false); + } + + void truncate(xpath_node* pos) + { + assert(_begin <= pos && pos <= _end); + + _end = pos; + } + + void remove_duplicates(xpath_allocator* alloc) + { + if (_type == xpath_node_set::type_unsorted && _end - _begin > 2) + { + xpath_allocator_capture cr(alloc); + + size_t size_ = static_cast(_end - _begin); + + size_t hash_size = 1; + while (hash_size < size_ + size_ / 2) hash_size *= 2; + + const void** hash_data = static_cast(alloc->allocate(hash_size * sizeof(void**))); + if (!hash_data) return; + + memset(hash_data, 0, hash_size * sizeof(const void**)); + + xpath_node* write = _begin; + + for (xpath_node* it = _begin; it != _end; ++it) + { + const void* attr = it->attribute().internal_object(); + const void* node = it->node().internal_object(); + const void* key = attr ? attr : node; + + if (key && hash_insert(hash_data, hash_size, key)) + { + *write++ = *it; + } + } + + _end = write; + } + else + { + _end = unique(_begin, _end); + } + } + + xpath_node_set::type_t type() const + { + return _type; + } + + void set_type(xpath_node_set::type_t value) + { + _type = value; + } + }; + + PUGI__FN_NO_INLINE void xpath_node_set_raw::push_back_grow(const xpath_node& node, xpath_allocator* alloc) + { + size_t capacity = static_cast(_eos - _begin); + + // get new capacity (1.5x rule) + size_t new_capacity = capacity + capacity / 2 + 1; + + // reallocate the old array or allocate a new one + xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node))); + if (!data) return; + + // finalize + _begin = data; + _end = data + capacity; + _eos = data + new_capacity; + + // push + *_end++ = node; + } +PUGI__NS_END + +PUGI__NS_BEGIN + struct xpath_context + { + xpath_node n; + size_t position, size; + + xpath_context(const xpath_node& n_, size_t position_, size_t size_): n(n_), position(position_), size(size_) + { + } + }; + + enum lexeme_t + { + lex_none = 0, + lex_equal, + lex_not_equal, + lex_less, + lex_greater, + lex_less_or_equal, + lex_greater_or_equal, + lex_plus, + lex_minus, + lex_multiply, + lex_union, + lex_var_ref, + lex_open_brace, + lex_close_brace, + lex_quoted_string, + lex_number, + lex_slash, + lex_double_slash, + lex_open_square_brace, + lex_close_square_brace, + lex_string, + lex_comma, + lex_axis_attribute, + lex_dot, + lex_double_dot, + lex_double_colon, + lex_eof + }; + + struct xpath_lexer_string + { + const char_t* begin; + const char_t* end; + + xpath_lexer_string(): begin(0), end(0) + { + } + + bool operator==(const char_t* other) const + { + size_t length = static_cast(end - begin); + + return strequalrange(other, begin, length); + } + }; + + class xpath_lexer + { + const char_t* _cur; + const char_t* _cur_lexeme_pos; + xpath_lexer_string _cur_lexeme_contents; + + lexeme_t _cur_lexeme; + + public: + explicit xpath_lexer(const char_t* query): _cur(query) + { + next(); + } + + const char_t* state() const + { + return _cur; + } + + void next() + { + const char_t* cur = _cur; + + while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur; + + // save lexeme position for error reporting + _cur_lexeme_pos = cur; + + switch (*cur) + { + case 0: + _cur_lexeme = lex_eof; + break; + + case '>': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_greater_or_equal; + } + else + { + cur += 1; + _cur_lexeme = lex_greater; + } + break; + + case '<': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_less_or_equal; + } + else + { + cur += 1; + _cur_lexeme = lex_less; + } + break; + + case '!': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_not_equal; + } + else + { + _cur_lexeme = lex_none; + } + break; + + case '=': + cur += 1; + _cur_lexeme = lex_equal; + + break; + + case '+': + cur += 1; + _cur_lexeme = lex_plus; + + break; + + case '-': + cur += 1; + _cur_lexeme = lex_minus; + + break; + + case '*': + cur += 1; + _cur_lexeme = lex_multiply; + + break; + + case '|': + cur += 1; + _cur_lexeme = lex_union; + + break; + + case '$': + cur += 1; + + if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname + { + cur++; // : + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_var_ref; + } + else + { + _cur_lexeme = lex_none; + } + + break; + + case '(': + cur += 1; + _cur_lexeme = lex_open_brace; + + break; + + case ')': + cur += 1; + _cur_lexeme = lex_close_brace; + + break; + + case '[': + cur += 1; + _cur_lexeme = lex_open_square_brace; + + break; + + case ']': + cur += 1; + _cur_lexeme = lex_close_square_brace; + + break; + + case ',': + cur += 1; + _cur_lexeme = lex_comma; + + break; + + case '/': + if (*(cur+1) == '/') + { + cur += 2; + _cur_lexeme = lex_double_slash; + } + else + { + cur += 1; + _cur_lexeme = lex_slash; + } + break; + + case '.': + if (*(cur+1) == '.') + { + cur += 2; + _cur_lexeme = lex_double_dot; + } + else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit)) + { + _cur_lexeme_contents.begin = cur; // . + + ++cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_number; + } + else + { + cur += 1; + _cur_lexeme = lex_dot; + } + break; + + case '@': + cur += 1; + _cur_lexeme = lex_axis_attribute; + + break; + + case '"': + case '\'': + { + char_t terminator = *cur; + + ++cur; + + _cur_lexeme_contents.begin = cur; + while (*cur && *cur != terminator) cur++; + _cur_lexeme_contents.end = cur; + + if (!*cur) + _cur_lexeme = lex_none; + else + { + cur += 1; + _cur_lexeme = lex_quoted_string; + } + + break; + } + + case ':': + if (*(cur+1) == ':') + { + cur += 2; + _cur_lexeme = lex_double_colon; + } + else + { + _cur_lexeme = lex_none; + } + break; + + default: + if (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + + if (*cur == '.') + { + cur++; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_number; + } + else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':') + { + if (cur[1] == '*') // namespace test ncname:* + { + cur += 2; // :* + } + else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname + { + cur++; // : + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_string; + } + else + { + _cur_lexeme = lex_none; + } + } + + _cur = cur; + } + + lexeme_t current() const + { + return _cur_lexeme; + } + + const char_t* current_pos() const + { + return _cur_lexeme_pos; + } + + const xpath_lexer_string& contents() const + { + assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); + + return _cur_lexeme_contents; + } + }; + + enum ast_type_t + { + ast_unknown, + ast_op_or, // left or right + ast_op_and, // left and right + ast_op_equal, // left = right + ast_op_not_equal, // left != right + ast_op_less, // left < right + ast_op_greater, // left > right + ast_op_less_or_equal, // left <= right + ast_op_greater_or_equal, // left >= right + ast_op_add, // left + right + ast_op_subtract, // left - right + ast_op_multiply, // left * right + ast_op_divide, // left / right + ast_op_mod, // left % right + ast_op_negate, // left - right + ast_op_union, // left | right + ast_predicate, // apply predicate to set; next points to next predicate + ast_filter, // select * from left where right + ast_string_constant, // string constant + ast_number_constant, // number constant + ast_variable, // variable + ast_func_last, // last() + ast_func_position, // position() + ast_func_count, // count(left) + ast_func_id, // id(left) + ast_func_local_name_0, // local-name() + ast_func_local_name_1, // local-name(left) + ast_func_namespace_uri_0, // namespace-uri() + ast_func_namespace_uri_1, // namespace-uri(left) + ast_func_name_0, // name() + ast_func_name_1, // name(left) + ast_func_string_0, // string() + ast_func_string_1, // string(left) + ast_func_concat, // concat(left, right, siblings) + ast_func_starts_with, // starts_with(left, right) + ast_func_contains, // contains(left, right) + ast_func_substring_before, // substring-before(left, right) + ast_func_substring_after, // substring-after(left, right) + ast_func_substring_2, // substring(left, right) + ast_func_substring_3, // substring(left, right, third) + ast_func_string_length_0, // string-length() + ast_func_string_length_1, // string-length(left) + ast_func_normalize_space_0, // normalize-space() + ast_func_normalize_space_1, // normalize-space(left) + ast_func_translate, // translate(left, right, third) + ast_func_boolean, // boolean(left) + ast_func_not, // not(left) + ast_func_true, // true() + ast_func_false, // false() + ast_func_lang, // lang(left) + ast_func_number_0, // number() + ast_func_number_1, // number(left) + ast_func_sum, // sum(left) + ast_func_floor, // floor(left) + ast_func_ceiling, // ceiling(left) + ast_func_round, // round(left) + ast_step, // process set left with step + ast_step_root, // select root node + + ast_opt_translate_table, // translate(left, right, third) where right/third are constants + ast_opt_compare_attribute // @name = 'string' + }; + + enum axis_t + { + axis_ancestor, + axis_ancestor_or_self, + axis_attribute, + axis_child, + axis_descendant, + axis_descendant_or_self, + axis_following, + axis_following_sibling, + axis_namespace, + axis_parent, + axis_preceding, + axis_preceding_sibling, + axis_self + }; + + enum nodetest_t + { + nodetest_none, + nodetest_name, + nodetest_type_node, + nodetest_type_comment, + nodetest_type_pi, + nodetest_type_text, + nodetest_pi, + nodetest_all, + nodetest_all_in_namespace + }; + + enum predicate_t + { + predicate_default, + predicate_posinv, + predicate_constant, + predicate_constant_one + }; + + enum nodeset_eval_t + { + nodeset_eval_all, + nodeset_eval_any, + nodeset_eval_first + }; + + template struct axis_to_type + { + static const axis_t axis; + }; + + template const axis_t axis_to_type::axis = N; + + class xpath_ast_node + { + private: + // node type + char _type; + char _rettype; + + // for ast_step + char _axis; + + // for ast_step/ast_predicate/ast_filter + char _test; + + // tree node structure + xpath_ast_node* _left; + xpath_ast_node* _right; + xpath_ast_node* _next; + + union + { + // value for ast_string_constant + const char_t* string; + // value for ast_number_constant + double number; + // variable for ast_variable + xpath_variable* variable; + // node test for ast_step (node name/namespace/node type/pi target) + const char_t* nodetest; + // table for ast_opt_translate_table + const unsigned char* table; + } _data; + + xpath_ast_node(const xpath_ast_node&); + xpath_ast_node& operator=(const xpath_ast_node&); + + template static bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp) + { + xpath_value_type lt = lhs->rettype(), rt = rhs->rettype(); + + if (lt != xpath_type_node_set && rt != xpath_type_node_set) + { + if (lt == xpath_type_boolean || rt == xpath_type_boolean) + return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack)); + else if (lt == xpath_type_number || rt == xpath_type_number) + return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack)); + else if (lt == xpath_type_string || rt == xpath_type_string) + { + xpath_allocator_capture cr(stack.result); + + xpath_string ls = lhs->eval_string(c, stack); + xpath_string rs = rhs->eval_string(c, stack); + + return comp(ls, rs); + } + } + else if (lt == xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(string_value(*li, stack.result), string_value(*ri, stack.result))) + return true; + } + + return false; + } + else + { + if (lt == xpath_type_node_set) + { + swap(lhs, rhs); + swap(lt, rt); + } + + if (lt == xpath_type_boolean) + return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack)); + else if (lt == xpath_type_number) + { + xpath_allocator_capture cr(stack.result); + + double l = lhs->eval_number(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + + return false; + } + else if (lt == xpath_type_string) + { + xpath_allocator_capture cr(stack.result); + + xpath_string l = lhs->eval_string(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, string_value(*ri, stack.result))) + return true; + } + + return false; + } + } + + assert(false && "Wrong types"); // unreachable + return false; + } + + static bool eval_once(xpath_node_set::type_t type, nodeset_eval_t eval) + { + return type == xpath_node_set::type_sorted ? eval != nodeset_eval_all : eval == nodeset_eval_any; + } + + template static bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp) + { + xpath_value_type lt = lhs->rettype(), rt = rhs->rettype(); + + if (lt != xpath_type_node_set && rt != xpath_type_node_set) + return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack)); + else if (lt == xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + { + xpath_allocator_capture cri(stack.result); + + double l = convert_string_to_number(string_value(*li, stack.result).c_str()); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture crii(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + } + + return false; + } + else if (lt != xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + double l = lhs->eval_number(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + + return false; + } + else if (lt == xpath_type_node_set && rt != xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + double r = rhs->eval_number(c, stack); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + { + xpath_allocator_capture cri(stack.result); + + if (comp(convert_string_to_number(string_value(*li, stack.result).c_str()), r)) + return true; + } + + return false; + } + else + { + assert(false && "Wrong types"); // unreachable + return false; + } + } + + static void apply_predicate_boolean(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once) + { + assert(ns.size() >= first); + assert(expr->rettype() != xpath_type_number); + + size_t i = 1; + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + // remove_if... or well, sort of + for (xpath_node* it = last; it != ns.end(); ++it, ++i) + { + xpath_context c(*it, i, size); + + if (expr->eval_boolean(c, stack)) + { + *last++ = *it; + + if (once) break; + } + } + + ns.truncate(last); + } + + static void apply_predicate_number(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once) + { + assert(ns.size() >= first); + assert(expr->rettype() == xpath_type_number); + + size_t i = 1; + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + // remove_if... or well, sort of + for (xpath_node* it = last; it != ns.end(); ++it, ++i) + { + xpath_context c(*it, i, size); + + if (expr->eval_number(c, stack) == static_cast(i)) + { + *last++ = *it; + + if (once) break; + } + } + + ns.truncate(last); + } + + static void apply_predicate_number_const(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack) + { + assert(ns.size() >= first); + assert(expr->rettype() == xpath_type_number); + + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + xpath_context c(xpath_node(), 1, size); + + double er = expr->eval_number(c, stack); + + if (er >= 1.0 && er <= static_cast(size)) + { + size_t eri = static_cast(er); + + if (er == static_cast(eri)) + { + xpath_node r = last[eri - 1]; + + *last++ = r; + } + } + + ns.truncate(last); + } + + void apply_predicate(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, bool once) + { + if (ns.size() == first) return; + + assert(_type == ast_filter || _type == ast_predicate); + + if (_test == predicate_constant || _test == predicate_constant_one) + apply_predicate_number_const(ns, first, _right, stack); + else if (_right->rettype() == xpath_type_number) + apply_predicate_number(ns, first, _right, stack, once); + else + apply_predicate_boolean(ns, first, _right, stack, once); + } + + void apply_predicates(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, nodeset_eval_t eval) + { + if (ns.size() == first) return; + + bool last_once = eval_once(ns.type(), eval); + + for (xpath_ast_node* pred = _right; pred; pred = pred->_next) + pred->apply_predicate(ns, first, stack, !pred->_next && last_once); + } + + bool step_push(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* parent, xpath_allocator* alloc) + { + assert(a); + + const char_t* name = a->name ? a->name + 0 : PUGIXML_TEXT(""); + + switch (_test) + { + case nodetest_name: + if (strequal(name, _data.nodetest) && is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + case nodetest_type_node: + case nodetest_all: + if (is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + case nodetest_all_in_namespace: + if (starts_with(name, _data.nodetest) && is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + default: + ; + } + + return false; + } + + bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc) + { + assert(n); + + xml_node_type type = PUGI__NODETYPE(n); + + switch (_test) + { + case nodetest_name: + if (type == node_element && n->name && strequal(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_node: + ns.push_back(xml_node(n), alloc); + return true; + + case nodetest_type_comment: + if (type == node_comment) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_text: + if (type == node_pcdata || type == node_cdata) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_pi: + if (type == node_pi) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_pi: + if (type == node_pi && n->name && strequal(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_all: + if (type == node_element) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_all_in_namespace: + if (type == node_element && n->name && starts_with(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + default: + assert(false && "Unknown axis"); // unreachable + } + + return false; + } + + template void step_fill(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc, bool once, T) + { + const axis_t axis = T::axis; + + switch (axis) + { + case axis_attribute: + { + for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute) + if (step_push(ns, a, n, alloc) & once) + return; + + break; + } + + case axis_child: + { + for (xml_node_struct* c = n->first_child; c; c = c->next_sibling) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_descendant: + case axis_descendant_or_self: + { + if (axis == axis_descendant_or_self) + if (step_push(ns, n, alloc) & once) + return; + + xml_node_struct* cur = n->first_child; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (cur == n) return; + } + + cur = cur->next_sibling; + } + } + + break; + } + + case axis_following_sibling: + { + for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_preceding_sibling: + { + for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_following: + { + xml_node_struct* cur = n; + + // exit from this node so that we don't include descendants + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + } + } + + break; + } + + case axis_preceding: + { + xml_node_struct* cur = n; + + // exit from this node so that we don't include descendants + while (!cur->prev_sibling_c->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->prev_sibling_c; + + while (cur) + { + if (cur->first_child) + cur = cur->first_child->prev_sibling_c; + else + { + // leaf node, can't be ancestor + if (step_push(ns, cur, alloc) & once) + return; + + while (!cur->prev_sibling_c->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + + if (!node_is_ancestor(cur, n)) + if (step_push(ns, cur, alloc) & once) + return; + } + + cur = cur->prev_sibling_c; + } + } + + break; + } + + case axis_ancestor: + case axis_ancestor_or_self: + { + if (axis == axis_ancestor_or_self) + if (step_push(ns, n, alloc) & once) + return; + + xml_node_struct* cur = n->parent; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + cur = cur->parent; + } + + break; + } + + case axis_self: + { + step_push(ns, n, alloc); + + break; + } + + case axis_parent: + { + if (n->parent) + step_push(ns, n->parent, alloc); + + break; + } + + default: + assert(false && "Unimplemented axis"); // unreachable + } + } + + template void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v) + { + const axis_t axis = T::axis; + + switch (axis) + { + case axis_ancestor: + case axis_ancestor_or_self: + { + if (axis == axis_ancestor_or_self && _test == nodetest_type_node) // reject attributes based on principal node type test + if (step_push(ns, a, p, alloc) & once) + return; + + xml_node_struct* cur = p; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + cur = cur->parent; + } + + break; + } + + case axis_descendant_or_self: + case axis_self: + { + if (_test == nodetest_type_node) // reject attributes based on principal node type test + step_push(ns, a, p, alloc); + + break; + } + + case axis_following: + { + xml_node_struct* cur = p; + + while (cur) + { + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + } + + if (step_push(ns, cur, alloc) & once) + return; + } + + break; + } + + case axis_parent: + { + step_push(ns, p, alloc); + + break; + } + + case axis_preceding: + { + // preceding:: axis does not include attribute nodes and attribute ancestors (they are the same as parent's ancestors), so we can reuse node preceding + step_fill(ns, p, alloc, once, v); + break; + } + + default: + assert(false && "Unimplemented axis"); // unreachable + } + } + + template void step_fill(xpath_node_set_raw& ns, const xpath_node& xn, xpath_allocator* alloc, bool once, T v) + { + const axis_t axis = T::axis; + const bool axis_has_attributes = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_descendant_or_self || axis == axis_following || axis == axis_parent || axis == axis_preceding || axis == axis_self); + + if (xn.node()) + step_fill(ns, xn.node().internal_object(), alloc, once, v); + else if (axis_has_attributes && xn.attribute() && xn.parent()) + step_fill(ns, xn.attribute().internal_object(), xn.parent().internal_object(), alloc, once, v); + } + + template xpath_node_set_raw step_do(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval, T v) + { + const axis_t axis = T::axis; + const bool axis_reverse = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_preceding || axis == axis_preceding_sibling); + const xpath_node_set::type_t axis_type = axis_reverse ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted; + + bool once = + (axis == axis_attribute && _test == nodetest_name) || + (!_right && eval_once(axis_type, eval)) || + // coverity[mixed_enums] + (_right && !_right->_next && _right->_test == predicate_constant_one); + + xpath_node_set_raw ns; + ns.set_type(axis_type); + + if (_left) + { + xpath_node_set_raw s = _left->eval_node_set(c, stack, nodeset_eval_all); + + // self axis preserves the original order + if (axis == axis_self) ns.set_type(s.type()); + + for (const xpath_node* it = s.begin(); it != s.end(); ++it) + { + size_t size = ns.size(); + + // in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes + if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted); + + step_fill(ns, *it, stack.result, once, v); + if (_right) apply_predicates(ns, size, stack, eval); + } + } + else + { + step_fill(ns, c.n, stack.result, once, v); + if (_right) apply_predicates(ns, 0, stack, eval); + } + + // child, attribute and self axes always generate unique set of nodes + // for other axis, if the set stayed sorted, it stayed unique because the traversal algorithms do not visit the same node twice + if (axis != axis_child && axis != axis_attribute && axis != axis_self && ns.type() == xpath_node_set::type_unsorted) + ns.remove_duplicates(stack.temp); + + return ns; + } + + public: + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_string_constant); + _data.string = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, double value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_number_constant); + _data.number = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_variable); + _data.variable = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0) + { + } + + xpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents): + _type(static_cast(type)), _rettype(xpath_type_node_set), _axis(static_cast(axis)), _test(static_cast(test)), _left(left), _right(0), _next(0) + { + assert(type == ast_step); + _data.nodetest = contents; + } + + xpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test): + _type(static_cast(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast(test)), _left(left), _right(right), _next(0) + { + assert(type == ast_filter || type == ast_predicate); + } + + void set_next(xpath_ast_node* value) + { + _next = value; + } + + void set_right(xpath_ast_node* value) + { + _right = value; + } + + bool eval_boolean(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_op_or: + return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); + + case ast_op_and: + return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); + + case ast_op_equal: + return compare_eq(_left, _right, c, stack, equal_to()); + + case ast_op_not_equal: + return compare_eq(_left, _right, c, stack, not_equal_to()); + + case ast_op_less: + return compare_rel(_left, _right, c, stack, less()); + + case ast_op_greater: + return compare_rel(_right, _left, c, stack, less()); + + case ast_op_less_or_equal: + return compare_rel(_left, _right, c, stack, less_equal()); + + case ast_op_greater_or_equal: + return compare_rel(_right, _left, c, stack, less_equal()); + + case ast_func_starts_with: + { + xpath_allocator_capture cr(stack.result); + + xpath_string lr = _left->eval_string(c, stack); + xpath_string rr = _right->eval_string(c, stack); + + return starts_with(lr.c_str(), rr.c_str()); + } + + case ast_func_contains: + { + xpath_allocator_capture cr(stack.result); + + xpath_string lr = _left->eval_string(c, stack); + xpath_string rr = _right->eval_string(c, stack); + + return find_substring(lr.c_str(), rr.c_str()) != 0; + } + + case ast_func_boolean: + return _left->eval_boolean(c, stack); + + case ast_func_not: + return !_left->eval_boolean(c, stack); + + case ast_func_true: + return true; + + case ast_func_false: + return false; + + case ast_func_lang: + { + if (c.n.attribute()) return false; + + xpath_allocator_capture cr(stack.result); + + xpath_string lang = _left->eval_string(c, stack); + + for (xml_node n = c.n.node(); n; n = n.parent()) + { + xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang")); + + if (a) + { + const char_t* value = a.value(); + + // strnicmp / strncasecmp is not portable + for (const char_t* lit = lang.c_str(); *lit; ++lit) + { + if (tolower_ascii(*lit) != tolower_ascii(*value)) return false; + ++value; + } + + return *value == 0 || *value == '-'; + } + } + + return false; + } + + case ast_opt_compare_attribute: + { + const char_t* value = (_right->_type == ast_string_constant) ? _right->_data.string : _right->_data.variable->get_string(); + + xml_attribute attr = c.n.node().attribute(_left->_data.nodetest); + + return attr && strequal(attr.value(), value) && is_xpath_attribute(attr.name()); + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_boolean) + return _data.variable->get_boolean(); + + // variable needs to be converted to the correct type, this is handled by the fallthrough block below + break; + } + + default: + ; + } + + // none of the ast types that return the value directly matched, we need to perform type conversion + switch (_rettype) + { + case xpath_type_number: + return convert_number_to_boolean(eval_number(c, stack)); + + case xpath_type_string: + { + xpath_allocator_capture cr(stack.result); + + return !eval_string(c, stack).empty(); + } + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.result); + + return !eval_node_set(c, stack, nodeset_eval_any).empty(); + } + + default: + assert(false && "Wrong expression for return type boolean"); // unreachable + return false; + } + } + + double eval_number(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_op_add: + return _left->eval_number(c, stack) + _right->eval_number(c, stack); + + case ast_op_subtract: + return _left->eval_number(c, stack) - _right->eval_number(c, stack); + + case ast_op_multiply: + return _left->eval_number(c, stack) * _right->eval_number(c, stack); + + case ast_op_divide: + return _left->eval_number(c, stack) / _right->eval_number(c, stack); + + case ast_op_mod: + return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack)); + + case ast_op_negate: + return -_left->eval_number(c, stack); + + case ast_number_constant: + return _data.number; + + case ast_func_last: + return static_cast(c.size); + + case ast_func_position: + return static_cast(c.position); + + case ast_func_count: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_left->eval_node_set(c, stack, nodeset_eval_all).size()); + } + + case ast_func_string_length_0: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(string_value(c.n, stack.result).length()); + } + + case ast_func_string_length_1: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_left->eval_string(c, stack).length()); + } + + case ast_func_number_0: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(string_value(c.n, stack.result).c_str()); + } + + case ast_func_number_1: + return _left->eval_number(c, stack); + + case ast_func_sum: + { + xpath_allocator_capture cr(stack.result); + + double r = 0; + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* it = ns.begin(); it != ns.end(); ++it) + { + xpath_allocator_capture cri(stack.result); + + r += convert_string_to_number(string_value(*it, stack.result).c_str()); + } + + return r; + } + + case ast_func_floor: + { + double r = _left->eval_number(c, stack); + + return r == r ? floor(r) : r; + } + + case ast_func_ceiling: + { + double r = _left->eval_number(c, stack); + + return r == r ? ceil(r) : r; + } + + case ast_func_round: + return round_nearest_nzero(_left->eval_number(c, stack)); + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_number) + return _data.variable->get_number(); + + // variable needs to be converted to the correct type, this is handled by the fallthrough block below + break; + } + + default: + ; + } + + // none of the ast types that return the value directly matched, we need to perform type conversion + switch (_rettype) + { + case xpath_type_boolean: + return eval_boolean(c, stack) ? 1 : 0; + + case xpath_type_string: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(eval_string(c, stack).c_str()); + } + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(eval_string(c, stack).c_str()); + } + + default: + assert(false && "Wrong expression for return type number"); // unreachable + return 0; + } + } + + xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack) + { + assert(_type == ast_func_concat); + + xpath_allocator_capture ct(stack.temp); + + // count the string number + size_t count = 1; + for (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++; + + // allocate a buffer for temporary string objects + xpath_string* buffer = static_cast(stack.temp->allocate(count * sizeof(xpath_string))); + if (!buffer) return xpath_string(); + + // evaluate all strings to temporary stack + xpath_stack swapped_stack = {stack.temp, stack.result}; + + buffer[0] = _left->eval_string(c, swapped_stack); + + size_t pos = 1; + for (xpath_ast_node* n = _right; n; n = n->_next, ++pos) buffer[pos] = n->eval_string(c, swapped_stack); + assert(pos == count); + + // get total length + size_t length = 0; + for (size_t i = 0; i < count; ++i) length += buffer[i].length(); + + // create final string + char_t* result = static_cast(stack.result->allocate((length + 1) * sizeof(char_t))); + if (!result) return xpath_string(); + + char_t* ri = result; + + for (size_t j = 0; j < count; ++j) + for (const char_t* bi = buffer[j].c_str(); *bi; ++bi) + *ri++ = *bi; + + *ri = 0; + + return xpath_string::from_heap_preallocated(result, ri); + } + + xpath_string eval_string(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_string_constant: + return xpath_string::from_const(_data.string); + + case ast_func_local_name_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(local_name(na)); + } + + case ast_func_local_name_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(local_name(na)); + } + + case ast_func_name_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(qualified_name(na)); + } + + case ast_func_name_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(qualified_name(na)); + } + + case ast_func_namespace_uri_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(namespace_uri(na)); + } + + case ast_func_namespace_uri_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(namespace_uri(na)); + } + + case ast_func_string_0: + return string_value(c.n, stack.result); + + case ast_func_string_1: + return _left->eval_string(c, stack); + + case ast_func_concat: + return eval_string_concat(c, stack); + + case ast_func_substring_before: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + xpath_string p = _right->eval_string(c, swapped_stack); + + const char_t* pos = find_substring(s.c_str(), p.c_str()); + + return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string(); + } + + case ast_func_substring_after: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + xpath_string p = _right->eval_string(c, swapped_stack); + + const char_t* pos = find_substring(s.c_str(), p.c_str()); + if (!pos) return xpath_string(); + + const char_t* rbegin = pos + p.length(); + const char_t* rend = s.c_str() + s.length(); + + return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin); + } + + case ast_func_substring_2: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + size_t s_length = s.length(); + + double first = round_nearest(_right->eval_number(c, stack)); + + if (is_nan(first)) return xpath_string(); // NaN + else if (first >= static_cast(s_length + 1)) return xpath_string(); + + size_t pos = first < 1 ? 1 : static_cast(first); + assert(1 <= pos && pos <= s_length + 1); + + const char_t* rbegin = s.c_str() + (pos - 1); + const char_t* rend = s.c_str() + s.length(); + + return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin); + } + + case ast_func_substring_3: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + size_t s_length = s.length(); + + double first = round_nearest(_right->eval_number(c, stack)); + double last = first + round_nearest(_right->_next->eval_number(c, stack)); + + if (is_nan(first) || is_nan(last)) return xpath_string(); + else if (first >= static_cast(s_length + 1)) return xpath_string(); + else if (first >= last) return xpath_string(); + else if (last < 1) return xpath_string(); + + size_t pos = first < 1 ? 1 : static_cast(first); + size_t end = last >= static_cast(s_length + 1) ? s_length + 1 : static_cast(last); + + assert(1 <= pos && pos <= end && end <= s_length + 1); + const char_t* rbegin = s.c_str() + (pos - 1); + const char_t* rend = s.c_str() + (end - 1); + + return (end == s_length + 1 && !s.uses_heap()) ? xpath_string::from_const(rbegin) : xpath_string::from_heap(rbegin, rend, stack.result); + } + + case ast_func_normalize_space_0: + { + xpath_string s = string_value(c.n, stack.result); + + char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + + char_t* end = normalize_space(begin); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_func_normalize_space_1: + { + xpath_string s = _left->eval_string(c, stack); + + char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + + char_t* end = normalize_space(begin); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_func_translate: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, stack); + xpath_string from = _right->eval_string(c, swapped_stack); + xpath_string to = _right->_next->eval_string(c, swapped_stack); + + char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + + char_t* end = translate(begin, from.c_str(), to.c_str(), to.length()); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_opt_translate_table: + { + xpath_string s = _left->eval_string(c, stack); + + char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + + char_t* end = translate_table(begin, _data.table); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_string) + return xpath_string::from_const(_data.variable->get_string()); + + // variable needs to be converted to the correct type, this is handled by the fallthrough block below + break; + } + + default: + ; + } + + // none of the ast types that return the value directly matched, we need to perform type conversion + switch (_rettype) + { + case xpath_type_boolean: + return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); + + case xpath_type_number: + return convert_number_to_string(eval_number(c, stack), stack.result); + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first); + return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result); + } + + default: + assert(false && "Wrong expression for return type string"); // unreachable + return xpath_string(); + } + } + + xpath_node_set_raw eval_node_set(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval) + { + switch (_type) + { + case ast_op_union: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_node_set_raw ls = _left->eval_node_set(c, stack, eval); + xpath_node_set_raw rs = _right->eval_node_set(c, swapped_stack, eval); + + // we can optimize merging two sorted sets, but this is a very rare operation, so don't bother + ls.set_type(xpath_node_set::type_unsorted); + + ls.append(rs.begin(), rs.end(), stack.result); + ls.remove_duplicates(stack.temp); + + return ls; + } + + case ast_filter: + { + xpath_node_set_raw set = _left->eval_node_set(c, stack, _test == predicate_constant_one ? nodeset_eval_first : nodeset_eval_all); + + // either expression is a number or it contains position() call; sort by document order + if (_test != predicate_posinv) set.sort_do(); + + bool once = eval_once(set.type(), eval); + + apply_predicate(set, 0, stack, once); + + return set; + } + + case ast_func_id: + return xpath_node_set_raw(); + + case ast_step: + { + switch (_axis) + { + case axis_ancestor: + return step_do(c, stack, eval, axis_to_type()); + + case axis_ancestor_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_attribute: + return step_do(c, stack, eval, axis_to_type()); + + case axis_child: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following_sibling: + return step_do(c, stack, eval, axis_to_type()); + + case axis_namespace: + // namespaced axis is not supported + return xpath_node_set_raw(); + + case axis_parent: + return step_do(c, stack, eval, axis_to_type()); + + case axis_preceding: + return step_do(c, stack, eval, axis_to_type()); + + case axis_preceding_sibling: + return step_do(c, stack, eval, axis_to_type()); + + case axis_self: + return step_do(c, stack, eval, axis_to_type()); + + default: + assert(false && "Unknown axis"); // unreachable + return xpath_node_set_raw(); + } + } + + case ast_step_root: + { + assert(!_right); // root step can't have any predicates + + xpath_node_set_raw ns; + + ns.set_type(xpath_node_set::type_sorted); + + if (c.n.node()) ns.push_back(c.n.node().root(), stack.result); + else if (c.n.attribute()) ns.push_back(c.n.parent().root(), stack.result); + + return ns; + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_node_set) + { + const xpath_node_set& s = _data.variable->get_node_set(); + + xpath_node_set_raw ns; + + ns.set_type(s.type()); + ns.append(s.begin(), s.end(), stack.result); + + return ns; + } + + // variable needs to be converted to the correct type, this is handled by the fallthrough block below + break; + } + + default: + ; + } + + // none of the ast types that return the value directly matched, but conversions to node set are invalid + assert(false && "Wrong expression for return type node set"); // unreachable + return xpath_node_set_raw(); + } + + void optimize(xpath_allocator* alloc) + { + if (_left) + _left->optimize(alloc); + + if (_right) + _right->optimize(alloc); + + if (_next) + _next->optimize(alloc); + + // coverity[var_deref_model] + optimize_self(alloc); + } + + void optimize_self(xpath_allocator* alloc) + { + // Rewrite [position()=expr] with [expr] + // Note that this step has to go before classification to recognize [position()=1] + if ((_type == ast_filter || _type == ast_predicate) && + _right && // workaround for clang static analyzer (_right is never null for ast_filter/ast_predicate) + _right->_type == ast_op_equal && _right->_left->_type == ast_func_position && _right->_right->_rettype == xpath_type_number) + { + _right = _right->_right; + } + + // Classify filter/predicate ops to perform various optimizations during evaluation + if ((_type == ast_filter || _type == ast_predicate) && _right) // workaround for clang static analyzer (_right is never null for ast_filter/ast_predicate) + { + assert(_test == predicate_default); + + if (_right->_type == ast_number_constant && _right->_data.number == 1.0) + _test = predicate_constant_one; + else if (_right->_rettype == xpath_type_number && (_right->_type == ast_number_constant || _right->_type == ast_variable || _right->_type == ast_func_last)) + _test = predicate_constant; + else if (_right->_rettype != xpath_type_number && _right->is_posinv_expr()) + _test = predicate_posinv; + } + + // Rewrite descendant-or-self::node()/child::foo with descendant::foo + // The former is a full form of //foo, the latter is much faster since it executes the node test immediately + // Do a similar kind of rewrite for self/descendant/descendant-or-self axes + // Note that we only rewrite positionally invariant steps (//foo[1] != /descendant::foo[1]) + if (_type == ast_step && (_axis == axis_child || _axis == axis_self || _axis == axis_descendant || _axis == axis_descendant_or_self) && + _left && _left->_type == ast_step && _left->_axis == axis_descendant_or_self && _left->_test == nodetest_type_node && !_left->_right && + is_posinv_step()) + { + if (_axis == axis_child || _axis == axis_descendant) + _axis = axis_descendant; + else + _axis = axis_descendant_or_self; + + _left = _left->_left; + } + + // Use optimized lookup table implementation for translate() with constant arguments + if (_type == ast_func_translate && + _right && // workaround for clang static analyzer (_right is never null for ast_func_translate) + _right->_type == ast_string_constant && _right->_next->_type == ast_string_constant) + { + unsigned char* table = translate_table_generate(alloc, _right->_data.string, _right->_next->_data.string); + + if (table) + { + _type = ast_opt_translate_table; + _data.table = table; + } + } + + // Use optimized path for @attr = 'value' or @attr = $value + if (_type == ast_op_equal && + _left && _right && // workaround for clang static analyzer and Coverity (_left and _right are never null for ast_op_equal) + // coverity[mixed_enums] + _left->_type == ast_step && _left->_axis == axis_attribute && _left->_test == nodetest_name && !_left->_left && !_left->_right && + (_right->_type == ast_string_constant || (_right->_type == ast_variable && _right->_rettype == xpath_type_string))) + { + _type = ast_opt_compare_attribute; + } + } + + bool is_posinv_expr() const + { + switch (_type) + { + case ast_func_position: + case ast_func_last: + return false; + + case ast_string_constant: + case ast_number_constant: + case ast_variable: + return true; + + case ast_step: + case ast_step_root: + return true; + + case ast_predicate: + case ast_filter: + return true; + + default: + if (_left && !_left->is_posinv_expr()) return false; + + for (xpath_ast_node* n = _right; n; n = n->_next) + if (!n->is_posinv_expr()) return false; + + return true; + } + } + + bool is_posinv_step() const + { + assert(_type == ast_step); + + for (xpath_ast_node* n = _right; n; n = n->_next) + { + assert(n->_type == ast_predicate); + + if (n->_test != predicate_posinv) + return false; + } + + return true; + } + + xpath_value_type rettype() const + { + return static_cast(_rettype); + } + }; + + static const size_t xpath_ast_depth_limit = + #ifdef PUGIXML_XPATH_DEPTH_LIMIT + PUGIXML_XPATH_DEPTH_LIMIT + #else + 1024 + #endif + ; + + struct xpath_parser + { + xpath_allocator* _alloc; + xpath_lexer _lexer; + + const char_t* _query; + xpath_variable_set* _variables; + + xpath_parse_result* _result; + + char_t _scratch[32]; + + size_t _depth; + + xpath_ast_node* error(const char* message) + { + _result->error = message; + _result->offset = _lexer.current_pos() - _query; + + return 0; + } + + xpath_ast_node* error_oom() + { + assert(_alloc->_error); + *_alloc->_error = true; + + return 0; + } + + xpath_ast_node* error_rec() + { + return error("Exceeded maximum allowed query depth"); + } + + void* alloc_node() + { + return _alloc->allocate(sizeof(xpath_ast_node)); + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, const char_t* value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, double value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, xpath_variable* value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, xpath_ast_node* left = 0, xpath_ast_node* right = 0) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, left, right) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, left, axis, test, contents) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, left, right, test) : 0; + } + + const char_t* alloc_string(const xpath_lexer_string& value) + { + if (!value.begin) + return PUGIXML_TEXT(""); + + size_t length = static_cast(value.end - value.begin); + + char_t* c = static_cast(_alloc->allocate((length + 1) * sizeof(char_t))); + if (!c) return 0; + + memcpy(c, value.begin, length * sizeof(char_t)); + c[length] = 0; + + return c; + } + + xpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2]) + { + switch (name.begin[0]) + { + case 'b': + if (name == PUGIXML_TEXT("boolean") && argc == 1) + return alloc_node(ast_func_boolean, xpath_type_boolean, args[0]); + + break; + + case 'c': + if (name == PUGIXML_TEXT("count") && argc == 1) + { + if (args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(ast_func_count, xpath_type_number, args[0]); + } + else if (name == PUGIXML_TEXT("contains") && argc == 2) + return alloc_node(ast_func_contains, xpath_type_boolean, args[0], args[1]); + else if (name == PUGIXML_TEXT("concat") && argc >= 2) + return alloc_node(ast_func_concat, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("ceiling") && argc == 1) + return alloc_node(ast_func_ceiling, xpath_type_number, args[0]); + + break; + + case 'f': + if (name == PUGIXML_TEXT("false") && argc == 0) + return alloc_node(ast_func_false, xpath_type_boolean); + else if (name == PUGIXML_TEXT("floor") && argc == 1) + return alloc_node(ast_func_floor, xpath_type_number, args[0]); + + break; + + case 'i': + if (name == PUGIXML_TEXT("id") && argc == 1) + return alloc_node(ast_func_id, xpath_type_node_set, args[0]); + + break; + + case 'l': + if (name == PUGIXML_TEXT("last") && argc == 0) + return alloc_node(ast_func_last, xpath_type_number); + else if (name == PUGIXML_TEXT("lang") && argc == 1) + return alloc_node(ast_func_lang, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("local-name") && argc <= 1) + { + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_local_name_0 : ast_func_local_name_1, xpath_type_string, args[0]); + } + + break; + + case 'n': + if (name == PUGIXML_TEXT("name") && argc <= 1) + { + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_name_0 : ast_func_name_1, xpath_type_string, args[0]); + } + else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1) + { + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_namespace_uri_0 : ast_func_namespace_uri_1, xpath_type_string, args[0]); + } + else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("not") && argc == 1) + return alloc_node(ast_func_not, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("number") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]); + + break; + + case 'p': + if (name == PUGIXML_TEXT("position") && argc == 0) + return alloc_node(ast_func_position, xpath_type_number); + + break; + + case 'r': + if (name == PUGIXML_TEXT("round") && argc == 1) + return alloc_node(ast_func_round, xpath_type_number, args[0]); + + break; + + case 's': + if (name == PUGIXML_TEXT("string") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]); + else if (name == PUGIXML_TEXT("string-length") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]); + else if (name == PUGIXML_TEXT("starts-with") && argc == 2) + return alloc_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-before") && argc == 2) + return alloc_node(ast_func_substring_before, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-after") && argc == 2) + return alloc_node(ast_func_substring_after, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3)) + return alloc_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("sum") && argc == 1) + { + if (args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(ast_func_sum, xpath_type_number, args[0]); + } + + break; + + case 't': + if (name == PUGIXML_TEXT("translate") && argc == 3) + return alloc_node(ast_func_translate, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("true") && argc == 0) + return alloc_node(ast_func_true, xpath_type_boolean); + + break; + + default: + break; + } + + return error("Unrecognized function or wrong parameter count"); + } + + axis_t parse_axis_name(const xpath_lexer_string& name, bool& specified) + { + specified = true; + + switch (name.begin[0]) + { + case 'a': + if (name == PUGIXML_TEXT("ancestor")) + return axis_ancestor; + else if (name == PUGIXML_TEXT("ancestor-or-self")) + return axis_ancestor_or_self; + else if (name == PUGIXML_TEXT("attribute")) + return axis_attribute; + + break; + + case 'c': + if (name == PUGIXML_TEXT("child")) + return axis_child; + + break; + + case 'd': + if (name == PUGIXML_TEXT("descendant")) + return axis_descendant; + else if (name == PUGIXML_TEXT("descendant-or-self")) + return axis_descendant_or_self; + + break; + + case 'f': + if (name == PUGIXML_TEXT("following")) + return axis_following; + else if (name == PUGIXML_TEXT("following-sibling")) + return axis_following_sibling; + + break; + + case 'n': + if (name == PUGIXML_TEXT("namespace")) + return axis_namespace; + + break; + + case 'p': + if (name == PUGIXML_TEXT("parent")) + return axis_parent; + else if (name == PUGIXML_TEXT("preceding")) + return axis_preceding; + else if (name == PUGIXML_TEXT("preceding-sibling")) + return axis_preceding_sibling; + + break; + + case 's': + if (name == PUGIXML_TEXT("self")) + return axis_self; + + break; + + default: + break; + } + + specified = false; + return axis_child; + } + + nodetest_t parse_node_test_type(const xpath_lexer_string& name) + { + switch (name.begin[0]) + { + case 'c': + if (name == PUGIXML_TEXT("comment")) + return nodetest_type_comment; + + break; + + case 'n': + if (name == PUGIXML_TEXT("node")) + return nodetest_type_node; + + break; + + case 'p': + if (name == PUGIXML_TEXT("processing-instruction")) + return nodetest_type_pi; + + break; + + case 't': + if (name == PUGIXML_TEXT("text")) + return nodetest_type_text; + + break; + + default: + break; + } + + return nodetest_none; + } + + // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall + xpath_ast_node* parse_primary_expression() + { + switch (_lexer.current()) + { + case lex_var_ref: + { + xpath_lexer_string name = _lexer.contents(); + + if (!_variables) + return error("Unknown variable: variable set is not provided"); + + xpath_variable* var = 0; + if (!get_variable_scratch(_scratch, _variables, name.begin, name.end, &var)) + return error_oom(); + + if (!var) + return error("Unknown variable: variable set does not contain the given name"); + + _lexer.next(); + + return alloc_node(ast_variable, var->type(), var); + } + + case lex_open_brace: + { + _lexer.next(); + + xpath_ast_node* n = parse_expression(); + if (!n) return 0; + + if (_lexer.current() != lex_close_brace) + return error("Expected ')' to match an opening '('"); + + _lexer.next(); + + return n; + } + + case lex_quoted_string: + { + const char_t* value = alloc_string(_lexer.contents()); + if (!value) return 0; + + _lexer.next(); + + return alloc_node(ast_string_constant, xpath_type_string, value); + } + + case lex_number: + { + double value = 0; + + if (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value)) + return error_oom(); + + _lexer.next(); + + return alloc_node(ast_number_constant, xpath_type_number, value); + } + + case lex_string: + { + xpath_ast_node* args[2] = {0}; + size_t argc = 0; + + xpath_lexer_string function = _lexer.contents(); + _lexer.next(); + + xpath_ast_node* last_arg = 0; + + if (_lexer.current() != lex_open_brace) + return error("Unrecognized function call"); + _lexer.next(); + + size_t old_depth = _depth; + + while (_lexer.current() != lex_close_brace) + { + if (argc > 0) + { + if (_lexer.current() != lex_comma) + return error("No comma between function arguments"); + _lexer.next(); + } + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + xpath_ast_node* n = parse_expression(); + if (!n) return 0; + + if (argc < 2) args[argc] = n; + else last_arg->set_next(n); + + argc++; + last_arg = n; + } + + _lexer.next(); + + _depth = old_depth; + + return parse_function(function, argc, args); + } + + default: + return error("Unrecognizable primary expression"); + } + } + + // FilterExpr ::= PrimaryExpr | FilterExpr Predicate + // Predicate ::= '[' PredicateExpr ']' + // PredicateExpr ::= Expr + xpath_ast_node* parse_filter_expression() + { + xpath_ast_node* n = parse_primary_expression(); + if (!n) return 0; + + size_t old_depth = _depth; + + while (_lexer.current() == lex_open_square_brace) + { + _lexer.next(); + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + if (n->rettype() != xpath_type_node_set) + return error("Predicate has to be applied to node set"); + + xpath_ast_node* expr = parse_expression(); + if (!expr) return 0; + + n = alloc_node(ast_filter, n, expr, predicate_default); + if (!n) return 0; + + if (_lexer.current() != lex_close_square_brace) + return error("Expected ']' to match an opening '['"); + + _lexer.next(); + } + + _depth = old_depth; + + return n; + } + + // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep + // AxisSpecifier ::= AxisName '::' | '@'? + // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')' + // NameTest ::= '*' | NCName ':' '*' | QName + // AbbreviatedStep ::= '.' | '..' + xpath_ast_node* parse_step(xpath_ast_node* set) + { + if (set && set->rettype() != xpath_type_node_set) + return error("Step has to be applied to node set"); + + bool axis_specified = false; + axis_t axis = axis_child; // implied child axis + + if (_lexer.current() == lex_axis_attribute) + { + axis = axis_attribute; + axis_specified = true; + + _lexer.next(); + } + else if (_lexer.current() == lex_dot) + { + _lexer.next(); + + if (_lexer.current() == lex_open_square_brace) + return error("Predicates are not allowed after an abbreviated step"); + + return alloc_node(ast_step, set, axis_self, nodetest_type_node, 0); + } + else if (_lexer.current() == lex_double_dot) + { + _lexer.next(); + + if (_lexer.current() == lex_open_square_brace) + return error("Predicates are not allowed after an abbreviated step"); + + return alloc_node(ast_step, set, axis_parent, nodetest_type_node, 0); + } + + nodetest_t nt_type = nodetest_none; + xpath_lexer_string nt_name; + + if (_lexer.current() == lex_string) + { + // node name test + nt_name = _lexer.contents(); + _lexer.next(); + + // was it an axis name? + if (_lexer.current() == lex_double_colon) + { + // parse axis name + if (axis_specified) + return error("Two axis specifiers in one step"); + + axis = parse_axis_name(nt_name, axis_specified); + + if (!axis_specified) + return error("Unknown axis"); + + // read actual node test + _lexer.next(); + + if (_lexer.current() == lex_multiply) + { + nt_type = nodetest_all; + nt_name = xpath_lexer_string(); + _lexer.next(); + } + else if (_lexer.current() == lex_string) + { + nt_name = _lexer.contents(); + _lexer.next(); + } + else + { + return error("Unrecognized node test"); + } + } + + if (nt_type == nodetest_none) + { + // node type test or processing-instruction + if (_lexer.current() == lex_open_brace) + { + _lexer.next(); + + if (_lexer.current() == lex_close_brace) + { + _lexer.next(); + + nt_type = parse_node_test_type(nt_name); + + if (nt_type == nodetest_none) + return error("Unrecognized node type"); + + nt_name = xpath_lexer_string(); + } + else if (nt_name == PUGIXML_TEXT("processing-instruction")) + { + if (_lexer.current() != lex_quoted_string) + return error("Only literals are allowed as arguments to processing-instruction()"); + + nt_type = nodetest_pi; + nt_name = _lexer.contents(); + _lexer.next(); + + if (_lexer.current() != lex_close_brace) + return error("Unmatched brace near processing-instruction()"); + _lexer.next(); + } + else + { + return error("Unmatched brace near node type test"); + } + } + // QName or NCName:* + else + { + if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:* + { + nt_name.end--; // erase * + + nt_type = nodetest_all_in_namespace; + } + else + { + nt_type = nodetest_name; + } + } + } + } + else if (_lexer.current() == lex_multiply) + { + nt_type = nodetest_all; + _lexer.next(); + } + else + { + return error("Unrecognized node test"); + } + + const char_t* nt_name_copy = alloc_string(nt_name); + if (!nt_name_copy) return 0; + + xpath_ast_node* n = alloc_node(ast_step, set, axis, nt_type, nt_name_copy); + if (!n) return 0; + + size_t old_depth = _depth; + + xpath_ast_node* last = 0; + + while (_lexer.current() == lex_open_square_brace) + { + _lexer.next(); + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + xpath_ast_node* expr = parse_expression(); + if (!expr) return 0; + + xpath_ast_node* pred = alloc_node(ast_predicate, 0, expr, predicate_default); + if (!pred) return 0; + + if (_lexer.current() != lex_close_square_brace) + return error("Expected ']' to match an opening '['"); + _lexer.next(); + + if (last) last->set_next(pred); + else n->set_right(pred); + + last = pred; + } + + _depth = old_depth; + + return n; + } + + // RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step + xpath_ast_node* parse_relative_location_path(xpath_ast_node* set) + { + xpath_ast_node* n = parse_step(set); + if (!n) return 0; + + size_t old_depth = _depth; + + while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) + { + lexeme_t l = _lexer.current(); + _lexer.next(); + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + if (l == lex_double_slash) + { + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; + } + + n = parse_step(n); + if (!n) return 0; + } + + _depth = old_depth; + + return n; + } + + // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath + // AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath + xpath_ast_node* parse_location_path() + { + if (_lexer.current() == lex_slash) + { + _lexer.next(); + + xpath_ast_node* n = alloc_node(ast_step_root, xpath_type_node_set); + if (!n) return 0; + + // relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path + lexeme_t l = _lexer.current(); + + if (l == lex_string || l == lex_axis_attribute || l == lex_dot || l == lex_double_dot || l == lex_multiply) + return parse_relative_location_path(n); + else + return n; + } + else if (_lexer.current() == lex_double_slash) + { + _lexer.next(); + + xpath_ast_node* n = alloc_node(ast_step_root, xpath_type_node_set); + if (!n) return 0; + + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; + + return parse_relative_location_path(n); + } + + // else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1 + return parse_relative_location_path(0); + } + + // PathExpr ::= LocationPath + // | FilterExpr + // | FilterExpr '/' RelativeLocationPath + // | FilterExpr '//' RelativeLocationPath + // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr + // UnaryExpr ::= UnionExpr | '-' UnaryExpr + xpath_ast_node* parse_path_or_unary_expression() + { + // Clarification. + // PathExpr begins with either LocationPath or FilterExpr. + // FilterExpr begins with PrimaryExpr + // PrimaryExpr begins with '$' in case of it being a variable reference, + // '(' in case of it being an expression, string literal, number constant or + // function call. + if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace || + _lexer.current() == lex_quoted_string || _lexer.current() == lex_number || + _lexer.current() == lex_string) + { + if (_lexer.current() == lex_string) + { + // This is either a function call, or not - if not, we shall proceed with location path + const char_t* state = _lexer.state(); + + while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state; + + if (*state != '(') + return parse_location_path(); + + // This looks like a function call; however this still can be a node-test. Check it. + if (parse_node_test_type(_lexer.contents()) != nodetest_none) + return parse_location_path(); + } + + xpath_ast_node* n = parse_filter_expression(); + if (!n) return 0; + + if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) + { + lexeme_t l = _lexer.current(); + _lexer.next(); + + if (l == lex_double_slash) + { + if (n->rettype() != xpath_type_node_set) + return error("Step has to be applied to node set"); + + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; + } + + // select from location path + return parse_relative_location_path(n); + } + + return n; + } + else if (_lexer.current() == lex_minus) + { + _lexer.next(); + + // precedence 7+ - only parses union expressions + xpath_ast_node* n = parse_expression(7); + if (!n) return 0; + + return alloc_node(ast_op_negate, xpath_type_number, n); + } + else + { + return parse_location_path(); + } + } + + struct binary_op_t + { + ast_type_t asttype; + xpath_value_type rettype; + int precedence; + + binary_op_t(): asttype(ast_unknown), rettype(xpath_type_none), precedence(0) + { + } + + binary_op_t(ast_type_t asttype_, xpath_value_type rettype_, int precedence_): asttype(asttype_), rettype(rettype_), precedence(precedence_) + { + } + + static binary_op_t parse(xpath_lexer& lexer) + { + switch (lexer.current()) + { + case lex_string: + if (lexer.contents() == PUGIXML_TEXT("or")) + return binary_op_t(ast_op_or, xpath_type_boolean, 1); + else if (lexer.contents() == PUGIXML_TEXT("and")) + return binary_op_t(ast_op_and, xpath_type_boolean, 2); + else if (lexer.contents() == PUGIXML_TEXT("div")) + return binary_op_t(ast_op_divide, xpath_type_number, 6); + else if (lexer.contents() == PUGIXML_TEXT("mod")) + return binary_op_t(ast_op_mod, xpath_type_number, 6); + else + return binary_op_t(); + + case lex_equal: + return binary_op_t(ast_op_equal, xpath_type_boolean, 3); + + case lex_not_equal: + return binary_op_t(ast_op_not_equal, xpath_type_boolean, 3); + + case lex_less: + return binary_op_t(ast_op_less, xpath_type_boolean, 4); + + case lex_greater: + return binary_op_t(ast_op_greater, xpath_type_boolean, 4); + + case lex_less_or_equal: + return binary_op_t(ast_op_less_or_equal, xpath_type_boolean, 4); + + case lex_greater_or_equal: + return binary_op_t(ast_op_greater_or_equal, xpath_type_boolean, 4); + + case lex_plus: + return binary_op_t(ast_op_add, xpath_type_number, 5); + + case lex_minus: + return binary_op_t(ast_op_subtract, xpath_type_number, 5); + + case lex_multiply: + return binary_op_t(ast_op_multiply, xpath_type_number, 6); + + case lex_union: + return binary_op_t(ast_op_union, xpath_type_node_set, 7); + + default: + return binary_op_t(); + } + } + }; + + xpath_ast_node* parse_expression_rec(xpath_ast_node* lhs, int limit) + { + binary_op_t op = binary_op_t::parse(_lexer); + + while (op.asttype != ast_unknown && op.precedence >= limit) + { + _lexer.next(); + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + xpath_ast_node* rhs = parse_path_or_unary_expression(); + if (!rhs) return 0; + + binary_op_t nextop = binary_op_t::parse(_lexer); + + while (nextop.asttype != ast_unknown && nextop.precedence > op.precedence) + { + rhs = parse_expression_rec(rhs, nextop.precedence); + if (!rhs) return 0; + + nextop = binary_op_t::parse(_lexer); + } + + if (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set)) + return error("Union operator has to be applied to node sets"); + + lhs = alloc_node(op.asttype, op.rettype, lhs, rhs); + if (!lhs) return 0; + + op = binary_op_t::parse(_lexer); + } + + return lhs; + } + + // Expr ::= OrExpr + // OrExpr ::= AndExpr | OrExpr 'or' AndExpr + // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr + // EqualityExpr ::= RelationalExpr + // | EqualityExpr '=' RelationalExpr + // | EqualityExpr '!=' RelationalExpr + // RelationalExpr ::= AdditiveExpr + // | RelationalExpr '<' AdditiveExpr + // | RelationalExpr '>' AdditiveExpr + // | RelationalExpr '<=' AdditiveExpr + // | RelationalExpr '>=' AdditiveExpr + // AdditiveExpr ::= MultiplicativeExpr + // | AdditiveExpr '+' MultiplicativeExpr + // | AdditiveExpr '-' MultiplicativeExpr + // MultiplicativeExpr ::= UnaryExpr + // | MultiplicativeExpr '*' UnaryExpr + // | MultiplicativeExpr 'div' UnaryExpr + // | MultiplicativeExpr 'mod' UnaryExpr + xpath_ast_node* parse_expression(int limit = 0) + { + size_t old_depth = _depth; + + if (++_depth > xpath_ast_depth_limit) + return error_rec(); + + xpath_ast_node* n = parse_path_or_unary_expression(); + if (!n) return 0; + + n = parse_expression_rec(n, limit); + + _depth = old_depth; + + return n; + } + + xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result), _depth(0) + { + } + + xpath_ast_node* parse() + { + xpath_ast_node* n = parse_expression(); + if (!n) return 0; + + assert(_depth == 0); + + // check if there are unparsed tokens left + if (_lexer.current() != lex_eof) + return error("Incorrect query"); + + return n; + } + + static xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result) + { + xpath_parser parser(query, variables, alloc, result); + + return parser.parse(); + } + }; + + struct xpath_query_impl + { + static xpath_query_impl* create() + { + void* memory = xml_memory::allocate(sizeof(xpath_query_impl)); + if (!memory) return 0; + + return new (memory) xpath_query_impl(); + } + + static void destroy(xpath_query_impl* impl) + { + // free all allocated pages + impl->alloc.release(); + + // free allocator memory (with the first page) + xml_memory::deallocate(impl); + } + + xpath_query_impl(): root(0), alloc(&block, &oom), oom(false) + { + block.next = 0; + block.capacity = sizeof(block.data); + } + + xpath_ast_node* root; + xpath_allocator alloc; + xpath_memory_block block; + bool oom; + }; + + PUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl) + { + if (!impl) return 0; + + if (impl->root->rettype() != xpath_type_node_set) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return 0; + #else + xpath_parse_result res; + res.error = "Expression does not evaluate to node set"; + + throw xpath_exception(res); + #endif + } + + return impl->root; + } +PUGI__NS_END + +namespace pugi +{ +#ifndef PUGIXML_NO_EXCEPTIONS + PUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_) + { + assert(_result.error); + } + + PUGI__FN const char* xpath_exception::what() const throw() + { + return _result.error; + } + + PUGI__FN const xpath_parse_result& xpath_exception::result() const + { + return _result; + } +#endif + + PUGI__FN xpath_node::xpath_node() + { + } + + PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_) + { + } + + PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_) + { + } + + PUGI__FN xml_node xpath_node::node() const + { + return _attribute ? xml_node() : _node; + } + + PUGI__FN xml_attribute xpath_node::attribute() const + { + return _attribute; + } + + PUGI__FN xml_node xpath_node::parent() const + { + return _attribute ? _node : _node.parent(); + } + + PUGI__FN static void unspecified_bool_xpath_node(xpath_node***) + { + } + + PUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const + { + return (_node || _attribute) ? unspecified_bool_xpath_node : 0; + } + + PUGI__FN bool xpath_node::operator!() const + { + return !(_node || _attribute); + } + + PUGI__FN bool xpath_node::operator==(const xpath_node& n) const + { + return _node == n._node && _attribute == n._attribute; + } + + PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const + { + return _node != n._node || _attribute != n._attribute; + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xpath_node& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xpath_node& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_, type_t type_) + { + assert(begin_ <= end_); + + size_t size_ = static_cast(end_ - begin_); + + // use internal buffer for 0 or 1 elements, heap buffer otherwise + xpath_node* storage = (size_ <= 1) ? _storage : static_cast(impl::xml_memory::allocate(size_ * sizeof(xpath_node))); + + if (!storage) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return; + #else + throw std::bad_alloc(); + #endif + } + + // deallocate old buffer + if (_begin != _storage) + impl::xml_memory::deallocate(_begin); + + // size check is necessary because for begin_ = end_ = nullptr, memcpy is UB + if (size_) + memcpy(storage, begin_, size_ * sizeof(xpath_node)); + + _begin = storage; + _end = storage + size_; + _type = type_; + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN void xpath_node_set::_move(xpath_node_set& rhs) PUGIXML_NOEXCEPT + { + _type = rhs._type; + _storage[0] = rhs._storage[0]; + _begin = (rhs._begin == rhs._storage) ? _storage : rhs._begin; + _end = _begin + (rhs._end - rhs._begin); + + rhs._type = type_unsorted; + rhs._begin = rhs._storage; + rhs._end = rhs._storage; + } +#endif + + PUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(_storage), _end(_storage) + { + } + + PUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_unsorted), _begin(_storage), _end(_storage) + { + _assign(begin_, end_, type_); + } + + PUGI__FN xpath_node_set::~xpath_node_set() + { + if (_begin != _storage) + impl::xml_memory::deallocate(_begin); + } + + PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(_storage), _end(_storage) + { + _assign(ns._begin, ns._end, ns._type); + } + + PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns) + { + if (this == &ns) return *this; + + _assign(ns._begin, ns._end, ns._type); + + return *this; + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_node_set::xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT: _type(type_unsorted), _begin(_storage), _end(_storage) + { + _move(rhs); + } + + PUGI__FN xpath_node_set& xpath_node_set::operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT + { + if (this == &rhs) return *this; + + if (_begin != _storage) + impl::xml_memory::deallocate(_begin); + + _move(rhs); + + return *this; + } +#endif + + PUGI__FN xpath_node_set::type_t xpath_node_set::type() const + { + return _type; + } + + PUGI__FN size_t xpath_node_set::size() const + { + return _end - _begin; + } + + PUGI__FN bool xpath_node_set::empty() const + { + return _begin == _end; + } + + PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const + { + assert(index < size()); + return _begin[index]; + } + + PUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const + { + return _begin; + } + + PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const + { + return _end; + } + + PUGI__FN void xpath_node_set::sort(bool reverse) + { + _type = impl::xpath_sort(_begin, _end, _type, reverse); + } + + PUGI__FN xpath_node xpath_node_set::first() const + { + return impl::xpath_first(_begin, _end, _type); + } + + PUGI__FN xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0) + { + } + + PUGI__FN xpath_parse_result::operator bool() const + { + return error == 0; + } + + PUGI__FN const char* xpath_parse_result::description() const + { + return error ? error : "No error"; + } + + PUGI__FN xpath_variable::xpath_variable(xpath_value_type type_): _type(type_), _next(0) + { + } + + PUGI__FN const char_t* xpath_variable::name() const + { + switch (_type) + { + case xpath_type_node_set: + return static_cast(this)->name; + + case xpath_type_number: + return static_cast(this)->name; + + case xpath_type_string: + return static_cast(this)->name; + + case xpath_type_boolean: + return static_cast(this)->name; + + default: + assert(false && "Invalid variable type"); // unreachable + return 0; + } + } + + PUGI__FN xpath_value_type xpath_variable::type() const + { + return _type; + } + + PUGI__FN bool xpath_variable::get_boolean() const + { + return (_type == xpath_type_boolean) ? static_cast(this)->value : false; + } + + PUGI__FN double xpath_variable::get_number() const + { + return (_type == xpath_type_number) ? static_cast(this)->value : impl::gen_nan(); + } + + PUGI__FN const char_t* xpath_variable::get_string() const + { + const char_t* value = (_type == xpath_type_string) ? static_cast(this)->value : 0; + return value ? value : PUGIXML_TEXT(""); + } + + PUGI__FN const xpath_node_set& xpath_variable::get_node_set() const + { + return (_type == xpath_type_node_set) ? static_cast(this)->value : impl::dummy_node_set; + } + + PUGI__FN bool xpath_variable::set(bool value) + { + if (_type != xpath_type_boolean) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN bool xpath_variable::set(double value) + { + if (_type != xpath_type_number) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN bool xpath_variable::set(const char_t* value) + { + if (_type != xpath_type_string) return false; + + impl::xpath_variable_string* var = static_cast(this); + + // duplicate string + size_t size = (impl::strlength(value) + 1) * sizeof(char_t); + + char_t* copy = static_cast(impl::xml_memory::allocate(size)); + if (!copy) return false; + + memcpy(copy, value, size); + + // replace old string + if (var->value) impl::xml_memory::deallocate(var->value); + var->value = copy; + + return true; + } + + PUGI__FN bool xpath_variable::set(const xpath_node_set& value) + { + if (_type != xpath_type_node_set) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN xpath_variable_set::xpath_variable_set() + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _data[i] = 0; + } + + PUGI__FN xpath_variable_set::~xpath_variable_set() + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _destroy(_data[i]); + } + + PUGI__FN xpath_variable_set::xpath_variable_set(const xpath_variable_set& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _data[i] = 0; + + _assign(rhs); + } + + PUGI__FN xpath_variable_set& xpath_variable_set::operator=(const xpath_variable_set& rhs) + { + if (this == &rhs) return *this; + + _assign(rhs); + + return *this; + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_variable_set::xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + _data[i] = rhs._data[i]; + rhs._data[i] = 0; + } + } + + PUGI__FN xpath_variable_set& xpath_variable_set::operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + _destroy(_data[i]); + + _data[i] = rhs._data[i]; + rhs._data[i] = 0; + } + + return *this; + } +#endif + + PUGI__FN void xpath_variable_set::_assign(const xpath_variable_set& rhs) + { + xpath_variable_set temp; + + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + if (rhs._data[i] && !_clone(rhs._data[i], &temp._data[i])) + return; + + _swap(temp); + } + + PUGI__FN void xpath_variable_set::_swap(xpath_variable_set& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + xpath_variable* chain = _data[i]; + + _data[i] = rhs._data[i]; + rhs._data[i] = chain; + } + } + + PUGI__FN xpath_variable* xpath_variable_set::_find(const char_t* name) const + { + const size_t hash_size = sizeof(_data) / sizeof(_data[0]); + size_t hash = impl::hash_string(name) % hash_size; + + // look for existing variable + for (xpath_variable* var = _data[hash]; var; var = var->_next) + if (impl::strequal(var->name(), name)) + return var; + + return 0; + } + + PUGI__FN bool xpath_variable_set::_clone(xpath_variable* var, xpath_variable** out_result) + { + xpath_variable* last = 0; + + while (var) + { + // allocate storage for new variable + xpath_variable* nvar = impl::new_xpath_variable(var->_type, var->name()); + if (!nvar) return false; + + // link the variable to the result immediately to handle failures gracefully + if (last) + last->_next = nvar; + else + *out_result = nvar; + + last = nvar; + + // copy the value; this can fail due to out-of-memory conditions + if (!impl::copy_xpath_variable(nvar, var)) return false; + + var = var->_next; + } + + return true; + } + + PUGI__FN void xpath_variable_set::_destroy(xpath_variable* var) + { + while (var) + { + xpath_variable* next = var->_next; + + impl::delete_xpath_variable(var->_type, var); + + var = next; + } + } + + PUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type) + { + const size_t hash_size = sizeof(_data) / sizeof(_data[0]); + size_t hash = impl::hash_string(name) % hash_size; + + // look for existing variable + for (xpath_variable* var = _data[hash]; var; var = var->_next) + if (impl::strequal(var->name(), name)) + return var->type() == type ? var : 0; + + // add new variable + xpath_variable* result = impl::new_xpath_variable(type, name); + + if (result) + { + result->_next = _data[hash]; + + _data[hash] = result; + } + + return result; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, bool value) + { + xpath_variable* var = add(name, xpath_type_boolean); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, double value) + { + xpath_variable* var = add(name, xpath_type_number); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value) + { + xpath_variable* var = add(name, xpath_type_string); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value) + { + xpath_variable* var = add(name, xpath_type_node_set); + return var ? var->set(value) : false; + } + + PUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name) + { + return _find(name); + } + + PUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const + { + return _find(name); + } + + PUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0) + { + impl::xpath_query_impl* qimpl = impl::xpath_query_impl::create(); + + if (!qimpl) + { + #ifdef PUGIXML_NO_EXCEPTIONS + _result.error = "Out of memory"; + #else + throw std::bad_alloc(); + #endif + } + else + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter impl(qimpl, impl::xpath_query_impl::destroy); + + qimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result); + + if (qimpl->root) + { + qimpl->root->optimize(&qimpl->alloc); + + _impl = impl.release(); + _result.error = 0; + } + else + { + #ifdef PUGIXML_NO_EXCEPTIONS + if (qimpl->oom) _result.error = "Out of memory"; + #else + if (qimpl->oom) throw std::bad_alloc(); + throw xpath_exception(_result); + #endif + } + } + } + + PUGI__FN xpath_query::xpath_query(): _impl(0) + { + } + + PUGI__FN xpath_query::~xpath_query() + { + if (_impl) + impl::xpath_query_impl::destroy(static_cast(_impl)); + } + +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_query::xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT + { + _impl = rhs._impl; + _result = rhs._result; + rhs._impl = 0; + rhs._result = xpath_parse_result(); + } + + PUGI__FN xpath_query& xpath_query::operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT + { + if (this == &rhs) return *this; + + if (_impl) + impl::xpath_query_impl::destroy(static_cast(_impl)); + + _impl = rhs._impl; + _result = rhs._result; + rhs._impl = 0; + rhs._result = xpath_parse_result(); + + return *this; + } +#endif + + PUGI__FN xpath_value_type xpath_query::return_type() const + { + if (!_impl) return xpath_type_none; + + return static_cast(_impl)->root->rettype(); + } + + PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const + { + if (!_impl) return false; + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + bool r = static_cast(_impl)->root->eval_boolean(c, sd.stack); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return false; + #else + throw std::bad_alloc(); + #endif + } + + return r; + } + + PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const + { + if (!_impl) return impl::gen_nan(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + double r = static_cast(_impl)->root->eval_number(c, sd.stack); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return impl::gen_nan(); + #else + throw std::bad_alloc(); + #endif + } + + return r; + } + +#ifndef PUGIXML_NO_STL + PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const + { + if (!_impl) return string_t(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + impl::xpath_string r = static_cast(_impl)->root->eval_string(c, sd.stack); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return string_t(); + #else + throw std::bad_alloc(); + #endif + } + + return string_t(r.c_str(), r.length()); + } +#endif + + PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const + { + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + impl::xpath_string r = _impl ? static_cast(_impl)->root->eval_string(c, sd.stack) : impl::xpath_string(); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + r = impl::xpath_string(); + #else + throw std::bad_alloc(); + #endif + } + + size_t full_size = r.length() + 1; + + if (capacity > 0) + { + size_t size = (full_size < capacity) ? full_size : capacity; + assert(size > 0); + + memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t)); + buffer[size - 1] = 0; + } + + return full_size; + } + + PUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const + { + impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast(_impl)); + if (!root) return xpath_node_set(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return xpath_node_set(); + #else + throw std::bad_alloc(); + #endif + } + + return xpath_node_set(r.begin(), r.end(), r.type()); + } + + PUGI__FN xpath_node xpath_query::evaluate_node(const xpath_node& n) const + { + impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast(_impl)); + if (!root) return xpath_node(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return xpath_node(); + #else + throw std::bad_alloc(); + #endif + } + + return r.first(); + } + + PUGI__FN const xpath_parse_result& xpath_query::result() const + { + return _result; + } + + PUGI__FN static void unspecified_bool_xpath_query(xpath_query***) + { + } + + PUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const + { + return _impl ? unspecified_bool_xpath_query : 0; + } + + PUGI__FN bool xpath_query::operator!() const + { + return !_impl; + } + + PUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return q.evaluate_node(*this); + } + + PUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const + { + return query.evaluate_node(*this); + } + + PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return q.evaluate_node_set(*this); + } + + PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const + { + return query.evaluate_node_set(*this); + } + + PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return q.evaluate_node(*this); + } + + PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const + { + return query.evaluate_node(*this); + } +} + +#endif + +#ifdef __BORLANDC__ +# pragma option pop +#endif + +// Intel C++ does not properly keep warning state for function templates, +// so popping warning state at the end of translation unit leads to warnings in the middle. +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) +# pragma warning(pop) +#endif + +#if defined(_MSC_VER) && defined(__c2__) +# pragma clang diagnostic pop +#endif + +// Undefine all local macros (makes sure we're not leaking macros in header-only mode) +#undef PUGI__NO_INLINE +#undef PUGI__UNLIKELY +#undef PUGI__STATIC_ASSERT +#undef PUGI__DMC_VOLATILE +#undef PUGI__UNSIGNED_OVERFLOW +#undef PUGI__MSVC_CRT_VERSION +#undef PUGI__SNPRINTF +#undef PUGI__NS_BEGIN +#undef PUGI__NS_END +#undef PUGI__FN +#undef PUGI__FN_NO_INLINE +#undef PUGI__GETHEADER_IMPL +#undef PUGI__GETPAGE_IMPL +#undef PUGI__GETPAGE +#undef PUGI__NODETYPE +#undef PUGI__IS_CHARTYPE_IMPL +#undef PUGI__IS_CHARTYPE +#undef PUGI__IS_CHARTYPEX +#undef PUGI__ENDSWITH +#undef PUGI__SKIPWS +#undef PUGI__OPTSET +#undef PUGI__PUSHNODE +#undef PUGI__POPNODE +#undef PUGI__SCANFOR +#undef PUGI__SCANWHILE +#undef PUGI__SCANWHILE_UNROLL +#undef PUGI__ENDSEG +#undef PUGI__THROW_ERROR +#undef PUGI__CHECK_ERROR + +#endif + +/** + * Copyright (c) 2006-2020 Arseny Kapoulkine + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ diff --git a/tools/msgenc/pugixml.hpp b/tools/msgenc/pugixml.hpp new file mode 100644 index 00000000..7e2ce777 --- /dev/null +++ b/tools/msgenc/pugixml.hpp @@ -0,0 +1,1499 @@ +/** + * pugixml parser - version 1.11 + * -------------------------------------------------------- + * Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef PUGIXML_VERSION +// Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons +// Note: pugixml used major * 100 + minor * 10 + patch format up until 1.9 (which had version identifier 190); starting from pugixml 1.10, the minor version number is two digits +# define PUGIXML_VERSION 1110 +#endif + +// Include user configuration file (this can define various configuration macros) +#include "pugiconfig.hpp" + +#ifndef HEADER_PUGIXML_HPP +#define HEADER_PUGIXML_HPP + +// Include stddef.h for size_t and ptrdiff_t +#include + +// Include exception header for XPath +#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) +# include +#endif + +// Include STL headers +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// Macro for deprecated features +#ifndef PUGIXML_DEPRECATED +# if defined(__GNUC__) +# define PUGIXML_DEPRECATED __attribute__((deprecated)) +# elif defined(_MSC_VER) && _MSC_VER >= 1300 +# define PUGIXML_DEPRECATED __declspec(deprecated) +# else +# define PUGIXML_DEPRECATED +# endif +#endif + +// If no API is defined, assume default +#ifndef PUGIXML_API +# define PUGIXML_API +#endif + +// If no API for classes is defined, assume default +#ifndef PUGIXML_CLASS +# define PUGIXML_CLASS PUGIXML_API +#endif + +// If no API for functions is defined, assume default +#ifndef PUGIXML_FUNCTION +# define PUGIXML_FUNCTION PUGIXML_API +#endif + +// If the platform is known to have long long support, enable long long functions +#ifndef PUGIXML_HAS_LONG_LONG +# if __cplusplus >= 201103 +# define PUGIXML_HAS_LONG_LONG +# elif defined(_MSC_VER) && _MSC_VER >= 1400 +# define PUGIXML_HAS_LONG_LONG +# endif +#endif + +// If the platform is known to have move semantics support, compile move ctor/operator implementation +#ifndef PUGIXML_HAS_MOVE +# if __cplusplus >= 201103 +# define PUGIXML_HAS_MOVE +# elif defined(_MSC_VER) && _MSC_VER >= 1600 +# define PUGIXML_HAS_MOVE +# endif +#endif + +// If C++ is 2011 or higher, add 'noexcept' specifiers +#ifndef PUGIXML_NOEXCEPT +# if __cplusplus >= 201103 +# define PUGIXML_NOEXCEPT noexcept +# elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define PUGIXML_NOEXCEPT noexcept +# else +# define PUGIXML_NOEXCEPT +# endif +#endif + +// Some functions can not be noexcept in compact mode +#ifdef PUGIXML_COMPACT +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT +#else +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT +#endif + +// If C++ is 2011 or higher, add 'override' qualifiers +#ifndef PUGIXML_OVERRIDE +# if __cplusplus >= 201103 +# define PUGIXML_OVERRIDE override +# elif defined(_MSC_VER) && _MSC_VER >= 1700 +# define PUGIXML_OVERRIDE override +# else +# define PUGIXML_OVERRIDE +# endif +#endif + +// If C++ is 2011 or higher, use 'nullptr' +#ifndef PUGIXML_NULL +# if __cplusplus >= 201103 +# define PUGIXML_NULL nullptr +# else +# define PUGIXML_NULL 0 +# endif +#endif + +// Character interface macros +#ifdef PUGIXML_WCHAR_MODE +# define PUGIXML_TEXT(t) L ## t +# define PUGIXML_CHAR wchar_t +#else +# define PUGIXML_TEXT(t) t +# define PUGIXML_CHAR char +#endif + +namespace pugi +{ + // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE + typedef PUGIXML_CHAR char_t; + +#ifndef PUGIXML_NO_STL + // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE + typedef std::basic_string, std::allocator > string_t; +#endif +} + +// The PugiXML namespace +namespace pugi +{ + // Tree node types + enum xml_node_type + { + node_null, // Empty (null) node handle + node_document, // A document tree's absolute root + node_element, // Element tag, i.e. '' + node_pcdata, // Plain character data, i.e. 'text' + node_cdata, // Character data, i.e. '' + node_comment, // Comment tag, i.e. '' + node_pi, // Processing instruction, i.e. '' + node_declaration, // Document declaration, i.e. '' + node_doctype // Document type declaration, i.e. '' + }; + + // Parsing options + + // Minimal parsing mode (equivalent to turning all other flags off). + // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. + const unsigned int parse_minimal = 0x0000; + + // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. + const unsigned int parse_pi = 0x0001; + + // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. + const unsigned int parse_comments = 0x0002; + + // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. + const unsigned int parse_cdata = 0x0004; + + // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. + // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata = 0x0008; + + // This flag determines if character and entity references are expanded during parsing. This flag is on by default. + const unsigned int parse_escapes = 0x0010; + + // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. + const unsigned int parse_eol = 0x0020; + + // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. + const unsigned int parse_wconv_attribute = 0x0040; + + // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. + const unsigned int parse_wnorm_attribute = 0x0080; + + // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. + const unsigned int parse_declaration = 0x0100; + + // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. + const unsigned int parse_doctype = 0x0200; + + // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only + // of whitespace is added to the DOM tree. + // This flag is off by default; turning it on may result in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata_single = 0x0400; + + // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. + const unsigned int parse_trim_pcdata = 0x0800; + + // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document + // is a valid document. This flag is off by default. + const unsigned int parse_fragment = 0x1000; + + // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of + // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. + // This flag is off by default. + const unsigned int parse_embed_pcdata = 0x2000; + + // The default parsing mode. + // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; + + // The full parsing mode. + // Nodes of all types are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; + + // These flags determine the encoding of input data for XML document + enum xml_encoding + { + encoding_auto, // Auto-detect input encoding using BOM or < / class xml_object_range + { + public: + typedef It const_iterator; + typedef It iterator; + + xml_object_range(It b, It e): _begin(b), _end(e) + { + } + + It begin() const { return _begin; } + It end() const { return _end; } + + private: + It _begin, _end; + }; + + // Writer interface for node printing (see xml_node::print) + class PUGIXML_CLASS xml_writer + { + public: + virtual ~xml_writer() {} + + // Write memory chunk into stream/file/whatever + virtual void write(const void* data, size_t size) = 0; + }; + + // xml_writer implementation for FILE* + class PUGIXML_CLASS xml_writer_file: public xml_writer + { + public: + // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio + xml_writer_file(void* file); + + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; + + private: + void* file; + }; + + #ifndef PUGIXML_NO_STL + // xml_writer implementation for streams + class PUGIXML_CLASS xml_writer_stream: public xml_writer + { + public: + // Construct writer from an output stream object + xml_writer_stream(std::basic_ostream >& stream); + xml_writer_stream(std::basic_ostream >& stream); + + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; + + private: + std::basic_ostream >* narrow_stream; + std::basic_ostream >* wide_stream; + }; + #endif + + // A light-weight handle for manipulating attributes in DOM tree + class PUGIXML_CLASS xml_attribute + { + friend class xml_attribute_iterator; + friend class xml_node; + + private: + xml_attribute_struct* _attr; + + typedef void (*unspecified_bool_type)(xml_attribute***); + + public: + // Default constructor. Constructs an empty attribute. + xml_attribute(); + + // Constructs attribute from internal pointer + explicit xml_attribute(xml_attribute_struct* attr); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped attribute pointers) + bool operator==(const xml_attribute& r) const; + bool operator!=(const xml_attribute& r) const; + bool operator<(const xml_attribute& r) const; + bool operator>(const xml_attribute& r) const; + bool operator<=(const xml_attribute& r) const; + bool operator>=(const xml_attribute& r) const; + + // Check if attribute is empty + bool empty() const; + + // Get attribute name/value, or "" if attribute is empty + const char_t* name() const; + const char_t* value() const; + + // Get attribute value, or the default value if attribute is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty + bool as_bool(bool def = false) const; + + // Set attribute name/value (returns false if attribute is empty or there is not enough memory) + bool set_name(const char_t* rhs); + bool set_value(const char_t* rhs); + + // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set_value(int rhs); + bool set_value(unsigned int rhs); + bool set_value(long rhs); + bool set_value(unsigned long rhs); + bool set_value(double rhs); + bool set_value(double rhs, int precision); + bool set_value(float rhs); + bool set_value(float rhs, int precision); + bool set_value(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set_value(long long rhs); + bool set_value(unsigned long long rhs); + #endif + + // Set attribute value (equivalent to set_value without error checking) + xml_attribute& operator=(const char_t* rhs); + xml_attribute& operator=(int rhs); + xml_attribute& operator=(unsigned int rhs); + xml_attribute& operator=(long rhs); + xml_attribute& operator=(unsigned long rhs); + xml_attribute& operator=(double rhs); + xml_attribute& operator=(float rhs); + xml_attribute& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_attribute& operator=(long long rhs); + xml_attribute& operator=(unsigned long long rhs); + #endif + + // Get next/previous attribute in the attribute list of the parent node + xml_attribute next_attribute() const; + xml_attribute previous_attribute() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_attribute_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs); +#endif + + // A light-weight handle for manipulating nodes in DOM tree + class PUGIXML_CLASS xml_node + { + friend class xml_attribute_iterator; + friend class xml_node_iterator; + friend class xml_named_node_iterator; + + protected: + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_node***); + + public: + // Default constructor. Constructs an empty node. + xml_node(); + + // Constructs node from internal pointer + explicit xml_node(xml_node_struct* p); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped node pointers) + bool operator==(const xml_node& r) const; + bool operator!=(const xml_node& r) const; + bool operator<(const xml_node& r) const; + bool operator>(const xml_node& r) const; + bool operator<=(const xml_node& r) const; + bool operator>=(const xml_node& r) const; + + // Check if node is empty. + bool empty() const; + + // Get node type + xml_node_type type() const; + + // Get node name, or "" if node is empty or it has no name + const char_t* name() const; + + // Get node value, or "" if node is empty or it has no value + // Note: For text node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. + const char_t* value() const; + + // Get attribute list + xml_attribute first_attribute() const; + xml_attribute last_attribute() const; + + // Get children list + xml_node first_child() const; + xml_node last_child() const; + + // Get next/previous sibling in the children list of the parent node + xml_node next_sibling() const; + xml_node previous_sibling() const; + + // Get parent node + xml_node parent() const; + + // Get root of DOM tree this node belongs to + xml_node root() const; + + // Get text object for the current node + xml_text text() const; + + // Get child, attribute or next/previous sibling with the specified name + xml_node child(const char_t* name) const; + xml_attribute attribute(const char_t* name) const; + xml_node next_sibling(const char_t* name) const; + xml_node previous_sibling(const char_t* name) const; + + // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast) + xml_attribute attribute(const char_t* name, xml_attribute& hint) const; + + // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA + const char_t* child_value() const; + + // Get child value of child with specified name. Equivalent to child(name).child_value(). + const char_t* child_value(const char_t* name) const; + + // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) + bool set_name(const char_t* rhs); + bool set_value(const char_t* rhs); + + // Add attribute with specified name. Returns added attribute, or empty attribute on errors. + xml_attribute append_attribute(const char_t* name); + xml_attribute prepend_attribute(const char_t* name); + xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr); + xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr); + + // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors. + xml_attribute append_copy(const xml_attribute& proto); + xml_attribute prepend_copy(const xml_attribute& proto); + xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr); + xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr); + + // Add child node with specified type. Returns added node, or empty node on errors. + xml_node append_child(xml_node_type type = node_element); + xml_node prepend_child(xml_node_type type = node_element); + xml_node insert_child_after(xml_node_type type, const xml_node& node); + xml_node insert_child_before(xml_node_type type, const xml_node& node); + + // Add child element with specified name. Returns added node, or empty node on errors. + xml_node append_child(const char_t* name); + xml_node prepend_child(const char_t* name); + xml_node insert_child_after(const char_t* name, const xml_node& node); + xml_node insert_child_before(const char_t* name, const xml_node& node); + + // Add a copy of the specified node as a child. Returns added node, or empty node on errors. + xml_node append_copy(const xml_node& proto); + xml_node prepend_copy(const xml_node& proto); + xml_node insert_copy_after(const xml_node& proto, const xml_node& node); + xml_node insert_copy_before(const xml_node& proto, const xml_node& node); + + // Move the specified node to become a child of this node. Returns moved node, or empty node on errors. + xml_node append_move(const xml_node& moved); + xml_node prepend_move(const xml_node& moved); + xml_node insert_move_after(const xml_node& moved, const xml_node& node); + xml_node insert_move_before(const xml_node& moved, const xml_node& node); + + // Remove specified attribute + bool remove_attribute(const xml_attribute& a); + bool remove_attribute(const char_t* name); + + // Remove all attributes + bool remove_attributes(); + + // Remove specified child + bool remove_child(const xml_node& n); + bool remove_child(const char_t* name); + + // Remove all children + bool remove_children(); + + // Parses buffer as an XML document fragment and appends all nodes as children of the current node. + // Copies/converts the buffer, so it may be deleted or changed after the function returns. + // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory. + xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Find attribute using predicate. Returns first attribute for which predicate returned true. + template xml_attribute find_attribute(Predicate pred) const + { + if (!_root) return xml_attribute(); + + for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) + if (pred(attrib)) + return attrib; + + return xml_attribute(); + } + + // Find child node using predicate. Returns first child for which predicate returned true. + template xml_node find_child(Predicate pred) const + { + if (!_root) return xml_node(); + + for (xml_node node = first_child(); node; node = node.next_sibling()) + if (pred(node)) + return node; + + return xml_node(); + } + + // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true. + template xml_node find_node(Predicate pred) const + { + if (!_root) return xml_node(); + + xml_node cur = first_child(); + + while (cur._root && cur._root != _root) + { + if (pred(cur)) return cur; + + if (cur.first_child()) cur = cur.first_child(); + else if (cur.next_sibling()) cur = cur.next_sibling(); + else + { + while (!cur.next_sibling() && cur._root != _root) cur = cur.parent(); + + if (cur._root != _root) cur = cur.next_sibling(); + } + } + + return xml_node(); + } + + // Find child node by attribute name/value + xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const; + xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const; + + #ifndef PUGIXML_NO_STL + // Get the absolute node path from root as a text string. + string_t path(char_t delimiter = '/') const; + #endif + + // Search for a node by path consisting of node names and . or .. elements. + xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const; + + // Recursively traverse subtree with xml_tree_walker + bool traverse(xml_tree_walker& walker); + + #ifndef PUGIXML_NO_XPATH + // Select single node by evaluating XPath query. Returns first node from the resulting node set. + xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + xpath_node select_node(const xpath_query& query) const; + + // Select node set by evaluating XPath query + xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + xpath_node_set select_nodes(const xpath_query& query) const; + + // (deprecated: use select_node instead) Select single node by evaluating XPath query. + PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const; + + #endif + + // Print subtree using a writer object + void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + + #ifndef PUGIXML_NO_STL + // Print subtree to stream + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const; + #endif + + // Child nodes iterators + typedef xml_node_iterator iterator; + + iterator begin() const; + iterator end() const; + + // Attribute iterators + typedef xml_attribute_iterator attribute_iterator; + + attribute_iterator attributes_begin() const; + attribute_iterator attributes_end() const; + + // Range-based for support + xml_object_range children() const; + xml_object_range children(const char_t* name) const; + xml_object_range attributes() const; + + // Get node offset in parsed file/string (in char_t units) for debugging purposes + ptrdiff_t offset_debug() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_node_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs); +#endif + + // A helper for working with text inside PCDATA nodes + class PUGIXML_CLASS xml_text + { + friend class xml_node; + + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_text***); + + explicit xml_text(xml_node_struct* root); + + xml_node_struct* _data_new(); + xml_node_struct* _data() const; + + public: + // Default constructor. Constructs an empty object. + xml_text(); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Check if text object is empty + bool empty() const; + + // Get text, or "" if object is empty + const char_t* get() const; + + // Get text, or the default value if object is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get text as a number, or the default value if conversion did not succeed or object is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty + bool as_bool(bool def = false) const; + + // Set text (returns false if object is empty or there is not enough memory) + bool set(const char_t* rhs); + + // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set(int rhs); + bool set(unsigned int rhs); + bool set(long rhs); + bool set(unsigned long rhs); + bool set(double rhs); + bool set(double rhs, int precision); + bool set(float rhs); + bool set(float rhs, int precision); + bool set(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set(long long rhs); + bool set(unsigned long long rhs); + #endif + + // Set text (equivalent to set without error checking) + xml_text& operator=(const char_t* rhs); + xml_text& operator=(int rhs); + xml_text& operator=(unsigned int rhs); + xml_text& operator=(long rhs); + xml_text& operator=(unsigned long rhs); + xml_text& operator=(double rhs); + xml_text& operator=(float rhs); + xml_text& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_text& operator=(long long rhs); + xml_text& operator=(unsigned long long rhs); + #endif + + // Get the data node (node_pcdata or node_cdata) for this object + xml_node data() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs); +#endif + + // Child node iterator (a bidirectional iterator over a collection of xml_node) + class PUGIXML_CLASS xml_node_iterator + { + friend class xml_node; + + private: + mutable xml_node _wrap; + xml_node _parent; + + xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_node_iterator(); + + // Construct an iterator which points to the specified node + xml_node_iterator(const xml_node& node); + + // Iterator operators + bool operator==(const xml_node_iterator& rhs) const; + bool operator!=(const xml_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + const xml_node_iterator& operator++(); + xml_node_iterator operator++(int); + + const xml_node_iterator& operator--(); + xml_node_iterator operator--(int); + }; + + // Attribute iterator (a bidirectional iterator over a collection of xml_attribute) + class PUGIXML_CLASS xml_attribute_iterator + { + friend class xml_node; + + private: + mutable xml_attribute _wrap; + xml_node _parent; + + xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_attribute value_type; + typedef xml_attribute* pointer; + typedef xml_attribute& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_attribute_iterator(); + + // Construct an iterator which points to the specified attribute + xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); + + // Iterator operators + bool operator==(const xml_attribute_iterator& rhs) const; + bool operator!=(const xml_attribute_iterator& rhs) const; + + xml_attribute& operator*() const; + xml_attribute* operator->() const; + + const xml_attribute_iterator& operator++(); + xml_attribute_iterator operator++(int); + + const xml_attribute_iterator& operator--(); + xml_attribute_iterator operator--(int); + }; + + // Named node range helper + class PUGIXML_CLASS xml_named_node_iterator + { + friend class xml_node; + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_named_node_iterator(); + + // Construct an iterator which points to the specified node + xml_named_node_iterator(const xml_node& node, const char_t* name); + + // Iterator operators + bool operator==(const xml_named_node_iterator& rhs) const; + bool operator!=(const xml_named_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + const xml_named_node_iterator& operator++(); + xml_named_node_iterator operator++(int); + + const xml_named_node_iterator& operator--(); + xml_named_node_iterator operator--(int); + + private: + mutable xml_node _wrap; + xml_node _parent; + const char_t* _name; + + xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name); + }; + + // Abstract tree walker class (see xml_node::traverse) + class PUGIXML_CLASS xml_tree_walker + { + friend class xml_node; + + private: + int _depth; + + protected: + // Get current traversal depth + int depth() const; + + public: + xml_tree_walker(); + virtual ~xml_tree_walker(); + + // Callback that is called when traversal begins + virtual bool begin(xml_node& node); + + // Callback that is called for each node traversed + virtual bool for_each(xml_node& node) = 0; + + // Callback that is called when traversal ends + virtual bool end(xml_node& node); + }; + + // Parsing status, returned as part of xml_parse_result object + enum xml_parse_status + { + status_ok = 0, // No error + + status_file_not_found, // File was not found during load_file() + status_io_error, // Error reading from file/stream + status_out_of_memory, // Could not allocate memory + status_internal_error, // Internal error occurred + + status_unrecognized_tag, // Parser could not determine tag type + + status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction + status_bad_comment, // Parsing error occurred while parsing comment + status_bad_cdata, // Parsing error occurred while parsing CDATA section + status_bad_doctype, // Parsing error occurred while parsing document type declaration + status_bad_pcdata, // Parsing error occurred while parsing PCDATA section + status_bad_start_element, // Parsing error occurred while parsing start element tag + status_bad_attribute, // Parsing error occurred while parsing element attribute + status_bad_end_element, // Parsing error occurred while parsing end element tag + status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag) + + status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer) + + status_no_document_element // Parsing resulted in a document without element nodes + }; + + // Parsing result + struct PUGIXML_CLASS xml_parse_result + { + // Parsing status (see xml_parse_status) + xml_parse_status status; + + // Last parsed offset (in char_t units from start of input data) + ptrdiff_t offset; + + // Source document encoding + xml_encoding encoding; + + // Default constructor, initializes object to failed state + xml_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // Document class (DOM tree root) + class PUGIXML_CLASS xml_document: public xml_node + { + private: + char_t* _buffer; + + char _memory[192]; + + // Non-copyable semantics + xml_document(const xml_document&); + xml_document& operator=(const xml_document&); + + void _create(); + void _destroy(); + void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + + public: + // Default constructor, makes empty document + xml_document(); + + // Destructor, invalidates all node/attribute handles to this document + ~xml_document(); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + #endif + + // Removes all nodes, leaving the empty document + void reset(); + + // Removes all nodes, then copies the entire contents of the specified document + void reset(const xml_document& proto); + + #ifndef PUGIXML_NO_STL + // Load document from stream. + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default); + #endif + + // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. + PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default); + + // Load document from zero-terminated string. No encoding conversions are applied. + xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); + + // Load document from file + xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns. + xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed. + xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore). + xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details). + void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + #ifndef PUGIXML_NO_STL + // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details). + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const; + #endif + + // Save XML to file + bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + // Get document element + xml_node document_element() const; + }; + +#ifndef PUGIXML_NO_XPATH + // XPath query return type + enum xpath_value_type + { + xpath_type_none, // Unknown type (query failed to compile) + xpath_type_node_set, // Node set (xpath_node_set) + xpath_type_number, // Number + xpath_type_string, // String + xpath_type_boolean // Boolean + }; + + // XPath parsing result + struct PUGIXML_CLASS xpath_parse_result + { + // Error message (0 if no error) + const char* error; + + // Last parsed offset (in char_t units from string start) + ptrdiff_t offset; + + // Default constructor, initializes object to failed state + xpath_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // A single XPath variable + class PUGIXML_CLASS xpath_variable + { + friend class xpath_variable_set; + + protected: + xpath_value_type _type; + xpath_variable* _next; + + xpath_variable(xpath_value_type type); + + // Non-copyable semantics + xpath_variable(const xpath_variable&); + xpath_variable& operator=(const xpath_variable&); + + public: + // Get variable name + const char_t* name() const; + + // Get variable type + xpath_value_type type() const; + + // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error + bool get_boolean() const; + double get_number() const; + const char_t* get_string() const; + const xpath_node_set& get_node_set() const; + + // Set variable value; no type conversion is performed, false is returned on type mismatch error + bool set(bool value); + bool set(double value); + bool set(const char_t* value); + bool set(const xpath_node_set& value); + }; + + // A set of XPath variables + class PUGIXML_CLASS xpath_variable_set + { + private: + xpath_variable* _data[64]; + + void _assign(const xpath_variable_set& rhs); + void _swap(xpath_variable_set& rhs); + + xpath_variable* _find(const char_t* name) const; + + static bool _clone(xpath_variable* var, xpath_variable** out_result); + static void _destroy(xpath_variable* var); + + public: + // Default constructor/destructor + xpath_variable_set(); + ~xpath_variable_set(); + + // Copy constructor/assignment operator + xpath_variable_set(const xpath_variable_set& rhs); + xpath_variable_set& operator=(const xpath_variable_set& rhs); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; + xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Add a new variable or get the existing one, if the types match + xpath_variable* add(const char_t* name, xpath_value_type type); + + // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch + bool set(const char_t* name, bool value); + bool set(const char_t* name, double value); + bool set(const char_t* name, const char_t* value); + bool set(const char_t* name, const xpath_node_set& value); + + // Get existing variable by name + xpath_variable* get(const char_t* name); + const xpath_variable* get(const char_t* name) const; + }; + + // A compiled XPath query object + class PUGIXML_CLASS xpath_query + { + private: + void* _impl; + xpath_parse_result _result; + + typedef void (*unspecified_bool_type)(xpath_query***); + + // Non-copyable semantics + xpath_query(const xpath_query&); + xpath_query& operator=(const xpath_query&); + + public: + // Construct a compiled object from XPath expression. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. + explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL); + + // Constructor + xpath_query(); + + // Destructor + ~xpath_query(); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT; + xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Get query expression return type + xpath_value_type return_type() const; + + // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + bool evaluate_boolean(const xpath_node& n) const; + + // Evaluate expression as double value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + double evaluate_number(const xpath_node& n) const; + + #ifndef PUGIXML_NO_STL + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + string_t evaluate_string(const xpath_node& n) const; + #endif + + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead. + size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead. + xpath_node_set evaluate_node_set(const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // Return first node in document order, or empty node if node set is empty. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead. + xpath_node evaluate_node(const xpath_node& n) const; + + // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode) + const xpath_parse_result& result() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + }; + + #ifndef PUGIXML_NO_EXCEPTIONS + #if defined(_MSC_VER) + // C4275 can be ignored in Visual C++ if you are deriving + // from a type in the Standard C++ Library + #pragma warning(push) + #pragma warning(disable: 4275) + #endif + // XPath exception class + class PUGIXML_CLASS xpath_exception: public std::exception + { + private: + xpath_parse_result _result; + + public: + // Construct exception from parse result + explicit xpath_exception(const xpath_parse_result& result); + + // Get error message + virtual const char* what() const throw() PUGIXML_OVERRIDE; + + // Get parse result + const xpath_parse_result& result() const; + }; + #if defined(_MSC_VER) + #pragma warning(pop) + #endif + #endif + + // XPath node class (either xml_node or xml_attribute) + class PUGIXML_CLASS xpath_node + { + private: + xml_node _node; + xml_attribute _attribute; + + typedef void (*unspecified_bool_type)(xpath_node***); + + public: + // Default constructor; constructs empty XPath node + xpath_node(); + + // Construct XPath node from XML node/attribute + xpath_node(const xml_node& node); + xpath_node(const xml_attribute& attribute, const xml_node& parent); + + // Get node/attribute, if any + xml_node node() const; + xml_attribute attribute() const; + + // Get parent of contained node/attribute + xml_node parent() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators + bool operator==(const xpath_node& n) const; + bool operator!=(const xpath_node& n) const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs); +#endif + + // A fixed-size collection of XPath nodes + class PUGIXML_CLASS xpath_node_set + { + public: + // Collection type + enum type_t + { + type_unsorted, // Not ordered + type_sorted, // Sorted by document order (ascending) + type_sorted_reverse // Sorted by document order (descending) + }; + + // Constant iterator type + typedef const xpath_node* const_iterator; + + // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work + typedef const xpath_node* iterator; + + // Default constructor. Constructs empty set. + xpath_node_set(); + + // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful + xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); + + // Destructor + ~xpath_node_set(); + + // Copy constructor/assignment operator + xpath_node_set(const xpath_node_set& ns); + xpath_node_set& operator=(const xpath_node_set& ns); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; + xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Get collection type + type_t type() const; + + // Get collection size + size_t size() const; + + // Indexing operator + const xpath_node& operator[](size_t index) const; + + // Collection iterators + const_iterator begin() const; + const_iterator end() const; + + // Sort the collection in ascending/descending order by document order + void sort(bool reverse = false); + + // Get first node in the collection by document order + xpath_node first() const; + + // Check if collection is empty + bool empty() const; + + private: + type_t _type; + + xpath_node _storage[1]; + + xpath_node* _begin; + xpath_node* _end; + + void _assign(const_iterator begin, const_iterator end, type_t type); + void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT; + }; +#endif + +#ifndef PUGIXML_NO_STL + // Convert wide string to UTF8 + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); + + // Convert UTF8 to wide string + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& str); +#endif + + // Memory allocation function interface; returns pointer to allocated memory or NULL on failure + typedef void* (*allocation_function)(size_t size); + + // Memory deallocation function interface + typedef void (*deallocation_function)(void* ptr); + + // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. + void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); + + // Get current memory management functions + allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); + deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); +} + +#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) +namespace std +{ + // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&); +} +#endif + +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&); +} +#endif + +#endif + +// Make sure implementation is included in header-only mode +// Use macro expansion in #include to work around QMake (QTBUG-11923) +#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) +# define PUGIXML_SOURCE "pugixml.cpp" +# include PUGIXML_SOURCE +#endif + +/** + * Copyright (c) 2006-2020 Arseny Kapoulkine + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ diff --git a/tools/msgenc/util.h b/tools/msgenc/util.h new file mode 100644 index 00000000..53602d54 --- /dev/null +++ b/tools/msgenc/util.h @@ -0,0 +1,35 @@ +#ifndef GUARD_UTIL_H +#define GUARD_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +static inline __attribute__((format(printf, 1, 2))) void debug_printf(const char *fmt, ...) { +#ifndef NDEBUG + fputs("DEBUG: ", stderr); + va_list va_args; + va_start(va_args, fmt); + vfprintf(stderr, fmt, va_args); + va_end(va_args); +#endif //NDEBUG +} + +static inline __attribute__((format(printf, 1, 2))) void error_printf(const char *fmt, ...) { + fputs("ERROR: ", stderr); + va_list va_args; + va_start(va_args, fmt); + vfprintf(stderr, fmt, va_args); + va_end(va_args); + exit(1); +} + +#ifdef __cplusplus +} +#endif + +#endif //GUARD_UTIL_H diff --git a/tools/mwasmarm_patcher/.gitignore b/tools/mwasmarm_patcher/.gitignore new file mode 100644 index 00000000..c9b889c5 --- /dev/null +++ b/tools/mwasmarm_patcher/.gitignore @@ -0,0 +1 @@ +mwasmarm_patcher diff --git a/tools/mwasmarm_patcher/Makefile b/tools/mwasmarm_patcher/Makefile new file mode 100644 index 00000000..ffdf82d9 --- /dev/null +++ b/tools/mwasmarm_patcher/Makefile @@ -0,0 +1,14 @@ +.PHONY: all clean + +CC := gcc +CFLAGS := -O3 + +.PHONY: all clean + +all: mwasmarm_patcher + @: + +clean: ; $(RM) mwasmarm_patcher$(EXE) + +mwasmarm_patcher: mwasmarm_patcher.c + $(CC) $(CFLAGS) -o $@ $< diff --git a/tools/mwasmarm_patcher/mwasmarm_patcher.c b/tools/mwasmarm_patcher/mwasmarm_patcher.c new file mode 100644 index 00000000..7a1273d9 --- /dev/null +++ b/tools/mwasmarm_patcher/mwasmarm_patcher.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include +#include + +// mwasmarm patcher v1.2 +// Patches the Metrowerk C compiler assembler to stop the line ending bug and the 0x400 incbin bug. + +// Changelog: +// v1.1: Added patch definitions and looped over them to find the matching +// definition as well as the version. +// v1.2: Switched to array system for applying multiple patches for compiler +// versions and added 0x400 incbin fix for each version. + +struct PatchPair { + int offsetPatch; + int newByte; +}; + +struct PatchDef { + char *version; + char *sha1before; + char *sha1after; + struct PatchPair *patches; +}; + +// Patch definitions for each of the respective assembler versions. +struct PatchPair g12BasePatches[] = { + { 0x57614, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +struct PatchPair g20BasePatches[] = { + { 0x57644, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +struct PatchPair g20sp2p4Patches[] = { + { 0x57834, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +// Table of definitions for each assembler version +struct PatchDef gPatchDefs[] = { + // mwasmarm 1.2/base definition + { + "mwasmarm 1.2/base", + "87f942cc0a0e90e73550d8d6f3fffcdeb5f69fa5", + "3395ac5decf49135d892e93a3e6dd38676025983", + g12BasePatches + }, + // mwasmarm 2.0/base definition + { + "mwasmarm 2.0/base", + "9d63877c776245129b4727b41d3e9e63cfc9cd28", + "ef75c3fb9f8d90cb4881386c41d8dc3ab4de7153", + g20BasePatches + }, + // mwasmarm 2.0/sp2p4 definition + { + "mwasmarm 2.0/sp2p4", + "448cb0c7f1ace4393e9a9562f819f7a9f049be83", + "caa84dd90b1987ab7b42749bd5c9dcfdcfef59f3", + g20sp2p4Patches + }, + {0} +}; + +// --------------------------------------------------------- +// Credit to ax6 for implementation of sha1 hash functions +// --------------------------------------------------------- + +void sha1_process_block (const unsigned char * block, uint32_t * state); + +unsigned char * calculate_sha1 (const void * data, unsigned length) { + uint32_t state[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; + const char * current; + unsigned remaining; + for (current = data, remaining = length; remaining >= 64; current += 64, remaining -= 64) sha1_process_block((const uint8_t *)current, state); + // technically only {0} is necessary, but better safe than sorry + unsigned char last_block[64] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + memcpy(last_block, current, remaining); + last_block[remaining] = 0x80; + if (remaining >= 56) { + sha1_process_block(last_block, state); + memset(last_block, 0, 64); + } + unsigned long long bit_length = ((unsigned long long) length) << 3; + for (remaining = 5; remaining; remaining --) { + last_block[58 + remaining] = bit_length; + bit_length >>= 8; + } + sha1_process_block(last_block, state); + unsigned char * result = malloc(20); + for (remaining = 0; remaining < 20; remaining ++) result[remaining] = state[remaining >> 2] >> ((~remaining & 3) << 3); + return result; +} + +static inline unsigned sha1_rotate (unsigned value, unsigned count) { + return (value << count) | (value >> (32 - count)); +} + +void sha1_process_block (const unsigned char * block, uint32_t * state) { + uint32_t words[80]; + unsigned pos, temp, count, a, b, c, d, e; + // constants used by SHA-1; they are actually simply the square roots of 2, 3, 5 and 10 as a fixed-point number (2.30 format) + const uint32_t hash_constants[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6}; + memset(words, 0, 16 * sizeof(uint32_t)); + for (pos = 0; pos < 64; pos ++) words[pos >> 2] = (words[pos >> 2] << 8) | block[pos]; + for (pos = 16; pos < 80; pos ++) words[pos] = sha1_rotate(words[pos - 3] ^ words[pos - 8] ^ words[pos - 14] ^ words[pos - 16], 1); + a = *state; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + for (pos = 0; pos < 4; pos ++) for (count = 0; count < 20; count ++) { + temp = sha1_rotate(a, 5) + e + words[pos * 20 + count] + hash_constants[pos]; + switch (pos) { + case 0: + temp += (b & c) | (~b & d); + break; + case 2: + temp += (b & c) | (b & d) | (c & d); + break; + default: + temp += b ^ c ^ d; + } + e = d; + d = c; + c = sha1_rotate(b, 30); + b = a; + a = temp; + } + *state += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; +} + +// --------------------------------------------------------- +// ax6 code end +// --------------------------------------------------------- + +__attribute__((format(printf, 1, 2))) +void fatal_printf(char *str, ...) { + va_list args; + va_start(args, str); + vprintf(str, args); + va_end(args); + exit(1); +} + +// return size in bytes +int get_file_size (FILE * fp) { + int curpos = ftell(fp); + fseek(fp, 0, SEEK_END); + int result = ftell(fp); + fseek(fp, curpos, SEEK_SET); + return result; +} + +#define SHA_DIGEST_LENGTH 20 + +void print_help(void) { + printf("Usage:\n" + "\tmwasmarm_patcher [OPTIONS] FILENAME\n\n" + "Arguments:\n" + "\tFILENAME: path to MWASMARM.exe program\n\n" + "OPTIONS:\n" + "\t-q/--quietly: Suppress verbose output\n" + "\t-h/--help: Print this message and exit\n"); +} + +int main(int argc, char *argv[]) { + int quietly = 0; + char* filename = NULL; + for (int i = 1; i < argc; i++) + { + if (argv[i][0] == '-') { + if (strcmp(argv[i], "-q") == 0 || strcmp(argv[i], "--quietly") == 0) + quietly = 1; + else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { + print_help(); + exit(0); + } + else + { + print_help(); + fatal_printf("Unrecognized option: %s\n", argv[i]); + } + } else if (filename != NULL) { + print_help(); + fatal_printf("Excess filename supplied\n"); + } + else + filename = argv[i]; + } + if (filename == NULL) { + print_help(); + fatal_printf("Missing required argument: filename\n"); + } else { + // Open the file and read it's sha1 hash. + FILE *f = fopen(filename, "rb+"); + if (f == NULL) { + fatal_printf("ERROR: No file detected\n"); + } + int fsize = get_file_size(f); + unsigned char *string = malloc(fsize + 1); + if (string == NULL) { + fatal_printf("ERROR: Failed to allocate string variable\n"); + } + int readvar = fread(string, 1, fsize, f); // var to surpress warning + + // Check if sha1 matches either known assembler hashes. + unsigned char *sha1 = calculate_sha1(string, fsize); + if (sha1 == NULL) { + fatal_printf("ERROR: Failed to retrieve sha1 hash\n"); + } + free(string); + + char buf[(SHA_DIGEST_LENGTH*2)+1]; + for (int i=0; i < SHA_DIGEST_LENGTH; i++) { + sprintf(&(buf[i*2]), "%02x", sha1[i]); + } + free(sha1); + + // loop over each patch definition to attempt to locate a supported version and, if + // needed, apply the patch definitions. + for (int i = 0; gPatchDefs[i].sha1before != NULL; i++) { + // check if already patched for the current loop. + if (!strcmp(buf, gPatchDefs[i].sha1after)) { + if (!quietly) printf("Supported patched version detected (%s): no action needed\n", gPatchDefs[i].version); + return 0; + } else if(!strcmp(buf, gPatchDefs[i].sha1before)) { + // we found an unpatched version: apply the patches. + for (int j = 0; gPatchDefs[i].patches[j].offsetPatch != 0; j++) { + fseek(f, gPatchDefs[i].patches[j].offsetPatch, SEEK_SET); + fputc(gPatchDefs[i].patches[j].newByte, f); + } + if (!quietly) printf("Supported unpatched version detected (%s): assembler patched\n", gPatchDefs[i].version); + return 0; + } + } + // Unable to locate supported version, quitting + fatal_printf("ERROR: Unsupported mwasmarm.exe version\n"); + } + return 0; +} diff --git a/tools/nitrogfx/.gitignore b/tools/nitrogfx/.gitignore new file mode 100644 index 00000000..4379fab8 --- /dev/null +++ b/tools/nitrogfx/.gitignore @@ -0,0 +1 @@ +nitrogfx diff --git a/tools/nitrogfx/LICENSE b/tools/nitrogfx/LICENSE new file mode 100644 index 00000000..b66bf81c --- /dev/null +++ b/tools/nitrogfx/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 YamaArashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/tools/nitrogfx/Makefile b/tools/nitrogfx/Makefile new file mode 100644 index 00000000..c09aef9e --- /dev/null +++ b/tools/nitrogfx/Makefile @@ -0,0 +1,41 @@ +CC = gcc +LD = gcc + +CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK $(shell pkg-config --cflags libpng) + +LIBS = $(shell pkg-config --libs libpng) + +SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c +OBJS = $(SRCS:%.c=%.o) + +.PHONY: all clean + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +ifneq ($(DEBUG),) +CFLAGS += -DDEBUG +endif + +all: nitrogfx + @: + +nitrogfx-debug: DEBUG = 1 +nitrogfx-debug: nitrogfx + +nitrogfx: $(OBJS) + $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) + +%.o: %.c +%.o: %.c $(DEPDIR)/%.d | $(DEPDIR) + $(CC) $(CFLAGS) $(DEPFLAGS) -c -o $@ $< + +clean: + $(RM) -r nitrogfx nitrogfx.exe $(OBJS) $(DEPDIR) + +$(DEPDIR): ; @mkdir -p $@ + +DEPFILES := $(SRCS:%.c=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/nitrogfx/convert_png.c b/tools/nitrogfx/convert_png.c new file mode 100644 index 00000000..efd6989f --- /dev/null +++ b/tools/nitrogfx/convert_png.c @@ -0,0 +1,256 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include +#include "global.h" +#include "convert_png.h" +#include "gfx.h" + +static FILE *PngReadOpen(char *path, png_structp *pngStruct, png_infop *pngInfo) +{ + FILE *fp = fopen(path, "rb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); + + unsigned char sig[8]; + + if (fread(sig, 8, 1, fp) != 1) + FATAL_ERROR("Failed to read PNG signature from \"%s\".\n", path); + + if (png_sig_cmp(sig, 0, 8)) + FATAL_ERROR("\"%s\" does not have a valid PNG signature.\n", path); + + png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if (!png_ptr) + FATAL_ERROR("Failed to create PNG read struct.\n"); + + png_infop info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + FATAL_ERROR("Failed to create PNG info struct.\n"); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Failed to init I/O for reading \"%s\".\n", path); + + png_init_io(png_ptr, fp); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + + *pngStruct = png_ptr; + *pngInfo = info_ptr; + + return fp; +} + +static unsigned char *ConvertBitDepth(unsigned char *src, int srcBitDepth, int destBitDepth, int numPixels) +{ + // Round the number of bits up to the next 8 and divide by 8 to get the number of bytes. + int srcSize = ((numPixels * srcBitDepth + 7) & ~7) / 8; + int destSize = ((numPixels * destBitDepth + 7) & ~7) / 8; + unsigned char *output = calloc(destSize, 1); + unsigned char *dest = output; + int i; + int j; + int destBit = 8 - destBitDepth; + + for (i = 0; i < srcSize; i++) + { + unsigned char srcByte = src[i]; + + for (j = 8 - srcBitDepth; j >= 0; j -= srcBitDepth) + { + unsigned char pixel = (srcByte >> j) % (1 << srcBitDepth); + + if (pixel >= (1 << destBitDepth)) + FATAL_ERROR("Image exceeds the maximum color value for a %ibpp image.\n", destBitDepth); + *dest |= pixel << destBit; + destBit -= destBitDepth; + if (destBit < 0) + { + dest++; + destBit = 8 - destBitDepth; + } + } + } + + return output; +} + +void ReadPng(char *path, struct Image *image) +{ + png_structp png_ptr; + png_infop info_ptr; + + FILE *fp = PngReadOpen(path, &png_ptr, &info_ptr); + + int bit_depth = png_get_bit_depth(png_ptr, info_ptr); + + int color_type = png_get_color_type(png_ptr, info_ptr); + + if (color_type != PNG_COLOR_TYPE_GRAY && color_type != PNG_COLOR_TYPE_PALETTE) + FATAL_ERROR("\"%s\" has an unsupported color type.\n", path); + + // Check if the image has a palette so that we can tell if the colors need to be inverted later. + // Don't read the palette because it's not needed for now. + image->hasPalette = (color_type == PNG_COLOR_TYPE_PALETTE); + + image->width = png_get_image_width(png_ptr, info_ptr); + image->height = png_get_image_height(png_ptr, info_ptr); + + int rowbytes = png_get_rowbytes(png_ptr, info_ptr); + + image->pixels = malloc(image->height * rowbytes); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate pixel buffer.\n"); + + png_bytepp row_pointers = malloc(image->height * sizeof(png_bytep)); + + if (row_pointers == NULL) + FATAL_ERROR("Failed to allocate row pointers.\n"); + + for (int i = 0; i < image->height; i++) + row_pointers[i] = (png_bytep)(image->pixels + (i * rowbytes)); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Error reading from \"%s\".\n", path); + + png_read_image(png_ptr, row_pointers); + + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + free(row_pointers); + fclose(fp); + + if (bit_depth != image->bitDepth) + { + unsigned char *src = image->pixels; + + if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && bit_depth != 8) + FATAL_ERROR("Bit depth of image must be 1, 2, 4, or 8.\n"); + image->pixels = ConvertBitDepth(image->pixels, bit_depth, image->bitDepth, image->width * image->height); + free(src); + image->bitDepth = bit_depth; + } +} + +void ReadPngPalette(char *path, struct Palette *palette) +{ + png_structp png_ptr; + png_infop info_ptr; + png_colorp colors; + int numColors; + + FILE *fp = PngReadOpen(path, &png_ptr, &info_ptr); + + if (png_get_color_type(png_ptr, info_ptr) != PNG_COLOR_TYPE_PALETTE) + FATAL_ERROR("The image \"%s\" does not contain a palette.\n", path); + + if (png_get_PLTE(png_ptr, info_ptr, &colors, &numColors) != PNG_INFO_PLTE) + FATAL_ERROR("Failed to retrieve palette from \"%s\".\n", path); + + if (numColors > 256) + FATAL_ERROR("Images with more than 256 colors are not supported.\n"); + + palette->numColors = numColors; + for (int i = 0; i < numColors; i++) { + palette->colors[i].red = colors[i].red; + palette->colors[i].green = colors[i].green; + palette->colors[i].blue = colors[i].blue; + } + + palette->bitDepth = png_get_bit_depth(png_ptr, info_ptr); + + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + fclose(fp); +} + +void SetPngPalette(png_structp png_ptr, png_infop info_ptr, struct Palette *palette) +{ + png_colorp colors = malloc(palette->numColors * sizeof(png_color)); + + if (colors == NULL) + FATAL_ERROR("Failed to allocate PNG palette.\n"); + + for (int i = 0; i < palette->numColors; i++) { + colors[i].red = palette->colors[i].red; + colors[i].green = palette->colors[i].green; + colors[i].blue = palette->colors[i].blue; + } + + png_set_PLTE(png_ptr, info_ptr, colors, palette->numColors); + + free(colors); +} + +void WritePng(char *path, struct Image *image) +{ + FILE *fp = fopen(path, "wb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if (!png_ptr) + FATAL_ERROR("Failed to create PNG write struct.\n"); + + png_infop info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + FATAL_ERROR("Failed to create PNG info struct.\n"); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Failed to init I/O for writing \"%s\".\n", path); + + png_init_io(png_ptr, fp); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Error writing header for \"%s\".\n", path); + + int color_type = image->hasPalette ? PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_GRAY; + + png_set_IHDR(png_ptr, info_ptr, image->width, image->height, + image->bitDepth, color_type, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + if (image->hasPalette) { + SetPngPalette(png_ptr, info_ptr, &image->palette); + + if (image->hasTransparency) { + png_byte trans = 0; + png_set_tRNS(png_ptr, info_ptr, &trans, 1, 0); + } + } + + png_write_info(png_ptr, info_ptr); + + png_bytepp row_pointers = malloc(image->height * sizeof(png_bytep)); + + if (row_pointers == NULL) + FATAL_ERROR("Failed to allocate row pointers.\n"); + + int rowbytes = png_get_rowbytes(png_ptr, info_ptr); + + for (int i = 0; i < image->height; i++) + row_pointers[i] = (png_bytep)(image->pixels + (i * rowbytes)); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Error writing \"%s\".\n", path); + + png_write_image(png_ptr, row_pointers); + + if (setjmp(png_jmpbuf(png_ptr))) + FATAL_ERROR("Error ending write of \"%s\".\n", path); + + png_write_end(png_ptr, NULL); + + fclose(fp); + + png_destroy_write_struct(&png_ptr, &info_ptr); + free(row_pointers); +} diff --git a/tools/nitrogfx/convert_png.h b/tools/nitrogfx/convert_png.h new file mode 100644 index 00000000..caf081b7 --- /dev/null +++ b/tools/nitrogfx/convert_png.h @@ -0,0 +1,12 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef CONVERT_PNG_H +#define CONVERT_PNG_H + +#include "gfx.h" + +void ReadPng(char *path, struct Image *image); +void WritePng(char *path, struct Image *image); +void ReadPngPalette(char *path, struct Palette *palette); + +#endif // CONVERT_PNG_H diff --git a/tools/nitrogfx/font.c b/tools/nitrogfx/font.c new file mode 100644 index 00000000..0dd6fbc3 --- /dev/null +++ b/tools/nitrogfx/font.c @@ -0,0 +1,326 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include +#include +#include "global.h" +#include "font.h" +#include "gfx.h" +#include "util.h" + +unsigned char gFontPalette[][3] = { + {0x90, 0xC8, 0xFF}, // bg (saturated blue that contrasts well with the shadow color) + {0x38, 0x38, 0x38}, // fg (dark grey) + {0xD8, 0xD8, 0xD8}, // shadow (light grey) + {0xFF, 0xFF, 0xFF} // box (white) +}; + +static void ConvertFromLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + unsigned int srcPixelsOffset = 0; + + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } +} + +static void ConvertToLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + unsigned int destPixelsOffset = 0; + + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } +} + +static void ConvertFromHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { + unsigned int pixelsX = column * 8; + unsigned int srcPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 32) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } +} + +static void ConvertToHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { + unsigned int pixelsX = column * 8; + unsigned int destPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 32) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } +} + +static void ConvertFromFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + unsigned int srcPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } +} + +static void ConvertToFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) +{ + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + unsigned int destPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } +} + +static void SetFontPalette(struct Image *image) +{ + image->hasPalette = true; + + image->palette.numColors = 4; + + for (int i = 0; i < image->palette.numColors; i++) { + image->palette.colors[i].red = gFontPalette[i][0]; + image->palette.colors[i].green = gFontPalette[i][1]; + image->palette.colors[i].blue = gFontPalette[i][2]; + } + + image->hasTransparency = false; +} + +void ReadLatinFont(char *path, struct Image *image) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + int numGlyphs = fileSize / 64; + + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + + int numRows = numGlyphs / 16; + + image->width = 256; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertFromLatinFont(buffer, image->pixels, numRows); + + free(buffer); + + SetFontPalette(image); +} + +void WriteLatinFont(char *path, struct Image *image) +{ + if (image->width != 256) + FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 64; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertToLatinFont(image->pixels, buffer, numRows); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + +void ReadHalfwidthJapaneseFont(char *path, struct Image *image) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + int glyphSize = 32; + + if (fileSize % glyphSize != 0) + FATAL_ERROR("The file size (%d) is not a multiple of %d.\n", fileSize, glyphSize); + + int numGlyphs = fileSize / glyphSize; + + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + + int numRows = numGlyphs / 16; + + image->width = 128; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertFromHalfwidthJapaneseFont(buffer, image->pixels, numRows); + + free(buffer); + + SetFontPalette(image); +} + +void WriteHalfwidthJapaneseFont(char *path, struct Image *image) +{ + if (image->width != 128) + FATAL_ERROR("The width of the font image (%d) is not 128.\n", image->width); + + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 32; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertToHalfwidthJapaneseFont(image->pixels, buffer, numRows); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + +void ReadFullwidthJapaneseFont(char *path, struct Image *image) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + int numGlyphs = fileSize / 64; + + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + + int numRows = numGlyphs / 16; + + image->width = 256; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertFromFullwidthJapaneseFont(buffer, image->pixels, numRows); + + free(buffer); + + SetFontPalette(image); +} + +void WriteFullwidthJapaneseFont(char *path, struct Image *image) +{ + if (image->width != 256) + FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 64; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertToFullwidthJapaneseFont(image->pixels, buffer, numRows); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} diff --git a/tools/nitrogfx/font.h b/tools/nitrogfx/font.h new file mode 100644 index 00000000..45086d02 --- /dev/null +++ b/tools/nitrogfx/font.h @@ -0,0 +1,16 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef FONT_H +#define FONT_H + +#include +#include "gfx.h" + +void ReadLatinFont(char *path, struct Image *image); +void WriteLatinFont(char *path, struct Image *image); +void ReadHalfwidthJapaneseFont(char *path, struct Image *image); +void WriteHalfwidthJapaneseFont(char *path, struct Image *image); +void ReadFullwidthJapaneseFont(char *path, struct Image *image); +void WriteFullwidthJapaneseFont(char *path, struct Image *image); + +#endif // FONT_H diff --git a/tools/nitrogfx/gfx.c b/tools/nitrogfx/gfx.c new file mode 100644 index 00000000..e2567731 --- /dev/null +++ b/tools/nitrogfx/gfx.c @@ -0,0 +1,772 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include +#include +#include +#include "global.h" +#include "gfx.h" +#include "util.h" + +#define GET_GBA_PAL_RED(x) (((x) >> 0) & 0x1F) +#define GET_GBA_PAL_GREEN(x) (((x) >> 5) & 0x1F) +#define GET_GBA_PAL_BLUE(x) (((x) >> 10) & 0x1F) + +#define SET_GBA_PAL(r, g, b) (((b) << 10) | ((g) << 5) | (r)) + +#define UPCONVERT_BIT_DEPTH(x) (((x) * 255) / 31) + +#define DOWNCONVERT_BIT_DEPTH(x) ((x) / 8) + +static void AdvanceMetatilePosition(int *subTileX, int *subTileY, int *metatileX, int *metatileY, int metatilesWide, int metatileWidth, int metatileHeight) +{ + (*subTileX)++; + if (*subTileX == metatileWidth) { + *subTileX = 0; + (*subTileY)++; + if (*subTileY == metatileHeight) { + *subTileY = 0; + (*metatileX)++; + if (*metatileX == metatilesWide) { + *metatileX = 0; + (*metatileY)++; + } + } + } +} + +static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = metatilesWide * metatileWidth; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int destY = (metatileY * metatileHeight + subTileY) * 8 + j; + int destX = metatileX * metatileWidth + subTileX; + unsigned char srcPixelOctet = *src++; + unsigned char *destPixelOctet = &dest[destY * pitch + destX]; + + for (int k = 0; k < 8; k++) { + *destPixelOctet <<= 1; + *destPixelOctet |= (srcPixelOctet & 1) ^ invertColors; + srcPixelOctet >>= 1; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = (metatilesWide * metatileWidth) * 4; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int destY = (metatileY * metatileHeight + subTileY) * 8 + j; + + for (int k = 0; k < 4; k++) { + int destX = (metatileX * metatileWidth + subTileX) * 4 + k; + unsigned char srcPixelPair = *src++; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; + + if (invertColors) { + leftPixel = 15 - leftPixel; + rightPixel = 15 - rightPixel; + } + + dest[destY * pitch + destX] = (leftPixel << 4) | rightPixel; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +static uint32_t ConvertFromScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, bool scanFrontToBack) +{ + uint32_t encValue = 0; + if (scanFrontToBack) { + encValue = (src[1] << 8) | src[0]; + for (int i = 0; i < fileSize; i += 2) + { + uint16_t val = src[i] | (src[i + 1] << 8); + val ^= (encValue & 0xFFFF); + src[i] = val; + src[i + 1] = val >> 8; + encValue = encValue * 1103515245; + encValue = encValue + 24691; + } + } else { + encValue = (src[fileSize - 1] << 8) | src[fileSize - 2]; + for (int i = fileSize; i > 0; i -= 2) + { + uint16_t val = (src[i - 1] << 8) | src[i - 2]; + val ^= (encValue & 0xFFFF); + src[i - 1] = (val >> 8); + src[i - 2] = val; + encValue = encValue * 1103515245; + encValue = encValue + 24691; + } + } + for (int i = 0; i < fileSize; i++) + { + unsigned char srcPixelPair = src[i]; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; + + if (invertColours) { + leftPixel = 15 - leftPixel; + rightPixel = 15 - rightPixel; + } + + dest[i] = (leftPixel << 4) | rightPixel; + } + return encValue; +} + +static void ConvertFromTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = (metatilesWide * metatileWidth) * 8; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int destY = (metatileY * metatileHeight + subTileY) * 8 + j; + + for (int k = 0; k < 8; k++) { + int destX = (metatileX * metatileWidth + subTileX) * 8 + k; + unsigned char srcPixel = *src++; + + if (invertColors) + srcPixel = 255 - srcPixel; + + dest[destY * pitch + destX] = srcPixel; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +static void ConvertToTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = metatilesWide * metatileWidth; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int srcY = (metatileY * metatileHeight + subTileY) * 8 + j; + int srcX = metatileX * metatileWidth + subTileX; + unsigned char srcPixelOctet = src[srcY * pitch + srcX]; + unsigned char *destPixelOctet = dest++; + + for (int k = 0; k < 8; k++) { + *destPixelOctet <<= 1; + *destPixelOctet |= (srcPixelOctet & 1) ^ invertColors; + srcPixelOctet >>= 1; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = (metatilesWide * metatileWidth) * 4; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int srcY = (metatileY * metatileHeight + subTileY) * 8 + j; + + for (int k = 0; k < 4; k++) { + int srcX = (metatileX * metatileWidth + subTileX) * 4 + k; + unsigned char srcPixelPair = src[srcY * pitch + srcX]; + unsigned char leftPixel = srcPixelPair >> 4; + unsigned char rightPixel = srcPixelPair & 0xF; + + if (invertColors) { + leftPixel = 15 - leftPixel; + rightPixel = 15 - rightPixel; + } + + *dest++ = (rightPixel << 4) | leftPixel; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +static void ConvertToScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, uint32_t encValue, uint32_t scanMode) +{ + for (int i = 0; i < fileSize; i++) + { + unsigned char srcPixelPair = src[i]; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; + if (invertColours) { + leftPixel = 15 - leftPixel; + rightPixel = 15 - rightPixel; + } + dest[i] = (leftPixel << 4) | rightPixel; + } + + if (scanMode == 2) { // front to back + for (int i = fileSize - 1; i > 0; i -= 2) + { + uint16_t val = dest[i - 1] | (dest[i] << 8); + encValue = (encValue - 24691) * 4005161829; + val ^= (encValue & 0xFFFF); + dest[i] = (val >> 8); + dest[i - 1] = val; + } + } + else if (scanMode == 1) { + for (int i = 1; i < fileSize; i += 2) + { + uint16_t val = (dest[i] << 8) | dest[i - 1]; + encValue = (encValue - 24691) * 4005161829; + val ^= (encValue & 0xFFFF); + dest[i] = (val >> 8); + dest[i - 1] = val; + } + } +} + +static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +{ + int subTileX = 0; + int subTileY = 0; + int metatileX = 0; + int metatileY = 0; + int pitch = (metatilesWide * metatileWidth) * 8; + + for (int i = 0; i < numTiles; i++) { + for (int j = 0; j < 8; j++) { + int srcY = (metatileY * metatileHeight + subTileY) * 8 + j; + + for (int k = 0; k < 8; k++) { + int srcX = (metatileX * metatileWidth + subTileX) * 8 + k; + unsigned char srcPixel = src[srcY * pitch + srcX]; + + if (invertColors) + srcPixel = 255 - srcPixel; + + *dest++ = srcPixel; + } + } + + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } +} + +void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +{ + int tileSize = bitDepth * 8; + + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + int numTiles = fileSize / tileSize; + + int tilesHeight = (numTiles + tilesWidth - 1) / tilesWidth; + + if (tilesWidth % metatileWidth != 0) + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + + if (tilesHeight % metatileHeight != 0) + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + + image->width = tilesWidth * 8; + image->height = tilesHeight * 8; + image->bitDepth = bitDepth; + image->pixels = calloc(tilesWidth * tilesHeight, tileSize); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + int metatilesWide = tilesWidth / metatileWidth; + + switch (bitDepth) { + case 1: + ConvertFromTiles1Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + case 4: + ConvertFromTiles4Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + case 8: + ConvertFromTiles8Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + } + + free(buffer); +} + +uint32_t ReadNtrImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors, bool scanFrontToBack) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + if (memcmp(buffer, "RGCN", 4) != 0) + { + FATAL_ERROR("Not a valid NCGR character file.\n"); + } + + unsigned char *charHeader = buffer + 0x10; + + if (memcmp(charHeader, "RAHC", 4) != 0) + { + FATAL_ERROR("No valid CHAR file after NCLR header.\n"); + } + + bitDepth = bitDepth ? bitDepth : (charHeader[0xC] == 3 ? 4 : 8); + + if (bitDepth == 4) + { + image->palette.numColors = 16; + } + + unsigned char *imageData = charHeader + 0x20; + + bool scanned = charHeader[0x14]; + + int tileSize = bitDepth * 8; + + if (tilesWidth == 0) { + tilesWidth = ReadS16(charHeader, 0xA); + if (tilesWidth < 0) { + tilesWidth = 1; + } + } + + int numTiles = ReadS32(charHeader, 0x18) / (64 / (8 / bitDepth)); + + int tilesHeight = ReadS16(charHeader, 0x8); + if (tilesHeight < 0) + tilesHeight = (numTiles + tilesWidth - 1) / tilesWidth; + + if (tilesWidth % metatileWidth != 0) + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + + if (tilesHeight % metatileHeight != 0) + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + + + image->width = tilesWidth * 8; + image->height = tilesHeight * 8; + image->bitDepth = bitDepth; + image->pixels = calloc(tilesWidth * tilesHeight, tileSize); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + int metatilesWide = tilesWidth / metatileWidth; + + uint32_t key = 0; + if (scanned) + { + switch (bitDepth) + { + case 4: + key = ConvertFromScanned4Bpp(imageData, image->pixels, fileSize - 0x30, invertColors, scanFrontToBack); + break; + case 8: + FATAL_ERROR("8bpp is not implemented yet\n"); + break; + } + } + else + { + switch (bitDepth) + { + case 4: + ConvertFromTiles4Bpp(imageData, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, + invertColors); + break; + case 8: + ConvertFromTiles8Bpp(imageData, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, + invertColors); + break; + } + } + + free(buffer); + return key; +} + +void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +{ + int tileSize = bitDepth * 8; + + if (image->width % 8 != 0) + FATAL_ERROR("The width in pixels (%d) isn't a multiple of 8.\n", image->width); + + if (image->height % 8 != 0) + FATAL_ERROR("The height in pixels (%d) isn't a multiple of 8.\n", image->height); + + int tilesWidth = image->width / 8; + int tilesHeight = image->height / 8; + + if (tilesWidth % metatileWidth != 0) + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + + if (tilesHeight % metatileHeight != 0) + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + + int maxNumTiles = tilesWidth * tilesHeight; + + if (numTiles == 0) + numTiles = maxNumTiles; + else if (numTiles > maxNumTiles) + FATAL_ERROR("The specified number of tiles (%d) is greater than the maximum possible value (%d).\n", numTiles, maxNumTiles); + + int bufferSize = numTiles * tileSize; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + int metatilesWide = tilesWidth / metatileWidth; + + switch (bitDepth) { + case 1: + ConvertToTiles1Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + case 4: + ConvertToTiles4Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + case 8: + ConvertToTiles8Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + break; + } + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + +void WriteNtrImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors, bool clobberSize, bool byteOrder, bool version101, bool sopc, uint32_t scanMode, uint32_t key) +{ + FILE *fp = fopen(path, "wb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + int tileSize = bitDepth * 8; + + if (image->width % 8 != 0) + FATAL_ERROR("The width in pixels (%d) isn't a multiple of 8.\n", image->width); + + if (image->height % 8 != 0) + FATAL_ERROR("The height in pixels (%d) isn't a multiple of 8.\n", image->height); + + int tilesWidth = image->width / 8; + int tilesHeight = image->height / 8; + + if (tilesWidth % metatileWidth != 0) + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + + if (tilesHeight % metatileHeight != 0) + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + + int maxNumTiles = tilesWidth * tilesHeight; + + if (numTiles == 0) + numTiles = maxNumTiles; + else if (numTiles > maxNumTiles) + FATAL_ERROR("The specified number of tiles (%d) is greater than the maximum possible value (%d).\n", numTiles, maxNumTiles); + + int bufferSize = numTiles * tileSize; + unsigned char *pixelBuffer = malloc(bufferSize); + + if (pixelBuffer == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + int metatilesWide = tilesWidth / metatileWidth; + + if (scanMode) + { + switch (bitDepth) + { + case 4: + ConvertToScanned4Bpp(image->pixels, pixelBuffer, bufferSize, invertColors, key, scanMode); + break; + case 8: + FATAL_ERROR("8Bpp not supported yet.\n"); + break; + } + } + else + { + switch (bitDepth) + { + case 4: + ConvertToTiles4Bpp(image->pixels, pixelBuffer, numTiles, metatilesWide, metatileWidth, metatileHeight, + invertColors); + break; + case 8: + ConvertToTiles8Bpp(image->pixels, pixelBuffer, numTiles, metatilesWide, metatileWidth, metatileHeight, + invertColors); + break; + } + } + + WriteGenericNtrHeader(fp, "RGCN", bufferSize + (sopc ? 0x30 : 0x20), byteOrder, version101, sopc ? 2 : 1); + + unsigned char charHeader[0x20] = { 0x52, 0x41, 0x48, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 }; + + charHeader[4] = (bufferSize + 0x20) & 0xFF; + charHeader[5] = ((bufferSize + 0x20) >> 8) & 0xFF; + charHeader[6] = ((bufferSize + 0x20) >> 16) & 0xFF; + charHeader[7] = ((bufferSize + 0x20) >> 24) & 0xFF; + + if (!clobberSize) + { + charHeader[8] = tilesHeight & 0xFF; + charHeader[9] = (tilesHeight >> 8) & 0xFF; + + charHeader[10] = tilesWidth & 0xFF; + charHeader[11] = (tilesWidth >> 8) & 0xFF; + } + else + { + charHeader[8] = 0xFF; + charHeader[9] = 0xFF; + charHeader[10] = 0xFF; + charHeader[11] = 0xFF; + + charHeader[16] = 0x10; //seems to be set when size is clobbered + } + + charHeader[12] = bitDepth == 4 ? 3 : 4; + + if (scanMode) + { + charHeader[20] = 1; + } + + charHeader[24] = bufferSize & 0xFF; + charHeader[25] = (bufferSize >> 8) & 0xFF; + charHeader[26] = (bufferSize >> 16) & 0xFF; + charHeader[27] = (bufferSize >> 24) & 0xFF; + + fwrite(charHeader, 1, 0x20, fp); + + fwrite(pixelBuffer, 1, bufferSize, fp); + + if (sopc) + { + unsigned char sopcBuffer[0x10] = { 0x53, 0x4F, 0x50, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + sopcBuffer[12] = tilesWidth & 0xFF; + sopcBuffer[13] = (tilesWidth >> 8) & 0xFF; + + sopcBuffer[14] = tilesHeight & 0xFF; + sopcBuffer[15] = (tilesHeight >> 8) & 0xFF; + + fwrite(sopcBuffer, 1, 0x10, fp); + } + + free(pixelBuffer); + fclose(fp); +} + +void FreeImage(struct Image *image) +{ + free(image->pixels); + image->pixels = NULL; +} + +void ReadGbaPalette(char *path, struct Palette *palette) +{ + int fileSize; + unsigned char *data = ReadWholeFile(path, &fileSize); + + if (fileSize % 2 != 0) + FATAL_ERROR("The file size (%d) is not a multiple of 2.\n", fileSize); + + palette->numColors = fileSize / 2; + + for (int i = 0; i < palette->numColors; i++) { + uint16_t paletteEntry = (data[i * 2 + 1] << 8) | data[i * 2]; + palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); + palette->colors[i].green = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_GREEN(paletteEntry)); + palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); + } + + free(data); +} + +void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex) +{ + int fileSize; + unsigned char *data = ReadWholeFile(path, &fileSize); + + if (memcmp(data, "RLCN", 4) != 0 && memcmp(data, "RPCN", 4) != 0) //NCLR / NCPR + { + FATAL_ERROR("Not a valid NCLR or NCPR palette file.\n"); + } + + unsigned char *paletteHeader = data + 0x10; + + if (memcmp(paletteHeader, "TTLP", 4) != 0) + { + FATAL_ERROR("No valid PLTT file after NCLR header.\n"); + } + + if ((fileSize - 0x28) % 2 != 0) + FATAL_ERROR("The file size (%d) is not a multiple of 2.\n", fileSize); + + palette->bitDepth = paletteHeader[0x8] == 3 ? 4 : 8; + + bitdepth = bitdepth ? bitdepth : palette->bitDepth; + + palette->numColors = bitdepth == 4 ? 16 : 256; //remove header and divide by 2 + + unsigned char *paletteData = paletteHeader + 0x18; + palIndex = palIndex - 1; + + for (int i = 0; i < 256; i++) + { + if (i < palette->numColors) + { + uint16_t paletteEntry = (paletteData[(32 * palIndex) + i * 2 + 1] << 8) | paletteData[(32 * palIndex) + i * 2]; + palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); + palette->colors[i].green = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_GREEN(paletteEntry)); + palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); + } + else + { + palette->colors[i].red = 0; + palette->colors[i].green = 0; + palette->colors[i].blue = 0; + } + } + + free(data); +} + +void WriteGbaPalette(char *path, struct Palette *palette) +{ + FILE *fp = fopen(path, "wb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + for (int i = 0; i < palette->numColors; i++) { + unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); + unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); + unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + + uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); + + fputc(paletteEntry & 0xFF, fp); + fputc(paletteEntry >> 8, fp); + } + + fclose(fp); +} + +void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum) +{ + FILE *fp = fopen(path, "wb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + int colourNum = pad ? 256 : 16; + + uint32_t size = colourNum * 2; //todo check if there's a better way to detect :/ + uint32_t extSize = size + (ncpr ? 0x10 : 0x18); + + //NCLR header + WriteGenericNtrHeader(fp, (ncpr ? "RPCN" : "RLCN"), extSize, !ncpr, false, 1); + + unsigned char palHeader[0x18] = + { + 0x54, 0x54, 0x4C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 + }; + + //section size + palHeader[4] = extSize & 0xFF; + palHeader[5] = (extSize >> 8) & 0xFF; + palHeader[6] = (extSize >> 16) & 0xFF; + palHeader[7] = (extSize >> 24) & 0xFF; + + if (!palette->bitDepth) + palette->bitDepth = 4; + + bitdepth = bitdepth ? bitdepth : palette->bitDepth; + + //bit depth + palHeader[8] = bitdepth == 4 ? 0x03: 0x04; + + if (compNum) + { + palHeader[10] = compNum; //assuming this is an indicator of compression, literally no docs for it though + } + + //size + palHeader[16] = size & 0xFF; + palHeader[17] = (size >> 8) & 0xFF; + palHeader[18] = (size >> 16) & 0xFF; + palHeader[19] = (size >> 24) & 0xFF; + + fwrite(palHeader, 1, 0x18, fp); + + unsigned char colours[colourNum * 2]; + //palette data + for (int i = 0; i < colourNum; i++) + { + if (i < palette->numColors) + { + unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); + unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); + unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + + uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); + + colours[i * 2] = paletteEntry & 0xFF; + colours[i * 2 + 1] = paletteEntry >> 8; + } + else + { + colours[i * 2] = 0x00; + colours[i * 2 + 1] = 0x00; + } + } + + if (ir) + { + colours[colourNum * 2 - 2] = 'I'; + colours[colourNum * 2 - 1] = 'R'; + } + + fwrite(colours, 1, colourNum * 2, fp); + + fclose(fp); +} diff --git a/tools/nitrogfx/gfx.h b/tools/nitrogfx/gfx.h new file mode 100644 index 00000000..45f74580 --- /dev/null +++ b/tools/nitrogfx/gfx.h @@ -0,0 +1,41 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef GFX_H +#define GFX_H + +#include +#include + +struct Color { + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +struct Palette { + struct Color colors[256]; + int numColors; + int bitDepth; +}; + +struct Image { + int width; + int height; + int bitDepth; + unsigned char *pixels; + bool hasPalette; + struct Palette palette; + bool hasTransparency; +}; + +void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +uint32_t ReadNtrImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors, bool scanFrontToBack); +void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +void WriteNtrImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors, bool clobberSize, bool byteOrder, bool version101, bool sopc, uint32_t scanMode, uint32_t key); +void FreeImage(struct Image *image); +void ReadGbaPalette(char *path, struct Palette *palette); +void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex); +void WriteGbaPalette(char *path, struct Palette *palette); +void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum); + +#endif // GFX_H diff --git a/tools/nitrogfx/global.h b/tools/nitrogfx/global.h new file mode 100644 index 00000000..65dd351d --- /dev/null +++ b/tools/nitrogfx/global.h @@ -0,0 +1,31 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef GLOBAL_H +#define GLOBAL_H + +#include +#include + +#ifdef _MSC_VER + +#define FATAL_ERROR(format, ...) \ +do { \ + fprintf(stderr, format, __VA_ARGS__); \ + exit(1); \ +} while (0) + +#define UNUSED + +#else + +#define FATAL_ERROR(format, ...) \ +do { \ + fprintf(stderr, format, ##__VA_ARGS__); \ + exit(1); \ +} while (0) + +#define UNUSED __attribute__((__unused__)) + +#endif // _MSC_VER + +#endif // GLOBAL_H diff --git a/tools/nitrogfx/huff.c b/tools/nitrogfx/huff.c new file mode 100644 index 00000000..143ed79b --- /dev/null +++ b/tools/nitrogfx/huff.c @@ -0,0 +1,398 @@ +#include +#include +#include +#include +#include +#include "global.h" +#include "huff.h" + +static int cmp_tree(const void * a0, const void * b0) { + return ((struct HuffData *)a0)->value - ((struct HuffData *)b0)->value; +} + +typedef int (*cmpfun)(const void *, const void *); + +int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) { + /* + * Out-of-place mergesort (stable sort) + * Returns 1 on success, 0 on failure + */ + void * leftPtr; + void * rightPtr; + void * leftEnd; + void * rightEnd; + int i; + + switch (count) { + case 0: + // Should never be here + return 0; + + case 1: + // Nothing to do here + break; + + case 2: + // Swap the two entries if the right one compares higher. + if (cmp(data, data + size) > 0) { + memcpy(buffer, data, size); + memcpy(data, data + size, size); + memcpy(data + size, buffer, size); + } + break; + default: + // Merge sort out-of-place. + leftPtr = data; + leftEnd = rightPtr = data + count / 2 * size; + rightEnd = data + count * size; + + // Sort the left half + if (!msort_r(leftPtr, count / 2, size, cmp, buffer)) + return 0; + + // Sort the right half + if (!msort_r(rightPtr, count / 2 + (count & 1), size, cmp, buffer)) + return 0; + + // Merge the sorted halves out of place + i = 0; + do { + if (cmp(leftPtr, rightPtr) <= 0) { + memcpy(buffer + i * size, leftPtr, size); + leftPtr += size; + } else { + memcpy(buffer + i * size, rightPtr, size); + rightPtr += size; + } + + } while (++i < count && leftPtr < leftEnd && rightPtr < rightEnd); + + // Copy the remainder + if (i < count) { + if (leftPtr < leftEnd) { + memcpy(buffer + i * size, leftPtr, leftEnd - leftPtr); + } + else { + memcpy(buffer + i * size, rightPtr, rightEnd - rightPtr); + } + } + + // Copy the merged data back + memcpy(data, buffer, count * size); + break; + } + + return 1; +} + +int msort(void * data, size_t count, size_t size, cmpfun cmp) { + void * buffer = malloc(count * size); + if (buffer == NULL) return 0; + int result = msort_r(data, count, size, cmp, buffer); + free(buffer); + return result; +} + +static void write_tree(unsigned char * dest, HuffNode_t * tree, int nitems, struct BitEncoding * encoding) { + /* + * The example used to guide this function encodes the tree in a + * breadth-first manner. We attempt to emulate that here. + */ + + int i, j, k; + + // There are (2 * nitems - 1) nodes in the binary tree. Allocate that. + HuffNode_t * traversal = calloc(2 * nitems - 1, sizeof(HuffNode_t)); + if (traversal == NULL) + FATAL_ERROR("Fatal error while compressing Huff file.\n"); + + // The first node is the root of the tree. + traversal[0] = *tree; + i = 1; + + // Copy the tree into a breadth-first ordering using brute force. + for (int depth = 1; i < 2 * nitems - 1; depth++) { + // Consider every possible path up to the current depth. + for (j = 0; i < 2 * nitems - 1 && j < 1 << depth; j++) { + // The index of the path is used to encode the path itself. + // Start from the most significant relevant bit and work our way down. + // Keep track of the current and previous nodes. + HuffNode_t * currNode = traversal; + HuffNode_t * parent = NULL; + for (k = 0; k < depth; k++) { + if (currNode->header.isLeaf) + break; + parent = currNode; + if ((j >> (depth - k - 1)) & 1) + currNode = currNode->branch.right; + else + currNode = currNode->branch.left; + } + // Check that the length of the current path equals the current depth. + if (k == depth) { + // Make sure we can encode the current branch. + // Bail here if we cannot. + // This is only applicable for 8-bit encodings. + if (traversal + i - parent > 128) + FATAL_ERROR("Fatal error while compressing Huff file: unable to encode binary tree.\n"); + // Copy the current node, and update its parent. + traversal[i] = *currNode; + if (parent != NULL) { + if ((j & 1) == 1) + parent->branch.right = traversal + i; + else + parent->branch.left = traversal + i; + } + // Encode the path through the tree in the lookup table + if (traversal[i].header.isLeaf) { + encoding[traversal[i].leaf.key].nbits = depth; + encoding[traversal[i].leaf.key].bitstring = j; + } + i++; + } + } + } + + // Encode the size of the tree. + // This is used by the decompressor to skip the tree. + dest[4] = nitems - 1; + + // Encode each node in the tree. + for (i = 0; i < 2 * nitems - 1; i++) { + HuffNode_t * currNode = traversal + i; + if (currNode->header.isLeaf) { + dest[5 + i] = traversal[i].leaf.key; + } else { + dest[5 + i] = (((currNode->branch.right - traversal - i) / 2) - 1); + if (currNode->branch.left->header.isLeaf) + dest[5 + i] |= 0x80; + if (currNode->branch.right->header.isLeaf) + dest[5 + i] |= 0x40; + } + } + + free(traversal); +} + +static inline void write_32_le(unsigned char * dest, int * destPos, uint32_t * buff, int * buffPos) { + dest[*destPos] = *buff; + dest[*destPos + 1] = *buff >> 8; + dest[*destPos + 2] = *buff >> 16; + dest[*destPos + 3] = *buff >> 24; + *destPos += 4; + *buff = 0; + *buffPos = 0; +} + +static inline void read_32_le(unsigned char * src, int * srcPos, uint32_t * buff) { + uint32_t tmp = src[*srcPos]; + tmp |= src[*srcPos + 1] << 8; + tmp |= src[*srcPos + 2] << 16; + tmp |= src[*srcPos + 3] << 24; + *srcPos += 4; + *buff = tmp; +} + +static void write_bits(unsigned char * dest, int * destPos, struct BitEncoding * encoding, int value, uint32_t * buff, int * buffBits) { + int nbits = encoding[value].nbits; + uint32_t bitstring = encoding[value].bitstring; + + if (*buffBits + nbits >= 32) { + int diff = *buffBits + nbits - 32; + *buff <<= nbits - diff; + *buff |= bitstring >> diff; + bitstring &= ~(1 << diff); + nbits = diff; + write_32_le(dest, destPos, buff, buffBits); + } + if (nbits != 0) { + *buff <<= nbits; + *buff |= bitstring; + *buffBits += nbits; + } +} + +/* +======================================= +MAIN COMPRESSION/DECOMPRESSION ROUTINES +======================================= + */ + +unsigned char * HuffCompress(unsigned char * src, int srcSize, int * compressedSize_p, int bitDepth) { + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + (2 << bitDepth) + srcSize * 3; + + unsigned char *dest = malloc(worstCaseDestSize); + if (dest == NULL) + goto fail; + + int nitems = 1 << bitDepth; + + HuffNode_t * freqs = calloc(nitems, sizeof(HuffNode_t)); + if (freqs == NULL) + goto fail; + + struct BitEncoding * encoding = calloc(nitems, sizeof(struct BitEncoding)); + if (encoding == NULL) + goto fail; + + // Set up the frequencies table. This will inform the tree. + for (int i = 0; i < nitems; i++) { + freqs[i].header.isLeaf = 1; + freqs[i].header.value = 0; + freqs[i].leaf.key = i; + } + + // Count each nybble or byte. + for (int i = 0; i < srcSize; i++) { + if (bitDepth == 8) { + freqs[src[i]].header.value++; + } else { + freqs[src[i] >> 4].header.value++; + freqs[src[i] & 0xF].header.value++; + } + } + +#ifdef DEBUG + for (int i = 0; i < nitems; i++) { + fprintf(stderr, "%d: %d\n", i, freqs[i].header.value); + } +#endif // DEBUG + + // Sort the frequency table. + if (!msort(freqs, nitems, sizeof(HuffNode_t), cmp_tree)) + goto fail; + + // Prune zero-frequency values. + for (int i = 0; i < nitems; i++) { + if (freqs[i].header.value != 0) { + if (i > 0) { + for (int j = i; j < nitems; j++) { + freqs[j - i] = freqs[j]; + } + nitems -= i; + } + break; + } + // This should never happen: + if (i == nitems - 1) + goto fail; + } + + HuffNode_t * tree = calloc(nitems * 2 - 1, sizeof(HuffNode_t)); + if (tree == NULL) + goto fail; + + // Iteratively collapse the two least frequent nodes. + HuffNode_t * endptr = freqs + nitems - 2; + + for (int i = 0; i < nitems - 1; i++) { + HuffNode_t * left = freqs; + HuffNode_t * right = freqs + 1; + tree[i * 2] = *right; + tree[i * 2 + 1] = *left; + for (int j = 0; j < nitems - i - 2; j++) + freqs[j] = freqs[j + 2]; + endptr->header.isLeaf = 0; + endptr->header.value = tree[i * 2].header.value + tree[i * 2 + 1].header.value; + endptr->branch.left = tree + i * 2; + endptr->branch.right = tree + i * 2 + 1; + endptr--; + if (i < nitems - 2 && !msort(freqs, nitems - i - 1, sizeof(HuffNode_t), cmp_tree)) + goto fail; + } + + // Write the tree breadth-first, and create the path lookup table. + write_tree(dest, freqs, nitems, encoding); + + free(tree); + free(freqs); + + // Encode the data itself. + int destPos = 4 + nitems * 2; + uint32_t destBuf = 0; + uint32_t srcBuf = 0; + int destBitPos = 0; + + for (int srcPos = 0; srcPos < srcSize;) { + read_32_le(src, &srcPos, &srcBuf); + for (int i = 0; i < 32 / bitDepth; i++) { + write_bits(dest, &destPos, encoding, srcBuf & (0xFF >> (8 - bitDepth)), &destBuf, &destBitPos); + srcBuf >>= bitDepth; + } + } + + if (destBitPos != 0) { + write_32_le(dest, &destPos, &destBuf, &destBitPos); + } + + free(encoding); + + // Write the header. + dest[0] = bitDepth | 0x20; + dest[1] = srcSize; + dest[2] = srcSize >> 8; + dest[3] = srcSize >> 16; + *compressedSize_p = (destPos + 3) & ~3; + return dest; + +fail: + FATAL_ERROR("Fatal error while compressing Huff file.\n"); +} + +unsigned char * HuffDecompress(unsigned char * src, int srcSize, int * uncompressedSize_p) { + if (srcSize < 4) + goto fail; + + int bitDepth = *src & 15; + if (bitDepth != 4 && bitDepth != 8) + goto fail; + + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + + unsigned char *dest = malloc(destSize); + + if (dest == NULL) + goto fail; + + int treePos = 5; + int treeSize = (src[4] + 1) * 2; + int srcPos = 4 + treeSize; + int destPos = 0; + int curValPos = 0; + uint32_t destTmp = 0; + uint32_t window; + + for (;;) + { + if (srcPos >= srcSize) + goto fail; + read_32_le(src, &srcPos, &window); + for (int i = 0; i < 32; i++) { + int curBit = (window >> 31) & 1; + unsigned char treeView = src[treePos]; + bool isLeaf = ((treeView << curBit) & 0x80) != 0; + treePos &= ~1; // align + treePos += ((treeView & 0x3F) + 1) * 2 + curBit; + if (isLeaf) { + destTmp >>= bitDepth; + destTmp |= (src[treePos] << (32 - bitDepth)); + curValPos++; + if (curValPos == 32 / bitDepth) { + write_32_le(dest, &destPos, &destTmp, &curValPos); + if (destPos == destSize) { + *uncompressedSize_p = destSize; + return dest; + } + } + treePos = 5; + } + window <<= 1; + } + } + +fail: + FATAL_ERROR("Fatal error while decompressing Huff file.\n"); +} diff --git a/tools/nitrogfx/huff.h b/tools/nitrogfx/huff.h new file mode 100644 index 00000000..6002fe95 --- /dev/null +++ b/tools/nitrogfx/huff.h @@ -0,0 +1,38 @@ +#ifndef HUFF_H +#define HUFF_H + +union HuffNode; + +struct HuffData { + unsigned value:31; + unsigned isLeaf:1; +}; + +struct HuffLeaf { + struct HuffData header; + unsigned char key; +}; + +struct HuffBranch { + struct HuffData header; + union HuffNode * left; + union HuffNode * right; +}; + +union HuffNode { + struct HuffData header; + struct HuffLeaf leaf; + struct HuffBranch branch; +}; + +typedef union HuffNode HuffNode_t; + +struct BitEncoding { + unsigned long long nbits:6; + unsigned long long bitstring:58; +}; + +unsigned char * HuffCompress(unsigned char * buffer, int srcSize, int * compressedSize_p, int bitDepth); +unsigned char * HuffDecompress(unsigned char * buffer, int srcSize, int * uncompressedSize_p); + +#endif //HUFF_H diff --git a/tools/nitrogfx/jasc_pal.c b/tools/nitrogfx/jasc_pal.c new file mode 100644 index 00000000..4f80f5d9 --- /dev/null +++ b/tools/nitrogfx/jasc_pal.c @@ -0,0 +1,179 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include "global.h" +#include "gfx.h" +#include "util.h" + +// Read/write Paint Shop Pro palette files. + +// Format of a Paint Shop Pro palette file, line by line: +// "JASC-PAL\r\n" (signature) +// "0100\r\n" (version; seems to always be "0100") +// "\r\n" (number of colors in decimal) +// +// times: +// " \r\n" (color entry) +// +// Each color component is a decimal number from 0 to 255. +// Examples: +// Black - "0 0 0\r\n" +// Blue - "0 0 255\r\n" +// Brown - "150 75 0\r\n" + +#define MAX_LINE_LENGTH 11 + +void ReadJascPaletteLine(FILE *fp, char *line) +{ + int c; + int length = 0; + + for (;;) + { + c = fgetc(fp); + + if (c == '\r') + { + c = fgetc(fp); + + if (c != '\n') + FATAL_ERROR("CR line endings aren't supported.\n"); + + line[length] = 0; + + return; + } + + if (c == '\n') + FATAL_ERROR("LF line endings aren't supported.\n"); + + if (c == EOF) + FATAL_ERROR("Unexpected EOF. No CRLF at end of file.\n"); + + if (c == 0) + FATAL_ERROR("NUL character in file.\n"); + + if (length == MAX_LINE_LENGTH) + { + line[length] = 0; + FATAL_ERROR("The line \"%s\" is too long.\n", line); + } + + line[length++] = c; + } +} + +void ReadJascPalette(char *path, struct Palette *palette) +{ + char line[MAX_LINE_LENGTH + 1]; + + FILE *fp = fopen(path, "rb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open JASC-PAL file \"%s\" for reading.\n", path); + + ReadJascPaletteLine(fp, line); + + if (strcmp(line, "JASC-PAL") != 0) + FATAL_ERROR("Invalid JASC-PAL signature.\n"); + + ReadJascPaletteLine(fp, line); + + if (strcmp(line, "0100") != 0) + FATAL_ERROR("Unsuported JASC-PAL version.\n"); + + ReadJascPaletteLine(fp, line); + + if (!ParseNumber(line, NULL, 10, &palette->numColors)) + FATAL_ERROR("Failed to parse number of colors.\n"); + + if (palette->numColors < 1 || palette->numColors > 256) + FATAL_ERROR("%d is an invalid number of colors. The number of colors must be in the range [1, 256].\n", palette->numColors); + + palette->bitDepth = 4; + + for (int i = 0; i < palette->numColors; i++) + { + ReadJascPaletteLine(fp, line); + + char *s = line; + char *end; + + int red; + int green; + int blue; + + if (!ParseNumber(s, &end, 10, &red)) + FATAL_ERROR("Failed to parse red color component.\n"); + + s = end; + + if (*s != ' ') + FATAL_ERROR("Expected a space after red color component.\n"); + + s++; + + if (*s < '0' || *s > '9') + FATAL_ERROR("Expected only a space between red and green color components.\n"); + + if (!ParseNumber(s, &end, 10, &green)) + FATAL_ERROR("Failed to parse green color component.\n"); + + s = end; + + if (*s != ' ') + FATAL_ERROR("Expected a space after green color component.\n"); + + s++; + + if (*s < '0' || *s > '9') + FATAL_ERROR("Expected only a space between green and blue color components.\n"); + + if (!ParseNumber(s, &end, 10, &blue)) + FATAL_ERROR("Failed to parse blue color component.\n"); + + if (*end != 0) + FATAL_ERROR("Garbage after blue color component.\n"); + + if (red < 0 || red > 255) + FATAL_ERROR("Red color component (%d) is outside the range [0, 255].\n", red); + + if (green < 0 || green > 255) + FATAL_ERROR("Green color component (%d) is outside the range [0, 255].\n", green); + + if (blue < 0 || blue > 255) + FATAL_ERROR("Blue color component (%d) is outside the range [0, 255].\n", blue); + + palette->colors[i].red = red; + palette->colors[i].green = green; + palette->colors[i].blue = blue; + if (i >= 16) + { + if (red || green || blue) + palette->bitDepth = 8; + } + } + + if (fgetc(fp) != EOF) + FATAL_ERROR("Garbage after color data.\n"); + + fclose(fp); +} + +void WriteJascPalette(char *path, struct Palette *palette) +{ + FILE *fp = fopen(path, "wb"); + + fputs("JASC-PAL\r\n", fp); + fputs("0100\r\n", fp); + fprintf(fp, "%d\r\n", palette->numColors); + + for (int i = 0; i < palette->numColors; i++) + { + struct Color *color = &palette->colors[i]; + fprintf(fp, "%d %d %d\r\n", color->red, color->green, color->blue); + } + + fclose(fp); +} diff --git a/tools/nitrogfx/jasc_pal.h b/tools/nitrogfx/jasc_pal.h new file mode 100644 index 00000000..b60b31fc --- /dev/null +++ b/tools/nitrogfx/jasc_pal.h @@ -0,0 +1,9 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef JASC_PAL_H +#define JASC_PAL_H + +void ReadJascPalette(char *path, struct Palette *palette); +void WriteJascPalette(char *path, struct Palette *palette); + +#endif // JASC_PAL_H diff --git a/tools/nitrogfx/lz.c b/tools/nitrogfx/lz.c new file mode 100644 index 00000000..97434ce5 --- /dev/null +++ b/tools/nitrogfx/lz.c @@ -0,0 +1,153 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include "global.h" +#include "lz.h" + +unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize) +{ + if (srcSize < 4) + goto fail; + + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + + unsigned char *dest = malloc(destSize); + + if (dest == NULL) + goto fail; + + int srcPos = 4; + int destPos = 0; + + for (;;) { + if (srcPos >= srcSize) + goto fail; + + unsigned char flags = src[srcPos++]; + + for (int i = 0; i < 8; i++) { + if (flags & 0x80) { + if (srcPos + 1 >= srcSize) + goto fail; + + int blockSize = (src[srcPos] >> 4) + 3; + int blockDistance = (((src[srcPos] & 0xF) << 8) | src[srcPos + 1]) + 1; + + srcPos += 2; + + int blockPos = destPos - blockDistance; + + // Some Ruby/Sapphire tilesets overflow. + if (destPos + blockSize > destSize) { + blockSize = destSize - destPos; + fprintf(stderr, "Destination buffer overflow.\n"); + } + + if (blockPos < 0) + goto fail; + + for (int j = 0; j < blockSize; j++) + dest[destPos++] = dest[blockPos + j]; + } else { + if (srcPos >= srcSize || destPos >= destSize) + goto fail; + + dest[destPos++] = src[srcPos++]; + } + + if (destPos == destSize) { + *uncompressedSize = destSize; + return dest; + } + + flags <<= 1; + } + } + +fail: + FATAL_ERROR("Fatal error while decompressing LZ file.\n"); +} + +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance) +{ + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + srcSize + ((srcSize + 7) / 8); + + // Round up to the next multiple of four. + worstCaseDestSize = (worstCaseDestSize + 3) & ~3; + + unsigned char *dest = malloc(worstCaseDestSize); + + if (dest == NULL) + goto fail; + + // header + dest[0] = 0x10; // LZ compression type + dest[1] = (unsigned char)srcSize; + dest[2] = (unsigned char)(srcSize >> 8); + dest[3] = (unsigned char)(srcSize >> 16); + + int srcPos = 0; + int destPos = 4; + + for (;;) { + unsigned char *flags = &dest[destPos++]; + *flags = 0; + + for (int i = 0; i < 8; i++) { + int bestBlockDistance = 0; + int bestBlockSize = 0; + int blockDistance = minDistance; + + while (blockDistance <= srcPos && blockDistance <= 0x1000) { + int blockStart = srcPos - blockDistance; + int blockSize = 0; + + while (blockSize < 18 + && srcPos + blockSize < srcSize + && src[blockStart + blockSize] == src[srcPos + blockSize]) + blockSize++; + + if (blockSize > bestBlockSize) { + bestBlockDistance = blockDistance; + bestBlockSize = blockSize; + + if (blockSize == 18) + break; + } + + blockDistance++; + } + + if (bestBlockSize >= 3) { + *flags |= (0x80 >> i); + srcPos += bestBlockSize; + bestBlockSize -= 3; + bestBlockDistance--; + dest[destPos++] = (bestBlockSize << 4) | ((unsigned int)bestBlockDistance >> 8); + dest[destPos++] = (unsigned char)bestBlockDistance; + } else { + dest[destPos++] = src[srcPos++]; + } + + if (srcPos == srcSize) { + // Pad to multiple of 4 bytes. + int remainder = destPos % 4; + + if (remainder != 0) { + for (int i = 0; i < 4 - remainder; i++) + dest[destPos++] = 0; + } + + *compressedSize = destPos; + return dest; + } + } + } + +fail: + FATAL_ERROR("Fatal error while compressing LZ file.\n"); +} diff --git a/tools/nitrogfx/lz.h b/tools/nitrogfx/lz.h new file mode 100644 index 00000000..90f56b64 --- /dev/null +++ b/tools/nitrogfx/lz.h @@ -0,0 +1,9 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef LZ_H +#define LZ_H + +unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize); +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance); + +#endif // LZ_H diff --git a/tools/nitrogfx/main.c b/tools/nitrogfx/main.c new file mode 100644 index 00000000..6b63717e --- /dev/null +++ b/tools/nitrogfx/main.c @@ -0,0 +1,1044 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include +#include +#include "global.h" +#include "util.h" +#include "options.h" +#include "gfx.h" +#include "convert_png.h" +#include "jasc_pal.h" +#include "lz.h" +#include "rl.h" +#include "font.h" +#include "huff.h" + +struct CommandHandler +{ + const char *inputFileExtension; + const char *outputFileExtension; + void(*function)(char *inputPath, char *outputPath, int argc, char **argv); +}; + +void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions *options) +{ + struct Image image; + + if (options->paletteFilePath != NULL) + { + ReadGbaPalette(options->paletteFilePath, &image.palette); + image.hasPalette = true; + } + else + { + image.hasPalette = false; + } + + ReadImage(inputPath, options->width, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + + image.hasTransparency = options->hasTransparency; + + WritePng(outputPath, &image); + + FreeImage(&image); +} + +void ConvertNtrToPng(char *inputPath, char *outputPath, struct NtrToPngOptions *options) +{ + // handle empty files if possible + FILE *fp = fopen(inputPath, "rb"); + + if (options->handleEmpty) + { + if (fp != NULL) + { + fseek(fp, 0, SEEK_END); + uint32_t size = ftell(fp); + rewind(fp); + if (size == 0) + { + FILE *out = fopen(outputPath, "wb+"); + fclose(out); + fclose(fp); + return; + } + } + } + + fclose(fp); + + struct Image image; + + if (options->paletteFilePath != NULL) + { + ReadNtrPalette(options->paletteFilePath, &image.palette, options->bitDepth, options->palIndex); + image.hasPalette = true; + } + else + { + image.hasPalette = false; + } + + uint32_t key = ReadNtrImage(inputPath, options->width, 0, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette, options->scanFrontToBack); + + if (key) + { + char string[strlen(outputPath) + 5]; + sprintf(string, "%s.key", outputPath); + FILE *fp = fopen(string, "wb"); + if (fp == NULL) + FATAL_ERROR("Failed to open key file for writing.\n"); + fwrite(&key, 4, 1, fp); + fclose(fp); + } + + image.hasTransparency = options->hasTransparency; + + WritePng(outputPath, &image); + + FreeImage(&image); +} + +void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions *options) +{ + struct Image image; + + image.bitDepth = options->bitDepth; + + ReadPng(inputPath, &image); + + WriteImage(outputPath, options->numTiles, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + + FreeImage(&image); +} + +void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions *options) +{ + // handle empty files if possible + FILE *fp = fopen(inputPath, "rb"); + + if (options->handleEmpty) + { + if (fp != NULL) + { + fseek(fp, 0, SEEK_END); + uint32_t size = ftell(fp); + rewind(fp); + if (size == 0) + { + FILE *out = fopen(outputPath, "wb+"); + fclose(out); + fclose(fp); + return; + } + } + } + + fclose(fp); + + struct Image image; + + image.bitDepth = options->bitDepth; + + ReadPng(inputPath, &image); + + uint32_t key = 0; + if (options->scanMode) + { + char string[strlen(inputPath) + 5]; + sprintf(string, "%s.key", inputPath); + FILE *fp2 = fopen(string, "rb"); + if (fp2 == NULL) + FATAL_ERROR("Failed to open key file for reading.\n"); + size_t count = fread(&key, 4, 1, fp2); + if (count != 1) + FATAL_ERROR("Not a valid key file.\n"); + fclose(fp2); + } + + WriteNtrImage(outputPath, options->numTiles, image.bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette, options->clobberSize, options->byteOrder, options->version101, options->sopc, options->scanMode, key); + + FreeImage(&image); +} + +void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + char *inputFileExtension = GetFileExtension(inputPath); + struct GbaToPngOptions options; + options.paletteFilePath = NULL; + if (isdigit(inputFileExtension[0])) + options.bitDepth = inputFileExtension[0] - '0'; + else + options.bitDepth = 4; + options.hasTransparency = false; + options.width = 1; + options.metatileWidth = 1; + options.metatileHeight = 1; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-palette") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No palette file path following \"-palette\".\n"); + + i++; + + options.paletteFilePath = argv[i]; + } + else if (strcmp(option, "-object") == 0) + { + options.hasTransparency = true; + } + else if (strcmp(option, "-width") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No width following \"-width\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.width)) + FATAL_ERROR("Failed to parse width.\n"); + + if (options.width < 1) + FATAL_ERROR("Width must be positive.\n"); + } + else if (strcmp(option, "-mwidth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile width value following \"-mwidth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileWidth)) + FATAL_ERROR("Failed to parse metatile width.\n"); + + if (options.metatileWidth < 1) + FATAL_ERROR("metatile width must be positive.\n"); + } + else if (strcmp(option, "-mheight") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile height value following \"-mheight\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileHeight)) + FATAL_ERROR("Failed to parse metatile height.\n"); + + if (options.metatileHeight < 1) + FATAL_ERROR("metatile height must be positive.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + if (options.metatileWidth > options.width) + options.width = options.metatileWidth; + + ConvertGbaToPng(inputPath, outputPath, &options); +} + +void HandleNtrToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct NtrToPngOptions options; + options.paletteFilePath = NULL; + options.hasTransparency = false; + options.width = 0; + options.metatileWidth = 1; + options.metatileHeight = 1; + options.palIndex = 1; + options.scanFrontToBack = false; + options.handleEmpty = false; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-palette") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No palette file path following \"-palette\".\n"); + + i++; + + options.paletteFilePath = argv[i]; + } + else if (strcmp(option, "-object") == 0) + { + options.hasTransparency = true; + } + else if (strcmp(option, "-palindex") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No palette index following \"-palindex\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.palIndex)) + FATAL_ERROR("Failed to parse palette index.\n"); + + if (options.width < 1) + FATAL_ERROR("Palette index must be positive.\n"); + } + else if (strcmp(option, "-width") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No width following \"-width\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.width)) + FATAL_ERROR("Failed to parse width.\n"); + + if (options.width < 1) + FATAL_ERROR("Width must be positive.\n"); + } + else if (strcmp(option, "-mwidth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile width value following \"-mwidth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileWidth)) + FATAL_ERROR("Failed to parse metatile width.\n"); + + if (options.metatileWidth < 1) + FATAL_ERROR("metatile width must be positive.\n"); + } + else if (strcmp(option, "-mheight") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile height value following \"-mheight\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileHeight)) + FATAL_ERROR("Failed to parse metatile height.\n"); + + if (options.metatileHeight < 1) + FATAL_ERROR("metatile height must be positive.\n"); + } + else if (strcmp(option, "-scanfronttoback") == 0) + { + options.scanFrontToBack = true; + } + else if (strcmp(option, "-handleempty") == 0) + { + options.handleEmpty = true; + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + if (options.width != 0 && options.metatileWidth > options.width) + options.width = options.metatileWidth; + + ConvertNtrToPng(inputPath, outputPath, &options); +} + +void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + char *outputFileExtension = GetFileExtension(outputPath); + int bitDepth; + if (strcmp(outputFileExtension, "nbfc") == 0) + bitDepth = 4; + else + bitDepth = outputFileExtension[0] - '0'; + struct PngToGbaOptions options; + options.numTiles = 0; + options.bitDepth = bitDepth; + options.metatileWidth = 1; + options.metatileHeight = 1; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-num_tiles") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No number of tiles following \"-num_tiles\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) + FATAL_ERROR("Failed to parse number of tiles.\n"); + + if (options.numTiles < 1) + FATAL_ERROR("Number of tiles must be positive.\n"); + } + else if (strcmp(option, "-mwidth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile width value following \"-mwidth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileWidth)) + FATAL_ERROR("Failed to parse metatile width.\n"); + + if (options.metatileWidth < 1) + FATAL_ERROR("metatile width must be positive.\n"); + } + else if (strcmp(option, "-mheight") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile height value following \"-mheight\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileHeight)) + FATAL_ERROR("Failed to parse metatile height.\n"); + + if (options.metatileHeight < 1) + FATAL_ERROR("metatile height must be positive.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + ConvertPngToGba(inputPath, outputPath, &options); +} + +void HandlePngToNtrCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct PngToNtrOptions options; + options.numTiles = 0; + options.bitDepth = 4; + options.metatileWidth = 1; + options.metatileHeight = 1; + options.clobberSize = false; + options.byteOrder = true; + options.version101 = false; + options.sopc = false; + options.scanMode = 0; + options.handleEmpty = false; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-num_tiles") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No number of tiles following \"-num_tiles\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) + FATAL_ERROR("Failed to parse number of tiles.\n"); + + if (options.numTiles < 1) + FATAL_ERROR("Number of tiles must be positive.\n"); + } + else if (strcmp(option, "-mwidth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile width value following \"-mwidth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileWidth)) + FATAL_ERROR("Failed to parse metatile width.\n"); + + if (options.metatileWidth < 1) + FATAL_ERROR("metatile width must be positive.\n"); + } + else if (strcmp(option, "-mheight") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No metatile height value following \"-mheight\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.metatileHeight)) + FATAL_ERROR("Failed to parse metatile height.\n"); + + if (options.metatileHeight < 1) + FATAL_ERROR("metatile height must be positive.\n"); + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No bitdepth value following \"-bitdepth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.bitDepth)) + FATAL_ERROR("Failed to parse bitdepth.\n"); + + if (options.bitDepth != 4 && options.bitDepth != 8) + FATAL_ERROR("bitdepth must be either 4 or 8.\n"); + } + else if (strcmp(option, "-clobbersize") == 0) + { + options.clobberSize = true; + } + else if (strcmp(option, "-nobyteorder") == 0) + { + options.byteOrder = false; + } + else if (strcmp(option, "-version101") == 0) + { + options.version101 = true; + } + else if (strcmp(option, "-sopc") == 0) + { + options.sopc = true; + } + else if (strcmp(option, "-scanned") == 0) + { + if (options.scanMode != 0) + FATAL_ERROR("Scan mode specified more than once.\n-scanned goes back to front as in DP, -scanfronttoback goes front to back as in PtHGSS\n"); + options.scanMode = 1; + } + else if (strcmp(option, "-scanfronttoback") == 0) + { + if (options.scanMode != 0) + FATAL_ERROR("Scan mode specified more than once.\n-scanned goes back to front as in DP, -scanfronttoback goes front to back as in PtHGSS\n"); + options.scanMode = 2; + } + else if (strcmp(option, "-handleempty") == 0) + { + options.handleEmpty = true; + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + ConvertPngToNtr(inputPath, outputPath, &options); +} + +void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Palette palette; + + ReadPngPalette(inputPath, &palette); + WriteGbaPalette(outputPath, &palette); +} + +void HandlePngToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct Palette palette; + bool ncpr = false; + bool ir = false; + bool nopad = false; + int bitdepth = 0; + int compNum = 0; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-ncpr") == 0) + { + ncpr = true; + } + else if (strcmp(option, "-ir") == 0) + { + ir = true; + } + else if (strcmp(option, "-nopad") == 0) + { + nopad = true; + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) + FATAL_ERROR("Failed to parse bitdepth.\n"); + + if (bitdepth != 4 && bitdepth != 8) + FATAL_ERROR("Bitdepth must be 4 or 8.\n"); + } + else if (strcmp(option, "-comp") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No compression value following \"-comp\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &compNum)) + FATAL_ERROR("Failed to parse compression value.\n"); + + if (compNum > 255) + FATAL_ERROR("Compression value must be 255 or below.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + ReadPngPalette(inputPath, &palette); + WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum); +} + +void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Palette palette; + + ReadGbaPalette(inputPath, &palette); + WriteJascPalette(outputPath, &palette); +} + +void HandleNtrToJascPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct Palette palette; + int bitdepth = 0; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) + FATAL_ERROR("Failed to parse bitdepth.\n"); + + if (bitdepth != 4 && bitdepth != 8) + FATAL_ERROR("Bitdepth must be 4 or 8.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + ReadNtrPalette(inputPath, &palette, bitdepth, 1); + WriteJascPalette(outputPath, &palette); +} + +void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + int numColors = 0; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-num_colors") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No number of colors following \"-num_colors\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &numColors)) + FATAL_ERROR("Failed to parse number of colors.\n"); + + if (numColors < 1) + FATAL_ERROR("Number of colors must be positive.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + struct Palette palette; + + ReadJascPalette(inputPath, &palette); + + if (numColors != 0) + palette.numColors = numColors; + + WriteGbaPalette(outputPath, &palette); +} + +void HandleJascToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + int numColors = 0; + bool ncpr = false; + bool ir = false; + bool nopad = false; + int bitdepth = 0; + int compNum = 0; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-num_colors") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No number of colors following \"-num_colors\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &numColors)) + FATAL_ERROR("Failed to parse number of colors.\n"); + + if (numColors < 1) + FATAL_ERROR("Number of colors must be positive.\n"); + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) + FATAL_ERROR("Failed to parse bitdepth.\n"); + + if (bitdepth != 4 && bitdepth != 8) + FATAL_ERROR("Bitdepth must be 4 or 8.\n"); + } + else if (strcmp(option, "-comp") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No compression value following \"-comp\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &compNum)) + FATAL_ERROR("Failed to parse compression value.\n"); + + if (compNum > 255) + FATAL_ERROR("Compression value must be 255 or below.\n"); + } + else if (strcmp(option, "-ncpr") == 0) + { + ncpr = true; + } + else if (strcmp(option, "-ir") == 0) + { + ir = true; + } + else if (strcmp(option, "-nopad") == 0) + { + nopad = true; + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + struct Palette palette; + + ReadJascPalette(inputPath, &palette); + + if (numColors != 0) + palette.numColors = numColors; + + WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum); +} + +void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + ReadLatinFont(inputPath, &image); + WritePng(outputPath, &image); + + FreeImage(&image); +} + +void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + image.bitDepth = 2; + + ReadPng(inputPath, &image); + WriteLatinFont(outputPath, &image); + + FreeImage(&image); +} + +void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + ReadHalfwidthJapaneseFont(inputPath, &image); + WritePng(outputPath, &image); + + FreeImage(&image); +} + +void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + image.bitDepth = 2; + + ReadPng(inputPath, &image); + WriteHalfwidthJapaneseFont(outputPath, &image); + + FreeImage(&image); +} + +void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + ReadFullwidthJapaneseFont(inputPath, &image); + WritePng(outputPath, &image); + + FreeImage(&image); +} + +void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + struct Image image; + + image.bitDepth = 2; + + ReadPng(inputPath, &image); + WriteFullwidthJapaneseFont(outputPath, &image); + + FreeImage(&image); +} + +void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + int overflowSize = 0; + int minDistance = 2; // default, for compatibility with LZ77UnCompVram() + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-overflow") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No size following \"-overflow\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &overflowSize)) + FATAL_ERROR("Failed to parse overflow size.\n"); + + if (overflowSize < 1) + FATAL_ERROR("Overflow size must be positive.\n"); + } + else if (strcmp(option, "-search") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No size following \"-overflow\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &minDistance)) + FATAL_ERROR("Failed to parse LZ min search distance.\n"); + + if (minDistance < 1) + FATAL_ERROR("LZ min search distance must be positive.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + // The overflow option allows a quirk in some of Ruby/Sapphire's tilesets + // to be reproduced. It works by appending a number of zeros to the data + // before compressing it and then amending the LZ header's size field to + // reflect the expected size. This will cause an overflow when decompressing + // the data. + + int fileSize; + unsigned char *buffer = ReadWholeFileZeroPadded(inputPath, &fileSize, overflowSize); + + int compressedSize; + unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize, minDistance); + + compressedData[1] = (unsigned char)fileSize; + compressedData[2] = (unsigned char)(fileSize >> 8); + compressedData[3] = (unsigned char)(fileSize >> 16); + + free(buffer); + + WriteWholeFile(outputPath, compressedData, compressedSize); + + free(compressedData); +} + +void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int uncompressedSize; + unsigned char *uncompressedData = LZDecompress(buffer, fileSize, &uncompressedSize); + + free(buffer); + + WriteWholeFile(outputPath, uncompressedData, uncompressedSize); + + free(uncompressedData); +} + +void HandleRLCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int compressedSize; + unsigned char *compressedData = RLCompress(buffer, fileSize, &compressedSize); + + free(buffer); + + WriteWholeFile(outputPath, compressedData, compressedSize); + + free(compressedData); +} + +void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int uncompressedSize; + unsigned char *uncompressedData = RLDecompress(buffer, fileSize, &uncompressedSize); + + free(buffer); + + WriteWholeFile(outputPath, uncompressedData, uncompressedSize); + + free(uncompressedData); +} + +void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + int fileSize; + int bitDepth = 4; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-depth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No size following \"-depth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &bitDepth)) + FATAL_ERROR("Failed to parse bit depth.\n"); + + if (bitDepth != 4 && bitDepth != 8) + FATAL_ERROR("GBA only supports bit depth of 4 or 8.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int compressedSize; + unsigned char *compressedData = HuffCompress(buffer, fileSize, &compressedSize, bitDepth); + + free(buffer); + + WriteWholeFile(outputPath, compressedData, compressedSize); + + free(compressedData); +} + +void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int uncompressedSize; + unsigned char *uncompressedData = HuffDecompress(buffer, fileSize, &uncompressedSize); + + free(buffer); + + WriteWholeFile(outputPath, uncompressedData, uncompressedSize); + + free(uncompressedData); +} + +int main(int argc, char **argv) +{ + if (argc < 3) + FATAL_ERROR("Usage: nitrogfx INPUT_PATH OUTPUT_PATH [options...]\n"); + + struct CommandHandler handlers[] = + { + { "1bpp", "png", HandleGbaToPngCommand }, + { "4bpp", "png", HandleGbaToPngCommand }, + { "8bpp", "png", HandleGbaToPngCommand }, + { "nbfc", "png", HandleGbaToPngCommand }, + { "NCGR", "png", HandleNtrToPngCommand }, + { "png", "1bpp", HandlePngToGbaCommand }, + { "png", "4bpp", HandlePngToGbaCommand }, + { "png", "nbfc", HandlePngToGbaCommand }, + { "png", "8bpp", HandlePngToGbaCommand }, + { "png", "NCGR", HandlePngToNtrCommand }, + { "png", "gbapal", HandlePngToGbaPaletteCommand }, + { "png", "nbfp", HandlePngToGbaPaletteCommand }, + { "png", "NCLR", HandlePngToNtrPaletteCommand }, + { "gbapal", "pal", HandleGbaToJascPaletteCommand }, + { "NCLR", "pal", HandleNtrToJascPaletteCommand }, + { "NCPR", "pal", HandleNtrToJascPaletteCommand }, + { "pal", "gbapal", HandleJascToGbaPaletteCommand }, + { "pal", "NCLR", HandleJascToNtrPaletteCommand }, + { "latfont", "png", HandleLatinFontToPngCommand }, + { "png", "latfont", HandlePngToLatinFontCommand }, + { "hwjpnfont", "png", HandleHalfwidthJapaneseFontToPngCommand }, + { "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand }, + { "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand }, + { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand }, + { NULL, "huff", HandleHuffCompressCommand }, + { NULL, "lz", HandleLZCompressCommand }, + { "huff", NULL, HandleHuffDecompressCommand }, + { "lz", NULL, HandleLZDecompressCommand }, + { NULL, "rl", HandleRLCompressCommand }, + { "rl", NULL, HandleRLDecompressCommand }, + { NULL, NULL, NULL } + }; + + char *inputPath = argv[1]; + char *outputPath = argv[2]; + char *inputFileExtension = GetFileExtension(inputPath); + char *outputFileExtension = GetFileExtension(outputPath); + + if (inputFileExtension == NULL) + FATAL_ERROR("Input file \"%s\" has no extension.\n", inputPath); + + if (outputFileExtension == NULL) + FATAL_ERROR("Output file \"%s\" has no extension.\n", outputPath); + + for (int i = 0; handlers[i].function != NULL; i++) + { + if ((handlers[i].inputFileExtension == NULL || strcmp(handlers[i].inputFileExtension, inputFileExtension) == 0) + && (handlers[i].outputFileExtension == NULL || strcmp(handlers[i].outputFileExtension, outputFileExtension) == 0)) + { + handlers[i].function(inputPath, outputPath, argc, argv); + return 0; + } + } + + FATAL_ERROR("Don't know how to convert \"%s\" to \"%s\".\n", inputPath, outputPath); +} diff --git a/tools/nitrogfx/options.h b/tools/nitrogfx/options.h new file mode 100644 index 00000000..8696e7a6 --- /dev/null +++ b/tools/nitrogfx/options.h @@ -0,0 +1,51 @@ +// Copyright (c) 2018 huderlem + +#ifndef OPTIONS_H +#define OPTIONS_H + +#include + +struct GbaToPngOptions { + char *paletteFilePath; + int bitDepth; + bool hasTransparency; + int width; + int metatileWidth; + int metatileHeight; + int palIndex; +}; + +struct PngToGbaOptions { + int numTiles; + int bitDepth; + int metatileWidth; + int metatileHeight; +}; + +struct PngToNtrOptions { + int numTiles; + int bitDepth; + int metatileWidth; + int metatileHeight; + bool clobberSize; + bool byteOrder; + bool version101; + bool sopc; + uint32_t scanMode; + bool handleEmpty; +}; + +struct NtrToPngOptions { + char *paletteFilePath; + int bitDepth; + bool hasTransparency; + int width; + int metatileWidth; + int metatileHeight; + int palIndex; + bool scanFrontToBack; + bool handleEmpty; +}; + + +#endif // OPTIONS_H diff --git a/tools/nitrogfx/rl.c b/tools/nitrogfx/rl.c new file mode 100644 index 00000000..993ac644 --- /dev/null +++ b/tools/nitrogfx/rl.c @@ -0,0 +1,149 @@ +// Copyright (c) 2016 YamaArashi + +#include +#include +#include "global.h" +#include "rl.h" + +unsigned char *RLDecompress(unsigned char *src, int srcSize, int *uncompressedSize) +{ + if (srcSize < 4) + goto fail; + + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + + unsigned char *dest = malloc(destSize); + + if (dest == NULL) + goto fail; + + int srcPos = 4; + int destPos = 0; + + for (;;) + { + if (srcPos >= srcSize) + goto fail; + + unsigned char flags = src[srcPos++]; + bool compressed = ((flags & 0x80) != 0); + + if (compressed) + { + int length = (flags & 0x7F) + 3; + unsigned char data = src[srcPos++]; + + if (destPos + length > destSize) + goto fail; + + for (int i = 0; i < length; i++) + dest[destPos++] = data; + } + else + { + int length = (flags & 0x7F) + 1; + + if (destPos + length > destSize) + goto fail; + + for (int i = 0; i < length; i++) + dest[destPos++] = src[srcPos++]; + } + + if (destPos == destSize) + { + *uncompressedSize = destSize; + return dest; + } + } + +fail: + FATAL_ERROR("Fatal error while decompressing RL file.\n"); +} + +unsigned char *RLCompress(unsigned char *src, int srcSize, int *compressedSize) +{ + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + srcSize * 2; + + // Round up to the next multiple of four. + worstCaseDestSize = (worstCaseDestSize + 3) & ~3; + + unsigned char *dest = malloc(worstCaseDestSize); + + if (dest == NULL) + goto fail; + + // header + dest[0] = 0x30; // RL compression type + dest[1] = (unsigned char)srcSize; + dest[2] = (unsigned char)(srcSize >> 8); + dest[3] = (unsigned char)(srcSize >> 16); + + int srcPos = 0; + int destPos = 4; + + for (;;) + { + bool compress = false; + int uncompressedStart = srcPos; + int uncompressedLength = 0; + + while (srcPos < srcSize && uncompressedLength < (0x7F + 1)) + { + compress = (srcPos + 2 < srcSize && src[srcPos] == src[srcPos + 1] && src[srcPos] == src[srcPos + 2]); + + if (compress) + break; + + srcPos++; + uncompressedLength++; + } + + if (uncompressedLength > 0) + { + dest[destPos++] = uncompressedLength - 1; + + for (int i = 0; i < uncompressedLength; i++) + dest[destPos++] = src[uncompressedStart + i]; + } + + if (compress) + { + unsigned char data = src[srcPos]; + int compressedLength = 0; + + while (compressedLength < (0x7F + 3) + && srcPos + compressedLength < srcSize + && src[srcPos + compressedLength] == data) + { + compressedLength++; + } + + dest[destPos++] = 0x80 | (compressedLength - 3); + dest[destPos++] = data; + + srcPos += compressedLength; + } + + if (srcPos == srcSize) + { + // Pad to multiple of 4 bytes. + int remainder = destPos % 4; + + if (remainder != 0) + { + for (int i = 0; i < 4 - remainder; i++) + dest[destPos++] = 0; + } + + *compressedSize = destPos; + return dest; + } + } + +fail: + FATAL_ERROR("Fatal error while compressing RL file.\n"); +} diff --git a/tools/nitrogfx/rl.h b/tools/nitrogfx/rl.h new file mode 100644 index 00000000..02ad8d6d --- /dev/null +++ b/tools/nitrogfx/rl.h @@ -0,0 +1,9 @@ +// Copyright (c) 2016 YamaArashi + +#ifndef RL_H +#define RL_H + +unsigned char *RLDecompress(unsigned char *src, int srcSize, int *uncompressedSize); +unsigned char *RLCompress(unsigned char *src, int srcSize, int *compressedSize); + +#endif // RL_H diff --git a/tools/nitrogfx/util.c b/tools/nitrogfx/util.c new file mode 100644 index 00000000..7dc4ca89 --- /dev/null +++ b/tools/nitrogfx/util.c @@ -0,0 +1,157 @@ +// Copyright (c) 2015 YamaArashi + +#include +#include +#include +#include +#include +#include +#include +#include "global.h" +#include "util.h" + +bool ParseNumber(char *s, char **end, int radix, int *intValue) +{ + char *localEnd; + + if (end == NULL) + end = &localEnd; + + errno = 0; + + const long longValue = strtol(s, end, radix); + + if (*end == s) + return false; // not a number + + if ((longValue == LONG_MIN || longValue == LONG_MAX) && errno == ERANGE) + return false; + + if (longValue > INT_MAX) + return false; + + if (longValue < INT_MIN) + return false; + + *intValue = (int)longValue; + + return true; +} + +char *GetFileExtension(char *path) +{ + char *extension = path; + + while (*extension != 0) + extension++; + + while (extension > path && *extension != '.') + extension--; + + if (extension == path) + return NULL; + + extension++; + + if (*extension == 0) + return NULL; + + return extension; +} + +unsigned char *ReadWholeFile(char *path, int *size) +{ + FILE *fp = fopen(path, "rb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); + + fseek(fp, 0, SEEK_END); + + *size = ftell(fp); + + unsigned char *buffer = malloc(*size); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); + + rewind(fp); + + if (fread(buffer, *size, 1, fp) != 1) + FATAL_ERROR("Failed to read \"%s\".\n", path); + + fclose(fp); + + return buffer; +} + +unsigned char *ReadWholeFileZeroPadded(char *path, int *size, int padAmount) +{ + FILE *fp = fopen(path, "rb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); + + fseek(fp, 0, SEEK_END); + + *size = ftell(fp); + + unsigned char *buffer = calloc(*size + padAmount, 1); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); + + rewind(fp); + + if (fread(buffer, *size, 1, fp) != 1) + FATAL_ERROR("Failed to read \"%s\".\n", path); + + fclose(fp); + + return buffer; +} + +void WriteWholeFile(char *path, void *buffer, int bufferSize) +{ + FILE *fp = fopen(path, "wb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + if (fwrite(buffer, bufferSize, 1, fp) != 1) + FATAL_ERROR("Failed to write to \"%s\".\n", path); + + fclose(fp); +} + +void WriteGenericNtrHeader(FILE* fp, const char* magicNumber, uint32_t size, bool byteorder, bool version101, uint16_t sectionCount) +{ + unsigned char header[0x10] = + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00 }; + //magic number + memcpy(header, magicNumber, 4); + + if (version101) + { + header[6] = 0x01; + } + + //byte order + if (!byteorder) + { + memset(header + 4, 0, 2); + } + + //size + size += 0x10; //add header size + header[8] = size & 0xFF; + header[9] = (size >> 8) & 0xFF; + header[10] = (size >> 16) & 0xFF; + header[11] = (size >> 24) & 0xFF; + + //section count + header[14] = sectionCount & 0xFF; + header[15] = (sectionCount >> 8) & 0xFF; + + fwrite(header, 1, 0x10, fp); +} diff --git a/tools/nitrogfx/util.h b/tools/nitrogfx/util.h new file mode 100644 index 00000000..080dd4be --- /dev/null +++ b/tools/nitrogfx/util.h @@ -0,0 +1,57 @@ +// Copyright (c) 2015 YamaArashi + +#ifndef UTIL_H +#define UTIL_H + +#include +#include + +bool ParseNumber(char *s, char **end, int radix, int *intValue); +char *GetFileExtension(char *path); +unsigned char *ReadWholeFile(char *path, int *size); +unsigned char *ReadWholeFileZeroPadded(char *path, int *size, int padAmount); +void WriteWholeFile(char *path, void *buffer, int bufferSize); +void WriteGenericNtrHeader(FILE* fp, const char* magicNumber, uint32_t size, bool byteorder, bool version101, uint16_t sectionCount); + +// Unaligned IO +static inline uint8_t ReadU8(const unsigned char *ptr, const size_t offset) { + return ptr[offset]; +} + +static inline uint16_t ReadU16(const unsigned char *ptr, const size_t offset) { + return ptr[offset] | (ptr[offset + 1] << 8); +} + +static inline uint32_t ReadU32(const unsigned char *ptr, const size_t offset) { + return ptr[offset] | (ptr[offset + 1] << 8) | (ptr[offset + 2] << 16) | (ptr[offset + 3] << 24); +} + +static inline int8_t ReadS8(const unsigned char *ptr, const size_t offset) { + return ptr[offset]; +} + +static inline int16_t ReadS16(const unsigned char *ptr, const size_t offset) { + return ptr[offset] | (ptr[offset + 1] << 8); +} + +static inline int32_t ReadS32(const unsigned char *ptr, const size_t offset) { + return ptr[offset] | (ptr[offset + 1] << 8) | (ptr[offset + 2] << 16) | (ptr[offset + 3] << 24); +} + +static inline void WriteU8(unsigned char *ptr, const size_t offset, uint8_t value) { + ptr[offset] = value; +} + +static inline void WriteU16(unsigned char *ptr, const size_t offset, uint16_t value) { + ptr[offset] = value; + ptr[offset + 1] = value >> 8; +} + +static inline void WriteU32(unsigned char *ptr, const size_t offset, uint32_t value) { + ptr[offset] = value; + ptr[offset + 1] = value >> 8; + ptr[offset + 2] = value >> 16; + ptr[offset + 3] = value >> 24; +} + +#endif // UTIL_H diff --git a/tools/ntr_merge_elf/ntr_merge_elf.sh b/tools/ntr_merge_elf/ntr_merge_elf.sh new file mode 100755 index 00000000..ea23baf0 --- /dev/null +++ b/tools/ntr_merge_elf/ntr_merge_elf.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash + +# This script was written by PikalaxALT and is licensed under GPL 3.0. +# Modification and redistribution of this script is encouraged. +# For more information, visit https://www.gnu.org/licenses/gpl-3.0.en.html + +# Version 0.1: 29 Sep 2021 + +# Script to merge .nef file with .sbin files into a .elf file +# compatible with objdump, with all the correct virtual addresses. +# Handles autoloads and overlays automatically. + +# USAGE: +# ntr_merge_elf.sh STEM + +# STEM.nef, STEM.sbin, and STEM_defs.sbin must exist + +# getword FILE OFFSET +# Read a 32-bit unsigned integer from FILE starting at OFFSET +getword() { + od -j "$2" -N 4 -A n -t u "$1" | awk '{$1=$1};1' +} + +# assertFile FILE +# If FILE does not exist, panic +assertFile() { + [[ -f "$1" ]] || { echo $1: no such file or directory; exit 1; } +} + +# Prefer devkitARM, since stock ARM binutils choke on metrowerks objects +[[ -n "$DEVKITARM" ]] && export PATH="$DEVKITARM/bin:$PATH" +NM=arm-none-eabi-nm +OBJCOPY=arm-none-eabi-objcopy +STEM="$1" + +# MacOS requires GNU mktemp explicitly +if [[ "$OSTYPE" == "darwin"* ]]; then +MKTEMP=gmktemp +else +MKTEMP=mktemp +fi + +[[ -z "$STEM" ]] && { echo "usage: $0 [-h] STEM"; exit 1; } +[[ $STEM == "-h" ]] && { + echo "usage: $0 [-h] STEM" + echo "" + echo "STEM Prefix to the output static sbin (from running" + echo " mwldarm in a nitro build). For example, if you" + echo " output build/diamond.us/main.sbin, STEM would" + echo " be \"build/diamond.us/main\"." + echo "" + echo "-h Print this message and exit" + exit 0 +} + +assertFile $STEM.sbin +assertFile $STEM.nef +assertFile ${STEM}_defs.sbin + +# Overlays +flags= +while read -r ovy; do + assertFile $(dirname $STEM)/$ovy + flags="$flags --update-section ${ovy//.sbin/}=$(dirname $STEM)/$ovy" +done < <(tail -c+16 ${STEM}_defs.sbin | strings) + +# Find _start_ModuleParams +static_load=$(getword ${STEM}_defs.sbin 0) +static_size=$(getword ${STEM}_defs.sbin 8) +static_donecb=$(getword ${STEM}_defs.sbin 12) +static_end=$((static_load + static_size)) +ptr=$((static_donecb-static_load)) +while true; do + test=$(getword ${STEM}.sbin ${ptr}) + [[ $test == $static_end ]] && { ((ptr-=4)); break; } + ((ptr+=4)) +done + +# Get the autoload table and data pointers +autoload_table_start=$(($(getword ${STEM}.sbin ${ptr})-static_load)) +autoload_start=$(($(getword ${STEM}.sbin $((ptr+8)))-static_load)) + +# Truncate the static module and dump +static_size=$autoload_start +static_sbin=$($MKTEMP --suffix=sbin) +dd if=${STEM}.sbin of=$static_sbin bs=1 count=${static_size} 2>/dev/null +flags="$flags --update-section $(basename $STEM)=$static_sbin" +to_clean=$static_sbin + +# Dump autoloads +# The output of `NM -n $STEM.nef` is assumed to be sorted in the order in +# which the autoloads were placed in the static .sbin. +# Autoload table is struct { u32 load; u32 size; u32 bsssize; } table[]; +while read -r name; do + aload_text_size=$(getword ${STEM}.sbin $((autoload_table_start+4))) + aload_sbin=$($MKTEMP --suffix=sbin) + dd if=${STEM}.sbin of=$aload_sbin bs=1 skip=$autoload_start count=$aload_text_size 2>/dev/null + ((autoload_start+=aload_text_size)) + ((autoload_table_start+=12)) + flags="$flags --update-section $name=$aload_sbin" + to_clean="$to_clean $aload_sbin" +done < <($NM -n $STEM.nef | grep -E "SDK_AUTOLOAD_\w+_START" | grep -vE "_(TEXT|BSS|DATA|ARENA|SINIT|ETABLE)_" | cut -d' ' -f3 | cut -d'_' -f3- | sed 's/_START//g') + +# Compile the elf +$OBJCOPY $flags $STEM.nef $STEM.elf 2>/dev/null + +# Remove temporary files +rm -f $to_clean diff --git a/tools/o2narc/.gitignore b/tools/o2narc/.gitignore new file mode 100644 index 00000000..3d095ade --- /dev/null +++ b/tools/o2narc/.gitignore @@ -0,0 +1 @@ +o2narc diff --git a/tools/o2narc/Makefile b/tools/o2narc/Makefile new file mode 100644 index 00000000..2e30952b --- /dev/null +++ b/tools/o2narc/Makefile @@ -0,0 +1,29 @@ +CXX := g++ +CXXFLAGS := -O3 -std=c++11 + +CXXSRCS := o2narc.cpp Options.cpp RelocElfReader.cpp +CXXOBJS := $(CXXSRCS:%.cpp=%.o) + +.PHONY: all clean + +all: o2narc + @: + +o2narc: $(CXXOBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d +$(DEPDIR): ; @mkdir -p $@ + +%.o: %.cpp +%.o: %.cpp $(DEPDIR)/%.d | $(DEPDIR) + $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +clean: + $(RM) o2narc o2narc.exe + +DEPFILES := $(CXXSRCS:%.cpp=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/o2narc/Narc.h b/tools/o2narc/Narc.h new file mode 100644 index 00000000..682a4e71 --- /dev/null +++ b/tools/o2narc/Narc.h @@ -0,0 +1,73 @@ +#ifndef GUARD_NARC_H +#define GUARD_NARC_H + +#include + +struct FileAllocationTableEntry +{ + uint32_t Start = 0; + uint32_t End = 0; + static std::vector _make(std::vector &sizes) { + std::vector ret(sizes.size()); + for (int i = 0; i < sizes.size(); i++) { + if (i == 0) { + ret[i].Start = 0; + } else { + ret[i].Start = ret[i - 1].End; + } + ret[i].End = (ret[i].Start + sizes[i] + 3) & ~3; + } + return ret; + } +}; + +struct FileAllocationTable +{ + uint32_t Id = 0x46415442; + uint32_t ChunkSize = sizeof(FileAllocationTable); + uint16_t FileCount = 0; + uint16_t Reserved = 0; + FileAllocationTable(std::vector &sizes) { + FileCount = sizes.size(); + ChunkSize += FileCount * sizeof(FileAllocationTableEntry); + } +}; + +struct FileNameTableEntry +{ + uint32_t Offset = 4; + uint16_t FirstFileId = 0; + uint16_t Utility = 1; +}; + +struct FileNameTable +{ + uint32_t Id = 0x464e5442; + uint32_t ChunkSize = sizeof(FileNameTable) + sizeof(FileNameTableEntry); +}; + +struct FileImages +{ + uint32_t Id = 0x46494d47; + uint32_t ChunkSize = 0; + template + explicit FileImages(std::vector &data) { + ChunkSize = data.size() * sizeof(T) + sizeof(FileImages); + } +}; + +struct NarcHeader +{ + uint32_t Id = 0x4352414e; + uint16_t ByteOrderMark = 0xFFFE; + uint16_t Version = 0x0100; + uint32_t FileSize = 0; + uint16_t ChunkSize = sizeof(NarcHeader); + uint16_t ChunkCount = 3; + NarcHeader() = default; + NarcHeader(FileAllocationTable &fat, FileNameTable &fnt, FileImages &img) { + FileSize = sizeof(NarcHeader) + fat.ChunkSize + fnt.ChunkSize + img.ChunkSize; + } +}; + +#endif //GUARD_NARC_H diff --git a/tools/o2narc/Options.cpp b/tools/o2narc/Options.cpp new file mode 100644 index 00000000..4b70c2dc --- /dev/null +++ b/tools/o2narc/Options.cpp @@ -0,0 +1,141 @@ +#include +#include +#include +#include +#include "Options.h" +#include "Narc.h" +#include "RelocElfReader.h" + +Options::Options(int argc, char **argv) { + for (int i = 1; i < argc; i++) { + string arg{argv[i]}; + if (arg == "-f" || arg == "--flatten") { + flatten = true; + } else if (arg == "-p" || arg == "--padding") { + int padval_i = stoi(argv[++i]); + if (padval_i < 0 || padval_i > 255) { + throw command_error(string{"invalid 8-bit value "} + argv[i] + " for " + arg); + } + padval = static_cast(padval_i); + } else if (arg == "-n" || arg == "--naix") { + naix = true; + } else if (arg[0] == '-') { + throw command_error("unrecognized option flag: " + arg); + } else if (posargs.size() >= 2) { + throw command_error("unrecognized positional argument: " + arg); + } else { + posargs.emplace_back(arg); + } + } + if (posargs.size() < 2) { + throw command_error("missing positional arg"); + } + objfile.open(posargs[0], ios::in | ios::binary); + narcfile.open(posargs[1], ios::out | ios::binary); +} + +void Options::ReadObjectFile(vector &rodata, vector &sizes) { + ELF_ASSERT(objfile.HasSection(".rodata")); + rodata.resize(objfile.GetSectionHeader(".rodata").sh_size); + objfile.ReadSectionData(objfile.GetSectionHeader(".rodata"), rodata.data()); + // Determine what O file we're dealing with + if (objfile.HasSymbol("__size")) { + uint32_t size = objfile.GetSymbol("__size").st_size; + if (size == sizeof(uint32_t)) { + objfile.ReadSymbolData(objfile.GetSymbol("__size"), &size); + sizes.resize((rodata.size() + size - 1) / size); + fill(sizes.begin(), sizes.end(), size); + } else { + sizes.resize(objfile.GetSymbol("__size").st_size / sizeof(uint32_t)); + objfile.ReadSymbolData(objfile.GetSymbol("__size"), sizes.data()); + } + } else { + auto pred = [&](const Elf32_Sym &sym) { + return sym.st_size != 0 + && strcmp(objfile.GetSectionName(objfile.sections()[sym.st_shndx]), ".rodata") == 0 + && strcmp(objfile.GetSymbolName(sym), "__size") != 0 + && strcmp(objfile.GetSymbolName(sym), "__data") != 0 + && strcmp(objfile.GetSymbolName(sym), ".rodata") != 0; + }; + sizes.resize(count_if(objfile.symbols().begin(), objfile.symbols().end(), pred)); + ELF_ASSERT(!sizes.empty()); + int t = 0; + for (const auto &sym : objfile.symbols()) { + if (pred(sym)) { + sizes[t++] = sym.st_size; + } + } + } +} + +void Options::OverwritePadding(vector &rodata, vector &sizes) const { + uint32_t end = 0; + for (auto & size : sizes) { + end += size; + uint32_t pad_end = (end + 3) & ~3; + memset(&rodata[end], padval, pad_end - end); + end = pad_end; + } +} + +void Options::WriteNarc(vector &rodata, vector &sizes) { + if (!flatten) { + FileImages fimg(rodata); + FileNameTableEntry fntent; + FileNameTable fnt; + vector fatent = FileAllocationTableEntry::_make(sizes); + FileAllocationTable fat(fatent); + NarcHeader narc(fat, fnt, fimg); + narcfile.write((char *)&narc, sizeof(narc)); + narcfile.write((char *)&fat, sizeof(fat)); + narcfile.write((char *)fatent.data(), fatent.size() * sizeof(FileAllocationTableEntry)); + narcfile.write((char *)&fnt, sizeof(fnt)); + narcfile.write((char *)&fntent, sizeof(fntent)); + narcfile.write((char *)&fimg, sizeof(fimg)); + } + narcfile.write((char *)rodata.data(), rodata.size()); +} + +void Options::WriteNaix(vector &sizes) { + if (naix) { + string naixname = posargs[1].substr(0, posargs[1].find_last_of('.')) + ".naix"; + string stem = naixname.substr(naixname.find_last_of('/') + 1, naixname.find_last_of('.') - naixname.find_last_of('/') - 1); + string stem_upper = stem; + for (auto &c : stem_upper) { c = toupper(c); } + ofstream naixfile(naixname); + naixfile << "/*\n" + " * THIS FILE WAS AUTOMATICALLY\n" + " * GENERATED BY tools/o2narc\n" + " * DO NOT MODIFY!!!\n" + " */\n" + "\n" + "#ifndef NARC_" << stem_upper << "_NAIX_\n" + "#define NARC_" << stem_upper << "_NAIX_\n" + "\n" + "enum {\n"; + char num_buf[9] = "00000000"; + for (int i = 0; i < sizes.size(); i++) { + naixfile << " NARC_" << stem << "_" << stem << "_" << num_buf << " = " << i << "," << endl; + for (int k = 7; k >= 0; k--) { + num_buf[k]++; + if (num_buf[k] > '9') { + num_buf[k] = '0'; + } else { + break; + } + } + } + naixfile << "};\n\n#endif //NARC_" << stem_upper << "_NAIX_\n"; + } +} + +int Options::main() { + vector sizes; + vector rodata; + + ReadObjectFile(rodata, sizes); + OverwritePadding(rodata, sizes); + WriteNarc(rodata, sizes); + WriteNaix(sizes); + return 0; +} diff --git a/tools/o2narc/Options.h b/tools/o2narc/Options.h new file mode 100644 index 00000000..d4407892 --- /dev/null +++ b/tools/o2narc/Options.h @@ -0,0 +1,34 @@ +#ifndef GUARD_OPTIONS_H +#define GUARD_OPTIONS_H + +#include +#include "RelocElfReader.h" + +using namespace std; + +class command_error : public exception { + const char *_what; +public: + explicit command_error(const char *s) {_what = s;} + explicit command_error(const string &s) {_what = s.c_str();} + const char *what() const noexcept override { return _what; } +}; + +class Options { + vector posargs; + bool flatten = false; + bool naix = false; + char padval = '\xFF'; + Elf objfile; + ofstream narcfile; + + void ReadObjectFile(vector &rodata, vector &sizes); + void OverwritePadding(vector &rodata, vector &sizes) const; + void WriteNarc(vector &rodata, vector &sizes); + void WriteNaix(vector &sizes); +public: + Options(int argc, char ** argv); + int main(); +}; + +#endif //GUARD_OPTIONS_H diff --git a/tools/o2narc/RelocElfReader.cpp b/tools/o2narc/RelocElfReader.cpp new file mode 100644 index 00000000..dbefa5e4 --- /dev/null +++ b/tools/o2narc/RelocElfReader.cpp @@ -0,0 +1,68 @@ +#include +#include +#include "RelocElfReader.h" + +Elf::Elf(const string &filename, ios::openmode openmode) { + open(filename, openmode); +} + +void Elf::open(const string &filename, ios::openmode openmode) { + handle.open(filename, openmode); + ELF_ASSERT(handle.good()); + handle.read((char *)&ehdr, sizeof(Elf32_Ehdr)); + ELF_ASSERT(memcmp(ehdr.e_ident, ELFMAG, SELFMAG) == 0); + ELF_ASSERT(ehdr.e_ident[EI_CLASS] == ELFCLASS32); + ELF_ASSERT(ehdr.e_ident[EI_DATA] == ELFDATA2LSB); + ELF_ASSERT(ehdr.e_ident[EI_VERSION] == EV_CURRENT); + ELF_ASSERT(ehdr.e_ehsize == sizeof(Elf32_Ehdr)); + shdr.resize(ehdr.e_shnum); + handle.seekg(ehdr.e_shoff); + handle.read((char *)shdr.data(), static_cast(ehdr.e_shnum * sizeof(Elf32_Shdr))); + for (const auto & sec : shdr) { + switch (sec.sh_type) { + case SHT_STRTAB: { + char *&_strtab = (&sec - shdr.data() == ehdr.e_shstrndx) ? shstrtab : strtab; + ELF_ASSERT(_strtab == nullptr); + _strtab = new char[sec.sh_size]; + handle.seekg(sec.sh_offset); + handle.read(_strtab, sec.sh_size); + break; + } + case SHT_SYMTAB: + ELF_ASSERT(sym.empty()); + sym.resize(sec.sh_size / sizeof(Elf32_Sym)); + handle.seekg(sec.sh_offset); + handle.read((char *)sym.data(), sec.sh_size); + break; + } + } +} + +Elf::~Elf() { + delete[] strtab; + delete[] shstrtab; +} + +Elf32_Shdr &Elf::GetSectionHeader(const char *name) { + return *find_if(shdr.begin(), shdr.end(), [=](const Elf32_Shdr &sec) { + return strcmp(shstrtab + sec.sh_name, name) == 0; + } ); +} + +bool Elf::HasSection(const char *name) { + return any_of(shdr.begin(), shdr.end(), [=](const Elf32_Shdr &sec) { + return strcmp(shstrtab + sec.sh_name, name) == 0; + } ); +} + +Elf32_Sym &Elf::GetSymbol(const char *name) { + return *find_if(sym.begin(), sym.end(), [=](const Elf32_Sym &symbol) { + return strcmp(strtab + symbol.st_name, name) == 0; + }); +} + +bool Elf::HasSymbol(const char *name) { + return any_of(sym.begin(), sym.end(), [=](const Elf32_Sym &symbol) { + return strcmp(strtab + symbol.st_name, name) == 0; + }); +} diff --git a/tools/o2narc/RelocElfReader.h b/tools/o2narc/RelocElfReader.h new file mode 100644 index 00000000..b9729e5f --- /dev/null +++ b/tools/o2narc/RelocElfReader.h @@ -0,0 +1,77 @@ +#ifndef GUARD_RELOCELFREADER_H +#define GUARD_RELOCELFREADER_H + +#include +#include +#include "elf.h" + +using namespace std; + + +class elf_exception : public exception { + const char *_what; +public: + explicit elf_exception(const char *s) {_what = s;} + explicit elf_exception(const string &s) {_what = s.c_str();} + const char *what() const noexcept override { return _what; } +}; + +#define ELF_ASSERT(expr) do {if(!(expr)) {throw elf_exception("ELF_ASSERT(" #expr ") failed");}} while (0) + +class Elf { + fstream handle; + Elf32_Ehdr ehdr {}; + vector shdr; + vector sym; + char *strtab = nullptr; + char *shstrtab = nullptr; +public: + Elf() = default; + explicit Elf(const string &filename, ios::openmode openmode = ios::in | ios::binary); + void open(const string &filename, ios::openmode openmode = ios::in | ios::binary); + ~Elf(); + bool is_open() const { + return handle.is_open(); + } + Elf32_Shdr &GetSectionHeader(const char *name); + Elf32_Shdr &GetSectionHeader(const string &name) { return GetSectionHeader(name.c_str()); } + bool HasSection(const char *name); + bool HasSection(const string &name) { return HasSection(name.c_str()); } + Elf32_Sym &GetSymbol(const char *name); + Elf32_Sym &GetSymbol(const string &name) { return GetSymbol(name.c_str()); } + bool HasSymbol(const char *name); + bool HasSymbol(const string &name) { return HasSymbol(name.c_str()); } + template + T *ReadSectionData(const Elf32_Shdr &sec, T *dest = nullptr) { + if (dest == nullptr) { + if (sec.sh_size == 0) { + return nullptr; + } + dest = new T[sec.sh_size]; + } + handle.seekg(sec.sh_offset); + handle.read((char *)dest, sec.sh_size); + return dest; + } + + template + T *ReadSymbolData(const Elf32_Sym &symbol, T *dest = nullptr) { + if (dest == nullptr) { + if (symbol.st_size == 0) { + return nullptr; + } + dest = new T[symbol.st_size]; + } + handle.seekg(symbol.st_value - shdr[symbol.st_shndx].sh_addr + shdr[symbol.st_shndx].sh_offset); + handle.read((char *)dest, symbol.st_size); + return dest; + } + + vector& sections() { return shdr; } + vector& symbols() { return sym; } + const char *GetSymbolName(const Elf32_Sym &symbol) const { return strtab + symbol.st_name; } + const char *GetSectionName(const Elf32_Shdr &sec) const { return shstrtab + sec.sh_name; } +}; + + +#endif //GUARD_RELOCELFREADER_H diff --git a/tools/o2narc/elf.h b/tools/o2narc/elf.h new file mode 100644 index 00000000..c5f9f279 --- /dev/null +++ b/tools/o2narc/elf.h @@ -0,0 +1,2430 @@ +#ifndef _ELF_H +#define _ELF_H 1 + +/* Standard ELF types. */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type for a 16-bit quantity. */ +typedef uint16_t Elf32_Half; +typedef uint16_t Elf64_Half; + +/* Types for signed and unsigned 32-bit quantities. */ +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; + +/* Types for signed and unsigned 64-bit quantities. */ +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +/* Type of addresses. */ +typedef uint32_t Elf32_Addr; +typedef uint64_t Elf64_Addr; + +/* Type of file offsets. */ +typedef uint32_t Elf32_Off; +typedef uint64_t Elf64_Off; + +/* Type for section indices, which are 16-bit quantities. */ +typedef uint16_t Elf32_Section; +typedef uint16_t Elf64_Section; + +/* Type for version symbol information. */ +typedef Elf32_Half Elf32_Versym; +typedef Elf64_Half Elf64_Versym; + + +/* The ELF file header. This appears at the start of every ELF file. */ + +#define EI_NIDENT (16) + +typedef struct +{ + unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ + Elf32_Half e_type; /* Object file type */ + Elf32_Half e_machine; /* Architecture */ + Elf32_Word e_version; /* Object file version */ + Elf32_Addr e_entry; /* Entry point virtual address */ + Elf32_Off e_phoff; /* Program header table file offset */ + Elf32_Off e_shoff; /* Section header table file offset */ + Elf32_Word e_flags; /* Processor-specific flags */ + Elf32_Half e_ehsize; /* ELF header size in bytes */ + Elf32_Half e_phentsize; /* Program header table entry size */ + Elf32_Half e_phnum; /* Program header table entry count */ + Elf32_Half e_shentsize; /* Section header table entry size */ + Elf32_Half e_shnum; /* Section header table entry count */ + Elf32_Half e_shstrndx; /* Section header string table index */ +} Elf32_Ehdr; + +typedef struct +{ + unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ + Elf64_Half e_type; /* Object file type */ + Elf64_Half e_machine; /* Architecture */ + Elf64_Word e_version; /* Object file version */ + Elf64_Addr e_entry; /* Entry point virtual address */ + Elf64_Off e_phoff; /* Program header table file offset */ + Elf64_Off e_shoff; /* Section header table file offset */ + Elf64_Word e_flags; /* Processor-specific flags */ + Elf64_Half e_ehsize; /* ELF header size in bytes */ + Elf64_Half e_phentsize; /* Program header table entry size */ + Elf64_Half e_phnum; /* Program header table entry count */ + Elf64_Half e_shentsize; /* Section header table entry size */ + Elf64_Half e_shnum; /* Section header table entry count */ + Elf64_Half e_shstrndx; /* Section header string table index */ +} Elf64_Ehdr; + +/* Fields in the e_ident array. The EI_* macros are indices into the + array. The macros under each EI_* macro are the values the byte + may have. */ + +#define EI_MAG0 0 /* File identification byte 0 index */ +#define ELFMAG0 0x7f /* Magic number byte 0 */ + +#define EI_MAG1 1 /* File identification byte 1 index */ +#define ELFMAG1 'E' /* Magic number byte 1 */ + +#define EI_MAG2 2 /* File identification byte 2 index */ +#define ELFMAG2 'L' /* Magic number byte 2 */ + +#define EI_MAG3 3 /* File identification byte 3 index */ +#define ELFMAG3 'F' /* Magic number byte 3 */ + +/* Conglomeration of the identification bytes, for easy testing as a word. */ +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define EI_CLASS 4 /* File class byte index */ +#define ELFCLASSNONE 0 /* Invalid class */ +#define ELFCLASS32 1 /* 32-bit objects */ +#define ELFCLASS64 2 /* 64-bit objects */ +#define ELFCLASSNUM 3 + +#define EI_DATA 5 /* Data encoding byte index */ +#define ELFDATANONE 0 /* Invalid data encoding */ +#define ELFDATA2LSB 1 /* 2's complement, little endian */ +#define ELFDATA2MSB 2 /* 2's complement, big endian */ +#define ELFDATANUM 3 + +#define EI_VERSION 6 /* File version byte index */ +/* Value must be EV_CURRENT */ + +#define EI_OSABI 7 /* OS ABI identification */ +#define ELFOSABI_NONE 0 /* UNIX System V ABI */ +#define ELFOSABI_SYSV 0 /* Alias. */ +#define ELFOSABI_HPUX 1 /* HP-UX */ +#define ELFOSABI_NETBSD 2 /* NetBSD. */ +#define ELFOSABI_LINUX 3 /* Linux. */ +#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ +#define ELFOSABI_AIX 7 /* IBM AIX. */ +#define ELFOSABI_IRIX 8 /* SGI Irix. */ +#define ELFOSABI_FREEBSD 9 /* FreeBSD. */ +#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ +#define ELFOSABI_MODESTO 11 /* Novell Modesto. */ +#define ELFOSABI_OPENBSD 12 /* OpenBSD. */ +#define ELFOSABI_ARM 97 /* ARM */ +#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ + +#define EI_ABIVERSION 8 /* ABI version */ + +#define EI_PAD 9 /* Byte index of padding bytes */ + +/* Legal values for e_type (object file type). */ + +#define ET_NONE 0 /* No file type */ +#define ET_REL 1 /* Relocatable file */ +#define ET_EXEC 2 /* Executable file */ +#define ET_DYN 3 /* Shared object file */ +#define ET_CORE 4 /* Core file */ +#define ET_NUM 5 /* Number of defined types */ +#define ET_LOOS 0xfe00 /* OS-specific range start */ +#define ET_HIOS 0xfeff /* OS-specific range end */ +#define ET_LOPROC 0xff00 /* Processor-specific range start */ +#define ET_HIPROC 0xffff /* Processor-specific range end */ + +/* Legal values for e_machine (architecture). */ + +#define EM_NONE 0 /* No machine */ +#define EM_M32 1 /* AT&T WE 32100 */ +#define EM_SPARC 2 /* SUN SPARC */ +#define EM_386 3 /* Intel 80386 */ +#define EM_68K 4 /* Motorola m68k family */ +#define EM_88K 5 /* Motorola m88k family */ +#define EM_860 7 /* Intel 80860 */ +#define EM_MIPS 8 /* MIPS R3000 big-endian */ +#define EM_S370 9 /* IBM System/370 */ +#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ + +#define EM_PARISC 15 /* HPPA */ +#define EM_VPP500 17 /* Fujitsu VPP500 */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_960 19 /* Intel 80960 */ +#define EM_PPC 20 /* PowerPC */ +#define EM_PPC64 21 /* PowerPC 64-bit */ +#define EM_S390 22 /* IBM S390 */ + +#define EM_V800 36 /* NEC V800 series */ +#define EM_FR20 37 /* Fujitsu FR20 */ +#define EM_RH32 38 /* TRW RH-32 */ +#define EM_RCE 39 /* Motorola RCE */ +#define EM_ARM 40 /* ARM */ +#define EM_FAKE_ALPHA 41 /* Digital Alpha */ +#define EM_SH 42 /* Hitachi SH */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +#define EM_TRICORE 44 /* Siemens Tricore */ +#define EM_ARC 45 /* Argonaut RISC Core */ +#define EM_H8_300 46 /* Hitachi H8/300 */ +#define EM_H8_300H 47 /* Hitachi H8/300H */ +#define EM_H8S 48 /* Hitachi H8S */ +#define EM_H8_500 49 /* Hitachi H8/500 */ +#define EM_IA_64 50 /* Intel Merced */ +#define EM_MIPS_X 51 /* Stanford MIPS-X */ +#define EM_COLDFIRE 52 /* Motorola Coldfire */ +#define EM_68HC12 53 /* Motorola M68HC12 */ +#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ +#define EM_PCP 55 /* Siemens PCP */ +#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor */ +#define EM_STARCORE 58 /* Motorola Start*Core processor */ +#define EM_ME16 59 /* Toyota ME16 processor */ +#define EM_ST100 60 /* STMicroelectronic ST100 processor */ +#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ +#define EM_X86_64 62 /* AMD x86-64 architecture */ +#define EM_PDSP 63 /* Sony DSP Processor */ + +#define EM_FX66 66 /* Siemens FX66 microcontroller */ +#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ +#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ +#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ +#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ +#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ +#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ +#define EM_SVX 73 /* Silicon Graphics SVx */ +#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ +#define EM_VAX 75 /* Digital VAX */ +#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ +#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ +#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ +#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ +#define EM_HUANY 81 /* Harvard University machine-independent object files */ +#define EM_PRISM 82 /* SiTera Prism */ +#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define EM_FR30 84 /* Fujitsu FR30 */ +#define EM_D10V 85 /* Mitsubishi D10V */ +#define EM_D30V 86 /* Mitsubishi D30V */ +#define EM_V850 87 /* NEC v850 */ +#define EM_M32R 88 /* Mitsubishi M32R */ +#define EM_MN10300 89 /* Matsushita MN10300 */ +#define EM_MN10200 90 /* Matsushita MN10200 */ +#define EM_PJ 91 /* picoJava */ +#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ +#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define EM_NUM 95 + +/* If it is necessary to assign new unofficial EM_* values, please + pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the + chances of collision with official or non-GNU unofficial values. */ + +#define EM_ALPHA 0x9026 + +/* Legal values for e_version (version). */ + +#define EV_NONE 0 /* Invalid ELF version */ +#define EV_CURRENT 1 /* Current version */ +#define EV_NUM 2 + +/* Section header. */ + +typedef struct +{ + Elf32_Word sh_name; /* Section name (string tbl index) */ + Elf32_Word sh_type; /* Section type */ + Elf32_Word sh_flags; /* Section flags */ + Elf32_Addr sh_addr; /* Section virtual addr at execution */ + Elf32_Off sh_offset; /* Section file offset */ + Elf32_Word sh_size; /* Section size in bytes */ + Elf32_Word sh_link; /* Link to another section */ + Elf32_Word sh_info; /* Additional section information */ + Elf32_Word sh_addralign; /* Section alignment */ + Elf32_Word sh_entsize; /* Entry size if section holds table */ +} Elf32_Shdr; + +typedef struct +{ + Elf64_Word sh_name; /* Section name (string tbl index) */ + Elf64_Word sh_type; /* Section type */ + Elf64_Xword sh_flags; /* Section flags */ + Elf64_Addr sh_addr; /* Section virtual addr at execution */ + Elf64_Off sh_offset; /* Section file offset */ + Elf64_Xword sh_size; /* Section size in bytes */ + Elf64_Word sh_link; /* Link to another section */ + Elf64_Word sh_info; /* Additional section information */ + Elf64_Xword sh_addralign; /* Section alignment */ + Elf64_Xword sh_entsize; /* Entry size if section holds table */ +} Elf64_Shdr; + +/* Special section indices. */ + +#define SHN_UNDEF 0 /* Undefined section */ +#define SHN_LORESERVE 0xff00 /* Start of reserved indices */ +#define SHN_LOPROC 0xff00 /* Start of processor-specific */ +#define SHN_HIPROC 0xff1f /* End of processor-specific */ +#define SHN_LOOS 0xff20 /* Start of OS-specific */ +#define SHN_HIOS 0xff3f /* End of OS-specific */ +#define SHN_ABS 0xfff1 /* Associated symbol is absolute */ +#define SHN_COMMON 0xfff2 /* Associated symbol is common */ +#define SHN_XINDEX 0xffff /* Index is in extra table. */ +#define SHN_HIRESERVE 0xffff /* End of reserved indices */ + +/* Legal values for sh_type (section type). */ + +#define SHT_NULL 0 /* Section header table entry unused */ +#define SHT_PROGBITS 1 /* Program data */ +#define SHT_SYMTAB 2 /* Symbol table */ +#define SHT_STRTAB 3 /* String table */ +#define SHT_RELA 4 /* Relocation entries with addends */ +#define SHT_HASH 5 /* Symbol hash table */ +#define SHT_DYNAMIC 6 /* Dynamic linking information */ +#define SHT_NOTE 7 /* Notes */ +#define SHT_NOBITS 8 /* Program space with no data (bss) */ +#define SHT_REL 9 /* Relocation entries, no addends */ +#define SHT_SHLIB 10 /* Reserved */ +#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ +#define SHT_INIT_ARRAY 14 /* Array of constructors */ +#define SHT_FINI_ARRAY 15 /* Array of destructors */ +#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ +#define SHT_GROUP 17 /* Section group */ +#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ +#define SHT_NUM 19 /* Number of defined types. */ +#define SHT_LOOS 0x60000000 /* Start OS-specific */ +#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */ +#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */ +#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ +#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ +#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ +#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ +#define SHT_HIOS 0x6fffffff /* End OS-specific type */ +#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ +#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ +#define SHT_LOUSER 0x80000000 /* Start of application-specific */ +#define SHT_HIUSER 0x8fffffff /* End of application-specific */ + +/* Legal values for sh_flags (section flags). */ + +#define SHF_WRITE (1 << 0) /* Writable */ +#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ +#define SHF_EXECINSTR (1 << 2) /* Executable */ +#define SHF_MERGE (1 << 4) /* Might be merged */ +#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ +#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ +#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ +#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling + required */ +#define SHF_GROUP (1 << 9) /* Section is member of a group. */ +#define SHF_TLS (1 << 10) /* Section hold thread-local data. */ +#define SHF_MASKOS 0x0ff00000 /* OS-specific. */ +#define SHF_MASKPROC 0xf0000000 /* Processor-specific */ + +/* Section group handling. */ +#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */ + +/* Symbol table entry. */ + +typedef struct +{ + Elf32_Word st_name; /* Symbol name (string tbl index) */ + Elf32_Addr st_value; /* Symbol value */ + Elf32_Word st_size; /* Symbol size */ + unsigned char st_info; /* Symbol type and binding */ + unsigned char st_other; /* Symbol visibility */ + Elf32_Section st_shndx; /* Section index */ +} Elf32_Sym; + +typedef struct +{ + Elf64_Word st_name; /* Symbol name (string tbl index) */ + unsigned char st_info; /* Symbol type and binding */ + unsigned char st_other; /* Symbol visibility */ + Elf64_Section st_shndx; /* Section index */ + Elf64_Addr st_value; /* Symbol value */ + Elf64_Xword st_size; /* Symbol size */ +} Elf64_Sym; + +/* The syminfo section if available contains additional information about + every dynamic symbol. */ + +typedef struct +{ + Elf32_Half si_boundto; /* Direct bindings, symbol bound to */ + Elf32_Half si_flags; /* Per symbol flags */ +} Elf32_Syminfo; + +typedef struct +{ + Elf64_Half si_boundto; /* Direct bindings, symbol bound to */ + Elf64_Half si_flags; /* Per symbol flags */ +} Elf64_Syminfo; + +/* Possible values for si_boundto. */ +#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ +#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ +#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ + +/* Possible bitmasks for si_flags. */ +#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ +#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ +#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ +#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy + loaded */ +/* Syminfo version values. */ +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + + +/* How to extract and insert information held in the st_info field. */ + +#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */ +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) +#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) + +/* Legal values for ST_BIND subfield of st_info (symbol binding). */ + +#define STB_LOCAL 0 /* Local symbol */ +#define STB_GLOBAL 1 /* Global symbol */ +#define STB_WEAK 2 /* Weak symbol */ +#define STB_NUM 3 /* Number of defined types. */ +#define STB_LOOS 10 /* Start of OS-specific */ +#define STB_HIOS 12 /* End of OS-specific */ +#define STB_LOPROC 13 /* Start of processor-specific */ +#define STB_HIPROC 15 /* End of processor-specific */ + +/* Legal values for ST_TYPE subfield of st_info (symbol type). */ + +#define STT_NOTYPE 0 /* Symbol type is unspecified */ +#define STT_OBJECT 1 /* Symbol is a data object */ +#define STT_FUNC 2 /* Symbol is a code object */ +#define STT_SECTION 3 /* Symbol associated with a section */ +#define STT_FILE 4 /* Symbol's name is file name */ +#define STT_COMMON 5 /* Symbol is a common data object */ +#define STT_TLS 6 /* Symbol is thread-local data object*/ +#define STT_NUM 7 /* Number of defined types. */ +#define STT_LOOS 10 /* Start of OS-specific */ +#define STT_HIOS 12 /* End of OS-specific */ +#define STT_LOPROC 13 /* Start of processor-specific */ +#define STT_HIPROC 15 /* End of processor-specific */ + + +/* Symbol table indices are found in the hash buckets and chain table + of a symbol hash table section. This special index value indicates + the end of a chain, meaning no further symbols are found in that bucket. */ + +#define STN_UNDEF 0 /* End of a chain. */ + + +/* How to extract and insert information held in the st_other field. */ + +#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) + +/* For ELF64 the definitions are the same. */ +#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) + +/* Symbol visibility specification encoded in the st_other field. */ +#define STV_DEFAULT 0 /* Default symbol visibility rules */ +#define STV_INTERNAL 1 /* Processor specific hidden class */ +#define STV_HIDDEN 2 /* Sym unavailable in other modules */ +#define STV_PROTECTED 3 /* Not preemptible, not exported */ + + +/* Relocation table entry without addend (in section of type SHT_REL). */ + +typedef struct +{ + Elf32_Addr r_offset; /* Address */ + Elf32_Word r_info; /* Relocation type and symbol index */ +} Elf32_Rel; + +/* I have seen two different definitions of the Elf64_Rel and + Elf64_Rela structures, so we'll leave them out until Novell (or + whoever) gets their act together. */ +/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */ + +typedef struct +{ + Elf64_Addr r_offset; /* Address */ + Elf64_Xword r_info; /* Relocation type and symbol index */ +} Elf64_Rel; + +/* Relocation table entry with addend (in section of type SHT_RELA). */ + +typedef struct +{ + Elf32_Addr r_offset; /* Address */ + Elf32_Word r_info; /* Relocation type and symbol index */ + Elf32_Sword r_addend; /* Addend */ +} Elf32_Rela; + +typedef struct +{ + Elf64_Addr r_offset; /* Address */ + Elf64_Xword r_info; /* Relocation type and symbol index */ + Elf64_Sxword r_addend; /* Addend */ +} Elf64_Rela; + +/* How to extract and insert information held in the r_info field. */ + +#define ELF32_R_SYM(val) ((val) >> 8) +#define ELF32_R_TYPE(val) ((val) & 0xff) +#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(sym, type) ((((Elf64_Xword) (sym)) << 32) + (type)) + +/* Program segment header. */ + +typedef struct +{ + Elf32_Word p_type; /* Segment type */ + Elf32_Off p_offset; /* Segment file offset */ + Elf32_Addr p_vaddr; /* Segment virtual address */ + Elf32_Addr p_paddr; /* Segment physical address */ + Elf32_Word p_filesz; /* Segment size in file */ + Elf32_Word p_memsz; /* Segment size in memory */ + Elf32_Word p_flags; /* Segment flags */ + Elf32_Word p_align; /* Segment alignment */ +} Elf32_Phdr; + +typedef struct +{ + Elf64_Word p_type; /* Segment type */ + Elf64_Word p_flags; /* Segment flags */ + Elf64_Off p_offset; /* Segment file offset */ + Elf64_Addr p_vaddr; /* Segment virtual address */ + Elf64_Addr p_paddr; /* Segment physical address */ + Elf64_Xword p_filesz; /* Segment size in file */ + Elf64_Xword p_memsz; /* Segment size in memory */ + Elf64_Xword p_align; /* Segment alignment */ +} Elf64_Phdr; + +/* Legal values for p_type (segment type). */ + +#define PT_NULL 0 /* Program header table entry unused */ +#define PT_LOAD 1 /* Loadable program segment */ +#define PT_DYNAMIC 2 /* Dynamic linking information */ +#define PT_INTERP 3 /* Program interpreter */ +#define PT_NOTE 4 /* Auxiliary information */ +#define PT_SHLIB 5 /* Reserved */ +#define PT_PHDR 6 /* Entry for header table itself */ +#define PT_TLS 7 /* Thread-local storage segment */ +#define PT_NUM 8 /* Number of defined types */ +#define PT_LOOS 0x60000000 /* Start of OS-specific */ +#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ +#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ +#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff /* End of OS-specific */ +#define PT_LOPROC 0x70000000 /* Start of processor-specific */ +#define PT_HIPROC 0x7fffffff /* End of processor-specific */ + +/* Legal values for p_flags (segment flags). */ + +#define PF_X (1 << 0) /* Segment is executable */ +#define PF_W (1 << 1) /* Segment is writable */ +#define PF_R (1 << 2) /* Segment is readable */ +#define PF_MASKOS 0x0ff00000 /* OS-specific */ +#define PF_MASKPROC 0xf0000000 /* Processor-specific */ + +/* Legal values for note segment descriptor types for core files. */ + +#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ +#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ +#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ +#define NT_PRXREG 4 /* Contains copy of prxregset struct */ +#define NT_TASKSTRUCT 4 /* Contains copy of task structure */ +#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */ +#define NT_AUXV 6 /* Contains copy of auxv array */ +#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */ +#define NT_ASRS 8 /* Contains copy of asrset struct */ +#define NT_PSTATUS 10 /* Contains copy of pstatus struct */ +#define NT_PSINFO 13 /* Contains copy of psinfo struct */ +#define NT_PRCRED 14 /* Contains copy of prcred struct */ +#define NT_UTSNAME 15 /* Contains copy of utsname struct */ +#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ +#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ +#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct*/ + +/* Legal values for the note segment descriptor types for object files. */ + +#define NT_VERSION 1 /* Contains a version string. */ + + +/* Dynamic section entry. */ + +typedef struct +{ + Elf32_Sword d_tag; /* Dynamic entry type */ + union + { + Elf32_Word d_val; /* Integer value */ + Elf32_Addr d_ptr; /* Address value */ + } d_un; +} Elf32_Dyn; + +typedef struct +{ + Elf64_Sxword d_tag; /* Dynamic entry type */ + union + { + Elf64_Xword d_val; /* Integer value */ + Elf64_Addr d_ptr; /* Address value */ + } d_un; +} Elf64_Dyn; + +/* Legal values for d_tag (dynamic entry type). */ + +#define DT_NULL 0 /* Marks end of dynamic section */ +#define DT_NEEDED 1 /* Name of needed library */ +#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */ +#define DT_PLTGOT 3 /* Processor defined value */ +#define DT_HASH 4 /* Address of symbol hash table */ +#define DT_STRTAB 5 /* Address of string table */ +#define DT_SYMTAB 6 /* Address of symbol table */ +#define DT_RELA 7 /* Address of Rela relocs */ +#define DT_RELASZ 8 /* Total size of Rela relocs */ +#define DT_RELAENT 9 /* Size of one Rela reloc */ +#define DT_STRSZ 10 /* Size of string table */ +#define DT_SYMENT 11 /* Size of one symbol table entry */ +#define DT_INIT 12 /* Address of init function */ +#define DT_FINI 13 /* Address of termination function */ +#define DT_SONAME 14 /* Name of shared object */ +#define DT_RPATH 15 /* Library search path (deprecated) */ +#define DT_SYMBOLIC 16 /* Start symbol search here */ +#define DT_REL 17 /* Address of Rel relocs */ +#define DT_RELSZ 18 /* Total size of Rel relocs */ +#define DT_RELENT 19 /* Size of one Rel reloc */ +#define DT_PLTREL 20 /* Type of reloc in PLT */ +#define DT_DEBUG 21 /* For debugging; unspecified */ +#define DT_TEXTREL 22 /* Reloc might modify .text */ +#define DT_JMPREL 23 /* Address of PLT relocs */ +#define DT_BIND_NOW 24 /* Process relocations of object */ +#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */ +#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */ +#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */ +#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */ +#define DT_RUNPATH 29 /* Library search path */ +#define DT_FLAGS 30 /* Flags for the object being loaded */ +#define DT_ENCODING 32 /* Start of encoded range */ +#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ +#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ +#define DT_NUM 34 /* Number used */ +#define DT_LOOS 0x6000000d /* Start of OS-specific */ +#define DT_HIOS 0x6ffff000 /* End of OS-specific */ +#define DT_LOPROC 0x70000000 /* Start of processor-specific */ +#define DT_HIPROC 0x7fffffff /* End of processor-specific */ +#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */ + +/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the + Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's + approach. */ +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */ +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */ +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */ +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */ +#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting + the following DT_* entry. */ +#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */ +#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */ +#define DT_VALRNGHI 0x6ffffdff +#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */ +#define DT_VALNUM 12 + +/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the + Dyn.d_un.d_ptr field of the Elf*_Dyn structure. + + If any adjustment is made to the ELF object after it has been + built these entries will need to be adjusted. */ +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_CONFLICT 0x6ffffef8 /* Start of conflict section */ +#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list */ +#define DT_CONFIG 0x6ffffefa /* Configuration information. */ +#define DT_DEPAUDIT 0x6ffffefb /* Dependency auditing. */ +#define DT_AUDIT 0x6ffffefc /* Object auditing. */ +#define DT_PLTPAD 0x6ffffefd /* PLT padding. */ +#define DT_MOVETAB 0x6ffffefe /* Move table. */ +#define DT_SYMINFO 0x6ffffeff /* Syminfo table. */ +#define DT_ADDRRNGHI 0x6ffffeff +#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) /* Reverse order! */ +#define DT_ADDRNUM 10 + +/* The versioning entry types. The next are defined as part of the + GNU extension. */ +#define DT_VERSYM 0x6ffffff0 + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa + +/* These were chosen by Sun. */ +#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */ +#define DT_VERDEF 0x6ffffffc /* Address of version definition + table */ +#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */ +#define DT_VERNEED 0x6ffffffe /* Address of table with needed + versions */ +#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */ +#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ +#define DT_VERSIONTAGNUM 16 + +/* Sun added these machine-independent extensions in the "processor-specific" + range. Be compatible. */ +#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */ +#define DT_FILTER 0x7fffffff /* Shared object to get values from */ +#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) +#define DT_EXTRANUM 3 + +/* Values of `d_un.d_val' in the DT_FLAGS entry. */ +#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */ +#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */ +#define DF_TEXTREL 0x00000004 /* Object contains text relocations */ +#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */ +#define DF_STATIC_TLS 0x00000010 /* Module uses the static TLS model */ + +/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1 + entry in the dynamic section. */ +#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */ +#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */ +#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */ +#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/ +#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/ +#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/ +#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */ +#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */ +#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */ +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */ +#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */ +#define DF_1_NODUMP 0x00001000 /* Object can't be dldump'ed. */ +#define DF_1_CONFALT 0x00002000 /* Configuration alternative created.*/ +#define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */ +#define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */ +#define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */ + +/* Flags for the feature selection in DT_FEATURE_1. */ +#define DTF_1_PARINIT 0x00000001 +#define DTF_1_CONFEXP 0x00000002 + +/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */ +#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */ +#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not + generally available. */ + +/* Version definition sections. */ + +typedef struct +{ + Elf32_Half vd_version; /* Version revision */ + Elf32_Half vd_flags; /* Version information */ + Elf32_Half vd_ndx; /* Version Index */ + Elf32_Half vd_cnt; /* Number of associated aux entries */ + Elf32_Word vd_hash; /* Version name hash value */ + Elf32_Word vd_aux; /* Offset in bytes to verdaux array */ + Elf32_Word vd_next; /* Offset in bytes to next verdef + entry */ +} Elf32_Verdef; + +typedef struct +{ + Elf64_Half vd_version; /* Version revision */ + Elf64_Half vd_flags; /* Version information */ + Elf64_Half vd_ndx; /* Version Index */ + Elf64_Half vd_cnt; /* Number of associated aux entries */ + Elf64_Word vd_hash; /* Version name hash value */ + Elf64_Word vd_aux; /* Offset in bytes to verdaux array */ + Elf64_Word vd_next; /* Offset in bytes to next verdef + entry */ +} Elf64_Verdef; + + +/* Legal values for vd_version (version revision). */ +#define VER_DEF_NONE 0 /* No version */ +#define VER_DEF_CURRENT 1 /* Current version */ +#define VER_DEF_NUM 2 /* Given version number */ + +/* Legal values for vd_flags (version information flags). */ +#define VER_FLG_BASE 0x1 /* Version definition of file itself */ +#define VER_FLG_WEAK 0x2 /* Weak version identifier */ + +/* Versym symbol index values. */ +#define VER_NDX_LOCAL 0 /* Symbol is local. */ +#define VER_NDX_GLOBAL 1 /* Symbol is global. */ +#define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */ +#define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */ + +/* Auxialiary version information. */ + +typedef struct +{ + Elf32_Word vda_name; /* Version or dependency names */ + Elf32_Word vda_next; /* Offset in bytes to next verdaux + entry */ +} Elf32_Verdaux; + +typedef struct +{ + Elf64_Word vda_name; /* Version or dependency names */ + Elf64_Word vda_next; /* Offset in bytes to next verdaux + entry */ +} Elf64_Verdaux; + + +/* Version dependency section. */ + +typedef struct +{ + Elf32_Half vn_version; /* Version of structure */ + Elf32_Half vn_cnt; /* Number of associated aux entries */ + Elf32_Word vn_file; /* Offset of filename for this + dependency */ + Elf32_Word vn_aux; /* Offset in bytes to vernaux array */ + Elf32_Word vn_next; /* Offset in bytes to next verneed + entry */ +} Elf32_Verneed; + +typedef struct +{ + Elf64_Half vn_version; /* Version of structure */ + Elf64_Half vn_cnt; /* Number of associated aux entries */ + Elf64_Word vn_file; /* Offset of filename for this + dependency */ + Elf64_Word vn_aux; /* Offset in bytes to vernaux array */ + Elf64_Word vn_next; /* Offset in bytes to next verneed + entry */ +} Elf64_Verneed; + + +/* Legal values for vn_version (version revision). */ +#define VER_NEED_NONE 0 /* No version */ +#define VER_NEED_CURRENT 1 /* Current version */ +#define VER_NEED_NUM 2 /* Given version number */ + +/* Auxiliary needed version information. */ + +typedef struct +{ + Elf32_Word vna_hash; /* Hash value of dependency name */ + Elf32_Half vna_flags; /* Dependency specific information */ + Elf32_Half vna_other; /* Unused */ + Elf32_Word vna_name; /* Dependency name string offset */ + Elf32_Word vna_next; /* Offset in bytes to next vernaux + entry */ +} Elf32_Vernaux; + +typedef struct +{ + Elf64_Word vna_hash; /* Hash value of dependency name */ + Elf64_Half vna_flags; /* Dependency specific information */ + Elf64_Half vna_other; /* Unused */ + Elf64_Word vna_name; /* Dependency name string offset */ + Elf64_Word vna_next; /* Offset in bytes to next vernaux + entry */ +} Elf64_Vernaux; + + +/* Legal values for vna_flags. */ +#define VER_FLG_WEAK 0x2 /* Weak version identifier */ + + +/* Auxiliary vector. */ + +/* This vector is normally only used by the program interpreter. The + usual definition in an ABI supplement uses the name auxv_t. The + vector is not usually defined in a standard file, but it + can't hurt. We rename it to avoid conflicts. The sizes of these + types are an arrangement between the exec server and the program + interpreter, so we don't fully specify them here. */ + +typedef struct +{ + int a_type; /* Entry type */ + union + { + long int a_val; /* Integer value */ + void *a_ptr; /* Pointer value */ + void (*a_fcn)(void); /* Function pointer value */ + } a_un; +} Elf32_auxv_t; + +typedef struct +{ + long int a_type; /* Entry type */ + union + { + long int a_val; /* Integer value */ + void *a_ptr; /* Pointer value */ + void (*a_fcn)(void); /* Function pointer value */ + } a_un; +} Elf64_auxv_t; + +/* Legal values for a_type (entry type). */ + +#define AT_NULL 0 /* End of vector */ +#define AT_IGNORE 1 /* Entry should be ignored */ +#define AT_EXECFD 2 /* File descriptor of program */ +#define AT_PHDR 3 /* Program headers for program */ +#define AT_PHENT 4 /* Size of program header entry */ +#define AT_PHNUM 5 /* Number of program headers */ +#define AT_PAGESZ 6 /* System page size */ +#define AT_BASE 7 /* Base address of interpreter */ +#define AT_FLAGS 8 /* Flags */ +#define AT_ENTRY 9 /* Entry point of program */ +#define AT_NOTELF 10 /* Program is not ELF */ +#define AT_UID 11 /* Real uid */ +#define AT_EUID 12 /* Effective uid */ +#define AT_GID 13 /* Real gid */ +#define AT_EGID 14 /* Effective gid */ +#define AT_CLKTCK 17 /* Frequency of times() */ + +/* Some more special a_type values describing the hardware. */ +#define AT_PLATFORM 15 /* String identifying platform. */ +#define AT_HWCAP 16 /* Machine dependent hints about + processor capabilities. */ + +/* This entry gives some information about the FPU initialization + performed by the kernel. */ +#define AT_FPUCW 18 /* Used FPU control word. */ + +/* Cache block sizes. */ +#define AT_DCACHEBSIZE 19 /* Data cache block size. */ +#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */ +#define AT_UCACHEBSIZE 21 /* Unified cache block size. */ + +/* A special ignored value for PPC, used by the kernel to control the + interpretation of the AUXV. Must be > 16. */ +#define AT_IGNOREPPC 22 /* Entry should be ignored. */ + +#define AT_SECURE 23 /* Boolean, was exec setuid-like? */ + +/* Pointer to the global system page used for system calls and other + nice things. */ +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + + +/* Note section contents. Each entry in the note section begins with + a header of a fixed form. */ + +typedef struct +{ + Elf32_Word n_namesz; /* Length of the note's name. */ + Elf32_Word n_descsz; /* Length of the note's descriptor. */ + Elf32_Word n_type; /* Type of the note. */ +} Elf32_Nhdr; + +typedef struct +{ + Elf64_Word n_namesz; /* Length of the note's name. */ + Elf64_Word n_descsz; /* Length of the note's descriptor. */ + Elf64_Word n_type; /* Type of the note. */ +} Elf64_Nhdr; + +/* Known names of notes. */ + +/* Solaris entries in the note section have this name. */ +#define ELF_NOTE_SOLARIS "SUNW Solaris" + +/* Note entries for GNU systems have this name. */ +#define ELF_NOTE_GNU "GNU" + + +/* Defined types of notes for Solaris. */ + +/* Value of descriptor (one word) is desired pagesize for the binary. */ +#define ELF_NOTE_PAGESIZE_HINT 1 + + +/* Defined note types for GNU systems. */ + +/* ABI information. The descriptor consists of words: + word 0: OS descriptor + word 1: major version of the ABI + word 2: minor version of the ABI + word 3: subminor version of the ABI +*/ +#define ELF_NOTE_ABI 1 + +/* Known OSes. These value can appear in word 0 of an ELF_NOTE_ABI + note section entry. */ +#define ELF_NOTE_OS_LINUX 0 +#define ELF_NOTE_OS_GNU 1 +#define ELF_NOTE_OS_SOLARIS2 2 +#define ELF_NOTE_OS_FREEBSD 3 + + +/* Move records. */ +typedef struct +{ + Elf32_Xword m_value; /* Symbol value. */ + Elf32_Word m_info; /* Size and index. */ + Elf32_Word m_poffset; /* Symbol offset. */ + Elf32_Half m_repeat; /* Repeat count. */ + Elf32_Half m_stride; /* Stride info. */ +} Elf32_Move; + +typedef struct +{ + Elf64_Xword m_value; /* Symbol value. */ + Elf64_Xword m_info; /* Size and index. */ + Elf64_Xword m_poffset; /* Symbol offset. */ + Elf64_Half m_repeat; /* Repeat count. */ + Elf64_Half m_stride; /* Stride info. */ +} Elf64_Move; + +/* Macro to construct move records. */ +#define ELF32_M_SYM(info) ((info) >> 8) +#define ELF32_M_SIZE(info) ((unsigned char) (info)) +#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) + +#define ELF64_M_SYM(info) ELF32_M_SYM (info) +#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) +#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) + + +/* Motorola 68k specific definitions. */ + +/* Values for Elf32_Ehdr.e_flags. */ +#define EF_CPU32 0x00810000 + +/* m68k relocs. */ + +#define R_68K_NONE 0 /* No reloc */ +#define R_68K_32 1 /* Direct 32 bit */ +#define R_68K_16 2 /* Direct 16 bit */ +#define R_68K_8 3 /* Direct 8 bit */ +#define R_68K_PC32 4 /* PC relative 32 bit */ +#define R_68K_PC16 5 /* PC relative 16 bit */ +#define R_68K_PC8 6 /* PC relative 8 bit */ +#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */ +#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */ +#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */ +#define R_68K_GOT32O 10 /* 32 bit GOT offset */ +#define R_68K_GOT16O 11 /* 16 bit GOT offset */ +#define R_68K_GOT8O 12 /* 8 bit GOT offset */ +#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */ +#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */ +#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */ +#define R_68K_PLT32O 16 /* 32 bit PLT offset */ +#define R_68K_PLT16O 17 /* 16 bit PLT offset */ +#define R_68K_PLT8O 18 /* 8 bit PLT offset */ +#define R_68K_COPY 19 /* Copy symbol at runtime */ +#define R_68K_GLOB_DAT 20 /* Create GOT entry */ +#define R_68K_JMP_SLOT 21 /* Create PLT entry */ +#define R_68K_RELATIVE 22 /* Adjust by program base */ +/* Keep this the last entry. */ +#define R_68K_NUM 23 + +/* Intel 80386 specific definitions. */ + +/* i386 relocs. */ + +#define R_386_NONE 0 /* No reloc */ +#define R_386_32 1 /* Direct 32 bit */ +#define R_386_PC32 2 /* PC relative 32 bit */ +#define R_386_GOT32 3 /* 32 bit GOT entry */ +#define R_386_PLT32 4 /* 32 bit PLT address */ +#define R_386_COPY 5 /* Copy symbol at runtime */ +#define R_386_GLOB_DAT 6 /* Create GOT entry */ +#define R_386_JMP_SLOT 7 /* Create PLT entry */ +#define R_386_RELATIVE 8 /* Adjust by program base */ +#define R_386_GOTOFF 9 /* 32 bit offset to GOT */ +#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */ +#define R_386_32PLT 11 +#define R_386_TLS_TPOFF 14 /* Offset in static TLS block */ +#define R_386_TLS_IE 15 /* Address of GOT entry for static TLS + block offset */ +#define R_386_TLS_GOTIE 16 /* GOT entry for static TLS block + offset */ +#define R_386_TLS_LE 17 /* Offset relative to static TLS + block */ +#define R_386_TLS_GD 18 /* Direct 32 bit for GNU version of + general dynamic thread local data */ +#define R_386_TLS_LDM 19 /* Direct 32 bit for GNU version of + local dynamic thread local data + in LE code */ +#define R_386_16 20 +#define R_386_PC16 21 +#define R_386_8 22 +#define R_386_PC8 23 +#define R_386_TLS_GD_32 24 /* Direct 32 bit for general dynamic + thread local data */ +#define R_386_TLS_GD_PUSH 25 /* Tag for pushl in GD TLS code */ +#define R_386_TLS_GD_CALL 26 /* Relocation for call to + __tls_get_addr() */ +#define R_386_TLS_GD_POP 27 /* Tag for popl in GD TLS code */ +#define R_386_TLS_LDM_32 28 /* Direct 32 bit for local dynamic + thread local data in LE code */ +#define R_386_TLS_LDM_PUSH 29 /* Tag for pushl in LDM TLS code */ +#define R_386_TLS_LDM_CALL 30 /* Relocation for call to + __tls_get_addr() in LDM code */ +#define R_386_TLS_LDM_POP 31 /* Tag for popl in LDM TLS code */ +#define R_386_TLS_LDO_32 32 /* Offset relative to TLS block */ +#define R_386_TLS_IE_32 33 /* GOT entry for negated static TLS + block offset */ +#define R_386_TLS_LE_32 34 /* Negated offset relative to static + TLS block */ +#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */ +#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */ +#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */ +/* Keep this the last entry. */ +#define R_386_NUM 38 + +/* SUN SPARC specific definitions. */ + +/* Legal values for ST_TYPE subfield of st_info (symbol type). */ + +#define STT_REGISTER 13 /* Global register reserved to app. */ + +/* Values for Elf64_Ehdr.e_flags. */ + +#define EF_SPARCV9_MM 3 +#define EF_SPARCV9_TSO 0 +#define EF_SPARCV9_PSO 1 +#define EF_SPARCV9_RMO 2 +#define EF_SPARC_LEDATA 0x800000 /* little endian data */ +#define EF_SPARC_EXT_MASK 0xFFFF00 +#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ +#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ +#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ +#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ + +/* SPARC relocs. */ + +#define R_SPARC_NONE 0 /* No reloc */ +#define R_SPARC_8 1 /* Direct 8 bit */ +#define R_SPARC_16 2 /* Direct 16 bit */ +#define R_SPARC_32 3 /* Direct 32 bit */ +#define R_SPARC_DISP8 4 /* PC relative 8 bit */ +#define R_SPARC_DISP16 5 /* PC relative 16 bit */ +#define R_SPARC_DISP32 6 /* PC relative 32 bit */ +#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */ +#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */ +#define R_SPARC_HI22 9 /* High 22 bit */ +#define R_SPARC_22 10 /* Direct 22 bit */ +#define R_SPARC_13 11 /* Direct 13 bit */ +#define R_SPARC_LO10 12 /* Truncated 10 bit */ +#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */ +#define R_SPARC_GOT13 14 /* 13 bit GOT entry */ +#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */ +#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */ +#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */ +#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */ +#define R_SPARC_COPY 19 /* Copy symbol at runtime */ +#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */ +#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */ +#define R_SPARC_RELATIVE 22 /* Adjust by program base */ +#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */ + +/* Additional Sparc64 relocs. */ + +#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */ +#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */ +#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */ +#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */ +#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */ +#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */ +#define R_SPARC_10 30 /* Direct 10 bit */ +#define R_SPARC_11 31 /* Direct 11 bit */ +#define R_SPARC_64 32 /* Direct 64 bit */ +#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */ +#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */ +#define R_SPARC_HM10 35 /* High middle 10 bits of ... */ +#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */ +#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */ +#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */ +#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ +#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ +#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ +#define R_SPARC_7 43 /* Direct 7 bit */ +#define R_SPARC_5 44 /* Direct 5 bit */ +#define R_SPARC_6 45 /* Direct 6 bit */ +#define R_SPARC_DISP64 46 /* PC relative 64 bit */ +#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */ +#define R_SPARC_HIX22 48 /* High 22 bit complemented */ +#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */ +#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */ +#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */ +#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */ +#define R_SPARC_REGISTER 53 /* Global register usage */ +#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */ +#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */ +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 +/* Keep this the last entry. */ +#define R_SPARC_NUM 80 + +/* For Sparc64, legal values for d_tag of Elf64_Dyn. */ + +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 + +/* Bits present in AT_HWCAP, primarily for Sparc32. */ + +#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */ +#define HWCAP_SPARC_STBAR 2 +#define HWCAP_SPARC_SWAP 4 +#define HWCAP_SPARC_MULDIV 8 +#define HWCAP_SPARC_V9 16 /* The cpu is v9, so v8plus is ok. */ +#define HWCAP_SPARC_ULTRA3 32 + +/* MIPS R3000 specific definitions. */ + +/* Legal values for e_flags field of Elf32_Ehdr. */ + +#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */ +#define EF_MIPS_PIC 2 /* Contains PIC code */ +#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */ +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */ + +/* Legal values for MIPS architecture level. */ + +#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ +#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ +#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ +#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ +#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ +#define EF_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ +#define EF_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ + +/* The following are non-official names and should not be used. */ + +#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ +#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ +#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ +#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ +#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ +#define E_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ +#define E_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ + +/* Special section indices. */ + +#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */ +#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ +#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ +#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */ +#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */ + +/* Legal values for sh_type field of Elf32_Shdr. */ + +#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */ +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */ +#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */ +#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ +#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/ +#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */ +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + +/* Legal values for sh_flags field of Elf32_Shdr. */ + +#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */ +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 + + +/* Symbol tables. */ + +/* MIPS specific values for `st_other'. */ +#define STO_MIPS_DEFAULT 0x0 +#define STO_MIPS_INTERNAL 0x1 +#define STO_MIPS_HIDDEN 0x2 +#define STO_MIPS_PROTECTED 0x3 +#define STO_MIPS_SC_ALIGN_UNUSED 0xff + +/* MIPS specific values for `st_info'. */ +#define STB_MIPS_SPLIT_COMMON 13 + +/* Entries found in sections of type SHT_MIPS_GPTAB. */ + +typedef union +{ + struct + { + Elf32_Word gt_current_g_value; /* -G value used for compilation */ + Elf32_Word gt_unused; /* Not used */ + } gt_header; /* First entry in section */ + struct + { + Elf32_Word gt_g_value; /* If this value were used for -G */ + Elf32_Word gt_bytes; /* This many bytes would be used */ + } gt_entry; /* Subsequent entries in section */ +} Elf32_gptab; + +/* Entry found in sections of type SHT_MIPS_REGINFO. */ + +typedef struct +{ + Elf32_Word ri_gprmask; /* General registers used */ + Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */ + Elf32_Sword ri_gp_value; /* $gp register value */ +} Elf32_RegInfo; + +/* Entries found in sections of type SHT_MIPS_OPTIONS. */ + +typedef struct +{ + unsigned char kind; /* Determines interpretation of the + variable part of descriptor. */ + unsigned char size; /* Size of descriptor, including header. */ + Elf32_Section section; /* Section header index of section affected, + 0 for global options. */ + Elf32_Word info; /* Kind-specific information. */ +} Elf_Options; + +/* Values for `kind' field in Elf_Options. */ + +#define ODK_NULL 0 /* Undefined. */ +#define ODK_REGINFO 1 /* Register usage information. */ +#define ODK_EXCEPTIONS 2 /* Exception processing options. */ +#define ODK_PAD 3 /* Section padding options. */ +#define ODK_HWPATCH 4 /* Hardware workarounds performed */ +#define ODK_FILL 5 /* record the fill value used by the linker. */ +#define ODK_TAGS 6 /* reserve space for desktop tools to write. */ +#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */ +#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */ + +/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */ + +#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */ +#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */ +#define OEX_PAGE0 0x10000 /* page zero must be mapped. */ +#define OEX_SMM 0x20000 /* Force sequential memory mode? */ +#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */ +#define OEX_PRECISEFP OEX_FPDBUG +#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */ + +#define OEX_FPU_INVAL 0x10 +#define OEX_FPU_DIV0 0x08 +#define OEX_FPU_OFLO 0x04 +#define OEX_FPU_UFLO 0x02 +#define OEX_FPU_INEX 0x01 + +/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */ + +#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */ +#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */ +#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */ +#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */ + +#define OPAD_PREFIX 0x1 +#define OPAD_POSTFIX 0x2 +#define OPAD_SYMBOL 0x4 + +/* Entry found in `.options' section. */ + +typedef struct +{ + Elf32_Word hwp_flags1; /* Extra flags. */ + Elf32_Word hwp_flags2; /* Extra flags. */ +} Elf_Options_Hw; + +/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */ + +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA1_R4KEOP_CLEAN 0x00000002 + +/* MIPS relocs. */ + +#define R_MIPS_NONE 0 /* No reloc */ +#define R_MIPS_16 1 /* Direct 16 bit */ +#define R_MIPS_32 2 /* Direct 32 bit */ +#define R_MIPS_REL32 3 /* PC relative 32 bit */ +#define R_MIPS_26 4 /* Direct 26 bit shifted */ +#define R_MIPS_HI16 5 /* High 16 bit */ +#define R_MIPS_LO16 6 /* Low 16 bit */ +#define R_MIPS_GPREL16 7 /* GP relative 16 bit */ +#define R_MIPS_LITERAL 8 /* 16 bit literal entry */ +#define R_MIPS_GOT16 9 /* 16 bit GOT entry */ +#define R_MIPS_PC16 10 /* PC relative 16 bit */ +#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */ +#define R_MIPS_GPREL32 12 /* GP relative 32 bit */ + +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +#define R_MIPS_GOT_HI16 22 +#define R_MIPS_GOT_LO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +#define R_MIPS_CALL_HI16 30 +#define R_MIPS_CALL_LO16 31 +#define R_MIPS_SCN_DISP 32 +#define R_MIPS_REL16 33 +#define R_MIPS_ADD_IMMEDIATE 34 +#define R_MIPS_PJUMP 35 +#define R_MIPS_RELGOT 36 +#define R_MIPS_JALR 37 +/* Keep this the last entry. */ +#define R_MIPS_NUM 38 + +/* Legal values for p_type field of Elf32_Phdr. */ + +#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ +#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ +#define PT_MIPS_OPTIONS 0x70000002 + +/* Special program header types. */ + +#define PF_MIPS_LOCAL 0x10000000 + +/* Legal values for d_tag field of Elf32_Dyn. */ + +#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */ +#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */ +#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */ +#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */ +#define DT_MIPS_FLAGS 0x70000005 /* Flags */ +#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */ +#define DT_MIPS_MSYM 0x70000007 +#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */ +#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */ +#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */ +#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */ +#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */ +#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */ +#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */ +#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */ +#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */ +#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */ +#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */ +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in + DT_MIPS_DELTA_CLASS. */ +#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */ +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in + DT_MIPS_DELTA_INSTANCE. */ +#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */ +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in + DT_MIPS_DELTA_RELOC. */ +#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta + relocations refer to. */ +#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in + DT_MIPS_DELTA_SYM. */ +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the + class declaration. */ +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in + DT_MIPS_DELTA_CLASSSYM. */ +#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */ +#define DT_MIPS_PIXIE_INIT 0x70000023 +#define DT_MIPS_SYMBOL_LIB 0x70000024 +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 +#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */ +#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */ +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b +#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */ +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve + function stored in GOT. */ +#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added + by rld on dlopen() calls. */ +#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */ +#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */ +#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */ +#define DT_MIPS_NUM 0x32 + +/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ + +#define RHF_NONE 0 /* No flags */ +#define RHF_QUICKSTART (1 << 0) /* Use quickstart */ +#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */ +#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */ +#define RHF_NO_MOVE (1 << 3) +#define RHF_SGI_ONLY (1 << 4) +#define RHF_GUARANTEE_INIT (1 << 5) +#define RHF_DELTA_C_PLUS_PLUS (1 << 6) +#define RHF_GUARANTEE_START_INIT (1 << 7) +#define RHF_PIXIE (1 << 8) +#define RHF_DEFAULT_DELAY_LOAD (1 << 9) +#define RHF_REQUICKSTART (1 << 10) +#define RHF_REQUICKSTARTED (1 << 11) +#define RHF_CORD (1 << 12) +#define RHF_NO_UNRES_UNDEF (1 << 13) +#define RHF_RLD_ORDER_SAFE (1 << 14) + +/* Entries found in sections of type SHT_MIPS_LIBLIST. */ + +typedef struct +{ + Elf32_Word l_name; /* Name (string table index) */ + Elf32_Word l_time_stamp; /* Timestamp */ + Elf32_Word l_checksum; /* Checksum */ + Elf32_Word l_version; /* Interface version */ + Elf32_Word l_flags; /* Flags */ +} Elf32_Lib; + +typedef struct +{ + Elf64_Word l_name; /* Name (string table index) */ + Elf64_Word l_time_stamp; /* Timestamp */ + Elf64_Word l_checksum; /* Checksum */ + Elf64_Word l_version; /* Interface version */ + Elf64_Word l_flags; /* Flags */ +} Elf64_Lib; + + +/* Legal values for l_flags. */ + +#define LL_NONE 0 +#define LL_EXACT_MATCH (1 << 0) /* Require exact match */ +#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */ +#define LL_REQUIRE_MINOR (1 << 2) +#define LL_EXPORTS (1 << 3) +#define LL_DELAY_LOAD (1 << 4) +#define LL_DELTA (1 << 5) + +/* Entries found in sections of type SHT_MIPS_CONFLICT. */ + +typedef Elf32_Addr Elf32_Conflict; + + +/* HPPA specific definitions. */ + +/* Legal values for e_flags field of Elf32_Ehdr. */ + +#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */ +#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */ +#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */ +#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */ +#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch + prediction. */ +#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */ +#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */ + +/* Defined values for `e_flags & EF_PARISC_ARCH' are: */ + +#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */ +#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */ +#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */ + +/* Additional section indeces. */ + +#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared + symbols in ANSI C. */ +#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */ + +/* Legal values for sh_type field of Elf32_Shdr. */ + +#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */ +#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */ +#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */ + +/* Legal values for sh_flags field of Elf32_Shdr. */ + +#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */ +#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */ +#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */ + +/* Legal values for ST_TYPE subfield of st_info (symbol type). */ + +#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */ + +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + +/* HPPA relocs. */ + +#define R_PARISC_NONE 0 /* No reloc. */ +#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */ +#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */ +#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */ +#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */ +#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */ +#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */ +#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */ +#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */ +#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */ +#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */ +#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */ +#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */ +#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */ +#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */ +#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */ +#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */ +#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */ +#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */ +#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */ +#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */ +#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */ +#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */ +#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */ +#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */ +#define R_PARISC_FPTR64 64 /* 64 bits function address. */ +#define R_PARISC_PLABEL32 65 /* 32 bits function address. */ +#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */ +#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */ +#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */ +#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */ +#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */ +#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */ +#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */ +#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */ +#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */ +#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */ +#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */ +#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */ +#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */ +#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */ +#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */ +#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */ +#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */ +#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */ +#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */ +#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */ +#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */ +#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */ +#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */ +#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */ +#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */ +#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */ +#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */ +#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */ +#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */ +#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */ +#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */ +#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */ +#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */ +#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */ +#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */ +#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */ +#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */ +#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */ +#define R_PARISC_LORESERVE 128 +#define R_PARISC_COPY 128 /* Copy relocation. */ +#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */ +#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */ +#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */ +#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */ +#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */ +#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */ +#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/ +#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */ +#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */ +#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */ +#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */ +#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */ +#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */ +#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */ +#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */ +#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/ +#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/ +#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */ +#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */ +#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */ +#define R_PARISC_HIRESERVE 255 + +/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */ + +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 + +/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */ + +#define PF_PARISC_SBP 0x08000000 + +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_CODE 0x01000000 +#define PF_HP_MODIFY 0x02000000 +#define PF_HP_LAZYSWAP 0x04000000 +#define PF_HP_SBP 0x08000000 + + +/* Alpha specific definitions. */ + +/* Legal values for e_flags field of Elf64_Ehdr. */ + +#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */ +#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */ + +/* Legal values for sh_type field of Elf64_Shdr. */ + +/* These two are primerily concerned with ECOFF debugging info. */ +#define SHT_ALPHA_DEBUG 0x70000001 +#define SHT_ALPHA_REGINFO 0x70000002 + +/* Legal values for sh_flags field of Elf64_Shdr. */ + +#define SHF_ALPHA_GPREL 0x10000000 + +/* Legal values for st_other field of Elf64_Sym. */ +#define STO_ALPHA_NOPV 0x80 /* No PV required. */ +#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */ + +/* Alpha relocs. */ + +#define R_ALPHA_NONE 0 /* No reloc */ +#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ +#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ +#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ +#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ +#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ +#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ +#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ +#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ +#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ +#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ +#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ +#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */ +#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */ +#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */ +#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ +#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ +#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ +#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ +#define R_ALPHA_TLS_GD_HI 28 +#define R_ALPHA_TLSGD 29 +#define R_ALPHA_TLS_LDM 30 +#define R_ALPHA_DTPMOD64 31 +#define R_ALPHA_GOTDTPREL 32 +#define R_ALPHA_DTPREL64 33 +#define R_ALPHA_DTPRELHI 34 +#define R_ALPHA_DTPRELLO 35 +#define R_ALPHA_DTPREL16 36 +#define R_ALPHA_GOTTPREL 37 +#define R_ALPHA_TPREL64 38 +#define R_ALPHA_TPRELHI 39 +#define R_ALPHA_TPRELLO 40 +#define R_ALPHA_TPREL16 41 +/* Keep this the last entry. */ +#define R_ALPHA_NUM 46 + +/* Magic values of the LITUSE relocation addend. */ +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLS_GD 4 +#define LITUSE_ALPHA_TLS_LDM 5 + + +/* PowerPC specific declarations */ + +/* Values for Elf32/64_Ehdr.e_flags. */ +#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */ + +/* Cygnus local bits below */ +#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/ +#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib + flag */ + +/* PowerPC relocations defined by the ABIs */ +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 /* 32bit absolute address */ +#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */ +#define R_PPC_ADDR16 3 /* 16bit absolute address */ +#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */ +#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */ +#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */ +#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */ +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 /* PC relative 26 bit */ +#define R_PPC_REL14 11 /* PC relative 16 bit */ +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + +/* PowerPC relocations defined for the TLS access ABI. */ +#define R_PPC_TLS 67 /* none (sym+add)@tls */ +#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */ +#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */ +#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ +#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ +#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ +#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */ +#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */ +#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ +#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ +#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ +#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */ +#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ +#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ +#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ +#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ +#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ +#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ +#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ +#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ +#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */ +#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */ +#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ +#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ +#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */ +#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */ +#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ +#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ + +/* Keep this the last entry. */ +#define R_PPC_NUM 95 + +/* The remaining relocs are from the Embedded ELF ABI, and are not + in the SVR4 ELF ABI. */ +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ + +/* Diab tool relocations. */ +#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ +#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ +#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ +#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ +#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ +#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ + +/* This is a phony reloc to handle any old fashioned TOC16 references + that may still be in object files. */ +#define R_PPC_TOC16 255 + + +/* PowerPC64 relocations defined by the ABIs */ +#define R_PPC64_NONE R_PPC_NONE +#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */ +#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */ +#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */ +#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */ +#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */ +#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */ +#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */ +#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN +#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */ +#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */ +#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN +#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN +#define R_PPC64_GOT16 R_PPC_GOT16 +#define R_PPC64_GOT16_LO R_PPC_GOT16_LO +#define R_PPC64_GOT16_HI R_PPC_GOT16_HI +#define R_PPC64_GOT16_HA R_PPC_GOT16_HA + +#define R_PPC64_COPY R_PPC_COPY +#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT +#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT +#define R_PPC64_RELATIVE R_PPC_RELATIVE + +#define R_PPC64_UADDR32 R_PPC_UADDR32 +#define R_PPC64_UADDR16 R_PPC_UADDR16 +#define R_PPC64_REL32 R_PPC_REL32 +#define R_PPC64_PLT32 R_PPC_PLT32 +#define R_PPC64_PLTREL32 R_PPC_PLTREL32 +#define R_PPC64_PLT16_LO R_PPC_PLT16_LO +#define R_PPC64_PLT16_HI R_PPC_PLT16_HI +#define R_PPC64_PLT16_HA R_PPC_PLT16_HA + +#define R_PPC64_SECTOFF R_PPC_SECTOFF +#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO +#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI +#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */ +#define R_PPC64_ADDR64 38 /* doubleword64 S + A */ +#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */ +#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */ +#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */ +#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */ +#define R_PPC64_UADDR64 43 /* doubleword64 S + A */ +#define R_PPC64_REL64 44 /* doubleword64 S + A - P */ +#define R_PPC64_PLT64 45 /* doubleword64 L + A */ +#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */ +#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */ +#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */ +#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */ +#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */ +#define R_PPC64_TOC 51 /* doubleword64 .TOC */ +#define R_PPC64_PLTGOT16 52 /* half16* M + A */ +#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */ +#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */ +#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */ + +#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */ +#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */ +#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */ +#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */ +#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */ +#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */ +#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */ +#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */ +#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */ +#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */ +#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */ + +/* PowerPC64 relocations defined for the TLS access ABI. */ +#define R_PPC64_TLS 67 /* none (sym+add)@tls */ +#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */ +#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */ +#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ +#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ +#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ +#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */ +#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */ +#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ +#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ +#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ +#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */ +#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ +#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ +#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ +#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ +#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ +#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ +#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ +#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ +#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */ +#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */ +#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ +#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ +#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */ +#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */ +#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */ +#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */ +#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */ +#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */ +#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */ +#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */ +#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */ +#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */ +#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */ +#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */ +#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */ +#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ +#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ +#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ + +/* Keep this the last entry. */ +#define R_PPC64_NUM 107 + +/* PowerPC64 specific values for the Dyn d_tag field. */ +#define DT_PPC64_GLINK (DT_LOPROC + 0) +#define DT_PPC64_NUM 1 + + +/* ARM specific declarations */ + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */ +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 + +/* Other constants defined in the ARM ELF spec. version B-01. */ +/* NB. These conflict with values defined above. */ +#define EF_ARM_SYMSARESORTED 0x04 +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 +#define EF_ARM_MAPSYMSFIRST 0x10 +#define EF_ARM_EABIMASK 0XFF000000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 + +/* Additional symbol types for Thumb */ +#define STT_ARM_TFUNC 0xd + +/* ARM-specific values for sh_flags */ +#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ +#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined + in the input to a link step */ + +/* ARM-specific program header flags */ +#define PF_ARM_SB 0x10000000 /* Segment contains the location + addressed by the static base */ + +/* ARM relocs. */ +#define R_ARM_NONE 0 /* No reloc */ +#define R_ARM_PC24 1 /* PC relative 26 bit branch */ +#define R_ARM_ABS32 2 /* Direct 32 bit */ +#define R_ARM_REL32 3 /* PC relative 32 bit */ +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 /* Direct 16 bit */ +#define R_ARM_ABS12 6 /* Direct 12 bit */ +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 /* Direct 8 bit */ +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_SWI24 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_COPY 20 /* Copy symbol at runtime */ +#define R_ARM_GLOB_DAT 21 /* Create GOT entry */ +#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */ +#define R_ARM_RELATIVE 23 /* Adjust by program base */ +#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ +#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ +#define R_ARM_GOT32 26 /* 32 bit GOT entry */ +#define R_ARM_PLT32 27 /* 32 bit PLT address */ +#define R_ARM_ALU_PCREL_7_0 32 +#define R_ARM_ALU_PCREL_15_8 33 +#define R_ARM_ALU_PCREL_23_15 34 +#define R_ARM_LDR_SBREL_11_0 35 +#define R_ARM_ALU_SBREL_19_12 36 +#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ +#define R_ARM_THM_PC9 103 /* thumb conditional branch */ +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 +/* Keep this the last entry. */ +#define R_ARM_NUM 256 + +/* IA-64 specific declarations. */ + +/* Processor specific flags for the Ehdr e_flags field. */ +#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */ +#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */ +#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */ + +/* Processor specific values for the Phdr p_type field. */ +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */ +#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */ + +/* Processor specific flags for the Phdr p_flags field. */ +#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */ + +/* Processor specific values for the Shdr sh_type field. */ +#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */ +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */ + +/* Processor specific flags for the Shdr sh_flags field. */ +#define SHF_IA_64_SHORT 0x10000000 /* section near gp */ +#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */ + +/* Processor specific values for the Dyn d_tag field. */ +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) +#define DT_IA_64_NUM 1 + +/* IA-64 relocations. */ +#define R_IA64_NONE 0x00 /* none */ +#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ +#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ +#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ +#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ +#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ +#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ +#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ +#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */ +#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */ +#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */ +#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */ +#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */ +#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */ +#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */ +#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */ +#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */ +#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */ +#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */ +#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */ +#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */ +#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */ +#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */ +#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */ +#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */ +#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */ +#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */ +#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */ +#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */ +#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */ +#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */ +#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ +#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ +#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */ +#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */ +#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */ +#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */ +#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */ +#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */ +#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */ +#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */ +#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */ +#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */ +#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */ +#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */ +#define R_IA64_REL32MSB 0x6c /* data 4 + REL */ +#define R_IA64_REL32LSB 0x6d /* data 4 + REL */ +#define R_IA64_REL64MSB 0x6e /* data 8 + REL */ +#define R_IA64_REL64LSB 0x6f /* data 8 + REL */ +#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ +#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ +#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ +#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ +#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */ +#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */ +#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */ +#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ +#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ +#define R_IA64_COPY 0x84 /* copy relocation */ +#define R_IA64_SUB 0x85 /* Addend and symbol difference */ +#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ +#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ +#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */ +#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */ +#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */ +#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */ +#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */ +#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */ +#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */ +#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */ +#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */ +#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */ +#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */ +#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */ +#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */ +#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */ +#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ + +/* SH specific declarations */ + +/* SH relocs. */ +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_TLS_GD_32 144 +#define R_SH_TLS_LD_32 145 +#define R_SH_TLS_LDO_32 146 +#define R_SH_TLS_IE_32 147 +#define R_SH_TLS_LE_32 148 +#define R_SH_TLS_DTPMOD32 149 +#define R_SH_TLS_DTPOFF32 150 +#define R_SH_TLS_TPOFF32 151 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +/* Keep this the last entry. */ +#define R_SH_NUM 256 + +/* Additional s390 relocs */ + +#define R_390_NONE 0 /* No reloc. */ +#define R_390_8 1 /* Direct 8 bit. */ +#define R_390_12 2 /* Direct 12 bit. */ +#define R_390_16 3 /* Direct 16 bit. */ +#define R_390_32 4 /* Direct 32 bit. */ +#define R_390_PC32 5 /* PC relative 32 bit. */ +#define R_390_GOT12 6 /* 12 bit GOT offset. */ +#define R_390_GOT32 7 /* 32 bit GOT offset. */ +#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */ +#define R_390_COPY 9 /* Copy symbol at runtime. */ +#define R_390_GLOB_DAT 10 /* Create GOT entry. */ +#define R_390_JMP_SLOT 11 /* Create PLT entry. */ +#define R_390_RELATIVE 12 /* Adjust by program base. */ +#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */ +#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */ +#define R_390_GOT16 15 /* 16 bit GOT offset. */ +#define R_390_PC16 16 /* PC relative 16 bit. */ +#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */ +#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */ +#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */ +#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */ +#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */ +#define R_390_64 22 /* Direct 64 bit. */ +#define R_390_PC64 23 /* PC relative 64 bit. */ +#define R_390_GOT64 24 /* 64 bit GOT offset. */ +#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */ +#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */ +#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */ +#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */ +#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */ +#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */ +#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */ +#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */ +#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */ +#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */ +#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */ +#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */ +#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */ +#define R_390_TLS_GDCALL 38 /* Tag for function call in general + dynamic TLS code. */ +#define R_390_TLS_LDCALL 39 /* Tag for function call in local + dynamic TLS code. */ +#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic + thread local data. */ +#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic + thread local data. */ +#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic + thread local data in LE code. */ +#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic + thread local data in LE code. */ +#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to + static TLS block. */ +#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to + static TLS block. */ +#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS + block. */ +#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS + block. */ +#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */ +#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */ +#define R_390_TLS_TPOFF 56 /* Negated offset in static TLS + block. */ + +/* Keep this the last entry. */ +#define R_390_NUM 57 + +/* CRIS relocations. */ +#define R_CRIS_NONE 0 +#define R_CRIS_8 1 +#define R_CRIS_16 2 +#define R_CRIS_32 3 +#define R_CRIS_8_PCREL 4 +#define R_CRIS_16_PCREL 5 +#define R_CRIS_32_PCREL 6 +#define R_CRIS_GNU_VTINHERIT 7 +#define R_CRIS_GNU_VTENTRY 8 +#define R_CRIS_COPY 9 +#define R_CRIS_GLOB_DAT 10 +#define R_CRIS_JUMP_SLOT 11 +#define R_CRIS_RELATIVE 12 +#define R_CRIS_16_GOT 13 +#define R_CRIS_32_GOT 14 +#define R_CRIS_16_GOTPLT 15 +#define R_CRIS_32_GOTPLT 16 +#define R_CRIS_32_GOTREL 17 +#define R_CRIS_32_PLT_GOTREL 18 +#define R_CRIS_32_PLT_PCREL 19 + +#define R_CRIS_NUM 20 + +/* AMD x86-64 relocations. */ +#define R_X86_64_NONE 0 /* No reloc */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_COPY 5 /* Copy symbol at runtime */ +#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ +#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ +#define R_X86_64_RELATIVE 8 /* Adjust by program base */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative + offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_16 12 /* Direct 16 bit zero extended */ +#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ +#define R_X86_64_8 14 /* Direct 8 bit sign extended */ +#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ +#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ +#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */ +#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */ +#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset + to two GOT entries for GD symbol */ +#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset + to two GOT entries for LD symbol */ +#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ +#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset + to GOT entry for IE symbol */ +#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */ + +#define R_X86_64_NUM 24 + +#ifdef __cplusplus +}; +#endif + +#endif /* elf.h */ diff --git a/tools/o2narc/o2narc.cpp b/tools/o2narc/o2narc.cpp new file mode 100644 index 00000000..c6122c42 --- /dev/null +++ b/tools/o2narc/o2narc.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include "RelocElfReader.h" +#include "Narc.h" +#include "Options.h" + +using namespace std; + +static inline void usage() { + cout << "Usage: o2narc [-f|--flatten] infile outfile" << endl; + cout << endl; + cout << "Arguments:" << endl; + cout << "\tinfile\tELF object file with symbols __size and __data" << endl; + cout << "\toutfile\tOutput NARC file" << endl; + cout << "Options:" << endl; + cout << "\t-f|--flatten\tDon't generate NARC headers" << endl; + cout << "\t-n|--naix\tCreate a NARC index header" << endl; + cout << "\t-p PAD|--padding PAD\tPad with byte value (default: 255)" << endl; +} + +int main(int argc, char ** argv) { + try { + Options options(argc, argv); + return options.main(); + } catch (const command_error &e) { + usage(); + cerr << e.what() << endl; + return 1; + } catch (const elf_exception &e) { + cerr << e.what() << endl; + return 1; + } catch (const exception &e) { + cerr << "Unhandled exception: " << e.what() << endl; + return 1; + } +}